Refactor Enemy

This commit is contained in:
2025-02-06 01:58:36 -08:00
parent badc6d2375
commit 4e6c545e81
38 changed files with 581 additions and 589 deletions

View File

@@ -9,8 +9,6 @@ namespace GameJamDungeon
{
public interface IPlayer : ICharacterBody3D, IKillable
{
PlayerLogic PlayerLogic { get; }
public Vector3 GetGlobalInputVector();
public float GetLeftStrafeInputVector();
@@ -33,6 +31,13 @@ namespace GameJamDungeon
PlayerLogic IProvide<PlayerLogic>.Value() => PlayerLogic;
public PlayerLogic.Settings Settings { get; set; } = default!;
private PlayerLogic PlayerLogic { get; set; } = default!;
private PlayerLogic.IBinding PlayerBinding { get; set; } = default!;
#region Dependencies
[Dependency]
public IAppRepo AppRepo => this.DependOn<IAppRepo>();
@@ -41,14 +46,18 @@ namespace GameJamDungeon
[Dependency]
public ISaveChunk<GameData> GameChunk => this.DependOn<ISaveChunk<GameData>>();
#endregion
#region Event Signals
[Signal]
public delegate void InventoryButtonPressedEventHandler();
[Signal]
public delegate void MinimapButtonHeldEventHandler();
[Signal]
public delegate void PauseButtonPressedEventHandler();
#endregion
#region Exports
[Export]
public PlayerStatResource PlayerStatResource { get; set; } = default!;
@@ -56,22 +65,17 @@ namespace GameJamDungeon
private WeaponStats _defaultWeapon { get; set; } = default!;
[Export]
private ArmorStats _defaultArmor { get; set; } = default!;
#endregion
public PlayerLogic.Settings Settings { get; set; } = default!;
#region Node Dependencies
[Node] private IAnimationPlayer AnimationPlayer { get; set; } = default!;
public PlayerLogic PlayerLogic { get; set; } = default!;
[Node] private AnimatedSprite2D SwordSlashAnimation { get; set; } = default!;
public PlayerLogic.IBinding PlayerBinding { get; set; } = default!;
[Node] private IHitbox Hitbox { get; set; } = default!;
[Node] public IAnimationPlayer AnimationPlayer { get; set; } = default!;
[Node] public AnimatedSprite2D SwordSlashAnimation { get; set; } = default!;
[Node] public IHitbox Hitbox { get; set; } = default!;
[Node] public Timer HealthTimer { get; set; } = default!;
[Node] public IArea3D CollisionDetector { get; set; } = default!;
[Node] private Timer HealthTimer { get; set; } = default!;
#endregion
private PlayerData PlayerData { get; set; } = default!;
@@ -177,8 +181,16 @@ namespace GameJamDungeon
GlobalPosition = GameRepo.PlayerGlobalPosition.Value;
GameRepo.PlayerGlobalPosition.Sync += PlayerGlobalPosition_Sync;
HealthTimer.Timeout += OnHealthTimerTimeout;
CollisionDetector.BodyEntered += CollisionDetector_BodyEntered;
PlayerData.Inventory.AccessoryUnequipped += Inventory_AccessoryUnequipped;
Hitbox.AreaEntered += Hitbox_AreaEntered;
}
private void Hitbox_AreaEntered(Area3D area)
{
var enemy = Hitbox.GetParent<IEnemy>();
enemy.TakeDamage((PlayerStatResource.CurrentAttack + PlayerStatResource.BonusAttack) * PlayerData.Inventory.EquippedWeapon.Value.WeaponStats.ElementalDamageBonus,
PlayerData.Inventory.EquippedWeapon.Value.WeaponStats.WeaponElement,
ignoreElementalResistance: PlayerData.Inventory.EquippedWeapon.Value.WeaponStats.WeaponTags.Contains(WeaponTag.IgnoreAffinity));
}
public void OnReady()
@@ -319,24 +331,6 @@ namespace GameJamDungeon
PlayerData.SetLuck(PlayerData.Luck.Value - unequippedAccessory.LUCKUp);
}
private void CollisionDetector_BodyEntered(Node3D body)
{
if (body is IHitbox hitBox)
{
var enemy = hitBox.GetParent<IEnemy>();
var isCriticalHit = false;
var rng = new RandomNumberGenerator();
rng.Randomize();
var roll = rng.Randf();
if (roll <= enemy.EnemyStatResource.Luck)
isCriticalHit = true;
var damage = DamageCalculator.CalculateEnemyAttackDamage(PlayerData.CurrentDefense.Value + PlayerData.BonusDefense, enemy.EnemyStatResource, GameRepo.PlayerData.Inventory.EquippedArmor.Value.ArmorStats, isCriticalHit);
PlayerData.SetCurrentHP(PlayerData.CurrentHP.Value - Mathf.RoundToInt(damage));
GD.Print($"Player hit for {damage} damage.");
}
}
private void CurrentHP_Sync(int newHealth)
{
if (newHealth <= 0)

View File

@@ -1,11 +1,11 @@
@startuml PlayerLogic
state "PlayerLogic State" as GameJamDungeon_PlayerLogic_State {
state "Disabled" as GameJamDungeon_PlayerLogic_State_Disabled
state "Dead" as GameJamDungeon_PlayerLogic_State_Dead
state "Alive" as GameJamDungeon_PlayerLogic_State_Alive {
state "Attacking" as GameJamDungeon_PlayerLogic_State_Attacking
state "Idle" as GameJamDungeon_PlayerLogic_State_Idle
}
state "Dead" as GameJamDungeon_PlayerLogic_State_Dead
state "Disabled" as GameJamDungeon_PlayerLogic_State_Disabled
}
GameJamDungeon_PlayerLogic_State_Alive --> GameJamDungeon_PlayerLogic_State_Alive : Moved