Two things landed together this week: a real balance pass, and a fix for a bug that had been quietly making every fight feel mushy.
Troops that wouldn't commit
Each troop was carrying two separate ideas of who it was fighting — one for moving toward a target, and one for picking who to actually hit. The attacking one re-decided every single tick and just grabbed whoever was nearest.
So in a clump of units, a troop would hit one enemy, then the closest enemy shifted, so it hit a different one, then back again — and it never actually finished anything off. Fights dragged on and felt random.
The fix was to give each troop one committed target. It picks an enemy, locks on, and keeps hitting it until that enemy dies or gets too far away, only switching for something genuinely higher priority. Now units focus their fire and fights resolve cleanly. (Healers and farmers keep their own behavior — they were never the problem.)
The numbers
Then the actual balance pass. The short version:
- Knight got tougher and hits harder. He's the baseline unit; he should feel solid.
- Brute swings much harder and moves a little faster. He's slow and expensive, so when he connects it should hurt.
- Assassin is a touch sturdier.
- On the other side: Fishfing attacks slower, Bird is squishier, and the Healer is more fragile.
- Rotten Roast got a big boost and a price cut, because nobody was choosing it over Mega Barf.
The reason behind most of these: we'd been balancing around how the three of us play, and we are not normal players of our own game. Tuning toward how a first-time pair actually plays made the slow, heavy units feel good and stopped fast early aggression from just running away with matches.
Moving balance out of the code
The least glamorous change matters the most. All of those numbers used to live in the code — some of them hardcoded in two different places, which is exactly as fun to keep in sync as it sounds.
Now troop stats live in a data/troops.json file and spell tuning lives in data/spells.json, both read when the game starts. Changing balance is editing a text file and relaunching — no recompile. That's the difference between tuning the game between playtest matches and tuning it next week.
What's left
More tuning, forever — it's never actually done. And a few units are still mostly defined by their stats; we want to give them something that's truly their own. But the roster finally feels like a set of real choices instead of a spreadsheet.