src/newgrf_commons.h
author peter1138
Tue, 22 Jan 2008 07:27:06 +0000
changeset 8374 7a1b6c89cb89
parent 7873 9bb5874c81df
child 8458 38fe72ff1402
permissions -rw-r--r--
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     1
/* $Id$ */
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     2
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     3
/** @file newgrf_commons.h This file simplyfies and embeds a common mechanism of
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     4
 * loading/saving and mapping of grf entities.
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     5
 */
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     6
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     7
#ifndef NEWGRF_COMMONS_H
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     8
#define NEWGRF_COMMONS_H
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
     9
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    10
/**
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    11
 * Maps an entity id stored on the map to a GRF file.
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    12
 * Entities are objects used ingame (houses, industries, industry tiles) for
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    13
 * which we need to correlate the ids from the grf files with the ones in the
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    14
 * the savegames themselves.
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    15
 * An array of EntityIDMapping structs is saved with the savegame so
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    16
 * that those GRFs can be loaded in a different order, or removed safely. The
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    17
 * index in the array is the entity's ID stored on the map.
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    18
 *
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    19
 * The substitute ID is the ID of an original entity that should be used instead
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    20
 * if the GRF containing the new entity is not available.
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    21
 */
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    22
struct EntityIDMapping {
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    23
	uint32 grfid;          ///< The GRF ID of the file the entity belongs to
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    24
	uint8  entity_id;      ///< The entity ID within the GRF file
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    25
	uint8  substitute_id;  ///< The (original) entity ID to use if this GRF is not available
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    26
};
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    27
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    28
class OverrideManagerBase {
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    29
protected:
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    30
	uint16 *entity_overrides;
7873
9bb5874c81df (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 7667
diff changeset
    31
	uint32 *grfid_overrides;
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    32
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    33
	uint16 max_offset;       ///< what is the length of the original entity's array of specs
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    34
	uint16 max_new_entities; ///< what is the amount of entities, old and new summed
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    35
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    36
	uint16 invalid_ID;       ///< ID used to dected invalid entities;
7632
08e14d61a557 (svn r11163) -Codechange: Verify that the IndustryTileOverrideManager skip the magic value of 0xFF when assigning a new tileID. This is really important, since the value is reserved for water checking.
belugas
parents: 7325
diff changeset
    37
	virtual bool CheckValidNewID(uint16 testid) { return true; }
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    38
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    39
public:
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    40
	EntityIDMapping *mapping_ID; ///< mapping of ids from grf files.  Public out of convenience
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    41
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    42
	OverrideManagerBase(uint16 offset, uint16 maximum, uint16 invalid);
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    43
	virtual ~OverrideManagerBase();
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    44
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    45
	void ResetOverride();
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    46
	void ResetMapping();
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    47
7873
9bb5874c81df (svn r11423) -Codechange: store grfid when adding an override
glx
parents: 7667
diff changeset
    48
	void Add(uint8 local_id, uint32 grfid, uint entity_type);
6835
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    49
	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    50
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    51
	uint16 GetSubstituteID(byte entity_id);
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    52
	uint16 GetID(uint8 grf_local_id, uint32 grfid);
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    53
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    54
	inline uint16 GetMaxMapping() { return max_new_entities; }
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    55
	inline uint16 GetMaxOffset() { return max_offset; }
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    56
};
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    57
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    58
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    59
struct HouseSpec;
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    60
class HouseOverrideManager : public OverrideManagerBase {
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    61
public:
6835
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    62
	HouseOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    63
			OverrideManagerBase(offset, maximum, invalid) {}
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    64
	void SetEntitySpec(const HouseSpec *hs);
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    65
};
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    66
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    67
6835
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    68
struct IndustrySpec;
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    69
class IndustryOverrideManager : public OverrideManagerBase {
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    70
public:
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    71
	IndustryOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    72
			OverrideManagerBase(offset, maximum, invalid) {}
6835
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    73
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    74
	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
7667
0355390b08d9 (svn r11198) -Fix: When industry override is not possible because it is already been overridden, mark the new candidate as not being an override
belugas
parents: 7632
diff changeset
    75
	void SetEntitySpec(IndustrySpec *inds);
6835
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    76
};
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    77
7000
603a41cb93f8 (svn r10256) -Add: Addition of IndustryTileOverrideManager
belugas
parents: 6835
diff changeset
    78
603a41cb93f8 (svn r10256) -Add: Addition of IndustryTileOverrideManager
belugas
parents: 6835
diff changeset
    79
struct IndustryTileSpec;
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    80
class IndustryTileOverrideManager : public OverrideManagerBase {
7632
08e14d61a557 (svn r11163) -Codechange: Verify that the IndustryTileOverrideManager skip the magic value of 0xFF when assigning a new tileID. This is really important, since the value is reserved for water checking.
belugas
parents: 7325
diff changeset
    81
protected:
08e14d61a557 (svn r11163) -Codechange: Verify that the IndustryTileOverrideManager skip the magic value of 0xFF when assigning a new tileID. This is really important, since the value is reserved for water checking.
belugas
parents: 7325
diff changeset
    82
	virtual bool CheckValidNewID(uint16 testid) { return testid != 0xFF; }
7325
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    83
public:
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    84
	IndustryTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    85
			OverrideManagerBase(offset, maximum, invalid) {}
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    86
1140f831f255 (svn r10688) -Cleanup: coding style cleanups missed in the last few cleanups.
rubidium
parents: 7000
diff changeset
    87
	void SetEntitySpec(const IndustryTileSpec *indts);
7000
603a41cb93f8 (svn r10256) -Add: Addition of IndustryTileOverrideManager
belugas
parents: 6835
diff changeset
    88
};
603a41cb93f8 (svn r10256) -Add: Addition of IndustryTileOverrideManager
belugas
parents: 6835
diff changeset
    89
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    90
extern HouseOverrideManager _house_mngr;
6835
31c89aab2d61 (svn r10074) -Add: Addition of IndustryOverrideManager as well as the basic (and unfinished) support for callbacks for industries
belugas
parents: 6827
diff changeset
    91
extern IndustryOverrideManager _industry_mngr;
7000
603a41cb93f8 (svn r10256) -Add: Addition of IndustryTileOverrideManager
belugas
parents: 6835
diff changeset
    92
extern IndustryTileOverrideManager _industile_mngr;
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    93
6801
9d82611443fd (svn r10040) -Codechange: Make the function GetTerrainType public, as other functions require it
belugas
parents: 6629
diff changeset
    94
uint32 GetTerrainType(TileIndex tile);
6827
e2450e25ad95 (svn r10066) -Codechange: Expose function GetNearbyTile by moving it to newgrf_commons.[cpp|h]. Will be used by industries in a few.
belugas
parents: 6801
diff changeset
    95
TileIndex GetNearbyTile(byte parameter, TileIndex tile);
6801
9d82611443fd (svn r10040) -Codechange: Make the function GetTerrainType public, as other functions require it
belugas
parents: 6629
diff changeset
    96
6629
eba0ac353e4d (svn r9850) -Codechange: Introduction of the Override/Substitute manager. Currently only used for newhouses.
belugas
parents:
diff changeset
    97
#endif /* NEWGRF_COMMONS_H */