A browser-based, side-scrolling beat-'em-up in the spirit of Final Fight on the Sega Genesis — punch/kick combos, grabs and throws, pickable-up weapons, a screen-locking "clear the wave to proceed" structure, and a boss fight at the end. One full level, set on a fictional street, present day.
Zero build step, zero dependencies, zero external assets. Every
character and background prop is drawn with plain <canvas> 2D calls
(articulated ragdoll limbs with rounded joints, shaded jackets, hair
silhouettes, hit sparks and dust), and every sound effect is synthesized
live with the Web Audio API — there isn't a single image or audio file in
this repo. Just open index.html.
A delivery-drone depot's battery farm ruptures behind the Grimwood Bodega, flooding the block in toxic green coolant sludge and mutating the local gang into The Ooze. You got splashed too — but you're still you, just stronger. Fight your way down Grimwood Ave, clear three waves of Ooze grunts and thugs, and take down their leader, the Sludge King.
Just open index.html in any modern desktop browser (Chrome, Firefox,
Safari, Edge) — double-click it, no server required. If your browser blocks
local-file JavaScript modules for some setups, serve the folder instead:
npx http-server . # or: python3 -m http.server 8080Then visit the printed localhost URL.
| Action | Keys |
|---|---|
| Move | Arrow keys or WASD |
| Attack (combo) | Z or J |
| Jump | X or K (attack in-air = jump attack) |
| Special move | C or L (limited charges, recharges over time) |
| Grab | Shift or G (hold near a foe, tap Attack to punish, release to throw) |
| Pause | P or Escape |
| Mute | M |
| Confirm / Start | Enter or Space |
A touch d-pad + buttons appear automatically on touch devices.
Pick one of three GoopSquad members before the fight, each with a different speed/power/health balance: Vex (balanced), Ruckus (slow, huge damage), Nova (fast, light hits).
index.html Screens (title/select/story/pause/game-over/win) + canvas
style.css Menu chrome, CRT framing, touch controls
js/utils.js Small math helpers
js/input.js Keyboard + touch input, normalized into logical actions
js/audio.js WebAudio synth sound effects + a tiny procedural bassline
js/sprites.js Procedural (code-drawn) character/prop rendering
js/level.js Constants, palettes, roster/enemy stats, the level layout
js/entities.js Factory functions + shared physics for player/enemy/etc.
js/game.js State machine, combat rules, enemy AI, camera/wave gating,
HUD, and the render/update loop
Everything renders at a low internal resolution (480×270) and is scaled up
with image-rendering: pixelated, aiming for a chunky 16-bit-console look
without needing any actual pixel art files.