mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 01:38:13 +00:00
Lots of small fixes and cleanup for the GUI refactoring.
This commit is contained in:
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
61
forge-gui/src/main/java/forge/view/Cache.java
Normal file
61
forge-gui/src/main/java/forge/view/Cache.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
671
forge-gui/src/main/java/forge/view/LocalGameView.java
Normal file
671
forge-gui/src/main/java/forge/view/LocalGameView.java
Normal 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() {
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user