From 7fa16c0e15e73fbc5245bce5813ec82c1fbc1cf1 Mon Sep 17 00:00:00 2001 From: drdev Date: Mon, 28 Mar 2016 00:20:12 +0000 Subject: [PATCH] Add Statistics screen for Planar Conquest --- .gitattributes | 2 + .../screens/planarconquest/ConquestMenu.java | 8 + .../planarconquest/ConquestStatsScreen.java | 137 ++++++++++++++++++ .../planarconquest/LoadConquestScreen.java | 2 +- .../forge/screens/quest/QuestStatsScreen.java | 31 ++-- .../forge/planarconquest/ConquestData.java | 91 +++++++++++- .../planarconquest/ConquestPlaneData.java | 24 ++- .../forge/planarconquest/IVConquestStats.java | 14 ++ 8 files changed, 288 insertions(+), 21 deletions(-) create mode 100644 forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java create mode 100644 forge-gui/src/main/java/forge/planarconquest/IVConquestStats.java diff --git a/.gitattributes b/.gitattributes index 56b3f539870..85a008a60f5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1353,6 +1353,7 @@ forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkersScreen.java -text forge-gui-mobile/src/forge/screens/planarconquest/ConquestPrefsScreen.java -text forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java -text +forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java -text forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java -text forge-gui-mobile/src/forge/screens/planarconquest/NewConquestScreen.java -text forge-gui-mobile/src/forge/screens/planarconquest/NewConquestScreenModel.java -text @@ -19000,6 +19001,7 @@ forge-gui/src/main/java/forge/planarconquest/ConquestRecord.java -text forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java -text forge-gui/src/main/java/forge/planarconquest/ConquestReward.java -text forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java -text +forge-gui/src/main/java/forge/planarconquest/IVConquestStats.java -text forge-gui/src/main/java/forge/player/GamePlayerUtil.java -text forge-gui/src/main/java/forge/player/HumanCostDecision.java -text forge-gui/src/main/java/forge/player/HumanPlay.java -text diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMenu.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMenu.java index 058b0f94ac6..53c50512bc2 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMenu.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMenu.java @@ -22,6 +22,7 @@ public class ConquestMenu extends FPopupMenu { private static final ConquestPlaneswalkersScreen planeswalkersScreen = new ConquestPlaneswalkersScreen(); private static final ConquestCollectionScreen collectionScreen = new ConquestCollectionScreen(); private static final ConquestPlaneswalkScreen planeswalkScreen = new ConquestPlaneswalkScreen(); + private static final ConquestStatsScreen statsScreen = new ConquestStatsScreen(); private static final ConquestPrefsScreen prefsScreen = new ConquestPrefsScreen(); private static final FMenuItem multiverseItem = new FMenuItem("The Multiverse", FSkinImage.MULTIVERSE, new FEventHandler() { @@ -54,6 +55,12 @@ public class ConquestMenu extends FPopupMenu { setCurrentScreen(collectionScreen); } }); + private static final FMenuItem statsItem = new FMenuItem("Statistics", FSkinImage.MULTI, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + setCurrentScreen(statsScreen); + } + }); private static final FMenuItem planeswalkItem = new FMenuItem("Planeswalk", FSkinImage.PW_BADGE_COMMON, new FEventHandler() { @Override public void handleEvent(FEvent e) { @@ -118,6 +125,7 @@ public class ConquestMenu extends FPopupMenu { addItem(commandersItem); commandersItem.setSelected(currentScreen == commandersScreen); addItem(planeswalkersItem); planeswalkersItem.setSelected(currentScreen == planeswalkersScreen); addItem(collectionItem); collectionItem.setSelected(currentScreen == collectionScreen); + addItem(statsItem); statsItem.setSelected(currentScreen == statsScreen); addItem(planeswalkItem); planeswalkItem.setSelected(currentScreen == planeswalkScreen); addItem(prefsItem); prefsItem.setSelected(currentScreen == prefsScreen); } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java new file mode 100644 index 00000000000..278ca5fa7a9 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java @@ -0,0 +1,137 @@ +package forge.screens.planarconquest; + +import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; + +import forge.assets.FImage; +import forge.assets.FSkinFont; +import forge.assets.FSkinImage; +import forge.interfaces.IButton; +import forge.model.FModel; +import forge.planarconquest.ConquestData; +import forge.planarconquest.ConquestPlane; +import forge.planarconquest.IVConquestStats; +import forge.screens.FScreen; +import forge.toolbox.FComboBox; +import forge.toolbox.FDisplayObject; +import forge.toolbox.FEvent; +import forge.toolbox.FEvent.FEventHandler; +import forge.toolbox.FLabel; +import forge.toolbox.FScrollPane; +import forge.util.Utils; + +public class ConquestStatsScreen extends FScreen implements IVConquestStats { + private static final float PADDING = Utils.scale(5f); + + private final FComboBox cbPlanes = add(new FComboBox()); + private final FScrollPane scroller = add(new FScrollPane() { + @Override + protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { + float x = 0; + float y = 0; + float w = visibleWidth; + float h = lblAEtherShards.getAutoSizeBounds().height; + for (FDisplayObject lbl : getChildren()) { + if (lbl.isVisible()) { + lbl.setBounds(x, y, w, lbl.getHeight() == 0 ? h : lbl.getHeight()); //respect height override if set + y += lbl.getHeight() + PADDING; + } + } + return new ScrollBounds(visibleWidth, y); + } + }); + private final FLabel lblAEtherShards = scroller.add(new StatLabel(FSkinImage.AETHER_SHARD)); + private final FLabel lblPlaneswalkEmblems = scroller.add(new StatLabel(FSkinImage.PW_BADGE_COMMON)); + private final FLabel lblTotalWins = scroller.add(new StatLabel(FSkinImage.QUEST_PLUS)); + private final FLabel lblTotalLosses = scroller.add(new StatLabel(FSkinImage.QUEST_MINUS)); + private final FLabel lblConqueredEvents = scroller.add(new StatLabel(FSkinImage.MULTIVERSE)); + private final FLabel lblUnlockedCards = scroller.add(new StatLabel(FSkinImage.SPELLBOOK)); + private final FLabel lblCommanders = scroller.add(new StatLabel(FSkinImage.COMMANDER)); + private final FLabel lblPlaneswalkers = scroller.add(new StatLabel(FSkinImage.PLANESWALKER)); + + public ConquestStatsScreen() { + super(null, ConquestMenu.getMenu()); + + cbPlanes.addItem("All Planes"); + for (ConquestPlane plane : FModel.getPlanes()) { + if (!plane.isUnreachable()) { + cbPlanes.addItem(plane); + } + } + cbPlanes.setAlignment(HAlignment.CENTER); + cbPlanes.setChangedHandler(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + ConquestPlane plane = cbPlanes.getSelectedIndex() > 0 ? (ConquestPlane)cbPlanes.getSelectedItem() : null; + FModel.getConquest().getModel().updateStatLabels(ConquestStatsScreen.this, plane); + } + }); + } + + @Override + public void onActivate() { + update(); + } + + public void update() { + ConquestData model = FModel.getConquest().getModel(); + setHeaderCaption(model.getName()); + + //update plane selector to show current plane + FEventHandler handler = cbPlanes.getChangedHandler(); + cbPlanes.setChangedHandler(null); //temporarily clear to prevent updating plane stats twice + cbPlanes.setSelectedItem(model.getCurrentPlane()); + cbPlanes.setChangedHandler(handler); + + model.updateStatLabels(this, model.getCurrentPlane()); + } + + @Override + protected void doLayout(float startY, float width, float height) { + float x = PADDING; + float y = startY + PADDING; + width -= 2 * x; + + cbPlanes.setBounds(x, y, width, cbPlanes.getHeight()); + y += cbPlanes.getHeight() + PADDING; + scroller.setBounds(x, y, width, height - PADDING - y); + } + + @Override + public IButton getLblAEtherShards() { + return lblAEtherShards; + } + @Override + public IButton getLblPlaneswalkEmblems() { + return lblPlaneswalkEmblems; + } + @Override + public IButton getLblTotalWins() { + return lblTotalWins; + } + @Override + public IButton getLblTotalLosses() { + return lblTotalLosses; + } + @Override + public IButton getLblConqueredEvents() { + return lblConqueredEvents; + } + @Override + public IButton getLblUnlockedCards() { + return lblUnlockedCards; + } + @Override + public IButton getLblCommanders() { + return lblCommanders; + } + @Override + public IButton getLblPlaneswalkers() { + return lblPlaneswalkers; + } + + private static class StatLabel extends FLabel { + private StatLabel(FImage icon0) { + super(new FLabel.Builder().icon(icon0).font(FSkinFont.get(14)).iconScaleFactor(1)); + } + } +} diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index bab87591afd..4b57b72a340 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -308,7 +308,7 @@ public class LoadConquestScreen extends LaunchScreen { float iconSize = h + Utils.scale(2); float iconOffset = SettingsScreen.SETTING_PADDING - Utils.scale(2); - String cards = String.valueOf(value.getUnlockedCount()); + String cards = String.valueOf(value.getUnlockedCardCount()); String shards = String.valueOf(value.getAEtherShards()); font = FSkinFont.get(12); float cardsWidth = font.getBounds(cards).width + iconSize + SettingsScreen.SETTING_PADDING; diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java index 540b94c1e25..25a7671212c 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java @@ -2,6 +2,7 @@ package forge.screens.quest; import java.util.List; +import forge.assets.FImage; import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.interfaces.IButton; @@ -41,24 +42,12 @@ public class QuestStatsScreen extends FScreen { return new ScrollBounds(visibleWidth, y); } }); - private final FLabel lblWins = scroller.add(new FLabel.Builder() - .icon(FSkinImage.QUEST_PLUS) - .font(FSkinFont.get(16)).iconScaleFactor(1).build()); - private final FLabel lblLosses = scroller.add(new FLabel.Builder() - .icon(FSkinImage.QUEST_MINUS) - .font(FSkinFont.get(16)).iconScaleFactor(1).build()); - private final FLabel lblCredits = scroller.add(new FLabel.Builder() - .icon(FSkinImage.QUEST_COINSTACK) - .font(FSkinFont.get(16)).iconScaleFactor(1).build()); - private final FLabel lblWinStreak = scroller.add(new FLabel.Builder() - .icon(FSkinImage.QUEST_PLUSPLUS) - .font(FSkinFont.get(16)).iconScaleFactor(1).build()); - private final FLabel lblLife = scroller.add(new FLabel.Builder() - .icon(FSkinImage.QUEST_LIFE) - .font(FSkinFont.get(16)).iconScaleFactor(1).build()); - private final FLabel lblWorld = scroller.add(new FLabel.Builder() - .icon(FSkinImage.QUEST_MAP) - .font(FSkinFont.get(16)).iconScaleFactor(1).build()); + private final FLabel lblWins = scroller.add(new StatLabel(FSkinImage.QUEST_PLUS)); + private final FLabel lblLosses = scroller.add(new StatLabel(FSkinImage.QUEST_MINUS)); + private final FLabel lblCredits = scroller.add(new StatLabel(FSkinImage.QUEST_COINSTACK)); + private final FLabel lblWinStreak = scroller.add(new StatLabel(FSkinImage.QUEST_PLUSPLUS)); + private final FLabel lblLife = scroller.add(new StatLabel(FSkinImage.QUEST_LIFE)); + private final FLabel lblWorld = scroller.add(new StatLabel(FSkinImage.QUEST_MAP)); private final FComboBox cbxPet = scroller.add(new FComboBox()); private final FComboBox cbxMatchLength = new FComboBox(); private final FCheckBox cbPlant = scroller.add(new FCheckBox("Summon Plant")); @@ -157,4 +146,10 @@ public class QuestStatsScreen extends FScreen { protected void doLayout(float startY, float width, float height) { scroller.setBounds(0, startY, width, height - startY); } + + private static class StatLabel extends FLabel { + private StatLabel(FImage icon0) { + super(new FLabel.Builder().icon(icon0).font(FSkinFont.get(16)).iconScaleFactor(1)); + } + } } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java index 0de32d8aa7e..803e653d9e7 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java @@ -312,7 +312,7 @@ public final class ConquestData { return false; } - public int getUnlockedCount() { + public int getUnlockedCardCount() { return unlockedCards.size(); } @@ -384,6 +384,95 @@ public final class ConquestData { return chaosBattleRecord; } + public void updateStatLabels(IVConquestStats view, ConquestPlane plane) { + int wins = 0; + int losses = 0; + int conqueredCount = 0; + int totalEventCount = 0; + int unlockedCardCount = 0; + int totalCardCount = 0; + int commanderCount = 0; + int totalCommanderCount = 0; + int planeswalkerCount = 0; + int totalPlaneswalkerCount = 0; + + if (plane != null) { + ConquestPlaneData planeData = planeDataMap.get(plane.getName()); + if (planeData != null) { + wins = planeData.getTotalWins(); + losses = planeData.getTotalLosses(); + conqueredCount = planeData.getConqueredCount(); + } + + for (ConquestCommander commander : commanders) { + if (plane.getCommanders().contains(commander.getCard())) { + commanderCount++; + } + } + + totalEventCount = plane.getEventCount(); + totalCardCount = plane.getCardPool().size(); + totalCommanderCount = plane.getCommanders().size(); + + for (PaperCard card : plane.getCardPool().getAllCards()) { + boolean unlocked = hasUnlockedCard(card); + if (unlocked) { + unlockedCardCount++; + } + if (card.getRules().getType().isPlaneswalker()) { + if (unlocked) { + planeswalkerCount++; + } + totalPlaneswalkerCount++; + } + } + } + else { + for (ConquestPlane p : FModel.getPlanes()) { + ConquestPlaneData planeData = planeDataMap.get(p.getName()); + if (planeData != null) { + wins += planeData.getTotalWins(); + losses += planeData.getTotalLosses(); + conqueredCount += planeData.getConqueredCount(); + } + + totalEventCount += p.getEventCount(); + totalCardCount += p.getCardPool().size(); + totalCommanderCount += p.getCommanders().size(); + + for (PaperCard card : p.getCardPool().getAllCards()) { + boolean unlocked = hasUnlockedCard(card); + if (unlocked) { + unlockedCardCount++; + } + if (card.getRules().getType().isPlaneswalker()) { + if (unlocked) { + planeswalkerCount++; + } + totalPlaneswalkerCount++; + } + } + } + commanderCount = commanders.size(); + } + + view.getLblAEtherShards().setText("AEther Shards: " + aetherShards); + view.getLblPlaneswalkEmblems().setText("Planeswalk Emblems: " + planeswalkEmblems); + view.getLblTotalWins().setText("Total Wins: " + wins); + view.getLblTotalLosses().setText("Total Losses: " + losses); + view.getLblConqueredEvents().setText("Conquered Events: " + formatRatio(conqueredCount, totalEventCount)); + view.getLblUnlockedCards().setText("Unlocked Cards: " + formatRatio(unlockedCardCount, totalCardCount)); + view.getLblCommanders().setText("Commanders: " + formatRatio(commanderCount, totalCommanderCount)); + view.getLblPlaneswalkers().setText("Planeswalkers: " + formatRatio(planeswalkerCount, totalPlaneswalkerCount)); + } + + private String formatRatio(int numerator, int denominator) { + if (denominator == 0) { + return "0 / 0 (0%)"; + } + return numerator + " / " + denominator + " (" + Math.round(100f * (float)numerator / (float)denominator) + "%)"; + } + public void rename(final String newName) { name = newName; File directory0 = new File(ForgeConstants.CONQUEST_SAVE_DIR, name.replace(' ', '_')); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java index a81f23d6682..c1b0455a1af 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java @@ -80,7 +80,29 @@ public class ConquestPlaneData implements IXmlWritable { return conquered; } - public int getUnlockedCount() { + public int getTotalWins() { + int wins = 0; + for (int i = 0; i < eventResults.length; i++) { + ConquestEventRecord result = eventResults[i]; + if (result != null) { + wins += result.getTotalWins(); + } + } + return wins; + } + + public int getTotalLosses() { + int losses = 0; + for (int i = 0; i < eventResults.length; i++) { + ConquestEventRecord result = eventResults[i]; + if (result != null) { + losses += result.getTotalLosses(); + } + } + return losses; + } + + public int getUnlockedCardCount() { int count = 0; ConquestData model = FModel.getConquest().getModel(); for (PaperCard pc : location.getPlane().getCardPool().getAllCards()) { diff --git a/forge-gui/src/main/java/forge/planarconquest/IVConquestStats.java b/forge-gui/src/main/java/forge/planarconquest/IVConquestStats.java new file mode 100644 index 00000000000..8eb7cb8f11a --- /dev/null +++ b/forge-gui/src/main/java/forge/planarconquest/IVConquestStats.java @@ -0,0 +1,14 @@ +package forge.planarconquest; + +import forge.interfaces.IButton; + +public interface IVConquestStats { + IButton getLblAEtherShards(); + IButton getLblPlaneswalkEmblems(); + IButton getLblTotalWins(); + IButton getLblTotalLosses(); + IButton getLblConqueredEvents(); + IButton getLblUnlockedCards(); + IButton getLblCommanders(); + IButton getLblPlaneswalkers(); +} \ No newline at end of file