Add new Transparency options window.

Remove added options from Top Toolbar.
Move invisible ride code into ride paint functions.
Move invisible vehicle code into sprite paint function.
This commit is contained in:
Kane 2021-08-08 04:21:05 +10:00 committed by Ted John
parent 4856c3adaf
commit 204f8ceac1
12 changed files with 518 additions and 53 deletions

View File

@ -133,6 +133,8 @@ public:
return WindowViewportOpen();
case WC_WATER:
return WindowWaterOpen();
case WC_TRANSPARENCY:
return WindowTransparencyOpen();
default:
Console::Error::WriteLine("Unhandled window class (%d)", wc);
return nullptr;

View File

@ -188,6 +188,7 @@
<ClCompile Include="windows\TrackDesignManage.cpp" />
<ClCompile Include="windows\TrackDesignPlace.cpp" />
<ClCompile Include="windows\TrackList.cpp" />
<ClCompile Include="windows\Transparency.cpp" />
<ClCompile Include="windows\ViewClipping.cpp" />
<ClCompile Include="windows\Viewport.cpp" />
<ClCompile Include="windows\Water.cpp" />

View File

@ -1374,6 +1374,7 @@ rct_window* WindowRideOpenVehicle(Vehicle* vehicle)
static void WindowRideSetPage(rct_window* w, int32_t page)
{
int32_t listen;
auto ride = get_ride(w->number);
if (input_test_flag(INPUT_FLAG_TOOL_ACTIVE))
if (w->classification == gCurrentToolWidget.window_classification && w->number == gCurrentToolWidget.window_number)
@ -1419,6 +1420,17 @@ static void WindowRideSetPage(rct_window* w, int32_t page)
WindowInitScrollWidgets(w);
w->Invalidate();
if (listen != 0 && w->viewport != nullptr)
{
ride->is_visible = true;
log_info("Set ride to visible. Ride ID %u Window Number %u", ride->id, w->number);
}
else if (listen == 0 && w->viewport != nullptr)
{
ride->is_visible = false;
log_info("Set ride to invisible. Ride ID %u Window Number %u", ride->id, w->number);
}
if (listen != 0 && w->viewport != nullptr)
w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON;
}

View File

@ -137,21 +137,19 @@ enum TopToolbarViewMenuDdidx
DDIDX_HIDE_VERTICAL = 3,
// separator
DDIDX_SEETHROUGH_RIDES = 5,
DDIDX_SEETHROUGH_VEHICLES = 6,
DDIDX_SEETHROUGH_SCENERY = 7,
DDIDX_SEETHROUGH_PATHS = 8,
DDIDX_INVISIBLE_RIDES = 9,
DDIDX_INVISIBLE_SCENERY = 10,
DDIDX_INVISIBLE_PATHS = 11,
DDIDX_INVISIBLE_SUPPORTS = 12,
DDIDX_INVISIBLE_PEEPS = 13,
DDIDX_SEETHROUGH_SCENERY = 6,
DDIDX_SEETHROUGH_PATHS = 7,
DDIDX_INVISIBLE_SUPPORTS = 8,
DDIDX_INVISIBLE_PEEPS = 9,
// separator
DDIDX_LAND_HEIGHTS = 15,
DDIDX_TRACK_HEIGHTS = 16,
DDIDX_PATH_HEIGHTS = 17,
DDIDX_LAND_HEIGHTS = 11,
DDIDX_TRACK_HEIGHTS = 12,
DDIDX_PATH_HEIGHTS = 13,
// separator
DDIDX_VIEW_CLIPPING = 19,
DDIDX_HIGHLIGHT_PATH_ISSUES = 20,
DDIDX_VIEW_CLIPPING = 15,
DDIDX_HIGHLIGHT_PATH_ISSUES = 16,
// separator
DDIDX_TRANSPARENCY = 18,
TOP_TOOLBAR_VIEW_MENU_COUNT,
};
@ -3628,12 +3626,8 @@ static void TopToolbarInitViewMenu(rct_window* w, rct_widget* widget)
ToggleOption(DDIDX_HIDE_VERTICAL, STR_REMOVE_VERTICAL_FACES),
Separator(),
ToggleOption(DDIDX_SEETHROUGH_RIDES, STR_SEE_THROUGH_RIDES),
ToggleOption(DDIDX_SEETHROUGH_VEHICLES, STR_SEE_THROUGH_VEHICLES),
ToggleOption(DDIDX_SEETHROUGH_SCENERY, STR_SEE_THROUGH_SCENERY),
ToggleOption(DDIDX_SEETHROUGH_PATHS, STR_SEE_THROUGH_PATHS),
ToggleOption(DDIDX_INVISIBLE_RIDES, STR_INVISIBLE_RIDES),
ToggleOption(DDIDX_INVISIBLE_SCENERY, STR_INVISIBLE_SCENERY),
ToggleOption(DDIDX_INVISIBLE_PATHS, STR_INVISIBLE_PATHS),
ToggleOption(DDIDX_INVISIBLE_SUPPORTS, STR_INVISIBLE_SUPPORTS),
ToggleOption(DDIDX_INVISIBLE_PEEPS, STR_INVISIBLE_PEOPLE),
Separator(),
@ -3643,6 +3637,8 @@ static void TopToolbarInitViewMenu(rct_window* w, rct_widget* widget)
Separator(),
ToggleOption(DDIDX_VIEW_CLIPPING, STR_VIEW_CLIPPING_MENU),
ToggleOption(DDIDX_HIGHLIGHT_PATH_ISSUES, STR_HIGHLIGHT_PATH_ISSUES_MENU),
Separator(),
ToggleOption(DDIDX_TRANSPARENCY, STR_INVISIBLE_PEOPLE),
};
static_assert(ItemIDsMatchIndices(items));
@ -3665,18 +3661,10 @@ static void TopToolbarInitViewMenu(rct_window* w, rct_widget* widget)
Dropdown::SetChecked(DDIDX_HIDE_VERTICAL, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES)
Dropdown::SetChecked(DDIDX_SEETHROUGH_RIDES, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_VEHICLES)
Dropdown::SetChecked(DDIDX_SEETHROUGH_VEHICLES, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_SCENERY)
Dropdown::SetChecked(DDIDX_SEETHROUGH_SCENERY, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_PATHS)
Dropdown::SetChecked(DDIDX_SEETHROUGH_PATHS, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_RIDES)
Dropdown::SetChecked(DDIDX_INVISIBLE_RIDES, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_SCENERY)
Dropdown::SetChecked(DDIDX_INVISIBLE_SCENERY, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_PATHS)
Dropdown::SetChecked(DDIDX_INVISIBLE_PATHS, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
Dropdown::SetChecked(DDIDX_INVISIBLE_SUPPORTS, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS)
@ -3726,13 +3714,7 @@ static void TopToolbarViewMenuDropdown(int16_t dropdownIndex)
w->viewport->flags ^= VIEWPORT_FLAG_HIDE_VERTICAL;
break;
case DDIDX_SEETHROUGH_RIDES:
if (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES)
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES;
else
w->viewport->flags |= VIEWPORT_FLAG_SEETHROUGH_RIDES | VIEWPORT_FLAG_SEETHROUGH_VEHICLES;
break;
case DDIDX_SEETHROUGH_VEHICLES:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_VEHICLES;
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES;
break;
case DDIDX_SEETHROUGH_SCENERY:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY;
@ -3740,15 +3722,6 @@ static void TopToolbarViewMenuDropdown(int16_t dropdownIndex)
case DDIDX_SEETHROUGH_PATHS:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_PATHS;
break;
case DDIDX_INVISIBLE_RIDES:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_RIDES;
break;
case DDIDX_INVISIBLE_SCENERY:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_SCENERY;
break;
case DDIDX_INVISIBLE_PATHS:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_PATHS;
break;
case DDIDX_INVISIBLE_SUPPORTS:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_SUPPORTS;
break;
@ -3778,6 +3751,9 @@ static void TopToolbarViewMenuDropdown(int16_t dropdownIndex)
case DDIDX_HIGHLIGHT_PATH_ISSUES:
w->viewport->flags ^= VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES;
break;
case DDIDX_TRANSPARENCY:
context_open_window(WC_TRANSPARENCY);
break;
default:
return;
}

View File

@ -0,0 +1,465 @@
/*****************************************************************************
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include <algorithm>
#include <iterator>
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Widget.h>
#include <openrct2-ui/windows/Window.h>
#include <openrct2/Context.h>
#include <openrct2/Game.h>
#include <openrct2/OpenRCT2.h>
#include <openrct2/actions/ParkSetDateAction.h>
#include <openrct2/actions/SetCheatAction.h>
#include <openrct2/config/Config.h>
#include <openrct2/localisation/Date.h>
#include <openrct2/localisation/Localisation.h>
#include <openrct2/network/network.h>
#include <openrct2/sprites.h>
#include <openrct2/util/Util.h>
#include <openrct2/world/Climate.h>
#include <openrct2/world/Park.h>
#include <openrct2/world/Surface.h>
// clang-format off
enum
{
WINDOW_TRANSPARENCY_PAGE_MAIN,
WINDOW_TRANSPARENCY_PAGE_RIDES,
WINDOW_TRANSPARENCY_PAGE_MISC,
WINDOW_TRANSPARENCY_PAGE_COUNT,
};
enum WINDOW_TRANSPARENCY_WIDGET_IDX
{
WIDX_BACKGROUND,
WIDX_TITLE,
WIDX_CLOSE,
WIDX_PAGE_BACKGROUND,
WIDX_TAB_1,
WIDX_TAB_2,
WIDX_TAB_3,
WIDX_TAB_CONTENT,
WIDX_TERRAIN_GROUP = WIDX_TAB_CONTENT,
WIDX_UNDERGROUND_VIEW,
WIDX_TRANSPARENT_WATER,
WIDX_HIDE_BASE_LAND,
WIDX_HIDE_VERTICAL_FACES,
WIDX_SEE_THROUGH_GROUP,
WIDX_SEE_THROUGH_RIDES,
WIDX_SEE_THROUGH_VEHICLES,
WIDX_SEE_THROUGH_SCENERY,
WIDX_SEE_THROUGH_PATHS,
WIDX_INVISIBLE_GROUP,
WIDX_INVISIBLE_RIDES,
WIDX_INVISIBLE_SCENERY,
WIDX_INVISIBLE_PATHS,
WIDX_INVISIBLE_SUPPORTS,
WIDX_INVISIBLE_GUESTS,
WIDX_INVISIBLE_STAFF,
WIDX_PLACEHOLDER_RIDES = WIDX_TAB_CONTENT,
WIDX_PLACEHOLDER_MISC = WIDX_TAB_CONTENT,
};
#pragma region MEASUREMENTS
static constexpr const rct_string_id WINDOW_TITLE = STR_CHEAT_TITLE;
static constexpr const int32_t WW = 249;
static constexpr const int32_t WH = 300;
static constexpr ScreenSize CHEAT_BUTTON = {110, 17};
static constexpr ScreenSize CHEAT_CHECK = {221, 12};
static constexpr ScreenSize CHEAT_SPINNER = {117, 14};
static constexpr ScreenSize MINMAX_BUTTON = {55, 17};
static constexpr const int32_t TAB_WIDTH = 31;
static constexpr const int32_t TAB_START = 3;
#pragma endregion
#define MAIN_TRANSPARENCY_WIDGETS \
WINDOW_SHIM(WINDOW_TITLE, WW, WH), \
MakeWidget({ 0, 43}, {WW, 257}, WindowWidgetType::ImgBtn, WindowColour::Secondary), /* tab content panel */ \
MakeTab ({ 3, 17}, STR_FINANCIAL_CHEATS_TIP ), /* tab 1 */ \
MakeTab ({34, 17}, STR_RIDE_CHEATS_TIP ), /* tab 2 */ \
MakeTab ({65, 17}, STR_PARK_CHEATS_TIP ) /* tab 3 */
// 15px group padding top, 17px margin between lines, 17px group padding bottom. 22px group margin bottom
static rct_widget window_transparency_main_widgets[] =
{
MAIN_TRANSPARENCY_WIDGETS,
MakeWidget({ 5, 48}, {238, 83}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_SET_GUESTS_PARAMETERS), // General parameters group frame
MakeWidget({ 11, 63}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_UNDERGROUND_VIEW, STR_UNDERGROUND_VIEW),
MakeWidget({ 11, 80}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_VIEWPORT_TRANSPARENT_WATER, STR_VIEWPORT_TRANSPARENT_WATER),
MakeWidget({ 11, 97}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_REMOVE_BASE_LAND, STR_REMOVE_BASE_LAND),
MakeWidget({ 11, 114}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_REMOVE_VERTICAL_FACES, STR_REMOVE_VERTICAL_FACES),
MakeWidget({ 5, 136}, {238, 83}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_SET_GUESTS_PARAMETERS), // See-through parameters group frame
MakeWidget({ 11, 151}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_SEE_THROUGH_RIDES, STR_SEE_THROUGH_RIDES),
MakeWidget({ 11, 168}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_SEE_THROUGH_VEHICLES, STR_SEE_THROUGH_VEHICLES),
MakeWidget({ 11, 185}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_SEE_THROUGH_SCENERY, STR_SEE_THROUGH_SCENERY),
MakeWidget({ 11, 202}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_SEE_THROUGH_PATHS, STR_SEE_THROUGH_PATHS),
MakeWidget({ 5, 224}, {238, 117}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_SET_GUESTS_PARAMETERS), // Invisible parameters group frame
MakeWidget({ 11, 239}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_INVISIBLE_RIDES, STR_INVISIBLE_RIDES),
MakeWidget({ 11, 256}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_INVISIBLE_SCENERY, STR_INVISIBLE_SCENERY),
MakeWidget({ 11, 273}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_INVISIBLE_PATHS, STR_INVISIBLE_PATHS),
MakeWidget({ 11, 290}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_INVISIBLE_SUPPORTS, STR_INVISIBLE_SUPPORTS),
MakeWidget({ 11, 307}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_INVISIBLE_PEOPLE, STR_INVISIBLE_PEOPLE),
MakeWidget({ 11, 324}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_INVISIBLE_PEOPLE, STR_INVISIBLE_PEOPLE),
{ WIDGETS_END },
};
static rct_widget window_transparency_rides_widgets[] =
{
MAIN_TRANSPARENCY_WIDGETS,
MakeWidget({ 5, 48}, {238, 279}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_SET_GUESTS_PARAMETERS ), // Guests parameters group frame
{ WIDGETS_END },
};
//Strings for following moved to window_cheats_paint()
static rct_widget window_transparency_misc_widgets[] =
{
MAIN_TRANSPARENCY_WIDGETS,
MakeWidget ({ 5, 48}, {238, 60}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GENERAL_GROUP ), // General group
{ WIDGETS_END },
};
static rct_widget *window_transparency_page_widgets[] =
{
window_transparency_main_widgets,
window_transparency_rides_widgets,
window_transparency_misc_widgets,
};
#define MAIN_TRANSPARENCY_ENABLED_WIDGETS (1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3)
static uint64_t window_transparency_page_enabled_widgets[] = {
MAIN_TRANSPARENCY_ENABLED_WIDGETS |
(1ULL << WIDX_TERRAIN_GROUP) |
(1ULL << WIDX_UNDERGROUND_VIEW) |
(1ULL << WIDX_TRANSPARENT_WATER) |
(1ULL << WIDX_HIDE_BASE_LAND) |
(1ULL << WIDX_HIDE_VERTICAL_FACES) |
(1ULL << WIDX_SEE_THROUGH_GROUP) |
(1ULL << WIDX_SEE_THROUGH_RIDES) |
(1ULL << WIDX_SEE_THROUGH_VEHICLES) |
(1ULL << WIDX_SEE_THROUGH_SCENERY) |
(1ULL << WIDX_SEE_THROUGH_PATHS) |
(1ULL << WIDX_INVISIBLE_GROUP) |
(1ULL << WIDX_INVISIBLE_RIDES) |
(1ULL << WIDX_INVISIBLE_SCENERY) |
(1ULL << WIDX_INVISIBLE_PATHS) |
(1ULL << WIDX_INVISIBLE_SUPPORTS) |
(1ULL << WIDX_INVISIBLE_GUESTS) |
(1ULL << WIDX_INVISIBLE_STAFF),
MAIN_TRANSPARENCY_ENABLED_WIDGETS |
(1ULL << WIDX_PLACEHOLDER_RIDES),
MAIN_TRANSPARENCY_ENABLED_WIDGETS |
(1ULL << WIDX_PLACEHOLDER_MISC)
};
static uint64_t window_transparency_page_hold_down_widgets[] = {
WIDX_UNDERGROUND_VIEW,
};
static rct_string_id window_transparency_page_titles[] = {
STR_CHEAT_TITLE_FINANCIAL,
STR_CHEAT_TITLE_RIDE,
STR_CHEAT_TITLE_PARK,
};
// clang-format on
class TransparencyWindow final : public Window
{
private:
public:
void OnOpen() override
{
SetPage(WINDOW_TRANSPARENCY_PAGE_MAIN);
}
void OnUpdate() override
{
frame_no++;
InvalidateWidget(WIDX_TAB_1 + page);
}
void OnMouseDown(rct_widgetindex widgetIndex) override
{
// switch (page)
}
void OnMouseUp(rct_widgetindex widgetIndex) override
{
switch (widgetIndex)
{
case WIDX_CLOSE:
Close();
break;
case WIDX_TAB_1:
case WIDX_TAB_2:
case WIDX_TAB_3:
SetPage(widgetIndex - WIDX_TAB_1);
break;
default:
switch (page)
{
case WINDOW_TRANSPARENCY_PAGE_MAIN:
OnMouseUpMain(widgetIndex);
break;
}
break;
}
}
void OnDropdown(rct_widgetindex widgetIndex, int32_t selectedIndex) override
{
}
void OnMouseUpMain(rct_widgetindex widgetIndex)
{
rct_window* w = window_get_main();
if (w == nullptr)
return;
switch (widgetIndex)
{
case WIDX_UNDERGROUND_VIEW:
w->viewport->flags ^= VIEWPORT_FLAG_UNDERGROUND_INSIDE;
break;
case WIDX_TRANSPARENT_WATER:
gConfigGeneral.transparent_water ^= 1;
config_save_default();
break;
case WIDX_HIDE_BASE_LAND:
w->viewport->flags ^= VIEWPORT_FLAG_HIDE_BASE;
break;
case WIDX_HIDE_VERTICAL_FACES:
w->viewport->flags ^= VIEWPORT_FLAG_HIDE_VERTICAL;
break;
case WIDX_SEE_THROUGH_RIDES:
if (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES)
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES;
else
w->viewport->flags |= VIEWPORT_FLAG_SEETHROUGH_RIDES | VIEWPORT_FLAG_SEETHROUGH_VEHICLES;
break;
case WIDX_SEE_THROUGH_VEHICLES:
if (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_VEHICLES)
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_VEHICLES;
else
w->viewport->flags |= VIEWPORT_FLAG_SEETHROUGH_RIDES | VIEWPORT_FLAG_SEETHROUGH_VEHICLES;
break;
case WIDX_SEE_THROUGH_SCENERY:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY;
break;
case WIDX_SEE_THROUGH_PATHS:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_PATHS;
break;
case WIDX_INVISIBLE_RIDES:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_RIDES;
break;
case WIDX_INVISIBLE_SCENERY:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_SCENERY;
break;
case WIDX_INVISIBLE_PATHS:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_PATHS;
break;
case WIDX_INVISIBLE_SUPPORTS:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_SUPPORTS;
break;
case WIDX_INVISIBLE_GUESTS:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_PEEPS;
break;
case WIDX_INVISIBLE_STAFF:
w->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_PEEPS;
break;
}
}
void OnPrepareDraw() override
{
auto* targetWidgets = window_transparency_page_widgets[page];
if (widgets != targetWidgets)
{
widgets = targetWidgets;
WindowInitScrollWidgets(this);
}
pressed_widgets = 0;
disabled_widgets = 0;
// Set correct active tab
for (auto i = 0; i < WINDOW_TRANSPARENCY_PAGE_COUNT; i++)
SetWidgetPressed(WIDX_TAB_1 + i, false);
SetWidgetPressed(WIDX_TAB_1 + page, true);
// Set title
widgets[WIDX_TITLE].text = window_transparency_page_titles[page];
rct_window* w = window_get_main();
if (w == nullptr)
return;
switch (page)
{
case WINDOW_TRANSPARENCY_PAGE_MAIN:
SetCheckboxValue(WIDX_UNDERGROUND_VIEW, (w->viewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE));
SetCheckboxValue(WIDX_TRANSPARENT_WATER, (gConfigGeneral.transparent_water == 1));
SetCheckboxValue(WIDX_HIDE_BASE_LAND, (w->viewport->flags & VIEWPORT_FLAG_HIDE_BASE));
SetCheckboxValue(WIDX_HIDE_VERTICAL_FACES, (w->viewport->flags & VIEWPORT_FLAG_HIDE_VERTICAL));
SetCheckboxValue(WIDX_SEE_THROUGH_RIDES, (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES));
SetCheckboxValue(WIDX_SEE_THROUGH_VEHICLES, (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_VEHICLES));
SetCheckboxValue(WIDX_SEE_THROUGH_SCENERY, (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_SCENERY));
SetCheckboxValue(WIDX_SEE_THROUGH_PATHS, (w->viewport->flags & VIEWPORT_FLAG_SEETHROUGH_PATHS));
SetCheckboxValue(WIDX_INVISIBLE_RIDES, (w->viewport->flags & VIEWPORT_FLAG_INVISIBLE_RIDES));
SetCheckboxValue(WIDX_INVISIBLE_PATHS, (w->viewport->flags & VIEWPORT_FLAG_INVISIBLE_PATHS));
SetCheckboxValue(WIDX_INVISIBLE_SUPPORTS, (w->viewport->flags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS));
SetCheckboxValue(WIDX_INVISIBLE_GUESTS, (w->viewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS));
SetCheckboxValue(WIDX_INVISIBLE_STAFF, (w->viewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS));
break;
}
}
void OnDraw(rct_drawpixelinfo& dpi) override
{
UpdateTabPositions();
DrawWidgets(dpi);
DrawTabImages(dpi);
}
void OnTextInput(rct_widgetindex widgetIndex, std::string_view text) override
{
}
OpenRCT2String OnTooltip(rct_widgetindex widgetIndex, rct_string_id fallback) override
{
return { fallback, {} };
}
private:
void SetPage(int32_t p)
{
page = p;
frame_no = 0;
enabled_widgets = window_transparency_page_enabled_widgets[p];
hold_down_widgets = window_transparency_page_hold_down_widgets[p];
pressed_widgets = 0;
widgets = window_transparency_page_widgets[p];
auto maxY = 0;
auto* widget = &widgets[WIDX_TAB_CONTENT];
while (widget->type != WindowWidgetType::Last)
{
maxY = std::max<int32_t>(maxY, widget->bottom);
widget++;
}
maxY += 6;
Invalidate();
height = maxY;
widgets[WIDX_BACKGROUND].bottom = maxY - 1;
widgets[WIDX_PAGE_BACKGROUND].bottom = maxY - 1;
Invalidate();
}
void UpdateTabPositions()
{
constexpr const uint16_t tabs[] = {
WIDX_TAB_1,
WIDX_TAB_2,
WIDX_TAB_3,
};
auto left = TAB_START;
for (auto tab : tabs)
{
widgets[tab].left = left;
if (!IsWidgetDisabled(tab))
{
left += TAB_WIDTH;
}
}
}
void DrawTabImages(rct_drawpixelinfo& dpi)
{
// Money tab
if (!IsWidgetDisabled(WIDX_TAB_1))
{
uint32_t sprite_idx = SPR_TAB_FINANCES_SUMMARY_0;
if (page == WINDOW_TRANSPARENCY_PAGE_MAIN)
sprite_idx += (frame_no / 2) % 8;
gfx_draw_sprite(
&dpi, ImageId(sprite_idx), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_1].left, widgets[WIDX_TAB_1].top });
}
// Rides tab
if (!IsWidgetDisabled(WIDX_TAB_2))
{
uint32_t sprite_idx = SPR_TAB_RIDE_0;
if (page == WINDOW_TRANSPARENCY_PAGE_RIDES)
sprite_idx += (frame_no / 4) % 16;
gfx_draw_sprite(
&dpi, ImageId(sprite_idx), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_2].left, widgets[WIDX_TAB_2].top });
}
// Guests tab
if (!IsWidgetDisabled(WIDX_TAB_3))
{
uint32_t sprite_idx = SPR_TAB_GUESTS_0;
if (page == WINDOW_TRANSPARENCY_PAGE_MISC)
sprite_idx += (frame_no / 3) % 8;
gfx_draw_sprite(
&dpi, ImageId(sprite_idx), windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_3].left, widgets[WIDX_TAB_3].top });
}
}
void OnMouseDownMisc(rct_widgetindex widgetIndex)
{
// auto* widget = &widgets[widgetIndex];
}
void OnMouseUpMisc(rct_widgetindex widgetIndex)
{
}
void OnDropdownMisc(rct_widgetindex widgetIndex, int32_t dropdownIndex)
{
}
void OnMouseDownRides(rct_widgetindex widgetIndex)
{
}
void OnMouseUpRides(rct_widgetindex widgetIndex)
{
}
};
rct_window* WindowTransparencyOpen()
{
auto* window = window_bring_to_front_by_class(WC_TRANSPARENCY);
if (window == nullptr)
{
window = WindowCreate<TransparencyWindow>(WC_TRANSPARENCY, ScreenCoordsXY(32, 32), WW, WH);
}
return window;
}

View File

@ -75,6 +75,7 @@ rct_window* WindowTitleOptionsOpen();
rct_window* WindowViewportOpen();
rct_window* WindowWaterOpen();
rct_window* WindowViewClippingOpen();
rct_window* WindowTransparencyOpen();
// WC_FINANCES
rct_window* WindowFinancesOpen();

View File

@ -463,6 +463,7 @@ enum
WC_VIEW_CLIPPING = 131,
WC_OBJECT_LOAD_ERROR = 132,
WC_PATROL_AREA = 133,
WC_TRANSPARENCY = 134,
// Only used for colour schemes
WC_STAFF = 220,

View File

@ -73,8 +73,19 @@ void EntityPaintSetup(paint_session& session, const CoordsXY& pos)
}
}
const auto entityPos = spr->GetLocation();
if ((session.ViewFlags & VIEWPORT_FLAG_INVISIBLE_RIDES) && spr->Type == EntityType::Vehicle)
{
const auto veh = spr->As<Vehicle>();
if (veh != nullptr)
{
auto ride = get_ride(veh->ride);
if (ride != nullptr && !ride->is_visible)
return;
}
}
const auto entityPos = spr->GetLocation();
// Only paint sprites that are below the clip height and inside the clip selection.
// Here converting from land/path/etc height scale to pixel height scale.
// Note: peeps/scenery on slopes will be above the base

View File

@ -722,17 +722,6 @@ static ImageId PaintPSColourifyImage(ImageId imageId, ViewportInteractionItem sp
break;
}
}
if (viewFlags & VIEWPORT_FLAG_INVISIBLE_RIDES)
{
if (spriteType == ViewportInteractionItem::Ride)
{
return ImageId();
}
else if (spriteType == ViewportInteractionItem::Entity && entityType == EntityType::Vehicle)
{
return ImageId();
}
}
if (viewFlags & VIEWPORT_FLAG_INVISIBLE_PATHS)
{
switch (spriteType)

View File

@ -124,6 +124,9 @@ static void PaintRideEntranceExit(paint_session& session, uint8_t direction, int
{
return;
}
if ((session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_RIDES) && ride->is_visible == false)
return;
auto stationObj = ride->GetStationObject();
if (stationObj == nullptr || stationObj->BaseImageId == ImageIndexUndefined)

View File

@ -287,6 +287,7 @@ public:
uint16_t inversions;
uint16_t holes;
uint8_t sheltered_eighths;
bool is_visible = false;
std::unique_ptr<RideMeasurement> measurement;

View File

@ -2195,6 +2195,9 @@ void PaintTrack(paint_session& session, Direction direction, int32_t height, con
return;
}
if ((session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_RIDES) && ride->is_visible == false)
return;
if ((!gTrackDesignSaveMode || rideIndex == gTrackDesignSaveRideIndex)
&& !(session.ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES))
{