rnd-20050626-1-src
[rocksndiamonds.git] / src / main.h
index 1297f845e783266a02c9251c2a4d9298777ec1b5..af3e7b4e187d4909df9ba9bc230de1054feef756 100644 (file)
 
 #define CE_BITMASK_DEFAULT     0
 
+#if 1
+
+#define CH_EVENT_VAR(e,c)      (element_info[e].change->has_event[c])
+#define CH_ANY_EVENT_VAR(e,c)  (element_info[e].has_change_event[c])
+
+#define PAGE_HAS_CHANGE_EVENT(p,c)  ((p)->has_event[c])
+#define HAS_CHANGE_EVENT(e,c)      (IS_CUSTOM_ELEMENT(e) &&            \
+                                    CH_EVENT_VAR(e,c))
+#define HAS_ANY_CHANGE_EVENT(e,c)   (IS_CUSTOM_ELEMENT(e) &&           \
+                                    CH_ANY_EVENT_VAR(e,c))
+
+#define SET_CHANGE_EVENT(e,c,v)     (IS_CUSTOM_ELEMENT(e) ?            \
+                                    CH_EVENT_VAR(e,c) = (v) : 0)
+#define SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ?            \
+                                    CH_ANY_EVENT_VAR(e,c) = (v) : 0)
+
+#else
+
 #define CH_EVENT_BIT(c)                (1 << (c))
 #define CH_EVENT_VAR(e)                (element_info[e].change->events)
 #define CH_ANY_EVENT_VAR(e)    (element_info[e].change_events)
                                 ((v) ?                                   \
                                  (CH_EVENT_VAR(e) |=  CH_EVENT_BIT(c)) : \
                                  (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
+#define SET_ANY_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ?              \
+                              ((v) ?                                     \
+                               (CH_ANY_EVENT_VAR(e) |=  CH_EVENT_BIT(c)) : \
+                               (CH_ANY_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
+#endif
 
 /* values for change side for custom elements */
 #define CH_SIDE_NONE           MV_NO_MOVING
 #define MAX_LEVEL_NAME_LEN     32
 #define MAX_LEVEL_AUTHOR_LEN   32
 #define MAX_ELEMENT_NAME_LEN   32
-#define MAX_TAPELEN            (1000 * FRAMES_PER_SECOND) /* max.time x fps */
+#define MAX_TAPE_LEN           (1000 * FRAMES_PER_SECOND) /* max.time x fps */
+#define MAX_TAPES_PER_SET      1024
 #define MAX_SCORE_ENTRIES      100
 #define MAX_NUM_AMOEBA         100
 #define MAX_INVENTORY_SIZE     1000
@@ -1492,7 +1516,7 @@ struct PlayerInfo
   boolean use_murphy_graphic;
 
   boolean block_last_field;
-  int block_delay;
+  int block_delay_adjustment;  /* needed for different engine versions */
 
   boolean can_fall_into_acid;
 
@@ -1651,8 +1675,11 @@ struct LevelInfo
 
   boolean block_last_field;    /* player blocks previous field while moving */
   boolean sp_block_last_field; /* player blocks previous field while moving */
+
+#if 0  /* !!! THIS IS NOT A LEVEL SETTING => LOGIC MOVED TO "game.c" !!! */
   int block_delay;             /* delay for blocking previous field */
   int sp_block_delay;          /* delay for blocking previous field */
+#endif
 
   /* ('int' instead of 'boolean' because used as selectbox value in editor) */
   int use_step_counter;                /* count steps instead of seconds for level */
@@ -1697,7 +1724,7 @@ struct TapeInfo
   {
     byte action[MAX_PLAYERS];
     byte delay;
-  } pos[MAX_TAPELEN];
+  } pos[MAX_TAPE_LEN];
 
   boolean no_valid_file;       /* set when tape file missing or invalid */
 };
@@ -1717,7 +1744,8 @@ struct GameInfo
 
   /* flags to handle bugs in and changes between different engine versions */
   /* (for the latest engine version, these flags should always be "FALSE") */
-  boolean use_bug_change_when_pushing;
+  boolean use_change_when_pushing_bug;
+  boolean use_block_last_field_bug;
 
   /* variable within running game */
   int yamyam_content_nr;
@@ -1743,7 +1771,8 @@ struct GameInfo
 struct GlobalInfo
 {
   char *autoplay_leveldir;
-  int autoplay_level_nr;
+  int autoplay_level[MAX_TAPES_PER_SET];
+  boolean autoplay_all;
 
   char *convert_leveldir;
   int convert_level_nr;
@@ -1759,7 +1788,11 @@ struct ElementChangeInfo
 {
   boolean can_change;          /* use or ignore this change info */
 
+#if 1
+  boolean has_event[NUM_CHANGE_EVENTS];                /* change events */
+#else
   unsigned long events;                /* change events */
+#endif
 
   int trigger_player;          /* player triggering change */
   int trigger_side;            /* side triggering change */
@@ -1893,7 +1926,11 @@ struct ElementInfo
 
   /* ---------- internal values used at runtime when playing ---------- */
 
+#if 1
+  boolean has_change_event[NUM_CHANGE_EVENTS];
+#else
   unsigned long change_events; /* bitfield for combined change events */
+#endif
 
   int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */
   struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */
@@ -2073,8 +2110,8 @@ extern short                      StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern boolean                 Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern boolean                 Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern unsigned long           Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern unsigned long           ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern boolean                 Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   CheckCollision[MAX_LEV_FIELDX][MAX_LEV_FIELDY];