A pixel-art zombie shooter built with Foldkit. Play it at https://munch-manor.tanner-scadden.workers.dev.
The game state lives in one Foldkit Model. Keyboard, mouse, touch, and animation frames arrive as Messages, and a pure update advances the game. Zombie spawns come from a seeded random number generator whose state lives in the Model, so the same seed and the same Messages always produce the same game. The scene is drawn with Foldkit's Canvas module at 320x180 and scaled up with pixelated rendering.
This is an early prototype. It starts from the canvas-art example in create-foldkit-app.
bun install
bun dev| Input | Move | Aim | Fire |
|---|---|---|---|
| Keyboard and mouse | WASD | Pointer position | Hold the primary button |
| Touch | Thumb on the left half | Thumb on the right half | Fires while the right thumb is down |
The shop sells a Laser Sight for the run that shows where the shot goes: a laser line, or a fan as wide as the shotgun's spread. SETTINGS has a big cursor toggle if the thin crosshair is hard to see.
Tap, click, or press Enter to start or retry. Esc pauses and resumes, and so does the PAUSE button in the top right corner. A tap or click on the pause screen also resumes. The game pauses when the page is hidden. R reloads, Q swaps guns, T places a trap, G picks the next trap, Enter starts the wave, M mutes, and N toggles the music. Each action has one key.
| Command | What it does |
|---|---|
bun dev |
Start the Vite dev server |
bun run build |
Build for production |
bun run typecheck |
Typecheck with tsrs and the Effect rules |
bun run test |
Run the fast tests: Story, Scene, and unit tests |
bun run test:full |
Run every test, as CI does: the fast tests plus whole wave replays |
bun run lint |
Lint with oxlint, plus the Effect rules from @effect/tsgo |
tsrs is a Rust port of the TypeScript 7 compiler. effect-tsgo tsrs runs it with the Effect language service diagnostics, which come from the @effect/language-service plugin entry in tsconfig.json. Without that entry, the typecheck is plain tsrs and reports no Effect diagnostics. tsrs is pre-1.0. If it misbehaves, tsc --noEmit from the typescript devDependency is the fallback typecheck.
The vision, decided choices, and milestones are in GAME_DESIGN.md.
MIT