diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java index 65cc3767bb0..0b2f521f707 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java @@ -15,7 +15,7 @@ import java.util.Arrays; public class RewardEdit extends FormPanel { RewardData currentData; - JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item","mana"}); + JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item","shards"}); JSpinner probability = new JSpinner(new SpinnerNumberModel(0f, 0, 1, 0.1f)); JSpinner count = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); JSpinner addMaxCount = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index e431ef91f2f..dc114298e86 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -18,6 +18,8 @@ package forge.ai; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import forge.game.staticability.StaticAbility; @@ -815,13 +817,37 @@ public class AiAttackController { } else { if (combat.getAttackConstraints().getRequirements().get(attacker) == null) continue; // check defenders in order of maximum requirements - for (Pair e : combat.getAttackConstraints().getRequirements().get(attacker).getSortedRequirements()) { + List> reqs = combat.getAttackConstraints().getRequirements().get(attacker).getSortedRequirements(); + final GameEntity def = defender; + Collections.sort(reqs, new Comparator>() { + @Override + public int compare(Pair r1, Pair r2) { + if (r1.getValue() == r2.getValue()) { + // try to attack the designated defender + if (r1.getKey().equals(def) && !r2.getKey().equals(def)) { + return -1; + } + if (r2.getKey().equals(def) && !r1.getKey().equals(def)) { + return 1; + } + // otherwise PW + if (r1.getKey() instanceof Card && r2.getKey() instanceof Player) { + return -1; + } + if (r2.getKey() instanceof Card && r1.getKey() instanceof Player) { + return 1; + } + // or weakest player + if (r1.getKey() instanceof Player && r2.getKey() instanceof Player) { + return ((Player) r1.getKey()).getLife() - ((Player) r2.getKey()).getLife(); + } + } + return r2.getValue() - r1.getValue(); + } + }); + for (Pair e : reqs) { if (e.getRight() == 0) continue; GameEntity mustAttackDefMaybe = e.getLeft(); - // Gideon Jura returns LKI - if (mustAttackDefMaybe instanceof Card) { - mustAttackDefMaybe = ai.getGame().getCardState((Card) mustAttackDefMaybe); - } if (canAttackWrapper(attacker, mustAttackDefMaybe) && CombatUtil.getAttackCost(ai.getGame(), attacker, mustAttackDefMaybe) == null) { mustAttackDef = mustAttackDefMaybe; break; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 2ea5e039421..74806b1f430 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1741,6 +1741,10 @@ public class ComputerUtil { continue; } + if (c.getCounters(CounterEnumType.SHIELD) > 0) { + continue; + } + // already regenerated if (c.getShieldCount() > 0) { continue; @@ -1855,6 +1859,10 @@ public class ComputerUtil { continue; } + if (c.getCounters(CounterEnumType.SHIELD) > 0) { + continue; + } + // already regenerated if (c.getShieldCount() > 0) { continue; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 9725ba51afd..ac9f829abf6 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1312,7 +1312,6 @@ public class ComputerUtilCard { final int power, final List keywords) { return shouldPumpCard(ai, sa, c, toughness, power, keywords, false); } - public static boolean shouldPumpCard(final Player ai, final SpellAbility sa, final Card c, final int toughness, final int power, final List keywords, boolean immediately) { final Game game = ai.getGame(); @@ -1546,35 +1545,37 @@ public class ComputerUtilCard { || ("PumpForTrample".equals(sa.getParam("AILogic")))) { return true; } - } - // try to determine if pumping a creature for more power will give lethal on board - // considering all unblocked creatures after the blockers are already declared - if (phase.is(PhaseType.COMBAT_DECLARE_BLOCKERS) && pumpedDmg > dmg) { - int totalPowerUnblocked = 0; - for (Card atk : combat.getAttackers()) { - if (combat.isBlocked(atk) && !atk.hasKeyword(Keyword.TRAMPLE)) { - continue; - } - if (atk == c) { - totalPowerUnblocked += pumpedDmg; // this accounts for Trample by now - } else { - totalPowerUnblocked += ComputerUtilCombat.damageIfUnblocked(atk, opp, combat, true); - if (combat.isBlocked(atk)) { - // consider Trample damage properly for a blocked creature - for (Card blk : combat.getBlockers(atk)) { - totalPowerUnblocked -= ComputerUtilCombat.getDamageToKill(blk, false); + + // try to determine if pumping a creature for more power will give lethal on board + // considering all unblocked creatures after the blockers are already declared + if (phase.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + int totalPowerUnblocked = 0; + for (Card atk : combat.getAttackers()) { + if (combat.isBlocked(atk) && !atk.hasKeyword(Keyword.TRAMPLE)) { + continue; + } + if (atk == c) { + totalPowerUnblocked += pumpedDmg; // this accounts for Trample by now + } else { + totalPowerUnblocked += ComputerUtilCombat.damageIfUnblocked(atk, opp, combat, true); + if (combat.isBlocked(atk)) { + // consider Trample damage properly for a blocked creature + for (Card blk : combat.getBlockers(atk)) { + totalPowerUnblocked -= ComputerUtilCombat.getDamageToKill(blk, false); + } } } } - } - if (totalPowerUnblocked >= opp.getLife()) { - return true; - } else if (totalPowerUnblocked > dmg && sa.getHostCard() != null && sa.getHostCard().isInPlay()) { - if (sa.getPayCosts().hasNoManaCost()) { - return true; // always activate abilities which cost no mana and which can increase unblocked damage + if (totalPowerUnblocked >= opp.getLife()) { + return true; + } else if (totalPowerUnblocked > dmg && sa.getHostCard() != null && sa.getHostCard().isInPlay()) { + if (sa.getPayCosts().hasNoManaCost()) { + return true; // always activate abilities which cost no mana and which can increase unblocked damage + } } } } + float value = 1.0f * (pumpedDmg - dmg); if (c == sa.getHostCard() && power > 0) { int divisor = sa.getPayCosts().getTotalMana().getCMC(); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index c1f01f83ece..b43e975147b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -128,7 +128,7 @@ public class ComputerUtilCombat { // || (attacker.hasKeyword(Keyword.FADING) && attacker.getCounters(CounterEnumType.FADE) == 0) // || attacker.hasSVar("EndOfTurnLeavePlay")); // The creature won't untap next turn - return !attacker.isTapped() || Untap.canUntap(attacker); + return !attacker.isTapped() || (attacker.getCounters(CounterEnumType.STUN) == 0 && Untap.canUntap(attacker)); } /** @@ -1628,9 +1628,8 @@ public class ComputerUtilCombat { * a {@link forge.game.card.Card} object. * @return a boolean. */ - public static boolean combatantCantBeDestroyed(Player ai, final Card combatant) { - // either indestructible or may regenerate - if (combatant.hasKeyword(Keyword.INDESTRUCTIBLE) || ComputerUtil.canRegenerate(ai, combatant)) { + public static boolean combatantCantBeDestroyed(final Player ai, final Card combatant) { + if (combatant.getCounters(CounterEnumType.SHIELD) > 0) { return true; } @@ -1639,6 +1638,11 @@ public class ComputerUtilCombat { return true; } + // either indestructible or may regenerate + if (combatant.hasKeyword(Keyword.INDESTRUCTIBLE) || ComputerUtil.canRegenerate(ai, combatant)) { + return true; + } + return false; } @@ -2150,7 +2154,7 @@ public class ComputerUtilCombat { final boolean noPrevention) { final int killDamage = getDamageToKill(c, false); - if (c.hasKeyword(Keyword.INDESTRUCTIBLE) || c.getShieldCount() > 0) { + if (c.hasKeyword(Keyword.INDESTRUCTIBLE) || c.getCounters(CounterEnumType.SHIELD) > 0 || (c.getShieldCount() > 0 && c.canBeShielded())) { if (!(source.hasKeyword(Keyword.WITHER) || source.hasKeyword(Keyword.INFECT))) { return maxDamage + 1; } @@ -2488,12 +2492,12 @@ public class ComputerUtilCombat { return poison; } - public static GameEntity addAttackerToCombat(SpellAbility sa, Card attacker, FCollection defenders) { + public static GameEntity addAttackerToCombat(SpellAbility sa, Card attacker, Iterable defenders) { Combat combat = sa.getHostCard().getGame().getCombat(); if (combat != null) { // 1. If the card that spawned the attacker was sent at a planeswalker, attack the same. Consider improving. GameEntity def = combat.getDefenderByAttacker(sa.getHostCard()); - if (def instanceof Card && ((Card)def).isPlaneswalker() && defenders.contains(def)) { + if (def instanceof Card && ((Card)def).isPlaneswalker() && Iterables.contains(defenders, def)) { return def; } // 2. Otherwise, go through the list of options one by one, choose the first one that can't be blocked profitably. diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 29fcfe0873f..d4419d083f4 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -688,10 +688,6 @@ public class ComputerUtilMana { ListMultimap sourcesForShards = getSourcesForShards(cost, sa, ai, test, checkPlayable, manaSpentToPay, hasConverge, ignoreColor, ignoreType); - if (sourcesForShards == null && !purePhyrexian) { - return false; // no mana abilities to use for paying - } - int testEnergyPool = ai.getCounters(CounterEnumType.ENERGY); final ManaPool manapool = ai.getManaPool(); ManaCostShard toPay = null; @@ -712,7 +708,7 @@ public class ComputerUtilMana { manapool.applyCardMatrix(pay); for (byte color : ManaAtom.MANATYPES) { - if (manapool.tryPayCostWithColor(color, sa, cost)) { + if (manapool.tryPayCostWithColor(color, sa, cost, manaSpentToPay)) { found = true; break; } @@ -724,6 +720,11 @@ public class ComputerUtilMana { if (cost.isPaid()) { break; } + + if (sourcesForShards == null && !purePhyrexian) { + return false; // no mana abilities to use for paying + } + toPay = getNextShardToPay(cost); boolean lifeInsteadOfBlack = toPay.isBlack() && ai.hasKeyword("PayLifeInsteadOf:B"); @@ -1323,9 +1324,9 @@ public class ComputerUtilMana { public static ManaCostBeingPaid calculateManaCost(final SpellAbility sa, final boolean test, final int extraMana) { Card card = sa.getHostCard(); Zone castFromBackup = null; - if (test && sa.isSpell()) { + if (test && sa.isSpell() && !card.isInZone(ZoneType.Stack)) { castFromBackup = card.getCastFrom(); - sa.getHostCard().setCastFrom(card.getZone() != null ? card.getZone() : null); + card.setCastFrom(card.getZone() != null ? card.getZone() : null); } Cost payCosts = CostAdjustment.adjust(sa.getPayCosts(), sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index ab4c7003e65..907d6438d88 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -33,7 +33,6 @@ import forge.game.staticability.StaticAbilityMustTarget; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.MyRandom; -import forge.util.collect.FCollection; import org.apache.commons.lang3.StringUtils; import java.util.*; @@ -1359,12 +1358,7 @@ public class ChangeZoneAi extends SpellAbilityAi { chance = aic.getIntProperty(AiProps.BLINK_RELOAD_PLANESWALKER_CHANCE); } if (MyRandom.percentTrue(chance)) { - Collections.sort(aiPlaneswalkers, new Comparator() { - @Override - public int compare(final Card a, final Card b) { - return a.getCounters(CounterEnumType.LOYALTY) - b.getCounters(CounterEnumType.LOYALTY); - } - }); + Collections.sort(aiPlaneswalkers, CardPredicates.compareByCounterType(CounterEnumType.LOYALTY)); for (Card pw : aiPlaneswalkers) { int curLoyalty = pw.getCounters(CounterEnumType.LOYALTY); int freshLoyalty = Integer.valueOf(pw.getCurrentState().getBaseLoyalty()); @@ -1764,7 +1758,7 @@ public class ChangeZoneAi extends SpellAbilityAi { public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) { // Called when attaching Aura to player or adding creature to combat if (params != null && params.containsKey("Attacker")) { - return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } return AttachAi.attachToPlayerAIPreferences(ai, sa, true, (List)options); } @@ -1772,7 +1766,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } // should not be reached return super.chooseSinglePlayerOrPlaneswalker(ai, sa, options, params); diff --git a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java index 5d9c7167484..b1e981d9d6a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java @@ -14,6 +14,7 @@ import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.ability.effects.CharmEffect; import forge.game.card.Card; +import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; @@ -26,7 +27,6 @@ public class CharmAi extends SpellAbilityAi { protected boolean checkApiLogic(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); List choices = CharmEffect.makePossibleOptions(sa); - Collections.shuffle(choices); final int num; final int min; @@ -37,6 +37,11 @@ public class CharmAi extends SpellAbilityAi { min = sa.hasParam("MinCharmNum") ? AbilityUtils.calculateAmount(source, sa.getParam("MinCharmNum"), sa) : num; } + // only randomize if not all possible together + if (num < choices.size() || source.hasKeyword(Keyword.ESCALATE)) { + Collections.shuffle(choices); + } + boolean timingRight = sa.isTrigger(); //is there a reason to play the charm now? // Reset the chosen list otherwise it will be locked in forever by earlier calls diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index ee1b5284616..53fe0518bcf 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -34,7 +34,6 @@ import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -import forge.util.collect.FCollection; public class CopyPermanentAi extends SpellAbilityAi { @Override @@ -254,7 +253,7 @@ public class CopyPermanentAi extends SpellAbilityAi { @Override protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } final List cards = new PlayerCollection(options).getCreaturesInPlay(); Card chosen = ComputerUtilCard.getBestCreatureAI(cards); @@ -264,7 +263,7 @@ public class CopyPermanentAi extends SpellAbilityAi { @Override protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } // should not be reached return super.chooseSinglePlayerOrPlaneswalker(ai, sa, options, params); diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 644c21b7480..cfc66522a27 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -45,6 +45,7 @@ import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerCollection; import forge.game.player.PlayerPredicates; +import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.trigger.Trigger; @@ -456,25 +457,24 @@ public class CountersPutAi extends CountersAi { } } - if (!ai.getGame().getStack().isEmpty() && !SpellAbilityAi.isSorcerySpeed(sa, ai)) { - // only evaluates case where all tokens are placed on a single target - if (sa.usesTargeting() && sa.getMinTargets() < 2) { - if (ComputerUtilCard.canPumpAgainstRemoval(ai, sa)) { - Card c = sa.getTargetCard(); - if (sa.getTargets().size() > 1) { - sa.resetTargets(); - sa.getTargets().add(c); + if (sa.usesTargeting()) { + if (!ai.getGame().getStack().isEmpty() && !SpellAbilityAi.isSorcerySpeed(sa, ai)) { + // only evaluates case where all tokens are placed on a single target + if (sa.getMinTargets() < 2) { + if (ComputerUtilCard.canPumpAgainstRemoval(ai, sa)) { + Card c = sa.getTargetCard(); + if (sa.getTargets().size() > 1) { + sa.resetTargets(); + sa.getTargets().add(c); + } + sa.addDividedAllocation(c, amount); + return true; + } else { + return false; } - sa.addDividedAllocation(c, amount); - return true; - } else { - return false; } } - } - // Targeting - if (sa.usesTargeting()) { sa.resetTargets(); final boolean sacSelf = ComputerUtilCost.isSacrificeSelfCost(abCost); @@ -482,7 +482,7 @@ public class CountersPutAi extends CountersAi { if (sa.isCurse()) { list = ai.getOpponents().getCardsIn(ZoneType.Battlefield); } else { - list = new CardCollection(ai.getCardsIn(ZoneType.Battlefield)); + list = ComputerUtil.getSafeTargets(ai, sa, ai.getCardsIn(ZoneType.Battlefield)); } list = CardLists.filter(list, new Predicate() { @@ -530,8 +530,7 @@ public class CountersPutAi extends CountersAi { for (int i = 1; i < amount + 1; i++) { int left = amount; for (Card c : list) { - if (ComputerUtilCard.shouldPumpCard(ai, sa, c, i, i, - Lists.newArrayList())) { + if (ComputerUtilCard.shouldPumpCard(ai, sa, c, i, i, Lists.newArrayList())) { sa.getTargets().add(c); sa.addDividedAllocation(c, i); left -= i; @@ -553,7 +552,7 @@ public class CountersPutAi extends CountersAi { // target loop while (sa.canAddMoreTarget()) { if (list.isEmpty()) { - if (!sa.isTargetNumberValid() || (sa.getTargets().size() == 0)) { + if (!sa.isTargetNumberValid() || sa.getTargets().isEmpty()) { sa.resetTargets(); return false; } else { @@ -567,31 +566,42 @@ public class CountersPutAi extends CountersAi { } else { if (type.equals("P1P1") && !SpellAbilityAi.isSorcerySpeed(sa, ai)) { for (Card c : list) { - if (ComputerUtilCard.shouldPumpCard(ai, sa, c, amount, amount, - Lists.newArrayList())) { + if (ComputerUtilCard.shouldPumpCard(ai, sa, c, amount, amount, Lists.newArrayList())) { choice = c; break; } } - if (!source.isSpell()) { // does not cost a card - if (choice == null) { // find generic target - if (abCost == null + + if (choice == null) { + // try to use as cheap kill + choice = ComputerUtil.getKilledByTargeting(sa, CardLists.getTargetableCards(ai.getOpponents().getCreaturesInPlay(), sa)); + } + + if (choice == null) { + // find generic target + boolean increasesCharmOutcome = false; + if (sa.getRootAbility().getApi() == ApiType.Charm && source.getStaticAbilities().isEmpty()) { + List choices = Lists.newArrayList(sa.getRootAbility().getAdditionalAbilityList("Choices")); + choices.remove(sa); + // check if other choice will already be played + increasesCharmOutcome = !choices.get(0).getTargets().isEmpty(); + } + if (!source.isSpell() || increasesCharmOutcome // does not cost a card or can buff charm for no expense + || ph.getTurn() - source.getTurnInZone() >= source.getGame().getPlayers().size() * 2) { + if (abCost == null || abCost == Cost.Zero || (ph.is(PhaseType.END_OF_TURN) && ph.getPlayerTurn().isOpponentOf(ai))) { // only use at opponent EOT unless it is free choice = chooseBoonTarget(list, type); } } } - if (ComputerUtilAbility.getAbilitySourceName(sa).equals("Dromoka's Command")) { - choice = chooseBoonTarget(list, type); - } } else { choice = chooseBoonTarget(list, type); } } if (choice == null) { // can't find anything left - if (!sa.isTargetNumberValid() || sa.getTargets().size() == 0) { + if (!sa.isTargetNumberValid() || sa.getTargets().isEmpty()) { sa.resetTargets(); return false; } else { @@ -907,7 +917,6 @@ public class CountersPutAi extends CountersAi { // Didn't want to choose anything? list.clear(); } - } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 02a5c9aa557..61026745190 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -1,6 +1,7 @@ package forge.ai.ability; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import forge.ai.*; import forge.game.ability.AbilityUtils; @@ -174,6 +175,8 @@ public class DestroyAi extends SpellAbilityAi { list = ComputerUtilCard.prioritizeCreaturesWorthRemovingNow(ai, list, false); } if (!SpellAbilityAi.playReusable(ai, sa)) { + list = CardLists.filter(list, Predicates.not(CardPredicates.hasCounter(CounterEnumType.SHIELD, 1))); + list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { @@ -196,7 +199,7 @@ public class DestroyAi extends SpellAbilityAi { return false; } //Check for undying - return (!c.hasKeyword(Keyword.UNDYING) || c.getCounters(CounterEnumType.P1P1) > 0); + return !c.hasKeyword(Keyword.UNDYING) || c.getCounters(CounterEnumType.P1P1) > 0; } }); } @@ -333,6 +336,7 @@ public class DestroyAi extends SpellAbilityAi { CardCollection preferred = CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE); preferred = CardLists.filterControlledBy(preferred, ai.getOpponents()); + preferred = CardLists.filter(preferred, Predicates.not(CardPredicates.hasCounter(CounterEnumType.SHIELD, 1))); if (CardLists.getNotType(preferred, "Creature").isEmpty()) { preferred = ComputerUtilCard.prioritizeCreaturesWorthRemovingNow(ai, preferred, false); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index 633cbcbd2b8..5ddf3b677f1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -8,6 +8,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.card.CardPredicates; +import forge.game.card.CounterEnumType; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.keyword.Keyword; @@ -21,7 +22,7 @@ public class DestroyAllAi extends SpellAbilityAi { private static final Predicate predicate = new Predicate() { @Override public boolean apply(final Card c) { - return !(c.hasKeyword(Keyword.INDESTRUCTIBLE) || c.getSVar("SacMe").length() > 0); + return !(c.hasKeyword(Keyword.INDESTRUCTIBLE) || c.getCounters(CounterEnumType.SHIELD) > 0 || c.hasSVar("SacMe")); } }; diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java index 33b8dac06a2..cfd4214d834 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java @@ -27,7 +27,6 @@ import forge.game.player.PlayerPredicates; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.TextUtil; -import forge.util.collect.FCollection; public class DigAi extends SpellAbilityAi { @@ -190,7 +189,7 @@ public class DigAi extends SpellAbilityAi { @Override public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } // an opponent choose a card from return Iterables.getFirst(options, null); @@ -199,7 +198,7 @@ public class DigAi extends SpellAbilityAi { @Override protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } // should not be reached return super.chooseSinglePlayerOrPlaneswalker(ai, sa, options, params); diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java index 8921a2ae27a..a4d9b8215c5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java @@ -37,7 +37,7 @@ public class PermanentNoncreatureAi extends PermanentAi { // Check for valid targets before casting if (host.hasSVar("OblivionRing")) { SpellAbility effectExile = AbilityFactory.getAbility(host.getSVar("TrigExile"), host); - final ZoneType origin = ZoneType.listValueOf(effectExile.getParam("Origin")).get(0); + final ZoneType origin = ZoneType.listValueOf(effectExile.getParamOrDefault("Origin", "Battlefield")).get(0); effectExile.setActivatingPlayer(ai, true); CardCollection targets = CardLists.getTargetableCards(game.getCardsIn(origin), effectExile); if (sourceName.equals("Suspension Field") diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 45789029150..06a7ce2f7dc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -40,7 +40,6 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.MyRandom; -import forge.util.collect.FCollection; /** *

@@ -321,7 +320,7 @@ public class TokenAi extends SpellAbilityAi { @Override protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return (Player) ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } return Iterables.getFirst(options, null); } @@ -332,7 +331,7 @@ public class TokenAi extends SpellAbilityAi { @Override protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable options, Map params) { if (params != null && params.containsKey("Attacker")) { - return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), new FCollection(options)); + return ComputerUtilCombat.addAttackerToCombat(sa, (Card) params.get("Attacker"), options); } // should not be reached return super.chooseSinglePlayerOrPlaneswalker(ai, sa, options, params); diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index 7863f76d321..277476cc742 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -188,7 +188,7 @@ public class ForgeScript { } else if (property.startsWith("XCost")) { String comparator = property.substring(5, 7); int y = AbilityUtils.calculateAmount(sa.getHostCard(), property.substring(7), sa); - return Expressions.compare(sa.getXManaCostPaid(), comparator, y); + return Expressions.compare(sa.getXManaCostPaid() == null ? 0 : sa.getXManaCostPaid(), comparator, y); } else if (property.equals("hasTapCost")) { Cost cost = sa.getPayCosts(); return cost != null && cost.hasTapCost(); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 9d811b8fa3f..7f2ffe06653 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -288,12 +288,12 @@ public class AbilityUtils { } else { System.err.println("Warning: couldn't find trigger SA in the chain of SpellAbility " + sa); } - } else if (defined.equals("FirstRemembered")) { + } else if (defined.equals("RememberedFirst")) { Object o = hostCard.getFirstRemembered(); if (o instanceof Card) { cards.add(game.getCardState((Card) o)); } - } else if (defined.equals("LastRemembered")) { + } else if (defined.equals("RememberedLast")) { Object o = Iterables.getLast(hostCard.getRemembered(), null); if (o instanceof Card) { cards.add(game.getCardState((Card) o)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java index b5c4d5fc9e2..b8589da8e37 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java @@ -15,7 +15,6 @@ import com.google.common.collect.Table; import forge.GameCommand; import forge.game.Game; import forge.game.GameEntity; -import forge.game.GameObject; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; @@ -220,11 +219,10 @@ public abstract class TokenEffectBase extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Game game = host.getGame(); - GameObject aTo = Iterables.getFirst( - AbilityUtils.getDefinedObjects(host, sa.getParam("AttachedTo"), sa), null); + GameEntity aTo = Iterables.getFirst( + AbilityUtils.getDefinedEntities(host, sa.getParam("AttachedTo"), sa), null); - if (aTo instanceof GameEntity) { - GameEntity ge = (GameEntity)aTo; + if (aTo != null) { // check what the token would be on the battlefield Card lki = CardUtil.getLKICopy(tok); @@ -237,7 +235,7 @@ public abstract class TokenEffectBase extends SpellAbilityEffect { boolean canAttach = lki.isAttachment(); - if (canAttach && !ge.canBeAttached(lki, sa)) { + if (canAttach && !aTo.canBeAttached(lki, sa)) { canAttach = false; } @@ -253,7 +251,7 @@ public abstract class TokenEffectBase extends SpellAbilityEffect { return false; } - tok.attachToEntity(ge, sa); + tok.attachToEntity(aTo, sa); return true; } // not a GameEntity, cant be attach diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 973b2835cbd..8cf751a1997 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2064,7 +2064,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbLong.append(TextUtil.fastReplace(keyword, ":", " ")).append("\r\n"); } else if (keyword.startsWith("Morph") || keyword.startsWith("Megamorph") || keyword.startsWith("Escape") || keyword.startsWith("Foretell:") - || keyword.startsWith("Madness:") + || keyword.startsWith("Madness:")|| keyword.startsWith("Recover") || keyword.startsWith("Reconfigure") || keyword.startsWith("Squad") || keyword.startsWith("Miracle") || keyword.startsWith("More Than Meets the Eye") || keyword.startsWith("Level up")) { @@ -2072,11 +2072,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbLong.append(k[0]); if (k.length > 1) { final Cost mCost = new Cost(k[1], true); - if (!mCost.isOnlyManaCost()) { - sbLong.append("—"); - } if (mCost.isOnlyManaCost()) { sbLong.append(" "); + } else { + sbLong.append("—"); } sbLong.append(mCost.toString()); if (!mCost.isOnlyManaCost()) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 1c040fe82da..540b7c3e0ad 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1691,14 +1691,20 @@ public class CardFactoryUtil { AbilitySub exileSA = (AbilitySub) AbilityFactory.getAbility(exileStr, card); changeSA.setSubAbility(exileSA); + final Cost cost = new Cost(recoverCost, false); + String costDesc = cost.toSimpleString(); + if (!cost.isOnlyManaCost()) { + costDesc = "—" + costDesc; + } + String trigObject = card.isCreature() ? "Creature.Other+YouOwn" : "Creature.YouOwn"; String trigArticle = card.isCreature() ? "another" : "a"; String trigStr = "Mode$ ChangesZone | ValidCard$ " + trigObject + " | Origin$ Battlefield | Destination$ Graveyard | " + "TriggerZones$ Graveyard | Secondary$ True | " - + "TriggerDescription$ Recover " + recoverCost + " (When " + trigArticle + " creature is " + + "TriggerDescription$ Recover " + costDesc + " (When " + trigArticle + " creature is " + "put into your graveyard from the battlefield, you " - + "may pay " + recoverCost + ". If you do, return " + + "may pay " + costDesc + ". If you do, return " + "CARDNAME from your graveyard to your hand. Otherwise," + " exile CARDNAME.)"; final Trigger myTrigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 3c84a335955..4c29741a434 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -42,6 +42,7 @@ import forge.game.GameEntityCounterTable; import forge.game.GameLogEntryType; import forge.game.GameObjectMap; import forge.game.ability.AbilityKey; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; @@ -795,7 +796,7 @@ public class Combat { assigningPlayer = orderedBlockers.get(0).getController(); } - final SpellAbility emptySA = new SpellAbility.EmptySa(attacker); + final SpellAbility emptySA = new SpellAbility.EmptySa(ApiType.Cleanup, attacker); boolean assignToPlayer = false; if (StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker, false)) { @@ -846,8 +847,7 @@ public class Combat { // If the Attacker is unblocked, or it's a trampler and has 0 blockers, deal damage to defender if (defender instanceof Card && attacker.hasKeyword("Trample:Planeswalker")) { if (orderedBlockers == null || orderedBlockers.isEmpty()) { - CardCollection cc = new CardCollection(); - cc.add((Card)defender); + CardCollection cc = new CardCollection((Card) defender); orderedBlockers = cc; } else { orderedBlockers.add((Card) defender); @@ -862,7 +862,7 @@ public class Combat { attackers.remove(attacker); if (assignCombatDamageToCreature) { Card chosen = attacker.getController().getController().chooseCardsForEffect(getDefendersCreatures(), - null, Localizer.getInstance().getMessage("lblChooseCreature"), 1, 1, false, null).get(0); + emptySA, Localizer.getInstance().getMessage("lblChooseCreature"), 1, 1, false, null).get(0); damageMap.put(attacker, chosen, damageDealt); } else if (trampler || !band.isBlocked()) { // this is called after declare blockers, no worries 'bout nulls in isBlocked damageMap.put(attacker, defender, damageDealt); diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index 1cab0f54a9c..0fc931ce921 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -212,7 +212,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } } - public boolean tryPayCostWithColor(byte colorCode, SpellAbility saPaidFor, ManaCostBeingPaid manaCost) { + public boolean tryPayCostWithColor(byte colorCode, SpellAbility saPaidFor, ManaCostBeingPaid manaCost, List manaSpentToPay) { Mana manaFound = null; String restriction = manaCost.getSourceRestriction(); Collection cm = floatingMana.get(colorCode); @@ -231,7 +231,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } if (manaFound != null && tryPayCostWithMana(saPaidFor, manaCost, manaFound, false)) { - saPaidFor.getPayingMana().add(0, manaFound); + manaSpentToPay.add(0, manaFound); return true; } return false; diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index bb66d38e071..b93ae6cf318 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -105,7 +105,7 @@ public class Untap extends Phase { public static final Predicate CANUNTAP = new Predicate() { @Override public boolean apply(Card c) { - return Untap.canUntap(c); + return canUntap(c); } }; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 83896843267..13759edaa84 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2891,6 +2891,16 @@ public class Player extends GameEntity implements Comparable { com.add(conspire); } + // Adventure Mode items + Iterable adventureItemCards = registeredPlayer.getExtraCardsInCommandZone(); + if (adventureItemCards != null) { + for (final IPaperCard cp : adventureItemCards) { + Card c = Card.fromPaperCard(cp, this); + com.add(c); + c.setStartsGameInPlay(true); + } + } + for (final Card c : getCardsIn(ZoneType.Library)) { for (KeywordInterface inst : c.getKeywords()) { String kw = inst.getOriginal(); diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index 2607a62c6b0..6cb37ae0891 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -29,6 +29,7 @@ public class RegisteredPlayer { private int manaShards = 0; private Iterable cardsOnBattlefield = null; private Iterable extraCardsOnBattlefield = null; + private Iterable extraCardsInCommandZone = null; private Iterable schemes = null; private Iterable planes = null; private Iterable conspiracies = null; @@ -56,6 +57,10 @@ public class RegisteredPlayer { extraCardsOnBattlefield == null ? EmptyList : extraCardsOnBattlefield); } + public final Iterable getExtraCardsInCommandZone() { + return extraCardsInCommandZone == null ? EmptyList : extraCardsInCommandZone; + } + public final void setStartingLife(int startingLife) { this.startingLife = startingLife; } @@ -86,6 +91,13 @@ public class RegisteredPlayer { this.extraCardsOnBattlefield = Iterables.concat(this.extraCardsOnBattlefield, extraCardsonTable); } + public final void addExtraCardsInCommandZone(Iterable extraCardsInCommandZone) { + if (this.extraCardsInCommandZone == null) + this.extraCardsInCommandZone = extraCardsInCommandZone; + else + this.extraCardsInCommandZone = Iterables.concat(this.extraCardsInCommandZone, extraCardsInCommandZone); + } + public int getStartingHand() { return startingHand; } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java b/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java index 726c45ec097..330b4e5ff0d 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java @@ -20,7 +20,6 @@ package forge.game.spellability; import forge.card.mana.ManaCost; import forge.game.card.Card; import forge.game.cost.Cost; -import forge.game.player.Player; /** *

@@ -51,11 +50,6 @@ public abstract class AbilityStatic extends Ability implements Cloneable { } @Override public boolean canPlay() { - Player player = getActivatingPlayer(); - if (player == null) { - player = this.getHostCard().getController(); - } - final Card c = this.getHostCard(); return this.getRestrictions().canPlay(c, this); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java index 12cd844300b..13f846b847d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java @@ -126,15 +126,8 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { boolean validTgtFound = false; while (sa != null && !validTgtFound) { - for (final Card tgt : sa.getTargets().getTargetCards()) { - if (matchesValid(tgt, getParam("TargetsValid").split(","))) { - validTgtFound = true; - break; - } - } - - for (final Player p : sa.getTargets().getTargetPlayers()) { - if (matchesValid(p, getParam("TargetsValid").split(","))) { + for (final GameEntity ge : sa.getTargets().getTargetEntities()) { + if (matchesValid(ge, getParam("TargetsValid").split(","))) { validTgtFound = true; break; } diff --git a/forge-gui-mobile/src/forge/adventure/data/EffectData.java b/forge-gui-mobile/src/forge/adventure/data/EffectData.java index 017786d0ba2..001dd851902 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EffectData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EffectData.java @@ -7,6 +7,10 @@ import forge.item.PaperToken; import forge.model.FModel; import java.io.Serializable; +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; public class EffectData implements Serializable { public String name = null; //Effect name. Can be checked for. @@ -14,6 +18,7 @@ public class EffectData implements Serializable { public int lifeModifier = 0; //Amount to add to starting Life. public int changeStartCards = 0; //Amount to add to starting hand size. public String[] startBattleWithCard; //Cards that start in the Battlefield. + public String[] startBattleWithCardInCommandZone; //Cards that start in the Command Zone of the Battlefield. //Map only effects. public boolean colorView = false; //Allows to display enemy colors on the map. public float moveSpeed = 1.0f; //Change of movement speed. Map only. @@ -52,13 +57,27 @@ public class EffectData implements Serializable { return startCards; } - public String cardNames() { - StringBuilder ret = new StringBuilder(); - Array array=startBattleWithCards(); - for(int i =0;i startBattleWithCardsInCommandZone(){ + Array startCardsInCommandZone=new Array<>(); + if(startBattleWithCardInCommandZone != null) { + for (String name:startBattleWithCardInCommandZone) { + PaperCard C = FModel.getMagicDb().getCommonCards().getCard(name); + if(C != null) + startCardsInCommandZone.add(C); + else { + PaperToken T = FModel.getMagicDb().getAllTokens().getToken(name); + if (T != null) startCardsInCommandZone.add(T); + else System.err.print("Can not find card \"" + name + "\"\n"); + } + } } + return startCardsInCommandZone; + } + + public String itemize(Array paperCards) { + StringBuilder ret = new StringBuilder(); + Map duplicateCountMap = Arrays.stream(paperCards.toArray()).collect(Collectors.toMap(Function.identity(), cards -> 1, Math::addExact)); + duplicateCountMap.forEach((key, value) -> ret.append("\n").append(value).append("x ").append(key)); return ret.toString(); } @@ -69,7 +88,9 @@ public class EffectData implements Serializable { if(lifeModifier != 0) description += "[+Life] " + ((lifeModifier > 0) ? "+" : "") + lifeModifier + "\n"; if(startBattleWithCard != null && startBattleWithCard.length != 0) - description+="Cards on battlefield: \n" + cardNames() + "\n"; + description+="Battlefield:" + itemize(startBattleWithCards()) + "\n"; + if(startBattleWithCardInCommandZone != null && startBattleWithCardInCommandZone.length != 0) + description+="Command:" + itemize(startBattleWithCardsInCommandZone()) + "\n"; if(changeStartCards != 0) description+="Starting hand: " + changeStartCards + "\n"; if(moveSpeed!=0 && moveSpeed != 1) diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 5e2772a0070..66b3b82d820 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -167,14 +167,19 @@ public class DuelScene extends ForgeScene { int changeStartCards = 0; int extraManaShards = 0; Array startCards = new Array<>(); + Array startCardsInCommandZone = new Array<>(); for (EffectData data : effects) { lifeMod += data.lifeModifier; changeStartCards += data.changeStartCards; startCards.addAll(data.startBattleWithCards()); + startCardsInCommandZone.addAll(data.startBattleWithCardsInCommandZone()); + extraManaShards += data.extraManaShards; } player.addExtraCardsOnBattlefield(startCards); + player.addExtraCardsInCommandZone(startCardsInCommandZone); + player.setStartingLife(Math.max(1, lifeMod + player.getStartingLife())); player.setStartingHand(player.getStartingHand() + changeStartCards); player.setManaShards((player.getManaShards() + extraManaShards)); diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 879691f6172..804cbf8fcf6 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -230,6 +230,8 @@ public class InventoryScene extends UIScene { } } itemDescription.setText(data.name+"\n"+data.getDescription()); + itemDescription.setWrap(true); + itemDescription.layout(); } diff --git a/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java b/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java index 86057b495d6..b82d3733fa2 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SpellSmithScene.java @@ -358,7 +358,7 @@ public class SpellSmithScene extends UIScene { if (cost_low > -1) totalCost *= 2.5f; //And CMC cost multiplier. cardPool = StreamSupport.stream(P.spliterator(), false).collect(Collectors.toList()); - poolSize.setText(((cardPool.size() > 0 ? "[FOREST]" : "[RED]")) + cardPool.size() + " possible card" + (cardPool.size() != 1 ? "s" : "")); + poolSize.setText(((cardPool.size() > 0 ? "[/][FOREST]" : "[/][RED]")) + cardPool.size() + " possible card" + (cardPool.size() != 1 ? "s" : "")); currentPrice = (int) totalCost; currentShardPrice = (int) (totalCost * 0.2f); //Intentionally rounding up via the cast to int pullUsingGold.setText("Pull: " + currentPrice + "[+gold]"); diff --git a/forge-gui-mobile/src/forge/adventure/stage/OrthogonalTiledMapRendererBleeding.java b/forge-gui-mobile/src/forge/adventure/stage/OrthogonalTiledMapRendererBleeding.java new file mode 100644 index 00000000000..27414c331e9 --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/stage/OrthogonalTiledMapRendererBleeding.java @@ -0,0 +1,282 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.maps.MapGroupLayer; +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.MapLayers; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TiledMapImageLayer; +import com.badlogic.gdx.maps.tiled.TiledMapTile; +import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; +import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; + +import static com.badlogic.gdx.graphics.g2d.Batch.*; + +// https://www.badlogicgames.com/forum/viewtopic.php?t=16368#p74103 +// better solution: render to framebuffer and scale that one? +public class OrthogonalTiledMapRendererBleeding extends OrthogonalTiledMapRenderer { + public OrthogonalTiledMapRendererBleeding(TiledMap map, Batch batch) { + super(map, batch); + } + + @Override + protected void renderMapLayer(MapLayer layer) { + if (layer.isVisible()) { + if (layer instanceof MapGroupLayer) { + MapLayers childLayers = ((MapGroupLayer) layer).getLayers(); + + for (int i = 0; i < childLayers.size(); ++i) { + MapLayer childLayer = childLayers.get(i); + if (childLayer.isVisible()) { + this.renderMapLayer(childLayer); + } + } + } else if (layer instanceof TiledMapTileLayer) { + this.renderTileLayer((TiledMapTileLayer) layer); + } else if (layer instanceof TiledMapImageLayer) { + this.renderImageLayer((TiledMapImageLayer) layer); + } else { + this.renderObjects(layer); + } + + } + } + + @Override + public void renderImageLayer(TiledMapImageLayer layer) { + final Color batchColor = batch.getColor(); + final float color = Color.toFloatBits(batchColor.r, batchColor.g, batchColor.b, batchColor.a * layer.getOpacity()); + + final float[] vertices = this.vertices; + + TextureRegion region = layer.getTextureRegion(); + + if (region == null) { + return; + } + fixBleeding(region); + + final float x = layer.getX(); + final float y = layer.getY(); + final float x1 = x * unitScale; + final float y1 = y * unitScale; + final float x2 = x1 + region.getRegionWidth() * unitScale; + final float y2 = y1 + region.getRegionHeight() * unitScale; + + imageBounds.set(x1, y1, x2 - x1, y2 - y1); + + if (viewBounds.contains(imageBounds) || viewBounds.overlaps(imageBounds)) { + final float u1 = region.getU(); + final float v1 = region.getV2(); + final float u2 = region.getU2(); + final float v2 = region.getV(); + + vertices[X1] = x1; + vertices[Y1] = y1; + vertices[C1] = color; + vertices[U1] = u1; + vertices[V1] = v1; + + vertices[X2] = x1; + vertices[Y2] = y2; + vertices[C2] = color; + vertices[U2] = u1; + vertices[V2] = v2; + + vertices[X3] = x2; + vertices[Y3] = y2; + vertices[C3] = color; + vertices[U3] = u2; + vertices[V3] = v2; + + vertices[X4] = x2; + vertices[Y4] = y1; + vertices[C4] = color; + vertices[U4] = u2; + vertices[V4] = v1; + + batch.draw(region.getTexture(), vertices, 0, NUM_VERTICES); + } + } + + @Override + public void renderTileLayer(TiledMapTileLayer layer) { + final Color batchColor = batch.getColor(); + final float color = Color.toFloatBits(batchColor.r, batchColor.g, batchColor.b, batchColor.a * layer.getOpacity()); + + final int layerWidth = layer.getWidth(); + final int layerHeight = layer.getHeight(); + + final float layerTileWidth = layer.getTileWidth() * unitScale; + final float layerTileHeight = layer.getTileHeight() * unitScale; + + final float layerOffsetX = layer.getRenderOffsetX() * unitScale; + // offset in tiled is y down, so we flip it + final float layerOffsetY = -layer.getRenderOffsetY() * unitScale; + + final int col1 = Math.max(0, (int) ((viewBounds.x - layerOffsetX) / layerTileWidth)); + final int col2 = Math.min(layerWidth, + (int) ((viewBounds.x + viewBounds.width + layerTileWidth - layerOffsetX) / layerTileWidth)); + + final int row1 = Math.max(0, (int) ((viewBounds.y - layerOffsetY) / layerTileHeight)); + final int row2 = Math.min(layerHeight, + (int) ((viewBounds.y + viewBounds.height + layerTileHeight - layerOffsetY) / layerTileHeight)); + + float y = row2 * layerTileHeight + layerOffsetY; + float xStart = col1 * layerTileWidth + layerOffsetX; + final float[] vertices = this.vertices; + + for (int row = row2; row >= row1; row--) { + float x = xStart; + for (int col = col1; col < col2; col++) { + final TiledMapTileLayer.Cell cell = layer.getCell(col, row); + if (cell == null) { + x += layerTileWidth; + continue; + } + final TiledMapTile tile = cell.getTile(); + + if (tile != null) { + final boolean flipX = cell.getFlipHorizontally(); + final boolean flipY = cell.getFlipVertically(); + final int rotations = cell.getRotation(); + + TextureRegion region = tile.getTextureRegion(); + fixBleeding(region); + + float x1 = x + tile.getOffsetX() * unitScale; + float y1 = y + tile.getOffsetY() * unitScale; + float x2 = x1 + region.getRegionWidth() * unitScale; + float y2 = y1 + region.getRegionHeight() * unitScale; + + float u1 = region.getU(); + float v1 = region.getV2(); + float u2 = region.getU2(); + float v2 = region.getV(); + + vertices[X1] = x1; + vertices[Y1] = y1; + vertices[C1] = color; + vertices[U1] = u1; + vertices[V1] = v1; + + vertices[X2] = x1; + vertices[Y2] = y2; + vertices[C2] = color; + vertices[U2] = u1; + vertices[V2] = v2; + + vertices[X3] = x2; + vertices[Y3] = y2; + vertices[C3] = color; + vertices[U3] = u2; + vertices[V3] = v2; + + vertices[X4] = x2; + vertices[Y4] = y1; + vertices[C4] = color; + vertices[U4] = u2; + vertices[V4] = v1; + + if (flipX) { + float temp = vertices[U1]; + vertices[U1] = vertices[U3]; + vertices[U3] = temp; + temp = vertices[U2]; + vertices[U2] = vertices[U4]; + vertices[U4] = temp; + } + if (flipY) { + float temp = vertices[V1]; + vertices[V1] = vertices[V3]; + vertices[V3] = temp; + temp = vertices[V2]; + vertices[V2] = vertices[V4]; + vertices[V4] = temp; + } + if (rotations != 0) { + switch (rotations) { + case TiledMapTileLayer.Cell.ROTATE_90: { + float tempV = vertices[V1]; + vertices[V1] = vertices[V2]; + vertices[V2] = vertices[V3]; + vertices[V3] = vertices[V4]; + vertices[V4] = tempV; + + float tempU = vertices[U1]; + vertices[U1] = vertices[U2]; + vertices[U2] = vertices[U3]; + vertices[U3] = vertices[U4]; + vertices[U4] = tempU; + break; + } + case TiledMapTileLayer.Cell.ROTATE_180: { + float tempU = vertices[U1]; + vertices[U1] = vertices[U3]; + vertices[U3] = tempU; + tempU = vertices[U2]; + vertices[U2] = vertices[U4]; + vertices[U4] = tempU; + float tempV = vertices[V1]; + vertices[V1] = vertices[V3]; + vertices[V3] = tempV; + tempV = vertices[V2]; + vertices[V2] = vertices[V4]; + vertices[V4] = tempV; + break; + } + case TiledMapTileLayer.Cell.ROTATE_270: { + float tempV = vertices[V1]; + vertices[V1] = vertices[V4]; + vertices[V4] = vertices[V3]; + vertices[V3] = vertices[V2]; + vertices[V2] = tempV; + + float tempU = vertices[U1]; + vertices[U1] = vertices[U4]; + vertices[U4] = vertices[U3]; + vertices[U3] = vertices[U2]; + vertices[U2] = tempU; + break; + } + } + } + batch.draw(region.getTexture(), vertices, 0, NUM_VERTICES); + } + x += layerTileWidth; + } + y -= layerTileHeight; + } + } + + public static void fixBleeding(TextureRegion region) { + float fix = 0.01f; + float x = region.getRegionX(); + float y = region.getRegionY(); + float width = region.getRegionWidth(); + float height = region.getRegionHeight(); + float invTexWidth = 1f / region.getTexture().getWidth(); + float invTexHeight = 1f / region.getTexture().getHeight(); + region.setRegion((x + fix) * invTexWidth, (y + fix) * invTexHeight, (x + width - fix) * invTexWidth, (y + height - fix) * invTexHeight); // Trims Region + } + + public void begin() { + beginRender(); + } + + public void end() { + endRender(); + } + + @Override + protected void beginRender() { + super.beginRender(); + } + + @Override + protected void endRender() { + super.endRender(); + } +} diff --git a/forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapRenderer.java b/forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapRenderer.java index fa072d97c5a..d7662186351 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapRenderer.java +++ b/forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapRenderer.java @@ -3,39 +3,36 @@ package forge.adventure.stage; import com.badlogic.gdx.graphics.Camera; import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.tiled.TiledMap; -import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; /** * Custom renderer to render the game stage between the map layers of a tiled map */ -public class PointOfInterestMapRenderer extends OrthogonalTiledMapRenderer { +public class PointOfInterestMapRenderer extends OrthogonalTiledMapRendererBleeding { private final MapStage stage; public PointOfInterestMapRenderer(MapStage stage) { - super(null,stage.getBatch()); + super(null, stage.getBatch()); this.stage = stage; } @Override - public void render () { + public void render() { Camera camera = stage.getCamera(); camera.update(); batch.setProjectionMatrix(camera.combined); beginRender(); for (MapLayer layer : map.getLayers()) { renderMapLayer(layer); - if(layer==stage.getSpriteLayer()) - { + if (layer == stage.getSpriteLayer()) { stage.draw(batch); } } endRender(); } - public void loadMap(TiledMap map,String sourceMap) - { - stage.loadMap(map,sourceMap); + public void loadMap(TiledMap map, String sourceMap) { + stage.loadMap(map, sourceMap); super.setMap(map); } diff --git a/forge-gui-mobile/src/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java index 7b32d8506fd..1ece0b829ba 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Controls.java +++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java @@ -447,7 +447,7 @@ public class Controls { } else { currencyAmount = Current.player().getGold(); - currencyIcon = "[+Gold]"; + currencyIcon = "[+Gold] "; //fix space since gold sprite is wider than a single glyph Current.player().onGoldChange(() -> update(AdventurePlayer.current().getGold(),true)); } label.setText(getLabelText(currencyAmount)); diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 1ffd1bf3a97..54c40b966d1 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -254,7 +254,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb fetcher.fetchImage(reward.getCard().getImageKey(false), this); if (reward.getCard().hasBackFace()) { if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(true))) { - fetcher.fetchImage(reward.getCard().getImageKey(true), this); + fetcher.fetchImage(reward.getCard().getImageKey(true), null); } } } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 6e1473c33ed..9a57dc1f4d5 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -203,6 +203,13 @@ public class CardRenderer { } public static FImageComplex getCardArt(IPaperCard pc, boolean backFace) { + //missing papercard due to configchanges default to forgeart + if (pc == null) + return CardImageRenderer.forgeArt; + //token? + if (pc.getRules() == null) + return getCardArt(pc.getImageKey(backFace), false, false, false, false, false, false, false, false, true); + CardType type = pc.getRules().getType(); return getCardArt(pc.getImageKey(backFace), pc.getRules().getSplitType() == CardSplitType.Split, type.isPlane() || type.isPhenomenon(), pc.getRules().getOracleText().contains("Aftermath"), @@ -828,7 +835,10 @@ public class CardRenderer { else drawManaCost(g, card.getLeftSplitState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize); } else { - drawManaCost(g, card.getCurrentState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize); + ManaCost leftManaCost = card.getLeftSplitState().getManaCost(); + ManaCost rightManaCost = card.getRightSplitState().getManaCost(); + drawManaCost(g, leftManaCost, x - padding, y-(manaSymbolSize/1.5f), w + 2 * padding, h, manaSymbolSize); + drawManaCost(g, rightManaCost, x - padding, y+(manaSymbolSize/1.5f), w + 2 * padding, h, manaSymbolSize); } } } else { diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index 5aef68db0b3..43efb939349 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -242,7 +242,7 @@ public class TransitionScreen extends FContainer { run[0] = true; FThreads.invokeInEdtNowOrLater(runnable); } - }, 2.5f); + }, 2f); } else { if (run[0]) return; diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.fullborder.jpg new file mode 100644 index 00000000000..7801051c469 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.png deleted file mode 100644 index beedb8ac146..00000000000 Binary files a/forge-gui/res/adventure/Shandalar/custom_card_pics/Cursed Treasure.png and /dev/null differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.fullborder.jpg new file mode 100644 index 00000000000..dc833c8d119 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.png deleted file mode 100644 index 01c5db34a99..00000000000 Binary files a/forge-gui/res/adventure/Shandalar/custom_card_pics/Farmer's Tools.png and /dev/null differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Boss Effect Phase One.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Boss Effect Phase One.fullborder.jpg new file mode 100644 index 00000000000..86ad0faf93d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Boss Effect Phase One.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Boss Effect Phase Two.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Boss Effect Phase Two.fullborder.jpg new file mode 100644 index 00000000000..65c93009060 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Boss Effect Phase Two.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Mighty Axe.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Mighty Axe.fullborder.jpg new file mode 100644 index 00000000000..14984485033 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Garruk's Mighty Axe.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.fullborder.jpg new file mode 100644 index 00000000000..325370d4661 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.png deleted file mode 100644 index ba7778c612b..00000000000 Binary files a/forge-gui/res/adventure/Shandalar/custom_card_pics/Hill Giant Club.png and /dev/null differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Jace's Signature Hoodie.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Jace's Signature Hoodie.fullborder.jpg index ee83d0863fc..92e426e13df 100644 Binary files a/forge-gui/res/adventure/Shandalar/custom_card_pics/Jace's Signature Hoodie.fullborder.jpg and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Jace's Signature Hoodie.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Kiora's Bident.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Kiora's Bident.fullborder.jpg new file mode 100644 index 00000000000..da271215126 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Kiora's Bident.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Nahiri Boss Effect.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Nahiri Boss Effect.fullborder.jpg new file mode 100644 index 00000000000..9283da1c16f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Nahiri Boss Effect.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Nahiri's Armory.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Nahiri's Armory.fullborder.jpg new file mode 100644 index 00000000000..b5b62c4950f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Nahiri's Armory.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.fullborder.jpg new file mode 100644 index 00000000000..7956d3ea1c1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.png deleted file mode 100644 index 3e4030d49b5..00000000000 Binary files a/forge-gui/res/adventure/Shandalar/custom_card_pics/Piper's Charm.png and /dev/null differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.fullborder.jpg new file mode 100644 index 00000000000..f0fcf0589a0 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.png b/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.png deleted file mode 100644 index c080cf94a11..00000000000 Binary files a/forge-gui/res/adventure/Shandalar/custom_card_pics/Sleep Wand.png and /dev/null differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Slimefoot Boss Effect.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Slimefoot Boss Effect.fullborder.jpg new file mode 100644 index 00000000000..4f3d9ad4337 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Slimefoot Boss Effect.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Slimefoot's Slimy Staff.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Slimefoot's Slimy Staff.fullborder.jpg new file mode 100644 index 00000000000..e8378f89128 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Slimefoot's Slimy Staff.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_card_pics/Teferi's Staff.fullborder.jpg b/forge-gui/res/adventure/Shandalar/custom_card_pics/Teferi's Staff.fullborder.jpg new file mode 100644 index 00000000000..9809bff2196 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/custom_card_pics/Teferi's Staff.fullborder.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt b/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt index f230c847d32..f68690da32d 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/cursed_treasure.txt @@ -1,8 +1,7 @@ Name:Cursed Treasure ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Description$ Provided by Cursed Treasure (Equipped Item - Right) -StackDescription$ Create a Treasure token. You lose 2 life. | SpellDescription$ Create a Treasure token. You lose 2 life. -A:AB$ Token | Cost$ PayShards<1> Sac<1/CARDNAME> | TokenScript$ c_a_treasure_sac | SubAbility$ DBLoseLife2 | SpellDescription$ Create a Treasure token. -SVar:DBLoseLife2:DB$ LoseLife | LifeAmount$ 2 | Defined$ You -Oracle: Provided by Cursed Treasure. Pay {M}, sacrifice Cursed Treasure: Create a Treasure token. You lose 2 life. \ No newline at end of file +A:AB$ Token | Cost$ PayShards<1> | ActivationZone$ Command | TokenScript$ c_a_treasure_sac | SubAbility$ DBLoseLife | ActivationLimit$ 1 | SpellDescription$ Create a Treasure token. You lose 2 life, Exile Cursed Treasure. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ You | SubAbility$ Eject +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:{M}: Create a Treasure token. You lose 2 life, Exile Cursed Treasure. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt b/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt index aaa555d121b..ceed89f38c1 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/farmers_tools.txt @@ -1,6 +1,7 @@ Name:Farmer's Tools ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Description$ Provided by Farmer's Tools (Equipped Item - Left) -A:AB$ ChangeZone | Cost$ PayShards<2> Sac<1/CARDNAME> | ExileOnMoved$ Battlefield | Optional$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | StackDescription$ Each player may put a land card from their hand onto the battlefield. -Oracle: Provided by Farmer's Tools. Pay {M}{M}, sacrifice Farmer's Tools: Starting with you, each player may place a land card from their hand onto the battlefield. \ No newline at end of file +A:AB$ RepeatEach | Cost$ PayShards<2> | ActivationZone$ Command | RepeatSubAbility$ DBChangeZone | RepeatPlayers$ Player | SubAbility$ Eject | StartingWithActivator$ True | SpellDescription$ Starting with you, each player may put a land card from their hand onto the battlefield. Exile Farmer's Tools. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ 1 | Hidden$ True +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:{M}{M}: Starting with you, each player may put a land card from their hand onto the battlefield. Exile Farmer's Tools. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/garruk_boss_effect_phaseone.txt b/forge-gui/res/adventure/Shandalar/custom_cards/garruk_boss_effect_phaseone.txt new file mode 100644 index 00000000000..1fd280d5052 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/garruk_boss_effect_phaseone.txt @@ -0,0 +1,12 @@ +Name:Garruk's Boss Effect Phase One +ManaCost:no cost +Types:Enchantment +S:Mode$ ReduceCost | ValidCard$ Beast,Garruk | EffectZone$ Command | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Beast and Garruk spells you cast cost {1} less. +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | Execute$ TrigPutCounter | TriggerZones$ Command | TriggerDescription$ Whenever an opponent casts a noncreature spell, put an prey counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ Prey +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | IsPresent$ Card.Self+counters_GE5_PREY | PresentZone$ Command | Execute$ TrigConjure | TriggerDescription$ At the beginning of your upkeep, if there are 5 or more Prey counters on CARDNAME, conjure one of Garruk's beasts unto the battlefield under your control. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | Zone$ Battlefield | AtRandom$ True | Spellbook$ Garruk's Companion,Garruk's Gorehorn,Garruk's Harbinger,Garruk's Horde,Garruk's Packleader,Garruk's Warsteed,Briarpack Alpha,Mist Leopard,Predatory Wurm,Primal Huntbeast +R:Event$ GameLoss | ActiveZones$ Command | ValidPlayer$ You | ReplaceWith$ ExileSetLife | Description$ If Garruk would be defeated, instead exile CARDNAME and Garruk's life total becomes 40. Activate Phase 2 +SVar:ExileSetLife:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self | SubAbility$ DBSetLife +SVar:DBSetLife:DB$ SetLife | Defined$ You | LifeAmount$ 40 +Oracle:Beast and Garruk spells you cast cost {1} less.\nWhenever an opponent casts a noncreature spell, put an prey counter on Garruk Boss Effect, Phase One.\nAt the beginning of your upkeep, if there are 5 or more Prey counters on Garuk Boss Effect, Phase One, conjure one of Garruk's beasts unto the battlefield under your control.\nIf Garruk would be defeated, instead exile Garruk Boss Effect, Phase One and Garruk's life total becomes 40. Activate Phase 2 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/garruk_boss_effect_phasetwo.txt b/forge-gui/res/adventure/Shandalar/custom_cards/garruk_boss_effect_phasetwo.txt new file mode 100644 index 00000000000..4fa17d26c14 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/garruk_boss_effect_phasetwo.txt @@ -0,0 +1,16 @@ +Name:Garruk's Boss Effect Phase Two +ManaCost:no cost +Types:Enchantment +S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Self | AffectedZone$ Command | RemoveAllAbilities$ True | IsPresent$ Card.namedGarruk's Boss Effect Phase One | PresentZone$ Command | PresentCompare$ EQ1 +S:Mode$ Continuous | EffectZone$ Command | Affected$ Forest.YouCtrl | AddType$ Swamp | Description$ Each Forest you control is a Swamp in addition to its other land types. +S:Mode$ Continuous | Affected$ Beast.YouCtrl | AddPower$ 3 | AddToughness 3 | AddKeyword$ Trample & Deathtouch | Description$ Beast creatures you control get +3/+3 and have trample and Deathtouch +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | PresentZone$ Command | Execute$ TrigConjure | TriggerDescription$ At the beginning of your upkeep, conjure a card of Garruk Phase 2's Spellbook into your hand. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | Zone$ Hand | AtRandom$ True | Spellbook$ Garruk; Apex Predator,Garruk; Cursed Huntsman,Garruk Relentless,In Garruk's Wake,Rampaging Baloths,Manglehorn,Elder Gargaroth,Gemrazer,Thragtusk,Sawtusk Demolisher,Avenger of Zendikar,Soul of the Harvest,Kogla;the Titan Ape,Terastodon,Bane of Progress +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Player.Opponent | Execute$ DBEffect | TriggerZones$ Command | TriggerDescription$ Whenever an opponent casts a noncreature spell,perpetually increase the power and toughness of creatures you control and creature cards in your hand, library, and graveyard by 1. +SVar:DBEffect:DB$ Effect | RememberObjects$ Valid Creature.YouCtrl,ValidHand Creature.YouOwn,ValidGraveyard Creature.YouOwn,ValidLibrary Creature.YouOwn | StaticAbilities$ PerpetualP1P1 | Name$ Garruk's Rage Effect | Duration$ Permanent +SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ At the beginning of your end step, creatures you control and creature cards in your hand, library, and graveyard perpetually get +1/+1. +SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate +SVar:DBUpdate:DB$ UpdateRemember +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigReanimate | TriggerDescription$ At the beginning of your end step, return a random creature card from your graveyard to the battlefield. It gains "If this creature would leave the battlefield, exile it instead". +SVar:TrigReanimate:DB$ ChangeZone | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | Hidden$ True | Origin$ Graveyard | AtRandom$ True | Destination$ Battlefield | LeaveBattlefield$ Exile +Oracle:Each Forest you control is a Swamp in addition to its other land types.\nBeast creatures you control get +3/+3 and have trample and Deathtouch\nAt the beginning of your upkeep, conjure a card of Garruk spellbook into your hand.\nWhenever an opponent casts a noncreature spell, perpetually increase the power and toughness of creatures you control and creature cards in your hand, library, and graveyard by 1. At the beginning of your end step, return a random creature card from your graveyard to the battlefield. That creature gains "If this creature would leave the battlefield, exile it instead". \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/garruks_mighty_axe.txt b/forge-gui/res/adventure/Shandalar/custom_cards/garruks_mighty_axe.txt new file mode 100644 index 00000000000..e3b1e230ab0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/garruks_mighty_axe.txt @@ -0,0 +1,9 @@ +Name:Garruk's Mighty Axe +ManaCost:no cost +Types:Artifact Equipment +S:Mode$ ReduceCost | ValidCard$ Creature.powerGE4,Garruk | EffectZone$ Command | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Garruk and green creature spells you cast with power 4 or greater cost {1} less to cast. +S:Mode$ Continuous | Affected$ Planeswalker.YouCtrl+Garruk | EffectZone$ Command | AddAbility$ PWWolf | Description$ Garruk planeswalkers you control have "[0]: Create a 2/2 black and green Wolf creature token with "When this creature dies, put a loyalty counter on each Garruk you control."" +SVar:PWWolf:AB$ Token | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ bg_2_2_wolf_garruk | TokenOwner$ You | SpellDescription$ Create a 2/2 black and green Wolf creature token with "When this creature dies, put a loyalty counter on each Garruk you control." +A:AB$ MakeCard | Cost$ G G PayShards<2> | Conjure$ True | ActivationLimit$ 1 | Zone$ Battlefield | ActivationZone$ Command | AtRandom$ True | SubAbility$ Eject | Spellbook$ Garruk's Companion,Garruk's Gorehorn,Garruk's Harbinger,Garruk's Horde,Garruk's Packleader,Garruk's Warsteed,Briarpack Alpha,Mist Leopard,Predatory Wurm,Primal Huntbeast | SpellDescription$ Conjure one of Garruk's Beast unto the battlefield unto your control. Activate this ability only once each game. Exile CARDNAME. +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:Garruk and green creature spells you cast with power 4 or greater cost {1} less to cast.\nGarruk planeswalkers you control have "[0]: Create a 2/2 black and green Wolf creature token with "When this creature dies, put a loyalty counter on each Garruk you control.""\n{M}{M},{G}{G}:Conjure one of Garruk's Beast unto the battlefield unto your control. Activate this ability only once each game. Exile Garruk's Mighty Axe \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt b/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt index f01e05754ab..5744565f89b 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/hill_giant_club.txt @@ -1,10 +1,7 @@ Name:Hill Giant Club ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Description$ Provided by Hill Giant Club (Equipped Item - Right) -A:AB$ Effect | Cost$ PayShards<2> Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ExileOnMoved$ Battlefield | StaticAbilities$ UnblockableLE2 | RememberObjects$ Targeted | StackDescription$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. | SpellDescription$ Targe creature can't be blocked by creatures with power 2 or less this turn. +A:AB$ Effect | Cost$ PayShards<2> | ActivationZone$ Command | ActivationLimit$ 1 | SubAbility$ Eject | ValidTgts$ Creature | StaticAbilities$ UnblockableLE2 | RememberObjects$ Targeted | SpellDescription$ Target creature can't be blocked by creatures with power 2 or less this turn. Exile Hill Giant Club SVar:UnblockableLE2:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | ValidBlocker$ Creature.powerLE2 | Description$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. -Oracle: Provided by Hill Giant Club. Pay {M}{M}, sacrifice Hill Giant Club: Target creature can't be blocked by creatures with power 2 or less this turn. - - - +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:{M}{M}: Target creature can't be blocked by creatures with power 2 or less this turn. Exile Hill Giant Club \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/jace_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/jace_boss_effect.txt index 74e155e3b20..4ce706d74ab 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/jace_boss_effect.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/jace_boss_effect.txt @@ -2,7 +2,7 @@ Name:Jace Boss Effect ManaCost:no cost Colors:Blue Types:Enchantment -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your end step, conjure a duplicate of a random creature card from your opponent's library unto the battlefield under your control. The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2 and has "When this creature becomes the target of a spell or ability, sacrifice it." +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigChoose | TriggerDescription$ At the beginning of your end step, conjure a duplicate of a random creature card from your opponent's library unto the battlefield under your control. The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2 and has "When this creature becomes the target of a spell or ability, sacrifice it." SVar:TrigChoose:DB$ ChooseCard | Choices$ Creature.OppCtrl | ChoiceZone$ Library | AtRandom$ True | SubAbility$ DBConjure SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ChosenCard | Zone$ Battlefield | RememberMade$ True | SubAbility$ DBClearChosen SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True | SubAbility$ DBEffect diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/jaces_signature_hoodie.txt b/forge-gui/res/adventure/Shandalar/custom_cards/jaces_signature_hoodie.txt index 65aeea71d4e..2c752a39c3a 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/jaces_signature_hoodie.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/jaces_signature_hoodie.txt @@ -2,9 +2,12 @@ Name:Jace's Signature Hoodie ManaCost:no cost Colors:Blue Types:Enchantment -A:AB$ ChooseCard | Cost$ PayShards<2> Exile<1/CARDNAME> | Choices$ Creature.OppCtrl | ChoiceZone$ Library | AtRandom$ True | SubAbility$ DBConjure | SpellDescription$ Conjure a duplicate of a random creature card from your opponent's library unto the battlefield under your control. The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2. +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you draw a card, each opponent mills a card. +SVar:TrigMill:DB$ Mill | Defined$ Opponent | NumCards$ 1 +A:AB$ ChooseCard | Cost$ PayShards<2> | ActivationZone$ Command | ActiviationChoices$ Creature.OppCtrl | Choices$ Creature.OppOwn | ChoiceZone$ Library | AtRandom$ True | SubAbility$ DBConjure | SpellDescription$ Conjure a duplicate of a random creature card from your opponent's library unto the battlefield under your control. The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2. Exile Jace's Signature Hoodie. SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ChosenCard | Zone$ Battlefield | RememberMade$ True | SubAbility$ DBClearChosen SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Name$ Jace's Signature Hoodie's Perpetual Effect -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | SetPower$ 2 | SetToughness$ 2 | RemoveCardTypes$ True | SetColor$ Blue | AddType$ Creature & Illusion | Description$ That duplicate perpetually has base power and toughness 2/2 and becomes an Illusion creature. -Oracle:Provided by Jace's Signature Hoodie\n{M}{M}, Exile Jace's Signature Hoodie: Conjure a duplicate of a random creature card from your opponent's library unto the battlefield under your control. The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2. \ No newline at end of file +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Name$ Jace's Signature Hoodie's Perpetual Effect | SubAbility$ Eject +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | SetPower$ 2 | SetToughness$ 2 | RemoveCardTypes$ True | SetColor$ Blue | AddType$ Creature & Illusion | Description$ The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2 +Oracle:Whenever you draw a card, each opponent mills a card.\n{M}{M}: Conjure a duplicate of a random creature card from your opponent's library unto the battlefield under your control. The duplicate perpetually becomes a blue Illusion creature with base power and toughness 2/2. Exile Jace's Signature Hoodie \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/kioras_bident.txt b/forge-gui/res/adventure/Shandalar/custom_cards/kioras_bident.txt new file mode 100644 index 00000000000..40dc9cbb560 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/kioras_bident.txt @@ -0,0 +1,7 @@ +Name:Kiora's Bident +ManaCost:no cost +Types:Artifact Equipment +S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Crab.YouCtrl,Kraken.YouCtrl,Serpent.YouCtrl,Leviathan.YouCtrl,Octopus.YouCtrl | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Kraken, Leviathan, Octopus, Crab and Serpent spells you cast cost {1} less. +A:AB$ MakeCard | Cost$ U G PayShards<2> | Conjure$ True | ActivationLimit$ 1 | Zone$ Hand | ActivationZone$ Command | AtRandom$ True | SubAbility$ Eject | Spellbook$ Kiora; Behemoth Beckoner,Kiora;Master of the Depths,Kiora; the Crashing Wave,Kiora; the Tide's Fury | SpellDescription$ Conjure a random Kiora planeswalker card into your hand. Exile Kiora's Bident. +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:Kraken, Leviathan, Octopus, Crab and Serpent spells you cast cost {1} less.\n {M}{M}, {U}{G}:Conjure a random Kiora planeswalker card into your hand. Exile Kiora's Bident \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt new file mode 100644 index 00000000000..4ae7057d5f0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt @@ -0,0 +1,7 @@ +Name:Nahiri's Armory +ManaCost:no cost +Types:Artifact +S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ You | Amount$ 1 | EffectZone$ Command | Description$ Equip costs you pay cost {1} less. +T:Mode$ AttackersDeclared | ValidAttackers$ Creature.modified+YouCtrl | TriggerZones$ Command | Execute$ TrigConjure | TriggerDescription$ Whenever a modified creature you control attacks, you may pay {M}{M}, if you do conjure a random card from Nahiri's Armory's Spellbook into your hand. +SVar:TrigConjure:AB$ MakeCard | Cost$ PayShards<2> | Conjure$ True | AtRandom$ True | Zone$ Hand | Spellbook$ Stoneforge Mystic,Danitha; Benalia's Hope,Ardenn; Intrepid Archaeologist,Open the Armory,Stone Haven Outfitter,Argentum Armor,Sword of the Animist,Masterwork of Ingenuity,Kaldra Compleat,Armored Skyhunter,Lion Sash,Relic Seeker,Esper Sentinel,Forgeborn Phoenix,Foundry Beetle,Inchblade Companion,Komainu Battle Armor,Luxior; Giada's Gift,Mace of Disruption,Nettlecyst,Shadowspear,Seraphic Greatsword,Soulstealer Axe,Sword of Body and Mind,Sword of Fire and Ice,Junkyard Scrapper,Soulstealer AxeSword of Feast and Famine,Expedition Supplier,Foundry Beetle,Armory Automaton,Bladegraft Aspirant,Dancing Sword,Jor Kadeen; First Goldwarden,Akiri; Fearless Voyager,Acclaimed Contender,Embercleave,Puresteel Paladin,Champion of the Flame,Tiana; Ship's Caretaker,Reyav; Master Smith,Sigarda's Aid,Armored Skyhunter,Bruenor Battlehammer,Halvar; God of Battle,Wyleth; Soul of Steel,Koll; the Forgemaster,Valduk; Keeper of the Flame,Fervent Champion,Cloudsteel Kirin,Leonin Shikari,Balan; Wandering Knight,Kor Duelist,Leonin Abunas,Zamriel; Seraph of Steel,Auriok Steelshaper +Oracle:Equip costs you pay cost {1} less.\nWhenever a modified creature you control attacks, you may pay {M}{M}, if you do conjure a random card from Nahiri's Armory's Spellbook into your hand. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt new file mode 100644 index 00000000000..41d868a7d31 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt @@ -0,0 +1,10 @@ +Name:Nahiri Boss Effect +ManaCost:no cost +Types:Enchantment +S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ You | Amount$ 1 | EffectZone$ Command | Description$ Equip costs you pay cost {1} less. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Secondary$ True | Execute $ TrigConjure | TriggerDescription$ At the beginning of your upkeep or when an equipped creature you control attacks, conjure a card from Nahiri's Spellbook into your hand. +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl+equipped | TriggerZones$ Command | Execute$ TrigConjure | TriggerDescription$ At the beginning of your upkeep or when an equipped creature you control attacks, conjure a card from Nahiri's Spellbook into your hand. +SVar:TrigConjure:DB$ MakeCard | Zone$ Hand | Conjure$ True | AtRandom$ True | Spellbook$ Stoneforge Mystic,Danitha; Benalia's Hope,Ardenn, Intrepid Archaeologist,Open the Armory,Stone Haven Outfitter,Argentum Armor,Sword of the Animist,Masterwork of Ingenuity,Kaldra Compleat,Armored Skyhunter,Lion Sash,Relic Seeker,Esper Sentinel,Forgeborn Phoenix,Foundry Beetle,Inchblade Companion,Komainu Battle Armor,Luxior;Giada's Gift,Mace of Disruption,Nettlecyst,Shadowspear,Seraphic Greatsword,Soulstealer Axe,Sword of Body and Mind,Sword of Fire and Ice,Junkyard Scrapper,Soulstealer Axe,Sword of Feast and Famine,Expedition Supplier,Foundry Beetle,Armory Automaton,Bladegraft Aspirant,Dancing Sword,Jor Kadeen; First Goldwarden,Akiri; Fearless Voyager,Acclaimed Contender,Embercleave,Puresteel Paladin,Champion of the Flame,Tiana; Ship's Caretaker,Reyav; Master Smith,Sigarda's Aid,Armored Skyhunter,Bruenor Battlehammer,Halvar; God of Battle,Wyleth; Soul of Steel,Koll; the Forgemaster,Valduk; Keeper of the Flame,Fervent Champion,Cloudsteel Kirin,Leonin Shikari,Balan, Wandering Knight,Kor Duelist,Leonin Abunas,Zamriel, Seraph of Steel,Auriok Steelshaper +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, create a 1/1 white Kor Soldier creature token +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_kor_soldier +Oracle:Equip costs you pay cost {1} less.\nAt the beginning of your upkeep or whenever an equipped creature you control attacks, conjure a card from Nahiri's Spellbook into your hand\nAt the beginning of your end step, create a 1/1 white Kor Soldier creature token. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/pipers_charm.txt b/forge-gui/res/adventure/Shandalar/custom_cards/pipers_charm.txt index 3cc5ab5c7fb..b426f60201d 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/pipers_charm.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/pipers_charm.txt @@ -1,7 +1,7 @@ Name:Piper's Charm ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Description$ Provided by Piper's Charm (Equipped Item - Neck) -A:AB$ Effect | Cost$ PayShards<3> Sac<1/CARDNAME> | ValidTgts$ Creature | ExileOnMoved$ Battlefield | StaticAbilities$ MustBlock | RememberObjects$ Targeted | StackDescription$ {c:Targeted} blocks this turn if able. | SpellDescription$ Target creature blocks this turn if able. +A:AB$ Effect | Cost$ PayShards<3> | ActivationZone$ Command | SubAbility$ Eject | ValidTgts$ Creature | StaticAbilities$ MustBlock | RememberObjects$ Targeted | StackDescription$ {c:Targeted} blocks this turn if able. | SpellDescription$ Target creature blocks this turn if able. Exile CARDNAME. SVar:MustBlock:Mode$ MustBlock | ValidCreature$ Card.IsRemembered | Description$ This creature blocks this turn if able. -Oracle: Provided by Piper's Charm. Pay {M}{M}{M}, sacrifice Piper's Charm: Target creature blocks this turn if able. \ No newline at end of file +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:{M}{M}{M}: Target creature blocks this turn if able. Exile Piper's Charm diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt b/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt index 3af0901add6..48c4075603a 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/sleep_wand.txt @@ -1,6 +1,6 @@ Name:Sleep Wand ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Description$ Provided by Sleep Wand (Equipped Item - Left) -A:AB$ PutCounter | Cost$ PayShards<2> Sac<1/CARDNAME> | ValidTgts$ Creature | ExileOnMoved$ Battlefield ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ Stun | CounterNum$ 1 | StackDescription$ Put a stun counter on target creature. (If a permanent with a stun counter would become untapped, remove one from it instead.) -Oracle: Provided by Sleep Wand. Pay {M}, sacrifice Sleep Wand: Put a stun counter on target creature. \ No newline at end of file +A:AB$ PutCounter | Cost$ PayShards<2> | ActivationZone$ Command | ActivationLimit$ 1 | SubAbility$ Eject | ValidTgts$ Creature | CounterType$ Stun | CounterNum$ 1 | SpellDescription$ Put a stun counter on target creature. (If a permanent with a stun counter would become untapped, remove one from it instead.). Exile CARDNAME +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:{M}:Put a stun counter on target creature. Exile Sleep Wand \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/slime_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/slime_boss_effect.txt index b5e9683b8d8..9b3cc0baec7 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/slime_boss_effect.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/slime_boss_effect.txt @@ -2,10 +2,10 @@ Name:Slime Boss Effect ManaCost:no cost Colors:black,green Types:Enchantment -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPut | TriggerDescription$ At the beginning of your upkeep, put a slime counter on CARDNAME, then each opponent conjures X cards named Blasted Landscape into their library, where X is the amount of slime counters on CARDNAME. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigPut | TriggerDescription$ At the beginning of your upkeep, put a slime counter on CARDNAME, then each opponent conjures X cards named Blasted Landscape into their library, where X is the amount of slime counters on CARDNAME. SVar:TrigPut:DB$ PutCounter | Defined$ Self | CounterType$ SLIME | CounterNum$ 1 | SubAbility$ DBGunk SVar:DBGunk:DB$ MakeCard | Defined$ Opponent | Name$ Blasted Landscape | Zone$ Library | Amount$ X | Conjure$ True -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigGainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, you gain 2 life. +T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigGainLife | TriggerZones$ Command | TriggerDescription$ Whenever a player cycles a card, you gain 2 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 2 SVar:X:Count$CardCounters.SLIME Oracle:At the beginning of your upkeep, put a slime counter on Slime Boss Effect, then each opponent conjures X cards named Blasted Landscape into their library, where X is the amount of slime counters on Slime Boss Effect.\nWhenever a player cycles a card, you gain 2 life. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/slimefoots_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/slimefoots_boss_effect.txt new file mode 100644 index 00000000000..02b810b8628 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/slimefoots_boss_effect.txt @@ -0,0 +1,11 @@ +Name:Slimefoot's Boss Effect +ManaCost:no cost +Colors:black,green +Types:Enchantment +S:Mode$ Continuous | Affected$ Forest,Saproling | SetPower$ 1 | SetToughness$ 1 | EffectZone$ Command | AddType$ Land & Creature & Forest & Saproling | SetColor$ Green | Description$ All Forests and all Saprolings are 1/1 green Saproling creatures and Forest lands in addition to their other types. (They're affected by summoning sickness.) +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Command | Execute$ TrigToken | TriggerDescription$ Whenever a creature dies, that creature's controller creates a 1/1 green Saproling creature token. +SVar:TrigToken:DB$ Token | TokenOwner$ TriggeredCardController | TokenAmount$ 1 | TokenScript$ g_1_1_saproling +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Saproling | TriggerZones$ Command | Execute$ TrigDealDamage | TriggerDescription$ Whenever a Saproling dies, Slimefoot deals 1 damage to each opponent and you gain 1 life. +SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +Oracle:Whenever a Saproling dies, Slimefoot deals 1 damage to each opponent and gains 1 life.\nAll Forests and all Saprolings are 1/1 green Saproling creatures and Forest lands in addition to their other types. (They’re affected by summoning sickness.)\nWhenever a creature dies, that creature's controller creates a 1/1 green Saproling creature token.\n diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/slimefoots_slimy_staff.txt b/forge-gui/res/adventure/Shandalar/custom_cards/slimefoots_slimy_staff.txt new file mode 100644 index 00000000000..9eb740fdffd --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/slimefoots_slimy_staff.txt @@ -0,0 +1,8 @@ +Name:Slimefoot's Slimy Staff +ManaCost:no cost +Colors:black,green +Types:Artifact Equipment +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a spore counter on each fungus you control. +SVar:TrigPutCounter:DB$ PutCounterAll | ValidCards$ Fungus.YouCtrl | CounterType$ SPORE | CounterNum$ 1 +A:AB$ MakeCard | Cost$ G PayShards<2> | Name$ Bayou | ActivationZone$ Command | Zone$ Hand | IsPresent$ Land.YouOwn | PresentZone$ Hand | PresentCompare$ EQ0 | GameActivationLimit$ 1 | SpellDescription$ Conjure a card named Bayou into your hand. Activate only if there are no land cards in your hand and only once each game. +Oracle:At the beginning of your end step, put a spore counter on each fungus you control.\n{M}{M},{G}:Conjure a card named Bayou into your hand. Activate only if there are no land cards in your hand and only once each game. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/teferis_staff.txt b/forge-gui/res/adventure/Shandalar/custom_cards/teferis_staff.txt new file mode 100644 index 00000000000..98102c173c1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/custom_cards/teferis_staff.txt @@ -0,0 +1,8 @@ +Name:Teferi's Staff +ManaCost:no cost +Types:Artifact Equipment +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigUntap | TriggerDescription$ At the beginning of your end step, untap target artifact or land you control. +SVar:TrigUntap:DB$ Untap | ValidTgts$ Artifact.YouCtrl,Land.YouCtrl | TgtPrompt$ Select target artifact or land you control +A:AB$ Phases | Cost$ U W PayShards<2> | ValidTgts$ Permanent | SubAbility$ Eject | ActivationZone$ Command | SpellDescription$ Target permanent phases out. (Treat it and anything attached to it as though they don't exist until its controllers's next turn.) +SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:At the beginning of your end step, untap target artifact or land you control.\n{M}{M}, {U{W}: Target permanent phases out. (Treat it and anything attached to it as though they don't exist until its controllers's next turn.). Exile Teferi's Staff. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/decks/armored_knight.dck b/forge-gui/res/adventure/Shandalar/decks/armored_knight.dck new file mode 100644 index 00000000000..488e90cd0a2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/armored_knight.dck @@ -0,0 +1,51 @@ +[metadata] +Name=armored_knight +[Avatar] + +[Main] +1 Acclaimed Contender|ELD|1 +1 Adeline, Resplendent Cathar|MID|1 +1 Armored Skyhunter|CMR|1 +1 Basilisk Collar|CLB|1 +1 Benalish Marshal|DOM|1 +4 Clifftop Retreat|DOM|1 +1 Colossus Hammer|GN3|1 +1 Danitha Capashen, Paragon|CMR|1 +1 Embercleave|ELD|1 +3 Fervent Champion|ELD|1 +1 Furycalm Snarl|ONC|1 +1 Glimmer Lens|ONC|1 +1 Hero of Bladehold|MBS|1 +1 History of Benalia|DOM|1 +1 Inspiring Veteran|ELD|1 +1 Kemba's Banner|ONC|1 +1 Kinsbaile Cavalier|DDG|1 +1 Knight Exemplar|SLD|2 +1 Loxodon Warhammer|CM2|1 +1 Mace of the Valiant|ONC|1 +1 Maul of the Skyclaves|ONC|1 +4 Mountain|BRO|3 +3 Novice Knight|M19|1 +7 Plains|BRO|3 +4 Plateau|OLGC|1 +3 Puresteel Paladin|2XM|1 +4 Sacred Foundry|GRN|1 +1 Shadowspear|THB|1 +1 Shining Armor|MB1|1 +1 Sword of Vengeance|GN3|1 +1 The Circle of Loyalty|ELD|1 +1 The Reaver Cleaver|DMC|1 +1 Thran Power Suit|BRO|1 +1 Trailblazer's Boots|ONC|1 +1 Valiant Endeavor|AFC|1 +1 Varchild, Betrayer of Kjeldor|C18|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/crab.json b/forge-gui/res/adventure/Shandalar/decks/crab.json new file mode 100644 index 00000000000..56a7d1a5522 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/crab.json @@ -0,0 +1,12 @@ +{ +"name":"Crab", + "template": + { + "count":60, + "colors":["Blue"], + "tribe":"Crab", + "tribeCards":1.0, + "tribeSynergyCards":0.2, + "rares":0.4 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/disciple_of_teferi.dck b/forge-gui/res/adventure/Shandalar/decks/disciple_of_teferi.dck new file mode 100644 index 00000000000..b9b36ed75de --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/disciple_of_teferi.dck @@ -0,0 +1,42 @@ +[metadata] +Name=disciple_of_teferi +[Avatar] + +[Main] +2 Arcane Denial|CMA|1 +2 Brainstorm|SLD|1 +1 Denry Klin, Editor in Chief|NCC|1 +1 Elsha of the Infinite|2X2|1 +4 Flooded Strand|KTK|1 +1 Grand Arbiter Augustin IV|2X2|1 +1 Ishai, Ojutai Dragonspeaker|CM2|1 +2 Island|DMU|4 +2 Ivory Tower|VMA|1 +2 Ledger Shredder|SNC|1 +3 Lightning Bolt|CLB|1 +1 Loran of the Third Path|BRO|1 +1 Magnanimous Magistrate|J22|1 +4 Monastery Mentor|FRF|1 +1 Mountain|DMU|4 +1 Oji, the Exquisite Blade|CLB|1 +3 Plains|DMU|4 +4 Plateau|30A|1 +4 Raugrin Triome|IKO|1 +2 Revitalize|M21|1 +2 Rhox Faithmender|JMP|1 +4 Serra Ascendant|IMA|1 +1 Shu Yun, the Silent Tempest|FRF|1 +3 Swords to Plowshares|DMR|1 +3 The Archimandrite|BRC|1 +4 Tundra|30A|1 +1 Volcanic Island|30A|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/fox.json b/forge-gui/res/adventure/Shandalar/decks/fox.json new file mode 100644 index 00000000000..f66ad77c6d7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/fox.json @@ -0,0 +1,12 @@ +{ +"name":"Fox", + "template": + { + "count":60, + "colors":["White"], + "tribe":"Fox", + "tribeCards":0.5, + "tribeSynergyCards":0.2, + "rares":0.2 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/crab.dck b/forge-gui/res/adventure/Shandalar/decks/giant_crab.dck similarity index 100% rename from forge-gui/res/adventure/Shandalar/decks/crab.dck rename to forge-gui/res/adventure/Shandalar/decks/giant_crab.dck diff --git a/forge-gui/res/adventure/Shandalar/decks/illusion.dck b/forge-gui/res/adventure/Shandalar/decks/illusion.dck index c789a0d3d83..4dacc71c737 100644 --- a/forge-gui/res/adventure/Shandalar/decks/illusion.dck +++ b/forge-gui/res/adventure/Shandalar/decks/illusion.dck @@ -3,12 +3,13 @@ Name=illusion [Avatar] [Main] +3 Chart a Course|XLN|1 1 Ephemeron|VMA|1 23 Island|KLD|3 -2 Krovikan Mist|CSP|1 +4 Krovikan Mist|CSP|1 2 Labyrinth Guardian|MB1|1 4 Lord of the Unreal|M12|1 -4 Minn, Wily Illusionist|AFC|1 +2 Minn, Wily Illusionist|AFC|1 1 Mordenkainen|AFR|1 2 Oneirophage|MH1|1 4 Phantasmal Bear|A25|1 @@ -18,7 +19,6 @@ Name=illusion 1 Phantom Beast|M11|1 2 Phantom Steed|AFC|1 2 Phantom Warrior|DPA|1 -3 Summoner's Bane|DDM|1 1 Toothy, Imaginary Friend|BBD|1 [Sideboard] diff --git a/forge-gui/res/adventure/Shandalar/decks/kobold.dck b/forge-gui/res/adventure/Shandalar/decks/kobold.dck index 470b77eaba1..328182c1720 100644 --- a/forge-gui/res/adventure/Shandalar/decks/kobold.dck +++ b/forge-gui/res/adventure/Shandalar/decks/kobold.dck @@ -1,30 +1,37 @@ [metadata] -Name=kobold +Name=Kobolds Mid [Avatar] [Main] -4 Badlands|VMA|1 +1 Ancient Brass Dragon|CLB|1 +1 Bladewing, Deathless Tyrant|DMC|1 +2 Darigaaz's Whelp|YDMU|1 2 Draconic Destiny|BRO|1 -4 Dragonskull Summit|E01|1 -1 Goldspan Dragon|PLIST|1 -2 Haunted Ridge|MID|1 -2 Kobold Drill Sergeant|ME3|1 +4 Dragonskull Summit|C16|1 +2 Geothermal Bog|DMU|1 +4 Haunted Ridge|MID|1 +2 Heraldic Banner|ELD|1 +1 Kher Keep|TSR|1 2 Kobold Overlord|ME3|1 2 Kobold Taskmaster|TSB|1 +1 Kobold Warcaller|HBG|1 4 Kobolds of Kher Keep|ME3|1 -2 Kolaghan's Command|2X2|1 -4 Lightning Bolt|A25|1 -4 Minion of the Mighty|AFR|1 +2 Minion of the Mighty|AFR|1 5 Mountain|DMU|4 -3 Nogi, Draco-Zealot|GN3|1 -2 Pact of the Serpent|KHC|1 -2 Rograkh, Son of Rohgahh|CMR|1 -3 Rohgahh, Kher Keep Overlord|DMC|1 +1 Nogi, Draco-Zealot|GN3|1 +2 Rakdos Charm|AFC|1 +1 Rograkh, Son of Rohgahh|CMR|1 +1 Rohgahh of Kher Keep|ME3|1 +2 Rohgahh, Kher Keep Overlord|DMC|1 1 Rosnakht, Heir of Rohgahh|DMC|1 -4 Sulfurous Springs|DMU|1 +1 Shivan Dragon|DMR|1 +2 Shock|DDN|1 +2 Slumbering Dragon|M13|1 +4 Smoldering Marsh|DMC|1 4 Swamp|DMU|4 1 Taunting Kobold|CLB|1 -2 Wheel of Fortune|LEA|1 +2 Terminate|DMC|1 +1 Vanquisher's Banner|XLN|1 [Sideboard] [Planes] diff --git a/forge-gui/res/adventure/Shandalar/decks/kor_warrior.dck b/forge-gui/res/adventure/Shandalar/decks/kor_warrior.dck new file mode 100644 index 00000000000..af8938ebfc6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/kor_warrior.dck @@ -0,0 +1,53 @@ +[metadata] +Name=Kor Warrior +[Avatar] + +[Main] +1 Akiri, Fearless Voyager|ZNR|1 +1 Akiri, Line-Slinger|C16|1 +2 Axgard Armory|KHM|1 +1 Balduvian Berserker|DMU|1 +1 Basilisk Collar|AFC|1 +1 Bloodforged Battle-Axe|C17|1 +1 Captain's Claws|OGW|1 +4 Clifftop Retreat|DOM|1 +1 Darksteel Plate|DDU|1 +1 Embercleave|ELD|1 +1 Empyrial Plate|C16|1 +1 Fiendlash|AFC|1 +4 Furycalm Snarl|STX|1 +2 Kitesail Apprentice|GN3|1 +2 Kitesail Scout|BFZ|1 +1 Knight of Cliffhaven|DDP|1 +1 Kor Blademaster|ZNR|1 +1 Kor Celebrant|ZNR|1 +2 Lone Missionary|MM3|1 +1 Mountain|ZNR|1 +1 Mountain|ZNR|3 +1 Nomads' Assembly|C14|1 +1 Plains|ZNR|1 +3 Plains|ZNR|2 +3 Plains|ZNR|3 +1 Plains|ZNR|4 +1 Priest of Possibility|YDMU|1 +1 Retreat to Emeria|MB1|1 +4 Sacred Foundry|SLD|1 +1 Seraphic Greatsword|CMR|1 +1 Shadowspear|THB|1 +1 Sigarda's Aid|CMR|1 +3 Skyclave Apparition|ZNR|1 +1 Squad Commander|ZNR|1 +2 Stone Haven Outfitter|OGW|1 +2 Stoneforge Mystic|TD1|1 +1 Sword of the Animist|AFC|1 +2 Valiant Veteran|DMU|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/mammoth.dck b/forge-gui/res/adventure/Shandalar/decks/mammoth.dck new file mode 100644 index 00000000000..722b7659acc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/mammoth.dck @@ -0,0 +1,40 @@ +[metadata] +Name=mammoth +[Avatar] + +[Main] +2 Aggressive Mammoth|M20|1 +2 Battle Mammoth|CLB|1 +1 Bestial Menace|MIC|1 +4 Call of the Herd|MM3|1 +4 Canopy Vista|ONC|1 +2 Cultivate|J22|1 +3 Elephant Graveyard|ME4|1 +1 Forest|30A|1 +1 Forest|30A|2 +1 Forest|30A|3 +2 Generous Gift|MH1|1 +4 Grasslands|DMC|1 +4 Kazandu Mammoth|ZNR|1 +2 Loxodon Line Breaker|M19|1 +2 Lulu, Forgetful Hollyphant|HBG|1 +3 Nature's Lore|CLB|1 +2 Overrun|PCA|1 +2 Plains|30A|4 +4 Rampant Growth|NEC|1 +4 Savannah|30A|1 +1 Terastodon|CMR|1 +2 Thorn Mammoth|ELD|1 +2 Trained Armodon|TPR|1 +1 Trumpeting Herd|J21|1 +4 War Mammoth|30A|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/miniboss/garruk.dck b/forge-gui/res/adventure/Shandalar/decks/miniboss/garruk.dck new file mode 100644 index 00000000000..65dd2206c3c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/miniboss/garruk.dck @@ -0,0 +1,50 @@ +[metadata] +Name=garruk +[Avatar] + +[Main] +1 Apex Altisaur|C19|1 +1 Argoth, Sanctum of Nature|BRO|1 +1 Bramblecrush|ISD|1 +1 Castle Garenbrig|ELD|1 +1 Elder Gargaroth|M21|1 +4 Elvish Mystic|KHC|1 +19 Forest|J14|1 +1 Garruk Wildspeaker|GVL|1 +2 Garruk's Harbinger|M21|1 +1 Garruk's Horde|M12|1 +1 Garruk, Caller of Beasts|M14|1 +1 Garruk, Primal Hunter|C21|1 +1 Garruk, Unleashed|M21|1 +1 Garruk, Wrath of the Wilds|YMID|1 +1 Gate to Manorborn|HBG|1 +1 Gemrazer|IKO|1 +1 Gingerbread Cabin|ELD|1 +1 Goreclaw, Terror of Qal Sisma|J21|1 +1 Kogla, the Titan Ape|IKO|2 +2 Krosan Warchief|C13|1 +1 Nature's Chosen|ALL|1 +4 Nature's Claim|MB1|1 +4 Prey Upon|ISD|1 +2 Primeval Titan|IMA|1 +1 Rampaging Baloths|C14|1 +1 Ravenous Gigantotherium|C20|1 +2 Return to Nature|M21|1 +1 Rhox|10E|1 +1 Sawtusk Demolisher|C20|1 +1 Spearbreaker Behemoth|ALA|1 +1 Thorn Mammoth|ELD|1 +1 Thragtusk|MM3|1 +2 Wicked Wolf|ELD|1 +1 Wild Endeavor|AFC|1 +1 Yedora, Grave Gardener|C21|2 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/miniboss/jace_boss.dck b/forge-gui/res/adventure/Shandalar/decks/miniboss/jace.dck similarity index 89% rename from forge-gui/res/adventure/Shandalar/decks/miniboss/jace_boss.dck rename to forge-gui/res/adventure/Shandalar/decks/miniboss/jace.dck index ca19ddc4f23..add2c7dca6b 100644 --- a/forge-gui/res/adventure/Shandalar/decks/miniboss/jace_boss.dck +++ b/forge-gui/res/adventure/Shandalar/decks/miniboss/jace.dck @@ -3,8 +3,9 @@ Name=jace_boss [Avatar] [Main] -2 Ancestral Recall|30A|1 +1 Ancestral Recall|30A|1 1 Arcanis the Omnipotent|C17|1 +2 Azorius Signet|NEC|1 1 Bruvac the Grandiloquent|PLIST|1 3 Counterspell|SLD|1 1 Evacuation|C16|1 @@ -21,6 +22,7 @@ Name=jace_boss 2 Jace's Triumph|WAR|1 1 Jace, Architect of Thought|RTR|1 1 Jace, Cunning Castaway|XLN|1 +1 Jace, Ingenious Mind-Mage|XLN|1 1 Jace, Memory Adept|M14|1 1 Jace, Mirror Mage|ZNR|2 1 Jace, the Living Guildpact|M15|1 @@ -32,14 +34,11 @@ Name=jace_boss 1 Karakas|OLGC|1 1 Library of Alexandria|OVNT|1 1 Maze of Ith|OLGC|1 -2 Mox Sapphire|VMA|1 1 Preston, the Vanisher|J22|1 -1 River's Rebuke|GN2|1 4 Seachrome Coast|ONE|1 -1 Sol Ring|PF19|1 1 Space Beleren|UNF|1 1 Strip Mine|VMA|1 -2 Supreme Verdict|IMA|1 +1 Supreme Verdict|IMA|1 1 Time Warp|E02|1 1 Timetwister|OVNT|4 4 Tundra|VMA|1 diff --git a/forge-gui/res/adventure/Shandalar/decks/miniboss/nahiri.dck b/forge-gui/res/adventure/Shandalar/decks/miniboss/nahiri.dck new file mode 100644 index 00000000000..9ee2164f1e3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/miniboss/nahiri.dck @@ -0,0 +1,54 @@ +[metadata] +Name=nahiri +[Avatar] + +[Main] +2 Akiri, Fearless Voyager|ZNR|1 +4 Arid Mesa|SLU|1 +1 Basilisk Collar|CLB|1 +1 Bladegraft Aspirant|ONE|1 +4 Clifftop Retreat|DMR|1 +1 Cloudsteel Kirin|NEO|1 +1 Danitha Capashen, Paragon|J22|1 +2 Disenchant|S00|1 +1 Embercleave|ELD|1 +2 Fervent Champion|ELD|1 +2 Goblin Gaveleer|2XM|1 +4 Inspiring Vantage|KLD|1 +1 Kaldra Compleat|PLIST|1 +1 Kemba, Kha Enduring|ONE|1 +1 Kemba, Kha Regent|2XM|1 +1 Lion Sash|NEO|1 +1 Lizard Blades|NEO|1 +1 Luxior, Giada's Gift|SNC|1 +1 Mask of Memory|ONC|1 +4 Mountain|BRO|3 +2 Nahiri's Binding|ZNR|1 +1 Nahiri, Heir of the Ancients|ZNR|1 +1 Nahiri, Storm of Stone|WAR|1 +1 Nahiri, the Harbinger|SOI|1 +1 Nahiri, the Lithomancer|PLIST|1 +1 Nahiri, the Unforgiving|ONE|1 +4 Plains|BRO|3 +4 Plateau|PRM|1 +4 Puresteel Paladin|AFC|1 +4 Sacred Foundry|GRN|1 +1 Seraphic Greatsword|CMR|1 +4 Sram, Senior Edificer|NEC|1 +2 Stoneforge Mystic|2XM|1 +1 Sword of Body and Mind|2XM|1 +1 Sword of Body and Mind|MPS_KLD|1 +1 Sword of Feast and Famine|PLIST|1 +1 Sword of Hearth and Home|MH2|1 +1 Sword of Sinew and Steel|MH1|1 +3 Swords to Plowshares|DMR|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/slime_boss.dck b/forge-gui/res/adventure/Shandalar/decks/miniboss/ooze_boss.dck similarity index 100% rename from forge-gui/res/adventure/Shandalar/decks/slime_boss.dck rename to forge-gui/res/adventure/Shandalar/decks/miniboss/ooze_boss.dck diff --git a/forge-gui/res/adventure/Shandalar/decks/miniboss/teferi_boss.dck b/forge-gui/res/adventure/Shandalar/decks/miniboss/teferi_boss.dck new file mode 100644 index 00000000000..dd10c4bdce1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/miniboss/teferi_boss.dck @@ -0,0 +1,46 @@ +[metadata] +Name=teferi_boss +[Avatar] + +[Main] +1 Back to Basics|UMA|1 +1 Balance|30A|1 +2 Disenchant|30A|1 +3 Historian of Zhalfir|M21|1 +8 Island|DMU|4 +1 Niambi, Beloved Protector|YDMU|1 +1 Niambi, Esteemed Speaker|M21|1 +1 Oath of Teferi|DOM|1 +4 Path to Exile|2X2|1 +10 Plains|DMU|4 +1 Propaganda|AFC|1 +1 Teferi's Ageless Insight|M21|1 +1 Teferi's Contingency|YDMU|1 +1 Teferi's Drake|MIR|1 +1 Teferi's Moat|TSB|1 +1 Teferi's Protege|J22|1 +3 Teferi's Sentinel|DOM|1 +1 Teferi's Tutelage|M21|1 +2 Teferi, Hero of Dominaria|PPRO|1 +1 Teferi, Mage of Zhalfir|IMA|1 +1 Teferi, Master of Time|M21|9 +1 Teferi, Temporal Archmage|C14|1 +1 Teferi, Temporal Pilgrim|BRO|1 +1 Teferi, Time Raveler|WAR|1 +1 Teferi, Who Slows the Sunset|MID|1 +1 The Tabernacle at Pendrell Vale|OLGC|1 +1 Time Warp|E02|1 +2 Time Wipe|PWAR|1 +4 Tundra|30A|1 +1 Winter Orb|EMA|1 +1 Zhalfirin Void|PDOM|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/ooze.json b/forge-gui/res/adventure/Shandalar/decks/ooze.json new file mode 100644 index 00000000000..1bbf327c2b7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/ooze.json @@ -0,0 +1,12 @@ +{ +"name":"Ooze", + "template": + { + "count":60, + "colors":["Green","Blue","Black"], + "tribe":"Ooze", + "tribeCards":1.0, + "tribeSynergyCards":0.2, + "rares":0.6 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/squirrel.dck b/forge-gui/res/adventure/Shandalar/decks/squirrel.dck new file mode 100644 index 00000000000..5a17be6478c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/squirrel.dck @@ -0,0 +1,41 @@ +[metadata] +Name=squirrel +[Avatar] + +[Main] +4 Bayou|30A|1 +4 Chatter of the Squirrel|SLD|1 +2 Chatterfang, Squirrel General|J21|1 +2 Chitterspitter|J21|1 +1 Deep Forest Hermit|MH1|1 +1 Deranged Hermit|VMA|1 +1 Drey Keeper|MH2|1 +1 Earl of Squirrel|UST|1 +3 Forest|MH2|1 +2 Forest|MH2|2 +2 Krosan Beast|SLD|1 +1 Liege of the Hollows|WTH|1 +4 Necroblossom Snarl|STX|1 +1 Nut Collector|DMR|1 +3 Ravenous Squirrel|J21|1 +2 Scurrid Colony|STX|1 +4 Squirrel Mob|MH2|1 +3 Squirrel Sanctuary|MH2|1 +4 Squirrel Sovereign|J21|1 +1 Squirrel Wrangler|J21|1 +1 Swamp|MH2|1 +2 Swamp|MH2|2 +4 Swarmyard|SLD|1 +2 Toski, Bearer of Secrets|KHM|1 +1 Verdant Command|MH2|1 +4 Woodland Cemetery|DOM|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/decks/water_elemental.dck b/forge-gui/res/adventure/Shandalar/decks/water_elemental.dck new file mode 100644 index 00000000000..d73611e46d0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/water_elemental.dck @@ -0,0 +1,35 @@ +[metadata] +Name=water_elemental +[Avatar] + +[Main] +1 Aethersnipe|UMA|1 +1 Air-Cult Elemental|AFR|1 +4 Boomerang|10E|1 +1 Boreal Elemental|M20|1 +1 Brine Elemental|TSP|1 +2 Cavalier of Gales|M20|1 +3 Cloudkin Seer|MB1|1 +4 Floodhound|J21|1 +3 Glimmerbell|IKO|1 +23 Island|BRO|4 +1 Nimbus of the Isles|BBD|1 +1 Plasma Elemental|5DN|1 +2 Subtlety|MH2|1 +1 Supreme Exemplar|MOR|1 +4 Unsummon|M20|1 +1 Void Stalker|M13|1 +2 Water Elemental|30A|1 +2 Water Servant|M14|1 +2 Water Weird|HBG|1 +1 Watercourser|MB1|1 +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + +[Dungeon] + diff --git a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session index 6183e0af866..36891d6540d 100644 --- a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session +++ b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session @@ -3,12 +3,12 @@ "height": 4300, "width": 2 }, - "activeFile": "map/jacehold.tmx", + "activeFile": "map/nahiri.tmx", "automapping.whileDrawing": false, "expandedProjectPaths": [ - "tileset", - "obj", "map/main_story", + "obj", + "tileset", "map" ], "file.lastUsedOpenFilter": "All Files (*)", @@ -1553,7 +1553,7 @@ "scale": 1.5, "selectedLayer": 0, "viewCenter": { - "x": 240, + "x": 239.99999999999997, "y": 136.33333333333334 } }, @@ -1596,7 +1596,7 @@ "scale": 1.3517708333333331, "selectedLayer": 0, "viewCenter": { - "x": 240.4253679586962, + "x": 240.42536795869617, "y": 136.48763196424449 } }, @@ -1736,6 +1736,17 @@ "y": 239.75 } }, + "map/garruk.tmx": { + "expandedObjectLayers": [ + 4 + ], + "scale": 2.0504166666666666, + "selectedLayer": 3, + "viewCenter": { + "x": 271.6521032310506, + "y": 215.8097947571632 + } + }, "map/graveyard.tmx": { "expandedObjectLayers": [ 4 @@ -1930,8 +1941,8 @@ "scale": 1.5, "selectedLayer": 3, "viewCenter": { - "x": 240, - "y": 135.99999999999994 + "x": 239.99999999999997, + "y": 136.33333333333334 } }, "map/grove_5.tmx": { @@ -1993,9 +2004,9 @@ 4 ], "scale": 2, - "selectedLayer": 0, + "selectedLayer": 4, "viewCenter": { - "x": 265.5, + "x": 265, "y": 123.25 } }, @@ -2012,9 +2023,9 @@ 4 ], "scale": 2.177083333333333, - "selectedLayer": 3, + "selectedLayer": 2, "viewCenter": { - "x": 240.2296650717704, + "x": 239.77033492822972, "y": 136.19138755980865 } }, @@ -2022,7 +2033,7 @@ "scale": 1.2623540856031128, "selectedLayer": 0, "viewCenter": { - "x": 255.07898589812746, + "x": 255.07898589812743, "y": 159.62240887724434 } }, @@ -2030,7 +2041,7 @@ "scale": 1.3517708333333331, "selectedLayer": 0, "viewCenter": { - "x": 240.4253679586962, + "x": 240.42536795869617, "y": 136.48763196424449 } }, @@ -2038,7 +2049,7 @@ "scale": 1.3517708333333331, "selectedLayer": 0, "viewCenter": { - "x": 240.4253679586962, + "x": 240.42536795869617, "y": 136.48763196424449 } }, @@ -2580,6 +2591,17 @@ "y": 135.5 } }, + "map/nahiri.tmx": { + "expandedObjectLayers": [ + 4 + ], + "scale": 1.5333593749999999, + "selectedLayer": 3, + "viewCenter": { + "x": 324.77709278035366, + "y": 209.01818922912318 + } + }, "map/nest_blue_1.tmx": { "scale": 0.75, "selectedLayer": 4, @@ -2868,12 +2890,23 @@ 11 ], "scale": 3, - "selectedLayer": 3, + "selectedLayer": 4, "viewCenter": { - "x": 229, + "x": 296, "y": 183.83333333333331 } }, + "map/slimefoot_boss.tmx": { + "expandedObjectLayers": [ + 4 + ], + "scale": 2.044479166666666, + "selectedLayer": 0, + "viewCenter": { + "x": 239.6698425638152, + "y": 136.22051255922963 + } + }, "map/snowabbey_1.tmx": { "scale": 1.6011458333333333, "selectedLayer": 0, @@ -2917,6 +2950,14 @@ "y": 320.5 } }, + "map/teferi.tmx": { + "scale": 3, + "selectedLayer": 1, + "viewCenter": { + "x": 240, + "y": 136.16666666666663 + } + }, "map/tileset/buildings.tsx": { "scaleInDock": 1 }, @@ -3060,23 +3101,28 @@ "map/kiora_island.tmx", "map/kobold_mine.tmx", "map/lavaforge_1.tmx", - "map/lavaforge_2.tmx" + "map/lavaforge_2.tmx", + "map/garruk.tmx", + "map/grove_4.tmx", + "map/slime_hive.tmx", + "map/slimefoot_boss.tmx", + "map/nahiri.tmx" ], "project": "main.tiled-project", "property.type": "string", "recentFiles": [ - "map/lavaforge_2.tmx", - "map/lavaforge_1.tmx", - "map/kobold_mine.tmx", - "map/kiora_island.tmx", - "map/fort_9.tmx", - "map/forest_town_generic.tmx", - "map/factory_3.tmx", - "map/factory_2.tmx", - "map/factory_1.tmx", - "map/fort_3.tmx", + "map/jacehold.tmx", + "map/fort_6.tmx", + "map/fort_5.tmx", "map/fort_4.tmx", - "map/fort_5.tmx" + "map/fort_3.tmx", + "map/factory_1.tmx", + "map/factory_2.tmx", + "map/factory_3.tmx", + "map/forest_town_generic.tmx", + "map/fort_9.tmx", + "map/kiora_island.tmx", + "map/kobold_mine.tmx" ], "resizeMap.removeObjects": true, "textEdit.monospace": true diff --git a/forge-gui/res/adventure/Shandalar/maps/map/garruk.tmx b/forge-gui/res/adventure/Shandalar/maps/map/garruk.tmx new file mode 100644 index 00000000000..4f2819e131b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/garruk.tmx @@ -0,0 +1,90 @@ + + + + + + + + + + eJz7ysbA8JWOeBsrA8N2VvraiW4/CIcA2focA+uOiewDZ/9gcgfIDQuYGBhuMQ+sGwYyPcDcMJB5YzC5AxkMhvAAYZsBTJ+jbiHsjoFOs8hu+TxI3DHQYTLqjlF3jLpj6LkD2S123IPDHaAwSeOE4IF0CyxuBos7BjpusLkDAFXcau0= + + + + + eJxjYBgFo2DgwTZWCB4FowAEbrMh8GABgymNgtzxcKAdAQWDKUyoAdq4B4c7KAWDxR2jYBSMgqELJrAPtAsgYNQdQwcAAJf3DG4= + + + + + eJzFljtOw0AQhkcgY1uxBA1H4FXRUSFOwRkoKFxSU2EeDdyAU8ABQkDpKGigCxwB0bOj7MiT8exLdiDSr2TXm51v/5mx3YwALo2ujK6NGjtuxPyN0c9afz1kAI9Zd36rAtg22jHardqxnN+r+sdHHZvf+0X3+tjs/2Q0MXqudB9w/mUAjrs8fj35UJdzcR9wnOV+uXxI5RhbhgljIQbUmRWPzccuhvsVgI/VNA8ppsbB4xcb7fdn4WbQ6mEIDjw/xuY6Lxf3OCn13pjC4vgNdIZp3uXg4nkgBhxLDl+PdmI6WDTOzPLx2NwPmRf+CcUKxfblivRVzOXqVdShrc/3BJaQwJFfZNLOIVmGEPUsieqR+xXjC1dfj+jsyMFZfJ7E1Gyf3BCLyw/O8q1ck57QWXz1iroYuTnqctEjznEAXU9mkTFlfG395nq3RnAd5+mTm9OI+zF5A6D7gGNcE8shc66pLtu4MjfcJ8ni4wjd33BfmQP5zHFJctzmfj9mPXs3Vq8wfO829t019X/L4khhSanTvxCxHA307h/jWSg3Wo+TUu5pIQ7XXjw3Lo5l+yE5/rtGNI5ff6f+Yg== + + + + + + + + eJydV8tOwlAQvUqkEFp/ohEwimsTv8adceHKuNUViCb0a/AHAJPuWbryF/oDdtJOejqd+6g3OSnFcufMOTPTaxobk5ZYTirkUXVNYz8uAp4hbM+M+arBi2K8K3Ho++uSw+MonIcPU+Ahly0GauHjsSux78FnK3RwxQjlMYubPU8HxvzG7TzlnvcnXT9cnEN50HpNuhrLGMzB5cfMwuOhrI0bT51yTM79p7yeRd0YkgP6oYF+8wn3vn6hxbERm6Ex2bDJQ6sJ6oNsqEPL1ceDvWEO2PesaRZ1eaDvDFtd5VE7lsblZVw9i3owd+YyHTfgnGkmuDzGXDXOad2nh1jP50r5zWKk13KI/pp2Lk8xz6cy76Np5qTGRerr8oU05f0XUaOlzSMEcSFMYT+skz56oIZ5FD4z2VfSZA/7SU18eqxF/b4lFY95/fdLJe5c3BOHXdzUE3tr08TlCy6bHt8WPY6iJsnL//JA9PWF5uER4tl6R85Oya0w7f6gJbUPqRFtb9RE5i2/w/MHL80Dmy+MVQ8e2nc4O1DbPnoweAu63g3C68M2/5FHqEfcW+s6jq9O5XmBefD5gj4/J34fbJ4xD9sMsemBszSD9zhzkn2983Cic05huppos4LvPyZNL90m7fe4jVth3DwOcRNbnpWxv/Be834GnLG3c0tuWp6sZSiPEOB7h/isPOclen5zXn2mGsHzsqu+5VXqxF6zHq7/o3Atlb6RcfoCeWCdyp7i+iqAi61WCX9fbgUK + + + + + + + + + + + + + + + + + { "startBattleWithCardInCommandZone": [ "Garruk's Boss Effect Phase One","Garruk's Boss Effect Phase Two"] +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/jacehold.tmx b/forge-gui/res/adventure/Shandalar/maps/map/jacehold.tmx index 3523d9e9d54..de16a2a23b6 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/jacehold.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/jacehold.tmx @@ -1,5 +1,5 @@ - + @@ -7,17 +7,17 @@ - eJxjYEAFX9kgGATyOGmDGRkgmFSwjZU0DPIHqXp6OBEYBpDF0OXQw45WgJEB1W4QvYRp8LkN2X3Euo0c+wiB90gYl/3ocTwQQIWNcBgNlNuQ7ad2HFILDDZ3IadNWrmL3PITBogJM/RykV5uIwYYczAwmACxKRCbcdDYsgEA9AhDUgEjGiYWGLIiMAzA2hi0rJMoAQPlLlx15mAuf/EBAMRoTfA= + eJzFlkkOgzAMRR0kpk3vUjEci5NwGFY9SO/SXReAIgsnYNNQnDzpCZQs/idBBACXT2FdGWodDVi1wefgeD+slLHePBrz50LyJL6ZlcOAm02v2t3OoN2kXly3K3khYPZU7seP7u9G2lfMXrtR/fmU0PXzu8UEs2kHbs1iI3W7m6vfT+yCeym9V6/cVbtbCE0F0C52i32lHJaAWOdjCMbzV575JoL/GJpn0j+k6sWdmRpnaAxmG6hDZg== - eJytlrFOxDAMhkOPNlS9ARCPABISEwszvAX7SQwM9wxM6MQAN3VEQqwMXTjExsIb8AxMDCB0GwOxfFZd4zRNyy/9atK09RcndbvMjFkKS72K/oHzWd60ds/56louGQs8t8YsUn1M+qL4G1szXKtxdrmvLxtXmTfbpZIjrp8ELUX3UYxkx5jK4hHYHjbj2WKkMX0yP4/x3JeL8cH4qB3iOh3ApunQ8b679XpxDNMR+sa1r2zNBu2K+VvJEc8brR+thexL+c7vWRyDIxg4QZdbyEbmbNcWOd7y2sQHug3sK8mVFP5x4iKD9rebbNAntonyznC20J4HHY9xDsSm2TfH3cyfN41NrilIPluL1TYPLZ8Q9zHVudpqTZd4MWyapjm+D5ItVAf7iLOF9un9COMC21MaV6OHsoV0st6PzScYK/NhdRnE48awHW20PzeWa9YyNllzNdlx3SWMNasdm7eua97lOwjfz/mqzsl/GS1voEXRdB+F+CvGJVl8a/pf0p5F53gdq5S8Sf8C0KXdjQ== + eJytlrFOwzAQhk2gNVY7AOIRqITExMIMb8FeqQNDH6MDQ+nUsVJ3Bk9FbCy8Ac/QiQGEujHg09nK5XpOcym/9Ctx7Pg+3yVONl1jNsxc76x9FTxyVUv3PMSxVDwWeGaNWXXkPomNx5YMYyXOJvftwwZaOL1/C3SuP8Uozo3xFo/A9nyiY9MKmLi+iF/7eO07xPgkfOl8F9d9ZJu0R6zoOvCuQ73eAsP4EP0Uzh8t9vt47ol/hBzRvM1daanNtXU9tgcW++AIXsfnanK6PUdim1oc8+FKJz7QIsOQ4yp6+f7ElQy6PMM6gjnbUHhnKFsuP1S3fVxDYpOcW+MFqxmtqcTGawric0ux6tYh5XPs8JmTuOr2mibxNGz83YU2Zctx1bFpRNloXilX2vfAo8j20tHt0fuyUUlsd0ft2HKCvrnTsdM8JUYaV8N2c1wfS5tTysQ1PAh7cuBaFoS1W1qbt6Y1b/IdhO/nLL4L/F9Gyhto1au6jXbxe8LFWXI1/S9Jc6VrdL/wQt64/wAAbfTL - eJxjYEAAbSDO40TF+IA2fmkMkIVD/DYzA8N2VsL6kd2FyyxS7CWkvpqFeLfB3KfKDsGibKjs2doIPjoGyT3kwRQ/jmQeDLwHmvUJinm5EG4j5Edkt5GC/zBhspEBuvuQAbZwu8qIiilxGzZ3PmPFxMFs2N1nxwzBn6HyX9lQcQkTeW5Dj2vkMETHIHv6cYQfCISiue01C6rbkOOAEJbFksaQ8S4eVAyyh48f4RZGJHdNxOFmcsINFF743IYt7+ALN1xuAwEhZlS3oYcftvAkFG7oGB/Q58AtByvbKM0L+PAlJPurWBAY3V2T2RGYXLdREm7vCYQjtnADAVq4jVyAXpfCsDWw3J4GpG25cKshBZMKzDjwm3eSnXI3pUExtcIMhjM5iFOnC/RDPxsqzuJAlKMgt22D1k/MTNRxG7EYV/jC3AZy12BymwoDIp2R4jYABLGkug== + eJxjYEAAbSDO40TF+IA2fmkMkIVD/DYzA8N2VsL6kd2FyyxS7CWkvpqFeLfB3LeLh3T8hwk7GxnL8EDseM/GwPAJinm5EG4j5EeQ21TZSccg96CzkQFMDhvAFm5XGVExJW7D5s5nrJg4mA27++yYIfgzVP4rGyouYSLPbbO10fjMmGqmQc3VBdrbjyP8QCAUzW2vWVDdhhwHhLAsD3559DQHsoePH7u7JuJwMznhBgovfG5DD08QBtmDK9xwuQ0EhJhR3YYeftjCk1C4oWN8QJ8DtxysbKM0L+DDJ5Hsq2JBYHR3TWZHYHLdRkm4vScQjtjCDQRo4TZyAXpdCsPWXJD8b8uFWw0pmFRgxoHfvJPslLspDYqpFWYwnMlBnDpdoB/62VBxFgeiHAW5bRu0fmJmoo7biMW4whfmNpC7BpPbVBgQ6YwUtwEAsGSvSg== @@ -25,7 +25,7 @@ - eJy1Vs9LFVEUviPvzQ/fey7bZK6Eeo5gCoW7+iesoL2LWbetXEWCIJaBILjVnUIL8QXRAxXtx9+Q/gNFSUHQwnM453jPnHfHxkUffNy5v85897tzzx3nnGu23AUKLnMXRqH6iop+i+nMP+93qXwfeQpuAk8a5bkrqXOvUnruA990nHvW+n98zl6MmzVIffSab5uCdd0GPulQ/Xob+oE32gETHLXnUZk45++Qc6dQnvAzjjvMPHXcKBDXtn0OjMEYPeC7Cm0h4JxOTpqQ3xLS0Gp47nFcq20uoXJf6TsAPozJLyyR8p4QIuZlvgl/srZ7w4Os2g8L1PMopu/sE8yJh+g9W11PhK5j7JWR8tqttjH2/TH0fe36cX9c2bfIUDDOen6Dtl/smWjrKSJ67XqUsfp7EJ9eqPo2vG+HqfdFdOF5fw3eryaksa+06bWGgHHu19wb1PKB8wiWotV6FjofGlZbl5NZnpep12lxDO//qHJalTatr+nCe9pXbWtJfd+uAqst5JnwS2A/7kD+vZuSNsmRExW+Ve3BRjbYJj495dxrz+ki5+KLO4ljZNA+zH0zGfXbHFmVJ5HrOa1hKfVE6LpoCeX0vom7DnwAezcBwTch7larPGbPnL0F1j5W86z+i/oMY76V+9bexS+5xL18GxOtP5NsnJTiWcGl9kh8k7jfwYNJ4HLseSvznG0QNaRNz7mMiLrj9Fi7d3hHLoPWqZRy6pHxynon82aywbbQP4/2bjWl8iwZHFOosVL/AXp2m6QLKedAw/47hTRcRWuVLgGuYT4jzxBn6i5CyDen/+vOAVKSt+c= + eJydVk1LHEEQ7ZXdmWlnzdGLHyfBrCOYCAZv+ieSCN497NmrSU6iEBATA4FArvGWQA7BFUIWTDAh/0H9A4qKQiCHVFFd6Zqabp3kwaOne6qrX1d114wxxrRy8xdd164OmSDwfaFs9XuN+9Y/H3So/dzwZEwCj5vluduZMS8y0tOH/iton4Dep7mpIKa5js1aXvY7od5zf3TYj83Avu5Z73OkDe+BY+3wGjheNMrEOT3gCfDYPaPdN+sp/TYCfvXYz4ANr7Mf0RYCzhmCZP8eIJ6mpCFveu4JzVLHw5TaA6HvK/BxQvHCFsnrrEf2hYzFjXUhL5y2hcEqY/nQQD1LCZ0zPMfJAK2z2/FEyD763r5T3rvWNu7ivixscO4vUy+nE07PNWi7cjFjbT1BRK9dj2wrzwPHaV3038N6Hxy1Nr4TLyH2Oylp7AttR52bok1+FmvmBrV8cXUE21BO+bwgQnXIBLR1XDErijLZXwjfYf0foqbdpg39tEw4p30x9jqtH7f/AWvj+Y0AQ5iD+vsgI21cI6cicYv5eWurYxwnrr2xe8q5LJwPC7aDrk7PWnqva2TsTiHfFLSH55knQvZZS6im97VjwCPI3RQ4fwd+d/OyzZ66e8+c9vGad/U2yjuM9Za/t/oObLgWc/kxIer4TLvAccsx67pWxojjxn7PIAbTwK3E8671nG8SJXhMzrmJiLp20lbnDr+RW6B1JqOaeqhipWPH82ZtdSxWazh2Oxm1l2nVpitsuX8Oej61SBdyM/Cvo/+dQhr+RWtMFwP3sGIpZohL8S1C8JmT/3V/AEXhquc= @@ -35,7 +35,7 @@ - + [ { @@ -104,7 +104,7 @@ - { "startBattleWithCard": [ "Jace Boss Effect" ] + { "startBattleWithCardInCommandZone": [ "Jace Boss Effect" ] } @@ -202,5 +202,9 @@ + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx b/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx index 6aa88a22d39..84b0bfc65a1 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx @@ -1,5 +1,5 @@ - + @@ -63,7 +63,7 @@ - + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/kobold_mine.tmx b/forge-gui/res/adventure/Shandalar/maps/map/kobold_mine.tmx index bc7cf7852d0..4a49fefddb5 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/kobold_mine.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/kobold_mine.tmx @@ -1,5 +1,5 @@ - + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/green_castle.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/green_castle.tmx index 4ba260e015a..78178402e21 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/green_castle.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/green_castle.tmx @@ -29,7 +29,7 @@ - eJztmH0OwiAMxTnBNo3uIu4WXsePHUt3FS+kiyOZhNI3RsFkJelfkr5fhm0fdJUxnYaGhoaGhoaGYLSNMU8wzjt877HJw3/46EisvfJvgr+vjbkCcau/XBdw/73OX8vIOeX6rlvhR/vnMPE/tH8qv/KL83N1aetLmh/pD75a57j2mfiR/L6ziuVH5ys1n1Px91NOisfOdzd/7P+WykP5kzkb5TXGnBwPpYvONaqOEF1qj9UeZyY3L19V/LmH9nO6cza3ftfUZCr+GE3l/w/+pXcSKX7pu45PMyX/Gg/h63/2/SPkHST4W0cfuSeE9BHNlPwIi/L//ub2AOr9gfIhpfmpfEv01vCH/Fvom1Fzn7u/DwvOcu7fQr2T829S3p/7thwb6t9c75Z6hbSl/FuJldL/lFix/ifmfhh7vyz91mvP9CSso/xl+d+e+Pwi + eJztmH0OgjAMxXcCQKKchFt4HT84lnIVL6REluCyro+xbiZ0yfvLpf2F2fZtfWVMr1KpVCqVSiWorjHmCep8wPeemjz8x08eidUq/y74h9qYK6Bb/eW6gPvvdf5aRs4p13fdCz/aP8eZ/6H9U/mVX5yfq0tbX9L8SH/w1TrH1WbiR+L7ziqWH52v1HxOxT/MMSkeO9/d+LH/WyoO5U+WbJTXmGJyPFRedK5RdYTkpfbY3NPM5Oblq4o/99B+Lu+Sza3fLTWZij8mp/L/B//aO4kUv/Rdx5czJf8WD+Hrf/b9I+QdJPg7Jz9yTwjlR3Km5EdYlP/3N7cHUO8PlA8pzU/FW5NvC3/Iv4W+GTX3ufv7uOIsl/4t1Ds5/ybl/blvy7Gh/s31bqlXKLeUfyuxUvqfEivW/8TcD2Pvl6Xfev/1/VP50+oNNlL7xQ== diff --git a/forge-gui/res/adventure/Shandalar/maps/map/nahiri.tmx b/forge-gui/res/adventure/Shandalar/maps/map/nahiri.tmx new file mode 100644 index 00000000000..c3b42c3f499 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/nahiri.tmx @@ -0,0 +1,89 @@ + + + + + + + + + + eJzllm0KgCAMhoX80xE9SdAhg6BbeIkQCsJm23TOQcH7o5jt0X0ZZudCpTb/FsUGsi2tbxHHL2YrzYf5vX1BvNS9SfPkXFi8of+2sFE546VkH/03X+kbl6/2LClxl4qxROxzPskc5OQBVgOcvWBKTw0flB/cetcQla93fKl8Oad2HnLOr2SnGWvJXteb7/m+EOtuBG9is8pnme1P2qfxDBxZ6gkafCPmhPYZl+4jVmY8dqdbnQ0+yPfoOcq5695rDuGedAJSX/Xt + + + + + eJz7x8nAcI5lYDAIILNBYD8HA8N/oJsYuBgY4jgheKDchuw+ZAxy0yGgO/8A6dcDFHbo4QfmcyHYCZy43T8QOBYaj7Bww+Z+XPgoljSALdxh5g0mf+OLL3LNwJc2KcHUSsu0dONIcB+sDPw/gGUz3vAb4LKZGDzY3TcU8GDNH0PFfaN4FA8lfJN34N0wijHxnUFajy1jRcUD6Q587kJ3H73rDVzuIRR+9HInKW5DbpOCAABBQjfn + + + + + eJy9ljFOwzAUhpPS0i7QpW1IjgAXYEXiFByDqYWiDqxsSFyAC1Q0kFyCMrFwhG4IwUxM8iuvL362k1T80q/WsRN/ee/ZTuB7XuDgi45sPnaU+Zl57DhPHdN5wAKhHZP5Mf7F9yqK/fa8/L1180iKG4yvwzkqnn9teOZr333+Opw2RsUEQ587ZJlmvjL0Tyxsc88cN+iNMJ92t/vmhvtUjNLMM4HTxBdmjix5hS57nnci1NjcgVHl8cmvMppynBTvxvP7uOcALPDdD+ozSjEEH3IMn3Urj/+LX1uB8YjlwYUP5rFsy7fulgaLiuGiBh+Y/osvYDGUahB8oYaR1zvnuz1oxkvr0BZDXn88z5SR83WKNXQ3yC0p3a9em5AzwYUvKhgjvzRdL6a9o65uMq8c1wj4wJgSh8SRsO81kS52El/KGBPSTlj7o2G96fh47NQZuBL4VO7A10Ydw56+Jvvp+aGemX9DjQlf4sjXdM3ahO8tmvO4AR+ViRV9au1+ke+KY7+M36J6W0U0vy7S1SDde11E97+ZhZOuW5vCYTZ2WLYRI34+uDKizqRvL7Vm6Np10ZTVNmXCfxvr+37uZT93zDjhld+cj7JQPhgMsO6a0pLUpm3/qyPKovNDb9ubfv5L+7lM58cu2CDd3JsiTt+B/Nxd8NnYbPoR+KTz4xdQH9Hf + + + + + + + + eJyllz1vE0EQhueQnSgIG6OgmIPCpS+WIVCAKCG/A5CgpkJCNkFA/gFQ8tHxB5BwTAR0qSEFEaFLDwIpSY+Y1e3o5uZmP85+pVd7vq99bmZ2NuklAD3r7hwege55RWxjPH6E3nDc9ycD+Is+RB9lBRd/TjJdWcrH36fK77o7BLg3rMe3YudLE/2+pVWAk+gWur1a8NFz55L4eD1Btqc1+EwMJjhuWT4+zyd2/HUxH9MBwPlBfkzPTRU+GTep0HXiW2F5Ir4LC4Ul31Vku2b5eH5DtajFl2rAxzcR+TXvud6oGqB6zPNbZy3FiuqP59dVg5p4fuuu93n5uh2cl9nkd9rRLSXn5znu1vh+4iNLPtIwKY+kQ6zxI/SxUusjMZKIL3Z9aHzmnVpcSI9b+fgcxxfol63qNdIN7Jc30etZ/jvUa2P5YnSxDXAJvdZ233MLuW6j71g+vqZm4aP4a4zLOMfZTH8X5eszXv8i7nnQLN45idivXHxyz5Jaw3kvO/hI+3j9p73nGNfUvxNlvp0sPoau/JJ53z6zoPdF4x+O8+Rl1ucPsmoMPjj4Ug9byvKt9cTTdg81c1B8fNq2o9y3jVxrOQ2wcUttMHO+ZxifTZtfquFvjcLdpNzXfeJ8IY3b+rea35zvDbK9zcrXTQ0aDWr0Zo1P67cUg7Gnh/hq01ef+40wH8+f1m9JPj7SO0d8KL4UP9rr+HdprHJP8/Vb4pP7g2+Pk3xGO6I/UX60HPQC9Rezj/CYd9jfxR+RYzur8h0E+ievb977ZpUr5t+RYy/L4/CwWcSd1vH9Zm6fQnxabxmBuwdtQm7eT4xN/OS5XfT7RT+fr8/5OHhflzZ8FBseIzO+6gO87ufHu4G1K+MX2uv4/wC+58zcJi7cv+y4hWzTfnF+Vr6Y/cT1rGTzOaT/W07H9w== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { "startBattleWithCardInCommandZone": [ "Nahiri Boss Effect"] +} + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/slime_hive.tmx b/forge-gui/res/adventure/Shandalar/maps/map/slime_hive.tmx index ecf7a03ffd1..e9cb5a86113 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/slime_hive.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/slime_hive.tmx @@ -1,5 +1,5 @@ - + @@ -7,17 +7,17 @@ - eJztlDEKgDAMRV1UBD2Ui0fwvJ7GQzhJKBksiW1qajL0wR+kkjzS0K5rNPI5e2sDnmN8foOrlS/25vpvk7xebScJq9JctZzQR8uLYlhCcoh3kfKCfyBwFieHaw7RQuqA/hhpL4lLjhPsEOdR+y3g9hid3uYjfQu+Es+Jmou1E4WVU+ru/vZKgU6evDy5ILWd9oL6tZ1K6nu8O4/cko4uDQ== + eJxjYBgFo4Ay4MY50C7ABF4D7KYPWMSQ3URqmD1jpcg5YPCBAbu7SHUHOqaGuyh1kyPUHY5UdBc6YOOFYGLcA7OfQwBBU9tdv3ggmFjALYDKh7kNOS4PsFPPfchgGlp6d6RB/AxVMJDlJ668NxjL9MHqJlq6C5RnYZhUN9HDXaS4iZaAVPeAAK3dFEaG+bR2EznmD8Z8NxgBAK1JHpE= - eJzNll9OwzAMxieklQax3Wma1CPsEXjkaHALJs6y7QY8bsyk1pyvX5yUFglLn5I2sf2Lk/5pVotF4+jjngvnbNfzqZbluIzKMdlrG9/G+EsmNhfv1TLhWlks0evjkEnNY2I52bruVilPDZOtE/MpSQz9bH4mmXMKUYzF86thLOV/b291Z7USs0xsfWiMdQzfIQxjlXxwHzbLqEuIbU0d3X261ukcYqv3xq550/vsAvfxfNk8iWOFz1HpbP/wPKQxZI2YB01rW+JRJnnWVcjEjMXZhVuO2vOmfp9tKpmDTLmcJUm9Lr3EXvrW1hp57Dg+x/ZdgLkOTSqPS8dtq31W4+eQMum7VvpdiP1uIg+ylHz2bcp0CsPvDjKNEfKzmpXqhN8iMY+pM2L3GFOOUftnOFPsO91l9n0uJqbSv8MUpt9yKRMbUybcP8zr6T8ylbjeWn/868r2FDjTFMm7N5dTz0xuXHis5mLyaoVM9jr3Py5r1LVOkcczVt+PMc9P + eJy1lj1uwzAMhbXYgfNTdO7egxQFuvcWvUKm9hQdfZYepVPmHKEgFAIP7CMp2c4DHmxTNvWZVOSMp1LGwD87bnvP68N2bmW5DNUeE15jftQ9mdi9NhYx4TUT4/k4/mdSRUzsnZkOj9wRE9bJ9qzFmXB+FmMsyoH+HEv5GtsY1zJZLjunnIs0jucen6fvqTrrHauJzf8yVEfPXIaSKmKSuJc/6sXvbd7zYXsmHRdla1v0dKzH510148rE6oKM8ltXI4+M7W/O8ivXe45Dmawt07VUZ88pix73Zm2uYRK/TdUek8eI0pp64y0c6Hmq+6xw9dbJymPr4cG9v5cJ1xv2cCkT+xYpk82p82uPbd89Jta7iE847LXkZ+8ZMWmczcnyWNv/DoypOHVSHpz/Wni817r3sLpp7oxJe2xjWzPNUx8T87yCq4UJ11ULzz24bO96OKyjtc3WsQj3AByT74vkxO/NEnssS/wHYQ/U7g== - eJy1Vktug0AMpeqPiULvlAVJlAN02UVWvU5PQZP0EL0LJOEEXURVW6yZJx7GgUnVPumJCRD72WObSZI+5q7lwvl7Oa1XtBYsnafGXWbzNxAt2zRJ3lLvu2iudfCLdawmsbMLtsQua7pEM/JTNtyHaxXWedC7j9TEeYYmJmKH9sr1bQjlv4eGx8BN8+77vWdOz15Tf4UmK2bO8zb4RM4Qm8ScZN6eUGtCHbFu+R80rcg2WNJa/HH8or923dxy3kWvxCx2xd9p2s83bPFeiBYAeUJMGxXXivxjn6ENuWWgPnLKg8aS6gg43HpdchVUrpvDIm39Wb2gc6uBdxEr70GltEDPLFAwU78B1ClyXAbdeyNGxlfQzPPnOutS7wXj0XV1MTC/hvwL1uEZ+0FPWtD9xn1nxSf4dp4xWJ95TzQ9T1vO3TgXkT7H9BRpOz9A1CADfc81taM5gJoYxaTvDz7Rn6Xr9gf8aPbyMPldHrQ/ns1DcWHu1f+wN5bGsfyKlqPr65m77nzEnjNR5/rZUI/G4Co7X8MH6i3MFXyTWDfmiEDHwijSfj0hBo4L+dFnBytXglz5X1ygCXEx+Vxh7dPJ8An7hYoBz/Et5Xs3Eeezlwc7Vu531J2endCk5zz863usi+uK982at2xf53ml7OP7V6v7Q4Bt1sX7hnMq9wOeIz9PDT+y9jusY7ZyEavr0zj3cE5wtuO653NhPeD7Ej38H+5dAcet63GMfwE+xwJWf8XyB8LPIec= + eJydlm1ugzAMhqnWbYS20i6xK+wGlIqT7AY7Ev06xK6x7s+kfnGGaj+GRd7xYhxKa8lKlID92EmcRFFX5q7RzNVjKfVz6ossXK1anma23iPCso6jaBvXvouqLb1f9IcyiZ2NtyV2mekWZuRnX+nRtwffTz3vcSAT5xlMrIgd7AfXtSEq/54qPXtdVd9+Ptea0twyrlswWTFzntfe5+TFVrEnqpmwj5hbcgKmnGxD99SXmDn/wl+q2ENM4u8y7eYbueS1EBYI8oSYViqu3FhDLRZPSnnQsqB99B/rY/sbyQfnsIibtdQ50TL366yZSoqV1+CgWMDzlUTRjvQ76XJujfg0C1Qz5a49/zBrq14LkY9J3f54jp3BlA7IT4gppTnrPz5vZ+Ob1+eGS0TYoH3C5+JoML1Pa/9or2lIsJbCY/GzZMa83oNzatk39i/2sLSJj0fEOjPX2ENM8IOzhj5qNmyKf9ZQLYGgjxqFWLg2b+Lu2dHxlWptrBg0W6J4mEvzgfFtZH+Hb1FDNA/OAaSIm3oIxf0SypXF1DeG8dEsvIdPrqkBe9e+x5k7d+19yLEwK+LncStm5Ee/HaxciaTKf3aFyfJv5Sk1ciJ2LoZP2C9UDJjHXcpjY+OtA4YksI7MhJqF/c9MImDSdR7+rXrFXGDBuvE7h4Xtwyf+zZV93H+lGu8T2B7PuvsR+yNz7fcD5nU9LwzfQ2t3iOvXePdwTvC2Q+1exu13Ydnj+xYe/ofPrgjHrffjvXfZrUz6jW6dr6H6B2+d87s= @@ -25,49 +25,47 @@ - eJxjYCAPuHEi2K6cqPyBAoPNTW6cg9dNMDwY3IQOng4y99AbLOdgYFjJgSr2eIDDBGQ/LF4cWRE0jI2sjt4A7AYuBoYwoN3/ODHdhA2AwngFlnCmBngODYNPaGEBCy8YBoXVDx5EfIP4TziJT/9svAhMCjjAAcEgMI0BdzySkw/JdRMIoIcXDCynQRzBwhyXnTBgzEh9u3EBbGGO7D50t25iw20WIX/BAKGwJWQOMfkH3QwQn1j3URPgC8uBACvQ0uAtFgaG2yzUtSOCnTT1oLaAxyAIG3IBoXgdDPE+mMA8npFpNy0AAKwTN0M= + eJzNlkFOwzAQRQ0SYBeCuuQusE1b9QTchVNwANhSKDdimbb0GHhwvjKZ2rGNg9ovjZI2jv38ZzKJUn/TzHTnten/PpZSmWami9i1kn3JNcZgGhoX0u7ChW+uEFNozQ+t1FrEpy5jktpm8FAsbFxPlXqx415tvFmefaJPNPZdx5lyeDjT/ZlSDzYak+4TjZUeNAneDvH87s8ev43bL7Hl+BTS18Qd4SM4YyySed76lSvki+5F3N04LuljChOdb9pcERM8yhH32MeFOltGaggiFqon7Ae1dFl1IYWa5oLHCPhGXLTPlU5jgicL039+SCEm5Pi8cj0Eov08VW4e6VsdYeFMTZs3mm/ZrsX9kz2dP6e1GI/1aU7qb1vT/2/DaiSlH8Mv7r8U76/IMR0n08PAHOSbrDG537k5ZCGf92ytkLhHIVG+MCfCV/s8l9IH+LyO8IApxh2SrHte6+jX3NP/Emplpfu9GP2Te+HLb44er/LZkG/UoG/dEqYSDa1H155vh6+n8I71LbuLzHMM/0p0Ct/4UMp7IeW9MaZ+AIaemRA= - - - + - + - + - + - + - + - + - + - + - { "startBattleWithCard": [ "Slime Boss Effect"] + { "startBattleWithCardInCommandZone": [ "Slime Boss Effect"] } - + @@ -75,16 +73,19 @@ - - + + - + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/slimefoot_boss.tmx b/forge-gui/res/adventure/Shandalar/maps/map/slimefoot_boss.tmx index a651e32ab4e..cc8c7a7d7ee 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/slimefoot_boss.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/slimefoot_boss.tmx @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - eJyL5mVg2MWDH0cRoQaEo4lUBzJPFkjjA7XcDAx7CKgBAZCdu4lQBwLSPPjtJdZOUgE+e2llJz57aWknLntpbScue6VpbOdgs5ceYNTeUXtH7aWOvcTUl8gYGZCqFxkDAGuQN1o= + eJyL5mVg2MWDH0cRoQaEo4lUBzJPFkjTG0jzjNo7au+ovaP2jto7au/gsJeY+hIZIwNS9SJjAAIUL00= @@ -42,6 +42,8 @@ + { "startBattleWithCardInCommandZone": [ "Slimefoot's Boss Effect"] +} diff --git a/forge-gui/res/adventure/Shandalar/maps/map/teferi.tmx b/forge-gui/res/adventure/Shandalar/maps/map/teferi.tmx new file mode 100644 index 00000000000..b1504b16785 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/teferi.tmx @@ -0,0 +1,81 @@ + + + + + + + + + + eJzVkkEKwjAQRQMaszLLHkYoXsmNV8lK0CN4mm7sWcQOEjImPyGTRsQPn6YDnTf5U6U+dTcqEdW8r6qPcwzE/BW3F7PEzXnSqX0vp7/DJYYreBJw+dwS7nmXzsy5dI73w/vHmdVyh+X9tn/b6cA+WhAiUAuXNNrw5Ptq5ZbM7zVm+tdySSeDXeI+lv4zYCAu7UKimJu7Y4nrv6nJ4bLB9RouEsoF6bDF9adJ2bMNlkqSP+e0sLgoe8l/2Etr5/4nvQB8DZ5Y + + + + + eJwrYGdgKBgkGASQ2djAQNlLC7tJAeh6W/gQmBZ2fuCAYH0uCA2y5yMHwj5s9qKHIzpNDChlY2AQZUfFHDwI96BjdPeSA0TZETQ67uOE4DYCmBTwixlhPjZ7QYAYe0kF11lJ14MPEIoTWtmLC+hxQdIrDM+nj7UYQJRAeickTy4ApYltNDJ7FAwvAAAbI1g2 + + + + + eJxjYBgaYAM7Kh7q9rYxEqfuGisqpjUA2fGeg4FhFgsDgz4XKsYHPnBAMCX29nIyMIhiCeN2PGHVxwnB5AIDoL9UmDDt9SQQPyD12NxKLAD5CWYGslmEzEVXSypAt5MSPFD2EuMeWJqlh73oWGQA7ERPP5TiMjYGhnIgrmAbGL+MYtpiADBJMKU= + + + + + + + + eJxjYICAlewMDKuAeDUQrwHiaayomBCoY8Qvbwg0wwiLOe4cDAweQOwJxF4cmPYSsluGCb/8eaD+C3jMINZ/QwUsZMYUm8FCmhlt0LicxYKKO7DE8St2CG1Pgh243KMCjctqXghdBaXVgOIeaHbD7KUUgPzaDjW7HcoG+dMYaPcaTgaGZ0j2LkXSZ8xLmZ0gv4oC/SCC5A81pLSMbG81FruWYgoRBCC7trEh2DCwA4n9DEscY7OfVHth4BDQj4eBWBOIwzggYqB4Rre3DOjOciCuYIPEAzJA52MDBlwQe2FpCJceZHtBcQrSA4oXMSQ3LwPicqQwAIXHHGaEHlIByPwOJlR3bQKKbQbiLeyodqHbYYWWd2D6QTTIDE0mVD0a0PAGYVWgm9XQywdmKEYDk9mIx0bsCPc3M0FwC1JaBrnNgJ04s7CF/1JuBBs5bHI4IHoM8Zidx4EII2O0OEQGyOGPDyCno7NklkGE0i8heVz2outDT0fIAABjWlca + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { "startBattleWithCard": [ "Eidolon of Rhetoric","Static Orb","Grafdigger's Cage","Torpor Orb"] +} + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/collision.tx b/forge-gui/res/adventure/Shandalar/maps/obj/collision.tx new file mode 100644 index 00000000000..4a1d90320cb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/collision.tx @@ -0,0 +1,8 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/manashards.tx b/forge-gui/res/adventure/Shandalar/maps/obj/manashards.tx new file mode 100644 index 00000000000..808056ba3bf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/manashards.tx @@ -0,0 +1,20 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx b/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx index c2c7fa70f43..5cde5a2a859 100644 --- a/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx @@ -3496,6 +3496,18 @@ + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.atlas index 34ba9b07211..800907a0e5b 100644 --- a/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.atlas +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.atlas @@ -1,17 +1,56 @@ crab.png -size: 189,30 +size: 128,128 format: RGBA8888 filter: Nearest,Nearest repeat: none Avatar - xy: 18,12 - size: 27,12 + xy: 10, 87 + size: 13, 7 Idle - xy: 0, 1 - size: 61, 29 + xy: 0, 0 + size: 32, 32 Idle - xy: 67, 1 - size: 57, 31 + xy: 32, 00 + size: 32, 32 Idle - xy: 129, 0 - size: 56, 30 \ No newline at end of file + xy: 64, 00 + size: 32, 32 +Idle + xy: 96, 00 + size: 32, 32 +Walk + xy: 0, 32 + size: 32, 32 +Walk + xy: 32, 32 + size: 32, 32 +Walk + xy: 64, 32 + size: 32, 32 +Walk + xy: 96, 32 + size: 32, 32 +Attack + xy: 0, 96 + size: 32, 32 +Attack + xy: 32, 96 + size: 32, 32 +Attack + xy: 64, 96 + size: 32, 32 +Attack + xy: 96, 96 + size: 32, 32 +Death + xy: 0, 64 + size: 32, 32 +Death + xy: 32, 64 + size: 32, 32 +Death + xy: 64, 64 + size: 32, 32 +Death + xy: 96, 64 + size: 32, 32 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.png index d438ade69f1..3b35190aba6 100644 Binary files a/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.png and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/crab.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/fox.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/fox.atlas new file mode 100644 index 00000000000..6e9a6ad1447 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/fox.atlas @@ -0,0 +1,119 @@ +fox.png +size: 448,224 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 48, 49 + size: 11, 10 +Idle + xy: 0, 32 + size: 32, 32 +Idle + xy: 32, 32 + size: 32, 32 +Idle + xy: 64, 32 + size: 32, 32 +Idle + xy: 96, 32 + size: 32, 32 +Idle + xy: 128, 32 + size: 32, 32 +Idle + xy: 160, 32 + size: 32, 32 +Idle + xy: 192, 32 + size: 32, 32 +Idle + xy: 224, 32 + size: 32, 32 +Idle + xy: 256, 32 + size: 32, 32 +Idle + xy: 288, 32 + size: 32, 32 +Idle + xy: 320, 32 + size: 32, 32 +Idle + xy: 352, 32 + size: 32, 32 +Idle + xy: 384, 32 + size: 32, 32 +Idle + xy: 416, 32 + size: 32, 32 +Walk + xy: 0, 96 + size: 32, 32 +Walk + xy: 32, 96 + size: 32, 32 +Walk + xy: 64, 96 + size: 32, 32 +Walk + xy: 96, 96 + size: 32, 32 +Walk + xy: 128, 96 + size: 32, 32 +Walk + xy: 160, 96 + size: 32, 32 +Walk + xy: 192, 96 + size: 32, 32 +Walk + xy: 224, 96 + size: 32, 32 +Walk + xy: 256, 96 + size: 32, 32 +Walk + xy: 288, 96 + size: 32, 32 +Walk + xy: 320, 96 + size: 32, 32 +Attack + xy: 0, 128 + size: 32, 32 +Attack + xy: 32, 128 + size: 32, 32 +Attack + xy: 64, 128 + size: 32, 32 +Attack + xy: 96, 128 + size: 32, 32 +Attack + xy: 128, 128 + size: 32, 32 +Death + xy: 0, 192 + size: 32, 32 +Death + xy: 32, 192 + size: 32, 32 +Death + xy: 64, 192 + size: 32, 32 +Death + xy: 96, 192 + size: 32, 32 +Death + xy: 128, 192 + size: 32, 32 +Death + xy: 160, 192 + size: 32, 32 +Death + xy: 192, 192 + size: 32, 32 diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/fox.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/fox.png new file mode 100644 index 00000000000..aad60b6b5aa Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/fox.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/garruk.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/garruk.atlas new file mode 100644 index 00000000000..33d9c6a9703 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/garruk.atlas @@ -0,0 +1,11 @@ +garruk.png +size: 42,42 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 4,10 + size: 29,20 +Idle + xy: 0,0 + size: 41, 42 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/garruk.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/garruk.png new file mode 100644 index 00000000000..73cab4ab061 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/garruk.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/giant_crab.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/giant_crab.atlas new file mode 100644 index 00000000000..d8756a8043d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/giant_crab.atlas @@ -0,0 +1,17 @@ +giant_crab.png +size: 189,30 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 18,12 + size: 27,12 +Idle + xy: 0, 0 + size: 62, 30 +Idle + xy: 62, 0 + size: 62, 30 +Idle + xy: 124, 0 + size: 62, 30 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/giant_crab.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/giant_crab.png new file mode 100644 index 00000000000..d438ade69f1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/giant_crab.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/kobold.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/kobold.atlas new file mode 100644 index 00000000000..ee7011f329d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/kobold.atlas @@ -0,0 +1,89 @@ +kobold.png +size: 256,192 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 12, 13 + size: 14, 11 +Idle + xy: 0, 0 + size: 32, 32 +Idle + xy: 32, 0 + size: 32, 32 +Idle + xy: 64, 0 + size: 32, 32 +Idle + xy: 96, 0 + size: 32, 32 +Walk + xy: 0, 32 + size: 32, 32 +Walk + xy: 32, 32 + size: 32, 32 +Walk + xy: 64, 32 + size: 32, 32 +Walk + xy: 96, 32 + size: 32, 32 +Walk + xy: 128, 32 + size: 32, 32 +Walk + xy: 160, 32 + size: 32, 32 +Walk + xy: 192, 32 + size: 32, 32 +Walk + xy: 224, 32 + size: 32, 32 +Attack + xy: 0, 64 + size: 32, 32 +Attack + xy: 32, 64 + size: 32, 32 +Attack + xy: 64, 64 + size: 32, 32 +Attack + xy: 96, 64 + size: 32, 32 +Attack + xy: 128, 64 + size: 32, 32 +Attack + xy: 160, 64 + size: 32, 32 +Attack + xy: 192, 64 + size: 32, 32 +Attack + xy: 224, 64 + size: 32, 32 +Death + xy: 0, 128 + size: 32, 32 +Death + xy: 32, 128 + size: 32, 32 +Death + xy: 64, 128 + size: 32, 32 +Death + xy: 96, 128 + size: 32, 32 +Death + xy: 128, 128 + size: 32, 32 +Death + xy: 160, 128 + size: 32, 32 +Death + xy: 192, 128 + size: 32, 32 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/kobold.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/kobold.png new file mode 100644 index 00000000000..bf1baf9c2a8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/kobold.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/mammoth.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/mammoth.atlas new file mode 100644 index 00000000000..1b1a8a8c820 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/mammoth.atlas @@ -0,0 +1,47 @@ +mammoth.png +size: 648,214 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 23, 17 + size: 46, 41 +Idle + xy: 0, 70 + size: 92, 60 +Idle + xy: 94, 70 + size: 92, 60 +Idle + xy: 180, 70 + size: 92, 60 +Idle + xy: 270, 70 + size: 92, 60 +Idle + xy: 470, 70 + size: 92, 60 +Idle + xy: 450, 70 + size: 92, 60 +Idle + xy: 550, 70 + size: 92, 60 +Attack + xy: 6, 155 + size: 86, 60 +Attack + xy: 109, 153 + size: 90, 61 +Attack + xy: 217, 156 + size: 87, 57 +Attack + xy: 332, 146 + size: 113, 68 +Attack + xy: 447, 141 + size: 102, 75 +Attack + xy: 553, 147 + size: 95, 68 diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/mammoth.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/mammoth.png new file mode 100644 index 00000000000..f8abba09b59 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/mammoth.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/nahiri.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/nahiri.atlas new file mode 100644 index 00000000000..215725ae7db --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/nahiri.atlas @@ -0,0 +1,11 @@ +nahiri.png +size: 49,51 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 7,15 + size: 23,18 +Idle + xy: 0,3 + size: 49, 47 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/nahiri.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/nahiri.png new file mode 100644 index 00000000000..b55c42110c1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/nahiri.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/ooze.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/ooze.atlas new file mode 100644 index 00000000000..93a676e8172 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/ooze.atlas @@ -0,0 +1,93 @@ +ooze.png +size: 256,160 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 9, 151 + size: 15, 9 +Idle + xy: 0, 0 + size: 32, 32 +Idle + xy: 32, 0 + size: 32, 32 +Idle + xy: 64, 0 + size: 32, 32 +Idle + xy: 96, 0 + size: 32, 32 +Idle + xy: 0, 96 + size: 32, 32 +Idle + xy: 32, 96 + size: 32, 32 +Idle + xy: 64, 96 + size: 32, 32 +Idle + xy: 96, 96 + size: 32, 32 +Walk + xy: 0, 32 + size: 32, 32 +Walk + xy: 32, 32 + size: 32, 32 +Walk + xy: 64, 32 + size: 32, 32 +Walk + xy: 96, 32 + size: 32, 32 +Walk + xy: 128, 32 + size: 32, 32 +Walk + xy: 160, 32 + size: 32, 32 +Walk + xy: 192, 32 + size: 32, 32 +Walk + xy: 224, 32 + size: 32, 32 +Attack + xy: 0, 64 + size: 32, 32 +Attack + xy: 32, 64 + size: 32, 32 +Attack + xy: 64, 64 + size: 32, 32 +Attack + xy: 96, 64 + size: 32, 32 +Attack + xy: 128, 64 + size: 32, 32 +Attack + xy: 160, 64 + size: 32, 32 +Death + xy: 0, 128 + size: 32, 32 +Death + xy: 32, 128 + size: 32, 32 +Death + xy: 64, 128 + size: 32, 32 +Death + xy: 96, 128 + size: 32, 32 +Death + xy: 128, 128 + size: 32, 32 +Death + xy: 160, 128 + size: 32, 32 + diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/ooze.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/ooze.png new file mode 100644 index 00000000000..a6a51e31168 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/ooze.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/oozeboss.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/oozeboss.atlas new file mode 100644 index 00000000000..816f6443dae --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/oozeboss.atlas @@ -0,0 +1,20 @@ +oozeboss.png +size: 246,91 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 83,57 + size: 34, 25 +Idle + xy: 0, 0 + size: 64, 40 +Idle + xy: 64, 0 + size: 64, 40 +Idle + xy: 128, 0 + size: 64, 40 +Idle + xy: 192,0 + size: 64, 40 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/oozeboss.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/oozeboss.png new file mode 100644 index 00000000000..7651a00f651 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/oozeboss.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/slime.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/slime.atlas deleted file mode 100644 index f64bbe06e19..00000000000 --- a/forge-gui/res/adventure/Shandalar/sprites/dungeon/slime.atlas +++ /dev/null @@ -1,29 +0,0 @@ -slime.png -size: 480,230 -format: RGBA8888 -filter: Nearest,Nearest -repeat: none -Avatar - xy: 51,38 - size: 43, 39 -Idle - xy: 18, 10 - size: 87, 97 -Idle - xy: 116, 12 - size: 88, 89 -Idle - xy: 211, 18 - size: 88, 88 -Attack - xy: 16, 152 - size: 108, 83 -Attack - xy: 127, 125 - size: 110, 105 -Attack - xy: 252, 107 - size: 116, 123 -Attack - xy: 378, 125 - size: 100, 94 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/slime.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/slime.png deleted file mode 100644 index 22000764cd6..00000000000 Binary files a/forge-gui/res/adventure/Shandalar/sprites/dungeon/slime.png and /dev/null differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/squirrel.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/squirrel.atlas new file mode 100644 index 00000000000..3c9ffd4cb2f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/squirrel.atlas @@ -0,0 +1,74 @@ +squirrel.png +size: 256,224 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 14, 179 + size: 10, 10 +Idle + xy: 0, 0 + size: 32, 32 +Idle + xy: 32, 0 + size: 32, 32 +Idle + xy: 64, 0 + size: 32, 32 +Idle + xy: 96, 0 + size: 32, 32 +Idle + xy: 128, 0 + size: 32, 32 +Idle + xy: 160, 0 + size: 32, 32 +Walk + xy: 0, 64 + size: 32, 32 +Walk + xy: 32, 64 + size: 32, 32 +Walk + xy: 64, 64 + size: 32, 32 +Walk + xy: 96, 64 + size: 32, 32 +Walk + xy: 128, 64 + size: 32, 32 +Walk + xy: 160, 64 + size: 32, 32 +Walk + xy: 192, 64 + size: 32, 32 +Walk + xy: 224, 64 + size: 32, 32 +Attack + xy: 0, 160 + size: 32, 32 +Attack + xy: 32, 160 + size: 32, 32 +Attack + xy: 64, 160 + size: 32, 32 +Attack + xy: 96, 160 + size: 32, 32 +Death + xy: 0, 96 + size: 32, 32 +Death + xy: 32, 96 + size: 32, 32 +Death + xy: 64, 96 + size: 32, 32 +Death + xy: 96, 96 + size: 32, 32 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/squirrel.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/squirrel.png new file mode 100644 index 00000000000..822571b172d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/squirrel.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/teferi.atlas b/forge-gui/res/adventure/Shandalar/sprites/dungeon/teferi.atlas new file mode 100644 index 00000000000..c29bb781454 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dungeon/teferi.atlas @@ -0,0 +1,11 @@ +teferi.png +size: 57,51 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 15,10 + size: 26,20 +Idle + xy: 1,1 + size: 50, 41 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dungeon/teferi.png b/forge-gui/res/adventure/Shandalar/sprites/dungeon/teferi.png new file mode 100644 index 00000000000..51827a77459 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dungeon/teferi.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/items.atlas b/forge-gui/res/adventure/Shandalar/sprites/items.atlas index d999ae65cb7..4524cc54767 100644 --- a/forge-gui/res/adventure/Shandalar/sprites/items.atlas +++ b/forge-gui/res/adventure/Shandalar/sprites/items.atlas @@ -341,4 +341,13 @@ BlueStaff size: 16, 16 WhiteStaff xy: 352,160 - size: 16, 16 \ No newline at end of file + size: 16, 16 +GarrukAxe + xy: 303,273 + size: 19, 15 +BlueRobes + xy: 272,63 + size: 16, 18 +Armory + xy: 129,512 + size: 14, 17 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/manashards.atlas b/forge-gui/res/adventure/Shandalar/sprites/manashards.atlas new file mode 100644 index 00000000000..c2af9ee4520 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/manashards.atlas @@ -0,0 +1,17 @@ +treasure.png +size: 64,144 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Idle + xy: 0, 128 + size: 16, 16 +Idle + xy: 16, 128 + size: 16, 16 +Idle + xy: 32, 128 + size: 16, 16 +Idle + xy: 48, 128 + size: 16, 16 diff --git a/forge-gui/res/adventure/Shandalar/sprites/treasure.png b/forge-gui/res/adventure/Shandalar/sprites/treasure.png index a25b381e9bf..da1337791ba 100644 Binary files a/forge-gui/res/adventure/Shandalar/sprites/treasure.png and b/forge-gui/res/adventure/Shandalar/sprites/treasure.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/spellsmith.json b/forge-gui/res/adventure/Shandalar/ui/spellsmith.json index 61320be687f..cef15e2456f 100644 --- a/forge-gui/res/adventure/Shandalar/ui/spellsmith.json +++ b/forge-gui/res/adventure/Shandalar/ui/spellsmith.json @@ -181,7 +181,7 @@ { "type": "Label", "name": "colorLabel", - "text": "tr(lblColors)", + "text": "[/][BLACK]tr(lblColors)", "x": 10, "y": 90, "width": 100, @@ -190,7 +190,7 @@ { "type": "Label", "name": "vnXYKZJw_P5wMnHa1tH7-3", - "text": "tr(lblPlane)", + "text": "[/][BLACK]tr(lblPlane)", "x": 10, "y": 30, "width": 100, @@ -209,7 +209,7 @@ { "type": "Label", "name": "vnXYKZJw_P5wMnHa1tH7-5", - "text": "tr(lblManaCost)", + "text": "[/][BLACK]tr(lblManaCost)", "x": 10, "y": 150, "width": 100, @@ -258,7 +258,7 @@ { "type": "Label", "name": "vnXYKZJw_P5wMnHa1tH7-10", - "text": "tr(lblRarity)", + "text": "[/][BLACK]tr(lblRarity)", "x": 10, "y": 210, "width": 100, diff --git a/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json b/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json index 4f53981461f..ce7935278ae 100644 --- a/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/spellsmith_portrait.json @@ -189,7 +189,7 @@ { "type": "Label", "name": "colorLabel", - "text": "tr(lblColors)", + "text": "[/][BLACK]tr(lblColors)", "x": 10, "y": 260, "width": 100, @@ -198,7 +198,7 @@ { "type": "Label", "name": "vnXYKZJw_P5wMnHa1tH7-3", - "text": "tr(lblPlane)", + "text": "[/][BLACK]tr(lblPlane)", "x": 10, "y": 190, "width": 100, @@ -217,7 +217,7 @@ { "type": "Label", "name": "vnXYKZJw_P5wMnHa1tH7-5", - "text": "tr(lblManaCost)", + "text": "[/][BLACK]tr(lblManaCost)", "x": 10, "y": 360, "width": 100, @@ -266,7 +266,7 @@ { "type": "Label", "name": "vnXYKZJw_P5wMnHa1tH7-10", - "text": "tr(lblRarity)", + "text": "[/][BLACK]tr(lblRarity)", "x": 10, "y": 427, "width": 100, diff --git a/forge-gui/res/adventure/Shandalar/world/blue.json b/forge-gui/res/adventure/Shandalar/world/blue.json index 63705ee15d7..8c7bc8e7a08 100644 --- a/forge-gui/res/adventure/Shandalar/world/blue.json +++ b/forge-gui/res/adventure/Shandalar/world/blue.json @@ -48,7 +48,10 @@ "Sea Monster", "Tarkir Djinn", "Doppelganger", - "Pirate" + "Pirate", + "Illusionist", + "Water Elemental", + "Crab" ], "pointsOfInterest": [ "Blue Castle", @@ -82,6 +85,7 @@ "CaveU3", "CaveU4", "Kiora Island", + "Teferi Hideout", "Jacehold" ], "structures": [ diff --git a/forge-gui/res/adventure/Shandalar/world/enemies.json b/forge-gui/res/adventure/Shandalar/world/enemies.json index 87d93e54bb5..1ceb38ff47a 100644 --- a/forge-gui/res/adventure/Shandalar/world/enemies.json +++ b/forge-gui/res/adventure/Shandalar/world/enemies.json @@ -367,6 +367,79 @@ ], "colors": "GW" }, +{ + "name": "Armored Knight", + "sprite": "sprites/knight.atlas", + "deck": [ + "decks/armored_knight.dck" + ], + "spawnRate": 1, + "difficulty": 0.1, + "speed": 30, + "life": 15, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common", + "basicland" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 10, + "addMaxCount": 90 + } + ], + "colors": "RW" +}, { "name": "Ashmouth Devil", "sprite": "sprites/devil.atlas", @@ -1595,20 +1668,20 @@ } ], "colors": "RU" - }, - { +}, +{ "name": "Crab", "sprite": "sprites/dungeon/crab.atlas", - "scale": 0.5, + "scale": 0.9, "deck": [ - "decks/crab.dck" + "decks/crab.json" ], "ai": "", "flying": false, "spawnRate": 1, - "difficulty": 0.4, - "speed": 31, - "life": 15, + "difficulty": 0.1, + "speed": 20, + "life": 11, "rewards": [ { "type": "deckCard", @@ -1656,8 +1729,8 @@ } ], "colors": "UB" -}, -{ + }, + { "name": "Curselord", "sprite": "sprites/black_wiz2.atlas", "deck": [ @@ -1686,21 +1759,12 @@ "count": 1, "addMaxCount": 2, "rarity": [ - "uncommon" + "rare" ], "cardTypes": [ "Enchantment" ] }, - { - "cardTypes": [ - "Creature", - "Artifact", - "Enchantment", - "Instant", - "Sorcery" - ] - }, { "type": "deckCard", "probability": 0.1, @@ -1712,6 +1776,12 @@ "Land" ] }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Lightning Bolt" + }, { "type": "gold", "probability": 0.3, @@ -2112,6 +2182,67 @@ ], "colors": "R" }, +{ + "name": "Giant Crab", + "sprite": "sprites/dungeon/giant_crab.atlas", + "scale": 0.5, + "deck": [ + "decks/giant_crab.dck" + ], + "ai": "", + "flying": false, + "spawnRate": 1, + "difficulty": 0.4, + "speed": 31, + "life": 15, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common", + "basicland" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "gold", + "probability": 1, + "count": 50, + "addMaxCount": 100 + } + ], + "colors": "U" +}, { "name": "Dino", "sprite": "sprites/ancient.atlas", @@ -2190,6 +2321,43 @@ ], "colors": "RW" }, +{ + "name": "Disciple of Teferi", + "sprite": "sprites/monk.atlas", + "deck": [ + "decks/disciple_of_teferi.dck" + ], + "spawnRate": 1, + "difficulty": 0.1, + "speed": 23, + "life": 12, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 1, + "count": 3, + "colors": [ + "Blue" + ], + "rarity": [ + "Rare" + ] + } + ], + "colors": "WUR" +}, { "name": "Djinn", "sprite": "sprites/djinn.atlas", @@ -3140,6 +3308,67 @@ ], "colors": "R" }, +{ + "name": "Fox", + "sprite": "sprites/dungeon/fox.atlas", + "deck": [ + "decks/fox.json" + ], + "ai": "", + "flying": false, + "spawnRate": 1, + "difficulty": 0.1, + "speed": 15, + "scale": 0.75, + "life": 10, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 1, + "rarity": [ + "Common" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "rarity": [ + "Rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "gold", + "probability": 1, + "count": 30, + "addMaxCount": 100 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "White" + ] + } + ], + "colors": "W" +}, { "name": "Frost Titan", "sprite": "sprites/titan.atlas", @@ -3365,6 +3594,63 @@ ], "colors": "W" }, +{ + "name": "Garruk", + "sprite": "sprites/dungeon/garruk.atlas", + "deck": [ + "decks/miniboss/garruk.dck" + ], + "spawnRate": 1, + "scale": 0.5, + "difficulty": 1, + "speed": 30, + "life": 20, + "rewards": [ + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Garruk Wildspeaker" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Garruk, Apex Predator" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Exploration" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Primeval Titan" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "In Garruk's Wake" + }, + { + "type": "gold", + "probability": 1, + "count": 100, + "addMaxCount": 900 + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Garruk's Mighty Axe" + } + ], + "colors": "GB" +}, { "name": "Geist", "sprite": "sprites/ghost.atlas", @@ -3567,6 +3853,75 @@ ], "colors": "G" }, +{ + "name": "Mammoth", + "sprite": "sprites/dungeon/mammoth.atlas", + "deck": [ + "decks/mammoth.dck" + ], + "ai": "", + "flying": false, + "spawnRate": 1, + "difficulty": 0.1, + "speed": 15, + "scale": 0.35, + "life": 25, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 1, + "rarity": [ + "Common" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "rarity": [ + "Rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "gold", + "probability": 1, + "count": 30, + "addMaxCount": 100 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "White" + ] + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "Green" + ] + } + ], + "colors": "WG" +}, { "name": "Pirate", "sprite": "sprites/pirate.atlas", @@ -3636,11 +3991,79 @@ "colors": "UR" }, { - "name": "Slime Boss", - "sprite": "sprites/dungeon/slime.atlas", + "name": "Ooze", + "sprite": "sprites/dungeon/ooze.atlas", + "deck": [ + "decks/ooze.json" + ], + "ai": "", + "flying": false, + "spawnRate": 1, + "difficulty": 0.1, + "speed": 15, + "life": 12, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 1, + "rarity": [ + "Common" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "rarity": [ + "Rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "gold", + "probability": 1, + "count": 30, + "addMaxCount": 100 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "Green" + ] + }, + { + "type": "card", + "probability": 0.5, + "count": 1, + "colors": [ + "Blue" + ] + } + ], + "colors": "UG" +}, +{ + "name": "Ooze Boss", + "sprite": "sprites/dungeon/oozeboss.atlas", "scale": 0.5, "deck": [ - "decks/slime_boss.dck" + "decks/miniboss/ooze_boss.dck" ], "spawnRate": 1, "difficulty": 0.1, @@ -3648,12 +4071,6 @@ "life": 30, "rewards": [ { - "type": "deckCard", - "probability": 1, - "count": 3, - "addMaxCount": 7 - }, - { "type": "item", "probability": 1, "count": 1, @@ -3682,7 +4099,25 @@ "probability": 1, "count": 1, "cardName": "Dark Ritual" - } + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Biogenic Ooze" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Gelatinous Cube" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Scavenging Ooze" + } ], "colors": "GB" }, @@ -5024,7 +5459,7 @@ { "type": "card", "probability": 0.5, - "count": 3, + "count": 1, "colors": [ "Blue" ], @@ -5112,7 +5547,7 @@ "name": "Jace", "sprite": "sprites/dungeon/jace.atlas", "deck": [ - "decks/miniboss/jace_boss.dck" + "decks/miniboss/jace.dck" ], "spawnRate": 1, "scale": 0.5, @@ -5139,45 +5574,22 @@ "cardName": "Jace's Defeat" }, { - "type": "deckCard", - "probability": 0.5, - "count": 1, - "addMaxCount": 2, - "rarity": [ - "uncommon" - ], - "cardTypes": [ - "Creature", - "Artifact", - "Enchantment", - "Instant", - "Sorcery" - ] - }, - { - "type": "deckCard", + "type": "card", "probability": 1, - "count": 2, - "addMaxCount": 5, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Creature", - "Enchantment", - "Sorcery" - ] + "count": 1, + "cardName": "Treasure Cruise" }, { - "type": "deckCard", - "probability": 0.1, + "type": "card", + "probability": 1, "count": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Land" - ] + "cardName": "Castaway's Despair" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Counterspell" }, { "type": "gold", @@ -5358,55 +5770,6 @@ "type": "deckCard", "probability": 1, "count": 2, - "addMaxCount": 4, - "rarity": [ - "common", - "basicland" - ] - }, - { - "type": "deckCard", - "probability": 0.5, - "count": 1, - "addMaxCount": 2, - "rarity": [ - "uncommon" - ], - "cardTypes": [ - "Creature" - ] - }, - { - "type": "deckCard", - "probability": 0.25, - "count": 1, - "addMaxCount": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Creature", - "Artifact", - "Enchantment", - "Instant", - "Sorcery" - ] - }, - { - "type": "deckCard", - "probability": 1, - "count": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Land" - ] - }, - { - "type": "deckCard", - "probability": 1, - "count": 1, "rarity": [ "rare" ], @@ -5438,6 +5801,30 @@ "count": 1, "cardName": "Kiora, the Crashing Wave" }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Kiora Bests the Sea God" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Kiora, Behemoth Beckoner" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Kiora, Master of the Depths" + }, + { + "type": "card", + "probability": 1, + "count": 4, + "cardName": "Kiora's Follower" + }, { "type": "item", "probability": 1, @@ -5486,7 +5873,7 @@ }, { "name": "Kobold", - "sprite": "sprites/imp.atlas", + "sprite": "sprites/dungeon/kobold.atlas", "deck": [ "decks/kobold.dck" ], @@ -5495,7 +5882,48 @@ "spawnRate": 1, "difficulty": 0.1, "speed": 31, - "life": 16, + "scale": 0.75, + "life": 12, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common", + "basicland" + ] + }, + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "uncommon", + "rare" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 10, + "addMaxCount": 90 + } + ], + "colors": "RB" +}, +{ + "name": "Kor Warrior", + "sprite": "sprites/mineguard.atlas", + "deck": [ + "decks/kor_warrior.dck" + ], + "spawnRate": 1, + "difficulty": 0.1, + "speed": 30, + "life": 15, "rewards": [ { "type": "deckCard", @@ -5516,7 +5944,11 @@ "uncommon" ], "cardTypes": [ - "kobold" + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" ] }, { @@ -5553,7 +5985,7 @@ "addMaxCount": 90 } ], - "colors": "RB" + "colors": "RW" }, { "name": "Lich", @@ -6240,6 +6672,69 @@ ], "colors": "W" }, +{ + "name": "Nahiri", + "sprite": "sprites/dungeon/nahiri.atlas", + "deck": [ + "decks/miniboss/nahiri.dck" + ], + "spawnRate": 1, + "scale": 0.5, + "difficulty": 0.1, + "speed": 30, + "life": 35, + "rewards": [ + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Nahiri, Heir of the Ancients" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Embercleave" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Skullclamp" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Lightning Bolt" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Wheel of Fortune" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Sword of Fire and Ice" + }, + { + "type": "gold", + "probability": 1, + "count": 100, + "addMaxCount": 900 + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Nahiri's Armory" + } + ], + "colors": "RW" +}, { "name": "Pirate", "sprite": "sprites/pirate.atlas", @@ -6841,56 +7336,7 @@ "speed": 31, "life": 25, "rewards": [ - { - "type": "deckCard", - "probability": 1, - "count": 2, - "addMaxCount": 4, - "rarity": [ - "common", - "basicland" - ] - }, - { - "type": "deckCard", - "probability": 0.5, - "count": 1, - "addMaxCount": 2, - "rarity": [ - "uncommon" - ], - "cardTypes": [ - "Creature" - ] - }, - { - "type": "deckCard", - "probability": 0.25, - "count": 1, - "addMaxCount": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Creature", - "Artifact", - "Enchantment", - "Instant", - "Sorcery" - ] - }, - { - "type": "deckCard", - "probability": 1, - "count": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Land" - ] - }, - { + { "type": "deckCard", "probability": 1, "count": 1, @@ -6918,6 +7364,24 @@ "probability": 1, "count": 1, "cardName": "Slimefoot, Thallid Transplant" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Ghave, Guru of Spores" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Corpsejack Menace" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Mycoloth" }, { "type": "card", @@ -7102,6 +7566,33 @@ ], "colors": "BG" }, +{ + "name": "Squirrel", + "sprite": "sprites/dungeon/squirrel.atlas", + "deck": [ + "decks/squirrel.dck" + ], + "spawnRate": 1, + "difficulty": 0.1, + "speed": 23, + "scale": 0.5, + "life": 13, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 3, + "addMaxCount": 7 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ], + "colors": "BG" +}, { "name": "Symbiote", "sprite": "sprites/basilisk_3.atlas", @@ -7204,6 +7695,71 @@ ], "colors": "RU" }, +{ + "name": "Teferi", + "sprite": "sprites/dungeon/teferi.atlas", + "scale": 0.5, + "deck": [ + "decks/miniboss/teferi_boss.dck" + ], + "ai": "", + "flying": false, + "spawnRate": 1, + "difficulty": 0.8, + "speed": 31, + "life": 25, + "rewards": [ + { + "type": "gold", + "probability": 1, + "count": 500, + "addMaxCount": 1000 + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Swords to Plowshares" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Teferi's Protection" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Brainstorm" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Teferi, Hero of Dominaria" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Borrowed Time" + }, + { + "type": "card", + "probability": 1, + "count": 1, + "cardName": "Teferi's Moat" + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Teferi's Staff" + } + ], + "colors": "WU" +}, { "name": "Treefolk", "sprite": "sprites/treant.atlas", @@ -8140,6 +8696,43 @@ ], "colors": "B" }, +{ + "name": "Water Elemental", + "sprite": "sprites/waterelemental.atlas", + "deck": [ + "decks/water_elemental.dck" + ], + "spawnRate": 1, + "difficulty": 0.1, + "speed": 23, + "life": 12, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Blue" + ], + "rarity": [ + "Rare" + ] + } + ], + "colors": "U" +}, { "name": "Wounded Sliver", "sprite": "sprites/boss/wsliver.atlas", diff --git a/forge-gui/res/adventure/Shandalar/world/green.json b/forge-gui/res/adventure/Shandalar/world/green.json index f3a3dfae66d..95e2a43635e 100644 --- a/forge-gui/res/adventure/Shandalar/world/green.json +++ b/forge-gui/res/adventure/Shandalar/world/green.json @@ -62,7 +62,10 @@ "Viper", "Werewolf", "Wild-Magic Sorcerer", - "Wurm" + "Wurm", + "Ooze", + "Squirrel", + "Fox" ], "pointsOfInterest": [ "Green Castle", @@ -95,7 +98,8 @@ "CaveG8", "CaveG9", "CaveGB", - "Slime Cave" + "Slime Cave", + "Garruk Forest" ], "structures": [ { diff --git a/forge-gui/res/adventure/Shandalar/world/items.json b/forge-gui/res/adventure/Shandalar/world/items.json index e530cdd5fcd..c4e6a6df177 100644 --- a/forge-gui/res/adventure/Shandalar/world/items.json +++ b/forge-gui/res/adventure/Shandalar/world/items.json @@ -4,7 +4,7 @@ "equipmentSlot": "Neck", "iconName": "PipersCharm", "effect": { - "startBattleWithCard": [ + "startBattleWithCardInCommandZone": [ "Piper's Charm" ] } @@ -13,7 +13,7 @@ "equipmentSlot": "Left", "iconName": "SleepWand", "effect": { - "startBattleWithCard": [ + "startBattleWithCardInCommandZone": [ "Sleep Wand" ] } @@ -22,7 +22,7 @@ "equipmentSlot": "Right", "iconName": "HillGiantClub", "effect": { - "startBattleWithCard": [ + "startBattleWithCardInCommandZone": [ "Hill Giant Club" ] } @@ -31,7 +31,7 @@ "equipmentSlot": "Right", "iconName": "CursedTreasure", "effect": { - "startBattleWithCard": [ + "startBattleWithCardInCommandZone": [ "Cursed Treasure" ] } @@ -40,7 +40,7 @@ "equipmentSlot": "Left", "iconName": "FarmersTools", "effect": { - "startBattleWithCard": [ + "startBattleWithCardInCommandZone": [ "Farmer's Tools" ] } @@ -952,8 +952,8 @@ "iconName": "GreenStaff", "effect": { "lifeModifier": 2, - "startBattleWithCard": [ - "Thallid Shell-Dweller" + "startBattleWithCardInCommandZone":[ + "Slimefoot's Slimy Staff" ] } }, @@ -962,9 +962,12 @@ "equipmentSlot": "Left", "iconName": "SleepWand", "effect": { - "lifeModifier": 2, + "lifeModifier": -1, "startBattleWithCard": [ "Kraken Hatchling" + ], + "startBattleWithCardInCommandZone":[ + "Kiora's Bident" ] } }, @@ -982,13 +985,47 @@ { "name": "Jace's Signature Hoodie", "equipmentSlot": "Body", - "iconName": "IronArmor", + "iconName": "BlueRobes", "effect": { "lifeModifier": -1, "cardRewardBonus": 1, - "startBattleWithCard": [ + "startBattleWithCardInCommandZone": [ "Jace's Signature Hoodie" ] } +}, +{ + "name": "Teferi's Staff", + "equipmentSlot": "Left", + "iconName": "MadStaff", + "effect": { + "lifeModifier": 1, + "cardRewardBonus": 1, + "startBattleWithCardInCommandZone": [ + "Teferi's Staff" + ] +} +}, +{ + "name": "Garruk's Mighty Axe", + "equipmentSlot": "Left", + "iconName": "GarrukAxe", + "effect": { + "lifeModifier": 3, + "startBattleWithCardInCommandZone": [ + "Garruk's Mighty Axe" + ] +} +}, +{ + "name": "Nahiri's Armory", + "equipmentSlot": "Right", + "iconName": "Armory", + "effect": { + "lifeModifier": 3, + "startBattleWithCardInCommandZone": [ + "Nahiri's Armory" + ] +} } ] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/points_of_interest.json b/forge-gui/res/adventure/Shandalar/world/points_of_interest.json index 58c9cd74389..d7c18c33fc9 100644 --- a/forge-gui/res/adventure/Shandalar/world/points_of_interest.json +++ b/forge-gui/res/adventure/Shandalar/world/points_of_interest.json @@ -1865,7 +1865,34 @@ "count": 1, "radiusFactor": 0.8, "spriteAtlas": "maps/tileset/buildings.atlas", - "sprite": "MerfolkPool", + "sprite": "Cave", "map": "maps/map/jacehold.tmx" +}, +{ + "name": "Teferi Hideout", + "type": "dungeon", + "count": 1, + "radiusFactor": 0.8, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "MerfolkPool", + "map": "maps/map/teferi.tmx" +}, +{ + "name": "Nahiri Encampment", + "type": "dungeon", + "count": 1, + "radiusFactor": 0.8, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "Castle", + "map": "maps/map/nahiri.tmx" +}, +{ + "name": "Garruk Forest", + "type": "dungeon", + "count": 1, + "radiusFactor": 0.8, + "spriteAtlas": "maps/tileset/buildings.atlas", + "sprite": "EvilGrove", + "map": "maps/map/garruk.tmx" } ] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/red.json b/forge-gui/res/adventure/Shandalar/world/red.json index 1bcf19906b7..55531d4f531 100644 --- a/forge-gui/res/adventure/Shandalar/world/red.json +++ b/forge-gui/res/adventure/Shandalar/world/red.json @@ -61,7 +61,8 @@ "Vampire Lord", "Viashino", "Wild-Magic Sorcerer", - "Yeti" + "Yeti", + "Kobold" ], "pointsOfInterest": [ "Red Castle", diff --git a/forge-gui/res/adventure/Shandalar/world/waste.json b/forge-gui/res/adventure/Shandalar/world/waste.json index ac07aafdded..5a4e24c7554 100644 --- a/forge-gui/res/adventure/Shandalar/world/waste.json +++ b/forge-gui/res/adventure/Shandalar/world/waste.json @@ -53,7 +53,9 @@ "White Wiz2", "White Wiz3", "Doppelganger", - "Pirate" + "Pirate", + "Ooze", + "Fox" ], "pointsOfInterest": [ "Spawn", diff --git a/forge-gui/res/adventure/Shandalar/world/white.json b/forge-gui/res/adventure/Shandalar/world/white.json index a76cbf59ba0..79ac51ef818 100644 --- a/forge-gui/res/adventure/Shandalar/world/white.json +++ b/forge-gui/res/adventure/Shandalar/world/white.json @@ -49,7 +49,10 @@ "White Dwarf", "White Wiz1", "White Wiz2", - "White Wiz3" + "White Wiz3", + "Armored Knight", + "Kor Warrior", + "Fox" ], "pointsOfInterest": [ "White Castle", @@ -78,7 +81,8 @@ "CaveW3", "CaveW4", "CaveW5", - "CaveW6" + "CaveW6", + "Nahiri Encampment" ], "structures": [ { diff --git a/forge-gui/res/cardsfolder/a/agent_of_raffine.txt b/forge-gui/res/cardsfolder/a/agent_of_raffine.txt index 6acfa3a440e..484f5d5e1cf 100644 --- a/forge-gui/res/cardsfolder/a/agent_of_raffine.txt +++ b/forge-gui/res/cardsfolder/a/agent_of_raffine.txt @@ -2,14 +2,13 @@ Name:Agent of Raffine ManaCost:U Types:Creature Human Rogue PT:1/2 -A:AB$ Pump | Cost$ 2 T | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Choices$ Player | SubAbility$ DBConjure | StackDescription$ SpellDescription | SpellDescription$ Choose target opponent. Conjure a duplicate of the top card of their library into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." Then they exile the top card of their library face down. -SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ValidLibrary Card.TopLibrary+TargetedPlayerOwn | Zone$ Hand | RememberMade$ True | SubAbility$ DBClearChosen -SVar:DBExileTop:DB$ Dig | Defined$ TargetedPlayer | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | ExileFaceDown$ True -SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True | SubAbility$ DBEffect +A:AB$ Pump | Cost$ 2 T | ValidTgts$ Opponent | SubAbility$ DBConjure | StackDescription$ None | SpellDescription$ Choose target opponent. +SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ValidLibrary Card.TopLibrary+TargetedPlayerOwn | Zone$ Hand | RememberMade$ True | SubAbility$ DBEffect | StackDescription$ REP Conjure_{p:You} conjures & their_{p:Targeted}'s & your_their | SpellDescription$ Conjure a duplicate of the top card of their library into your hand. SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Agent of Raffine's Perpetual Effect | SubAbility$ DBCleanup | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." SVar:PerpetualAbility:Mode$ Continuous | AddStaticAbility$ SpendAnyMana | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The conjured card perpetually gains "You may spend mana as though it were mana of any color to cast this spell." SVar:SpendAnyMana:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AffectedZone$ Stack | AddHiddenKeyword$ May spend mana as though it were mana of any color to cast CARDNAME | Description$ You may spend mana as though it were mana of any color to cast this spell. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBExileTop +SVar:DBExileTop:DB$ Dig | Defined$ TargetedPlayer | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | ExileFaceDown$ True | StackDescription$ REP they exile_{p:Targeted} exiles | SpellDescription$ Then they exile the top card of their library face down. SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate SVar:DBUpdate:DB$ UpdateRemember Oracle:{2}, {T}: Choose target opponent. Conjure a duplicate of the top card of their library into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." Then they exile the top card of their library face down. diff --git a/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt b/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt index 45c8a82c9f6..5d88ca2fb23 100644 --- a/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt +++ b/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt @@ -10,7 +10,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigReveal:DB$ PeekAndReveal | PeekAmount$ 10 | Reveal$ True | ImprintRevealed$ True | SubAbility$ TrigRepeatTypes SVar:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ Card.IsImprinted | TypesFromZone$ Library | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZone SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.ChosenType+YouOwn+IsImprinted | ChoiceZone$ Library | RememberChosen$ True -SVar:DBChangeZone:DB$ ChangeZoneAll | Origin$ Library | Destination$ Hand | ChangeType$ Card.IsRemembered | SubAbility$ ShuffleRest +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | Defined$ Remembered | SubAbility$ ShuffleRest SVar:ShuffleRest:DB$ ChangeZoneAll | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | Hidden$ True | Mandatory$ True | NoReveal$ True | NoLooking$ True | ChangeType$ Card.IsImprinted+!IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True DeckHas:Ability$LifeGain diff --git a/forge-gui/res/cardsfolder/b/boneyard_scourge.txt b/forge-gui/res/cardsfolder/b/boneyard_scourge.txt index 41bc4b3aa14..a3f391a1b76 100644 --- a/forge-gui/res/cardsfolder/b/boneyard_scourge.txt +++ b/forge-gui/res/cardsfolder/b/boneyard_scourge.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Creature Zombie Dragon PT:4/3 K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Dragon.YouCtrl | IsPresent$ Card.StrictlySelf+inZoneGraveyard | PresentZone$ Graveyard | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay {1}{B}. If you do, return Boneyard Scourge from your graveyard to the battlefield. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Dragon.YouCtrl | IsPresent$ Card.StrictlySelf+inZoneGraveyard | PresentZone$ Graveyard | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever a Dragon you control dies while CARDNAME is in your graveyard, you may pay {1}{B}. If you do, return CARDNAME from your graveyard to the battlefield. SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 B | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield SVar:SacMe:1 SVar:DiscardMe:1 diff --git a/forge-gui/res/cardsfolder/c/cemetery_prowler.txt b/forge-gui/res/cardsfolder/c/cemetery_prowler.txt index de70790baee..545e9abe53a 100644 --- a/forge-gui/res/cardsfolder/c/cemetery_prowler.txt +++ b/forge-gui/res/cardsfolder/c/cemetery_prowler.txt @@ -5,10 +5,8 @@ PT:3/4 K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield or attacks, exile a card from a graveyard. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, exile a card from a graveyard. -SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | Imprint$ True | AILogic$ ExilePreference:MostProminentNonLandNonExiledOwnType +SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | SelectPrompt$ Select a card from a graveyard | Mandatory$ True | Hidden$ True | AILogic$ ExilePreference:MostProminentNonLandNonExiledOwnType S:Mode$ ReduceCost | ValidCard$ Card | Type$ Spell | Amount$ AffectedX | Activator$ You | Description$ Spells you cast cost {1} less to cast for each card type they share with cards exiled with CARDNAME. -SVar:AffectedX:Count$TypesSharedWith Imprinted.ExiledWithSource -T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True -SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True +SVar:AffectedX:Count$TypesSharedWith Card.ExiledWithSource DeckHints:Ability$Graveyard|Discard Oracle:Vigilance\nWhenever Cemetery Prowler enters the battlefield or attacks, exile a card from a graveyard.\nSpells you cast cost {1} less to cast for each card type they share with cards exiled with Cemetery Prowler. diff --git a/forge-gui/res/cardsfolder/c/chandras_phoenix.txt b/forge-gui/res/cardsfolder/c/chandras_phoenix.txt index b6e62dc4382..47985c535bb 100644 --- a/forge-gui/res/cardsfolder/c/chandras_phoenix.txt +++ b/forge-gui/res/cardsfolder/c/chandras_phoenix.txt @@ -4,7 +4,6 @@ Types:Creature Phoenix PT:2/2 K:Flying K:Haste -T:Mode$ DamageDone | ValidSource$ Spell.Instant+YouCtrl+Red,Spell.Sorcery+YouCtrl+Red | ValidTarget$ Opponent | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever an opponent is dealt damage by a red instant or sorcery spell you control or by a red planeswalker you control, return Chandra's Phoenix from your graveyard to your hand. -T:Mode$ DamageDone | ValidSource$ Planeswalker.YouCtrl+Red | ValidTarget$ Opponent | TriggerZones$ Graveyard | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Whenever an opponent is dealt damage by a red instant or sorcery spell you control or by a red planeswalker you control, return Chandra's Phoenix from your graveyard to your hand. +T:Mode$ DamageDone | ValidSource$ Spell.Instant+YouCtrl+Red,Spell.Sorcery+YouCtrl+Red,Planeswalker.YouCtrl+Red | ValidTarget$ Opponent | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever an opponent is dealt damage by a red instant or sorcery spell you control or by a red planeswalker you control, return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Hand Oracle:Flying\nHaste (This creature can attack and {T} as soon as it comes under your control.)\nWhenever an opponent is dealt damage by a red instant or sorcery spell you control or by a red planeswalker you control, return Chandra's Phoenix from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/c/charge_of_the_mites.txt b/forge-gui/res/cardsfolder/c/charge_of_the_mites.txt index 0247348781a..2751edb199e 100644 --- a/forge-gui/res/cardsfolder/c/charge_of_the_mites.txt +++ b/forge-gui/res/cardsfolder/c/charge_of_the_mites.txt @@ -6,4 +6,4 @@ SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ SVar:X:Count$Valid Creature.YouCtrl SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_1_1_a_phyrexian_mite_toxic_noblock | SpellDescription$ Create two 1/1 colorless Phyrexian Mite artifact creature tokens with toxic 1 and "This creature can't block." (Players dealt combat damage by them also get a poison counter.) DeckHas:Ability$Token & Type$Mite|Phyrexian -Oracle:Choose one—\n• Charge of the Mites deals damage equal to the number of creatures you control to target creature or planeswalker.\n• Create two 1/1 colorless Phyrexian Mite artifact creature tokens with toxic 1 and “This creature can't block.” (Players dealt combat damage by them also get a poison counter.) +Oracle:Choose one—\n• Charge of the Mites deals damage equal to the number of creatures you control to target creature or planeswalker.\n• Create two 1/1 colorless Phyrexian Mite artifact creature tokens with toxic 1 and "This creature can't block." (Players dealt combat damage by them also get a poison counter.) diff --git a/forge-gui/res/cardsfolder/c/colfenors_urn.txt b/forge-gui/res/cardsfolder/c/colfenors_urn.txt index d7a33d281e0..922a4ef549c 100644 --- a/forge-gui/res/cardsfolder/c/colfenors_urn.txt +++ b/forge-gui/res/cardsfolder/c/colfenors_urn.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature.toughnessGE4+YouOwn | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Whenever a creature with toughness 4 or greater is put into your graveyard from the battlefield, you may exile it. SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredNewCardLKICopy | RememberChanged$ True T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigReturnAll | TriggerDescription$ At the beginning of the end step, if three or more cards have been exiled with CARDNAME, sacrifice it. If you do, return those cards to the battlefield under their owner's control. -SVar:TrigReturnAll:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBSacSelf +SVar:TrigReturnAll:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBSacSelf SVar:DBSacSelf:DB$ Sacrifice SVar:X:Remembered$Amount Oracle:Whenever a creature with toughness 4 or greater is put into your graveyard from the battlefield, you may exile it.\nAt the beginning of the end step, if three or more cards have been exiled with Colfenor's Urn, sacrifice it. If you do, return those cards to the battlefield under their owner's control. diff --git a/forge-gui/res/cardsfolder/d/dark_intimations.txt b/forge-gui/res/cardsfolder/d/dark_intimations.txt index 8f68595183a..305c3a2fd18 100644 --- a/forge-gui/res/cardsfolder/d/dark_intimations.txt +++ b/forge-gui/res/cardsfolder/d/dark_intimations.txt @@ -5,7 +5,7 @@ A:SP$ Sacrifice | Cost$ 2 U B R | SacValid$ Creature,Planeswalker | SacMessage$ SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player.Opponent | SubAbility$ DBRaiseDead SVar:DBRaiseDead:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouOwn,Planeswalker.YouOwn | SubAbility$ DBDraw | StackDescription$ You return a creature or planeswalker card from your graveyard to your hand SVar:DBDraw:DB$ Draw | NumCards$ 1 | Defined$ You -T:Mode$ SpellCast | ValidCard$ Planeswalker.Bolas | TriggerZones$ Graveyard | Execute$ DBExileSelf | TriggerDescription$ When you cast a Bolas planeswalker spell, exile Dark Intimations from your graveyard. That planeswalker enters the battlefield with an additional loyalty counter on it. +T:Mode$ SpellCast | ValidCard$ Planeswalker.Bolas | TriggerZones$ Graveyard | Execute$ DBExileSelf | TriggerDescription$ When you cast a Bolas planeswalker spell, exile CARDNAME from your graveyard. That planeswalker enters the battlefield with an additional loyalty counter on it. SVar:DBExileSelf:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ Self | SubAbility$ DBExtraLoyaltyEffect SVar:DBExtraLoyaltyEffect:DB$ Effect | ReplacementEffects$ DBBoostLoyalty | RememberObjects$ TriggeredCard | ExileOnMoved$ Stack SVar:DBBoostLoyalty:Event$ Moved | ReplacementResult$ Updated | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Card.IsRemembered | ReplaceWith$ AddExtraCounter | Description$ That planeswalker enters the battlefield with an additional loyalty counter on it. diff --git a/forge-gui/res/cardsfolder/d/detention_sphere.txt b/forge-gui/res/cardsfolder/d/detention_sphere.txt index cbdc89294d3..5409fb0865d 100644 --- a/forge-gui/res/cardsfolder/d/detention_sphere.txt +++ b/forge-gui/res/cardsfolder/d/detention_sphere.txt @@ -2,7 +2,7 @@ Name:Detention Sphere ManaCost:1 W U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target nonland permanent not named Detention Sphere and all other permanents with the same name as that permanent. -SVar:TrigExile:DB$ Pump | ValidTgts$ Permanent.nonLand+notnamedDetention Sphere | TgtPrompt$ Choose target nonland permanent not named Detention Sphere | SubAbility$ DBChangeZoneAll +SVar:TrigExile:DB$ Pump | ValidTgts$ Permanent.nonLand+notnamedDetention Sphere | IsCurse$ True | TgtPrompt$ Choose target nonland permanent not named Detention Sphere | SubAbility$ DBChangeZoneAll SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Targeted.Self,Targeted.sameName | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ForgetOtherRemembered$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to the battlefield under their owner's control. SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Battlefield diff --git a/forge-gui/res/cardsfolder/g/garzas_assassin.txt b/forge-gui/res/cardsfolder/g/garzas_assassin.txt index bcc009b71a1..ca1ddca9ca9 100644 --- a/forge-gui/res/cardsfolder/g/garzas_assassin.txt +++ b/forge-gui/res/cardsfolder/g/garzas_assassin.txt @@ -2,7 +2,7 @@ Name:Garza's Assassin ManaCost:B B B Types:Creature Human Assassin PT:2/2 -K:Recover:PayLife +K:Recover:PayLife A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. SVar:X:Count$YourLifeTotal/HalfUp Oracle:Sacrifice Garza's Assassin: Destroy target nonblack creature.\nRecover—Pay half your life, rounded up. (When another creature is put into your graveyard from the battlefield, you may pay half your life, rounded up. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) diff --git a/forge-gui/res/cardsfolder/g/golden_argosy.txt b/forge-gui/res/cardsfolder/g/golden_argosy.txt index bbfe596f4f8..02fc85f5487 100644 --- a/forge-gui/res/cardsfolder/g/golden_argosy.txt +++ b/forge-gui/res/cardsfolder/g/golden_argosy.txt @@ -1,6 +1,6 @@ Name:Golden Argosy ManaCost:4 -Types:Artifact Vehicle +Types:Legendary Artifact Vehicle PT:3/6 T:Mode$ BecomesCrewed | ValidVehicle$ Card.Self | Execute$ RememberCrew | Static$ True SVar:RememberCrew:DB$ PumpAll | ValidCards$ Creature.TriggeredCrew | RememberAllPumped$ True diff --git a/forge-gui/res/cardsfolder/k/kura_the_boundless_sky.txt b/forge-gui/res/cardsfolder/k/kura_the_boundless_sky.txt index a509fff0e0e..e55fe0bd813 100644 --- a/forge-gui/res/cardsfolder/k/kura_the_boundless_sky.txt +++ b/forge-gui/res/cardsfolder/k/kura_the_boundless_sky.txt @@ -7,6 +7,7 @@ K:Deathtouch T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ RampThree,SpiritLand SVar:RampThree:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 3 | Reveal$ True | SpellDescription$ Search your library for up to three land cards, reveal them, put them in your hand, then shuffle. -SVar:SpiritLand:DB$ Token | TokenScript$ g_x_x_spirit_total_lands | SpellDescription$ Create an X/X green Spirit creature token, where X is the number of lands you control. +SVar:SpiritLand:DB$ Token | TokenScript$ g_x_x_spirit | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X green Spirit creature token, where X is the number of lands you control. +SVar:X:Count$Valid Land.YouCtrl DeckHas:Ability$Token Oracle:Flying, deathtouch\nWhen Kura, the Boundless Sky dies, choose one:\n• Search your library for up to three land cards, reveal them, put them into your hand, then shuffle.\n• Create an X/X green Spirit creature token, where X is the number of lands you control. diff --git a/forge-gui/res/cardsfolder/l/laezel_githyanki_warrior.txt b/forge-gui/res/cardsfolder/l/laezel_githyanki_warrior.txt index 061e7120318..4403fb253cf 100644 --- a/forge-gui/res/cardsfolder/l/laezel_githyanki_warrior.txt +++ b/forge-gui/res/cardsfolder/l/laezel_githyanki_warrior.txt @@ -79,7 +79,7 @@ PT:3/6 K:Double Strike T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When this creature enters the battlefield or specializes, other creatures you control and creature cards in your hand perpetually get +1/+1. T:Mode$ Specializes | ValidCard$ Card.Self | Execute$ TrigEffect | Secondary$ True | TriggerDescription$ When this creature enters the battlefield or specializes, other creatures you control and creature cards in your hand perpetually get +1/+1. -SVar:TrigEffect:DB$ Effect | RememberObjects$ Creature.YouCtrl+Other,ValidHand Creature.YouOwn | StaticAbilities$ PerpetualP1P1 | Duration$ Permanent | Triggers$ Update | Name$ Lae'zel, Primal Warrior's Perpetual Effect +SVar:TrigEffect:DB$ Effect | RememberObjects$ Valid Creature.YouCtrl+Other,ValidHand Creature.YouOwn | StaticAbilities$ PerpetualP1P1 | Duration$ Permanent | Triggers$ Update | Name$ Lae'zel, Primal Warrior's Perpetual Effect SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ These creature cards perpetually get +1/+1. SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate SVar:DBUpdate:DB$ UpdateRemember diff --git a/forge-gui/res/cardsfolder/m/mangaras_tome.txt b/forge-gui/res/cardsfolder/m/mangaras_tome.txt index 00445043bc0..8b0f68e8e20 100644 --- a/forge-gui/res/cardsfolder/m/mangaras_tome.txt +++ b/forge-gui/res/cardsfolder/m/mangaras_tome.txt @@ -2,12 +2,12 @@ Name:Mangara's Tome ManaCost:5 Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for five cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library. -SVar:TrigSearch:DB$ ChangeZone | ChangeNum$ 5 | ChangeType$ Card | Origin$ Library | Destination$ Exile | ShuffleChangedPile$ True | ExileFaceDown$ True | RememberChanged$ True +SVar:TrigSearch:DB$ ChangeZone | ChangeNum$ 5 | Mandatory$ True | ChangeType$ Card | Origin$ Library | Destination$ Exile | ShuffleChangedPile$ True | ExileFaceDown$ True | RememberChanged$ True T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | Static$ True | Execute$ TrigForget SVar:TrigForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReset | Static$ True SVar:TrigReset:DB$ Cleanup | ClearRemembered$ True -A:AB$ Effect | Cost$ 2 | RememberObjects$ FirstRemembered | Triggers$ TrigLeavePlay | ReplacementEffects$ DrawReplace | ImprintCards$ Self | SpellDescription$ The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. +A:AB$ Effect | Cost$ 2 | RememberObjects$ RememberedFirst | Triggers$ TrigLeavePlay | ReplacementEffects$ DrawReplace | ImprintCards$ Self | SpellDescription$ The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ RepMangarasTome | Description$ The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. SVar:TrigLeavePlay:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ ExileEffect | Static$ True SVar:RepMangarasTome:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ ExileEffect diff --git a/forge-gui/res/cardsfolder/p/parallel_thoughts.txt b/forge-gui/res/cardsfolder/p/parallel_thoughts.txt index b46e08bff06..d7eaa72047b 100644 --- a/forge-gui/res/cardsfolder/p/parallel_thoughts.txt +++ b/forge-gui/res/cardsfolder/p/parallel_thoughts.txt @@ -2,13 +2,13 @@ Name:Parallel Thoughts ManaCost:3 U U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for seven cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library. -SVar:TrigSearch:DB$ ChangeZone | ChangeNum$ 7 | ChangeType$ Card | Origin$ Library | Destination$ Exile | ShuffleChangedPile$ True | ExileFaceDown$ True | RememberChanged$ True +SVar:TrigSearch:DB$ ChangeZone | ChangeNum$ 7 | ChangeType$ Card | Mandatory$ True | Origin$ Library | Destination$ Exile | ShuffleChangedPile$ True | ExileFaceDown$ True | RememberChanged$ True T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | Static$ True | Execute$ TrigForget SVar:TrigForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReset | Static$ True SVar:TrigReset:DB$ Cleanup | ClearRemembered$ True R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ RepParallelThoughts | Optional$ True | OptionalDecider$ You | Description$ If you would draw a card, you may instead put the top card of the pile you exiled into your hand. -SVar:RepParallelThoughts:DB$ ChangeZone | Defined$ FirstRemembered | Origin$ Exile | Destination$ Hand +SVar:RepParallelThoughts:DB$ ChangeZone | Defined$ RememberedFirst | Origin$ Exile | Destination$ Hand AI:RemoveDeck:All AI:RemoveDeck:Random Oracle:When Parallel Thoughts enters the battlefield, search your library for seven cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library.\nIf you would draw a card, you may instead put the top card of the pile you exiled into your hand. diff --git a/forge-gui/res/cardsfolder/s/shifting_shadow.txt b/forge-gui/res/cardsfolder/s/shifting_shadow.txt index 747e145eef9..a157a0a2839 100644 --- a/forge-gui/res/cardsfolder/s/shifting_shadow.txt +++ b/forge-gui/res/cardsfolder/s/shifting_shadow.txt @@ -10,6 +10,6 @@ SVar:ShadowUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZo SVar:ShadowRememberSelf:DB$ Pump | ImprintCards$ OriginalHost | SubAbility$ ShadowDestroyEnchanted SVar:ShadowDestroyEnchanted:DB$ Destroy | Defined$ Self | SubAbility$ ShadowRevealCards SVar:ShadowRevealCards:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | RememberFound$ True | SubAbility$ ShadowReattach -SVar:ShadowReattach:DB$ Attach | Defined$ LastRemembered | Object$ Imprinted | SubAbility$ DBCleanup +SVar:ShadowReattach:DB$ Attach | Defined$ RememberedLast | Object$ Imprinted | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True Oracle:Enchant creature\nEnchanted creature has haste and "At the beginning of your upkeep, destroy this creature. Reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and attach Shifting Shadow to it, then put all other cards revealed this way on the bottom of your library in a random order." diff --git a/forge-gui/res/cardsfolder/s/subtle_strike.txt b/forge-gui/res/cardsfolder/s/subtle_strike.txt index 1cbf89afd50..20f3502730b 100644 --- a/forge-gui/res/cardsfolder/s/subtle_strike.txt +++ b/forge-gui/res/cardsfolder/s/subtle_strike.txt @@ -3,5 +3,5 @@ ManaCost:1 B Types:Instant A:SP$ Charm | Cost$ 1 B | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBPump,DBPutCounter SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature (-1/-1) | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (+1/+1 counter) | AILogic$ Good | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (+1/+1 counter) | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. Oracle:Choose one or both —\n• Target creature gets -1/-1 until end of turn.\n• Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/arek_false_goldwarden.txt b/forge-gui/res/cardsfolder/upcoming/arek_false_goldwarden.txt new file mode 100644 index 00000000000..37a43aaf589 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arek_false_goldwarden.txt @@ -0,0 +1,12 @@ +Name:Arek, False Goldwarden +ManaCost:W B +Types:Legendary Creature Human Cleric +PT:2/2 +K:Starting intensity:0 +T:Mode$ ChangesZone | ValidCard$ Creature.YouCtrl+Other | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigIntensify | TriggerDescription$ Whenever another creature enters the battlefield under your control, perpetually increase the intensity of NICKNAME and all cards named Arek, False Goldwarden in your graveyard, hand and library by 1. +SVar:TrigIntensify:DB$ Intensify | AllDefined$ Card.Self,Card.inZoneGraveyard+namedArek; False Goldwarden+YouOwn,Card.inZoneHand+namedArek; False Goldwarden+YouOwn,Card.inZoneLibrary+namedArek; False Goldwarden+YouOwn +A:AB$ LoseLife | Cost$ 3 W B T Sac<1/NICKNAME> | LifeAmount$ X | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses X life and you gain X life, where X is NICKNAME's Intensity. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X +SVar:X:Count$Intensity +DeckHas:Ability$LifeGain|Sacrifice +Oracle:Starting intensity 0\nWhenever another creature enters the battlefield under your control, perpetually increase the intensity of Arek and all cards named Arek, False Goldwarden in your graveyard, hand and library by 1. \n{3}{W}{B}, {T}: Sacrifice Arek: Target opponent loses X life and you gain X life, where X is Arek's Intensity. diff --git a/forge-gui/res/cardsfolder/upcoming/bladehold_cleaver.txt b/forge-gui/res/cardsfolder/upcoming/bladehold_cleaver.txt new file mode 100644 index 00000000000..d4ba23e76a3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bladehold_cleaver.txt @@ -0,0 +1,10 @@ +Name:Bladehold Cleaver +ManaCost:2 R W +Types:Artifact Equipment +K:For Mirrodin +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | Description$ Equipped creature gets +2/+2. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.EquippedBy | Execute$ TrigDraft | TriggerDescription$ Whenever equipped creature dies, draft a card from CARDNAME's spellbook. +SVar:TrigDraft:DB$ Draft | Spellbook$ Accorder Paladin,Ardent Recruit,Auriok Sunchaser,Blade-Tribe Berserkers,Goblin Gaveleer,Hero of Bladehold,Hero of Oxid Ridge,Mirran Crusader,Oxidda Scrapmelter,Sunspear Shikari,Oxidda Finisher,Barbed Batterfist,Bladehold War-Whip,Dragonwing Glider,Jor Kadeen; the Prevailer +DeckHas:Ability$Token & Type$Rebel|Cat|Soldier|Beast|Knight|Goblin|Beserker +K:Equip:3 +Oracle:For Mirrodin!\nEquipped creature gets +2/+2.\nWhenever equipped creature dies, draft a card from Bladehold Cleaver's spellbook.\nEquip {3}. diff --git a/forge-gui/res/cardsfolder/upcoming/blightwing_whelp.txt b/forge-gui/res/cardsfolder/upcoming/blightwing_whelp.txt new file mode 100644 index 00000000000..aabf877e1d3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blightwing_whelp.txt @@ -0,0 +1,11 @@ +Name:Blightwing Whelp +ManaCost:2 B +Types:Creature Phyrexian Imp +PT:2/2 +K:Flying +K:Toxic:1 +A:AB$ Pump | Cost$ B | KW$ Haste | Defined$ Self | SpellDescription$ CARDNAME gains haste until end of turn. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigSeek | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, seek a card with mana value equal to the number of poison counters that player has. +SVar:TrigSeek:DB$ ChangeZone | Origin$ Library | Destination$ Hand | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | NoReveal$ True | ChangeType$ Card.cmcEQX | ChangeNum$ 1 +SVar:X:TriggeredTarget$PoisonCounters +Oracle:Flying\nToxic 1\n{B}: Blightwing Whelp gains haste until end of turn.\nWhenever Blightwing Welp deals combat damage to a player, seek a card with mana value equal to the number of poison counters that player has. diff --git a/forge-gui/res/cardsfolder/upcoming/breach_the_multiverse.txt b/forge-gui/res/cardsfolder/upcoming/breach_the_multiverse.txt new file mode 100644 index 00000000000..9ffc6918882 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/breach_the_multiverse.txt @@ -0,0 +1,11 @@ +Name:Breach the Multiverse +ManaCost:5 B B +Types:Sorcery +A:SP$ Mill | NumCards$ 10 | Defined$ Player | SubAbility$ DBForEach | SpellDescription$ Each player mills ten cards. For each player, choose a creature or planeswalker card in that player's graveyard. Put those cards onto the battlefield under your control. Then each creature you control becomes a Phyrexian in addition to its other types. +SVar:DBForEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBChangeZone +SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature.RememberedPlayerCtrl,Planeswalker.RememberedPlayerCtrl | ChoiceZone$ Graveyard | Mandatory$ True | Amount$ 1 | ChoiceTitle$ Choose a creature or planeswalker card in this player's graveyard | ImprintChosen$ True +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Imprinted | GainControl$ True | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBAnimate | StackDescription$ None +SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Types$ Phyrexian | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearImprinted$ True +DeckHas:Ability$Graveyard|Mill +Oracle:Each player mills ten cards. For each player, choose a creature or planeswalker card in that player's graveyard. Put those cards onto the battlefield under your control. Then each creature you control becomes a Phyrexian in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_hopes_beacon.txt b/forge-gui/res/cardsfolder/upcoming/chandra_hopes_beacon.txt new file mode 100644 index 00000000000..7a6c5a4509d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_hopes_beacon.txt @@ -0,0 +1,15 @@ +Name:Chandra, Hope's Beacon +ManaCost:4 R R +Types:Legendary Planeswalker Chandra +Loyalty:5 +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigCopySpell | TriggerZones$ Battlefield | ActivationLimit$ 1 | TriggerDescription$ Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy. This ability triggers only once each turn. +SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | MayChooseTarget$ True +A:AB$ Mana | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Produced$ Combo Any | Amount$ 2 | SpellDescription$ Add two mana in any combination of colors. +A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DestinationZone$ Exile | DigNum$ 5 | ChangeNum$ All | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top five cards of your library. Until the end of your next turn, you may cast an instant or sorcery spell from among those exiled cards. +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Exile,Stack | Affected$ Instant.IsRemembered,Sorcery.IsRemembered | MayPlay$ True | MayPlayLimit$ 1 | Description$ Until the end of your next turn, you may cast an instant or sorcery spell from among the exiled cards. +A:AB$ DealDamage | Cost$ SubCounter | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | TargetMin$ 0 | TargetMax$ 2 | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each of up to two targets. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$xPaid +DeckNeeds:Type$Instant|Sorcery +Oracle:Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy. This ability triggers only once each turn.\n[+2]: Add two mana in any combination of colors.\n[+1]: Exile the top five cards of your library. Until the end of your next turn, you may cast an instant or sorcery spell from among those exiled cards.\n[−X]: Chandra, Hope's Beacon deals X damage to each of up to two targets. diff --git a/forge-gui/res/cardsfolder/upcoming/darksteel_hydra.txt b/forge-gui/res/cardsfolder/upcoming/darksteel_hydra.txt new file mode 100644 index 00000000000..52dd515c71d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/darksteel_hydra.txt @@ -0,0 +1,13 @@ +Name:Darksteel Hydra +ManaCost:X W B G +Types:Artifact Creature Phyrexian Hydra +PT:*/* +K:Indestructible +K:etbCounter:OIL:X +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ Y | SetToughness$ Y | Description$ CARDNAME's power and toughness are each equal to twice the number of oil counters on it. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConjure | TriggerDescription$ When CARDNAME enters the battlefield, conjure a card named Darksteel Ingot and a card named Darksteel Plate into your hand. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | Names$ Darksteel Ingot,Darksteel Plate | Zone$ Hand +SVar:X:Count$xPaid +SVar:Y:Count$CardCounters.OIL/Twice +DeckHas:Ability$Counters +Oracle:Indestructible\nDarksteel Hydra enters the battlefield with X oil counters on it.\Darksteel Hydra's power and toughness are each equal to twice the number of oil counters on it.\nWhen Darksteel Hydra enters the battlefield, conjure a card named Darksteel Ingot and a card named Darksteel Plate into your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/drana_and_linvala.txt b/forge-gui/res/cardsfolder/upcoming/drana_and_linvala.txt index dd9bc48cd03..dbbf4a48cbb 100644 --- a/forge-gui/res/cardsfolder/upcoming/drana_and_linvala.txt +++ b/forge-gui/res/cardsfolder/upcoming/drana_and_linvala.txt @@ -7,4 +7,4 @@ K:Vigilance S:Mode$ CantBeActivated | Activator$ Opponent | AffectedZone$ Battlefield | ValidCard$ Creature | ValidSA$ Activated | Description$ Activated abilities of creatures your opponents control can't be activated. S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Creature.OppCtrl | GainsValidAbilities$ Activated | GainsAbilitiesActivateIgnoreColor$ AnyType->AnyColor | Description$ CARDNAME has all activated abilities of all creatures your opponents control. You may spend mana as though it were mana of any color to activate those abilities. SVar:PlayMain1:TRUE -Oracle:Flying, vigilance\nActivated abilities of creatures your opponents control can't be activated.\nDrana and Linvala has all activated abilities of all creatures your opponents control. You may spend mana as though it were mana of any color to activate those abilities. \ No newline at end of file +Oracle:Flying, vigilance\nActivated abilities of creatures your opponents control can't be activated.\nDrana and Linvala has all activated abilities of all creatures your opponents control. You may spend mana as though it were mana of any color to activate those abilities. diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_mastermind.txt b/forge-gui/res/cardsfolder/upcoming/faerie_mastermind.txt index 1a70c693d0d..5838cc8b121 100644 --- a/forge-gui/res/cardsfolder/upcoming/faerie_mastermind.txt +++ b/forge-gui/res/cardsfolder/upcoming/faerie_mastermind.txt @@ -7,4 +7,4 @@ K:Flying T:Mode$ Drawn | ValidPlayer$ Opponent | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent draws their second card each turn, you draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Draw | Cost$ 3 U | Defined$ Player | SpellDescription$ Each player draws a card. -Oracle:Flash\nFlying\nWhenever an opponent draws their second card each turn, you draw a card.\n{3}{U}: Each player draws a card. \ No newline at end of file +Oracle:Flash\nFlying\nWhenever an opponent draws their second card each turn, you draw a card.\n{3}{U}: Each player draws a card. diff --git a/forge-gui/res/cardsfolder/upcoming/glistening_extractor.txt b/forge-gui/res/cardsfolder/upcoming/glistening_extractor.txt new file mode 100644 index 00000000000..02a0d08c2ef --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glistening_extractor.txt @@ -0,0 +1,9 @@ +Name:Glistening Extractor +ManaCost:2 U B +Types:Artifact +K:etbCounter:OIL:4 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+counters_GE1_OIL | Execute$ TrigSeek | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if there are one or more oil counters on CARDNAME, seek a card with mana value equal to the number of oil counters on CARDNAME, then remove an oil counter from CARDNAME. +SVar:TrigSeek:DB$ ChangeZone | Origin$ Library | Destination$ Hand | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | NoReveal$ True | ChangeType$ Card.cmcEQX | ChangeNum$ 1 | SubAbility$ DBRemoveCounter +SVar:DBRemoveCounter:DB$ RemoveCounter | CounterType$ OIL +SVar:X:Count$CardCounters.OIL +Oracle:Glistening Extractor enters the battlefield with four oil counters on it.\nAt the beginning of your upkeep, if there are one or more oil counters on Glistening Extractor, seek a card with mana value equal to the number of oil counters on Glistening Extractor, then remove an oil counter from Glistening Extractor. diff --git a/forge-gui/res/cardsfolder/upcoming/goro_goro_and_satoru.txt b/forge-gui/res/cardsfolder/upcoming/goro_goro_and_satoru.txt index 7b81b32ef1b..c62ed069220 100644 --- a/forge-gui/res/cardsfolder/upcoming/goro_goro_and_satoru.txt +++ b/forge-gui/res/cardsfolder/upcoming/goro_goro_and_satoru.txt @@ -7,4 +7,4 @@ SVar:TrigToken:DB$ Token | TokenScript$ r_5_5_dragon_spirit_flying A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature.YouCtrl | KW$ Haste | SpellDescription$ Creatures you control gain haste until end of turn. DeckHas:Ability$Token & Type$Dragon|Spirit DeckHints:Type$Equipment|Aura & Ability$Counters -Oracle:Whenever one or more creatures you control that entered the battlefield this turn deal combat damage to a player, create a 5/5 red Dragon Spirit creature token with flying.\n{1}{R}: Creatures you control gain haste until end of turn. \ No newline at end of file +Oracle:Whenever one or more creatures you control that entered the battlefield this turn deal combat damage to a player, create a 5/5 red Dragon Spirit creature token with flying.\n{1}{R}: Creatures you control gain haste until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/gyox_brutal_carnivora.txt b/forge-gui/res/cardsfolder/upcoming/gyox_brutal_carnivora.txt new file mode 100644 index 00000000000..ac1db93b51f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gyox_brutal_carnivora.txt @@ -0,0 +1,17 @@ +Name:Gyox, Brutal Carnivora +ManaCost:1 B G +Types:Legendary Creature Phyrexian Warlock +PT:2/4 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put an oil counter on up to one target creature. +SVar:TrigPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | CounterType$ OIL +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken+counters_GE1_OIL | TriggerZones$ Battlefield | Execute$ TrigConjure | TriggerDescription$ Whenever a nontoken creature you control with one or more oil counters on it dies, conjure X duplicates of it into exile, where X is the number of oil counters on it. Those duplicates perpetually get +X/+X. Then shuffle those duplicates into your library. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | DefinedName$ TriggeredCardLKICopy | Amount$ X | Zone$ Exile | RememberMade$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualPXPX | Name$ Gyox, Brutal Carnivora's Perpetual Effect | SetChosenNumber$ X | Duration$ Permanent | SubAbility$ DBShuffle +SVar:PerpetualPXPX:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ Num | AddToughness$ Num | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Those duplicates perpetually get +X/+X. +SVar:DBShuffle:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Library | Shuffle$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:TriggeredCard$CardCounters.OIL +SVar:Num:Count$ChosenNumber +DeckHints:Ability$Sacrifice|Counters +DeckHas:Ability$Counters +Oracle:At the beginning of your end step, put an oil counter on up to one target creature.\nWhenever a nontoken creature you control with one or more oil counters on it dies, conjure X duplicates of it into exile, where X is the number of oil counters on it. Those duplicates perpetually get +X/+X. Then shuffle those duplicates into your library. diff --git a/forge-gui/res/cardsfolder/upcoming/heliod_the_radiant_dawn_heliod_the_warped_eclipse.txt b/forge-gui/res/cardsfolder/upcoming/heliod_the_radiant_dawn_heliod_the_warped_eclipse.txt new file mode 100644 index 00000000000..ad78a4cb6b5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/heliod_the_radiant_dawn_heliod_the_warped_eclipse.txt @@ -0,0 +1,23 @@ +Name:Heliod, the Radiant Dawn +ManaCost:2 W W +Types:Legendary Enchantment Creature God +PT:4/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target enchantment card that isn't a God from your graveyard to your hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Enchantment.YouCtrl+nonGod +A:AB$ SetState | Cost$ 3 UP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +DeckHas:Type$Enchantment +AlternateMode:DoubleFaced +Oracle:When Heliod, the Radiant Dawn enters the battlefield, return target enchantment card that isn't a God from your graveyard to your hand.\n{3}{U/P}: Transform Heliod, the Radiant Dawn. Activate only as a sorcery. ({U/P} can be paid with either {U} or 2 life.) + +ALTERNATE + +Name:Heliod, the Warped Eclipse +ManaCost:no cost +Colors:white,blue +Types:Legendary Enchantment Creature Phyrexian God +PT:4/6 +S:Mode$ CastWithFlash | ValidCard$ Card | ValidSA$ Spell | Caster$ You | Description$ You may cast spells as though they had flash. +S:Mode$ ReduceCost | Type$ Spell | Activator$ You | Amount$ X | Description$ Spells you cast cost {1} less to cast for each card your opponents have drawn this turn. +SVar:X:PlayerCountOpponents$CardsDrawn +SVar:NonStackingEffect:True +Oracle:You may cast spells as though they had flash.\nSpells you cast cost {1} less to cast for each card your opponents have drawn this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/katilda_and_lier.txt b/forge-gui/res/cardsfolder/upcoming/katilda_and_lier.txt index baaa11b175b..db6ea6617eb 100644 --- a/forge-gui/res/cardsfolder/upcoming/katilda_and_lier.txt +++ b/forge-gui/res/cardsfolder/upcoming/katilda_and_lier.txt @@ -7,4 +7,4 @@ SVar:TrigFlashback:DB$ Pump | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | TgtZone DeckHas:Ability$Graveyard & Keyword$Flashback DeckNeeds:Type$Human DeckHints:Ability$Graveyard|Mill & Type$Instant|Sorcery -Oracle:Whenever you cast a Human spell, target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. (You may cast that card from your graveyard for its flashback cost. Then exile it.) \ No newline at end of file +Oracle:Whenever you cast a Human spell, target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. (You may cast that card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/magmatic_scorchwing.txt b/forge-gui/res/cardsfolder/upcoming/magmatic_scorchwing.txt new file mode 100644 index 00000000000..2e7f29f8553 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/magmatic_scorchwing.txt @@ -0,0 +1,9 @@ +Name:Magmatic Scorchwing +ManaCost:3 R R +Types:Creature Dragon +PT:4/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Land.YouCtrl+nonBasic | PresentCompare$ EQ0 | PresentZone$ Library | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, if there are no nonbasic land cards in your library, CARDNAME deals 3 damage to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 +AI:RemoveDeck:Random +Oracle:Flying\nWhen Magmatic Scorchwing enters the battlefield, if there are no nonbasic land cards in your library, Magmatic Scorchwing deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/march_toward_perfection.txt b/forge-gui/res/cardsfolder/upcoming/march_toward_perfection.txt new file mode 100644 index 00000000000..3f31de86b29 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/march_toward_perfection.txt @@ -0,0 +1,12 @@ +Name:March Toward Perfection +ManaCost:B +Types:Sorcery +A:SP$ Effect | Boon$ True | Duration$ Permanent | Triggers$ SpellCast | SpellDescription$ You get a boon with "When you cast your next Phyrexian creature spell, that creature enters the battlefield with an additional +1/+1 counter, and deathtouch counter on it." +SVar:SpellCast:Mode$ SpellCast | ValidCard$ Creature.Phyrexian | ValidActivatingPlayer$ You | OneOff$ True | ActivationLimit$ 1 | TriggerZones$ Command | Execute$ ReplEffAddCounter | TriggerDescription$ When you cast your next creature spell, that creature enters the battlefield with an additional +1/+1 counter, reach counter, and trample counter on it. +SVar:ReplEffAddCounter:DB$ Effect | ReplacementEffects$ ETBAddCounter | RememberObjects$ TriggeredCard | SubAbility$ DBDraft +SVar:ETBAddCounter:Event$ Moved | Origin$ Stack | Destination$ Battlefield | ValidCard$ Card.IsRemembered | ReplaceWith$ ETBAddExtraCounter | ReplacementResult$ Updated +SVar:ETBAddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterTypes$ P1P1,Deathtouch | CounterNum$ 1 +SVar:DBDraft:DB$ Draft | Spellbook$ Entomber Exarch,Phyrexian Fleshgorger,Phyrexian Gargantua,Phyrexian Obliterator,Phyrexian Rager,Phyrexian Revoker,Toxic Abomination,Vault Skirge,Scrapwork Rager,Bilious Skulldweller,Archfiend of the Dross,Myr Convert,Zenith Chronicler,Soulless Jailer,Diminished Returner | SpellDescription$ Draft a card from CARDNAME's spellbook. +DeckHas:Ability$Counters|Lifegain|Graveyard & Type$Phyrexian|Horror|Imp|Zombie|Insect|Demon|Insect +DeckNeeds:Type$Phyrexian +Oracle:You get a boon with "When you cast your next Phyrexian creature spell, that creature enters the battlefield with an additional +1/+1 counter, and deathtouch counter on it."\nDraft a card from March Toward Perfection's spellbook. diff --git a/forge-gui/res/cardsfolder/upcoming/mephidross_slime.txt b/forge-gui/res/cardsfolder/upcoming/mephidross_slime.txt new file mode 100644 index 00000000000..b36585a0150 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mephidross_slime.txt @@ -0,0 +1,14 @@ +Name:Mephidross Slime +ManaCost:1 B G +Types:Creature Phyrexian Ooze +PT:3/3 +K:Trample +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigConjure | TriggerDescription$ Whenever CARDNAME dies, conjure a card named Mephidross Slime into your graveyard. Perpetually double the power and toughness of CARDNAME and that card. then shuffle them into their owner's library. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | Name$ Mephidross Slime | Amount$ 1 | Zone$ Graveyard | RememberMade$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Name$ Mephidross Slime's Perpetual Effect | RememberObjects$ Remembered | ImprintCards$ TriggeredCard | StaticAbilities$ PerpetualDouble | Duration$ Permanent | SubAbility$ ShuffleIntoLibrary +SVar:PerpetualDouble:Mode$ Continuous | Affected$ Card.IsRemembered,Card.IsImprinted | AddPower$ AffectedX | AddToughness$ AffectedY | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Perpetually double the power and toughness of this creature. +SVar:ShuffleIntoLibrary:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Library | ChangeType$ Card.Self,Card.IsRemembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +SVar:AffectedX:Count$CardPower +SVar:AffectedY:Count$CardToughness +Oracle:Trample\nWhenever Mephidross Slime dies, conjure a card named Mephidross Slime into your graveyard. Perpetually double the power and toughness of Mephidross Slime and that card. then shuffle them into their owner's library. diff --git a/forge-gui/res/cardsfolder/upcoming/moment_of_truth.txt b/forge-gui/res/cardsfolder/upcoming/moment_of_truth.txt new file mode 100644 index 00000000000..9ed4157ecf6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/moment_of_truth.txt @@ -0,0 +1,7 @@ +Name:Moment of Truth +ManaCost:1 U +Types:Instant +A:SP$ Dig | Cost$ 1 U | DigNum$ 3 | ChangeNum$ 1 | LibraryPosition2$ 0 | SkipReorder$ True | SubAbility$ DBDig | NoLooking$ True | SpellDescription$ Look at the top three cards of your library. Put one of those cards into your hand, one into your graveyard, and one on the bottom of your library. | StackDescription$ SpellDescription +SVar:DBDig:DB$ Dig | DigNum$ 2 | ChangeNum$ 1 | DestinationZone$ Graveyard | NoLooking$ True | StackDescription$ None +DeckHints:Ability$Graveyard +Oracle:Look at the top three cards of your library. Put one of those cards into your hand, one into your graveyard, and one on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/phyresis_roach.txt b/forge-gui/res/cardsfolder/upcoming/phyresis_roach.txt new file mode 100644 index 00000000000..153b24f5f5b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phyresis_roach.txt @@ -0,0 +1,12 @@ +Name:Phyresis Roach +ManaCost:G +Types:Creature Phyrexian Insect +PT:1/1 +K:Toxic:1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigEffect | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, Insects you control and Insect cards in your graveyard, hand, and library perpetually gain toxic 1. +SVar:TrigEffect:DB$ Effect | Name$ Phyresis Roach's Perpetual Effect | RememberObjects$ Valid Insect.YouCtrl,ValidGraveyard,Hand,Library Insect.YouOwn | StaticAbilities$ PerpetualToxic | Duration$ Permanent | Triggers$ Update +SVar:PerpetualToxic:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ Toxic:1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ These cards perpetually gain toxic 1. +SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate +SVar:DBUpdate:DB$ UpdateRemember +DeckHints:Type$Insect +Oracle:Toxic 1\nWhenever Phyresis Roach deals combat damage to a player, Insects you control and Insect cards in your graveyard, hand, and library perpetually gain toxic 1. diff --git a/forge-gui/res/cardsfolder/upcoming/quicksilver_lapidary.txt b/forge-gui/res/cardsfolder/upcoming/quicksilver_lapidary.txt index af0c21c2900..27b05f90b27 100644 --- a/forge-gui/res/cardsfolder/upcoming/quicksilver_lapidary.txt +++ b/forge-gui/res/cardsfolder/upcoming/quicksilver_lapidary.txt @@ -6,4 +6,4 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigConjure:DB$ MakeCard | Name$ Mox Opal | Zone$ Hand DeckHas:Type$Artifact DeckHints:Type$Artifact -Oracle:When Quicksilver Lapidary enters the battlefield, conjure a card named Mox Opal into your hand. \ No newline at end of file +Oracle:When Quicksilver Lapidary enters the battlefield, conjure a card named Mox Opal into your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/yargle_and_multani.txt b/forge-gui/res/cardsfolder/upcoming/yargle_and_multani.txt index 0cc16df8c4a..9c61de342b1 100644 --- a/forge-gui/res/cardsfolder/upcoming/yargle_and_multani.txt +++ b/forge-gui/res/cardsfolder/upcoming/yargle_and_multani.txt @@ -2,4 +2,4 @@ Name:Yargle and Multani ManaCost:3 B B G Types:Legendary Creature Frog Spirit Elemental PT:18/6 -Oracle: \ No newline at end of file +Oracle: diff --git a/forge-gui/res/cardsfolder/w/warcry_phoenix.txt b/forge-gui/res/cardsfolder/w/warcry_phoenix.txt index ec616bdd270..b1fb08130a3 100644 --- a/forge-gui/res/cardsfolder/w/warcry_phoenix.txt +++ b/forge-gui/res/cardsfolder/w/warcry_phoenix.txt @@ -4,7 +4,7 @@ Types:Creature Phoenix PT:2/2 K:Flying K:Haste -T:Mode$ AttackersDeclared | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigReturn | NoResolvingCheck$ True | TriggerZones$ Graveyard | AttackingPlayer$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may pay {2}{R}. If you do, return Warcry Phoenix from your graveyard to the battlefield tapped and attacking. +T:Mode$ AttackersDeclared | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigReturn | NoResolvingCheck$ True | TriggerZones$ Graveyard | AttackingPlayer$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may pay {2}{R}. If you do, return CARDNAME from your graveyard to the battlefield tapped and attacking. SVar:TrigReturn:AB$ ChangeZone | Cost$ 2 R | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Attacking$ True SVar:X:Count$Valid Creature.attacking Oracle:Flying, haste\nWhenever you attack with three or more creatures, you may pay {2}{R}. If you do, return Warcry Phoenix from your graveyard to the battlefield tapped and attacking. diff --git a/forge-gui/res/cardsfolder/z/zeriam_golden_wind.txt b/forge-gui/res/cardsfolder/z/zeriam_golden_wind.txt index de02580cf46..3f352f09c4f 100644 --- a/forge-gui/res/cardsfolder/z/zeriam_golden_wind.txt +++ b/forge-gui/res/cardsfolder/z/zeriam_golden_wind.txt @@ -5,4 +5,5 @@ PT:3/4 K:Flying T:Mode$ DamageDone | ValidSource$ Griffin.YouCtrl | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a Griffin you control deals combat damage to a player, create a 2/2 white Griffin creature token with flying. SVar:TrigToken:DB$ Token | TokenScript$ w_2_2_griffin_flying +SVar:PlayMain1:TRUE Oracle:Flying\nWhenever a Griffin you control deals combat damage to a player, create a 2/2 white Griffin creature token with flying. diff --git a/forge-gui/res/editions/Alchemy Phyrexia.txt b/forge-gui/res/editions/Alchemy Phyrexia.txt index c837cd7836c..e0174839e1f 100644 --- a/forge-gui/res/editions/Alchemy Phyrexia.txt +++ b/forge-gui/res/editions/Alchemy Phyrexia.txt @@ -13,7 +13,7 @@ ScryfallCode=YONE 5 R Quicksilver Servitor @Samuel Araya 6 R Surgical Metamorph @Nestor Ossandon Leal 7 U Tezzeret's Reckoning @Camille Alquier -8 R Blightwing Whelp @Jean Pierre Targete +8 R Blightwing Whelp @J.P. Targete 9 U March Toward Perfection @Brian Valeza 10 R Sheoldred's Assimilator @Diego Gisbert 11 U Hexgold Sledge @David Sondered @@ -28,7 +28,7 @@ ScryfallCode=YONE 20 M Darksteel Hydra @Monztre 21 R Glistening Extractor @Jonas De Ro 22 R Gyox, Brutal Carnivora @Daniel Ljunggren -23 R Ichor Aberration @Jean Pierre Targete +23 R Ichor Aberration @J.P. Targete 24 R Innovative Metatect @LA Draws 25 U Mephidross Slime @Yeong-Hao Han 26 U Quicksilver Lapidary @Caroline Gariba diff --git a/forge-gui/res/editions/Kamigawa Neon Dynasty.txt b/forge-gui/res/editions/Kamigawa Neon Dynasty.txt index d203992bfbc..0840975badc 100644 --- a/forge-gui/res/editions/Kamigawa Neon Dynasty.txt +++ b/forge-gui/res/editions/Kamigawa Neon Dynasty.txt @@ -585,7 +585,7 @@ c_1_1_spirit c_a_treasure_sac g_1_1_human_monk_g g_4_5_spirit -g_x_x_spirit_total_lands +g_x_x_spirit keimi mechtitan r_2_2_goblin_shaman_treasure diff --git a/forge-gui/res/editions/Unhinged.txt b/forge-gui/res/editions/Unhinged.txt index 4a0868ce9e2..1377b6c17cc 100644 --- a/forge-gui/res/editions/Unhinged.txt +++ b/forge-gui/res/editions/Unhinged.txt @@ -15,12 +15,12 @@ ScryfallCode=UNH 3 U Bosom Buddy @Dan Scott 4 C Cardpecker @Richard Sardinha 5 C Cheap Ass @Randy Gallegos -6 C Circle of Protection: Art @Jim “Stop the Da Vinci Beatdown” Pavelec +6 C Circle of Protection: Art @Jim "Stop the Da Vinci Beatdown" Pavelec 7 R Collector Protector @Christopher Rush -8 R Drawn Together @Pete “Fear Me” Venters +8 R Drawn Together @Pete "Fear Me" Venters 9 U Emcee @Quinton Hoover -10 C Erase (Not the Urza's Legacy One) @Pete “Yes the Urza's Legacy One” Venters -11 C Fascist Art Director @Edward P. “Feed Me” Beard, Jr. +10 C Erase (Not the Urza's Legacy One) @Pete "Yes the Urza's Legacy One" Venters +11 C Fascist Art Director @Edward P. "Feed Me" Beard, Jr. 12 U First Come, First Served @Thomas Gianni 13 R Frankie Peanuts @Thomas M. Baxa 14 U Head to Head @Thomas Gianni @@ -34,16 +34,16 @@ ScryfallCode=UNH 22 C Wordmail @Ron Spencer 23 U _ @Ron Spears 24 R Ambiguity @Stephen Daniele -25 C Artful Looter @Heather “Erica Gassalasca-Jape” Hudson +25 C Artful Looter @Heather "Erica Gassalasca-Jape" Hudson 26 R Avatar of Me @Greg Hildebrandt -27 C Brushstroke Paintermage @Ron “Don't You Dare Change Me” Spears -28 C Bursting Beebles @David “Beeblemania” Martin +27 C Brushstroke Paintermage @Ron "Don't You Dare Change Me" Spears +28 C Bursting Beebles @David "Beeblemania" Martin 29 C Carnivorous Death-Parrot @Tim Hildebrandt 30 U Cheatyface @Doug Chaffee 31 C Double Header @Richard Sardinha 32 C Flaccify @Tim Hildebrandt -33 C Framed! @Alan “Don't Feel Like You Have to Pick Me” Pollack -34 R Greater Morphling @Greg “Six-Pack” Staples +33 C Framed! @Alan "Don't Feel Like You Have to Pick Me" Pollack +34 R Greater Morphling @Greg "Six-Pack" Staples 35 R Johnny, Combo Player @Kensuke Okabayashi 36 C Loose Lips @John Matson 37 U Magical Hacker @Doug Chaffee @@ -57,7 +57,7 @@ ScryfallCode=UNH 45 C Smart Ass @Trevor Hairsine 46 U Spell Counter @Doug Chaffee 47 R Topsy Turvy @Jeff Miracola -48 R Aesthetic Consultation @David “Help Me” Martin +48 R Aesthetic Consultation @David "Help Me" Martin 49 C Bad Ass @Thomas M. Baxa 50 C Bloodletter @Daren Bader 51 U Booster Tutor @Christopher Rush @@ -70,7 +70,7 @@ ScryfallCode=UNH 58 U Kill! Destroy! @Corey D. Macourek 59 C Mother of Goons @Darrell Riche 60 R Necro-Impotence @Mark Tedin -61 U Persecute Artist @Rebecca “Don't Mess with Me” Guay +61 U Persecute Artist @Rebecca "Don't Mess with Me" Guay 62 U Phyrexian Librarian @Kev Walker 63 C Stop That @Anson Maddocks 64 C Tainted Monkey @Mark Zug @@ -78,7 +78,7 @@ ScryfallCode=UNH 66 C Wet Willie of the Damned @Greg Staples 67 C When Fluffy Bunnies Attack @Ray Lago 68 U Working Stiff @Darrell Riche -69 U Zombie Fanboy @Matt “I'm Your Boy” Cavotta +69 U Zombie Fanboy @Matt "I'm Your Boy" Cavotta 70 R Zzzyxas's Abyss @Pete Venters 71 R Assquatch @Jeremy Jarvis 72 R Blast from the Past @Douglas Shuler @@ -90,7 +90,7 @@ ScryfallCode=UNH 78 C Goblin Mime @Franz Vohwinkel 79 C Goblin Secret Agent @Tony Szczudlo 80 C Goblin S.W.A.T. Team @Eric Deschamps -81 C Mana Flair @Paolo “That's Actually Me” Parente +81 C Mana Flair @Paolo "That's Actually Me" Parente 82 C Mons's Goblin Waiters @Pete Venters 83 C Orcish Paratroopers @Matt Thompson 84 C Punctuate @Jim Pavelec @@ -109,7 +109,7 @@ ScryfallCode=UNH 97 R Fraction Jackson @Mark Poole 98 U Gluetius Maximus @Jeff Easley 99 U Granny's Payback @Joel Thomas -100 C Graphic Violence @Wayne “King of” England +100 C Graphic Violence @Wayne "King of" England 101 C Keeper of the Sacred Word @Dany Orizio 102 C Land Aid '04 @Jim Nelson 103 C Laughing Hyena @Mark Poole @@ -117,7 +117,7 @@ ScryfallCode=UNH 105 U Name Dropping @Tony Szczudlo 106 R Old Fogey @Douglas Shuler 107 C Our Market Research Shows That Players Like Really Long Card Names So We Made this Card to Have the Absolute Longest Card Name Ever Elemental @Greg Hildebrandt -108 C Remodel @Lars Grant-“Wild Wild”-West +108 C Remodel @Lars Grant-"Wild Wild"-West 109 C Shoe Tree @Francis Tsai 110 U Side to Side @Jim Nelson 111 C S.N.O.T. @Cyril Van Der Haegen diff --git a/forge-gui/res/formats/Archived/Alchemy/2023-02-28.txt b/forge-gui/res/formats/Archived/Alchemy/2023-02-28.txt new file mode 100644 index 00000000000..e4d6b7bf5a3 --- /dev/null +++ b/forge-gui/res/formats/Archived/Alchemy/2023-02-28.txt @@ -0,0 +1,6 @@ +[format] +Name:Alchemy (YONE) +Type:Archived +Subtype:Arena +Effective:2023-02-28 +Sets:ANA, ANB, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, DMU, YDMU, BRO, YBRO, ONE, YONE diff --git a/forge-gui/res/formats/Archived/Historic/2023-02-28.txt b/forge-gui/res/formats/Archived/Historic/2023-02-28.txt new file mode 100644 index 00000000000..71a3d4157e8 --- /dev/null +++ b/forge-gui/res/formats/Archived/Historic/2023-02-28.txt @@ -0,0 +1,7 @@ +[format] +Name:Alchemy (YONE) +Type:Archived +Subtype:Arena +Effective:2023-02-28 +Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE +Banned:Agent of Treachery; Brainstorm; Channel; Counterspell; Dark Ritual; Demonic Tutor; Field of the Dead; Lightning Bolt; Memory Lapse; Mishra's Bauble; Natural Order; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Swords to Plowshares; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt index 359265d6afa..c019eba8301 100644 --- a/forge-gui/res/formats/Sanctioned/Historic.txt +++ b/forge-gui/res/formats/Sanctioned/Historic.txt @@ -4,5 +4,5 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE +Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE Banned:Agent of Treachery; Brainstorm; Channel; Counterspell; Dark Ritual; Demonic Tutor; Field of the Dead; Lightning Bolt; Memory Lapse; Mishra's Bauble; Natural Order; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Swords to Plowshares; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation diff --git a/forge-gui/res/lists/net-decks-brawl.txt b/forge-gui/res/lists/net-decks-brawl.txt index b1aa585734e..01e73a37ece 100644 --- a/forge-gui/res/lists/net-decks-brawl.txt +++ b/forge-gui/res/lists/net-decks-brawl.txt @@ -1,3 +1,4 @@ +Budget Magic | https://downloads.cardforge.org/decks/budgetmagic-brawl.zip Card Preview | https://downloads.cardforge.org/decks/cardpreview-brawl.zip Commander Clash | https://downloads.cardforge.org/decks/commanderclash-brawl.zip Commander VS | https://downloads.cardforge.org/decks/commandervs-brawl.zip diff --git a/forge-gui/res/lists/net-decks.txt b/forge-gui/res/lists/net-decks.txt index e431c43eb89..da91902cb4c 100644 --- a/forge-gui/res/lists/net-decks.txt +++ b/forge-gui/res/lists/net-decks.txt @@ -1,4 +1,5 @@ Against the Odds | https://downloads.cardforge.org/decks/againsttheodds.zip +Arena Championship | https://downloads.cardforge.org/decks/arenachampionship.zip Breaking Through | https://downloads.cardforge.org/decks/breakingthrough.zip Brewing on a Budget | https://downloads.cardforge.org/decks/brewingonabudget.zip Budget Magic | https://downloads.cardforge.org/decks/budgetmagic.zip diff --git a/forge-gui/res/tokenscripts/g_x_x_spirit.txt b/forge-gui/res/tokenscripts/g_x_x_spirit.txt new file mode 100644 index 00000000000..6c816fa9f7c --- /dev/null +++ b/forge-gui/res/tokenscripts/g_x_x_spirit.txt @@ -0,0 +1,6 @@ +Name:Spirit Token +ManaCost:no cost +Types:Creature Spirit +Colors:green +PT:*/* +Oracle: diff --git a/forge-gui/res/tokenscripts/g_x_x_spirit_total_lands.txt b/forge-gui/res/tokenscripts/g_x_x_spirit_total_lands.txt deleted file mode 100644 index 294d7e0038f..00000000000 --- a/forge-gui/res/tokenscripts/g_x_x_spirit_total_lands.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Spirit Token -ManaCost:no cost -Types:Creature Spirit -Colors:green -PT:*/* -S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ This creature's power and toughness are each equal to the number of lands you control. -SVar:X:Count$Valid Land.YouCtrl -Oracle:This creature's power and toughness are each equal to the number of lands you control. diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java index c5666ad05e7..8d5593ad286 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java @@ -201,7 +201,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { public void useManaFromPool(byte colorCode) { // find the matching mana in pool. - if (player.getManaPool().tryPayCostWithColor(colorCode, saPaidFor, manaCost)) { + if (player.getManaPool().tryPayCostWithColor(colorCode, saPaidFor, manaCost, saPaidFor.getPayingMana())) { onManaAbilityPaid(); showMessage(); } diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java index 5370e3a8be6..f2e94dfcdfc 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java @@ -359,7 +359,7 @@ public final class CardScriptParser { "Self", "OriginalHost", "EffectSource", "Equipped", "Enchanted", "TopOfLibrary", "BottomOfLibrary", "Targeted", "ThisTargetedCard", "ParentTarget", "Remembered", "DirectRemembered", - "DelayTriggerRemembered", "FirstRemembered", "Clones", "Imprinted", + "DelayTriggerRemembered", "RememberedFirst", "Clones", "Imprinted", "ChosenCard", "SacrificedCards", "Sacrificed", "DiscardedCards", "Discarded", "ExiledCards", "Exiled", "TappedCards", "Tapped", "UntappedCards", "Untapped", "Parent", "SourceFirstSpell"); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index a3b840fb3c3..0389e02ccaf 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -743,14 +743,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont Card show = null; Object o = null; switch (sa.getParam("ShowCardInPrompt")) { - case "FirstRemembered": + case "RememberedFirst": o = sa.getHostCard().getFirstRemembered(); if (o instanceof Card) { show = (Card) o; } break; - case "LastRemembered": - o = sa.getHostCard().getFirstRemembered(); + case "RememberedLast": + o = Iterables.getLast(sa.getHostCard().getRemembered(), null); if (o instanceof Card) { show = (Card) o; } diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index 9bbd11bd665..a4772e0339f 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -253,7 +253,8 @@ public abstract class ImageFetcher { FThreads.assertExecutedByEdt(true); for (Callback o : currentFetches.get(destPath)) { - o.onImageFetched(); + if (o != null) + o.onImageFetched(); } currentFetches.remove(destPath); };