diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 0e437228dcd..a237a6fdcf5 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -64,12 +64,7 @@ import mage.client.util.Config; import mage.client.util.GameManager; import mage.client.util.PhaseManager; import mage.util.Logging; -import mage.view.AbilityPickerView; -import mage.view.CardsView; -import mage.view.ExileView; -import mage.view.GameView; -import mage.view.PlayerView; -import mage.view.RevealedView; +import mage.view.*; /** * @@ -82,6 +77,7 @@ public class GamePanel extends javax.swing.JPanel { private Map players = new HashMap(); private Map exiles = new HashMap(); private Map revealed = new HashMap(); + private Map lookedAt = new HashMap(); private UUID gameId; private UUID playerId; private Session session; @@ -340,6 +336,7 @@ public class GamePanel extends javax.swing.JPanel { exiles.get(exile.getId()).loadCards(exile, bigCard, gameId); } showRevealed(game); + showLookedAt(game); if (game.getCombat().size() > 0) { combat.showDialog(game.getCombat()); } @@ -363,6 +360,19 @@ public class GamePanel extends javax.swing.JPanel { } } + private void showLookedAt(GameView game) { + for (ShowCardsDialog looked: lookedAt.values()) { + looked.clearReloaded(); + } + for (LookedAtView looked: game.getLookedAt()) { + if (!lookedAt.containsKey(looked.getName())) { + ShowCardsDialog newReveal = new ShowCardsDialog(); + lookedAt.put(looked.getName(), newReveal); + } + lookedAt.get(looked.getName()).loadCards("LookedAt by " + looked.getName(), looked.getCards(), bigCard, Config.dimensions, gameId, false); + } + } + public void ask(String question, GameView gameView) { updateGame(gameView); this.feedbackPanel.getFeedback(FeedbackMode.QUESTION, question, true, false, null); diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index 91992a3fb43..f040c289cfa 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -59,6 +59,7 @@ public class GameView implements Serializable { private CardsView stack = new CardsView(); private List exiles = new ArrayList(); private List revealed = new ArrayList(); + private List lookedAt = new ArrayList(); private List combat = new ArrayList(); private TurnPhase phase; private PhaseStep step; @@ -139,6 +140,14 @@ public class GameView implements Serializable { return revealed; } + public List getLookedAt() { + return lookedAt; + } + + public void setLookedAt(List list) { + this.lookedAt = list; + } + public List getCombat() { return combat; } diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 9920d8e0ef5..4ed2af76fa2 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -29,6 +29,8 @@ package mage.server.game; import java.io.BufferedOutputStream; + +import mage.game.LookedAt; import mage.server.TableManager; import java.io.File; import java.io.FileOutputStream; @@ -61,9 +63,7 @@ import mage.players.Player; import mage.server.ChatManager; import mage.server.util.ThreadExecutor; import mage.sets.Sets; -import mage.view.AbilityPickerView; -import mage.view.CardsView; -import mage.view.GameView; +import mage.view.*; import mage.view.ChatMessage.MessageColor; import org.apache.log4j.Logger; @@ -414,6 +414,13 @@ public class GameController implements GameCallback { public GameView getGameView(UUID playerId) { GameView gameView = new GameView(game.getState(), game); gameView.setHand(new CardsView(game.getPlayer(playerId).getHand().getCards(game))); + + List list = new ArrayList(); + for (Entry entry : game.getState().getLookedAt(playerId).entrySet()) { + list.add(new LookedAtView(entry.getKey(), entry.getValue(), game)); + } + gameView.setLookedAt(list); + return gameView; } diff --git a/Mage.Sets/src/mage/sets/magic2010/HauntingEchoes.java b/Mage.Sets/src/mage/sets/magic2010/HauntingEchoes.java index 52ca8be8093..c1da07b0de1 100644 --- a/Mage.Sets/src/mage/sets/magic2010/HauntingEchoes.java +++ b/Mage.Sets/src/mage/sets/magic2010/HauntingEchoes.java @@ -106,7 +106,7 @@ class HauntingEchoesEffect extends OneShotEffect { for (UUID cardId: remove) { game.getExile().add(player.getLibrary().remove(cardId, game)); } - game.getPlayer(source.getControllerId()).lookAtCards(new CardsImpl(Zone.PICK, player.getLibrary().getCards(game)), game); + game.getPlayer(source.getControllerId()).lookAtCards("Haunting Echoes", new CardsImpl(Zone.PICK, player.getLibrary().getCards(game)), game); player.shuffleLibrary(game); return true; } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SeaGateOracle.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SeaGateOracle.java index d9e4dc6656e..a42e068e87b 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SeaGateOracle.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SeaGateOracle.java @@ -109,7 +109,7 @@ class SeaGateOracleEffect extends OneShotEffect { game.setZone(card.getId(), Zone.PICK); TargetCard target = new TargetCard(Zone.PICK, filter); target.setRequired(true); - player.lookAtCards(cards, game); + player.lookAtCards("Sea Gate Oracle", cards, game); player.choose(Outcome.Benefit, cards, target, game); card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/worldwake/JaceTheMindSculptor.java b/Mage.Sets/src/mage/sets/worldwake/JaceTheMindSculptor.java index 0f58fe86139..b6e92dad132 100644 --- a/Mage.Sets/src/mage/sets/worldwake/JaceTheMindSculptor.java +++ b/Mage.Sets/src/mage/sets/worldwake/JaceTheMindSculptor.java @@ -118,7 +118,7 @@ class JaceTheMindSculptorEffect1 extends OneShotEffect { private SpellStack stack; private Exile exile; private Revealed revealed; + private Map lookedAt = new HashMap(); private Battlefield battlefield; private int turnNum; private boolean gameOver; @@ -99,6 +100,7 @@ public class GameState implements Serializable, Copyable { stack = new SpellStack(); exile = new Exile(); revealed = new Revealed(); + lookedAt = new HashMap(); battlefield = new Battlefield(); effects = new ContinuousEffects(); triggers = new TriggeredAbilities(); @@ -118,6 +120,9 @@ public class GameState implements Serializable, Copyable { this.stack = state.stack.copy(); this.exile = state.exile.copy(); this.revealed = state.revealed.copy(); + for (UUID key: state.lookedAt.keySet()) { + lookedAt.put(key, state.lookedAt.get(key)); + } this.battlefield = state.battlefield.copy(); this.turnNum = state.turnNum; this.gameOver = state.gameOver; @@ -207,6 +212,15 @@ public class GameState implements Serializable, Copyable { return revealed; } + public LookedAt getLookedAt(UUID playerId) { + if (lookedAt.get(playerId) == null) { + LookedAt l = new LookedAt(); + lookedAt.put(playerId, l); + return l; + } + return lookedAt.get(playerId); + } + public Turn getTurn() { return turn; } diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 27cbecb378d..0cd4b2a2a33 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -130,7 +130,7 @@ public interface Player extends MageItem, Copyable { public void abort(); public void revealCards(String name, Cards cards, Game game); - public void lookAtCards(Cards cards, Game game); + public void lookAtCards(String name, Cards cards, Game game); @Override public Player copy(); diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 87c36588668..5c336e1ddc1 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -539,7 +539,8 @@ public abstract class PlayerImpl> implements Player, Ser } @Override - public void lookAtCards(Cards cards, Game game) { + public void lookAtCards(String name, Cards cards, Game game) { + game.getState().getLookedAt(this.playerId).add(name, cards); game.fireLookAtCardsEvent(playerId, this.name + " looking at", cards); }