added using masked drawing for player on walkable tiles in BD engine
[rocksndiamonds.git] / src / game_bd / bd_cave.h
index d8f4559175d8e93f900d9a0c13f8022122ea1d5c..3dede416f53f3dc8e5702baa67447e9057595568 100644 (file)
@@ -82,7 +82,7 @@ void gd_struct_set_defaults_from_array(void *str, const GdStructDescriptor *prop
 
 // these define the number of the cells in the png file
 #define GD_NUM_OF_CELLS_X      8
-#define GD_NUM_OF_CELLS_Y      47
+#define GD_NUM_OF_CELLS_Y      51
 
 // +80: placeholder for cells which are rendered by the game;
 // for example diamond + arrow = falling diamond
@@ -121,11 +121,14 @@ enum _element_property
   E_P_MOVED_BY_CONVEYOR_TOP,    // can be moved by conveyor belt
   E_P_MOVED_BY_CONVEYOR_BOTTOM, // can be moved UNDER the conveyor belt
 
+  E_P_WALKABLE,                 // can be walked
   E_P_DIGGABLE,                 // can be digged
   E_P_COLLECTIBLE,              // can be collected
   E_P_PUSHABLE,                 // can be pushed
   E_P_CAN_MOVE,                 // can move
   E_P_CAN_FALL,                 // can fall
+  E_P_FALLING,                  // falling
+  E_P_GROWING,                  // growing (element birth)
 };
 
 // properties
@@ -158,11 +161,14 @@ enum _element_property
 #define P_MOVED_BY_CONVEYOR_TOP                (1 << E_P_MOVED_BY_CONVEYOR_TOP)
 #define P_MOVED_BY_CONVEYOR_BOTTOM     (1 << E_P_MOVED_BY_CONVEYOR_BOTTOM)
 
+#define P_WALKABLE                     (1 << E_P_WALKABLE)
 #define P_DIGGABLE                     (1 << E_P_DIGGABLE)
 #define P_COLLECTIBLE                  (1 << E_P_COLLECTIBLE)
 #define P_PUSHABLE                     (1 << E_P_PUSHABLE)
 #define P_CAN_MOVE                     (1 << E_P_CAN_MOVE)
 #define P_CAN_FALL                     (1 << E_P_CAN_FALL)
+#define P_FALLING                      (1 << E_P_FALLING)
+#define P_GROWING                      (1 << E_P_GROWING)
 
 // These are states of the magic wall.
 typedef enum _magic_wall_state
@@ -394,6 +400,8 @@ typedef struct _gd_cave
   int level_magic_wall_time[5];         // magic wall 'on' state for each level (seconds)
   boolean magic_wall_stops_amoeba;      // Turning on magic wall changes amoeba to diamonds.
                                         // Original BD: yes, constkit: no
+  boolean magic_wall_breakscan;                // Currently this setting enabled will turn the amoeba to
+                                        // an enclosed state. To implement buggy BD1 behaviour.
   boolean magic_timer_zero_is_infinite;        // magic wall timer 0 is interpreted as infinite
   boolean magic_timer_wait_for_hatching;// magic wall timer does not start before player's birth
   boolean magic_wall_sound;             // magic wall has sound
@@ -587,6 +595,7 @@ typedef struct _gd_cave
   int amoeba_2_max_count;               // selected amoeba 2 threshold for this level
   GdAmoebaState amoeba_state;           // state of amoeba 1
   GdAmoebaState amoeba_2_state;         // state of amoeba 2
+  boolean convert_amoeba_this_frame;    // To implement BD1 buggy amoeba+magic wall behaviour.
   int magic_wall_time;                  // magic wall 'on' state for seconds
   int slime_permeability;               // true random slime
   int slime_permeability_c64;           // Appearing in bd 2
@@ -658,6 +667,7 @@ void gd_cave_free(GdCave *cave);
 void gd_cave_set_gdash_defaults(GdCave *cave);
 void gd_cave_set_defaults_from_array(GdCave* cave, GdPropertyDefault *defaults);
 void gd_cave_correct_visible_size(GdCave *cave);
+void gd_cave_set_random_colors(GdCave *cave, GdColorType type);
 void gd_cave_auto_shrink(GdCave *cave);
 
 void gd_cave_setup_for_game(GdCave *cave);
@@ -693,7 +703,8 @@ GdScheduling gd_scheduling_from_string(const char *str);
 // game playing helpers
 #define GD_REDRAW (1 << 10)
 
-void gd_drawcave_game(const GdCave *cave, int **element_buffer, int **gfx_buffer,
+void gd_drawcave_game(const GdCave *cave,
+                     int **element_buffer, int **last_element_buffer, int **gfx_buffer,
                      boolean bonus_life_flash, int animcycle, boolean hate_invisible_outbox);
 
 // function to copy a GdString
@@ -712,4 +723,7 @@ void gd_replay_store_movement(GdReplay *replay, GdDirection player_move, boolean
 unsigned int gd_cave_adler_checksum(GdCave *cave);
 void gd_cave_adler_checksum_more(GdCave *cave, unsigned int *a, unsigned int *b);
 
+boolean gd_cave_has_levels(GdCave *cave);
+boolean gd_caveset_has_levels(void);
+
 #endif // BD_CAVE_H