diff options
author | peter1138 <peter1138@openttd.org> | 2006-04-26 17:16:57 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2006-04-26 17:16:57 +0000 |
commit | 6b86a6a6dc32a7433a174259c43698f4ca5724de (patch) | |
tree | 62cccc7538927550dbf65c5232d52ea178bdc67f /newgrf_spritegroup.h | |
parent | dbb73b9c9882b502b15c7a232027b583e0fa6906 (diff) | |
download | openttd-6b86a6a6dc32a7433a174259c43698f4ca5724de.tar.xz |
(svn r4579) - NewGRF: move sprite group struct to newgrf_spritegroup.h. Temporary include in sprite.h until new spritegroup code is in place.
Diffstat (limited to 'newgrf_spritegroup.h')
-rw-r--r-- | newgrf_spritegroup.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/newgrf_spritegroup.h b/newgrf_spritegroup.h index 44b49bcca..3dc62c3ec 100644 --- a/newgrf_spritegroup.h +++ b/newgrf_spritegroup.h @@ -3,6 +3,123 @@ #ifndef NEWGRF_SPRITEGROUP_H #define NEWGRF_SPRITEGROUP_H + +typedef struct SpriteGroup SpriteGroup; + +typedef struct RealSpriteGroup { + byte sprites_per_set; // means number of directions - 4 or 8 + + // Loaded = in motion, loading = not moving + // Each group contains several spritesets, for various loading stages + + // XXX: For stations the meaning is different - loaded is for stations + // with small amount of cargo whilst loading is for stations with a lot + // of da stuff. + + byte loaded_count; ///< Number of loaded groups + SpriteGroup **loaded; ///< List of loaded groups (can be SpriteIDs or Callback results) + byte loading_count; ///< Number of loading groups + SpriteGroup **loading; ///< List of loading groups (can be SpriteIDs or Callback results) +} RealSpriteGroup; + +/* Shared by deterministic and random groups. */ +typedef enum VarSpriteGroupScope { + VSG_SCOPE_SELF, + // Engine of consists for vehicles, city for stations. + VSG_SCOPE_PARENT, +} VarSpriteGroupScope; + +typedef struct DeterministicSpriteGroupRanges DeterministicSpriteGroupRanges; + +typedef enum DeterministicSpriteGroupOperation { + DSG_OP_NONE, + DSG_OP_DIV, + DSG_OP_MOD, +} DeterministicSpriteGroupOperation; + +typedef struct DeterministicSpriteGroupRange DeterministicSpriteGroupRange; + +typedef struct DeterministicSpriteGroup { + // Take this variable: + VarSpriteGroupScope var_scope; + byte variable; + byte parameter; ///< Used for variables between 0x60 and 0x7F inclusive. + + // Do this with it: + byte shift_num; + byte and_mask; + + // Then do this with it: + DeterministicSpriteGroupOperation operation; + byte add_val; + byte divmod_val; + + // And apply it to this: + byte num_ranges; + DeterministicSpriteGroupRange *ranges; // Dynamically allocated + + // Dynamically allocated, this is the sole owner + SpriteGroup *default_group; +} DeterministicSpriteGroup; + +typedef enum RandomizedSpriteGroupCompareMode { + RSG_CMP_ANY, + RSG_CMP_ALL, +} RandomizedSpriteGroupCompareMode; + +typedef struct RandomizedSpriteGroup { + // Take this object: + VarSpriteGroupScope var_scope; + + // Check for these triggers: + RandomizedSpriteGroupCompareMode cmp_mode; + byte triggers; + + // Look for this in the per-object randomized bitmask: + byte lowest_randbit; + byte num_groups; // must be power of 2 + + // Take the group with appropriate index: + SpriteGroup **groups; +} RandomizedSpriteGroup; + +typedef struct CallbackResultSpriteGroup { + uint16 result; +} CallbackResultSpriteGroup; + +typedef struct ResultSpriteGroup { + uint16 result; + byte sprites; +} ResultSpriteGroup; + +typedef enum SpriteGroupType { + SGT_INVALID, + SGT_REAL, + SGT_DETERMINISTIC, + SGT_RANDOMIZED, + SGT_CALLBACK, + SGT_RESULT, +} SpriteGroupType; + +struct SpriteGroup { + SpriteGroupType type; + + union { + RealSpriteGroup real; + DeterministicSpriteGroup determ; + RandomizedSpriteGroup random; + CallbackResultSpriteGroup callback; + ResultSpriteGroup result; + } g; +}; + +struct DeterministicSpriteGroupRange { + SpriteGroup *group; + byte low; + byte high; +}; + + SpriteGroup *AllocateSpriteGroup(void); void InitializeSpriteGroupPool(void); |