summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/aircraft.h14
-rw-r--r--src/aircraft_cmd.cpp10
-rw-r--r--src/build_vehicle_gui.cpp23
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;