31 grfid(t->townnamegrfid),
34 if (t->townnamegrfid != 0 && GetGRFTownName(t->townnamegrfid) == NULL) {
37 this->
type = SPECSTR_TOWNNAME_ENGLISH;
53 if (par->
grfid == 0) {
54 int64 args_array[1] = { townnameparts };
59 return GRFTownNameGenerate(buff, par->
grfid, par->
type, townnameparts, last);
73 return GetTownName(buff, &par, t->townnameparts, last);
95 if (town_names != NULL) {
96 if (town_names->find(buf1) != town_names->end())
return false;
97 town_names->insert(buf1);
103 const char *buf = t->
name;
108 if (strcmp(buf1, buf) == 0)
return false;
135 for (
int i = 1000; i != 0; i--) {
157 return (
GB(seed, shift_by, 16) * max) >> 16;
179 return (seed >> shift_by) %
max;
193 return SeedChance(shift_by, max + bias, seed) - bias;
205 assert(strlen(org) == 4 && strlen(rep) == 4 && strlen(buf) >= 4);
206 if (strncmp(buf, org, 4) == 0) memcpy(buf, rep, 4);
241 if (i >= 0) buf =
strecpy(buf, _name_original_english_1[i], last);
251 if (i >= 0) buf =
strecpy(buf, _name_original_english_6[i], last);
254 if (orig[0] ==
'C' && (orig[1] ==
'e' || orig[1] ==
'i')) {
258 assert(buf - orig >= 4);
277 if (i >= 0) buf =
strecpy(buf, _name_additional_english_prefix[i], last);
295 if (i >= 0) buf =
strecpy(buf, _name_additional_english_3[i], last);
297 assert(buf - orig >= 4);
314 if (i >= 0) buf =
strecpy(buf, _name_austrian_a1[i], last);
338 }
else if (i >= 2 - j) {
356 uint seed_derivative =
SeedChance(7, 28, seed);
359 if (seed_derivative == 12 || seed_derivative == 19) {
361 buf =
strecpy(buf, _name_german_pre[i], last);
366 if (i <
lengthof(_name_german_real)) {
367 buf =
strecpy(buf, _name_german_real[i], last);
369 buf =
strecpy(buf, _name_german_1[i -
lengthof(_name_german_real)], last);
372 buf =
strecpy(buf, _name_german_2[i], last);
376 if (seed_derivative == 24) {
378 if (i <
lengthof(_name_german_4_an_der)) {
379 buf =
strecpy(buf, _name_german_3_an_der[0], last);
380 buf =
strecpy(buf, _name_german_4_an_der[i], last);
382 buf =
strecpy(buf, _name_german_3_am[0], last);
383 buf =
strecpy(buf, _name_german_4_am[i -
lengthof(_name_german_4_an_der)], last);
440 if (i >= 0) buf =
strecpy(buf, _name_swedish_1[i], last);
467 if (i >= 0) buf =
strecpy(buf, _name_dutch_1[i], last);
503 buf =
strecpy(buf, _name_finnish_1[sel], last);
506 if (*end ==
'i') *end =
'e';
507 if (strstr(orig,
"a") != NULL || strstr(orig,
"o") != NULL || strstr(orig,
"u") != NULL ||
508 strstr(orig,
"A") != NULL || strstr(orig,
"O") != NULL || strstr(orig,
"U") != NULL) {
509 buf =
strecpy(buf,
"la", last);
511 buf =
strecpy(buf,
"l\xC3\xA4", last);
519 if (sel >=
lengthof(_name_finnish_1)) {
520 buf =
strecpy(buf, _name_finnish_2[sel -
lengthof(_name_finnish_1)], last);
522 buf =
strecpy(buf, _name_finnish_1[sel], last);
547 if (i <
lengthof(_name_polish_2_o)) {
558 if (j >= 4 && j < 16) {
572 if (j >= 4 && j < 16) {
585 if (j >= 4 && j < 16) {
606 const char *orig = buf;
611 bool do_prefix = prob_tails < 12;
612 bool do_suffix = prob_tails > 11 && prob_tails < 17;
616 int prefix = 0, ending = 0, suffix = 0;
631 if (stem <
lengthof(_name_czech_subst_full)) {
633 dynamic_subst =
false;
634 gender = _name_czech_subst_full[stem].gender;
635 choose = _name_czech_subst_full[stem].choose;
636 allow = _name_czech_subst_full[stem].allow;
638 uint map[
lengthof(_name_czech_subst_ending)];
639 int ending_start = -1, ending_stop = -1;
642 dynamic_subst =
true;
643 stem -=
lengthof(_name_czech_subst_full);
644 stem %=
lengthof(_name_czech_subst_stem);
645 gender = _name_czech_subst_stem[stem].gender;
646 choose = _name_czech_subst_stem[stem].choose;
647 allow = _name_czech_subst_stem[stem].allow;
652 if (choose & CZC_POSTFIX) {
654 postfix %=
lengthof(_name_czech_subst_postfix);
656 if (choose & CZC_NOPOSTFIX) {
658 postfix +=
lengthof(_name_czech_subst_postfix);
660 if (postfix <
lengthof(_name_czech_subst_postfix)) {
661 choose |= CZC_POSTFIX;
663 choose |= CZC_NOPOSTFIX;
667 for (ending = 0; ending < (int)
lengthof(_name_czech_subst_ending); ending++) {
670 if (gender == CZG_FREE ||
671 (gender == CZG_NFREE && e->gender != CZG_SNEUT && e->gender != CZG_PNEUT) ||
672 gender == e->gender) {
673 if (ending_start < 0) {
674 ending_start = ending;
676 }
else if (ending_start >= 0) {
677 ending_stop = ending - 1;
681 if (ending_stop < 0) {
683 ending_stop = ending - 1;
688 for (ending = ending_start; ending <= ending_stop; ending++) {
691 if ((e->choose & choose) == choose && (e->allow & allow) != 0) {
701 gender = _name_czech_subst_ending[ending].gender;
702 assert(gender != CZG_FREE && gender != CZG_NFREE);
705 if (do_prefix && (_name_czech_adj[prefix].choose & choose) != choose) {
712 CzechPattern pattern = _name_czech_adj[prefix].pattern;
714 buf =
strecpy(buf, _name_czech_adj[prefix].name, last);
716 char *endpos = buf - 1;
718 while (
GB(*endpos, 6, 2) == 2) endpos--;
720 if (gender == CZG_SMASC && pattern == CZP_PRIVL) {
721 assert(endpos >= orig + 2);
724 assert(*(endpos - 1) ==
'v');
727 assert(endpos >= orig);
728 endpos =
strecpy(endpos, _name_czech_patmod[gender][pattern], last);
731 buf =
strecpy(endpos,
" ", last);
735 buf =
strecpy(buf, _name_czech_subst_stem[stem].name, last);
736 if (postfix <
lengthof(_name_czech_subst_postfix)) {
737 const char *poststr = _name_czech_subst_postfix[postfix];
738 const char *endstr = _name_czech_subst_ending[ending].name;
740 size_t postlen = strlen(poststr);
741 size_t endlen = strlen(endstr);
742 assert(postlen > 0 && endlen > 0);
745 if (postlen < 2 || postlen > endlen ||
746 ((poststr[1] !=
'v' || poststr[1] != endstr[1]) &&
747 poststr[2] != endstr[1])) {
748 buf =
strecpy(buf, poststr, last);
751 if (endstr[0] ==
'i') {
752 switch (*(buf - 1)) {
753 case 'k': *(buf - 1) =
'c';
break;
754 case 'h': *(buf - 1) =
'z';
break;
760 buf =
strecpy(buf, _name_czech_subst_ending[ending].name, last);
762 buf =
strecpy(buf, _name_czech_subst_full[stem].name, last);
767 buf =
strecpy(buf, _name_czech_suffix[suffix], last);
836 if (i <
lengthof(_name_hungarian_1)) buf =
strecpy(buf, _name_hungarian_1[i], last);
844 if (i <
lengthof(_name_hungarian_4)) {
845 buf =
strecpy(buf, _name_hungarian_4[i], last);
874 if (i >= 0) buf =
strecpy(buf, _name_danish_1[i], last);
933 static const char *
const mascul_femin_italian[] = {
951 buf =
strecpy(buf, mascul_femin_italian[i], last);
1057 assert(lang <
lengthof(_town_name_generators));
1066 if (last >= buf + par->
min)
return par->
proc(buf, last, seed);
1069 par->
proc(buffer, buffer + par->
min, seed);
1071 return strecpy(buf, buffer, last);