added "effects" (runtime) game elements for native BD engine
[rocksndiamonds.git] / src / files.c
index b4c2d7e4023af33ec725c199872b27ac137866e5..3e6d25f3d13c190ba502b1443cdf32992b957095 100644 (file)
@@ -310,6 +310,11 @@ static struct LevelFileConfigInfo chunk_config_INFO[] =
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(23),
     &li.bd_gravity_affects_all,                TRUE
   },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(24),
+    &li.bd_cave_random_seed_c64,       0
+  },
 
   {
     -1,                                        -1,
@@ -628,6 +633,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(5),
     &li.bd_push_mega_rock_with_sweet,  FALSE
   },
+  {
+    EL_BD_PLAYER,                      -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(6),
+    &li.bd_snap_element,               EL_EMPTY
+  },
 
   {
     EL_BD_DIAMOND,                     -1,
@@ -678,6 +688,93 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     &li.bd_voodoo_penalty_time,                30
   },
 
+  {
+    EL_BD_SLIME,                       -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
+    &li.bd_slime_is_predictable,       TRUE
+  },
+  {
+    EL_BD_SLIME,                       -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
+    &li.bd_slime_permeability_rate,    100
+  },
+  {
+    EL_BD_SLIME,                       -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(3),
+    &li.bd_slime_permeability_bits_c64,        0
+  },
+  {
+    EL_BD_SLIME,                       -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(1),
+    &li.bd_slime_random_seed_c64,      -1
+  },
+
+  {
+    EL_BD_ACID,                                -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
+    &li.bd_acid_eats_element,          EL_BD_SAND
+  },
+  {
+    EL_BD_ACID,                                -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
+    &li.bd_acid_spread_rate,           3
+  },
+  {
+    EL_BD_ACID,                                -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
+    &li.bd_acid_turns_to_element,      EL_EMPTY
+  },
+
+  {
+    EL_BD_BITER,                       -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
+    &li.bd_biter_move_delay,           0
+  },
+  {
+    EL_BD_BITER,                       -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
+    &li.bd_biter_eats_element,         EL_BD_DIAMOND
+  },
+
+  {
+    EL_BD_BLADDER,                     -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
+    &li.bd_bladder_converts_by_element,        EL_BD_VOODOO_DOLL
+  },
+
+  {
+    EL_BD_EXPANDABLE_WALL_ANY,         -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
+    &li.bd_change_expanding_wall,      FALSE
+  },
+
+  {
+    EL_BD_REPLICATOR,                  -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
+    &li.bd_replicators_active,         TRUE
+  },
+  {
+    EL_BD_REPLICATOR,                  -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
+    &li.bd_replicator_create_delay,    4
+  },
+
+  {
+    EL_BD_CONVEYOR_LEFT,               -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
+    &li.bd_conveyor_belts_active,      TRUE
+  },
+  {
+    EL_BD_CONVEYOR_LEFT,               -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
+    &li.bd_conveyor_belts_changed,     FALSE
+  },
+
+  {
+    EL_BD_WATER,                       -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
+    &li.bd_water_cannot_flow_down,     FALSE
+  },
 
   // (the following values are related to various game elements)
 
@@ -3927,6 +4024,7 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->pushing_stone_prob             = level->bd_pushing_prob            * 10000;
   cave->pushing_stone_prob_sweet       = level->bd_pushing_prob_with_sweet * 10000;
   cave->mega_stones_pushable_with_sweet        = level->bd_push_mega_rock_with_sweet;
+  cave->snap_element                   = map_element_RND_to_BD(level->bd_snap_element);
 
   // element properties
   cave->level_bonus_time[0]            = level->bd_clock_extra_time;
@@ -3957,6 +4055,32 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->amoeba_2_explosion_effect   = map_element_RND_to_BD(level->bd_amoeba_2_content_exploding);
   cave->amoeba_2_looks_like        = map_element_RND_to_BD(level->bd_amoeba_2_content_looks_like);
 
+  cave->slime_predictable              = level->bd_slime_is_predictable;
+  cave->slime_correct_random           = level->bd_slime_correct_random;
+  cave->level_slime_permeability[0]    = level->bd_slime_permeability_rate * 10000;
+  cave->level_slime_permeability_c64[0]        = level->bd_slime_permeability_bits_c64;
+  cave->level_slime_seed_c64[0]                = level->bd_slime_random_seed_c64;
+  cave->level_rand[0]                  = level->bd_cave_random_seed_c64;
+
+  cave->acid_eats_this                 = map_element_RND_to_BD(level->bd_acid_eats_element);
+  cave->acid_spread_ratio              = level->bd_acid_spread_rate * 10000;
+  cave->acid_turns_to                  = map_element_RND_to_BD(level->bd_acid_turns_to_element);
+
+  cave->biter_delay_frame              = level->bd_biter_move_delay;
+  cave->biter_eat                      = map_element_RND_to_BD(level->bd_biter_eats_element);
+
+  cave->bladder_converts_by        = map_element_RND_to_BD(level->bd_bladder_converts_by_element);
+
+  cave->expanding_wall_changed         = level->bd_change_expanding_wall;
+
+  cave->replicators_active             = level->bd_replicators_active;
+  cave->replicator_delay_frame         = level->bd_replicator_create_delay;
+
+  cave->conveyor_belts_active          = level->bd_conveyor_belts_active;
+  cave->conveyor_belts_direction_changed= level->bd_conveyor_belts_changed;
+
+  cave->water_does_not_flow_down       = level->bd_water_cannot_flow_down;
+
   // level name
   strncpy(cave->name, level->name, sizeof(GdString));
   cave->name[sizeof(GdString) - 1] = '\0';
@@ -4009,26 +4133,27 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   level->bd_pushing_prob               = cave->pushing_stone_prob       / 10000;
   level->bd_pushing_prob_with_sweet    = cave->pushing_stone_prob_sweet / 10000;
   level->bd_push_mega_rock_with_sweet  = cave->mega_stones_pushable_with_sweet;
+  level->bd_snap_element               = map_element_BD_to_RND(cave->snap_element);
 
   // element properties
-  level->bd_clock_extra_time           = cave->level_bonus_time[0];
+  level->bd_clock_extra_time           = cave->level_bonus_time[bd_level_nr];
   level->bd_voodoo_collects_diamonds   = cave->voodoo_collects_diamonds;
   level->bd_voodoo_hurt_kills_player   = cave->voodoo_any_hurt_kills_player;
   level->bd_voodoo_dies_by_rock                = cave->voodoo_dies_by_stone;
   level->bd_voodoo_vanish_by_explosion = cave->voodoo_disappear_in_explosion;
-  level->bd_voodoo_penalty_time                = cave->level_penalty_time[0];
+  level->bd_voodoo_penalty_time                = cave->level_penalty_time[bd_level_nr];
   level->time_magic_wall               = cave->level_magic_wall_time[bd_level_nr];
   level->bd_magic_wall_wait_hatching   = cave->magic_timer_wait_for_hatching;
   level->bd_magic_wall_stops_amoeba    = cave->magic_wall_stops_amoeba;
   level->bd_amoeba_wait_for_hatching   = cave->amoeba_timer_wait_for_hatching;
   level->bd_amoeba_start_immediately   = cave->amoeba_timer_started_immediately;
   level->bd_amoeba_2_explode_by_amoeba = cave->amoeba_2_explodes_by_amoeba;
-  level->bd_amoeba_threshold_too_big   = cave->level_amoeba_threshold[0];
-  level->bd_amoeba_slow_growth_time    = cave->level_amoeba_time[0];
+  level->bd_amoeba_threshold_too_big   = cave->level_amoeba_threshold[bd_level_nr];
+  level->bd_amoeba_slow_growth_time    = cave->level_amoeba_time[bd_level_nr];
   level->bd_amoeba_slow_growth_rate    = cave->amoeba_growth_prob      / 10000;
   level->bd_amoeba_fast_growth_rate    = cave->amoeba_fast_growth_prob / 10000;
-  level->bd_amoeba_2_threshold_too_big = cave->level_amoeba_2_threshold[0];
-  level->bd_amoeba_2_slow_growth_time  = cave->level_amoeba_2_time[0];
+  level->bd_amoeba_2_threshold_too_big = cave->level_amoeba_2_threshold[bd_level_nr];
+  level->bd_amoeba_2_slow_growth_time  = cave->level_amoeba_2_time[bd_level_nr];
   level->bd_amoeba_2_slow_growth_rate  = cave->amoeba_2_growth_prob      / 10000;
   level->bd_amoeba_2_fast_growth_rate  = cave->amoeba_2_fast_growth_prob / 10000;
 
@@ -4039,6 +4164,32 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   level->bd_amoeba_2_content_exploding = map_element_BD_to_RND(cave->amoeba_2_explosion_effect);
   level->bd_amoeba_2_content_looks_like        = map_element_BD_to_RND(cave->amoeba_2_looks_like);
 
+  level->bd_slime_is_predictable       = cave->slime_predictable;
+  level->bd_slime_correct_random       = cave->slime_correct_random;
+  level->bd_slime_permeability_rate    = cave->level_slime_permeability[bd_level_nr] / 10000;
+  level->bd_slime_permeability_bits_c64        = cave->level_slime_permeability_c64[bd_level_nr];
+  level->bd_slime_random_seed_c64      = cave->level_slime_seed_c64[bd_level_nr];
+  level->bd_cave_random_seed_c64       = cave->level_rand[bd_level_nr];
+
+  level->bd_acid_eats_element          = map_element_BD_to_RND(cave->acid_eats_this);
+  level->bd_acid_spread_rate           = cave->acid_spread_ratio / 10000;
+  level->bd_acid_turns_to_element      = map_element_BD_to_RND(cave->acid_turns_to);
+
+  level->bd_biter_move_delay           = cave->biter_delay_frame;
+  level->bd_biter_eats_element         = map_element_BD_to_RND(cave->biter_eat);
+
+  level->bd_bladder_converts_by_element        = map_element_BD_to_RND(cave->bladder_converts_by);
+
+  level->bd_change_expanding_wall      = cave->expanding_wall_changed;
+
+  level->bd_replicators_active         = cave->replicators_active;
+  level->bd_replicator_create_delay    = cave->replicator_delay_frame;
+
+  level->bd_conveyor_belts_active      = cave->conveyor_belts_active;
+  level->bd_conveyor_belts_changed     = cave->conveyor_belts_direction_changed;
+
+  level->bd_water_cannot_flow_down     = cave->water_does_not_flow_down;
+
   // level name
   char *cave_name = getStringPrint("%s / %d", cave->name, bd_level_nr + 1);