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:
@@ -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;
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -12,8 +12,9 @@ namespace Weapons
|
||||
{
|
||||
var projectile = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation);
|
||||
projectile.TryGetComponent<IDamageInflectorSetup>(out var inflector);
|
||||
|
||||
inflector?.Setup(character, weaponStats);
|
||||
|
||||
var finalDamage = GetFinalDamage();
|
||||
inflector?.Setup(character, finalDamage, weaponStats);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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<Health>(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);
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user