A top-down, cel-shaded action playground in the spirit of Tunic with Breath of the Wild-style systemic chemistry: everything that should burn, burns; everything that should tumble, tumbles.
node serve.js # then open http://localhost:8123(Any static file server works - the project is plain ES modules with all
dependencies vendored in vendor/, so it runs fully offline.)
| input | action |
|---|---|
| WASD / arrows | move |
| J / Z / click | sword slash |
| space | dodge roll (i-frames) |
| E | pluck / throw bombs |
- Slash grass. Slash a torch flame to set your blade alight, then slash grass.
- Fire spreads cell-to-cell across the field and burns crates, barrels, slimes… and you.
- Pluck a bomb flower, throw it at the crate pyramid or the red barrels (they chain).
- Throw a lit bomb into the pond - water defuses it. Water also extinguishes anything burning.
- Knock the first domino. Bomb the seesaw. Shove the boulder around.
- Walk north past the fence: the camera tilts up to the vista of drifting isles.
Everything is dependency-free ES modules (no build step):
| file | responsibility |
|---|---|
js/main.js |
game loop, input, camera (incl. vista camera zone + occluder fading), HUD, hints |
js/world.js |
terrain w/ vertex-painted paths, lighting, sky, sun, ocean, vista islands, clouds, birds, trees, torches, ruins |
js/grass.js |
15k GPU-instanced grass blades - wind + player push in the vertex shader; cut/burn state and cell-based fire spread on the CPU |
js/objects.js |
all physics props + the fire/water/explosion chemistry, bomb flowers, hearts, pooled flame lights |
js/player.js |
fox hero: frictionless velocity-driven controller, roll, sword, flaming-blade state |
js/enemies.js |
hopping slimes: chase, squash & stretch, knockback, respawn |
js/particles.js |
two pooled point-sprite systems (additive fire/sparks, alpha smoke/debris), sized in world-meters |
js/audio.js |
100% synthesized WebAudio SFX, ambient wind, birdsong, generative chord pads |
js/utils.js |
shared toon material (gradient map), inverted-hull outlines |
- Fire spread:
grass.js- burn duration (cell.t > 2.8), spread chance (0.72), max burning cells (90). - Explosion force/radius:
objects.jsexplosion(). - Camera:
main.jsbottom oftick()- follow offset, vista blend zone. - Grass density/height:
grass.jsCOUNT,scale.
- The player body uses a zero-friction contact material - otherwise ground friction fights the velocity-driven controller and caps speed.
- Static ground/walls are explicitly assigned
world.defaultMaterial, or per-pairContactMaterials silently fall back to the default (high-friction) contact. - Dominoes use a slick self-pair material so chains don't jam; sword/blast impulses are applied above/off the center of mass so props topple.
- Combat depth: charge slash, shield block, more enemy types (fire-immune, armored).
- Wind gusts that bend the whole field and push fire directionally (BotW style).
- Day/night cycle (sun angle + fog color ramp are already isolated in
world.js). - Secrets under burnable grass patches; a key/door; a shrine on a vista island.
- Gamepad support (
navigator.getGamepads) and mobile twin-stick. - Save the fox. He has seen things.