diff --git a/scenes/player_controller/PlayerController.tscn b/scenes/player_controller/PlayerController.tscn index 590fba06..514ce31f 100644 --- a/scenes/player_controller/PlayerController.tscn +++ b/scenes/player_controller/PlayerController.tscn @@ -230,12 +230,10 @@ debug_color = Color(0, 0.6, 0.701961, 0.341176) [node name="HeadSystem" parent="." unique_id=1203743757 instance=ExtResource("11_rxwoh")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0) +LookSensitivity = 0.16 CameraInclineAcceleration = 20.0 GroundedCameraIncline = 3.0 SlidingJitterAmplitude = 0.2 -WeaponSway = 8.0 -WeaponLookRotation = 10.0 -WeaponAdjustmentSpeed = 1.0 [node name="MantleSystem" parent="HeadSystem" unique_id=98905505 instance=ExtResource("8_qu4wy")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.6, 0) diff --git a/scenes/player_controller/PlayerUi.cs b/scenes/player_controller/PlayerUi.cs index 8fa422a0..a8d57187 100644 --- a/scenes/player_controller/PlayerUi.cs +++ b/scenes/player_controller/PlayerUi.cs @@ -76,6 +76,5 @@ public partial class PlayerUi : Control public void OnManaChanged(float newValue) { _manabar.CurrentHealth = newValue; - GD.Print("mana changed"); } } diff --git a/scenes/player_controller/components/head/HeadSystem.cs b/scenes/player_controller/components/head/HeadSystem.cs index 50653503..102cf857 100644 --- a/scenes/player_controller/components/head/HeadSystem.cs +++ b/scenes/player_controller/components/head/HeadSystem.cs @@ -39,12 +39,12 @@ public partial class HeadSystem : Node3D float BobbingMultiplier, float FovMultiplier); - internal Camera3D _camera; - internal Marker3D _cameraAnchor; - internal AnimationPlayer _animationPlayer; - internal AnimationTree _animationTree; + internal Camera3D Camera = null!; + internal Node3D CameraAnchor = null!; + internal AnimationPlayer AnimationPlayer = null!; + internal AnimationTree AnimationTree = null!; - [Export(PropertyHint.Range, "0,10,0.1,or_greater")] + [Export(PropertyHint.Range, "0,1,0.01,or_greater")] public float LookSensitivity { get; set; } = 1f; [ExportGroup("Camera incline")] @@ -84,78 +84,75 @@ public partial class HeadSystem : Node3D public float FovMaxedOutSpeed { get; set; } = 20f; [ExportGroup("First Person rig")] - internal Node3D _fpRig; - internal Node3D _rightHandedWeapon; - internal Node3D _leftHandedWeapon; - internal Node3D _fpDisplacedRig; - internal Vector3 _fpDisplacedRigInitialRotation; - [Export(PropertyHint.Range, "0,10,0.1,or_greater")] - public float WeaponSway { get; set; } = 5f; - [Export(PropertyHint.Range, "0,10,0.1,or_greater")] - public float WeaponLookRotation { get; set; } = 1f; + internal Node3D FpRig = null!; + internal Node3D RightHandedWeapon = null!; + internal Vector3 RightHandedWeaponInitialRotation = Vector3.Zero; + internal Node3D LeftHandedWeapon = null!; + internal Vector3 LeftHandedWeaponInitialRotation = Vector3.Zero; + [Export(PropertyHint.Range, "0,20,1,or_greater")] + public float WeaponSway { get; set; } = 15f; [Export(PropertyHint.Range, "0,200,1,or_greater")] public float WeaponMoveRotation { get; set; } = 80f; - [Export(PropertyHint.Range, "0,20,0.1,or_greater")] - public float WeaponAdjustmentSpeed { get; set; } = 10f; - [Export(PropertyHint.Range, "0,10,0.1,or_greater")] - public float DisplacedWeaponSway { get; set; } = 5f; - [Export(PropertyHint.Range, "0,10,0.1,or_greater")] - public float DisplacedWeaponLookRotation { get; set; } = 1f; - [Export(PropertyHint.Range, "0,1,0.01,or_greater")] + [Export(PropertyHint.Range, "0,20,1,or_greater")] + public float WeaponAdjustmentSpeed { get; set; } = 1f; + [Export(PropertyHint.Range, "0,2,0.01,or_greater")] + public float DisplacedWeaponSway { get; set; } = 0.8f; + [Export(PropertyHint.Range, "0,0.5,0.01,or_greater")] public float DisplacedWeaponMoveRotation { get; set; } = 0.1f; - [Export(PropertyHint.Range, "0,20,0.1,or_greater")] - public float DisplacedWeaponAdjustmentSpeed { get; set; } = 10f; + [Export(PropertyHint.Range, "0,20,1,or_greater")] + public float DisplacedWeaponAdjustmentSpeed { get; set; } = 12f; public void Init() { - _isPlayingForcingAnim = false; + IsPlayingForcingAnim = false; Input.SetMouseMode(Input.MouseModeEnum.Captured); - _camera = GetNode("CameraSmooth/Camera3D"); - _cameraAnchor = GetNode("CameraAnchor"); - _animationPlayer = GetNode("AnimationPlayer"); - _animationTree = GetNode("AnimationTree"); - - _fpRig = GetNode("FPRig"); - _rightHandedWeapon = GetNode("FPRig/Sword"); - _leftHandedWeapon = GetNode("FPRig/Parry"); - _fpDisplacedRig = GetNode("FPRig/Sword"); - _fpDisplacedRigInitialRotation = _fpDisplacedRig.Rotation; + Camera = GetNode("CameraSmooth/Camera3D"); + CameraAnchor = GetNode("CameraSmooth/CameraAnchor"); + //_cameraAnchor = GetNode("CameraSmooth/Camera3D"); + AnimationPlayer = GetNode("AnimationPlayer"); + AnimationTree = GetNode("AnimationTree"); + FpRig = GetNode("FPRig"); + RightHandedWeapon = GetNode("FPRig/Sword/SwordMesh"); + RightHandedWeaponInitialRotation = RightHandedWeapon.Rotation; + LeftHandedWeapon = GetNode("FPRig/Parry/ParryMesh"); + LeftHandedWeaponInitialRotation = LeftHandedWeapon.Rotation; + _slidingNoise.NoiseType = FastNoiseLite.NoiseTypeEnum.Perlin; _slidingNoise.SetFrequency(SlidingJitterFrequency); } public void SetWeaponsVisible(bool swordVisible, bool parryVisible) { - _rightHandedWeapon.Visible = swordVisible; - _leftHandedWeapon.Visible = parryVisible; + RightHandedWeapon.Visible = swordVisible; + LeftHandedWeapon.Visible = parryVisible; } public void OnMantle() { - _animationTree.Set("parameters/OnMantle/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); + AnimationTree.Set("parameters/OnMantle/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); } public void OnJumpStarted() { - _animationTree.Set("parameters/OnJumpStart/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); + AnimationTree.Set("parameters/OnJumpStart/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); } public void OnJumpEnded() { - _animationTree.Set("parameters/OnJumpEnd/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); + AnimationTree.Set("parameters/OnJumpEnd/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); } public void OnHit() { - _animationTree.Set("parameters/OnHit/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); + AnimationTree.Set("parameters/OnHit/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); } public void OnParry() { - _animationTree.Set("parameters/OnParry/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); + AnimationTree.Set("parameters/OnParry/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); } public void OnStartDeathAnimation() { - _isPlayingForcingAnim = true; - _animationTree.Set("parameters/OnDie/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); + IsPlayingForcingAnim = true; + AnimationTree.Set("parameters/OnDie/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); } public void OnDeathAnimationFinished() @@ -190,8 +187,8 @@ public partial class HeadSystem : Node3D EmitSignalHitboxDeactivated(); } - internal bool _footstepEmitted; - internal bool _isPlayingForcingAnim; + internal bool FootstepEmitted; + internal bool IsPlayingForcingAnim; public void ResetHeadBobbing() { @@ -200,10 +197,10 @@ public partial class HeadSystem : Node3D public void LookAround(CameraParameters inputs) { - if (_isPlayingForcingAnim) + if (IsPlayingForcingAnim) { - _camera.Position = Vector3.Zero; - _camera.Rotation = Vector3.Zero; + Camera.Position = Vector3.Zero; + Camera.Rotation = Vector3.Zero; return; } @@ -223,7 +220,7 @@ public partial class HeadSystem : Node3D RotateY(angleForHorizontalRotation); // Vertical movement of head - Vector3 currentCameraRotation = _cameraAnchor.Rotation; + Vector3 currentCameraRotation = CameraAnchor.Rotation; currentCameraRotation.X += Convert.ToSingle(lookDir.Y * LookSensitivity * sensitivitMultiplier); currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f)); @@ -242,18 +239,18 @@ public partial class HeadSystem : Node3D cameraIncline = Mathf.DegToRad(GroundedCameraIncline * cameraInclineFactor * -1.0f); } currentCameraRotation.Z = (float) Mathf.Lerp(currentCameraRotation.Z, cameraIncline, delta * CameraInclineAcceleration); - _cameraAnchor.Rotation = currentCameraRotation; + CameraAnchor.Rotation = currentCameraRotation; if (withCameraJitter) { - _cameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset; + CameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset; float noise1D = _slidingNoise.GetNoise1D(Time.GetTicksMsec()); float noiseAmplitude = SlidingJitterAmplitude*Mathf.Clamp(playerVelocity.Length(), 0f, 1f); - _cameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude; + CameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude; } else { - _cameraAnchor.Position = Vector3.Zero; + CameraAnchor.Position = Vector3.Zero; } Vector3 newPositionForCamera = Vector3.Zero; @@ -268,76 +265,79 @@ public partial class HeadSystem : Node3D newPositionForCamera.Y = Mathf.Sin(_bobbingAccumulator * BobbingFrequency) * BobbingAmplitude * bobbingMultiplier; newPositionForCamera.X = Mathf.Cos(_bobbingAccumulator * BobbingFrequency / 2.0f) * BobbingAmplitude * bobbingMultiplier; - if (newPositionForCamera.Y < -0.07 && !_footstepEmitted) Footstep(); - if (newPositionForCamera.Y > 0) _footstepEmitted = false; + if (newPositionForCamera.Y < -0.07 * bobbingMultiplier && !FootstepEmitted) Footstep(); + if (newPositionForCamera.Y > 0) FootstepEmitted = false; // Offset bobbing for weapon rig newPositionForRig.Y = Mathf.Cos(_bobbingAccumulator * BobbingFrequency) * BobbingAmplitude * bobbingMultiplier * 0.2f; newPositionForRig.X = Mathf.Sin(_bobbingAccumulator * BobbingFrequency / 2.0f) * BobbingAmplitude * bobbingMultiplier * 0.2f; } - _cameraAnchor.Position += newPositionForCamera; - - _camera.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated(); + CameraAnchor.Position += newPositionForCamera; + Camera.GlobalTransform = CameraAnchor.GetGlobalTransformInterpolated(); // First person rig adjustments - _fpRig.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated(); + FpRig.GlobalTransform = Camera.GlobalTransform; // Apply bobbing - _fpRig.Position += newPositionForRig; + FpRig.Position += newPositionForRig; // Rotate the whole rig based on movement input - var newRigRotation = _fpRig.Rotation; - var camTilt = Mathf.Lerp(_fpRig.Rotation.Z, cameraIncline*WeaponMoveRotation, delta*WeaponAdjustmentSpeed); + var newRigRotation = FpRig.Rotation; + var camTilt = Mathf.Lerp(FpRig.Rotation.Z, CameraAnchor.Rotation.Z*WeaponMoveRotation, delta * WeaponAdjustmentSpeed); newRigRotation.Z = (float) camTilt; // Rotate the whole rig based on camera rotation input - newRigRotation.X = Mathf.Lerp(newRigRotation.X, -lookDir.Y*WeaponSway, (float) delta*WeaponAdjustmentSpeed); - newRigRotation.Y = Mathf.Lerp(newRigRotation.Y, -lookDir.X*WeaponSway, (float) delta*WeaponAdjustmentSpeed); + newRigRotation.X = Mathf.Lerp(newRigRotation.X, -lookDir.Y*WeaponSway, (float) delta * WeaponAdjustmentSpeed); + newRigRotation.Y = Mathf.Lerp(newRigRotation.Y, -lookDir.X*WeaponSway, (float) delta * WeaponAdjustmentSpeed); // Apply - _fpRig.Rotation = newRigRotation; + FpRig.Rotation = newRigRotation; - // Compute displaced rig adjustments, starting with movement input - var newDisplacedRigRotation = _fpDisplacedRig.Rotation; - - var howMuchForward = ComputeHowMuchInputForward(playerInput); - var howMuchSideways = ComputeHowMuchInputSideways(playerInput); - var displacedCamTiltForward = Mathf.Lerp(newDisplacedRigRotation.Z, - _fpDisplacedRigInitialRotation.Z + howMuchForward*DisplacedWeaponMoveRotation, - delta*DisplacedWeaponAdjustmentSpeed); - var displacedCamTiltSide = Mathf.Lerp(newDisplacedRigRotation.X, - _fpDisplacedRigInitialRotation.X - howMuchSideways*DisplacedWeaponMoveRotation, - delta*DisplacedWeaponAdjustmentSpeed); - - newDisplacedRigRotation.X = (float) displacedCamTiltSide; - newDisplacedRigRotation.Z = (float) displacedCamTiltForward; - - var displacedSwayY = Mathf.Lerp(newDisplacedRigRotation.Y, - _fpDisplacedRigInitialRotation.Y - lookDir.X*DisplacedWeaponSway, - delta*DisplacedWeaponAdjustmentSpeed); - newDisplacedRigRotation.Y = (float) displacedSwayY; - - // Apply - _fpDisplacedRig.Rotation = newDisplacedRigRotation; + // Compute sword meshes procedural adjustments + RightHandedWeapon.Rotation = ComputeRotationForFpMesh(RightHandedWeapon, RightHandedWeaponInitialRotation, playerInput, lookDir, (float) delta); + LeftHandedWeapon.Rotation = ComputeRotationForFpMesh(LeftHandedWeapon, LeftHandedWeaponInitialRotation, playerInput, lookDir, (float) delta); // Camera adjustments float velocityClamped = Mathf.Clamp(playerVelocity.Length(), 0.5f, FovMaxedOutSpeed); float targetFov = BaseFov + FovChangeFactor * velocityClamped * fovMultiplier; - _camera.Fov = Mathf.Lerp(_camera.Fov, targetFov, (float) delta * FovChangeSpeed); + Camera.Fov = Mathf.Lerp(Camera.Fov, targetFov, (float) delta * FovChangeSpeed); + } + + public Vector3 ComputeRotationForFpMesh(Node3D mesh, Vector3 initialRotation, Vector3 playerInput, Vector2 lookDir, float delta) + { + var newMeshRotation = mesh.Rotation; + var howMuchForward = ComputeHowMuchInputForward(playerInput); + var howMuchSideways = ComputeHowMuchInputSideways(playerInput); + var displacedCamTiltForward = Mathf.Lerp(newMeshRotation.Z, + initialRotation.Z + howMuchForward*DisplacedWeaponMoveRotation, + delta * DisplacedWeaponAdjustmentSpeed); + var displacedCamTiltSide = Mathf.Lerp(newMeshRotation.X, + initialRotation.X - howMuchSideways*DisplacedWeaponMoveRotation, + delta * DisplacedWeaponAdjustmentSpeed); + + newMeshRotation.X = displacedCamTiltSide; + newMeshRotation.Z = displacedCamTiltForward; + + var displacedSwayY = Mathf.Lerp(newMeshRotation.Y, + initialRotation.Y - lookDir.X*DisplacedWeaponSway, + delta * DisplacedWeaponAdjustmentSpeed); + newMeshRotation.Y = displacedSwayY; + + return newMeshRotation; } public void Footstep() { - _footstepEmitted = true; + FootstepEmitted = true; EmitSignalStepFoot(); } public void HideWeapon() { - _rightHandedWeapon.Visible = false; + RightHandedWeapon.Visible = false; } public void ShowWeapon() { - _rightHandedWeapon.Visible = true; + RightHandedWeapon.Visible = true; } public float ComputeCameraInclineFactor(Vector3 direction) @@ -368,15 +368,15 @@ public partial class HeadSystem : Node3D public Vector3 GetGlobalForwardVector() { - return _camera.GlobalBasis.Z; + return Camera.GlobalBasis.Z; } public Vector3 GetGlobalLookRotation() { return new Vector3( - _camera.Rotation.X, + Camera.Rotation.X, Rotation.Y, - _camera.Rotation.Z); + Camera.Rotation.Z); } public void SetHeight(float height) diff --git a/scenes/player_controller/components/head/head_system.tscn b/scenes/player_controller/components/head/head_system.tscn index 6b2ccc44..408f4be6 100644 --- a/scenes/player_controller/components/head/head_system.tscn +++ b/scenes/player_controller/components/head/head_system.tscn @@ -654,9 +654,6 @@ _data = { [node name="HeadSystem" type="Node3D" unique_id=2067407038] script = ExtResource("1_8abgy") -WeaponMoveRotation = 20.0 -DisplacedWeaponSway = 1.0 -DisplacedWeaponAdjustmentSpeed = 8.0 [node name="FPRig" type="Node3D" parent="." unique_id=922968399] transform = Transform3D(0.9999998, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000002, 0, 0, 0) @@ -678,6 +675,9 @@ mesh = ExtResource("3_1ay6d") [node name="CameraSmooth" type="Node3D" parent="." unique_id=2072010960] transform = Transform3D(0.9999998, -0.00011616429, 0, 0.00011616431, 0.99999964, 0, 0, 0, 0.99999976, 0, 0, 0) +[node name="CameraAnchor" type="Marker3D" parent="CameraSmooth" unique_id=1554357312] +transform = Transform3D(1.0000002, 0.00011616435, 0, -0.000116164374, 1.0000004, 0, 0, 0, 1.0000002, 0, 0, 0) + [node name="Camera3D" type="Camera3D" parent="CameraSmooth" unique_id=544372058] transform = Transform3D(1, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000001, 0, 0, 0) current = true @@ -702,8 +702,6 @@ fade_out = 0.5547845 shakerPreset = SubResource("Resource_se3kf") metadata/_custom_type_script = "uid://dnlxsrumw6ygp" -[node name="CameraAnchor" type="Marker3D" parent="." unique_id=1554357312] - [node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1831491746] root_node = NodePath("../CameraSmooth/Camera3D") libraries/ = SubResource("AnimationLibrary_0hyrq") diff --git a/scenes/player_controller/resources/forge_empowered_action.tres b/scenes/player_controller/resources/forge_empowered_action.tres index 4918b929..c54aa6c3 100644 --- a/scenes/player_controller/resources/forge_empowered_action.tres +++ b/scenes/player_controller/resources/forge_empowered_action.tres @@ -4,7 +4,7 @@ [resource] script = ExtResource("1_1rxoq") -Cost = 50.0 -Cooldown = 1.0 +Cost = 30.0 +Cooldown = 0.5 ManaRegenPause = 2.0 metadata/_custom_type_script = "uid://d0l07gcx1ef18" diff --git a/tests/player/HeadSystemUnitTest.cs b/tests/player/HeadSystemUnitTest.cs index 07d06790..ae25b728 100644 --- a/tests/player/HeadSystemUnitTest.cs +++ b/tests/player/HeadSystemUnitTest.cs @@ -14,17 +14,20 @@ public class HeadSystemUnitTest public void SetupTest() { _head = new HeadSystem(); - _head._camera = new Camera3D(); - _head.AddChild(_head._camera); + _head.Camera = new Camera3D(); + _head.AddChild(_head.Camera); - _head._cameraAnchor = new Marker3D(); - _head.AddChild(_head._cameraAnchor); + // _head._cameraAnchor = new Marker3D(); + _head.AddChild(_head.CameraAnchor); - _head._fpRig = new Node3D(); - _head.AddChild(_head._fpRig); - - _head._fpDisplacedRig = new Node3D(); - _head.AddChild(_head._fpDisplacedRig); + _head.FpRig = new Node3D(); + _head.AddChild(_head.FpRig); + _head.CameraAnchor = new Node3D(); + _head.AddChild(_head.CameraAnchor); + _head.RightHandedWeapon = new Node3D(); + _head.AddChild(_head.RightHandedWeapon); + _head.LeftHandedWeapon = new Node3D(); + _head.AddChild(_head.LeftHandedWeapon); } [AfterTest]