summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/aircraft.h8
-rw-r--r--src/aircraft_cmd.cpp2
-rw-r--r--src/autoreplace_cmd.cpp2
-rw-r--r--src/ground_vehicle.cpp22
-rw-r--r--src/ground_vehicle.hpp1
-rw-r--r--src/roadveh.h1
-rw-r--r--src/roadveh_cmd.cpp15
-rw-r--r--src/script/api/script_vehicle.cpp2
-rw-r--r--src/ship_cmd.cpp4
-rw-r--r--src/train.h3
-rw-r--r--src/train_cmd.cpp32
-rw-r--r--src/vehicle_base.h14
-rw-r--r--src/vehicle_cmd.cpp10
-rw-r--r--src/vehicle_gui.cpp2
14 files changed, 55 insertions, 63 deletions
diff --git a/src/aircraft.h b/src/aircraft.h
index b6c847812..dc8387f84 100644
--- a/src/aircraft.h
+++ b/src/aircraft.h
@@ -78,7 +78,13 @@ struct Aircraft FINAL : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
int GetSpeedOldUnits() const { return this->vcache.cached_max_speed * 10 / 128; }
int GetCurrentMaxSpeed() const { return this->GetSpeedOldUnits(); }
Money GetRunningCost() const;
- bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
+
+ bool IsInDepot() const
+ {
+ assert(this->IsPrimaryVehicle());
+ return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile);
+ }
+
bool Tick();
void OnNewDay();
uint Crash(bool flooded = false);
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index fc59f6553..6a628cca6 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -365,7 +365,7 @@ bool Aircraft::FindClosestDepot(TileIndex *location, DestinationID *destination,
static void CheckIfAircraftNeedsService(Aircraft *v)
{
if (Company::Get(v->owner)->settings.vehicle.servint_aircraft == 0 || !v->NeedsAutomaticServicing()) return;
- if (v->IsInDepot()) {
+ if (v->IsChainInDepot()) {
VehicleServiceInDepot(v);
return;
}
diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp
index 95669a244..1f1717f98 100644
--- a/src/autoreplace_cmd.cpp
+++ b/src/autoreplace_cmd.cpp
@@ -665,7 +665,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
CommandCost ret = CheckOwnership(v->owner);
if (ret.Failed()) return ret;
- if (!v->IsInDepot()) return CMD_ERROR;
+ if (!v->IsChainInDepot()) return CMD_ERROR;
if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
bool free_wagon = false;
diff --git a/src/ground_vehicle.cpp b/src/ground_vehicle.cpp
index 27e9776b9..5712b28f9 100644
--- a/src/ground_vehicle.cpp
+++ b/src/ground_vehicle.cpp
@@ -12,6 +12,7 @@
#include "stdafx.h"
#include "train.h"
#include "roadveh.h"
+#include "depot_map.h"
/**
* Recalculates the cached total power of a vehicle. Should be called when the consist is changed.
@@ -164,6 +165,27 @@ int GroundVehicle<T, Type>::GetAcceleration() const
}
}
+/**
+ * Check whether the whole vehicle chain is in the depot.
+ * @return true if and only if the whole chain is in the depot.
+ */
+template <class T, VehicleType Type>
+bool GroundVehicle<T, Type>::IsChainInDepot() const
+{
+ const T *v = this->First();
+ /* Is the front engine stationary in the depot? */
+ assert_compile((int)TRANSPORT_RAIL == (int)VEH_TRAIN);
+ assert_compile((int)TRANSPORT_ROAD == (int)VEH_ROAD);
+ if (!IsDepotTypeTile(v->tile, (TransportType)Type) || v->cur_speed != 0) return false;
+
+ /* Check whether the rest is also already trying to enter the depot. */
+ for (; v != NULL; v = v->Next()) {
+ if (!v->T::IsInDepot() || v->tile != this->tile) return false;
+ }
+
+ return true;
+}
+
/* Instantiation for Train */
template struct GroundVehicle<Train, VEH_TRAIN>;
/* Instantiation for RoadVehicle */
diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp
index a06d6c71b..65c856295 100644
--- a/src/ground_vehicle.hpp
+++ b/src/ground_vehicle.hpp
@@ -92,6 +92,7 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
void PowerChanged();
void CargoChanged();
int GetAcceleration() const;
+ bool IsChainInDepot() const;
/**
* Common code executed for crashed ground vehicles
diff --git a/src/roadveh.h b/src/roadveh.h
index 6358cef7f..956cc00a6 100644
--- a/src/roadveh.h
+++ b/src/roadveh.h
@@ -113,7 +113,6 @@ struct RoadVehicle FINAL : public GroundVehicle<RoadVehicle, VEH_ROAD> {
Money GetRunningCost() const;
int GetDisplayImageWidth(Point *offset = NULL) const;
bool IsInDepot() const { return this->state == RVSB_IN_DEPOT; }
- bool IsStoppedInDepot() const;
bool Tick();
void OnNewDay();
uint Crash(bool flooded = false);
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index eed844dfe..62eb67915 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -306,19 +306,6 @@ CommandCost CmdBuildRoadVehicle(TileIndex tile, DoCommandFlag flags, const Engin
return CommandCost();
}
-bool RoadVehicle::IsStoppedInDepot() const
-{
- TileIndex tile = this->tile;
-
- if (!IsRoadDepotTile(tile)) return false;
- if (this->IsFrontEngine() && !(this->vehstatus & VS_STOPPED)) return false;
-
- for (const RoadVehicle *v = this; v != NULL; v = v->Next()) {
- if (v->state != RVSB_IN_DEPOT || v->tile != tile) return false;
- }
- return true;
-}
-
static FindDepotData FindClosestRoadDepot(const RoadVehicle *v, int max_distance)
{
if (IsRoadDepotTile(v->tile)) return FindDepotData(v->tile, 0);
@@ -1582,7 +1569,7 @@ static void CheckIfRoadVehNeedsService(RoadVehicle *v)
{
/* If we already got a slot at a stop, use that FIRST, and go to a depot later */
if (Company::Get(v->owner)->settings.vehicle.servint_roadveh == 0 || !v->NeedsAutomaticServicing()) return;
- if (v->IsInDepot()) {
+ if (v->IsChainInDepot()) {
VehicleServiceInDepot(v);
return;
}
diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp
index c4c6ca590..639b42f4b 100644
--- a/src/script/api/script_vehicle.cpp
+++ b/src/script/api/script_vehicle.cpp
@@ -182,7 +182,7 @@
/* static */ bool ScriptVehicle::IsInDepot(VehicleID vehicle_id)
{
if (!IsValidVehicle(vehicle_id)) return false;
- return ::Vehicle::Get(vehicle_id)->IsInDepot();
+ return ::Vehicle::Get(vehicle_id)->IsChainInDepot();
}
/* static */ bool ScriptVehicle::IsStoppedInDepot(VehicleID vehicle_id)
diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp
index 6b6ec4715..ed43cf7d2 100644
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -142,7 +142,7 @@ static const Depot *FindClosestShipDepot(const Vehicle *v, uint max_distance)
static void CheckIfShipNeedsService(Vehicle *v)
{
if (Company::Get(v->owner)->settings.vehicle.servint_ships == 0 || !v->NeedsAutomaticServicing()) return;
- if (v->IsInDepot()) {
+ if (v->IsChainInDepot()) {
VehicleServiceInDepot(v);
return;
}
@@ -298,7 +298,7 @@ static const TileIndexDiffC _ship_leave_depot_offs[] = {
static bool CheckShipLeaveDepot(Ship *v)
{
- if (!v->IsInDepot()) return false;
+ if (!v->IsChainInDepot()) return false;
/* We are leaving a depot, but have to go to the exact same one; re-enter */
if (v->current_order.IsType(OT_GOTO_DEPOT) &&
diff --git a/src/train.h b/src/train.h
index 80e8b3494..85c9edf67 100644
--- a/src/train.h
+++ b/src/train.h
@@ -101,8 +101,7 @@ struct Train FINAL : public GroundVehicle<Train, VEH_TRAIN> {
int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
Money GetRunningCost() const;
int GetDisplayImageWidth(Point *offset = NULL) const;
- bool IsInDepot() const;
- bool IsStoppedInDepot() const;
+ bool IsInDepot() const { return this->track == TRACK_BIT_DEPOT; }
bool Tick();
void OnNewDay();
uint Crash(bool flooded = false);
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index c78300f19..34ac24cd8 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -732,34 +732,6 @@ CommandCost CmdBuildRailVehicle(TileIndex tile, DoCommandFlag flags, const Engin
return CommandCost();
}
-/**
- * Is the whole consist the in a depot?
- * @return \c true iff all vehicles of the train are in a depot.
- */
-bool Train::IsInDepot() const
-{
- /* Is the front engine stationary in the depot? */
- if (!IsRailDepotTile(this->tile) || this->cur_speed != 0) return false;
-
- /* Check whether the rest is also already trying to enter the depot. */
- for (const Train *v = this; v != NULL; v = v->Next()) {
- if (v->track != TRACK_BIT_DEPOT || v->tile != this->tile) return false;
- }
-
- return true;
-}
-
-/**
- * Is the train stopped in a depot?
- * @return True if the train is stopped in a depot, else false.
- */
-bool Train::IsStoppedInDepot() const
-{
- /* Are we stopped? Of course wagons don't really care... */
- if (this->IsFrontEngine() && !(this->vehstatus & VS_STOPPED)) return false;
- return this->IsInDepot();
-}
-
static Train *FindGoodVehiclePos(const Train *src)
{
EngineID eng = src->engine_type;
@@ -1946,7 +1918,7 @@ CommandCost CmdForceTrainProceed(TileIndex tile, DoCommandFlag flags, uint32 p1,
* to proceed to the next signal. In the other cases we
* would like to pass the signal at danger and run till the
* next signal we encounter. */
- t->force_proceed = t->force_proceed == TFP_SIGNAL ? TFP_NONE : HasBit(t->flags, VRF_TRAIN_STUCK) || t->IsInDepot() ? TFP_STUCK : TFP_SIGNAL;
+ t->force_proceed = t->force_proceed == TFP_SIGNAL ? TFP_NONE : HasBit(t->flags, VRF_TRAIN_STUCK) || t->IsChainInDepot() ? TFP_STUCK : TFP_SIGNAL;
SetWindowDirty(WC_VEHICLE_VIEW, t->index);
}
@@ -3897,7 +3869,7 @@ bool Train::Tick()
static void CheckIfTrainNeedsService(Train *v)
{
if (Company::Get(v->owner)->settings.vehicle.servint_trains == 0 || !v->NeedsAutomaticServicing()) return;
- if (v->IsInDepot()) {
+ if (v->IsChainInDepot()) {
VehicleServiceInDepot(v);
return;
}
diff --git a/src/vehicle_base.h b/src/vehicle_base.h
index 7b2f371fa..fa06519e0 100644
--- a/src/vehicle_base.h
+++ b/src/vehicle_base.h
@@ -417,10 +417,22 @@ public:
virtual bool IsInDepot() const { return false; }
/**
+ * Check whether the whole vehicle chain is in the depot.
+ * @return true if and only if the whole chain is in the depot.
+ */
+ virtual bool IsChainInDepot() const { return this->IsInDepot(); }
+
+ /**
* Check whether the vehicle is in the depot *and* stopped.
* @return true if and only if the vehicle is in the depot and stopped.
*/
- virtual bool IsStoppedInDepot() const { return this->IsInDepot() && (this->vehstatus & VS_STOPPED) != 0; }
+ bool IsStoppedInDepot() const
+ {
+ assert(this == this->First());
+ /* Free wagons have no VS_STOPPED state */
+ if (this->IsPrimaryVehicle() && !(this->vehstatus & VS_STOPPED)) return false;
+ return this->IsChainInDepot();
+ }
/**
* Calls the tick handler of the vehicle
diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp
index cf225a210..bfcdb6862 100644
--- a/src/vehicle_cmd.cpp
+++ b/src/vehicle_cmd.cpp
@@ -601,13 +601,7 @@ CommandCost CmdMassStartStopVehicle(TileIndex tile, DoCommandFlag flags, uint32
if (!!(v->vehstatus & VS_STOPPED) != do_start) continue;
- if (!vehicle_list_window) {
- if (vli.vtype == VEH_TRAIN) {
- if (!Train::From(v)->IsInDepot()) continue;
- } else {
- if (!(v->vehstatus & VS_HIDDEN)) continue;
- }
- }
+ if (!vehicle_list_window && !v->IsChainInDepot()) continue;
/* Just try and don't care if some vehicle's can't be stopped. */
DoCommand(tile, v->index, 0, flags, CMD_START_STOP_VEHICLE);
@@ -679,7 +673,7 @@ CommandCost CmdDepotMassAutoReplace(TileIndex tile, DoCommandFlag flags, uint32
const Vehicle *v = list[i];
/* Ensure that the vehicle completely in the depot */
- if (!v->IsInDepot()) continue;
+ if (!v->IsChainInDepot()) continue;
CommandCost ret = DoCommand(0, v->index, 0, flags, CMD_AUTOREPLACE_VEHICLE);
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index 353d710b0..d307468e9 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -1292,7 +1292,7 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int
if (show_orderlist) DrawSmallOrderList(v, orderlist_left, orderlist_right, y, v->cur_real_order_index);
- if (v->IsInDepot()) {
+ if (v->IsChainInDepot()) {
str = STR_BLUE_COMMA;
} else {
str = (v->age > v->max_age - DAYS_IN_LEAP_YEAR) ? STR_RED_COMMA : STR_BLACK_COMMA;