diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 53b19e5937..4434c3abdd 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -4108,6 +4108,7 @@ STR_5799 :{SMALLFONT}{BLACK}Disables ride breakdowns and crashes due to brake STR_5800 :{SMALLFONT}{BLACK}Prevents rides from breaking down STR_5801 :Disable littering STR_5802 :{SMALLFONT}{BLACK}Stops guests from littering and vomiting +STR_5803 :{SMALLFONT}{BLACK}Rotate selected map element ############# # Scenarios # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b0a8ee1372..394a340514 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2209,6 +2209,10 @@ enum { STR_INSERT_CORRUPT = 5564, STR_INSERT_CORRUPT_TIP = 5565, + STR_REMOVE_SELECTED_ELEMENT_TIP = 5607, + STR_MOVE_SELECTED_ELEMENT_UP_TIP = 5617, + STR_MOVE_SELECTED_ELEMENT_DOWN_TIP = 5618, + STR_ROTATE_SELECTED_ELEMENT_TIP = 5803, STR_PASSWORD = 5566, STR_ADVERTISE = 5567, diff --git a/src/windows/tile_inspector.c b/src/windows/tile_inspector.c index aed3c67cea..2aafdc31c1 100644 --- a/src/windows/tile_inspector.c +++ b/src/windows/tile_inspector.c @@ -38,6 +38,7 @@ enum WINDOW_TILE_INSPECTOR_WIDGET_IDX { WIDX_REMOVE, WIDX_MOVE_DOWN, WIDX_MOVE_UP, + WIDX_ROTATE, WIDX_COLUMN_TYPE, WIDX_COLUMN_BASEHEIGHT, WIDX_COLUMN_CLEARANCEHEIGHT, @@ -71,26 +72,27 @@ enum WINDOW_TILE_INSPECTOR_WIDGET_IDX { #define COL_X_LF (COL_X_BF + 12) // Last for tile flag rct_widget window_tile_inspector_widgets[] = { - { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // panel / background - { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_TILE_INSPECTOR_TITLE, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_TILE_INSPECTOR_TITLE, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, WW - 13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button // Map element list - { WWT_SCROLL, 1, 3, WW - 4, 57, WH - SCROLL_BOTTOM_OFFSET, 2, STR_NONE }, // scroll area + { WWT_SCROLL, 1, 3, WW - 4, 57, WH - SCROLL_BOTTOM_OFFSET, 2, STR_NONE }, // scroll area // Buttons - { WWT_FLATBTN, 1, BX, BW, BY, BH, SPR_MAP, STR_INSERT_CORRUPT_TIP }, // Insert corrupt button - { WWT_FLATBTN, 1, BX - BS * 1, BW - BS * 1, BY, BH, SPR_DEMOLISH, 5607 }, // Remove button - { WWT_CLOSEBOX, 1, BX - BS * 2, BW - BS * 2, BY, BY + 11, 5375, 5617 }, // Move down - { WWT_CLOSEBOX, 1, BX - BS * 2, BW - BS * 2, BH - 11, BH, 5376, 5618 }, // Move up + { WWT_FLATBTN, 1, BX, BW, BY, BH, SPR_MAP, STR_INSERT_CORRUPT_TIP }, // Insert corrupt button + { WWT_FLATBTN, 1, BX - BS * 1, BW - BS * 1, BY, BH, SPR_DEMOLISH, STR_REMOVE_SELECTED_ELEMENT_TIP }, // Remove button + { WWT_CLOSEBOX, 1, BX - BS * 2, BW - BS * 2, BY, BY + 11, 5375, STR_MOVE_SELECTED_ELEMENT_UP_TIP }, // Move down + { WWT_CLOSEBOX, 1, BX - BS * 2, BW - BS * 2, BH - 11, BH, 5376, STR_MOVE_SELECTED_ELEMENT_DOWN_TIP }, // Move up + { WWT_FLATBTN, 1, BX - BS * 3, BW - BS * 3, BY, BH, SPR_ROTATE_ARROW, STR_ROTATE_SELECTED_ELEMENT_TIP }, // Rotate button // Column headers - { WWT_13, 1, COL_X_TYPE, COL_X_BH - 1, 42, 42 + 13, STR_NONE, STR_NONE }, // Type - { WWT_13, 1, COL_X_BH, COL_X_CH - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_BASE_HEIGHT }, // Base height - { WWT_13, 1, COL_X_CH, COL_X_GF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_CLEARANCE_HEIGHT }, // Clearance height - { WWT_13, 1, COL_X_GF, COL_X_BF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_GHOST }, // Ghost flag - { WWT_13, 1, COL_X_BF, COL_X_LF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_BROKEN }, // Broken flag - { WWT_13, 1, COL_X_LF, WW - 3, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_LAST }, // Last of tile flag + { WWT_13, 1, COL_X_TYPE, COL_X_BH - 1, 42, 42 + 13, STR_NONE, STR_NONE }, // Type + { WWT_13, 1, COL_X_BH, COL_X_CH - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_BASE_HEIGHT }, // Base height + { WWT_13, 1, COL_X_CH, COL_X_GF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_CLEARANCE_HEIGHT }, // Clearance height + { WWT_13, 1, COL_X_GF, COL_X_BF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_GHOST }, // Ghost flag + { WWT_13, 1, COL_X_BF, COL_X_LF - 1, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_BROKEN }, // Broken flag + { WWT_13, 1, COL_X_LF, WW - 3, 42, 42 + 13, STR_NONE, STR_TILE_INSPECTOR_FLAG_LAST }, // Last of tile flag { WIDGETS_END }, }; @@ -168,7 +170,7 @@ void window_tile_inspector_open() ); window->widgets = window_tile_inspector_widgets; window->enabled_widgets = (1 << WIDX_CLOSE); - window->disabled_widgets = (1 << WIDX_CORRUPT) | (1 << WIDX_MOVE_UP) | (1 << WIDX_MOVE_DOWN) | (1 << WIDX_REMOVE); + window->disabled_widgets = (1 << WIDX_CORRUPT) | (1 << WIDX_MOVE_UP) | (1 << WIDX_MOVE_DOWN) | (1 << WIDX_REMOVE) | (1 << WIDX_ROTATE); window_init_scroll_widgets(window); window->min_width = MIN_WW; @@ -188,17 +190,17 @@ static void window_tile_inspector_close(rct_window *w) tool_cancel(); } -void corrupt_element(int x, int y) { +void corrupt_element() { rct_map_element* mapElement; - mapElement = map_get_first_element_at(x, y); + mapElement = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y); while (!map_element_is_last_for_tile(mapElement++)); mapElement--; - mapElement = map_element_insert(x, y, mapElement->base_height, 0); + mapElement = map_element_insert(window_tile_inspector_tile_x, window_tile_inspector_tile_y, mapElement->base_height, 0); assert(mapElement != NULL); mapElement->type = (8 << 2); - map_invalidate_tile_full(x, y); + map_invalidate_tile_full(window_tile_inspector_tile_x, window_tile_inspector_tile_y); } void remove_element(int index) @@ -211,6 +213,42 @@ void remove_element(int index) map_invalidate_tile_full(window_tile_inspector_tile_x, window_tile_inspector_tile_y); } +void rotate_element(int index) +{ + uint8 new_rotation; + + assert(index < window_tile_inspector_item_count); + rct_map_element *mapElement = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y); + mapElement += index; + switch (map_element_get_type(mapElement)) + { + case MAP_ELEMENT_TYPE_PATH: // Only sloped paths have a direction + if (footpath_element_is_sloped(mapElement)) + { + new_rotation = (footpath_element_get_slope_direction(mapElement) + 1) & 3; + mapElement->properties.path.type &= ~3; + mapElement->properties.path.type |= new_rotation; + } + break; + case MAP_ELEMENT_TYPE_TRACK: + case MAP_ELEMENT_TYPE_SCENERY: + case MAP_ELEMENT_TYPE_ENTRANCE: + case MAP_ELEMENT_TYPE_FENCE: + new_rotation = (mapElement->type + 1) & 0x3; + mapElement->type &= ~0x3; + mapElement->type |= new_rotation; + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + case MAP_ELEMENT_TYPE_BANNER: + case MAP_ELEMENT_TYPE_CORRUPT: + default: + // Not rotating - button should be disabled + break; + } + + map_invalidate_tile_full(window_tile_inspector_tile_x << 5, window_tile_inspector_tile_y << 5); +} + // Swap element with its parent void swap_elements(sint16 first, sint16 second) { @@ -254,7 +292,7 @@ static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) window_close(w); break; case WIDX_CORRUPT: - corrupt_element(window_tile_inspector_tile_x, window_tile_inspector_tile_y); + corrupt_element(); w->scrolls[0].v_top = 0; w->selected_list_item = window_tile_inspector_item_count++; window_tile_inspector_auto_set_buttons(w); @@ -266,6 +304,9 @@ static void window_tile_inspector_mouseup(rct_window *w, int widgetIndex) window_tile_inspector_auto_set_buttons(w); widget_invalidate(w, WIDX_LIST); break; + case WIDX_ROTATE: + rotate_element(w->selected_list_item); + break; case WIDX_MOVE_DOWN: swap_elements(w->selected_list_item, w->selected_list_item + 1); w->selected_list_item++; @@ -359,8 +400,8 @@ static void window_tile_inspector_tool_down(rct_window* w, int widgetIndex, int w->disabled_widgets &= ~(1ULL << WIDX_CORRUPT); // undo selection and buttons affecting it w->selected_list_item = -1; - w->disabled_widgets |= (1ULL << WIDX_MOVE_UP) | (1ULL << WIDX_MOVE_DOWN) | (1ULL << WIDX_REMOVE); - w->enabled_widgets &= ~((1ULL << WIDX_MOVE_UP) | (1ULL << WIDX_MOVE_DOWN) | (1ULL << WIDX_REMOVE)); + w->disabled_widgets |= (1ULL << WIDX_MOVE_UP) | (1ULL << WIDX_MOVE_DOWN) | (1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE); + w->enabled_widgets &= ~((1ULL << WIDX_MOVE_UP) | (1ULL << WIDX_MOVE_DOWN) | (1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE)); w->scrolls[0].v_top = 0; window_invalidate(w); @@ -379,15 +420,16 @@ static void window_tile_inspector_scrollgetsize(rct_window *w, int scrollIndex, static void window_tile_inspector_auto_set_buttons(rct_window *w) { - // Remove button + // Map element buttons if (w->selected_list_item == -1) { // Check if anything is selected - w->disabled_widgets |= (1ULL << WIDX_REMOVE); - w->enabled_widgets &= ~(1ULL << WIDX_REMOVE); + w->disabled_widgets |= (1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE); + w->enabled_widgets &= ~((1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE)); } else { // Nothing is selected - w->disabled_widgets &= ~(1ULL << WIDX_REMOVE); - w->enabled_widgets |= (1ULL << WIDX_REMOVE); + w->disabled_widgets &= ~((1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE)); + w->enabled_widgets |= (1ULL << WIDX_REMOVE) | (1 << WIDX_ROTATE); } widget_invalidate(w, WIDX_REMOVE); + widget_invalidate(w, WIDX_ROTATE); // Move Up button if (w->selected_list_item <= 0) { // Top element in list, or -1