diff --git a/include/d/actor/d_a_alink.h b/include/d/actor/d_a_alink.h index 53228af84b..786c0a4555 100644 --- a/include/d/actor/d_a_alink.h +++ b/include/d/actor/d_a_alink.h @@ -4549,6 +4549,7 @@ public: /* 0x03850 */ daAlink_procFunc mpProcFunc; #if TARGET_PC + void handleGamepadColor(); void handleWolfHowl(); void handleQuickTransform(); bool checkGyroAimItemContext(); diff --git a/src/d/actor/d_a_alink_dusk.cpp b/src/d/actor/d_a_alink_dusk.cpp index 9b937d3678..b081ff1ce8 100644 --- a/src/d/actor/d_a_alink_dusk.cpp +++ b/src/d/actor/d_a_alink_dusk.cpp @@ -4,6 +4,113 @@ #include "d/d_meter2_draw.h" #include "d/d_meter2_info.h" +cXyz currentGamepadColor = {0, 0, 0}; +cXyz finalGamepadColor = {0, 0, 0}; +float lerpSpeed = 0.0f; +const cXyz duskColor = {30, 30, -30}; + +const cXyz heartColor1 = {255, 0, 0}; +const cXyz heartColor2 = {155, 5, 5}; +const cXyz heartColor3 = {55, 5, 5}; + +float lerp(float a, float b, float t) { + return a + t * (b - a); +} + +cXyz LerpColor(cXyz a, cXyz b, float t) { + return {lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)}; +} + +void FadeLED(cXyz newColor, float speed) { + finalGamepadColor = newColor; + lerpSpeed = speed / 30.0f; +} + +void SetLED(cXyz newColor) { + currentGamepadColor = newColor; + finalGamepadColor = newColor; +} + +void AddGamepadCurrentColor(cXyz addColor) { + finalGamepadColor.x += addColor.x; + finalGamepadColor.y += addColor.y; + finalGamepadColor.z += addColor.z; +} + +void daAlink_c::handleGamepadColor() { + bool setColor = false; + + fopAc_ac_c* zhint = dComIfGp_att_getZHint(); + if (zhint != NULL) { + FadeLED({50, 50, 175}, 2.0f); + setColor = true; + } + + u8 linkHp = Z2GetLink()->getLinkHp(); + if (linkHp <= 2) { + FadeLED(heartColor1, 2.0f); + setColor = true; + } else if (linkHp <= 4) { + FadeLED(heartColor2, 2.0f); + setColor = true; + } else if (linkHp <= 6) { + FadeLED(heartColor3, 2.0f); + setColor = true; + } + + if (!setColor) { + if (checkWolf()) { + FadeLED({115, 115, 75}, 5.0f); + setColor = true; + } else { + switch (dComIfGs_getSelectEquipClothes()) { + case dItemNo_WEAR_KOKIRI_e: + FadeLED({0, 100, 0}, 5.0f); + setColor = true; + break; + case dItemNo_WEAR_ZORA_e: + FadeLED({0, 0, 100}, 5.0f); + setColor = true; + break; + case dItemNo_ARMOR_e: + if (checkMagicArmorHeavy()) { + FadeLED({5, 100, 100}, 5.0f); + } else { + FadeLED({100, 0, 5}, 5.0f); + } + setColor = true; + break; + default: + FadeLED({235, 230, 115}, 5.0f); + setColor = true; + break; + } + } + } + + if (dKy_darkworld_check()) { + AddGamepadCurrentColor(duskColor); + } + + if (finalGamepadColor.x > 255) + finalGamepadColor.x = 255; + if (finalGamepadColor.x < 0) + finalGamepadColor.x = 0; + + if (finalGamepadColor.y > 255) + finalGamepadColor.y = 255; + if (finalGamepadColor.y < 0) + finalGamepadColor.y = 0; + + if (finalGamepadColor.z > 255) + finalGamepadColor.z = 255; + if (finalGamepadColor.z < 0) + finalGamepadColor.z = 0; + + currentGamepadColor = LerpColor(currentGamepadColor, finalGamepadColor, lerpSpeed); + PADSetColor(PAD_1, (u8)currentGamepadColor.x, (u8)currentGamepadColor.y, (u8)currentGamepadColor.z); +} + void daAlink_c::handleWolfHowl() { if (checkWolf()) { if (!dusk::getSettings().game.sunsSong) { diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 84d2ab8e97..9150d764c7 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -748,6 +748,10 @@ void fapGm_Execute() { #endif #if TARGET_PC + if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { + dynamic_cast(link)->handleGamepadColor(); + } + if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1)) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { dynamic_cast(link)->handleWolfHowl();