From 336bfd0cc043363f38f2e2ce94cb0230748aa1b1 Mon Sep 17 00:00:00 2001 From: zeroyao Date: Mon, 25 Feb 2013 23:17:58 +0800 Subject: [PATCH] Changed activate assist from single card to a collection of cards; Added DeactivateAssist command to remove a card from ActivateAssists collection. --- .../Behaviors/Passive_AliceDollSummon.cs | 4 +- trunk/TouhouSpring/Game/BaseCard.cs | 8 +-- .../Game/Commands/ActivateAssist.cs | 14 +----- .../Game/Commands/DeactivateAssist.cs | 49 +++++++++++++++++++ trunk/TouhouSpring/Game/Game.CommandRunner.cs | 4 +- trunk/TouhouSpring/Game/Game.Main.cs | 4 ++ trunk/TouhouSpring/Game/Game.csproj | 1 + .../Game/Interactions/TacticalPhase.cs | 6 +-- trunk/TouhouSpring/Game/Player.Clone.cs | 7 +-- trunk/TouhouSpring/Game/Player.cs | 6 ++- .../UI/CardControlAddins/LocationAnimation.cs | 2 +- .../UI/CardControlAddins/ToneAnimation.cs | 2 +- .../Behaviors/Assist_MassSputter_NDamage.cs | 4 +- .../Behaviors/Passive_Aura_Offense_NAttack.cs | 9 +++- .../Passive_Aura_ReduceDamage_NDamage.cs | 10 ++-- .../THSv0.5/Behaviors/Passive_FreeRedeem.cs | 2 +- 16 files changed, 91 insertions(+), 41 deletions(-) create mode 100644 trunk/TouhouSpring/Game/Commands/DeactivateAssist.cs diff --git a/trunk/TouhouSpring/Cards/Behaviors/Passive_AliceDollSummon.cs b/trunk/TouhouSpring/Cards/Behaviors/Passive_AliceDollSummon.cs index d25f9b5..cae559a 100644 --- a/trunk/TouhouSpring/Cards/Behaviors/Passive_AliceDollSummon.cs +++ b/trunk/TouhouSpring/Cards/Behaviors/Passive_AliceDollSummon.cs @@ -11,8 +11,8 @@ public sealed class Passive_AliceDollSummon : BaseBehavior { diff --git a/trunk/TouhouSpring/Game/BaseCard.cs b/trunk/TouhouSpring/Game/BaseCard.cs index bf95e94..be789f8 100644 --- a/trunk/TouhouSpring/Game/BaseCard.cs +++ b/trunk/TouhouSpring/Game/BaseCard.cs @@ -31,14 +31,14 @@ public bool IsOnBattlefield get { return Owner.CardsOnBattlefield.Contains(this); } } - public bool IsHero + public bool IsActivatedAssist { - get { return Owner.Hero == this; } + get { return Owner.ActivatedAssits.Contains(this); } } - public bool IsAssist + public bool IsHero { - get { return Owner.Assists.Contains(this); } + get { return Owner.Hero == this; } } public bool IsDestroyed diff --git a/trunk/TouhouSpring/Game/Commands/ActivateAssist.cs b/trunk/TouhouSpring/Game/Commands/ActivateAssist.cs index d7877ea..8d6821c 100644 --- a/trunk/TouhouSpring/Game/Commands/ActivateAssist.cs +++ b/trunk/TouhouSpring/Game/Commands/ActivateAssist.cs @@ -13,11 +13,6 @@ public BaseCard CardToActivate get; private set; } - public BaseCard PreviouslyActivatedCard - { - get; private set; - } - public Player Initiator { get { return CardToActivate.Owner; } @@ -40,7 +35,7 @@ internal override void ValidateOnIssue() { FailValidation("Not a valid assist card."); } - else if (CardToActivate.Owner.ActivatedAssist == CardToActivate) + else if (CardToActivate.Owner.ActivatedAssits.Contains(CardToActivate)) { FailValidation("Can't activate the card twice."); } @@ -52,12 +47,7 @@ internal override void ValidateOnRun() internal override void RunMain() { - PreviouslyActivatedCard = CardToActivate.Owner.ActivatedAssist; - CardToActivate.Owner.ActivatedAssist = CardToActivate; - if (PreviouslyActivatedCard != null) - { - Game.UnsubscribeCardFromCommands(PreviouslyActivatedCard); - } + CardToActivate.Owner.m_activatedAssists.Add(CardToActivate); Game.SubscribeCardToCommands(CardToActivate); } } diff --git a/trunk/TouhouSpring/Game/Commands/DeactivateAssist.cs b/trunk/TouhouSpring/Game/Commands/DeactivateAssist.cs new file mode 100644 index 0000000..bbdfb98 --- /dev/null +++ b/trunk/TouhouSpring/Game/Commands/DeactivateAssist.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TouhouSpring.Commands +{ + public class DeactivateAssist : BaseCommand + { + // TODO: change to serialization-friendly ID + public BaseCard CardToDeactivate + { + get; private set; + } + + public DeactivateAssist(BaseCard cardToDeactivate) + { + if (cardToDeactivate == null) + { + throw new ArgumentNullException("cardToDeactivate"); + } + + CardToDeactivate = cardToDeactivate; + } + + internal override void ValidateOnIssue() + { + Validate(CardToDeactivate); + if (!CardToDeactivate.Owner.Assists.Contains(CardToDeactivate)) + { + FailValidation("Not a valid assist card."); + } + else if (!CardToDeactivate.Owner.ActivatedAssits.Contains(CardToDeactivate)) + { + FailValidation("Card is not activated."); + } + } + + internal override void ValidateOnRun() + { + } + + internal override void RunMain() + { + CardToDeactivate.Owner.m_activatedAssists.Remove(CardToDeactivate); + Game.UnsubscribeCardFromCommands(CardToDeactivate); + } + } +} diff --git a/trunk/TouhouSpring/Game/Game.CommandRunner.cs b/trunk/TouhouSpring/Game/Game.CommandRunner.cs index a09c3bd..d69ef64 100644 --- a/trunk/TouhouSpring/Game/Game.CommandRunner.cs +++ b/trunk/TouhouSpring/Game/Game.CommandRunner.cs @@ -175,7 +175,7 @@ internal void UnsubscribeCardFromCommands(BaseCard card) internal void SubscribeBehaviorToCommands(BaseCard card, Behaviors.IBehavior behavior) { - if (card.Owner.ActivatedAssist == card + if (card.Owner.ActivatedAssits.Contains(card) || card.Owner.m_battlefieldCards.Contains(card)) { if (card.Behaviors.Count > 1) @@ -191,7 +191,7 @@ internal void SubscribeBehaviorToCommands(BaseCard card, Behaviors.IBehavior beh internal void UnsubscribeBehaviorFromCommands(BaseCard card, Behaviors.IBehavior behavior) { - if (card.Owner.ActivatedAssist == card + if (card.Owner.ActivatedAssits.Contains(card) || card.Owner.m_battlefieldCards.Contains(card)) { m_commonTargets.Remove(behavior); diff --git a/trunk/TouhouSpring/Game/Game.Main.cs b/trunk/TouhouSpring/Game/Game.Main.cs index 17b4c11..b9ba1f2 100644 --- a/trunk/TouhouSpring/Game/Game.Main.cs +++ b/trunk/TouhouSpring/Game/Game.Main.cs @@ -83,6 +83,10 @@ public void RunTurnFromMainPhase(Interactions.TacticalPhase.CompiledResponse com { var cardToActivate = (BaseCard)result.Data; Debug.Assert(cardToActivate.Owner == ActingPlayer); + foreach (var card in ActingPlayer.ActivatedAssits) + { + IssueCommands(new Commands.DeactivateAssist(card)); + } IssueCommandsAndFlush(new Commands.ActivateAssist(cardToActivate)); } else if (result.ActionType == Interactions.TacticalPhase.Action.CastSpell) diff --git a/trunk/TouhouSpring/Game/Game.csproj b/trunk/TouhouSpring/Game/Game.csproj index 9a8199a..bc79155 100644 --- a/trunk/TouhouSpring/Game/Game.csproj +++ b/trunk/TouhouSpring/Game/Game.csproj @@ -42,6 +42,7 @@ + diff --git a/trunk/TouhouSpring/Game/Interactions/TacticalPhase.cs b/trunk/TouhouSpring/Game/Interactions/TacticalPhase.cs index efe1c78..9561ec1 100644 --- a/trunk/TouhouSpring/Game/Interactions/TacticalPhase.cs +++ b/trunk/TouhouSpring/Game/Interactions/TacticalPhase.cs @@ -372,7 +372,7 @@ private static IEnumerable GetActivateAssistBaseSet(Player player) { foreach (var card in player.Assists) { - if (card != player.ActivatedAssist) + if (!player.ActivatedAssits.Contains(card)) { yield return card; } @@ -381,9 +381,9 @@ private static IEnumerable GetActivateAssistBaseSet(Player player) private static IEnumerable GetCastSpellBaseSet(Player player) { - if (player.ActivatedAssist != null) + foreach (var card in player.ActivatedAssits) { - yield return player.ActivatedAssist; + yield return card; } foreach (var card in player.CardsOnBattlefield) { diff --git a/trunk/TouhouSpring/Game/Player.Clone.cs b/trunk/TouhouSpring/Game/Player.Clone.cs index 82c9611..ee26edc 100644 --- a/trunk/TouhouSpring/Game/Player.Clone.cs +++ b/trunk/TouhouSpring/Game/Player.Clone.cs @@ -60,10 +60,11 @@ internal Player Clone(Game game) { clonedPlayer.m_assists.Add(m_assists[i].Clone(clonedPlayer)); } - clonedPlayer.ActivatedAssist = ActivatedAssist != null ? clonedPlayer.m_assists[m_assists.IndexOf(ActivatedAssist)] : null; - if (clonedPlayer.ActivatedAssist != null) + + for (int i = 0; i < m_activatedAssists.Count; ++i) { - clonedPlayer.Game.SubscribeCardToCommands(clonedPlayer.ActivatedAssist); + clonedPlayer.m_activatedAssists.Add(clonedPlayer.m_assists[m_assists.IndexOf(m_activatedAssists[i])]); + clonedPlayer.Game.SubscribeCardToCommands(clonedPlayer.m_activatedAssists[i]); } for (int i = 0; i < m_library.Count; ++i) diff --git a/trunk/TouhouSpring/Game/Player.cs b/trunk/TouhouSpring/Game/Player.cs index 3f53c72..20437e2 100644 --- a/trunk/TouhouSpring/Game/Player.cs +++ b/trunk/TouhouSpring/Game/Player.cs @@ -22,6 +22,7 @@ public sealed partial class Player internal List m_sacrifices = new List(); internal List m_battlefieldCards = new List(); internal List m_assists = new List(); + internal List m_activatedAssists = new List(); internal List m_library = new List(); internal List m_graveyard = new List(); @@ -57,9 +58,9 @@ public IIndexable Assists get; private set; } - public BaseCard ActivatedAssist + public IIndexable ActivatedAssits { - get; internal set; + get; private set; } public Pile Library @@ -148,6 +149,7 @@ internal Player(string name, Game game) CardsSacrificed = m_sacrifices.ToIndexable(); CardsOnBattlefield = m_battlefieldCards.ToIndexable(); Assists = m_assists.ToIndexable(); + ActivatedAssits = m_activatedAssists.ToIndexable(); Library = new Pile(m_library); Graveyard = new Pile(m_graveyard); diff --git a/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/LocationAnimation.cs b/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/LocationAnimation.cs index 7c76842..87aedb6 100644 --- a/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/LocationAnimation.cs +++ b/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/LocationAnimation.cs @@ -94,7 +94,7 @@ public override void Update(float deltaTime) m_localFrame.Col2 = new Vector4(transform.M13, transform.M23, transform.M33, transform.M43); m_localFrame.Col3 = new Vector4(transform.M14, transform.M24, transform.M34, transform.M44); - bool activated = Card.IsAssist && Card.Owner.ActivatedAssist == Card; + bool activated = Card.IsActivatedAssist; if (activated != m_lastActivated) { if (m_activateEffectTimer.IsPlaying) diff --git a/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/ToneAnimation.cs b/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/ToneAnimation.cs index 0d5a918..de72e84 100644 --- a/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/ToneAnimation.cs +++ b/trunk/TouhouSpring/THSXnaWindows/THSXnaWindows/UI/CardControlAddins/ToneAnimation.cs @@ -31,7 +31,7 @@ public override void Update(float deltaTime) var gameUI = GameApp.Service(); bool darken = gameUI.ZoomedInCard != Control && (Card.Behaviors.Has() && Card.Behaviors.Get().State == Behaviors.WarriorState.CoolingDown - || Card.Owner.Assists.Contains(Card) && Card.Owner.ActivatedAssist != Card + || Card.Owner.Assists.Contains(Card) && !Card.IsActivatedAssist || Card.Owner.CardsSacrificed.Contains(Card)); if (darken != m_lastDarken) diff --git a/trunk/TouhouSpring/THSv0.5/Behaviors/Assist_MassSputter_NDamage.cs b/trunk/TouhouSpring/THSv0.5/Behaviors/Assist_MassSputter_NDamage.cs index d96ad3b..d6a7508 100644 --- a/trunk/TouhouSpring/THSv0.5/Behaviors/Assist_MassSputter_NDamage.cs +++ b/trunk/TouhouSpring/THSv0.5/Behaviors/Assist_MassSputter_NDamage.cs @@ -13,7 +13,7 @@ public sealed class Assist_MassSputter_NDamage : { public void RunEpilog(Commands.DealDamageToCard command) { - if (Host.Owner.ActivatedAssist == Host + if (Host.IsActivatedAssist && command.Cause is Warrior && ((Warrior)command.Cause).Host.Owner == Host.Owner) { @@ -23,7 +23,7 @@ public void RunEpilog(Commands.DealDamageToCard command) public void RunEpilog(Commands.SubtractPlayerLife command) { - if (Host.Owner.ActivatedAssist == Host + if (Host.IsActivatedAssist && command.FinalAmount > 0 && command.Cause is Warrior && ((Warrior)command.Cause).Host.Owner == Host.Owner) diff --git a/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_Offense_NAttack.cs b/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_Offense_NAttack.cs index 3553ce3..8d39934 100644 --- a/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_Offense_NAttack.cs +++ b/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_Offense_NAttack.cs @@ -9,6 +9,7 @@ public sealed class Passive_Aura_Offense_NAttack: BaseBehavior, Commands.ICause, IEpilogTrigger, + IEpilogTrigger, IEpilogTrigger { private ValueModifier m_attackMod; @@ -27,7 +28,11 @@ public void RunEpilog(Commands.ActivateAssist command) new Commands.SendBehaviorMessage(warrior, "AttackModifiers", new object[] { "add", m_attackMod })); } } - if (command.PreviouslyActivatedCard == Host) + } + + public void RunEpilog(Commands.DeactivateAssist command) + { + if (command.CardToDeactivate == Host) { foreach (var card in Host.Owner.CardsOnBattlefield) { @@ -43,7 +48,7 @@ public void RunEpilog(Commands.ActivateAssist command) public void RunEpilog(Commands.PlayCard command) { - if (Host.Owner.ActivatedAssist == Host + if (Host.IsActivatedAssist && Host.Owner == command.CardToPlay.Owner) { var warrior = command.CardToPlay.Behaviors.Get(); diff --git a/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_ReduceDamage_NDamage.cs b/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_ReduceDamage_NDamage.cs index 8be985a..3b83797 100644 --- a/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_ReduceDamage_NDamage.cs +++ b/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_Aura_ReduceDamage_NDamage.cs @@ -12,13 +12,11 @@ public sealed class Passive_Aura_ReduceDamage_NDamage : { public void RunProlog(Commands.DealDamageToCard command) { - if (Host.Owner.ActivatedAssist == Host) + if (Host.IsActivatedAssist + && command.Target.Owner == Host.Owner + && command.Cause is Warrior) { - if (command.Target.Owner == Host.Owner - && command.Cause is Warrior) - { - command.PatchDamageToDeal(Math.Max(command.DamageToDeal - Model.DamageReduced, 0)); - } + command.PatchDamageToDeal(Math.Max(command.DamageToDeal - Model.DamageReduced, 0)); } } diff --git a/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_FreeRedeem.cs b/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_FreeRedeem.cs index bf02d92..e8a86c5 100644 --- a/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_FreeRedeem.cs +++ b/trunk/TouhouSpring/THSv0.5/Behaviors/Passive_FreeRedeem.cs @@ -12,7 +12,7 @@ public sealed class Passive_FreeRedeem: { public void RunEpilog(Commands.Redeem command) { - if (Host.Owner.ActivatedAssist == Host) + if (Host.IsActivatedAssist) { Game.IssueCommands(new Commands.AddCardToManaPool(Model.SummonType.Target, Host.Owner)); }