diff options
-rw-r--r-- | aircraft_cmd.c | 33 | ||||
-rw-r--r-- | airport.c | 101 | ||||
-rw-r--r-- | airport.h | 78 | ||||
-rw-r--r-- | airport_gui.c | 59 | ||||
-rw-r--r-- | airport_movement.h | 424 | ||||
-rw-r--r-- | data/airports.grf | bin | 0 -> 9110 bytes | |||
-rw-r--r-- | gfxinit.c | 3 | ||||
-rw-r--r-- | lang/english.txt | 23 | ||||
-rw-r--r-- | newgrf_engine.c | 34 | ||||
-rw-r--r-- | saveload.c | 2 | ||||
-rw-r--r-- | station.h | 4 | ||||
-rw-r--r-- | station_cmd.c | 62 | ||||
-rw-r--r-- | station_map.h | 14 | ||||
-rw-r--r-- | table/sprites.h | 16 | ||||
-rw-r--r-- | table/station_land.h | 389 |
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; } } @@ -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; } @@ -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 Binary files differnew file mode 100644 index 000000000..339534afb --- /dev/null +++ b/data/airports.grf @@ -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! @@ -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 }, }; |