rnd-19981216-1
authorHolger Schemel <info@artsoft.org>
Wed, 16 Dec 1998 02:37:19 +0000 (03:37 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:32:25 +0000 (10:32 +0200)
src/buttons.c
src/buttons.h
src/editor.c
src/editor.h
src/events.c
src/init.c
src/main.h
src/screens.c

index c9e00fca1a04cb35a684b5d9bb6f1a63dbb3ef7f..cffd190bc0f5c4c93fd7511fc9e015647b915b9b 100644 (file)
@@ -1659,21 +1659,31 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
                             &gi->alt_design[state] :
                             &gi->design[state]);
 
-  XCopyArea(display, gd->pixmap, (direct ? window : drawto), gc,
+  XCopyArea(display, gd->pixmap, drawto, gc,
            gd->x, gd->y, gi->width, gi->height, gi->x, gi->y);
+
+  if (direct)
+    XCopyArea(display, gd->pixmap, window, gc,
+             gd->x, gd->y, gi->width, gi->height, gi->x, gi->y);
+  else
+    redraw_mask |= REDRAW_ALL;
 }
 
 void MapGadget(struct GadgetInfo *gi)
 {
+  if (gi == NULL)
+    return;
+
   gi->mapped = TRUE;
 
   DrawGadget(gi, (gi->state == GD_BUTTON_PRESSED), FALSE);
-
-  redraw_mask |= REDRAW_ALL;
 }
 
 void UnmapGadget(struct GadgetInfo *gi)
 {
+  if (gi == NULL)
+    return;
+
   gi->mapped = FALSE;
 }
 
index 695aef6bf1219cbe0b7adfbb82bb28f92ca25d85..94616e069e54daad16fc8584a1e4b071dde7ff89 100644 (file)
 #define ED_BUTTON_EXIT_XSIZE   90
 #define ED_BUTTON_EXIT_YSIZE   20
 
+#define ED_BUTTON_COUNT_YPOS   60
+#define ED_BUTTON_COUNT_XSIZE  20
+#define ED_BUTTON_COUNT_YSIZE  20
 #define ED_BUTTON_MINUS_XPOS   2
-#define ED_BUTTON_MINUS_YPOS   60
-#define ED_BUTTON_MINUS_XSIZE  20
-#define ED_BUTTON_MINUS_YSIZE  20
+#define ED_BUTTON_MINUS_YPOS   ED_BUTTON_COUNT_YPOS
+#define ED_BUTTON_MINUS_XSIZE  ED_BUTTON_COUNT_XSIZE
+#define ED_BUTTON_MINUS_YSIZE  ED_BUTTON_COUNT_YSIZE
 #define ED_WIN_COUNT_XPOS      (ED_BUTTON_MINUS_XPOS+ED_BUTTON_MINUS_XSIZE+2)
-#define ED_WIN_COUNT_YPOS      ED_BUTTON_MINUS_YPOS
+#define ED_WIN_COUNT_YPOS      ED_BUTTON_COUNT_YPOS
 #define ED_WIN_COUNT_XSIZE     52
-#define ED_WIN_COUNT_YSIZE     ED_BUTTON_MINUS_YSIZE
+#define ED_WIN_COUNT_YSIZE     ED_BUTTON_COUNT_YSIZE
 #define ED_BUTTON_PLUS_XPOS    (ED_WIN_COUNT_XPOS+ED_WIN_COUNT_XSIZE+2)
-#define ED_BUTTON_PLUS_YPOS    ED_BUTTON_MINUS_YPOS
-#define ED_BUTTON_PLUS_XSIZE   ED_BUTTON_MINUS_XSIZE
-#define ED_BUTTON_PLUS_YSIZE   ED_BUTTON_MINUS_YSIZE
+#define ED_BUTTON_PLUS_YPOS    ED_BUTTON_COUNT_YPOS
+#define ED_BUTTON_PLUS_XSIZE   ED_BUTTON_COUNT_XSIZE
+#define ED_BUTTON_PLUS_YSIZE   ED_BUTTON_COUNT_YSIZE
 
 #define ED_COUNT_GADGET_XPOS   16
 #define ED_COUNT_GADGET_YPOS   (16+3*MINI_TILEY+64)
index 0c97b9eec82d6378dfd3149a99c5f609420d6201..d3d81c2599b3649dd4cd973152fad2f86178bd44 100644 (file)
 #define ED_SCROLL_UP           4
 #define ED_SCROLL_DOWN         8
 
-/* delay value to avoid too fast scrolling etc. */
-#define CHOICE_DELAY_VALUE     100
+/* screens in the level editor */
+#define ED_MODE_EDIT           0
+#define ED_MODE_INFO           1
+#define ED_MODE_PROPERTIES     2
 
 /* how many steps can be cancelled */
 #define NUM_UNDO_STEPS         (10 + 1)
 #define ED_NUM_CTRL2_BUTTONS   (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT)
 #define ED_NUM_CTRL_BUTTONS    (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS)
 
-/* control button names */
+/* values for other gadgets */
+#define ED_SCORE_XPOS          TILEX
+#define ED_SCORE_YPOS          (7 * TILEY)
+#define ED_COUNT_VALUE_XOFFSET 5
+#define ED_COUNT_VALUE_YOFFSET 3
+
+/* identifiers for DrawValueField() */
+#define ED_SCORE_FIELD                 0
+
+/* control button identifiers */
 #define ED_CTRL_ID_SINGLE_ITEMS                0
 #define ED_CTRL_ID_CONNECTED_ITEMS     1
 #define ED_CTRL_ID_LINE                        2
@@ -72,7 +83,7 @@
 #define ED_CTRL_ID_RECTANGLE           4
 #define ED_CTRL_ID_FILLED_BOX          5
 #define ED_CTRL_ID_WRAP_UP             6
-#define ED_CTRL_ID_ITEM_PROPERTIES     7
+#define ED_CTRL_ID_PROPERTIES          7
 #define ED_CTRL_ID_FLOOD_FILL          8
 #define ED_CTRL_ID_WRAP_LEFT           9
 #define ED_CTRL_ID_WRAP_RIGHT          11
 #define ED_CTRL_ID_TEST                        20
 #define ED_CTRL_ID_EXIT                        21
 
+/* other gadget identifiers */
+#define ED_CTRL_ID_SCORE_DOWN          22
+#define ED_CTRL_ID_SCORE_UP            23
+
+#define ED_NUM_GADGETS                 24
+
 /* forward declaration for internal use */
-void HandleDrawingFunctions(int, int, int);
-void HandlePressedControlButtons();
-void HandleControlButtons(struct GadgetInfo *);
+static void CopyLevelToUndoBuffer();
+static void HandleDrawingFunctions(int, int, int);
+static void HandlePressedControlButtons();
+static void HandleControlButtons(struct GadgetInfo *);
 
-static struct GadgetInfo *control_button_gadget[ED_NUM_CTRL_BUTTONS];
-static boolean control_button_gadgets_created = FALSE;
-static boolean control_button_gadgets_mapped = FALSE;
+static struct GadgetInfo *level_editor_gadget[ED_NUM_GADGETS];
+static boolean level_editor_gadgets_created = FALSE;
 
 static int drawing_function = ED_CTRL_ID_SINGLE_ITEMS;
 
@@ -110,8 +127,11 @@ static int random_placement_method = RANDOM_USE_PERCENTAGE;
 static int random_placement_method = RANDOM_USE_NUM_OBJECTS;
 #endif
 
+/* pointer to score value */
+static int *gadget_score_value;
+
 static int level_xpos,level_ypos;
-static boolean edit_mode;
+static int edit_mode;
 static boolean name_typing;
 static int new_element1 = EL_MAUERWERK;
 static int new_element2 = EL_LEERRAUM;
@@ -413,7 +433,7 @@ int editor_element[] =
 };
 int elements_in_list = sizeof(editor_element)/sizeof(int);
 
-void ScrollMiniLevel(int from_x, int from_y, int scroll)
+static void ScrollMiniLevel(int from_x, int from_y, int scroll)
 {
   int x,y;
   int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
@@ -440,12 +460,17 @@ void ScrollMiniLevel(int from_x, int from_y, int scroll)
   BackToFront();
 }
 
-void CreateLevelEditorControlButtons()
+void InitLevelEditorGadgets()
 {
   int i;
 
-  if (control_button_gadgets_created)
-    return;
+  for (i=0; i<ED_NUM_GADGETS; i++)
+    level_editor_gadget[i] = NULL;
+}
+
+static void CreateControlButtons()
+{
+  int i;
 
   for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
   {
@@ -504,36 +529,89 @@ void CreateLevelEditorControlButtons()
     if (gi == NULL)
       Error(ERR_EXIT, "cannot create gadget");
 
-    control_button_gadget[i] = gi;
+    level_editor_gadget[i] = gi;
   }
-
-  control_button_gadgets_created = TRUE;
 }
 
-void MapLevelEditorControlButtons()
+static void CreateCounterButtons(int id)
 {
   int i;
 
-  if (!control_button_gadgets_created)
-    CreateLevelEditorControlButtons();
+  for (i=0; i<2; i++)
+  {
+    Pixmap gd_pixmap = pix[PIX_DOOR];
+    struct GadgetInfo *gi;
+    int gd_xoffset;
+    int gd_x1, gd_x2, gd_y;
+
+    gd_xoffset = (i == 0 ? ED_BUTTON_MINUS_XPOS : ED_BUTTON_PLUS_XPOS);
+    gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset;
+    gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset;
+    gd_y  = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS;
+
+    gi = CreateGadget(GDI_X, SX + ED_SCORE_XPOS + gd_xoffset,
+                     GDI_Y, SY + ED_SCORE_YPOS,
+                     GDI_WIDTH, ED_BUTTON_COUNT_XSIZE,
+                     GDI_HEIGHT, ED_BUTTON_COUNT_YSIZE,
+                     GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
+                     GDI_STATE, GD_BUTTON_UNPRESSED,
+                     GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
+                     GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y,
+                     GDI_EVENT_MASK, GD_EVENT_PRESSED,
+                     GDI_CALLBACK, HandleControlButtons,
+                     GDI_END);
+
+    if (gi == NULL)
+      Error(ERR_EXIT, "cannot create gadget");
+
+    level_editor_gadget[id + i] = gi;
+  }
+}
+
+static void CreateLevelEditorGadgets()
+{
+  if (level_editor_gadgets_created)
+    return;
+
+  /* create main control buttons */
+  CreateControlButtons();
+
+  /* create element score buttons */
+  CreateCounterButtons(ED_CTRL_ID_SCORE_DOWN);
+
+  level_editor_gadgets_created = TRUE;
+}
+
+static void MapControlButtons()
+{
+  int i;
 
   for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
-    MapGadget(control_button_gadget[i]);
+    MapGadget(level_editor_gadget[i]);
+}
 
-  control_button_gadgets_mapped = TRUE;
+static void MapCounterButtons(int id)
+{
+  int i;
+
+  for (i=0; i<2; i++)
+    MapGadget(level_editor_gadget[id + i]);
 }
 
-void UnmapLevelEditorControlButtons()
+void UnmapLevelEditorWindowGadgets()
 {
   int i;
 
-  if (!control_button_gadgets_created || !control_button_gadgets_mapped)
-    return;
+  for (i=ED_NUM_CTRL_BUTTONS; i<ED_NUM_GADGETS; i++)
+    UnmapGadget(level_editor_gadget[i]);
+}
 
-  for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
-    UnmapGadget(control_button_gadget[i]);
+void UnmapLevelEditorGadgets()
+{
+  int i;
 
-  control_button_gadgets_mapped = FALSE;
+  for (i=0; i<ED_NUM_GADGETS; i++)
+    UnmapGadget(level_editor_gadget[i]);
 }
 
 void DrawLevelEd()
@@ -542,7 +620,7 @@ void DrawLevelEd()
 
   level_xpos=-1;
   level_ypos=-1;
-  edit_mode = TRUE;
+  edit_mode = ED_MODE_EDIT;
   name_typing = FALSE;
   element_shift = 0;
 
@@ -562,11 +640,9 @@ void DrawLevelEd()
   }
   else
   {
-    undo_buffer_position = 0;
-    undo_buffer_steps = 0;
-    for(x=0; x<lev_fieldx; x++)
-      for(y=0; y<lev_fieldy; y++)
-       UndoBuffer[0][x][y] = Ur[x][y];
+    undo_buffer_position = -1;
+    undo_buffer_steps = -1;
+    CopyLevelToUndoBuffer();
   }
 
   DrawMiniLevel(level_xpos,level_ypos);
@@ -648,7 +724,10 @@ void DrawLevelEd()
 
   OpenDoor(DOOR_OPEN_1);
 
-  MapLevelEditorControlButtons();
+  if (!level_editor_gadgets_created)
+    CreateLevelEditorGadgets();
+
+  MapControlButtons();
 
   /*
   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
@@ -660,6 +739,7 @@ void DrawControlWindow()
   int i,x,y;
 
   ClearWindow();
+  UnmapLevelEditorWindowGadgets();
 
   /* Inhalt der Mampfer */
   DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
@@ -896,7 +976,7 @@ void LevelEd(int mx, int my, int button)
     if (((choice == ED_BUTTON_EUP && element_shift>0) ||
         (choice == ED_BUTTON_EDOWN &&
          element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)) &&
-       DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
+       DelayReached(&choice_delay, GADGET_FRAME_DELAY))
     {
       int i, step;
 
@@ -944,7 +1024,7 @@ void LevelEd(int mx, int my, int button)
       redraw_mask |= REDRAW_DOOR_1;
     }
   
-    if (edit_mode)             /********** EDIT-FENSTER **********/
+    if (edit_mode == ED_MODE_EDIT)     /********** EDIT-FENSTER **********/
     {
 
 
@@ -961,7 +1041,7 @@ void LevelEd(int mx, int my, int button)
                    VXSIZE,VYSIZE,
                    DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
          OpenDoor(DOOR_OPEN_2);
-         edit_mode = FALSE;
+         edit_mode = ED_MODE_INFO;
          break;
        case ED_BUTTON_FILL:
          Request("Caution ! Flood fill mode ! Choose area !",REQ_OPEN);
@@ -971,7 +1051,7 @@ void LevelEd(int mx, int my, int button)
        case ED_BUTTON_LEFT:
          if (level_xpos>=0)
          {
-           if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
+           if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY))
              break;
            if (lev_fieldx<2*SCR_FIELDX-2)
              break;
@@ -988,7 +1068,7 @@ void LevelEd(int mx, int my, int button)
        case ED_BUTTON_RIGHT:
          if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
          {
-           if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
+           if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY))
              break;
            if (lev_fieldx<2*SCR_FIELDX-2)
              break;
@@ -1005,7 +1085,7 @@ void LevelEd(int mx, int my, int button)
        case ED_BUTTON_UP:
          if (level_ypos>=0)
          {
-           if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
+           if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY))
              break;
            if (lev_fieldy<2*SCR_FIELDY-2)
              break;
@@ -1022,7 +1102,7 @@ void LevelEd(int mx, int my, int button)
        case ED_BUTTON_DOWN:
          if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
          {
-           if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
+           if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY))
              break;
            if (lev_fieldy<2*SCR_FIELDY-2)
              break;
@@ -1101,7 +1181,7 @@ void LevelEd(int mx, int my, int button)
       int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
 
       if (choice >= 0 && choice < 36 &&
-         DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
+         DelayReached(&choice_delay, GADGET_FRAME_DELAY))
       {
        if (!(choice % 2))
          step = -step;
@@ -1241,7 +1321,7 @@ void LevelEd(int mx, int my, int button)
                    VXSIZE,VYSIZE,
                    DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
          OpenDoor(DOOR_OPEN_2);
-         edit_mode = TRUE;
+         edit_mode = ED_MODE_EDIT;
          break;
        case ED_BUTTON_CLEAR:
          if (Request("Are you sure to clear this level ?",REQ_ASK))
@@ -1490,6 +1570,65 @@ void LevelNameTyping(KeySym key)
   }
 }
 
+static void DrawValueField(int field, int value)
+{
+  int i = 0;
+  int screen_pos[][3] =
+  {
+    { ED_SCORE_FIELD,
+      ED_SCORE_XPOS + ED_WIN_COUNT_XPOS,       ED_SCORE_YPOS },
+    { -1, 0, 0 }
+  };
+
+  while (screen_pos[i][0] != -1)
+  {
+    int x = SX + screen_pos[i][1];
+    int y = SY + screen_pos[i][2];
+
+    if (screen_pos[i++][0] != field)
+      continue;
+
+    XCopyArea(display, pix[PIX_DOOR], drawto, gc,
+             DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS,
+             DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS,
+             ED_WIN_COUNT_XSIZE, ED_WIN_COUNT_YSIZE,
+             x, y);
+
+    DrawText(x + ED_COUNT_VALUE_XOFFSET, y + ED_COUNT_VALUE_YOFFSET,
+            int2str(value, 3), FS_SMALL, FC_YELLOW);
+  }
+}
+
+static void DrawPropertiesWindow(int button)
+{
+  int x, y;
+  int new_element;
+  int num_elements_in_level;
+
+  ClearWindow();
+
+  new_element = (button == 1 ? new_element1 :
+                button == 2 ? new_element2 :
+                button == 3 ? new_element3 : 0);
+
+  DrawGraphic(1, 1, el2gfx(new_element));
+  DrawText(SX + 3*TILEX, SY + 5*TILEY/4, "Element Properties",
+          FS_SMALL, FC_YELLOW);
+
+  num_elements_in_level = 0;
+  for(y=0; y<lev_fieldy; y++) 
+    for(x=0; x<lev_fieldx; x++)
+      if (Feld[x][y] == new_element)
+       num_elements_in_level++;
+
+  DrawTextF(TILEX, 5*TILEY, FC_YELLOW, "%d x contained in level",
+           num_elements_in_level);
+       
+  gadget_score_value = &level.score[0];
+  DrawValueField(ED_SCORE_FIELD, *gadget_score_value);
+  MapCounterButtons(ED_CTRL_ID_SCORE_DOWN);
+}
+
 static void swap_numbers(int *i1, int *i2)
 {
   int help = *i1;
@@ -1521,8 +1660,8 @@ static void DrawLineElement(int sx, int sy, int element, boolean change_level)
     Feld[lx][ly] = element;
 }
 
-void DrawLine(int from_x, int from_y, int to_x, int to_y, int element,
-             boolean change_level)
+static void DrawLine(int from_x, int from_y, int to_x, int to_y,
+                    int element, boolean change_level)
 {
   if (from_y == to_y)                  /* horizontal line */
   {
@@ -1583,8 +1722,8 @@ void DrawLine(int from_x, int from_y, int to_x, int to_y, int element,
   }
 }
 
-void DrawRectangle(int from_x, int from_y, int to_x, int to_y, int element,
-                  boolean change_level)
+static void DrawRectangle(int from_x, int from_y, int to_x, int to_y,
+                         int element, boolean change_level)
 {
   DrawLine(from_x, from_y, from_x, to_y, element, change_level);
   DrawLine(from_x, to_y, to_x, to_y, element, change_level);
@@ -1592,8 +1731,8 @@ void DrawRectangle(int from_x, int from_y, int to_x, int to_y, int element,
   DrawLine(to_x, from_y, from_x, from_y, element, change_level);
 }
 
-void DrawFilledBox(int from_x, int from_y, int to_x, int to_y, int element,
-                  boolean change_level)
+static void DrawFilledBox(int from_x, int from_y, int to_x, int to_y,
+                         int element, boolean change_level)
 {
   int y;
 
@@ -1604,7 +1743,7 @@ void DrawFilledBox(int from_x, int from_y, int to_x, int to_y, int element,
     DrawLine(from_x, y, to_x, y, element, change_level);
 }
 
-void FloodFill(int from_x, int from_y, int fill_element)
+static void FloodFill(int from_x, int from_y, int fill_element)
 {
   int i,x,y;
   int old_element;
@@ -1635,7 +1774,7 @@ void FloodFill(int from_x, int from_y, int fill_element)
   safety--;
 }
 
-void CopyLevelToUndoBuffer()
+static void CopyLevelToUndoBuffer()
 {
   int x, y;
 
@@ -1655,7 +1794,7 @@ void CopyLevelToUndoBuffer()
   */
 }
 
-void RandomPlacement(int button)
+static void RandomPlacement(int button)
 {
   int new_element;
   int x, y;
@@ -1664,8 +1803,6 @@ void RandomPlacement(int button)
                 button == 2 ? new_element2 :
                 button == 3 ? new_element3 : 0);
 
-  CopyLevelToUndoBuffer();
-
   if (random_placement_method == RANDOM_USE_PERCENTAGE)
   {
     for(x=0; x<lev_fieldx; x++)
@@ -1693,13 +1830,12 @@ void RandomPlacement(int button)
   DrawMiniLevel(level_xpos, level_ypos);
 }
 
-void HandleDrawingFunctions(int mx, int my, int button)
+static void HandleDrawingFunctions(int mx, int my, int button)
 {
   static int last_button = 0;
   static int last_element = 0;
   boolean button_press_event;
   boolean button_release_event;
-  boolean copy_to_undo_buffer = FALSE;
   int new_element;
   int sx = (mx - SX) / MINI_TILEX; 
   int sy = (my - SY) / MINI_TILEY; 
@@ -1707,7 +1843,7 @@ void HandleDrawingFunctions(int mx, int my, int button)
   int ly = sy + level_ypos;
   int x, y;
 
-  if (!edit_mode)
+  if (edit_mode != ED_MODE_EDIT)
     return;
 
   button_press_event = (last_button == 0 && button != 0);
@@ -1733,7 +1869,7 @@ void HandleDrawingFunctions(int mx, int my, int button)
   {
     case ED_CTRL_ID_SINGLE_ITEMS:
       if (button_release_event)
-       copy_to_undo_buffer = TRUE;
+       CopyLevelToUndoBuffer();
 
       if (!button)
        break;
@@ -1769,7 +1905,7 @@ void HandleDrawingFunctions(int mx, int my, int button)
        static int last_sy = -1;
 
        if (button_release_event)
-         copy_to_undo_buffer = TRUE;
+         CopyLevelToUndoBuffer();
 
        if (button)
        {
@@ -1807,7 +1943,7 @@ void HandleDrawingFunctions(int mx, int my, int button)
        else if (button_release_event)
        {
          draw_func(start_sx, start_sy, sx, sy, last_element, TRUE);
-         copy_to_undo_buffer = TRUE;
+         CopyLevelToUndoBuffer();
        }
        else if (last_sx != sx || last_sy != sy)
        {
@@ -1824,7 +1960,7 @@ void HandleDrawingFunctions(int mx, int my, int button)
       {
        FloodFill(lx, ly, new_element);
        DrawMiniLevel(level_xpos, level_ypos);
-       copy_to_undo_buffer = TRUE;
+       CopyLevelToUndoBuffer();
       }
       break;
 
@@ -1833,13 +1969,9 @@ void HandleDrawingFunctions(int mx, int my, int button)
   }
 
   last_element = new_element;
-
-  if (copy_to_undo_buffer)
-    CopyLevelToUndoBuffer();
-  copy_to_undo_buffer = FALSE;
 }
 
-void HandlePressedControlButtons()
+static void HandlePressedControlButtons()
 {
   static unsigned long button_delay = 0;
   int i = 0;
@@ -1851,17 +1983,19 @@ void HandlePressedControlButtons()
     ED_CTRL_ID_WRAP_LEFT,
     ED_CTRL_ID_WRAP_RIGHT,
     ED_CTRL_ID_WRAP_DOWN,
+    ED_CTRL_ID_SCORE_DOWN,
+    ED_CTRL_ID_SCORE_UP,
     -1
   };
 
-  if (!DelayReached(&button_delay, CHOICE_DELAY_VALUE))
+  if (!DelayReached(&button_delay, GADGET_FRAME_DELAY))
     return;
 
   while (gadget_id[i] != -1)
   {
     int id = gadget_id[i++];
-    int state = control_button_gadget[id]->state;
-    int button = control_button_gadget[id]->event.button;
+    int state = level_editor_gadget[id]->state;
+    int button = level_editor_gadget[id]->event.button;
     int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
 
     if (state != GD_BUTTON_PRESSED)
@@ -1932,6 +2066,17 @@ void HandlePressedControlButtons()
            DrawMiniLevel(level_xpos, level_ypos);
        }
        break;
+
+      case ED_CTRL_ID_SCORE_DOWN:
+      case ED_CTRL_ID_SCORE_UP:
+       *gadget_score_value += (id == ED_CTRL_ID_SCORE_DOWN ? -step : step);
+       if (*gadget_score_value < 0)
+         *gadget_score_value = 0;
+       else if (*gadget_score_value > 255)
+         *gadget_score_value = 255;
+
+       DrawValueField(ED_SCORE_FIELD, *gadget_score_value);
+       break;
   
       default:
        break;
@@ -1939,25 +2084,28 @@ void HandlePressedControlButtons()
   }
 }
 
-void HandleControlButtons(struct GadgetInfo *gi)
+static void HandleControlButtons(struct GadgetInfo *gi)
 {
+  /*
   int event_type = gi->event.type;
+  */
   int button = gi->event.button;
   int player_present = FALSE;
   int level_changed = FALSE;
-  int id;
+  int id = -1;
   int i, x, y;
 
   /* get the button id */
   for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
-    if (gi->id == control_button_gadget[i]->id)
+    if (gi->id == level_editor_gadget[i]->id)
       id = i;
 
-  if (id < ED_NUM_CTRL1_BUTTONS && !edit_mode)
+  if (id >= 0 && id < ED_NUM_CTRL1_BUTTONS && edit_mode != ED_MODE_EDIT)
   {
+    UnmapLevelEditorWindowGadgets();
     AdjustLevelScrollPosition();
     DrawMiniLevel(level_xpos, level_ypos);
-    edit_mode = TRUE;
+    edit_mode = ED_MODE_EDIT;
   }
 
   switch (id)
@@ -1973,8 +2121,14 @@ void HandleControlButtons(struct GadgetInfo *gi)
       drawing_function = id;
       break;
 
+    case ED_CTRL_ID_PROPERTIES:
+      DrawPropertiesWindow(button);
+      edit_mode = ED_MODE_PROPERTIES;
+      break;
+
     case ED_CTRL_ID_RANDOM_PLACEMENT:
       RandomPlacement(button);
+      CopyLevelToUndoBuffer();
       break;
 
     case ED_CTRL_ID_UNDO:
@@ -1995,25 +2149,24 @@ void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case ED_CTRL_ID_INFO:
-      if (edit_mode)
+      if (edit_mode != ED_MODE_INFO)
       {
        DrawControlWindow();
-       edit_mode = FALSE;
+       edit_mode = ED_MODE_INFO;
       }
       else
       {
        AdjustLevelScrollPosition();
        DrawMiniLevel(level_xpos, level_ypos);
-       edit_mode = TRUE;
+       edit_mode = ED_MODE_EDIT;
       }
       break;
 
     case ED_CTRL_ID_CLEAR:
-      CopyLevelToUndoBuffer();
-
       for(x=0; x<MAX_LEV_FIELDX; x++) 
        for(y=0; y<MAX_LEV_FIELDY; y++) 
          Feld[x][y] = new_element3;
+      CopyLevelToUndoBuffer();
 
       DrawMiniLevel(level_xpos, level_ypos);
       break;
@@ -2116,12 +2269,14 @@ void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     default:
+      /*
       if (event_type == GD_EVENT_PRESSED)
        printf("HandleControlButtons: GD_EVENT_PRESSED\n");
       else if (event_type == GD_EVENT_RELEASED)
        printf("HandleControlButtons: GD_EVENT_RELEASED\n");
       else
        printf("HandleControlButtons: ?\n");
+      */
       break;
   }
 }
index 169fbce7185532f215385085db14db9a80784f82..2b1e839a7fc07fc174ea4742e1853da032b9ccb7 100644 (file)
@@ -24,7 +24,8 @@ extern int element_shift;
 extern int editor_element[];
 extern int elements_in_list;
 
-void UnmapLevelEditorControlButtons();
+void InitLevelEditorGadgets();
+void UnmapLevelEditorGadgets();
 void DrawLevelEd(void);
 void LevelEd(int, int, int);
 void LevelNameTyping(KeySym);
index 53b8171422ab97d250b7f66508d5944fff877726..38f58f940148d45c43783061b548f1e26605f98a 100644 (file)
@@ -676,7 +676,8 @@ void HandleJoystick()
     {
       static unsigned long joystickmove_delay = 0;
 
-      if (joystick && !button && !DelayReached(&joystickmove_delay, 150))
+      if (joystick && !button &&
+         !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY))
        newbutton = dx = dy = 0;
 
       if (game_status==MAINMENU)
index bc72b99a2787ca8f660bfafabbb38ca8baf9b712..f2e48bf0b82f5a66d5e173892df1067721b8ddb7 100644 (file)
@@ -17,6 +17,7 @@
 #include "misc.h"
 #include "sound.h"
 #include "screens.h"
+#include "editor.h"
 #include "tools.h"
 #include "files.h"
 #include "joystick.h"
@@ -66,6 +67,7 @@ void OpenAll(int argc, char *argv[])
   InitSoundServer();
   InitJoysticks();
   InitRND(NEW_RANDOMIZE);
+  InitLevelEditorGadgets();
 
   signal(SIGINT, CloseAllAndExit);
   signal(SIGTERM, CloseAllAndExit);
index 0b154ad28107aceaf9978441b1a0bab597476b63..7cdf619a7478d12976b31bf5821a4f49190b09c3 100644 (file)
@@ -204,6 +204,7 @@ typedef unsigned char byte;
 #define GAME_FRAME_DELAY       20      /* frame delay in milliseconds */
 #define FFWD_FRAME_DELAY       10      /* 200% speed for fast forward */
 #define FRAMES_PER_SECOND      (1000 / GAME_FRAME_DELAY)
+#define GADGET_FRAME_DELAY     150     /* delay between gadget actions */
 
 struct HiScore
 {
index fbdc116c0787f30b8654f222c190e856bbd91875..f38ab8549b031169ce65e9c66ae5fbeea78e62b6 100644 (file)
@@ -67,7 +67,7 @@ void DrawMainMenu()
   }
 
   /* needed if last screen was the level editor */
-  UnmapLevelEditorControlButtons();
+  UnmapLevelEditorGadgets();
 
   FadeSounds();
   GetPlayerConfig();
@@ -180,7 +180,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
     if (new_level_nr > leveldir[leveldir_nr].levels - 1)
       new_level_nr = leveldir[leveldir_nr].levels - 1;
 
-    if (old_level_nr == new_level_nr || !DelayReached(&level_delay, 150))
+    if (old_level_nr == new_level_nr ||
+       !DelayReached(&level_delay, GADGET_FRAME_DELAY))
       goto out;
 
     level_nr = new_level_nr;
@@ -861,7 +862,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
   if (x == 1 && y == 2)
   {
     if (first_entry > 0 &&
-       (dy || DelayReached(&choose_delay, 150)))
+       (dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY)))
     {
 #if 0
       first_entry--;
@@ -879,7 +880,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
   else if (x == 1 && y > num_page_entries + 2)
   {
     if (first_entry + num_page_entries < num_leveldirs &&
-       (dy || DelayReached(&choose_delay, 150)))
+       (dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY)))
     {
 #if 0
       first_entry++;
@@ -1421,7 +1422,7 @@ void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
   {
     static unsigned long delay = 0;
 
-    if (!DelayReached(&delay, 150))
+    if (!DelayReached(&delay, GADGET_FRAME_DELAY))
       goto out;
 
     player_nr = (player_nr + (x == 11 ? -1 : +1) + MAX_PLAYERS) % MAX_PLAYERS;