rnd-20040322-B-src
[rocksndiamonds.git] / src / main.h
index b483378e3e9441bfd6aa7b068256ac3c73505da6..682f9247774e054e111439d9f17556845f1015b1 100644 (file)
@@ -86,7 +86,7 @@
 #define EP_DROPPABLE           22
 #define EP_CAN_EXPLODE_1X1     23
 #define EP_PUSHABLE            24
-#define EP_CAN_EXPLODE_DYNA    25
+#define EP_CAN_EXPLODE_CROSS   25
 #define EP_PROTECTED           26
 #define EP_CAN_MOVE_INTO_ACID  27
 
 #define EP_CAN_EXPLODE         70
 #define EP_CAN_EXPLODE_3X3     71
 #define EP_SP_PORT             72
-#define EP_CAN_EXPLODE_BY_DRAGONFIRE 73
-#define EP_CAN_EXPLODE_BY_EXPLOSION  74
-#define EP_COULD_MOVE_INTO_ACID        75
+#define EP_CAN_EXPLODE_BY_DRAGONFIRE   73
+#define EP_CAN_EXPLODE_BY_EXPLOSION    74
+#define EP_COULD_MOVE_INTO_ACID                75
+#define EP_MAYBE_DONT_COLLIDE_WITH     76
 
 /* values for internal purpose only (level editor) */
-#define EP_EXPLODE_RESULT      76
-#define EP_WALK_TO_OBJECT      77
-#define EP_DEADLY              78
+#define EP_EXPLODE_RESULT      77
+#define EP_WALK_TO_OBJECT      78
+#define EP_DEADLY              79
 
-#define NUM_ELEMENT_PROPERTIES 79
+#define NUM_ELEMENT_PROPERTIES 80
 
 #define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE       0
 #define CH_PAGE_ANY            (0xffffffff)
 
 /* values for change power for custom elements */
-#define CP_NON_DESTRUCTIVE     0
-#define CP_HALF_DESTRUCTIVE    1
-#define CP_FULL_DESTRUCTIVE    2
+#define CP_WHEN_EMPTY          0
+#define CP_WHEN_DIGGABLE       1
+#define CP_WHEN_DESTRUCTIBLE   2
 
 /* values for custom move patterns (bits 0 - 3: basic move directions) */
 #define MV_BIT_TOWARDS_PLAYER  4
 #define IS_DROPPABLE(e)                HAS_PROPERTY(e, EP_DROPPABLE)
 #define CAN_EXPLODE_1X1(e)     HAS_PROPERTY(e, EP_CAN_EXPLODE_1X1)
 #define IS_PUSHABLE(e)         HAS_PROPERTY(e, EP_PUSHABLE)
-#define CAN_EXPLODE_DYNA(e)    HAS_PROPERTY(e, EP_CAN_EXPLODE_DYNA)
+#define CAN_EXPLODE_CROSS(e)   HAS_PROPERTY(e, EP_CAN_EXPLODE_CROSS)
 #define IS_PROTECTED(e)                HAS_PROPERTY(e, EP_PROTECTED)
 #define CAN_MOVE_INTO_ACID(e)  HAS_PROPERTY(e, EP_CAN_MOVE_INTO_ACID)
 
 #define CAN_EXPLODE_BY_EXPLOSION(e)    \
                                HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_EXPLOSION)
 #define COULD_MOVE_INTO_ACID(e)        HAS_PROPERTY(e, EP_COULD_MOVE_INTO_ACID)
+#define MAYBE_DONT_COLLIDE_WITH(e)  HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH)
 
 /* special macros used in game engine */
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
 #define IS_GROUP_ELEMENT(e)    ((e) >= EL_GROUP_START &&               \
                                 (e) <= EL_GROUP_END)
 
+#define IS_CLIPBOARD_ELEMENT(e)        ((e) >= EL_INTERNAL_CLIPBOARD_START &&  \
+                                (e) <= EL_INTERNAL_CLIPBOARD_END)
+
+#define IS_INTERNAL_ELEMENT(e) ((e) >= EL_INTERNAL_START &&            \
+                                (e) <= EL_INTERNAL_END)
+
 #define IS_ENVELOPE(e)         ((e) >= EL_ENVELOPE_1 &&                \
                                 (e) <= EL_ENVELOPE_4)
 
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
 
-#define IS_PLAYER(x,y)         (ELEM_IS_PLAYER(StorePlayer[x][y]))
+#define IS_PLAYER(x, y)                (ELEM_IS_PLAYER(StorePlayer[x][y]))
 
-#define IS_FREE(x,y)           (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x,y))
-#define IS_FREE_OR_PLAYER(x,y) (Feld[x][y] == EL_EMPTY)
+#define IS_FREE(x, y)          (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x, y))
+#define IS_FREE_OR_PLAYER(x, y)        (Feld[x][y] == EL_EMPTY)
 
 #define IS_MOVING(x,y)         (MovPos[x][y] != 0)
 #define IS_FALLING(x,y)                (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN)
 /* ---------- end of custom elements section ------------------------------- */
 
 #define EL_UNKNOWN                     656
+#define EL_TRIGGER_ELEMENT             657
+#define EL_TRIGGER_PLAYER              658
 
-#define NUM_FILE_ELEMENTS              657
+#define NUM_FILE_ELEMENTS              659
 
 
 /* "real" (and therefore drawable) runtime elements */
 /* internal elements (only used for internal purposes like copying) */
 #define EL_FIRST_INTERNAL                      (EL_FIRST_DUMMY + 25)
 
-#define EL_INTERNAL_EDITOR                     (EL_FIRST_INTERNAL + 0)
-#define EL_INTERNAL_DUMMY                      (EL_FIRST_INTERNAL + 1)
+#define EL_INTERNAL_CLIPBOARD_CUSTOM           (EL_FIRST_INTERNAL + 0)
+#define EL_INTERNAL_CLIPBOARD_CHANGE           (EL_FIRST_INTERNAL + 1)
+#define EL_INTERNAL_CLIPBOARD_GROUP            (EL_FIRST_INTERNAL + 2)
+#define EL_INTERNAL_DUMMY                      (EL_FIRST_INTERNAL + 3)
 
-#define MAX_NUM_ELEMENTS                       (EL_FIRST_INTERNAL + 2)
+#define EL_INTERNAL_CLIPBOARD_START            (EL_FIRST_INTERNAL + 0)
+#define EL_INTERNAL_CLIPBOARD_END              (EL_FIRST_INTERNAL + 2)
+#define EL_INTERNAL_START                      (EL_FIRST_INTERNAL + 0)
+#define EL_INTERNAL_END                                (EL_FIRST_INTERNAL + 3)
+
+#define MAX_NUM_ELEMENTS                       (EL_FIRST_INTERNAL + 4)
 
 
 /* values for graphics/sounds action types */
 /* program information and versioning definitions */
 
 #define PROGRAM_VERSION_MAJOR  3
-#define PROGRAM_VERSION_MINOR  0
-#define PROGRAM_VERSION_PATCH  9
-#define PROGRAM_VERSION_BUILD  0
+#define PROGRAM_VERSION_MINOR  1
+#define PROGRAM_VERSION_PATCH  0
+#define PROGRAM_VERSION_BUILD  2
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
@@ -1313,6 +1330,7 @@ struct PlayerInfo
   boolean use_murphy_graphic;
 
   boolean block_last_field;
+  boolean can_fall_into_acid;
 
   boolean LevelSolved, GameOver;
 
@@ -1423,7 +1441,8 @@ struct LevelInfo
   int time_light;
   int time_timegate;
 
-  int can_move_into_acid_bits; /* bits indicate property for element groups */
+  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;
   boolean initial_gravity;
@@ -1431,7 +1450,9 @@ struct LevelInfo
   boolean block_last_field;    /* player blocks previous field while moving */
   boolean sp_block_last_field; /* player blocks previous field while moving */
   boolean use_spring_bug;      /* for compatibility with old levels */
+  boolean instant_relocation;  /* no visual delay when relocating player */
 
+  /* ('int' instead of 'boolean' because used as selectbox value in editor) */
   int use_step_counter;                /* count steps instead of seconds for level */
 
   short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -1458,7 +1479,8 @@ struct TapeInfo
   boolean pause_before_death;
   boolean recording, playing, pausing;
   boolean fast_forward;
-  boolean index_search;
+  boolean warp_forward;
+  boolean deactivate_display;
   boolean auto_play;
   boolean auto_play_level_solved;
   boolean quick_resume;
@@ -1538,23 +1560,28 @@ struct ElementChangeInfo
   int delay_random;            /* added frame delay before changed (random) */
   int delay_frames;            /* either 1 (frames) or 50 (seconds; 50 fps) */
 
-  short trigger_element;       /* custom element triggering change */
+  short trigger_element;       /* element triggering change */
 
-  int content[3][3];           /* new elements after extended change */
-  boolean use_content;         /* use extended change content */
-  boolean only_complete;       /* only use complete content */
-  boolean use_random_change;   /* use random value for setting content */
-  int random;                  /* random value for setting content */
-  int power;                   /* power of extended change */
+  int target_content[3][3];    /* elements for extended change target */
+  boolean use_target_content;  /* use extended change target */
+  boolean only_if_complete;    /* only use complete target content */
+  boolean use_random_replace;  /* use random value for replacing elements */
+  int random_percentage;       /* random value for replacing elements */
+  int replace_when;            /* type of elements that can be replaced */
 
   boolean explode;             /* explode instead of change */
 
+  /* ---------- internal values used at runtime when playing ---------- */
+
   /* functions that are called before, while and after the change of an
      element -- currently only used for non-custom elements */
   void (*pre_change_function)(int x, int y);
   void (*change_function)(int x, int y);
   void (*post_change_function)(int x, int y);
 
+  short actual_trigger_element;        /* element that actually triggered change */
+  int actual_trigger_player;   /* player which actually triggered change */
+
   /* ---------- internal values used in level editor ---------- */
 
   int direct_action;           /* change triggered by actions on element */
@@ -1613,10 +1640,12 @@ struct ElementInfo
   int collect_score;           /* score value for collecting */
   int collect_count;           /* count value for collecting */
 
-  int push_delay_fixed;                /* constant frame delay for pushing */
-  int push_delay_random;       /* additional random frame delay for pushing */
-  int move_delay_fixed;                /* constant frame delay for moving */
-  int move_delay_random;       /* additional random frame delay for moving */
+  int push_delay_fixed;                /* constant delay before pushing */
+  int push_delay_random;       /* additional random delay before pushing */
+  int drop_delay_fixed;                /* constant delay after dropping */
+  int drop_delay_random;       /* additional random delay after dropping */
+  int move_delay_fixed;                /* constant delay after moving */
+  int move_delay_random;       /* additional random delay after moving */
 
   int move_pattern;            /* direction movable element moves to */
   int move_direction_initial;  /* initial direction element moves to */
@@ -1649,8 +1678,10 @@ struct ElementInfo
 
   boolean in_group[NUM_GROUP_ELEMENTS];
 
+#if 0
   boolean can_leave_element;   /* element can leave other element behind */
   boolean can_leave_element_last;
+#endif
 
   /* ---------- internal values used in level editor ---------- */