src/newgrf_commons.h
author truebrain
Mon, 16 Jun 2008 14:43:19 +0000
branchnoai
changeset 10978 13fd0364b2c6
parent 9732 f8eb3e208514
permissions -rw-r--r--
(svn r13532) [NoAI] -Fix: in MultiPlayer SignID wasn't set correctly, causing weird effects. Code is now more unified, which should avoid simular effects in the future (tnx to glx for initial patch)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     1
/* $Id$ */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     2
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     3
/** @file newgrf_commons.h This file simplyfies and embeds a common mechanism of
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     4
 * loading/saving and mapping of grf entities.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     5
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     6
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     7
#ifndef NEWGRF_COMMONS_H
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     8
#define NEWGRF_COMMONS_H
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     9
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    10
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    11
 * Maps an entity id stored on the map to a GRF file.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    12
 * Entities are objects used ingame (houses, industries, industry tiles) for
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    13
 * which we need to correlate the ids from the grf files with the ones in the
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    14
 * the savegames themselves.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    15
 * An array of EntityIDMapping structs is saved with the savegame so
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    16
 * that those GRFs can be loaded in a different order, or removed safely. The
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    17
 * index in the array is the entity's ID stored on the map.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    18
 *
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    19
 * The substitute ID is the ID of an original entity that should be used instead
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    20
 * if the GRF containing the new entity is not available.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    21
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    22
struct EntityIDMapping {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    23
	uint32 grfid;          ///< The GRF ID of the file the entity belongs to
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    24
	uint8  entity_id;      ///< The entity ID within the GRF file
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    25
	uint8  substitute_id;  ///< The (original) entity ID to use if this GRF is not available
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    26
};
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    27
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    28
class OverrideManagerBase {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    29
protected:
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    30
	uint16 *entity_overrides;
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9704
diff changeset
    31
	uint32 *grfid_overrides;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    32
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    33
	uint16 max_offset;       ///< what is the length of the original entity's array of specs
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    34
	uint16 max_new_entities; ///< what is the amount of entities, old and new summed
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    35
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    36
	uint16 invalid_ID;       ///< ID used to dected invalid entities;
9704
197cb8c6ae17 (svn r11221) [NoAI] -Sync: with trunk r11145:11220
glx
parents: 9694
diff changeset
    37
	virtual bool CheckValidNewID(uint16 testid) { return true; }
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    38
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    39
public:
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    40
	EntityIDMapping *mapping_ID; ///< mapping of ids from grf files.  Public out of convenience
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    41
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    42
	OverrideManagerBase(uint16 offset, uint16 maximum, uint16 invalid);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    43
	virtual ~OverrideManagerBase();
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    44
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    45
	void ResetOverride();
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    46
	void ResetMapping();
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    47
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9704
diff changeset
    48
	void Add(uint8 local_id, uint32 grfid, uint entity_type);
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    49
	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    50
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    51
	uint16 GetSubstituteID(byte entity_id);
9732
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
    52
	virtual uint16 GetID(uint8 grf_local_id, uint32 grfid);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    53
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    54
	inline uint16 GetMaxMapping() { return max_new_entities; }
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    55
	inline uint16 GetMaxOffset() { return max_offset; }
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    56
};
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    57
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    58
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    59
struct HouseSpec;
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    60
class HouseOverrideManager : public OverrideManagerBase {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    61
public:
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    62
	HouseOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    63
			OverrideManagerBase(offset, maximum, invalid) {}
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    64
	void SetEntitySpec(const HouseSpec *hs);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    65
};
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    66
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    67
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    68
struct IndustrySpec;
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    69
class IndustryOverrideManager : public OverrideManagerBase {
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    70
public:
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    71
	IndustryOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    72
			OverrideManagerBase(offset, maximum, invalid) {}
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    73
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    74
	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
9732
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
    75
	virtual uint16 GetID(uint8 grf_local_id, uint32 grfid);
9704
197cb8c6ae17 (svn r11221) [NoAI] -Sync: with trunk r11145:11220
glx
parents: 9694
diff changeset
    76
	void SetEntitySpec(IndustrySpec *inds);
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    77
};
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    78
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
    79
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
    80
struct IndustryTileSpec;
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    81
class IndustryTileOverrideManager : public OverrideManagerBase {
9704
197cb8c6ae17 (svn r11221) [NoAI] -Sync: with trunk r11145:11220
glx
parents: 9694
diff changeset
    82
protected:
197cb8c6ae17 (svn r11221) [NoAI] -Sync: with trunk r11145:11220
glx
parents: 9694
diff changeset
    83
	virtual bool CheckValidNewID(uint16 testid) { return testid != 0xFF; }
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    84
public:
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    85
	IndustryTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    86
			OverrideManagerBase(offset, maximum, invalid) {}
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    87
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9629
diff changeset
    88
	void SetEntitySpec(const IndustryTileSpec *indts);
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
    89
};
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
    90
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    91
extern HouseOverrideManager _house_mngr;
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    92
extern IndustryOverrideManager _industry_mngr;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
    93
extern IndustryTileOverrideManager _industile_mngr;
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    94
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    95
uint32 GetTerrainType(TileIndex tile);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    96
TileIndex GetNearbyTile(byte parameter, TileIndex tile);
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9722
diff changeset
    97
uint32 GetNearbyTileInformation(TileIndex tile);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    98
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    99
#endif /* NEWGRF_COMMONS_H */