(svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.

This commit is contained in:
2006-04-26 20:44:28 +00:00
parent b81e6dd6a2
commit 2f01c7d990
6 changed files with 243 additions and 158 deletions

View File

@@ -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);
}
/**