From 8e5480aa1697c1e86308a898875b37324dc4200b Mon Sep 17 00:00:00 2001 From: glx Date: Fri, 5 Oct 2007 22:13:35 +0000 Subject: (svn r11214) -Fix [FS#1296]: planes can't use heliports so refuse these orders --- src/aircraft.h | 19 ++++++++++++++----- src/aircraft_cmd.cpp | 2 +- src/build_vehicle_gui.cpp | 2 +- src/order_cmd.cpp | 10 +++++++--- 4 files changed, 23 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/aircraft.h b/src/aircraft.h index bd274f3a9..25dd586ea 100644 --- a/src/aircraft.h +++ b/src/aircraft.h @@ -33,20 +33,29 @@ static inline bool IsNormalAircraft(const Vehicle *v) return v->subtype <= AIR_AIRCRAFT; } -/** Checks if an aircraft is buildable at the tile in question +/** Checks if an aircraft can use the station in question * @param engine The engine to test - * @param tile The tile where the hangar is - * @return true if the aircraft can be build + * @param st The station + * @return true if the aircraft can use the station */ -static inline bool IsAircraftBuildableAtStation(EngineID engine, TileIndex tile) +static inline bool CanAircraftUseStation(EngineID engine, const Station *st) { - const Station *st = GetStationByTile(tile); const AirportFTAClass *apc = st->Airport(); const AircraftVehicleInfo *avi = AircraftVehInfo(engine); return (apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS)) != 0; } +/** Checks if an aircraft can use the station at the tile in question + * @param engine The engine to test + * @param tile The tile where the station is + * @return true if the aircraft can use the station + */ +static inline bool CanAircraftUseStation(EngineID engine, TileIndex tile) +{ + return CanAircraftUseStation(engine, GetStationByTile(tile)); +} + /** * Calculates cargo capacity based on an aircraft's passenger * and mail capacities. diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index e1b1ba77f..b8bbf8d07 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -282,7 +282,7 @@ CommandCost CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); /* Prevent building aircraft types at places which can't handle them */ - if (!IsAircraftBuildableAtStation(p1, tile)) return CMD_ERROR; + if (!CanAircraftUseStation(p1, tile)) return CMD_ERROR; /* Allocate 2 or 3 vehicle structs, depending on type * vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */ diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 4cbc267be..bd4938111 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -765,7 +765,7 @@ static void GenerateBuildAircraftList(Window *w) for (eid = AIRCRAFT_ENGINES_INDEX; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; eid++) { if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue; /* First VEH_END window_numbers are fake to allow a window open for all different types at once */ - if (w->window_number > VEH_END && !IsAircraftBuildableAtStation(eid, w->window_number)) continue; + if (w->window_number > VEH_END && !CanAircraftUseStation(eid, w->window_number)) continue; EngList_Add(&bv->eng_list, eid); if (eid == bv->sel_engine) sel_id = eid; diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index d8c570540..e9ed59545 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -19,6 +19,7 @@ #include "vehicle_gui.h" #include "cargotype.h" #include "strings.h" +#include "aircraft.h" DEFINE_OLD_POOL_GENERIC(Order, Order) @@ -198,7 +199,9 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) break; case VEH_AIRCRAFT: - if (!(st->facilities & FACIL_AIRPORT)) return CMD_ERROR; + if (!(st->facilities & FACIL_AIRPORT) || !CanAircraftUseStation(v->engine_type, st)) { + return CMD_ERROR; + } break; default: return CMD_ERROR; @@ -239,7 +242,8 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) if (!CheckOwnership(st->owner) || !(st->facilities & FACIL_AIRPORT) || - st->Airport()->nof_depots == 0) { + st->Airport()->nof_depots == 0 || + !CanAircraftUseStation(v->engine_type, st)) { return CMD_ERROR; } } else { @@ -1038,7 +1042,7 @@ static TileIndex GetStationTileForVehicle(const Vehicle* v, const Station* st) switch (v->type) { default: NOT_REACHED(); case VEH_TRAIN: return st->train_tile; - case VEH_AIRCRAFT: return st->airport_tile; + case VEH_AIRCRAFT: return CanAircraftUseStation(v->engine_type, st) ? st->airport_tile : 0; case VEH_SHIP: return st->dock_tile; case VEH_ROAD: if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) { -- cgit v1.2.3-54-g00ecf