From d234975cde7ffce188211ca50368f9e73687cb6d Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 14 Jan 2014 04:40:40 +0000 Subject: [PATCH] - BNG: Added Nessian Wilds Ravager and Pharagax Giant --- .../java/forge/ai/ability/CountersPutAi.java | 36 +++++++++++++++++++ .../ability/effects/CountersPutEffect.java | 14 +++++++- .../src/main/java/forge/game/card/Card.java | 17 +++++++++ .../java/forge/game/card/CardFactoryUtil.java | 17 +++++++++ .../game/player/PlayerActionConfirmMode.java | 3 +- 5 files changed, 85 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-gui/src/main/java/forge/ai/ability/CountersPutAi.java index e2137ecff99..c00399e4da2 100644 --- a/forge-gui/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-gui/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1,10 +1,12 @@ package forge.ai.ability; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Random; import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; @@ -13,15 +15,18 @@ import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; 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; import forge.util.Aggregates; +import forge.util.Expressions; import forge.util.MyRandom; public class CountersPutAi extends SpellAbilityAi { @@ -344,4 +349,35 @@ public class CountersPutAi 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 player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + final Card source = sa.getSourceCard(); + if (mode == PlayerActionConfirmMode.Tribute && source.hasSVar("TributeAILogic")) { + final String logic = source.getSVar("TributeAILogic"); + for (final String tributeAI : logic.split(" & ")) { + String sVar = tributeAI.split(" ")[0]; + String comparator = tributeAI.split(" ")[1]; + String compareTo = comparator.substring(2); + int x = CardFactoryUtil.xCount(source, sVar); + int y = CardFactoryUtil.xCount(source, compareTo); + if (!Expressions.compare(x, comparator, y)) { + return false; + } + } + } + return true; + } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#chooseSinglePlayer(Player, SpellAbility, Collection) + */ + @Override + public Player chooseSinglePlayer(Player ai, SpellAbility sa, Collection options) { + // logic? + return Iterables.getFirst(options, null); + } + } diff --git a/forge-gui/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-gui/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 5d02eb2cc7b..05e28686555 100644 --- a/forge-gui/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-gui/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -8,6 +8,8 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CounterType; +import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.Zone; @@ -62,6 +64,7 @@ public class CountersPutEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card card = sa.getSourceCard(); + final Player activator = sa.getActivatingPlayer(); CounterType counterType; @@ -77,7 +80,7 @@ public class CountersPutEffect extends SpellAbilityEffect { final int max = sa.hasParam("MaxFromEffect") ? Integer.parseInt(sa.getParam("MaxFromEffect")) : -1; if (sa.hasParam("UpTo")) { - counterAmount = sa.getActivatingPlayer().getController().chooseNumber(sa, "How many counters?", 0, counterAmount); + counterAmount = activator.getController().chooseNumber(sa, "How many counters?", 0, counterAmount); } List tgtCards = getDefinedCardsOrTargeted(sa); @@ -90,6 +93,15 @@ public class CountersPutEffect extends SpellAbilityEffect { } final Zone zone = tgtCard.getGame().getZoneOf(tgtCard); if (zone == null || zone.is(ZoneType.Battlefield) || zone.is(ZoneType.Stack)) { + if (sa.hasParam("Tribute")) { + String message = "Do you want to put " + tgtCard.getKeywordMagnitude("Tribute") + " +1/+1 counters on " + tgtCard + " ?"; + Player chooser = activator.getController().chooseSingleEntityForEffect(activator.getOpponents(), sa, "Choose an opponent"); + if (chooser.getController().confirmAction(sa, PlayerActionConfirmMode.Tribute, message)) { + tgtCard.setTributed(true); + } else { + continue; + } + } tgtCard.addCounter(counterType, counterAmount, true); if (remember) { final int value = tgtCard.getTotalCountersToAdd(); diff --git a/forge-gui/src/main/java/forge/game/card/Card.java b/forge-gui/src/main/java/forge/game/card/Card.java index f97fd5f3140..a984aa3eba2 100644 --- a/forge-gui/src/main/java/forge/game/card/Card.java +++ b/forge-gui/src/main/java/forge/game/card/Card.java @@ -179,6 +179,7 @@ public class Card extends GameEntity implements Comparable { private boolean bestow = false; private boolean suspendCast = false; private boolean suspend = false; + private boolean tributed = false; private boolean phasedOut = false; private boolean directlyPhasedOut = true; @@ -5640,6 +5641,10 @@ public class Card extends GameEntity implements Comparable { if (!this.hauntedBy.contains(source)) { return false; } + } else if (property.startsWith("notTributed")) { + if (this.tributed) { + return false; + } } else if (property.contains("Paired")) { if (property.contains("With")) { // PairedWith if (!this.isPaired() || this.pairedWith != source) { @@ -7716,6 +7721,18 @@ public class Card extends GameEntity implements Comparable { return this.evoked; } + /** + *

+ * Setter for the field tributed. + *

+ * + * @param b + * a boolean. + */ + public final void setTributed(final boolean b) { + this.tributed = b; + } + /** *

* Setter for the field monstrous. diff --git a/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java index 1479a3108ec..ac068a63daa 100644 --- a/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2516,6 +2516,23 @@ public class CardFactoryUtil { card.setSVar("EvolveAddCounter", abString); } + if (card.hasStartOfKeyword("Tribute")) { + final int tributeAmount = card.getKeywordMagnitude("Tribute"); + + final String actualRep = "Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self |" + + " ReplaceWith$ TributeAddCounter | Secondary$ True | Description$ Tribute " + + tributeAmount + " (As this creature enters the battlefield, an opponent of your" + + " choice may put " + tributeAmount + " +1/+1 counter on it.)"; + final String abString = "DB$ PutCounter | Defined$ ReplacedCard | Tribute$ True | " + + "CounterType$ P1P1 | CounterNum$ " + tributeAmount + + " | SubAbility$ TributeMoveToPlay"; + final String moveToPlay = "DB$ ChangeZone | Origin$ All | Destination$ Battlefield | " + + "Defined$ ReplacedCard | Hidden$ True"; + card.setSVar("TributeAddCounter", abString); + card.setSVar("TributeMoveToPlay", moveToPlay); + card.addReplacementEffect(ReplacementHandler.parseReplacement(actualRep, card, true)); + } + if (card.hasStartOfKeyword("Amplify")) { // find position of Amplify keyword final int ampPos = card.getKeywordPosition("Amplify"); diff --git a/forge-gui/src/main/java/forge/game/player/PlayerActionConfirmMode.java b/forge-gui/src/main/java/forge/game/player/PlayerActionConfirmMode.java index 64c42ea4f59..b7b1b879ad7 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerActionConfirmMode.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerActionConfirmMode.java @@ -10,7 +10,8 @@ public enum PlayerActionConfirmMode { FromOpeningHand, ChangeZoneToAltDestination, ChangeZoneFromAltSource, - ChangeZoneGeneral; + ChangeZoneGeneral, + Tribute; // Ripple;