diff --git a/forge-game/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-game/src/main/java/forge/ai/ability/ChangeZoneAi.java index 2f5e63a6320..fa37f98f7d8 100644 --- a/forge-game/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-game/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1099,35 +1099,23 @@ public class ChangeZoneAi extends SpellAbilityAi { * a {@link forge.game.spellability.SpellAbility} object. * @param player * a {@link forge.game.player.Player} object. + * @param changeNum2 + * @param destination + * @param libraryPos2 + * @param origin2 */ - public static void hiddenOriginResolveAI(final Player ai, final SpellAbility sa, Player player) { - final TargetRestrictions tgt = sa.getTargetRestrictions(); + public static void hiddenOriginResolveAI(final Player ai, final SpellAbility sa, Player player, int changeNum, List origin, ZoneType destination, int libraryPos2) { + final Card source = sa.getSourceCard(); final boolean defined = sa.hasParam("Defined"); - final Player activator = sa.getActivatingPlayer(); final Game game = ai.getGame(); - if (tgt != null) { - if (sa.getTargets().isTargetingAnyPlayer()) { - player = sa.hasParam("DefinedPlayer") ? player : sa.getTargets().getFirstTargetedPlayer(); - if (!player.canBeTargetedBy(sa)) { - return; - } - } - } - - List origin = new ArrayList(); - if (sa.hasParam("Origin")) { - origin = ZoneType.listValueOf(sa.getParam("Origin")); - } String type = sa.getParam("ChangeType"); if (type == null) { type = "Card"; } - int changeNum = sa.hasParam("ChangeNum") ? AbilityUtils.calculateAmount(source, sa.getParam("ChangeNum"), - sa) : 1; List fetchList; boolean shuffleMandatory = true; @@ -1170,7 +1158,7 @@ public class ChangeZoneAi extends SpellAbilityAi { if (sa.hasParam("NoShuffle")) { shuffleMandatory = false; } - final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination")); + final List fetched = new ArrayList(); final boolean remember = sa.hasParam("RememberChanged"); final boolean forget = sa.hasParam("ForgetChanged"); @@ -1205,6 +1193,8 @@ public class ChangeZoneAi extends SpellAbilityAi { } else if (defined) { c = fetchList.get(0); } else { + final Player activator = sa.getActivatingPlayer(); + CardLists.shuffle(fetchList); // Save a card as a default, in case we can't find anything suitable. Card first = fetchList.get(0); @@ -1350,9 +1340,12 @@ public class ChangeZoneAi extends SpellAbilityAi { } if (sa.hasParam("Attacking")) { - List defenders = game.getCombat().getDefenders(); - if ( !defenders.isEmpty() ) - game.getCombat().addAttacker(c, defenders.get(0)); + final Combat combat = game.getCombat(); + if ( null != combat ) { + final List e = combat.getDefenders(); + final GameEntity defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare " + c); + combat.addAttacker(c, defender); + } } if (sa.hasParam("Blocking")) { final Combat combat = game.getCombat(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 04795f3ad67..895be4a71ea 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -556,7 +556,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { * @param sa * a {@link forge.game.spellability.SpellAbility} object. */ - private static void changeHiddenOriginResolve(final SpellAbility sa) { + private void changeHiddenOriginResolve(final SpellAbility sa) { List fetchers; if (sa.hasParam("DefinedPlayer")) { @@ -585,33 +585,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (decider == null) { decider = player; } - if (decider.isHuman()) { - changeHiddenOriginResolveHuman(decider, sa, player); - } else { - ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player); - } + changeZonePlayerInvariant(decider, sa, player); } } - - /** - *

- * changeHiddenOriginResolveHuman. - *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. - * @param sa - * a {@link forge.game.spellability.SpellAbility} object. - * @param player - * a {@link forge.game.player.Player} object. - */ - private static void changeHiddenOriginResolveHuman(final Player decider, final SpellAbility sa, Player player) { - final Card source = sa.getSourceCard(); - final List movedCards = new ArrayList(); - final boolean defined = sa.hasParam("Defined"); - final boolean optional = sa.hasParam("Optional"); - final Game game = player.getGame(); - + + private void changeZonePlayerInvariant(Player decider, SpellAbility sa, Player player) { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { final List players = Lists.newArrayList(sa.getTargets().getTargetPlayers()); @@ -620,14 +598,15 @@ public class ChangeZoneEffect extends SpellAbilityEffect { return; } } + List origin = new ArrayList(); if (sa.hasParam("Origin")) { origin = ZoneType.listValueOf(sa.getParam("Origin")); } - - ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination")); + final Card source = sa.getSourceCard(); + // this needs to be zero indexed. Top = 0, Third = 2 int libraryPos = sa.hasParam("LibraryPosition") ? AbilityUtils.calculateAmount(source, sa.getParam("LibraryPosition"), sa) : 0; @@ -658,12 +637,26 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } - int changeNum = sa.hasParam("ChangeNum") ? AbilityUtils.calculateAmount(source, sa.getParam("ChangeNum"), - sa) : 1; + final boolean defined = sa.hasParam("Defined"); + int changeNum = sa.hasParam("ChangeNum") ? AbilityUtils.calculateAmount(source, sa.getParam("ChangeNum"), sa) : 1; + final boolean optional = sa.hasParam("Optional"); if( optional && !decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, defined ? "Put that card from " + origin + "to " + destination : "Search " + origin + "?")) return; + if (decider.isHuman()) { + changeHiddenOriginResolveHuman(decider, sa, player, changeNum, origin, destination, libraryPos); + } else { + ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player, changeNum, origin, destination, libraryPos); + } + } + + private static void changeHiddenOriginResolveHuman(final Player decider, final SpellAbility sa, Player player, int changeNum, List origin, ZoneType destination, int libraryPos) { + final Card source = sa.getSourceCard(); + final boolean defined = sa.hasParam("Defined"); + final Game game = player.getGame(); + + final List movedCards = new ArrayList(); List fetchList; boolean shuffleMandatory = true;