added optional button to restart game (door, panel and touch variants)
[rocksndiamonds.git] / src / game_mm / mm_main.c
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.c
10 // ============================================================================
11
12 #include "main_mm.h"
13
14 #include "mm_main.h"
15
16
17 struct GameInfo_MM game_mm;
18 struct LevelInfo_MM native_mm_level;
19
20 short           Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
21 short           Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
22 short           Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
23 short           Angle[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
24
25 short           Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
26
27 unsigned int    Elementeigenschaften[MAX_ELEMENTS];
28
29 struct LaserInfo        laser;
30
31 short           LX, LY;
32 short           XS, YS;
33 short           ELX, ELY;
34 short           CT, Ct;
35
36 int             dSX, dSY;
37 int             cSX, cSY;
38 int             cSX2, cSY2;
39 int             cFX, cFY;
40
41 Pixel           pen_fg, pen_bg, pen_ray, pen_magicolor[2];
42 int             color_status;
43
44 struct XY       Step[16] =
45 {
46   {  1,  0 },
47   {  2, -1 },
48   {  1, -1 },
49   {  1, -2 },
50   {  0, -1 },
51   { -1, -2 },
52   { -1, -1 },
53   { -2, -1 },
54   { -1,  0 },
55   { -2,  1 },
56   { -1,  1 },
57   { -1,  2 },
58   {  0,  1 },
59   {  1,  2 },
60   {  1,  1 },
61   {  2,  1 }
62 };
63
64 /* "Sign" has the following structure:
65
66    each 4-bit-value represents the values d*8 + c*4 + b*2 + a*1
67    at the pixel positions
68
69    a b     1 2
70    c d     4 8
71
72    so the value "0xA" (=> (d=1)*8 + (c=0)*4 + (b=1)*2 + (a=0)*1)
73    would result in the pixel pattern
74
75    0 1        _ x
76    0 1    or  _ x
77
78    x x    x x    x x    x x    x x
79    x _    x x    _ _    x x    _ x
80       6                      2
81    x x     5      4      3     x x
82    x x  7                   1  x x
83
84    x _                         _ x
85    x _  8                   0  _ x
86
87    x x  9                  15  x x
88    x x     11    12     13     x x
89       10                     14
90    x _    x x    _ _    x x    _ x
91    x x    x x    x x    x x    x x
92
93  */
94
95 short Sign[16] =
96 {
97   0xA, 0xF, 0xB, 0xF,
98   0x3, 0xF, 0x7, 0xF,
99   0x5, 0xF, 0xD, 0xF,
100   0xC, 0xF, 0xE, 0xF
101 };
102
103 char *element_info_mm[] =
104 {
105   "empty space",                                // 0
106   "mirror (0\xb0)",
107   "mirror (11.25\xb0)",
108   "mirror (22.5\xb0)",
109   "mirror (33.75\xb0)",
110   "mirror (45\xb0)",
111   "mirror (56.25\xb0)",
112   "mirror (67.5\xb0)",
113   "mirror (78.75\xb0)",
114   "mirror (90\xb0)",
115   "mirror (101.25\xb0)",                        // 10
116   "mirror (112.5\xb0)",
117   "mirror (123.75\xb0)",
118   "mirror (135\xb0)",
119   "mirror (146.25\xb0)",
120   "mirror (157.5\xb0)",
121   "mirror (168.75\xb0)",
122   "fixed steel polarizer (0\xb0)",
123   "fixed steel polarizer (90\xb0)",
124   "fixed steel polarizer (45\xb0)",
125   "fixed steel polarizer (135\xb0)",            // 20
126   "Gregor McDuffin (looking right)",
127   "Gregor McDuffin (looking up)",
128   "Gregor McDuffin (looking left)",
129   "Gregor McDuffin (looking down)",
130   "closed exit",
131   "opening exit",
132   "opening exit",
133   "open exit",
134   "magic kettle",
135   "bomb",                                       // 30
136   "prism",
137   "steel wall",
138   "steel wall",
139   "steel wall",
140   "steel wall",
141   "steel wall",
142   "steel wall",
143   "steel wall",
144   "steel wall",
145   "steel wall",                                 // 40
146   "steel wall",
147   "steel wall",
148   "steel wall",
149   "steel wall",
150   "steel wall",
151   "steel wall",
152   "steel wall",
153   "wooden wall",
154   "wooden wall",
155   "wooden wall",                                // 50
156   "wooden wall",
157   "wooden wall",
158   "wooden wall",
159   "wooden wall",
160   "wooden wall",
161   "wooden wall",
162   "wooden wall",
163   "wooden wall",
164   "wooden wall",
165   "wooden wall",                                // 60
166   "wooden wall",
167   "wooden wall",
168   "wooden wall",
169   "ice wall",
170   "ice wall",
171   "ice wall",
172   "ice wall",
173   "ice wall",
174   "ice wall",
175   "ice wall",                                   // 70
176   "ice wall",
177   "ice wall",
178   "ice wall",
179   "ice wall",
180   "ice wall",
181   "ice wall",
182   "ice wall",
183   "ice wall",
184   "ice wall",
185   "amoeba wall",                                // 80
186   "amoeba wall",
187   "amoeba wall",
188   "amoeba wall",
189   "amoeba wall",
190   "amoeba wall",
191   "amoeba wall",
192   "amoeba wall",
193   "amoeba wall",
194   "amoeba wall",
195   "amoeba wall",                                // 90
196   "amoeba wall",
197   "amoeba wall",
198   "amoeba wall",
199   "amoeba wall",
200   "amoeba wall",
201   "wooden block",
202   "gray ball",
203   "teleporter (0\xb0)",
204   "teleporter (22.5\xb0)",
205   "teleporter (45\xb0)",                        // 100
206   "teleporter (67.5\xb0)",
207   "teleporter (90\xb0)",
208   "teleporter (112.5\xb0)",
209   "teleporter (135\xb0)",
210   "teleporter (157.5\xb0)",
211   "teleporter (180\xb0)",
212   "teleporter (202.5\xb0)",
213   "teleporter (225\xb0)",
214   "teleporter (247.5\xb0)",
215   "teleporter (270\xb0)",                       // 110
216   "teleporter (292.5\xb0)",
217   "teleporter (315\xb0)",
218   "teleporter (337.5\xb0)",
219   "fuse",
220   "pac man (starts moving right)",
221   "pac man (starts moving up)",
222   "pac man (starts moving left)",
223   "pac man (starts moving down)",
224   "polarizer (0\xb0)",
225   "polarizer (11.25\xb0)",                      // 120
226   "polarizer (22.5\xb0)",
227   "polarizer (33.75\xb0)",
228   "polarizer (45\xb0)",
229   "polarizer (56.25\xb0)",
230   "polarizer (67.5\xb0)",
231   "polarizer (78.75\xb0)",
232   "polarizer (90\xb0)",
233   "polarizer (101.25\xb0)",
234   "polarizer (112.5\xb0)",
235   "polarizer (123.75\xb0)",                     // 130
236   "polarizer (135\xb0)",
237   "polarizer (146.25\xb0)",
238   "polarizer (157.5\xb0)",
239   "polarizer (168.75\xb0)",
240   "two-way polarizer (0\xb0)",
241   "two-way polarizer (22.5\xb0)",
242   "two-way polarizer (45\xb0)",
243   "two-way polarizer (67.5\xb0)",
244   "fixed mirror (0\xb0)",
245   "fixed mirror (45\xb0)",                      // 140
246   "fixed mirror (90\xb0)",
247   "fixed mirror (135\xb0)",
248   "reflecting stone lock",
249   "key",
250   "light bulb (dark)",
251   "light bulb (glowing)",
252   "bonus ball",
253   "reflecting stone block",
254   "wooden lock",
255   "extra energy ball (full)",                   // 150
256   "fixed wooden polarizer (0\xb0)",
257   "fixed wooden polarizer (90\xb0)",
258   "fixed wooden polarizer (45\xb0)",
259   "fixed wooden polarizer (135\xb0)",
260   "extra energy ball (empty)",
261   "unused",
262   "unused",
263   "unused",
264   "unused",
265   "letter ' '",                                 // 160
266   "letter '!'",
267   "letter '\"'",
268   "letter '#'",
269   "letter '$'",
270   "letter '%'",
271   "letter '&'",
272   "letter '''",
273   "letter '('",
274   "letter ')'",
275   "letter '*'",                                 // 170
276   "letter '+'",
277   "letter ','",
278   "letter '-'",
279   "letter '.'",
280   "letter '/'",
281   "letter '0'",
282   "letter '1'",
283   "letter '2'",
284   "letter '3'",
285   "letter '4'",                                 // 180
286   "letter '5'",
287   "letter '6'",
288   "letter '7'",
289   "letter '8'",
290   "letter '9'",
291   "letter ':'",
292   "letter ';'",
293   "letter '<'",
294   "letter '='",
295   "letter '>'",                                 // 190
296   "letter '?'",
297   "letter '@'",
298   "letter 'A'",
299   "letter 'B'",
300   "letter 'C'",
301   "letter 'D'",
302   "letter 'E'",
303   "letter 'F'",
304   "letter 'G'",
305   "letter 'H'",                                 // 200
306   "letter 'I'",
307   "letter 'J'",
308   "letter 'K'",
309   "letter 'L'",
310   "letter 'M'",
311   "letter 'N'",
312   "letter 'O'",
313   "letter 'P'",
314   "letter 'Q'",
315   "letter 'R'",                                 // 210
316   "letter 'S'",
317   "letter 'T'",
318   "letter 'U'",
319   "letter 'V'",
320   "letter 'W'",
321   "letter 'X'",
322   "letter 'Y'",
323   "letter 'Z'",
324   "letter '\xc4'",
325   "letter '\xd6'",                              // 220
326   "letter '\xdc'",
327   "letter '^'",
328   "letter ''",
329   "letter ''",
330   "letter ''",
331   "letter ''",
332   "letter ''",
333   "letter ''",
334   "letter ''",
335   "letter ''",                                  // 230
336   "letter ''",
337   "letter ''",
338   "letter ''",
339   "letter ''",
340   "letter ''",
341   "letter ''",
342   "letter ''",
343   "letter ''",
344   "letter ''",
345   "mirror (0\xb0)",                             // 240
346   "mirror (11.25\xb0)",
347   "mirror (22.5\xb0)",
348   "mirror (33.75\xb0)",
349   "mirror (45\xb0)",
350   "mirror (56.25\xb0)",
351   "mirror (67.5\xb0)",
352   "mirror (78.75\xb0)",
353   "mirror (90\xb0)",
354   "mirror (101.25\xb0)",
355   "mirror (112.5\xb0)",                         // 250
356   "mirror (123.75\xb0)",
357   "mirror (135\xb0)",
358   "mirror (146.25\xb0)",
359   "mirror (157.5\xb0)",
360   "mirror (168.75\xb0)",
361   "fixed wooden polarizer (0\xb0)",
362   "fixed wooden polarizer (22.5\xb0)",
363   "fixed wooden polarizer (45\xb0)",
364   "fixed wooden polarizer (67.5\xb0)",
365   "fixed wooden polarizer (90\xb0)",            // 260
366   "fixed wooden polarizer (112.5\xb0)",
367   "fixed wooden polarizer (135\xb0)",
368   "fixed wooden polarizer (157.5\xb0)",
369   "fixed steel polarizer (0\xb0)",
370   "fixed steel polarizer (22.5\xb0)",
371   "fixed steel polarizer (45\xb0)",
372   "fixed steel polarizer (67.5\xb0)",
373   "fixed steel polarizer (90\xb0)",
374   "fixed steel polarizer (112.5\xb0)",
375   "fixed steel polarizer (135\xb0)",            // 270
376   "fixed steel polarizer (157.5\xb0)",
377   "deflektor style wooden wall",
378   "deflektor style wooden wall",
379   "deflektor style wooden wall",
380   "deflektor style wooden wall",
381   "deflektor style wooden wall",
382   "deflektor style wooden wall",
383   "deflektor style wooden wall",
384   "deflektor style wooden wall",
385   "deflektor style wooden wall",                // 280
386   "deflektor style wooden wall",
387   "deflektor style wooden wall",
388   "deflektor style wooden wall",
389   "deflektor style wooden wall",
390   "deflektor style wooden wall",
391   "deflektor style wooden wall",
392   "deflektor style wooden wall",
393   "deflektor style steel wall",
394   "deflektor style steel wall",
395   "deflektor style steel wall",                 // 290
396   "deflektor style steel wall",
397   "deflektor style steel wall",
398   "deflektor style steel wall",
399   "deflektor style steel wall",
400   "deflektor style steel wall",
401   "deflektor style steel wall",
402   "deflektor style steel wall",
403   "deflektor style steel wall",
404   "deflektor style steel wall",
405   "deflektor style steel wall",                 // 300
406   "deflektor style steel wall",
407   "deflektor style steel wall",
408   "deflektor style steel wall",
409   "empty space",
410   "cell",
411   "mine",
412   "refractor",
413   "laser cannon (shooting right)",
414   "laser cannon (shooting up)",
415   "laser cannon (shooting left)",               // 310
416   "laser cannon (shooting down)",
417   "laser receiver (directed right)",
418   "laser receiver (directed up)",
419   "laser receiver (directed left)",
420   "laser receiver (directed down)",
421   "fibre optic (1a)",
422   "fibre optic (1b)",
423   "fibre optic (2a)",
424   "fibre optic (2b)",
425   "fibre optic (3a)",                           // 320
426   "fibre optic (3b)",
427   "fibre optic (4a)",
428   "fibre optic (4b)",
429   "rotating mirror (0\xb0)",
430   "rotating mirror (11.25\xb0)",
431   "rotating mirror (22.5\xb0)",
432   "rotating mirror (33.75\xb0)",
433   "rotating mirror (45\xb0)",
434   "rotating mirror (56.25\xb0)",
435   "rotating mirror (67.5\xb0)",                 // 330
436   "rotating mirror (78.75\xb0)",
437   "rotating mirror (90\xb0)",
438   "rotating mirror (101.25\xb0)",
439   "rotating mirror (112.5\xb0)",
440   "rotating mirror (123.75\xb0)",
441   "rotating mirror (135\xb0)",
442   "rotating mirror (146.25\xb0)",
443   "rotating mirror (157.5\xb0)",
444   "rotating mirror (168.75\xb0)",
445   "rotating wooden polarizer (0\xb0)",          // 340
446   "rotating wooden polarizer (22.5\xb0)",
447   "rotating wooden polarizer (45\xb0)",
448   "rotating wooden polarizer (67.5\xb0)",
449   "rotating wooden polarizer (90\xb0)",
450   "rotating wooden polarizer (112.5\xb0)",
451   "rotating wooden polarizer (135\xb0)",
452   "rotating wooden polarizer (157.5\xb0)",
453   "rotating steel polarizer (0\xb0)",
454   "rotating steel polarizer (22.5\xb0)",
455   "rotating steel polarizer (45\xb0)",          // 350
456   "rotating steel polarizer (67.5\xb0)",
457   "rotating steel polarizer (90\xb0)",
458   "rotating steel polarizer (112.5\xb0)",
459   "rotating steel polarizer (135\xb0)",
460   "rotating steel polarizer (157.5\xb0)",
461   "red teleporter (0\xb0)",
462   "red teleporter (22.5\xb0)",
463   "red teleporter (45\xb0)",
464   "red teleporter (67.5\xb0)",
465   "red teleporter (90\xb0)",                    // 360
466   "red teleporter (112.5\xb0)",
467   "red teleporter (135\xb0)",
468   "red teleporter (157.5\xb0)",
469   "red teleporter (180\xb0)",
470   "red teleporter (202.5\xb0)",
471   "red teleporter (225\xb0)",
472   "red teleporter (247.5\xb0)",
473   "red teleporter (270\xb0)",
474   "red teleporter (292.5\xb0)",
475   "red teleporter (315\xb0)",                   // 370
476   "red teleporter (337.5\xb0)",
477   "yellow teleporter (0\xb0)",
478   "yellow teleporter (22.5\xb0)",
479   "yellow teleporter (45\xb0)",
480   "yellow teleporter (67.5\xb0)",
481   "yellow teleporter (90\xb0)",
482   "yellow teleporter (112.5\xb0)",
483   "yellow teleporter (135\xb0)",
484   "yellow teleporter (157.5\xb0)",
485   "yellow teleporter (180\xb0)",                // 380
486   "yellow teleporter (202.5\xb0)",
487   "yellow teleporter (225\xb0)",
488   "yellow teleporter (247.5\xb0)",
489   "yellow teleporter (270\xb0)",
490   "yellow teleporter (292.5\xb0)",
491   "yellow teleporter (315\xb0)",
492   "yellow teleporter (337.5\xb0)",
493   "green teleporter (0\xb0)",
494   "green teleporter (22.5\xb0)",
495   "green teleporter (45\xb0)",                  // 390
496   "green teleporter (67.5\xb0)",
497   "green teleporter (90\xb0)",
498   "green teleporter (112.5\xb0)",
499   "green teleporter (135\xb0)",
500   "green teleporter (157.5\xb0)",
501   "green teleporter (180\xb0)",
502   "green teleporter (202.5\xb0)",
503   "green teleporter (225\xb0)",
504   "green teleporter (247.5\xb0)",
505   "green teleporter (270\xb0)",                 // 400
506   "green teleporter (292.5\xb0)",
507   "green teleporter (315\xb0)",
508   "green teleporter (337.5\xb0)",
509   "blue teleporter (0\xb0)",
510   "blue teleporter (22.5\xb0)",
511   "blue teleporter (45\xb0)",
512   "blue teleporter (67.5\xb0)",
513   "blue teleporter (90\xb0)",
514   "blue teleporter (112.5\xb0)",
515   "blue teleporter (135\xb0)",                  // 410
516   "blue teleporter (157.5\xb0)",
517   "blue teleporter (180\xb0)",
518   "blue teleporter (202.5\xb0)",
519   "blue teleporter (225\xb0)",
520   "blue teleporter (247.5\xb0)",
521   "blue teleporter (270\xb0)",
522   "blue teleporter (292.5\xb0)",
523   "blue teleporter (315\xb0)",
524   "blue teleporter (337.5\xb0)",
525   "unknown",                                    // 420
526
527   /*
528   "-------------------------------",
529   */
530 };
531 int num_element_info_mm = sizeof(element_info_mm) / sizeof(char *);