An arcade pilot shooter — Space Invaders / Galaga × Survivors. A Ship Shit Games joint.
You fly a lone interceptor along the bottom of the screen. Waves of the Scourge — a zerg-like horde — descend and weave from the top, spitting bio-fire down at you. Hold the line: clear a wave, the next comes faster and denser. Run out of lives and the line breaks.
This is a playable core-loop skeleton, not a finished game: a thin Game class owning
shared state plus a handful of systems, a clamped requestAnimationFrame loop, and all
gameplay tunables in one CONSTANTS object. Built with Vite + TypeScript + Three.js, no
framework. The aesthetic follows the studio's DOOM design language: black void, blood red,
hellfire orange, gunmetal, bone text — only Three.js primitives with emissive materials.
| Input | Action |
|---|---|
← / → or A / D |
Fly left / right |
| (automatic) | Auto-fire upward |
Space |
Focused burst (fan of shots, on a cooldown) |
Enter / Space |
Start / restart from a menu |
HUD shows SCORE, WAVE, and LIVES, plus a burst-charge meter.
npm install
npm run dev # http://localhost:5173
npm run build # static output -> dist/
npm run preview # serve the built dist/
buildisvite buildonly (notscgate) so a stray type-nit never blocks a deploy.
Vercel auto-detects Vite. Defaults work out of the box:
- Build command:
vite build(ornpm run build) - Output directory:
dist - Install command:
npm install
Push the repo and import it; no extra config needed.
index.html canvas + plain-DOM HUD overlay (#hud)
src/
main.ts entry: boots Game, owns HMR dispose
styles.css DOOM HUD styling
game/
constants.ts COLORS, WORLD frustum, CONSTANTS (all tunables)
types.ts HudState + entity records
Game.ts thin orchestrator: run-state + rAF loop + collisions
systems/
RenderSystem.ts orthographic camera, starfield, screen-shake
InputSystem.ts keyboard -> steering axis + edge-triggered burst
EntitySystem.ts ship / enemies / bullets / particles (spawn + motion)
HudSystem.ts binds HudState to the DOM overlay
Everything that affects feel — speeds, fire cadence, wave density/ramp, screen-shake,
particle pops, starfield — lives in src/game/constants.ts. Change a number, reload.
The Pyre (offense) and the Wardens (defense) hold humanity's last frontier against the Scourge. Toxic-green bio-glow is theirs alone; everything else is blood, fire, metal, and bone.