People: names, languages, cultures, histories and daily schedules
Notes compiled 2026-11-05 for Elsewhere and the Tycho study page People and histories. Target: plain JavaScript on a phone, deterministic from a seed, feeding people to Tyrell (the minds engine in tyrell/). Sibling notes: settlements_paths_vegetation.md (where villages and roads go) and world_generation.md (Watabou, villages as geometry).
Sourcing: several sites blocked fetching during this research: mewo2.com’s naming-language essay (now a real 404), stardewvalleywiki.com (403), ck.uesp.net (403), dwarffortresswiki.org (429 on most pages), Springer and Fandom. O’Leary’s and Azgaar’s generators were read from their source code on GitHub instead, which is better evidence than the essays. “(search summary)” marks a claim from a search-result snippet only; “(unverified)” marks one recalled but not fetched. Treat both as less certain.
What Tyrell already does, and what a generator must hand it
Read from tyrell/README.md, tyrell/docs/concepts.md, places.md, time.md, deciding.md, api.md and the module pages.
- A person is plain JSON (
PersonDef):name,traits(0..1: thrift, honesty, talkative, courage…),values(0..1: honesty, family, law…),home,job({ id, place, action, shifts, days?, wage? }),routine,groups,tags,born(minutes, negative for people older than the world),skills,talents,instincts,data(anything, e.g. a look). It is copied into the state and saved, which is why routines are data:whenconditions are strings, never functions (api.md, concepts.md). - Routines are
[hour, place, activity, extra?]entries; an entry lasts until the next;'*'is free time (or “anything at that place”); variants{ days?, when?, plan }pick a plan by weekday or condition, first match wins (deciding.md). Routine is rank 1, job rank 2, story directives rank 3; needs fill the gaps, and urgent needs can outrank routine. - Places are ids with tags, hours, slots, owners; no coordinates (places.md). Travel is minutes from links or
shell.travel. - Off screen nothing ticks: an event queue jumps from one action end to the next; “a day for a hundred people is a few thousand events, not a few million frames”. Near and far share one timetable; the game gets
embody/step/disembody(concepts.md). Strangers are passers-by computed “from the seed alone”, with no minds, promoted to people when they matter (places.md). - Reverie keeps memories
{ k, t, imp, recalls, about?, place?, text?, core? }; a memory recalled often enough can become a core memory that shifts traits; beliefs have sources and can be wrong (reverie.md).reverie.remember(id, memory)is the input a generator would use to seed a past. - Fellowship: regard, sentiments with reasons, hidden compatibility (raised by shared
values), groups and households with a shared purse, standing (fellowship.md). - Cradle: ages and stages from
born, couples, births, departures with grief and inheritance; Delos: genes with dominance, blended traits, talents (cradle.md, delos.md). - Wormtongue: secrets, gossip, lies; Gaff: storylets on a mean time between events; Cityspeak: lines chosen by the most specific rule,
who: 'tag:...'; Voice: conversations whose answers land by the listener’s nature; Westmarch/Irulan: the log and its telling as a story.
What Tyrell does not do, and a generator must supply: names, languages, cultures (as tags, values, taboos, line sets), the history before minute 0 (as born, households, sentiments, memories, facts), and the routines themselves (it runs routines; it doesn’t write them).
Names and languages
Martin O’Leary’s naming languages
Essay mewo2.com/notes/naming-language (offline at the time of writing); code github.com/mewo2/naming-language (one file, language.js). It is the generator behind the @unchartedatlas map bot, first built for NaNoGenMo 2015 (search summary).
- Phoneme sets, verbatim: consonants Minimal
ptkmnls, English-ishptkbdgmnlrsʃzʒʧ, Pirahãptkmnh, Hawaiian-ishhklmnpwʔ, Greenlandic-ishptkqvsgrmnŋlj, Arabic-ishtksʃdbqɣxmnlrwj, Arabic-litetkdgmnsʃ, English-liteptkbdgmnszʒʧhjw; sibilantss,sʃ,sʃf; liquidsrl,r,l,wj,rlwj; finalsmn,sk,mnŋ,sʃzʒ; vowelsaeiou,aiu,aeiouAEI,aeiouU,aiuAI,eou,aeiouAOU(capitals are extra vowels the spelling resolves). - Syllable structures (
?optional, skipped half the time): CVC, CVV?C, CVVC?, CVC?, CV, VC, CVF, C?VC, CVF?, CL?VC, CL?VF, S?CVC, S?CVF, S?CVC?, C?VF, C?VC?, C?VF?, C?L?VC, VC, CVL?C?, C?VL?C, C?VLC?. - Restrictions are regexes that reject a syllable: none, doubles
/(.)\1/, or doubles plus hard clusters/[sʃf][sʃ]/, /(.)\1/, /[rl][rl]/; the random language always uses the last. - Skewed frequency:
choose(list, exponent)returnslist[floor(random()^exponent × length)], default exponent 2, and each language shuffles its phoneme strings once, so every language has its own common and rare sounds. - Orthography: one consonant spelling set (Default, Slavic š ž č ǧ, German sch tsch dz ch, French ch j tch dj kh, Chinese x q j) and one vowel set (acutes, umlauts, Welsh â ê y ô w, diphthongs au ei ie ou oo, doubles), falling back to a default (ʃ→sh, ʒ→zh, ʧ→ch, ʤ→j, ŋ→ng, j→y, x→kh, ɣ→gh, ʔ→‘).
- Morphemes are kept by key:
getMorpheme(lang, key)reuses an existing morpheme with probability n/(n+extras), extras 10 for a generic morpheme and 1 for a keyed one, so a keyed concept (“city”) settles on one or two stems.makeWordputs the keyed morpheme in one syllable position. The genitive ('of') and definite ('the') are one morpheme each per language. - Names: half are one word; otherwise two words joined by the joiner or the genitive; 10% get the definite article; retry if outside 5..12 characters or if the name contains, or is contained in, an existing one.
- Defaults: random languages take minsyll 1..2, maxsyll up to 6, joiner a space three times in four, else a hyphen.
- His map generator (mewo2/terrain,
terrain.js) makes one language per map and callsmakeName(lang, 'city')andmakeName(lang, 'region'). His keys are concepts with no gloss; the stems repeat across names.
A contrast: Frozen Fractal’s “Around the World 19” trains Markov chains on the UDHR corpus (372 languages) over letter classes, mixes components from 30+ hand-picked languages for over 50,000 combinations, caps names at 20 letters, and calls O’Leary’s output “a uniform soup of words” with a “rigid phoneme structure” (frozenfractal.com).
Rosenfelder, Gen, Lexifer, Awkwords, Vulgar
- The Language Construction Kit (zompist.com/kit.html, kitlong): decide the sounds first, because working backwards “will lead to an inconsistent if not incoherent work”; “Start with a distinctive syllable pattern”; “Designing the phonological constraints in your language will go a long, long way to giving it its own distinctive flavor”; non-linguists “start with the alphabet and add a few apostrophes”; “sounds (and syllable structures) are not equiprobably distributed in natural languages”; “It’s better to derive long words by combining shorter words, or adding suffixes.”
- Gen (zompist.com/gen.html, help): categories
C=ptkbdg R=rl V=ieaou, syllable typesCV V CRV, rewrite rulesold|newas regexes applied in order (ki|či). Dropoff: “runs through the phonemes in a category, with a 30% chance of stopping at each one” (Medium; Fast 45%, Slow 15%), so the first four phonemes come out about 30, 21, 14.7 and 10.3%; list order sets frequency. Monosyllable rate from Always to Rare. - Lexifer (William S. Annis): naturalistic phoneme frequencies, “cluster tables” for what happens when two segments meet, built-in nasal and voicing assimilation (Colin Gorrie’s survey). Gorrie also names Logopoeist as “the only tool I’ve seen to implement a full statistical phonotactics system”.
- Awkwords: patterns
[a/b/c], optional(a), weights*N, filters^, capitals as subpatterns (Lingua::Awkwords, a Perl port of the original at akana.conlang.org). - Vulgar (vulgarlang.com): a whole language (phonology, stress, tones, sound changes, spelling, grammar, derived words, compounds, number base); the demo gives 200 words, the paid version “a 4000 word vocabulary”.
Markov namers, Azgaar, Dwarf Fortress, templates
- RogueBasin, high-order Markov with Katz back-off (roguebasin.com): character model of order n (tests use 3), orders n..0 trained together and backed off when a context is unseen, additive Dirichlet prior 0.001, n start symbols and one end symbol per name, outputs already in the training set dropped. Trained on Morrowind’s Dunmer names it gives “Methyn”, “Falure”; it warns a high order risks “simply memorizing the data”.
- Azgaar’s Fantasy Map Generator (source:
src/model/society/names-generator.ts,src/data/name-bases.tsin Azgaar/Fantasy-Map-Generator): a name base is{ name, i, min, max, d, m, b }: length limits, letters allowed to double, a deprecated multi-word rate, and a comma-separated list of real names. 43 bases of about 109 to 276 names (German 5..12, d “lt”; English 6..11; Elven 6..12, d “lenmsrg”; Orc 4..8). The chain is over pseudo-syllables of up to 5 characters, keyed by the previous letter; at most 20 steps; then cleanup (drop unallowed doubles, cut triples, “ae”→”e”, glue parts shorter than 2). Each culture points at one base. - Dwarf Fortress (DF2014:Language): about 3,300 words (1,737 nouns, 698 verbs, 849 adjectives, 16 prefixes) in 2,195 roots, each with a translation per race (English “Age” = Anam dwarven, Eyo elvish, Abo goblin, Thad human). First names are one untranslated word; epithets are usually two words, each possibly a compound (search summary). Symbol groups filter vocabulary by culture: dwarven names draw on ARTIFICE and EARTH and exclude FLOWERY, EVIL, NEGATIVE (search summary). Names are glossed compounds filtered by a culture’s values.
- Templates: skeeto’s fantasyname compiles RinkWorks-style patterns (
sV'i→ “entheu’loaf”) into a generator.
Place names from the land
From Wikipedia’s List of generic forms in place names in the United Kingdom and Ireland:
| Element | Origin | Meaning | Example |
|---|---|---|---|
| -by | Old Norse | settlement, village | Whitby, Grimsby |
| -thorpe | Old Norse | secondary settlement | Scunthorpe |
| -thwaite | Old Norse | clearing with a dwelling | Braithwaite |
| -ton | Old English | enclosure, estate, homestead | Brighton |
| -ham | Old English | farm, homestead | Nottingham |
| -wick/-wich | Latin/OE | place, settlement | Norwich |
| -bury/-borough | Old English | fortified enclosure | Canterbury |
| -chester/-caster | OE from Latin castra | Roman fort | Lancaster |
| -stow | Old English | (holy) place of assembly | Padstow |
| -ing | Old English | people of | Reading |
| -ford | Old English | ford, crossing | Bradford |
| -burn/-bourne | Old English | stream, small river | Eastbourne |
| -beck | Old Norse | stream | Troutbeck |
| -den/-dean, -dale, -combe | OE, ON, Brythonic | valley | Rottingdean, Rochdale |
| -ley/-leigh | Old English leah | woodland clearing | Barnsley |
| -hurst | Old English | wooded hill | Lyndhurst |
| -mere | Old English | lake, pool | Windermere |
| -mouth | Middle English | river mouth | Plymouth |
The Key to English Place-Names (Institute for Name-Studies, Nottingham, from the Survey of English Place-Names) gives each name’s meaning, elements and their languages. Pattern for a generator: a generic keyed by terrain or settlement type plus a specific (a person, an animal, a color, a tree) (inference). English names put the generic last; Welsh and Gaelic names put it first (Aber- “river mouth”, Llan- “church enclosure”, Inver-, Kil-) (inference from common knowledge of the elements; not fetched).
Daily schedules and routines
- Ultima VII (
SCHEDULE.DAT, Ultima Codex): 256 NPCs, each 1 to 8 entries (“Eight is the max amount for one NPC”), 4 bytes each: a 5-bit activity, a 3-bit time (eight periods of three hours, from midnight), and a point. 32 activities, among them Farm, Tend Shop, Blacksmith, Sleep, Eat, Bake, Sew, Preach, Kid Games, Eat at Inn, Patrol, Wander, Loiter. Exult’sschedule.hhas the same enum; Loiter roams 12 tiles (search summary). Schedules began in Ultima V (Ultima Codex). - Oblivion and Skyrim packages (cs.uesp.net Package; Paavo, “What was Radiant AI, anyway?”): a cascading list checked from the top, first valid package by schedule and conditions runs; schedules in hour blocks; types Travel, Wander, Find, Eat, UseItemAt, Sleep. Oblivion has about 1,000 NPCs and about 7,200 packages (about half scheduled); Skyrim about 6,000 (25% scheduled); Starfield about 3,500 (6%). Off screen: four processing levels; in unloaded cells Travel is about the only package that acts, actors teleport cell to cell “when enough time has passed”, and low-level actors “cannot interact with each other in any way”. Todd Howard at E3 2005: “They can steal it, they can buy it, they can grow it”; shipped, “NPCs cannot buy food”. Emil Pagliarulo: the skooma dealer was found dead because addicts “were killing the merchant to get it!”; “we the developers have had to consciously tone down the types of behavior they carry out” (GamesBeat).
- Stardew Valley (wiki blocked; search summaries): schedules per NPC as keyed strings, times “24-hour military format with no colon”, entries separated by “/”, “If multiple schedules apply, the first match in the order listed here is used”,
rain,rain2(50% on rainy days),default“Always applies”; marriage keys likemarriage_Mon; an entry looks like800 HaleyHouse 6 5 0(btnstardew). (Unverified: the full priority order runs from season-and-day-of-month down todefault, entries aretime location x y facing animation dialogue, andGOTOandNOT friendshiplines redirect.) - The Sims (Forbus and Wright 2001): objects carry “advertisements that describe its properties in terms of what need(s) of a Sim it will satisfy”; Sims pick “the behavior that maximizes their current happiness”; needs are energy, comfort, hunger, hygiene, bladder, room, social, fun (plus mood); “a toilet advertises to Bladder, in a range from 0 to 70”; advertisements fade with distance. Tyrell’s needs-and-actions core is this model.
- Animal Crossing (Nookipedia, Personality): eight personalities; New Horizons sleep times run from lazy (11 pm to 8 am) to cranky (3:30 to 9 am); peppy 1:30 to 7, smug 2 to 7, snooty 2:30 to 8:30, big sister 3 to 9:30 (Lazy, Peppy, Smug, Snooty, Big sister; normal, jock and cranky by search summary). Personality sets the clock.
- Shadows of Doubt (DevBlog 8): “100s of little citizens”, each with an apartment, a job and favorite places; 4 to 10 journeys a day; at first every citizen’s day was planned in advance, “typically no more than 10-15 seconds depending on the population count”. DevBlog 15: replaced by goals and a “sims-like stat system” because deviations broke the precomputed days; “the AI’s update rate will only be high when nearest the player”, making “the performance cost of 95% of the citizens at any one time relatively insignificant”.
- RimWorld (wiki, Schedule): a 24-hour grid of Anything, Work, Recreation, Sleep (and Meditate); needs override the assignment by thresholds (in Work, only food under 30%; in Anything, recreation under 35%, food or rest under 30%).
- Crowds and LOD: Assassin’s Creed Unity: “With the limit of 40 real AIs and 120 high resolution models, we could successfully create a scene where 10,000 crowd NPCs are on screen at the same time” (GDC Vault 2015). Brom, Šerý and Poch, “Simulation Level of Detail for Virtual Humans”, IVA 2007, LNAI 4722 (DOI 10.1007/978-3-540-74997-4_1); (unverified: places form a tree, detail is kept near the player, and actors are abstracted to “somewhere in the pub” when detail drops).
Takeaways for schedules
Three proven data shapes, simplest first: Ultima VII’s eight slots of (period, activity, point); Stardew’s keyed variants tried in priority order down to default; Bethesda’s cascading package list. Tyrell’s routine variants ({ days, when, plan }, first match wins) are the Stardew shape with Ultima’s entries, under needs from The Sims. Off screen, everyone who has shipped this precomputes or teleports and never lets far actors interact; Tyrell’s event queue is the exact version of the same idea (inference).
Generated history
Dwarf Fortress: simulate, then let the player in
- Pipeline, Tarn Adams, “Simulation Principles from Dwarf Fortress”, Game AI Pro 2 ch. 41 (PDF): elevation from “a randomized fractal”, then “temperature, rainfall, drainage, vegetation, and salinity”, biomes, rivers, creatures; “At this point, the world creation is complete and the simulation of civilization begins. Through this process settlements are raised, trade routes are formed, and wars are waged. At a designated point in time, the simulation stops and the player begins.” Principles: “Don’t Overplan Your Model”, “Break Down and Understand the System”, “Don’t Overcomplicate” (“Operate at the level of what the player sees or one layer below”), “Base Your Model on Real-World Analogs”.
- History length: Very Short 5, Short 125, Medium 250, Long 550, Very Long 1050 years, as maximums; more civilizations and higher site caps lengthen generation “by a huge amount”; history keeps running during play, “much slower” (search summary, DF2014:World gen). No official generation times found.
- Tarn on narrative (Paprika): he asks “whether or not a story thread can pass through a given feature”; “Relationships are more important than individual elaborate features”; influences include Romance of the Three Kingdoms and The Silmarillion. At GDC 2016: “We don’t care about atoms and stuff” (Game Developer). On the Stack Overflow podcast he calls the game “a collaborative storytelling partner” (podcast 377).
- Legends export (XML dump, dfwk.ru mirror): regions, sites, world constructions, artifacts, historical figures (id, name, race, birth_year, death_year with -1 alive…), entities, historical events (id, year, seconds72 at “403,200 per year”, type, type-dependent fields such as hfid, site_id), event collections (war, battle, duel, site conquered, journey…) nesting events. DFHack’s df-structures counts 134 history event types.
- Values, ethics, personality (DFHack
df.d_basics.xml): 33 values (LAW, LOYALTY, FAMILY, FRIENDSHIP, POWER, TRUTH, CUNNING, ELOQUENCE, FAIRNESS, DECORUM, TRADITION, ARTWORK, COOPERATION, INDEPENDENCE, STOICISM, INTROSPECTION, SELF_CONTROL, TRANQUILITY, HARMONY, MERRIMENT, CRAFTSMANSHIP, MARTIAL_PROWESS, SKILL, HARD_WORK, SACRIFICE, COMPETITION, PERSEVERANCE, LEISURE_TIME, COMMERCE, ROMANCE, NATURE, PEACE, KNOWLEDGE), signed per person; 22 ethics (KILL_ENEMY, LYING, THEFT, OATH_BREAKING, TRESPASSING…) each with one of 17 ordered responses on the entity (ACCEPTABLE, PERSONAL_MATTER, JUSTIFIED_IF_…, SHUN, APPALLING, PUNISH_EXILE, PUNISH_CAPITAL, UNTHINKABLE, REQUIRED); 50 personality facets from 0 to 100, with 40..60 unreported (search summary, DF wiki Personality, Ethic). A culture’s whole moral profile is about 105 small numbers. - Names (DFHack
df.language.xml):first_name,nickname, and seven word slots (FrontCompound, RearCompound, FirstAdjective, SecondAdjective, HyphenCompound, TheX, OfX), each an English word index rendered through a race’s translation; 60+ kinds of nameable thing (Figure, Site, River, Temple, Road, Bridge, Tomb, Festival…). “Urist Borushdumat (Raked-Roughness)” is a typical name (search summary, DF wiki Urist).
Caves of Qud: generate the events, then explain them
Grinblat and Bucklew, “Subverting Historical Cause & Effect: Generation of Mythic Biographies in Caves of Qud”, FDG 2017, DOI 10.1145/3102071.3110574 (PDF).
- “a distinction to be made between history as a process and history as an artifact”; their goal was “to generate history in order to simulate historical accounts”. Dwarf Fortress lets players stop history anywhere, “and so must remain agnostic as to what’s past and what’s present”; Qud need not, “just as most procedural terrain generators don’t aim to simulate water erosion”. Shipped December 23, 2016; scope fixed at five sultans to “mesh with the handcrafted lore”.
- State: a sultan’s “name, pronouns, birth year, birth region, location in birth region, and domain”; a domain is “an archetypal unit of culture” (glass, jewels, ice, stars, might, scholarship, chance; 10 then). Events are drawn at random from a pool (19 then), each resolves “based in part on the sultan’s state and in part on random branching”, updates state and emits one gospel; about twelve events, then a death.
- The trick: “there’s no logic behind the choice of events… Events themselves are chosen at random, though their gospels often profess causes.” “Acting against #injustice#, #sultanName# led an army to the gates of #location#”: if the sultan has allied frogs, the injustice is “the persecution of frogs”, “the event’s effect precedes its cause”; with no such state, the event adds the frogs, “the effect causes the cause”. Text from “a Tracery-like replacement grammar” in “a static, nested JSON file”.
- Coherence: “The sultan’s shared state acts as a glue”; “Because of the limited number of sultan properties shared across many events, emergent micro-narratives like this one are quite common.” No narrative arc was prescribed; apophenia does the rest.
- World ties: visited places become historic sites; named items lost there are placed there as real loot; shrines, paintings and engravings each depict “a single gospel”; the journal collects gospels in order. Wiki (Sultan history): 10 to 22 events, “typically… around 11-14”; an origin, 8 core events from 17 types (Corrupt Minister, Captured by Bandits, Meet Faction, Challenge Sultan, Crafted Item, Army at the Gates, Marriage…), then rule, regions, death; tomb inscriptions are “more laudatory” and “sometimes omit moral problems”: a second, biased account.
- Villages (wiki): “two generated events which form the ‘history’ of the village”, each with a 1 in 20 chance of abandonment that leaves remnants and “sometimes explicit clues about what happened”; each village has “its own generated faction, history, architecture, relationship with local resources, storytelling tradition, proverb, signature dish, signature skill” (search summary, Freehold devlog).
Talk of the Town and curation
Ryan and Mateas, “Simulating Character Knowledge Phenomena in Talk of the Town”, Game AI Pro 3 ch. 37 (PDF); source talktown basic_config.py.
- The town is simulated “from its founding in 1839, when a handful of families converge on an empty townscape to establish farms, through the death of the central character in the summer of 1979”; routines, businesses, houses, marriages, births by “utility-based action selection”; “300–500 NPCs”.
- Low fidelity: two timesteps a day,
number_of_timesteps_to_simulate_a_year = 10.0(“Setting for Bad News: 3.6”), so about 1.4% of half-days are simulated; a business closes with chance (1/730)/60 a step (60 years on average). - Knowledge is not simulated for 140 years; worldgen stops a week before the death, residents are implanted with knowledge of family, friends, neighbors and coworkers (others with chance 1 − 1/salience), then one week is simulated fully. Each NPC holds 250 to 400 mental models and 800 to 1,200 belief facets, with eleven kinds of evidence (observation, transference, confabulation, lie, statement, eavesdropping, mutation, forgetting…), each with source, place, time and strength: “Gary Stuart told me last night at the 3rd Street Diner”. Worldgen takes “(on the order of) a few minutes”.
- Ryan, Curating Simulated Storyworlds (PhD, UCSC 2018, eScholarship; read through Emily Short’s reviews): “There is a ubiquitous tendency to misconstrue the raw transpiring of a simulation… as being a narrative artifact, but such material will almost always lack story structure.” Sifting patterns and heuristics; “causal bookkeeping”; backward chaining from the most interesting event.
- Kreminski’s Felt (ICIDS 2019): sifting is “the selection of events that constitute a compelling story from a larger chronicle”, with Datalog patterns over
[e a v]facts; it reads Qud as sifting “to retroactively justify each action”. Winnow (AIIDE 2021) sifts partial matches as they play out, so a game can foreshadow. Epitaph (blog): events with implicit prerequisites rolled each tick. - Emily Short on storylets (2019): “a piece of content”, “prerequisites that determine when the content can play”, “effects on the world state”. A Qud event is a storylet whose prerequisites are met after the fact (inference). Ian Horswill’s CatSAT solves constraints for “character generators”: a third way, solving for a consistent backstory.
- Nothing Beside Remains (Smith Nicholls and Cook, FDG 2023, arXiv 2304.08293): “an abstract simulation of a village population is run until it reaches one of three failure states”; the end state drives the map (a hot, dry end shrinks the water); 187 players read stories into it. The closest model to a quest-sized past printed into a place.
Ultima Ratio Regum (Mark R. Johnson)
- Johnson, “Procedural Generation of Linguistics, Dialects, Naming Conventions and Spoken Sentences”, DiGRA-FDG 2016 (PDF): “qualitative procedural generation – the algorithmic creation of cultures, social norms, practices, beliefs”; existing attempts “tremendously simplistic… nothing more than surface detail”. Five dialect parts per nation: syllables and preferred letters (“the only aspect… that is random”, adherence 100% down to 70%); references from the capital’s climate, terrain, plants, animals, history, ideology, religion; a name archetype; greetings, farewells, insults from reference-filled templates (“may you be buried beneath the sand where none shall find you” for nomads); and sentence complexity, which is gameplay (talkative cultures give more clues). About “50,000,000 possible religious altars”.
- Ten-year retrospective (Game Developer): skewed outcomes (“three outcomes which each happen 30% of the time” and “50 incredibly obscure ones which only happen 0.2% of the time”); hidden checks whether something “is too much like something else” and re-roll; “every concept should in some way link to every other concept” (if “ravens are thought to be lucky”, a raven shield earns approval). Map 250×250 tiles, about 18 cities.
Lineage and legacy
- Crusader Kings III authors history and simulates forward: character files with
dynasty,culture,father/mother, traits and datedbirth/deathblocks (modding wiki). Inheritance (wiki): one active parent 25%, both 80%, both carriers 10%; trait-free parents have “12.7% chance” of a congenital trait. - Wildermyth: history lines are “A line of player-facing text that tells a story about the entity it’s pinned to”; each hero starts with three (Origin, Anecdote, Motivation) that set stats and seed hooks, and more are added “in recognition of game-occurrences” (History). Legacy promotion “saves a hero’s items, transformations, history, and abilities” (Legacy).
- Kenshi: (unverified) killing or imprisoning faction leaders moves towns into new world states.
Cultures from the land
- Azgaar (
cultures-generator.ts,docs/wiki/Culture-types.mdin the repo): the type comes from the culture’s center cell, first match wins: Nomadic (low, desert or grassland), Highland (high), Lake (by a lake over 5 cells), Naval (harbor, with chances 0.1/0.6/0.4), River (flux over 100), Hunting (inland savanna, rainforest, taiga, tundra, wetland), else Generic. Expansionism base: Generic 1, Lake 0.8, Naval 1.5, River 0.9, Nomadic 1.5, Hunting 0.7, Highland 1.2. Cultures spread by a priority queue over cells costing (biome + biome change + height + river + type)/expansionism: native biome 10, tundra 1000, glacier 5000; Highland pays 3000 on lowland; River cultures pay 0 on rivers and 100 off them; Naval crosses water at area×2, Nomadic at ×50. Religions: Folk (Shamanism 4, Animism 4, Polytheism 4, Ancestor Worship 2…), Organized, Cult, Heresy; folk religions come from their culture. - Stellaris (Ethics): four axes (Authoritarian–Egalitarian, Spiritualist–Materialist, Militarist–Pacifist, Xenophile–Xenophobe); “Each empire has 3 ethic points which must all be spent”, fanatic costs 2; pops drift by attraction and “the system will always trend towards the mean”.
- Keeping it from stereotype: no sourced text on “planet of hats” (TV Tropes refused). Johnson’s working methods are the evidence: skewed rarity, a similarity re-roll, and interlinking so no trait stands alone. In the demos, the land weights the draw of values but never sets them, and every culture gets two values, a taboo and a building style from separate draws (inference).
Costs, and what fits a phone
| System | Scale | Cost |
|---|---|---|
| Dwarf Fortress | up to 1,050 years, tens of thousands of figures | minutes to hours (community reports only) |
| Talk of the Town | 140 years, 300 to 500 NPCs, ~1,000 facets each | “a few minutes”; 1.4% of half-days simulated |
| Caves of Qud | 5 sultans × ~12 events, 2 events per village | not stated; structurally trivial |
| Shadows of Doubt (early) | hundreds of citizens, 4 to 10 trips a day | 10 to 15 s to plan a day |
This study’s history demo |
300 years, 3 to 4 cultures, ≤28 towns, ~100 events | 60 to 75 ms in Chrome on a laptop (measured) |
This study’s schedules demo |
10 to 14 people, 3 routine variants each | position is a pure function of the clock; microseconds a frame |
A quest-sized past fits in a frame budget’s worth of work at load, if it simulates years coarsely, keeps only events, and prints them into the place (inference).