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" },
{ ANIM_LINEAR, "linear" },
{ ANIM_PINGPONG, "pingpong" },
{ ANIM_PINGPONG2, "pingpong 2" },
+ { ANIM_LEVEL_NR, "level number" },
{ -1, NULL }
};
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,
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;
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;
&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,
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;
{
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;
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;
{
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;
{
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;
{
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;
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;
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
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)
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,
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)
#define CB_BRUSH_TO_CLIPBOARD 7
#define CB_BRUSH_TO_CLIPBOARD_SMALL 8
#define CB_UPDATE_BRUSH_POSITION 9
+#define CB_FLIP_BRUSH_X 10
+#define CB_FLIP_BRUSH_Y 11
+#define CB_FLIP_BRUSH_XY 12
#define MAX_CB_PART_SIZE 10
#define MAX_CB_LINE_SIZE (MAX_LEV_FIELDX + 1) // text plus newline
MAX_CB_NUM_LINES * \
MAX_CB_PART_SIZE)
+static int getFlippedTileExt(int map[], int element)
+{
+ int i;
+
+ 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 getFlippedTileX(int element)
+{
+ 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
+ };
+
+ return getFlippedTileExt(map, element);
+}
+
+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 getFlippedTileExt(map, element);
+}
+
+static int getFlippedTileXY(int element)
+{
+ 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 getFlippedTileExt(map, element);
+}
+
+static int getFlippedTile(int element, int mode)
+{
+ if (IS_MM_ELEMENT(element))
+ {
+ // get MM game element
+ element = map_element_RND_to_MM(element);
+
+ // get flipped game element
+ element = (mode == CB_FLIP_BRUSH_X ? getFlippedTileX_MM(element) :
+ mode == CB_FLIP_BRUSH_Y ? getFlippedTileY_MM(element) :
+ mode == CB_FLIP_BRUSH_XY ? getFlippedTileXY_MM(element) :
+ element);
+
+ // get RND game element again
+ element = map_element_MM_to_RND(element);
+ }
+ else
+ {
+ // get flipped game element
+ element = (mode == CB_FLIP_BRUSH_X ? getFlippedTileX(element) :
+ mode == CB_FLIP_BRUSH_Y ? getFlippedTileY(element) :
+ mode == CB_FLIP_BRUSH_XY ? getFlippedTileXY(element) :
+ element);
+ }
+
+ return element;
+}
+
+static void SwapFlippedTiles(short *tile1, short *tile2, int mode)
+{
+ // flip tiles
+ short tile1_flipped = getFlippedTile(*tile1, mode);
+ short tile2_flipped = getFlippedTile(*tile2, mode);
+
+ // swap tiles
+ *tile1 = tile2_flipped;
+ *tile2 = tile1_flipped;
+}
+
static void DrawBrushElement(int sx, int sy, int element, boolean change_level)
{
DrawLineElement(sx, sy, element, change_level);
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;
{
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;
}
}
- 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);
delete_old_brush = TRUE;
}
+ else if (mode == CB_FLIP_BRUSH_X)
+ {
+ for (y = 0; y < brush_height; y++)
+ for (x = 0; x < (brush_width + 1) / 2; x++)
+ SwapFlippedTiles(&brush_buffer[x][y],
+ &brush_buffer[brush_width - x - 1][y], mode);
+
+ CopyBrushExt(last_cursor_x, last_cursor_y, 0, 0, 0, CB_BRUSH_TO_CURSOR);
+ }
+ else if (mode == CB_FLIP_BRUSH_Y)
+ {
+ for (y = 0; y < (brush_height + 1) / 2; y++)
+ for (x = 0; x < brush_width; x++)
+ SwapFlippedTiles(&brush_buffer[x][y],
+ &brush_buffer[x][brush_height - y - 1], mode);
+
+ CopyBrushExt(last_cursor_x, last_cursor_y, 0, 0, 0, CB_BRUSH_TO_CURSOR);
+ }
+ else if (mode == CB_FLIP_BRUSH_XY)
+ {
+ CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR);
+
+ for (y = 0; y < MAX(brush_width, brush_height); y++)
+ for (x = 0; x <= y; x++)
+ SwapFlippedTiles(&brush_buffer[x][y],
+ &brush_buffer[y][x], mode);
+
+ swap_numbers(&brush_width, &brush_height);
+
+ CopyBrushExt(last_cursor_x, last_cursor_y, 0, 0, 0, CB_BRUSH_TO_CURSOR);
+ }
if (mode == CB_UPDATE_BRUSH_POSITION)
{
CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR);
}
+static void FlipBrushX(void)
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_X);
+}
+
+static void FlipBrushY(void)
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_Y);
+}
+
+static void RotateBrush(void)
+{
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_XY);
+ CopyBrushExt(0, 0, 0, 0, 0, CB_FLIP_BRUSH_X);
+}
+
void DumpBrush(void)
{
CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH);
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);
{
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);
+ }
}
}
}
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)
{
if (letter && letter == controlbutton_info[i].shortcut)
if (!anyTextGadgetActive())
ClickOnGadget(level_editor_gadget[i], button);
+
+ if (draw_with_brush)
+ {
+ if (letter == 'x')
+ FlipBrushX();
+ else if (letter == 'y')
+ FlipBrushY();
+ else if (letter == 'z')
+ RotateBrush();
+ }
}
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)
vp_door_2->height == VYSIZE)
CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
else
- SetDoorState(DOOR_CLOSE_2);
+ SetDoorState(DOOR_CLOSE_ALL);
BackToFront();