So I've finished the first version of my name generator (now conveniently available at
d0rfforge.com. plug plug) and I'm looking to make it more accurate. Right now, it only uses the base word and completely ignores tenses, plurals, verb/adjective forms, and all those other boring grammar rules. In order to conform to those rules, I need to know WHAT those rules are, The raws give a lot of information, but it's all in Toady's weird token-based data structure. Gross.
The Wiki says that
First Names are always nouns
Second Names are always two-word pairs and can be any combination of word types, but Noun-Noun, Adjective-Noun, and Verb-Noun appear to be the most common
So I pretty much need to reverse engineer Toady's naming rules. I've never done this before, but I imagine if I can get a big enough list of dwarves, I'll be able to find a pattern in their naming schemes that I can actually use. So...
- I started with 40 dwarves
- I clipped off the first name (since I already know it's always a singular noun and it's never translated anyway)
- I dug around in the language_words file and extracted a list of all word forms for each word
- A whole bunch of boring programming stuff made them easier to work with
- I wrote a script that looks at each dwarf's name, finds the base word, and spits out all of the possible choices it did/didn't use
Just for context, here's what ONE word looks like with 2 noun forms, 5 verb forms, 1 adjective form, and no prefix forms
"blockade": new DFWord("blockade:blockades", "blockade:blockades:blockaded:blockaded:blockading", "blockaded", null)
And here's what the script spit out. The (bit in parentheses) denotes how many nouns, verbs, adjectives, and prefixes there are to choose from while the [bit in brackets] denotes which options are available and which were chosen.
KEY (n, v, a, p) [x=exact, o=available, -=null]
Litast ònuludar, "Mirror Rained"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 5, 1, 0) [oo, ooxxo, o, -]
Erush Gingoltar, "Young Gilt"
last1: (0, 0, 1, 0) [--, -----, x, -]
last2: (0, 5, 1, 0) [--, ooxxo, o, -]
Olon Rosatoddom, "Chapel Cloistered"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Doren Oslanetur, "Wind Boulder"
last1: (0, 5, 0, 0) [--, xoooo, -, -]
last2: (2, 0, 0, 0) [xo, -----, -, -]
Minkot Ensebtobul, "Basis Canyon"
last1: (2, 0, 1, 0) [xo, -----, o, -]
last2: (2, 0, 0, 0) [xo, -----, -, -]
Sigun Limâreshtân, "Wealthy Smiths"
last1: (2, 0, 1, 0) [oo, -----, x, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
Uzol Kaboddom, "Name Cloistered"
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Thîkut Odsazir, "Limb Bridge"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 0, 0) [xo, xoooo, -, -]
Olin Zonnunok, "Helm Numbers"
last1: (2, 0, 1, 0) [xo, -----, o, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
Såkzul Nosingnish, "Brush Trades"
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
Solon Alåthilral, "Bolted Treaty"
last1: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 0, 0, 0) [xo, -----, -, -]
Zulban Tanfikod, "Ticked Glazed"
last1: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Etur Ostarkeskal, "Burial Shoot"
last1: (2, 5, 0, 0) [xo, ooooo, -, -]
last2: (0, 5, 0, 0) [--, xoooo, -, -]
Cog Äszes, "Cave Brands"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 1, 0) [ox, oxooo, o, -]
Inod Nulralsazir, "Stable Bridged"
last1: (2, 5, 1, 0) [oo, ooooo, x, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Ushat Lirukoslan, "Violent Wind"
last1: (2, 0, 1, 0) [oo, -----, x, -]
last2: (0, 5, 0, 0) [--, xoooo, -, -]
Mestthos ïngizèrnam, "Ceiling Modest"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 0, 1, 0) [oo, -----, x, -]
Urvad Oltarkegeth, "Gilt Holds"
last1: (0, 5, 1, 0) [--, ooxxo, o, -]
last2: (2, 5, 1, 0) [ox, oxooo, o, -]
Udib Likotabsam, "Ink Searched"
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Zutthan Bardumolin, "Fight Tongs"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 0, 0, 0) [xx, -----, -, -]
Bëmbul Stâkudònul, "Machine Mirrored"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Sibrek Zoncuggán, "Helmed Sand"
last1: (2, 0, 1, 0) [oo, -----, x, -]
last2: (2, 0, 0, 0) [xo, -----, -, -]
Catten Mesiredëm, "Shower Keys"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
ïteb Ukerled, "Wave Racks"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
Dôbar Anrizolin, "Sky Tongs"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 0, 0, 0) [xx, -----, -, -]
Deduk Besmarzokun, "Pulley Sieges"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
Dastot Uristnakuth, "Dagger Braid"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 1, 0) [xo, xoooo, o, -]
Kadôl Cattensodel, "Channel Shields"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
Itlud Sughonu, "Tire Blunts" - Human
last1: (2, 5, 1, 0) [oo, xoooo, o, -]
last2: (0, 5, 1, 0) [--, oxooo, o, -]
Catten Sodelûthir, "Shield Sear"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (0, 5, 1, 0) [--, xoooo, o, -]
Lòr Reglilum, "Gloved Hoisted"
last1: (2, 0, 1, 0) [oo, -----, x, -]
last2: (0, 5, 0, 0) [--, ooxxo, -, -]
Asmel Zedotfikod, "Lobster Glazed"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Lòr Tomusònul, "Shoved Mirrors"
last1: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
Monom Sodelsacat, "Shield Dots"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
Tekkud Sazirotam, "Bridge Noses"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
Fikod Tunomkadol, "Mortal Hatchets"
last1: (2, 0, 1, 0) [xo, -----, x, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
èrith Onolast, "Mountain Sabres"
last1: (2, 0, 1, 0) [xo, -----, o, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
Oddom Likotiseth, "Ink Quested"
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
Asën Dakostemal, "Floor Sense"
last1: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 5, 1, 0) [xo, xoooo, o, -]
Iden Oddomvúsh, "Cloister Heated"
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last2: (2, 5, 1, 0) [oo, ooxxo, o, -]
This looks an awful lot like a game of Mastermind, but there might not even be an answer this time. language_words indicates that all words have designated spots where certain forms are used ([REAR_COMPOUND_NOUN_SING] probably means that IF this word is chosen for the 3rd word, use the singular noun form), but this isn't easily digestible and it'll take a lot of time for not much payoff.
SO. I split the names up into front and rear compound groups and got these two lovelies. I've separated them based on which word forms are available and sorted them based on unique configurations.
FRONT COMPONENT
last1: (2, 0, 0, 0) [xo, -----, -, -] noun_sing
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (2, 0, 0, 0) [xo, -----, -, -]
last1: (0, 5, 0, 0) [--, xoooo, -, -] root_verb
last1: (0, 0, 1, 0) [--, -----, x, -] adj
last1: (2, 5, 0, 0) [xo, xoooo, -, -] noun_sing / root_verb
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, xoooo, -, -]
last1: (2, 5, 0, 0) [xo, ooooo, -, -] noun_sing
last1: (2, 5, 0, 0) [oo, ooxxo, -, -] past_verb / past_participle_verb
last1: (2, 5, 0, 0) [oo, ooxxo, -, -]
last1: (2, 5, 0, 0) [oo, ooxxo, -, -]
last1: (2, 0, 1, 0) [xo, -----, o, -] sing_noun
last1: (2, 0, 1, 0) [xo, -----, o, -]
last1: (2, 0, 1, 0) [xo, -----, o, -]
last1: (2, 0, 1, 0) [xo, -----, x, -] sing_noun / adj
last1: (2, 0, 1, 0) [oo, -----, x, -] adj
last1: (2, 0, 1, 0) [oo, -----, x, -]
last1: (2, 0, 1, 0) [oo, -----, x, -]
last1: (2, 0, 1, 0) [oo, -----, x, -]
last1: (0, 5, 1, 0) [--, ooxxo, o, -] past_verb / past_participle_verb
last1: (2, 5, 1, 0) [oo, ooooo, x, -] adj
last1: (2, 5, 1, 0) [oo, xoooo, o, -] root_verb
last1: (2, 5, 1, 0) [xo, xoooo, o, -] noun_sing / root_verb
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
last1: (2, 5, 1, 0) [xo, xoooo, o, -]
REAR COMPONENT
last2: (2, 0, 0, 0) [xo, -----, -, -] soun_sing
last2: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 0, 0, 0) [xo, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -] noun_plur
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [ox, -----, -, -]
last2: (2, 0, 0, 0) [xx, -----, -, -] soun_sing / noun_plur
last2: (2, 0, 0, 0) [xx, -----, -, -]
last2: (0, 5, 0, 0) [--, xoooo, -, -] root_verb
last2: (0, 5, 0, 0) [--, xoooo, -, -]
last2: (0, 5, 0, 0) [--, ooxxo, -, -] past_verb / past_participle_verb
last2: (2, 5, 0, 0) [xo, xoooo, -, -] noun_sing / root_verb
last2: (2, 5, 0, 0) [oo, ooxxo, -, -] past_verb / past_participle_verb
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [oo, ooxxo, -, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -] noun_plur / 3person_sing_verb
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
last2: (2, 5, 0, 0) [ox, oxooo, -, -]
last2: (2, 0, 1, 0) [oo, -----, x, -] adj
last2: (0, 5, 1, 0) [--, ooxxo, o, -] past_verb / past_participle_verb
last2: (0, 5, 1, 0) [--, oxooo, o, -] 3person_sing_verb
last2: (0, 5, 1, 0) [--, xoooo, o, -] root_verb
last2: (2, 5, 1, 0) [oo, ooxxo, o, -] past_verb / past_participle_verb
last2: (2, 5, 1, 0) [oo, ooxxo, o, -]
last2: (2, 5, 1, 0) [ox, oxooo, o, -] noun_plur / 3person_sing_verb
last2: (2, 5, 1, 0) [ox, oxooo, o, -]
last2: (2, 5, 1, 0) [xo, xoooo, o, -] noun_sing / root_verb
last2: (2, 5, 1, 0) [xo, xoooo, o, -]
I'm not certain that I see any patterns yet, but I might be able to pull a few good approximations out of this.