1
0
Fork 0

Codechange: Use EnumBitSet for Airport blocks.

pull/13551/head
Peter Nelson 2025-02-12 23:51:02 +00:00 committed by Peter Nelson
parent 9049710051
commit f309b90a1d
14 changed files with 425 additions and 421 deletions

View File

@ -1209,12 +1209,12 @@ static bool HandleCrashedAircraft(Aircraft *v)
/* remove rubble of crashed airplane */
/* clear runway-in on all airports, set by crashing plane
* small airports use AIRPORT_BUSY, city airports use RUNWAY_IN_OUT_block, etc.
* small airports use AIRPORT_BUSY, city airports use AirportBlock::RunwayInOut, etc.
* but they all share the same number */
if (st != nullptr) {
CLRBITS(st->airport.flags, RUNWAY_IN_block);
CLRBITS(st->airport.flags, RUNWAY_IN_OUT_block); // commuter airport
CLRBITS(st->airport.flags, RUNWAY_IN2_block); // intercontinental
st->airport.blocks.Reset(AirportBlock::RunwayIn);
st->airport.blocks.Reset(AirportBlock::RunwayInOut); // commuter airport
st->airport.blocks.Reset(AirportBlock::RunwayIn2); // intercontinental
}
delete v;
@ -1663,8 +1663,8 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
Station *st = Station::Get(v->targetairport);
/* Runway busy, not allowed to use this airstation or closed, circle. */
if (CanVehicleUseStation(v, st) && (st->owner == OWNER_NONE || st->owner == v->owner) && !(st->airport.flags & AIRPORT_CLOSED_block)) {
/* {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
if (CanVehicleUseStation(v, st) && (st->owner == OWNER_NONE || st->owner == v->owner) && !st->airport.blocks.Test(AirportBlock::AirportClosed)) {
/* {32,FLYING,AirportBlock::Nothing,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
* if it is an airplane, look for LANDING, for helicopter HELILANDING
* it is possible to choose from multiple landing runways, so loop until a free one is found */
uint8_t landingtype = (v->subtype == AIR_HELICOPTER) ? HELILANDING : LANDING;
@ -1683,7 +1683,7 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
* if there are multiple runways, plane won't know which one it took (because
* they all have heading LANDING). And also occupy that block! */
v->pos = current->next_position;
SETBITS(st->airport.flags, apc->layout[v->pos].block);
st->airport.blocks.Set(apc->layout[v->pos].blocks);
return;
}
v->cur_speed = tcur_speed;
@ -1784,10 +1784,10 @@ static AircraftStateHandler * const _aircraft_state_handlers[] = {
static void AirportClearBlock(const Aircraft *v, const AirportFTAClass *apc)
{
/* we have left the previous block, and entered the new one. Free the previous block */
if (apc->layout[v->previous_pos].block != apc->layout[v->pos].block) {
if (apc->layout[v->previous_pos].blocks != apc->layout[v->pos].blocks) {
Station *st = Station::Get(v->targetairport);
CLRBITS(st->airport.flags, apc->layout[v->previous_pos].block);
st->airport.blocks.Reset(apc->layout[v->previous_pos].blocks);
}
}
@ -1857,16 +1857,16 @@ static bool AirportHasBlock(Aircraft *v, const AirportFTA *current_pos, const Ai
const AirportFTA *next = &apc->layout[current_pos->next_position];
/* same block, then of course we can move */
if (apc->layout[current_pos->position].block != next->block) {
if (apc->layout[current_pos->position].blocks != next->blocks) {
const Station *st = Station::Get(v->targetairport);
uint64_t airport_flags = next->block;
AirportBlocks blocks = next->blocks;
/* check additional possible extra blocks */
if (current_pos != reference && current_pos->block != NOTHING_block) {
airport_flags |= current_pos->block;
if (current_pos != reference && current_pos->blocks != AirportBlock::Nothing) {
blocks.Set(current_pos->blocks);
}
if (st->airport.flags & airport_flags) {
if (st->airport.blocks.Any(blocks)) {
v->cur_speed = 0;
v->subspeed = 0;
return true;
@ -1888,15 +1888,15 @@ static bool AirportSetBlocks(Aircraft *v, const AirportFTA *current_pos, const A
const AirportFTA *reference = &apc->layout[v->pos];
/* if the next position is in another block, check it and wait until it is free */
if ((apc->layout[current_pos->position].block & next->block) != next->block) {
uint64_t airport_flags = next->block;
if (!apc->layout[current_pos->position].blocks.All(next->blocks)) {
AirportBlocks blocks = next->blocks;
/* search for all all elements in the list with the same state, and blocks != N
* this means more blocks should be checked/set */
const AirportFTA *current = current_pos;
if (current == reference) current = current->next.get();
while (current != nullptr) {
if (current->heading == current_pos->heading && current->block != 0) {
airport_flags |= current->block;
if (current->heading == current_pos->heading && current->blocks.Any()) {
blocks.Set(current->blocks);
break;
}
current = current->next.get();
@ -1904,17 +1904,17 @@ static bool AirportSetBlocks(Aircraft *v, const AirportFTA *current_pos, const A
/* if the block to be checked is in the next position, then exclude that from
* checking, because it has been set by the airplane before */
if (current_pos->block == next->block) airport_flags ^= next->block;
if (current_pos->blocks == next->blocks) blocks.Flip(next->blocks);
Station *st = Station::Get(v->targetairport);
if (st->airport.flags & airport_flags) {
if (st->airport.blocks.Any(blocks)) {
v->cur_speed = 0;
v->subspeed = 0;
return false;
}
if (next->block != NOTHING_block) {
SETBITS(st->airport.flags, airport_flags); // occupy next block
if (next->blocks != AirportBlock::Nothing) {
st->airport.blocks.Set(blocks); // occupy next block
}
}
return true;
@ -1926,22 +1926,22 @@ static bool AirportSetBlocks(Aircraft *v, const AirportFTA *current_pos, const A
*/
struct MovementTerminalMapping {
AirportMovementStates state; ///< Aircraft movement state when going to this terminal.
uint64_t airport_flag; ///< Bitmask in the airport flags that need to be free for this terminal.
AirportBlock blocks; ///< Bitmask in the airport flags that need to be free for this terminal.
};
/** A list of all valid terminals and their associated blocks. */
static const MovementTerminalMapping _airport_terminal_mapping[] = {
{TERM1, TERM1_block},
{TERM2, TERM2_block},
{TERM3, TERM3_block},
{TERM4, TERM4_block},
{TERM5, TERM5_block},
{TERM6, TERM6_block},
{TERM7, TERM7_block},
{TERM8, TERM8_block},
{HELIPAD1, HELIPAD1_block},
{HELIPAD2, HELIPAD2_block},
{HELIPAD3, HELIPAD3_block},
{TERM1, AirportBlock::Term1},
{TERM2, AirportBlock::Term2},
{TERM3, AirportBlock::Term3},
{TERM4, AirportBlock::Term4},
{TERM5, AirportBlock::Term5},
{TERM6, AirportBlock::Term6},
{TERM7, AirportBlock::Term7},
{TERM8, AirportBlock::Term8},
{HELIPAD1, AirportBlock::Helipad1},
{HELIPAD2, AirportBlock::Helipad2},
{HELIPAD3, AirportBlock::Helipad3},
};
/**
@ -1956,10 +1956,10 @@ static bool FreeTerminal(Aircraft *v, uint8_t i, uint8_t last_terminal)
assert(last_terminal <= lengthof(_airport_terminal_mapping));
Station *st = Station::Get(v->targetairport);
for (; i < last_terminal; i++) {
if ((st->airport.flags & _airport_terminal_mapping[i].airport_flag) == 0) {
if (!st->airport.blocks.Any(_airport_terminal_mapping[i].blocks)) {
/* TERMINAL# HELIPAD# */
v->state = _airport_terminal_mapping[i].state; // start moving to that terminal/helipad
SETBITS(st->airport.flags, _airport_terminal_mapping[i].airport_flag); // occupy terminal/helipad
st->airport.blocks.Set(_airport_terminal_mapping[i].blocks); // occupy terminal/helipad
return true;
}
}
@ -1989,11 +1989,11 @@ static uint GetNumTerminals(const AirportFTAClass *apc)
static bool AirportFindFreeTerminal(Aircraft *v, const AirportFTAClass *apc)
{
/* example of more terminalgroups
* {0,HANGAR,NOTHING_block,1}, {0,TERMGROUP,TERM_GROUP1_block,0}, {0,TERMGROUP,TERM_GROUP2_ENTER_block,1}, {0,0,N,1},
* {0,HANGAR,AirportBlock::Nothing,1}, {0,TERMGROUP,AirportBlock::TermGroup1,0}, {0,TERMGROUP,TERM_GROUP2_ENTER_block,1}, {0,0,N,1},
* Heading TERMGROUP denotes a group. We see 2 groups here:
* 1. group 0 -- TERM_GROUP1_block (check block)
* 1. group 0 -- AirportBlock::TermGroup1 (check block)
* 2. group 1 -- TERM_GROUP2_ENTER_block (check block)
* First in line is checked first, group 0. If the block (TERM_GROUP1_block) is free, it
* First in line is checked first, group 0. If the block (AirportBlock::TermGroup1) is free, it
* looks at the corresponding terminals of that group. If no free ones are found, other
* possible groups are checked (in this case group 1, since that is after group 0). If that
* fails, then attempt fails and plane waits
@ -2004,7 +2004,7 @@ static bool AirportFindFreeTerminal(Aircraft *v, const AirportFTAClass *apc)
while (temp != nullptr) {
if (temp->heading == TERMGROUP) {
if (!(st->airport.flags & temp->block)) {
if (!st->airport.blocks.Any(temp->blocks)) {
/* read which group do we want to go to?
* (the first free group) */
uint target_group = temp->next_position + 1;

View File

@ -149,7 +149,7 @@ static uint16_t AirportGetNofElements(const AirportFTAbuildup *apFA)
return nofelements;
}
AirportFTA::AirportFTA(const AirportFTAbuildup &buildup) : block(buildup.block), position(buildup.position), next_position(buildup.next), heading(buildup.heading)
AirportFTA::AirportFTA(const AirportFTAbuildup &buildup) : blocks(buildup.blocks), position(buildup.position), next_position(buildup.next), heading(buildup.heading)
{
}

View File

@ -85,47 +85,49 @@ enum AirportMovementStates : uint8_t {
};
/** Movement Blocks on Airports blocks (eg_airport_flags). */
static const uint64_t
TERM1_block = 1ULL << 0, ///< Block belonging to terminal 1.
TERM2_block = 1ULL << 1, ///< Block belonging to terminal 2.
TERM3_block = 1ULL << 2, ///< Block belonging to terminal 3.
TERM4_block = 1ULL << 3, ///< Block belonging to terminal 4.
TERM5_block = 1ULL << 4, ///< Block belonging to terminal 5.
TERM6_block = 1ULL << 5, ///< Block belonging to terminal 6.
HELIPAD1_block = 1ULL << 6, ///< Block belonging to helipad 1.
HELIPAD2_block = 1ULL << 7, ///< Block belonging to helipad 2.
RUNWAY_IN_OUT_block = 1ULL << 8,
RUNWAY_IN_block = 1ULL << 8,
AIRPORT_BUSY_block = 1ULL << 8,
RUNWAY_OUT_block = 1ULL << 9,
TAXIWAY_BUSY_block = 1ULL << 10,
OUT_WAY_block = 1ULL << 11,
IN_WAY_block = 1ULL << 12,
AIRPORT_ENTRANCE_block = 1ULL << 13,
TERM_GROUP1_block = 1ULL << 14,
TERM_GROUP2_block = 1ULL << 15,
HANGAR2_AREA_block = 1ULL << 16,
TERM_GROUP2_ENTER1_block = 1ULL << 17,
TERM_GROUP2_ENTER2_block = 1ULL << 18,
TERM_GROUP2_EXIT1_block = 1ULL << 19,
TERM_GROUP2_EXIT2_block = 1ULL << 20,
PRE_HELIPAD_block = 1ULL << 21,
enum class AirportBlock : uint8_t {
Term1 = 0, ///< Block belonging to terminal 1.
Term2 = 1, ///< Block belonging to terminal 2.
Term3 = 2, ///< Block belonging to terminal 3.
Term4 = 3, ///< Block belonging to terminal 4.
Term5 = 4, ///< Block belonging to terminal 5.
Term6 = 5, ///< Block belonging to terminal 6.
Helipad1 = 6, ///< Block belonging to helipad 1.
Helipad2 = 7, ///< Block belonging to helipad 2.
RunwayInOut = 8,
RunwayIn = 8,
AirportBusy = 8,
RunwayOut = 9,
TaxiwayBusy = 10,
OutWay = 11,
InWay = 12,
AirportEntrance = 13,
TermGroup1 = 14,
TermGroup2 = 15,
Hangar2Area = 16,
TermGroup2Enter1 = 17,
TermGroup2Enter2 = 18,
TermGroup2Exit1 = 19,
TermGroup2Exit2 = 20,
PreHelipad = 21,
/* blocks for new airports */
TERM7_block = 1ULL << 22, ///< Block belonging to terminal 7.
TERM8_block = 1ULL << 23, ///< Block belonging to terminal 8.
HELIPAD3_block = 1ULL << 24, ///< Block belonging to helipad 3.
HANGAR1_AREA_block = 1ULL << 26,
OUT_WAY2_block = 1ULL << 27,
IN_WAY2_block = 1ULL << 28,
RUNWAY_IN2_block = 1ULL << 29,
RUNWAY_OUT2_block = 1ULL << 10, ///< @note re-uses #TAXIWAY_BUSY_block
HELIPAD_GROUP_block = 1ULL << 13, ///< @note re-uses #AIRPORT_ENTRANCE_block
OUT_WAY_block2 = 1ULL << 31,
Term7 = 22, ///< Block belonging to terminal 7.
Term8 = 23, ///< Block belonging to terminal 8.
Helipad3 = 24, ///< Block belonging to helipad 3.
Hangar1Area = 26,
OutWay2 = 27,
InWay2 = 28,
RunwayIn2 = 29,
RunwayOut2 = 10, ///< @note re-uses #AirportBlock::TaxiwayBusy
HelipadGroup = 13, ///< @note re-uses #AirportBlock::AirportEntrance
OutWay3 = 31,
/* end of new blocks */
NOTHING_block = 1ULL << 30,
AIRPORT_CLOSED_block = 1ULL << 63; ///< Dummy block for indicating a closed airport.
Nothing = 30,
AirportClosed = 63, ///< Dummy block for indicating a closed airport.
};
using AirportBlocks = EnumBitSet<AirportBlock, uint64_t>;
/** A single location on an airport where aircraft can move to. */
struct AirportMovingData {
@ -144,7 +146,7 @@ struct AirportFTA {
AirportFTA(const AirportFTAbuildup&);
std::unique_ptr<AirportFTA> next; ///< possible extra movement choices from this position
uint64_t block; ///< bitmap of blocks that could be reserved
AirportBlocks blocks; ///< bitmap of blocks that could be reserved
uint8_t position; ///< the position that an airplane is at
uint8_t next_position; ///< next position from this position
uint8_t heading; ///< heading (current orders), guiding an airplane to its target on an airport

View File

@ -264,7 +264,7 @@ static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
if (IsValidTile(v->tile) && IsAirportTile(v->tile)) {
Station *st = Station::GetByTile(v->tile);
CLRBITS(st->airport.flags, RUNWAY_IN_block);
st->airport.blocks.Reset(AirportBlock::RunwayIn);
AI::NewEvent(GetTileOwner(v->tile), new ScriptEventDisasterZeppelinerCleared(st->index));
}
@ -301,7 +301,7 @@ static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
}
if (IsValidTile(v->tile) && IsAirportTile(v->tile)) {
SETBITS(Station::GetByTile(v->tile)->airport.flags, RUNWAY_IN_block);
Station::GetByTile(v->tile)->airport.blocks.Set(AirportBlock::RunwayIn);
}
return true;

View File

@ -416,8 +416,8 @@ uint32_t Station::GetNewGRFVariable(const ResolverObject &object, uint8_t variab
case 0xF1: return (this->airport.tile != INVALID_TILE) ? this->airport.GetSpec()->ttd_airport_type : ATP_TTDP_LARGE;
case 0xF2: return (this->truck_stops != nullptr) ? this->truck_stops->status : 0;
case 0xF3: return (this->bus_stops != nullptr) ? this->bus_stops->status : 0;
case 0xF6: return this->airport.flags;
case 0xF7: return GB(this->airport.flags, 8, 8);
case 0xF6: return this->airport.blocks.base();
case 0xF7: return GB(this->airport.blocks.base(), 8, 8);
}
/* Handle cargo variables with parameter, 0x60 to 0x65 and 0x69 */

View File

@ -761,10 +761,10 @@ static const OldChunks station_chunk[] = {
OCL_SVAR( OC_UINT8, Station, owner ),
OCL_SVAR( OC_UINT8, Station, facilities ),
OCL_SVAR( OC_TTD | OC_UINT8, Station, airport.type ),
OCL_SVAR( OC_TTO | OC_FILE_U16 | OC_VAR_U64, Station, airport.flags ),
OCL_SVAR( OC_TTO | OC_FILE_U16 | OC_VAR_U64, Station, airport.blocks ),
OCL_NULL( 3 ), ///< bus/truck status, blocked months, no longer in use
OCL_CNULL( OC_TTD, 1 ), ///< unknown
OCL_SVAR( OC_TTD | OC_FILE_U16 | OC_VAR_U64, Station, airport.flags ),
OCL_SVAR( OC_TTD | OC_FILE_U16 | OC_VAR_U64, Station, airport.blocks ),
OCL_CNULL( OC_TTD, 2 ), ///< last_vehicle. now last_vehicle_type
OCL_CNULL( OC_TTD, 4 ), ///< junk at end of chunk
@ -788,9 +788,9 @@ static bool LoadOldStation(LoadgameState *ls, int num)
st->string_id = _old_string_id + 0x2800; // custom name
}
if (HasBit(st->airport.flags, 8)) {
if (st->airport.blocks.Test(AirportBlock{8})) {
st->airport.type = 1; // large airport
} else if (HasBit(st->airport.flags, 6)) {
} else if (st->airport.blocks.Test(AirportBlock{6})) {
st->airport.type = 3; // oil rig
} else {
st->airport.type = 0; // small airport

View File

@ -477,9 +477,9 @@ static const SaveLoad _old_station_desc[] = {
SLE_VAR(Station, owner, SLE_UINT8),
SLE_VAR(Station, facilities, SLE_UINT8),
SLE_VAR(Station, airport.type, SLE_UINT8),
SLE_CONDVAR(Station, airport.flags, SLE_VAR_U64 | SLE_FILE_U16, SL_MIN_VERSION, SLV_3),
SLE_CONDVAR(Station, airport.flags, SLE_VAR_U64 | SLE_FILE_U32, SLV_3, SLV_46),
SLE_CONDVAR(Station, airport.flags, SLE_UINT64, SLV_46, SL_MAX_VERSION),
SLE_CONDVARNAME(Station, airport.blocks, "airport.flags", SLE_VAR_U64 | SLE_FILE_U16, SL_MIN_VERSION, SLV_3),
SLE_CONDVARNAME(Station, airport.blocks, "airport.flags", SLE_VAR_U64 | SLE_FILE_U32, SLV_3, SLV_46),
SLE_CONDVARNAME(Station, airport.blocks, "airport.flags", SLE_UINT64, SLV_46, SL_MAX_VERSION),
SLE_CONDVAR(Station, last_vehicle_type, SLE_UINT8, SLV_26, SL_MAX_VERSION),
@ -608,7 +608,7 @@ public:
SLE_CONDVAR(Station, airport.h, SLE_FILE_U8 | SLE_VAR_U16, SLV_140, SL_MAX_VERSION),
SLE_VAR(Station, airport.type, SLE_UINT8),
SLE_CONDVAR(Station, airport.layout, SLE_UINT8, SLV_145, SL_MAX_VERSION),
SLE_VAR(Station, airport.flags, SLE_UINT64),
SLE_VARNAME(Station, airport.blocks, "airport.flags", SLE_UINT64),
SLE_CONDVAR(Station, airport.rotation, SLE_UINT8, SLV_145, SL_MAX_VERSION),
SLEG_CONDARR("storage", _old_st_persistent_storage.storage, SLE_UINT32, 16, SLV_145, SLV_161),
SLE_CONDREF(Station, airport.psa, REF_STORAGE, SLV_161, SL_MAX_VERSION),

View File

@ -166,7 +166,7 @@ void UpdateOldAircraft()
{
/* set airport_flags to 0 for all airports just to be sure */
for (Station *st : Station::Iterate()) {
st->airport.flags = 0; // reset airport
st->airport.blocks = {}; // reset airport
}
for (Aircraft *a : Aircraft::Iterate()) {

View File

@ -239,7 +239,7 @@ template <bool Tfrom, bool Tvia>
EnforcePrecondition(false, IsValidStation(station_id));
EnforcePrecondition(false, HasStationType(station_id, STATION_AIRPORT));
return (::Station::Get(station_id)->airport.flags & AIRPORT_CLOSED_block) != 0;
return ::Station::Get(station_id)->airport.blocks.Test(AirportBlock::AirportClosed);
}
/* static */ bool ScriptStation::OpenCloseAirport(StationID station_id)

View File

@ -347,7 +347,7 @@ private:
struct Airport : public TileArea {
Airport() : TileArea(INVALID_TILE, 0, 0) {}
uint64_t flags; ///< stores which blocks on the airport are taken. was 16 bit earlier on, then 32
AirportBlocks blocks; ///< stores which blocks on the airport are taken. was 16 bit earlier on, then 32
uint8_t type; ///< Type of this airport, @see AirportTypes
uint8_t layout; ///< Airport layout number.
Direction rotation; ///< How this airport is rotated.

View File

@ -2609,7 +2609,7 @@ CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, uint8_t airport
st->AddFacility(StationFacility::Airport, tile);
st->airport.type = airport_type;
st->airport.layout = layout;
st->airport.flags = 0;
st->airport.blocks = {};
st->airport.rotation = rotation;
st->rect.BeforeAddRect(tile, w, h, StationRect::ADD_TRY);
@ -2741,7 +2741,7 @@ CommandCost CmdOpenCloseAirport(DoCommandFlag flags, StationID station_id)
if (ret.Failed()) return ret;
if (flags & DC_EXEC) {
st->airport.flags ^= AIRPORT_CLOSED_block;
st->airport.blocks.Flip(AirportBlock::AirportClosed);
SetWindowWidgetDirty(WC_STATION_VIEW, st->index, WID_SV_CLOSE_AIRPORT);
}
return CommandCost();

View File

@ -1468,7 +1468,7 @@ struct StationViewWindow : public Window {
this->SetWidgetDisabledState(WID_SV_SHIPS, !st->facilities.Test(StationFacility::Dock));
this->SetWidgetDisabledState(WID_SV_PLANES, !st->facilities.Test(StationFacility::Airport));
this->SetWidgetDisabledState(WID_SV_CLOSE_AIRPORT, !st->facilities.Test(StationFacility::Airport) || st->owner != _local_company || st->owner == OWNER_NONE); // Also consider SE, where _local_company == OWNER_NONE
this->SetWidgetLoweredState(WID_SV_CLOSE_AIRPORT, st->facilities.Test(StationFacility::Airport) && (st->airport.flags & AIRPORT_CLOSED_block) != 0);
this->SetWidgetLoweredState(WID_SV_CLOSE_AIRPORT, st->facilities.Test(StationFacility::Airport) && st->airport.blocks.Test(AirportBlock::AirportClosed));
extern const Station *_viewport_highlight_station;
this->SetWidgetDisabledState(WID_SV_CATCHMENT, st->facilities == StationFacilities{});

View File

@ -10,6 +10,8 @@
#ifndef AIRPORT_MOVEMENT_H
#define AIRPORT_MOVEMENT_H
#include "../airport.h"
#include "../newgrf_airport.h"
/**
* State machine input struct (from external file, etc.)
@ -18,7 +20,7 @@
struct AirportFTAbuildup {
uint8_t position; ///< The position that an airplane is at.
uint8_t heading; ///< The current orders (eg. TAKEOFF, HANGAR, ENDLANDING, etc.).
uint64_t block; ///< The block this position is on on the airport (st->airport.flags).
AirportBlocks blocks; ///< The block this position is on on the airport (st->airport.flags).
uint8_t next; ///< Next position from this position.
};
@ -409,11 +411,11 @@ static const AirportMovingData _airport_moving_data_oilrig[9] = {
/////**********Movement Machine on Airports*********************///////
static const uint8_t _airport_entries_dummy[] = {0, 1, 2, 3};
static const AirportFTAbuildup _airport_fta_dummy[] = {
{ 0, TO_ALL, 0, 3},
{ 1, TO_ALL, 0, 0},
{ 2, TO_ALL, 0, 1},
{ 3, TO_ALL, 0, 2},
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 0, TO_ALL, {}, 3},
{ 1, TO_ALL, {}, 0},
{ 2, TO_ALL, {}, 1},
{ 3, TO_ALL, {}, 2},
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
/* First element of terminals array tells us how many depots there are (to know size of array)
@ -422,229 +424,229 @@ static const HangarTileTable _airport_depots_country[] = { {{3, 0}, DIR_SE, 0} }
static const uint8_t _airport_terminal_country[] = {1, 2};
static const uint8_t _airport_entries_country[] = {16, 15, 18, 17};
static const AirportFTAbuildup _airport_fta_country[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, TERMGROUP, AIRPORT_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TERM1, TERM1_block, 2 }, { 1, TERM2, 0, 4 }, { 1, HELITAKEOFF, 0, 19 }, { 1, TO_ALL, 0, 6 },
{ 2, TERM1, TERM1_block, 1 },
{ 3, TERM2, TERM2_block, 5 },
{ 4, TERMGROUP, AIRPORT_BUSY_block, 0 }, { 4, TERM2, 0, 5 }, { 4, HANGAR, 0, 1 }, { 4, TAKEOFF, 0, 6 }, { 4, HELITAKEOFF, 0, 1 },
{ 5, TERMGROUP, AIRPORT_BUSY_block, 0 }, { 5, TERM2, TERM2_block, 3 }, { 5, TO_ALL, 0, 4 },
{ 6, 0, AIRPORT_BUSY_block, 7 },
{ 0, HANGAR, AirportBlock::Nothing, 1 },
{ 1, TERMGROUP, AirportBlock::AirportBusy, 0 }, { 1, HANGAR, {}, 0 }, { 1, TERM1, AirportBlock::Term1, 2 }, { 1, TERM2, {}, 4 }, { 1, HELITAKEOFF, {}, 19 }, { 1, TO_ALL, {}, 6 },
{ 2, TERM1, AirportBlock::Term1, 1 },
{ 3, TERM2, AirportBlock::Term2, 5 },
{ 4, TERMGROUP, AirportBlock::AirportBusy, 0 }, { 4, TERM2, {}, 5 }, { 4, HANGAR, {}, 1 }, { 4, TAKEOFF, {}, 6 }, { 4, HELITAKEOFF, {}, 1 },
{ 5, TERMGROUP, AirportBlock::AirportBusy, 0 }, { 5, TERM2, AirportBlock::Term2, 3 }, { 5, TO_ALL, {}, 4 },
{ 6, TO_ALL, AirportBlock::AirportBusy, 7 },
/* takeoff */
{ 7, TAKEOFF, AIRPORT_BUSY_block, 8 },
{ 8, STARTTAKEOFF, NOTHING_block, 9 },
{ 9, ENDTAKEOFF, NOTHING_block, 0 },
{ 7, TAKEOFF, AirportBlock::AirportBusy, 8 },
{ 8, STARTTAKEOFF, AirportBlock::Nothing, 9 },
{ 9, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* landing */
{ 10, FLYING, NOTHING_block, 15 }, { 10, LANDING, 0, 11 }, { 10, HELILANDING, 0, 20 },
{ 11, LANDING, AIRPORT_BUSY_block, 12 },
{ 12, TO_ALL, AIRPORT_BUSY_block, 13 },
{ 13, ENDLANDING, AIRPORT_BUSY_block, 14 }, { 13, TERM2, 0, 5 }, { 13, TO_ALL, 0, 14 },
{ 14, TO_ALL, AIRPORT_BUSY_block, 1 },
{ 10, FLYING, AirportBlock::Nothing, 15 }, { 10, LANDING, {}, 11 }, { 10, HELILANDING, {}, 20 },
{ 11, LANDING, AirportBlock::AirportBusy, 12 },
{ 12, TO_ALL, AirportBlock::AirportBusy, 13 },
{ 13, ENDLANDING, AirportBlock::AirportBusy, 14 }, { 13, TERM2, {}, 5 }, { 13, TO_ALL, {}, 14 },
{ 14, TO_ALL, AirportBlock::AirportBusy, 1 },
/* In air */
{ 15, TO_ALL, NOTHING_block, 16 },
{ 16, TO_ALL, NOTHING_block, 17 },
{ 17, TO_ALL, NOTHING_block, 18 },
{ 18, TO_ALL, NOTHING_block, 10 },
{ 19, HELITAKEOFF, NOTHING_block, 0 },
{ 20, HELILANDING, AIRPORT_BUSY_block, 21 },
{ 21, HELIENDLANDING, AIRPORT_BUSY_block, 1 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 15, TO_ALL, AirportBlock::Nothing, 16 },
{ 16, TO_ALL, AirportBlock::Nothing, 17 },
{ 17, TO_ALL, AirportBlock::Nothing, 18 },
{ 18, TO_ALL, AirportBlock::Nothing, 10 },
{ 19, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 20, HELILANDING, AirportBlock::AirportBusy, 21 },
{ 21, HELIENDLANDING, AirportBlock::AirportBusy, 1 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
static const HangarTileTable _airport_depots_commuter[] = { {{4, 0}, DIR_SE, 0} };
static const uint8_t _airport_terminal_commuter[] = { 1, 3 };
static const uint8_t _airport_entries_commuter[] = {22, 21, 24, 23};
static const AirportFTAbuildup _airport_fta_commuter[] = {
{ 0, HANGAR, NOTHING_block, 1 }, { 0, HELITAKEOFF, TAXIWAY_BUSY_block, 1 }, { 0, TO_ALL, 0, 1 },
{ 1, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TAKEOFF, 0, 11 }, { 1, TERM1, TAXIWAY_BUSY_block, 10 }, { 1, TERM2, TAXIWAY_BUSY_block, 10 }, { 1, TERM3, TAXIWAY_BUSY_block, 10 }, { 1, HELIPAD1, TAXIWAY_BUSY_block, 10 }, { 1, HELIPAD2, TAXIWAY_BUSY_block, 10 }, { 1, HELITAKEOFF, TAXIWAY_BUSY_block, 37 }, { 1, TO_ALL, 0, 0 },
{ 2, TERMGROUP, AIRPORT_ENTRANCE_block, 2 }, { 2, HANGAR, 0, 8 }, { 2, TERM1, 0, 8 }, { 2, TERM2, 0, 8 }, { 2, TERM3, 0, 8 }, { 2, HELIPAD1, 0, 8 }, { 2, HELIPAD2, 0, 8 }, { 2, HELITAKEOFF, 0, 8 }, { 2, TO_ALL, 0, 2 },
{ 3, TERM1, TERM1_block, 8 }, { 3, HANGAR, 0, 8 }, { 3, TAKEOFF, 0, 8 }, { 3, TO_ALL, 0, 3 },
{ 4, TERM2, TERM2_block, 9 }, { 4, HANGAR, 0, 9 }, { 4, TAKEOFF, 0, 9 }, { 4, TO_ALL, 0, 4 },
{ 5, TERM3, TERM3_block, 10 }, { 5, HANGAR, 0, 10 }, { 5, TAKEOFF, 0, 10 }, { 5, TO_ALL, 0, 5 },
{ 6, HELIPAD1, HELIPAD1_block, 6 }, { 6, HANGAR, TAXIWAY_BUSY_block, 9 }, { 6, HELITAKEOFF, 0, 35 },
{ 7, HELIPAD2, HELIPAD2_block, 7 }, { 7, HANGAR, TAXIWAY_BUSY_block, 10 }, { 7, HELITAKEOFF, 0, 36 },
{ 8, TERMGROUP, TAXIWAY_BUSY_block, 8 }, { 8, TAKEOFF, TAXIWAY_BUSY_block, 9 }, { 8, HANGAR, TAXIWAY_BUSY_block, 9 }, { 8, TERM1, TERM1_block, 3 }, { 8, TO_ALL, TAXIWAY_BUSY_block, 9 },
{ 9, TERMGROUP, TAXIWAY_BUSY_block, 9 }, { 9, TAKEOFF, TAXIWAY_BUSY_block, 10 }, { 9, HANGAR, TAXIWAY_BUSY_block, 10 }, { 9, TERM2, TERM2_block, 4 }, { 9, HELIPAD1, HELIPAD1_block, 6 }, { 9, HELITAKEOFF, HELIPAD1_block, 6 }, { 9, TERM1, TAXIWAY_BUSY_block, 8 }, { 9, TO_ALL, TAXIWAY_BUSY_block, 10 },
{ 10, TERMGROUP, TAXIWAY_BUSY_block, 10 }, { 10, TERM3, TERM3_block, 5 }, { 10, HELIPAD1, 0, 9 }, { 10, HELIPAD2, HELIPAD2_block, 7 }, { 10, HELITAKEOFF, 0, 1 }, { 10, TAKEOFF, TAXIWAY_BUSY_block, 1 }, { 10, HANGAR, TAXIWAY_BUSY_block, 1 }, { 10, TO_ALL, TAXIWAY_BUSY_block, 9 },
{ 11, TO_ALL, OUT_WAY_block, 12 },
{ 0, HANGAR, AirportBlock::Nothing, 1 }, { 0, HELITAKEOFF, AirportBlock::TaxiwayBusy, 1 }, { 0, TO_ALL, {}, 1 },
{ 1, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 1, HANGAR, {}, 0 }, { 1, TAKEOFF, {}, 11 }, { 1, TERM1, AirportBlock::TaxiwayBusy, 10 }, { 1, TERM2, AirportBlock::TaxiwayBusy, 10 }, { 1, TERM3, AirportBlock::TaxiwayBusy, 10 }, { 1, HELIPAD1, AirportBlock::TaxiwayBusy, 10 }, { 1, HELIPAD2, AirportBlock::TaxiwayBusy, 10 }, { 1, HELITAKEOFF, AirportBlock::TaxiwayBusy, 37 }, { 1, TO_ALL, {}, 0 },
{ 2, TERMGROUP, AirportBlock::AirportEntrance, 2 }, { 2, HANGAR, {}, 8 }, { 2, TERM1, {}, 8 }, { 2, TERM2, {}, 8 }, { 2, TERM3, {}, 8 }, { 2, HELIPAD1, {}, 8 }, { 2, HELIPAD2, {}, 8 }, { 2, HELITAKEOFF, {}, 8 }, { 2, TO_ALL, {}, 2 },
{ 3, TERM1, AirportBlock::Term1, 8 }, { 3, HANGAR, {}, 8 }, { 3, TAKEOFF, {}, 8 }, { 3, TO_ALL, {}, 3 },
{ 4, TERM2, AirportBlock::Term2, 9 }, { 4, HANGAR, {}, 9 }, { 4, TAKEOFF, {}, 9 }, { 4, TO_ALL, {}, 4 },
{ 5, TERM3, AirportBlock::Term3, 10 }, { 5, HANGAR, {}, 10 }, { 5, TAKEOFF, {}, 10 }, { 5, TO_ALL, {}, 5 },
{ 6, HELIPAD1, AirportBlock::Helipad1, 6 }, { 6, HANGAR, AirportBlock::TaxiwayBusy, 9 }, { 6, HELITAKEOFF, {}, 35 },
{ 7, HELIPAD2, AirportBlock::Helipad2, 7 }, { 7, HANGAR, AirportBlock::TaxiwayBusy, 10 }, { 7, HELITAKEOFF, {}, 36 },
{ 8, TERMGROUP, AirportBlock::TaxiwayBusy, 8 }, { 8, TAKEOFF, AirportBlock::TaxiwayBusy, 9 }, { 8, HANGAR, AirportBlock::TaxiwayBusy, 9 }, { 8, TERM1, AirportBlock::Term1, 3 }, { 8, TO_ALL, AirportBlock::TaxiwayBusy, 9 },
{ 9, TERMGROUP, AirportBlock::TaxiwayBusy, 9 }, { 9, TAKEOFF, AirportBlock::TaxiwayBusy, 10 }, { 9, HANGAR, AirportBlock::TaxiwayBusy, 10 }, { 9, TERM2, AirportBlock::Term2, 4 }, { 9, HELIPAD1, AirportBlock::Helipad1, 6 }, { 9, HELITAKEOFF, AirportBlock::Helipad1, 6 }, { 9, TERM1, AirportBlock::TaxiwayBusy, 8 }, { 9, TO_ALL, AirportBlock::TaxiwayBusy, 10 },
{ 10, TERMGROUP, AirportBlock::TaxiwayBusy, 10 }, { 10, TERM3, AirportBlock::Term3, 5 }, { 10, HELIPAD1, {}, 9 }, { 10, HELIPAD2, AirportBlock::Helipad2, 7 }, { 10, HELITAKEOFF, {}, 1 }, { 10, TAKEOFF, AirportBlock::TaxiwayBusy, 1 }, { 10, HANGAR, AirportBlock::TaxiwayBusy, 1 }, { 10, TO_ALL, AirportBlock::TaxiwayBusy, 9 },
{ 11, TO_ALL, AirportBlock::OutWay, 12 },
/* takeoff */
{ 12, TAKEOFF, RUNWAY_IN_OUT_block, 13 },
{ 13, TO_ALL, RUNWAY_IN_OUT_block, 14 },
{ 14, STARTTAKEOFF, RUNWAY_IN_OUT_block, 15 },
{ 15, ENDTAKEOFF, NOTHING_block, 0 },
{ 12, TAKEOFF, AirportBlock::RunwayInOut, 13 },
{ 13, TO_ALL, AirportBlock::RunwayInOut, 14 },
{ 14, STARTTAKEOFF, AirportBlock::RunwayInOut, 15 },
{ 15, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* landing */
{ 16, FLYING, NOTHING_block, 21 }, { 16, LANDING, IN_WAY_block, 17 }, { 16, HELILANDING, 0, 25 },
{ 17, LANDING, RUNWAY_IN_OUT_block, 18 },
{ 18, TO_ALL, RUNWAY_IN_OUT_block, 19 },
{ 19, TO_ALL, RUNWAY_IN_OUT_block, 20 },
{ 20, ENDLANDING, IN_WAY_block, 2 },
{ 16, FLYING, AirportBlock::Nothing, 21 }, { 16, LANDING, AirportBlock::InWay, 17 }, { 16, HELILANDING, {}, 25 },
{ 17, LANDING, AirportBlock::RunwayInOut, 18 },
{ 18, TO_ALL, AirportBlock::RunwayInOut, 19 },
{ 19, TO_ALL, AirportBlock::RunwayInOut, 20 },
{ 20, ENDLANDING, AirportBlock::InWay, 2 },
/* In Air */
{ 21, TO_ALL, NOTHING_block, 22 },
{ 22, TO_ALL, NOTHING_block, 23 },
{ 23, TO_ALL, NOTHING_block, 24 },
{ 24, TO_ALL, NOTHING_block, 16 },
{ 21, TO_ALL, AirportBlock::Nothing, 22 },
{ 22, TO_ALL, AirportBlock::Nothing, 23 },
{ 23, TO_ALL, AirportBlock::Nothing, 24 },
{ 24, TO_ALL, AirportBlock::Nothing, 16 },
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 25, HELILANDING, PRE_HELIPAD_block, 26 },
{ 26, HELIENDLANDING, PRE_HELIPAD_block, 26 }, { 26, HELIPAD1, 0, 27 }, { 26, HELIPAD2, 0, 28 }, { 26, HANGAR, 0, 33 },
{ 27, TO_ALL, NOTHING_block, 29 }, // helipad1 approach
{ 28, TO_ALL, NOTHING_block, 30 },
{ 25, HELILANDING, AirportBlock::PreHelipad, 26 },
{ 26, HELIENDLANDING, AirportBlock::PreHelipad, 26 }, { 26, HELIPAD1, {}, 27 }, { 26, HELIPAD2, {}, 28 }, { 26, HANGAR, {}, 33 },
{ 27, TO_ALL, AirportBlock::Nothing, 29 }, // helipad1 approach
{ 28, TO_ALL, AirportBlock::Nothing, 30 },
/* landing */
{ 29, TERMGROUP, NOTHING_block, 0 }, { 29, HELIPAD1, HELIPAD1_block, 6 },
{ 30, TERMGROUP, NOTHING_block, 0 }, { 30, HELIPAD2, HELIPAD2_block, 7 },
{ 29, TERMGROUP, AirportBlock::Nothing, 0 }, { 29, HELIPAD1, AirportBlock::Helipad1, 6 },
{ 30, TERMGROUP, AirportBlock::Nothing, 0 }, { 30, HELIPAD2, AirportBlock::Helipad2, 7 },
/* Helicopter -- takeoff */
{ 31, HELITAKEOFF, NOTHING_block, 0 },
{ 32, HELITAKEOFF, NOTHING_block, 0 },
{ 33, TO_ALL, TAXIWAY_BUSY_block, 34 }, // need to go to hangar when waiting in air
{ 34, TO_ALL, TAXIWAY_BUSY_block, 1 },
{ 35, TO_ALL, HELIPAD1_block, 31 },
{ 36, TO_ALL, HELIPAD2_block, 32 },
{ 37, HELITAKEOFF, NOTHING_block, 0 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 31, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 32, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 33, TO_ALL, AirportBlock::TaxiwayBusy, 34 }, // need to go to hangar when waiting in air
{ 34, TO_ALL, AirportBlock::TaxiwayBusy, 1 },
{ 35, TO_ALL, AirportBlock::Helipad1, 31 },
{ 36, TO_ALL, AirportBlock::Helipad2, 32 },
{ 37, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
static const HangarTileTable _airport_depots_city[] = { {{5, 0}, DIR_SE, 0} };
static const uint8_t _airport_terminal_city[] = { 1, 3 };
static const uint8_t _airport_entries_city[] = {26, 29, 27, 28};
static const AirportFTAbuildup _airport_fta_city[] = {
{ 0, HANGAR, NOTHING_block, 1 }, { 0, TAKEOFF, OUT_WAY_block, 1 }, { 0, TO_ALL, 0, 1 },
{ 1, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TERM2, 0, 6 }, { 1, TERM3, 0, 6 }, { 1, TO_ALL, 0, 7 }, // for all else, go to 7
{ 2, TERM1, TERM1_block, 7 }, { 2, TAKEOFF, OUT_WAY_block, 7 }, { 2, TO_ALL, 0, 7 },
{ 3, TERM2, TERM2_block, 5 }, { 3, TAKEOFF, OUT_WAY_block, 6 }, { 3, TO_ALL, 0, 6 },
{ 4, TERM3, TERM3_block, 5 }, { 4, TAKEOFF, OUT_WAY_block, 5 }, { 4, TO_ALL, 0, 5 },
{ 5, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 5, TERM2, TERM2_block, 3 }, { 5, TERM3, TERM3_block, 4 }, { 5, TO_ALL, 0, 6 },
{ 6, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 6, TERM2, TERM2_block, 3 }, { 6, TERM3, 0, 5 }, { 6, HANGAR, 0, 1 }, { 6, TO_ALL, 0, 7 },
{ 7, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 7, TERM1, TERM1_block, 2 }, { 7, TAKEOFF, OUT_WAY_block, 8 }, { 7, HELITAKEOFF, 0, 22 }, { 7, HANGAR, 0, 1 }, { 7, TO_ALL, 0, 6 },
{ 8, 0, OUT_WAY_block, 9 },
{ 9, 0, RUNWAY_IN_OUT_block, 10 },
{ 0, HANGAR, AirportBlock::Nothing, 1 }, { 0, TAKEOFF, AirportBlock::OutWay, 1 }, { 0, TO_ALL, {}, 1 },
{ 1, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 1, HANGAR, {}, 0 }, { 1, TERM2, {}, 6 }, { 1, TERM3, {}, 6 }, { 1, TO_ALL, {}, 7 }, // for all else, go to 7
{ 2, TERM1, AirportBlock::Term1, 7 }, { 2, TAKEOFF, AirportBlock::OutWay, 7 }, { 2, TO_ALL, {}, 7 },
{ 3, TERM2, AirportBlock::Term2, 5 }, { 3, TAKEOFF, AirportBlock::OutWay, 6 }, { 3, TO_ALL, {}, 6 },
{ 4, TERM3, AirportBlock::Term3, 5 }, { 4, TAKEOFF, AirportBlock::OutWay, 5 }, { 4, TO_ALL, {}, 5 },
{ 5, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 5, TERM2, AirportBlock::Term2, 3 }, { 5, TERM3, AirportBlock::Term3, 4 }, { 5, TO_ALL, {}, 6 },
{ 6, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 6, TERM2, AirportBlock::Term2, 3 }, { 6, TERM3, {}, 5 }, { 6, HANGAR, {}, 1 }, { 6, TO_ALL, {}, 7 },
{ 7, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 7, TERM1, AirportBlock::Term1, 2 }, { 7, TAKEOFF, AirportBlock::OutWay, 8 }, { 7, HELITAKEOFF, {}, 22 }, { 7, HANGAR, {}, 1 }, { 7, TO_ALL, {}, 6 },
{ 8, TO_ALL, AirportBlock::OutWay, 9 },
{ 9, TO_ALL, AirportBlock::RunwayInOut, 10 },
/* takeoff */
{ 10, TAKEOFF, RUNWAY_IN_OUT_block, 11 },
{ 11, STARTTAKEOFF, NOTHING_block, 12 },
{ 12, ENDTAKEOFF, NOTHING_block, 0 },
{ 10, TAKEOFF, AirportBlock::RunwayInOut, 11 },
{ 11, STARTTAKEOFF, AirportBlock::Nothing, 12 },
{ 12, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* landing */
{ 13, FLYING, NOTHING_block, 18 }, { 13, LANDING, 0, 14 }, { 13, HELILANDING, 0, 23 },
{ 14, LANDING, RUNWAY_IN_OUT_block, 15 },
{ 15, TO_ALL, RUNWAY_IN_OUT_block, 17 },
{ 16, TO_ALL, RUNWAY_IN_OUT_block, 17 }, // not used, left for compatibility
{ 17, ENDLANDING, IN_WAY_block, 7 },
{ 13, FLYING, AirportBlock::Nothing, 18 }, { 13, LANDING, {}, 14 }, { 13, HELILANDING, {}, 23 },
{ 14, LANDING, AirportBlock::RunwayInOut, 15 },
{ 15, TO_ALL, AirportBlock::RunwayInOut, 17 },
{ 16, TO_ALL, AirportBlock::RunwayInOut, 17 }, // not used, left for compatibility
{ 17, ENDLANDING, AirportBlock::InWay, 7 },
/* In Air */
{ 18, TO_ALL, NOTHING_block, 25 },
{ 19, TO_ALL, NOTHING_block, 20 },
{ 20, TO_ALL, NOTHING_block, 21 },
{ 21, TO_ALL, NOTHING_block, 13 },
{ 18, TO_ALL, AirportBlock::Nothing, 25 },
{ 19, TO_ALL, AirportBlock::Nothing, 20 },
{ 20, TO_ALL, AirportBlock::Nothing, 21 },
{ 21, TO_ALL, AirportBlock::Nothing, 13 },
/* helicopter */
{ 22, HELITAKEOFF, NOTHING_block, 0 },
{ 23, HELILANDING, IN_WAY_block, 24 },
{ 24, HELIENDLANDING, IN_WAY_block, 17 },
{ 25, TO_ALL, NOTHING_block, 20},
{ 26, TO_ALL, NOTHING_block, 19},
{ 27, TO_ALL, NOTHING_block, 28},
{ 28, TO_ALL, NOTHING_block, 19},
{ 29, TO_ALL, NOTHING_block, 26},
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 22, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 23, HELILANDING, AirportBlock::InWay, 24 },
{ 24, HELIENDLANDING, AirportBlock::InWay, 17 },
{ 25, TO_ALL, AirportBlock::Nothing, 20},
{ 26, TO_ALL, AirportBlock::Nothing, 19},
{ 27, TO_ALL, AirportBlock::Nothing, 28},
{ 28, TO_ALL, AirportBlock::Nothing, 19},
{ 29, TO_ALL, AirportBlock::Nothing, 26},
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
static const HangarTileTable _airport_depots_metropolitan[] = { {{5, 0}, DIR_SE, 0} };
static const uint8_t _airport_terminal_metropolitan[] = { 1, 3 };
static const uint8_t _airport_entries_metropolitan[] = {20, 19, 22, 21};
static const AirportFTAbuildup _airport_fta_metropolitan[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TERM2, 0, 6 }, { 1, TERM3, 0, 6 }, { 1, TO_ALL, 0, 7 }, // for all else, go to 7
{ 2, TERM1, TERM1_block, 7 },
{ 3, TERM2, TERM2_block, 6 },
{ 4, TERM3, TERM3_block, 5 },
{ 5, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 5, TERM2, TERM2_block, 3 }, { 5, TERM3, TERM3_block, 4 }, { 5, TO_ALL, 0, 6 },
{ 6, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 6, TERM2, TERM2_block, 3 }, { 6, TERM3, 0, 5 }, { 6, HANGAR, 0, 1 }, { 6, TO_ALL, 0, 7 },
{ 7, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 7, TERM1, TERM1_block, 2 }, { 7, TAKEOFF, 0, 8 }, { 7, HELITAKEOFF, 0, 23 }, { 7, HANGAR, 0, 1 }, { 7, TO_ALL, 0, 6 },
{ 8, 0, OUT_WAY_block, 9 },
{ 9, 0, RUNWAY_OUT_block, 10 },
{ 0, HANGAR, AirportBlock::Nothing, 1 },
{ 1, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 1, HANGAR, {}, 0 }, { 1, TERM2, {}, 6 }, { 1, TERM3, {}, 6 }, { 1, TO_ALL, {}, 7 }, // for all else, go to 7
{ 2, TERM1, AirportBlock::Term1, 7 },
{ 3, TERM2, AirportBlock::Term2, 6 },
{ 4, TERM3, AirportBlock::Term3, 5 },
{ 5, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 5, TERM2, AirportBlock::Term2, 3 }, { 5, TERM3, AirportBlock::Term3, 4 }, { 5, TO_ALL, {}, 6 },
{ 6, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 6, TERM2, AirportBlock::Term2, 3 }, { 6, TERM3, {}, 5 }, { 6, HANGAR, {}, 1 }, { 6, TO_ALL, {}, 7 },
{ 7, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 7, TERM1, AirportBlock::Term1, 2 }, { 7, TAKEOFF, {}, 8 }, { 7, HELITAKEOFF, {}, 23 }, { 7, HANGAR, {}, 1 }, { 7, TO_ALL, {}, 6 },
{ 8, 0, AirportBlock::OutWay, 9 },
{ 9, 0, AirportBlock::RunwayOut, 10 },
/* takeoff */
{ 10, TAKEOFF, RUNWAY_OUT_block, 11 },
{ 11, STARTTAKEOFF, NOTHING_block, 12 },
{ 12, ENDTAKEOFF, NOTHING_block, 0 },
{ 10, TAKEOFF, AirportBlock::RunwayOut, 11 },
{ 11, STARTTAKEOFF, AirportBlock::Nothing, 12 },
{ 12, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* landing */
{ 13, FLYING, NOTHING_block, 19 }, { 13, LANDING, 0, 14 }, { 13, HELILANDING, 0, 25 },
{ 14, LANDING, RUNWAY_IN_block, 15 },
{ 15, TO_ALL, RUNWAY_IN_block, 16 },
{ 16, TERMGROUP, RUNWAY_IN_block, 0 }, { 16, ENDLANDING, IN_WAY_block, 17 },
{ 17, TERMGROUP, RUNWAY_OUT_block, 0 }, { 17, ENDLANDING, IN_WAY_block, 18 },
{ 18, ENDLANDING, IN_WAY_block, 27 },
{ 13, FLYING, AirportBlock::Nothing, 19 }, { 13, LANDING, {}, 14 }, { 13, HELILANDING, {}, 25 },
{ 14, LANDING, AirportBlock::RunwayIn, 15 },
{ 15, TO_ALL, AirportBlock::RunwayIn, 16 },
{ 16, TERMGROUP, AirportBlock::RunwayIn, 0 }, { 16, ENDLANDING, AirportBlock::InWay, 17 },
{ 17, TERMGROUP, AirportBlock::RunwayOut, 0 }, { 17, ENDLANDING, AirportBlock::InWay, 18 },
{ 18, ENDLANDING, AirportBlock::InWay, 27 },
/* In Air */
{ 19, TO_ALL, NOTHING_block, 20 },
{ 20, TO_ALL, NOTHING_block, 21 },
{ 21, TO_ALL, NOTHING_block, 22 },
{ 22, TO_ALL, NOTHING_block, 13 },
{ 19, TO_ALL, AirportBlock::Nothing, 20 },
{ 20, TO_ALL, AirportBlock::Nothing, 21 },
{ 21, TO_ALL, AirportBlock::Nothing, 22 },
{ 22, TO_ALL, AirportBlock::Nothing, 13 },
/* helicopter */
{ 23, TO_ALL, NOTHING_block, 24 },
{ 24, HELITAKEOFF, NOTHING_block, 0 },
{ 25, HELILANDING, IN_WAY_block, 26 },
{ 26, HELIENDLANDING, IN_WAY_block, 18 },
{ 27, TERMGROUP, TAXIWAY_BUSY_block, 27 }, { 27, TERM1, TERM1_block, 2 }, { 27, TO_ALL, 0, 7 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 23, TO_ALL, AirportBlock::Nothing, 24 },
{ 24, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 25, HELILANDING, AirportBlock::InWay, 26 },
{ 26, HELIENDLANDING, AirportBlock::InWay, 18 },
{ 27, TERMGROUP, AirportBlock::TaxiwayBusy, 27 }, { 27, TERM1, AirportBlock::Term1, 2 }, { 27, TO_ALL, {}, 7 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
static const HangarTileTable _airport_depots_international[] = { {{0, 3}, DIR_SE, 0}, {{6, 1}, DIR_SE, 1} };
static const uint8_t _airport_terminal_international[] = { 2, 3, 3 };
static const uint8_t _airport_entries_international[] = { 38, 37, 40, 39 };
static const AirportFTAbuildup _airport_fta_international[] = {
{ 0, HANGAR, NOTHING_block, 2 }, { 0, TERMGROUP, TERM_GROUP1_block, 0 }, { 0, TERMGROUP, TERM_GROUP2_ENTER1_block, 1 }, { 0, HELITAKEOFF, AIRPORT_ENTRANCE_block, 2 }, { 0, TO_ALL, 0, 2 },
{ 1, HANGAR, NOTHING_block, 3 }, { 1, TERMGROUP, HANGAR2_AREA_block, 1 }, { 1, HELITAKEOFF, HANGAR2_AREA_block, 3 }, { 1, TO_ALL, 0, 3 },
{ 2, TERMGROUP, AIRPORT_ENTRANCE_block, 0 }, { 2, HANGAR, 0, 0 }, { 2, TERM4, 0, 12 }, { 2, TERM5, 0, 12 }, { 2, TERM6, 0, 12 }, { 2, HELIPAD1, 0, 12 }, { 2, HELIPAD2, 0, 12 }, { 2, HELITAKEOFF, 0, 51 }, { 2, TO_ALL, 0, 23 },
{ 3, TERMGROUP, HANGAR2_AREA_block, 0 }, { 3, HANGAR, 0, 1 }, { 3, HELITAKEOFF, 0, 52 }, { 3, TO_ALL, 0, 18 },
{ 4, TERM1, TERM1_block, 23 }, { 4, HANGAR, AIRPORT_ENTRANCE_block, 23 }, { 4, TO_ALL, 0, 23 },
{ 5, TERM2, TERM2_block, 24 }, { 5, HANGAR, AIRPORT_ENTRANCE_block, 24 }, { 5, TO_ALL, 0, 24 },
{ 6, TERM3, TERM3_block, 25 }, { 6, HANGAR, AIRPORT_ENTRANCE_block, 25 }, { 6, TO_ALL, 0, 25 },
{ 7, TERM4, TERM4_block, 16 }, { 7, HANGAR, HANGAR2_AREA_block, 16 }, { 7, TO_ALL, 0, 16 },
{ 8, TERM5, TERM5_block, 17 }, { 8, HANGAR, HANGAR2_AREA_block, 17 }, { 8, TO_ALL, 0, 17 },
{ 9, TERM6, TERM6_block, 18 }, { 9, HANGAR, HANGAR2_AREA_block, 18 }, { 9, TO_ALL, 0, 18 },
{ 10, HELIPAD1, HELIPAD1_block, 10 }, { 10, HANGAR, HANGAR2_AREA_block, 16 }, { 10, HELITAKEOFF, 0, 47 },
{ 11, HELIPAD2, HELIPAD2_block, 11 }, { 11, HANGAR, HANGAR2_AREA_block, 17 }, { 11, HELITAKEOFF, 0, 48 },
{ 12, TO_ALL, TERM_GROUP2_ENTER1_block, 13 },
{ 13, TO_ALL, TERM_GROUP2_ENTER1_block, 14 },
{ 14, TO_ALL, TERM_GROUP2_ENTER2_block, 15 },
{ 15, TO_ALL, TERM_GROUP2_ENTER2_block, 16 },
{ 16, TERMGROUP, TERM_GROUP2_block, 0 }, { 16, TERM4, TERM4_block, 7 }, { 16, HELIPAD1, HELIPAD1_block, 10 }, { 16, HELITAKEOFF, HELIPAD1_block, 10 }, { 16, TO_ALL, 0, 17 },
{ 17, TERMGROUP, TERM_GROUP2_block, 0 }, { 17, TERM5, TERM5_block, 8 }, { 17, TERM4, 0, 16 }, { 17, HELIPAD1, 0, 16 }, { 17, HELIPAD2, HELIPAD2_block, 11 }, { 17, HELITAKEOFF, HELIPAD2_block, 11 }, { 17, TO_ALL, 0, 18 },
{ 18, TERMGROUP, TERM_GROUP2_block, 0 }, { 18, TERM6, TERM6_block, 9 }, { 18, TAKEOFF, 0, 19 }, { 18, HANGAR, HANGAR2_AREA_block, 3 }, { 18, TO_ALL, 0, 17 },
{ 19, TO_ALL, TERM_GROUP2_EXIT1_block, 20 },
{ 20, TO_ALL, TERM_GROUP2_EXIT1_block, 21 },
{ 21, TO_ALL, TERM_GROUP2_EXIT2_block, 22 },
{ 22, TO_ALL, TERM_GROUP2_EXIT2_block, 26 },
{ 23, TERMGROUP, TERM_GROUP1_block, 0 }, { 23, TERM1, TERM1_block, 4 }, { 23, HANGAR, AIRPORT_ENTRANCE_block, 2 }, { 23, TO_ALL, 0, 24 },
{ 24, TERMGROUP, TERM_GROUP1_block, 0 }, { 24, TERM2, TERM2_block, 5 }, { 24, TERM1, 0, 23 }, { 24, HANGAR, 0, 23 }, { 24, TO_ALL, 0, 25 },
{ 25, TERMGROUP, TERM_GROUP1_block, 0 }, { 25, TERM3, TERM3_block, 6 }, { 25, TAKEOFF, 0, 26 }, { 25, TO_ALL, 0, 24 },
{ 26, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 26, TAKEOFF, 0, 27 }, { 26, TO_ALL, 0, 25 },
{ 27, TO_ALL, OUT_WAY_block, 28 },
{ 0, HANGAR, AirportBlock::Nothing, 2 }, { 0, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 0, TERMGROUP, AirportBlock::TermGroup2Enter1, 1 }, { 0, HELITAKEOFF, AirportBlock::AirportEntrance, 2 }, { 0, TO_ALL, {}, 2 },
{ 1, HANGAR, AirportBlock::Nothing, 3 }, { 1, TERMGROUP, AirportBlock::Hangar2Area, 1 }, { 1, HELITAKEOFF, AirportBlock::Hangar2Area, 3 }, { 1, TO_ALL, {}, 3 },
{ 2, TERMGROUP, AirportBlock::AirportEntrance, 0 }, { 2, HANGAR, {}, 0 }, { 2, TERM4, {}, 12 }, { 2, TERM5, {}, 12 }, { 2, TERM6, {}, 12 }, { 2, HELIPAD1, {}, 12 }, { 2, HELIPAD2, {}, 12 }, { 2, HELITAKEOFF, {}, 51 }, { 2, TO_ALL, {}, 23 },
{ 3, TERMGROUP, AirportBlock::Hangar2Area, 0 }, { 3, HANGAR, {}, 1 }, { 3, HELITAKEOFF, {}, 52 }, { 3, TO_ALL, {}, 18 },
{ 4, TERM1, AirportBlock::Term1, 23 }, { 4, HANGAR, AirportBlock::AirportEntrance, 23 }, { 4, TO_ALL, {}, 23 },
{ 5, TERM2, AirportBlock::Term2, 24 }, { 5, HANGAR, AirportBlock::AirportEntrance, 24 }, { 5, TO_ALL, {}, 24 },
{ 6, TERM3, AirportBlock::Term3, 25 }, { 6, HANGAR, AirportBlock::AirportEntrance, 25 }, { 6, TO_ALL, {}, 25 },
{ 7, TERM4, AirportBlock::Term4, 16 }, { 7, HANGAR, AirportBlock::Hangar2Area, 16 }, { 7, TO_ALL, {}, 16 },
{ 8, TERM5, AirportBlock::Term5, 17 }, { 8, HANGAR, AirportBlock::Hangar2Area, 17 }, { 8, TO_ALL, {}, 17 },
{ 9, TERM6, AirportBlock::Term6, 18 }, { 9, HANGAR, AirportBlock::Hangar2Area, 18 }, { 9, TO_ALL, {}, 18 },
{ 10, HELIPAD1, AirportBlock::Helipad1, 10 }, { 10, HANGAR, AirportBlock::Hangar2Area, 16 }, { 10, HELITAKEOFF, {}, 47 },
{ 11, HELIPAD2, AirportBlock::Helipad2, 11 }, { 11, HANGAR, AirportBlock::Hangar2Area, 17 }, { 11, HELITAKEOFF, {}, 48 },
{ 12, TO_ALL, AirportBlock::TermGroup2Enter1, 13 },
{ 13, TO_ALL, AirportBlock::TermGroup2Enter1, 14 },
{ 14, TO_ALL, AirportBlock::TermGroup2Enter2, 15 },
{ 15, TO_ALL, AirportBlock::TermGroup2Enter2, 16 },
{ 16, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 16, TERM4, AirportBlock::Term4, 7 }, { 16, HELIPAD1, AirportBlock::Helipad1, 10 }, { 16, HELITAKEOFF, AirportBlock::Helipad1, 10 }, { 16, TO_ALL, {}, 17 },
{ 17, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 17, TERM5, AirportBlock::Term5, 8 }, { 17, TERM4, {}, 16 }, { 17, HELIPAD1, {}, 16 }, { 17, HELIPAD2, AirportBlock::Helipad2, 11 }, { 17, HELITAKEOFF, AirportBlock::Helipad2, 11 }, { 17, TO_ALL, {}, 18 },
{ 18, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 18, TERM6, AirportBlock::Term6, 9 }, { 18, TAKEOFF, {}, 19 }, { 18, HANGAR, AirportBlock::Hangar2Area, 3 }, { 18, TO_ALL, {}, 17 },
{ 19, TO_ALL, AirportBlock::TermGroup2Exit1, 20 },
{ 20, TO_ALL, AirportBlock::TermGroup2Exit1, 21 },
{ 21, TO_ALL, AirportBlock::TermGroup2Exit2, 22 },
{ 22, TO_ALL, AirportBlock::TermGroup2Exit2, 26 },
{ 23, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 23, TERM1, AirportBlock::Term1, 4 }, { 23, HANGAR, AirportBlock::AirportEntrance, 2 }, { 23, TO_ALL, {}, 24 },
{ 24, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 24, TERM2, AirportBlock::Term2, 5 }, { 24, TERM1, {}, 23 }, { 24, HANGAR, {}, 23 }, { 24, TO_ALL, {}, 25 },
{ 25, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 25, TERM3, AirportBlock::Term3, 6 }, { 25, TAKEOFF, {}, 26 }, { 25, TO_ALL, {}, 24 },
{ 26, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 26, TAKEOFF, {}, 27 }, { 26, TO_ALL, {}, 25 },
{ 27, TO_ALL, AirportBlock::OutWay, 28 },
/* takeoff */
{ 28, TAKEOFF, OUT_WAY_block, 29 },
{ 29, TO_ALL, RUNWAY_OUT_block, 30 },
{ 30, STARTTAKEOFF, NOTHING_block, 31 },
{ 31, ENDTAKEOFF, NOTHING_block, 0 },
{ 28, TAKEOFF, AirportBlock::OutWay, 29 },
{ 29, TO_ALL, AirportBlock::RunwayOut, 30 },
{ 30, STARTTAKEOFF, AirportBlock::Nothing, 31 },
{ 31, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* landing */
{ 32, FLYING, NOTHING_block, 37 }, { 32, LANDING, 0, 33 }, { 32, HELILANDING, 0, 41 },
{ 33, LANDING, RUNWAY_IN_block, 34 },
{ 34, TO_ALL, RUNWAY_IN_block, 35 },
{ 35, TO_ALL, RUNWAY_IN_block, 36 },
{ 36, ENDLANDING, IN_WAY_block, 36 }, { 36, TERMGROUP, TERM_GROUP1_block, 0 }, { 36, TERMGROUP, TERM_GROUP2_ENTER1_block, 1 }, { 36, TERM4, 0, 12 }, { 36, TERM5, 0, 12 }, { 36, TERM6, 0, 12 }, { 36, TO_ALL, 0, 2 },
{ 32, FLYING, AirportBlock::Nothing, 37 }, { 32, LANDING, {}, 33 }, { 32, HELILANDING, {}, 41 },
{ 33, LANDING, AirportBlock::RunwayIn, 34 },
{ 34, TO_ALL, AirportBlock::RunwayIn, 35 },
{ 35, TO_ALL, AirportBlock::RunwayIn, 36 },
{ 36, ENDLANDING, AirportBlock::InWay, 36 }, { 36, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 36, TERMGROUP, AirportBlock::TermGroup2Enter1, 1 }, { 36, TERM4, {}, 12 }, { 36, TERM5, {}, 12 }, { 36, TERM6, {}, 12 }, { 36, TO_ALL, {}, 2 },
/* In Air */
{ 37, TO_ALL, NOTHING_block, 38 },
{ 38, TO_ALL, NOTHING_block, 39 },
{ 39, TO_ALL, NOTHING_block, 40 },
{ 40, TO_ALL, NOTHING_block, 32 },
{ 37, TO_ALL, AirportBlock::Nothing, 38 },
{ 38, TO_ALL, AirportBlock::Nothing, 39 },
{ 39, TO_ALL, AirportBlock::Nothing, 40 },
{ 40, TO_ALL, AirportBlock::Nothing, 32 },
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 41, HELILANDING, PRE_HELIPAD_block, 42 },
{ 42, HELIENDLANDING, PRE_HELIPAD_block, 42 }, { 42, HELIPAD1, 0, 43 }, { 42, HELIPAD2, 0, 44 }, { 42, HANGAR, 0, 49 },
{ 43, TO_ALL, NOTHING_block, 45 },
{ 44, TO_ALL, NOTHING_block, 46 },
{ 41, HELILANDING, AirportBlock::PreHelipad, 42 },
{ 42, HELIENDLANDING, AirportBlock::PreHelipad, 42 }, { 42, HELIPAD1, {}, 43 }, { 42, HELIPAD2, {}, 44 }, { 42, HANGAR, {}, 49 },
{ 43, TO_ALL, AirportBlock::Nothing, 45 },
{ 44, TO_ALL, AirportBlock::Nothing, 46 },
/* landing */
{ 45, TERMGROUP, NOTHING_block, 0 }, { 45, HELIPAD1, HELIPAD1_block, 10 },
{ 46, TERMGROUP, NOTHING_block, 0 }, { 46, HELIPAD2, HELIPAD2_block, 11 },
{ 45, TERMGROUP, AirportBlock::Nothing, 0 }, { 45, HELIPAD1, AirportBlock::Helipad1, 10 },
{ 46, TERMGROUP, AirportBlock::Nothing, 0 }, { 46, HELIPAD2, AirportBlock::Helipad2, 11 },
/* Helicopter -- takeoff */
{ 47, HELITAKEOFF, NOTHING_block, 0 },
{ 48, HELITAKEOFF, NOTHING_block, 0 },
{ 49, TO_ALL, HANGAR2_AREA_block, 50 }, // need to go to hangar when waiting in air
{ 50, TO_ALL, HANGAR2_AREA_block, 3 },
{ 51, HELITAKEOFF, NOTHING_block, 0 },
{ 52, HELITAKEOFF, NOTHING_block, 0 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 47, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 48, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 49, TO_ALL, AirportBlock::Hangar2Area, 50 }, // need to go to hangar when waiting in air
{ 50, TO_ALL, AirportBlock::Hangar2Area, 3 },
{ 51, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 52, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
/* intercontinental */
@ -652,109 +654,109 @@ static const HangarTileTable _airport_depots_intercontinental[] = { {{0, 5}, DIR
static const uint8_t _airport_terminal_intercontinental[] = { 2, 4, 4 };
static const uint8_t _airport_entries_intercontinental[] = { 44, 43, 46, 45 };
static const AirportFTAbuildup _airport_fta_intercontinental[] = {
{ 0, HANGAR, NOTHING_block, 2 }, { 0, TERMGROUP, HANGAR1_AREA_block | TERM_GROUP1_block, 0 }, { 0, TERMGROUP, HANGAR1_AREA_block | TERM_GROUP1_block, 1 }, { 0, TAKEOFF, HANGAR1_AREA_block | TERM_GROUP1_block, 2 }, { 0, TO_ALL, 0, 2 },
{ 1, HANGAR, NOTHING_block, 3 }, { 1, TERMGROUP, HANGAR2_AREA_block, 1 }, { 1, TERMGROUP, HANGAR2_AREA_block, 0 }, { 1, TO_ALL, 0, 3 },
{ 2, TERMGROUP, HANGAR1_AREA_block, 0 }, { 2, TERMGROUP, TERM_GROUP1_block, 0 }, { 2, TERMGROUP, TERM_GROUP1_block, 1 }, { 2, HANGAR, 0, 0 }, { 2, TAKEOFF, TERM_GROUP1_block, 27 }, { 2, TERM5, 0, 26 }, { 2, TERM6, 0, 26 }, { 2, TERM7, 0, 26 }, { 2, TERM8, 0, 26 }, { 2, HELIPAD1, 0, 26 }, { 2, HELIPAD2, 0, 26 }, { 2, HELITAKEOFF, 0, 74 }, { 2, TO_ALL, 0, 27 },
{ 3, TERMGROUP, HANGAR2_AREA_block, 0 }, { 3, HANGAR, 0, 1 }, { 3, HELITAKEOFF, 0, 75 }, {3, TAKEOFF, 0, 59}, { 3, TO_ALL, 0, 20 },
{ 4, TERM1, TERM1_block, 26 }, { 4, HANGAR, HANGAR1_AREA_block | TERM_GROUP1_block, 26 }, { 4, TO_ALL, 0, 26 },
{ 5, TERM2, TERM2_block, 27 }, { 5, HANGAR, HANGAR1_AREA_block | TERM_GROUP1_block, 27 }, { 5, TO_ALL, 0, 27 },
{ 6, TERM3, TERM3_block, 28 }, { 6, HANGAR, HANGAR1_AREA_block | TERM_GROUP1_block, 28 }, { 6, TO_ALL, 0, 28 },
{ 7, TERM4, TERM4_block, 29 }, { 7, HANGAR, HANGAR1_AREA_block | TERM_GROUP1_block, 29 }, { 7, TO_ALL, 0, 29 },
{ 8, TERM5, TERM5_block, 18 }, { 8, HANGAR, HANGAR2_AREA_block, 18 }, { 8, TO_ALL, 0, 18 },
{ 9, TERM6, TERM6_block, 19 }, { 9, HANGAR, HANGAR2_AREA_block, 19 }, { 9, TO_ALL, 0, 19 },
{ 10, TERM7, TERM7_block, 20 }, { 10, HANGAR, HANGAR2_AREA_block, 20 }, { 10, TO_ALL, 0, 20 },
{ 11, TERM8, TERM8_block, 21 }, { 11, HANGAR, HANGAR2_AREA_block, 21 }, { 11, TO_ALL, 0, 21 },
{ 12, HELIPAD1, HELIPAD1_block, 12 }, { 12, HANGAR, 0, 70 }, { 12, HELITAKEOFF, 0, 72 },
{ 13, HELIPAD2, HELIPAD2_block, 13 }, { 13, HANGAR, 0, 71 }, { 13, HELITAKEOFF, 0, 73 },
{ 14, TO_ALL, TERM_GROUP2_ENTER1_block, 15 },
{ 15, TO_ALL, TERM_GROUP2_ENTER1_block, 16 },
{ 16, TO_ALL, TERM_GROUP2_ENTER2_block, 17 },
{ 17, TO_ALL, TERM_GROUP2_ENTER2_block, 18 },
{ 18, TERMGROUP, TERM_GROUP2_block, 0 }, { 18, TERM5, TERM5_block, 8 }, { 18, TAKEOFF, 0, 19 }, { 18, HELITAKEOFF, HELIPAD1_block, 19 }, { 18, TO_ALL, TERM_GROUP2_EXIT1_block, 19 },
{ 19, TERMGROUP, TERM_GROUP2_block, 0 }, { 19, TERM6, TERM6_block, 9 }, { 19, TERM5, 0, 18 }, { 19, TAKEOFF, 0, 57 }, { 19, HELITAKEOFF, HELIPAD1_block, 20 }, { 19, TO_ALL, TERM_GROUP2_EXIT1_block, 20 }, // add exit to runway out 2
{ 20, TERMGROUP, TERM_GROUP2_block, 0 }, { 20, TERM7, TERM7_block, 10 }, { 20, TERM5, 0, 19 }, { 20, TERM6, 0, 19 }, { 20, HANGAR, HANGAR2_AREA_block, 3 }, { 20, TAKEOFF, 0, 19 }, { 20, TO_ALL, TERM_GROUP2_EXIT1_block, 21 },
{ 21, TERMGROUP, TERM_GROUP2_block, 0 }, { 21, TERM8, TERM8_block, 11 }, { 21, HANGAR, HANGAR2_AREA_block, 20 }, { 21, TERM5, 0, 20 }, { 21, TERM6, 0, 20 }, { 21, TERM7, 0, 20 }, { 21, TAKEOFF, 0, 20 }, { 21, TO_ALL, TERM_GROUP2_EXIT1_block, 22 },
{ 22, TERMGROUP, TERM_GROUP2_block, 0 }, { 22, HANGAR, 0, 21 }, { 22, TERM5, 0, 21 }, { 22, TERM6, 0, 21 }, { 22, TERM7, 0, 21 }, { 22, TERM8, 0, 21 }, { 22, TAKEOFF, 0, 21 }, { 22, TO_ALL, 0, 23 },
{ 23, TO_ALL, TERM_GROUP2_EXIT1_block, 70 },
{ 24, TO_ALL, TERM_GROUP2_EXIT2_block, 25 },
{ 25, TERMGROUP, TERM_GROUP2_EXIT2_block, 0 }, { 25, HANGAR, HANGAR1_AREA_block | TERM_GROUP1_block, 29 }, { 25, TO_ALL, 0, 29 },
{ 26, TERMGROUP, TERM_GROUP1_block, 0 }, { 26, TERM1, TERM1_block, 4 }, { 26, HANGAR, HANGAR1_AREA_block, 27 }, { 26, TERM5, TERM_GROUP2_ENTER1_block, 14 }, { 26, TERM6, TERM_GROUP2_ENTER1_block, 14 }, { 26, TERM7, TERM_GROUP2_ENTER1_block, 14 }, { 26, TERM8, TERM_GROUP2_ENTER1_block, 14 }, { 26, HELIPAD1, TERM_GROUP2_ENTER1_block, 14 }, { 26, HELIPAD2, TERM_GROUP2_ENTER1_block, 14 }, { 26, HELITAKEOFF, TERM_GROUP2_ENTER1_block, 14 }, { 26, TO_ALL, 0, 27 },
{ 27, TERMGROUP, TERM_GROUP1_block, 0 }, { 27, TERM2, TERM2_block, 5 }, { 27, HANGAR, HANGAR1_AREA_block, 2 }, { 27, TERM1, 0, 26 }, { 27, TERM5, 0, 26 }, { 27, TERM6, 0, 26 }, { 27, TERM7, 0, 26 }, { 27, TERM8, 0, 26 }, { 27, HELIPAD1, 0, 14 }, { 27, HELIPAD2, 0, 14 }, { 27, TO_ALL, 0, 28 },
{ 28, TERMGROUP, TERM_GROUP1_block, 0 }, { 28, TERM3, TERM3_block, 6 }, { 28, HANGAR, HANGAR1_AREA_block, 27 }, { 28, TERM1, 0, 27 }, { 28, TERM2, 0, 27 }, { 28, TERM4, 0, 29 }, { 28, TERM5, 0, 14 }, { 28, TERM6, 0, 14 }, { 28, TERM7, 0, 14 }, { 28, TERM8, 0, 14 }, { 28, HELIPAD1, 0, 14 }, { 28, HELIPAD2, 0, 14 }, { 28, TO_ALL, 0, 29 },
{ 29, TERMGROUP, TERM_GROUP1_block, 0 }, { 29, TERM4, TERM4_block, 7 }, { 29, HANGAR, HANGAR1_AREA_block, 27 }, { 29, TAKEOFF, 0, 30 }, { 29, TO_ALL, 0, 28 },
{ 30, TO_ALL, OUT_WAY_block2, 31 },
{ 31, TO_ALL, OUT_WAY_block, 32 },
{ 0, HANGAR, AirportBlock::Nothing, 2 }, { 0, TERMGROUP, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 0 }, { 0, TERMGROUP, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 1 }, { 0, TAKEOFF, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 2 }, { 0, TO_ALL, {}, 2 },
{ 1, HANGAR, AirportBlock::Nothing, 3 }, { 1, TERMGROUP, AirportBlock::Hangar2Area, 1 }, { 1, TERMGROUP, AirportBlock::Hangar2Area, 0 }, { 1, TO_ALL, {}, 3 },
{ 2, TERMGROUP, AirportBlock::Hangar1Area, 0 }, { 2, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 2, TERMGROUP, AirportBlock::TermGroup1, 1 }, { 2, HANGAR, {}, 0 }, { 2, TAKEOFF, AirportBlock::TermGroup1, 27 }, { 2, TERM5, {}, 26 }, { 2, TERM6, {}, 26 }, { 2, TERM7, {}, 26 }, { 2, TERM8, {}, 26 }, { 2, HELIPAD1, {}, 26 }, { 2, HELIPAD2, {}, 26 }, { 2, HELITAKEOFF, {}, 74 }, { 2, TO_ALL, {}, 27 },
{ 3, TERMGROUP, AirportBlock::Hangar2Area, 0 }, { 3, HANGAR, {}, 1 }, { 3, HELITAKEOFF, {}, 75 }, {3, TAKEOFF, {}, 59}, { 3, TO_ALL, {}, 20 },
{ 4, TERM1, AirportBlock::Term1, 26 }, { 4, HANGAR, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 26 }, { 4, TO_ALL, {}, 26 },
{ 5, TERM2, AirportBlock::Term2, 27 }, { 5, HANGAR, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 27 }, { 5, TO_ALL, {}, 27 },
{ 6, TERM3, AirportBlock::Term3, 28 }, { 6, HANGAR, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 28 }, { 6, TO_ALL, {}, 28 },
{ 7, TERM4, AirportBlock::Term4, 29 }, { 7, HANGAR, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 29 }, { 7, TO_ALL, {}, 29 },
{ 8, TERM5, AirportBlock::Term5, 18 }, { 8, HANGAR, AirportBlock::Hangar2Area, 18 }, { 8, TO_ALL, {}, 18 },
{ 9, TERM6, AirportBlock::Term6, 19 }, { 9, HANGAR, AirportBlock::Hangar2Area, 19 }, { 9, TO_ALL, {}, 19 },
{ 10, TERM7, AirportBlock::Term7, 20 }, { 10, HANGAR, AirportBlock::Hangar2Area, 20 }, { 10, TO_ALL, {}, 20 },
{ 11, TERM8, AirportBlock::Term8, 21 }, { 11, HANGAR, AirportBlock::Hangar2Area, 21 }, { 11, TO_ALL, {}, 21 },
{ 12, HELIPAD1, AirportBlock::Helipad1, 12 }, { 12, HANGAR, {}, 70 }, { 12, HELITAKEOFF, {}, 72 },
{ 13, HELIPAD2, AirportBlock::Helipad2, 13 }, { 13, HANGAR, {}, 71 }, { 13, HELITAKEOFF, {}, 73 },
{ 14, TO_ALL, AirportBlock::TermGroup2Enter1, 15 },
{ 15, TO_ALL, AirportBlock::TermGroup2Enter1, 16 },
{ 16, TO_ALL, AirportBlock::TermGroup2Enter2, 17 },
{ 17, TO_ALL, AirportBlock::TermGroup2Enter2, 18 },
{ 18, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 18, TERM5, AirportBlock::Term5, 8 }, { 18, TAKEOFF, {}, 19 }, { 18, HELITAKEOFF, AirportBlock::Helipad1, 19 }, { 18, TO_ALL, AirportBlock::TermGroup2Exit1, 19 },
{ 19, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 19, TERM6, AirportBlock::Term6, 9 }, { 19, TERM5, {}, 18 }, { 19, TAKEOFF, {}, 57 }, { 19, HELITAKEOFF, AirportBlock::Helipad1, 20 }, { 19, TO_ALL, AirportBlock::TermGroup2Exit1, 20 }, // add exit to runway out 2
{ 20, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 20, TERM7, AirportBlock::Term7, 10 }, { 20, TERM5, {}, 19 }, { 20, TERM6, {}, 19 }, { 20, HANGAR, AirportBlock::Hangar2Area, 3 }, { 20, TAKEOFF, {}, 19 }, { 20, TO_ALL, AirportBlock::TermGroup2Exit1, 21 },
{ 21, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 21, TERM8, AirportBlock::Term8, 11 }, { 21, HANGAR, AirportBlock::Hangar2Area, 20 }, { 21, TERM5, {}, 20 }, { 21, TERM6, {}, 20 }, { 21, TERM7, {}, 20 }, { 21, TAKEOFF, {}, 20 }, { 21, TO_ALL, AirportBlock::TermGroup2Exit1, 22 },
{ 22, TERMGROUP, AirportBlock::TermGroup2, 0 }, { 22, HANGAR, {}, 21 }, { 22, TERM5, {}, 21 }, { 22, TERM6, {}, 21 }, { 22, TERM7, {}, 21 }, { 22, TERM8, {}, 21 }, { 22, TAKEOFF, {}, 21 }, { 22, TO_ALL, {}, 23 },
{ 23, TO_ALL, AirportBlock::TermGroup2Exit1, 70 },
{ 24, TO_ALL, AirportBlock::TermGroup2Exit2, 25 },
{ 25, TERMGROUP, AirportBlock::TermGroup2Exit2, 0 }, { 25, HANGAR, {AirportBlock::Hangar1Area, AirportBlock::TermGroup1}, 29 }, { 25, TO_ALL, {}, 29 },
{ 26, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 26, TERM1, AirportBlock::Term1, 4 }, { 26, HANGAR, AirportBlock::Hangar1Area, 27 }, { 26, TERM5, AirportBlock::TermGroup2Enter1, 14 }, { 26, TERM6, AirportBlock::TermGroup2Enter1, 14 }, { 26, TERM7, AirportBlock::TermGroup2Enter1, 14 }, { 26, TERM8, AirportBlock::TermGroup2Enter1, 14 }, { 26, HELIPAD1, AirportBlock::TermGroup2Enter1, 14 }, { 26, HELIPAD2, AirportBlock::TermGroup2Enter1, 14 }, { 26, HELITAKEOFF, AirportBlock::TermGroup2Enter1, 14 }, { 26, TO_ALL, {}, 27 },
{ 27, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 27, TERM2, AirportBlock::Term2, 5 }, { 27, HANGAR, AirportBlock::Hangar1Area, 2 }, { 27, TERM1, {}, 26 }, { 27, TERM5, {}, 26 }, { 27, TERM6, {}, 26 }, { 27, TERM7, {}, 26 }, { 27, TERM8, {}, 26 }, { 27, HELIPAD1, {}, 14 }, { 27, HELIPAD2, {}, 14 }, { 27, TO_ALL, {}, 28 },
{ 28, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 28, TERM3, AirportBlock::Term3, 6 }, { 28, HANGAR, AirportBlock::Hangar1Area, 27 }, { 28, TERM1, {}, 27 }, { 28, TERM2, {}, 27 }, { 28, TERM4, {}, 29 }, { 28, TERM5, {}, 14 }, { 28, TERM6, {}, 14 }, { 28, TERM7, {}, 14 }, { 28, TERM8, {}, 14 }, { 28, HELIPAD1, {}, 14 }, { 28, HELIPAD2, {}, 14 }, { 28, TO_ALL, {}, 29 },
{ 29, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 29, TERM4, AirportBlock::Term4, 7 }, { 29, HANGAR, AirportBlock::Hangar1Area, 27 }, { 29, TAKEOFF, {}, 30 }, { 29, TO_ALL, {}, 28 },
{ 30, TO_ALL, AirportBlock::OutWay3, 31 },
{ 31, TO_ALL, AirportBlock::OutWay, 32 },
/* takeoff */
{ 32, TAKEOFF, RUNWAY_OUT_block, 33 },
{ 33, TO_ALL, RUNWAY_OUT_block, 34 },
{ 34, STARTTAKEOFF, NOTHING_block, 35 },
{ 35, ENDTAKEOFF, NOTHING_block, 0 },
{ 32, TAKEOFF, AirportBlock::RunwayOut, 33 },
{ 33, TO_ALL, AirportBlock::RunwayOut, 34 },
{ 34, STARTTAKEOFF, AirportBlock::Nothing, 35 },
{ 35, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* landing */
{ 36, TO_ALL, 0, 0 },
{ 37, LANDING, RUNWAY_IN_block, 38 },
{ 38, TO_ALL, RUNWAY_IN_block, 39 },
{ 39, TO_ALL, RUNWAY_IN_block, 40 },
{ 40, ENDLANDING, RUNWAY_IN_block, 41 },
{ 41, TO_ALL, IN_WAY_block, 42 },
{ 42, TERMGROUP, IN_WAY_block, 0 }, { 42, TERMGROUP, TERM_GROUP1_block, 0 }, { 42, TERMGROUP, TERM_GROUP1_block, 1 }, { 42, HANGAR, 0, 2 }, { 42, TO_ALL, 0, 26 },
{ 36, TO_ALL, {}, 0 },
{ 37, LANDING, AirportBlock::RunwayIn, 38 },
{ 38, TO_ALL, AirportBlock::RunwayIn, 39 },
{ 39, TO_ALL, AirportBlock::RunwayIn, 40 },
{ 40, ENDLANDING, AirportBlock::RunwayIn, 41 },
{ 41, TO_ALL, AirportBlock::InWay, 42 },
{ 42, TERMGROUP, AirportBlock::InWay, 0 }, { 42, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 42, TERMGROUP, AirportBlock::TermGroup1, 1 }, { 42, HANGAR, {}, 2 }, { 42, TO_ALL, {}, 26 },
/* In Air */
{ 43, TO_ALL, 0, 44 },
{ 44, FLYING, 0, 45 }, { 44, HELILANDING, 0, 47 }, { 44, LANDING, 0, 69 }, { 44, TO_ALL, 0, 45 },
{ 45, TO_ALL, 0, 46 },
{ 46, FLYING, 0, 43 }, { 46, LANDING, 0, 76 }, { 46, TO_ALL, 0, 43 },
{ 43, TO_ALL, {}, 44 },
{ 44, FLYING, {}, 45 }, { 44, HELILANDING, {}, 47 }, { 44, LANDING, {}, 69 }, { 44, TO_ALL, {}, 45 },
{ 45, TO_ALL, {}, 46 },
{ 46, FLYING, {}, 43 }, { 46, LANDING, {}, 76 }, { 46, TO_ALL, {}, 43 },
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 47, HELILANDING, PRE_HELIPAD_block, 48 },
{ 48, HELIENDLANDING, PRE_HELIPAD_block, 48 }, { 48, HELIPAD1, 0, 49 }, { 48, HELIPAD2, 0, 50 }, { 48, HANGAR, 0, 55 },
{ 49, TO_ALL, NOTHING_block, 51 },
{ 50, TO_ALL, NOTHING_block, 52 },
{ 47, HELILANDING, AirportBlock::PreHelipad, 48 },
{ 48, HELIENDLANDING, AirportBlock::PreHelipad, 48 }, { 48, HELIPAD1, {}, 49 }, { 48, HELIPAD2, {}, 50 }, { 48, HANGAR, {}, 55 },
{ 49, TO_ALL, AirportBlock::Nothing, 51 },
{ 50, TO_ALL, AirportBlock::Nothing, 52 },
/* landing */
{ 51, TERMGROUP, NOTHING_block, 0 }, { 51, HELIPAD1, HELIPAD1_block, 12 }, { 51, HANGAR, 0, 55 }, { 51, TO_ALL, 0, 12 },
{ 52, TERMGROUP, NOTHING_block, 0 }, { 52, HELIPAD2, HELIPAD2_block, 13 }, { 52, HANGAR, 0, 55 }, { 52, TO_ALL, 0, 13 },
{ 51, TERMGROUP, AirportBlock::Nothing, 0 }, { 51, HELIPAD1, AirportBlock::Helipad1, 12 }, { 51, HANGAR, {}, 55 }, { 51, TO_ALL, {}, 12 },
{ 52, TERMGROUP, AirportBlock::Nothing, 0 }, { 52, HELIPAD2, AirportBlock::Helipad2, 13 }, { 52, HANGAR, {}, 55 }, { 52, TO_ALL, {}, 13 },
/* Helicopter -- takeoff */
{ 53, HELITAKEOFF, NOTHING_block, 0 },
{ 54, HELITAKEOFF, NOTHING_block, 0 },
{ 55, TO_ALL, HANGAR2_AREA_block, 56 }, // need to go to hangar when waiting in air
{ 56, TO_ALL, HANGAR2_AREA_block, 3 },
{ 53, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 54, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 55, TO_ALL, AirportBlock::Hangar2Area, 56 }, // need to go to hangar when waiting in air
{ 56, TO_ALL, AirportBlock::Hangar2Area, 3 },
/* runway 2 out support */
{ 57, TERMGROUP, OUT_WAY2_block, 0 }, { 57, TAKEOFF, 0, 58 }, { 57, TO_ALL, 0, 58 },
{ 58, TO_ALL, OUT_WAY2_block, 59 },
{ 59, TAKEOFF, RUNWAY_OUT2_block, 60 }, // takeoff
{ 60, TO_ALL, RUNWAY_OUT2_block, 61 },
{ 61, STARTTAKEOFF, NOTHING_block, 62 },
{ 62, ENDTAKEOFF, NOTHING_block, 0 },
{ 57, TERMGROUP, AirportBlock::OutWay2, 0 }, { 57, TAKEOFF, {}, 58 }, { 57, TO_ALL, {}, 58 },
{ 58, TO_ALL, AirportBlock::OutWay2, 59 },
{ 59, TAKEOFF, AirportBlock::RunwayOut2, 60 }, // takeoff
{ 60, TO_ALL, AirportBlock::RunwayOut2, 61 },
{ 61, STARTTAKEOFF, AirportBlock::Nothing, 62 },
{ 62, ENDTAKEOFF, AirportBlock::Nothing, 0 },
/* runway 2 in support */
{ 63, LANDING, RUNWAY_IN2_block, 64 },
{ 64, TO_ALL, RUNWAY_IN2_block, 65 },
{ 65, TO_ALL, RUNWAY_IN2_block, 66 },
{ 66, ENDLANDING, RUNWAY_IN2_block, 0 }, { 66, TERMGROUP, 0, 1 }, { 66, TERMGROUP, 0, 0 }, { 66, TO_ALL, 0, 67 },
{ 67, TO_ALL, IN_WAY2_block, 68 },
{ 68, TERMGROUP, IN_WAY2_block, 0 }, { 68, TERMGROUP, TERM_GROUP2_block, 1 }, { 68, TERMGROUP, TERM_GROUP1_block, 0 }, { 68, HANGAR, HANGAR2_AREA_block, 22 }, { 68, TO_ALL, 0, 22 },
{ 69, TERMGROUP, RUNWAY_IN2_block, 0 }, { 69, TO_ALL, RUNWAY_IN2_block, 63 },
{ 70, TERMGROUP, TERM_GROUP2_EXIT1_block, 0 }, { 70, HELIPAD1, HELIPAD1_block, 12 }, { 70, HELITAKEOFF, HELIPAD1_block, 12 }, { 70, TO_ALL, 0, 71 },
{ 71, TERMGROUP, TERM_GROUP2_EXIT1_block, 0 }, { 71, HELIPAD2, HELIPAD2_block, 13 }, { 71, HELITAKEOFF, HELIPAD1_block, 12 }, { 71, TO_ALL, 0, 24 },
{ 72, TO_ALL, HELIPAD1_block, 53 },
{ 73, TO_ALL, HELIPAD2_block, 54 },
{ 74, HELITAKEOFF, NOTHING_block, 0 },
{ 75, HELITAKEOFF, NOTHING_block, 0 },
{ 76, TERMGROUP, RUNWAY_IN_block, 0 }, { 76, TO_ALL, RUNWAY_IN_block, 37 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 63, LANDING, AirportBlock::RunwayIn2, 64 },
{ 64, TO_ALL, AirportBlock::RunwayIn2, 65 },
{ 65, TO_ALL, AirportBlock::RunwayIn2, 66 },
{ 66, ENDLANDING, AirportBlock::RunwayIn2, 0 }, { 66, TERMGROUP, {}, 1 }, { 66, TERMGROUP, {}, 0 }, { 66, TO_ALL, {}, 67 },
{ 67, TO_ALL, AirportBlock::InWay2, 68 },
{ 68, TERMGROUP, AirportBlock::InWay2, 0 }, { 68, TERMGROUP, AirportBlock::TermGroup2, 1 }, { 68, TERMGROUP, AirportBlock::TermGroup1, 0 }, { 68, HANGAR, AirportBlock::Hangar2Area, 22 }, { 68, TO_ALL, {}, 22 },
{ 69, TERMGROUP, AirportBlock::RunwayIn2, 0 }, { 69, TO_ALL, AirportBlock::RunwayIn2, 63 },
{ 70, TERMGROUP, AirportBlock::TermGroup2Exit1, 0 }, { 70, HELIPAD1, AirportBlock::Helipad1, 12 }, { 70, HELITAKEOFF, AirportBlock::Helipad1, 12 }, { 70, TO_ALL, {}, 71 },
{ 71, TERMGROUP, AirportBlock::TermGroup2Exit1, 0 }, { 71, HELIPAD2, AirportBlock::Helipad2, 13 }, { 71, HELITAKEOFF, AirportBlock::Helipad1, 12 }, { 71, TO_ALL, {}, 24 },
{ 72, TO_ALL, AirportBlock::Helipad1, 53 },
{ 73, TO_ALL, AirportBlock::Helipad2, 54 },
{ 74, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 75, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 76, TERMGROUP, AirportBlock::RunwayIn, 0 }, { 76, TO_ALL, AirportBlock::RunwayIn, 37 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
/* heliports, oilrigs don't have depots */
static const uint8_t _airport_entries_heliport[] = { 7, 7, 7, 7 };
static const AirportFTAbuildup _airport_fta_heliport[] = {
{ 0, HELIPAD1, HELIPAD1_block, 1 },
{ 1, HELITAKEOFF, NOTHING_block, 0 }, // takeoff
{ 2, TERMGROUP, AIRPORT_BUSY_block, 0 }, { 2, HELILANDING, 0, 3 }, { 2, HELITAKEOFF, 0, 1 },
{ 3, HELILANDING, AIRPORT_BUSY_block, 4 },
{ 4, HELIENDLANDING, AIRPORT_BUSY_block, 4 }, { 4, HELIPAD1, HELIPAD1_block, 0 }, { 4, HELITAKEOFF, 0, 2 },
{ 0, HELIPAD1, AirportBlock::Helipad1, 1 },
{ 1, HELITAKEOFF, AirportBlock::Nothing, 0 }, // takeoff
{ 2, TERMGROUP, AirportBlock::AirportBusy, 0 }, { 2, HELILANDING, {}, 3 }, { 2, HELITAKEOFF, {}, 1 },
{ 3, HELILANDING, AirportBlock::AirportBusy, 4 },
{ 4, HELIENDLANDING, AirportBlock::AirportBusy, 4 }, { 4, HELIPAD1, AirportBlock::Helipad1, 0 }, { 4, HELITAKEOFF, {}, 2 },
/* In Air */
{ 5, TO_ALL, NOTHING_block, 6 },
{ 6, TO_ALL, NOTHING_block, 7 },
{ 7, TO_ALL, NOTHING_block, 8 },
{ 8, FLYING, NOTHING_block, 5 }, { 8, HELILANDING, HELIPAD1_block, 2 }, // landing
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 5, TO_ALL, AirportBlock::Nothing, 6 },
{ 6, TO_ALL, AirportBlock::Nothing, 7 },
{ 7, TO_ALL, AirportBlock::Nothing, 8 },
{ 8, FLYING, AirportBlock::Nothing, 5 }, { 8, HELILANDING, AirportBlock::Helipad1, 2 }, // landing
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
#define _airport_entries_oilrig _airport_entries_heliport
#define _airport_fta_oilrig _airport_fta_heliport
@ -763,73 +765,73 @@ static const AirportFTAbuildup _airport_fta_heliport[] = {
static const HangarTileTable _airport_depots_helidepot[] = { {{1, 0}, DIR_SE, 0} };
static const uint8_t _airport_entries_helidepot[] = { 4, 4, 4, 4 };
static const AirportFTAbuildup _airport_fta_helidepot[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, TERMGROUP, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELIPAD1, HELIPAD1_block, 14 }, { 1, HELITAKEOFF, 0, 15 }, { 1, TO_ALL, 0, 0 },
{ 2, FLYING, NOTHING_block, 3 }, { 2, HELILANDING, PRE_HELIPAD_block, 7 }, { 2, HANGAR, 0, 12 }, { 2, HELITAKEOFF, NOTHING_block, 16 },
{ 0, HANGAR, AirportBlock::Nothing, 1 },
{ 1, TERMGROUP, AirportBlock::Hangar2Area, 0 }, { 1, HANGAR, {}, 0 }, { 1, HELIPAD1, AirportBlock::Helipad1, 14 }, { 1, HELITAKEOFF, {}, 15 }, { 1, TO_ALL, {}, 0 },
{ 2, FLYING, AirportBlock::Nothing, 3 }, { 2, HELILANDING, AirportBlock::PreHelipad, 7 }, { 2, HANGAR, {}, 12 }, { 2, HELITAKEOFF, AirportBlock::Nothing, 16 },
/* In Air */
{ 3, 0, NOTHING_block, 4 },
{ 4, 0, NOTHING_block, 5 },
{ 5, 0, NOTHING_block, 6 },
{ 6, 0, NOTHING_block, 2 },
{ 3, TO_ALL, AirportBlock::Nothing, 4 },
{ 4, TO_ALL, AirportBlock::Nothing, 5 },
{ 5, TO_ALL, AirportBlock::Nothing, 6 },
{ 6, TO_ALL, AirportBlock::Nothing, 2 },
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 7, HELILANDING, PRE_HELIPAD_block, 8 },
{ 8, HELIENDLANDING, PRE_HELIPAD_block, 8 }, { 8, HELIPAD1, 0, 9 }, { 8, HANGAR, 0, 12 }, { 8, TO_ALL, 0, 2 },
{ 9, 0, NOTHING_block, 10 },
{ 7, HELILANDING, AirportBlock::PreHelipad, 8 },
{ 8, HELIENDLANDING, AirportBlock::PreHelipad, 8 }, { 8, HELIPAD1, {}, 9 }, { 8, HANGAR, {}, 12 }, { 8, TO_ALL, {}, 2 },
{ 9, TO_ALL, AirportBlock::Nothing, 10 },
/* landing */
{ 10, TERMGROUP, NOTHING_block, 10 }, { 10, HELIPAD1, HELIPAD1_block, 14 }, { 10, HANGAR, 0, 1 }, { 10, TO_ALL, 0, 14 },
{ 10, TERMGROUP, AirportBlock::Nothing, 10 }, { 10, HELIPAD1, AirportBlock::Helipad1, 14 }, { 10, HANGAR, {}, 1 }, { 10, TO_ALL, {}, 14 },
/* Helicopter -- takeoff */
{ 11, HELITAKEOFF, NOTHING_block, 0 },
{ 12, TO_ALL, HANGAR2_AREA_block, 13 }, // need to go to hangar when waiting in air
{ 13, TO_ALL, HANGAR2_AREA_block, 1 },
{ 14, HELIPAD1, HELIPAD1_block, 14 }, { 14, HANGAR, 0, 1 }, { 14, HELITAKEOFF, 0, 17 },
{ 15, HELITAKEOFF, NOTHING_block, 0 }, // takeoff outside depot
{ 16, HELITAKEOFF, 0, 14 },
{ 17, TO_ALL, NOTHING_block, 11 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 11, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 12, TO_ALL, AirportBlock::Hangar2Area, 13 }, // need to go to hangar when waiting in air
{ 13, TO_ALL, AirportBlock::Hangar2Area, 1 },
{ 14, HELIPAD1, AirportBlock::Helipad1, 14 }, { 14, HANGAR, {}, 1 }, { 14, HELITAKEOFF, {}, 17 },
{ 15, HELITAKEOFF, AirportBlock::Nothing, 0 }, // takeoff outside depot
{ 16, HELITAKEOFF, {}, 14 },
{ 17, TO_ALL, AirportBlock::Nothing, 11 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
/* helistation */
static const HangarTileTable _airport_depots_helistation[] = { {{0, 0}, DIR_SE, 0} };
static const uint8_t _airport_entries_helistation[] = { 25, 25, 25, 25 };
static const AirportFTAbuildup _airport_fta_helistation[] = {
{ 0, HANGAR, NOTHING_block, 8 }, { 0, HELIPAD1, 0, 1 }, { 0, HELIPAD2, 0, 1 }, { 0, HELIPAD3, 0, 1 }, { 0, HELITAKEOFF, 0, 1 }, { 0, TO_ALL, 0, 0 },
{ 1, TERMGROUP, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELITAKEOFF, 0, 3 }, { 1, TO_ALL, 0, 4 },
{ 0, HANGAR, AirportBlock::Nothing, 8 }, { 0, HELIPAD1, {}, 1 }, { 0, HELIPAD2, {}, 1 }, { 0, HELIPAD3, {}, 1 }, { 0, HELITAKEOFF, {}, 1 }, { 0, TO_ALL, {}, 0 },
{ 1, TERMGROUP, AirportBlock::Hangar2Area, 0 }, { 1, HANGAR, {}, 0 }, { 1, HELITAKEOFF, {}, 3 }, { 1, TO_ALL, {}, 4 },
/* landing */
{ 2, FLYING, NOTHING_block, 28 }, { 2, HELILANDING, 0, 15 }, { 2, TO_ALL, 0, 28 },
{ 2, FLYING, AirportBlock::Nothing, 28 }, { 2, HELILANDING, {}, 15 }, { 2, TO_ALL, {}, 28 },
/* helicopter side */
{ 3, HELITAKEOFF, NOTHING_block, 0 }, // helitakeoff outside hangar2
{ 4, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 4, HANGAR, HANGAR2_AREA_block, 1 }, { 4, HELITAKEOFF, 0, 1 }, { 4, TO_ALL, 0, 5 },
{ 5, TERMGROUP, TAXIWAY_BUSY_block, 0 }, { 5, HELIPAD1, HELIPAD1_block, 6 }, { 5, HELIPAD2, HELIPAD2_block, 7 }, { 5, HELIPAD3, HELIPAD3_block, 8 }, { 5, TO_ALL, 0, 4 },
{ 6, HELIPAD1, HELIPAD1_block, 5 }, { 6, HANGAR, HANGAR2_AREA_block, 5 }, { 6, HELITAKEOFF, 0, 9 }, { 6, TO_ALL, 0, 6 },
{ 7, HELIPAD2, HELIPAD2_block, 5 }, { 7, HANGAR, HANGAR2_AREA_block, 5 }, { 7, HELITAKEOFF, 0, 10 }, { 7, TO_ALL, 0, 7 },
{ 8, HELIPAD3, HELIPAD3_block, 5 }, { 8, HANGAR, HANGAR2_AREA_block, 5 }, { 8, HELITAKEOFF, 0, 11 }, { 8, TO_ALL, 0, 8 },
{ 9, 0, HELIPAD1_block, 12 },
{ 10, TO_ALL, HELIPAD2_block, 13 },
{ 11, TO_ALL, HELIPAD3_block, 14 },
{ 12, HELITAKEOFF, NOTHING_block, 0 },
{ 13, HELITAKEOFF, NOTHING_block, 0 },
{ 14, HELITAKEOFF, NOTHING_block, 0 },
{ 3, HELITAKEOFF, AirportBlock::Nothing, 0 }, // helitakeoff outside hangar2
{ 4, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 4, HANGAR, AirportBlock::Hangar2Area, 1 }, { 4, HELITAKEOFF, {}, 1 }, { 4, TO_ALL, {}, 5 },
{ 5, TERMGROUP, AirportBlock::TaxiwayBusy, 0 }, { 5, HELIPAD1, AirportBlock::Helipad1, 6 }, { 5, HELIPAD2, AirportBlock::Helipad2, 7 }, { 5, HELIPAD3, AirportBlock::Helipad3, 8 }, { 5, TO_ALL, {}, 4 },
{ 6, HELIPAD1, AirportBlock::Helipad1, 5 }, { 6, HANGAR, AirportBlock::Hangar2Area, 5 }, { 6, HELITAKEOFF, {}, 9 }, { 6, TO_ALL, {}, 6 },
{ 7, HELIPAD2, AirportBlock::Helipad2, 5 }, { 7, HANGAR, AirportBlock::Hangar2Area, 5 }, { 7, HELITAKEOFF, {}, 10 }, { 7, TO_ALL, {}, 7 },
{ 8, HELIPAD3, AirportBlock::Helipad3, 5 }, { 8, HANGAR, AirportBlock::Hangar2Area, 5 }, { 8, HELITAKEOFF, {}, 11 }, { 8, TO_ALL, {}, 8 },
{ 9, TO_ALL, AirportBlock::Helipad1, 12 },
{ 10, TO_ALL, AirportBlock::Helipad2, 13 },
{ 11, TO_ALL, AirportBlock::Helipad3, 14 },
{ 12, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 13, HELITAKEOFF, AirportBlock::Nothing, 0 },
{ 14, HELITAKEOFF, AirportBlock::Nothing, 0 },
/* heli - in flight moves */
{ 15, HELILANDING, PRE_HELIPAD_block, 16 },
{ 16, HELIENDLANDING, PRE_HELIPAD_block, 16 }, { 16, HELIPAD1, 0, 17 }, { 16, HELIPAD2, 0, 18 }, { 16, HELIPAD3, 0, 19 }, { 16, HANGAR, 0, 23 },
{ 17, TO_ALL, NOTHING_block, 20 },
{ 18, TO_ALL, NOTHING_block, 21 },
{ 19, TO_ALL, NOTHING_block, 22 },
{ 15, HELILANDING, AirportBlock::PreHelipad, 16 },
{ 16, HELIENDLANDING, AirportBlock::PreHelipad, 16 }, { 16, HELIPAD1, {}, 17 }, { 16, HELIPAD2, {}, 18 }, { 16, HELIPAD3, {}, 19 }, { 16, HANGAR, {}, 23 },
{ 17, TO_ALL, AirportBlock::Nothing, 20 },
{ 18, TO_ALL, AirportBlock::Nothing, 21 },
{ 19, TO_ALL, AirportBlock::Nothing, 22 },
/* heli landing */
{ 20, TERMGROUP, NOTHING_block, 0 }, { 20, HELIPAD1, HELIPAD1_block, 6 }, { 20, HANGAR, 0, 23 }, { 20, TO_ALL, 0, 6 },
{ 21, TERMGROUP, NOTHING_block, 0 }, { 21, HELIPAD2, HELIPAD2_block, 7 }, { 21, HANGAR, 0, 23 }, { 21, TO_ALL, 0, 7 },
{ 22, TERMGROUP, NOTHING_block, 0 }, { 22, HELIPAD3, HELIPAD3_block, 8 }, { 22, HANGAR, 0, 23 }, { 22, TO_ALL, 0, 8 },
{ 23, TO_ALL, HANGAR2_AREA_block, 24 }, // need to go to helihangar when waiting in air
{ 24, TO_ALL, HANGAR2_AREA_block, 1 },
{ 25, TO_ALL, NOTHING_block, 26 },
{ 26, TO_ALL, NOTHING_block, 27 },
{ 27, TO_ALL, NOTHING_block, 2 },
{ 28, TO_ALL, NOTHING_block, 29 },
{ 29, TO_ALL, NOTHING_block, 30 },
{ 30, TO_ALL, NOTHING_block, 31 },
{ 31, TO_ALL, NOTHING_block, 32 },
{ 32, TO_ALL, NOTHING_block, 25 },
{ MAX_ELEMENTS, TO_ALL, 0, 0 } // end marker. DO NOT REMOVE
{ 20, TERMGROUP, AirportBlock::Nothing, 0 }, { 20, HELIPAD1, AirportBlock::Helipad1, 6 }, { 20, HANGAR, {}, 23 }, { 20, TO_ALL, {}, 6 },
{ 21, TERMGROUP, AirportBlock::Nothing, 0 }, { 21, HELIPAD2, AirportBlock::Helipad2, 7 }, { 21, HANGAR, {}, 23 }, { 21, TO_ALL, {}, 7 },
{ 22, TERMGROUP, AirportBlock::Nothing, 0 }, { 22, HELIPAD3, AirportBlock::Helipad3, 8 }, { 22, HANGAR, {}, 23 }, { 22, TO_ALL, {}, 8 },
{ 23, TO_ALL, AirportBlock::Hangar2Area, 24 }, // need to go to helihangar when waiting in air
{ 24, TO_ALL, AirportBlock::Hangar2Area, 1 },
{ 25, TO_ALL, AirportBlock::Nothing, 26 },
{ 26, TO_ALL, AirportBlock::Nothing, 27 },
{ 27, TO_ALL, AirportBlock::Nothing, 2 },
{ 28, TO_ALL, AirportBlock::Nothing, 29 },
{ 29, TO_ALL, AirportBlock::Nothing, 30 },
{ 30, TO_ALL, AirportBlock::Nothing, 31 },
{ 31, TO_ALL, AirportBlock::Nothing, 32 },
{ 32, TO_ALL, AirportBlock::Nothing, 25 },
{ MAX_ELEMENTS, TO_ALL, {}, 0 } // end marker. DO NOT REMOVE
};
#endif /* AIRPORT_MOVEMENT_H */

View File

@ -853,7 +853,7 @@ void Vehicle::PreDestructor()
Station *st = GetTargetAirportIfValid(a);
if (st != nullptr) {
const auto &layout = st->airport.GetFTA()->layout;
CLRBITS(st->airport.flags, layout[a->previous_pos].block | layout[a->pos].block);
st->airport.blocks.Reset(layout[a->previous_pos].blocks | layout[a->pos].blocks);
}
}