├── .gitignore ├── LICENSE.txt ├── README.rst ├── data ├── books.cfg ├── creatures.cfg ├── inns.cfg ├── potions.cfg └── towns.cfg ├── doc ├── README.rst ├── examples.rst ├── make_doc.lua └── write_examples.lua ├── git-pull.bat ├── namegen.index ├── namegen.lua ├── rangedtable.lua └── test ├── test.lua ├── test2.lua └── test_race.lua /.gitignore: -------------------------------------------------------------------------------- 1 | *.sublime-workspace 2 | *.sublime-project 3 | *.log 4 | git-commit.bat 5 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT LICENSE 2 | 3 | Copyright (c) 2017 Lucas Siqueira 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | |MIT| 2 | 3 | .. |MIT| image:: https://img.shields.io/badge/License-MIT-green.svg 4 | 5 | 6 | LuaNameGen - Lua Name Generator v1.1.0 7 | ======================================= 8 | 9 | LuaNameGen is a tool to quickly generate random names for characters, objects and places. It is useful for both table-top games (run the script, grab the name) or to be used as a library for game development. 10 | 11 | Never again face an Ancient Red Dragon named Bob! 12 | 13 | 14 | Table of contents 15 | ================== 16 | 17 | * `Inspiration`_ 18 | 19 | - `Code`_ 20 | 21 | - `Names and syllables`_ 22 | 23 | * `Usage`_ 24 | 25 | - `Basic usage`_ 26 | 27 | - `Like-a-boss usage`_ 28 | 29 | * `How does it works?`_ 30 | 31 | - `Basics`_ 32 | 33 | - `Syllable Groups`_ 34 | 35 | - `Rules`_ 36 | 37 | * `How to help`_ 38 | 39 | * `Release notes`_ 40 | 41 | * `Example of generated names`_ 42 | 43 | - `Books`_ 44 | 45 | - `Creatures`_ 46 | 47 | - `Potions`_ 48 | 49 | - `Towns`_ 50 | 51 | 52 | Inspiration 53 | ============ 54 | 55 | 56 | Code 57 | ----- 58 | 59 | This script is shamelessly inspired by the great `libtcod's namegen`_, written by Dominik "Mingos" Marczuk. It even uses its syntax for .cfg files, aiming to provide compatibility with its existing sets. 60 | 61 | .. _`libtcod's namegen`: https://bitbucket.org/libtcod/libtcod/src/afba13253a79f16d10f596e2c9c99cf183f94b3c/src/namegen_c.c 62 | 63 | 64 | Names and syllables 65 | -------------------- 66 | 67 | Part of the patterns used in this this script were adapted from: 68 | 69 | * `libtcod's namegen sets`, written by Mingos and Jice; 70 | 71 | Inspiration came from sources such as: 72 | 73 | * J.R.R. Tolkien's works; 74 | * Gary Gygax's works; 75 | * Many other fantasy novels; 76 | * `d20pfsrd.com`_, the huge, free and beautiful PF SRD :) 77 | * `fantasynamegenerators.com`_; 78 | * `fantasynamegen.com`_; 79 | * `creative-role-playing.com`_ fantasy-sounding-names; 80 | * other generators that I shall remember someday. 81 | 82 | .. _`d20pfsrd.com`: http://www.d20pfsrd.com/ 83 | .. _`fantasynamegenerators.com`: https://fantasynamegenerators.com/ 84 | .. _`fantasynamegen.com`: https://www.fantasynamegen.com/ 85 | .. _`creative-role-playing.com`: http://web.archive.org/web/20141009095317/https://www.creative-role-playing.com/fantasy-sounding-names/ 86 | 87 | 88 | Usage 89 | ====== 90 | 91 | 92 | Basic usage 93 | ------------ 94 | 95 | To get a dwarf name and surname, using default sets, just do: 96 | 97 | .. code-block:: lua 98 | 99 | local namegen = require("namegen") 100 | 101 | local name = namegen.generate("dwarf male") -- Dolin 102 | local surname = namegen.generate("dwarf surname") -- Steelcutter 103 | 104 | 105 | Like-a-boss usage 106 | ------------------ 107 | 108 | To get whatever you want, call for a name set with the rule you want: 109 | 110 | .. code-block:: lua 111 | 112 | local namegen = require("namegen") 113 | 114 | local syllable_a = namegen.generate_custom( 115 | "orc female 2", "$A$10B") -- Bragluk 116 | local syllable_b = namegen.generate_custom( 117 | "giant female", "$B$10B") -- tuhli 118 | local syllable_c = namegen.generate_custom( 119 | "infernal 1", "-$B$B") -- -mozraz 120 | print("It's alive!!!", syllable_a .. syllable_b .. syllable_c) 121 | -- It's alive!!! Bragluktuhli-mozraz 122 | 123 | 124 | How does it works? 125 | =================== 126 | 127 | 128 | Basics 129 | ------- 130 | 131 | When loaded/required, the module "namegen" parses the set files pointed by 'namegen.index' (a plain text file). 132 | 133 | Each line of 'namegen.index' indicates the location of a set file to be readed. By default it only contains one: `namegen.cfg`. 134 | 135 | Each set file (also plain text files) follows a simple syntax (libtcod's syntax, so any .cfg file from it can be used), and may contains multiple sets. This is an example of a basic set: 136 | 137 | .. code-block:: none 138 | 139 | name "dwarf male" { 140 | syllablesStart = "Do, Due" 141 | syllablesEnd = "lin, rin" 142 | rules = "$s$e" 143 | } 144 | 145 | This set with its only rule would generate names such as: 146 | 147 | * Dolin; 148 | 149 | * Dorin; 150 | 151 | * Duelin; 152 | 153 | * Duerin; 154 | 155 | 156 | Syllable Groups 157 | ---------------- 158 | 159 | Every syllable group has a matching symbol (used rules, `s` and `e` in the previous example) that matches it, and will, after parsed, be stored under a specific key on the parser data table: 160 | 161 | .. code-block:: none 162 | 163 | symbol group name parser field 164 | ------ ---------- ------------ 165 | s syllablesStart parser_data["start"] 166 | m syllablesMiddle parser_data["middle"] 167 | e syllablesEnd parser_data["end"] 168 | P syllablesPre parser_data["pre"] 169 | p syllablesPost parser_data["post"] 170 | v phonemesVocals parser_data["vocals"] 171 | c phonemesConsonants parser_data["consonants"] 172 | A customGroupA parser_data["cga"] 173 | B customGroupB parser_data["cgb"] 174 | ... (custom groups exist from `A` to `O`) 175 | N customGroupN parser_data["cgn"] 176 | O customGroupO parser_data["cgo"] 177 | ? phonemesVocals/ parser_data["vocals"]/ 178 | phonemesConsonants parser_data["consonants"] 179 | 180 | 181 | Rules 182 | ------ 183 | 184 | Considering the basic example above, if you replace its rule for "$e$s", that would swap syllables in the generated names. 185 | 186 | It is possible to set a chance of adding a syllable. The rule "$s$e$50e" would have fifty percent chance of adding a third syllable from `syllablesEnd` group (or the matching group of the letter you pass). 187 | 188 | If you want to have multiple rules for a same set, simply separate them with a comma: 189 | 190 | .. code-block:: none 191 | 192 | rules = "$e$s, $s$e" 193 | 194 | Each rule would have an equal chance to be used at each generation. If desired, you can give specific chances for each rule (by default they all have the same chance of being used): 195 | 196 | .. code-block:: none 197 | 198 | rules = "%50$e$s, $s$e" 199 | 200 | Instead of each rule having 1/2 chance to be used, the first one would have 1/2*50% chance. 201 | 202 | 203 | How to help 204 | ============ 205 | 206 | Help is always appreciated. Those are the main forms to get involved: 207 | 208 | * Test and improve content: 209 | 210 | - test existing name sets; 211 | 212 | - improve them: 213 | 214 | + create a new rule; 215 | 216 | + modify a new rule; 217 | 218 | + change/remove syllables or syllable groups; 219 | 220 | + add some illegal results to avoid weird combinations; 221 | 222 | - create a new set. 223 | 224 | * Make changes to the Lua code, improving performance, fixing bugs, etc; 225 | 226 | * `Improve the documentation`. 227 | 228 | On all cases, the optimal way to proceed is by following github's workflow_: fork this repo, change it and then submit a pull request. 229 | 230 | You can also report an issue_ (and add a fix for it on the comments). 231 | 232 | .. _workflow: https://help.github.com/articles/fork-a-repo/ 233 | .. _issue: https://github.com/LukeMS/lua-namegen/issues 234 | .. _`Improve the documentation`: https://github.com/LukeMS/lua-namegen/edit/master/README.rst 235 | 236 | 237 | Release notes 238 | ============ 239 | 240 | 1.2.0 241 | ------ 242 | * Added name set for inns (thanks to `Hikitsune-Red, for his pull request`_): 243 | 244 | - `inns.cfg`; 245 | 246 | - updated the docs to include the new set examples. 247 | 248 | .. _`Hikitsune-Red, for his pull request`: https://github.com/LukeMS/lua-namegen/pull/1 249 | 250 | 1.1.0 251 | ------ 252 | * Added books, potions and towns name sets: 253 | 254 | - `towns.cfg` is a copy of Mingos and Jice town name sets for libtcod's namegen; 255 | 256 | - `books.cfg` and `potions.cfg` were based on common roguelike names for unidentified items. 257 | 258 | 1.0.1 259 | ------ 260 | 261 | * Fixed a critical error that prevented the data files (.cfg, .index) from being loaded at all while calling the library from outside of its own directory. 262 | 263 | * Made a doc generator to provide sphynx-like basic `literalinclude` (github don't support it) 264 | 265 | 266 | Example of generated names 267 | =========================== 268 | 269 | - `Books`_ 270 | 271 | - `Creatures`_ 272 | 273 | - `Potions`_ 274 | 275 | - `Towns`_ 276 | 277 | - `Inns`_ 278 | 279 | 280 | Below are examples of generated names for each of the sets packed with LuaNameGen: 281 | 282 | 283 | 284 | Books 285 | -------- 286 | 287 | "books" 288 | ******** 289 | 290 | .. code-block:: lua 291 | 292 | "black", "blue", "brown", "charred brown", "compact gray", "compact orange", "compact slender black", "compact tattered orange", "compact worn orange", "gilted brown", "gilted green", "green", "heavy decorated white", "heavy tattered orange", "huge brown", "iron-bound yellow", "large embroidered black", "leather green", "mangled gray", "orange", "purple", "red", "small blue", "thick dusty white", "thick yellow", "tiny red", "tiny yellow", "used green", "used white", "white" 293 | 294 | 295 | Creatures 296 | ------------ 297 | 298 | "aasimar female" 299 | ***************** 300 | 301 | .. code-block:: lua 302 | 303 | "Adrasteleth", "Ansameth", "Ar-valnor", "Aret", "Arken", "Daen", "Daeth", "Drinma", "Imesinoe", "Jal-atar", "Jaljena", "Jasarmeth", "Kalareth", "Kaljena", "Masah", "Nier", "Niereth", "Nieth", "Niramour", "Nivina", "Onalla", "Palken", "Ral-talar", "Sardareleth", "Tarma", "Valdorel", "Valdoreleth", "Valnares", "Valsah", "Varaleth" 304 | 305 | 306 | "aasimar male" 307 | *************** 308 | 309 | .. code-block:: lua 310 | 311 | "Adanal", "Amaranth", "Ar-valon", "Aradal", "Belal", "Cernan", "Cerran", "Ilat", "Jalrant", "Kaladathar", "Kalwier", "Klaronas", "Mauar", "Maunan", "Oathas", "Paath", "Paldril", "Ral-raman", "Ravanathal", "Sar-palad", "Sardanat", "Talanath", "Talonath", "Tarnan", "Tuath", "Tural", "Tutin", "Valnarathas", "Valnorathal", "Vardaral" 312 | 313 | 314 | "catfolk female" 315 | ***************** 316 | 317 | .. code-block:: lua 318 | 319 | "Dumihr", "Dusash", "Duslif", "Holina", "Homiah", "Hoslif", "Jilirri", "Jisharr", "Jishim", "Jiyi", "Lithlahi", "Lithyera", "Maulyana", "Meerline", "Miaumihr", "Mihrsharr", "Milaha", "Misfee", "Saflahe", "Safyeri", "Sashlyara", "Sfeelyani", "Sheerlirre", "Sheerlithi", "Sheeyi", "Siphemau", "Sipheyeri", "Siythlirri", "Tilini", "Tiyera" 320 | 321 | 322 | "catfolk male" 323 | *************** 324 | 325 | .. code-block:: lua 326 | 327 | "Dreran", "Dreruth", "Dreshah", "Ferswish", "Gerlyau", "Germiau", "Gerslif", "Lirrmau", "Lirrwan", "Maumew", "Maumiu", "Miauserr", "Mirrlirr", "Nykmiu", "Nykshee", "Nykus", "Safgar", "Sashgar", "Sfeesiyth", "Shahsash", "Sharrmeer", "Sharrserr", "Sheermau", "Slifshim", "Syausash", "Syaushim", "Zithmihr", "Zithpurrh", "Zithshau", "Zithtan" 328 | 329 | 330 | "dragon female" 331 | **************** 332 | 333 | .. code-block:: lua 334 | 335 | "Adastralagonis", "Adastramanthysa", "Adrazzemalis", "Andracalchaxis", "Archozuthraxis", "Atrazzebraxis", "Brimacalchaxis", "Cadranadralix", "Chrysonaluxis", "Chrysovoraxis", "Glaucalchaxis", "Heliophylaxis", "Huromanthysa", "Hurovoraxis", "Jalanmordaxis", "Jalanvoraxis", "Kralkavoraxis", "Majurizzemalis", "Ouromalaxis", "Phrixumandrossa", "Pyranaluxis", "Rhadaneriaxis", "Sarcuzzebraxis", "Sardacalchaxis", "Sidereomordaxis", "Sidereovorunga", "Tchalcedomandrossa", "Tchazarlagonis", "Tchazarmordaxis", "Vramalaxis" 336 | 337 | 338 | "dragon male" 339 | ************** 340 | 341 | .. code-block:: lua 342 | 343 | "Abrabazius", "Ancazzemal", "Atramalax", "Beruvorax", "Bhakricalchax", "Bramalax", "Brimacalchax", "Cadracordax", "Chroxenor", "Chrysolagon", "Heliobradax", "Jazrabradax", "Jurganalux", "Lazulozuthrax", "Majuribazius", "Malachobazius", "Phrixuvorung", "Porphyrocalchax", "Porphyromandros", "Pyraneriax", "Pyraphylax", "Rhadalagon", "Sarcucordax", "Sarcuneriax", "Sarcuvorax", "Sardanadral", "Sidereophylax", "Sulchruphylax", "Tchalcedolagon", "Trochocordax" 344 | 345 | 346 | "drow female" 347 | ************** 348 | 349 | .. code-block:: lua 350 | 351 | "Balsekth", "Burvilistra", "Colthalistra", "Dulmyrdeil", "Dulmyrvra", "Dulrhaira", "Dulthalis", "Dulysvia", "Durnildril", "Enothvra", "Erilra", "Ermyran", "Gonlya", "Ilorgvril", "Jegteltra", "Jendorniss", "Jysonlavil", "Kilna", "Lilnevia", "Lilvekira", "Maboria", "Mazmyrth", "Molpelith", "Molsabra", "Molthaltra", "Nothpeliln", "Ulsunbra", "Voira", "Voothiln", "Vosullevlin" 352 | 353 | 354 | "drow male" 355 | ************ 356 | 357 | .. code-block:: lua 358 | 359 | "Arred", "Chorlim", "Divsoluld", "Doryolild", "Dromryild", "Dulsinnid", "Durtorvid", "Eilorgald", "Ernourn", "Ernoxird", "Fipelul", "Immyrurn", "Imyelul", "Inssabvir", "Istnelvim", "Jernelvid", "Jervrileld", "Kaornid", "Lilald", "Lilrelurn", "Lulcaid", "Mazreluld", "Mirorgvim", "Nortulird", "Noruld", "Nothvekid", "Nothyolralim", "Olvilnil", "Syryeld", "Zvriler" 360 | 361 | 362 | "dwarf female" 363 | *************** 364 | 365 | .. code-block:: lua 366 | 367 | "Anvara", "Arra", "Bylthiel", "Danden", "Deba", "Dona", "Fretala", "Futha", "Gadi", "Garyn", "Gimca", "Hema", "Hirinka", "Hralna", "Kathsyl", "Kilta", "Kituna", "Lasryn", "Ligret", "Maba", "Miali", "Olina", "Relov", "Reniess", "Rilinda", "Ritu", "Sita", "Thogra", "Thondy", "Yenev" 368 | 369 | 370 | "dwarf female 2" 371 | ***************** 372 | 373 | .. code-block:: lua 374 | 375 | "Ballind", "Broddis", "Brunis", "Daga", "Darith", "Dorhild", "Dormnis", "Dralrun", "Drimdis", "Fromrith", "Gonddis", "Gondvis", "Gordbis", "Gordhild", "Gradlis", "Grimda", "Grimis", "Gurdis", "Horddis", "Hornga", "Hrais", "Norddis", "Skanddis", "Sundna", "Thranis", "Throda", "Throlda", "Thrordis", "Thrulis", "Thundis" 376 | 377 | 378 | "dwarf male" 379 | ************* 380 | 381 | .. code-block:: lua 382 | 383 | "Bifur", "Biril", "Bonthur", "Danbur", "Darethog", "Darrimm", "Dein", "Duerran", "Duerthur", "Duerulf", "Duervim", "Faril", "Fibroir", "Galvri", "Gimin", "Gwarri", "Hargurn", "Kiur", "Lothur", "Ori", "Renden", "Tadur", "Taur", "Telrimm", "Thoden", "Thoni", "Torun", "Ummun", "Vonin", "Vonrimm" 384 | 385 | 386 | "dwarf male 2" 387 | *************** 388 | 389 | .. code-block:: lua 390 | 391 | "Bordnir", "Bornbor", "Bornlin", "Brimin", "Brimnir", "Brokkri", "Bromor", "Burlli", "Dolgvor", "Dorin", "Dormvor", "Dralin", "Fromli", "Gimrur", "Gondir", "Gordrok", "Gordvi", "Gradror", "Guldvir", "Gundnir", "Hornror", "Norbor", "Nordrok", "Norrin", "Skandnir", "Skondvor", "Strombor", "Sundror", "Thornror", "Throlin" 392 | 393 | 394 | "dwarf surname" 395 | **************** 396 | 397 | .. code-block:: lua 398 | 399 | "Bearcleaver", "Bearstriker", "Bloodspear", "Dragonripper", "Ettinsmasher", "Fairaxe", "Foe-Grappler", "Foeboxer", "Gemminer", "Gnome-Grappler", "Goblinbasher", "Goldfoot", "Goldsmith", "Greychest", "Greysword", "Ironfoot", "Kobold-Strangler", "Koboldslayer", "Mithrilbender", "Oakshield", "Ogre-Strangler", "Silvershield", "Spiderslasher", "Steelsmith", "Stonecutter", "Strongfoot", "Trollmauler", "Wyvern-Garrotter", "Wyvernbutcher", "Wyverncutter" 400 | 401 | 402 | "elf female" 403 | ************* 404 | 405 | .. code-block:: lua 406 | 407 | "Alais", "Alea", "Bellaluna", "Braerindra", "Chandrelle", "Cyithrel", "Daratrine", "Darunia", "Delshandra", "Eirika", "Elanil", "Eloimaya", "Gweyr", "Ilmadia", "Keishara", "Kethryllia", "Liluth", "Lura", "Lyndis", "Lyre", "Morgwais", "Nephenee", "Phelorna", "Pyria", "Rathiain", "Shadowmoon", "Shandalar", "Sheedra", "Tsarra", "Urmicca" 408 | 409 | 410 | "elf female 2" 411 | *************** 412 | 413 | .. code-block:: lua 414 | 415 | "Aegthelebmir", "Aerthaelerwen", "Aerthaelthalwen", "Aethraelerrian", "Anrimevwen", "Arsareliel", "Caelrelolrian", "Calireviel", "Carmarthalrien", "Celrinaliel", "Cirninaniel", "Clarinolriel", "Earmaegemroël", "Elbrinelsil", "Elthlitheswë", "Erimaswen", "Erlrilirel", "Ermaranwë", "Estloreleth", "Farmithalriel", "Farnithenmir", "Feanthalthonrian", "Findranthonmir", "Findsaresmir", "Galrinthonian", "Gannitherrian", "Gilralthonwë", "Ithmindadloth", "Laeglitharrial", "Laegsaeriledel" 416 | 417 | 418 | "elf male" 419 | *********** 420 | 421 | .. code-block:: lua 422 | 423 | "Aimon", "Alabyran", "Almon", "Aywin", "Bellas", "Connak", "Dakath", "Ettrian", "Hagwin", "Iliphar", "Ilrune", "Jorildyn", "Keletheryl", "Kendel", "Khatar", "Khidell", "Lhoris", "Malon", "Melandrach", "Myriil", "Pleufan", "Samblar", "Shaundyl", "Taegen", "Theodred", "Triandal", "Vaalyun", "Vander", "Vulmon", "Xhalth" 424 | 425 | 426 | "elf male 2" 427 | ************* 428 | 429 | .. code-block:: lua 430 | 431 | "Aegsilerrod", "Aethlorallin", "Aethraelamnar", "Aethseldelnar", "Belmitholdil", "Caelsaeremrior", "Caelsaerthaldan", "Caerlithirrod", "Caerrindesros", "Calimilorn", "Calrinerdir", "Cellaredorn", "Celmithanros", "Earthaeramion", "Elbnithinrond", "Elrilirion", "Elsarerdil", "Eolmelandel", "Erimirfal", "Eristindel", "Faersilinorn", "Findninevion", "Findnithamdel", "Findthaleslad", "Galinolrior", "Gelseldenion", "Ithmelalthir", "Ithserevlad", "Laegranaslin", "Lendtherirdan" 432 | 433 | 434 | "fetchling female" 435 | ******************* 436 | 437 | .. code-block:: lua 438 | 439 | "Drevoha", "Ecotel", "Eheter", "Hulohir", "Ikadolo", "Ikecutam", "Ikuculin", "Ilerac", "Jejuti", "Jolurac", "Mukurat", "Oronora", "Qitomeh", "Qraholim", "Ravoh", "Rede", "Rode", "Siten", "Suseh", "Trigal", "Ucenoma", "Ucilolah", "Ucosoha", "Usohomal", "Utecucil", "Utigi", "Yerum", "Yuci", "Zavotec", "Zovi" 440 | 441 | 442 | "fetchling male" 443 | ***************** 444 | 445 | .. code-block:: lua 446 | 447 | "Bridu", "Brusol", "Drasot", "Ecotim", "Ehozon", "Graju", "Ikadu", "Iliki", "Jajoh", "Jizu", "Joko", "Natol", "Oravur", "Oreho", "Oruju", "Qrera", "Trame", "Treci", "Treja", "Trovi", "Truso", "Ucoku", "Ugemu", "Uguket", "Utezu", "Uvuho", "Yejoh", "Yiko", "Zese", "Zesuc" 448 | 449 | 450 | "giant female" 451 | *************** 452 | 453 | .. code-block:: lua 454 | 455 | "Baod-Daoh", "Baod-Doh", "Bulimih", "Daoh-Ig", "Doh-Mugh", "FahEghinuh", "Ghadrei", "Ghadtih", "Ghat-Daoh", "Gireekheedoh", "Hahsuthrei", "Haoghfah", "Khanfah", "LahFeehmburi", "MihGiree", "MihOb", "MihOugh", "MihWuh", "Ouh-Doh", "Rei-Tebrahoo", "Rei-Thom", "ReiChah", "ReiMehsuth", "Rifoonarootih", "Shul-Mih", "Soh-Nham", "Tih-Shehi", "Tuhlighadsoh", "Tuhlimughsoh", "Ushrahoodaoh" 456 | 457 | 458 | "giant male" 459 | ************* 460 | 461 | .. code-block:: lua 462 | 463 | "Bohr", "Bul-Yeeh", "Ehm-Shom", "Ghatrifoo", "Ghee", "Ghish", "Goush-Faogh", "Gunri", "Hoo", "Hoo-Heh", "Hooshehi", "Khankham", "Khaz", "Lugh", "Moghquagi", "Mouh", "Nham", "Peh-Yaum", "Pogh", "Puh", "Rhoo-Shom", "Shlo", "Suhi-Meh", "Thom", "Tuhli", "Ub-Ahg", "Ubghat", "Wah", "Yaum-Loghkhaz", "Zhamchah" 464 | 465 | 466 | "gnome female" 467 | *************** 468 | 469 | .. code-block:: lua 470 | 471 | "Bilbeefonk", "Billeklinkle", "Bimrgo", "Bipflonk", "Bipsizz", "Cargus", "Dinkulo", "Ditink", "Dosizz", "Filble", "Filgus", "Gynndomink", "Juladink", "Katdomink", "Ketris", "Klofizzy", "Liskink", "Lokeefizzy", "Lymtink", "Lyssfizzy", "Lysskyago", "Merdiwack", "Mitthinkle", "Nittlebik", "Talkink", "Tallinkey", "Tannus", "Thinbythin", "Tilkitinkle", "Tindinkey" 472 | 473 | 474 | "gnome male" 475 | ************* 476 | 477 | .. code-block:: lua 478 | 479 | "Babimac", "Balibik", "Bawack", "Bimleeble", "Bimliarn", "Binkflonk", "Binwick", "Bolink", "Bonkbus", "Bonleble", "Burtink", "Dinkbitank", "Dobeeble", "Dodibrick", "Donkleedink", "Fenklink", "Fenlflonk", "Filbik", "Filgo", "Finflonk", "Finkvash", "Gelklink", "Gelsizz", "Hinbmink", "Hinklosizz", "Laflink", "Nitkeeklonk", "Tenlink", "Tockawick", "Tovash" 480 | 481 | 482 | "gnome surname" 483 | **************** 484 | 485 | .. code-block:: lua 486 | 487 | "Acerpipe", "Blackbus", "Castfuse", "Castspinner", "Castspring", "Clickgear", "Clicksteel", "Draxlespindle", "Gearwhistle", "Gearwizzle", "Overgear", "Porterfuzz", "Puddlepipe", "Sadbonk", "Shinenozzle", "Shinepipe", "Shinespinner", "Shortpipe", "Spannerblast", "Sparkfizzle", "Sparkspanner", "Sparksprocket", "Stormgrinder", "Stormtorque", "Stormwizzle", "Thistleblast", "Thistlebus", "Thistlegrinder", "Thistlenozzle", "Thistlepipe" 488 | 489 | 490 | "goblin female" 491 | **************** 492 | 493 | .. code-block:: lua 494 | 495 | "Akghy", "Arkghakah", "Bilgyipee", "Blidgah", "Bugghy", "Chutogghy", "Dokhay", "Drikrakgah", "Drubkrige", "Fluge", "Glaggaday", "Glagya", "Gnaty", "Graty", "Kakghy", "Kavee", "Lukay", "Mizya", "Mubay", "Mubzatee", "Naggah", "Nikkghy", "Nogge", "Nure", "Ragya", "Slogya", "Sniky", "Sogay", "Zity", "Zobghy" 496 | 497 | 498 | "goblin male" 499 | ************** 500 | 501 | .. code-block:: lua 502 | 503 | "Blidgah", "Blotbolg", "Bolgadz", "Bolgsnitnikk", "Bot", "Chunag", "Drizark", "Gazbilg", "Ghaklikk", "Ghorirk", "Glagrag", "Glakkak", "Glakus", "Glatkak", "Gloksog", "Kriggag", "Nazflug", "Niggat", "Rotadz", "Rotgak", "Shukrok", "Slogark", "Snignukk", "Snitshuk", "Togbilg", "Yaggbolg", "Zatgnat", "Zatspik", "Zizblig", "Zobsna" 504 | 505 | 506 | "half-demon female" 507 | ******************** 508 | 509 | .. code-block:: lua 510 | 511 | "Aagnalu", "Alurnalu", "Arakskiu", "Draanzihyl", "Idruxhiu", "Jhaaldiu", "Jidija", "Jiulihyl", "Jiuzihyl", "Kaazsula", "Mulkjiul", "Mulklin", "Nidija", "Nulxhiu", "Rukdiu", "Saaggiu", "Saagzihyl", "Urzlihyl", "Urzzihyl", "Urzziu", "Uznidizil", "Virndiu", "Virngiu", "Virnrhyl", "Virnzihyl", "Virnziu", "Vlaajanil", "Vlagdiu", "Vrazgiu", "Vulkgiu" 512 | 513 | 514 | "half-demon male" 515 | ****************** 516 | 517 | .. code-block:: lua 518 | 519 | "Azikruzuk", "Azuvik", "Brallank", "Bruhlurug", "Draanlurr", "Draanlurug", "Drulgsul", "Jhaalundak", "Jurglurr", "Jurzbru", "Karglurr", "Krauruzuk", "Krivnal", "Luridrul", "Lurilurr", "Nauxulg", "Ninjdrul", "Ranaguvik", "Urzarag", "Utilurr", "Utinal", "Utixulg", "Uznidsul", "Uznidundak", "Virnundak", "Vluklun", "Vrazbru", "Xidsuruk", "Zauvinu", "Zauvlank" 520 | 521 | 522 | "halfling female" 523 | ****************** 524 | 525 | .. code-block:: lua 526 | 527 | "Allison", "Amanda", "Amber", "Berenga", "Bertha", "Caitlin", "Chrodechildis", "Darby", "Emma", "Engelberga", "Fatima", "Kaitlyn", "Luitgarde", "Madison", "Marcatrude", "Marigold", "Mary", "Moschia", "Myrna", "Myrtle", "Natalie", "Prima", "Rotrud", "Rotrudis", "Saffron", "Scarlet", "Selina", "Shelby", "Tasha", "Theutberga" 528 | 529 | 530 | "halfling female 2" 531 | ******************** 532 | 533 | .. code-block:: lua 534 | 535 | "Adice", "Adily", "Adra", "Adria", "Alba", "Amba", "Banda", "Brama", "Bramia", "Bramwisa", "Durla", "Durlily", "Erna", "Fulbia", "Halda", "Hama", "Hoda", "Hodina", "Ivia", "Markily", "Munga", "Oda", "Otha", "Sabina", "Samia", "Sega", "Tobice", "Wiga", "Wydia", "Wydina" 536 | 537 | 538 | "halfling male" 539 | **************** 540 | 541 | .. code-block:: lua 542 | 543 | "Aega", "Arnoul", "Balbo", "Bero", "Bertin", "Bilbo", "Blanco", "Drogon", "Erard", "Faro", "Fastred", "Fredegar", "Giseler", "Guntram", "Heribert", "Hildibrand", "Madoc", "Majorian", "Marachar", "Mauger", "Melampus", "Merimac", "Rathar", "Sadoc", "Taurin", "Thankmar", "Togo", "Unroch", "Waltgaud", "Willibrord" 544 | 545 | 546 | "halfling male 2" 547 | ****************** 548 | 549 | .. code-block:: lua 550 | 551 | "Ado", "Ailard", "Ailwise", "Albo", "Albwise", "Bardfast", "Bardo", "Bildert", "Blancald", "Blanco", "Boffald", "Drogert", "Drogo", "Durlo", "Emmald", "Erdard", "Erdo", "Falco", "Ferdard", "Ferdold", "Gamo", "Hamo", "Hamold", "Hugert", "Ivwise", "Markfast", "Marko", "Otho", "Serlard", "Wigold" 552 | 553 | 554 | "halfling surname" 555 | ******************* 556 | 557 | .. code-block:: lua 558 | 559 | "Banks", "Barrowes", "Boffin", "Bophin", "Bramblethorn", "Brandagamba", "Brown", "Brownlock", "Chubb", "Cotton", "Diggle", "Fairbairn", "Gawkroger", "Gluttonbelly", "Greenhill", "Harfoot", "Hayward", "Hlothran", "Hornwood", "Leafwalker", "Longfoot", "Noakes", "Oldbuck", "Puddifoot", "Sandheaver", "Sandyman", "Took-Brandybuck", "Underfoot", "Underlake", "Wanderfoot" 560 | 561 | 562 | "hobgoblin female" 563 | ******************* 564 | 565 | .. code-block:: lua 566 | 567 | "Afrata", "Beyekam", "Beylata", "Ceytarak", "Darate", "Dirleta", "Dirtaruk", "Esrima", "Fetdora", "Kolgha", "Kurde", "Kurhe", "Kuruke", "Malghoran", "Mevleta", "Mevletem", "Poldletan", "Poldrama", "Polduki", "Roldluka", "Saltema", "Tetma", "Totma", "Tottarim", "Turgikum", "Turglater", "Turgrata", "Turguko", "Utrata", "Zoldhora" 568 | 569 | 570 | "hobgoblin male" 571 | ***************** 572 | 573 | .. code-block:: lua 574 | 575 | "Akhi", "Akrim", "Dorlut", "Durat", "Durluk", "Fethar", "Fethi", "Haat", "Harim", "Kethluk", "Kethlut", "Kolgot", "Kurung", "Okhar", "Poldok", "Poldrim", "Roldhi", "Roldtar", "Rolduk", "Roldung", "Saltlut", "Tetrot", "Tettar", "Totat", "Totlut", "Turghar", "Uthar", "Zoldat", "Zoldrot", "Zoldut" 576 | 577 | 578 | "human female" 579 | *************** 580 | 581 | .. code-block:: lua 582 | 583 | "Aelfsig", "Aethelmaer", "Aethelraed", "Bealdthorne", "Beorhtric", "Cwenburg", "Cynein", "Eirudo", "Elida", "Gruistae", "Heathusige", "Helmsige", "Hildsige", "Islynn", "Isothra", "Ivithra", "Kerenza", "Leofmaer", "Leofor", "Lowenna", "Mayetta", "Mundkettil", "Nerama", "Osgrim", "Salenor", "Salywyn", "Voroth", "Winewaru", "Zubuwyn", "Zubylaith" 584 | 585 | 586 | "human male" 587 | ************* 588 | 589 | .. code-block:: lua 590 | 591 | "Aelfkettil", "Aenesric", "Balrach", "Bardahard", "Bregudeor", "Breguson", "Cenarm", "Censige", "Chalrochak", "Chaltorek", "Cynebeorht", "Delmkor", "Deorgar", "Deorweald", "Ervan", "Garsige", "Garweard", "Godbeorht", "Godweard", "Herebrand", "Hrofweard", "Instan", "Leodhere", "Sigeleof", "Sigeweard", "Thurheard", "Winegar", "Winewulf", "Wulfheard", "Zlen" 592 | 593 | 594 | "human surname" 595 | **************** 596 | 597 | .. code-block:: lua 598 | 599 | "'Frenzied' Lortavan", "'Haggard' Stanton", "'Hare' Seven-Shaper", "'Pratt' Clayden", "'Small' Summer", "'Stout' Spalding", "Bjoornsdottir", "Brodie", "Brown", "Bunce", "Colenso", "Curicinnius", "Doom-Foot", "Ebonhand", "Finch", "Kjaldssen", "Lencreinace", "Lilly", "Lincoln", "Locippe", "Midal", "Mojisversdottir", "Newbury", "Padley", "Plaelius", "Plenceia", "Secret-Drums", "Stanton", "Ulfransson", "Wavrustiris" 600 | 601 | 602 | "ifrit female" 603 | *************** 604 | 605 | .. code-block:: lua 606 | 607 | "Atwa", "Edu", "Erya", "Fadri", "Fetwi", "Fudru", "Fulhe", "Fullulyu", "Garlun", "Gatwa", "Gethis", "Gula", "Haen", "Hanu", "Hathethi", "Hima", "Himerhu", "Hira", "Hirya", "Hitwa", "Iriswirh", "Irranthis", "Itin", "Lary", "Ludre", "Man", "Satwarhe", "Wilwu", "Zetyi", "Zunu" 608 | 609 | 610 | "ifrit male" 611 | ************* 612 | 613 | .. code-block:: lua 614 | 615 | "Baviq", "Bukut", "Daci", "Dajad", "Dame", "Egel", "Galum", "Gare", "Giviq", "Jicut", "Kele", "Kivaj", "Maci", "Maluh", "Marut", "Mecun", "Mirut", "Takuh", "Tenim", "Tevel", "Tikin", "Tiqa", "Uvin", "Vakin", "Vila", "Vineh", "Virat", "Vugam", "Vukel", "Vure" 616 | 617 | 618 | "infernal 1" 619 | ************* 620 | 621 | .. code-block:: lua 622 | 623 | "Baphorgya", "Breilghu", "Chruarghu", "Chrulinal", "Drauurshai", "Dromuizbaph", "Garu-lunee", "Garuzabaz", "Ghauvekraa", "Ghurugarl", "Glau-vivuul", "Gle-ovbaal", "Gleiyrezu", "Gre-azrez", "Gura-jeglau", "Hzivassu", "Muzojhez", "Pazulghu", "Pazzarezu", "Razavcha", "Rez-elyaa", "Saa-zetzau", "Saavathu", "Sau-ivzu", "Shu-evidrau", "Ssuvebael", "Szuluyrez", "Tzaurabaz", "Utuovtzau", "Zuavziel" 624 | 625 | 626 | "infernal 2" 627 | ************* 628 | 629 | .. code-block:: lua 630 | 631 | "Aigelboaj", "Aigoyshub", "Algirglab", "Blog-aysag", "Bulgayjulb", "Drujvibarg", "Felgvudergh", "Ghadvusug", "Glaaglonalb", "Glaagurjub", "Hegazleegh", "Hrud-voboaj", "Hrudlekolg", "Krolgjinog", "Magviiub", "Magzudergh", "Morguyzub", "Naag-uyurb", "Nauglahaag", "Nuglushub", "Nugyiigg", "Nyogzaghad", "Shubevdrog", "Szugvinaug", "Trobuvkwarg", "Xubvithog", "Yebvaalg", "Yeeg-radregh", "Zugjunulb", "Zugvoogg" 632 | 633 | 634 | "infernal 3" 635 | ************* 636 | 637 | .. code-block:: lua 638 | 639 | "Ashevgaur", "Aztratlizit", "Bliklaszut", "Boak-ezazt", "Boakuzhrek", "Boakuzsoth", "Brax-ursark", "Dunjaoch", "Duumolblik", "Gaanozduum", "Gaurilchon", "Gorivinax", "Hraxlosark", "Hrekuyner", "Khorjurolk", "Kireyter", "Mat-yidraum", "Met-ajash", "Mothejgoth", "Namruuzt", "Nerirhoth", "Nythovruaak", "Sarklaazt", "Sarkujszut", "Sotyaboak", "Sutovralk", "Terejloch", "Thakuvthalk", "Utukurgith", "Uztrulok" 640 | 641 | 642 | "kobold female" 643 | **************** 644 | 645 | .. code-block:: lua 646 | 647 | "Ari", "Aslemko", "Asral", "Degees", "Degra", "Ekara", "Gahoo", "Gurli", "Gurzok", "Harkro", "Ia", "Igra", "Ligu", "Matroso", "Nekri", "Noske", "Pogar", "Pokrora", "Potroil", "Pozra", "Rasuskas", "Rolsus", "Sasoo", "Sizlem", "Sokehtro", "Sokzra", "Tolkru", "Tollemkoo", "Tollire", "Zasi" 648 | 649 | 650 | "kobold male" 651 | ************** 652 | 653 | .. code-block:: lua 654 | 655 | "Crurad", "Dhelal", "Dhelzor", "Dhimaholk", "Drazax", "Eaalp", "Gakni", "Getghe", "Ghenuld", "Ghexas", "Ilnri", "Ilxas", "Jaod", "Makme", "Molnesk", "Orod", "Orze", "Qeerk", "Qrelra", "Rusxas", "Ruszore", "Vadnri", "Vemerk", "Vipir", "Zalxasdoo", "Zalzin", "Zeeark", "Zeedoo", "Zoir", "Zorzad" 656 | 657 | 658 | "ogre female" 659 | ************** 660 | 661 | .. code-block:: lua 662 | 663 | "Dugshrufy", "Durshglugay", "Duzdrubgah", "Ghulghakhgah", "Gradbarshghy", "Gradyuggah", "Grobkurya", "Grokgharah", "Grukurghay", "Grulobbgah", "Gruzmakhgah", "Hurslubay", "Kulkzuggah", "Lumkulkya", "Luzfugghy", "Luzkaiy", "Molggharay", "Molghrungah", "Muddrokay", "Mudlorgghy", "Mulobbkaighy", "Murkshargy", "Muzdghakhya", "Obbghashgah", "Rolbshurya", "Shrufmuzday", "Slubdruggah", "Sludlukhgah", "Snadthurkah", "Thulkgruya" 664 | 665 | 666 | "ogre male" 667 | ************ 668 | 669 | .. code-block:: lua 670 | 671 | "Bogdug", "Burzgruz", "Drokgrumf", "Drubdushhurg", "Duzyur", "Fuglush", "Gholgom", "Gludduz", "Gludlug", "Grashdrok", "Grufulg", "Grulsnog", "Grumthrag", "Gruzmud", "Guhlkaislug", "Guhlmakh", "Kugtrug", "Kurlug", "Lorgklobgrut", "Lumklob", "Lurzghash", "Makhgruk", "Nakhkrodurgh", "Nakhnarg", "Obbhrung", "Rolbgrum", "Shargkurmug", "Sludghakhslub", "Urdghar", "Zuglush" 672 | 673 | 674 | "orc female" 675 | ************* 676 | 677 | .. code-block:: lua 678 | 679 | "Bashat", "Basht", "Bolar", "Bulfol", "Bum", "Burzob", "Burzraz", "Dulug", "Ghak", "Globh", "Gonk", "Grat", "Gul", "Lambug", "Lamut", "Mazsha", "Mogak", "Morn", "Morza", "Murbraz", "Murmalah", "Orbugol", "Rogbut", "Shagdub", "Shelur", "Ulumt", "Umog", "Uroga", "Ushat", "Volrog" 680 | 681 | 682 | "orc female 2" 683 | *************** 684 | 685 | .. code-block:: lua 686 | 687 | "Bakhskaray", "Bruzkragghy", "Dakkolgay", "Dargtrogay", "Gashhrogya", "Gashlakhy", "Ghazgrubgrudah", "Gokhhrugay", "Gokhkrudbrogy", "Grathlufya", "Grazskulgay", "Grubdargy", "Gudsnubya", "Hratoggah", "Hruggrashay", "Khagglufghy", "Kragluby", "Lubgashya", "Lukmolkgah", "Rorgslurghy", "Rotagghy", "Rudgnubay", "Rugzogya", "Shazgasholgah", "Snurrbragya", "Sodrugghy", "Thakbashgah", "Troglakhya", "Umshhakky", "Yobgutgah" 688 | 689 | 690 | "orc male" 691 | *********** 692 | 693 | .. code-block:: lua 694 | 695 | "Bashrz", "Bogakh", "Brokrkub", "Bugbumol", "Buomaugh", "Ghamrlorz", "Gluh", "Grusur", "Gunaakt", "Kurdburz", "Lurodum", "Malz", "Mashgob", "Mugarod", "Mulunok", "Muzorz", "Nagrutto", "Olug", "Olurgash", "Owkbanok", "Shobrkul", "Shumborz", "Slapdud", "Urul", "Ushnong", "Ushnurz", "Yadba", "Yargron", "Yasog", "Zugorim" 696 | 697 | 698 | "orc male 2" 699 | ************* 700 | 701 | .. code-block:: lua 702 | 703 | "Baglub", "Gashhrog", "Glurlub", "Gnubglaz", "Gnubskar", "Grazmuz", "Grubdag", "Grubgrath", "Hagbad", "Hagbag", "Kharglaz", "Lashbrag", "Lashstulg", "Lobbag", "Lobshaz", "Lobsnorl", "Lufdrab", "Lufnar", "Mukyob", "Narskulg", "Olgrag", "Rashgraz", "Rorgrud", "Rudogg", "Skaroggshaz", "Snubstulg", "Snurrshad", "Thakhrug", "Uthgrath", "Yashdarg" 704 | 705 | 706 | "orc surname" 707 | ************** 708 | 709 | .. code-block:: lua 710 | 711 | "Aglhel", "Atugdu", "Atuwog", "Basrn", "Batrak", "Bogath", "Bogugk", "Brou", "Bugpok", "Burbrzog", "Burgul", "Burorz", "Draharzol", "Dullump", "Gargham", "Gasrak", "Gluul", "Gorum", "Gurwog", "Khazbul", "Lagdra", "Lumbl", "Malgdum", "Marh", "Maroar", "Ogduborgob", "Olorzgub", "Shulharzol", "Trairbag", "Urgaharz" 712 | 713 | 714 | "oread female" 715 | *************** 716 | 717 | .. code-block:: lua 718 | 719 | "Asy", "Bhese", "Buti", "Danisi", "Dehshacha", "Dehtha", "Hilla", "Hilnahise", "Hinlarrin", "Ine", "Irye", "Nannynhe", "Nuannhe", "Pafa", "Pimne", "Pohle", "Pohnyu", "Raseniya", "Rece", "Rhomshude", "Rhomsy", "Riyin", "Rohthodha", "Tolnish", "Tuha", "Tura", "Vifhes", "Vosmalar", "Vunhishu", "Vushe" 720 | 721 | 722 | "oread male" 723 | ************* 724 | 725 | .. code-block:: lua 726 | 727 | "Ahvu", "Anmallus", "Bondatmom", "Bontor", "Bontormu", "Dantorrin", "Gundurhat", "Jeydurnom", "Lordanlen", "Lorhutmus", "Menha", "Menhutlom", "Monvotdon", "Nudtordur", "Nynomdur", "Pyllun", "Pylmon", "Pylrinlur", "Rotys", "Rundanfam", "Rundusvros", "Runnatdom", "Runrmu", "Sarlenlun", "Solhatys", "Urdum", "Vydat", "Vylurhut", "Vyrud", "Ylmumem" 728 | 729 | 730 | "ratfolk female" 731 | ***************** 732 | 733 | .. code-block:: lua 734 | 735 | "Ageekiz", "Binc", "Driv", "Gleev", "Gneldeen", "Hivin", "Icrind", "Ikeesnik", "Ikelgeek", "Iteeh", "Iteen", "Jar", "Jelnig", "Jih", "Keec", "Kreldet", "Peeq", "Pinl", "Preheek", "Relh", "Rinden", "Sceln", "Skelk", "Stelvin", "Stesneek", "Tineed", "Tis", "Velneek", "Vins", "Zrit" 736 | 737 | 738 | "ratfolk male" 739 | *************** 740 | 741 | .. code-block:: lua 742 | 743 | "Amel", "Branz", "Djeetir", "Dreel", "Geg", "Gleez", "Gnimeeq", "Honik", "Hotch", "Icreskreek", "Ikil", "Itinhing", "Knand", "Nen", "Nik", "Pang", "Peris", "Peter", "Pretch", "Rimvim", "Rinmev", "Skind", "Sreqink", "Stel", "Tinansins", "Tinez", "Vreenez", "Vrir", "Zehnih", "Zreec" 744 | 745 | 746 | "sprite female 1" 747 | ****************** 748 | 749 | .. code-block:: lua 750 | 751 | "Dexefer", "Flaxafer", "Flaximer", "Flaxirel", "Flissamer", "Flissinel", "Flixarel", "Flixirel", "Friskifer", "Frissanel", "Glanefer", "Glanimer", "Glissirel", "Gossinel", "Heximer", "Lissamer", "Minafer", "Raffirel", "Resserel", "Riffarel", "Shimafer", "Shimenti", "Tinkimer", "Tristirel", "Twissanel", "Twissinel", "Twixasti", "Weftanel", "Weskasti", "Weskenti" 752 | 753 | 754 | "sprite female 2" 755 | ****************** 756 | 757 | .. code-block:: lua 758 | 759 | "Brismee", "Crylnyx", "Crylynx", "Elsitiss", "Eskdee", "Eskriss", "Frimikiss", "Frimila", "Frimisa", "Gannyx", "Ganynx", "Halkiss", "Helsa", "Histriss", "Histsa", "Iphilnyx", "Ispeltiss", "Jostla", "Lirrariss", "Mistlekiss", "Mistlenyx", "Opalla", "Orifdee", "Sarmliss", "Sprinliss", "Stithsa", "Tansidee", "Tirramee", "Zandoniss", "Zandosa" 760 | 761 | 762 | "sprite male 1" 763 | **************** 764 | 765 | .. code-block:: lua 766 | 767 | "Dexendo", "Flaxaron", "Flaxasto", "Flixaron", "Flixeroll", "Flixeron", "Fossaroll", "Fossaron", "Gessaroll", "Gessendo", "Glaxaldo", "Glaxallo", "Glaxendo", "Glimallo", "Glimeroll", "Glissallo", "Gossaron", "Hexaroll", "Lissendo", "Minaldo", "Raffando", "Resseron", "Riffando", "Riffesto", "Twilleron", "Twissamo", "Twixallo", "Weftaroll", "Wisparoll", "Wispesto" 768 | 769 | 770 | "sprite male 2" 771 | **************** 772 | 773 | .. code-block:: lua 774 | 775 | "Crylmit", "Elsitross", "Elsizisk", "Emberbik", "Emberzisk", "Ferisbik", "Ganwin", "Glinkbik", "Helmist", "Heltwik", "Histfrell", "Iphilbik", "Iphilmit", "Istlebik", "Jatbrix", "Jatrix", "Jostmit", "Jusbrix", "Lirrabik", "Malitwik", "Minktross", "Mirrazisk", "Oriftross", "Orisfrell", "Oristross", "Oriswin", "Tansibik", "Tirramit", "Trumpzisk", "Zandokin" 776 | 777 | 778 | "sylph female" 779 | *************** 780 | 781 | .. code-block:: lua 782 | 783 | "Anuju", "Caadju", "Ceammi", "Cenalmi", "Cisenmu", "Cuzadife", "Dadenidi", "Damul", "Fakadsa", "Fusedfamu", "Gaeduna", "Ganunded", "Gaudju", "Haansa", "Heldulvu", "Helfinsi", "Helkelsa", "Hifalvu", "Huzdedkada", "Idalfi", "Iinkima", "Iisvuna", "Laashi", "Sukuda", "Vaazinu", "Vadedfi", "Vawenvu", "Wuad", "Wuine", "Zugelvama" 784 | 785 | 786 | "sylph male" 787 | ************* 788 | 789 | .. code-block:: lua 790 | 791 | "Adan", "Analma", "Cila", "Faduniv", "Feifmi", "Fijid", "Gaven", "Geim", "Gevilin", "Hafalid", "Hemi", "Hezadis", "Huansum", "Iden", "Lased", "Liwen", "Luul", "Mased", "Mimunal", "Muudmun", "Muunam", "Muwingum", "Nifinif", "Niudfil", "Sejid", "Sima", "Ulaash", "Vuadim", "Wavun", "Zudul" 792 | 793 | 794 | "tengu female" 795 | *************** 796 | 797 | .. code-block:: lua 798 | 799 | "Ahta", "Bekka", "Belugh", "Chakzack", "Chakzullee", "Chuk-Qro", "Gaakquz", "Kaakcha", "Krepeegaak", "Oun", "Ounck", "Pinlee", "Pra", "Pragh", "Prichor", "Prizack", "Prizotaa", "Qrekraak", "Qro", "Qrocha", "Qroqekmeck", "Qrozack", "Qrune", "Razul", "Rokzo", "Rukraje", "Taitoair", "Tchi", "Xeeppee", "Xeepyi" 800 | 801 | 802 | "tengu male" 803 | ************* 804 | 805 | .. code-block:: lua 806 | 807 | "Aahtack", "Baayoi", "Beel-Bel", "Beelah", "Biuk-Pee", "Caw", "Chakzul", "Chiukzecroa", "Eenkoa", "Gaa-Pee", "Kaarqoon", "Kraaknemeck", "Kragaak", "Krane", "Krazul", "Peeyi", "Poo-Biuk", "Poo-Gaa", "Pookraah", "Preekaak", "Preekamu", "Prigh", "Pu-Oun", "Qack", "Qraah", "Qrayoi", "Qriu-Pu", "Tchirek", "Xaitee", "Xeepun" 808 | 809 | 810 | Potions 811 | ---------- 812 | 813 | "potions" 814 | ********** 815 | 816 | .. code-block:: lua 817 | 818 | "blubbery light silvery", "bright", "bubbly light green", "clear", "clotted dark turquoise", "clotted dark white", "clotted dark yellow", "clotted light green", "dull", "heavy light gray", "heavy light red", "misty light golden", "oily mercury", "opaque light magenta", "rusty", "shiny", "smelly light magenta", "smelly light mercury", "sparkling light yellow", "sparkling orange", "swirly light orange", "thick light brown", "thick pink", "thick violet", "thin dark cyan", "thin dark golden", "thin dark purple", "translucent light gray", "viscous light violet", "viscous white" 819 | 820 | 821 | Towns 822 | -------- 823 | 824 | "jice towns" 825 | ************* 826 | 827 | .. code-block:: lua 828 | 829 | "Aelmount", "Barrowash", "Barrowiron", "Beldale", "Crystalbarrow", "Deepdor", "Edgefall", "Fallford", "Glassash", "Golddale", "Goldfall", "Iceshade", "Millcoast", "Moonhill", "Raypond", "Rayshore", "Rockhaven", "Rockmist", "Rockmount", "Shadowiron", "Shadowshore", "Spellfield", "Springcastle", "Springhill", "Stonehaven", "Stonetown", "Summerbridge", "Swyncastle", "Winterlake", "Wintershore" 830 | 831 | 832 | "mingos towns" 833 | *************** 834 | 835 | .. code-block:: lua 836 | 837 | "Alesbank", "Aleswick", "Bellburg", "Bellton", "Browndorf", "Brunsholm", "Camppool", "Crystalmont", "Darkwood", "Dracwood", "Esterbrook Grove", "Fleetley", "Hazeston", "High Mableside", "Ironmoor", "Mareshire", "Marshbrook", "Middle Bellkirk", "Middle Fleetstead", "Old Brightway", "Oxstead", "Purpleham Annex", "Sowsburgh", "Stillburgh", "Watermoor", "Wolfriver", "Woolminster Crossing", "Woolshire", "Worcliff", "Worvale" 838 | 839 | 840 | Inns 841 | ------- 842 | 843 | "inns" 844 | ******* 845 | 846 | .. code-block:: lua 847 | 848 | "The Babbling Staff", "The Bountiful Chipmunk", "The Cerulean Helmet", "The Crying Tankard", "The Emerald Tiger", "The Fair Giant", "The Flying Wentiko", "The Grey Pine", "The Grey Vixen", "The Grinning Dog", "The Hopping Bobcat", "The Indigo Otter", "The Leaping Mug", "The Low Vixen", "The Maroon Giant", "The Mended Maiden", "The Old Moose", "The Orange Badger", "The Orange Giant", "The Risen Cougar", "The Rolling Vixen", "The Royal Sceptre", "The Running Alerion", "The Silver Staff", "The Sparkling Peasant", "The Tall Wolf", "The Velvet Cask", "The Vile Crown", "The Weeping Tiger", "The Winding Ass" 849 | 850 | 851 | -------------------------------------------------------------------------------- /data/books.cfg: -------------------------------------------------------------------------------- 1 | name "books" { 2 | syllablesStart = "compact heavy huge large small thick thin tiny " 3 | syllablesMiddle = "ancient bejewelled brass-bound brittle charred cracked decorated delicate dirty dusty embossed embroidered enormous gilted hide-covered iron-bound iron-wrought laced leather leather-bound light mangled old ornate papyrus parchment ragged rune-covered satin-covered scrawl-covered shadowy shimmering silk-covered slender sooty tattered used worn" 4 | syllablesEnd = "black blue brown golden gray green orange purple red silvery white yellow " 5 | 6 | rules = "$40s_$40m_$e" 7 | } 8 | -------------------------------------------------------------------------------- /data/inns.cfg: -------------------------------------------------------------------------------- 1 | // ------------------------------------------------------------------------ 2 | // _____ 3 | // |_ _| 4 | // | | _ __ _ __ 5 | // | | | '_ \ | '_ \ 6 | // _| |_ | | | | | | | | 7 | // \___/ |_| |_| |_| |_| 8 | // 9 | // Very basic inn name implementation that spits out a simple "The VERB NOUN" or "The ADJECTIVE NOUN" combination 10 | 11 | name "inns" { 12 | syllablesStart = "Sleeping Prancing Jumping Hopping Rolling Running Dashing Leaping Winking Grinning Smiling Swinging Falling Shouting Winding Babbling Crying Weeping Sinking Rising Climbing Whining Laughing Hunting Roaming Roving Prowling Singing Dancing Glancing Staring Cheating Lying Sitting Prying Flying " 13 | 14 | syllablesMiddle = "Red Orange Yellow Green Blue Indigo Violet Black White Grey Velvet Maroon Tan Brown Silver Golden Bronze Granite Gleaming Shining Dull Gilded Beaming Blazing Burning Bright Dim Dark Tall Short Fat Skinny Small Large Grand Lowly Gangly Thin Wide Drunken Sober Wet Dry High Low Royal Favoured Smart Foolish Tiring Full Empty New Old Brandished Polished Sparkling Matted Broken Mended Fallen Risen Lifted Emerald Pink Cerulean Lavish Glazed Flattened Tipped Sheltered Stray Lone Lonely Vile King's Queen's Prince's Princess' Lucky Cunning Sultry One-Eyed Lazy Fair Bountiful Jolly Blind Hidden Frozen " 15 | 16 | syllablesEnd = "Clam Snail Snake Fox Aardvark Cat Bobcat Lion Tiger Panther Tigress Lioness Tomcat Wolf Mouse Horse Stallion Pony Mare Foal Colt Cub Man Woman Mermaid Shark Seahorse Otter Rabbit Deer Doe Buck Stag Skunk Polecat Lynx Squirrel Chipmunk Kite Eagle Falcon Hawk Kingfisher Crown Helmet Cup Cask Bowl Sceptre Staff Peasant Moon Sun Princess Prince King Queen Chalice Tankard Mug Vixen Leopard Zebra Moose Bird Monkey Donkey Pine Maiden Lady Ox Cougar Ass Dog Badger Bat Phoenix Alerion Firebird Thunderbird Wentiko Monster Goblin Giant Rat Hole Bottle Sword Shield Chest " 17 | 18 | rules = "The_$s_$e, The_$m_$e" 19 | } 20 | -------------------------------------------------------------------------------- /data/potions.cfg: -------------------------------------------------------------------------------- 1 | name "potions" { 2 | syllablesStart = "bubbly translucent flickering heavy misty oily opaque sandy smelly sparkling thick thin viscous swirly blubbery clotted" 3 | syllablesMiddle = "dark light" 4 | syllablesEnd = "blue brown cyan golden green magenta orange pink purple red yellow turquoise violet mercury gray white black silvery" 5 | customGroupA = "blood_red amber bright clear milky muddy murky rainbow-hued rusty shimmering shiny slimy speckled watery icky mottled glowing blazing dull" 6 | 7 | rules = "%60$s_$m_$e, %20$s_$e, %30$A" 8 | } 9 | -------------------------------------------------------------------------------- /data/towns.cfg: -------------------------------------------------------------------------------- 1 | //Town names. The town name construction is based on real British town names, 2 | //although many starting syllables are made up. 3 | //Author: Mingos 4 | name "mingos towns" { 5 | syllablesPre = "East, Fort, Great, High, Lower, Middle, Mount, New, North, Old, Royal, Saint, South, Upper, West" 6 | syllablesStart = "Ales, Apple, Ash, Bald, Bay, Bed, Bell, Birdling, Black, Blue, Bow, Bran, Brass, Bright, Brown, Bruns, Bulls, Camp, Cherry, Clark, Clarks, Clay, Clear, Copper, Corn, Cross, Crystal, Dark, Deep, Deer, Drac, Eagle, Earth, Elk, Elles, Elm, Ester, Ewes, Fair, Falcon, Ferry, Fire, Fleet, Fox, Gold, Grand, Green, Grey, Guild, Hammer, Hart, Hawks, Hay, Haze, Hazel, Hemlock, Ice, Iron, Kent, Kings, Knox, Layne, Lint, Lor, Mable, Maple, Marble, Mare, Marsh, Mist, Mor, Mud, Nor, Oak, Orms, Ox, Oxen, Pear, Pine, Pitts, Port, Purple, Red, Rich, Roch, Rock, Rose, Ross, Rye, Salis, Salt, Shadow, Silver, Skeg, Smith, Snow, Sows, Spring, Spruce, Staff, Star, Steel, Still, Stock, Stone, Strong, Summer, Swan, Swine, Sword, Yellow, Val, Wart, Water, Well, Wheat, White, Wild, Winter, Wolf, Wool, Wor" 7 | syllablesEnd = "bank, borne, borough, brook, burg, burgh, bury, castle, cester, cliff, crest, croft, dale, dam, dorf, edge, field, ford, gate, grad, hall, ham, hollow, holm, hurst, keep, kirk, land, ley, lyn, mere, mill, minster, mont, moor, mouth, ness, pool, river, shire, shore, side, stead, stoke, ston, thorpe, ton, town, vale, ville, way, wich, wick, wood, worth" 8 | syllablesPost = "Annex, Barrens, Barrow, Corner, Cove, Crossing, Dell, Dales, Estates, Forest, Furnace, Grove, Haven, Heath, Hill, Junction, Landing, Meadow, Park, Plain, Point, Reserve, Retreat, Ridge, Springs, View, Village, Wells, Woods" 9 | rules = "$15P_$s$e_$15p" 10 | } 11 | 12 | //Town names from Jice's "The Cave" 13 | name "jice towns" { 14 | syllablesStart = "Ael, Ash, Barrow, Bel, Black, Clear, Cold, Crystal, Deep, Edge, Falcon, Fair, Fall, Glass, Gold, Ice, Iron, Mill, Moon, Mor, Ray, Red, Rock, Rose, Shadow, Silver, Spell, Spring, Stone, Strong, Summer, Swyn, Wester, Winter" 15 | syllablesEnd = "ash, burn, barrow, bridge, castle, cliff, coast, crest, dale, dell, dor, fall, field, ford, fort, gate, haven, hill, hold, hollow, iron, lake, marsh, mill, mist, mount, moor, pond, shade, shore, summer, town, wick" 16 | rules = "$s$e" 17 | } 18 | -------------------------------------------------------------------------------- /doc/README.rst: -------------------------------------------------------------------------------- 1 | |MIT| 2 | 3 | .. |MIT| image:: https://img.shields.io/badge/License-MIT-green.svg 4 | 5 | 6 | LuaNameGen - Lua Name Generator v1.1.0 7 | ======================================= 8 | 9 | LuaNameGen is a tool to quickly generate random names for characters, objects and places. It is useful for both table-top games (run the script, grab the name) or to be used as a library for game development. 10 | 11 | Never again face an Ancient Red Dragon named Bob! 12 | 13 | 14 | Table of contents 15 | ================== 16 | 17 | * `Inspiration`_ 18 | 19 | - `Code`_ 20 | 21 | - `Names and syllables`_ 22 | 23 | * `Usage`_ 24 | 25 | - `Basic usage`_ 26 | 27 | - `Like-a-boss usage`_ 28 | 29 | * `How does it works?`_ 30 | 31 | - `Basics`_ 32 | 33 | - `Syllable Groups`_ 34 | 35 | - `Rules`_ 36 | 37 | * `How to help`_ 38 | 39 | * `Release notes`_ 40 | 41 | * `Example of generated names`_ 42 | 43 | - `Books`_ 44 | 45 | - `Creatures`_ 46 | 47 | - `Potions`_ 48 | 49 | - `Towns`_ 50 | 51 | 52 | Inspiration 53 | ============ 54 | 55 | 56 | Code 57 | ----- 58 | 59 | This script is shamelessly inspired by the great `libtcod's namegen`_, written by Dominik "Mingos" Marczuk. It even uses its syntax for .cfg files, aiming to provide compatibility with its existing sets. 60 | 61 | .. _`libtcod's namegen`: https://bitbucket.org/libtcod/libtcod/src/afba13253a79f16d10f596e2c9c99cf183f94b3c/src/namegen_c.c 62 | 63 | 64 | Names and syllables 65 | -------------------- 66 | 67 | Part of the patterns used in this this script were adapted from: 68 | 69 | * `libtcod's namegen sets`, written by Mingos and Jice; 70 | 71 | Inspiration came from sources such as: 72 | 73 | * J.R.R. Tolkien's works; 74 | * Gary Gygax's works; 75 | * Many other fantasy novels; 76 | * `d20pfsrd.com`_, the huge, free and beautiful PF SRD :) 77 | * `fantasynamegenerators.com`_; 78 | * `fantasynamegen.com`_; 79 | * `creative-role-playing.com`_ fantasy-sounding-names; 80 | * other generators that I shall remember someday. 81 | 82 | .. _`d20pfsrd.com`: http://www.d20pfsrd.com/ 83 | .. _`fantasynamegenerators.com`: https://fantasynamegenerators.com/ 84 | .. _`fantasynamegen.com`: https://www.fantasynamegen.com/ 85 | .. _`creative-role-playing.com`: http://web.archive.org/web/20141009095317/https://www.creative-role-playing.com/fantasy-sounding-names/ 86 | 87 | 88 | Usage 89 | ====== 90 | 91 | 92 | Basic usage 93 | ------------ 94 | 95 | To get a dwarf name and surname, using default sets, just do: 96 | 97 | .. code-block:: lua 98 | 99 | local namegen = require("namegen") 100 | 101 | local name = namegen.generate("dwarf male") -- Dolin 102 | local surname = namegen.generate("dwarf surname") -- Steelcutter 103 | 104 | 105 | Like-a-boss usage 106 | ------------------ 107 | 108 | To get whatever you want, call for a name set with the rule you want: 109 | 110 | .. code-block:: lua 111 | 112 | local namegen = require("namegen") 113 | 114 | local syllable_a = namegen.generate_custom( 115 | "orc female 2", "$A$10B") -- Bragluk 116 | local syllable_b = namegen.generate_custom( 117 | "giant female", "$B$10B") -- tuhli 118 | local syllable_c = namegen.generate_custom( 119 | "infernal 1", "-$B$B") -- -mozraz 120 | print("It's alive!!!", syllable_a .. syllable_b .. syllable_c) 121 | -- It's alive!!! Bragluktuhli-mozraz 122 | 123 | 124 | How does it works? 125 | =================== 126 | 127 | 128 | Basics 129 | ------- 130 | 131 | When loaded/required, the module "namegen" parses the set files pointed by 'namegen.index' (a plain text file). 132 | 133 | Each line of 'namegen.index' indicates the location of a set file to be readed. By default it only contains one: `namegen.cfg`. 134 | 135 | Each set file (also plain text files) follows a simple syntax (libtcod's syntax, so any .cfg file from it can be used), and may contains multiple sets. This is an example of a basic set: 136 | 137 | .. code-block:: none 138 | 139 | name "dwarf male" { 140 | syllablesStart = "Do, Due" 141 | syllablesEnd = "lin, rin" 142 | rules = "$s$e" 143 | } 144 | 145 | This set with its only rule would generate names such as: 146 | 147 | * Dolin; 148 | 149 | * Dorin; 150 | 151 | * Duelin; 152 | 153 | * Duerin; 154 | 155 | 156 | Syllable Groups 157 | ---------------- 158 | 159 | Every syllable group has a matching symbol (used rules, `s` and `e` in the previous example) that matches it, and will, after parsed, be stored under a specific key on the parser data table: 160 | 161 | .. code-block:: none 162 | 163 | symbol group name parser field 164 | ------ ---------- ------------ 165 | s syllablesStart parser_data["start"] 166 | m syllablesMiddle parser_data["middle"] 167 | e syllablesEnd parser_data["end"] 168 | P syllablesPre parser_data["pre"] 169 | p syllablesPost parser_data["post"] 170 | v phonemesVocals parser_data["vocals"] 171 | c phonemesConsonants parser_data["consonants"] 172 | A customGroupA parser_data["cga"] 173 | B customGroupB parser_data["cgb"] 174 | ... (custom groups exist from `A` to `O`) 175 | N customGroupN parser_data["cgn"] 176 | O customGroupO parser_data["cgo"] 177 | ? phonemesVocals/ parser_data["vocals"]/ 178 | phonemesConsonants parser_data["consonants"] 179 | 180 | 181 | Rules 182 | ------ 183 | 184 | Considering the basic example above, if you replace its rule for "$e$s", that would swap syllables in the generated names. 185 | 186 | It is possible to set a chance of adding a syllable. The rule "$s$e$50e" would have fifty percent chance of adding a third syllable from `syllablesEnd` group (or the matching group of the letter you pass). 187 | 188 | If you want to have multiple rules for a same set, simply separate them with a comma: 189 | 190 | .. code-block:: none 191 | 192 | rules = "$e$s, $s$e" 193 | 194 | Each rule would have an equal chance to be used at each generation. If desired, you can give specific chances for each rule (by default they all have the same chance of being used): 195 | 196 | .. code-block:: none 197 | 198 | rules = "%50$e$s, $s$e" 199 | 200 | Instead of each rule having 1/2 chance to be used, the first one would have 1/2*50% chance. 201 | 202 | 203 | How to help 204 | ============ 205 | 206 | Help is always appreciated. Those are the main forms to get involved: 207 | 208 | * Test and improve content: 209 | 210 | - test existing name sets; 211 | 212 | - improve them: 213 | 214 | + create a new rule; 215 | 216 | + modify a new rule; 217 | 218 | + change/remove syllables or syllable groups; 219 | 220 | + add some illegal results to avoid weird combinations; 221 | 222 | - create a new set. 223 | 224 | * Make changes to the Lua code, improving performance, fixing bugs, etc; 225 | 226 | * `Improve the documentation`. 227 | 228 | On all cases, the optimal way to proceed is by following github's workflow_: fork this repo, change it and then submit a pull request. 229 | 230 | You can also report an issue_ (and add a fix for it on the comments). 231 | 232 | .. _workflow: https://help.github.com/articles/fork-a-repo/ 233 | .. _issue: https://github.com/LukeMS/lua-namegen/issues 234 | .. _`Improve the documentation`: https://github.com/LukeMS/lua-namegen/edit/master/README.rst 235 | 236 | 237 | Release notes 238 | ============ 239 | 240 | 1.2.0 241 | ------ 242 | * Added name set for inns (thanks to `Hikitsune-Red, for his pull request`_): 243 | 244 | - `inns.cfg`; 245 | 246 | - updated the docs to include the new set examples. 247 | 248 | .. _`Hikitsune-Red, for his pull request`: https://github.com/LukeMS/lua-namegen/pull/1 249 | 250 | 1.1.0 251 | ------ 252 | * Added books, potions and towns name sets: 253 | 254 | - `towns.cfg` is a copy of Mingos and Jice town name sets for libtcod's namegen; 255 | 256 | - `books.cfg` and `potions.cfg` were based on common roguelike names for unidentified items. 257 | 258 | 1.0.1 259 | ------ 260 | 261 | * Fixed a critical error that prevented the data files (.cfg, .index) from being loaded at all while calling the library from outside of its own directory. 262 | 263 | * Made a doc generator to provide sphynx-like basic `literalinclude` (github don't support it) 264 | 265 | 266 | Example of generated names 267 | =========================== 268 | 269 | - `Books`_ 270 | 271 | - `Creatures`_ 272 | 273 | - `Potions`_ 274 | 275 | - `Towns`_ 276 | 277 | - `Inns`_ 278 | 279 | 280 | Below are examples of generated names for each of the sets packed with LuaNameGen: 281 | 282 | 283 | .. literalinclude:: examples.rst 284 | 285 | -------------------------------------------------------------------------------- /doc/examples.rst: -------------------------------------------------------------------------------- 1 | 2 | Books 3 | -------- 4 | 5 | "books" 6 | ******** 7 | 8 | .. code-block:: lua 9 | 10 | "black", "blue", "brown", "charred brown", "compact gray", "compact orange", "compact slender black", "compact tattered orange", "compact worn orange", "gilted brown", "gilted green", "green", "heavy decorated white", "heavy tattered orange", "huge brown", "iron-bound yellow", "large embroidered black", "leather green", "mangled gray", "orange", "purple", "red", "small blue", "thick dusty white", "thick yellow", "tiny red", "tiny yellow", "used green", "used white", "white" 11 | 12 | 13 | Creatures 14 | ------------ 15 | 16 | "aasimar female" 17 | ***************** 18 | 19 | .. code-block:: lua 20 | 21 | "Adrasteleth", "Ansameth", "Ar-valnor", "Aret", "Arken", "Daen", "Daeth", "Drinma", "Imesinoe", "Jal-atar", "Jaljena", "Jasarmeth", "Kalareth", "Kaljena", "Masah", "Nier", "Niereth", "Nieth", "Niramour", "Nivina", "Onalla", "Palken", "Ral-talar", "Sardareleth", "Tarma", "Valdorel", "Valdoreleth", "Valnares", "Valsah", "Varaleth" 22 | 23 | 24 | "aasimar male" 25 | *************** 26 | 27 | .. code-block:: lua 28 | 29 | "Adanal", "Amaranth", "Ar-valon", "Aradal", "Belal", "Cernan", "Cerran", "Ilat", "Jalrant", "Kaladathar", "Kalwier", "Klaronas", "Mauar", "Maunan", "Oathas", "Paath", "Paldril", "Ral-raman", "Ravanathal", "Sar-palad", "Sardanat", "Talanath", "Talonath", "Tarnan", "Tuath", "Tural", "Tutin", "Valnarathas", "Valnorathal", "Vardaral" 30 | 31 | 32 | "catfolk female" 33 | ***************** 34 | 35 | .. code-block:: lua 36 | 37 | "Dumihr", "Dusash", "Duslif", "Holina", "Homiah", "Hoslif", "Jilirri", "Jisharr", "Jishim", "Jiyi", "Lithlahi", "Lithyera", "Maulyana", "Meerline", "Miaumihr", "Mihrsharr", "Milaha", "Misfee", "Saflahe", "Safyeri", "Sashlyara", "Sfeelyani", "Sheerlirre", "Sheerlithi", "Sheeyi", "Siphemau", "Sipheyeri", "Siythlirri", "Tilini", "Tiyera" 38 | 39 | 40 | "catfolk male" 41 | *************** 42 | 43 | .. code-block:: lua 44 | 45 | "Dreran", "Dreruth", "Dreshah", "Ferswish", "Gerlyau", "Germiau", "Gerslif", "Lirrmau", "Lirrwan", "Maumew", "Maumiu", "Miauserr", "Mirrlirr", "Nykmiu", "Nykshee", "Nykus", "Safgar", "Sashgar", "Sfeesiyth", "Shahsash", "Sharrmeer", "Sharrserr", "Sheermau", "Slifshim", "Syausash", "Syaushim", "Zithmihr", "Zithpurrh", "Zithshau", "Zithtan" 46 | 47 | 48 | "dragon female" 49 | **************** 50 | 51 | .. code-block:: lua 52 | 53 | "Adastralagonis", "Adastramanthysa", "Adrazzemalis", "Andracalchaxis", "Archozuthraxis", "Atrazzebraxis", "Brimacalchaxis", "Cadranadralix", "Chrysonaluxis", "Chrysovoraxis", "Glaucalchaxis", "Heliophylaxis", "Huromanthysa", "Hurovoraxis", "Jalanmordaxis", "Jalanvoraxis", "Kralkavoraxis", "Majurizzemalis", "Ouromalaxis", "Phrixumandrossa", "Pyranaluxis", "Rhadaneriaxis", "Sarcuzzebraxis", "Sardacalchaxis", "Sidereomordaxis", "Sidereovorunga", "Tchalcedomandrossa", "Tchazarlagonis", "Tchazarmordaxis", "Vramalaxis" 54 | 55 | 56 | "dragon male" 57 | ************** 58 | 59 | .. code-block:: lua 60 | 61 | "Abrabazius", "Ancazzemal", "Atramalax", "Beruvorax", "Bhakricalchax", "Bramalax", "Brimacalchax", "Cadracordax", "Chroxenor", "Chrysolagon", "Heliobradax", "Jazrabradax", "Jurganalux", "Lazulozuthrax", "Majuribazius", "Malachobazius", "Phrixuvorung", "Porphyrocalchax", "Porphyromandros", "Pyraneriax", "Pyraphylax", "Rhadalagon", "Sarcucordax", "Sarcuneriax", "Sarcuvorax", "Sardanadral", "Sidereophylax", "Sulchruphylax", "Tchalcedolagon", "Trochocordax" 62 | 63 | 64 | "drow female" 65 | ************** 66 | 67 | .. code-block:: lua 68 | 69 | "Balsekth", "Burvilistra", "Colthalistra", "Dulmyrdeil", "Dulmyrvra", "Dulrhaira", "Dulthalis", "Dulysvia", "Durnildril", "Enothvra", "Erilra", "Ermyran", "Gonlya", "Ilorgvril", "Jegteltra", "Jendorniss", "Jysonlavil", "Kilna", "Lilnevia", "Lilvekira", "Maboria", "Mazmyrth", "Molpelith", "Molsabra", "Molthaltra", "Nothpeliln", "Ulsunbra", "Voira", "Voothiln", "Vosullevlin" 70 | 71 | 72 | "drow male" 73 | ************ 74 | 75 | .. code-block:: lua 76 | 77 | "Arred", "Chorlim", "Divsoluld", "Doryolild", "Dromryild", "Dulsinnid", "Durtorvid", "Eilorgald", "Ernourn", "Ernoxird", "Fipelul", "Immyrurn", "Imyelul", "Inssabvir", "Istnelvim", "Jernelvid", "Jervrileld", "Kaornid", "Lilald", "Lilrelurn", "Lulcaid", "Mazreluld", "Mirorgvim", "Nortulird", "Noruld", "Nothvekid", "Nothyolralim", "Olvilnil", "Syryeld", "Zvriler" 78 | 79 | 80 | "dwarf female" 81 | *************** 82 | 83 | .. code-block:: lua 84 | 85 | "Anvara", "Arra", "Bylthiel", "Danden", "Deba", "Dona", "Fretala", "Futha", "Gadi", "Garyn", "Gimca", "Hema", "Hirinka", "Hralna", "Kathsyl", "Kilta", "Kituna", "Lasryn", "Ligret", "Maba", "Miali", "Olina", "Relov", "Reniess", "Rilinda", "Ritu", "Sita", "Thogra", "Thondy", "Yenev" 86 | 87 | 88 | "dwarf female 2" 89 | ***************** 90 | 91 | .. code-block:: lua 92 | 93 | "Ballind", "Broddis", "Brunis", "Daga", "Darith", "Dorhild", "Dormnis", "Dralrun", "Drimdis", "Fromrith", "Gonddis", "Gondvis", "Gordbis", "Gordhild", "Gradlis", "Grimda", "Grimis", "Gurdis", "Horddis", "Hornga", "Hrais", "Norddis", "Skanddis", "Sundna", "Thranis", "Throda", "Throlda", "Thrordis", "Thrulis", "Thundis" 94 | 95 | 96 | "dwarf male" 97 | ************* 98 | 99 | .. code-block:: lua 100 | 101 | "Bifur", "Biril", "Bonthur", "Danbur", "Darethog", "Darrimm", "Dein", "Duerran", "Duerthur", "Duerulf", "Duervim", "Faril", "Fibroir", "Galvri", "Gimin", "Gwarri", "Hargurn", "Kiur", "Lothur", "Ori", "Renden", "Tadur", "Taur", "Telrimm", "Thoden", "Thoni", "Torun", "Ummun", "Vonin", "Vonrimm" 102 | 103 | 104 | "dwarf male 2" 105 | *************** 106 | 107 | .. code-block:: lua 108 | 109 | "Bordnir", "Bornbor", "Bornlin", "Brimin", "Brimnir", "Brokkri", "Bromor", "Burlli", "Dolgvor", "Dorin", "Dormvor", "Dralin", "Fromli", "Gimrur", "Gondir", "Gordrok", "Gordvi", "Gradror", "Guldvir", "Gundnir", "Hornror", "Norbor", "Nordrok", "Norrin", "Skandnir", "Skondvor", "Strombor", "Sundror", "Thornror", "Throlin" 110 | 111 | 112 | "dwarf surname" 113 | **************** 114 | 115 | .. code-block:: lua 116 | 117 | "Bearcleaver", "Bearstriker", "Bloodspear", "Dragonripper", "Ettinsmasher", "Fairaxe", "Foe-Grappler", "Foeboxer", "Gemminer", "Gnome-Grappler", "Goblinbasher", "Goldfoot", "Goldsmith", "Greychest", "Greysword", "Ironfoot", "Kobold-Strangler", "Koboldslayer", "Mithrilbender", "Oakshield", "Ogre-Strangler", "Silvershield", "Spiderslasher", "Steelsmith", "Stonecutter", "Strongfoot", "Trollmauler", "Wyvern-Garrotter", "Wyvernbutcher", "Wyverncutter" 118 | 119 | 120 | "elf female" 121 | ************* 122 | 123 | .. code-block:: lua 124 | 125 | "Alais", "Alea", "Bellaluna", "Braerindra", "Chandrelle", "Cyithrel", "Daratrine", "Darunia", "Delshandra", "Eirika", "Elanil", "Eloimaya", "Gweyr", "Ilmadia", "Keishara", "Kethryllia", "Liluth", "Lura", "Lyndis", "Lyre", "Morgwais", "Nephenee", "Phelorna", "Pyria", "Rathiain", "Shadowmoon", "Shandalar", "Sheedra", "Tsarra", "Urmicca" 126 | 127 | 128 | "elf female 2" 129 | *************** 130 | 131 | .. code-block:: lua 132 | 133 | "Aegthelebmir", "Aerthaelerwen", "Aerthaelthalwen", "Aethraelerrian", "Anrimevwen", "Arsareliel", "Caelrelolrian", "Calireviel", "Carmarthalrien", "Celrinaliel", "Cirninaniel", "Clarinolriel", "Earmaegemroël", "Elbrinelsil", "Elthlitheswë", "Erimaswen", "Erlrilirel", "Ermaranwë", "Estloreleth", "Farmithalriel", "Farnithenmir", "Feanthalthonrian", "Findranthonmir", "Findsaresmir", "Galrinthonian", "Gannitherrian", "Gilralthonwë", "Ithmindadloth", "Laeglitharrial", "Laegsaeriledel" 134 | 135 | 136 | "elf male" 137 | *********** 138 | 139 | .. code-block:: lua 140 | 141 | "Aimon", "Alabyran", "Almon", "Aywin", "Bellas", "Connak", "Dakath", "Ettrian", "Hagwin", "Iliphar", "Ilrune", "Jorildyn", "Keletheryl", "Kendel", "Khatar", "Khidell", "Lhoris", "Malon", "Melandrach", "Myriil", "Pleufan", "Samblar", "Shaundyl", "Taegen", "Theodred", "Triandal", "Vaalyun", "Vander", "Vulmon", "Xhalth" 142 | 143 | 144 | "elf male 2" 145 | ************* 146 | 147 | .. code-block:: lua 148 | 149 | "Aegsilerrod", "Aethlorallin", "Aethraelamnar", "Aethseldelnar", "Belmitholdil", "Caelsaeremrior", "Caelsaerthaldan", "Caerlithirrod", "Caerrindesros", "Calimilorn", "Calrinerdir", "Cellaredorn", "Celmithanros", "Earthaeramion", "Elbnithinrond", "Elrilirion", "Elsarerdil", "Eolmelandel", "Erimirfal", "Eristindel", "Faersilinorn", "Findninevion", "Findnithamdel", "Findthaleslad", "Galinolrior", "Gelseldenion", "Ithmelalthir", "Ithserevlad", "Laegranaslin", "Lendtherirdan" 150 | 151 | 152 | "fetchling female" 153 | ******************* 154 | 155 | .. code-block:: lua 156 | 157 | "Drevoha", "Ecotel", "Eheter", "Hulohir", "Ikadolo", "Ikecutam", "Ikuculin", "Ilerac", "Jejuti", "Jolurac", "Mukurat", "Oronora", "Qitomeh", "Qraholim", "Ravoh", "Rede", "Rode", "Siten", "Suseh", "Trigal", "Ucenoma", "Ucilolah", "Ucosoha", "Usohomal", "Utecucil", "Utigi", "Yerum", "Yuci", "Zavotec", "Zovi" 158 | 159 | 160 | "fetchling male" 161 | ***************** 162 | 163 | .. code-block:: lua 164 | 165 | "Bridu", "Brusol", "Drasot", "Ecotim", "Ehozon", "Graju", "Ikadu", "Iliki", "Jajoh", "Jizu", "Joko", "Natol", "Oravur", "Oreho", "Oruju", "Qrera", "Trame", "Treci", "Treja", "Trovi", "Truso", "Ucoku", "Ugemu", "Uguket", "Utezu", "Uvuho", "Yejoh", "Yiko", "Zese", "Zesuc" 166 | 167 | 168 | "giant female" 169 | *************** 170 | 171 | .. code-block:: lua 172 | 173 | "Baod-Daoh", "Baod-Doh", "Bulimih", "Daoh-Ig", "Doh-Mugh", "FahEghinuh", "Ghadrei", "Ghadtih", "Ghat-Daoh", "Gireekheedoh", "Hahsuthrei", "Haoghfah", "Khanfah", "LahFeehmburi", "MihGiree", "MihOb", "MihOugh", "MihWuh", "Ouh-Doh", "Rei-Tebrahoo", "Rei-Thom", "ReiChah", "ReiMehsuth", "Rifoonarootih", "Shul-Mih", "Soh-Nham", "Tih-Shehi", "Tuhlighadsoh", "Tuhlimughsoh", "Ushrahoodaoh" 174 | 175 | 176 | "giant male" 177 | ************* 178 | 179 | .. code-block:: lua 180 | 181 | "Bohr", "Bul-Yeeh", "Ehm-Shom", "Ghatrifoo", "Ghee", "Ghish", "Goush-Faogh", "Gunri", "Hoo", "Hoo-Heh", "Hooshehi", "Khankham", "Khaz", "Lugh", "Moghquagi", "Mouh", "Nham", "Peh-Yaum", "Pogh", "Puh", "Rhoo-Shom", "Shlo", "Suhi-Meh", "Thom", "Tuhli", "Ub-Ahg", "Ubghat", "Wah", "Yaum-Loghkhaz", "Zhamchah" 182 | 183 | 184 | "gnome female" 185 | *************** 186 | 187 | .. code-block:: lua 188 | 189 | "Bilbeefonk", "Billeklinkle", "Bimrgo", "Bipflonk", "Bipsizz", "Cargus", "Dinkulo", "Ditink", "Dosizz", "Filble", "Filgus", "Gynndomink", "Juladink", "Katdomink", "Ketris", "Klofizzy", "Liskink", "Lokeefizzy", "Lymtink", "Lyssfizzy", "Lysskyago", "Merdiwack", "Mitthinkle", "Nittlebik", "Talkink", "Tallinkey", "Tannus", "Thinbythin", "Tilkitinkle", "Tindinkey" 190 | 191 | 192 | "gnome male" 193 | ************* 194 | 195 | .. code-block:: lua 196 | 197 | "Babimac", "Balibik", "Bawack", "Bimleeble", "Bimliarn", "Binkflonk", "Binwick", "Bolink", "Bonkbus", "Bonleble", "Burtink", "Dinkbitank", "Dobeeble", "Dodibrick", "Donkleedink", "Fenklink", "Fenlflonk", "Filbik", "Filgo", "Finflonk", "Finkvash", "Gelklink", "Gelsizz", "Hinbmink", "Hinklosizz", "Laflink", "Nitkeeklonk", "Tenlink", "Tockawick", "Tovash" 198 | 199 | 200 | "gnome surname" 201 | **************** 202 | 203 | .. code-block:: lua 204 | 205 | "Acerpipe", "Blackbus", "Castfuse", "Castspinner", "Castspring", "Clickgear", "Clicksteel", "Draxlespindle", "Gearwhistle", "Gearwizzle", "Overgear", "Porterfuzz", "Puddlepipe", "Sadbonk", "Shinenozzle", "Shinepipe", "Shinespinner", "Shortpipe", "Spannerblast", "Sparkfizzle", "Sparkspanner", "Sparksprocket", "Stormgrinder", "Stormtorque", "Stormwizzle", "Thistleblast", "Thistlebus", "Thistlegrinder", "Thistlenozzle", "Thistlepipe" 206 | 207 | 208 | "goblin female" 209 | **************** 210 | 211 | .. code-block:: lua 212 | 213 | "Akghy", "Arkghakah", "Bilgyipee", "Blidgah", "Bugghy", "Chutogghy", "Dokhay", "Drikrakgah", "Drubkrige", "Fluge", "Glaggaday", "Glagya", "Gnaty", "Graty", "Kakghy", "Kavee", "Lukay", "Mizya", "Mubay", "Mubzatee", "Naggah", "Nikkghy", "Nogge", "Nure", "Ragya", "Slogya", "Sniky", "Sogay", "Zity", "Zobghy" 214 | 215 | 216 | "goblin male" 217 | ************** 218 | 219 | .. code-block:: lua 220 | 221 | "Blidgah", "Blotbolg", "Bolgadz", "Bolgsnitnikk", "Bot", "Chunag", "Drizark", "Gazbilg", "Ghaklikk", "Ghorirk", "Glagrag", "Glakkak", "Glakus", "Glatkak", "Gloksog", "Kriggag", "Nazflug", "Niggat", "Rotadz", "Rotgak", "Shukrok", "Slogark", "Snignukk", "Snitshuk", "Togbilg", "Yaggbolg", "Zatgnat", "Zatspik", "Zizblig", "Zobsna" 222 | 223 | 224 | "half-demon female" 225 | ******************** 226 | 227 | .. code-block:: lua 228 | 229 | "Aagnalu", "Alurnalu", "Arakskiu", "Draanzihyl", "Idruxhiu", "Jhaaldiu", "Jidija", "Jiulihyl", "Jiuzihyl", "Kaazsula", "Mulkjiul", "Mulklin", "Nidija", "Nulxhiu", "Rukdiu", "Saaggiu", "Saagzihyl", "Urzlihyl", "Urzzihyl", "Urzziu", "Uznidizil", "Virndiu", "Virngiu", "Virnrhyl", "Virnzihyl", "Virnziu", "Vlaajanil", "Vlagdiu", "Vrazgiu", "Vulkgiu" 230 | 231 | 232 | "half-demon male" 233 | ****************** 234 | 235 | .. code-block:: lua 236 | 237 | "Azikruzuk", "Azuvik", "Brallank", "Bruhlurug", "Draanlurr", "Draanlurug", "Drulgsul", "Jhaalundak", "Jurglurr", "Jurzbru", "Karglurr", "Krauruzuk", "Krivnal", "Luridrul", "Lurilurr", "Nauxulg", "Ninjdrul", "Ranaguvik", "Urzarag", "Utilurr", "Utinal", "Utixulg", "Uznidsul", "Uznidundak", "Virnundak", "Vluklun", "Vrazbru", "Xidsuruk", "Zauvinu", "Zauvlank" 238 | 239 | 240 | "halfling female" 241 | ****************** 242 | 243 | .. code-block:: lua 244 | 245 | "Allison", "Amanda", "Amber", "Berenga", "Bertha", "Caitlin", "Chrodechildis", "Darby", "Emma", "Engelberga", "Fatima", "Kaitlyn", "Luitgarde", "Madison", "Marcatrude", "Marigold", "Mary", "Moschia", "Myrna", "Myrtle", "Natalie", "Prima", "Rotrud", "Rotrudis", "Saffron", "Scarlet", "Selina", "Shelby", "Tasha", "Theutberga" 246 | 247 | 248 | "halfling female 2" 249 | ******************** 250 | 251 | .. code-block:: lua 252 | 253 | "Adice", "Adily", "Adra", "Adria", "Alba", "Amba", "Banda", "Brama", "Bramia", "Bramwisa", "Durla", "Durlily", "Erna", "Fulbia", "Halda", "Hama", "Hoda", "Hodina", "Ivia", "Markily", "Munga", "Oda", "Otha", "Sabina", "Samia", "Sega", "Tobice", "Wiga", "Wydia", "Wydina" 254 | 255 | 256 | "halfling male" 257 | **************** 258 | 259 | .. code-block:: lua 260 | 261 | "Aega", "Arnoul", "Balbo", "Bero", "Bertin", "Bilbo", "Blanco", "Drogon", "Erard", "Faro", "Fastred", "Fredegar", "Giseler", "Guntram", "Heribert", "Hildibrand", "Madoc", "Majorian", "Marachar", "Mauger", "Melampus", "Merimac", "Rathar", "Sadoc", "Taurin", "Thankmar", "Togo", "Unroch", "Waltgaud", "Willibrord" 262 | 263 | 264 | "halfling male 2" 265 | ****************** 266 | 267 | .. code-block:: lua 268 | 269 | "Ado", "Ailard", "Ailwise", "Albo", "Albwise", "Bardfast", "Bardo", "Bildert", "Blancald", "Blanco", "Boffald", "Drogert", "Drogo", "Durlo", "Emmald", "Erdard", "Erdo", "Falco", "Ferdard", "Ferdold", "Gamo", "Hamo", "Hamold", "Hugert", "Ivwise", "Markfast", "Marko", "Otho", "Serlard", "Wigold" 270 | 271 | 272 | "halfling surname" 273 | ******************* 274 | 275 | .. code-block:: lua 276 | 277 | "Banks", "Barrowes", "Boffin", "Bophin", "Bramblethorn", "Brandagamba", "Brown", "Brownlock", "Chubb", "Cotton", "Diggle", "Fairbairn", "Gawkroger", "Gluttonbelly", "Greenhill", "Harfoot", "Hayward", "Hlothran", "Hornwood", "Leafwalker", "Longfoot", "Noakes", "Oldbuck", "Puddifoot", "Sandheaver", "Sandyman", "Took-Brandybuck", "Underfoot", "Underlake", "Wanderfoot" 278 | 279 | 280 | "hobgoblin female" 281 | ******************* 282 | 283 | .. code-block:: lua 284 | 285 | "Afrata", "Beyekam", "Beylata", "Ceytarak", "Darate", "Dirleta", "Dirtaruk", "Esrima", "Fetdora", "Kolgha", "Kurde", "Kurhe", "Kuruke", "Malghoran", "Mevleta", "Mevletem", "Poldletan", "Poldrama", "Polduki", "Roldluka", "Saltema", "Tetma", "Totma", "Tottarim", "Turgikum", "Turglater", "Turgrata", "Turguko", "Utrata", "Zoldhora" 286 | 287 | 288 | "hobgoblin male" 289 | ***************** 290 | 291 | .. code-block:: lua 292 | 293 | "Akhi", "Akrim", "Dorlut", "Durat", "Durluk", "Fethar", "Fethi", "Haat", "Harim", "Kethluk", "Kethlut", "Kolgot", "Kurung", "Okhar", "Poldok", "Poldrim", "Roldhi", "Roldtar", "Rolduk", "Roldung", "Saltlut", "Tetrot", "Tettar", "Totat", "Totlut", "Turghar", "Uthar", "Zoldat", "Zoldrot", "Zoldut" 294 | 295 | 296 | "human female" 297 | *************** 298 | 299 | .. code-block:: lua 300 | 301 | "Aelfsig", "Aethelmaer", "Aethelraed", "Bealdthorne", "Beorhtric", "Cwenburg", "Cynein", "Eirudo", "Elida", "Gruistae", "Heathusige", "Helmsige", "Hildsige", "Islynn", "Isothra", "Ivithra", "Kerenza", "Leofmaer", "Leofor", "Lowenna", "Mayetta", "Mundkettil", "Nerama", "Osgrim", "Salenor", "Salywyn", "Voroth", "Winewaru", "Zubuwyn", "Zubylaith" 302 | 303 | 304 | "human male" 305 | ************* 306 | 307 | .. code-block:: lua 308 | 309 | "Aelfkettil", "Aenesric", "Balrach", "Bardahard", "Bregudeor", "Breguson", "Cenarm", "Censige", "Chalrochak", "Chaltorek", "Cynebeorht", "Delmkor", "Deorgar", "Deorweald", "Ervan", "Garsige", "Garweard", "Godbeorht", "Godweard", "Herebrand", "Hrofweard", "Instan", "Leodhere", "Sigeleof", "Sigeweard", "Thurheard", "Winegar", "Winewulf", "Wulfheard", "Zlen" 310 | 311 | 312 | "human surname" 313 | **************** 314 | 315 | .. code-block:: lua 316 | 317 | "'Frenzied' Lortavan", "'Haggard' Stanton", "'Hare' Seven-Shaper", "'Pratt' Clayden", "'Small' Summer", "'Stout' Spalding", "Bjoornsdottir", "Brodie", "Brown", "Bunce", "Colenso", "Curicinnius", "Doom-Foot", "Ebonhand", "Finch", "Kjaldssen", "Lencreinace", "Lilly", "Lincoln", "Locippe", "Midal", "Mojisversdottir", "Newbury", "Padley", "Plaelius", "Plenceia", "Secret-Drums", "Stanton", "Ulfransson", "Wavrustiris" 318 | 319 | 320 | "ifrit female" 321 | *************** 322 | 323 | .. code-block:: lua 324 | 325 | "Atwa", "Edu", "Erya", "Fadri", "Fetwi", "Fudru", "Fulhe", "Fullulyu", "Garlun", "Gatwa", "Gethis", "Gula", "Haen", "Hanu", "Hathethi", "Hima", "Himerhu", "Hira", "Hirya", "Hitwa", "Iriswirh", "Irranthis", "Itin", "Lary", "Ludre", "Man", "Satwarhe", "Wilwu", "Zetyi", "Zunu" 326 | 327 | 328 | "ifrit male" 329 | ************* 330 | 331 | .. code-block:: lua 332 | 333 | "Baviq", "Bukut", "Daci", "Dajad", "Dame", "Egel", "Galum", "Gare", "Giviq", "Jicut", "Kele", "Kivaj", "Maci", "Maluh", "Marut", "Mecun", "Mirut", "Takuh", "Tenim", "Tevel", "Tikin", "Tiqa", "Uvin", "Vakin", "Vila", "Vineh", "Virat", "Vugam", "Vukel", "Vure" 334 | 335 | 336 | "infernal 1" 337 | ************* 338 | 339 | .. code-block:: lua 340 | 341 | "Baphorgya", "Breilghu", "Chruarghu", "Chrulinal", "Drauurshai", "Dromuizbaph", "Garu-lunee", "Garuzabaz", "Ghauvekraa", "Ghurugarl", "Glau-vivuul", "Gle-ovbaal", "Gleiyrezu", "Gre-azrez", "Gura-jeglau", "Hzivassu", "Muzojhez", "Pazulghu", "Pazzarezu", "Razavcha", "Rez-elyaa", "Saa-zetzau", "Saavathu", "Sau-ivzu", "Shu-evidrau", "Ssuvebael", "Szuluyrez", "Tzaurabaz", "Utuovtzau", "Zuavziel" 342 | 343 | 344 | "infernal 2" 345 | ************* 346 | 347 | .. code-block:: lua 348 | 349 | "Aigelboaj", "Aigoyshub", "Algirglab", "Blog-aysag", "Bulgayjulb", "Drujvibarg", "Felgvudergh", "Ghadvusug", "Glaaglonalb", "Glaagurjub", "Hegazleegh", "Hrud-voboaj", "Hrudlekolg", "Krolgjinog", "Magviiub", "Magzudergh", "Morguyzub", "Naag-uyurb", "Nauglahaag", "Nuglushub", "Nugyiigg", "Nyogzaghad", "Shubevdrog", "Szugvinaug", "Trobuvkwarg", "Xubvithog", "Yebvaalg", "Yeeg-radregh", "Zugjunulb", "Zugvoogg" 350 | 351 | 352 | "infernal 3" 353 | ************* 354 | 355 | .. code-block:: lua 356 | 357 | "Ashevgaur", "Aztratlizit", "Bliklaszut", "Boak-ezazt", "Boakuzhrek", "Boakuzsoth", "Brax-ursark", "Dunjaoch", "Duumolblik", "Gaanozduum", "Gaurilchon", "Gorivinax", "Hraxlosark", "Hrekuyner", "Khorjurolk", "Kireyter", "Mat-yidraum", "Met-ajash", "Mothejgoth", "Namruuzt", "Nerirhoth", "Nythovruaak", "Sarklaazt", "Sarkujszut", "Sotyaboak", "Sutovralk", "Terejloch", "Thakuvthalk", "Utukurgith", "Uztrulok" 358 | 359 | 360 | "kobold female" 361 | **************** 362 | 363 | .. code-block:: lua 364 | 365 | "Ari", "Aslemko", "Asral", "Degees", "Degra", "Ekara", "Gahoo", "Gurli", "Gurzok", "Harkro", "Ia", "Igra", "Ligu", "Matroso", "Nekri", "Noske", "Pogar", "Pokrora", "Potroil", "Pozra", "Rasuskas", "Rolsus", "Sasoo", "Sizlem", "Sokehtro", "Sokzra", "Tolkru", "Tollemkoo", "Tollire", "Zasi" 366 | 367 | 368 | "kobold male" 369 | ************** 370 | 371 | .. code-block:: lua 372 | 373 | "Crurad", "Dhelal", "Dhelzor", "Dhimaholk", "Drazax", "Eaalp", "Gakni", "Getghe", "Ghenuld", "Ghexas", "Ilnri", "Ilxas", "Jaod", "Makme", "Molnesk", "Orod", "Orze", "Qeerk", "Qrelra", "Rusxas", "Ruszore", "Vadnri", "Vemerk", "Vipir", "Zalxasdoo", "Zalzin", "Zeeark", "Zeedoo", "Zoir", "Zorzad" 374 | 375 | 376 | "ogre female" 377 | ************** 378 | 379 | .. code-block:: lua 380 | 381 | "Dugshrufy", "Durshglugay", "Duzdrubgah", "Ghulghakhgah", "Gradbarshghy", "Gradyuggah", "Grobkurya", "Grokgharah", "Grukurghay", "Grulobbgah", "Gruzmakhgah", "Hurslubay", "Kulkzuggah", "Lumkulkya", "Luzfugghy", "Luzkaiy", "Molggharay", "Molghrungah", "Muddrokay", "Mudlorgghy", "Mulobbkaighy", "Murkshargy", "Muzdghakhya", "Obbghashgah", "Rolbshurya", "Shrufmuzday", "Slubdruggah", "Sludlukhgah", "Snadthurkah", "Thulkgruya" 382 | 383 | 384 | "ogre male" 385 | ************ 386 | 387 | .. code-block:: lua 388 | 389 | "Bogdug", "Burzgruz", "Drokgrumf", "Drubdushhurg", "Duzyur", "Fuglush", "Gholgom", "Gludduz", "Gludlug", "Grashdrok", "Grufulg", "Grulsnog", "Grumthrag", "Gruzmud", "Guhlkaislug", "Guhlmakh", "Kugtrug", "Kurlug", "Lorgklobgrut", "Lumklob", "Lurzghash", "Makhgruk", "Nakhkrodurgh", "Nakhnarg", "Obbhrung", "Rolbgrum", "Shargkurmug", "Sludghakhslub", "Urdghar", "Zuglush" 390 | 391 | 392 | "orc female" 393 | ************* 394 | 395 | .. code-block:: lua 396 | 397 | "Bashat", "Basht", "Bolar", "Bulfol", "Bum", "Burzob", "Burzraz", "Dulug", "Ghak", "Globh", "Gonk", "Grat", "Gul", "Lambug", "Lamut", "Mazsha", "Mogak", "Morn", "Morza", "Murbraz", "Murmalah", "Orbugol", "Rogbut", "Shagdub", "Shelur", "Ulumt", "Umog", "Uroga", "Ushat", "Volrog" 398 | 399 | 400 | "orc female 2" 401 | *************** 402 | 403 | .. code-block:: lua 404 | 405 | "Bakhskaray", "Bruzkragghy", "Dakkolgay", "Dargtrogay", "Gashhrogya", "Gashlakhy", "Ghazgrubgrudah", "Gokhhrugay", "Gokhkrudbrogy", "Grathlufya", "Grazskulgay", "Grubdargy", "Gudsnubya", "Hratoggah", "Hruggrashay", "Khagglufghy", "Kragluby", "Lubgashya", "Lukmolkgah", "Rorgslurghy", "Rotagghy", "Rudgnubay", "Rugzogya", "Shazgasholgah", "Snurrbragya", "Sodrugghy", "Thakbashgah", "Troglakhya", "Umshhakky", "Yobgutgah" 406 | 407 | 408 | "orc male" 409 | *********** 410 | 411 | .. code-block:: lua 412 | 413 | "Bashrz", "Bogakh", "Brokrkub", "Bugbumol", "Buomaugh", "Ghamrlorz", "Gluh", "Grusur", "Gunaakt", "Kurdburz", "Lurodum", "Malz", "Mashgob", "Mugarod", "Mulunok", "Muzorz", "Nagrutto", "Olug", "Olurgash", "Owkbanok", "Shobrkul", "Shumborz", "Slapdud", "Urul", "Ushnong", "Ushnurz", "Yadba", "Yargron", "Yasog", "Zugorim" 414 | 415 | 416 | "orc male 2" 417 | ************* 418 | 419 | .. code-block:: lua 420 | 421 | "Baglub", "Gashhrog", "Glurlub", "Gnubglaz", "Gnubskar", "Grazmuz", "Grubdag", "Grubgrath", "Hagbad", "Hagbag", "Kharglaz", "Lashbrag", "Lashstulg", "Lobbag", "Lobshaz", "Lobsnorl", "Lufdrab", "Lufnar", "Mukyob", "Narskulg", "Olgrag", "Rashgraz", "Rorgrud", "Rudogg", "Skaroggshaz", "Snubstulg", "Snurrshad", "Thakhrug", "Uthgrath", "Yashdarg" 422 | 423 | 424 | "orc surname" 425 | ************** 426 | 427 | .. code-block:: lua 428 | 429 | "Aglhel", "Atugdu", "Atuwog", "Basrn", "Batrak", "Bogath", "Bogugk", "Brou", "Bugpok", "Burbrzog", "Burgul", "Burorz", "Draharzol", "Dullump", "Gargham", "Gasrak", "Gluul", "Gorum", "Gurwog", "Khazbul", "Lagdra", "Lumbl", "Malgdum", "Marh", "Maroar", "Ogduborgob", "Olorzgub", "Shulharzol", "Trairbag", "Urgaharz" 430 | 431 | 432 | "oread female" 433 | *************** 434 | 435 | .. code-block:: lua 436 | 437 | "Asy", "Bhese", "Buti", "Danisi", "Dehshacha", "Dehtha", "Hilla", "Hilnahise", "Hinlarrin", "Ine", "Irye", "Nannynhe", "Nuannhe", "Pafa", "Pimne", "Pohle", "Pohnyu", "Raseniya", "Rece", "Rhomshude", "Rhomsy", "Riyin", "Rohthodha", "Tolnish", "Tuha", "Tura", "Vifhes", "Vosmalar", "Vunhishu", "Vushe" 438 | 439 | 440 | "oread male" 441 | ************* 442 | 443 | .. code-block:: lua 444 | 445 | "Ahvu", "Anmallus", "Bondatmom", "Bontor", "Bontormu", "Dantorrin", "Gundurhat", "Jeydurnom", "Lordanlen", "Lorhutmus", "Menha", "Menhutlom", "Monvotdon", "Nudtordur", "Nynomdur", "Pyllun", "Pylmon", "Pylrinlur", "Rotys", "Rundanfam", "Rundusvros", "Runnatdom", "Runrmu", "Sarlenlun", "Solhatys", "Urdum", "Vydat", "Vylurhut", "Vyrud", "Ylmumem" 446 | 447 | 448 | "ratfolk female" 449 | ***************** 450 | 451 | .. code-block:: lua 452 | 453 | "Ageekiz", "Binc", "Driv", "Gleev", "Gneldeen", "Hivin", "Icrind", "Ikeesnik", "Ikelgeek", "Iteeh", "Iteen", "Jar", "Jelnig", "Jih", "Keec", "Kreldet", "Peeq", "Pinl", "Preheek", "Relh", "Rinden", "Sceln", "Skelk", "Stelvin", "Stesneek", "Tineed", "Tis", "Velneek", "Vins", "Zrit" 454 | 455 | 456 | "ratfolk male" 457 | *************** 458 | 459 | .. code-block:: lua 460 | 461 | "Amel", "Branz", "Djeetir", "Dreel", "Geg", "Gleez", "Gnimeeq", "Honik", "Hotch", "Icreskreek", "Ikil", "Itinhing", "Knand", "Nen", "Nik", "Pang", "Peris", "Peter", "Pretch", "Rimvim", "Rinmev", "Skind", "Sreqink", "Stel", "Tinansins", "Tinez", "Vreenez", "Vrir", "Zehnih", "Zreec" 462 | 463 | 464 | "sprite female 1" 465 | ****************** 466 | 467 | .. code-block:: lua 468 | 469 | "Dexefer", "Flaxafer", "Flaximer", "Flaxirel", "Flissamer", "Flissinel", "Flixarel", "Flixirel", "Friskifer", "Frissanel", "Glanefer", "Glanimer", "Glissirel", "Gossinel", "Heximer", "Lissamer", "Minafer", "Raffirel", "Resserel", "Riffarel", "Shimafer", "Shimenti", "Tinkimer", "Tristirel", "Twissanel", "Twissinel", "Twixasti", "Weftanel", "Weskasti", "Weskenti" 470 | 471 | 472 | "sprite female 2" 473 | ****************** 474 | 475 | .. code-block:: lua 476 | 477 | "Brismee", "Crylnyx", "Crylynx", "Elsitiss", "Eskdee", "Eskriss", "Frimikiss", "Frimila", "Frimisa", "Gannyx", "Ganynx", "Halkiss", "Helsa", "Histriss", "Histsa", "Iphilnyx", "Ispeltiss", "Jostla", "Lirrariss", "Mistlekiss", "Mistlenyx", "Opalla", "Orifdee", "Sarmliss", "Sprinliss", "Stithsa", "Tansidee", "Tirramee", "Zandoniss", "Zandosa" 478 | 479 | 480 | "sprite male 1" 481 | **************** 482 | 483 | .. code-block:: lua 484 | 485 | "Dexendo", "Flaxaron", "Flaxasto", "Flixaron", "Flixeroll", "Flixeron", "Fossaroll", "Fossaron", "Gessaroll", "Gessendo", "Glaxaldo", "Glaxallo", "Glaxendo", "Glimallo", "Glimeroll", "Glissallo", "Gossaron", "Hexaroll", "Lissendo", "Minaldo", "Raffando", "Resseron", "Riffando", "Riffesto", "Twilleron", "Twissamo", "Twixallo", "Weftaroll", "Wisparoll", "Wispesto" 486 | 487 | 488 | "sprite male 2" 489 | **************** 490 | 491 | .. code-block:: lua 492 | 493 | "Crylmit", "Elsitross", "Elsizisk", "Emberbik", "Emberzisk", "Ferisbik", "Ganwin", "Glinkbik", "Helmist", "Heltwik", "Histfrell", "Iphilbik", "Iphilmit", "Istlebik", "Jatbrix", "Jatrix", "Jostmit", "Jusbrix", "Lirrabik", "Malitwik", "Minktross", "Mirrazisk", "Oriftross", "Orisfrell", "Oristross", "Oriswin", "Tansibik", "Tirramit", "Trumpzisk", "Zandokin" 494 | 495 | 496 | "sylph female" 497 | *************** 498 | 499 | .. code-block:: lua 500 | 501 | "Anuju", "Caadju", "Ceammi", "Cenalmi", "Cisenmu", "Cuzadife", "Dadenidi", "Damul", "Fakadsa", "Fusedfamu", "Gaeduna", "Ganunded", "Gaudju", "Haansa", "Heldulvu", "Helfinsi", "Helkelsa", "Hifalvu", "Huzdedkada", "Idalfi", "Iinkima", "Iisvuna", "Laashi", "Sukuda", "Vaazinu", "Vadedfi", "Vawenvu", "Wuad", "Wuine", "Zugelvama" 502 | 503 | 504 | "sylph male" 505 | ************* 506 | 507 | .. code-block:: lua 508 | 509 | "Adan", "Analma", "Cila", "Faduniv", "Feifmi", "Fijid", "Gaven", "Geim", "Gevilin", "Hafalid", "Hemi", "Hezadis", "Huansum", "Iden", "Lased", "Liwen", "Luul", "Mased", "Mimunal", "Muudmun", "Muunam", "Muwingum", "Nifinif", "Niudfil", "Sejid", "Sima", "Ulaash", "Vuadim", "Wavun", "Zudul" 510 | 511 | 512 | "tengu female" 513 | *************** 514 | 515 | .. code-block:: lua 516 | 517 | "Ahta", "Bekka", "Belugh", "Chakzack", "Chakzullee", "Chuk-Qro", "Gaakquz", "Kaakcha", "Krepeegaak", "Oun", "Ounck", "Pinlee", "Pra", "Pragh", "Prichor", "Prizack", "Prizotaa", "Qrekraak", "Qro", "Qrocha", "Qroqekmeck", "Qrozack", "Qrune", "Razul", "Rokzo", "Rukraje", "Taitoair", "Tchi", "Xeeppee", "Xeepyi" 518 | 519 | 520 | "tengu male" 521 | ************* 522 | 523 | .. code-block:: lua 524 | 525 | "Aahtack", "Baayoi", "Beel-Bel", "Beelah", "Biuk-Pee", "Caw", "Chakzul", "Chiukzecroa", "Eenkoa", "Gaa-Pee", "Kaarqoon", "Kraaknemeck", "Kragaak", "Krane", "Krazul", "Peeyi", "Poo-Biuk", "Poo-Gaa", "Pookraah", "Preekaak", "Preekamu", "Prigh", "Pu-Oun", "Qack", "Qraah", "Qrayoi", "Qriu-Pu", "Tchirek", "Xaitee", "Xeepun" 526 | 527 | 528 | Potions 529 | ---------- 530 | 531 | "potions" 532 | ********** 533 | 534 | .. code-block:: lua 535 | 536 | "blubbery light silvery", "bright", "bubbly light green", "clear", "clotted dark turquoise", "clotted dark white", "clotted dark yellow", "clotted light green", "dull", "heavy light gray", "heavy light red", "misty light golden", "oily mercury", "opaque light magenta", "rusty", "shiny", "smelly light magenta", "smelly light mercury", "sparkling light yellow", "sparkling orange", "swirly light orange", "thick light brown", "thick pink", "thick violet", "thin dark cyan", "thin dark golden", "thin dark purple", "translucent light gray", "viscous light violet", "viscous white" 537 | 538 | 539 | Towns 540 | -------- 541 | 542 | "jice towns" 543 | ************* 544 | 545 | .. code-block:: lua 546 | 547 | "Aelmount", "Barrowash", "Barrowiron", "Beldale", "Crystalbarrow", "Deepdor", "Edgefall", "Fallford", "Glassash", "Golddale", "Goldfall", "Iceshade", "Millcoast", "Moonhill", "Raypond", "Rayshore", "Rockhaven", "Rockmist", "Rockmount", "Shadowiron", "Shadowshore", "Spellfield", "Springcastle", "Springhill", "Stonehaven", "Stonetown", "Summerbridge", "Swyncastle", "Winterlake", "Wintershore" 548 | 549 | 550 | "mingos towns" 551 | *************** 552 | 553 | .. code-block:: lua 554 | 555 | "Alesbank", "Aleswick", "Bellburg", "Bellton", "Browndorf", "Brunsholm", "Camppool", "Crystalmont", "Darkwood", "Dracwood", "Esterbrook Grove", "Fleetley", "Hazeston", "High Mableside", "Ironmoor", "Mareshire", "Marshbrook", "Middle Bellkirk", "Middle Fleetstead", "Old Brightway", "Oxstead", "Purpleham Annex", "Sowsburgh", "Stillburgh", "Watermoor", "Wolfriver", "Woolminster Crossing", "Woolshire", "Worcliff", "Worvale" 556 | 557 | 558 | Inns 559 | ------- 560 | 561 | "inns" 562 | ******* 563 | 564 | .. code-block:: lua 565 | 566 | "The Babbling Staff", "The Bountiful Chipmunk", "The Cerulean Helmet", "The Crying Tankard", "The Emerald Tiger", "The Fair Giant", "The Flying Wentiko", "The Grey Pine", "The Grey Vixen", "The Grinning Dog", "The Hopping Bobcat", "The Indigo Otter", "The Leaping Mug", "The Low Vixen", "The Maroon Giant", "The Mended Maiden", "The Old Moose", "The Orange Badger", "The Orange Giant", "The Risen Cougar", "The Rolling Vixen", "The Royal Sceptre", "The Running Alerion", "The Silver Staff", "The Sparkling Peasant", "The Tall Wolf", "The Velvet Cask", "The Vile Crown", "The Weeping Tiger", "The Winding Ass" 567 | 568 | -------------------------------------------------------------------------------- /doc/make_doc.lua: -------------------------------------------------------------------------------- 1 | local inspect = require("inspect") 2 | local SRC = "README.rst" 3 | local DEST = "../README.rst" 4 | 5 | require("write_examples") 6 | 7 | local function literalinclude(block_args) 8 | local file = io.input(block_args["fn_arg"]) 9 | local s = file:read("*a") 10 | file:close() 11 | return s 12 | end 13 | 14 | local parsers = {literalinclude = literalinclude} 15 | 16 | local function parse_block(block_args) 17 | -- print(inspect(block_args)) 18 | local fn = parsers[block_args["fn"]] 19 | return fn(block_args) 20 | end 21 | 22 | local function parse_lines() 23 | local dest = "" 24 | 25 | local inside_block = false 26 | local block_args 27 | for line in io.lines(SRC) do 28 | if inside_block then 29 | if line == nil or line == "" or line:sub(1) ~= " " then 30 | inside_block = false 31 | dest = dest .. parse_block(block_args) .. "\n" 32 | else 33 | local field, value = line:match("^ +:([%a-]+): *(.+)$") 34 | -- print("inside_block", field, value) 35 | block_args[field] = value 36 | end 37 | else 38 | local field, arg = line:match("^%.%. *(.+):: *(.+)$") 39 | if field and parsers[field] then 40 | block_args = {} 41 | block_args["fn"] = field 42 | block_args["fn_arg"] = arg 43 | inside_block = true 44 | -- print("inside_block", field, parsers[field]) 45 | else 46 | dest = dest .. line .. "\n" 47 | end 48 | end 49 | end 50 | local file = io.open(DEST, "w+") 51 | file:write(dest) 52 | file:close() 53 | end 54 | 55 | parse_lines() 56 | -------------------------------------------------------------------------------- /doc/write_examples.lua: -------------------------------------------------------------------------------- 1 | local inspect = require("inspect") 2 | local namegen = require("namegen") 3 | 4 | local DEST = "examples.rst" 5 | local dest = "" 6 | 7 | math.randomseed(1) 8 | math.random() 9 | 10 | local sets = namegen.get_sets() 11 | table.sort(sets) 12 | local groups = { 13 | {"Books"}, 14 | {"Creatures"}, 15 | {"Potions"}, 16 | {"Towns"}, 17 | {"Inns"}, 18 | } 19 | 20 | for _, set in ipairs(sets) do 21 | if string.find(set, "books$") then 22 | Books = groups[1] 23 | Books[#Books + 1] = set 24 | elseif string.find(set, "potions$") then 25 | Potions = groups[3] 26 | Potions[#Potions + 1] = set 27 | elseif string.find(set, "towns$") then 28 | Towns = groups[4] 29 | Towns[#Towns + 1] = set 30 | elseif string.find(set, "inns$") then 31 | Inns = groups[5] 32 | Inns[#Inns + 1] = set 33 | else 34 | Creatures = groups[2] 35 | Creatures[#Creatures + 1] = set 36 | end 37 | end 38 | 39 | 40 | for _, t in ipairs(groups) do 41 | local group = t[1] 42 | dest = dest .. ("\n" .. string.format([[%s]], group)) 43 | dest = dest .. ("\n" .. string.gsub(group, ".", "-") .. "---\n") 44 | 45 | for i = 2, #t do 46 | local set = t[i] 47 | -- print(group, set) 48 | dest = dest .. ("\n" .. string.format([["%s"]], set)) 49 | dest = dest .. ("\n" .. string.gsub(set, ".", "*") .. "***\n") 50 | dest = dest .. ("\n" .. ".. code-block:: lua" .. "\n") 51 | 52 | local names = {} 53 | local s = 0 54 | while s < 30 do 55 | local str = namegen.generate(set) 56 | if names[str] == nil then 57 | names[str] = str 58 | s = s + 1 59 | end 60 | end 61 | 62 | local names, old = {}, names 63 | for _, v in pairs(old) do 64 | names[#names + 1] = v 65 | end 66 | table.sort(names) 67 | dest = dest .. ("\n " .. inspect(names):gsub("[{}]", "") .. "\n\n") 68 | end 69 | end 70 | 71 | local file = io.open(DEST, "w+") 72 | file:write(dest) 73 | file:close() 74 | -------------------------------------------------------------------------------- /git-pull.bat: -------------------------------------------------------------------------------- 1 | @git pull 2 | 3 | @pause 4 | -------------------------------------------------------------------------------- /namegen.index: -------------------------------------------------------------------------------- 1 | data/creatures.cfg 2 | data/potions.cfg 3 | data/books.cfg 4 | data/towns.cfg 5 | data/inns.cfg 6 | -------------------------------------------------------------------------------- /namegen.lua: -------------------------------------------------------------------------------- 1 | local PATH = string.match(debug.getinfo(1,"S").source, 2 | "^@(.+/)[%a%-%d_]+%.lua$") or "./" 3 | 4 | local namegen = { 5 | _VERSION = 'LuaNameGen - Lua Name Generator v1.0.0', 6 | _DESCRIPTION = 'A name generator written in Lua', 7 | _URL = 'https://github.com/LukeMS/lua-namegen', 8 | _LICENSE = [[ 9 | MIT LICENSE 10 | 11 | Copyright (c) 2017 Lucas Siqueira 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | ]] 19 | } 20 | 21 | local function loadrequire(module) 22 | local loaded 23 | local function requiref(module) 24 | loaded = require(module) 25 | end 26 | pcall(requiref, module) 27 | return loaded 28 | end 29 | 30 | local RangedTable = require("namegen.rangedtable") 31 | 32 | local inspect = loadrequire('inspect') or function(t) 33 | s = "{" 34 | for k, v in pairs(t) do 35 | s = s .. string.format("%s: %s;", k, v) 36 | end 37 | s = s .. "}" 38 | return s 39 | end 40 | 41 | 42 | -- ====================== 43 | -- CONSTANTS 44 | -- ====================== 45 | 46 | -- set this to true for a debug/verbose mode 47 | -- requires 'inspect' (https://github.com/kikito/inspect.lua) 48 | local DEBUG = false 49 | 50 | 51 | -- ====================== 52 | -- VARIABLES 53 | -- ====================== 54 | 55 | -- the table containing the generators 56 | local namegen_generators_list = {} 57 | 58 | 59 | -- ====================== 60 | -- UTILITIES 61 | -- ====================== 62 | 63 | local function file_exists(name) 64 | local f=io.open(name,"r") 65 | if f~=nil then io.close(f) return true else return false end 66 | end 67 | 68 | local function get_path(filename) 69 | if filename:find("%.cfg$") then 70 | return PATH .. filename 71 | else 72 | return PATH .. filename .. ".cfg" 73 | end 74 | end 75 | 76 | local function split(str) 77 | local t = {} 78 | for v in string.gmatch(str:gsub(",", ""), "%S+") do 79 | t[#t + 1] = v 80 | end 81 | return t 82 | end 83 | 84 | local function ng_debug(str, ...) 85 | if DEBUG == true then 86 | if ... then 87 | print(string.format(str, ...)) 88 | else 89 | print(str) 90 | end 91 | end 92 | end 93 | 94 | 95 | -- ====================== 96 | -- PARSERS 97 | -- ====================== 98 | 99 | local function parse_rules(rules) 100 | local rules_weight = {} 101 | local rule_pattern = [[^%%*(%d*)(%S+)]] 102 | for _, v in pairs(rules) do 103 | local chance, rule = string.match(v, rule_pattern) 104 | ng_debug([[chance: "%s", rule: "%s"]], chance, rule) 105 | chance = chance == "" and 100 or tonumber(chance) 106 | rules_weight[#rules_weight + 1] = {chance, rule} 107 | end 108 | ng_debug(inspect(rules), inspect(rules_weight)) 109 | return RangedTable(rules_weight) 110 | end 111 | 112 | local function parse_property(name, value, parser_data) 113 | local v = name == "name" and value or split(value) 114 | if name == "name" then 115 | ng_debug([[parse_property: "%s"]], value) 116 | parser_data["name"] = v 117 | elseif name == "syllablesStart" then 118 | parser_data["start"] = v 119 | elseif name == "syllablesMiddle" then 120 | parser_data["middle"] = v 121 | elseif name == "syllablesEnd" then 122 | parser_data["end"] = v 123 | elseif name =="syllablesPre" then 124 | parser_data["pre"] = v 125 | elseif name =="syllablesPost" then 126 | parser_data["post"] = v 127 | elseif name == "phonemesVocals" then 128 | parser_data["vocals"] = v 129 | elseif name =="phonemesConsonants" then 130 | parser_data.consonants = v 131 | elseif name == "rules" then 132 | parser_data["rules"] = parse_rules(v) 133 | elseif name == "illegal" then 134 | -- /* illegal strings are converted to lowercase */ 135 | parser_data.illegal = split(string.lower(value)) 136 | else 137 | local cg = string.match(name, "^customGroup(%a)") 138 | if cg then 139 | parser_data["cg" .. cg:lower()] = v 140 | else 141 | ng_debug("parse_property else") 142 | return false 143 | end 144 | end 145 | return true 146 | end 147 | 148 | local function parse_lines(path, data) 149 | ng_debug("starting `parse_lines`", path) 150 | local data 151 | local name_pattern = [[name ?"(.+)" ?{]] 152 | local property_pattern = [[ +(.+) = "(.+)"]] 153 | local end_body_pattern = [[}]] 154 | 155 | local body = false 156 | for line in io.lines(path) do 157 | local name = string.match(line, name_pattern) 158 | if name ~= nil then 159 | namegen_generators_list[name] = {} 160 | data = namegen_generators_list[name] 161 | parse_property("name", name, data) 162 | body = true 163 | elseif body == true then 164 | if string.match(line, end_body_pattern) then 165 | body = false 166 | else 167 | local name, value = string.match(line, property_pattern) 168 | if name and value then 169 | parse_property(name, value, data) 170 | end 171 | end 172 | end 173 | end 174 | ng_debug("ending `parse_lines`") 175 | end 176 | 177 | local function parse_file(filename) 178 | ng_debug("starting `parse_file`") 179 | local path = get_path(filename) 180 | if not file_exists(path) then 181 | error(string.format("File \"%s\" not found!\n",path)) 182 | end 183 | parse_lines(get_path(filename)) 184 | ng_debug("ending `parse_file`") 185 | end 186 | 187 | local function parse_index() 188 | ng_debug("starting `parse_index`") 189 | 190 | for line in io.lines(PATH .. "namegen.index") do 191 | parse_file(line) 192 | end 193 | ng_debug("ending `parse_index`") 194 | end 195 | 196 | 197 | -- ====================== 198 | -- WORD VALIDATION 199 | -- ====================== 200 | 201 | -- check for occurrences of triple characters (case-insensitive) 202 | local function word_has_triples(str) 203 | local str = str:lower() 204 | for i = 1, #str - 2 do 205 | local a = str:sub(i, i) 206 | local b = str:sub(i+1, i+1) 207 | local c = str:sub(i+2, i+2) 208 | if a == b and a == c then 209 | return true 210 | end 211 | end 212 | return false 213 | end 214 | 215 | -- check for occurrences of illegal strings (case-insensitive) 216 | local function word_has_illegal(data, str) 217 | local str = str:lower() 218 | 219 | if not data.illegal then return false end 220 | 221 | for i = 1, #data.illegal do 222 | if str:find(data.illegal[i]) then 223 | return true 224 | end 225 | end 226 | return false 227 | end 228 | 229 | -- check for repeated syllables (case-insensitive) 230 | local function word_repeated_syllables(str) 231 | local word = str:lower():gsub("['%-_]", "") 232 | 233 | for step = 2, math.min(5, math.floor(#str / 2)) do 234 | for i = 1, #word - step + 1 do 235 | local search = word:sub(i, i + step - 1) 236 | local sub = word:sub(i + step, (i + step) + step - 1) 237 | if search == sub then 238 | return true 239 | end 240 | ng_debug("not repeatted", str, step, search, sub) 241 | end 242 | end 243 | return false 244 | end 245 | 246 | -- verify if the word passes the above checks 247 | local function word_is_ok(data, str) 248 | return ((#str > 0) and 249 | not word_has_triples(str) and 250 | not word_has_illegal(data, str) and 251 | not word_repeated_syllables(str)) 252 | end 253 | 254 | -- removes double, leading and ending spaces 255 | local function word_prune_spaces(str) 256 | str = str:gsub(" +$", "") 257 | str = str:gsub("^ +", "") 258 | str = str:gsub(" +", " ") 259 | return str 260 | end 261 | 262 | local function get_lst_from_token(token, data) 263 | if token == 'P' then 264 | ng_debug("token case 1") 265 | return data["pre"] 266 | elseif token == 's' then 267 | ng_debug("token case 2") 268 | return data["start"] 269 | elseif token == 'm' then 270 | ng_debug("token case 3") 271 | return data["middle"] 272 | elseif token == 'e' then 273 | ng_debug("token case 4") 274 | return data["end"] 275 | elseif token == 'p' then 276 | ng_debug("token case 5") 277 | return data["post"] 278 | elseif token == 'v' then 279 | ng_debug("token case 6") 280 | return data["vocals"] 281 | elseif token == 'c' then 282 | ng_debug("token case 7") 283 | return data["consonants"] 284 | elseif token == '?' then 285 | ng_debug("token case 8") 286 | return ((random(1, 2) == 1) and data.vocals or 287 | data.consonants) 288 | elseif token >= "A" and token < "P" then 289 | ng_debug("token case 9") 290 | return data["cg" .. token:lower()] 291 | elseif token == "'" then 292 | ng_debug("token case 10") 293 | return {"'"} 294 | end 295 | end 296 | 297 | local function generate_custom(name, rule) 298 | local random = math.random 299 | 300 | local data = namegen_generators_list[name] 301 | if data == nil then 302 | error(string.format("The name \"%s\" has not been found.\n",name)) 303 | end 304 | 305 | -- start name generation 306 | local buf, i, it 307 | repeat 308 | buf = "" 309 | i = 1 310 | while i <= #rule do 311 | it = rule:sub(i, i) 312 | -- append normal character 313 | if ((it >= 'a' and it <= 'z') or 314 | (it >= 'A' and it <= 'Z') or 315 | it == '\'' or it == '-') 316 | then 317 | ng_debug("buf case 1") 318 | buf = buf .. it 319 | elseif it == '/' then 320 | -- special character 321 | i = i + 1 322 | ng_debug("buf case 2") 323 | buf = buf .. it 324 | elseif it == '_' then 325 | -- convert underscore to space 326 | ng_debug("buf case 3") 327 | buf = buf .. " " 328 | -- interpret a wildcard 329 | elseif it == '$' then 330 | local chance = 100; 331 | i = i + 1 332 | local it = rule:sub(i, i) 333 | ng_debug("buf case 4, it: %s", it) 334 | -- food for the randomiser 335 | if it >= '0' and it <= '9' then 336 | ng_debug("buf case 4.1") 337 | chance = 0 338 | while it >= '0' and it <= '9' do 339 | chance = chance * 10 340 | chance = chance + tonumber(it) 341 | i = i + 1 342 | it = rule:sub(i, i); 343 | end 344 | end 345 | -- evaluate the wildcard according to its chance 346 | if chance >= random(100) then 347 | ng_debug("buf case 4.2") 348 | local lst = get_lst_from_token(it, data) 349 | if lst == nil then 350 | error(string.format( 351 | [[Wrong rules syntax(it:"%s", rule:"%s")]], 352 | it, rule)) 353 | end 354 | -- got the list, now choose something on it 355 | if #lst == 0 then 356 | error(string.format( 357 | "No data found in the requested string (wildcard %s). Check your name generation rule %s.", 358 | it,rule 359 | )) 360 | else 361 | buf = buf .. (lst[random(1, #lst)]:gsub('_', ' ')) 362 | end 363 | end 364 | end 365 | ng_debug([[i: %d, buf: %s, it: %s, rule: %s]], 366 | i, buf, it, rule) 367 | i = i + 1 368 | end 369 | until word_is_ok(data, buf) 370 | ng_debug([[ending "generate_custom 'repeat ... until'"]]) 371 | 372 | -- prune undesired spaces and return the name 373 | return word_prune_spaces(buf) 374 | end 375 | 376 | -- generate a new name with one of the rules from set 377 | local function generate(name) 378 | ng_debug([[starting "generate(%s)"]], name) 379 | local data = namegen_generators_list[name] 380 | if data == nil then 381 | error(string.format("The name \"%s\" has not been found.\n",name)) 382 | end 383 | -- check if the rules list is present */ 384 | if data.rules:size() == 0 then 385 | error("The rules list is empty!") 386 | end 387 | 388 | -- choose the rule */ 389 | local res = generate_custom(name, data.rules:choice()) 390 | ng_debug([[starting "generate(%s)"]], name) 391 | return res 392 | end 393 | 394 | local function possible_rules(str) 395 | local res = {[str] = true} 396 | while true do 397 | local changed = false 398 | local count = #res 399 | for rule, _ in pairs(res) do 400 | local chance_rule = rule:match( 401 | "%$?[%a_'%- ]*(%$%d+[%a_'%- ]+)%$*.*$") 402 | -- print(rule, chance_rule) 403 | if chance_rule then 404 | local a = rule:gsub(chance_rule, "") 405 | local b = rule:gsub("%$%d+", "$", 1) 406 | -- print(rule, a, b) 407 | res[rule] = nil 408 | res[a] = true 409 | res[b] = true 410 | changed = true 411 | break 412 | end 413 | end 414 | if not changed then break end 415 | end 416 | --[[ 417 | print(str) 418 | for k, _ in pairs(res) do 419 | print(k) 420 | end 421 | ]]-- 422 | return res 423 | end 424 | 425 | local function exhaust_rules(name) 426 | local data = namegen_generators_list[name] 427 | local rules = {} 428 | for v in data.rules:values() do 429 | rules[#rules + 1] = v 430 | end 431 | local plain_rules = {} 432 | for _, rule in ipairs(rules) do 433 | local possible = possible_rules(rule) 434 | for plain, _ in pairs(possible) do 435 | plain_rules[#plain_rules + 1] = plain 436 | end 437 | end 438 | return plain_rules 439 | end 440 | 441 | local function combine_strings(...) 442 | print(inspect(...)) 443 | local str 444 | for _, v in pairs(...) do 445 | str = (str and " " or "") .. v 446 | end 447 | return str 448 | end 449 | 450 | local function map_all(fcn, tab, idx, ...) 451 | -- http://stackoverflow.com/a/13059680/5496529 452 | if idx < 1 then 453 | fcn(...) 454 | else 455 | local t = tab[idx] 456 | for i = 1, #t do map_all(fcn, tab, idx-1, t[i], ...) end 457 | end 458 | end 459 | 460 | local function exhaust_set(name) 461 | local names = {} 462 | local data = namegen_generators_list[name] 463 | local rules = exhaust_rules(name) 464 | local function combine(...) 465 | local t = {...} 466 | local str 467 | for i, v in ipairs(t) do 468 | if v ~= nil and v ~= "" then 469 | str = (str and (str .. v) or v) 470 | end 471 | end 472 | print(str) 473 | str = word_prune_spaces(str) 474 | names[str] = str 475 | end 476 | for _, rule in ipairs(rules) do 477 | local groups = {} 478 | local tokens = split(rule:gsub("%$", " ")) 479 | for _, token in ipairs(tokens) do 480 | for c in string.gmatch(token, ".") do 481 | local lst = (get_lst_from_token(c, data) or 482 | {[1] = c:gsub("_", " ")}) 483 | if lst == nil then 484 | error("invalid list", c) 485 | end 486 | -- print("\ntoken", token, "c", c, "lst", inspect(lst)) 487 | groups[#groups + 1] = lst 488 | end 489 | end 490 | map_all(combine, groups, #groups) 491 | end 492 | return names 493 | end 494 | 495 | 496 | local function get_sets() 497 | local t = {} 498 | for k, _ in pairs(namegen_generators_list) do 499 | if namegen_generators_list[k].rules then 500 | t[#t + 1] = k 501 | end 502 | end 503 | return t 504 | end 505 | 506 | 507 | -- ------------------------------ 508 | -- load default sets (as specified on `namegen.index`) 509 | -- ------------------------------ 510 | parse_index() 511 | 512 | 513 | -- ------------------------------ 514 | -- publicly available functions 515 | -- ------------------------------ 516 | 517 | namegen.get_sets = get_sets 518 | namegen.parse_file = parse_file 519 | namegen.generate = generate 520 | namegen.generate_custom = generate_custom 521 | namegen.exhaust_set = exhaust_set 522 | namegen.exhaust_rules = exhaust_rules 523 | 524 | return namegen 525 | -------------------------------------------------------------------------------- /rangedtable.lua: -------------------------------------------------------------------------------- 1 | -- RangedTable - table with range or group entries 2 | -- Author: Lucas Siqueira 3 | -- License: Public Domain / CC0. 4 | 5 | local RangedTable = {} 6 | RangedTable.__index = RangedTable 7 | 8 | setmetatable(RangedTable, { 9 | __call = function(class, ...) 10 | local instance = setmetatable({}, class) 11 | if instance.initialize then 12 | instance:initialize(...) 13 | end 14 | return instance 15 | end 16 | }) 17 | 18 | local function cmp_number(k, t) 19 | for i = 1, #t do 20 | local entry = t[i] 21 | local range, v = entry[1], entry[2] 22 | if k >= range[1] and k <= range[2] then 23 | return v 24 | end 25 | end 26 | end 27 | 28 | local function cmp_group(k, t) 29 | for i = 1, #t do 30 | local entry = t[i] 31 | local group, v = entry[1], entry[2] 32 | for i = 1, #group do 33 | if k == group[i] then 34 | return v 35 | end 36 | end 37 | end 38 | end 39 | 40 | function RangedTable:get(k) 41 | local cmp = type(k) == "number" and cmp_number or cmp_group 42 | return cmp(k, self.ranges) 43 | end 44 | 45 | function RangedTable:keys() 46 | local i = 0 47 | return function() 48 | i = i + 1 49 | return self.ranges[i] and self.ranges[i][1] or nil 50 | end 51 | end 52 | 53 | function RangedTable:items() 54 | local i = 0 55 | return function() 56 | i = i + 1 57 | return self.ranges[i] and self.ranges[i][1] or nil, 58 | self.ranges[i] and self.ranges[i][2] or nil 59 | end 60 | end 61 | 62 | function RangedTable:values() 63 | local i = 0 64 | return function() 65 | i = i + 1 66 | return self.ranges[i] and self.ranges[i][2] or nil 67 | end 68 | end 69 | 70 | function RangedTable:choice() 71 | return self:get(math.random(1, self.max)) 72 | end 73 | 74 | function RangedTable:initialize(t) 75 | self.ranges = {} 76 | for i = 1, #t do 77 | self.ranges[#self.ranges + 1] = t[i] 78 | end 79 | self:normalize() 80 | return self 81 | end 82 | 83 | function RangedTable:size() 84 | return #self.ranges 85 | end 86 | 87 | function RangedTable:normalize() 88 | local normalized = {} 89 | local sum = 1 90 | local range 91 | for i = 1, #self.ranges do 92 | local entry = self.ranges[i] 93 | local chance = entry[1] 94 | local content = entry[2] 95 | if type(chance) == "number" then 96 | range = chance 97 | elseif #chance == 1 then 98 | range = chance[1] 99 | elseif type(chance[1]) == "string" then 100 | return 101 | else 102 | range = chance[2] - chance[1] + 1 103 | end 104 | normalized[#normalized + 1] = {{sum, sum + range - 1}, content} 105 | sum = sum + range 106 | end 107 | self.ranges = normalized 108 | self.max = sum - 1 109 | end 110 | 111 | 112 | return RangedTable 113 | -------------------------------------------------------------------------------- /test/test.lua: -------------------------------------------------------------------------------- 1 | local namegen = require("namegen") 2 | 3 | math.randomseed(os.time()) 4 | math.random() 5 | 6 | local sets = namegen.get_sets() 7 | 8 | local gen = {} 9 | for _, set in ipairs(sets) do 10 | gen[set] = gen[set] or {} 11 | for i = 1, 100 do 12 | local str = namegen.generate(set) 13 | gen[set][str] = (gen[set][str] or 0) +1 14 | end 15 | end 16 | 17 | for set, t in pairs(gen) do 18 | for k, v in pairs(t) do 19 | print(set, k, v) 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /test/test2.lua: -------------------------------------------------------------------------------- 1 | local inspect = require("inspect") 2 | local namegen = require("namegen") 3 | 4 | local rules = namegen.exhaust_rules("books") 5 | print(inspect(rules)) 6 | local names = namegen.exhaust_set("books") 7 | for _, v in pairs(names) do 8 | print(v) 9 | end 10 | -------------------------------------------------------------------------------- /test/test_race.lua: -------------------------------------------------------------------------------- 1 | local inspect = require("inspect") 2 | local namegen = require("namegen") 3 | 4 | math.randomseed(1) 5 | math.random() 6 | 7 | local names = {} 8 | local s = 0 9 | while s < 80 do 10 | local str = namegen.generate("tengu male") 11 | if names[str] == nil then 12 | names[str] = str 13 | s = s + 1 14 | end 15 | end 16 | 17 | local names, old = {}, names 18 | for _, v in pairs(old) do 19 | names[#names + 1] = v 20 | end 21 | table.sort(names) 22 | 23 | print(inspect(names)) 24 | 25 | --------------------------------------------------------------------------------