From 650acf9e1e8d3b3af42501292a520901d916ae6d Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Mon, 22 Feb 2021 16:05:48 +0400 Subject: [PATCH] Test framework: fixed support of chooseAbilityForCast for commanders, added destroy target custom effect (#7593); --- .../src/mage/player/human/HumanPlayer.java | 4 +++- .../java/org/mage/test/player/TestPlayer.java | 3 ++- .../serverside/base/MageTestPlayerBase.java | 17 +++++++++++++++++ Mage/src/main/java/mage/players/PlayerImpl.java | 9 ++++++++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index a110c7c609..5b85ac9c26 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -2040,7 +2040,7 @@ public class HumanPlayer extends PlayerImpl { return null; } - MageObject object = game.getObject(card.getId()); + MageObject object = game.getObject(card.getId()); // must be object to find real abilities (example: commander) if (object != null) { String message = "Choose ability to cast" + (nonMana ? " for FREE" : "") + "
" + object.getLogName(); LinkedHashMap useableAbilities = getSpellAbilities(playerId, object, game.getState().getZone(object.getId()), game); @@ -2065,6 +2065,8 @@ public class HumanPlayer extends PlayerImpl { } } } + + // default ability (example: on disconnect or cancel) return card.getSpellAbility(); } diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 02e48baf35..eed3dc92f3 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -4146,7 +4146,8 @@ public class TestPlayer implements Player { public SpellAbility chooseAbilityForCast(Card card, Game game, boolean noMana) { assertAliasSupportInChoices(false); - Map useable = PlayerImpl.getSpellAbilities(this.getId(), card, game.getState().getZone(card.getId()), game); + MageObject object = game.getObject(card.getId()); // must be object to find real abilities (example: commander) + Map useable = PlayerImpl.getSpellAbilities(this.getId(), object, game.getState().getZone(object.getId()), game); String allInfo = useable.values().stream().map(Object::toString).collect(Collectors.joining("\n")); if (useable.size() == 1) { return (SpellAbility) useable.values().iterator().next(); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java index 1ed6be9e9c..c9bdd0da24 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java @@ -10,6 +10,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.cost.SpellsCostIncreasingAllEffect; import mage.abilities.effects.common.cost.SpellsCostReductionAllEffect; import mage.cards.Card; @@ -32,6 +33,7 @@ import mage.server.util.ConfigWrapper; import mage.server.util.PluginClassLoader; import mage.server.util.config.GamePlugin; import mage.server.util.config.Plugin; +import mage.target.TargetPermanent; import mage.target.common.TargetAnyTarget; import mage.util.CardUtil; import mage.util.Copier; @@ -467,6 +469,21 @@ public abstract class MageTestPlayerBase { ability ); } + + /** + * Add target destroy ability that can be called by text "target destroy" + * + * @param controller + */ + protected void addCustomEffect_DestroyTarget(TestPlayer controller) { + Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect().setText("target destroy"), new ManaCostsImpl("")); + ability.addTarget(new TargetPermanent()); + addCustomCardWithAbility( + "target destroy for " + controller.getName(), + controller, + ability + ); + } } // custom card with global abilities list to init (can contains abilities per card name) diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index f3b7debffc..a400dd71a5 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1521,7 +1521,14 @@ public abstract class PlayerImpl implements Player, Serializable { public static LinkedHashMap getSpellAbilities(UUID playerId, MageObject object, Zone zone, Game game) { LinkedHashMap useable = new LinkedHashMap<>(); - for (Ability ability : object.getAbilities()) { + Abilities allAbilities; + if (object instanceof Card) { + allAbilities = ((Card) object).getAbilities(game); + } else { + allAbilities = object.getAbilities(); + } + + for (Ability ability : allAbilities) { if (ability instanceof SpellAbility) { switch (((SpellAbility) ability).getSpellAbilityType()) { case BASE_ALTERNATE: