Split The code is public; the app answers only to the crew.
Teammates who call it out: what a bot sees, said once, to its own side #164
Four teammates who had been walking around in silence now say what they can see, on the message line the HUD already draws.
stopped closed without shipping deploy 10c9a72
commented
Parked by the crew: the check failed and the decider saw no point in another try
Sign in to join this conversation.
Four teammates who had been walking around in silence now say what they can see, on the message line the HUD already draws.
The vocabulary is the map's.
MapDefgainedplaces— the layout's own named areas, labelled once when the map is built (placeLabel: "a site" is said A site, "ct mid" is CT mid) — andplaceAt(map, pos)says which one a point stands in, last-painted-first so it agrees with the cellsbuildGridactually painted. There is no table of coordinates: a callout can only ever name a room the rock was carved into, andmap.test.tswalks every walkable cell of both maps to prove every one of them has a name.callout.tsis the rule — four things a bot may say (a sighting, a noise, a defuse, a last magazine), the words each is said in, and three gaps.SIDE_GAP4s because the HUD holds a line for four (MESSAGE_FADE) and a side that talks faster overwrites itself unread;SPEAKER_GAP6s so no one voice can hold the feed;REPEAT_GAP12s so five teammates walking into the same angle say "enemy — mid" once between them. On top of the gaps a sighting is said on contact and not for every tick of one, so a ninety-second standoff down one corridor is a single line, and a round where nothing happens says nothing. A defuse is one line an attempt (REPEAT_GAPoutlasts the longest defuse) and a bot says it is down to its last ten rounds once a gun, latched on the brain.world.ts'scalloutis the gate, ordered by price: the person's own side → a round actually being played (never over the round result the HUD is holding) → two numbers off the rate limit → and only then the place and the string. So a bot with an enemy in its sights and nothing new to say costs two comparisons and allocates nothing. The enemy's bots never reach the first gate, which is the point: a callout is a teammate telling you what they can see, never what the other side knows.scripts/measure.tsprints the identical 87-round table in 76.2s against 76.6s before on this machine, andtrain.ts --benchholds at 13k steps/s either way — the simulation itself is bit-for-bit unchanged, since nothing here draws onworld.randomor a brain's.What to look at in the preview: play a round and watch the line —
Krait: enemy — long A,Pike: noise — mid(worded so it can never be read as a sighting — it is a footstep through a wall and the place isreported's guess),Draco: defusing — A site. A round restart clears the chatter and drops the callouts from the queue while leaving the last round's result on screen, which is whymessagesgrew an optionalby.What I left out: the person's own side is the only one with a
Chatterrecord, because it is the only one that can ever speak — the other side's state would be a structure nothing reads. AndscriptedFight(the arena's baseline opponent) says nothing; it is a measuring stick, not a teammate.🤖 Generated with Claude Code
Closes #111