A portrait, mobile-first, cartoon twin-stick survival royale — shared game sources packaged for web and the native iOS app.
Pick a fighter, pick a gun, drop into a field of 15. Outlast the other players, the roaming zombies, and the closing safe zone — scavenge scrap and build your own cover while you're at it. Last one standing wins.
opens the game in your browser — no install, no sign-up · for a permanent URL see Play
![]() 🧟 Endless Horde survive escalating waves |
![]() 🏆 Battle Royale outlast the shrinking zone |
![]() 🔨 Build & defend spend scrap on walls, spikes & turrets |
…plus Milo, Chip, Yuki, Finn, Cypher, Shade, Nova, Onyx & Titan — unlocked as you level up.
The repo is already Pages-ready (index.html at root + .nojekyll). This gives a fast, permanent URL that never breaks:
- Repo Settings → Pages
- Source: Deploy from a branch → Branch:
main→ Folder:/ (root)→ Save
Then play at https://deegan4.github.io/last-pulse/ — it rebuilds automatically on every push to main.
These use free third-party proxies for the public index.html. If one shows a blank page or error, give it a minute (they cache briefly after a push) or try the next:
For local development, clone the repository, run python3 scripts/build-game.py, then python3 -m http.server 8000. Open http://localhost:8000. HTML, scripts, styles and assets must stay together.
Edit src/; root index.html and assets/game/ are generated deployment artifacts.
| Area | Source |
|---|---|
| Enemy drawings and palettes | src/game/rendering/enemies.js |
| Enemy stats and creation | src/game/entities/enemies.js |
| Combat and perks | src/game/combat/ |
| Characters, weapons and release notes | src/game/data/ |
| Movement, touch and gamepad | src/game/input/ |
| Screens and selection | src/game/ui/ |
| Styling and markup | src/styles/game.css, src/index.html |
| iOS save/purchase bridge | src/game/native/bridges.js |
| Native Swift app | LastPulseIOS/LastPulse/ |
Run python3 scripts/build-game.py after source edits, then node scripts/validate.mjs.
Xcode's Build Shared Game phase packages the same sources and canonical assets/
directly into the app's GameContent/ directory on every build and archive. It needs
Python 3, not Node or npm. LastPulseIOS/GameContent/ is an ignored local preview output.
See architecture and build details.
- 🎮 Twin-stick controls — dual virtual joysticks on touch,
WASD+ mouse on desktop, plus gamepad support. - 🏃 Dynamic movement — fighters accelerate with weight, lean into their run, and their stride quickens the faster they move; the camera leads the direction you're heading so the field opens up ahead of you.
- 🧟 Endless Horde — survive escalating zombie waves as long as you can (every 5th wave sends armored elites).
- 🔨 Build & defend — scavenge scrap dropped by zombies (and scattered in caches), then spend it in-match to raise walls for cover, lay spike traps, and plant auto-turrets that gun down the swarm for you.
- 🧟 Six+ zombie types —
normal, fastrunner, and tankybrutein the mix, plus Horde horrors: acid-lobbing Spitters, bursting Bloaters, swarming Stalkers, and armored Juggernaut mini-bosses on milestone waves — all ramping in HP, speed, and damage each wave. - 🔫 12 weapons — Pistol (crit), Rifle, Shotgun, SMG, Magnum, Sniper (pierce), Crossbow, Flamethrower (burn DoT), Minigun, the drum-mag Tommy, and more — each with its own ammo, reload, range, and feel.
- 🦸 15 hand-illustrated heroes — each with distinct speed / health stats and a live 360° gun-arm that aims and fires, gated behind your level.
- 📦 Loot & supply drops — health, medkits, armor, ammo, and weapon swaps, plus parachuting crates with a strong gun + armor.
- ⚡ Power-ups — chain-lightning, a throwable AoE bomb, and a 🪝 grapple hook (fire at a building, get reeled in on an elastic rope that conserves your swing momentum — release keeps your speed).
- 🩸 Game feel — hit markers, kill-streak callouts, ⚡ kill combos (chain kills for up to 3× XP with slow-mo hit-stop), directional blood spray with ground splatter, damage-direction indicators, muzzle flash, recoil, brass casings, screen shake, a #1 VICTORY confetti screen, and a low-health heartbeat.
- 🌅 Living arena — a 3000² map with enterable buildings in four styles (house, shop, barn, cabin — walk in through the door, walls block bullets but doorways don't, and loot hides inside), climbable watchtowers, ponds, animated water, swaying trees, and day / dusk / night lighting.
- 🏘 A world that grows with you — leveling up adds more buildings, ponds, and greenery, and unlocks landmarks: campfires (Lv 3), fences (Lv 6), wells (Lv 10), and survivor statues (Lv 15).
- 📈 Progression — XP, levels, career stats (wins / matches / kills / K-D / best placement / streak), and a "Game Updated!" popup that shows returning players what's new.
- 🏅 26 achievements — tiered bronze / silver / gold badges (First Blood, Rampage, Chain Reaction, Kill Frenzy, Untouchable, Horde Master…), each paying a coin reward, tracked on a menu badge wall.
- 🪙 Coins & shop — earn coins from kills, wins, waves, badges, and a daily challenge; spend them on cosmetic particle trails.
| Action | Touch (mobile) | Keyboard / Mouse (desktop) |
|---|---|---|
| Move | Left stick | WASD / arrow keys |
| Aim & fire | Right stick (auto-fire) | Mouse aim · click or Space to fire |
| Reload | automatic | R |
| 🔨 Build (wall → spikes → turret) | 🔨 button — tap to cycle, fire to place | B to cycle · fire to place |
| ⚡ Lightning | ⚡ button | Q |
| 💣 Bomb | 💣 button | E |
| 🪝 Grapple | 🪝 button | F (again to release) |
Everything — markup, styles, and game logic — lives in a single index.html. No build system, no package manager, no dependencies.
# play / iterate: just open it
open index.html # or: python3 -m http.server 8000
# syntax-check both script blocks + version / asset gates (fast, no execution)
node scripts/validate.mjsWant to drive it headlessly (launch, play a match, screenshot, smoke-test)? There's a ready-made skill at .claude/skills/run-brawl-arena/:
node .claude/skills/run-brawl-arena/driver.mjs --play --mode horde --shootSee CLAUDE.md for architecture notes, memory.md for the running design log, and ROADMAP.md for the future plan.


