Storm the Gates

Three rooms between you and the gate: the Graveyard, the Crypt, the Gatehouse. Five chests to gather, 120 seconds on the clock, and the soil never stays still — fell a zombie and its grave simply starts again. ← → move, ↑ jump, ↑↓ climb, Z / Space / X throws the lance. Your armour takes the first hit. After that it's just you and your underthings.

The graveyard at night: a knight advances on the risen, under a chunky moon

What makes it Ghouls'n Ghosts

  1. The armour — two hits, not one, and the first is comedy: the contact event is cancelled, the Knight character is swapped for a pale man mid-stride (one line — looks are characters, not hard-code), and the world becomes much more serious. Fresh plate with each life.
  2. The lance — strict C64 controls (jumpKeys: ['up']) free the fire button to be a weapon: a flat-flying Projectile, two aloft at most, felled zombies paid through Rules. The throw itself is a moveset move with pose: false — the engine owns the press and the timing; the lance is the visual.
  3. The risen — zombies are never gone. Each grave is one mob cycling forever: mound → heave → shamble → felled or departed → mound. The state machine is the respawn — they never leave the world's mob list.
  4. The gate — the run ends at the engine's Exit, demanding all five chests. You don't finish a Ghouls level; you earn it — against a clock whose expiry costs a life and re-arms (onExpire: 'die', straight from the RULES JSON in rooms.js).

Download & remix

Both files are live in the SOURCE panel — edit and RUN ▶. Take them home: main.js · rooms.js · engine bundle. Remix ideas: a second weapon on a pickup (dagger — faster, shorter); graves that spawn two; the classic indignity of being sent back to the graveyard when the clock dies.