changeset 13989:c87fc54710c1 draft

(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.
author rubidium <rubidium@openttd.org>
date Fri, 18 Dec 2009 21:34:06 +0000
parents 96eebb4de89d
children 85fcbb035f53
files src/roadstop.cpp src/roadveh.h src/roadveh_cmd.cpp
diffstat 3 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/roadstop.cpp
+++ b/src/roadstop.cpp
@@ -279,7 +279,7 @@
  */
 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 @@
 	/* 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 @@
 
 	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;
 	}
 }
 
--- a/src/roadveh.h
+++ b/src/roadveh.h
@@ -85,8 +85,9 @@
 
 /** 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.
 };
 
 /**
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -169,6 +169,8 @@
 
 	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 @@
 
 		/* 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;