diff --git a/Characters/Character.cs b/Characters/Character.cs index 357ee7b..7a067ea 100644 --- a/Characters/Character.cs +++ b/Characters/Character.cs @@ -27,7 +27,7 @@ public partial class Character : CharacterBody2D, IFaction } [Export] - public CharacterStats Stats { get; private set; } + public CharacterStats Stats { get; protected set; } [Signal] public delegate void HealthChangedEventHandler(Events.HealthChangedArgs args); @@ -115,7 +115,7 @@ public partial class Character : CharacterBody2D, IFaction if (Stats is not null) { - Stats.Stagger += (double time) => + Stats.Stagger += (double time, float staggerDamage) => { Stun(time); }; diff --git a/Characters/Player.cs b/Characters/Player.cs index 91a2150..cc1d21e 100644 --- a/Characters/Player.cs +++ b/Characters/Player.cs @@ -42,7 +42,6 @@ public sealed partial class Player : Character [Export] public AnimationTree AnimationTree { get; private set; } - [Export] public new PlayerStats Stats { get; private set; } public InteractionRay InteractionRay { get; private set; } @@ -54,8 +53,10 @@ public sealed partial class Player : Character _characterEffects = GetNode("%CharacterEffects"); _targetTracer = GetNode("%TargetTracer"); + base.Stats = GetNode("Stats"); + Stats = (PlayerStats)base.Stats; + base._Ready(); - Stats = GetNode("Stats"); Inventory.UsedItem += (Items.Item item) => { diff --git a/Items/Weapons/IParryable.cs b/Items/Weapons/IParryable.cs index 4d77ee9..3bf5e3d 100644 --- a/Items/Weapons/IParryable.cs +++ b/Items/Weapons/IParryable.cs @@ -10,5 +10,7 @@ public interface IParryable public ulong ParryTimeOrigin { get; } - public void Stun(); + public float BlockForce { get; } + + public void Stun(float blockForce); } diff --git a/Items/Weapons/Sword.cs b/Items/Weapons/Sword.cs index e768302..5f05551 100644 --- a/Items/Weapons/Sword.cs +++ b/Items/Weapons/Sword.cs @@ -62,6 +62,9 @@ public partial class Sword : Weapon, IParryable public ulong ParryTimeOrigin { get; protected set; } + [Export] + public float BlockForce { get; set; } = 1; + private Tween _currentTween; private AnimationNodeStateMachinePlayback _playback; @@ -214,7 +217,7 @@ public partial class Sword : Weapon, IParryable { // our character was parried ParryParticles.CloneOnWorld().EmitOneShot(); - Stun(); + Stun(otherParryable.BlockForce); if (otherParryable is Sword sword) { @@ -235,12 +238,13 @@ public partial class Sword : Weapon, IParryable /// Stuns the wepaon holder. This is unique to swords and melee weapons /// if they can parry. /// - public void Stun() + public void Stun(float blockForce) { IsParried = true; - AnimationPlayer.SpeedScale = 0.25f; - Character.Stun(2); - GetNode("ParrySound") + Character.Stats.AddStaggerDamage(Damage * blockForce); + + // optionally play parry sound + GetNode("ParrySound")? .OnWorld() .WithPitchDeviation(0.125f) .PlayOneShot(); diff --git a/State/Weapon/SwordBlockState.cs b/State/Weapon/SwordBlockState.cs index 4f01ef7..0f9eab0 100644 --- a/State/Weapon/SwordBlockState.cs +++ b/State/Weapon/SwordBlockState.cs @@ -25,9 +25,13 @@ public partial class SwordBlockState : WeaponState private bool _isAlternate = false; + private float _oldBlockForce; + public override WeaponState Enter(IState prevState) { Sword.EnableParry(ulong.MaxValue); + _oldBlockForce = Sword.BlockForce; + Sword.BlockForce *= 4; _useDuration = Sword.UseAltTime; _attackDuration = Sword.AttackAltTime; @@ -55,6 +59,12 @@ public partial class SwordBlockState : WeaponState public override void Exit(IState nextState) { + if (nextState == IdleState) + { + Sword.AnimationPlayer.Play("RESET"); + } + + Sword.BlockForce = _oldBlockForce; Deattack(); HasBlocked = false; } @@ -71,7 +81,6 @@ public partial class SwordBlockState : WeaponState if ((_useDuration -= delta) <= 0) { - Sword.AnimationPlayer.Play("RESET"); return IdleState; } diff --git a/UI/PostProcessing/StunEffect.cs b/UI/PostProcessing/StunEffect.cs index 6fbef8a..be35d75 100644 --- a/UI/PostProcessing/StunEffect.cs +++ b/UI/PostProcessing/StunEffect.cs @@ -8,7 +8,6 @@ public partial class StunEffect : ColorRect { Events.EventBus.Instance.PlayerStun += () => { - GD.Print("PLAYER STUNNED!!!"); GetNode("AnimationPlayer").Play("tighten"); }; } diff --git a/Utils/CharacterStats.cs b/Utils/CharacterStats.cs index 3e2c4c2..3cc30e0 100644 --- a/Utils/CharacterStats.cs +++ b/Utils/CharacterStats.cs @@ -16,7 +16,7 @@ public partial class CharacterStats : Node public double MaxStagger { get; set; } = 25; [Signal] - public delegate void StaggerEventHandler(double time); + public delegate void StaggerEventHandler(double time, float damage); public bool ShouldStagger => StaggerDamage.Value >= MaxStagger; @@ -42,10 +42,12 @@ public partial class CharacterStats : Node public void AddStaggerDamage(float damage) { - StaggerDamage.Value += damage * StaggerCoefficient; + float delta = damage * (float)StaggerCoefficient; + StaggerDamage.Value += delta; if (StaggerDamage.Value >= MaxStagger) { - EmitSignal(SignalName.Stagger, 1); + EmitSignal(SignalName.Stagger, 1, delta); + StaggerDamage.Value = 0; } else {