From c5ededc74ba538502aaf6d641f6dc0fcc4c9f879 Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 9 Mar 2014 19:59:29 +0000 Subject: [PATCH] Flesh out logic necessary to start and update game state --- .gitattributes | 1 + .../src/forge/screens/LaunchScreen.java | 5 +- .../src/forge/screens/match/FControl.java | 121 +++++++----------- .../match/FControlGameEventHandler.java | 4 +- .../src/forge/screens/match/MatchScreen.java | 54 +++++--- .../src/forge/screens/match/views/VField.java | 22 ++-- .../screens/match/views/VGameDetails.java | 98 ++++++++++++++ .../screens/match/views/VPlayerPanel.java | 113 +++++++++------- .../screens/match/views/VZoneDisplay.java | 16 +-- .../src/forge/utils/ForgePreferences.java | 72 +++++++++++ 10 files changed, 341 insertions(+), 165 deletions(-) create mode 100644 forge-m-base/src/forge/screens/match/views/VGameDetails.java diff --git a/.gitattributes b/.gitattributes index 7f972ee002c..dd8eb3cae1a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16094,6 +16094,7 @@ forge-m-base/src/forge/screens/match/input/InputSynchronized.java -text forge-m-base/src/forge/screens/match/input/InputSyncronizedBase.java -text forge-m-base/src/forge/screens/match/views/VAvatar.java -text forge-m-base/src/forge/screens/match/views/VField.java -text +forge-m-base/src/forge/screens/match/views/VGameDetails.java -text forge-m-base/src/forge/screens/match/views/VLog.java -text forge-m-base/src/forge/screens/match/views/VPhaseIndicator.java -text forge-m-base/src/forge/screens/match/views/VPlayerPanel.java -text diff --git a/forge-m-base/src/forge/screens/LaunchScreen.java b/forge-m-base/src/forge/screens/LaunchScreen.java index 8e15c5d4287..930dc9c7743 100644 --- a/forge-m-base/src/forge/screens/LaunchScreen.java +++ b/forge-m-base/src/forge/screens/LaunchScreen.java @@ -3,9 +3,8 @@ package forge.screens; import java.util.ArrayList; import java.util.List; -import forge.Forge; import forge.screens.FScreen; -import forge.screens.match.MatchScreen; +import forge.screens.match.FControl; import forge.Forge.Graphics; import forge.assets.FSkinImage; import forge.game.GameRules; @@ -91,7 +90,7 @@ public abstract class LaunchScreen extends FScreen { rules.setManaBurn(false); //Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.canCloneUseTargetsImage = false; //Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE); - Forge.openScreen(new MatchScreen(new Match(rules, launchParams.players))); + FControl.startGame(new Match(rules, launchParams.players)); } creatingMatch = false; diff --git a/forge-m-base/src/forge/screens/match/FControl.java b/forge-m-base/src/forge/screens/match/FControl.java index 2bca03812fd..3fae566b5a3 100644 --- a/forge-m-base/src/forge/screens/match/FControl.java +++ b/forge-m-base/src/forge/screens/match/FControl.java @@ -22,6 +22,7 @@ import forge.game.player.Player; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.model.FModel; +import forge.net.FServer; import forge.screens.match.events.IUiEventVisitor; import forge.screens.match.events.UiEvent; import forge.screens.match.events.UiEventAttackerDeclared; @@ -39,7 +40,10 @@ public class FControl { private static InputQueue inputQueue; private static List sortedPlayers; private static final EventBus uiEvents; - private static MatchUiEventVisitor visitor = new MatchUiEventVisitor(); + private static boolean gameHasHumanPlayer; + private static final MatchUiEventVisitor visitor = new MatchUiEventVisitor(); + private static final FControlGameEventHandler fcVisitor = new FControlGameEventHandler(); + private static final FControlGamePlayback playbackControl = new FControlGamePlayback(); static { uiEvents = new EventBus("ui events"); @@ -47,9 +51,8 @@ public class FControl { uiEvents.register(visitor); } - public static void startGame(final Match match, final MatchScreen view0) { + public static void startGame(final Match match) { game = match.createGame(); - view = view0; /*if (game.getRules().getGameType() == GameType.Quest) { QuestController qc = Singletons.getModel().getQuest(); @@ -68,6 +71,25 @@ public class FControl { // The UI controls should use these game data as models initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); + FModel.getPreferences().actuateMatchPreferences(); + view.getPrompt().getInputProxy().setGame(game); + + // Listen to DuelOutcome event to show ViewWinLose + game.subscribeToEvents(fcVisitor); + + // Add playback controls to match if needed + gameHasHumanPlayer = false; + for (Player p : game.getPlayers()) { + if (p.getController().getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + gameHasHumanPlayer = true; + } + } + if (!gameHasHumanPlayer) { + game.subscribeToEvents(playbackControl); + } + + Forge.openScreen(view); + // It's important to run match in a different thread to allow GUI inputs to be invoked from inside game. // Game is set on pause while gui player takes decisions /*game.getAction().invoke(new Runnable() { @@ -104,10 +126,6 @@ public class FControl { //TODO } - private static int getPlayerIndex(Player player) { - return sortedPlayers.indexOf(player); - } - public static void endCurrentGame() { if (game == null) { return; } @@ -116,60 +134,27 @@ public class FControl { } public static void initMatch(final List players, LobbyPlayer localPlayer) { - // TODO fix for use with multiplayer - final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(","); // Instantiate all required field slots (user at 0) sortedPlayers = shiftPlayersPlaceLocalFirst(players, localPlayer); - /*final List fields = new ArrayList(); - final List commands = new ArrayList(); + List playerPanels = new ArrayList(); int i = 0; + int avatarIndex = 0; for (Player p : sortedPlayers) { - // A field must be initialized after it's instantiated, to update player info. - // No player, no init. - VField f = new VField(EDocID.Fields[i], p, localPlayer); - VCommand c = new VCommand(EDocID.Commands[i], p); - fields.add(f); - commands.add(c); - - //setAvatar(f, new ImageIcon(FSkin.getAvatars().get())); - setAvatar(f, getPlayerAvatar(p, Integer.parseInt(indices[i > 2 ? 1 : 0]))); - f.getLayoutControl().initialize(); - c.getLayoutControl().initialize(); - i++; - } - - // Replace old instances - view.setCommandViews(commands); - view.setFieldViews(fields); - - VPlayers.SINGLETON_INSTANCE.init(players);*/ - - initHandViews(localPlayer); - } - - public static void initHandViews(LobbyPlayer localPlayer) { - /*final List hands = new ArrayList(); - - int i = 0; - for (Player p : sortedPlayers) { - if (p.getLobbyPlayer() == localPlayer) { - VHand newHand = new VHand(EDocID.Hands[i], p); - newHand.getLayoutControl().initialize(); - hands.add(newHand); + if (i < indices.length) { + avatarIndex = Integer.parseInt(indices[i]); + i++; } - i++; + localPlayer.setAvatarIndex(avatarIndex); + playerPanels.add(new VPlayerPanel(p, localPlayer)); } - 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);*/ + view = new MatchScreen(playerPanels); + + view.getGameDetails().init(players); } private static List shiftPlayersPlaceLocalFirst(final List players, LobbyPlayer localPlayer) { @@ -189,7 +174,7 @@ public class FControl { } public static void resetAllPhaseButtons() { - for (final VPlayerPanel panel : view.getPlayerPanels()) { + for (final VPlayerPanel panel : view.getPlayerPanels().values()) { panel.getPhaseIndicator().resetPhaseButtons(); } } @@ -199,8 +184,7 @@ public class FControl { } public static VPlayerPanel getPlayerPanel(Player p) { - int idx = getPlayerIndex(p); - return idx < 0 ? null : view.getPlayerPanels().get(idx); + return view.getPlayerPanels().get(p); } public static boolean mayShowCard(Card c) { @@ -257,27 +241,11 @@ public class FControl { public static void updateZones(List> zonesToUpdate) { //System.out.println("updateZones " + zonesToUpdate); - /*for (Pair kv : zonesToUpdate) { + for (Pair kv : zonesToUpdate) { Player owner = kv.getKey(); ZoneType zt = kv.getValue(); - - if (zt == ZoneType.Command) - getCommandFor(owner).getTabletop().setupPlayZone(); - else if (zt == ZoneType.Hand) { - VHand vHand = getHandFor(owner); - if (null != vHand) - vHand.getLayoutControl().updateHand(); - getFieldViewFor(owner).getDetailsPanel().updateZones(); - } - else if (zt == ZoneType.Battlefield) { - getFieldViewFor(owner).getTabletop().setupPlayZone(); - } else if (zt == ZoneType.Ante) { - CAntes.SINGLETON_INSTANCE.update(); - } - else { - getFieldViewFor(owner).getDetailsPanel().updateZones(); - } - }*/ + getPlayerPanel(owner).updateZone(zt); + } } // Player's mana pool changes @@ -289,9 +257,9 @@ public class FControl { // Player's lives and poison counters public static void updateLives(List livesUpdate) { - /*for (Player p : livesUpdate) { - getFieldViewFor(p).updateDetails(); - }*/ + for (Player p : livesUpdate) { + getPlayerPanel(p).updateLife(); + } } public static void updateCards(Set cardsToUpdate) { @@ -303,8 +271,7 @@ public class FControl { public static void updateSingleCard(Card c) { Zone zone = c.getZone(); if (zone != null && zone.getZoneType() == ZoneType.Battlefield) { - /*PlayArea pa = getFieldViewFor(zone.getPlayer()).getTabletop(); - pa.updateSingleCard(c);*/ + getPlayerPanel(zone.getPlayer()).getField().updateSingleCard(c); } } diff --git a/forge-m-base/src/forge/screens/match/FControlGameEventHandler.java b/forge-m-base/src/forge/screens/match/FControlGameEventHandler.java index ada0e7f8c41..ad928ea108c 100644 --- a/forge-m-base/src/forge/screens/match/FControlGameEventHandler.java +++ b/forge-m-base/src/forge/screens/match/FControlGameEventHandler.java @@ -108,8 +108,8 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { } FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - FControl.initHandViews(FServer.getLobby().getGuiPlayer()); - /*SLayoutIO.loadLayout(null); + /*FControl.initHandViews(FServer.getLobby().getGuiPlayer()); + SLayoutIO.loadLayout(null); VMatchUI.SINGLETON_INSTANCE.populate(); for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) { h.getLayoutControl().updateHand(); diff --git a/forge-m-base/src/forge/screens/match/MatchScreen.java b/forge-m-base/src/forge/screens/match/MatchScreen.java index 11552c3fe0d..a1ce825112d 100644 --- a/forge-m-base/src/forge/screens/match/MatchScreen.java +++ b/forge-m-base/src/forge/screens/match/MatchScreen.java @@ -1,9 +1,13 @@ package forge.screens.match; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import forge.screens.FScreen; import forge.screens.match.views.VAvatar; +import forge.screens.match.views.VGameDetails; +import forge.screens.match.views.VLog; import forge.screens.match.views.VPlayerPanel; import forge.screens.match.views.VPrompt; import forge.screens.match.views.VStack; @@ -11,39 +15,39 @@ import forge.Forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinTexture; import forge.assets.FSkinColor.Colors; -import forge.game.Match; -import forge.game.player.RegisteredPlayer; +import forge.game.player.Player; import forge.game.zone.ZoneType; public class MatchScreen extends FScreen { public static FSkinColor BORDER_COLOR = FSkinColor.get(Colors.CLR_BORDERS); - private final Match match; - private final List playerPanels; - //private final VLog log; + private final Map playerPanels = new HashMap(); + private final VLog log; private final VStack stack; private final VPrompt prompt; + private final VGameDetails gameDetails; private VPlayerPanel bottomPlayerPanel, topPlayerPanel; - public MatchScreen(Match match0) { + public MatchScreen(List playerPanels0) { super(true, "Game", true); - match = match0; - playerPanels = new ArrayList(); - for (RegisteredPlayer player : match.getPlayers()) { - playerPanels.add(add(new VPlayerPanel(player))); + for (VPlayerPanel playerPanel : playerPanels0) { + playerPanels.put(playerPanel.getPlayer(), add(playerPanel)); } - bottomPlayerPanel = playerPanels.get(0); - topPlayerPanel = playerPanels.get(1); + bottomPlayerPanel = playerPanels0.get(0); + topPlayerPanel = playerPanels0.get(1); topPlayerPanel.setFlipped(true); bottomPlayerPanel.setSelectedZone(ZoneType.Hand); - //log = add(new VLog()); - stack = add(new VStack()); prompt = add(new VPrompt()); - FControl.startGame(match0, this); + log = add(new VLog()); + stack = add(new VStack()); + gameDetails = add(new VGameDetails()); + log.setVisible(false); + stack.setVisible(false); + gameDetails.setVisible(false); } public VPrompt getPrompt() { @@ -54,7 +58,23 @@ public class MatchScreen extends FScreen { return stack; } - public List getPlayerPanels() { + public VLog getLog() { + return log; + } + + public VGameDetails getGameDetails() { + return gameDetails; + } + + public VPlayerPanel getTopPlayerPanel() { + return topPlayerPanel; + } + + public VPlayerPanel getBottomPlayerPanel() { + return bottomPlayerPanel; + } + + public Map getPlayerPanels() { return playerPanels; } diff --git a/forge-m-base/src/forge/screens/match/views/VField.java b/forge-m-base/src/forge/screens/match/views/VField.java index c2ab3552860..8e1146438ec 100644 --- a/forge-m-base/src/forge/screens/match/views/VField.java +++ b/forge-m-base/src/forge/screens/match/views/VField.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import forge.game.card.Card; -import forge.model.FModel; import forge.toolbox.FCardPanel; import forge.toolbox.FDisplayObject; import forge.toolbox.FScrollPane; @@ -17,19 +16,6 @@ public class VField extends FScrollPane { private final List otherPermanents = new ArrayList(); public VField() { - Card creature = Card.getCardForUi(FModel.getMagicDb().getCommonCards().getCard("Llanowar Elves")); - Card land = Card.getCardForUi(FModel.getMagicDb().getCommonCards().getCard("Forest")); - Card artifact = Card.getCardForUi(FModel.getMagicDb().getCommonCards().getCard("Coat of Arms")); - - for (int i = 0; i < 6; i++) { - creatures.add(add(new FCardPanel(creature))); - } - for (int i = 0; i < 3; i++) { - lands.add(add(new FCardPanel(land))); - } - for (int i = 0; i < 2; i++) { - otherPermanents.add(add(new FCardPanel(artifact))); - } } public boolean isFlipped() { @@ -39,6 +25,14 @@ public class VField extends FScrollPane { flipped = flipped0; } + public void update() { + + } + + public void updateSingleCard(Card card) { + + } + @Override protected void doLayout(float width, float height) { float x = 0; diff --git a/forge-m-base/src/forge/screens/match/views/VGameDetails.java b/forge-m-base/src/forge/screens/match/views/VGameDetails.java new file mode 100644 index 00000000000..c20bc610658 --- /dev/null +++ b/forge-m-base/src/forge/screens/match/views/VGameDetails.java @@ -0,0 +1,98 @@ +package forge.screens.match.views; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import forge.game.Game; +import forge.game.GameType; +import forge.game.card.Card; +import forge.game.card.CardFactoryUtil; +import forge.game.player.Player; +import forge.game.zone.ZoneType; +import forge.model.FModel; +import forge.toolbox.FContainer; +import forge.toolbox.FLabel; +import forge.utils.ForgePreferences.FPref; + +public class VGameDetails extends FContainer { + private Map infoLabels; + private InfoLabel stormLabel; + + public void init(final Iterable players) { + clear(); + infoLabels = new HashMap(); + for (final Player p : players) { + // Create and store labels detailing various non-critical player info. + final InfoLabel name = add(new InfoLabel()); + final InfoLabel life = add(new InfoLabel()); + final InfoLabel hand = add(new InfoLabel()); + final InfoLabel draw = add(new InfoLabel()); + final InfoLabel prevention = add(new InfoLabel()); + final InfoLabel keywords = add(new InfoLabel()); + final InfoLabel antes = add(new InfoLabel()); + final InfoLabel cmd = add(new InfoLabel()); + infoLabels.put(p, new InfoLabel[] { name, life, hand, draw, prevention, keywords, antes, cmd }); + + name.setText(p.getName()); + } + + stormLabel = add(new InfoLabel()); + } + + public void update() { + if (!isVisible()) { return; } //No need to update if this panel isn't showing + + for (Entry rr : infoLabels.entrySet()) { + Player p0 = rr.getKey(); + final InfoLabel[] temp = rr.getValue(); + temp[1].setText("Life: " + String.valueOf(p0.getLife()) + " | Poison counters: " + + String.valueOf(p0.getPoisonCounters())); + temp[2].setText("Maximum hand size: " + String.valueOf(p0.getMaxHandSize())); + temp[3].setText("Cards drawn this turn: " + String.valueOf(p0.getNumDrawnThisTurn())); + temp[4].setText("Damage Prevention: " + String.valueOf(p0.getPreventNextDamageTotalShields())); + if (!p0.getKeywords().isEmpty()) { + temp[5].setText(p0.getKeywords().toString()); + } + else { + temp[5].setText(""); + } + if (FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)) { + List list = p0.getCardsIn(ZoneType.Ante); + StringBuilder sb = new StringBuilder(); + sb.append("Ante'd: "); + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < (list.size() - 1)) { + sb.append(", "); + } + } + temp[6].setText(sb.toString()); + } + if (p0.getGame().getRules().getGameType() == GameType.Commander) { + temp[7].setText(CardFactoryUtil.getCommanderInfo(p0)); + } + } + } + + /** + * @param game */ + public void updateStormLabel(Game game) { + if (!isVisible()) { return; } //No need to update if this panel isn't showing + + stormLabel.setText("Storm count: " + game.getStack().getCardsCastThisTurn().size()); + } + + @Override + protected void doLayout(float width, float height) { + // TODO Auto-generated method stub + + } + + private class InfoLabel extends FLabel { + private InfoLabel() { + super(new FLabel.Builder()); + } + } +} diff --git a/forge-m-base/src/forge/screens/match/views/VPlayerPanel.java b/forge-m-base/src/forge/screens/match/views/VPlayerPanel.java index dc602d8d620..fcae359673a 100644 --- a/forge-m-base/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-m-base/src/forge/screens/match/views/VPlayerPanel.java @@ -1,7 +1,9 @@ package forge.screens.match.views; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; @@ -10,7 +12,8 @@ import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; -import forge.game.player.RegisteredPlayer; +import forge.game.player.LobbyPlayer; +import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.screens.match.FControl; import forge.screens.match.MatchScreen; @@ -23,31 +26,42 @@ public class VPlayerPanel extends FContainer { private static final FSkinColor INFO_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); private static final FSkinColor ZONE_BACK_COLOR = FSkinColor.get(Colors.CLR_INACTIVE).alphaColor(0.5f); - private final RegisteredPlayer player; + private final Player player; + private final LobbyPlayer localPlayer; private final VPhaseIndicator phaseIndicator; private final VField field; private final VAvatar avatar; - private final List infoLabels = new ArrayList(); - private final List zones = new ArrayList(); + private final LifeLabel lblLife; + private final List zoneTabs = new ArrayList(); + private final Map zoneDisplays = new HashMap(); private VZoneDisplay selectedZone; - public VPlayerPanel(RegisteredPlayer player0) { + public VPlayerPanel(Player player0, LobbyPlayer localPlayer0) { player = player0; + localPlayer = localPlayer0; phaseIndicator = add(new VPhaseIndicator()); field = add(new VField()); - avatar = add(new VAvatar(player.getPlayer().getAvatarIndex())); - infoLabels.add(add(new LifeLabel())); + avatar = add(new VAvatar(localPlayer.getAvatarIndex())); + lblLife = add(new LifeLabel()); addZoneDisplay(ZoneType.Hand, FSkinImage.HAND); addZoneDisplay(ZoneType.Graveyard, FSkinImage.GRAVEYARD); addZoneDisplay(ZoneType.Library, FSkinImage.LIBRARY); addZoneDisplay(ZoneType.Exile, FSkinImage.EXILE); } + public Player getPlayer() { + return player; + } + + public LobbyPlayer getLocalPlayer() { + return localPlayer; + } + public void addZoneDisplay(ZoneType zoneType, FSkinImage tabIcon) { VZoneDisplay zone = add(new VZoneDisplay(zoneType)); zone.setVisible(false); - zones.add(zone); - infoLabels.add(add(new ZoneInfoTab(tabIcon, zone))); + zoneDisplays.put(zoneType, zone); + zoneTabs.add(add(new ZoneInfoTab(tabIcon, zone))); } public ZoneType getSelectedZone() { @@ -72,12 +86,9 @@ public class VPlayerPanel extends FContainer { selectedZone = null; } else { - for (VZoneDisplay zone : zones) { - if (zone.getZoneType() == zoneType) { - selectedZone = zone; - selectedZone.setVisible(true); - break; - } + selectedZone = zoneDisplays.get(zoneType); + if (selectedZone != null) { + selectedZone.setVisible(true); } } if (FControl.getView() != null) { //must revalidate entire screen so panel heights updated @@ -104,6 +115,24 @@ public class VPlayerPanel extends FContainer { return avatar; } + public void updateLife() { + lblLife.update(); + } + + public void updateZone(ZoneType zoneType) { + if (zoneType == ZoneType.Battlefield) { + field.update(); + } + else { + for (ZoneInfoTab tab : zoneTabs) { + if (tab.zoneToOpen.getZoneType() == zoneType) { + tab.update(); + return; + } + } + } + } + @Override protected void doLayout(float width, float height) { //layout for bottom panel by default @@ -115,7 +144,7 @@ public class VPlayerPanel extends FContainer { y = height - VAvatar.HEIGHT; zoneHeight = y / 3; y -= zoneHeight; - for (VZoneDisplay zone : zones) { + for (VZoneDisplay zone : zoneDisplays.values()) { zone.setBounds(0, y, width, zoneHeight); } } @@ -125,12 +154,13 @@ public class VPlayerPanel extends FContainer { y = height - VAvatar.HEIGHT; avatar.setPosition(0, y); - float infoLabelWidth; + float infoLabelHeight = VAvatar.HEIGHT - VPhaseIndicator.HEIGHT; - for (InfoLabel infoLabel : infoLabels) { - infoLabelWidth = infoLabel.getPreferredWidth(); - infoLabel.setBounds(x, y, infoLabelWidth, infoLabelHeight); - x += infoLabelWidth; + lblLife.setBounds(x, y, lblLife.getWidth(), infoLabelHeight); + x += lblLife.getWidth(); + for (ZoneInfoTab tab : zoneTabs) { + tab.setBounds(x, y, tab.getWidth(), infoLabelHeight); + x += tab.getWidth(); } field.setBounds(0, 0, width, y - zoneHeight); @@ -148,13 +178,11 @@ public class VPlayerPanel extends FContainer { float w = getWidth(); g.fillRect(ZONE_BACK_COLOR, 0, selectedZone.getTop(), w, selectedZone.getHeight()); - InfoLabel selectedZoneTab = null;; - for (InfoLabel label : infoLabels) { - if (label instanceof ZoneInfoTab) { - if (((ZoneInfoTab)label).zoneToOpen == selectedZone) { - selectedZoneTab = label; - break; - } + ZoneInfoTab selectedZoneTab = null; + for (ZoneInfoTab tab : zoneTabs) { + if (tab.zoneToOpen == selectedZone) { + selectedZoneTab = tab; + break; } } float y = isFlipped() ? selectedZone.getTop() + 1 : selectedZone.getBottom(); @@ -168,35 +196,32 @@ public class VPlayerPanel extends FContainer { } } - private abstract class InfoLabel extends FDisplayObject { - protected String value; - public abstract float getPreferredWidth(); - } - - private class LifeLabel extends InfoLabel { + private class LifeLabel extends FDisplayObject { + private String life = "20"; + private LifeLabel() { - value = "20"; + setWidth(VAvatar.HEIGHT * 2f / 3f); } - @Override - public float getPreferredWidth() { - return VAvatar.HEIGHT * 2f / 3f; + private void update() { + life = String.valueOf(player.getLife()); } @Override public void draw(Graphics g) { - g.drawText(value, LIFE_FONT, INFO_FORE_COLOR, 0, 0, getWidth(), getHeight(), false, HAlignment.CENTER, true); + g.drawText(life, LIFE_FONT, INFO_FORE_COLOR, 0, 0, getWidth(), getHeight(), false, HAlignment.CENTER, true); } } - private class ZoneInfoTab extends InfoLabel { + private class ZoneInfoTab extends FDisplayObject { + private String value = "0"; private final FSkinImage icon; private final VZoneDisplay zoneToOpen; private ZoneInfoTab(FSkinImage icon0, VZoneDisplay zoneToOpen0) { icon = icon0; zoneToOpen = zoneToOpen0; - value = "99"; + setWidth(VAvatar.HEIGHT * 1.05f); } @Override @@ -210,9 +235,9 @@ public class VPlayerPanel extends FContainer { return true; } - @Override - public float getPreferredWidth() { - return VAvatar.HEIGHT * 1.05f; + private void update() { + zoneToOpen.update(); + value = String.valueOf(zoneToOpen.getCount()); } @Override diff --git a/forge-m-base/src/forge/screens/match/views/VZoneDisplay.java b/forge-m-base/src/forge/screens/match/views/VZoneDisplay.java index e6feabeef4b..1756b5cc14c 100644 --- a/forge-m-base/src/forge/screens/match/views/VZoneDisplay.java +++ b/forge-m-base/src/forge/screens/match/views/VZoneDisplay.java @@ -3,9 +3,7 @@ package forge.screens.match.views; import java.util.ArrayList; import java.util.List; -import forge.game.card.Card; import forge.game.zone.ZoneType; -import forge.model.FModel; import forge.toolbox.FCardPanel; import forge.toolbox.FScrollPane; @@ -15,18 +13,20 @@ public class VZoneDisplay extends FScrollPane { public VZoneDisplay(ZoneType zoneType0) { zoneType = zoneType0; - - Card card = Card.getCardForUi(FModel.getMagicDb().getCommonCards().getCard("Forest")); - - for (int i = 0; i < 7; i++) { - cards.add(add(new FCardPanel(card))); - } } public ZoneType getZoneType() { return zoneType; } + public int getCount() { + return 99; //TODO + } + + public void update() { + + } + @Override protected void doLayout(float width, float height) { float x = 0; diff --git a/forge-m-base/src/forge/utils/ForgePreferences.java b/forge-m-base/src/forge/utils/ForgePreferences.java index 90102589987..3d4bd33966e 100644 --- a/forge-m-base/src/forge/utils/ForgePreferences.java +++ b/forge-m-base/src/forge/utils/ForgePreferences.java @@ -19,6 +19,9 @@ package forge.utils; import forge.ai.AiProfileUtil; import forge.game.GameLogEntryType; +import forge.game.phase.PhaseType; +import forge.screens.match.FControl; +import forge.screens.match.views.VPhaseIndicator; public class ForgePreferences extends PreferencesStore { /** @@ -135,4 +138,73 @@ public class ForgePreferences extends PreferencesStore { protected String getPrefDefault(FPref key) { return key.getDefault(); } + + public void writeMatchPreferences() { + VPhaseIndicator fvAi = FControl.getView().getTopPlayerPanel().getPhaseIndicator(); + this.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLabel(PhaseType.UPKEEP).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLabel(PhaseType.DRAW).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLabel(PhaseType.MAIN1).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_END).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLabel(PhaseType.MAIN2).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLabel(PhaseType.END_OF_TURN).getStopAtPhase())); + this.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLabel(PhaseType.CLEANUP).getStopAtPhase())); + + VPhaseIndicator fvHuman = FControl.getView().getBottomPlayerPanel().getPhaseIndicator(); + this.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLabel(PhaseType.UPKEEP).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLabel(PhaseType.DRAW).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLabel(PhaseType.MAIN1).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_END).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLabel(PhaseType.MAIN2).getStopAtPhase())); + this.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLabel(PhaseType.END_OF_TURN).getStopAtPhase()); + this.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLabel(PhaseType.CLEANUP).getStopAtPhase()); + + /*final VDev v = VDev.SINGLETON_INSTANCE; + + // this.setPref(FPref.DEV_MILLING_LOSS, v.getLblMilling().getEnabled()); + this.setPref(FPref.DEV_UNLIMITED_LAND, v.getLblUnlimitedLands().getEnabled());*/ + } + + /** + * TODO: Needs to be reworked for efficiency with rest of prefs saves in + * codebase. + */ + public void actuateMatchPreferences() { + VPhaseIndicator fvAi = FControl.getView().getTopPlayerPanel().getPhaseIndicator(); + fvAi.getLabel(PhaseType.UPKEEP).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); + fvAi.getLabel(PhaseType.DRAW).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_DRAW)); + fvAi.getLabel(PhaseType.MAIN1).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_MAIN1)); + fvAi.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); + fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); + fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); + fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); + fvAi.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); + fvAi.getLabel(PhaseType.COMBAT_END).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); + fvAi.getLabel(PhaseType.MAIN2).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_MAIN2)); + fvAi.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_EOT)); + fvAi.getLabel(PhaseType.CLEANUP).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); + + VPhaseIndicator fvHuman = FControl.getView().getBottomPlayerPanel().getPhaseIndicator(); + fvHuman.getLabel(PhaseType.UPKEEP).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); + fvHuman.getLabel(PhaseType.DRAW).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); + fvHuman.getLabel(PhaseType.MAIN1).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); + fvHuman.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); + fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); + fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); + fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); + fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); + fvHuman.getLabel(PhaseType.COMBAT_END).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); + fvHuman.getLabel(PhaseType.MAIN2).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); + fvHuman.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); + fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(this.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); + } }