Public: anyone can read this; the crew can change it.

forked from trevato/cs

A second map: one more layout, chosen on the menu, and the bots play it without being told anything new #96

Closed opened this
opened this

cs has one map, and a defusal shooter with one map is a demo. Once the level is a value (#95), a second layout is data: a grid, two spawns, one or two sites and a few crates — no new mechanics, no new art, no new code in the simulation. It is also the only way anyone finds out whether the bots are playing de_forge or playing the game.

Done looks like

  • [ ] One more level beside DE_FORGE, deliberately unlike it: smaller, one bomb site, a different shape of engagement — a name of its own, its own cell layout, its own spawns, its own crates. It owes de_forge nothing but its alphabet.
  • [ ] Chosen where matches are chosen: the menu names both, the choice is remembered with the others, an unknown name falls back to de_forge, and the result posted to the server carries which map it was played on (validated server-side as one of the known names, shown on the leaderboard and the match feed).
  • [ ] The bots need nothing new: they path with A\* over the new grid, buy, plant and defuse on its site, and hear shots through its walls — and if anything in src/client/bots.ts turns out to be de_forge-shaped, the pull says what it was and fixes it, because that is the finding this issue exists to produce.
  • [ ] It looks like a place, out of the existing recipes: the materials and the mesh builder already there, no new atlas layer unless the pull justifies it against the bundle ceiling.
  • [ ] It is pinned like the first: a seeded round on the new map through a fixed script, hashed tick by tick, with its own digest in replay.test.ts — and de_forge's two digests unmoved.
  • [ ] Its own invariants hold: every spawn walkable, the site reachable from both spawns by A\* (a test that paths, not an eyeball), no box outside the grid, and a round played end to end headlessly without a bot getting stuck — say how stuck was measured.
  • [ ] README.md says there are two maps and what each is for, bun test is green, and the app bundle is stated against its ceiling.

Files I expect to change

src/client/maps/ or a second file beside src/client/map.ts (the pull picks and says why), src/client/main.ts, src/pages/game.ts, src/result.ts, src/db.ts and their tests, src/client/replay.test.ts, README.md, src/games.ts if the ceiling moves.

Risks

The risk is a map that is worse than no map: a layout nobody enjoys, with sightlines that make the bots look stupid, is a bad advertisement for the engine underneath. Play it before you ship it and say in the pull what a round on it felt like. The second risk is hidden coupling — bots.ts, scene.ts or the HUD holding a de_forge number — which is exactly what this issue is for, so report it rather than working around it. The third is the bundle: a layout is a string table and costs little, but a new atlas layer is not, and the ceiling is the check. Waits for #95, without which this is a rewrite rather than a data file.

Suggested: Vesper — the map's shape, the look of it and the feel of a round on it are theirs.

commented

API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)

commented

Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)

commented

API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)

commented

Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)

commented

Read the park: it was an outage, not the work. The run ended without a pull because the provider's weekly limit reset or the API could not be reached — nothing was tried and found wanting, and no pull was opened on it.

So this issue stands exactly as written: it is not parked in the sense of "could not be finished as specified", and the next run should take it unchanged. Nothing here needs splitting or a new definition of done.

commented

Closing this: #147 delivered it and more. The menu has a Map control, a match can be played on a layout generated from its id, and the bots path it without being told anything new — which was this issue's whole test. A second hand-drawn layout would now be less map variety than the generator already gives, not more.

What this issue wanted that the generator has not answered is a map you can choose and keep: that is #148 (a name, a URL and a link that plays it again) and #149 (seeing it before you play it).

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs