added optional button to restart game (door, panel and touch variants)
[rocksndiamonds.git] / src / game_mm / mm_main.h
index fb0b029f470cb655576722de0b50bc581aea74d4..684647ce12ea77ca52aff8fc88a27288e7fb452f 100644 (file)
                                 (e) <= EL_DF_MIRROR_END)
 #define IS_DF_MIRROR_AUTO(e)   ((e) >= EL_DF_MIRROR_AUTO_START &&      \
                                 (e) <= EL_DF_MIRROR_AUTO_END)
+#define IS_DF_MIRROR_FIXED(e)  ((e) >= EL_DF_MIRROR_FIXED_START &&     \
+                                (e) <= EL_DF_MIRROR_FIXED_END)
+#define IS_DF_SLOPE(e)         ((e) >= EL_DF_SLOPE_START &&            \
+                                (e) <= EL_DF_SLOPE_END)
 #define IS_LASER(e)            ((e) >= EL_LASER_START &&               \
                                 (e) <= EL_LASER_END)
 #define IS_RECEIVER(e)         ((e) >= EL_RECEIVER_START &&            \
                                 (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_OPENING_NR(e) ((e) - EL_ENVELOPE_1_OPENING)
 
 #define CAN_MOVE(e)            ((e) == EL_PACMAN)
-#define IS_FREE(x,y)            (Tile[x][y] == EL_EMPTY)
-
-#define IS_MOVING(x,y)          (MovPos[x][y] != 0)
-#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 IS_FREE(x, y)          (Tile[x][y] == EL_EMPTY)
 
-#define PLAYERINFO(x,y)         (&stored_player[StorePlayer[x][y]-EL_SPIELER1])
+#define IS_MOVING(x, y)                (MovPos[x][y] != 0)
+#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)
 #define LEVEL_SCORE_ELEMENTS   16      // level elements with score
 
 
-extern DrawBuffer      *drawto_field;
+extern DrawBuffer      *drawto_mm;
 extern DrawBuffer      *bitmap_db_field;
 
 extern int             game_status;
@@ -296,29 +305,20 @@ extern int                num_element_info;
 #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_GRAY_BALL           97
 #define EL_BEAMER_START                98
@@ -483,14 +483,15 @@ extern int                num_element_info;
 #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
@@ -579,16 +580,42 @@ extern int                num_element_info;
 #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_MM_END_2            430
+#define EL_DF_WALL_STEEL       429
+#define EL_DF_WALL_WOOD                430
+
+#define EL_DF_MIRROR_FIXED_START 431
+#define EL_DF_MIRROR_FIXED_00  (EL_DF_MIRROR_FIXED_START + 0)
+#define EL_DF_MIRROR_FIXED_01  (EL_DF_MIRROR_FIXED_START + 1)
+#define EL_DF_MIRROR_FIXED_02  (EL_DF_MIRROR_FIXED_START + 2)
+#define EL_DF_MIRROR_FIXED_03  (EL_DF_MIRROR_FIXED_START + 3)
+#define EL_DF_MIRROR_FIXED_04  (EL_DF_MIRROR_FIXED_START + 4)
+#define EL_DF_MIRROR_FIXED_05  (EL_DF_MIRROR_FIXED_START + 5)
+#define EL_DF_MIRROR_FIXED_06  (EL_DF_MIRROR_FIXED_START + 6)
+#define EL_DF_MIRROR_FIXED_07  (EL_DF_MIRROR_FIXED_START + 7)
+#define EL_DF_MIRROR_FIXED_08  (EL_DF_MIRROR_FIXED_START + 8)
+#define EL_DF_MIRROR_FIXED_09  (EL_DF_MIRROR_FIXED_START + 9)
+#define EL_DF_MIRROR_FIXED_10  (EL_DF_MIRROR_FIXED_START + 10)
+#define EL_DF_MIRROR_FIXED_11  (EL_DF_MIRROR_FIXED_START + 11)
+#define EL_DF_MIRROR_FIXED_12  (EL_DF_MIRROR_FIXED_START + 12)
+#define EL_DF_MIRROR_FIXED_13  (EL_DF_MIRROR_FIXED_START + 13)
+#define EL_DF_MIRROR_FIXED_14  (EL_DF_MIRROR_FIXED_START + 14)
+#define EL_DF_MIRROR_FIXED_15  (EL_DF_MIRROR_FIXED_START + 15)
+#define EL_DF_MIRROR_FIXED_END EL_DF_MIRROR_FIXED_15
+
+#define EL_DF_SLOPE_START       447
+#define EL_DF_SLOPE_00         (EL_DF_SLOPE_START + 0)
+#define EL_DF_SLOPE_01         (EL_DF_SLOPE_START + 1)
+#define EL_DF_SLOPE_02         (EL_DF_SLOPE_START + 2)
+#define EL_DF_SLOPE_03         (EL_DF_SLOPE_START + 3)
+#define EL_DF_SLOPE_END                EL_DF_SLOPE_03
+
+#define EL_MM_END_2            450
 #define EL_MM_END              EL_MM_END_2
 
 // "real" (and therefore drawable) runtime elements
@@ -596,8 +623,8 @@ extern int          num_element_info;
 #define EL_EXIT_CLOSING                501
 #define EL_GRAY_BALL_ACTIVE    502
 #define EL_GRAY_BALL_OPENING   503
-#define EL_ICE_WALL_SHRINKING  504
-#define EL_AMOEBA_WALL_GROWING 505
+#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
@@ -608,9 +635,9 @@ extern int          num_element_info;
 #define EL_ENVELOPE_OPENING_START      EL_ENVELOPE_1_OPENING
 #define EL_ENVELOPE_OPENING_END                EL_ENVELOPE_4_OPENING
 
-#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_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
 
@@ -696,8 +723,9 @@ extern int          num_element_info;
 #define ANG_RAY_270            12
 #define IS_22_5_ANGLE(angle)   ((angle) % 2)
 #define IS_90_ANGLE(angle)     (!((angle) % 4))
+#define IS_45_ANGLE(angle)     (!(((angle) + 2) % 4))
 #define IS_HORIZ_ANGLE(angle)  (!((angle) % 8))
-#define IS_VERT_ANGLE(angle)   ((angle) % 8)
+#define IS_VERT_ANGLE(angle)   (!(((angle) + 4) % 8))
 
 // mirror angles
 #define ANG_MIRROR_0           0
@@ -720,6 +748,8 @@ extern int          num_element_info;
 #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
@@ -734,7 +764,6 @@ extern int          num_element_info;
 #define GAME_OVER_NO_ENERGY    1
 #define GAME_OVER_OVERLOADED   2
 #define GAME_OVER_BOMB         3
-#define GAME_OVER_DELAYED      4
 
 #define PROGRAM_VERSION_MAJOR  2
 #define PROGRAM_VERSION_MINOR  0