rnd-20080126-1-src
[rocksndiamonds.git] / src / editor.c
index 081dc373c0c6145855fb277046a4e3c190bc5d74..bcb76d4f96acfa6089f6b04445fcd0bf9a8f5fc1 100644 (file)
@@ -1515,6 +1515,7 @@ static struct ValueTextInfo options_deadliness[] =
 {
   { EP_DONT_RUN_INTO,          "running into"                  },
   { EP_DONT_COLLIDE_WITH,      "colliding with"                },
+  { EP_DONT_GET_HIT_BY,                "getting hit by"                },
   { EP_DONT_TOUCH,             "touching"                      },
 
   { -1,                                NULL                            }
@@ -3092,7 +3093,7 @@ static struct
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(5),
     GADGET_ID_CUSTOM_CHANGE_TRIGGER,   GADGET_ID_CHANGE_OTHER_ACTION,
-    &custom_element_change.trigger_element, 1, 1,
+    &custom_element_change.initial_trigger_element, 1, 1,
     NULL, NULL, NULL,                  "other element triggering change"
   },
 
@@ -3311,6 +3312,11 @@ static int editor_el_emerald_mine[] =
   EL_EM_GATE_2_GRAY,
   EL_EM_GATE_3_GRAY,
   EL_EM_GATE_4_GRAY,
+
+  EL_EM_EXIT_CLOSED,
+  EL_EM_EXIT_OPEN,
+  EL_EM_STEEL_EXIT_CLOSED,
+  EL_EM_STEEL_EXIT_OPEN,
 };
 static int *editor_hl_emerald_mine_ptr = editor_hl_emerald_mine;
 static int *editor_el_emerald_mine_ptr = editor_el_emerald_mine;
@@ -3642,25 +3648,25 @@ static int editor_el_diamond_caves[] =
   EL_SWITCHGATE_SWITCH_UP,
   EL_SWITCHGATE_SWITCH_DOWN,
 
-  EL_EMPTY,
-  EL_EMPTY,
-  EL_DC_SWITCHGATE_SWITCH_UP,
-  EL_DC_SWITCHGATE_SWITCH_DOWN,
-
-  EL_SIGN_EXCLAMATION,
-  EL_SIGN_STOP,
   EL_LIGHT_SWITCH,
   EL_LIGHT_SWITCH_ACTIVE,
+  EL_DC_SWITCHGATE_SWITCH_UP,
+  EL_DC_SWITCHGATE_SWITCH_DOWN,
 
+  EL_STEEL_EXIT_CLOSED,
+  EL_STEEL_EXIT_OPEN,
   EL_STEELWALL_SLIPPERY,
   EL_INVISIBLE_SAND,
+
+  EL_QUICKSAND_FAST_EMPTY,
+  EL_QUICKSAND_FAST_FULL,
   EL_LANDMINE,
   EL_DC_LANDMINE,
 
   EL_SHIELD_NORMAL,
   EL_SHIELD_DEADLY,
   EL_EXTRA_TIME,
-  EL_EMPTY,
+  EL_DC_MAGIC_WALL,
 
   EL_ENVELOPE_1,
   EL_ENVELOPE_2,
@@ -3677,6 +3683,7 @@ static int editor_el_diamond_caves[] =
   EL_SIGN_EMERGENCY_EXIT,
   EL_SIGN_YIN_YANG,
 
+#if 0
   EL_SIGN_SPERMS,
   EL_SIGN_BULLET,
   EL_SIGN_HEART,
@@ -3696,11 +3703,12 @@ static int editor_el_diamond_caves[] =
   EL_EMPTY,
   EL_EMPTY,
   EL_EMPTY,
+#endif
 
   EL_DC_STEELWALL_2_SINGLE,
   EL_DC_STEELWALL_2_TOP,
-  EL_STEEL_EXIT_CLOSED,
-  EL_STEEL_EXIT_OPEN,
+  EL_SIGN_EXCLAMATION,
+  EL_SIGN_STOP,
 
   EL_DC_STEELWALL_2_LEFT,
   EL_DC_STEELWALL_2_MIDDLE,
@@ -3710,52 +3718,32 @@ static int editor_el_diamond_caves[] =
   EL_DC_STEELWALL_1_TOPLEFT,
   EL_DC_STEELWALL_2_VERTICAL,
   EL_DC_STEELWALL_1_TOPRIGHT,
-  EL_EMPTY,
+  EL_DC_GATE_WHITE,
 
   EL_DC_STEELWALL_1_VERTICAL,
   EL_DC_STEELWALL_2_BOTTOM,
-  EL_EMPTY,
-  EL_EMPTY,
+  EL_DC_KEY_WHITE,
+  EL_DC_GATE_WHITE_GRAY,
 
   EL_DC_STEELWALL_1_BOTTOMLEFT,
   EL_DC_STEELWALL_1_HORIZONTAL,
   EL_DC_STEELWALL_1_BOTTOMRIGHT,
-  EL_EMPTY,
+  EL_DC_GATE_FAKE_GRAY,
 
   EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
   EL_DC_STEELWALL_1_BOTTOM,
   EL_DC_STEELWALL_1_BOTTOMLEFT_2,
-  EL_EMPTY,
+  EL_EXPANDABLE_STEELWALL_HORIZONTAL,
 
   EL_DC_STEELWALL_1_RIGHT,
   EL_EMPTY,
   EL_DC_STEELWALL_1_LEFT,
-  EL_EMPTY,
+  EL_EXPANDABLE_STEELWALL_VERTICAL,
 
   EL_DC_STEELWALL_1_TOPRIGHT_2,
   EL_DC_STEELWALL_1_TOP,
   EL_DC_STEELWALL_1_TOPLEFT_2,
-  EL_EMPTY,
-
-  EL_EXPANDABLE_STEELWALL_HORIZONTAL,
-  EL_EXPANDABLE_STEELWALL_VERTICAL,
   EL_EXPANDABLE_STEELWALL_ANY,
-  EL_EMPTY,
-
-  EL_EM_EXIT_CLOSED,
-  EL_EM_EXIT_OPEN,
-  EL_EM_STEEL_EXIT_CLOSED,
-  EL_EM_STEEL_EXIT_OPEN,
-
-  EL_DC_KEY_WHITE,
-  EL_DC_GATE_WHITE,
-  EL_DC_GATE_WHITE_GRAY,
-  EL_DC_GATE_FAKE_GRAY,
-
-  EL_DC_MAGIC_WALL,
-  EL_QUICKSAND_FAST_EMPTY,
-  EL_QUICKSAND_FAST_FULL,
-  EL_EMPTY,
 };
 static int *editor_hl_diamond_caves_ptr = editor_hl_diamond_caves;
 static int *editor_el_diamond_caves_ptr = editor_el_diamond_caves;
@@ -5001,10 +4989,38 @@ static void DrawDrawingArea(int id)
 
 static void ScrollMiniLevel(int from_x, int from_y, int scroll)
 {
-  int x,y;
+#if 0
+  /* (directly solved in BlitBitmap() now) */
+  static Bitmap *tmp_backbuffer = NULL;
+#endif
+  int x, y;
   int dx = (scroll == ED_SCROLL_LEFT ? -1 : scroll == ED_SCROLL_RIGHT ? 1 : 0);
   int dy = (scroll == ED_SCROLL_UP   ? -1 : scroll == ED_SCROLL_DOWN  ? 1 : 0);
 
+#if 0
+  /* (directly solved in BlitBitmap() now) */
+  if (tmp_backbuffer == NULL)
+    tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
+
+  /* needed when blitting directly to same bitmap -- should not be needed with
+     recent SDL libraries, but apparently does not work in 1.2.11 directly */
+  BlitBitmap(drawto, tmp_backbuffer,
+            SX + (dx == -1 ? MINI_TILEX : 0),
+            SY + (dy == -1 ? MINI_TILEY : 0),
+            (ed_fieldx * MINI_TILEX) - (dx != 0 ? MINI_TILEX : 0),
+            (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0),
+            SX + (dx == +1 ? MINI_TILEX : 0),
+            SY + (dy == +1 ? MINI_TILEY : 0));
+  BlitBitmap(tmp_backbuffer, drawto,
+            SX + (dx == +1 ? MINI_TILEX : 0),
+            SY + (dy == +1 ? MINI_TILEY : 0),
+            (ed_fieldx * MINI_TILEX) - (dx != 0 ? MINI_TILEX : 0),
+            (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0),
+            SX + (dx == +1 ? MINI_TILEX : 0),
+            SY + (dy == +1 ? MINI_TILEY : 0));
+
+#else
+
   BlitBitmap(drawto, drawto,
             SX + (dx == -1 ? MINI_TILEX : 0),
             SY + (dy == -1 ? MINI_TILEY : 0),
@@ -5012,6 +5028,8 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll)
             (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0),
             SX + (dx == +1 ? MINI_TILEX : 0),
             SY + (dy == +1 ? MINI_TILEY : 0));
+#endif
+
   if (dx)
   {
     x = (dx == 1 ? 0 : ed_fieldx - 1);
@@ -6575,8 +6593,8 @@ static void replace_custom_element_in_settings(int element_from,
       if (change->target_element == element_from)
        change->target_element = element_to;
 
-      if (change->trigger_element == element_from)
-       change->trigger_element = element_to;
+      if (change->initial_trigger_element == element_from)
+       change->initial_trigger_element = element_to;
 
       for (y = 0; y < 3; y++)
        for (x = 0; x < 3; x++)
@@ -6752,11 +6770,13 @@ static void CopyCustomElementPropertiesToEditor(int element)
   /* set deadliness selectbox help value */
   custom_element.deadliness =
     (DONT_TOUCH(element) ? EP_DONT_TOUCH :
+     DONT_GET_HIT_BY(element) ? EP_DONT_GET_HIT_BY :
      DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH :
      DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO :
      custom_element.deadliness);
   custom_element_properties[EP_DEADLY] =
     (DONT_TOUCH(element) ||
+     DONT_GET_HIT_BY(element) ||
      DONT_COLLIDE_WITH(element) ||
      DONT_RUN_INTO(element));
 
@@ -6904,6 +6924,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   /* set deadliness property from checkbox and selectbox */
   custom_element_properties[EP_DONT_RUN_INTO] = FALSE;
   custom_element_properties[EP_DONT_COLLIDE_WITH] = FALSE;
+  custom_element_properties[EP_DONT_GET_HIT_BY] = FALSE;
   custom_element_properties[EP_DONT_TOUCH] = FALSE;
   custom_element_properties[custom_element.deadliness] =
     custom_element_properties[EP_DEADLY];
@@ -7013,6 +7034,11 @@ void CheckElementDescriptions()
 void DrawLevelEd()
 {
   CloseDoor(DOOR_CLOSE_ALL);
+
+#if 1
+  FadeOut(REDRAW_FIELD);
+#endif
+
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
 
 #if DEBUG
@@ -7060,7 +7086,7 @@ void DrawLevelEd()
 #endif
   MapControlButtons();
 
-#if 1
+#if 0
   FadeOut(REDRAW_FIELD);
 #endif
 
@@ -7074,6 +7100,12 @@ void DrawLevelEd()
   BlitBitmap(drawto, bitmap_db_door,
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
+#if 1
+  /* draw new control window (with border) to window */
+  redraw_mask |= REDRAW_ALL;
+  BackToFront();
+#endif
+
   OpenDoor(DOOR_OPEN_1);
 }
 
@@ -7326,7 +7358,7 @@ static void DrawDrawingWindow()
   stick_element_properties_window = FALSE;
 
   SetMainBackgroundImage(IMG_UNDEFINED);
-  ClearWindow();
+  ClearField();
 
   UnmapLevelEditorWindowGadgets();
   UnmapLevelEditorToolboxCustomGadgets();
@@ -7349,7 +7381,7 @@ static void DrawLevelInfoWindow()
   stick_element_properties_window = FALSE;
 
   SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
-  ClearWindow();
+  ClearField();
   UnmapLevelEditorWindowGadgets();
 
 #if 0
@@ -7684,6 +7716,7 @@ static void DrawPropertiesInfo()
 
     { EP_DONT_RUN_INTO,                "- deadly when running into"            },
     { EP_DONT_COLLIDE_WITH,    "- deadly when colliding with"          },
+    { EP_DONT_GET_HIT_BY,      "- deadly when getting hit by"          },
     { EP_DONT_TOUCH,           "- deadly when touching"                },
 
     { EP_INDESTRUCTIBLE,       "- indestructible"                      },
@@ -7857,6 +7890,7 @@ static struct
   { EL_EMC_KEY_6,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EMC_KEY_7,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EMC_KEY_8,      &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_DC_KEY_WHITE,   &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_AMOEBA_WET,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_AMOEBA_DRY,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_AMOEBA_FULL,    &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
@@ -8319,7 +8353,7 @@ static void DrawPropertiesWindow()
     MapLevelEditorToolboxCustomGadgets();
 
   SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
-  ClearWindow();
+  ClearField();
 
 #if 0
   DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
@@ -10302,7 +10336,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
   if (counter_id == ED_COUNTER_ID_SELECT_LEVEL)
   {
       LoadLevel(level_nr);
+      LoadScore(level_nr);
+
       TapeErase();
+
       ResetUndoBuffer();
       DrawEditModeWindow();