From 767d0fc76863350f13f0b35d4f73f69669e471aa Mon Sep 17 00:00:00 2001 From: Minimata Date: Fri, 4 Jul 2025 14:15:09 +0200 Subject: [PATCH] gd: made wall jump more intuitive and act like a double jump --- player_controller/PlayerController.tscn | 17 ++++++++--- player_controller/Scripts/Gravity.cs | 3 ++ player_controller/Scripts/PlayerController.cs | 28 +++++++++++++------ systems/head/HeadSystem.cs | 5 ++++ systems/move/MoveSystem.cs | 16 +++++++---- systems/weapon/WeaponSystem.cs | 1 - 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 9e8e39f..55eb206 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -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"] diff --git a/player_controller/Scripts/Gravity.cs b/player_controller/Scripts/Gravity.cs index a0e529c..dce7150 100644 --- a/player_controller/Scripts/Gravity.cs +++ b/player_controller/Scripts/Gravity.cs @@ -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; } diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index ceb832b..8fd237f 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -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(); diff --git a/systems/head/HeadSystem.cs b/systems/head/HeadSystem.cs index c5c8a64..a0f199d 100644 --- a/systems/head/HeadSystem.cs +++ b/systems/head/HeadSystem.cs @@ -29,4 +29,9 @@ public partial class HeadSystem : Node3D _camera.Rotation = currentCameraRotation; } + + public Vector3 GetForwardHorizontalVector() + { + return GetGlobalTransform().Basis.Z; + } } \ No newline at end of file diff --git a/systems/move/MoveSystem.cs b/systems/move/MoveSystem.cs index cc83dfb..9fd0e0b 100644 --- a/systems/move/MoveSystem.cs +++ b/systems/move/MoveSystem.cs @@ -8,9 +8,10 @@ public partial class MoveSystem : Node3D { public enum JumpTypes { - SIMPLE_JUMP, - DOUBLE_JUMP, - JUMP_FROM_DASH + SimpleJump, + DoubleJump, + JumpFromDash, + JumpFromWall } public record MoveSystemParameters( @@ -196,15 +197,18 @@ public partial class MoveSystem : Node3D var jumpForce = 0.0f; switch (jumpType) { - case JumpTypes.DOUBLE_JUMP: + case JumpTypes.DoubleJump: jumpForce = _gravity.CalculateDoubleJumpForce(); break; - case JumpTypes.SIMPLE_JUMP: + case JumpTypes.SimpleJump: jumpForce = _gravity.CalculateJumpForce(); break; - case JumpTypes.JUMP_FROM_DASH: + case JumpTypes.JumpFromDash: jumpForce = _gravity.CalculateJumpFromDashForce(); break; + case JumpTypes.JumpFromWall: + jumpForce = _gravity.CalculateJumpFromWallForce(); + break; default: jumpForce = _gravity.CalculateJumpForce(); break; diff --git a/systems/weapon/WeaponSystem.cs b/systems/weapon/WeaponSystem.cs index 0678fba..9a995a0 100644 --- a/systems/weapon/WeaponSystem.cs +++ b/systems/weapon/WeaponSystem.cs @@ -74,7 +74,6 @@ public partial class WeaponSystem : RigidBody3D Freeze = true; GlobalPosition = PlantLocation; LookAt(GlobalTransform.Origin + PlantNormal, Vector3.Up, true); - GD.Print(GlobalRotation); } public void OnThrownWeaponReachesGround(Node other)