summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorglx <glx@openttd.org>2008-03-28 02:10:25 +0000
committerglx <glx@openttd.org>2008-03-28 02:10:25 +0000
commit1df06c7ef1dcbda888e2ae37def456f3803f61d7 (patch)
tree1db78d8debdd858913850b1dd9ad6c9113060dd2 /src
parent00286005ba07e7602c0f7678f17730cab5f5cf2e (diff)
downloadopenttd-1df06c7ef1dcbda888e2ae37def456f3803f61d7.tar.xz
(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 ;))
Diffstat (limited to 'src')
-rw-r--r--src/newgrf.cpp4
-rw-r--r--src/newgrf_engine.cpp17
2 files changed, 14 insertions, 7 deletions
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);