using System.Collections; using System.Collections.Generic; using UnityEngine; public class TriggerManager { private List activatedTriggers = new List(); private List damageTriggers = new List(); private List stepTriggers = new List(); public TriggerManager(BattleClock clock) { clock.OnTimeChanged += this.NotifyTimeChanged; } private void NotifyTimeChanged(BattleTime now) { if (now.RoundStep == RoundStep.StartOfHeroTurn) { this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); this.stepTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); } foreach (StepTrigger st in this.stepTriggers) { if (st.IsTriggeredBy(now)) { EnqueueActivatedTrigger(st); } } } public void NotifyResolvedDamageEffect(DealDamageEffect effect) { foreach (DamageTrigger dt in this.damageTriggers) { if (dt.IsTriggeredBy(effect)) { EnqueueActivatedTrigger(dt); } } } public void NotifyResolvedMassDamageEffect(MassDamageEffect effect) { foreach (DamageTrigger dt in this.damageTriggers) { if (dt.IsTriggeredBy(effect)) { EnqueueActivatedTrigger(dt); } } } public void ArmDamageTrigger(DamageTrigger trigger) { this.damageTriggers.Add(trigger); } public void ArmStepTrigger(StepTrigger trigger) { this.stepTriggers.Add(trigger); } private void EnqueueActivatedTrigger(Trigger trigger) { this.activatedTriggers.Add(trigger); } public IEnumerator RunActivatedTriggers(IBattleEffectApplier effectApplier, MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { foreach (Trigger t in this.activatedTriggers) { yield return t.Run(effectApplier, viewpoint, playerControls); } this.activatedTriggers.Clear(); // Cleanup expired triggers this.damageTriggers.RemoveAll(t => t.Expired); } }