29 for (; t != NULL; t = t->next) {
30 if (t->grfid == grfid)
return t;
39 t = CallocT<GRFTownName>(1);
41 t->next = _grf_townnames;
47 void DelGRFTownName(uint32 grfid)
51 for (;t != NULL; p = t, t = t->next)
if (t->grfid == grfid)
break;
53 for (
int i = 0; i < 128; i++) {
54 for (
int j = 0; j < t->nbparts[i]; j++) {
55 for (
int k = 0; k < t->partlist[i][j].partcount; k++) {
56 if (!
HasBit(t->partlist[i][j].parts[k].prob, 7))
free(t->partlist[i][j].parts[k].data.text);
58 free(t->partlist[i][j].parts);
65 _grf_townnames = t->next;
71 static char *RandomPart(
char *buf,
GRFTownName *t, uint32 seed, byte
id,
const char *last)
74 for (
int i = 0; i < t->nbparts[id]; i++) {
75 byte count = t->partlist[id][i].bitcount;
76 uint16 maxprob = t->partlist[id][i].maxprob;
77 uint32 r = (
GB(seed, t->partlist[
id][i].bitstart, count) * maxprob) >> count;
78 for (
int j = 0; j < t->partlist[id][i].partcount; j++) {
79 byte prob = t->partlist[id][i].parts[j].
prob;
80 maxprob -=
GB(prob, 0, 7);
81 if (maxprob > r)
continue;
83 buf = RandomPart(buf, t, seed, t->partlist[
id][i].parts[j].data.
id, last);
85 buf =
strecat(buf, t->partlist[
id][i].parts[j].data.
text, last);
93 char *GRFTownNameGenerate(
char *buf, uint32 grfid, uint16 gen, uint32 seed,
const char *last)
96 for (
GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
97 if (t->grfid == grfid) {
98 assert(gen < t->nb_gen);
99 buf = RandomPart(buf, t, seed, t->id[gen], last);
108 int nb_names = 0, n = 0;
109 for (
GRFTownName *t = _grf_townnames; t != NULL; t = t->next) nb_names += t->nb_gen;
110 StringID *list = MallocT<StringID>(nb_names + 1);
111 for (
GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
112 for (
int j = 0; j < t->nb_gen; j++) list[n++] = t->name[j];
118 void CleanUpGRFTownNames()
120 while (_grf_townnames != NULL) DelGRFTownName(_grf_townnames->grfid);
123 uint32 GetGRFTownNameId(
int gen)
125 for (
GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
126 if (gen < t->nb_gen)
return t->grfid;
133 uint16 GetGRFTownNameType(
int gen)
135 for (
GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
136 if (gen < t->nb_gen)
return gen;
140 return SPECSTR_TOWNNAME_ENGLISH;