mirror of https://github.com/OpenRCT2/OpenRCT2.git
Refactor viewport interaction flags and add plugin API
This commit is contained in:
parent
27013d147a
commit
762b6ee816
|
@ -1904,6 +1904,12 @@ declare global {
|
|||
id: string;
|
||||
cursor?: CursorType;
|
||||
|
||||
/**
|
||||
* What types of object in the game can be selected with the tool.
|
||||
* E.g. only specify terrain if you only want a tile selection.
|
||||
*/
|
||||
filter?: ToolFilter[];
|
||||
|
||||
onStart?: () => void;
|
||||
onDown?: (e: ToolEventArgs) => void;
|
||||
onMove?: (e: ToolEventArgs) => void;
|
||||
|
@ -1940,6 +1946,20 @@ declare global {
|
|||
"water_down" |
|
||||
"zzz";
|
||||
|
||||
type ToolFilter =
|
||||
"terrain" |
|
||||
"entity" |
|
||||
"ride" |
|
||||
"water" |
|
||||
"scenery" |
|
||||
"footpath" |
|
||||
"footpath_item" |
|
||||
"park_entrance" |
|
||||
"wall" |
|
||||
"large_scenery" |
|
||||
"label" |
|
||||
"banner";
|
||||
|
||||
/**
|
||||
* Represents the type of a widget, e.g. button or label.
|
||||
*/
|
||||
|
|
|
@ -65,7 +65,7 @@ InteractionInfo ViewportInteractionGetItemLeft(const ScreenCoordsXY& screenCoord
|
|||
|
||||
info = get_map_coordinates_from_pos(
|
||||
screenCoords,
|
||||
VIEWPORT_INTERACTION_MASK_ENTITY & VIEWPORT_INTERACTION_MASK_RIDE & VIEWPORT_INTERACTION_MASK_PARK_ENTRANCE);
|
||||
EnumsToFlags(ViewportInteractionItem::Entity, ViewportInteractionItem::Ride, ViewportInteractionItem::ParkEntrance));
|
||||
auto tileElement = info.SpriteType != ViewportInteractionItem::Entity ? info.Element : nullptr;
|
||||
// Only valid when info.SpriteType == ViewportInteractionItem::Entity, but can't assign nullptr without compiler
|
||||
// complaining
|
||||
|
@ -261,7 +261,8 @@ InteractionInfo ViewportInteractionGetItemRight(const ScreenCoordsXY& screenCoor
|
|||
if ((gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) && gS6Info.editor_step != EditorStep::RollercoasterDesigner)
|
||||
return info;
|
||||
|
||||
info = get_map_coordinates_from_pos(screenCoords, ~(VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER));
|
||||
auto flags = static_cast<int32_t>(~EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water));
|
||||
info = get_map_coordinates_from_pos(screenCoords, flags);
|
||||
auto tileElement = info.Element;
|
||||
|
||||
switch (info.SpriteType)
|
||||
|
@ -761,7 +762,7 @@ CoordsXY ViewportInteractionGetTileStartAtCursor(const ScreenCoordsXY& screenCoo
|
|||
}
|
||||
auto viewport = window->viewport;
|
||||
auto info = get_map_coordinates_from_pos_window(
|
||||
window, screenCoords, VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER);
|
||||
window, screenCoords, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water));
|
||||
auto initialPos = info.Loc;
|
||||
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
|
|
|
@ -27,6 +27,21 @@ namespace OpenRCT2::Scripting
|
|||
"volcano_down", "walk_down", "paint_down", "entrance_down", "hand_open", "hand_closed",
|
||||
};
|
||||
|
||||
static const DukEnumMap<ViewportInteractionItem> ToolFilterMap({
|
||||
{ "terrain", ViewportInteractionItem::Terrain },
|
||||
{ "entity", ViewportInteractionItem::Entity },
|
||||
{ "ride", ViewportInteractionItem::Ride },
|
||||
{ "water", ViewportInteractionItem::Water },
|
||||
{ "scenery", ViewportInteractionItem::Scenery },
|
||||
{ "footpath", ViewportInteractionItem::Footpath },
|
||||
{ "footpath_item", ViewportInteractionItem::FootpathItem },
|
||||
{ "park_entrance", ViewportInteractionItem::ParkEntrance },
|
||||
{ "wall", ViewportInteractionItem::Wall },
|
||||
{ "large_scenery", ViewportInteractionItem::LargeScenery },
|
||||
{ "label", ViewportInteractionItem::Label },
|
||||
{ "banner", ViewportInteractionItem::Banner },
|
||||
});
|
||||
|
||||
template<> DukValue ToDuk(duk_context* ctx, const CursorID& cursorId)
|
||||
{
|
||||
auto value = EnumValue(cursorId);
|
||||
|
@ -120,9 +135,7 @@ namespace OpenRCT2::Scripting
|
|||
if (dukHandler.is_function())
|
||||
{
|
||||
auto ctx = dukHandler.context();
|
||||
|
||||
auto flags = 0;
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, flags);
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, Filter);
|
||||
|
||||
DukObject obj(dukHandler.context());
|
||||
obj.Set("isDown", MouseDown);
|
||||
|
@ -172,6 +185,26 @@ namespace OpenRCT2::Scripting
|
|||
{
|
||||
customTool.Cursor = CursorID::Arrow;
|
||||
}
|
||||
|
||||
auto dukFilter = dukValue["filter"];
|
||||
if (dukFilter.is_array())
|
||||
{
|
||||
customTool.Filter = 0;
|
||||
auto dukItems = dukFilter.as_array();
|
||||
for (const auto& dukItem : dukItems)
|
||||
{
|
||||
if (dukItem.type() == DukValue::Type::STRING)
|
||||
{
|
||||
auto value = ToolFilterMap[dukItem.as_string()];
|
||||
customTool.Filter |= static_cast<uint32_t>(EnumToFlag(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
customTool.Filter = ViewportInteractionItemAll;
|
||||
}
|
||||
|
||||
customTool.onStart = dukValue["onStart"];
|
||||
customTool.onDown = dukValue["onDown"];
|
||||
customTool.onMove = dukValue["onMove"];
|
||||
|
|
|
@ -49,6 +49,7 @@ namespace OpenRCT2::Scripting
|
|||
std::shared_ptr<Plugin> Owner;
|
||||
std::string Id;
|
||||
CursorID Cursor = CursorID::Undefined;
|
||||
uint32_t Filter{};
|
||||
bool MouseDown{};
|
||||
|
||||
// Event handlers
|
||||
|
|
|
@ -710,7 +710,7 @@ static void window_footpath_set_provisional_path_at_point(const ScreenCoordsXY&
|
|||
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW;
|
||||
|
||||
auto info = get_map_coordinates_from_pos(
|
||||
screenCoords, VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
screenCoords, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Footpath));
|
||||
|
||||
if (info.SpriteType == ViewportInteractionItem::None || info.Element == nullptr)
|
||||
{
|
||||
|
@ -834,7 +834,7 @@ static void window_footpath_place_path_at_point(const ScreenCoordsXY& screenCoor
|
|||
footpath_provisional_update();
|
||||
|
||||
const auto info = get_map_coordinates_from_pos(
|
||||
screenCoords, VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
screenCoords, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Footpath));
|
||||
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
{
|
||||
|
|
|
@ -1145,7 +1145,7 @@ void window_guest_overview_tool_update(rct_window* w, rct_widgetindex widgetInde
|
|||
|
||||
gPickupPeepImage = UINT32_MAX;
|
||||
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, VIEWPORT_INTERACTION_MASK_NONE);
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, ViewportInteractionItemAll);
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
return;
|
||||
|
||||
|
|
|
@ -4211,7 +4211,7 @@ static int32_t window_ride_has_track_colour(Ride* ride, int32_t trackColour)
|
|||
static void window_ride_set_track_colour_scheme(rct_window* w, const ScreenCoordsXY& screenPos)
|
||||
{
|
||||
auto newColourScheme = static_cast<uint8_t>(w->ride_colour);
|
||||
auto info = get_map_coordinates_from_pos(screenPos, VIEWPORT_INTERACTION_MASK_RIDE);
|
||||
auto info = get_map_coordinates_from_pos(screenPos, EnumsToFlags(ViewportInteractionItem::Ride));
|
||||
|
||||
if (info.SpriteType != ViewportInteractionItem::Ride)
|
||||
return;
|
||||
|
@ -5455,7 +5455,10 @@ static void window_ride_measurements_tooldown(rct_window* w, rct_widgetindex wid
|
|||
_lastSceneryY = screenCoords.y;
|
||||
_collectTrackDesignScenery = true; // Default to true in case user does not select anything valid
|
||||
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, 0xFCCF);
|
||||
auto flags = EnumsToFlags(
|
||||
ViewportInteractionItem::Scenery, ViewportInteractionItem::Footpath, ViewportInteractionItem::Wall,
|
||||
ViewportInteractionItem::LargeScenery);
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, flags);
|
||||
switch (info.SpriteType)
|
||||
{
|
||||
case ViewportInteractionItem::Scenery:
|
||||
|
@ -5477,7 +5480,10 @@ static void window_ride_measurements_tooldrag(rct_window* w, rct_widgetindex wid
|
|||
_lastSceneryX = screenCoords.x;
|
||||
_lastSceneryY = screenCoords.y;
|
||||
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, 0xFCCF);
|
||||
auto flags = EnumsToFlags(
|
||||
ViewportInteractionItem::Scenery, ViewportInteractionItem::Footpath, ViewportInteractionItem::Wall,
|
||||
ViewportInteractionItem::LargeScenery);
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, flags);
|
||||
switch (info.SpriteType)
|
||||
{
|
||||
case ViewportInteractionItem::Scenery:
|
||||
|
|
|
@ -1170,7 +1170,7 @@ void window_staff_overview_tool_update(rct_window* w, rct_widgetindex widgetInde
|
|||
|
||||
gPickupPeepImage = UINT32_MAX;
|
||||
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, VIEWPORT_INTERACTION_MASK_NONE);
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, ViewportInteractionItemAll);
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
return;
|
||||
|
||||
|
|
|
@ -406,10 +406,11 @@ static struct {
|
|||
};
|
||||
|
||||
// clang-format on
|
||||
static constexpr int32_t ViewportInteractionFlags = VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_ENTITY
|
||||
& VIEWPORT_INTERACTION_MASK_RIDE & VIEWPORT_INTERACTION_MASK_SCENERY & VIEWPORT_INTERACTION_MASK_FOOTPATH
|
||||
& VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM & VIEWPORT_INTERACTION_MASK_PARK_ENTRANCE & VIEWPORT_INTERACTION_MASK_WALL
|
||||
& VIEWPORT_INTERACTION_MASK_LARGE_SCENERY & VIEWPORT_INTERACTION_MASK_BANNER;
|
||||
static constexpr int32_t ViewportInteractionFlags = EnumsToFlags(
|
||||
ViewportInteractionItem::Terrain, ViewportInteractionItem::Entity, ViewportInteractionItem::Ride,
|
||||
ViewportInteractionItem::Scenery, ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem,
|
||||
ViewportInteractionItem::ParkEntrance, ViewportInteractionItem::Wall, ViewportInteractionItem::LargeScenery,
|
||||
ViewportInteractionItem::Banner);
|
||||
|
||||
static int16_t windowTileInspectorHighlightedIndex = -1;
|
||||
static bool windowTileInspectorTileSelected = false;
|
||||
|
|
|
@ -172,7 +172,7 @@ static TileCoordsXY get_location()
|
|||
if (w != nullptr)
|
||||
{
|
||||
auto info = get_map_coordinates_from_pos_window(
|
||||
w, { w->viewport->view_width / 2, w->viewport->view_height / 2 }, VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
w, { w->viewport->view_width / 2, w->viewport->view_height / 2 }, EnumsToFlags(ViewportInteractionItem::Terrain));
|
||||
auto mapCoord = info.Loc;
|
||||
mapCoord.x -= 16;
|
||||
mapCoord.y -= 16;
|
||||
|
|
|
@ -994,12 +994,10 @@ static void window_top_toolbar_paint(rct_window* w, rct_drawpixelinfo* dpi)
|
|||
*/
|
||||
static void repaint_scenery_tool_down(const ScreenCoordsXY& windowPos, rct_widgetindex widgetIndex)
|
||||
{
|
||||
auto flags = VIEWPORT_INTERACTION_MASK_SCENERY & VIEWPORT_INTERACTION_MASK_WALL & VIEWPORT_INTERACTION_MASK_LARGE_SCENERY
|
||||
& VIEWPORT_INTERACTION_MASK_BANNER;
|
||||
// This is -2 as banner is 12 but flags are offset different
|
||||
|
||||
auto flags = EnumsToFlags(
|
||||
ViewportInteractionItem::Scenery, ViewportInteractionItem::Wall, ViewportInteractionItem::LargeScenery,
|
||||
ViewportInteractionItem::Banner);
|
||||
auto info = get_map_coordinates_from_pos(windowPos, flags);
|
||||
|
||||
switch (info.SpriteType)
|
||||
{
|
||||
case ViewportInteractionItem::Scenery:
|
||||
|
@ -1073,11 +1071,10 @@ static void repaint_scenery_tool_down(const ScreenCoordsXY& windowPos, rct_widge
|
|||
|
||||
static void scenery_eyedropper_tool_down(const ScreenCoordsXY& windowPos, rct_widgetindex widgetIndex)
|
||||
{
|
||||
auto flags = VIEWPORT_INTERACTION_MASK_SCENERY & VIEWPORT_INTERACTION_MASK_WALL & VIEWPORT_INTERACTION_MASK_LARGE_SCENERY
|
||||
& VIEWPORT_INTERACTION_MASK_BANNER & VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM;
|
||||
|
||||
auto flags = EnumsToFlags(
|
||||
ViewportInteractionItem::Scenery, ViewportInteractionItem::Wall, ViewportInteractionItem::LargeScenery,
|
||||
ViewportInteractionItem::Banner, ViewportInteractionItem::FootpathItem);
|
||||
auto info = get_map_coordinates_from_pos(windowPos, flags);
|
||||
|
||||
switch (info.SpriteType)
|
||||
{
|
||||
case ViewportInteractionItem::Scenery:
|
||||
|
@ -1177,9 +1174,9 @@ static void sub_6E1F34_update_screen_coords_and_buttons_pressed(bool canRaiseIte
|
|||
if (InputTestPlaceObjectModifier(PLACE_OBJECT_MODIFIER_COPY_Z))
|
||||
{
|
||||
// CTRL pressed
|
||||
auto flags = VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_RIDE
|
||||
& VIEWPORT_INTERACTION_MASK_SCENERY & VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_WALL
|
||||
& VIEWPORT_INTERACTION_MASK_LARGE_SCENERY;
|
||||
auto flags = EnumsToFlags(
|
||||
ViewportInteractionItem::Terrain, ViewportInteractionItem::Ride, ViewportInteractionItem::Scenery,
|
||||
ViewportInteractionItem::Footpath, ViewportInteractionItem::Wall, ViewportInteractionItem::LargeScenery);
|
||||
auto info = get_map_coordinates_from_pos(screenPos, flags);
|
||||
|
||||
if (info.SpriteType != ViewportInteractionItem::None)
|
||||
|
@ -1347,7 +1344,7 @@ static void sub_6E1F34_small_scenery(
|
|||
// If CTRL not pressed
|
||||
if (!gSceneryCtrlPressed)
|
||||
{
|
||||
auto flags = VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER;
|
||||
auto flags = EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water);
|
||||
|
||||
auto info = get_map_coordinates_from_pos(screenPos, flags);
|
||||
gridPos = info.Loc;
|
||||
|
@ -1441,8 +1438,7 @@ static void sub_6E1F34_path_item(
|
|||
sub_6E1F34_update_screen_coords_and_buttons_pressed(false, screenPos);
|
||||
|
||||
// Path bits
|
||||
auto flags = VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM;
|
||||
|
||||
auto flags = EnumsToFlags(ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem);
|
||||
auto info = get_map_coordinates_from_pos(screenPos, flags);
|
||||
gridPos = info.Loc;
|
||||
|
||||
|
@ -1664,8 +1660,7 @@ static void sub_6E1F34_banner(
|
|||
sub_6E1F34_update_screen_coords_and_buttons_pressed(false, screenPos);
|
||||
|
||||
// Banner
|
||||
auto flags = VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM;
|
||||
|
||||
auto flags = EnumsToFlags(ViewportInteractionItem::Footpath, ViewportInteractionItem::FootpathItem);
|
||||
auto info = get_map_coordinates_from_pos(screenPos, flags);
|
||||
gridPos = info.Loc;
|
||||
|
||||
|
@ -2368,7 +2363,8 @@ static void top_toolbar_tool_update_water(const ScreenCoordsXY& screenPos)
|
|||
|
||||
gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE;
|
||||
|
||||
auto info = get_map_coordinates_from_pos(screenPos, VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER);
|
||||
auto info = get_map_coordinates_from_pos(
|
||||
screenPos, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Water));
|
||||
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
{
|
||||
|
|
|
@ -124,7 +124,7 @@ static void window_viewport_mouseup(rct_window* w, rct_widgetindex widgetIndex)
|
|||
if (mainWindow != nullptr)
|
||||
{
|
||||
auto info = get_map_coordinates_from_pos(
|
||||
{ w->windowPos.x + (w->width / 2), w->windowPos.y + (w->height / 2) }, VIEWPORT_INTERACTION_MASK_NONE);
|
||||
{ w->windowPos.x + (w->width / 2), w->windowPos.y + (w->height / 2) }, ViewportInteractionItemAll);
|
||||
window_scroll_to_location(mainWindow, { info.Loc, tile_element_height(info.Loc) });
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -315,7 +315,7 @@ void lightfx_prepare_light_list()
|
|||
paint_session* session = PaintSessionAlloc(&dpi, w->viewport->flags);
|
||||
PaintSessionGenerate(session);
|
||||
PaintSessionArrange(session);
|
||||
auto info = set_interaction_info_from_paint_session(session, VIEWPORT_INTERACTION_MASK_NONE);
|
||||
auto info = set_interaction_info_from_paint_session(session, ViewportInteractionItemAll);
|
||||
PaintSessionFree(session);
|
||||
|
||||
// log_warning("[%i, %i]", dpi->x, dpi->y);
|
||||
|
|
|
@ -655,7 +655,7 @@ static int32_t cc_get(InteractiveConsole& console, const arguments_t& argv)
|
|||
{
|
||||
rct_viewport* viewport = window_get_viewport(w);
|
||||
auto info = get_map_coordinates_from_pos(
|
||||
{ viewport->view_width / 2, viewport->view_height / 2 }, VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
{ viewport->view_width / 2, viewport->view_height / 2 }, EnumsToFlags(ViewportInteractionItem::Terrain));
|
||||
|
||||
auto tileMapCoord = TileCoordsXY(info.Loc);
|
||||
console.WriteFormatLine("location %d %d", tileMapCoord.x, tileMapCoord.y);
|
||||
|
|
|
@ -1296,23 +1296,16 @@ void viewport_set_visibility(uint8_t mode)
|
|||
*/
|
||||
static bool PSSpriteTypeIsInFilter(paint_struct* ps, uint16_t filter)
|
||||
{
|
||||
if (ps->sprite_type == ViewportInteractionItem::None || ps->sprite_type == ViewportInteractionItem::Label
|
||||
|| ps->sprite_type > ViewportInteractionItem::Banner)
|
||||
return false;
|
||||
|
||||
uint16_t mask;
|
||||
if (ps->sprite_type == ViewportInteractionItem::Banner)
|
||||
// I think CS made a typo here. Let's replicate the original behaviour.
|
||||
mask = 1 << (EnumValue(ps->sprite_type) - 3);
|
||||
else
|
||||
mask = 1 << (EnumValue(ps->sprite_type) - 1);
|
||||
|
||||
if (filter & mask)
|
||||
if (ps->sprite_type != ViewportInteractionItem::None && ps->sprite_type != ViewportInteractionItem::Label
|
||||
&& ps->sprite_type <= ViewportInteractionItem::Banner)
|
||||
{
|
||||
return false;
|
||||
auto mask = EnumToFlag(ps->sprite_type);
|
||||
if (filter & mask)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1791,7 +1784,7 @@ std::optional<CoordsXY> screen_get_map_xy(const ScreenCoordsXY& screenCoords, rc
|
|||
return std::nullopt;
|
||||
}
|
||||
auto myViewport = window->viewport;
|
||||
auto info = get_map_coordinates_from_pos_window(window, screenCoords, VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
auto info = get_map_coordinates_from_pos_window(window, screenCoords, EnumsToFlags(ViewportInteractionItem::Terrain));
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
{
|
||||
return std::nullopt;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "../world/Location.hpp"
|
||||
#include "Window.h"
|
||||
|
||||
#include <limits>
|
||||
#include <optional>
|
||||
#include <vector>
|
||||
|
||||
|
@ -66,21 +67,7 @@ enum class ViewportInteractionItem : uint8_t
|
|||
Banner
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
VIEWPORT_INTERACTION_MASK_NONE = 0,
|
||||
VIEWPORT_INTERACTION_MASK_TERRAIN = ~(1 << (EnumValue(ViewportInteractionItem::Terrain) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_ENTITY = ~(1 << (EnumValue(ViewportInteractionItem::Entity) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_RIDE = ~(1 << (EnumValue(ViewportInteractionItem::Ride) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_WATER = ~(1 << (EnumValue(ViewportInteractionItem::Water) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_SCENERY = ~(1 << (EnumValue(ViewportInteractionItem::Scenery) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_FOOTPATH = ~(1 << (EnumValue(ViewportInteractionItem::Footpath) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM = ~(1 << (EnumValue(ViewportInteractionItem::FootpathItem) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_PARK_ENTRANCE = ~(1 << (EnumValue(ViewportInteractionItem::ParkEntrance) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_WALL = ~(1 << (EnumValue(ViewportInteractionItem::Wall) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_LARGE_SCENERY = ~(1 << (EnumValue(ViewportInteractionItem::LargeScenery) - 1)),
|
||||
VIEWPORT_INTERACTION_MASK_BANNER = ~(1 << (EnumValue(ViewportInteractionItem::Banner) - 2)), // Note the -2 for BANNER
|
||||
};
|
||||
constexpr uint16_t ViewportInteractionItemAll = std::numeric_limits<uint16_t>::max();
|
||||
|
||||
struct InteractionInfo
|
||||
{
|
||||
|
|
|
@ -5768,7 +5768,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC
|
|||
CoordsXYZD entranceExitCoords{};
|
||||
|
||||
gRideEntranceExitPlaceDirection = INVALID_DIRECTION;
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, 0xFFFB);
|
||||
auto info = get_map_coordinates_from_pos(screenCoords, EnumsToFlags(ViewportInteractionItem::Ride));
|
||||
if (info.SpriteType != ViewportInteractionItem::None)
|
||||
{
|
||||
if (info.Element->GetType() == TILE_ELEMENT_TYPE_TRACK)
|
||||
|
|
|
@ -256,12 +256,12 @@ CoordsXY footpath_get_coordinates_from_pos(const ScreenCoordsXY& screenCoords, i
|
|||
return position;
|
||||
}
|
||||
auto viewport = window->viewport;
|
||||
auto info = get_map_coordinates_from_pos_window(window, screenCoords, VIEWPORT_INTERACTION_MASK_FOOTPATH);
|
||||
auto info = get_map_coordinates_from_pos_window(window, screenCoords, EnumsToFlags(ViewportInteractionItem::Footpath));
|
||||
if (info.SpriteType != ViewportInteractionItem::Footpath
|
||||
|| !(viewport->flags & (VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL)))
|
||||
{
|
||||
info = get_map_coordinates_from_pos_window(
|
||||
window, screenCoords, VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
window, screenCoords, EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Footpath));
|
||||
if (info.SpriteType == ViewportInteractionItem::None)
|
||||
{
|
||||
auto position = info.Loc;
|
||||
|
@ -354,7 +354,7 @@ CoordsXY footpath_bridge_get_info_from_pos(const ScreenCoordsXY& screenCoords, i
|
|||
return ret;
|
||||
}
|
||||
auto viewport = window->viewport;
|
||||
auto info = get_map_coordinates_from_pos_window(window, screenCoords, VIEWPORT_INTERACTION_MASK_RIDE);
|
||||
auto info = get_map_coordinates_from_pos_window(window, screenCoords, EnumsToFlags(ViewportInteractionItem::Ride));
|
||||
*tileElement = info.Element;
|
||||
if (info.SpriteType == ViewportInteractionItem::Ride
|
||||
&& viewport->flags & (VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL)
|
||||
|
@ -374,7 +374,7 @@ CoordsXY footpath_bridge_get_info_from_pos(const ScreenCoordsXY& screenCoords, i
|
|||
|
||||
info = get_map_coordinates_from_pos_window(
|
||||
window, screenCoords,
|
||||
VIEWPORT_INTERACTION_MASK_RIDE & VIEWPORT_INTERACTION_MASK_FOOTPATH & VIEWPORT_INTERACTION_MASK_TERRAIN);
|
||||
EnumsToFlags(ViewportInteractionItem::Terrain, ViewportInteractionItem::Footpath, ViewportInteractionItem::Ride));
|
||||
if (info.SpriteType == ViewportInteractionItem::Ride && (*tileElement)->GetType() == TILE_ELEMENT_TYPE_ENTRANCE)
|
||||
{
|
||||
int32_t directions = entrance_get_directions(*tileElement);
|
||||
|
|
Loading…
Reference in New Issue