From e59bfd1a9cdf977146aa9880586d6ce1025874f2 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 28 Apr 2026 15:01:57 -0400 Subject: [PATCH 1/9] potential fix for freecam flashing --- src/d/d_camera.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 471c93bb19..ad9ff110ce 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -3089,10 +3089,6 @@ bool dCamera_c::bumpCheck(u32 i_flags) { field_0x968 *= mMonitor.field_0xc / 5.0f; } - #if TARGET_PC - if (!dusk::getSettings().game.freeCamera || !mCamParam.mManualMode) { - #endif - f32 tmp = field_0x96c * (mIsWolf == 1 ? 30.0f : 30.0f); center += vec3.norm() * (tmp * globe.V().Sin()); cSGlobe globe2(vec2 - center); @@ -3106,10 +3102,6 @@ bool dCamera_c::bumpCheck(u32 i_flags) { vec = lin_chk1.GetCross(); } - #if TARGET_PC - } - #endif - #if DEBUG if (mCamSetup.CheckFlag(0x8000)) { dDbVw_Report(20, 235, " U"); From 79344edf0d483d34e27bf35810d4c65e276012e6 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 28 Apr 2026 15:19:32 -0400 Subject: [PATCH 2/9] maybe fix number 2 --- src/d/d_camera.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index ad9ff110ce..2386c0e3b5 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -7488,7 +7488,9 @@ bool dCamera_c::freeCamera() { mCamParam.freeYAngle += camMovement.y * magnitude * dusk::getSettings().game.freeCameraSensitivity * 4.0f; } - if (!mCamParam.mManualMode) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + if (!mCamParam.mManualMode || player == nullptr) { return false; } @@ -7501,7 +7503,7 @@ bool dCamera_c::freeCamera() { f32 currentLerp = (mCamParam.freeYAngle - minYAngle) / (maxAngle - minYAngle); mViewCache.mDirection.mRadius = std::lerp(200.0f, 1000.0f, currentLerp); - cXyz finalCenter = mpPlayerActor->current.pos; + cXyz finalCenter = player->current.pos; finalCenter.y += mIsWolf ? 90.0f : 100.0f; mViewCache.mCenter = finalCenter; From 8e0f0e878e00b4fa2baa8be1181daf7f273dfa79 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 28 Apr 2026 16:13:49 -0400 Subject: [PATCH 3/9] optimize some code --- src/d/d_camera.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 2386c0e3b5..3aa707b87b 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -7476,12 +7476,7 @@ bool dCamera_c::freeCamera() { f32 magnitude = sqrt(mPadInfo.mCStick.mLastPosX * mPadInfo.mCStick.mLastPosX + mPadInfo.mCStick.mLastPosY * mPadInfo.mCStick.mLastPosY); if (mPadInfo.mCStick.mLastPosX != 0 || mPadInfo.mCStick.mLastPosY != 0) { - if (!mCamParam.mManualMode) { - mCamParam.mManualMode = 1; - mCamParam.freeXAngle = mViewCache.mDirection.mAzimuth.Degree(); - mCamParam.freeYAngle = mViewCache.mDirection.mInclination.Degree(); - } - + mCamParam.mManualMode = 1; camMovement = camMovement.normalize(); camMovement.y *= dusk::getSettings().game.invertCameraYAxis ? 1.0f : -1.0f; mCamParam.freeXAngle += camMovement.x * magnitude * dusk::getSettings().game.freeCameraSensitivity * 4.0f; @@ -7489,7 +7484,6 @@ bool dCamera_c::freeCamera() { } fopAc_ac_c* player = dComIfGp_getPlayer(0); - if (!mCamParam.mManualMode || player == nullptr) { return false; } From 9a7b62cbc62659dde0bf540bfdc8e4474e52210e Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 28 Apr 2026 16:25:42 -0400 Subject: [PATCH 4/9] disable freecam if an event cam happens --- src/d/d_camera.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 3aa707b87b..4d6a7b8582 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -10049,6 +10049,10 @@ bool dCamera_c::oneSideCamera(s32 param_1) { } bool dCamera_c::eventCamera(s32 param_0) { + #if TARGET_PC + mCamParam.mManualMode = 0; + #endif + char sp90[12]; UNUSED(param_0); From 4462c0ef6919d49cca66bdf1933e7b0b1a6aaa39 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 29 Apr 2026 14:28:18 -0400 Subject: [PATCH 5/9] more optimizations to freecam code --- src/d/d_camera.cpp | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 4d6a7b8582..81cb452dc1 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -3512,12 +3512,6 @@ void dCamera_c::checkGroundInfo() { } bool dCamera_c::chaseCamera(s32 param_0) { -#if TARGET_PC - if (freeCamera()) { - return 1; - } -#endif - static f32 JumpCushion = 0.9f; f32 charge_latitude = mCamSetup.ChargeLatitude(); int charge_timer = mCamSetup.ChargeTimer(); @@ -4636,6 +4630,9 @@ bool dCamera_c::chaseCamera(s32 param_0) { if (chase->field_0x1c != 0) { chase->field_0x1c--; } + + freeCamera(); + return true; } @@ -7469,8 +7466,10 @@ bool dCamera_c::freeCamera() { return false; } - mCamParam.freeXAngle = mViewCache.mDirection.mAzimuth.Degree(); - mCamParam.freeYAngle = mViewCache.mDirection.mInclination.Degree(); + if (!mCamParam.mManualMode) { + mCamParam.freeXAngle = mViewCache.mDirection.mAzimuth.Degree(); + mCamParam.freeYAngle = mViewCache.mDirection.mInclination.Degree(); + } cXyz camMovement = {mPadInfo.mCStick.mLastPosX, mPadInfo.mCStick.mLastPosY, 0.0f}; f32 magnitude = sqrt(mPadInfo.mCStick.mLastPosX * mPadInfo.mCStick.mLastPosX + mPadInfo.mCStick.mLastPosY * mPadInfo.mCStick.mLastPosY); @@ -7488,24 +7487,16 @@ bool dCamera_c::freeCamera() { return false; } - f32 minYAngle = -10.0f; + f32 minYAngle = -30.0f; f32 maxAngle = 50.0f; mCamParam.freeYAngle = std::clamp(mCamParam.freeYAngle, minYAngle, maxAngle); mViewCache.mDirection.mAzimuth = cSAngle(mCamParam.freeXAngle); mViewCache.mDirection.mInclination = cSAngle(mCamParam.freeYAngle); - f32 currentLerp = (mCamParam.freeYAngle - minYAngle) / (maxAngle - minYAngle); - mViewCache.mDirection.mRadius = std::lerp(200.0f, 1000.0f, currentLerp); - cXyz finalCenter = player->current.pos; - finalCenter.y += mIsWolf ? 90.0f : 100.0f; - mViewCache.mCenter = finalCenter; - - cXyz finalEye = finalCenter + mViewCache.mDirection.Xyz(); + cXyz finalEye = mViewCache.mCenter + mViewCache.mDirection.Xyz(); mViewCache.mEye = finalEye; - mViewCache.mFovy = 60.0f; - return true; } #endif From b8a83c6f594b715639a76c8d5fb78ecabf6a55d0 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 29 Apr 2026 14:37:32 -0400 Subject: [PATCH 6/9] disable freecam if not chasecamera --- src/d/d_camera.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 81cb452dc1..7b10f6883d 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -1177,6 +1177,12 @@ bool dCamera_c::Run() { } else { sp0F = (this->*engine_tbl[mCamParam.Algorythmn(mCamStyle)])(mCamStyle); + #if TARGET_PC + if (mCamParam.Algorythmn(mCamStyle) != 1) { + mCamParam.mManualMode = 0; + } + #endif + field_0x170++; field_0x160++; mCurCamStyleTimer++; @@ -4631,7 +4637,9 @@ bool dCamera_c::chaseCamera(s32 param_0) { chase->field_0x1c--; } + #if TARGET_PC freeCamera(); + #endif return true; } @@ -7478,8 +7486,8 @@ bool dCamera_c::freeCamera() { mCamParam.mManualMode = 1; camMovement = camMovement.normalize(); camMovement.y *= dusk::getSettings().game.invertCameraYAxis ? 1.0f : -1.0f; - mCamParam.freeXAngle += camMovement.x * magnitude * dusk::getSettings().game.freeCameraSensitivity * 4.0f; - mCamParam.freeYAngle += camMovement.y * magnitude * dusk::getSettings().game.freeCameraSensitivity * 4.0f; + mCamParam.freeXAngle += camMovement.x * magnitude * dusk::getSettings().game.freeCameraSensitivity * 5.0f; + mCamParam.freeYAngle += camMovement.y * magnitude * dusk::getSettings().game.freeCameraSensitivity * 5.0f; } fopAc_ac_c* player = dComIfGp_getPlayer(0); @@ -10040,10 +10048,6 @@ bool dCamera_c::oneSideCamera(s32 param_1) { } bool dCamera_c::eventCamera(s32 param_0) { - #if TARGET_PC - mCamParam.mManualMode = 0; - #endif - char sp90[12]; UNUSED(param_0); From ee4c84f39b1d81aa5c513ae1161376df0e84656a Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 29 Apr 2026 15:21:48 -0400 Subject: [PATCH 7/9] Fix slight spazz when changing cam type --- src/d/d_camera.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 7b10f6883d..a9c54512e3 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -4199,6 +4199,11 @@ bool dCamera_c::chaseCamera(s32 param_0) { chase->field_0x8 -= chase->field_0xc; chase->field_0x8c = 0; chase->field_0x90 = false; + + #if TARGET_PC + freeCamera(); + #endif + return true; } From f147dcac0c8da26e137a8319e727c67b369cbcae Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Wed, 29 Apr 2026 15:29:00 -0400 Subject: [PATCH 8/9] Fix camera while crawling & disable freecam properly when not chasecam --- src/d/d_camera.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index a9c54512e3..09ed30d9f7 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -1175,14 +1175,14 @@ bool dCamera_c::Run() { clrFlag(0x200000); } } else { - sp0F = (this->*engine_tbl[mCamParam.Algorythmn(mCamStyle)])(mCamStyle); - #if TARGET_PC if (mCamParam.Algorythmn(mCamStyle) != 1) { mCamParam.mManualMode = 0; } #endif + sp0F = (this->*engine_tbl[mCamParam.Algorythmn(mCamStyle)])(mCamStyle); + field_0x170++; field_0x160++; mCurCamStyleTimer++; @@ -7474,7 +7474,8 @@ bool dCamera_c::test2Camera(s32 param_0) { #if TARGET_PC bool dCamera_c::freeCamera() { - if (!dusk::getSettings().game.freeCamera) { + if (!dusk::getSettings().game.freeCamera || mCamStyle == 70) + { mCamParam.mManualMode = 0; return false; } From acecba7ff788e09c8460d179ce0035aa37bb960f Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Fri, 1 May 2026 12:54:40 -0400 Subject: [PATCH 9/9] Reset camera zoom to 0 if freecam is enabled mid-game --- src/d/d_camera.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 96ffdf97d3..56c44e34f2 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -7474,6 +7474,10 @@ bool dCamera_c::test2Camera(s32 param_0) { #if TARGET_PC bool dCamera_c::freeCamera() { + if (dusk::getSettings().game.freeCamera && mGear == 1) { + mGear = 0; + } + if (!dusk::getSettings().game.freeCamera || mCamStyle == 70) { mCamParam.mManualMode = 0;