rnd-20051227-1-src
[rocksndiamonds.git] / src / main.h
index d7bbde09ff305eb172cf629d22d7f221c431ef6b..e2bfa12bf7bd136384bae2603acd4f1f469576e5 100644 (file)
 #define CE_PLAYER_PUSHES_X             13
 #define CE_PLAYER_COLLECTS_X           14
 #define CE_PLAYER_DROPS_X              15
-#define CE_COUNT_AT_ZERO               16
-#define CE_COUNT_AT_ZERO_OF_X          17
+#define CE_VALUE_GETS_ZERO             16
+#define CE_VALUE_GETS_ZERO_OF_X                17
 #define CE_BY_OTHER_ACTION             18
 #define CE_BY_DIRECT_ACTION            19
 #define CE_PLAYER_DIGS_X               20
                                         PLAYER_BITS_4)
 #define PLAYER_BITS_TRIGGER            (1 << 4)
 
+/* values for move directions (bits 0 - 3: basic move directions) */
+#define MV_BIT_PREVIOUS                        4
+#define MV_BIT_TRIGGER                 5
+#define MV_BIT_TRIGGER_BACK            6
+
+#define MV_PREVIOUS                    (1 << MV_BIT_PREVIOUS)
+#define MV_TRIGGER                     (1 << MV_BIT_TRIGGER)
+#define MV_TRIGGER_BACK                        (1 << MV_BIT_TRIGGER_BACK)
+
 /* values for change side for custom elements */
 #define CH_SIDE_NONE                   MV_NONE
 #define CH_SIDE_LEFT                   MV_LEFT
 #define CA_NO_ACTION                   0
 #define CA_EXIT_PLAYER                 1
 #define CA_KILL_PLAYER                 2
-#define CA_RESTART_LEVEL               3
-#define CA_SHOW_ENVELOPE               4
-#define CA_ADD_KEY                     5
-#define CA_DEL_KEY                     6
-#define CA_SET_GEMS                    7
-#define CA_SET_TIME                    8
-#define CA_SET_SCORE                   9
-#define CA_SET_CE_SCORE                        10
-#define CA_SET_CE_COUNT                        11
+#define CA_MOVE_PLAYER                 3
+#define CA_RESTART_LEVEL               4
+#define CA_SHOW_ENVELOPE               5
+#define CA_SET_LEVEL_TIME              6
+#define CA_SET_LEVEL_GEMS              7
+#define CA_SET_LEVEL_SCORE             8
+#define CA_SET_LEVEL_WIND              9
+#define CA_SET_LEVEL_GRAVITY           10
+#define CA_SET_PLAYER_KEYS             11
 #define CA_SET_PLAYER_SPEED            12
-#define CA_SET_PLAYER_GRAVITY          13
-#define CA_SET_WIND_DIRECTION          14
-#if 0
-#define CA_SET_DYNABOMB_NUMBER         15
-#define CA_SET_DYNABOMB_SIZE           16
-#define CA_SET_DYNABOMB_POWER          17
-#endif
+#define CA_SET_PLAYER_SHIELD           13
+#define CA_SET_PLAYER_ARTWORK          14
+#define CA_SET_CE_SCORE                        15
+#define CA_SET_CE_VALUE                        16
+
+#define CA_HEADLINE_LEVEL_ACTIONS      250
+#define CA_HEADLINE_PLAYER_ACTIONS     251
+#define CA_HEADLINE_CE_ACTIONS         252
+#define CA_UNDEFINED                   255
 
 /* values for change action mode for custom elements */
 #define CA_MODE_UNDEFINED              0
 #define CA_ARG_NUMBER_MAX              (CA_ARG_NUMBER + 1)
 #define CA_ARG_NUMBER_RESET            (CA_ARG_NUMBER + 2)
 #define CA_ARG_NUMBER_CE_SCORE         (CA_ARG_NUMBER + 3)
-#define CA_ARG_NUMBER_CE_COUNT         (CA_ARG_NUMBER + 4)
+#define CA_ARG_NUMBER_CE_VALUE         (CA_ARG_NUMBER + 4)
 #define CA_ARG_NUMBER_CE_DELAY         (CA_ARG_NUMBER + 5)
+#define CA_ARG_NUMBER_LEVEL_TIME       (CA_ARG_NUMBER + 6)
+#define CA_ARG_NUMBER_LEVEL_GEMS       (CA_ARG_NUMBER + 7)
+#define CA_ARG_NUMBER_LEVEL_SCORE      (CA_ARG_NUMBER + 8)
 #define CA_ARG_NUMBER_HEADLINE         (CA_ARG_NUMBER + 999)
 #define CA_ARG_ELEMENT                 12000
 #define CA_ARG_ELEMENT_TARGET          (CA_ARG_ELEMENT + 0)
 #define CA_ARG_ELEMENT_TRIGGER         (CA_ARG_ELEMENT + 1)
 #define CA_ARG_ELEMENT_HEADLINE                (CA_ARG_ELEMENT + 999)
 #define CA_ARG_SPEED                   13000
+#define CA_ARG_SPEED_NOT_MOVING                (CA_ARG_SPEED + 0)
 #define CA_ARG_SPEED_VERY_SLOW         (CA_ARG_SPEED + 1)
 #define CA_ARG_SPEED_SLOW              (CA_ARG_SPEED + 2)
 #define CA_ARG_SPEED_NORMAL            (CA_ARG_SPEED + 4)
 #define CA_ARG_SPEED_EVEN_FASTER       (CA_ARG_SPEED + 32)
 #define CA_ARG_SPEED_SLOWER            (CA_ARG_SPEED + 50)
 #define CA_ARG_SPEED_FASTER            (CA_ARG_SPEED + 200)
-#define CA_ARG_SPEED_RESET             (CA_ARG_SPEED + 0)
+#define CA_ARG_SPEED_RESET             (CA_ARG_SPEED + 100)
 #define CA_ARG_SPEED_HEADLINE          (CA_ARG_SPEED + 999)
 #define CA_ARG_GRAVITY                 14000
 #define CA_ARG_GRAVITY_OFF             (CA_ARG_GRAVITY + 0)
 #define CA_ARG_DIRECTION_RIGHT         (CA_ARG_DIRECTION + MV_RIGHT)
 #define CA_ARG_DIRECTION_UP            (CA_ARG_DIRECTION + MV_UP)
 #define CA_ARG_DIRECTION_DOWN          (CA_ARG_DIRECTION + MV_DOWN)
-#define CA_ARG_DIRECTION_TRIGGER       (CA_ARG_DIRECTION + MV_ANY_DIRECTION)
+#define CA_ARG_DIRECTION_TRIGGER       (CA_ARG_DIRECTION + MV_TRIGGER)
+#define CA_ARG_DIRECTION_TRIGGER_BACK  (CA_ARG_DIRECTION + MV_TRIGGER_BACK)
 #define CA_ARG_DIRECTION_HEADLINE      (CA_ARG_DIRECTION + 999)
+#define CA_ARG_SHIELD                  16000
+#define CA_ARG_SHIELD_OFF              (CA_ARG_SHIELD + 0)
+#define CA_ARG_SHIELD_NORMAL           (CA_ARG_SHIELD + 1)
+#define CA_ARG_SHIELD_DEADLY           (CA_ARG_SHIELD + 2)
+#define CA_ARG_SHIELD_HEADLINE         (CA_ARG_SHIELD + 999)
 #define CA_ARG_UNDEFINED               19999
 
 /* values for custom move patterns (bits 0 - 3: basic move directions) */
 #define MV_TURNING_RANDOM              (1 << MV_BIT_TURNING_RANDOM)
 #define MV_WIND_DIRECTION              (1 << MV_BIT_WIND_DIRECTION)
 
-/* 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_NONE                  (MV_NONE)
 #define MV_START_AUTOMATIC             (MV_NONE)
 #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)
+#define MV_START_PREVIOUS              (MV_PREVIOUS)
 
 /* values for elements left behind by custom elements */
 #define LEAVE_TYPE_UNLIMITED           0
 
 #define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
 
+#define GET_PLAYER_ELEMENT(e)  ((e) >= EL_PLAYER_1 && (e) <= EL_PLAYER_4 ? \
+                                (e) : EL_PLAYER_1)
+
+#define GET_PLAYER_NR(e)       (GET_PLAYER_ELEMENT(e) - EL_PLAYER_1)
+
 #define ANIM_FRAMES(g)         (graphic_info[g].anim_frames)
 #define ANIM_DELAY(g)          (graphic_info[g].anim_delay)
 #define ANIM_MODE(g)           (graphic_info[g].anim_mode)
 #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)
+#define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 18)
 
 /* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 18)
+#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 19)
 
 #define EL_STEELWALL_TOPLEFT           (EL_FIRST_DUMMY + 0)
 #define EL_STEELWALL_TOPRIGHT          (EL_FIRST_DUMMY + 1)
@@ -1667,6 +1691,8 @@ struct PlayerInfo
   boolean is_bored;
   boolean is_sleeping;
 
+  boolean cannot_move;
+
   int frame_counter_bored;
   int frame_counter_sleeping;
 
@@ -1777,6 +1803,12 @@ struct LevelInfo
   int extra_time;
   int time_orb_time;
 
+  int extra_time_score;
+
+  int start_element[MAX_PLAYERS];
+  boolean use_start_element[MAX_PLAYERS];
+
+#if 1
   /* values for the new EMC elements */
   int android_move_time;
   int android_clone_time;
@@ -1791,6 +1823,7 @@ struct LevelInfo
   int wind_direction_initial;
   struct Content ball_content[MAX_ELEMENT_CONTENTS];
   boolean android_array[16];
+#endif
 
   int can_move_into_acid_bits; /* bitfield to store property for elements */
   int dont_collide_with_bits;  /* bitfield to store property for elements */
@@ -1799,10 +1832,12 @@ struct LevelInfo
   boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
   boolean use_spring_bug;      /* for compatibility with old levels */
+  boolean use_time_orb_bug;    /* for compatibility with old levels */
   boolean instant_relocation;  /* no visual delay when relocating player */
   boolean can_pass_to_walkable;        /* player can pass to empty or walkable tile */
   boolean grow_into_diggable;  /* amoeba can grow into anything diggable */
 
+  boolean block_snap_field;    /* snapping blocks field to show animation */
   boolean block_last_field;    /* player blocks previous field while moving */
   boolean sp_block_last_field; /* player blocks previous field while moving */
 
@@ -1922,13 +1957,13 @@ struct ElementChangeInfo
   int trigger_side;            /* side triggering change */
   int trigger_page;            /* page triggering change */
 
-  short target_element;                /* target element after change */
+  int target_element;          /* target element after change */
 
   int delay_fixed;             /* added frame delay before changed (fixed) */
   int delay_random;            /* added frame delay before changed (random) */
   int delay_frames;            /* either 1 (frames) or 50 (seconds; 50 fps) */
 
-  short trigger_element;       /* element triggering change */
+  int trigger_element;         /* element triggering change */
 
   struct Content target_content;/* elements for extended change target */
   boolean use_target_content;  /* use extended change target */
@@ -1953,8 +1988,9 @@ struct ElementChangeInfo
   void (*post_change_function)(int x, int y);
 
   short actual_trigger_element;        /* element that actually triggered change */
-  int actual_trigger_side;     /* el.side that actually triggered change */
+  int actual_trigger_side;     /* element side that triggered the change */
   int actual_trigger_player;   /* player which actually triggered change */
+  int actual_trigger_ce_value; /* CE value of element that triggered change */
 
   boolean can_change_or_has_action;    /* can_change | has_action */
 
@@ -1967,7 +2003,7 @@ struct ElementChangeInfo
 struct ElementGroupInfo
 {
   int num_elements;                    /* number of elements in this group */
-  short element[MAX_ELEMENTS_IN_GROUP];        /* list of elements in this group */
+  int element[MAX_ELEMENTS_IN_GROUP];  /* list of elements in this group */
 
   int choice_mode;             /* how to choose element from group */
 
@@ -2018,13 +2054,17 @@ struct ElementInfo
   /* ---------- special element property values ---------- */
 
   boolean use_gfx_element;     /* use custom graphic element */
-  short gfx_element;           /* optional custom graphic element */
+  int gfx_element;             /* optional custom graphic element */
 
   int access_direction;                /* accessible from which direction */
 
   int collect_score_initial;   /* initial score value for collecting */
   int collect_count_initial;   /* initial count value for collecting */
 
+  int ce_value_fixed_initial;  /* initial value for custom variable (fix) */
+  int ce_value_random_initial; /* initial value for custom variable (rnd) */
+  boolean use_last_ce_value;   /* use value from element before change */
+
   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 */
@@ -2229,7 +2269,7 @@ extern short                      MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short                   Count[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   CustomValue[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];