Make it so record of each tier is tracked separately

This commit is contained in:
drdev
2016-01-09 16:59:43 +00:00
parent 103e2be7b2
commit 26bc9acd9b
7 changed files with 111 additions and 37 deletions

View File

@@ -4,6 +4,7 @@ import java.util.List;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import forge.Forge; import forge.Forge;
import forge.Graphics; import forge.Graphics;
import forge.animation.ForgeAnimation; import forge.animation.ForgeAnimation;
@@ -15,11 +16,11 @@ import forge.card.CardRenderer;
import forge.card.CardDetailUtil.DetailColors; import forge.card.CardDetailUtil.DetailColors;
import forge.model.FModel; import forge.model.FModel;
import forge.planarconquest.ConquestData; import forge.planarconquest.ConquestData;
import forge.planarconquest.ConquestEvent.ConquestEventRecord;
import forge.planarconquest.ConquestLocation; import forge.planarconquest.ConquestLocation;
import forge.planarconquest.ConquestPlane; import forge.planarconquest.ConquestPlane;
import forge.planarconquest.ConquestPlane.Region; import forge.planarconquest.ConquestPlane.Region;
import forge.planarconquest.ConquestPlaneData; import forge.planarconquest.ConquestPlaneData;
import forge.planarconquest.ConquestRecord;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.toolbox.FScrollPane; import forge.toolbox.FScrollPane;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollectionView;
@@ -144,18 +145,18 @@ public class ConquestMultiverseScreen extends FScreen {
x0 = x + c * colWidth; x0 = x + c * colWidth;
y0 = y + (rows - r - 1) * rowHeight; y0 = y + (rows - r - 1) * rowHeight;
ConquestRecord eventRecord = planeData.getEventRecord(i, r, c); ConquestEventRecord eventRecord = planeData.getEventRecord(i, r, c);
if (eventRecord != null && eventRecord.getWins() > 0) { if (eventRecord != null && eventRecord.hasConquered()) {
//draw badge in upper-right corner of conquered squares //draw badge in upper-right corner of conquered squares
FSkinImage badge; FSkinImage badge;
switch (eventRecord.getTier()) { switch (eventRecord.getHighestConqueredTier()) {
case 1: case 0:
badge = FSkinImage.PW_BADGE_COMMON; badge = FSkinImage.PW_BADGE_COMMON;
break; break;
case 2: case 1:
badge = FSkinImage.PW_BADGE_UNCOMMON; badge = FSkinImage.PW_BADGE_UNCOMMON;
break; break;
case 3: case 2:
badge = FSkinImage.PW_BADGE_RARE; badge = FSkinImage.PW_BADGE_RARE;
break; break;
default: default:

View File

@@ -19,17 +19,17 @@ public class ConquestCommander implements InventoryItem, IXmlWritable {
private Deck deck; private Deck deck;
public ConquestCommander(PaperCard card0) { public ConquestCommander(PaperCard card0) {
this(card0, new Deck(card0.getName())); this(card0, new Deck(card0.getName()), null);
} }
public ConquestCommander(PaperCard card0, DeckGenPool cardPool0, boolean forAi) { public ConquestCommander(PaperCard card0, DeckGenPool cardPool0, boolean forAi) {
this(card0, ConquestUtil.generateDeck(card0, cardPool0, forAi)); this(card0, ConquestUtil.generateDeck(card0, cardPool0, forAi), null);
}
private ConquestCommander(PaperCard card0, Deck deck0) {
this(card0, deck0, new ConquestRecord());
} }
private ConquestCommander(PaperCard card0, Deck deck0, ConquestRecord record0) { private ConquestCommander(PaperCard card0, Deck deck0, ConquestRecord record0) {
card = card0; card = card0;
deck = deck0; deck = deck0;
if (record0 == null) {
record0 = new ConquestRecord();
}
record = record0; record = record0;
//determine origin of commander //determine origin of commander

View File

@@ -186,10 +186,12 @@ public final class ConquestData {
public void addWin(ConquestEvent event) { public void addWin(ConquestEvent event) {
getOrCreatePlaneData(event.getLocation().getPlane()).addWin(event); getOrCreatePlaneData(event.getLocation().getPlane()).addWin(event);
getSelectedCommander().getRecord().addWin();
} }
public void addLoss(ConquestEvent event) { public void addLoss(ConquestEvent event) {
getOrCreatePlaneData(event.getLocation().getPlane()).addLoss(event); getOrCreatePlaneData(event.getLocation().getPlane()).addLoss(event);
getSelectedCommander().getRecord().addLoss();
} }
public int getAEtherShards() { public int getAEtherShards() {

View File

@@ -5,6 +5,9 @@ import java.util.Set;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.planarconquest.ConquestController.GameRunner; import forge.planarconquest.ConquestController.GameRunner;
import forge.util.XmlReader;
import forge.util.XmlWriter;
import forge.util.XmlWriter.IXmlWritable;
public abstract class ConquestEvent { public abstract class ConquestEvent {
private final ConquestLocation location; private final ConquestLocation location;
@@ -40,4 +43,80 @@ public abstract class ConquestEvent {
public static interface IConquestEventLauncher { public static interface IConquestEventLauncher {
void startGame(GameRunner gameRunner); void startGame(GameRunner gameRunner);
} }
public static class ConquestEventRecord implements IXmlWritable {
private final ConquestRecord[] tiers = new ConquestRecord[4];
public ConquestEventRecord() {
}
public ConquestEventRecord(XmlReader xml) {
xml.read("tiers", tiers, ConquestRecord.class);
}
@Override
public void saveToXml(XmlWriter xml) {
xml.write("tiers", tiers);
}
public boolean hasConquered() {
//it's enough to check first tier, as second tier wouldn't unlock without beating it at least once
ConquestRecord record = tiers[0];
return record != null && record.getWins() > 0;
}
public int getTotalWins() {
int wins = 0;
for (int i = 0; i < tiers.length; i++) {
ConquestRecord record = tiers[i];
if (record != null) {
wins += record.getWins();
}
}
return wins;
}
public int getTotalLosses() {
int losses = 0;
for (int i = 0; i < tiers.length; i++) {
ConquestRecord record = tiers[i];
if (record != null) {
losses += record.getLosses();
}
}
return losses;
}
public int getWins(int tier) {
ConquestRecord record = tiers[tier];
return record != null ? record.getWins() : 0;
}
public int getLosses(int tier) {
ConquestRecord record = tiers[tier];
return record != null ? record.getLosses() : 0;
}
private ConquestRecord getOrCreateRecord(int tier) {
ConquestRecord record = tiers[tier];
if (record == null) {
record = new ConquestRecord();
tiers[tier] = record;
}
return record;
}
public void addWin(int tier) {
getOrCreateRecord(tier).addWin();
}
public void addLoss(int tier) {
getOrCreateRecord(tier).addLoss();
}
public int getHighestConqueredTier() {
for (int i = tiers.length - 1; i >= 0; i--) {
ConquestRecord record = tiers[i];
if (record != null && record.getWins() > 0) {
return i;
}
}
return -1;
}
}
} }

View File

@@ -115,7 +115,7 @@ public class ConquestLocation implements IXmlWritable {
public ConquestEvent getEvent() { public ConquestEvent getEvent() {
//TODO: Make this pull from predefined events //TODO: Make this pull from predefined events
return new ConquestEvent(this, 1) { return new ConquestEvent(this, 0) {
private final PaperCard commander = Aggregates.random(getRegion().getCommanders()); private final PaperCard commander = Aggregates.random(getRegion().getCommanders());
@Override @Override

View File

@@ -2,24 +2,25 @@ package forge.planarconquest;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.model.FModel; import forge.model.FModel;
import forge.planarconquest.ConquestEvent.ConquestEventRecord;
import forge.planarconquest.ConquestPlane.Region; import forge.planarconquest.ConquestPlane.Region;
import forge.util.XmlReader; import forge.util.XmlReader;
import forge.util.XmlWriter; import forge.util.XmlWriter;
import forge.util.XmlWriter.IXmlWritable; import forge.util.XmlWriter.IXmlWritable;
public class ConquestPlaneData implements IXmlWritable { public class ConquestPlaneData implements IXmlWritable {
private final ConquestRecord[] eventResults; private final ConquestEventRecord[] eventResults;
private ConquestLocation location; private ConquestLocation location;
public ConquestPlaneData(ConquestPlane plane0) { public ConquestPlaneData(ConquestPlane plane0) {
location = new ConquestLocation(plane0, 0, 0, 0); location = new ConquestLocation(plane0, 0, 0, 0);
eventResults = new ConquestRecord[plane0.getEventCount()]; eventResults = new ConquestEventRecord[plane0.getEventCount()];
} }
public ConquestPlaneData(XmlReader xml) { public ConquestPlaneData(XmlReader xml) {
location = xml.read("location", ConquestLocation.class); location = xml.read("location", ConquestLocation.class);
eventResults = new ConquestRecord[location.getPlane().getEventCount()]; eventResults = new ConquestEventRecord[location.getPlane().getEventCount()];
xml.read("eventResults", eventResults, ConquestRecord.class); xml.read("eventResults", eventResults, ConquestEventRecord.class);
} }
@Override @Override
public void saveToXml(XmlWriter xml) { public void saveToXml(XmlWriter xml) {
@@ -34,23 +35,23 @@ public class ConquestPlaneData implements IXmlWritable {
return hasConquered(regionIndex * Region.ROWS_PER_REGION * Region.COLS_PER_REGION + row * Region.COLS_PER_REGION + col); return hasConquered(regionIndex * Region.ROWS_PER_REGION * Region.COLS_PER_REGION + row * Region.COLS_PER_REGION + col);
} }
private boolean hasConquered(int index) { private boolean hasConquered(int index) {
ConquestRecord result = eventResults[index]; ConquestEventRecord result = eventResults[index];
return result != null && result.getWins() > 0; return result != null && result.hasConquered();
} }
public ConquestRecord getEventRecord(ConquestLocation loc) { public ConquestEventRecord getEventRecord(ConquestLocation loc) {
return getEventRecord(loc.getRegionIndex(), loc.getRow(), loc.getCol()); return getEventRecord(loc.getRegionIndex(), loc.getRow(), loc.getCol());
} }
public ConquestRecord getEventRecord(int regionIndex, int row, int col) { public ConquestEventRecord getEventRecord(int regionIndex, int row, int col) {
return eventResults[regionIndex * Region.ROWS_PER_REGION * Region.COLS_PER_REGION + row * Region.COLS_PER_REGION + col]; return eventResults[regionIndex * Region.ROWS_PER_REGION * Region.COLS_PER_REGION + row * Region.COLS_PER_REGION + col];
} }
private ConquestRecord getOrCreateResult(ConquestEvent event) { private ConquestEventRecord getOrCreateResult(ConquestEvent event) {
ConquestLocation loc = event.getLocation(); ConquestLocation loc = event.getLocation();
int index = loc.getRegionIndex() * Region.ROWS_PER_REGION * Region.COLS_PER_REGION + loc.getRow() * Region.COLS_PER_REGION + loc.getCol(); int index = loc.getRegionIndex() * Region.ROWS_PER_REGION * Region.COLS_PER_REGION + loc.getRow() * Region.COLS_PER_REGION + loc.getCol();
ConquestRecord result = eventResults[index]; ConquestEventRecord result = eventResults[index];
if (result == null) { if (result == null) {
result = new ConquestRecord(); result = new ConquestEventRecord();
eventResults[index] = result; eventResults[index] = result;
} }
return result; return result;
@@ -68,7 +69,7 @@ public class ConquestPlaneData implements IXmlWritable {
} }
public void addLoss(ConquestEvent event) { public void addLoss(ConquestEvent event) {
getOrCreateResult(event).addLoss(); getOrCreateResult(event).addLoss(event.getTier());
} }
public int getConqueredCount() { public int getConqueredCount() {

View File

@@ -5,21 +5,19 @@ import forge.util.XmlWriter;
import forge.util.XmlWriter.IXmlWritable; import forge.util.XmlWriter.IXmlWritable;
public class ConquestRecord implements IXmlWritable { public class ConquestRecord implements IXmlWritable {
private int wins, losses, tier; private int wins, losses;
public ConquestRecord() { public ConquestRecord() {
} }
public ConquestRecord(XmlReader xml) { public ConquestRecord(XmlReader xml) {
wins = xml.read("wins", 0); wins = xml.read("wins", 0);
losses = xml.read("losses", 0); losses = xml.read("losses", 0);
tier = xml.read("tier", 0);
} }
@Override @Override
public void saveToXml(XmlWriter xml) { public void saveToXml(XmlWriter xml) {
xml.write("wins", wins); xml.write("wins", wins);
xml.write("losses", losses); xml.write("losses", losses);
xml.write("tier", tier);
} }
public int getWins() { public int getWins() {
@@ -30,15 +28,8 @@ public class ConquestRecord implements IXmlWritable {
return losses; return losses;
} }
public int getTier() { public void addWin() {
return tier;
}
public void addWin(int tier0) {
wins++; wins++;
if (tier0 > tier) {
tier = tier0;
}
} }
public void addLoss() { public void addLoss() {