From f2c806185e67ece222d8c9724342cab84f419035 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 4 Mar 2023 18:04:02 -0800 Subject: [PATCH] Cycle color of player TARGET between held emeralds --- src/k_hud_track.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index ca7bf19e4..d16de57fd 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -2,6 +2,8 @@ #include #include +#include "core/static_vec.hpp" + #include "k_battle.h" #include "k_boss.h" #include "k_hud.h" @@ -15,6 +17,8 @@ #include "st_stuff.h" #include "v_video.h" +using namespace srb2; + namespace { @@ -35,11 +39,53 @@ struct TargetTracking case MT_EMERALD: return static_cast(mobj->color); + case MT_PLAYER: + return player_emeralds_color(); + default: return SKINCOLOR_NONE; } } + StaticVec player_emeralds_vec() const + { + StaticVec emeralds; + + const player_t* player = mobj->player; + + if (player == nullptr) + { + return emeralds; + } + + for (int i = 0; i < 7; ++i) + { + const uint32_t emeraldFlag = (1U << i); + + if (player->emeralds & emeraldFlag) + { + emeralds.push_back(emeraldFlag); + } + } + + return emeralds; + } + + skincolornum_t player_emeralds_color() const + { + const StaticVec emeralds = player_emeralds_vec(); + + if (emeralds.empty()) + { + return SKINCOLOR_NONE; + } + + constexpr tic_t kPeriod = TICRATE / 2; + const int idx = (leveltime / kPeriod) % emeralds.size(); + + return static_cast(K_GetChaosEmeraldColor(emeralds[idx])); + } + const uint8_t* colormap() const { const skincolornum_t clr = color();