rnd-20040114-1-src
[rocksndiamonds.git] / src / main.h
index 8cd383edcd687f4f4189b19ca4e979ca6108ecae..9756b100ae983bcad19844ebbe2a084f44711dd0 100644 (file)
@@ -86,6 +86,7 @@
 #define EP_DROPPABLE           22
 #define EP_CAN_EXPLODE_1X1     23
 #define EP_PUSHABLE            24
+#define EP_CAN_EXPLODE_DYNA    25
 
 /* values for pre-defined properties */
 #define EP_PLAYER              32
 #define CE_PRESSED_BY_PLAYER   2
 #define CE_PUSHED_BY_PLAYER    3
 #define CE_DROPPED_BY_PLAYER   4
-#define CE_COLLISION_ACTIVE    5
+#define CE_HITTING_SOMETHING   5
 #define CE_IMPACT              6
 #define CE_SMASHED             7
 #define CE_OTHER_IS_TOUCHING   8
 #define CE_OTHER_GETS_LEFT     24
 #define CE_SWITCHED            25
 #define CE_OTHER_IS_SWITCHING  26
-#define CE_COLLISION_PASSIVE   27
-#define CE_OTHER_IS_COLL_ACTIVE        28
-#define CE_OTHER_IS_COLL_PASSIVE 29
+#define CE_HIT_BY_SOMETHING    27
+#define CE_OTHER_IS_HITTING    28
+#define CE_OTHER_GETS_HIT      29
 
 #define NUM_CHANGE_EVENTS      30
 
 #define MV_BIT_WHEN_PUSHED     10
 #define MV_BIT_MAZE_RUNNER     11
 #define MV_BIT_MAZE_HUNTER     12
+#define MV_BIT_WHEN_DROPPED    13
+#define MV_BIT_TURNING_LEFT_RIGHT 14
+#define MV_BIT_TURNING_RIGHT_LEFT 15
+#define MV_BIT_TURNING_RANDOM  16
 
 /* values for special move patterns for custom elements */
 #define MV_HORIZONTAL          (MV_LEFT | MV_RIGHT)
 #define MV_MAZE_RUNNER         (1 << MV_BIT_MAZE_RUNNER)
 #define MV_MAZE_HUNTER         (1 << MV_BIT_MAZE_HUNTER)
 #define MV_MAZE_RUNNER_STYLE   (MV_MAZE_RUNNER | MV_MAZE_HUNTER)
+#define MV_WHEN_DROPPED                (1 << MV_BIT_WHEN_DROPPED)
+#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)
 
 /* values for slippery property for custom elements */
 #define SLIPPERY_ANY_RANDOM    0
 #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)
 
 /* macros for special configurable properties */
 #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
                                 (e) <= EL_CUSTOM_END)
 
+#define IS_GROUP_ELEMENT(e)    ((e) >= EL_GROUP_START &&               \
+                                (e) <= EL_GROUP_END)
+
 #define IS_ENVELOPE(e)         ((e) >= EL_ENVELOPE_1 &&                \
                                 (e) <= EL_ENVELOPE_4)
 
 #define MAX_ENVELOPE_TEXT_LEN  (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE)
 #define MIN_CHANGE_PAGES       1
 #define MAX_CHANGE_PAGES       16
+#define MIN_ELEMENTS_IN_GROUP  1
+#define MAX_ELEMENTS_IN_GROUP  16
 
 /* values for elements with content */
 #define MIN_ELEMENT_CONTENTS   1
 #define MICROLABEL_YPOS                (MICROLEV_YPOS + MICROLEV_YSIZE + 7)
 
 
+/* score for elements */
+#define SC_EMERALD             0
+#define SC_DIAMOND             1
+#define SC_BUG                 2
+#define SC_SPACESHIP           3
+#define SC_YAMYAM              4
+#define SC_ROBOT               5
+#define SC_PACMAN              6
+#define SC_NUT                 7
+#define SC_DYNAMITE            8
+#define SC_KEY                 9
+#define SC_TIME_BONUS          10
+#define SC_CRYSTAL             11
+#define SC_PEARL               12
+#define SC_SHIELD              13
+
+
 /* "real" level file elements */
 #define EL_UNDEFINED                   -1
 
 #define EL_BD_MAGIC_WALL               61
 #define EL_INVISIBLE_STEELWALL         62
 
-#define EL_MAZE_RUNNER                 63
+#define EL_UNUSED_63                   63
 
 #define EL_DYNABOMB_INCREASE_NUMBER    64
 #define EL_DYNABOMB_INCREASE_SIZE      65
 #define EL_ENVELOPE_3                  622
 #define EL_ENVELOPE_4                  623
 
-#define NUM_FILE_ELEMENTS              624
+/* ---------- begin of group elements section ------------------------------ */
+#define EL_GROUP_START                 624
+
+#include "conf_grp.h"  /* include auto-generated data structure definitions */
+
+#define NUM_GROUP_ELEMENTS             32
+#define EL_GROUP_END                   655
+/* ---------- end of custom elements section ------------------------------- */
+
+#define NUM_FILE_ELEMENTS              656
 
 
 /* "real" (and therefore drawable) runtime elements */
@@ -1177,7 +1218,7 @@ struct PlayerInfo
 {
   boolean present;             /* player present in level playfield */
   boolean connected;           /* player connected (locally or via network) */
-  boolean active;              /* player (present && connected) */
+  boolean active;              /* player present and connected */
 
   int index_nr, client_nr, element_nr;
 
@@ -1207,6 +1248,7 @@ struct PlayerInfo
   boolean is_collecting;
   boolean is_pushing;
   boolean is_switching;
+  boolean is_dropping;
 
   boolean is_bored;
   boolean is_sleeping;
@@ -1231,11 +1273,15 @@ struct PlayerInfo
   unsigned long move_delay;
   int move_delay_value;
 
+  int move_delay_reset_counter;
+
   unsigned long push_delay;
   unsigned long push_delay_value;
 
   unsigned long actual_frame_counter;
 
+  int drop_delay;
+
   int step_counter;
 
   int score;
@@ -1257,6 +1303,13 @@ struct LevelSetInfo
   int music[MAX_LEVELS];
 };
 
+struct LevelFileInfo
+{
+  int nr;
+  int type;
+  char *filename;
+};
+
 struct LevelInfo
 {
   int file_version;    /* file format version the level is stored with    */
@@ -1408,6 +1461,17 @@ struct ElementChangeInfo
   int other_action;            /* change triggered by other element actions */
 };
 
+struct ElementGroupInfo
+{
+  int num_elements;                    /* number of elements in this group */
+  short element[MAX_ELEMENTS_IN_GROUP];        /* list of elements in this group */
+
+  /* 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];
+};
+
 struct ElementInfo
 {
   /* ---------- token and description strings ---------- */
@@ -1416,7 +1480,7 @@ struct ElementInfo
   char *class_name;            /* element class used in config files */
   char *editor_description;    /* pre-defined description for level editor */
   char *custom_description;    /* alternative description from config file */
-  char description[MAX_ELEMENT_NAME_LEN + 1];  /* for custom elements */
+  char description[MAX_ELEMENT_NAME_LEN + 1];  /* for custom/group elements */
 
   /* ---------- graphic and sound definitions ---------- */
 
@@ -1449,6 +1513,8 @@ struct ElementInfo
   int move_pattern;            /* direction movable element moves to */
   int move_direction_initial;  /* initial direction element moves to */
   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 slippery_type;           /* how/where other elements slip away */
 
@@ -1460,6 +1526,8 @@ struct ElementInfo
   int num_change_pages;                /* actual number of change pages */
   int current_change_page;     /* currently edited change page */
 
+  struct ElementGroupInfo *group;      /* pointer to element group info */
+
   /* ---------- internal values used at runtime when playing ---------- */
 
   unsigned long change_events; /* bitfield for combined change events */
@@ -1467,6 +1535,8 @@ struct ElementInfo
   int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */
   struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */
 
+  boolean in_group[NUM_GROUP_ELEMENTS];
+
   /* ---------- internal values used in level editor ---------- */
 
   int access_type;             /* walkable or passable */