summaryrefslogtreecommitdiff
path: root/newgrf_engine.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-04-26 20:44:28 +0000
committerpeter1138 <peter1138@openttd.org>2006-04-26 20:44:28 +0000
commit2f01c7d990d70b348afc6cad3107d3ddbc89a37e (patch)
tree71fddf3085e3ecae2d9fa11320b11d740ab8ab0d /newgrf_engine.c
parentb81e6dd6a2ab42524f66d456266ae2f6171ba08b (diff)
downloadopenttd-2f01c7d990d70b348afc6cad3107d3ddbc89a37e.tar.xz
(svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
Diffstat (limited to 'newgrf_engine.c')
-rw-r--r--newgrf_engine.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/newgrf_engine.c b/newgrf_engine.c
index 965aa696a..a07e69d76 100644
--- a/newgrf_engine.c
+++ b/newgrf_engine.c
@@ -208,16 +208,18 @@ static const SpriteGroup* ResolveVehicleSpriteGroup(const SpriteGroup *spritegro
const DeterministicSpriteGroup *dsg = &spritegroup->g.determ;
const SpriteGroup *target;
int value = -1;
+ // XXX Temporary support
+ byte variable = dsg->adjusts[0].variable;
- //debug("[%p] Having fun resolving variable %x", veh, dsg->variable);
- if (dsg->variable == 0x0C) {
+ //debug("[%p] Having fun resolving variable %x", veh, variable);
+ if (variable == 0x0C) {
/* Callback ID */
value = callback_info & 0xFF;
- } else if (dsg->variable == 0x10) {
+ } else if (variable == 0x10) {
value = (callback_info >> 8) & 0xFF;
- } else if ((dsg->variable >> 6) == 0) {
+ } else if ((variable >> 6) == 0) {
/* General property */
- value = GetDeterministicSpriteValue(dsg->variable);
+ value = GetDeterministicSpriteValue(variable);
} else {
/* Vehicle-specific property. */
@@ -240,18 +242,18 @@ static const SpriteGroup* ResolveVehicleSpriteGroup(const SpriteGroup *spritegro
veh = GetFirstVehicleInChain(veh);
}
- if (dsg->variable == 0x40 || dsg->variable == 0x41) {
+ if (variable == 0x40 || variable == 0x41) {
if (veh->type == VEH_Train) {
const Vehicle *u = GetFirstVehicleInChain(veh);
byte chain_before = 0, chain_after = 0;
while (u != veh) {
chain_before++;
- if (dsg->variable == 0x41 && u->engine_type != veh->engine_type)
+ if (variable == 0x41 && u->engine_type != veh->engine_type)
chain_before = 0;
u = u->next;
}
- while (u->next != NULL && (dsg->variable == 0x40 || u->next->engine_type == veh->engine_type)) {
+ while (u->next != NULL && (variable == 0x40 || u->next->engine_type == veh->engine_type)) {
chain_after++;
u = u->next;
};
@@ -265,7 +267,7 @@ static const SpriteGroup* ResolveVehicleSpriteGroup(const SpriteGroup *spritegro
} else {
// TTDPatch runs on little-endian arch;
// Variable is 0x80 + offset in TTD's vehicle structure
- switch (dsg->variable - 0x80) {
+ switch (variable - 0x80) {
#define veh_prop(id_, value_) case (id_): value = (value_); break
veh_prop(0x00, veh->type);
veh_prop(0x01, MapOldSubType(veh));
@@ -347,7 +349,7 @@ static const SpriteGroup* ResolveVehicleSpriteGroup(const SpriteGroup *spritegro
#undef veh_prop
// Handle vehicle specific properties.
- default: value = VehicleSpecificProperty(veh, dsg->variable - 0x80); break;
+ default: value = VehicleSpecificProperty(veh, variable - 0x80); break;
}
}
}
@@ -411,7 +413,6 @@ int GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction
byte loaded = 0;
bool in_motion = 0;
int totalsets, spriteset;
- int r;
if (v != NULL) {
int capacity = v->cargo_cap;
@@ -444,16 +445,11 @@ int GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction
assert(group->type == SGT_REAL);
rsg = &group->g.real;
- if (!rsg->sprites_per_set) {
- // This group is empty. This function users should therefore
- // look up the sprite number in _engine_original_sprites.
- return 0;
- }
+ // This group is empty. This function users should therefore
+ // look up the sprite number in _engine_original_sprites.
+ if (rsg->num_loaded == 0 || rsg->num_loading == 0) return 0;
- assert(rsg->sprites_per_set <= 8);
- direction %= rsg->sprites_per_set;
-
- totalsets = in_motion ? rsg->loaded_count : rsg->loading_count;
+ totalsets = in_motion ? rsg->num_loaded : rsg->num_loading;
// My aim here is to make it possible to visually determine absolutely
// empty and totally full vehicles. --pasky
@@ -470,8 +466,10 @@ int GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction
spriteset--;
}
- r = (in_motion ? rsg->loaded[spriteset]->g.result.result : rsg->loading[spriteset]->g.result.result) + direction;
- return r;
+ group = in_motion ? rsg->loaded[spriteset] : rsg->loading[spriteset];
+ if (group->type != SGT_RESULT) return 0;
+
+ return group->g.result.sprite + (direction % group->g.result.num_sprites);
}
/**