diff --git a/.gitattributes b/.gitattributes index 3311ddcd686..1e8e8f710b1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16951,8 +16951,6 @@ forge-gui/res/skins/dark_ascension/font1.ttf -text forge-gui/res/skins/dark_ascension/sprite_icons.png -text forge-gui/res/skins/default/bg_draft_deck.png -text forge-gui/res/skins/default/bg_match.jpg -text -forge-gui/res/skins/default/bg_monitor.png -text -forge-gui/res/skins/default/bg_planar_map.png -text forge-gui/res/skins/default/bg_splash.png -text forge-gui/res/skins/default/bg_texture.jpg -text forge-gui/res/skins/default/font1.ttf -text @@ -16962,6 +16960,7 @@ forge-gui/res/skins/default/sprite_avatars.png -text forge-gui/res/skins/default/sprite_foils.png -text forge-gui/res/skins/default/sprite_icons.png -text forge-gui/res/skins/default/sprite_old_foils.png -text +forge-gui/res/skins/default/sprite_planar_conquest.png -text forge-gui/res/skins/default/sprite_trophies.png -text forge-gui/res/skins/firebloom/bg_match.jpg -text forge-gui/res/skins/firebloom/bg_splash.png -text @@ -17243,6 +17242,7 @@ 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/ConquestPlane.java -text forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java -text +forge-gui/src/main/java/forge/planarconquest/ConquestPlaneMap.java -text forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java -text forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java -text forge-gui/src/main/java/forge/planarconquest/IVCommandCenter.java -text diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java b/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java index 28e34711b26..68501fc1c1d 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java @@ -1169,8 +1169,6 @@ public class FSkin { // Exceptions handled inside method. SkinIcon.setIcon(FSkinProp.BG_TEXTURE, preferredDir + ForgeConstants.TEXTURE_BG_FILE); SkinIcon.setIcon(FSkinProp.BG_MATCH, preferredDir + ForgeConstants.MATCH_BG_FILE); - SkinIcon.setIcon(FSkinProp.BG_PLANAR_MAP, preferredDir + ForgeConstants.PLANAR_MAP_BG_FILE); - SkinIcon.setIcon(FSkinProp.BG_MONITOR, preferredDir + ForgeConstants.MONITOR_BG_FILE); // Run through enums and load their coords. Colors.updateAll(); diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 3df667115ae..d9a13c61fa3 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -116,6 +116,9 @@ public enum FSkinImage implements FImage { TROPHY_CASE_TOP (FSkinProp.IMG_TROPHY_CASE_TOP, SourceFile.TROPHIES), TROPHY_SHELF (FSkinProp.IMG_TROPHY_SHELF, SourceFile.TROPHIES), + //Achievement Trophies + HEXAGON_TILE (FSkinProp.IMG_HEXAGON_TILE, SourceFile.PLANAR_CONQUEST), + //Quest Icons QUEST_ZEP (FSkinProp.ICO_QUEST_ZEP, SourceFile.ICONS), QUEST_GEAR (FSkinProp.ICO_QUEST_GEAR, SourceFile.ICONS), @@ -237,7 +240,8 @@ public enum FSkinImage implements FImage { ICONS(ForgeConstants.SPRITE_ICONS_FILE), FOILS(ForgeConstants.SPRITE_FOILS_FILE), OLD_FOILS(ForgeConstants.SPRITE_OLD_FOILS_FILE), - TROPHIES(ForgeConstants.SPRITE_TROPHIES_FILE); + TROPHIES(ForgeConstants.SPRITE_TROPHIES_FILE), + PLANAR_CONQUEST(ForgeConstants.SPRITE_PLANAR_CONQUEST_FILE); private final String filename; diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index 8fc10996f13..1d4f39e490a 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -9,9 +9,7 @@ import forge.properties.ForgeConstants; public enum FSkinTexture implements FImage { BG_TEXTURE(ForgeConstants.TEXTURE_BG_FILE, true), - BG_MATCH(ForgeConstants.MATCH_BG_FILE, false), - BG_PLANAR_MAP(ForgeConstants.PLANAR_MAP_BG_FILE, false), - BG_MONITOR(ForgeConstants.MONITOR_BG_FILE, false); + BG_MATCH(ForgeConstants.MATCH_BG_FILE, false); private final String filename; private final boolean repeat; diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java index 4d36cc18b4e..a2c2901775e 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java @@ -9,12 +9,11 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.FThreads; import forge.Forge; import forge.Graphics; +import forge.achievement.PlaneswalkerAchievements; import forge.assets.FImage; import forge.assets.FSkin; -import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.FSkinImage; -import forge.assets.FSkinTexture; import forge.assets.TextRenderer; import forge.card.CardRarity; import forge.card.CardRenderer; @@ -42,15 +41,15 @@ import forge.toolbox.FCardPanel; import forge.toolbox.FContainer; import forge.toolbox.FDisplayObject; import forge.toolbox.FEvent; +import forge.toolbox.FScrollPane; import forge.toolbox.FEvent.FEventHandler; +import forge.toolbox.FScrollPane.ScrollBounds; import forge.toolbox.FLabel; import forge.util.Utils; public class CommandCenterScreen extends FScreen implements IVCommandCenter { - private static final Color BACK_COLOR = FSkinColor.fromRGB(1, 2, 2); private static final float BORDER_THICKNESS = Utils.scale(1); private static final FSkinFont REGION_STATS_FONT = FSkinFont.get(12); - private static final FSkinFont PLANE_STATS_FONT = FSkinFont.get(14); private static final FSkinFont REGION_NAME_FONT = FSkinFont.get(15); private static final FSkinFont PLANE_NAME_FONT = FSkinFont.get(16); private static final FSkinFont UNLOCK_WINS_FONT = FSkinFont.get(18); @@ -59,6 +58,7 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { private static final float REGION_FRAME_THICKNESS_MULTIPLIER = 15f / 443f; private static final float REGION_FRAME_BASE_HEIGHT_MULTIPLIER = 25f / 317f; + private final PlaneMap map = add(new PlaneMap()); private final RegionDisplay regionDisplay = add(new RegionDisplay()); private final CommanderRow commanderRow = add(new CommanderRow()); private final FLabel btnEndDay = add(new FLabel.ButtonBuilder().font(FSkinFont.get(14)).build()); @@ -135,25 +135,6 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { }); } - @Override - public void drawBackground(Graphics g) { - FImage background = FSkinTexture.BG_PLANAR_MAP; - float w = getWidth(); - float h = w * background.getHeight() / background.getWidth(); - g.fillRect(BACK_COLOR, 0, 0, w, getHeight()); - g.drawImage(background, 0, getHeight() - h, w, h); //retain proportions, remaining area will be covered by back color - - //draw stats and name for current plane above buttons - float x = COMMANDER_GAP / 3; - float y = commanderRow.getBottom(); - float h1 = btnEndDay.getTop() - y; - float h2 = getHeight() - y; - w -= 2 * x; - g.drawText(unlockRatio, PLANE_STATS_FONT, Color.WHITE, x, y, w, h2, false, HAlignment.LEFT, true); - g.drawText("Plane - " + model.getCurrentPlane().getName(), PLANE_NAME_FONT, Color.WHITE, x, y, w, h1, false, HAlignment.CENTER, true); - g.drawText(winRatio, PLANE_STATS_FONT, Color.WHITE, x, y, w, h2, false, HAlignment.RIGHT, true); - } - @Override protected void drawOverlay(Graphics g) { ConquestCommander commander = regionDisplay.deployedCommander.commander; @@ -200,7 +181,39 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { float commanderRowHeight = commanderWidth * FCardPanel.ASPECT_RATIO + 2 * COMMANDER_ROW_PADDING; commanderRow.setBounds(0, btnEndDay.getTop() - PLANE_NAME_FONT.getLineHeight() - 2 * FLabel.DEFAULT_INSETS - commanderRowHeight, width, commanderRowHeight); - regionDisplay.setBounds(0, startY, width, commanderRow.getTop() - startY); + map.setBounds(0, startY, width, commanderRow.getTop() - startY); + } + + private class PlaneMap extends FScrollPane { + private float zoom = 1; + private FImage walker = (FImage)PlaneswalkerAchievements.getTrophyImage("Ajani Goldmane"); + + public PlaneMap() { + } + + @Override + protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { + return new ScrollBounds(visibleWidth, visibleHeight); + } + + protected void drawBackground(Graphics g) { + float w = getWidth(); + float h = getHeight(); + float tileWidth = w / 4 * zoom; + float tileHeight = tileWidth * FSkinImage.HEXAGON_TILE.getHeight() / FSkinImage.HEXAGON_TILE.getWidth(); + + float x = (w - tileWidth) / 2; + float y = (h - tileHeight) / 2; + drawTile(g, x, y, tileWidth, tileHeight); + } + + private void drawTile(Graphics g, float x, float y, float w, float h) { + g.drawImage(FSkinImage.HEXAGON_TILE, x, y, w, h); + + float pedestalWidth = w * 0.8f; + float pedestalHeight = pedestalWidth * walker.getHeight() / walker.getWidth(); + g.drawImage(walker, x + (w - pedestalWidth) / 2, y + h / 2 - pedestalHeight * 0.8f, pedestalWidth, pedestalHeight); + } } private class RegionDisplay extends FContainer { @@ -250,7 +263,7 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { @Override protected void doLayout(float width, float height) { - float x = COMMANDER_GAP / 2; + /*float x = COMMANDER_GAP / 2; float y = COMMANDER_GAP; float w = width - 2 * x; float h = height - y; @@ -279,7 +292,7 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { x = deployedCommander.getRight() + padding; actions[2].setBounds(x, y, actionPanelSize, actionPanelSize); x += actionPanelSize + padding; - actions[3].setBounds(x, y, actionPanelSize, actionPanelSize); + actions[3].setBounds(x, y, actionPanelSize, actionPanelSize);*/ } @Override @@ -298,8 +311,6 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { g.drawImage((FImage)region.getArt(), x, y, w, h); //TODO: Maximize in frame while retaining proportions g.endClip(); - g.drawImage(FSkinTexture.BG_MONITOR, x, y, w, h); - y += h - regionFrameBaseHeight; h = regionFrameBaseHeight * 0.9f; g.drawText(unlockRatio, REGION_STATS_FONT, Color.BLACK, 2 * x, y, w, h, false, HAlignment.LEFT, true); diff --git a/forge-gui/res/skins/default/bg_monitor.png b/forge-gui/res/skins/default/bg_monitor.png deleted file mode 100644 index d81bd12106b..00000000000 Binary files a/forge-gui/res/skins/default/bg_monitor.png and /dev/null differ diff --git a/forge-gui/res/skins/default/bg_planar_map.png b/forge-gui/res/skins/default/bg_planar_map.png deleted file mode 100644 index c1cdad089cc..00000000000 Binary files a/forge-gui/res/skins/default/bg_planar_map.png and /dev/null differ diff --git a/forge-gui/res/skins/default/sprite_planar_conquest.png b/forge-gui/res/skins/default/sprite_planar_conquest.png new file mode 100644 index 00000000000..eca220bb88d Binary files /dev/null and b/forge-gui/res/skins/default/sprite_planar_conquest.png differ diff --git a/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java b/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java index d6620030592..50ce79b097e 100644 --- a/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java @@ -1,5 +1,8 @@ package forge.achievement; +import forge.GuiBase; +import forge.assets.FSkinProp; +import forge.assets.ISkinImage; import forge.game.Game; import forge.game.player.Player; import forge.item.IPaperCard; @@ -9,6 +12,10 @@ import forge.properties.ForgeConstants; public class PlaneswalkerAchievements extends AchievementCollection { public static final PlaneswalkerAchievements instance = new PlaneswalkerAchievements(); + public static ISkinImage getTrophyImage(String planeswalkerName) { + return GuiBase.getInterface().createLayeredImage(FSkinProp.IMG_SPECIAL_TROPHY, ForgeConstants.CACHE_ACHIEVEMENTS_DIR + "/" + planeswalkerName + ".png", 1); + } + private PlaneswalkerAchievements() { super("Planeswalker Ultimates", ForgeConstants.ACHIEVEMENTS_DIR + "planeswalkers.xml", false); } diff --git a/forge-gui/src/main/java/forge/assets/FSkinProp.java b/forge-gui/src/main/java/forge/assets/FSkinProp.java index 2ce35cab976..9eb5a94996d 100644 --- a/forge-gui/src/main/java/forge/assets/FSkinProp.java +++ b/forge-gui/src/main/java/forge/assets/FSkinProp.java @@ -27,8 +27,6 @@ public enum FSkinProp { BG_SPLASH (null, PropType.BACKGROUND), BG_TEXTURE (null, PropType.BACKGROUND), BG_MATCH (null, PropType.BACKGROUND), - BG_PLANAR_MAP (null, PropType.BACKGROUND), - BG_MONITOR (null, PropType.BACKGROUND), //colors CLR_THEME (new int[] {70, 10}, PropType.COLOR), @@ -243,6 +241,9 @@ public enum FSkinProp { IMG_TROPHY_CASE_TOP (new int[] {0, 185, 798, 38}, PropType.TROPHY), IMG_TROPHY_SHELF (new int[] {0, 223, 798, 257}, PropType.TROPHY), + //planar conquest images + IMG_HEXAGON_TILE (new int[] {0, 0, 220, 192}, PropType.PLANAR_CONQUEST), + //button images IMG_BTN_START_UP (new int[] {480, 200, 160, 80}, PropType.ICON), IMG_BTN_START_OVER (new int[] {480, 280, 160, 80}, PropType.ICON), @@ -299,5 +300,6 @@ public enum FSkinProp { FOIL, OLD_FOIL, TROPHY, + PLANAR_CONQUEST } } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java index 6fde605148b..66da1bbd17d 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java @@ -16,6 +16,7 @@ public class ConquestPlaneData { private final Map winsPerOpponent = new HashMap(); private final Map lossesPerOpponent = new HashMap(); private final ConquestPlane plane; + private final ConquestPlaneMap map; private int wins, losses; private int winStreakBest = 0; @@ -23,6 +24,7 @@ public class ConquestPlaneData { public ConquestPlaneData(ConquestPlane plane0) { plane = plane0; + map = new ConquestPlaneMap(plane0); } public List getCommanders() { @@ -92,6 +94,10 @@ public class ConquestPlaneData { return count; } + public ConquestPlaneMap getMap() { + return map; + } + public RegionData getRegionData(Region region) { RegionData regionData = regionDataLookup.get(region); if (regionData == null) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneMap.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneMap.java new file mode 100644 index 00000000000..2c3097a5407 --- /dev/null +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneMap.java @@ -0,0 +1,107 @@ +package forge.planarconquest; + +import java.util.ArrayList; +import java.util.List; + +import forge.util.Aggregates; + +public class ConquestPlaneMap { + //use 2 dimensional array to represent tile grid + private final int gridSize; + private final HexagonTile[][] grid; + private int tileCount; + + public ConquestPlaneMap(ConquestPlane plane) { + int size = (int)Math.round(Math.sqrt(plane.getCardPool().size() / 3)); //use card pool size to determine grid size + if (size % 2 == 0) { + size++; //ensure grid size is an odd number + } + gridSize = size; + grid = new HexagonTile[gridSize][gridSize]; + generateRandomGrid(); + } + + private void generateRandomGrid() { + int startQ = gridSize / 2; //player will start at center of grid always + int startR = startQ; + addTile(startQ, startR); + + int max = gridSize - 1; + int minCount = Math.round(gridSize * gridSize * 0.8f); //ensure at least 80% of the grid has tiles + while (tileCount < minCount) { + //add a tile in a random location and then ensure it can be reached from start tile + int q = Aggregates.randomInt(0, max); + int r = Aggregates.randomInt(0, max); + while (addTile(q, r)) { + //alternate which coordinate is incremented as we move towards center + if (tileCount % 2 == 0 && r != startR) { + if (r > startR) { + r--; + } + else { + r++; + } + } + else if (q > startQ) { + q--; + } + else if (q < startQ) { + q++; + } + else if (r > startR) { + r--; + } + else { + r++; + } + } + } + } + + private boolean addTile(int q, int r) { + if (grid[q][r] == null) { + grid[q][r] = new HexagonTile(q, r); + tileCount++; + return true; + } + return false; + } + + public class HexagonTile { + private int q, r; + + private HexagonTile(int q0, int r0) { + q = q0; + r = r0; + } + + public List getNeighbors() { + List neighbors = new ArrayList(); + addToList(q, r - 1, neighbors); //tile above + addToList(q, r + 1, neighbors); //tile below + if (q % 2 == 0) { + addToList(q - 1, r - 1, neighbors); //tile left and up + addToList(q - 1, r, neighbors); //tile left and down + addToList(q + 1, r - 1, neighbors); //tile right and up + addToList(q + 1, r, neighbors); //tile right and down + } + else { + addToList(q - 1, r, neighbors); //tile left and up + addToList(q - 1, r + 1, neighbors); //tile left and down + addToList(q + 1, r, neighbors); //tile right and up + addToList(q + 1, r + 1, neighbors); //tile right and down + } + return neighbors; + } + } + + private void addToList(int q, int r, List list) { + if (r < 0 || q < 0 || q >= grid.length || r >= grid[0].length) { + return; + } + HexagonTile tile = grid[q][r]; + if (tile != null) { + list.add(tile); + } + } +} diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index fa2c6fe4c91..7a0d2a8ded4 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -77,12 +77,11 @@ public final class ForgeConstants { public static final String SPRITE_OLD_FOILS_FILE = "sprite_old_foils.png"; public static final String SPRITE_TROPHIES_FILE = "sprite_trophies.png"; public static final String SPRITE_AVATARS_FILE = "sprite_avatars.png"; + public static final String SPRITE_PLANAR_CONQUEST_FILE = "sprite_planar_conquest.png"; public static final String FONT_FILE = "font1.ttf"; public static final String SPLASH_BG_FILE = "bg_splash.png"; public static final String MATCH_BG_FILE = "bg_match.jpg"; public static final String TEXTURE_BG_FILE = "bg_texture.jpg"; - public static final String PLANAR_MAP_BG_FILE = "bg_planar_map.png"; - public static final String MONITOR_BG_FILE = "bg_monitor.png"; public static final String DRAFT_DECK_IMG_FILE = "bg_draft_deck.png"; // data tree roots