From 9b6ce1a062ced18fca5390767ab3f5b0d57b3d26 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Mon, 20 Jun 2016 07:09:20 +0000 Subject: [PATCH] add Dawnbreak Reclaimer, with extra logic in ChangeZoneAllAi --- .gitattributes | 1 + .../forge/ai/ability/ChangeZoneAllAi.java | 32 +++++++++++++++++++ .../res/cardsfolder/d/dawnbreak_reclaimer.txt | 26 +++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 forge-gui/res/cardsfolder/d/dawnbreak_reclaimer.txt diff --git a/.gitattributes b/.gitattributes index d8878271677..5b31c99e15a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4406,6 +4406,7 @@ forge-gui/res/cardsfolder/d/dawn_charm.txt -text forge-gui/res/cardsfolder/d/dawn_elemental.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/dawn_to_dusk.txt -text +forge-gui/res/cardsfolder/d/dawnbreak_reclaimer.txt -text svneol=unset#text/plain forge-gui/res/cardsfolder/d/dawnbringer_charioteers.txt -text forge-gui/res/cardsfolder/d/dawnfluke.txt -text forge-gui/res/cardsfolder/d/dawnglare_invoker.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index aedee58c261..dff99cdb953 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -15,6 +15,7 @@ import forge.game.card.CounterType; import forge.game.cost.Cost; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; @@ -226,6 +227,37 @@ public class ChangeZoneAllAi extends SpellAbilityAi { return true; } + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String) + */ + @Override + public boolean confirmAction(Player ai, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + final Card source = sa.getHostCard(); + final String hostName = source.getName(); + final ZoneType origin = ZoneType.listValueOf(sa.getParam("Origin")).get(0); + + if (hostName.equals("Dawnbreak Reclaimer")) { + final CardCollectionView cards = AbilityUtils.filterListByType(ai.getGame().getCardsIn(origin), sa.getParam("ChangeType"), sa); + + // AI gets nothing + final CardCollection aiCards = CardLists.filterControlledBy(cards, ai); + if (aiCards.isEmpty()) + return false; + + // Human gets nothing + final CardCollection humanCards = CardLists.filterControlledBy(cards, ai.getOpponents()); + if (humanCards.isEmpty()) + return true; + + // if AI creature is better than Human Creature + if (ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard + .evaluateCreatureList(humanCards)) { + return true; + } + return false; + } + return true; + } @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { diff --git a/forge-gui/res/cardsfolder/d/dawnbreak_reclaimer.txt b/forge-gui/res/cardsfolder/d/dawnbreak_reclaimer.txt new file mode 100644 index 00000000000..41705b699c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/d/dawnbreak_reclaimer.txt @@ -0,0 +1,26 @@ +Name:Dawnbreak Reclaimer +ManaCost:4 W W +Types:Creature Angel +PT:5/5 +K:Flying + +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBChooseCard | TriggerDescription$ At the beginning of your end step, choose a creature card in an opponent's graveyard, then that player chooses a creature card in your graveyard. You may return those cards to the battlefield under their owners' control. + +SVar:DBChooseCard:AB$ ChooseCard | Cost$ 0 | Choices$ Creature.OppCtrl | ChoiceZone$ Graveyard | AILogic$ WorstCard | Mandatory$ True | Defined$ You | RememberChosen$ True | SubAbility$ DBChoosePlayer + +SVar:DBChoosePlayer:DB$ ChoosePlayer | Choices$ Player.Opponent | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | AILogic$ LeastCreatures | SubAbility$ DBChoosePlayer2 + +#needed to set ChosenPlayer to be ChosenCardController +SVar:DBChoosePlayer2:DB$ ChoosePlayer | Choices$ ChosenCardController | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | AILogic$ LeastCreatures | SubAbility$ DBChooseCard2 + +SVar:DBChooseCard2:DB$ ChooseCard | Choices$ Creature.YouCtrl | ChoiceZone$ Graveyard | Defined$ ChosenPlayer | AILogic$ WorstCard | Mandatory$ True | RememberChosen$ True | SubAbility$ DBReturn + +#Add AILogic for Optional +SVar:DBReturn:DB$ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | Optional$ True | OptionQuestion$ Return TARGETS from graveyard to battlefield under their owners' control? | SubAbility$ DBCleanup + +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearChosenPlayer$ True | ClearRemembered$ True + +SVar:X:Count$ValidGraveyard Card.Chosen + +SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnbreak_reclaimer.jpg +Oracle:Flying\nAt the beginning of your end step, choose a creature card in an opponent's graveyard, then that player chooses a creature card in your graveyard. You may return those cards to the battlefield under their owners' control.