src/newgrf_commons.h
branchgamebalance
changeset 9911 0b8b245a2391
child 6720 35756db7e577
child 7297 1df77fb920bd
child 9626 79f2b5a0cdd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_commons.h	Wed Jun 13 11:45:14 2007 +0000
@@ -0,0 +1,69 @@
+/* $Id$ */
+
+/** @file newgrf_commons.h This file simplyfies and embeds a common mechanism of
+ * loading/saving and mapping of grf entities.
+ */
+
+#ifndef NEWGRF_COMMONS_H
+#define NEWGRF_COMMONS_H
+
+/**
+ * Maps an entity id stored on the map to a GRF file.
+ * Entities are objects used ingame (houses, industries, industry tiles) for
+ * which we need to correlate the ids from the grf files with the ones in the
+ * the savegames themselves.
+ * An array of EntityIDMapping structs is saved with the savegame so
+ * that those GRFs can be loaded in a different order, or removed safely. The
+ * index in the array is the entity's ID stored on the map.
+ *
+ * The substitute ID is the ID of an original entity that should be used instead
+ * if the GRF containing the new entity is not available.
+ */
+struct EntityIDMapping {
+	uint32 grfid;          ///< The GRF ID of the file the entity belongs to
+	uint8  entity_id;      ///< The entity ID within the GRF file
+	uint8  substitute_id;  ///< The (original) entity ID to use if this GRF is not available
+};
+
+class OverrideManagerBase
+{
+protected:
+	uint16 *entity_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
+
+	uint16 invalid_ID;       ///< ID used to dected invalid entities;
+
+	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
+public:
+	EntityIDMapping *mapping_ID; ///< mapping of ids from grf files.  Public out of convenience
+
+	OverrideManagerBase(uint16 offset, uint16 maximum, uint16 invalid);
+	virtual ~OverrideManagerBase();
+
+	void ResetOverride();
+	void ResetMapping();
+
+	void Add(uint8 local_id, uint entity_type);
+
+	uint16 GetSubstituteID(byte entity_id);
+	uint16 GetID(uint8 grf_local_id, uint32 grfid);
+
+	inline uint16 GetMaxMapping() { return max_new_entities; };
+	inline uint16 GetMaxOffset() { return max_offset; };
+};
+
+
+struct HouseSpec;
+class HouseOverrideManager : public OverrideManagerBase
+{
+public:
+	HouseOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : OverrideManagerBase(offset, maximum, invalid) {};
+	void SetEntitySpec(const HouseSpec *hs);
+};
+
+
+extern HouseOverrideManager _house_mngr;
+
+#endif /* NEWGRF_COMMONS_H */