20 #include "table/strings.h"
25 static std::vector<StringID> _grf_townname_names;
30 for (; t !=
nullptr; t = t->next) {
31 if (t->grfid == grfid)
return t;
40 t = CallocT<GRFTownName>(1);
42 t->next = _grf_townnames;
48 void DelGRFTownName(uint32 grfid)
52 for (;t !=
nullptr; p = t, t = t->next)
if (t->grfid == grfid)
break;
54 for (
int i = 0; i < 128; i++) {
55 for (
int j = 0; j < t->nbparts[i]; j++) {
56 for (
int k = 0; k < t->partlist[i][j].partcount; k++) {
57 if (!
HasBit(t->partlist[i][j].parts[k].prob, 7))
free(t->partlist[i][j].parts[k].data.text);
59 free(t->partlist[i][j].parts);
66 _grf_townnames = t->next;
72 static char *RandomPart(
char *buf,
GRFTownName *t, uint32 seed,
byte id,
const char *last)
75 for (
int i = 0; i < t->nbparts[id]; i++) {
76 byte count = t->partlist[id][i].bitcount;
77 uint16 maxprob = t->partlist[id][i].maxprob;
78 uint32 r = (
GB(seed, t->partlist[
id][i].bitstart, count) * maxprob) >> count;
79 for (
int j = 0; j < t->partlist[id][i].partcount; j++) {
80 byte prob = t->partlist[id][i].parts[j].
prob;
81 maxprob -=
GB(prob, 0, 7);
82 if (maxprob > r)
continue;
84 buf = RandomPart(buf, t, seed, t->partlist[
id][i].parts[j].data.
id, last);
86 buf =
strecat(buf, t->partlist[
id][i].parts[j].data.
text, last);
94 char *GRFTownNameGenerate(
char *buf, uint32 grfid, uint16 gen, uint32 seed,
const char *last)
97 for (
GRFTownName *t = _grf_townnames; t !=
nullptr; t = t->next) {
98 if (t->grfid == grfid) {
99 assert(gen < t->nb_gen);
100 buf = RandomPart(buf, t, seed, t->id[gen], last);
111 _grf_townname_names.clear();
112 for (
GRFTownName *t = _grf_townnames; t !=
nullptr; t = t->next) {
113 for (
int j = 0; j < t->nb_gen; j++) _grf_townname_names.push_back(t->name[j]);
117 const std::vector<StringID>& GetGRFTownNameList()
119 return _grf_townname_names;
122 StringID GetGRFTownNameName(uint gen)
124 return gen < _grf_townname_names.size() ? _grf_townname_names[gen] : STR_UNDEFINED;
127 void CleanUpGRFTownNames()
129 while (_grf_townnames !=
nullptr) DelGRFTownName(_grf_townnames->grfid);
132 uint32 GetGRFTownNameId(
int gen)
134 for (
GRFTownName *t = _grf_townnames; t !=
nullptr; t = t->next) {
135 if (gen < t->nb_gen)
return t->grfid;
142 uint16 GetGRFTownNameType(
int gen)
144 for (
GRFTownName *t = _grf_townnames; t !=
nullptr; t = t->next) {
145 if (gen < t->nb_gen)
return gen;
149 return SPECSTR_TOWNNAME_ENGLISH;