Time Stones now with Song of Time

This commit is contained in:
MelonSpeedruns
2026-04-13 13:03:28 -04:00
parent 277d16c110
commit f15a4f07e5
4 changed files with 61 additions and 21 deletions
+4
View File
@@ -39,6 +39,10 @@ enum Z2WolfHowlCurveID {
Z2WOLFHOWL_NEWSONG2,
Z2WOLFHOWL_NEWSONG3,
#if TARGET_PC
Z2WOLFHOWL_TIMESONG,
#endif
Z2WOLFHOWL_MAX
};
+28 -4
View File
@@ -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() {
+16 -17
View File
@@ -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<daWindStone_c*>(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<daTag_Howl_c*>(field_0x27f4)->getCurveID());
} else if (name == fpcNm_Obj_WindStone_e) {
#if TARGET_PC
if (!static_cast<daWindStone_c*>(field_0x27f4)->chkEveOccur() && dusk::getSettings().game.timeStones) {
mZ2WolfHowlMgr.setCorrectCurve(9);
} else {
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daWindStone_c*>(field_0x27f4)->getTuneId());
}
#else
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daWindStone_c*>(field_0x27f4)->getTuneId());
#endif
mProcVar0.field_0x3008 = static_cast<daWindStone_c*>(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 {
+13
View File
@@ -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"))