Changeset - r14606:2cf1bcd611f7
[Not reviewed]
master
0 7 0
yexo - 15 years ago 2010-02-22 14:15:48
yexo@openttd.org
(svn r19193) -Codechange: increase the maximum number of airport tiles to 256 and introduce AirportTileOverrideManager
7 files changed with 90 insertions and 19 deletions:
0 comments (0 inline, 0 general)
src/airport.h
Show inline comments
 
@@ -16,12 +16,14 @@
 
#include "map_type.h"
 
#include "date_type.h"
 

	
 
/** Current limits for airports */
 
/** Some airport-related constants */
 
enum {
 
	MAX_TERMINALS =  10, ///< maximum number of terminals per airport
 
	MAX_HELIPADS  =   4, ///< maximum number of helipads per airport
 
	MAX_ELEMENTS  = 255, ///< maximum number of aircraft positions at airport
 
	NUM_AIRPORTTILES = 74, ///< total number of airport tiles
 
	MAX_TERMINALS =  10,                    ///< maximum number of terminals per airport
 
	MAX_HELIPADS  =   4,                    ///< maximum number of helipads per airport
 
	MAX_ELEMENTS  = 255,                    ///< maximum number of aircraft positions at airport
 
	NUM_AIRPORTTILES = 256,                 ///< total number of airport tiles
 
	NEW_AIRPORTTILE_OFFSET = 74,            ///< offset of first newgrf airport tile
 
	INVALID_AIRPORTTILE = NUM_AIRPORTTILES, ///< id for an invalid airport tile
 
};
 

	
 
/** Airport types */
src/industrytype.h
Show inline comments
 
@@ -19,6 +19,7 @@
 
#include "landscape_type.h"
 
#include "strings_type.h"
 
#include "cargo_type.h"
 
#include "newgrf_commons.h"
 

	
 
enum {
 
	CLEAN_RANDOMSOUNDS,    ///< Free the dynamically allocated sounds table
 
@@ -94,15 +95,6 @@ struct IndustryTileTable {
 
	IndustryGfx gfx;
 
};
 

	
 
/** Data related to the handling of grf files.  Common to both industry and industry tile */
 
struct GRFFileProps {
 
	uint16 subst_id;
 
	uint16 local_id;                      ///< id defined by the grf file for this industry
 
	struct SpriteGroup *spritegroup;      ///< pointer to the different sprites of the industry
 
	const struct GRFFile *grffile;        ///< grf file that introduced this industry
 
	uint16 override;                      ///< id of the entity been replaced by
 
};
 

	
 
/**
 
 * Defines the data structure for constructing industry.
 
 */
src/newgrf.cpp
Show inline comments
 
@@ -35,6 +35,7 @@
 
#include "newgrf_commons.h"
 
#include "newgrf_townname.h"
 
#include "newgrf_industries.h"
 
#include "newgrf_airporttiles.h"
 
#include "rev.h"
 
#include "fios.h"
 
#include "rail.h"
 
@@ -5768,6 +5769,9 @@ static void ResetNewGRFData()
 
	ResetStationClasses();
 
	ResetCustomStations();
 

	
 
	/* Reset airport-related structures */
 
	AirportTileSpec::ResetAirportTiles();
 

	
 
	/* Reset canal sprite groups and flags */
 
	memset(_water_feature, 0, sizeof(_water_feature));
 

	
src/newgrf_airporttiles.cpp
Show inline comments
 
@@ -11,10 +11,15 @@
 

	
 
#include "stdafx.h"
 
#include "airport.h"
 
#include "newgrf.h"
 
#include "newgrf_airporttiles.h"
 
#include "table/airporttiles.h"
 

	
 

	
 
AirportTileSpec AirportTileSpec::tiles[NUM_AIRPORTTILES];
 

	
 
AirportTileOverrideManager _airporttile_mngr(NEW_AIRPORTTILE_OFFSET, NUM_AIRPORTTILES, INVALID_AIRPORTTILE);
 

	
 
/**
 
 * Retrieve airport tile spec for the given airport tile
 
 * @param gfx index of airport tile
 
@@ -22,8 +27,43 @@
 
 */
 
/* static */ const AirportTileSpec *AirportTileSpec::Get(StationGfx gfx)
 
{
 
	assert(gfx < NUM_AIRPORTTILES);
 
	extern const AirportTileSpec _origin_airporttile_specs[];
 
	return &_origin_airporttile_specs[gfx];
 
	assert(gfx < lengthof(AirportTileSpec::tiles));
 
	return &AirportTileSpec::tiles[gfx];
 
}
 

	
 
/**
 
 * This function initializes the tile array of AirportTileSpec
 
 */
 
void AirportTileSpec::ResetAirportTiles()
 
{
 
	memset(&AirportTileSpec::tiles, 0, sizeof(AirportTileSpec::tiles));
 
	memcpy(&AirportTileSpec::tiles, &_origin_airporttile_specs, sizeof(_origin_airporttile_specs));
 

	
 
	/* Reset any overrides that have been set. */
 
	_airporttile_mngr.ResetOverride();
 
}
 

	
 
void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts)
 
{
 
	StationGfx airpt_id = this->AddEntityID(airpts->grf_prop.local_id, airpts->grf_prop.grffile->grfid, airpts->grf_prop.subst_id);
 

	
 
	if (airpt_id == invalid_ID) {
 
		grfmsg(1, "AirportTile.SetEntitySpec: Too many airport tiles allocated. Ignoring.");
 
		return;
 
	}
 

	
 
	memcpy(&AirportTileSpec::tiles[airpt_id], airpts, sizeof(*airpts));
 

	
 
	/* Now add the overrides. */
 
	for (int i = 0; i < max_offset; i++) {
 
		AirportTileSpec *overridden_airpts = &AirportTileSpec::tiles[i];
 

	
 
		if (entity_overrides[i] != airpts->grf_prop.local_id || grfid_overrides[i] != airpts->grf_prop.grffile->grfid) continue;
 

	
 
		overridden_airpts->grf_prop.override = airpt_id;
 
		overridden_airpts->enabled = false;
 
		entity_overrides[i] = invalid_ID;
 
		grfid_overrides[i] = 0;
 
	}
 
}
 

	
src/newgrf_airporttiles.h
Show inline comments
 
@@ -13,6 +13,8 @@
 
#define NEWGRF_AIRPORTTILES_H
 

	
 
#include "station_map.h"
 
#include "newgrf_commons.h"
 
#include "airport.h"
 

	
 
/**
 
 * Defines the data structure of each indivudual tile of an airport.
 
@@ -21,7 +23,17 @@ struct AirportTileSpec {
 
	uint16 animation_info;                ///< Information about the animation (is it looping, how many loops etc)
 
	uint8 animation_speed;                ///< The speed of the animation
 

	
 
	bool enabled;                         ///< entity still available (by default true). newgrf can disable it, though
 
	GRFFileProps grf_prop;                ///< properties related the the grf file
 

	
 
	static const AirportTileSpec *Get(StationGfx gfx);
 

	
 
	static void ResetAirportTiles();
 

	
 
private:
 
	static AirportTileSpec tiles[NUM_AIRPORTTILES];
 

	
 
	friend void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts);
 
};
 

	
 
#endif /* NEWGRF_AIRPORTTILES_H */
src/newgrf_commons.h
Show inline comments
 
@@ -97,12 +97,33 @@ public:
 
	void SetEntitySpec(const IndustryTileSpec *indts);
 
};
 

	
 
struct AirportTileSpec;
 
class AirportTileOverrideManager : public OverrideManagerBase {
 
protected:
 
	virtual bool CheckValidNewID(uint16 testid) { return testid != 0xFF; }
 
public:
 
	AirportTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
 
			OverrideManagerBase(offset, maximum, invalid) {}
 

	
 
	void SetEntitySpec(const AirportTileSpec *ats);
 
};
 

	
 
extern HouseOverrideManager _house_mngr;
 
extern IndustryOverrideManager _industry_mngr;
 
extern IndustryTileOverrideManager _industile_mngr;
 
extern AirportTileOverrideManager _airporttile_mngr;
 

	
 
uint32 GetTerrainType(TileIndex tile);
 
TileIndex GetNearbyTile(byte parameter, TileIndex tile);
 
uint32 GetNearbyTileInformation(TileIndex tile);
 

	
 
/** Data related to the handling of grf files. */
 
struct GRFFileProps {
 
	uint16 subst_id;
 
	uint16 local_id;                      ///< id defined by the grf file for this entity
 
	struct SpriteGroup *spritegroup;      ///< pointer to the different sprites of the entity
 
	const struct GRFFile *grffile;        ///< grf file that introduced this entity
 
	uint16 override;                      ///< id of the entity been replaced by
 
};
 

	
 
#endif /* NEWGRF_COMMONS_H */
src/table/airporttiles.h
Show inline comments
 
@@ -13,7 +13,7 @@
 
#define AIRPORTTILES_H
 

	
 
/** Writes all airport tile properties in the AirportTile struct */
 
#define AT(num_frames, anim_speed) {(1 << 8) | num_frames, anim_speed}
 
#define AT(num_frames, anim_speed) {(1 << 8) | num_frames, anim_speed, true, {INVALID_AIRPORTTILE, 0, NULL, NULL, INVALID_AIRPORTTILE}}
 
/** Writes an airport tile without animation in the AirportTile struct */
 
#define AT_NOANIM {0xFFFF, 2}
 

	
 
@@ -104,7 +104,7 @@ static const AirportTileSpec _origin_air
 
	AT(4, 1), // APT_GRASS_FENCE_NE_FLAG_2
 
};
 

	
 
assert_compile(NUM_AIRPORTTILES == lengthof(_origin_airporttile_specs));
 
assert_compile(NEW_AIRPORTTILE_OFFSET == lengthof(_origin_airporttile_specs));
 

	
 
#undef AT_NOANIM
 
#undef AT
0 comments (0 inline, 0 general)