From ffcedc147d6a3bee32bee1ae187634462987f097 Mon Sep 17 00:00:00 2001 From: Archez Date: Fri, 10 May 2024 15:59:55 -0400 Subject: [PATCH] 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 --- mm/2s2h/BenGui/HudEditor.cpp | 41 ++++++++++++++- mm/2s2h/BenGui/HudEditor.h | 3 +- .../ovl_kaleido_scope/z_kaleido_item.c | 52 ++++++++++++++++--- .../ovl_kaleido_scope/z_kaleido_mask.c | 52 ++++++++++++++++--- 4 files changed, 129 insertions(+), 19 deletions(-) diff --git a/mm/2s2h/BenGui/HudEditor.cpp b/mm/2s2h/BenGui/HudEditor.cpp index 6f375ab87..a4adbe36e 100644 --- a/mm/2s2h/BenGui/HudEditor.cpp +++ b/mm/2s2h/BenGui/HudEditor.cpp @@ -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; } } diff --git a/mm/2s2h/BenGui/HudEditor.h b/mm/2s2h/BenGui/HudEditor.h index 9b8f6e5f4..d5c54de32 100644 --- a/mm/2s2h/BenGui/HudEditor.h +++ b/mm/2s2h/BenGui/HudEditor.h @@ -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 { diff --git a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c index 1b22b5412..81b14976f 100644 --- a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c +++ b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c @@ -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; diff --git a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c index 7e00af70c..2df28e871 100644 --- a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c +++ b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c @@ -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;