From 57896441ab01491b1b1c8af5e108a32b5bded1f5 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 11 Jul 2025 22:09:15 +0200 Subject: [PATCH] Refactor WeaponStats and related classes to include attack speed, range, and damage type; update damage calculations for melee and ranged attacks --- Assets/Scripts/Data/WeaponStats.cs | 6 +++++- .../Interfaces/IDamageInflectorSetup.cs | 2 +- Assets/Scripts/Weapons/AutoWeapon.cs | 5 +++-- Assets/Scripts/Weapons/MeleeAttack.cs | 6 +++--- Assets/Scripts/Weapons/Projectile.cs | 12 ++---------- Assets/Scripts/Weapons/Weapon.cs | 18 +++++++++++++++++- 6 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Assets/Scripts/Data/WeaponStats.cs b/Assets/Scripts/Data/WeaponStats.cs index 2e22f61..4a424ea 100644 --- a/Assets/Scripts/Data/WeaponStats.cs +++ b/Assets/Scripts/Data/WeaponStats.cs @@ -1,10 +1,14 @@ using System; +using Interfaces; namespace Data { [Serializable] public class WeaponStats { - public float Damage; + public float damage; + public float attackSpeed; + public float range; + public DamageType damageType; } } \ No newline at end of file diff --git a/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs b/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs index 7b40f82..997ea2d 100644 --- a/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs +++ b/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs @@ -5,6 +5,6 @@ namespace Interfaces { public interface IDamageInflectorSetup { - void Setup(Character attacker, [CanBeNull] WeaponStats weaponStats = null); + void Setup(Character attacker, float damage, [CanBeNull] WeaponStats weaponStats = null); } } \ No newline at end of file diff --git a/Assets/Scripts/Weapons/AutoWeapon.cs b/Assets/Scripts/Weapons/AutoWeapon.cs index 7716d88..1beffb3 100644 --- a/Assets/Scripts/Weapons/AutoWeapon.cs +++ b/Assets/Scripts/Weapons/AutoWeapon.cs @@ -12,8 +12,9 @@ namespace Weapons { var projectile = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation); projectile.TryGetComponent(out var inflector); - - inflector?.Setup(character, weaponStats); + + var finalDamage = GetFinalDamage(); + inflector?.Setup(character, finalDamage, weaponStats); } } } \ No newline at end of file diff --git a/Assets/Scripts/Weapons/MeleeAttack.cs b/Assets/Scripts/Weapons/MeleeAttack.cs index 3004932..1c9b39d 100644 --- a/Assets/Scripts/Weapons/MeleeAttack.cs +++ b/Assets/Scripts/Weapons/MeleeAttack.cs @@ -8,18 +8,18 @@ namespace Weapons { public class MeleeAttack : Weapon, IWeapon { - [SerializeField] private float range = 1f; [SerializeField] private LayerMask targetMask; 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) { hit.TryGetComponent(out var health); if (hit.gameObject == character.gameObject) continue; - var damage = weaponStats.Damage + character.attributes.Damage * character.attributes.MeleeDamage; + var damage = GetFinalDamage(); health.TakeDamage(damage); } } diff --git a/Assets/Scripts/Weapons/Projectile.cs b/Assets/Scripts/Weapons/Projectile.cs index 005122f..e7e2ec8 100644 --- a/Assets/Scripts/Weapons/Projectile.cs +++ b/Assets/Scripts/Weapons/Projectile.cs @@ -17,17 +17,9 @@ namespace Weapons public GameObject Owner { get; private set; } 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 = weaponStats.Damage + attacker.attributes.Damage * attacker.attributes.RangedDamage; - } - else - { - Damage = attacker.attributes.Damage * attacker.attributes.RangedDamage; - } - + Damage = damage; Owner = attacker.gameObject; } diff --git a/Assets/Scripts/Weapons/Weapon.cs b/Assets/Scripts/Weapons/Weapon.cs index c4752ba..43beb58 100644 --- a/Assets/Scripts/Weapons/Weapon.cs +++ b/Assets/Scripts/Weapons/Weapon.cs @@ -22,7 +22,23 @@ namespace Weapons if (!(timer <= 0f)) return; 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();