(svn r12454) -Fix (r12452): incorrect calculation for 'first vehicle in this chain of vehicles with the same ID' (thx DaleStan)
authorglx
Fri, 28 Mar 2008 02:10:25 +0000
changeset 8758 d2655b49862b
parent 8757 50c0e625f849
child 8759 dc74629e649f
(svn r12454) -Fix (r12452): incorrect calculation for 'first vehicle in this chain of vehicles with the same ID' (thx DaleStan)
-Fix (r12452): wrong loading of random action 2 type 84 for non vehicle (though it shouldn't happen, but who knows ;))
src/newgrf.cpp
src/newgrf_engine.cpp
--- a/src/newgrf.cpp	Fri Mar 28 01:22:47 2008 +0000
+++ b/src/newgrf.cpp	Fri Mar 28 02:10:25 2008 +0000
@@ -2592,8 +2592,8 @@
 			group->type = SGT_RANDOMIZED;
 			group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
 
-			if (HasBit(type, 2) && feature <= GSF_AIRCRAFT) {
-				group->g.random.var_scope = VSG_SCOPE_RELATIVE;
+			if (HasBit(type, 2)) {
+				if (feature <= GSF_AIRCRAFT) group->g.random.var_scope = VSG_SCOPE_RELATIVE;
 				group->g.random.count = grf_load_byte(&buf);
 			}
 
--- a/src/newgrf_engine.cpp	Fri Mar 28 01:22:47 2008 +0000
+++ b/src/newgrf_engine.cpp	Fri Mar 28 02:10:25 2008 +0000
@@ -405,7 +405,7 @@
 		case VSG_SCOPE_SELF: return object->u.vehicle.self;
 		case VSG_SCOPE_PARENT: return object->u.vehicle.parent;
 		case VSG_SCOPE_RELATIVE: {
-			const Vehicle *v;
+			const Vehicle *v = NULL;
 			switch (GB(object->count, 6, 2)) {
 				default: NOT_REACHED();
 				case 0x00: // count back (away from the engine), starting at this vehicle
@@ -415,10 +415,17 @@
 				case 0x02: // count back, starting at the engine
 					v = object->u.vehicle.parent;
 					break;
-				case 0x03: // count back, starting at the first vehicle in this chain of vehicles with the same ID, as for vehicle variable 41
-					v = object->u.vehicle.parent;
-					while (v != NULL && v->engine_type != object->u.vehicle.self->engine_type) v = v->Next();
-					break;
+				case 0x03: { // count back, starting at the first vehicle in this chain of vehicles with the same ID, as for vehicle variable 41
+					const Vehicle *self = object->u.vehicle.self;
+					for (const Vehicle *u = self->First(); u != self; u = u->Next()) {
+						if (u->engine_type != self->engine_type) {
+							v = NULL;
+						} else {
+							if (v == NULL) v = u;
+						}
+					}
+					if (v == NULL) v = self;
+				} break;
 			}
 			uint32 count = GB(object->count, 0, 4);
 			if (count == 0) count = GetRegister(0x100);