Skip to content

Commit

Permalink
Let FPS controls survive more events
Browse files Browse the repository at this point in the history
Not all cutscenes are amenable to this approach, but it kinda sorta works some of the time. I need to understand the game's camera code better before I can improve this further.
  • Loading branch information
ItEndsWithTens committed Mar 16, 2024
1 parent 33656fe commit b84c1bf
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 7 deletions.
17 changes: 17 additions & 0 deletions src/SHME.ExternalTool/CameraState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;

namespace SHME.ExternalTool
{
[Flags]
public enum CameraState
{
None = 0x0,
LockPitch = 0x1,
LockYaw = 0x2,
Unknown1 = 0x10,
Chase = 0x80,
Cutscene = 0x100,
Unknown2 = 0x200,
Unknown3 = 0x400
}
}
5 changes: 5 additions & 0 deletions src/SHME.ExternalTool/EnumExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ public static bool FasterHasFlag(this PsxButtons value, PsxButtons flag)
return (value & flag) != 0;
}

public static bool FasterHasFlag(this CameraState value, CameraState flag)
{
return (value & flag) != 0;
}

public static bool FasterHasFlag(this Culling value, Culling flag)
{
return (value & flag) != 0;
Expand Down
16 changes: 11 additions & 5 deletions src/SHME.ExternalTool/UI/BasicsTab_CameraFly.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ private void CbxCameraDetach_CheckedChanged(object sender, EventArgs e)
private uint _holdCameraRoll;
private void DetachCamera()
{
Mem.WriteS32(Rom.Addresses.MainRam.CameraState, 0x3);
Mem.WriteS32(Rom.Addresses.MainRam.CameraState,
(int)(CameraState.LockPitch | CameraState.LockYaw));

_holdCameraPitch = Mem.ReadU32(Rom.Addresses.MainRam.CameraActualPitch);
_holdCameraYaw = Mem.ReadU32(Rom.Addresses.MainRam.CameraActualYaw);
Expand All @@ -117,7 +118,8 @@ private void DetachCamera()

private void HoldCamera()
{
Mem.WriteS32(Rom.Addresses.MainRam.CameraState, 0x3);
Mem.WriteS32(Rom.Addresses.MainRam.CameraState,
(int)(CameraState.LockPitch | CameraState.LockYaw));

Mem.WriteU16(Rom.Addresses.MainRam.CameraIdealPitch, _holdCameraPitch);
Mem.WriteU16(Rom.Addresses.MainRam.CameraIdealYaw, _holdCameraYaw);
Expand Down Expand Up @@ -254,7 +256,7 @@ private void MoveCamera()
// approach real games use for consistent input with varying framerate.
private float _sensitivity;
private Point _aimCenter;
private void AimCamera(Button btn)
private void AimCamera(Button btn, bool cutscene = false)
{
_aimCenter.X = btn.Location.X + ((btn.Bounds.Right - btn.Bounds.Left) / 2);
_aimCenter.Y = btn.Location.Y + ((btn.Bounds.Bottom - btn.Bounds.Top) / 2);
Expand Down Expand Up @@ -284,7 +286,10 @@ private void AimCamera(Button btn)
yawDegrees += deltaX;

_holdCameraPitch = Core.DegreesToGameUnits(pitchDegrees);
_holdCameraYaw = Core.DegreesToGameUnits(yawDegrees);
if (!cutscene)
{
_holdCameraYaw = Core.DegreesToGameUnits(yawDegrees);
}
_holdCameraRoll = 0;

Cursor.Position = _aimCenter;
Expand All @@ -294,7 +299,8 @@ private void AttachCamera()
{
FlyEnabled = false;

Mem.WriteS32(Rom.Addresses.MainRam.CameraState, 0x0);
Mem.WriteS32(Rom.Addresses.MainRam.CameraState,
(int)(CameraState.None));
}

private void BtnCameraFly_KeyDown(object sender, KeyEventArgs e)
Expand Down
14 changes: 12 additions & 2 deletions src/SHME.ExternalTool/UI/CustomMainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ public override void UpdateValues(ToolFormUpdateType type)
_harryModel = new Ilm(header, remaining);
}

var camState = (CameraState)(Mem.ReadS32(Rom.Addresses.MainRam.CameraState));
bool cutscene = camState.FasterHasFlag(CameraState.Cutscene);

switch (type)
{
case ToolFormUpdateType.PreFrame:
Expand All @@ -304,6 +307,10 @@ public override void UpdateValues(ToolFormUpdateType type)
pos.Z = -Core.QToFloat(Mem.ReadS32(Rom.Addresses.MainRam.CameraLookAtZ));
_gameCameraLookAt.Position = pos;
}
if (cutscene)
{
_holdCameraYaw = Mem.ReadU16(Rom.Addresses.MainRam.HarryYaw);
}
if (CbxCameraDetach.Checked)
{
HoldCamera();
Expand Down Expand Up @@ -332,8 +339,11 @@ public override void UpdateValues(ToolFormUpdateType type)
_forcedCameraYaw = null;
}
MoveCameraFirstPerson();
AimCamera(BtnCameraFps);
Mem.WriteU16(Rom.Addresses.MainRam.HarryYaw, _holdCameraYaw);
AimCamera(BtnCameraFps, cutscene);
if (!cutscene)
{
Mem.WriteU16(Rom.Addresses.MainRam.HarryYaw, _holdCameraYaw);
}
}
break;
case ToolFormUpdateType.PostFrame:
Expand Down

0 comments on commit b84c1bf

Please sign in to comment.