using System; using KernelPanic.Combat; namespace KernelPanic.Core { /// /// Provides runtime events for gameplay systems that need to observe combat and run milestones. /// public static class GameEvents { public static event Action CardPlayed; public static event Action CardResolved; public static event Action PhaseChanged; public static event Action DamageDealt; public static event Action WaveCleared; public static event Action RunEnded; public static void RaiseCardPlayed(CardPlayedEvent payload) { CardPlayed?.Invoke(payload); } public static void RaiseCardResolved(CardResolvedEvent payload) { CardResolved?.Invoke(payload); } public static void RaisePhaseChanged(PhaseChangedEvent payload) { PhaseChanged?.Invoke(payload); } public static void RaiseDamageDealt(DamageDealtEvent payload) { DamageDealt?.Invoke(payload); } public static void RaiseWaveCleared(WaveClearedEvent payload) { WaveCleared?.Invoke(payload); } public static void RaiseRunEnded(RunEndedEvent payload) { RunEnded?.Invoke(payload); } } /// /// Describes a card that entered a resolution track. /// public readonly struct CardPlayedEvent { public CardPlayedEvent(CardInstance card, ResolutionTrack track) { Card = card; Track = track; } public CardInstance Card { get; } public ResolutionTrack Track { get; } } /// /// Describes a card whose effects finished resolving. /// public readonly struct CardResolvedEvent { public CardResolvedEvent(CardInstance card, ResolutionTrack track) { Card = card; Track = track; } public CardInstance Card { get; } public ResolutionTrack Track { get; } } /// /// Describes a transition between combat phases. /// public readonly struct PhaseChangedEvent { public PhaseChangedEvent(TurnPhase previousPhase, TurnPhase nextPhase) { PreviousPhase = previousPhase; NextPhase = nextPhase; } public TurnPhase PreviousPhase { get; } public TurnPhase NextPhase { get; } } /// /// Describes damage applied from one combatant to another. /// public readonly struct DamageDealtEvent { public DamageDealtEvent(CombatantState source, CombatantState target, int amount, Language language) { Source = source; Target = target; Amount = amount; Language = language; } public CombatantState Source { get; } public CombatantState Target { get; } public int Amount { get; } public Language Language { get; } } /// /// Describes a completed enemy wave. /// public readonly struct WaveClearedEvent { public WaveClearedEvent(int waveNumber) { WaveNumber = waveNumber; } public int WaveNumber { get; } } /// /// Describes the end of a run and its earned meta currency. /// public readonly struct RunEndedEvent { public RunEndedEvent(bool playerDied, int entropyEarned) { PlayerDied = playerDied; EntropyEarned = entropyEarned; } public bool PlayerDied { get; } public int EntropyEarned { get; } } }