1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-06 06:32:56 +01:00

Name MapFlashingFlags and split up guest/staff loop (#13865)

* Name MapFlashingFlags and split up guest/staff loop

* Use constexpr instead of macros
This commit is contained in:
Duncan
2021-01-23 06:45:14 +00:00
committed by GitHub
parent fb274f55d5
commit 3cc283adb2
5 changed files with 131 additions and 88 deletions

View File

@@ -270,7 +270,7 @@ public:
_tabAnimationIndex = 0;
InvalidateWidget(WIDX_TAB_1 + static_cast<int32_t>(_selectedTab));
gWindowMapFlashingFlags |= (1 << 0);
gWindowMapFlashingFlags |= MapFlashingFlags::GuestListOpen;
}
void OnMouseUp(rct_widgetindex widgetIndex) override

View File

@@ -33,9 +33,18 @@
#include <openrct2/world/Surface.h>
#include <vector>
#define MAP_COLOUR_2(colourA, colourB) (((colourA) << 8) | (colourB))
#define MAP_COLOUR(colour) MAP_COLOUR_2(colour, colour)
#define MAP_COLOUR_UNOWNED(colour) (PALETTE_INDEX_10 | ((colour)&0xFF00))
static constexpr uint16_t MapColour2(uint8_t colourA, uint8_t colourB)
{
return (colourA << 8) | colourB;
}
static constexpr uint16_t MapColour(uint8_t colour)
{
return MapColour2(colour, colour);
}
static constexpr uint16_t MapColourUnowned(uint16_t colour)
{
return MapColour2((colour & 0xFF00) >> 8, PALETTE_INDEX_10);
}
constexpr int32_t MAP_WINDOW_MAP_SIZE = MAXIMUM_MAP_SIZE_TECHNICAL * 2;
@@ -43,6 +52,12 @@ static constexpr const rct_string_id WINDOW_TITLE = STR_MAP_LABEL;
static constexpr const int32_t WH = 259;
static constexpr const int32_t WW = 245;
constexpr uint8_t DefaultPeepMapColour = PALETTE_INDEX_20;
constexpr uint8_t GuestMapColour = PALETTE_INDEX_172;
constexpr uint8_t GuestMapColourAlternate = PALETTE_INDEX_21;
constexpr uint8_t StaffMapColour = PALETTE_INDEX_138;
constexpr uint8_t StaffMapColourAlternate = PALETTE_INDEX_10;
// Some functions manipulate coordinates on the map. These are the coordinates of the pixels in the
// minimap. In order to distinguish those from actual coordinates, we use a separate name.
using MapCoordsXY = TileCoordsXY;
@@ -113,14 +128,14 @@ static constexpr const ScreenCoordsXY MiniMapOffsets[] = {
/** rct2: 0x00981BCC */
static constexpr const uint16_t RideKeyColours[] = {
MAP_COLOUR(PALETTE_INDEX_61), // COLOUR_KEY_RIDE
MAP_COLOUR(PALETTE_INDEX_42), // COLOUR_KEY_FOOD
MAP_COLOUR(PALETTE_INDEX_20), // COLOUR_KEY_DRINK
MAP_COLOUR(PALETTE_INDEX_209), // COLOUR_KEY_SOUVENIR
MAP_COLOUR(PALETTE_INDEX_136), // COLOUR_KEY_KIOSK
MAP_COLOUR(PALETTE_INDEX_102), // COLOUR_KEY_FIRST_AID
MAP_COLOUR(PALETTE_INDEX_55), // COLOUR_KEY_CASH_MACHINE
MAP_COLOUR(PALETTE_INDEX_161), // COLOUR_KEY_TOILETS
MapColour(PALETTE_INDEX_61), // COLOUR_KEY_RIDE
MapColour(PALETTE_INDEX_42), // COLOUR_KEY_FOOD
MapColour(PALETTE_INDEX_20), // COLOUR_KEY_DRINK
MapColour(PALETTE_INDEX_209), // COLOUR_KEY_SOUVENIR
MapColour(PALETTE_INDEX_136), // COLOUR_KEY_KIOSK
MapColour(PALETTE_INDEX_102), // COLOUR_KEY_FIRST_AID
MapColour(PALETTE_INDEX_55), // COLOUR_KEY_CASH_MACHINE
MapColour(PALETTE_INDEX_161), // COLOUR_KEY_TOILETS
};
static void window_map_close(rct_window *w);
@@ -1031,47 +1046,67 @@ static MapCoordsXY window_map_transform_to_map_coords(CoordsXY c)
return { -x + y + MAXIMUM_MAP_SIZE_TECHNICAL - 8, x + y - 8 };
}
static void DrawMapPeepPixel(Peep* peep, const uint8_t flashColour, rct_drawpixelinfo* dpi)
{
if (peep->x == LOCATION_NULL)
return;
MapCoordsXY c = window_map_transform_to_map_coords({ peep->x, peep->y });
auto leftTop = ScreenCoordsXY{ c.x, c.y };
auto rightBottom = leftTop;
uint8_t colour = DefaultPeepMapColour;
if (sprite_get_flashing(peep))
{
colour = flashColour;
// If flashing then map peep pixel size is increased (by moving left top downwards)
if (flashColour != DefaultPeepMapColour)
{
leftTop.x--;
}
}
gfx_fill_rect(dpi, { leftTop, rightBottom }, colour);
}
static uint8_t MapGetGuestFlashColour()
{
uint8_t colour = DefaultPeepMapColour;
if ((gWindowMapFlashingFlags & MapFlashingFlags::FlashGuests) != 0)
{
colour = GuestMapColour;
if ((gWindowMapFlashingFlags & MapFlashingFlags::SwitchColour) == 0)
colour = GuestMapColourAlternate;
}
return colour;
}
static uint8_t MapGetStaffFlashColour()
{
uint8_t colour = DefaultPeepMapColour;
if ((gWindowMapFlashingFlags & MapFlashingFlags::FlashStaff) != 0)
{
colour = StaffMapColour;
if ((gWindowMapFlashingFlags & MapFlashingFlags::SwitchColour) == 0)
colour = StaffMapColourAlternate;
}
return colour;
}
/**
*
* rct2: 0x0068DADA
*/
static void window_map_paint_peep_overlay(rct_drawpixelinfo* dpi)
{
for (auto peep : EntityList<Peep>(EntityListId::Peep))
auto flashColour = MapGetGuestFlashColour();
for (auto guest : EntityList<Guest>(EntityListId::Peep))
{
if (peep->x == LOCATION_NULL)
continue;
MapCoordsXY c = window_map_transform_to_map_coords({ peep->x, peep->y });
auto leftTop = ScreenCoordsXY{ c.x, c.y };
auto rightBottom = leftTop;
int16_t colour = PALETTE_INDEX_20;
if (sprite_get_flashing(peep))
{
if (peep->AssignedPeepType == PeepType::Staff)
{
if ((gWindowMapFlashingFlags & (1 << 3)) != 0)
{
colour = PALETTE_INDEX_138;
leftTop.x--;
if ((gWindowMapFlashingFlags & (1 << 15)) == 0)
colour = PALETTE_INDEX_10;
}
}
else
{
if ((gWindowMapFlashingFlags & (1 << 1)) != 0)
{
colour = PALETTE_INDEX_172;
leftTop.x--;
if ((gWindowMapFlashingFlags & (1 << 15)) == 0)
colour = PALETTE_INDEX_21;
}
}
}
gfx_fill_rect(dpi, { leftTop, rightBottom }, colour);
DrawMapPeepPixel(guest, flashColour, dpi);
}
flashColour = MapGetStaffFlashColour();
for (auto staff : EntityList<Staff>(EntityListId::Peep))
{
DrawMapPeepPixel(staff, flashColour, dpi);
}
}
@@ -1367,22 +1402,22 @@ static void map_window_decrease_map_size()
gfx_invalidate_screen();
}
static constexpr const uint16_t WaterColour = MAP_COLOUR(PALETTE_INDEX_195);
static constexpr const uint16_t WaterColour = MapColour(PALETTE_INDEX_195);
static constexpr const uint16_t TerrainColour[] = {
MAP_COLOUR(PALETTE_INDEX_73), // TERRAIN_GRASS
MAP_COLOUR(PALETTE_INDEX_40), // TERRAIN_SAND
MAP_COLOUR(PALETTE_INDEX_108), // TERRAIN_DIRT
MAP_COLOUR(PALETTE_INDEX_12), // TERRAIN_ROCK
MAP_COLOUR(PALETTE_INDEX_62), // TERRAIN_MARTIAN
MAP_COLOUR_2(PALETTE_INDEX_10, PALETTE_INDEX_16), // TERRAIN_CHECKERBOARD
MAP_COLOUR_2(PALETTE_INDEX_73, PALETTE_INDEX_108), // TERRAIN_GRASS_CLUMPS
MAP_COLOUR(PALETTE_INDEX_141), // TERRAIN_ICE
MAP_COLOUR_2(PALETTE_INDEX_172, PALETTE_INDEX_10), // TERRAIN_GRID_RED
MAP_COLOUR_2(PALETTE_INDEX_54, PALETTE_INDEX_10), // TERRAIN_GRID_YELLOW
MAP_COLOUR_2(PALETTE_INDEX_162, PALETTE_INDEX_10), // TERRAIN_GRID_BLUE
MAP_COLOUR_2(PALETTE_INDEX_102, PALETTE_INDEX_10), // TERRAIN_GRID_GREEN
MAP_COLOUR(PALETTE_INDEX_111), // TERRAIN_SAND_DARK
MAP_COLOUR(PALETTE_INDEX_222), // TERRAIN_SAND_LIGHT
MapColour(PALETTE_INDEX_73), // TERRAIN_GRASS
MapColour(PALETTE_INDEX_40), // TERRAIN_SAND
MapColour(PALETTE_INDEX_108), // TERRAIN_DIRT
MapColour(PALETTE_INDEX_12), // TERRAIN_ROCK
MapColour(PALETTE_INDEX_62), // TERRAIN_MARTIAN
MapColour2(PALETTE_INDEX_10, PALETTE_INDEX_16), // TERRAIN_CHECKERBOARD
MapColour2(PALETTE_INDEX_73, PALETTE_INDEX_108), // TERRAIN_GRASS_CLUMPS
MapColour(PALETTE_INDEX_141), // TERRAIN_ICE
MapColour2(PALETTE_INDEX_172, PALETTE_INDEX_10), // TERRAIN_GRID_RED
MapColour2(PALETTE_INDEX_54, PALETTE_INDEX_10), // TERRAIN_GRID_YELLOW
MapColour2(PALETTE_INDEX_162, PALETTE_INDEX_10), // TERRAIN_GRID_BLUE
MapColour2(PALETTE_INDEX_102, PALETTE_INDEX_10), // TERRAIN_GRID_GREEN
MapColour(PALETTE_INDEX_111), // TERRAIN_SAND_DARK
MapColour(PALETTE_INDEX_222), // TERRAIN_SAND_LIGHT
};
static constexpr const uint16_t ElementTypeMaskColour[] = {
@@ -1398,15 +1433,15 @@ static constexpr const uint16_t ElementTypeMaskColour[] = {
};
static constexpr const uint16_t ElementTypeAddColour[] = {
MAP_COLOUR(PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_SURFACE
MAP_COLOUR(PALETTE_INDEX_17), // TILE_ELEMENT_TYPE_PATH
MAP_COLOUR_2(PALETTE_INDEX_183, PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_TRACK
MAP_COLOUR_2(PALETTE_INDEX_0, PALETTE_INDEX_99), // TILE_ELEMENT_TYPE_SMALL_SCENERY
MAP_COLOUR(PALETTE_INDEX_186), // TILE_ELEMENT_TYPE_ENTRANCE
MAP_COLOUR(PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_WALL
MAP_COLOUR(PALETTE_INDEX_99), // TILE_ELEMENT_TYPE_LARGE_SCENERY
MAP_COLOUR(PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_BANNER
MAP_COLOUR(PALETTE_INDEX_68), // TILE_ELEMENT_TYPE_CORRUPT
MapColour(PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_SURFACE
MapColour(PALETTE_INDEX_17), // TILE_ELEMENT_TYPE_PATH
MapColour2(PALETTE_INDEX_183, PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_TRACK
MapColour2(PALETTE_INDEX_0, PALETTE_INDEX_99), // TILE_ELEMENT_TYPE_SMALL_SCENERY
MapColour(PALETTE_INDEX_186), // TILE_ELEMENT_TYPE_ENTRANCE
MapColour(PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_WALL
MapColour(PALETTE_INDEX_99), // TILE_ELEMENT_TYPE_LARGE_SCENERY
MapColour(PALETTE_INDEX_0), // TILE_ELEMENT_TYPE_BANNER
MapColour(PALETTE_INDEX_68), // TILE_ELEMENT_TYPE_CORRUPT
};
static uint16_t map_window_get_pixel_colour_peep(const CoordsXY& c)
@@ -1419,7 +1454,7 @@ static uint16_t map_window_get_pixel_colour_peep(const CoordsXY& c)
colour = WaterColour;
if (!(surfaceElement->GetOwnership() & OWNERSHIP_OWNED))
colour = MAP_COLOUR_UNOWNED(colour);
colour = MapColourUnowned(colour);
const int32_t maxSupportedTileElementType = static_cast<int32_t>(std::size(ElementTypeAddColour));
auto tileElement = reinterpret_cast<TileElement*>(surfaceElement);
@@ -1427,7 +1462,7 @@ static uint16_t map_window_get_pixel_colour_peep(const CoordsXY& c)
{
if (tileElement->IsGhost())
{
colour = MAP_COLOUR(PALETTE_INDEX_21);
colour = MapColour(PALETTE_INDEX_21);
break;
}
@@ -1446,8 +1481,8 @@ static uint16_t map_window_get_pixel_colour_peep(const CoordsXY& c)
static uint16_t map_window_get_pixel_colour_ride(const CoordsXY& c)
{
Ride* ride;
uint16_t colourA = 0; // highlight colour
uint16_t colourB = MAP_COLOUR(PALETTE_INDEX_13); // surface colour (dark grey)
uint16_t colourA = 0; // highlight colour
uint16_t colourB = MapColour(PALETTE_INDEX_13); // surface colour (dark grey)
// as an improvement we could use first_element to show underground stuff?
TileElement* tileElement = reinterpret_cast<TileElement*>(map_get_surface_element_at(c));
@@ -1458,7 +1493,7 @@ static uint16_t map_window_get_pixel_colour_ride(const CoordsXY& c)
if (tileElement->IsGhost())
{
colourA = MAP_COLOUR(PALETTE_INDEX_21);
colourA = MapColour(PALETTE_INDEX_21);
break;
}
@@ -1467,12 +1502,12 @@ static uint16_t map_window_get_pixel_colour_ride(const CoordsXY& c)
case TILE_ELEMENT_TYPE_SURFACE:
if (tileElement->AsSurface()->GetWaterHeight() > 0)
// Why is this a different water colour as above (195)?
colourB = MAP_COLOUR(PALETTE_INDEX_194);
colourB = MapColour(PALETTE_INDEX_194);
if (!(tileElement->AsSurface()->GetOwnership() & OWNERSHIP_OWNED))
colourB = MAP_COLOUR_UNOWNED(colourB);
colourB = MapColourUnowned(colourB);
break;
case TILE_ELEMENT_TYPE_PATH:
colourA = MAP_COLOUR(PALETTE_INDEX_14); // lighter grey
colourA = MapColour(PALETTE_INDEX_14); // lighter grey
break;
case TILE_ELEMENT_TYPE_ENTRANCE:
if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_PARK_ENTRANCE)

View File

@@ -325,7 +325,7 @@ void window_staff_list_update(rct_window* w)
// Enable highlighting of these staff members in map window
if (window_find_by_class(WC_MAP) != nullptr)
{
gWindowMapFlashingFlags |= (1 << 2);
gWindowMapFlashingFlags |= MapFlashingFlags::StaffListOpen;
for (auto peep : EntityList<Staff>(EntityListId::Peep))
{
sprite_set_flashing(peep, false);

View File

@@ -190,19 +190,19 @@ void GameState::Update()
// it was done due to inability to reproduce original frequency
// and decision that the original one looks too fast
if (gCurrentRealTimeTicks % 4 == 0)
gWindowMapFlashingFlags ^= (1 << 15);
gWindowMapFlashingFlags ^= MapFlashingFlags::SwitchColour;
// Handle guest map flashing
gWindowMapFlashingFlags &= ~(1 << 1);
if (gWindowMapFlashingFlags & (1 << 0))
gWindowMapFlashingFlags |= (1 << 1);
gWindowMapFlashingFlags &= ~(1 << 0);
gWindowMapFlashingFlags &= ~MapFlashingFlags::FlashGuests;
if (gWindowMapFlashingFlags & MapFlashingFlags::GuestListOpen)
gWindowMapFlashingFlags |= MapFlashingFlags::FlashGuests;
gWindowMapFlashingFlags &= ~MapFlashingFlags::GuestListOpen;
// Handle staff map flashing
gWindowMapFlashingFlags &= ~(1 << 3);
if (gWindowMapFlashingFlags & (1 << 2))
gWindowMapFlashingFlags |= (1 << 3);
gWindowMapFlashingFlags &= ~(1 << 2);
gWindowMapFlashingFlags &= ~MapFlashingFlags::FlashStaff;
if (gWindowMapFlashingFlags & MapFlashingFlags::StaffListOpen)
gWindowMapFlashingFlags |= MapFlashingFlags::FlashStaff;
gWindowMapFlashingFlags &= ~MapFlashingFlags::StaffListOpen;
context_update_map_tooltip();

View File

@@ -661,6 +661,14 @@ using close_callback = void (*)();
extern rct_window* gWindowAudioExclusive;
extern uint16_t gWindowUpdateTicks;
namespace MapFlashingFlags
{
constexpr uint16_t GuestListOpen = (1 << 0);
constexpr uint16_t FlashGuests = (1 << 1);
constexpr uint16_t StaffListOpen = (1 << 2);
constexpr uint16_t FlashStaff = (1 << 3);
constexpr uint16_t SwitchColour = (1 << 15); // Every couple ticks the colour switches
} // namespace MapFlashingFlags
extern uint16_t gWindowMapFlashingFlags;
extern colour_t gCurrentWindowColours[4];