a8e6e31817bf6295bb5bfe66051f0d5ded38a7b4
[rocksndiamonds.git] / src / game_sp / export.h
1 #ifndef GAME_SP_EXPORT_H
2 #define GAME_SP_EXPORT_H
3
4 /* ========================================================================= */
5 /* functions and definitions exported from game_sp to main program           */
6 /* ========================================================================= */
7
8 /* ------------------------------------------------------------------------- */
9 /* constant definitions                                                      */
10 /* ------------------------------------------------------------------------- */
11
12 #define SP_MAX_PLAYFIELD_WIDTH          MAX_PLAYFIELD_WIDTH
13 #define SP_MAX_PLAYFIELD_HEIGHT         MAX_PLAYFIELD_HEIGHT
14
15 #define SP_NUM_LEVELS_PER_PACKAGE       111
16
17 #define SP_STD_PLAYFIELD_WIDTH          60
18 #define SP_STD_PLAYFIELD_HEIGHT         24
19 #define SP_LEVEL_NAME_LEN               23
20 #define SP_MAX_SPECIAL_PORTS            10
21
22 #define SP_HEADER_SIZE                  96
23 #define SP_STD_PLAYFIELD_SIZE           (SP_STD_PLAYFIELD_WIDTH *       \
24                                          SP_STD_PLAYFIELD_HEIGHT)
25 #define SP_MAX_PLAYFIELD_SIZE           (SP_MAX_PLAYFIELD_WIDTH *       \
26                                          SP_MAX_PLAYFIELD_HEIGHT)
27 #define SP_STD_LEVEL_SIZE               (SP_HEADER_SIZE + SP_STD_PLAYFIELD_SIZE)
28
29 #if 0
30 #define SP_SCREEN_BUFFER_XSIZE          (SCR_FIELDX + 2)
31 #define SP_SCREEN_BUFFER_YSIZE          (SCR_FIELDY + 2)
32 #endif
33
34 #define SP_FRAMES_PER_SECOND            35
35 #define SP_MAX_TAPE_LEN                 64010   /* (see "spfix63.doc") */
36
37
38 /* sound actions */
39
40 #define actActive                       0
41 #define actImpact                       1
42 #define actExploding                    2
43 #define actDigging                      3
44 #define actSnapping                     4
45 #define actCollecting                   5
46 #define actPassing                      6
47 #define actPushing                      7
48 #define actDropping                     8
49
50
51 /* ------------------------------------------------------------------------- */
52 /* data structure definitions                                                */
53 /* ------------------------------------------------------------------------- */
54
55 #ifndef HAS_SpecialPortType
56 typedef struct
57 {
58 #if 1
59   short PortLocation; // = 2*(x+(y*60))         /* big endian format */
60 #else
61   int PortLocation; // = 2*(x+(y*60))
62 #endif
63   byte Gravity; // 1 = turn on, anything else (0) = turn off
64   byte FreezeZonks; // 2 = turn on, anything else (0) = turn off  (1=off!)
65   byte FreezeEnemies; // 1 = turn on, anything else (0) = turn off
66   byte UnUsed;
67 } SpecialPortType;
68 #define HAS_SpecialPortType
69 #endif
70
71 #ifndef HAS_LevelInfoType
72 typedef struct
73 {
74   byte UnUsed[4];
75   byte InitialGravity; // 1=on, anything else (0) = off
76   byte Version; // SpeedFixVersion XOR &H20
77   char LevelTitle[23];
78   byte InitialFreezeZonks; // 2=on, anything else (0) = off.  (1=off too!)
79   byte InfotronsNeeded;
80
81   // Number of Infotrons needed. 0 means that Supaplex will count the total
82   // amount of Infotrons in the level, and use the low byte of that number.
83   // (A multiple of 256 Infotrons will then result in 0-to-eat, etc.!)
84   byte SpecialPortCount; // Maximum 10 allowed!
85   SpecialPortType SpecialPort[10];
86   byte SpeedByte; // = Speed XOR Highbyte(RandomSeed)
87   byte CheckSumByte; // = CheckSum XOR SpeedByte
88 #if 1
89   short DemoRandomSeed;                         /* little endian format */
90 #else
91   int DemoRandomSeed;
92 #endif
93 } LevelInfoType;
94 #define HAS_LevelInfoType
95 #endif
96
97 struct GlobalInfo_SP
98 {
99 };
100
101 struct GameInfo_SP
102 {
103   boolean LevelSolved;
104   boolean GameOver;
105
106   /* needed for updating panel */
107   int time_played;
108   int infotrons_still_needed;
109   int red_disk_count;
110   int score;
111
112   /* needed for engine snapshots */
113   char **preceding_buffer;
114   int preceding_buffer_size;
115
116   int scroll_xoffset, scroll_yoffset;
117 };
118
119 struct DemoInfo_SP
120 {
121   boolean is_available;         /* structure contains valid demo */
122
123   int level_nr;                 /* number of corresponding level */
124
125   int length;                   /* number of demo entries */
126   byte data[SP_MAX_TAPE_LEN];   /* array of demo entries */
127 };
128
129 struct LevelInfo_SP
130 {
131   LevelInfoType header;
132   byte header_raw_bytes[SP_HEADER_SIZE];
133
134   int width, height;
135
136   byte playfield[SP_MAX_PLAYFIELD_WIDTH][SP_MAX_PLAYFIELD_HEIGHT];
137
138   struct DemoInfo_SP demo;
139
140   /* used for runtime values */
141   struct GameInfo_SP *game_sp;
142 };
143
144 struct GraphicInfo_SP
145 {
146   Bitmap *bitmap;
147   int src_x, src_y;
148   int src_offset_x, src_offset_y;
149   int dst_offset_x, dst_offset_y;
150   int width, height;
151
152   Bitmap *crumbled_bitmap;
153   int crumbled_src_x, crumbled_src_y;
154   int crumbled_border_size;
155
156   boolean has_crumbled_graphics;
157   boolean preserve_background;
158
159   int unique_identifier;        /* used to identify needed screen updates */
160 };
161
162 struct EngineSnapshotInfo_SP
163 {
164   struct GameInfo_SP game_sp;
165
166   int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
167   byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
168   byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
169
170   int AnimationPosTable[SP_MAX_PLAYFIELD_SIZE];
171   byte AnimationSubTable[SP_MAX_PLAYFIELD_SIZE];
172   byte TerminalState[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
173 };
174
175
176 /* ------------------------------------------------------------------------- */
177 /* exported functions                                                        */
178 /* ------------------------------------------------------------------------- */
179
180 extern struct GlobalInfo_SP global_sp_info;
181 extern struct GameInfo_SP game_sp;
182 extern struct LevelInfo_SP native_sp_level;
183 extern struct GraphicInfo_SP graphic_info_sp_object[TILE_MAX][8];
184 extern struct GraphicInfo_SP graphic_info_sp_player[MAX_PLAYERS][SPR_MAX][8];
185 extern struct EngineSnapshotInfo_SP engine_snapshot_sp;
186
187 extern void sp_open_all();
188 extern void sp_close_all();
189
190 extern void InitPrecedingPlayfieldMemory();
191 extern void InitGfxBuffers_SP();
192
193 extern void InitGameEngine_SP();
194 extern void GameActions_SP(byte *, boolean);
195
196 extern unsigned int InitEngineRandom_SP(long);
197
198 extern void setLevelInfoToDefaults_SP();
199 extern void copyInternalEngineVars_SP();
200 extern boolean LoadNativeLevel_SP(char *, int, boolean);
201 extern void SaveNativeLevel_SP(char *);
202
203 extern void BackToFront_SP(void);
204 extern void BlitScreenToBitmap_SP(Bitmap *);
205 extern void RedrawPlayfield_SP(boolean);
206 extern void DrawGameDoorValues_SP();
207
208 extern void LoadEngineSnapshotValues_SP();
209 extern void SaveEngineSnapshotValues_SP();
210
211 extern int map_key_RND_to_SP(int);
212 extern int map_key_SP_to_RND(int);
213
214 extern int getRedDiskReleaseFlag_SP();
215
216 #endif  /* GAME_SP_EXPORT_H */