summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--roadveh_cmd.c3
-rw-r--r--ship_cmd.c3
-rw-r--r--train_cmd.c6
-rw-r--r--vehicle.c3
4 files changed, 14 insertions, 1 deletions
diff --git a/roadveh_cmd.c b/roadveh_cmd.c
index 670af9f6a..08507023d 100644
--- a/roadveh_cmd.c
+++ b/roadveh_cmd.c
@@ -353,6 +353,9 @@ int32 CmdSendRoadVehToDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (v->type != VEH_Road || !CheckOwnership(v->owner))
return CMD_ERROR;
+ if (v->vehstatus & VS_CRASHED)
+ return CMD_ERROR;
+
if (v->current_order.type == OT_GOTO_DEPOT) {
if (flags & DC_EXEC) {
diff --git a/ship_cmd.c b/ship_cmd.c
index 75ef25736..90810ad96 100644
--- a/ship_cmd.c
+++ b/ship_cmd.c
@@ -1002,6 +1002,9 @@ int32 CmdSendShipToDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (v->type != VEH_Ship || !CheckOwnership(v->owner))
return CMD_ERROR;
+ if (v->vehstatus & VS_CRASHED)
+ return CMD_ERROR;
+
if (v->current_order.type == OT_GOTO_DEPOT) {
if (flags & DC_EXEC) {
diff --git a/train_cmd.c b/train_cmd.c
index ebbb129ef..d9eb5cd29 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -1298,7 +1298,8 @@ static bool TrainFindDepotEnumProc(uint tile, TrainFindDepotData *tfdd, int trac
return length >= tfdd->best_length;
}
-// returns the tile of a depot to goto to.
+// returns the tile of a depot to goto to. The given vehicle must be on track,
+// so not crashed, in a depot, etc.
static TrainFindDepotData FindClosestTrainDepot(Vehicle *v)
{
int i;
@@ -1362,6 +1363,9 @@ int32 CmdTrainGotoDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (v->type != VEH_Train || !CheckOwnership(v->owner))
return CMD_ERROR;
+ if (v->vehstatus & VS_CRASHED)
+ return CMD_ERROR;
+
if (v->current_order.type == OT_GOTO_DEPOT) {
if (flags & DC_EXEC) {
if (HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS)) {
diff --git a/vehicle.c b/vehicle.c
index 03da2fdbe..4cd4b7b3a 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -55,6 +55,9 @@ bool VehicleNeedsService(const Vehicle *v)
if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0)
return false;
+ if (v->vehstatus & VS_CRASHED)
+ return false; /* Crashed vehicles don't need service anymore */
+
return _patches.servint_ispercent ?
(v->reliability < _engines[v->engine_type].reliability * (100 - v->service_interval) / 100) :
(v->date_of_last_service + v->service_interval < _date);