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 } }