summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-12-18 21:34:06 +0000
committerrubidium <rubidium@openttd.org>2009-12-18 21:34:06 +0000
commit6f1982d15149a3649a6ae7f24caaeace8d3809d9 (patch)
treef8e5974c2983ba20abaa8706b31247dd2c5eace8
parent6f5425a062db70049c7be823004393c88ec714eb (diff)
downloadopenttd-6f1982d15149a3649a6ae7f24caaeace8d3809d9.tar.xz
(svn r18531) -Fix [FS#3384] (r18404): for articulated road vehicles only the first part was accounted for, so for extremely short fronts and lots after it the spreading did not work as it should.
-rw-r--r--src/roadstop.cpp6
-rw-r--r--src/roadveh.h5
-rw-r--r--src/roadveh_cmd.cpp3
3 files changed, 9 insertions, 5 deletions
diff --git a/src/roadstop.cpp b/src/roadstop.cpp
index ce9bd62ee..6b8c921c1 100644
--- a/src/roadstop.cpp
+++ b/src/roadstop.cpp
@@ -279,7 +279,7 @@ bool RoadStop::Enter(RoadVehicle *rv)
*/
void RoadStop::Entry::Leave(const RoadVehicle *rv)
{
- this->occupied -= rv->rcache.cached_veh_length;
+ this->occupied -= rv->rcache.cached_total_length;
assert(this->occupied >= 0);
}
@@ -292,7 +292,7 @@ void RoadStop::Entry::Enter(const RoadVehicle *rv)
/* we cannot assert on this->occupied < this->length because of the
* remote possibility that RVs are running through eachother when
* trying to prevention an infinite jam. */
- this->occupied += rv->rcache.cached_veh_length;
+ this->occupied += rv->rcache.cached_total_length;
}
/**
@@ -368,7 +368,7 @@ void RoadStop::Entry::Rebuild(const RoadStop *rs, int side)
this->occupied = 0;
for (RVList::iterator it = rserh.vehicles.begin(); it != rserh.vehicles.end(); it++) {
- this->occupied += (*it)->rcache.cached_veh_length;
+ this->occupied += (*it)->rcache.cached_total_length;
}
}
diff --git a/src/roadveh.h b/src/roadveh.h
index 21a40596b..2ff51de5c 100644
--- a/src/roadveh.h
+++ b/src/roadveh.h
@@ -85,8 +85,9 @@ void RoadVehUpdateCache(RoadVehicle *v);
/** Cached oftenly queried (NewGRF) values */
struct RoadVehicleCache {
- byte cached_veh_length;
- EngineID first_engine; ///< cached EngineID of the front vehicle. INVALID_ENGINE for the front vehicle itself.
+ uint16 cached_total_length; ///< Length of the whole train, valid only for first engine.
+ byte cached_veh_length; ///< length of this vehicle in units of 1/8 of normal length, cached because this can be set by a callback
+ EngineID first_engine; ///< Cached EngineID of the front vehicle. INVALID_ENGINE for the front vehicle itself.
};
/**
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index ce3ab61d2..1d4b9774f 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -169,6 +169,8 @@ void RoadVehUpdateCache(RoadVehicle *v)
v->InvalidateNewGRFCacheOfChain();
+ v->rcache.cached_total_length = 0;
+
for (RoadVehicle *u = v; u != NULL; u = u->Next()) {
/* Check the v->first cache. */
assert(u->First() == v);
@@ -178,6 +180,7 @@ void RoadVehUpdateCache(RoadVehicle *v)
/* Update the length of the vehicle. */
u->rcache.cached_veh_length = GetRoadVehLength(u);
+ v->rcache.cached_total_length += u->rcache.cached_veh_length;
/* Invalidate the vehicle colour map */
u->colourmap = PAL_NONE;