|
@@ -7725,8 +7725,8 @@ static void FeatureTownName(ByteReader *
|
|
|
bool new_scheme = _cur.grffile->grf_version >= 7;
|
|
|
|
|
|
byte lang = buf->ReadByte();
|
|
|
|
|
|
byte nb_gen = townname->nb_gen;
|
|
|
StringID style = STR_UNDEFINED;
|
|
|
|
|
|
do {
|
|
|
ClrBit(lang, 7);
|
|
|
|
|
@@ -7735,53 +7735,48 @@ static void FeatureTownName(ByteReader *
|
|
|
std::string lang_name = TranslateTTDPatchCodes(grfid, lang, false, name);
|
|
|
grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, lang_name.c_str());
|
|
|
|
|
|
townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, false, name, STR_UNDEFINED);
|
|
|
style = AddGRFString(grfid, id, lang, new_scheme, false, name, STR_UNDEFINED);
|
|
|
|
|
|
lang = buf->ReadByte();
|
|
|
} while (lang != 0);
|
|
|
townname->id[nb_gen] = id;
|
|
|
townname->nb_gen++;
|
|
|
}
|
|
|
|
|
|
byte nb = buf->ReadByte();
|
|
|
grfmsg(6, "FeatureTownName: %u parts", nb);
|
|
|
|
|
|
townname->nbparts[id] = nb;
|
|
|
townname->partlist[id] = CallocT<NamePartList>(nb);
|
|
|
|
|
|
for (int i = 0; i < nb; i++) {
|
|
|
byte nbtext = buf->ReadByte();
|
|
|
townname->partlist[id][i].bitstart = buf->ReadByte();
|
|
|
townname->partlist[id][i].bitcount = buf->ReadByte();
|
|
|
townname->partlist[id][i].maxprob = 0;
|
|
|
townname->partlist[id][i].partcount = nbtext;
|
|
|
townname->partlist[id][i].parts = CallocT<NamePart>(nbtext);
|
|
|
grfmsg(6, "FeatureTownName: part %d contains %d texts and will use GB(seed, %d, %d)", i, nbtext, townname->partlist[id][i].bitstart, townname->partlist[id][i].bitcount);
|
|
|
|
|
|
for (int j = 0; j < nbtext; j++) {
|
|
|
byte prob = buf->ReadByte();
|
|
|
|
|
|
if (HasBit(prob, 7)) {
|
|
|
townname->styles.emplace_back(style, id);
|
|
|
}
|
|
|
|
|
|
uint8 parts = buf->ReadByte();
|
|
|
grfmsg(6, "FeatureTownName: %u parts", parts);
|
|
|
|
|
|
townname->partlists[id].reserve(parts);
|
|
|
for (uint partnum = 0; partnum < parts; partnum++) {
|
|
|
NamePartList &partlist = townname->partlists[id].emplace_back();
|
|
|
uint8 texts = buf->ReadByte();
|
|
|
partlist.bitstart = buf->ReadByte();
|
|
|
partlist.bitcount = buf->ReadByte();
|
|
|
partlist.maxprob = 0;
|
|
|
grfmsg(6, "FeatureTownName: part %u contains %u texts and will use GB(seed, %u, %u)", partnum, texts, partlist.bitstart, partlist.bitcount);
|
|
|
|
|
|
partlist.parts.reserve(texts);
|
|
|
for (uint textnum = 0; textnum < texts; textnum++) {
|
|
|
NamePart &part = partlist.parts.emplace_back();
|
|
|
part.prob = buf->ReadByte();
|
|
|
|
|
|
if (HasBit(part.prob, 7)) {
|
|
|
byte ref_id = buf->ReadByte();
|
|
|
|
|
|
if (townname->nbparts[ref_id] == 0) {
|
|
|
if (ref_id >= GRFTownName::MAX_LISTS || townname->partlists[ref_id].empty()) {
|
|
|
grfmsg(0, "FeatureTownName: definition 0x%02X doesn't exist, deactivating", ref_id);
|
|
|
DelGRFTownName(grfid);
|
|
|
DisableGrf(STR_NEWGRF_ERROR_INVALID_ID);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
grfmsg(6, "FeatureTownName: part %d, text %d, uses intermediate definition 0x%02X (with probability %d)", i, j, ref_id, prob & 0x7F);
|
|
|
townname->partlist[id][i].parts[j].data.id = ref_id;
|
|
|
part.id = ref_id;
|
|
|
grfmsg(6, "FeatureTownName: part %u, text %u, uses intermediate definition 0x%02X (with probability %u)", partnum, textnum, ref_id, part.prob & 0x7F);
|
|
|
} else {
|
|
|
const char *text = buf->ReadString();
|
|
|
townname->partlist[id][i].parts[j].data.text = stredup(TranslateTTDPatchCodes(grfid, 0, false, text).c_str());
|
|
|
grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob);
|
|
|
}
|
|
|
townname->partlist[id][i].parts[j].prob = prob;
|
|
|
townname->partlist[id][i].maxprob += GB(prob, 0, 7);
|
|
|
}
|
|
|
grfmsg(6, "FeatureTownName: part %d, total probability %d", i, townname->partlist[id][i].maxprob);
|
|
|
part.text = TranslateTTDPatchCodes(grfid, 0, false, text);
|
|
|
grfmsg(6, "FeatureTownName: part %u, text %u, '%s' (with probability %u)", partnum, textnum, part.text.c_str(), part.prob);
|
|
|
}
|
|
|
partlist.maxprob += GB(part.prob, 0, 7);
|
|
|
}
|
|
|
grfmsg(6, "FeatureTownName: part %u, total probability %u", partnum, partlist.maxprob);
|
|
|
}
|
|
|
}
|
|
|
|