X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=7c9020702bf6c9aa3d99ca61f41b597a45aa983d;hb=96c47c30116d9306216622ae7f5e8f4583cc3dbc;hp=a3ab4c4c3e9abfafcba5aea076ec3c7557f14863;hpb=e34b75ad13d1120b9cfc1cb1d2308203ba13c0fe;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index a3ab4c4c..7c902070 100644 --- a/src/editor.c +++ b/src/editor.c @@ -382,7 +382,7 @@ enum GADGET_ID_PICK_ELEMENT, GADGET_ID_UNDO, - GADGET_ID_INFO, + GADGET_ID_CONF, GADGET_ID_SAVE, GADGET_ID_CLEAR, GADGET_ID_TEST, @@ -603,9 +603,9 @@ enum // textbutton identifiers - GADGET_ID_LEVELINFO_LEVEL, - GADGET_ID_LEVELINFO_LEVELSET, - GADGET_ID_LEVELINFO_EDITOR, + GADGET_ID_LEVELCONFIG_LEVEL, + GADGET_ID_LEVELCONFIG_LEVELSET, + GADGET_ID_LEVELCONFIG_EDITOR, GADGET_ID_PROPERTIES_INFO, GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_PROPERTIES_CONFIG_1, @@ -913,9 +913,9 @@ enum // values for textbutton gadgets enum { - ED_TEXTBUTTON_ID_LEVELINFO_LEVEL, - ED_TEXTBUTTON_ID_LEVELINFO_LEVELSET, - ED_TEXTBUTTON_ID_LEVELINFO_EDITOR, + ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL, + ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET, + ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR, ED_TEXTBUTTON_ID_PROPERTIES_INFO, ED_TEXTBUTTON_ID_PROPERTIES_CONFIG, ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1, @@ -930,8 +930,8 @@ enum ED_NUM_TEXTBUTTONS }; -#define ED_TAB_BUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL -#define ED_TAB_BUTTON_ID_LEVELINFO_LAST ED_TEXTBUTTON_ID_LEVELINFO_EDITOR +#define ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL +#define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR #define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO #define ED_TAB_BUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE @@ -1126,14 +1126,14 @@ enum // screens in the level editor #define ED_MODE_DRAWING 0 -#define ED_MODE_INFO 1 +#define ED_MODE_LEVELCONFIG 1 #define ED_MODE_PROPERTIES 2 #define ED_MODE_PALETTE 3 // sub-screens in the global settings section -#define ED_MODE_LEVELINFO_LEVEL ED_TEXTBUTTON_ID_LEVELINFO_LEVEL -#define ED_MODE_LEVELINFO_LEVELSET ED_TEXTBUTTON_ID_LEVELINFO_LEVELSET -#define ED_MODE_LEVELINFO_EDITOR ED_TEXTBUTTON_ID_LEVELINFO_EDITOR +#define ED_MODE_LEVELCONFIG_LEVEL ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL +#define ED_MODE_LEVELCONFIG_LEVELSET ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET +#define ED_MODE_LEVELCONFIG_EDITOR ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR // sub-screens in the element properties section #define ED_MODE_PROPERTIES_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO @@ -1274,9 +1274,9 @@ static struct "undo/redo last operation", 'u' }, { - IMG_GFX_EDITOR_BUTTON_CONF, GADGET_ID_INFO, + IMG_GFX_EDITOR_BUTTON_CONF, GADGET_ID_CONF, &editor.button.conf, GD_TYPE_NORMAL_BUTTON, - "properties of level", 'I' + "level and editor settings", 'I' }, { IMG_GFX_EDITOR_BUTTON_SAVE, GADGET_ID_SAVE, @@ -2814,21 +2814,21 @@ static struct { ED_LEVEL_TABS_XPOS(0), ED_LEVEL_TABS_YPOS(0), - GADGET_ID_LEVELINFO_LEVEL, GADGET_ID_NONE, + GADGET_ID_LEVELCONFIG_LEVEL, GADGET_ID_NONE, 8, "Level", - NULL, NULL, NULL, "Configure level properties" + NULL, NULL, NULL, "Configure level settings" }, { -1, -1, - GADGET_ID_LEVELINFO_LEVELSET, GADGET_ID_LEVELINFO_LEVEL, + GADGET_ID_LEVELCONFIG_LEVELSET, GADGET_ID_LEVELCONFIG_LEVEL, 8, "Levelset", NULL, NULL, NULL, "Update this or create new level set" }, { -1, -1, - GADGET_ID_LEVELINFO_EDITOR, GADGET_ID_LEVELINFO_LEVELSET, + GADGET_ID_LEVELCONFIG_EDITOR, GADGET_ID_LEVELCONFIG_LEVELSET, 8, "Editor", - NULL, NULL, NULL, "Configure editor properties" + NULL, NULL, NULL, "Configure editor settings" }, // ---------- element settings (tabs) --------------------------------------- @@ -3948,7 +3948,7 @@ static void AdjustElementListScrollbar(void); static void RedrawDrawingElements(void); static void DrawDrawingWindowExt(boolean); static void DrawDrawingWindow(void); -static void DrawLevelInfoWindow(void); +static void DrawLevelConfigWindow(void); static void DrawPropertiesWindow(void); static void DrawPaletteWindow(void); static void UpdateCustomElementGraphicGadgets(void); @@ -3993,7 +3993,7 @@ static int undo_buffer_steps = 0; static int redo_buffer_steps = 0; static int edit_mode; -static int edit_mode_levelinfo; +static int edit_mode_levelconfig; static int edit_mode_properties; static int element_shift = 0; @@ -4697,8 +4697,8 @@ static int editor_el_deflektor[] = EL_DF_MIRROR_START, EL_DF_MIRROR_ROTATING_START, + EL_DF_MIRROR_FIXED_START, EL_DF_CELL, - EL_DF_MINE, EL_DF_FIBRE_OPTIC_RED_1, EL_DF_FIBRE_OPTIC_YELLOW_1, @@ -4713,7 +4713,7 @@ static int editor_el_deflektor[] = EL_DF_STEEL_WALL, EL_DF_WOODEN_WALL, EL_DF_REFRACTOR, - EL_EMPTY + EL_DF_MINE }; static int *editor_hl_deflektor_ptr = editor_hl_deflektor; static int *editor_el_deflektor_ptr = editor_el_deflektor; @@ -6960,7 +6960,7 @@ static void CreateTextbuttonGadgets(void) { int id = textbutton_info[i].gadget_id; int is_tab_button = - ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) || + ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_EDITOR) || (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE)); int graphic = (is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON); @@ -7050,7 +7050,7 @@ static void CreateGraphicbuttonGadgets(void) int gd_y1 = gd->src_y; int gd_x2 = gd->src_x + gd->pressed_xoffset; int gd_y2 = gd->src_y + gd->pressed_yoffset; - unsigned int event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; + unsigned int event_mask = GD_EVENT_RELEASED; // determine horizontal position to the right of specified gadget if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE) @@ -7855,8 +7855,8 @@ static void DrawEditModeWindowExt(boolean remap_toolbox_gadgets) RedrawDrawingElements(); } - if (edit_mode == ED_MODE_INFO) - DrawLevelInfoWindow(); + if (edit_mode == ED_MODE_LEVELCONFIG) + DrawLevelConfigWindow(); else if (edit_mode == ED_MODE_PROPERTIES) DrawPropertiesWindow(); else if (edit_mode == ED_MODE_PALETTE) @@ -7956,7 +7956,7 @@ static boolean PrepareSavingIntoPersonalLevelSet(void) return TRUE; } -static void ModifyLevelInfoForSavingIntoPersonalLevelSet(char *former_name) +static void ModifyLevelConfigForSavingIntoPersonalLevelSet(char *former_name) { static char *filename_levelinfo = NULL, *mod_name = NULL; FILE *file; @@ -8856,7 +8856,7 @@ void DrawLevelEd(void) else { edit_mode = ED_MODE_DRAWING; - edit_mode_levelinfo = ED_MODE_LEVELINFO_LEVEL; + edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL; edit_mode_properties = ED_MODE_PROPERTIES_INFO; ResetUndoBuffer(); @@ -9239,7 +9239,7 @@ static int getTabulatorBarHeight(void) static Pixel getTabulatorBarColor(void) { - struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL]; + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL]; struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; int gd_x = gd->x + gd_gi1->border.width / 2; int gd_y = gd->y + gd_gi1->height - 1; @@ -9247,19 +9247,19 @@ static Pixel getTabulatorBarColor(void) return GetPixel(gd->bitmap, gd_x, gd_y); } -static void DrawLevelInfoTabulatorGadgets(void) +static void DrawLevelConfigTabulatorGadgets(void) { - struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL]; + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL]; Pixel tab_color = getTabulatorBarColor(); - int id_first = ED_TAB_BUTTON_ID_LEVELINFO_FIRST; - int id_last = ED_TAB_BUTTON_ID_LEVELINFO_LAST; + int id_first = ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST; + int id_last = ED_TAB_BUTTON_ID_LEVELCONFIG_LAST; int i; for (i = id_first; i <= id_last; i++) { int gadget_id = textbutton_info[i].gadget_id; struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - boolean active = (i != edit_mode_levelinfo); + boolean active = (i != edit_mode_levelconfig); // draw background line below tabulator button ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); @@ -9348,7 +9348,7 @@ static int PrintElementDescriptionFromFile(char *filename, int font_nr, TRUE, FALSE, FALSE); } -static void DrawLevelInfoLevel(void) +static void DrawLevelConfigLevel(void) { int i; @@ -9377,7 +9377,7 @@ static char *getLevelSubdirFromSaveMode(int save_mode) return leveldir_current->subdir; } -static void DrawLevelInfoLevelSet_DirectoryInfo(void) +static void DrawLevelConfigLevelSet_DirectoryInfo(void) { char *directory_text = "Level set directory:"; char *directory_name = getLevelSubdirFromSaveMode(levelset_save_mode); @@ -9392,7 +9392,7 @@ static void DrawLevelInfoLevelSet_DirectoryInfo(void) PrintInfoText(directory_name, font2_nr, x, y); } -static void DrawLevelInfoLevelSet(void) +static void DrawLevelConfigLevelSet(void) { boolean artwork_exists = checkIfCustomArtworkExistsForCurrentLevelSet(); boolean template_exists = fileExists(getLocalLevelTemplateFilename()); @@ -9425,10 +9425,10 @@ static void DrawLevelInfoLevelSet(void) MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_LEVELSET); // draw info text - DrawLevelInfoLevelSet_DirectoryInfo(); + DrawLevelConfigLevelSet_DirectoryInfo(); } -static void DrawLevelInfoEditor(void) +static void DrawLevelConfigEditor(void) { int i; @@ -9451,7 +9451,7 @@ static void DrawLevelInfoEditor(void) MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2); } -static void DrawLevelInfoWindow(void) +static void DrawLevelConfigWindow(void) { char *text = "Global Settings"; int font_nr = FONT_TITLE_1; @@ -9470,14 +9470,14 @@ static void DrawLevelInfoWindow(void) DrawText(sx, sy, text, font_nr); - DrawLevelInfoTabulatorGadgets(); + DrawLevelConfigTabulatorGadgets(); - if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVEL) - DrawLevelInfoLevel(); - else if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVELSET) - DrawLevelInfoLevelSet(); - else if (edit_mode_levelinfo == ED_MODE_LEVELINFO_EDITOR) - DrawLevelInfoEditor(); + if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_LEVEL) + DrawLevelConfigLevel(); + else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_LEVELSET) + DrawLevelConfigLevelSet(); + else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_EDITOR) + DrawLevelConfigEditor(); } static void DrawCustomContentArea(void) @@ -11918,6 +11918,24 @@ static void SetElementIntelliDraw(int x, int y, int dx, int dy, int new_element, EL_DF_MIRROR_ROTATING_3, EL_DF_MIRROR_ROTATING_2 }, + { + EL_DF_MIRROR_FIXED_1, + EL_DF_MIRROR_FIXED_16, + EL_DF_MIRROR_FIXED_15, + EL_DF_MIRROR_FIXED_14, + EL_DF_MIRROR_FIXED_13, + EL_DF_MIRROR_FIXED_12, + EL_DF_MIRROR_FIXED_11, + EL_DF_MIRROR_FIXED_10, + EL_DF_MIRROR_FIXED_9, + EL_DF_MIRROR_FIXED_8, + EL_DF_MIRROR_FIXED_7, + EL_DF_MIRROR_FIXED_6, + EL_DF_MIRROR_FIXED_5, + EL_DF_MIRROR_FIXED_4, + EL_DF_MIRROR_FIXED_3, + EL_DF_MIRROR_FIXED_2 + }, { -1, @@ -12327,6 +12345,9 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, #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 @@ -12335,6 +12356,185 @@ 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 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); @@ -12695,6 +12895,37 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, 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) { @@ -12729,6 +12960,22 @@ static void DeleteBrushFromCursor(void) 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); @@ -13618,7 +13865,7 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE) { - DrawLevelInfoWindow(); + DrawLevelConfigWindow(); } else if (type_id == ED_SELECTBOX_ID_SELECT_CHANGE_PAGE) { @@ -13663,12 +13910,12 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) int type_id = gi->custom_type_id; int i; - if (type_id >= ED_TAB_BUTTON_ID_LEVELINFO_FIRST && - type_id <= ED_TAB_BUTTON_ID_LEVELINFO_LAST) + if (type_id >= ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST && + type_id <= ED_TAB_BUTTON_ID_LEVELCONFIG_LAST) { - edit_mode_levelinfo = gi->custom_type_id; + edit_mode_levelconfig = gi->custom_type_id; - DrawLevelInfoWindow(); + DrawLevelConfigWindow(); } else if (type_id >= ED_TAB_BUTTON_ID_PROPERTIES_FIRST && type_id <= ED_TAB_BUTTON_ID_PROPERTIES_LAST) @@ -14324,12 +14571,12 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; - case GADGET_ID_INFO: - if (edit_mode != ED_MODE_INFO) + case GADGET_ID_CONF: + if (edit_mode != ED_MODE_LEVELCONFIG) { last_edit_mode = edit_mode; - ChangeEditModeWindow(ED_MODE_INFO); + ChangeEditModeWindow(ED_MODE_LEVELCONFIG); } else { @@ -14370,7 +14617,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("Save this level and kill the old?", REQ_ASK)) { if (leveldir_former->readonly) - ModifyLevelInfoForSavingIntoPersonalLevelSet(leveldir_former->name); + ModifyLevelConfigForSavingIntoPersonalLevelSet(leveldir_former->name); SetAutomaticNumberOfGemsNeeded(); @@ -14626,8 +14873,8 @@ void HandleLevelEditorKeyInput(Key key) case KSYM_Escape: if (edit_mode == ED_MODE_DRAWING) RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE); - else if (edit_mode == ED_MODE_INFO) - HandleControlButtons(level_editor_gadget[GADGET_ID_INFO]); + else if (edit_mode == ED_MODE_LEVELCONFIG) + HandleControlButtons(level_editor_gadget[GADGET_ID_CONF]); else if (edit_mode == ED_MODE_PROPERTIES) HandleControlButtons(level_editor_gadget[GADGET_ID_PROPERTIES]); else if (edit_mode == ED_MODE_PALETTE) @@ -14669,6 +14916,16 @@ void HandleLevelEditorKeyInput(Key key) 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)