// (c) 1994-2017 by Artsoft Entertainment
// Holger Schemel
// info@artsoft.org
-// http://www.artsoft.org/
+// https://www.artsoft.org/
// ----------------------------------------------------------------------------
// mm_main.h
// ============================================================================
#define SCREENY(a) (a)
#define LEVELX(a) (a)
#define LEVELY(a) (a)
-#define IN_VIS_FIELD(x,y) ((x)>=0 && (x)<SCR_FIELDX && (y)>=0 &&(y)<SCR_FIELDY)
-#define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
-#define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
-#define IN_PIX_FIELD(x,y) ((x)>=0 && (x)<SXSIZE && (y)>=0 && (y)<SYSIZE)
-/* values for 'Elementeigenschaften' */
+#define IN_FIELD(x, y, xsize, ysize) ((x) >= 0 && (x) < (xsize) && \
+ (y) >= 0 && (y) < (ysize))
+#define IN_FIELD_MINMAX(x, y, xmin, ymin, xmax, ymax) \
+ ((x) >= (xmin) && (x) <= (xmax) && \
+ (y) >= (ymin) && (y) <= (ymax))
+
+#define IN_PIX_FIELD(x, y) IN_FIELD(x, y, SXSIZE, SYSIZE)
+#define IN_VIS_FIELD(x, y) IN_FIELD(x, y, SCR_FIELDX, SCR_FIELDY)
+#define IN_LEV_FIELD(x, y) IN_FIELD(x, y, lev_fieldx, lev_fieldy)
+#define IN_SCR_FIELD(x, y) IN_FIELD_MINMAX(x, y, BX1, BY1, BX2, BY2)
+
+// values for 'Elementeigenschaften'
#define EP_BIT_GRID (1 << 0)
#define EP_BIT_MCDUFFIN (1 << 1)
#define EP_BIT_RECTANGLE (1 << 2)
#define EP_BIT_INACTIVE (1 << 11)
#define EP_BIT_WALL (1 << 12)
#define EP_BIT_PACMAN (1 << 13)
+#define EP_BIT_ENVELOPE (1 << 14)
#define IS_GRID(e) (Elementeigenschaften[e] & EP_BIT_GRID)
#define IS_MCDUFFIN(e) (Elementeigenschaften[e] & EP_BIT_MCDUFFIN)
#define IS_INACTIVE(e) (Elementeigenschaften[e] & EP_BIT_INACTIVE)
#define IS_MM_WALL(e) (Elementeigenschaften[e] & EP_BIT_WALL)
#define IS_PACMAN(e) (Elementeigenschaften[e] & EP_BIT_PACMAN)
+#define IS_ENVELOPE(e) (Elementeigenschaften[e] & EP_BIT_ENVELOPE)
#define IS_WALL_STEEL(e) ((e) >= EL_WALL_STEEL_START && \
(e) <= EL_WALL_STEEL_END)
(e) == EL_BOMB || \
IS_WALL_AMOEBA(e))
+#define IS_ABSORBING_BLOCK(e) (IS_WALL_WOOD(e) || \
+ IS_DF_WALL_WOOD(e) || \
+ (e) == EL_BLOCK_WOOD || \
+ (e) == EL_GATE_WOOD || \
+ (e) == EL_EXIT_CLOSED || \
+ (e) == EL_EXIT_OPEN)
+
+#define IS_ENVELOPE_OPENING(e) ((e) >= EL_ENVELOPE_OPENING_START && \
+ (e) <= EL_ENVELOPE_OPENING_END)
+
+#define ENVELOPE_NR(e) ((e) - EL_ENVELOPE_1)
+#define ENVELOPE_OPENING_NR(e) ((e) - EL_ENVELOPE_1_OPENING)
+
#define CAN_MOVE(e) ((e) == EL_PACMAN)
-#define IS_FREE(x,y) (Feld[x][y] == EL_EMPTY)
+#define IS_FREE(x,y) (Tile[x][y] == EL_EMPTY)
#define IS_MOVING(x,y) (MovPos[x][y] != 0)
-#define IS_BLOCKED(x,y) (Feld[x][y] == EL_BLOCKED)
+#define IS_BLOCKED(x,y) (Tile[x][y] == EL_BLOCKED)
#define IS_DRAWABLE(e) ((e) < EL_BLOCKED)
#define IS_NOT_DRAWABLE(e) ((e) >= EL_BLOCKED)
#define WALL_BASE(e) ((e) & 0xfff0)
#define WALL_BITS(e) ((e) & 0x000f)
-/* Bitmaps with graphic file */
-#define PIX_BACK 0
-#define PIX_DOOR 1
-#define PIX_TOONS 2
-#define PIX_DF 3
-#define PIX_BIGFONT 4
-#define PIX_SMALLFONT 5
-#define PIX_MEDIUMFONT 6
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR 7
-
-#define NUM_PICTURES 7
-#define NUM_BITMAPS 8
-
-/* boundaries of arrays etc. */
+// boundaries of arrays etc.
#define MAX_PLAYER_NAME_LEN 10
#define MAX_LEVEL_NAME_LEN 32
#define MAX_LEVEL_AUTHOR_LEN 32
#define MAX_SCORE_ENTRIES 100
-#define MAX_ELEMENTS 700 /* 500 static + 200 runtime */
-
-#define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */
-
-#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */
-#define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */
-
-struct HiScore
-{
- char Name[MAX_PLAYER_NAME_LEN + 1];
- int Score;
-};
-
-struct EditorInfo
-{
- boolean draw_walls_masked;
-};
-
-extern Bitmap *pix[];
-extern DrawBuffer *fieldbuffer;
-extern DrawBuffer *drawto_field;
-
-extern int joystick_device;
-extern char *joystick_device_name[];
+#define MAX_ELEMENTS 700 // 500 static + 200 runtime
+
+#define MICROLEVEL_SCROLL_DELAY 50 // delay for scrolling micro level
+#define MICROLEVEL_LABEL_DELAY 250 // delay for micro level label
+
+// score for elements
+#define SC_COLLECTIBLE 0
+#define SC_UNUSED_1 1
+#define SC_UNUSED_2 2
+#define SC_UNUSED_3 3
+#define SC_UNUSED_4 4
+#define SC_UNUSED_5 5
+#define SC_PACMAN 6
+#define SC_UNUSED_7 7
+#define SC_UNUSED_8 8
+#define SC_KEY 9
+#define SC_TIME_BONUS 10
+#define SC_UNUSED_11 11
+#define SC_UNUSED_12 12
+#define SC_UNUSED_13 13
+#define SC_LIGHTBALL 14
+#define SC_UNUSED_15 15
+
+#define LEVEL_SCORE_ELEMENTS 16 // level elements with score
+
+
+extern DrawBuffer *drawto_mm;
+extern DrawBuffer *bitmap_db_field;
extern int game_status;
extern boolean level_editor_test_game;
-extern boolean network_playing;
-
-extern int key_joystick_mapping;
-extern int global_joystick_status, joystick_status;
-extern int sound_status;
-extern boolean sound_loops_allowed;
extern boolean redraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int redraw_x1, redraw_y1;
-extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short Tile[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
+extern short AmoebaCnt[MAX_NUM_AMOEBA];
+extern short AmoebaCnt2[MAX_NUM_AMOEBA];
+extern short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
+extern int GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
extern unsigned int Elementeigenschaften[MAX_ELEMENTS];
extern int level_nr;
-extern int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
+extern int lev_fieldx, lev_fieldy, scroll_x, scroll_y;
-extern int FX,FY, ScrollStepSize;
+extern int FX, FY, ScrollStepSize;
extern int ScreenMovDir, ScreenMovPos, ScreenGfxPos;
extern int GameFrameDelay;
extern int FfwdFrameDelay;
-extern int BX1,BY1, BX2,BY2;
+extern int BX1, BY1, BX2, BY2;
extern int SBX_Left, SBX_Right;
extern int SBY_Upper, SBY_Lower;
-extern int ZX,ZY, ExitX,ExitY;
-extern int AllPlayersGone;
extern int TimeFrames, TimePlayed, TimeLeft;
-extern boolean SiebAktiv;
-extern int SiebCount;
extern struct LevelInfo_MM native_mm_level;
-extern struct HiScore highscore[];
-extern struct TapeInfo tape;
-extern struct SetupInfo setup;
extern struct GameInfo_MM game_mm;
extern struct LaserInfo laser;
-extern struct EditorInfo editor;
-extern struct GlobalInfo global;
-extern short LX,LY, XS,YS, ELX,ELY;
-extern short CT,Ct;
+extern short LX, LY, XS, YS, ELX, ELY;
+extern short CT, Ct;
+
+extern int dSX, dSY;
+extern int cSX, cSY;
+extern int cSX2, cSY2;
+extern int cFX, cFY;
extern Pixel pen_fg, pen_bg, pen_ray, pen_magicolor[2];
extern int color_status;
extern struct XY Step[];
extern short Sign[16];
-extern char *sound_name[];
-extern int background_loop[];
-extern int num_bg_loops;
-extern char *element_info[];
+extern char *element_info[];
extern int num_element_info;
-/* often used screen positions */
-#define SX 8
-#define SY 8
-#define REAL_SX (SX - 2)
-#define REAL_SY (SY - 2)
-#define DX 534
-#define DY 60
-#define EX DX
-#define EY (DY + 178)
-#define TILEX TILESIZE
-#define TILEY TILESIZE
-#define MINI_TILEX (TILEX / 2)
-#define MINI_TILEY (TILEY / 2)
-#define MICRO_TILEX (TILEX / 4)
-#define MICRO_TILEY (TILEY / 4)
-#define MICRO_WALLX (TILEX / 8)
-#define MICRO_WALLY (TILEY / 8)
-#define MIDPOSX (SCR_FIELDX / 2)
-#define MIDPOSY (SCR_FIELDY / 2)
-#define DXSIZE 100
-#define DYSIZE 280
-#define VXSIZE DXSIZE
-#define VYSIZE 100
-#define EXSIZE DXSIZE
-#define EYSIZE (VXSIZE + 44)
-#define FULL_SXSIZE (2 + SXSIZE + 2)
-#define FULL_SYSIZE (2 + SYSIZE + 2)
-#define MICROLEV_XPOS (SX + 12 * TILEX)
-#define MICROLEV_YPOS (SY + 6 * TILEY)
-#define MICROLEV_XSIZE (STD_LEV_FIELDX * MICRO_TILEX)
-#define MICROLEV_YSIZE (STD_LEV_FIELDY * MICRO_TILEY)
-#define MICROLABEL_XPOS (SY)
-#define MICROLABEL_YPOS (SY + 352)
-#define MICROLABEL_XSIZE (SXSIZE)
-#define MICROLABEL_YSIZE (FONT4_YSIZE)
-
-#define GFX_STARTX SX
-#define GFX_STARTY SY
-#define MINI_GFX_STARTX (SX + 8 * TILEX)
-#define MINI_GFX_STARTY (SY + 6 * TILEY)
-#define MICRO_GFX_STARTX (MINI_GFX_STARTX + 8 * MINI_TILEX)
-#define MICRO_GFX_STARTY (MINI_GFX_STARTY + 6 * MINI_TILEY)
-#define GFX_PER_LINE 16
-#define MINI_GFX_PER_LINE GFX_PER_LINE
-#define MICRO_GFX_PER_LINE GFX_PER_LINE
-
-#define MINI_DF_STARTX (8 * TILEX)
-#define MINI_DF_STARTY (8 * TILEY)
-#define MICRO_DF_STARTX (MINI_DF_STARTX + 8 * MINI_TILEX)
-#define MICRO_DF_STARTY (MINI_DF_STARTY + 8 * MINI_TILEY)
-#define DF_PER_LINE 16
-#define MINI_DF_PER_LINE DF_PER_LINE
-#define MICRO_DF_PER_LINE DF_PER_LINE
-
-#define MICRO_FONT_STARTX (MICRO_DF_STARTX + 8 * MICRO_TILEX)
-#define MICRO_FONT_STARTY (MICRO_DF_STARTY + 8 * MICRO_TILEY)
-#define MICRO_FONT_PER_LINE 8
-
-/* wall positions (that can be OR'ed together) */
+// wall positions (that can be OR'ed together)
#define WALL_TOPLEFT 1
#define WALL_TOPRIGHT 2
#define WALL_BOTTOMLEFT 4
#define WALL_TOP (WALL_TOPLEFT | WALL_TOPRIGHT)
#define WALL_BOTTOM (WALL_BOTTOMLEFT | WALL_BOTTOMRIGHT)
-/* game elements:
-** 0 - 499: real elements, stored in level file
-** 500 - 699: flag elements, only used at runtime
-*/
-/* "real" level elements */
+// game elements:
+// 0 - 499: real elements, stored in level file
+// 500 - 699: flag elements, only used at runtime
+
+// "real" level elements
#define EL_MM_START 0
#define EL_MM_START_1 EL_MM_START
#define EL_KETTLE 29
#define EL_BOMB 30
#define EL_PRISM 31
-#define EL_WALL_START 32
-#define EL_WALL_EMPTY EL_WALL_START
-#define EL_WALL_00 EL_WALL_START
-#define EL_WALL_STEEL EL_WALL_00
-#define EL_WALL_STEEL_START EL_WALL_00
-#define EL_WALL_15 47
-#define EL_WALL_STEEL_END EL_WALL_15
-#define EL_WALL_16 48
-#define EL_WALL_WOOD EL_WALL_16
-#define EL_WALL_WOOD_START EL_WALL_16
-#define EL_WALL_31 63
-#define EL_WALL_WOOD_END EL_WALL_31
-#define EL_WALL_32 64
-#define EL_WALL_ICE EL_WALL_32
-#define EL_WALL_ICE_START EL_WALL_32
-#define EL_WALL_47 79
-#define EL_WALL_ICE_END EL_WALL_47
-#define EL_WALL_48 80
-#define EL_WALL_AMOEBA EL_WALL_48
-#define EL_WALL_AMOEBA_START EL_WALL_48
-#define EL_WALL_63 95
-#define EL_WALL_AMOEBA_END EL_WALL_63
-#define EL_WALL_END EL_WALL_63
+#define EL_WALL_START EL_WALL_STEEL_START
+#define EL_WALL_STEEL_BASE 32
+#define EL_WALL_STEEL_START (EL_WALL_STEEL_BASE + 0)
+#define EL_WALL_STEEL_END (EL_WALL_STEEL_BASE + 15)
+#define EL_WALL_WOOD_BASE 48
+#define EL_WALL_WOOD_START (EL_WALL_WOOD_BASE + 0)
+#define EL_WALL_WOOD_END (EL_WALL_WOOD_BASE + 15)
+#define EL_WALL_ICE_BASE 64
+#define EL_WALL_ICE_START (EL_WALL_ICE_BASE + 0)
+#define EL_WALL_ICE_END (EL_WALL_ICE_BASE + 15)
+#define EL_WALL_AMOEBA_BASE 80
+#define EL_WALL_AMOEBA_START (EL_WALL_AMOEBA_BASE + 0)
+#define EL_WALL_AMOEBA_END (EL_WALL_AMOEBA_BASE + 15)
+#define EL_WALL_END EL_WALL_AMOEBA_END
#define EL_BLOCK_WOOD 96
-#define EL_BALL_GRAY 97
+#define EL_GRAY_BALL 97
#define EL_BEAMER_START 98
#define EL_BEAMER_00 (EL_BEAMER_START + 0)
#define EL_BEAMER_01 (EL_BEAMER_START + 1)
#define EL_GRID_WOOD_03 (EL_GRID_WOOD_START + 3)
#define EL_GRID_WOOD_END EL_GRID_WOOD_03
#define EL_FUEL_EMPTY 155
+#define EL_ENVELOPE_1 156
+#define EL_ENVELOPE_2 157
+#define EL_ENVELOPE_3 158
+#define EL_ENVELOPE_4 159
-#define EL_MM_END_1 155
+#define EL_MM_END_1 159
#define EL_CHAR_START 160
-#define EL_CHAR_ASCII0 (EL_CHAR_START-32)
-#define EL_CHAR_AUSRUF (EL_CHAR_ASCII0+33)
-#define EL_CHAR_ZOLL (EL_CHAR_ASCII0+34)
-#define EL_CHAR_RAUTE (EL_CHAR_ASCII0+35)
-#define EL_CHAR_DOLLAR (EL_CHAR_ASCII0+36)
-#define EL_CHAR_PROZ (EL_CHAR_ASCII0+37)
-#define EL_CHAR_AMPERSAND (EL_CHAR_ASCII0+38)
-#define EL_CHAR_APOSTR (EL_CHAR_ASCII0+39)
-#define EL_CHAR_KLAMM1 (EL_CHAR_ASCII0+40)
-#define EL_CHAR_KLAMM2 (EL_CHAR_ASCII0+41)
-#define EL_CHAR_MULT (EL_CHAR_ASCII0+42)
-#define EL_CHAR_PLUS (EL_CHAR_ASCII0+43)
-#define EL_CHAR_KOMMA (EL_CHAR_ASCII0+44)
-#define EL_CHAR_MINUS (EL_CHAR_ASCII0+45)
-#define EL_CHAR_PUNKT (EL_CHAR_ASCII0+46)
-#define EL_CHAR_SLASH (EL_CHAR_ASCII0+47)
-#define EL_CHAR_0 (EL_CHAR_ASCII0+48)
-#define EL_CHAR_9 (EL_CHAR_ASCII0+57)
-#define EL_CHAR_DOPPEL (EL_CHAR_ASCII0+58)
-#define EL_CHAR_SEMIKL (EL_CHAR_ASCII0+59)
-#define EL_CHAR_LT (EL_CHAR_ASCII0+60)
-#define EL_CHAR_GLEICH (EL_CHAR_ASCII0+61)
-#define EL_CHAR_GT (EL_CHAR_ASCII0+62)
-#define EL_CHAR_FRAGE (EL_CHAR_ASCII0+63)
-#define EL_CHAR_AT (EL_CHAR_ASCII0+64)
-#define EL_CHAR_A (EL_CHAR_ASCII0+65)
-#define EL_CHAR_Z (EL_CHAR_ASCII0+90)
-#define EL_CHAR_AE (EL_CHAR_ASCII0+91)
-#define EL_CHAR_OE (EL_CHAR_ASCII0+92)
-#define EL_CHAR_UE (EL_CHAR_ASCII0+93)
-#define EL_CHAR_COPY (EL_CHAR_ASCII0+94)
-#define EL_CHAR_END (EL_CHAR_START+79)
+#define EL_CHAR_ASCII0 (EL_CHAR_START - 32)
+#define EL_CHAR_AUSRUF (EL_CHAR_ASCII0 + 33)
+#define EL_CHAR_ZOLL (EL_CHAR_ASCII0 + 34)
+#define EL_CHAR_RAUTE (EL_CHAR_ASCII0 + 35)
+#define EL_CHAR_DOLLAR (EL_CHAR_ASCII0 + 36)
+#define EL_CHAR_PROZ (EL_CHAR_ASCII0 + 37)
+#define EL_CHAR_AMPERSAND (EL_CHAR_ASCII0 + 38)
+#define EL_CHAR_APOSTR (EL_CHAR_ASCII0 + 39)
+#define EL_CHAR_KLAMM1 (EL_CHAR_ASCII0 + 40)
+#define EL_CHAR_KLAMM2 (EL_CHAR_ASCII0 + 41)
+#define EL_CHAR_MULT (EL_CHAR_ASCII0 + 42)
+#define EL_CHAR_PLUS (EL_CHAR_ASCII0 + 43)
+#define EL_CHAR_KOMMA (EL_CHAR_ASCII0 + 44)
+#define EL_CHAR_MINUS (EL_CHAR_ASCII0 + 45)
+#define EL_CHAR_PUNKT (EL_CHAR_ASCII0 + 46)
+#define EL_CHAR_SLASH (EL_CHAR_ASCII0 + 47)
+#define EL_CHAR_0 (EL_CHAR_ASCII0 + 48)
+#define EL_CHAR_9 (EL_CHAR_ASCII0 + 57)
+#define EL_CHAR_DOPPEL (EL_CHAR_ASCII0 + 58)
+#define EL_CHAR_SEMIKL (EL_CHAR_ASCII0 + 59)
+#define EL_CHAR_LT (EL_CHAR_ASCII0 + 60)
+#define EL_CHAR_GLEICH (EL_CHAR_ASCII0 + 61)
+#define EL_CHAR_GT (EL_CHAR_ASCII0 + 62)
+#define EL_CHAR_FRAGE (EL_CHAR_ASCII0 + 63)
+#define EL_CHAR_AT (EL_CHAR_ASCII0 + 64)
+#define EL_CHAR_A (EL_CHAR_ASCII0 + 65)
+#define EL_CHAR_Z (EL_CHAR_ASCII0 + 90)
+#define EL_CHAR_AE (EL_CHAR_ASCII0 + 91)
+#define EL_CHAR_OE (EL_CHAR_ASCII0 + 92)
+#define EL_CHAR_UE (EL_CHAR_ASCII0 + 93)
+#define EL_CHAR_COPY (EL_CHAR_ASCII0 + 94)
+#define EL_CHAR_END (EL_CHAR_START + 79)
#define EL_CHAR(x) ((x) == CHAR_BYTE_UMLAUT_A ? EL_CHAR_AE : \
(x) == CHAR_BYTE_UMLAUT_O ? EL_CHAR_OE : \
#define EL_MM_START_2 240
-/* elements for "Deflektor" style levels */
+// elements for "Deflektor" style levels
#define EL_DF_START EL_MM_START_2
#define EL_DF_MIRROR_START EL_DF_START
#define EL_DF_MIRROR_END EL_DF_MIRROR_15
#define EL_GRID_WOOD_FIXED_START 256
-#define EL_GRID_WOOD_FIXED_00 (EL_GRID_WOOD_FIXED_START + 0) /* 0.0° */
-#define EL_GRID_WOOD_FIXED_01 (EL_GRID_WOOD_FIXED_START + 1) /* 22.5° */
-#define EL_GRID_WOOD_FIXED_02 (EL_GRID_WOOD_FIXED_START + 2) /* 45.0° */
-#define EL_GRID_WOOD_FIXED_03 (EL_GRID_WOOD_FIXED_START + 3) /* 67.5° */
-#define EL_GRID_WOOD_FIXED_04 (EL_GRID_WOOD_FIXED_START + 4) /* 90.0° */
-#define EL_GRID_WOOD_FIXED_05 (EL_GRID_WOOD_FIXED_START + 5) /* 112.5° */
-#define EL_GRID_WOOD_FIXED_06 (EL_GRID_WOOD_FIXED_START + 6) /* 135.0° */
-#define EL_GRID_WOOD_FIXED_07 (EL_GRID_WOOD_FIXED_START + 7) /* 157.5° */
+#define EL_GRID_WOOD_FIXED_00 (EL_GRID_WOOD_FIXED_START + 0) // 0.0°
+#define EL_GRID_WOOD_FIXED_01 (EL_GRID_WOOD_FIXED_START + 1) // 22.5°
+#define EL_GRID_WOOD_FIXED_02 (EL_GRID_WOOD_FIXED_START + 2) // 45.0°
+#define EL_GRID_WOOD_FIXED_03 (EL_GRID_WOOD_FIXED_START + 3) // 67.5°
+#define EL_GRID_WOOD_FIXED_04 (EL_GRID_WOOD_FIXED_START + 4) // 90.0°
+#define EL_GRID_WOOD_FIXED_05 (EL_GRID_WOOD_FIXED_START + 5) // 112.5°
+#define EL_GRID_WOOD_FIXED_06 (EL_GRID_WOOD_FIXED_START + 6) // 135.0°
+#define EL_GRID_WOOD_FIXED_07 (EL_GRID_WOOD_FIXED_START + 7) // 157.5°
#define EL_GRID_WOOD_FIXED_END EL_GRID_WOOD_FIXED_07
#define EL_GRID_STEEL_FIXED_START 264
-#define EL_GRID_STEEL_FIXED_00 (EL_GRID_STEEL_FIXED_START + 0) /* 0.0° */
-#define EL_GRID_STEEL_FIXED_01 (EL_GRID_STEEL_FIXED_START + 1) /* 22.5° */
-#define EL_GRID_STEEL_FIXED_02 (EL_GRID_STEEL_FIXED_START + 2) /* 45.0° */
-#define EL_GRID_STEEL_FIXED_03 (EL_GRID_STEEL_FIXED_START + 3) /* 67.5° */
-#define EL_GRID_STEEL_FIXED_04 (EL_GRID_STEEL_FIXED_START + 4) /* 90.0° */
-#define EL_GRID_STEEL_FIXED_05 (EL_GRID_STEEL_FIXED_START + 5) /* 112.5° */
-#define EL_GRID_STEEL_FIXED_06 (EL_GRID_STEEL_FIXED_START + 6) /* 135.0° */
-#define EL_GRID_STEEL_FIXED_07 (EL_GRID_STEEL_FIXED_START + 7) /* 157.5° */
+#define EL_GRID_STEEL_FIXED_00 (EL_GRID_STEEL_FIXED_START + 0) // 0.0°
+#define EL_GRID_STEEL_FIXED_01 (EL_GRID_STEEL_FIXED_START + 1) // 22.5°
+#define EL_GRID_STEEL_FIXED_02 (EL_GRID_STEEL_FIXED_START + 2) // 45.0°
+#define EL_GRID_STEEL_FIXED_03 (EL_GRID_STEEL_FIXED_START + 3) // 67.5°
+#define EL_GRID_STEEL_FIXED_04 (EL_GRID_STEEL_FIXED_START + 4) // 90.0°
+#define EL_GRID_STEEL_FIXED_05 (EL_GRID_STEEL_FIXED_START + 5) // 112.5°
+#define EL_GRID_STEEL_FIXED_06 (EL_GRID_STEEL_FIXED_START + 6) // 135.0°
+#define EL_GRID_STEEL_FIXED_07 (EL_GRID_STEEL_FIXED_START + 7) // 157.5°
#define EL_GRID_STEEL_FIXED_END EL_GRID_STEEL_FIXED_07
-#define EL_DF_WALL_WOOD 272
-#define EL_DF_WALL_START EL_DF_WALL_WOOD_START
-#define EL_DF_WALL_WOOD_START (EL_DF_WALL_WOOD + 0)
-#define EL_DF_WALL_WOOD_END (EL_DF_WALL_WOOD + 15)
+#define EL_DF_WALL_WOOD_BASE 272
+#define EL_DF_WALL_WOOD_START (EL_DF_WALL_WOOD_BASE + 0)
+#define EL_DF_WALL_WOOD_END (EL_DF_WALL_WOOD_BASE + 15)
-#define EL_DF_WALL_STEEL 288
-#define EL_DF_WALL_STEEL_START (EL_DF_WALL_STEEL + 0)
-#define EL_DF_WALL_STEEL_END (EL_DF_WALL_STEEL + 15)
+#define EL_DF_WALL_STEEL_BASE 288
+#define EL_DF_WALL_STEEL_START (EL_DF_WALL_STEEL_BASE + 0)
+#define EL_DF_WALL_STEEL_END (EL_DF_WALL_STEEL_BASE + 15)
+
+#define EL_DF_WALL_START EL_DF_WALL_WOOD_START
#define EL_DF_WALL_END EL_DF_WALL_STEEL_END
#define EL_DF_EMPTY 304
#define EL_BEAMER_BLUE_START 404
#define EL_BEAMER_BLUE_END (EL_BEAMER_BLUE_START + 15)
-/* (currently unused, but potentially useful element definitions) */
+// element definitions partially used for drawing graphics
#define EL_MCDUFFIN 420
#define EL_PACMAN 421
#define EL_FUSE_OFF 422
-#define EL_STEEL_WALL 423
-#define EL_WOODEN_WALL 424
-#define EL_ICE_WALL 425
-#define EL_AMOEBA_WALL 426
+#define EL_WALL_STEEL 423
+#define EL_WALL_WOOD 424
+#define EL_WALL_ICE 425
+#define EL_WALL_AMOEBA 426
#define EL_LASER 427
#define EL_RECEIVER 428
-#define EL_DF_STEEL_WALL 429
-#define EL_DF_WOODEN_WALL 430
+#define EL_DF_WALL_STEEL 429
+#define EL_DF_WALL_WOOD 430
#define EL_MM_END_2 430
#define EL_MM_END EL_MM_END_2
-/* "real" (and therefore drawable) runtime elements */
+// "real" (and therefore drawable) runtime elements
#define EL_EXIT_OPENING 500
#define EL_EXIT_CLOSING 501
-#define EL_GRAY_BALL_OPENING 502
-#define EL_ICE_WALL_SHRINKING 503
-#define EL_AMOEBA_WALL_GROWING 504
-
-#define EL_WALL_CHANGING 512
-#define EL_WALL_CHANGING_START (EL_WALL_CHANGING + 0)
-#define EL_WALL_CHANGING_END (EL_WALL_CHANGING + 15)
+#define EL_GRAY_BALL_ACTIVE 502
+#define EL_GRAY_BALL_OPENING 503
+#define EL_WALL_ICE_SHRINKING 504
+#define EL_WALL_AMOEBA_GROWING 505
+#define EL_BOMB_ACTIVE 506
+#define EL_MINE_ACTIVE 507
+#define EL_ENVELOPE_1_OPENING 508
+#define EL_ENVELOPE_2_OPENING 509
+#define EL_ENVELOPE_3_OPENING 510
+#define EL_ENVELOPE_4_OPENING 511
+
+#define EL_ENVELOPE_OPENING_START EL_ENVELOPE_1_OPENING
+#define EL_ENVELOPE_OPENING_END EL_ENVELOPE_4_OPENING
+
+#define EL_WALL_CHANGING_BASE 512
+#define EL_WALL_CHANGING_START (EL_WALL_CHANGING_BASE + 0)
+#define EL_WALL_CHANGING_END (EL_WALL_CHANGING_BASE + 15)
#define EL_FIRST_RUNTIME_EL EL_EXIT_OPENING
-/* "unreal" (and therefore not drawable) runtime elements */
+// "unreal" (and therefore not drawable) runtime elements
#define EL_BLOCKED 600
#define EL_EXPLODING_OPAQUE 601
#define EL_EXPLODING_TRANSP 602
-/* dummy elements (never used as game elements, only used as graphics) */
-#define EL_MM_MASK_MCDUFFIN_RIGHT 700
-#define EL_MM_MASK_MCDUFFIN_UP 701
-#define EL_MM_MASK_MCDUFFIN_LEFT 702
-#define EL_MM_MASK_MCDUFFIN_DOWN 703
-#define EL_MM_MASK_GRID_1 704
-#define EL_MM_MASK_GRID_2 705
-#define EL_MM_MASK_GRID_3 706
-#define EL_MM_MASK_GRID_4 707
-#define EL_MM_MASK_RECTANGE 708
-#define EL_MM_MASK_CIRCLE 709
-
-
-/* game graphics:
-** 0 - 191: graphics from "MirrorScreen"
-** 192 - 255: pseudo graphics mapped to "MirrorScreen"
-** 256 - 511: graphics from "MirrorFont"
-** 512 - 767: graphics from "MirrorDF"
-*/
+
+// game graphics:
+// 0 - 191: graphics from "MirrorScreen"
+// 192 - 255: pseudo graphics mapped to "MirrorScreen"
+// 256 - 511: graphics from "MirrorFont"
+// 512 - 767: graphics from "MirrorDF"
#define IMG_EMPTY IMG_EMPTY_SPACE
-#define GFX_START_MIRRORSCREEN 0
-#define GFX_END_MIRRORSCREEN 191
-#define GFX_START_PSEUDO 192
-#define GFX_END_PSEUDO 255
-#define GFX_START_MIRRORFONT 256
-#define GFX_END_MIRRORFONT 511
-#define GFX_START_MIRRORDF 512
-#define GFX_END_MIRRORDF 767
-
-#define NUM_TILES 512
-
-/* graphics from "MirrorScreen" */
-#define GFX_EMPTY (-1)
-/* row 0 (0) */
-#define GFX_MIRROR_START 0
-#define GFX_MIRROR GFX_MIRROR_START
-#define GFX_MIRROR_00 (GFX_MIRROR_START + 0)
-#define GFX_MIRROR_01 (GFX_MIRROR_START + 1)
-#define GFX_MIRROR_02 (GFX_MIRROR_START + 2)
-#define GFX_MIRROR_03 (GFX_MIRROR_START + 3)
-#define GFX_MIRROR_04 (GFX_MIRROR_START + 4)
-#define GFX_MIRROR_05 (GFX_MIRROR_START + 5)
-#define GFX_MIRROR_06 (GFX_MIRROR_START + 6)
-#define GFX_MIRROR_07 (GFX_MIRROR_START + 7)
-#define GFX_MIRROR_08 (GFX_MIRROR_START + 8)
-#define GFX_MIRROR_09 (GFX_MIRROR_START + 9)
-#define GFX_MIRROR_10 (GFX_MIRROR_START + 10)
-#define GFX_MIRROR_11 (GFX_MIRROR_START + 11)
-#define GFX_MIRROR_12 (GFX_MIRROR_START + 12)
-#define GFX_MIRROR_13 (GFX_MIRROR_START + 13)
-#define GFX_MIRROR_14 (GFX_MIRROR_START + 14)
-#define GFX_MIRROR_15 (GFX_MIRROR_START + 15)
-#define GFX_MIRROR_END GFX_MIRROR_15
-/* row 1 (16) */
-#define GFX_GRID_STEEL_START 16
-#define GFX_GRID_STEEL GFX_GRID_STEEL_START
-#define GFX_GRID_STEEL_00 (GFX_GRID_STEEL_START + 0)
-#define GFX_GRID_STEEL_01 (GFX_GRID_STEEL_START + 1)
-#define GFX_GRID_STEEL_02 (GFX_GRID_STEEL_START + 2)
-#define GFX_GRID_STEEL_03 (GFX_GRID_STEEL_START + 3)
-#define GFX_MCDUFFIN_START 20
-#define GFX_MCDUFFIN GFX_MCDUFFIN_START
-#define GFX_MCDUFFIN_RIGHT (GFX_MCDUFFIN_START + 0)
-#define GFX_MCDUFFIN_UP (GFX_MCDUFFIN_START + 1)
-#define GFX_MCDUFFIN_LEFT (GFX_MCDUFFIN_START + 2)
-#define GFX_MCDUFFIN_DOWN (GFX_MCDUFFIN_START + 3)
-#define GFX_EXIT_CLOSED 24
-#define GFX_EXIT_OPENING_1 25
-#define GFX_EXIT_OPENING_2 26
-#define GFX_EXIT_OPEN 27
-#define GFX_KETTLE 28
-#define GFX_EXPLOSION_KETTLE 29
-/* row 2 (32) */
-#define GFX_PRISM 32
-#define GFX_WALL_SEVERAL 33
-#define GFX_WALL_ANIMATION 34
-#define GFX_BLOCK_WOOD 36
-#define GFX_BOMB 37
-#define GFX_FUSE_ON 38
-#define GFX_FUSE_OFF 39
-#define GFX_GATE_STONE 40
-#define GFX_KEY 41
-#define GFX_LIGHTBULB_OFF 42
-#define GFX_LIGHTBULB_ON 43
-#define GFX_BALL_RED 44
-#define GFX_BALL_BLUE 45
-#define GFX_BALL_YELLOW 46
-#define GFX_BALL_GRAY 47
-/* row 3 (48) */
-#define GFX_BEAMER_START 48
-#define GFX_BEAMER_END 63
-/* row 4 (64) */
-#define GFX_PACMAN_START 64
-#define GFX_PACMAN GFX_PACMAN_START
-#define GFX_PACMAN_RIGHT (GFX_PACMAN_START + 0)
-#define GFX_PACMAN_UP (GFX_PACMAN_START + 1)
-#define GFX_PACMAN_LEFT (GFX_PACMAN_START + 2)
-#define GFX_PACMAN_DOWN (GFX_PACMAN_START + 3)
-#define GFX_EXPLOSION_START 72
-#define GFX_EXPLOSION_SHORT 76
-#define GFX_EXPLOSION_LAST 78
-/* row 5 (80) */
-#define GFX_POLAR_START 80
-#define GFX_POLAR_END 95
-/* row 6 (96) */
-#define GFX_POLAR_CROSS_START 96
-#define GFX_POLAR_CROSS GFX_POLAR_CROSS_START
-#define GFX_POLAR_CROSS_00 (GFX_POLAR_CROSS_START + 0)
-#define GFX_POLAR_CROSS_01 (GFX_POLAR_CROSS_START + 1)
-#define GFX_POLAR_CROSS_02 (GFX_POLAR_CROSS_START + 2)
-#define GFX_POLAR_CROSS_03 (GFX_POLAR_CROSS_START + 3)
-#define GFX_MIRROR_FIXED_START 100
-#define GFX_MIRROR_FIXED GFX_MIRROR_FIXED_START
-#define GFX_MIRROR_FIXED_00 (GFX_MIRROR_FIXED_START + 0)
-#define GFX_MIRROR_FIXED_01 (GFX_MIRROR_FIXED_START + 1)
-#define GFX_MIRROR_FIXED_02 (GFX_MIRROR_FIXED_START + 2)
-#define GFX_MIRROR_FIXED_03 (GFX_MIRROR_FIXED_START + 3)
-/* row 7 (112) */
-#define GFX_BLOCK_STONE 112
-#define GFX_GATE_WOOD 113
-#define GFX_FUEL_FULL 114
-#define GFX_FUEL_EMPTY 115
-#define GFX_GRID_WOOD_00 116
-#define GFX_GRID_WOOD_01 117
-#define GFX_GRID_WOOD_02 118
-#define GFX_GRID_WOOD_03 119
-/* row 8 (128) */
-#define GFX_ARROW_BLUE_LEFT 128
-#define GFX_ARROW_BLUE_RIGHT 129
-#define GFX_ARROW_BLUE_UP 130
-#define GFX_ARROW_BLUE_DOWN 131
-#define GFX_ARROW_RED_LEFT 132
-#define GFX_ARROW_RED_RIGHT 133
-#define GFX_ARROW_RED_UP 134
-#define GFX_ARROW_RED_DOWN 135
-/* row 9 (144) */
-#define GFX_SCROLLBAR_BLUE 144
-#define GFX_SCROLLBAR_RED 145
-/* row 10 (160) */
-#define GFX_MASK_CIRCLE 160
-#define GFX_MASK_RECTANGLE 161
-#define GFX_MASK_RECTANGLE2 162
-#define GFX_MASK_RECTANGLE3 163
-#define GFX_MASK_GRID_00 164
-#define GFX_MASK_GRID_01 165
-#define GFX_MASK_GRID_02 166
-#define GFX_MASK_GRID_03 167
-/* row 11 (176) */
-#define GFX_MASK_MCDUFFIN_00 176
-#define GFX_MASK_MCDUFFIN_01 177
-#define GFX_MASK_MCDUFFIN_02 178
-#define GFX_MASK_MCDUFFIN_03 179
-
-/* pseudo-graphics; will be mapped to other graphics */
-#define GFX_WALL_STEEL 192
-#define GFX_WALL_WOOD 193
-#define GFX_WALL_ICE 194
-#define GFX_WALL_AMOEBA 195
-#define GFX_DF_WALL_STEEL 196
-#define GFX_DF_WALL_WOOD 197
-
-#define GFX_KUGEL_ROT GFX_BALL_RED
-#define GFX_KUGEL_BLAU GFX_BALL_BLUE
-#define GFX_KUGEL_GELB GFX_BALL_YELLOW
-#define GFX_KUGEL_GRAU GFX_BALL_GRAY
-
-/* graphics from "MirrorFont" */
-#define GFX_CHAR_START (GFX_START_MIRRORFONT)
-#define GFX_CHAR_ASCII0 (GFX_CHAR_START - 32)
-#define GFX_CHAR_AUSRUF (GFX_CHAR_ASCII0 + 33)
-#define GFX_CHAR_ZOLL (GFX_CHAR_ASCII0 + 34)
-#define GFX_CHAR_DOLLAR (GFX_CHAR_ASCII0 + 36)
-#define GFX_CHAR_PROZ (GFX_CHAR_ASCII0 + 37)
-#define GFX_CHAR_APOSTR (GFX_CHAR_ASCII0 + 39)
-#define GFX_CHAR_KLAMM1 (GFX_CHAR_ASCII0 + 40)
-#define GFX_CHAR_KLAMM2 (GFX_CHAR_ASCII0 + 41)
-#define GFX_CHAR_PLUS (GFX_CHAR_ASCII0 + 43)
-#define GFX_CHAR_KOMMA (GFX_CHAR_ASCII0 + 44)
-#define GFX_CHAR_MINUS (GFX_CHAR_ASCII0 + 45)
-#define GFX_CHAR_PUNKT (GFX_CHAR_ASCII0 + 46)
-#define GFX_CHAR_SLASH (GFX_CHAR_ASCII0 + 47)
-#define GFX_CHAR_0 (GFX_CHAR_ASCII0 + 48)
-#define GFX_CHAR_9 (GFX_CHAR_ASCII0 + 57)
-#define GFX_CHAR_DOPPEL (GFX_CHAR_ASCII0 + 58)
-#define GFX_CHAR_SEMIKL (GFX_CHAR_ASCII0 + 59)
-#define GFX_CHAR_LT (GFX_CHAR_ASCII0 + 60)
-#define GFX_CHAR_GLEICH (GFX_CHAR_ASCII0 + 61)
-#define GFX_CHAR_GT (GFX_CHAR_ASCII0 + 62)
-#define GFX_CHAR_FRAGE (GFX_CHAR_ASCII0 + 63)
-#define GFX_CHAR_AT (GFX_CHAR_ASCII0 + 64)
-#define GFX_CHAR_A (GFX_CHAR_ASCII0 + 65)
-#define GFX_CHAR_Z (GFX_CHAR_ASCII0 + 90)
-#define GFX_CHAR_AE (GFX_CHAR_ASCII0 + 91)
-#define GFX_CHAR_OE (GFX_CHAR_ASCII0 + 92)
-#define GFX_CHAR_UE (GFX_CHAR_ASCII0 + 93)
-#define GFX_CHAR_COPY (GFX_CHAR_ASCII0 + 94)
-#define GFX_CHAR_END (GFX_CHAR_START + 79)
-
-/* graphics from "MirrorDF" */
-#define GFX_DF_MIRROR_00 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 0)
-#define GFX_DF_MIRROR_01 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 1)
-#define GFX_DF_MIRROR_02 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 2)
-#define GFX_DF_MIRROR_03 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 3)
-#define GFX_DF_MIRROR_04 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 4)
-#define GFX_DF_MIRROR_05 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 5)
-#define GFX_DF_MIRROR_06 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 6)
-#define GFX_DF_MIRROR_07 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 7)
-#define GFX_DF_MIRROR_08 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 8)
-#define GFX_DF_MIRROR_09 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 9)
-#define GFX_DF_MIRROR_10 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 10)
-#define GFX_DF_MIRROR_11 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 11)
-#define GFX_DF_MIRROR_12 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 12)
-#define GFX_DF_MIRROR_13 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 13)
-#define GFX_DF_MIRROR_14 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 14)
-#define GFX_DF_MIRROR_15 (GFX_START_MIRRORDF + 0 * DF_PER_LINE + 15)
-
-#define GFX_DF_MIRROR_AUTO_00 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 0)
-#define GFX_DF_MIRROR_AUTO_01 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 1)
-#define GFX_DF_MIRROR_AUTO_02 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 2)
-#define GFX_DF_MIRROR_AUTO_03 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 3)
-#define GFX_DF_MIRROR_AUTO_04 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 4)
-#define GFX_DF_MIRROR_AUTO_05 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 5)
-#define GFX_DF_MIRROR_AUTO_06 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 6)
-#define GFX_DF_MIRROR_AUTO_07 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 7)
-#define GFX_DF_MIRROR_AUTO_08 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 8)
-#define GFX_DF_MIRROR_AUTO_09 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 9)
-#define GFX_DF_MIRROR_AUTO_10 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 10)
-#define GFX_DF_MIRROR_AUTO_11 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 11)
-#define GFX_DF_MIRROR_AUTO_12 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 12)
-#define GFX_DF_MIRROR_AUTO_13 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 13)
-#define GFX_DF_MIRROR_AUTO_14 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 14)
-#define GFX_DF_MIRROR_AUTO_15 (GFX_START_MIRRORDF + 1 * DF_PER_LINE + 15)
-
-#define GFX_GRID_STEEL_FIXED_00 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 0)
-#define GFX_GRID_STEEL_FIXED_01 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 1)
-#define GFX_GRID_STEEL_FIXED_02 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 2)
-#define GFX_GRID_STEEL_FIXED_03 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 3)
-#define GFX_GRID_STEEL_FIXED_04 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 4)
-#define GFX_GRID_STEEL_FIXED_05 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 5)
-#define GFX_GRID_STEEL_FIXED_06 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 6)
-#define GFX_GRID_STEEL_FIXED_07 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 7)
-#define GFX_GRID_STEEL_FIXED GFX_GRID_STEEL_FIXED_00
-
-#define GFX_GRID_WOOD_FIXED_00 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 8)
-#define GFX_GRID_WOOD_FIXED_01 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 9)
-#define GFX_GRID_WOOD_FIXED_02 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 10)
-#define GFX_GRID_WOOD_FIXED_03 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 11)
-#define GFX_GRID_WOOD_FIXED_04 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 12)
-#define GFX_GRID_WOOD_FIXED_05 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 13)
-#define GFX_GRID_WOOD_FIXED_06 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 14)
-#define GFX_GRID_WOOD_FIXED_07 (GFX_START_MIRRORDF + 2 * DF_PER_LINE + 15)
-#define GFX_GRID_WOOD_FIXED GFX_GRID_WOOD_FIXED_00
-
-#define GFX_GRID_STEEL_AUTO_00 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 0)
-#define GFX_GRID_STEEL_AUTO_01 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 1)
-#define GFX_GRID_STEEL_AUTO_02 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 2)
-#define GFX_GRID_STEEL_AUTO_03 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 3)
-#define GFX_GRID_STEEL_AUTO_04 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 4)
-#define GFX_GRID_STEEL_AUTO_05 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 5)
-#define GFX_GRID_STEEL_AUTO_06 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 6)
-#define GFX_GRID_STEEL_AUTO_07 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 7)
-#define GFX_GRID_STEEL_AUTO GFX_GRID_STEEL_AUTO_00
-
-#define GFX_GRID_WOOD_AUTO_00 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 8)
-#define GFX_GRID_WOOD_AUTO_01 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 9)
-#define GFX_GRID_WOOD_AUTO_02 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 10)
-#define GFX_GRID_WOOD_AUTO_03 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 11)
-#define GFX_GRID_WOOD_AUTO_04 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 12)
-#define GFX_GRID_WOOD_AUTO_05 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 13)
-#define GFX_GRID_WOOD_AUTO_06 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 14)
-#define GFX_GRID_WOOD_AUTO_07 (GFX_START_MIRRORDF + 3 * DF_PER_LINE + 15)
-#define GFX_GRID_WOOD_AUTO GFX_GRID_WOOD_AUTO_00
-
-#define GFX_BEAMER_RED_START (GFX_START_MIRRORDF + 4 * DF_PER_LINE + 0)
-#define GFX_BEAMER_RED_END (GFX_START_MIRRORDF + 4 * DF_PER_LINE + 15)
-#define GFX_BEAMER_YELLOW_START (GFX_START_MIRRORDF + 5 * DF_PER_LINE + 0)
-#define GFX_BEAMER_YELLOW_END (GFX_START_MIRRORDF + 5 * DF_PER_LINE + 15)
-#define GFX_BEAMER_GREEN_START (GFX_START_MIRRORDF + 6 * DF_PER_LINE + 0)
-#define GFX_BEAMER_GREEN_END (GFX_START_MIRRORDF + 6 * DF_PER_LINE + 15)
-#define GFX_BEAMER_BLUE_START (GFX_START_MIRRORDF + 7 * DF_PER_LINE + 0)
-#define GFX_BEAMER_BLUE_END (GFX_START_MIRRORDF + 7 * DF_PER_LINE + 15)
-
-#define GFX_DF_WALL_SEVERAL (GFX_START_MIRRORDF + 8 * DF_PER_LINE + 0)
-#define GFX_REFRACTOR (GFX_START_MIRRORDF + 8 * DF_PER_LINE + 1)
-#define GFX_CELL (GFX_START_MIRRORDF + 8 * DF_PER_LINE + 2)
-#define GFX_MINE (GFX_START_MIRRORDF + 8 * DF_PER_LINE + 4)
-
-#define GFX_LASER_RIGHT (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 0)
-#define GFX_LASER_UP (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 1)
-#define GFX_LASER_LEFT (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 2)
-#define GFX_LASER_DOWN (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 3)
-#define GFX_RECEIVER_RIGHT (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 4)
-#define GFX_RECEIVER_UP (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 5)
-#define GFX_RECEIVER_LEFT (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 6)
-#define GFX_RECEIVER_DOWN (GFX_START_MIRRORDF + 9 * DF_PER_LINE + 7)
-
-#define GFX_FIBRE_OPTIC_00 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 0)
-#define GFX_FIBRE_OPTIC_01 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 1)
-#define GFX_FIBRE_OPTIC_02 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 2)
-#define GFX_FIBRE_OPTIC_03 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 3)
-#define GFX_FIBRE_OPTIC_04 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 4)
-#define GFX_FIBRE_OPTIC_05 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 5)
-#define GFX_FIBRE_OPTIC_06 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 6)
-#define GFX_FIBRE_OPTIC_07 (GFX_START_MIRRORDF + 10 * DF_PER_LINE + 7)
-
-#define GFX_FIBRE_OPTIC_ED_00 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 0)
-#define GFX_FIBRE_OPTIC_ED_01 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 1)
-#define GFX_FIBRE_OPTIC_ED_02 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 2)
-#define GFX_FIBRE_OPTIC_ED_03 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 3)
-#define GFX_FIBRE_OPTIC_ED_04 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 4)
-#define GFX_FIBRE_OPTIC_ED_05 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 5)
-#define GFX_FIBRE_OPTIC_ED_06 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 6)
-#define GFX_FIBRE_OPTIC_ED_07 (GFX_START_MIRRORDF + 11 * DF_PER_LINE + 7)
-
-/* the names of the sounds */
-#define SND_AMOEBE 0
-#define SND_ANTIGRAV 1
-#define SND_AUTSCH 2
-#define SND_BONG 3
-#define SND_FUEL 4
-#define SND_HALLOFFAME 5
-#define SND_HOLZ 6
-#define SND_HUI 7
-#define SND_KABUMM 8
-#define SND_KINK 9
-#define SND_KLING 10
-#define SND_LASER 11
-#define SND_OEFFNEN 12
-#define SND_QUIEK 13
-#define SND_RHYTHMLOOP 14
-#define SND_ROAAAR 15
-#define SND_SIRR 16
-#define SND_SLURP 17
-#define SND_WARNTON 18
-#define SND_WHOOSH 19
-
-#define NUM_SOUNDS 20
-
-/* laser angles (directions) */
+// values for graphics/sounds action types
+#define MM_ACTION_DEFAULT 0
+#define MM_ACTION_WAITING 1
+#define MM_ACTION_FALLING 2
+#define MM_ACTION_MOVING 3
+#define MM_ACTION_DIGGING 4
+#define MM_ACTION_SNAPPING 5
+#define MM_ACTION_COLLECTING 6
+#define MM_ACTION_DROPPING 7
+#define MM_ACTION_PUSHING 8
+#define MM_ACTION_WALKING 9
+#define MM_ACTION_PASSING 10
+#define MM_ACTION_IMPACT 11
+#define MM_ACTION_BREAKING 12
+#define MM_ACTION_ACTIVATING 13
+#define MM_ACTION_DEACTIVATING 14
+#define MM_ACTION_OPENING 15
+#define MM_ACTION_CLOSING 16
+#define MM_ACTION_ATTACKING 17
+#define MM_ACTION_GROWING 18
+#define MM_ACTION_SHRINKING 19
+#define MM_ACTION_ACTIVE 20
+#define MM_ACTION_FILLING 21
+#define MM_ACTION_EMPTYING 22
+#define MM_ACTION_CHANGING 23
+#define MM_ACTION_EXPLODING 24
+#define MM_ACTION_BORING 25
+#define MM_ACTION_BORING_1 26
+#define MM_ACTION_BORING_2 27
+#define MM_ACTION_BORING_3 28
+#define MM_ACTION_BORING_4 29
+#define MM_ACTION_BORING_5 30
+#define MM_ACTION_BORING_6 31
+#define MM_ACTION_BORING_7 32
+#define MM_ACTION_BORING_8 33
+#define MM_ACTION_BORING_9 34
+#define MM_ACTION_BORING_10 35
+#define MM_ACTION_SLEEPING 36
+#define MM_ACTION_SLEEPING_1 37
+#define MM_ACTION_SLEEPING_2 38
+#define MM_ACTION_SLEEPING_3 39
+#define MM_ACTION_AWAKENING 40
+#define MM_ACTION_DYING 41
+#define MM_ACTION_TURNING 42
+#define MM_ACTION_TURNING_FROM_LEFT 43
+#define MM_ACTION_TURNING_FROM_RIGHT 44
+#define MM_ACTION_TURNING_FROM_UP 45
+#define MM_ACTION_TURNING_FROM_DOWN 46
+#define MM_ACTION_SMASHED_BY_ROCK 47
+#define MM_ACTION_SMASHED_BY_SPRING 48
+#define MM_ACTION_EATING 49
+#define MM_ACTION_TWINKLING 50
+#define MM_ACTION_SPLASHING 51
+#define MM_ACTION_HITTING 52
+
+// laser angles (directions)
#define ANG_RAY_RIGHT 0
#define ANG_RAY_UP 4
#define ANG_RAY_LEFT 8
#define ANG_RAY_DOWN 12
-/* laser angles (degree) */
+// laser angles (degree)
#define ANG_RAY_0 0
#define ANG_RAY_90 4
#define ANG_RAY_180 8
#define IS_HORIZ_ANGLE(angle) (!((angle) % 8))
#define IS_VERT_ANGLE(angle) ((angle) % 8)
-/* mirror angles */
+// mirror angles
#define ANG_MIRROR_0 0
#define ANG_MIRROR_45 4
#define ANG_MIRROR_90 8
#define ANG_MIRROR_135 12
-/* positions for checking where laser already hits element */
+// positions for checking where laser already hits element
#define HIT_POS_CENTER 1
#define HIT_POS_EDGE 2
#define HIT_POS_BETWEEN 4
-/* masks for scanning elements */
+// masks for scanning elements
#define HIT_MASK_NO_HIT 0
#define HIT_MASK_TOPLEFT 1
#define HIT_MASK_TOPRIGHT 2
#define HIT_MASK_RIGHT (HIT_MASK_TOPRIGHT | HIT_MASK_BOTTOMRIGHT)
#define HIT_MASK_TOP (HIT_MASK_TOPLEFT | HIT_MASK_TOPRIGHT)
#define HIT_MASK_BOTTOM (HIT_MASK_BOTTOMLEFT | HIT_MASK_BOTTOMRIGHT)
+#define HIT_MASK_DIAGONAL_1 (HIT_MASK_TOPLEFT | HIT_MASK_BOTTOMRIGHT)
+#define HIT_MASK_DIAGONAL_2 (HIT_MASK_TOPRIGHT | HIT_MASK_BOTTOMLEFT)
#define HIT_MASK_ALL (HIT_MASK_LEFT | HIT_MASK_RIGHT)
-/* step values for rotating elements */
+// step values for rotating elements
#define ROTATE_NO_ROTATING 0
#define ROTATE_LEFT (+1)
#define ROTATE_RIGHT (-1)
(button) == MB_RIGHTBUTTON ? ROTATE_RIGHT : \
ROTATE_NO_ROTATING)
-/* game over values */
+// game over values
#define GAME_OVER_NO_ENERGY 1
#define GAME_OVER_OVERLOADED 2
#define GAME_OVER_BOMB 3
-/* values for game_status */
-#define EXITGAME 0
-#define MAINMENU 1
-#define PLAYING 2
-#define LEVELED 3
-#define HELPSCREEN 4
-#define CHOOSELEVEL 5
-#define TYPENAME 6
-#define HALLOFFAME 7
-#define SETUP 8
-
-/* return values for GameActions */
-#define ACT_GO_ON 0
-#define ACT_GAME_OVER 1
-#define ACT_NEW_GAME 2
-
-/* values for color_status */
-#define STATIC_COLORS 0
-#define DYNAMIC_COLORS 1
-
#define PROGRAM_VERSION_MAJOR 2
#define PROGRAM_VERSION_MINOR 0
#define PROGRAM_VERSION_PATCH 2
#define PROGRAM_VERSION_STRING "2.0.2"
-#define PROGRAM_TITLE_STRING "Mirror Magic II"
-#define PROGRAM_AUTHOR_STRING "Holger Schemel"
-#define PROGRAM_RIGHTS_STRING "Copyright ^1994-2001"
-#define PROGRAM_DOS_PORT_STRING "DOS port based on code by Guido Schulz"
-#define PROGRAM_IDENT_STRING PROGRAM_VERSION_STRING " " TARGET_STRING
-#define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING
-#define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING
-#define ICON_TITLE_STRING PROGRAM_TITLE_STRING
-#define UNIX_USERDATA_DIRECTORY ".mirrormagic"
-
-#define X11_ICON_FILENAME "mirrormagic_icon.xbm"
-#define X11_ICONMASK_FILENAME "mirrormagic_iconmask.xbm"
-#define MSDOS_POINTER_FILENAME "mouse.pcx"
-
-/* functions for version handling */
+// functions for version handling
#define MM_VERSION_IDENT(x,y,z) VERSION_IDENT(x,y,z,0)
-#define MM_VERSION_MAJOR(x) VERSION_MAJOR(x)
-#define MM_VERSION_MINOR(x) VERSION_MINOR(x)
-#define MM_VERSION_PATCH(x) VERSION_PATCH(x)
-
-/* file version numbers for resource files (levels, score, setup, etc.)
-** currently supported/known file version numbers:
-** 1.4 (still in use)
-** 2.0 (actual)
-*/
+#define MM_VERSION_MAJOR(x) VERSION_PART_1(x)
+#define MM_VERSION_MINOR(x) VERSION_PART_2(x)
+#define MM_VERSION_PATCH(x) VERSION_PART_3(x)
+
+// file version numbers for resource files (levels, score, setup, etc.)
+// currently supported/known file version numbers:
+// 1.4 (still in use)
+// 2.0 (actual)
+
#define MM_FILE_VERSION_1_4 MM_VERSION_IDENT(1,4,0)
#define MM_FILE_VERSION_2_0 MM_VERSION_IDENT(2,0,0)
-/* file version does not change for every program version, but is changed
- when new features are introduced that are incompatible with older file
- versions, so that they can be treated accordingly */
+// file version does not change for every program version, but is changed
+// when new features are introduced that are incompatible with older file
+// versions, so that they can be treated accordingly
#define MM_FILE_VERSION_ACTUAL MM_FILE_VERSION_2_0
#define MM_GAME_VERSION_ACTUAL MM_VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
PROGRAM_VERSION_MINOR, \
PROGRAM_VERSION_PATCH)
-/* sound control */
-
-#define ST(x) (((x)-8)*16)
-
-#endif /* MM_MAIN_H */
+#endif // MM_MAIN_H