added support for BD game engine to Makefile for Android
[rocksndiamonds.git] / src / files.c
index cf35328611c6f57ced6a641035bd02ae00eff9bf..c620a531b37bf4e30517c01366137a61e78edf8e 100644 (file)
@@ -19,6 +19,7 @@
 #include "files.h"
 #include "init.h"
 #include "screens.h"
+#include "editor.h"
 #include "tools.h"
 #include "tape.h"
 #include "config.h"
@@ -310,6 +311,41 @@ static struct LevelFileConfigInfo chunk_config_INFO[] =
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(23),
     &li.bd_cave_random_seed_c64,       0
   },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(3),
+    &li.bd_color_b,                    GD_C64_COLOR(0)
+  },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(4),
+    &li.bd_color_0,                    GD_C64_COLOR(0)
+  },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(5),
+    &li.bd_color_1,                    GD_C64_COLOR(8)
+  },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(6),
+    &li.bd_color_2,                    GD_C64_COLOR(11)
+  },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(7),
+    &li.bd_color_3,                    GD_C64_COLOR(1)
+  },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(8),
+    &li.bd_color_4,                    GD_C64_COLOR(5)
+  },
+  {
+    -1,                                        -1,
+    TYPE_INTEGER,                      CONF_VALUE_32_BIT(9),
+    &li.bd_color_5,                    GD_C64_COLOR(6)
+  },
 
   {
     -1,                                        -1,
@@ -604,402 +640,417 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
   // (these values are only valid for BD style levels)
   // (some values for BD style amoeba following below)
   {
-    EL_BD_PLAYER,                      -1,
+    EL_BDX_PLAYER,                     -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_diagonal_movements,         FALSE
   },
   {
-    EL_BD_PLAYER,                      -1,
+    EL_BDX_PLAYER,                     -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_topmost_player_active,      TRUE
   },
   {
-    EL_BD_PLAYER,                      -1,
+    EL_BDX_PLAYER,                     -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(3),
     &li.bd_pushing_prob,               25
   },
   {
-    EL_BD_PLAYER,                      -1,
+    EL_BDX_PLAYER,                     -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(4),
     &li.bd_pushing_prob_with_sweet,    100
   },
   {
-    EL_BD_PLAYER,                      -1,
+    EL_BDX_PLAYER,                     -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(5),
     &li.bd_push_mega_rock_with_sweet,  FALSE
   },
   {
-    EL_BD_PLAYER,                      -1,
+    EL_BDX_PLAYER,                     -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(6),
     &li.bd_snap_element,               EL_EMPTY
   },
 
   {
-    EL_BD_SAND,                                -1,
+    EL_BDX_SAND_1,                     -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_sand_looks_like,            EL_BD_SAND
+    &li.bd_sand_looks_like,            EL_BDX_SAND_1
   },
 
   {
-    EL_BD_ROCK,                                -1,
+    EL_BDX_ROCK,                       -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_rock_turns_to_on_falling,   EL_BD_ROCK_FALLING
+    &li.bd_rock_turns_to_on_falling,   EL_BDX_ROCK_FALLING
   },
   {
-    EL_BD_ROCK,                                -1,
+    EL_BDX_ROCK,                       -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
-    &li.bd_rock_turns_to_on_impact,    EL_BD_ROCK
+    &li.bd_rock_turns_to_on_impact,    EL_BDX_ROCK
   },
 
   {
-    EL_BD_DIAMOND,                     -1,
+    EL_BDX_DIAMOND,                    -1,
     TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
     &li.score[SC_DIAMOND_EXTRA],       20
   },
   {
-    EL_BD_DIAMOND,                     -1,
+    EL_BDX_DIAMOND,                    -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
-    &li.bd_diamond_turns_to_on_falling,        EL_BD_DIAMOND_FALLING
+    &li.bd_diamond_turns_to_on_falling,        EL_BDX_DIAMOND_FALLING
   },
   {
-    EL_BD_DIAMOND,                     -1,
+    EL_BDX_DIAMOND,                    -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(3),
-    &li.bd_diamond_turns_to_on_impact, EL_BD_DIAMOND
+    &li.bd_diamond_turns_to_on_impact, EL_BDX_DIAMOND
   },
 
   {
-    EL_BD_FIREFLY,                     -1,
+    EL_BDX_FIREFLY_1,                  -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_firefly_explodes_to,                EL_BD_EXPLODING_1
+    &li.bd_firefly_1_explodes_to,      EL_BDX_EXPLODING_1
   },
 
   {
-    EL_BD_FIREFLY_2,                   -1,
+    EL_BDX_FIREFLY_2,                  -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_firefly_2_explodes_to,      EL_BD_EXPLODING_1
+    &li.bd_firefly_2_explodes_to,      EL_BDX_EXPLODING_1
   },
 
   {
-    EL_BD_BUTTERFLY,                   -1,
+    EL_BDX_BUTTERFLY_1,                        -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_butterfly_explodes_to,      EL_BD_DIAMOND_GROWING_1
+    &li.bd_butterfly_1_explodes_to,    EL_BDX_DIAMOND_GROWING_1
   },
 
   {
-    EL_BD_BUTTERFLY_2,                 -1,
+    EL_BDX_BUTTERFLY_2,                        -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_butterfly_2_explodes_to,    EL_BD_DIAMOND_GROWING_1
+    &li.bd_butterfly_2_explodes_to,    EL_BDX_DIAMOND_GROWING_1
   },
 
   {
-    EL_BD_STONEFLY,                    -1,
+    EL_BDX_STONEFLY,                   -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_stonefly_explodes_to,       EL_BD_ROCK_GROWING_1
+    &li.bd_stonefly_explodes_to,       EL_BDX_ROCK_GROWING_1
   },
 
   {
-    EL_BD_DRAGONFLY,                   -1,
+    EL_BDX_DRAGONFLY,                  -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_dragonfly_explodes_to,      EL_BD_EXPLODING_1
+    &li.bd_dragonfly_explodes_to,      EL_BDX_EXPLODING_1
   },
 
   {
-    EL_BD_DIAMOND_GROWING_5,           -1,
+    EL_BDX_DIAMOND_GROWING_5,  -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_diamond_birth_turns_to,     EL_BD_DIAMOND
+    &li.bd_diamond_birth_turns_to,     EL_BDX_DIAMOND
   },
 
   {
-    EL_BD_BOMB_EXPLODING_4,            -1,
+    EL_BDX_BOMB_EXPLODING_4,           -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_bomb_explosion_turns_to,    EL_BD_WALL
+    &li.bd_bomb_explosion_turns_to,    EL_BDX_WALL
   },
 
   {
-    EL_BD_NITRO_PACK_EXPLODING_4,      -1,
+    EL_BDX_NITRO_PACK_EXPLODING_4,     -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
     &li.bd_nitro_explosion_turns_to,   EL_EMPTY
   },
 
   {
-    EL_BD_EXPLODING_5,                 -1,
+    EL_BDX_EXPLODING_5,                        -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
     &li.bd_explosion_turns_to,         EL_EMPTY
   },
 
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_magic_wall_wait_hatching,   FALSE
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_magic_wall_stops_amoeba,    TRUE
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
-    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_magic_wall_diamond_to,      EL_BD_ROCK_FALLING
+    EL_BDX_MAGIC_WALL,                 -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(3),
+    &li.bd_magic_wall_zero_infinite,   TRUE
+  },
+  {
+    EL_BDX_MAGIC_WALL,                 -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
+    &li.bd_magic_wall_break_scan,      FALSE
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
+    TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
+    &li.bd_magic_wall_time,            999
+  },
+  {
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
-    &li.bd_magic_wall_rock_to,         EL_BD_DIAMOND_FALLING
+    &li.bd_magic_wall_diamond_to,      EL_BDX_ROCK_FALLING
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(3),
-    &li.bd_magic_wall_mega_rock_to,    EL_BD_NITRO_PACK_FALLING
+    &li.bd_magic_wall_rock_to,         EL_BDX_DIAMOND_FALLING
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(4),
-    &li.bd_magic_wall_nut_to,          EL_BD_NUT_FALLING
+    &li.bd_magic_wall_mega_rock_to,    EL_BDX_NITRO_PACK_FALLING
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(5),
-    &li.bd_magic_wall_nitro_pack_to,   EL_BD_MEGA_ROCK_FALLING
+    &li.bd_magic_wall_nut_to,          EL_BDX_NUT_FALLING
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(6),
-    &li.bd_magic_wall_flying_diamond_to, EL_BD_FLYING_ROCK_FLYING
+    &li.bd_magic_wall_nitro_pack_to,   EL_BDX_MEGA_ROCK_FALLING
   },
   {
-    EL_BD_MAGIC_WALL,                  -1,
+    EL_BDX_MAGIC_WALL,                 -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(7),
-    &li.bd_magic_wall_flying_rock_to,  EL_BD_FLYING_DIAMOND_FLYING
+    &li.bd_magic_wall_flying_diamond_to, EL_BDX_FLYING_ROCK_FLYING
+  },
+  {
+    EL_BDX_MAGIC_WALL,                 -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(8),
+    &li.bd_magic_wall_flying_rock_to,  EL_BDX_FLYING_DIAMOND_FLYING
   },
 
   {
-    EL_BD_CLOCK,                       -1,
+    EL_BDX_CLOCK,                      -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
     &li.bd_clock_extra_time,           30
   },
 
   {
-    EL_BD_VOODOO_DOLL,                 -1,
+    EL_BDX_VOODOO_DOLL,                        -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_voodoo_collects_diamonds,   FALSE
   },
   {
-    EL_BD_VOODOO_DOLL,                 -1,
+    EL_BDX_VOODOO_DOLL,                        -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_voodoo_hurt_kills_player,   FALSE
   },
   {
-    EL_BD_VOODOO_DOLL,                 -1,
+    EL_BDX_VOODOO_DOLL,                        -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(3),
     &li.bd_voodoo_dies_by_rock,                FALSE
   },
   {
-    EL_BD_VOODOO_DOLL,                 -1,
+    EL_BDX_VOODOO_DOLL,                        -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
     &li.bd_voodoo_vanish_by_explosion, TRUE
   },
   {
-    EL_BD_VOODOO_DOLL,                 -1,
+    EL_BDX_VOODOO_DOLL,                        -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(5),
     &li.bd_voodoo_penalty_time,                30
   },
 
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_slime_is_predictable,       TRUE
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
     &li.bd_slime_permeability_rate,    100
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(3),
     &li.bd_slime_permeability_bits_c64,        0
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_INTEGER,                      CONF_VALUE_32_BIT(1),
     &li.bd_slime_random_seed_c64,      -1
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_slime_eats_element_1,       EL_BD_DIAMOND
+    &li.bd_slime_eats_element_1,       EL_BDX_DIAMOND
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
-    &li.bd_slime_converts_to_element_1,        EL_BD_DIAMOND_FALLING
+    &li.bd_slime_converts_to_element_1,        EL_BDX_DIAMOND_FALLING
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(3),
-    &li.bd_slime_eats_element_2,       EL_BD_ROCK
+    &li.bd_slime_eats_element_2,       EL_BDX_ROCK
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(4),
-    &li.bd_slime_converts_to_element_2,        EL_BD_ROCK_FALLING
+    &li.bd_slime_converts_to_element_2,        EL_BDX_ROCK_FALLING
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(5),
-    &li.bd_slime_eats_element_3,       EL_BD_NUT
+    &li.bd_slime_eats_element_3,       EL_BDX_NUT
   },
   {
-    EL_BD_SLIME,                       -1,
+    EL_BDX_SLIME,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(6),
-    &li.bd_slime_converts_to_element_3,        EL_BD_NUT_FALLING
+    &li.bd_slime_converts_to_element_3,        EL_BDX_NUT_FALLING
   },
 
   {
-    EL_BD_ACID,                                -1,
+    EL_BDX_ACID,                       -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_acid_eats_element,          EL_BD_SAND
+    &li.bd_acid_eats_element,          EL_BDX_SAND_1
   },
   {
-    EL_BD_ACID,                                -1,
+    EL_BDX_ACID,                       -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
     &li.bd_acid_spread_rate,           3
   },
   {
-    EL_BD_ACID,                                -1,
+    EL_BDX_ACID,                       -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
-    &li.bd_acid_turns_to_element,      EL_BD_EXPLODING_3
+    &li.bd_acid_turns_to_element,      EL_BDX_EXPLODING_3
   },
 
   {
-    EL_BD_BITER,                       -1,
+    EL_BDX_BITER,                      -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
     &li.bd_biter_move_delay,           0
   },
   {
-    EL_BD_BITER,                       -1,
+    EL_BDX_BITER,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_biter_eats_element,         EL_BD_DIAMOND
+    &li.bd_biter_eats_element,         EL_BDX_DIAMOND
   },
 
   {
-    EL_BD_BLADDER,                     -1,
+    EL_BDX_BLADDER,                    -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_bladder_converts_by_element,        EL_BD_VOODOO_DOLL
+    &li.bd_bladder_converts_by_element,        EL_BDX_VOODOO_DOLL
   },
 
   {
-    EL_BD_EXPANDABLE_WALL_ANY,         -1,
+    EL_BDX_EXPANDABLE_WALL_ANY,                -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_change_expanding_wall,      FALSE
   },
   {
-    EL_BD_EXPANDABLE_WALL_ANY,         -1,
+    EL_BDX_EXPANDABLE_WALL_ANY,                -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_expanding_wall_looks_like,  EL_BD_WALL
+    &li.bd_expanding_wall_looks_like,  EL_BDX_WALL
   },
 
   {
-    EL_BD_REPLICATOR,                  -1,
+    EL_BDX_REPLICATOR,                 -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_replicators_active,         TRUE
   },
   {
-    EL_BD_REPLICATOR,                  -1,
+    EL_BDX_REPLICATOR,                 -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
     &li.bd_replicator_create_delay,    4
   },
 
   {
-    EL_BD_CONVEYOR_LEFT,               -1,
+    EL_BDX_CONVEYOR_LEFT,              -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_conveyor_belts_active,      TRUE
   },
   {
-    EL_BD_CONVEYOR_LEFT,               -1,
+    EL_BDX_CONVEYOR_LEFT,              -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_conveyor_belts_changed,     FALSE
   },
 
   {
-    EL_BD_WATER,                       -1,
+    EL_BDX_WATER,                      -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_water_cannot_flow_down,     FALSE
   },
 
   {
-    EL_BD_NUT,                         -1,
+    EL_BDX_NUT,                                -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
-    &li.bd_nut_content,                        EL_BD_NUT_BREAKING_1
+    &li.bd_nut_content,                        EL_BDX_NUT_BREAKING_1
   },
 
   {
-    EL_BD_PNEUMATIC_HAMMER,            -1,
+    EL_BDX_PNEUMATIC_HAMMER,           -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
     &li.bd_hammer_walls_break_delay,   5
   },
   {
-    EL_BD_PNEUMATIC_HAMMER,            -1,
+    EL_BDX_PNEUMATIC_HAMMER,           -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_hammer_walls_reappear,      FALSE
   },
   {
-    EL_BD_PNEUMATIC_HAMMER,            -1,
+    EL_BDX_PNEUMATIC_HAMMER,           -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(3),
     &li.bd_hammer_walls_reappear_delay,        100
   },
 
   {
-    EL_BD_ROCKET_LAUNCHER,             -1,
+    EL_BDX_ROCKET_LAUNCHER,            -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_infinite_rockets,           FALSE
   },
 
   {
-    EL_BD_SKELETON,                    -1,
+    EL_BDX_SKELETON,                   -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
     &li.bd_num_skeletons_needed_for_pot, 5
   },
   {
-    EL_BD_SKELETON,                    -1,
+    EL_BDX_SKELETON,                   -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
     &li.bd_skeleton_worth_num_diamonds,        0
   },
 
   {
-    EL_BD_CREATURE_SWITCH,             -1,
+    EL_BDX_CREATURE_SWITCH,            -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.bd_creatures_start_backwards,  FALSE
   },
   {
-    EL_BD_CREATURE_SWITCH,             -1,
+    EL_BDX_CREATURE_SWITCH,            -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_creatures_turn_on_hatching, FALSE
   },
   {
-    EL_BD_CREATURE_SWITCH,             -1,
+    EL_BDX_CREATURE_SWITCH,            -1,
     TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
     &li.bd_creatures_auto_turn_delay,  0
   },
 
   {
-    EL_BD_GRAVITY_SWITCH,              -1,
+    EL_BDX_GRAVITY_SWITCH,             -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
     &li.bd_gravity_direction,          GD_MV_DOWN
   },
   {
-    EL_BD_GRAVITY_SWITCH,              -1,
+    EL_BDX_GRAVITY_SWITCH,             -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
     &li.bd_gravity_switch_active,      FALSE
   },
   {
-    EL_BD_GRAVITY_SWITCH,              -1,
+    EL_BDX_GRAVITY_SWITCH,             -1,
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(3),
     &li.bd_gravity_switch_delay,       10
   },
   {
-    EL_BD_GRAVITY_SWITCH,              -1,
+    EL_BDX_GRAVITY_SWITCH,             -1,
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
     &li.bd_gravity_affects_all,                TRUE
   },
@@ -1066,7 +1117,6 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     &li.score[SC_CRYSTAL],             10
   },
 
-  // (amoeba values used by R'n'D game engine only)
   {
     EL_BD_AMOEBA,                      -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
@@ -1082,92 +1132,92 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
     &li.grow_into_diggable,            TRUE
   },
-  // (amoeba values used by BD game engine only)
-  {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
-    &li.bd_amoeba_wait_for_hatching,   FALSE
-  },
+
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(3),
-    &li.bd_amoeba_start_immediately,   TRUE
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
+    &li.bd_amoeba_1_threshold_too_big, 200
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
-    &li.bd_amoeba_2_explode_by_amoeba, TRUE
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_16_BIT(2),
+    &li.bd_amoeba_1_slow_growth_time,  200
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_INTEGER,                      CONF_VALUE_16_BIT(3),
-    &li.bd_amoeba_threshold_too_big,   200
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(3),
+    &li.bd_amoeba_1_content_too_big,   EL_BDX_ROCK
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_INTEGER,                      CONF_VALUE_16_BIT(4),
-    &li.bd_amoeba_slow_growth_time,    200
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(4),
+    &li.bd_amoeba_1_content_enclosed,  EL_BDX_DIAMOND
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_INTEGER,                      CONF_VALUE_8_BIT(5),
-    &li.bd_amoeba_slow_growth_rate,    3
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
+    &li.bd_amoeba_1_slow_growth_rate,  3
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_INTEGER,                      CONF_VALUE_8_BIT(6),
-    &li.bd_amoeba_fast_growth_rate,    25
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
+    &li.bd_amoeba_1_fast_growth_rate,  25
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(5),
-    &li.bd_amoeba_content_too_big,     EL_BD_ROCK
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(3),
+    &li.bd_amoeba_wait_for_hatching,   FALSE
   },
   {
-    EL_BD_AMOEBA,                      -1,
-    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(6),
-    &li.bd_amoeba_content_enclosed,    EL_BD_DIAMOND
+    EL_BDX_AMOEBA_1,                   -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
+    &li.bd_amoeba_start_immediately,   TRUE
   },
 
   {
-    EL_BD_AMOEBA_2,                    -1,
-    TYPE_INTEGER,                      CONF_VALUE_16_BIT(3),
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
     &li.bd_amoeba_2_threshold_too_big, 200
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
-    TYPE_INTEGER,                      CONF_VALUE_16_BIT(4),
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_16_BIT(2),
     &li.bd_amoeba_2_slow_growth_time,  200
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
-    TYPE_INTEGER,                      CONF_VALUE_8_BIT(5),
-    &li.bd_amoeba_2_slow_growth_rate,  3
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(3),
+    &li.bd_amoeba_2_content_too_big,   EL_BDX_ROCK
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
-    TYPE_INTEGER,                      CONF_VALUE_8_BIT(6),
-    &li.bd_amoeba_2_fast_growth_rate,  25
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(4),
+    &li.bd_amoeba_2_content_enclosed,  EL_BDX_DIAMOND
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
+    EL_BDX_AMOEBA_2,                   -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(5),
-    &li.bd_amoeba_2_content_too_big,   EL_BD_ROCK
+    &li.bd_amoeba_2_content_exploding, EL_EMPTY
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
+    EL_BDX_AMOEBA_2,                   -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(6),
-    &li.bd_amoeba_2_content_enclosed,  EL_BD_DIAMOND
+    &li.bd_amoeba_2_content_looks_like,        EL_BDX_AMOEBA_2
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
-    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(7),
-    &li.bd_amoeba_2_content_exploding, EL_EMPTY
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
+    &li.bd_amoeba_2_slow_growth_rate,  3
   },
   {
-    EL_BD_AMOEBA_2,                    -1,
-    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(8),
-    &li.bd_amoeba_2_content_looks_like,        EL_BD_AMOEBA_2
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(2),
+    &li.bd_amoeba_2_fast_growth_rate,  25
+  },
+  {
+    EL_BDX_AMOEBA_2,                   -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(3),
+    &li.bd_amoeba_2_explode_by_amoeba, TRUE
   },
 
   {
@@ -2288,6 +2338,11 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change)
 
 static void setLevelInfoToDefaults_Level(struct LevelInfo *level)
 {
+  boolean add_border = FALSE;
+  int x1 = 0;
+  int y1 = 0;
+  int x2 = STD_LEV_FIELDX - 1;
+  int y2 = STD_LEV_FIELDY - 1;
   int i, x, y;
 
   li = *level;         // copy level data into temporary buffer
@@ -2323,19 +2378,49 @@ static void setLevelInfoToDefaults_Level(struct LevelInfo *level)
   strcpy(level->name, NAMELESS_LEVEL_NAME);
   strcpy(level->author, ANONYMOUS_NAME);
 
+  // set default game engine type
+  level->game_engine_type = setup.default_game_engine_type;
+
+  // some game engines should have a default playfield with border elements
+  if (level->game_engine_type == GAME_ENGINE_TYPE_BD ||
+      level->game_engine_type == GAME_ENGINE_TYPE_EM ||
+      level->game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    add_border = TRUE;
+    x1++;
+    y1++;
+    x2--;
+    y2--;
+  }
+
   // set level playfield to playable default level with player and exit
   for (x = 0; x < MAX_LEV_FIELDX; x++)
+  {
     for (y = 0; y < MAX_LEV_FIELDY; y++)
-      level->field[x][y] = EL_SAND;
+    {
+      if (add_border && (x == 0 || x == STD_LEV_FIELDX - 1 ||
+                        y == 0 || y == STD_LEV_FIELDY - 1))
+       level->field[x][y] = getEngineElement(EL_STEELWALL);
+      else
+       level->field[x][y] = getEngineElement(EL_SAND);
+    }
+  }
 
-  level->field[0][0] = EL_PLAYER_1;
-  level->field[STD_LEV_FIELDX - 1][STD_LEV_FIELDY - 1] = EL_EXIT_CLOSED;
+  level->field[x1][y1] = getEngineElement(EL_PLAYER_1);
+  level->field[x2][y2] = getEngineElement(EL_EXIT_CLOSED);
 
-  BorderElement = EL_STEELWALL;
+  BorderElement = getEngineElement(EL_STEELWALL);
 
   // detect custom elements when loading them
   level->file_has_custom_elements = FALSE;
 
+  // set random colors for BD style levels according to preferred color type
+  SetRandomLevelColors_BD(setup.bd_default_color_type);
+
+  // set default color type and colors for BD style level colors
+  SetDefaultLevelColorType_BD();
+  SetDefaultLevelColors_BD();
+
   // set all bug compatibility flags to "false" => do not emulate this bug
   level->use_action_after_change_bug = FALSE;
 
@@ -2590,13 +2675,18 @@ static void ActivateLevelTemplate(void)
   }
 }
 
+boolean isLevelsetFilename_BD(char *filename)
+{
+  return (strSuffixLower(filename, ".bd") ||
+         strSuffixLower(filename, ".bdr") ||
+         strSuffixLower(filename, ".brc") ||
+         strSuffixLower(filename, ".gds"));
+}
+
 static boolean checkForPackageFromBasename_BD(char *basename)
 {
   // check for native BD level file extensions
-  if (!strSuffixLower(basename, ".bd") &&
-      !strSuffixLower(basename, ".bdr") &&
-      !strSuffixLower(basename, ".brc") &&
-      !strSuffixLower(basename, ".gds"))
+  if (!isLevelsetFilename_BD(basename))
     return FALSE;
 
   // check for standard single-level BD files (like "001.bd")
@@ -4263,9 +4353,11 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->voodoo_dies_by_stone           = level->bd_voodoo_dies_by_rock;
   cave->voodoo_disappear_in_explosion  = level->bd_voodoo_vanish_by_explosion;
   cave->level_penalty_time[0]          = level->bd_voodoo_penalty_time;
-  cave->level_magic_wall_time[0]       = level->time_magic_wall;
+  cave->level_magic_wall_time[0]       = level->bd_magic_wall_time;
+  cave->magic_timer_zero_is_infinite   = level->bd_magic_wall_zero_infinite;
   cave->magic_timer_wait_for_hatching  = level->bd_magic_wall_wait_hatching;
   cave->magic_wall_stops_amoeba                = level->bd_magic_wall_stops_amoeba;
+  cave->magic_wall_breakscan           = level->bd_magic_wall_break_scan;
 
   cave->magic_diamond_to               = LEVEL_TO_CAVE(level->bd_magic_wall_diamond_to);
   cave->magic_stone_to                 = LEVEL_TO_CAVE(level->bd_magic_wall_rock_to);
@@ -4278,17 +4370,17 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->amoeba_timer_wait_for_hatching = level->bd_amoeba_wait_for_hatching;
   cave->amoeba_timer_started_immediately= level->bd_amoeba_start_immediately;
   cave->amoeba_2_explodes_by_amoeba    = level->bd_amoeba_2_explode_by_amoeba;
-  cave->level_amoeba_threshold[0]      = level->bd_amoeba_threshold_too_big;
-  cave->level_amoeba_time[0]           = level->bd_amoeba_slow_growth_time;
-  cave->amoeba_growth_prob             = level->bd_amoeba_slow_growth_rate * 10000;
-  cave->amoeba_fast_growth_prob                = level->bd_amoeba_fast_growth_rate * 10000;
+  cave->level_amoeba_threshold[0]      = level->bd_amoeba_1_threshold_too_big;
+  cave->level_amoeba_time[0]           = level->bd_amoeba_1_slow_growth_time;
+  cave->amoeba_growth_prob             = level->bd_amoeba_1_slow_growth_rate * 10000;
+  cave->amoeba_fast_growth_prob                = level->bd_amoeba_1_fast_growth_rate * 10000;
   cave->level_amoeba_2_threshold[0]    = level->bd_amoeba_2_threshold_too_big;
   cave->level_amoeba_2_time[0]         = level->bd_amoeba_2_slow_growth_time;
   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          = LEVEL_TO_CAVE(level->bd_amoeba_content_too_big);
-  cave->amoeba_enclosed_effect         = LEVEL_TO_CAVE(level->bd_amoeba_content_enclosed);
+  cave->amoeba_too_big_effect          = LEVEL_TO_CAVE(level->bd_amoeba_1_content_too_big);
+  cave->amoeba_enclosed_effect         = LEVEL_TO_CAVE(level->bd_amoeba_1_content_enclosed);
   cave->amoeba_2_too_big_effect                = LEVEL_TO_CAVE(level->bd_amoeba_2_content_too_big);
   cave->amoeba_2_enclosed_effect       = LEVEL_TO_CAVE(level->bd_amoeba_2_content_enclosed);
   cave->amoeba_2_explosion_effect      = LEVEL_TO_CAVE(level->bd_amoeba_2_content_exploding);
@@ -4354,9 +4446,9 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->diamond_falling_effect         = LEVEL_TO_CAVE(level->bd_diamond_turns_to_on_falling);
   cave->diamond_bouncing_effect                = LEVEL_TO_CAVE(level->bd_diamond_turns_to_on_impact);
 
-  cave->firefly_explode_to             = LEVEL_TO_CAVE(level->bd_firefly_explodes_to);
+  cave->firefly_explode_to             = LEVEL_TO_CAVE(level->bd_firefly_1_explodes_to);
   cave->alt_firefly_explode_to         = LEVEL_TO_CAVE(level->bd_firefly_2_explodes_to);
-  cave->butterfly_explode_to           = LEVEL_TO_CAVE(level->bd_butterfly_explodes_to);
+  cave->butterfly_explode_to           = LEVEL_TO_CAVE(level->bd_butterfly_1_explodes_to);
   cave->alt_butterfly_explode_to       = LEVEL_TO_CAVE(level->bd_butterfly_2_explodes_to);
   cave->stonefly_explode_to            = LEVEL_TO_CAVE(level->bd_stonefly_explodes_to);
   cave->dragonfly_explode_to           = LEVEL_TO_CAVE(level->bd_dragonfly_explodes_to);
@@ -4366,6 +4458,14 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->nitro_explosion_effect         = LEVEL_TO_CAVE(level->bd_nitro_explosion_turns_to);
   cave->explosion_effect               = LEVEL_TO_CAVE(level->bd_explosion_turns_to);
 
+  cave->colorb                         = level->bd_color_b;
+  cave->color0                         = level->bd_color_0;
+  cave->color1                         = level->bd_color_1;
+  cave->color2                         = level->bd_color_2;
+  cave->color3                         = level->bd_color_3;
+  cave->color4                         = level->bd_color_4;
+  cave->color5                         = level->bd_color_5;
+
   // level name
   strncpy(cave->name, level->name, sizeof(GdString));
   cave->name[sizeof(GdString) - 1] = '\0';
@@ -4426,9 +4526,11 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   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[bd_level_nr];
-  level->time_magic_wall               = cave->level_magic_wall_time[bd_level_nr];
+  level->bd_magic_wall_time            = cave->level_magic_wall_time[bd_level_nr];
+  level->bd_magic_wall_zero_infinite   = cave->magic_timer_zero_is_infinite;
   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_magic_wall_break_scan      = cave->magic_wall_breakscan;
 
   level->bd_magic_wall_diamond_to      = CAVE_TO_LEVEL(cave->magic_diamond_to);
   level->bd_magic_wall_rock_to         = CAVE_TO_LEVEL(cave->magic_stone_to);
@@ -4441,17 +4543,17 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   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[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_1_threshold_too_big = cave->level_amoeba_threshold[bd_level_nr];
+  level->bd_amoeba_1_slow_growth_time  = cave->level_amoeba_time[bd_level_nr];
+  level->bd_amoeba_1_slow_growth_rate  = cave->amoeba_growth_prob      / 10000;
+  level->bd_amoeba_1_fast_growth_rate  = cave->amoeba_fast_growth_prob / 10000;
   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;
 
-  level->bd_amoeba_content_too_big     = CAVE_TO_LEVEL(cave->amoeba_too_big_effect);
-  level->bd_amoeba_content_enclosed    = CAVE_TO_LEVEL(cave->amoeba_enclosed_effect);
+  level->bd_amoeba_1_content_too_big   = CAVE_TO_LEVEL(cave->amoeba_too_big_effect);
+  level->bd_amoeba_1_content_enclosed  = CAVE_TO_LEVEL(cave->amoeba_enclosed_effect);
   level->bd_amoeba_2_content_too_big   = CAVE_TO_LEVEL(cave->amoeba_2_too_big_effect);
   level->bd_amoeba_2_content_enclosed  = CAVE_TO_LEVEL(cave->amoeba_2_enclosed_effect);
   level->bd_amoeba_2_content_exploding = CAVE_TO_LEVEL(cave->amoeba_2_explosion_effect);
@@ -4517,9 +4619,9 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   level->bd_diamond_turns_to_on_falling        = CAVE_TO_LEVEL(cave->diamond_falling_effect);
   level->bd_diamond_turns_to_on_impact = CAVE_TO_LEVEL(cave->diamond_bouncing_effect);
 
-  level->bd_firefly_explodes_to                = CAVE_TO_LEVEL(cave->firefly_explode_to);
+  level->bd_firefly_1_explodes_to      = CAVE_TO_LEVEL(cave->firefly_explode_to);
   level->bd_firefly_2_explodes_to      = CAVE_TO_LEVEL(cave->alt_firefly_explode_to);
-  level->bd_butterfly_explodes_to      = CAVE_TO_LEVEL(cave->butterfly_explode_to);
+  level->bd_butterfly_1_explodes_to    = CAVE_TO_LEVEL(cave->butterfly_explode_to);
   level->bd_butterfly_2_explodes_to    = CAVE_TO_LEVEL(cave->alt_butterfly_explode_to);
   level->bd_stonefly_explodes_to       = CAVE_TO_LEVEL(cave->stonefly_explode_to);
   level->bd_dragonfly_explodes_to      = CAVE_TO_LEVEL(cave->dragonfly_explode_to);
@@ -4529,6 +4631,18 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   level->bd_nitro_explosion_turns_to   = CAVE_TO_LEVEL(cave->nitro_explosion_effect);
   level->bd_explosion_turns_to         = CAVE_TO_LEVEL(cave->explosion_effect);
 
+  level->bd_color_b                    = cave->colorb;
+  level->bd_color_0                    = cave->color0;
+  level->bd_color_1                    = cave->color1;
+  level->bd_color_2                    = cave->color2;
+  level->bd_color_3                    = cave->color3;
+  level->bd_color_4                    = cave->color4;
+  level->bd_color_5                    = cave->color5;
+
+  // set default color type and colors for BD style level colors
+  SetDefaultLevelColorType_BD();
+  SetDefaultLevelColors_BD();
+
   // level name
   char *cave_name = getStringPrint("%s / %d", cave->name, bd_level_nr + 1);
 
@@ -8927,6 +9041,46 @@ void DumpLevels(void)
   CloseAllAndExit(0);
 }
 
+void DumpLevelsetFromFilename_BD(char *filename)
+{
+  if (leveldir_current == NULL)        // no levelsets loaded yet
+    bd_open_all();
+
+  if (!LoadNativeLevel_BD(filename, 0, FALSE))
+    CloseAllAndExit(0);                // function has already printed warning
+
+  PrintLine("-", 79);
+  Print("Levelset '%s'\n", filename);
+  PrintLine("-", 79);
+
+  DumpLevelset_BD();
+
+  PrintLine("-", 79);
+
+  CloseAllAndExit(0);
+}
+
+void DumpLevelset(void)
+{
+  static LevelDirTree *dumplevelset_leveldir = NULL;
+
+  dumplevelset_leveldir = getTreeInfoFromIdentifier(leveldir_first,
+                                                    global.dumplevelset_leveldir);
+  if (dumplevelset_leveldir == NULL)
+    Fail("no such level identifier: '%s'", global.dumplevelset_leveldir);
+
+  PrintLine("-", 79);
+  Print("Levelset '%s'\n", dumplevelset_leveldir->identifier);
+  PrintLine("-", 79);
+
+  Print("Number of levels:   %d\n", dumplevelset_leveldir->levels);
+  Print("First level number: %d\n", dumplevelset_leveldir->first_level);
+
+  PrintLine("-", 79);
+
+  CloseAllAndExit(0);
+}
+
 
 // ============================================================================
 // tape file functions
@@ -10562,6 +10716,10 @@ static struct TokenInfo global_setup_tokens[] =
     TYPE_SWITCH,
     &setup.skip_levels,                                "skip_levels"
   },
+  {
+    TYPE_SWITCH_3_STATES,
+    &setup.allow_skipping_levels,              "allow_skipping_levels"
+  },
   {
     TYPE_SWITCH,
     &setup.increment_levels,                   "increment_levels"
@@ -10650,6 +10808,10 @@ static struct TokenInfo global_setup_tokens[] =
     TYPE_INTEGER,
     &setup.game_frame_delay,                   "game_frame_delay"
   },
+  {
+    TYPE_INTEGER,
+    &setup.default_game_engine_type,           "default_game_engine_type"
+  },
   {
     TYPE_SWITCH,
     &setup.bd_skip_uncovering,                 "bd_skip_uncovering"
@@ -10663,9 +10825,45 @@ static struct TokenInfo global_setup_tokens[] =
     &setup.bd_scroll_delay,                    "bd_scroll_delay"
   },
   {
-    TYPE_SWITCH3,
+    TYPE_SWITCH,
+    &setup.bd_show_invisible_outbox,           "bd_show_invisible_outbox"
+  },
+  {
+    TYPE_SWITCH_3_STATES,
     &setup.bd_smooth_movements,                        "bd_smooth_movements"
   },
+  {
+    TYPE_SWITCH_3_STATES,
+    &setup.bd_pushing_graphics,                        "bd_pushing_graphics"
+  },
+  {
+    TYPE_SWITCH_3_STATES,
+    &setup.bd_up_down_graphics,                        "bd_up_down_graphics"
+  },
+  {
+    TYPE_SWITCH_3_STATES,
+    &setup.bd_skip_falling_sounds,             "bd_skip_falling_sounds"
+  },
+  {
+    TYPE_INTEGER,
+    &setup.bd_palette_c64,                     "bd_palette_c64"
+  },
+  {
+    TYPE_INTEGER,
+    &setup.bd_palette_c64dtv,                  "bd_palette_c64dtv"
+  },
+  {
+    TYPE_INTEGER,
+    &setup.bd_palette_atari,                   "bd_palette_atari"
+  },
+  {
+    TYPE_INTEGER,
+    &setup.bd_default_color_type,              "bd_default_color_type"
+  },
+  {
+    TYPE_SWITCH,
+    &setup.bd_random_colors,                   "bd_random_colors"
+  },
   {
     TYPE_SWITCH,
     &setup.sp_show_border_elements,            "sp_show_border_elements"
@@ -10699,15 +10897,15 @@ static struct TokenInfo global_setup_tokens[] =
     &setup.music_set,                          "music_set"
   },
   {
-    TYPE_SWITCH3,
+    TYPE_SWITCH_3_STATES,
     &setup.override_level_graphics,            "override_level_graphics"
   },
   {
-    TYPE_SWITCH3,
+    TYPE_SWITCH_3_STATES,
     &setup.override_level_sounds,              "override_level_sounds"
   },
   {
-    TYPE_SWITCH3,
+    TYPE_SWITCH_3_STATES,
     &setup.override_level_music,               "override_level_music"
   },
   {
@@ -10722,6 +10920,10 @@ static struct TokenInfo global_setup_tokens[] =
     TYPE_INTEGER,
     &setup.volume_music,                       "volume_music"
   },
+  {
+    TYPE_SWITCH,
+    &setup.audio_sample_rate_44100,            "audio_sample_rate_44100"
+  },
   {
     TYPE_SWITCH,
     &setup.network_mode,                       "network_mode"
@@ -10872,11 +11074,11 @@ static struct TokenInfo editor_cascade_setup_tokens[] =
   },
   {
     TYPE_SWITCH,
-    &setup.editor_cascade.el_bd_native,                "editor.cascade.el_bd_native"
+    &setup.editor_cascade.el_bdx,              "editor.cascade.el_bdx"
   },
   {
     TYPE_SWITCH,
-    &setup.editor_cascade.el_bd_effects,       "editor.cascade.el_bd_effects"
+    &setup.editor_cascade.el_bdx_effects,      "editor.cascade.el_bdx_effects"
   },
   {
     TYPE_SWITCH,
@@ -11042,6 +11244,14 @@ static struct TokenInfo shortcut_setup_tokens[] =
     TYPE_KEY_X11,
     &setup.shortcut.snap_down,                 "shortcut.snap_down"
   },
+  {
+    TYPE_KEY_X11,
+    &setup.shortcut.speed_fast,                        "shortcut.speed_fast"
+  },
+  {
+    TYPE_KEY_X11,
+    &setup.shortcut.speed_slow,                        "shortcut.speed_slow"
+  },
 };
 
 static struct SetupInputInfo setup_input;
@@ -11283,6 +11493,10 @@ static struct TokenInfo internal_setup_tokens[] =
     TYPE_BOOLEAN,
     &setup.internal.menu_shortcuts_snap,       "menu_shortcuts_snap"
   },
+  {
+    TYPE_BOOLEAN,
+    &setup.internal.menu_shortcuts_speed,      "menu_shortcuts_speed"
+  },
   {
     TYPE_BOOLEAN,
     &setup.internal.info_title,                        "info_title"
@@ -11411,7 +11625,7 @@ static struct TokenInfo debug_setup_tokens[] =
     &setup.debug.show_frames_per_second,       "debug.show_frames_per_second"
   },
   {
-    TYPE_SWITCH3,
+    TYPE_SWITCH_3_STATES,
     &setup.debug.xsn_mode,                     "debug.xsn_mode"
   },
   {
@@ -11464,6 +11678,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->team_mode = FALSE;
   si->handicap = TRUE;
   si->skip_levels = TRUE;
+  si->allow_skipping_levels = STATE_ASK;
   si->increment_levels = TRUE;
   si->auto_play_next_level = TRUE;
   si->count_score_after_game = TRUE;
@@ -11486,10 +11701,20 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->prefer_extra_panel_items = TRUE;
   si->game_speed_extended = FALSE;
   si->game_frame_delay = GAME_FRAME_DELAY;
+  si->default_game_engine_type = GAME_ENGINE_TYPE_RND;
   si->bd_skip_uncovering = FALSE;
   si->bd_skip_hatching = FALSE;
   si->bd_scroll_delay = TRUE;
-  si->bd_smooth_movements = AUTO;
+  si->bd_show_invisible_outbox = FALSE;
+  si->bd_smooth_movements = STATE_TRUE;
+  si->bd_pushing_graphics = STATE_TRUE;
+  si->bd_up_down_graphics = STATE_TRUE;
+  si->bd_skip_falling_sounds = STATE_TRUE;
+  si->bd_palette_c64 = GD_DEFAULT_PALETTE_C64;
+  si->bd_palette_c64dtv = GD_DEFAULT_PALETTE_C64DTV;
+  si->bd_palette_atari = GD_DEFAULT_PALETTE_ATARI;
+  si->bd_default_color_type = GD_DEFAULT_COLOR_TYPE;
+  si->bd_random_colors = FALSE;
   si->sp_show_border_elements = FALSE;
   si->small_game_graphics = FALSE;
   si->show_load_save_buttons = FALSE;
@@ -11500,13 +11725,14 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->sounds_set   = getStringCopy(SND_CLASSIC_SUBDIR);
   si->music_set    = getStringCopy(MUS_CLASSIC_SUBDIR);
 
-  si->override_level_graphics = FALSE;
-  si->override_level_sounds = FALSE;
-  si->override_level_music = FALSE;
+  si->override_level_graphics = STATE_FALSE;
+  si->override_level_sounds = STATE_FALSE;
+  si->override_level_music = STATE_FALSE;
 
   si->volume_simple = 100;             // percent
   si->volume_loops = 100;              // percent
   si->volume_music = 100;              // percent
+  si->audio_sample_rate_44100 = FALSE;
 
   si->network_mode = FALSE;
   si->network_player_nr = 0;           // first player
@@ -11629,6 +11855,9 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->shortcut.snap_up         = DEFAULT_KEY_SNAP_UP;
   si->shortcut.snap_down       = DEFAULT_KEY_SNAP_DOWN;
 
+  si->shortcut.speed_fast      = DEFAULT_KEY_SPEED_FAST;
+  si->shortcut.speed_slow      = DEFAULT_KEY_SPEED_SLOW;
+
   for (i = 0; i < MAX_PLAYERS; i++)
   {
     si->input[i].use_joystick = FALSE;
@@ -11708,7 +11937,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
 
   si->debug.show_frames_per_second = FALSE;
 
-  si->debug.xsn_mode = AUTO;
+  si->debug.xsn_mode = STATE_AUTO;
   si->debug.xsn_percent = 0;
 
   si->options.verbose = FALSE;
@@ -11746,8 +11975,8 @@ static void setSetupInfoToDefaults_ServerSetup(struct SetupInfo *si)
 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_bdx            = TRUE;
+  si->editor_cascade.el_bdx_effects    = FALSE;
   si->editor_cascade.el_em             = TRUE;
   si->editor_cascade.el_emc            = TRUE;
   si->editor_cascade.el_rnd            = TRUE;
@@ -12276,7 +12505,7 @@ void SaveSetup_Default(void)
   fprintf(file, "\n");
   for (i = 0; i < ARRAY_SIZE(debug_setup_tokens); i++)
     if (!strPrefix(debug_setup_tokens[i].text, "debug.xsn_") ||
-       setup.debug.xsn_mode != AUTO)
+       setup.debug.xsn_mode != STATE_AUTO)
       fprintf(file, "%s\n", getSetupLine(debug_setup_tokens, "", i));
 
   fprintf(file, "\n");