static boolean setup_editor_cascade_never = FALSE;
+static boolean setup_editor_el_players = TRUE;
+static boolean setup_editor_el_boulderdash = TRUE;
+static boolean setup_editor_el_emerald_mine = TRUE;
+static boolean setup_editor_el_emerald_mine_club = TRUE;
+static boolean setup_editor_el_more = TRUE;
+static boolean setup_editor_el_sokoban = TRUE;
+static boolean setup_editor_el_supaplex = TRUE;
+static boolean setup_editor_el_diamond_caves = TRUE;
+static boolean setup_editor_el_dx_boulderdash = TRUE;
+static boolean setup_editor_el_mirror_magic = TRUE;
+static boolean setup_editor_el_deflektor = TRUE;
+static boolean setup_editor_el_chars = TRUE;
+static boolean setup_editor_el_steel_chars = TRUE;
+static boolean setup_editor_el_custom = TRUE;
+static boolean setup_editor_el_user_defined = TRUE;
+static boolean setup_editor_el_dynamic = TRUE;
+
static int editor_hl_unused[] = { EL_EMPTY };
static int *editor_hl_unused_ptr = editor_hl_unused;
static int num_editor_hl_unused = 0;
editor_elements_info[] =
{
{
- &setup.editor.el_classic,
+ &setup_editor_el_players,
&setup_editor_cascade_never,
&editor_hl_unused_ptr, &num_editor_hl_unused,
&editor_el_players_ptr, &num_editor_el_players
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_boulderdash,
&setup.editor_cascade.el_bd,
&editor_hl_boulderdash_ptr, &num_editor_hl_boulderdash,
&editor_el_boulderdash_ptr, &num_editor_el_boulderdash
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_emerald_mine,
&setup.editor_cascade.el_em,
&editor_hl_emerald_mine_ptr, &num_editor_hl_emerald_mine,
&editor_el_emerald_mine_ptr, &num_editor_el_emerald_mine
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_emerald_mine_club,
&setup.editor_cascade.el_emc,
&editor_hl_emerald_mine_club_ptr, &num_editor_hl_emerald_mine_club,
&editor_el_emerald_mine_club_ptr, &num_editor_el_emerald_mine_club
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_more,
&setup.editor_cascade.el_rnd,
&editor_hl_rnd_ptr, &num_editor_hl_rnd,
&editor_el_rnd_ptr, &num_editor_el_rnd
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_sokoban,
&setup.editor_cascade.el_sb,
&editor_hl_sokoban_ptr, &num_editor_hl_sokoban,
&editor_el_sokoban_ptr, &num_editor_el_sokoban
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_supaplex,
&setup.editor_cascade.el_sp,
&editor_hl_supaplex_ptr, &num_editor_hl_supaplex,
&editor_el_supaplex_ptr, &num_editor_el_supaplex
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_diamond_caves,
&setup.editor_cascade.el_dc,
&editor_hl_diamond_caves_ptr, &num_editor_hl_diamond_caves,
&editor_el_diamond_caves_ptr, &num_editor_el_diamond_caves
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_dx_boulderdash,
&setup.editor_cascade.el_dx,
&editor_hl_dx_boulderdash_ptr, &num_editor_hl_dx_boulderdash,
&editor_el_dx_boulderdash_ptr, &num_editor_el_dx_boulderdash
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_mirror_magic,
&setup.editor_cascade.el_mm,
&editor_hl_mirror_magic_ptr, &num_editor_hl_mirror_magic,
&editor_el_mirror_magic_ptr, &num_editor_el_mirror_magic
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_deflektor,
&setup.editor_cascade.el_df,
&editor_hl_deflektor_ptr, &num_editor_hl_deflektor,
&editor_el_deflektor_ptr, &num_editor_el_deflektor
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_chars,
&setup.editor_cascade.el_chars,
&editor_hl_chars_ptr, &num_editor_hl_chars,
&editor_el_chars_ptr, &num_editor_el_chars
},
{
- &setup.editor.el_classic,
+ &setup_editor_el_steel_chars,
&setup.editor_cascade.el_steel_chars,
&editor_hl_steel_chars_ptr, &num_editor_hl_steel_chars,
&editor_el_steel_chars_ptr, &num_editor_el_steel_chars
},
{
- &setup.editor.el_custom,
+ &setup_editor_el_custom,
&setup.editor_cascade.el_ce,
&editor_hl_custom_ptr, &num_editor_hl_custom,
&editor_el_custom_ptr, &num_editor_el_custom
},
{
- &setup.editor.el_custom,
+ &setup_editor_el_custom,
&setup.editor_cascade.el_ge,
&editor_hl_group_ptr, &num_editor_hl_group,
&editor_el_group_ptr, &num_editor_el_group
},
{
- &setup.editor.el_custom,
+ &setup_editor_el_custom,
&setup.editor_cascade.el_ref,
&editor_hl_reference_ptr, &num_editor_hl_reference,
&editor_el_reference_ptr, &num_editor_el_reference
},
{
- &setup.editor.el_user_defined,
+ &setup_editor_el_user_defined,
&setup.editor_cascade.el_user,
&editor_hl_user_defined_ptr, &num_editor_hl_user_defined,
&editor_el_user_defined_ptr, &num_editor_el_user_defined
},
{
- &setup.editor.el_dynamic,
+ &setup_editor_el_dynamic,
&setup.editor_cascade.el_dynamic,
&editor_hl_dynamic_ptr, &num_editor_hl_dynamic,
&editor_el_dynamic_ptr, &num_editor_el_dynamic,
(*elements)[(*num_elements)++] = EL_EMPTY;
}
+static void ReinitializeElementList_EnableSections()
+{
+ /* default: enable all element sections */
+
+ setup_editor_el_players = TRUE;
+ setup_editor_el_boulderdash = TRUE;
+ setup_editor_el_emerald_mine = TRUE;
+ setup_editor_el_emerald_mine_club = TRUE;
+ setup_editor_el_more = TRUE;
+ setup_editor_el_sokoban = TRUE;
+ setup_editor_el_supaplex = TRUE;
+ setup_editor_el_diamond_caves = TRUE;
+ setup_editor_el_dx_boulderdash = TRUE;
+ setup_editor_el_mirror_magic = TRUE;
+ setup_editor_el_deflektor = TRUE;
+ setup_editor_el_chars = TRUE;
+ setup_editor_el_steel_chars = TRUE;
+
+ setup_editor_el_custom = TRUE;
+ setup_editor_el_user_defined = TRUE;
+ setup_editor_el_dynamic = TRUE;
+
+ /* now disable all element sections not to be displayed */
+
+ if (!setup.editor.el_classic)
+ {
+ setup_editor_el_players = FALSE;
+ setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_emerald_mine = FALSE;
+ setup_editor_el_emerald_mine_club = FALSE;
+ 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;
+ setup_editor_el_chars = FALSE;
+ setup_editor_el_steel_chars = FALSE;
+ }
+
+ if (!setup.editor.el_custom)
+ {
+ setup_editor_el_custom = FALSE;
+ }
+
+ if (!setup.editor.el_user_defined)
+ {
+ setup_editor_el_user_defined = FALSE;
+ }
+
+ if (!setup.editor.el_dynamic)
+ {
+ setup_editor_el_dynamic = FALSE;
+ }
+
+ if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
+ {
+ setup_editor_el_mirror_magic = FALSE;
+ setup_editor_el_deflektor = FALSE;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ {
+ setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_more = FALSE;
+ setup_editor_el_sokoban = FALSE;
+ setup_editor_el_supaplex = FALSE;
+ setup_editor_el_dx_boulderdash = FALSE;
+ setup_editor_el_mirror_magic = FALSE;
+ setup_editor_el_deflektor = FALSE;
+ setup_editor_el_steel_chars = FALSE;
+
+ setup_editor_el_custom = FALSE;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ {
+ setup_editor_el_players = FALSE;
+ setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_emerald_mine = FALSE;
+ setup_editor_el_emerald_mine_club = FALSE;
+ setup_editor_el_more = FALSE;
+ setup_editor_el_sokoban = FALSE;
+ setup_editor_el_diamond_caves = FALSE;
+ setup_editor_el_dx_boulderdash = FALSE;
+ setup_editor_el_mirror_magic = FALSE;
+ setup_editor_el_deflektor = FALSE;
+ setup_editor_el_chars = FALSE;
+ setup_editor_el_steel_chars = FALSE;
+
+ setup_editor_el_custom = FALSE;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ {
+ setup_editor_el_players = FALSE;
+ setup_editor_el_boulderdash = FALSE;
+ setup_editor_el_emerald_mine = FALSE;
+ setup_editor_el_emerald_mine_club = FALSE;
+ 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_steel_chars = FALSE;
+
+ setup_editor_el_custom = FALSE;
+ }
+}
+
static void ReinitializeElementList()
{
static boolean initialization_needed = TRUE;
int pos = 0;
int i, j;
+ ReinitializeElementList_EnableSections();
+
if (initialization_needed)
{
LoadSetup_EditorCascade(); /* load last editor cascade state */
event_mask =
GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
- GD_EVENT_OFF_BORDERS;
+ GD_EVENT_OFF_BORDERS | GD_EVENT_PIXEL_PRECISE;
/* determine horizontal position to the right of specified gadget */
if (drawingarea_info[i].gadget_id_align != GADGET_ID_NONE)
return getChipFromOpenDirectionNotEmpty(direction_new, element_old);
}
-static void SetElementSimple(int x, int y, int element, boolean change_level)
+static void SetElementSimpleExt(int x, int y, int dx, int dy, int element,
+ boolean change_level)
{
int sx = x - level_xpos;
int sy = y - level_ypos;
+ int old_element = Feld[x][y];
+ unsigned int new_bitmask = (dx + 1) << (dy * 2);
+
+ if (IS_MM_WALL_EDITOR(element))
+ {
+ element = map_mm_wall_element_editor(element) | new_bitmask;
+
+ if (IS_MM_WALL(old_element))
+ element |= MM_WALL_BITS(old_element);
+ }
+ else if (IS_MM_WALL(old_element) && element == EL_EMPTY)
+ {
+ int element_changed = old_element & ~new_bitmask;
+
+ if (MM_WALL_BITS(element_changed) != 0)
+ element = element_changed;
+ }
IntelliDrawBuffer[x][y] = element;
DrawEditorElement(sx, sy, element);
}
+static void SetElementSimple(int x, int y, int element, boolean change_level)
+{
+ SetElementSimpleExt(x, y, 0, 0, element, change_level);
+}
+
static void MergeAndCloseNeighbourElements(int x1, int y1, int *element1,
int x2, int y2, int *element2,
int (*close_function)(int, int),
SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
}
-static void SetElementExt(int x, int y, int element, boolean change_level,
- int button)
+static void SetElementExt(int x, int y, int dx, int dy, int element,
+ boolean change_level, int button)
{
if (element < 0)
SetElementSimple(x, y, Feld[x][y], change_level);
else if (GetKeyModState() & KMOD_Shift)
SetElementIntelliDraw(x, y, element, change_level, button);
else
- SetElementSimple(x, y, element, change_level);
+ SetElementSimpleExt(x, y, dx, dy, element, change_level);
}
static void SetElement(int x, int y, int element)
{
- SetElementExt(x, y, element, TRUE, -1);
+ SetElementExt(x, y, 0, 0, element, TRUE, -1);
}
-static void SetElementButton(int x, int y, int element, int button)
+static void SetElementButton(int x, int y, int dx, int dy, int element,
+ int button)
{
- SetElementExt(x, y, element, TRUE, button);
+ SetElementExt(x, y, dx, dy, element, TRUE, button);
}
static void DrawLineElement(int sx, int sy, int element, boolean change_level)
int lx = sx + level_xpos;
int ly = sy + level_ypos;
- SetElementExt(lx, ly, element, change_level, -1);
+ SetElementExt(lx, ly, 0, 0, element, change_level, -1);
}
static void DrawLine(int from_x, int from_y, int to_x, int to_y,
static void HandleDrawingAreas(struct GadgetInfo *gi)
{
static boolean started_inside_drawing_area = FALSE;
+ static int last_sx = -1, last_sy = -1;
+ static int last_sx2 = -1, last_sy2 = -1;
int id = gi->custom_id;
int type_id = gi->custom_type_id;
boolean button_press_event;
int min_sx = 0, min_sy = 0;
int max_sx = gi->drawing.area_xsize - 1, max_sy = gi->drawing.area_ysize - 1;
int item_xsize = gi->drawing.item_xsize, item_ysize = gi->drawing.item_ysize;
+ int mini_item_xsize = item_xsize / 2, mini_item_ysize = item_ysize / 2;
+ int sx2 = gi->event.mx / mini_item_xsize;
+ int sy2 = gi->event.my / mini_item_ysize;
+ int dx = sx2 % 2;
+ int dy = sy2 % 2;
int lx = 0, ly = 0;
int min_lx = 0, min_ly = 0;
int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
int x, y;
- /* handle info callback for each invocation of action callback */
- gi->callback_info(gi);
-
button_press_event = (gi->event.type == GD_EVENT_PRESSED);
button_release_event = (gi->event.type == GD_EVENT_RELEASED);
+ if (button_release_event)
+ {
+ last_sx = -1;
+ last_sy = -1;
+ last_sx2 = -1;
+ last_sy2 = -1;
+ }
+ else if (!button_press_event)
+ {
+ if ((sx == last_sx && sy == last_sy &&
+ !IS_MM_WALL_EDITOR(new_element) && new_element != EL_EMPTY) ||
+ (sx2 == last_sx2 && sy2 == last_sy2))
+ return;
+ }
+
+ last_sx = sx;
+ last_sy = sy;
+ last_sx2 = sx2;
+ last_sy2 = sy2;
+
+ /* handle info callback for each invocation of action callback */
+ gi->callback_info(gi);
+
/* make sure to stay inside drawing area boundaries */
sx = (sx < min_sx ? min_sx : sx > max_sx ? max_sx : sx);
sy = (sy < min_sy ? min_sy : sy > max_sy ? max_sy : sy);
SetElement(x, y, EL_EMPTY);
}
- SetElementButton(lx, ly, new_element, button);
+ SetElementButton(lx, ly, dx, dy, new_element, button);
}
}
else if (!button_release_event)
level.changed = TRUE;
}
+ else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE)
+ {
+ /* update element selection list */
+ ReinitializeElementList();
+ ModifyEditorElementList();
+ }
}
static void HandleTextbuttonGadgets(struct GadgetInfo *gi)