summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/roadveh.h2
-rw-r--r--src/roadveh_cmd.cpp9
-rw-r--r--src/train_cmd.cpp18
-rw-r--r--src/vehicle.cpp17
-rw-r--r--src/vehicle_cmd.cpp4
-rw-r--r--src/vehicle_func.h2
6 files changed, 30 insertions, 22 deletions
diff --git a/src/roadveh.h b/src/roadveh.h
index 06139a426..3323ee9f5 100644
--- a/src/roadveh.h
+++ b/src/roadveh.h
@@ -79,7 +79,7 @@ static const uint RVC_DEPOT_STOP_FRAME = 11;
/** The number of ticks a vehicle has for overtaking. */
static const byte RV_OVERTAKE_TIMEOUT = 35;
-void RoadVehUpdateCache(RoadVehicle *v);
+void RoadVehUpdateCache(RoadVehicle *v, bool same_length = false);
/**
* Buses, trucks and trams belong to this class.
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 596c57862..74e1e9c14 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -174,9 +174,10 @@ static uint GetRoadVehLength(const RoadVehicle *v)
/**
* Update the cache of a road vehicle.
* @param v Road vehicle needing an update of its cache.
+ * @param same_length should length of vehicles stay the same?
* @pre \a v must be first road vehicle.
*/
-void RoadVehUpdateCache(RoadVehicle *v)
+void RoadVehUpdateCache(RoadVehicle *v, bool same_length)
{
assert(v->type == VEH_ROAD);
assert(v->IsFrontEngine());
@@ -193,7 +194,11 @@ void RoadVehUpdateCache(RoadVehicle *v)
u->gcache.first_engine = (v == u) ? INVALID_ENGINE : v->engine_type;
/* Update the length of the vehicle. */
- u->gcache.cached_veh_length = GetRoadVehLength(u);
+ uint veh_len = GetRoadVehLength(u);
+ /* Verify length hasn't changed. */
+ if (same_length && veh_len != u->gcache.cached_veh_length) VehicleLengthChanged(u);
+
+ u->gcache.cached_veh_length = veh_len;
v->gcache.cached_total_length += u->gcache.cached_veh_length;
/* Update visual effect */
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 576bd9a15..7f06d6adb 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -84,22 +84,6 @@ byte FreightWagonMult(CargoID cargo)
return _settings_game.vehicle.freight_trains;
}
-/**
- * Logs a bug in GRF and shows a warning message if this
- * is for the first time this happened.
- * @param u first vehicle of chain
- */
-static void RailVehicleLengthChanged(const Train *u)
-{
- /* show a warning once for each engine in whole game and once for each GRF after each game load */
- const Engine *engine = u->GetEngine();
- uint32 grfid = engine->grf_prop.grffile->grfid;
- GRFConfig *grfconfig = GetGRFConfig(grfid);
- if (GamelogGRFBugReverse(grfid, engine->grf_prop.local_id) || !HasBit(grfconfig->grf_bugs, GBUG_VEH_LENGTH)) {
- ShowNewGrfVehicleError(u->engine_type, STR_NEWGRF_BROKEN, STR_NEWGRF_BROKEN_VEHICLE_LENGTH, GBUG_VEH_LENGTH, true);
- }
-}
-
/** Checks if lengths of all rail vehicles are valid. If not, shows an error message. */
void CheckTrainsLengths()
{
@@ -244,7 +228,7 @@ void Train::ConsistChanged(bool same_length)
veh_len = VEHICLE_LENGTH - Clamp(veh_len, 0, VEHICLE_LENGTH - 1);
/* verify length hasn't changed */
- if (same_length && veh_len != u->gcache.cached_veh_length) RailVehicleLengthChanged(u);
+ if (same_length && veh_len != u->gcache.cached_veh_length) VehicleLengthChanged(u);
/* update vehicle length? */
if (!same_length) u->gcache.cached_veh_length = veh_len;
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
index e15638f69..d990d3d55 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -52,6 +52,7 @@
#include "bridge_map.h"
#include "tunnel_map.h"
#include "depot_map.h"
+#include "gamelog.h"
#include "table/strings.h"
@@ -234,6 +235,22 @@ void ShowNewGrfVehicleError(EngineID engine, StringID part1, StringID part2, GRF
}
/**
+ * Logs a bug in GRF and shows a warning message if this
+ * is for the first time this happened.
+ * @param u first vehicle of chain
+ */
+void VehicleLengthChanged(const Vehicle *u)
+{
+ /* show a warning once for each engine in whole game and once for each GRF after each game load */
+ const Engine *engine = u->GetEngine();
+ uint32 grfid = engine->grf_prop.grffile->grfid;
+ GRFConfig *grfconfig = GetGRFConfig(grfid);
+ if (GamelogGRFBugReverse(grfid, engine->grf_prop.local_id) || !HasBit(grfconfig->grf_bugs, GBUG_VEH_LENGTH)) {
+ ShowNewGrfVehicleError(u->engine_type, STR_NEWGRF_BROKEN, STR_NEWGRF_BROKEN_VEHICLE_LENGTH, GBUG_VEH_LENGTH, true);
+ }
+}
+
+/**
* Vehicle constructor.
* @param type Type of the new vehicle.
*/
diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp
index 0b16eb9f9..727a63325 100644
--- a/src/vehicle_cmd.cpp
+++ b/src/vehicle_cmd.cpp
@@ -407,10 +407,10 @@ CommandCost CmdRefitVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
/* Update the cached variables */
switch (v->type) {
case VEH_TRAIN:
- Train::From(front)->ConsistChanged(false);
+ Train::From(front)->ConsistChanged(auto_refit);
break;
case VEH_ROAD:
- RoadVehUpdateCache(RoadVehicle::From(front));
+ RoadVehUpdateCache(RoadVehicle::From(front), auto_refit);
if (_settings_game.vehicle.roadveh_acceleration_model != AM_ORIGINAL) RoadVehicle::From(front)->CargoChanged();
break;
diff --git a/src/vehicle_func.h b/src/vehicle_func.h
index 7082404ae..972cfa2b4 100644
--- a/src/vehicle_func.h
+++ b/src/vehicle_func.h
@@ -41,6 +41,8 @@ bool HasVehicleOnPosXY(int x, int y, void *data, VehicleFromPosProc *proc);
void CallVehicleTicks();
uint8 CalcPercentVehicleFilled(const Vehicle *v, StringID *colour);
+void VehicleLengthChanged(const Vehicle *u);
+
byte VehicleRandomBits();
void ResetVehiclePosHash();
void ResetVehicleColourMap();