Refactor TriggerManager out of BattleController
This commit is contained in:
parent
6aa13cdbb7
commit
60e8d2e3e0
4 changed files with 94 additions and 36 deletions
|
|
@ -118,8 +118,6 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
private IEnumerator RunBattleRound() {
|
private IEnumerator RunBattleRound() {
|
||||||
this.state.Clock.AdvanceRound();
|
this.state.Clock.AdvanceRound();
|
||||||
|
|
||||||
this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn);
|
|
||||||
|
|
||||||
this.state.HeroEnergy.Replenish();
|
this.state.HeroEnergy.Replenish();
|
||||||
this.state.MonsterEnergy.Replenish();
|
this.state.MonsterEnergy.Replenish();
|
||||||
|
|
||||||
|
|
@ -162,6 +160,12 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
} else {
|
} else {
|
||||||
HeroCard card = playerAction.GetCardUsed();
|
HeroCard card = playerAction.GetCardUsed();
|
||||||
yield return UseHeroCard(card);
|
yield return UseHeroCard(card);
|
||||||
|
|
||||||
|
// TODO: Implement a stack/queue to resolve triggers in order.
|
||||||
|
// Do this after the card resolution is over to avoid reentraint effects.
|
||||||
|
this.state.TriggerManager.RunActivatedTriggers(this);
|
||||||
|
CheckState();
|
||||||
|
OnBattleStateChanged();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
yield return null;
|
yield return null;
|
||||||
|
|
@ -170,6 +174,12 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
|
|
||||||
// End of hero turn
|
// End of hero turn
|
||||||
yield return this.state.PlayArea.UseHeroDefaults(this.state.Heroes, this.participantActivity, UseHeroDefault);
|
yield return this.state.PlayArea.UseHeroDefaults(this.state.Heroes, this.participantActivity, UseHeroDefault);
|
||||||
|
// TODO: Implement a stack/queue to resolve triggers in order.
|
||||||
|
// Do this after the card resolution is over to avoid reentraint effects.
|
||||||
|
this.state.TriggerManager.RunActivatedTriggers(this);
|
||||||
|
CheckState();
|
||||||
|
OnBattleStateChanged();
|
||||||
|
|
||||||
if (STABLE_HAND_STYLE) {
|
if (STABLE_HAND_STYLE) {
|
||||||
this.state.HeroDeck.DiscardInExcessOf(3);
|
this.state.HeroDeck.DiscardInExcessOf(3);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -203,6 +213,12 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
MonsterCard monsterCard = monsterHand[i];
|
MonsterCard monsterCard = monsterHand[i];
|
||||||
if (monsterCard.Type == CardType.Emotion && CanUseMonsterCard(monsterCard)) {
|
if (monsterCard.Type == CardType.Emotion && CanUseMonsterCard(monsterCard)) {
|
||||||
yield return UseMonsterCard(monsterCard);
|
yield return UseMonsterCard(monsterCard);
|
||||||
|
|
||||||
|
// TODO: Implement a stack/queue to resolve triggers in order.
|
||||||
|
// Do this after the card resolution is over to avoid reentraint effects.
|
||||||
|
this.state.TriggerManager.RunActivatedTriggers(this);
|
||||||
|
CheckState();
|
||||||
|
OnBattleStateChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -214,8 +230,13 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
MonsterCard monsterCard = FirstMonsterActionToPlay();
|
MonsterCard monsterCard = FirstMonsterActionToPlay();
|
||||||
if (monsterCard != null) {
|
if (monsterCard != null) {
|
||||||
yield return UseMonsterCard(monsterCard);
|
yield return UseMonsterCard(monsterCard);
|
||||||
OnBattleStateChanged();
|
|
||||||
anyCardPlayed = true;
|
anyCardPlayed = true;
|
||||||
|
|
||||||
|
// TODO: Implement a stack/queue to resolve triggers in order.
|
||||||
|
// Do this after the card resolution is over to avoid reentraint effects.
|
||||||
|
this.state.TriggerManager.RunActivatedTriggers(this);
|
||||||
|
CheckState();
|
||||||
|
OnBattleStateChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -304,20 +325,6 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
return this.monsterHandPlayability.IsPlayableImmediately(card);
|
return this.monsterHandPlayability.IsPlayableImmediately(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnqueueActivatedTrigger(Trigger trigger) {
|
|
||||||
this.activatedTriggers.Add(trigger);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RunActivatedTriggers() {
|
|
||||||
foreach (Trigger t in this.activatedTriggers) {
|
|
||||||
t.Run(this);
|
|
||||||
}
|
|
||||||
this.activatedTriggers.Clear();
|
|
||||||
|
|
||||||
// Cleanup expired triggers
|
|
||||||
this.damageTriggers.RemoveAll(t => t.Expired);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckState() {
|
private void CheckState() {
|
||||||
foreach (BattleParticipant p in this.state.Heroes) {
|
foreach (BattleParticipant p in this.state.Heroes) {
|
||||||
p.CheckState();
|
p.CheckState();
|
||||||
|
|
@ -420,8 +427,6 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Trigger> activatedTriggers = new List<Trigger>();
|
|
||||||
private List<DamageTrigger> damageTriggers = new List<DamageTrigger>();
|
|
||||||
|
|
||||||
public int DealDamage(DealDamageEffect effect) {
|
public int DealDamage(DealDamageEffect effect) {
|
||||||
if (effect.Target == null) return 0;
|
if (effect.Target == null) return 0;
|
||||||
|
|
@ -431,14 +436,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
amount += this.state.BuffManager.GetTotalBuffAmountOfType(effect.Source, BuffType.Power);
|
amount += this.state.BuffManager.GetTotalBuffAmountOfType(effect.Source, BuffType.Power);
|
||||||
}
|
}
|
||||||
int damageDealt = effect.Target.DealDamage(amount);
|
int damageDealt = effect.Target.DealDamage(amount);
|
||||||
foreach (DamageTrigger dt in this.damageTriggers) {
|
this.state.TriggerManager.NotifyResolvedDamageEffect(effect);
|
||||||
if (dt.IsTriggeredBy(effect)) {
|
|
||||||
EnqueueActivatedTrigger(dt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do this after the card resolution is over to avoid reentraint effects.
|
|
||||||
RunActivatedTriggers();
|
|
||||||
|
|
||||||
return damageDealt;
|
return damageDealt;
|
||||||
}
|
}
|
||||||
|
|
@ -448,15 +446,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
BattleParticipant[] affectedTeam = GetTeam(effect.Team);
|
BattleParticipant[] affectedTeam = GetTeam(effect.Team);
|
||||||
foreach (BattleParticipant bp in affectedTeam) {
|
foreach (BattleParticipant bp in affectedTeam) {
|
||||||
damageDealt += bp.DealDamage(effect.Amount);
|
damageDealt += bp.DealDamage(effect.Amount);
|
||||||
foreach (DamageTrigger dt in this.damageTriggers) {
|
|
||||||
if (dt.IsTriggeredBy(effect)) {
|
|
||||||
EnqueueActivatedTrigger(dt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
this.state.TriggerManager.NotifyResolvedMassDamageEffect(effect);
|
||||||
// Do this after the card resolution is over to avoid reentraint effects.
|
|
||||||
RunActivatedTriggers();
|
|
||||||
|
|
||||||
return damageDealt;
|
return damageDealt;
|
||||||
}
|
}
|
||||||
|
|
@ -531,6 +522,6 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ArmDamageTrigger(DamageTrigger damageTrigger) {
|
public void ArmDamageTrigger(DamageTrigger damageTrigger) {
|
||||||
this.damageTriggers.Add(damageTrigger);
|
this.state.TriggerManager.ArmDamageTrigger(damageTrigger);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ public class BattleState: MonsterViewpoint
|
||||||
private BattleMonster[] monsters;
|
private BattleMonster[] monsters;
|
||||||
private BattleClock clock;
|
private BattleClock clock;
|
||||||
private BuffManager buffManager;
|
private BuffManager buffManager;
|
||||||
|
private TriggerManager triggerManager;
|
||||||
private EnergyPool heroEnergy;
|
private EnergyPool heroEnergy;
|
||||||
private EnergyPool monsterEnergy;
|
private EnergyPool monsterEnergy;
|
||||||
private BattleDeck<HeroCard> heroDeck;
|
private BattleDeck<HeroCard> heroDeck;
|
||||||
|
|
@ -28,6 +29,7 @@ public class BattleState: MonsterViewpoint
|
||||||
public BattleState(BattleParameters parameters) {
|
public BattleState(BattleParameters parameters) {
|
||||||
this.clock = new BattleClock();
|
this.clock = new BattleClock();
|
||||||
this.buffManager = new BuffManager(this.clock);
|
this.buffManager = new BuffManager(this.clock);
|
||||||
|
this.triggerManager = new TriggerManager(this.clock);
|
||||||
this.heroEnergy = new EnergyPool();
|
this.heroEnergy = new EnergyPool();
|
||||||
this.monsterEnergy = new EnergyPool();
|
this.monsterEnergy = new EnergyPool();
|
||||||
this.playArea = new PlayArea();
|
this.playArea = new PlayArea();
|
||||||
|
|
@ -115,6 +117,7 @@ public class BattleState: MonsterViewpoint
|
||||||
public BattleMonster[] Monsters {get => this.monsters;}
|
public BattleMonster[] Monsters {get => this.monsters;}
|
||||||
public BattleClock Clock {get => this.clock;}
|
public BattleClock Clock {get => this.clock;}
|
||||||
public BuffManager BuffManager {get => this.buffManager;}
|
public BuffManager BuffManager {get => this.buffManager;}
|
||||||
|
public TriggerManager TriggerManager {get => this.triggerManager;}
|
||||||
|
|
||||||
public EnergyPool HeroEnergy {get => this.heroEnergy;}
|
public EnergyPool HeroEnergy {get => this.heroEnergy;}
|
||||||
public EnergyPool MonsterEnergy {get => this.monsterEnergy;}
|
public EnergyPool MonsterEnergy {get => this.monsterEnergy;}
|
||||||
|
|
|
||||||
53
Assets/Battle/TriggerManager.cs
Normal file
53
Assets/Battle/TriggerManager.cs
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
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>();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 damageTrigger) {
|
||||||
|
this.damageTriggers.Add(damageTrigger);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnqueueActivatedTrigger(Trigger trigger) {
|
||||||
|
this.activatedTriggers.Add(trigger);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RunActivatedTriggers(IBattleEffectApplier effectApplier) {
|
||||||
|
foreach (Trigger t in this.activatedTriggers) {
|
||||||
|
t.Run(effectApplier);
|
||||||
|
}
|
||||||
|
this.activatedTriggers.Clear();
|
||||||
|
|
||||||
|
// Cleanup expired triggers
|
||||||
|
this.damageTriggers.RemoveAll(t => t.Expired);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Battle/TriggerManager.cs.meta
Normal file
11
Assets/Battle/TriggerManager.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5b09c5a41e91be24b988322cbdb19cba
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Loading…
Add table
Add a link
Reference in a new issue