X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=ac2bb22020495f36f4cd2d40783eaf2e3ee05867;hb=bddf6c22480ed7f7fca83b7d6c4f9dc10d19f57a;hp=c01689237136127918ef39267e0e587b895e1c9f;hpb=34b1ec9d816877389df293fb4f9ec10cc2a43729;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index c0168923..ac2bb220 100644 --- a/src/editor.c +++ b/src/editor.c @@ -1794,6 +1794,7 @@ static struct ValueTextInfo options_time_score_base[] = static struct ValueTextInfo options_game_engine_type[] = { { GAME_ENGINE_TYPE_RND, "Rocks'n'Diamonds" }, + { GAME_ENGINE_TYPE_BD, "Boulder Dash" }, { GAME_ENGINE_TYPE_EM, "Emerald Mine" }, { GAME_ENGINE_TYPE_SP, "Supaplex" }, { GAME_ENGINE_TYPE_MM, "Mirror Magic" }, @@ -2465,6 +2466,7 @@ static struct ValueTextInfo options_group_choice_mode[] = { ANIM_LINEAR, "linear" }, { ANIM_PINGPONG, "pingpong" }, { ANIM_PINGPONG2, "pingpong 2" }, + { ANIM_LEVEL_NR, "level number" }, { -1, NULL } }; @@ -4048,6 +4050,206 @@ static int *editor_el_boulderdash_ptr = editor_el_boulderdash; static int num_editor_hl_boulderdash = ARRAY_SIZE(editor_hl_boulderdash); static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash); +static int editor_hl_boulderdash_native[] = +{ + EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE, + EL_CHAR('B'), + EL_CHAR('D'), + EL_EMPTY, +}; + +static int editor_el_boulderdash_native[] = +{ + EL_EMPTY, + EL_BD_SAND, + EL_BD_ROCK, + EL_BD_DIAMOND, + + EL_BD_STEELWALL, + EL_BD_WALL, + EL_EMPTY, + EL_BD_MAGIC_WALL, + + EL_BD_AMOEBA, + EL_BD_BUTTERFLY_UP, + EL_BD_FIREFLY_UP, + EL_EXIT_CLOSED, + + EL_BD_BUTTERFLY_LEFT, + EL_BD_FIREFLY_LEFT, + EL_BD_BUTTERFLY_RIGHT, + EL_BD_FIREFLY_RIGHT, + + EL_BD_INBOX, + EL_BD_BUTTERFLY_DOWN, + EL_BD_FIREFLY_DOWN, + EL_EXIT_OPEN, + + EL_BD_AMOEBA_2, + EL_BD_BUTTERFLY_2_UP, + EL_BD_FIREFLY_2_UP, + EL_EMPTY, + + EL_BD_BUTTERFLY_2_LEFT, + EL_BD_FIREFLY_2_LEFT, + EL_BD_BUTTERFLY_2_RIGHT, + EL_BD_FIREFLY_2_RIGHT, + + EL_EMPTY, + EL_BD_BUTTERFLY_2_DOWN, + EL_BD_FIREFLY_2_DOWN, + EL_EMPTY, + + EL_EMPTY, + EL_BD_DRAGONFLY_UP, + EL_BD_STONEFLY_UP, + EL_EMPTY, + + EL_BD_DRAGONFLY_LEFT, + EL_BD_STONEFLY_LEFT, + EL_BD_DRAGONFLY_RIGHT, + EL_BD_STONEFLY_RIGHT, + + EL_EMPTY, + EL_BD_DRAGONFLY_DOWN, + EL_BD_STONEFLY_DOWN, + EL_EMPTY, + + EL_EMPTY, + EL_BD_BITER_UP, + EL_BD_COW_UP, + EL_EMPTY, + + EL_BD_BITER_LEFT, + EL_BD_COW_LEFT, + EL_BD_BITER_RIGHT, + EL_BD_COW_RIGHT, + + EL_EMPTY, + EL_BD_BITER_DOWN, + EL_BD_COW_DOWN, + EL_EMPTY, + + EL_EMPTY, + EL_BD_SAND, + EL_BD_SAND_BALL, + EL_BD_SAND_LOOSE, + + EL_BD_SAND_SLOPED_UP_LEFT, + EL_BD_SAND_SLOPED_UP_RIGHT, + EL_BD_WALL_SLOPED_UP_LEFT, + EL_BD_WALL_SLOPED_UP_RIGHT, + + EL_BD_SAND_SLOPED_DOWN_LEFT, + EL_BD_SAND_SLOPED_DOWN_RIGHT, + EL_BD_WALL_SLOPED_DOWN_LEFT, + EL_BD_WALL_SLOPED_DOWN_RIGHT, + + EL_BD_FLYING_DIAMOND, + EL_BD_FLYING_ROCK, + EL_BD_STEELWALL_SLOPED_UP_LEFT, + EL_BD_STEELWALL_SLOPED_UP_RIGHT, + + EL_BD_NUT, + EL_BD_MEGA_ROCK, + EL_BD_STEELWALL_SLOPED_DOWN_LEFT, + EL_BD_STEELWALL_SLOPED_DOWN_RIGHT, + + EL_BD_SAND_2, + EL_BD_WALL_NON_SLOPED, + EL_BD_WALL, + EL_BD_MAGIC_WALL, + + EL_BD_EXIT_CLOSED, + EL_BD_EXIT_OPEN, + EL_BD_INVISIBLE_EXIT_CLOSED, + EL_BD_INVISIBLE_EXIT_OPEN, + + EL_BD_STEELWALL, + EL_BD_STEELWALL_EXPLODABLE, + EL_BD_STEELWALL_DIGGABLE, + EL_BD_WALL_DIGGABLE, + + EL_BD_EXPANDABLE_WALL_HORIZONTAL, + EL_BD_EXPANDABLE_WALL_VERTICAL, + EL_BD_EXPANDABLE_WALL_ANY, + EL_BD_CREATURE_SWITCH, + + EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL, + EL_BD_EXPANDABLE_STEELWALL_VERTICAL, + EL_BD_EXPANDABLE_STEELWALL_ANY, + EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL, + + EL_BD_BITER_SWITCH_1, + EL_BD_REPLICATOR_SWITCH, + EL_BD_CONVEYOR_SWITCH, + EL_BD_CONVEYOR_DIR_SWITCH_RIGHT, + + EL_BD_ACID, + EL_BD_FALLING_WALL, + EL_BD_BOX, + EL_BD_TIME_PENALTY, + + EL_BD_GRAVESTONE, + EL_BD_ROCK_GLUED, + EL_BD_DIAMOND_GLUED, + EL_BD_DIAMOND_KEY, + + EL_BD_TRAPPED_DIAMOND, + EL_BD_CLOCK, + EL_BD_SAND_GLUED, + EL_BD_WATER, + + EL_BD_KEY_1, + EL_BD_KEY_2, + EL_BD_KEY_3, + EL_EMPTY, + + EL_BD_WALL_KEY_1, + EL_BD_WALL_KEY_2, + EL_BD_WALL_KEY_3, + EL_BD_WALL_DIAMOND, + + EL_BD_GATE_1, + EL_BD_GATE_2, + EL_BD_GATE_3, + EL_BD_POT, + + EL_BD_GRAVITY_SWITCH, + EL_BD_PNEUMATIC_HAMMER, + EL_BD_TELEPORTER, + EL_BD_SKELETON, + + EL_BD_AMOEBA, + EL_BD_AMOEBA_2, + EL_BD_REPLICATOR, + EL_BD_BLADDER_SPENDER, + + EL_BD_CONVEYOR_LEFT, + EL_BD_CONVEYOR_RIGHT, + EL_BD_BOMB, + EL_BD_NITRO_PACK, + + EL_BD_LAVA, + EL_BD_SWEET, + EL_BD_VOODOO_DOLL, + EL_BD_SLIME, + + EL_BD_BLADDER, + EL_BD_WAITING_ROCK, + EL_BD_CHASING_ROCK, + EL_BD_GHOST, + + EL_BD_PLAYER, + EL_BD_PLAYER_WITH_BOMB, + EL_BD_PLAYER_GLUED, + EL_BD_PLAYER_STIRRING, +}; +static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native; +static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native; +static int num_editor_hl_boulderdash_native = ARRAY_SIZE(editor_hl_boulderdash_native); +static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_native); + static int editor_hl_emerald_mine[] = { EL_INTERNAL_CASCADE_EM_ACTIVE, @@ -4713,7 +4915,12 @@ static int editor_el_deflektor[] = EL_DF_STEEL_WALL, EL_DF_WOODEN_WALL, EL_DF_REFRACTOR, - EL_DF_MINE + EL_DF_MINE, + + EL_DF_SLOPE_1, + EL_DF_SLOPE_2, + EL_DF_SLOPE_3, + EL_DF_SLOPE_4 }; static int *editor_hl_deflektor_ptr = editor_hl_deflektor; static int *editor_el_deflektor_ptr = editor_el_deflektor; @@ -5453,6 +5660,7 @@ 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_boulderdash_native = 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; @@ -5499,6 +5707,12 @@ editor_elements_info[] = &editor_hl_boulderdash_ptr, &num_editor_hl_boulderdash, &editor_el_boulderdash_ptr, &num_editor_el_boulderdash }, + { + &setup_editor_el_boulderdash_native, + &setup.editor_cascade.el_bd_native, + &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native, + &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native + }, { &setup_editor_el_emerald_mine, &setup.editor_cascade.el_em, @@ -5798,6 +6012,7 @@ static void ReinitializeElementList_EnableSections(void) setup_editor_el_players = TRUE; setup_editor_el_boulderdash = TRUE; + setup_editor_el_boulderdash_native = TRUE; setup_editor_el_emerald_mine = TRUE; setup_editor_el_emerald_mine_club = TRUE; setup_editor_el_more = TRUE; @@ -5820,6 +6035,7 @@ static void ReinitializeElementList_EnableSections(void) { setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; + setup_editor_el_boulderdash_native = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; setup_editor_el_more = FALSE; @@ -5850,12 +6066,32 @@ static void ReinitializeElementList_EnableSections(void) if (level.game_engine_type == GAME_ENGINE_TYPE_RND) { + setup_editor_el_boulderdash_native = FALSE; + setup_editor_el_mirror_magic = FALSE; + setup_editor_el_deflektor = FALSE; + } + else if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + { + 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; + + setup_editor_el_custom = FALSE; } else if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { setup_editor_el_boulderdash = FALSE; + setup_editor_el_boulderdash_native = FALSE; setup_editor_el_more = FALSE; setup_editor_el_sokoban = FALSE; setup_editor_el_supaplex = FALSE; @@ -5871,6 +6107,7 @@ static void ReinitializeElementList_EnableSections(void) { setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; + setup_editor_el_boulderdash_native = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; setup_editor_el_more = FALSE; @@ -5888,6 +6125,7 @@ static void ReinitializeElementList_EnableSections(void) { setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; + setup_editor_el_boulderdash_native = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; setup_editor_el_more = FALSE; @@ -7619,7 +7857,7 @@ static void MapGraphicbuttonGadget(int id) { int font_nr = FONT_TEXT_1; int font_height = getFontHeight(font_nr); - struct GadgetInfo *gi= level_editor_gadget[graphicbutton_info[id].gadget_id]; + struct GadgetInfo *gi = level_editor_gadget[graphicbutton_info[id].gadget_id]; int xoffset_left = getTextWidthForGadget(graphicbutton_info[id].text_left); int xoffset_right = ED_GADGET_TEXT_DISTANCE; int yoffset = (gi->height - font_height) / 2; @@ -8702,7 +8940,13 @@ static void InitDrawingElements(void) if (level.game_engine_type == game_engine_type_last) return; - if (level.game_engine_type == GAME_ENGINE_TYPE_SP) + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + { + new_element1 = EL_BD_WALL; + new_element2 = EL_EMPTY; + new_element3 = EL_BD_SAND; + } + else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) { new_element1 = EL_SP_CHIP_SINGLE; new_element2 = EL_EMPTY; @@ -8912,8 +9156,8 @@ static void AdjustDrawingAreaGadgets(void) if (suppressBorderElement()) { - ed_xsize = max_ed_fieldx; - ed_ysize = max_ed_fieldy; + ed_xsize = lev_fieldx; + ed_ysize = lev_fieldy; } // check if we need any scrollbars @@ -10192,7 +10436,7 @@ static void DrawPropertiesConfig(void) num_element_counters); counterbutton_info[counter_id].value = elements_with_counter[i].value; - counterbutton_info[counter_id].text_right= elements_with_counter[i].text; + counterbutton_info[counter_id].text_right = elements_with_counter[i].text; if (properties_element == EL_GAME_OF_LIFE || properties_element == EL_BIOMAZE) @@ -11702,6 +11946,12 @@ static void SetElementIntelliDraw(int x, int y, int dx, int dy, int new_element, EL_DF_RECEIVER_DOWN, EL_DF_RECEIVER_LEFT }, + { + EL_DF_SLOPE_1, + EL_DF_SLOPE_4, + EL_DF_SLOPE_3, + EL_DF_SLOPE_2 + }, { -1, @@ -12043,19 +12293,10 @@ static boolean isHiresDrawElement(int element) static int numHiresTiles(int element) { - if (!IS_MM_WALL(element)) - return 1; - - int bits = MM_WALL_BITS(element); - int num_bits = 0; - - while (bits) - { - bits &= bits - 1; - num_bits++; - } + if (IS_MM_WALL(element)) + return get_number_of_bits(MM_WALL_BITS(element)); - return num_bits; + return 1; } static void SetDrawModeHiRes(int element) @@ -12356,280 +12597,144 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, MAX_CB_NUM_LINES * \ MAX_CB_PART_SIZE) -static int getFlippedTileX(int element) +static int getFlippedTileExt(int map[], int element) { - switch (element) - { - case EL_BD_BUTTERFLY_LEFT: return EL_BD_BUTTERFLY_RIGHT; - case EL_BD_BUTTERFLY_RIGHT: return EL_BD_BUTTERFLY_LEFT; - - case EL_BD_FIREFLY_LEFT: return EL_BD_FIREFLY_RIGHT; - case EL_BD_FIREFLY_RIGHT: return EL_BD_FIREFLY_LEFT; - - case EL_BUG_LEFT: return EL_BUG_RIGHT; - case EL_BUG_RIGHT: return EL_BUG_LEFT; - - case EL_SPACESHIP_LEFT: return EL_SPACESHIP_RIGHT; - case EL_SPACESHIP_RIGHT: return EL_SPACESHIP_LEFT; - - case EL_PACMAN_LEFT: return EL_PACMAN_RIGHT; - case EL_PACMAN_RIGHT: return EL_PACMAN_LEFT; - - case EL_ARROW_LEFT: return EL_ARROW_RIGHT; - case EL_ARROW_RIGHT: return EL_ARROW_LEFT; - - case EL_MOLE_LEFT: return EL_MOLE_RIGHT; - case EL_MOLE_RIGHT: return EL_MOLE_LEFT; - - case EL_BALLOON_SWITCH_LEFT: return EL_BALLOON_SWITCH_RIGHT; - case EL_BALLOON_SWITCH_RIGHT: return EL_BALLOON_SWITCH_LEFT; - - case EL_YAMYAM_LEFT: return EL_YAMYAM_RIGHT; - case EL_YAMYAM_RIGHT: return EL_YAMYAM_LEFT; - - case EL_SP_PORT_LEFT: return EL_SP_PORT_RIGHT; - case EL_SP_PORT_RIGHT: return EL_SP_PORT_LEFT; - - case EL_SP_GRAVITY_PORT_LEFT: return EL_SP_GRAVITY_PORT_RIGHT; - case EL_SP_GRAVITY_PORT_RIGHT: return EL_SP_GRAVITY_PORT_LEFT; - - case EL_SP_GRAVITY_ON_PORT_LEFT: return EL_SP_GRAVITY_ON_PORT_RIGHT; - case EL_SP_GRAVITY_ON_PORT_RIGHT: return EL_SP_GRAVITY_ON_PORT_LEFT; - - case EL_SP_GRAVITY_OFF_PORT_LEFT: return EL_SP_GRAVITY_OFF_PORT_RIGHT; - case EL_SP_GRAVITY_OFF_PORT_RIGHT: return EL_SP_GRAVITY_OFF_PORT_LEFT; - - case EL_CONVEYOR_BELT_1_LEFT: return EL_CONVEYOR_BELT_1_RIGHT; - case EL_CONVEYOR_BELT_1_RIGHT: return EL_CONVEYOR_BELT_1_LEFT; - - case EL_CONVEYOR_BELT_2_LEFT: return EL_CONVEYOR_BELT_2_RIGHT; - case EL_CONVEYOR_BELT_2_RIGHT: return EL_CONVEYOR_BELT_2_LEFT; - - case EL_CONVEYOR_BELT_3_LEFT: return EL_CONVEYOR_BELT_3_RIGHT; - case EL_CONVEYOR_BELT_3_RIGHT: return EL_CONVEYOR_BELT_3_LEFT; - - case EL_CONVEYOR_BELT_4_LEFT: return EL_CONVEYOR_BELT_4_RIGHT; - case EL_CONVEYOR_BELT_4_RIGHT: return EL_CONVEYOR_BELT_4_LEFT; - - case EL_SPRING_LEFT: return EL_SPRING_RIGHT; - case EL_SPRING_RIGHT: return EL_SPRING_LEFT; - - case EL_SP_CHIP_LEFT: return EL_SP_CHIP_RIGHT; - case EL_SP_CHIP_RIGHT: return EL_SP_CHIP_LEFT; - - case EL_TUBE_VERTICAL_LEFT: return EL_TUBE_VERTICAL_RIGHT; - case EL_TUBE_VERTICAL_RIGHT: return EL_TUBE_VERTICAL_LEFT; - case EL_TUBE_LEFT_UP: return EL_TUBE_RIGHT_UP; - case EL_TUBE_LEFT_DOWN: return EL_TUBE_RIGHT_DOWN; - case EL_TUBE_RIGHT_UP: return EL_TUBE_LEFT_UP; - case EL_TUBE_RIGHT_DOWN: return EL_TUBE_LEFT_DOWN; - - case EL_DC_STEELWALL_1_LEFT: return EL_DC_STEELWALL_1_RIGHT; - case EL_DC_STEELWALL_1_RIGHT: return EL_DC_STEELWALL_1_LEFT; - case EL_DC_STEELWALL_1_TOPLEFT: return EL_DC_STEELWALL_1_TOPRIGHT; - case EL_DC_STEELWALL_1_TOPRIGHT: return EL_DC_STEELWALL_1_TOPLEFT; - case EL_DC_STEELWALL_1_BOTTOMLEFT: return EL_DC_STEELWALL_1_BOTTOMRIGHT; - case EL_DC_STEELWALL_1_BOTTOMRIGHT: return EL_DC_STEELWALL_1_BOTTOMLEFT; - case EL_DC_STEELWALL_1_TOPLEFT_2: return EL_DC_STEELWALL_1_TOPRIGHT_2; - case EL_DC_STEELWALL_1_TOPRIGHT_2: return EL_DC_STEELWALL_1_TOPLEFT_2; - case EL_DC_STEELWALL_1_BOTTOMLEFT_2: return EL_DC_STEELWALL_1_BOTTOMRIGHT_2; - case EL_DC_STEELWALL_1_BOTTOMRIGHT_2: return EL_DC_STEELWALL_1_BOTTOMLEFT_2; - - case EL_DC_STEELWALL_2_LEFT: return EL_DC_STEELWALL_2_RIGHT; - case EL_DC_STEELWALL_2_RIGHT: return EL_DC_STEELWALL_2_LEFT; + int i; - case EL_ACID_POOL_TOPLEFT: return EL_ACID_POOL_TOPRIGHT; - case EL_ACID_POOL_TOPRIGHT: return EL_ACID_POOL_TOPLEFT; - case EL_ACID_POOL_BOTTOMLEFT: return EL_ACID_POOL_BOTTOMRIGHT; - case EL_ACID_POOL_BOTTOMRIGHT: return EL_ACID_POOL_BOTTOMLEFT; - } + for (i = 0; map[i] != -1; i++) + if (map[i] == element) + return map[i ^ 1]; // get flipped element by flipping LSB of index return element; } -static int getFlippedTileY(int element) +static int getFlippedTileX(int element) { - switch (element) - { - case EL_BD_BUTTERFLY_UP: return EL_BD_BUTTERFLY_DOWN; - case EL_BD_BUTTERFLY_DOWN: return EL_BD_BUTTERFLY_UP; - - case EL_BD_FIREFLY_UP: return EL_BD_FIREFLY_DOWN; - case EL_BD_FIREFLY_DOWN: return EL_BD_FIREFLY_UP; - - case EL_BUG_UP: return EL_BUG_DOWN; - case EL_BUG_DOWN: return EL_BUG_UP; - - case EL_SPACESHIP_UP: return EL_SPACESHIP_DOWN; - case EL_SPACESHIP_DOWN: return EL_SPACESHIP_UP; - - case EL_PACMAN_UP: return EL_PACMAN_DOWN; - case EL_PACMAN_DOWN: return EL_PACMAN_UP; - - case EL_ARROW_UP: return EL_ARROW_DOWN; - case EL_ARROW_DOWN: return EL_ARROW_UP; - - case EL_MOLE_UP: return EL_MOLE_DOWN; - case EL_MOLE_DOWN: return EL_MOLE_UP; - - case EL_BALLOON_SWITCH_UP: return EL_BALLOON_SWITCH_DOWN; - case EL_BALLOON_SWITCH_DOWN: return EL_BALLOON_SWITCH_UP; - - case EL_YAMYAM_UP: return EL_YAMYAM_DOWN; - case EL_YAMYAM_DOWN: return EL_YAMYAM_UP; - - case EL_SP_PORT_UP: return EL_SP_PORT_DOWN; - case EL_SP_PORT_DOWN: return EL_SP_PORT_UP; - - case EL_SP_GRAVITY_PORT_UP: return EL_SP_GRAVITY_PORT_DOWN; - case EL_SP_GRAVITY_PORT_DOWN: return EL_SP_GRAVITY_PORT_UP; - - case EL_SP_GRAVITY_ON_PORT_UP: return EL_SP_GRAVITY_ON_PORT_DOWN; - case EL_SP_GRAVITY_ON_PORT_DOWN: return EL_SP_GRAVITY_ON_PORT_UP; - - case EL_SP_GRAVITY_OFF_PORT_UP: return EL_SP_GRAVITY_OFF_PORT_DOWN; - case EL_SP_GRAVITY_OFF_PORT_DOWN: return EL_SP_GRAVITY_OFF_PORT_UP; - - case EL_SP_CHIP_TOP: return EL_SP_CHIP_BOTTOM; - case EL_SP_CHIP_BOTTOM: return EL_SP_CHIP_TOP; - - case EL_TUBE_HORIZONTAL_UP: return EL_TUBE_HORIZONTAL_DOWN; - case EL_TUBE_HORIZONTAL_DOWN: return EL_TUBE_HORIZONTAL_UP; - case EL_TUBE_LEFT_UP: return EL_TUBE_LEFT_DOWN; - case EL_TUBE_LEFT_DOWN: return EL_TUBE_LEFT_UP; - case EL_TUBE_RIGHT_UP: return EL_TUBE_RIGHT_DOWN; - case EL_TUBE_RIGHT_DOWN: return EL_TUBE_RIGHT_UP; - - case EL_DC_STEELWALL_1_TOP: return EL_DC_STEELWALL_1_BOTTOM; - case EL_DC_STEELWALL_1_BOTTOM: return EL_DC_STEELWALL_1_TOP; - case EL_DC_STEELWALL_1_TOPLEFT: return EL_DC_STEELWALL_1_BOTTOMLEFT; - case EL_DC_STEELWALL_1_TOPRIGHT: return EL_DC_STEELWALL_1_BOTTOMRIGHT; - case EL_DC_STEELWALL_1_BOTTOMLEFT: return EL_DC_STEELWALL_1_TOPLEFT; - case EL_DC_STEELWALL_1_BOTTOMRIGHT: return EL_DC_STEELWALL_1_TOPRIGHT; - case EL_DC_STEELWALL_1_TOPLEFT_2: return EL_DC_STEELWALL_1_BOTTOMLEFT_2; - case EL_DC_STEELWALL_1_TOPRIGHT_2: return EL_DC_STEELWALL_1_BOTTOMRIGHT_2; - case EL_DC_STEELWALL_1_BOTTOMLEFT_2: return EL_DC_STEELWALL_1_TOPLEFT_2; - case EL_DC_STEELWALL_1_BOTTOMRIGHT_2: return EL_DC_STEELWALL_1_TOPRIGHT_2; + int map[] = + { + EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_RIGHT, + EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_RIGHT, + EL_BUG_LEFT, EL_BUG_RIGHT, + EL_SPACESHIP_LEFT, EL_SPACESHIP_RIGHT, + EL_PACMAN_LEFT, EL_PACMAN_RIGHT, + EL_ARROW_LEFT, EL_ARROW_RIGHT, + EL_MOLE_LEFT, EL_MOLE_RIGHT, + EL_BALLOON_SWITCH_LEFT, EL_BALLOON_SWITCH_RIGHT, + EL_YAMYAM_LEFT, EL_YAMYAM_RIGHT, + EL_SP_PORT_LEFT, EL_SP_PORT_RIGHT, + EL_SP_GRAVITY_PORT_LEFT, EL_SP_GRAVITY_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_LEFT, EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_LEFT, EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_CONVEYOR_BELT_1_LEFT, EL_CONVEYOR_BELT_1_RIGHT, + EL_CONVEYOR_BELT_2_LEFT, EL_CONVEYOR_BELT_2_RIGHT, + EL_CONVEYOR_BELT_3_LEFT, EL_CONVEYOR_BELT_3_RIGHT, + EL_CONVEYOR_BELT_4_LEFT, EL_CONVEYOR_BELT_4_RIGHT, + EL_SPRING_LEFT, EL_SPRING_RIGHT, + EL_SP_CHIP_LEFT, EL_SP_CHIP_RIGHT, + EL_TUBE_VERTICAL_LEFT, EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_LEFT_UP, EL_TUBE_RIGHT_UP, + EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_DOWN, + EL_DC_STEELWALL_1_LEFT, EL_DC_STEELWALL_1_RIGHT, + EL_DC_STEELWALL_1_TOPLEFT, EL_DC_STEELWALL_1_TOPRIGHT, + EL_DC_STEELWALL_1_BOTTOMLEFT, EL_DC_STEELWALL_1_BOTTOMRIGHT, + EL_DC_STEELWALL_1_TOPLEFT_2, EL_DC_STEELWALL_1_TOPRIGHT_2, + EL_DC_STEELWALL_1_BOTTOMLEFT_2, EL_DC_STEELWALL_1_BOTTOMRIGHT_2, + EL_DC_STEELWALL_2_LEFT, EL_DC_STEELWALL_2_RIGHT, + EL_ACID_POOL_TOPLEFT, EL_ACID_POOL_TOPRIGHT, + EL_ACID_POOL_BOTTOMLEFT, EL_ACID_POOL_BOTTOMRIGHT, + + -1 + }; - case EL_DC_STEELWALL_2_TOP: return EL_DC_STEELWALL_2_BOTTOM; - case EL_DC_STEELWALL_2_BOTTOM: return EL_DC_STEELWALL_2_TOP; + return getFlippedTileExt(map, element); +} - case EL_EMC_WALL_1: return EL_EMC_WALL_3; - case EL_EMC_WALL_3: return EL_EMC_WALL_1; - } +static int getFlippedTileY(int element) +{ + int map[] = + { + EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY_DOWN, + EL_BD_FIREFLY_UP, EL_BD_FIREFLY_DOWN, + EL_BUG_UP, EL_BUG_DOWN, + EL_SPACESHIP_UP, EL_SPACESHIP_DOWN, + EL_PACMAN_UP, EL_PACMAN_DOWN, + EL_ARROW_UP, EL_ARROW_DOWN, + EL_MOLE_UP, EL_MOLE_DOWN, + EL_BALLOON_SWITCH_UP, EL_BALLOON_SWITCH_DOWN, + EL_YAMYAM_UP, EL_YAMYAM_DOWN, + EL_SP_PORT_UP, EL_SP_PORT_DOWN, + EL_SP_GRAVITY_PORT_UP, EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_ON_PORT_UP, EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_DOWN, + EL_SP_CHIP_TOP, EL_SP_CHIP_BOTTOM, + EL_TUBE_HORIZONTAL_UP, EL_TUBE_HORIZONTAL_DOWN, + EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, EL_TUBE_RIGHT_DOWN, + EL_DC_STEELWALL_1_TOP, EL_DC_STEELWALL_1_BOTTOM, + EL_DC_STEELWALL_1_TOPLEFT, EL_DC_STEELWALL_1_BOTTOMLEFT, + EL_DC_STEELWALL_1_TOPRIGHT, EL_DC_STEELWALL_1_BOTTOMRIGHT, + EL_DC_STEELWALL_1_TOPLEFT_2, EL_DC_STEELWALL_1_BOTTOMLEFT_2, + EL_DC_STEELWALL_1_TOPRIGHT_2, EL_DC_STEELWALL_1_BOTTOMRIGHT_2, + EL_DC_STEELWALL_2_TOP, EL_DC_STEELWALL_2_BOTTOM, + EL_EMC_WALL_1, EL_EMC_WALL_3, + + -1 + }; - return element; + return getFlippedTileExt(map, element); } static int getFlippedTileXY(int element) { - switch (element) - { - case EL_BD_BUTTERFLY_LEFT: return EL_BD_BUTTERFLY_UP; - case EL_BD_BUTTERFLY_RIGHT: return EL_BD_BUTTERFLY_DOWN; - case EL_BD_BUTTERFLY_UP: return EL_BD_BUTTERFLY_LEFT; - case EL_BD_BUTTERFLY_DOWN: return EL_BD_BUTTERFLY_RIGHT; - - case EL_BD_FIREFLY_LEFT: return EL_BD_FIREFLY_UP; - case EL_BD_FIREFLY_RIGHT: return EL_BD_FIREFLY_DOWN; - case EL_BD_FIREFLY_UP: return EL_BD_FIREFLY_LEFT; - case EL_BD_FIREFLY_DOWN: return EL_BD_FIREFLY_RIGHT; - - case EL_BUG_LEFT: return EL_BUG_UP; - case EL_BUG_RIGHT: return EL_BUG_DOWN; - case EL_BUG_UP: return EL_BUG_LEFT; - case EL_BUG_DOWN: return EL_BUG_RIGHT; - - case EL_SPACESHIP_LEFT: return EL_SPACESHIP_UP; - case EL_SPACESHIP_RIGHT: return EL_SPACESHIP_DOWN; - case EL_SPACESHIP_UP: return EL_SPACESHIP_LEFT; - case EL_SPACESHIP_DOWN: return EL_SPACESHIP_RIGHT; - - case EL_PACMAN_LEFT: return EL_PACMAN_UP; - case EL_PACMAN_RIGHT: return EL_PACMAN_DOWN; - case EL_PACMAN_UP: return EL_PACMAN_LEFT; - case EL_PACMAN_DOWN: return EL_PACMAN_RIGHT; - - case EL_ARROW_LEFT: return EL_ARROW_UP; - case EL_ARROW_RIGHT: return EL_ARROW_DOWN; - case EL_ARROW_UP: return EL_ARROW_LEFT; - case EL_ARROW_DOWN: return EL_ARROW_RIGHT; - - case EL_MOLE_LEFT: return EL_MOLE_UP; - case EL_MOLE_RIGHT: return EL_MOLE_DOWN; - case EL_MOLE_UP: return EL_MOLE_LEFT; - case EL_MOLE_DOWN: return EL_MOLE_RIGHT; - - case EL_BALLOON_SWITCH_LEFT: return EL_BALLOON_SWITCH_UP; - case EL_BALLOON_SWITCH_RIGHT: return EL_BALLOON_SWITCH_DOWN; - case EL_BALLOON_SWITCH_UP: return EL_BALLOON_SWITCH_LEFT; - case EL_BALLOON_SWITCH_DOWN: return EL_BALLOON_SWITCH_RIGHT; - - case EL_YAMYAM_LEFT: return EL_YAMYAM_UP; - case EL_YAMYAM_RIGHT: return EL_YAMYAM_DOWN; - case EL_YAMYAM_UP: return EL_YAMYAM_LEFT; - case EL_YAMYAM_DOWN: return EL_YAMYAM_RIGHT; - - case EL_SP_PORT_LEFT: return EL_SP_PORT_UP; - case EL_SP_PORT_RIGHT: return EL_SP_PORT_DOWN; - case EL_SP_PORT_UP: return EL_SP_PORT_LEFT; - case EL_SP_PORT_DOWN: return EL_SP_PORT_RIGHT; - - case EL_SP_GRAVITY_PORT_LEFT: return EL_SP_GRAVITY_PORT_UP; - case EL_SP_GRAVITY_PORT_RIGHT: return EL_SP_GRAVITY_PORT_DOWN; - case EL_SP_GRAVITY_PORT_UP: return EL_SP_GRAVITY_PORT_LEFT; - case EL_SP_GRAVITY_PORT_DOWN: return EL_SP_GRAVITY_PORT_RIGHT; - - case EL_SP_GRAVITY_ON_PORT_LEFT: return EL_SP_GRAVITY_ON_PORT_UP; - case EL_SP_GRAVITY_ON_PORT_RIGHT: return EL_SP_GRAVITY_ON_PORT_DOWN; - case EL_SP_GRAVITY_ON_PORT_UP: return EL_SP_GRAVITY_ON_PORT_LEFT; - case EL_SP_GRAVITY_ON_PORT_DOWN: return EL_SP_GRAVITY_ON_PORT_RIGHT; - - case EL_SP_GRAVITY_OFF_PORT_LEFT: return EL_SP_GRAVITY_OFF_PORT_UP; - case EL_SP_GRAVITY_OFF_PORT_RIGHT: return EL_SP_GRAVITY_OFF_PORT_DOWN; - case EL_SP_GRAVITY_OFF_PORT_UP: return EL_SP_GRAVITY_OFF_PORT_LEFT; - case EL_SP_GRAVITY_OFF_PORT_DOWN: return EL_SP_GRAVITY_OFF_PORT_RIGHT; - - case EL_SP_CHIP_LEFT: return EL_SP_CHIP_TOP; - case EL_SP_CHIP_RIGHT: return EL_SP_CHIP_BOTTOM; - case EL_SP_CHIP_TOP: return EL_SP_CHIP_LEFT; - case EL_SP_CHIP_BOTTOM: return EL_SP_CHIP_RIGHT; - - case EL_TUBE_VERTICAL: return EL_TUBE_HORIZONTAL; - case EL_TUBE_HORIZONTAL: return EL_TUBE_VERTICAL; - case EL_TUBE_VERTICAL_LEFT: return EL_TUBE_HORIZONTAL_UP; - case EL_TUBE_VERTICAL_RIGHT: return EL_TUBE_HORIZONTAL_DOWN; - case EL_TUBE_HORIZONTAL_UP: return EL_TUBE_VERTICAL_LEFT; - case EL_TUBE_HORIZONTAL_DOWN: return EL_TUBE_VERTICAL_RIGHT; - case EL_TUBE_LEFT_DOWN: return EL_TUBE_RIGHT_UP; - case EL_TUBE_RIGHT_UP: return EL_TUBE_LEFT_DOWN; - - case EL_DC_STEELWALL_1_LEFT: return EL_DC_STEELWALL_1_TOP; - case EL_DC_STEELWALL_1_RIGHT: return EL_DC_STEELWALL_1_BOTTOM; - case EL_DC_STEELWALL_1_TOP: return EL_DC_STEELWALL_1_LEFT; - case EL_DC_STEELWALL_1_BOTTOM: return EL_DC_STEELWALL_1_RIGHT; - case EL_DC_STEELWALL_1_HORIZONTAL: return EL_DC_STEELWALL_1_VERTICAL; - case EL_DC_STEELWALL_1_VERTICAL: return EL_DC_STEELWALL_1_HORIZONTAL; - case EL_DC_STEELWALL_1_TOPRIGHT: return EL_DC_STEELWALL_1_BOTTOMLEFT; - case EL_DC_STEELWALL_1_BOTTOMLEFT: return EL_DC_STEELWALL_1_TOPRIGHT; - case EL_DC_STEELWALL_1_TOPRIGHT_2: return EL_DC_STEELWALL_1_BOTTOMLEFT_2; - case EL_DC_STEELWALL_1_BOTTOMLEFT_2: return EL_DC_STEELWALL_1_TOPRIGHT_2; - - case EL_DC_STEELWALL_2_LEFT: return EL_DC_STEELWALL_2_TOP; - case EL_DC_STEELWALL_2_RIGHT: return EL_DC_STEELWALL_2_BOTTOM; - case EL_DC_STEELWALL_2_TOP: return EL_DC_STEELWALL_2_LEFT; - case EL_DC_STEELWALL_2_BOTTOM: return EL_DC_STEELWALL_2_RIGHT; - case EL_DC_STEELWALL_2_HORIZONTAL: return EL_DC_STEELWALL_2_VERTICAL; - case EL_DC_STEELWALL_2_VERTICAL: return EL_DC_STEELWALL_2_HORIZONTAL; - - case EL_EXPANDABLE_WALL_HORIZONTAL: return EL_EXPANDABLE_WALL_VERTICAL; - case EL_EXPANDABLE_WALL_VERTICAL: return EL_EXPANDABLE_WALL_HORIZONTAL; - - case EL_EXPANDABLE_STEELWALL_HORIZONTAL: return EL_EXPANDABLE_STEELWALL_VERTICAL; - case EL_EXPANDABLE_STEELWALL_VERTICAL: return EL_EXPANDABLE_STEELWALL_HORIZONTAL; - } + int map[] = + { + EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_UP, + EL_BD_BUTTERFLY_RIGHT, EL_BD_BUTTERFLY_DOWN, + EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_UP, + EL_BD_FIREFLY_RIGHT, EL_BD_FIREFLY_DOWN, + EL_BUG_LEFT, EL_BUG_UP, + EL_BUG_RIGHT, EL_BUG_DOWN, + EL_SPACESHIP_LEFT, EL_SPACESHIP_UP, + EL_SPACESHIP_RIGHT, EL_SPACESHIP_DOWN, + EL_PACMAN_LEFT, EL_PACMAN_UP, + EL_PACMAN_RIGHT, EL_PACMAN_DOWN, + EL_ARROW_LEFT, EL_ARROW_UP, + EL_ARROW_RIGHT, EL_ARROW_DOWN, + EL_MOLE_LEFT, EL_MOLE_UP, + EL_MOLE_RIGHT, EL_MOLE_DOWN, + EL_BALLOON_SWITCH_LEFT, EL_BALLOON_SWITCH_UP, + EL_BALLOON_SWITCH_RIGHT, EL_BALLOON_SWITCH_DOWN, + EL_YAMYAM_LEFT, EL_YAMYAM_UP, + EL_YAMYAM_RIGHT, EL_YAMYAM_DOWN, + EL_SP_PORT_LEFT, EL_SP_PORT_UP, + EL_SP_PORT_RIGHT, EL_SP_PORT_DOWN, + EL_SP_GRAVITY_PORT_LEFT, EL_SP_GRAVITY_PORT_UP, + EL_SP_GRAVITY_PORT_RIGHT, EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_ON_PORT_LEFT, EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_RIGHT, EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT, EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_RIGHT, EL_SP_GRAVITY_OFF_PORT_DOWN, + EL_SP_CHIP_LEFT, EL_SP_CHIP_TOP, + EL_SP_CHIP_RIGHT, EL_SP_CHIP_BOTTOM, + EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, + EL_TUBE_VERTICAL_LEFT, EL_TUBE_HORIZONTAL_UP, + EL_TUBE_VERTICAL_RIGHT, EL_TUBE_HORIZONTAL_DOWN, + EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, + EL_DC_STEELWALL_1_LEFT, EL_DC_STEELWALL_1_TOP, + EL_DC_STEELWALL_1_RIGHT, EL_DC_STEELWALL_1_BOTTOM, + EL_DC_STEELWALL_1_HORIZONTAL, EL_DC_STEELWALL_1_VERTICAL, + EL_DC_STEELWALL_1_TOPRIGHT, EL_DC_STEELWALL_1_BOTTOMLEFT, + EL_DC_STEELWALL_1_TOPRIGHT_2, EL_DC_STEELWALL_1_BOTTOMLEFT_2, + EL_DC_STEELWALL_2_LEFT, EL_DC_STEELWALL_2_TOP, + EL_DC_STEELWALL_2_RIGHT, EL_DC_STEELWALL_2_BOTTOM, + EL_DC_STEELWALL_2_HORIZONTAL, EL_DC_STEELWALL_2_VERTICAL, + EL_EXPANDABLE_WALL_HORIZONTAL, EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_STEELWALL_HORIZONTAL, EL_EXPANDABLE_STEELWALL_VERTICAL, + + -1 + }; - return element; + return getFlippedTileExt(map, element); } static int getFlippedTile(int element, int mode) @@ -12899,6 +13004,7 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, lev_fieldx = level.fieldx = brush_width; lev_fieldy = level.fieldy = brush_height; + boolean use_bd_engine = TRUE; boolean use_em_engine = TRUE; boolean use_sp_engine = TRUE; boolean use_mm_engine = TRUE; @@ -12909,6 +13015,9 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, { int element = Tile[x][y]; + if (!IS_BD_ELEMENT(element) && !IS_PLAYER_ELEMENT(element)) + use_bd_engine = FALSE; + if (!IS_EM_ELEMENT(element) && !IS_PLAYER_ELEMENT(element)) use_em_engine = FALSE; @@ -12920,7 +13029,8 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, } } - level.game_engine_type = (use_em_engine ? GAME_ENGINE_TYPE_EM : + level.game_engine_type = (use_bd_engine ? GAME_ENGINE_TYPE_BD : + use_em_engine ? GAME_ENGINE_TYPE_EM : use_sp_engine ? GAME_ENGINE_TYPE_SP : use_mm_engine ? GAME_ENGINE_TYPE_MM : GAME_ENGINE_TYPE_RND); @@ -13440,7 +13550,8 @@ static void WrapLevel(int dx, int dy) CopyLevelToUndoBuffer(UNDO_ACCUMULATE); } -static void DrawAreaElementHighlight(boolean highlighted) +static void DrawAreaElementHighlight(boolean highlighted, + boolean highlighted_similar) { DrawEditorLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); @@ -13453,26 +13564,69 @@ static void DrawAreaElementHighlight(boolean highlighted) { for (y = 0; y < ed_fieldy; y++) { + boolean highlight = FALSE; int lx = x + level_xpos; int ly = y + level_ypos; if (!IN_LEV_FIELD(lx, ly)) continue; - if (Tile[lx][ly] != new_element1) + // check if element is the same + if (Tile[lx][ly] == new_element1) + highlight = TRUE; + + // check if element is similar + if (highlighted_similar && + strEqual(element_info[Tile[lx][ly]].class_name, + element_info[new_element1].class_name)) + highlight = TRUE; + + // check if element is matching MM style wall + if (IS_MM_WALL(Tile[lx][ly]) && + map_mm_wall_element(Tile[lx][ly]) == new_element1) + highlight = TRUE; + + if (!highlight) continue; - int sx = SX + x * ed_tilesize; - int sy = SY + y * ed_tilesize; - int from_sx = sx; - int from_sy = sy; - int to_sx = sx + ed_tilesize - 1; - int to_sy = sy + ed_tilesize - 1; - - DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx, from_sy); - DrawSimpleWhiteLine(drawto, to_sx, from_sy, to_sx, to_sy); - DrawSimpleWhiteLine(drawto, to_sx, to_sy, from_sx, to_sy); - DrawSimpleWhiteLine(drawto, from_sx, to_sy, from_sx, from_sy); + if (IS_MM_WALL(Tile[lx][ly]) && !highlighted_similar) + { + int i; + + for (i = 0; i < 4; i++) + { + if (!(MM_WALL_BITS(Tile[lx][ly]) & (1 << i))) + continue; + + int xx = x * 2 + (i % 2); + int yy = y * 2 + (i / 2); + int sx = SX + xx * ed_tilesize / 2; + int sy = SY + yy * ed_tilesize / 2; + int from_sx = sx; + int from_sy = sy; + int to_sx = sx + ed_tilesize / 2 - 1; + int to_sy = sy + ed_tilesize / 2 - 1; + + DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx, from_sy); + DrawSimpleWhiteLine(drawto, to_sx, from_sy, to_sx, to_sy); + DrawSimpleWhiteLine(drawto, to_sx, to_sy, from_sx, to_sy); + DrawSimpleWhiteLine(drawto, from_sx, to_sy, from_sx, from_sy); + } + } + else + { + int sx = SX + x * ed_tilesize; + int sy = SY + y * ed_tilesize; + int from_sx = sx; + int from_sy = sy; + int to_sx = sx + ed_tilesize - 1; + int to_sy = sy + ed_tilesize - 1; + + DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx, from_sy); + DrawSimpleWhiteLine(drawto, to_sx, from_sy, to_sx, to_sy); + DrawSimpleWhiteLine(drawto, to_sx, to_sy, from_sx, to_sy); + DrawSimpleWhiteLine(drawto, from_sx, to_sy, from_sx, from_sy); + } } } } @@ -14827,8 +14981,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) for (i = 0; editor_elements_info[i].setup_value != NULL; i++) { - int *cascade_element= &(*editor_elements_info[i].headline_list)[0]; - boolean *cascade_value=editor_elements_info[i].setup_cascade_value; + int *cascade_element = &(*editor_elements_info[i].headline_list)[0]; + boolean *cascade_value = editor_elements_info[i].setup_cascade_value; if (*cascade_element == new_element) { @@ -15095,16 +15249,20 @@ static void HandleLevelEditorIdle_Properties(void) static void HandleLevelEditorIdle_Drawing(void) { static boolean last_highlighted = FALSE; + static boolean last_highlighted_similar = FALSE; boolean highlighted = (GetKeyModState() & KMOD_Alt); + boolean highlighted_similar = (GetKeyModState() & KMOD_Shift); - if (highlighted != last_highlighted) + if (highlighted != last_highlighted || + (highlighted && highlighted_similar != last_highlighted_similar)) { - DrawAreaElementHighlight(highlighted); - - last_highlighted = highlighted; + DrawAreaElementHighlight(highlighted, highlighted_similar); redraw_mask |= REDRAW_FIELD; } + + last_highlighted = highlighted; + last_highlighted_similar = highlighted_similar; } void HandleLevelEditorIdle(void) @@ -15368,7 +15526,7 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed, vp_door_2->height == VYSIZE) CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY); else - SetDoorState(DOOR_CLOSE_2); + SetDoorState(DOOR_CLOSE_ALL); BackToFront();