From d4f7f5e5fe0c8288e84806183cf808c3c43251d8 Mon Sep 17 00:00:00 2001 From: glx Date: Fri, 28 Mar 2008 02:10:25 +0000 Subject: (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 | 4 ++-- src/newgrf_engine.cpp | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 23cf67c14..b267d3198 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2592,8 +2592,8 @@ static void NewSpriteGroup(byte *buf, int len) 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); } diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index f36f3e52a..9e7d154b9 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -405,7 +405,7 @@ static inline const Vehicle *GRV(const ResolverObject *object) 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 @@ static inline const Vehicle *GRV(const ResolverObject *object) 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); -- cgit v1.2.3-70-g09d2