changeset 6020:266a75e54b50 draft

(svn r8743) -Fix -Codechange: Add a Z adjustment attribute for helicopter pads to AirportFTAClass to get rid of some special cases for oilrigs and heliports
author tron <tron@openttd.org>
date Thu, 15 Feb 2007 07:43:06 +0000
parents 126f83bc2f99
children 3cfdf096e874
files src/aircraft_cmd.cpp src/airport.cpp src/airport.h src/newgrf_engine.cpp
diffstat 4 files changed, 41 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -969,7 +969,8 @@
 	}
 
 	// get airport moving data
-	const AirportMovingData *amd = GetAirport(st->airport_type)->MovingData(v->u.air.pos);
+	const AirportFTAClass *afc = GetAirport(st->airport_type);
+	const AirportMovingData *amd = afc->MovingData(v->u.air.pos);
 
 	// Helicopter raise
 	if (amd->flag & AMED_HELI_RAISE) {
@@ -1011,9 +1012,7 @@
 			v->tile = st->airport_tile;
 
 			// Find altitude of landing position.
-			z = GetSlopeZ(x, y) + 1;
-			if (st->airport_type == AT_OILRIG) z += 54;
-			if (st->airport_type == AT_HELIPORT) z += 60;
+			z = GetSlopeZ(x, y) + 1 + afc->delta_z;
 
 			if (z == v->z_pos) {
 				u = v->next->next;
--- a/src/airport.cpp
+++ b/src/airport.cpp
@@ -41,7 +41,8 @@
 		_airport_fta_country,
 		_airport_depots_country,
 		lengthof(_airport_depots_country),
-		4, 3
+		4, 3,
+		0
 	);
 
 	CityAirport = new AirportFTAClass(
@@ -53,7 +54,8 @@
 		_airport_fta_city,
 		_airport_depots_city,
 		lengthof(_airport_depots_city),
-		6, 6
+		6, 6,
+		0
 	);
 
 	MetropolitanAirport = new AirportFTAClass(
@@ -65,7 +67,8 @@
 		_airport_fta_metropolitan,
 		_airport_depots_metropolitan,
 		lengthof(_airport_depots_metropolitan),
-		6, 6
+		6, 6,
+		0
 	);
 
 	InternationalAirport = new AirportFTAClass(
@@ -77,7 +80,8 @@
 		_airport_fta_international,
 		_airport_depots_international,
 		lengthof(_airport_depots_international),
-		7, 7
+		7, 7,
+		0
 	);
 
 	IntercontinentalAirport = new AirportFTAClass(
@@ -89,7 +93,8 @@
 		_airport_fta_intercontinental,
 		_airport_depots_intercontinental,
 		lengthof(_airport_depots_intercontinental),
-		9,11
+		9, 11,
+		0
 	);
 
 	Heliport = new AirportFTAClass(
@@ -101,7 +106,8 @@
 		_airport_fta_heliport_oilrig,
 		NULL,
 		0,
-		1, 1
+		1, 1,
+		60
 	);
 
 	Oilrig = new AirportFTAClass(
@@ -113,7 +119,8 @@
 		_airport_fta_heliport_oilrig,
 		NULL,
 		0,
-		1, 1
+		1, 1,
+		54
 	);
 
 	CommuterAirport = new AirportFTAClass(
@@ -125,7 +132,8 @@
 		_airport_fta_commuter,
 		_airport_depots_commuter,
 		lengthof(_airport_depots_commuter),
-		5,4
+		5, 4,
+		0
 	);
 
 	HeliDepot = new AirportFTAClass(
@@ -137,7 +145,8 @@
 		_airport_fta_helidepot,
 		_airport_depots_helidepot,
 		lengthof(_airport_depots_helidepot),
-		2,2
+		2, 2,
+		0
 	);
 
 	HeliStation = new AirportFTAClass(
@@ -149,7 +158,8 @@
 		_airport_fta_helistation,
 		_airport_depots_helistation,
 		lengthof(_airport_depots_helistation),
-		4,2
+		4, 2,
+		0
 	);
 }
 
@@ -187,7 +197,8 @@
 	const TileIndexDiffC *depots_,
 	const byte nof_depots_,
 	uint size_x_,
-	uint size_y_
+	uint size_y_,
+	byte delta_z_
 ) :
 	moving_data(moving_data_),
 	terminals(terminals_),
@@ -197,7 +208,8 @@
 	nofelements(AirportGetNofElements(apFA)),
 	entry_point(entry_point_),
 	size_x(size_x_),
-	size_y(size_y_)
+	size_y(size_y_),
+	delta_z(delta_z_)
 {
 	byte nofterminalgroups, nofhelipadgroups;
 
--- a/src/airport.h
+++ b/src/airport.h
@@ -143,7 +143,8 @@
 			const TileIndexDiffC *depots,
 			byte nof_depots,
 			uint size_x,
-			uint size_y
+			uint size_y,
+			byte delta_z
 		);
 
 		~AirportFTAClass();
@@ -165,6 +166,7 @@
 	AcceptPlanesByte acc_planes;          // accept airplanes or helicopters or both
 	byte size_x;
 	byte size_y;
+	byte delta_z;                         // Z adjustment for helicopter pads
 } AirportFTAClass;
 
 // internal structure used in openttd - Finite sTate mAchine --> FTA
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -288,7 +288,8 @@
 static byte MapAircraftMovementState(const Vehicle *v)
 {
 	const Station *st = GetStation(v->u.air.targetairport);
-	byte amdflag = GetAirport(st->airport_type)->MovingData(v->u.air.pos)->flag;
+	const AirportFTAClass *afc = GetAirport(st->airport_type);
+	byte amdflag = afc->MovingData(v->u.air.pos)->flag;
 
 	switch (v->u.air.state) {
 		case HANGAR:
@@ -347,26 +348,11 @@
 			return AMS_TTDP_CLIMBING;
 
 		case HELITAKEOFF: // Helicopter is moving to take off position.
-			switch (st->airport_type) {
-				case AT_SMALL:
-				case AT_LARGE:
-				case AT_METROPOLITAN:
-				case AT_INTERNATIONAL:
-				case AT_COMMUTER:
-				case AT_INTERCON:
-				/* Note, Helidepot and Helistation are treated as airports as
-				 * helicopters are taking off from ground level. */
-				case AT_HELIDEPOT:
-				case AT_HELISTATION:
-					if (amdflag & AMED_HELI_RAISE) return AMS_TTDP_HELI_TAKEOFF_AIRPORT;
-					return AMS_TTDP_TO_JUNCTION;
-
-				case AT_HELIPORT:
-				case AT_OILRIG:
-					return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
-
-				default:
-					return AMS_TTDP_HELI_TAKEOFF_AIRPORT;
+			if (afc->delta_z == 0) {
+				return amdflag & AMED_HELI_RAISE ?
+					AMS_TTDP_HELI_TAKEOFF_AIRPORT : AMS_TTDP_TO_JUNCTION;
+			} else {
+				return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
 			}
 
 		case FLYING:
@@ -383,18 +369,11 @@
 		case HELILANDING:
 		case HELIENDLANDING: // Helicoptor is decending.
 			if (amdflag & AMED_HELI_LOWER) {
-				switch (st->airport_type) {
-					case AT_HELIPORT:
-					case AT_OILRIG:
-						return AMS_TTDP_HELI_LAND_HELIPORT;
-
-					default:
-						/* Note, Helidepot and Helistation are treated as airports as
-						 * helicopters are landing at ground level. */
-						return AMS_TTDP_HELI_LAND_AIRPORT;
-				}
+				return afc->delta_z == 0 ?
+					AMS_TTDP_HELI_LAND_AIRPORT : AMS_TTDP_HELI_LAND_HELIPORT;
+			} else {
+				return AMS_TTDP_FLIGHT_TO_TOWER;
 			}
-			return AMS_TTDP_FLIGHT_TO_TOWER;
 
 		default:
 			return AMS_TTDP_HANGAR;