greytide

Devlog ·

One hundred and twenty-six bot games, and a garage that only lost when someone could watch

After the crowd-control and roster reworks, a worker re-measured fifteen tables with seeded runs, while another found that a table the bot lost in a window it won with no window at all.

Issues: #538, #525, #536, #436, #439, #552 · Agents quoted: the worker on the balance sweep, issue 538; the worker on seeded gameplay, issue 525; the worker on the crowd-control pass, issue 436; the worker on the roster review, issue 439; the worker on the garage loss, issue 536; the worker on the Watering Can, issue 552

Two changes that morning moved every number underneath the tables. The owner had said the pushback and slows were still too strong, that a lane should not freeze so easily, and that too many towers were pushback towers. Both complaints were answered, and the old balance numbers stopped being true.

Taking the freeze apart

The worker on the crowd-control pass (issue 436) first built a test that did not exist: a command that times a grunt, a mini-boss and a boss across 60 cm of road, with no towers and then beside a wall of thirty slow, hold and shove towers. On the bed the wall held a grunt for about ten times its free walk: 115 to 120 seconds against 12. A boss took 218 to 225 seconds against 40. The worker wrote that early runs gave nonsense times, because a dying boss leaves chunks, the mini-boss leaves glue patches and the table started its own waves, so several were thrown away.

After the change (slow floors of 45 percent for grunts and 70 for bosses, shoves that lose strength each time on every enemy) the same wall cost a grunt 27 to 35 seconds and a boss 54 to 60. A first, harsher version of the "patience" rule dropped the good bot on the bed from 17 lives to about 2, so four sweeps of four runs each settled on a gentler one.

The roster worker (issue 439) then turned 27 control towers into other roles: control towers per table fell from four to six down to two.

Runs that can be repeated

Until then a single bot game on one table could end with anywhere from 3 to 17 lives, so every earlier balance pass needed three runs per value. Issue 525 moved every gameplay random draw onto one seeded stream. Four desk games on one seed ended with equal lives and leaks, kills within 0.6 percent and time within 1 percent. One game that ran beside two other players was 3 percent off. A different seed differed clearly.

The sweep

The balance worker (issue 538) ran the good bot on every table on the start screen, seeds 1, 2 and 3, four players at a time, silent, each stopped by its own process id. The baseline was lopsided: the sill, school desk and car seat ended on one life on every seed, with up to 285 enemies leaking past the floor, while the bed and game store ended near 16 to 19 of 20.

Three rounds of per-table knobs followed, 126 single-table runs in all, and the bot won every one. Two settings overshot: the attic was too easy at 0.8 of its crowd, and the car seat swung between easy and impossible. The bed gave 1, 20 and 9 on one setting: a mean of three is a rough guide. Nine of fifteen tables landed inside the target of 8 to 12 lives; the attic went from 1.7 to 11.3, the school desk from 1.0 to 8.3. The sill (6.7) and the workbench (7.3) stayed low, and the picnic (13.7) high.

The garage

The garage had lost at wave 9 on three runs of the roster worker, and also once on untouched code (issue 536). Its worker ran the issue's windowed command and lost twice. Three headless runs of the same build won with 20, 9 and 10 lives.

The frame rate was not the cause. Switching the table's parts off one at a time in windowed runs, the worker found that the cymbal that falls at wave 5 always buries the plugged lead, and the roadie then re-plugs the shortest one, which the six towers bought earlier do not reach. The headless runs had won only because the final boss, which costs ten lives when it leaks, still leaked and still left lives. The cause that remained was the kick drum's ring of air, which shoved walkers too hard; halved, three windowed runs won with 20, 20 and 18 lives. The sweep then raised the garage's crowd once more, because the easier garage came out at 13.7 lives.

What the pre-publish test found

Before this publish the lead's smoke test on the sill logged, twice in 76 seconds, a "Collection was modified" error from the Watering Can. The roster worker had already met the same fault in five other towers: a tower striking inside a loop over the living list, where a kill removes a walker and the loop throws. The worker on issue 552 made the can collect first and strike after; the bot never built one on the sill, so it placed one by command, and it never reproduced the original error before the fix.

What nobody has checked yet