This commit is contained in:
Alessandro Coli
2019-09-21 12:28:37 +02:00
170 changed files with 1034 additions and 344 deletions

View File

@@ -8,7 +8,8 @@ public enum CardSplitType
Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed), Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed),
Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld), Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld),
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit), Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped); Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped),
Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Adventure);
CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) {
method = calcMode; method = calcMode;

View File

@@ -9,6 +9,7 @@ public enum CardStateName {
Meld, Meld,
LeftSplit, LeftSplit,
RightSplit, RightSplit,
Adventure,
; ;

View File

@@ -146,6 +146,10 @@ public class GameAction {
} }
} }
// if an adventureCard is put from Stack somewhere else, need to reset to Original State
if (c.isAdventureCard() && (zoneFrom.is(ZoneType.Stack) || !zoneTo.is(ZoneType.Stack))) {
c.setState(CardStateName.Original, true);
}
// Clean up the temporary Dash SVar when the Dashed card leaves the battlefield // Clean up the temporary Dash SVar when the Dashed card leaves the battlefield
// Clean up the temporary AtEOT SVar // Clean up the temporary AtEOT SVar

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import forge.card.CardStateName;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostParser; import forge.card.mana.ManaCostParser;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
@@ -101,6 +102,45 @@ public final class GameActionUtil {
} }
source.turnFaceDownNoUpdate(); source.turnFaceDownNoUpdate();
lkicheck = true; lkicheck = true;
} else if (sa.isAdventure() && !source.isInZone(ZoneType.Battlefield)) {
if (!source.isLKI()) {
source = CardUtil.getLKICopy(source);
}
source.setState(CardStateName.Adventure, false);
// need to reset CMC
source.setLKICMC(-1);
source.setLKICMC(source.getCMC());
lkicheck = true;
} else if (source.isSplitCard() && (sa.isLeftSplit() || sa.isRightSplit())) {
if (!source.isLKI()) {
source = CardUtil.getLKICopy(source);
}
if (sa.isLeftSplit()) {
if (!source.hasState(CardStateName.LeftSplit)) {
source.addAlternateState(CardStateName.LeftSplit, false);
source.getState(CardStateName.LeftSplit).copyFrom(
sa.getHostCard().getState(CardStateName.LeftSplit), true);
}
source.setState(CardStateName.LeftSplit, false);
}
if (sa.isRightSplit()) {
if (!source.hasState(CardStateName.RightSplit)) {
source.addAlternateState(CardStateName.RightSplit, false);
source.getState(CardStateName.RightSplit).copyFrom(
sa.getHostCard().getState(CardStateName.RightSplit), true);
}
source.setState(CardStateName.RightSplit, false);
}
// need to reset CMC
source.setLKICMC(-1);
source.setLKICMC(source.getCMC());
lkicheck = true;
} }
if (lkicheck) { if (lkicheck) {
@@ -132,20 +172,6 @@ public final class GameActionUtil {
newSA = sa.copyWithManaCostReplaced(activator, o.getAltManaCost()); newSA = sa.copyWithManaCostReplaced(activator, o.getAltManaCost());
newSA.setBasicSpell(false); newSA.setBasicSpell(false);
changedManaCost = true; changedManaCost = true;
if (host.hasSVar("AsForetoldSplitCMCHack")) {
// TODO: This is a temporary workaround for As Foretold interaction with split cards, better solution needed.
if (sa.isLeftSplit()) {
int leftCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.LeftSplitCMC);
if (leftCMC > host.getCounters(CounterType.TIME)) {
continue;
}
} else if (sa.isRightSplit()) {
int rightCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.RightSplitCMC);
if (rightCMC > host.getCounters(CounterType.TIME)) {
continue;
}
}
}
} else { } else {
newSA = sa.copy(activator); newSA = sa.copy(activator);
} }

View File

@@ -27,6 +27,7 @@ public enum GlobalRuleChange {
manapoolsDontEmpty ("Mana pools don't empty as steps and phases end."), manapoolsDontEmpty ("Mana pools don't empty as steps and phases end."),
noCycling ("Players can't cycle cards."), noCycling ("Players can't cycle cards."),
noCreatureETBTriggers ("Creatures entering the battlefield don't cause abilities to trigger."), noCreatureETBTriggers ("Creatures entering the battlefield don't cause abilities to trigger."),
noCreatureDyingTriggers ("Creatures dying don't cause abilities to trigger."),
noLegendRule ("The legend rule doesn't apply."), noLegendRule ("The legend rule doesn't apply."),
noPrevention ("Damage can't be prevented."), noPrevention ("Damage can't be prevented."),
/* onlyOneAttackerATurn ("No more than one creature can attack each turn."), */ /* onlyOneAttackerATurn ("No more than one creature can attack each turn."), */

View File

@@ -351,9 +351,12 @@ public class Card extends GameEntity implements Comparable<Card> {
else if (isDoubleFaced() && currentStateName != CardStateName.Transformed) { else if (isDoubleFaced() && currentStateName != CardStateName.Transformed) {
return CardStateName.Transformed; return CardStateName.Transformed;
} }
else if (this.isMeldable() && currentStateName != CardStateName.Meld) { else if (isMeldable() && currentStateName != CardStateName.Meld) {
return CardStateName.Meld; return CardStateName.Meld;
} }
else if (this.isAdventureCard() && currentStateName != CardStateName.Adventure) {
return CardStateName.Adventure;
}
else { else {
return CardStateName.Original; return CardStateName.Original;
} }
@@ -803,6 +806,10 @@ public class Card extends GameEntity implements Comparable<Card> {
return getRules() != null && getRules().getSplitType() == CardSplitType.Split; return getRules() != null && getRules().getSplitType() == CardSplitType.Split;
} }
public final boolean isAdventureCard() {
return hasState(CardStateName.Adventure);
}
public final boolean isBackSide() { public final boolean isBackSide() {
return backside; return backside;
} }
@@ -1989,7 +1996,19 @@ public class Card extends GameEntity implements Comparable<Card> {
continue; continue;
} }
final String sAbility = formatSpellAbility(sa); String sAbility = formatSpellAbility(sa);
// add Adventure to AbilityText
if (sa.isAdventure() && state.getView().getState().equals(CardStateName.Original)) {
StringBuilder sbSA = new StringBuilder();
sbSA.append("Adventure — ").append(getState(CardStateName.Adventure).getName());
if (sa.getPayCosts() != null) {
sbSA.append(" ").append(sa.getPayCosts().toSimpleString());
}
sbSA.append(": ");
sbSA.append(sAbility);
sAbility = sbSA.toString();
}
if (sa.getManaPart() != null) { if (sa.getManaPart() != null) {
if (addedManaStrings.contains(sAbility)) { if (addedManaStrings.contains(sAbility)) {
@@ -2397,10 +2416,21 @@ public class Card extends GameEntity implements Comparable<Card> {
// add Facedown abilities from Original state but only if this state is face down // add Facedown abilities from Original state but only if this state is face down
// need CardStateView#getState or might crash in StackOverflow // need CardStateView#getState or might crash in StackOverflow
if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) { if (isInZone(ZoneType.Battlefield)) {
for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) { if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) {
if (sa.isManifestUp() || sa.isMorphUp()) { for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) {
list.add(sa); if (sa.isManifestUp() || sa.isMorphUp()) {
list.add(sa);
}
}
}
} else {
// Adenture may only be cast not from Battlefield
if (isAdventureCard() && state.getView().getState() == CardStateName.Original) {
for (SpellAbility sa : getState(CardStateName.Adventure).getSpellAbilities()) {
if (mana == null || mana == sa.isManaAbility()) {
list.add(sa);
}
} }
} }
} }
@@ -5731,6 +5761,12 @@ public class Card extends GameEntity implements Comparable<Card> {
} }
public void setSplitStateToPlayAbility(final SpellAbility sa) { public void setSplitStateToPlayAbility(final SpellAbility sa) {
if (isAdventureCard()) {
if (sa.isAdventure()) {
setState(CardStateName.Adventure, true);
}
return;
}
if (!isSplitCard()) { if (!isSplitCard()) {
return; // just in case return; // just in case
} }

View File

@@ -305,6 +305,11 @@ public class CardFactory {
} else if (c.isMeldable() && cp instanceof PaperCard) { } else if (c.isMeldable() && cp instanceof PaperCard) {
c.setState(CardStateName.Meld, false); c.setState(CardStateName.Meld, false);
c.setImageKey(cp.getImageKey(true)); c.setImageKey(cp.getImageKey(true));
} else if (c.isAdventureCard()) {
c.setState(CardStateName.Adventure, false);
c.setImageKey(originalPicture);
c.setSetCode(cp.getEdition());
c.setRarity(cp.getRarity());
} }
c.setSetCode(cp.getEdition()); c.setSetCode(cp.getEdition());
@@ -325,7 +330,6 @@ public class CardFactory {
// ****************************************************************** // ******************************************************************
// ************** Link to different CardFactories ******************* // ************** Link to different CardFactories *******************
if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) { if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) {
for (final SpellAbility sa : card.getSpellAbilities()) { for (final SpellAbility sa : card.getSpellAbilities()) {
if (state == CardStateName.LeftSplit) { if (state == CardStateName.LeftSplit) {
@@ -342,6 +346,9 @@ public class CardFactory {
} else if (state != CardStateName.Original){ } else if (state != CardStateName.Original){
CardFactoryUtil.setupKeywordedAbilities(card); CardFactoryUtil.setupKeywordedAbilities(card);
} }
if (state == CardStateName.Adventure) {
CardFactoryUtil.setupAdventureAbility(card);
}
} }
card.setState(CardStateName.Original, false); card.setState(CardStateName.Original, false);
@@ -728,6 +735,14 @@ public class CardFactory {
final CardState ret2 = new CardState(out, CardStateName.Flipped); final CardState ret2 = new CardState(out, CardStateName.Flipped);
ret2.copyFrom(in.getState(CardStateName.Flipped, true), false); ret2.copyFrom(in.getState(CardStateName.Flipped, true), false);
result.put(CardStateName.Flipped, ret2); result.put(CardStateName.Flipped, ret2);
} else if (in.isAdventureCard()) {
final CardState ret1 = new CardState(out, CardStateName.Original);
ret1.copyFrom(in.getState(CardStateName.Original, true), false);
result.put(CardStateName.Original, ret1);
final CardState ret2 = new CardState(out, CardStateName.Adventure);
ret2.copyFrom(in.getState(CardStateName.Adventure, true), false);
result.put(CardStateName.Adventure, ret2);
} else { } else {
// in all other cases just copy the current state to original // in all other cases just copy the current state to original
final CardState ret = new CardState(out, CardStateName.Original); final CardState ret = new CardState(out, CardStateName.Original);

View File

@@ -4738,4 +4738,30 @@ public class CardFactoryUtil {
} }
return byClause + StringUtils.join(orClauses, " or ") + "."; return byClause + StringUtils.join(orClauses, " or ") + ".";
} }
public static void setupAdventureAbility(Card card) {
if (card.getCurrentStateName() != CardStateName.Adventure) {
return;
}
SpellAbility sa = card.getFirstSpellAbility();
if (sa == null) {
return;
}
sa.setAdventure(true);
String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | StackDescription$ None";
AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(abExile, card);
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
StringBuilder sb = new StringBuilder();
sb.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure");
sb.append(" | AffectedZone$ Exile | Description$ You may cast the card.");
saEffect.setSVar("Play", sb.toString());
saExile.setSubAbility(saEffect);
sa.appendSubAbility(saExile);
}
} }

View File

@@ -107,26 +107,8 @@ public class CardProperty {
if (card.isSplitCard()) { if (card.isSplitCard()) {
return false; return false;
} }
} else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) { } else if (property.equals("AdventureCard")) {
int x; if (!card.isAdventureCard()) {
int y = 0;
String rhs = "";
if (property.startsWith("leftcmc")) {
rhs = property.substring(9);
y = card.getCMC(Card.SplitCMCMode.LeftSplitCMC);
} else if (property.startsWith("rightcmc")) {
rhs = property.substring(10);
y = card.getCMC(Card.SplitCMCMode.RightSplitCMC);
}
try {
x = Integer.parseInt(rhs);
} catch (final NumberFormatException e) {
x = AbilityUtils.calculateAmount(source, rhs, spellAbility);
}
if (!Expressions.compare(y, property, x)) {
return false; return false;
} }
} else if (property.startsWith("YouCtrl")) { } else if (property.startsWith("YouCtrl")) {
@@ -1358,6 +1340,14 @@ public class CardProperty {
if (card.isToken()) { if (card.isToken()) {
return false; return false;
} }
} else if (property.startsWith("copiedSpell")) {
if (!card.isCopiedSpell()) {
return false;
}
} else if (property.startsWith("nonCopiedSpell")) {
if (card.isCopiedSpell()) {
return false;
}
} else if (property.startsWith("hasXCost")) { } else if (property.startsWith("hasXCost")) {
SpellAbility sa1 = card.getFirstSpellAbility(); SpellAbility sa1 = card.getFirstSpellAbility();
if (sa1 != null && !sa1.isXCost()) { if (sa1 != null && !sa1.isXCost()) {

View File

@@ -225,6 +225,11 @@ public final class CardUtil {
newCopy.turnFaceDownNoUpdate(); newCopy.turnFaceDownNoUpdate();
} }
if (in.isAdventureCard() && in.getFaceupCardStateName().equals(CardStateName.Original)) {
newCopy.addAlternateState(CardStateName.Adventure, false);
newCopy.getState(CardStateName.Adventure).copyFrom(in.getState(CardStateName.Adventure), true);
}
/* /*
if (in.isCloned()) { if (in.isCloned()) {
newCopy.addAlternateState(CardStateName.Cloner, false); newCopy.addAlternateState(CardStateName.Cloner, false);

View File

@@ -557,7 +557,7 @@ public class CardView extends GameEntityView {
} }
tname = tname.isEmpty() ? state.getName() : tname; tname = tname.isEmpty() ? state.getName() : tname;
toracle = toracle.isEmpty() ? state.getOracleText() : toracle;
if (isSplitCard()) { if (isSplitCard()) {
taltname = getAlternateState().getName(); taltname = getAlternateState().getName();
taltoracle = getAlternateState().getOracleText(); taltoracle = getAlternateState().getOracleText();
@@ -572,7 +572,7 @@ public class CardView extends GameEntityView {
sb.append(taltoracle); sb.append(taltoracle);
return sb.toString().trim(); return sb.toString().trim();
} else { } else {
return toracle; return toracle.isEmpty() ? state.getOracleText() : toracle;
} }
} }

View File

@@ -100,6 +100,10 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable
if (card.isSplitCard()) { if (card.isSplitCard()) {
CardStateName name = isLeftSplit() ? CardStateName.LeftSplit : CardStateName.RightSplit; CardStateName name = isLeftSplit() ? CardStateName.LeftSplit : CardStateName.RightSplit;
isInstant = card.getState(name).getType().isInstant(); isInstant = card.getState(name).getType().isInstant();
} else if (isAdventure()) {
if (card.hasState(CardStateName.Adventure)) {
isInstant = card.getState(CardStateName.Adventure).getType().isInstant();
}
} }
boolean lkicheck = false; boolean lkicheck = false;
@@ -130,6 +134,13 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable
} }
card.turnFaceDownNoUpdate(); card.turnFaceDownNoUpdate();
lkicheck = true; lkicheck = true;
} else if (isAdventure()) {
if (!card.isLKI()) {
card = CardUtil.getLKICopy(card);
}
card.setState(CardStateName.Adventure, false);
lkicheck = true;
} }

View File

@@ -118,6 +118,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private boolean basicLandAbility = false; private boolean basicLandAbility = false;
private boolean adventure = false;
private SplitSide splitSide = null; private SplitSide splitSide = null;
enum SplitSide { LEFT, RIGHT } enum SplitSide { LEFT, RIGHT }
@@ -565,6 +566,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
public void setTriggeringObject(final AbilityKey type, final Object o) { public void setTriggeringObject(final AbilityKey type, final Object o) {
triggeringObjects.put(type, o); triggeringObjects.put(type, o);
} }
public void setTriggeringObjectsFrom(final Trigger trigger, final AbilityKey... types) {
int typesLength = types.length;
for (int i = 0; i < typesLength; i += 1) {
AbilityKey type = types[i];
triggeringObjects.put(type, trigger.getFromRunParams(type));
}
}
public boolean hasTriggeringObject(final AbilityKey type) { public boolean hasTriggeringObject(final AbilityKey type) {
return triggeringObjects.containsKey(type); return triggeringObjects.containsKey(type);
} }
@@ -852,6 +862,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
public void setRightSplit() { public void setRightSplit() {
splitSide = SplitSide.RIGHT; splitSide = SplitSide.RIGHT;
} }
public boolean isAdventure() {
return this.adventure;
}
public void setAdventure(boolean adventure) {
this.adventure = adventure;
}
public SpellAbility copy() { public SpellAbility copy() {
return copy(hostCard, false); return copy(hostCard, false);

View File

@@ -66,7 +66,7 @@ public abstract class Trigger extends TriggerReplacementBase {
/** The run params. */ /** The run params. */
private Map<String, Object> runParams; private Map<AbilityKey, Object> runParams;
private TriggerType mode; private TriggerType mode;
@@ -122,7 +122,7 @@ public abstract class Trigger extends TriggerReplacementBase {
this.id = nextId(); this.id = nextId();
this.intrinsic = intrinsic; this.intrinsic = intrinsic;
this.setRunParams(new HashMap<>()); // TODO: Consider whether this can be null instead, for performance reasons. this.setRunParams(AbilityKey.newMap()); // TODO: Consider whether this can be null instead, for performance reasons.
this.originalMapParams.putAll(params); this.originalMapParams.putAll(params);
this.mapParams.putAll(params); this.mapParams.putAll(params);
this.setHostCard(host); this.setHostCard(host);
@@ -460,8 +460,8 @@ public abstract class Trigger extends TriggerReplacementBase {
* *
* @return the runParams * @return the runParams
*/ */
public Map<String, Object> getRunParams() { public Object getFromRunParams(AbilityKey key) {
return this.runParams; return this.runParams.get(key);
} }
/** /**
@@ -470,7 +470,7 @@ public abstract class Trigger extends TriggerReplacementBase {
* @param runParams0 * @param runParams0
* the runParams to set * the runParams to set
*/ */
public void setRunParams(final Map<String, Object> runParams0) { public void setRunParams(final Map<AbilityKey, Object> runParams0) {
this.runParams = runParams0; this.runParams = runParams0;
} }

View File

@@ -63,7 +63,7 @@ public class TriggerAbandoned extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme")); sa.setTriggeringObjectsFrom(this, AbilityKey.Scheme);
} }
@Override @Override

View File

@@ -64,7 +64,7 @@ public class TriggerAdapt extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -73,8 +73,7 @@ public class TriggerAttached extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("AttachSource")); sa.setTriggeringObjectsFrom(this, AbilityKey.Source, AbilityKey.Target);
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("AttachTarget"));
} }
@Override @Override

View File

@@ -85,11 +85,14 @@ public class TriggerAttackerBlocked extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Attacker, getRunParams().get("Attacker")); sa.setTriggeringObjectsFrom(
sa.setTriggeringObject(AbilityKey.Blockers, getRunParams().get("Blockers")); this,
sa.setTriggeringObject(AbilityKey.Defender, getRunParams().get("Defender")); AbilityKey.Attacker,
sa.setTriggeringObject(AbilityKey.DefendingPlayer, getRunParams().get("DefendingPlayer")); AbilityKey.Blockers,
sa.setTriggeringObject(AbilityKey.NumBlockers, getRunParams().get("NumBlockers")); AbilityKey.Defender,
AbilityKey.DefendingPlayer,
AbilityKey.NumBlockers
);
} }
@Override @Override

View File

@@ -88,8 +88,7 @@ public class TriggerAttackerBlockedByCreature extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); sa.setTriggeringObjectsFrom(this, AbilityKey.Attacker, AbilityKey.Blocker);
sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker"));
} }
@Override @Override

View File

@@ -70,9 +70,7 @@ public class TriggerAttackerUnblocked extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); sa.setTriggeringObjectsFrom(this, AbilityKey.Attacker, AbilityKey.Defender, AbilityKey.DefendingPlayer);
sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Defender"));
sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer"));
} }
@Override @Override

View File

@@ -85,8 +85,7 @@ public class TriggerAttackerUnblockedOnce extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer")); sa.setTriggeringObjectsFrom(this, AbilityKey.AttackingPlayer, AbilityKey.Defenders);
sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders"));
} }
@Override @Override

View File

@@ -87,8 +87,7 @@ public class TriggerAttackersDeclared extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); sa.setTriggeringObjectsFrom(this, AbilityKey.Attackers, AbilityKey.AttackingPlayer);
sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer"));
} }
@Override @Override

View File

@@ -125,10 +125,13 @@ public class TriggerAttacks extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); sa.setTriggeringObjectsFrom(
sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Attacked")); this,
sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders")); AbilityKey.Attacker,
sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); AbilityKey.Defender,
AbilityKey.Defenders,
AbilityKey.DefendingPlayer
);
} }
@Override @Override

View File

@@ -36,7 +36,7 @@ public class TriggerBecomeMonarch extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -65,8 +65,7 @@ public class TriggerBecomeMonstrous extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.MonstrosityAmount);
sa.setTriggeringObject(AbilityKey.MonstrosityAmount, getRunParams().get("MonstrosityAmount"));
} }
@Override @Override

View File

@@ -63,7 +63,7 @@ public class TriggerBecomeRenowned extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -89,9 +89,8 @@ public class TriggerBecomesTarget extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA")); sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) getFromRunParams(AbilityKey.SourceSA)).getHostCard());
sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); sa.setTriggeringObjectsFrom(this, AbilityKey.SourceSA, AbilityKey.Target);
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("Target"));
} }
@Override @Override

View File

@@ -81,9 +81,8 @@ public class TriggerBecomesTargetOnce extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA")); sa.setTriggeringObjectsFrom(this, AbilityKey.SourceSA, AbilityKey.Targets);
sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) getFromRunParams(AbilityKey.SourceSA)).getHostCard());
sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("Targets"));
} }
@Override @Override

View File

@@ -52,8 +52,7 @@ public class TriggerBlockersDeclared extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Blockers, this.getRunParams().get("Blockers")); sa.setTriggeringObjectsFrom(this, AbilityKey.Blockers, AbilityKey.Attackers);
sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers"));
} }
@Override @Override

View File

@@ -89,8 +89,7 @@ public class TriggerBlocks extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker")); sa.setTriggeringObjectsFrom(this, AbilityKey.Blocker, AbilityKey.Attackers);
sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers"));
} }
@Override @Override

View File

@@ -72,8 +72,7 @@ public class TriggerChampioned extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Championed, this.getRunParams().get("Championed")); sa.setTriggeringObjectsFrom(this, AbilityKey.Championed, AbilityKey.Card);
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
} }
@Override @Override

View File

@@ -71,7 +71,7 @@ public class TriggerChangesController extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -218,7 +218,7 @@ public class TriggerChangesZone extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -23,7 +23,7 @@ public class TriggerChangesZoneAll extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
final CardZoneTable table = (CardZoneTable) getRunParams().get("Cards"); final CardZoneTable table = (CardZoneTable) getFromRunParams(AbilityKey.Cards);
CardCollection allCards = this.filterCards(table); CardCollection allCards = this.filterCards(table);

View File

@@ -121,10 +121,7 @@ public class TriggerCounterAdded extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
if (this.getRunParams().containsKey("Card")) sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
if (this.getRunParams().containsKey("Player"))
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
} }
@Override @Override

View File

@@ -25,7 +25,7 @@ public class TriggerCounterAddedAll extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
final GameEntityCounterTable table = (GameEntityCounterTable) getRunParams().get("Objects"); final GameEntityCounterTable table = (GameEntityCounterTable) getFromRunParams(AbilityKey.Objects);
Map<GameEntity, Integer> all = this.filterTable(table); Map<GameEntity, Integer> all = this.filterTable(table);

View File

@@ -106,11 +106,8 @@ public class TriggerCounterAddedOnce extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
if (this.getRunParams().containsKey("Card")) sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObject(AbilityKey.Amount, getFromRunParams(AbilityKey.CounterAmount));
if (this.getRunParams().containsKey("Player"))
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount"));
} }
@Override @Override

View File

@@ -83,7 +83,7 @@ public class TriggerCounterRemoved extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -74,8 +74,7 @@ public class TriggerCounterRemovedOnce extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Amount);
sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount"));
} }
@Override @Override

View File

@@ -93,10 +93,13 @@ public class TriggerCountered extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(
sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); this,
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); AbilityKey.Card,
sa.setTriggeringObject(AbilityKey.CounteredSA, this.getRunParams().get("CounteredSA")); AbilityKey.Cause,
AbilityKey.Player,
AbilityKey.CounteredSA
);
} }
@Override @Override

View File

@@ -39,8 +39,7 @@ public class TriggerCrewed extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Vehicle, this.getRunParams().get("Vehicle")); sa.setTriggeringObjectsFrom(this, AbilityKey.Vehicle, AbilityKey.Crew);
sa.setTriggeringObject(AbilityKey.Crew, this.getRunParams().get("Crew"));
} }
@Override @Override

View File

@@ -50,7 +50,7 @@ public class TriggerCycled extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -106,9 +106,7 @@ public class TriggerDamageDealtOnce extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("DamageSource")); sa.setTriggeringObjectsFrom(this, AbilityKey.Source, AbilityKey.Targets, AbilityKey.DamageAmount);
sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("DamageTargets"));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
} }
@Override @Override

View File

@@ -119,11 +119,14 @@ public class TriggerDamageDone extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource"))); sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)getFromRunParams(AbilityKey.DamageSource)));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); sa.setTriggeringObjectsFrom(
// This parameter is here because LKI information related to combat doesn't work properly this,
sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); AbilityKey.DamageAmount,
// This parameter is here because LKI information related to combat doesn't work properly
AbilityKey.DefendingPlayer
);
} }
@Override @Override

View File

@@ -58,15 +58,9 @@ public class TriggerDamageDoneOnce extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
if (this.getRunParams().containsKey("DamageTarget")) { sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); sa.setTriggeringObject(AbilityKey.Sources, getFromRunParams(AbilityKey.DamageSources));
} sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount);
if (this.getRunParams().containsKey("DamageSources")) {
sa.setTriggeringObject(AbilityKey.Sources, this.getRunParams().get("DamageSources"));
}
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
} }
@Override @Override

View File

@@ -103,9 +103,9 @@ public class TriggerDamagePrevented extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource"))); sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)getFromRunParams(AbilityKey.DamageSource)));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount);
} }
@Override @Override

View File

@@ -94,8 +94,8 @@ public class TriggerDamagePreventedOnce extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount);
} }
@Override @Override

View File

@@ -68,8 +68,7 @@ public class TriggerDestroyed extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Causer);
sa.setTriggeringObject(AbilityKey.Causer, this.getRunParams().get("Causer"));
} }
@Override @Override

View File

@@ -61,7 +61,7 @@ public class TriggerDevoured extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Devoured, this.getRunParams().get("Devoured")); sa.setTriggeringObjectsFrom(this, AbilityKey.Devoured);
} }
@Override @Override

View File

@@ -86,8 +86,7 @@ public class TriggerDiscarded extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Cause);
sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause"));
} }
@Override @Override

View File

@@ -81,8 +81,7 @@ public class TriggerDrawn extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
} }
@Override @Override

View File

@@ -62,7 +62,7 @@ public class TriggerEvolved extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -33,8 +33,7 @@ public class TriggerExerted extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
} }
@Override @Override

View File

@@ -97,7 +97,7 @@ public class TriggerExiled extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -72,8 +72,7 @@ public class TriggerExploited extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Exploited, this.getRunParams().get("Exploited")); sa.setTriggeringObjectsFrom(this, AbilityKey.Exploited, AbilityKey.Card);
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
} }
@Override @Override

View File

@@ -62,7 +62,7 @@ public class TriggerExplores extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Explorer, this.getRunParams().get("Card")); sa.setTriggeringObject(AbilityKey.Explorer, getFromRunParams(AbilityKey.Card));
} }
@Override @Override

View File

@@ -63,7 +63,7 @@ public class TriggerFight extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Fighter, this.getRunParams().get("Fighter")); sa.setTriggeringObjectsFrom(this, AbilityKey.Fighter);
} }
@Override @Override

View File

@@ -70,7 +70,7 @@ public class TriggerFlippedCoin extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -338,7 +338,7 @@ public class TriggerHandler {
private void runStateTrigger(final Map<AbilityKey, Object> runParams) { private void runStateTrigger(final Map<AbilityKey, Object> runParams) {
for (final Trigger t: activeTriggers) { for (final Trigger t: activeTriggers) {
if (canRunTrigger(t, TriggerType.Always, runParams)) { if (canRunTrigger(t, TriggerType.Always, runParams)) {
runSingleTrigger(t, toStringMap(runParams)); runSingleTrigger(t, runParams);
} }
} }
} }
@@ -376,7 +376,7 @@ public class TriggerHandler {
// Static triggers // Static triggers
for (final Trigger t : Lists.newArrayList(activeTriggers)) { for (final Trigger t : Lists.newArrayList(activeTriggers)) {
if (t.isStatic() && canRunTrigger(t, mode, runParams)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) {
runSingleTrigger(t, toStringMap(runParams)); runSingleTrigger(t, runParams);
checkStatics = true; checkStatics = true;
} }
@@ -420,7 +420,6 @@ public class TriggerHandler {
final TriggerType mode = wt.getMode(); final TriggerType mode = wt.getMode();
final Map<AbilityKey, Object> runParams = wt.getParams(); final Map<AbilityKey, Object> runParams = wt.getParams();
final Map<String, Object> stringRunParams = toStringMap(runParams);
final List<Trigger> triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers; final List<Trigger> triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers;
Card card = null; Card card = null;
@@ -450,7 +449,7 @@ public class TriggerHandler {
int x = 1 + handlePanharmonicon(t, runParams, player); int x = 1 + handlePanharmonicon(t, runParams, player);
for (int i = 0; i < x; ++i) { for (int i = 0; i < x; ++i) {
runSingleTrigger(t, stringRunParams); runSingleTrigger(t, runParams);
} }
checkStatics = true; checkStatics = true;
} }
@@ -459,7 +458,7 @@ public class TriggerHandler {
for (final Trigger deltrig : delayedTriggersWorkingCopy) { for (final Trigger deltrig : delayedTriggersWorkingCopy) {
if (deltrig.getHostCard().getController().equals(player)) { if (deltrig.getHostCard().getController().equals(player)) {
if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) { if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) {
runSingleTrigger(deltrig, stringRunParams); runSingleTrigger(deltrig, runParams);
delayedTriggers.remove(deltrig); delayedTriggers.remove(deltrig);
} }
} }
@@ -541,20 +540,34 @@ public class TriggerHandler {
} }
} }
} // Torpor Orb check } // Torpor Orb check
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureDyingTriggers)
&& !regtrig.isStatic() && mode.equals(TriggerType.ChangesZone)) {
if (runParams.get(AbilityKey.Destination) instanceof String && runParams.get(AbilityKey.Origin) instanceof String) {
final String dest = (String) runParams.get(AbilityKey.Destination);
final String origin = (String) runParams.get(AbilityKey.Origin);
if (dest.equals("Graveyard") && origin.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) {
final Card card = (Card) runParams.get(AbilityKey.Card);
if (card.isCreature()) {
return false;
}
}
}
}
return true; return true;
} }
// Checks if the conditions are right for a single trigger to go off, and // Checks if the conditions are right for a single trigger to go off, and
// runs it if so. // runs it if so.
// Return true if the trigger went off, false otherwise. // Return true if the trigger went off, false otherwise.
private void runSingleTrigger(final Trigger regtrig, final Map<String, Object> runParams) { private void runSingleTrigger(final Trigger regtrig, final Map<AbilityKey, Object> runParams) {
final Map<String, String> triggerParams = regtrig.getMapParams(); final Map<String, String> triggerParams = regtrig.getMapParams();
regtrig.setRunParams(runParams); regtrig.setRunParams(runParams);
// All tests passed, execute ability. // All tests passed, execute ability.
if (regtrig instanceof TriggerTapsForMana) { if (regtrig instanceof TriggerTapsForMana) {
final SpellAbility abMana = (SpellAbility) runParams.get("AbilityMana"); final SpellAbility abMana = (SpellAbility) runParams.get(AbilityKey.AbilityMana);
if (null != abMana && null != abMana.getManaPart()) { if (null != abMana && null != abMana.getManaPart()) {
abMana.setUndoable(false); abMana.setUndoable(false);
} }
@@ -562,7 +575,7 @@ public class TriggerHandler {
SpellAbility sa = null; SpellAbility sa = null;
Card host = regtrig.getHostCard(); Card host = regtrig.getHostCard();
final Card trigCard = regtrig.getRunParams().containsKey("Card") ? (Card)regtrig.getRunParams().get("Card") : null; final Card trigCard = (Card) regtrig.getFromRunParams(AbilityKey.Card);
if (trigCard != null && (host.getId() == trigCard.getId())) { if (trigCard != null && (host.getId() == trigCard.getId())) {
host = trigCard; host = trigCard;
@@ -735,8 +748,8 @@ public class TriggerHandler {
} }
} else if (kw.startsWith("Dieharmonicon")) { } else if (kw.startsWith("Dieharmonicon")) {
// 700.4. The term dies means "is put into a graveyard from the battlefield." // 700.4. The term dies means "is put into a graveyard from the battlefield."
if (runParams.get(AbilityKey.Destination) instanceof String) { if (runParams.get(AbilityKey.Origin) instanceof String) {
final String origin = (String) runParams.get(AbilityKey.Destination); final String origin = (String) runParams.get(AbilityKey.Origin);
if ("Battlefield".equals(origin) && runParams.get(AbilityKey.Destination) instanceof String) { if ("Battlefield".equals(origin) && runParams.get(AbilityKey.Destination) instanceof String) {
final String dest = (String) runParams.get(AbilityKey.Destination); final String dest = (String) runParams.get(AbilityKey.Destination);
if ("Graveyard".equals(dest) && runParams.get(AbilityKey.Card) instanceof Card) { if ("Graveyard".equals(dest) && runParams.get(AbilityKey.Card) instanceof Card) {

View File

@@ -60,7 +60,7 @@ public class TriggerInvestigated extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */

View File

@@ -52,7 +52,7 @@ public class TriggerLandPlayed extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -74,8 +74,7 @@ public class TriggerLifeGained extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount")); sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
} }
@Override @Override

View File

@@ -71,8 +71,7 @@ public class TriggerLifeLost extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.LifeAmount, this.getRunParams().get("LifeAmount")); sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
} }
@Override @Override

View File

@@ -39,7 +39,7 @@ public class TriggerLosesGame extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -70,8 +70,7 @@ public class TriggerPayCumulativeUpkeep extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.PayingMana);
sa.setTriggeringObject(AbilityKey.PayingMana, this.getRunParams().get("PayingMana"));
} }
@Override @Override

View File

@@ -70,7 +70,7 @@ public class TriggerPayEcho extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -61,8 +61,7 @@ public class TriggerPayLife extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount")); sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player);
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
} }
@Override @Override

View File

@@ -60,7 +60,7 @@ public class TriggerPhase extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -28,7 +28,7 @@ public class TriggerPhaseIn extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -36,7 +36,7 @@ public class TriggerPhaseOut extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -56,7 +56,7 @@ public class TriggerPlanarDice extends Trigger {
*/ */
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -53,7 +53,7 @@ public class TriggerPlaneswalkedFrom extends Trigger {
*/ */
@Override @Override
public void setTriggeringObjects(final SpellAbility sa) { public void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards")); sa.setTriggeringObjectsFrom(this, AbilityKey.Cards);
} }
@Override @Override

View File

@@ -53,7 +53,7 @@ public class TriggerPlaneswalkedTo extends Trigger {
*/ */
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards")); sa.setTriggeringObjectsFrom(this, AbilityKey.Cards);
} }
@Override @Override

View File

@@ -68,8 +68,7 @@ public class TriggerRegenerated extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Cause);
sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause"));
} }
@Override @Override

View File

@@ -32,7 +32,7 @@ public class TriggerRevealed extends Trigger {
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -126,7 +126,7 @@ public class TriggerSacrificed extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -62,7 +62,7 @@ public class TriggerScry extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -74,7 +74,7 @@ public class TriggerSearchedLibrary extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -77,7 +77,7 @@ public class TriggerSetInMotion extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme")); sa.setTriggeringObjectsFrom(this, AbilityKey.Scheme);
} }
@Override @Override

View File

@@ -74,7 +74,7 @@ public class TriggerShuffled extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -264,17 +264,20 @@ public class TriggerSpellAbilityCast extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
final SpellAbility castSA = (SpellAbility) getRunParams().get("CastSA"); final SpellAbility castSA = (SpellAbility) getFromRunParams(AbilityKey.CastSA);
final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(castSA); final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(castSA);
sa.setTriggeringObject(AbilityKey.Card, castSA.getHostCard()); sa.setTriggeringObject(AbilityKey.Card, castSA.getHostCard());
sa.setTriggeringObject(AbilityKey.SpellAbility, castSA); sa.setTriggeringObject(AbilityKey.SpellAbility, castSA);
sa.setTriggeringObject(AbilityKey.StackInstance, si); sa.setTriggeringObject(AbilityKey.StackInstance, si);
sa.setTriggeringObject(AbilityKey.SpellAbilityTargetingCards, (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards()); sa.setTriggeringObject(AbilityKey.SpellAbilityTargetingCards, (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards());
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); sa.setTriggeringObjectsFrom(
sa.setTriggeringObject(AbilityKey.Activator, getRunParams().get("Activator")); this,
sa.setTriggeringObject(AbilityKey.CurrentStormCount, getRunParams().get("CurrentStormCount")); AbilityKey.Player,
sa.setTriggeringObject(AbilityKey.CurrentCastSpells, getRunParams().get("CurrentCastSpells")); AbilityKey.Activator,
sa.setTriggeringObject(AbilityKey.CastSACMC, getRunParams().get("CastSACMC")); AbilityKey.CurrentStormCount,
AbilityKey.CurrentCastSpells,
AbilityKey.CastSACMC
);
} }
@Override @Override

View File

@@ -91,7 +91,7 @@ public class TriggerSpellAbilityCopy extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
final SpellAbility copySA = (SpellAbility) getRunParams().get("CopySA"); final SpellAbility copySA = (SpellAbility) getFromRunParams(AbilityKey.CopySA);
final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(copySA); final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(copySA);
sa.setTriggeringObject(AbilityKey.Card, copySA.getHostCard()); sa.setTriggeringObject(AbilityKey.Card, copySA.getHostCard());
sa.setTriggeringObject(AbilityKey.SpellAbility, copySA); sa.setTriggeringObject(AbilityKey.SpellAbility, copySA);

View File

@@ -56,7 +56,7 @@ public class TriggerSurveil extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */

View File

@@ -78,7 +78,7 @@ public class TriggerTaps extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -105,9 +105,7 @@ public class TriggerTapsForMana extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player, AbilityKey.Produced);
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Produced, this.getRunParams().get("Produced"));
} }
@Override @Override

View File

@@ -59,7 +59,7 @@ public class TriggerTransformed extends Trigger {
*/ */
@Override @Override
public void setTriggeringObjects(SpellAbility sa) { public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Transformer, this.getRunParams().get("Transformer")); sa.setTriggeringObjectsFrom(this, AbilityKey.Transformer);
} }
@Override @Override

View File

@@ -21,7 +21,7 @@ public class TriggerTurnBegin extends Trigger {
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); sa.setTriggeringObjectsFrom(this, AbilityKey.Player);
} }
@Override @Override

View File

@@ -61,7 +61,7 @@ public class TriggerTurnFaceUp extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -73,8 +73,7 @@ public class TriggerUnattach extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Object, getRunParams().get("Object")); sa.setTriggeringObjectsFrom(this, AbilityKey.Object, AbilityKey.Attach);
sa.setTriggeringObject(AbilityKey.Attach, getRunParams().get("Attach"));
} }
@Override @Override

View File

@@ -67,7 +67,7 @@ public class TriggerUntaps extends Trigger {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); sa.setTriggeringObjectsFrom(this, AbilityKey.Card);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ package forge.game.trigger;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import forge.game.ability.AbilityKey; import forge.game.ability.AbilityKey;
@@ -65,8 +64,13 @@ public class TriggerVote extends Trigger {
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa) { public final void setTriggeringObjects(final SpellAbility sa) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final ListMultimap<Object, Player> votes = (ArrayListMultimap<Object, Player>) this.getRunParams().get("AllVotes"); FCollection<Player> voters = getVoters(
sa.setTriggeringObject(AbilityKey.OtherVoters, getVoters(this.getHostCard().getController(), votes, true, true)); this.getHostCard().getController(),
(ListMultimap<Object, Player>) getFromRunParams(AbilityKey.AllVotes),
true,
true
);
sa.setTriggeringObject(AbilityKey.OtherVoters, voters);
} }
@Override @Override

View File

@@ -659,7 +659,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
public void fizzleTriggersOnStackTargeting(Card c, TriggerType t) { public void fizzleTriggersOnStackTargeting(Card c, TriggerType t) {
for (SpellAbilityStackInstance si : stack) { for (SpellAbilityStackInstance si : stack) {
SpellAbility sa = si.getSpellAbility(false); SpellAbility sa = si.getSpellAbility(false);
if (sa.getTriggeringObjects().containsKey("Target") && sa.getTriggeringObjects().get("Target").equals(c)) { if (sa.getTriggeringObjects().containsKey(AbilityKey.Target) && sa.getTriggeringObjects().get(AbilityKey.Target).equals(c)) {
if (sa instanceof WrappedAbility) { if (sa instanceof WrappedAbility) {
WrappedAbility wi = (WrappedAbility)sa; WrappedAbility wi = (WrappedAbility)sa;
if (wi.getTrigger().getMode() == t) { if (wi.getTrigger().getMode() == t) {

View File

@@ -28,6 +28,7 @@ import forge.sound.SoundSystem;
import forge.toolbox.*; import forge.toolbox.*;
import forge.util.Callback; import forge.util.Callback;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.Localizer;
import forge.util.Utils; import forge.util.Utils;
import java.util.ArrayList; import java.util.ArrayList;
@@ -96,6 +97,8 @@ public class Forge implements ApplicationListener {
textureFiltering = prefs.getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING); textureFiltering = prefs.getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING);
final Localizer localizer = Localizer.getInstance();
//load model on background thread (using progress bar to report progress) //load model on background thread (using progress bar to report progress)
FThreads.invokeInBackgroundThread(new Runnable() { FThreads.invokeInBackgroundThread(new Runnable() {
@Override @Override
@@ -106,13 +109,13 @@ public class Forge implements ApplicationListener {
FModel.initialize(splashScreen.getProgressBar(), null); FModel.initialize(splashScreen.getProgressBar(), null);
splashScreen.getProgressBar().setDescription("Loading fonts..."); splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingFonts"));
FSkinFont.preloadAll(); FSkinFont.preloadAll();
splashScreen.getProgressBar().setDescription("Loading card translations..."); splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingCardTranslations"));
CardTranslation.preloadTranslation(prefs.getPref(FPref.UI_LANGUAGE)); CardTranslation.preloadTranslation(prefs.getPref(FPref.UI_LANGUAGE));
splashScreen.getProgressBar().setDescription("Finishing startup..."); splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup"));
Gdx.app.postRunnable(new Runnable() { Gdx.app.postRunnable(new Runnable() {
@Override @Override
@@ -248,11 +251,16 @@ public class Forge implements ApplicationListener {
} }
} }
}; };
final Localizer localizer = Localizer.getInstance();
if (silent) { if (silent) {
callback.run(true); callback.run(true);
} }
else { else {
FOptionPane.showConfirmDialog("Are you sure you wish to restart Forge?", "Restart Forge", "Restart", "Cancel", callback); FOptionPane.showConfirmDialog(
localizer.getMessage("lblAreYouSureYouWishRestartForge"), localizer.getMessage("lblRestartForge"),
localizer.getMessage("lblRestart"), localizer.getMessage("lblCancel"), callback);
} }
} }
@@ -268,11 +276,16 @@ public class Forge implements ApplicationListener {
} }
} }
}; };
final Localizer localizer = Localizer.getInstance();
if (silent) { if (silent) {
callback.run(true); callback.run(true);
} }
else { else {
FOptionPane.showConfirmDialog("Are you sure you wish to exit Forge?", "Exit Forge", "Exit", "Cancel", callback); FOptionPane.showConfirmDialog(
localizer.getMessage("lblAreYouSureYouWishExitForge"), localizer.getMessage("lblExitForge"),
localizer.getMessage("lblExit"), localizer.getMessage("lblCancel"), callback);
} }
} }

View File

@@ -355,111 +355,107 @@ public class FSkinFont {
//generate from zh-CN.properties,and cardnames-zh-CN.txt //generate from zh-CN.properties,and cardnames-zh-CN.txt
//forge generate 3000+ characters cache need Take some time(MIN_FONT_SIZE - MAX_FONT_SIZE all size) //forge generate 3000+ characters cache need Take some time(MIN_FONT_SIZE - MAX_FONT_SIZE all size)
//maybe using libgdx-hiero generate font cache is better //maybe using libgdx-hiero generate font cache is better
chars += "·âéöû—“”•−●、。「」『』一丁七万三!(),/:;?~鼹鼻齐齑" chars += "●、。「」『』一丁七万三上下不与丑专且世丘业丛东丝两严丧个中"
+ "上下不与丑专且世丘业丛东丝两严丧个中丰临丸丹为丽举乃久么义" + "丰临丸丹为丽举乃久么义之乌乍乐乔乖乘乙九也乡书乱乳乾了予争"
+ "之乌乍乐乔乖乘乙九也乡书乱乳乾了予争事二于云互五井亘亚些亡" + "事二于云互五井亘亚些亡交亥亦产享京亮亲亵人亿什仁仅仆仇今介仍"
+ "交亥亦产享京亮亲亵人亿什仁仅仆仇今介仍从仑仓仕他仗付仙代令" + "从仑仓仕他仗付仙代令以仪们仰仲件价任份仿伊伍伏伐休众优伙会伟"
+ "以仪们仰仲件价任份仿伊伍伏伐休众优伙会伟传伤伦伪伯伴伶伺似" + "传伤伦伪伯伴伶伺似伽但位低住佐佑体何余佚佛作你佣佩佳使例侍侏"
+ "伽但位低住佐佑体何余佚佛作你佣佩佳使例侍侏供依侠侣侦侧侬侮" + "供依侠侣侦侧侬侮侯侵便促俄俊俐俑俘保信修俯俸個倍倒候借倡倦倨"
+ "侯侵便促俄俊俐俑俘保信修俯俸個倍倒候借倡倦倨倪债值倾假偏做" + "倪债值倾假偏做停偶偷偿傀傍储催傲像僧僭僵僻儒儡儿兀允元充兆先"
+ "停偶偷偿傀傍储催傲像僧僭僵僻儒儡儿兀允元充兆先光克免兔兕党" + "光克免兔兕党入全八公六兰共关兴兵其具典兹养兼兽内册再冒冕写军"
+ "入全八公六兰共关兴兵其具典兹养兼兽内册再冒冕写军农冠冢冥冬" + "农冠冢冥冬冰冲决况冶冷冻净准凋凌减凑凛凝几凡凤凭凯凰凶出击凿"
+ "冰冲决况冶冷冻净准凋凌减凑凛凝几凡凤凭凯凰凶出击凿刀刃分切" + "刀刃分切刈刍刑划列则刚创初删判利别刮到制刷刹刺刻刽剂剃削剌前"
+ "刈刍刑划列则刚创初删判利别刮到制刷刹刺刻刽剂剃削剌前剎剑剖" + "剎剑剖剜剥剧剩剪副割剽劈力劝办功加务劣动助努劫励劲劳势勃勇勉"
+ "剜剥剧剩剪副割剽劈力劝办功加务劣动助努劫励劲劳势勃勇勉勋勒" + "勋勒勘募勤勾包匍匐匕化北匙匠匪匹区医匿十千升午半华协卑卒卓单"
+ "勘募勤勾包匍匐匕化北匙匠匪匹区医匿十千升午半华协卑卒卓单卖" + "卖南博卜占卡卢卦卫印危即却卵卷卸厂厄厅历厉压厚原厢厥厦厨去参"
+ "南博卜占卡卢卦卫印危即却卵卷卸厂厄厅历厉压厚原厢厥厦厨去参" + "叉及友双反发叔取受变叙叛叠口古句另叨只叫召叮可台史右叶号司叹"
+ "叉及友双反发叔取受变叙叛叠口古句另叨只叫召叮可台史右叶号司" + "吁吃各合吉吊同名后吏吐向吓吕吗君吞吟否含听吮启吱吸吹吻吼呆告"
+ "叹吁吃各合吉吊同名后吏吐向吓吕吗君吞吟否含听吮启吱吸吹吻吼" + "呕员周味呼命咆和咏咒咕咬咯咳咽哀品哈响哑哗哥哨哩哪哭哮哲哺唐"
+ "呆告呕员周味呼命咆和咏咒咕咬咯咳咽哀品哈响哑哗哥哨哩哪哭哮" + "唤售唯唱啃啄商啜啪啮啸喀喂善喉喊喋喘喙喜喝喧喷嗅嗔嗜嗡嗣嗫嘉"
+ "哲哺唐唤售唯唱啃啄商啜啪啮啸喀喂善喉喊喋喘喙喜喝喧喷嗅嗔嗜" + "嘎嘘嘲嘴嘶噜噤器噬嚎嚼囊囚四回因团囤园困围固国图圆圈團土圣在"
+ "嗡嗣嗫嘉嘎嘘嘲嘴嘶噜噤器噬嚎嚼囊囚四回因团囤园困围固国图圆" + "地场圾均坊坍坎坏坐坑块坚坛坝坞坟坠坤坦坪坷垂垃型垒垛垠垢垣垦"
+ "圈團土圣在地场圾均坊坍坎坏坐坑块坚坛坝坞坟坠坤坦坪坷垂垃型" + "埃埋城域培基堂堆堕堡堤堪堰塌塑塔塘塞填境墓墙增墟墨壁壅壕壤士"
+ "垒垛垠垢垣垦埃埋城域培基堂堆堕堡堤堪堰塌塑塔塘塞填境墓墙增" + "壬壮声壳壶处备复夏外多夜够大天太夫央失头夷夸夹夺奇奈奉奋奎契"
+ "墟墨壁壅壕壤士壬壮声壳壶处备复夏外多夜够大天太夫央失头夷夸" + "奔奖套奢奥女奴她好如妃妄妆妇妈妖妙妥妪妮妲妹姆姊始姓姜姥姬姿"
+ "夹夺奇奈奉奋奎契奔奖套奢奥女奴她好如妃妄妆妇妈妖妙妥妪妮妲" + "威娃娅娜婆婉婪婶媒嫁嫩嬉子孑孔孕字存孚孢季孤学孪孳孵孽宁它宅"
+ "妹姆姊始姓姜姥姬姿威娃娅娜婆婉婪婶媒嫁嫩嬉子孑孔孕字存孚孢" + "宇守安完宏宗官宙定宜宝实宠审客宣室宪宫宰害宴家容宾宿寂寄密寇"
+ "季孤学孪孳孵孽宁它宅宇守安完宏宗官宙定宜宝实宠审客宣室宪宫" + "富寒寓寝察寡寨寰寸对寺寻导封射将尉尊小少尔尖尘尚尝尤尬就尸尹"
+ "宰害宴家容宾宿寂寄密寇富寒寓寝察寡寨寰寸对寺寻导封射将尉尊" + "尺尼尽尾局层居屈屋屏屑展属屠履屯山屹岁岑岔岖岗岚岛岩岱岳岸峡"
+ "小少尔尖尘尚尝尤尬就尸尹尺尼尽尾局层居屈屋屏屑展属屠履屯山" + "峭峰峻崇崎崔崖崩崽嵌巅巍川巡巢工左巧巨巫差己已巳巴巷币市布帅"
+ "屹岁岑岔岖岗岚岛岩岱岳岸峡峭峰峻崇崎崔崖崩崽嵌巅巍川巡巢工" + "帆师希帕帖帘帜帝带席帮帷常帽幅幔幕干平年并幸幻幼幽广庄庆庇床"
+ "左巧巨巫差己已巳巴巷币市布帅帆师希帕帖帘帜帝带席帮帷常帽幅" + "序库应底店庙府庞废度座庭庶廉廊延建开异弃弄弊式弑弓引弗弘弟张"
+ "幔幕干平年并幸幻幼幽广庄庆庇床序库应底店庙府庞废度座庭庶廉" + "弥弦弧弩弯弱張弹强归当录彗形彩彰影役彻彼往征径待很徊律後徒徕"
+ "廊延建开异弃弄弊式弑弓引弗弘弟张弥弦弧弩弯弱張弹强归当录彗" + "得徘徙從御復循微徵德徽心必忆忌忍忒志忘忠忧快忱念忽忾忿怀态怒"
+ "形彩彰影役彻彼往征径待很徊律後徒徕得徘徙從御復循微徵德徽心" + "怖思急性怨怪怯总恍恐恒恕恢恣恨恩恫息恰恳恶恸恼悉悍悔悖悟患悦"
+ "必忆忌忍忒志忘忠忧快忱念忽忾忿怀态怒怖思急性怨怪怯总恍恐恒" + "您悬悯悲悼情惊惑惘惚惠惧惨惩惫惰想惹愁愈愎意愚感愣愤愧愿慈慌"
+ "恕恢恣恨恩恫息恰恳恶恸恼悉悍悔悖悟患悦您悬悯悲悼情惊惑惘惚" + "慎慑慕慢慧慨慰慷憎憩懦戈戏成我戒戕或战戟截戮戳戴户戾房所扁扇"
+ "惠惧惨惩惫惰想惹愁愈愎意愚感愣愤愧愿慈慌慎慑慕慢慧慨慰慷憎" + "扈手才扎扑扒打托扣执扩扫扬扭扮扯扰找承技抄抉把抑抓投抖抗折抚"
+ "憩懦戈戏成我戒戕或战戟截戮戳戴户戾房所扁扇扈手才扎扑扒打托" + "抛抢护报披抱抵抹押抽拂拆拉拍拒拓拔拖拘招拜拟拣拥拦拧拨择括拯"
+ "扣执扩扫扬扭扮扯扰找承技抄抉把抑抓投抖抗折抚抛抢护报披抱抵" + "拱拳拷拼拽拾拿持挂指按挑挖挚挟挠挡挣挥挪挫振挺挽捆捉捍捕捞损"
+ "抹押抽拂拆拉拍拒拓拔拖拘招拜拟拣拥拦拧拨择括拯拱拳拷拼拽拾" + "换捣捧据捷捻掀授掉掌掐排掘掠探接控推掩措掮掳掷揍描提插握揭援"
+ "拿持挂指按挑挖挚挟挠挡挣挥挪挫振挺挽捆捉捍捕捞损换捣捧据捷" + "揽搁搅搏搐搜搞搬搭携摄摆摇摘摧摩摸摹撒撕撞撤撬播撵撼擅操擎擒"
+ "捻掀授掉掌掐排掘掠探接控推掩措掮掳掷揍描提插握揭援揽搁搅搏" + "擞擦攀攫支收改攻放政故效敌敏救敕教敞敢散敦敬数敲整文斐斑斓斗"
+ "搐搜搞搬搭携摄摆摇摘摧摩摸摹撒撕撞撤撬播撵撼擅操擎擒擞擦攀" + "斤斥斧斩断斯新方施旁旅旋族旗无既日旧旨早旭时旷旸旺昂昆昌明昏"
+ "攫支收改攻放政故效敌敏救敕教敞敢散敦敬数敲整文斐斑斓斗斤斥" + "易昔昙星映春昨昭是昵昼显晃晋晓晕晖晚晨普景晰晴晶晷智暂暗暮暴"
+ "斧斩断斯新方施旁旅旋族旗无既日旧旨早旭时旷旸旺昂昆昌明昏易" + "曙曜曝曦曲曳更曼曾替最月有服朗望朝期木未末本札术朵机朽杀杂权"
+ "昔昙星映春昨昭是昵昼显晃晋晓晕晖晚晨普景晰晴晶晷智暂暗暮暴" + "杉李村杖杜束条来杨杯杰松板极构析林枚果枝枢枪枭枯架枷柄柏某染"
+ "曙曜曝曦曲曳更曼曾替最月有服朗望朝期木未末本札术朵机朽杀杂" + "柜查柩柯柱柳栅标栈栋栏树栓栖栗株样核根格栽桂框案桌桎桑桓桠档"
+ "权杉李村杖杜束条来杨杯杰松板极构析林枚果枝枢枪枭枯架枷柄柏" + "桥桨桩桶梁梅梓梢梣梦梧梨梭梯械检棄棍棒棕棘棚森棱棺椁植椎椒椽"
+ "某染柜查柩柯柱柳栅标栈栋栏树栓栖栗株样核根格栽桂框案桌桎桑" + "楂楔楚楣楼概榄榆榔榨榴槌槛模横樱樵橇橡橫檀檐次欢欣欧欲欺歇歌"
+ "桓桠档桥桨桩桶梁梅梓梢梣梦梧梨梭梯械检棄棍棒棕棘棚森棱棺椁" + "止正此步武歪死歼殁殆殇殉殊残殍殒殓殖殡殴段殷殿毁毅母每毒比毕"
+ "植椎椒椽楂楔楚楣楼概榄榆榔榨榴槌槛模横樱樵橇橡橫檀檐次欢欣" + "毛毡氅氏民氓气氤氦氧氲水永汀汁求汇汉汐汗汛池污汤汨汪汰汲汹汽"
+ "欧欲欺歇歌止正此步武歪死歼殁殆殇殉殊残殍殒殓殖殡殴段殷殿毁" + "沃沈沉沌沐沙沟没沥沦沮河沸油治沼沾沿泄泉泊法泛泞泡波泣泥注泪"
+ "毅母每毒比毕毛毡氅氏民氓气氤氦氧氲水永汀汁求汇汉汐汗汛池污" + "泯泰泽洁洋洒洗洛洞津洪洲活洼派流浅浆浇浊测济浑浓浚浩浪浮浴海"
+ "汤汨汪汰汲汹汽沃沈沉沌沐沙沟没沥沦沮河沸油治沼沾沿泄泉泊法" + "浸涅消涉涌涎涛涟涡涤润涨涩液涵淋淘淤淬深混淹添清渊渎渐渔渗渝"
+ "泛泞泡波泣泥注泪泯泰泽洁洋洒洗洛洞津洪洲活洼派流浅浆浇浊测" + "渠渡渣渥温港渲渴游湍湖湛湮湾湿溃溅源溜溢溪溯溶溺滋滑滓滔滚滞"
+ "济浑浓浚浩浪浮浴海浸涅消涉涌涎涛涟涡涤润涨涩液涵淋淘淤淬深" + "满滤滥滨滴漂漏演漠漩漫潘潜潭潮澄澈澹激濑濒瀑瀚灌火灭灯灰灵灼"
+ "混淹添清渊渎渐渔渗渝渠渡渣渥温港渲渴游湍湖湛湮湾湿溃溅源溜" + "灾灿炉炎炙炫炬炭炮炸点炼炽烁烂烈烙烛烟烤烦烧烫烬热烽焉焊焚焦"
+ "溢溪溯溶溺滋滑滓滔滚滞满滤滥滨滴漂漏演漠漩漫潘潜潭潮澄澈澹" + "焰然煌煎煞煤照煮煽熄熊熏熔熟熠熵燃燎燕燧爆爪爬爱爵父片版牌牒"
+ "激濑濒瀑瀚灌火灭灯灰灵灼灾灿炉炎炙炫炬炭炮炸点炼炽烁烂烈烙" + "牙牛牝牡牢牦牧物牲牵特牺犀犁犄犧犬犯状狂狄狈狐狗狙狞狡狩独狭"
+ "烛烟烤烦烧烫烬热烽焉焊焚焦焰然煌煎煞煤照煮煽熄熊熏熔熟熠熵" + "狮狰狱狷狸狼猁猎猛猜猪猫献猴猿獒獠獾玄率玉王玖玛玩玫环现玷玻"
+ "燃燎燕燧爆爪爬爱爵父片版牌牒牙牛牝牡牢牦牧物牲牵特牺犀犁犄" + "珀珂珊珍珠班球理琉琐琥琳琴琵琼瑕瑙瑚瑞瑟瑰璃璞璧瓜瓣瓦瓮瓯瓶"
+ "犧犬犯状狂狄狈狐狗狙狞狡狩独狭狮狰狱狷狸狼猁猎猛猜猪猫献猴" + "瓷甘生用甩甫田由甲电画畅界畏留略畸畿疆疏疑疗疚疡疣疤疫疮疯疲"
+ "猿獒獠獾玄率玉王玖玛玩玫环现玷玻珀珂珊珍珠班球理琉琐琥琳琴" + "疵疹疽疾病症痕痛痞痢痨痪痴痹瘟瘠瘤瘫瘴癣癫癸登白百的皆皇皈皮"
+ "琵琼瑕瑙瑚瑞瑟瑰璃璞璧瓜瓣瓦瓮瓯瓶瓷甘生用甩甫田由甲电画畅" + "皱皿盆盈盐监盒盔盖盗盘盛盟目盲直相盾省看真眠眨眩眷眺眼着睁睡"
+ "界畏留略畸畿疆疏疑疗疚疡疣疤疫疮疯疲疵疹疽疾病症痕痛痞痢痨" + "督睥睨睿瞄瞒瞥瞪瞬瞭瞰瞳矛矢知矫短矮石矾矿码砂砍研砖砦砧破砸"
+ "痪痴痹瘟瘠瘤瘫瘴癣癫癸登白百的皆皇皈皮皱皿盆盈盐监盒盔盖盗" + "砾础硕硫硬确碍碎碑碟碧碰碳碻碾磁磊磨磷磺礁示礼社祀祈祖祝神祟"
+ "盘盛盟目盲直相盾省看真眠眨眩眷眺眼着睁睡督睥睨睿瞄瞒瞥瞪瞬" + "祠祥票祭祷祸禁禄福离禽私秃秉秋种科秘秣秤秩积称移秽稀程税稚稳"
+ "瞭瞰瞳矛矢知矫短矮石矾矿码砂砍研砖砦砧破砸砾础硕硫硬确碍碎" + "稻穆穗穴究穷穹空穿突窃窍窒窖窗窘窜窝窟窥立竖站竞章童竭端竹笏"
+ "碑碟碧碰碳碻碾磁磊磨磷磺礁示礼社祀祈祖祝神祟祠祥票祭祷祸禁" + "笑笔笛笞符第笼等筑筒答策筛筝筹签简箔算箝管箭箱篓篮篱篷簇簧簪"
+ "禄福离禽私秃秉秋种科秘秣秤秩积称移秽稀程税稚稳稻穆穗穴究穷" + "米类粉粒粗粮粹精糊糙糟系素索紧紫累繁纂纠红约级纪纬纯纱纳纵纷"
+ "穹空穿突窃窍窒窖窗窘窜窝窟窥立竖站竞章童竭端竹笏笑笔笛笞符" + "纸纹纺纽线练组绅细织终绊绍经绒结绕绘给绚络绝绞统绥继绩绪续绮"
+ "第笼等筑筒答策筛筝筹签简箔算箝管箭箱篓篮篱篷簇簧簪米类粉粒" + "绯绳维绵综绽绿缀缄缅缆缇缉缎缓缕编缘缚缝缠缩缪缰缸缺罅网罔罗"
+ "粗粮粹精糊糙糟系素索紧紫累繁纂纠红约级纪纬纯纱纳纵纷纸纹纺" + "罚罡罩罪置羁羊美羚羞群羽翁翅翎翔翠翡翰翱翻翼耀老考者而耍耐耕"
+ "纽线练组绅细织终绊绍经绒结绕绘给绚络绝绞统绥继绩绪续绮绯绳" + "耗耘耙耳耶职联聚聪肃肆肇肉肌肖肝肠肢肤肥肩肯育肴肺肿胀胁胃胆"
+ "维绵综绽绿缀缄缅缆缇缉缎缓缕编缘缚缝缠缩缪缰缸缺罅网罔罗罚" + "背胎胖胜胞胡胧胫胶胸能脂脆脉脊脏脑脓脚脱脸腐腔腕腥腱腹腾腿膂"
+ "罡罩罪置羁羊美羚羞群羽翁翅翎翔翠翡翰翱翻翼耀老考者而耍耐耕" + "膏膛膜膝臂臃臣自臭至致舌舍舒舞舟航般舰舱船艇良艰色艺艾节芒芙"
+ "耗耘耙耳耶职联聚聪肃肆肇肉肌肖肝肠肢肤肥肩肯育肴肺肿胀胁胃" + "芜芥芬芭芮花芳芽苇苍苏苔苗苛苜苟若苦英茁茂范茉茎茜茧茨茫茸荆"
+ "胆背胎胖胜胞胡胧胫胶胸能脂脆脉脊脏脑脓脚脱脸腐腔腕腥腱腹腾" + "草荒荚荡荣荨荫药荷莉莎莓莫莱莲莳获莽菁菇菊菌菜菲萃萌萍萎萝营"
+ "腿膂膏膛膜膝臂臃臣自臭至致舌舍舒舞舟航般舰舱船艇良艰色艺艾" + "萦萧萨萼落著葛葬葵蒂蒙蒸蓄蓑蓝蓟蓿蔑蔓蔚蔷蔻蔽蕈蕊蕨蕴蕾薄薇"
+ "节芒芙芜芥芬芭芮花芳芽苇苍苏苔苗苛苜苟若苦英茁茂范茉茎茜茧" + "薙薪藏藐藓藤藻虎虏虐虑虔虚虫虱虹蚀蚁蚊蚋蚣蚺蛆蛇蛊蛋蛎蛙蛛蛞"
+ "茨茫茸荆草荒荚荡荣荨荫药荷莉莎莓莫莱莲莳获莽菁菇菊菌菜菲萃" + "蛭蛮蛰蛸蛾蜂蜈蜉蜒蜕蜗蜘蜜蜡蜥蜴蜷蜿蝇蝎蝓蝗蝙蝠蝣蝾螂螅融螫"
+ "萌萍萎萝营萦萧萨萼落著葛葬葵蒂蒙蒸蓄蓑蓝蓟蓿蔑蔓蔚蔷蔻蔽蕈" + "螳螺蟀蟋蟑蟒蟹蠕蠢血行衍街衡衣补表衫衰袂袋袍袖被袭裁裂装裔裘"
+ "蕊蕨蕴蕾薄薇薙薪藏藐藓藤藻虎虏虐虑虔虚虫虱虹蚀蚁蚊蚋蚣蚺蛆" + "褐褛褪褫褴褶襄西要覆见观规觅视览觉觊角解触言詹誉誓警计认讧讨"
+ "蛇蛊蛋蛎蛙蛛蛞蛭蛮蛰蛸蛾蜂蜈蜉蜒蜕蜗蜘蜜蜡蜥蜴蜷蜿蝇蝎蝓蝗" + "让训议讯记讲许论讽设访诀证评诅识诈诉词试诗诘诚诛话诞诡该详诫"
+ "蝙蝠蝣蝾螂螅融螫螳螺蟀蟋蟑蟒蟹蠕蠢血行衍街衡衣补表衫衰袂袋" + "语误诱诲说诵请诸诺读调谆谈谊谋谍谐谕谗谜谟谢谣谦谧谨谬谭谱谴"
+ "袍袖被袭裁裂装裔裘褐褛褪褫褴褶襄西要覆见观规觅视览觉觊角解" + "谵谷豁象豪豹豺貂貌贝贞负贡财责贤败货质贩贪贫贬购贮贯贱贴贵贷"
+ "触言詹誉誓警计认讧讨让训议讯记讲许论讽设访诀证评诅识诈诉词" + "贸费贺贼贾贿赂赃资赋赌赎赏赐赖赘赛赞赠赢赤赦赫走赶起超越趋足"
+ "试诗诘诚诛话诞诡该详诫语误诱诲说诵请诸诺读调谆谈谊谋谍谐谕" + "跃跑跖跚跛距跟跨路跳践跺踏踝踢踩踪踵踽蹂蹄蹊蹋蹒蹦蹬躁躏身躯"
+ "谗谜谟谢谣谦谧谨谬谭谱谴谵谷豁象豪豹豺貂貌贝贞负贡财责贤败" + "躲車车轨轩转轭轮软轰轴轻载较辉辑输辖辗辙辛辜辞辟辨辩辫辰辱边"
+ "货质贩贪贫贬购贮贯贱贴贵贷贸费贺贼贾贿赂赃资赋赌赎赏赐赖赘" + "达迁迂迅过迈迎运近返还这进远违连迟迦迩迪迫迭述迳迷迸迹追退送"
+ "赛赞赠赢赤赦赫走赶起超越趋足跃跑跖跚跛距跟跨路跳践跺踏踝踢" + "适逃逆选逊透逐递途通逝逞速造逢逮逸逻逼遁遇遍遏道遗遣遥遨遭遮"
+ "踩踪踵踽蹂蹄蹊蹋蹒蹦蹬躁躏身躯躲車车轨轩转轭轮软轰轴轻载较" + "避邀還那邦邪邬邸郊郎部都鄙酋配酒酬酷酸酿醉醒采釉释里重野量金"
+ "辉辑输辖辗辙辛辜辞辟辨辩辫辰辱边达迁迂迅过迈迎运近返还这进" + "鉴针钉钓钗钙钜钝钟钢钥钦钨钩钮钯钱钳钵钻钽铁铃铅铎铜铠铬铭铲"
+ "远违连迟迦迩迪迫迭述迳迷迸迹追退送适逃逆选逊透逐递途通逝逞" + "银铸铺链销锁锄锅锈锋锐错锡锢锤锥锦锭键锯锻镇镖镜镬镰镶长間闇"
+ "速造逢逮逸逻逼遁遇遍遏道遗遣遥遨遭遮避邀還那邦邪邬邸郊郎部" + "门闩闪闭问闯闲间闷闸闹闻阀阁阅队阱防阳阴阵阶阻阿陀附际陆陋降"
+ "都鄙酋配酒酬酷酸酿醉醒采釉释里重野量金鉴针钉钓钗钙钜钝钟钢" + "限院除陨险陪陲陵陶陷隆随隐隔隘障隧隶隼难雀雄雅集雇雏雕雨雪雯"
+ "钥钦钨钩钮钯钱钳钵钻钽铁铃铅铎铜铠铬铭铲银铸铺链销锁锄锅锈" + "雳零雷雹雾需霆震霉霍霓霖霜霞霰露霸霹青靖静非靠靡面革靴靶鞍鞑"
+ "锋锐错锡锢锤锥锦锭键锯锻镇镖镜镬镰镶长間闇门闩闪闭问闯闲间" + "鞭韧音韵韶页顶项顺须顽顾顿颂预颅领颈颊题颚颜额颠颤风飒飓飘飙"
+ "闷闸闹闻阀阁阅队阱防阳阴阵阶阻阿陀附际陆陋降限院除陨险陪陲" + "飞食餍餐餮饕饥饭饮饰饱饵饶饿馆馈馐馑首香馨马驭驮驯驰驱驳驹驻"
+ "陵陶陷隆随隐隔隘障隧隶隼难雀雄雅集雇雏雕雨雪雯雳零雷雹雾需" + "驼驽驾驿骁骂骄骆骇验骏骐骑骗骚骤骨骰骷骸骼髅髓高鬃鬓鬣鬼魁魂"
+ "霆震霉霍霓霖霜霞霰露霸霹青靖静非靠靡面革靴靶鞍鞑鞭韧音韵韶" + "魄魅魇魈魏魔鰴鱼鲁鲜鲤鲨鲮鲸鲽鳃鳄鳍鳐鳗鳝鳞鸟鸠鸡鸢鸣鸦鸽鹅"
+ "页顶项顺须顽顾顿颂预颅领颈颊题颚颜额颠颤风飒飓飘飙飞食餍餐" + "鹉鹊鹏鹗鹞鹤鹦鹫鹭鹰鹿麋麒麟麦麻黄黎黏黑默黛黜點黠黯鼎鼓鼠鼬"
+ "餮饕饥饭饮饰饱饵饶饿馆馈馐馑首香馨马驭驮驯驰驱驳驹驻驼驽驾" + "鼹鼻齐齑齿龇龙龟!(),/:;?~";
+ "驿骁骂骄骆骇验骏骐骑骗骚骤骨骰骷骸骼髅髓高鬃鬓鬣鬼魁魂魄魅"
+ "魇魈魏魔鰴鱼鲁鲜鲤鲨鲮鲸鲽鳃鳄鳍鳐鳗鳝鳞鸟鸠鸡鸢鸣鸦鸽鹅鹉"
+ "鹊鹏鹗鹞鹤鹦鹫鹭鹰鹿麋麒麟麦麻黄黎黏黑默黛黜點黠黯鼎鼓鼠鼬"
+ "齿龇龙龟";
final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false);
final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); final FreeTypeFontParameter parameter = new FreeTypeFontParameter();

View File

@@ -272,13 +272,13 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
updateDeck(i);//TODO: Investigate why AI names cannot be overriden? updateDeck(i);//TODO: Investigate why AI names cannot be overriden?
updateName(i, getPlayerName(i)); updateName(i, getPlayerName(i));
} }
//set this so we cant get any multi/rapid tap on start button
Forge.setLoadingaMatch(true);
FThreads.invokeInBackgroundThread(new Runnable() { //must call startGame in background thread in case there are alerts FThreads.invokeInBackgroundThread(new Runnable() { //must call startGame in background thread in case there are alerts
@Override @Override
public void run() { public void run() {
final Runnable startGame = lobby.startGame(); final Runnable startGame = lobby.startGame();
if (startGame != null) { if (startGame != null) {
//set this so we cant get any multi/rapid tap on start button
Forge.setLoadingaMatch(true);
FThreads.invokeInEdtLater(new Runnable() { FThreads.invokeInEdtLater(new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@@ -3,9 +3,7 @@ ManaCost:2 U
Types:Enchantment Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a time counter on CARDNAME. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a time counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1
S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+NotSplit+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on CARDNAME. S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on CARDNAME.
S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+Split+nonLand+leftcmcLEX,Card.YouCtrl+Split+nonLand+rightcmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Secondary$ True
SVar:X:Count$CardCounters.TIME SVar:X:Count$CardCounters.TIME
SVar:AsForetoldSplitCMCHack:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/as_foretold.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/as_foretold.jpg
Oracle:At the beginning of your upkeep, put a time counter on As Foretold.\nOnce each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on As Foretold. Oracle:At the beginning of your upkeep, put a time counter on As Foretold.\nOnce each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on As Foretold.

View File

@@ -2,7 +2,7 @@ Name:Dark Petition
ManaCost:3 B B ManaCost:3 B B
Types:Sorcery Types:Sorcery
A:SP$ ChangeZone | Cost$ 3 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SubAbility$ DBMana | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. A:SP$ ChangeZone | Cost$ 3 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SubAbility$ DBMana | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}.
SVar:DBMana:DB$ Mana | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | Produced$ B | Amount$ 3 SVar:DBMana:DB$ Mana | ConditionCheckSVar$ X | References$ X | ConditionSVarCompare$ GE2 | Produced$ B | Amount$ 3
SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn
#TODO: Improve the tutoring logic for the AI. Currently will generally look for the most expensive castable thing in the library (which can, of course, be used to advantage in properly constructed AI decks). #TODO: Improve the tutoring logic for the AI. Currently will generally look for the most expensive castable thing in the library (which can, of course, be used to advantage in properly constructed AI decks).
AI:RemoveDeck:Random AI:RemoveDeck:Random

View File

@@ -1,6 +1,6 @@
Name:Endless Atlas Name:Endless Atlas
ManaCost:2 ManaCost:2
Types:Artifact Types:Artifact
A:AB$ Draw | Cost$ 2 T | CheckSvar$ X | SVarCompare$ GE3 | References$ X | SpellDescription$ Draw a card. Activate this ability only if you control three or more lands with the same name. A:AB$ Draw | Cost$ 2 T | CheckSVar$ X | SVarCompare$ GE3 | References$ X | SpellDescription$ Draw a card. Activate this ability only if you control three or more lands with the same name.
SVar:X:Count$MostCardName Land.YouCtrl SVar:X:Count$MostCardName Land.YouCtrl
Oracle:2, T: Draw a card. Activate this ability only if you control three or more lands with the same name. Oracle:2, T: Draw a card. Activate this ability only if you control three or more lands with the same name.

View File

@@ -3,5 +3,4 @@ ManaCost:1 U U
Types:Instant Types:Instant
A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target nonCreature Spell | ValidTgts$ Card.nonCreature | Destination$ Exile | SpellDescription$ Counter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd. A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target nonCreature Spell | ValidTgts$ Card.nonCreature | Destination$ Exile | SpellDescription$ Counter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd.
SVar:AltCost:Cost$ ExileFromHand<1/Card.Blue> | OpponentTurn$ True | Description$ If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost. SVar:AltCost:Cost$ ExileFromHand<1/Card.Blue> | OpponentTurn$ True | Description$ If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost.
Svar:Picture:http://mythicspoiler.com/mh1/cards/forceofnegation.jpg
Oracle:If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost.\nCounter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd. Oracle:If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost.\nCounter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd.

View File

@@ -4,13 +4,13 @@ Types:Artifact
A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Player.Opponent | IsCurse$ True | Chooser$ You | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ TotemEffect | SpellDescription$ Search target opponent's library for a card and exile it. Then that player shuffles their library. Until the beginning of your next upkeep, you may play that card. At the beginning of your next upkeep, if you haven't played it, put it into its owner's graveyard. | StackDescription$ SpellDescription A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Player.Opponent | IsCurse$ True | Chooser$ You | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ TotemEffect | SpellDescription$ Search target opponent's library for a card and exile it. Then that player shuffles their library. Until the beginning of your next upkeep, you may play that card. At the beginning of your next upkeep, if you haven't played it, put it into its owner's graveyard. | StackDescription$ SpellDescription
SVar:TotemEffect:DB$ Effect | StaticAbilities$ STGrinning | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration,TrigReturn,TrigLandPlayed,TrigCast | SVars$ DBDuration,ActiveTotem,RemoveEffect,DBReturn | SubAbility$ DBResetSVar SVar:TotemEffect:DB$ Effect | StaticAbilities$ STGrinning | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration,TrigReturn,TrigLandPlayed,TrigCast | SVars$ DBDuration,ActiveTotem,RemoveEffect,DBReturn | SubAbility$ DBResetSVar
# Even though the Effect is "Permanent", it's not really permanent # Even though the Effect is "Permanent", it's not really permanent
SVar:DBResetSVar:DB$ StoreSvar | SVar$ ActiveTotem | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup SVar:DBResetSVar:DB$ StoreSVar | SVar$ ActiveTotem | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:ActiveTotem:Number$1 SVar:ActiveTotem:Number$1
SVar:STGrinning:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActiveTotem | Description$ Until the beginning of your next upkeep, you may play that card. SVar:STGrinning:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActiveTotem | Description$ Until the beginning of your next upkeep, you may play that card.
# Turn off the duration at the beginning of the upkeep statically # Turn off the duration at the beginning of the upkeep statically
SVar:TrigDuration:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBDuration SVar:TrigDuration:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBDuration
SVar:DBDuration:DB$ StoreSvar | SVar$ ActiveTotem | Type$ Number | Expression$ 0 SVar:DBDuration:DB$ StoreSVar | SVar$ ActiveTotem | Type$ Number | Expression$ 0
# Return the card as a normal trigger # Return the card as a normal trigger
SVar:TrigReturn:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBReturn SVar:TrigReturn:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ RemoveEffect SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ RemoveEffect

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