diff options
author | yexo <yexo@openttd.org> | 2010-02-22 14:15:48 +0000 |
---|---|---|
committer | yexo <yexo@openttd.org> | 2010-02-22 14:15:48 +0000 |
commit | 683ad53d21871e49bd8f6071db25e8ab1ad4485b (patch) | |
tree | 2ceff6d0297c9f2f4163d14ea0224ea9a9f68560 /src/newgrf_airporttiles.cpp | |
parent | 3530156e15b6770894a6e07d065f4f771934e83a (diff) | |
download | openttd-683ad53d21871e49bd8f6071db25e8ab1ad4485b.tar.xz |
(svn r19193) -Codechange: increase the maximum number of airport tiles to 256 and introduce AirportTileOverrideManager
Diffstat (limited to 'src/newgrf_airporttiles.cpp')
-rw-r--r-- | src/newgrf_airporttiles.cpp | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index 0735016a6..0eda02e1a 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -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; + } } |