From f15a4f07e54da4a19737f53778544e386545cfa4 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Mon, 13 Apr 2026 13:03:28 -0400 Subject: [PATCH] Time Stones now with Song of Time --- include/Z2AudioLib/Z2WolfHowlMgr.h | 4 ++++ src/Z2AudioLib/Z2WolfHowlMgr.cpp | 32 +++++++++++++++++++++++++---- src/d/actor/d_a_alink_wolf.inc | 33 +++++++++++++++--------------- src/d/d_kankyo.cpp | 13 ++++++++++++ 4 files changed, 61 insertions(+), 21 deletions(-) diff --git a/include/Z2AudioLib/Z2WolfHowlMgr.h b/include/Z2AudioLib/Z2WolfHowlMgr.h index 2b2595d1ea..10b746a4c1 100644 --- a/include/Z2AudioLib/Z2WolfHowlMgr.h +++ b/include/Z2AudioLib/Z2WolfHowlMgr.h @@ -39,6 +39,10 @@ enum Z2WolfHowlCurveID { Z2WOLFHOWL_NEWSONG2, Z2WOLFHOWL_NEWSONG3, + #if TARGET_PC + Z2WOLFHOWL_TIMESONG, + #endif + Z2WOLFHOWL_MAX }; diff --git a/src/Z2AudioLib/Z2WolfHowlMgr.cpp b/src/Z2AudioLib/Z2WolfHowlMgr.cpp index 4b546fc54a..5f86b237b6 100644 --- a/src/Z2AudioLib/Z2WolfHowlMgr.cpp +++ b/src/Z2AudioLib/Z2WolfHowlMgr.cpp @@ -115,7 +115,14 @@ static Z2WolfHowlLine sNewSong3[9] = { {HOWL_LINE_MID, 45}, }; -static Z2WolfHowlData sGuideData[9] = { +#if TARGET_PC +static Z2WolfHowlLine sHowlTimeSong[6] = { + {HOWL_LINE_HIGH, 30}, {HOWL_LINE_LOW, 40}, {HOWL_LINE_MID, 30}, + {HOWL_LINE_HIGH, 30}, {HOWL_LINE_LOW, 40}, {HOWL_LINE_MID, 30}, +}; +#endif + +static Z2WolfHowlData sGuideData[9 IF_DUSK(+1)] = { {ARRAY_SIZE(sHowlTobikusa), sHowlTobikusa}, {ARRAY_SIZE(sHowlUmakusa), sHowlUmakusa}, {ARRAY_SIZE(sHowlZeldaSong), sHowlZeldaSong}, @@ -125,6 +132,9 @@ static Z2WolfHowlData sGuideData[9] = { {ARRAY_SIZE(sNewSong1), sNewSong1}, {ARRAY_SIZE(sNewSong2), sNewSong2}, {ARRAY_SIZE(sNewSong3), sNewSong3}, + #if TARGET_PC + {ARRAY_SIZE(sHowlTimeSong), sHowlTimeSong}, + #endif }; Z2WolfHowlMgr::Z2WolfHowlMgr() : JASGlobalInstance(true) { @@ -356,6 +366,11 @@ void Z2WolfHowlMgr::setCorrectData(s8 curveID, Z2WolfHowlData* data) { cPitchCenter = 0.94387f; cPitchDown = 0.74915f; break; + case Z2WOLFHOWL_TIMESONG: + cPitchUp = 1.12246f; + cPitchCenter = 0.94387f; + cPitchDown = 0.74915f; + break; default: cPitchUp = 1.1892f; cPitchCenter = 1.0f; @@ -400,7 +415,7 @@ u8 Z2WolfHowlMgr::getCorrectLineNum() { return 0; } -static JAISoundID sCorrectPhrase[9] = { +static JAISoundID sCorrectPhrase[9 IF_DUSK(+1)] = { Z2BGM_HOWL_TOBIKUSA, Z2BGM_HOWL_UMAKUSA, Z2BGM_HOWL_ZELDASONG, @@ -410,9 +425,12 @@ static JAISoundID sCorrectPhrase[9] = { Z2BGM_NEW_01_HOWL, Z2BGM_NEW_02_HOWL, Z2BGM_NEW_03_HOWL, + #if TARGET_PC + 0xFFFFFFFF, + #endif }; -static JAISoundID sWindStoneSound[9] = { +static JAISoundID sWindStoneSound[9 IF_DUSK(+1)] = { 0xFFFFFFFF, 0xFFFFFFFF, Z2BGM_STONE_ZELDASONG, @@ -422,9 +440,12 @@ static JAISoundID sWindStoneSound[9] = { Z2BGM_NEW_01_STONE, Z2BGM_NEW_02_STONE, Z2BGM_NEW_03_STONE, + #if TARGET_PC + 0xFFFFFFFF, + #endif }; -static JAISoundID sCorrectDuo[9] = { +static JAISoundID sCorrectDuo[9 IF_DUSK(+1)] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, @@ -434,6 +455,9 @@ static JAISoundID sCorrectDuo[9] = { Z2BGM_NEW_01_DUO, Z2BGM_NEW_02_DUO, Z2BGM_NEW_03_DUO, + #if TARGET_PC + 0xFFFFFFFF, + #endif }; s8 Z2WolfHowlMgr::checkLine() { diff --git a/src/d/actor/d_a_alink_wolf.inc b/src/d/actor/d_a_alink_wolf.inc index 7f4bef7e42..ff0755648e 100644 --- a/src/d/actor/d_a_alink_wolf.inc +++ b/src/d/actor/d_a_alink_wolf.inc @@ -3868,35 +3868,18 @@ void daAlink_c::setWolfHowlNotHappen(int param_0) { } int daAlink_c::procWolfHowlDemoInit() { - #if TARGET_PC - s16 name; - if (field_0x27f4 != NULL) { - name = fopAcM_GetName(field_0x27f4); - } else { - name = fpcNm_ALINK_e; - } - - if (name == fpcNm_Obj_WindStone_e && !static_cast(field_0x27f4)->chkEveOccur() && dusk::getSettings().game.timeStones) { - Z2GetSeMgr()->seStart(Z2SE_READ_RIDDLE_B, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); - dKy_instant_timechg(0.0f); - return 0; - } - #endif - if (!dComIfGp_event_compulsory(this, NULL, 0xFFFF)) { return 0; } mDemo.setSpecialDemoType(); - #if !TARGET_PC s16 name; if (field_0x27f4 != NULL) { name = fopAcM_GetName(field_0x27f4); } else { name = fpcNm_ALINK_e; } - #endif if (name == fpcNm_Tag_WaraHowl_e) { shape_angle.y = field_0x27f4->shape_angle.y; @@ -3959,7 +3942,15 @@ int daAlink_c::procWolfHowlDemoInit() { } else if (name == fpcNm_TAG_HOWL_e) { mZ2WolfHowlMgr.setCorrectCurve(static_cast(field_0x27f4)->getCurveID()); } else if (name == fpcNm_Obj_WindStone_e) { + #if TARGET_PC + if (!static_cast(field_0x27f4)->chkEveOccur() && dusk::getSettings().game.timeStones) { + mZ2WolfHowlMgr.setCorrectCurve(9); + } else { + mZ2WolfHowlMgr.setCorrectCurve(static_cast(field_0x27f4)->getTuneId()); + } + #else mZ2WolfHowlMgr.setCorrectCurve(static_cast(field_0x27f4)->getTuneId()); + #endif mProcVar0.field_0x3008 = static_cast(field_0x27f4)->getNextSceneId(); mProcVar4.field_0x3010 = 1; } else if (name == fpcNm_Obj_SmWStone_e) { @@ -4109,6 +4100,14 @@ int daAlink_c::procWolfHowlDemo() { if (checkUnderMove0BckNoArcWolf(WANM_HOWL_END) || isSkipEdge) { if (checkAnmEnd(frameCtrl_p) || isSkipEdge) { if (mProcVar0.mHowlExitID >= 0) { + #if TARGET_PC + if (daAlink_getAlinkActorClass()->getCorrectCurveID() == 9) { + g_env_light.time_change_rate = 1.0f; + dComIfGp_event_reset(); + dCam_getBody()->EndEventCamera(fopAcM_GetID(this)); + return 1; + } + #endif dStage_changeScene(mProcVar0.mHowlExitID, 0.0f, 0, fopAcM_GetRoomNo(this), shape_angle.y, -1); } else { diff --git a/src/d/d_kankyo.cpp b/src/d/d_kankyo.cpp index 0bd3db8e2a..60e4d619a4 100644 --- a/src/d/d_kankyo.cpp +++ b/src/d/d_kankyo.cpp @@ -1540,8 +1540,21 @@ void dScnKy_env_light_c::setDaytime() { } if (dComIfGp_roomControl_getTimePass() && !field_0x130a && temp_r29) { + #if TARGET_PC + f32 prev = daytime; + #endif + daytime += time_change_rate; + #if TARGET_PC + if (time_change_rate == 1.0f && + (std::fmod(daytime - 90.0f + 360.0f, 360.0f) < std::fmod(prev - 90.0f + 360.0f, 360.0f) || + std::fmod(daytime - 285.0f + 360.0f, 360.0f) < std::fmod(prev - 285.0f + 360.0f, 360.0f))) + { + g_env_light.time_change_rate = 0.012f; + } + #endif + // Stage is Fishing Pond or Hena's Hut if (!strcmp(dComIfGp_getStartStageName(), "F_SP127") || !strcmp(dComIfGp_getStartStageName(), "R_SP127"))