← Back to diary

Entry 004 - The move is the attack

Entry 003 was a love letter to the two-stage turn - the dual-slot model that let the bot finally search two plies of real consequence. This entry is about taking it away.

The dual slot gave the hero a move and an attack every turn, in either order. It was the right call for what it solved - adjacent melee stopped being suicidal - and it opened the whole move-then-attack upgrade space. But it quietly broke the one thing the project exists to protect: the choice. When you can reposition to safety and deal damage in the same turn, you never have to choose between them, and a tactics game with no tradeoff is just an execution puzzle. The sim said so plainly: Act 2 bot simulator at lookahead depth of 3 sat at 100% win rate. The optimal bot wasn't winning, it was never in danger.

The fix had been hiding in the design spec the entire time. Section 3.2: "one action per turn - tap a tile to either move there or attack what's on it." Hoplite's whole trick is that the move is sometimes the attack - you commit to a direction, and if an enemy is where you're going, you hit it. The dual slot was the drift, not the spec. So we went back to one action and added the Hoplite reading on top: a move that ends facing an enemy lunges it; a move that slides past enemies slices the ones it passes. The move is the attack, depending on geometry.

Then the instructive part. We tuned this the way Entry 003 describes - advisor session reads the sweeps, Claude Code builds, I make the calls - and watched it overshoot in both directions in a single afternoon. Strict single-action with no positional damage: 0% on Act 1, the bot softlocking because it can't out-damage a swarm one tile at a time. Add the lunge: playable but grim. Add a default slice and it inverted - 95% win, and a run I played by hand on the phone came back 24 kills, 3 damage. A cakewalk. The slice was too generous: if moving past an enemy kills it, then dancing through a room is simultaneously the safest and the most lethal thing you can do. The tradeoff had collapsed again, from the other side.

The cure was symmetry. If the hero's move can be an attack, so can the enemy's - a melee thing that moves into contact now bites on arrival, resolved against where you actually ended up, not where you were when it telegraphed. Weaving through a cluster still works, but now it costs HP, because the things you weave between get to bite back. One rule, applied to both sides. The sweep settled where you want first-two-acts difficulty to sit for an optimal player: Act 1 around 68% with a real 25% death rate, damage taken up from ~3 to ~12 a run. I played it again: won Act 2, eight damage, nearly all of it on the one floor where the geometry pinned me. That's the shape you want - skilled play stays clean, a tight spot bites.

What I keep relearning is that the sim finds the degenerate line faster than I can, and that's the whole point of doing it this way. I would not have noticed in casual play that slice made movement strictly dominant - I'd have just felt, vaguely, that the game had gone soft, and not known why. The bot played a hundred seeds and the win-rate column said you broke it before I'd finished writing the upgrade. Balance-as-discipline means letting the machine tell you your fun new mechanic is broken before a human ever has to be let down by it.

The effort in determinism and simulation is really paying dividends at this point.