rnd-20060128-1-src
[rocksndiamonds.git] / src / main.h
index 6032e7779325562e9f71b0d49d3bab2099648bf1..e00a76ffb01938bc653ead273474e0a619d61f37 100644 (file)
 #define EP_KEYGATE                     49
 #define EP_AMOEBOID                    50
 #define EP_AMOEBALIVE                  51
-#define EP_HAS_CONTENT                 52
+#define EP_HAS_EDITOR_CONTENT          52
 #define EP_CAN_TURN_EACH_MOVE          53
 #define EP_CAN_GROW                    54
 #define EP_ACTIVE_BOMB                 55
 #define CE_SNAPPED_BY_PLAYER           33
 #define CE_PLAYER_SNAPS_X              34
 #define CE_MOVE_OF_X                   35
+#define CE_DIGGING_X                   36
+#define CE_CREATION_OF_X               37
 
-#define NUM_CHANGE_EVENTS              36
+#define NUM_CHANGE_EVENTS              38
 
 #define CE_BITMASK_DEFAULT             0
 
 #define MV_BIT_PREVIOUS                        4
 #define MV_BIT_TRIGGER                 5
 #define MV_BIT_TRIGGER_BACK            6
+#define MV_BIT_NORMAL                  MV_BIT_TRIGGER
+#define MV_BIT_REVERSE                 MV_BIT_TRIGGER_BACK
 
 #define MV_PREVIOUS                    (1 << MV_BIT_PREVIOUS)
 #define MV_TRIGGER                     (1 << MV_BIT_TRIGGER)
 #define MV_TRIGGER_BACK                        (1 << MV_BIT_TRIGGER_BACK)
+#define MV_NORMAL                      (1 << MV_BIT_NORMAL)
+#define MV_REVERSE                     (1 << MV_BIT_REVERSE)
+
+/* values for move stepsize */
+#define STEPSIZE_NOT_MOVING            0
+#define STEPSIZE_VERY_SLOW             1
+#define STEPSIZE_SLOW                  2
+#define STEPSIZE_NORMAL                        4
+#define STEPSIZE_FAST                  8
+#define STEPSIZE_VERY_FAST             16
+#define STEPSIZE_EVEN_FASTER           32
+#define STEPSIZE_SLOWER                        50      /* (symbolic value only) */
+#define STEPSIZE_FASTER                        200     /* (symbolic value only) */
+#define STEPSIZE_RESET                 100     /* (symbolic value only) */
 
 /* values for change side for custom elements */
 #define CH_SIDE_NONE                   MV_NONE
 #define CA_SET_PLAYER_ARTWORK          14
 #define CA_SET_CE_SCORE                        15
 #define CA_SET_CE_VALUE                        16
+#define CA_SET_ENGINE_SCAN_MODE                17
 
 #define CA_HEADLINE_LEVEL_ACTIONS      250
 #define CA_HEADLINE_PLAYER_ACTIONS     251
 #define CA_HEADLINE_CE_ACTIONS         252
+#define CA_HEADLINE_ENGINE_ACTIONS     253
 #define CA_UNDEFINED                   255
 
 /* values for change action mode for custom elements */
 #define CA_ARG_ELEMENT_TRIGGER         (CA_ARG_ELEMENT + 2)
 #define CA_ARG_ELEMENT_HEADLINE                (CA_ARG_ELEMENT + 999)
 #define CA_ARG_SPEED                   13000
-#define CA_ARG_SPEED_NOT_MOVING                (CA_ARG_SPEED + 0)
-#define CA_ARG_SPEED_VERY_SLOW         (CA_ARG_SPEED + 1)
-#define CA_ARG_SPEED_SLOW              (CA_ARG_SPEED + 2)
-#define CA_ARG_SPEED_NORMAL            (CA_ARG_SPEED + 4)
-#define CA_ARG_SPEED_FAST              (CA_ARG_SPEED + 8)
-#define CA_ARG_SPEED_VERY_FAST         (CA_ARG_SPEED + 16)
-#define CA_ARG_SPEED_EVEN_FASTER       (CA_ARG_SPEED + 32)
-#define CA_ARG_SPEED_SLOWER            (CA_ARG_SPEED + 50)
-#define CA_ARG_SPEED_FASTER            (CA_ARG_SPEED + 200)
-#define CA_ARG_SPEED_RESET             (CA_ARG_SPEED + 100)
+#define CA_ARG_SPEED_NOT_MOVING                (CA_ARG_SPEED + STEPSIZE_NOT_MOVING)
+#define CA_ARG_SPEED_VERY_SLOW         (CA_ARG_SPEED + STEPSIZE_VERY_SLOW)
+#define CA_ARG_SPEED_SLOW              (CA_ARG_SPEED + STEPSIZE_SLOW)
+#define CA_ARG_SPEED_NORMAL            (CA_ARG_SPEED + STEPSIZE_NORMAL)
+#define CA_ARG_SPEED_FAST              (CA_ARG_SPEED + STEPSIZE_FAST)
+#define CA_ARG_SPEED_VERY_FAST         (CA_ARG_SPEED + STEPSIZE_VERY_FAST)
+#define CA_ARG_SPEED_EVEN_FASTER       (CA_ARG_SPEED + STEPSIZE_EVEN_FASTER)
+#define CA_ARG_SPEED_SLOWER            (CA_ARG_SPEED + STEPSIZE_SLOWER)
+#define CA_ARG_SPEED_FASTER            (CA_ARG_SPEED + STEPSIZE_FASTER)
+#define CA_ARG_SPEED_RESET             (CA_ARG_SPEED + STEPSIZE_RESET)
 #define CA_ARG_SPEED_HEADLINE          (CA_ARG_SPEED + 999)
 #define CA_ARG_GRAVITY                 14000
 #define CA_ARG_GRAVITY_OFF             (CA_ARG_GRAVITY + 0)
 #define CA_ARG_SHIELD_NORMAL           (CA_ARG_SHIELD + 1)
 #define CA_ARG_SHIELD_DEADLY           (CA_ARG_SHIELD + 2)
 #define CA_ARG_SHIELD_HEADLINE         (CA_ARG_SHIELD + 999)
-#define CA_ARG_UNDEFINED               19999
+#define CA_ARG_SCAN_MODE               17000
+#define CA_ARG_SCAN_MODE_NORMAL                (CA_ARG_SCAN_MODE + MV_NORMAL)
+#define CA_ARG_SCAN_MODE_REVERSE       (CA_ARG_SCAN_MODE + MV_REVERSE)
+#define CA_ARG_SCAN_MODE_HEADLINE      (CA_ARG_SCAN_MODE + 999)
+#define CA_ARG_UNDEFINED               65535
 
 /* values for custom move patterns (bits 0 - 3: basic move directions) */
 #define MV_BIT_TOWARDS_PLAYER          4
 #define IS_KEYGATE(e)          HAS_PROPERTY(e, EP_KEYGATE)
 #define IS_AMOEBOID(e)         HAS_PROPERTY(e, EP_AMOEBOID)
 #define IS_AMOEBALIVE(e)       HAS_PROPERTY(e, EP_AMOEBALIVE)
-#define HAS_CONTENT(e)         HAS_PROPERTY(e, EP_HAS_CONTENT)
+#define HAS_EDITOR_CONTENT(e)  HAS_PROPERTY(e, EP_HAS_EDITOR_CONTENT)
 #define CAN_TURN_EACH_MOVE(e)  HAS_PROPERTY(e, EP_CAN_TURN_EACH_MOVE)
 #define CAN_GROW(e)            HAS_PROPERTY(e, EP_CAN_GROW)
 #define IS_ACTIVE_BOMB(e)      HAS_PROPERTY(e, EP_ACTIVE_BOMB)
 #define EL_CASCADE_TOGGLE(e)   (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 :    \
                                 IS_EDITOR_CASCADE_ACTIVE(e)   ? (e) - 1 : (e))
 
+#define EL_NAME(e)             (element_info[e].token_name)
 
 /* fundamental game speed values */
 #define ONE_SECOND_DELAY       1000    /* delay value for one second */
 #define MAX_CHANGE_PAGES       32
 #define MIN_ELEMENTS_IN_GROUP  1
 #define MAX_ELEMENTS_IN_GROUP  16
+#define MIN_ANDROID_ELEMENTS   1
+#define MAX_ANDROID_ELEMENTS   16
 
 /* values for elements with content */
 #define MIN_ELEMENT_CONTENTS   1
 #define EL_EMC_GATE_7_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 56)
 #define EL_EMC_GATE_8_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 57)
 #define EL_EMC_DRIPPER_ACTIVE          (EL_FIRST_RUNTIME_REAL + 58)
+#define EL_EMC_SPRING_BUMPER_ACTIVE    (EL_FIRST_RUNTIME_REAL + 59)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 59)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 60)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
 #define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 16)
 #define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 17)
 #define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 18)
+#define EL_DIAGONAL_SHRINKING          (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_DIAGONAL_GROWING            (EL_FIRST_RUNTIME_UNREAL + 20)
 
 /* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 21)
 
 #define EL_STEELWALL_TOPLEFT           (EL_FIRST_DUMMY + 0)
 #define EL_STEELWALL_TOPRIGHT          (EL_FIRST_DUMMY + 1)
 
 
 /* program information and versioning definitions */
-
-#define RELEASE_3_1_2                  FALSE
-
-#if RELEASE_3_1_2
-#define PROGRAM_VERSION_MAJOR          3
-#define PROGRAM_VERSION_MINOR          1
-#define PROGRAM_VERSION_PATCH          2
-#define PROGRAM_VERSION_BUILD          0
-#else
-/* !!! make sure that packaging script can find unique version number !!! */
 #define PROGRAM_VERSION_MAJOR          3
 #define PROGRAM_VERSION_MINOR          2
 #define PROGRAM_VERSION_PATCH          0
-#define PROGRAM_VERSION_BUILD          6
-#endif
+#define PROGRAM_VERSION_BUILD          7
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
@@ -1703,6 +1722,8 @@ struct MenuInfo
 
 struct DoorInfo
 {
+  int width;
+  int height;
   int step_offset;
   int step_delay;
   int anim_mode;
@@ -1908,13 +1929,18 @@ struct LevelInfo
   struct Content ball_content[MAX_ELEMENT_CONTENTS];
   int num_ball_contents;
 
+#if 0
   boolean android_array[16];
 #endif
+  int num_android_clone_elements;
+  int android_clone_element[MAX_ANDROID_ELEMENTS];
+#endif
 
   int can_move_into_acid_bits; /* bitfield to store property for elements */
   int dont_collide_with_bits;  /* bitfield to store property for elements */
 
-  boolean double_speed;
+  int initial_player_stepsize; /* initial player speed */
+
   boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
   boolean use_spring_bug;      /* for compatibility with old levels */
@@ -1993,6 +2019,7 @@ struct GameInfo
   boolean use_change_when_pushing_bug;
   boolean use_block_last_field_bug;
   boolean max_num_changes_per_frame;
+  boolean use_reverse_scan_direction;
 
   /* variable within running game */
   int yamyam_content_nr;
@@ -2012,6 +2039,8 @@ struct GameInfo
   /* values for the new EMC elements */
   int lenses_time_left;
   int magnify_time_left;
+  boolean ball_state;
+  int ball_content_nr;
 #endif
 
   /* values for player idle animation (no effect on engine) */
@@ -2132,11 +2161,11 @@ struct ElementInfo
   /* ---------- graphic and sound definitions ---------- */
 
   int graphic[NUM_ACTIONS];    /* default graphics for several actions */
-  int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
+  int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS_FULL];
                                /* special graphics for left/right/up/down */
 
   int crumbled[NUM_ACTIONS];   /* crumbled graphics for several actions */
-  int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS];
+  int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS_FULL];
                                /* crumbled graphics for left/right/up/down */
 
   int special_graphic[NUM_SPECIAL_GFX_ARGS];