Demon wall implementation (attack data, takes damage, dies, etc) but mostly placeholders

This commit is contained in:
2025-03-25 00:09:33 -07:00
parent f69c6b94a1
commit 84c4d1b9ce
40 changed files with 20732 additions and 625 deletions

View File

@@ -52,6 +52,8 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
private Vector3 _knockbackDirection = Vector3.Zero;
private IDamageCalculator _damageCalculator;
#region Godot methods
public void Setup()
{
@@ -59,6 +61,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
_enemyLogic.Set(_enemyStatResource);
_enemyLogic.Set(this as IEnemy);
_enemyLogic.Set(_player);
_damageCalculator = new DamageCalculator();
}
public void OnResolved()
@@ -118,12 +121,13 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
{
if (CurrentHP.Value > 0)
{
if (!ignoreElementalResistance)
damage = CalculateElementalResistance(damage, elementType);
if (!ignoreDefense)
damage = CalculateDefenseResistance(damage);
if (isCriticalHit)
damage *= 2;
_damageCalculator.CalculateDamage(damage,
elementType,
_player.Stats.CurrentDefense.Value + _player.Stats.BonusDefense.Value,
_enemyStatResource.ElementalResistance,
isCriticalHit,
ignoreDefense,
ignoreElementalResistance);
GD.Print($"Enemy Hit for {damage} damage.");
CurrentHP.OnNext(CurrentHP.Value - damage);
GD.Print("Current HP: " + CurrentHP.Value);
@@ -151,7 +155,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
_enemyLogic.Input(new EnemyLogic.Input.EnemyDefeated());
_collisionShape.SetDeferred("disabled", true);
_enemyModelView.PlayDeathAnimation();
var tweener = GetTree().CreateTween();
var tweener = CreateTween();
tweener.TweenInterval(1.0f);
tweener.TweenCallback(Callable.From(QueueFree));
Game.EnemyDefeated(GlobalPosition, _enemyStatResource);
@@ -238,22 +242,6 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
Die();
}
private double CalculateElementalResistance(double incomingDamage, ElementType incomingElementType)
{
if (incomingElementType == ElementType.Aeolic)
return Mathf.Max(incomingDamage - (incomingDamage * _enemyStatResource.AeolicResistance), 0.0);
if (incomingElementType == ElementType.Hydric)
return Mathf.Max(incomingDamage - (incomingDamage * _enemyStatResource.HydricResistance), 0.0);
if (incomingElementType == ElementType.Igneous)
return Mathf.Max(incomingDamage - (incomingDamage * _enemyStatResource.IgneousResistance), 0.0);
if (incomingElementType == ElementType.Ferrum)
return Mathf.Max(incomingDamage - (incomingDamage * _enemyStatResource.FerrumResistance), 0.0);
if (incomingElementType == ElementType.Telluric)
return Mathf.Max(incomingDamage - (incomingDamage * _enemyStatResource.TelluricResistance), 0.0);
return Mathf.Max(incomingDamage, 0.0);
}
private double CalculateDefenseResistance(double incomingDamage)
{
return Mathf.Max(incomingDamage - _enemyStatResource.CurrentDefense, 0.0);