changeset 14869:bb2bddd14746 draft

(svn r19465) -Codechange: support for multi-tile hangars
author yexo <yexo@openttd.org>
date Fri, 19 Mar 2010 11:17:52 +0000
parents 9ae8ffb9d4b9
children d5a464098520
files src/ai/api/ai_airport.cpp src/ai/api/ai_depotlist.cpp src/airport.cpp src/newgrf.cpp src/newgrf_airport.h src/station_base.h src/station_cmd.cpp src/table/airport_movement.h
diffstat 8 files changed, 60 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- a/src/ai/api/ai_depotlist.cpp
+++ b/src/ai/api/ai_depotlist.cpp
@@ -29,8 +29,7 @@
 			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));
 					}
 				}
--- 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
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -2509,7 +2509,7 @@
 		MemCpyT(table_list[i], as->table[i], num_tiles);
 	}
 	as->table = table_list;
-	TileIndexDiffC *depot_table = MallocT<TileIndexDiffC>(as->nof_depots);
+	HangarTileTable *depot_table = MallocT<HangarTileTable>(as->nof_depots);
 	MemCpyT(depot_table, as->depot_table, as->nof_depots);
 	as->depot_table = depot_table;
 }
--- a/src/newgrf_airport.h
+++ b/src/newgrf_airport.h
@@ -46,6 +46,12 @@
 	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 @@
 	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
--- a/src/station_base.h
+++ b/src/station_base.h
@@ -70,9 +70,38 @@
 
 	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;
 	}
 };
 
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -2294,7 +2294,7 @@
 
 	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 bool ClickTile_Station(TileIndex tile)
 {
-	const BaseStation *st = BaseStation::GetByTile(tile);
-
-	if (st->facilities & FACIL_WAYPOINT) {
-		ShowWaypointWindow(Waypoint::From(st));
+	const BaseStation *bst = BaseStation::GetByTile(tile);
+
+	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;
 }
--- a/src/table/airport_movement.h
+++ b/src/table/airport_movement.h
@@ -407,7 +407,7 @@
 
 /* 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 @@
 	{ 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 @@
 	{ 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 @@
 	{ 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 @@
 	{ 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 @@
 };
 
 /* 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 @@
 };
 
 /* 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 @@
 };
 
 /* 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[] = {