Fernwild 1.1.10: the joystick is round again
Published
Repeated rotation could stretch the iPhone PWA and make its controls disappear. This update fixes canvas sizing and keeps the menu button available on touchscreens.
Browser game
A free browser arena shooter starring Fern, an elf with a bow and a limited quiver. Clear four stages, buy upgrades between bosses, and spend earned embers at the Hearth to give the next run a better start.

I built Fernwild around an elf, a bow, and a quiver that can run out. You move through enclosed arenas, clear the monsters to open the way forward, and try to reach the boss with enough arrows and lives left to deal with it.
It is a small, free browser game from Tavern & Tails, built in Godot. You can play with a keyboard and mouse, a gamepad, or touch controls on your phone.
The run starts at the Fern Edge and takes you through the Overgrown Ruins, the Misty Crypt and the Deep Hollow. Each stage has six arenas and its own boss.
The monsters need different answers. Goblins close the distance, imps swarm, beetles protect themselves behind their shells, and boars commit to a charge you need to get out of the way of. Trees and rocks are solid, so where you stand matters as much as where you shoot.

The opening forest arena. Clear the room to open the way forward, and collect dropped quivers before you run dry.
You begin with one life and 24 arrows before Hearth upgrades. A hit costs a life. Ammunition comes from quivers on the ground, so holding the fire button is only useful while there is something left to fire.
Coins buy stronger bows, multishot, piercing arrows, a faster draw, better boots and spare lives. The pedlar waits beyond each boss, which gives you a reason to collect the spoils before leaving the room.
Each boss has its own attack patterns. The Rootwarden guards the end of the first stage; three more wait deeper in the hollow.

The Rootwarden is the first of four bosses. Beating it opens the route to the pedlar.
Runs also earn embers. Spend those at the Hearth to start future attempts with permanent upgrades, including more arrows or an extra life. Your records and Hearth progress are saved locally.
Start with a random seed or enter one yourself. The same seed rebuilds the same arenas, so you can retry a layout or pass it to someone else.
On desktop, use WASD or the arrow keys to move, aim with the mouse, and hold the left mouse button to fire. Shift runs and Esc pauses. Gamepad controls are supported too.
On a phone, play in landscape. A left-thumb joystick handles movement, the fire button aims at the nearest enemy, and the menu button opens pause and settings.

The pedlar on a phone. Spend coins on this run; Hearth upgrades carry into the next one.
Fernwild uses AI-generated art and music alongside credited CC0 assets and synthesised sound effects. The game includes credits for its assets and fonts.
Published
Repeated rotation could stretch the iPhone PWA and make its controls disappear. This update fixes canvas sizing and keeps the menu button available on touchscreens.
Published
Two weeks building a small Godot game, including two days getting browser audio and the home-screen layout to behave. The final sound fix was a bus layout; the missing screen space needed viewport-fit=cover.
v1.1.11 in the corner of a screenshot answers it.
A machine whose engine refuses the shape also gets one line of numbers across
the top of the title screen, because a phone in the hand of someone who can
send a screenshot is the only place those numbers can be read.Rotating the phone, twice or more, left a stretched game. The engine sizes
its canvas by asking the window how big it is - innerWidth and
innerHeight - and iOS answers that question with the previous orientation's
numbers for a moment after a rotation. In a standalone PWA nothing pokes the
page again afterwards, so the wrong answer stuck for the rest of the session:
the engine drew an 852x393 picture into a 393x852 canvas, the browser stretched
one into the other, and the joystick came out an ellipse. Reproduced by having
the page report the old orientation, which is what iOS does:
| build | the canvas box | what it drew into |
|---|---|---|
| 1.1.9 | 852x393 | 1179x2556 - stretched |
| 1.1.10 | 852x393 | 2556x1179 |
The canvas is now the page's to size (html/canvas_resize_policy=0) and the
page measures its own layout box, which cannot be out of date, then keeps
measuring for a second and a half after anything that could move it. The
engine reads the canvas back on its next frame, so the game re-lays itself out
with the screen.
The on-screen controls could disappear after a rotation, taking the menu button with them - which left a phone with no way to pause, and the pause menu is where the control setting lives. The controls now put themselves back if the view changes without telling anybody, and the menu button is drawn whenever the glass is a hand's, whatever the thumb controls are set to: the joystick and the fire button are a preference, the way out of a run is not.