diff options
author | rubidium <rubidium@openttd.org> | 2009-12-18 21:34:06 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-12-18 21:34:06 +0000 |
commit | 6f1982d15149a3649a6ae7f24caaeace8d3809d9 (patch) | |
tree | f8e5974c2983ba20abaa8706b31247dd2c5eace8 /src | |
parent | 6f5425a062db70049c7be823004393c88ec714eb (diff) | |
download | openttd-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.cpp | 6 | ||||
-rw-r--r-- | src/roadveh.h | 5 | ||||
-rw-r--r-- | src/roadveh_cmd.cpp | 3 |
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; |