added support for hatching delay in BD engine to level editor
[rocksndiamonds.git] / src / editor.c
index 1cdf04d22af28da74faf22a3c72eb023091bdcbc..6d8bd174f876727a3ec06aff7a28b62f9aca3916 100644 (file)
@@ -429,6 +429,18 @@ enum
   GADGET_ID_LEVELSET_NUM_LEVELS_DOWN,
   GADGET_ID_LEVELSET_NUM_LEVELS_TEXT,
   GADGET_ID_LEVELSET_NUM_LEVELS_UP,
+  GADGET_ID_BD_CYCLE_DELAY_MS_DOWN,
+  GADGET_ID_BD_CYCLE_DELAY_MS_TEXT,
+  GADGET_ID_BD_CYCLE_DELAY_MS_UP,
+  GADGET_ID_BD_CYCLE_DELAY_C64_DOWN,
+  GADGET_ID_BD_CYCLE_DELAY_C64_TEXT,
+  GADGET_ID_BD_CYCLE_DELAY_C64_UP,
+  GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN,
+  GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT,
+  GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
+  GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,
+  GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,
+  GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
   GADGET_ID_ELEMENT_VALUE1_DOWN,
   GADGET_ID_ELEMENT_VALUE1_TEXT,
   GADGET_ID_ELEMENT_VALUE1_UP,
@@ -571,6 +583,7 @@ enum
   GADGET_ID_TIME_OR_STEPS,
   GADGET_ID_TIME_SCORE_BASE,
   GADGET_ID_GAME_ENGINE_TYPE,
+  GADGET_ID_BD_SCHEDULING_TYPE,
   GADGET_ID_LEVELSET_SAVE_MODE,
   GADGET_ID_WIND_DIRECTION,
   GADGET_ID_PLAYER_SPEED,
@@ -751,6 +764,10 @@ enum
   ED_COUNTER_ID_LEVEL_RANDOM_SEED,
   ED_COUNTER_ID_LEVELSET_NUM_LEVELS,
   ED_COUNTER_ID_LEVEL_RANDOM,
+  ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
+  ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
+  ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
+  ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
   ED_COUNTER_ID_ELEMENT_VALUE1,
   ED_COUNTER_ID_ELEMENT_VALUE2,
   ED_COUNTER_ID_ELEMENT_VALUE3,
@@ -865,6 +882,7 @@ enum
   ED_SELECTBOX_ID_TIME_OR_STEPS,
   ED_SELECTBOX_ID_TIME_SCORE_BASE,
   ED_SELECTBOX_ID_GAME_ENGINE_TYPE,
+  ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
   ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
   ED_SELECTBOX_ID_WIND_DIRECTION,
   ED_SELECTBOX_ID_PLAYER_SPEED,
@@ -904,6 +922,9 @@ enum
 #define ED_SELECTBOX_ID_LEVELSET_FIRST ED_SELECTBOX_ID_LEVELSET_SAVE_MODE
 #define ED_SELECTBOX_ID_LEVELSET_LAST  ED_SELECTBOX_ID_LEVELSET_SAVE_MODE
 
+#define ED_SELECTBOX_ID_ENGINE_FIRST   ED_SELECTBOX_ID_BD_SCHEDULING_TYPE
+#define ED_SELECTBOX_ID_ENGINE_LAST    ED_SELECTBOX_ID_BD_SCHEDULING_TYPE
+
 #define ED_SELECTBOX_ID_CUSTOM1_FIRST  ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
 #define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION
 #define ED_SELECTBOX_ID_CUSTOM2_FIRST  ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN
@@ -1484,6 +1505,42 @@ static struct
     &random_placement_value,
     "random element placement:",       NULL, "in"
   },
+  {
+    ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(3),
+    50,                                        500,
+    GADGET_ID_BD_CYCLE_DELAY_MS_DOWN,  GADGET_ID_BD_CYCLE_DELAY_MS_UP,
+    GADGET_ID_BD_CYCLE_DELAY_MS_TEXT,  GADGET_ID_NONE,
+    &level.bd_cycle_delay_ms,
+    NULL,                              NULL, "game cycle delay (ms)"
+  },
+  {
+    ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(3),
+    0,                                 32,
+    GADGET_ID_BD_CYCLE_DELAY_C64_DOWN, GADGET_ID_BD_CYCLE_DELAY_C64_UP,
+    GADGET_ID_BD_CYCLE_DELAY_C64_TEXT, GADGET_ID_NONE,
+    &level.bd_cycle_delay_c64,
+    NULL,                              NULL, "game cycle delay (C64-style)"
+  },
+  {
+    ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(4),
+    1,                                 40,
+    GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN,   GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
+    GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT,   GADGET_ID_NONE,
+    &level.bd_hatching_delay_cycles,
+    NULL,                              NULL, "hatching delay (cycles)"
+  },
+  {
+    ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(4),
+    1,                                 40,
+    GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,  GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
+    GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,  GADGET_ID_NONE,
+    &level.bd_hatching_delay_seconds,
+    NULL,                              NULL, "hatching delay (seconds)"
+  },
 
   // ---------- element settings: configure (various elements) ----------------
 
@@ -2530,6 +2587,19 @@ static struct ValueTextInfo options_group_choice_mode[] =
   { -1,                                NULL                            }
 };
 
+static struct ValueTextInfo options_bd_scheduling_type[] =
+{
+  { GD_SCHEDULING_MILLISECONDS,          "Milliseconds"                },
+  { GD_SCHEDULING_BD1,           "BD1"                         },
+  { GD_SCHEDULING_BD2,           "BD2"                         },
+  { GD_SCHEDULING_PLCK,                  "Construction Kit"            },
+  { GD_SCHEDULING_CRDR,                  "Crazy Dream 7"               },
+  { GD_SCHEDULING_BD1_ATARI,     "Atari BD1"                   },
+  { GD_SCHEDULING_BD2_PLCK_ATARI, "Atari BD2 / PLCK"           },
+
+  { -1,                                  NULL                          }
+};
+
 static struct ValueTextInfo *action_arg_modes[] =
 {
   options_action_mode_none,
@@ -2613,6 +2683,15 @@ static struct
     &level.game_engine_type,
     NULL, "game engine:", NULL,                "game engine"
   },
+  {
+    ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(1),
+    GADGET_ID_BD_SCHEDULING_TYPE,      GADGET_ID_NONE,
+    -1,
+    options_bd_scheduling_type,
+    &level.bd_scheduling_type,
+    NULL, "scheduling type:", NULL,    "level timing"
+  },
   {
     ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
@@ -3258,7 +3337,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_PAL_TIMING,
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(1),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(2),
     GADGET_ID_BD_PAL_TIMING,           GADGET_ID_NONE,
     &level.bd_pal_timing,
     NULL, NULL,
@@ -10017,9 +10096,25 @@ static void DrawLevelConfigEngine(void)
 {
   int i;
 
+  // draw counter gadgets
+  if (level.bd_scheduling_type == GD_SCHEDULING_MILLISECONDS)
+  {
+    MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_MS);
+    MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES);
+  }
+  else
+  {
+    MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_C64);
+    MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS);
+  }
+
   // draw checkbutton gadgets
   for (i = ED_CHECKBUTTON_ID_ENGINE_FIRST; i <= ED_CHECKBUTTON_ID_ENGINE_LAST; i++)
     MapCheckbuttonGadget(i);
+
+  // draw selectbox gadgets
+  for (i = ED_SELECTBOX_ID_ENGINE_FIRST; i <= ED_SELECTBOX_ID_ENGINE_LAST; i++)
+    MapSelectboxGadget(i);
 }
 
 static void DrawLevelConfigWindow(void)
@@ -14530,6 +14625,11 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     ReinitializeElementList();
     ModifyEditorElementList();
   }
+  else if (type_id == ED_SELECTBOX_ID_BD_SCHEDULING_TYPE)
+  {
+    // update BD cycle delay counter gadgets depending on BD scheduling type
+    DrawLevelConfigWindow();
+  }
 
   // do not mark level as modified for certain non-level-changing gadgets
   if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE ||