Lots of small fixes and cleanup for the GUI refactoring.

This commit is contained in:
elcnesh
2014-09-10 12:08:48 +00:00
parent b608d7e7a3
commit 574e12d2e3
24 changed files with 2435 additions and 2002 deletions

3
.gitattributes vendored
View File

@@ -16762,7 +16762,6 @@ forge-gui/src/main/java/forge/player/HumanPlay.java -text
forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java -text
forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java -text
forge-gui/src/main/java/forge/player/PlayerControllerHuman.java -text
forge-gui/src/main/java/forge/player/PlayerControllerLocal.java -text
forge-gui/src/main/java/forge/player/TargetSelection.java -text
forge-gui/src/main/java/forge/player/package-info.java -text
forge-gui/src/main/java/forge/properties/ForgeConstants.java -text
@@ -16847,10 +16846,12 @@ forge-gui/src/main/java/forge/util/gui/SGuiChoose.java -text
forge-gui/src/main/java/forge/util/gui/SGuiDialog.java -text
forge-gui/src/main/java/forge/util/gui/SOptionPane.java -text
forge-gui/src/main/java/forge/util/package-info.java -text
forge-gui/src/main/java/forge/view/Cache.java -text
forge-gui/src/main/java/forge/view/CardView.java -text
forge-gui/src/main/java/forge/view/CombatView.java -text
forge-gui/src/main/java/forge/view/GameEntityView.java -text
forge-gui/src/main/java/forge/view/IGameView.java -text
forge-gui/src/main/java/forge/view/LocalGameView.java -text
forge-gui/src/main/java/forge/view/PlayerView.java -text
forge-gui/src/main/java/forge/view/SpellAbilityView.java -text
forge-gui/src/main/java/forge/view/StackItemView.java -text

View File

@@ -67,7 +67,6 @@ import forge.model.FModel;
import forge.player.GamePlayerUtil;
import forge.player.LobbyPlayerHuman;
import forge.player.PlayerControllerHuman;
import forge.player.PlayerControllerLocal;
import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
@@ -95,6 +94,7 @@ import forge.util.NameGenerator;
import forge.view.FFrame;
import forge.view.FView;
import forge.view.IGameView;
import forge.view.LocalGameView;
import forge.view.PlayerView;
/**
@@ -452,12 +452,23 @@ public enum FControl implements KeyEventDispatcher {
final LobbyPlayer me = getGuiPlayer();
for (final Player p : game.getPlayers()) {
if (p.getLobbyPlayer().equals(me)) {
this.gameView = (IGameView) p.getController();
fcVisitor = new FControlGameEventHandler((PlayerControllerHuman) p.getController());
final PlayerControllerHuman controller = (PlayerControllerHuman) p.getController();
this.gameView = controller.getGameView();
this.fcVisitor = new FControlGameEventHandler(GuiBase.getInterface(), controller.getGameView());
break;
}
}
if (this.gameView == null) {
// Watch game but do not participate
final LocalGameView gameView = new LocalGameView(game);
this.gameView = gameView;
this.fcVisitor = new FControlGameEventHandler(GuiBase.getInterface(), gameView);
this.playbackControl = new FControlGamePlayback(GuiBase.getInterface(), gameView);
this.playbackControl.setGame(game);
this.game.subscribeToEvents(playbackControl);
}
attachToGame(this.gameView);
// It's important to run match in a different thread to allow GUI inputs to be invoked from inside game.
@@ -523,20 +534,12 @@ public enum FControl implements KeyEventDispatcher {
// Listen to DuelOutcome event to show ViewWinLose
game0.subscribeToEvents(fcVisitor);
// Add playback controls to match if needed
if (localPlayer == null) {
// Create dummy controller
final PlayerControllerHuman controller =
new PlayerControllerLocal(game, null, humanLobbyPlayer, GuiBase.getInterface());
playbackControl = new FControlGamePlayback(controller);
playbackControl.setGame(game);
game0.subscribeToEvents(playbackControl);
}
// per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch
//Set Field shown to current player.
final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(localPlayer);
SDisplayUtil.showTab(nextField);
if (localPlayer != null) {
final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(localPlayer);
SDisplayUtil.showTab(nextField);
}
}
/* (non-Javadoc)

View File

@@ -168,7 +168,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
int i = 0;
for (final PlayerView p : sortedPlayers) {
if (p.getLobbyPlayer() == localPlayer) {
if (localPlayer == null || p.getLobbyPlayer() == localPlayer) {
VHand newHand = new VHand(EDocID.Hands[i], p);
newHand.getLayoutControl().initialize();
hands.add(newHand);
@@ -176,11 +176,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
i++;
}
if (hands.isEmpty()) { // add empty hand for matches without human
VHand newHand = new VHand(EDocID.Hands[0], null);
newHand.getLayoutControl().initialize();
hands.add(newHand);
}
view.setHandViews(hands);
}
@@ -277,7 +272,8 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
*/
public final boolean stopAtPhase(final PlayerView turn, final PhaseType phase) {
VField vf = getFieldViewFor(turn);
PhaseLabel label = vf.getPhaseIndicator().getLabelFor(phase);
PhaseLabel label = vf.getPhaseIndicator()
.getLabelFor(phase);
return label == null || label.getEnabled();
}
@@ -367,7 +363,10 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
} else if (zt == ZoneType.Ante) {
CAntes.SINGLETON_INSTANCE.update();
} else {
getFieldViewFor(owner).getDetailsPanel().updateZones();
final VField vf = getFieldViewFor(owner);
if (vf != null) {
vf.getDetailsPanel().updateZones();
}
}
}
}

View File

@@ -193,7 +193,7 @@ public class VAssignDamage {
DamageTarget dt = new DamageTarget(null, new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build());
this.damage.put(null, dt);
this.defenders.add(dt);
final CardView fakeCard;
CardView fakeCard = null;
if (defender instanceof CardView)
fakeCard = (CardView)defender;
else if (defender instanceof PlayerView) {
@@ -201,11 +201,10 @@ public class VAssignDamage {
fakeCard.getOriginal().setName(this.defender.toString());
final PlayerView p = (PlayerView)defender;
fakeCard.setOwner(p);
fakeCard.setController(p);
fakeCard.getOriginal().setImageKey(CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getLobbyPlayer()));
} else {
fakeCard = new CardView(true);
fakeCard.getOriginal().setName(this.defender.toString());
}
addPanelForDefender(pnlDefenders, fakeCard);
}

View File

@@ -20,6 +20,7 @@ package forge.screens.match.views;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
@@ -66,7 +67,7 @@ public class VCommand implements IVDoc<CCommand> {
// TODO player is hard-coded into tabletop...should be dynamic
// (haven't looked into it too deeply). Doublestrike 12-04-12
tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0, player);
tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0, player, ZoneType.Command);
control = new CCommand(player, this);

View File

@@ -29,6 +29,7 @@ import javax.swing.border.LineBorder;
import net.miginfocom.swing.MigLayout;
import forge.LobbyPlayer;
import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
@@ -95,7 +96,7 @@ public class VField implements IVDoc<CField> {
// TODO player is hard-coded into tabletop...should be dynamic
// (haven't looked into it too deeply). Doublestrike 12-04-12
tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1, player);
tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1, player, ZoneType.Battlefield);
control = new CField(player, this, playerViewer);

View File

@@ -29,6 +29,7 @@ import com.google.common.collect.Lists;
import forge.FThreads;
import forge.GuiBase;
import forge.game.zone.ZoneType;
import forge.screens.match.CMatchUI;
import forge.screens.match.controllers.CPrompt;
import forge.toolbox.FScrollPane;
@@ -78,6 +79,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
private int stackSpacingX, stackSpacingY;
private final PlayerView model;
private final ZoneType zone;
/**
* <p>
@@ -88,11 +90,12 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
* @param mirror
* @param player
*/
public PlayArea(final FScrollPane scrollPane, final boolean mirror, final PlayerView player) {
public PlayArea(final FScrollPane scrollPane, final boolean mirror, final PlayerView player, final ZoneType zone) {
super(scrollPane);
this.setBackground(Color.white);
this.mirror = mirror;
this.model = player;
this.zone = zone;
}
private final CardStackRow collectAllLands() {
@@ -593,13 +596,13 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
*/
public void setupPlayZone() {
FThreads.assertExecutedByEdt(GuiBase.getInterface(), true);
recalculateCardPanels(model);
recalculateCardPanels(model, zone);
}
private void recalculateCardPanels(final PlayerView model) {
private void recalculateCardPanels(final PlayerView model, final ZoneType zone) {
final List<CardView> modelCopy;
synchronized (model) {
modelCopy = Lists.newArrayList(model.getBfCards());
modelCopy = Lists.newArrayList(model.getCards(zone));
}
final List<CardView> oldCards = Lists.newArrayList();

View File

@@ -11,12 +11,14 @@ import com.badlogic.gdx.backends.lwjgl.LwjglClipboard;
import forge.Forge;
import forge.assets.AssetsDownloader;
import forge.interfaces.IDeviceAdapter;
import forge.properties.ForgeConstants;
import forge.util.FileUtil;
import forge.util.Utils;
public class Main {
public static void main(String[] args) {
String assetsDir = AssetsDownloader.SHARE_DESKTOP_ASSETS ? "../forge-gui/" : "testAssets/";
ForgeConstants.init(assetsDir);
if (!AssetsDownloader.SHARE_DESKTOP_ASSETS) {
FileUtil.ensureDirectoryExists(assetsDir);
}

View File

@@ -17,6 +17,7 @@ import forge.assets.ImageCache;
import forge.error.BugReporter;
import forge.error.ExceptionHandler;
import forge.interfaces.IDeviceAdapter;
import forge.interfaces.IGuiBase;
import forge.model.FModel;
import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences;
@@ -49,7 +50,7 @@ public class Forge implements ApplicationListener {
private static SplashScreen splashScreen;
private static KeyInputAdapter keyInputAdapter;
private static boolean exited;
private static final SoundSystem soundSystem = new SoundSystem(GuiBase.getInterface());
private static SoundSystem soundSystem;
private static final Stack<FScreen> screens = new Stack<FScreen>();
public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0) {
@@ -57,7 +58,9 @@ public class Forge implements ApplicationListener {
ForgeConstants.init(assetDir0);
clipboard = clipboard0;
deviceAdapter = deviceAdapter0;
GuiBase.setInterface(new GuiMobile());
final IGuiBase gui = new GuiMobile();
GuiBase.setInterface(gui);
soundSystem = new SoundSystem(gui);
}
return app;
}

View File

@@ -35,6 +35,7 @@ import forge.interfaces.IButton;
import forge.interfaces.IGuiBase;
import forge.item.PaperCard;
import forge.match.input.InputQueue;
import forge.player.LobbyPlayerHuman;
import forge.properties.ForgeConstants;
import forge.screens.match.FControl;
import forge.screens.match.views.VPlayerPanel;
@@ -442,9 +443,10 @@ public class GuiMobile implements IGuiBase {
Gdx.net.openURI(url);
}
private final LobbyPlayer guiPlayer = new LobbyPlayerHuman("Human", this);
@Override
public LobbyPlayer getGuiPlayer() {
return FControl.getGuiPlayer();
return guiPlayer;
}
@Override

View File

@@ -54,7 +54,6 @@ import forge.game.zone.ZoneType;
import forge.match.input.InputPlaybackControl;
import forge.match.input.InputQueue;
import forge.model.FModel;
import forge.player.LobbyPlayerHuman;
import forge.player.PlayerControllerHuman;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
@@ -79,6 +78,7 @@ import forge.view.CardView.CardStateView;
import forge.view.CombatView;
import forge.view.GameEntityView;
import forge.view.IGameView;
import forge.view.LocalGameView;
import forge.view.PlayerView;
public class FControl {
@@ -247,14 +247,14 @@ public class FControl {
}
final PlayerControllerHuman humanController = (PlayerControllerHuman) localPlayer.getController();
gameView = (IGameView) humanController;
fcVisitor = new FControlGameEventHandler(humanController);
playbackControl = new FControlGamePlayback(humanController);
final LocalGameView localGameView = humanController.getGameView();
gameView = localGameView;
fcVisitor = new FControlGameEventHandler(GuiBase.getInterface(), localGameView);
for (Player p : sortedPlayers) {
playerPanels.add(new VPlayerPanel(humanController.getPlayerView(p)));
}
view = new MatchScreen(gameView, humanController.getPlayerView(localPlayer), playerPanels);
view = new MatchScreen(localGameView, humanController.getPlayerView(localPlayer), playerPanels);
}
private static List<Player> shiftPlayersPlaceLocalFirst(final List<Player> players, Player localPlayer) {
@@ -533,7 +533,9 @@ public class FControl {
inputQueue.onGameOver(false); //release any waiting input, effectively passing priority
}
playbackControl.onGameStopRequested();
if (playbackControl != null) {
playbackControl.onGameStopRequested();
}
}
public static void endCurrentGame() {
@@ -852,9 +854,8 @@ public class FControl {
return player;
}
private final static LobbyPlayer guiPlayer = new LobbyPlayerHuman("Human", GuiBase.getInterface());
public final static LobbyPlayer getGuiPlayer() {
return guiPlayer;
return GuiBase.getInterface().getGuiPlayer();
}
public static FImage getPlayerAvatar(final PlayerView p) {

View File

@@ -22,6 +22,7 @@ import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventAttackersDeclared;
import forge.game.event.GameEventBlockersDeclared;
import forge.game.event.GameEventCardAttachment;
import forge.game.event.GameEventCardChangeZone;
import forge.game.event.GameEventCardCounters;
import forge.game.event.GameEventCardDamaged;
import forge.game.event.GameEventCardPhased;
@@ -52,20 +53,21 @@ import forge.interfaces.IGuiBase;
import forge.match.input.ButtonUtil;
import forge.match.input.InputBase;
import forge.model.FModel;
import forge.player.PlayerControllerHuman;
import forge.properties.ForgePreferences.FPref;
import forge.util.Lang;
import forge.util.gui.SGuiChoose;
import forge.util.maps.MapOfLists;
import forge.view.CardView;
import forge.view.LocalGameView;
import forge.view.PlayerView;
public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
private final PlayerControllerHuman controller;
private final IGuiBase gui;
public FControlGameEventHandler(final PlayerControllerHuman controller) {
this.controller = controller;
this.gui = controller.getGui();
private final LocalGameView gameView;
public FControlGameEventHandler(final IGuiBase gui, final LocalGameView gameView) {
this.gui = gui;
this.gameView = gameView;
}
@Subscribe
@@ -99,7 +101,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override
public void run() {
combatUpdPlanned.set(false);
gui.showCombat(controller.getCombat());
gui.showCombat(gameView.getCombat());
}
});
return null;
@@ -110,7 +112,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
public Void visit(final GameEventTurnBegan event) {
if (FModel.getPreferences().getPrefBoolean(FPref.UI_STACK_CREATURES) && event.turnOwner != null) {
// anything except stack will get here
updateZone(Pair.of(controller.getPlayerView(event.turnOwner), ZoneType.Battlefield));
updateZone(Pair.of(gameView.getPlayerView(event.turnOwner), ZoneType.Battlefield));
}
if (turnUpdPlanned.getAndSet(true)) { return null; }
@@ -119,7 +121,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override
public void run() {
turnUpdPlanned.set(false);
gui.updateTurn(controller.getPlayerView(event.turnOwner));
gui.updateTurn(gameView.getPlayerView(event.turnOwner));
}
});
return null;
@@ -226,7 +228,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
public Void visit(GameEventZone event) {
if (event.player != null) {
// anything except stack will get here
updateZone(Pair.of(controller.getPlayerView(event.player), event.zoneType));
updateZone(Pair.of(gameView.getPlayerView(event.player), event.zoneType));
}
return null;
}
@@ -245,7 +247,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
}
private Void updateZone(final Zone z) {
return updateZone(Pair.of(controller.getPlayerView(z.getPlayer()), z.getZoneType()));
return updateZone(Pair.of(gameView.getPlayerView(z.getPlayer()), z.getZoneType()));
}
private Void updateZone(final Pair<PlayerView, ZoneType> kv) {
@@ -275,29 +277,29 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override
public Void visit(final GameEventCardTapped event) {
return updateSingleCard(controller.getCardView(event.card));
return updateSingleCard(gameView.getCardView(event.card));
}
@Override
public Void visit(final GameEventCardPhased event) {
return updateSingleCard(controller.getCardView(event.card));
return updateSingleCard(gameView.getCardView(event.card));
}
@Override
public Void visit(final GameEventCardDamaged event) {
return updateSingleCard(controller.getCardView(event.card));
return updateSingleCard(gameView.getCardView(event.card));
}
@Override
public Void visit(final GameEventCardCounters event) {
return updateSingleCard(controller.getCardView(event.card));
return updateSingleCard(gameView.getCardView(event.card));
}
@Override
public Void visit(final GameEventBlockersDeclared event) { // This is to draw icons on blockers declared by AI
for (MapOfLists<Card, Card> kv : event.blockers.values()) {
for (Collection<Card> blockers : kv.values()) {
updateManyCards(controller.getCardViews(blockers));
updateManyCards(gameView.getCardViews(blockers));
}
}
return super.visit(event);
@@ -312,7 +314,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
// Update all attackers.
// Although they might have been updated when they were apped, there could be someone with vigilance, not redrawn yet.
updateManyCards(controller.getCardViews(event.attackersMap.values()));
updateManyCards(gameView.getCardViews(event.attackersMap.values()));
return super.visit(event);
}
@@ -320,8 +322,8 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override
public Void visit(GameEventCombatEnded event) {
// This should remove sword/shield icons from combatants by the time game moves to M2
updateManyCards(controller.getCardViews(event.attackers));
updateManyCards(controller.getCardViews(event.blockers));
updateManyCards(gameView.getCardViews(event.attackers));
updateManyCards(gameView.getCardViews(event.blockers));
return null;
}
@@ -351,12 +353,19 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
return null;
}
@Override
public Void visit(GameEventCardChangeZone event) {
updateZone(event.from);
updateZone(event.to);
return null;
}
/* (non-Javadoc)
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventCardStatsChanged)
*/
@Override
public Void visit(GameEventCardStatsChanged event) {
final Iterable<CardView> cardViews = controller.getCardViews(event.cards);
final Iterable<CardView> cardViews = gameView.getCardViews(event.cards);
gui.refreshCardDetails(cardViews);
return updateManyCards(cardViews);
}
@@ -364,7 +373,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override
public Void visit(GameEventPlayerStatsChanged event) {
for (final Player p : event.players) {
gui.refreshCardDetails(controller.getCardViews(p.getAllCards()));
gui.refreshCardDetails(gameView.getCardViews(p.getAllCards()));
}
return null;
}
@@ -380,7 +389,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
private final Runnable updManaPool = new Runnable() {
@Override public void run() {
synchronized (manaPoolUpdate) {
gui.updateManaPool(controller.getPlayerViews(manaPoolUpdate));
gui.updateManaPool(gameView.getPlayerViews(manaPoolUpdate));
manaPoolUpdate.clear();
}
}
@@ -406,7 +415,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
private final Runnable updLives = new Runnable() {
@Override public void run() {
synchronized (livesUpdate) {
gui.updateLives(controller.getPlayerViews(livesUpdate));
gui.updateLives(gameView.getPlayerViews(livesUpdate));
livesUpdate.clear();
}
}

View File

@@ -18,8 +18,9 @@ import forge.game.event.GameEventSpellAbilityCast;
import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnPhase;
import forge.game.event.IGameEventVisitor;
import forge.interfaces.IGuiBase;
import forge.match.input.InputPlaybackControl;
import forge.player.PlayerControllerHuman;
import forge.view.LocalGameView;
public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
private InputPlaybackControl inputPlayback;
@@ -27,9 +28,11 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
private final CyclicBarrier gameThreadPauser = new CyclicBarrier(2);
private final PlayerControllerHuman controller;
public FControlGamePlayback(final PlayerControllerHuman controller) {
this.controller = controller;
private final IGuiBase gui;
private final LocalGameView gameView;
public FControlGamePlayback(final IGuiBase gui, final LocalGameView gameView) {
this.gui = gui;
this.gameView = gameView;
}
private Game game;
@@ -40,7 +43,7 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
public void setGame(Game game) {
this.game = game;
this.inputPlayback = new InputPlaybackControl(controller.getGui(), game, this);
this.inputPlayback = new InputPlaybackControl(gui, game, this);
}
@Subscribe
@@ -73,8 +76,8 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
*/
@Override
public Void visit(GameEventTurnPhase ev) {
boolean isUiToStop = controller.getGui().stopAtPhase(
controller.getPlayerView(ev.playerTurn), ev.phase);
boolean isUiToStop = gui.stopAtPhase(
gameView.getPlayerView(ev.playerTurn), ev.phase);
switch(ev.phase) {
case COMBAT_END:
@@ -99,13 +102,13 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
*/
@Override
public Void visit(GameEventGameFinished event) {
controller.getGui().getInputQueue().removeInput(inputPlayback);
gui.getInputQueue().removeInput(inputPlayback);
return null;
}
@Override
public Void visit(GameEventGameStarted event) {
controller.getGui().getInputQueue().setInput(inputPlayback);
gui.getInputQueue().setInput(inputPlayback);
return null;
}
@@ -117,11 +120,10 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
@Override
public Void visit(final GameEventSpellResolved event) {
FThreads.invokeInEdtNowOrLater(controller.getGui(), new Runnable() {
FThreads.invokeInEdtNowOrLater(gui, new Runnable() {
@Override
public void run() {
controller.getGui().setCard(
controller.getCardView(event.spell.getHostCard()));
gui.setCard(gameView.getCardView(event.spell.getHostCard()));
}
});
pauseForEvent(resolveDelay);
@@ -133,11 +135,10 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
*/
@Override
public Void visit(final GameEventSpellAbilityCast event) {
FThreads.invokeInEdtNowOrLater(controller.getGui(), new Runnable() {
FThreads.invokeInEdtNowOrLater(gui, new Runnable() {
@Override
public void run() {
controller.getGui().setCard(
controller.getCardView(event.sa.getHostCard()));
gui.setCard(gameView.getCardView(event.sa.getHostCard()));
}
});
pauseForEvent(castDelay);

View File

@@ -55,7 +55,7 @@ public class InputPassPriority extends InputSyncronizedBase {
public final void showMessage() {
showMessage(getTurnPhasePriorityMessage(player.getGame()));
chosenSa = null;
if (getController().canUndoLastAction()) { //allow undoing with cancel button if can undo last action
if (getController().getGameView().canUndoLastAction()) { //allow undoing with cancel button if can undo last action
ButtonUtil.update(getGui(), "OK", "Undo", true, true, true);
}
else { //otherwise allow ending turn with cancel button
@@ -77,7 +77,7 @@ public class InputPassPriority extends InputSyncronizedBase {
/** {@inheritDoc} */
@Override
protected final void onCancel() {
if (!getController().tryUndoLastAction()) { //undo if possible
if (!getController().getGameView().tryUndoLastAction()) { //undo if possible
//otherwise end turn
passPriority(new Runnable() {
@Override

View File

@@ -21,13 +21,13 @@ public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactor
@Override
public PlayerController createControllerFor(Player human) {
return new PlayerControllerLocal(human.getGame(), human, this, gui);
return new PlayerControllerHuman(human.getGame(), human, this, gui);
}
@Override
public Player createIngamePlayer(Game game) {
Player player = new Player(GuiDisplayUtil.personalizeHuman(getName()), game);
player.setFirstController(new PlayerControllerLocal(game, player, this, gui));
player.setFirstController(new PlayerControllerHuman(game, player, this, gui));
if (ForgePreferences.DEV_MODE && FModel.getPreferences().getPrefBoolean(FPref.DEV_UNLIMITED_LAND)) {
player.canCheatPlayUnlimitedLands = true;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -108,7 +108,7 @@ public final class ForgeConstants {
EDITOR_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.xml");
GAUNTLET_DIR = new FileLocation(_DEFAULTS_DIR, USER_DIR, "gauntlet/");
PICS_DIR = CACHE_DIR + "pics/";
PICS_DIR = CACHE_DIR + "pics/";
DB_DIR = CACHE_DIR + "db/";
FONTS_DIR = CACHE_DIR + "fonts/";
CACHE_TOKEN_PICS_DIR = PICS_DIR + "tokens/";
@@ -119,6 +119,7 @@ public final class ForgeConstants {
CACHE_BOOSTERBOX_PICS_DIR = PICS_DIR + "boosterboxes/";
CACHE_PRECON_PICS_DIR = PICS_DIR + "precons/";
CACHE_TOURNAMENTPACK_PICS_DIR = PICS_DIR + "tournamentpacks/";
QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt";;
PROFILE_DIRS = new String[] {
USER_DIR,

View File

@@ -30,7 +30,6 @@ import forge.game.event.GameEventTurnEnded;
import forge.game.event.IGameEventVisitor;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.interfaces.IGuiBase;
import forge.util.maps.MapOfLists;
/**
@@ -40,8 +39,8 @@ import forge.util.maps.MapOfLists;
public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> implements IUiEventVisitor<SoundEffectType> {
final LobbyPlayer player;
public EventVisualizer(final IGuiBase gui) {
this.player = gui.getGuiPlayer();
public EventVisualizer(final LobbyPlayer lobbyPlayer) {
this.player = lobbyPlayer;
}
public SoundEffectType visit(GameEventCardDamaged event) { return SoundEffectType.Damage; }

View File

@@ -29,7 +29,7 @@ public class SoundSystem {
public SoundSystem(final IGuiBase gui) {
this.gui = gui;
this.visualizer = new EventVisualizer(gui);
this.visualizer = new EventVisualizer(gui.getGuiPlayer());
}
private boolean isUsingAltSystem() {
return FModel.getPreferences().getPrefBoolean(FPref.UI_ALT_SOUND_SYSTEM);

View File

@@ -0,0 +1,61 @@
package forge.view;
import java.util.Collection;
import java.util.Map;
import com.google.common.collect.Maps;
public class Cache<K, V> {
private final Map<K, V> cache;
private final Map<V, K> inverseCache;
public Cache() {
this.cache = Maps.newHashMap();
this.inverseCache = Maps.newHashMap();
}
public boolean containsKey(final K key) {
return cache.containsKey(key);
}
/**
* @param key
* @return
* @see java.util.Map#get(java.lang.Object)
*/
public V get(final K key) {
return cache.get(key);
}
public K getKey(final V value) {
return inverseCache.get(value);
}
/**
* @param key
* @param value
* @return
* @see java.util.Map#put(java.lang.Object, java.lang.Object)
*/
public void put(final K key, final V value) {
if (key == null || value == null) {
return;
}
synchronized (this) {
if (inverseCache.containsKey(value)) {
cache.remove(inverseCache.get(value));
inverseCache.remove(value);
}
final V oldValue = cache.put(key, value);
inverseCache.remove(oldValue);
inverseCache.put(value, key);
}
}
public synchronized void retainAllKeys(final Collection<K> keys) {
cache.keySet().retainAll(keys);
inverseCache.values().retainAll(keys);
}
}

View File

@@ -77,6 +77,7 @@ public interface IGameView {
public abstract StackItemView peekStack();
public abstract boolean mayShowCard(CardView c);
public abstract boolean mayShowCardFace(CardView c);
// Auto-yield related methods
public abstract Iterable<String> getAutoYields();

View File

@@ -0,0 +1,671 @@
package forge.view;
import java.util.Collections;
import java.util.List;
import java.util.Observer;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.LobbyPlayer;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameLogEntry;
import forge.game.GameLogEntryType;
import forge.game.GameOutcome;
import forge.game.GameType;
import forge.game.card.Card;
import forge.game.card.CardFactoryUtil;
import forge.game.combat.AttackingBand;
import forge.game.combat.Combat;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.ZoneType;
import forge.util.ITriggerEvent;
public class LocalGameView implements IGameView {
private final Game game;
public LocalGameView(final Game game) {
this.game = game;
}
protected final Game getGame() {
return this.game;
}
/** Cache of players. */
private final Cache<Player, PlayerView> players = new Cache<>();
/** Cache of cards. */
private final Cache<Card, CardView> cards = new Cache<>();
/** Cache of spellabilities. */
private final Cache<SpellAbility, SpellAbilityView> spabs = new Cache<>();
/** Cache of stack items. */
private final Cache<SpellAbilityStackInstance, StackItemView> stackItems = new Cache<>();
/** Combat view. */
private final CombatView combatView = new CombatView();
/* (non-Javadoc)
* @see forge.view.IGameView#isCommander()
*/
@Override
public boolean isCommander() {
return game.getRules().hasAppliedVariant(GameType.Commander);
}
/* (non-Javadoc)
* @see forge.view.IGameView#getGameType()
*/
@Override
public GameType getGameType() {
return this.game.getMatch().getRules().getGameType();
}
@Override
public int getTurnNumber() {
return this.game.getPhaseHandler().getTurn();
}
@Override
public boolean isCommandZoneNeeded() {
return this.game.getMatch().getRules().getGameType().isCommandZoneNeeded();
}
@Override
public boolean isWinner(final LobbyPlayer p) {
return game.getOutcome() == null ? null : game.getOutcome().isWinner(p);
}
@Override
public LobbyPlayer getWinningPlayer() {
return game.getOutcome() == null ? null : game.getOutcome().getWinningLobbyPlayer();
}
@Override
public int getWinningTeam() {
return game.getOutcome() == null ? -1 : game.getOutcome().getWinningTeam();
}
/* (non-Javadoc)
* @see forge.view.IGameView#isFirstGameInMatch()
*/
@Override
public boolean isFirstGameInMatch() {
return this.game.getMatch().getPlayedGames().isEmpty();
}
@Override
public boolean isMatchOver() {
return this.game.getMatch().isMatchOver();
}
@Override
public int getNumGamesInMatch() {
return this.game.getMatch().getRules().getGamesPerMatch();
}
@Override
public int getNumPlayedGamesInMatch() {
return this.game.getMatch().getPlayedGames().size();
}
@Override
public Iterable<GameOutcome> getOutcomesOfMatch() {
return Iterables.unmodifiableIterable(this.game.getMatch().getPlayedGames());
}
@Override
public boolean isMatchWonBy(final LobbyPlayer p) {
return this.game.getMatch().isWonBy(p);
}
@Override
public int getGamesWonBy(LobbyPlayer p) {
return this.game.getMatch().getGamesWonBy(p);
}
@Override
public GameOutcome.AnteResult getAnteResult() {
return null;
}
/* (non-Javadoc)
* @see forge.view.IGameView#isCombatDeclareAttackers()
*/
@Override
public boolean isCombatDeclareAttackers() {
return game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS)
&& game.getCombat() != null;
}
/* (non-Javadoc)
* @see forge.view.IGameView#isGameOver()
*/
@Override
public boolean isGameOver() {
return game.isGameOver();
}
@Override
public int getPoisonCountersToLose() {
return game.getRules().getPoisonCountersToLose();
}
/* (non-Javadoc)
* @see forge.view.IGameView#subscribeToEvents(java.lang.Object)
*/
@Override
public void subscribeToEvents(final Object subscriber) {
game.subscribeToEvents(subscriber);
}
@Override
public CombatView getCombat() {
return getCombat(game.getCombat());
}
/* (non-Javadoc)
* @see forge.view.IGameView#getCombat()
*/
public CombatView getCombat(final Combat c) {
if (c == null) {
return null;
}
updateCombatView(c);
return combatView;
}
private final void updateCombatView(final Combat combat) {
combatView.reset();
for (final AttackingBand b : combat.getAttackingBands()) {
if (b == null) continue;
final GameEntity defender = combat.getDefenderByAttacker(b);
final List<Card> blockers = b.isBlocked() == null ? null : combat.getBlockers(b);
combatView.addAttackingBand(getCardViews(b.getAttackers()), getGameEntityView(defender), blockers == null ? null : getCardViews(blockers));
}
}
@Override
public void addLogObserver(final Observer o) {
game.getGameLog().addObserver(o);
}
@Override
public List<GameLogEntry> getLogEntries(final GameLogEntryType maxLogLevel) {
return game.getGameLog().getLogEntries(maxLogLevel);
}
@Override
public List<GameLogEntry> getLogEntriesExact(final GameLogEntryType logLevel) {
return game.getGameLog().getLogEntriesExact(logLevel);
}
public boolean canUndoLastAction() {
return false;
}
@Override
public boolean tryUndoLastAction() {
return false;
}
@Override
public void selectButtonOk() {
}
@Override
public void selectButtonCancel() {
}
@Override
public void confirm() {
}
@Override
public boolean passPriority() {
return false;
}
@Override
public boolean passPriorityUntilEndOfTurn() {
return false;
}
@Override
public void autoPassUntilEndOfTurn() {
}
@Override
public void useMana(final byte mana) {
}
@Override
public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) {
}
@Override
public boolean selectCard(final CardView card, final ITriggerEvent triggerEvent) {
return false;
}
@Override
public void selectAbility(final SpellAbilityView sa) {
}
/* (non-Javadoc)
* @see forge.view.IGameView#getGuiRegisteredPlayer(forge.LobbyPlayer)
*/
@Override
public RegisteredPlayer getGuiRegisteredPlayer(final LobbyPlayer p) {
for (final RegisteredPlayer player : game.getMatch().getPlayers()) {
if (player.getPlayer() == p) {
return player;
}
}
return null;
}
/* (non-Javadoc)
* @see forge.view.IGameView#getRegisteredPlayers()
*/
@Override
public List<PlayerView> getPlayers() {
return getPlayerViews(game.getRegisteredPlayers());
}
@Override
public PlayerView getPlayerTurn() {
return getPlayerView(game.getPhaseHandler().getPlayerTurn());
}
@Override
public PhaseType getPhase() {
return game.getPhaseHandler().getPhase();
}
/* (non-Javadoc)
* @see forge.view.IGameView#getStack()
*/
@Override
public List<StackItemView> getStack() {
final List<SpellAbilityStackInstance> stack = Lists.newArrayList(game.getStack());
final List<StackItemView> items = Collections.unmodifiableList(getStack(stack));
// clear the cache
stackItems.retainAllKeys(stack);
return items;
}
/* (non-Javadoc)
* @see forge.view.IGameView#peekStack()
*/
@Override
public StackItemView peekStack() {
final SpellAbilityStackInstance top =
Iterables.getFirst(game.getStack(), null);
if (top == null) {
return null;
}
return getStack(Lists.newArrayList(top)).iterator().next();
}
private List<StackItemView> getStack(final Iterable<SpellAbilityStackInstance> stack) {
synchronized (this) {
stackItems.retainAllKeys(Lists.newArrayList(stack));
final List<StackItemView> items = Lists.newLinkedList();
for (final SpellAbilityStackInstance si : stack) {
if (stackItems.containsKey(si)) {
items.add(stackItems.get(si));
} else {
items.add(getStackItemView(si));
}
}
return items;
}
}
public StackItemView getStackItemView(final SpellAbilityStackInstance si) {
final StackItemView newItem = new StackItemView(
si.getSpellAbility().toUnsuppressedString(),
si.getSpellAbility().getSourceTrigger(),
si.getStackDescription(), getCardView(si.getSourceCard()),
getPlayerView(si.getActivator()), getCardViews(si.getTargetChoices().getTargetCards()),
getPlayerViews(si.getTargetChoices().getTargetPlayers()), si.isAbility(), si.isOptionalTrigger());
stackItems.put(si, newItem);
return newItem;
}
public SpellAbilityStackInstance getStackItem(final StackItemView view) {
return stackItems.getKey(view);
}
public final GameEntityView getGameEntityView(final GameEntity e) {
if (e instanceof Card) {
return getCardView((Card)e);
} else if (e instanceof Player) {
return getPlayerView((Player)e);
}
return null;
}
private final Function<Player, PlayerView> FN_GET_PLAYER_VIEW = new Function<Player, PlayerView>() {
@Override
public PlayerView apply(final Player input) {
return getPlayerView(input);
}
};
public final List<PlayerView> getPlayerViews(final List<Player> players) {
return Lists.transform(players, FN_GET_PLAYER_VIEW);
}
public final Iterable<PlayerView> getPlayerViews(final Iterable<Player> players) {
return Iterables.transform(players, FN_GET_PLAYER_VIEW);
}
public PlayerView getPlayerView(final Player p) {
if (p == null) {
return null;
}
final PlayerView view;
if (players.containsKey(p)) {
view = players.get(p);
getPlayerView(p, view);
} else {
view = new PlayerView(p.getLobbyPlayer(), p.getController());
players.put(p, view);
getPlayerView(p, view);
view.setOpponents(getPlayerViews(p.getOpponents()));
}
return view;
}
private PlayerView getPlayerViewFast(final Player p) {
return players.get(p);
}
public Player getPlayer(final PlayerView p) {
return players.getKey(p);
}
private void getPlayerView(final Player p, final PlayerView view) {
view.setCommanderInfo(CardFactoryUtil.getCommanderInfo(p).trim().replace("\r\n", "; "));
view.setKeywords(p.getKeywords());
view.setLife(p.getLife());
view.setMaxHandSize(p.getMaxHandSize());
view.setNumDrawnThisTurn(p.getNumDrawnThisTurn());
view.setPoisonCounters(p.getPoisonCounters());
view.setPreventNextDamage(p.getPreventNextDamageTotalShields());
view.setHasUnlimitedHandSize(p.isUnlimitedHandSize());
view.setAnteCards(getCardViews(p.getCardsIn(ZoneType.Ante)));
view.setBfCards(getCardViews(p.getCardsIn(ZoneType.Battlefield)));
view.setCommandCards(getCardViews(p.getCardsIn(ZoneType.Command)));
view.setExileCards(getCardViews(p.getCardsIn(ZoneType.Exile)));
view.setFlashbackCards(getCardViews(p.getCardsActivableInExternalZones(false)));
view.setGraveCards(getCardViews(p.getCardsIn(ZoneType.Graveyard)));
view.setHandCards(getCardViews(p.getCardsIn(ZoneType.Hand)));
view.setLibraryCards(getCardViews(p.getCardsIn(ZoneType.Library)));
for (final byte b : MagicColor.WUBRGC) {
view.setMana(b, p.getManaPool().getAmountOfColor(b));
}
}
public CardView getCardView(final Card c) {
if (c == null) {
return null;
}
final Card cUi = c.getCardForUi();
final boolean isDisplayable = cUi == c;
CardView view = cards.get(c);
final boolean mayShow;
if (view != null) {
// Put here again to ensure the Card reference in the cache
// is not an outdated Card.
cards.put(c, view);
mayShow = mayShowCard(view);
} else {
view = new CardView(isDisplayable);
mayShow = mayShowCard(view);
if (isDisplayable && mayShow) {
cards.put(c, view);
}
}
if (isDisplayable && mayShow) {
writeCardToView(cUi, view);
} else {
view.reset();
}
return view;
}
private final Function<Card, CardView> FN_GET_CARD_VIEW = new Function<Card, CardView>() {
@Override
public CardView apply(final Card input) {
return getCardView(input);
}
};
public final List<CardView> getCardViews(final List<Card> cards) {
return Lists.transform(cards, FN_GET_CARD_VIEW);
}
public final Iterable<CardView> getCardViews(final Iterable<Card> cards) {
return Iterables.transform(cards, FN_GET_CARD_VIEW);
}
private CardView getCardViewFast(final Card c) {
if (c == null) {
return null;
}
final CardView view = cards.get(c);
if (!mayShowCard(view)) {
view.reset();
}
return view;
}
private final Function<Card, CardView> FN_GET_CARDVIEW_FAST = new Function<Card, CardView>() {
@Override
public CardView apply(Card input) {
return getCardViewFast(input);
}
};
private Iterable<CardView> getCardViewsFast(final Iterable<Card> cards) {
return Iterables.transform(cards, FN_GET_CARDVIEW_FAST);
}
public Card getCard(final CardView c) {
return cards.getKey(c);
}
private final Function<CardView, Card> FN_GET_CARD = new Function<CardView, Card>() {
@Override
public Card apply(final CardView input) {
return getCard(input);
}
};
public final List<Card> getCards(final List<CardView> cards) {
return Lists.transform(cards, FN_GET_CARD);
}
private void writeCardToView(final Card c, final CardView view) {
// First, write the values independent of other views.
ViewUtil.writeNonDependentCardViewProperties(c, view, mayShowCardFace(view));
// Next, write the values that depend on other views.
view.setOwner(getPlayerViewFast(c.getOwner()));
view.setController(getPlayerViewFast(c.getController()));
view.setAttacking(game.getCombat() != null && game.getCombat().isAttacking(c));
view.setBlocking(game.getCombat() != null && game.getCombat().isBlocking(c));
view.setChosenPlayer(getPlayerViewFast(c.getChosenPlayer()));
view.setEquipping(getCardViewFast(Iterables.getFirst(c.getEquipping(), null)));
view.setEquippedBy(getCardViewsFast(c.getEquippedBy()));
view.setEnchantingCard(getCardViewFast(c.getEnchantingCard()));
view.setEnchantingPlayer(getPlayerViewFast(c.getEnchantingPlayer()));
view.setEnchantedBy(getCardViewsFast(c.getEnchantedBy()));
view.setFortifiedBy(getCardViewsFast(c.getFortifiedBy()));
view.setGainControlTargets(getCardViewsFast(c.getGainControlTargets()));
view.setCloneOrigin(getCardViewFast(c.getCloneOrigin()));
view.setImprinted(getCardViewsFast(c.getImprinted()));
view.setHauntedBy(getCardViewsFast(c.getHauntedBy()));
view.setHaunting(getCardViewFast(c.getHaunting()));
view.setMustBlock(c.getMustBlockCards() == null ? Collections.<CardView>emptySet() : getCardViewsFast(c.getMustBlockCards()));
view.setPairedWith(getCardViewFast(c.getPairedWith()));
}
@Override
public boolean mayShowCard(final CardView c) {
return true;
}
@Override
public boolean mayShowCardFace(final CardView c) {
return true;
}
public SpellAbilityView getSpellAbilityView(final SpellAbility sa) {
if (sa == null) {
return null;
}
final SpellAbilityView view;
if (spabs.containsKey(sa)) {
view = spabs.get(sa);
writeSpellAbilityToView(sa, view);
} else {
view = new SpellAbilityView();
writeSpellAbilityToView(sa, view);
spabs.put(sa, view);
}
return view;
}
private final Function<SpellAbility, SpellAbilityView> FN_GET_SPAB_VIEW = new Function<SpellAbility, SpellAbilityView>() {
@Override
public SpellAbilityView apply(final SpellAbility input) {
return getSpellAbilityView(input);
}
};
public final List<SpellAbilityView> getSpellAbilityViews(final List<SpellAbility> cards) {
return Lists.transform(cards, FN_GET_SPAB_VIEW);
}
public SpellAbility getSpellAbility(final SpellAbilityView c) {
return spabs.getKey(c);
}
private final Function<SpellAbilityView, SpellAbility> FN_GET_SPAB = new Function<SpellAbilityView, SpellAbility>() {
@Override
public SpellAbility apply(final SpellAbilityView input) {
return getSpellAbility(input);
}
};
public final List<SpellAbility> getSpellAbilities(final List<SpellAbilityView> cards) {
return Lists.transform(cards, FN_GET_SPAB);
}
private void writeSpellAbilityToView(final SpellAbility sa, final SpellAbilityView view) {
view.setHostCard(getCardView(sa.getHostCard()));
view.setDescription(sa.getDescription());
view.setCanPlay(sa.canPlay());
view.setPromptIfOnlyPossibleAbility(sa.promptIfOnlyPossibleAbility());
}
@Override
public boolean getDisableAutoYields() {
return this.game.getDisableAutoYields();
}
@Override
public void setDisableAutoYields(final boolean b) {
this.game.setDisableAutoYields(b);
}
// Dev mode functions
@Override
public void devTogglePlayManyLands(final boolean b) {
}
@Override
public void devGenerateMana() {
}
@Override
public void devSetupGameState() {
}
@Override
public void devTutorForCard() {
}
@Override
public void devAddCardToHand() {
}
@Override
public void devAddCounterToPermanent() {
}
@Override
public void devTapPermanent() {
}
@Override
public void devUntapPermanent() {
}
@Override
public void devSetPlayerLife() {
}
@Override
public void devWinGame() {
}
@Override
public void devAddCardToBattlefield() {
}
@Override
public void devRiggedPlanerRoll() {
}
@Override
public void devPlaneswalkTo() {
}
@Override
public Iterable<String> getAutoYields() {
return null;
}
@Override
public boolean shouldAutoYield(String key) {
return false;
}
@Override
public void setShouldAutoYield(String key, boolean autoYield) {
}
@Override
public boolean shouldAlwaysAcceptTrigger(Integer trigger) {
return false;
}
@Override
public boolean shouldAlwaysDeclineTrigger(Integer trigger) {
return false;
}
@Override
public boolean shouldAlwaysAskTrigger(Integer trigger) {
return false;
}
@Override
public void setShouldAlwaysAcceptTrigger(Integer trigger) {
}
@Override
public void setShouldAlwaysDeclineTrigger(Integer trigger) {
}
@Override
public void setShouldAlwaysAskTrigger(Integer trigger) {
}
@Override
public void autoPassCancel() {
}
}

View File

@@ -5,7 +5,6 @@ import java.util.Collections;
import forge.card.CardCharacteristicName;
import forge.game.card.Card;
import forge.game.card.CardCharacteristics;
import forge.game.player.Player;
import forge.item.IPaperCard;
import forge.view.CardView.CardStateView;
@@ -23,8 +22,8 @@ public final class ViewUtil {
* @param view
* the {@link CardView} to write to.
*/
public static void writeNonDependentCardViewProperties(final Card c, final CardView view, final Player viewer) {
final boolean hasAltState = c.isDoubleFaced() || c.isFlipCard() || c.isSplitCard() || (c.isFaceDown() && (viewer == null || c.canCardFaceBeShownTo(viewer)));
public static void writeNonDependentCardViewProperties(final Card c, final CardView view, final boolean mayShowCardFace) {
final boolean hasAltState = c.isDoubleFaced() || c.isFlipCard() || c.isSplitCard() || (c.isFaceDown() && mayShowCardFace);
view.setId(c.getUniqueNumber());
view.setZone(c.getZone() == null ? null : c.getZone().getZoneType());
view.setHasAltState(hasAltState);
@@ -70,6 +69,10 @@ public final class ViewUtil {
origView.setChangedColorWords(c.getChangedTextColorWords());
origView.setChangedTypes(c.getChangedTextTypeWords());
origView.setManaCost(c.getManaCost());
origView.setHasDeathtouch(c.hasKeyword("Deathtouch"));
origView.setHasInfect(c.hasKeyword("Infect"));
origView.setHasStorm(c.hasKeyword("Storm"));
origView.setHasTrample(c.hasKeyword("Trample"));
final CardStateView altView = view.getAlternate();
CardCharacteristicName altState = null;
@@ -108,7 +111,7 @@ public final class ViewUtil {
public static CardView getCardForUi(final IPaperCard pc) {
final Card c = Card.getCardForUi(pc);
final CardView view = new CardView(true);
writeNonDependentCardViewProperties(c, view, null);
writeNonDependentCardViewProperties(c, view, c.getCardForUi() == c);
return view;
}
}