diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index da89d1af38..bc9d366fe9 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4508,6 +4508,8 @@ STR_6198 :{BLACK}Day: STR_6199 :Set date STR_6200 :Reset date STR_6201 :{MONTH} +STR_6202 :Enable virtual floor +STR_6203 :{SMALLFONT}{BLACK}When enabled, a virtual floor will be rendered when holding Ctrl or Shift to ease vertical placement of elements. ############# # Scenarios # diff --git a/src/openrct2-ui/input/Input.cpp b/src/openrct2-ui/input/Input.cpp index 2445ebd27a..b4d8d6cb48 100644 --- a/src/openrct2-ui/input/Input.cpp +++ b/src/openrct2-ui/input/Input.cpp @@ -169,13 +169,12 @@ void input_handle_keyboard(bool isTitle) } } - if (gInputPlaceObjectModifier & (PLACE_OBJECT_MODIFIER_COPY_Z | PLACE_OBJECT_MODIFIER_SHIFT_Z)) + if (gConfigGeneral.use_virtual_floor) { - map_enable_virtual_floor(); - } - else - { - map_remove_virtual_floor(); + if (gInputPlaceObjectModifier & (PLACE_OBJECT_MODIFIER_COPY_Z | PLACE_OBJECT_MODIFIER_SHIFT_Z)) + map_enable_virtual_floor(); + else + map_remove_virtual_floor(); } // Handle key input diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 602ba906e3..3a2ebe0526 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -101,6 +101,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_RENDERING_GROUP = WIDX_PAGE_START, WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, + WIDX_VIRTUAL_FLOOR_CHECKBOX, WIDX_DAY_NIGHT_CHECKBOX, WIDX_ENABLE_LIGHT_FX_CHECKBOX, WIDX_UPPER_CASE_BANNERS_CHECKBOX, @@ -247,15 +248,16 @@ static rct_widget window_options_display_widgets[] = { static rct_widget window_options_rendering_widgets[] = { MAIN_OPTIONS_WIDGETS, #define FRAME_RENDERING_START 53 - { WWT_GROUPBOX, 1, 5, 304, FRAME_RENDERING_START + 0, FRAME_RENDERING_START + 136, STR_RENDERING_GROUP, STR_NONE }, // Rendering group + { WWT_GROUPBOX, 1, 5, 304, FRAME_RENDERING_START + 0, FRAME_RENDERING_START + 151, STR_RENDERING_GROUP, STR_NONE }, // Rendering group { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 15, FRAME_RENDERING_START + 26, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // Landscape smoothing { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 30, FRAME_RENDERING_START + 41, STR_GRIDLINES, STR_GRIDLINES_TIP }, // Gridlines - { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 45, FRAME_RENDERING_START + 56, STR_CYCLE_DAY_NIGHT, STR_CYCLE_DAY_NIGHT_TIP }, // Cycle day-night - { WWT_CHECKBOX, 1, 25, 290, FRAME_RENDERING_START + 60, FRAME_RENDERING_START + 71, STR_ENABLE_LIGHTING_EFFECTS, STR_ENABLE_LIGHTING_EFFECTS_TIP }, // Enable light fx - { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 75, FRAME_RENDERING_START + 86, STR_UPPERCASE_BANNERS, STR_UPPERCASE_BANNERS_TIP }, // Uppercase banners - { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 90, FRAME_RENDERING_START + 101, STR_RENDER_WEATHER_EFFECTS, STR_RENDER_WEATHER_EFFECTS_TIP }, // Render weather effects - { WWT_CHECKBOX, 1, 25, 290, FRAME_RENDERING_START + 105, FRAME_RENDERING_START + 116, STR_DISABLE_LIGHTNING_EFFECT, STR_DISABLE_LIGHTNING_EFFECT_TIP }, // Disable lightning effect - { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 120, FRAME_RENDERING_START + 131, STR_SHOW_GUEST_PURCHASES, STR_SHOW_GUEST_PURCHASES_TIP }, + { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 45, FRAME_RENDERING_START + 56, STR_ENABLE_VIRTUAL_FLOOR, STR_ENABLE_VIRTUAL_FLOOR_TIP }, // Virtual floor + { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 60, FRAME_RENDERING_START + 71, STR_CYCLE_DAY_NIGHT, STR_CYCLE_DAY_NIGHT_TIP }, // Cycle day-night + { WWT_CHECKBOX, 1, 25, 290, FRAME_RENDERING_START + 75, FRAME_RENDERING_START + 86, STR_ENABLE_LIGHTING_EFFECTS, STR_ENABLE_LIGHTING_EFFECTS_TIP }, // Enable light fx + { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 90, FRAME_RENDERING_START + 101, STR_UPPERCASE_BANNERS, STR_UPPERCASE_BANNERS_TIP }, // Uppercase banners + { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 105, FRAME_RENDERING_START + 116, STR_RENDER_WEATHER_EFFECTS, STR_RENDER_WEATHER_EFFECTS_TIP }, // Render weather effects + { WWT_CHECKBOX, 1, 25, 290, FRAME_RENDERING_START + 120, FRAME_RENDERING_START + 131, STR_DISABLE_LIGHTNING_EFFECT, STR_DISABLE_LIGHTNING_EFFECT_TIP }, // Disable lightning effect + { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 135, FRAME_RENDERING_START + 146, STR_SHOW_GUEST_PURCHASES, STR_SHOW_GUEST_PURCHASES_TIP }, #undef FRAME_RENDERING_START { WIDGETS_END }, }; @@ -504,8 +506,6 @@ static uint64 window_options_page_enabled_widgets[] = { (1 << WIDX_RESOLUTION_DROPDOWN) | (1 << WIDX_FULLSCREEN) | (1 << WIDX_FULLSCREEN_DROPDOWN) | - (1 << WIDX_TILE_SMOOTHING_CHECKBOX) | - (1 << WIDX_GRIDLINES_CHECKBOX) | (1 << WIDX_DRAWING_ENGINE) | (1 << WIDX_DRAWING_ENGINE_DROPDOWN) | (1 << WIDX_UNCAP_FPS_CHECKBOX) | @@ -522,6 +522,7 @@ static uint64 window_options_page_enabled_widgets[] = { MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_TILE_SMOOTHING_CHECKBOX) | (1 << WIDX_GRIDLINES_CHECKBOX) | + (1 << WIDX_VIRTUAL_FLOOR_CHECKBOX) | (1 << WIDX_DAY_NIGHT_CHECKBOX) | (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX) | (1 << WIDX_UPPER_CASE_BANNERS_CHECKBOX) | @@ -710,6 +711,11 @@ static void window_options_mouseup(rct_window *w, rct_widgetindex widgetIndex) w->viewport->flags &= ~VIEWPORT_FLAG_GRIDLINES; } break; + case WIDX_VIRTUAL_FLOOR_CHECKBOX: + gConfigGeneral.use_virtual_floor ^= 1; + config_save_default(); + window_invalidate(w); + break; case WIDX_DAY_NIGHT_CHECKBOX: gConfigGeneral.day_night_cycle ^= 1; config_save_default(); @@ -1591,6 +1597,7 @@ static void window_options_invalidate(rct_window *w) { widget_set_checkbox_value(w, WIDX_TILE_SMOOTHING_CHECKBOX, gConfigGeneral.landscape_smoothing); widget_set_checkbox_value(w, WIDX_GRIDLINES_CHECKBOX, gConfigGeneral.always_show_gridlines); + widget_set_checkbox_value(w, WIDX_VIRTUAL_FLOOR_CHECKBOX, gConfigGeneral.use_virtual_floor); widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); widget_set_checkbox_value(w, WIDX_ENABLE_LIGHT_FX_CHECKBOX, gConfigGeneral.enable_light_fx); if (gConfigGeneral.day_night_cycle && @@ -1618,6 +1625,7 @@ static void window_options_invalidate(rct_window *w) window_options_rendering_widgets[WIDX_TILE_SMOOTHING_CHECKBOX].type = WWT_CHECKBOX; window_options_rendering_widgets[WIDX_GRIDLINES_CHECKBOX].type = WWT_CHECKBOX; + window_options_rendering_widgets[WIDX_VIRTUAL_FLOOR_CHECKBOX].type = WWT_CHECKBOX; window_options_rendering_widgets[WIDX_DAY_NIGHT_CHECKBOX].type = WWT_CHECKBOX; window_options_rendering_widgets[WIDX_ENABLE_LIGHT_FX_CHECKBOX].type = WWT_CHECKBOX; window_options_rendering_widgets[WIDX_UPPER_CASE_BANNERS_CHECKBOX].type = WWT_CHECKBOX; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index b0023b58ec..dced841339 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1285,7 +1285,10 @@ static void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid *parameter_2 = (cl ^ (1 << 1)) | (gWindowSceneryPrimaryColour << 8); *parameter_3 = rotation | (gWindowScenerySecondaryColour << 16); - map_set_virtual_floor_height(gSceneryPlaceZ); + if (gConfigGeneral.use_virtual_floor) + { + map_set_virtual_floor_height(gSceneryPlaceZ); + } return; } @@ -1538,7 +1541,10 @@ static void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid } } - map_set_virtual_floor_height(gSceneryPlaceZ); + if (gConfigGeneral.use_virtual_floor) + { + map_set_virtual_floor_height(gSceneryPlaceZ); + } } /** @@ -2368,7 +2374,11 @@ static money32 try_place_ghost_scenery(LocationXY16 map_tile, uint32 parameter_1 static void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_selection_rect(); map_invalidate_map_selection_tiles(); - map_invalidate_virtual_floor_tiles(); + + if (gConfigGeneral.use_virtual_floor) + { + map_invalidate_virtual_floor_tiles(); + } gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_CONSTRUCT; diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index 8e9b711578..7ae2919d11 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -168,6 +168,7 @@ namespace Config model->drawing_engine = reader->GetEnum("drawing_engine", DRAWING_ENGINE_SOFTWARE, Enum_DrawingEngine); model->uncap_fps = reader->GetBoolean("uncap_fps", false); model->use_vsync = reader->GetBoolean("use_vsync", true); + model->use_virtual_floor = reader->GetBoolean("use_virtual_floor", true); // Default config setting is false until ghost trains are implemented #4540 model->test_unfinished_tracks = reader->GetBoolean("test_unfinished_tracks", false); @@ -277,6 +278,7 @@ namespace Config writer->WriteBoolean("render_weather_gloom", model->render_weather_gloom); writer->WriteBoolean("show_guest_purchases", model->show_guest_purchases); writer->WriteBoolean("show_real_names_of_guests", model->show_real_names_of_guests); + writer->WriteBoolean("use_virtual_floor", model->use_virtual_floor); } static void ReadInterface(IIniReader * reader) diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index f6b1f66b38..25a8e87cb3 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -42,6 +42,7 @@ typedef struct GeneralConfiguration // Map rendering bool landscape_smoothing; bool always_show_gridlines; + bool use_virtual_floor; bool day_night_cycle; bool enable_light_fx; bool upper_case_banners; diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 845c1a4795..a4c59856f8 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3855,6 +3855,9 @@ enum { STR_DATE_RESET = 6200, STR_FORMAT_MONTH = 6201, + STR_ENABLE_VIRTUAL_FLOOR = 6202, + STR_ENABLE_VIRTUAL_FLOOR_TIP = 6203, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/openrct2/paint/tile_element/TileElement.cpp b/src/openrct2/paint/tile_element/TileElement.cpp index 9812f34823..542d9bf7de 100644 --- a/src/openrct2/paint/tile_element/TileElement.cpp +++ b/src/openrct2/paint/tile_element/TileElement.cpp @@ -155,7 +155,10 @@ static void sub_68B3FB(paint_session * session, sint32 x, sint32 y) bool partOfVirtualFloor = false; #ifndef __TESTPAINT__ - partOfVirtualFloor = map_tile_is_part_of_virtual_floor(session->MapPosition.x, session->MapPosition.y); + if (gConfigGeneral.use_virtual_floor) + { + partOfVirtualFloor = map_tile_is_part_of_virtual_floor(session->MapPosition.x, session->MapPosition.y); + } #endif // __TESTPAINT__ /* Check if the first (lowest) tile_element is below the clip @@ -332,7 +335,7 @@ static void sub_68B3FB(paint_session * session, sint32 x, sint32 y) } while (!tile_element_is_last_for_tile(tile_element++)); #ifndef __TESTPAINT__ - if (partOfVirtualFloor) + if (gConfigGeneral.use_virtual_floor && partOfVirtualFloor) { virtual_floor_paint(session); }