mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-11 21:21:57 -04:00
Merge pull request #359 from TwilitRealm/feature/time-stones
Sun's Song
This commit is contained in:
@@ -39,6 +39,10 @@ enum Z2WolfHowlCurveID {
|
||||
Z2WOLFHOWL_NEWSONG2,
|
||||
Z2WOLFHOWL_NEWSONG3,
|
||||
|
||||
#if TARGET_PC
|
||||
Z2WOLFHOWL_TIMESONG,
|
||||
#endif
|
||||
|
||||
Z2WOLFHOWL_MAX
|
||||
};
|
||||
|
||||
|
||||
@@ -4549,6 +4549,7 @@ public:
|
||||
/* 0x03850 */ daAlink_procFunc mpProcFunc;
|
||||
|
||||
#if TARGET_PC
|
||||
void handleWolfHowl();
|
||||
void handleQuickTransform();
|
||||
bool checkGyroAimItemContext();
|
||||
#endif
|
||||
|
||||
@@ -61,6 +61,7 @@ struct UserSettings {
|
||||
ConfigVar<bool> noMissClimbing;
|
||||
ConfigVar<bool> fastTears;
|
||||
ConfigVar<bool> instantSaves;
|
||||
ConfigVar<bool> sunsSong;
|
||||
|
||||
// Preferences
|
||||
ConfigVar<bool> enableMirrorMode;
|
||||
|
||||
@@ -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_MID, 20}, {HOWL_LINE_LOW, 20}, {HOWL_LINE_HIGH, 40},
|
||||
{HOWL_LINE_MID, 20}, {HOWL_LINE_LOW, 20}, {HOWL_LINE_HIGH, 40},
|
||||
};
|
||||
#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,13 @@ void Z2WolfHowlMgr::setCorrectData(s8 curveID, Z2WolfHowlData* data) {
|
||||
cPitchCenter = 0.94387f;
|
||||
cPitchDown = 0.74915f;
|
||||
break;
|
||||
#if TARGET_PC
|
||||
case Z2WOLFHOWL_TIMESONG:
|
||||
cPitchUp = 1.259906f;
|
||||
cPitchCenter = 0.94387f;
|
||||
cPitchDown = 0.840885f;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
cPitchUp = 1.1892f;
|
||||
cPitchCenter = 1.0f;
|
||||
@@ -400,7 +417,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 +427,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 +442,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 +457,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() {
|
||||
|
||||
@@ -4,6 +4,65 @@
|
||||
#include "d/d_meter2_draw.h"
|
||||
#include "d/d_meter2_info.h"
|
||||
|
||||
void daAlink_c::handleWolfHowl() {
|
||||
if (checkWolf()) {
|
||||
if (!dusk::getSettings().game.sunsSong) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check to see if Link has the ability to transform.
|
||||
if (!dComIfGs_isEventBit(dSv_event_flag_c::M_077)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ensure there is a proper pointer to the mMeterClass and mpMeterDraw structs in
|
||||
// g_meter2_info.
|
||||
const auto meterClassPtr = g_meter2_info.getMeterClass();
|
||||
if (!meterClassPtr) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto meterDrawPtr = meterClassPtr->getMeterDrawPtr();
|
||||
if (!meterDrawPtr) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ensure that link is not in a cutscene.
|
||||
if (checkEventRun()) {
|
||||
Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
mDoCPd_c::getCpadInfo(PAD_1).mPressedButtonFlags = 0;
|
||||
|
||||
// Ensure that the Z Button is not dimmed
|
||||
if (meterDrawPtr->getButtonZAlpha() != 1.f) {
|
||||
Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
bool canTransform = false;
|
||||
|
||||
if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn()) {
|
||||
if (!checkForestOldCentury()) {
|
||||
if (checkMidnaRide()) {
|
||||
if ((checkWolf() &&
|
||||
(checkModeFlg(MODE_UNK_1000) || dComIfGp_checkPlayerStatus0(0, 0x10))) ||
|
||||
(!checkWolf() &&
|
||||
(checkEventRun() || getMidnaActor()->checkMetamorphoseEnable()) &&
|
||||
(checkModeFlg(4) || dComIfGp_checkPlayerStatus0(0, 0x10))))
|
||||
{
|
||||
canTransform = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getWolfHowlMgrP()->setCorrectCurve(9);
|
||||
procWolfHowlDemoInit();
|
||||
}
|
||||
}
|
||||
|
||||
void daAlink_c::handleQuickTransform() {
|
||||
if (!dusk::getSettings().game.enableQuickTransform) {
|
||||
return;
|
||||
|
||||
@@ -3954,7 +3954,13 @@ int daAlink_c::procWolfHowlDemoInit() {
|
||||
mZ2WolfHowlMgr.setCorrectCurve(-1);
|
||||
}
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
if (mZ2WolfHowlMgr.getCorrectCurveID() != 9) {
|
||||
mZ2WolfHowlMgr.setCorrectCurve(-1);
|
||||
}
|
||||
#else
|
||||
mZ2WolfHowlMgr.setCorrectCurve(-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
mNormalSpeed = 0.0f;
|
||||
@@ -4095,6 +4101,19 @@ int daAlink_c::procWolfHowlDemo() {
|
||||
dStage_changeScene(mProcVar0.mHowlExitID, 0.0f, 0, fopAcM_GetRoomNo(this),
|
||||
shape_angle.y, -1);
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
if (daAlink_getAlinkActorClass()->getCorrectCurveID() == 9) {
|
||||
if (dComIfGp_roomControl_getTimePass()) {
|
||||
g_env_light.time_change_rate = 1.0f;
|
||||
dComIfGp_event_reset();
|
||||
dCam_getBody()->EndEventCamera(fopAcM_GetID(this));
|
||||
} else {
|
||||
setWolfHowlNotHappen(isSkipEdge);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
fopAc_ac_c* actor_p = NULL;
|
||||
if (gwolf_p == NULL) {
|
||||
fopAcIt_Executor((fopAcIt_ExecutorFunc)daAlink_searchWolfHowl,
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -39,6 +39,7 @@ static void ApplyPresetDusk() {
|
||||
s.game.instantSaves.setValue(true);
|
||||
s.game.midnasLamentNonStop.setValue(true);
|
||||
s.game.enableFrameInterpolation.setValue(true);
|
||||
s.game.sunsSong.setValue(true);
|
||||
s.game.bloomMode.setValue(BloomMode::Dusk);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,15 @@ namespace dusk {
|
||||
if (ImGui::BeginMenu("Enhancements")) {
|
||||
if (ImGui::BeginMenu("Quality of Life")) {
|
||||
config::ImGuiCheckbox("Quick Transform (R+Y)", getSettings().game.enableQuickTransform);
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip("Allows you to quickly transform between forms\n"
|
||||
"without having to talk to Midna.");
|
||||
}
|
||||
|
||||
config::ImGuiCheckbox("Sun's Song (R+X)", getSettings().game.sunsSong);
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip("Allows Wolf Link to howl and change the time of day.");
|
||||
}
|
||||
|
||||
config::ImGuiCheckbox("Bigger Wallets", getSettings().game.biggerWallets);
|
||||
if (ImGui::IsItemHovered()) {
|
||||
|
||||
@@ -35,6 +35,7 @@ UserSettings g_userSettings = {
|
||||
.noMissClimbing {"game.noMissClimbing", false},
|
||||
.fastTears {"game.fastTears", false},
|
||||
.instantSaves {"game.instantSaves", false},
|
||||
.sunsSong {"game.sunsSong", false},
|
||||
|
||||
// Preferences
|
||||
.enableMirrorMode {"game.enableMirrorMode", false},
|
||||
@@ -113,6 +114,7 @@ void registerSettings() {
|
||||
Register(g_userSettings.game.fastClimbing);
|
||||
Register(g_userSettings.game.fastTears);
|
||||
Register(g_userSettings.game.instantSaves);
|
||||
Register(g_userSettings.game.sunsSong);
|
||||
Register(g_userSettings.game.enableMirrorMode);
|
||||
Register(g_userSettings.game.invertCameraXAxis);
|
||||
Register(g_userSettings.game.bloomMode);
|
||||
|
||||
@@ -748,6 +748,12 @@ void fapGm_Execute() {
|
||||
#endif
|
||||
|
||||
#if TARGET_PC
|
||||
if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1)) {
|
||||
if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) {
|
||||
dynamic_cast<daAlink_c*>(link)->handleWolfHowl();
|
||||
}
|
||||
}
|
||||
|
||||
if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigY(PAD_1)) {
|
||||
if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) {
|
||||
dynamic_cast<daAlink_c*>(link)->handleQuickTransform();
|
||||
|
||||
Reference in New Issue
Block a user