changeset 7873:9d2f84f4c59a draft

(svn r11423) -Codechange: store grfid when adding an override
author glx <glx@openttd.org>
date Mon, 12 Nov 2007 20:40:58 +0000
parents c388e1e41ab6
children 67e296ac1a18
files src/newgrf.cpp src/newgrf_commons.cpp src/newgrf_commons.h
diffstat 3 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -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
+++ b/src/newgrf_commons.cpp
@@ -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
+++ b/src/newgrf_commons.h
@@ -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);