diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java index b3a1405ff17..fb8b43dd606 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java @@ -34,7 +34,7 @@ public class ConquestPlaneSelector extends FDisplayObject { private static final float MONITOR_LEFT_MULTIPLIER = 19f / 443f; private static final float ARROW_THICKNESS = Utils.scale(3); - private static final List planes = ImmutableList.copyOf(Iterables.filter(FModel.getPlanes(), new Predicate() { + private static List planes = ImmutableList.copyOf(Iterables.filter(FModel.getPlanes(), new Predicate() { @Override public boolean apply(ConquestPlane plane) { return !plane.isUnreachable(); //filter out unreachable planes @@ -131,7 +131,7 @@ public class ConquestPlaneSelector extends FDisplayObject { ConquestPlane plane = getSelectedPlane(); String desc = plane.getDescription(); if (!desc.isEmpty()) { - GuiDialog.message(plane.getDescription().replace("\\n", "\n"), plane.getName()); + GuiDialog.message(plane.getDescription().replace("\\n", "\n"), plane.getName().replace("_", " ")); } else { GuiDialog.message("This plane has no description.", plane.getName()); } @@ -206,7 +206,7 @@ public class ConquestPlaneSelector extends FDisplayObject { float monitorBottom = monitorTop + monitorHeight; float remainingHeight = h - monitorBottom; ConquestPlane plane = getSelectedPlane(); - g.drawText(plane.getName(), PLANE_NAME_FONT, Color.WHITE, textLeft, monitorBottom, w - 2 * textLeft, remainingHeight, false, HAlignment.CENTER, true); + g.drawText(plane.getName().replace("_", " " ), PLANE_NAME_FONT, Color.WHITE, textLeft, monitorBottom, w - 2 * textLeft, remainingHeight, false, HAlignment.CENTER, true); //draw left/right arrows float yMid = monitorBottom + remainingHeight / 2; @@ -224,4 +224,13 @@ public class ConquestPlaneSelector extends FDisplayObject { g.drawLine(ARROW_THICKNESS, Color.WHITE, xMid + offsetX, yMid - 1, xMid - offsetX, yMid + offsetY); rightArrowBounds = new Rectangle(w - leftArrowBounds.width, monitorBottom, leftArrowBounds.width, remainingHeight); } + + public void updateReachablePlanes() { + planes = ImmutableList.copyOf(Iterables.filter(FModel.getPlanes(), new Predicate() { + @Override + public boolean apply(ConquestPlane plane) { + return !plane.isUnreachable(); + } + })); + } } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java index 02d691189cb..ff613b75e56 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java @@ -38,6 +38,7 @@ public class ConquestPlaneswalkScreen extends FScreen { public void onActivate() { ConquestData model = FModel.getConquest().getModel(); setHeaderCaption(model.getName()); + planeSelector.updateReachablePlanes(); planeSelector.setCurrentPlane(model.getCurrentPlane()); planeSelector.activate(); } diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index a7df923d827..08560d9b8d7 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -3,7 +3,7 @@ Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Av Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Commander|Avatar:Kazarov, Sengir Pureblood|Desc: Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad the Cursed|Desc: Name:Liliana, the Necromancer|Deck:Liliana, the Necromancer.dck|Variant:Planeswalker|Avatar:Liliana, the Necromancer|Desc: -Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: +Name:Demonlord Belzenlok|Deck:Demonlord Belzenlok.dck|Variant:Planechase|Avatar:Demonlord Belzenlok|TemporaryUnlock:Time_Vault|Desc: Name:Yargle, Glutton of Urborg|Deck:Yargle, Glutton of Urborg.dck|Variant:Commander|Avatar:Yargle, Glutton of Urborg|Desc: +Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: Name:Necropotence|Deck:Necropotence.dck|Variant:Vanguard|Avatar:Necropotence|Desc: -Name:Demonlord Belzenlok|Deck:Demonlord Belzenlok.dck|Variant:Planechase|Avatar:Demonlord Belzenlok|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt new file mode 100644 index 00000000000..66c69ba92d0 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt @@ -0,0 +1,9 @@ +Name:EVENT1|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt new file mode 100644 index 00000000000..66c69ba92d0 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt @@ -0,0 +1,9 @@ +Name:EVENT1|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/cards.txt b/forge-gui/res/conquest/planes/Time_Vault/cards.txt new file mode 100644 index 00000000000..1f4febf286b --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/cards.txt @@ -0,0 +1,26 @@ +Crown of Empires +Scepter of Empires +Throne of Empires +Roc Egg +Brindle Boar +Armored Cancrix +Academy Raider +Alaborn Cavalier +Prossh, Skyraider of Kher +Balance of Power +Beetleback Chief +Crimson Mage +Cruel Edict +Dakmor Lancer +Famine +Firewing Phoenix +Flesh to Dust +Flusterstorm +Freyalise, Llanowar's Fury +Gaea's Revenge +Ice Cage +Liliana, Heretical Healer +Mwonvuli Beast Tracker +Teferi, Temporal Archmage +Titania, Protector of Argoth +Onyx Mage \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt b/forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt new file mode 100644 index 00000000000..53738fc9aff --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt @@ -0,0 +1 @@ +Time Vault diff --git a/forge-gui/res/conquest/planes/Time_Vault/regions.txt b/forge-gui/res/conquest/planes/Time_Vault/regions.txt new file mode 100644 index 00000000000..4d358fd794e --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/regions.txt @@ -0,0 +1,2 @@ +Name:Chronicle of Ages|Art:Time Vault|Colors:WUBRG +Name:The Memory Lane|Art:Cast Through Time|Colors:WUBRG diff --git a/forge-gui/res/conquest/planes/Time_Vault/sets.txt b/forge-gui/res/conquest/planes/Time_Vault/sets.txt new file mode 100644 index 00000000000..9f80ee8f007 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/sets.txt @@ -0,0 +1,21 @@ +ICE +ALL +CSP +MIR +VIS +WTH +USG +ULG +UDS +INV +PLS +APC +ODY +TOR +JUD +ONS +LGN +SCG +TSP +PLC +FUT \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 46642d91e0d..fd14c390922 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -1,6 +1,6 @@ Name:Alara|RegionSize:9|Desc:As the boundaries between the shards dissolve, cultures clash and wars ensue.\nConsists of 54 events. Contains cards from ALA, CON, ARB, C13, and more. Name:Amonkhet|RegionSize:9|Desc:On the surface, Amonkhet seems like a marvelous place to live, but something unsettling and nefarious lurks behind the grand facade.\nConsists of 45 events. Contains cards from AKH, HOU, some C17, and Amonkhet Invocations. -Name:Dominaria|RegionSize:9|Desc:The legendary plane, once the Nexus of the Multiverse. With the last Time Rift closed, Dominaria's mana flowed back into the land instantaneously, and the world healed and rejuvenated quickly with that infusion of power. After generations of peaceful development, much of Dominaria has managed to rebuild the cultures of its past. Yet, shortly after the Mending, the Cabal began to grow in strength and came under the control of the Demonlord Belzenlok.\nConsists of 45 events. Contains cards from DOM and most of M19 and C18. +Name:Dominaria|RegionSize:9|Desc:The legendary plane, once the Nexus of the Multiverse. With the last Time Rift closed, Dominaria's mana flowed back into the land instantaneously, and the world healed and rejuvenated quickly with that infusion of power. After generations of peaceful development, much of Dominaria has managed to rebuild the cultures of its past. Yet, shortly after the Mending, the Cabal began to grow in strength and came under the control of the Demonlord Belzenlok. Legends say that a mysterious Time Vault is hidden somewhere deep in this plane, though no one knows if this rumor is true...\nConsists of 45 events. Contains cards from DOM and most of M19 and C18. Name:Innistrad|RegionSize:9|Desc:On this plane, humanity is terrorized by vampires, werewolves, zombies, and ghouls.\nConsists of 45 events. Contains cards from ISD, DKA, AVR, SOI, EMN, and C14. Name:Ixalan|RegionSize:9|Desc:On Ixalan, the untamed jungles have hidden a coveted secret: Orazca, the city of gold, and rivals embark on a journey to claim the plane's greatest fortune for themselves.\nConsists of 45 events. Contains cards from XLN, RIX. Name:Kaladesh|RegionSize:9|Desc:Kaladesh is a living work of art. Aether is inextricably woven into the world's culture of inspired invention.\nConsists of 45 events. Contains cards from KLD, AER, some C17, and Kaladesh Inventions. @@ -14,5 +14,6 @@ Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. Name:Theros|RegionSize:9|Desc:Mortals tremble before an awe-inspiring pantheon of gods.\nConsists of 45 events. Contains cards from THS, BNG, JOU, HOP, PCA, and more. +Name:Time_Vault|RegionSize:9|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and experience the history of Dominaria.\nConsists of 18 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, and FUT.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... Name:Ulgrotha|RegionSize:6|Unreachable:True|Desc: Name:Zendikar|RegionSize:9|Desc:This land of primal mana was lethal even before its Eldrazi prisoners escaped.\nConsists of 60 events. Contains cards from ZEN, WWK, ROE, BFZ, OGW, and C16. diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java index f0c3b53550c..08c5adba2c5 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java @@ -50,6 +50,9 @@ public abstract class ConquestBattle { view.getBtnRestart().setVisible(false); view.getBtnQuit().setText("Great!"); model.addWin(this); + if (location.getEvent().getTemporaryUnlock() != null) { + ConquestUtil.makePlaneTemporarilyAccessible(location.getEvent().getTemporaryUnlock()); + } } else { view.getBtnRestart().setVisible(true); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java index 293cb05e675..74048caf5b2 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java @@ -113,7 +113,7 @@ public class ConquestCommander implements InventoryItem, IXmlWritable { if (originPlane == null) { return ""; } - return originPlane.getName() + " - " + originRegionName; + return originPlane.getName().replace("_", " ") + " - " + originRegionName; } public ConquestPlane getOriginPlane() { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java index ce31befc4dd..c6429798245 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java @@ -25,16 +25,18 @@ public class ConquestEvent { private final String deckPath; private final Set variants; private final String avatar; + private final String tempUnlock; private PaperCard avatarCard; private Deck deck; - public ConquestEvent(ConquestRegion region0, String name0, String description0, String deckPath0, Set variants0, String avatar0) { + public ConquestEvent(ConquestRegion region0, String name0, String description0, String deckPath0, Set variants0, String avatar0, String tempUnlock0) { region = region0; name = name0; description = description0; deckPath = deckPath0; variants = variants0; avatar = avatar0; + tempUnlock = tempUnlock0; } public String getName() { @@ -73,6 +75,8 @@ public class ConquestEvent { return avatar; } + public String getTemporaryUnlock() { return tempUnlock; } + public PaperCard getAvatarCard() { if (avatarCard == null && avatar != null) { //attempt to load card from plane's card pool @@ -120,6 +124,7 @@ public class ConquestEvent { Set variants = EnumSet.noneOf(GameType.class); String avatar = null; String description = null; + String tempUnlock = null; String key, value; String[] pieces = line.split("\\|"); @@ -159,6 +164,9 @@ public class ConquestEvent { case "desc": description = value; break; + case "temporaryunlock": + tempUnlock = value; + break; default: alertInvalidLine(line, "Invalid event definition."); break; @@ -168,7 +176,7 @@ public class ConquestEvent { deck = name + ".dck"; //assume deck file has same name if not specified } deck = file.getParent() + ForgeConstants.PATH_SEPARATOR + deck; - return new ConquestEvent(region, name, description, deck, variants, avatar); + return new ConquestEvent(region, name, description, deck, variants, avatar, tempUnlock); } } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java index f8cc1ca59ca..0e67a770e08 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java @@ -43,7 +43,7 @@ public class ConquestPlane { private final String name; private final String directory; private final String description; - private final boolean unreachable; + private boolean unreachable; private final int rowsPerRegion; private final int cols; @@ -93,6 +93,10 @@ public class ConquestPlane { return unreachable; } + public void setTemporarilyReachable(boolean reachable) { + unreachable = !reachable; + } + public FCollectionView getRegions() { ensureRegionsLoaded(); return regions; @@ -173,7 +177,7 @@ public class ConquestPlane { } //if not enough events defined, create random events for remaining while (eventIndex < regionEndIndex) { - events[eventIndex++] = new ConquestEvent(region, region.getName() + " - Random " + ((eventIndex % eventsPerRegion) + 1), null, null, EnumSet.noneOf(GameType.class), null); + events[eventIndex++] = new ConquestEvent(region, region.getName() + " - Random " + ((eventIndex % eventsPerRegion) + 1), null, null, EnumSet.noneOf(GameType.class), null, null); } regionEndIndex += eventsPerRegion; } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java index 4dbd9cdeb0a..ed1904e2136 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java @@ -86,7 +86,7 @@ public class ConquestRegion { } public String toString() { - return plane.getName() + " - " + name; + return plane.getName().replace("_", " ") + " - " + name; } public static class Reader extends FCollectionReader { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java index 65b177d2b39..d81a3899b62 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java @@ -154,6 +154,24 @@ public class ConquestUtil { return pool; } + public static ConquestPlane getPlaneByName(String planeName) { + for (ConquestPlane plane : FModel.getPlanes()) { + if (plane.getName().equals(planeName)) { + return plane; + } + } + return null; + } + + public static void makePlaneTemporarilyAccessible(String planeName) { + ConquestPlane plane = getPlaneByName(planeName); + if (plane != null && plane.isUnreachable()) { + plane.setTemporarilyReachable(true); + } else { + System.err.println("Could not find plane to mark as temporarily accessible: " + planeName); + } + } + public static Iterable getStartingPlaneswalkerOptions(final PaperCard startingCommander) { final byte colorIdentity = startingCommander.getRules().getColorIdentity().getColor(); return Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), new Predicate() {