diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index 4e364b147d..2349227c2d 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -1170,7 +1170,7 @@ void window_guest_overview_tool_update(rct_window* w, rct_widgetindex widgetInde } uint32_t imageId = g_peep_animation_entries[peep->SpriteType] - .sprite_animation[static_cast(PeepActionSpriteType::Ui)] + .sprite_animation[EnumValue(PeepActionSpriteType::Ui)] .base_image; imageId += w->picked_peep_frame >> 2; diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index e5ec586c2b..15db79a237 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -1183,7 +1184,7 @@ void window_staff_overview_tool_update(rct_window* w, rct_widgetindex widgetInde } uint32_t imageId = g_peep_animation_entries[peep->SpriteType] - .sprite_animation[static_cast(PeepActionSpriteType::Ui)] + .sprite_animation[EnumValue(PeepActionSpriteType::Ui)] .base_image; imageId += w->picked_peep_frame >> 2; diff --git a/src/openrct2/paint/sprite/Paint.Peep.cpp b/src/openrct2/paint/sprite/Paint.Peep.cpp index 90ff5182f9..74d76fca46 100644 --- a/src/openrct2/paint/sprite/Paint.Peep.cpp +++ b/src/openrct2/paint/sprite/Paint.Peep.cpp @@ -11,6 +11,7 @@ #include "../../drawing/LightFX.h" #include "../../interface/Viewport.h" #include "../../peep/Peep.h" +#include "../../util/Util.h" #include "../../world/Sprite.h" #include "../Paint.h" #include "Paint.Sprite.h" @@ -80,8 +81,7 @@ void peep_paint(paint_session* session, const Peep* peep, int32_t imageDirection // In the following 4 calls to sub_98197C/sub_98199C, we add 5 (instead of 3) to the // bound_box_offset_z to make sure peeps are drawn on top of railways - uint32_t baseImageId = (imageDirection >> 3) + sprite.sprite_animation[static_cast(spriteType)].base_image - + imageOffset * 4; + uint32_t baseImageId = (imageDirection >> 3) + sprite.sprite_animation[EnumValue(spriteType)].base_image + imageOffset * 4; uint32_t imageId = baseImageId | peep->TshirtColour << 19 | peep->TrousersColour << 24 | IMAGE_TYPE_REMAP | IMAGE_TYPE_REMAP_2_PLUS; sub_98197C(session, imageId, 0, 0, 1, 1, 11, peep->z, 0, 0, peep->z + 5); diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 4c7cd41f42..80cd511425 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -509,9 +509,9 @@ void Peep::UpdateCurrentActionSpriteType() ActionSpriteType = newActionSpriteType; const rct_sprite_bounds* spriteBounds = g_peep_animation_entries[SpriteType].sprite_bounds; - sprite_width = spriteBounds[static_cast(ActionSpriteType)].sprite_width; - sprite_height_negative = spriteBounds[static_cast(ActionSpriteType)].sprite_height_negative; - sprite_height_positive = spriteBounds[static_cast(ActionSpriteType)].sprite_height_positive; + sprite_width = spriteBounds[EnumValue(ActionSpriteType)].sprite_width; + sprite_height_negative = spriteBounds[EnumValue(ActionSpriteType)].sprite_height_negative; + sprite_height_positive = spriteBounds[EnumValue(ActionSpriteType)].sprite_height_positive; Invalidate(); } @@ -598,8 +598,8 @@ std::optional Peep::UpdateAction(int16_t& xy_distance) loc += word_981D7C[nextDirection / 8]; WalkingFrameNum++; const rct_peep_animation* peepAnimation = g_peep_animation_entries[SpriteType].sprite_animation; - const uint8_t* imageOffset = peepAnimation[static_cast(ActionSpriteType)].frame_offsets; - if (WalkingFrameNum >= peepAnimation[static_cast(ActionSpriteType)].num_frames) + const uint8_t* imageOffset = peepAnimation[EnumValue(ActionSpriteType)].frame_offsets; + if (WalkingFrameNum >= peepAnimation[EnumValue(ActionSpriteType)].num_frames) { WalkingFrameNum = 0; } @@ -611,14 +611,14 @@ std::optional Peep::UpdateAction(int16_t& xy_distance) ActionFrame++; // If last frame of action - if (ActionFrame >= peepAnimation[static_cast(ActionSpriteType)].num_frames) + if (ActionFrame >= peepAnimation[EnumValue(ActionSpriteType)].num_frames) { ActionSpriteImageOffset = 0; Action = PEEP_ACTION_NONE_2; UpdateCurrentActionSpriteType(); return { { x, y } }; } - ActionSpriteImageOffset = peepAnimation[static_cast(ActionSpriteType)].frame_offsets[ActionFrame]; + ActionSpriteImageOffset = peepAnimation[EnumValue(ActionSpriteType)].frame_offsets[ActionFrame]; // If not throwing up and not at the frame where sick appears. if (Action != PEEP_ACTION_THROW_UP || ActionFrame != 15) @@ -1591,9 +1591,9 @@ Peep* Peep::Generate(const CoordsXYZ& coords) peep->FavouriteRideRating = 0; const rct_sprite_bounds* spriteBounds = g_peep_animation_entries[peep->SpriteType].sprite_bounds; - peep->sprite_width = spriteBounds[static_cast(peep->ActionSpriteType)].sprite_width; - peep->sprite_height_negative = spriteBounds[static_cast(peep->ActionSpriteType)].sprite_height_negative; - peep->sprite_height_positive = spriteBounds[static_cast(peep->ActionSpriteType)].sprite_height_positive; + peep->sprite_width = spriteBounds[EnumValue(peep->ActionSpriteType)].sprite_width; + peep->sprite_height_negative = spriteBounds[EnumValue(peep->ActionSpriteType)].sprite_height_negative; + peep->sprite_height_positive = spriteBounds[EnumValue(peep->ActionSpriteType)].sprite_height_positive; peep->MoveTo(coords); peep->sprite_direction = 0; @@ -2192,9 +2192,9 @@ void Peep::SwitchNextActionSpriteType() Invalidate(); ActionSpriteType = NextActionSpriteType; const rct_sprite_bounds* spriteBounds = g_peep_animation_entries[SpriteType].sprite_bounds; - sprite_width = spriteBounds[static_cast(NextActionSpriteType)].sprite_width; - sprite_height_negative = spriteBounds[static_cast(NextActionSpriteType)].sprite_height_negative; - sprite_height_positive = spriteBounds[static_cast(NextActionSpriteType)].sprite_height_positive; + sprite_width = spriteBounds[EnumValue(NextActionSpriteType)].sprite_width; + sprite_height_negative = spriteBounds[EnumValue(NextActionSpriteType)].sprite_height_negative; + sprite_height_positive = spriteBounds[EnumValue(NextActionSpriteType)].sprite_height_positive; Invalidate(); } } diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index c855b63847..ed8ea3b23a 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1406,9 +1406,9 @@ private: dst->ActionFrame = src->action_frame; const rct_sprite_bounds* spriteBounds = g_peep_animation_entries[dst->SpriteType].sprite_bounds; - dst->sprite_width = spriteBounds[static_cast(dst->ActionSpriteType)].sprite_width; - dst->sprite_height_negative = spriteBounds[static_cast(dst->ActionSpriteType)].sprite_height_negative; - dst->sprite_height_positive = spriteBounds[static_cast(dst->ActionSpriteType)].sprite_height_positive; + dst->sprite_width = spriteBounds[EnumValue(dst->ActionSpriteType)].sprite_width; + dst->sprite_height_negative = spriteBounds[EnumValue(dst->ActionSpriteType)].sprite_height_negative; + dst->sprite_height_positive = spriteBounds[EnumValue(dst->ActionSpriteType)].sprite_height_positive; dst->MoveTo({ src->x, src->y, src->z }); dst->Invalidate2(); diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index 38822bf769..fd2e0ac17d 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -81,4 +81,9 @@ template[[nodiscard]] constexpr uint64_t EnumsToFlags(T... types) return (EnumToFlag(types) | ...); } +template constexpr auto EnumValue(TEnum enumerator) noexcept +{ + return static_cast>(enumerator); +} + #endif