summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aircraft_cmd.c33
-rw-r--r--airport.c101
-rw-r--r--airport.h78
-rw-r--r--airport_gui.c59
-rw-r--r--airport_movement.h424
-rw-r--r--data/airports.grfbin0 -> 9110 bytes
-rw-r--r--gfxinit.c3
-rw-r--r--lang/english.txt23
-rw-r--r--newgrf_engine.c34
-rw-r--r--saveload.c2
-rw-r--r--station.h4
-rw-r--r--station_cmd.c62
-rw-r--r--station_map.h14
-rw-r--r--table/sprites.h16
-rw-r--r--table/station_land.h389
15 files changed, 1139 insertions, 103 deletions
diff --git a/aircraft_cmd.c b/aircraft_cmd.c
index 9d3d4a7ec..5a664abdd 100644
--- a/aircraft_cmd.c
+++ b/aircraft_cmd.c
@@ -91,9 +91,8 @@ static bool HaveHangarInOrderList(Vehicle *v)
FOR_VEHICLE_ORDERS(v, order) {
const Station *st = GetStation(order->station);
if (st->owner == v->owner && st->facilities & FACIL_AIRPORT) {
- // If an airport doesn't have terminals (so no landing space for airports),
- // it surely doesn't have any hangars
- if (GetAirport(st->airport_type)->terminals != NULL)
+ // If an airport doesn't have a hangar, skip it
+ if (GetAirport(st->airport_type)->nof_depots != 0)
return true;
}
}
@@ -197,6 +196,7 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
Vehicle *vl[3], *v, *u, *w;
UnitID unit_num;
const AircraftVehicleInfo *avi;
+ const Station *st2;
Engine *e;
if (!IsEngineBuildable(p1, VEH_Aircraft)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
@@ -217,6 +217,12 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
}
+ // prevent building of aircraft in helidepot/helistation
+ st2 = GetStationByTile(tile);
+ if ((avi->subtype != 0) && (GetAirport(st2->airport_type)->acc_planes == HELICOPTERS_ONLY)) {
+ return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
+ }
+
unit_num = (HASBIT(p2, 0) == true) ? 0 : GetFreeUnitNumber(VEH_Aircraft);
if (unit_num > _patches.max_aircraft)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -450,7 +456,7 @@ int32 CmdStartStopAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) return CMD_ERROR;
// cannot stop airplane when in flight, or when taking off / landing
- if (v->u.air.state >= STARTTAKEOFF)
+ if (v->u.air.state >= STARTTAKEOFF && v->u.air.state < TERM7)
return_cmd_error(STR_A017_AIRCRAFT_IS_IN_FLIGHT);
if (flags & DC_EXEC) {
@@ -1082,6 +1088,8 @@ static void HandleCrashedAircraft(Vehicle *v)
// small airports use AIRPORT_BUSY, city airports use RUNWAY_IN_OUT_block, etc.
// but they all share the same number
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
BeginVehicleMove(v);
EndVehicleMove(v);
@@ -1272,7 +1280,7 @@ static void MaybeCrashAirplane(Vehicle *v)
//FIXME -- MaybeCrashAirplane -> increase crashing chances of very modern airplanes on smaller than AT_METROPOLITAN airports
prob = 0x10000 / 1500;
- if (st->airport_type == AT_SMALL && AircraftVehInfo(v->engine_type)->subtype & AIR_FAST && !_cheats.no_jetcrash.value) {
+ if (((st->airport_type == AT_SMALL) || (st->airport_type == AT_COMMUTER)) && (AircraftVehInfo(v->engine_type)->subtype & AIR_FAST) && !_cheats.no_jetcrash.value) {
prob = 0x10000 / 20;
}
@@ -1669,7 +1677,7 @@ static void AircraftEventHandler_HeliEndLanding(Vehicle *v, const AirportFTAClas
if (v->current_order.type == OT_GOTO_STATION) {
if (AirportFindFreeHelipad(v, Airport)) return;
}
- v->u.air.state = (Airport->terminals != NULL) ? HANGAR : HELITAKEOFF;
+ v->u.air.state = (Airport->nof_depots != 0) ? HANGAR : HELITAKEOFF;
}
typedef void AircraftStateHandler(Vehicle *v, const AirportFTAClass *Airport);
@@ -1693,6 +1701,10 @@ static AircraftStateHandler * const _aircraft_state_handlers[] = {
AircraftEventHandler_EndLanding, // ENDLANDING = 16
AircraftEventHandler_HeliLanding, // HELILANDING = 17
AircraftEventHandler_HeliEndLanding,// HELIENDLANDING = 18
+ AircraftEventHandler_AtTerminal, // TERM7 = 19
+ AircraftEventHandler_AtTerminal, // TERM8 = 20
+ AircraftEventHandler_AtTerminal, // HELIPAD3 = 21
+ AircraftEventHandler_AtTerminal, // HELIPAD4 = 22
};
static void AirportClearBlock(const Vehicle* v, const AirportFTAClass* Airport)
@@ -1796,10 +1808,9 @@ static bool AirportSetBlocks(Vehicle *v, AirportFTA *current_pos, const AirportF
AirportFTA* current;
// if the next position is in another block, check it and wait until it is free
- if (Airport->layout[current_pos->position].block != next->block) {
+ if ((Airport->layout[current_pos->position].block & next->block) != next->block) {
uint32 airport_flags = next->block;
Station* st = GetStation(v->u.air.targetairport);
-
//search for all all elements in the list with the same state, and blocks != N
// this means more blocks should be checked/set
current = current_pos;
@@ -1833,10 +1844,10 @@ static bool FreeTerminal(Vehicle *v, byte i, byte last_terminal)
{
Station *st = GetStation(v->u.air.targetairport);
for (; i < last_terminal; i++) {
- if (!HASBIT(st->airport_flags, i)) {
+ if (!HASBIT(st->airport_flags, _airport_terminal_flag[i])) {
// TERMINAL# HELIPAD#
- v->u.air.state = i + TERM1; // start moving to that terminal/helipad
- SETBIT(st->airport_flags, i); // occupy terminal/helipad
+ v->u.air.state = _airport_terminal_state[i]; // start moving to that terminal/helipad
+ SETBIT(st->airport_flags, _airport_terminal_flag[i]); // occupy terminal/helipad
return true;
}
}
diff --git a/airport.c b/airport.c
index 1fb1369ef..2a06c80bb 100644
--- a/airport.c
+++ b/airport.c
@@ -15,12 +15,16 @@ static AirportFTAClass* Oilrig;
static AirportFTAClass* Heliport;
static AirportFTAClass* MetropolitanAirport;
static AirportFTAClass* InternationalAirport;
+static AirportFTAClass* CommuterAirport;
+static AirportFTAClass* HeliDepot;
+static AirportFTAClass* IntercontinentalAirport;
+static AirportFTAClass* HeliStation;
static void AirportFTAClass_Constructor(AirportFTAClass *Airport,
- const byte *terminals, const byte *helipads,
- const byte entry_point, const byte acc_planes,
- const AirportFTAbuildup *FA,
- const TileIndexDiffC *depots, const byte nof_depots,
+ const byte *terminals, const byte *helipads,
+ const byte entry_point, const byte acc_planes,
+ const AirportFTAbuildup *FA,
+ const TileIndexDiffC *depots, const byte nof_depots,
uint size_x, uint size_y
);
static void AirportFTAClass_Destructor(AirportFTAClass *Airport);
@@ -93,6 +97,21 @@ void InitializeAirports(void)
7, 7
);
+ // intercontintental airport
+ IntercontinentalAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
+
+ AirportFTAClass_Constructor(
+ IntercontinentalAirport,
+ _airport_terminal_intercontinental,
+ _airport_helipad_intercontinental,
+ 43,
+ ALL,
+ _airport_fta_intercontinental,
+ _airport_depots_intercontinental,
+ lengthof(_airport_depots_intercontinental),
+ 9,11
+ );
+
// heliport, oilrig
Heliport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass));
@@ -109,6 +128,52 @@ void InitializeAirports(void)
);
Oilrig = Heliport; // exactly the same structure for heliport/oilrig, so share state machine
+
+ // commuter airport
+ CommuterAirport = malloc(sizeof(AirportFTAClass));
+
+ AirportFTAClass_Constructor(
+ CommuterAirport,
+ _airport_terminal_commuter,
+ _airport_helipad_commuter,
+ 22,
+ ALL,
+ _airport_fta_commuter,
+ _airport_depots_commuter,
+ lengthof(_airport_depots_commuter),
+ 5,4
+ );
+
+ // helidepot airport
+ HeliDepot = malloc(sizeof(AirportFTAClass));
+
+ AirportFTAClass_Constructor(
+ HeliDepot,
+ NULL,
+ _airport_helipad_helidepot,
+ 4,
+ HELICOPTERS_ONLY,
+ _airport_fta_helidepot,
+ _airport_depots_helidepot,
+ lengthof(_airport_depots_helidepot),
+ 2,2
+ );
+
+ // helistation airport
+ HeliStation = malloc(sizeof(AirportFTAClass));
+
+ AirportFTAClass_Constructor(
+ HeliStation,
+ NULL,
+ _airport_helipad_helistation,
+ 25,
+ HELICOPTERS_ONLY,
+ _airport_fta_helistation,
+ _airport_depots_helistation,
+ lengthof(_airport_depots_helistation),
+ 4,2
+ );
+
}
void UnInitializeAirports(void)
@@ -118,6 +183,10 @@ void UnInitializeAirports(void)
AirportFTAClass_Destructor(Heliport);
AirportFTAClass_Destructor(MetropolitanAirport);
AirportFTAClass_Destructor(InternationalAirport);
+ AirportFTAClass_Destructor(CommuterAirport);
+ AirportFTAClass_Destructor(HeliDepot);
+ AirportFTAClass_Destructor(IntercontinentalAirport);
+ AirportFTAClass_Destructor(HeliStation);
}
static void AirportFTAClass_Constructor(AirportFTAClass *Airport,
@@ -317,6 +386,10 @@ static const char* const _airport_heading_strings[] = {
"ENDLANDING",
"HELILANDING",
"HELIENDLANDING",
+ "TERM7",
+ "TERM8",
+ "HELIPAD3",
+ "HELIPAD4",
"DUMMY" // extra heading for 255
};
@@ -369,17 +442,21 @@ const AirportFTAClass* GetAirport(const byte airport_type)
//FIXME -- AircraftNextAirportPos_and_Order -> Needs something nicer, don't like this code
// needs constant change if more airports are added
switch (airport_type) {
- case AT_SMALL: Airport = CountryAirport; break;
- case AT_LARGE: Airport = CityAirport; break;
- case AT_METROPOLITAN: Airport = MetropolitanAirport; break;
- case AT_HELIPORT: Airport = Heliport; break;
- case AT_OILRIG: Airport = Oilrig; break;
+ case AT_SMALL: Airport = CountryAirport; break;
+ case AT_LARGE: Airport = CityAirport; break;
+ case AT_METROPOLITAN: Airport = MetropolitanAirport; break;
+ case AT_HELIPORT: Airport = Heliport; break;
+ case AT_OILRIG: Airport = Oilrig; break;
case AT_INTERNATIONAL: Airport = InternationalAirport; break;
+ case AT_COMMUTER: Airport = CommuterAirport; break;
+ case AT_HELIDEPOT: Airport = HeliDepot; break;
+ case AT_INTERCON: Airport = IntercontinentalAirport; break;
+ case AT_HELISTATION: Airport = HeliStation; break;
default:
#ifdef DEBUG__
printf("Airport AircraftNextAirportPos_and_Order not yet implemented\n");
#endif
- assert(airport_type <= AT_INTERNATIONAL);
+ assert(airport_type <= AT_HELISTATION);
}
return Airport;
}
@@ -399,5 +476,9 @@ uint32 GetValidAirports(void)
// 1990-1-1 is --> 25568
if (_date >= 21915) SETBIT(bytemask, 3); // metropilitan airport 1980
if (_date >= 25568) SETBIT(bytemask, 4); // international airport 1990
+ if (_date >= 23011) SETBIT(bytemask, 5); // commuter airport 1983
+ if (_date >= 20455) SETBIT(bytemask, 6); // helidepot 1976
+ if (_date >= 29951) SETBIT(bytemask, 7); // intercontinental airport 2002
+ if (_date >= 21915) SETBIT(bytemask, 8); // helistation 1980
return bytemask;
}
diff --git a/airport.h b/airport.h
index 3497bccdb..a8ca84c1c 100644
--- a/airport.h
+++ b/airport.h
@@ -3,10 +3,10 @@
#ifndef AIRPORT_H
#define AIRPORT_H
-enum {MAX_TERMINALS = 6};
-enum {MAX_HELIPADS = 2};
+enum {MAX_TERMINALS = 10};
+enum {MAX_HELIPADS = 4};
enum {MAX_ELEMENTS = 255};
-enum {MAX_HEADINGS = 18};
+enum {MAX_HEADINGS = 22};
// Airport types
enum {
@@ -15,7 +15,11 @@ enum {
AT_HELIPORT = 2,
AT_METROPOLITAN = 3,
AT_INTERNATIONAL = 4,
- AT_OILRIG = 15,
+ AT_COMMUTER = 5,
+ AT_HELIDEPOT = 6,
+ AT_INTERCON = 7,
+ AT_HELISTATION = 8,
+ AT_OILRIG = 15
};
// do not change unless you change v->subtype too. This aligns perfectly with its current setting
@@ -38,27 +42,36 @@ enum {
/* Movement States on Airports (headings target) */
enum {
- TO_ALL,
- HANGAR,
- TERM1,
- TERM2,
- TERM3,
- TERM4,
- TERM5,
- TERM6,
- HELIPAD1,
- HELIPAD2,
- TAKEOFF,
- STARTTAKEOFF,
- ENDTAKEOFF,
- HELITAKEOFF,
- FLYING,
- LANDING,
- ENDLANDING,
- HELILANDING,
- HELIENDLANDING,
+ TO_ALL = 0,
+ HANGAR = 1,
+ TERM1 = 2,
+ TERM2 = 3,
+ TERM3 = 4,
+ TERM4 = 5,
+ TERM5 = 6,
+ TERM6 = 7,
+ HELIPAD1 = 8,
+ HELIPAD2 = 9,
+ TAKEOFF = 10,
+ STARTTAKEOFF = 11,
+ ENDTAKEOFF = 12,
+ HELITAKEOFF = 13,
+ FLYING = 14,
+ LANDING = 15,
+ ENDLANDING = 16,
+ HELILANDING = 17,
+ HELIENDLANDING = 18,
+ TERM7 = 19,
+ TERM8 = 20,
+ HELIPAD3 = 21,
+ HELIPAD4 = 22
};
+// this maps the terminal to its corresponding state and block flag
+// currently set for 10 terms, 4 helipads
+static const byte _airport_terminal_state[] = {2, 3, 4, 5, 6, 7, 19, 20, 0, 0, 8, 9, 21, 22};
+static const byte _airport_terminal_flag[] = {0, 1, 2, 3, 4, 5, 22, 23, 0, 0, 6, 7, 24, 25};
+
/* Movement Blocks on Airports */
// blocks (eg_airport_flags)
enum {
@@ -86,7 +99,24 @@ enum {
TERM_GROUP2_EXIT1_block = 1 << 19,
TERM_GROUP2_EXIT2_block = 1 << 20,
PRE_HELIPAD_block = 1 << 21,
- NOTHING_block = 1 << 30,
+
+// blocks for new airports
+ TERM7_block = 1 << 22,
+ TERM8_block = 1 << 23,
+ TERM9_block = 1 << 24,
+ HELIPAD3_block = 1 << 24,
+ TERM10_block = 1 << 25,
+ HELIPAD4_block = 1 << 25,
+ HANGAR1_AREA_block = 1 << 26,
+ OUT_WAY2_block = 1 << 27,
+ IN_WAY2_block = 1 << 28,
+ RUNWAY_IN2_block = 1 << 29,
+ RUNWAY_OUT2_block = 1 << 10, // note re-uses TAXIWAY_BUSY
+ HELIPAD_GROUP_block = 1 << 13, // note re-uses AIRPORT_ENTRANCE
+ OUT_WAY_block2 = 1 << 31,
+// end of new blocks
+
+ NOTHING_block = 1 << 30
};
typedef struct AirportMovingData {
diff --git a/airport_gui.c b/airport_gui.c
index bad915960..333375409 100644
--- a/airport_gui.c
+++ b/airport_gui.c
@@ -159,12 +159,12 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
/* 'Country Airport' starts at widget 3, and if its bit is set, it is
* available, so take its opposite value to set the disabled_state. There
- * are only 5 available airports, so XOR with 0x1F (1 1111) */
- w->disabled_state = (avail_airports ^ 0x1F) << 3;
+ * are 9 buildable airports, so XOR with 0x01FF (1 1111 1111) */
+ w->disabled_state = (avail_airports ^ 0x01FF) << 7;
_selected_airport_type = sel;
- // select default the coverage area to 'Off' (8)
- w->click_state = ((1<<3) << sel) | ((1<<8) << _station_show_coverage);
+ // select default the coverage area to 'Off' (16)
+ w->click_state = ((1<<7) << sel) | ((1<<16) << _station_show_coverage);
airport = GetAirport(sel);
SetTileSelectSize(airport->size_x, airport->size_y);
@@ -176,6 +176,10 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
case AT_LARGE: rad = CA_AIR_LARGE; break;
case AT_METROPOLITAN: rad = CA_AIR_METRO; break;
case AT_INTERNATIONAL: rad = CA_AIR_INTER; break;
+ case AT_COMMUTER: rad = CA_AIR_COMMUTER; break;
+ case AT_HELIDEPOT: rad = CA_AIR_HELIDEPOT; break;
+ case AT_INTERCON: rad = CA_AIR_INTERCON; break;
+ case AT_HELISTATION: rad = CA_AIR_HELISTATION; break;
}
}
@@ -183,21 +187,24 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
DrawWindowWidgets(w);
// strings such as 'Size' and 'Coverage Area'
- DrawStringCentered(74, 16, STR_305B_SIZE, 0);
- DrawStringCentered(74, 78, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
- DrawStationCoverageAreaText(2, 104, (uint)-1, rad);
+ DrawStringCentered(74, 16, STR_SMALL_AIRPORTS, 0);
+ DrawStringCentered(74, 54, STR_LARGE_AIRPORTS, 0);
+ DrawStringCentered(74, 92, STR_HUB_AIRPORTS, 0);
+ DrawStringCentered(74, 130, STR_HELIPORTS, 0);
+ DrawStringCentered(74, 180, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
+ DrawStationCoverageAreaText(2, 206, (uint)-1, rad);
break;
}
case WE_CLICK: {
switch (e->click.widget) {
- case 3: case 4: case 5: case 6: case 7:
- _selected_airport_type = e->click.widget - 3;
+ case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
+ _selected_airport_type = e->click.widget - 7;
SndPlayFx(SND_15_BEEP);
SetWindowDirty(w);
break;
- case 8: case 9:
- _station_show_coverage = e->click.widget - 8;
+ case 16: case 17:
+ _station_show_coverage = e->click.widget - 16;
SndPlayFx(SND_15_BEEP);
SetWindowDirty(w);
break;
@@ -220,21 +227,29 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
}
static const Widget _build_airport_picker_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_3001_AIRPORT_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PANEL, RESIZE_NONE, 7, 0, 147, 14, 130, 0x0, STR_NULL},
-{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 73, 27, 38, STR_3059_SMALL, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
-{WWT_NODISTXTBTN, RESIZE_NONE, 14, 74, 145, 27, 38, STR_305A_LARGE, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
-{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 63, 74, STR_306B_HELIPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
-{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 39, 50, STR_305AA_LARGE, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
-{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 51, 62, STR_305AB_LARGE, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 14, 73, 88, 98, STR_02DB_OFF, STR_3065_DON_T_HIGHLIGHT_COVERAGE},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 74, 133, 88, 98, STR_02DA_ON, STR_3064_HIGHLIGHT_COVERAGE_AREA},
+{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_3001_AIRPORT_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 147, 14, 52, 0x0, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 147, 53, 89, 0x0, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 147, 90, 127, 0x0, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 147, 128, 177, 0x0, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 147, 178, 239, 0x0, STR_NULL},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 27, 38, STR_SMALL_AIRPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 65, 76, STR_CITY_AIRPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 141, 152, STR_HELIPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 77, 88, STR_METRO_AIRPORT , STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 103, 114, STR_INTERNATIONAL_AIRPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 39, 50, STR_COMMUTER_AIRPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 165, 176, STR_HELIDEPOT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 115, 126, STR_INTERCONTINENTAL_AIRPORT, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{WWT_NODISTXTBTN, RESIZE_NONE, 14, 2, 145, 153, 164, STR_HELISTATION, STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 14, 73, 191, 202, STR_02DB_OFF, STR_3065_DON_T_HIGHLIGHT_COVERAGE},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 74, 133, 191, 202, STR_02DA_ON, STR_3064_HIGHLIGHT_COVERAGE_AREA},
{ WIDGETS_END},
};
static const WindowDesc _build_airport_desc = {
- -1, -1, 148, 131, // height, 130+1
+ -1, -1, 148, 240,
WC_BUILD_STATION,WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
_build_airport_picker_widgets,
diff --git a/airport_movement.h b/airport_movement.h
index fe62bf627..8b41b19f9 100644
--- a/airport_movement.h
+++ b/airport_movement.h
@@ -13,7 +13,6 @@ typedef struct AirportFTAbuildup {
byte next_in_chain; // next position from this position
} AirportFTAbuildup;
-
///////////////////////////////////////////////////////////////////////
/////*********Movement Positions on Airports********************///////
// Country Airfield (small) 4x3
@@ -42,6 +41,48 @@ static const AirportMovingData _airport_moving_data_country[22] = {
{ 44, 40,AMED_HELI_LOWER,0} // 21 Helicopter landing
};
+// Commuter Airfield (small) 5x4
+static const AirportMovingData _airport_moving_data_commuter[37] = {
+ { 69, 3, AMED_EXACTPOS,3}, // 00 In Hangar
+ { 72, 22,0,0}, // 01 Taxi to right outside depot
+ { 8, 22, AMED_EXACTPOS,5}, // 01 Taxi to right outside depot
+ { 24, 36,AMED_EXACTPOS,3}, // 03 Terminal 1
+ { 40, 36,AMED_EXACTPOS,3}, // 04 Terminal 2
+ { 56, 36,AMED_EXACTPOS,3}, // 05 Terminal 3
+ { 40, 8,AMED_EXACTPOS,1}, // 06 Helipad 1
+ { 56, 8,AMED_EXACTPOS,1}, // 07 Helipad 2
+ { 24, 22,0,5}, // 08 Taxiing
+ { 40, 22,0,5}, // 09 Taxiing
+ { 56, 22,0,5}, // 10 Taxiing
+ { 72, 40,0,3}, // 11 Airport OUTWAY
+ { 72, 54,AMED_EXACTPOS,1}, // 12 Accelerate to end of runway
+ { 7, 54,AMED_NOSPDCLAMP,0}, // 13 Release control of runway, for smoother movement
+ { 5, 54,AMED_NOSPDCLAMP,0}, // 14 End of runway
+ {-79, 54,AMED_NOSPDCLAMP | AMED_TAKEOFF,0}, // 15 Take off
+ {145, 54,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 16 Fly to landing position in air
+ { 73, 54,AMED_NOSPDCLAMP | AMED_LAND,0}, // 17 Going down for land
+ { 3, 54,AMED_NOSPDCLAMP | AMED_BRAKE,0}, // 18 Just landed, brake until end of runway
+ { 12, 54,0,7}, // 19 Just landed, turn around and taxi
+ { 8, 32,0,7}, // 20 Taxi from runway to crossing
+ {-31,149,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 21 Fly around waiting for a landing spot (north-east)
+ { 1, 6,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 22 Fly around waiting for a landing spot (north-west)
+ {193, 6,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 23 Fly around waiting for a landing spot (south-west)
+ {225, 81,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 24 Fly around waiting for a landing spot (south)
+ // Helicopter
+ { 80, 0,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 25 Bufferspace before helipad
+ { 80, 0,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 26 Bufferspace before helipad
+ { 32, 8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 27 Get in position for Helipad1
+ { 48, 8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 28 Get in position for Helipad2
+ { 32, 8,AMED_HELI_LOWER,0}, // 29 Land at Helipad1
+ { 48, 8,AMED_HELI_LOWER,0}, // 30 Land at Helipad2
+ { 32, 8,AMED_HELI_RAISE,0}, // 31 Takeoff Helipad1
+ { 48, 8,AMED_HELI_RAISE,0}, // 32 Takeoff Helipad2
+ { 64, 22,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 33 Go to position for Hangarentrance in air
+ { 64, 22,AMED_HELI_LOWER,0}, // 34 Land in front of hangar
+ { 40, 8,AMED_EXACTPOS,0}, // pre-helitakeoff helipad 1
+ { 56, 8,AMED_EXACTPOS,0} // pre-helitakeoff helipad 2
+};
+
// City Airport (large) 6x6
static const AirportMovingData _airport_moving_data_town[25] = {
{ 85, 3,AMED_EXACTPOS,3}, // 00 In Hangar
@@ -158,6 +199,89 @@ static const AirportMovingData _airport_moving_data_international[51] = {
{104, 32,AMED_HELI_LOWER,0} // 50 Land in HANGAR2_AREA to go to hangar
};
+// Intercontinental Airport - 4 runways, 8 terminals, 2 dedicated helipads
+static const AirportMovingData _airport_moving_data_intercontinental[77] = {
+ { 7, 87, AMED_EXACTPOS,3}, // 00 In Hangar 1
+ {135, 72, AMED_EXACTPOS,3}, // 01 In Hangar 2
+ { 7,104,0,0}, // 02 Taxi to right outside depot 1
+ {135, 88,0,0}, // 03 Taxi to right outside depot 2
+ { 56,120,AMED_EXACTPOS,6}, // 04 Terminal 1
+ { 56,104,AMED_EXACTPOS,5}, // 05 Terminal 2
+ { 56, 88,AMED_EXACTPOS,5}, // 06 Terminal 3
+ { 56, 72,AMED_EXACTPOS,5}, // 07 Terminal 4
+ { 88,120,AMED_EXACTPOS,0}, // 08 Terminal 5
+ { 88,104,AMED_EXACTPOS,1}, // 09 Terminal 6
+ { 88, 88,AMED_EXACTPOS,1}, // 10 Terminal 7
+ { 88, 72,AMED_EXACTPOS,1}, // 11 Terminal 8
+ { 88, 56,AMED_EXACTPOS,3}, // 12 Helipad 1
+ { 72, 56,AMED_EXACTPOS,1}, // 13 Helipad 2
+ { 40,136,0,0}, // 14 Term group 2 enter 1 a
+ { 56,136,0,0}, // 15 Term group 2 enter 1 b
+ { 88,136,0,0}, // 16 Term group 2 enter 2 a
+ {104,136,0,0}, // 17 Term group 2 enter 2 b
+ {104,120,0,0}, // 18 Term group 2 - opp term 5
+ {104,104,0,0}, // 19 Term group 2 - opp term 6 & exit2
+ {104, 88,0,0}, // 20 Term group 2 - opp term 7 & hangar area 2
+ {104, 72,0,0}, // 21 Term group 2 - opp term 8
+ {104, 56,0,0}, // 22 Taxi Term group 2 exit a
+ {104, 40,0,0}, // 23 Taxi Term group 2 exit b
+ { 56, 40,0,0}, // 24 Term group 2 exit 2a
+ { 40, 40,0,0}, // 25 Term group 2 exit 2b
+ { 40,120,0,0}, // 26 Term group 1 - opp term 1
+ { 40,104,0,0}, // 27 Term group 1 - opp term 2 & hangar area 1
+ { 40, 88,0,0}, // 28 Term group 1 - opp term 3
+ { 40, 72,0,0}, // 29 Term group 1 - opp term 4
+ { 18, 72,0,7}, // 30 Outway 1
+ { 8, 40,0,7}, // 31 Airport OUTWAY
+ { 8, 24,AMED_EXACTPOS,5}, // 32 Accelerate to end of runway
+ {119, 24,AMED_NOSPDCLAMP,0}, // 33 Release control of runway, for smoother movement
+ {117, 24,AMED_NOSPDCLAMP,0}, // 34 End of runway
+ {197, 24,AMED_NOSPDCLAMP | AMED_TAKEOFF,0}, // 35 Take off
+ {254, 84,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 36 Flying to landing position in air
+ {117,168,AMED_NOSPDCLAMP | AMED_LAND,0}, // 37 Going down for land
+ { 3,168,AMED_NOSPDCLAMP | AMED_BRAKE,0}, // 38 Just landed, brake until end of runway
+ { 8,168,0,0}, // 39 Just landed, turn around and taxi
+ { 8,144,0,7}, // 40 Taxi from runway
+ { 8,128,0,7}, // 41 Taxi from runway
+ { 8,120,AMED_EXACTPOS,5}, // 42 Airport entrance
+ { 56,344,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 43 Fly around waiting for a landing spot (north-east)
+ {-200,88,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 44 Fly around waiting for a landing spot (north-west)
+ { 56,-168,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 45 Fly around waiting for a landing spot (south-west)
+ {312, 88,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 46 Fly around waiting for a landing spot (south)
+ // Helicopter
+ { 96,40,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 47 Bufferspace before helipad
+ { 96,40,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 48 Bufferspace before helipad
+ { 82,54,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 49 Get in position for Helipad1
+ { 64,56,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 50 Get in position for Helipad2
+ { 81,55,AMED_HELI_LOWER,0}, // 51 Land at Helipad1
+ { 64,56,AMED_HELI_LOWER,0}, // 52 Land at Helipad2
+ { 80,56,AMED_HELI_RAISE,0}, // 53 Takeoff Helipad1
+ { 64,56,AMED_HELI_RAISE,0}, // 54 Takeoff Helipad2
+ {136,96,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 55 Go to position for Hangarentrance in air
+ {136,96,AMED_HELI_LOWER,0}, // 56 Land in front of hangar2
+ {126,104,0,3}, // 57 Outway 2
+ {136,136,0,1}, // 58 Airport OUTWAY 2
+ {136,152,AMED_EXACTPOS,5}, // 59 Accelerate to end of runway2
+ { 16,152,AMED_NOSPDCLAMP,0}, // 60 Release control of runway2, for smoother movement
+ { 20,152,AMED_NOSPDCLAMP,0}, // 61 End of runway2
+ {-56,152,AMED_NOSPDCLAMP | AMED_TAKEOFF,0}, // 62 Take off2
+ { 24, 8,AMED_NOSPDCLAMP | AMED_LAND,0}, // 63 Going down for land2
+ {136, 8,AMED_NOSPDCLAMP | AMED_BRAKE,0}, // 64 Just landed, brake until end of runway2in
+ {136, 8,0,0}, // 65 Just landed, turn around and taxi
+ {136, 24,0,3}, // 66 Taxi from runway 2in
+ {136, 40,0,3}, // 67 Taxi from runway 2in
+ {136, 56,AMED_EXACTPOS,1}, // 68 Airport entrance2
+ {-56, 8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 69 Fly to landing position in air2
+ { 88, 40,0,0}, // 70 Taxi Term group 2 exit - opp heli1
+ { 72, 40,0,0}, // 71 Taxi Term group 2 exit - opp heli2
+ { 88, 57,AMED_EXACTPOS,3}, // 72 pre-helitakeoff helipad 1
+ { 71, 56,AMED_EXACTPOS,1}, // 73 pre-helitakeoff helipad 2
+ { 8,120,AMED_HELI_RAISE,0}, // 74 Helitakeoff outside depot 1
+ {136,104,AMED_HELI_RAISE,0}, // 75 Helitakeoff outside depot 2
+ {197,168,AMED_NOSPDCLAMP | AMED_SLOWTURN,0} // 76 Fly to landing position in air1
+};
+
+
// Heliport (heliport)
static const AirportMovingData _airport_moving_data_heliport[9] = {
{ 5, 9,AMED_EXACTPOS,1}, // 0 - At heliport terminal
@@ -171,6 +295,65 @@ static const AirportMovingData _airport_moving_data_heliport[9] = {
{ 70, 9,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 8 - Circle #4 (south)
};
+// HeliDepot 2x2 (heliport)
+static const AirportMovingData _airport_moving_data_helidepot[18] = {
+ { 24, 4,AMED_EXACTPOS,1}, // 0 - At depot
+ { 24, 28,0,0}, // 1 Taxi to right outside depot
+ { 5, 38,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 2 Flying
+ {-15,-15,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 3 - Circle #1 (north-east)
+ {-15,-49,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 4 - Circle #2 (north-west)
+ { 49,-49,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 5 - Circle #3 (south-west)
+ { 49,-15,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 6 - Circle #4 (south-east)
+ { 8, 32,AMED_NOSPDCLAMP | AMED_SLOWTURN,7}, // 7 - PreHelipad
+ { 8, 32,AMED_NOSPDCLAMP | AMED_SLOWTURN,7}, // 8 - Helipad
+ { 8, 16,AMED_NOSPDCLAMP | AMED_SLOWTURN,7}, // 9 - Land
+ { 8, 16,AMED_HELI_LOWER,7}, // 10 - Land
+ { 8, 24,AMED_HELI_RAISE,0}, // 11 - Take off (play sound)
+ { 32, 24,AMED_NOSPDCLAMP | AMED_SLOWTURN,7}, // 12 Air to above hangar area
+ { 32, 24,AMED_HELI_LOWER,7}, // 13 Taxi to right outside depot
+ { 8, 24,AMED_EXACTPOS,7}, // 14 - on helipad1
+ { 24, 28,AMED_HELI_RAISE,0}, // 15 Takeoff right outside depot
+ { 8, 24,AMED_HELI_RAISE,5}, // 16 - Take off (play sound)
+ { 8, 24,AMED_SLOWTURN | AMED_EXACTPOS,2}, // 17 - turn on helipad1 for takeoff
+};
+
+// HeliDepot 2x2 (heliport)
+static const AirportMovingData _airport_moving_data_helistation[33] = {
+ {8, 3,AMED_EXACTPOS,3}, // 00 In Hangar2
+ {8, 22,0,0}, // 01 outside hangar 2
+ {116,24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 02 Fly to landing position in air
+ {14, 22,AMED_HELI_RAISE,0}, // 03 Helitakeoff outside hangar1(play sound)
+ {24, 22,0,0}, // 04 taxiing
+ {40, 22,0,0}, // 05 taxiing
+ {40, 8,AMED_EXACTPOS,1}, // 06 Helipad 1
+ {56, 8,AMED_EXACTPOS,1}, // 07 Helipad 2
+ {56, 24,AMED_EXACTPOS,1}, // 08 Helipad 3
+ {40, 8,AMED_EXACTPOS,0}, // 09 pre-helitakeoff helipad 1
+ {56, 8,AMED_EXACTPOS,0}, // 10 pre-helitakeoff helipad 2
+ {56, 24,AMED_EXACTPOS,0}, // 11 pre-helitakeoff helipad 3
+ {32, 8,AMED_HELI_RAISE,0}, // 12 Takeoff Helipad1
+ {48, 8,AMED_HELI_RAISE,0}, // 13 Takeoff Helipad2
+ {48, 24,AMED_HELI_RAISE,0}, // 14 Takeoff Helipad3
+ {84, 24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 15 Bufferspace before helipad
+ {68, 24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 16 Bufferspace before helipad
+ {32, 8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 17 Get in position for Helipad1
+ {48, 8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 18 Get in position for Helipad2
+ {48, 24,AMED_NOSPDCLAMP | AMED_SLOWTURN,1}, // 19 Get in position for Helipad3
+ {40, 8,AMED_HELI_LOWER,0}, // 20 Land at Helipad1
+ {48, 8,AMED_HELI_LOWER,0}, // 21 Land at Helipad2
+ {48, 24,AMED_HELI_LOWER,0}, // 22 Land at Helipad3
+ {0, 22,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 23 Go to position for Hangarentrance in air
+ {0, 22,AMED_HELI_LOWER,0}, // 24 Land in front of hangar
+ {148,-8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 25 Fly around waiting for a landing spot (south-east)
+ {148,8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 26 Fly around waiting for a landing spot (south-west)
+ {132,24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 27 Fly around waiting for a landing spot (south-west)
+ {100,24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 28 Fly around waiting for a landing spot (north-east)
+ {84, 8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 29 Fly around waiting for a landing spot (south-east)
+ {84,-8,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 30 Fly around waiting for a landing spot (south-west)
+ {100,-24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 31 Fly around waiting for a landing spot (north-west)
+ {132,-24,AMED_NOSPDCLAMP | AMED_SLOWTURN,0}, // 32 Fly around waiting for a landing spot (north-east)
+};
+
// Oilrig
static const AirportMovingData _airport_moving_data_oilrig[9] = {
{ 31, 9,AMED_EXACTPOS,1}, // 0 - At oilrig terminal
@@ -188,6 +371,7 @@ static const AirportMovingData _airport_moving_data_oilrig[9] = {
/////**********Movement Machine on Airports*********************///////
// first element of depots 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 byte _airport_terminal_country[] = {1, 2};
static const AirportFTAbuildup _airport_fta_country[] = {
@@ -219,6 +403,56 @@ 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 byte _airport_terminal_commuter[] = {1, 3};
+static const byte _airport_helipad_commuter[] = {1, 2};
+static const AirportFTAbuildup _airport_fta_commuter[] = {
+ { 0,HANGAR,NOTHING_block,1}, {0,HELITAKEOFF,HELIPAD2_block,1}, {0,0,0,1},
+ { 1,255,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,10}, {1,0,0,0},
+ { 2,255,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,0,0,2},
+ { 3,TERM1,TERM1_block,8}, {3,HANGAR,0,8}, {3,TAKEOFF,0,8}, {3,0,0,3},
+ { 4,TERM2,TERM2_block,9}, {4,HANGAR,0,9}, {4,TAKEOFF,0,9}, {4,0,0,4},
+ { 5,TERM3,TERM3_block,10}, {5,HANGAR,0,10}, {5,TAKEOFF,0,10}, {5,0,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,255,TAXIWAY_BUSY_block,8}, {8,TAKEOFF,TAXIWAY_BUSY_block,9}, {8,HANGAR,TAXIWAY_BUSY_block,9}, {8,TERM1,TERM1_block,3}, {8,0,TAXIWAY_BUSY_block,9},
+ { 9,255,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,0,TAXIWAY_BUSY_block,10},
+ {10,255,TAXIWAY_BUSY_block,10}, {10,TERM3,TERM3_block,5}, {10,HELIPAD1,0,9}, {10,HELIPAD2,HELIPAD2_block,7}, {10,HELITAKEOFF,HELIPAD2_block,7}, {10,TAKEOFF,TAXIWAY_BUSY_block,1}, {10,HANGAR,TAXIWAY_BUSY_block,1}, {10,0,TAXIWAY_BUSY_block,9},
+ {11,0,OUT_WAY_block,12},
+ // takeoff
+ {12,TAKEOFF,RUNWAY_IN_OUT_block,13},
+ {13,0,RUNWAY_IN_OUT_block,14},
+ {14,STARTTAKEOFF,RUNWAY_IN_OUT_block,15},
+ {15,ENDTAKEOFF,NOTHING_block,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,0,RUNWAY_IN_OUT_block,19},
+ {19,0,RUNWAY_IN_OUT_block,20},
+ {20,ENDLANDING,IN_WAY_block,20}, {20,255,IN_WAY_block,2}, {20,TERM1,0,2}, {20,TERM2,0,2}, {20,TERM3,0,2}, {20,HANGAR,0,2}, {20,0,0,2},
+ // In Air
+ {21,0,NOTHING_block,22},
+ {22,0,NOTHING_block,23},
+ {23,0,NOTHING_block,24},
+ {24,0,NOTHING_block,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,0,NOTHING_block,29}, //helipad1 approach
+ {28,0,NOTHING_block,30},
+ // landing
+ {29,255,NOTHING_block,0}, {29,HELIPAD1,HELIPAD1_block,6},
+ {30,255,NOTHING_block,0}, {30,HELIPAD2,HELIPAD2_block,7},
+ // Helicopter -- takeoff
+ {31,HELITAKEOFF,NOTHING_block,0},
+ {32,HELITAKEOFF,NOTHING_block,0},
+ {33,0,TAXIWAY_BUSY_block,34}, // need to go to hangar when waiting in air
+ {34,0,TAXIWAY_BUSY_block,1},
+ {35,0,HELIPAD1_block,31},
+ {36,0,HELIPAD2_block,32},
+ {MAX_ELEMENTS,0,0,0} // end marker. DO NOT REMOVE
+};
+
static const TileIndexDiffC _airport_depots_city[] = {{5, 0}};
static const byte _airport_terminal_city[] = {1, 3};
static const AirportFTAbuildup _airport_fta_city[] = {
@@ -355,6 +589,100 @@ static const AirportFTAbuildup _airport_fta_international[] = {
{MAX_ELEMENTS,0,0,0} // end marker. DO NOT REMOVE
};
+// intercontinental
+static const TileIndexDiffC _airport_depots_intercontinental[] = {{0, 5}, {8, 4}};
+static const byte _airport_terminal_intercontinental[] = {2, 4, 4};
+static const byte _airport_helipad_intercontinental[] = {1, 2};
+static const AirportFTAbuildup _airport_fta_intercontinental[] = {
+ { 0,HANGAR,NOTHING_block,2}, {0,255,HANGAR1_AREA_block | TERM_GROUP1_block,0}, {0,255,HANGAR1_AREA_block | TERM_GROUP1_block,1}, {0,TAKEOFF,HANGAR1_AREA_block | TERM_GROUP1_block,2}, {0,0,0,2},
+ { 1,HANGAR,NOTHING_block,3}, {1,255,HANGAR2_AREA_block,1}, {1,255,HANGAR2_AREA_block,0}, {1,0,0,3},
+ { 2,255,HANGAR1_AREA_block,0}, {2,255,TERM_GROUP1_block,0}, {2,255,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,0,0,27},
+ { 3,255,HANGAR2_AREA_block,0}, {3,HANGAR,0,1}, {3,HELITAKEOFF,0,75}, {3,0,0,20},
+ { 4,TERM1,TERM1_block,26}, {4,HANGAR,HANGAR1_AREA_block | TERM_GROUP1_block,26}, {4,0,0,26},
+ { 5,TERM2,TERM2_block,27}, {5,HANGAR,HANGAR1_AREA_block | TERM_GROUP1_block,27}, {5,0,0,27},
+ { 6,TERM3,TERM3_block,28}, {6,HANGAR,HANGAR1_AREA_block | TERM_GROUP1_block,28}, {6,0,0,28},
+ { 7,TERM4,TERM4_block,29}, {7,HANGAR,HANGAR1_AREA_block | TERM_GROUP1_block,29}, {7,0,0,29},
+ { 8,TERM5,TERM5_block,18}, {8,HANGAR,HANGAR2_AREA_block,18}, {8,0,0,18},
+ { 9,TERM6,TERM6_block,19}, {9,HANGAR,HANGAR2_AREA_block,19}, {9,0,0,19},
+ {10,TERM7,TERM7_block,20}, {10,HANGAR,HANGAR2_AREA_block,20}, {10,0,0,20},
+ {11,TERM8,TERM8_block,21}, {11,HANGAR,HANGAR2_AREA_block,21}, {11,0,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,0,TERM_GROUP2_ENTER1_block,15},
+ {15,0,TERM_GROUP2_ENTER1_block,16},
+ {16,0,TERM_GROUP2_ENTER2_block,17},
+ {17,0,TERM_GROUP2_ENTER2_block,18},
+ {18,255,TERM_GROUP2_block,0}, {18,TERM5,TERM5_block,8}, {18,TAKEOFF,0,19}, {18,HELITAKEOFF,HELIPAD1_block,19}, {18,0,TERM_GROUP2_EXIT1_block,19},
+ {19,255,TERM_GROUP2_block,0}, {19,TERM6,TERM6_block,9}, {19,TERM5,0,18}, {19,TAKEOFF,0,57}, {19,HELITAKEOFF,HELIPAD1_block,20}, {19,0,TERM_GROUP2_EXIT1_block,20}, // add exit to runway out 2
+ {20,255,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,0,TERM_GROUP2_EXIT1_block,21},
+ {21,255,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,0,TERM_GROUP2_EXIT1_block,22},
+ {22,255,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,0,0,23},
+ {23,255,TERM_GROUP2_EXIT1_block,0}, {23,0,0,70},
+ {24,0,TERM_GROUP2_EXIT2_block,25},
+ {25,255,TERM_GROUP2_EXIT2_block,0}, {25,HANGAR,HANGAR1_AREA_block | TERM_GROUP1_block,29}, {25,0,0,29},
+ {26,255,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,0,0,27},
+ {27,255,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,0,0,28},
+ {28,255,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,0,0,29},
+ {29,255,TERM_GROUP1_block,0}, {29,TERM4,TERM4_block,7}, {29,HANGAR,HANGAR1_AREA_block,27}, {29,TAKEOFF,0,30}, {29,0,0,28},
+ {30,255,OUT_WAY_block2,0}, {30,0,0,31},
+ {31,255,OUT_WAY_block,32},
+ // takeoff
+ {32,TAKEOFF,RUNWAY_OUT_block,33},
+ {33,0,RUNWAY_OUT_block,34},
+ {34,STARTTAKEOFF,NOTHING_block,35},
+ {35,ENDTAKEOFF,NOTHING_block,0},
+ // landing
+ {36,0,0,0},
+ {37,LANDING,RUNWAY_IN_block,38},
+ {38,0,RUNWAY_IN_block,39},
+ {39,0,RUNWAY_IN_block,40},
+ {40,ENDLANDING,RUNWAY_IN_block,41},
+ {41,0,IN_WAY_block,42},
+ {42,255,IN_WAY_block,0}, {42,255,TERM_GROUP1_block,0}, {42,255,TERM_GROUP1_block,1}, {42,HANGAR,0,2}, {42,0,0,26},
+ // In Air
+ {43,0,0,44},
+ {44,FLYING,0,45}, {44,HELILANDING,0,47}, {44,LANDING,0,69}, {44,0,0,45},
+ {45,0,0,46},
+ {46,FLYING,0,43}, {46,LANDING,0,76}, {46,0,0,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,0,NOTHING_block,51},
+ {50,0,NOTHING_block,52},
+ // landing
+ {51,255,NOTHING_block,0}, {51,HELIPAD1,HELIPAD1_block,12}, {51,HANGAR,0,55}, {51,0,0,12},
+ {52,255,NOTHING_block,0}, {52,HELIPAD2,HELIPAD2_block,13}, {52,HANGAR,0,55}, {52,0,0,13},
+ // Helicopter -- takeoff
+ {53,HELITAKEOFF,NOTHING_block,0},
+ {54,HELITAKEOFF,NOTHING_block,0},
+ {55,0,HANGAR2_AREA_block,56}, // need to go to hangar when waiting in air
+ {56,0,HANGAR2_AREA_block,3},
+ // runway 2 out support
+ {57,255,OUT_WAY2_block,0}, {57,TAKEOFF,0,58}, {57,0,0,58},
+ {58,0,OUT_WAY2_block,59},
+ {59,TAKEOFF,RUNWAY_OUT2_block,60}, // takeoff
+ {60,0,RUNWAY_OUT2_block,61},
+ {61,STARTTAKEOFF,NOTHING_block,62},
+ {62,ENDTAKEOFF,NOTHING_block,0},
+ // runway 2 in support
+ {63,LANDING,RUNWAY_IN2_block,64},
+ {64,0,RUNWAY_IN2_block,65},
+ {65,0,RUNWAY_IN2_block,66},
+ {66,ENDLANDING,RUNWAY_IN2_block,0}, {66,255,0,1}, {66,255,0,0}, {66,0,0,67},
+ {67,0,IN_WAY2_block,68},
+ {68,255,IN_WAY2_block,0}, {68,255,TERM_GROUP2_block,1}, {68,255,TERM_GROUP1_block,0}, {68,HANGAR,HANGAR2_AREA_block,22}, {68,0,0,22},
+ {69,255,RUNWAY_IN2_block,0}, {69,0,RUNWAY_IN2_block,63},
+ {70,255,TERM_GROUP2_EXIT1_block,0}, {70,HELIPAD1,HELIPAD1_block,12}, {70,HELITAKEOFF,HELIPAD1_block,12}, {70,0,0,71},
+ {71,255,TERM_GROUP2_EXIT1_block,0}, {71,HELIPAD2,HELIPAD2_block,13}, {71,HELITAKEOFF,HELIPAD1_block,12}, {71,0,0,24},
+ {72,0,HELIPAD1_block,53},
+ {73,0,HELIPAD2_block,54},
+ {74,HELITAKEOFF,NOTHING_block,0},
+ {75,HELITAKEOFF,NOTHING_block,0},
+ {76,255,RUNWAY_IN_block,0}, {76,0,RUNWAY_IN_block,37},
+ {MAX_ELEMENTS,0,0,0} // end marker. DO NOT REMOVE
+};
+
+
// heliports, oilrigs don't have depots
static const byte _airport_helipad_heliport_oilrig[] = {1, 1};
static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
@@ -371,23 +699,97 @@ static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
{MAX_ELEMENTS,0,0,0} // end marker. DO NOT REMOVE
};
+// helidepots
+static const TileIndexDiffC _airport_depots_helidepot[] = {{1, 0}};
+static const byte _airport_helipad_helidepot[] = {1, 1};
+static const AirportFTAbuildup _airport_fta_helidepot[] = {
+ { 0,HANGAR,NOTHING_block,1},
+ { 1,255,HANGAR2_AREA_block,0}, {1,HANGAR,0,0}, {1,HELIPAD1,HELIPAD1_block,14}, {1,HELITAKEOFF,0,15}, {1,0,0,0},
+ { 2,FLYING,NOTHING_block,3}, {2,HELILANDING,PRE_HELIPAD_block,7}, {2,HANGAR,0,12}, {2,HELITAKEOFF,NOTHING_block,16},
+ // In Air
+ { 3,0,NOTHING_block,4},
+ { 4,0,NOTHING_block,5},
+ { 5,0,NOTHING_block,6},
+ { 6,0,NOTHING_block,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,0,0,2},
+ { 9,0,NOTHING_block,10},
+ // landing
+ {10,255,NOTHING_block,10}, {10,HELIPAD1,HELIPAD1_block,14}, {10,HANGAR,0,1}, {10,0,0,14},
+ // Helicopter -- takeoff
+ {11,HELITAKEOFF,NOTHING_block,0},
+ {12,0,HANGAR2_AREA_block,13}, // need to go to hangar when waiting in air
+ {13,0,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,0,NOTHING_block,11},
+ {MAX_ELEMENTS,0,0,0} // end marker. DO NOT REMOVE
+};
+
+// helistation
+static const TileIndexDiffC _airport_depots_helistation[] = {{0, 0}};
+static const byte _airport_helipad_helistation[] = {1, 3};
+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,0,0,0},
+ { 1,255,HANGAR2_AREA_block,0}, {1,HANGAR,0,0}, {1,HELITAKEOFF,0,3}, {1,0,0,4},
+ // landing
+ { 2,FLYING,NOTHING_block,28}, {2,HELILANDING,0,15}, {2,0,0,28},
+ // helicopter side
+ {3,HELITAKEOFF,NOTHING_block,0}, // helitakeoff outside hangar2
+ {4,255,TAXIWAY_BUSY_block,0}, {4,HANGAR,HANGAR2_AREA_block,1}, {4,HELITAKEOFF,0,1}, {4,0,0,5},
+ {5,255,TAXIWAY_BUSY_block,0}, {5,HELIPAD1,HELIPAD1_block,6}, {5,HELIPAD2,HELIPAD2_block,7}, {5,HELIPAD3,HELIPAD3_block,8}, {5,0,0,4},
+ {6,HELIPAD1,HELIPAD1_block,5}, {6,HANGAR, HANGAR2_AREA_block,5}, {6,HELITAKEOFF,0,9}, {6,0,0,6},
+ {7,HELIPAD2,HELIPAD2_block,5}, {7,HANGAR, HANGAR2_AREA_block,5}, {7,HELITAKEOFF,0,10}, {7,0,0,7},
+ {8,HELIPAD3,HELIPAD3_block,5}, {8,HANGAR, HANGAR2_AREA_block,5}, {8,HELITAKEOFF,0,11}, {8,0,0,8},
+ {9,0,HELIPAD1_block,12},
+ {10,0,HELIPAD2_block,13},
+ {11,0,HELIPAD3_block,14},
+ {12,HELITAKEOFF,NOTHING_block,0},
+ {13,HELITAKEOFF,NOTHING_block,0},
+ {14,HELITAKEOFF,NOTHING_block,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,0,NOTHING_block,20},
+ {18,0,NOTHING_block,21},
+ {19,0,NOTHING_block,22},
+ // heli landing
+ {20,255,NOTHING_block,0}, {20,HELIPAD1,HELIPAD1_block,6}, {20,HANGAR,0,23}, {20,0,0,6},
+ {21,255,NOTHING_block,0}, {21,HELIPAD2,HELIPAD2_block,7}, {21,HANGAR,0,23}, {21,0,0,7},
+ {22,255,NOTHING_block,0}, {22,HELIPAD3,HELIPAD3_block,8}, {22,HANGAR,0,23}, {22,0,0,8},
+ {23,0,HANGAR2_AREA_block,24}, // need to go to helihangar when waiting in air
+ {24,0,HANGAR2_AREA_block,1},
+ {25,0,NOTHING_block,26},
+ {26,0,NOTHING_block,27},
+ {27,0,NOTHING_block,2},
+ {28,0,NOTHING_block,29},
+ {29,0,NOTHING_block,30},
+ {30,0,NOTHING_block,31},
+ {31,0,NOTHING_block,32},
+ {32,0,NOTHING_block,25},
+ {MAX_ELEMENTS,0,0,0} // end marker. DO NOT REMOVE
+};
+
+
static const AirportMovingData * const _airport_moving_datas[] = {
- _airport_moving_data_country, // Country Airfield (small) 4x3
- _airport_moving_data_town, // City Airport (large) 6x6
- _airport_moving_data_heliport, // Heliport
- _airport_moving_data_metropolitan, // Metropolitain Airport (large) - 2 runways
- _airport_moving_data_international, // International Airport (xlarge) - 2 runways
- NULL,
- NULL,
- NULL,
- NULL,
+ _airport_moving_data_country, // Country Airfield (small) 4x3
+ _airport_moving_data_town, // City Airport (large) 6x6
+ _airport_moving_data_heliport, // Heliport
+ _airport_moving_data_metropolitan, // Metropolitain Airport (large) - 2 runways
+ _airport_moving_data_international, // International Airport (xlarge) - 2 runways
+ _airport_moving_data_commuter, // Commuter Airfield (small) 5x4
+ _airport_moving_data_helidepot, // Helidepot
+ _airport_moving_data_intercontinental, // Intercontinental Airport (xxlarge) - 4 runways
+ _airport_moving_data_helistation, // Helistation
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- _airport_moving_data_oilrig // Oilrig
+ _airport_moving_data_oilrig // Oilrig
};
#endif /* AIRPORT_MOVEMENT_H */
diff --git a/data/airports.grf b/data/airports.grf
new file mode 100644
index 000000000..339534afb
--- /dev/null
+++ b/data/airports.grf
Binary files differ
diff --git a/gfxinit.c b/gfxinit.c
index 0d31c7123..522687627 100644
--- a/gfxinit.c
+++ b/gfxinit.c
@@ -368,6 +368,9 @@ static void LoadSpriteTables(void)
LoadGrfIndexed("openttd.grf", _openttd_grf_indexes, i++);
load_index = SPR_OPENTTD_BASE + OPENTTD_SPRITES_COUNT;
+ assert(load_index == SPR_AIRPORTX_BASE);
+ load_index += LoadGrfFile("airports.grf", load_index, i++);
+
LoadNewGRF(load_index, i);
}
diff --git a/lang/english.txt b/lang/english.txt
index 30a1f5906..3419e1227 100644
--- a/lang/english.txt
+++ b/lang/english.txt
@@ -1705,11 +1705,6 @@ STR_3055_CHANGE_NAME_OF_STATION :{BLACK}Change n
STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO :{BLACK}Show list of accepted cargo
STR_3057_STATION_NAMES_CLICK_ON :{BLACK}Station names - click on name to centre main view on station
STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT :{BLACK}Select size/type of airport
-STR_3059_SMALL :{BLACK}Small
-STR_305A_LARGE :{BLACK}City
-STR_305AA_LARGE :{BLACK}Metropolitan airport
-STR_305AB_LARGE :{BLACK}International airport
-STR_305B_SIZE :{BLACK}Size
STR_305C_0 :{STATION} {STATIONFEATURES}
STR_STATION_SIGN_TINY :{TINYFONT}{STATION}
STR_305E_RAILROAD_STATION :Railway station
@@ -1724,7 +1719,6 @@ STR_3066_COVERAGE_AREA_HIGHLIGHT :{BLACK}Coverage
STR_3068_DOCK :{WHITE}Dock
STR_3069_BUOY :Buoy
STR_306A_BUOY_IN_THE_WAY :{WHITE}...buoy in the way
-STR_306B_HELIPORT :{BLACK}Heliport
STR_306C_STATION_TOO_SPREAD_OUT :{WHITE}...station too spread out
STR_306D_NONUNIFORM_STATIONS_DISALLOWED :{WHITE}...nonuniform stations disabled
STR_USE_CTRL_TO_SELECT_MORE :{BLACK}Hold down CTRL to select more than one item
@@ -2864,3 +2858,20 @@ STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Weight:
STR_PURCHASE_INFO_COST_SPEED :{BLACK}Cost: {GOLD}{CURRENCY}{BLACK} Speed: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacity: {GOLD}{COMMA} passengers, {COMMA} bags of mail
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Powered Wagons: {GOLD}+{POWER}{BLACK} Weight: {GOLD}+{WEIGHT_S}
+
+########### String for new airports
+STR_SMALL_AIRPORT :{BLACK}Small
+STR_CITY_AIRPORT :{BLACK}City
+STR_METRO_AIRPORT :{BLACK}Metropolitan airport
+STR_INTERNATIONAL_AIRPORT :{BLACK}International airport
+STR_COMMUTER_AIRPORT :{BLACK}Commuter
+STR_INTERCONTINENTAL_AIRPORT :{BLACK}Intercontinental
+STR_HELIPORT :{BLACK}Heliport
+STR_HELIDEPOT :{BLACK}Helidepot
+STR_HELISTATION :{BLACK}Helistation
+
+STR_SMALL_AIRPORTS :{BLACK}Small airports
+STR_LARGE_AIRPORTS :{BLACK}Large airports
+STR_HUB_AIRPORTS :{BLACK}Hub airports
+STR_HELIPORTS :{BLACK}Helicopter airports
+########
diff --git a/newgrf_engine.c b/newgrf_engine.c
index 93d7bddaf..cc05de4ea 100644
--- a/newgrf_engine.c
+++ b/newgrf_engine.c
@@ -318,12 +318,16 @@ static byte MapAircraftMovementState(const Vehicle *v)
case TERM4:
case TERM5:
case TERM6:
+ case TERM7:
+ case TERM8:
/* TTDPatch only has 3 terminals, so treat these states the same */
if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD3;
return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
case HELIPAD1:
- case HELIPAD2: // Will only occur for helicopters.
+ case HELIPAD2:
+ case HELIPAD3:
+ case HELIPAD4: // Will only occur for helicopters.
if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPORT; // Descending.
if (amdflag & AMED_SLOWTURN) return AMS_TTDP_FLIGHT_TO_TOWER; // Still hasn't started descent.
return AMS_TTDP_TO_JUNCTION; // On the ground.
@@ -343,6 +347,12 @@ static byte MapAircraftMovementState(const Vehicle *v)
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;
@@ -374,6 +384,8 @@ static byte MapAircraftMovementState(const Vehicle *v)
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;
}
}
@@ -432,6 +444,10 @@ static byte MapAircraftMovementAction(const Vehicle *v)
case TERM4:
case TERM5:
case TERM6:
+ case TERM7:
+ case TERM8:
+ case HELIPAD3:
+ case HELIPAD4:
return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
case TAKEOFF: // Moving to takeoff position
@@ -615,13 +631,19 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
byte airporttype;
switch (GetStation(v->u.air.targetairport)->airport_type) {
- case AT_SMALL: airporttype = ATP_TTDP_SMALL; break;
+ /* Note, Helidepot and Helistation are treated as small airports
+ * as they are at ground level. */
+ case AT_HELIDEPOT:
+ case AT_HELISTATION:
+ case AT_COMMUTER:
+ case AT_SMALL: airporttype = ATP_TTDP_SMALL; break;
case AT_METROPOLITAN:
case AT_INTERNATIONAL:
- case AT_LARGE: airporttype = ATP_TTDP_LARGE; break;
- case AT_HELIPORT: airporttype = ATP_TTDP_HELIPORT; break;
- case AT_OILRIG: airporttype = ATP_TTDP_OILRIG; break;
- default: airporttype = ATP_TTDP_LARGE; break;
+ case AT_INTERCON:
+ case AT_LARGE: airporttype = ATP_TTDP_LARGE; break;
+ case AT_HELIPORT: airporttype = ATP_TTDP_HELIPORT; break;
+ case AT_OILRIG: airporttype = ATP_TTDP_OILRIG; break;
+ default: airporttype = ATP_TTDP_LARGE; break;
}
return (altitude << 8) | airporttype;
diff --git a/saveload.c b/saveload.c
index 9e925b2f7..0b12dde64 100644
--- a/saveload.c
+++ b/saveload.c
@@ -30,7 +30,7 @@
#include "variables.h"
#include <setjmp.h>
-const uint16 SAVEGAME_VERSION = 28;
+const uint16 SAVEGAME_VERSION = 29;
uint16 _sl_version; /// the major savegame version identifier
byte _sl_minor_version; /// the minor savegame version, DO NOT USE!
diff --git a/station.h b/station.h
index dd59b1ba9..b0edaa46b 100644
--- a/station.h
+++ b/station.h
@@ -128,6 +128,10 @@ enum {
CA_DOCK = 5,
CA_AIR_METRO = 6,
CA_AIR_INTER = 8,
+ CA_AIR_COMMUTER = 4,
+ CA_AIR_HELIDEPOT = 4,
+ CA_AIR_INTERCON = 10,
+ CA_AIR_HELISTATION = 4,
};
void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);
diff --git a/station_cmd.c b/station_cmd.c
index 76590b003..386a71a7a 100644
--- a/station_cmd.c
+++ b/station_cmd.c
@@ -180,6 +180,10 @@ static uint FindCatchmentRadius(const Station* st)
case AT_LARGE: ret = max(ret, CA_AIR_LARGE); break;
case AT_METROPOLITAN: ret = max(ret, CA_AIR_METRO); break;
case AT_INTERNATIONAL: ret = max(ret, CA_AIR_INTER); break;
+ case AT_COMMUTER: ret = max(ret, CA_AIR_COMMUTER); break;
+ case AT_HELIDEPOT: ret = max(ret, CA_AIR_HELIDEPOT); break;
+ case AT_INTERCON: ret = max(ret, CA_AIR_INTERCON); break;
+ case AT_HELISTATION: ret = max(ret, CA_AIR_HELISTATION); break;
}
}
@@ -1594,17 +1598,57 @@ static const byte _airport_sections_international[] = {
26, 23, 23, 23, 23, 23, 26
};
+// Intercontinental Airport (vlarge) - 4 runways
+static const byte _airport_sections_intercontinental[] = {
+ 102, 120, 89, 89, 89, 89, 89, 89, 118,
+ 120, 22, 22, 22, 22, 22, 22, 119, 117,
+ 87, 54, 87, 8, 8, 8, 8, 51, 117,
+ 87, 18, 87, 85, 116, 116, 8, 9, 10,
+ 87, 8, 8, 11, 31, 11, 8, 160, 32,
+ 32, 160, 8, 11, 27, 11, 8, 8, 10,
+ 87, 8, 8, 11, 30, 11, 8, 8, 10,
+ 87, 142, 8, 11, 29, 11, 10, 12, 10,
+ 87, 58, 87, 8, 8, 8, 10, 56, 117,
+ 87, 120, 89, 89, 89, 89, 89, 89, 119,
+ 121, 22, 22, 22, 22, 22, 22, 119, 37
+};
+
+
+// Commuter Airfield (small)
+static const byte _airport_sections_commuter[] = {
+ 85, 30, 115, 115, 32,
+ 87, 8, 8, 8, 10,
+ 87, 11, 11, 11, 10,
+ 26, 23, 23, 23, 26
+};
+
// Heliport
static const byte _airport_sections_heliport[] = {
66,
};
+// Helidepot
+static const byte _airport_sections_helidepot[] = {
+ 124, 32,
+ 122, 123
+};
+
+// Helistation
+static const byte _airport_sections_helistation[] = {
+ 32, 134, 159, 158,
+ 161, 142, 142, 157
+};
+
static const byte * const _airport_sections[] = {
- _airport_sections_country, // Country Airfield (small)
- _airport_sections_town, // City Airport (large)
- _airport_sections_heliport, // Heliport
- _airport_sections_metropolitan, // Metropolitain Airport (large)
- _airport_sections_international, // International Airport (xlarge)
+ _airport_sections_country, // Country Airfield (small)
+ _airport_sections_town, // City Airport (large)
+ _airport_sections_heliport, // Heliport
+ _airport_sections_metropolitan, // Metropolitain Airport (large)
+ _airport_sections_international, // International Airport (xlarge)
+ _airport_sections_commuter, // Commuter Airport (small)
+ _airport_sections_helidepot, // Helidepot
+ _airport_sections_intercontinental, // Intercontinental Airport (xxlarge)
+ _airport_sections_helistation // Helistation
};
/** Place an Airport.
@@ -1686,7 +1730,7 @@ int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
// if airport type equals Heliport then generate
// type 5 name, which is heliport, otherwise airport names (1)
- if (!GenerateStationName(st, tile, (p1 == AT_HELIPORT) ? 5 : 1))
+ if (!GenerateStationName(st, tile, (p1 == AT_HELIPORT)||(p1 == AT_HELIDEPOT)||(p1 == AT_HELISTATION) ? 5 : 1))
return CMD_ERROR;
if (flags & DC_EXEC) StationInitialize(st, tile);
@@ -2196,6 +2240,7 @@ static void TileLoop_Station(TileIndex tile)
case GFX_WINDSACK_FIRST : // for small airport
case GFX_RADAR_INTERNATIONAL_FIRST:
case GFX_RADAR_METROPOLITAN_FIRST:
+ case GFX_RADAR_DISTRICTWE_FIRST: // radar district W-E airport
AddAnimatedTile(tile);
break;
@@ -2226,7 +2271,7 @@ static void AnimateTile_Station(TileIndex tile)
SetStationGfx(tile, gfx);
MarkTileDirtyByTile(tile);
//added - begin
- } else if (IS_BYTE_INSIDE(gfx, GFX_RADAR_INTERNATIONAL_FIRST, GFX_RADAR_METROPOLITAN_LAST+1)) {
+ } else if (IS_BYTE_INSIDE(gfx, GFX_RADAR_INTERNATIONAL_FIRST, GFX_RADAR_METROPOLITAN_LAST + 1) || IS_BYTE_INSIDE(gfx, GFX_RADAR_DISTRICTWE_FIRST, GFX_RADAR_DISTRICTWE_LAST + 1) ) {
if (_tick_counter & 3)
return;
@@ -2238,6 +2283,9 @@ static void AnimateTile_Station(TileIndex tile)
else if (gfx == GFX_RADAR_METROPOLITAN_LAST+1) {
gfx = GFX_RADAR_METROPOLITAN_FIRST;
}
+ else if (gfx == GFX_RADAR_DISTRICTWE_LAST + 1) {
+ gfx = GFX_RADAR_DISTRICTWE_FIRST;
+ }
SetStationGfx(tile, gfx);
MarkTileDirtyByTile(tile);
diff --git a/station_map.h b/station_map.h
index 7033f63aa..9ed3de987 100644
--- a/station_map.h
+++ b/station_map.h
@@ -38,7 +38,9 @@ enum {
GFX_RADAR_INTERNATIONAL_LAST = 101,
GFX_RADAR_METROPOLITAN_FIRST = 102,
GFX_RADAR_METROPOLITAN_LAST = 113,
- GFX_BASE_END = 155
+ GFX_RADAR_DISTRICTWE_FIRST = 145,
+ GFX_RADAR_DISTRICTWE_LAST = 156,
+ GFX_BASE_END = 161
};
enum {
@@ -53,7 +55,10 @@ enum {
typedef enum HangarTiles {
HANGAR_TILE_0 = 32,
HANGAR_TILE_1 = 65,
- HANGAR_TILE_2 = 86
+ HANGAR_TILE_2 = 86,
+ HANGAR_TILE_3 = 129, // added for west facing hangar
+ HANGAR_TILE_4 = 130, // added for north facing hangar
+ HANGAR_TILE_5 = 131 // added for east facing hangar
} HangarTiles;
typedef enum StationType {
@@ -102,7 +107,10 @@ static inline bool IsHangar(TileIndex t)
return
gfx == HANGAR_TILE_0 ||
gfx == HANGAR_TILE_1 ||
- gfx == HANGAR_TILE_2;
+ gfx == HANGAR_TILE_2 ||
+ gfx == HANGAR_TILE_3 ||
+ gfx == HANGAR_TILE_4 ||
+ gfx == HANGAR_TILE_5;
}
static inline bool IsAirport(TileIndex t)
diff --git a/table/sprites.h b/table/sprites.h
index c74239e35..cbebb555e 100644
--- a/table/sprites.h
+++ b/table/sprites.h
@@ -80,6 +80,21 @@ enum Sprites {
SPR_LOCK = SPR_OPENTTD_BASE + 19, // lock icon (for password protected servers)
SPR_FLAGS_BASE = SPR_OPENTTD_BASE + 83, // start of the flags block (in same order as enum NetworkLanguage)
+ SPR_AIRPORTX_BASE = SPR_OPENTTD_BASE + 95, // The sprites used for other airport angles
+ SPR_NEWAIRPORT_TARMAC = SPR_AIRPORTX_BASE,
+ SPR_NSRUNWAY1 = SPR_AIRPORTX_BASE + 1,
+ SPR_NSRUNWAY2 = SPR_AIRPORTX_BASE + 2,
+ SPR_NSRUNWAY3 = SPR_AIRPORTX_BASE + 3,
+ SPR_NSRUNWAY4 = SPR_AIRPORTX_BASE + 4,
+ SPR_NSRUNWAY_END = SPR_AIRPORTX_BASE + 5,
+ SPR_NEWHANGAR_S = SPR_AIRPORTX_BASE + 6,
+ SPR_NEWHANGAR_S_WALL = SPR_AIRPORTX_BASE + 7,
+ SPR_NEWHANGAR_W = SPR_AIRPORTX_BASE + 8,
+ SPR_NEWHANGAR_W_WALL = SPR_AIRPORTX_BASE + 9,
+ SPR_NEWHANGAR_N = SPR_AIRPORTX_BASE + 10,
+ SPR_NEWHANGAR_E = SPR_AIRPORTX_BASE + 11,
+ SPR_NEWHELIPAD = SPR_AIRPORTX_BASE + 12,
+
/* Manager face sprites */
SPR_GRADIENT = 874, // background gradient behind manager face
@@ -317,6 +332,7 @@ enum Sprites {
SPR_AIRPORT_RADAR_B = 2690,
SPR_AIRPORT_RADAR_C = 2691,
SPR_AIRPORT_HELIPAD = SPR_OPENTTD_BASE + 28,
+ SPR_AIRPORT_HELIDEPOT_OFFICE = 2095,
/* Road Stops */
/* Road stops have a ground tile and 3 buildings, one on each side
diff --git a/table/station_land.h b/table/station_land.h
index cfdf28039..65ed12f28 100644
--- a/table/station_land.h
+++ b/table/station_land.h
@@ -63,12 +63,12 @@ static const DrawTileSeqStruct _station_display_datas_8[] = {
};
static const DrawTileSeqStruct _station_display_datas_9[] = {
- { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR },
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
TILE_SEQ_END()
};
static const DrawTileSeqStruct _station_display_datas_10[] = {
- { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR },
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
TILE_SEQ_END()
};
@@ -678,6 +678,344 @@ static const DrawTileSeqStruct _station_display_datas_0114[] = {
TILE_SEQ_END()
};
+// helipad for commuter airport
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0115[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences left
+ TILE_SEQ_END()
+};
+
+// helipad for continental airport
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0116[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ TILE_SEQ_END()
+};
+
+// asphalt tile with fences in north and south
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0117[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR },
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR },
+ TILE_SEQ_END()
+};
+
+// runway tiles with 2 corner fences
+static const DrawTileSeqStruct _station_display_datas_0118[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
+ TILE_SEQ_END()
+};
+
+// runway tiles with 2 corner fences
+static const DrawTileSeqStruct _station_display_datas_0119[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// runway tiles with 2 corner fences
+static const DrawTileSeqStruct _station_display_datas_0120[] = {
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ TILE_SEQ_END()
+};
+
+// runway tiles with 2 corner fences
+static const DrawTileSeqStruct _station_display_datas_0121[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// ======== new 2x2 helidepot ========
+// helipad tiles with 2 corner fences top+right
+static const DrawTileSeqStruct _station_display_datas_0122[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// tarmac tiles with 2 corner fences bottom+right
+static const DrawTileSeqStruct _station_display_datas_0123[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences north
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// helidepot office with concrete underground and no fence
+// concrete underground, fences top + left
+static const DrawTileSeqStruct _station_display_datas_0124[] = {
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences left
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ { 3, 3, 0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | PALETTE_MODIFIER_COLOR }, // helidepot office
+ TILE_SEQ_END()
+};
+
+// N/S runway plain
+static const DrawTileSeqStruct _station_display_datas_0125[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ TILE_SEQ_END()
+};
+
+// N/S runway end
+static const DrawTileSeqStruct _station_display_datas_0126[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ TILE_SEQ_END()
+};
+
+// N/S runway plain
+static const DrawTileSeqStruct _station_display_datas_0127[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences bottom
+ TILE_SEQ_END()
+};
+
+// N/S runway end
+static const DrawTileSeqStruct _station_display_datas_0128[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences bottom
+ TILE_SEQ_END()
+};
+
+// West facing hangar
+static const DrawTileSeqStruct _station_display_datas_0129[] = {
+ { 14, 0, 0, 2, 16, 28, SPR_NEWHANGAR_W | PALETTE_MODIFIER_COLOR },
+ { 0, 0, 0, 2, 16, 28, SPR_NEWHANGAR_W_WALL },
+ TILE_SEQ_END()
+};
+
+// North facing hangar
+static const DrawTileSeqStruct _station_display_datas_0130[] = {
+ { 14, 0, 0, 2, 16, 28, SPR_NEWHANGAR_N | PALETTE_MODIFIER_COLOR },
+ TILE_SEQ_END()
+};
+
+// East facing hangar
+static const DrawTileSeqStruct _station_display_datas_0131[] = {
+ { 14, 0, 0, 2, 16, 28, SPR_NEWHANGAR_E | PALETTE_MODIFIER_COLOR },
+ TILE_SEQ_END()
+};
+
+// helipad for district airport NS
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0132[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences bottom
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences right
+ TILE_SEQ_END()
+};
+
+// helipad for district airport NS
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0133[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// helidepot office with concrete underground and fence north
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0134[] = {
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
+ { 3, 3, 0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | PALETTE_MODIFIER_COLOR }, // helidepot office
+ TILE_SEQ_END()
+};
+
+// helidepot office with concrete underground and fence east
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0135[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ { 3, 3, 0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | PALETTE_MODIFIER_COLOR }, // helidepot office
+ TILE_SEQ_END()
+};
+
+// helidepot office with concrete underground and fence west
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0136[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ { 3, 3, 0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | PALETTE_MODIFIER_COLOR }, // helidepot office
+ TILE_SEQ_END()
+};
+
+// helidepot office with concrete underground and fence south
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0137[] = {
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ { 3, 3, 0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | PALETTE_MODIFIER_COLOR }, // helidepot office
+ TILE_SEQ_END()
+};
+
+// terminal with fence to east
+static const DrawTileSeqStruct _station_display_datas_0138[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ TILE_SEQ_END()
+};
+
+// terminal with fence to south
+static const DrawTileSeqStruct _station_display_datas_0139[] = {
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// terminal with fence to north
+static const DrawTileSeqStruct _station_display_datas_0140[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ TILE_SEQ_END()
+};
+
+// concrete with fence to east
+static const DrawTileSeqStruct _station_display_datas_0141[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ TILE_SEQ_END()
+};
+
+// concrete with fence to south
+static const DrawTileSeqStruct _station_display_datas_0142[] = {
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// helipad for district airport EW
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0143[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
+ TILE_SEQ_END()
+};
+
+// helipad for district airport EW
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0144[] = {
+ { 10, 6, 0, 0, 0, 0, SPR_AIRPORT_HELIPAD },
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ TILE_SEQ_END()
+};
+
+// turning radar with concrete underground fences on south -- needs 12 tiles
+// concrete underground
+//BEGIN
+static const DrawTileSeqStruct _station_display_datas_0145[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_1 }, // turning radar
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0146[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_2 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0147[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_3 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0148[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_4 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0149[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_5 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0150[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_6 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0151[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_7 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0152[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_8 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0153[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_9 },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0154[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_A },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0155[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_B },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0156[] = {
+ { 7, 7, 0, 2, 2, 8, SPR_AIRPORT_RADAR_C },
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+//END
+
+// helipad for helistation
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0157[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
+// helipad for helistation
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0158[] = {
+ { 15, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences west
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
+ TILE_SEQ_END()
+};
+
+// helipad for helistation
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0159[] = {
+ { 0, 0, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences north
+ TILE_SEQ_END()
+};
+
+// helidepot office with concrete underground - no fence
+static const DrawTileSeqStruct _station_display_datas_0160[] = {
+ { 3, 3, 0, 10, 10, 60, SPR_AIRPORT_HELIDEPOT_OFFICE | PALETTE_MODIFIER_COLOR }, // helidepot office
+ TILE_SEQ_END()
+};
+
+// concrete underground
+static const DrawTileSeqStruct _station_display_datas_0161[] = {
+ { 0, 0, 0, 1, 16, 6, SPR_AIRPORT_FENCE_Y | PALETTE_MODIFIER_COLOR }, // fences east
+ { 0, 15, 0, 16, 1, 6, SPR_AIRPORT_FENCE_X | PALETTE_MODIFIER_COLOR }, // fences south
+ TILE_SEQ_END()
+};
+
static const DrawTileSprites _station_display_datas[] = {
{ SPR_RAIL_TRACK_X, _station_display_datas_0 },
{ SPR_RAIL_TRACK_Y, _station_display_datas_1 },
@@ -794,4 +1132,51 @@ static const DrawTileSprites _station_display_datas[] = {
{ SPR_AIRPORT_APRON, _station_display_datas_0112 },
{ SPR_AIRPORT_APRON, _station_display_datas_0113 },
{ SPR_AIRPORT_APRON, _station_display_datas_0114 },
+ { SPR_AIRPORT_APRON, _station_display_datas_0115 },
+ { SPR_AIRPORT_APRON, _station_display_datas_0116 },
+ { SPR_AIRPORT_APRON, _station_display_datas_0117 },
+ { SPR_AIRPORT_RUNWAY_END, _station_display_datas_0118 },
+ { SPR_AIRPORT_RUNWAY_END, _station_display_datas_0119 },
+ { SPR_AIRPORT_RUNWAY_END, _station_display_datas_0120 },
+ { SPR_AIRPORT_RUNWAY_END, _station_display_datas_0121 },
+ { SPR_AIRPORT_APRON, _station_display_datas_0122 },
+ { SPR_AIRPORT_APRON, _station_display_datas_0123 },
+ { SPR_AIRPORT_APRON, _station_display_datas_0124 },
+ { SPR_NSRUNWAY1, _station_display_datas_0125 },
+ { SPR_NSRUNWAY_END, _station_display_datas_0126 },
+ { SPR_NSRUNWAY1, _station_display_datas_0127 },
+ { SPR_NSRUNWAY_END, _station_display_datas_0128 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0129 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0130 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0131 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0132 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0133 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0134 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0135 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0136 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0137 },
+ { SPR_AIRPORT_AIRCRAFT_STAND, _station_display_datas_0138 },
+ { SPR_AIRPORT_AIRCRAFT_STAND, _station_display_datas_0139 },
+ { SPR_AIRPORT_AIRCRAFT_STAND, _station_display_datas_0140 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0141 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0142 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0143 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0144 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0145 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0146 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0147 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0148 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0149 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0150 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0151 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0152 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0153 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0154 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0155 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0156 },
+ { SPR_NEWHELIPAD, _station_display_datas_0157 },
+ { SPR_NEWHELIPAD, _station_display_datas_0158 },
+ { SPR_NEWHELIPAD, _station_display_datas_0159 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0160 },
+ { SPR_NEWAIRPORT_TARMAC, _station_display_datas_0161 },
};