added setup options to skip (un)covering and hatching for BD engine
[rocksndiamonds.git] / src / editor.c
index 96bb61e3998c71c480d1590e94dc567dafab34c3..8fa52676a277cb5aec9b7700206a81081e1fb78d 100644 (file)
@@ -1794,6 +1794,7 @@ static struct ValueTextInfo options_time_score_base[] =
 static struct ValueTextInfo options_game_engine_type[] =
 {
   { GAME_ENGINE_TYPE_RND,      "Rocks'n'Diamonds"              },
+  { GAME_ENGINE_TYPE_BD,       "Boulder Dash"                  },
   { GAME_ENGINE_TYPE_EM,       "Emerald Mine"                  },
   { GAME_ENGINE_TYPE_SP,       "Supaplex"                      },
   { GAME_ENGINE_TYPE_MM,       "Mirror Magic"                  },
@@ -2465,6 +2466,7 @@ static struct ValueTextInfo options_group_choice_mode[] =
   { ANIM_LINEAR,               "linear"                        },
   { ANIM_PINGPONG,             "pingpong"                      },
   { ANIM_PINGPONG2,            "pingpong 2"                    },
+  { ANIM_LEVEL_NR,             "level number"                  },
 
   { -1,                                NULL                            }
 };
@@ -4048,6 +4050,181 @@ static int *editor_el_boulderdash_ptr = editor_el_boulderdash;
 static int num_editor_hl_boulderdash = ARRAY_SIZE(editor_hl_boulderdash);
 static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash);
 
+static int editor_hl_boulderdash_native[] =
+{
+  EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE,
+  EL_CHAR('B'),
+  EL_CHAR('D'),
+  EL_EMPTY,
+};
+
+static int editor_el_boulderdash_native[] =
+{
+  EL_EMPTY,
+  EL_BD_SAND,
+  EL_BD_SAND_BALL,
+  EL_BD_SAND_LOOSE,
+
+  EL_BD_SAND_SLOPED_UP_RIGHT,
+  EL_BD_SAND_SLOPED_UP_LEFT,
+  EL_BD_SAND_SLOPED_DOWN_LEFT,
+  EL_BD_SAND_SLOPED_DOWN_RIGHT,
+
+  EL_BD_WALL_SLOPED_UP_RIGHT,
+  EL_BD_WALL_SLOPED_UP_LEFT,
+  EL_BD_WALL_SLOPED_DOWN_LEFT,
+  EL_BD_WALL_SLOPED_DOWN_RIGHT,
+
+  EL_BD_SAND_2,
+  EL_BD_WALL_NON_SLOPED,
+  EL_BD_WALL,
+  EL_BD_MAGIC_WALL,
+
+  EL_BD_EXIT_CLOSED,
+  EL_BD_EXIT_OPEN,
+  EL_BD_INVISIBLE_EXIT_CLOSED,
+  EL_BD_INVISIBLE_EXIT_OPEN,
+
+  EL_BD_STEELWALL_SLOPED_UP_RIGHT,
+  EL_BD_STEELWALL_SLOPED_UP_LEFT,
+  EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
+  EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
+
+  EL_BD_STEELWALL,
+  EL_BD_STEELWALL_EXPLODABLE,
+  EL_BD_STEELWALL_DIGGABLE,
+  EL_BD_WALL_DIGGABLE,
+
+  EL_BD_ROCK,
+  EL_BD_FLYING_ROCK,
+  EL_BD_MEGA_ROCK,
+  EL_BD_DIAMOND,
+
+  EL_BD_FLYING_DIAMOND,
+  EL_BD_NUT,
+  EL_BD_BLADDER_SPENDER,
+  EL_BD_INBOX,
+
+  EL_BD_EXPANDABLE_WALL_HORIZONTAL,
+  EL_BD_EXPANDABLE_WALL_VERTICAL,
+  EL_BD_EXPANDABLE_WALL_ANY,
+  EL_BD_CREATURE_SWITCH,
+
+  EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL,
+  EL_BD_EXPANDABLE_STEELWALL_VERTICAL,
+  EL_BD_EXPANDABLE_STEELWALL_ANY,
+  EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,
+
+  EL_BD_BITER_SWITCH_1,
+  EL_BD_REPLICATOR_SWITCH,
+  EL_BD_CONVEYOR_SWITCH,
+  EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,
+
+  EL_BD_ACID,
+  EL_BD_FALLING_WALL,
+  EL_BD_BOX,
+  EL_BD_TIME_PENALTY,
+
+  EL_BD_GRAVESTONE,
+  EL_BD_ROCK_GLUED,
+  EL_BD_DIAMOND_GLUED,
+  EL_BD_DIAMOND_KEY,
+
+  EL_BD_TRAPPED_DIAMOND,
+  EL_BD_CLOCK,
+  EL_BD_SAND_GLUED,
+  EL_BD_WATER,
+
+  EL_BD_KEY_1,
+  EL_BD_KEY_2,
+  EL_BD_KEY_3,
+  EL_EMPTY,
+
+  EL_BD_WALL_KEY_1,
+  EL_BD_WALL_KEY_2,
+  EL_BD_WALL_KEY_3,
+  EL_BD_WALL_DIAMOND,
+
+  EL_BD_GATE_1,
+  EL_BD_GATE_2,
+  EL_BD_GATE_3,
+  EL_BD_POT,
+
+  EL_BD_GRAVITY_SWITCH,
+  EL_BD_PNEUMATIC_HAMMER,
+  EL_BD_TELEPORTER,
+  EL_BD_SKELETON,
+
+  EL_BD_AMOEBA,
+  EL_BD_AMOEBA_2,
+  EL_BD_REPLICATOR,
+  EL_EMPTY,
+
+  EL_BD_CONVEYOR_LEFT,
+  EL_BD_CONVEYOR_RIGHT,
+  EL_BD_BOMB,
+  EL_BD_NITRO_PACK,
+
+  EL_BD_LAVA,
+  EL_BD_SWEET,
+  EL_BD_VOODOO_DOLL,
+  EL_BD_SLIME,
+
+  EL_BD_BLADDER,
+  EL_BD_WAITING_ROCK,
+  EL_BD_CHASING_ROCK,
+  EL_BD_GHOST,
+
+  EL_BD_COW_LEFT,
+  EL_BD_COW_UP,
+  EL_BD_COW_RIGHT,
+  EL_BD_COW_DOWN,
+
+  EL_BD_FIREFLY_LEFT,
+  EL_BD_FIREFLY_UP,
+  EL_BD_FIREFLY_RIGHT,
+  EL_BD_FIREFLY_DOWN,
+
+  EL_BD_FIREFLY_2_LEFT,
+  EL_BD_FIREFLY_2_UP,
+  EL_BD_FIREFLY_2_RIGHT,
+  EL_BD_FIREFLY_2_DOWN,
+
+  EL_BD_BUTTERFLY_LEFT,
+  EL_BD_BUTTERFLY_UP,
+  EL_BD_BUTTERFLY_RIGHT,
+  EL_BD_BUTTERFLY_DOWN,
+
+  EL_BD_BUTTERFLY_2_LEFT,
+  EL_BD_BUTTERFLY_2_UP,
+  EL_BD_BUTTERFLY_2_RIGHT,
+  EL_BD_BUTTERFLY_2_DOWN,
+
+  EL_BD_STONEFLY_LEFT,
+  EL_BD_STONEFLY_UP,
+  EL_BD_STONEFLY_RIGHT,
+  EL_BD_STONEFLY_DOWN,
+
+  EL_BD_BITER_UP,
+  EL_BD_BITER_RIGHT,
+  EL_BD_BITER_DOWN,
+  EL_BD_BITER_LEFT,
+
+  EL_BD_DRAGONFLY_LEFT,
+  EL_BD_DRAGONFLY_UP,
+  EL_BD_DRAGONFLY_RIGHT,
+  EL_BD_DRAGONFLY_DOWN,
+
+  EL_BD_PLAYER,
+  EL_BD_PLAYER_WITH_BOMB,
+  EL_BD_PLAYER_GLUED,
+  EL_BD_PLAYER_STIRRING,
+};
+static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native;
+static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native;
+static int num_editor_hl_boulderdash_native = ARRAY_SIZE(editor_hl_boulderdash_native);
+static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_native);
+
 static int editor_hl_emerald_mine[] =
 {
   EL_INTERNAL_CASCADE_EM_ACTIVE,
@@ -5458,6 +5635,7 @@ static boolean setup_editor_cascade_never = FALSE;
 
 static boolean setup_editor_el_players                 = TRUE;
 static boolean setup_editor_el_boulderdash             = TRUE;
+static boolean setup_editor_el_boulderdash_native      = TRUE;
 static boolean setup_editor_el_emerald_mine            = TRUE;
 static boolean setup_editor_el_emerald_mine_club       = TRUE;
 static boolean setup_editor_el_more                    = TRUE;
@@ -5504,6 +5682,12 @@ editor_elements_info[] =
     &editor_hl_boulderdash_ptr,                &num_editor_hl_boulderdash,
     &editor_el_boulderdash_ptr,                &num_editor_el_boulderdash
   },
+  {
+    &setup_editor_el_boulderdash_native,
+    &setup.editor_cascade.el_bd_native,
+    &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native,
+    &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native
+  },
   {
     &setup_editor_el_emerald_mine,
     &setup.editor_cascade.el_em,
@@ -5803,6 +5987,7 @@ static void ReinitializeElementList_EnableSections(void)
 
   setup_editor_el_players              = TRUE;
   setup_editor_el_boulderdash          = TRUE;
+  setup_editor_el_boulderdash_native   = TRUE;
   setup_editor_el_emerald_mine         = TRUE;
   setup_editor_el_emerald_mine_club    = TRUE;
   setup_editor_el_more                 = TRUE;
@@ -5825,6 +6010,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -5855,12 +6041,31 @@ static void ReinitializeElementList_EnableSections(void)
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
   {
+    setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_mirror_magic       = FALSE;
+    setup_editor_el_deflektor          = FALSE;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_emerald_mine       = FALSE;
+    setup_editor_el_emerald_mine_club  = FALSE;
+    setup_editor_el_more               = FALSE;
+    setup_editor_el_sokoban            = FALSE;
+    setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
+    setup_editor_el_dx_boulderdash     = FALSE;
     setup_editor_el_mirror_magic       = FALSE;
     setup_editor_el_deflektor          = FALSE;
+    setup_editor_el_chars              = FALSE;
+    setup_editor_el_steel_chars                = FALSE;
+
+    setup_editor_el_custom             = FALSE;
   }
   else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
   {
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_more               = FALSE;
     setup_editor_el_sokoban            = FALSE;
     setup_editor_el_supaplex           = FALSE;
@@ -5876,6 +6081,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -5893,6 +6099,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -7624,7 +7831,7 @@ static void MapGraphicbuttonGadget(int id)
 {
   int font_nr = FONT_TEXT_1;
   int font_height = getFontHeight(font_nr);
-  struct GadgetInfo *gi= level_editor_gadget[graphicbutton_info[id].gadget_id];
+  struct GadgetInfo *gi = level_editor_gadget[graphicbutton_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(graphicbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
   int yoffset = (gi->height - font_height) / 2;
@@ -8707,7 +8914,13 @@ static void InitDrawingElements(void)
   if (level.game_engine_type == game_engine_type_last)
     return;
 
-  if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    new_element1 = EL_BD_WALL;
+    new_element2 = EL_EMPTY;
+    new_element3 = EL_BD_SAND;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
   {
     new_element1 = EL_SP_CHIP_SINGLE;
     new_element2 = EL_EMPTY;
@@ -8917,8 +9130,8 @@ static void AdjustDrawingAreaGadgets(void)
 
   if (suppressBorderElement())
   {
-    ed_xsize = max_ed_fieldx;
-    ed_ysize = max_ed_fieldy;
+    ed_xsize = lev_fieldx;
+    ed_ysize = lev_fieldy;
   }
 
   // check if we need any scrollbars
@@ -10197,7 +10410,7 @@ static void DrawPropertiesConfig(void)
                num_element_counters);
 
       counterbutton_info[counter_id].value = elements_with_counter[i].value;
-      counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
+      counterbutton_info[counter_id].text_right = elements_with_counter[i].text;
 
       if (properties_element == EL_GAME_OF_LIFE ||
          properties_element == EL_BIOMAZE)
@@ -12765,6 +12978,7 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
       lev_fieldx = level.fieldx = brush_width;
       lev_fieldy = level.fieldy = brush_height;
 
+      boolean use_bd_engine = TRUE;
       boolean use_em_engine = TRUE;
       boolean use_sp_engine = TRUE;
       boolean use_mm_engine = TRUE;
@@ -12775,6 +12989,9 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
        {
          int element = Tile[x][y];
 
+         if (!IS_BD_ELEMENT(element) && !IS_PLAYER_ELEMENT(element))
+           use_bd_engine = FALSE;
+
          if (!IS_EM_ELEMENT(element) && !IS_PLAYER_ELEMENT(element))
            use_em_engine = FALSE;
 
@@ -12786,7 +13003,8 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
        }
       }
 
-      level.game_engine_type = (use_em_engine ? GAME_ENGINE_TYPE_EM :
+      level.game_engine_type = (use_bd_engine ? GAME_ENGINE_TYPE_BD :
+                               use_em_engine ? GAME_ENGINE_TYPE_EM :
                                use_sp_engine ? GAME_ENGINE_TYPE_SP :
                                use_mm_engine ? GAME_ENGINE_TYPE_MM :
                                GAME_ENGINE_TYPE_RND);
@@ -14737,8 +14955,8 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
          for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
          {
-           int *cascade_element= &(*editor_elements_info[i].headline_list)[0];
-           boolean *cascade_value=editor_elements_info[i].setup_cascade_value;
+           int *cascade_element = &(*editor_elements_info[i].headline_list)[0];
+           boolean *cascade_value = editor_elements_info[i].setup_cascade_value;
 
            if (*cascade_element == new_element)
            {
@@ -15282,7 +15500,7 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
        vp_door_2->height == VYSIZE)
       CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
     else
-      SetDoorState(DOOR_CLOSE_2);
+      SetDoorState(DOOR_CLOSE_ALL);
 
     BackToFront();