using System.Collections.Generic; namespace MazeGen { public enum CombatEventKind { FightStart, RoundStart, Hit, Miss, Death, FightEnd } /// /// One atomic thing that happened during a battle. A resolved battle is nothing but an /// ordered list of these. /// /// This is the seam that lets "just log it" and "watch it on a grid" share one outcome: the /// resolver runs to completion up front and emits this list, log-only mode prints it, and the /// arena replays the exact same list as animation. The view therefore cannot desync from the /// simulation, and switching modes can never change who wins. /// public class CombatEvent { public CombatEventKind Kind; public int Round; /// Combatant id of whoever acted, or -1 for battle/round-level events. public int ActorId = -1; /// Combatant id of whoever was acted upon, or -1. public int TargetId = -1; /// Damage dealt (Hit), or the target's remaining health (Death). public float Amount; /// Pre-rendered log line, so the log/thought/feed surfaces don't each re-describe it. public string Text; } public enum BattleOutcome { AgentsVictory, MonstersVictory, Stalemate } /// The complete, already-decided result of one battle. public class BattleResult { public BattleOutcome Outcome; public int Rounds; public readonly List Events = new List(); public IReadOnlyList Combatants; /// Agents who were reduced to 0 health in this battle. public readonly List FallenAgents = new List(); /// Monsters killed in this battle. public readonly List FallenMonsters = new List(); /// Agents still standing when the battle ended. public readonly List SurvivingAgents = new List(); public string Summary { get { switch (Outcome) { case BattleOutcome.AgentsVictory: return $"Agents won in {Rounds} round(s) - {FallenMonsters.Count} monster(s) killed, {FallenAgents.Count} agent(s) lost."; case BattleOutcome.MonstersVictory: return $"Monsters won in {Rounds} round(s) - all {FallenAgents.Count} agent(s) died."; default: return $"Stalemate after {Rounds} round(s) - both sides still standing, everyone disengages."; } } } } }