From a3e6e113fe1f5a00d2d62ddac207a3bc12dec97c Mon Sep 17 00:00:00 2001 From: michi_cc Date: Fri, 4 Nov 2011 15:04:29 +0000 Subject: [PATCH] (svn r23112) -Codechange: Check if vehicle chain lengths stays constant when auto-refitting. --- src/roadveh.h | 2 +- src/roadveh_cmd.cpp | 9 +++++++-- src/train_cmd.cpp | 18 +----------------- src/vehicle.cpp | 17 +++++++++++++++++ src/vehicle_cmd.cpp | 4 ++-- src/vehicle_func.h | 2 ++ 6 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/roadveh.h b/src/roadveh.h index 06139a4264..3323ee9f5e 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 596c57862d..74e1e9c14c 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 576bd9a154..7f06d6adba 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 e15638f69f..d990d3d55e 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" @@ -233,6 +234,22 @@ void ShowNewGrfVehicleError(EngineID engine, StringID part1, StringID part2, GRF DEBUG(grf, 0, "%s", buffer + 3); } +/** + * 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 0b16eb9f97..727a63325d 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 7082404ae7..972cfa2b46 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();