diff --git a/scenes/player_controller/PlayerController.tscn b/scenes/player_controller/PlayerController.tscn index 790e8667..1b085c49 100644 --- a/scenes/player_controller/PlayerController.tscn +++ b/scenes/player_controller/PlayerController.tscn @@ -160,7 +160,7 @@ WallHugHorizontalDeceleration = 1.0 WallRunUpwardVelocityFactor = 0.5 MinimumWallRunUpwardSpeed = 4.0 WallRunAltitudeLossSpeed = 8.0 -WallRunSpeedThreshold = 2.0 +WallRunSpeedThreshold = 1.0 [node name="CHealth" parent="." unique_id=1244478698 instance=ExtResource("3_q7bng")] RHealth = ExtResource("4_m8gvy") @@ -1120,7 +1120,7 @@ delay_in_seconds = "0.0" [node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall" unique_id=342055859] script = ExtResource("28_n7qhm") to = NodePath("../../Jump/SimpleJump") -event = &"jump" +event = &"wall_jump" delay_in_seconds = "0.0" [node name="OnDash" type="Node" parent="StateChart/Root/Movement/OnWall" unique_id=43147957] diff --git a/scenes/player_controller/scripts/PlayerController.cs b/scenes/player_controller/scripts/PlayerController.cs index 1ae5c800..7be5fc99 100644 --- a/scenes/player_controller/scripts/PlayerController.cs +++ b/scenes/player_controller/scripts/PlayerController.cs @@ -245,7 +245,7 @@ public partial class PlayerController : CharacterBody3D, public float MinimumWallRunHorizontalSpeed { get; set; } = 12f; [Export(PropertyHint.Range, "1,20,0.1,or_greater")] public float WallRunAltitudeLossSpeed { get; set; } = 10f; - [Export(PropertyHint.Range, "1,20,0.1,or_greater")] + [Export(PropertyHint.Range, "0,20,0.1,or_greater")] public float WallRunSpeedThreshold { get; set; } = 8f; /////////////////////////// @@ -1192,11 +1192,15 @@ public partial class PlayerController : CharacterBody3D, // return; var newWallNormal = WallHugSystem.WallHugNormal.UnwrapOr(Vector3.Up); - if (newWallNormal.AngleTo(_wallHugStartNormal) > Mathf.Pi/4) return; + // if (newWallNormal.AngleTo(_wallHugStartNormal) > Mathf.Pi/4) return; _wallHugStartNormal = newWallNormal; } + + + private float _timeOnWall; public void OnWallStarted() { + _timeOnWall = 0f; if (_simpleDashCooldownTimer.IsStopped()) _canDash = true; else @@ -1212,6 +1216,7 @@ public partial class PlayerController : CharacterBody3D, } public void OnWallStopped() { + _timeOnWall = 0f; } public void OnLeaveWallFromRun() { @@ -1221,8 +1226,12 @@ public partial class PlayerController : CharacterBody3D, { // _canDash = true; // _canDashAirborne = true; + _timeOnWall += delta; - WallHug(delta); + if (IsInputTowardsWall(_wallHugStartNormal)) + WallHug(delta); + else + MoveInAir(delta, IsGroundLike()); // if (ShouldStartWallRun()) // { // _playerState.SendEvent("wall_run"); @@ -1230,7 +1239,7 @@ public partial class PlayerController : CharacterBody3D, // } if (isOnFloorCustom()) _playerState.SendEvent("grounded"); - if (!WallHugSystem.IsWallHugging() || !IsInputTowardsWall(_wallHugStartNormal)) + if (!WallHugSystem.IsWallHugging()) _playerState.SendEvent("start_falling"); } public void HandleWallHanging(float delta) @@ -1252,6 +1261,7 @@ public partial class PlayerController : CharacterBody3D, { // _canDash = false; // _canDashAirborne = false; + _timeOnWall += delta; // Find horizontal velocity projected on the current wall var hvel = new Vector3(Velocity.X, 0, Velocity.Z); @@ -1286,6 +1296,7 @@ public partial class PlayerController : CharacterBody3D, public bool ShouldStartWallRun() { + GD.Print(_wallHugStartNormal); if (_wallHugStartNormal.Length() < Mathf.Epsilon) { // GD.Print("No wall normal"); @@ -1302,7 +1313,13 @@ public partial class PlayerController : CharacterBody3D, var isThereInput = GetMoveInput().Length() > Mathf.Epsilon; if (!isThereInput) { - // GD.Print("Not a wall"); + // GD.Print("No input"); + return false; + } + + if (!IsInputForwardOrTowardsWall()) + { + // GD.Print("Input isn't forward or towards wall"); return false; } @@ -1322,14 +1339,14 @@ public partial class PlayerController : CharacterBody3D, return false; } - var isCoplanarEnough = Math.Abs(Velocity.Normalized().Dot(_wallHugStartNormal)) < 0.5; + var isCoplanarEnough = Math.Abs(Velocity.Normalized().Dot(_wallHugStartNormal)) < 0.9; if (!isCoplanarEnough) { // GD.Print("Not coplanar enough"); return false; } - var isGoingDownwards = Velocity.Normalized().Dot(Vector3.Down) > 0.5; + var isGoingDownwards = Velocity.Normalized().Dot(Vector3.Down) > 0.7; if (isGoingDownwards) { // GD.Print("Going down"); @@ -1345,14 +1362,18 @@ public partial class PlayerController : CharacterBody3D, return true; } + + public bool IsInputForwardOrTowardsWall() + { + return GetInputLocalHDirection().Z < -0.2f || IsInputTowardsWall(_wallHugStartNormal); + } public bool CanKeepWallRun() { var isThereInput = GetMoveInput().Length() > Mathf.Epsilon; if (!isThereInput) return false; - var isInputForward = GetInputLocalHDirection().Z < 0; - if (!isInputForward) return false; + if (!IsInputForwardOrTowardsWall()) return false; var haveEnoughSpeed = Velocity.Length() > WallRunSpeedThreshold; if (!haveEnoughSpeed) return false; @@ -1370,6 +1391,7 @@ public partial class PlayerController : CharacterBody3D, } public void WallHang(float delta) { + _timeOnWall += 1; // Consider we've already spent quite some time on wall Velocity = Vector3.Zero; GlobalPosition = _wallHugStartLocation; } @@ -1416,11 +1438,20 @@ public partial class PlayerController : CharacterBody3D, _playerState.SendEvent("mantle"); return; } + - if (WallHugSystem.IsWallHugging()) + if (_onWallRunning.Active || _onWallHanging.Active) // Always allow jumping out of wall run and hang { _playerState.SendEvent("wall_jump"); + return; } + if (_onWallHugging.Active && _isWallJumpAvailable) // Limit number of jumps doable when hugging + { + _playerState.SendEvent("wall_jump"); + return; + } + + // Regular jump _playerState.SendEvent("jump"); } @@ -1516,13 +1547,22 @@ public partial class PlayerController : CharacterBody3D, SetHorizontalVelocity(currentHorizontalVelocity + wallJumpHorizontalVelocity); } + + public bool IsOnWallForLongEnough() + { + return _timeOnWall >= 0.1f; + } + public void OnJumpFromWall() { - if (!IsFacingWall() || (!_isWallJumpAvailable && IsFacingWall())) - { + // if (!IsFacingWall() || (!_isWallJumpAvailable && IsFacingWall())) + // { + // ComputeJumpFromWallHSpeed(WallJumpStartVelocity); + // } + if (IsOnWallForLongEnough() || _onWallRunning.Active) ComputeJumpFromWallHSpeed(WallJumpStartVelocity); - } + // OnJumpStarted(DoubleJumpStartVelocity); // Remove the ability to dash straight away so you cannot scale up the wall // _canDashAirborne = false; _airborneDashCooldownTimer.Start();