rnd-20070321-1-src
[rocksndiamonds.git] / src / editor.c
index f16d5aa39f8755591ea1635e77f5a99f90bf3919..134a3fcb193323817d65f8a7d32595acfe0e62b2 100644 (file)
 
 /* values for elements with score for certain actions */
 #define MIN_SCORE                      0
-#define MAX_SCORE                      255
+#define MAX_SCORE                      999
 
 /* values for elements with count for collecting */
 #define MIN_COLLECT_COUNT              0
-#define MAX_COLLECT_COUNT              255
+#define MAX_COLLECT_COUNT              999
 
 /* values for random placement */
 #define RANDOM_USE_PERCENTAGE          0
@@ -1047,7 +1047,7 @@ static struct
   },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_LEVEL_TIMESCORE_DOWN,    GADGET_ID_LEVEL_TIMESCORE_UP,
     GADGET_ID_LEVEL_TIMESCORE_TEXT,    GADGET_ID_NONE,
     &level.score[SC_TIME_BONUS],
@@ -1173,7 +1173,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(7),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_PUSH_DELAY_FIX_DOWN,     GADGET_ID_PUSH_DELAY_FIX_UP,
     GADGET_ID_PUSH_DELAY_FIX_TEXT,     GADGET_ID_NONE,
     &custom_element.push_delay_fixed,
@@ -1181,7 +1181,7 @@ static struct
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(7),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_PUSH_DELAY_RND_DOWN,     GADGET_ID_PUSH_DELAY_RND_UP,
     GADGET_ID_PUSH_DELAY_RND_TEXT,     GADGET_ID_PUSH_DELAY_FIX_UP,
     &custom_element.push_delay_random,
@@ -1189,7 +1189,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(8),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_DROP_DELAY_FIX_DOWN,     GADGET_ID_DROP_DELAY_FIX_UP,
     GADGET_ID_DROP_DELAY_FIX_TEXT,     GADGET_ID_NONE,
     &custom_element.drop_delay_fixed,
@@ -1197,7 +1197,7 @@ static struct
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(8),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_DROP_DELAY_RND_DOWN,     GADGET_ID_DROP_DELAY_RND_UP,
     GADGET_ID_DROP_DELAY_RND_TEXT,     GADGET_ID_DROP_DELAY_FIX_UP,
     &custom_element.drop_delay_random,
@@ -1224,7 +1224,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(12),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_EXPLOSION_DELAY_DOWN,    GADGET_ID_EXPLOSION_DELAY_UP,
     GADGET_ID_EXPLOSION_DELAY_TEXT,    GADGET_ID_NONE,
     &custom_element.explosion_delay,
@@ -1232,7 +1232,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_IGNITION_DELAY_DOWN,     GADGET_ID_IGNITION_DELAY_UP,
     GADGET_ID_IGNITION_DELAY_TEXT,     GADGET_ID_NONE,
     &custom_element.ignition_delay,
@@ -7051,8 +7051,16 @@ void DrawLevelEd()
 #endif
   MapControlButtons();
 
+#if 1
+  FadeOut(REDRAW_FIELD);
+#endif
+
   DrawEditModeWindow();
 
+#if 1
+  FadeIn(REDRAW_FIELD);
+#endif
+
   /* copy actual editor door content to door double buffer for OpenDoor() */
   BlitBitmap(drawto, bitmap_db_door,
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
@@ -9091,6 +9099,26 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
     new_element = (nr == 0 ? EL_SP_HARDWARE_GREEN :
                   nr == 1 ? EL_SP_HARDWARE_BLUE : EL_SP_HARDWARE_RED);
   }
+  else if (IS_GROUP_ELEMENT(new_element))
+  {
+    boolean connected_drawing = FALSE;
+    int i;
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_IN_GROUP_EL(IntelliDrawBuffer[last_x][last_y], new_element))
+       connected_drawing = TRUE;
+    }
+
+    if (!connected_drawing)
+      ResolveGroupElement(new_element);
+
+    new_element = GetElementFromGroupElement(new_element);
+  }
   else if (IS_BELT_SWITCH(old_element))
   {
     int belt_nr = getBeltNrFromBeltSwitchElement(old_element);
@@ -9862,6 +9890,10 @@ static void RandomPlacement(int new_element)
   int num_percentage, num_elements;
   int x, y;
 
+#if 1
+  ResetIntelliDraw();
+#endif
+
   /* determine number of free positions for randomly placing the new element */
   for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++)
   {
@@ -9885,7 +9917,11 @@ static void RandomPlacement(int new_element)
     for (x = 0; x < lev_fieldx; x++)
       for (y = 0; y < lev_fieldy; y++)
        if (free_position[x][y])
+#if 1
+         SetElement(x, y, new_element);
+#else
          Feld[x][y] = new_element;
+#endif
   }
   else
   {
@@ -9898,7 +9934,11 @@ static void RandomPlacement(int new_element)
       if (free_position[x][y])
       {
        free_position[x][y] = FALSE;
+#if 1
+       SetElement(x, y, new_element);
+#else
        Feld[x][y] = new_element;
+#endif
        num_elements--;
       }
     }
@@ -10850,7 +10890,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_EXIT:
-      RequestExitLevelEditor(TRUE);    /* if level has changed, ask user */
+      RequestExitLevelEditor(TRUE, FALSE);  /* if level has changed, ask user */
       break;
 
     default:
@@ -11029,7 +11069,7 @@ void HandleLevelEditorKeyInput(Key key)
       case KSYM_Escape:
         if (edit_mode == ED_MODE_DRAWING)
        {
-         RequestExitLevelEditor(setup.ask_on_escape_editor);
+         RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE);
        }
         else if (edit_mode == ED_MODE_INFO)
        {
@@ -11300,7 +11340,8 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
     DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext);
 }
 
-void RequestExitLevelEditor(boolean ask_if_level_has_changed)
+void RequestExitLevelEditor(boolean ask_if_level_has_changed,
+                           boolean quick_quit)
 {
   if (!ask_if_level_has_changed ||
       !LevelChanged() ||
@@ -11309,8 +11350,21 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed)
   {
     CloseDoor(DOOR_CLOSE_1);
     SetDoorState(DOOR_CLOSE_2);
+
+#if 1
+    if (quick_quit)
+      FadeSkipNextFadeIn();
+#else
+    if (quick_quit)
+      fading = fading_none;
+#endif
+
     game_status = GAME_MODE_MAIN;
+#if 1
+    DrawAndFadeInMainMenu(REDRAW_FIELD);
+#else
     DrawMainMenu();
+#endif
   }
   else
   {