From 5356b36cafe7f22edddfd29c4c81f3d87011f15d Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 15 Apr 2026 14:36:20 -0400 Subject: [PATCH 1/5] Gamepad Color Implementation --- include/d/actor/d_a_alink.h | 1 + src/d/actor/d_a_alink_dusk.cpp | 107 +++++++++++++++++++++++++++++++++ src/f_ap/f_ap_game.cpp | 4 ++ 3 files changed, 112 insertions(+) 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(); From dded619782b6f724dd331cf51fb43dd972285b2c Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 22 Apr 2026 13:00:35 -0400 Subject: [PATCH 2/5] wip --- src/d/actor/d_a_alink_dusk.cpp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/d/actor/d_a_alink_dusk.cpp b/src/d/actor/d_a_alink_dusk.cpp index b081ff1ce8..b35daf445f 100644 --- a/src/d/actor/d_a_alink_dusk.cpp +++ b/src/d/actor/d_a_alink_dusk.cpp @@ -5,9 +5,10 @@ #include "d/d_meter2_info.h" cXyz currentGamepadColor = {0, 0, 0}; +cXyz currentGamepadFlashColor = {0, 0, 0}; cXyz finalGamepadColor = {0, 0, 0}; float lerpSpeed = 0.0f; -const cXyz duskColor = {30, 30, -30}; +const cXyz duskColor = {45, 45, -45}; const cXyz heartColor1 = {255, 0, 0}; const cXyz heartColor2 = {155, 5, 5}; @@ -46,18 +47,21 @@ void daAlink_c::handleGamepadColor() { 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 (!checkEventRun()) { + 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); @@ -92,6 +96,8 @@ void daAlink_c::handleGamepadColor() { AddGamepadCurrentColor(duskColor); } + AddGamepadCurrentColor(currentGamepadFlashColor); + if (finalGamepadColor.x > 255) finalGamepadColor.x = 255; if (finalGamepadColor.x < 0) @@ -108,7 +114,8 @@ void daAlink_c::handleGamepadColor() { finalGamepadColor.z = 0; currentGamepadColor = LerpColor(currentGamepadColor, finalGamepadColor, lerpSpeed); - PADSetColor(PAD_1, (u8)currentGamepadColor.x, (u8)currentGamepadColor.y, (u8)currentGamepadColor.z); + PADSetColor(PAD_CHAN0, (u8)currentGamepadColor.x, (u8)currentGamepadColor.y, + (u8)currentGamepadColor.z); } void daAlink_c::handleWolfHowl() { From b0d53b3bcffb835a4aaa9bd70bcb40eb3d5682d6 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 22 Apr 2026 13:36:06 -0400 Subject: [PATCH 3/5] optimized code and removed bugs --- include/d/actor/d_a_alink.h | 1 - src/d/actor/d_a_alink_dusk.cpp | 114 --------------------------------- src/f_ap/f_ap_game.cpp | 108 ++++++++++++++++++++++++++++++- 3 files changed, 105 insertions(+), 118 deletions(-) diff --git a/include/d/actor/d_a_alink.h b/include/d/actor/d_a_alink.h index ed4f7f59bc..9980ab776f 100644 --- a/include/d/actor/d_a_alink.h +++ b/include/d/actor/d_a_alink.h @@ -4549,7 +4549,6 @@ public: /* 0x03850 */ daAlink_procFunc mpProcFunc; #if TARGET_PC - void handleGamepadColor(); void handleWolfHowl(); void handleQuickTransform(); bool checkGyroAimContext(); diff --git a/src/d/actor/d_a_alink_dusk.cpp b/src/d/actor/d_a_alink_dusk.cpp index 85bc12b21c..0f442aff94 100644 --- a/src/d/actor/d_a_alink_dusk.cpp +++ b/src/d/actor/d_a_alink_dusk.cpp @@ -4,120 +4,6 @@ #include "d/d_meter2_draw.h" #include "d/d_meter2_info.h" -cXyz currentGamepadColor = {0, 0, 0}; -cXyz currentGamepadFlashColor = {0, 0, 0}; -cXyz finalGamepadColor = {0, 0, 0}; -float lerpSpeed = 0.0f; -const cXyz duskColor = {45, 45, -45}; - -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; - } - - if (!checkEventRun()) { - 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); - } - - AddGamepadCurrentColor(currentGamepadFlashColor); - - 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_CHAN0, (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 3610f270a3..9550cee06e 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -733,10 +733,112 @@ static void fapGm_AfterRecord() { fapGm_After(); } -static void duskExecute() { - if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { - dynamic_cast(link)->handleGamepadColor(); +cXyz currentGamepadColor = {0, 0, 0}; +cXyz finalGamepadColor = {0, 0, 0}; +cXyz additionalGamepadColor = {0, 0, 0}; + +float lerpSpeed = 0.0f; + +const cXyz duskColor = {50, 50, -50}; +const cXyz noColor = {0, 0, 0}; + +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 SetGamepadAdditionalColor(cXyz addColor) { + additionalGamepadColor.x = addColor.x; + additionalGamepadColor.y = addColor.y; + additionalGamepadColor.z = addColor.z; +} + +void handleGamepadColor() { + bool setColor = false; + + fopAc_ac_c* zhint = dComIfGp_att_getZHint(); + if (zhint != NULL) { + FadeLED({50, 50, 175}, 2.0f); + setColor = true; } + + daPy_py_c* player = daPy_getPlayerActorClass(); + daAlink_c* link = daAlink_getAlinkActorClass(); + + if (link != nullptr && !setColor) { + if (link->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 (link->checkMagicArmorHeavy()) { + FadeLED({5, 100, 100}, 5.0f); + } else { + FadeLED({100, 0, 5}, 5.0f); + } + setColor = true; + break; + case dItemNo_WEAR_CASUAL_e: + FadeLED({235, 230, 115}, 5.0f); + setColor = true; + break; + } + } + } + + if (dKy_darkworld_check()) { + SetGamepadAdditionalColor(duskColor); + } else { + SetGamepadAdditionalColor(noColor); + } + + f32 finalRed = finalGamepadColor.x + additionalGamepadColor.x; + f32 finalGreen = finalGamepadColor.y + additionalGamepadColor.y; + f32 finalBlue = finalGamepadColor.z + additionalGamepadColor.z; + + if (finalRed > 255) + finalRed = 255; + if (finalRed < 0) + finalRed = 0; + + if (finalGreen > 255) + finalGreen = 255; + if (finalGreen < 0) + finalGreen = 0; + + if (finalBlue > 255) + finalBlue = 255; + if (finalBlue < 0) + finalBlue = 0; + + currentGamepadColor = LerpColor(currentGamepadColor, cXyz{finalRed, finalGreen, finalBlue}, lerpSpeed); + PADSetColor(PAD_CHAN0, (u8)currentGamepadColor.x, (u8)currentGamepadColor.y, (u8)currentGamepadColor.z); +} + +static void duskExecute() { + handleGamepadColor(); if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1)) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { From ac1adce12b88bda8f37d13afa331be9b4be97ae5 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 22 Apr 2026 13:52:14 -0400 Subject: [PATCH 4/5] fix building on linux --- src/f_ap/f_ap_game.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 9550cee06e..9e87acccc7 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -742,12 +742,8 @@ float lerpSpeed = 0.0f; const cXyz duskColor = {50, 50, -50}; const cXyz noColor = {0, 0, 0}; -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)}; + return {std::lerp(a.x, b.x, t), std::lerp(a.y, b.y, t), std::lerp(a.z, b.z, t)}; } void FadeLED(cXyz newColor, float speed) { From 4007dc4373241623997aa1e4c23bde1794f19750 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Thu, 23 Apr 2026 14:25:50 -0400 Subject: [PATCH 5/5] Separated gamepad color into its own files --- files.cmake | 1 + include/dusk/gamepad_color.h | 8 +++ src/dusk/gamepad_color.cpp | 106 +++++++++++++++++++++++++++++++++++ src/f_ap/f_ap_game.cpp | 101 +-------------------------------- 4 files changed, 116 insertions(+), 100 deletions(-) create mode 100644 include/dusk/gamepad_color.h create mode 100644 src/dusk/gamepad_color.cpp diff --git a/files.cmake b/files.cmake index c50cac2d8c..32a0996227 100644 --- a/files.cmake +++ b/files.cmake @@ -1348,6 +1348,7 @@ set(DUSK_FILES src/dusk/game_clock.cpp src/dusk/globals.cpp src/dusk/gyro.cpp + src/dusk/gamepad_color.cpp src/dusk/io.cpp src/dusk/layout.cpp src/dusk/logging.cpp diff --git a/include/dusk/gamepad_color.h b/include/dusk/gamepad_color.h new file mode 100644 index 0000000000..c7cfc1e716 --- /dev/null +++ b/include/dusk/gamepad_color.h @@ -0,0 +1,8 @@ +#pragma once + +#ifndef GAMEPAD_COLOR_H +#define GAMEPAD_COLOR_H + +void handleGamepadColor(); + +#endif \ No newline at end of file diff --git a/src/dusk/gamepad_color.cpp b/src/dusk/gamepad_color.cpp new file mode 100644 index 0000000000..cba32da632 --- /dev/null +++ b/src/dusk/gamepad_color.cpp @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include + +cXyz currentGamepadColor = {0, 0, 0}; +cXyz finalGamepadColor = {0, 0, 0}; +cXyz additionalGamepadColor = {0, 0, 0}; + +float lerpSpeed = 0.0f; + +const cXyz duskColor = {50, 50, -50}; +const cXyz noColor = {0, 0, 0}; + +cXyz LerpColor(cXyz a, cXyz b, float t) { + return {std::lerp(a.x, b.x, t), std::lerp(a.y, b.y, t), std::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 SetGamepadAdditionalColor(cXyz addColor) { + additionalGamepadColor.x = addColor.x; + additionalGamepadColor.y = addColor.y; + additionalGamepadColor.z = addColor.z; +} + +void handleGamepadColor() { + bool setColor = false; + + fopAc_ac_c* zhint = dComIfGp_att_getZHint(); + if (zhint != NULL) { + FadeLED({50, 50, 175}, 2.0f); + setColor = true; + } + + daPy_py_c* player = daPy_getPlayerActorClass(); + daAlink_c* link = daAlink_getAlinkActorClass(); + + if (link != nullptr && !setColor) { + if (link->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 (link->checkMagicArmorHeavy()) { + FadeLED({5, 100, 100}, 5.0f); + } else { + FadeLED({100, 0, 5}, 5.0f); + } + setColor = true; + break; + case dItemNo_WEAR_CASUAL_e: + FadeLED({235, 230, 115}, 5.0f); + setColor = true; + break; + } + } + } + + if (dKy_darkworld_check()) { + SetGamepadAdditionalColor(duskColor); + } else { + SetGamepadAdditionalColor(noColor); + } + + f32 finalRed = finalGamepadColor.x + additionalGamepadColor.x; + f32 finalGreen = finalGamepadColor.y + additionalGamepadColor.y; + f32 finalBlue = finalGamepadColor.z + additionalGamepadColor.z; + + if (finalRed > 255) + finalRed = 255; + if (finalRed < 0) + finalRed = 0; + + if (finalGreen > 255) + finalGreen = 255; + if (finalGreen < 0) + finalGreen = 0; + + if (finalBlue > 255) + finalBlue = 255; + if (finalBlue < 0) + finalBlue = 0; + + currentGamepadColor = LerpColor(currentGamepadColor, cXyz{finalRed, finalGreen, finalBlue}, lerpSpeed); + PADSetColor(PAD_CHAN0, (u8)currentGamepadColor.x, (u8)currentGamepadColor.y, (u8)currentGamepadColor.z); +} \ No newline at end of file diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 9e87acccc7..78fc240db4 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -23,6 +23,7 @@ #include "m_Do/m_Do_graphic.h" #include "m_Do/m_Do_main.h" #include "tracy/Tracy.hpp" +#include fapGm_HIO_c::fapGm_HIO_c() { mUsingHostIO = true; @@ -733,106 +734,6 @@ static void fapGm_AfterRecord() { fapGm_After(); } -cXyz currentGamepadColor = {0, 0, 0}; -cXyz finalGamepadColor = {0, 0, 0}; -cXyz additionalGamepadColor = {0, 0, 0}; - -float lerpSpeed = 0.0f; - -const cXyz duskColor = {50, 50, -50}; -const cXyz noColor = {0, 0, 0}; - -cXyz LerpColor(cXyz a, cXyz b, float t) { - return {std::lerp(a.x, b.x, t), std::lerp(a.y, b.y, t), std::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 SetGamepadAdditionalColor(cXyz addColor) { - additionalGamepadColor.x = addColor.x; - additionalGamepadColor.y = addColor.y; - additionalGamepadColor.z = addColor.z; -} - -void handleGamepadColor() { - bool setColor = false; - - fopAc_ac_c* zhint = dComIfGp_att_getZHint(); - if (zhint != NULL) { - FadeLED({50, 50, 175}, 2.0f); - setColor = true; - } - - daPy_py_c* player = daPy_getPlayerActorClass(); - daAlink_c* link = daAlink_getAlinkActorClass(); - - if (link != nullptr && !setColor) { - if (link->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 (link->checkMagicArmorHeavy()) { - FadeLED({5, 100, 100}, 5.0f); - } else { - FadeLED({100, 0, 5}, 5.0f); - } - setColor = true; - break; - case dItemNo_WEAR_CASUAL_e: - FadeLED({235, 230, 115}, 5.0f); - setColor = true; - break; - } - } - } - - if (dKy_darkworld_check()) { - SetGamepadAdditionalColor(duskColor); - } else { - SetGamepadAdditionalColor(noColor); - } - - f32 finalRed = finalGamepadColor.x + additionalGamepadColor.x; - f32 finalGreen = finalGamepadColor.y + additionalGamepadColor.y; - f32 finalBlue = finalGamepadColor.z + additionalGamepadColor.z; - - if (finalRed > 255) - finalRed = 255; - if (finalRed < 0) - finalRed = 0; - - if (finalGreen > 255) - finalGreen = 255; - if (finalGreen < 0) - finalGreen = 0; - - if (finalBlue > 255) - finalBlue = 255; - if (finalBlue < 0) - finalBlue = 0; - - currentGamepadColor = LerpColor(currentGamepadColor, cXyz{finalRed, finalGreen, finalBlue}, lerpSpeed); - PADSetColor(PAD_CHAN0, (u8)currentGamepadColor.x, (u8)currentGamepadColor.y, (u8)currentGamepadColor.z); -} - static void duskExecute() { handleGamepadColor();