Honor & Ash: Too Lazy to Play My Own Game

Play it here: tristanbabcock.com/honorashdemo

Honor & Ash’s overworld keeps running whether anyone’s watching it or not — every noble taxing his villages, drilling his troops, marching out to hunt bandits or retake a lost castle, all on his own schedule. Which meant that to actually understand what the AI was doing, I had to play the game: pick a character, wander the map, and hope I happened to be standing nearby whenever the behavior I was trying to debug decided to happen. Does a noble genuinely head home when he’s low on food, or just say he will? Does ransoming a defeated leader actually stop the winner from hunting him straight back down? Answering questions like that meant replaying the same stretch of the game over and over, watching one tiny slice of one world at a time.

So I gave up on playing my own game. Spectator mode drops the player out entirely — no character, no inventory, nothing to manage — and just watches: follow any leader in the world, pan around, fast-forward the clock, and let the whole simulation run at speed with nobody standing in for a person at all. I had officially become too lazy to play a video game, so I made the game play itself.

It was absolutely the right call. A lot of behavior that was theoretically possible but practically invisible started showing up in minutes instead of hours of hoping I’d stumble into it. At one point I caught a noble’s own chronicle listing “recruits from Velasco” one line before “retakes Velasco from the outlaws” — the recruiting code was checking who a village nominally belonged to, not whether outlaws were still standing in it, so a lord could restock his ranks from a village he hadn’t actually freed yet. That’s not a bug you find by playing normally; you’d need to be standing in that exact village on that exact turn. It’s a bug you find by reading a hundred turns of chronicle scrolling past and noticing the order is backwards.

The moment I actually trusted the whole thing, though, was watching a vassal collect his month’s taxes, ride them home, and hand his cut up to his king — who was, at that exact moment, laying siege to a castle bandits had captured from him a few turns before. Nobody scripted that sequence. The tax tour and the recapture campaign are two entirely separate systems that have never heard of each other; they just both happened to be running on the same king, in the same world, at the same time, and produced something that read like an actual story. That’s the whole bet behind building this as a simulation instead of a script, and that was the first time I saw it pay off in front of me instead of just trusting it would in principle.

Once the big picture was working, the daily nuisance was the small one: watching an army walk across the map told me nothing about what it was actually doing right then, and popping open a stats panel every time I wanted to check broke whatever rhythm I had going. So I added a task tag — a small floating label that sits right over whoever you’re following and just says their current activity plainly, Touring or Campaigning or Pursuing or Garrisoned — and a log feed, a little stack of that same leader’s own chronicle lines that rises up near them as things happen and fades out a few seconds later instead of waiting to be read in a panel. Between the two I could watch one leader through an entire season — mustering, touring for taxes, running down a bandit chief, taking a level for it — and follow the whole story without my eyes ever leaving the map.

Spectator mode following Queen Nesta: a task tag reading 'Touring' floats over her army while a log feed above it shows her recruiting soldiers, taking loot, defeating a bandit chief, and setting off after another, with the Task tag and Log feed toolbar buttons visible at top right

Watching the AI closely enough also made a design gap obvious: I wanted the computer’s armies and the player’s army to run on the same economy, not a simplified stand-in for it. For most of this project, an AI army’s quality was one abstract number sliding from 1 to 4 — cheaper to write, but it meant the AI was never actually building an army the way the player has to. So I tore that number out and gave every AI army a real roster instead, built out of the exact same ranks and the exact same promotion costs the player pays — a noble drilling his troops now promotes one soldier at a time, peasant to footman to man-at-arms to horseman, spending the same gold you would. The army you eventually meet on the battlefield is the actual roster the simulation has been building for months, not a number standing in for one.

That’s also exactly the kind of change I have to be disciplined about. This project keeps drifting further toward “simulation” and further from “game,” and Dwarf Fortress — one of my favorite games of all time, and a cautionary tale in the same breath — is what happens when you never say no to that drift. So every coding session gets a scope I try hard not to blow past, even when the next logical layer of depth is sitting right there. Giving armies a real roster made the sim more honest; it did not get an excuse to also simulate individual soldiers’ hopes and dreams.

The last piece was realizing spectator mode wasn’t just for me anymore. I’d built it to answer my own questions, so I never bothered telling myself what mode I was in — I already knew. A first-time human watcher doesn’t: are the arrow keys panning the map right now, or steering the look cursor? Is X going to open something? So I added a small always-on indicator in the corner that says exactly what’s live — paused, panning, looking, or (if you’ve opened a settlement to look at it) exactly which of Enter and Escape actually do something right now. Small, obvious in hindsight, and the reason I think this is finally ready for a real human to sit down with it instead of just me.