rnd-20020322-1-src
[rocksndiamonds.git] / src / editor.c
index 3ce6762af51d45acdae9a7870a42938fab6b1391..196f9fb47b29bcbc683ff545d3293976eeb1418f 100644 (file)
 #define GADGET_ID_DOUBLE_SPEED         73
 #define GADGET_ID_GRAVITY              74
 #define GADGET_ID_STICK_ELEMENT                75
+#define GADGET_ID_EM_SLIPPERY_GEMS     76
 
 /* another drawing area for random placement */
-#define GADGET_ID_RANDOM_BACKGROUND    76
+#define GADGET_ID_RANDOM_BACKGROUND    77
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    77
-#define GADGET_ID_ELEMENTLIST_LAST     (77 + ED_NUM_ELEMENTLIST_BUTTONS - 1)
+#define GADGET_ID_ELEMENTLIST_FIRST    78
+#define GADGET_ID_ELEMENTLIST_LAST     (78 + ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define NUM_EDITOR_GADGETS             (GADGET_ID_ELEMENTLIST_LAST + 1)
 
 #define ED_CHECKBUTTON_ID_GRAVITY              1
 #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    2
 #define ED_CHECKBUTTON_ID_STICK_ELEMENT                3
+#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     4
 
-#define ED_NUM_CHECKBUTTONS                    4
+#define ED_NUM_CHECKBUTTONS                    5
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_DOUBLE_SPEED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
@@ -670,6 +672,12 @@ static struct
     GADGET_ID_STICK_ELEMENT,
     &stick_element_properties_window,
     "stick window to edit content",    "stick window to edit content"
+  },
+  {
+    ED_SETTINGS_XPOS,                  ED_COUNTER_YPOS(4),
+    GADGET_ID_EM_SLIPPERY_GEMS,
+    &level.em_slippery_gems,
+    "slip down from certain flat walls","use EM style slipping behaviour"
   }
 };
 
@@ -2732,6 +2740,19 @@ static void DrawPropertiesWindow()
     else
       DrawElementContentAreas();
   }
+
+  if (IS_GEM(properties_element))
+  {
+    /* draw checkbutton gadget */
+    i = ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS;
+    x = checkbutton_info[i].x + xoffset_right2;
+    y = checkbutton_info[i].y + yoffset_right2;
+
+    DrawTextF(x, y, font_color, checkbutton_info[i].text);
+    ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
+                GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
+    MapCheckbuttonGadget(i);
+  }
 }
 
 static void DrawLineElement(int sx, int sy, int element, boolean change_level)
@@ -3997,10 +4018,12 @@ void HandleLevelEditorKeyInput(Key key)
       DrawLevelText(0, 0, 0, TEXT_BACKSPACE);
     else if (key == KSYM_Return)
       DrawLevelText(0, 0, 0, TEXT_NEWLINE);
+    else if (key == KSYM_Escape)
+      DrawLevelText(0, 0, 0, TEXT_END);
   }
   else if (button_status == MB_RELEASED)
   {
-    int i, id;
+    int i, id = GADGET_ID_NONE;
 
     switch (key)
     {
@@ -4025,8 +4048,20 @@ void HandleLevelEditorKeyInput(Key key)
        button = MB_RIGHTBUTTON;
        break;
 
+      case KSYM_Escape:
+        if (edit_mode == ED_MODE_DRAWING)
+       {
+         game_status = MAINMENU;
+         DrawMainMenu();
+       }
+        else
+       {
+         DrawDrawingWindow();
+         edit_mode = ED_MODE_DRAWING;
+       }
+        break;
+
       default:
-       id = GADGET_ID_NONE;
        break;
     }
 
@@ -4062,6 +4097,9 @@ void HandleEditorGadgetInfoText(void *ptr)
 
   ClearEditorGadgetInfoText();
 
+  if (gi->event.type == GD_EVENT_INFO_LEAVING)
+    return;
+
   /* misuse this function to delete brush cursor, if needed */
   if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
     DeleteBrushFromCursor();
@@ -4109,6 +4147,9 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
 
   ClearEditorGadgetInfoText();
 
+  if (gi->event.type == GD_EVENT_INFO_LEAVING)
+    return;
+
   /* make sure to stay inside drawing area boundaries */
   sx = (sx < min_sx ? min_sx : sx > max_sx ? max_sx : sx);
   sy = (sy < min_sy ? min_sy : sy > max_sy ? max_sy : sy);