diff --git a/mm/2s2h/BenGui/HudEditor.cpp b/mm/2s2h/BenGui/HudEditor.cpp index 8a5e537c2..d442cf00e 100644 --- a/mm/2s2h/BenGui/HudEditor.cpp +++ b/mm/2s2h/BenGui/HudEditor.cpp @@ -8,20 +8,22 @@ extern "C" int16_t OTRGetRectDimensionFromRightEdge(float v); HudEditorElementID hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; HudEditorElement hudEditorElements[HUD_EDITOR_ELEMENT_MAX] = { - HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_B, "B Button", "B", 167, 17, 100, 255, 120, 255), - HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_C_LEFT, "C-Left Button", "CLeft", 227, 18, 255, 240, 0, 255), - HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_C_DOWN, "C-Down Button", "CDown", 249, 34, 255, 240, 0, 255), - 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_MINIGAME_COUNTER, "Minigames", "Minigames", 20, 67, 255, 255, 255, 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_B, "B Button", "B", 167, 17, 100, 255, 120, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_C_LEFT, "C-Left Button", "CLeft", 227, 18, 255, 240, 0, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_C_DOWN, "C-Down Button", "CDown", 249, 34, 255, 240, 0, 255), + 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_HEARTS, "Hearts", "Hearts", 30, 26, 255, 70, 50, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MAGIC_METER, "Magic", "Magic", 18, 34, 0, 200, 0, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_TIMERS, "Timers", "Timers", 26, 46, 255, 255, 255, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_TIMERS_MOON_CRASH, "Timer - Skull Kid", "SkullKidTimer", 115, 200, 255, 255, 255, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MINIGAME_COUNTER, "Minigames", "Minigames", 20, 67, 255, 255, 255, 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), }; extern "C" bool HudEditor_ShouldOverrideDraw() { @@ -32,25 +34,31 @@ extern "C" void HudEditor_SetActiveElement(HudEditorElementID id) { hudEditorActiveElement = id; } +extern "C" void HudEditor_ModifyRectPosValues(s16* rectLeft, s16* rectTop) { + s16 offsetFromBaseX = *rectLeft - hudEditorElements[hudEditorActiveElement].defaultX; + s16 offsetFromBaseY = *rectTop - hudEditorElements[hudEditorActiveElement].defaultY; + *rectLeft = CVarGetInteger(hudEditorElements[hudEditorActiveElement].xCvar, + hudEditorElements[hudEditorActiveElement].defaultX) + + (offsetFromBaseX * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f)); + *rectTop = 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) { + *rectLeft = OTRGetRectDimensionFromLeftEdge(*rectLeft); + } else if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == + HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT) { + *rectLeft = OTRGetRectDimensionFromRightEdge(*rectLeft); + } +} + 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); - } + HudEditor_ModifyRectPosValues(ulx, uly); // Adjust the values to match the kaleido matrix (origin 0,0 at center of screen, +y going up) *ulx -= SCREEN_WIDTH / 2; @@ -68,17 +76,22 @@ extern "C" void HudEditor_ModifyKaleidoEquipAnimValues(s16* ulx, s16* uly, s16* *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; - *rectLeft = CVarGetInteger(hudEditorElements[hudEditorActiveElement].xCvar, hudEditorElements[hudEditorActiveElement].defaultX) + (offsetFromBaseX * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f)); - *rectTop = CVarGetInteger(hudEditorElements[hudEditorActiveElement].yCvar, hudEditorElements[hudEditorActiveElement].defaultY) + (offsetFromBaseY * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f)); +extern "C" void HudEditor_ModifyDrawValuesFromBase(s16 baseX, s16 baseY, s16* rectLeft, s16* rectTop, s16* rectWidth, + s16* rectHeight, s16* dsdx, s16* dtdy) { + s16 offsetFromBaseX = *rectLeft - baseX; + s16 offsetFromBaseY = *rectTop - baseY; + *rectLeft = baseX + (offsetFromBaseX * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f)); + *rectTop = baseY + (offsetFromBaseY * CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f)); - if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT) { - *rectLeft = OTRGetRectDimensionFromLeftEdge(*rectLeft); - } else if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT) { - *rectLeft = OTRGetRectDimensionFromRightEdge(*rectLeft); - } + *rectWidth *= CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f); + *rectHeight *= CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f); + *dsdx /= CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f); + *dtdy /= CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f); +} + +extern "C" void HudEditor_ModifyDrawValues(s16* rectLeft, s16* rectTop, s16* rectWidth, s16* rectHeight, s16* dsdx, + s16* dtdy) { + HudEditor_ModifyRectPosValues(rectLeft, rectTop); *rectWidth *= CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f); *rectHeight *= CVarGetFloat(hudEditorElements[hudEditorActiveElement].scaleCvar, 1.0f); @@ -141,8 +154,10 @@ void HudEditorWindow::DrawElement() { 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_MAGIC_METER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT); + CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_TIMERS].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT); + CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_TIMERS_MOON_CRASH].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_43); CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_MINIGAME_COUNTER].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); diff --git a/mm/2s2h/BenGui/HudEditor.h b/mm/2s2h/BenGui/HudEditor.h index df0539a2f..8fe7e7b4d 100644 --- a/mm/2s2h/BenGui/HudEditor.h +++ b/mm/2s2h/BenGui/HudEditor.h @@ -31,8 +31,10 @@ typedef enum { 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_MAGIC_METER, + HUD_EDITOR_ELEMENT_TIMERS, + HUD_EDITOR_ELEMENT_TIMERS_MOON_CRASH, HUD_EDITOR_ELEMENT_MINIGAME_COUNTER, HUD_EDITOR_ELEMENT_RUPEE_COUNTER, HUD_EDITOR_ELEMENT_KEY_COUNTER, @@ -50,7 +52,9 @@ typedef enum { void HudEditor_SetActiveElement(HudEditorElementID id); bool HudEditor_ShouldOverrideDraw(); +void HudEditor_ModifyRectPosValues(s16* rectLeft, s16* rectTop); void HudEditor_ModifyKaleidoEquipAnimValues(s16* ulx, s16* uly, s16* shrinkRate); +void HudEditor_ModifyDrawValuesFromBase(s16 baseX, s16 baseY, s16* rectLeft, s16* rectTop, s16* rectWidth, s16* rectHeight, s16* dsdx, s16* dtdy); void HudEditor_ModifyDrawValues(s16* rectLeft, s16* rectTop, s16* rectWidth, s16* rectHeight, s16* dsdx, s16* dtdy); typedef struct { diff --git a/mm/src/code/z_parameter.c b/mm/src/code/z_parameter.c index 6b27c7d96..a628c1e03 100644 --- a/mm/src/code/z_parameter.c +++ b/mm/src/code/z_parameter.c @@ -307,7 +307,13 @@ Gfx* Gfx_DrawTexRectIA8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 text return gfx; } - HudEditor_ModifyDrawValues(&rectLeft, &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + if (hudEditorActiveElement == HUD_EDITOR_ELEMENT_TIMERS || + hudEditorActiveElement == HUD_EDITOR_ELEMENT_TIMERS_MOON_CRASH) { + HudEditor_ModifyDrawValuesFromBase(gSaveContext.timerX[sTimerId], gSaveContext.timerY[sTimerId], &rectLeft, + &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + } else { + HudEditor_ModifyDrawValues(&rectLeft, &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + } hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; } @@ -568,7 +574,13 @@ Gfx* Gfx_DrawTexRectI8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textu return gfx; } - HudEditor_ModifyDrawValues(&rectLeft, &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + if (hudEditorActiveElement == HUD_EDITOR_ELEMENT_TIMERS || + hudEditorActiveElement == HUD_EDITOR_ELEMENT_TIMERS_MOON_CRASH) { + HudEditor_ModifyDrawValuesFromBase(gSaveContext.timerX[sTimerId], gSaveContext.timerY[sTimerId], &rectLeft, + &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + } else { + HudEditor_ModifyDrawValues(&rectLeft, &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + } hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; } @@ -7080,6 +7092,11 @@ void Interface_DrawTimers(PlayState* play) { OSTime postmanTimerStopOsTime; s16 j; s16 i; + // 2S2H [Cosmetic] Hud editor values for timers + s16 newTimerX; + s16 newTimerY; + u8 modifiedTimerHudValues; + s16 hudTimerElement; OPEN_DISPS(play->state.gfxCtx); @@ -7114,8 +7131,40 @@ void Interface_DrawTimers(PlayState* play) { sTimerId = i; + // #region 2S2H [Cosmetic] Hud editor values for initial timer positions + if (sTimerId == TIMER_ID_MOON_CRASH) { + hudTimerElement = HUD_EDITOR_ELEMENT_TIMERS_MOON_CRASH; + newTimerX = R_MOON_CRASH_TIMER_X; + newTimerY = R_MOON_CRASH_TIMER_Y; + } else { + hudTimerElement = HUD_EDITOR_ELEMENT_TIMERS; + newTimerX = 26; + // In minigame that hides the hud, but not minigames where the timer starts in the center + if (interfaceCtx->minigameState != MINIGAME_STATE_NONE && interfaceCtx->magicAlpha != 255) { + newTimerY = 22; + } else if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) { + newTimerY = 54; // two rows of hearts + } else { + newTimerY = 46; // one row of hearts + } + } + // #endreion + // Process the timer for the postman counting minigame if (sTimerId == TIMER_ID_POSTMAN) { + // #region 2S2H [Cosmetic] Hud editor values for postman timer + HudEditor_SetActiveElement(hudTimerElement); + if (HudEditor_ShouldOverrideDraw()) { + HudEditor_ModifyRectPosValues(&newTimerX, &newTimerY); + } else { + newTimerX = 115; + newTimerY = 80; + } + gSaveContext.timerX[sTimerId] = newTimerX; + gSaveContext.timerY[sTimerId] = newTimerY; + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + // #endregion + switch (gSaveContext.timerStates[TIMER_ID_POSTMAN]) { case TIMER_STATE_POSTMAN_START: if (gSaveContext.timerDirections[TIMER_ID_POSTMAN] != TIMER_COUNT_DOWN) { @@ -7160,6 +7209,17 @@ void Interface_DrawTimers(PlayState* play) { gSaveContext.timerY[sTimerId] = 46; // one row of hearts } + // #region 2S2H [Cosmetic] Hud editor values for static minigame timers + HudEditor_SetActiveElement(hudTimerElement); + if (HudEditor_ShouldOverrideDraw()) { + HudEditor_ModifyRectPosValues(&newTimerX, &newTimerY); + modifiedTimerHudValues = true; + gSaveContext.timerX[sTimerId] = newTimerX; + gSaveContext.timerY[sTimerId] = newTimerY; + } + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + // #endregion + if ((interfaceCtx->minigameState == MINIGAME_STATE_COUNTDOWN_GO) || (interfaceCtx->minigameState == MINIGAME_STATE_PLAYING)) { if (gSaveContext.timerStates[sTimerId] == TIMER_STATE_START) { @@ -7188,34 +7248,54 @@ void Interface_DrawTimers(PlayState* play) { break; case TIMER_STATE_MOVING_TIMER: - // Move the timer from the center of the screen to the timer location where it will count. - if (sTimerId == TIMER_ID_MOON_CRASH) { - j = ((((void)0, gSaveContext.timerX[sTimerId]) - R_MOON_CRASH_TIMER_X) / sTimerStateTimer); - gSaveContext.timerX[sTimerId] = ((void)0, gSaveContext.timerX[sTimerId]) - j; - j = ((((void)0, gSaveContext.timerY[sTimerId]) - R_MOON_CRASH_TIMER_Y) / sTimerStateTimer); - gSaveContext.timerY[sTimerId] = ((void)0, gSaveContext.timerY[sTimerId]) - j; - } else { - j = ((((void)0, gSaveContext.timerX[sTimerId]) - 26) / sTimerStateTimer); + // #region 2S2H [Cosmetic] Hud Editor values for timers animation position + HudEditor_SetActiveElement(hudTimerElement); + if (HudEditor_ShouldOverrideDraw()) { + HudEditor_ModifyRectPosValues(&newTimerX, &newTimerY); + modifiedTimerHudValues = true; + j = ((((void)0, gSaveContext.timerX[sTimerId]) - newTimerX) / sTimerStateTimer); gSaveContext.timerX[sTimerId] = ((void)0, gSaveContext.timerX[sTimerId]) - j; - j = (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) - ? ((((void)0, gSaveContext.timerY[sTimerId]) - 54) / sTimerStateTimer) - : ((((void)0, gSaveContext.timerY[sTimerId]) - 46) / sTimerStateTimer); + j = ((((void)0, gSaveContext.timerY[sTimerId]) - newTimerY) / sTimerStateTimer); gSaveContext.timerY[sTimerId] = ((void)0, gSaveContext.timerY[sTimerId]) - j; + } else { + // #endregion + // Move the timer from the center of the screen to the timer location where it will count. + if (sTimerId == TIMER_ID_MOON_CRASH) { + j = ((((void)0, gSaveContext.timerX[sTimerId]) - R_MOON_CRASH_TIMER_X) / sTimerStateTimer); + gSaveContext.timerX[sTimerId] = ((void)0, gSaveContext.timerX[sTimerId]) - j; + j = ((((void)0, gSaveContext.timerY[sTimerId]) - R_MOON_CRASH_TIMER_Y) / sTimerStateTimer); + gSaveContext.timerY[sTimerId] = ((void)0, gSaveContext.timerY[sTimerId]) - j; + } else { + j = ((((void)0, gSaveContext.timerX[sTimerId]) - 26) / sTimerStateTimer); + gSaveContext.timerX[sTimerId] = ((void)0, gSaveContext.timerX[sTimerId]) - j; + + j = (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) + ? ((((void)0, gSaveContext.timerY[sTimerId]) - 54) / sTimerStateTimer) + : ((((void)0, gSaveContext.timerY[sTimerId]) - 46) / sTimerStateTimer); + gSaveContext.timerY[sTimerId] = ((void)0, gSaveContext.timerY[sTimerId]) - j; + } } sTimerStateTimer--; if (sTimerStateTimer == 0) { sTimerStateTimer = 20; - if (sTimerId == TIMER_ID_MOON_CRASH) { - gSaveContext.timerY[sTimerId] = R_MOON_CRASH_TIMER_Y; + // #region 2S2H [Cosmetic] Hud Editor clamp final timer position + if (HudEditor_ShouldOverrideDraw()) { + gSaveContext.timerX[sTimerId] = newTimerX; + gSaveContext.timerY[sTimerId] = newTimerY; } else { - gSaveContext.timerX[sTimerId] = 26; - if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) { - gSaveContext.timerY[sTimerId] = 54; // two rows of hearts + // #endregion + if (sTimerId == TIMER_ID_MOON_CRASH) { + gSaveContext.timerY[sTimerId] = R_MOON_CRASH_TIMER_Y; } else { - gSaveContext.timerY[sTimerId] = 46; // one row of hearts + gSaveContext.timerX[sTimerId] = 26; + if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) { + gSaveContext.timerY[sTimerId] = 54; // two rows of hearts + } else { + gSaveContext.timerY[sTimerId] = 46; // one row of hearts + } } } @@ -7224,6 +7304,8 @@ void Interface_DrawTimers(PlayState* play) { gSaveContext.timerStopTimes[sTimerId] = SECONDS_TO_TIMER(0); gSaveContext.timerPausedOsTimes[sTimerId] = 0; } + + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; // fallthrough case TIMER_STATE_COUNTING: if ((gSaveContext.timerStates[sTimerId] == TIMER_STATE_COUNTING) && @@ -7231,6 +7313,19 @@ void Interface_DrawTimers(PlayState* play) { gSaveContext.timerX[TIMER_ID_MOON_CRASH] = R_MOON_CRASH_TIMER_X; gSaveContext.timerY[TIMER_ID_MOON_CRASH] = R_MOON_CRASH_TIMER_Y; } + + // #region 2S2H [Cosmetic] Hud Editor set timers final position + if ((gSaveContext.timerStates[sTimerId] == TIMER_STATE_COUNTING)) { + HudEditor_SetActiveElement(hudTimerElement); + // If we are in a fallthrough, we don't want to modify the values a second time + if (HudEditor_ShouldOverrideDraw() && !modifiedTimerHudValues) { + HudEditor_ModifyRectPosValues(&newTimerX, &newTimerY); + } + gSaveContext.timerX[sTimerId] = newTimerX; + gSaveContext.timerY[sTimerId] = newTimerY; + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + } + // #endregion break; case TIMER_STATE_10: @@ -7443,6 +7538,8 @@ void Interface_DrawTimers(PlayState* play) { gDPPipeSync(OVERLAY_DISP++); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); + + HudEditor_SetActiveElement(hudTimerElement); OVERLAY_DISP = Gfx_DrawTexRectIA8( OVERLAY_DISP, gTimerClockIconTex, 0x10, 0x10, ((void)0, gSaveContext.timerX[sTimerId]), ((void)0, gSaveContext.timerY[sTimerId]) + 2, 0x10, 0x10, 1 << 10, 1 << 10); @@ -7492,6 +7589,7 @@ void Interface_DrawTimers(PlayState* play) { if (sPostmanBunnyHoodState == POSTMAN_MINIGAME_BUNNY_HOOD_ON) { // draw sTimerDigits[3] (10s of seconds) to sTimerDigits[6] (100s of milliseconds) for (j = 0; j < 4; j++) { + HudEditor_SetActiveElement(hudTimerElement); OVERLAY_DISP = Gfx_DrawTexRectI8( OVERLAY_DISP, sCounterTextures[sTimerDigits[j + 3]], 8, 0x10, ((void)0, gSaveContext.timerX[sTimerId]) + sTimerDigitsOffsetX[j], @@ -7500,6 +7598,7 @@ void Interface_DrawTimers(PlayState* play) { } else { // draw sTimerDigits[3] (10s of seconds) to sTimerDigits[7] (10s of milliseconds) for (j = 0; j < 5; j++) { + HudEditor_SetActiveElement(hudTimerElement); OVERLAY_DISP = Gfx_DrawTexRectI8( OVERLAY_DISP, sCounterTextures[sTimerDigits[j + 3]], 8, 0x10, ((void)0, gSaveContext.timerX[sTimerId]) + sTimerDigitsOffsetX[j], @@ -7509,6 +7608,7 @@ void Interface_DrawTimers(PlayState* play) { } else { // draw sTimerDigits[3] (6s of minutes) to sTimerDigits[7] (10s of milliseconds) for (j = 0; j < 8; j++) { + HudEditor_SetActiveElement(hudTimerElement); OVERLAY_DISP = Gfx_DrawTexRectI8( OVERLAY_DISP, sCounterTextures[sTimerDigits[j]], 8, 0x10, ((void)0, gSaveContext.timerX[sTimerId]) + sTimerDigitsOffsetX[j],