Support hud editor overrides for kaleido equip animations (#238)

* Support hud editor overrides for kaleido equip animations

* use mask style

* add missing unset

* update to support dpad equip animation
This commit is contained in:
Archez
2024-05-22 09:05:04 -05:00
committed by Garrett Cox
parent 820b628beb
commit ffcedc147d
4 changed files with 129 additions and 19 deletions
+39 -2
View File
@@ -1,5 +1,6 @@
#include "HudEditor.h"
#include "macros.h"
extern "C" int16_t OTRGetRectDimensionFromLeftEdge(float v);
extern "C" int16_t OTRGetRectDimensionFromRightEdge(float v);
@@ -13,13 +14,13 @@ HudEditorElement hudEditorElements[HUD_EDITOR_ELEMENT_MAX] = {
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_C_RIGHT, "C-Right Button", "CRight", 271, 18, 255, 240, 0, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_A, "A Button", "A", 191, 18, 100, 200, 255, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_C_UP, "C-Up Button", "CUp", 254, 16, 255, 240, 0, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_D_PAD, "D-Pad", "DPad", 271, 55, 255, 255, 255, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_START, "Start Button", "Start", 136, 17, 255, 130, 60, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MAGIC_METER, "Magic", "Magic", 18, 34, 0, 200, 0, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_HEARTS, "Hearts", "Hearts", 30, 26, 255, 70, 50, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_RUPEE_COUNTER, "Rupees", "Rupees", 26, 206, 200, 255, 100, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_KEY_COUNTER, "Keys", "Keys", 26, 190, 255, 255, 255, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_SKULLTULA_COUNTER, "Skulltulas", "Skulltulas", 26, 190, 255, 255, 255, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_D_PAD, "D-Pad", "DPad", 271, 55, 255, 255, 255, 255),
};
extern "C" bool HudEditor_ShouldOverrideDraw() {
@@ -30,6 +31,42 @@ extern "C" void HudEditor_SetActiveElement(HudEditorElementID id) {
hudEditorActiveElement = id;
}
extern "C" void HudEditor_ModifyKaleidoEquipAnimValues(s16* ulx, s16* uly, s16* shrinkRate) {
// Normalize the kaleido matrix values to screen rectangle dimensions
*ulx = (*ulx / 10) + (SCREEN_WIDTH / 2);
*uly = (SCREEN_HEIGHT / 2) - (*uly / 10);
s16 offsetFromBaseX = *ulx - hudEditorElements[hudEditorActiveElement].defaultX;
s16 offsetFromBaseY = *uly - hudEditorElements[hudEditorActiveElement].defaultY;
*ulx = CVarGetInteger(hudEditorElements[hudEditorActiveElement].xCvar,
hudEditorElements[hudEditorActiveElement].defaultX) +
(offsetFromBaseX * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f));
*uly = CVarGetInteger(hudEditorElements[hudEditorActiveElement].yCvar,
hudEditorElements[hudEditorActiveElement].defaultY) +
(offsetFromBaseY * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f));
if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT) {
*ulx = OTRGetRectDimensionFromLeftEdge(*ulx);
} else if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT) {
*ulx = OTRGetRectDimensionFromRightEdge(*ulx);
}
// Adjust the values to match the kaleido matrix (origin 0,0 at center of screen, +y going up)
*ulx -= SCREEN_WIDTH / 2;
// *uly = SCREEN_HEIGHT - *uly;
*uly = (SCREEN_HEIGHT / 2) - *uly;
// Scale by 10 for kaleido animation logic
*ulx *= 10;
*uly *= 10;
float scale = CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f);
// 320 is the vanilla start size, and 280 is the vanilla end size (or 160 for dpad)
// So we apply the scale to 280 and subtract to get the shrink rate
int16_t endAnimSize = hudEditorActiveElement == HUD_EDITOR_ELEMENT_D_PAD ? 160 : 280;
*shrinkRate = 320 - (s16)(endAnimSize * scale);
}
extern "C" void HudEditor_ModifyDrawValues(s16* rectLeft, s16* rectTop, s16* rectWidth, s16* rectHeight, s16* dsdx, s16* dtdy) {
s16 offsetFromBaseX = *rectLeft - hudEditorElements[hudEditorActiveElement].defaultX;
s16 offsetFromBaseY = *rectTop - hudEditorElements[hudEditorActiveElement].defaultY;
@@ -101,13 +138,13 @@ void HudEditorWindow::DrawElement() {
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_C_RIGHT].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_A].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_C_UP].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_D_PAD].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_START].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_MAGIC_METER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_HEARTS].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_RUPEE_COUNTER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_KEY_COUNTER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_SKULLTULA_COUNTER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_D_PAD].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
break;
}
}
+2 -1
View File
@@ -29,13 +29,13 @@ typedef enum {
HUD_EDITOR_ELEMENT_C_RIGHT,
HUD_EDITOR_ELEMENT_A,
HUD_EDITOR_ELEMENT_C_UP,
HUD_EDITOR_ELEMENT_D_PAD,
HUD_EDITOR_ELEMENT_START,
HUD_EDITOR_ELEMENT_MAGIC_METER,
HUD_EDITOR_ELEMENT_HEARTS,
HUD_EDITOR_ELEMENT_RUPEE_COUNTER,
HUD_EDITOR_ELEMENT_KEY_COUNTER,
HUD_EDITOR_ELEMENT_SKULLTULA_COUNTER,
HUD_EDITOR_ELEMENT_D_PAD,
HUD_EDITOR_ELEMENT_MAX,
} HudEditorElementID;
@@ -49,6 +49,7 @@ typedef enum {
void HudEditor_SetActiveElement(HudEditorElementID id);
bool HudEditor_ShouldOverrideDraw();
void HudEditor_ModifyKaleidoEquipAnimValues(s16* ulx, s16* uly, s16* shrinkRate);
void HudEditor_ModifyDrawValues(s16* rectLeft, s16* rectTop, s16* rectWidth, s16* rectHeight, s16* dsdx, s16* dtdy);
typedef struct {
@@ -7,6 +7,8 @@
#include "z_kaleido_scope.h"
#include "interface/parameter_static/parameter_static.h"
#include "BenGui/HudEditor.h"
s16 sEquipState = EQUIP_STATE_MAGIC_ARROW_GROW_ORB;
// Timer to hold magic arrow icon over magic arrow slot before moving when equipping.
@@ -782,16 +784,16 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
}
s16 sCButtonPosX[] = {
s16 sCButtonPosX[] = {
660, 900, 1140,
// #region 2S2H [Dpad]
1340, 860, 1100, 1100
1350, 1030, 1190, 1190
// #endregion
};
s16 sCButtonPosY[] = {
s16 sCButtonPosY[] = {
1100, 920, 1100,
// #region 2S2H [Dpad]
620, 620, 440, 760
570, 570, 410, 730
// #endregion
};
@@ -1499,13 +1501,46 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
return;
}
// #region 2S2H [Cosmetic] Track the C button position vanilla values or HUD editor adjusted values
s16 cButtonPosX = sCButtonPosX[pauseCtx->equipTargetCBtn];
s16 cButtonPosY = sCButtonPosY[pauseCtx->equipTargetCBtn];
HudEditor_SetActiveElement(pauseCtx->equipTargetCBtn < 3 ? HUD_EDITOR_ELEMENT_C_LEFT + pauseCtx->equipTargetCBtn
: HUD_EDITOR_ELEMENT_D_PAD);
if (sEquipState == EQUIP_STATE_MOVE_TO_C_BTN && HudEditor_ShouldOverrideDraw()) {
s16 equipAnimShrinkRate = 40;
HudEditor_ModifyKaleidoEquipAnimValues(&cButtonPosX, &cButtonPosY, &equipAnimShrinkRate);
// Override the anim shrink rate at the beginning (value is 320)
if (pauseCtx->equipAnimScale == 320) {
pauseCtx->equipAnimShrinkRate = equipAnimShrinkRate;
}
if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) ==
HUD_EDITOR_ELEMENT_MODE_HIDDEN) {
pauseCtx->equipAnimScale = 0;
pauseCtx->equipAnimShrinkRate = 0;
}
} else if (sEquipState == EQUIP_STATE_MOVE_TO_C_BTN && pauseCtx->equipTargetCBtn >= 3) {
// Equips to DPad need to shrink fast to be have a final smaller size (16px),
// So we override the anim shrink rate at the beginning (value is 320)
if (pauseCtx->equipAnimScale == 320) {
pauseCtx->equipAnimShrinkRate = 160;
}
}
HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_NONE);
// #endregion
if (sEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
bowItemVtx = &pauseCtx->itemVtx[SLOT_BOW * 4];
offsetX = ABS_ALT(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipAnimTimer;
} else {
offsetX = ABS_ALT(pauseCtx->equipAnimX - sCButtonPosX[pauseCtx->equipTargetCBtn]) / sEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - sCButtonPosY[pauseCtx->equipTargetCBtn]) / sEquipAnimTimer;
// 2S2H [Cosmetic] Use position vars from above
offsetX = ABS_ALT(pauseCtx->equipAnimX - cButtonPosX) / sEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - cButtonPosY) / sEquipAnimTimer;
}
if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipAnimAlpha < 254)) {
@@ -1537,13 +1572,14 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
}
} else {
// target is the c button
if (pauseCtx->equipAnimX >= sCButtonPosX[pauseCtx->equipTargetCBtn]) {
// 2S2H [Cosmetic] Use position vars from above
if (pauseCtx->equipAnimX >= cButtonPosX) {
pauseCtx->equipAnimX -= offsetX;
} else {
pauseCtx->equipAnimX += offsetX;
}
if (pauseCtx->equipAnimY >= sCButtonPosY[pauseCtx->equipTargetCBtn]) {
if (pauseCtx->equipAnimY >= cButtonPosY) {
pauseCtx->equipAnimY -= offsetY;
} else {
pauseCtx->equipAnimY += offsetY;
@@ -7,6 +7,8 @@
#include "z_kaleido_scope.h"
#include "interface/parameter_static/parameter_static.h"
#include "BenGui/HudEditor.h"
s16 sMaskEquipState = EQUIP_STATE_MAGIC_ARROW_GROW_ORB;
// Timer to hold magic arrow icon over magic arrow slot before moving when equipping.
@@ -683,16 +685,16 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
}
s16 sMaskCButtonPosX[] = {
s16 sMaskCButtonPosX[] = {
660, 900, 1140,
// #region 2S2H
1340, 860, 1100, 1100
1350, 1030, 1190, 1190
// #endregion
};
s16 sMaskCButtonPosY[] = {
s16 sMaskCButtonPosY[] = {
1100, 920, 1100,
// #region 2S2H
620, 620, 440, 760
570, 570, 410, 730
// #endregion
};
@@ -1028,6 +1030,38 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) {
return;
}
// #region 2S2H [Cosmetic] Track the C button position vanilla values or HUD editor adjusted values
s16 maskCButtonPosX = sMaskCButtonPosX[pauseCtx->equipTargetCBtn];
s16 maskCButtonPosY = sMaskCButtonPosY[pauseCtx->equipTargetCBtn];
HudEditor_SetActiveElement(pauseCtx->equipTargetCBtn < 3 ? HUD_EDITOR_ELEMENT_C_LEFT + pauseCtx->equipTargetCBtn
: HUD_EDITOR_ELEMENT_D_PAD);
if (sMaskEquipState == EQUIP_STATE_MOVE_TO_C_BTN && HudEditor_ShouldOverrideDraw()) {
s16 equipAnimShrinkRate = 40;
HudEditor_ModifyKaleidoEquipAnimValues(&maskCButtonPosX, &maskCButtonPosY, &equipAnimShrinkRate);
// Override the anim shrink rate at the beginning (value is 320)
if (pauseCtx->equipAnimScale == 320) {
pauseCtx->equipAnimShrinkRate = equipAnimShrinkRate;
}
if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) ==
HUD_EDITOR_ELEMENT_MODE_HIDDEN) {
pauseCtx->equipAnimScale = 0;
pauseCtx->equipAnimShrinkRate = 0;
}
} else if (sMaskEquipState == EQUIP_STATE_MOVE_TO_C_BTN && pauseCtx->equipTargetCBtn >= 3) {
// Equips to DPad need to shrink fast to be have a final smaller size (16px),
// So we override the anim shrink rate at the beginning (value is 320)
if (pauseCtx->equipAnimScale == 320) {
pauseCtx->equipAnimShrinkRate = 160;
}
}
HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_NONE);
// #endregion
if (sMaskEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
//! Note: Copied from OoT when `SLOT_BOW` was still valued at 3.
// Due to a shift, `SLOT_ARROW_ICE` now occupies slot 3 but this value was not updated
@@ -1036,8 +1070,9 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) {
offsetX = ABS_ALT(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sMaskEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sMaskEquipAnimTimer;
} else {
offsetX = ABS_ALT(pauseCtx->equipAnimX - sMaskCButtonPosX[pauseCtx->equipTargetCBtn]) / sMaskEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - sMaskCButtonPosY[pauseCtx->equipTargetCBtn]) / sMaskEquipAnimTimer;
// 2S2H [Cosmetic] Use position vars from above
offsetX = ABS_ALT(pauseCtx->equipAnimX - maskCButtonPosX) / sMaskEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - maskCButtonPosY) / sMaskEquipAnimTimer;
}
if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipAnimAlpha < 254)) {
@@ -1069,13 +1104,14 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) {
}
} else {
// target is the c button
if (pauseCtx->equipAnimX >= sMaskCButtonPosX[pauseCtx->equipTargetCBtn]) {
// 2S2H [Cosmetic] Use position vars from above
if (pauseCtx->equipAnimX >= maskCButtonPosX) {
pauseCtx->equipAnimX -= offsetX;
} else {
pauseCtx->equipAnimX += offsetX;
}
if (pauseCtx->equipAnimY >= sMaskCButtonPosY[pauseCtx->equipTargetCBtn]) {
if (pauseCtx->equipAnimY >= maskCButtonPosY) {
pauseCtx->equipAnimY -= offsetY;
} else {
pauseCtx->equipAnimY += offsetY;