(svn r1307) -Fix/feature: rewrote the townname generation code. Code is much more
authortruelight
Fri, 31 Dec 2004 14:43:47 +0000
changeset 833 9d4d77ff2cce
parent 832 3fef24b26f41
child 834 5486b7740f33
(svn r1307) -Fix/feature: rewrote the townname generation code. Code is much more
readable now. 'American' is replaces by 'Additional English' (Jango)
lang/english.txt
namegen.c
settings_gui.c
table/namegen.h
--- a/lang/english.txt	Fri Dec 31 09:47:09 2004 +0000
+++ b/lang/english.txt	Fri Dec 31 14:43:47 2004 +0000
@@ -852,21 +852,21 @@
 STR_0336_7							:{BLACK}7
 
 ############ start of townname region
-STR_TOWNNAME_ENGLISH						:English
-STR_TOWNNAME_FRENCH						:French
-STR_TOWNNAME_GERMAN						:German
-STR_TOWNNAME_AMERICAN						:American
-STR_TOWNNAME_LATIN_AMERICAN					:Latin-American
-STR_TOWNNAME_SILLY						:Silly
-STR_TOWNNAME_SWEDISH						:Swedish
-STR_TOWNNAME_DUTCH						:Dutch
-STR_TOWNNAME_FINNISH						:Finnish
-STR_TOWNNAME_POLISH						:Polish
+STR_TOWNNAME_ORIGINAL_ENGLISH 		:English (Original)
+STR_TOWNNAME_FRENCH								:French
+STR_TOWNNAME_GERMAN								:German
+STR_TOWNNAME_ADDITIONAL_ENGLISH		:English (Additional)
+STR_TOWNNAME_LATIN_AMERICAN				:Latin-American
+STR_TOWNNAME_SILLY								:Silly
+STR_TOWNNAME_SWEDISH							:Swedish
+STR_TOWNNAME_DUTCH								:Dutch
+STR_TOWNNAME_FINNISH							:Finnish
+STR_TOWNNAME_POLISH								:Polish
 STR_TOWNNAME_SLOVAKISH						:Slovakish
 STR_TOWNNAME_HUNGARIAN						:Hungarian
-STR_TOWNNAME_AUSTRIAN						:Austrian
-STR_TOWNNAME_ROMANIAN						:Romanian
-STR_TOWNNAME_CZECH						:Czech
+STR_TOWNNAME_AUSTRIAN							:Austrian
+STR_TOWNNAME_ROMANIAN							:Romanian
+STR_TOWNNAME_CZECH								:Czech
 ############ end of	townname region
 
 STR_CURR_GBP							:Pounds ({POUNDSIGN})
--- a/namegen.c	Fri Dec 31 09:47:09 2004 +0000
+++ b/namegen.c	Fri Dec 31 14:43:47 2004 +0000
@@ -1,2173 +1,420 @@
 #include "stdafx.h"
 #include "ttd.h"
 
+#include "table/namegen.h"
 
-#define GETNUM(x, y) (((uint16)(seed >> x) * (y))>>16)
-
-static void AppendPart(byte **buf, int num, const char *names)
+inline static uint32 GetNumberBasedOnSeed(int x, int y, uint32 seed)
 {
-	byte *s;
-
-	while (--num>=0) {
-		do names++; while (names[-1]);
-	}
-
-	for(s=*buf; (*s++ = *names++) != 0;) {}
-	*buf = s - 1;
+	return (((uint16)(seed >> x) * (y))>>16);
 }
 
-#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")
-;
+static void ReplaceWords(byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h, byte *buf)
+{
+	if (buf[0] == a && buf[1] == b && buf[2] == c && buf[3] == d)
+	{
+		buf[0] = e;
+		buf[1] = f;
+		buf[2] = g;
+		buf[3] = h;
+	}
+}
 
-#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")
-;
-
-#define REPLACE_WORDS(a,b,c,d,e,f,g,h)  { if (start[0] == a && start[1] == b && start[2] == c && start[3] == d) { start[0] = e; start[1] = f; start[2] = g; start[3] = h; } }
-
-static byte MakeEnglishTownName(byte *buf, uint32 seed)
+static byte MakeEnglishOriginalTownName(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);
+	//null terminates the string for strcat
+	strcpy(buf, "");
 
-	i = GETNUM(15, NUM_ENGLISH_6 + 60) - 60;
-
-	result = 0;
-
-	if (i >= 0) {
-		if (i <= 1) result = NG_EDGE;
-		AppendPart(&buf, i, english_6);
+	// optional first segment
+	if ((i = GetNumberBasedOnSeed(0, lengthof(name_original_english_1) + 50, seed) - 50) >= 0)
+	{
+		strcat(buf,name_original_english_1[i]);
 	}
 
-	if (start[0]=='C' && (start[1] == 'e' || start[1] == 'i'))
-		start[0] = 'K';
-
-	/* Replace certain words (routine identical to TTD now) */
+	//mandatory middle segments
+	strcat(buf, name_original_english_2[GetNumberBasedOnSeed(4,  lengthof(name_original_english_2), seed)]);
+	strcat(buf, name_original_english_3[GetNumberBasedOnSeed(7,  lengthof(name_original_english_3), seed)]);
+	strcat(buf, name_original_english_4[GetNumberBasedOnSeed(10, lengthof(name_original_english_4), seed)]);
+	strcat(buf, name_original_english_5[GetNumberBasedOnSeed(13, lengthof(name_original_english_5), seed)]);
 
-	REPLACE_WORDS('C','u','n','t',  'E','a','s','t');
-	REPLACE_WORDS('S','l','a','g',  'P','i','t','s');
-	REPLACE_WORDS('S','l','u','t',  'E','d','i','n');
-//	REPLACE_WORDS('F','a','r','t',  'B','o','o','t');
-	REPLACE_WORDS('D','r','a','r',  'Q','u','a','r');
-	REPLACE_WORDS('D','r','e','h',  'B','a','s','h');
-	REPLACE_WORDS('F','r','a','r',  'S','h','o','r');
-	REPLACE_WORDS('G','r','a','r',  'A','b','e','r');
-	REPLACE_WORDS('B','r','a','r',  'O','v','e','r');
-	REPLACE_WORDS('W','r','a','r',  'I','n','v','e');
+	//optional last segment
+	if ((i = GetNumberBasedOnSeed(15, lengthof(name_original_english_6) + 60, seed) - 60) >= 0)
+	{
+		strcat(buf, name_original_english_6[i]);
+	}
 
-	return result;
+	if (buf[0] == 'C' && (buf[1] == 'e' || buf[1] == 'i'))
+		buf[0] = 'K';
+
+	ReplaceWords('C','u','n','t',  'E','a','s','t', buf);
+	ReplaceWords('S','l','a','g',  'P','i','t','s', buf);
+	ReplaceWords('S','l','u','t',  'E','d','i','n', buf);
+//	ReplaceWords('F','a','r','t',  'B','o','o','t', buf);
+	ReplaceWords('D','r','a','r',  'Q','u','a','r', buf);
+	ReplaceWords('D','r','e','h',  'B','a','s','h', buf);
+	ReplaceWords('F','r','a','r',  'S','h','o','r', buf);
+	ReplaceWords('G','r','a','r',  'A','b','e','r', buf);
+	ReplaceWords('B','r','a','r',  'O','v','e','r', buf);
+	ReplaceWords('W','r','a','r',  'I','n','v','e', buf);
+
+	return 0;
 }
 
-#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 ")
-;
+static byte MakeEnglishAdditionalTownName(byte *buf, uint32 seed)
+{
+	int i;
 
-#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 ")
-;
+	//null terminates the string for strcat
+	strcpy(buf, "");
 
-#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")
-;
+	// optional first segment
+	if ((i = GetNumberBasedOnSeed(0, lengthof(name_additional_english_prefix) + 50, seed) - 50) >= 0)
+	{
+		strcat(buf,name_additional_english_prefix[i]);
+	}
 
-#define NUM_AUSTRIAN_B1 1
-static const char austrian_b1[] =
-	MK(" am ")
-;
+	if (GetNumberBasedOnSeed(3, 20, seed) >= 14)
+	{
+		strcat(buf, name_additional_english_1a[GetNumberBasedOnSeed(6, lengthof(name_additional_english_1a), seed)]);
+	}
+	else
+	{
+		strcat(buf, name_additional_english_1b1[GetNumberBasedOnSeed(6, lengthof(name_additional_english_1b1), seed)]);
+		strcat(buf, name_additional_english_1b2[GetNumberBasedOnSeed(9, lengthof(name_additional_english_1b2), seed)]);
+		if (GetNumberBasedOnSeed(11, 20, seed) >= 4)
+		{
+			strcat(buf, name_additional_english_1b3a[GetNumberBasedOnSeed(12, lengthof(name_additional_english_1b3a), seed)]);
+		}
+		else
+		{
+			strcat(buf, name_additional_english_1b3b[GetNumberBasedOnSeed(12, lengthof(name_additional_english_1b3a), seed)]);
+		}
+	}
 
-#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")
-;
+	strcat(buf, name_additional_english_2[GetNumberBasedOnSeed(14, lengthof(name_additional_english_2), seed)]);
+
+	//optional last segment
+	if ((i = GetNumberBasedOnSeed(15, lengthof(name_additional_english_3) + 60, seed) - 60) >= 0)
+	{
+		strcat(buf, name_additional_english_3[i]);
+	}
+
+	ReplaceWords('C','u','n','t',  'E','a','s','t', buf);
+	ReplaceWords('S','l','a','g',  'P','i','t','s', buf);
+	ReplaceWords('S','l','u','t',  'E','d','i','n', buf);
+	ReplaceWords('F','a','r','t',  'B','o','o','t', buf);
+	ReplaceWords('D','r','a','r',  'Q','u','a','r', buf);
+	ReplaceWords('D','r','e','h',  'B','a','s','h', buf);
+	ReplaceWords('F','r','a','r',  'S','h','o','r', buf);
+	ReplaceWords('G','r','a','r',  'A','b','e','r', buf);
+	ReplaceWords('B','r','a','r',  'O','v','e','r', buf);
+	ReplaceWords('W','r','a','r',  'S','t','a','n', buf);
+
+	return 0;
+
+
+}
 
 static byte MakeAustrianTownName(byte *buf, uint32 seed)
 {
-	int i, j=0;
+	int i, j = 0;
+	strcpy(buf, "");
 
 	// Bad, Maria, Gross, ...
-	i = GETNUM(0, NUM_AUSTRIAN_A1 + 15) - 15;
-	if (i >= 0) AppendPart(&buf, i, austrian_a1);
+	i = GetNumberBasedOnSeed(0, lengthof(name_austrian_a1) + 15,seed) - 15;
 
-	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);
+	if (i >= 0) strcat(buf, name_austrian_a1[i]);
+
+	i = GetNumberBasedOnSeed(4, 6, seed);
+	if (i >= 4)
+	{
+		// Kaisers-kirchen
+		strcat(buf, name_austrian_a2[GetNumberBasedOnSeed( 7, lengthof(name_austrian_a2), seed)]);
+		strcat(buf, name_austrian_a3[GetNumberBasedOnSeed(13, lengthof(name_austrian_a3), seed)]);
 	}
-	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 if (i >= 2)
+	{
+		// St. Johann
+		strcat(buf, name_austrian_a5[GetNumberBasedOnSeed( 7, lengthof(name_austrian_a5), seed)]);
+		strcat(buf, name_austrian_a6[GetNumberBasedOnSeed( 9, lengthof(name_austrian_a6), seed)]);
+		j = 1; // More likely to have a " an der " or " am "
 	}
-        else {
-	  // Zell
-	  AppendPart(&buf, GETNUM( 7, NUM_AUSTRIAN_A4), austrian_a4);
+	else
+	{
+		// Zell
+		strcat(buf, name_austrian_a4[GetNumberBasedOnSeed( 7, lengthof(name_austrian_a4), seed)]);
 	}
 
-	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);
+	i = GetNumberBasedOnSeed(1, 6, seed);
+	if (i >= 4 - j)
+	{
+		// an der Donau (rivers)
+		strcat(buf, name_austrian_f1[GetNumberBasedOnSeed(4, lengthof(name_austrian_f1), seed)]);
+		strcat(buf, name_austrian_f2[GetNumberBasedOnSeed(5, lengthof(name_austrian_f2), seed)]);
 	}
-	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);
+	else if (i >= 2 - j)
+	{
+		// am Dachstein (mountains)
+		strcat(buf, name_austrian_b1[GetNumberBasedOnSeed(4, lengthof(name_austrian_b1), seed)]);
+		strcat(buf, name_austrian_b2[GetNumberBasedOnSeed(5, lengthof(name_austrian_b2), seed)]);
 	}
 
 	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);
+	//null terminates the string for strcat
+	strcpy(buf, "");
+
+	// optional first segment
+	if ((i = GetNumberBasedOnSeed(0, lengthof(name_german_pre) + 50, seed) - 50) >= 0)
+	{
+		strcat(buf,name_german_pre[i]);
 	}
 
+	// mandatory middle segments including option of hardcoded name
+	if ((i = GetNumberBasedOnSeed(4, lengthof(name_german_hardcoded) + 50, seed) - 50) >= 0)
+	{
+		strcat(buf,name_german_hardcoded[i]);
+	}
+	else
+	{
+		strcat(buf, name_german_1[GetNumberBasedOnSeed( 7, lengthof(name_german_1), seed)]);
+		strcat(buf, name_german_2[GetNumberBasedOnSeed(10, lengthof(name_german_2), seed)]);
+	}
+
+	//optional last segment
+	if ((i = GetNumberBasedOnSeed(12, 50 + 10, seed) - 50) >= 0)
+	{
+		if (i > 2)
+		{
+			strcat(buf, name_german_3_an_der[GetNumberBasedOnSeed(14, lengthof(name_german_3_an_der), seed)]);
+			strcat(buf, name_german_4_an_der[GetNumberBasedOnSeed(15, lengthof(name_german_4_an_der), seed)]);
+		} else {
+			strcat(buf, name_german_3_am[GetNumberBasedOnSeed(14, lengthof(name_german_3_am), seed)]);
+			strcat(buf, name_german_4_am[GetNumberBasedOnSeed(15, lengthof(name_german_4_am), seed)]);
+		}
+
 
-	i=GETNUM(3,NUM_GERMAN_1);
+	}
+	return 0;
+}
 
-	AppendPart(&buf, i, german_1);
+static byte MakeSpanishTownName(byte *buf, uint32 seed)
+{
+	strcpy(buf, "");
+	strcat(buf, name_spanish_1[GetNumberBasedOnSeed(0, lengthof(name_spanish_1), seed)]);
+	return 0;
+}
 
-	if (i>NUM_GERMAN_1_HARDCODED-1) {
-		AppendPart(&buf, GETNUM(5, NUM_GERMAN_2), german_2);
+static byte MakeFrenchTownName(byte *buf, uint32 seed)
+{
+	strcpy(buf, "");
+	strcat(buf, name_french_1[GetNumberBasedOnSeed(0, lengthof(name_french_1), seed)]);
+	return 0;
+}
+
+static byte MakeSillyTownName(byte *buf, uint32 seed)
+{
+	strcpy(buf, "");
+	strcat(buf, name_silly_1[GetNumberBasedOnSeed( 0, lengthof(name_silly_1), seed)]);
+	strcat(buf, name_silly_2[GetNumberBasedOnSeed(16, lengthof(name_silly_2), seed)]);
+	return 0;
+}
+
+static byte MakeSwedishTownName(byte *buf, uint32 seed)
+{
+	int i;
+
+	//null terminates the string for strcat
+	strcpy(buf, "");
+
+	// optional first segment
+	if ((i = GetNumberBasedOnSeed(0, lengthof(name_swedish_1) + 50, seed) - 50) >= 0)
+	{
+		strcat(buf, name_swedish_1[i]);
 	}
 
-	if (ext==24) {
-		i=GETNUM(9,NUM_GERMAN_4);
+	// mandatory middle segments including option of hardcoded name
+	if (GetNumberBasedOnSeed(4, 5, seed) >= 3)
+	{
+		strcat(buf, name_swedish_2[GetNumberBasedOnSeed( 7, lengthof(name_swedish_2), seed)]);
+	}
+	else
+	{
+		strcat(buf, name_swedish_2a[GetNumberBasedOnSeed( 7, lengthof(name_swedish_2a), seed)]);
+		strcat(buf, name_swedish_2b[GetNumberBasedOnSeed(10, lengthof(name_swedish_2b), seed)]);
+		strcat(buf, name_swedish_2c[GetNumberBasedOnSeed(13, lengthof(name_swedish_2c), seed)]);
+	}
 
-		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);
+	strcat(buf, name_swedish_3[GetNumberBasedOnSeed(16, lengthof(name_swedish_3), seed)]);
+
+	return 0;
+}
+
+static byte MakeDutchTownName(byte *buf, uint32 seed)
+{
+	int i;
+
+	//null terminates the string for strcat
+	strcpy(buf, "");
+
+	// optional first segment
+	if ((i = GetNumberBasedOnSeed(0, lengthof(name_dutch_1) + 50, seed) - 50) >= 0)
+	{
+		strcat(buf, name_dutch_1[i]);
+	}
+
+	// mandatory middle segments including option of hardcoded name
+	if (GetNumberBasedOnSeed(6, 9, seed) > 4)
+	{
+		strcat(buf, name_dutch_2[GetNumberBasedOnSeed( 9, lengthof(name_dutch_2), seed)]);
+	}
+	else
+	{
+		strcat(buf, name_dutch_3[GetNumberBasedOnSeed( 9, lengthof(name_dutch_3), seed)]);
+		strcat(buf, name_dutch_4[GetNumberBasedOnSeed(12, lengthof(name_dutch_4), seed)]);
+	}
+	strcat(buf, name_dutch_5[GetNumberBasedOnSeed(15, lengthof(name_dutch_5), seed)]);
+
+	return 0;
+}
+
+static byte MakeFinnishTownName(byte *buf, uint32 seed)
+{
+	//null terminates the string for strcat
+	strcpy(buf, "");
+
+	// Select randomly if town name should consists of one or two parts.
+	if (GetNumberBasedOnSeed(0, 15, seed) >= 10)
+	{
+		strcat(buf, name_finnish_1[GetNumberBasedOnSeed( 2, lengthof(name_finnish_1), seed)]);
+	}
+	else
+	{
+		strcat(buf, name_finnish_2a[GetNumberBasedOnSeed( 2, lengthof(name_finnish_2a), seed)]);
+		strcat(buf, name_finnish_2b[GetNumberBasedOnSeed(10, lengthof(name_finnish_2b), seed)]);
+	}
+
+	return 0;
+}
+
+static byte MakePolishTownName(byte *buf, uint32 seed)
+{
+	int i, j;
+
+	//null terminates the string for strcat
+	strcpy(buf, "");
+
+	// optional first segment
+	i = GetNumberBasedOnSeed(0,
+					lengthof(name_polish_2_o) +
+					lengthof(name_polish_2_m) +
+					lengthof(name_polish_2_f) +
+					lengthof(name_polish_2_n), seed);
+	j = GetNumberBasedOnSeed(2, 20, seed);
+
+
+	if (i < lengthof(name_polish_2_o))
+	{
+		strcat(buf, name_polish_2_o[GetNumberBasedOnSeed(3, lengthof(name_polish_2_o), seed)]);
+	}
+	else if (i < lengthof(name_polish_2_m) + lengthof(name_polish_2_o))
+	{
+		if (j < 4)
+			strcat(buf, name_polish_1_m[GetNumberBasedOnSeed(5, lengthof(name_polish_1_m), seed)]);
+
+		strcat(buf, name_polish_2_m[GetNumberBasedOnSeed(7, lengthof(name_polish_2_m), seed)]);
+
+		if (j >= 4 && j < 16)
+			strcat(buf, name_polish_3_m[GetNumberBasedOnSeed(10, lengthof(name_polish_3_m), seed)]);
+	}
+	else if (i < lengthof(name_polish_2_f) + lengthof(name_polish_2_m) + lengthof(name_polish_2_o))
+	{
+		if (j < 4)
+			strcat(buf, name_polish_1_f[GetNumberBasedOnSeed(5, lengthof(name_polish_1_f), seed)]);
+
+		strcat(buf, name_polish_2_f[GetNumberBasedOnSeed(7, lengthof(name_polish_2_f), seed)]);
+
+		if (j >= 4 && j < 16)
+			strcat(buf, name_polish_3_f[GetNumberBasedOnSeed(10, lengthof(name_polish_3_f), seed)]);
+	}
+	else
+	{
+		if (j < 4)
+			strcat(buf, name_polish_1_n[GetNumberBasedOnSeed(5, lengthof(name_polish_1_n), seed)]);
+
+		strcat(buf, name_polish_2_n[GetNumberBasedOnSeed(7, lengthof(name_polish_2_n), seed)]);
+
+		if (j >= 4 && j < 16)
+			strcat(buf, name_polish_3_n[GetNumberBasedOnSeed(10, lengthof(name_polish_3_n), seed)]);
+	}
+	return 0;
+}
+
+static byte MakeCzechTownName(byte *buf, uint32 seed)
+{
+	strcpy(buf, "");
+	strcat(buf, name_czech_1[GetNumberBasedOnSeed(0, lengthof(name_czech_1), seed)]);
+	return 0;
+}
+
+static byte MakeRomanianTownName(byte *buf, uint32 seed)
+{
+	strcpy(buf, "");
+	strcat(buf, name_romanian_1[GetNumberBasedOnSeed(0, lengthof(name_romanian_1), seed)]);
+	return 0;
+}
+
+static byte MakeSlovakTownName(byte *buf, uint32 seed)
+{
+	strcpy(buf, "");
+	strcat(buf, name_slovakish_1[GetNumberBasedOnSeed(0, lengthof(name_slovakish_1), seed)]);
+	return 0;
+}
+
+static byte MakeHungarianTownName(byte *buf, uint32 seed)
+{
+	int i;
+
+	//null terminates the string for strcat
+	strcpy(buf, "");
+
+	if (GetNumberBasedOnSeed(12, 15, seed) < 3)
+	{
+		strcat(buf, name_hungarian_real[GetNumberBasedOnSeed(0, lengthof(name_hungarian_real), seed)]);
+	}
+	else
+	{
+		// optional first segment
+		if ((i = GetNumberBasedOnSeed(0, lengthof(name_hungarian_1) * 3, seed)) < lengthof(name_hungarian_1))
+		{
+			strcat(buf, name_hungarian_1[i]);
+		}
+
+		// mandatory middle segments
+		strcat(buf, name_hungarian_2[GetNumberBasedOnSeed(3, lengthof(name_hungarian_2), seed)]);
+		strcat(buf, name_hungarian_3[GetNumberBasedOnSeed(6, lengthof(name_hungarian_3), seed)]);
+
+		// optional last segment
+		if ((i = GetNumberBasedOnSeed(10, lengthof(name_hungarian_4) * 3, seed)) < lengthof(name_hungarian_4)) {
+			strcat(buf, name_hungarian_4[i]);
 		}
 	}
 
 	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("Trickle")
-	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_CZECH_1 82
-static const char czech_1[] =
-	MK("As")
-	MK("Benesov")
-	MK("Beroun")
-	MK("Bezdruzice")
-	MK("Blansko")
-	MK("Breclav")
-	MK("Brno")
-	MK("Bruntál")
-	MK("Ceská Lípa")
-	MK("Ceské Budejovice")
-	MK("Ceský Krumlov")
-	MK("Decín")
-	MK("Domazlice")
-	MK("Dubí")
-	MK("Frýdek-Místek")
-	MK("Havlíckuv Brod")
-	MK("Hodonín")
-	MK("Hradec Králové")
-	MK("Humpolec")
-	MK("Cheb")
-	MK("Chomutov")
-	MK("Chrudim")
-	MK("Jablonec nad Nisou")
-	MK("Jeseník")
-	MK("Jicín")
-	MK("Jihlava")
-	MK("Jindrichuv Hradec")
-	MK("Karlovy Vary")
-	MK("Karviná")
-	MK("Kladno")
-	MK("Klatovy")
-	MK("Kolín")
-	MK("Kosmonosy")
-	MK("Kromeríz")
-	MK("Kutná Hora")
-	MK("Liberec")
-	MK("Litomerice")
-	MK("Louny")
-	MK("Manetín")
-	MK("Melník")
-	MK("Mladá Boleslav")
-	MK("Most")
-	MK("Náchod")
-	MK("Nový Jicín")
-	MK("Nymburk")
-	MK("Olomouc")
-	MK("Opava")
-	MK("Orácov")
-	MK("Ostrava")
-	MK("Pardubice")
-	MK("Pelhrimov")
-	MK("Polzice")
-	MK("Písek")
-	MK("Plzen")
-	MK("Praha")
-	MK("Prachatice")
-	MK("Prerov")
-	MK("Príbram")
-	MK("Prostejov")
-	MK("Rakovník")
-	MK("Rokycany")
-	MK("Rudná")
-	MK("Rychnov nad Kneznou")
-	MK("Semily")
-	MK("Sokolov")
-	MK("Strakonice")
-	MK("Stredokluky")
-	MK("Sumperk")
-	MK("Svitavy")
-	MK("Tábor")
-	MK("Tachov")
-	MK("Teplice")
-	MK("Trebíc")
-	MK("Trutnov")
-	MK("Uherské Hradiste")
-	MK("Ústí nad Labem")
-	MK("Ústí nad Orlicí")
-	MK("Vsetín")
-	MK("Vyskov")
-	MK("Zdár nad Sázavou")
-	MK("Zlín")
-	MK("Znojmo")
-;
-
-static byte MakeCzechTownName(byte *buf, uint32 seed)
-{
-	AppendPart(&buf, GETNUM(0, NUM_CZECH_1), czech_1);
-	return 0;
-}
-
-#define NUM_ROMANIAN_1 94
-static const char romanian_1[]=
-	MK("Adjud")
-	MK("Alba Iulia")
-	MK("Alexandria")
-	MK("Babadag")
-	MK("Bacău")
-	MK("Baia Mare")
-	MK("Băile Herculane")
-	MK("Băilesti")
-	MK("Bârlad")
-	MK("Bicaz")
-	MK("Bistrita")
-	MK("Blaj")
-	MK("Borsec")
-	MK("Botosani")
-	MK("Brăila")
-	MK("Brasov")
-	MK("Bucuresti")
-	MK("Buftea")
-	MK("Buzău")
-	MK("Călărasi")
-	MK("Caransebes")
-	MK("Cernavodă")
-	MK("Cluj-Napoca")
-	MK("Constanta")
-	MK("Covasna")
-	MK("Craiova")
-	MK("Dej")
-	MK("Deva")
-	MK("Dorohoi")
-	MK("Dr.-Tr. Severin")
-	MK("Drăgăsani")
-	MK("Făgăras")
-	MK("Fălticeni")
-	MK("Fetesti")
-	MK("Focsani")
-	MK("Galati")
-	MK("Gheorgheni")
-	MK("Giurgiu")
-	MK("Hârsova")
-	MK("Hunedoara")
-	MK("Husi")
-	MK("Iasi")
-	MK("Isaccea")
-	MK("Lugoj")
-	MK("Măcin")
-	MK("Mangalia")
-	MK("Medgidia")
-	MK("Medias")
-	MK("Miercurea Ciuc")
-	MK("Mizil")
-	MK("Motru")
-	MK("Năsăud")
-	MK("Năvodari")
-	MK("Odobesti")
-	MK("Oltenita")
-	MK("Onesti")
-	MK("Oradea")
-	MK("Orsova")
-	MK("Petrosani")
-	MK("Piatra Neamt")
-	MK("Pitesti")
-	MK("Ploiesti")
-	MK("Predeal")
-	MK("Râmnicu Vâlcea")
-	MK("Reghin")
-	MK("Resita")
-	MK("Roman")
-	MK("Rosiorii de Vede")
-	MK("Satu Mare")
-	MK("Sebes")
-	MK("Sfântu Gheorghe")
-	MK("Sibiu")
-	MK("Sighisoara")
-	MK("Sinaia")
-	MK("Slatina")
-	MK("Slobozia")
-	MK("Sovata")
-	MK("Suceava")
-	MK("Sulina")
-	MK("Tăndărei")
-	MK("Târgoviste")
-	MK("Târgu Jiu")
-	MK("Târgu Mures")
-	MK("Tecuci")
-	MK("Timisoara")
-	MK("Tulcea")
-	MK("Turda")
-	MK("Turnu Măgurele")
-	MK("Urziceni")
-	MK("Vaslui")
-	MK("Vatra Dornei")
-	MK("Victoria")
-	MK("Videle")
-	MK("Zalău")
-;
-
-static byte MakeRomanianTownName(byte *buf, uint32 seed)
-{
-	AppendPart(&buf, GETNUM(0, NUM_ROMANIAN_1), romanian_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 MakeSlovakTownName(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,
+	MakeEnglishOriginalTownName,
 	MakeFrenchTownName,
 	MakeGermanTownName,
-	MakeAmericanTownName,
+	MakeEnglishAdditionalTownName,
 	MakeSpanishTownName,
 	MakeSillyTownName,
 	MakeSwedishTownName,
@@ -2181,6 +428,7 @@
 	MakeCzechTownName,
 };
 
+// DO WE NEED THIS ANY MORE?
 #define FIXNUM(x, y, z) (((((x) << 16) / (y)) + 1) << z)
 
 uint32 GetOldTownName(uint32 townnameparts, byte old_town_name_type)
@@ -2191,19 +439,19 @@
 			return townnameparts;
 		case 1: /* French */
 			/*	For some reason 86 needs to be subtracted from townnameparts
-			 *	0000 0000 0000 0000 0000 0000 1111 1111 */
-			return FIXNUM(townnameparts - 86, NUM_FRENCH_1, 0);
+			*	0000 0000 0000 0000 0000 0000 1111 1111 */
+			return FIXNUM(townnameparts - 86, lengthof(name_french_1), 0);
 		case 2: /* German */
 			DEBUG(misc, 0) ("German Townnames are buggy... (%d)", townnameparts);
 			return townnameparts;
 		case 4: /* Latin-American */
 			/*	0000 0000 0000 0000 0000 0000 1111 1111 */
-			return FIXNUM(townnameparts, NUM_SPANISH_1, 0);
+			return FIXNUM(townnameparts, lengthof(name_spanish_1), 0);
 		case 5: /* Silly */
 			/*	NUM_SILLY_1	-	lower 16 bits
-			 *	NUM_SILLY_2	-	upper 16 bits without leading 1 (first 8 bytes)
-			 *	1000 0000 2222 2222 0000 0000 1111 1111 */
-			return FIXNUM(townnameparts, NUM_SILLY_1, 0) | FIXNUM(((townnameparts >> 16)&0xFF), NUM_SILLY_2, 16);
+			*	NUM_SILLY_2	-	upper 16 bits without leading 1 (first 8 bytes)
+			*	1000 0000 2222 2222 0000 0000 1111 1111 */
+			return FIXNUM(townnameparts, lengthof(name_silly_1), 0) | FIXNUM(((townnameparts >> 16)&0xFF), lengthof(name_silly_2), 16);
 	}
 	return 0;
 }
--- a/settings_gui.c	Fri Dec 31 09:47:09 2004 +0000
+++ b/settings_gui.c	Fri Dec 31 14:43:47 2004 +0000
@@ -76,7 +76,7 @@
 		SetDParam(1, _currency_string_list[_opt_mod_ptr->currency]);
 		SetDParam(2, _opt_mod_ptr->kilometers + STR_0139_IMPERIAL_MILES);
 		SetDParam(3, STR_02E9_DRIVE_ON_LEFT + _opt_mod_ptr->road_side);
-		SetDParam(4, STR_TOWNNAME_ENGLISH + _opt_mod_ptr->town_name);
+		SetDParam(4, STR_TOWNNAME_ORIGINAL_ENGLISH + _opt_mod_ptr->town_name);
 		SetDParam(5, _autosave_dropdown[_opt_mod_ptr->autosave]);
 		SetDParam(6, SPECSTR_LANGUAGE_START + _dynlang.curr);
 		i = GetCurRes();
@@ -103,7 +103,7 @@
 		}
 		case 14: {
 			int i = _opt_mod_ptr->town_name;
-			ShowDropDownMenu(w, BuildDynamicDropdown(STR_TOWNNAME_ENGLISH, SPECSTR_TOWNNAME_LAST - SPECSTR_TOWNNAME_START + 1), i, e->click.widget, (_game_mode == GM_MENU) ? 0 : (-1) ^ (1 << i));
+			ShowDropDownMenu(w, BuildDynamicDropdown(STR_TOWNNAME_ORIGINAL_ENGLISH, SPECSTR_TOWNNAME_LAST - SPECSTR_TOWNNAME_START + 1), i, e->click.widget, (_game_mode == GM_MENU) ? 0 : (-1) ^ (1 << i));
 			return;
 		}
 		case 17:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/table/namegen.h	Fri Dec 31 14:43:47 2004 +0000
@@ -0,0 +1,1978 @@
+#include "../stdafx.h"
+#include "../ttd.h"
+
+static const char *name_original_english_1[] = {
+	"Great ",
+	"Little ",
+	"New ",
+	"Fort ",
+};
+
+static const char *name_original_english_2[] = {
+	"Wr",
+	"B",
+	"C",
+	"Ch",
+	"Br",
+	"D",
+	"Dr",
+	"F",
+	"Fr",
+	"Fl",
+	"G",
+	"Gr",
+	"H",
+	"L",
+	"M",
+	"N",
+	"P",
+	"Pr",
+	"Pl",
+	"R",
+	"S",
+	"S",
+	"Sl",
+	"T",
+	"Tr",
+	"W"
+};
+
+static const char *name_original_english_3[] = { 
+	"ar", 
+	"a", 
+	"e", 
+	"in", 
+	"on",
+	"u",
+	"un", 
+	"en"
+};
+
+static const char *name_original_english_4[] = {
+	"n",
+	"ning",
+	"ding",
+	"d",
+	"",
+	"t"
+	"fing"
+};
+
+static const char *name_original_english_5[] = {
+	"ville",
+	"ham",
+	"field",
+	"ton",
+	"town",
+	"bridge",
+	"bury",
+	"wood",
+	"ford",
+	"hall",
+	"ston",
+	"way",
+	"stone",
+	"borough",
+	"ley",
+	"head",
+	"bourne",
+	"pool",
+	"worth",
+	"hill",
+	"well",
+	"hattan",
+	"burg",
+};
+
+static const char *name_original_english_6[] = {
+	"-on-sea",
+	" Bay",
+	" Market",
+	" Cross",
+	" Bridge",
+	" Falls",
+	" City",
+	" Ridge",
+	" Springs"
+};
+
+static const char *name_additional_english_prefix[] = {
+	"Great ",
+	"Little ",
+	"New ",
+	"Fort ",
+	"St. ",
+	"Old "
+};
+
+static const char *name_additional_english_1a[] = {
+	"Pen",
+	"Lough", 
+	"Stam",
+	"Aber",
+	"Acc",
+	"Ex",
+	"Ax",
+	"Bre",
+	"Cum",
+	"Dun",
+	"Fin",
+	"Inver",
+	"Kin",
+	"Mon",
+	"Nan",
+	"Nant",
+	"Pit",
+	"Pol",
+	"Pont",
+	"Strath",
+	"Tre",
+	"Tilly",
+	"Beck",
+	"Canter",
+	"Bath",
+	"Liver",
+	"Mal",
+	"Ox",
+	"Bletch",
+	"Maccles",
+	"Grim",
+	"Wind",
+	"Sher",
+	"Gates",
+	"Orp",
+	"Brom",
+	"Lewis",
+	"Whit",
+	"White",
+	"Worm",
+	"Tyne",
+	"Avon",
+	"Stan"
+};
+
+static const char *name_additional_english_1b1[] = {
+	"Wr",
+	"B",
+	"C",
+	"Ch",
+	"Br",
+	"D",
+	"Dr",
+	"F",
+	"Fr",
+	"Fl",
+	"G",
+	"Gr",
+	"H",
+	"L",
+	"M",
+	"N",
+	"P",
+	"Pr",
+	"Pl",
+	"R",
+	"S",
+	"S",
+	"Sl",
+	"T",
+	"Tr",
+	"W"
+};
+
+static const char *name_additional_english_1b2[] = { 
+	"ar", 
+	"a", 
+	"e", 
+	"in", 
+	"on",
+	"u",
+	"o",
+	"ee",
+	"es",
+	"ea",
+	"un", 
+	"en"
+};
+
+static const char *name_additional_english_1b3a[] = {
+	"n",
+	"d",
+	"",
+	"t",
+	"",
+	""
+};
+
+static const char *name_additional_english_1b3b[] = {
+	"ning",
+	"ding",
+	"fing"
+};
+
+static const char *name_additional_english_2[] = {
+	"ville",
+	"ham",
+	"field",
+	"ton",
+	"town",
+	"borough",
+	"bridge",
+	"bury",
+	"wood",
+	"ditch",
+	"ford",
+	"hall",
+	"dean",
+	"leigh",
+	"dore",
+	"ston",
+	"stow",
+	"church",
+	"wich",
+	"low",
+	"way",
+	"stone",
+	"minster",
+	"ley",
+	"head",
+	"bourne",
+	"pool",
+	"worth",
+	"hill",
+	"well",
+	"hattan",
+	"burg",
+	"berg",
+	"burgh",
+	"port",
+	"stoke",
+	"haven",
+	"stable",
+	"stock",
+	"side",
+	"brook",
+	"don",
+	"den",
+	"down",
+	"nor",
+	"grove",
+	"combe",
+	"by",
+	"say",
+	"ney",
+	"chester",
+	"dale",
+	"ness",
+	"shaw",
+	"thwaite"
+};
+
+static const char *name_additional_english_3[] = {
+	"-on-sea",
+	" Bay",
+	" Market",
+	" Beeches",
+	" Common",
+	" Park",
+	" Heath",
+	" Marsh",
+	" Green",
+	" Castle",
+	" End",
+	" Rivers",
+	" Cross",
+	" Bridge",
+	" Falls",
+	" City",
+	" Ridge",
+	" Springs"
+};
+
+static const char *name_austrian_a1[] = {
+	"Bad ",
+	"Deutsch ",
+	"Gross ",
+	"Klein ",
+	"Markt ",
+	"Maria "
+};
+
+static const char *name_austrian_a2[] = {
+	"Aus",
+	"Alten",
+	"Braun",
+	"Vösl",
+	"Mittern",
+	"Nuss",
+	"Neu",
+	"Walters",
+	"Breiten",
+	"Eisen",
+	"Feld",
+	"Mittern",
+	"Gall",
+	"Obern",
+	"Grat",
+	"Heiligen",
+	"Hof",
+	"Holla",
+	"Stein",
+	"Eber",
+	"Eggen",
+	"Enzers",
+	"Frauen",
+	"Herren",
+	"Hof",
+	"Hütt",
+	"Kaisers",
+	"Königs",
+	"Knittel",
+	"Lang",
+	"Ober",
+	"Ollers",
+	"Pfaffen",
+	"Potten",
+	"Salz",
+	"Schwarz",
+	"Stocker",
+	"Unter",
+	"Utten",
+	"Vösen",
+	"Vill",
+	"Weissen"
+};
+
+static const char *name_austrian_a3[] = {
+	"see",
+	"bach",
+	"dorf",
+	"ach",
+	"stein",
+	"hofen",
+	"au",
+	"ach",
+	"kirch",
+	"kirchen",
+	"kreuz",
+	"brunn",
+	"siedl",
+	"markt",
+	"wang",
+	"haag"
+};
+
+static const char *name_austrian_a4[] = {
+	"Bruck",
+	"Brunn",
+	"Gams",
+	"Grein",
+	"Ried",
+	"Faak",
+	"Zell",
+	"Spital",
+	"Kirchberg",
+	"Saal",
+	"Taferl",
+	"Wald"
+};
+
+static const char *name_austrian_a5[] = {
+	"St. ",
+	"Sankt "
+};
+
+static const char *name_austrian_a6[] = {
+	"Aegyd",
+	"Andrä",
+	"Georgen",
+	"Jakob",
+	"Johann",
+	"Leonhard",
+	"Marein",
+	"Lorenzen",
+	"Margarethen",
+	"Martin",
+	"Michael",
+	"Nikolai",
+	"Oswald",
+	"Peter",
+	"Pölten",
+	"Stefan",
+	"Stephan",
+	"Thomas",
+	"Veit",
+	"Wolfgang"
+};
+
+static const char *name_austrian_f1[] = {
+	" an der ",
+	" ob der "
+};
+
+static const char *name_austrian_f2[] = {
+	"Donau",
+	"Steyr",
+	"Lafnitz",
+	"Leitha",
+	"Thaya",
+	"Gail",
+	"Drau",
+	"Salzach",
+	"Ybbs",
+	"Traisen",
+	"Enns",
+	"Mur",
+	"Ill"
+};
+
+static const char *name_austrian_b1[] = {
+	" am "
+};
+
+static const char *name_austrian_b2[] = {
+	"Brenner",
+	"Dachstein",
+	"Gebirge",
+	"Grossglockner",
+	"Hausruck",
+	"Semmering",
+	"Wagram",
+	"Wechsel",
+	"Wilden Kaiser",
+	"Ziller"
+};
+
+static const char *name_german_hardcoded[] = {
+	"Berlin",
+	"Bonn",
+	"Bremen",
+	"Cottbus",
+	"Chemnitz",
+	"Dortmund",
+	"Dresden",
+	"Erfurt",
+	"Erlangen",
+	"Essen",
+	"Fulda",
+	"Gera",
+	"Kassel",
+	"Kiel",
+	"Köln",
+	"Lübeck",
+	"Magdeburg",
+	"München",
+	"Potsdam",
+	"Stuttgart",
+	"Wiesbaden"
+};
+
+static const char *name_german_pre[] = {
+	"Bad ",
+	"Klein ",
+	"Neu "
+};
+
+static const char *name_german_1[] = {
+	"Alb",
+	"Als",
+	"Ander",
+	"Arns",
+	"Bruns",
+	"Bam",
+	"Biele",
+	"Cloppen",
+	"Co",
+	"Duis",
+	"Düssel",
+	"Dannen",
+	"Elb",
+	"Els",
+	"Elster",
+	"Eichen",
+	"Ems",
+	"Fahr",
+	"Falken",
+	"Flens",
+	"Frank",
+	"Frei",
+	"Freuden",
+	"Fried",
+	"Fürsten",
+	"Hahn",
+	"Ham",
+	"Harz",
+	"Heidel",
+	"Hers",
+	"Herz",
+	"Holz",
+	"Hildes",
+	"Inns",
+	"Ilsen",
+	"Ingols",
+	"Kel",
+	"Kies",
+	"Korn",
+	"Kor",
+	"Kreuz",
+	"Kulm",
+	"Langen",
+	"Lim",
+	"Lohr",
+	"Lüne",
+	"Mel",
+	"Michels",
+	"Mühl",
+	"Naum",
+	"Nest",
+	"Nord",
+	"Nort",
+	"Nien",
+	"Nidda",
+	"Nieder",
+	"Nürn",
+	"Ober",
+	"Offen",
+	"Osna",
+	"Olden",
+	"Ols",
+	"Oranien",
+	"Pader",
+	"Quedlin",
+	"Quer",
+	"Ravens",
+	"Regens",
+	"Rott",
+	"Ros",
+	"Rüssels",
+	"Saal",
+	"Saar",
+	"Salz",
+	"Schöne",
+	"Schwein",
+	"Sonder",
+	"Sonnen",
+	"Stein",
+	"Strals",
+	"Straus",
+	"Süd",
+	"Ton",
+	"Unter",
+	"Ur",
+	"Vor",
+	"Wald",
+	"War",
+	"Wert",
+	"Wester",
+	"Witten",
+	"Wolfs",
+	"Würz"
+};
+
+static const char *name_german_2[] = {
+	"bach",
+	"berg",
+	"brück",
+	"brücken",
+	"burg",
+	"dorf",
+	"feld",
+	"furt",
+	"hausen",
+	"haven",
+	"heim",
+	"horst",
+	"mund",
+	"münster",
+	"stadt",
+	"wald"
+};
+
+static const char *name_german_3_an_der[] = {
+	" an der "
+};
+
+static const char *name_german_3_am[] = {
+	" am "
+};
+
+static const char *name_german_4_an_der[] = {
+	"Oder",
+	"Spree",
+	"Donau",
+	"Saale",
+	"Elbe"
+};
+	
+static const char *name_german_4_am[] = {	
+	"Main"
+};
+
+static const char *name_spanish_1[] = {
+	"Caracas",
+	"Maracay",
+	"Maracaibo",
+	"Velencia",
+	"El Dorado",
+	"Morrocoy",
+	"Cata",
+	"Cataito",
+	"Ciudad Bolivar",
+	"Barquisimeto",
+	"Merida",
+	"Puerto Ordaz",
+	"Santa Elena",
+	"San Juan",
+	"San Luis",
+	"San Rafael",
+	"Santiago",
+	"Barcelona",
+	"Barinas",
+	"San Cristobal",
+	"San Fransisco",
+	"San Martin",
+	"Guayana",
+	"San Carlos",
+	"El Limon",
+	"Coro",
+	"Corocoro",
+	"Puerto Ayacucho",
+	"Elorza",
+	"Arismendi",
+	"Trujillo",
+	"Carupano",
+	"Anaco",
+	"Lima",
+	"Cuzco",
+	"Iquitos",
+	"Callao",
+	"Huacho",
+	"Camana",
+	"Puerto Chala",
+	"Santa Cruz",
+	"Quito",
+	"Cuenca",
+	"Huacho",
+	"Tulcan",
+	"Esmereldas",
+	"Ibarra",
+	"San Lorenzo",
+	"Macas",
+	"Morana",
+	"Machala",
+	"Zamora",
+	"Latacunga",
+	"Tena",
+	"Cochabamba",
+	"Ascencion",
+	"Magdalena",
+	"Santa Ana",
+	"Manoa",
+	"Sucre",
+	"Oruro",
+	"Uyuni",
+	"Potosi",
+	"Tupiza",
+	"La Quiaca",
+	"Yacuiba",
+	"San Borja",
+	"Fuerte Olimpio",
+	"Fortin Esteros",
+	"Campo Grande",
+	"Bogota",
+	"El Banco",
+	"Zaragosa",
+	"Neiva",
+	"Mariano",
+	"Cali",
+	"La Palma",
+	"Andoas",
+	"Barranca",
+	"Montevideo",
+	"Valdivia",
+	"Arica",
+	"Temuco",
+	"Tocopilla",
+	"Mendoza",
+	"Santa Rosa"
+};
+
+static const char *name_french_1[] = {
+	"Agincourt",
+	"Lille",
+	"Dinan",
+	"Aubusson",
+	"Rodez",
+	"Bergerac",
+	"Bordeaux",
+	"Bayonne",
+	"Montpellier",
+	"Montelimar",
+	"Valence",
+	"Digne",
+	"Nice",
+	"Cannes",
+	"St. Tropez",
+	"Marseilles",
+	"Narbonne",
+	"Sčte",
+	"Aurillac",
+	"Gueret",
+	"Le Creusot",
+	"Nevers",
+	"Auxerre",
+	"Versailles",
+	"Meaux",
+	"Châlons",
+	"Compičgne",
+	"Metz",
+	"Chaumont",
+	"Langres",
+	"Bourg",
+	"Lyons",
+	"Vienne",
+	"Grenoble",
+	"Toulon",
+	"Rennes",
+	"Le Mans",
+	"Angers",
+	"Nantes",
+	"Châteauroux",
+	"Orléans",
+	"Lisieux",
+	"Cherbourg",
+	"Morlaix",
+	"Cognac",
+	"Agen",
+	"Tulle",
+	"Blois",
+	"Troyes",
+	"Charolles",
+	"Grenoble",
+	"Chambéry",
+	"Tours",
+	"St. Brieuc",
+	"St. Malo",
+	"La Rochelle",
+	"St. Flour",
+	"Le Puy",
+	"Vichy",
+	"St. Valery",
+	"Beaujolais",
+	"Narbonne",
+	"Albi",
+	"St. Valery",
+	"Biarritz",
+	"Béziers",
+	"Nîmes",
+	"Chamonix",
+	"Angoulčme",
+	"Alençon"
+};
+
+static const char *name_silly_1[] = {
+	"Binky",
+	"Blubber",
+	"Bumble",
+	"Crinkle",
+	"Crusty",
+	"Dangle",
+	"Dribble",
+	"Flippety",
+	"Google",
+	"Muffin",
+	"Nosey",
+	"Pinker",
+	"Quack",
+	"Rumble",
+	"Sleepy",
+	"Sliggles",
+	"Snooze",
+	"Teddy",
+	"Tinkle",
+	"Twister",
+	"Pinker",
+	"Hippo",
+	"Itchy",
+	"Jelly",
+	"Jingle",
+	"Jolly",
+	"Kipper",
+	"Lazy",
+	"Frogs",
+	"Mouse",
+	"Quack",
+	"Cheeky",
+	"Lumpy",
+	"Grumpy",
+	"Mangle",
+	"Fiddle",
+	"Slugs",
+	"Noodles",
+	"Poodles",
+	"Shiver",
+	"Rumble",
+	"Pixie",
+	"Puddle",
+	"Riddle",
+	"Rattle",
+	"Rickety",
+	"Waffle",
+	"Sagging",
+	"Sausage",
+	"Egg",
+	"Sleepy",
+	"Scatter",
+	"Scramble",
+	"Silly",
+	"Simple",
+	"Trickle",
+	"Slippery",
+	"Slimey",
+	"Slumber",
+	"Soggy",
+	"Sliggles",
+	"Splutter",
+	"Sulky",
+	"Swindle",
+	"Swivel",
+	"Tasty",
+	"Tangle",
+	"Toggle",
+	"Trotting",
+	"Tumble",
+	"Snooze",
+	"Water",
+	"Windy",
+	"Amble",
+	"Bubble",
+	"Cheery",
+	"Cheese",
+	"Cockle",
+	"Cracker",
+	"Crumple",
+	"Teddy",
+	"Evil",
+	"Fairy",
+	"Falling",
+	"Fishy",
+	"Fizzle",
+	"Frosty",
+	"Griddle"
+};
+
+static const char *name_silly_2[] = {
+	"ton",
+	"bury",
+	"bottom",
+	"ville",
+	"well",
+	"weed",
+	"worth",
+	"wig",
+	"wick",
+	"wood",
+	"pool",
+	"head",
+	"burg",
+	"gate",
+	"bridge"
+};
+
+static const char *name_swedish_1[] = {
+	"Gamla ",
+	"Lilla ",
+	"Nya ",
+	"Stora "
+};
+
+static const char *name_swedish_2[] = {
+	"Boll",
+	"Bor",
+	"Ed",
+	"En",
+	"Erik",
+	"Es",
+	"Fin",
+	"Fisk",
+	"Grön",
+	"Hag",
+	"Halm",
+	"Karl",
+	"Kram",
+	"Kung",
+	"Land",
+	"Lid",
+	"Lin",
+	"Mal",
+	"Malm",
+	"Marie",
+	"Ner",
+	"Norr",
+	"Oskar",
+	"Sand",
+	"Skog",
+	"Stock",
+	"Stor",
+	"Ström",
+	"Sund",
+	"Söder",
+	"Tall",
+	"Tratt",
+	"Troll",
+	"Upp",
+	"Var",
+	"Väster",
+	"Ängel",
+	"Öster"
+};
+
+static const char *name_swedish_2a[] = {
+	"B",
+	"Br",
+	"D",
+	"Dr",
+	"Dv",
+	"F",
+	"Fj",
+	"Fl",
+	"Fr",
+	"G",
+	"Gl",
+	"Gn",
+	"Gr",
+	"H",
+	"J",
+	"K",
+	"Kl",
+	"Kn",
+	"Kr",
+	"Kv",
+	"L",
+	"M",
+	"N",
+	"P",
+	"Pl",
+	"Pr",
+	"R",
+	"S",
+	"Sk",
+	"Skr",
+	"Sl",
+	"Sn",
+	"Sp",
+	"Spr",
+	"St",
+	"Str",
+	"Sv",
+	"T",
+	"Tr",
+	"Tv",
+	"V",
+	"Vr"
+};
+
+static const char *name_swedish_2b[] = {
+	"a",
+	"e",
+	"i",
+	"o",
+	"u",
+	"y",
+	"ĺ",
+	"ä",
+	"ö"
+};
+
+static const char *name_swedish_2c[] = {
+	"ck",
+	"d",
+	"dd",
+	"g",
+	"gg",
+	"l",
+	"ld",
+	"m",
+	"n",
+	"nd",
+	"ng",
+	"nn",
+	"p",
+	"pp",
+	"r",
+	"rd",
+	"rk",
+	"rp",
+	"rr",
+	"rt",
+	"s",
+	"sk",
+	"st",
+	"t",
+	"tt",
+	"v"
+};
+
+static const char *name_swedish_3[] = {
+	"arp",
+	"berg",
+	"boda",
+	"borg",
+	"bro",
+	"bukten",
+	"by",
+	"byn",
+	"fors",
+	"hammar",
+	"hamn",
+	"holm",
+	"hus",
+	"hättan",
+	"kulle",
+	"köping",
+	"lund",
+	"löv",
+	"sala",
+	"skrona",
+	"slätt",
+	"spĺng",
+	"stad",
+	"sund",
+	"svall",
+	"svik",
+	"sĺker",
+	"udde",
+	"valla",
+	"viken",
+	"älv",
+	"ĺs"
+};
+
+static const char *name_dutch_1[] = {
+	"Nieuw ",
+	"Oud ",
+	"Groot ",
+	"Zuid ",
+	"Noord ",
+	"Oost ",
+	"West ",
+	"Klein "
+};
+
+static const char *name_dutch_2[] = {
+	"Hoog",
+	"Laag",
+	"Zuider",
+	"Zuid",
+	"Ooster",
+	"Oost",
+	"Wester",
+	"West",
+	"Hoofd",
+	"Midden",
+	"Eind",
+	"Amster",
+	"Amstel",
+	"Dord",
+	"Rotter",
+	"Haar",
+	"Til",
+	"Enk",
+	"Dok",
+	"Veen",
+	"Leidsch",
+	"Lely",
+	"En",
+	"Kaats",
+	"U",
+	"Maas",
+	"Mar",
+	"Bla",
+	"Al",
+	"Alk",
+	"Eer",
+	"Drie",
+	"Ter",
+	"Groes",
+	"Goes",
+	"Soest",
+	"Coe",
+	"Uit",
+	"Zwaag",
+	"Hellen",
+	"Slie",
+	"IJ",
+	"Grubben",
+	"Groen",
+	"Lek",
+	"Ridder",
+	"Schie",
+	"Olde",
+	"Roose",
+	"Haar",
+	"Til",
+	"Loos",
+	"Hil"
+};
+
+static const char *name_dutch_3[] = {
+	"Drog",
+	"Nat",
+	"Valk",
+	"Bob",
+	"Dedem",
+	"Kollum",
+	"Best",
+	"Hoend",
+	"Leeuw",
+	"Graaf",
+	"Uithuis",
+	"Purm",
+	"Hard",
+	"Hell",
+	"Werk",
+	"Spijk",
+	"Vink",
+	"Wams",
+	"Heerhug",
+	"Koning"
+};
+
+static const char *name_dutch_4[] = {
+	"e",
+	"er",
+	"el",
+	"en",
+	"o",
+	"s"
+};
+
+static const char *name_dutch_5[] = {
+	"stad",
+	"vorst",
+	"dorp",
+	"dam",
+	"beek",
+	"doorn",
+	"zijl",
+	"zijlen",
+	"lo",
+	"muiden",
+	"meden",
+	"vliet",
+	"nisse",
+	"daal",
+	"vorden",
+	"vaart",
+	"mond",
+	"zaal",
+	"water",
+	"duinen",
+	"heuvel",
+	"geest",
+	"kerk",
+	"meer",
+	"maar",
+	"hoorn",
+	"rade",
+	"wijk",
+	"berg",
+	"heim",
+	"sum",
+	"richt",
+	"burg",
+	"recht",
+	"drecht",
+	"trecht",
+	"tricht",
+	"dricht",
+	"lum",
+	"rum",
+	"halen",
+	"oever",
+	"wolde",
+	"veen",
+	"hoven",
+	"gast",
+	"kum",
+	"hage",
+	"dijk",
+	"zwaag",
+	"pomp",
+	"huizen",
+	"bergen",
+	"schede",
+	"mere",
+	"end"
+};
+
+static const char *name_finnish_1[] = {
+	"Aijala",
+	"Kisko",
+	"Espoo",
+	"Helsinki",
+	"Tapiola",
+	"Järvelä",
+	"Lahti",
+	"Kotka",
+	"Hamina",
+	"Loviisa",
+	"Kouvola",
+	"Tampere",
+	"Kokkola",
+	"Oulu",
+	"Salo",
+	"Malmi",
+	"Pelto",
+	"Koski",
+	"Iisalmi",
+	"Raisio",
+	"Taavetti",
+	"Joensuu",
+	"Imatra",
+	"Tapanila",
+	"Pasila"
+};
+
+static const char *name_finnish_2a[] = {
+	"Hiekka",
+	"Haapa",
+	"Mylly",
+	"Kivi",
+	"Lappeen",
+	"Lohjan",
+	"Savon",
+	"Sauna",
+	"Keri",
+	"Uusi",
+	"Vanha",
+	"Lapin",
+	"Kesä",
+	"Kuusi",
+	"Pelto",
+	"Tuomi",
+	"Pitäjän",
+	"Terva",
+	"Olki",
+	"Heinä",
+	"Kuusan",
+	"Seinä",
+	"Kemi",
+	"Rova",
+	"Martin",
+	"Koivu"
+};
+
+static const char *name_finnish_2b[] = {
+	"harju",
+	"linna",
+	"järvi",
+	"kallio",
+	"mäki",
+	"nummi",
+	"joki",
+	"kylä",
+	"lampi",
+	"lahti",
+	"metsä",
+	"suo",
+	"laakso",
+	"niitty",
+	"luoto",
+	"hovi",
+	"ranta",
+	"koski"
+};
+
+static const char *name_polish_1_m[] = {
+	"Wielki ",
+	"Maly ",
+	"Zly ",
+	"Dobry ",
+	"Nowy ",
+	"Stary ",
+	"Zloty ",
+	"Zielony ",
+	"Bialy ",
+	"Modry ",
+	"Debowy "
+};
+
+static const char *name_polish_1_f[] = {
+	"Wielka ",
+	"Mala ",
+	"Zla ",
+	"Dobra ",
+	"Nowa ",
+	"Stara ",
+	"Zlota ",
+	"Zielona ",
+	"Biala ",
+	"Modra ",
+	"Debowa "
+};
+
+static const char *name_polish_1_n[] = {
+	"Wielkie ",
+	"Male ",
+	"Zle ",
+	"Dobre ",
+	"Nowe ",
+	"Stare ",
+	"Zlote ",
+	"Zielone ",
+	"Biale ",
+	"Modre ",
+	"Debowe "
+};
+
+static const char *name_polish_2_o[] = {
+	"Frombork",
+	"Gniezno",
+	"Olsztyn",
+	"Torun",
+	"Bydgoszcz",
+	"Terespol",
+	"Krakow",
+	"Poznan",
+	"Wroclaw",
+	"Katowice",
+	"Cieszyn",
+	"Bytom",
+	"Frombork",
+	"Hel",
+	"Konin",
+	"Lublin",
+	"Malbork",
+	"Sopot",
+	"Sosnowiec",
+	"Gdansk",
+	"Gdynia",
+	"Sieradz",
+	"Sandomierz",
+	"Szczyrk",
+	"Szczytno",
+	"Szczecin",
+	"Zakopane",
+	"Szklarska Poreba",
+	"Bochnia",
+	"Golub-Dobrzyn",
+	"Chojnice",
+	"Ostrowiec",
+	"Otwock",
+	"Wolsztyn"
+};
+
+static const char *name_polish_2_m[] = {
+	"Jarocin",
+	"Gogolin",
+	"Tomaszow",
+	"Piotrkow",
+	"Lidzbark",
+	"Rypin",
+	"Radzymin",
+	"Wolomin",
+	"Pruszkow",
+	"Olsztynek",
+	"Rypin",
+	"Cisek",
+	"Krotoszyn",
+	"Stoczek",
+	"Lubin",
+	"Lubicz",
+	"Milicz",
+	"Targ",
+	"Ostrow",
+	"Ozimek",
+	"Puck",
+	"Rzepin",
+	"Siewierz",
+	"Stargard",
+	"Starogard",
+	"Turek",
+	"Tymbark",
+	"Wolsztyn",
+	"Strzepcz",
+	"Strzebielin",
+	"Sochaczew",
+	"Grebocin",
+	"Gniew",
+	"Lubliniec",
+	"Lubasz",
+	"Lutomiersk",
+	"Niemodlin",
+	"Przeworsk",
+	"Ursus",
+	"Tyczyn",
+	"Sztum",
+	"Szczebrzeszyn",
+	"Wolin",
+	"Wrzeszcz",
+	"Zgierz",
+	"Zieleniec",
+	"Drobin",
+	"Garwolin"
+};
+
+static const char *name_polish_2_f[] = {
+	"Szprotawa",
+	"Pogorzelica",
+	"Motlawa",
+	"Lubawa",
+	"Nidzica",
+	"Kruszwica",
+	"Bierawa",
+	"Brodnica",
+	"Chojna",
+	"Krzepica",
+	"Ruda",
+	"Rumia",
+	"Tuchola",
+	"Trzebinia",
+	"Ustka",
+	"Warszawa",
+	"Bobowa",
+	"Dukla",
+	"Krynica",
+	"Murowana",
+	"Niemcza",
+	"Zaspa",
+	"Zawoja",
+	"Wola",
+	"Limanowa",
+	"Rabka",
+	"Skawina",
+	"Pilawa"
+};
+
+static const char *name_polish_2_n[] = {
+	"Lipsko",
+	"Pilzno",
+	"Przodkowo",
+	"Strzelno",
+	"Susz",
+	"Jaworzno",
+	"Choszczno",
+	"Mogilno",
+	"Luzino",
+	"Miasto",
+	"Dziadowo",
+	"Kowalewo",
+	"Legionowo",
+	"Miastko",
+	"Zabrze",
+	"Zawiercie",
+	"Kochanowo",
+	"Miechucino",
+	"Mirachowo",
+	"Robakowo",
+	"Kosakowo",
+	"Borne",
+	"Braniewo",
+	"Sulinowo",
+	"Chmielno",
+	"Jastrzebie",
+	"Gryfino",
+	"Koronowo",
+	"Lubichowo",
+	"Opoczno"
+};
+
+static const char *name_polish_3_m[] = {
+	" Wybudowanie",
+	" Swietokrzyski",
+	" Gorski",
+	" Morski",
+	" Zdroj",
+	" Wody",
+	" Bajoro",
+	" Krajenski",
+	" Slaski",
+	" Mazowiecki",
+	" Pomorski",
+	" Wielki",
+	" Maly",
+	" Warminski",
+	" Mazurski",
+	" Mniejszy",
+	" Wiekszy",
+	" Gorny",
+	" Dolny",
+	" Wielki",
+	" Stary",
+	" Nowy",
+	" Wielkopolski",
+	" Wzgorze",
+	" Mosty",
+	" Kujawski",
+	" Malopolski",
+	" Podlaski",
+	" Lesny"
+};
+
+static const char *name_polish_3_f[] = {
+	" Wybudowanie",
+	" Swietokrzyska",
+	" Gorska",
+	" Morska",
+	" Zdroj",
+	" Woda",
+	" Bajoro",
+	" Krajenska",
+	" Slaska",
+	" Mazowiecka",
+	" Pomorska",
+	" Wielka",
+	" Mala",
+	" Warminska",
+	" Mazurska",
+	" Mniejsza",
+	" Wieksza",
+	" Gorna",
+	" Dolna",
+	" Wielka",
+	" Stara",
+	" Nowa",
+	" Wielkopolska",
+	" Wzgorza",
+	" Mosty",
+	" Kujawska",
+	" Malopolska",
+	" Podlaska",
+	" Lesna"
+};
+
+static const char *name_polish_3_n[] = {
+	" Wybudowanie",
+	" Swietokrzyskie",
+	" Gorskie",
+	" Morskie",
+	" Zdroj",
+	" Wody",
+	" Bajoro",
+	" Krajenskie",
+	" Slaskie",
+	" Mazowieckie",
+	" Pomorskie",
+	" Wielkie",
+	" Male",
+	" Warminskie ",
+	" Mazurskie ",
+	" Mniejsze",
+	" Wieksze",
+	" Gorne",
+	" Dolne",
+	" Wielkie",
+	" Stare",
+	" Nowe",
+	" Wielkopolskie",
+	" Wzgorze",
+	" Mosty",
+	" Kujawskie",
+	" Malopolskie",
+	" Podlaskie",
+	" Lesne"
+};
+
+static const char *name_czech_1[] = {
+	"As",
+	"Benesov",
+	"Beroun",
+	"Bezdruzice",
+	"Blansko",
+	"Breclav",
+	"Brno",
+	"Bruntál",
+	"Ceská Lípa",
+	"Ceské Budejovice",
+	"Ceský Krumlov",
+	"Decín",
+	"Domazlice",
+	"Dubí",
+	"Frýdek-Místek",
+	"Havlíckuv Brod",
+	"Hodonín",
+	"Hradec Králové",
+	"Humpolec",
+	"Cheb",
+	"Chomutov",
+	"Chrudim",
+	"Jablonec nad Nisou",
+	"Jeseník",
+	"Jicín",
+	"Jihlava",
+	"Jindrichuv Hradec",
+	"Karlovy Vary",
+	"Karviná",
+	"Kladno",
+	"Klatovy",
+	"Kolín",
+	"Kosmonosy",
+	"Kromeríz",
+	"Kutná Hora",
+	"Liberec",
+	"Litomerice",
+	"Louny",
+	"Manetín",
+	"Melník",
+	"Mladá Boleslav",
+	"Most",
+	"Náchod",
+	"Nový Jicín",
+	"Nymburk",
+	"Olomouc",
+	"Opava",
+	"Orácov",
+	"Ostrava",
+	"Pardubice",
+	"Pelhrimov",
+	"Polzice",
+	"Písek",
+	"Plzen",
+	"Praha",
+	"Prachatice",
+	"Prerov",
+	"Príbram",
+	"Prostejov",
+	"Rakovník",
+	"Rokycany",
+	"Rudná",
+	"Rychnov nad Kneznou",
+	"Semily",
+	"Sokolov",
+	"Strakonice",
+	"Stredokluky",
+	"Sumperk",
+	"Svitavy",
+	"Tábor",
+	"Tachov",
+	"Teplice",
+	"Trebíc",
+	"Trutnov",
+	"Uherské Hradiste",
+	"Ústí nad Labem",
+	"Ústí nad Orlicí",
+	"Vsetín",
+	"Vyskov",
+	"Zdár nad Sázavou",
+	"Zlín",
+	"Znojmo"
+};
+
+static const char *name_romanian_1[]= {
+	"Adjud",
+	"Alba Iulia",
+	"Alexandria",
+	"Babadag",
+	"Bacău",
+	"Baia Mare",
+	"Băile Herculane",
+	"Băilesti",
+	"Bârlad",
+	"Bicaz",
+	"Bistrita",
+	"Blaj",
+	"Borsec",
+	"Botosani",
+	"Brăila",
+	"Brasov",
+	"Bucuresti",
+	"Buftea",
+	"Buzău",
+	"Călărasi",
+	"Caransebes",
+	"Cernavodă",
+	"Cluj-Napoca",
+	"Constanta",
+	"Covasna",
+	"Craiova",
+	"Dej",
+	"Deva",
+	"Dorohoi",
+	"Dr.-Tr. Severin",
+	"Drăgăsani",
+	"Făgăras",
+	"Fălticeni",
+	"Fetesti",
+	"Focsani",
+	"Galati",
+	"Gheorgheni",
+	"Giurgiu",
+	"Hârsova",
+	"Hunedoara",
+	"Husi",
+	"Iasi",
+	"Isaccea",
+	"Lugoj",
+	"Măcin",
+	"Mangalia",
+	"Medgidia",
+	"Medias",
+	"Miercurea Ciuc",
+	"Mizil",
+	"Motru",
+	"Năsăud",
+	"Năvodari",
+	"Odobesti",
+	"Oltenita",
+	"Onesti",
+	"Oradea",
+	"Orsova",
+	"Petrosani",
+	"Piatra Neamt",
+	"Pitesti",
+	"Ploiesti",
+	"Predeal",
+	"Râmnicu Vâlcea",
+	"Reghin",
+	"Resita",
+	"Roman",
+	"Rosiorii de Vede",
+	"Satu Mare",
+	"Sebes",
+	"Sfântu Gheorghe",
+	"Sibiu",
+	"Sighisoara",
+	"Sinaia",
+	"Slatina",
+	"Slobozia",
+	"Sovata",
+	"Suceava",
+	"Sulina",
+	"Tăndărei",
+	"Târgoviste",
+	"Târgu Jiu",
+	"Târgu Mures",
+	"Tecuci",
+	"Timisoara",
+	"Tulcea",
+	"Turda",
+	"Turnu Măgurele",
+	"Urziceni",
+	"Vaslui",
+	"Vatra Dornei",
+	"Victoria",
+	"Videle",
+	"Zalău"
+};
+
+static const char *name_slovakish_1[] = {
+	"Bratislava",
+	"Banovce nad Bebravou",
+	"Banska Bystrica",
+	"Banska Stiavnica",
+	"Bardejov",
+	"Brezno",
+	"Brezova pod Bradlom",
+	"Bytca",
+	"Cadca",
+	"Cierna nad Tisou",
+	"Detva",
+	"Detva",
+	"Dolny Kubin",
+	"Dolny Kubin",
+	"Dunajska Streda",
+	"Gabcikovo",
+	"Galanta",
+	"Gbely",
+	"Gelnica",
+	"Handlova",
+	"Hlohovec",
+	"Holic",
+	"Humenne",
+	"Hurbanovo",
+	"Kezmarok",
+	"Komarno",
+	"Kosice",
+	"Kremnica",
+	"Krompachy",
+	"Kuty",
+	"Leopoldov",
+	"Levoca",
+	"Liptovsky Mikulas",
+	"Lucenec",
+	"Malacky",
+	"Martin",
+	"Medzilaborce",
+	"Michalovce",
+	"Modra",
+	"Myjava",
+	"Namestovo",
+	"Nitra",
+	"Nova Bana",
+	"Nove Mesto nad Vahom",
+	"Nove Zamky",
+	"Partizanske",
+	"Pezinok",
+	"Piestany",
+	"Poltar",
+	"Poprad",
+	"Povazska Bystrica",
+	"Prievidza",
+	"Puchov",
+	"Revuca",
+	"Rimavska Sobota",
+	"Roznava",
+	"Ruzomberok",
+	"Sabinov",
+	"Sala",
+	"Senec",
+	"Senica",
+	"Sered",
+	"Skalica",
+	"Sladkovicovo",
+	"Smolenice",
+	"Snina",
+	"Stara Lubovna",
+	"Stara Tura",
+	"Strazske",
+	"Stropkov",
+	"Stupava",
+	"Sturovo",
+	"Sulekovo",
+	"Topolcany",
+	"Trebisov",
+	"Trencin",
+	"Trnava",
+	"Turcianske Teplice",
+	"Tvrdosin",
+	"Vrable",
+	"Vranov nad Toplov",
+	"Zahorska Bystrica",
+	"Zdiar",
+	"Ziar nad Hronom",
+	"Zilina",
+	"Zlate Moravce",
+	"Zvolen"
+};
+
+static const char *name_hungarian_1[] = {
+	"Nagy-",
+	"Kis-",
+	"Felső-",
+	"Alsó-",
+	"Új-"
+};
+
+static const char *name_hungarian_2[] = {
+	"Bodrog",
+	"Dráva",
+	"Duna",
+	"Hejő",
+	"Hernád",
+	"Rába",
+	"Sajó",
+	"Szamos",
+	"Tisza",
+	"Zala",
+	"Balaton",
+	"Fertő",
+	"Bakony",
+	"Cserhát",
+	"Bihar",
+	"Hajdú",
+	"Jász",
+	"Kun",
+	"Magyar",
+	"Nógrád",
+	"Nyír",
+	"Somogy",
+	"Székely",
+	"Buda",
+	"Győr",
+	"Pest",
+	"Fehér",
+	"Cserép",
+	"Erdő",
+	"Hegy",
+	"Homok",
+	"Mező",
+	"Puszta",
+	"Sár",
+	"Császár",
+	"Herceg",
+	"Király",
+	"Nemes",
+	"Püspök",
+	"Szent",
+	"Almás",
+	"Szilvás",
+	"Agg",
+	"Aranyos",
+	"Békés",
+	"Egyházas",
+	"Gagy",
+	"Heves",
+	"Kapos",
+	"Tápió",
+	"Torna",
+	"Vas",
+	"Vámos",
+	"Vásáros"
+};
+
+static const char *name_hungarian_3[] = {
+	"apáti",
+	"bába",
+	"bikk",
+	"dob",
+	"fa",
+	"föld",
+	"hegyes",
+	"kak",
+	"kereszt",
+	"kürt",
+	"ladány",
+	"mérges",
+	"szalonta",
+	"telek",
+	"vas",
+	"völgy"
+};
+
+static const char *name_hungarian_4[] = {
+	"alja",
+	"egyháza",
+	"háza",
+	"úr",
+	"vár"
+};
+
+static const char *name_hungarian_real[] = {
+	"Ajka",
+	"Aszód",
+	"Badacsony",
+	"Baja",
+	"Budapest",
+	"Debrecen",
+	"Eger",
+	"Fonyód",
+	"Gödöllő",
+	"Győr",
+	"Gyula",
+	"Karcag",
+	"Kecskemét",
+	"Keszthely",
+	"Kisköre",
+	"Kocsord",
+	"Komárom",
+	"Kőszeg",
+	"Makó",
+	"Mohács",
+	"Miskolc",
+	"Ózd",
+	"Paks",
+	"Pápa",
+	"Pécs",
+	"Polgár",
+	"Sarkad",
+	"Siófok",
+	"Szeged",
+	"Szentes",
+	"Szolnok",
+	"Tihany",
+	"Tokaj",
+	"Vác",
+	"Záhony",
+	"Zirc"
+};