diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 88a30479..b5814ab4 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -66,6 +66,7 @@ AccelerationAir = 2.0 DecelerationAir = 0.1 Weight = 5.0 MantleTime = 0.3 +CoyoteTime = 0.3 SimpleJumpStartVelocity = 8.0 SimpleJumpHangTimeInFrames = 1 SimpleJumpGravityLesseningFactor = 2.5 @@ -85,7 +86,7 @@ WallHugGravityLesseningFactor = 15.0 WallHugDownwardMaxSpeed = 8.0 WallHugHorizontalDeceleration = 0.5 WallRunAltitudeLossSpeed = 12.0 -WallRunSpeedThreshold = 5.0 +WallRunSpeedThreshold = 10.0 [node name="WallRunSnapper" type="RayCast3D" parent="."] unique_name_in_owner = true @@ -247,7 +248,6 @@ offset_left = 1524.0 offset_top = 1.0 offset_right = -8.0 offset_bottom = 1.0 -enabled = false initial_node_to_watch = NodePath("../StateChart") [node name="UI" type="Control" parent="."] @@ -604,13 +604,13 @@ default_state = NodePath("../CoyoteEnabled") [node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne"] script = ExtResource("28_n7qhm") -to = NodePath("../../OnWall/Hugging") +to = NodePath("../../OnWall/HuggingCoyoteEnabled") event = &"wall_hug" delay_in_seconds = "0.0" [node name="OnWallRun" type="Node" parent="StateChart/Root/Movement/Airborne"] script = ExtResource("28_n7qhm") -to = NodePath("../../OnWall/Running") +to = NodePath("../../OnWall/RunningCoyoteEnabled") event = &"wall_run" delay_in_seconds = "0.0" @@ -687,12 +687,6 @@ to = NodePath("../../Grounded") event = &"grounded" delay_in_seconds = "0.0" -[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall"] -script = ExtResource("28_n7qhm") -to = NodePath("../../Jump/SimpleJump") -event = &"jump" -delay_in_seconds = "0.0" - [node name="OnMegajump" type="Node" parent="StateChart/Root/Movement/OnWall"] script = ExtResource("28_n7qhm") to = NodePath("../../Jump/MegaJump") @@ -705,15 +699,51 @@ to = NodePath("../../Airborne/Reset") event = &"start_falling" delay_in_seconds = "0.0" +[node name="HuggingCoyoteEnabled" type="Node" parent="StateChart/Root/Movement/OnWall"] +script = ExtResource("27_34snm") + +[node name="OnExpiration" type="Node" parent="StateChart/Root/Movement/OnWall/HuggingCoyoteEnabled"] +script = ExtResource("28_n7qhm") +to = NodePath("../../Hugging") +event = &"coyote_expired" +delay_in_seconds = "0.0" + [node name="Hugging" type="Node" parent="StateChart/Root/Movement/OnWall"] script = ExtResource("27_34snm") +[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hugging"] +script = ExtResource("28_n7qhm") +to = NodePath("../../../Jump/SimpleJump") +event = &"jump" +delay_in_seconds = "0.0" + [node name="Hanging" type="Node" parent="StateChart/Root/Movement/OnWall"] script = ExtResource("27_34snm") +[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hanging"] +script = ExtResource("28_n7qhm") +to = NodePath("../../../Jump/SimpleJump") +event = &"jump" +delay_in_seconds = "0.0" + +[node name="RunningCoyoteEnabled" type="Node" parent="StateChart/Root/Movement/OnWall"] +script = ExtResource("27_34snm") + +[node name="OnExpiration" type="Node" parent="StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"] +script = ExtResource("28_n7qhm") +to = NodePath("../../Running") +event = &"coyote_expired" +delay_in_seconds = "0.0" + [node name="Running" type="Node" parent="StateChart/Root/Movement/OnWall"] script = ExtResource("27_34snm") +[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Running"] +script = ExtResource("28_n7qhm") +to = NodePath("../../../Jump/SimpleJump") +event = &"jump" +delay_in_seconds = "0.0" + [connection signal="input_aim_canceled" from="InputController" to="." method="OnInputAimCanceled"] [connection signal="input_aim_down" from="InputController" to="." method="OnInputAimDown"] [connection signal="input_aim_pressed" from="InputController" to="." method="OnInputAimPressed"] diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index b4df176f..1ae5d315 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -25,7 +25,6 @@ public partial class PlayerController : CharacterBody3D public MantleSystem MantleSystem; public DashSystem DashSystem; public CapsuleCollider CapsuleCollider; - public TweenQueueSystem TweenQueueSystem; public Node3D WeaponRoot; public WeaponSystem WeaponSystem; public WallHugSystem WallHugSystem; @@ -205,10 +204,14 @@ public partial class PlayerController : CharacterBody3D private StateChartState _aimedDash; private StateChartState _onWall; private StateChartState _onWallHugging; + private StateChartState _onWallHuggingCoyoteEnabled; private StateChartState _onWallHanging; private StateChartState _onWallRunning; + private StateChartState _onWallRunningCoyoteEnabled; - private Transition _onJumpFromWall; + private Transition _onJumpFromWall1; + private Transition _onJumpFromWall2; + private Transition _onJumpFromWall3; private Transition _onMegajumpFromWall; private float _playerHeight; @@ -228,7 +231,6 @@ public partial class PlayerController : CharacterBody3D /////////////////////////// // General use stuff - TweenQueueSystem = GetNode("TweenQueueSystem"); PlayerUi = GetNode("UI"); // DashIndicator = GetNode("%DashIndicator"); PowerCooldownIndicator = GetNode("%DashCooldownIndicator"); @@ -290,12 +292,16 @@ public partial class PlayerController : CharacterBody3D _simpleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/SimpleJump")); _doubleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/DoubleJump")); _megaJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/MegaJump")); - _onJumpFromWall = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/OnJump")); + _onJumpFromWall1 = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Hugging/OnJump")); + _onJumpFromWall2 = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging/OnJump")); + _onJumpFromWall3 = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Running/OnJump")); _onMegajumpFromWall = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/OnMegajump")); _onWall = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall")); + _onWallHuggingCoyoteEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/HuggingCoyoteEnabled")); _onWallHugging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hugging")); _onWallHanging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging")); _onWallRunning = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Running")); + _onWallRunningCoyoteEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled")); // State timers _powerCooldownTimer = GetNode("PowerCooldown"); _timeScaleAimInAirTimer = GetNode("TimeScaleAimInAir"); @@ -304,9 +310,6 @@ public partial class PlayerController : CharacterBody3D /////////////////////////// // Initialize components // /////////////////////////// - - // General use stuff - TweenQueueSystem.Init(this); // Camera stuff HeadSystem.Init(); @@ -318,7 +321,7 @@ public partial class PlayerController : CharacterBody3D _gravity = (float)ProjectSettings.GetSetting("physics/3d/default_gravity"); MantleSystem.Init(); StairsSystem.Init(stairsBelowRayCast3D, stairsAheadRayCast3D, cameraSmooth); - DashSystem.Init(HeadSystem, camera, TweenQueueSystem); + DashSystem.Init(HeadSystem, camera); WeaponSystem.Init(HeadSystem, camera); WallHugSystem.Init(); @@ -373,11 +376,17 @@ public partial class PlayerController : CharacterBody3D _onWall.StateEntered += OnWallStarted; _onWall.StateExited += OnWallStopped; + _onWallHuggingCoyoteEnabled.StateEntered += OnWallHuggingStarted; + _onWallHuggingCoyoteEnabled.StatePhysicsProcessing += HandleWallHugging; _onWallHugging.StatePhysicsProcessing += HandleWallHugging; _onWallHanging.StatePhysicsProcessing += HandleWallHanging; + _onWallRunningCoyoteEnabled.StateEntered += OnWallRunningStarted; + _onWallRunningCoyoteEnabled.StatePhysicsProcessing += HandleWallRunning; _onWallRunning.StatePhysicsProcessing += HandleWallRunning; - _onJumpFromWall.Taken += OnJumpFromWall; + _onJumpFromWall1.Taken += OnJumpFromWall; + _onJumpFromWall2.Taken += OnJumpFromWall; + _onJumpFromWall3.Taken += OnJumpFromWall; _onMegajumpFromWall.Taken += OnMegajumpFromWall; } @@ -470,7 +479,16 @@ public partial class PlayerController : CharacterBody3D // If all else fail and we go down, we hug if (Velocity.Y < 0 && !_coyoteEnabled.Active) _playerState.SendEvent("wall_hug"); - + } + + public void OnWallHuggingStarted() + { + GetTree().CreateTimer(CoyoteTime).Timeout += CoyoteExpired; + } + + public void OnWallRunningStarted() + { + GetTree().CreateTimer(CoyoteTime).Timeout += CoyoteExpired; } private Vector3 _wallHugStartLocation = Vector3.Zero; @@ -1111,7 +1129,7 @@ public partial class PlayerController : CharacterBody3D Vector2 inputLookDir = new Vector2(_inputRotateY, _inputRotateFloorplane); var lookSensitivity = _isUsingGamepad ? _lookSensitivityMultiplier : _mouseSensitivityMultiplier; - var wallHugContactPoint = _onWallRunning.Active ? _currentWallContactPoint : Vector3.Zero; + var wallHugContactPoint = _onWallRunning.Active || _onWallRunningCoyoteEnabled.Active ? _currentWallContactPoint : Vector3.Zero; var playerVelocity = GetGlobalMoveInput(); HeadSystem.LookAround(delta, inputLookDir, playerVelocity, wallHugContactPoint, lookSensitivity); } @@ -1191,7 +1209,7 @@ public partial class PlayerController : CharacterBody3D Bobbing.CameraBobbingParams cameraBobbingParams = new Bobbing.CameraBobbingParams { Delta = delta, - IsOnFloorCustom = isOnFloorCustom() || _onWallRunning.Active, + IsOnFloorCustom = isOnFloorCustom() || _onWallRunning.Active || _onWallRunningCoyoteEnabled.Active, Velocity = Velocity, SettingsMultiplier = _headBobbingMultiplier }; diff --git a/systems/dash/DashSystem.cs b/systems/dash/DashSystem.cs index 7adca0dc..a22e6ab4 100644 --- a/systems/dash/DashSystem.cs +++ b/systems/dash/DashSystem.cs @@ -25,7 +25,6 @@ public partial class DashSystem: Node3D private ShapeCast3D _dashCast3D; private ShapeCast3D _playerCast3D; private Camera3D _camera; - private TweenQueueSystem _tweenQueueSystem; private Vector3 _dashDirection = Vector3.Zero; private ShapeCast3D _dashCastDrop; @@ -54,7 +53,7 @@ public partial class DashSystem: Node3D public float DashCastRadius { get; set; } - public void Init(Node3D head, Camera3D camera, TweenQueueSystem tweenQueueSystem) + public void Init(Node3D head, Camera3D camera) { _dashCast3D = GetNode("DashCast3D"); var dashShape = _dashCast3D.GetShape() as SphereShape3D; @@ -73,7 +72,6 @@ public partial class DashSystem: Node3D _head = head; _camera = camera; - _tweenQueueSystem = tweenQueueSystem; _mantleSystem = GetNode("MantleSystem"); _mantleSystem.Init(); diff --git a/systems/inputs/input_system.gd b/systems/inputs/input_system.gd index 529c250f..1c316c2a 100644 --- a/systems/inputs/input_system.gd +++ b/systems/inputs/input_system.gd @@ -82,7 +82,6 @@ func on_input_hit(): input_hit.emit() func on_input_jump_started(): - print("jump") input_jump_started.emit() func on_input_jump_ongoing():