rnd-20050525-1-src
[rocksndiamonds.git] / src / main.h
index 0bfa9971783eef58358a0174aedc235c184cab75..c8c83033f75c4cb23418dd10f91b3112e045fa9a 100644 (file)
 #define MV_BIT_TURNING_RANDOM  16
 
 /* values for custom move patterns */
-#define MV_HORIZONTAL          (MV_LEFT | MV_RIGHT)
-#define MV_VERTICAL            (MV_UP   | MV_DOWN)
-#define MV_ALL_DIRECTIONS      (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
-#define MV_ANY_DIRECTION       (MV_ALL_DIRECTIONS)
 #define MV_TOWARDS_PLAYER      (1 << MV_BIT_TOWARDS_PLAYER)
 #define MV_AWAY_FROM_PLAYER    (1 << MV_BIT_AWAY_FROM_PLAYER)
 #define MV_ALONG_LEFT_SIDE     (1 << MV_BIT_ALONG_LEFT_SIDE)
 #define IS_ENVELOPE(e)         ((e) >= EL_ENVELOPE_1 &&                \
                                 (e) <= EL_ENVELOPE_4)
 
-#define IS_GATE(e)             ((e) >= EL_GATE_1 &&                    \
+#define IS_RND_KEY(e)          ((e) >= EL_KEY_1 &&                     \
+                                (e) <= EL_KEY_4)
+#define IS_EM_KEY(e)           ((e) >= EL_EM_KEY_1 &&                  \
+                                (e) <= EL_EM_KEY_4)
+#define IS_EMC_KEY(e)          ((e) >= EL_EMC_KEY_5 &&                 \
+                                (e) <= EL_EMC_KEY_8)
+#define IS_KEY(e)              (IS_RND_KEY(e) ||                       \
+                                IS_EM_KEY(e) ||                        \
+                                IS_EMC_KEY(e))
+#define RND_KEY_NR(e)          ((e) - EL_KEY_1)
+#define EM_KEY_NR(e)           ((e) - EL_EM_KEY_1)
+#define EMC_KEY_NR(e)          ((e) - EL_EMC_KEY_5 + 4)
+#define KEY_NR(e)              (IS_RND_KEY(e) ? RND_KEY_NR(e) :        \
+                                IS_EM_KEY(e) ?  EM_KEY_NR(e) :         \
+                                IS_EMC_KEY(e) ? EMC_KEY_NR(e) : 0)
+
+#define IS_RND_GATE(e)         ((e) >= EL_GATE_1 &&                    \
                                 (e) <= EL_GATE_4)
-
-#define IS_GATE_GRAY(e)                ((e) >= EL_GATE_1_GRAY &&               \
-                                (e) <= EL_GATE_4_GRAY)
-
 #define IS_EM_GATE(e)          ((e) >= EL_EM_GATE_1 &&                 \
                                 (e) <= EL_EM_GATE_4)
-
+#define IS_EMC_GATE(e)         ((e) >= EL_EMC_GATE_5 &&                \
+                                (e) <= EL_EMC_GATE_8)
+#define IS_GATE(e)             (IS_RND_GATE(e) ||                      \
+                                IS_EM_GATE(e) ||                       \
+                                IS_EMC_GATE(e))
+#define RND_GATE_NR(e)         ((e) - EL_GATE_1)
+#define EM_GATE_NR(e)          ((e) - EL_EM_GATE_1)
+#define EMC_GATE_NR(e)         ((e) - EL_EMC_GATE_5 + 4)
+#define GATE_NR(e)             (IS_RND_GATE(e) ? RND_GATE_NR(e) :      \
+                                IS_EM_GATE(e) ?  EM_GATE_NR(e) :       \
+                                IS_EMC_GATE(e) ? EMC_GATE_NR(e) : 0)
+
+#define IS_RND_GATE_GRAY(e)    ((e) >= EL_GATE_1_GRAY &&               \
+                                (e) <= EL_GATE_4_GRAY)
 #define IS_EM_GATE_GRAY(e)     ((e) >= EL_EM_GATE_1_GRAY &&            \
                                 (e) <= EL_EM_GATE_4_GRAY)
+#define IS_EMC_GATE_GRAY(e)    ((e) >= EL_EMC_GATE_5_GRAY &&           \
+                                (e) <= EL_EMC_GATE_8_GRAY)
+#define IS_GATE_GRAY(e)                (IS_RND_GATE_GRAY(e) ||                 \
+                                IS_EM_GATE_GRAY(e) ||                  \
+                                IS_EMC_GATE_GRAY(e))
+#define RND_GATE_GRAY_NR(e)    ((e) - EL_GATE_1_GRAY)
+#define EM_GATE_GRAY_NR(e)     ((e) - EL_EM_GATE_1_GRAY)
+#define EMC_GATE_GRAY_NR(e)    ((e) - EL_EMC_GATE_5_GRAY + 4)
+#define GATE_GRAY_NR(e)                (IS_RND_GATE_GRAY(e) ? RND_GATE_GRAY_NR(e) :  \
+                                IS_EM_GATE_GRAY(e) ?  EM_GATE_GRAY_NR(e) :   \
+                                IS_EMC_GATE_GRAY(e) ? EMC_GATE_GRAY_NR(e) : 0)
 
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
 #define MAX_SCORE_ENTRIES      100
 #define MAX_NUM_AMOEBA         100
 #define MAX_INVENTORY_SIZE     1000
-#define MAX_KEYS               4
+#define STD_NUM_KEYS           4
+#define MAX_NUM_KEYS           8
 #define NUM_BELTS              4
 #define NUM_BELT_PARTS         3
 #define MIN_ENVELOPE_XSIZE     1
 #define VY                     400
 #define EX                     DX
 #define EY                     (VY - 44)
-#define TILEX                  32
-#define TILEY                  32
-#define MINI_TILEX             (TILEX / 2)
-#define MINI_TILEY             (TILEY / 2)
-#define MICRO_TILEX            (TILEX / 8)
-#define MICRO_TILEY            (TILEY / 8)
+#define TILESIZE               32
+#define TILEX                  TILESIZE
+#define TILEY                  TILESIZE
+#define MINI_TILESIZE          (TILESIZE / 2)
+#define MINI_TILEX             MINI_TILESIZE
+#define MINI_TILEY             MINI_TILESIZE
+#define MICRO_TILESIZE         (TILESIZE / 8)
+#define MICRO_TILEX            MICRO_TILESIZE
+#define MICRO_TILEY            MICRO_TILESIZE
 #define MIDPOSX                        (SCR_FIELDX / 2)
 #define MIDPOSY                        (SCR_FIELDY / 2)
 #define SXSIZE                 (SCR_FIELDX * TILEX)
 #define EYSIZE                 (VYSIZE + 44)
 #define FULL_SXSIZE            (2 + SXSIZE + 2)
 #define FULL_SYSIZE            (2 + SYSIZE + 2)
-#define MICROLEV_XSIZE         ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
-#define MICROLEV_YSIZE         ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
-#define MICROLEV_XPOS          (SX + (SXSIZE - MICROLEV_XSIZE) / 2)
-#define MICROLEV_YPOS          (SX + 12 * TILEY - MICRO_TILEY)
-#define MICROLABEL_YPOS                (MICROLEV_YPOS + MICROLEV_YSIZE + 7)
+#define MICROLEVEL_XSIZE       ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
+#define MICROLEVEL_YSIZE       ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
+#define MICROLEVEL_XPOS                (SX + (SXSIZE - MICROLEVEL_XSIZE) / 2)
+#define MICROLEVEL_YPOS                (SX + 12 * TILEY - MICRO_TILEY)
+#define MICROLABEL1_YPOS       (MICROLEVEL_YPOS - 36)
+#define MICROLABEL2_YPOS       (MICROLEVEL_YPOS + MICROLEVEL_YSIZE + 7)
 
 
 /* score for elements */
 
 /* the following EMC style elements are currently not implemented in R'n'D */
 #define EL_BALLOON_SWITCH_NONE         667
-#define EL_EM_GATE_5                   668
-#define EL_EM_GATE_6                   669
-#define EL_EM_GATE_7                   670
-#define EL_EM_GATE_8                   671
-#define EL_EM_GATE_5_GRAY              672
-#define EL_EM_GATE_6_GRAY              673
-#define EL_EM_GATE_7_GRAY              674
-#define EL_EM_GATE_8_GRAY              675
-#define EL_EM_KEY_5                    676
-#define EL_EM_KEY_6                    677
-#define EL_EM_KEY_7                    678
-#define EL_EM_KEY_8                    679
+#define EL_EMC_GATE_5                  668
+#define EL_EMC_GATE_6                  669
+#define EL_EMC_GATE_7                  670
+#define EL_EMC_GATE_8                  671
+#define EL_EMC_GATE_5_GRAY             672
+#define EL_EMC_GATE_6_GRAY             673
+#define EL_EMC_GATE_7_GRAY             674
+#define EL_EMC_GATE_8_GRAY             675
+#define EL_EMC_KEY_5                   676
+#define EL_EMC_KEY_6                   677
+#define EL_EMC_KEY_7                   678
+#define EL_EMC_KEY_8                   679
 #define EL_EMC_ANDROID                 680
 #define EL_EMC_GRASS                   681
 #define EL_EMC_MAGIC_BALL              682
-#define EL_EMC_MAGIC_BALL_SWITCH       683
-#define EL_EMC_SPRING_BUMPER           684
-#define EL_EMC_PLANT                   685
-#define EL_EMC_LENSES                  686
-#define EL_EMC_MAGNIFIER               687
-#define EL_EMC_WALL_9                  688
-#define EL_EMC_WALL_10                 689
-#define EL_EMC_WALL_11                 690
-#define EL_EMC_WALL_12                 691
-#define EL_EMC_WALL_13                 692
-#define EL_EMC_WALL_14                 693
-#define EL_EMC_WALL_15                 694
-#define EL_EMC_WALL_16                 695
-#define EL_EMC_WALL_SLIPPERY_1         696
-#define EL_EMC_WALL_SLIPPERY_2         697
-#define EL_EMC_WALL_SLIPPERY_3         698
-#define EL_EMC_WALL_SLIPPERY_4         699
-#define EL_EMC_DRIPPER                 700
-
-#define NUM_FILE_ELEMENTS              701
+#define EL_EMC_MAGIC_BALL_ACTIVE       683
+#define EL_EMC_MAGIC_BALL_SWITCH       684
+#define EL_EMC_MAGIC_BALL_SWITCH_ACTIVE        685
+#define EL_EMC_SPRING_BUMPER           686
+#define EL_EMC_PLANT                   687
+#define EL_EMC_LENSES                  688
+#define EL_EMC_MAGNIFIER               689
+#define EL_EMC_WALL_9                  690
+#define EL_EMC_WALL_10                 691
+#define EL_EMC_WALL_11                 692
+#define EL_EMC_WALL_12                 693
+#define EL_EMC_WALL_13                 694
+#define EL_EMC_WALL_14                 695
+#define EL_EMC_WALL_15                 696
+#define EL_EMC_WALL_16                 697
+#define EL_EMC_WALL_SLIPPERY_1         698
+#define EL_EMC_WALL_SLIPPERY_2         699
+#define EL_EMC_WALL_SLIPPERY_3         700
+#define EL_EMC_WALL_SLIPPERY_4         701
+#define EL_EMC_FAKE_GRASS              702
+#define EL_EMC_FAKE_ACID               703
+#define EL_EMC_DRIPPER                 704
+
+#define NUM_FILE_ELEMENTS              705
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define ACTION_TURNING_FROM_RIGHT      44
 #define ACTION_TURNING_FROM_UP         45
 #define ACTION_TURNING_FROM_DOWN       46
-#define ACTION_OTHER                   47
+#define ACTION_SMASHED_BY_ROCK         47
+#define ACTION_SMASHED_BY_SPRING       48
+#define ACTION_SLURPED_BY_SPRING       49
+#define ACTION_TWINKLING               50
+#define ACTION_SPLASHING               51
+#define ACTION_OTHER                   52
 
-#define NUM_ACTIONS                    48
+#define NUM_ACTIONS                    53
 
 #define ACTION_BORING_LAST             ACTION_BORING_10
 #define ACTION_SLEEPING_LAST           ACTION_SLEEPING_3
 #define GFX_ARG_YPOS                   3
 #define GFX_ARG_WIDTH                  4
 #define GFX_ARG_HEIGHT                 5
-#define GFX_ARG_OFFSET                 6
-#define GFX_ARG_VERTICAL               7
+#define GFX_ARG_VERTICAL               6
+#define GFX_ARG_OFFSET                 7
 #define GFX_ARG_XOFFSET                        8
 #define GFX_ARG_YOFFSET                        9
-#define GFX_ARG_FRAMES                 10
-#define GFX_ARG_FRAMES_PER_LINE                11
-#define GFX_ARG_START_FRAME            12
-#define GFX_ARG_DELAY                  13
-#define GFX_ARG_ANIM_MODE              14
-#define GFX_ARG_GLOBAL_SYNC            15
-#define GFX_ARG_CRUMBLED_LIKE          16
-#define GFX_ARG_DIGGABLE_LIKE          17
-#define GFX_ARG_BORDER_SIZE            18
-#define GFX_ARG_STEP_OFFSET            19
-#define GFX_ARG_STEP_DELAY             20
-#define GFX_ARG_DIRECTION              21
-#define GFX_ARG_POSITION               22
-#define GFX_ARG_DRAW_XOFFSET           23
-#define GFX_ARG_DRAW_YOFFSET           24
-#define GFX_ARG_DRAW_MASKED            25
-#define GFX_ARG_ANIM_DELAY_FIXED       26
-#define GFX_ARG_ANIM_DELAY_RANDOM      27
-#define GFX_ARG_POST_DELAY_FIXED       28
-#define GFX_ARG_POST_DELAY_RANDOM      29
-#define GFX_ARG_NAME                   30
-#define GFX_ARG_SCALE_UP_FACTOR                31
-
-#define NUM_GFX_ARGS                   32
+#define GFX_ARG_2ND_MOVEMENT_TILE      10
+#define GFX_ARG_2ND_VERTICAL           11
+#define GFX_ARG_2ND_OFFSET             12
+#define GFX_ARG_2ND_XOFFSET            13
+#define GFX_ARG_2ND_YOFFSET            14
+#define GFX_ARG_2ND_SWAP_TILES         15      
+#define GFX_ARG_FRAMES                 16
+#define GFX_ARG_FRAMES_PER_LINE                17
+#define GFX_ARG_START_FRAME            18
+#define GFX_ARG_DELAY                  19
+#define GFX_ARG_ANIM_MODE              20
+#define GFX_ARG_GLOBAL_SYNC            21
+#define GFX_ARG_CRUMBLED_LIKE          22
+#define GFX_ARG_DIGGABLE_LIKE          23
+#define GFX_ARG_BORDER_SIZE            24
+#define GFX_ARG_STEP_OFFSET            25
+#define GFX_ARG_STEP_DELAY             26
+#define GFX_ARG_DIRECTION              27
+#define GFX_ARG_POSITION               28
+#define GFX_ARG_DRAW_XOFFSET           29
+#define GFX_ARG_DRAW_YOFFSET           30
+#define GFX_ARG_DRAW_MASKED            31
+#define GFX_ARG_ANIM_DELAY_FIXED       32
+#define GFX_ARG_ANIM_DELAY_RANDOM      33
+#define GFX_ARG_POST_DELAY_FIXED       34
+#define GFX_ARG_POST_DELAY_RANDOM      35
+#define GFX_ARG_NAME                   36
+#define GFX_ARG_SCALE_UP_FACTOR                37
+
+#define NUM_GFX_ARGS                   38
 
 
 /* values for sound configuration suffixes */
 /* program information and versioning definitions */
 
 #define PROGRAM_VERSION_MAJOR          3
-#define PROGRAM_VERSION_MINOR          1
-#define PROGRAM_VERSION_PATCH          1
-#define PROGRAM_VERSION_BUILD          0
+#define PROGRAM_VERSION_MINOR          2
+#define PROGRAM_VERSION_PATCH          0
+#define PROGRAM_VERSION_BUILD          2
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
 
 struct MenuInfo
 {
-  int draw_xoffset_default;
-  int draw_yoffset_default;
   int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
   int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
 
   int scrollbar_xoffset;
 
-  int list_size_default;
   int list_size[NUM_SPECIAL_GFX_ARGS];
 
   int sound[NUM_SPECIAL_GFX_ARGS];
@@ -1510,7 +1559,7 @@ struct PlayerInfo
   int sokobanfields_still_needed;
   int lights_still_needed;
   int friends_still_needed;
-  int key[4];
+  int key[MAX_NUM_KEYS];
   int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl;
   int shield_normal_time_left;
   int shield_deadly_time_left;
@@ -1889,6 +1938,9 @@ struct GraphicInfo
   int src_x, src_y;            /* start position of animation frames */
   int width, height;           /* width/height of each animation frame */
   int offset_x, offset_y;      /* x/y offset to next animation frame */
+  int offset2_x, offset2_y;    /* x/y offset to second movement tile */
+  boolean double_movement;     /* animation has second movement tile */
+  int swap_double_tiles;       /* explicitely force or forbid tile swapping */
   int anim_frames;
   int anim_frames_per_line;
   int anim_start_frame;