--- a/src/newgrf.cpp Mon Nov 12 20:05:12 2007 +0000
+++ b/src/newgrf.cpp Mon Nov 12 20:40:58 2007 +0000
@@ -1336,7 +1336,7 @@
continue;
}
- _house_mngr.Add(hid + i, override);
+ _house_mngr.Add(hid + i, _cur_grffile->grfid, override);
} break;
case 0x16: // Periodic refresh multiplier
@@ -1764,7 +1764,7 @@
return false;
}
- _industile_mngr.Add(indtid + i, ovrid);
+ _industile_mngr.Add(indtid + i, _cur_grffile->grfid, ovrid);
} break;
case 0x0A: // Tile acceptance
@@ -1877,7 +1877,7 @@
return false;
}
indsp->grf_prop.override = ovrid;
- _industry_mngr.Add(indid + i, ovrid);
+ _industry_mngr.Add(indid + i, _cur_grffile->grfid, ovrid);
} break;
case 0x0A: { // Set industry layout(s)
--- a/src/newgrf_commons.cpp Mon Nov 12 20:05:12 2007 +0000
+++ b/src/newgrf_commons.cpp Mon Nov 12 20:40:58 2007 +0000
@@ -27,6 +27,7 @@
mapping_ID = CallocT<EntityIDMapping>(max_new_entities);
entity_overrides = MallocT<uint16>(max_offset);
memset(entity_overrides, invalid, sizeof(entity_overrides));
+ grfid_overrides = CallocT<uint32>(max_offset);
}
/** Destructor of the generic class.
@@ -36,18 +37,21 @@
{
free(mapping_ID);
free(entity_overrides);
+ free(grfid_overrides);
}
/** Since the entity IDs defined by the GRF file does not necessarily correlate
* to those used by the game, the IDs used for overriding old entities must be
* translated when the entity spec is set.
- * @param local_id id in grf file
+ * @param local_id ID in grf file
+ * @param grfid ID of the grf file
* @param entity_type original entity type
*/
-void OverrideManagerBase::Add(uint8 local_id, uint entity_type)
+void OverrideManagerBase::Add(uint8 local_id, uint32 grfid, uint entity_type)
{
assert(entity_type < max_offset);
entity_overrides[entity_type] = local_id;
+ grfid_overrides[entity_type] = grfid;
}
/** Resets the mapping, which is used while initializing game */
@@ -61,6 +65,7 @@
{
for (uint16 i = 0; i < max_offset; i++) {
entity_overrides[i] = invalid_ID;
+ grfid_overrides[i] = 0;
}
}
@@ -144,10 +149,11 @@
for (int i = 0; i != max_offset; i++) {
HouseSpec *overridden_hs = GetHouseSpecs(i);
- if (entity_overrides[i] != hs->local_id) continue;
+ if (entity_overrides[i] != hs->local_id || grfid_overrides[i] != hs->grffile->grfid) continue;
overridden_hs->override = house_id;
entity_overrides[i] = invalid_ID;
+ grfid_overrides[i] = 0;
}
}
@@ -236,11 +242,12 @@
for (int i = 0; i < max_offset; i++) {
IndustryTileSpec *overridden_its = &_industry_tile_specs[i];
- if (entity_overrides[i] != its->grf_prop.local_id) continue;
+ if (entity_overrides[i] != its->grf_prop.local_id || grfid_overrides[i] != its->grf_prop.grffile->grfid) continue;
overridden_its->grf_prop.override = indt_id;
overridden_its->enabled = false;
entity_overrides[i] = invalid_ID;
+ grfid_overrides[i] = 0;
}
}
--- a/src/newgrf_commons.h Mon Nov 12 20:05:12 2007 +0000
+++ b/src/newgrf_commons.h Mon Nov 12 20:40:58 2007 +0000
@@ -28,6 +28,7 @@
class OverrideManagerBase {
protected:
uint16 *entity_overrides;
+ uint32 *grfid_overrides;
uint16 max_offset; ///< what is the length of the original entity's array of specs
uint16 max_new_entities; ///< what is the amount of entities, old and new summed
@@ -44,7 +45,7 @@
void ResetOverride();
void ResetMapping();
- void Add(uint8 local_id, uint entity_type);
+ void Add(uint8 local_id, uint32 grfid, uint entity_type);
virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
uint16 GetSubstituteID(byte entity_id);