diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index ca7d4cbfa5..0ff7c6b9f1 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3659,6 +3659,7 @@ STR_6467 :Nausea: {COMMA2DP32} STR_6468 :Not Yet Known STR_6469 :Adjust smaller area of patrol area STR_6470 :Adjust larger area of patrol area +STR_6471 :See-Through Vehicles ############# # Scenarios # diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index 52e71f0852..40507e95e9 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -137,17 +137,18 @@ enum TopToolbarViewMenuDdidx 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, + DDIDX_SEETHROUGH_VEHICLES = 6, + DDIDX_SEETHROUGH_SCENERY = 7, + DDIDX_SEETHROUGH_PATHS = 8, + DDIDX_INVISIBLE_SUPPORTS = 9, + DDIDX_INVISIBLE_PEEPS = 10, // separator - DDIDX_LAND_HEIGHTS = 11, - DDIDX_TRACK_HEIGHTS = 12, - DDIDX_PATH_HEIGHTS = 13, + DDIDX_LAND_HEIGHTS = 12, + DDIDX_TRACK_HEIGHTS = 13, + DDIDX_PATH_HEIGHTS = 14, // separator - DDIDX_VIEW_CLIPPING = 15, - DDIDX_HIGHLIGHT_PATH_ISSUES = 16, + DDIDX_VIEW_CLIPPING = 16, + DDIDX_HIGHLIGHT_PATH_ISSUES = 17, TOP_TOOLBAR_VIEW_MENU_COUNT, }; @@ -3624,6 +3625,7 @@ 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_SUPPORTS, STR_INVISIBLE_SUPPORTS), @@ -3657,6 +3659,8 @@ 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) @@ -3712,6 +3716,9 @@ static void TopToolbarViewMenuDropdown(int16_t dropdownIndex) case DDIDX_SEETHROUGH_RIDES: w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES; break; + case DDIDX_SEETHROUGH_VEHICLES: + w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_VEHICLES; + break; case DDIDX_SEETHROUGH_SCENERY: w->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY; break; diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index bbda3980fb..cbf876bcae 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -1319,7 +1319,8 @@ void viewport_set_visibility(uint8_t mode) uint32_t mask = VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_SEETHROUGH_RIDES | VIEWPORT_FLAG_SEETHROUGH_SCENERY | VIEWPORT_FLAG_SEETHROUGH_PATHS | VIEWPORT_FLAG_INVISIBLE_SUPPORTS | VIEWPORT_FLAG_LAND_HEIGHTS | VIEWPORT_FLAG_TRACK_HEIGHTS | VIEWPORT_FLAG_PATH_HEIGHTS - | VIEWPORT_FLAG_INVISIBLE_PEEPS | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL; + | VIEWPORT_FLAG_INVISIBLE_PEEPS | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL + | VIEWPORT_FLAG_SEETHROUGH_VEHICLES; invalidate += vp->flags & mask; vp->flags &= ~mask; diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index b2c655c195..4ad0369b58 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -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_SEETHROUGH_VEHICLES = (1 << 20), }; enum class ViewportInteractionItem : uint8_t diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 5d34226047..a15cd40197 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3928,6 +3928,8 @@ enum : uint16_t STR_ADJUST_SMALLER_PATROL_AREA_TIP = 6469, STR_ADJUST_LARGER_PATROL_AREA_TIP = 6470, + STR_SEE_THROUGH_VEHICLES = 6471, + // 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 }; diff --git a/src/openrct2/paint/Paint.cpp b/src/openrct2/paint/Paint.cpp index 84175fbc77..4001d22619 100644 --- a/src/openrct2/paint/Paint.cpp +++ b/src/openrct2/paint/Paint.cpp @@ -56,7 +56,7 @@ bool gPaintBlockedTiles; static void PaintAttachedPS(rct_drawpixelinfo* dpi, paint_struct* ps, uint32_t viewFlags); static void PaintPSImageWithBoundingBoxes(rct_drawpixelinfo* dpi, paint_struct* ps, ImageId imageId, int32_t x, int32_t y); static void PaintPSImage(rct_drawpixelinfo* dpi, paint_struct* ps, ImageId imageId, int32_t x, int32_t y); -static ImageId PaintPSColourifyImage(ImageId imageId, ViewportInteractionItem spriteType, uint32_t viewFlags); +static ImageId PaintPSColourifyImage(ImageId imageId, ViewportInteractionItem spriteType, EntityType entityType, uint32_t viewFlags); static int32_t RemapPositionToQuadrant(const paint_struct& ps, uint8_t rotation) { @@ -482,6 +482,17 @@ void PaintSessionArrange(PaintSessionCore& session) Guard::Assert(false); } +static EntityType GetEntityTypeFromPaintSession(const paint_struct* ps) +{ + auto entityType = EntityType::Null; + auto* entity = reinterpret_cast(ps->tileElement); + if (entity != nullptr) + { + entityType = entity->Type; + } + return entityType; +} + static void PaintDrawStruct(paint_session& session, paint_struct* ps) { rct_drawpixelinfo* dpi = &session.DPI; @@ -503,7 +514,8 @@ static void PaintDrawStruct(paint_session& session, paint_struct* ps) } } - auto imageId = PaintPSColourifyImage(ps->image_id, ps->sprite_type, session.ViewFlags); + auto entityType = GetEntityTypeFromPaintSession(ps); + auto imageId = PaintPSColourifyImage(ps->image_id, ps->sprite_type, entityType, session.ViewFlags); if (gPaintBoundingBoxes && dpi->zoom_level == ZoomLevel{ 0 }) { PaintPSImageWithBoundingBoxes(dpi, ps, imageId, x, y); @@ -553,7 +565,8 @@ static void PaintAttachedPS(rct_drawpixelinfo* dpi, paint_struct* ps, uint32_t v { auto screenCoords = ScreenCoordsXY{ attached_ps->x + ps->x, attached_ps->y + ps->y }; - auto imageId = PaintPSColourifyImage(attached_ps->image_id, ps->sprite_type, viewFlags); + auto entityType = GetEntityTypeFromPaintSession(ps); + auto imageId = PaintPSColourifyImage(attached_ps->image_id, ps->sprite_type, entityType, viewFlags); if (attached_ps->flags & PAINT_STRUCT_FLAG_IS_MASKED) { gfx_draw_sprite_raw_masked(dpi, screenCoords, imageId, attached_ps->colour_image_id); @@ -661,7 +674,7 @@ static void PaintPSImage(rct_drawpixelinfo* dpi, paint_struct* ps, ImageId image gfx_draw_sprite(dpi, imageId, { x, y }); } -static ImageId PaintPSColourifyImage(ImageId imageId, ViewportInteractionItem spriteType, uint32_t viewFlags) +static ImageId PaintPSColourifyImage(ImageId imageId, ViewportInteractionItem spriteType, EntityType entityType, uint32_t viewFlags) { auto seeThrough = imageId.WithTransparancy(FilterPaletteID::PaletteDarken1); if (viewFlags & VIEWPORT_FLAG_SEETHROUGH_RIDES) @@ -671,6 +684,13 @@ static ImageId PaintPSColourifyImage(ImageId imageId, ViewportInteractionItem sp return seeThrough; } } + if (viewFlags & VIEWPORT_FLAG_SEETHROUGH_VEHICLES) + { + if (spriteType == ViewportInteractionItem::Entity && entityType == EntityType::Vehicle) + { + return seeThrough; + } + } if (viewFlags & VIEWPORT_FLAG_UNDERGROUND_INSIDE) { if (spriteType == ViewportInteractionItem::Wall)