diff --git a/namegen.c b/namegen.c --- a/namegen.c +++ b/namegen.c @@ -3,9 +3,14 @@ #include "table/namegen.h" -inline static uint32 GetNumberBasedOnSeed(int x, int y, uint32 seed) +static inline uint32 SeedChance(int shift_by, int max, uint32 seed) { - return (((uint16)(seed >> x) * (y))>>16); + return ((uint16)(seed >> shift_by) * max) >> 16; +} + +static inline int32 SeedChanceBias(int shift_by, int max, uint32 seed, int bias) +{ + return SeedChance(shift_by, max + bias, seed) - bias; } static void ReplaceWords(byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h, byte *buf) @@ -26,17 +31,19 @@ static byte MakeEnglishOriginalTownName( strcpy(buf, ""); // optional first segment - if ((i = GetNumberBasedOnSeed(0, lengthof(name_original_english_1) + 50, seed) - 50) >= 0) + i = SeedChanceBias(0, lengthof(name_original_english_1), seed, 50); + if (i >= 0) strcat(buf,name_original_english_1[i]); //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)]); + strcat(buf, name_original_english_2[SeedChance(4, lengthof(name_original_english_2), seed)]); + strcat(buf, name_original_english_3[SeedChance(7, lengthof(name_original_english_3), seed)]); + strcat(buf, name_original_english_4[SeedChance(10, lengthof(name_original_english_4), seed)]); + strcat(buf, name_original_english_5[SeedChance(13, lengthof(name_original_english_5), seed)]); //optional last segment - if ((i = GetNumberBasedOnSeed(15, lengthof(name_original_english_6) + 60, seed) - 60) >= 0) + i = SeedChanceBias(15, lengthof(name_original_english_6), seed, 60); + if (i >= 0) strcat(buf, name_original_english_6[i]); if (buf[0] == 'C' && (buf[1] == 'e' || buf[1] == 'i')) @@ -65,25 +72,27 @@ static byte MakeEnglishAdditionalTownNam strcpy(buf, ""); // optional first segment - if ((i = GetNumberBasedOnSeed(0, lengthof(name_additional_english_prefix) + 50, seed) - 50) >= 0) + i = SeedChanceBias(0, lengthof(name_additional_english_prefix), seed, 50); + if (i >= 0) strcat(buf,name_additional_english_prefix[i]); - if (GetNumberBasedOnSeed(3, 20, seed) >= 14) { - strcat(buf, name_additional_english_1a[GetNumberBasedOnSeed(6, lengthof(name_additional_english_1a), seed)]); + if (SeedChance(3, 20, seed) >= 14) { + strcat(buf, name_additional_english_1a[SeedChance(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)]); + strcat(buf, name_additional_english_1b1[SeedChance(6, lengthof(name_additional_english_1b1), seed)]); + strcat(buf, name_additional_english_1b2[SeedChance(9, lengthof(name_additional_english_1b2), seed)]); + if (SeedChance(11, 20, seed) >= 4) { + strcat(buf, name_additional_english_1b3a[SeedChance(12, lengthof(name_additional_english_1b3a), seed)]); } else { - strcat(buf, name_additional_english_1b3b[GetNumberBasedOnSeed(12, lengthof(name_additional_english_1b3b), seed)]); + strcat(buf, name_additional_english_1b3b[SeedChance(12, lengthof(name_additional_english_1b3b), seed)]); } } - strcat(buf, name_additional_english_2[GetNumberBasedOnSeed(14, lengthof(name_additional_english_2), seed)]); + strcat(buf, name_additional_english_2[SeedChance(14, lengthof(name_additional_english_2), seed)]); //optional last segment - if ((i = GetNumberBasedOnSeed(15, lengthof(name_additional_english_3) + 60, seed) - 60) >= 0) + i = SeedChanceBias(15, lengthof(name_additional_english_3), seed, 60); + if (i >= 0) strcat(buf, name_additional_english_3[i]); ReplaceWords('C','u','n','t', 'E','a','s','t', buf); @@ -106,34 +115,33 @@ static byte MakeAustrianTownName(byte *b strcpy(buf, ""); // Bad, Maria, Gross, ... - i = GetNumberBasedOnSeed(0, lengthof(name_austrian_a1) + 15,seed) - 15; - + i = SeedChanceBias(0, lengthof(name_austrian_a1), seed, 15); if (i >= 0) strcat(buf, name_austrian_a1[i]); - i = GetNumberBasedOnSeed(4, 6, seed); + i = SeedChance(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)]); + strcat(buf, name_austrian_a2[SeedChance( 7, lengthof(name_austrian_a2), seed)]); + strcat(buf, name_austrian_a3[SeedChance(13, lengthof(name_austrian_a3), seed)]); } 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)]); + strcat(buf, name_austrian_a5[SeedChance( 7, lengthof(name_austrian_a5), seed)]); + strcat(buf, name_austrian_a6[SeedChance( 9, lengthof(name_austrian_a6), seed)]); j = 1; // More likely to have a " an der " or " am " } else { // Zell - strcat(buf, name_austrian_a4[GetNumberBasedOnSeed( 7, lengthof(name_austrian_a4), seed)]); + strcat(buf, name_austrian_a4[SeedChance( 7, lengthof(name_austrian_a4), seed)]); } - i = GetNumberBasedOnSeed(1, 6, seed); + i = SeedChance(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)]); + strcat(buf, name_austrian_f1[SeedChance(4, lengthof(name_austrian_f1), seed)]); + strcat(buf, name_austrian_f2[SeedChance(5, lengthof(name_austrian_f2), seed)]); } 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)]); + strcat(buf, name_austrian_b1[SeedChance(4, lengthof(name_austrian_b1), seed)]); + strcat(buf, name_austrian_b2[SeedChance(5, lengthof(name_austrian_b2), seed)]); } return 0; @@ -147,29 +155,28 @@ static byte MakeGermanTownName(byte *buf //null terminates the string for strcat strcpy(buf, ""); - seed_derivative = GetNumberBasedOnSeed(7, 28, seed); + seed_derivative = SeedChance(7, 28, seed); //optional prefix if (seed_derivative == 12 || seed_derivative == 19) { - i = GetNumberBasedOnSeed(2, lengthof(name_german_pre), seed); + i = SeedChance(2, lengthof(name_german_pre), seed); strcat(buf,name_german_pre[i]); } - i = GetNumberBasedOnSeed(3, lengthof(name_german_hardcoded) + lengthof(name_german_1), seed); - // mandatory middle segments including option of hardcoded name + i = SeedChance(3, lengthof(name_german_hardcoded) + lengthof(name_german_1), seed); if (i < lengthof(name_german_hardcoded)) { strcat(buf,name_german_hardcoded[i]); } else { strcat(buf, name_german_1[i - lengthof(name_german_hardcoded)]); - i = GetNumberBasedOnSeed(5, lengthof(name_german_2), seed); + i = SeedChance(5, lengthof(name_german_2), seed); strcat(buf, name_german_2[i]); } // optional suffix if (seed_derivative == 24) { - i = GetNumberBasedOnSeed(9, + i = SeedChance(9, lengthof(name_german_4_an_der) + lengthof(name_german_4_am), seed); if (i < lengthof(name_german_4_an_der)) { strcat(buf, name_german_3_an_der[0]); @@ -184,20 +191,20 @@ static byte MakeGermanTownName(byte *buf static byte MakeSpanishTownName(byte *buf, uint32 seed) { - strcpy(buf, name_spanish_1[GetNumberBasedOnSeed(0, lengthof(name_spanish_1), seed)]); + strcpy(buf, name_spanish_1[SeedChance(0, lengthof(name_spanish_1), seed)]); return 0; } static byte MakeFrenchTownName(byte *buf, uint32 seed) { - strcpy(buf, name_french_1[GetNumberBasedOnSeed(0, lengthof(name_french_1), seed)]); + strcpy(buf, name_french_1[SeedChance(0, lengthof(name_french_1), seed)]); return 0; } static byte MakeSillyTownName(byte *buf, uint32 seed) { - strcpy(buf, name_silly_1[GetNumberBasedOnSeed( 0, lengthof(name_silly_1), seed)]); - strcat(buf, name_silly_2[GetNumberBasedOnSeed(16, lengthof(name_silly_2), seed)]); + strcpy(buf, name_silly_1[SeedChance( 0, lengthof(name_silly_1), seed)]); + strcat(buf, name_silly_2[SeedChance(16, lengthof(name_silly_2), seed)]); return 0; } @@ -209,19 +216,20 @@ static byte MakeSwedishTownName(byte *bu strcpy(buf, ""); // optional first segment - if ((i = GetNumberBasedOnSeed(0, lengthof(name_swedish_1) + 50, seed) - 50) >= 0) + i = SeedChanceBias(0, lengthof(name_swedish_1), seed, 50); + if (i >= 0) strcat(buf, name_swedish_1[i]); // 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)]); + if (SeedChance(4, 5, seed) >= 3) { + strcat(buf, name_swedish_2[SeedChance( 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)]); + strcat(buf, name_swedish_2a[SeedChance( 7, lengthof(name_swedish_2a), seed)]); + strcat(buf, name_swedish_2b[SeedChance(10, lengthof(name_swedish_2b), seed)]); + strcat(buf, name_swedish_2c[SeedChance(13, lengthof(name_swedish_2c), seed)]); } - strcat(buf, name_swedish_3[GetNumberBasedOnSeed(16, lengthof(name_swedish_3), seed)]); + strcat(buf, name_swedish_3[SeedChance(16, lengthof(name_swedish_3), seed)]); return 0; } @@ -234,17 +242,18 @@ static byte MakeDutchTownName(byte *buf, strcpy(buf, ""); // optional first segment - if ((i = GetNumberBasedOnSeed(0, lengthof(name_dutch_1) + 50, seed) - 50) >= 0) + i = SeedChanceBias(0, lengthof(name_dutch_1), seed, 50); + if (i >= 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)]); + if (SeedChance(6, 9, seed) > 4) { + strcat(buf, name_dutch_2[SeedChance( 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_3[SeedChance( 9, lengthof(name_dutch_3), seed)]); + strcat(buf, name_dutch_4[SeedChance(12, lengthof(name_dutch_4), seed)]); } - strcat(buf, name_dutch_5[GetNumberBasedOnSeed(15, lengthof(name_dutch_5), seed)]); + strcat(buf, name_dutch_5[SeedChance(15, lengthof(name_dutch_5), seed)]); return 0; } @@ -255,11 +264,11 @@ static byte MakeFinnishTownName(byte *bu 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)]); + if (SeedChance(0, 15, seed) >= 10) { + strcat(buf, name_finnish_1[SeedChance( 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)]); + strcat(buf, name_finnish_2a[SeedChance( 2, lengthof(name_finnish_2a), seed)]); + strcat(buf, name_finnish_2b[SeedChance(10, lengthof(name_finnish_2b), seed)]); } return 0; @@ -274,58 +283,58 @@ static byte MakePolishTownName(byte *buf strcpy(buf, ""); // optional first segment - i = GetNumberBasedOnSeed(0, + i = SeedChance(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); + j = SeedChance(2, 20, seed); if (i < lengthof(name_polish_2_o)) { - strcat(buf, name_polish_2_o[GetNumberBasedOnSeed(3, lengthof(name_polish_2_o), seed)]); + strcat(buf, name_polish_2_o[SeedChance(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_1_m[SeedChance(5, lengthof(name_polish_1_m), seed)]); - strcat(buf, name_polish_2_m[GetNumberBasedOnSeed(7, lengthof(name_polish_2_m), seed)]); + strcat(buf, name_polish_2_m[SeedChance(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)]); + strcat(buf, name_polish_3_m[SeedChance(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_1_f[SeedChance(5, lengthof(name_polish_1_f), seed)]); - strcat(buf, name_polish_2_f[GetNumberBasedOnSeed(7, lengthof(name_polish_2_f), seed)]); + strcat(buf, name_polish_2_f[SeedChance(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)]); + strcat(buf, name_polish_3_f[SeedChance(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_1_n[SeedChance(5, lengthof(name_polish_1_n), seed)]); - strcat(buf, name_polish_2_n[GetNumberBasedOnSeed(7, lengthof(name_polish_2_n), seed)]); + strcat(buf, name_polish_2_n[SeedChance(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)]); + strcat(buf, name_polish_3_n[SeedChance(10, lengthof(name_polish_3_n), seed)]); } return 0; } static byte MakeCzechTownName(byte *buf, uint32 seed) { - strcpy(buf, name_czech_1[GetNumberBasedOnSeed(0, lengthof(name_czech_1), seed)]); + strcpy(buf, name_czech_1[SeedChance(0, lengthof(name_czech_1), seed)]); return 0; } static byte MakeRomanianTownName(byte *buf, uint32 seed) { - strcpy(buf, name_romanian_1[GetNumberBasedOnSeed(0, lengthof(name_romanian_1), seed)]); + strcpy(buf, name_romanian_1[SeedChance(0, lengthof(name_romanian_1), seed)]); return 0; } static byte MakeSlovakTownName(byte *buf, uint32 seed) { - strcpy(buf, name_slovakish_1[GetNumberBasedOnSeed(0, lengthof(name_slovakish_1), seed)]); + strcpy(buf, name_slovakish_1[SeedChance(0, lengthof(name_slovakish_1), seed)]); return 0; } @@ -335,14 +344,14 @@ static byte MakeNorwegianTownName(byte * // Use first 4 bit from seed to decide whether or not this town should // have a real name 3/16 chance. Bit 0-3 - if (GetNumberBasedOnSeed(0, 15, seed) < 3) { + if (SeedChance(0, 15, seed) < 3) { // Use 7bit for the realname table index. Bit 4-10 - strcat(buf, name_norwegian_real[GetNumberBasedOnSeed(4, lengthof(name_norwegian_real), seed)]); + strcat(buf, name_norwegian_real[SeedChance(4, lengthof(name_norwegian_real), seed)]); } else { // Use 7bit for the first fake part. Bit 4-10 - strcat(buf, name_norwegian_1[GetNumberBasedOnSeed(4, lengthof(name_norwegian_1), seed)]); + strcat(buf, name_norwegian_1[SeedChance(4, lengthof(name_norwegian_1), seed)]); // Use 7bit for the last fake part. Bit 11-17 - strcat(buf, name_norwegian_2[GetNumberBasedOnSeed(11, lengthof(name_norwegian_2), seed)]); + strcat(buf, name_norwegian_2[SeedChance(11, lengthof(name_norwegian_2), seed)]); } return 0; @@ -355,20 +364,21 @@ static byte MakeHungarianTownName(byte * //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)]); + if (SeedChance(12, 15, seed) < 3) { + strcat(buf, name_hungarian_real[SeedChance(0, lengthof(name_hungarian_real), seed)]); } else { // optional first segment - i = GetNumberBasedOnSeed(3, lengthof(name_hungarian_1) * 3, seed); + i = SeedChance(3, lengthof(name_hungarian_1) * 3, seed); if (i < 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)]); + strcat(buf, name_hungarian_2[SeedChance(3, lengthof(name_hungarian_2), seed)]); + strcat(buf, name_hungarian_3[SeedChance(6, lengthof(name_hungarian_3), seed)]); // optional last segment - if ((i = GetNumberBasedOnSeed(10, lengthof(name_hungarian_4) * 3, seed)) < lengthof(name_hungarian_4)) { + i = SeedChance(10, lengthof(name_hungarian_4) * 3, seed); + if (i < lengthof(name_hungarian_4)) { strcat(buf, name_hungarian_4[i]); } }