37 lines
1.3 KiB
C#
37 lines
1.3 KiB
C#
using Godot;
|
|
|
|
namespace Mr.BrickAdventures.scripts.components;
|
|
|
|
[GlobalClass]
|
|
public partial class WallJumpAbility : MovementAbility
|
|
{
|
|
[ExportGroup("Wall Jump Design")]
|
|
[Export] public Vector2 WallJumpVelocity { get; set; } = new(500.0f, -350.0f);
|
|
|
|
[ExportGroup("Wall Slide Feel")]
|
|
[Export(PropertyHint.Range, "0.0, 1.0, 0.05")] public float WallSlideGravityMultiplier { get; set; } = 0.7f;
|
|
[Export] public float MaxWallSlideSpeed { get; set; } = 150.0f;
|
|
|
|
public override Vector2 ProcessMovement(Vector2 velocity, double delta)
|
|
{
|
|
var isOnWall = _body.IsOnWall();
|
|
|
|
if (isOnWall && !_body.IsOnFloor() && velocity.Y > 0f)
|
|
{
|
|
var gravity = (float)ProjectSettings.GetSetting("physics/2d/default_gravity");
|
|
var newYVelocity = velocity.Y + gravity * WallSlideGravityMultiplier * (float)delta;
|
|
|
|
velocity.Y = Mathf.Min(newYVelocity, MaxWallSlideSpeed);
|
|
}
|
|
|
|
if (isOnWall && _input.JumpHeld)
|
|
{
|
|
var wallNormal = _body.GetWallNormal();
|
|
|
|
_controller.EmitSignal(PlayerController.SignalName.JumpInitiated);
|
|
velocity = new Vector2(wallNormal.X * WallJumpVelocity.X, WallJumpVelocity.Y);
|
|
}
|
|
|
|
return velocity;
|
|
}
|
|
} |