rnd-19990220-1-src
authorHolger Schemel <info@artsoft.org>
Sat, 20 Feb 1999 01:03:28 +0000 (02:03 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:33:51 +0000 (10:33 +0200)
src/buttons.c
src/editor.c
src/events.c
src/files.c
src/game.c
src/main.h
src/screens.c
src/tools.c
src/tools.h

index c24981f377d6b9c29492d1ea795b9ea344764559..78e28d168a762814388b2d08c988bd2d721ac4ac 100644 (file)
@@ -899,7 +899,8 @@ static void MultiMapGadgets(int mode)
   {
     if ((mode & MULTIMAP_PLAYFIELD && gi->x < SX + SXSIZE) ||
        (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y < DY + DYSIZE) ||
   {
     if ((mode & MULTIMAP_PLAYFIELD && gi->x < SX + SXSIZE) ||
        (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y < DY + DYSIZE) ||
-       (mode & MULTIMAP_DOOR_1 && gi->x >= DX && gi->y > DY + DYSIZE))
+       (mode & MULTIMAP_DOOR_2 && gi->x >= DX && gi->y > DY + DYSIZE) ||
+       (mode & MULTIMAP_ALL) == MULTIMAP_ALL)
     {
       if (mode & MULTIMAP_UNMAP)
       {
     {
       if (mode & MULTIMAP_UNMAP)
       {
@@ -1183,6 +1184,8 @@ void HandleGadgets(int mx, int my, int button)
 
   if (gadget_pressed_repeated)
   {
 
   if (gadget_pressed_repeated)
   {
+    gi->event.type = GD_EVENT_PRESSED;
+
     if (gi->event_mask & GD_EVENT_REPEATED &&
        DelayReached(&pressed_delay, GADGET_FRAME_DELAY))
       gi->callback_action(gi);
     if (gi->event_mask & GD_EVENT_REPEATED &&
        DelayReached(&pressed_delay, GADGET_FRAME_DELAY))
       gi->callback_action(gi);
index ee201420d2029dd184f33028da5db76702b1e0e0..d5233e26d3aeafa7e2c16f6eabba878f0ff5ba19 100644 (file)
 #define GADGET_ID_LEVEL_TIMESCORE_DOWN 43
 #define GADGET_ID_LEVEL_TIMESCORE_TEXT 44
 #define GADGET_ID_LEVEL_TIMESCORE_UP   45
 #define GADGET_ID_LEVEL_TIMESCORE_DOWN 43
 #define GADGET_ID_LEVEL_TIMESCORE_TEXT 44
 #define GADGET_ID_LEVEL_TIMESCORE_UP   45
+#define GADGET_ID_SELECT_LEVEL_DOWN    46
+#define GADGET_ID_SELECT_LEVEL_TEXT    47
+#define GADGET_ID_SELECT_LEVEL_UP      48
 
 /* drawing area identifiers */
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_LEVEL        46
-#define GADGET_ID_ELEM_CONTENT_0       47
-#define GADGET_ID_ELEM_CONTENT_1       48
-#define GADGET_ID_ELEM_CONTENT_2       49
-#define GADGET_ID_ELEM_CONTENT_3       50
-#define GADGET_ID_ELEM_CONTENT_4       51
-#define GADGET_ID_ELEM_CONTENT_5       52
-#define GADGET_ID_ELEM_CONTENT_6       53
-#define GADGET_ID_ELEM_CONTENT_7       54
-#define GADGET_ID_AMOEBA_CONTENT       55
+#define GADGET_ID_DRAWING_LEVEL                49
+#define GADGET_ID_ELEM_CONTENT_0       50
+#define GADGET_ID_ELEM_CONTENT_1       51
+#define GADGET_ID_ELEM_CONTENT_2       52
+#define GADGET_ID_ELEM_CONTENT_3       53
+#define GADGET_ID_ELEM_CONTENT_4       54
+#define GADGET_ID_ELEM_CONTENT_5       55
+#define GADGET_ID_ELEM_CONTENT_6       56
+#define GADGET_ID_ELEM_CONTENT_7       57
+#define GADGET_ID_AMOEBA_CONTENT       58
 
 /* text input identifiers */
 
 /* text input identifiers */
-#define GADGET_ID_LEVEL_NAME           56
-#define GADGET_ID_LEVEL_AUTHOR         57
+#define GADGET_ID_LEVEL_NAME           59
+#define GADGET_ID_LEVEL_AUTHOR         60
 
 /* gadgets for scrolling of drawing area */
 
 /* gadgets for scrolling of drawing area */
-#define GADGET_ID_SCROLL_UP            58
-#define GADGET_ID_SCROLL_DOWN          59
-#define GADGET_ID_SCROLL_LEFT          60
-#define GADGET_ID_SCROLL_RIGHT         61
-#define GADGET_ID_SCROLL_HORIZONTAL    62
-#define GADGET_ID_SCROLL_VERTICAL      63
+#define GADGET_ID_SCROLL_UP            61
+#define GADGET_ID_SCROLL_DOWN          62
+#define GADGET_ID_SCROLL_LEFT          63
+#define GADGET_ID_SCROLL_RIGHT         64
+#define GADGET_ID_SCROLL_HORIZONTAL    65
+#define GADGET_ID_SCROLL_VERTICAL      66
 
 /* gadgets for scrolling element list */
 
 /* gadgets for scrolling element list */
-#define GADGET_ID_ELEMENTLIST_UP       64
-#define GADGET_ID_ELEMENTLIST_DOWN     65
+#define GADGET_ID_ELEMENTLIST_UP       67
+#define GADGET_ID_ELEMENTLIST_DOWN     68
 
 /* gadgets for buttons in element list */
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    66
-#define GADGET_ID_ELEMENTLIST_LAST     105
+#define GADGET_ID_ELEMENTLIST_FIRST    69
+#define GADGET_ID_ELEMENTLIST_LAST     108
 
 /* buttons for level settings */
 
 /* buttons for level settings */
-#define GADGET_ID_RANDOM_PERCENTAGE    106
-#define GADGET_ID_RANDOM_QUANTITY      107
-#define GADGET_ID_RANDOM_RESTRICTED    108
-#define GADGET_ID_DOUBLE_SPEED         109
-#define GADGET_ID_GRAVITY              110
-#define GADGET_ID_STICK_ELEMENT                111
+#define GADGET_ID_RANDOM_PERCENTAGE    109
+#define GADGET_ID_RANDOM_QUANTITY      110
+#define GADGET_ID_RANDOM_RESTRICTED    111
+#define GADGET_ID_DOUBLE_SPEED         112
+#define GADGET_ID_GRAVITY              113
+#define GADGET_ID_STICK_ELEMENT                114
 
 /* another drawing area for random placement */
 
 /* another drawing area for random placement */
-#define GADGET_ID_RANDOM_BACKGROUND    112
+#define GADGET_ID_RANDOM_BACKGROUND    115
 
 
-#define NUM_EDITOR_GADGETS             113
+#define NUM_EDITOR_GADGETS             116
 
 /* radio button numbers */
 #define RADIO_NR_NONE                  0
 
 /* radio button numbers */
 #define RADIO_NR_NONE                  0
 #define ED_COUNTER_ID_LEVEL_TIMELIMIT  5
 #define ED_COUNTER_ID_LEVEL_TIMESCORE  6
 #define ED_COUNTER_ID_LEVEL_RANDOM     7
 #define ED_COUNTER_ID_LEVEL_TIMELIMIT  5
 #define ED_COUNTER_ID_LEVEL_TIMESCORE  6
 #define ED_COUNTER_ID_LEVEL_RANDOM     7
+#define ED_COUNTER_ID_SELECT_LEVEL     8
 
 
-#define ED_NUM_COUNTERBUTTONS          8
+#define ED_NUM_COUNTERBUTTONS          9
 
 #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_LEVEL_FIRST      ED_COUNTER_ID_LEVEL_XSIZE
 #define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM
@@ -459,6 +463,14 @@ static struct
     GADGET_ID_LEVEL_RANDOM_TEXT,
     &random_placement_value,
     "random element placement",                "in"
     GADGET_ID_LEVEL_RANDOM_TEXT,
     &random_placement_value,
     "random element placement",                "in"
+  },
+  {
+    DX - SX - 1,                       0 - SY + 31,
+    1,                                 100,
+    GADGET_ID_SELECT_LEVEL_DOWN,       GADGET_ID_SELECT_LEVEL_UP,
+    GADGET_ID_SELECT_LEVEL_TEXT,
+    &level_nr,
+    NULL,                              NULL
   }
 };
 
   }
 };
 
@@ -644,6 +656,8 @@ static int new_element3 = EL_ERDREICH;
 #define BUTTON_STEPSIZE(button) (button == 1 ? 1 : button == 2 ? 5 : 10)
 
 /* forward declaration for internal use */
 #define BUTTON_STEPSIZE(button) (button == 1 ? 1 : button == 2 ? 5 : 10)
 
 /* forward declaration for internal use */
+static void ModifyEditorCounter(int, int);
+static void ModifyEditorCounterLimits(int, int, int);
 static void DrawDrawingWindow();
 static void DrawLevelInfoWindow();
 static void DrawPropertiesWindow();
 static void DrawDrawingWindow();
 static void DrawLevelInfoWindow();
 static void DrawPropertiesWindow();
@@ -1318,15 +1332,39 @@ static void CreateCounterButtons()
                counterbutton_info[i].gadget_id_up);
       int gd_xoffset;
       int gd_x, gd_x1, gd_x2, gd_y;
                counterbutton_info[i].gadget_id_up);
       int gd_xoffset;
       int gd_x, gd_x1, gd_x2, gd_y;
+      int x_size, y_size;
       unsigned long event_mask;
       char infotext[MAX_INFOTEXT_LEN + 1];
 
       event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
       unsigned long event_mask;
       char infotext[MAX_INFOTEXT_LEN + 1];
 
       event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
-      gd_xoffset = (j == 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;
+      if (i == ED_COUNTER_ID_SELECT_LEVEL)
+      {
+       int sid = (j == 0 ?
+                  ED_SCROLLBUTTON_ID_AREA_LEFT :
+                  ED_SCROLLBUTTON_ID_AREA_RIGHT);
+
+       event_mask |= GD_EVENT_RELEASED;
+
+       if (j == 1)
+         xpos += ED_GADGET_DISTANCE;
+       ypos += ED_GADGET_DISTANCE;
+
+       gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[sid].xpos;
+       gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE;
+       gd_y  = DOOR_GFX_PAGEY1 + scrollbutton_info[sid].ypos;
+       x_size = ED_SCROLLBUTTON_XSIZE;
+       y_size = ED_SCROLLBUTTON_YSIZE;
+      }
+      else
+      {
+       gd_xoffset = (j == 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;
+       x_size = ED_BUTTON_COUNT_XSIZE;
+       y_size = ED_BUTTON_COUNT_YSIZE;
+      }
 
       sprintf(infotext, "%s counter value by 1, 5 or 10",
              (j == 0 ? "decrease" : "increase"));
 
       sprintf(infotext, "%s counter value by 1, 5 or 10",
              (j == 0 ? "decrease" : "increase"));
@@ -1336,8 +1374,8 @@ static void CreateCounterButtons()
                        GDI_INFO_TEXT, infotext,
                        GDI_X, xpos,
                        GDI_Y, ypos,
                        GDI_INFO_TEXT, infotext,
                        GDI_X, xpos,
                        GDI_Y, ypos,
-                       GDI_WIDTH, ED_BUTTON_COUNT_XSIZE,
-                       GDI_HEIGHT, ED_BUTTON_COUNT_YSIZE,
+                       GDI_WIDTH, x_size,
+                       GDI_HEIGHT, y_size,
                        GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
                        GDI_STATE, GD_BUTTON_UNPRESSED,
                        GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
                        GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
                        GDI_STATE, GD_BUTTON_UNPRESSED,
                        GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
@@ -1357,8 +1395,19 @@ static void CreateCounterButtons()
        id = counterbutton_info[i].gadget_id_text;
        event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
 
        id = counterbutton_info[i].gadget_id_text;
        event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
 
-       gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
-       gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+       if (i == ED_COUNTER_ID_SELECT_LEVEL)
+       {
+         xpos += ED_GADGET_DISTANCE;
+         ypos -= ED_GADGET_DISTANCE;
+
+         gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
+         gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+       }
+       else
+       {
+         gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
+         gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+       }
 
        gi = CreateGadget(GDI_CUSTOM_ID, id,
                          GDI_CUSTOM_TYPE_ID, i,
 
        gi = CreateGadget(GDI_CUSTOM_ID, id,
                          GDI_CUSTOM_TYPE_ID, i,
@@ -1675,23 +1724,35 @@ void CreateLevelEditorGadgets()
   CreateCheckbuttonGadgets();
 }
 
   CreateCheckbuttonGadgets();
 }
 
+static void MapCounterButtons(int id)
+{
+  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]);
+  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_text]);
+  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_up]);
+}
+
 static void MapControlButtons()
 {
 static void MapControlButtons()
 {
+  int counter_id;
   int i;
 
   int i;
 
+  /* map toolbox buttons */
   for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
     MapGadget(level_editor_gadget[i]);
   for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
     MapGadget(level_editor_gadget[i]);
+
+  /* map buttons to select elements */
   for (i=0; i<ED_NUM_ELEMENTLIST_BUTTONS; i++)
     MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_FIRST + i]);
   MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_UP]);
   MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_DOWN]);
   for (i=0; i<ED_NUM_ELEMENTLIST_BUTTONS; i++)
     MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_FIRST + i]);
   MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_UP]);
   MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_DOWN]);
-}
 
 
-static void MapCounterButtons(int id)
-{
-  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]);
-  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_text]);
-  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_up]);
+  /* map buttons to select level */
+  counter_id = ED_COUNTER_ID_SELECT_LEVEL;
+  ModifyEditorCounterLimits(counter_id,
+                           leveldir[leveldir_nr].first_level,
+                           leveldir[leveldir_nr].last_level);
+  ModifyEditorCounter(counter_id, *counterbutton_info[counter_id].value);
+  MapCounterButtons(counter_id);
 }
 
 static void MapDrawingArea(int id)
 }
 
 static void MapDrawingArea(int id)
@@ -1755,7 +1816,7 @@ void UnmapLevelEditorWindowGadgets()
   int i;
 
   for (i=0; i<NUM_EDITOR_GADGETS; i++)
   int i;
 
   for (i=0; i<NUM_EDITOR_GADGETS; i++)
-    if (level_editor_gadget[i]->x < DX)
+    if (level_editor_gadget[i]->x < SX + SXSIZE)
       UnmapGadget(level_editor_gadget[i]);
 }
 
       UnmapGadget(level_editor_gadget[i]);
 }
 
@@ -1767,10 +1828,53 @@ void UnmapLevelEditorGadgets()
     UnmapGadget(level_editor_gadget[i]);
 }
 
     UnmapGadget(level_editor_gadget[i]);
 }
 
-void DrawLevelEd()
+static void ResetUndoBuffer()
+{
+  undo_buffer_position = -1;
+  undo_buffer_steps = -1;
+  CopyLevelToUndoBuffer(UNDO_IMMEDIATE);
+}
+
+static void DrawEditModeWindow()
+{
+  if (edit_mode == ED_MODE_INFO)
+    DrawLevelInfoWindow();
+  else if (edit_mode == ED_MODE_PROPERTIES)
+    DrawPropertiesWindow();
+  else /* edit_mode == ED_MODE_DRAWING */
+    DrawDrawingWindow();
+}
+
+static boolean LevelChanged()
 {
 {
-  edit_mode = ED_MODE_DRAWING;
+  boolean level_changed = FALSE;
+  int x, y;
+
+  for(y=0; y<lev_fieldy; y++) 
+    for(x=0; x<lev_fieldx; x++)
+      if (Feld[x][y] != Ur[x][y])
+       level_changed = TRUE;
+
+  return level_changed;
+}
+
+static boolean LevelContainsPlayer()
+{
+  boolean player_found = FALSE;
+  int x, y;
+
+  for(y=0; y<lev_fieldy; y++) 
+    for(x=0; x<lev_fieldx; x++)
+      if (Feld[x][y] == EL_SPIELFIGUR ||
+         Feld[x][y] == EL_SPIELER1 ||
+         Feld[x][y] == EL_SP_MURPHY) 
+       player_found = TRUE;
 
 
+  return player_found;
+}
+
+void DrawLevelEd()
+{
   CloseDoor(DOOR_CLOSE_ALL);
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
 
   CloseDoor(DOOR_CLOSE_ALL);
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
 
@@ -1790,11 +1894,11 @@ void DrawLevelEd()
   }
   else
   {
   }
   else
   {
+    edit_mode = ED_MODE_DRAWING;
+
+    ResetUndoBuffer();
     level_xpos = -1;
     level_ypos = -1;
     level_xpos = -1;
     level_ypos = -1;
-    undo_buffer_position = -1;
-    undo_buffer_steps = -1;
-    CopyLevelToUndoBuffer(UNDO_IMMEDIATE);
   }
 
   /* copy default editor door content to main double buffer */
   }
 
   /* copy default editor door content to main double buffer */
@@ -1832,10 +1936,7 @@ void DrawLevelEd()
            DY + ED_WIN_LEVELNR_YPOS);
 
   /* draw bigger door */
            DY + ED_WIN_LEVELNR_YPOS);
 
   /* draw bigger door */
-  XCopyArea(display, pix[PIX_DOOR], drawto, gc,
-           DOOR_GFX_PAGEX7, 0,
-           108, 64,
-           EX - 4, EY - 12);
+  DrawSpecialEditorDoor();
 
   /* draw new control window */
   XCopyArea(display, pix[PIX_DOOR], drawto, gc,
 
   /* draw new control window */
   XCopyArea(display, pix[PIX_DOOR], drawto, gc,
@@ -1851,8 +1952,16 @@ void DrawLevelEd()
   XCopyArea(display, drawto, pix[PIX_DB_DOOR], gc,
            DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
   XCopyArea(display, drawto, pix[PIX_DB_DOOR], gc,
            DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
+  /*
   DrawDrawingWindow();
   DrawDrawingWindow();
+  */
+
+  DrawEditModeWindow();
+
+  /*
   FadeToFront();
   FadeToFront();
+  */
+
 
   OpenDoor(DOOR_OPEN_1);
 
 
   OpenDoor(DOOR_OPEN_1);
 
@@ -1861,6 +1970,41 @@ void DrawLevelEd()
   */
 }
 
   */
 }
 
+void SelectNewLevelToEdit(struct GadgetInfo *gi)
+{
+  int gadget_id = gi->custom_id;
+  int counter_id = gi->custom_type_id;
+  int button = gi->event.button;
+  int *counter_value = counterbutton_info[counter_id].value;
+  int step = BUTTON_STEPSIZE(button) *
+    (gadget_id == counterbutton_info[counter_id].gadget_id_down ? -1 : +1);
+  int old_counter_value = *counter_value;
+  boolean released = (gi->event.type == GD_EVENT_RELEASED);
+
+  if (LevelChanged())
+  {
+    if (gi->event.type == GD_EVENT_PRESSED)
+      return;
+
+    if (!Request("Level has changed! Discard changes ?", REQ_ASK))
+    {
+      ModifyEditorCounter(counter_id, old_counter_value);
+      return;
+    }
+  }
+  else if (released)
+    return;
+
+  if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
+    *counter_value = gi->text.number_value;
+  else
+    ModifyEditorCounter(counter_id, *counter_value + step);
+
+  LoadLevel(level_nr);
+  ResetUndoBuffer();
+  DrawEditModeWindow();
+}
+
 static void AdjustDrawingAreaGadgets()
 {
   int ed_xsize = lev_fieldx + 2;
 static void AdjustDrawingAreaGadgets()
 {
   int ed_xsize = lev_fieldx + 2;
@@ -1985,6 +2129,14 @@ static void ModifyEditorCounter(int counter_id, int new_value)
     *counter_value = gi->text.number_value;
 }
 
     *counter_value = gi->text.number_value;
 }
 
+static void ModifyEditorCounterLimits(int counter_id, int min, int max)
+{
+  int gadget_id = counterbutton_info[counter_id].gadget_id_text;
+  struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+
+  ModifyGadget(gi, GDI_NUMBER_MIN, min, GDI_NUMBER_MAX, max, GDI_END);
+}
+
 static void PickDrawingElement(int button, int element)
 {
   if (button < 1 || button > 3)
 static void PickDrawingElement(int button, int element)
 {
   if (button < 1 || button > 3)
@@ -2962,7 +3114,7 @@ static void CopyLevelToUndoBuffer(int mode)
     for(y=0; y<lev_fieldy; y++)
       UndoBuffer[undo_buffer_position][x][y] = Feld[x][y];
 
     for(y=0; y<lev_fieldy; y++)
       UndoBuffer[undo_buffer_position][x][y] = Feld[x][y];
 
-  /* check if change of border style was forced by drawing operation */
+  /* check if drawing operation forces change of border style */
   last_border_element = BorderElement;
   SetBorderElement();
   if (BorderElement != last_border_element)
   last_border_element = BorderElement;
   SetBorderElement();
   if (BorderElement != last_border_element)
@@ -3288,6 +3440,12 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
   int step = BUTTON_STEPSIZE(button) *
     (gadget_id == counterbutton_info[counter_id].gadget_id_down ? -1 : +1);
 
   int step = BUTTON_STEPSIZE(button) *
     (gadget_id == counterbutton_info[counter_id].gadget_id_down ? -1 : +1);
 
+  if (counter_id == ED_COUNTER_ID_SELECT_LEVEL)
+  {
+    SelectNewLevelToEdit(gi);
+    return;
+  }
+
   if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
     *counter_value = gi->text.number_value;
   else
   if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
     *counter_value = gi->text.number_value;
   else
@@ -3323,8 +3481,6 @@ static void HandleControlButtons(struct GadgetInfo *gi)
   int button = gi->event.button;
   int step = BUTTON_STEPSIZE(button);
   int new_element = BUTTON_ELEMENT(button);
   int button = gi->event.button;
   int step = BUTTON_STEPSIZE(button);
   int new_element = BUTTON_ELEMENT(button);
-  int player_present = FALSE;
-  int level_changed = FALSE;
   int i, x, y;
 
   if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT)
   int i, x, y;
 
   if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT)
@@ -3552,19 +3708,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
        break;
       }
 
        break;
       }
 
-      for(y=0; y<lev_fieldy; y++) 
-       for(x=0; x<lev_fieldx; x++)
-         if (Feld[x][y] != Ur[x][y])
-           level_changed = TRUE;
-
-      for(y=0; y<lev_fieldy; y++) 
-       for(x=0; x<lev_fieldx; x++)
-         if (Feld[x][y] == EL_SPIELFIGUR ||
-             Feld[x][y] == EL_SPIELER1 ||
-             Feld[x][y] == EL_SP_MURPHY) 
-           player_present = TRUE;
-
-      if (!player_present)
+      if (!LevelContainsPlayer)
        Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
       else
       {
        Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
       else
       {
@@ -3579,14 +3723,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_TEST:
       break;
 
     case GADGET_ID_TEST:
-      for(y=0; y<lev_fieldy; y++) 
-       for(x=0; x<lev_fieldx; x++)
-         if (Feld[x][y] == EL_SPIELFIGUR ||
-             Feld[x][y] == EL_SPIELER1 ||
-             Feld[x][y] == EL_SP_MURPHY) 
-           player_present = TRUE;
-
-      if (!player_present)
+      if (!LevelContainsPlayer)
        Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
       else
       {
        Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
       else
       {
@@ -3599,13 +3736,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
            Ur[x][y] = Feld[x][y];
 
        UnmapLevelEditorGadgets();
            Ur[x][y] = Feld[x][y];
 
        UnmapLevelEditorGadgets();
-
-       /* draw smaller door */
-       XCopyArea(display, pix[PIX_DOOR], drawto, gc,
-                 DOOR_GFX_PAGEX7, 64,
-                 108, 64,
-                 EX - 4, EY - 12);
-       redraw_mask |= REDRAW_ALL;
+       UndrawSpecialEditorDoor();
 
        CloseDoor(DOOR_CLOSE_ALL);
 
 
        CloseDoor(DOOR_CLOSE_ALL);
 
@@ -3622,12 +3753,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_EXIT:
       break;
 
     case GADGET_ID_EXIT:
-      for(y=0; y<lev_fieldy; y++) 
-       for(x=0; x<lev_fieldx; x++)
-         if (Feld[x][y] != Ur[x][y])
-           level_changed = TRUE;
-
-      if (!level_changed ||
+      if (!LevelChanged() ||
          Request("Level has changed! Exit without saving ?",
                  REQ_ASK | REQ_STAY_OPEN))
       {
          Request("Level has changed! Exit without saving ?",
                  REQ_ASK | REQ_STAY_OPEN))
       {
@@ -3637,13 +3763,6 @@ static void HandleControlButtons(struct GadgetInfo *gi)
        CloseDoor(DOOR_CLOSE_ALL);
        */
 
        CloseDoor(DOOR_CLOSE_ALL);
        */
 
-       /* draw smaller door */
-       XCopyArea(display, pix[PIX_DOOR], drawto, gc,
-                 DOOR_GFX_PAGEX7, 64,
-                 108, 64,
-                 EX - 4, EY - 12);
-       redraw_mask |= REDRAW_ALL;
-
        game_status = MAINMENU;
        DrawMainMenu();
       }
        game_status = MAINMENU;
        DrawMainMenu();
       }
index b0022c351eb70247a9683d6d4ca48080ad513b9b..60a6ceb3080efa7866519fd7c0de30d1efe2e6c9 100644 (file)
@@ -487,16 +487,6 @@ void HandleKey(KeySym key, int key_status)
   /* allow quick escape to the main menu with the Escape key */
   if (key == XK_Escape && game_status != MAINMENU)
   {
   /* allow quick escape to the main menu with the Escape key */
   if (key == XK_Escape && game_status != MAINMENU)
   {
-    if (game_status == LEVELED)
-    {
-      /* draw smaller door */
-      XCopyArea(display, pix[PIX_DOOR], drawto, gc,
-               DOOR_GFX_PAGEX7, 64,
-               108, 64,
-               EX - 4, EY - 12);
-      redraw_mask |= REDRAW_ALL;
-    }
-
     CloseDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
     game_status = MAINMENU;
     DrawMainMenu();
     CloseDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
     game_status = MAINMENU;
     DrawMainMenu();
index d3e85c3f1417f0fd713d6011d047e1e623c1bb68..34c53f77c97c76deb60b5cf7c1cfc0b993dc8d17 100644 (file)
@@ -493,6 +493,9 @@ void LoadLevel(int level_nr)
     Error(ERR_WARN, "using high speed movement for player");
     level.double_speed = TRUE;
   }
     Error(ERR_WARN, "using high speed movement for player");
     level.double_speed = TRUE;
   }
+
+  /* determine border element for this level */
+  SetBorderElement();
 }
 
 void SaveLevel(int level_nr)
 }
 
 void SaveLevel(int level_nr)
index dea71db296ea50209c8f30b2677c22cfe28cd62c..78b950c28033f86c51620e6341ab11c62863561b 100644 (file)
@@ -550,9 +550,6 @@ void InitGame()
                    emulate_sb ? EMU_SOKOBAN :
                    emulate_sp ? EMU_SUPAPLEX : EMU_NONE);
 
                    emulate_sb ? EMU_SOKOBAN :
                    emulate_sp ? EMU_SUPAPLEX : EMU_NONE);
 
-  /* determine border element for this level */
-  SetBorderElement();
-
   if (BorderElement == EL_LEERRAUM)
   {
     SBX_Left = 0;
   if (BorderElement == EL_LEERRAUM)
   {
     SBX_Left = 0;
@@ -607,8 +604,13 @@ void InitGame()
   XCopyArea(display, pix[PIX_DOOR], drawto, gc,
            DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
 
   XCopyArea(display, pix[PIX_DOOR], drawto, gc,
            DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
 
-  DrawText(DX + XX_LEVEL, DY + YY_LEVEL,
-          int2str(level_nr, 2), FS_SMALL, FC_YELLOW);
+  if (level_nr < 100)
+    DrawText(DX + XX_LEVEL, DY + YY_LEVEL,
+            int2str(level_nr, 2), FS_SMALL, FC_YELLOW);
+  else
+    DrawText(DX + XX_LEVEL - 1, DY + YY_LEVEL + 1,
+            int2str(level_nr, 3), FS_SMALL, FC_SPECIAL3);
+
   DrawText(DX + XX_EMERALDS, DY + YY_EMERALDS,
           int2str(local_player->gems_still_needed,3), FS_SMALL, FC_YELLOW);
   DrawText(DX + XX_DYNAMITE, DY + YY_DYNAMITE,
   DrawText(DX + XX_EMERALDS, DY + YY_EMERALDS,
           int2str(local_player->gems_still_needed,3), FS_SMALL, FC_YELLOW);
   DrawText(DX + XX_DYNAMITE, DY + YY_DYNAMITE,
index 59f504f32c9e5cca58494c3fa716157a045291f9..5f0a813a1c71a68b98995920e798a855c0df7f65 100644 (file)
@@ -544,6 +544,8 @@ extern char         *element_info[];
 #define FONT3_YSIZE            14
 #define FONT4_XSIZE            16
 #define FONT4_YSIZE            16
 #define FONT3_YSIZE            14
 #define FONT4_XSIZE            16
 #define FONT4_YSIZE            16
+#define FONT5_XSIZE            10
+#define FONT5_YSIZE            12
 
 #define GFX_STARTX             SX
 #define GFX_STARTY             SY
 
 #define GFX_STARTX             SX
 #define GFX_STARTY             SY
@@ -1294,6 +1296,7 @@ extern char               *element_info[];
 #define FC_YELLOW              3
 #define FC_SPECIAL1            4
 #define FC_SPECIAL2            5
 #define FC_YELLOW              3
 #define FC_SPECIAL1            4
 #define FC_SPECIAL2            5
+#define FC_SPECIAL3            6
 
 /* values for game_status */
 #define EXITGAME               0
 
 /* values for game_status */
 #define EXITGAME               0
index 3bf0c3005ca5fafb315e44c6fff9449a67c52fe9..d494e99a7c1f3ce3f92fc5c687ef7aeb0135523d 100644 (file)
@@ -70,6 +70,9 @@ void DrawMainMenu()
     return;
   }
 
     return;
   }
 
+  /* needed if last screen was the editor screen */
+  UndrawSpecialEditorDoor();
+
   /* map gadgets for main menu screen */
   MapTapeButtons();
 
   /* map gadgets for main menu screen */
   MapTapeButtons();
 
@@ -130,7 +133,10 @@ void DrawMainMenu()
 
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
 
 
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
 
+#if 0
   ClearEventQueue();
   ClearEventQueue();
+#endif
+
 }
 
 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 }
 
 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
index 49e65e5c89ef16c5920b6d07eda6a643e1f1d7b6..39e327cc24936bd6b67634fd0bada6feb04123ff 100644 (file)
@@ -316,12 +316,14 @@ void ClearWindow()
 
 void DrawTextFCentered(int y, int font_type, char *format, ...)
 {
 
 void DrawTextFCentered(int y, int font_type, char *format, ...)
 {
-  char buffer[FULL_SXSIZE / FONT3_XSIZE + 10];
+  char buffer[FULL_SXSIZE / FONT5_XSIZE + 10];
   int font_xsize;
   va_list ap;
 
   font_xsize = (font_type < FC_SPECIAL1 ? FONT2_XSIZE :
   int font_xsize;
   va_list ap;
 
   font_xsize = (font_type < FC_SPECIAL1 ? FONT2_XSIZE :
-               font_type < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE);
+               font_type < FC_SPECIAL2 ? FONT3_XSIZE :
+               font_type < FC_SPECIAL3 ? FONT4_XSIZE :
+               FONT5_XSIZE);
 
   va_start(ap, format);
   vsprintf(buffer, format, ap);
 
   va_start(ap, format);
   vsprintf(buffer, format, ap);
@@ -333,7 +335,7 @@ void DrawTextFCentered(int y, int font_type, char *format, ...)
 
 void DrawTextF(int x, int y, int font_type, char *format, ...)
 {
 
 void DrawTextF(int x, int y, int font_type, char *format, ...)
 {
-  char buffer[FULL_SXSIZE / FONT3_XSIZE + 10];
+  char buffer[FULL_SXSIZE / FONT5_XSIZE + 10];
   va_list ap;
 
   va_start(ap, format);
   va_list ap;
 
   va_start(ap, format);
@@ -362,18 +364,26 @@ void DrawTextExt(Drawable d, GC gc, int x, int y,
 
   if (font_size != FS_SMALL && font_size != FS_BIG)
     font_size = FS_SMALL;
 
   if (font_size != FS_SMALL && font_size != FS_BIG)
     font_size = FS_SMALL;
-  if (font_type < FC_RED || font_type > FC_SPECIAL2)
+  if (font_type < FC_RED || font_type > FC_SPECIAL3)
     font_type = FC_RED;
 
   font_width = (font_size == FS_BIG ? FONT1_XSIZE :
                font_type < FC_SPECIAL1 ? FONT2_XSIZE :
     font_type = FC_RED;
 
   font_width = (font_size == FS_BIG ? FONT1_XSIZE :
                font_type < FC_SPECIAL1 ? FONT2_XSIZE :
-               font_type < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE);
-  font_height = (font_size == FS_BIG ? FONT1_XSIZE :
-                font_type < FC_SPECIAL2 ? FONT2_XSIZE : FONT4_XSIZE);
+               font_type < FC_SPECIAL2 ? FONT3_XSIZE :
+               font_type < FC_SPECIAL3 ? FONT4_XSIZE :
+               FONT5_XSIZE);
+  font_height = (font_size == FS_BIG ? FONT1_YSIZE :
+                font_type < FC_SPECIAL1 ? FONT2_YSIZE :
+                font_type < FC_SPECIAL2 ? FONT3_YSIZE :
+                font_type < FC_SPECIAL3 ? FONT4_YSIZE :
+                FONT5_YSIZE);
   font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT);
   font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) *
                FONT_LINES_PER_FONT);
 
   font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT);
   font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) *
                FONT_LINES_PER_FONT);
 
+  if (font_type == FC_SPECIAL3)
+    font_start += (FONT4_YSIZE - FONT2_YSIZE) * FONT_LINES_PER_FONT + 3;
+
   while (*text)
   {
     char c = *text++;
   while (*text)
   {
     char c = *text++;
@@ -1513,9 +1523,6 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y)
 {
   int x, y;
 
 {
   int x, y;
 
-  /* determine border element for this level */
-  SetBorderElement();
-
   XFillRectangle(display, drawto, gc,
                 xpos, ypos, MICROLEV_XSIZE, MICROLEV_YSIZE);
 
   XFillRectangle(display, drawto, gc,
                 xpos, ypos, MICROLEV_XSIZE, MICROLEV_YSIZE);
 
@@ -1742,7 +1749,10 @@ boolean Request(char *text, unsigned int req_state)
            DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
   OpenDoor(DOOR_OPEN_1);
            DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
   OpenDoor(DOOR_OPEN_1);
+
+#if 0
   ClearEventQueue();
   ClearEventQueue();
+#endif
 
   if (!(req_state & REQUEST_WAIT_FOR))
     return(FALSE);
 
   if (!(req_state & REQUEST_WAIT_FOR))
     return(FALSE);
@@ -2071,7 +2081,33 @@ unsigned int MoveDoor(unsigned int door_state)
   if (door_state & DOOR_ACTION_2)
     door2 = door_state & DOOR_ACTION_2;
 
   if (door_state & DOOR_ACTION_2)
     door2 = door_state & DOOR_ACTION_2;
 
-  return(door1 | door2);
+  return (door1 | door2);
+}
+
+void DrawSpecialEditorDoor()
+{
+  /* draw bigger toolbox window */
+  XCopyArea(display, pix[PIX_DOOR], drawto, gc,
+           DOOR_GFX_PAGEX7, 60, 108, 56, EX - 4, EY - 12);
+
+  /* draw background for level selection gadgets */
+  XCopyArea(display, pix[PIX_DOOR], drawto, gc,
+           DOOR_GFX_PAGEX7, 0, 108, 60, EX - 4, 0);
+
+  redraw_mask |= REDRAW_ALL;
+}
+
+void UndrawSpecialEditorDoor()
+{
+  /* draw normal tape recorder window */
+  XCopyArea(display, pix[PIX_BACK], drawto, gc,
+           562, 344, 108, 56, EX - 4, EY - 12);
+
+  /* draw game title */
+  XCopyArea(display, pix[PIX_BACK], drawto, gc,
+           562, 0, 108, 60, EX - 4, 0);
+
+  redraw_mask |= REDRAW_ALL;
 }
 
 int ReadPixel(Drawable d, int x, int y)
 }
 
 int ReadPixel(Drawable d, int x, int y)
@@ -2188,6 +2224,11 @@ static struct
   }
 };
 
   }
 };
 
+static void DoNotDisplayInfoText(void *ptr)
+{
+  return;
+}
+
 void CreateToolButtons()
 {
   int i;
 void CreateToolButtons()
 {
   int i;
@@ -2235,6 +2276,7 @@ void CreateToolButtons()
                      GDI_DECORATION_SHIFTING, 1, 1,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_ACTION, HandleToolButtons,
                      GDI_DECORATION_SHIFTING, 1, 1,
                      GDI_EVENT_MASK, event_mask,
                      GDI_CALLBACK_ACTION, HandleToolButtons,
+                     GDI_CALLBACK_INFO, DoNotDisplayInfoText,
                      GDI_END);
 
     if (gi == NULL)
                      GDI_END);
 
     if (gi == NULL)
index 7878a28309a5feb492ced86e1c808e3e3368e914..9ec88df22fa971d6cea70d06cc3c13f1b08d8a8b 100644 (file)
@@ -105,6 +105,8 @@ unsigned int OpenDoor(unsigned int);
 unsigned int CloseDoor(unsigned int);
 unsigned int GetDoorState(void);
 unsigned int MoveDoor(unsigned int);
 unsigned int CloseDoor(unsigned int);
 unsigned int GetDoorState(void);
 unsigned int MoveDoor(unsigned int);
+void DrawSpecialEditorDoor();
+void UndrawSpecialEditorDoor();
 int ReadPixel(Drawable, int, int);
 
 void CreateToolButtons();
 int ReadPixel(Drawable, int, int);
 
 void CreateToolButtons();