From 6b86a6a6dc32a7433a174259c43698f4ca5724de Mon Sep 17 00:00:00 2001 From: peter1138 Date: Wed, 26 Apr 2006 17:16:57 +0000 Subject: (svn r4579) - NewGRF: move sprite group struct to newgrf_spritegroup.h. Temporary include in sprite.h until new spritegroup code is in place. --- newgrf_spritegroup.h | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) (limited to 'newgrf_spritegroup.h') 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); -- cgit v1.2.3-54-g00ecf