All research
Research· 11 min read

Wars Are Born from Poverty, Not from Rage

We armed four clans, measured every declaration of war, and then fed everyone. Half the wars never happened.


Glossary

  • lilci – an inhabitant of this world, one agent of the simulation;
  • clan – a community of lilcis with a leader, a council of officers, a shared storehouse and a memory of its relations with other clans;
  • citadel – a clan's fortified starting settlement, one in each corner of the map;
  • halo (territory) – a circle of influence around each of a clan's holdings, and the clan's land is made of these circles;
  • guards and warriors – the combat roles inside a clan, filled by lilcis with high innate aggression;
  • peasant – the basic working role, gathers food and resources and feeds the clan;
  • raid – a sortie by a party from one clan to another clan's settlement for loot;
  • rage – a clan's accumulated hostility toward a specific neighbor on a scale from 0 to 1, the thing a declaration of war is born from;
  • cycle – the unit of time in this world, one tick of the simulation;
  • wild world – a run without a player, where nobody looks after the clans and no god intervenes, so they decide everything themselves;
  • rich and poor groups – two sets of worlds inside one batch. In the rich group every citadel has inexhaustible deposits of wood and stone right next to it, in the poor group there are none and resources have to be found across the map.

The hypothesis we started with

In our new mode, Battle for the Throne, the setup is simple enough – four clans race to take one Capital. When we designed the mode, war felt inevitable. There were three reasons.

First, aggression here is inherited. A child copies the entire gene set of one parent, chosen at random. After that every gene mutates independently, with an 8 percent chance of shifting by up to ±0.25.

Second, memory. Warriors accumulate combat experience, and grievances from raids settle into clan memory for a long time.

Third, crowding. As they build, clans grow toward each other. But clans meet long before their territories grow, because scouts, expeditions and raiding parties cross into foreign holdings much earlier.

AB🎲 50/50A | B🧬 8%±0.25A′

The working hypothesis was simple. Keep aggression as it is, and border friction alone will keep the world at constant war. Let us be precise about the mechanics right away, because it matters. Skirmishes in this world never fed war directly. The rage that leads to a declaration of war builds up only from raids. Grievances in clan memory are also records of raids. A border skirmish adds to neither. What a skirmish does change is the status of relations between clans. Our whole chain was built on that.

Dense borders produce skirmishes. Skirmishes make neighbors enemies. Enemies start raiding each other. Raids build up rage. And rage becomes the spark that lights a war. We even built the diplomacy around that expectation. And one link of this chain needs an asterisk right away. The step "enemies → raids" existed only in our heads. Enemy status governs the border guards, who strike trespassers on sight, and nothing else. Raid targeting does not read it at all. Raids pick their targets by rage and fresh provocations, which raids themselves produce. The chain was broken right in the middle, and we did not know it yet.

For a while the code agreed with us in the worst possible way. The first version of the border logic turned two clans into permanent enemies after a single skirmish. Enemy status meant guards struck trespassers on sight, that produced new skirmishes, and those kept the hostility forever fresh. Neighbors with overlapping halos locked themselves into endless hostility without a single raid. That was not emergence, that was a feedback loop we had written with our own hands. We replaced it with an escalation ladder. A first skirmish cools relations, only a repeat within a short window makes enemies, and silence slowly thaws everything back.

The loop was fixed, but the real question remained open. Where do wars actually come from?

Instrumenting the declarations of war

War here is a formal act. Raids happen often and on their own, while a declaration of war requires a separate condition – enough rage toward a specific clan. And rage is windowed, it is built from recent raids, not from lifetime grievances. One detail in the mechanics worried us. After a war ends, rage does not reset to zero, it keeps a floor of 0.25, while a new declaration needs only 0.14. In theory, an old enmity could stay above the declaration threshold for thousands of cycles and reignite war without a single new raid. We had even sketched a cure, making the floor melt so that old enmity would fade on its own over time. Does this happen in practice? That is what we needed to measure.

So we logged every declaration of war. For each one we measured three things:

  • how much rage had built up toward that clan;
  • how many raids it had made over the last 3000 cycles, the very window beyond which grievances no longer count;
  • how many cycles had passed since the previous war between these two clans, if there had been one at all.

Then we ran wild worlds, no god, not a single intervention. Four clans on a 200 by 120 cell map, 150,000 cycles each, 44 worlds per batch, fresh seeds every time. Three instrumented batches in total, 132 worlds. The first two ran on the same engine, the third already with the food fixes we will get to below.

What the data said

The first finding was unexpected. Wars are rare. That broke our original hypothesis on the spot.

batchengineworldsdeclarations of war
#1before the fixes4430
#2before the fixes4444
#3after the fixes4423

About half of all worlds live through their entire 150,000 cycles without a single declaration of war. A typical warring world declares one to three wars in its whole history. There is no permanent war anywhere. And this with four armed neighbors on one map. What is more, as we will see below, these are worlds where three quarters of the population clears the aggression threshold above which a lilci joins the guard.

The second finding nailed the coffin of our hypothesis shut. Old hatred almost never starts wars. Of 98 declarations of war across 132 worlds, only 21 were repeats, and in just four of them rage hung right at the floor, that is, it looked like the very smoldering loop we feared. But even in those four, fresh raids were helping it along. Not one war turned out to be started by old hatred alone. The other 77 were the first and only declaration of war against that clan. Suddenly the melting-floor fix we had prepared in advance turned out to be a solution to a problem that does not exist. So much for building hypotheses.

And then it got downright indecent. If wars come from raids, where do raids come from? There was a hint. Clans in this world go raiding when they are short of food, and the robbed side answers a series of raids with war. Let us state a new hypothesis that we did not have at the start, since we clearly do not learn from our mistakes. War here is an economic phenomenon, and if that is true, a fed civilization should disarm.

The accidental experiment

We had no plans to test that. We were planning to fix bugs.

A playtest caught a clan of 379 lilcis with exactly one peasant in it. The role conveyor sent everyone with aggression above 0.3 into the guard, and that threshold sits low in the birth distribution. In a newborn world about 90 percent of lilcis are already above it (behavioral aggression at birth is a mix of a uniform roll from 0.2 to 0.9 and the gene, mean 0.53). Selection, as we understood later, does not build aggression up but washes it out. Over 40,000 cycles of one instrumented world the mean fell from 0.53 to about 0.33, and the share above the threshold from 90 to 55–59 percent. The 77 percent of this clan were not bred by war. They were the ones war had not yet managed to bury.

Aggression over 40,000 cycles, one instrumented world
00.250.50.751020k40kcycle
mean behavioral aggressionshare above the 0.3 threshold

Only one social mechanism pushes the other way. An agent with high lust and an aggression gene above 0.4 can force reproduction on a random nearby victim of the opposite sex. There is no consent check anywhere in the formula, and the code does not care which sex the agent is. The act permanently hardens the behavior of both (+0.05 aggression to the one who forced it, +0.03 to the victim, whose joy also drops harder), and since the initiator is pre-filtered by that same 0.4 threshold, children conceived this way (a 70 percent chance per act) are statistically angrier through ordinary inheritance. In an early version of the engine such a child also got an aggression bonus right at birth, but we removed it while working on this article, because origin should not program character. The washout numbers above were measured with the old bonus still in place, and even it did not outweigh the losses of the aggressive at war.

Two hundred ninety-three guards, one farmer. Picture the scene. Two hundred ninety-three fighters in armor wander the only field, shouting "Food!" and plucking ears of wheat straight off the stalks because dinner never came, while the single peasant swings his hoe and yells at them to stop eating the harvest he has not gathered yet. It is two hundred ninety-three against one, and that one is the entire supply corps. We studied this clan for quite a while, inventing grand designs for it, before admitting the truth. There were no designs. The role conveyor was simply stamping out an army. For the full picture of the clan:

  • 293 guards and 6 warriors, the very 77 percent in armor;
  • 1 leader and 31 officers;
  • 8 scouts, 9 logisticians, 30 builders;
  • 1 peasant.

A food economy on life support. In the same patch we fixed gatherers who could not see the forest they were standing in, and supply caravans that kept hauling food to the hungry while construction sites stood without wood and stone.

None of this touched diplomacy. Not a single line of the war logic changed. We introduced a peasant quota, opened the gatherers' eyes, corrected caravan priorities and re-ran the same wild batch of 44 worlds.

An honest caveat before the numbers. These three fixes shipped as one package, so the experiment shows what the package did to wars, not hunger alone. Only separate batches can split the contribution of each fix, and they are in the queue. We attribute the effect to food through the mechanism (raids in this world are launched mainly by food pressure), not through isolation.

Starvation deaths fell by a fifth or a third, depending on the group. And wars collapsed right after them:

metricbefore the food fixesafter
declarations of war per 44 worlds4423
worlds without a single war23 of 4428 of 44
crowned worlds (poor group)8 of 2211 of 22
median cycles to coronation (poor group)76,74047,628
crowned worlds (rich group)15 of 2216 of 22
median cycles to coronation (rich group)36,89538,901
Same protocol, before and after the fixes
Declarations of war per 44 worlds (lower is better)
before
44
after
23
Worlds without wars
before
23
after
28
Crowns, poor group (of 22)
before
8
after
11
Median to coronation, poor group (lower is better)
before
76.7k
after
47.6k

The gray bar is the measurement before the fixes, the colored one is after. Green means an improvement, whether the metric goes up or down.

We fed them, and half of the wars simply never happened. Worlds where clans used to bleed each other dry with raids for half their history now build villages and march on the Throne.

The rich group barely moved, and that is exactly what we expected. There every citadel has everlasting deposits right next to it, resources were never the bottleneck, so there was almost nothing to fix.

The direct check

Averaged data may not reveal the whole picture, so here are the per-world measurements. The correlation between the number of declarations of war in a world and its starvation deaths is +0.44, +0.37 and +0.33 across the three batches, positive in every one. Both before the food fixes and after them. It is only a correlation, and the arrow can point either way (war breaks the economy too), but hungry worlds consistently turn out to be warring worlds.

The chart shows something else as well. Rich and poor worlds are mixed across the whole field rather than sorted into corners. Everlasting deposits next door do not guarantee a full stomach, you can starve with them too.

Every world: hungrier means more wars
003.5607120starvation deaths (thousands)declarations of warr = +0.37 across these 88 worlds
rich (with deposits)poor (no deposits)

The world after the fixes, in one paragraph

A fed world does not just fight less, it lives differently. The average world now ends about 20,000 cycles earlier (crowns come faster), yet keeps 13 percent more living lilcis at the final tick, 842 against 748. Average lifespan grew from 409 to 417 cycles, the share of starvation among all deaths slid from 32 to 30 percent, the birth rate per cycle did not change, and the number of settlements did not move (14.5 per world in both batches), so the growth went into density, not sprawl. Same maps, same protocol. Just fuller granaries.

What we think this means

The first hypothesis is destroyed completely, the data simply did not support it. Neither aggressive genes, nor neighbors, nor old grievances keep this world at constant war. The second one, which we came up with along the way, held up. Feed the clans, and half of the wars will not happen.

The aggression pool did not produce the wars. In a world where 77 percent of a clan wears armor, wars still broke out only when the granaries ran empty. Aggression decides who goes into battle and how brutal the fight will be once it starts. Scarcity decides whether it starts.

That sounds like a suspiciously humane conclusion for a bunch of smileys written in TypeScript, so let us restate it strictly within the model. In this simulation, resource pressure stands behind raids almost every time. Declarations of war are launched mainly by recent raids and, therefore, reducing resource pressure lowers the chance of war. No inherited aggression replaces hunger as a casus belli. Sounds suspiciously like our real society, doesn't it? And yet there was no grand plan to make it so. We assembled small mechanics, each for its own reason – hunger drives a raid, raids build rage, rage raises the chance of war. That they add up to this picture, we saw only from the measurements.

And separately, about that asterisk from the beginning of the article. Our first hypothesis was doomed before any measurement, because the link "enemies start raiding each other" simply did not exist in the code. We were confident in a chain that was missing its middle.

Caveats

  • All numbers come from wild worlds. A player with smites and blessings will bend these curves.
  • 132 instrumented worlds is a fairly large sample, but there are few wars per world. And the before-and-after comparison is two batches of 44 worlds, one run before the fixes and one after. The worlds in them are different, we did not repeat identical seeds.
  • One map size, one mode, a horizon of 150,000 cycles. Population density, how many lilcis live on a map of this size, almost certainly matters, but we did not vary it.
  • We rolled out the three economy fixes in one patch, so the contribution of each one on its own is not measured yet.
  • We counted only declarations of war as a formal event inside the simulation. Below that threshold there is plenty of violence that did not make it in here – border skirmishes, single raids, fights over food.

What's next

If war in this world is born from the economy, then peaceful coexistence should be born from there too. The next major system we are designing is trade caravans between allied clans. One clan's surplus will physically travel to a neighbor that lacks it, as a full train – porters, guards, the risk of not arriving. Right now alliances in the simulation are almost unreachable, and we suspect the reason is the same as everything above. While everyone is poor, there is nothing to trade. Now they are fed, and we will find out.


All figures are taken from the logs of wild worlds, 44 worlds per batch, each 150,000 cycles long, four clans each, without a single divine intervention.