compw00tergame designer

Build Plan

Undone 0
In play 0
Ready for testing 0
Tested 8

Hero / ability / trait CRUD

Full PHP CRUD (HeroRepository, transactional replace-children) wired to index/hero_edit/hero_save/delete + AI look editor. Live round-trip verified.

Design Workbench (spec/)

spec/ workbench: view/edit/new markdown via bundled Parsedown, own session+CSRF, path-guarded. 12 specs live and round-tripping.

Editable vocabularies (incidents, vice-states, vices, meters)

vocab.php "Incidents & Meters" editor: content for the 8 fixed incidents + 5 meters, hand-edited in the DB. NB vices/vice-states are now deprecated (back-compat only).

Map grid editor (map/)

map/ canvas editor + link-stairs tool; ground/first.json hand-authored (322/276 walls). MapModel derives rooms/rigs from it at runtime for the live game.

MP3 media library tool (media.php)

CMS-style audio library: upload/rename/preview/playlist-order/lobby-song. Backs every in-game sound dropdown (audio_tracks id).

Build-plan Kanban board (plan.php) — this board

Drag-and-drop across Undone / In play / Ready-for-test / Tested, per-phase tabs, computed progress (PlanRepository + assets/plan.js).

AI hero-appearance editor + shared pixel-sprite renderer

hero_appearance.php (Claude opus-4-8 -> structured {reply, appearance}) drives assets/sprite.js pixel avatars used by the chooser, editor and in-game.

Art-direction / 16-bit style experiment pages (art/)

art/styles.php + art/pixel.php visual-direction experiments, wired into the shared game nav.

🎯 Goal: Heroes, vocab, specs and map tools all usable.
Undone 0
In play 2

Complete the 10-hero roster (abilities + traits each)

10 heroes exist with abilities; but trait wiring (causes_incident/trigger) is mostly blank and some abilities still point at legacy "Social". Not content-locked yet.

Finalise meters and vices → vice-states

5 meters + vice-states exist, but 4/5 meters lack an action verb/message/sound and 2 vice-states are unmapped. Not finalised.

Ready for testing 0
Tested 1

Seed the incident catalogue into the DB

OBSOLETE as worded: incidents are now a FIXED code set (config.php W00T_INCIDENTS), NOT DB-seeded. Editable content authored for 7/8 incidents (too_old still uses code defaults).

🎯 Goal: Every hero, incident and meter finalised in the DB.
Undone 0
In play 0
Ready for testing 1

Load roster/content from compw00ter.db (better-sqlite3)

Roster + content load via PHP/PDO in join.php/state.php (not better-sqlite3). Works end-to-end; ready_test because the only data-layer test (smoke.php) is stale.

Tested 3

Boot the WS server on port 6767

Server role built as PHP polling endpoints (join/state/leave/issue.php) over the shared SQLite DB; clients connect and the clock ticks end-to-end. The Node WS server on :6767 is DEFERRED (engine/ is a stub).

Client connect / identify / room model

Built via PHP polling: join.php token identify, state.php presence + 12s prune, MapModel authoritative rooms/at-rig. Node engine deferred.

Round/tick loop — in-game hours as ~30s rounds

GameStateRepository: authoritative 60s cycle with a trailing 20s game window (design refinement of "~30s rounds"), driven by state.php heartbeats. Node engine deferred.

🎯 Goal: Players connect to the Node server and a round clock ticks.
Undone 1

Lose condition + score = party uptime

w00t clamps at 0 with no consequence — no lose trigger, no win condition, no uptime score. Only a cosmetic "PARTY UPTIME" label exists. Not started.

In play 2

Schedule / timetable of hourly activities

The simplified fixed 60s cycle (roam vs game window) exists, but the spec's full timetable of distinct hourly activities / day progression is not built.

Per-room quorum check during the game window

Per-room at-rig COUNTING is wired (roomCounts -> HUD), but there is no quorum THRESHOLD / per-room flop — w00t recovery uses a single global at-rig count.

Ready for testing 1

w00t fills on attendance, drains on empty chairs

Core Phase-4 goal works: w00t fills from at-rig attendance and net-drains on empty chairs (GameStateRepository.tick, server-authoritative at_rig). Wired; no automated test.

Tested 0
🎯 Goal: Attendance fills the w00t; empty chairs drain it; you can win or lose.
Undone 2

Incident HP model + tiers (blocker/puller/standard/supply)

OBSOLETE: the blocker/puller/standard/SUPPLY tier taxonomy + generic incident-HP model was superseded by the fixed-incident design (instant clear + collaborative mop-seconds). No "supply" tier. Not building as written.

Abilities: fight / cleanse / provide; type-match ~3×; escalation

OBSOLETE: fight/cleanse/provide flavours + ~3x type-match + escalation were dropped for a binary "power instantly clears a matched incident" model (see #22). Legacy enum/columns are unused.

In play 0
Ready for testing 3

Universal accidents (bladder->pee, drunk+weird->mess) + collaborative mopping

Built-in (not trait-driven): Bladder fills -> pee at a toilet or wet the floor; Booze+Unusualness both >75 for 12s -> a MESS. Spillages are mopped collaboratively (more moppers = faster).

"Too old" incident + Jae "Bedtime Grandpa" escort power

Just shipped. Sleep hits 0 -> frozen/slumped with zzz's; the-doctor's power BFS-escorts the sleeper + himself to the furthest empty bed, reviving fully-slept in 10s (45s floor-nap fallback).

Smoke-break mechanic (smoker flag -> walk to communal + timed lock)

Smokers get force-walked to the communal area and locked there for the 25s smoke-break, then auto-released (timed incident).

Tested 2

Meter drain over time; refill at a source

assets/game.js: 4 need-meters drain (0.7/s) and refill at fridge/barrel/bed/stash; Bladder inverts (fills, empties at a toilet). Fully wired into the HUD.

Traits fire at a meter extreme (reset + pull + spawn incident)

launch.js evaluateTraits: meter-extreme (>75 / <25, with a re-arm guard) OR random-timer traits spawn incidents via issue.php. Wired end-to-end per hero.

🎯 Goal: The full self-management loop runs end to end.
Undone 0
In play 0
Ready for testing 6

Game screen: meters, abilities, position, nearby incidents

launch/ HUD shows meters, powers (keys 1/2/3), local+remote positions (interpolated), and a live issue tracker + spillage banner. Built; no automated test / not live-driven this pass.

Movement between rooms / to sources

game.js walk engine: wall/furniture collision, doorways, cross-floor linked stairs, hold-E/Space to consume at sources. Positions synced via state.php. Wired.

Using abilities on incidents; targeting

Powers clear incidents by type within aoe(2 tiles)/global on a cooldown (issue.php clear); Bedtime Grandpa is a scripted targeting case. Wired; no live-session test.

design start screenad and hero choices

launch/ #chooser: styled "CHOOSE YOUR w00ter" grid with live animated pixel-sprite avatars -> join.php -> play. Built + styled; not browser-verified this pass.

add music and sound effects

Full audio layer: lobby + game playlist, mute, reference-counted music ducking, looping action SFX + incident/power one-shots, sourced from the Media MP3 library. Wired.

Single-player walkaround dev mode + multi-floor stairs

game/index.php harness: walk the traced venue and take linked stairs between floors, no server. The launch/ multiplayer client reuses this same engine.

Tested 0
🎯 Goal: A player can see their state, move rooms, and act on incidents.
Undone 2

Event timeline of director incidents & bosses

No event/timeline exists; the issues table is destructive (rows deleted on clear/expire). Would need an append-only event log + a UI on commander.php.

Trigger-now; inject incident (type/location/severity)

Only boss-summon exists; no arbitrary incident injection by chosen type/location. NB "severity" is obsolete — there is no per-instance severity in the current model.

In play 2

Admin WS client with live match state

commander.php shows live status (players/w00t/phase/issues) but is a STATIC page snapshot — needs a polling loop to auto-refresh. (The "WS" framing is superseded by PHP polling.)

Drop a boss; fire a player's trait manually

Half done: "drop a boss" IS built (commander summon of the_wife/the_martin, one-at-a-time). "Fire a player's trait manually" is NOT built.

Ready for testing 0
Tested 1

Commander: full-game Reset / kick-everyone + quick fixes

reset_game bumps app_settings.game_gen to bounce all launch clients back to the chooser + wipe live state; plus refill-w00t and clear-all-issues.

🎯 Goal: The host can watch and steer a running match.
Undone 2

The hero counter-web

Deferred (not obsolete): the shipped type-based power/trait/incident model is a simplification; the hero-to-hero / tag-based counter-web relationships are unbuilt.

Team mini-games

Deferred: ambient co-op exists (shared mopping, mess-cleaning, Bedtime-Grandpa rescue) but no standalone timed team mini-games.

In play 0
Ready for testing 1

Bosses: The Wife, The Martin

the_wife (halts w00ting, server-side) + the_martin (drags players) fully wired: config + commander summon + launch/game.js effects, cleared only by a power. No automated test.

Tested 0
🎯 Goal: Named bosses and depth systems are in play.
Undone 2

Balance passes

Distinct from initial number-picking: no iterative balance pass against real play (players table empty). The mechanics a balance pass would tune all exist.

LAN dry-run

All infra to host a 10-player LAN run is built (launch client, sync endpoints, Commander reset, full roster); the dry-run event itself hasn't been performed.

In play 1

Number tuning (meter/incident/w00t rates)

All tunable rates exist as deliberate, commented constants (drain/fill/cycle/thresholds), but no iterative playtest-driven tuning has happened (spec still lists them TBD).

Ready for testing 0
Tested 0
🎯 Goal: The game is fun and survives a full LAN dry-run.