Add option to make water opaque

This commit is contained in:
Gymnasiast 2021-05-24 16:30:46 +02:00
parent ea47c3ffe9
commit 89eae5198b
No known key found for this signature in database
GPG Key ID: DBFFF47AB2CA3EDD
9 changed files with 57 additions and 28 deletions

View File

@ -3682,6 +3682,7 @@ STR_6436 :Toggle invisibility
STR_6437 :Invisible
STR_6438 :I
STR_6439 :Tile Inspector: Toggle invisibility
STR_6440 :Opaque water
#############
# Scenarios #

View File

@ -6,6 +6,7 @@
- Feature: [#14538] [Plugin] Add property for getting current plugin api version.
- Feature: [#14620] [Plugin] Add properties related to guest generation.
- Feature: [#14636] [Plugin] Add properties related to climate and weather.
- Feature: [#14731] Opaque water (like in RCT1).
- Change: [#14496] [Plugin] Rename Object to LoadedObject to fix conflicts with Typescript's Object interface.
- Change: [#14536] [Plugin] Rename ListView to ListViewWidget to make it consistent with names of other widgets.
- Fix: [#11829] Visual glitches and crashes when using RCT1 assets from mismatched or corrupt CSG1.DAT and CSG1i.DAT files.

View File

@ -127,19 +127,22 @@ enum FILE_MENU_DDIDX {
enum TOP_TOOLBAR_VIEW_MENU_DDIDX {
DDIDX_UNDERGROUND_INSIDE = 0,
DDIDX_HIDE_BASE = 1,
DDIDX_HIDE_VERTICAL = 2,
DDIDX_SEETHROUGH_RIDES = 4,
DDIDX_SEETHROUGH_SCENARY = 5,
DDIDX_SEETHROUGH_PATHS = 6,
DDIDX_INVISIBLE_SUPPORTS = 7,
DDIDX_INVISIBLE_PEEPS = 8,
DDIDX_LAND_HEIGHTS = 10,
DDIDX_TRACK_HEIGHTS = 11,
DDIDX_PATH_HEIGHTS = 12,
// 13 is a separator
DDIDX_VIEW_CLIPPING = 14,
DDIDX_HIGHLIGHT_PATH_ISSUES = 15,
DDIDX_OPAQUE_WATER = 1,
DDIDX_HIDE_BASE = 2,
DDIDX_HIDE_VERTICAL = 3,
// separator
DDIDX_SEETHROUGH_RIDES = 5,
DDIDX_SEETHROUGH_SCENERY = 6,
DDIDX_SEETHROUGH_PATHS = 7,
DDIDX_INVISIBLE_SUPPORTS = 8,
DDIDX_INVISIBLE_PEEPS = 9,
// separator
DDIDX_LAND_HEIGHTS = 11,
DDIDX_TRACK_HEIGHTS = 12,
DDIDX_PATH_HEIGHTS = 13,
// separator
DDIDX_VIEW_CLIPPING = 15,
DDIDX_HIGHLIGHT_PATH_ISSUES = 16,
TOP_TOOLBAR_VIEW_MENU_COUNT
};
@ -3607,14 +3610,14 @@ static void top_toolbar_network_menu_dropdown(int16_t dropdownIndex)
static void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget)
{
using namespace Dropdown;
constexpr Item items[] = {
ToggleOption(DDIDX_UNDERGROUND_INSIDE, STR_UNDERGROUND_VIEW),
ToggleOption(DDIDX_OPAQUE_WATER, STR_VIEWPORT_OPAQUE_WATER),
ToggleOption(DDIDX_HIDE_BASE, STR_REMOVE_BASE_LAND),
ToggleOption(DDIDX_HIDE_VERTICAL, STR_REMOVE_VERTICAL_FACES),
Separator(),
ToggleOption(DDIDX_SEETHROUGH_RIDES, STR_SEE_THROUGH_RIDES),
ToggleOption(DDIDX_SEETHROUGH_SCENARY, STR_SEE_THROUGH_SCENERY),
ToggleOption(DDIDX_SEETHROUGH_SCENERY, STR_SEE_THROUGH_SCENERY),
ToggleOption(DDIDX_SEETHROUGH_PATHS, STR_SEE_THROUGH_PATHS),
ToggleOption(DDIDX_INVISIBLE_SUPPORTS, STR_INVISIBLE_SUPPORTS),
ToggleOption(DDIDX_INVISIBLE_PEEPS, STR_INVISIBLE_PEOPLE),
@ -3626,6 +3629,7 @@ static void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget)
ToggleOption(DDIDX_VIEW_CLIPPING, STR_VIEW_CLIPPING_MENU),
ToggleOption(DDIDX_HIGHLIGHT_PATH_ISSUES, STR_HIGHLIGHT_PATH_ISSUES_MENU),
};
static_assert(ItemIDsMatchIndices(items));
SetItems(items);
@ -3637,33 +3641,41 @@ static void top_toolbar_init_view_menu(rct_window* w, rct_widget* widget)
// Set checkmarks
rct_viewport* mainViewport = window_get_main()->viewport;
if (mainViewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE)
Dropdown::SetChecked(0, true);
Dropdown::SetChecked(DDIDX_UNDERGROUND_INSIDE, true);
if (gConfigGeneral.opaque_water)
Dropdown::SetChecked(DDIDX_OPAQUE_WATER, true);
if (mainViewport->flags & VIEWPORT_FLAG_HIDE_BASE)
Dropdown::SetChecked(1, true);
Dropdown::SetChecked(DDIDX_HIDE_BASE, true);
if (mainViewport->flags & VIEWPORT_FLAG_HIDE_VERTICAL)
Dropdown::SetChecked(2, true);
Dropdown::SetChecked(DDIDX_HIDE_VERTICAL, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_RIDES)
Dropdown::SetChecked(4, true);
Dropdown::SetChecked(DDIDX_SEETHROUGH_RIDES, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_SCENERY)
Dropdown::SetChecked(5, true);
Dropdown::SetChecked(DDIDX_SEETHROUGH_SCENERY, true);
if (mainViewport->flags & VIEWPORT_FLAG_SEETHROUGH_PATHS)
Dropdown::SetChecked(6, true);
Dropdown::SetChecked(DDIDX_SEETHROUGH_PATHS, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
Dropdown::SetChecked(7, true);
Dropdown::SetChecked(DDIDX_INVISIBLE_SUPPORTS, true);
if (mainViewport->flags & VIEWPORT_FLAG_INVISIBLE_PEEPS)
Dropdown::SetChecked(8, true);
Dropdown::SetChecked(DDIDX_INVISIBLE_PEEPS, true);
if (mainViewport->flags & VIEWPORT_FLAG_LAND_HEIGHTS)
Dropdown::SetChecked(10, true);
Dropdown::SetChecked(DDIDX_LAND_HEIGHTS, true);
if (mainViewport->flags & VIEWPORT_FLAG_TRACK_HEIGHTS)
Dropdown::SetChecked(11, true);
Dropdown::SetChecked(DDIDX_TRACK_HEIGHTS, true);
if (mainViewport->flags & VIEWPORT_FLAG_PATH_HEIGHTS)
Dropdown::SetChecked(12, true);
Dropdown::SetChecked(DDIDX_PATH_HEIGHTS, true);
if (mainViewport->flags & VIEWPORT_FLAG_CLIP_VIEW)
Dropdown::SetChecked(DDIDX_VIEW_CLIPPING, true);
if (mainViewport->flags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)
Dropdown::SetChecked(DDIDX_HIGHLIGHT_PATH_ISSUES, true);
gDropdownDefaultIndex = DDIDX_UNDERGROUND_INSIDE;
// Opaque water relies on RCT1 sprites.
if (!is_csg_loaded())
{
Dropdown::SetDisabled(DDIDX_OPAQUE_WATER, true);
}
}
/**
@ -3680,6 +3692,10 @@ static void top_toolbar_view_menu_dropdown(int16_t dropdownIndex)
case DDIDX_UNDERGROUND_INSIDE:
w->viewport->flags ^= VIEWPORT_FLAG_UNDERGROUND_INSIDE;
break;
case DDIDX_OPAQUE_WATER:
gConfigGeneral.opaque_water ^= 1;
config_save_default();
break;
case DDIDX_HIDE_BASE:
w->viewport->flags ^= VIEWPORT_FLAG_HIDE_BASE;
break;
@ -3689,7 +3705,7 @@ static void top_toolbar_view_menu_dropdown(int16_t dropdownIndex)
case DDIDX_SEETHROUGH_RIDES:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES;
break;
case DDIDX_SEETHROUGH_SCENARY:
case DDIDX_SEETHROUGH_SCENERY:
w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY;
break;
case DDIDX_SEETHROUGH_PATHS:

View File

@ -227,6 +227,7 @@ namespace Config
model->show_real_names_of_guests = reader->GetBoolean("show_real_names_of_guests", true);
model->allow_early_completion = reader->GetBoolean("allow_early_completion", false);
model->transparent_screenshot = reader->GetBoolean("transparent_screenshot", true);
model->opaque_water = reader->GetBoolean("opaque_water", false);
model->last_version_check_time = reader->GetInt64("last_version_check_time", 0);
}
}
@ -304,6 +305,7 @@ namespace Config
writer->WriteBoolean("allow_early_completion", model->allow_early_completion);
writer->WriteEnum<VirtualFloorStyles>("virtual_floor_style", model->virtual_floor_style, Enum_VirtualFloorStyle);
writer->WriteBoolean("transparent_screenshot", model->transparent_screenshot);
writer->WriteBoolean("opaque_water", model->opaque_water);
writer->WriteInt64("last_version_check_time", model->last_version_check_time);
}

View File

@ -58,6 +58,7 @@ struct GeneralConfiguration
bool disable_lightning_effect;
bool show_guest_purchases;
bool transparent_screenshot;
bool opaque_water;
// Localisation
int32_t language;

View File

@ -49,6 +49,7 @@ enum
VIEWPORT_FLAG_CLIP_VIEW = (1 << 17),
VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES = (1 << 18),
VIEWPORT_FLAG_TRANSPARENT_BACKGROUND = (1 << 19),
VIEWPORT_FLAG_OPAQUE_WATER = (1 << 20),
};
enum class ViewportInteractionItem : uint8_t

View File

@ -3941,6 +3941,8 @@ enum
STR_TILE_INSPECTOR_INVISIBLE_SHORT = 6438,
STR_SHORTCUT_TOGGLE_INVISIBILITY = 6439,
STR_VIEWPORT_OPAQUE_WATER = 6440,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
/* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings
};

View File

@ -1315,7 +1315,9 @@ void surface_paint(paint_session* session, uint8_t direction, uint16_t height, c
| EnumValue(FilterPaletteID::PaletteWater) << 19;
PaintAddImageAsParent(session, image_id, 0, 0, 32, 32, -1, waterHeight);
PaintAttachToPreviousPS(session, SPR_WATER_OVERLAY + image_offset, 0, 0);
const bool opaque = (gConfigGeneral.opaque_water) && !(session->ViewFlags & VIEWPORT_FLAG_UNDERGROUND_INSIDE);
const uint32_t overlayStart = opaque ? SPR_RCT1_WATER_OVERLAY : SPR_WATER_OVERLAY;
PaintAttachToPreviousPS(session, overlayStart + image_offset, 0, 0);
if (!(session->ViewFlags & VIEWPORT_FLAG_HIDE_VERTICAL))
{

View File

@ -100,6 +100,9 @@ enum
SPR_TERRAIN_PATTERN_MARTIAN = 28995,
SPR_TERRAIN_PATTERN_GRASS_CLUMPS = 29001,
SPR_TERRAIN_PATTERN_ICE = 29007,
SPR_RCT1_WATER_MASK = SPR_CSG_BEGIN + 46787,
SPR_RCT1_WATER_OVERLAY = SPR_CSG_BEGIN + 46792,
};
#endif //_PAINT_SURFACE_H