Changeset - r7594:dc90ccf497dc
[Not reviewed]
master
0 2 0
rubidium - 17 years ago 2007-09-16 21:34:50
rubidium@openttd.org
(svn r11121) -Fix: clear the temporary NewGRF storage every time we perform a callback so it cannot cause desyncs.
2 files changed with 10 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/newgrf_spritegroup.cpp
Show inline comments
 
@@ -162,7 +162,7 @@ static inline const SpriteGroup *Resolve
 
		bool available = true;
 
		if (adjust->variable == 0x7E) {
 
			ResolverObject subobject = *object;
 
			const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject);
 
			const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject, false);
 
			if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
 
				value = CALLBACK_FAILED;
 
			} else {
 
@@ -175,7 +175,7 @@ static inline const SpriteGroup *Resolve
 
		if (!available) {
 
			/* Unsupported property: skip further processing and return either
 
			 * the group from the first range or the default group. */
 
			return Resolve(group->g.determ.num_ranges > 0 ? group->g.determ.ranges[0].group : group->g.determ.default_group, object);
 
			return Resolve(group->g.determ.num_ranges > 0 ? group->g.determ.ranges[0].group : group->g.determ.default_group, object, false);
 
		}
 

	
 
		switch (group->g.determ.size) {
 
@@ -198,11 +198,11 @@ static inline const SpriteGroup *Resolve
 

	
 
	for (i = 0; i < group->g.determ.num_ranges; i++) {
 
		if (group->g.determ.ranges[i].low <= value && value <= group->g.determ.ranges[i].high) {
 
			return Resolve(group->g.determ.ranges[i].group, object);
 
			return Resolve(group->g.determ.ranges[i].group, object, false);
 
		}
 
	}
 

	
 
	return Resolve(group->g.determ.default_group, object);
 
	return Resolve(group->g.determ.default_group, object, false);
 
}
 

	
 

	
 
@@ -236,16 +236,19 @@ static inline const SpriteGroup *Resolve
 
	mask  = (group->g.random.num_groups - 1) << group->g.random.lowest_randbit;
 
	index = (object->GetRandomBits(object) & mask) >> group->g.random.lowest_randbit;
 

	
 
	return Resolve(group->g.random.groups[index], object);
 
	return Resolve(group->g.random.groups[index], object, false);
 
}
 

	
 

	
 
/* ResolverObject (re)entry point */
 
const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object)
 
const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object, bool first_call)
 
{
 
	/* We're called even if there is no group, so quietly return nothing */
 
	if (group == NULL) return NULL;
 

	
 
	/* Zero the temporary storage to make sure there are no desyncs */
 
	if (first_call) memset(_temp_store, 0, sizeof(_temp_store));
 

	
 
	switch (group->type) {
 
		case SGT_REAL:          return object->ResolveReal(object, group);
 
		case SGT_DETERMINISTIC: return ResolveVariable(group, object);
src/newgrf_spritegroup.h
Show inline comments
 
@@ -243,7 +243,7 @@ struct ResolverObject {
 

	
 

	
 
/* Base sprite group resolver */
 
const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object);
 
const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object, bool first_call = true);
 

	
 

	
 
#endif /* NEWGRF_SPRITEGROUP_H */
0 comments (0 inline, 0 general)