Support rendering grid overlays based on event record

This commit is contained in:
drdev
2015-11-28 17:13:05 +00:00
parent e5a5855d2a
commit 91d1cf65b4
8 changed files with 165 additions and 77 deletions

3
.gitattributes vendored
View File

@@ -18290,6 +18290,9 @@ forge-gui/src/main/java/forge/planarconquest/ConquestController.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestData.java -text forge-gui/src/main/java/forge/planarconquest/ConquestData.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestDataIO.java -text forge-gui/src/main/java/forge/planarconquest/ConquestDataIO.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestDeckMap.java -text forge-gui/src/main/java/forge/planarconquest/ConquestDeckMap.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestEventRecord.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestOpponent.java -text forge-gui/src/main/java/forge/planarconquest/ConquestOpponent.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java -text forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java -text
forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java -text forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java -text

View File

@@ -7,25 +7,22 @@ import com.badlogic.gdx.graphics.Color;
import forge.Graphics; import forge.Graphics;
import forge.assets.FImage; import forge.assets.FImage;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
import forge.card.CardDetailUtil; import forge.card.CardDetailUtil;
import forge.card.CardRenderer; 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.ConquestOpponent; import forge.planarconquest.ConquestEventRecord;
import forge.planarconquest.ConquestPlane; import forge.planarconquest.ConquestLocation;
import forge.planarconquest.ConquestPlane.Region; import forge.planarconquest.ConquestPlane.Region;
import forge.planarconquest.ConquestPlaneData;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.toolbox.FList;
import forge.toolbox.FList.ListItemRenderer;
import forge.toolbox.FScrollPane; import forge.toolbox.FScrollPane;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollectionView;
public class ConquestMapScreen extends FScreen { public class ConquestMapScreen extends FScreen {
private static final int GRID_ROWS = 3;
private static final int GRID_COLS = 3;
private static final Color FOG_OF_WAR_COLOR = FSkinColor.alphaColor(Color.BLACK, 0.6f); private static final Color FOG_OF_WAR_COLOR = FSkinColor.alphaColor(Color.BLACK, 0.6f);
private static final Color UNCONQUERED_COLOR = FSkinColor.alphaColor(Color.BLACK, 0.2f);
private final PlaneGrid planeGrid; private final PlaneGrid planeGrid;
private ConquestData model; private ConquestData model;
@@ -80,8 +77,12 @@ public class ConquestMapScreen extends FScreen {
float w = getWidth(); float w = getWidth();
float h = getHeight(); float h = getHeight();
float regionHeight = w / CardRenderer.CARD_ART_RATIO; float regionHeight = w / CardRenderer.CARD_ART_RATIO;
float colWidth = w / GRID_COLS; int cols = Region.COLS_PER_REGION;
float rowHeight = regionHeight / GRID_ROWS; int rows = Region.ROWS_PER_REGION;
float colWidth = w / cols;
float rowHeight = regionHeight / rows;
ConquestPlaneData planeData = model.getCurrentPlaneData();
ConquestLocation currentLocation = model.getCurrentLocation();
g.startClip(0, 0, w, h); g.startClip(0, 0, w, h);
@@ -125,9 +126,35 @@ public class ConquestMapScreen extends FScreen {
} }
} }
//draw event icon and overlay based on event record for each event in the region
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
ConquestEventRecord record = planeData.getRecord(i, r, c);
if (record == null || record.getWins() == 0) {
//draw fog of war by default if area hasn't been conquered
Color color = FOG_OF_WAR_COLOR;
//if any bordering grid square has been conquered, instead show unconquered color
for (ConquestLocation loc : currentLocation.getNeighbors(i, r, c)) {
if (loc.getRegion() == null) {
color = UNCONQUERED_COLOR;
break;
}
record = planeData.getRecord(loc.getRegionIndex(), loc.getRow(), loc.getCol());
if (record != null && record.getWins() > 0) {
color = UNCONQUERED_COLOR;
break;
}
}
g.fillRect(color, x + c * colWidth, y + r * rowHeight, colWidth, rowHeight);
}
}
}
//draw row lines //draw row lines
float y0 = y; float y0 = y;
for (int r = 0; r < GRID_ROWS; r++) { for (int r = 0; r < rows; r++) {
g.drawLine(1, Color.BLACK, 0, y0, w, y0); g.drawLine(1, Color.BLACK, 0, y0, w, y0);
y0 += rowHeight; y0 += rowHeight;
} }
@@ -143,7 +170,7 @@ public class ConquestMapScreen extends FScreen {
//draw column lines //draw column lines
float x0 = x + colWidth; float x0 = x + colWidth;
for (int c = 1; c < GRID_COLS; c++) { for (int c = 1; c < cols; c++) {
g.drawLine(1, Color.BLACK, x0, 0, x0, h); g.drawLine(1, Color.BLACK, x0, 0, x0, h);
x0 += colWidth; x0 += colWidth;
} }
@@ -154,7 +181,7 @@ public class ConquestMapScreen extends FScreen {
@Override @Override
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
float regionHeight = visibleWidth / CardRenderer.CARD_ART_RATIO; float regionHeight = visibleWidth / CardRenderer.CARD_ART_RATIO;
float rowHeight = regionHeight / GRID_ROWS; float rowHeight = regionHeight / Region.ROWS_PER_REGION;
float height = model.getCurrentPlane().getRegions().size() * regionHeight; float height = model.getCurrentPlane().getRegions().size() * regionHeight;
height += 2 * rowHeight; //account for portal row at top and bottom height += 2 * rowHeight; //account for portal row at top and bottom
return new ScrollBounds(visibleWidth, height); return new ScrollBounds(visibleWidth, height);

View File

@@ -23,7 +23,6 @@ import forge.deck.Deck;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.model.FModel; import forge.model.FModel;
import forge.planarconquest.ConquestPlane.Region;
import forge.properties.ForgeConstants; import forge.properties.ForgeConstants;
import forge.util.ItemPool; import forge.util.ItemPool;
@@ -51,10 +50,10 @@ public final class ConquestData {
private int progress = 100; private int progress = 100;
private int planewalkerPosition = 0; private int planewalkerPosition = 0;
private int difficulty; private int difficulty;
private ConquestPlane startingPlane, currentPlane; private ConquestPlane startingPlane;
private int currentRegionIndex;
private PaperCard planeswalker; private PaperCard planeswalker;
private ISkinImage planeswalkerToken; private ISkinImage planeswalkerToken;
private final ConquestLocation currentLocation = new ConquestLocation();
private final EnumMap<ConquestPlane, ConquestPlaneData> planeDataMap = new EnumMap<ConquestPlane, ConquestPlaneData>(ConquestPlane.class); private final EnumMap<ConquestPlane, ConquestPlaneData> planeDataMap = new EnumMap<ConquestPlane, ConquestPlaneData>(ConquestPlane.class);
private final HashSet<PaperCard> collection = new HashSet<PaperCard>(); private final HashSet<PaperCard> collection = new HashSet<PaperCard>();
@@ -69,7 +68,7 @@ public final class ConquestData {
name = name0; name = name0;
difficulty = difficulty0; difficulty = difficulty0;
startingPlane = startingPlane0; startingPlane = startingPlane0;
currentPlane = startingPlane0; currentLocation.travelToPlane(startingPlane);
planeswalker = planeswalker0; planeswalker = planeswalker0;
planeswalkerToken = PlaneswalkerAchievements.getTrophyImage(planeswalker.getName()); planeswalkerToken = PlaneswalkerAchievements.getTrophyImage(planeswalker.getName());
collection.add(planeswalker); collection.add(planeswalker);
@@ -103,10 +102,15 @@ public final class ConquestData {
} }
public ConquestPlane getCurrentPlane() { public ConquestPlane getCurrentPlane() {
return currentPlane; return currentLocation.getPlane();
}
public ConquestLocation getCurrentLocation() {
return currentLocation;
} }
public ConquestPlaneData getCurrentPlaneData() { public ConquestPlaneData getCurrentPlaneData() {
ConquestPlane currentPlane = getCurrentPlane();
ConquestPlaneData planeData = planeDataMap.get(currentPlane); ConquestPlaneData planeData = planeDataMap.get(currentPlane);
if (planeData == null) { if (planeData == null) {
planeData = new ConquestPlaneData(currentPlane); planeData = new ConquestPlaneData(currentPlane);
@@ -115,32 +119,6 @@ public final class ConquestData {
return planeData; return planeData;
} }
public Region getCurrentRegion() {
return currentPlane.getRegions().get(currentRegionIndex);
}
public boolean setCurrentRegion(Region region) {
int index = currentPlane.getRegions().indexOf(region);
if (index != -1 && currentRegionIndex != index) {
currentRegionIndex = index;
return true;
}
return false;
}
public void incrementRegion(int dir) {
if (dir > 0) {
currentRegionIndex++;
if (currentRegionIndex >= currentPlane.getRegions().size()) {
currentRegionIndex = 0;
}
}
else {
currentRegionIndex--;
if (currentRegionIndex < 0) {
currentRegionIndex = currentPlane.getRegions().size() - 1;
}
}
}
public HashSet<PaperCard> getCollection() { public HashSet<PaperCard> getCollection() {
return collection; return collection;
} }

View File

@@ -0,0 +1,5 @@
package forge.planarconquest;
public class ConquestEvent {
}

View File

@@ -0,0 +1,36 @@
package forge.planarconquest;
public class ConquestEventRecord {
private int wins, losses;
private int winStreakBest = 0;
private int winStreakCurrent = 0;
public void addWin() {
wins++;
winStreakCurrent++;
if (winStreakCurrent > winStreakBest) {
winStreakBest = winStreakCurrent;
}
}
public void addLoss(ConquestCommander opponent) {
losses++;
winStreakCurrent = 0;
}
public int getWins() {
return wins;
}
public int getLosses() {
return losses;
}
public int getWinStreakBest() {
return winStreakBest;
}
public int getWinStreakCurrent() {
return winStreakCurrent;
}
}

View File

@@ -0,0 +1,64 @@
package forge.planarconquest;
import java.util.ArrayList;
import java.util.List;
import forge.planarconquest.ConquestPlane.Region;
public class ConquestLocation {
private ConquestPlane plane;
private int regionIndex;
private int row;
private int col;
public ConquestLocation() {
}
public ConquestPlane getPlane() {
return plane;
}
public Region getRegion() {
if (regionIndex == -1 || regionIndex == plane.getRegions().size()) {
return null; //indicates we're on portal row
}
return plane.getRegions().get(regionIndex);
}
public int getRegionIndex() {
return regionIndex;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
public void travelToPlane(ConquestPlane plane0) {
if (plane == plane0) { return; }
if (plane == null /*|| plane0 follows plane in travel order */) {
regionIndex = -1; //start on bottom portal row
}
else {
regionIndex = plane.getRegions().size(); //start on top portal row
}
plane = plane0;
}
public List<ConquestLocation> getNeighbors() {
return getNeighbors(regionIndex, row, col);
}
public List<ConquestLocation> getNeighbors(int regionIndex0, int row0, int col0) {
List<ConquestLocation> locations = new ArrayList<ConquestLocation>();
if (row0 > 0) {
}
else if (regionIndex0 > 0) {
}
return locations;
}
}

View File

@@ -272,7 +272,8 @@ public enum ConquestPlane {
} }
public static class Region { public static class Region {
public static final int OPPONENTS_PER_REGION = 15; public static final int ROWS_PER_REGION = 3;
public static final int COLS_PER_REGION = 3;
private final String name; private final String name;
private final String artCardName; private final String artCardName;
@@ -327,7 +328,7 @@ public enum ConquestPlane {
//each region should have 15 opponents include one boss //each region should have 15 opponents include one boss
private void generateOpponents() { private void generateOpponents() {
int opponentsBeforeBoss = OPPONENTS_PER_REGION; //TODO: Reduce by 1 when boss added below int opponentsBeforeBoss = ROWS_PER_REGION * COLS_PER_REGION; //TODO: Reduce by 1 when boss added below
HashSet<PaperCard> cards = new HashSet<PaperCard>(commanders); HashSet<PaperCard> cards = new HashSet<PaperCard>(commanders);
if (cards.size() < opponentsBeforeBoss) { if (cards.size() < opponentsBeforeBoss) {
//if not enough commanders, add normal creatures as non-commander opponents //if not enough commanders, add normal creatures as non-commander opponents

View File

@@ -1,19 +1,13 @@
package forge.planarconquest; package forge.planarconquest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.model.FModel; import forge.model.FModel;
import forge.planarconquest.ConquestPlane.Region;
public class ConquestPlaneData { public class ConquestPlaneData {
private final List<ConquestCommander> commanders = new ArrayList<ConquestCommander>();
private final Map<String, Integer> winsPerOpponent = new HashMap<String, Integer>();
private final Map<String, Integer> lossesPerOpponent = new HashMap<String, Integer>();
private final ConquestPlane plane; private final ConquestPlane plane;
private final ConquestEventRecord[][][] records;
private int wins, losses; private int wins, losses;
private int winStreakBest = 0; private int winStreakBest = 0;
@@ -21,29 +15,11 @@ public class ConquestPlaneData {
public ConquestPlaneData(ConquestPlane plane0) { public ConquestPlaneData(ConquestPlane plane0) {
plane = plane0; plane = plane0;
records = new ConquestEventRecord[plane.getRegions().size()][Region.ROWS_PER_REGION][Region.COLS_PER_REGION];
} }
public List<ConquestCommander> getCommanders() { public ConquestEventRecord getRecord(int regionIndex, int row, int col) {
return commanders; return records[regionIndex][row][col];
}
public boolean hasCommander(PaperCard pc) {
for (ConquestCommander c : commanders) {
if (c.getCard() == pc) {
return true;
}
}
return false;
}
public int getWinsAgainst(PaperCard pc) {
Integer wins = winsPerOpponent.get(pc.getName());
return wins == null ? 0 : wins.intValue();
}
public int getLossesAgainst(PaperCard pc) {
Integer losses = lossesPerOpponent.get(pc.getName());
return losses == null ? 0 : losses.intValue();
} }
public void addWin(ConquestCommander opponent) { public void addWin(ConquestCommander opponent) {
@@ -52,13 +28,11 @@ public class ConquestPlaneData {
if (winStreakCurrent > winStreakBest) { if (winStreakCurrent > winStreakBest) {
winStreakBest = winStreakCurrent; winStreakBest = winStreakCurrent;
} }
winsPerOpponent.put(opponent.getName(), getWinsAgainst(opponent.getCard()) + 1);
} }
public void addLoss(ConquestCommander opponent) { public void addLoss(ConquestCommander opponent) {
losses++; losses++;
winStreakCurrent = 0; winStreakCurrent = 0;
lossesPerOpponent.put(opponent.getName(), getLossesAgainst(opponent.getCard()) + 1);
} }
public int getWins() { public int getWins() {