fixed element scores for MM style elements (MM engine)
[rocksndiamonds.git] / src / editor.c
index a7a5a3d9f17d65d6d7daf835e43ddb077266a31f..92b35d0f5f4f135fd8536dc2288bca9f7eb27a4e 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,
@@ -5659,7 +5659,7 @@ static void ReinitializeElementList()
 
 void PrintEditorElementList()
 {
-  boolean *stop = &setup.editor.el_user_defined;
+  boolean *stop = &setup_editor_el_user_defined;
   int i, j;
 
   for (i = 0; editor_elements_info[i].setup_value != stop; i++)
@@ -8148,8 +8148,16 @@ static int getMaxEdFieldY(boolean has_scrollbar)
   return max_ed_fieldy;
 }
 
-void InitZoomLevelSettings()
+void InitZoomLevelSettings(int zoom_tilesize)
 {
+  if (zoom_tilesize == -1)
+    zoom_tilesize = setup.auto_setup.editor_zoom_tilesize;
+
+  // limit zoom tilesize by upper and lower bound
+  zoom_tilesize = MIN(MAX(MICRO_TILESIZE, zoom_tilesize), TILESIZE);
+
+  ed_tilesize = setup.auto_setup.editor_zoom_tilesize = zoom_tilesize;
+
   MAX_ED_FIELDX = getMaxEdFieldX(FALSE);
   MAX_ED_FIELDY = getMaxEdFieldY(FALSE);
 }
@@ -8170,7 +8178,7 @@ void DrawLevelEd()
 
   ClearField();
 
-  InitZoomLevelSettings();
+  InitZoomLevelSettings(-1);
 
   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
 
@@ -9187,6 +9195,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 },
@@ -9237,6 +9254,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) ||
@@ -9450,7 +9468,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);
   }
@@ -9477,6 +9496,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;
@@ -11121,6 +11143,30 @@ static void ResetIntelliDraw()
   SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
 }
 
+static boolean draw_mode_hires = FALSE;
+
+static void SetDrawModeHiRes(int element)
+{
+  draw_mode_hires =
+    (level.game_engine_type == GAME_ENGINE_TYPE_MM &&
+     (IS_MM_WALL_EDITOR(element) || element == EL_EMPTY));
+}
+
+static boolean getDrawModeHiRes()
+{
+  return draw_mode_hires;
+}
+
+static int getLoResScreenPos(int pos)
+{
+  return (getDrawModeHiRes() ? pos / 2 : pos);
+}
+
+static int getLoResScreenMod(int pos)
+{
+  return (getDrawModeHiRes() ? pos % 2 : 0);
+}
+
 static void SetElementExt(int x, int y, int dx, int dy, int element,
                          boolean change_level, int button)
 {
@@ -11145,10 +11191,10 @@ static void SetElementButton(int x, int y, int dx, int dy, int element,
 
 static void SetElementHiRes(int sx2, int sy2, int element, boolean change_level)
 {
-  int lx = sx2 / 2 + level_xpos;
-  int ly = sy2 / 2 + level_ypos;
-  int dx = sx2 % 2;
-  int dy = sy2 % 2;
+  int lx = getLoResScreenPos(sx2) + level_xpos;
+  int ly = getLoResScreenPos(sy2) + level_ypos;
+  int dx = getLoResScreenMod(sx2);
+  int dy = getLoResScreenMod(sy2);
 
   SetElementExt(lx, ly, dx, dy, element, change_level, -1);
 }
@@ -11183,9 +11229,9 @@ static int getLevelElementHiRes(int lx2, int ly2)
   return element;
 }
 
-static void DrawLineElement(int sx2, int sy2, int element, boolean change_level)
+static void DrawLineElement(int x, int y, int element, boolean change_level)
 {
-  SetElementHiRes(sx2, sy2, element, change_level);
+  SetElementHiRes(x, y, element, change_level);
 }
 
 static void DrawLine(int from_x, int from_y, int to_x, int to_y,
@@ -11273,31 +11319,35 @@ static void DrawArcExt(int from_x, int from_y, int to_x2, int to_y2,
 
   for (x = 0; x <= radius; x++)
   {
-    int sx2, sy2, lx, ly;
+    int sx, sy, sx2, sy2, lx, ly;
 
     y = (int)(sqrt((float)(radius * radius - x * x)) + 0.5);
 
     sx2 = from_x + x * (from_x < to_x2 ? +1 : -1);
     sy2 = from_y + y * (from_y < to_y2 ? +1 : -1);
-    lx = sx2 / 2 + level_xpos;
-    ly = sy2 / 2 + level_ypos;
+    sx = getLoResScreenPos(sx2);
+    sy = getLoResScreenPos(sy2);
+    lx = sx + level_xpos;
+    ly = sy + level_ypos;
 
-    if (IN_ED_FIELD(sx2 / 2, sy2 / 2) && IN_LEV_FIELD(lx, ly))
+    if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly))
       DrawLineElement(sx2, sy2, element, change_level);
   }
 
   for (y = 0; y <= radius; y++)
   {
-    int sx2, sy2, lx, ly;
+    int sx, sy, sx2, sy2, lx, ly;
 
     x = (int)(sqrt((float)(radius * radius - y * y)) + 0.5);
 
     sx2 = from_x + x * (from_x < to_x2 ? +1 : -1);
     sy2 = from_y + y * (from_y < to_y2 ? +1 : -1);
-    lx = sx2 / 2 + level_xpos;
-    ly = sy2 / 2 + level_ypos;
+    sx = getLoResScreenPos(sx2);
+    sy = getLoResScreenPos(sy2);
+    lx = sx + level_xpos;
+    ly = sy + level_ypos;
 
-    if (IN_ED_FIELD(sx2 / 2, sy2 / 2) && IN_LEV_FIELD(lx, ly))
+    if (IN_ED_FIELD(sx, sy) && IN_LEV_FIELD(lx, ly))
       DrawLineElement(sx2, sy2, element, change_level);
   }
 }
@@ -11359,7 +11409,7 @@ static void DrawAreaBorder(int from_x, int from_y, int to_x, int to_y)
 static void DrawAreaBox(int from_x, int from_y, int to_x, int to_y,
                        int element, boolean change_level)
 {
-  DrawBox(from_x * 2, from_y * 2, to_x * 2, to_y * 2, element, change_level);
+  DrawBox(from_x, from_y, to_x, to_y, element, change_level);
 }
 
 static void SelectArea(int from_x, int from_y, int to_x, int to_y,
@@ -11381,7 +11431,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y,
 
 static void DrawBrushElement(int sx, int sy, int element, boolean change_level)
 {
-  DrawLineElement(sx * 2, sy * 2, element, change_level);
+  DrawLineElement(sx, sy, element, change_level);
 }
 
 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
@@ -11900,13 +11950,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   /* also correct MM wall-sized (double) drawing area positions accordingly */
   if (sx2 / 2 < sx || sx2 / 2 > sx)
   {
-    sx2 = sx * 2;
     dx = (sx2 / 2 < sx ? 0 : 1);
+    sx2 = sx * 2 + dx;
   }
   if (sy2 / 2 < sy || sy2 / 2 > sy)
   {
-    sy2 = sy * 2;
     dy = (sy2 / 2 < sy ? 0 : 1);
+    sy2 = sy * 2 + dy;
   }
 
   if (button_release_event)
@@ -11963,6 +12013,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
       ResetIntelliDraw();
   }
 
+  SetDrawModeHiRes(-1);                /* reset to normal draw mode */
+
   switch (actual_drawing_function)
   {
     case GADGET_ID_SINGLE_ITEMS:
@@ -12039,8 +12091,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
 
        if (button)
        {
-         sx = sx2;
-         sy = sy2;
+         SetDrawModeHiRes(new_element);
+
+         if (getDrawModeHiRes())
+         {
+           sx = sx2;
+           sy = sy2;
+         }
 
          if (!button_press_event)
            DrawLine(last_sx, last_sy, sx, sy, new_element, TRUE);
@@ -12055,8 +12112,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
     case GADGET_ID_ARC:
     case GADGET_ID_RECTANGLE:
     case GADGET_ID_FILLED_BOX:
-      sx = sx2;
-      sy = sy2;
+      SetDrawModeHiRes(new_element);
+
+      if (getDrawModeHiRes())
+      {
+       sx = sx2;
+       sy = sy2;
+      }
       /* FALLTHROUGH */
     case GADGET_ID_GRAB_BRUSH:
     case GADGET_ID_TEXT:
@@ -12841,7 +12903,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       // limit zoom level by upper and lower bound
       ed_tilesize = MIN(MAX(MICRO_TILESIZE, ed_tilesize), TILESIZE);
 
-      InitZoomLevelSettings();
+      InitZoomLevelSettings(ed_tilesize);
 
       if (edit_mode == ED_MODE_DRAWING)
       {
@@ -12851,6 +12913,9 @@ static void HandleControlButtons(struct GadgetInfo *gi)
        PrintEditorGadgetInfoText(level_editor_gadget[id]);
       }
 
+      /* save current editor zoom tilesize */
+      SaveSetup_AutoSetup();
+
       break;
 
     case GADGET_ID_CUSTOM_COPY_FROM: