rnd-20040205-1-src
[rocksndiamonds.git] / src / main.h
index 062c7a603bb9b8b38003f3635262f89968cdaef8..f11fc730d582ea0a2781c2e3b7dfecd5fdf5fdb8 100644 (file)
@@ -87,6 +87,7 @@
 #define EP_CAN_EXPLODE_1X1     23
 #define EP_PUSHABLE            24
 #define EP_CAN_EXPLODE_DYNA    25
+#define EP_PROTECTED           26
 
 /* values for pre-defined properties */
 #define EP_PLAYER              32
 #define EP_CAN_SMASH           69
 #define EP_CAN_EXPLODE         70
 #define EP_CAN_EXPLODE_3X3     71
+#define EP_SP_PORT             72
 
 /* values for internal purpose only (level editor) */
-#define EP_EXPLODE_RESULT      72
-#define EP_WALK_TO_OBJECT      73
-#define EP_DEADLY              74
+#define EP_EXPLODE_RESULT      73
+#define EP_WALK_TO_OBJECT      74
+#define EP_DEADLY              75
 
-#define NUM_ELEMENT_PROPERTIES 75
+#define NUM_ELEMENT_PROPERTIES 76
 
 #define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE       0
 #define CP_HALF_DESTRUCTIVE    1
 #define CP_FULL_DESTRUCTIVE    2
 
-/* values for special move patterns (bits 0-3: basic move directions) */
+/* values for custom move patterns (bits 0 - 3: basic move directions) */
 #define MV_BIT_TOWARDS_PLAYER  4
 #define MV_BIT_AWAY_FROM_PLAYER        5
 #define MV_BIT_ALONG_LEFT_SIDE 6
 #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 */
+/* values for custom move patterns */
 #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 initial move direction (bits 0 - 3: basic move directions) */
+#define MV_START_BIT_PREVIOUS  4
+
+/* values for initial move direction */
+#define MV_START_AUTOMATIC     (MV_NO_MOVING)
+#define MV_START_LEFT          (MV_LEFT)
+#define MV_START_RIGHT         (MV_RIGHT)
+#define MV_START_UP            (MV_UP)
+#define MV_START_DOWN          (MV_DOWN)
+#define MV_START_RANDOM                (MV_ALL_DIRECTIONS)
+#define MV_START_PREVIOUS      (1 << MV_START_BIT_PREVIOUS)
 
 /* values for elements left behind by custom elements */
 #define LEAVE_TYPE_UNLIMITED   0
 #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 IS_PROTECTED(e)                HAS_PROPERTY(e, EP_PROTECTED)
 
 /* macros for special configurable properties */
 #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
 #define CAN_SMASH(e)           HAS_PROPERTY(e, EP_CAN_SMASH)
 #define CAN_EXPLODE(e)         HAS_PROPERTY(e, EP_CAN_EXPLODE)
 #define CAN_EXPLODE_3X3(e)     HAS_PROPERTY(e, EP_CAN_EXPLODE_3X3)
+#define IS_SP_PORT(e)          HAS_PROPERTY(e, EP_SP_PORT)
 
 /* special macros used in game engine */
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
 
 
 /* fundamental game speed values */
+#define ONE_SECOND_DELAY       1000    /* delay value for one second */
 #define GAME_FRAME_DELAY       20      /* frame delay in milliseconds */
 #define FFWD_FRAME_DELAY       10      /* 200% speed for fast forward */
-#define FRAMES_PER_SECOND      (1000 / GAME_FRAME_DELAY)
+#define FRAMES_PER_SECOND      (ONE_SECOND_DELAY / GAME_FRAME_DELAY)
 #define MICROLEVEL_SCROLL_DELAY        50      /* delay for scrolling micro level */
 #define MICROLEVEL_LABEL_DELAY 250     /* delay for micro level label */
 
 #define MAX_ENVELOPE_YSIZE     20
 #define MAX_ENVELOPE_TEXT_LEN  (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE)
 #define MIN_CHANGE_PAGES       1
-#define MAX_CHANGE_PAGES       16
+#define MAX_CHANGE_PAGES       32
 #define MIN_ELEMENTS_IN_GROUP  1
 #define MAX_ELEMENTS_IN_GROUP  16
 
 #define EL_GROUP_END                   655
 /* ---------- end of custom elements section ------------------------------- */
 
-#define NUM_FILE_ELEMENTS              656
+#define EL_UNKNOWN                     656
+
+#define NUM_FILE_ELEMENTS              657
 
 
 /* "real" (and therefore drawable) runtime elements */
@@ -1252,6 +1267,8 @@ struct PlayerInfo
 
   boolean use_murphy_graphic;
 
+  boolean block_last_field;
+
   boolean LevelSolved, GameOver;
 
   int last_move_dir;
@@ -1355,6 +1372,8 @@ struct LevelInfo
   boolean double_speed;
   boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
+  boolean block_last_field;    /* player blocks previous field while moving */
+  boolean sp_block_last_field; /* player blocks previous field while moving */
 
   short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
@@ -1483,12 +1502,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
@@ -1564,6 +1587,7 @@ struct ElementInfo
 
   int access_type;             /* walkable or passable */
   int access_layer;            /* accessible over/inside/under */
+  int access_protected;                /* protection against deadly elements */
   int walk_to_action;          /* diggable/collectible/pushable */
   int smash_targets;           /* can smash player/enemies/everything */
   int deadliness;              /* deadly when running/colliding/touching */