summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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;