using UnityEngine;
namespace MazeGen
{
///
/// Weapon classification for combat range and mechanics.
///
public enum WeaponType
{
Melee, // Must be adjacent to target (1 square)
Ranged, // Physical projectile with variable range
Magic // Spell-based with variable range
}
///
/// A weapon that can be equipped to boost attack power. Can also provide
/// secondary effects (e.g., magic boost, defense buff).
///
public class Weapon : Item
{
[SerializeField] private float _attackBonus = 5f;
[SerializeField] private float _magicBonus = 0f; // Some weapons add spell power
[SerializeField] private float _defenseBonus = 0f; // Some weapons grant parry/shield bonuses
[SerializeField] private float _speedBonus = 0f; // Heavy weapons might slow you down
[SerializeField] private WeaponType _weaponType = WeaponType.Melee;
[SerializeField] private int _range = 1; // Range in grid squares (1 = melee/adjacent, 2+ = ranged/magic)
public float AttackBonus => _attackBonus;
public float MagicBonus => _magicBonus;
public float DefenseBonus => _defenseBonus;
public float SpeedBonus => _speedBonus;
public WeaponType WeaponType => _weaponType;
public int Range => _range;
public override bool OnEquip(CharacterSheet character)
{
if (!base.OnEquip(character)) return false;
// Apply stat bonuses to the character
character.ApplyTemporaryBonus("weapon_attack", _attackBonus, "attack");
if (_magicBonus != 0) character.ApplyTemporaryBonus("weapon_magic", _magicBonus, "magic");
if (_defenseBonus != 0) character.ApplyTemporaryBonus("weapon_defense", _defenseBonus, "defense");
if (_speedBonus != 0) character.ApplyTemporaryBonus("weapon_speed", _speedBonus, "speed");
return true;
}
public override void OnUnequip(CharacterSheet character)
{
character.RemoveTemporaryBonus("weapon_attack");
character.RemoveTemporaryBonus("weapon_magic");
character.RemoveTemporaryBonus("weapon_defense");
character.RemoveTemporaryBonus("weapon_speed");
base.OnUnequip(character);
}
public override string GetLabel() => $"{ItemName} (+{_attackBonus} ATK)";
}
}