1 #ifndef _TILE_ANIMATION_H
2 #define _TILE_ANIMATION_H
3 
4 #include "JA2Types.h"
5 #include "Sound_Control.h"
6 #include "WorldDef.h"
7 
8 
9 enum AnimationFlags
10 {
11 	ANITILE_DOOR                           = 0x00000001,
12 	ANITILE_BACKWARD                       = 0x00000020,
13 	ANITILE_FORWARD                        = 0x00000040,
14 	ANITILE_PAUSED                         = 0x00000200,
15 	ANITILE_EXISTINGTILE                   = 0x00000400,
16 	ANITILE_LOOPING                        = 0x00020000,
17 	ANITILE_NOZBLITTER                     = 0x00040000,
18 	ANITILE_REVERSE_LOOPING                = 0x00080000,
19 	ANITILE_ALWAYS_TRANSLUCENT             = 0x00100000,
20 	ANITILE_OPTIMIZEFORSLOWMOVING          = 0x00400000,
21 	ANITILE_ANIMATE_Z                      = 0x00800000,
22 	ANITILE_USE_DIRECTION_FOR_START_FRAME  = 0x01000000,
23 	ANITILE_PAUSE_AFTER_LOOP               = 0x02000000, // XXX same value as ANITILE_USE_4DIRECTION_FOR_START_FRAME
24 	ANITILE_ERASEITEMFROMSAVEBUFFFER       = 0x04000000,
25 	ANITILE_SMOKE_EFFECT                   = 0x10000000,
26 	ANITILE_EXPLOSION                      = 0x20000000,
27 	ANITILE_RELEASE_ATTACKER_WHEN_DONE     = 0x40000000,
28 	ANITILE_USE_4DIRECTION_FOR_START_FRAME = 0x02000000  // XXX same value as ANITILE_PAUSE_AFTER_LOOP
29 };
30 ENUM_BITSET(AnimationFlags)
31 
32 
33 enum AnimationLevel
34 {
35 	ANI_LAND_LEVEL    = 1,
36 	ANI_SHADOW_LEVEL  = 2,
37 	ANI_OBJECT_LEVEL  = 3,
38 	ANI_STRUCT_LEVEL  = 4,
39 	ANI_ROOF_LEVEL    = 5,
40 	ANI_ONROOF_LEVEL  = 6,
41 	ANI_TOPMOST_LEVEL = 7
42 };
43 
44 
45 union AniUserData
46 {
47 	struct
48 	{
49 		UINT32 uiData;
50 		UINT32 uiData3;
51 	} user;
52 	EXPLOSIONTYPE*     explosion;
53 	BULLET*            bullet;
54 	const REAL_OBJECT* object;
55 	SoundID            sound;
56 };
57 
58 
59 struct ANITILE
60 {
61 	ANITILE*       pNext;
62 	AnimationFlags uiFlags; // flags struct
63 	UINT32         uiTimeLastUpdate; // Stuff for animated tiles
64 
65 	LEVELNODE      *pLevelNode;
66 	UINT8          ubLevelID;
67 	INT16          sCurrentFrame;
68 	INT16          sStartFrame;
69 	INT16          sDelay;
70 	UINT16         usNumFrames;
71 
72 	INT16          sRelativeX;
73 	INT16          sRelativeY;
74 	INT16          sRelativeZ;
75 	INT16          sGridNo;
76 	UINT16         usTileIndex;
77 
78 	INT16          sCachedTileID; // Index into cached tile ID
79 
80 	UINT8          ubKeyFrame1;
81 	UINT32         uiKeyFrame1Code;
82 	UINT8          ubKeyFrame2;
83 	UINT32         uiKeyFrame2Code;
84 
85 	AniUserData v;
86 
87 	INT8           bFrameCountAfterStart;
88 
89 };
90 
91 
92 struct ANITILE_PARAMS
93 {
94 	AnimationFlags uiFlags; // flags struct
95 	AnimationLevel ubLevelID; // Level ID for rendering layer
96 	INT16          sStartFrame; // Start frame
97 	INT16          sDelay; // Delay time
98 	UINT16         usTileIndex; // Tile database index ( optional )
99 	INT16          sX; // World X ( optional )
100 	INT16          sY; // World Y ( optional )
101 	INT16          sZ; // World Z ( optional )
102 	INT16          sGridNo; // World GridNo
103 
104 	LEVELNODE      *pGivenLevelNode; // Levelnode for existing tile ( optional )
105 	const char     *zCachedFile; // Filename for cached tile name ( optional )
106 
107 	UINT8          ubKeyFrame1; // Key frame 1
108 	UINT32         uiKeyFrame1Code; // Key frame code
109 	UINT8          ubKeyFrame2; // Key frame 2
110 	UINT32         uiKeyFrame2Code; // Key frame code
111 
112 	AniUserData v;
113 };
114 
115 
116 enum KeyFrameEnums
117 {
118 	ANI_KEYFRAME_NO_CODE,
119 	ANI_KEYFRAME_BEGIN_TRANSLUCENCY,
120 	ANI_KEYFRAME_BEGIN_DAMAGE,
121 	ANI_KEYFRAME_CHAIN_WATER_EXPLOSION,
122 	ANI_KEYFRAME_DO_SOUND
123 };
124 
125 
126 ANITILE* CreateAnimationTile(const ANITILE_PARAMS*);
127 
128 
129 void DeleteAniTile( ANITILE *pAniTile );
130 void UpdateAniTiles(void);
131 void DeleteAniTiles(void);
132 
133 void HideAniTile( ANITILE *pAniTile, BOOLEAN fHide );
134 
135 ANITILE* GetCachedAniTileOfType(INT16 sGridNo, UINT8 ubLevelID, AnimationFlags);
136 
137 #endif
138