white space changes
[rocksndiamonds.git] / src / game_mm / mm_main.h
1 // ============================================================================
2 // Mirror Magic -- McDuffin's Revenge
3 // ----------------------------------------------------------------------------
4 // (c) 1994-2017 by Artsoft Entertainment
5 //                  Holger Schemel
6 //                  info@artsoft.org
7 //                  https://www.artsoft.org/
8 // ----------------------------------------------------------------------------
9 // mm_main.h
10 // ============================================================================
11
12 #ifndef MM_MAIN_H
13 #define MM_MAIN_H
14
15 #define STD_LEV_FIELDX  MM_STD_PLAYFIELD_WIDTH
16 #define STD_LEV_FIELDY  MM_STD_PLAYFIELD_HEIGHT
17 #define MAX_LEV_FIELDX  MM_MAX_PLAYFIELD_WIDTH
18 #define MAX_LEV_FIELDY  MM_MAX_PLAYFIELD_HEIGHT
19
20 #define SCREENX(a)      (a)
21 #define SCREENY(a)      (a)
22 #define LEVELX(a)       (a)
23 #define LEVELY(a)       (a)
24
25 #define IN_FIELD(x, y, xsize, ysize)    ((x) >= 0 && (x) < (xsize) &&      \
26                                          (y) >= 0 && (y) < (ysize))
27 #define IN_FIELD_MINMAX(x, y, xmin, ymin, xmax, ymax)                      \
28                                         ((x) >= (xmin) && (x) <= (xmax) && \
29                                          (y) >= (ymin) && (y) <= (ymax))
30
31 #define IN_PIX_FIELD(x, y)      IN_FIELD(x, y, SXSIZE, SYSIZE)
32 #define IN_VIS_FIELD(x, y)      IN_FIELD(x, y, SCR_FIELDX, SCR_FIELDY)
33 #define IN_LEV_FIELD(x, y)      IN_FIELD(x, y, lev_fieldx, lev_fieldy)
34 #define IN_SCR_FIELD(x, y)      IN_FIELD_MINMAX(x, y, BX1, BY1, BX2, BY2)
35
36 // values for 'Elementeigenschaften'
37 #define EP_BIT_GRID             (1 << 0)
38 #define EP_BIT_MCDUFFIN         (1 << 1)
39 #define EP_BIT_RECTANGLE        (1 << 2)
40 #define EP_BIT_MIRROR           (1 << 3)
41 #define EP_BIT_MIRROR_FIXED     (1 << 4)
42 #define EP_BIT_POLAR            (1 << 5)
43 #define EP_BIT_POLAR_CROSS      (1 << 6)
44 #define EP_BIT_BEAMER           (1 << 7)
45 #define EP_BIT_CHAR             (1 << 8)
46 #define EP_BIT_REFLECTING       (1 << 9)
47 #define EP_BIT_ABSORBING        (1 << 10)
48 #define EP_BIT_INACTIVE         (1 << 11)
49 #define EP_BIT_WALL             (1 << 12)
50 #define EP_BIT_PACMAN           (1 << 13)
51 #define EP_BIT_ENVELOPE         (1 << 14)
52
53 #define IS_GRID(e)              (Elementeigenschaften[e] & EP_BIT_GRID)
54 #define IS_MCDUFFIN(e)          (Elementeigenschaften[e] & EP_BIT_MCDUFFIN)
55 #define IS_RECTANGLE(e)         (Elementeigenschaften[e] & EP_BIT_RECTANGLE)
56 #define IS_MIRROR(e)            (Elementeigenschaften[e] & EP_BIT_MIRROR)
57 #define IS_MIRROR_FIXED(e)      (Elementeigenschaften[e] & EP_BIT_MIRROR_FIXED)
58 #define IS_POLAR(e)             (Elementeigenschaften[e] & EP_BIT_POLAR)
59 #define IS_POLAR_CROSS(e)       (Elementeigenschaften[e] & EP_BIT_POLAR_CROSS)
60 #define IS_BEAMER_OLD(e)        (Elementeigenschaften[e] & EP_BIT_BEAMER)
61 #define IS_CHAR(e)              (Elementeigenschaften[e] & EP_BIT_CHAR)
62 #define IS_REFLECTING(e)        (Elementeigenschaften[e] & EP_BIT_REFLECTING)
63 #define IS_ABSORBING(e)         (Elementeigenschaften[e] & EP_BIT_ABSORBING)
64 #define IS_INACTIVE(e)          (Elementeigenschaften[e] & EP_BIT_INACTIVE)
65 #define IS_MM_WALL(e)           (Elementeigenschaften[e] & EP_BIT_WALL)
66 #define IS_PACMAN(e)            (Elementeigenschaften[e] & EP_BIT_PACMAN)
67 #define IS_ENVELOPE(e)          (Elementeigenschaften[e] & EP_BIT_ENVELOPE)
68
69 #define IS_WALL_STEEL(e)        ((e) >= EL_WALL_STEEL_START &&          \
70                                  (e) <= EL_WALL_STEEL_END)
71 #define IS_WALL_WOOD(e)         ((e) >= EL_WALL_WOOD_START &&           \
72                                  (e) <= EL_WALL_WOOD_END)
73 #define IS_WALL_ICE(e)          ((e) >= EL_WALL_ICE_START &&            \
74                                  (e) <= EL_WALL_ICE_END)
75 #define IS_WALL_AMOEBA(e)       ((e) >= EL_WALL_AMOEBA_START &&         \
76                                  (e) <= EL_WALL_AMOEBA_END)
77 #define IS_DF_WALL_STEEL(e)     ((e) >= EL_DF_WALL_STEEL_START &&       \
78                                  (e) <= EL_DF_WALL_STEEL_END)
79 #define IS_DF_WALL_WOOD(e)      ((e) >= EL_DF_WALL_WOOD_START &&        \
80                                  (e) <= EL_DF_WALL_WOOD_END)
81 #define IS_DF_WALL(e)           ((e) >= EL_DF_WALL_START &&             \
82                                  (e) <= EL_DF_WALL_END)
83 #define IS_WALL(e)              (IS_MM_WALL(e) || IS_DF_WALL(e))
84 #define IS_WALL_CHANGING(e)     ((e) >= EL_WALL_CHANGING_START &&       \
85                                  (e) <= EL_WALL_CHANGING_END)
86 #define IS_GRID_STEEL(e)        ((e) >= EL_GRID_STEEL_START &&          \
87                                  (e) <= EL_GRID_STEEL_END)
88 #define IS_GRID_WOOD(e)         ((e) >= EL_GRID_WOOD_START &&           \
89                                  (e) <= EL_GRID_WOOD_END)
90 #define IS_GRID_WOOD_FIXED(e)   ((e) >= EL_GRID_WOOD_FIXED_START &&     \
91                                  (e) <= EL_GRID_WOOD_FIXED_END)
92 #define IS_GRID_STEEL_FIXED(e)  ((e) >= EL_GRID_STEEL_FIXED_START &&    \
93                                  (e) <= EL_GRID_STEEL_FIXED_END)
94 #define IS_GRID_WOOD_AUTO(e)    ((e) >= EL_GRID_WOOD_AUTO_START &&      \
95                                  (e) <= EL_GRID_WOOD_AUTO_END)
96 #define IS_GRID_STEEL_AUTO(e)   ((e) >= EL_GRID_STEEL_AUTO_START &&     \
97                                  (e) <= EL_GRID_STEEL_AUTO_END)
98 #define IS_DF_GRID(e)           (IS_GRID_WOOD_FIXED(e) ||               \
99                                  IS_GRID_STEEL_FIXED(e) ||              \
100                                  IS_GRID_WOOD_AUTO(e) ||                \
101                                  IS_GRID_STEEL_AUTO(e))
102 #define IS_DF_MIRROR(e)         ((e) >= EL_DF_MIRROR_START &&           \
103                                  (e) <= EL_DF_MIRROR_END)
104 #define IS_DF_MIRROR_AUTO(e)    ((e) >= EL_DF_MIRROR_AUTO_START &&      \
105                                  (e) <= EL_DF_MIRROR_AUTO_END)
106 #define IS_LASER(e)             ((e) >= EL_LASER_START &&               \
107                                  (e) <= EL_LASER_END)
108 #define IS_RECEIVER(e)          ((e) >= EL_RECEIVER_START &&            \
109                                  (e) <= EL_RECEIVER_END)
110 #define IS_FIBRE_OPTIC(e)       ((e) >= EL_FIBRE_OPTIC_START &&         \
111                                  (e) <= EL_FIBRE_OPTIC_END)
112 #define FIBRE_OPTIC_NR(e)       (((e) - EL_FIBRE_OPTIC_START) / 2)
113 #define IS_BEAMER(e)            ((e) >= EL_BEAMER_RED_START &&          \
114                                  (e) <= EL_BEAMER_BLUE_END)
115 #define BEAMER_CLASSIC_NR(e)    (((e) - EL_BEAMER_RED_START) / 16)
116 #define BEAMER_NR(e)            (IS_BEAMER(e) ? BEAMER_CLASSIC_NR(e) :  \
117                                  IS_FIBRE_OPTIC(e) ? (FIBRE_OPTIC_NR(e)+4) : 0)
118 #define IS_EXPLODING(e)         ((e) == EL_EXPLODING_OPAQUE ||          \
119                                  (e) == EL_EXPLODING_TRANSP)
120
121 #define IS_EATABLE4PACMAN(e)    ((e) == EL_EMPTY ||                     \
122                                  (e) == EL_KETTLE ||                    \
123                                  (e) == EL_CELL ||                      \
124                                  (e) == EL_BOMB ||                      \
125                                  IS_WALL_AMOEBA(e))
126
127 #define IS_ABSORBING_BLOCK(e)   (IS_WALL_WOOD(e) ||                     \
128                                  IS_DF_WALL_WOOD(e) ||                  \
129                                  (e) == EL_BLOCK_WOOD ||                \
130                                  (e) == EL_GATE_WOOD ||                 \
131                                  (e) == EL_EXIT_CLOSED ||               \
132                                  (e) == EL_EXIT_OPEN)
133
134 #define IS_ENVELOPE_OPENING(e)  ((e) >= EL_ENVELOPE_OPENING_START &&    \
135                                  (e) <= EL_ENVELOPE_OPENING_END)
136
137 #define ENVELOPE_NR(e)          ((e) - EL_ENVELOPE_1)
138 #define ENVELOPE_OPENING_NR(e)  ((e) - EL_ENVELOPE_1_OPENING)
139
140 #define CAN_MOVE(e)             ((e) == EL_PACMAN)
141 #define IS_FREE(x, y)           (Tile[x][y] == EL_EMPTY)
142
143 #define IS_MOVING(x, y)         (MovPos[x][y] != 0)
144 #define IS_BLOCKED(x, y)        (Tile[x][y] == EL_BLOCKED)
145 #define IS_DRAWABLE(e)          ((e) < EL_BLOCKED)
146 #define IS_NOT_DRAWABLE(e)      ((e) >= EL_BLOCKED)
147
148 #define WALL_BASE(e)            ((e) & 0xfff0)
149 #define WALL_BITS(e)            ((e) & 0x000f)
150
151 // boundaries of arrays etc.
152 #define MAX_PLAYER_NAME_LEN     10
153 #define MAX_LEVEL_NAME_LEN      32
154 #define MAX_LEVEL_AUTHOR_LEN    32
155 #define MAX_SCORE_ENTRIES       100
156 #define MAX_ELEMENTS            700             // 500 static + 200 runtime
157
158 #define MICROLEVEL_SCROLL_DELAY 50      // delay for scrolling micro level
159 #define MICROLEVEL_LABEL_DELAY  250     // delay for micro level label
160
161 // score for elements
162 #define SC_COLLECTIBLE          0
163 #define SC_UNUSED_1             1
164 #define SC_UNUSED_2             2
165 #define SC_UNUSED_3             3
166 #define SC_UNUSED_4             4
167 #define SC_UNUSED_5             5
168 #define SC_PACMAN               6
169 #define SC_UNUSED_7             7
170 #define SC_UNUSED_8             8
171 #define SC_KEY                  9
172 #define SC_TIME_BONUS           10
173 #define SC_UNUSED_11            11
174 #define SC_UNUSED_12            12
175 #define SC_UNUSED_13            13
176 #define SC_LIGHTBALL            14
177 #define SC_UNUSED_15            15
178
179 #define LEVEL_SCORE_ELEMENTS    16      // level elements with score
180
181
182 extern DrawBuffer      *drawto_mm;
183 extern DrawBuffer      *bitmap_db_field;
184
185 extern int              game_status;
186 extern boolean          level_editor_test_game;
187
188 extern boolean          redraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
189 extern int              redraw_x1, redraw_y1;
190
191 extern short            Tile[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
192 extern short            Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
193 extern short            Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
194 extern short            Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
195 extern short            Angle[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
196
197 extern short            MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
198 extern short            MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
199 extern short            MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
200 extern short            Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
201 extern short            Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
202 extern short            StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
203 extern short            Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
204 extern boolean          Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
205 extern short            AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
206 extern short            AmoebaCnt[MAX_NUM_AMOEBA];
207 extern short            AmoebaCnt2[MAX_NUM_AMOEBA];
208 extern short            ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
209
210 extern int              GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
211 extern int              GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
212
213 extern unsigned int     Elementeigenschaften[MAX_ELEMENTS];
214
215 extern int              level_nr;
216 extern int              lev_fieldx, lev_fieldy, scroll_x, scroll_y;
217
218 extern int              FX, FY, ScrollStepSize;
219 extern int              ScreenMovDir, ScreenMovPos, ScreenGfxPos;
220 extern int              GameFrameDelay;
221 extern int              FfwdFrameDelay;
222 extern int              BX1, BY1, BX2, BY2;
223 extern int              SBX_Left, SBX_Right;
224 extern int              SBY_Upper, SBY_Lower;
225 extern int              TimeFrames, TimePlayed, TimeLeft;
226
227 extern struct LevelInfo_MM      native_mm_level;
228 extern struct GameInfo_MM       game_mm;
229 extern struct LaserInfo         laser;
230
231 extern short            LX, LY, XS, YS, ELX, ELY;
232 extern short            CT, Ct;
233
234 extern int              dSX, dSY;
235 extern int              cSX, cSY;
236 extern int              cSX2, cSY2;
237 extern int              cFX, cFY;
238
239 extern Pixel            pen_fg, pen_bg, pen_ray, pen_magicolor[2];
240 extern int              color_status;
241
242 extern struct XY        Step[];
243 extern short            Sign[16];
244
245 extern char            *element_info[];
246 extern int              num_element_info;
247
248 // wall positions (that can be OR'ed together)
249 #define WALL_TOPLEFT            1
250 #define WALL_TOPRIGHT           2
251 #define WALL_BOTTOMLEFT         4
252 #define WALL_BOTTOMRIGHT        8
253 #define WALL_LEFT               (WALL_TOPLEFT    | WALL_BOTTOMLEFT)
254 #define WALL_RIGHT              (WALL_TOPRIGHT   | WALL_BOTTOMRIGHT)
255 #define WALL_TOP                (WALL_TOPLEFT    | WALL_TOPRIGHT)
256 #define WALL_BOTTOM             (WALL_BOTTOMLEFT | WALL_BOTTOMRIGHT)
257
258 // game elements:
259 //        0 - 499: real elements, stored in level file
260 //      500 - 699: flag elements, only used at runtime
261
262 // "real" level elements
263 #define EL_MM_START             0
264 #define EL_MM_START_1           EL_MM_START
265
266 #define EL_EMPTY                0
267 #define EL_MIRROR_START         1
268 #define EL_MIRROR_00            (EL_MIRROR_START + 0)
269 #define EL_MIRROR_01            (EL_MIRROR_START + 1)
270 #define EL_MIRROR_02            (EL_MIRROR_START + 2)
271 #define EL_MIRROR_03            (EL_MIRROR_START + 3)
272 #define EL_MIRROR_04            (EL_MIRROR_START + 4)
273 #define EL_MIRROR_05            (EL_MIRROR_START + 5)
274 #define EL_MIRROR_06            (EL_MIRROR_START + 6)
275 #define EL_MIRROR_07            (EL_MIRROR_START + 7)
276 #define EL_MIRROR_08            (EL_MIRROR_START + 8)
277 #define EL_MIRROR_09            (EL_MIRROR_START + 9)
278 #define EL_MIRROR_10            (EL_MIRROR_START + 10)
279 #define EL_MIRROR_11            (EL_MIRROR_START + 11)
280 #define EL_MIRROR_12            (EL_MIRROR_START + 12)
281 #define EL_MIRROR_13            (EL_MIRROR_START + 13)
282 #define EL_MIRROR_14            (EL_MIRROR_START + 14)
283 #define EL_MIRROR_15            (EL_MIRROR_START + 15)
284 #define EL_MIRROR_END           EL_MIRROR_15
285 #define EL_GRID_STEEL_START     17
286 #define EL_GRID_STEEL_00        (EL_GRID_STEEL_START + 0)
287 #define EL_GRID_STEEL_01        (EL_GRID_STEEL_START + 1)
288 #define EL_GRID_STEEL_02        (EL_GRID_STEEL_START + 2)
289 #define EL_GRID_STEEL_03        (EL_GRID_STEEL_START + 3)
290 #define EL_GRID_STEEL_END       EL_GRID_STEEL_03
291 #define EL_MCDUFFIN_START       21
292 #define EL_MCDUFFIN_RIGHT       (EL_MCDUFFIN_START + 0)
293 #define EL_MCDUFFIN_UP          (EL_MCDUFFIN_START + 1)
294 #define EL_MCDUFFIN_LEFT        (EL_MCDUFFIN_START + 2)
295 #define EL_MCDUFFIN_DOWN        (EL_MCDUFFIN_START + 3)
296 #define EL_MCDUFFIN_END         EL_MCDUFFIN_DOWN
297 #define EL_EXIT_CLOSED          25
298 #define EL_EXIT_OPENING_1       26
299 #define EL_EXIT_OPENING_2       27
300 #define EL_EXIT_OPEN            28
301 #define EL_KETTLE               29
302 #define EL_BOMB                 30
303 #define EL_PRISM                31
304 #define EL_WALL_START           EL_WALL_STEEL_START
305 #define EL_WALL_STEEL_BASE      32
306 #define EL_WALL_STEEL_START     (EL_WALL_STEEL_BASE + 0)
307 #define EL_WALL_STEEL_END       (EL_WALL_STEEL_BASE + 15)
308 #define EL_WALL_WOOD_BASE       48
309 #define EL_WALL_WOOD_START      (EL_WALL_WOOD_BASE + 0)
310 #define EL_WALL_WOOD_END        (EL_WALL_WOOD_BASE + 15)
311 #define EL_WALL_ICE_BASE        64
312 #define EL_WALL_ICE_START       (EL_WALL_ICE_BASE + 0)
313 #define EL_WALL_ICE_END         (EL_WALL_ICE_BASE + 15)
314 #define EL_WALL_AMOEBA_BASE     80
315 #define EL_WALL_AMOEBA_START    (EL_WALL_AMOEBA_BASE + 0)
316 #define EL_WALL_AMOEBA_END      (EL_WALL_AMOEBA_BASE + 15)
317 #define EL_WALL_END             EL_WALL_AMOEBA_END
318 #define EL_BLOCK_WOOD           96
319 #define EL_GRAY_BALL            97
320 #define EL_BEAMER_START         98
321 #define EL_BEAMER_00            (EL_BEAMER_START + 0)
322 #define EL_BEAMER_01            (EL_BEAMER_START + 1)
323 #define EL_BEAMER_02            (EL_BEAMER_START + 2)
324 #define EL_BEAMER_03            (EL_BEAMER_START + 3)
325 #define EL_BEAMER_04            (EL_BEAMER_START + 4)
326 #define EL_BEAMER_05            (EL_BEAMER_START + 5)
327 #define EL_BEAMER_06            (EL_BEAMER_START + 6)
328 #define EL_BEAMER_07            (EL_BEAMER_START + 7)
329 #define EL_BEAMER_08            (EL_BEAMER_START + 8)
330 #define EL_BEAMER_09            (EL_BEAMER_START + 9)
331 #define EL_BEAMER_10            (EL_BEAMER_START + 10)
332 #define EL_BEAMER_11            (EL_BEAMER_START + 11)
333 #define EL_BEAMER_12            (EL_BEAMER_START + 12)
334 #define EL_BEAMER_13            (EL_BEAMER_START + 13)
335 #define EL_BEAMER_14            (EL_BEAMER_START + 14)
336 #define EL_BEAMER_15            (EL_BEAMER_START + 15)
337 #define EL_BEAMER_END           EL_BEAMER_15
338 #define EL_FUSE_ON              114
339 #define EL_PACMAN_START         115
340 #define EL_PACMAN_RIGHT         (EL_PACMAN_START + 0)
341 #define EL_PACMAN_UP            (EL_PACMAN_START + 1)
342 #define EL_PACMAN_LEFT          (EL_PACMAN_START + 2)
343 #define EL_PACMAN_DOWN          (EL_PACMAN_START + 3)
344 #define EL_PACMAN_END           EL_PACMAN_DOWN
345 #define EL_POLAR_START          119
346 #define EL_POLAR_00             (EL_POLAR_START + 0)
347 #define EL_POLAR_01             (EL_POLAR_START + 1)
348 #define EL_POLAR_02             (EL_POLAR_START + 2)
349 #define EL_POLAR_03             (EL_POLAR_START + 3)
350 #define EL_POLAR_04             (EL_POLAR_START + 4)
351 #define EL_POLAR_05             (EL_POLAR_START + 5)
352 #define EL_POLAR_06             (EL_POLAR_START + 6)
353 #define EL_POLAR_07             (EL_POLAR_START + 7)
354 #define EL_POLAR_08             (EL_POLAR_START + 8)
355 #define EL_POLAR_09             (EL_POLAR_START + 9)
356 #define EL_POLAR_10             (EL_POLAR_START + 10)
357 #define EL_POLAR_11             (EL_POLAR_START + 11)
358 #define EL_POLAR_12             (EL_POLAR_START + 12)
359 #define EL_POLAR_13             (EL_POLAR_START + 13)
360 #define EL_POLAR_14             (EL_POLAR_START + 14)
361 #define EL_POLAR_15             (EL_POLAR_START + 15)
362 #define EL_POLAR_END            EL_POLAR_15
363 #define EL_POLAR_CROSS_START    135
364 #define EL_POLAR_CROSS_00       (EL_POLAR_CROSS_START + 0)
365 #define EL_POLAR_CROSS_01       (EL_POLAR_CROSS_START + 1)
366 #define EL_POLAR_CROSS_02       (EL_POLAR_CROSS_START + 2)
367 #define EL_POLAR_CROSS_03       (EL_POLAR_CROSS_START + 3)
368 #define EL_POLAR_CROSS_END      EL_POLAR_CROSS_03
369 #define EL_MIRROR_FIXED_START   139
370 #define EL_MIRROR_FIXED_00      (EL_MIRROR_FIXED_START + 0)
371 #define EL_MIRROR_FIXED_01      (EL_MIRROR_FIXED_START + 1)
372 #define EL_MIRROR_FIXED_02      (EL_MIRROR_FIXED_START + 2)
373 #define EL_MIRROR_FIXED_03      (EL_MIRROR_FIXED_START + 3)
374 #define EL_MIRROR_FIXED_END     EL_MIRROR_FIXED_03
375 #define EL_GATE_STONE           143
376 #define EL_KEY                  144
377 #define EL_LIGHTBULB_OFF        145
378 #define EL_LIGHTBULB_ON         146
379 #define EL_LIGHTBALL            147
380 #define EL_BLOCK_STONE          148
381 #define EL_GATE_WOOD            149
382 #define EL_FUEL_FULL            150
383 #define EL_GRID_WOOD_START      151
384 #define EL_GRID_WOOD_00         (EL_GRID_WOOD_START + 0)
385 #define EL_GRID_WOOD_01         (EL_GRID_WOOD_START + 1)
386 #define EL_GRID_WOOD_02         (EL_GRID_WOOD_START + 2)
387 #define EL_GRID_WOOD_03         (EL_GRID_WOOD_START + 3)
388 #define EL_GRID_WOOD_END        EL_GRID_WOOD_03
389 #define EL_FUEL_EMPTY           155
390 #define EL_ENVELOPE_1           156
391 #define EL_ENVELOPE_2           157
392 #define EL_ENVELOPE_3           158
393 #define EL_ENVELOPE_4           159
394
395 #define EL_MM_END_1             159
396
397 #define EL_CHAR_START           160
398 #define EL_CHAR_ASCII0          (EL_CHAR_START - 32)
399 #define EL_CHAR_AUSRUF          (EL_CHAR_ASCII0 + 33)
400 #define EL_CHAR_ZOLL            (EL_CHAR_ASCII0 + 34)
401 #define EL_CHAR_RAUTE           (EL_CHAR_ASCII0 + 35)
402 #define EL_CHAR_DOLLAR          (EL_CHAR_ASCII0 + 36)
403 #define EL_CHAR_PROZ            (EL_CHAR_ASCII0 + 37)
404 #define EL_CHAR_AMPERSAND       (EL_CHAR_ASCII0 + 38)
405 #define EL_CHAR_APOSTR          (EL_CHAR_ASCII0 + 39)
406 #define EL_CHAR_KLAMM1          (EL_CHAR_ASCII0 + 40)
407 #define EL_CHAR_KLAMM2          (EL_CHAR_ASCII0 + 41)
408 #define EL_CHAR_MULT            (EL_CHAR_ASCII0 + 42)
409 #define EL_CHAR_PLUS            (EL_CHAR_ASCII0 + 43)
410 #define EL_CHAR_KOMMA           (EL_CHAR_ASCII0 + 44)
411 #define EL_CHAR_MINUS           (EL_CHAR_ASCII0 + 45)
412 #define EL_CHAR_PUNKT           (EL_CHAR_ASCII0 + 46)
413 #define EL_CHAR_SLASH           (EL_CHAR_ASCII0 + 47)
414 #define EL_CHAR_0               (EL_CHAR_ASCII0 + 48)
415 #define EL_CHAR_9               (EL_CHAR_ASCII0 + 57)
416 #define EL_CHAR_DOPPEL          (EL_CHAR_ASCII0 + 58)
417 #define EL_CHAR_SEMIKL          (EL_CHAR_ASCII0 + 59)
418 #define EL_CHAR_LT              (EL_CHAR_ASCII0 + 60)
419 #define EL_CHAR_GLEICH          (EL_CHAR_ASCII0 + 61)
420 #define EL_CHAR_GT              (EL_CHAR_ASCII0 + 62)
421 #define EL_CHAR_FRAGE           (EL_CHAR_ASCII0 + 63)
422 #define EL_CHAR_AT              (EL_CHAR_ASCII0 + 64)
423 #define EL_CHAR_A               (EL_CHAR_ASCII0 + 65)
424 #define EL_CHAR_Z               (EL_CHAR_ASCII0 + 90)
425 #define EL_CHAR_AE              (EL_CHAR_ASCII0 + 91)
426 #define EL_CHAR_OE              (EL_CHAR_ASCII0 + 92)
427 #define EL_CHAR_UE              (EL_CHAR_ASCII0 + 93)
428 #define EL_CHAR_COPY            (EL_CHAR_ASCII0 + 94)
429 #define EL_CHAR_END             (EL_CHAR_START + 79)
430
431 #define EL_CHAR(x)              ((x) == CHAR_BYTE_UMLAUT_A ? EL_CHAR_AE : \
432                                  (x) == CHAR_BYTE_UMLAUT_O ? EL_CHAR_OE : \
433                                  (x) == CHAR_BYTE_UMLAUT_U ? EL_CHAR_UE : \
434                                  EL_CHAR_A + (x) - 'A')
435
436 #define EL_MM_START_2           240
437
438 // elements for "Deflektor" style levels
439 #define EL_DF_START             EL_MM_START_2
440
441 #define EL_DF_MIRROR_START      EL_DF_START
442 #define EL_DF_MIRROR_00         (EL_DF_MIRROR_START + 0)
443 #define EL_DF_MIRROR_01         (EL_DF_MIRROR_START + 1)
444 #define EL_DF_MIRROR_02         (EL_DF_MIRROR_START + 2)
445 #define EL_DF_MIRROR_03         (EL_DF_MIRROR_START + 3)
446 #define EL_DF_MIRROR_04         (EL_DF_MIRROR_START + 4)
447 #define EL_DF_MIRROR_05         (EL_DF_MIRROR_START + 5)
448 #define EL_DF_MIRROR_06         (EL_DF_MIRROR_START + 6)
449 #define EL_DF_MIRROR_07         (EL_DF_MIRROR_START + 7)
450 #define EL_DF_MIRROR_08         (EL_DF_MIRROR_START + 8)
451 #define EL_DF_MIRROR_09         (EL_DF_MIRROR_START + 9)
452 #define EL_DF_MIRROR_10         (EL_DF_MIRROR_START + 10)
453 #define EL_DF_MIRROR_11         (EL_DF_MIRROR_START + 11)
454 #define EL_DF_MIRROR_12         (EL_DF_MIRROR_START + 12)
455 #define EL_DF_MIRROR_13         (EL_DF_MIRROR_START + 13)
456 #define EL_DF_MIRROR_14         (EL_DF_MIRROR_START + 14)
457 #define EL_DF_MIRROR_15         (EL_DF_MIRROR_START + 15)
458 #define EL_DF_MIRROR_END        EL_DF_MIRROR_15
459
460 #define EL_GRID_WOOD_FIXED_START 256
461 #define EL_GRID_WOOD_FIXED_00   (EL_GRID_WOOD_FIXED_START + 0)  //   0.0°
462 #define EL_GRID_WOOD_FIXED_01   (EL_GRID_WOOD_FIXED_START + 1)  //  22.5°
463 #define EL_GRID_WOOD_FIXED_02   (EL_GRID_WOOD_FIXED_START + 2)  //  45.0°
464 #define EL_GRID_WOOD_FIXED_03   (EL_GRID_WOOD_FIXED_START + 3)  //  67.5°
465 #define EL_GRID_WOOD_FIXED_04   (EL_GRID_WOOD_FIXED_START + 4)  //  90.0°
466 #define EL_GRID_WOOD_FIXED_05   (EL_GRID_WOOD_FIXED_START + 5)  // 112.5°
467 #define EL_GRID_WOOD_FIXED_06   (EL_GRID_WOOD_FIXED_START + 6)  // 135.0°
468 #define EL_GRID_WOOD_FIXED_07   (EL_GRID_WOOD_FIXED_START + 7)  // 157.5°
469 #define EL_GRID_WOOD_FIXED_END  EL_GRID_WOOD_FIXED_07
470
471 #define EL_GRID_STEEL_FIXED_START 264
472 #define EL_GRID_STEEL_FIXED_00  (EL_GRID_STEEL_FIXED_START + 0) //   0.0°
473 #define EL_GRID_STEEL_FIXED_01  (EL_GRID_STEEL_FIXED_START + 1) //  22.5°
474 #define EL_GRID_STEEL_FIXED_02  (EL_GRID_STEEL_FIXED_START + 2) //  45.0°
475 #define EL_GRID_STEEL_FIXED_03  (EL_GRID_STEEL_FIXED_START + 3) //  67.5°
476 #define EL_GRID_STEEL_FIXED_04  (EL_GRID_STEEL_FIXED_START + 4) //  90.0°
477 #define EL_GRID_STEEL_FIXED_05  (EL_GRID_STEEL_FIXED_START + 5) // 112.5°
478 #define EL_GRID_STEEL_FIXED_06  (EL_GRID_STEEL_FIXED_START + 6) // 135.0°
479 #define EL_GRID_STEEL_FIXED_07  (EL_GRID_STEEL_FIXED_START + 7) // 157.5°
480 #define EL_GRID_STEEL_FIXED_END EL_GRID_STEEL_FIXED_07
481
482 #define EL_DF_WALL_WOOD_BASE    272
483 #define EL_DF_WALL_WOOD_START   (EL_DF_WALL_WOOD_BASE + 0)
484 #define EL_DF_WALL_WOOD_END     (EL_DF_WALL_WOOD_BASE + 15)
485
486 #define EL_DF_WALL_STEEL_BASE   288
487 #define EL_DF_WALL_STEEL_START  (EL_DF_WALL_STEEL_BASE + 0)
488 #define EL_DF_WALL_STEEL_END    (EL_DF_WALL_STEEL_BASE + 15)
489
490 #define EL_DF_WALL_START        EL_DF_WALL_WOOD_START
491 #define EL_DF_WALL_END          EL_DF_WALL_STEEL_END
492
493 #define EL_DF_EMPTY             304
494 #define EL_CELL                 305
495 #define EL_MINE                 306
496 #define EL_REFRACTOR            307
497
498 #define EL_LASER_START          308
499 #define EL_LASER_RIGHT          (EL_LASER_START + 0)
500 #define EL_LASER_UP             (EL_LASER_START + 1)
501 #define EL_LASER_LEFT           (EL_LASER_START + 2)
502 #define EL_LASER_DOWN           (EL_LASER_START + 3)
503 #define EL_LASER_END            EL_LASER_DOWN
504
505 #define EL_RECEIVER_START       312
506 #define EL_RECEIVER_RIGHT       (EL_RECEIVER_START + 0)
507 #define EL_RECEIVER_UP          (EL_RECEIVER_START + 1)
508 #define EL_RECEIVER_LEFT        (EL_RECEIVER_START + 2)
509 #define EL_RECEIVER_DOWN        (EL_RECEIVER_START + 3)
510 #define EL_RECEIVER_END         EL_RECEIVER_DOWN
511
512 #define EL_FIBRE_OPTIC_START    316
513 #define EL_FIBRE_OPTIC_00       (EL_FIBRE_OPTIC_START + 0)
514 #define EL_FIBRE_OPTIC_01       (EL_FIBRE_OPTIC_START + 1)
515 #define EL_FIBRE_OPTIC_02       (EL_FIBRE_OPTIC_START + 2)
516 #define EL_FIBRE_OPTIC_03       (EL_FIBRE_OPTIC_START + 3)
517 #define EL_FIBRE_OPTIC_04       (EL_FIBRE_OPTIC_START + 4)
518 #define EL_FIBRE_OPTIC_05       (EL_FIBRE_OPTIC_START + 5)
519 #define EL_FIBRE_OPTIC_06       (EL_FIBRE_OPTIC_START + 6)
520 #define EL_FIBRE_OPTIC_07       (EL_FIBRE_OPTIC_START + 7)
521 #define EL_FIBRE_OPTIC_END      EL_FIBRE_OPTIC_07
522
523 #define EL_DF_MIRROR_AUTO_START 324
524 #define EL_DF_MIRROR_AUTO_00    (EL_DF_MIRROR_AUTO_START + 0)
525 #define EL_DF_MIRROR_AUTO_01    (EL_DF_MIRROR_AUTO_START + 1)
526 #define EL_DF_MIRROR_AUTO_02    (EL_DF_MIRROR_AUTO_START + 2)
527 #define EL_DF_MIRROR_AUTO_03    (EL_DF_MIRROR_AUTO_START + 3)
528 #define EL_DF_MIRROR_AUTO_04    (EL_DF_MIRROR_AUTO_START + 4)
529 #define EL_DF_MIRROR_AUTO_05    (EL_DF_MIRROR_AUTO_START + 5)
530 #define EL_DF_MIRROR_AUTO_06    (EL_DF_MIRROR_AUTO_START + 6)
531 #define EL_DF_MIRROR_AUTO_07    (EL_DF_MIRROR_AUTO_START + 7)
532 #define EL_DF_MIRROR_AUTO_08    (EL_DF_MIRROR_AUTO_START + 8)
533 #define EL_DF_MIRROR_AUTO_09    (EL_DF_MIRROR_AUTO_START + 9)
534 #define EL_DF_MIRROR_AUTO_10    (EL_DF_MIRROR_AUTO_START + 10)
535 #define EL_DF_MIRROR_AUTO_11    (EL_DF_MIRROR_AUTO_START + 11)
536 #define EL_DF_MIRROR_AUTO_12    (EL_DF_MIRROR_AUTO_START + 12)
537 #define EL_DF_MIRROR_AUTO_13    (EL_DF_MIRROR_AUTO_START + 13)
538 #define EL_DF_MIRROR_AUTO_14    (EL_DF_MIRROR_AUTO_START + 14)
539 #define EL_DF_MIRROR_AUTO_15    (EL_DF_MIRROR_AUTO_START + 15)
540 #define EL_DF_MIRROR_AUTO_END   EL_DF_MIRROR_AUTO_15
541
542 #define EL_GRID_WOOD_AUTO_START 340
543 #define EL_GRID_WOOD_AUTO_00    (EL_GRID_WOOD_AUTO_START + 0)
544 #define EL_GRID_WOOD_AUTO_01    (EL_GRID_WOOD_AUTO_START + 1)
545 #define EL_GRID_WOOD_AUTO_02    (EL_GRID_WOOD_AUTO_START + 2)
546 #define EL_GRID_WOOD_AUTO_03    (EL_GRID_WOOD_AUTO_START + 3)
547 #define EL_GRID_WOOD_AUTO_04    (EL_GRID_WOOD_AUTO_START + 4)
548 #define EL_GRID_WOOD_AUTO_05    (EL_GRID_WOOD_AUTO_START + 5)
549 #define EL_GRID_WOOD_AUTO_06    (EL_GRID_WOOD_AUTO_START + 6)
550 #define EL_GRID_WOOD_AUTO_07    (EL_GRID_WOOD_AUTO_START + 7)
551 #define EL_GRID_WOOD_AUTO_END   EL_GRID_WOOD_AUTO_07
552
553 #define EL_GRID_STEEL_AUTO_START 348
554 #define EL_GRID_STEEL_AUTO_00   (EL_GRID_STEEL_AUTO_START + 0)
555 #define EL_GRID_STEEL_AUTO_01   (EL_GRID_STEEL_AUTO_START + 1)
556 #define EL_GRID_STEEL_AUTO_02   (EL_GRID_STEEL_AUTO_START + 2)
557 #define EL_GRID_STEEL_AUTO_03   (EL_GRID_STEEL_AUTO_START + 3)
558 #define EL_GRID_STEEL_AUTO_04   (EL_GRID_STEEL_AUTO_START + 4)
559 #define EL_GRID_STEEL_AUTO_05   (EL_GRID_STEEL_AUTO_START + 5)
560 #define EL_GRID_STEEL_AUTO_06   (EL_GRID_STEEL_AUTO_START + 6)
561 #define EL_GRID_STEEL_AUTO_07   (EL_GRID_STEEL_AUTO_START + 7)
562 #define EL_GRID_STEEL_AUTO_END  EL_GRID_STEEL_AUTO_07
563
564 #define EL_DF_END               355
565
566 #define EL_BEAMER_RED_START     356
567 #define EL_BEAMER_RED_END       (EL_BEAMER_RED_START + 15)
568 #define EL_BEAMER_YELLOW_START  372
569 #define EL_BEAMER_YELLOW_END    (EL_BEAMER_YELLOW_START + 15)
570 #define EL_BEAMER_GREEN_START   388
571 #define EL_BEAMER_GREEN_END     (EL_BEAMER_GREEN_START + 15)
572 #define EL_BEAMER_BLUE_START    404
573 #define EL_BEAMER_BLUE_END      (EL_BEAMER_BLUE_START + 15)
574
575 // element definitions partially used for drawing graphics
576 #define EL_MCDUFFIN             420
577 #define EL_PACMAN               421
578 #define EL_FUSE_OFF             422
579 #define EL_WALL_STEEL           423
580 #define EL_WALL_WOOD            424
581 #define EL_WALL_ICE             425
582 #define EL_WALL_AMOEBA          426
583 #define EL_LASER                427
584 #define EL_RECEIVER             428
585 #define EL_DF_WALL_STEEL        429
586 #define EL_DF_WALL_WOOD         430
587
588 #define EL_MM_END_2             430
589 #define EL_MM_END               EL_MM_END_2
590
591 // "real" (and therefore drawable) runtime elements
592 #define EL_EXIT_OPENING         500
593 #define EL_EXIT_CLOSING         501
594 #define EL_GRAY_BALL_ACTIVE     502
595 #define EL_GRAY_BALL_OPENING    503
596 #define EL_WALL_ICE_SHRINKING   504
597 #define EL_WALL_AMOEBA_GROWING  505
598 #define EL_BOMB_ACTIVE          506
599 #define EL_MINE_ACTIVE          507
600 #define EL_ENVELOPE_1_OPENING   508
601 #define EL_ENVELOPE_2_OPENING   509
602 #define EL_ENVELOPE_3_OPENING   510
603 #define EL_ENVELOPE_4_OPENING   511
604
605 #define EL_ENVELOPE_OPENING_START       EL_ENVELOPE_1_OPENING
606 #define EL_ENVELOPE_OPENING_END         EL_ENVELOPE_4_OPENING
607
608 #define EL_WALL_CHANGING_BASE   512
609 #define EL_WALL_CHANGING_START  (EL_WALL_CHANGING_BASE + 0)
610 #define EL_WALL_CHANGING_END    (EL_WALL_CHANGING_BASE + 15)
611
612 #define EL_FIRST_RUNTIME_EL     EL_EXIT_OPENING
613
614 // "unreal" (and therefore not drawable) runtime elements
615 #define EL_BLOCKED              600
616 #define EL_EXPLODING_OPAQUE     601
617 #define EL_EXPLODING_TRANSP     602
618
619
620 // game graphics:
621 //        0 -  191: graphics from "MirrorScreen"
622 //      192 -  255: pseudo graphics mapped to "MirrorScreen"
623 //      256 -  511: graphics from "MirrorFont"
624 //      512 -  767: graphics from "MirrorDF"
625
626 #define IMG_EMPTY               IMG_EMPTY_SPACE
627
628 // values for graphics/sounds action types
629 #define MM_ACTION_DEFAULT       0
630 #define MM_ACTION_WAITING       1
631 #define MM_ACTION_FALLING       2
632 #define MM_ACTION_MOVING        3
633 #define MM_ACTION_DIGGING       4
634 #define MM_ACTION_SNAPPING      5
635 #define MM_ACTION_COLLECTING    6
636 #define MM_ACTION_DROPPING      7
637 #define MM_ACTION_PUSHING       8
638 #define MM_ACTION_WALKING       9
639 #define MM_ACTION_PASSING       10
640 #define MM_ACTION_IMPACT        11
641 #define MM_ACTION_BREAKING      12
642 #define MM_ACTION_ACTIVATING    13
643 #define MM_ACTION_DEACTIVATING  14
644 #define MM_ACTION_OPENING       15
645 #define MM_ACTION_CLOSING       16
646 #define MM_ACTION_ATTACKING     17
647 #define MM_ACTION_GROWING       18
648 #define MM_ACTION_SHRINKING     19
649 #define MM_ACTION_ACTIVE        20
650 #define MM_ACTION_FILLING       21
651 #define MM_ACTION_EMPTYING      22
652 #define MM_ACTION_CHANGING      23
653 #define MM_ACTION_EXPLODING     24
654 #define MM_ACTION_BORING        25
655 #define MM_ACTION_BORING_1      26
656 #define MM_ACTION_BORING_2      27
657 #define MM_ACTION_BORING_3      28
658 #define MM_ACTION_BORING_4      29
659 #define MM_ACTION_BORING_5      30
660 #define MM_ACTION_BORING_6      31
661 #define MM_ACTION_BORING_7      32
662 #define MM_ACTION_BORING_8      33
663 #define MM_ACTION_BORING_9      34
664 #define MM_ACTION_BORING_10     35
665 #define MM_ACTION_SLEEPING      36
666 #define MM_ACTION_SLEEPING_1    37
667 #define MM_ACTION_SLEEPING_2    38
668 #define MM_ACTION_SLEEPING_3    39
669 #define MM_ACTION_AWAKENING     40
670 #define MM_ACTION_DYING         41
671 #define MM_ACTION_TURNING               42
672 #define MM_ACTION_TURNING_FROM_LEFT     43
673 #define MM_ACTION_TURNING_FROM_RIGHT    44
674 #define MM_ACTION_TURNING_FROM_UP       45
675 #define MM_ACTION_TURNING_FROM_DOWN     46
676 #define MM_ACTION_SMASHED_BY_ROCK       47
677 #define MM_ACTION_SMASHED_BY_SPRING     48
678 #define MM_ACTION_EATING                49
679 #define MM_ACTION_TWINKLING             50
680 #define MM_ACTION_SPLASHING             51
681 #define MM_ACTION_HITTING               52
682
683 // laser angles (directions)
684 #define ANG_RAY_RIGHT           0
685 #define ANG_RAY_UP              4
686 #define ANG_RAY_LEFT            8
687 #define ANG_RAY_DOWN            12
688
689 // laser angles (degree)
690 #define ANG_RAY_0               0
691 #define ANG_RAY_90              4
692 #define ANG_RAY_180             8
693 #define ANG_RAY_270             12
694 #define IS_22_5_ANGLE(angle)    ((angle) % 2)
695 #define IS_90_ANGLE(angle)      (!((angle) % 4))
696 #define IS_HORIZ_ANGLE(angle)   (!((angle) % 8))
697 #define IS_VERT_ANGLE(angle)    ((angle) % 8)
698
699 // mirror angles
700 #define ANG_MIRROR_0            0
701 #define ANG_MIRROR_45           4
702 #define ANG_MIRROR_90           8
703 #define ANG_MIRROR_135          12
704
705 // positions for checking where laser already hits element
706 #define HIT_POS_CENTER          1
707 #define HIT_POS_EDGE            2
708 #define HIT_POS_BETWEEN         4
709
710 // masks for scanning elements
711 #define HIT_MASK_NO_HIT         0
712 #define HIT_MASK_TOPLEFT        1
713 #define HIT_MASK_TOPRIGHT       2
714 #define HIT_MASK_BOTTOMLEFT     4
715 #define HIT_MASK_BOTTOMRIGHT    8
716 #define HIT_MASK_LEFT           (HIT_MASK_TOPLEFT | HIT_MASK_BOTTOMLEFT)
717 #define HIT_MASK_RIGHT          (HIT_MASK_TOPRIGHT | HIT_MASK_BOTTOMRIGHT)
718 #define HIT_MASK_TOP            (HIT_MASK_TOPLEFT | HIT_MASK_TOPRIGHT)
719 #define HIT_MASK_BOTTOM         (HIT_MASK_BOTTOMLEFT | HIT_MASK_BOTTOMRIGHT)
720 #define HIT_MASK_DIAGONAL_1     (HIT_MASK_TOPLEFT  | HIT_MASK_BOTTOMRIGHT)
721 #define HIT_MASK_DIAGONAL_2     (HIT_MASK_TOPRIGHT | HIT_MASK_BOTTOMLEFT)
722 #define HIT_MASK_ALL            (HIT_MASK_LEFT | HIT_MASK_RIGHT)
723
724 // step values for rotating elements
725 #define ROTATE_NO_ROTATING      0
726 #define ROTATE_LEFT             (+1)
727 #define ROTATE_RIGHT            (-1)
728 #define BUTTON_ROTATION(button) ((button) == MB_LEFTBUTTON  ? ROTATE_LEFT :  \
729                                  (button) == MB_RIGHTBUTTON ? ROTATE_RIGHT : \
730                                  ROTATE_NO_ROTATING)
731
732 // game over values
733 #define GAME_OVER_NO_ENERGY     1
734 #define GAME_OVER_OVERLOADED    2
735 #define GAME_OVER_BOMB          3
736
737 #define PROGRAM_VERSION_MAJOR   2
738 #define PROGRAM_VERSION_MINOR   0
739 #define PROGRAM_VERSION_PATCH   2
740 #define PROGRAM_VERSION_STRING  "2.0.2"
741
742 // functions for version handling
743 #define MM_VERSION_IDENT(x,y,z) VERSION_IDENT(x,y,z,0)
744 #define MM_VERSION_MAJOR(x)     VERSION_PART_1(x)
745 #define MM_VERSION_MINOR(x)     VERSION_PART_2(x)
746 #define MM_VERSION_PATCH(x)     VERSION_PART_3(x)
747
748 // file version numbers for resource files (levels, score, setup, etc.)
749 // currently supported/known file version numbers:
750 //      1.4 (still in use)
751 //      2.0 (actual)
752
753 #define MM_FILE_VERSION_1_4     MM_VERSION_IDENT(1,4,0)
754 #define MM_FILE_VERSION_2_0     MM_VERSION_IDENT(2,0,0)
755
756 // file version does not change for every program version, but is changed
757 // when new features are introduced that are incompatible with older file
758 // versions, so that they can be treated accordingly
759 #define MM_FILE_VERSION_ACTUAL  MM_FILE_VERSION_2_0
760
761 #define MM_GAME_VERSION_ACTUAL  MM_VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
762                                                  PROGRAM_VERSION_MINOR, \
763                                                  PROGRAM_VERSION_PATCH)
764
765 #endif  // MM_MAIN_H