Procedural History

Procjam 2017 – ‘make something that makes something!’ is on right now.  My interest in procedural generation at the moment concerns the way we think about something when we’re making something else that makes that something. (Still with me?)

I’ve dabbled in sound, and in text, and in bots; now I’m thinking about procedural history. Now, in a way, that was what I was doing when I got into this whole DH scene way back when – agent based modeling. But there’s something about the way something like Dwarf Fortress writes history – and people in turn flesh those histories out (this was the subject of an undergraduate honours thesis done for me by a student, who, to my frustration, has never posted the work online).

So I’m coming back to it. This is also partly because I’m interested in how ideas about how cities work are codified in city sim games that then get draped in the trappings of Antiquity (am writing a piece on this at the moment). Today I came across a very cool project from the procjam community, by David Masad (who I note is using ABM for his dissertation work), called ‘WorldBuilding‘. It takes the algorithm for fantasy maps that you may have seen at play in that twitter account, ‘uncharted atlas’, generates a world by simulating landscape and erosion, introduces an ABM of nomads who settle down into cities, who interacted via trade routes, and who pay tribute or go to war with one another.

All within one python notebook.

Here is the dusty plateau, fringed by a verdent coast, where one or two valleys give access to the interior. Nomads arrive, and in the course of time, settlements and routes emerge:

And we can begin to model their interactions.  Masad is using Axelrod’s Tribute Model. He then dips into the logs and is able to generate the annals of this world:

“From 0 to 49, Ceotpe saw slow growth. In this period it received tributes from Oqlou.
From 49 to 50, Ceotpe saw slow decline. In 50 it, and joined its allies in one battle.
From 50 to 87, Ceotpe saw slow growth. In this period it received tributes from Oqlou.
From 87 to 88, Ceotpe saw slow decline. In 88 it, and joined its allies in one battle.
From 88 to 90, Ceotpe saw slow decline. In this period it, and joined its allies in one battle.
From 90 to 92, Ceotpe saw rapid decline. In this period it fought a war against Oqlou.
From 92 to 99, Ceotpe saw slow growth.”

The code also produces a line chart of a city’s fortunes – for instance, the city of Tigei had a much different history:

The logs spell out what was happening:

” 43, ‘Receive tribute’, ‘Oqlou’
50, ‘Joined war against’, ‘Itykca’
62, ‘Receive tribute’, ‘Oqlou’
73, ‘Receive tribute’, ‘Oqlou’
88, ‘Joined war against’, ‘Itzyos’
90, ‘Joined war against’, ‘Itzyos’
92, ‘Led war against’, ‘Oqlou'”

I could imagine, say in a senior undergrad seminar where I had the time and commitment from students, to use this code as the kernal for a deep exploration of how history intersects with games and simulation. How do you get from an annal to a history? The students would work at the creative tension between what a game shows and what a game merely suggests and what the player brings to that gap.

Something like that. It’s dark, it’s november, the time changed, I’m tired, not exactly coherent. But there’s something extremely cool here (not least the usage of jupyter notebook to illuminate the code). My gut, which I consult on such things, thinks this stuff is important.

featured image Peter Lewicki, unspash