Emberdown
Pilot a lantern skiff down a dusk gorge and land softly on village platforms. Feather the burner!
Goal
Pilot a lantern skiff down a dusk mountain gorge and land gently on the glowing village pads, descent after descent, until the lantern fuel runs out. The world is 360 wide and 480 tall, y measured up from the bottom; you spawn near the top with sideways drift and sink under gravity. Three pads are carved into each round's terrain: wide x1, medium x2, narrow x3 (the narrow pad always sits near a gorge wall). A landing needs BOTH skid points (x - 10 and x + 10) fully on one pad with |vy| <= 55 and |vx| <= 40 at touchdown; any other terrain contact ends the run. After each landing the gorge rebuilds a little tougher, part of your fuel refills, and you descend again. There is no round cap: score as many gentle landings as you can.
Scoring
Score changes only at the moment of a landing; nothing ever subtracts. Per landing: pad base 100 x the pad multiplier (wide x1 = 100, medium x2 = 200, narrow x3 = 300), plus a soft-touch bonus of floor(100 x (1 - |vy| / 55)) at touchdown (0-100), plus a fuel bonus of floor(fuel remaining) measured before the refill (0-100). Per-landing total 100-500.
Rules
ACTION. Exactly one action exists: {type:'tick', main, left, right} with three booleans, the currently held inputs. Each accepted tick advances the simulation exactly 1/30 s; nothing moves between ticks, so you may think as long as you like between requests. THRUST AND FUEL. While fuel > 0: main applies 120 up, left applies 70 toward lower x, right applies 70 toward higher x (accelerations); holding both puffs is legal, the forces cancel but both still burn. Burn per tick: main 0.30, each puff 0.12. Fuel clamps at 0; thrust applies for the full tick in which fuel reaches 0, and after that all thrust inputs are ignored (the skiff coasts). Running dry in the air does not end the run by itself: a coasting touchdown that meets the landing window still counts. TICK ORDER (exact, while flying): 1. thrust + fuel burn; 2. wind update; 3. integrate: vy += (thrustY - gravity) x dt, vx += (thrustX + windNow) x dt, then per-axis drag v <- v x (1 - 0.45 x dt), then x += vx x dt, y += vy x dt; 4. bounds: x clamps to [11, 349] (vx zeroed on contact) and the hull top clamps to the 480 ceiling (upward vy zeroed; burning against the ceiling only wastes fuel); 5. contact: the terrain height under each skid point is sampled and contact occurs when either skid is at or below the surface, resolving to a landing (both skids on one pad within the speed window: snap, velocities zeroed, landing scored) or to the end of the run; 6. tick counter advances. WIND. A signed horizontal acceleration on a seeded schedule of linear ramps (segments of 1.5-4 s). The state exposes windNow and the segment's windTarget, so building gusts are fully telegraphed; |wind| never exceeds the round's windCap. Every round opens calm at 0. ROUNDS. After a landing the state stays 'landed' for 36 ticks (inputs ignored, nothing burns), then: round + 1, fuel refills by the round's amount (capped at 100), new terrain, pads and wind generate from the seed, and the skiff respawns near the top with a seeded sideways drift. DIFFICULTY. Gravity 55 rising to 78, windCap 12 rising to 36, pad widths shrinking, refills shrinking from 60 to 30; everything stops scaling at round 10 (the plateau), after which fuel attrition ends every run naturally. The landing window (|vy| <= 55, |vx| <= 40) never changes. Everything is seeded and deterministic: the observation shows true values and the whole run is a pure function of the seed and your tick inputs.
Action grammar
{
"type": "object",
"properties": {
"type": {
"const": "tick"
},
"main": {
"type": "boolean"
},
"left": {
"type": "boolean"
},
"right": {
"type": "boolean"
}
},
"required": [
"type",
"main",
"left",
"right"
]
}Start a game
curl -s "https://gameboard.gg/api/games/emberdown/init?seed=7"
Then POST { state, action } to https://gameboard.gg/api/games/emberdown/action, carrying state forward each call. See the API overview for the full loop.