diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index ce9b5762d47..53d0f022f53 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -394,6 +394,17 @@ public class GuiDesktop implements IGuiBase { return FControl.instance.getObservedGame(); } + @Override + public boolean openZone(ZoneType zoneType, Set players) { + switch (zoneType) { + case Battlefield: + case Hand: + return true; //don't actually need to open anything, but indicate that zone can be opened + default: + return false; + } + } + @Override public void updateZones(List> zonesToUpdate) { CMatchUI.SINGLETON_INSTANCE.updateZones(zonesToUpdate); diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 764b9a7f003..c9204dd391c 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -42,7 +42,9 @@ import forge.item.PaperCard; import forge.match.input.InputQueue; import forge.properties.ForgeConstants; import forge.screens.match.FControl; +import forge.screens.match.views.VPlayerPanel; import forge.screens.match.views.VPhaseIndicator.PhaseLabel; +import forge.screens.match.views.VPlayerPanel.InfoTab; import forge.screens.match.winlose.ViewWinLose; import forge.screens.quest.QuestMenu; import forge.sound.AudioClip; @@ -324,6 +326,28 @@ public class GuiMobile implements IGuiBase { return FControl.getGame(); } + @Override + public boolean openZone(ZoneType zoneType, Set players) { + switch (zoneType) { + case Battlefield: + return true; //Battlefield is always open + default: + //open zone tab for given zone if needed + boolean result = true; + for (Player player : players) { + VPlayerPanel playerPanel = FControl.getPlayerPanel(player); + InfoTab zoneTab = playerPanel.getZoneTab(zoneType); + if (zoneTab == null) { + result = false; + } + else { + playerPanel.setSelectedTab(zoneTab); + } + } + return result; + } + } + @Override public void updateZones(List> zonesToUpdate) { FControl.updateZones(zonesToUpdate); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 92c3563a362..8d50cfe35be 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -91,7 +91,7 @@ public class VPlayerPanel extends FContainer { setSelectedTab(zoneTabs.get(zoneType)); } - private void setSelectedTab(InfoTab selectedTab0) { + public void setSelectedTab(InfoTab selectedTab0) { if (selectedTab == selectedTab0) { return; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 56c44a27c27..5e24d94627b 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -73,6 +73,7 @@ public interface IGuiBase { void enableOverlay(); void disableOverlay(); void finishGame(); + boolean openZone(ZoneType zoneType, Set players); void updateStack(); void updateZones(List> zonesToUpdate); void updateCards(Set cardsToUpdate); diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 636edecc0ff..e99f11a70f8 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -20,10 +20,12 @@ package forge.player; import com.google.common.base.Predicate; import com.google.common.collect.Lists; +import forge.GuiBase; import forge.game.Game; import forge.game.GameObject; import forge.game.card.Card; import forge.game.card.CardLists; +import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; @@ -34,7 +36,9 @@ import forge.util.Aggregates; import forge.util.gui.SGuiChoose; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** *

@@ -68,8 +72,9 @@ public class TargetSelection { public final boolean chooseTargets(Integer numTargets) { TargetRestrictions tgt = getTgt(); final boolean canTarget = tgt != null && tgt.doesTarget(); - if( !canTarget ) + if (!canTarget) { throw new RuntimeException("TargetSelection.chooseTargets called for ability that does not target - " + ability); + } // Number of targets is explicitly set only if spell is being redirected (ex. Swerve or Redirect) final int minTargets = numTargets != null ? numTargets.intValue() : tgt.getMinTargets(ability.getHostCard(), ability); @@ -101,18 +106,21 @@ public class TargetSelection { List candidates = tgt.getAllCandidates(this.ability, true); GameObject choice = Aggregates.random(candidates); return ability.getTargets().add(choice); - } else if (zone.size() == 1 && zone.get(0) == ZoneType.Stack) { + } + else if (zone.size() == 1 && zone.get(0) == ZoneType.Stack) { // If Zone is Stack, the choices are handled slightly differently. // Handle everything inside function due to interaction with StackInstance return this.chooseCardFromStack(mandatory); - } else { + } + else { List validTargets = this.getValidCardsToTarget(); - if (zone.size() == 1 && (zone.get(0) == ZoneType.Battlefield || zone.get(0) == ZoneType.Hand)) { + if (zone.size() == 1 && GuiBase.getInterface().openZone(zone.get(0), getPlayersWithValidTargets(validTargets))) { InputSelectTargets inp = new InputSelectTargets(validTargets, ability, mandatory); inp.showAndWait(); choiceResult = !inp.hasCancelled(); bTargetingDone = inp.hasPressedOk(); - } else { + } + else { // for every other case an all-purpose GuiChoose choiceResult = this.chooseCardFromList(validTargets, true, mandatory); } @@ -121,7 +129,13 @@ public class TargetSelection { return choiceResult && chooseTargets(numTargets); } - + private Set getPlayersWithValidTargets(List validTargets) { + Set players = new HashSet(); + for (Card card : validTargets) { + players.add(card.getController()); + } + return players; + } // these have been copied over from CardFactoryUtil as they need two extra // parameters for target selection.