summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/train_cmd.cpp2
-rw-r--r--src/vehicle_cmd.cpp9
2 files changed, 7 insertions, 4 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 0b0c0b328..b61a9116c 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -418,7 +418,7 @@ int Train::GetCurrentMaxSpeed() const
/** Update acceleration of the train from the cached power and weight. */
void Train::UpdateAcceleration()
{
- assert(this->IsFrontEngine());
+ assert(this->IsFrontEngine() || this->IsFreeWagon());
uint power = this->gcache.cached_power;
uint weight = this->gcache.cached_weight;
diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp
index 8bd6f1b9f..68e6fff1a 100644
--- a/src/vehicle_cmd.cpp
+++ b/src/vehicle_cmd.cpp
@@ -447,11 +447,12 @@ CommandCost CmdRefitVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
if (ret.Failed()) return ret;
bool auto_refit = HasBit(p2, 6);
+ bool free_wagon = v->type == VEH_TRAIN && Train::From(front)->IsFreeWagon(); // used by autoreplace/renew
/* Don't allow shadows and such to be refitted. */
if (v != front && (v->type == VEH_SHIP || v->type == VEH_AIRCRAFT)) return CMD_ERROR;
/* Allow auto-refitting only during loading and normal refitting only in a depot. */
- if ((!auto_refit || !front->current_order.IsType(OT_LOADING)) && !front->IsStoppedInDepot()) return_cmd_error(STR_ERROR_TRAIN_MUST_BE_STOPPED_INSIDE_DEPOT + front->type);
+ if (!free_wagon && (!auto_refit || !front->current_order.IsType(OT_LOADING)) && !front->IsStoppedInDepot()) return_cmd_error(STR_ERROR_TRAIN_MUST_BE_STOPPED_INSIDE_DEPOT + front->type);
if (front->vehstatus & VS_CRASHED) return_cmd_error(STR_ERROR_VEHICLE_IS_DESTROYED);
/* Check cargo */
@@ -490,9 +491,11 @@ CommandCost CmdRefitVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
}
front->MarkDirty();
- InvalidateWindowData(WC_VEHICLE_DETAILS, front->index);
+ if (!free_wagon) {
+ InvalidateWindowData(WC_VEHICLE_DETAILS, front->index);
+ InvalidateWindowClassesData(GetWindowClassForVehicleType(v->type), 0);
+ }
SetWindowDirty(WC_VEHICLE_DEPOT, front->tile);
- InvalidateWindowClassesData(GetWindowClassForVehicleType(v->type), 0);
} else {
/* Always invalidate the cache; querycost might have filled it. */
v->InvalidateNewGRFCacheOfChain();