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