diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -969,7 +969,8 @@ static bool AircraftController(Vehicle * } // 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 @@ static bool AircraftController(Vehicle * 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; diff --git a/src/airport.cpp b/src/airport.cpp --- a/src/airport.cpp +++ b/src/airport.cpp @@ -41,7 +41,8 @@ void InitializeAirports(void) _airport_fta_country, _airport_depots_country, lengthof(_airport_depots_country), - 4, 3 + 4, 3, + 0 ); CityAirport = new AirportFTAClass( @@ -53,7 +54,8 @@ void InitializeAirports(void) _airport_fta_city, _airport_depots_city, lengthof(_airport_depots_city), - 6, 6 + 6, 6, + 0 ); MetropolitanAirport = new AirportFTAClass( @@ -65,7 +67,8 @@ void InitializeAirports(void) _airport_fta_metropolitan, _airport_depots_metropolitan, lengthof(_airport_depots_metropolitan), - 6, 6 + 6, 6, + 0 ); InternationalAirport = new AirportFTAClass( @@ -77,7 +80,8 @@ void InitializeAirports(void) _airport_fta_international, _airport_depots_international, lengthof(_airport_depots_international), - 7, 7 + 7, 7, + 0 ); IntercontinentalAirport = new AirportFTAClass( @@ -89,7 +93,8 @@ void InitializeAirports(void) _airport_fta_intercontinental, _airport_depots_intercontinental, lengthof(_airport_depots_intercontinental), - 9,11 + 9, 11, + 0 ); Heliport = new AirportFTAClass( @@ -101,7 +106,8 @@ void InitializeAirports(void) _airport_fta_heliport_oilrig, NULL, 0, - 1, 1 + 1, 1, + 60 ); Oilrig = new AirportFTAClass( @@ -113,7 +119,8 @@ void InitializeAirports(void) _airport_fta_heliport_oilrig, NULL, 0, - 1, 1 + 1, 1, + 54 ); CommuterAirport = new AirportFTAClass( @@ -125,7 +132,8 @@ void InitializeAirports(void) _airport_fta_commuter, _airport_depots_commuter, lengthof(_airport_depots_commuter), - 5,4 + 5, 4, + 0 ); HeliDepot = new AirportFTAClass( @@ -137,7 +145,8 @@ void InitializeAirports(void) _airport_fta_helidepot, _airport_depots_helidepot, lengthof(_airport_depots_helidepot), - 2,2 + 2, 2, + 0 ); HeliStation = new AirportFTAClass( @@ -149,7 +158,8 @@ void InitializeAirports(void) _airport_fta_helistation, _airport_depots_helistation, lengthof(_airport_depots_helistation), - 4,2 + 4, 2, + 0 ); } @@ -187,7 +197,8 @@ AirportFTAClass::AirportFTAClass( 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 @@ AirportFTAClass::AirportFTAClass( 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; diff --git a/src/airport.h b/src/airport.h --- a/src/airport.h +++ b/src/airport.h @@ -143,7 +143,8 @@ typedef struct AirportFTAClass { const TileIndexDiffC *depots, byte nof_depots, uint size_x, - uint size_y + uint size_y, + byte delta_z ); ~AirportFTAClass(); @@ -165,6 +166,7 @@ typedef struct AirportFTAClass { 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 diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -288,7 +288,8 @@ enum { 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 @@ static byte MapAircraftMovementState(con 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 @@ static byte MapAircraftMovementState(con 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;