gd: made wall jump more intuitive and act like a double jump
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 17s
Create tag and build when new code gets to main / Export (push) Failing after 1s

This commit is contained in:
2025-07-04 14:15:09 +02:00
parent cf98e6c36c
commit 767d0fc768
6 changed files with 50 additions and 20 deletions

View File

@ -199,6 +199,15 @@ script = ExtResource("26_infe6")
initial_state = NodePath("WeaponInHand")
metadata/_custom_type_script = "uid://c1vp0ojjvaby1"
[node name="AimCanceled" type="Node" parent="StateChart/Root/Actions"]
script = ExtResource("27_34snm")
[node name="ToWeaponInHand" type="Node" parent="StateChart/Root/Actions/AimCanceled"]
script = ExtResource("28_n7qhm")
to = NodePath("../../WeaponInHand")
event = &"aim_released"
delay_in_seconds = "0.0"
[node name="WeaponInHand" type="Node" parent="StateChart/Root/Actions"]
script = ExtResource("27_34snm")
@ -213,7 +222,7 @@ script = ExtResource("27_34snm")
[node name="ToWeaponInHand" type="Node" parent="StateChart/Root/Actions/Aiming"]
script = ExtResource("28_n7qhm")
to = NodePath("../../WeaponInHand")
to = NodePath("../../AimCanceled")
event = &"aim_canceled"
delay_in_seconds = "0.0"
@ -424,10 +433,10 @@ delay_in_seconds = "0.0"
[node name="JumpFromWall" type="Node" parent="StateChart/Root/Movement/Airborne"]
script = ExtResource("27_34snm")
[node name="ToDoubleJump" type="Node" parent="StateChart/Root/Movement/Airborne/JumpFromWall"]
[node name="JumpedFromWall" type="Node" parent="StateChart/Root/Movement/Airborne/JumpFromWall"]
script = ExtResource("28_n7qhm")
to = NodePath("../../DoubleJumpEnabled")
event = &"to_double_jump"
to = NodePath("../../Falling")
event = &"jump_from_wall"
delay_in_seconds = "0.0"
[node name="ToFalling" type="Node" parent="StateChart/Root/Movement/Airborne/JumpFromWall"]

View File

@ -12,6 +12,8 @@ public partial class Gravity: Node3D
public float DoubleJumpSpeedFactor { get; set; } = 2f;
[Export(PropertyHint.Range, "0.1,10,0.1,or_greater")]
public float JumpFromDashSpeedFactor { get; set; } = 2f;
[Export(PropertyHint.Range, "0.1,10,0.1,or_greater")]
public float JumpFromWallSpeedFactor { get; set; } = 2f;
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
public float AdditionalGravityPower { get; set; } = 1f;
@ -24,6 +26,7 @@ public partial class Gravity: Node3D
public float CalculateJumpForce() => _gravity * (StartVelocity / AdditionalGravityPower);
public float CalculateJumpFromDashForce() => CalculateJumpForce() * JumpFromDashSpeedFactor;
public float CalculateJumpFromWallForce() => CalculateJumpForce() * JumpFromWallSpeedFactor;
public float CalculateDoubleJumpForce() => CalculateJumpForce() * DoubleJumpSpeedFactor;
public float CalculateGravityForce() => _gravity * Weight;
}

View File

@ -55,6 +55,8 @@ public partial class PlayerController : CharacterBody3D
public int DashActionsLeft { get; set; }
private bool _isWallJumpAvailable = true;
private StateChart _playerState;
// Actions state
private StateChartState _weaponInHand;
@ -275,6 +277,7 @@ public partial class PlayerController : CharacterBody3D
public void OnGrounded()
{
DashActionsLeft = MaxNumberOfDashActions;
_isWallJumpAvailable = true;
}
public bool CanPerformDashAction()
@ -284,6 +287,7 @@ public partial class PlayerController : CharacterBody3D
public void PerformDashAction()
{
_isWallJumpAvailable = true;
_dashCooldownTimer.Start();
DashActionsLeft--;
}
@ -303,24 +307,30 @@ public partial class PlayerController : CharacterBody3D
{
_playerState.SendEvent("jump_from_dash");
PerformDashAction();
PerformJump(MoveSystem.JumpTypes.JUMP_FROM_DASH);
PerformJump(MoveSystem.JumpTypes.JumpFromDash);
return;
}
_playerState.SendEvent("to_double_jump");
PerformJump(MoveSystem.JumpTypes.SIMPLE_JUMP);
PerformJump(MoveSystem.JumpTypes.SimpleJump);
}
public void JumpFromWall()
{
if (!_isWallJumpAvailable)
return;
_isWallJumpAvailable = false;
var wallNormal = WallHugSystem.GetWallNormal().UnwrapOr(Vector3.Up);
var isLookingTowardsWall = HeadSystem.GetForwardHorizontalVector().Dot(wallNormal) > 0.7;
var jumpDirection = isLookingTowardsWall ? Vector3.Up : wallNormal;
if (_aiming.Active && CanPerformDashAction())
{
_playerState.SendEvent("jump_from_dash");
PerformDashAction();
PerformJump(MoveSystem.JumpTypes.JUMP_FROM_DASH, wallNormal);
PerformJump(MoveSystem.JumpTypes.JumpFromDash, jumpDirection);
return;
}
_playerState.SendEvent("to_double_jump");
PerformJump(MoveSystem.JumpTypes.SIMPLE_JUMP, wallNormal);
_playerState.SendEvent("jump_from_wall");
PerformJump(MoveSystem.JumpTypes.JumpFromWall, jumpDirection);
}
public void DoubleJump()
{
@ -328,10 +338,10 @@ public partial class PlayerController : CharacterBody3D
if (_aiming.Active && CanPerformDashAction())
{
PerformDashAction();
PerformJump(MoveSystem.JumpTypes.JUMP_FROM_DASH);
PerformJump(MoveSystem.JumpTypes.JumpFromDash);
return;
}
PerformJump(MoveSystem.JumpTypes.DOUBLE_JUMP);
PerformJump(MoveSystem.JumpTypes.DoubleJump);
}
private void PerformJump(MoveSystem.JumpTypes jumpType, Vector3? jumpDirection = null)
{
@ -341,8 +351,8 @@ public partial class PlayerController : CharacterBody3D
var proportionOfTimeGone = _timeAfterDashingTimer.TimeLeft / _timeAfterDashingTimer.WaitTime;
var actualBoost = 1 + MaxJumpBoostAfterDashing * proportionOfTimeGone;
var makeItDouble = actualBoost > 1;
if (makeItDouble && jumpType == MoveSystem.JumpTypes.SIMPLE_JUMP)
jumpType = MoveSystem.JumpTypes.DOUBLE_JUMP; // convert simple jump to double if done right after a dash
if (makeItDouble && jumpType == MoveSystem.JumpTypes.SimpleJump)
jumpType = MoveSystem.JumpTypes.DoubleJump; // convert simple jump to double if done right after a dash
_timeAfterDashingTimer.Stop();
bool doesCapsuleHaveCrouchingHeight = CapsuleCollider.IsCrouchingHeight();