diff --git a/src/ai/api/ai_airport.cpp b/src/ai/api/ai_airport.cpp index 13b62ce435..fb6fbbd71b 100644 --- a/src/ai/api/ai_airport.cpp +++ b/src/ai/api/ai_airport.cpp @@ -96,7 +96,7 @@ if (st->owner != _current_company) return -1; if ((st->facilities & FACIL_AIRPORT) == 0) return -1; - return st->airport.GetSpec()->nof_depots; + return st->airport.GetNumHangars(); } /* static */ TileIndex AIAirport::GetHangarOfAirport(TileIndex tile) diff --git a/src/ai/api/ai_depotlist.cpp b/src/ai/api/ai_depotlist.cpp index bade09bcdf..de3433834b 100644 --- a/src/ai/api/ai_depotlist.cpp +++ b/src/ai/api/ai_depotlist.cpp @@ -29,8 +29,7 @@ AIDepotList::AIDepotList(AITile::TransportType transport_type) const Station *st; FOR_ALL_STATIONS(st) { if (st->owner == ::_current_company) { - const AirportSpec *as = st->airport.GetSpec(); - for (uint i = 0; i < as->nof_depots; i++) { + for (uint i = 0; i < st->airport.GetNumHangars(); i++) { this->AddItem(st->airport.GetHangarTile(i)); } } diff --git a/src/airport.cpp b/src/airport.cpp index 950c906c39..b980e53e0f 100644 --- a/src/airport.cpp +++ b/src/airport.cpp @@ -13,13 +13,13 @@ #include "debug.h" #include "airport.h" #include "map_type.h" -#include "table/airport_movement.h" #include "core/alloc_func.hpp" #include "date_func.h" #include "settings_type.h" #include "newgrf_airport.h" #include "station_base.h" #include "table/strings.h" +#include "table/airport_movement.h" #include "table/airporttile_ids.h" /* Uncomment this to print out a full report of the airport-structure diff --git a/src/newgrf.cpp b/src/newgrf.cpp index c2bc7169ef..6005784304 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2509,7 +2509,7 @@ static void DuplicateTileTable(AirportSpec *as) MemCpyT(table_list[i], as->table[i], num_tiles); } as->table = table_list; - TileIndexDiffC *depot_table = MallocT(as->nof_depots); + HangarTileTable *depot_table = MallocT(as->nof_depots); MemCpyT(depot_table, as->depot_table, as->nof_depots); as->depot_table = depot_table; } diff --git a/src/newgrf_airport.h b/src/newgrf_airport.h index 49a2cc7541..004a7934f5 100644 --- a/src/newgrf_airport.h +++ b/src/newgrf_airport.h @@ -46,6 +46,12 @@ enum TTDPAirportType { ATP_TTDP_OILRIG, ///< Same as AT_OILRIG }; +/** A list of all hangar tiles in an airport */ +struct HangarTileTable { + TileIndexDiffC ti; + byte hangar_num; +}; + /** * Defines the data structure for an airport. */ @@ -53,8 +59,8 @@ struct AirportSpec { const struct AirportFTAClass *fsm; ///< the finite statemachine for the default airports const AirportTileTable * const *table; ///< list of the tiles composing the airport byte num_table; ///< number of elements in the table - const TileIndexDiffC *depot_table; ///< gives the position of the depots on the airports - byte nof_depots; ///< the number of depots in this airport + const HangarTileTable *depot_table; ///< gives the position of the depots on the airports + byte nof_depots; ///< the number of hangar tiles in this airport byte size_x; ///< size of airport in x direction byte size_y; ///< size of airport in y direction byte noise_level; ///< noise that this airport generates diff --git a/src/station_base.h b/src/station_base.h index 9a0da91dc1..83ef418258 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -70,9 +70,38 @@ struct Airport : public TileArea { FORCEINLINE TileIndex GetHangarTile(uint hangar_num) const { - assert(this->tile != INVALID_TILE); - assert(hangar_num < this->GetSpec()->nof_depots); - return this->tile + ToTileIndexDiff(this->GetSpec()->depot_table[hangar_num]); + const AirportSpec *as = this->GetSpec(); + for (uint i = 0; i < as->nof_depots; i++) { + if (as->depot_table[i].hangar_num == hangar_num) { + return this->tile + ToTileIndexDiff(as->depot_table[i].ti); + } + } + NOT_REACHED(); + } + + FORCEINLINE uint GetHangarNum(TileIndex tile) const + { + const AirportSpec *as = this->GetSpec(); + for (uint i = 0; i < as->nof_depots; i++) { + if (this->tile + ToTileIndexDiff(as->depot_table[i].ti) == tile) { + return as->depot_table[i].hangar_num; + } + } + NOT_REACHED(); + } + + FORCEINLINE uint GetNumHangars() const + { + uint num = 0; + uint counted = 0; + const AirportSpec *as = this->GetSpec(); + for (uint i = 0; i < as->nof_depots; i++) { + if (!HasBit(counted, as->depot_table[i].hangar_num)) { + num++; + SetBit(counted, as->depot_table[i].hangar_num); + } + } + return num; } }; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 74ad7e060f..9a6c212800 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2294,7 +2294,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) if (flags & DC_EXEC) { const AirportSpec *as = st->airport.GetSpec(); - for (uint i = 0; i < as->nof_depots; ++i) { + for (uint i = 0; i < st->airport.GetNumHangars(); ++i) { DeleteWindowById( WC_VEHICLE_DEPOT, st->airport.GetHangarTile(i) ); @@ -2916,14 +2916,15 @@ static void AnimateTile_Station(TileIndex tile) static bool ClickTile_Station(TileIndex tile) { - const BaseStation *st = BaseStation::GetByTile(tile); + const BaseStation *bst = BaseStation::GetByTile(tile); - if (st->facilities & FACIL_WAYPOINT) { - ShowWaypointWindow(Waypoint::From(st)); + if (bst->facilities & FACIL_WAYPOINT) { + ShowWaypointWindow(Waypoint::From(bst)); } else if (IsHangar(tile)) { - ShowDepotWindow(tile, VEH_AIRCRAFT); + const Station *st = Station::From(bst); + ShowDepotWindow(st->airport.GetHangarTile(st->airport.GetHangarNum(tile)), VEH_AIRCRAFT); } else { - ShowStationViewWindow(st->index); + ShowStationViewWindow(bst->index); } return true; } diff --git a/src/table/airport_movement.h b/src/table/airport_movement.h index 2bcd94536a..0fffae2f24 100644 --- a/src/table/airport_movement.h +++ b/src/table/airport_movement.h @@ -407,7 +407,7 @@ static const AirportFTAbuildup _airport_fta_dummy[] = { /* First element of terminals array tells us how many depots there are (to know size of array) * this may be changed later when airports are moved to external file */ -static const TileIndexDiffC _airport_depots_country[] = {{3, 0}}; +static const HangarTileTable _airport_depots_country[] = { {{3, 0}, 0} }; static const byte _airport_terminal_country[] = {1, 2}; static const byte _airport_entries_country[] = {16, 15, 18, 17}; static const AirportFTAbuildup _airport_fta_country[] = { @@ -439,7 +439,7 @@ static const AirportFTAbuildup _airport_fta_country[] = { { MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE }; -static const TileIndexDiffC _airport_depots_commuter[] = { { 4, 0 } }; +static const HangarTileTable _airport_depots_commuter[] = { {{4, 0}, 0} }; static const byte _airport_terminal_commuter[] = { 1, 3 }; static const byte _airport_helipad_commuter[] = { 1, 2 }; static const byte _airport_entries_commuter[] = {22, 21, 24, 23}; @@ -490,7 +490,7 @@ static const AirportFTAbuildup _airport_fta_commuter[] = { { MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE }; -static const TileIndexDiffC _airport_depots_city[] = { { 5, 0 } }; +static const HangarTileTable _airport_depots_city[] = { {{5, 0}, 0} }; static const byte _airport_terminal_city[] = { 1, 3 }; static const byte _airport_entries_city[] = {26, 29, 27, 28}; static const AirportFTAbuildup _airport_fta_city[] = { @@ -531,7 +531,7 @@ static const AirportFTAbuildup _airport_fta_city[] = { { MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE }; -static const TileIndexDiffC _airport_depots_metropolitan[] = { { 5, 0 } }; +static const HangarTileTable _airport_depots_metropolitan[] = { {{5, 0}, 0} }; static const byte _airport_terminal_metropolitan[] = { 1, 3 }; static const byte _airport_entries_metropolitan[] = {20, 19, 22, 21}; static const AirportFTAbuildup _airport_fta_metropolitan[] = { @@ -570,7 +570,7 @@ static const AirportFTAbuildup _airport_fta_metropolitan[] = { { MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE }; -static const TileIndexDiffC _airport_depots_international[] = { { 0, 3 }, { 6, 1 } }; +static const HangarTileTable _airport_depots_international[] = { {{0, 3}, 0}, {{6, 1}, 1} }; static const byte _airport_terminal_international[] = { 2, 3, 3 }; static const byte _airport_helipad_international[] = { 1, 2 }; static const byte _airport_entries_international[] = { 38, 37, 40, 39 }; @@ -636,7 +636,7 @@ static const AirportFTAbuildup _airport_fta_international[] = { }; /* intercontinental */ -static const TileIndexDiffC _airport_depots_intercontinental[] = { { 0, 5 }, { 8, 4 } }; +static const HangarTileTable _airport_depots_intercontinental[] = { {{0, 5}, 0}, {{8, 4}, 1} }; static const byte _airport_terminal_intercontinental[] = { 2, 4, 4 }; static const byte _airport_helipad_intercontinental[] = { 1, 2 }; static const byte _airport_entries_intercontinental[] = { 44, 43, 46, 45 }; @@ -748,7 +748,7 @@ static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = { }; /* helidepots */ -static const TileIndexDiffC _airport_depots_helidepot[] = { { 1, 0 } }; +static const HangarTileTable _airport_depots_helidepot[] = { {{1, 0}, 0} }; static const byte _airport_helipad_helidepot[] = { 1, 1 }; static const byte _airport_entries_helidepot[] = { 4, 4, 4, 4 }; static const AirportFTAbuildup _airport_fta_helidepot[] = { @@ -778,7 +778,7 @@ static const AirportFTAbuildup _airport_fta_helidepot[] = { }; /* helistation */ -static const TileIndexDiffC _airport_depots_helistation[] = { { 0, 0 } }; +static const HangarTileTable _airport_depots_helistation[] = { {{0, 0}, 0} }; static const byte _airport_helipad_helistation[] = { 1, 3 }; static const byte _airport_entries_helistation[] = { 25, 25, 25, 25 }; static const AirportFTAbuildup _airport_fta_helistation[] = {