greytide

Devlog ·

A hundred and thirty new cards, and a check that kept failing for the right reasons

The owner asked for a lot more cards that are not filler; the agents first built an engine that can say what a card does, then found out how often a card's first version did nothing at all.

Issues: #281, #282, #283, #284, #285, #286, #328, #331, #337, #339 · Agents quoted: the worker on the card engine, issue 281; the workers on the card families, issues 282 to 286; the workers on the engine hooks, issues 328, 331, 337 and 339

The game had 52 cards. The owner's request, in the issue the lead wrote from it, was for "a LOT more cards" with "QUALITY mods that aren't just filler", and "a FUN game in the morning". The lead's answer was a research note (fifteen families of cards, 136 one-line ideas) and an order of work: first an engine, then the families written in parallel, one file per family, without touching shared code. By this afternoon the check counts 185 cards.

An engine before any cards

The worker on issue 281 built the engine as plain C# that knows nothing about the game, behind an interface, plus a small made-up world to test cards in without starting the game. Cards react to events (a hit, a kill, an enemy landing after a shove, a tower being lifted) and produce effects. The research's three safety rules are in it: triggered attacks count for less (0.3), chains stop at depth two, and every "on X" card has a cooldown.

Its first check run failed 10 of 82 cards. The made-up world killed one enemy in twelve seconds, so no kill card could fire, and damage capped at an enemy's remaining health hid a four percent bonus. After the world was fixed, all 82 passed.

The depth-two test was the odd one. It never fired. "A 0.01 s cooldown blocked the second trigger inside the same simulation step," the worker wrote, so the cooldown was stopping chains before the cap could, and the cap's test proved nothing until a cooldown of zero was allowed. The same worker moved the 52 old cards onto the engine and ran the good bot on the desk. It won wave 10 in 1,762 seconds before and 1,757 after. One later run with the full pool took 3,264 seconds and the worker did not explain it.

Five workers, and the same first failure

The families went to separate workers. Their notes read alike.

The workers had to see each card fire on a real table, not just pass the check. That was harder than the cards. Labels from several cards drew on top of each other over the tower until each card floated its label at its own height. The first desk shots in several issues had the tray in the way or no towers at all, because the demo table starts empty, so placement commands were added.

Some ideas could not be written. Cards 60, 80 and the tower swap needed engine hooks, so issue 328 added a pull, a lift and a swap on drop. The swap first dropped the tower onto a free cell because the test tower stood on a tile that cannot be built on. Peer Pressure needs a Wobbler to fall off a ledge, which never happened by itself, so a test command raises the same event.

Hooks that were missing

Four more workers added the pieces the families asked for: seven hooks for the cards of issue 331, zone markers and status durations (337), and eight hooks for floating, lobbing, combos, carried cards and more (339).

The worker on 331 lost a merge to its own tool: a Python edit "silently turned Defense.cs from CRLF to LF, which made the first merge conflict across the whole file." The Enraged pulse that Red Primer depends on was invisible until a screenshot showed it, and it was made larger.

The lob in 339 was the hardest. The first launch impulse sent the thrown enemy 77 cm up. The worker logged its position every 0.1 seconds, found the impulse about three times too large, and retuned it until the body landed about 3 cm past the lip. A lob over a board edge lands 1.2 cm lower than the desk, so the existing event for falling below the table never fires, and the game raises it by hand.

Red Primer on the grass table: look at the enemies with the orange glow around the tower, and the large Enraged label across the top.
An enemy thrown over the board edge on the picnic table, hanging in the air above the checked cloth. The tray of towers is in front.

One pull request was not self-merged. The worker on 331 had to touch three files outside its list so a free reroll shows as 0 points, said so, and asked for a review.

What nobody has checked yet