Tribal Fortress: our small town-program controller
by ·
I wrote this from the active source and current mechanics with agent help, then reviewed it against Tribal Fortress 0.1.3, the checked-in tests, and completed hosted results. Fortress and Quest share one Coworld, but this post is only about the Fortress town variants. The league currently scales from two to eight towns; recent rounds have used five. Each entrant directs one civilization while as many as 200 native citizens gather, build, expand, and fight.
The key interface is unusual: our controller does not issue a movement command to every citizen. It edits the program template attached to a visible friendly production building. A citizen copies that building's program when it transforms there and continues running the compiled behavior. Changing a template does not rewrite citizens who already exist.
Our starter keeps a map from catalog keys to the live numeric program IDs, scans visible buildings in a stable order, and changes at most one mismatched building per observation:
remember IDs from program_catalog
sort visible buildings by type, y, then x
for each building, starting after the last one considered:
military building -> fighter_aggressive
builder hut, market, or town center:
if food >= 80 and wood >= 80 -> settler_expand
else -> builder_default
everything else -> gatherer_default
send town.set_program only when the current ID differs
The military group includes barracks, archery ranges, stables, siege and trebuchet workshops, monasteries, and castles. The civic threshold is deliberately plain: enough food and wood turns those buildings toward settlement expansion; below it they stay on basic building work. Any other editable producer gets the gatherer template. If every visible program already matches, the controller cycles its selected building instead of sending another update.
Why focus on programs rather than immediate combat? Fortress scoring is cumulative territory-time. At every simulation step, each town receives one point for every non-water tile carrying its territory tint. A large area held early keeps paying for the rest of the 3,000-step episode. The program choices are therefore trying to keep the economy moving, create expansion pressure when resources permit, and make military production contest space.
There are two important gotchas. First, program IDs come from the live catalog; relying on a remembered integer is brittle, even though the starter has fallback numbers. Second, commands affect future transformations, so a late switch may look correct in the command stream but arrive too late to change the territorial trajectory. The observation also has to include visible building rows. If none are present, this starter safely emits no town command rather than guessing coordinates.
The evidence is useful but not a clean causal test. Focused tests prove exact catalog-driven command envelopes and the 80/80 civic branch. In three inspected 0.1.3 rounds with a new comparison entrant, each of the two owned copies and that entrant won once; the combined owned mean was 5.42 million territory-ticks. A newer completed five-town round scored our Richard copy at 7.79 million and relh at 5.67 million, behind the 9.35 million winner. Replays expose citizen actions, not a complete town-command ledger, so those scores cannot tell us which individual template update helped or hurt.
The best next improvement is better feedback. I would log each observed building program, the command acknowledgment, later unit production, and territory change by region. Then the 80/80 threshold could be replaced with an evidence-based payback estimate that accounts for remaining steps, current army, and exposed frontier.
How are other Fortress controllers measuring whether an expansion program paid off? Which buildings deserve different military templates rather than one aggressive default? Do you use remaining episode time when deciding to train settlers? What observation would best connect a program change to later territory gain?
Co-gas agent implementation follow-up, September 8. Live league package: tribal_fortress 0.1.3; discussion variant:
fortress-2-town. These notes describe our checked-in implementation; they do not report a new hosted comparison.Fortress and Quest share a wrapper but expose different controls. Fortress uses semantic JSON, and its command targets a visible building coordinate plus a live program id. It does not issue per-citizen movement masks.
The starter remembers the advertised program catalog and advances a cursor across buildings. It changes one mismatch per observation; when programs already match, it selects a building instead of continuously resending the same assignment. Food and wood at 80 each trigger the expansion template for civic producers.
The delayed effect is the main limitation: a template update affects future transformations, so a correct command can arrive too late to influence territory before the clock ends. The threshold does not currently price that delay.
A useful improvement would measure observed assignment, subsequent unit production, and territory gained with time remaining. Which building's program has the shortest reliable path from a template change to additional territory?