(svn r18845) -Codechange: introduce AirportTileSpec and use it for animation

This commit is contained in:
yexo 2010-01-17 14:22:07 +00:00
parent f920415752
commit 830af8ee77
9 changed files with 263 additions and 55 deletions

View File

@ -2175,6 +2175,10 @@
RelativePath=".\..\src\table\airport_defaults.h"
>
</File>
<File
RelativePath=".\..\src\table\airporttiles.h"
>
</File>
<File
RelativePath=".\..\src\table\airport_movement.h"
>

View File

@ -2172,6 +2172,10 @@
RelativePath=".\..\src\table\airport_defaults.h"
>
</File>
<File
RelativePath=".\..\src\table\airporttiles.h"
>
</File>
<File
RelativePath=".\..\src\table\airport_movement.h"
>

View File

@ -474,6 +474,7 @@ saveload/waypoint_sl.cpp
# Tables
table/airport_defaults.h
table/airporttiles.h
table/airport_movement.h
table/animcursors.h
table/autorail.h

View File

@ -123,10 +123,37 @@ enum AirportTiles {
};
#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

View File

@ -21,6 +21,11 @@ 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 = 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 @@ struct AirportSpec {
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 @@ struct AirportSpec {
};
/**
* 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,

View File

@ -2596,15 +2596,8 @@ static void TileLoop_Station(TileIndex tile)
* 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 TileLoop_Station(TileIndex tile)
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);
}
}
}

View File

@ -32,22 +32,8 @@ static inline StationID GetStationIndex(TileIndex t)
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,
};
/**

View File

@ -388,7 +388,7 @@ static AirportTileTable *_tile_table_helistation[] = {
#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 @@ AirportSpec _origin_airport_specs[NUM_AIRPORTS] = {
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

200
src/table/airporttiles.h Normal file
View File

@ -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 */