fixed bug with showing DC2 game elements when using EM/EMC engine
[rocksndiamonds.git] / src / editor.c
index 504feba9855f18f5957ea3e2f92975ff3b5f902c..d3d6a322bf3002379badf956bddc03ba9b74452a 100644 (file)
 #define ED_NUM_SELECTBOX                       29
 
 #define ED_SELECTBOX_ID_LEVEL_FIRST    ED_SELECTBOX_ID_TIME_OR_STEPS
-#define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_WIND_DIRECTION
+#define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_GAME_ENGINE_TYPE
 
 #define ED_SELECTBOX_ID_CUSTOM1_FIRST  ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
 #define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION
@@ -1332,7 +1332,7 @@ static struct
     "score for each second/step left:",        NULL, NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(13),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
     0,                                 9999,
     GADGET_ID_LEVEL_RANDOM_SEED_DOWN,  GADGET_ID_LEVEL_RANDOM_SEED_UP,
     GADGET_ID_LEVEL_RANDOM_SEED_TEXT,  GADGET_ID_NONE,
@@ -2347,24 +2347,24 @@ static struct
     NULL, "(0 => no limit)",           "time or step limit"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
     GADGET_ID_GAME_ENGINE_TYPE,                GADGET_ID_NONE,
     -1,
     options_game_engine_type,
     &level.game_engine_type,
     "game engine:", NULL,              "game engine"
   },
+
+  /* ---------- element settings: configure (several elements) ------------- */
+
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_WIND_DIRECTION,          GADGET_ID_NONE,
     -1,
     options_wind_direction,
     &level.wind_direction_initial,
     "initial wind direction:", NULL,   "initial wind direction"
   },
-
-  /* ---------- element settings: configure (several elements) ------------- */
-
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
@@ -3658,6 +3658,7 @@ static void HandleControlButtons(struct GadgetInfo *);
 static void HandleDrawingAreaInfo(struct GadgetInfo *);
 static void PrintEditorGadgetInfoText(struct GadgetInfo *);
 static boolean AskToCopyAndModifyLevelTemplate();
+static boolean getDrawModeHiRes();
 
 static int num_editor_gadgets = 0;     /* dynamically determined */
 
@@ -5461,6 +5462,7 @@ static void ReinitializeElementList_EnableSections()
     setup_editor_el_more               = FALSE;
     setup_editor_el_sokoban            = FALSE;
     setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
     setup_editor_el_dx_boulderdash     = FALSE;
     setup_editor_el_mirror_magic       = FALSE;
     setup_editor_el_deflektor          = FALSE;
@@ -9114,6 +9116,10 @@ static void DrawPropertiesInfo()
 #define TEXT_CRACKING          "Score for cracking"
 #define TEXT_AMOEBA_SPEED      "Speed of amoeba growth"
 #define TEXT_DURATION          "Duration when activated"
+#define TEXT_DELAY_ON          "Delay before activating"
+#define TEXT_DELAY_OFF         "Delay before deactivating"
+#define TEXT_DELAY_EXPLODING   "Delay before exploding"
+#define TEXT_DELAY_MOVING      "Delay before moving"
 #define TEXT_BALL_DELAY                "Element generation delay"
 #define TEXT_MOVE_SPEED                "Speed of android moving"
 #define TEXT_CLONE_SPEED       "Speed of android cloning"
@@ -9195,6 +9201,15 @@ static struct
   { 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_MM_KETTLE,      &level.score[SC_EMERALD],       TEXT_COLLECTING },
+  { EL_DF_CELL,                &level.score[SC_EMERALD],       TEXT_COLLECTING },
+  { EL_MM_KEY,         &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_MM_LIGHTBALL,   &level.score[SC_ELEM_BONUS],    TEXT_COLLECTING },
+  { EL_MM_PACMAN,      &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_RIGHT,        &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_UP,   &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN],        TEXT_SMASHING   },
+  { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN],        TEXT_SMASHING   },
   { 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 },
@@ -9230,10 +9245,11 @@ static struct
   { EL_SPRING,         &level.slurp_score,             TEXT_SLURPING   },
   { EL_EMC_LENSES,     &level.lenses_time,             TEXT_DURATION   },
   { EL_EMC_MAGNIFIER,  &level.magnify_time,            TEXT_DURATION   },
-#if 0
-  /* defined, but currently not used in MM engine */
-  { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse,            TEXT_DURATION   },
-#endif
+  { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse,            TEXT_DELAY_OFF  },
+  { EL_MM_BOMB,                &level.mm_time_bomb,            TEXT_DELAY_EXPLODING },
+  { EL_MM_GRAY_BALL,   &level.mm_time_ball,            TEXT_DELAY_ON   },
+  { EL_MM_STEEL_BLOCK, &level.mm_time_block,           TEXT_DELAY_MOVING },
+  { EL_MM_WOODEN_BLOCK,        &level.mm_time_block,           TEXT_DELAY_MOVING },
 
   { -1,                        NULL,                           NULL            }
 };
@@ -9245,6 +9261,7 @@ static boolean checkPropertiesConfig(int element)
   if (IS_GEM(element) ||
       IS_CUSTOM_ELEMENT(element) ||
       IS_GROUP_ELEMENT(element) ||
+      IS_BALLOON_ELEMENT(element) ||
       IS_ENVELOPE(element) ||
       IS_MM_MCDUFFIN(element) ||
       IS_DF_LASER(element) ||
@@ -9458,7 +9475,8 @@ static void DrawPropertiesConfig()
       ED_ELEMENT_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0);
     checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
       ED_ELEMENT_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
-                      HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
+                              IS_BALLOON_ELEMENT(properties_element) ||
+                              HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
   }
@@ -9485,6 +9503,9 @@ static void DrawPropertiesConfig()
       properties_element == EL_SOKOBAN_FIELD_FULL)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN);
 
+  if (IS_BALLOON_ELEMENT(properties_element))
+    MapSelectboxGadget(ED_SELECTBOX_ID_WIND_DIRECTION);
+
   if (IS_ENVELOPE(properties_element))
   {
     int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
@@ -10277,7 +10298,8 @@ static void SetElementSimpleExt(int x, int y, int dx, int dy, int element,
   int sx = x - level_xpos;
   int sy = y - level_ypos;
   int old_element = Feld[x][y];
-  unsigned int new_bitmask = (dx + 1) << (dy * 2);
+  int new_element = element;
+  unsigned int new_bitmask = (getDrawModeHiRes() ? (dx + 1) << (dy * 2) : 0x0f);
   boolean draw_masked = FALSE;
 
   if (IS_MM_WALL_EDITOR(element))
@@ -10305,7 +10327,9 @@ static void SetElementSimpleExt(int x, int y, int dx, int dy, int element,
 
   if (IN_ED_FIELD(sx, sy))
   {
-    if (draw_masked)
+    if (IS_MM_WALL(old_element) && new_element == EL_EMPTY)
+      DrawSizedWallParts_MM(sx, sy, EL_EMPTY, ed_tilesize, FALSE, new_bitmask);
+    else if (draw_masked)
       DrawEditorElementThruMask(sx, sy, element);
     else
       DrawEditorElement(sx, sy, element);
@@ -12024,6 +12048,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
        }
        else
        {
+         SetDrawModeHiRes(new_element);
+
          if (new_element == EL_PLAYER_1)
          {
            /* remove player at old position */
@@ -12198,6 +12224,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   /* do not mark level as modified for certain non-level-changing gadgets */
   if ((type_id >= ED_DRAWING_ID_EDITOR_FIRST &&
        type_id <= ED_DRAWING_ID_EDITOR_LAST) ||
+      actual_drawing_function == GADGET_ID_GRAB_BRUSH ||
       actual_drawing_function == GADGET_ID_PICK_ELEMENT)
     return;
 
@@ -12374,8 +12401,6 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     }
 
     CopyElementPropertiesToGame(properties_element);
-
-    level.changed = TRUE;
   }
   else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE)
   {
@@ -12383,6 +12408,12 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     ReinitializeElementList();
     ModifyEditorElementList();
   }
+
+  /* do not mark level as modified for certain non-level-changing gadgets */
+  if (type_id == ED_SELECTBOX_ID_SELECT_CHANGE_PAGE)
+    return;
+
+  level.changed = TRUE;
 }
 
 static void HandleTextbuttonGadgets(struct GadgetInfo *gi)