Merge remote-tracking branch 'upstream/master' into decks

This commit is contained in:
Simisays
2023-04-24 21:31:53 +02:00
256 changed files with 3328 additions and 644 deletions

View File

@@ -3,7 +3,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-ai</artifactId>

View File

@@ -432,7 +432,7 @@ public class ComputerUtilCard {
* @param list
* @return a {@link forge.game.card.Card} object.
*/
public static Card getBestCreatureToBounceAI(final CardCollectionView list) {
public static Card getBestCreatureToBounceAI(final Iterable<Card> list) {
if (Iterables.size(list) == 1) {
return Iterables.get(list, 0);
}

View File

@@ -86,7 +86,7 @@ public class PlayerControllerAi extends PlayerController {
@Override
public SpellAbility getAbilityToPlay(Card hostCard, List<SpellAbility> abilities, ITriggerEvent triggerEvent) {
if (abilities.size() == 0) {
if (abilities.isEmpty()) {
return null;
}
return abilities.get(0);

View File

@@ -32,6 +32,7 @@ public enum SpellApiToAi {
.put(ApiType.BecomeMonarch, AlwaysPlayAi.class)
.put(ApiType.BecomesBlocked, BecomesBlockedAi.class)
.put(ApiType.BidLife, BidLifeAi.class)
.put(ApiType.BlankLine, AlwaysPlayAi.class)
.put(ApiType.Bond, BondAi.class)
.put(ApiType.Branch, AlwaysPlayAi.class)
.put(ApiType.Camouflage, ChooseCardAi.class)
@@ -40,6 +41,7 @@ public enum SpellApiToAi {
.put(ApiType.ChangeX, AlwaysPlayAi.class)
.put(ApiType.ChangeZone, ChangeZoneAi.class)
.put(ApiType.ChangeZoneAll, ChangeZoneAllAi.class)
.put(ApiType.ChaosEnsues, AlwaysPlayAi.class)
.put(ApiType.Charm, CharmAi.class)
.put(ApiType.ChooseCard, ChooseCardAi.class)
.put(ApiType.ChooseColor, ChooseColorAi.class)

View File

@@ -1216,7 +1216,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
}
if (choice == null) { // can't find anything left
if (sa.getTargets().size() == 0 || !sa.isTargetNumberValid()) {
if (sa.getTargets().isEmpty() || !sa.isTargetNumberValid()) {
if (!mandatory) {
sa.resetTargets();
}
@@ -1432,7 +1432,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination"));
final TargetRestrictions tgt = sa.getTargetRestrictions();
CardCollection list = new CardCollection(CardUtil.getValidCardsToTarget(tgt, sa));
List<Card> list = CardUtil.getValidCardsToTarget(tgt, sa);
if (list.isEmpty()) {
return false;

View File

@@ -5,7 +5,6 @@ import java.util.Map;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.AiController;
import forge.ai.AiPlayerPredicates;
@@ -197,8 +196,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
// mass zone change for creatures: if in dire danger, do it; otherwise, only do it if the opponent's
// creatures are better in value
if ((CardLists.getNotType(oppType, "Creature").size() == 0)
&& (CardLists.getNotType(computerType, "Creature").size() == 0)) {
if (CardLists.getNotType(oppType, "Creature").isEmpty() && CardLists.getNotType(computerType, "Creature").isEmpty()) {
if (game.getCombat() != null && ComputerUtilCombat.lifeInSeriousDanger(ai, game.getCombat())) {
if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)
&& game.getPhaseHandler().getPlayerTurn().isOpponentOf(ai)) {
@@ -225,17 +223,15 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
} else if (origin.equals(ZoneType.Graveyard)) {
if (sa.usesTargeting()) {
// search targetable Opponents
final Iterable<Player> oppList = Iterables.filter(ai.getOpponents(),
PlayerPredicates.isTargetableBy(sa));
final PlayerCollection oppList = ai.getOpponents().filter(PlayerPredicates.isTargetableBy(sa));
if (Iterables.isEmpty(oppList)) {
if (oppList.isEmpty()) {
return false;
}
// get the one with the most in graveyard
// zone is visible so evaluate which would be hurt the most
Player oppTarget = Collections.max(Lists.newArrayList(oppList),
AiPlayerPredicates.compareByZoneValue(sa.getParam("ChangeType"), origin, sa));
Player oppTarget = Collections.max(oppList, AiPlayerPredicates.compareByZoneValue(sa.getParam("ChangeType"), origin, sa));
// set the target
if (!oppTarget.getCardsIn(ZoneType.Graveyard).isEmpty()) {
@@ -270,18 +266,14 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
return (curHandSize + minAdv - 1 < numExiledWithSrc) || (!noDiscard && numExiledWithSrc >= ai.getMaxHandSize());
}
} else if (origin.equals(ZoneType.Stack)) {
// time stop can do something like this:
// Origin$ Stack | Destination$ Exile | SubAbility$ DBSkip
// DBSKipToPhase | DB$SkipToPhase | Phase$ Cleanup
// otherwise, this situation doesn't exist
// TODO
return false;
}
if (destination.equals(ZoneType.Battlefield)) {
if (sa.hasParam("GainControl")) {
// Check if the cards are valuable enough
if (CardLists.getNotType(oppType, "Creature").size() == 0
&& CardLists.getNotType(computerType, "Creature").size() == 0) {
if (CardLists.getNotType(oppType, "Creature").isEmpty() && CardLists.getNotType(computerType, "Creature").isEmpty()) {
if ((ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard
.evaluateCreatureList(oppType)) < 400) {
return false;
@@ -294,8 +286,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
}
} else {
// don't activate if human gets more back than AI does
if ((CardLists.getNotType(oppType, "Creature").size() == 0)
&& (CardLists.getNotType(computerType, "Creature").size() == 0)) {
if (CardLists.getNotType(oppType, "Creature").isEmpty() && CardLists.getNotType(computerType, "Creature").isEmpty()) {
if (ComputerUtilCard.evaluateCreatureList(computerType) <= (ComputerUtilCard
.evaluateCreatureList(oppType) + 100)) {
return false;
@@ -354,8 +345,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
return true;
// if AI creature is better than Human Creature
return ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard
.evaluateCreatureList(humanCards);
return ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard.evaluateCreatureList(humanCards);
}
return true;
}
@@ -416,15 +406,13 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
// if the AI is using it defensively, then something else needs to occur
// if only creatures are affected evaluate both lists and pass only
// if human creatures are more valuable
if ((CardLists.getNotType(humanType, "Creature").isEmpty()) && (CardLists.getNotType(computerType, "Creature").isEmpty())) {
if (ComputerUtilCard.evaluateCreatureList(computerType) >= ComputerUtilCard
.evaluateCreatureList(humanType)) {
if (CardLists.getNotType(humanType, "Creature").isEmpty() && CardLists.getNotType(computerType, "Creature").isEmpty()) {
if (ComputerUtilCard.evaluateCreatureList(computerType) >= ComputerUtilCard.evaluateCreatureList(humanType)) {
return false;
}
} // otherwise evaluate both lists by CMC and pass only if human
// permanents are more valuable
else if (ComputerUtilCard.evaluatePermanentList(computerType) >= ComputerUtilCard
.evaluatePermanentList(humanType)) {
else if (ComputerUtilCard.evaluatePermanentList(computerType) >= ComputerUtilCard.evaluatePermanentList(humanType)) {
return false;
}
} else if (origin.equals(ZoneType.Graveyard)) {
@@ -457,11 +445,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
} else if (origin.equals(ZoneType.Exile)) {
} else if (origin.equals(ZoneType.Stack)) {
// time stop can do something like this:
// Origin$ Stack | Destination$ Exile | SubAbility$ DBSkip
// DBSKipToPhase | DB$SkipToPhase | Phase$ Cleanup
// otherwise, this situation doesn't exist
return false;
// currently only exists indirectly (e.g. Summary Dismissal via PlayAi)
}
if (destination.equals(ZoneType.Battlefield)) {
@@ -469,25 +453,22 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
if (mandatory) {
return true;
}
if (sa.getParam("GainControl") != null) {
if (sa.hasParam("GainControl")) {
// Check if the cards are valuable enough
if ((CardLists.getNotType(humanType, "Creature").size() == 0) && (CardLists.getNotType(computerType, "Creature").size() == 0)) {
return (ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard
.evaluateCreatureList(humanType)) >= 1;
if (CardLists.getNotType(humanType, "Creature").isEmpty() && CardLists.getNotType(computerType, "Creature").isEmpty()) {
return (ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard.evaluateCreatureList(humanType)) >= 1;
} // otherwise evaluate both lists by CMC and pass only if human
// permanents are less valuable
else return (ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard
return (ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard
.evaluatePermanentList(humanType)) >= 1;
} else {
// don't activate if human gets more back than AI does
if ((CardLists.getNotType(humanType, "Creature").isEmpty()) && (CardLists.getNotType(computerType, "Creature").isEmpty())) {
return ComputerUtilCard.evaluateCreatureList(computerType) > ComputerUtilCard
.evaluateCreatureList(humanType);
} // otherwise evaluate both lists by CMC and pass only if human
// permanents are less valuable
else return ComputerUtilCard.evaluatePermanentList(computerType) > ComputerUtilCard
.evaluatePermanentList(humanType);
}
// don't activate if human gets more back than AI does
if (CardLists.getNotType(humanType, "Creature").isEmpty() && CardLists.getNotType(computerType, "Creature").isEmpty()) {
return ComputerUtilCard.evaluateCreatureList(computerType) > ComputerUtilCard.evaluateCreatureList(humanType);
} // otherwise evaluate both lists by CMC and pass only if human
// permanents are less valuable
return ComputerUtilCard.evaluatePermanentList(computerType) > ComputerUtilCard.evaluatePermanentList(humanType);
}
return true;

View File

@@ -59,7 +59,7 @@ public class ClashAi extends SpellAbilityAi {
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
for (Player p : options) {
if (p.getCardsIn(ZoneType.Library).size() == 0)
if (p.getCardsIn(ZoneType.Library).isEmpty())
return p;
}

View File

@@ -64,8 +64,7 @@ public class CounterAi extends SpellAbilityAi {
if (sa.usesTargeting()) {
final SpellAbility topSA = ComputerUtilAbility.getTopSpellAbilityOnStack(game, sa);
if ((topSA.isSpell() && !CardFactoryUtil.isCounterableBy(topSA.getHostCard(), sa)) || topSA.getActivatingPlayer() == ai
|| ai.getAllies().contains(topSA.getActivatingPlayer())) {
if ((topSA.isSpell() && !CardFactoryUtil.isCounterableBy(topSA.getHostCard(), sa)) || ai.getYourTeam().contains(topSA.getActivatingPlayer())) {
// might as well check for player's friendliness
return false;
} else if (sa.hasParam("ConditionWouldDestroy") && !CounterEffect.checkForConditionWouldDestroy(sa, topSA)) {

View File

@@ -89,7 +89,7 @@ public class RegenerateAi extends SpellAbilityAi {
// filter AIs battlefield by what I can target
List<Card> targetables = CardLists.getTargetableCards(ai.getCardsIn(ZoneType.Battlefield), sa);
if (targetables.size() == 0) {
if (targetables.isEmpty()) {
return false;
}
@@ -153,11 +153,11 @@ public class RegenerateAi extends SpellAbilityAi {
CardCollectionView targetables = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa);
final List<Card> compTargetables = CardLists.filterControlledBy(targetables, ai);
if (targetables.size() == 0) {
if (targetables.isEmpty()) {
return false;
}
if (!mandatory && compTargetables.size() == 0) {
if (!mandatory && compTargetables.isEmpty()) {
return false;
}

View File

@@ -32,7 +32,7 @@ public class RegenerateAllAi extends SpellAbilityAi {
list = CardLists.getValidCards(list, valid, hostCard.getController(), hostCard, sa);
list = CardLists.filter(list, CardPredicates.isController(ai));
if (list.size() == 0) {
if (list.isEmpty()) {
return false;
}

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-core</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-game</artifactId>

View File

@@ -1439,6 +1439,8 @@ public class GameAction {
}
setHoldCheckingStaticAbilities(false);
// important to collect first otherwise if a static fires it will mess up registered ones from LKI
game.getTriggerHandler().collectTriggerForWaiting();
if (game.getTriggerHandler().runWaitingTriggers()) {
checkAgain = true;
}

View File

@@ -3580,6 +3580,18 @@ public class AbilityUtils {
}
return doXMath(amount, m, source, ctb);
}
if (value.startsWith("PlaneswalkedToThisTurn")) {
int found = 0;
String name = value.split(" ")[1];
List<Card> pwTo = player.getPlaneswalkedToThisTurn();
for (Card c : pwTo) {
if (c.getName().equals(name)) {
found++;
break;
}
}
return doXMath(found, m, source, ctb);
}
return doXMath(0, m, source, ctb);
}

View File

@@ -37,6 +37,7 @@ public enum ApiType {
ChangeX (ChangeXEffect.class),
ChangeZone (ChangeZoneEffect.class),
ChangeZoneAll (ChangeZoneAllEffect.class),
ChaosEnsues (ChaosEnsuesEffect.class),
Charm (CharmEffect.class),
ChooseCard (ChooseCardEffect.class),
ChooseColor (ChooseColorEffect.class),
@@ -189,7 +190,7 @@ public enum ApiType {
Vote (VoteEffect.class),
WinsGame (GameWinEffect.class),
BlankLine (BlankLineEffect.class),
DamageResolve (DamageResolveEffect.class),
ChangeZoneResolve (ChangeZoneResolveEffect.class),
InternalLegendaryRule (CharmEffect.class),

View File

@@ -0,0 +1,16 @@
package forge.game.ability.effects;
import forge.game.ability.SpellAbilityEffect;
import forge.game.spellability.SpellAbility;
public class BlankLineEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
return "\r\n";
}
@Override
public void resolve(SpellAbility sa) {
// this "effect" just allows spacing to look better for certain card displays
}
}

View File

@@ -339,7 +339,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final String fromGraveyard = " from the graveyard";
if (destination.equals(ZoneType.Battlefield)) {
final boolean attacking = (sa.hasParam("Attacking"));
final boolean attacking = sa.hasParam("Attacking");
if (ZoneType.Graveyard.equals(origin)) {
sb.append("Return").append(targetname).append(fromGraveyard).append(" to the battlefield");
} else {
@@ -565,6 +565,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
// If a card is moved to library from the stack, remove its spells from the stack
if (sa.hasParam("Fizzle")) {
// TODO only AI still targets as card, try to remove it
if (gameCard.isInZone(ZoneType.Exile) || gameCard.isInZone(ZoneType.Hand) || gameCard.isInZone(ZoneType.Stack)) {
// This only fizzles spells, not anything else.
game.getStack().remove(gameCard);

View File

@@ -0,0 +1,74 @@
package forge.game.ability.effects;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import java.util.*;
public class ChaosEnsuesEffect extends SpellAbilityEffect {
/** 311.7. Each plane card has a triggered ability that triggers “Whenever chaos ensues.” These are called
chaos abilities. Each one is indicated by a chaos symbol to the left of the ability, though the symbol
itself has no special rules meaning. This ability triggers if the chaos symbol is rolled on the planar
die (see rule 901.9b), if a resolving spell or ability says that chaos ensues, or if a resolving spell or
ability states that chaos ensues for a particular object. In the last case, the chaos ability can trigger
even if that plane card is still in the planar deck but revealed. A chaos ability is controlled by the
current planar controller. **/
@Override
public void resolve(SpellAbility sa) {
final Card host = sa.getHostCard();
final Player activator = sa.getActivatingPlayer();
final Game game = activator.getGame();
if (game.getActivePlanes() == null) { // not a planechase game, nothing happens
return;
}
Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(activator);
Map<Integer, EnumSet<ZoneType>> tweakedTrigs = new HashMap<>();
List<Card> affected = Lists.newArrayList();
if (sa.hasParam("Defined")) {
for (final Card c : AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa)) {
for (Trigger t : c.getTriggers()) {
if (t.getMode() == TriggerType.ChaosEnsues) { // also allow current zone for any Defined
//String zones = t.getParam("TriggerZones");
//t.putParam("TriggerZones", zones + "," + c.getZone().getZoneType().toString());
EnumSet<ZoneType> zones = (EnumSet<ZoneType>) t.getActiveZone();
tweakedTrigs.put(t.getId(), zones);
zones.add(c.getZone().getZoneType());
t.setActiveZone(zones);
affected.add(c);
game.getTriggerHandler().registerOneTrigger(t);
}
}
}
runParams.put(AbilityKey.Affected, affected);
if (affected.isEmpty()) { // if no Defined has chaos ability, don't trigger non Defined
return;
}
}
game.getTriggerHandler().runTrigger(TriggerType.ChaosEnsues, runParams,false);
for (Map.Entry<Integer, EnumSet<ZoneType>> e : tweakedTrigs.entrySet()) {
for (Card c : affected) {
for (Trigger t : c.getTriggers()) {
if (t.getId() == e.getKey()) {
EnumSet<ZoneType> zones = e.getValue();
t.setActiveZone(zones);
}
}
}
}
}
}

View File

@@ -13,8 +13,14 @@ public class PlaneswalkEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
Game game = sa.getActivatingPlayer().getGame();
for (Player p : game.getPlayers()) {
p.leaveCurrentPlane();
if (game.getActivePlanes() == null) { // not a planechase game, nothing happens
return;
}
if (!sa.hasParam("DontPlaneswalkAway")) {
for (Player p : game.getPlayers()) {
p.leaveCurrentPlane();
}
}
if (sa.hasParam("Defined")) {
CardCollectionView destinations = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa);

View File

@@ -68,6 +68,9 @@ public class RollDiceEffect extends SpellAbilityEffect {
return rollDiceForPlayer(sa, player, amount, sides, 0, 0, null);
}
private static int rollDiceForPlayer(SpellAbility sa, Player player, int amount, int sides, int ignore, int modifier, List<Integer> rollsResult) {
if (amount == 0) {
return 0;
}
int advantage = getRollAdvange(player);
amount += advantage;
int total = 0;

View File

@@ -1,12 +1,6 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import forge.game.PlanarDice;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -16,17 +10,17 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
import forge.game.trigger.WrappedAbility;
import java.util.List;
public class RunChaosEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
Map<AbilityKey, Object> map = AbilityKey.mapFromPlayer(sa.getActivatingPlayer());
map.put(AbilityKey.Result, PlanarDice.Chaos);
List<SpellAbility> validSA = Lists.newArrayList();
for (final Card c : getTargetCards(sa)) {
for (Trigger t : c.getTriggers()) {
if (TriggerType.PlanarDice.equals(t.getMode()) && t.performTest(map)) {
if (t.getMode() == TriggerType.ChaosEnsues) {
SpellAbility triggerSA = t.ensureAbility().copy(sa.getActivatingPlayer());
Player decider = sa.getActivatingPlayer();
@@ -44,5 +38,4 @@ public class RunChaosEffect extends SpellAbilityEffect {
}
sa.getActivatingPlayer().getController().orderAndPlaySimultaneousSa(validSA);
}
}

View File

@@ -6,6 +6,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import forge.util.Lang;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ArrayListMultimap;
@@ -35,13 +36,13 @@ public class VoteEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(final SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
sb.append(StringUtils.join(getDefinedPlayersOrTargeted(sa), ", "));
sb.append(" vote ");
sb.append(Lang.joinHomogenous(getDefinedPlayersOrTargeted(sa))).append(" vote ");
if (sa.hasParam("VoteType")) {
sb.append(StringUtils.join(sa.getParam("VoteType").split(","), " or "));
sb.append("for ").append(StringUtils.join(sa.getParam("VoteType").split(","), " or "));
} else if (sa.hasParam("VoteMessage")) {
sb.append(sa.getParam("VoteMessage"));
}
sb.append(".");
return sb.toString();
}

View File

@@ -350,9 +350,17 @@ public class CardFactory {
planesWalkTrigger.setOverridingAbility(AbilityFactory.getAbility(rolledWalk, card));
card.addTrigger(planesWalkTrigger);
String chaosTrig = "Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Static$ True";
String rolledChaos = "DB$ ChaosEnsues";
Trigger chaosTrigger = TriggerHandler.parseTrigger(chaosTrig, card, true);
chaosTrigger.setOverridingAbility(AbilityFactory.getAbility(rolledChaos, card));
card.addTrigger(chaosTrigger);
String specialA = "ST$ RollPlanarDice | Cost$ X | SorcerySpeed$ True | Activator$ Player | SpecialAction$ True" +
" | ActivationZone$ Command | SpellDescription$ Roll the planar dice. X is equal to the number of " +
"times you have previously taken this action this turn.";
"times you have previously taken this action this turn. | CostDesc$ {X}: ";
SpellAbility planarRoll = AbilityFactory.getAbility(specialA, card);
planarRoll.setSVar("X", "Count$PlanarDiceSpecialActionThisTurn");

View File

@@ -815,9 +815,9 @@ public class CardFactoryUtil {
inst.addTrigger(trigger);
} else if (keyword.equals("Ascend")) {
// Ascend trigger only for Permanent
if (card.isPermanent()) {
final String trig = "Mode$ Always | TriggerZones$ Battlefield | Secondary$ True"
+ " | Static$ True | Blessing$ False | IsPresent$ Permanent.YouCtrl | PresentCompare$ GE10 "
if (card.isPermanent() || card.isPlane()) {
final String trig = "Mode$ Always | TriggerZones$ " + (card.isPlane() ? "Command" : "Battlefield")
+ " | Secondary$ True | Static$ True | Blessing$ False | IsPresent$ Permanent.YouCtrl | PresentCompare$ GE10"
+ " | TriggerDescription$ Ascend (" + inst.getReminderText() + ")";
final String effect = "DB$ Ascend | Defined$ You";
@@ -1318,8 +1318,8 @@ public class CardFactoryUtil {
// Second, create the trigger that runs when the haunted creature dies
final StringBuilder sbDies = new StringBuilder();
sbDies.append("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Exile |");
sbDies.append("ValidCard$ Creature.HauntedBy | Execute$ ").append(hauntSVarName);
sbDies.append("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Exile");
sbDies.append(" | ValidCard$ Creature.HauntedBy | Execute$ ").append(hauntSVarName);
sbDies.append(" | TriggerDescription$ ").append(hauntDescription);
final Trigger hauntedDies = TriggerHandler.parseTrigger(sbDies.toString(), card, intrinsic);
@@ -1369,7 +1369,7 @@ public class CardFactoryUtil {
// First, create trigger that runs when the haunter goes to the graveyard
final StringBuilder sbHaunter = new StringBuilder();
sbHaunter.append("Mode$ ChangesZone | Origin$ ");
sbHaunter.append(card.isCreature() ? "Battlefield" : "Stack | ResolvedCard$ True");
sbHaunter.append(card.isCreature() ? "Battlefield" : "Stack | Fizzle$ False");
sbHaunter.append(" | Destination$ Graveyard | ValidCard$ Card.Self");
sbHaunter.append(" | Secondary$ True | TriggerDescription$ Haunt (").append(inst.getReminderText()).append(")");

View File

@@ -209,6 +209,7 @@ public class Player extends GameEntity implements Comparable<Player> {
private Map<Card, Card> maingameCardsMap = Maps.newHashMap();
private CardCollection currentPlanes = new CardCollection();
private CardCollection planeswalkedToThisTurn = new CardCollection();
private PlayerStatistics stats = new PlayerStatistics();
private PlayerController controller;
@@ -1918,6 +1919,10 @@ public class Player extends GameEntity implements Comparable<Player> {
completedDungeons.clear();
}
public final List<Card> getPlaneswalkedToThisTurn() {
return planeswalkedToThisTurn;
}
public final void altWinBySpellEffect(final String sourceName) {
if (cantWin()) {
System.out.println("Tried to win, but currently can't.");
@@ -2458,6 +2463,7 @@ public class Player extends GameEntity implements Comparable<Player> {
setNumManaConversion(0);
damageReceivedThisTurn.clear();
planeswalkedToThisTurn.clear();
// set last turn nr
if (game.getPhaseHandler().isPlayerTurn(this)) {
@@ -2617,7 +2623,7 @@ public class Player extends GameEntity implements Comparable<Player> {
* Then runs triggers.
*/
public void planeswalkTo(SpellAbility sa, final CardCollectionView destinations) {
System.out.println(getName() + ": planeswalk to " + destinations.toString());
System.out.println(getName() + " planeswalks to " + destinations.toString());
currentPlanes.addAll(destinations);
game.getView().updatePlanarPlayer(getView());
@@ -2625,8 +2631,9 @@ public class Player extends GameEntity implements Comparable<Player> {
moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield());
moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard());
for (Card c : currentPlanes) {
for (Card c : destinations) {
game.getAction().moveTo(ZoneType.Command, c, sa, moveParams);
planeswalkedToThisTurn.add(c);
//getZone(ZoneType.PlanarDeck).remove(c);
//getZone(ZoneType.Command).add(c);
}
@@ -2634,7 +2641,7 @@ public class Player extends GameEntity implements Comparable<Player> {
game.setActivePlanes(currentPlanes);
//Run PlaneswalkedTo triggers here.
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Cards, currentPlanes);
runParams.put(AbilityKey.Cards, destinations);
game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams, false);
view.updateCurrentPlaneName(currentPlanes.toString().replaceAll(" \\(.*","").replace("[",""));
}

View File

@@ -135,10 +135,14 @@ public class TriggerChangesZone extends Trigger {
}
}
if (hasParam("ResolvedCard")) {
if (hasParam("Fizzle")) {
if (!runParams.containsKey(AbilityKey.Fizzle)) {
return false;
}
Boolean val = (Boolean) runParams.get(AbilityKey.Fizzle);
if ("True".equals(getParam("Fizzle")) != val) {
return false;
}
}
// Check number of lands ETB this turn on triggered card's controller

View File

@@ -0,0 +1,63 @@
package forge.game.trigger;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import java.util.Map;
public class TriggerChaosEnsues extends Trigger {
/**
* <p>
* Constructor for Trigger_ChaosEnsues
* </p>
*
* @param params
* a {@link java.util.HashMap} object.
* @param host
* a {@link forge.game.card.Card} object.
* @param intrinsic
* the intrinsic
*/
public TriggerChaosEnsues(final Map<String, String> params, final Card host, final boolean intrinsic) {
super(params, host, intrinsic);
}
/* (non-Javadoc)
* @see forge.card.trigger.Trigger#performTest(java.util.Map)
*/
@Override
public boolean performTest(Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) {
return false;
}
if (runParams.containsKey(AbilityKey.Affected)) {
final Object o = runParams.get(AbilityKey.Affected);
if (o instanceof GameObject) {
final GameObject c = (GameObject) o;
if (!c.equals(this.getHostCard())) {
return false;
}
} else if (o instanceof Iterable<?>) {
for (Object o2 : (Iterable<?>) o) {
if (!o2.equals(this.getHostCard())) {
return false;
}
}
}
}
return true;
}
@Override
public void setTriggeringObjects(SpellAbility sa, Map<AbilityKey, Object> runParams) {
sa.setTriggeringObjectsFrom(runParams, AbilityKey.Player);
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
return "";
}
}

View File

@@ -180,7 +180,7 @@ public class TriggerHandler {
return FileSection.parseToMap(trigParse, FileSection.DOLLAR_SIGN_KV_SEPARATOR);
}
private void collectTriggerForWaiting() {
public void collectTriggerForWaiting() {
for (final TriggerWaiting wt : waitingTriggers) {
if (wt.getTriggers() != null)
continue;

View File

@@ -39,6 +39,7 @@ public enum TriggerType {
ChangesController(TriggerChangesController.class),
ChangesZone(TriggerChangesZone.class),
ChangesZoneAll(TriggerChangesZoneAll.class),
ChaosEnsues(TriggerChaosEnsues.class),
Clashed(TriggerClashed.class),
ClassLevelGained(TriggerClassLevelGained.class),
ConjureAll(TriggerConjureAll.class),

View File

@@ -19,7 +19,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-gui-android</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-gui-desktop</artifactId>

View File

@@ -12,7 +12,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-gui-ios</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-gui-mobile-dev</artifactId>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-gui-mobile</artifactId>

View File

@@ -19,4 +19,5 @@ public class SettingData {
public Float rewardCardAdjLandscape;
public Float cardTooltipAdjLandscape;
public boolean dayNightBG;
public boolean disableWinLose;
}

View File

@@ -34,6 +34,7 @@ import forge.player.GamePlayerUtil;
import forge.player.PlayerControllerHuman;
import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.screens.TransitionScreen;
import forge.screens.match.MatchController;
import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem;
@@ -130,18 +131,20 @@ public class DuelScene extends ForgeScene {
@Override
public void run(Integer result) {
if (result == 0) {
afterGameEnd(enemyName, finalWinner, true, true);
afterGameEnd(enemyName, finalWinner);
if (Config.instance().getSettingData().disableWinLose)
exitDuelScene();
}
fb.dispose();
}
}));
} else {
afterGameEnd(enemyName, winner, false, false);
afterGameEnd(enemyName, winner);
}
}
void afterGameEnd(String enemyName, boolean winner, boolean showOverlay, boolean alternate) {
Runnable runnable = () -> Gdx.app.postRunnable(()-> {
Runnable endRunnable = null;
void afterGameEnd(String enemyName, boolean winner) {
endRunnable = () -> Gdx.app.postRunnable(()-> {
if (GameScene.instance().isNotInWorldMap()) {
SoundSystem.instance.pause();
GameHUD.getInstance().playAudio();
@@ -160,14 +163,9 @@ public class DuelScene extends ForgeScene {
((IAfterMatch) last).setWinner(winner);
}
});
if (showOverlay) {
FThreads.invokeInEdtNowOrLater(() -> {
matchOverlay = new LoadingOverlay(runnable, true, alternate);
matchOverlay.show();
});
} else {
runnable.run();
}
}
public void exitDuelScene() {
Forge.setTransitionScreen(new TransitionScreen(endRunnable, Forge.takeScreenshot(), false, false));
}
void addEffects(RegisteredPlayer player, Array<EffectData> effects) {

View File

@@ -17,7 +17,6 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalTime;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
@@ -203,7 +202,6 @@ public class SettingsScene extends UIScene {
boolean value = ((CheckBox) actor).isChecked();
Config.instance().getSettingData().fullScreen = value;
Config.instance().saveSettings();
setTargetTime(LocalTime.now().getHour());
//update
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) {
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_LANDSCAPE_MODE, value);
@@ -223,6 +221,14 @@ public class SettingsScene extends UIScene {
}
}
});
addSettingField(Forge.getLocalizer().getMessage("lblDisableWinLose"), Config.instance().getSettingData().disableWinLose, new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
boolean value = ((CheckBox) actor).isChecked();
Config.instance().getSettingData().disableWinLose = value;
Config.instance().saveSettings();
}
});
addCheckBox(Forge.getLocalizer().getMessage("lblCardName"), ForgePreferences.FPref.UI_OVERLAY_CARD_NAME);
addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC, 0, 100);
addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 0, 100);

View File

@@ -335,13 +335,17 @@ public class GameHUD extends Stage {
unloadAudio();
SoundSystem.instance.resume(); // resume World BGM
}
//unequip and reequip abilities
updateAbility();
}
void updateAbility() {
void clearAbility() {
for (TextraButton button : abilityButtonMap) {
button.remove();
}
abilityButtonMap.clear();
}
void updateAbility() {
clearAbility();
setAbilityButton(AdventurePlayer.current().getEquippedAbility1());
setAbilityButton(AdventurePlayer.current().getEquippedAbility2());
float x = Forge.isLandscapeMode() ? 426f : 216f;
@@ -568,6 +572,14 @@ public class GameHUD extends Stage {
}
opacity = visible ? 1f : 0.4f;
}
void toggleConsole() {
console.toggle();
if (console.isVisible()) {
clearAbility();
} else {
updateAbility();
}
}
@Override
public boolean keyUp(int keycode) {
@@ -582,12 +594,12 @@ public class GameHUD extends Stage {
}
ui.pressDown(keycode);
if (keycode == Input.Keys.F9 || keycode == Input.Keys.F10) {
console.toggle();
toggleConsole();
return true;
}
if (keycode == Input.Keys.BACK) {
if (console.isVisible()) {
console.toggle();
toggleConsole();
}
}
if (console.isVisible())
@@ -699,7 +711,7 @@ public class GameHUD extends Stage {
@Override
public boolean longPress(Actor actor, float x, float y) {
console.toggle();
toggleConsole();
return super.longPress(actor, x, y);
}
}

View File

@@ -350,7 +350,7 @@ public class CardUtil {
public static Deck generateDeck(GeneratedDeckData data, CardEdition starterEdition, boolean discourageDuplicates)
{
List<String> editionCodes = (starterEdition != null)?Arrays.asList(starterEdition.getCode(), starterEdition.getCode2()):Arrays.asList("JMP", "J22", "DMU","BRO");
List<String> editionCodes = (starterEdition != null)?Arrays.asList(starterEdition.getCode(), starterEdition.getCode2()):Arrays.asList("JMP", "J22", "DMU", "BRO", "ONE", "MOM");
Deck deck= new Deck(data.name);
if(data.mainDeck!=null)
{

View File

@@ -6,11 +6,11 @@ import java.util.List;
import java.util.Map;
import forge.adventure.scene.DuelScene;
import forge.adventure.util.Config;
import forge.ai.GameState;
import forge.deck.Deck;
import forge.game.player.Player;
import forge.item.IPaperCard;
import forge.screens.TransitionScreen;
import forge.util.collect.FCollection;
import org.apache.commons.lang3.StringUtils;
@@ -312,14 +312,12 @@ public class MatchController extends AbstractGuiGame {
@Override
public void finishGame() {
if (Forge.isMobileAdventureMode) {
Forge.setCursor(null, "0");
if (DuelScene.instance().hasCallbackExit())
if (Config.instance().getSettingData().disableWinLose) {
Forge.setCursor(null, "0");
if (!DuelScene.instance().hasCallbackExit())
DuelScene.instance().exitDuelScene();
return;
Forge.setTransitionScreen(new TransitionScreen(() -> {
Forge.clearTransitionScreen();
Forge.clearCurrentScreen();
}, Forge.takeScreenshot(), false, false));
return;
}
}
if (hasLocalPlayers() || getGameView().isMatchOver()) {
view.setViewWinLose(new ViewWinLose(getGameView()));

View File

@@ -0,0 +1,46 @@
package forge.screens.match.winlose;
import forge.Forge;
import forge.adventure.scene.DuelScene;
import forge.game.GameView;
public class AdventureWinLose extends ControlWinLose {
/**
* @param v &emsp; ViewWinLose
* @param game
*/
public AdventureWinLose(ViewWinLose v, GameView game) {
super(v, game);
v.getBtnContinue().setVisible(false);
v.getBtnRestart().setVisible(false);
v.getLabelShowBattlefield().setVisible(false);
v.getBtnQuit().setText(Forge.getLocalizer().getMessage("lblBackToAdventure"));
Forge.setCursor(null, "0");
}
@Override
public void actionOnContinue() {
//Do Nothing
}
@Override
public void actionOnRestart() {
//Do Nothing
}
@Override
public void actionOnQuit() {
getView().hide();
DuelScene.instance().exitDuelScene();
}
@Override
public void saveOptions() {
//Do Nothing
}
@Override
public void showRewards() {
//Do Nothing
}
}

View File

@@ -123,6 +123,9 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
}).build());
lblTitle.setText(composeTitle(game0));
if (Forge.isMobileAdventureMode)
control = new AdventureWinLose(this, game0);
showGameOutcomeSummary();
showPlayerScores();
control.showRewards();
@@ -152,6 +155,10 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
return this.btnQuit;
}
public FLabel getLabelShowBattlefield() {
return this.btnShowBattlefield;
}
private void showGameOutcomeSummary() {
for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) {
pnlOutcomes.add(new FLabel.Builder().text(o.message).font(FSkinFont.get(14)).build());
@@ -191,12 +198,20 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
y += h + dy;
h = height / 12;
btnContinue.setBounds(x, y, w, h);
y += h + dy;
btnRestart.setBounds(x, y, w, h);
y += h + dy;
btnQuit.setBounds(x, y, w, h);
y += h + dy;
if (Forge.isMobileAdventureMode) {
btnQuit.setBounds(x, y, w, h);
y += h + dy;
btnContinue.setVisible(false);
btnRestart.setVisible(false);
} else {
btnContinue.setBounds(x, y, w, h);
y += h + dy;
btnRestart.setBounds(x, y, w, h);
y += h + dy;
btnQuit.setBounds(x, y, w, h);
y += h + dy;
}
h = lblLog.getAutoSizeBounds().height + dy;
lblLog.setBounds(x, y, w, h);

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version>
<version>1.6.57-SNAPSHOT</version>
</parent>
<artifactId>forge-gui</artifactId>

View File

@@ -84,8 +84,8 @@
"pileDecks": {
"W":"decks/starter/pile_white_e.json",
"B":"decks/starter/pile_black_e.json",
"U":"decks/starter/pile_blue_e.json",
"R":"decks/starter/pile_red_e.json",
"U":"decks/starter/pile_blue_e.json",
"R":"decks/starter/pile_red_e.json",
"G":"decks/starter/pile_green_e.json"
},
"startItems": [
@@ -122,8 +122,8 @@
"pileDecks": {
"W":"decks/starter/pile_white_n.json",
"B":"decks/starter/pile_black_n.json",
"U":"decks/starter/pile_blue_n.json",
"R":"decks/starter/pile_red_n.json",
"U":"decks/starter/pile_blue_n.json",
"R":"decks/starter/pile_red_n.json",
"G":"decks/starter/pile_green_n.json"
},
"startItems": [
@@ -191,8 +191,8 @@
"pileDecks": {
"W":"decks/starter/pile_white_h.json",
"B":"decks/starter/pile_black_h.json",
"U":"decks/starter/pile_blue_h.json",
"R":"decks/starter/pile_red_h.json",
"U":"decks/starter/pile_blue_h.json",
"R":"decks/starter/pile_red_h.json",
"G":"decks/starter/pile_green_h.json"
}
}
@@ -212,7 +212,7 @@
"Brother's War",
"Jumpstart 22",
"Phyrexia: ONE",
"March o.t Machine",
"MOM",
"(All)"
]
}

View File

@@ -0,0 +1,43 @@
[metadata]
Name=copperhostbrutalizer
[Avatar]
[Main]
2 Blighted Burgeoning|MOM|1
1 Bloated Contaminator|ONE|1
1 Bloated Contaminator|ONE|2
1 Bloated Processor|MOM|1
1 Bloated Processor|MOM|2
2 Converter Beast|MOM|1
2 Drown in Ichor|ONE|1
4 Elvish Vatkeeper|MOM|1
2 Expand the Sphere|ONE|1
1 Forest|ONE|1
5 Forest|ONE|2
6 Forest|ONE|3
2 Gift of Compleation|MOM|1
2 Glistening Dawn|MOM|2
1 Grafted Butcher|MOM|1
1 Grafted Butcher|MOM|2
2 Gulping Scraptrap|ONE|1
2 Ichor Drinker|MOM|1
4 Jungle Hollow|MOM|1
3 Swamp|ONE|1
1 Swamp|ONE|2
3 Swamp|ONE|3
1 Swamp|ONE|4
2 Tangled Skyline|MOM|1
2 Traumatic Revelation|MOM|1
2 Vat Emergence|ONE|1
2 Vat of Rebirth|ONE|1
2 Venomous Brutalizer|ONE|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,47 @@
[metadata]
Name=drossgrimnarch
[Avatar]
[Main]
2 Annihilating Glare|ONE|1
2 Bilious Skulldweller|ONE|1
2 Blightwing Whelp|YONE|1
2 Chittering Skitterling|ONE|1
2 Darkslick Shores|ONE|1
4 Dismal Backwater|MOM|1
2 Distorted Curiosity|ONE|1
2 Drown in Ichor|ONE|1
1 Experimental Augury|ONE|1
1 Experimental Augury|ONE|2
1 Grafted Butcher|MOM|1
1 Grafted Butcher|MOM|2
2 Grim Affliction|NPH|1
2 Gulping Scraptrap|ONE|1
2 Infectious Inquiry|ONE|1
2 Island|MOM|1
3 Island|MOM|2
1 Island|MOM|3
1 Mercurial Spelldancer|ONE|1
1 Mercurial Spelldancer|ONE|2
1 Myr Convert|ONE|1
1 Myr Convert|ONE|2
2 Necrogen Communion|ONE|1
2 Pestilent Syphoner|ONE|1
2 Quicksilver Servitor|YONE|1
2 Sheoldred's Headcleaver|ONE|1
5 Swamp|MOM|1
1 Swamp|MOM|2
4 Swamp|MOM|3
1 Thrummingbird|ONE|1
1 Thrummingbird|ONE|2
2 Viral Drake|NPH|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,45 @@
[metadata]
Name=furnacetormentor
[Avatar]
[Main]
1 All Will Be One|ONE|1
1 All Will Be One|ONE|2
2 Armored Scrapgorger|ONE|1
2 Axiom Engraver|ONE|1
2 Blighted Burgeoning|MOM|1
2 Churning Reservoir|ONE|1
2 Cinderslash Ravager|ONE|1
2 Converter Beast|MOM|1
2 Copperline Gorge|ONE|1
2 Copperline Gorge|ONE|2
2 Evolving Adaptive|ONE|1
2 Expand the Sphere|ONE|1
2 Exuberant Fuseling|ONE|1
1 Forest|ONE|1
1 Forest|ONE|2
1 Forest|ONE|3
4 Forest|ONE|4
4 Magmatic Sprinter|ONE|1
3 Mountain|ONE|1
3 Mountain|ONE|2
2 Mountain|ONE|3
5 Mountain|ONE|4
2 Nahiri's Warcrafting|MOM|1
2 Thrill of Possibility|ONE|1
1 Urabrask's Anointer|ONE|1
1 Urabrask's Anointer|ONE|2
2 Urabrask's Forge|ONE|1
2 Urabrask's Forge|ONE|2
1 Vindictive Flamestoker|ONE|1
1 Vindictive Flamestoker|ONE|2
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,43 @@
[metadata]
Name=gitaxianscientist
[Avatar]
[Main]
2 Blighted Agent|NPH|1
2 Bloated Contaminator|ONE|2
2 Contagious Vorrac|ONE|1
4 Distorted Curiosity|ONE|1
1 Experimental Augury|ONE|1
1 Experimental Augury|ONE|2
2 Forest|ONE|1
2 Forest|ONE|2
3 Forest|ONE|3
1 Forest|ONE|4
2 Glistener Seer|ONE|1
2 Ichorspit Basilisk|ONE|1
2 Infectious Bite|ONE|1
6 Island|ONE|1
3 Island|ONE|2
2 Island|ONE|3
3 Island|ONE|4
1 Mindsplice Apparatus|ONE|1
1 Mindsplice Apparatus|ONE|2
1 Myr Convert|ONE|1
1 Myr Convert|ONE|2
2 Serum Snare|ONE|1
2 Tainted Observer|ONE|1
2 The Seedcore|ONE|2
2 Thrummingbird|ONE|1
2 Thrummingbird|ONE|2
4 Viral Drake|NPH|1
2 Vivisurgeon's Insight|ONE|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,45 @@
[metadata]
Name=phyrexianangel
[Avatar]
[Main]
2 Apostle of Invasion|ONE|1
2 Bloated Contaminator|ONE|1
2 Blossoming Sands|MOM|1
2 Charge of the Mites|ONE|1
4 Crawling Chorus|ONE|1
2 Duelist of Deep Faith|ONE|1
2 Flensing Raptor|ONE|1
3 Forest|ONE|3
3 Forest|ONE|4
2 Infectious Bite|ONE|1
2 Infested Fleshcutter|ONE|1
2 Mite Overseer|ONE|2
1 Myr Convert|ONE|1
1 Myr Convert|ONE|2
2 Norn's Wellspring|ONE|1
1 Ossification|ONE|1
1 Ossification|ONE|2
2 Phyrexia's Core|NPH|1
2 Plague Nurse|ONE|1
3 Plains|ONE|1
2 Plains|ONE|2
1 Plains|ONE|3
4 Plains|ONE|4
2 Razorverge Thicket|ONE|2
1 Sinew Dancer|ONE|1
1 Sinew Dancer|ONE|2
2 Slaughter Singer|ONE|1
2 Slaughter Singer|ONE|2
2 The Seedcore|ONE|1
2 Venerated Rotpriest|ONE|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -3,7 +3,7 @@
"template":
{
"count":60,
"colors":["White", "Black"],
"colors":["White"],
"tribe":"Phyrexian",
"tribeCards":1.0,
"tribeSynergyCards":0.5,

View File

@@ -151,6 +151,7 @@
&quot;Challenger 20&quot;,
&quot;Challenger 21&quot;,
&quot;Challenger 22&quot;,
&quot;Copper Host Infector&quot;,
&quot;Dino&quot;,
&quot;Eldraine Faerie&quot;,
&quot;Elf&quot;,

View File

@@ -137,6 +137,7 @@
&quot;Challenger 22&quot;,
&quot;Djinn&quot;,
&quot;Elemental&quot;,
&quot;Gitaxian Underling&quot;,
&quot;Merfolk&quot;,
&quot;Merfolk Avatar&quot;,
&quot;Merfolk Fighter&quot;,

View File

@@ -136,6 +136,7 @@
&quot;Efreet&quot;,
&quot;Fire Elemental&quot;,
&quot;Flame Elemental&quot;,
&quot;Furnace Goblin&quot;,
&quot;Goblin&quot;,
&quot;Goblin Chief&quot;,
&quot;Goblin Warrior&quot;,

View File

@@ -145,6 +145,7 @@
&quot;Human guard&quot;,
&quot;Knight&quot;,
&quot;Monk&quot;,
&quot;Orthodoxy Duelist&quot;,
&quot;White Dwarf&quot;,
&quot;White Wiz1&quot;,
&quot;White Wiz2&quot;,

View File

@@ -67,6 +67,7 @@
&quot;Dark Knight&quot;,
&quot;Death Knight&quot;,
&quot;Demon&quot;,
&quot;Dross Gladiator&quot;,
&quot;Ghoul&quot;,
&quot;Ghost&quot;,
&quot;Harpy&quot;,

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="30" height="17" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="76">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="30" height="17" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="77">
<editorsettings>
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
@@ -13,7 +13,7 @@
</layer>
<layer id="1" name="Background" width="30" height="17">
<data encoding="base64" compression="zlib">
eJy1lVEOhCAMRP01epYeYw9mun94H4+3IbFhtrYKFkgaIAiPMgNuyzRtFfGZ/aiZ/zYSldjpvz+KeayFx2eN7Tw+istnbkzXPfTm4nqoZ+Za+vbiW1zR2vJa/j7iM2vfieriS4Xf6nmPy6BvUnrfRYQrdwf99MTnDtyavEZwUT+dLz/kHeXqs9Uh49pXLX7GIncW3ym9D2xH7nEuUgvX83RSeUaYwpX3wdJO96Nc69y9f9EInsX1zrd1zR/ubyqt
eJy1lVEOhCAMRP3duGfhGB7MdP/Y++zxDIkTx24rCJVkAgTD67SA6zxNa0XLq021fXqU06FvOs85tkjm733wZO95XNbBjubK7k3SfwzR+WYfrGywisr3EWyLi1pb8YxywfPO1ZU+6cy/E4fHFapvVvW+0ggXd4fPU40vAdwWX09wuX7ar1R8j3J1brWwPnKuuOHO8jul4+CxFXerSkMPrnems+Gzlwku3gerdnoObq9XK+/evyjCZwvXy+/dPTf2kSWe
</data>
</layer>
<layer id="3" name="Clutter" width="30" height="17">
@@ -26,7 +26,7 @@
</layer>
<layer id="2" name="Walls" width="30" height="17">
<data encoding="base64" compression="zlib">
eJzbwcPAsIMI3K6HGxOjXwYNE6OnD2g2PjCBCLtH7SUOT9eD4GlQN8zQQ4jRKn6R01Ub1N4OEtMZLcIZHaC7iV72TtDD5NPDXmzuGGr2TkfCIIDMxxau9PAvuj3z0NxJy3IDnU+v8goEZujhLkdoaS++8pIW9uLzJ6X2wsoeZAATI6deAABIX/aO
eJzbwcPAsIMAbtNjYGjHgzv0CJshg4YJqQfhPqC5+MCEUXupYu80oLnToXgd1A0bkMRm0Mhe5HQ1D2rvAhLTGS3CGR3cxOIOetg7QQ+TTw97sbljKNl7CCntToe6AZm/DEu40sO/6PZcRHPnDDrZi60coaW9G/RwlyO0tBdfeUkLe88RUV6SY+8dpLIHGcDEbpNRPgMAC9v4YQ==
</data>
</layer>
<layer id="8" name="Archway" width="30" height="17">
@@ -79,25 +79,25 @@
]</property>
</properties>
</object>
<object id="75" template="../obj/booster.tx" x="254.75" y="33.5">
<object id="75" template="../obj/booster.tx" x="216.75" y="32.8333">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;blue&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;blue&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
@@ -107,6 +107,7 @@
</property>
</properties>
</object>
<object id="76" template="../obj/treasure.tx" x="256" y="32"/>
</objectgroup>
<objectgroup id="7" name="Waypoints">
<object id="64" template="../obj/waypoint.tx" x="273" y="145"/>

View File

@@ -58,21 +58,21 @@
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;black&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;black&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="29" height="34" tilewidth="16" tileheight="16" infinite="0" nextlayerid="8" nextobjectid="74">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="29" height="34" tilewidth="16" tileheight="16" infinite="0" nextlayerid="8" nextobjectid="75">
<editorsettings>
<export format="tmx"/>
</editorsettings>
@@ -49,21 +49,21 @@
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;green&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;green&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
@@ -101,6 +101,7 @@
<property name="waypoints" value=""/>
</properties>
</object>
<object id="74" template="../obj/treasure.tx" x="217" y="71"/>
</objectgroup>
<objectgroup id="7" name="Waypoints">
<object id="57" template="../obj/waypoint.tx" x="88.5" y="327.167"/>

View File

@@ -46,7 +46,6 @@
<properties>
<property name="enemy" value="Furnace Tormentor"/>
<property name="threatRange" value="20"/>
<property name="waypoints" value="60,58,57,62,60,58,57,62,60,59,61,62"/>
</properties>
</object>
<object id="78" template="../obj/enemy.tx" x="136.333" y="219.333">
@@ -99,21 +98,21 @@
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;red&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;red&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="30" height="17" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="78">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="30" height="17" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="79">
<editorsettings>
<export format="tmx"/>
</editorsettings>
@@ -64,21 +64,21 @@
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;white&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;white&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;editions&quot;: [ &quot;NPH&quot;,&quot;ONE&quot;,&quot;MOM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
@@ -88,6 +88,7 @@
</property>
</properties>
</object>
<object id="78" template="../obj/treasure.tx" x="315" y="74"/>
</objectgroup>
<objectgroup id="8" name="Waypoints">
<object id="70" template="../obj/waypoint.tx" x="144" y="176"/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -602,4 +602,64 @@ Werewolf_f
size: 16, 16
Werewolf_f
size: 16, 16
xy: 144, 304
xy: 144, 304
Leonin_m
xy: 0, 320
size: 16, 16
Leonin_m
xy: 16, 320
size: 16, 16
Leonin_m
xy: 32, 320
size: 16, 16
Leonin_m
xy: 48, 320
size: 16, 16
Leonin_m
xy: 64, 320
size: 16, 16
Leonin_m
xy: 80, 320
size: 16, 16
Leonin_m
xy: 96, 320
size: 16, 16
Leonin_m
xy: 112, 320
size: 16, 16
Leonin_m
xy: 128, 320
size: 16, 16
Leonin_m
xy: 144, 320
size: 16, 16
Leonin_f
xy: 0, 336
size: 16, 16
Leonin_f
xy: 16, 336
size: 16, 16
Leonin_f
xy: 32, 336
size: 16, 16
Leonin_f
xy: 48, 336
size: 16, 16
Leonin_f
xy: 64, 336
size: 16, 16
Leonin_f
xy: 80, 336
size: 16, 16
Leonin_f
xy: 96, 336
size: 16, 16
Leonin_f
xy: 112, 336
size: 16, 16
Leonin_f
xy: 128, 336
size: 16, 16
Leonin_f
size: 16, 16
xy: 144, 336

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -0,0 +1,485 @@
leonin_f.png
size: 64,96
format: RGBA8888
filter: Nearest,Nearest
repeat: none
IdleRight
xy: 0, 0
size: 16, 16
IdleRight
xy: 16, 0
size: 16, 16
IdleRight
xy: 32, 0
size: 16, 16
IdleRight
xy: 48, 0
size: 16, 16
IdleRightDown
xy: 64, 0
size: 16, 16
IdleRightDown
xy: 80, 0
size: 16, 16
IdleRightDown
xy: 96, 0
size: 16, 16
IdleRightDown
xy: 112, 0
size: 16, 16
IdleDown
xy: 128, 0
size: 16, 16
IdleDown
xy: 144, 0
size: 16, 16
IdleDown
xy: 160, 0
size: 16, 16
IdleDown
xy: 176, 0
size: 16, 16
IdleLeftDown
xy: 192, 0
size: 16, 16
IdleLeftDown
xy: 208, 0
size: 16, 16
IdleLeftDown
xy: 224, 0
size: 16, 16
IdleLeftDown
xy: 240, 0
size: 16, 16
IdleLeft
xy: 256, 0
size: 16, 16
IdleLeft
xy: 272, 0
size: 16, 16
IdleLeft
xy: 288, 0
size: 16, 16
IdleLeft
xy: 304, 0
size: 16, 16
IdleLeftUp
xy: 320, 0
size: 16, 16
IdleLeftUp
xy: 336, 0
size: 16, 16
IdleLeftUp
xy: 352, 0
size: 16, 16
IdleLeftUp
xy: 368, 0
size: 16, 16
IdleUp
xy: 384, 0
size: 16, 16
IdleUp
xy: 400, 0
size: 16, 16
IdleUp
xy: 416, 0
size: 16, 16
IdleUp
xy: 432, 0
size: 16, 16
IdleRightUp
xy: 448, 0
size: 16, 16
IdleRightUp
xy: 464, 0
size: 16, 16
IdleRightUp
xy: 480, 0
size: 16, 16
IdleRightUp
xy: 496, 0
size: 16, 16
WalkRight
xy: 0, 16
size: 16, 16
WalkRight
xy: 16, 16
size: 16, 16
WalkRight
xy: 32, 16
size: 16, 16
WalkRight
xy: 48, 16
size: 16, 16
WalkRightDown
xy: 64, 16
size: 16, 16
WalkRightDown
xy: 80, 16
size: 16, 16
WalkRightDown
xy: 96, 16
size: 16, 16
WalkRightDown
xy: 112, 16
size: 16, 16
WalkDown
xy: 128, 16
size: 16, 16
WalkDown
xy: 144, 16
size: 16, 16
WalkDown
xy: 160, 16
size: 16, 16
WalkDown
xy: 176, 16
size: 16, 16
WalkLeftDown
xy: 192, 16
size: 16, 16
WalkLeftDown
xy: 208, 16
size: 16, 16
WalkLeftDown
xy: 224, 16
size: 16, 16
WalkLeftDown
xy: 240, 16
size: 16, 16
WalkLeft
xy: 256, 16
size: 16, 16
WalkLeft
xy: 272, 16
size: 16, 16
WalkLeft
xy: 288, 16
size: 16, 16
WalkLeft
xy: 304, 16
size: 16, 16
WalkLeftUp
xy: 320, 16
size: 16, 16
WalkLeftUp
xy: 336, 16
size: 16, 16
WalkLeftUp
xy: 352, 16
size: 16, 16
WalkLeftUp
xy: 368, 16
size: 16, 16
WalkUp
xy: 384, 16
size: 16, 16
WalkUp
xy: 400, 16
size: 16, 16
WalkUp
xy: 416, 16
size: 16, 16
WalkUp
xy: 432, 16
size: 16, 16
WalkRightUp
xy: 448, 16
size: 16, 16
WalkRightUp
xy: 464, 16
size: 16, 16
WalkRightUp
xy: 480, 16
size: 16, 16
WalkRightUp
xy: 496, 16
size: 16, 16
AttackRight
xy: 0, 32
size: 16, 16
AttackRight
xy: 16, 32
size: 16, 16
AttackRight
xy: 32, 32
size: 16, 16
AttackRight
xy: 48, 32
size: 16, 16
AttackRightDown
xy: 64, 32
size: 16, 16
AttackRightDown
xy: 80, 32
size: 16, 16
AttackRightDown
xy: 96, 32
size: 16, 16
AttackRightDown
xy: 112, 32
size: 16, 16
AttackDown
xy: 128, 32
size: 16, 16
AttackDown
xy: 144, 32
size: 16, 16
AttackDown
xy: 160, 32
size: 16, 16
AttackDown
xy: 176, 32
size: 16, 16
AttackLeftDown
xy: 192, 32
size: 16, 16
AttackLeftDown
xy: 208, 32
size: 16, 16
AttackLeftDown
xy: 224, 32
size: 16, 16
AttackLeftDown
xy: 240, 32
size: 16, 16
AttackLeft
xy: 256, 32
size: 16, 16
AttackLeft
xy: 272, 32
size: 16, 16
AttackLeft
xy: 288, 32
size: 16, 16
AttackLeft
xy: 304, 32
size: 16, 16
AttackLeftUp
xy: 320, 32
size: 16, 16
AttackLeftUp
xy: 336, 32
size: 16, 16
AttackLeftUp
xy: 352, 32
size: 16, 16
AttackLeftUp
xy: 368, 32
size: 16, 16
AttackUp
xy: 384, 32
size: 16, 16
AttackUp
xy: 400, 32
size: 16, 16
AttackUp
xy: 416, 32
size: 16, 16
AttackUp
xy: 432, 32
size: 16, 16
AttackRightUp
xy: 448, 32
size: 16, 16
AttackRightUp
xy: 464, 32
size: 16, 16
AttackRightUp
xy: 480, 32
size: 16, 16
AttackRightUp
xy: 496, 32
size: 16, 16
HitRight
xy: 0, 48
size: 16, 16
HitRight
xy: 16, 48
size: 16, 16
HitRight
xy: 32, 48
size: 16, 16
HitRight
xy: 48, 48
size: 16, 16
HitRightDown
xy: 64, 48
size: 16, 16
HitRightDown
xy: 80, 48
size: 16, 16
HitRightDown
xy: 96, 48
size: 16, 16
HitRightDown
xy: 112, 48
size: 16, 16
HitDown
xy: 128, 48
size: 16, 16
HitDown
xy: 144, 48
size: 16, 16
HitDown
xy: 160, 48
size: 16, 16
HitDown
xy: 176, 48
size: 16, 16
HitLeftDown
xy: 192, 48
size: 16, 16
HitLeftDown
xy: 208, 48
size: 16, 16
HitLeftDown
xy: 224, 48
size: 16, 16
HitLeftDown
xy: 240, 48
size: 16, 16
HitLeft
xy: 256, 48
size: 16, 16
HitLeft
xy: 272, 48
size: 16, 16
HitLeft
xy: 288, 48
size: 16, 16
HitLeft
xy: 304, 48
size: 16, 16
HitLeftUp
xy: 320, 48
size: 16, 16
HitLeftUp
xy: 336, 48
size: 16, 16
HitLeftUp
xy: 352, 48
size: 16, 16
HitLeftUp
xy: 368, 48
size: 16, 16
HitUp
xy: 384, 48
size: 16, 16
HitUp
xy: 400, 48
size: 16, 16
HitUp
xy: 416, 48
size: 16, 16
HitUp
xy: 432, 48
size: 16, 16
HitRightUp
xy: 448, 48
size: 16, 16
HitRightUp
xy: 464, 48
size: 16, 16
HitRightUp
xy: 480, 48
size: 16, 16
HitRightUp
xy: 496, 48
size: 16, 16
DeathRight
xy: 0, 64
size: 16, 16
DeathRight
xy: 16, 64
size: 16, 16
DeathRight
xy: 32, 64
size: 16, 16
DeathRight
xy: 48, 64
size: 16, 16
DeathRightDown
xy: 64, 64
size: 16, 16
DeathRightDown
xy: 80, 64
size: 16, 16
DeathRightDown
xy: 96, 64
size: 16, 16
DeathRightDown
xy: 112, 64
size: 16, 16
DeathDown
xy: 128, 64
size: 16, 16
DeathDown
xy: 144, 64
size: 16, 16
DeathDown
xy: 160, 64
size: 16, 16
DeathDown
xy: 176, 64
size: 16, 16
DeathLeftDown
xy: 192, 64
size: 16, 16
DeathLeftDown
xy: 208, 64
size: 16, 16
DeathLeftDown
xy: 224, 64
size: 16, 16
DeathLeftDown
xy: 240, 64
size: 16, 16
DeathLeft
xy: 256, 64
size: 16, 16
DeathLeft
xy: 272, 64
size: 16, 16
DeathLeft
xy: 288, 64
size: 16, 16
DeathLeft
xy: 304, 64
size: 16, 16
DeathLeftUp
xy: 320, 64
size: 16, 16
DeathLeftUp
xy: 336, 64
size: 16, 16
DeathLeftUp
xy: 352, 64
size: 16, 16
DeathLeftUp
xy: 368, 64
size: 16, 16
DeathUp
xy: 384, 64
size: 16, 16
DeathUp
xy: 400, 64
size: 16, 16
DeathUp
xy: 416, 64
size: 16, 16
DeathUp
xy: 432, 64
size: 16, 16
DeathRightUp
xy: 448, 64
size: 16, 16
DeathRightUp
xy: 464, 64
size: 16, 16
DeathRightUp
xy: 480, 64
size: 16, 16
DeathRightUp
xy: 496, 64
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,485 @@
leonin_m.png
size: 64,96
format: RGBA8888
filter: Nearest,Nearest
repeat: none
IdleRight
xy: 0, 0
size: 16, 16
IdleRight
xy: 16, 0
size: 16, 16
IdleRight
xy: 32, 0
size: 16, 16
IdleRight
xy: 48, 0
size: 16, 16
IdleRightDown
xy: 64, 0
size: 16, 16
IdleRightDown
xy: 80, 0
size: 16, 16
IdleRightDown
xy: 96, 0
size: 16, 16
IdleRightDown
xy: 112, 0
size: 16, 16
IdleDown
xy: 128, 0
size: 16, 16
IdleDown
xy: 144, 0
size: 16, 16
IdleDown
xy: 160, 0
size: 16, 16
IdleDown
xy: 176, 0
size: 16, 16
IdleLeftDown
xy: 192, 0
size: 16, 16
IdleLeftDown
xy: 208, 0
size: 16, 16
IdleLeftDown
xy: 224, 0
size: 16, 16
IdleLeftDown
xy: 240, 0
size: 16, 16
IdleLeft
xy: 256, 0
size: 16, 16
IdleLeft
xy: 272, 0
size: 16, 16
IdleLeft
xy: 288, 0
size: 16, 16
IdleLeft
xy: 304, 0
size: 16, 16
IdleLeftUp
xy: 320, 0
size: 16, 16
IdleLeftUp
xy: 336, 0
size: 16, 16
IdleLeftUp
xy: 352, 0
size: 16, 16
IdleLeftUp
xy: 368, 0
size: 16, 16
IdleUp
xy: 384, 0
size: 16, 16
IdleUp
xy: 400, 0
size: 16, 16
IdleUp
xy: 416, 0
size: 16, 16
IdleUp
xy: 432, 0
size: 16, 16
IdleRightUp
xy: 448, 0
size: 16, 16
IdleRightUp
xy: 464, 0
size: 16, 16
IdleRightUp
xy: 480, 0
size: 16, 16
IdleRightUp
xy: 496, 0
size: 16, 16
WalkRight
xy: 0, 16
size: 16, 16
WalkRight
xy: 16, 16
size: 16, 16
WalkRight
xy: 32, 16
size: 16, 16
WalkRight
xy: 48, 16
size: 16, 16
WalkRightDown
xy: 64, 16
size: 16, 16
WalkRightDown
xy: 80, 16
size: 16, 16
WalkRightDown
xy: 96, 16
size: 16, 16
WalkRightDown
xy: 112, 16
size: 16, 16
WalkDown
xy: 128, 16
size: 16, 16
WalkDown
xy: 144, 16
size: 16, 16
WalkDown
xy: 160, 16
size: 16, 16
WalkDown
xy: 176, 16
size: 16, 16
WalkLeftDown
xy: 192, 16
size: 16, 16
WalkLeftDown
xy: 208, 16
size: 16, 16
WalkLeftDown
xy: 224, 16
size: 16, 16
WalkLeftDown
xy: 240, 16
size: 16, 16
WalkLeft
xy: 256, 16
size: 16, 16
WalkLeft
xy: 272, 16
size: 16, 16
WalkLeft
xy: 288, 16
size: 16, 16
WalkLeft
xy: 304, 16
size: 16, 16
WalkLeftUp
xy: 320, 16
size: 16, 16
WalkLeftUp
xy: 336, 16
size: 16, 16
WalkLeftUp
xy: 352, 16
size: 16, 16
WalkLeftUp
xy: 368, 16
size: 16, 16
WalkUp
xy: 384, 16
size: 16, 16
WalkUp
xy: 400, 16
size: 16, 16
WalkUp
xy: 416, 16
size: 16, 16
WalkUp
xy: 432, 16
size: 16, 16
WalkRightUp
xy: 448, 16
size: 16, 16
WalkRightUp
xy: 464, 16
size: 16, 16
WalkRightUp
xy: 480, 16
size: 16, 16
WalkRightUp
xy: 496, 16
size: 16, 16
AttackRight
xy: 0, 32
size: 16, 16
AttackRight
xy: 16, 32
size: 16, 16
AttackRight
xy: 32, 32
size: 16, 16
AttackRight
xy: 48, 32
size: 16, 16
AttackRightDown
xy: 64, 32
size: 16, 16
AttackRightDown
xy: 80, 32
size: 16, 16
AttackRightDown
xy: 96, 32
size: 16, 16
AttackRightDown
xy: 112, 32
size: 16, 16
AttackDown
xy: 128, 32
size: 16, 16
AttackDown
xy: 144, 32
size: 16, 16
AttackDown
xy: 160, 32
size: 16, 16
AttackDown
xy: 176, 32
size: 16, 16
AttackLeftDown
xy: 192, 32
size: 16, 16
AttackLeftDown
xy: 208, 32
size: 16, 16
AttackLeftDown
xy: 224, 32
size: 16, 16
AttackLeftDown
xy: 240, 32
size: 16, 16
AttackLeft
xy: 256, 32
size: 16, 16
AttackLeft
xy: 272, 32
size: 16, 16
AttackLeft
xy: 288, 32
size: 16, 16
AttackLeft
xy: 304, 32
size: 16, 16
AttackLeftUp
xy: 320, 32
size: 16, 16
AttackLeftUp
xy: 336, 32
size: 16, 16
AttackLeftUp
xy: 352, 32
size: 16, 16
AttackLeftUp
xy: 368, 32
size: 16, 16
AttackUp
xy: 384, 32
size: 16, 16
AttackUp
xy: 400, 32
size: 16, 16
AttackUp
xy: 416, 32
size: 16, 16
AttackUp
xy: 432, 32
size: 16, 16
AttackRightUp
xy: 448, 32
size: 16, 16
AttackRightUp
xy: 464, 32
size: 16, 16
AttackRightUp
xy: 480, 32
size: 16, 16
AttackRightUp
xy: 496, 32
size: 16, 16
HitRight
xy: 0, 48
size: 16, 16
HitRight
xy: 16, 48
size: 16, 16
HitRight
xy: 32, 48
size: 16, 16
HitRight
xy: 48, 48
size: 16, 16
HitRightDown
xy: 64, 48
size: 16, 16
HitRightDown
xy: 80, 48
size: 16, 16
HitRightDown
xy: 96, 48
size: 16, 16
HitRightDown
xy: 112, 48
size: 16, 16
HitDown
xy: 128, 48
size: 16, 16
HitDown
xy: 144, 48
size: 16, 16
HitDown
xy: 160, 48
size: 16, 16
HitDown
xy: 176, 48
size: 16, 16
HitLeftDown
xy: 192, 48
size: 16, 16
HitLeftDown
xy: 208, 48
size: 16, 16
HitLeftDown
xy: 224, 48
size: 16, 16
HitLeftDown
xy: 240, 48
size: 16, 16
HitLeft
xy: 256, 48
size: 16, 16
HitLeft
xy: 272, 48
size: 16, 16
HitLeft
xy: 288, 48
size: 16, 16
HitLeft
xy: 304, 48
size: 16, 16
HitLeftUp
xy: 320, 48
size: 16, 16
HitLeftUp
xy: 336, 48
size: 16, 16
HitLeftUp
xy: 352, 48
size: 16, 16
HitLeftUp
xy: 368, 48
size: 16, 16
HitUp
xy: 384, 48
size: 16, 16
HitUp
xy: 400, 48
size: 16, 16
HitUp
xy: 416, 48
size: 16, 16
HitUp
xy: 432, 48
size: 16, 16
HitRightUp
xy: 448, 48
size: 16, 16
HitRightUp
xy: 464, 48
size: 16, 16
HitRightUp
xy: 480, 48
size: 16, 16
HitRightUp
xy: 496, 48
size: 16, 16
DeathRight
xy: 0, 64
size: 16, 16
DeathRight
xy: 16, 64
size: 16, 16
DeathRight
xy: 32, 64
size: 16, 16
DeathRight
xy: 48, 64
size: 16, 16
DeathRightDown
xy: 64, 64
size: 16, 16
DeathRightDown
xy: 80, 64
size: 16, 16
DeathRightDown
xy: 96, 64
size: 16, 16
DeathRightDown
xy: 112, 64
size: 16, 16
DeathDown
xy: 128, 64
size: 16, 16
DeathDown
xy: 144, 64
size: 16, 16
DeathDown
xy: 160, 64
size: 16, 16
DeathDown
xy: 176, 64
size: 16, 16
DeathLeftDown
xy: 192, 64
size: 16, 16
DeathLeftDown
xy: 208, 64
size: 16, 16
DeathLeftDown
xy: 224, 64
size: 16, 16
DeathLeftDown
xy: 240, 64
size: 16, 16
DeathLeft
xy: 256, 64
size: 16, 16
DeathLeft
xy: 272, 64
size: 16, 16
DeathLeft
xy: 288, 64
size: 16, 16
DeathLeft
xy: 304, 64
size: 16, 16
DeathLeftUp
xy: 320, 64
size: 16, 16
DeathLeftUp
xy: 336, 64
size: 16, 16
DeathLeftUp
xy: 352, 64
size: 16, 16
DeathLeftUp
xy: 368, 64
size: 16, 16
DeathUp
xy: 384, 64
size: 16, 16
DeathUp
xy: 400, 64
size: 16, 16
DeathUp
xy: 416, 64
size: 16, 16
DeathUp
xy: 432, 64
size: 16, 16
DeathRightUp
xy: 448, 64
size: 16, 16
DeathRightUp
xy: 464, 64
size: 16, 16
DeathRightUp
xy: 480, 64
size: 16, 16
DeathRightUp
xy: 496, 64
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -47,6 +47,7 @@
"Dark Knight",
"Death Knight",
"Demon",
"Dross Gladiator",
"Eye",
"Fungus",
"Frog",

View File

@@ -43,6 +43,7 @@
"Frog",
"Frost Titan",
"Geist",
"Gitaxian Underling",
"Horror",
"Illusionist",
"Jellyfish",

View File

@@ -3366,7 +3366,7 @@
"name": "Copper Host Brutalizer",
"sprite": "sprites/copperhostbrutalizer.atlas",
"deck": [
"deckscopperhostbrutalizer.json"
"decks/copperhostbrutalizer.dck"
],
"ai": "",
"spawnRate": 1,
@@ -4680,7 +4680,7 @@
"name": "Dross Grimnarch",
"sprite": "sprites/drossgrimnarch.atlas",
"deck": [
"decks/drossgrimnarch.json"
"decks/drossgrimnarch.dck"
],
"spawnRate": 1,
"difficulty": 0.1,
@@ -6197,7 +6197,7 @@
"name": "Furnace Tormentor",
"sprite": "sprites/furnacetormentor.atlas",
"deck": [
"decks/furnacetormentor.json"
"decks/furnacetormentor.dck"
],
"ai": "",
"spawnRate": 1,
@@ -6814,7 +6814,7 @@
"name": "Gitaxian Scientist",
"sprite": "sprites/gitaxianscientist.atlas",
"deck": [
"decks/gitaxianscientist.json"
"decks/gitaxianscientist.dck"
],
"ai": "",
"spawnRate": 1,
@@ -11471,7 +11471,7 @@
"name": "Orthodoxy Angel",
"sprite": "sprites/phyrexianangel.atlas",
"deck": [
"decks/phyrexianangel.json"
"decks/phyrexianangel.dck"
],
"spawnRate": 1,
"difficulty": 0.1,
@@ -12441,16 +12441,6 @@
"scale": 0.4,
"life": 40,
"rewards": [
{
"type": "deckCard",
"probability": 1,
"count": 2,
"addMaxCount": 4,
"rarity": [
"common",
"uncommon"
]
},
{
"type": "deckCard",
"probability": 1,

View File

@@ -42,6 +42,7 @@
"Challenger 20",
"Challenger 21",
"Challenger 22",
"Copper Host Infector",
"Dino",
"Eldraine Faerie",
"Elf",

View File

@@ -70,7 +70,14 @@
"male":"sprites/heroes/werewolf_m.atlas",
"femaleAvatar":"Werewolf_f",
"maleAvatar":"Werewolf_m"
}
},
{
"name":"Leonin",
"female":"sprites/heroes/leonin_f.atlas",
"male":"sprites/heroes/leonin_m.atlas",
"femaleAvatar":"Leonin_f",
"maleAvatar":"Leonin_m"
}
]

View File

@@ -47,6 +47,7 @@
"Efreet",
"Fire Elemental",
"Flame Elemental",
"Furnace Goblin",
"Goblin",
"Goblin Chief",
"Goblin Warrior",

View File

@@ -54,6 +54,7 @@
"Knight",
"Kor Warrior",
"Monk",
"Orthodoxy Duelist",
"Owl",
"Raven",
"Scorpion",

View File

@@ -312,13 +312,13 @@ ONE Toxic 1: 1 wholeSheet("ONE Toxic 1"), 1 RareMythic:fromSheet("ONE Green Inse
ONE Toxic 2: 1 wholeSheet("ONE Toxic 2"), 1 RareMythic:fromSheet("ONE Green Inserts")
# MOM Jumpstart
MOM Mite-y 1: 1 wholeSheet("MOM Mite-y 1"), 1 RareMythic:fromSheet("MOM White Inserts")
MOM Mite-y 2: 1 wholeSheet("MOM Mite-y 2"), 1 RareMythic:fromSheet("MOM White Inserts")
MOM Progress 1: 1 wholeSheet("MOM Progress 1"), 1 RareMythic:fromSheet("MOM Blue Inserts")
MOM Progress 2: 1 wholeSheet("MOM Progress 2"), 1 RareMythic:fromSheet("MOM Blue Inserts")
MOM Corruption 1: 1 wholeSheet("MOM Corruption 1"), 1 RareMythic:fromSheet("MOM Black Inserts")
MOM Corruption 2: 1 wholeSheet("MOM Corruption 2"), 1 RareMythic:fromSheet("MOM Black Inserts")
MOM Rebellious 1: 1 wholeSheet("MOM Rebellious 1"), 1 RareMythic:fromSheet("MOM Red Inserts")
MOM Rebellious 2: 1 wholeSheet("MOM Rebellious 2"), 1 RareMythic:fromSheet("MOM Red Inserts")
MOM Toxic 1: 1 wholeSheet("MOM Toxic 1"), 1 RareMythic:fromSheet("MOM Green Inserts")
MOM Toxic 2: 1 wholeSheet("MOM Toxic 2"), 1 RareMythic:fromSheet("MOM Green Inserts")
MOM Brood 1: 1 wholeSheet("MOM Brood 1"), 1 RareMythic:fromSheet("MOM White Inserts")
MOM Brood 2: 1 wholeSheet("MOM Brood 2"), 1 RareMythic:fromSheet("MOM White Inserts")
MOM Overachiever 1: 1 wholeSheet("MOM Overachiever 1"), 1 RareMythic:fromSheet("MOM Blue Inserts")
MOM Overachiever 2: 1 wholeSheet("MOM Overachiever 2"), 1 RareMythic:fromSheet("MOM Blue Inserts")
MOM Expendable 1: 1 wholeSheet("MOM Expendable 1"), 1 RareMythic:fromSheet("MOM Black Inserts")
MOM Expendable 2: 1 wholeSheet("MOM Expendable 2"), 1 RareMythic:fromSheet("MOM Black Inserts")
MOM Reinforcement 1: 1 wholeSheet("MOM Reinforcement 1"), 1 RareMythic:fromSheet("MOM Red Inserts")
MOM Reinforcement 2: 1 wholeSheet("MOM Reinforcement 2"), 1 RareMythic:fromSheet("MOM Red Inserts")
MOM Buff 1: 1 wholeSheet("MOM Buff 1"), 1 RareMythic:fromSheet("MOM Green Inserts")
MOM Buff 2: 1 wholeSheet("MOM Buff 2"), 1 RareMythic:fromSheet("MOM Green Inserts")

View File

@@ -5995,191 +5995,64 @@ Kaya, Ghost Assassin|CN2|2
1 Elesh Norn, Mother of Machines|ONE
1 Mondrak, Glory Dominus|ONE
1 Phyrexian Vindicator|ONE
[ONE Mite-y 1]
1 Mite Overseer|ONE
1 Bladed Ambassador|ONE
1 Sinew Dancer|ONE
1 Duelist of Deep Faith|ONE
1 Basilica Shepherd|ONE
1 Annex Sentry|ONE
1 Porcelain Zealot|ONE
1 Planar Disruption|ONE
1 Charge of the Mites|ONE
1 Vanish into Eternity|ONE
1 Infested Fleshcutter|ONE
7 Plains|ONE
1 The Fair Basilica|ONE
[ONE Mite-y 2]
1 Mite Overseer|ONE
1 Bladed Ambassador|ONE
1 Crawling Chorus|ONE
1 Mandible Justiciar|ONE
1 Duelist of Deep Faith|ONE
1 Porcelain Zealot|ONE
1 Apostle of Invasion|ONE
1 Zealot's Conviction|ONE
1 Ossification|ONE
1 Compleat Devotion|ONE
1 Vanish into Eternity|ONE
7 Plains|ONE
1 The Fair Basilica|ONE
[ONE Progress 1]
1 Serum Sovereign|ONE
1 Glistener Seer|ONE
1 Ichor Synthesizer|ONE
1 Chrome Prowler|ONE
1 Meldweb Curator|ONE
1 Quicksilver Fisher|ONE
1 Mesmerizing Dose|ONE
1 Serum Snare|ONE
1 Tamiyo's Immobilizer|ONE
1 Distorted Curiosity|ONE
1 The Surgical Bay|ONE
7 Islands|ONE
[ONE Progress 2]
1 Serum Sovereign|ONE
1 Chrome Prowler|ONE
1 Atmosphere Surgeon|ONE
1 Trawler Drake|ONE
1 Myr Custodian|ONE
1 Experimental Augury|ONE
1 Bring the Ending|ONE
1 Mesmerizing Dose|ONE
1 Distorted Curiosity|ONE
1 Surgical Skullbomb|ONE
1 The Surgical Bay|ONE
7 Islands|ONE
[ONE Corruption 1]
1 Kinzu of the Bleak Coven|ONE
1 Bonepicker Skirge|ONE
1 Pestilent Syphoner|ONE
1 Testament Bearer|ONE
1 Ambulatory Edifice|ONE
1 Nimraiser Paladin|ONE
1 Annihilating Glare|ONE
1 Drown in Ichor|ONE
1 Feed the Infection|ONE
1 Anoint with Affliction|ONE
1 Dross Skullbomb|ONE
1 The Dross Pits|ONE
7 Swamps|ONE
[ONE Corruption 2]
1 Kinzu of the Bleak Coven|ONE
1 Bonepicker Skirge|ONE
1 Stinging Hivemaster|ONE
1 Testament Bearer|ONE
1 Bilious Skulldweller|ONE
1 Chittering Skitterling|ONE
1 Nimraiser Paladin|ONE
1 Offer Immortality|ONE
1 Vraska's Fall|ONE
1 Infectious Inquiry|ONE
1 Necrogen Communion|ONE
1 The Dross Pits|ONE
7 Swamps|ONE
[MOM Brood 1]
1 Essence of Orthodoxy|MOM
1 Norn's Inquisitor|MOM
1 Phyrexian Pegasus|MOM
1 Alabaster Host Sanctifier|MOM
1 Infected Defector|MOM
1 Alabaster Host Intercessor|MOM
1 Seedpod Caretaker|MOM
1 Tiller of Flesh|MOM
1 Sunder the Gateway|MOM
1 Angelic Intervention|MOM
1 Cut Short|MOM
8 Plains|MOM
1 Essence of Orthodoxy
1 Norn's Inquisitor
1 Phyrexian Pegasus
1 Alabaster Host Sanctifier
1 Infected Defector
1 Alabaster Host Intercessor
1 Seedpod Caretaker
1 Tiller of Flesh
1 Sunder the Gateway
1 Angelic Intervention
1 Cut Short
8 Plains
[MOM Brood 2]
1 Essence of Orthodoxy|MOM
1 Phyrexian Pegasus|MOM
1 Seedpod Caretaker|MOM
1 Norn's Inquisitor |MOM
1 Alabaster Host Sanctifier|MOM
1 Infected Defector|MOM
1 Alabaster Host Intercessor|MOM
1 Tiller of Flesh|MOM
1 Aerial Boost|MOM
1 Inspired Charge|MOM
1 Seal from Existence|MOM
8 Plains|MOM
[MOM Reinforcement 1]
1 Orthion, Hero of Lavabrink|MOM
1 Axgard Artisan|MOM
1 Cragsmasher Yeti|MOM
1 Fearless Skald|MOM
1 Karsus Depthguard|MOM
1 Hangar Scrounger|MOM
1 Redcap Heelslasher|MOM
1 Ral's Reinforcements|MOM
1 Coming In Hot|MOM
1 Volcanic Spite|MOM
8 Mountain|MOM
[MOM Reinforcement 2]
1 Orthion, Hero of Lavabrink|MOM
1 Axgard Artisan|MOM
1 Cragsmasher Yeti|MOM
1 Trailblazing Historian|MOM
1 Karsus Depthguard|MOM
1 Hangar Scrounger|MOM
1 Redcap Heelslasher|MOM
1 Fearless Skald|MOM
1 Mirran Banesplitter|MOM
1 Volcanic Spite|MOM
1 Shatter the Source|MOM
8 Mountain|MOM
1 Essence of Orthodoxy
1 Phyrexian Pegasus
1 Seedpod Caretaker
1 Norn's Inquisitor
1 Alabaster Host Sanctifier
1 Infected Defector
1 Alabaster Host Intercessor
1 Tiller of Flesh
1 Aerial Boost
1 Inspired Charge
1 Seal from Existence
8 Plains
[MOM Overachiever 1]
1 Zephyr Winder|MOM
1 Expedition Lookout|MOM
1 Preening Champion|MOM
1 Thunderhead Squadron|MOM
1 Tidal Terror|MOM
1 Referee Squad|MOM
1 Oracle of Tragedy|MOM
1 Interdisciplinary Mascot|MOM
1 Temporal Cleansing|MOM
1 Ephara's Dispersal|MOM
1 Meeting of Minds|MOM
8 Island|MOM
1 Zephyr Winder
1 Expedition Lookout
1 Preening Champion
1 Thunderhead Squadron
1 Tidal Terror
1 Referee Squad
1 Oracle of Tragedy
1 Interdisciplinary Mascot
1 Temporal Cleansing
1 Ephara's Dispersal
1 Meeting of Minds
8 Island
[MOM Overachiever 2]
1 Zephyr Winder|MOM
1 Expedition Lookout|MOM
1 Xerex Strobe-Knight|MOM
1 Thunderhead Squadron|MOM
1 Tidal Terror|MOM
1 Referee Squad|MOM
1 Oracle of Tragedy|MOM
1 Interdisciplinary Mascot|MOM
1 Ephara's Dispersal|MOM
1 Wicked Slumber|MOM
1 Astral Wingspan|MOM
8 Island|MOM
1 Zephyr Winder
1 Expedition Lookout
1 Xerex Strobe-Knight
1 Thunderhead Squadron
1 Tidal Terror
1 Referee Squad
1 Oracle of Tragedy
1 Interdisciplinary Mascot
1 Ephara's Dispersal
1 Wicked Slumber
1 Astral Wingspan
8 Island
[MOM Expendable 1]
1 Terror of Towashi|MOM
1 Seer of Stolen Sight|MOM
1 Injector Crocodile|MOM
@@ -6187,14 +6060,13 @@ Kaya, Ghost Assassin|CN2|2
1 Etched Familiar|MOM
1 Ichor Shade|MOM
1 Scorn-Blade Berserker|MOM
1 Final Flourish|MOM
1 Unseal the Necropolis|MOM
1 Deadly Derision|MOM
1 Final Flourish|MOM
1 Unseal the Necropolis|MOM
1 Deadly Derision|MOM
1 Gift of Compleation|MOM
8 Swamp|MOM
[MOM Expendable 2]
1 Terror of Towashi|MOM
1 Injector Crocodile|MOM
1 Seer of Stolen Sight|MOM
@@ -6208,8 +6080,34 @@ Kaya, Ghost Assassin|CN2|2
1 Gift of Compleation|MOM
8 Swamp|MOM
[MOM Buff 1]
[MOM Reinforcement 1]
1 Orthion, Hero of Lavabrink|MOM
1 Axgard Artisan|MOM
1 Cragsmasher Yeti|MOM
1 Fearless Skald|MOM
1 Karsus Depthguard|MOM
1 Hangar Scrounger|MOM
1 Redcap Heelslasher|MOM
1 Ral's Reinforcements|MOM
1 Coming In Hot|MOM
1 Volcanic Spite|MOM
8 Mountain|MOM
[MOM Reinforcement 2]
1 Orthion, Hero of Lavabrink|MOM
1 Axgard Artisan|MOM
1 Cragsmasher Yeti|MOM
1 Trailblazing Historian|MOM
1 Karsus Depthguard|MOM
1 Hangar Scrounger|MOM
1 Redcap Heelslasher|MOM
1 Fearless Skald|MOM
1 Mirran Banesplitter|MOM
1 Volcanic Spite|MOM
1 Shatter the Source|MOM
8 Mountain|MOM
[MOM Buff 1]
1 Surrak and Goreclaw|MOM
1 Fairgrounds Trumpeter|MOM
1 Ruins Recluse|MOM
@@ -6221,10 +6119,9 @@ Kaya, Ghost Assassin|CN2|2
1 Arachnoid Adaptation|MOM
1 Cosmic Hunger|MOM
1 Fertilid's Favor|MOM
8 Forests|MOM
8 Forest
[MOM Buff 2]
1 Surrak and Goreclaw|MOM
1 Fairgrounds Trumpeter|MOM
1 Placid Rottentail|MOM
@@ -6236,71 +6133,90 @@ Kaya, Ghost Assassin|CN2|2
1 Arachnoid Adaptation|MOM
1 Tandem Takedown|MOM
1 Blighted Burgeoning|MOM
8 Forests|MOM
8 Forest|MOM
[MOM Black Inserts]
1 Archpriest of Shadows|MOM
1 Ayara, Widow of the Realm|MOM
1 Bloated Processor|MOM
1 Breach the Multiverse|MOM
1 Grafted Butcher|MOM
1 Hoarding Broodlord|MOM
1 Invasion of Fiora|MOM
1 Pile On|MOM
1 Realmbreaker, the Invasion Tree|MOM
1 Terror of Towashi|MOM
1 Invasion of Innistrad|MOM
1 Invasion of Ravnica|MOM
1 Sheoldred|MOM
1 Sword of Once and Future|MOM
[MOM Blue Inserts]
1 Chrome Host Seedshark|MOM
1 Complete the Circuit|MOM
1 Rona, Herald of Invasion|MOM
1 Invasion of Segovia|MOM
1 Invasion of Arcavios|MOM
1 Faerie Mastermind|MOM
1 Zephyr Singer|MOM
1 Transcendent Message|MOM
1 Interdisciplinary Mascot|MOM
1 Invasion of Arcavios|MOM
1 Invasion of Segovia|MOM
1 Realmbreaker, the Invasion Tree|MOM
1 Rona, Herald of Invasion|MOM
1 See Double|MOM
1 Transcendent Message|MOM
1 Zephyr Singer|MOM
1 Invasion of Ravnica|MOM
1 Jin-Gitaxias|MOM
[MOM Red Inserts]
1 Chandra, Hope's Beacon|MOM
1 Invasion of Tarkir|MOM
1 Urabrask|MOM
1 Bloodfeather Phoenix|MOM
1 Into the Fire|MOM
1 City on Fire|MOM
1 Etali, Primal Conqueror|MOM
1 Invasion of Kaldheim|MOM
1 Nahiri's Warcrafting|MOM
1 Voldaren Thrillseeker|MOM
1 Rampaging Raptor|MOM
1 Sword of Once and Future|MOM
[MOM Green Inserts]
1 Ancient Imperiosaur|MOM
1 Deeproot Wayfinder|MOM
1 Doomskar Warrior|MOM
1 Glistening Dawn|MOM
1 Invasion of Ikoria|MOM
1 Invasion of Ixalan|MOM
1 Ozolith, the Shattered Spire|MOM
1 Tribute to the World Tree|MOM
1 Polukranos Reborn|MOM
1 Realmbreaker, the Invasion Tree|MOM
1 Surrak and Goreclaw|MOM
1 Tribute to the World Tree|MOM
1 Invasion of Ravnica|MOM
1 Invasion of Shandalar|MOM
1 Sword of Once and Future|MOM
1 Vorinclex|MOM
1 Wrenn and Realmbreaker|MOM
1 Doomskar Warrior|MOM
1 Deeproot Wayfinder|MOM
1 Ancient Imperiosaur|MOM
[MOM Black Inserts]
1 Archpriest of Shadows|MOM
1 Ayara, Widow of the Realm|MOM
1 Bloated Processor|MOM
1 Hoarding Broodlord|MOM
1 Invasion of Fiora|MOM
1 Grafted Butcher|MOM
1 Breach the Multiverse|MOM
1 Pile On|MOM
1 Sheoldred|MOM
1 Invasion of Innistrad|MOM
[MOM Red Inserts]
1 Bloodfeather Phoenix|MOM
1 City on Fire|MOM
1 Etali, Primal Conquerer|MOM
1 Into the Fire|MOM
1 Invasion of Kaladheim|MOM
1 Invasion of Karsus|MOM
1 Nahiri's Warcrafting|MOM
1 Orthion, Hero of Lavabrink|MOM
1 Rampaging Raptor|MOM
1 Realmbreaker, the Invasion Tree|MOM
1 Voldaren Thrillseeker|MOM
1 Chandra, Hope's Beacon|MOM
1 Invasion of Ravnica|MOM
1 Invasion of Tarkir|MOM
1 Sword of Once and Future|MOM
1 Urabrask|MOM
[MOM White Inserts]
1 Archangel Elspeth|MOM
1 Elesh Norn|MOM
1 Monastery Mentor|MOM
1 Boon-Bringer Valkyrie|MOM
1 Dusk Legion Duelist|MOM
1 Essence of Orthodoxy|MOM
1 Guardian of Ghirapur|MOM
1 Heliod, the Radiant Dawn|MOM
1 Invasion of Gobakhan|MOM
1 Knight-Errant of Eos|MOM
1 Invasion of Theros|MOM
1 Knight-Errant of Eos|MOM
1 Realmbreaker, the Invasion Tree|MOM
1 Progenitor Exarch|MOM
1 Sunfall|MOM
1 Progenitor Exarch|MOM
1 Archangel Elspeth|MOM
1 Elesh Norn|MOM
1 Invasion of Ravnica|MOM
1 Monastery Mentor|MOM
1 Sword of Once and Future|MOM

View File

@@ -1,9 +1,10 @@
Name:Academy at Tolaria West
ManaCost:no cost
Types:Plane Dominaria
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | IsPresent$ Card.YouCtrl | PresentZone$ Hand | PresentCompare$ EQ0 | Execute$ AcademicDraw | TriggerDescription$ At the beginning of your end step, if you have no cards in hand, draw seven cards.
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | IsPresent$ Card.YouOwn | PresentZone$ Hand | PresentCompare$ EQ0 | Execute$ AcademicDraw | TriggerDescription$ At the beginning of your end step, if you have no cards in hand, draw seven cards.
SVar:AcademicDraw:DB$ Draw | Defined$ You | NumCards$ 7
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, discard your hand.
SVar:RolledChaos:DB$ Discard | Mode$ Hand | Defined$ You
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ TrigDiscard | TriggerDescription$ Whenever chaos ensues, discard your hand.
SVar:TrigDiscard:DB$ Discard | Mode$ Hand | Defined$ You
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | CardsInHandLE$ 2
Oracle:At the beginning of your end step, if you have no cards in hand, draw seven cards.\nWhenever you roll {CHAOS}, discard your hand.
Deckhas:Ability$Discard
Oracle:At the beginning of your end step, if you have no cards in hand, draw seven cards.\nWhenever chaos ensues, discard your hand.

View File

@@ -10,9 +10,9 @@ T:Mode$ ChangesZone | ValidCard$ Creature.nonWhite | Origin$ Battlefield | Desti
SVar:TrigDelay2:DB$ Effect | Name$ Agyrem Effect For non-White Creatures | Triggers$ TrigEOT2 | RememberObjects$ TriggeredCard | Duration$ Permanent
SVar:TrigEOT2:Mode$ Phase | Phase$ End of Turn | Execute$ AgyremReturn2 | TriggerDescription$ Return creature to its owner's hand at the beginning of the next end step.
SVar:AgyremReturn2:DB$ ChangeZone | Defined$ Remembered | Origin$ Graveyard | Destination$ Hand | SubAbility$ AgyremCleanup
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, creatures can't attack you until a player planeswalks.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, creatures can't attack you until a player planeswalks.
SVar:RolledChaos:DB$ Effect | Name$ Agyrem Effect - Can't Attack | StaticAbilities$ STCantAttack | Triggers$ TrigPlaneswalk | Duration$ Permanent
SVar:STCantAttack:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature | Target$ You | Description$ Creatures can't attack you until a player planeswalks.
SVar:TrigPlaneswalk:Mode$ PlaneswalkedFrom | Execute$ AgyremCleanup | Static$ True
SVar:AIRollPlanarDieParams:Mode$ Always
Oracle:Whenever a white creature dies, return it to the battlefield under its owner's control at the beginning of the next end step.\nWhenever a nonwhite creature dies, return it to its owner's hand at the beginning of the next end step.\nWhenever you roll {CHAOS}, creatures can't attack you until a player planeswalks.
Oracle:Whenever a white creature dies, return it to the battlefield under its owner's control at the beginning of the next end step.\nWhenever a nonwhite creature dies, return it to its owner's hand at the beginning of the next end step.\nWhenever chaos ensues, creatures can't attack you until a player planeswalks.

View File

@@ -2,7 +2,7 @@ Name:Akoum
ManaCost:no cost
Types:Plane Zendikar
S:Mode$ CastWithFlash | ValidCard$ Enchantment | ValidSA$ Spell | EffectZone$ Command | Caster$ Player | Description$ Players may cast enchantment spells as though they had flash.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, destroy target creature that isn't enchanted.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, destroy target creature that isn't enchanted.
SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature.unenchanted | TgtPrompt$ Select target creature that isn't enchanted
SVar:AIRollPlanarDieParams:Mode$ Always | OppHasCreatureInPlay$ True | RollInMain1$ True
Oracle:Players may cast enchantment spells as though they had flash.\nWhenever you roll {CHAOS}, destroy target creature that isn't enchanted.
Oracle:Players may cast enchantment spells as though they had flash.\nWhenever chaos ensues, destroy target creature that isn't enchanted.

View File

@@ -8,8 +8,8 @@ SVar:ScrollsOfLife:DB$ GainLife | Defined$ You | LifeAmount$ NumScrolls
SVar:NumScrolls:Count$CardCounters.SCROLL
T:Mode$ Always | TriggerZones$ Command | CheckSVar$ NumScrolls | SVarCompare$ GE10 | Execute$ RolledWalk | TriggerDescription$ When CARDNAME has ten or more scroll counters on it, planeswalk.
SVar:RolledWalk:DB$ Planeswalk
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, put a scroll counter on CARDNAME, then draw cards equal to the number of scroll counters on it.
SVar:RolledChaos:DB$ PutCounter | Defined$ Self | CounterType$ SCROLL | CounterNum$ 1 | SubAbility$ ScrollsOfKnowledge
SVar:ScrollsOfKnowledge:DB$ Draw | Defined$ You | NumCards$ NumScrolls
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ TrigPutCounter | TriggerDescription$ Whenever chaos ensues, put a scroll counter on CARDNAME, then draw cards equal to the number of scroll counters on it.
SVar:TrigPutCounter:DB$ PutCounter | CounterType$ SCROLL | SubAbility$ ScrollsOfKnowledge
SVar:ScrollsOfKnowledge:DB$ Draw | NumCards$ NumScrolls
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9
Oracle:When you planeswalk to Aretopolis or at the beginning of your upkeep, put a scroll counter on Aretopolis, then you gain life equal to the number of scroll counters on it.\nWhen Aretopolis has ten or more scroll counters on it, planeswalk.\nWhenever you roll {CHAOS}, put a scroll counter on Aretopolis, then draw cards equal to the number of scroll counters on it.
Oracle:When you planeswalk to Aretopolis or at the beginning of your upkeep, put a scroll counter on Aretopolis, then you gain life equal to the number of scroll counters on it.\nWhen Aretopolis has ten or more scroll counters on it, planeswalk.\nWhenever chaos ensues, put a scroll counter on Aretopolis, then draw cards equal to the number of scroll counters on it.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Plane Kolbahan
S:Mode$ AttackRestrict | EffectZone$ Command | MaxAttackers$ 1 | Description$ No more than one creature can attack each combat.
S:Mode$ Continuous | EffectZone$ Command | GlobalRule$ No more than one creature can block each combat. | Description$ No more than one creature can block each combat.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, CARDNAME deals 2 damage to each creature.
SVar:RolledChaos:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature | ValidDescription$ each creature.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, CARDNAME deals 2 damage to each creature.
SVar:RolledChaos:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature
SVar:AIRollPlanarDieParams:Mode$ Random | MinTurn$ 5
Oracle:No more than one creature can attack each combat.\nNo more than one creature can block each combat.\nWhenever you roll {CHAOS}, Astral Arena deals 2 damage to each creature.
Oracle:No more than one creature can attack each combat.\nNo more than one creature can block each combat.\nWhenever chaos ensues, Astral Arena deals 2 damage to each creature.

View File

@@ -2,9 +2,9 @@ Name:Bant
ManaCost:no cost
Types:Plane Alara
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddKeyword$ Exalted | Description$ All creatures have exalted.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, put a divinity counter on target green, white, or blue creature. That creature has indestructible for as long as it has a divinity counter on it.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, put a divinity counter on target green, white, or blue creature. That creature has indestructible for as long as it has a divinity counter on it.
SVar:RolledChaos:DB$ PutCounter | ValidTgts$ Creature.Green,Creature.White,Creature.Blue | CounterType$ DIVINITY | CounterNum$ 1 | SubAbility$ DivineCharacter
SVar:DivineCharacter:DB$ Animate | Defined$ Targeted | staticAbilities$ IndestructibleAspect | Duration$ Permanent
SVar:IndestructibleAspect:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible
SVar:AIRollPlanarDieParams:Mode$ Always | HasColorCreatureInPlay$ GWU
Oracle:All creatures have exalted. (Whenever a creature attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents its controller controls.)\nWhenever you roll {CHAOS}, put a divinity counter on target green, white, or blue creature. That creature has indestructible for as long as it has a divinity counter on it.
Oracle:All creatures have exalted. (Whenever a creature attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents its controller controls.)\nWhenever chaos ensues, put a divinity counter on target green, white, or blue creature. That creature has indestructible for as long as it has a divinity counter on it.

View File

@@ -3,8 +3,8 @@ ManaCost:no cost
Types:Plane Equilor
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Command | ValidCard$ Creature | Execute$ TrigPump | TriggerDescription$ Whenever a creature enters the battlefield, it gains double strike and haste until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | KW$ Double Strike & Haste
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, exile target nontoken creature you control, then return it to the battlefield under your control.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, exile target nontoken creature you control, then return it to the battlefield under your control.
SVar:RolledChaos:DB$ ChangeZone | ValidTgts$ Creature.nonToken+YouCtrl | TgtPrompt$ Select target non-Token creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ RestorationReturn
SVar:RestorationReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True
SVar:AIRollPlanarDieParams:Mode$ Always | MinTurn$ 3 | RollInMain1$ True
Oracle:Whenever a creature enters the battlefield, it gains double strike and haste until end of turn.\nWhenever you roll {CHAOS}, exile target nontoken creature you control, then return it to the battlefield under your control.
Oracle:Whenever a creature enters the battlefield, it gains double strike and haste until end of turn.\nWhenever chaos ensues, exile target nontoken creature you control, then return it to the battlefield under your control.

View File

@@ -11,8 +11,7 @@ ALTERNATE
Name:Entering
ManaCost:4 B R
Types:Sorcery
A:SP$ ChooseCard | Cost$ 4 B R | Choices$ Creature | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card from a graveyard onto the battlefield under your control. It gains haste until end of turn.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ChosenCard | GainControl$ True | RememberChanged$ True | SubAbility$ DBPump
SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | SubAbility$ DBCleanup
A:SP$ ChangeZone | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Hidden$ True | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Put a creature card from a graveyard onto the battlefield under your control. It gains haste until end of turn.
SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Put a creature card from a graveyard onto the battlefield under your control. It gains haste until end of turn.\nFuse (You may cast one or both halves of this card from your hand.)

View File

@@ -2,11 +2,11 @@ Name:Celestine Reef
ManaCost:no cost
Types:Plane Luvion
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.withoutFlying+withoutIslandwalk | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures without flying or islandwalk can't attack.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, until a player planeswalks, you can't lose the game and your opponents can't win the game.
SVar:RolledChaos:DB$ Effect | Name$ Celestine Reef Effect | StaticAbilities$ STCantlose,STCantWin | Triggers$ TrigPlaneswalk | Duration$ Permanent
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, until a player planeswalks, you can't lose the game and your opponents can't win the game.
SVar:RolledChaos:DB$ Effect | StaticAbilities$ STCantlose,STCantWin | Triggers$ TrigPlaneswalk | Duration$ Permanent
SVar:STCantlose:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You can't lose the game. | Description$ Until a player planeswalks, you can't lose the game and your opponents can't win the game.
SVar:STCantWin:Mode$ Continuous | EffectZone$ Command | Affected$ Player.Opponent | AddKeyword$ You can't win the game.
SVar:STCantWin:Mode$ Continuous | EffectZone$ Command | Affected$ Opponent | AddKeyword$ You can't win the game.
SVar:TrigPlaneswalk:Mode$ PlaneswalkedFrom | Execute$ DBCleanup | Static$ True
SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:AIRollPlanarDieParams:Mode$ Always
Oracle:Creatures without flying or islandwalk can't attack.\nWhenever you roll {CHAOS}, until a player planeswalks, you can't lose the game and your opponents can't win the game.
Oracle:Creatures without flying or islandwalk can't attack.\nWhenever chaos ensues, until a player planeswalks, you can't lose the game and your opponents can't win the game.

View File

@@ -4,8 +4,8 @@ Types:Plane Mercadia
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigLife | OptionalDecider$ You | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may exchange life totals with target player.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLife | TriggerZones$ Command | Secondary$ True | OptionalDecider$ You | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may exchange life totals with target player.
SVar:TrigLife:DB$ ExchangeLife | Optional$ True | ValidTgts$ Player | TgtPrompt$ Select target player to exchange life totals with
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, exchange control of two target permanents that share a card type.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, exchange control of two target permanents that share a card type.
SVar:RolledChaos:DB$ ExchangeControl | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Permanent | TgtPrompt$ Select target permanents that share a permanent type | TargetsWithSameCardType$ True
AI:RemoveDeck:All
AI:RemoveDeck:Random
Oracle:When you planeswalk to Cliffside Market or at the beginning of your upkeep, you may exchange life totals with target player.\nWhenever you roll {CHAOS}, exchange control of two target permanents that share a card type.
Oracle:When you planeswalk to Cliffside Market or at the beginning of your upkeep, you may exchange life totals with target player.\nWhenever chaos ensues, exchange control of two target permanents that share a card type.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Plane Belenon
R:Event$ Untap | ActiveZones$ Command | ValidCard$ Creature.YouCtrl | ReplaceWith$ RepPutCounter | UntapStep$ True | Description$ If a creature you control would untap during your untap step, put two +1/+1 counters on it instead.
SVar:RepPutCounter:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 2
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, untap each creature you control.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, untap each creature you control.
SVar:RolledChaos:DB$ UntapAll | ValidCards$ Creature.YouCtrl
SVar:AIRollPlanarDieParams:Mode$ Always | HasCreatureInPlay$ True
Oracle:If a creature you control would untap during your untap step, put two +1/+1 counters on it instead.\nWhenever you roll {CHAOS}, untap each creature you control.
Oracle:If a creature you control would untap during your untap step, put two +1/+1 counters on it instead.\nWhenever chaos ensues, untap each creature you control.

View File

@@ -3,10 +3,10 @@ ManaCost:no cost
Types:Plane Shandalar
T:Mode$ TapsForMana | ValidCard$ Permanent | Execute$ TrigMana | TriggerZones$ Command | Static$ True | TriggerDescription$ Whenever a player taps a permanent for mana, that player adds one mana of any type that permanent produced.
SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | ReflectProperty$ Produced | Defined$ TriggeredActivator
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, target player can't cast spells until a player planeswalks.
SVar:RolledChaos:DB$ Effect | ValidTgts$ Player | IsCurse$ True | Name$ Eloren Wilds Effect | StaticAbilities$ STCantCast | Triggers$ TrigPlaneswalk | RememberObjects$ Targeted | Duration$ Permanent
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, target player can't cast spells until a player planeswalks.
SVar:RolledChaos:DB$ Effect | ValidTgts$ Player | IsCurse$ True | StaticAbilities$ STCantCast | Triggers$ TrigPlaneswalk | RememberObjects$ Targeted | Duration$ Permanent
SVar:STCantCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Target player can't cast spells until a player planeswalks.
SVar:TrigPlaneswalk:Mode$ PlaneswalkedFrom | Execute$ ExileSelf | Static$ True
SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:AIRollPlanarDieParams:Mode$ Always
Oracle:Whenever a player taps a permanent for mana, that player adds one mana of any type that permanent produced.\nWhenever you roll {CHAOS}, target player can't cast spells until a player planeswalks.
Oracle:Whenever a player taps a permanent for mana, that player adds one mana of any type that permanent produced.\nWhenever chaos ensues, target player can't cast spells until a player planeswalks.

View File

@@ -1,9 +1,8 @@
Name:Extract from Darkness
ManaCost:3 U B
Types:Sorcery
A:SP$ Mill | Cost$ 3 U B | NumCards$ 2 | Defined$ Player | SubAbility$ DBChoose | SpellDescription$ Each player mills two cards. Then you put a creature card from a graveyard onto the battlefield under your control.
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature | ChoiceZone$ Graveyard | Mandatory$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ChosenCard | GainControl$ True
A:SP$ Mill | NumCards$ 2 | Defined$ Player | SubAbility$ DBChoose | SpellDescription$ Each player mills two cards.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | Mandatory$ True | GainControl$ True | SelectPrompt$ Select a creature card to return to the battlefield | Hidden$ True | StackDescription$ SpellDescription | SpellDescription$ Then you put a creature card from a graveyard onto the battlefield under your control.
AI:RemoveDeck:Random
DeckHas:Ability$Graveyard
DeckHas:Ability$Mill|Graveyard
Oracle:Each player mills two cards. Then you put a creature card from a graveyard onto the battlefield under your control.

View File

@@ -3,8 +3,8 @@ ManaCost:no cost
Types:Plane Muraganda
S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.Green | Type$ Spell | Amount$ 1 | Description$ Green spells cost {1} less to cast.
S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.Red | Type$ Spell | Amount$ 1 | Description$ Red spells cost {1} less to cast.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ DBPutCounter | TriggerDescription$ Whenever you roll {CHAOS}, put X +1/+1 counters on target creature, where X is that creature's mana value.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ DBPutCounter | TriggerDescription$ Whenever chaos ensues, put X +1/+1 counters on target creature, where X is that creature's mana value.
SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ Y
SVar:Y:Targeted$CardManaCost
SVar:AIRollPlanarDieParams:Mode$ Always | HasCreatureInPlay$ True
Oracle:Red spells cost {1} less to cast.\nGreen spells cost {1} less to cast.\nWhenever you roll {CHAOS}, put X +1/+1 counters on target creature, where X is that creature's mana value.
Oracle:Red spells cost {1} less to cast.\nGreen spells cost {1} less to cast.\nWhenever chaos ensues, put X +1/+1 counters on target creature, where X is that creature's mana value.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Plane Moag
T:Mode$ SpellCast | OptionalDecider$ TriggeredPlayer | TriggerZones$ Command | Execute$ LifeSummer | TriggerDescription$ Whenever a player casts a spell, that player may gain 2 life.
SVar:LifeSummer:DB$ GainLife | Defined$ TriggeredPlayer | LifeAmount$ 2
T:Mode$ PlanarDice | Result$ Chaos | OptionalDecider$ You | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, you may gain 10 life.
T:Mode$ ChaosEnsues | TriggerZones$ Command | OptionalDecider$ You | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, you may gain 10 life.
SVar:RolledChaos:DB$ GainLife | LifeAmount$ 10 | Defined$ You
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9
Oracle:Whenever a player casts a spell, that player may gain 2 life.\nWhenever you roll {CHAOS}, you may gain 10 life.
Oracle:Whenever a player casts a spell, that player may gain 2 life.\nWhenever chaos ensues, you may gain 10 life.

View File

@@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ FurnaceDiscard | Tri
SVar:FurnaceDiscard:DB$ Discard | ValidTgts$ Player | TargetsAtRandom$ True | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | Defined$ Targeted | LifeAmount$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | OptionalDecider$ You | TriggerDescription$ Whenever you roll {CHAOS}, you may destroy target nonland permanent.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | OptionalDecider$ You | TriggerDescription$ Whenever chaos ensues, you may destroy target nonland permanent.
SVar:RolledChaos:DB$ Destroy | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent to destroy
SVar:AIRollPlanarDieParams:Mode$ Always | MinTurn$ 3 | LowPriority$ True | MaxRollsPerTurn$ 9
Oracle:When you planeswalk to Furnace Layer or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life.\nWhenever you roll {CHAOS}, you may destroy target nonland permanent.
Oracle:When you planeswalk to Furnace Layer or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life.\nWhenever chaos ensues, you may destroy target nonland permanent.

View File

@@ -2,7 +2,7 @@ Name:Gavony
ManaCost:no cost
Types:Plane Innistrad
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddKeyword$ Vigilance | Description$ All creatures have vigilance.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, creatures you control gain indestructible until end of turn.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, creatures you control gain indestructible until end of turn.
SVar:RolledChaos:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible
SVar:AIRollPlanarDieParams:Mode$ Always
Oracle:All creatures have vigilance.\nWhenever you roll {CHAOS}, creatures you control gain indestructible until end of turn.
Oracle:All creatures have vigilance.\nWhenever chaos ensues, creatures you control gain indestructible until end of turn.

View File

@@ -4,7 +4,7 @@ Types:Plane Lorwyn
T:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ You | TriggerZones$ Command | OptionalDecider$ You | Execute$ TrigExchange | TriggerDescription$ At end of combat, you may exchange control of target creature you control that dealt combat damage to a player this combat and target creature that player controls.
SVar:TrigExchange:DB$ Pump | ValidTgts$ Creature.YouCtrl+dealtCombatDamageThisCombat | TgtPrompt$ Select target creature you control that dealt combat damage to a player | SubAbility$ DBExchange
SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.ControlledBy Player.wasDealtCombatDamageThisCombatBy ParentTarget | TgtPrompt$ Select target creature that player controls.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, gain control of target creature you own.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, gain control of target creature you own.
SVar:RolledChaos:DB$ GainControl | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature you own to gain control of
AI:RemoveDeck:All
Oracle:At end of combat, you may exchange control of target creature you control that dealt combat damage to a player this combat and target creature that player controls.\nWhenever you roll {CHAOS}, gain control of target creature you own.
Oracle:At end of combat, you may exchange control of target creature you control that dealt combat damage to a player this combat and target creature that player controls.\nWhenever chaos ensues, gain control of target creature you own.

View File

@@ -3,8 +3,8 @@ ManaCost:no cost
Types:Plane Mirrodin
T:Mode$ SpellCast | ValidSA$ Instant.singleTarget,Sorcery.singleTarget | Execute$ TrigCopy | TriggerZones$ Command | TriggerDescription$ Whenever a player casts an instant or sorcery spell with a single target, that player copies that spell for each other spell, permanent, card not on the battlefield, and/or player the spell could target. Each copy targets a different one of them.
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredActivator | CopyForEachCanTarget$ Spell,Permanent,Card,Player
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, choose target creature. Each player except that creature's controller creates a token that's a copy of that creature.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, choose target creature. Each player except that creature's controller creates a token that's a copy of that creature.
SVar:RolledChaos:DB$ RepeatEach | RepeatPlayers$ NonTargetedController | RepeatSubAbility$ DBCopy | ValidTgts$ Creature | TgtPrompt$ Select target creature | ChangeZoneTable$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ParentTarget | Controller$ Remembered
AI:RemoveDeck:All
Oracle:Whenever a player casts an instant or sorcery spell with a single target, that player copies that spell for each other spell, permanent, card not on the battlefield, and/or player the spell could target. Each copy targets a different one of them.\nWhenever you roll {CHAOS}, choose target creature. Each player except that creature's controller creates a token that's a copy of that creature.
Oracle:Whenever a player casts an instant or sorcery spell with a single target, that player copies that spell for each other spell, permanent, card not on the battlefield, and/or player the spell could target. Each copy targets a different one of them.\nWhenever chaos ensues, choose target creature. Each player except that creature's controller creates a token that's a copy of that creature.

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Plane Lorwyn
T:Mode$ ChangesZone | ValidCard$ Land | Destination$ Battlefield | Execute$ TripleGoat | TriggerZones$ Command | TriggerDescription$ Whenever a land enters the battlefield, that land's controller creates three 0/1 white Goat creature tokens.
SVar:TripleGoat:DB$ Token | TokenScript$ w_0_1_goat | TokenOwner$ TriggeredCardController | TokenAmount$ 3
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, create a 0/1 white Goat creature token.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, create a 0/1 white Goat creature token.
SVar:RolledChaos:DB$ Token | TokenScript$ w_0_1_goat | TokenOwner$ You | TokenAmount$ 1
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9
Oracle:Whenever a land enters the battlefield, that land's controller creates three 0/1 white Goat creature tokens.\nWhenever you roll {CHAOS}, create a 0/1 white Goat creature token.
Oracle:Whenever a land enters the battlefield, that land's controller creates three 0/1 white Goat creature tokens.\nWhenever chaos ensues, create a 0/1 white Goat creature token.

View File

@@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$
SVar:OssuaryCounters:DB$ PutCounter | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredCardController | TargetingPlayer$ TriggeredCardController | TgtPrompt$ Select target creature you control to distribute counters to | CounterType$ P1P1 | CounterNum$ OssuaryX | TargetMin$ 1 | TargetMax$ MaxTgts | DividedAsYouChoose$ OssuaryX
SVar:OssuaryX:TriggeredCard$CardPower
SVar:MaxTgts:TriggeredCardController$Valid Creature.YouCtrl
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, each player exiles all creatures they control and creates X 1/1 green Saproling creature tokens, where X is the total power of the creatures they exiled this way. Then planeswalk.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, each player exiles all creatures they control and creates X 1/1 green Saproling creature tokens, where X is the total power of the creatures they exiled this way. Then planeswalk.
SVar:RolledChaos:DB$ ChangeZoneAll | ChangeType$ Creature | Imprint$ True | Origin$ Battlefield | Destination$ Exile | SubAbility$ OssuaryRepeat
SVar:OssuaryRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ OssuaryTokens | SubAbility$ WalkAway | ChangeZoneTable$ True
SVar:OssuaryTokens:DB$ Token | TokenAmount$ OsX | TokenScript$ g_1_1_saproling | TokenOwner$ Player.IsRemembered
@@ -13,4 +13,4 @@ SVar:WalkAway:DB$ Planeswalk | SubAbility$ ClearImprinted
SVar:ClearImprinted:DB$ Cleanup | ClearImprinted$ True
SVar:OsX:ImprintedLKI$FilterControlledByRemembered_CardPower
SVar:AIRollPlanarDieParams:Mode$ Random | MinTurn$ 5
Oracle:Whenever a creature dies, its controller distributes a number of +1/+1 counters equal to its power among any number of target creatures they control.\nWhenever you roll {CHAOS}, each player exiles all creatures they control and creates X 1/1 green Saproling creature tokens, where X is the total power of the creatures they exiled this way. Then planeswalk.
Oracle:Whenever a creature dies, its controller distributes a number of +1/+1 counters equal to its power among any number of target creatures they control.\nWhenever chaos ensues, each player exiles all creatures they control and creates X 1/1 green Saproling creature tokens, where X is the total power of the creatures they exiled this way. Then planeswalk.

View File

@@ -2,7 +2,7 @@ Name:Grixis
ManaCost:no cost
Types:Plane Alara
S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Graveyard | Affected$ Creature.YouOwn+Blue,Creature.YouOwn+Red,Creature.YouOwn+Black | AddKeyword$ Unearth:CardManaCost | Description$ Blue, black, and/or red creature cards in your graveyard have unearth. The unearth cost is equal to the card's mana cost. (Pay the card's mana cost: Return it to the battlefield. The creature gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.)
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, put target creature card from a graveyard onto the battlefield under your control.
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, put target creature card from a graveyard onto the battlefield under your control.
SVar:RolledChaos:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature
SVar:AIRollPlanarDieParams:Mode$ Always | MinTurn$ 3 | LowPriority$ True | MaxRollsPerTurn$ 9
Oracle:Blue, black, and/or red creature cards in your graveyard have unearth. The unearth cost is equal to the card's mana cost. (Pay the card's mana cost: Return it to the battlefield. The creature gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.)\nWhenever you roll {CHAOS}, put target creature card from a graveyard onto the battlefield under your control.
Oracle:Blue, black, and/or red creature cards in your graveyard have unearth. The unearth cost is equal to the card's mana cost. (Pay the card's mana cost: Return it to the battlefield. The creature gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.)\nWhenever chaos ensues, put target creature card from a graveyard onto the battlefield under your control.

Some files were not shown because too many files have changed in this diff Show More