using Unity.VisualScripting;
using UnityEngine;
namespace MazeGen
{
///
/// A ScriptableObject that defines a monster template (stats, appearance, loot).
/// Monsters are instantiated from this template when they spawn in a room.
///
public class Monster : ScriptableObject
{
[SerializeField] private string _monsterName = "Goblin";
[SerializeField] private Color _color = Color.green;
[SerializeField] private CharacterStats _baseStats = new CharacterStats();
// Optional starting equipment
[SerializeField] private Weapon _startingWeapon;
[SerializeField] private Armor _startingArmor;
// Loot: what items might this monster drop when defeated (rough probabilities)
[SerializeField] private Item[] _possibleLoot;
public string MonsterName => _monsterName;
public Color Color => _color;
public CharacterStats BaseStats => _baseStats;
public Weapon StartingWeapon => _startingWeapon;
public Armor StartingArmor => _startingArmor;
public Item[] PossibleLoot => _possibleLoot;
/// Create a fresh character sheet for a monster instance (with a copy of stats).
public CharacterSheet CreateCharacterSheet()
{
// Pass null GameObject (Monster is a ScriptableObject, not a MonoBehaviour)
// CharacterSheet will use a default name instead
var sheet = new CharacterSheet(null, _baseStats.Clone());
// Override with the monster template's name
sheet.Name = _monsterName;
if (_startingWeapon != null)
sheet.EquipWeapon(_startingWeapon);
if (_startingArmor != null)
sheet.EquipArmor(_startingArmor);
return sheet;
}
///
/// Get a random loot item from this monster's loot table (null if no loot).
/// You can extend this with probability tiers or rarity weighting later.
///
public Item GetRandomLoot()
{
if (_possibleLoot == null || _possibleLoot.Length == 0)
return null;
return _possibleLoot[Random.Range(0, _possibleLoot.Length)];
}
#if UNITY_EDITOR
private void OnValidate()
{
if (_baseStats == null)
_baseStats = new CharacterStats();
}
#endif
}
}