summaryrefslogtreecommitdiff
path: root/namegen.c
diff options
context:
space:
mode:
Diffstat (limited to 'namegen.c')
-rw-r--r--namegen.c1974
1 files changed, 1974 insertions, 0 deletions
diff --git a/namegen.c b/namegen.c
new file mode 100644
index 000000000..f5b4486c5
--- /dev/null
+++ b/namegen.c
@@ -0,0 +1,1974 @@
+#include "stdafx.h"
+#include "ttd.h"
+
+
+#define GETNUM(x, y) (((uint16)(seed >> x) * (y))>>16)
+
+static void AppendPart(byte **buf, int num, const char *names)
+{
+ byte *s;
+
+ while (--num>=0) {
+ do names++; while (names[-1]);
+ }
+
+ for(s=*buf; (*s++ = *names++) != 0;) {}
+ *buf = s - 1;
+}
+
+#define MK(x) x "\x0"
+
+#define NUM_ENGLISH_1 4
+static const char english_1[] =
+ MK("Great ")
+ MK("Little ")
+ MK("New ")
+ MK("Fort ")
+;
+
+#define NUM_ENGLISH_2 26
+static const char english_2[] =
+ MK("Wr")
+ MK("B")
+ MK("C")
+ MK("Ch")
+ MK("Br")
+ MK("D")
+ MK("Dr")
+ MK("F")
+ MK("Fr")
+ MK("Fl")
+ MK("G")
+ MK("Gr")
+ MK("H")
+ MK("L")
+ MK("M")
+ MK("N")
+ MK("P")
+ MK("Pr")
+ MK("Pl")
+ MK("R")
+ MK("S")
+ MK("S")
+ MK("Sl")
+ MK("T")
+ MK("Tr")
+ MK("W")
+;
+
+#define NUM_ENGLISH_3 8
+static const char english_3[] =
+ MK("ar")
+ MK("a")
+ MK("e")
+ MK("in")
+ MK("on")
+ MK("u")
+ MK("un")
+ MK("en")
+;
+
+#define NUM_ENGLISH_4 7
+static const char english_4[] =
+ MK("n")
+ MK("ning")
+ MK("ding")
+ MK("d")
+ MK("")
+ MK("t")
+ MK("fing")
+;
+
+#define NUM_ENGLISH_5 23
+static const char english_5[] =
+ MK("ville")
+ MK("ham")
+ MK("field")
+ MK("ton")
+ MK("town")
+ MK("bridge")
+ MK("bury")
+ MK("wood")
+ MK("ford")
+ MK("hall")
+ MK("ston")
+ MK("way")
+ MK("stone")
+ MK("borough")
+ MK("ley")
+ MK("head")
+ MK("bourne")
+ MK("pool")
+ MK("worth")
+ MK("hill")
+ MK("well")
+ MK("hattan")
+ MK("burg")
+;
+
+#define NUM_ENGLISH_6 9
+static const char english_6[] =
+ MK("-on-sea")
+ MK(" Bay")
+ MK(" Market")
+ MK(" Cross")
+ MK(" Bridge")
+ MK(" Falls")
+ MK(" City")
+ MK(" Ridge")
+ MK(" Springs")
+;
+
+static byte MakeEnglishTownName(byte *buf, uint32 seed)
+{
+ int i;
+ byte result;
+ byte *start;
+
+ i = GETNUM(0, 54) - 50;
+ if (i >= 0)
+ AppendPart(&buf, i, english_1);
+
+ start = buf;
+
+ AppendPart(&buf, GETNUM(4, NUM_ENGLISH_2), english_2);
+ AppendPart(&buf, GETNUM(7, NUM_ENGLISH_3), english_3);
+ AppendPart(&buf, GETNUM(10, NUM_ENGLISH_4), english_4);
+ AppendPart(&buf, GETNUM(13, NUM_ENGLISH_5), english_5);
+
+ i = GETNUM(15, NUM_ENGLISH_6 + 60) - 60;
+
+ result = 0;
+
+ if (i >= 0) {
+ if (i <= 1) result = NG_EDGE;
+ AppendPart(&buf, i, english_6);
+ }
+
+ if (start[0]=='C' && (start[1] == 'e' || start[1] == 'i'))
+ start[0] = 'K';
+
+ /* FIXME: skip the banned words thing for now
+ only replacing "Cunt" with "Cult" */
+ if (start[0]=='C' && start[1] == 'u' && start[2] == 'n' && start[3] == 't')
+ start[2] = 'l';
+
+ return result;
+}
+
+#define NUM_AUSTRIAN_A1 6
+static const char austrian_a1[] =
+ MK("Bad ")
+ MK("Deutsch ")
+ MK("Gross ")
+ MK("Klein ")
+ MK("Markt ")
+ MK("Maria ")
+;
+
+#define NUM_AUSTRIAN_A2 42
+static const char austrian_a2[] =
+ MK("Aus")
+ MK("Alten")
+ MK("Braun")
+ MK("Vösl")
+ MK("Mittern")
+ MK("Nuss")
+ MK("Neu")
+ MK("Walters")
+ MK("Breiten")
+ MK("Eisen")
+ MK("Feld")
+ MK("Mittern")
+ MK("Gall")
+ MK("Obern")
+ MK("Grat")
+ MK("Heiligen")
+ MK("Hof")
+ MK("Holla")
+ MK("Stein")
+ MK("Eber")
+ MK("Eggen")
+ MK("Enzers")
+ MK("Frauen")
+ MK("Herren")
+ MK("Hof")
+ MK("Hütt")
+ MK("Kaisers")
+ MK("Königs")
+ MK("Knittel")
+ MK("Lang")
+ MK("Ober")
+ MK("Ollers")
+ MK("Pfaffen")
+ MK("Potten")
+ MK("Salz")
+ MK("Schwarz")
+ MK("Stocker")
+ MK("Unter")
+ MK("Utten")
+ MK("Vösen")
+ MK("Vill")
+ MK("Weissen")
+;
+
+#define NUM_AUSTRIAN_A3 16
+static const char austrian_a3[] =
+ MK("see")
+ MK("bach")
+ MK("dorf")
+ MK("ach")
+ MK("stein")
+ MK("hofen")
+ MK("au")
+ MK("ach")
+ MK("kirch")
+ MK("kirchen")
+ MK("kreuz")
+ MK("brunn")
+ MK("siedl")
+ MK("markt")
+ MK("wang")
+ MK("haag")
+;
+
+#define NUM_AUSTRIAN_A4 12
+static const char austrian_a4[] =
+ MK("Bruck")
+ MK("Brunn")
+ MK("Gams")
+ MK("Grein")
+ MK("Ried")
+ MK("Faak")
+ MK("Zell")
+ MK("Spital")
+ MK("Kirchberg")
+ MK("Saal")
+ MK("Taferl")
+ MK("Wald")
+;
+
+#define NUM_AUSTRIAN_A5 2
+static const char austrian_a5[] =
+ MK("St. ")
+ MK("Sankt ")
+;
+
+#define NUM_AUSTRIAN_A6 20
+static const char austrian_a6[] =
+ MK("Aegyd")
+ MK("Andrä")
+ MK("Georgen")
+ MK("Jakob")
+ MK("Johann")
+ MK("Leonhard")
+ MK("Marein")
+ MK("Lorenzen")
+ MK("Margarethen")
+ MK("Martin")
+ MK("Michael")
+ MK("Nikolai")
+ MK("Oswald")
+ MK("Peter")
+ MK("Pölten")
+ MK("Stefan")
+ MK("Stephan")
+ MK("Thomas")
+ MK("Veit")
+ MK("Wolfgang")
+;
+
+#define NUM_AUSTRIAN_F1 2
+static const char austrian_f1[] =
+ MK(" an der ")
+ MK(" ob der ")
+;
+
+#define NUM_AUSTRIAN_F2 13
+static const char austrian_f2[] =
+ MK("Donau")
+ MK("Steyr")
+ MK("Lafnitz")
+ MK("Leitha")
+ MK("Thaya")
+ MK("Gail")
+ MK("Drau")
+ MK("Salzach")
+ MK("Ybbs")
+ MK("Traisen")
+ MK("Enns")
+ MK("Mur")
+ MK("Ill")
+;
+
+#define NUM_AUSTRIAN_B1 1
+static const char austrian_b1[] =
+ MK(" am ")
+;
+
+#define NUM_AUSTRIAN_B2 10
+static const char austrian_b2[] =
+ MK("Brenner")
+ MK("Dachstein")
+ MK("Gebirge")
+ MK("Grossglockner")
+ MK("Hausruck")
+ MK("Semmering")
+ MK("Wagram")
+ MK("Wechsel")
+ MK("Wilden Kaiser")
+ MK("Ziller")
+;
+
+static byte MakeAustrianTownName(byte *buf, uint32 seed)
+{
+ int i, j=0;
+
+ // Bad, Maria, Gross, ...
+ i = GETNUM(0, NUM_AUSTRIAN_A1 + 15) - 15;
+ if (i >= 0) AppendPart(&buf, i, austrian_a1);
+
+ i = GETNUM(4, 6);
+ if(i >= 4) {
+ // Kaisers-kirchen
+ AppendPart(&buf, GETNUM( 7, NUM_AUSTRIAN_A2), austrian_a2);
+ AppendPart(&buf, GETNUM(13, NUM_AUSTRIAN_A3), austrian_a3);
+ }
+ else if(i >= 2) {
+ // St. Johann
+ AppendPart(&buf, GETNUM( 7, NUM_AUSTRIAN_A5), austrian_a5);
+ AppendPart(&buf, GETNUM( 9, NUM_AUSTRIAN_A6), austrian_a6);
+ j=1; // More likely to have a " an der " or " am "
+ }
+ else {
+ // Zell
+ AppendPart(&buf, GETNUM( 7, NUM_AUSTRIAN_A4), austrian_a4);
+ }
+
+ i = GETNUM(1, 6);
+ if(i >= 4-j) {
+ // an der Donau (rivers)
+ AppendPart(&buf, GETNUM(4, NUM_AUSTRIAN_F1), austrian_f1);
+ AppendPart(&buf, GETNUM(5, NUM_AUSTRIAN_F2), austrian_f2);
+ }
+ else if(i >= 2-j) {
+ // am Dachstein (mountains)
+ AppendPart(&buf, GETNUM(4, NUM_AUSTRIAN_B1), austrian_b1);
+ AppendPart(&buf, GETNUM(5, NUM_AUSTRIAN_B2), austrian_b2);
+ }
+
+ return 0;
+}
+
+#define NUM_GERMAN_1 114
+#define NUM_GERMAN_1_HARDCODED 21
+static const char german_1[] =
+ /* hardcoded names */
+ MK("Berlin")
+ MK("Bonn")
+ MK("Bremen")
+ MK("Cottbus")
+ MK("Chemnitz")
+ MK("Dortmund")
+ MK("Dresden")
+ MK("Erfurt")
+ MK("Erlangen")
+ MK("Essen")
+ MK("Fulda")
+ MK("Gera")
+ MK("Kassel")
+ MK("Kiel")
+ MK("Köln")
+ MK("Lübeck")
+ MK("Magdeburg")
+ MK("München")
+ MK("Potsdam")
+ MK("Stuttgart")
+ MK("Wiesbaden")
+ /* randomizer names */
+ MK("Alb")
+ MK("Als")
+ MK("Ander")
+ MK("Arns")
+ MK("Bruns")
+ MK("Bam")
+ MK("Biele")
+ MK("Cloppen")
+ MK("Co")
+ MK("Duis")
+ MK("Düssel")
+ MK("Dannen")
+ MK("Elb")
+ MK("Els")
+ MK("Elster")
+ MK("Eichen")
+ MK("Ems")
+ MK("Fahr")
+ MK("Falken")
+ MK("Flens")
+ MK("Frank")
+ MK("Frei")
+ MK("Freuden")
+ MK("Fried")
+ MK("Fürsten")
+ MK("Hahn")
+ MK("Ham")
+ MK("Harz")
+ MK("Heidel")
+ MK("Hers")
+ MK("Herz")
+ MK("Holz")
+ MK("Hildes")
+ MK("Inns")
+ MK("Ilsen")
+ MK("Ingols")
+ MK("Kel")
+ MK("Kies")
+ MK("Korn")
+ MK("Kor")
+ MK("Kreuz")
+ MK("Kulm")
+ MK("Langen")
+ MK("Lim")
+ MK("Lohr")
+ MK("Lüne")
+ MK("Mel")
+ MK("Michels")
+ MK("Mühl")
+ MK("Naum")
+ MK("Nest")
+ MK("Nord")
+ MK("Nort")
+ MK("Nien")
+ MK("Nidda")
+ MK("Nieder")
+ MK("Nürn")
+ MK("Ober")
+ MK("Offen")
+ MK("Osna")
+ MK("Olden")
+ MK("Ols")
+ MK("Oranien")
+ MK("Pader")
+ MK("Quedlin")
+ MK("Quer")
+ MK("Ravens")
+ MK("Regens")
+ MK("Rott")
+ MK("Ros")
+ MK("Rüssels")
+ MK("Saal")
+ MK("Saar")
+ MK("Salz")
+ MK("Schöne")
+ MK("Schwein")
+ MK("Sonder")
+ MK("Sonnen")
+ MK("Stein")
+ MK("Strals")
+ MK("Straus")
+ MK("Süd")
+ MK("Ton")
+ MK("Unter")
+ MK("Ur")
+ MK("Vor")
+ MK("Wald")
+ MK("War")
+ MK("Wert")
+ MK("Wester")
+ MK("Witten")
+ MK("Wolfs")
+ MK("Würz")
+;
+
+#define NUM_GERMAN_2 16
+static const char german_2[] =
+ MK("bach")
+ MK("berg")
+ MK("brück")
+ MK("brücken")
+ MK("burg")
+ MK("dorf")
+ MK("feld")
+ MK("furt")
+ MK("hausen")
+ MK("haven")
+ MK("heim")
+ MK("horst")
+ MK("mund")
+ MK("münster")
+ MK("stadt")
+ MK("wald")
+;
+
+#define NUM_GERMAN_3 5
+static const char german_3[] =
+ MK(" an der ")
+ MK(" am ")
+ MK("Bad ")
+ MK("Klein ")
+ MK("Neu ")
+;
+
+#define NUM_GERMAN_4 6
+#define NUM_GERMAN_4_PRECHANGE 5
+static const char german_4[] =
+ /* use "an der" */
+ MK("Oder")
+ MK("Spree")
+ MK("Donau")
+ MK("Saale")
+ MK("Elbe")
+ /* use "am" */
+ MK("Main")
+
+;
+
+static byte MakeGermanTownName(byte *buf, uint32 seed)
+{
+ int i;
+ int ext;
+
+ ext=GETNUM(7, 28); /* Extension - Prefix / Suffix */
+
+ if ((ext==12) || (ext==19)) {
+ i=GETNUM(2,NUM_GERMAN_3-2);
+ AppendPart(&buf, 2+i, german_3);
+ }
+
+
+ i=GETNUM(3,NUM_GERMAN_1);
+
+ AppendPart(&buf, i, german_1);
+
+ if (i>NUM_GERMAN_1_HARDCODED-1) {
+ AppendPart(&buf, GETNUM(5, NUM_GERMAN_2), german_2);
+ }
+
+ if (ext==24) {
+ i=GETNUM(9,NUM_GERMAN_4);
+
+ if (i<=NUM_GERMAN_4_PRECHANGE-1) {
+ AppendPart(&buf, 0, german_3);
+ AppendPart(&buf, i, german_4);
+ } else {
+ AppendPart(&buf, 1, german_3);
+ AppendPart(&buf, i, german_4);
+ }
+ }
+
+ return 0;
+}
+
+#define NUM_SPANISH_1 86
+static const char spanish_1[] =
+ MK("Caracas")
+ MK("Maracay")
+ MK("Maracaibo")
+ MK("Velencia")
+ MK("El Dorado")
+ MK("Morrocoy")
+ MK("Cata")
+ MK("Cataito")
+ MK("Ciudad Bolivar")
+ MK("Barquisimeto")
+ MK("Merida")
+ MK("Puerto Ordaz")
+ MK("Santa Elena")
+ MK("San Juan")
+ MK("San Luis")
+ MK("San Rafael")
+ MK("Santiago")
+ MK("Barcelona")
+ MK("Barinas")
+ MK("San Cristobal")
+ MK("San Fransisco")
+ MK("San Martin")
+ MK("Guayana")
+ MK("San Carlos")
+ MK("El Limon")
+ MK("Coro")
+ MK("Corocoro")
+ MK("Puerto Ayacucho")
+ MK("Elorza")
+ MK("Arismendi")
+ MK("Trujillo")
+ MK("Carupano")
+ MK("Anaco")
+ MK("Lima")
+ MK("Cuzco")
+ MK("Iquitos")
+ MK("Callao")
+ MK("Huacho")
+ MK("Camana")
+ MK("Puerto Chala")
+ MK("Santa Cruz")
+ MK("Quito")
+ MK("Cuenca")
+ MK("Huacho")
+ MK("Tulcan")
+ MK("Esmereldas")
+ MK("Ibarra")
+ MK("San Lorenzo")
+ MK("Macas")
+ MK("Morana")
+ MK("Machala")
+ MK("Zamora")
+ MK("Latacunga")
+ MK("Tena")
+ MK("Cochabamba")
+ MK("Ascencion")
+ MK("Magdalena")
+ MK("Santa Ana")
+ MK("Manoa")
+ MK("Sucre")
+ MK("Oruro")
+ MK("Uyuni")
+ MK("Potosi")
+ MK("Tupiza")
+ MK("La Quiaca")
+ MK("Yacuiba")
+ MK("San Borja")
+ MK("Fuerte Olimpio")
+ MK("Fortin Esteros")
+ MK("Campo Grande")
+ MK("Bogota")
+ MK("El Banco")
+ MK("Zaragosa")
+ MK("Neiva")
+ MK("Mariano")
+ MK("Cali")
+ MK("La Palma")
+ MK("Andoas")
+ MK("Barranca")
+ MK("Montevideo")
+ MK("Valdivia")
+ MK("Arica")
+ MK("Temuco")
+ MK("Tocopilla")
+ MK("Mendoza")
+ MK("Santa Rosa");
+
+static byte MakeSpanishTownName(byte *buf, uint32 seed)
+{
+ AppendPart(&buf, GETNUM(0, NUM_SPANISH_1), spanish_1);
+ return 0;
+}
+
+#define NUM_FRENCH_1 70
+static const char french_1[] =
+ MK("Agincourt")
+ MK("Lille")
+ MK("Dinan")
+ MK("Aubusson")
+ MK("Rodez")
+ MK("Bergerac")
+ MK("Bordeaux")
+ MK("Bayonne")
+ MK("Montpellier")
+ MK("Montelimar")
+ MK("Valence")
+ MK("Digne")
+ MK("Nice")
+ MK("Cannes")
+ MK("St. Tropez")
+ MK("Marseilles")
+ MK("Narbonne")
+ MK("Sčte")
+ MK("Aurillac")
+ MK("Gueret")
+ MK("Le Creusot")
+ MK("Nevers")
+ MK("Auxerre")
+ MK("Versailles")
+ MK("Meaux")
+ MK("Châlons")
+ MK("Compičgne")
+ MK("Metz")
+ MK("Chaumont")
+ MK("Langres")
+ MK("Bourg")
+ MK("Lyons")
+ MK("Vienne")
+ MK("Grenoble")
+ MK("Toulon")
+ MK("Rennes")
+ MK("Le Mans")
+ MK("Angers")
+ MK("Nantes")
+ MK("Châteauroux")
+ MK("Orléans")
+ MK("Lisieux")
+ MK("Cherbourg")
+ MK("Morlaix")
+ MK("Cognac")
+ MK("Agen")
+ MK("Tulle")
+ MK("Blois")
+ MK("Troyes")
+ MK("Charolles")
+ MK("Grenoble")
+ MK("Chambéry")
+ MK("Tours")
+ MK("St. Brieuc")
+ MK("St. Malo")
+ MK("La Rochelle")
+ MK("St. Flour")
+ MK("Le Puy")
+ MK("Vichy")
+ MK("St. Valery")
+ MK("Beaujolais")
+ MK("Narbonne")
+ MK("Albi")
+ MK("St. Valery")
+ MK("Biarritz")
+ MK("Béziers")
+ MK("Nîmes")
+ MK("Chamonix")
+ MK("Angoulčme")
+ MK("Alençon");
+
+static byte MakeFrenchTownName(byte *buf, uint32 seed)
+{
+ AppendPart(&buf, GETNUM(0, NUM_FRENCH_1), french_1);
+ return 0;
+}
+
+static byte MakeAmericanTownName(byte *buf, uint32 seed)
+{
+ // make american town names equal to english for now.
+ return MakeEnglishTownName(buf, seed);
+}
+
+#define NUM_SILLY_1 88
+static const char silly_1[] =
+ MK("Binky")
+ MK("Blubber")
+ MK("Bumble")
+ MK("Crinkle")
+ MK("Crusty")
+ MK("Dangle")
+ MK("Dribble")
+ MK("Flippety")
+ MK("Google")
+ MK("Muffin")
+
+ MK("Nosey")
+ MK("Pinker")
+ MK("Quack")
+ MK("Rumble")
+ MK("Sleepy")
+ MK("Sliggles")
+ MK("Snooze")
+ MK("Teddy")
+ MK("Tinkle")
+ MK("Twister")
+
+ MK("Pinker")
+ MK("Hippo")
+ MK("Itchy")
+ MK("Jelly")
+ MK("Jingle")
+ MK("Jolly")
+ MK("Kipper")
+ MK("Lazy")
+ MK("Frogs")
+ MK("Mouse")
+
+ MK("Quack")
+ MK("Cheeky")
+ MK("Lumpy")
+ MK("Grumpy")
+ MK("Mangle")
+ MK("Fiddle")
+ MK("Slugs")
+ MK("Noodles")
+ MK("Poodles")
+ MK("Shiver")
+
+ MK("Rumble")
+ MK("Pixie")
+ MK("Puddle")
+ MK("Riddle")
+ MK("Rattle")
+ MK("Rickety")
+ MK("Waffle")
+ MK("Sagging")
+ MK("Sausage")
+ MK("Egg")
+
+ MK("Sleepy")
+ MK("Scatter")
+ MK("Scramble")
+ MK("Silly")
+ MK("Simple")
+ MK("Tricky")
+ MK("Slippery")
+ MK("Slimey")
+ MK("Slumber")
+ MK("Soggy")
+
+ MK("Sliggles")
+ MK("Splutter")
+ MK("Sulky")
+ MK("Swindle")
+ MK("Swivel")
+ MK("Tasty")
+ MK("Tangle")
+ MK("Toggle")
+ MK("Trotting")
+ MK("Tumble")
+
+ MK("Snooze")
+ MK("Water")
+ MK("Windy")
+ MK("Amble")
+ MK("Bubble")
+ MK("Cheery")
+ MK("Cheese")
+ MK("Cockle")
+ MK("Cracker")
+ MK("Crumple")
+
+ MK("Teddy")
+ MK("Evil")
+ MK("Fairy")
+ MK("Falling")
+ MK("Fishy")
+ MK("Fizzle")
+ MK("Frosty")
+ MK("Griddle")
+;
+
+#define NUM_SILLY_2 15
+static const char silly_2[] =
+ MK("ton")
+ MK("bury")
+ MK("bottom")
+ MK("ville")
+ MK("well")
+ MK("weed")
+ MK("worth")
+ MK("wig")
+ MK("wick")
+ MK("wood")
+
+ MK("pool")
+ MK("head")
+ MK("burg")
+ MK("gate")
+ MK("bridge")
+;
+
+
+static byte MakeSillyTownName(byte *buf, uint32 seed)
+{
+ AppendPart(&buf, GETNUM(0, NUM_SILLY_1), silly_1);
+ AppendPart(&buf, GETNUM(16, NUM_SILLY_2),silly_2);
+ return 0;
+}
+
+
+#define NUM_SWEDISH_1 4
+static const char swedish_1[] =
+ MK("Gamla ")
+ MK("Lilla ")
+ MK("Nya ")
+ MK("Stora ");
+
+#define NUM_SWEDISH_2 38
+static const char swedish_2[] =
+ MK("Boll")
+ MK("Bor")
+ MK("Ed")
+ MK("En")
+ MK("Erik")
+ MK("Es")
+ MK("Fin")
+ MK("Fisk")
+ MK("Grön")
+ MK("Hag")
+ MK("Halm")
+ MK("Karl")
+ MK("Kram")
+ MK("Kung")
+ MK("Land")
+ MK("Lid")
+ MK("Lin")
+ MK("Mal")
+ MK("Malm")
+ MK("Marie")
+ MK("Ner")
+ MK("Norr")
+ MK("Oskar")
+ MK("Sand")
+ MK("Skog")
+ MK("Stock")
+ MK("Stor")
+ MK("Ström")
+ MK("Sund")
+ MK("Söder")
+ MK("Tall")
+ MK("Tratt")
+ MK("Troll")
+ MK("Upp")
+ MK("Var")
+ MK("Väster")
+ MK("Ängel")
+ MK("Öster");
+
+#define NUM_SWEDISH_2A 42
+static const char swedish_2a[] =
+ MK("B")
+ MK("Br")
+ MK("D")
+ MK("Dr")
+ MK("Dv")
+ MK("F")
+ MK("Fj")
+ MK("Fl")
+ MK("Fr")
+ MK("G")
+ MK("Gl")
+ MK("Gn")
+ MK("Gr")
+ MK("H")
+ MK("J")
+ MK("K")
+ MK("Kl")
+ MK("Kn")
+ MK("Kr")
+ MK("Kv")
+ MK("L")
+ MK("M")
+ MK("N")
+ MK("P")
+ MK("Pl")
+ MK("Pr")
+ MK("R")
+ MK("S")
+ MK("Sk")
+ MK("Skr")
+ MK("Sl")
+ MK("Sn")
+ MK("Sp")
+ MK("Spr")
+ MK("St")
+ MK("Str")
+ MK("Sv")
+ MK("T")
+ MK("Tr")
+ MK("Tv")
+ MK("V")
+ MK("Vr");
+
+#define NUM_SWEDISH_2B 9
+static const char swedish_2b[] =
+ MK("a")
+ MK("e")
+ MK("i")
+ MK("o")
+ MK("u")
+ MK("y")
+ MK("ĺ")
+ MK("ä")
+ MK("ö");
+
+#define NUM_SWEDISH_2C 26
+static const char swedish_2c[] =
+ MK("ck")
+ MK("d")
+ MK("dd")
+ MK("g")
+ MK("gg")
+ MK("l")
+ MK("ld")
+ MK("m")
+ MK("n")
+ MK("nd")
+ MK("ng")
+ MK("nn")
+ MK("p")
+ MK("pp")
+ MK("r")
+ MK("rd")
+ MK("rk")
+ MK("rp")
+ MK("rr")
+ MK("rt")
+ MK("s")
+ MK("sk")
+ MK("st")
+ MK("t")
+ MK("tt")
+ MK("v");
+
+#define NUM_SWEDISH_3 32
+static const char swedish_3[] =
+ MK("arp")
+ MK("berg")
+ MK("boda")
+ MK("borg")
+ MK("bro")
+ MK("bukten")
+ MK("by")
+ MK("byn")
+ MK("fors")
+ MK("hammar")
+ MK("hamn")
+ MK("holm")
+ MK("hus")
+ MK("hättan")
+ MK("kulle")
+ MK("köping")
+ MK("lund")
+ MK("löv")
+ MK("sala")
+ MK("skrona")
+ MK("slätt")
+ MK("spĺng")
+ MK("stad")
+ MK("sund")
+ MK("svall")
+ MK("svik")
+ MK("sĺker")
+ MK("udde")
+ MK("valla")
+ MK("viken")
+ MK("älv")
+ MK("ĺs");
+
+static byte MakeSwedishTownName(byte *buf, uint32 seed)
+{
+ int i;
+
+ i = GETNUM(0, 50 + NUM_SWEDISH_1) - 50;
+ if (i >= 0) AppendPart(&buf, i, swedish_1);
+
+ if (GETNUM(4, 5) >= 3)
+ AppendPart(&buf, GETNUM(7, NUM_SWEDISH_2), swedish_2);
+ else {
+ AppendPart(&buf, GETNUM(7, NUM_SWEDISH_2A), swedish_2a);
+ AppendPart(&buf, GETNUM(10, NUM_SWEDISH_2B), swedish_2b);
+ AppendPart(&buf, GETNUM(13, NUM_SWEDISH_2C), swedish_2c);
+ }
+
+ AppendPart(&buf, GETNUM(16, NUM_SWEDISH_3), swedish_3);
+
+ return 0;
+}
+
+
+#define NUM_DUTCH_1 8
+static const char dutch_1[] =
+ MK("Nieuw ")
+ MK("Oud ")
+ MK("Groot ")
+ MK("Zuid ")
+ MK("Noord ")
+ MK("Oost ")
+ MK("West ")
+ MK("Klein ");
+
+#define NUM_DUTCH_2 57
+static const char dutch_2[] =
+ MK("Hoog")
+ MK("Laag")
+ MK("Klein")
+ MK("Groot")
+ MK("Noorder")
+ MK("Noord")
+ MK("Zuider")
+ MK("Zuid")
+ MK("Ooster")
+ MK("Oost")
+ MK("Wester")
+ MK("West")
+ MK("Hoofd")
+ MK("Midden")
+ MK("Eind")
+ MK("Amster")
+ MK("Amstel")
+ MK("Dord")
+ MK("Rotter")
+ MK("Haar")
+ MK("Til")
+ MK("Enk")
+ MK("Dok")
+ MK("Veen")
+ MK("Leidsch")
+ MK("Lely")
+ MK("En")
+ MK("Kaats")
+ MK("U")
+ MK("Maas")
+ MK("Mar")
+ MK("Bla")
+ MK("Al")
+ MK("Alk")
+ MK("Eer")
+ MK("Drie")
+ MK("Ter")
+ MK("Groes")
+ MK("Goes")
+ MK("Soest")
+ MK("Coe")
+ MK("Uit")
+ MK("Zwaag")
+ MK("Hellen")
+ MK("Slie")
+ MK("IJ")
+ MK("Grubben")
+ MK("Groen")
+ MK("Lek")
+ MK("Ridder")
+ MK("Schie")
+ MK("Olde")
+ MK("Roose")
+ MK("Haar")
+ MK("Til")
+ MK("Loos")
+ MK("Hil");
+
+#define NUM_DUTCH_3 20
+static const char dutch_3[] =
+ MK("Drog")
+ MK("Nat")
+ MK("Valk")
+ MK("Bob")
+ MK("Dedem")
+ MK("Kollum")
+ MK("Best")
+ MK("Hoend")
+ MK("Leeuw")
+ MK("Graaf")
+ MK("Uithuis")
+ MK("Purm")
+ MK("Hard")
+ MK("Hell")
+ MK("Werk")
+ MK("Spijk")
+ MK("Vink")
+ MK("Wams")
+ MK("Heerhug")
+ MK("Koning");
+
+
+#define NUM_DUTCH_4 6
+static const char dutch_4[] =
+ MK("e")
+ MK("er")
+ MK("el")
+ MK("en")
+ MK("o")
+ MK("s");
+
+#define NUM_DUTCH_5 56
+static const char dutch_5[] =
+ MK("stad")
+ MK("vorst")
+ MK("dorp")
+ MK("dam")
+ MK("beek")
+ MK("doorn")
+ MK("zijl")
+ MK("zijlen")
+ MK("lo")
+ MK("muiden")
+ MK("meden")
+ MK("vliet")
+ MK("nisse")
+ MK("daal")
+ MK("vorden")
+ MK("vaart")
+ MK("mond")
+ MK("zaal")
+ MK("water")
+ MK("duinen")
+ MK("heuvel")
+ MK("geest")
+ MK("kerk")
+ MK("meer")
+ MK("maar")
+ MK("hoorn")
+ MK("rade")
+ MK("wijk")
+ MK("berg")
+ MK("heim")
+ MK("sum")
+ MK("richt")
+ MK("burg")
+ MK("recht")
+ MK("drecht")
+ MK("trecht")
+ MK("tricht")
+ MK("dricht")
+ MK("lum")
+ MK("rum")
+ MK("halen")
+ MK("oever")
+ MK("wolde")
+ MK("veen")
+ MK("hoven")
+ MK("gast")
+ MK("kum")
+ MK("hage")
+ MK("dijk")
+ MK("zwaag")
+ MK("pomp")
+ MK("huizen")
+ MK("bergen")
+ MK("schede")
+ MK("mere")
+ MK("end");
+
+static byte MakeDutchTownName(byte *buf, uint32 seed)
+{
+ int i;
+
+ i = GETNUM(0, 50 + NUM_DUTCH_1) - 50;
+ if (i >= 0)
+ AppendPart(&buf, i, dutch_1);
+
+ i = GETNUM(6, 9);
+ if(i > 4){
+ AppendPart(&buf, GETNUM(9, NUM_DUTCH_2), dutch_2);
+ } else {
+ AppendPart(&buf, GETNUM(9, NUM_DUTCH_3), dutch_3);
+ AppendPart(&buf, GETNUM(12, NUM_DUTCH_4), dutch_4);
+ }
+ AppendPart(&buf, GETNUM(15, NUM_DUTCH_5), dutch_5);
+
+ return 0;
+}
+
+#define NUM_FINNISH_1 25
+static const char finnish_1[] =
+ MK("Aijala")
+ MK("Kisko")
+ MK("Espoo")
+ MK("Helsinki")
+ MK("Tapiola")
+ MK("Järvelä")
+ MK("Lahti")
+ MK("Kotka")
+ MK("Hamina")
+ MK("Loviisa")
+ MK("Kouvola")
+ MK("Tampere")
+ MK("Kokkola")
+ MK("Oulu")
+ MK("Salo")
+ MK("Malmi")
+ MK("Pelto")
+ MK("Koski")
+ MK("Iisalmi")
+ MK("Raisio")
+ MK("Taavetti")
+ MK("Joensuu")
+ MK("Imatra")
+ MK("Tapanila")
+ MK("Pasila");
+
+#define NUM_FINNISH_2a 26
+static const char finnish_2a[] =
+ MK("Hiekka")
+ MK("Haapa")
+ MK("Mylly")
+ MK("Kivi")
+ MK("Lappeen")
+ MK("Lohjan")
+ MK("Savon")
+ MK("Sauna")
+ MK("Keri")
+ MK("Uusi")
+ MK("Vanha")
+ MK("Lapin")
+ MK("Kesä")
+ MK("Kuusi")
+ MK("Pelto")
+ MK("Tuomi")
+ MK("Pitäjän")
+ MK("Terva")
+ MK("Olki")
+ MK("Heinä")
+ MK("Kuusan")
+ MK("Seinä")
+ MK("Kemi")
+ MK("Rova")
+ MK("Martin")
+ MK("Koivu");
+
+#define NUM_FINNISH_2b 18
+static const char finnish_2b[] =
+ MK("harju")
+ MK("linna")
+ MK("järvi")
+ MK("kallio")
+ MK("mäki")
+ MK("nummi")
+ MK("joki")
+ MK("kylä")
+ MK("lampi")
+ MK("lahti")
+ MK("metsä")
+ MK("suo")
+ MK("laakso")
+ MK("niitty")
+ MK("luoto")
+ MK("hovi")
+ MK("ranta")
+ MK("koski");
+
+static byte MakeFinnishTownName(byte *buf, uint32 seed)
+{
+// Select randomly if town name should consists of one or two parts.
+ if (GETNUM(0, 15) >= 10)
+ AppendPart(&buf, GETNUM(2, NUM_FINNISH_1), finnish_1); // One part
+ else {
+ AppendPart(&buf, GETNUM(2, NUM_FINNISH_2a), finnish_2a); // Two parts
+ AppendPart(&buf, GETNUM(10, NUM_FINNISH_2b), finnish_2b);
+ }
+ return 0;
+}
+
+#define NUM_POLISH_1 11
+
+static const char polish_1_m[] =
+ MK("Wielki ")
+ MK("Maly ")
+ MK("Zly ")
+ MK("Dobry ")
+ MK("Nowy ")
+ MK("Stary ")
+ MK("Zloty ")
+ MK("Zielony ")
+ MK("Bialy ")
+ MK("Modry ")
+ MK("Debowy ")
+ ;
+
+static const char polish_1_f[] =
+ MK("Wielka ")
+ MK("Mala ")
+ MK("Zla ")
+ MK("Dobra ")
+ MK("Nowa ")
+ MK("Stara ")
+ MK("Zlota ")
+ MK("Zielona ")
+ MK("Biala ")
+ MK("Modra ")
+ MK("Debowa ")
+ ;
+
+static const char polish_1_n[] =
+ MK("Wielkie ")
+ MK("Male ")
+ MK("Zle ")
+ MK("Dobre ")
+ MK("Nowe ")
+ MK("Stare ")
+ MK("Zlote ")
+ MK("Zielone ")
+ MK("Biale ")
+ MK("Modre ")
+ MK("Debowe ")
+ ;
+
+#define NUM_POLISH_2_O 34// single names
+#define NUM_POLISH_2_M 48// masculine + pref/suf
+#define NUM_POLISH_2_F 27// feminine + pref/suf
+#define NUM_POLISH_2_N 29// 'it' + pref/suf
+
+static const char polish_2[] =
+//static const char polish_2_o[] =
+MK("Frombork")
+MK("Gniezno")
+MK("Olsztyn")
+MK("Torun")
+MK("Bydgoszcz")
+MK("Terespol")
+MK("Krakow")
+MK("Poznan")
+MK("Wroclaw")
+MK("Katowice")
+MK("Cieszyn")
+MK("Bytom")
+MK("Frombork")
+MK("Hel")
+MK("Konin")
+MK("Lublin")
+MK("Malbork")
+MK("Sopot")
+MK("Sosnowiec")
+MK("Gdansk")
+MK("Gdynia")
+MK("Sieradz")
+MK("Sandomierz")
+MK("Szczyrk")
+MK("Szczytno")
+MK("Szczecin")
+MK("Zakopane")
+MK("Szklarska Poreba")
+MK("Bochnia")
+MK("Golub-Dobrzyn")
+MK("Chojnice")
+MK("Ostrowiec")
+MK("Otwock")
+MK("Wolsztyn")
+//;
+
+//static const char polish_2_m[] =
+MK("Jarocin")
+MK("Gogolin")
+MK("Tomaszow")
+MK("Piotrkow")
+MK("Lidzbark")
+MK("Rypin")
+MK("Radzymin")
+MK("Wolomin")
+MK("Pruszkow")
+MK("Olsztynek")
+MK("Rypin")
+MK("Cisek")
+MK("Krotoszyn")
+MK("Stoczek")
+MK("Lubin")
+MK("Lubicz")
+MK("Milicz")
+MK("Targ")
+MK("Ostrow")
+MK("Ozimek")
+MK("Puck")
+MK("Rzepin")
+MK("Siewierz")
+MK("Stargard")
+MK("Starogard")
+MK("Turek")
+MK("Tymbark")
+MK("Wolsztyn")
+MK("Strzepcz")
+MK("Strzebielin")
+MK("Sochaczew")
+MK("Grebocin")
+MK("Gniew")
+MK("Lubliniec")
+MK("Lubasz")
+MK("Lutomiersk")
+MK("Niemodlin")
+MK("Przeworsk")
+MK("Ursus")
+MK("Tyczyn")
+MK("Sztum")
+MK("Szczebrzeszyn")
+MK("Wolin")
+MK("Wrzeszcz")
+MK("Zgierz")
+MK("Zieleniec")
+MK("Drobin")
+MK("Garwolin")
+//;
+
+//static const char polish_2_f[] =
+MK("Szprotawa")
+MK("Pogorzelica")
+MK("Motlawa")
+MK("Lubawa")
+MK("Nidzica")
+MK("Kruszwica")
+MK("Bierawa")
+MK("Brodnica")
+MK("Chojna")
+MK("Krzepica")
+MK("Ruda")
+MK("Rumia")
+MK("Tuchola")
+MK("Trzebinia")
+MK("Ustka")
+MK("Warszawa")
+MK("Bobowa")
+MK("Dukla")
+MK("Krynica")
+MK("Murowana")
+MK("Niemcza")
+MK("Zaspa")
+MK("Zawoja")
+MK("Wola")
+MK("Limanowa")
+MK("Rabka")
+MK("Skawina")
+MK("Pilawa")
+//;
+
+//static const char polish_2_n[] =
+MK("Lipsko")
+MK("Pilzno")
+MK("Przodkowo")
+MK("Strzelno")
+MK("Susz")
+MK("Jaworzno")
+MK("Choszczno")
+MK("Mogilno")
+MK("Luzino")
+MK("Miasto")
+MK("Dziadowo")
+MK("Kowalewo")
+MK("Legionowo")
+MK("Miastko")
+MK("Zabrze")
+MK("Zawiercie")
+MK("Kochanowo")
+MK("Miechucino")
+MK("Mirachowo")
+MK("Robakowo")
+MK("Kosakowo")
+MK("Borne")
+MK("Braniewo")
+MK("Sulinowo")
+MK("Chmielno")
+MK("Jastrzebie")
+MK("Gryfino")
+MK("Koronowo")
+MK("Lubichowo")
+MK("Opoczno")
+;
+
+#define NUM_POLISH_3 29
+static const char polish_3_m[] =
+MK(" Wybudowanie")
+MK(" Swietokrzyski")
+MK(" Gorski")
+MK(" Morski")
+MK(" Zdroj")
+MK(" Wody")
+MK(" Bajoro")
+MK(" Krajenski")
+MK(" Slaski")
+MK(" Mazowiecki")
+MK(" Pomorski")
+MK(" Wielki")
+MK(" Maly")
+MK(" Warminski")
+MK(" Mazurski")
+MK(" Mniejszy")
+MK(" Wiekszy")
+MK(" Gorny")
+MK(" Dolny")
+MK(" Wielki")
+MK(" Stary")
+MK(" Nowy")
+MK(" Wielkopolski")
+MK(" Wzgorze")
+MK(" Mosty")
+MK(" Kujawski")
+MK(" Malopolski")
+MK(" Podlaski")
+MK(" Lesny")
+;
+static const char polish_3_f[] =
+MK(" Wybudowanie")
+MK(" Swietokrzyska")
+MK(" Gorska")
+MK(" Morska")
+MK(" Zdroj")
+MK(" Woda")
+MK(" Bajoro")
+MK(" Krajenska")
+MK(" Slaska")
+MK(" Mazowiecka")
+MK(" Pomorska")
+MK(" Wielka")
+MK(" Mala")
+MK(" Warminska")
+MK(" Mazurska")
+MK(" Mniejsza")
+MK(" Wieksza")
+MK(" Gorna")
+MK(" Dolna")
+MK(" Wielka")
+MK(" Stara")
+MK(" Nowa")
+MK(" Wielkopolska")
+MK(" Wzgorza")
+MK(" Mosty")
+MK(" Kujawska")
+MK(" Malopolska")
+MK(" Podlaska")
+MK(" Lesna")
+;
+static const char polish_3_n[] =
+MK(" Wybudowanie")
+MK(" Swietokrzyskie")
+MK(" Gorskie")
+MK(" Morskie")
+MK(" Zdroj")
+MK(" Wody")
+MK(" Bajoro")
+MK(" Krajenskie")
+MK(" Slaskie")
+MK(" Mazowieckie")
+MK(" Pomorskie")
+MK(" Wielkie")
+MK(" Male")
+MK(" Warminskie ")
+MK(" Mazurskie ")
+MK(" Mniejsze")
+MK(" Wieksze")
+MK(" Gorne")
+MK(" Dolne")
+MK(" Wielkie")
+MK(" Stare")
+MK(" Nowe")
+MK(" Wielkopolskie")
+MK(" Wzgorze")
+MK(" Mosty")
+MK(" Kujawskie")
+MK(" Malopolskie")
+MK(" Podlaskie")
+MK(" Lesne")
+;
+
+#define NUM_POLISH_2 NUM_POLISH_2_O + NUM_POLISH_2_M + NUM_POLISH_2_F + NUM_POLISH_2_N
+
+static const char * const _polish_types[3][2] = {
+ {polish_1_m, polish_3_m}, // masculine
+ {polish_1_f, polish_3_f}, // feminine
+ {polish_1_n, polish_3_n}, // neutral
+};
+
+static byte MakePolishTownName(byte *buf, uint32 seed)
+{
+ uint i, x;
+ const char *const (*t)[2];
+
+ // get a number ranging from 0 to all_towns
+ i = GETNUM(0, NUM_POLISH_2);
+
+ // single name
+ if(i < NUM_POLISH_2_O) {
+ AppendPart(&buf, i, polish_2);
+ return 0;
+ }
+
+ // a suffix (12/20), a prefix (4/20), or nothing (4/20)
+ x = GETNUM(5, 20);
+
+ // no suffix of prefix
+ if(x < 4) {
+ AppendPart(&buf, i-NUM_POLISH_2_O, polish_2);
+ return 0;
+ }
+
+ t = _polish_types;
+ if(IS_INT_INSIDE(i, NUM_POLISH_2_O, NUM_POLISH_2_O + NUM_POLISH_2_M)) {
+ // nothing
+ } else if (IS_INT_INSIDE(i, NUM_POLISH_2_O + NUM_POLISH_2_M, NUM_POLISH_2_O + NUM_POLISH_2_M + NUM_POLISH_2_F)) {
+ t += 1;
+ } else {
+ t += 2;
+ }
+
+ // suffix or prefix
+ if(x < 8) {
+ AppendPart(&buf, GETNUM(10, NUM_POLISH_1), (*t)[0]);
+ AppendPart(&buf, i, polish_2);
+ } else {
+ AppendPart(&buf, i, polish_2);
+ AppendPart(&buf, GETNUM(10, NUM_POLISH_3), (*t)[1]);
+ }
+
+ return 0;
+}
+
+#define NUM_SLOVAKISH_1 87
+static const char slovakish_1[] =
+MK("Bratislava")
+MK("Banovce nad Bebravou")
+MK("Banska Bystrica")
+MK("Banska Stiavnica")
+MK("Bardejov")
+MK("Brezno")
+MK("Brezova pod Bradlom")
+MK("Bytca")
+MK("Cadca")
+MK("Cierna nad Tisou")
+MK("Detva")
+MK("Detva")
+MK("Dolny Kubin")
+MK("Dolny Kubin")
+MK("Dunajska Streda")
+MK("Gabcikovo")
+MK("Galanta")
+MK("Gbely")
+MK("Gelnica")
+MK("Handlova")
+MK("Hlohovec")
+MK("Holic")
+MK("Humenne")
+MK("Hurbanovo")
+MK("Kezmarok")
+MK("Komarno")
+MK("Kosice")
+MK("Kremnica")
+MK("Krompachy")
+MK("Kuty")
+MK("Leopoldov")
+MK("Levoca")
+MK("Liptovsky Mikulas")
+MK("Lucenec")
+MK("Malacky")
+MK("Martin")
+MK("Medzilaborce")
+MK("Michalovce")
+MK("Modra")
+MK("Myjava")
+MK("Namestovo")
+MK("Nitra")
+MK("Nova Bana")
+MK("Nove Mesto nad Vahom")
+MK("Nove Zamky")
+MK("Partizanske")
+MK("Pezinok")
+MK("Piestany")
+MK("Poltar")
+MK("Poprad")
+MK("Povazska Bystrica")
+MK("Prievidza")
+MK("Puchov")
+MK("Revuca")
+MK("Rimavska Sobota")
+MK("Roznava")
+MK("Ruzomberok")
+MK("Sabinov")
+MK("Sala")
+MK("Senec")
+MK("Senica")
+MK("Sered")
+MK("Skalica")
+MK("Sladkovicovo")
+MK("Smolenice")
+MK("Snina")
+MK("Stara Lubovna")
+MK("Stara Tura")
+MK("Strazske")
+MK("Stropkov")
+MK("Stupava")
+MK("Sturovo")
+MK("Sulekovo")
+MK("Topolcany")
+MK("Trebisov")
+MK("Trencin")
+MK("Trnava")
+MK("Turcianske Teplice")
+MK("Tvrdosin")
+MK("Vrable")
+MK("Vranov nad Toplov")
+MK("Zahorska Bystrica")
+MK("Zdiar")
+MK("Ziar nad Hronom")
+MK("Zilina")
+MK("Zlate Moravce")
+MK("Zvolen")
+;
+
+static byte MakeSlovakishTownName(byte *buf, uint32 seed)
+{
+ AppendPart(&buf, GETNUM(0, NUM_SLOVAKISH_1), slovakish_1);
+ return 0;
+}
+
+// Modifiers
+#define NUM_HUNGARIAN_1 5
+static const char hungarian_1[] =
+ MK("Nagy-")
+ MK("Kis-")
+ MK("Felső-")
+ MK("Alsó-")
+ MK("Új-")
+;
+
+#define NUM_HUNGARIAN_2 54
+static const char hungarian_2[] =
+// River modifiers
+// 1 - 10
+ MK("Bodrog")
+ MK("Dráva")
+ MK("Duna")
+ MK("Hejő")
+ MK("Hernád")
+ MK("Rába")
+ MK("Sajó")
+ MK("Szamos")
+ MK("Tisza")
+ MK("Zala")
+// Lake modifiers
+// 11 - 12
+ MK("Balaton")
+ MK("Fertő")
+// Mountain modifiers
+// 13 - 14
+ MK("Bakony")
+ MK("Cserhát")
+// Country modifiers
+// 15 - 23
+ MK("Bihar")
+ MK("Hajdú")
+ MK("Jász")
+ MK("Kun")
+ MK("Magyar")
+ MK("Nógrád")
+ MK("Nyír")
+ MK("Somogy")
+ MK("Székely")
+// Town modifiers
+// 24 - 26
+ MK("Buda")
+ MK("Győr")
+ MK("Pest")
+// Color modifiers
+// 27
+ MK("Fehér")
+// General terrain modifiers
+// 28 - 34
+ MK("Cserép")
+ MK("Erdő")
+ MK("Hegy")
+ MK("Homok")
+ MK("Mező")
+ MK("Puszta")
+ MK("Sár")
+// Rank modifiers
+// 35 - 40
+ MK("Császár")
+ MK("Herceg")
+ MK("Király")
+ MK("Nemes")
+ MK("Püspök")
+ MK("Szent")
+// Plant modifiers
+// 41 - 42
+ MK("Almás")
+ MK("Szilvás")
+// Standard stuff
+// 43 - 54
+ MK("Agg")
+ MK("Aranyos")
+ MK("Békés")
+ MK("Egyházas")
+ MK("Gagy")
+ MK("Heves")
+ MK("Kapos")
+ MK("Tápió")
+ MK("Torna")
+ MK("Vas")
+ MK("Vámos")
+ MK("Vásáros")
+;
+
+#define NUM_HUNGARIAN_3 16
+static const char hungarian_3[] =
+ MK("apáti")
+ MK("bába")
+ MK("bikk")
+ MK("dob")
+ MK("fa")
+ MK("föld")
+ MK("hegyes")
+ MK("kak")
+ MK("kereszt")
+ MK("kürt")
+ MK("ladány")
+ MK("mérges")
+ MK("szalonta")
+ MK("telek")
+ MK("vas")
+ MK("völgy")
+;
+
+#define NUM_HUNGARIAN_4 5
+static const char hungarian_4[] =
+ MK("alja")
+ MK("egyháza")
+ MK("háza")
+ MK("úr")
+ MK("vár")
+;
+
+#define NUM_HUNGARIAN_REAL 35
+static const char hungarian_real[] =
+ MK("Ajka")
+ MK("Aszód")
+ MK("Badacsony")
+ MK("Baja")
+ MK("Budapest")
+ MK("Debrecen")
+ MK("Eger")
+ MK("Fonyód")
+ MK("Gödöllő")
+ MK("Győr")
+ MK("Gyula")
+ MK("Karcag")
+ MK("Kecskemét")
+ MK("Keszthely")
+ MK("Kisköre")
+ MK("Kocsord")
+ MK("Komárom")
+ MK("Kőszeg")
+ MK("Makó")
+ MK("Mohács")
+ MK("Miskolc")
+ MK("Ózd")
+ MK("Paks")
+ MK("Pápa")
+ MK("Pécs")
+ MK("Polgár")
+ MK("Sarkad")
+ MK("Siófok")
+ MK("Szeged")
+ MK("Szentes")
+ MK("Szolnok")
+ MK("Tihany")
+ MK("Tokaj")
+ MK("Vác")
+ MK("Záhony")
+ MK("Zirc")
+;
+
+static byte MakeHungarianTownName(byte *buf, uint32 seed)
+{
+ int i;
+
+ if (GETNUM(12, 15) < 3) {
+ /* These are real names.. */
+ AppendPart(&buf, GETNUM(0, NUM_HUNGARIAN_REAL), hungarian_real);
+ } else {
+ /* These are the generated names.. Some of them exist, LOL */
+ /* Append the prefix if needed */
+ i = GETNUM(3, NUM_HUNGARIAN_1 * 3);
+ if (i < NUM_HUNGARIAN_1) AppendPart(&buf, i, hungarian_1);
+
+ AppendPart(&buf, GETNUM(3, NUM_HUNGARIAN_2), hungarian_2);
+ AppendPart(&buf, GETNUM(6, NUM_HUNGARIAN_3), hungarian_3);
+
+ i = GETNUM(10, NUM_HUNGARIAN_4 * 3);
+ if (i < NUM_HUNGARIAN_4) AppendPart(&buf, i, hungarian_4);
+ }
+ return 0;
+}
+
+TownNameGenerator * const _town_name_generators[] = {
+ MakeEnglishTownName,
+ MakeFrenchTownName,
+ MakeGermanTownName,
+ MakeAmericanTownName,
+ MakeSpanishTownName,
+ MakeSillyTownName,
+ MakeSwedishTownName,
+ MakeDutchTownName,
+ MakeFinnishTownName,
+ MakePolishTownName,
+ MakeSlovakishTownName,
+ MakeHungarianTownName,
+ MakeAustrianTownName
+};