diff options
author | peter1138 <peter1138@openttd.org> | 2006-05-03 15:46:21 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2006-05-03 15:46:21 +0000 |
commit | f104da53e10196e75607d795d57715cce8a582db (patch) | |
tree | 32c1f539574958feefa1794ac80ef7a40eb8c95d | |
parent | 8bdf61bf3ba1ebd8cc13d93c4caaafbe5729b281 (diff) | |
download | openttd-f104da53e10196e75607d795d57715cce8a582db.tar.xz |
(svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
-rw-r--r-- | newgrf_engine.c | 16 | ||||
-rw-r--r-- | newgrf_spritegroup.c | 15 | ||||
-rw-r--r-- | newgrf_spritegroup.h | 2 |
3 files changed, 9 insertions, 24 deletions
diff --git a/newgrf_engine.c b/newgrf_engine.c index 4b958350f..326b251d4 100644 --- a/newgrf_engine.c +++ b/newgrf_engine.c @@ -636,24 +636,22 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by } -static uint32 VehicleResolveReal(const ResolverObject *object, uint num_loaded, uint num_loading, bool *in_motion) +static const SpriteGroup *VehicleResolveReal(const ResolverObject *object, const SpriteGroup *group) { const Vehicle *v = object->u.vehicle.self; uint totalsets; uint set; + bool in_motion; - if (v == NULL) { - *in_motion = false; - return 0; - } + if (v == NULL) return group->g.real.loaded[0]; if (v->type == VEH_Train) { - *in_motion = GetFirstVehicleInChain(v)->current_order.type != OT_LOADING; + in_motion = GetFirstVehicleInChain(v)->current_order.type != OT_LOADING; } else { - *in_motion = v->current_order.type != OT_LOADING; + in_motion = v->current_order.type != OT_LOADING; } - totalsets = *in_motion ? num_loaded : num_loading; + totalsets = in_motion ? group->g.real.num_loaded : group->g.real.num_loading; if (v->cargo_count == v->cargo_cap || totalsets == 1) { set = totalsets - 1; @@ -663,7 +661,7 @@ static uint32 VehicleResolveReal(const ResolverObject *object, uint num_loaded, set = v->cargo_count * (totalsets - 2) / max(1, v->cargo_cap) + 1; } - return set; + return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set]; } diff --git a/newgrf_spritegroup.c b/newgrf_spritegroup.c index d389c07ad..7766aa452 100644 --- a/newgrf_spritegroup.c +++ b/newgrf_spritegroup.c @@ -71,19 +71,6 @@ void InitializeSpriteGroupPool(void) } -static inline const SpriteGroup *ResolveReal(const SpriteGroup *group, ResolverObject *object) -{ - bool in_motion; - uint set; - - set = object->ResolveReal(object, group->g.real.num_loaded, group->g.real.num_loading, &in_motion); - - assert((in_motion && set < group->g.real.num_loaded) || (!in_motion && set < group->g.real.num_loading)); - - return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set]; -} - - static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter) { /* Return common variables */ @@ -240,7 +227,7 @@ const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object) if (group == NULL) return NULL; switch (group->type) { - case SGT_REAL: return ResolveReal(group, object); + case SGT_REAL: return object->ResolveReal(object, group); case SGT_DETERMINISTIC: return ResolveVariable(group, object); case SGT_RANDOMIZED: return ResolveRandom(group, object); default: return group; diff --git a/newgrf_spritegroup.h b/newgrf_spritegroup.h index 3f3a2ee8d..bb51f56e5 100644 --- a/newgrf_spritegroup.h +++ b/newgrf_spritegroup.h @@ -181,7 +181,7 @@ typedef struct ResolverObject { uint32 (*GetTriggers)(const struct ResolverObject*); void (*SetTriggers)(const struct ResolverObject*, int); uint32 (*GetVariable)(const struct ResolverObject*, byte, byte); - uint32 (*ResolveReal)(const struct ResolverObject*, uint, uint, bool*); + const SpriteGroup *(*ResolveReal)(const struct ResolverObject*, const SpriteGroup*); } ResolverObject; |