summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf.cpp110
1 files changed, 58 insertions, 52 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 160bacca3..b736d9c7a 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -450,9 +450,30 @@ static GRFError *DisableGrf(StringID message = STR_NULL, GRFConfig *config = NUL
return config->error;
}
+/**
+ * Information for mapping static StringIDs.
+ */
+struct StringIDMapping {
+ uint32 grfid; ///< Source NewGRF.
+ StringID source; ///< Source StringID (GRF local).
+ StringID *target; ///< Destination for mapping result.
+};
+typedef SmallVector<StringIDMapping, 16> StringIDMappingVector;
+static StringIDMappingVector _string_to_grf_mapping;
-typedef std::map<StringID *, uint32> StringIDToGRFIDMapping;
-static StringIDToGRFIDMapping _string_to_grf_mapping;
+/**
+ * Record a static StringID for getting translated later.
+ * @param source Source StringID (GRF local).
+ * @param target Destination for the mapping result.
+ */
+static void AddStringForMapping(StringID source, StringID *target)
+{
+ *target = STR_UNDEFINED;
+ StringIDMapping *item = _string_to_grf_mapping.Append();
+ item->grfid = _cur.grffile->grfid;
+ item->source = source;
+ item->target = target;
+}
/**
* Perform a mapping from TTDPatch's string IDs to OpenTTD's
@@ -2396,8 +2417,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
break;
case 0x12: // Building name ID
- housespec->building_name = buf->ReadWord();
- _string_to_grf_mapping[&housespec->building_name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &housespec->building_name);
break;
case 0x13: // Building availability mask
@@ -2863,13 +2883,11 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea
break;
case 0x09: // String ID for cargo type name
- cs->name = buf->ReadWord();
- _string_to_grf_mapping[&cs->name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &cs->name);
break;
case 0x0A: // String for 1 unit of cargo
- cs->name_single = buf->ReadWord();
- _string_to_grf_mapping[&cs->name_single] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &cs->name_single);
break;
case 0x0B: // String for singular quantity of cargo (e.g. 1 tonne of coal)
@@ -2877,8 +2895,7 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea
/* String for units of cargo. This is different in OpenTTD
* (e.g. tonnes) to TTDPatch (e.g. {COMMA} tonne of coal).
* Property 1B is used to set OpenTTD's behaviour. */
- cs->units_volume = buf->ReadWord();
- _string_to_grf_mapping[&cs->units_volume] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &cs->units_volume);
break;
case 0x0C: // String for plural quantity of cargo (e.g. 10 tonnes of coal)
@@ -2886,13 +2903,11 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea
/* Strings for an amount of cargo. This is different in OpenTTD
* (e.g. {WEIGHT} of coal) to TTDPatch (e.g. {COMMA} tonnes of coal).
* Property 1C is used to set OpenTTD's behaviour. */
- cs->quantifier = buf->ReadWord();
- _string_to_grf_mapping[&cs->quantifier] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &cs->quantifier);
break;
case 0x0D: // String for two letter cargo abbreviation
- cs->abbrev = buf->ReadWord();
- _string_to_grf_mapping[&cs->abbrev] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &cs->abbrev);
break;
case 0x0E: // Sprite ID for cargo icon
@@ -3491,18 +3506,15 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
break;
case 0x0C: // Industry closure message
- indsp->closure_text = buf->ReadWord();
- _string_to_grf_mapping[&indsp->closure_text] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &indsp->closure_text);
break;
case 0x0D: // Production increase message
- indsp->production_up_text = buf->ReadWord();
- _string_to_grf_mapping[&indsp->production_up_text] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &indsp->production_up_text);
break;
case 0x0E: // Production decrease message
- indsp->production_down_text = buf->ReadWord();
- _string_to_grf_mapping[&indsp->production_down_text] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &indsp->production_down_text);
break;
case 0x0F: // Fund cost multiplier
@@ -3573,8 +3585,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
break;
case 0x1B: // New industry text ID
- indsp->new_industry_text = buf->ReadWord();
- _string_to_grf_mapping[&indsp->new_industry_text] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &indsp->new_industry_text);
break;
case 0x1C: // Input cargo multipliers for the three input cargo types
@@ -3587,8 +3598,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
}
case 0x1F: // Industry name
- indsp->name = buf->ReadWord();
- _string_to_grf_mapping[&indsp->name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &indsp->name);
break;
case 0x20: // Prospecting success chance
@@ -3606,10 +3616,15 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
indsp->removal_cost_multiplier = buf->ReadDWord();
break;
- case 0x24: // name for nearby station
- indsp->station_name = buf->ReadWord();
- if (indsp->station_name != STR_NULL) _string_to_grf_mapping[&indsp->station_name] = _cur.grffile->grfid;
+ case 0x24: { // name for nearby station
+ uint16 str = buf->ReadWord();
+ if (str == 0) {
+ indsp->station_name = STR_NULL;
+ } else {
+ AddStringForMapping(str, &indsp->station_name);
+ }
break;
+ }
default:
ret = CIR_UNKNOWN;
@@ -3802,8 +3817,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B
break;
case 0x10:
- as->name = buf->ReadWord();
- _string_to_grf_mapping[&as->name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &as->name);
break;
case 0x11: // Maintenance cost factor
@@ -3913,16 +3927,13 @@ static ChangeInfoResult ObjectChangeInfo(uint id, int numinfo, int prop, ByteRea
}
case 0x09: { // Class name
- StringID class_name = buf->ReadWord();
ObjectClass *objclass = ObjectClass::Get(spec->cls_id);
- objclass->name = class_name;
- _string_to_grf_mapping[&objclass->name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &objclass->name);
break;
}
case 0x0A: // Object name
- spec->name = buf->ReadWord();
- _string_to_grf_mapping[&spec->name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &spec->name);
break;
case 0x0B: // Climate mask
@@ -4028,33 +4039,29 @@ static ChangeInfoResult RailTypeChangeInfo(uint id, int numinfo, int prop, ByteR
buf->ReadDWord();
break;
- case 0x09: // Toolbar caption of railtype (sets name as well for backwards compatibility for grf ver < 8)
- rti->strings.toolbar_caption = buf->ReadWord();
- _string_to_grf_mapping[&rti->strings.toolbar_caption] = _cur.grffile->grfid;
+ case 0x09: { // Toolbar caption of railtype (sets name as well for backwards compatibility for grf ver < 8)
+ uint16 str = buf->ReadWord();
+ AddStringForMapping(str, &rti->strings.toolbar_caption);
if (_cur.grffile->grf_version < 8) {
- rti->strings.name = rti->strings.toolbar_caption;
- _string_to_grf_mapping[&rti->strings.name] = _cur.grffile->grfid;
+ AddStringForMapping(str, &rti->strings.name);
}
break;
+ }
case 0x0A: // Menu text of railtype
- rti->strings.menu_text = buf->ReadWord();
- _string_to_grf_mapping[&rti->strings.menu_text] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &rti->strings.menu_text);
break;
case 0x0B: // Build window caption
- rti->strings.build_caption = buf->ReadWord();
- _string_to_grf_mapping[&rti->strings.build_caption] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &rti->strings.build_caption);
break;
case 0x0C: // Autoreplace text
- rti->strings.replace_text = buf->ReadWord();
- _string_to_grf_mapping[&rti->strings.replace_text] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &rti->strings.replace_text);
break;
case 0x0D: // New locomotive text
- rti->strings.new_loco = buf->ReadWord();
- _string_to_grf_mapping[&rti->strings.new_loco] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &rti->strings.new_loco);
break;
case 0x0E: // Compatible railtype list
@@ -4118,8 +4125,7 @@ static ChangeInfoResult RailTypeChangeInfo(uint id, int numinfo, int prop, ByteR
break;
case 0x1B: // Name of railtype (overridden by prop 09 for grf ver < 8)
- rti->strings.name = buf->ReadWord();
- _string_to_grf_mapping[&rti->strings.name] = _cur.grffile->grfid;
+ AddStringForMapping(buf->ReadWord(), &rti->strings.name);
break;
case 0x1C: // Maintenance cost factor
@@ -9090,10 +9096,10 @@ extern void InitGRFTownGeneratorNames();
/** Finish loading NewGRFs and execute needed post-processing */
static void AfterLoadGRFs()
{
- for (StringIDToGRFIDMapping::iterator it = _string_to_grf_mapping.begin(); it != _string_to_grf_mapping.end(); it++) {
- *((*it).first) = MapGRFStringID((*it).second, *((*it).first));
+ for (StringIDMapping *it = _string_to_grf_mapping.Begin(); it != _string_to_grf_mapping.End(); it++) {
+ *it->target = MapGRFStringID(it->grfid, it->source);
}
- _string_to_grf_mapping.clear();
+ _string_to_grf_mapping.Clear();
/* Free the action 6 override sprites. */
for (GRFLineToSpriteOverride::iterator it = _grf_line_to_action6_sprite_override.begin(); it != _grf_line_to_action6_sprite_override.end(); it++) {