extended support for rock/diamond settings in BD engine to level editor
[rocksndiamonds.git] / src / files.c
index e50a37635c0839d8665039ab645b19678733d847..67f3f3e1bb55a4f5f110975b00b2168049d9ac43 100644 (file)
@@ -307,12 +307,7 @@ static struct LevelFileConfigInfo chunk_config_INFO[] =
   },
   {
     -1,                                        -1,
-    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(23),
-    &li.bd_gravity_affects_all,                TRUE
-  },
-  {
-    -1,                                        -1,
-    TYPE_INTEGER,                      CONF_VALUE_8_BIT(24),
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(23),
     &li.bd_cave_random_seed_c64,       0
   },
 
@@ -639,11 +634,32 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     &li.bd_snap_element,               EL_EMPTY
   },
 
+  {
+    EL_BD_ROCK,                                -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
+    &li.bd_rock_turns_to_on_falling,   EL_BD_ROCK_FALLING
+  },
+  {
+    EL_BD_ROCK,                                -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
+    &li.bd_rock_turns_to_on_impact,    EL_BD_ROCK
+  },
+
   {
     EL_BD_DIAMOND,                     -1,
     TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
     &li.score[SC_DIAMOND_EXTRA],       20
   },
+  {
+    EL_BD_DIAMOND,                     -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(2),
+    &li.bd_diamond_turns_to_on_falling,        EL_BD_DIAMOND_FALLING
+  },
+  {
+    EL_BD_DIAMOND,                     -1,
+    TYPE_ELEMENT,                      CONF_VALUE_16_BIT(3),
+    &li.bd_diamond_turns_to_on_impact, EL_BD_DIAMOND
+  },
 
   {
     EL_BD_MAGIC_WALL,                  -1,
@@ -879,6 +895,43 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     &li.bd_skeleton_worth_num_diamonds,        0
   },
 
+  {
+    EL_BD_CREATURE_SWITCH,             -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(1),
+    &li.bd_creatures_start_backwards,  FALSE
+  },
+  {
+    EL_BD_CREATURE_SWITCH,             -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
+    &li.bd_creatures_turn_on_hatching, FALSE
+  },
+  {
+    EL_BD_CREATURE_SWITCH,             -1,
+    TYPE_INTEGER,                      CONF_VALUE_16_BIT(1),
+    &li.bd_creatures_auto_turn_delay,  0
+  },
+
+  {
+    EL_BD_GRAVITY_SWITCH,              -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(1),
+    &li.bd_gravity_direction,          GD_MV_DOWN
+  },
+  {
+    EL_BD_GRAVITY_SWITCH,              -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(2),
+    &li.bd_gravity_switch_active,      FALSE
+  },
+  {
+    EL_BD_GRAVITY_SWITCH,              -1,
+    TYPE_INTEGER,                      CONF_VALUE_8_BIT(3),
+    &li.bd_gravity_switch_delay,       10
+  },
+  {
+    EL_BD_GRAVITY_SWITCH,              -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
+    &li.bd_gravity_affects_all,                TRUE
+  },
+
   {
     EL_BD_SAND,                                -1,
     TYPE_ELEMENT,                      CONF_VALUE_16_BIT(1),
@@ -4128,7 +4181,6 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->lineshift                      = level->bd_line_shifting_borders;
   cave->border_scan_first_and_last     = level->bd_scan_first_and_last_row;
   cave->short_explosions               = level->bd_short_explosions;
-  cave->gravity_affects_all            = level->bd_gravity_affects_all;
 
   // player properties
   cave->diagonal_movements             = level->bd_diagonal_movements;
@@ -4220,6 +4272,20 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level)
   cave->expanding_wall_looks_like      = LEVEL_TO_CAVE(level->bd_expanding_wall_looks_like);
   cave->dirt_looks_like                        = LEVEL_TO_CAVE(level->bd_sand_looks_like);
 
+  cave->creatures_backwards                     = level->bd_creatures_start_backwards;
+  cave->creatures_direction_auto_change_on_start = level->bd_creatures_turn_on_hatching;
+  cave->creatures_direction_auto_change_time    = level->bd_creatures_auto_turn_delay;
+
+  cave->gravity                                = level->bd_gravity_direction;
+  cave->gravity_switch_active          = level->bd_gravity_switch_active;
+  cave->gravity_change_time            = level->bd_gravity_switch_delay;
+  cave->gravity_affects_all            = level->bd_gravity_affects_all;
+
+  cave->stone_falling_effect           = LEVEL_TO_CAVE(level->bd_rock_turns_to_on_falling);
+  cave->stone_bouncing_effect          = LEVEL_TO_CAVE(level->bd_rock_turns_to_on_impact);
+  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);
+
   // level name
   strncpy(cave->name, level->name, sizeof(GdString));
   cave->name[sizeof(GdString) - 1] = '\0';
@@ -4264,7 +4330,6 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   level->bd_line_shifting_borders      = cave->lineshift;
   level->bd_scan_first_and_last_row    = cave->border_scan_first_and_last;
   level->bd_short_explosions           = cave->short_explosions;
-  level->bd_gravity_affects_all                = cave->gravity_affects_all;
 
   // player properties
   level->bd_diagonal_movements         = cave->diagonal_movements;
@@ -4356,6 +4421,20 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level)
   level->bd_expanding_wall_looks_like  = CAVE_TO_LEVEL(cave->expanding_wall_looks_like);
   level->bd_sand_looks_like            = CAVE_TO_LEVEL(cave->dirt_looks_like);
 
+  level->bd_creatures_start_backwards  = cave->creatures_backwards;
+  level->bd_creatures_turn_on_hatching = cave->creatures_direction_auto_change_on_start;
+  level->bd_creatures_auto_turn_delay  = cave->creatures_direction_auto_change_time;
+
+  level->bd_gravity_direction          = cave->gravity;
+  level->bd_gravity_switch_active      = cave->gravity_switch_active;
+  level->bd_gravity_switch_delay       = cave->gravity_change_time;
+  level->bd_gravity_affects_all                = cave->gravity_affects_all;
+
+  level->bd_rock_turns_to_on_falling   = CAVE_TO_LEVEL(cave->stone_falling_effect);
+  level->bd_rock_turns_to_on_impact    = CAVE_TO_LEVEL(cave->stone_bouncing_effect);
+  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 name
   char *cave_name = getStringPrint("%s / %d", cave->name, bd_level_nr + 1);