diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 7ad6251209f..c2ecedfa69a 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import forge.game.event.GameEventCardForetold; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicate; @@ -2853,6 +2854,7 @@ public class CardFactoryUtil { } String sb = TextUtil.concatWithSpace(getActivatingPlayer().toString(),"has foretold."); game.getGameLog().add(GameLogEntryType.STACK_RESOLVE, sb); + game.fireEvent(new GameEventCardForetold(getActivatingPlayer())); } }; final StringBuilder sbDesc = new StringBuilder(); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardForetold.java b/forge-game/src/main/java/forge/game/event/GameEventCardForetold.java new file mode 100644 index 00000000000..fa54baa77df --- /dev/null +++ b/forge-game/src/main/java/forge/game/event/GameEventCardForetold.java @@ -0,0 +1,25 @@ +package forge.game.event; + +import forge.game.player.Player; +import forge.util.TextUtil; + +public class GameEventCardForetold extends GameEvent { + public final Player activatingPlayer; + + public GameEventCardForetold(Player player) { + activatingPlayer = player; + } + + @Override + public T visit(IGameEventVisitor visitor) { + return visitor.visit(this); + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return activatingPlayer.getName()+" has foretold."; + } +} diff --git a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java index 6293b76555e..72672f003fa 100644 --- a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java +++ b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java @@ -53,6 +53,7 @@ public interface IGameEventVisitor { T visit(GameEventTurnEnded event); T visit(GameEventTurnPhase event); T visit(GameEventZone event); + T visit(GameEventCardForetold gameEventCardForetold); // This is base class for all visitors. @@ -105,5 +106,8 @@ public interface IGameEventVisitor { public T visit(GameEventTurnPhase event) { return null; } public T visit(GameEventPlayerDamaged event) { return null; } public T visit(GameEventZone event) { return null; } + public T visit(GameEventCardForetold gameEventCardForetold) { + return null; + } } } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index a59f8bf1d82..9c51f21bf82 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -353,8 +353,7 @@ public class MatchController extends AbstractGuiGame { final VPlayerPanel playerPanel = view.getPlayerPanel(player); playersWithTargetables.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it final InfoTab zoneTab = playerPanel.getZoneTab(zoneType); - ZoneType previousZone = playerPanel.getZoneByInfoTab(playerPanel.getSelectedTab()); - updates.add(new PlayerZoneUpdate(player, previousZone)); + updates.add(new PlayerZoneUpdate(player, zoneType)); if (zoneTab != null) { playerPanel.setSelectedTab(zoneTab); } diff --git a/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java index 4462eeef38a..e534f17a42d 100644 --- a/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java @@ -1,12 +1,10 @@ package forge.gui.control; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.eventbus.Subscribe; import forge.game.Game; @@ -36,11 +34,12 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { private final Set livesUpdate = new HashSet<>(); private final Set manaPoolUpdate = new HashSet<>(); private final PlayerZoneUpdates zonesUpdate = new PlayerZoneUpdates(); + private final Map playersWithValidTargets = Maps.newHashMap(); - private boolean processEventsQueued, needPhaseUpdate, needCombatUpdate, needStackUpdate, needPlayerControlUpdate, refreshFieldUpdate; + private boolean processEventsQueued, needPhaseUpdate, needCombatUpdate, needStackUpdate, needPlayerControlUpdate, refreshFieldUpdate, showExileUpdate; private boolean gameOver, gameFinished; private boolean needSaveState = false; - private PlayerView turnUpdate; + private PlayerView turnUpdate, activatingPlayer; public FControlGameEventHandler(final PlayerControllerHuman humanController0) { humanController = humanController0; @@ -112,6 +111,12 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { refreshFieldUpdate = false; matchController.refreshField(); } + if (showExileUpdate) { + showExileUpdate = false; + matchController.openZones(activatingPlayer, Collections.singleton(ZoneType.Exile), playersWithValidTargets); + activatingPlayer = null; + playersWithValidTargets.clear(); + } if (gameOver) { gameOver = false; humanController.getInputQueue().onGameOver(true); // this will unlock any game threads waiting for inputs to complete @@ -417,6 +422,14 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { return processCards(event.cards, cardsUpdate); } + @Override + public Void visit(final GameEventCardForetold event) { + showExileUpdate = true; + activatingPlayer = event.activatingPlayer.getView(); + playersWithValidTargets.put(activatingPlayer, null); + return processEvent(); + } + @Override public Void visit(final GameEventPlayerStatsChanged event) { final CardCollection cards = new CardCollection();