rnd-20040207-1-src
[rocksndiamonds.git] / src / editor.c
index 2ac0b1fbe699580c05b627d6f2eca02fa1da7c06..9740597d7f82649de80d119fec5d637a56d7121f 100644 (file)
 #define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 48)
 #define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 49)
 #define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 53)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 54)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 55)
-#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 56)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58)
-#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 59)
-#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 60)
-#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 61)
-#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 59)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 60)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 61)
+#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64)
+#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 65)
+#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 66)
+#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 67)
+#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 68)
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 69)
 
 #define GADGET_ID_DRAWING_LEVEL                (GADGET_ID_DRAWING_AREA_FIRST + 0)
 #define GADGET_ID_ELEMENT_CONTENT_0    (GADGET_ID_DRAWING_AREA_FIRST + 1)
 #define ED_COUNTER_ID_PUSH_DELAY_RND   14
 #define ED_COUNTER_ID_MOVE_DELAY_FIX   15
 #define ED_COUNTER_ID_MOVE_DELAY_RND   16
-#define ED_COUNTER_ID_GROUP_CONTENT    17
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 18
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 19
-#define ED_COUNTER_ID_CHANGE_CONT_RND  20
+#define ED_COUNTER_ID_EXPLOSION_DELAY  17
+#define ED_COUNTER_ID_IGNITION_DELAY   18
+#define ED_COUNTER_ID_GROUP_CONTENT    19
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 20
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 21
+#define ED_COUNTER_ID_CHANGE_CONT_RND  22
 
-#define ED_NUM_COUNTERBUTTONS          21
+#define ED_NUM_COUNTERBUTTONS          23
 
 #define ED_COUNTER_ID_LEVEL_FIRST      ED_COUNTER_ID_LEVEL_XSIZE
 #define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM
 
-#define ED_COUNTER_ID_CUSTOM_FIRST     ED_COUNTER_ID_CUSTOM_SCORE
-#define ED_COUNTER_ID_CUSTOM_LAST      ED_COUNTER_ID_MOVE_DELAY_RND
+#define ED_COUNTER_ID_CUSTOM1_FIRST    ED_COUNTER_ID_CUSTOM_SCORE
+#define ED_COUNTER_ID_CUSTOM1_LAST     ED_COUNTER_ID_MOVE_DELAY_RND
+#define ED_COUNTER_ID_CUSTOM2_FIRST    ED_COUNTER_ID_EXPLOSION_DELAY
+#define ED_COUNTER_ID_CUSTOM2_LAST     ED_COUNTER_ID_IGNITION_DELAY
+#define ED_COUNTER_ID_CUSTOM_FIRST     ED_COUNTER_ID_CUSTOM1_FIRST
+#define ED_COUNTER_ID_CUSTOM_LAST      ED_COUNTER_ID_CUSTOM2_LAST
 
 #define ED_COUNTER_ID_CHANGE_FIRST     ED_COUNTER_ID_CHANGE_DELAY_FIX
 #define ED_COUNTER_ID_CHANGE_LAST      ED_COUNTER_ID_CHANGE_CONT_RND
 #define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE
 #define ED_SELECTBOX_ID_CUSTOM2_FIRST  ED_SELECTBOX_ID_CUSTOM_DEADLINESS
 #define ED_SELECTBOX_ID_CUSTOM2_LAST   ED_SELECTBOX_ID_CUSTOM_CONSISTENCY
+#define ED_SELECTBOX_ID_CUSTOM_FIRST   ED_SELECTBOX_ID_CUSTOM1_FIRST
+#define ED_SELECTBOX_ID_CUSTOM_LAST    ED_SELECTBOX_ID_CUSTOM2_LAST
 
 #define ED_SELECTBOX_ID_CHANGE_FIRST   ED_SELECTBOX_ID_CHANGE_TIME_UNITS
 #define ED_SELECTBOX_ID_CHANGE_LAST    ED_SELECTBOX_ID_SELECT_CHANGE_PAGE
 #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY
 #define ED_CHECKBUTTON_ID_CUSTOM2_FIRST        ED_CHECKBUTTON_ID_CUSTOM_DEADLY
 #define ED_CHECKBUTTON_ID_CUSTOM2_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT
+#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM1_FIRST
+#define ED_CHECKBUTTON_ID_CUSTOM_LAST  ED_CHECKBUTTON_ID_CUSTOM2_LAST
 
 #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE
 #define ED_CHECKBUTTON_ID_CHANGE_LAST  ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM
@@ -948,7 +964,7 @@ static struct
     NULL,                              " ", "height",
   },
 
-  /* ---------- element settings: configure (custom elements) -------------- */
+  /* ---------- element settings: configure 1 (custom elements) ------------ */
 
   {
     ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(5),
@@ -999,6 +1015,25 @@ static struct
     NULL,                              "+random", NULL
   },
 
+  /* ---------- element settings: configure 2 (custom elements) ------------ */
+
+  {
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(4),
+    0,                                 255,
+    GADGET_ID_EXPLOSION_DELAY_DOWN,    GADGET_ID_EXPLOSION_DELAY_UP,
+    GADGET_ID_EXPLOSION_DELAY_TEXT,    GADGET_ID_NONE,
+    &custom_element.explosion_delay,
+    NULL,                              "explosion delay", NULL
+  },
+  {
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(5),
+    0,                                 255,
+    GADGET_ID_IGNITION_DELAY_DOWN,     GADGET_ID_IGNITION_DELAY_UP,
+    GADGET_ID_IGNITION_DELAY_TEXT,     GADGET_ID_NONE,
+    &custom_element.ignition_delay,
+    NULL,                              "ignition delay", NULL
+  },
+
   /* ---------- element settings: configure (group elements) --------------- */
 
   {
@@ -1146,13 +1181,13 @@ static struct ValueTextInfo options_move_pattern[] =
 
 static struct ValueTextInfo options_move_direction[] =
 {
-  { MV_AUTOMATIC,              "automatic"                     },
-  { MV_LEFT,                   "left"                          },
-  { MV_RIGHT,                  "right"                         },
-  { MV_UP,                     "up"                            },
-  { MV_DOWN,                   "down"                          },
-  { MV_RANDOM,                 "random"                        },
-  { MV_PREVIOUS,               "previous"                      },
+  { MV_START_AUTOMATIC,                "automatic"                     },
+  { MV_START_LEFT,             "left"                          },
+  { MV_START_RIGHT,            "right"                         },
+  { MV_START_UP,               "up"                            },
+  { MV_START_DOWN,             "down"                          },
+  { MV_START_RANDOM,           "random"                        },
+  { MV_START_PREVIOUS,         "previous"                      },
   { -1,                                NULL                            }
 };
 
@@ -6639,7 +6674,8 @@ static void DrawPropertiesConfig()
        MapCheckbuttonGadget(i);
 
       /* draw counter gadgets */
-      for (i = ED_COUNTER_ID_CUSTOM_FIRST; i <= ED_COUNTER_ID_CUSTOM_LAST; i++)
+      for (i =  ED_COUNTER_ID_CUSTOM1_FIRST;
+          i <= ED_COUNTER_ID_CUSTOM1_LAST; i++)
        MapCounterButtons(i);
 
       /* draw selectbox gadgets */
@@ -6665,6 +6701,11 @@ static void DrawPropertiesConfig()
           i <= ED_CHECKBUTTON_ID_CUSTOM2_LAST; i++)
        MapCheckbuttonGadget(i);
 
+      /* draw counter gadgets */
+      for (i =  ED_COUNTER_ID_CUSTOM2_FIRST;
+          i <= ED_COUNTER_ID_CUSTOM2_LAST; i++)
+       MapCounterButtons(i);
+
       /* draw selectbox gadgets */
       for (i =  ED_SELECTBOX_ID_CUSTOM2_FIRST;
           i <= ED_SELECTBOX_ID_CUSTOM2_LAST; i++)
@@ -6858,12 +6899,19 @@ static void DrawPropertiesWindow()
 
 static void UpdateCustomElementGraphicGadgets()
 {
+  int i;
+
   ModifyEditorElementList();
   RedrawDrawingElements();
 
-  if (edit_mode == ED_MODE_PROPERTIES &&
-      edit_mode_properties == ED_MODE_PROPERTIES_CHANGE)
-    DrawPropertiesChangeDrawingAreas();
+  /* force redraw of all mapped drawing area gadgets */
+  for (i = 0; i < ED_NUM_DRAWING_AREAS; i++)
+  {
+    struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id];
+
+    if (gi->mapped)
+      MapDrawingArea(i);
+  }
 }
 
 static void DrawLineElement(int sx, int sy, int element, boolean change_level)
@@ -7951,10 +7999,8 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
 
     DrawPropertiesWindow();
   }
-  else if ((type_id >= ED_SELECTBOX_ID_CUSTOM1_FIRST &&
-           type_id <= ED_SELECTBOX_ID_CUSTOM1_LAST) ||
-          (type_id >= ED_SELECTBOX_ID_CUSTOM2_FIRST &&
-           type_id <= ED_SELECTBOX_ID_CUSTOM2_LAST) ||
+  else if ((type_id >= ED_SELECTBOX_ID_CUSTOM_FIRST &&
+           type_id <= ED_SELECTBOX_ID_CUSTOM_LAST) ||
           (type_id >= ED_SELECTBOX_ID_CHANGE_FIRST &&
            type_id <= ED_SELECTBOX_ID_CHANGE_LAST) ||
           (type_id == ED_SELECTBOX_ID_GROUP_CHOICE_MODE))
@@ -8049,6 +8095,15 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
 
   *checkbutton_info[type_id].value ^= TRUE;
 
+  if (((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST &&
+       type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) ||
+       (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&
+       type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) &&
+      type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)
+  {
+    CopyElementPropertiesToGame(properties_element);
+  }
+
   if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC)
   {
     UpdateCustomElementGraphicGadgets();
@@ -8071,15 +8126,6 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
 
     DrawEditModeWindow();
   }
-  else if ((type_id >= ED_CHECKBUTTON_ID_CUSTOM1_FIRST &&
-           type_id <= ED_CHECKBUTTON_ID_CUSTOM1_LAST) ||
-          (type_id >= ED_CHECKBUTTON_ID_CUSTOM2_FIRST &&
-           type_id <= ED_CHECKBUTTON_ID_CUSTOM2_LAST) ||
-          (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&
-           type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST))
-  {
-    CopyElementPropertiesToGame(properties_element);
-  }
 }
 
 static void HandleControlButtons(struct GadgetInfo *gi)