// This file contains copy-paste examples for setting up the combat system. // Replace YOUR_NAMESPACE with your actual namespace. using UnityEngine; using MazeGen; namespace MazeGen { // EXAMPLE 1: Creating a weapon in editor via script [System.Obsolete("This is just an example - create weapons via Create > Weapon in editor instead")] public class WeaponCreationExample : MonoBehaviour { public void CreateExampleWeapon() { var weapon = ScriptableObject.CreateInstance(); weapon.name = "Iron Sword"; // Note: You'll need to expose attack bonus as public or via reflection to set it // Best practice: create via editor! } } // EXAMPLE 2: Creating a monster programmatically public class MonsterCreationExample : MonoBehaviour { public Monster CreateGoblin() { var goblin = ScriptableObject.CreateInstance(); goblin.name = "Goblin"; // Create stats var stats = new CharacterStats(); // stats fields are private - you'd need public setters or reflection // Best practice: create via editor! return goblin; } } // EXAMPLE 3: Setting up agents with character sheets in MazeSceneBuilder public class AgentSetupExample : MonoBehaviour { private Weapon[] _startingWeapons; private Armor[] _startingArmor; private void LoadResources() { // Load weapon templates _startingWeapons = Resources.LoadAll("Items/Weapons/"); if (_startingWeapons.Length == 0) Debug.LogWarning("No weapons found in Resources/Items/Weapons/"); // Load armor templates _startingArmor = Resources.LoadAll("Items/Armor/"); if (_startingArmor.Length == 0) Debug.LogWarning("No armor found in Resources/Items/Armor/"); } private MazeAgent CreateAgentWithEquipment(string name, Room startRoom) { // Create base stats var stats = new CharacterStats(); var sheet = new CharacterSheet(stats); // Equip weapon if (_startingWeapons.Length > 0) { var weapon = _startingWeapons[Random.Range(0, _startingWeapons.Length)]; sheet.EquipWeapon(weapon); } // Equip armor if (_startingArmor.Length > 0) { var armor = _startingArmor[Random.Range(0, _startingArmor.Length)]; sheet.EquipArmor(armor); } // Create agent with character sheet var agent = new MazeAgent(name, startRoom, sheet); return agent; } } // EXAMPLE 4: Spawning encounters when generating rooms public class EncounterSpawningExample : MonoBehaviour { private Monster[] _monsterPool; private float _encounterChance = 0.7f; private int _minMonstersPerRoom = 1; private int _maxMonstersPerRoom = 3; private void LoadMonsters() { _monsterPool = Resources.LoadAll("Monsters/"); if (_monsterPool.Length == 0) Debug.LogWarning("No monsters found in Resources/Monsters/"); } private void SpawnEncounterInRoom(Room room) { // Don't spawn in start or exit rooms if (room.Kind == RoomKind.Start || room.Kind == RoomKind.Exit) return; // Random chance to spawn if (Random.value > _encounterChance) return; if (_monsterPool.Length == 0) return; // Create and populate encounter var encounter = new MonsterEncounter(); encounter.SpawnMonsters( _monsterPool, _minMonstersPerRoom, _maxMonstersPerRoom ); room.Encounter = encounter; Debug.Log($"Spawned encounter in {room.Id} with {encounter.AliveMonsterCount} monsters"); } } // EXAMPLE 5: Triggering combat when agent enters a room public class CombatTriggerExample : MonoBehaviour { private MazeAgent _agent; private void UpdateAgentCombat() { // Check if agent entered a room with monsters if (_agent.CurrentRoom.Encounter != null && _agent.CurrentRoom.Encounter.HasLivingMonsters && !_agent.IsDead) { ResolveCombat(); } } private void ResolveCombat() { var outcome = CombatResolver.ResolveCombat(_agent, _agent.CurrentRoom.Encounter); switch (outcome) { case CombatResolver.CombatOutcome.AgentVictory: Debug.Log($"{_agent.Name} won!"); // TODO: Award loot // TODO: Update UI break; case CombatResolver.CombatOutcome.AgentDefeated: Debug.Log($"{_agent.Name} was defeated!"); // Agent is now dead - they stop automatically // TODO: Update UI (show death) break; case CombatResolver.CombatOutcome.Fleeing: Debug.Log($"{_agent.Name} fled!"); // TODO: Force retreat back through entrance break; } } } // EXAMPLE 6: Peeking at a room's threat level public class PeekingExample : MonoBehaviour { private MazeAgent _agent; private AutonomousAgentBrain _brain; private void CheckThreatOfAdjacentRooms() { foreach (var exit in _agent.CurrentRoom.Exits) { float threatLevel = _brain.PeekThroughExit(exit, _agent); string threatDescription = threatLevel < 0.5f ? "Safe" : threatLevel < 1.5f ? "Moderate" : threatLevel < 3.0f ? "Dangerous" : "Deadly"; Debug.Log($"Exit leads to {threatDescription} room (CR: {threatLevel:F2})"); } } } // EXAMPLE 7: Setting up weapon with specific bonuses (for reference) [System.Obsolete("Example only - create Weapons via editor")] public class WeaponBonusExample : MonoBehaviour { private void ExampleWeaponBonuses() { // When you create a Weapon, these are the fields: // - itemName: "Iron Sword" // - description: "A sturdy iron sword" // - icon: (sprite reference) // - rarity: 1 (common) // - attackBonus: 5.0f // - magicBonus: 0.0f (no magic effect) // - defenseBonus: 1.0f (slight parry bonus) // - speedBonus: 0.0f (no speed effect) // When equipped, applies: // - +5 attack // - +1 defense // Modifiers stack with other equipment } } // EXAMPLE 8: Armor with penalties [System.Obsolete("Example only - create Armor via editor")] public class ArmorExample : MonoBehaviour { private void ExampleArmorStats() { // Heavy Armor example: // - defenseBonus: 10.0f (good protection) // - healthBonus: 5.0f (extra durability) // - speedPenalty: 2.0f (slow movement) // - magicResistance: 0.0f (no special resistances) // Light Armor example: // - defenseBonus: 3.0f (basic protection) // - healthBonus: 0.0f // - speedPenalty: 0.0f (no penalty) // - magicResistance: 2.0f (magic resistance) } } // EXAMPLE 9: Initializing AutonomousAgentBrain with retreat settings public class BrainInitializationExample : MonoBehaviour { private void InitBrainBrave(AutonomousAgentBrain brain, MazeAgentController controller, MazeGenerator gen) { // Brave agent - will enter dangerous rooms brain.Initialize( controller, gen, initialDelay: 0.5f, decisionInterval: 0.5f, exploreChance: 0.8f, retreatThreshold: 3.0f, // Very high threshold - rarely retreats isLevelEnded: () => false ); } private void InitBrainCautious(AutonomousAgentBrain brain, MazeAgentController controller, MazeGenerator gen) { // Cautious agent - avoids danger brain.Initialize( controller, gen, initialDelay: 0.5f, decisionInterval: 0.5f, exploreChance: 0.5f, retreatThreshold: 0.8f, // Low threshold - retreats often isLevelEnded: () => false ); } private void InitBrainNormal(AutonomousAgentBrain brain, MazeAgentController controller, MazeGenerator gen) { // Balanced agent brain.Initialize( controller, gen, initialDelay: 0.5f, decisionInterval: 0.5f, exploreChance: 0.7f, retreatThreshold: 1.5f, // Medium threshold isLevelEnded: () => false ); } } // EXAMPLE 10: Monster loot table setup (in editor) [System.Obsolete("Example only - create Monsters via editor")] public class MonsterLootExample : MonoBehaviour { private void ExampleLootTables() { // Goblin's loot table might include: // [0] Common Dagger // [1] Leather Armor // [2] Health Potion // [3] (empty for "no drop" chance) // Boss monster's loot table might include: // [0] Rare Sword // [1] Legendary Armor // [2] Magic Scroll // (no empty slots - always drops something) } } }