diff --git a/include/functions.h b/include/functions.h index 19d0c8ad9f..77c3fa3712 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1383,9 +1383,9 @@ void func_800FD928(s32 param_1); // void func_800FDC94(void); // void func_800FE390(void); // void func_800FE3E0(void); -void func_800FE484(void); -s32 func_800FE498(void); -// void func_800FE4A8(void); +void Environment_StopTime(void); +void Environment_StartTime(void); +u8 Environment_IsTimeStopped(void); u32 func_800FE4B8(PlayState* play); // void func_800FE590(void); // void func_800FE5D0(void); @@ -1707,7 +1707,7 @@ Gfx* Gfx_DrawTexQuad4b(Gfx* gfx, TexturePtr texture, s32 fmt, s16 textureWidth, void Interface_StartTimer(s16 timerId, s16 seconds); void Interface_StartPostmanTimer(s16 seconds, s16 bunnyHoodState); -void func_8010EE74(PlayState* play, s32 day); +void Interface_NewDay(PlayState* play, s32 day); void Interface_SetHudVisibility(u16 hudVisibility); void func_80110038(PlayState* play); // void func_80111CB4(void); diff --git a/include/macros.h b/include/macros.h index f5638199eb..913ccac4ae 100644 --- a/include/macros.h +++ b/include/macros.h @@ -48,10 +48,13 @@ #define DAY_LENGTH (CLOCK_TIME(24, 0)) #define TIME_TO_MINUTES_F(time) ((time) * ((24.0f * 60.0f) / 0x10000)) // 0.021972656f -#define CLOCK_TIME_F(hr, min) (((hr) * 60.0f + (min)) * (0x10000 / (24.0f * 60.0f))) - #define TIME_TO_MINUTES_ALT_F(time) ((time) / (0x10000 / (24.0f * 60.0f))) + +#define TIME_TO_SECONDS_F(time) ((time) * ((24.0f * 60.0f * 60.0f) / 0x10000)) + +#define CLOCK_TIME_F(hr, min) (((hr) * 60.0f + (min)) * (0x10000 / (24.0f * 60.0f))) #define CLOCK_TIME_ALT_F(hr, min) (((hr) * 60.0f + (min)) / (24.0f * 60.0f / 0x10000)) +#define CLOCK_TIME_ALT2_F(hr, min) ((((hr) + (min) / 60.0f) * 60.0f) / (24.0f * 60.0f / 0x10000)) #define CAPACITY(upg, value) gUpgradeCapacities[upg][value] #define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg)) diff --git a/include/regs.h b/include/regs.h index 9fa5f736a5..41ba0c2917 100644 --- a/include/regs.h +++ b/include/regs.h @@ -43,15 +43,23 @@ #define bREG(r) BASE_REG(28, r) /* TODO: Actually confirm these, in case of miss-match it's at least a simple list to `sed` */ -#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT +#define R_TIME_SPEED REG(15) #define R_RUN_SPEED_LIMIT REG(45) + +#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT #define R_UPDATE_RATE SREG(30) +#define R_FB_FILTER_TYPE SREG(80) +#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c) +#define R_FB_FILTER_A SREG(84) +#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c) #define R_PAUSE_BG_PRERENDER_STATE SREG(94) + #define R_PLAY_FILL_SCREEN_ON MREG(64) #define R_PLAY_FILL_SCREEN_R MREG(65) #define R_PLAY_FILL_SCREEN_G MREG(66) #define R_PLAY_FILL_SCREEN_B MREG(67) #define R_PLAY_FILL_SCREEN_ALPHA MREG(68) + #define R_PAUSE_WORLD_MAP_YAW YREG(24) #define R_PAUSE_WORLD_MAP_Y_OFFSET YREG(25) #define R_PAUSE_WORLD_MAP_DEPTH YREG(26) @@ -60,6 +68,7 @@ #define R_PAUSE_DBG_QUEST_CURSOR_Y YREG(71) #define R_C_UP_ICON_X YREG(88) #define R_C_UP_ICON_Y YREG(89) + #define R_MAGIC_FILL_COLOR(i) ZREG(0 + i) #define R_C_BTN_COLOR(i) ZREG(39 + i) #define R_B_BTN_COLOR(i) ZREG(43 + i) @@ -76,21 +85,26 @@ #define R_ITEM_ICON_X(i) ZREG(82 + i) #define R_ITEM_ICON_Y(i) ZREG(86 + i) #define R_ITEM_ICON_DD(i) ZREG(90 + i) -#define R_A_BTN_Y XREG(16) -#define R_A_BTN_X XREG(17) -#define R_A_ICON_Y XREG(19) -#define R_A_ICON_X XREG(20) -#define R_A_BTN_COLOR(i) XREG(22 + i) -#define R_MAGIC_CONSUME_TIMER_GIANTS_MASK XREG(41) -#define R_PAUSE_DBG_MAP_CLOUD_ON XREG(50) -#define R_PAUSE_DBG_MAP_CLOUD_X XREG(52) -#define R_PAUSE_DBG_MAP_CLOUD_Y XREG(53) -#define R_MOON_CRASH_TIMER_Y XREG(80) -#define R_MOON_CRASH_TIMER_X XREG(81) -#define R_PAUSE_OWLWARP_ALPHA XREG(87) -#define R_STORY_FILL_SCREEN_ALPHA XREG(91) -#define R_REVERSE_FLOOR_INDEX XREG(94) -#define R_MINIMAP_DISABLED XREG(95) + +#define R_A_BTN_Y XREG(16) +#define R_A_BTN_X XREG(17) +#define R_A_ICON_Y XREG(19) +#define R_A_ICON_X XREG(20) +#define R_A_BTN_COLOR(i) XREG(22 + i) +#define R_MAGIC_CONSUME_TIMER_GIANTS_MASK XREG(41) +#define R_THREE_DAY_CLOCK_Y_POS XREG(43) +#define R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF XREG(44) +#define R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF XREG(45) +#define R_PAUSE_DBG_MAP_CLOUD_ON XREG(50) +#define R_PAUSE_DBG_MAP_CLOUD_X XREG(52) +#define R_PAUSE_DBG_MAP_CLOUD_Y XREG(53) +#define R_MOON_CRASH_TIMER_Y XREG(80) +#define R_MOON_CRASH_TIMER_X XREG(81) +#define R_PAUSE_OWLWARP_ALPHA XREG(87) +#define R_STORY_FILL_SCREEN_ALPHA XREG(91) +#define R_REVERSE_FLOOR_INDEX XREG(94) +#define R_MINIMAP_DISABLED XREG(95) + #define R_B_LABEL_DD WREG(0) #define R_OW_MINIMAP_X WREG(29) #define R_OW_MINIMAP_Y WREG(30) @@ -98,6 +112,7 @@ #define R_B_LABEL_Y(i) WREG(43 + i) #define R_DGN_MINIMAP_X WREG(68) #define R_DGN_MINIMAP_Y WREG(69) + #define R_MAP_INDEX VREG(11) #define R_MAP_TEX_INDEX_BASE VREG(12) #define R_MAP_TEX_INDEX VREG(13) @@ -111,9 +126,4 @@ #define R_ITEM_ICON_WIDTH(i) VREG(76 + i) #define R_ITEM_BTN_WIDTH(i) VREG(80 + i) -#define R_FB_FILTER_TYPE SREG(80) -#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c) -#define R_FB_FILTER_A SREG(84) -#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c) - #endif diff --git a/include/variables.h b/include/variables.h index 0d3bbf5d16..fc156ff31d 100644 --- a/include/variables.h +++ b/include/variables.h @@ -705,11 +705,11 @@ extern UNK_PTR D_801BF5C0; // extern UNK_TYPE1 D_801BFB14; // extern UNK_TYPE1 D_801BFB1C; // extern UNK_TYPE1 D_801BFB24; -// extern UNK_TYPE2 D_801BFB2C; +// extern UNK_TYPE2 sThreeDayClockAlpha; // extern UNK_TYPE2 D_801BFB30; // extern UNK_TYPE2 D_801BFB34; -// extern UNK_TYPE1 D_801BFB38; -// extern UNK_TYPE1 D_801BFB6C; +// extern UNK_TYPE1 sThreeDayClockHours; +// extern UNK_TYPE1 sThreeDayClockHourTextures; // extern UNK_TYPE2 D_801BFBCC; // extern UNK_TYPE2 D_801BFBD0; // extern UNK_TYPE2 D_801BFBD4; @@ -728,7 +728,7 @@ extern UNK_PTR D_801BF5C0; // extern UNK_TYPE1 D_801BFC08; // extern UNK_TYPE1 D_801BFC0C; // extern UNK_TYPE1 D_801BFC10; -// extern UNK_TYPE1 D_801BFC14; +// extern UNK_TYPE1 sFinalHoursDigitTextures; // extern UNK_TYPE1 D_801BFC40; // extern UNK_TYPE2 sTimerStateTimer; // extern UNK_TYPE2 sTimerDigits; diff --git a/include/z64.h b/include/z64.h index eabda7d4e7..edc8e5bbf0 100644 --- a/include/z64.h +++ b/include/z64.h @@ -466,106 +466,6 @@ typedef struct { /* 0x2CA */ s16 unk_2CA; // Uses OwlWarpId enum for Owl Warp. Never set. } PauseContext; // size = 0x2D0 -typedef struct { - /* 0x000 */ View view; - /* 0x168 */ Vtx* actionVtx; - /* 0x16C */ Vtx* beatingHeartVtx; - /* 0x170 */ u8* parameterSegment; - /* 0x174 */ u8* doActionSegment; - /* 0x178 */ u8* iconItemSegment; - /* 0x17C */ u8* mapSegment; - /* 0x180 */ u8* unk_180; - /* 0x184 */ DmaRequest dmaRequest_184; - /* 0x1A4 */ DmaRequest dmaRequest_1A4; - /* 0x1C4 */ DmaRequest dmaRequest_1C4; - /* 0x1E4 */ OSMesgQueue loadQueue; - /* 0x1FC */ OSMesg loadMsg; - /* 0x200 */ Viewport viewport; - /* 0x210 */ s16 unk_210; - /* 0x212 */ u16 unk_212; - /* 0x214 */ u16 unk_214; - /* 0x218 */ f32 unk_218; - /* 0x21C */ s16 unk_21C; - /* 0x21E */ s16 bButtonDoAction; - /* 0x220 */ s16 unk_220; - /* 0x222 */ s16 unk_222; - /* 0x224 */ s16 unk_224; - /* 0x226 */ s16 lifeColorChange; - /* 0x228 */ s16 lifeColorChangeDirection; - /* 0x22A */ s16 beatingHeartPrim[3]; - /* 0x230 */ s16 beatingHeartEnv[3]; - /* 0x236 */ s16 heartsPrimR[2]; - /* 0x23A */ s16 heartsPrimG[2]; - /* 0x23E */ s16 heartsPrimB[2]; - /* 0x242 */ s16 heartsEnvR[2]; - /* 0x246 */ s16 heartsEnvG[2]; - /* 0x24A */ s16 heartsEnvB[2]; - /* 0x24E */ s16 health; - /* 0x250 */ s16 unkTimer; - /* 0x252 */ s16 lifeSizeChange; - /* 0x254 */ s16 lifeSizeChangeDirection; // 1 means shrinking, 0 growing - /* 0x256 */ s16 unk_256; - /* 0x258 */ s16 magicConsumptionTimer; // For certain magic states, 1 unit of magic is consumed every time the timer reaches 0 - /* 0x25A */ u8 numHorseBoosts; - /* 0x25C */ u16 minigamePoints; // Points to add to the minigame score. Reset to 0 every frame. - /* 0x25E */ u16 minigameHiddenPoints; // Points to add to the secondary set of minigame points not displayed. Reset to 0 every frame. - /* 0x260 */ u16 minigameAmmo; - /* 0x262 */ u16 minigameUnusedPoints; // Associated with other minigame points, unused - /* 0x264 */ s16 unk_264; - /* 0x266 */ s16 aAlpha; - /* 0x268 */ s16 bAlpha; - /* 0x26A */ s16 cLeftAlpha; - /* 0x26C */ s16 cDownAlpha; - /* 0x26E */ s16 cRightAlpha; - /* 0x270 */ s16 healthAlpha; - /* 0x272 */ s16 magicAlpha; - /* 0x274 */ s16 minimapAlpha; - /* 0x276 */ s16 startAlpha; - /* 0x278 */ s16 unk_278; - /* 0x27A */ s16 dungeonOrBossAreaMapIndex; - /* 0x27C */ s16 mapRoomNum; - /* 0x27E */ u8 unk_27E; - /* 0x27F */ u8 unk_27F; - /* 0x280 */ u8 minigameState; - /* 0x282 */ s16 minigameCountdownAlpha; - /* 0x284 */ s16 minigameCountdownScale; - /* 0x286 */ s16 perfectLettersOn; - /* 0x288 */ s16 perfectLettersType; - /* 0x28A */ s16 perfectLettersState[PERFECT_LETTERS_NUM_LETTERS]; - /* 0x29A */ u16 perfectLettersAngles[PERFECT_LETTERS_NUM_LETTERS]; // Angle that follows the projectory of an ellipse - /* 0x2AA */ s16 perfectLettersOffsetX[PERFECT_LETTERS_NUM_LETTERS]; - /* 0x2BC */ f32 perfectLettersSemiAxisX[PERFECT_LETTERS_NUM_LETTERS]; - /* 0x2DC */ f32 perfectLettersSemiAxisY[PERFECT_LETTERS_NUM_LETTERS]; - /* 0x2FC */ s16 perfectLettersPrimColor[4]; - /* 0x304 */ s16 perfectLettersCount; - /* 0x306 */ s16 perfectLettersUnused; - /* 0x308 */ s16 perfectLettersColorIndex; - /* 0x30A */ s16 perfectLettersColorTimer; - /* 0x30C */ s16 perfectLettersTimer; - struct { - /* 0x30E */ u8 unk_30E; // "h_gauge" - /* 0x30F */ u8 bButton; - /* 0x310 */ u8 aButton; - /* 0x311 */ u8 tradeItems; - /* 0x312 */ u8 unk_312; - /* 0x313 */ u8 unk_313; - /* 0x314 */ u8 unk_314; - /* 0x315 */ u8 songOfSoaring; - /* 0x316 */ u8 songOfStorms; - /* 0x317 */ u8 unk_317; - /* 0x318 */ u8 pictographBox; - /* 0x319 */ u8 all; // "another"; enables all item restrictions - } restrictions; // size = 0xC - /* 0x31A */ u8 storyState; - /* 0x31B */ u8 storyType; - /* 0x31C */ u8 unk_31C; - /* 0x320 */ OSMesgQueue unk_320; - /* 0x338 */ OSMesg unk_338; - /* 0x33C */ void* unk_33C; - /* 0x340 */ u32 unk_340; - /* 0x344 */ u32 unk_344; -} InterfaceContext; // size = 0x348 - typedef struct { /* 0x00 */ void* loadedRamAddr; /* 0x04 */ uintptr_t vromStart; @@ -584,10 +484,8 @@ typedef enum { typedef struct { /* 0x00 */ u16 unk_0; - /* 0x02 */ u16 timeIncrement; - /* 0x04 */ f32 unk_4; - /* 0x08 */ f32 unk_8; - /* 0x0C */ f32 unk_C; + /* 0x02 */ u16 sceneTimeSpeed; + /* 0x04 */ Vec3f sunPos; /* 0x10 */ u8 unk_10; /* 0x11 */ u8 unk_11; /* 0x12 */ u8 unk_12; diff --git a/include/z64interface.h b/include/z64interface.h index 4c27a25fc5..cd17b12672 100644 --- a/include/z64interface.h +++ b/include/z64interface.h @@ -2,6 +2,7 @@ #define Z64INTERFACE_H #include "ultra64.h" +#include "z64view.h" typedef enum { /* 0 */ MINIGAME_STATE_NONE, @@ -38,4 +39,104 @@ typedef enum { #define PERFECT_LETTERS_NUM_LETTERS 8 #define PERFECT_LETTERS_ANGLE_PER_LETTER (0x10000 / PERFECT_LETTERS_NUM_LETTERS) +typedef struct { + /* 0x000 */ View view; + /* 0x168 */ Vtx* actionVtx; + /* 0x16C */ Vtx* beatingHeartVtx; + /* 0x170 */ u8* parameterSegment; + /* 0x174 */ u8* doActionSegment; + /* 0x178 */ u8* iconItemSegment; + /* 0x17C */ u8* mapSegment; + /* 0x180 */ u8* unk_180; + /* 0x184 */ DmaRequest dmaRequest_184; + /* 0x1A4 */ DmaRequest dmaRequest_1A4; + /* 0x1C4 */ DmaRequest dmaRequest_1C4; + /* 0x1E4 */ OSMesgQueue loadQueue; + /* 0x1FC */ OSMesg loadMsg; + /* 0x200 */ Viewport viewport; + /* 0x210 */ s16 unk_210; + /* 0x212 */ u16 unk_212; + /* 0x214 */ u16 unk_214; + /* 0x218 */ f32 unk_218; + /* 0x21C */ s16 unk_21C; + /* 0x21E */ s16 bButtonDoAction; + /* 0x220 */ s16 unk_220; + /* 0x222 */ s16 unk_222; + /* 0x224 */ s16 unk_224; + /* 0x226 */ s16 lifeColorChange; + /* 0x228 */ s16 lifeColorChangeDirection; + /* 0x22A */ s16 beatingHeartPrim[3]; + /* 0x230 */ s16 beatingHeartEnv[3]; + /* 0x236 */ s16 heartsPrimR[2]; + /* 0x23A */ s16 heartsPrimG[2]; + /* 0x23E */ s16 heartsPrimB[2]; + /* 0x242 */ s16 heartsEnvR[2]; + /* 0x246 */ s16 heartsEnvG[2]; + /* 0x24A */ s16 heartsEnvB[2]; + /* 0x24E */ s16 health; + /* 0x250 */ s16 unkTimer; + /* 0x252 */ s16 lifeSizeChange; + /* 0x254 */ s16 lifeSizeChangeDirection; // 1 means shrinking, 0 growing + /* 0x256 */ s16 unk_256; + /* 0x258 */ s16 magicConsumptionTimer; // For certain magic states, 1 unit of magic is consumed every time the timer reaches 0 + /* 0x25A */ u8 numHorseBoosts; + /* 0x25C */ u16 minigamePoints; // Points to add to the minigame score. Reset to 0 every frame. + /* 0x25E */ u16 minigameHiddenPoints; // Points to add to the secondary set of minigame points not displayed. Reset to 0 every frame. + /* 0x260 */ u16 minigameAmmo; + /* 0x262 */ u16 minigameUnusedPoints; // Associated with other minigame points, unused + /* 0x264 */ s16 unk_264; + /* 0x266 */ s16 aAlpha; + /* 0x268 */ s16 bAlpha; + /* 0x26A */ s16 cLeftAlpha; + /* 0x26C */ s16 cDownAlpha; + /* 0x26E */ s16 cRightAlpha; + /* 0x270 */ s16 healthAlpha; + /* 0x272 */ s16 magicAlpha; + /* 0x274 */ s16 minimapAlpha; + /* 0x276 */ s16 startAlpha; + /* 0x278 */ s16 unk_278; + /* 0x27A */ s16 dungeonOrBossAreaMapIndex; + /* 0x27C */ s16 mapRoomNum; + /* 0x27E */ u8 unk_27E; + /* 0x27F */ u8 unk_27F; + /* 0x280 */ u8 minigameState; + /* 0x282 */ s16 minigameCountdownAlpha; + /* 0x284 */ s16 minigameCountdownScale; + /* 0x286 */ s16 perfectLettersOn; + /* 0x288 */ s16 perfectLettersType; + /* 0x28A */ s16 perfectLettersState[PERFECT_LETTERS_NUM_LETTERS]; + /* 0x29A */ u16 perfectLettersAngles[PERFECT_LETTERS_NUM_LETTERS]; // Angle that follows the projectory of an ellipse + /* 0x2AA */ s16 perfectLettersOffsetX[PERFECT_LETTERS_NUM_LETTERS]; + /* 0x2BC */ f32 perfectLettersSemiAxisX[PERFECT_LETTERS_NUM_LETTERS]; + /* 0x2DC */ f32 perfectLettersSemiAxisY[PERFECT_LETTERS_NUM_LETTERS]; + /* 0x2FC */ s16 perfectLettersPrimColor[4]; + /* 0x304 */ s16 perfectLettersCount; + /* 0x306 */ s16 perfectLettersUnused; + /* 0x308 */ s16 perfectLettersColorIndex; + /* 0x30A */ s16 perfectLettersColorTimer; + /* 0x30C */ s16 perfectLettersTimer; + struct { + /* 0x30E */ u8 unk_30E; // "h_gauge" + /* 0x30F */ u8 bButton; + /* 0x310 */ u8 aButton; + /* 0x311 */ u8 tradeItems; + /* 0x312 */ u8 unk_312; + /* 0x313 */ u8 unk_313; + /* 0x314 */ u8 unk_314; + /* 0x315 */ u8 songOfSoaring; + /* 0x316 */ u8 songOfStorms; + /* 0x317 */ u8 unk_317; + /* 0x318 */ u8 pictographBox; + /* 0x319 */ u8 all; // "another"; enables all item restrictions + } restrictions; // size = 0xC + /* 0x31A */ u8 storyState; + /* 0x31B */ u8 storyType; + /* 0x31C */ u8 unk_31C; + /* 0x320 */ OSMesgQueue unk_320; + /* 0x338 */ OSMesg unk_338; + /* 0x33C */ void* unk_33C; + /* 0x340 */ u32 unk_340; + /* 0x344 */ u32 unk_344; +} InterfaceContext; // size = 0x348 + #endif diff --git a/include/z64save.h b/include/z64save.h index a742f6b0bc..e6df4e67c5 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -245,7 +245,7 @@ typedef struct Save { /* 0x000C */ u16 time; // "zelda_time" /* 0x000E */ u16 owlSaveLocation; /* 0x0010 */ s32 isNight; // "asahiru_fg" - /* 0x0014 */ s32 daySpeed; // "change_zelda_time" + /* 0x0014 */ s32 timeSpeedOffset; // "change_zelda_time" /* 0x0018 */ s32 day; // "totalday" /* 0x001C */ s32 daysElapsed; // "eventday" /* 0x0020 */ u8 playerForm; // "player_character" @@ -396,6 +396,11 @@ typedef enum SunsSongState { #define CURRENT_DAY (((void)0, gSaveContext.save.day) % 5) +// The day begins at CLOCK_TIME(6, 0) so it must be offset. +#define TIME_UNTIL_MOON_CRASH \ + ((4 - CURRENT_DAY) * DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0))); +#define TIME_UNTIL_NEW_DAY (DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0))); + #define GET_PLAYER_FORM ((void)0, gSaveContext.save.playerForm) #define SLOT(item) gItemSlots[item] diff --git a/include/z64scene.h b/include/z64scene.h index 088565c0c9..eae2e318b9 100644 --- a/include/z64scene.h +++ b/include/z64scene.h @@ -119,7 +119,7 @@ typedef struct { /* 0x2 */ UNK_TYPE1 pad2[2]; /* 0x4 */ u8 hour; /* 0x5 */ u8 min; - /* 0x6 */ u8 unk6; + /* 0x6 */ u8 timeSpeed; } SCmdTimeSettings; // size = 0x7 typedef struct { diff --git a/src/code/z_demo.c b/src/code/z_demo.c index 6473540280..7d665e208b 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -252,9 +252,9 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c break; case 0x12: if (!gSaveContext.save.isNight) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) - (u16)REG(15); + gSaveContext.save.time = ((void)0, gSaveContext.save.time) - (u16)R_TIME_SPEED; } else { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) - (u16)(2 * REG(15)); + gSaveContext.save.time = ((void)0, gSaveContext.save.time) - (u16)(2 * R_TIME_SPEED); } break; case 0x13: @@ -326,10 +326,10 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c if (csCtx->frames != D_801BB15C) { D_801BB15C = csCtx->frames; - if (REG(15) != 0) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15); + if (R_TIME_SPEED != 0) { + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED; gSaveContext.save.time = - ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed); + ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset); } } break; diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index ad66fe4a18..919abbb1d7 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -124,11 +124,11 @@ #pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE3E0.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE484.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StopTime.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE498.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_StartTime.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE4A8.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_IsTimeStopped.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800FE4B8.s") diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c index fb8dbfcbf0..759c3d6119 100644 --- a/src/code/z_message_nes.c +++ b/src/code/z_message_nes.c @@ -212,13 +212,9 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16* s16 i; if (arg1 == 0xCF) { - // Calculates the time left before the moon crashes. - // The day begins at CLOCK_TIME(6, 0) so it must be offset. - timeLeft = (4 - CURRENT_DAY) * DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0)); + timeLeft = TIME_UNTIL_MOON_CRASH; } else { - // Calculates the time left before a new day. - // The day begins at CLOCK_TIME(6, 0) so it must be offset. - timeLeft = DAY_LENGTH - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0)); + timeLeft = TIME_UNTIL_NEW_DAY; } timeLeftInMinutes = TIME_TO_MINUTES_F(timeLeft); diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 4e61639fb8..29155be2a8 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -932,7 +932,28 @@ u32 Interface_GetCompressedTimerDigits(s16 timerId) { (timerArr[4] << 4) | timerArr[5]; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010EE74.s") +void Interface_NewDay(PlayState* play, s32 day) { + s32 pad; + s16 i = day - 1; + + // i is used to store dayMinusOne + if ((i < 0) || (i >= 3)) { + i = 0; + } + + // Loads day number from week_static for the three-day clock + DmaMgr_SendRequest0((u32)play->interfaceCtx.doActionSegment + 0x780, + (u32)SEGMENT_ROM_START(week_static) + i * 0x510, 0x510); + + // i is used to store sceneId + for (i = 0; i < ARRAY_COUNT(gSaveContext.save.permanentSceneFlags); i++) { + gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest; + gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0; + gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1; + gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom; + gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible; + } +} void Interface_SetHudVisibility(u16 hudVisibility) { if (gSaveContext.hudVisibility != hudVisibility) { @@ -3088,17 +3109,550 @@ s16 D_801BFB24[] = { 0, 255, 100, 0 }; // magicArrowEffectsB #pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80119030.s") -s16 D_801BFB2C = 255; +/** + * Draws either the analog three-day clock or the digital final-hours clock + */ +#ifdef NON_MATCHING +void Interface_DrawClock(PlayState* play) { + static s16 sThreeDayClockAlpha = 255; + static s16 D_801BFB30 = 0; // sClockAlphaTimer1 + static s16 D_801BFB34 = 0; // sClockAlphaTimer2 + static u16 sThreeDayClockHours[] = { + CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0), + CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0), + CLOCK_TIME(10, 0), CLOCK_TIME(11, 0), CLOCK_TIME(12, 0), CLOCK_TIME(13, 0), CLOCK_TIME(14, 0), + CLOCK_TIME(15, 0), CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), + CLOCK_TIME(20, 0), CLOCK_TIME(21, 0), CLOCK_TIME(22, 0), CLOCK_TIME(23, 0), CLOCK_TIME(24, 0) - 1, + }; + static TexturePtr sThreeDayClockHourTextures[] = { + gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex, + gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex, + gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex, + gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex, + gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex, + gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex, + }; + static s16 D_801BFBCC = 0; // sClockInvDiamondPrimRed + static s16 D_801BFBD0 = 0; // sClockInvDiamondPrimGreen + static s16 D_801BFBD4 = 255; // sClockInvDiamondPrimBlue + static s16 D_801BFBD8 = 0; // sClockInvDiamondEnvRed + static s16 D_801BFBDC = 0; // sClockInvDiamondEnvGreen + static s16 D_801BFBE0 = 0; // sClockInvDiamondEnvBlue + static s16 D_801BFBE4 = 15; // sClockInvDiamondTimer + static s16 D_801BFBE8 = 0; // sClockInvDiamondTargetIndex + static s16 D_801BFBEC[] = { 100, 0 }; // sClockInvDiamondPrimRedTargets + static s16 D_801BFBF0[] = { 205, 155 }; // sClockInvDiamondPrimGreenTargets + static s16 D_801BFBF4[] = { 255, 255 }; // sClockInvDiamondPrimBlueTargets + static s16 D_801BFBF8[] = { 30, 0 }; // sClockInvDiamondEnvRedTargets + static s16 D_801BFBFC[] = { 30, 0 }; // sClockInvDiamondEnvGreenTargets + static s16 D_801BFC00[] = { 100, 0 }; // sClockInvDiamondEnvBlueTargets + static s16 D_801BFC04[] = { 255, 0 }; // sFinalHoursClockDigitsRed + static s16 D_801BFC08[] = { 100, 0 }; // sFinalHoursClockFrameEnvRedTargets + static s16 D_801BFC0C[] = { 30, 0 }; // sFinalHoursClockFrameEnvGreenTargets + static s16 D_801BFC10[] = { 100, 0 }; // sFinalHoursClockFrameEnvBlueTargets + static TexturePtr sFinalHoursDigitTextures[] = { + gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex, + gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex, + gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex, + }; + // sFinalHoursDigitSlotPosXOffset + static s16 D_801BFC40[] = { + 127, 136, 144, 151, 160, 168, 175, 184, + }; + InterfaceContext* interfaceCtx = &play->interfaceCtx; + MessageContext* msgCtx = &play->msgCtx; + s16 sp1E6; + f32 temp_f14; + u32 timeUntilMoonCrash; + f32 sp1D8; + f32 timeInMinutes; + f32 timeInSeconds; + f32 sp1CC; + s32 new_var; + s16 sp1C6; + s16 currentHour; + u16 time; + s16 temp; + s16 colorStep; + s16 finalHoursClockSlots[8]; // sp1AC + s16 index; + + OPEN_DISPS(play->state.gfxCtx); + + if (R_TIME_SPEED != 0) { + if ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) || + (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) || + (gSaveContext.gameMode == 3)) { + if (!FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day < 4)) { + /** + * Changes Clock's transparancy depending if Player is moving or not and possibly other things + */ + if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) { + if (func_801234D4(play)) { + sThreeDayClockAlpha = 80; + D_801BFB30 = 5; + D_801BFB34 = 20; + } else if (D_801BFB34 != 0) { + D_801BFB34--; + } else if (D_801BFB30 != 0) { + colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / D_801BFB30; + sThreeDayClockAlpha += colorStep; + + if (sThreeDayClockAlpha >= 255) { + sThreeDayClockAlpha = 255; + D_801BFB30 = 0; + } + } else { + if (play->actorCtx.flags & ACTORCTX_FLAG_1) { + sThreeDayClockAlpha = 255; + } else { + sThreeDayClockAlpha = interfaceCtx->bAlpha; + } + D_801BFB34 = 0; + D_801BFB30 = 0; + } + } else { + if (play->actorCtx.flags & ACTORCTX_FLAG_1) { + sThreeDayClockAlpha = 255; + } else { + sThreeDayClockAlpha = interfaceCtx->bAlpha; + } + D_801BFB34 = 0; + D_801BFB30 = 0; + } + + if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) { + + func_8012C654(play->state.gfxCtx); + + /** + * Draw Clock's Hour Lines + */ + gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD); + gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha); + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, + TEXEL0, 0, PRIMITIVE, 0); + + OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128, + 35, 1, 6, 0, 1 << 10, 1 << 10); + + /** + * Draw Clock's Border + */ + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha); + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, + TEXEL0, 0, PRIMITIVE, 0); + + //! @bug A texture height of 50 is given below. The texture is only 48 units height + //! resulting in this reading into the next texture. This results in a white + //! dot in the bottom center of the clock. For the three-day clock, this is + //! covered by the diamond. However, it can be seen by the final-hours clock. + OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50, + 1, 6, 0, 1 << 10, 1 << 10); + + if (((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) && + (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) { + func_8012C8D4(play->state.gfxCtx); + gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + } else { + /** + * Draw Three-Day Clock's Diamond + */ + gDPPipeSync(OVERLAY_DISP++); + + // Time is slowed down to half speed with inverted song of time + if (gSaveContext.save.timeSpeedOffset == -2) { + // Clock diamond is blue and flashes white + colorStep = ABS_ALT(D_801BFBCC - D_801BFBEC[D_801BFBE8]) / D_801BFBE4; + if (D_801BFBCC >= D_801BFBEC[D_801BFBE8]) { + D_801BFBCC -= colorStep; + } else { + D_801BFBCC += colorStep; + } + + colorStep = ABS_ALT(D_801BFBD0 - D_801BFBF0[D_801BFBE8]) / D_801BFBE4; + if (D_801BFBD0 >= D_801BFBF0[D_801BFBE8]) { + D_801BFBD0 -= colorStep; + } else { + D_801BFBD0 += colorStep; + } + + colorStep = ABS_ALT(D_801BFBD4 - D_801BFBF4[D_801BFBE8]) / D_801BFBE4; + if (D_801BFBD4 >= D_801BFBF4[D_801BFBE8]) { + D_801BFBD4 -= colorStep; + } else { + D_801BFBD4 += colorStep; + } + + colorStep = ABS_ALT(D_801BFBD8 - D_801BFBF8[D_801BFBE8]) / D_801BFBE4; + if (D_801BFBD8 >= D_801BFBF8[D_801BFBE8]) { + D_801BFBD8 -= colorStep; + } else { + D_801BFBD8 += colorStep; + } + + colorStep = ABS_ALT(D_801BFBDC - D_801BFBFC[D_801BFBE8]) / D_801BFBE4; + if (D_801BFBDC >= D_801BFBFC[D_801BFBE8]) { + D_801BFBDC -= colorStep; + } else { + D_801BFBDC += colorStep; + } + + colorStep = ABS_ALT(D_801BFBE0 - D_801BFC00[D_801BFBE8]) / D_801BFBE4; + if (D_801BFBE0 >= D_801BFC00[D_801BFBE8]) { + D_801BFBE0 -= colorStep; + } else { + D_801BFBE0 += colorStep; + } + + D_801BFBE4--; + + if (D_801BFBE4 == 0) { + D_801BFBCC = D_801BFBEC[D_801BFBE8]; + D_801BFBD0 = D_801BFBF0[D_801BFBE8]; + D_801BFBD4 = D_801BFBF4[D_801BFBE8]; + D_801BFBD8 = D_801BFBF8[D_801BFBE8]; + D_801BFBDC = D_801BFBFC[D_801BFBE8]; + D_801BFBE0 = D_801BFC00[D_801BFBE8]; + D_801BFBE4 = 15; + D_801BFBE8 ^= 1; + } + + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, + PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, + PRIMITIVE, 0); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, D_801BFBCC, D_801BFBD0, 255, sThreeDayClockAlpha); + gDPSetEnvColor(OVERLAY_DISP++, D_801BFBD8, D_801BFBDC, D_801BFBE0, 0); + } else { + // Clock diamond is green for regular timeSpeedOffset + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha); + } + + OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40, + 32, 1 << 10, 1 << 10); + + /** + * Draw Three-Day Clock's Day-Number over Diamond + */ + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha); + + OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27, + 137, 192, 48, 27, 1 << 10, 1 << 10); + + /** + * Draw Three-Day Clock's Star (for the Minute Tracker) + */ + gDPPipeSync(OVERLAY_DISP++); + + if (D_801BF974 != 0) { + D_801BF980 += 0.02f; + D_801BF97C += 11; + } else { + D_801BF980 -= 0.02f; + D_801BF97C -= 11; + } + + D_801BF978--; + if (D_801BF978 == 0) { + D_801BF978 = 10; + D_801BF974 ^= 1; + } + + timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time); + timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f; + + func_8012C8D4(play->state.gfxCtx); + + gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (sThreeDayClockAlpha != 255) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha); + } else { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C); + } + + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD); + gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + + Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW); + Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY); + Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY); + + gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); + } + + /** + * Cuts off Three-Day Clock's Sun and Moon when they dip below the clock + */ + gDPPipeSync(OVERLAY_DISP++); + gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880, + R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f); + + // determines the current hour + for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) { + if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) { + break; + } + } + + /** + * Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker) + */ + time = gSaveContext.save.time; + sp1D8 = Math_SinS(time) * -40.0f; + temp_f14 = Math_CosS(time) * -34.0f; + + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha); + + Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + + gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0); + + OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0); + + /** + * Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker) + */ + sp1D8 = Math_SinS(time) * 40.0f; + temp_f14 = Math_CosS(time) * 34.0f; + + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha); + + Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0); + + OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0); + + /** + * Cuts off Three-Day Clock's Hour Digits when they dip below the clock + */ + gDPPipeSync(OVERLAY_DISP++); + gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880, + R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f); + + /** + * Draws Three-Day Clock's Hour Digit Above the Sun + */ + sp1CC = gSaveContext.save.time * 0.000096131f; + + // Rotates Three-Day Clock's Hour Digit To Above the Sun + Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY); + gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + // Draws Three-Day Clock's Hour Digit Above the Sun + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, + TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0); + + OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0); + + // Colours the Three-Day Clocks's Hour Digit Above the Sun + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha); + gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0); + + /** + * Draws Three-Day Clock's Hour Digit Above the Moon + */ + // Rotates Three-Day Clock's Hour Digit To Above the Moon + Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + Matrix_RotateZF(-sp1CC, MTXMODE_APPLY); + gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + // Draws Three-Day Clock's Hour Digit Above the Moon + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, + TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha); + gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0); + + OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0); + + // Colours the Three-Day Clocks's Hour Digit Above the Moon + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha); + gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0); + + gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor); + + // Final Hours + if ((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) && + (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) { + if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) { + // The Final Hours clock will flash red + + colorStep = + ABS_ALT(sFinalHoursClockDigitsRed - D_801BFC04[sFinalHoursClockColorTargetIndex]) / + sFinalHoursClockColorTimer; + if (sFinalHoursClockDigitsRed >= D_801BFC04[sFinalHoursClockColorTargetIndex]) { + sFinalHoursClockDigitsRed -= colorStep; + } else { + sFinalHoursClockDigitsRed += colorStep; + } + + colorStep = + ABS_ALT(sFinalHoursClockFrameEnvRed - D_801BFC08[sFinalHoursClockColorTargetIndex]) / + sFinalHoursClockColorTimer; + if (sFinalHoursClockFrameEnvRed >= D_801BFC08[sFinalHoursClockColorTargetIndex]) { + sFinalHoursClockFrameEnvRed -= colorStep; + } else { + sFinalHoursClockFrameEnvRed += colorStep; + } + + colorStep = + ABS_ALT(sFinalHoursClockFrameEnvGreen - D_801BFC0C[sFinalHoursClockColorTargetIndex]) / + sFinalHoursClockColorTimer; + if (sFinalHoursClockFrameEnvGreen >= D_801BFC0C[sFinalHoursClockColorTargetIndex]) { + sFinalHoursClockFrameEnvGreen -= colorStep; + } else { + sFinalHoursClockFrameEnvGreen += colorStep; + } + + colorStep = + ABS_ALT(sFinalHoursClockFrameEnvBlue - D_801BFC10[sFinalHoursClockColorTargetIndex]) / + sFinalHoursClockColorTimer; + if (sFinalHoursClockFrameEnvBlue >= D_801BFC10[sFinalHoursClockColorTargetIndex]) { + sFinalHoursClockFrameEnvBlue -= colorStep; + } else { + sFinalHoursClockFrameEnvBlue += colorStep; + } + + sFinalHoursClockColorTimer--; + + if (sFinalHoursClockColorTimer == 0) { + sFinalHoursClockDigitsRed = D_801BFC04[sFinalHoursClockColorTargetIndex]; + sFinalHoursClockFrameEnvRed = D_801BFC08[sFinalHoursClockColorTargetIndex]; + sFinalHoursClockFrameEnvGreen = D_801BFC0C[sFinalHoursClockColorTargetIndex]; + sFinalHoursClockFrameEnvBlue = D_801BFC10[sFinalHoursClockColorTargetIndex]; + sFinalHoursClockColorTimer = 6; + sFinalHoursClockColorTargetIndex ^= 1; + } + } + + sp1E6 = sThreeDayClockAlpha; + if (sp1E6 != 0) { + sp1E6 = 255; + } + + func_8012C654(play->state.gfxCtx); + + /** + * Draws Final-Hours Clock's Frame + */ + gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD); + gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, + PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, + PRIMITIVE, 0); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6); + gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen, + sFinalHoursClockFrameEnvBlue, 0); + + OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202, + 80, 13, 0, 0, 0, 1 << 10, 1 << 10); + + finalHoursClockSlots[0] = 0; + + timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH; + + timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash); + + // digits for hours + finalHoursClockSlots[1] = timeInMinutes / 60.0f; + finalHoursClockSlots[2] = timeInMinutes / 60.0f; + + temp = (s32)timeInMinutes % 60; + + while (finalHoursClockSlots[1] >= 10) { + finalHoursClockSlots[0]++; + finalHoursClockSlots[1] -= 10; + } + + // digits for minutes + finalHoursClockSlots[3] = 0; + finalHoursClockSlots[4] = temp; + + while (finalHoursClockSlots[4] >= 10) { + finalHoursClockSlots[3]++; + finalHoursClockSlots[4] -= 10; + } + + // digits for seconds + finalHoursClockSlots[6] = 0; + finalHoursClockSlots[7] = + timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) + + (((void)0, temp) * ((f32)0x10000 / (24 * 60)))); + + while (finalHoursClockSlots[7] >= 10) { + finalHoursClockSlots[6]++; + finalHoursClockSlots[7] -= 10; + } + + // Colon separating hours from minutes and minutes from seconds + finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10; + + /** + * Draws Final-Hours Clock's Digits + */ + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6); + gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0); + + for (sp1C6 = 0; sp1C6 < 8; sp1C6++) { + index = D_801BFC40[sp1C6]; + + OVERLAY_DISP = + Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]], + 8, 8, index, 205, 8, 8, 1 << 10, 1 << 10); + } + } + } + } + } + } + CLOSE_DISPS(play->state.gfxCtx); +} +#else +s16 sThreeDayClockAlpha = 255; s16 D_801BFB30 = 0; s16 D_801BFB34 = 0; -u16 D_801BFB38[] = { +u16 sThreeDayClockHours[] = { CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0), CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0), CLOCK_TIME(10, 0), CLOCK_TIME(11, 0), CLOCK_TIME(12, 0), CLOCK_TIME(13, 0), CLOCK_TIME(14, 0), CLOCK_TIME(15, 0), CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), CLOCK_TIME(20, 0), CLOCK_TIME(21, 0), CLOCK_TIME(22, 0), CLOCK_TIME(23, 0), CLOCK_TIME(24, 0) - 1, }; -TexturePtr D_801BFB6C[] = { +TexturePtr sThreeDayClockHourTextures[] = { gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex, gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex, gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex, @@ -3124,7 +3678,7 @@ s16 D_801BFC04[] = { 255, 0 }; s16 D_801BFC08[] = { 100, 0 }; s16 D_801BFC0C[] = { 30, 0 }; s16 D_801BFC10[] = { 100, 0 }; -TexturePtr D_801BFC14[] = { +TexturePtr sFinalHoursDigitTextures[] = { gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex, gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex, gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex, @@ -3132,8 +3686,9 @@ TexturePtr D_801BFC14[] = { s16 D_801BFC40[] = { 127, 136, 144, 151, 160, 168, 175, 184, }; - -#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80119610.s") +void Interface_DrawClock(PlayState* play); +#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_DrawClock.s") +#endif void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType) { InterfaceContext* interfaceCtx = &play->interfaceCtx; diff --git a/src/code/z_scene.c b/src/code/z_scene.c index 1a08cad0ef..b70dfb1f55 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -378,30 +378,31 @@ void Scene_HeaderCmdSkyboxDisables(PlayState* play, SceneCmd* cmd) { // SceneTableEntry Header Command 0x10: Time Settings void Scene_HeaderCmdTimeSettings(PlayState* play, SceneCmd* cmd) { - if (cmd->timeSettings.hour != 0xFF && cmd->timeSettings.min != 0xFF) { + if ((cmd->timeSettings.hour != 0xFF) && (cmd->timeSettings.min != 0xFF)) { gSaveContext.skyboxTime = gSaveContext.save.time = - (u16)(((cmd->timeSettings.hour + (cmd->timeSettings.min / 60.0f)) * 60.0f) / 0.021972656f); + CLOCK_TIME_ALT2_F(cmd->timeSettings.hour, cmd->timeSettings.min); } - if (cmd->timeSettings.unk6 != 0xFF) { - play->envCtx.timeIncrement = cmd->timeSettings.unk6; + if (cmd->timeSettings.timeSpeed != 0xFF) { + play->envCtx.sceneTimeSpeed = cmd->timeSettings.timeSpeed; } else { - play->envCtx.timeIncrement = 0; + play->envCtx.sceneTimeSpeed = 0; } - if ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) && (play->envCtx.timeIncrement != 0)) { - play->envCtx.timeIncrement = 5; + // Increase time speed during first cycle + if ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) && (play->envCtx.sceneTimeSpeed != 0)) { + play->envCtx.sceneTimeSpeed = 5; } if (gSaveContext.sunsSongState == SUNSSONG_INACTIVE) { - REG(15) = play->envCtx.timeIncrement; + R_TIME_SPEED = play->envCtx.sceneTimeSpeed; } - play->envCtx.unk_4 = -(Math_SinS(((void)0, gSaveContext.save.time) - 0x8000) * 120.0f) * 25.0f; - play->envCtx.unk_8 = (Math_CosS(((void)0, gSaveContext.save.time) - 0x8000) * 120.0f) * 25.0f; - play->envCtx.unk_C = (Math_CosS(((void)0, gSaveContext.save.time) - 0x8000) * 20.0f) * 25.0f; + play->envCtx.sunPos.x = -(Math_SinS(((void)0, gSaveContext.save.time) - CLOCK_TIME(12, 0)) * 120.0f) * 25.0f; + play->envCtx.sunPos.y = (Math_CosS(((void)0, gSaveContext.save.time) - CLOCK_TIME(12, 0)) * 120.0f) * 25.0f; + play->envCtx.sunPos.z = (Math_CosS(((void)0, gSaveContext.save.time) - CLOCK_TIME(12, 0)) * 20.0f) * 25.0f; - if ((play->envCtx.timeIncrement == 0) && (gSaveContext.save.cutscene < 0xFFF0)) { + if ((play->envCtx.sceneTimeSpeed == 0) && (gSaveContext.save.cutscene < 0xFFF0)) { gSaveContext.skyboxTime = gSaveContext.save.time; if ((gSaveContext.skyboxTime >= CLOCK_TIME(4, 0)) && (gSaveContext.skyboxTime < CLOCK_TIME(6, 30))) { diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index b3d335afb3..6a4210df76 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -342,7 +342,7 @@ void Sram_SaveEndOfCycle(PlayState* play) { u8 slot; u8 item; - gSaveContext.save.daySpeed = 0; + gSaveContext.save.timeSpeedOffset = 0; gSaveContext.save.daysElapsed = 0; gSaveContext.save.day = 0; gSaveContext.save.time = CLOCK_TIME(6, 0) - 1; @@ -593,7 +593,7 @@ void Sram_ResetSave(void) { gSaveContext.save.unk_06 = 0; gSaveContext.save.linkAge = 0; gSaveContext.save.isNight = false; - gSaveContext.save.daySpeed = 0; + gSaveContext.save.timeSpeedOffset = 0; gSaveContext.save.snowheadCleared = 0; gSaveContext.save.hasTatl = false; gSaveContext.save.isOwlSave = false; diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c index 2ef547b485..2a96a0c8a0 100644 --- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c +++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c @@ -255,7 +255,7 @@ void func_809542A0(BgIngate* this, PlayState* play) { gSaveContext.nextTransitionType = TRANS_TYPE_03; this->actionFunc = func_80953F8C; CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40); - func_800FE498(); + Environment_StartTime(); } void func_80954340(BgIngate* this, PlayState* play) { @@ -264,7 +264,7 @@ void func_80954340(BgIngate* this, PlayState* play) { func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6); this->timePath = &play->setupPathList[this->timePath->unk1]; func_80953F14(this, play); - func_800FE484(); + Environment_StopTime(); } } } @@ -283,7 +283,7 @@ void func_809543D4(BgIngate* this, PlayState* play) { func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6); this->unk160 &= ~0x4; this->actionFunc = func_809541B8; - func_800FE498(); + Environment_StartTime(); func_8019F208(); } else { if (this->timePath != NULL) { @@ -304,7 +304,7 @@ void func_809543D4(BgIngate* this, PlayState* play) { func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6); this->unk160 &= ~0x4; this->actionFunc = func_809541B8; - func_800FE498(); + Environment_StartTime(); func_8019F230(); } func_801477B4(play); diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c index f82279c09b..4f9d7d702b 100644 --- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c +++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c @@ -1154,7 +1154,7 @@ void DmStk_WaitForTelescope(DmStk* this, PlayState* play) { if (play->view.fovy < 25.0f) { if ((screenPos.x >= 70.0f) && (screenPos.x < (SCREEN_WIDTH - 70.0f)) && (screenPos.y >= 30.0f) && (screenPos.y < (SCREEN_HEIGHT - 30.0f))) { - func_800FE484(); + Environment_StopTime(); this->actionFunc = DmStk_StartTelescopeCutscene; } } @@ -1181,7 +1181,7 @@ void DmStk_StartTelescopeCutscene(DmStk* this, PlayState* play) { if (ActorCutscene_GetCanPlayNext(cutscene)) { ActorCutscene_Start(cutscene, &this->actor); - func_800FE498(); + Environment_StartTime(); this->actionFunc = DmStk_DoNothing; } else { ActorCutscene_SetIntentToPlay(cutscene); @@ -1816,9 +1816,10 @@ void DmStk_Update(Actor* thisx, PlayState* play) { (play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (ActorCutscene_GetCurrentIndex() == -1) && (play->csCtx.state == 0)) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15); - if (REG(15) != 0) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed); + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED; + if (R_TIME_SPEED != 0) { + gSaveContext.save.time = + ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset); } } } diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index bf31f039cb..3487d95c6a 100644 --- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -163,7 +163,7 @@ void DoorWarp1_Init(Actor* thisx, PlayState* play) { if ((play->sceneId == SCENE_MITURIN_BS) || (play->sceneId == SCENE_HAKUGIN_BS) || (play->sceneId == SCENE_INISIE_BS) || (play->sceneId == SCENE_SEA_BS)) { - func_800FE484(); + Environment_StopTime(); play->interfaceCtx.restrictions.unk_312 = 1; play->interfaceCtx.restrictions.songOfSoaring = 1; } diff --git a/src/overlays/actors/ovl_En_Al/z_en_al.c b/src/overlays/actors/ovl_En_Al/z_en_al.c index b5ea2f64f7..da1cc7d7e1 100644 --- a/src/overlays/actors/ovl_En_Al/z_en_al.c +++ b/src/overlays/actors/ovl_En_Al/z_en_al.c @@ -748,7 +748,7 @@ void func_80BDF578(EnAl* this, PlayState* play) { void func_80BDF5E8(EnAl* this, PlayState* play) { ScheduleOutput sp20; - this->unk_4E0 = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->unk_4E0 = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BDFC70, &sp20) || ((this->unk_35C != sp20.result) && !func_80BDF390(this, play, &sp20))) { this->actor.shape.shadowDraw = NULL; diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c index 8f1915ae5e..a6624dc387 100644 --- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c +++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c @@ -102,8 +102,8 @@ void func_809C10B0(EnAob01* this, s32 arg1) { } void func_809C1124(void) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15); - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed); + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED; + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset); } void func_809C1158(EnAob01* this, PlayState* play) { diff --git a/src/overlays/actors/ovl_En_Baba/z_en_baba.c b/src/overlays/actors/ovl_En_Baba/z_en_baba.c index 0c5d7b799b..6040076f4d 100644 --- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c +++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c @@ -654,7 +654,7 @@ void EnBaba_GaveBlastMask(EnBaba* this, PlayState* play) { void EnBaba_FollowSchedule(EnBaba* this, PlayState* play) { ScheduleOutput scheduleOutput; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, sSchedule, &scheduleOutput) || ((this->scheduleResult != scheduleOutput.result) && diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c index 25b59b59be..ed7b8c194e 100644 --- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c +++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c @@ -114,7 +114,7 @@ void func_809CCEE8(EnBji01* this, PlayState* play) { } void func_809CD028(EnBji01* this, PlayState* play) { - f32 timeBeforeMoonCrash; + f32 timeUntilMoonCrash; switch (this->actor.params) { case SHIKASHI_TYPE_DEFAULT: @@ -177,11 +177,8 @@ void func_809CD028(EnBji01* this, PlayState* play) { this->textId = 0x5EA; break; case 3: - // Calculates the time left before the moon crashes. - // The day begins at CLOCK_TIME(6, 0) so it must be offset. - timeBeforeMoonCrash = (4 - CURRENT_DAY) * DAY_LENGTH - - (u16)(((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0)); - if (timeBeforeMoonCrash < CLOCK_TIME_F(1, 0)) { + timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH; + if (timeUntilMoonCrash < CLOCK_TIME_F(1, 0)) { this->textId = 0x5E8; } else { this->textId = 0x5EB; diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c index ac7fc1debf..325e4b0dd9 100644 --- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c +++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c @@ -846,7 +846,7 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) { D_8090CD04 = 20; play->specialEffects = sFishingEffects; - REG(15) = 1; // gTimeIncrement in OoT + R_TIME_SPEED = 1; D_809171FC = 0; D_809171F6 = 10; diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c index 632b29a235..d6643dbeb3 100644 --- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c +++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c @@ -488,7 +488,7 @@ void func_80B10344(EnGb2* this, PlayState* play) { if (this->unk_280 == 3) { this->unk_26C &= ~0x200; gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP; - func_800FE498(); + Environment_StartTime(); SET_EVENTINF(EVENTINF_46); func_80B0FE7C(play); } else if (this->unk_280 == 2) { @@ -892,7 +892,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) { } if (gSaveContext.save.entrance == ENTRANCE(GHOST_HUT, 1)) { - func_800FE484(); + Environment_StopTime(); this->actionFunc = func_80B10240; break; } diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c index aaaf0ef3dc..01146c0cf1 100644 --- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c +++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c @@ -1582,7 +1582,7 @@ void func_80950C24(EnGm* this, PlayState* play) { void func_80950CDC(EnGm* this, PlayState* play) { ScheduleOutput sp20; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80951820, &sp20) || ((this->unk_258 != sp20.result) && !func_80950280(this, play, &sp20))) { diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c index 5299dbaa1a..e97deee04d 100644 --- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c +++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c @@ -140,7 +140,7 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) { Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_FREE0); Play_SetCameraAtEye(play, CAM_ID_MAIN, &mainCamAt, &mainCamEye); Play_SetCameraFov(play, CAM_ID_MAIN, 45.0f); - func_800FE484(); + Environment_StopTime(); return false; } diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.c b/src/overlays/actors/ovl_En_Ig/z_en_ig.c index 8f0ae949d9..2468e5961f 100644 --- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c +++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c @@ -876,7 +876,7 @@ void func_80BF2A50(EnIg* this, PlayState* play) { void func_80BF2AF8(EnIg* this, PlayState* play) { ScheduleOutput sp20; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BF3260, &sp20) || ((this->scheduleResult != sp20.result) && !func_80BF2368(this, play, &sp20))) { diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c index bf2b37bca3..2c6a157372 100644 --- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c +++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c @@ -3016,7 +3016,7 @@ void func_80B49C38(EnInvadepoh* this, PlayState* play) { if (this->unk378 == 0) { temp_v0_2 = func_800FE620(play); if (temp_v0_2 > 0) { - temp_v0_2 = (REG(15) * -16.0f / temp_v0_2) - 0.5f; + temp_v0_2 = (R_TIME_SPEED * -16.0f / temp_v0_2) - 0.5f; this->unk378 = func_80B45550(this, play, SQ(80.0f), temp_v0_2); } } @@ -3968,7 +3968,7 @@ void func_80B4C730(EnInvadepoh* this, PlayState* play) { if (this->unk378 == 0) { temp_v0_2 = func_800FE620(play); if (temp_v0_2 > 0) { - temp_v0_2 = (REG(15) * -23.0f / temp_v0_2) - 0.5f; + temp_v0_2 = (R_TIME_SPEED * -23.0f / temp_v0_2) - 0.5f; this->unk378 = func_80B45550(this, play, SQ(80.0f), temp_v0_2); } } diff --git a/src/overlays/actors/ovl_En_Ja/z_en_ja.c b/src/overlays/actors/ovl_En_Ja/z_en_ja.c index 9a82f24adf..39a28c4bd7 100644 --- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c +++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c @@ -301,7 +301,7 @@ void func_80BC2150(EnJa* this, PlayState* play) { void func_80BC21A8(EnJa* this, PlayState* play) { ScheduleOutput sp18; - this->unk_35C = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->unk_35C = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BC35F0, &sp18) || ((this->unk_1D8.unk_00 != sp18.result) && !func_80BC20D0(this, play, &sp18))) { this->actor.shape.shadowDraw = NULL; diff --git a/src/overlays/actors/ovl_En_Nb/z_en_nb.c b/src/overlays/actors/ovl_En_Nb/z_en_nb.c index 572364bbdf..385325080f 100644 --- a/src/overlays/actors/ovl_En_Nb/z_en_nb.c +++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.c @@ -638,7 +638,7 @@ void EnNb_HandleSchedule(EnNb* this, PlayState* play) { void EnNb_FollowSchedule(EnNb* this, PlayState* play) { ScheduleOutput scheduleOutput; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (gSaveContext.eventInf[4] & 8) { scheduleOutput.result = EN_NB_SCH_1; diff --git a/src/overlays/actors/ovl_En_Pm/z_en_pm.c b/src/overlays/actors/ovl_En_Pm/z_en_pm.c index 24fcc34f9f..c2846a26b8 100644 --- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c +++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c @@ -1987,7 +1987,7 @@ void func_80AFA4D0(EnPm* this, PlayState* play) { u16 sp3C = 0; ScheduleOutput sp2C; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (this->unk_38C != 0) { time = gSaveContext.save.time - D_801F4E78; sp3C = gSaveContext.save.time; diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c index 2f33a9aac7..93c93eef92 100644 --- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c +++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c @@ -231,8 +231,8 @@ void EnSuttari_TriggerTransition(PlayState* play, u16 entrance) { } void EnSuttari_UpdateTime(void) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15); - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed); + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED; + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset); } s32 func_80BAA904(EnSuttari* this, PlayState* play) { @@ -1104,7 +1104,7 @@ void func_80BACE4C(EnSuttari* this, PlayState* play) { void func_80BACEE0(EnSuttari* this, PlayState* play) { ScheduleOutput scheduleOutput; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) || ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) { this->actor.flags &= ~ACTOR_FLAG_1; @@ -1128,7 +1128,7 @@ void func_80BACEE0(EnSuttari* this, PlayState* play) { void func_80BAD004(EnSuttari* this, PlayState* play) { ScheduleOutput scheduleOutput; - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) || ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) { this->actor.flags &= ~ACTOR_FLAG_1; @@ -1255,7 +1255,7 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) { this->animIndex = 2; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); } - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) || ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) { this->actor.flags &= ~ACTOR_FLAG_1; @@ -1293,7 +1293,7 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) { this->animIndex = 2; Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex); } - this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) || ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) { this->actor.flags &= ~ACTOR_FLAG_1; diff --git a/src/overlays/actors/ovl_En_Tab/z_en_tab.c b/src/overlays/actors/ovl_En_Tab/z_en_tab.c index 86de69140a..abd7c100c6 100644 --- a/src/overlays/actors/ovl_En_Tab/z_en_tab.c +++ b/src/overlays/actors/ovl_En_Tab/z_en_tab.c @@ -473,7 +473,7 @@ void func_80BE1224(EnTab* this, PlayState* play) { void func_80BE127C(EnTab* this, PlayState* play) { ScheduleOutput sp18; - this->unk_31A = REG(15) + ((void)0, gSaveContext.save.daySpeed); + this->unk_31A = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (!Schedule_RunScript(play, D_80BE18D0, &sp18) || ((this->unk_1D8 != sp18.result) && !func_80BE1060(this, play, &sp18))) { diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c index 26cc07dc25..689af15ee8 100644 --- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c +++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c @@ -507,7 +507,7 @@ void EnTest3_Destroy(Actor* thisx, PlayState* play2) { Collider_DestroyQuad(play, &this->player.meleeWeaponQuads[1]); Collider_DestroyQuad(play, &this->player.shieldQuad); ZeldaArena_Free(this->player.maskObjectSegment); - func_800FE498(); + Environment_StartTime(); } s32 func_80A3F080(EnTest3* this, PlayState* play, struct_80A41828* arg2, ScheduleOutput* scheduleOutput) { @@ -764,7 +764,7 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) { if (this->unk_D8D >= 0) { if (func_80A3E9DC(this, play)) { this->unk_D8D = -1; - func_800FE484(); + Environment_StopTime(); } } else if ((play->actorCtx.flags & ACTORCTX_FLAG_6) || (play->actorCtx.flags & ACTORCTX_FLAG_5)) { this->unk_D8D = ActorCutscene_GetAdditionalCutscene(this->player.actor.cutscene); @@ -779,9 +779,9 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) { } } else if ((D_80A41D20 == 2) && func_80A3E9DC(this, play)) { ActorCutscene_SetReturnCamera(CAM_ID_MAIN); - func_800FE498(); - if (gSaveContext.save.time > CLOCK_TIME(6, 0)) { - func_800FE658(TIME_TO_MINUTES_ALT_F(fabsf((s16)-gSaveContext.save.time))); + Environment_StartTime(); + if (((void)0, gSaveContext.save.time) > CLOCK_TIME(6, 0)) { + func_800FE658(TIME_TO_MINUTES_ALT_F(fabsf((s16) - ((void)0, gSaveContext.save.time)))); } if (play->actorCtx.flags & ACTORCTX_FLAG_6) { SET_WEEKEVENTREG(WEEKEVENTREG_51_20); @@ -967,7 +967,7 @@ void func_80A40678(EnTest3* this, PlayState* play) { this->unk_D80 = ((this->unk_D88 == 20) || (this->unk_D88 == 10) || (this->unk_D88 == 9)) ? 3 : Play_InCsMode(play) ? 0 - : REG(15) + ((void)0, gSaveContext.save.daySpeed); + : R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); if (Schedule_RunScript(play, sScheduleScript, &scheduleOutput)) { if (this->unk_D88 != scheduleOutput.result) { diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/src/overlays/actors/ovl_En_Test4/z_en_test4.c index b7994cf046..9fbce37c7f 100644 --- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c +++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c @@ -1,7 +1,7 @@ /* * File: z_en_test4.c * Overlay: ovl_En_Test4 - * Description: Three-Day Timer + * Description: Three-Day Events */ #include "prevent_bss_reordering.h" @@ -59,7 +59,7 @@ void func_80A41D70(EnTest4* this, PlayState* play) { this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE; } - func_8010EE74(play, CURRENT_DAY); + Interface_NewDay(play, CURRENT_DAY); D_801BDBC8 = 0xFE; func_800FB758(play); func_800FEAF4(&play->envCtx); @@ -95,7 +95,7 @@ void func_80A41FA4(EnTest4* this, PlayState* play) { } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) { Sram_IncrementDay(); gSaveContext.save.time = CLOCK_TIME(6, 0); - func_8010EE74(play, CURRENT_DAY); + Interface_NewDay(play, CURRENT_DAY); func_80151A68(play, sDayMessages2[CURRENT_DAY - 1]); D_801BDBC8 = 0xFE; func_800FB758(play); diff --git a/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/src/overlays/actors/ovl_En_Tk/z_en_tk.c index a0b59be8a7..1bdc92b4a0 100644 --- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -323,8 +323,8 @@ void func_80AECB6C(EnTk* this, PlayState* play) { return; } - if (REG(15) != 0.0f) { - this->skelAnime.playSpeed = (f32)func_800FE620(play) / REG(15); + if (R_TIME_SPEED != 0.0f) { + this->skelAnime.playSpeed = (f32)func_800FE620(play) / R_TIME_SPEED; } else { this->skelAnime.playSpeed = 0.0f; } @@ -337,14 +337,14 @@ void func_80AECB6C(EnTk* this, PlayState* play) { func_80AEC658(&this->skelAnime, this->unk_320, 1.0f, &sp48, &sp44); } - temp2 = REG(15) * sp44; + temp2 = R_TIME_SPEED * sp44; temp_f0 = temp2; - this->unk_2DC += (REG(15) * sp44) - temp2; + this->unk_2DC += (R_TIME_SPEED * sp44) - temp2; temp3 = this->unk_2DC; this->timePathTimeSpeed = temp2 + temp3; this->unk_2DC -= temp3; - this->unk_2E0 += REG(15); + this->unk_2E0 += R_TIME_SPEED; if (Schedule_RunScript(play, D_80AEF800, &sp34)) { if ((this->unk_3CC != sp34.result) && !func_80AED354(this, play, &sp34)) { diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c index ea95cc6d02..7ddd539e79 100644 --- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c +++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c @@ -486,9 +486,10 @@ void EnWeatherTag_Update(Actor* thisx, PlayState* play) { (play->transitionTrigger == TRANS_TRIGGER_OFF) && (ActorCutscene_GetCurrentIndex() == -1) && (play->csCtx.state == 0)) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)REG(15); - if (REG(15) != 0) { - gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.daySpeed); + gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED; + if (R_TIME_SPEED != 0) { + gSaveContext.save.time = + ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset); } } } diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c index 93a110a081..2a819b7911 100644 --- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c +++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c @@ -698,7 +698,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) { sp54 = false; this->flags |= OBJ_UM_FLAG_0100; ObjUm_SetupAction(this, func_80B7A144); - func_800FE484(); + Environment_StopTime(); } else { // Waiting for player @@ -722,7 +722,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) { if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) { this->pathIndex = this->initialPathIndex; sp54 = false; - func_800FE484(); + Environment_StopTime(); ObjUm_SetupAction(this, ObjUm_PreMilkRunStartCs); this->unk_354 = 0; ObjUm_RotatePlayer(this, play, 0); @@ -735,7 +735,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) { this->pathIndex = this->initialPathIndex; sp54 = false; - func_800FE484(); + Environment_StopTime(); ObjUm_SetupAction(this, ObjUm_StartCs); this->unk_354 = 0; ObjUm_RotatePlayer(this, play, 0); @@ -747,7 +747,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) { this->pathIndex = this->initialPathIndex; sp54 = false; - func_800FE484(); + Environment_StopTime(); ObjUm_SetupAction(this, ObjUm_PostMilkRunStartCs); this->unk_354 = 0; ObjUm_RotatePlayer(this, play, 0); diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c index a19cb276aa..731fe6b775 100644 --- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c +++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c @@ -80,7 +80,7 @@ void OceffSpot_End(OceffSpot* this, PlayState* play) { this->unk16C -= 0.05f; } else { Actor_Kill(&this->actor); - if ((REG(15) != 0x190) && (play->msgCtx.unk12046 == 0)) { + if ((R_TIME_SPEED != 400) && (play->msgCtx.unk12046 == 0)) { if ((play->msgCtx.ocarinaAction != 0x39) || (play->msgCtx.ocarinaMode != 0xA)) { gSaveContext.sunsSongState = SUNSSONG_START; } diff --git a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c index dea819c7dd..74e711cfa5 100644 --- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c +++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c @@ -170,10 +170,10 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) { if (!(this->actor.xzDistToPlayer > 120.0f)) { if ((gSaveContext.save.time >= CLOCK_TIME(6, 30)) && (gSaveContext.save.time < CLOCK_TIME(7, 30))) { - cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.unk_4 * (1.0f / 6.0f)); + cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f)); cylinderPos.y = - (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.unk_8 * (1.0f / 6.0f)); - cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.unk_C * (1.0f / 6.0f)); + (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f)); + cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f)); this->hitboxPos = cylinderPos; diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index ddc6a12958..46be74fb0e 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -1768,9 +1768,9 @@ 0x800FDC94:("func_800FDC94",), 0x800FE390:("func_800FE390",), 0x800FE3E0:("func_800FE3E0",), - 0x800FE484:("func_800FE484",), - 0x800FE498:("func_800FE498",), - 0x800FE4A8:("func_800FE4A8",), + 0x800FE484:("Environment_StopTime",), + 0x800FE498:("Environment_StartTime",), + 0x800FE4A8:("Environment_IsTimeStopped",), 0x800FE4B8:("func_800FE4B8",), 0x800FE590:("func_800FE590",), 0x800FE5D0:("func_800FE5D0",), @@ -2099,7 +2099,7 @@ 0x8010EB50:("Interface_StartGoronRaceTimer",), 0x8010EBA0:("Interface_StartBottleTimer",), 0x8010EC54:("Interface_GetCompressedTimerDigits",), - 0x8010EE74:("func_8010EE74",), + 0x8010EE74:("Interface_NewDay",), 0x8010EF68:("Interface_SetHudVisibility",), 0x8010EF9C:("Interface_UpdateButtonAlphasByStatus",), 0x8010F0D4:("Interface_UpdateButtonAlphas",), @@ -2150,7 +2150,7 @@ 0x80118890:("func_80118890",), 0x80118BA4:("func_80118BA4",), 0x80119030:("func_80119030",), - 0x80119610:("func_80119610",), + 0x80119610:("Interface_DrawClock",), 0x8011B4E0:("Interface_SetPerfectLetters",), 0x8011B5C0:("Interface_UpdatePerfectLettersType1",), 0x8011B9E0:("Interface_UpdatePerfectLettersType2",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 14d2a9ffa7..bd716f8ef2 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -1139,11 +1139,11 @@ 0x801BFB14:("D_801BFB14","UNK_TYPE1","",0x1), 0x801BFB1C:("D_801BFB1C","UNK_TYPE1","",0x1), 0x801BFB24:("D_801BFB24","UNK_TYPE1","",0x1), - 0x801BFB2C:("D_801BFB2C","UNK_TYPE2","",0x2), + 0x801BFB2C:("sThreeDayClockAlpha","UNK_TYPE2","",0x2), 0x801BFB30:("D_801BFB30","UNK_TYPE2","",0x2), 0x801BFB34:("D_801BFB34","UNK_TYPE2","",0x2), - 0x801BFB38:("D_801BFB38","UNK_TYPE1","",0x1), - 0x801BFB6C:("D_801BFB6C","UNK_TYPE1","",0x1), + 0x801BFB38:("sThreeDayClockHours","UNK_TYPE1","",0x1), + 0x801BFB6C:("sThreeDayClockHourTextures","UNK_TYPE1","",0x1), 0x801BFBCC:("D_801BFBCC","UNK_TYPE2","",0x2), 0x801BFBD0:("D_801BFBD0","UNK_TYPE2","",0x2), 0x801BFBD4:("D_801BFBD4","UNK_TYPE2","",0x2), @@ -1162,7 +1162,7 @@ 0x801BFC08:("D_801BFC08","UNK_TYPE1","",0x1), 0x801BFC0C:("D_801BFC0C","UNK_TYPE1","",0x1), 0x801BFC10:("D_801BFC10","UNK_TYPE1","",0x1), - 0x801BFC14:("D_801BFC14","UNK_TYPE1","",0x1), + 0x801BFC14:("sFinalHoursDigitTextures","UNK_TYPE1","",0x1), 0x801BFC40:("D_801BFC40","UNK_TYPE1","",0x1), 0x801BFC50:("sPerfectLettersType1OffScreenAngles","UNK_TYPE2","",0x2), 0x801BFC60:("sPerfectLettersType1PrimColorTargets","s16","[6]",0xC), diff --git a/tools/namefixer.py b/tools/namefixer.py index 33f6b62e21..9feaa0ef79 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -530,6 +530,9 @@ wordReplace = { "func_800A81F0": "EffectBlure_AddVertex", "func_800A8514": "EffectBlure_AddSpace", "Effect_GetParams": "Effect_GetByIndex", + "func_800FE484": "Environment_StopTime", + "func_800FE498": "Environment_StartTime", + "func_800FE4A8": "Environment_IsTimeStopped", "func_800F5A8C": "Environment_LerpWeight", "func_801A3F54": "Audio_SetCutsceneFlag", "func_800EA0D4": "Cutscene_Start", @@ -691,7 +694,8 @@ wordReplace = { "gSaveContext.equippedMask": "gSaveContext.save.equippedMask", "gSaveContext.entranceIndex": "gSaveContext.save.entrance", "gSaveContext.time": "gSaveContext.save.time", - "gSaveContext.unk_14": "gSaveContext.save.daySpeed", + "gSaveContext.save.daySpeed": "gSaveContext.save.timeSpeedOffset", + "gSaveContext.unk_14": "gSaveContext.save.timeSpeedOffset", "gSaveContext.unk_FE6": "gSaveContext.save.bombersCaughtNum", "gSaveContext.unk_FE7": "gSaveContext.save.bombersCaughtOrder", "gSaveContext.linkAge": "gSaveContext.save.linkAge", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index a27d1651d2..64ba2a468c 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -1282,9 +1282,9 @@ asm/non_matchings/code/z_kankyo/func_800FDAF8.s,func_800FDAF8,0x800FDAF8,0x67 asm/non_matchings/code/z_kankyo/func_800FDC94.s,func_800FDC94,0x800FDC94,0x1BF asm/non_matchings/code/z_kankyo/func_800FE390.s,func_800FE390,0x800FE390,0x14 asm/non_matchings/code/z_kankyo/func_800FE3E0.s,func_800FE3E0,0x800FE3E0,0x29 -asm/non_matchings/code/z_kankyo/func_800FE484.s,func_800FE484,0x800FE484,0x5 -asm/non_matchings/code/z_kankyo/func_800FE498.s,func_800FE498,0x800FE498,0x4 -asm/non_matchings/code/z_kankyo/func_800FE4A8.s,func_800FE4A8,0x800FE4A8,0x4 +asm/non_matchings/code/z_kankyo/Environment_StopTime.s,Environment_StopTime,0x800FE484,0x5 +asm/non_matchings/code/z_kankyo/Environment_StartTime.s,Environment_StartTime,0x800FE498,0x4 +asm/non_matchings/code/z_kankyo/Environment_IsTimeStopped.s,Environment_IsTimeStopped,0x800FE4A8,0x4 asm/non_matchings/code/z_kankyo/func_800FE4B8.s,func_800FE4B8,0x800FE4B8,0x36 asm/non_matchings/code/z_kankyo/func_800FE590.s,func_800FE590,0x800FE590,0x10 asm/non_matchings/code/z_kankyo/func_800FE5D0.s,func_800FE5D0,0x800FE5D0,0x10 @@ -1613,7 +1613,7 @@ asm/non_matchings/code/z_parameter/Interface_StartPostmanTimer.s,Interface_Start asm/non_matchings/code/z_parameter/Interface_StartGoronRaceTimer.s,Interface_StartGoronRaceTimer,0x8010EB50,0x14 asm/non_matchings/code/z_parameter/Interface_StartBottleTimer.s,Interface_StartBottleTimer,0x8010EBA0,0x2D asm/non_matchings/code/z_parameter/Interface_GetCompressedTimerDigits.s,Interface_GetCompressedTimerDigits,0x8010EC54,0x88 -asm/non_matchings/code/z_parameter/func_8010EE74.s,func_8010EE74,0x8010EE74,0x3D +asm/non_matchings/code/z_parameter/Interface_NewDay.s,Interface_NewDay,0x8010EE74,0x3D asm/non_matchings/code/z_parameter/Interface_SetHudVisibility.s,Interface_SetHudVisibility,0x8010EF68,0xD asm/non_matchings/code/z_parameter/Interface_UpdateButtonAlphasByStatus.s,Interface_UpdateButtonAlphasByStatus,0x8010EF9C,0x4E asm/non_matchings/code/z_parameter/Interface_UpdateButtonAlphas.s,Interface_UpdateButtonAlphas,0x8010F0D4,0x35 @@ -1664,7 +1664,7 @@ asm/non_matchings/code/z_parameter/func_80118084.s,func_80118084,0x80118084,0x20 asm/non_matchings/code/z_parameter/func_80118890.s,func_80118890,0x80118890,0xC5 asm/non_matchings/code/z_parameter/func_80118BA4.s,func_80118BA4,0x80118BA4,0x123 asm/non_matchings/code/z_parameter/func_80119030.s,func_80119030,0x80119030,0x178 -asm/non_matchings/code/z_parameter/func_80119610.s,func_80119610,0x80119610,0x7B4 +asm/non_matchings/code/z_parameter/Interface_DrawClock.s,Interface_DrawClock,0x80119610,0x7B4 asm/non_matchings/code/z_parameter/Interface_SetPerfectLetters.s,Interface_SetPerfectLetters,0x8011B4E0,0x38 asm/non_matchings/code/z_parameter/Interface_UpdatePerfectLettersType1.s,Interface_UpdatePerfectLettersType1,0x8011B5C0,0x108 asm/non_matchings/code/z_parameter/Interface_UpdatePerfectLettersType2.s,Interface_UpdatePerfectLettersType2,0x8011B9E0,0x164