changed some gadget properties in level editor
[rocksndiamonds.git] / src / editor.c
index 6d8bd174f876727a3ec06aff7a28b62f9aca3916..9dbe4982d8acd55ae6cd6c740aed35b7f49b0f87 100644 (file)
@@ -441,6 +441,12 @@ enum
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
+  GADGET_ID_BD_PUSHING_PROB_DOWN,
+  GADGET_ID_BD_PUSHING_PROB_TEXT,
+  GADGET_ID_BD_PUSHING_PROB_UP,
+  GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN,
+  GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT,
+  GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP,
   GADGET_ID_ELEMENT_VALUE1_DOWN,
   GADGET_ID_ELEMENT_VALUE1_TEXT,
   GADGET_ID_ELEMENT_VALUE1_UP,
@@ -664,6 +670,10 @@ enum
   GADGET_ID_RANDOM_RESTRICTED,
   GADGET_ID_BD_INTERMISSION,
   GADGET_ID_BD_PAL_TIMING,
+  GADGET_ID_BD_LINE_SHIFTING_BORDERS,
+  GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+  GADGET_ID_BD_SHORT_EXPLOSIONS,
+  GADGET_ID_BD_GRAVITY_AFFECTS_ALL,
   GADGET_ID_STICK_ELEMENT,
   GADGET_ID_EM_SLIPPERY_GEMS,
   GADGET_ID_EM_EXPLODES_BY_FIRE,
@@ -696,6 +706,8 @@ enum
   GADGET_ID_CAN_MOVE_INTO_ACID,
   GADGET_ID_DONT_COLLIDE_WITH,
   GADGET_ID_BD_DIAGONAL_MOVEMENTS,
+  GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
+  GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
   GADGET_ID_ENVELOPE_AUTOWRAP,
   GADGET_ID_ENVELOPE_CENTERED,
   GADGET_ID_MM_LASER_RED,
@@ -768,6 +780,8 @@ enum
   ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
   ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
   ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
+  ED_COUNTER_ID_BD_PUSHING_PROB,
+  ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
   ED_COUNTER_ID_ELEMENT_VALUE1,
   ED_COUNTER_ID_ELEMENT_VALUE2,
   ED_COUNTER_ID_ELEMENT_VALUE3,
@@ -991,6 +1005,10 @@ enum
   ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2,
   ED_CHECKBUTTON_ID_BD_INTERMISSION,
   ED_CHECKBUTTON_ID_BD_PAL_TIMING,
+  ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
+  ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+  ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
+  ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
   ED_CHECKBUTTON_ID_STICK_ELEMENT,
   ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS,
   ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE,
@@ -1023,6 +1041,8 @@ enum
   ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID,
   ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH,
   ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
+  ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
+  ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
   ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
   ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
   ED_CHECKBUTTON_ID_MM_LASER_RED,
@@ -1072,7 +1092,7 @@ enum
 #define ED_CHECKBUTTON_ID_EDITOR_LAST  ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2
 
 #define ED_CHECKBUTTON_ID_ENGINE_FIRST ED_CHECKBUTTON_ID_BD_INTERMISSION
-#define ED_CHECKBUTTON_ID_ENGINE_LAST  ED_CHECKBUTTON_ID_BD_PAL_TIMING
+#define ED_CHECKBUTTON_ID_ENGINE_LAST  ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL
 
 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST        ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
 #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE
@@ -1544,6 +1564,24 @@ static struct
 
   // ---------- element settings: configure (various elements) ----------------
 
+  {
+    ED_COUNTER_ID_BD_PUSHING_PROB,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    0,                                 100,
+    GADGET_ID_BD_PUSHING_PROB_DOWN,    GADGET_ID_BD_PUSHING_PROB_UP,
+    GADGET_ID_BD_PUSHING_PROB_TEXT,    GADGET_ID_NONE,
+    &level.bd_pushing_prob,
+    NULL,                              NULL, "push probability"
+  },
+  {
+    ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
+    0,                                 100,
+    GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN, GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP,
+    GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT, GADGET_ID_NONE,
+    &level.bd_pushing_prob_with_sweet,
+    NULL,                              NULL, "push probability with sweet"
+  },
   {
     ED_COUNTER_ID_ELEMENT_VALUE1,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
@@ -3343,6 +3381,38 @@ static struct
     NULL, NULL,
     "PAL timing",                      "use slower timer (like PAL C64)"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(6),
+    GADGET_ID_BD_LINE_SHIFTING_BORDERS,        GADGET_ID_NONE,
+    &level.bd_line_shifting_borders,
+    "Compatibility settings:", NULL,
+    "line-shifting borders",           "use line-shifting wrap-around"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
+    GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW, GADGET_ID_NONE,
+    &level.bd_scan_first_and_last_row,
+    NULL, NULL,
+    "scan first and last row",         "also process top/bottom border rows"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(8),
+    GADGET_ID_BD_SHORT_EXPLOSIONS,     GADGET_ID_NONE,
+    &level.bd_short_explosions,
+    NULL, NULL,
+    "short explosions",                        "use four game cycles for explosions"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
+    GADGET_ID_BD_GRAVITY_AFFECTS_ALL,  GADGET_ID_NONE,
+    &level.bd_gravity_affects_all,
+    NULL, NULL,
+    "gravity change affects everything", "gravity affects all falling objects"
+  },
 
   // ---------- element settings: configure (various elements) ----------------
 
@@ -3602,6 +3672,22 @@ static struct
     NULL, NULL,
     "can move diagonally",             "player can move diagonally"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,        GADGET_ID_NONE,
+    &level.bd_topmost_player_active,
+    NULL, NULL,
+    "topmost player is active",                "use first player found on playfield"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, GADGET_ID_NONE,
+    &level.bd_push_mega_rock_with_sweet,
+    NULL, NULL,
+    "mega rocks pushable with sweet",  "push mega rocks after eating sweet"
+  },
   {
     ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
@@ -4417,7 +4503,7 @@ static int editor_el_boulderdash_native[] =
   EL_BD_AMOEBA,
   EL_BD_BUTTERFLY_UP,
   EL_BD_FIREFLY_UP,
-  EL_EXIT_CLOSED,
+  EL_BD_EXIT_CLOSED,
 
   EL_BD_BUTTERFLY_LEFT,
   EL_BD_FIREFLY_LEFT,
@@ -4427,7 +4513,7 @@ static int editor_el_boulderdash_native[] =
   EL_BD_INBOX,
   EL_BD_BUTTERFLY_DOWN,
   EL_BD_FIREFLY_DOWN,
-  EL_EXIT_OPEN,
+  EL_BD_EXIT_OPEN,
 
   EL_BD_AMOEBA_2,
   EL_BD_BUTTERFLY_2_UP,
@@ -8047,17 +8133,10 @@ static void MapCounterButtons(int id)
 
   ModifyEditorCounterValue(id, *counterbutton_info[id].value);
 
-  // set position for "value[1,2,3,4]" counter gadgets (score in most cases)
-  if (id >= ED_COUNTER_ID_ELEMENT_VALUE1 &&
-      id <= ED_COUNTER_ID_ELEMENT_VALUE4)
-  {
-    ModifyGadget(gi_down, GDI_Y,
-                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-    ModifyGadget(gi_text, GDI_Y,
-                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-    ModifyGadget(gi_up,   GDI_Y,
-                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-  }
+  // set position for counter gadgets with dynamically determined position
+  ModifyGadget(gi_down, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+  ModifyGadget(gi_text, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+  ModifyGadget(gi_up,   GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
 
   // vertical position might have changed after setting position above
   y = gi_up->y + yoffset;
@@ -10745,6 +10824,10 @@ static boolean checkPropertiesConfig(int element)
   if (element == EL_EMPTY_SPACE && level.game_engine_type != GAME_ENGINE_TYPE_RND)
     return FALSE;
 
+  // special case: BD style rock customization only available in BD game engine
+  if (element == EL_BD_ROCK && level.game_engine_type != GAME_ENGINE_TYPE_BD)
+    return FALSE;
+
   if (IS_GEM(element) ||
       IS_CUSTOM_ELEMENT(element) ||
       IS_GROUP_ELEMENT(element) ||
@@ -10760,12 +10843,19 @@ static boolean checkPropertiesConfig(int element)
       HAS_EDITOR_CONTENT(element) ||
       CAN_GROW(element) ||
       COULD_MOVE_INTO_ACID(element) ||
-      MAYBE_DONT_COLLIDE_WITH(element))
+      MAYBE_DONT_COLLIDE_WITH(element) ||
+      element == EL_BD_ROCK ||
+      element == EL_BD_MEGA_ROCK ||
+      element == EL_BD_SWEET)
+  {
     return TRUE;
+  }
   else
+  {
     for (i = 0; elements_with_counter[i].element != -1; i++)
       if (elements_with_counter[i].element == element)
        return TRUE;
+  }
 
   return FALSE;
 }
@@ -10851,6 +10941,12 @@ static void DrawPropertiesConfig(void)
   {
     if (elements_with_counter[i].element == properties_element)
     {
+      // special case: score for extra diamonds only available in BD game engine
+      if (elements_with_counter[i].element == EL_BD_DIAMOND &&
+         elements_with_counter[i].value == &level.score[SC_DIAMOND_EXTRA] &&
+         level.game_engine_type != GAME_ENGINE_TYPE_BD)
+       continue;
+
       int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters;
 
       counterbutton_info[counter_id].y =
@@ -10993,17 +11089,51 @@ static void DrawPropertiesConfig(void)
   }
 
   if (IS_BD_PLAYER_ELEMENT(properties_element))
+  {
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
+      ED_ELEMENT_SETTINGS_YPOS(2);
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(3);
+    checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(4);
+
+    // draw checkbutton gadgets
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
 
-  // special case: slippery walls option for gems only available in R'n'D game engine
-  if (IS_GEM(properties_element) && level.game_engine_type == GAME_ENGINE_TYPE_RND)
+    // draw counter gadgets
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+  }
+
+  if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
   {
-    checkbutton_info[ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS].y =
-      ED_ELEMENT_SETTINGS_XPOS(properties_element == EL_BD_DIAMOND ? 2 : 1);
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
+      ED_ELEMENT_SETTINGS_YPOS(0);
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(1);
 
-    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
   }
 
+  if (properties_element == EL_BD_MEGA_ROCK ||
+      properties_element == EL_BD_SWEET)
+  {
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(0);
+    checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(1);
+
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
+  }
+
+  // special case: slippery walls option for gems only available in R'n'D game engine
+  if (IS_GEM(properties_element) && level.game_engine_type == GAME_ENGINE_TYPE_RND)
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
+
   if (properties_element == EL_EM_DYNAMITE)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE);