People and histories

How a generated place can come with people who have a past: names in a language of their own, cultures read from the land, a history that explains the ruins and shrines, and days that run on a clock. Tyrell already runs the minds: needs, routines, memories, households, lineage and gossip. What it lacks is a generator to write those people before minute 0, and that is this page. The finding is that every shipped system splits into the same two halves. History is either simulated, then summarized (Dwarf Fortress, Talk of the Town) or generated as events, then explained (Caves of Qud), and for a quest-sized world the second is cheaper and reads better. Either way, what matters is that every event leaves something in the place and in someone’s memory. Names work the same way: a language is a few phoneme sets, a syllable shape and a spelling (Martin O’Leary), and if each morpheme keeps its meaning, a place can be named from what is there and glossed back. Routines are data in every game that has them, from Ultima VII’s eight three-hour slots to Stardew Valley’s keyed variants. Tyrell’s routine format already is that data, so a generator only has to write it. A 300-year history for a small island takes about 70 ms of plain JS, and a village’s day is a pure function of the clock.

Proposed: none of this is in Tycho yet. The demos run here in the page, written in plain JS with the study’s own kit (demos/kit.js), not Tycho; each says how it would run in Tycho: per frame (the GPU stand-in’s calls), pre-bake (painted once offscreen), or shader (per-pixel work every frame). What would move into Tycho, and when, is in the roadmap.

Text marked (inference) is reasoning from the sources, not a sourced fact. “(search summary)” marks a claim known only from a search-result snippet, where the source itself could not be fetched. The full research is in the note on people, names and histories.

What Tyrell already does

Tyrell decides what each person does, remembers what happened to them and “keeps them living when nobody is watching” (Tyrell). For a generator, the useful facts are what a person is in Tyrell, and which inputs can give them a past.

Tyrell part What it holds What a generator would feed it
PersonDef (API) name, traits and values (0..1 each), home, job, routine, groups, tags, born, skills, talents, data A name, a culture’s values, a job and a routine written from them, a birth time before minute 0
Routines (Deciding) [hour, place, activity] entries, each lasting until the next; variants { days, when, plan }, first match wins The routines themselves: Tyrell runs them but does not write them
Ring (Places) Places as ids with tags, hours, slots and owners; travel in minutes The village’s places, from the generated map, with owners from its history
Strangers (Places) Passers-by computed “from the seed alone”, promoted to people when they matter Errands per hour for a region
Reverie (module) Memories { k, t, imp, about, place, text }, core memories that shift traits, beliefs that can be wrong The history’s events, as memories of the people who lived them (reverie.remember)
Fellowship (module) Regard, sentiments with reasons, compatibility raised by shared values, households with a purse Households, old friendships and grudges from the history
Cradle and Delos (Cradle, Delos) Ages and stages from born, couples, births with blended traits and genes Founders’ genomes; children of the history’s couples
Wormtongue, Cityspeak, Voice, Gaff Secrets and gossip; lines chosen by the most specific rule; conversations; storylets A secret from the history; a culture’s lines as who: 'tag:<culture>'; a storylet that fires on an old grudge

Tyrell knows “nothing about tiles, side views, sprites or maps” (Tyrell), and it never invents a name, a language, a culture or a past. That is the gap. Everything below would be a generator that runs once, from a seed, and writes plain JSON that Tyrell’s existing inputs accept (inference).

Names from a naming language

Martin O’Leary’s naming-language generator, made for his Uncharted Atlas map bot, is the reference design, and it is small: one file of JavaScript (mewo2/naming-language). A language is a handful of choices:

Part Choices in O’Leary’s code
Consonants 8 sets, from Minimal ptkmnls to Arabic-ish tksʃdbqɣxmnlrwj
Sibilants, liquids, finals s, sʃ, sʃf; rl, r, l, wj, rlwj; mn, sk, mnŋ, sʃzʒ
Vowels 7 sets, from aiu to aeiouAOU (capitals are extra vowels the spelling resolves)
Syllable structure 22 patterns such as CVC, CVV?C, S?CVF, C?VLC? (? optional, skipped half the time)
Restrictions Regexes that reject a syllable: no doubled letters, no [sʃf][sʃ], no [rl][rl]
Spelling One consonant set (Slavic š ž č, German sch tsch, French ch j tch, pinyin x q j) and one vowel set (acutes, umlauts, Welsh â ê y ô w, doubles)

Two details make the output sound like a language rather than noise. First, frequency is skewed: each language shuffles its phonemes once and picks with list[floor(random()² × length)], so every language has its own common and rare sounds. Rosenfelder’s Gen does the same with a 30% chance of stopping at each phoneme, which gives the first four about 30, 21, 15 and 10% (Gen help). Second, morphemes are kept by meaning. A keyed concept such as “city” reuses an existing morpheme with probability n/(n + 1), so it settles on one or two stems, and the genitive “of” and the definite “the” are one morpheme each per language. A name is one word or two, joined by a space, a hyphen or the genitive, kept between 5 and 12 letters, and rejected if it contains another name. Rosenfelder’s advice is the same in prose: “Start with a distinctive syllable pattern”, and “It’s better to derive long words by combining shorter words, or adding suffixes” (Language Construction Kit).

The alternatives trade control for flavor:

Method How Good for Source
Phonotactic (O’Leary, Gen, Lexifer, Awkwords) Sets, structures, rewrite rules Invented languages with a consistent sound Gorrie’s survey
Markov on real names Order-3 characters with back-off (RogueBasin), or Azgaar’s pseudo-syllables keyed by the previous letter, over a base of 109 to 276 real names A culture that should echo a real one RogueBasin, Azgaar
Glossed lexicon About 3,300 English words with a translation per race; names are compounds of words filtered by the culture’s symbol groups Names that mean something DF wiki, Language
Templates RinkWorks-style patterns (sV'i) compiled to a generator Quick, uncontrolled variety fantasyname
Full language Phonology, grammar, sound changes, a 4,000-word vocabulary Authoring, offline Vulgar

The demo combines the first and third rows. It keeps O’Leary’s sets, structures, restrictions and spellings, but gives every morpheme a meaning (“river”, “ford”, “oak”, “wolf”). It makes them all once, in a fixed order, so a language is the same whatever asks first. Then any name can be glossed back. Dwarf Fortress shows the payoff: a dwarf’s surname is two English words rendered in dwarvish, “Urist Borushdumat (Raked-Roughness)” (search summary, DF wiki), and 60-odd kinds of thing can be named, roads, bridges and tombs among them (DFHack’s df-structures). Personal names in the demo are two meaningful elements, as Old English names were (Ælfred, “elf counsel”) (inference from common knowledge; not separately sourced). Family names follow one rule per language: by father or mother, by home place, by trade, or by a house name. One rule per language is what makes a household read as one family and a culture as one culture (inference).

A naming language. A seeded language after Martin O'Leary: phoneme sets, a syllable structure, restrictions and a spelling, shown under Sounds. Each meaning keeps its morpheme, so every place on the coast is named from what is there, a qualifier plus a head (oak + ford, salt + shore), and glossed with what an English namer would have said. Some languages put the head first, as Welsh does. People lists given names of two meaningful elements and family names by the language's one rule (by parent, place, trade or house). Tap a pin to find its name; tap elsewhere or New names for more people; New seed makes another language and another coast.

Place names from the land

Real place names are a generic for the kind of place plus a specific that tells it apart (inference from the lists below). The English generics are a small table (Wikipedia; the Key to English Place-Names gives each name’s elements and their languages):

Generic From Meaning Example
-by Old Norse settlement, village Whitby
-thorpe Old Norse secondary settlement Scunthorpe
-ton Old English enclosure, homestead Brighton
-ham Old English farm, homestead Nottingham
-bury, -borough Old English fortified enclosure Canterbury
-chester, -caster Old English, from Latin Roman fort Lancaster
-stow Old English (holy) place of assembly Padstow
-ing Old English people of Reading
-ford Old English crossing Bradford
-burn, -beck Old English, Old Norse stream Eastbourne, Troutbeck
-ley Old English woodland clearing Barnsley
-mere Old English lake Windermere
-mouth Middle English river mouth Plymouth

Three things carry over to a generator (inference):

O’Leary’s own map generator calls makeName(lang, 'city') and makeName(lang, 'region') (mewo2/terrain): his keys repeat a stem without saying what it means. Glossing is the one addition. It lets the game say what a name means when someone asks, and lets a quest turn on a name (“Oakford has no oaks”) (inference).

Cultures from the land

Generators that make cultures start from where the culture begins. Azgaar’s Fantasy Map Generator reads a culture’s type from its center cell, first match wins: Nomadic (low desert or grassland), Highland, Lake, Naval (a harbor), River (flux over 100), Hunting (inland forest, taiga, tundra, wetland), or Generic. The type sets how far it spreads (expansionism 0.7 for Hunting to 1.5 for Naval and Nomadic) and what each cell costs it: River cultures pay 0 along rivers and 100 away from them; Highland cultures pay 3,000 for lowland; Naval cultures cross water at a twenty-fifth of a Nomadic culture’s cost (cultures-generator.ts). Each culture points at one name base, and folk religions come from their culture.

What a culture values is a short vector in every system that models it:

System Values Shape
Dwarf Fortress 33 values (law, family, tradition, craftsmanship, merriment, nature, peace…) and 22 ethics, each with one of 17 responses from “acceptable” to “unthinkable” About 105 small numbers per culture (df-structures)
Stellaris Four axes; “Each empire has 3 ethic points which must all be spent”, a fanatic ethic costs 2 Three points on four axes (wiki)
Tyrell values 0..1 per person; shared values raise compatibility Free keys (Fellowship)

Mark R. Johnson’s Ultima Ratio Regum goes furthest, and he names the danger: most cultural generation is “tremendously simplistic… nothing more than surface detail”. His fix is to make every trait refer to something else in the world. A nation’s dialect draws on its capital’s climate, terrain, plants, animals, history and religion: a nomad’s curse is “may you be buried beneath the sand where none shall find you”. Sentence complexity is gameplay, because talkative cultures give more clues (Johnson 2016). His other habits keep the output from becoming a set of stock types. Outcomes are skewed: “three outcomes which each happen 30% of the time” beside “50 incredibly obscure ones which only happen 0.2% of the time”. A hidden check asks whether something “is too much like something else” and rerolls it. And “every concept should in some way link to every other concept”: if “ravens are thought to be lucky”, a raven on a shield earns approval (Game Developer).

For Elsewhere, whose quests each bring a small world with “its own look, people and way of playing”, a culture can be a short record (inference):

Field Drawn from Becomes in Tyrell
Way of life (seafarers, river farmers, herders, foresters, fen folk) The land around its first town, as Azgaar does A tag on each person; jobs and routines
Two values Weighted by the way of life, never fixed by it values on each person
A taboo Drawn apart from the others A fact, a Cityspeak line, a storylet condition
A building style Materials at hand (timber, stone, stilts, turf) The painter’s kit for the place
A language Seeded per culture Names; place names
A naming rule Per language Family names; households

The demo’s cultures are built this way. The land adds weight to some values (seafarers lean toward trade), but every value can come up anywhere. Taboos and building styles are drawn separately, so two seafaring cultures don’t come out identical. That is a small version of Johnson’s skew and interlinking, and it is the honest limit of the demo: four fields don’t make a culture, they make a culture’s label (inference).

History: simulate or explain

Simulate, then summarize. Dwarf Fortress builds the land, then “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” (Tarn Adams, Game AI Pro 2). History length runs from 5 to 1,050 years, and more civilizations and sites lengthen generation “by a huge amount” (search summary, DF wiki). The record is kept as data: historical figures with birth and death years, events with a year, a type and the ids they touch, and collections (a war, a battle, a journey) that nest events. DFHack counts 134 event types (df-structures). Tarn’s rules for the model are short: “Don’t Overcomplicate”, and “Operate at the level of what the player sees or one layer below”. He also asks of each feature “whether or not a story thread can pass through” it (Paprika).

Talk of the Town simulates a town “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”, ending with 300 to 500 people (Ryan and Mateas). Its cost tricks are the lesson:

Ryan’s dissertation then argues that the raw run “will almost always lack story structure”, so it must be sifted and curated, the way a nonfiction writer would (Emily Short’s review).

Generate the events, then explain them. Caves of Qud’s sultan histories start from “a distinction to be made between history as a process and history as an artifact”, and aim “to generate history in order to simulate historical accounts” (Grinblat and Bucklew 2017). A sultan is a small state (name, birth year, region, a domain such as ice or glass, allies, a profession). About twelve events are drawn from a pool, and “there’s no logic behind the choice of events… though their gospels often profess causes.” Each event’s text, “Acting against #injustice#, #sultanName# led an army to the gates of #location#”, fills its cause from the state: if the sultan has allied frogs, the injustice is “the persecution of frogs”. If no state fits, the event invents it and adds the frogs: “the effect causes the cause.” Coherence comes from the few shared properties: “The sultan’s shared state acts as a glue.” Every event leaves things in the world. Visited places become historic sites, named items lost there lie there as real loot, and shrines and murals each show one gospel. Tomb inscriptions retell the same events “more laudatory”, a second, biased account (Qud wiki). A village gets only “two generated events”, each with a 1 in 20 chance of having emptied it, leaving “sometimes explicit clues about what happened” (Qud wiki).

  Simulate, then summarize Generate, then explain
Examples Dwarf Fortress, Talk of the Town Caves of Qud, storylets
History is A process that ran An account that was written
Cost Years × agents; minutes for a town About a dozen events per figure; trivial
Coherence from Real causes, which then need sifting Shared state, plus the reader’s apophenia
Player can stop it Anywhere (DF) No: the past is fixed
Leaves in the world Sites, figures, artifacts, ruins Sites, relics, shrines, murals

Between the two sit story sifting and constraint solving. Kreminski’s Felt runs Datalog patterns over the event log to find “events that constitute a compelling story”, and reads Qud as sifting “to retroactively justify each action” (Felt). Winnow sifts while events are still playing out, so a game can foreshadow (Winnow). Horswill’s CatSAT solves for a consistent character instead (CatSAT). And Nothing Beside Remains runs “an abstract simulation of a village population” until it fails (food, ecosystem, hostile animals), then prints the end state into the map: a hot, dry end means shrunken water (Smith Nicholls and Cook 2023).

The demo is the simulate side made cheap. It ticks yearly, never daily, keeps no agents beyond towns and rulers, and stores every event with its year and the ids of what it touched. Three hundred years on a 96×60 island with three or four cultures take 60 to 75 ms in Chrome on a laptop. Generation follows these rules:

Because each event names what it touched, tapping a shrine on the map answers why it is there.

A world with a past. Three hundred years on a seeded island. Three or four cultures start on good land; each one's way of life is read from the land around it (coast, river, hills, woods, fen), which weights its two values but never fixes them, and each gets a taboo and a way of building. Towns grow, found daughters along roads found by cost (so roads bend round hills and gather at fords), trade, quarrel, fight battles, change hands and burn; floods and visions raise shrines; cairns mark where heroes fell. Towns are named in their culture's language from their sites. Drag Year or press Play to scrub the timeline; tap a town, shrine or battlefield (the red cross) for its story. The legends list is every event up to that year.

For a quest the explain side is usually the better fit (inference). The player arrives at the end of history and never stops it partway, a quest needs three to five events rather than three hundred years, and each event can be chosen because it leaves something worth finding. The demo’s real lesson is its data shape: events as { year, text, refs }, with every object on the map holding the ids of the events that made it. That shape serves either method.

Lineage and legacy

A past is also a family tree. Crusader Kings III authors its history and simulates forward from it. Character files carry dynasty, culture, father and mother by id, traits, and dated birth and death blocks (CK3 wiki). Congenital traits pass on by table: 25% with one parent showing it, 80% with both, and 10% from two carriers (CK3 wiki). Tyrell’s Cradle and Delos already do the forward part: ages and stages from born, couples, births whose genes follow dominance and whose traits blend both parents (Delos). So a generator needs only to write the founders and the dead: a few generations as PersonDefs with negative born, and the departed as memories of 'loss' (inference).

Wildermyth shows how little text a character needs. Each hero starts with three history lines (Origin, Anecdote, Motivation), “A line of player-facing text that tells a story about the entity it’s pinned to”. The lines set stats and seed quirks, and more are added “in recognition of game-occurrences” (Wildermyth wiki). A retired hero becomes a legacy hero who keeps “items, transformations, history, and abilities” (Legacy). That is the right size for an Elsewhere quest-giver: one or two lines of past, each tied to something the player can see (inference).

Daily routines

Routines are data in every game that has them, and the formats converge:

Game Format Numbers
Ultima VII Per NPC, 1 to 8 entries of (3-bit period, 5-bit activity, point) 256 NPCs; eight periods of three hours; 32 activities from Farm and Tend Shop to Kid Games and Eat at Inn (Ultima Codex)
Oblivion, Skyrim A cascading list of packages (Travel, Wander, Find, Eat, UseItemAt, Sleep), the first valid by schedule and conditions runs; schedules in hour blocks About 1,000 NPCs and 7,200 packages in Oblivion (half scheduled); 6,000 in Skyrim (a quarter) (Paavo, cs.uesp.net)
Stardew Valley Keyed schedule strings, “the first match in the order listed” wins, down to default; entries like 800 HaleyHouse 6 5 0 Times in “24-hour military format with no colon”; rain2 applies on half of rainy days (search summary)
The Sims No schedule: objects advertise to eight needs, and a Sim picks “the behavior that maximizes their current happiness” “a toilet advertises to Bladder, in a range from 0 to 70” (Forbus and Wright)
RimWorld A 24-hour grid of Anything, Work, Recreation, Sleep; needs override by threshold In Work only food under 30% interrupts (wiki)
Animal Crossing Personality sets the clock Lazy villagers sleep 11 pm to 8 am; big sisters 3 to 9:30 am (Nookipedia)
Tyrell [hour, place, activity] entries, variants { days, when, plan }, rank 1 under job and story, needs in the gaps Fractional hours; an entry lasts until the next (Deciding)

Tyrell’s format is Ultima’s entries with Stardew’s variants, run over The Sims’ needs, which leaves only the writing of routines to a generator (inference). The demo writes them from a few parts:

Each day adds a few minutes of seeded slack per entry, so nobody runs like a clock, except the shared supper and the rest-day prayer, which are social appointments. Bethesda’s history is the warning against going further. Todd Howard promised NPCs that “can steal it, they can buy it, they can grow it”; Emil Pagliarulo found a quest’s skooma dealer already dead, because addicts “were killing the merchant to get it!”, and the team “had to consciously tone down” behavior (GamesBeat). Shipped, “NPCs cannot buy food” (Paavo). A routine is a promise to the player about where someone will be; needs should bend it, not break it. Tyrell’s ranks already do that.

A village day. Four households (ten to fourteen people) in a village whose language, values and few events are seeded. Each person's routine is written from their job, age, habits and the village's values as Tyrell routine variants (shown under the person, with today's marked), and the strip shows today's plan with the clock's place. Market days fill the square; on the rest day everyone goes to the shrine at nine; at night the windows of houses with someone awake are lit. Where everyone is comes from the clock alone, the way Tyrell's far people and strangers work off screen. Pick someone under Follow or tap them; change the speed; New seed makes another village.

Off screen

Every shipped system cheats the same way off screen:

Game What happens when nobody is watching
Oblivion 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” (Paavo)
Shadows of Doubt First, a day was planned in advance for every citizen (“typically no more than 10-15 seconds”). Later, goals updated at a rate that is high “only… when nearest the player”, making “the performance cost of 95% of the citizens at any one time relatively insignificant” (DevBlog 8, DevBlog 15)
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” (GDC Vault)
Talk of the Town 140 years at 1.4% fidelity, with knowledge implanted at the end

Tyrell’s answer is exact rather than approximate. “Off screen nothing ticks”: an event queue jumps between action ends, so “a day for a hundred people is a few thousand events, not a few million frames”. Near and far follow one timetable, so a watched world hashes the same as an unwatched one (Concepts). Strangers go one step further and cost nothing until promoted (Places). The schedules demo is the strangers’ trick applied to routine-only people: their position at any minute is a pure function of the seed and the clock, with nothing stepped. For history, the same idea runs one level up (inference):

A quest-sized past

Elsewhere’s quests are “five to fifteen minutes”, each with “two to six residents” and one place (Elsewhere’s design brief, its DESIGN.md). The worlds page already proposes the loop: a few people, three to five events that link people to places, a layout where each event leaves something, and the events fed to the minds as memories. Put together with this page’s sources, the generator would run in seven steps, all from one named stream such as ctx.rng('people') (inference):

  1. Read the site. From the land the place already has (geography, settlements): water, slope, woods, the road and its fords.
  2. Make the culture. A way of life from the site, two values, a taboo, a building style, a language and its naming rule.
  3. Write the past backward from what the place shows. Choose three to five events from a deck whose cards each leave a mark, Qud-style. Fill each card’s cause from the state, or invent it:

    Card Leaves Becomes
    Flood A shrine upstream A fact, a memory for everyone old enough
    Fire A ruin, a rebuilt forge on old stones Who owns the forge now
    Quarrel over a boundary A field split by a wall Two households with a grudge (Fellowship sentiment)
    Marriage from elsewhere A newcomer with a different name A name from another language, a sentiment
    Death A grave Grief, an inheritance (Cradle)
    A road built round a hill The bend in the road A name (“Long Hill”), a memory
  4. Name everything from the site and the events, in the culture’s language, glossed.
  5. Write the people. Households with born, home, a job and a routine from the parts above, values from the culture plus a personal draw, and the events as reverie.remember memories for those who lived them, each with about and place.
  6. Settle. world.advance a day or two so regard, habits and gossip start from somewhere.
  7. Check. In Node over a thousand seeds: every person has a reachable home and workplace, no two names collide, every event has a mark the player can reach, and generation stays under its budget. This is the generate-and-test the worlds page recommends.

Why the shrine is there, why the road bends, who owns which field. Each of these is an event whose mark is on the map and whose memory is in someone’s head. The player can find it in either place, and Voice can bring it up when they ask (inference). Dwarf Fortress’s test for a feature fits here: whether “a story thread can pass through” it.

What it means for Tycho and Tyrell

Nothing here needs new engine machinery for minds, because Tyrell already runs everything the past is fed into. What’s missing is a seeded writer of people, small enough to run at a quest’s load. A proposed split, all (inference):

Part Where What Size
lang Tycho, core (no DOM) O’Leary-style naming languages with glossed morphemes, made in a fixed order; naming rules; place names from a generic and a specific; a table of generics per language S, about 200 lines (the demo’s is about 130)
culture Tycho, world A record (way of life, values, taboo, building style, language, naming rule) from a site, with weights the game passes in S
chronicle Tycho, world An event log { y, kind, text, refs }, a deck of event cards with marks and cause slots filled from state (Qud), and an optional yearly simulator for wider maps (this page’s demo) M
routine Tyrell tool, or the bridge Writes Tyrell routine variants from job, stage, habits and values; the game passes the job table S
populate The bridge (tycho-minds) Turns households, a chronicle and a culture into world.person calls, fellowship groups and sentiments, reverie.remember memories and facts M
Checks Test kit A seed sweep for reachable homes, unique names and reachable marks S

Tyrell itself might gain two small options (inference):

Elsewhere’s rule still holds. Nobody in any world knows what a main quest is, and no generated past may be about the Hollow, the Lanterns or the Spire. The event deck simply has no such cards.

Sources

The full research is in the note on people, names and histories.