added a small dash when leaving a wall run organically
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 18s
Create tag and build when new code gets to main / Export (push) Successful in 8m36s

This commit is contained in:
2025-12-21 17:23:38 +01:00
parent cf52af4237
commit b184bcdea5
2 changed files with 38 additions and 4 deletions

View File

@@ -762,6 +762,12 @@ to = NodePath("../../Running")
event = &"coyote_expired" event = &"coyote_expired"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="OnLeaveWall" type="Node" parent="StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"]
script = ExtResource("28_n7qhm")
to = NodePath("../../../Airborne/CoyoteEnabled")
event = &"start_falling"
delay_in_seconds = "0.0"
[node name="Running" type="Node" parent="StateChart/Root/Movement/OnWall"] [node name="Running" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
@@ -771,6 +777,12 @@ to = NodePath("../../../Jump/SimpleJump")
event = &"jump" event = &"jump"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="OnLeaveWall" type="Node" parent="StateChart/Root/Movement/OnWall/Running"]
script = ExtResource("28_n7qhm")
to = NodePath("../../../Airborne/CoyoteEnabled")
event = &"start_falling"
delay_in_seconds = "0.0"
[connection signal="input_aim_canceled" from="InputController" to="." method="OnInputAimCanceled"] [connection signal="input_aim_canceled" from="InputController" to="." method="OnInputAimCanceled"]
[connection signal="input_aim_down" from="InputController" to="." method="OnInputAimDown"] [connection signal="input_aim_down" from="InputController" to="." method="OnInputAimDown"]
[connection signal="input_aim_pressed" from="InputController" to="." method="OnInputAimPressed"] [connection signal="input_aim_pressed" from="InputController" to="." method="OnInputAimPressed"]

View File

@@ -225,6 +225,8 @@ public partial class PlayerController : CharacterBody3D
private Transition _onJumpFromWall2; private Transition _onJumpFromWall2;
private Transition _onJumpFromWall3; private Transition _onJumpFromWall3;
private Transition _onMegajumpFromWall; private Transition _onMegajumpFromWall;
private Transition _onLeaveWallFromRunCoyote;
private Transition _onLeaveWallFromRun;
private float _playerHeight; private float _playerHeight;
private float _playerRadius; private float _playerRadius;
@@ -319,6 +321,8 @@ public partial class PlayerController : CharacterBody3D
_onWallHanging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging")); _onWallHanging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging"));
_onWallRunning = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Running")); _onWallRunning = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Running"));
_onWallRunningCoyoteEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled")); _onWallRunningCoyoteEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"));
_onLeaveWallFromRun = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Running/OnLeaveWall"));
_onLeaveWallFromRunCoyote = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled/OnLeaveWall"));
// State timers // State timers
_powerCooldownTimer = GetNode<Timer>("PowerCooldown"); _powerCooldownTimer = GetNode<Timer>("PowerCooldown");
_timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir"); _timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir");
@@ -411,6 +415,8 @@ public partial class PlayerController : CharacterBody3D
_onJumpFromWall2.Taken += OnJumpFromWall; _onJumpFromWall2.Taken += OnJumpFromWall;
_onJumpFromWall3.Taken += OnJumpFromWall; _onJumpFromWall3.Taken += OnJumpFromWall;
_onMegajumpFromWall.Taken += OnMegajumpFromWall; _onMegajumpFromWall.Taken += OnMegajumpFromWall;
_onLeaveWallFromRun.Taken += OnLeaveWallFromRun;
_onLeaveWallFromRunCoyote.Taken += OnLeaveWallFromRun;
} }
public void SetAllowedInputsAll() public void SetAllowedInputsAll()
@@ -538,6 +544,7 @@ public partial class PlayerController : CharacterBody3D
return; return;
var newWallNormal = WallHugSystem.WallHugNormal.UnwrapOr(Vector3.Up); var newWallNormal = WallHugSystem.WallHugNormal.UnwrapOr(Vector3.Up);
if (newWallNormal.AngleTo(_wallHugStartNormal) > Mathf.Pi/4) return;
_wallHugStartNormal = newWallNormal; _wallHugStartNormal = newWallNormal;
} }
@@ -555,6 +562,11 @@ public partial class PlayerController : CharacterBody3D
public void OnWallStopped() public void OnWallStopped()
{ {
} }
public void OnLeaveWallFromRun()
{
SimpleDashInDirection(Velocity.Normalized());
}
public void HandleWallHugging(float delta) public void HandleWallHugging(float delta)
{ {
@@ -749,6 +761,7 @@ public partial class PlayerController : CharacterBody3D
private bool _customMantle; private bool _customMantle;
private Transform3D _customMantleStartTransform; private Transform3D _customMantleStartTransform;
private Curve3D _customMantleCurve; private Curve3D _customMantleCurve;
private Vector3 _mantleStartPosition;
public void OnMantleStarted() public void OnMantleStarted()
{ {
HeadSystem.OnMantle(); HeadSystem.OnMantle();
@@ -764,6 +777,7 @@ public partial class PlayerController : CharacterBody3D
var curve = _customMantle ? _customMantleCurve : MantleSystem.MantleCurve; var curve = _customMantle ? _customMantleCurve : MantleSystem.MantleCurve;
GetTree().GetRoot().AddChild(_mantlePath); GetTree().GetRoot().AddChild(_mantlePath);
_mantlePath.Setup(transform, curve); _mantlePath.Setup(transform, curve);
_mantleStartPosition = GlobalPosition;
var tween = GetTree().CreateTween(); var tween = GetTree().CreateTween();
tween.SetTrans(Tween.TransitionType.Linear); tween.SetTrans(Tween.TransitionType.Linear);
@@ -776,19 +790,27 @@ public partial class PlayerController : CharacterBody3D
{ {
GlobalPosition = _mantlePath.Target.GlobalPosition; GlobalPosition = _mantlePath.Target.GlobalPosition;
} }
public void SimpleDashInDirection(Vector3 direction)
{
SetVelocity(direction * SimpleDashStrength);
}
public void SimpleDash() public void SimpleDash()
{ {
SetVelocity(GetInputGlobalHDirection() * SimpleDashStrength); SimpleDashInDirection(GetInputGlobalHDirection());
} }
public void MantleFinished() public void MantleFinished()
{ {
_mantlePath.Teardown(); _mantlePath.Teardown();
var direction = GetMoveInput(); var isThereMovementInput = GetMoveInput().Length() > 0;
if (direction.Length() > 0) if (isThereMovementInput)
{ {
SimpleDash(); // If there's a movement input on Mantle, we dash in the direction the mantle took place
var positionDifference = GlobalPosition - _mantleStartPosition;
var directionHorizontal = new Vector3(positionDifference.X, 0, positionDifference.Z);
SimpleDashInDirection(directionHorizontal.Normalized());
} }
_customMantle = false; _customMantle = false;