mixedcards/Assets/Battle/TriggerManager.cs
2020-10-23 00:16:34 -04:00

67 lines
2.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TriggerManager
{
private List<Trigger> activatedTriggers = new List<Trigger>();
private List<DamageTrigger> damageTriggers = new List<DamageTrigger>();
private List<StepTrigger> stepTriggers = new List<StepTrigger>();
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);
}
}