diff --git a/src/openrct2-ui/windows/GuestList.cpp b/src/openrct2-ui/windows/GuestList.cpp index 9b4420fd83..348193a362 100644 --- a/src/openrct2-ui/windows/GuestList.cpp +++ b/src/openrct2-ui/windows/GuestList.cpp @@ -270,7 +270,7 @@ public: _tabAnimationIndex = 0; InvalidateWidget(WIDX_TAB_1 + static_cast(_selectedTab)); - gWindowMapFlashingFlags |= (1 << 0); + gWindowMapFlashingFlags |= MapFlashingFlags::GuestListOpen; } void OnMouseUp(rct_widgetindex widgetIndex) override diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index ff0ae0c191..9ac7f82c55 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -33,9 +33,18 @@ #include #include -#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(EntityListId::Peep)) + auto flashColour = MapGetGuestFlashColour(); + for (auto guest : EntityList(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(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(std::size(ElementTypeAddColour)); auto tileElement = reinterpret_cast(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(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) diff --git a/src/openrct2-ui/windows/StaffList.cpp b/src/openrct2-ui/windows/StaffList.cpp index 9ad8d3b213..ef65aa0ae4 100644 --- a/src/openrct2-ui/windows/StaffList.cpp +++ b/src/openrct2-ui/windows/StaffList.cpp @@ -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(EntityListId::Peep)) { sprite_set_flashing(peep, false); diff --git a/src/openrct2/GameState.cpp b/src/openrct2/GameState.cpp index 595c31aa4b..26f981b620 100644 --- a/src/openrct2/GameState.cpp +++ b/src/openrct2/GameState.cpp @@ -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(); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index f7996ceb51..874ca722ab 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -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];