fixed element mappings for some native BD engine elements
[rocksndiamonds.git] / src / files.c
index 489565f976255aaf1c22679ebd70fb23fbaa533d..9fcc9e4054a82127d028973d69a42f78cf145a1e 100644 (file)
@@ -748,6 +748,34 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     &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)
 
   {
@@ -3996,7 +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);
+  cave->snap_element                   = map_element_RND_to_BD_cave(level->bd_snap_element);
 
   // element properties
   cave->level_bonus_time[0]            = level->bd_clock_extra_time;
@@ -4020,12 +4048,12 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->amoeba_2_growth_prob           = level->bd_amoeba_2_slow_growth_rate * 10000;
   cave->amoeba_2_fast_growth_prob      = level->bd_amoeba_2_fast_growth_rate * 10000;
 
-  cave->amoeba_too_big_effect      = map_element_RND_to_BD(level->bd_amoeba_content_too_big);
-  cave->amoeba_enclosed_effect     = map_element_RND_to_BD(level->bd_amoeba_content_enclosed);
-  cave->amoeba_2_too_big_effect     = map_element_RND_to_BD(level->bd_amoeba_2_content_too_big);
-  cave->amoeba_2_enclosed_effect    = map_element_RND_to_BD(level->bd_amoeba_2_content_enclosed);
-  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->amoeba_too_big_effect          = map_element_RND_to_BD_cave(level->bd_amoeba_content_too_big);
+  cave->amoeba_enclosed_effect         = map_element_RND_to_BD_cave(level->bd_amoeba_content_enclosed);
+  cave->amoeba_2_too_big_effect                = map_element_RND_to_BD_cave(level->bd_amoeba_2_content_too_big);
+  cave->amoeba_2_enclosed_effect       = map_element_RND_to_BD_cave(level->bd_amoeba_2_content_enclosed);
+  cave->amoeba_2_explosion_effect      = map_element_RND_to_BD_cave(level->bd_amoeba_2_content_exploding);
+  cave->amoeba_2_looks_like            = map_element_RND_to_BD_cave(level->bd_amoeba_2_content_looks_like);
 
   cave->slime_predictable              = level->bd_slime_is_predictable;
   cave->slime_correct_random           = level->bd_slime_correct_random;
@@ -4034,17 +4062,25 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   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_eats_this                 = map_element_RND_to_BD_cave(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->acid_turns_to                  = map_element_RND_to_BD_cave(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->biter_eat                      = map_element_RND_to_BD_cave(level->bd_biter_eats_element);
 
-  cave->bladder_converts_by        = map_element_RND_to_BD(level->bd_bladder_converts_by_element);
+  cave->bladder_converts_by            = map_element_RND_to_BD_cave(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';
@@ -4052,7 +4088,7 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   // playfield elements
   for (x = 0; x < cave->w; x++)
     for (y = 0; y < cave->h; y++)
-      cave->map[y][x] = map_element_RND_to_BD(level->field[x][y]);
+      cave->map[y][x] = map_element_RND_to_BD_cave(level->field[x][y]);
 }
 
 static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
@@ -4097,7 +4133,7 @@ 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);
+  level->bd_snap_element               = map_element_BD_to_RND_cave(cave->snap_element);
 
   // element properties
   level->bd_clock_extra_time           = cave->level_bonus_time[bd_level_nr];
@@ -4121,12 +4157,12 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   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;
 
-  level->bd_amoeba_content_too_big     = map_element_BD_to_RND(cave->amoeba_too_big_effect);
-  level->bd_amoeba_content_enclosed    = map_element_BD_to_RND(cave->amoeba_enclosed_effect);
-  level->bd_amoeba_2_content_too_big   = map_element_BD_to_RND(cave->amoeba_2_too_big_effect);
-  level->bd_amoeba_2_content_enclosed  = map_element_BD_to_RND(cave->amoeba_2_enclosed_effect);
-  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_amoeba_content_too_big     = map_element_BD_to_RND_cave(cave->amoeba_too_big_effect);
+  level->bd_amoeba_content_enclosed    = map_element_BD_to_RND_cave(cave->amoeba_enclosed_effect);
+  level->bd_amoeba_2_content_too_big   = map_element_BD_to_RND_cave(cave->amoeba_2_too_big_effect);
+  level->bd_amoeba_2_content_enclosed  = map_element_BD_to_RND_cave(cave->amoeba_2_enclosed_effect);
+  level->bd_amoeba_2_content_exploding = map_element_BD_to_RND_cave(cave->amoeba_2_explosion_effect);
+  level->bd_amoeba_2_content_looks_like        = map_element_BD_to_RND_cave(cave->amoeba_2_looks_like);
 
   level->bd_slime_is_predictable       = cave->slime_predictable;
   level->bd_slime_correct_random       = cave->slime_correct_random;
@@ -4135,17 +4171,25 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   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_eats_element          = map_element_BD_to_RND_cave(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_acid_turns_to_element      = map_element_BD_to_RND_cave(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_biter_eats_element         = map_element_BD_to_RND_cave(cave->biter_eat);
 
-  level->bd_bladder_converts_by_element        = map_element_BD_to_RND(cave->bladder_converts_by);
+  level->bd_bladder_converts_by_element        = map_element_BD_to_RND_cave(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);
 
@@ -4155,7 +4199,7 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   // playfield elements
   for (x = 0; x < level->fieldx; x++)
     for (y = 0; y < level->fieldy; y++)
-      level->field[x][y] = map_element_BD_to_RND(cave->map[y][x]);
+      level->field[x][y] = map_element_BD_to_RND_cave(cave->map[y][x]);
 
   checked_free(cave_name);
 }
@@ -10488,6 +10532,10 @@ static struct TokenInfo editor_cascade_setup_tokens[] =
     TYPE_SWITCH,
     &setup.editor_cascade.el_bd_native,                "editor.cascade.el_bd_native"
   },
+  {
+    TYPE_SWITCH,
+    &setup.editor_cascade.el_bd_effects,       "editor.cascade.el_bd_effects"
+  },
   {
     TYPE_SWITCH,
     &setup.editor_cascade.el_em,               "editor.cascade.el_em"
@@ -11182,6 +11230,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
 
   si->editor.el_boulderdash            = TRUE;
   si->editor.el_boulderdash_native     = TRUE;
+  si->editor.el_boulderdash_effects    = TRUE;
   si->editor.el_emerald_mine           = TRUE;
   si->editor.el_emerald_mine_club      = TRUE;
   si->editor.el_more                   = TRUE;
@@ -11356,6 +11405,7 @@ static void setSetupInfoToDefaults_EditorCascade(struct SetupInfo *si)
 {
   si->editor_cascade.el_bd             = TRUE;
   si->editor_cascade.el_bd_native      = TRUE;
+  si->editor_cascade.el_bd_effects     = FALSE;
   si->editor_cascade.el_em             = TRUE;
   si->editor_cascade.el_emc            = TRUE;
   si->editor_cascade.el_rnd            = TRUE;