This is a submission for Weekend Challenge: Dog Days Edition
The Vacuum Approaches is a tiny Undertale-like house game. You are the dog. The vacuum lives here too.
What I Built
You walk a three-room house - living room, kitchen, bedroom — in first person canine form. Furniture is interactable. Each object has two or three actions associated with it that affect your stats.
You have three stats that sit on the top bar: Chaos (0–100), Good Boy (0–100), Treats (0–25).
Endings fire when a stat hits a wall worth stopping for:
- MAXIMUM CHAOS — the house has fallen
- ZERO CHAOS — nothing is happening. on purpose.
- GOOD BOY LEVEL MAX — certificates, theoretically
- TREAT HOARD — twenty-five, and not one fewer
- THE BEAST EATS — you were fur. it was enough.
Demo
Play around locally:
pnpm install
pnpm dev
Open the URL Vite prints (usually http://localhost:5173).
| Input | Action |
|---|---|
| Arrows / WASD | Walk |
| Space / E / Z | Interact, confirm a verb, advance text |
| Up / Down | Pick a verb |
| Esc | Close the verb menu |
| Enter | Start from the title; continue ending / credits |
Chase a stat to the wall, or bark at the vacuum until it decides you are dirt.
Code
Repo: https://github.com/TheVoraciousReader/the-vacuum-approaches
Stack: Vite + TypeScript + KAPLAY, pnpm. Static app. No backend. Session-only state.
src/
main.ts Scenes, input, vacuum combat
rooms.ts Tile maps, furniture, doors, spawns
sprites.ts Pixel-art sheets generated to data URLs
actions.ts Authored verbs + stat deltas
narrator.ts Punchlines keyed by object:verb
stats.ts Chaos / Treats / Good Boy, hearts
endings.ts Splash copy + which crossing ends the run
ui.ts HUD, verb menu, dialogue box
How I Built It
The loop is small on purpose:
walk → Space near an object → pick a verb → a punchline lands → stats change → an ending.
I considered wiring Google AI / Gemini for the narrator and then threw it out. Generated lines would have been funnier on paper and worse in the room. A weekend game this small needs solid punchlines.
The house does not remember wreckage. You can raid the forbidden bowl, walk to the bedroom, walk back, and the bowl is still a bowl. The stats remember. The furniture does not.
Pixel art is character grids in sprites.ts, compiled to data URLs — no image files, no asset pipeline. KAPLAY hot-reload is off because game state does not survive it; refresh after edits.
Some Learnings
The one systems surprise: Good Boy 0 used to end the run, and it was eating the interesting endings. Chaos-max and the treat hoard both require being a menace. I stopped treating “bad dog” as a finish line.
The other surprise: once Chaos is high enough, the vacuum should not stay a punchline. At 50 it hunts. Hearts persist across rooms so you cannot reset combat by walking into the kitchen. Crossing 50 again refills them. Zero is THE BEAST EATS.
Closing
Let me know if you try it out in the comments below. Always open for ideas and suggestions!
Top comments (0)