forked from mirror/OpenTTD
(svn r605) -newgrf: Framework for supporting variational spritegroups . Deterministic only at the moment, but random ones support shouldn't be that difficult now It doesn't do anything, but makes these actions actually possible (pasky).
This commit is contained in:
78
sprite.h
78
sprite.h
@@ -7,7 +7,7 @@
|
||||
* depots or stations): */
|
||||
|
||||
typedef struct DrawTileSeqStruct {
|
||||
int8 delta_x;
|
||||
int8 delta_x; // 0x80 is sequence terminator
|
||||
int8 delta_y;
|
||||
int8 delta_z;
|
||||
byte width,height;
|
||||
@@ -20,12 +20,16 @@ typedef struct DrawTileSprites {
|
||||
DrawTileSeqStruct const *seq;
|
||||
} DrawTileSprites;
|
||||
|
||||
// Iterate through all DrawTileSeqStructs in DrawTileSprites.
|
||||
#define foreach_draw_tile_seq(idx, list) for (idx = list; ((byte) idx->delta_x) != 0x80; idx++)
|
||||
|
||||
|
||||
/* This is for custom sprites: */
|
||||
|
||||
struct SpriteGroup {
|
||||
|
||||
struct SpriteGroup;
|
||||
|
||||
struct RealSpriteGroup {
|
||||
// XXX: Would anyone ever need more than 16 spritesets? Maybe we should
|
||||
// use even less, now we take whole 8kb for custom sprites table, oh my!
|
||||
byte sprites_per_set; // means number of directions - 4 or 8
|
||||
@@ -43,4 +47,74 @@ struct SpriteGroup {
|
||||
uint16 loading[16]; // sprite ids
|
||||
};
|
||||
|
||||
/* Shared by deterministic and random groups. */
|
||||
enum VarSpriteGroupScope {
|
||||
VSG_SCOPE_SELF,
|
||||
// Engine of consists for vehicles, city for stations.
|
||||
VSG_SCOPE_PARENT,
|
||||
};
|
||||
|
||||
struct DeterministicSpriteGroupRanges;
|
||||
|
||||
struct DeterministicSpriteGroup {
|
||||
// Take this variable:
|
||||
enum VarSpriteGroupScope var_scope;
|
||||
byte variable;
|
||||
|
||||
// Do this with it:
|
||||
byte shift_num;
|
||||
byte and_mask;
|
||||
|
||||
// Then do this with it:
|
||||
enum DeterministicSpriteGroupOperation {
|
||||
DSG_OP_NONE,
|
||||
DSG_OP_DIV,
|
||||
DSG_OP_MOD,
|
||||
} operation;
|
||||
byte add_val;
|
||||
byte divmod_val;
|
||||
|
||||
// And apply it to this:
|
||||
byte num_ranges;
|
||||
struct DeterministicSpriteGroupRanges *ranges; // Dynamically allocated
|
||||
|
||||
// Dynamically allocated, this is the sole owner
|
||||
struct SpriteGroup *default_group;
|
||||
};
|
||||
|
||||
struct SpriteGroup {
|
||||
enum SpriteGroupType {
|
||||
SGT_REAL,
|
||||
SGT_DETERMINISTIC,
|
||||
SGT_RANDOM, /* TODO */
|
||||
} type;
|
||||
|
||||
union {
|
||||
struct RealSpriteGroup real;
|
||||
struct DeterministicSpriteGroup determ;
|
||||
} g;
|
||||
};
|
||||
|
||||
struct DeterministicSpriteGroupRanges {
|
||||
struct SpriteGroup group;
|
||||
byte range_low;
|
||||
byte range_high;
|
||||
};
|
||||
|
||||
/* This is a temporary helper for SpriteGroup users not supporting variational
|
||||
* sprite groups yet - it just traverses those cowardly, always taking the
|
||||
* default choice until it hits a real sprite group, returning it. */
|
||||
static struct RealSpriteGroup *TriviallyGetRSG(struct SpriteGroup *sg);
|
||||
|
||||
|
||||
|
||||
/**** Inline functions ****/
|
||||
|
||||
static INLINE struct RealSpriteGroup *TriviallyGetRSG(struct SpriteGroup *sg)
|
||||
{
|
||||
if (sg->type == SGT_REAL)
|
||||
return &sg->g.real;
|
||||
return TriviallyGetRSG(sg->g.determ.default_group);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user