Add Statistics screen for Planar Conquest

This commit is contained in:
drdev
2016-03-28 00:20:12 +00:00
parent 14889b0878
commit 7fa16c0e15
8 changed files with 288 additions and 21 deletions

2
.gitattributes vendored
View File

@@ -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

View File

@@ -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);
}

View File

@@ -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<Object> cbPlanes = add(new FComboBox<Object>());
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));
}
}
}

View File

@@ -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;

View File

@@ -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<String> cbxPet = scroller.add(new FComboBox<String>());
private final FComboBox<String> cbxMatchLength = new FComboBox<String>();
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));
}
}
}

View File

@@ -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(' ', '_'));

View File

@@ -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()) {

View File

@@ -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();
}