| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- using UnityEngine;
- namespace MazeGen
- {
- /// <summary>
- /// A ScriptableObject that defines a monster template (stats, appearance, loot).
- /// Monsters are instantiated from this template when they spawn in a room.
- /// </summary>
- 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;
- /// <summary>Create a fresh character sheet for a monster instance (with a copy of stats).</summary>
- public CharacterSheet CreateCharacterSheet()
- {
- var sheet = new CharacterSheet(_baseStats.Clone());
- if (_startingWeapon != null)
- sheet.EquipWeapon(_startingWeapon);
- if (_startingArmor != null)
- sheet.EquipArmor(_startingArmor);
- return sheet;
- }
- /// <summary>
- /// 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.
- /// </summary>
- 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
- }
- }
|