rnd-20040129-1-src
[rocksndiamonds.git] / src / main.h
index 9756b100ae983bcad19844ebbe2a084f44711dd0..9d78b18a008fdf70bded85d3c9fdaea6cbce07db 100644 (file)
 #define MV_BIT_TURNING_LEFT_RIGHT 14
 #define MV_BIT_TURNING_RIGHT_LEFT 15
 #define MV_BIT_TURNING_RANDOM  16
+#define MV_BIT_PREVIOUS                17
 
 /* values for special move patterns for custom elements */
 #define MV_HORIZONTAL          (MV_LEFT | MV_RIGHT)
 #define MV_VERTICAL            (MV_UP | MV_DOWN)
 #define MV_ALL_DIRECTIONS      (MV_HORIZONTAL | MV_VERTICAL)
 #define MV_ANY_DIRECTION       (MV_ALL_DIRECTIONS)
+#define MV_RANDOM              (MV_ALL_DIRECTIONS)
+#define MV_AUTOMATIC           (MV_NO_MOVING)
 #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 MV_TURNING_LEFT_RIGHT  (1 << MV_BIT_TURNING_LEFT_RIGHT)
 #define MV_TURNING_RIGHT_LEFT  (1 << MV_BIT_TURNING_RIGHT_LEFT)
 #define MV_TURNING_RANDOM      (1 << MV_BIT_TURNING_RANDOM)
+#define MV_PREVIOUS            (1 << MV_BIT_PREVIOUS)
+
+/* values for elements left behind by custom elements */
+#define LEAVE_TYPE_UNLIMITED   0
+#define LEAVE_TYPE_LIMITED     1
 
 /* values for slippery property for custom elements */
 #define SLIPPERY_ANY_RANDOM    0
 #define EL_DARK_YAMYAM                 60
 #define EL_BD_MAGIC_WALL               61
 #define EL_INVISIBLE_STEELWALL         62
-
-#define EL_UNUSED_63                   63
-
+#define EL_SOKOBAN_FIELD_PLAYER                63
 #define EL_DYNABOMB_INCREASE_NUMBER    64
 #define EL_DYNABOMB_INCREASE_SIZE      65
 #define EL_DYNABOMB_INCREASE_POWER     66
 #define EL_EXPANDABLE_WALL_GROWING     (EL_FIRST_RUNTIME_UNREAL + 8)
 #define EL_FLAMES                      (EL_FIRST_RUNTIME_UNREAL + 9)
 #define EL_PLAYER_IS_LEAVING           (EL_FIRST_RUNTIME_UNREAL + 10)
-#define EL_QUICKSAND_FILLING           (EL_FIRST_RUNTIME_UNREAL + 11)
-#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 12)
-#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 13)
+#define EL_PLAYER_IS_EXPLODING_1       (EL_FIRST_RUNTIME_UNREAL + 11)
+#define EL_PLAYER_IS_EXPLODING_2       (EL_FIRST_RUNTIME_UNREAL + 12)
+#define EL_PLAYER_IS_EXPLODING_3       (EL_FIRST_RUNTIME_UNREAL + 13)
+#define EL_PLAYER_IS_EXPLODING_4       (EL_FIRST_RUNTIME_UNREAL + 14)
+#define EL_QUICKSAND_FILLING           (EL_FIRST_RUNTIME_UNREAL + 15)
+#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 16)
+#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 17)
 
 /* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 14)
+#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 18)
 
 #define EL_STEELWALL_TOPLEFT                   (EL_FIRST_DUMMY + 0)
 #define EL_STEELWALL_TOPRIGHT                  (EL_FIRST_DUMMY + 1)
 #define EL_BD_DEFAULT                          (EL_FIRST_DUMMY + 22)
 #define EL_SP_DEFAULT                          (EL_FIRST_DUMMY + 23)
 #define EL_SB_DEFAULT                          (EL_FIRST_DUMMY + 24)
-#define EL_DUMMY                               (EL_FIRST_DUMMY + 25)
 
-#define MAX_NUM_ELEMENTS                       (EL_FIRST_DUMMY + 26)
+/* 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 MAX_NUM_ELEMENTS                       (EL_FIRST_INTERNAL + 2)
 
 
 /* values for graphics/sounds action types */
@@ -1307,6 +1322,8 @@ struct LevelFileInfo
 {
   int nr;
   int type;
+  boolean packed;
+  char *basename;
   char *filename;
 };
 
@@ -1466,10 +1483,16 @@ struct ElementGroupInfo
   int num_elements;                    /* number of elements in this group */
   short element[MAX_ELEMENTS_IN_GROUP];        /* list of elements in this group */
 
+  int choice_mode;             /* how to choose element from group */
+
+  /* ---------- internal values used at runtime when playing ---------- */
+
   /* the following is the same as above, but with recursively resolved group
      elements (group elements may also contain further group elements!) */
   int num_elements_resolved;
   short element_resolved[NUM_FILE_ELEMENTS];
+
+  int choice_pos;              /* current element choice position */
 };
 
 struct ElementInfo
@@ -1515,6 +1538,7 @@ struct ElementInfo
   int move_stepsize;           /* step size element moves with */
   int move_enter_element;      /* element that can be entered (and removed) */
   int move_leave_element;      /* element that can be left behind */
+  int move_leave_type;         /* change (limited) or leave (unlimited) */
 
   int slippery_type;           /* how/where other elements slip away */
 
@@ -1537,6 +1561,9 @@ struct ElementInfo
 
   boolean in_group[NUM_GROUP_ELEMENTS];
 
+  boolean can_leave_element;   /* element can leave other element behind */
+  boolean can_leave_element_last;
+
   /* ---------- internal values used in level editor ---------- */
 
   int access_type;             /* walkable or passable */