From eb0ac0dde9c3c3fde01715c34857da80055d4077 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 26 Jan 2014 04:56:56 +0000 Subject: [PATCH] - BNG: Added Whims of the Fates --- .gitattributes | 1 + .../src/main/java/forge/ai/AiController.java | 6 +- .../main/java/forge/game/ability/ApiType.java | 1 + .../ability/effects/MultiplePilesEffect.java | 104 ++++++++++++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java diff --git a/.gitattributes b/.gitattributes index d583c30f646..203498507ca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -342,6 +342,7 @@ forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java -text forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java -text forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java -text forge-game/src/main/java/forge/game/ability/effects/MillEffect.java -text +forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java -text forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java -text forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java -text forge-game/src/main/java/forge/game/ability/effects/OwnershipGainEffect.java -text diff --git a/forge-game/src/main/java/forge/ai/AiController.java b/forge-game/src/main/java/forge/ai/AiController.java index 0aa1b480585..0946236a8c0 100644 --- a/forge-game/src/main/java/forge/ai/AiController.java +++ b/forge-game/src/main/java/forge/ai/AiController.java @@ -986,7 +986,11 @@ public class AiController { if (max >= 3 && !result.contains(smallest)) { result.add(smallest); } - + + case MultiplePiles: + // Whims of the Fates {all, 0, 0} + result.addAll(pool); + break; default: for (int i = 0; i < max; i++) { Card c = player.getController().chooseSingleEntityForEffect(pool, sa, null, isOptional); diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index f544c82bacf..fd01fce00b3 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -77,6 +77,7 @@ public enum ApiType { ManaReflected (ManaReflectedEffect.class, CannotPlayAi.class), Mill (MillEffect.class, MillAi.class), MoveCounter (CountersMoveEffect.class, CountersMoveAi.class), + MultiplePiles (MultiplePilesEffect.class, CannotPlayAi.class), MustAttack (MustAttackEffect.class, MustAttackAi.class), MustBlock (MustBlockEffect.class, MustBlockAi.class), NameCard (ChooseCardNameEffect.class, ChooseCardNameAi.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java new file mode 100644 index 00000000000..d4746e31942 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -0,0 +1,104 @@ +package forge.game.ability.effects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import forge.game.ability.AbilityFactory; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardLists; +import forge.game.player.Player; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.TargetRestrictions; +import forge.game.zone.ZoneType; +import forge.util.Aggregates; + +public class MultiplePilesEffect extends SpellAbilityEffect { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) + */ + @Override + protected String getStackDescription(SpellAbility sa) { + final StringBuilder sb = new StringBuilder(); + + final List tgtPlayers = getTargetPlayers(sa); + + String valid = ""; + String piles = sa.getParam("Piles"); + if (sa.hasParam("ValidCards")) { + valid = sa.getParam("ValidCards"); + } + + sb.append("Separate all ").append(valid).append(" cards "); + + for (final Player p : tgtPlayers) { + sb.append(p).append(" "); + } + sb.append("controls into ").append(piles).append(" piles."); + return sb.toString(); + } + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + final Card source = sa.getSourceCard(); + final ZoneType zone = sa.hasParam("Zone") ? ZoneType.smartValueOf(sa.getParam("Zone")) : ZoneType.Battlefield; + final boolean randomChosen = sa.hasParam("RandomChosen"); + final int piles = Integer.parseInt(sa.getParam("Piles")); + final Map>> record = new HashMap>>(); + + String valid = ""; + if (sa.hasParam("ValidCards")) { + valid = sa.getParam("ValidCards"); + } + + final TargetRestrictions tgt = sa.getTargetRestrictions(); + final List tgtPlayers = getTargetPlayers(sa); + + for (final Player p : tgtPlayers) { + if ((tgt == null) || p.canBeTargetedBy(sa)) { + List pool; + if (sa.hasParam("DefinedCards")) { + pool = new ArrayList(AbilityUtils.getDefinedCards(source, sa.getParam("DefinedCards"), sa)); + } else { + pool = p.getCardsIn(zone); + } + pool = CardLists.getValidCards(pool, valid, source.getController(), source); + + List> pileList = new ArrayList>(); + + for (int i = 1; i < piles; i++) { + int size = pool.size(); + List pile = p.getController().chooseCardsForEffect(pool, sa, "Choose cards in Pile " + i, 0, size, false); + pileList.add(pile); + pool.removeAll(pile); + } + + pileList.add(pool); + p.getGame().getAction().nofityOfValue(sa, p, pileList.toString(), p); + record.put(p, pileList); + } + } + if (randomChosen) { + for (Entry>> ev : record.entrySet()) { + List chosen = Aggregates.random(ev.getValue()); + for (Card c : chosen) { + source.addRemembered(c); + } + } + final SpellAbility action = AbilityFactory.getAbility(source.getSVar(sa.getParam("ChosenPile")), source); + action.setActivatingPlayer(sa.getActivatingPlayer()); + ((AbilitySub) action).setParent(sa); + AbilityUtils.resolve(action); + source.clearRemembered(); + } + } +}