diff options
-rw-r--r-- | src/aircraft.h | 14 | ||||
-rw-r--r-- | src/aircraft_cmd.cpp | 10 | ||||
-rw-r--r-- | src/build_vehicle_gui.cpp | 23 |
3 files changed, 22 insertions, 25 deletions
diff --git a/src/aircraft.h b/src/aircraft.h index 048e70afe..f020b2504 100644 --- a/src/aircraft.h +++ b/src/aircraft.h @@ -42,6 +42,20 @@ static inline bool IsAircraftInHangarStopped(const Vehicle* v) return IsAircraftInHangar(v) && v->vehstatus & VS_STOPPED; } +/** Checks if an aircraft is buildable at the tile in question + * @param engine The engine to test + * @param tile The tile where the hangar is + * @return true if the aircraft can be build + */ +static inline bool IsAircraftBuildableAtStation(EngineID engine, TileIndex tile) +{ + 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); +} + uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo*); void CcBuildAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2); diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 429b16d4f..ad4b11c32 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -227,7 +227,6 @@ uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo *avi) } } - /** Build an aircraft. * @param tile tile of depot where aircraft is built * @param flags for command @@ -250,11 +249,7 @@ int32 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 */ - const Station* st = GetStationByTile(tile); - const AirportFTAClass* apc = st->Airport(); - if (!(apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS))) { - return CMD_ERROR; - } + if (!IsAircraftBuildableAtStation(p1, tile)) return CMD_ERROR; /* Allocate 2 or 3 vehicle structs, depending on type * vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */ @@ -367,6 +362,9 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) * layout for #th position of depot. Since layout must start with a listing * of all depots, it is simple */ for (uint i = 0;; i++) { + const Station *st = GetStationByTile(tile); + const AirportFTAClass *apc = st->Airport(); + assert(i != apc->nof_depots); if (st->airport_tile + ToTileIndexDiff(apc->airport_depots[i]) == tile) { assert(apc->layout[i].heading == HANGAR); diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 5227b8944..03e09707b 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -694,26 +694,11 @@ static void GenerateBuildAircraftList(Window *w) * when planes become obsolete and are removed */ sel_id = INVALID_ENGINE; for (eid = AIRCRAFT_ENGINES_INDEX; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; eid++) { - if (IsEngineBuildable(eid, VEH_Aircraft, _local_player)) { - const AircraftVehicleInfo *avi = AircraftVehInfo(eid); - switch (bv->filter.flags & ~AirportFTAClass::SHORT_STRIP) { // we don't care about the length of the runway here - case AirportFTAClass::HELICOPTERS: - if (avi->subtype != AIR_HELI) continue; - break; - - case AirportFTAClass::AIRPLANES: - if (!(avi->subtype & AIR_CTOL)) continue; - break; - - case AirportFTAClass::ALL: break; - default: - NOT_REACHED(); - } - - EngList_Add(&bv->eng_list, eid); + if (!IsEngineBuildable(eid, VEH_Aircraft, _local_player)) continue; + if (w->window_number != 0 && !IsAircraftBuildableAtStation(eid, w->window_number)) continue; - if (eid == bv->sel_engine) sel_id = eid; - } + EngList_Add(&bv->eng_list, eid); + if (eid == bv->sel_engine) sel_id = eid; } bv->sel_engine = sel_id; |