Add Hud Editor support for timers (#376)

* hud editor support for timers

* split out modify top/left values to new func

* rename func for better reusability

* rename func
This commit is contained in:
Archez
2024-05-22 09:05:05 -05:00
committed by Garrett Cox
parent ac095e9abf
commit f61cf293d4
3 changed files with 178 additions and 59 deletions
+54 -39
View File
@@ -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);
+5 -1
View File
@@ -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 {
+119 -19
View File
@@ -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],