runParams = AbilityKey.newMap();
- runParams.put(AbilityKey.Cards, currentPlanes);
+ runParams.put(AbilityKey.Cards, destinations);
game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams, false);
view.updateCurrentPlaneName(currentPlanes.toString().replaceAll(" \\(.*","").replace("[",""));
}
diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java
index 11a27e60e2e..413d2eca648 100644
--- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java
+++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java
@@ -135,10 +135,14 @@ public class TriggerChangesZone extends Trigger {
}
}
- if (hasParam("ResolvedCard")) {
+ if (hasParam("Fizzle")) {
if (!runParams.containsKey(AbilityKey.Fizzle)) {
return false;
}
+ Boolean val = (Boolean) runParams.get(AbilityKey.Fizzle);
+ if ("True".equals(getParam("Fizzle")) != val) {
+ return false;
+ }
}
// Check number of lands ETB this turn on triggered card's controller
diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChaosEnsues.java b/forge-game/src/main/java/forge/game/trigger/TriggerChaosEnsues.java
new file mode 100644
index 00000000000..787acf1650f
--- /dev/null
+++ b/forge-game/src/main/java/forge/game/trigger/TriggerChaosEnsues.java
@@ -0,0 +1,63 @@
+package forge.game.trigger;
+
+import forge.game.GameObject;
+import forge.game.ability.AbilityKey;
+import forge.game.card.Card;
+import forge.game.spellability.SpellAbility;
+
+import java.util.Map;
+
+public class TriggerChaosEnsues extends Trigger {
+
+ /**
+ *
+ * Constructor for Trigger_ChaosEnsues
+ *
+ *
+ * @param params
+ * a {@link java.util.HashMap} object.
+ * @param host
+ * a {@link forge.game.card.Card} object.
+ * @param intrinsic
+ * the intrinsic
+ */
+ public TriggerChaosEnsues(final Map params, final Card host, final boolean intrinsic) {
+ super(params, host, intrinsic);
+ }
+
+ /* (non-Javadoc)
+ * @see forge.card.trigger.Trigger#performTest(java.util.Map)
+ */
+ @Override
+ public boolean performTest(Map runParams) {
+ if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) {
+ return false;
+ }
+ if (runParams.containsKey(AbilityKey.Affected)) {
+ final Object o = runParams.get(AbilityKey.Affected);
+ if (o instanceof GameObject) {
+ final GameObject c = (GameObject) o;
+ if (!c.equals(this.getHostCard())) {
+ return false;
+ }
+ } else if (o instanceof Iterable>) {
+ for (Object o2 : (Iterable>) o) {
+ if (!o2.equals(this.getHostCard())) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void setTriggeringObjects(SpellAbility sa, Map runParams) {
+ sa.setTriggeringObjectsFrom(runParams, AbilityKey.Player);
+ }
+
+ @Override
+ public String getImportantStackObjects(SpellAbility sa) {
+ return "";
+ }
+}
diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java
index 8a54c840cf0..8098aeab9e3 100644
--- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java
+++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java
@@ -180,7 +180,7 @@ public class TriggerHandler {
return FileSection.parseToMap(trigParse, FileSection.DOLLAR_SIGN_KV_SEPARATOR);
}
- private void collectTriggerForWaiting() {
+ public void collectTriggerForWaiting() {
for (final TriggerWaiting wt : waitingTriggers) {
if (wt.getTriggers() != null)
continue;
diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java
index c0ef1b69bff..990af336a5b 100644
--- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java
+++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java
@@ -39,6 +39,7 @@ public enum TriggerType {
ChangesController(TriggerChangesController.class),
ChangesZone(TriggerChangesZone.class),
ChangesZoneAll(TriggerChangesZoneAll.class),
+ ChaosEnsues(TriggerChaosEnsues.class),
Clashed(TriggerClashed.class),
ClassLevelGained(TriggerClassLevelGained.class),
ConjureAll(TriggerConjureAll.class),
diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml
index ae03902f122..130b595baae 100644
--- a/forge-gui-android/pom.xml
+++ b/forge-gui-android/pom.xml
@@ -19,7 +19,7 @@
forge
forge
- 1.6.56-SNAPSHOT
+ 1.6.57-SNAPSHOT
forge-gui-android
diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
index ff795ea3f71..f9845274792 100644
--- a/forge-gui-desktop/pom.xml
+++ b/forge-gui-desktop/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.56-SNAPSHOT
+ 1.6.57-SNAPSHOT
forge-gui-desktop
diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml
index d4af0a8609d..4afbdde3251 100644
--- a/forge-gui-ios/pom.xml
+++ b/forge-gui-ios/pom.xml
@@ -12,7 +12,7 @@
forge
forge
- 1.6.56-SNAPSHOT
+ 1.6.57-SNAPSHOT
forge-gui-ios
diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml
index 3a9338620ed..3141a39cad7 100644
--- a/forge-gui-mobile-dev/pom.xml
+++ b/forge-gui-mobile-dev/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.56-SNAPSHOT
+ 1.6.57-SNAPSHOT
forge-gui-mobile-dev
diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml
index 4e506c14ca6..1d1dadf1671 100644
--- a/forge-gui-mobile/pom.xml
+++ b/forge-gui-mobile/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.56-SNAPSHOT
+ 1.6.57-SNAPSHOT
forge-gui-mobile
diff --git a/forge-gui-mobile/src/forge/adventure/data/SettingData.java b/forge-gui-mobile/src/forge/adventure/data/SettingData.java
index 048e608b8a6..fddfb1b705a 100644
--- a/forge-gui-mobile/src/forge/adventure/data/SettingData.java
+++ b/forge-gui-mobile/src/forge/adventure/data/SettingData.java
@@ -19,4 +19,5 @@ public class SettingData {
public Float rewardCardAdjLandscape;
public Float cardTooltipAdjLandscape;
public boolean dayNightBG;
+ public boolean disableWinLose;
}
diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java
index 0b8b3d49a38..2d31b59a7ac 100644
--- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java
@@ -34,6 +34,7 @@ import forge.player.GamePlayerUtil;
import forge.player.PlayerControllerHuman;
import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
+import forge.screens.TransitionScreen;
import forge.screens.match.MatchController;
import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem;
@@ -130,18 +131,20 @@ public class DuelScene extends ForgeScene {
@Override
public void run(Integer result) {
if (result == 0) {
- afterGameEnd(enemyName, finalWinner, true, true);
+ afterGameEnd(enemyName, finalWinner);
+ if (Config.instance().getSettingData().disableWinLose)
+ exitDuelScene();
}
fb.dispose();
}
}));
} else {
- afterGameEnd(enemyName, winner, false, false);
+ afterGameEnd(enemyName, winner);
}
}
-
- void afterGameEnd(String enemyName, boolean winner, boolean showOverlay, boolean alternate) {
- Runnable runnable = () -> Gdx.app.postRunnable(()-> {
+ Runnable endRunnable = null;
+ void afterGameEnd(String enemyName, boolean winner) {
+ endRunnable = () -> Gdx.app.postRunnable(()-> {
if (GameScene.instance().isNotInWorldMap()) {
SoundSystem.instance.pause();
GameHUD.getInstance().playAudio();
@@ -160,14 +163,9 @@ public class DuelScene extends ForgeScene {
((IAfterMatch) last).setWinner(winner);
}
});
- if (showOverlay) {
- FThreads.invokeInEdtNowOrLater(() -> {
- matchOverlay = new LoadingOverlay(runnable, true, alternate);
- matchOverlay.show();
- });
- } else {
- runnable.run();
- }
+ }
+ public void exitDuelScene() {
+ Forge.setTransitionScreen(new TransitionScreen(endRunnable, Forge.takeScreenshot(), false, false));
}
void addEffects(RegisteredPlayer player, Array effects) {
diff --git a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java
index 02c404b73c4..555992547a7 100644
--- a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java
@@ -17,7 +17,6 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.time.LocalTime;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
@@ -203,7 +202,6 @@ public class SettingsScene extends UIScene {
boolean value = ((CheckBox) actor).isChecked();
Config.instance().getSettingData().fullScreen = value;
Config.instance().saveSettings();
- setTargetTime(LocalTime.now().getHour());
//update
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) {
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_LANDSCAPE_MODE, value);
@@ -223,6 +221,14 @@ public class SettingsScene extends UIScene {
}
}
});
+ addSettingField(Forge.getLocalizer().getMessage("lblDisableWinLose"), Config.instance().getSettingData().disableWinLose, new ChangeListener() {
+ @Override
+ public void changed(ChangeEvent event, Actor actor) {
+ boolean value = ((CheckBox) actor).isChecked();
+ Config.instance().getSettingData().disableWinLose = value;
+ Config.instance().saveSettings();
+ }
+ });
addCheckBox(Forge.getLocalizer().getMessage("lblCardName"), ForgePreferences.FPref.UI_OVERLAY_CARD_NAME);
addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC, 0, 100);
addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 0, 100);
diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java
index e9f4e7cb127..2fc837eac90 100644
--- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java
+++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java
@@ -335,13 +335,17 @@ public class GameHUD extends Stage {
unloadAudio();
SoundSystem.instance.resume(); // resume World BGM
}
+ //unequip and reequip abilities
+ updateAbility();
}
-
- void updateAbility() {
+ void clearAbility() {
for (TextraButton button : abilityButtonMap) {
button.remove();
}
abilityButtonMap.clear();
+ }
+ void updateAbility() {
+ clearAbility();
setAbilityButton(AdventurePlayer.current().getEquippedAbility1());
setAbilityButton(AdventurePlayer.current().getEquippedAbility2());
float x = Forge.isLandscapeMode() ? 426f : 216f;
@@ -568,6 +572,14 @@ public class GameHUD extends Stage {
}
opacity = visible ? 1f : 0.4f;
}
+ void toggleConsole() {
+ console.toggle();
+ if (console.isVisible()) {
+ clearAbility();
+ } else {
+ updateAbility();
+ }
+ }
@Override
public boolean keyUp(int keycode) {
@@ -582,12 +594,12 @@ public class GameHUD extends Stage {
}
ui.pressDown(keycode);
if (keycode == Input.Keys.F9 || keycode == Input.Keys.F10) {
- console.toggle();
+ toggleConsole();
return true;
}
if (keycode == Input.Keys.BACK) {
if (console.isVisible()) {
- console.toggle();
+ toggleConsole();
}
}
if (console.isVisible())
@@ -699,7 +711,7 @@ public class GameHUD extends Stage {
@Override
public boolean longPress(Actor actor, float x, float y) {
- console.toggle();
+ toggleConsole();
return super.longPress(actor, x, y);
}
}
diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java
index 2324f18ac70..a86a2df61d6 100644
--- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java
+++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java
@@ -350,7 +350,7 @@ public class CardUtil {
public static Deck generateDeck(GeneratedDeckData data, CardEdition starterEdition, boolean discourageDuplicates)
{
- List editionCodes = (starterEdition != null)?Arrays.asList(starterEdition.getCode(), starterEdition.getCode2()):Arrays.asList("JMP", "J22", "DMU","BRO");
+ List editionCodes = (starterEdition != null)?Arrays.asList(starterEdition.getCode(), starterEdition.getCode2()):Arrays.asList("JMP", "J22", "DMU", "BRO", "ONE", "MOM");
Deck deck= new Deck(data.name);
if(data.mainDeck!=null)
{
diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java
index 1352dd98dfe..acb8c490e6b 100644
--- a/forge-gui-mobile/src/forge/screens/match/MatchController.java
+++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java
@@ -6,11 +6,11 @@ import java.util.List;
import java.util.Map;
import forge.adventure.scene.DuelScene;
+import forge.adventure.util.Config;
import forge.ai.GameState;
import forge.deck.Deck;
import forge.game.player.Player;
import forge.item.IPaperCard;
-import forge.screens.TransitionScreen;
import forge.util.collect.FCollection;
import org.apache.commons.lang3.StringUtils;
@@ -312,14 +312,12 @@ public class MatchController extends AbstractGuiGame {
@Override
public void finishGame() {
if (Forge.isMobileAdventureMode) {
- Forge.setCursor(null, "0");
- if (DuelScene.instance().hasCallbackExit())
+ if (Config.instance().getSettingData().disableWinLose) {
+ Forge.setCursor(null, "0");
+ if (!DuelScene.instance().hasCallbackExit())
+ DuelScene.instance().exitDuelScene();
return;
- Forge.setTransitionScreen(new TransitionScreen(() -> {
- Forge.clearTransitionScreen();
- Forge.clearCurrentScreen();
- }, Forge.takeScreenshot(), false, false));
- return;
+ }
}
if (hasLocalPlayers() || getGameView().isMatchOver()) {
view.setViewWinLose(new ViewWinLose(getGameView()));
diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java
new file mode 100644
index 00000000000..2a3bcaee978
--- /dev/null
+++ b/forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java
@@ -0,0 +1,46 @@
+package forge.screens.match.winlose;
+
+import forge.Forge;
+import forge.adventure.scene.DuelScene;
+import forge.game.GameView;
+
+public class AdventureWinLose extends ControlWinLose {
+ /**
+ * @param v ViewWinLose
+ * @param game
+ */
+ public AdventureWinLose(ViewWinLose v, GameView game) {
+ super(v, game);
+ v.getBtnContinue().setVisible(false);
+ v.getBtnRestart().setVisible(false);
+ v.getLabelShowBattlefield().setVisible(false);
+ v.getBtnQuit().setText(Forge.getLocalizer().getMessage("lblBackToAdventure"));
+ Forge.setCursor(null, "0");
+ }
+
+ @Override
+ public void actionOnContinue() {
+ //Do Nothing
+ }
+
+ @Override
+ public void actionOnRestart() {
+ //Do Nothing
+ }
+
+ @Override
+ public void actionOnQuit() {
+ getView().hide();
+ DuelScene.instance().exitDuelScene();
+ }
+
+ @Override
+ public void saveOptions() {
+ //Do Nothing
+ }
+
+ @Override
+ public void showRewards() {
+ //Do Nothing
+ }
+}
diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java
index 5d7cc6b1fa8..afd79206f4c 100644
--- a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java
+++ b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java
@@ -123,6 +123,9 @@ public class ViewWinLose extends FOverlay implements IWinLoseView {
}).build());
lblTitle.setText(composeTitle(game0));
+ if (Forge.isMobileAdventureMode)
+ control = new AdventureWinLose(this, game0);
+
showGameOutcomeSummary();
showPlayerScores();
control.showRewards();
@@ -152,6 +155,10 @@ public class ViewWinLose extends FOverlay implements IWinLoseView {
return this.btnQuit;
}
+ public FLabel getLabelShowBattlefield() {
+ return this.btnShowBattlefield;
+ }
+
private void showGameOutcomeSummary() {
for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) {
pnlOutcomes.add(new FLabel.Builder().text(o.message).font(FSkinFont.get(14)).build());
@@ -191,12 +198,20 @@ public class ViewWinLose extends FOverlay implements IWinLoseView {
y += h + dy;
h = height / 12;
- btnContinue.setBounds(x, y, w, h);
- y += h + dy;
- btnRestart.setBounds(x, y, w, h);
- y += h + dy;
- btnQuit.setBounds(x, y, w, h);
- y += h + dy;
+ if (Forge.isMobileAdventureMode) {
+ btnQuit.setBounds(x, y, w, h);
+ y += h + dy;
+ btnContinue.setVisible(false);
+ btnRestart.setVisible(false);
+ } else {
+ btnContinue.setBounds(x, y, w, h);
+ y += h + dy;
+ btnRestart.setBounds(x, y, w, h);
+ y += h + dy;
+ btnQuit.setBounds(x, y, w, h);
+ y += h + dy;
+ }
+
h = lblLog.getAutoSizeBounds().height + dy;
lblLog.setBounds(x, y, w, h);
diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml
index b39765363a8..46fd77e56d2 100644
--- a/forge-gui/pom.xml
+++ b/forge-gui/pom.xml
@@ -4,7 +4,7 @@
forge
forge
- 1.6.56-SNAPSHOT
+ 1.6.57-SNAPSHOT
forge-gui
diff --git a/forge-gui/res/adventure/Shandalar/config.json b/forge-gui/res/adventure/Shandalar/config.json
index 75c7e42f6f7..aa5fac61fdf 100644
--- a/forge-gui/res/adventure/Shandalar/config.json
+++ b/forge-gui/res/adventure/Shandalar/config.json
@@ -84,8 +84,8 @@
"pileDecks": {
"W":"decks/starter/pile_white_e.json",
"B":"decks/starter/pile_black_e.json",
- "U":"decks/starter/pile_blue_e.json",
- "R":"decks/starter/pile_red_e.json",
+ "U":"decks/starter/pile_blue_e.json",
+ "R":"decks/starter/pile_red_e.json",
"G":"decks/starter/pile_green_e.json"
},
"startItems": [
@@ -122,8 +122,8 @@
"pileDecks": {
"W":"decks/starter/pile_white_n.json",
"B":"decks/starter/pile_black_n.json",
- "U":"decks/starter/pile_blue_n.json",
- "R":"decks/starter/pile_red_n.json",
+ "U":"decks/starter/pile_blue_n.json",
+ "R":"decks/starter/pile_red_n.json",
"G":"decks/starter/pile_green_n.json"
},
"startItems": [
@@ -191,8 +191,8 @@
"pileDecks": {
"W":"decks/starter/pile_white_h.json",
"B":"decks/starter/pile_black_h.json",
- "U":"decks/starter/pile_blue_h.json",
- "R":"decks/starter/pile_red_h.json",
+ "U":"decks/starter/pile_blue_h.json",
+ "R":"decks/starter/pile_red_h.json",
"G":"decks/starter/pile_green_h.json"
}
}
@@ -212,7 +212,7 @@
"Brother's War",
"Jumpstart 22",
"Phyrexia: ONE",
- "March o.t Machine",
+ "MOM",
"(All)"
]
}
diff --git a/forge-gui/res/adventure/Shandalar/decks/copperhostbrutalizer.dck b/forge-gui/res/adventure/Shandalar/decks/copperhostbrutalizer.dck
new file mode 100644
index 00000000000..5a4ac2f544b
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/copperhostbrutalizer.dck
@@ -0,0 +1,43 @@
+[metadata]
+Name=copperhostbrutalizer
+[Avatar]
+
+[Main]
+2 Blighted Burgeoning|MOM|1
+1 Bloated Contaminator|ONE|1
+1 Bloated Contaminator|ONE|2
+1 Bloated Processor|MOM|1
+1 Bloated Processor|MOM|2
+2 Converter Beast|MOM|1
+2 Drown in Ichor|ONE|1
+4 Elvish Vatkeeper|MOM|1
+2 Expand the Sphere|ONE|1
+1 Forest|ONE|1
+5 Forest|ONE|2
+6 Forest|ONE|3
+2 Gift of Compleation|MOM|1
+2 Glistening Dawn|MOM|2
+1 Grafted Butcher|MOM|1
+1 Grafted Butcher|MOM|2
+2 Gulping Scraptrap|ONE|1
+2 Ichor Drinker|MOM|1
+4 Jungle Hollow|MOM|1
+3 Swamp|ONE|1
+1 Swamp|ONE|2
+3 Swamp|ONE|3
+1 Swamp|ONE|4
+2 Tangled Skyline|MOM|1
+2 Traumatic Revelation|MOM|1
+2 Vat Emergence|ONE|1
+2 Vat of Rebirth|ONE|1
+2 Venomous Brutalizer|ONE|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/drossgrimnarch.dck b/forge-gui/res/adventure/Shandalar/decks/drossgrimnarch.dck
new file mode 100644
index 00000000000..41b2062b94f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/drossgrimnarch.dck
@@ -0,0 +1,47 @@
+[metadata]
+Name=drossgrimnarch
+[Avatar]
+
+[Main]
+2 Annihilating Glare|ONE|1
+2 Bilious Skulldweller|ONE|1
+2 Blightwing Whelp|YONE|1
+2 Chittering Skitterling|ONE|1
+2 Darkslick Shores|ONE|1
+4 Dismal Backwater|MOM|1
+2 Distorted Curiosity|ONE|1
+2 Drown in Ichor|ONE|1
+1 Experimental Augury|ONE|1
+1 Experimental Augury|ONE|2
+1 Grafted Butcher|MOM|1
+1 Grafted Butcher|MOM|2
+2 Grim Affliction|NPH|1
+2 Gulping Scraptrap|ONE|1
+2 Infectious Inquiry|ONE|1
+2 Island|MOM|1
+3 Island|MOM|2
+1 Island|MOM|3
+1 Mercurial Spelldancer|ONE|1
+1 Mercurial Spelldancer|ONE|2
+1 Myr Convert|ONE|1
+1 Myr Convert|ONE|2
+2 Necrogen Communion|ONE|1
+2 Pestilent Syphoner|ONE|1
+2 Quicksilver Servitor|YONE|1
+2 Sheoldred's Headcleaver|ONE|1
+5 Swamp|MOM|1
+1 Swamp|MOM|2
+4 Swamp|MOM|3
+1 Thrummingbird|ONE|1
+1 Thrummingbird|ONE|2
+2 Viral Drake|NPH|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/furnacetormentor.dck b/forge-gui/res/adventure/Shandalar/decks/furnacetormentor.dck
new file mode 100644
index 00000000000..e003da28e43
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/furnacetormentor.dck
@@ -0,0 +1,45 @@
+[metadata]
+Name=furnacetormentor
+[Avatar]
+
+[Main]
+1 All Will Be One|ONE|1
+1 All Will Be One|ONE|2
+2 Armored Scrapgorger|ONE|1
+2 Axiom Engraver|ONE|1
+2 Blighted Burgeoning|MOM|1
+2 Churning Reservoir|ONE|1
+2 Cinderslash Ravager|ONE|1
+2 Converter Beast|MOM|1
+2 Copperline Gorge|ONE|1
+2 Copperline Gorge|ONE|2
+2 Evolving Adaptive|ONE|1
+2 Expand the Sphere|ONE|1
+2 Exuberant Fuseling|ONE|1
+1 Forest|ONE|1
+1 Forest|ONE|2
+1 Forest|ONE|3
+4 Forest|ONE|4
+4 Magmatic Sprinter|ONE|1
+3 Mountain|ONE|1
+3 Mountain|ONE|2
+2 Mountain|ONE|3
+5 Mountain|ONE|4
+2 Nahiri's Warcrafting|MOM|1
+2 Thrill of Possibility|ONE|1
+1 Urabrask's Anointer|ONE|1
+1 Urabrask's Anointer|ONE|2
+2 Urabrask's Forge|ONE|1
+2 Urabrask's Forge|ONE|2
+1 Vindictive Flamestoker|ONE|1
+1 Vindictive Flamestoker|ONE|2
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/gitaxianscientist.dck b/forge-gui/res/adventure/Shandalar/decks/gitaxianscientist.dck
new file mode 100644
index 00000000000..781ccb8ce02
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/gitaxianscientist.dck
@@ -0,0 +1,43 @@
+[metadata]
+Name=gitaxianscientist
+[Avatar]
+
+[Main]
+2 Blighted Agent|NPH|1
+2 Bloated Contaminator|ONE|2
+2 Contagious Vorrac|ONE|1
+4 Distorted Curiosity|ONE|1
+1 Experimental Augury|ONE|1
+1 Experimental Augury|ONE|2
+2 Forest|ONE|1
+2 Forest|ONE|2
+3 Forest|ONE|3
+1 Forest|ONE|4
+2 Glistener Seer|ONE|1
+2 Ichorspit Basilisk|ONE|1
+2 Infectious Bite|ONE|1
+6 Island|ONE|1
+3 Island|ONE|2
+2 Island|ONE|3
+3 Island|ONE|4
+1 Mindsplice Apparatus|ONE|1
+1 Mindsplice Apparatus|ONE|2
+1 Myr Convert|ONE|1
+1 Myr Convert|ONE|2
+2 Serum Snare|ONE|1
+2 Tainted Observer|ONE|1
+2 The Seedcore|ONE|2
+2 Thrummingbird|ONE|1
+2 Thrummingbird|ONE|2
+4 Viral Drake|NPH|1
+2 Vivisurgeon's Insight|ONE|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/phyrexianangel.dck b/forge-gui/res/adventure/Shandalar/decks/phyrexianangel.dck
new file mode 100644
index 00000000000..fefbfe3fb6f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/phyrexianangel.dck
@@ -0,0 +1,45 @@
+[metadata]
+Name=phyrexianangel
+[Avatar]
+
+[Main]
+2 Apostle of Invasion|ONE|1
+2 Bloated Contaminator|ONE|1
+2 Blossoming Sands|MOM|1
+2 Charge of the Mites|ONE|1
+4 Crawling Chorus|ONE|1
+2 Duelist of Deep Faith|ONE|1
+2 Flensing Raptor|ONE|1
+3 Forest|ONE|3
+3 Forest|ONE|4
+2 Infectious Bite|ONE|1
+2 Infested Fleshcutter|ONE|1
+2 Mite Overseer|ONE|2
+1 Myr Convert|ONE|1
+1 Myr Convert|ONE|2
+2 Norn's Wellspring|ONE|1
+1 Ossification|ONE|1
+1 Ossification|ONE|2
+2 Phyrexia's Core|NPH|1
+2 Plague Nurse|ONE|1
+3 Plains|ONE|1
+2 Plains|ONE|2
+1 Plains|ONE|3
+4 Plains|ONE|4
+2 Razorverge Thicket|ONE|2
+1 Sinew Dancer|ONE|1
+1 Sinew Dancer|ONE|2
+2 Slaughter Singer|ONE|1
+2 Slaughter Singer|ONE|2
+2 The Seedcore|ONE|1
+2 Venerated Rotpriest|ONE|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/phyrexianduelist.json b/forge-gui/res/adventure/Shandalar/decks/phyrexianduelist.json
index eca588ea0ae..222826c04f0 100644
--- a/forge-gui/res/adventure/Shandalar/decks/phyrexianduelist.json
+++ b/forge-gui/res/adventure/Shandalar/decks/phyrexianduelist.json
@@ -3,7 +3,7 @@
"template":
{
"count":60,
- "colors":["White", "Black"],
+ "colors":["White"],
"tribe":"Phyrexian",
"tribeCards":1.0,
"tribeSynergyCards":0.5,
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx
index ecbbff4557c..7b8b0ec26f8 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx
@@ -151,6 +151,7 @@
"Challenger 20",
"Challenger 21",
"Challenger 22",
+ "Copper Host Infector",
"Dino",
"Eldraine Faerie",
"Elf",
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx
index 938ac91d906..2d41597ecab 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx
@@ -137,6 +137,7 @@
"Challenger 22",
"Djinn",
"Elemental",
+ "Gitaxian Underling",
"Merfolk",
"Merfolk Avatar",
"Merfolk Fighter",
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx
index 7484d64f9f2..b8b51a39da2 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx
@@ -136,6 +136,7 @@
"Efreet",
"Fire Elemental",
"Flame Elemental",
+ "Furnace Goblin",
"Goblin",
"Goblin Chief",
"Goblin Warrior",
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx
index 32c421d6046..34ffc2a88ef 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx
@@ -145,6 +145,7 @@
"Human guard",
"Knight",
"Monk",
+ "Orthodoxy Duelist",
"White Dwarf",
"White Wiz1",
"White Wiz2",
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx
index cf3faf42af4..f3594ff88b4 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx
@@ -67,6 +67,7 @@
"Dark Knight",
"Death Knight",
"Demon",
+ "Dross Gladiator",
"Ghoul",
"Ghost",
"Harpy",
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/phyrexian_b1.tmx b/forge-gui/res/adventure/Shandalar/maps/map/phyrexian_b1.tmx
index b7f548e6be7..71cb5a5d5a8 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/phyrexian_b1.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/phyrexian_b1.tmx
@@ -1,5 +1,5 @@
-