Gamepad Color Implementation

This commit is contained in:
MelonSpeedruns
2026-04-15 14:36:20 -04:00
parent 248723d8af
commit 5356b36caf
3 changed files with 112 additions and 0 deletions
+1
View File
@@ -4549,6 +4549,7 @@ public:
/* 0x03850 */ daAlink_procFunc mpProcFunc;
#if TARGET_PC
void handleGamepadColor();
void handleWolfHowl();
void handleQuickTransform();
bool checkGyroAimItemContext();
+107
View File
@@ -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) {
+4
View File
@@ -748,6 +748,10 @@ void fapGm_Execute() {
#endif
#if TARGET_PC
if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) {
dynamic_cast<daAlink_c*>(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<daAlink_c*>(link)->handleWolfHowl();