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> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>1.6.56-SNAPSHOT</version> <version>1.6.57-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

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

View File

@@ -432,7 +432,7 @@ public class ComputerUtilCard {
* @param list * @param list
* @return a {@link forge.game.card.Card} object. * @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) { if (Iterables.size(list) == 1) {
return Iterables.get(list, 0); return Iterables.get(list, 0);
} }

View File

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

View File

@@ -32,6 +32,7 @@ public enum SpellApiToAi {
.put(ApiType.BecomeMonarch, AlwaysPlayAi.class) .put(ApiType.BecomeMonarch, AlwaysPlayAi.class)
.put(ApiType.BecomesBlocked, BecomesBlockedAi.class) .put(ApiType.BecomesBlocked, BecomesBlockedAi.class)
.put(ApiType.BidLife, BidLifeAi.class) .put(ApiType.BidLife, BidLifeAi.class)
.put(ApiType.BlankLine, AlwaysPlayAi.class)
.put(ApiType.Bond, BondAi.class) .put(ApiType.Bond, BondAi.class)
.put(ApiType.Branch, AlwaysPlayAi.class) .put(ApiType.Branch, AlwaysPlayAi.class)
.put(ApiType.Camouflage, ChooseCardAi.class) .put(ApiType.Camouflage, ChooseCardAi.class)
@@ -40,6 +41,7 @@ public enum SpellApiToAi {
.put(ApiType.ChangeX, AlwaysPlayAi.class) .put(ApiType.ChangeX, AlwaysPlayAi.class)
.put(ApiType.ChangeZone, ChangeZoneAi.class) .put(ApiType.ChangeZone, ChangeZoneAi.class)
.put(ApiType.ChangeZoneAll, ChangeZoneAllAi.class) .put(ApiType.ChangeZoneAll, ChangeZoneAllAi.class)
.put(ApiType.ChaosEnsues, AlwaysPlayAi.class)
.put(ApiType.Charm, CharmAi.class) .put(ApiType.Charm, CharmAi.class)
.put(ApiType.ChooseCard, ChooseCardAi.class) .put(ApiType.ChooseCard, ChooseCardAi.class)
.put(ApiType.ChooseColor, ChooseColorAi.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 (choice == null) { // can't find anything left
if (sa.getTargets().size() == 0 || !sa.isTargetNumberValid()) { if (sa.getTargets().isEmpty() || !sa.isTargetNumberValid()) {
if (!mandatory) { if (!mandatory) {
sa.resetTargets(); sa.resetTargets();
} }
@@ -1432,7 +1432,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination")); final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination"));
final TargetRestrictions tgt = sa.getTargetRestrictions(); final TargetRestrictions tgt = sa.getTargetRestrictions();
CardCollection list = new CardCollection(CardUtil.getValidCardsToTarget(tgt, sa)); List<Card> list = CardUtil.getValidCardsToTarget(tgt, sa);
if (list.isEmpty()) { if (list.isEmpty()) {
return false; return false;

View File

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

View File

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

View File

@@ -64,8 +64,7 @@ public class CounterAi extends SpellAbilityAi {
if (sa.usesTargeting()) { if (sa.usesTargeting()) {
final SpellAbility topSA = ComputerUtilAbility.getTopSpellAbilityOnStack(game, sa); final SpellAbility topSA = ComputerUtilAbility.getTopSpellAbilityOnStack(game, sa);
if ((topSA.isSpell() && !CardFactoryUtil.isCounterableBy(topSA.getHostCard(), sa)) || topSA.getActivatingPlayer() == ai if ((topSA.isSpell() && !CardFactoryUtil.isCounterableBy(topSA.getHostCard(), sa)) || ai.getYourTeam().contains(topSA.getActivatingPlayer())) {
|| ai.getAllies().contains(topSA.getActivatingPlayer())) {
// might as well check for player's friendliness // might as well check for player's friendliness
return false; return false;
} else if (sa.hasParam("ConditionWouldDestroy") && !CounterEffect.checkForConditionWouldDestroy(sa, topSA)) { } 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 // filter AIs battlefield by what I can target
List<Card> targetables = CardLists.getTargetableCards(ai.getCardsIn(ZoneType.Battlefield), sa); List<Card> targetables = CardLists.getTargetableCards(ai.getCardsIn(ZoneType.Battlefield), sa);
if (targetables.size() == 0) { if (targetables.isEmpty()) {
return false; return false;
} }
@@ -153,11 +153,11 @@ public class RegenerateAi extends SpellAbilityAi {
CardCollectionView targetables = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa); CardCollectionView targetables = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa);
final List<Card> compTargetables = CardLists.filterControlledBy(targetables, ai); final List<Card> compTargetables = CardLists.filterControlledBy(targetables, ai);
if (targetables.size() == 0) { if (targetables.isEmpty()) {
return false; return false;
} }
if (!mandatory && compTargetables.size() == 0) { if (!mandatory && compTargetables.isEmpty()) {
return false; return false;
} }

View File

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

View File

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

View File

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

View File

@@ -1439,6 +1439,8 @@ public class GameAction {
} }
setHoldCheckingStaticAbilities(false); 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()) { if (game.getTriggerHandler().runWaitingTriggers()) {
checkAgain = true; checkAgain = true;
} }

View File

@@ -3580,6 +3580,18 @@ public class AbilityUtils {
} }
return doXMath(amount, m, source, ctb); 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); return doXMath(0, m, source, ctb);
} }

View File

@@ -37,6 +37,7 @@ public enum ApiType {
ChangeX (ChangeXEffect.class), ChangeX (ChangeXEffect.class),
ChangeZone (ChangeZoneEffect.class), ChangeZone (ChangeZoneEffect.class),
ChangeZoneAll (ChangeZoneAllEffect.class), ChangeZoneAll (ChangeZoneAllEffect.class),
ChaosEnsues (ChaosEnsuesEffect.class),
Charm (CharmEffect.class), Charm (CharmEffect.class),
ChooseCard (ChooseCardEffect.class), ChooseCard (ChooseCardEffect.class),
ChooseColor (ChooseColorEffect.class), ChooseColor (ChooseColorEffect.class),
@@ -189,7 +190,7 @@ public enum ApiType {
Vote (VoteEffect.class), Vote (VoteEffect.class),
WinsGame (GameWinEffect.class), WinsGame (GameWinEffect.class),
BlankLine (BlankLineEffect.class),
DamageResolve (DamageResolveEffect.class), DamageResolve (DamageResolveEffect.class),
ChangeZoneResolve (ChangeZoneResolveEffect.class), ChangeZoneResolve (ChangeZoneResolveEffect.class),
InternalLegendaryRule (CharmEffect.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"; final String fromGraveyard = " from the graveyard";
if (destination.equals(ZoneType.Battlefield)) { if (destination.equals(ZoneType.Battlefield)) {
final boolean attacking = (sa.hasParam("Attacking")); final boolean attacking = sa.hasParam("Attacking");
if (ZoneType.Graveyard.equals(origin)) { if (ZoneType.Graveyard.equals(origin)) {
sb.append("Return").append(targetname).append(fromGraveyard).append(" to the battlefield"); sb.append("Return").append(targetname).append(fromGraveyard).append(" to the battlefield");
} else { } 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 a card is moved to library from the stack, remove its spells from the stack
if (sa.hasParam("Fizzle")) { 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)) { if (gameCard.isInZone(ZoneType.Exile) || gameCard.isInZone(ZoneType.Hand) || gameCard.isInZone(ZoneType.Stack)) {
// This only fizzles spells, not anything else. // This only fizzles spells, not anything else.
game.getStack().remove(gameCard); 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) { public void resolve(SpellAbility sa) {
Game game = sa.getActivatingPlayer().getGame(); Game game = sa.getActivatingPlayer().getGame();
for (Player p : game.getPlayers()) { if (game.getActivePlanes() == null) { // not a planechase game, nothing happens
p.leaveCurrentPlane(); return;
}
if (!sa.hasParam("DontPlaneswalkAway")) {
for (Player p : game.getPlayers()) {
p.leaveCurrentPlane();
}
} }
if (sa.hasParam("Defined")) { if (sa.hasParam("Defined")) {
CardCollectionView destinations = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); 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); 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) { 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); int advantage = getRollAdvange(player);
amount += advantage; amount += advantage;
int total = 0; int total = 0;

View File

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

View File

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

View File

@@ -350,9 +350,17 @@ public class CardFactory {
planesWalkTrigger.setOverridingAbility(AbilityFactory.getAbility(rolledWalk, card)); planesWalkTrigger.setOverridingAbility(AbilityFactory.getAbility(rolledWalk, card));
card.addTrigger(planesWalkTrigger); 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" + 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 " + " | 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); SpellAbility planarRoll = AbilityFactory.getAbility(specialA, card);
planarRoll.setSVar("X", "Count$PlanarDiceSpecialActionThisTurn"); planarRoll.setSVar("X", "Count$PlanarDiceSpecialActionThisTurn");

View File

@@ -815,9 +815,9 @@ public class CardFactoryUtil {
inst.addTrigger(trigger); inst.addTrigger(trigger);
} else if (keyword.equals("Ascend")) { } else if (keyword.equals("Ascend")) {
// Ascend trigger only for Permanent // Ascend trigger only for Permanent
if (card.isPermanent()) { if (card.isPermanent() || card.isPlane()) {
final String trig = "Mode$ Always | TriggerZones$ Battlefield | Secondary$ True" final String trig = "Mode$ Always | TriggerZones$ " + (card.isPlane() ? "Command" : "Battlefield")
+ " | Static$ True | Blessing$ False | IsPresent$ Permanent.YouCtrl | PresentCompare$ GE10 " + " | Secondary$ True | Static$ True | Blessing$ False | IsPresent$ Permanent.YouCtrl | PresentCompare$ GE10"
+ " | TriggerDescription$ Ascend (" + inst.getReminderText() + ")"; + " | TriggerDescription$ Ascend (" + inst.getReminderText() + ")";
final String effect = "DB$ Ascend | Defined$ You"; 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 // Second, create the trigger that runs when the haunted creature dies
final StringBuilder sbDies = new StringBuilder(); final StringBuilder sbDies = new StringBuilder();
sbDies.append("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Exile |"); sbDies.append("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Exile");
sbDies.append("ValidCard$ Creature.HauntedBy | Execute$ ").append(hauntSVarName); sbDies.append(" | ValidCard$ Creature.HauntedBy | Execute$ ").append(hauntSVarName);
sbDies.append(" | TriggerDescription$ ").append(hauntDescription); sbDies.append(" | TriggerDescription$ ").append(hauntDescription);
final Trigger hauntedDies = TriggerHandler.parseTrigger(sbDies.toString(), card, intrinsic); 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 // First, create trigger that runs when the haunter goes to the graveyard
final StringBuilder sbHaunter = new StringBuilder(); final StringBuilder sbHaunter = new StringBuilder();
sbHaunter.append("Mode$ ChangesZone | Origin$ "); 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(" | Destination$ Graveyard | ValidCard$ Card.Self");
sbHaunter.append(" | Secondary$ True | TriggerDescription$ Haunt (").append(inst.getReminderText()).append(")"); 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 Map<Card, Card> maingameCardsMap = Maps.newHashMap();
private CardCollection currentPlanes = new CardCollection(); private CardCollection currentPlanes = new CardCollection();
private CardCollection planeswalkedToThisTurn = new CardCollection();
private PlayerStatistics stats = new PlayerStatistics(); private PlayerStatistics stats = new PlayerStatistics();
private PlayerController controller; private PlayerController controller;
@@ -1918,6 +1919,10 @@ public class Player extends GameEntity implements Comparable<Player> {
completedDungeons.clear(); completedDungeons.clear();
} }
public final List<Card> getPlaneswalkedToThisTurn() {
return planeswalkedToThisTurn;
}
public final void altWinBySpellEffect(final String sourceName) { public final void altWinBySpellEffect(final String sourceName) {
if (cantWin()) { if (cantWin()) {
System.out.println("Tried to win, but currently can't."); System.out.println("Tried to win, but currently can't.");
@@ -2458,6 +2463,7 @@ public class Player extends GameEntity implements Comparable<Player> {
setNumManaConversion(0); setNumManaConversion(0);
damageReceivedThisTurn.clear(); damageReceivedThisTurn.clear();
planeswalkedToThisTurn.clear();
// set last turn nr // set last turn nr
if (game.getPhaseHandler().isPlayerTurn(this)) { if (game.getPhaseHandler().isPlayerTurn(this)) {
@@ -2617,7 +2623,7 @@ public class Player extends GameEntity implements Comparable<Player> {
* Then runs triggers. * Then runs triggers.
*/ */
public void planeswalkTo(SpellAbility sa, final CardCollectionView destinations) { 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); currentPlanes.addAll(destinations);
game.getView().updatePlanarPlayer(getView()); 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.LastStateBattlefield, sa.getLastStateBattlefield());
moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard());
for (Card c : currentPlanes) { for (Card c : destinations) {
game.getAction().moveTo(ZoneType.Command, c, sa, moveParams); game.getAction().moveTo(ZoneType.Command, c, sa, moveParams);
planeswalkedToThisTurn.add(c);
//getZone(ZoneType.PlanarDeck).remove(c); //getZone(ZoneType.PlanarDeck).remove(c);
//getZone(ZoneType.Command).add(c); //getZone(ZoneType.Command).add(c);
} }
@@ -2634,7 +2641,7 @@ public class Player extends GameEntity implements Comparable<Player> {
game.setActivePlanes(currentPlanes); game.setActivePlanes(currentPlanes);
//Run PlaneswalkedTo triggers here. //Run PlaneswalkedTo triggers here.
final Map<AbilityKey, Object> runParams = AbilityKey.newMap(); final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Cards, currentPlanes); runParams.put(AbilityKey.Cards, destinations);
game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams, false);
view.updateCurrentPlaneName(currentPlanes.toString().replaceAll(" \\(.*","").replace("[","")); 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)) { if (!runParams.containsKey(AbilityKey.Fizzle)) {
return false; 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 // 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); return FileSection.parseToMap(trigParse, FileSection.DOLLAR_SIGN_KV_SEPARATOR);
} }
private void collectTriggerForWaiting() { public void collectTriggerForWaiting() {
for (final TriggerWaiting wt : waitingTriggers) { for (final TriggerWaiting wt : waitingTriggers) {
if (wt.getTriggers() != null) if (wt.getTriggers() != null)
continue; continue;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -34,6 +34,7 @@ import forge.player.GamePlayerUtil;
import forge.player.PlayerControllerHuman; import forge.player.PlayerControllerHuman;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.screens.LoadingOverlay; import forge.screens.LoadingOverlay;
import forge.screens.TransitionScreen;
import forge.screens.match.MatchController; import forge.screens.match.MatchController;
import forge.sound.MusicPlaylist; import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem; import forge.sound.SoundSystem;
@@ -130,18 +131,20 @@ public class DuelScene extends ForgeScene {
@Override @Override
public void run(Integer result) { public void run(Integer result) {
if (result == 0) { if (result == 0) {
afterGameEnd(enemyName, finalWinner, true, true); afterGameEnd(enemyName, finalWinner);
if (Config.instance().getSettingData().disableWinLose)
exitDuelScene();
} }
fb.dispose(); fb.dispose();
} }
})); }));
} else { } else {
afterGameEnd(enemyName, winner, false, false); afterGameEnd(enemyName, winner);
} }
} }
Runnable endRunnable = null;
void afterGameEnd(String enemyName, boolean winner, boolean showOverlay, boolean alternate) { void afterGameEnd(String enemyName, boolean winner) {
Runnable runnable = () -> Gdx.app.postRunnable(()-> { endRunnable = () -> Gdx.app.postRunnable(()-> {
if (GameScene.instance().isNotInWorldMap()) { if (GameScene.instance().isNotInWorldMap()) {
SoundSystem.instance.pause(); SoundSystem.instance.pause();
GameHUD.getInstance().playAudio(); GameHUD.getInstance().playAudio();
@@ -160,14 +163,9 @@ public class DuelScene extends ForgeScene {
((IAfterMatch) last).setWinner(winner); ((IAfterMatch) last).setWinner(winner);
} }
}); });
if (showOverlay) { }
FThreads.invokeInEdtNowOrLater(() -> { public void exitDuelScene() {
matchOverlay = new LoadingOverlay(runnable, true, alternate); Forge.setTransitionScreen(new TransitionScreen(endRunnable, Forge.takeScreenshot(), false, false));
matchOverlay.show();
});
} else {
runnable.run();
}
} }
void addEffects(RegisteredPlayer player, Array<EffectData> effects) { 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.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.time.LocalTime;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -203,7 +202,6 @@ public class SettingsScene extends UIScene {
boolean value = ((CheckBox) actor).isChecked(); boolean value = ((CheckBox) actor).isChecked();
Config.instance().getSettingData().fullScreen = value; Config.instance().getSettingData().fullScreen = value;
Config.instance().saveSettings(); Config.instance().saveSettings();
setTargetTime(LocalTime.now().getHour());
//update //update
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) { if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) {
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_LANDSCAPE_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); 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("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC, 0, 100);
addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 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(); unloadAudio();
SoundSystem.instance.resume(); // resume World BGM SoundSystem.instance.resume(); // resume World BGM
} }
//unequip and reequip abilities
updateAbility();
} }
void clearAbility() {
void updateAbility() {
for (TextraButton button : abilityButtonMap) { for (TextraButton button : abilityButtonMap) {
button.remove(); button.remove();
} }
abilityButtonMap.clear(); abilityButtonMap.clear();
}
void updateAbility() {
clearAbility();
setAbilityButton(AdventurePlayer.current().getEquippedAbility1()); setAbilityButton(AdventurePlayer.current().getEquippedAbility1());
setAbilityButton(AdventurePlayer.current().getEquippedAbility2()); setAbilityButton(AdventurePlayer.current().getEquippedAbility2());
float x = Forge.isLandscapeMode() ? 426f : 216f; float x = Forge.isLandscapeMode() ? 426f : 216f;
@@ -568,6 +572,14 @@ public class GameHUD extends Stage {
} }
opacity = visible ? 1f : 0.4f; opacity = visible ? 1f : 0.4f;
} }
void toggleConsole() {
console.toggle();
if (console.isVisible()) {
clearAbility();
} else {
updateAbility();
}
}
@Override @Override
public boolean keyUp(int keycode) { public boolean keyUp(int keycode) {
@@ -582,12 +594,12 @@ public class GameHUD extends Stage {
} }
ui.pressDown(keycode); ui.pressDown(keycode);
if (keycode == Input.Keys.F9 || keycode == Input.Keys.F10) { if (keycode == Input.Keys.F9 || keycode == Input.Keys.F10) {
console.toggle(); toggleConsole();
return true; return true;
} }
if (keycode == Input.Keys.BACK) { if (keycode == Input.Keys.BACK) {
if (console.isVisible()) { if (console.isVisible()) {
console.toggle(); toggleConsole();
} }
} }
if (console.isVisible()) if (console.isVisible())
@@ -699,7 +711,7 @@ public class GameHUD extends Stage {
@Override @Override
public boolean longPress(Actor actor, float x, float y) { public boolean longPress(Actor actor, float x, float y) {
console.toggle(); toggleConsole();
return super.longPress(actor, x, y); 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) 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); Deck deck= new Deck(data.name);
if(data.mainDeck!=null) if(data.mainDeck!=null)
{ {

View File

@@ -6,11 +6,11 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import forge.adventure.scene.DuelScene; import forge.adventure.scene.DuelScene;
import forge.adventure.util.Config;
import forge.ai.GameState; import forge.ai.GameState;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.player.Player; import forge.game.player.Player;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.screens.TransitionScreen;
import forge.util.collect.FCollection; import forge.util.collect.FCollection;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -312,14 +312,12 @@ public class MatchController extends AbstractGuiGame {
@Override @Override
public void finishGame() { public void finishGame() {
if (Forge.isMobileAdventureMode) { if (Forge.isMobileAdventureMode) {
Forge.setCursor(null, "0"); if (Config.instance().getSettingData().disableWinLose) {
if (DuelScene.instance().hasCallbackExit()) Forge.setCursor(null, "0");
if (!DuelScene.instance().hasCallbackExit())
DuelScene.instance().exitDuelScene();
return; return;
Forge.setTransitionScreen(new TransitionScreen(() -> { }
Forge.clearTransitionScreen();
Forge.clearCurrentScreen();
}, Forge.takeScreenshot(), false, false));
return;
} }
if (hasLocalPlayers() || getGameView().isMatchOver()) { if (hasLocalPlayers() || getGameView().isMatchOver()) {
view.setViewWinLose(new ViewWinLose(getGameView())); 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()); }).build());
lblTitle.setText(composeTitle(game0)); lblTitle.setText(composeTitle(game0));
if (Forge.isMobileAdventureMode)
control = new AdventureWinLose(this, game0);
showGameOutcomeSummary(); showGameOutcomeSummary();
showPlayerScores(); showPlayerScores();
control.showRewards(); control.showRewards();
@@ -152,6 +155,10 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
return this.btnQuit; return this.btnQuit;
} }
public FLabel getLabelShowBattlefield() {
return this.btnShowBattlefield;
}
private void showGameOutcomeSummary() { private void showGameOutcomeSummary() {
for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) { for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) {
pnlOutcomes.add(new FLabel.Builder().text(o.message).font(FSkinFont.get(14)).build()); 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; y += h + dy;
h = height / 12; h = height / 12;
btnContinue.setBounds(x, y, w, h); if (Forge.isMobileAdventureMode) {
y += h + dy; btnQuit.setBounds(x, y, w, h);
btnRestart.setBounds(x, y, w, h); y += h + dy;
y += h + dy; btnContinue.setVisible(false);
btnQuit.setBounds(x, y, w, h); btnRestart.setVisible(false);
y += h + dy; } 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; h = lblLog.getAutoSizeBounds().height + dy;
lblLog.setBounds(x, y, w, h); lblLog.setBounds(x, y, w, h);

View File

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

View File

@@ -84,8 +84,8 @@
"pileDecks": { "pileDecks": {
"W":"decks/starter/pile_white_e.json", "W":"decks/starter/pile_white_e.json",
"B":"decks/starter/pile_black_e.json", "B":"decks/starter/pile_black_e.json",
"U":"decks/starter/pile_blue_e.json", "U":"decks/starter/pile_blue_e.json",
"R":"decks/starter/pile_red_e.json", "R":"decks/starter/pile_red_e.json",
"G":"decks/starter/pile_green_e.json" "G":"decks/starter/pile_green_e.json"
}, },
"startItems": [ "startItems": [
@@ -122,8 +122,8 @@
"pileDecks": { "pileDecks": {
"W":"decks/starter/pile_white_n.json", "W":"decks/starter/pile_white_n.json",
"B":"decks/starter/pile_black_n.json", "B":"decks/starter/pile_black_n.json",
"U":"decks/starter/pile_blue_n.json", "U":"decks/starter/pile_blue_n.json",
"R":"decks/starter/pile_red_n.json", "R":"decks/starter/pile_red_n.json",
"G":"decks/starter/pile_green_n.json" "G":"decks/starter/pile_green_n.json"
}, },
"startItems": [ "startItems": [
@@ -191,8 +191,8 @@
"pileDecks": { "pileDecks": {
"W":"decks/starter/pile_white_h.json", "W":"decks/starter/pile_white_h.json",
"B":"decks/starter/pile_black_h.json", "B":"decks/starter/pile_black_h.json",
"U":"decks/starter/pile_blue_h.json", "U":"decks/starter/pile_blue_h.json",
"R":"decks/starter/pile_red_h.json", "R":"decks/starter/pile_red_h.json",
"G":"decks/starter/pile_green_h.json" "G":"decks/starter/pile_green_h.json"
} }
} }
@@ -212,7 +212,7 @@
"Brother's War", "Brother's War",
"Jumpstart 22", "Jumpstart 22",
"Phyrexia: ONE", "Phyrexia: ONE",
"March o.t Machine", "MOM",
"(All)" "(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": "template":
{ {
"count":60, "count":60,
"colors":["White", "Black"], "colors":["White"],
"tribe":"Phyrexian", "tribe":"Phyrexian",
"tribeCards":1.0, "tribeCards":1.0,
"tribeSynergyCards":0.5, "tribeSynergyCards":0.5,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <editorsettings>
<export target="wastetown..tmx" format="tmx"/> <export target="wastetown..tmx" format="tmx"/>
</editorsettings> </editorsettings>
@@ -13,7 +13,7 @@
</layer> </layer>
<layer id="1" name="Background" width="30" height="17"> <layer id="1" name="Background" width="30" height="17">
<data encoding="base64" compression="zlib"> <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> </data>
</layer> </layer>
<layer id="3" name="Clutter" width="30" height="17"> <layer id="3" name="Clutter" width="30" height="17">
@@ -26,7 +26,7 @@
</layer> </layer>
<layer id="2" name="Walls" width="30" height="17"> <layer id="2" name="Walls" width="30" height="17">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="zlib">
eJzbwcPAsIMI3K6HGxOjXwYNE6OnD2g2PjCBCLtH7SUOT9eD4GlQN8zQQ4jRKn6R01Ub1N4OEtMZLcIZHaC7iV72TtDD5NPDXmzuGGr2TkfCIIDMxxau9PAvuj3z0NxJy3IDnU+v8goEZujhLkdoaS++8pIW9uLzJ6X2wsoeZAATI6deAABIX/aO eJzbwcPAsIMAbtNjYGjHgzv0CJshg4YJqQfhPqC5+MCEUXupYu80oLnToXgd1A0bkMRm0Mhe5HQ1D2rvAhLTGS3CGR3cxOIOetg7QQ+TTw97sbljKNl7CCntToe6AZm/DEu40sO/6PZcRHPnDDrZi60coaW9G/RwlyO0tBdfeUkLe88RUV6SY+8dpLIHGcDEbpNRPgMAC9v4YQ==
</data> </data>
</layer> </layer>
<layer id="8" name="Archway" width="30" height="17"> <layer id="8" name="Archway" width="30" height="17">
@@ -79,25 +79,25 @@
]</property> ]</property>
</properties> </properties>
</object> </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> <properties>
<property name="reward">[ <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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10, &quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ] &quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;blue&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3, &quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ] &quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;blue&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1, &quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ] &quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
@@ -107,6 +107,7 @@
</property> </property>
</properties> </properties>
</object> </object>
<object id="76" template="../obj/treasure.tx" x="256" y="32"/>
</objectgroup> </objectgroup>
<objectgroup id="7" name="Waypoints"> <objectgroup id="7" name="Waypoints">
<object id="64" template="../obj/waypoint.tx" x="273" y="145"/> <object id="64" template="../obj/waypoint.tx" x="273" y="145"/>

View File

@@ -58,21 +58,21 @@
<properties> <properties>
<property name="reward">[ <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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10, &quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ] &quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;black&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3, &quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ] &quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;black&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1, &quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ] &quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <editorsettings>
<export format="tmx"/> <export format="tmx"/>
</editorsettings> </editorsettings>
@@ -49,21 +49,21 @@
<properties> <properties>
<property name="reward">[ <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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10, &quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ] &quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;green&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3, &quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ] &quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;green&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1, &quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ] &quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
@@ -101,6 +101,7 @@
<property name="waypoints" value=""/> <property name="waypoints" value=""/>
</properties> </properties>
</object> </object>
<object id="74" template="../obj/treasure.tx" x="217" y="71"/>
</objectgroup> </objectgroup>
<objectgroup id="7" name="Waypoints"> <objectgroup id="7" name="Waypoints">
<object id="57" template="../obj/waypoint.tx" x="88.5" y="327.167"/> <object id="57" template="../obj/waypoint.tx" x="88.5" y="327.167"/>

View File

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

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <editorsettings>
<export format="tmx"/> <export format="tmx"/>
</editorsettings> </editorsettings>
@@ -64,21 +64,21 @@
<properties> <properties>
<property name="reward">[ <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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10, &quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ] &quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;white&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3, &quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ] &quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;white&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;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1, &quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ] &quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
@@ -88,6 +88,7 @@
</property> </property>
</properties> </properties>
</object> </object>
<object id="78" template="../obj/treasure.tx" x="315" y="74"/>
</objectgroup> </objectgroup>
<objectgroup id="8" name="Waypoints"> <objectgroup id="8" name="Waypoints">
<object id="70" template="../obj/waypoint.tx" x="144" y="176"/> <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 size: 16, 16
Werewolf_f Werewolf_f
size: 16, 16 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", "Dark Knight",
"Death Knight", "Death Knight",
"Demon", "Demon",
"Dross Gladiator",
"Eye", "Eye",
"Fungus", "Fungus",
"Frog", "Frog",

View File

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

View File

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

View File

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

View File

@@ -70,7 +70,14 @@
"male":"sprites/heroes/werewolf_m.atlas", "male":"sprites/heroes/werewolf_m.atlas",
"femaleAvatar":"Werewolf_f", "femaleAvatar":"Werewolf_f",
"maleAvatar":"Werewolf_m" "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", "Efreet",
"Fire Elemental", "Fire Elemental",
"Flame Elemental", "Flame Elemental",
"Furnace Goblin",
"Goblin", "Goblin",
"Goblin Chief", "Goblin Chief",
"Goblin Warrior", "Goblin Warrior",

View File

@@ -54,6 +54,7 @@
"Knight", "Knight",
"Kor Warrior", "Kor Warrior",
"Monk", "Monk",
"Orthodoxy Duelist",
"Owl", "Owl",
"Raven", "Raven",
"Scorpion", "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") ONE Toxic 2: 1 wholeSheet("ONE Toxic 2"), 1 RareMythic:fromSheet("ONE Green Inserts")
# MOM Jumpstart # MOM Jumpstart
MOM Mite-y 1: 1 wholeSheet("MOM Mite-y 1"), 1 RareMythic:fromSheet("MOM White Inserts") MOM Brood 1: 1 wholeSheet("MOM Brood 1"), 1 RareMythic:fromSheet("MOM White Inserts")
MOM Mite-y 2: 1 wholeSheet("MOM Mite-y 2"), 1 RareMythic:fromSheet("MOM White Inserts") MOM Brood 2: 1 wholeSheet("MOM Brood 2"), 1 RareMythic:fromSheet("MOM White Inserts")
MOM Progress 1: 1 wholeSheet("MOM Progress 1"), 1 RareMythic:fromSheet("MOM Blue Inserts") MOM Overachiever 1: 1 wholeSheet("MOM Overachiever 1"), 1 RareMythic:fromSheet("MOM Blue Inserts")
MOM Progress 2: 1 wholeSheet("MOM Progress 2"), 1 RareMythic:fromSheet("MOM Blue Inserts") MOM Overachiever 2: 1 wholeSheet("MOM Overachiever 2"), 1 RareMythic:fromSheet("MOM Blue Inserts")
MOM Corruption 1: 1 wholeSheet("MOM Corruption 1"), 1 RareMythic:fromSheet("MOM Black Inserts") MOM Expendable 1: 1 wholeSheet("MOM Expendable 1"), 1 RareMythic:fromSheet("MOM Black Inserts")
MOM Corruption 2: 1 wholeSheet("MOM Corruption 2"), 1 RareMythic:fromSheet("MOM Black Inserts") MOM Expendable 2: 1 wholeSheet("MOM Expendable 2"), 1 RareMythic:fromSheet("MOM Black Inserts")
MOM Rebellious 1: 1 wholeSheet("MOM Rebellious 1"), 1 RareMythic:fromSheet("MOM Red Inserts") MOM Reinforcement 1: 1 wholeSheet("MOM Reinforcement 1"), 1 RareMythic:fromSheet("MOM Red Inserts")
MOM Rebellious 2: 1 wholeSheet("MOM Rebellious 2"), 1 RareMythic:fromSheet("MOM Red Inserts") MOM Reinforcement 2: 1 wholeSheet("MOM Reinforcement 2"), 1 RareMythic:fromSheet("MOM Red Inserts")
MOM Toxic 1: 1 wholeSheet("MOM Toxic 1"), 1 RareMythic:fromSheet("MOM Green Inserts") MOM Buff 1: 1 wholeSheet("MOM Buff 1"), 1 RareMythic:fromSheet("MOM Green Inserts")
MOM Toxic 2: 1 wholeSheet("MOM Toxic 2"), 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 Elesh Norn, Mother of Machines|ONE
1 Mondrak, Glory Dominus|ONE 1 Mondrak, Glory Dominus|ONE
1 Phyrexian Vindicator|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] [MOM Brood 1]
1 Essence of Orthodoxy
1 Essence of Orthodoxy|MOM 1 Norn's Inquisitor
1 Norn's Inquisitor|MOM 1 Phyrexian Pegasus
1 Phyrexian Pegasus|MOM 1 Alabaster Host Sanctifier
1 Alabaster Host Sanctifier|MOM 1 Infected Defector
1 Infected Defector|MOM 1 Alabaster Host Intercessor
1 Alabaster Host Intercessor|MOM 1 Seedpod Caretaker
1 Seedpod Caretaker|MOM 1 Tiller of Flesh
1 Tiller of Flesh|MOM 1 Sunder the Gateway
1 Sunder the Gateway|MOM 1 Angelic Intervention
1 Angelic Intervention|MOM 1 Cut Short
1 Cut Short|MOM 8 Plains
8 Plains|MOM
[MOM Brood 2] [MOM Brood 2]
1 Essence of Orthodoxy
1 Essence of Orthodoxy|MOM 1 Phyrexian Pegasus
1 Phyrexian Pegasus|MOM 1 Seedpod Caretaker
1 Seedpod Caretaker|MOM 1 Norn's Inquisitor
1 Norn's Inquisitor |MOM 1 Alabaster Host Sanctifier
1 Alabaster Host Sanctifier|MOM 1 Infected Defector
1 Infected Defector|MOM 1 Alabaster Host Intercessor
1 Alabaster Host Intercessor|MOM 1 Tiller of Flesh
1 Tiller of Flesh|MOM 1 Aerial Boost
1 Aerial Boost|MOM 1 Inspired Charge
1 Inspired Charge|MOM 1 Seal from Existence
1 Seal from Existence|MOM 8 Plains
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
[MOM Overachiever 1] [MOM Overachiever 1]
1 Zephyr Winder
1 Zephyr Winder|MOM 1 Expedition Lookout
1 Expedition Lookout|MOM 1 Preening Champion
1 Preening Champion|MOM 1 Thunderhead Squadron
1 Thunderhead Squadron|MOM 1 Tidal Terror
1 Tidal Terror|MOM 1 Referee Squad
1 Referee Squad|MOM 1 Oracle of Tragedy
1 Oracle of Tragedy|MOM 1 Interdisciplinary Mascot
1 Interdisciplinary Mascot|MOM 1 Temporal Cleansing
1 Temporal Cleansing|MOM 1 Ephara's Dispersal
1 Ephara's Dispersal|MOM 1 Meeting of Minds
1 Meeting of Minds|MOM 8 Island
8 Island|MOM
[MOM Overachiever 2] [MOM Overachiever 2]
1 Zephyr Winder
1 Zephyr Winder|MOM 1 Expedition Lookout
1 Expedition Lookout|MOM 1 Xerex Strobe-Knight
1 Xerex Strobe-Knight|MOM 1 Thunderhead Squadron
1 Thunderhead Squadron|MOM 1 Tidal Terror
1 Tidal Terror|MOM 1 Referee Squad
1 Referee Squad|MOM 1 Oracle of Tragedy
1 Oracle of Tragedy|MOM 1 Interdisciplinary Mascot
1 Interdisciplinary Mascot|MOM 1 Ephara's Dispersal
1 Ephara's Dispersal|MOM 1 Wicked Slumber
1 Wicked Slumber|MOM 1 Astral Wingspan
1 Astral Wingspan|MOM 8 Island
8 Island|MOM
[MOM Expendable 1] [MOM Expendable 1]
1 Terror of Towashi|MOM 1 Terror of Towashi|MOM
1 Seer of Stolen Sight|MOM 1 Seer of Stolen Sight|MOM
1 Injector Crocodile|MOM 1 Injector Crocodile|MOM
@@ -6187,14 +6060,13 @@ Kaya, Ghost Assassin|CN2|2
1 Etched Familiar|MOM 1 Etched Familiar|MOM
1 Ichor Shade|MOM 1 Ichor Shade|MOM
1 Scorn-Blade Berserker|MOM 1 Scorn-Blade Berserker|MOM
1 Final Flourish|MOM 1 Final Flourish|MOM
1 Unseal the Necropolis|MOM 1 Unseal the Necropolis|MOM
1 Deadly Derision|MOM 1 Deadly Derision|MOM
1 Gift of Compleation|MOM 1 Gift of Compleation|MOM
8 Swamp|MOM 8 Swamp|MOM
[MOM Expendable 2] [MOM Expendable 2]
1 Terror of Towashi|MOM 1 Terror of Towashi|MOM
1 Injector Crocodile|MOM 1 Injector Crocodile|MOM
1 Seer of Stolen Sight|MOM 1 Seer of Stolen Sight|MOM
@@ -6208,8 +6080,34 @@ Kaya, Ghost Assassin|CN2|2
1 Gift of Compleation|MOM 1 Gift of Compleation|MOM
8 Swamp|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 Surrak and Goreclaw|MOM
1 Fairgrounds Trumpeter|MOM 1 Fairgrounds Trumpeter|MOM
1 Ruins Recluse|MOM 1 Ruins Recluse|MOM
@@ -6221,10 +6119,9 @@ Kaya, Ghost Assassin|CN2|2
1 Arachnoid Adaptation|MOM 1 Arachnoid Adaptation|MOM
1 Cosmic Hunger|MOM 1 Cosmic Hunger|MOM
1 Fertilid's Favor|MOM 1 Fertilid's Favor|MOM
8 Forests|MOM 8 Forest
[MOM Buff 2] [MOM Buff 2]
1 Surrak and Goreclaw|MOM 1 Surrak and Goreclaw|MOM
1 Fairgrounds Trumpeter|MOM 1 Fairgrounds Trumpeter|MOM
1 Placid Rottentail|MOM 1 Placid Rottentail|MOM
@@ -6236,71 +6133,90 @@ Kaya, Ghost Assassin|CN2|2
1 Arachnoid Adaptation|MOM 1 Arachnoid Adaptation|MOM
1 Tandem Takedown|MOM 1 Tandem Takedown|MOM
1 Blighted Burgeoning|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] [MOM Blue Inserts]
1 Chrome Host Seedshark|MOM 1 Chrome Host Seedshark|MOM
1 Complete the Circuit|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 Faerie Mastermind|MOM
1 Zephyr Singer|MOM 1 Interdisciplinary Mascot|MOM
1 Transcendent Message|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 See Double|MOM
1 Transcendent Message|MOM
1 Zephyr Singer|MOM
1 Invasion of Ravnica|MOM
1 Jin-Gitaxias|MOM 1 Jin-Gitaxias|MOM
1 Sword of Once and Future|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
[MOM Green Inserts] [MOM Green Inserts]
1 Ancient Imperiosaur|MOM
1 Deeproot Wayfinder|MOM
1 Doomskar Warrior|MOM
1 Glistening Dawn|MOM 1 Glistening Dawn|MOM
1 Invasion of Ikoria|MOM 1 Invasion of Ikoria|MOM
1 Invasion of Ixalan|MOM 1 Invasion of Ixalan|MOM
1 Ozolith, the Shattered Spire|MOM 1 Ozolith, the Shattered Spire|MOM
1 Tribute to the World Tree|MOM
1 Polukranos Reborn|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 Invasion of Shandalar|MOM
1 Sword of Once and Future|MOM
1 Vorinclex|MOM 1 Vorinclex|MOM
1 Wrenn and Realmbreaker|MOM 1 Wrenn and Realmbreaker|MOM
1 Doomskar Warrior|MOM
1 Deeproot Wayfinder|MOM
1 Ancient Imperiosaur|MOM
[MOM Black Inserts] [MOM Red Inserts]
1 Bloodfeather Phoenix|MOM
1 Archpriest of Shadows|MOM 1 City on Fire|MOM
1 Ayara, Widow of the Realm|MOM 1 Etali, Primal Conquerer|MOM
1 Bloated Processor|MOM 1 Into the Fire|MOM
1 Hoarding Broodlord|MOM 1 Invasion of Kaladheim|MOM
1 Invasion of Fiora|MOM 1 Invasion of Karsus|MOM
1 Grafted Butcher|MOM 1 Nahiri's Warcrafting|MOM
1 Breach the Multiverse|MOM 1 Orthion, Hero of Lavabrink|MOM
1 Pile On|MOM 1 Rampaging Raptor|MOM
1 Sheoldred|MOM 1 Realmbreaker, the Invasion Tree|MOM
1 Invasion of Innistrad|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] [MOM White Inserts]
1 Archangel Elspeth|MOM
1 Elesh Norn|MOM
1 Monastery Mentor|MOM
1 Boon-Bringer Valkyrie|MOM 1 Boon-Bringer Valkyrie|MOM
1 Dusk Legion Duelist|MOM 1 Dusk Legion Duelist|MOM
1 Essence of Orthodoxy|MOM
1 Guardian of Ghirapur|MOM 1 Guardian of Ghirapur|MOM
1 Heliod, the Radiant Dawn|MOM 1 Heliod, the Radiant Dawn|MOM
1 Invasion of Gobakhan|MOM 1 Invasion of Gobakhan|MOM
1 Knight-Errant of Eos|MOM
1 Invasion of Theros|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 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 Name:Academy at Tolaria West
ManaCost:no cost ManaCost:no cost
Types:Plane Dominaria 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 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. T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ TrigDiscard | TriggerDescription$ Whenever chaos ensues, discard your hand.
SVar:RolledChaos:DB$ Discard | Mode$ Hand | Defined$ You SVar:TrigDiscard:DB$ Discard | Mode$ Hand | Defined$ You
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | CardsInHandLE$ 2 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: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: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 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: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: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:TrigPlaneswalk:Mode$ PlaneswalkedFrom | Execute$ AgyremCleanup | Static$ True
SVar:AIRollPlanarDieParams:Mode$ Always 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 ManaCost:no cost
Types:Plane Zendikar 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. 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:RolledChaos:DB$ Destroy | ValidTgts$ Creature.unenchanted | TgtPrompt$ Select target creature that isn't enchanted
SVar:AIRollPlanarDieParams:Mode$ Always | OppHasCreatureInPlay$ True | RollInMain1$ True 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 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. 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 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. 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:RolledChaos:DB$ PutCounter | Defined$ Self | CounterType$ SCROLL | CounterNum$ 1 | SubAbility$ ScrollsOfKnowledge SVar:TrigPutCounter:DB$ PutCounter | CounterType$ SCROLL | SubAbility$ ScrollsOfKnowledge
SVar:ScrollsOfKnowledge:DB$ Draw | Defined$ You | NumCards$ NumScrolls SVar:ScrollsOfKnowledge:DB$ Draw | NumCards$ NumScrolls
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9 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 Types:Plane Kolbahan
S:Mode$ AttackRestrict | EffectZone$ Command | MaxAttackers$ 1 | Description$ No more than one creature can attack each combat. 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. 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. 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 | ValidDescription$ each creature. SVar:RolledChaos:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature
SVar:AIRollPlanarDieParams:Mode$ Random | MinTurn$ 5 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 ManaCost:no cost
Types:Plane Alara Types:Plane Alara
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddKeyword$ Exalted | Description$ All creatures have exalted. 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: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:DivineCharacter:DB$ Animate | Defined$ Targeted | staticAbilities$ IndestructibleAspect | Duration$ Permanent
SVar:IndestructibleAspect:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible SVar:IndestructibleAspect:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible
SVar:AIRollPlanarDieParams:Mode$ Always | HasColorCreatureInPlay$ GWU 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 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. 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 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: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:RestorationReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True
SVar:AIRollPlanarDieParams:Mode$ Always | MinTurn$ 3 | RollInMain1$ 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 Name:Entering
ManaCost:4 B R ManaCost:4 B R
Types:Sorcery 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. 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: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 | StackDescription$ None
SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True 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.) 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 ManaCost:no cost
Types:Plane Luvion 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. 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. 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 | Name$ Celestine Reef Effect | StaticAbilities$ STCantlose,STCantWin | Triggers$ TrigPlaneswalk | Duration$ Permanent 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: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:TrigPlaneswalk:Mode$ PlaneswalkedFrom | Execute$ DBCleanup | Static$ True
SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:AIRollPlanarDieParams:Mode$ Always 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$ 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. 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 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 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:All
AI:RemoveDeck:Random 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 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. 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 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:RolledChaos:DB$ UntapAll | ValidCards$ Creature.YouCtrl
SVar:AIRollPlanarDieParams:Mode$ Always | HasCreatureInPlay$ True 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 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. 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 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. 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 | Name$ Eloren Wilds Effect | StaticAbilities$ STCantCast | Triggers$ TrigPlaneswalk | RememberObjects$ Targeted | Duration$ Permanent 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: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:TrigPlaneswalk:Mode$ PlaneswalkedFrom | Execute$ ExileSelf | Static$ True
SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:AIRollPlanarDieParams:Mode$ Always 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 Name:Extract from Darkness
ManaCost:3 U B ManaCost:3 U B
Types:Sorcery 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. A:SP$ Mill | NumCards$ 2 | Defined$ Player | SubAbility$ DBChoose | SpellDescription$ Each player mills two cards.
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature | ChoiceZone$ Graveyard | Mandatory$ True | SubAbility$ DBReturn 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.
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ChosenCard | GainControl$ True
AI:RemoveDeck:Random 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. 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 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.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. 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:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ Y
SVar:Y:Targeted$CardManaCost SVar:Y:Targeted$CardManaCost
SVar:AIRollPlanarDieParams:Mode$ Always | HasCreatureInPlay$ True 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 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. 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 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:RolledChaos:DB$ GainLife | LifeAmount$ 10 | Defined$ You
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9 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: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:DBLoseLife:DB$ LoseLife | Defined$ Targeted | LifeAmount$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True 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:RolledChaos:DB$ Destroy | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent to destroy
SVar:AIRollPlanarDieParams:Mode$ Always | MinTurn$ 3 | LowPriority$ True | MaxRollsPerTurn$ 9 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 ManaCost:no cost
Types:Plane Innistrad Types:Plane Innistrad
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddKeyword$ Vigilance | Description$ All creatures have vigilance. 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:RolledChaos:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible
SVar:AIRollPlanarDieParams:Mode$ Always 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. 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: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. 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 SVar:RolledChaos:DB$ GainControl | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature you own to gain control of
AI:RemoveDeck:All 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 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. 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 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:RolledChaos:DB$ RepeatEach | RepeatPlayers$ NonTargetedController | RepeatSubAbility$ DBCopy | ValidTgts$ Creature | TgtPrompt$ Select target creature | ChangeZoneTable$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ParentTarget | Controller$ Remembered SVar:DBCopy:DB$ CopyPermanent | Defined$ ParentTarget | Controller$ Remembered
AI:RemoveDeck:All 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 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. 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 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:RolledChaos:DB$ Token | TokenScript$ w_0_1_goat | TokenOwner$ You | TokenAmount$ 1
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9 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: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:OssuaryX:TriggeredCard$CardPower
SVar:MaxTgts:TriggeredCardController$Valid Creature.YouCtrl 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: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: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 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:ClearImprinted:DB$ Cleanup | ClearImprinted$ True
SVar:OsX:ImprintedLKI$FilterControlledByRemembered_CardPower SVar:OsX:ImprintedLKI$FilterControlledByRemembered_CardPower
SVar:AIRollPlanarDieParams:Mode$ Random | MinTurn$ 5 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 ManaCost:no cost
Types:Plane Alara 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.) 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: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 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