diff --git a/src/gfx.cpp b/src/gfx.cpp index e7ab98b22f..8dfc5683fa 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1659,15 +1659,15 @@ static void SetCursorSprite(CursorID cursor, PaletteID pal) static void SwitchAnimatedCursor() { - const AnimCursor *cur = _cursor.animate_cur; - - if (cur == nullptr || cur->sprite == AnimCursor::LAST) cur = _cursor.animate_list; + if (_cursor.animate_cur == std::end(_cursor.animate_list)) { + _cursor.animate_cur = std::begin(_cursor.animate_list); + } assert(!_cursor.sprites.empty()); - SetCursorSprite(cur->sprite, _cursor.sprites[0].image.pal); + SetCursorSprite(_cursor.animate_cur->sprite, _cursor.sprites[0].image.pal); - _cursor.animate_timeout = cur->display_time; - _cursor.animate_cur = cur + 1; + _cursor.animate_timeout = _cursor.animate_cur->display_time; + ++_cursor.animate_cur; } void CursorTick() @@ -1710,11 +1710,11 @@ void SetMouseCursor(CursorID sprite, PaletteID pal) * @param table Array of animation states. * @see SetMouseCursor */ -void SetAnimatedMouseCursor(const AnimCursor *table) +void SetAnimatedMouseCursor(std::span table) { assert(!_cursor.sprites.empty()); _cursor.animate_list = table; - _cursor.animate_cur = nullptr; + _cursor.animate_cur = std::end(table); _cursor.sprites[0].image.pal = PAL_NONE; SwitchAnimatedCursor(); } diff --git a/src/gfx_func.h b/src/gfx_func.h index 885f72ccf9..7820db9b35 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -169,7 +169,7 @@ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom); void SetMouseCursorBusy(bool busy); void SetMouseCursor(CursorID cursor, PaletteID pal); -void SetAnimatedMouseCursor(const AnimCursor *table); +void SetAnimatedMouseCursor(std::span table); void CursorTick(); void UpdateCursorSize(); bool ChangeResInGame(int w, int h); diff --git a/src/gfx_type.h b/src/gfx_type.h index 4434690bdd..e689aaf0a8 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -108,8 +108,7 @@ enum WindowKeyCodes : uint16_t { /** A single sprite of a list of animated cursors */ struct AnimCursor { - static const CursorID LAST = std::numeric_limits::max(); - CursorID sprite; ///< Must be set to LAST_ANIM when it is the last sprite of the loop + CursorID sprite; ///< Must be set to LAST_ANIM when it is the last sprite of the loop uint8_t display_time; ///< Amount of ticks this sprite will be shown }; @@ -139,8 +138,8 @@ struct CursorVars { Point draw_pos, draw_size; ///< position and size bounding-box for drawing - const AnimCursor *animate_list; ///< in case of animated cursor, list of frames - const AnimCursor *animate_cur; ///< in case of animated cursor, current frame + std::span animate_list{}; ///< in case of animated cursor, list of frames + std::span::iterator animate_cur = std::end(animate_list); ///< in case of animated cursor, current frame uint animate_timeout; ///< in case of animated cursor, number of ticks to show the current cursor bool visible; ///< cursor is visible diff --git a/src/table/animcursors.h b/src/table/animcursors.h index ed25691a5e..f51b9e0ee2 100644 --- a/src/table/animcursors.h +++ b/src/table/animcursors.h @@ -14,67 +14,49 @@ * is to be displayed. */ -/** - * Creates two array entries that define one - * status of the cursor. - * @param Sprite The Sprite to be displayed - * @param display_time The Number of ticks to display the sprite - */ -#define ANIM_CURSOR_LINE(Sprite, display_time) { Sprite, display_time }, - -/** - * This indicates the termination of the cursor list - */ -#define ANIM_CURSOR_END() ANIM_CURSOR_LINE(AnimCursor::LAST, 0) - /** * Animated cursor elements for demolition */ -static const AnimCursor _demolish_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_FIRST, 8) - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_1, 8) - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_2, 8) - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_LAST, 8) - ANIM_CURSOR_END() +static constexpr AnimCursor _demolish_animcursor[] = { + {SPR_CURSOR_DEMOLISH_FIRST, 8}, + {SPR_CURSOR_DEMOLISH_1, 8}, + {SPR_CURSOR_DEMOLISH_2, 8}, + {SPR_CURSOR_DEMOLISH_LAST, 8}, }; /** * Animated cursor elements for lower land */ -static const AnimCursor _lower_land_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_LOWERLAND_FIRST, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_LOWERLAND_1, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_LOWERLAND_LAST, 29) - ANIM_CURSOR_END() +static constexpr AnimCursor _lower_land_animcursor[] = { + {SPR_CURSOR_LOWERLAND_FIRST, 10}, + {SPR_CURSOR_LOWERLAND_1, 10}, + {SPR_CURSOR_LOWERLAND_LAST, 29}, }; /** * Animated cursor elements for raise land */ -static const AnimCursor _raise_land_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_RAISELAND_FIRST, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_RAISELAND_1, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_RAISELAND_LAST, 29) - ANIM_CURSOR_END() +static constexpr AnimCursor _raise_land_animcursor[] = { + {SPR_CURSOR_RAISELAND_FIRST, 10}, + {SPR_CURSOR_RAISELAND_1, 10}, + {SPR_CURSOR_RAISELAND_LAST, 29}, }; /** * Animated cursor elements for the goto icon */ -static const AnimCursor _order_goto_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_PICKSTATION_FIRST, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_PICKSTATION_1, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_PICKSTATION_LAST, 29) - ANIM_CURSOR_END() +static constexpr AnimCursor _order_goto_animcursor[] = { + {SPR_CURSOR_PICKSTATION_FIRST, 10}, + {SPR_CURSOR_PICKSTATION_1, 10}, + {SPR_CURSOR_PICKSTATION_LAST, 29}, }; /** * Animated cursor elements for the build signal icon */ -static const AnimCursor _build_signals_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_BUILDSIGNALS_FIRST, 20) - ANIM_CURSOR_LINE(SPR_CURSOR_BUILDSIGNALS_LAST, 20) - ANIM_CURSOR_END() +static constexpr AnimCursor _build_signals_animcursor[] = { + {SPR_CURSOR_BUILDSIGNALS_FIRST, 20}, + {SPR_CURSOR_BUILDSIGNALS_LAST, 20}, }; /** @@ -82,7 +64,7 @@ static const AnimCursor _build_signals_animcursor[] = { * definitions we have above. This is the only thing that is * accessed directly from other files */ -static const AnimCursor * const _animcursors[] = { +static constexpr std::span _animcursors[] = { _demolish_animcursor, _lower_land_animcursor, _raise_land_animcursor,