From f61f1962c5e3422e56d0b1a03038d8ec27ade93a Mon Sep 17 00:00:00 2001 From: bjarni Date: Tue, 6 Mar 2007 22:11:58 +0000 Subject: [PATCH] (svn r9040) -Codechange: the build window and CmdBuildAircraft() now shares the code to figure out if an aircraft is buildable in the hangar in question This should help ensuring that the build command and the list are consistent in what aircraft are buildable --- src/aircraft.h | 14 ++++++++++++++ src/aircraft_cmd.cpp | 10 ++++------ src/build_vehicle_gui.cpp | 23 ++++------------------- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/aircraft.h b/src/aircraft.h index 048e70afef..f020b2504a 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 429b16d4ff..ad4b11c32d 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 5227b8944a..03e09707b0 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;