diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index 9218875ee94..13dd7ccbec8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -18,6 +18,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.card.CardPredicates.Presets; import forge.game.card.CounterType; import forge.game.combat.Combat; @@ -230,6 +231,13 @@ public class ChooseCardAi extends SpellAbilityAi { Collections.reverse(creats); choice = creats.get(0); } + } else if ("NegativePowerFirst".equals(logic)) { + Card lowest = Aggregates.itemWithMin(options, CardPredicates.Accessors.fnGetNetPower); + if (lowest.getNetPower() <= 0) { + choice = lowest; + } else { + choice = ComputerUtilCard.getBestCreatureAI(options); + } } else if ("TangleWire".equals(logic)) { CardCollectionView betterList = CardLists.filter(options, new Predicate() { @Override diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index 73c151afb87..0c6aa92634c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -9,8 +9,10 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.card.CardPredicates.Presets; 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; @@ -87,6 +89,32 @@ public class ChooseCardEffect extends SpellAbilityEffect { } } } + } else if (sa.hasParam("WithTotalPower")){ + final int totP = AbilityUtils.calculateAmount(host, sa.getParam("WithTotalPower"), sa); + CardCollection creature = new CardCollection(p.getCreaturesInPlay()); + CardCollection chosenPool = new CardCollection(); + int chosenP = 0; + while (!creature.isEmpty()) { + if (Aggregates.min(creature, CardPredicates.Accessors.fnGetNetPower) + chosenP > totP) { + break; + } + Card c = p.getController().chooseSingleEntityForEffect(creature, sa, + "Select a card\r\n(Selected:" + chosenPool + ")\r\n" + "(Total Power: " + chosenP + ")", true); + if (c == null) { + if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, "Cancel Choose?")) { + break; + } + } else { + chosenP += c.getNetPower(); + if (chosenP <= totP) { + chosenPool.add(c); + creature.remove(c); + } else { + break; + } + } + } + chosen.addAll(chosenPool); } else if ((tgt == null) || p.canBeTargetedBy(sa)) { if (sa.hasParam("AtRandom") && !choices.isEmpty()) { Aggregates.random(choices, validAmount, chosen); diff --git a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java index 2caf2ff3a5d..19f66c5017e 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java +++ b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java @@ -12,6 +12,7 @@ public enum PlayerActionConfirmMode { ChangeZoneFromAltSource, ChangeZoneGeneral, BidLife, + OptionalChoose, Tribute; // Ripple; diff --git a/forge-gui/res/cardsfolder/upcoming/awakened_amalgam.txt b/forge-gui/res/cardsfolder/upcoming/awakened_amalgam.txt new file mode 100644 index 00000000000..1c443b67270 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/awakened_amalgam.txt @@ -0,0 +1,8 @@ +Name:Awakened Amalgam +ManaCost:4 +Types:Artifact Creature Golem +PT:*/* +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of differently named lands you control. +SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield +SVar:Picture:http://www.wizards.com/global/images/magic/general/awakened_amalgam.jpg +Oracle:Awakened Amalgam's power and toughness are each equal to the number of differently named lands you control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/slaughter_the_strong.txt b/forge-gui/res/cardsfolder/upcoming/slaughter_the_strong.txt new file mode 100644 index 00000000000..4022eaae51e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slaughter_the_strong.txt @@ -0,0 +1,10 @@ +Name:Slaughter the Strong +ManaCost:1 W W +Types:Sorcery +A:SP$ RepeatEach | Cost$ 1 W W | RepeatPlayers$ Player | RepeatSubAbility$ ChooseCrtr | SubAbility$ SacAllOthers | SpellDescription$ Each player chooses any number of creatures he or she controls with total power 4 or less, then sacrifices all other creatures he or she controls. +SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | WithTotalPower$ 4 | RememberChosen$ True | AILogic$ NegativePowerFirst +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_the_strong.jpg +Oracle:Each player chooses any number of creatures he or she controls with total power 4 or less, then sacrifices all other creatures he or she controls. \ No newline at end of file