mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-16 11:33:03 +01:00
Remove global variables from get_map_coordinates_from_pos_window
This commit is contained in:
@@ -43,7 +43,6 @@ uint8_t gShowConstuctionRightsRefCount;
|
||||
rct_viewport g_viewport_list[MAX_VIEWPORT_COUNT];
|
||||
rct_viewport* g_music_tracking_viewport;
|
||||
|
||||
static TileElement* _interaction_element = nullptr;
|
||||
static std::unique_ptr<JobPool> _paintJobs;
|
||||
|
||||
int16_t gSavedViewX;
|
||||
@@ -58,10 +57,12 @@ static uint32_t _currentImageType;
|
||||
|
||||
static rct_drawpixelinfo _viewportDpi1;
|
||||
static rct_drawpixelinfo _viewportDpi2;
|
||||
static uint8_t _interactionSpriteType;
|
||||
static int16_t _interactionMapX;
|
||||
static int16_t _interactionMapY;
|
||||
static uint16_t _interactionFlags;
|
||||
struct InteractionInfo
|
||||
{
|
||||
CoordsXY loc;
|
||||
TileElement* element;
|
||||
uint8_t SpriteType;
|
||||
};
|
||||
|
||||
static void viewport_paint_weather_gloom(rct_drawpixelinfo* dpi);
|
||||
|
||||
@@ -1260,12 +1261,12 @@ void viewport_set_visibility(uint8_t mode)
|
||||
* Originally checked 0x0141F569 at start
|
||||
* rct2: 0x00688697
|
||||
*/
|
||||
static void store_interaction_info(paint_struct* ps)
|
||||
static std::optional<InteractionInfo> GetInteractionInfoFromPS(paint_struct* ps, uint16_t flags)
|
||||
{
|
||||
if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_NONE
|
||||
|| ps->sprite_type == 11 // 11 as a type seems to not exist, maybe part of the typo mentioned later on.
|
||||
|| ps->sprite_type > VIEWPORT_INTERACTION_ITEM_BANNER)
|
||||
return;
|
||||
return {};
|
||||
|
||||
uint16_t mask;
|
||||
if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_BANNER)
|
||||
@@ -1274,13 +1275,17 @@ static void store_interaction_info(paint_struct* ps)
|
||||
else
|
||||
mask = 1 << (ps->sprite_type - 1);
|
||||
|
||||
if (!(_interactionFlags & mask))
|
||||
if (flags & mask)
|
||||
{
|
||||
_interactionSpriteType = ps->sprite_type;
|
||||
_interactionMapX = ps->map_x;
|
||||
_interactionMapY = ps->map_y;
|
||||
_interaction_element = ps->tileElement;
|
||||
return {};
|
||||
}
|
||||
|
||||
InteractionInfo info = {
|
||||
{ ps->map_x, ps->map_y },
|
||||
ps->tileElement,
|
||||
ps->sprite_type,
|
||||
};
|
||||
return { info };
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1574,10 +1579,11 @@ static bool is_sprite_interacted_with(rct_drawpixelinfo* dpi, int32_t imageId, i
|
||||
*
|
||||
* rct2: 0x0068862C
|
||||
*/
|
||||
static void set_interaction_info_from_paint_session(paint_session* session)
|
||||
static InteractionInfo set_interaction_info_from_paint_session(paint_session* session, uint16_t flags)
|
||||
{
|
||||
paint_struct* ps = &session->PaintHead;
|
||||
rct_drawpixelinfo* dpi = &session->DPI;
|
||||
InteractionInfo info{};
|
||||
|
||||
while ((ps = ps->next_quadrant_ps) != nullptr)
|
||||
{
|
||||
@@ -1588,7 +1594,10 @@ static void set_interaction_info_from_paint_session(paint_session* session)
|
||||
ps = next_ps;
|
||||
if (is_sprite_interacted_with(dpi, ps->image_id, ps->x, ps->y))
|
||||
{
|
||||
store_interaction_info(ps);
|
||||
if (auto newInfo = GetInteractionInfoFromPS(ps, flags); newInfo)
|
||||
{
|
||||
info = *newInfo;
|
||||
}
|
||||
}
|
||||
next_ps = ps->children;
|
||||
}
|
||||
@@ -1598,12 +1607,16 @@ static void set_interaction_info_from_paint_session(paint_session* session)
|
||||
if (is_sprite_interacted_with(
|
||||
dpi, attached_ps->image_id, (attached_ps->x + ps->x) & 0xFFFF, (attached_ps->y + ps->y) & 0xFFFF))
|
||||
{
|
||||
store_interaction_info(ps);
|
||||
if (auto newInfo = GetInteractionInfoFromPS(ps, flags); newInfo)
|
||||
{
|
||||
info = *newInfo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ps = old_ps;
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1645,8 +1658,7 @@ void get_map_coordinates_from_pos_window(
|
||||
rct_window* window, ScreenCoordsXY screenCoords, int32_t flags, CoordsXY& mapCoords, int32_t* interactionType,
|
||||
TileElement** tileElement, rct_viewport** viewport)
|
||||
{
|
||||
_interactionFlags = flags & 0xFFFF;
|
||||
_interactionSpriteType = 0;
|
||||
InteractionInfo info{};
|
||||
if (window != nullptr && window->viewport != nullptr)
|
||||
{
|
||||
rct_viewport* myviewport = window->viewport;
|
||||
@@ -1674,20 +1686,19 @@ void get_map_coordinates_from_pos_window(
|
||||
paint_session* session = paint_session_alloc(dpi, myviewport->flags);
|
||||
paint_session_generate(session);
|
||||
paint_session_arrange(session);
|
||||
set_interaction_info_from_paint_session(session);
|
||||
info = set_interaction_info_from_paint_session(session, flags & 0xFFFF);
|
||||
paint_session_free(session);
|
||||
}
|
||||
if (viewport != nullptr)
|
||||
*viewport = myviewport;
|
||||
}
|
||||
if (interactionType != nullptr)
|
||||
*interactionType = _interactionSpriteType;
|
||||
*interactionType = info.SpriteType;
|
||||
|
||||
mapCoords.x = _interactionMapX;
|
||||
mapCoords.y = _interactionMapY;
|
||||
mapCoords = info.loc;
|
||||
|
||||
if (tileElement != nullptr)
|
||||
*tileElement = _interaction_element;
|
||||
*tileElement = info.element;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user