namegen.c
changeset 833 9d4d77ff2cce
parent 428 532ec9578634
child 852 36f6002cada9
--- 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;
 }