Armory War devlog #2: The simulator that keeps us honest
BalanceSim plays hundreds of runs for us. It caught seeds quietly making the game harder and a final boss that wasn't the hardest fight.
Armory War has a second player that never sleeps: BalanceSim, a tool that plays hundreds of complete runs — shopping, forging, fighting — and prints what happened. Every balance change goes through it, and it has saved us from ourselves more than once.
Seeds made the game harder, and nobody noticed. We added seed codes
so a run could be shared: type 5WN2 and you get the same shops and the
same enemies as your friend. All tests passed. Then we ran BalanceSim
again, just to be safe — and run completion had fallen from about 10%
to 6%.
The cause was subtle. The first version tied each opponent to the fight number. But losing doesn't advance the fight number, so a defeat handed you the exact same opponent again, and the post-fight shop refresh rolled the exact same shop. Lives exist so that a loss has a price but the run can continue; meeting an unwinnable matchup a second and third time is not that. Now every life you spend is part of the seed, and completion came back to 12–14%.
The final boss wasn't the hardest fight. The simulator showed fight 20 being won only ~40% of the time — harder than the final boss at ~54%. The obvious fix was to give the two new boss abilities to the "easy" bosses at fights 5 and 10. Measured, that made the game easier: the new Sap ability is much lighter than the Enrage it replaced. So abilities were placed by weight instead: Enrage to fight 10, the softest boss, and Sap to fight 20. The gap between the easiest and hardest boss shrank from 42 points to 32, and the wall at fight 20 became a slope.
Seeds you can read from a screenshot. Seed codes use 32 characters
with no I, O, 0 or 1, and typing is forgiving: case doesn't
matter, and those four are folded into the letters they get confused
with. Only those four — an early version also folded L into J, which
quietly sent every seed containing an L to a different run.
The lesson we keep relearning: the first bad number is often the measurement's fault, not the game's — so the tool gets checked against things we already know are balanced, before we trust it on anything new.