March 29, 2019

Cities III: Toponymy

My generated names are too similar and there is no delineation between personal names and place names. What I'd like is a system to assign toponyms that are similar between settlements. This will aid player recognition (ha, who am I kidding) in terms of culture and personal names. Think, for example, the cities of Leningrad or Cardiff share elements with other cities in those countries, based on the toponyms -grad (place) and caer- (fort). Hence, it's unlikely that you would mistake, upon first hearing, that Petrograd and Caernarfon were personal names.

I'd be remiss if I did not mention this excellent series on naming places, over on Here Dragons Abound. This is a constant source of inspiration.

Since I have no database of names in real use, how do I find these toponyms? And how do I ensure they are consistently applied?

I'll start simply, by assuming that the name is terrain independent: no special convention for hills or mountains or valleys (Cwm Rhondda).

It should be fairly short, 4-5 letters.

It could be either a prefix or a post fix. But that'll need to be consistent.

Not every town will have the same version of the toponym. See the example above of Cardiff and Caernarfon. There are a couple of ways to do this (I might implement lenition rules in the future), but I think the easiest thing to do for now is to generate a new toponym that is within a threshold Levenshtein distance from an existing toponym. This'll account for differences in language and culture.

I won't do it by nation/hegemony (which I have yet to implement, coming soon with the political rules), I'll give each city a chance to take on a toponym similar or the same as that of the city which spawned it (I've been calling these "mother cities"). For now, I only track the mother city, but when I break the peace and install war/rebellion rules, the mother city may be in a different hegemony (even now it can be destroyed and no longer exist, but its children live on). This will preserve culture across national boundaries.

So when a city is being assigned a name, it will have a 20% chance of being assigned one of the current toponyms from its mother city's list. There is a 20% chance it will take a similar toponym, and 10% that it will create an entirely new one (which is then added to the mother's list). This will allow a bit of linguistic drift and everything won't be perfectly uniform.

Since the toponyms will be generated from the racial Markov chains, there should be similarities (but not replication) between, e.g., dwarfs and dwarfs, or orcs and orcs. A savvy player could perhaps pay attention to a town's name and discern some of the history and culture of that place.

Of course, in real history, settlement names change all the time for many reasons. But for now I'll keep names static. One thing at a time.

Let's try it out.

Mother city: Iowendawn, population 898, founded 3183 (human)

Toponyms: Umieu-, Teg-, Cos-
  • Uedestkamtowty, population 395, founded 3608
  • Umieuzowenki, population 1964, founded 3550
  • Umieuronwe, population 16079, founded 3178
  • Umieuaenkilbede, population 9566, founded 3275
  • Umieutamtopry, population 1254, founded 3520
  • Umieuprach, population 1503, founded 3601
  • Unostangel, population 1414, founded 3549
  • Umieudesogon, population 12765, founded 3157
  • Ukopach, population 1899, founded 3563
  • Tegcorwe, population 1799, founded 3092
  • Cosmadei, population 3411, founded 3549
  • Tegmorwen, population 229, founded 3405
  • Dustrys, population 333, founded 3602
It's not perfect, but I like it. It does expose a problem in that the names are generally very long, and the addition of a toponym makes it even worse. We want players to be able to say the names, after all (with a minimum of giggling). The answer lies in the Big Phoney package, which uses neural networks to categorize different syllables. It seems to work pretty well, translating the word into ARPABET:

Umieuaenkilbede $\rightarrow$ Y UW2 M UW0 AA1 NG K IH0 L B EH2 D $\rightarrow$ Yoom-yoo-ang-kil-behd $\rightarrow$ /juˌmuɑˈŋkɪlbɛˌd/

Uedestkamtowty $\rightarrow$ Y UW2 D IH0 S T K AE1 M T OW0 T IY0 $\rightarrow$ Yoo-dist-kam-toa-tea $\rightarrow$ /juˌdɪstkæˈmtoʊti/

I can use this to limit the number of syllables a word has, for ease of pronunciation. I have not been able to find an easy converter between ARPABET and IPA but that is not a priority (update: this package works). However, it's not terribly fast, so I may need to explore a less robust method. I could limit the overall word length to something more manageable, and use this to produce pronunciation guides for players.

1 comment:

  1. I initially created names using Martin O'Leary's generator ( which also essentially creates shared toponyms. But I found that once I had a number of generated names on a map it just ended up seeming ... generated. Hence I switched over to inventing mostly fictional but English-based / English-sounding names with only a few generated names mixed in. One key thing is to limit the length of the names -- there's definitely something like a power law curve for proper names. You should have many more short names than long names.