330b547016598516ae3434442291b7e8cee3dc89
[rocksndiamonds.git] / src / game_sp / Globals.h
1 // ----------------------------------------------------------------------------
2 // Globals.h
3 // ----------------------------------------------------------------------------
4
5 #ifndef GLOBALS_H
6 #define GLOBALS_H
7
8 #include "global.h"
9
10
11 #ifndef False
12 #define False                           0
13 #define True                            (!False)
14 #endif
15
16 #define ScrollDelta                     ((long)1)
17
18 #define ZoomFactor                      (2)
19 #define BaseWidth                       (ZoomFactor * 16)
20 #define StretchWidth                    (ZoomFactor * 16)
21 #define TileSize                        (ZoomFactor * 16)
22 #define TwoPixels                       (ZoomFactor * 2)
23
24
25 // ----------------------------------------------------------------------------
26 // elements (stored in file and playfield)
27 // ----------------------------------------------------------------------------
28
29 #define fiSpace                         (0)
30 #define fiZonk                          (1)
31 #define fiBase                          (2)
32 #define fiMurphy                        (3)
33 #define fiInfotron                      (4)
34 #define fiRAM                           (5)
35 #define fiHardWare                      (6)
36 #define fiExit                          (7)
37 #define fiOrangeDisk                    (8)
38 #define fiPortRight                     (9)
39 #define fiPortDown                      (10)
40 #define fiPortLeft                      (11)
41 #define fiPortUp                        (12)
42 #define fiSpPortRight                   (13)
43 #define fiSpPortDown                    (14)
44 #define fiSpPortLeft                    (15)
45 #define fiSpPortUp                      (16)
46 #define fiSnikSnak                      (17)
47 #define fiYellowDisk                    (18)
48 #define fiTerminal                      (19)
49 #define fiRedDisk                       (20)
50 #define fiPortUpAndDown                 (21)
51 #define fiPortLeftAndRight              (22)
52 #define fiPortAllDirections             (23)
53 #define fiElectron                      (24)
54 #define fiBug                           (25)
55 #define fiRAMLeft                       (26)
56 #define fiRAMRight                      (27)
57 #define fiHWFirst                       (28)
58 #define fiHW0                           (fiHWFirst + 0)         // fiHWFirst
59 #define fiHW1                           (fiHWFirst + 1)
60 #define fiHW2                           (fiHWFirst + 2)
61 #define fiHW3                           (fiHWFirst + 3)
62 #define fiHW4                           (fiHWFirst + 4)
63 #define fiHW5                           (fiHWFirst + 5)
64 #define fiHW6                           (fiHWFirst + 6)
65 #define fiHW7                           (fiHWFirst + 7)
66 #define fiHW8                           (fiHWFirst + 8)
67 #define fiHW9                           (fiHWFirst + 9)         // fiHWLast
68 #define fiHWLast                        (37)
69 #define fiRAMTop                        (38)
70 #define fiRAMBottom                     (39)
71 #define fiWallSpace                     (40)
72
73 #define fiExplosion                     (0x1F)
74
75 #define fiFirst                         (0)
76 #define fiLast                          (40)
77
78
79 // ----------------------------------------------------------------------------
80 // graphics and animations (used at runtime to display the elements)
81 // ----------------------------------------------------------------------------
82
83 // graphics and animations directly related to file elements
84
85 #define aniSpace                        IMG_EMPTY_SPACE
86 #define aniZonk                         IMG_SP_ZONK
87 #define aniBase                         IMG_SP_BASE
88 #define aniMurphy                       IMG_SP_MURPHY
89 #define aniInfotron                     IMG_SP_INFOTRON
90 #define aniRAM                          IMG_SP_CHIP_SINGLE
91 #define aniHardWare                     IMG_SP_HARDWARE_GRAY
92 #define aniExit                         IMG_SP_EXIT_CLOSED
93 #define aniOrangeDisk                   IMG_SP_DISK_ORANGE
94 #define aniPortRight                    IMG_SP_PORT_RIGHT
95 #define aniPortDown                     IMG_SP_PORT_DOWN
96 #define aniPortLeft                     IMG_SP_PORT_LEFT
97 #define aniPortUp                       IMG_SP_PORT_UP
98 #define aniSpPortRight                  IMG_SP_GRAVITY_PORT_RIGHT
99 #define aniSpPortDown                   IMG_SP_GRAVITY_PORT_DOWN
100 #define aniSpPortLeft                   IMG_SP_GRAVITY_PORT_LEFT
101 #define aniSpPortUp                     IMG_SP_GRAVITY_PORT_UP
102 #define aniSnikSnak                     IMG_SP_SNIKSNAK
103 #define aniYellowDisk                   IMG_SP_DISK_YELLOW
104 #define aniTerminal                     IMG_SP_TERMINAL
105 #define aniRedDisk                      IMG_SP_DISK_RED
106 #define aniPortUpAndDown                IMG_SP_PORT_VERTICAL
107 #define aniPortLeftAndRight             IMG_SP_PORT_HORIZONTAL
108 #define aniPortAllDirections            IMG_SP_PORT_ANY
109 #define aniElectron                     IMG_SP_ELECTRON
110 #define aniBug                          IMG_SP_BUGGY_BASE
111 #define aniRAMLeft                      IMG_SP_CHIP_LEFT
112 #define aniRAMRight                     IMG_SP_CHIP_RIGHT
113 #define aniHWFirst                      IMG_SP_HARDWARE_BASE_1
114 #define aniHW0                          IMG_SP_HARDWARE_BASE_1
115 #define aniHW1                          IMG_SP_HARDWARE_GREEN
116 #define aniHW2                          IMG_SP_HARDWARE_BLUE
117 #define aniHW3                          IMG_SP_HARDWARE_RED
118 #define aniHW4                          IMG_SP_HARDWARE_YELLOW
119 #define aniHW5                          IMG_SP_HARDWARE_BASE_2
120 #define aniHW6                          IMG_SP_HARDWARE_BASE_3
121 #define aniHW7                          IMG_SP_HARDWARE_BASE_4
122 #define aniHW8                          IMG_SP_HARDWARE_BASE_5
123 #define aniHW9                          IMG_SP_HARDWARE_BASE_6
124 #define aniHWLast                       IMG_SP_HARDWARE_BASE_6
125 #define aniRAMTop                       IMG_SP_CHIP_TOP
126 #define aniRAMBottom                    IMG_SP_CHIP_BOTTOM
127 #define aniWallSpace                    IMG_INVISIBLE_WALL
128 #define aniHWTrash1                     
129 #define aniHWTrash2                     
130 #define aniHWMurphy                     
131
132
133 // graphics and animations related to in-game animations for element actions
134
135 #define aniMurphyDropping               IMG_SP_MURPHY_DROPPING
136
137 #define aniMurphySleepLeft              IMG_SP_MURPHY_SLEEPING_LEFT
138 #define aniMurphySleepRight             IMG_SP_MURPHY_SLEEPING_RIGHT
139 #define aniMurphyTouchLeft              IMG_SP_MURPHY_SNAPPING_LEFT
140 #define aniMurphyTouchRight             IMG_SP_MURPHY_SNAPPING_RIGHT
141 #define aniMurphyTouchUp                IMG_SP_MURPHY_SNAPPING_UP
142 #define aniMurphyTouchDown              IMG_SP_MURPHY_SNAPPING_DOWN
143 #define aniMurphyYawn                   IMG_SP_MURPHY_BORING_1
144 #define aniPushLeft                     IMG_SP_MURPHY_PUSHING_LEFT
145 #define aniPushRight                    IMG_SP_MURPHY_PUSHING_RIGHT
146
147 #define aniBugActivating                IMG_SP_BUGGY_BASE_ACTIVATING
148 #define aniBugDeactivating              IMG_SP_BUGGY_BASE_ACTIVATING
149 #define aniBugActive                    IMG_SP_BUGGY_BASE_ACTIVE
150 #define aniZonkRollLeft                 IMG_SP_ZONK_MOVING_LEFT
151 #define aniZonkRollRight                IMG_SP_ZONK_MOVING_RIGHT
152 #define aniEatInfotronLeft              IMG_SP_MURPHY_COLLECTING_LEFT
153 #define aniEatInfotronRight             IMG_SP_MURPHY_COLLECTING_RIGHT
154 #define aniInfotronRollLeft             IMG_SP_INFOTRON_MOVING_LEFT
155 #define aniInfotronRollRight            IMG_SP_INFOTRON_MOVING_RIGHT
156 #define aniMurphyMoveLeft               IMG_SP_MURPHY_MOVING_LEFT
157 #define aniMurphyMoveRight              IMG_SP_MURPHY_MOVING_RIGHT
158 #define aniMurphyMoveUpLeft             IMG_SP_MURPHY_MOVING_LEFT
159 #define aniMurphyMoveUpRight            IMG_SP_MURPHY_MOVING_RIGHT
160 #define aniMurphyDigLeft                IMG_SP_MURPHY_DIGGING_LEFT
161 #define aniMurphyDigRight               IMG_SP_MURPHY_DIGGING_RIGHT
162 #define aniMurphyDigUpLeft              IMG_SP_MURPHY_DIGGING_LEFT
163 #define aniMurphyDigUpRight             IMG_SP_MURPHY_DIGGING_RIGHT
164 #define aniMurphyEatLeft                IMG_SP_MURPHY_COLLECTING_LEFT
165 #define aniMurphyEatRight               IMG_SP_MURPHY_COLLECTING_RIGHT
166 #define aniMurphyEatUpLeft              IMG_SP_MURPHY_COLLECTING_LEFT
167 #define aniMurphyEatUpRight             IMG_SP_MURPHY_COLLECTING_RIGHT
168 #define aniSplitUpDown                  IMG_SP_MURPHY
169 #define aniMurphyExit                   IMG_SP_MURPHY_SHRINKING
170 #define aniElectron                     IMG_SP_ELECTRON
171 #define aniExplosion                    IMG_SP_DEFAULT_EXPLODING
172 #define aniTouchBase                    IMG_SP_BASE_SNAPPING
173 #define aniTouchInfotron                IMG_SP_INFOTRON_COLLECTING
174 #define aniTouchRedDisk                 IMG_SP_DISK_RED_COLLECTING
175 #define aniYellowDisk                   IMG_SP_DISK_YELLOW
176 #define aniOrangeDisk                   IMG_SP_DISK_ORANGE
177 #define aniRedDisk                      IMG_SP_DISK_RED
178
179 #define aniSnikSnakDown                 IMG_SP_SNIKSNAK_DOWN
180 #define aniSnikSnakLeft                 IMG_SP_SNIKSNAK_LEFT
181 #define aniSnikSnakRight                IMG_SP_SNIKSNAK_RIGHT
182 #define aniSnikSnakUp                   IMG_SP_SNIKSNAK_UP
183
184 #define aniSnikSnakTurnLeftToUp         IMG_SP_SNIKSNAK_TURNING_FROM_LEFT_UP
185 #define aniSnikSnakTurnLeftToDown       IMG_SP_SNIKSNAK_TURNING_FROM_LEFT_DOWN
186 #define aniSnikSnakTurnRightToUp        IMG_SP_SNIKSNAK_TURNING_FROM_RIGHT_UP
187 #define aniSnikSnakTurnRightToDown      IMG_SP_SNIKSNAK_TURNING_FROM_RIGHT_DOWN
188 #define aniSnikSnakTurnUpToLeft         IMG_SP_SNIKSNAK_TURNING_FROM_UP_LEFT
189 #define aniSnikSnakTurnUpToRight        IMG_SP_SNIKSNAK_TURNING_FROM_UP_RIGHT
190 #define aniSnikSnakTurnDownToLeft       IMG_SP_SNIKSNAK_TURNING_FROM_DOWN_LEFT
191 #define aniSnikSnakTurnDownToRight      IMG_SP_SNIKSNAK_TURNING_FROM_DOWN_RIGHT
192
193 #define aniTerminalActive               IMG_SP_TERMINAL_ACTIVE
194
195 #define aniDefaultExplosion             IMG_SP_DEFAULT_EXPLODING
196 #define aniElectronExplosion            IMG_SP_ELECTRON_EXPLODING
197
198 #define imgFrameCorner                  IMG_SP_FRAME_CORNER
199 #define imgFrameHorizontal              IMG_SP_FRAME_HORIZONTAL
200 #define imgFrameVertical                IMG_SP_FRAME_VERTICAL
201
202
203 // ----------------------------------------------------------------------------
204 // input keys
205 // ----------------------------------------------------------------------------
206
207 #define keyNone                         (0)
208 #define keyUp                           (1)
209 #define keyLeft                         (2)
210 #define keyDown                         (3)
211 #define keyRight                        (4)
212 #define keySpaceUp                      (5)
213 #define keySpaceLeft                    (6)
214 #define keySpaceDown                    (7)
215 #define keySpaceRight                   (8)
216 #define keySpace                        (9)
217
218
219 // ----------------------------------------------------------------------------
220 // data structures
221 // ----------------------------------------------------------------------------
222
223 #ifndef HAS_LevelDescriptor
224 typedef struct
225 {
226   int Width;
227   int Height;
228   long OffSet;
229   long Size;
230 } LevelDescriptor;
231 #define HAS_LevelDescriptor
232 #endif
233
234 #ifndef HAS_SpecialPortType
235 typedef struct
236 {
237   short PortLocation; // = 2*(x+(y*60))
238   byte Gravity; // 1 = turn on, anything else (0) = turn off
239   byte FreezeZonks; // 2 = turn on, anything else (0) = turn off  (1=off!)
240   byte FreezeEnemies; // 1 = turn on, anything else (0) = turn off
241   byte UnUsed;
242 } SpecialPortType;
243 #define HAS_SpecialPortType
244 #endif
245
246 #ifndef HAS_LevelInfoType
247 typedef struct
248 {
249   byte UnUsed[4];
250   byte InitialGravity; // 1=on, anything else (0) = off
251   byte Version; // SpeedFixVersion XOR &H20
252   char LevelTitle[23];
253   byte InitialFreezeZonks; // 2=on, anything else (0) = off.  (1=off too!)
254   byte InfotronsNeeded;
255
256   // Number of Infotrons needed. 0 means that Supaplex will count the total
257   // amount of Infotrons in the level, and use the low byte of that number.
258   // (A multiple of 256 Infotrons will then result in 0-to-eat, etc.!)
259   byte SpecialPortCount; // Maximum 10 allowed!
260   SpecialPortType SpecialPort[10];
261   byte SpeedByte; // = Speed XOR Highbyte(RandomSeed)
262   byte CheckSumByte; // = CheckSum XOR SpeedByte
263   short DemoRandomSeed;
264 } LevelInfoType;
265 #define HAS_LevelInfoType
266 #endif
267
268
269 extern int GetSI(int X, int Y);
270 extern int GetStretchX(int si);
271 extern int GetStretchY(int si);
272 extern int GetX(int si);
273 extern int GetY(int si);
274 extern void InitGlobals();
275
276 extern void PrepareLevel();
277
278 extern int getSequenceLength(int sequence);
279 extern boolean isSnappingSequence(int sequence);
280
281 extern void Trace(char *Source, char *Message);
282 extern void ReportError(char *Source, char *Message);
283
284 extern int Min(int A, int B);
285 extern int Max(int A, int B);
286
287 extern int fiGraphic[];
288 extern int aniSnikSnakTurningLeft[];
289 extern int aniSnikSnakTurningRight[];
290
291 extern boolean LevelLoaded;
292
293 extern boolean DemoAvailable;
294 extern boolean menBorder;
295
296 extern int *PlayField16;
297 extern byte *PlayField8;
298 extern byte *DisPlayField;
299
300 extern int FieldHeight;
301 extern int FieldMax, LevelMax;
302 extern int FieldWidth;
303 extern int FreezeZonks;
304 extern int HeaderSize;
305 extern int TimerVar;
306 extern short RandomSeed;
307
308 extern long FileMax;
309
310 extern LevelInfoType LInfo;
311 extern int ScrollMinX, ScrollMaxX, ScrollMinY, ScrollMaxY;
312 extern int ScrollX, ScrollY;
313
314 #endif /* GLOBALS_H */