Fix enemy attacks

This commit is contained in:
2024-09-16 22:14:46 -07:00
parent dac4e26662
commit 993ec2bf1b
8 changed files with 111 additions and 25 deletions

View File

@@ -61,6 +61,8 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
[Node] public AnimationTree AnimationTree { get; set; } = default!;
[Node] public IHitbox Hitbox { get; set; } = default!;
private const string IDLE_FORWARD = "idle_front_walk";
private const string IDLE_LEFT = "idle_left_walk";
private const string IDLE_BACK = "idle_back_walk";
@@ -73,9 +75,16 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
EnemyLogic.Set(EnemyStatResource);
EnemyLogic.Set(this as IEnemy);
EnemyLogic.Set(GameRepo);
AnimationTree.AnimationFinished += AnimationTree_AnimationFinished;
AnimationTree.Get("parameters/playback").As<AnimationNodeStateMachinePlayback>().Start(IDLE_FORWARD);
}
private void AnimationTree_AnimationFinished(StringName animName)
{
if (animName == "attack")
AnimationTree.Get("parameters/playback").As<AnimationNodeStateMachinePlayback>().Travel(IDLE_FORWARD);
}
private void DeathAnimationPlayer_AnimationFinished(StringName animName)
{
GameEventDepot.OnEnemyDefeated(GlobalPosition, EnemyStatResource);
@@ -88,6 +97,27 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
CollisionDetector = CollisionDetectorScene.Instantiate<Area3D>();
CollisionDetector.AreaEntered += OnPlayerHitboxEntered;
AddChild(CollisionDetector);
Hitbox.AreaEntered += Hitbox_AreaEntered;
}
private void Hitbox_AreaEntered(Area3D area)
{
if (area.GetParent().GetParent() is IPlayer player)
{
var isCriticalHit = false;
var rng = new RandomNumberGenerator();
rng.Randomize();
var roll = rng.Randf();
if (roll <= EnemyStatResource.Luck)
isCriticalHit = true;
var damage = DamageCalculator.CalculateEnemyDamage(
GameRepo.PlayerData.CurrentDefense.Value + GameRepo.PlayerData.BonusDefense,
EnemyStatResource,
GameRepo.PlayerData.Inventory.EquippedArmor.Value.ArmorStats,
isCriticalHit);
GameRepo.PlayerData.SetCurrentHP(GameRepo.PlayerData.CurrentHP.Value - Mathf.RoundToInt(damage));
GD.Print($"Player hit for {Mathf.Abs(damage)} damage.");
}
}
public void OnResolved()
@@ -190,7 +220,9 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
var rng = new RandomNumberGenerator();
rng.Randomize();
EnemyLogic.Input(new EnemyLogic.Input.AttackTimer());
AttackTimer.WaitTime = rng.RandfRange(2f, 3.0f);
AttackTimer.Stop();
AttackTimer.WaitTime = rng.RandfRange(3f, 7.0f);
AttackTimer.Start();
}
private void LineOfSight_BodyEntered(Node3D body)