diff options
| author | David Racine <bass_dr@hotmail.com> | 2026-06-19 09:58:12 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-19 13:58:12 +0000 |
| commit | 497d34570b16e195665dcdf626cf187f0a705708 (patch) | |
| tree | f38123cda40ddf36581327e2ee44c0bc28d864ab /soh/src/code | |
| parent | d912fd2c016bea51831da922f5f4fd31c14ccab3 (diff) | |
fix: free look releases the door peek camera (#6756)
* fix(camera): let free look release the door peek camera
After walking through a door, the door camera (CAM_SET_DOORC) held the view and
only handed control back once the player moved or pressed a button, so the right
stick did nothing until then. With free look the camera appeared frozen after
every door.
Treat right-stick movement as a release condition too, using the same stick
threshold as free-look activation.
* refactor(camera): move door-cam free-look release to a VB_SHOULD hook
Reimplements the door peek camera free-look release as a vanilla-behavior
hook instead of inline logic in z_camera.c, keeping the decomp file close
to upstream.
- Add VB_RELEASE_DOORC_CAMERA wrapping the existing Camera_Special9 release
condition; the vanilla button/xzSpeed expression is left untouched.
- Move the right-stick / free-look threshold logic into a new enhancement,
FreeLookDoorCamRelease.cpp, registered with COND_VB_SHOULD and gated on
FreeLook.Enabled so the hook only exists while Free Look is on.
Behavior is unchanged from the previous fix; this only relocates the logic.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'soh/src/code')
| -rw-r--r-- | soh/src/code/z_camera.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index af665014d..71e4629c2 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -6921,14 +6921,19 @@ s32 Camera_Special9(Camera* camera) { camera->unk_14C |= (0x400 | 0x10); sCameraInterfaceFlags = 0; - if (camera->xzSpeed > 0.001f || CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_A) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_B) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CLEFT) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CDOWN) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CUP) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CRIGHT) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_R) || - CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_Z) || params->interfaceFlags & 0x8) { + // SOH [Enhancement] VB_RELEASE_DOORC_CAMERA lets free look hand the door peek camera + // back on right-stick input (see soh/Enhancements/camera/FreeLookDoorCamRelease.cpp). + if (GameInteractor_Should( + VB_RELEASE_DOORC_CAMERA, + camera->xzSpeed > 0.001f || CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_A) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_B) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CLEFT) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CDOWN) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CUP) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_CRIGHT) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_R) || + CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_Z) || params->interfaceFlags & 0x8, + camera)) { Camera_ChangeSettingFlags(camera, camera->prevSetting, 2); camera->unk_14C |= (0x4 | 0x2); |
