#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
"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,
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,
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++)
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);
}
ClearField();
- InitZoomLevelSettings();
+ InitZoomLevelSettings(-1);
OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
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) ||
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);
}
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;
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)
{
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);
}
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,
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);
}
}
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,
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,
/* 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)
ResetIntelliDraw();
}
+ SetDrawModeHiRes(-1); /* reset to normal draw mode */
+
switch (actual_drawing_function)
{
case GADGET_ID_SINGLE_ITEMS:
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);
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:
// 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)
{
PrintEditorGadgetInfoText(level_editor_gadget[id]);
}
+ /* save current editor zoom tilesize */
+ SaveSetup_AutoSetup();
+
break;
case GADGET_ID_CUSTOM_COPY_FROM: