CharacterStats.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using UnityEngine;
  2. namespace MazeGen
  3. {
  4. /// <summary>
  5. /// Core character/monster statistics. Stores both base stats and current values
  6. /// (health can be reduced in combat, speed affects action order, attack/defense/magic
  7. /// are used in combat resolution).
  8. /// </summary>
  9. [System.Serializable]
  10. public class CharacterStats
  11. {
  12. [SerializeField] private float _maxHealth = 100f;
  13. [SerializeField] private float _speed = 10f; // Initiative and movement speed
  14. [SerializeField] private float _attack = 10f; // Physical damage output
  15. [SerializeField] private float _defense = 5f; // Physical damage reduction
  16. [SerializeField] private float _magic = 5f; // Magical power (casting damage/resistance)
  17. private float _currentHealth;
  18. public float MaxHealth => _maxHealth;
  19. public float CurrentHealth
  20. {
  21. get => _currentHealth;
  22. set => _currentHealth = Mathf.Clamp(value, 0, _maxHealth);
  23. }
  24. public float Speed => _speed;
  25. public float Attack => _attack;
  26. public float Defense => _defense;
  27. public float Magic => _magic;
  28. public bool IsAlive => _currentHealth > 0;
  29. public CharacterStats()
  30. {
  31. _currentHealth = _maxHealth;
  32. }
  33. /// <summary>Create a copy of this stat block (useful for monster instances).</summary>
  34. public CharacterStats Clone()
  35. {
  36. var clone = new CharacterStats
  37. {
  38. _maxHealth = _maxHealth,
  39. _speed = _speed,
  40. _attack = _attack,
  41. _defense = _defense,
  42. _magic = _magic,
  43. _currentHealth = _currentHealth
  44. };
  45. return clone;
  46. }
  47. /// <summary>Reset health to max (for a fresh combat or new agent spawn).</summary>
  48. public void RestoreHealth()
  49. {
  50. _currentHealth = _maxHealth;
  51. }
  52. /// <summary>Take damage (already accounting for defense).</summary>
  53. public void TakeDamage(float damage)
  54. {
  55. CurrentHealth -= Mathf.Max(0, damage);
  56. }
  57. /// <summary>Calculate effective damage taken after defense reduction.</summary>
  58. public float CalculateDamageReduction(float incomingDamage)
  59. {
  60. // Simple formula: defense reduces damage by 10% per defense point, up to 90% reduction
  61. float reductionPercent = Mathf.Clamp01(_defense * 0.1f);
  62. return incomingDamage * (1f - reductionPercent);
  63. }
  64. }
  65. }