added and adjusted source files for Mirror Magic game engine
[rocksndiamonds.git] / src / game_mm / mm_main.c
diff --git a/src/game_mm/mm_main.c b/src/game_mm/mm_main.c
new file mode 100644 (file)
index 0000000..44ca0ad
--- /dev/null
@@ -0,0 +1,520 @@
+// ============================================================================
+// Mirror Magic -- McDuffin's Revenge
+// ----------------------------------------------------------------------------
+// (c) 1994-2017 by Artsoft Entertainment
+//                         Holger Schemel
+//                 info@artsoft.org
+//                 http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// mm_main.c
+// ============================================================================
+
+#include "main_mm.h"
+
+#include "mm_main.h"
+
+
+struct GameInfo_MM game_mm;
+struct LevelInfo_MM native_mm_level;
+
+short          Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short          Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short          Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short          Angle[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
+unsigned int   Elementeigenschaften[MAX_ELEMENTS];
+
+short          LX,LY, XS,YS, ELX,ELY;
+short          CT,Ct;
+
+Pixel          pen_fg, pen_bg, pen_ray, pen_magicolor[2];
+int            color_status;
+
+struct XY      Step[16] =
+{
+  {  1,  0 },
+  {  2, -1 },
+  {  1, -1 },
+  {  1, -2 },
+  {  0, -1 },
+  { -1, -2 },
+  { -1, -1 },
+  { -2, -1 },
+  { -1,  0 },
+  { -2,  1 },
+  { -1,  1 },
+  { -1,  2 },
+  {  0,  1 },
+  {  1,  2 },
+  {  1,  1 },
+  {  2,  1 }
+};
+
+/* "Sign" has the following structure:
+
+   each 4-bit-value represents the values d*8 + c*4 + b*2 + a*1
+   at the pixel positions
+
+   a b     1 2
+   c d     4 8
+
+   so the value "0xA" (=> (d=1)*8 + (c=0)*4 + (b=1)*2 + (a=0)*1)
+   would result in the pixel pattern
+
+   0 1        _ x
+   0 1    or  _ x
+
+   x x    x x    x x    x x    x x
+   x _    x x    _ _    x x    _ x
+      6                      2
+   x x     5      4      3     x x
+   x x  7                   1  x x
+
+   x _                         _ x
+   x _  8                   0  _ x
+
+   x x  9                  15  x x
+   x x     11    12     13     x x
+      10                     14
+   x _    x x    _ _    x x    _ x
+   x x    x x    x x    x x    x x
+
+ */
+
+short Sign[16] =
+{
+  0xA,0xF,0xB,0xF,
+  0x3,0xF,0x7,0xF,
+  0x5,0xF,0xD,0xF,
+  0xC,0xF,0xE,0xF
+};
+
+char *element_info_mm[] =
+{
+  "empty space",                               /* 0 */
+  "mirror (0\xb0)",
+  "mirror (11.25\xb0)",
+  "mirror (22.5\xb0)",
+  "mirror (33.75\xb0)",
+  "mirror (45\xb0)",
+  "mirror (56.25\xb0)",
+  "mirror (67.5\xb0)",
+  "mirror (78.75\xb0)",
+  "mirror (90\xb0)",
+  "mirror (101.25\xb0)",                       /* 10 */
+  "mirror (112.5\xb0)",
+  "mirror (123.75\xb0)",
+  "mirror (135\xb0)",
+  "mirror (146.25\xb0)",
+  "mirror (157.5\xb0)",
+  "mirror (168.75\xb0)",
+  "fixed steel polarisator (0\xb0)",
+  "fixed steel polarisator (90\xb0)",
+  "fixed steel polarisator (45\xb0)",
+  "fixed steel polarisator (135\xb0)",         /* 20 */
+  "Gregor McDuffin (looking right)",
+  "Gregor McDuffin (looking up)",
+  "Gregor McDuffin (looking left)",
+  "Gregor McDuffin (looking down)",
+  "closed exit",
+  "opening exit",
+  "opening exit",
+  "open exit",
+  "magic kettle",
+  "bomb",                                      /* 30 */
+  "prism",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",                                        /* 40 */
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",                               /* 50 */
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",                               /* 60 */
+  "wooden wall",
+  "wooden wall",
+  "wooden wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",                                  /* 70 */
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "ice wall",
+  "amoeba wall",                               /* 80 */
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",                               /* 90 */
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "amoeba wall",
+  "wooden block",
+  "gray ball",
+  "beamer (0\xb0)",
+  "beamer (22.5\xb0)",
+  "beamer (45\xb0)",                           /* 100 */
+  "beamer (67.5\xb0)",
+  "beamer (90\xb0)",
+  "beamer (112.5\xb0)",
+  "beamer (135\xb0)",
+  "beamer (157.5\xb0)",
+  "beamer (180\xb0)",
+  "beamer (202.5\xb0)",
+  "beamer (225\xb0)",
+  "beamer (247.5\xb0)",
+  "beamer (270\xb0)",                          /* 110 */
+  "beamer (292.5\xb0)",
+  "beamer (315\xb0)",
+  "beamer (337.5\xb0)",
+  "fuse",
+  "pac man (starts moving right)",
+  "pac man (starts moving up)",
+  "pac man (starts moving left)",
+  "pac man (starts moving down)",
+  "polarisator (0\xb0)",
+  "polarisator (11.25\xb0)",                   /* 120 */
+  "polarisator (22.5\xb0)",
+  "polarisator (33.75\xb0)",
+  "polarisator (45\xb0)",
+  "polarisator (56.25\xb0)",
+  "polarisator (67.5\xb0)",
+  "polarisator (78.75\xb0)",
+  "polarisator (90\xb0)",
+  "polarisator (101.25\xb0)",
+  "polarisator (112.5\xb0)",
+  "polarisator (123.75\xb0)",                  /* 130 */
+  "polarisator (135\xb0)",
+  "polarisator (146.25\xb0)",
+  "polarisator (157.5\xb0)",
+  "polarisator (168.75\xb0)",
+  "two-way polarisator (0\xb0)",
+  "two-way polarisator (22.5\xb0)",
+  "two-way polarisator (45\xb0)",
+  "two-way polarisator (67.5\xb0)",
+  "fixed mirror (0\xb0)",
+  "fixed mirror (45\xb0)",                     /* 140 */
+  "fixed mirror (90\xb0)",
+  "fixed mirror (135\xb0)",
+  "reflecting stone lock",
+  "key",
+  "light bulb (dark)",
+  "ligh bulb (glowing)",
+  "bonus ball",
+  "reflecting stone block",
+  "wooden lock",
+  "extra energy ball (full)",                  /* 150 */
+  "fixed wooden polarisator (0\xb0)",
+  "fixed wooden polarisator (90\xb0)",
+  "fixed wooden polarisator (45\xb0)",
+  "fixed wooden polarisator (135\xb0)",
+  "extra energy ball (empty)",
+  "unused",
+  "unused",
+  "unused",
+  "unused",
+  "letter ' '",                                        /* 160 */
+  "letter '!'",
+  "letter '\"'",
+  "letter '#'",
+  "letter '$'",
+  "letter '%'",
+  "letter '&'",
+  "letter '''",
+  "letter '('",
+  "letter ')'",
+  "letter '*'",                                        /* 170 */
+  "letter '+'",
+  "letter ','",
+  "letter '-'",
+  "letter '.'",
+  "letter '/'",
+  "letter '0'",
+  "letter '1'",
+  "letter '2'",
+  "letter '3'",
+  "letter '4'",                                        /* 180 */
+  "letter '5'",
+  "letter '6'",
+  "letter '7'",
+  "letter '8'",
+  "letter '9'",
+  "letter ':'",
+  "letter ';'",
+  "letter '<'",
+  "letter '='",
+  "letter '>'",                                        /* 190 */
+  "letter '?'",
+  "letter '@'",
+  "letter 'A'",
+  "letter 'B'",
+  "letter 'C'",
+  "letter 'D'",
+  "letter 'E'",
+  "letter 'F'",
+  "letter 'G'",
+  "letter 'H'",                                        /* 200 */
+  "letter 'I'",
+  "letter 'J'",
+  "letter 'K'",
+  "letter 'L'",
+  "letter 'M'",
+  "letter 'N'",
+  "letter 'O'",
+  "letter 'P'",
+  "letter 'Q'",
+  "letter 'R'",                                        /* 210 */
+  "letter 'S'",
+  "letter 'T'",
+  "letter 'U'",
+  "letter 'V'",
+  "letter 'W'",
+  "letter 'X'",
+  "letter 'Y'",
+  "letter 'Z'",
+  "letter '\xc4'",
+  "letter '\xd6'",                             /* 220 */
+  "letter '\xdc'",
+  "letter '^'",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",                                 /* 230 */
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "letter ''",
+  "mirror (0\xb0)",                            /* 240 */
+  "mirror (11.25\xb0)",
+  "mirror (22.5\xb0)",
+  "mirror (33.75\xb0)",
+  "mirror (45\xb0)",
+  "mirror (56.25\xb0)",
+  "mirror (67.5\xb0)",
+  "mirror (78.75\xb0)",
+  "mirror (90\xb0)",
+  "mirror (101.25\xb0)",
+  "mirror (112.5\xb0)",                                /* 250 */
+  "mirror (123.75\xb0)",
+  "mirror (135\xb0)",
+  "mirror (146.25\xb0)",
+  "mirror (157.5\xb0)",
+  "mirror (168.75\xb0)",
+  "fixed wooden polarisator (0\xb0)",
+  "fixed wooden polarisator (22.5\xb0)",
+  "fixed wooden polarisator (45\xb0)",
+  "fixed wooden polarisator (67.5\xb0)",
+  "fixed wooden polarisator (90\xb0)",         /* 260 */
+  "fixed wooden polarisator (112.5\xb0)",
+  "fixed wooden polarisator (135\xb0)",
+  "fixed wooden polarisator (157.5\xb0)",
+  "fixed steel polarisator (0\xb0)",
+  "fixed steel polarisator (22.5\xb0)",
+  "fixed steel polarisator (45\xb0)",
+  "fixed steel polarisator (67.5\xb0)",
+  "fixed steel polarisator (90\xb0)",
+  "fixed steel polarisator (112.5\xb0)",
+  "fixed steel polarisator (135\xb0)",         /* 270 */
+  "fixed steel polarisator (157.5\xb0)",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",               /* 280 */
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style wooden wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",                        /* 290 */
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",                        /* 300 */
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "deflektor style steel wall",
+  "empty space",
+  "cell",
+  "mine",
+  "refractor",
+  "laser cannon (shooting right)",
+  "laser cannon (shooting up)",
+  "laser cannon (shooting left)",              /* 310 */
+  "laser cannon (shooting down)",
+  "laser receiver (directed right)",
+  "laser receiver (directed up)",
+  "laser receiver (directed left)",
+  "laser receiver (directed down)",
+  "fibre optic (1a)",
+  "fibre optic (1b)",
+  "fibre optic (2a)",
+  "fibre optic (2b)",
+  "fibre optic (3a)",                          /* 320 */
+  "fibre optic (3b)",
+  "fibre optic (4a)",
+  "fibre optic (4b)",
+  "rotating mirror (0\xb0)",
+  "rotating mirror (11.25\xb0)",
+  "rotating mirror (22.5\xb0)",
+  "rotating mirror (33.75\xb0)",
+  "rotating mirror (45\xb0)",
+  "rotating mirror (56.25\xb0)",
+  "rotating mirror (67.5\xb0)",                        /* 330 */
+  "rotating mirror (78.75\xb0)",
+  "rotating mirror (90\xb0)",
+  "rotating mirror (101.25\xb0)",
+  "rotating mirror (112.5\xb0)",
+  "rotating mirror (123.75\xb0)",
+  "rotating mirror (135\xb0)",
+  "rotating mirror (146.25\xb0)",
+  "rotating mirror (157.5\xb0)",
+  "rotating mirror (168.75\xb0)",
+  "rotating wooden polarisator (0\xb0)",       /* 340 */
+  "rotating wooden polarisator (22.5\xb0)",
+  "rotating wooden polarisator (45\xb0)",
+  "rotating wooden polarisator (67.5\xb0)",
+  "rotating wooden polarisator (90\xb0)",
+  "rotating wooden polarisator (112.5\xb0)",
+  "rotating wooden polarisator (135\xb0)",
+  "rotating wooden polarisator (157.5\xb0)",
+  "rotating steel polarisator (0\xb0)",
+  "rotating steel polarisator (22.5\xb0)",
+  "rotating steel polarisator (45\xb0)",       /* 350 */
+  "rotating steel polarisator (67.5\xb0)",
+  "rotating steel polarisator (90\xb0)",
+  "rotating steel polarisator (112.5\xb0)",
+  "rotating steel polarisator (135\xb0)",
+  "rotating steel polarisator (157.5\xb0)",
+  "red beamer (0\xb0)",
+  "red beamer (22.5\xb0)",
+  "red beamer (45\xb0)",
+  "red beamer (67.5\xb0)",
+  "red beamer (90\xb0)",                       /* 360 */
+  "red beamer (112.5\xb0)",
+  "red beamer (135\xb0)",
+  "red beamer (157.5\xb0)",
+  "red beamer (180\xb0)",
+  "red beamer (202.5\xb0)",
+  "red beamer (225\xb0)",
+  "red beamer (247.5\xb0)",
+  "red beamer (270\xb0)",
+  "red beamer (292.5\xb0)",
+  "red beamer (315\xb0)",                      /* 370 */
+  "red beamer (337.5\xb0)",
+  "yellow beamer (0\xb0)",
+  "yellow beamer (22.5\xb0)",
+  "yellow beamer (45\xb0)",
+  "yellow beamer (67.5\xb0)",
+  "yellow beamer (90\xb0)",
+  "yellow beamer (112.5\xb0)",
+  "yellow beamer (135\xb0)",
+  "yellow beamer (157.5\xb0)",
+  "yellow beamer (180\xb0)",                   /* 380 */
+  "yellow beamer (202.5\xb0)",
+  "yellow beamer (225\xb0)",
+  "yellow beamer (247.5\xb0)",
+  "yellow beamer (270\xb0)",
+  "yellow beamer (292.5\xb0)",
+  "yellow beamer (315\xb0)",
+  "yellow beamer (337.5\xb0)",
+  "green beamer (0\xb0)",
+  "green beamer (22.5\xb0)",
+  "green beamer (45\xb0)",                     /* 390 */
+  "green beamer (67.5\xb0)",
+  "green beamer (90\xb0)",
+  "green beamer (112.5\xb0)",
+  "green beamer (135\xb0)",
+  "green beamer (157.5\xb0)",
+  "green beamer (180\xb0)",
+  "green beamer (202.5\xb0)",
+  "green beamer (225\xb0)",
+  "green beamer (247.5\xb0)",
+  "green beamer (270\xb0)",                    /* 400 */
+  "green beamer (292.5\xb0)",
+  "green beamer (315\xb0)",
+  "green beamer (337.5\xb0)",
+  "blue beamer (0\xb0)",
+  "blue beamer (22.5\xb0)",
+  "blue beamer (45\xb0)",
+  "blue beamer (67.5\xb0)",
+  "blue beamer (90\xb0)",
+  "blue beamer (112.5\xb0)",
+  "blue beamer (135\xb0)",                     /* 410 */
+  "blue beamer (157.5\xb0)",
+  "blue beamer (180\xb0)",
+  "blue beamer (202.5\xb0)",
+  "blue beamer (225\xb0)",
+  "blue beamer (247.5\xb0)",
+  "blue beamer (270\xb0)",
+  "blue beamer (292.5\xb0)",
+  "blue beamer (315\xb0)",
+  "blue beamer (337.5\xb0)",
+  "unknown",                                   /* 420 */
+
+  /*
+  "-------------------------------",
+  */
+};
+int num_element_info_mm = sizeof(element_info_mm)/sizeof(char *);