Refactor WeaponStats and related classes to include attack speed, range, and damage type; update damage calculations for melee and ranged attacks

This commit is contained in:
2025-07-11 22:09:15 +02:00
parent 9261b9f00f
commit 57896441ab
6 changed files with 31 additions and 18 deletions

View File

@@ -1,10 +1,14 @@
using System; using System;
using Interfaces;
namespace Data namespace Data
{ {
[Serializable] [Serializable]
public class WeaponStats public class WeaponStats
{ {
public float Damage; public float damage;
public float attackSpeed;
public float range;
public DamageType damageType;
} }
} }

View File

@@ -5,6 +5,6 @@ namespace Interfaces
{ {
public interface IDamageInflectorSetup public interface IDamageInflectorSetup
{ {
void Setup(Character attacker, [CanBeNull] WeaponStats weaponStats = null); void Setup(Character attacker, float damage, [CanBeNull] WeaponStats weaponStats = null);
} }
} }

View File

@@ -12,8 +12,9 @@ namespace Weapons
{ {
var projectile = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation); var projectile = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation);
projectile.TryGetComponent<IDamageInflectorSetup>(out var inflector); projectile.TryGetComponent<IDamageInflectorSetup>(out var inflector);
inflector?.Setup(character, weaponStats); var finalDamage = GetFinalDamage();
inflector?.Setup(character, finalDamage, weaponStats);
} }
} }
} }

View File

@@ -8,18 +8,18 @@ namespace Weapons
{ {
public class MeleeAttack : Weapon, IWeapon public class MeleeAttack : Weapon, IWeapon
{ {
[SerializeField] private float range = 1f;
[SerializeField] private LayerMask targetMask; [SerializeField] private LayerMask targetMask;
public override void Fire() public override void Fire()
{ {
var hits = Physics2D.OverlapCircleAll(transform.position, range, targetMask); var finalRange = GetFinalRange();
var hits = Physics2D.OverlapCircleAll(transform.position, finalRange, targetMask);
foreach (var hit in hits) foreach (var hit in hits)
{ {
hit.TryGetComponent<Health>(out var health); hit.TryGetComponent<Health>(out var health);
if (hit.gameObject == character.gameObject) continue; if (hit.gameObject == character.gameObject) continue;
var damage = weaponStats.Damage + character.attributes.Damage * character.attributes.MeleeDamage; var damage = GetFinalDamage();
health.TakeDamage(damage); health.TakeDamage(damage);
} }
} }

View File

@@ -17,17 +17,9 @@ namespace Weapons
public GameObject Owner { get; private set; } public GameObject Owner { get; private set; }
public DamageType Type => DamageType.Ranged; public DamageType Type => DamageType.Ranged;
public void Setup(Character attacker, WeaponStats weaponStats = null) public void Setup(Character attacker, float damage, WeaponStats weaponStats = null)
{ {
if (weaponStats != null) Damage = damage;
{
Damage = weaponStats.Damage + attacker.attributes.Damage * attacker.attributes.RangedDamage;
}
else
{
Damage = attacker.attributes.Damage * attacker.attributes.RangedDamage;
}
Owner = attacker.gameObject; Owner = attacker.gameObject;
} }

View File

@@ -22,7 +22,23 @@ namespace Weapons
if (!(timer <= 0f)) return; if (!(timer <= 0f)) return;
Fire(); Fire();
timer = 1f / character.attributes.AttackSpeed; timer = 1f / GetFinalAttackSpeed();
}
private float GetFinalAttackSpeed()
{
return character.attributes.AttackSpeed * weaponStats.attackSpeed;
}
protected float GetFinalDamage()
{
return weaponStats.damage + character.attributes.Damage *
(weaponStats.damageType == DamageType.Melee ? character.attributes.MeleeDamage : character.attributes.RangedDamage);
}
protected float GetFinalRange()
{
return weaponStats.range * character.attributes.AttackRange;
} }
public abstract void Fire(); public abstract void Fire();