Mercurial > hg > openttd
changeset 14293:1d93646afcfa draft
(svn r18845) -Codechange: introduce AirportTileSpec and use it for animation
author | yexo <yexo@openttd.org> |
---|---|
date | Sun, 17 Jan 2010 14:22:07 +0000 |
parents | c573c739dc7f |
children | 7718a19fd027 |
files | projects/openttd_vs80.vcproj projects/openttd_vs90.vcproj source.list src/airport.cpp src/airport.h src/station_cmd.cpp src/station_map.h src/table/airport_defaults.h src/table/airporttiles.h |
diffstat | 9 files changed, 263 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -2176,6 +2176,10 @@ > </File> <File + RelativePath=".\..\src\table\airporttiles.h" + > + </File> + <File RelativePath=".\..\src\table\airport_movement.h" > </File>
--- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -2173,6 +2173,10 @@ > </File> <File + RelativePath=".\..\src\table\airporttiles.h" + > + </File> + <File RelativePath=".\..\src\table\airport_movement.h" > </File>
--- a/source.list +++ b/source.list @@ -474,6 +474,7 @@ # Tables table/airport_defaults.h +table/airporttiles.h table/airport_movement.h table/animcursors.h table/autorail.h
--- a/src/airport.cpp +++ b/src/airport.cpp @@ -123,10 +123,37 @@ }; #include "table/airport_defaults.h" +#include "table/airporttiles.h" AirportSpec AirportSpec::dummy = {NULL, NULL, 0, 0, 0, 0, 0, MIN_YEAR, MIN_YEAR}; AirportSpec AirportSpec::oilrig = {NULL, NULL, 0, 1, 1, 0, 4, MIN_YEAR, MIN_YEAR}; + +/** + * Retrieve airport spec for the given airport + * @param type index of airport + * @return A pointer to the corresponding AirportSpec + */ +/* static */ const AirportSpec *AirportSpec::Get(byte type) +{ + if (type == AT_OILRIG) return &oilrig; + assert(type < NUM_AIRPORTS); + extern const AirportSpec _origin_airport_specs[]; + return &_origin_airport_specs[type]; +} + +/** + * Retrieve airport tile spec for the given airport tile + * @param gfx index of airport tile + * @return A pointer to the corresponding AirportTileSpec + */ +/* static */ const AirportTileSpec *AirportTileSpec::Get(StationGfx gfx) +{ + assert(gfx < NUM_AIRPORTTILES); + extern const AirportTileSpec _origin_airporttile_specs[]; + return &_origin_airporttile_specs[gfx]; +} + /* Uncomment this to print out a full report of the airport-structure * You should either use * - true: full-report, print out every state and choice with string-names
--- a/src/airport.h +++ b/src/airport.h @@ -21,6 +21,11 @@ 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 = 144, ///< total number of airport tiles +}; + +enum { + AIRPORTTILE_NOANIM = 0xFF, ///< flag to mark airport tiles as having no animation }; /** Airport types */ @@ -61,13 +66,7 @@ Year min_year; ///< first year the airport is available Year max_year; ///< last year the airport is available - static AirportSpec *Get(byte type) - { - if (type == AT_OILRIG) return &oilrig; - assert(type < NUM_AIRPORTS); - extern AirportSpec _origin_airport_specs[NUM_AIRPORTS]; - return &_origin_airport_specs[type]; - } + static const AirportSpec *Get(byte type); bool IsAvailable() const; @@ -76,6 +75,16 @@ }; +/** + * Defines the data structure of each indivudual tile of an airport. + */ +struct AirportTileSpec { + StationGfx anim_next; ///< Next StationGfx in an animation + uint8 animation_speed; ///< The speed of the animation + + static const AirportTileSpec *Get(StationGfx gfx); +}; + enum { AMED_NOSPDCLAMP = 1 << 0, AMED_TAKEOFF = 1 << 1,
--- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2596,15 +2596,8 @@ * hardcoded.....not good */ switch (GetStationType(tile)) { case STATION_AIRPORT: - switch (GetStationGfx(tile)) { - case GFX_RADAR_LARGE_FIRST: - case GFX_WINDSACK_FIRST : // for small airport - case GFX_RADAR_INTERNATIONAL_FIRST: - case GFX_RADAR_METROPOLITAN_FIRST: - case GFX_RADAR_DISTRICTWE_FIRST: // radar district W-E airport - case GFX_WINDSACK_INTERCON_FIRST : // for intercontinental airport - AddAnimatedTile(tile); - break; + if (AirportTileSpec::Get(GetStationGfx(tile))->anim_next != AIRPORTTILE_NOANIM) { + AddAnimatedTile(tile); } break; @@ -2623,35 +2616,17 @@ static void AnimateTile_Station(TileIndex tile) { - struct AnimData { - StationGfx from; // first sprite - StationGfx to; // last sprite - byte delay; - }; - - static const AnimData data[] = { - { GFX_RADAR_LARGE_FIRST, GFX_RADAR_LARGE_LAST, 3 }, - { GFX_WINDSACK_FIRST, GFX_WINDSACK_LAST, 1 }, - { GFX_RADAR_INTERNATIONAL_FIRST, GFX_RADAR_INTERNATIONAL_LAST, 3 }, - { GFX_RADAR_METROPOLITAN_FIRST, GFX_RADAR_METROPOLITAN_LAST, 3 }, - { GFX_RADAR_DISTRICTWE_FIRST, GFX_RADAR_DISTRICTWE_LAST, 3 }, - { GFX_WINDSACK_INTERCON_FIRST, GFX_WINDSACK_INTERCON_LAST, 1 } - }; - if (HasStationRail(tile)) { AnimateStationTile(tile); return; } - StationGfx gfx = GetStationGfx(tile); - - for (const AnimData *i = data; i != endof(data); i++) { - if (i->from <= gfx && gfx <= i->to) { - if ((_tick_counter & i->delay) == 0) { - SetStationGfx(tile, gfx < i->to ? gfx + 1 : i->from); - MarkTileDirtyByTile(tile); - } - break; + if (IsAirport(tile)) { + const AirportTileSpec *ats = AirportTileSpec::Get(GetStationGfx(tile)); + uint16 mask = (1 << ats->animation_speed) - 1; + if (ats->anim_next != AIRPORTTILE_NOANIM && (_tick_counter & mask) == 0) { + SetStationGfx(tile, ats->anim_next); + MarkTileDirtyByTile(tile); } } }
--- a/src/station_map.h +++ b/src/station_map.h @@ -32,22 +32,8 @@ enum { - GFX_RADAR_LARGE_FIRST = 31, - GFX_RADAR_LARGE_LAST = 42, - GFX_WINDSACK_FIRST = 50, - GFX_WINDSACK_LAST = 53, - GFX_DOCK_BASE_WATER_PART = 4, GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET = 4, - - GFX_RADAR_INTERNATIONAL_FIRST = 66, - GFX_RADAR_INTERNATIONAL_LAST = 77, - GFX_RADAR_METROPOLITAN_FIRST = 78, - GFX_RADAR_METROPOLITAN_LAST = 89, - GFX_RADAR_DISTRICTWE_FIRST = 121, - GFX_RADAR_DISTRICTWE_LAST = 132, - GFX_WINDSACK_INTERCON_FIRST = 140, - GFX_WINDSACK_INTERCON_LAST = 143, }; /**
--- a/src/table/airport_defaults.h +++ b/src/table/airport_defaults.h @@ -388,7 +388,7 @@ #define AS(ap_name, size_x, size_y, min_year, max_year, catchment, noise) \ AS_GENERIC(_tile_table_##ap_name, _airport_depots_##ap_name, lengthof(_airport_depots_##ap_name), size_x, size_y, noise, catchment, min_year, max_year) -AirportSpec _origin_airport_specs[NUM_AIRPORTS] = { +static const AirportSpec _origin_airport_specs[] = { AS(country, 4, 3, 0, 1959, 4, 3), AS(city, 6, 6, 1960, MAX_YEAR, 5, 5), AS_ND(heliport, 1, 1, 1963, MAX_YEAR, 4, 1), @@ -400,6 +400,8 @@ AS(helistation, 4, 2, 1980, MAX_YEAR, 4, 3), }; +assert_compile(NUM_AIRPORTS == lengthof(_origin_airport_specs)); + #undef AS #undef AS_ND #undef AS_GENERIC
new file mode 100644 --- /dev/null +++ b/src/table/airporttiles.h @@ -0,0 +1,200 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. + */ + +/** @file airporttiles.h Tables with airporttile defaults. */ + +#ifndef AIRPORTTILES_H +#define AIRPORTTILES_H + + +/** Writes all airport tile properties in the AirportTile struct */ +#define AT(anim_next, anim_speed) {anim_next, anim_speed} +/** All default airport tiles. + * @see AirportTiles for a list of names. */ +static const AirportTileSpec _origin_airporttile_specs[] = { + /* 0..9 */ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 10..19 */ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 20..29*/ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 30..39*/ + AT(AIRPORTTILE_NOANIM, 2), + AT( 32, 2), + AT( 33, 2), + AT( 34, 2), + AT( 35, 2), + AT( 36, 2), + AT( 37, 2), + AT( 38, 2), + AT( 39, 2), + AT( 40, 2), + + /* 40..49 */ + AT( 41, 2), + AT( 42, 2), + AT( 31, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 50..59 */ + AT( 51, 1), + AT( 52, 1), + AT( 53, 1), + AT( 50, 1), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 60..69 */ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT( 67, 2), + AT( 68, 2), + AT( 69, 2), + AT( 70, 2), + + /* 70..79 */ + AT( 71, 2), + AT( 72, 2), + AT( 73, 2), + AT( 74, 2), + AT( 75, 2), + AT( 76, 2), + AT( 77, 2), + AT( 66, 2), + AT( 79, 2), + AT( 80, 2), + + /* 80..89 */ + AT( 81, 2), + AT( 82, 2), + AT( 83, 2), + AT( 84, 2), + AT( 85, 2), + AT( 86, 2), + AT( 87, 2), + AT( 88, 2), + AT( 89, 2), + AT( 78, 2), + + /* 90..99 */ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 100..109 */ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 110..119 */ + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 120..129 */ + AT(AIRPORTTILE_NOANIM, 2), + AT( 122, 2), + AT( 123, 2), + AT( 124, 2), + AT( 125, 2), + AT( 126, 2), + AT( 127, 2), + AT( 128, 2), + AT( 129, 2), + AT( 130, 2), + + /* 130..139 */ + AT( 131, 2), + AT( 132, 2), + AT( 121, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + AT(AIRPORTTILE_NOANIM, 2), + + /* 140..143 */ + AT( 141, 1), + AT( 142, 1), + AT( 143, 1), + AT( 140, 1), +}; + +assert_compile(NUM_AIRPORTTILES == lengthof(_origin_airporttile_specs)); + +#undef AT + +#endif /* AIRPORTTILES_H */