diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index a69075a3342..ecf8f2f12fb 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -403,7 +403,7 @@ public class GameAction { if (copied.isAura() && !copied.isAttachedToEntity() && toBattlefield) { if (zoneFrom != null && zoneFrom.is(ZoneType.Stack) && game.getStack().isResolving(c)) { boolean found = false; - if (Iterables.any(game.getPlayers(),PlayerPredicates.canBeAttached(copied))) { + if (Iterables.any(game.getPlayers(), PlayerPredicates.canBeAttached(copied))) { found = true; } if (Iterables.any((CardCollectionView) params.get(AbilityKey.LastStateBattlefield), CardPredicates.canBeAttached(copied))) { @@ -815,7 +815,7 @@ public class GameAction { } else { c.setCastFrom(zoneFrom); } - if (cause != null && cause.isSpell() && c.equals(cause.getHostCard()) && !c.isCopiedSpell()) { + if (cause != null && cause.isSpell() && c.equals(cause.getHostCard())) { c.setCastSA(cause); } else { c.setCastSA(null); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 8ef8013dcaf..77f6105a80b 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1715,6 +1715,12 @@ public class AbilityUtils { return doXMath(root.getXManaCostPaid(), expr, c, ctb); } + // If the chosen creature has X in its mana cost, that X is considered to be 0. + // The value of X in Altered Ego’s last ability will be whatever value was chosen for X while casting Altered Ego. + if (sa.isCopiedTrait() && !sa.getHostCard().equals(c)) { + return doXMath(0, expr, c, ctb); + } + if (root.isTrigger()) { Trigger t = root.getTrigger(); if (t == null) { @@ -1755,16 +1761,8 @@ public class AbilityUtils { } } - // If the chosen creature has X in its mana cost, that X is considered to be 0. - // The value of X in Altered Ego’s last ability will be whatever value was chosen for X while casting Altered Ego. - if (sa.isCopiedTrait() || !sa.getHostCard().equals(c)) { - return doXMath(0, expr, c, ctb); - } - - if (root.isReplacementAbility()) { - if (sa.hasParam("ETB")) { - return doXMath(c.getXManaCostPaid(), expr, c, ctb); - } + if (root.isReplacementAbility() && sa.hasParam("ETB")) { + return doXMath(c.getXManaCostPaid(), expr, c, ctb); } return doXMath(0, expr, c, ctb); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 968a9544b11..b138ec0061c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1258,14 +1258,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final int getXManaCostPaid() { - SpellAbility castSA; - if (getCopiedPermanent() != null) { - castSA = getCopiedPermanent().getCastSA(); - } else { - castSA = getCastSA(); - } - if (castSA != null) { - Integer paid = castSA.getXManaCostPaid(); + if (getCastSA() != null) { + Integer paid = getCastSA().getXManaCostPaid(); return paid == null ? 0 : paid; } return 0; diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 2a9b6e232bf..178a1ef7543 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -172,8 +172,10 @@ public class CardFactory { if (targetSA.isBestow()) { c.animateBestow(); } + return c; } + /** *

* copySpellAbilityAndPossiblyHost. @@ -203,6 +205,9 @@ public class CardFactory { } copySA.setCopied(true); + // 707.10b + copySA.setOriginalAbility(targetSA); + c.setCastSA(copySA); if (targetSA.usesTargeting()) { // do for SubAbilities too? @@ -304,7 +309,7 @@ public class CardFactory { buildPlaneAbilities(card); } CardFactoryUtil.setupKeywordedAbilities(card); // Should happen AFTER setting left/right split abilities to set Fuse ability to both sides - card.getView().updateState(card); + card.updateStateForView(); } private static void buildPlaneAbilities(Card card) { @@ -792,9 +797,6 @@ public class CardFactory { state.setImageKey(ImageKeys.getTokenKey("eternalize_" + name + "_" + set)); } - // set the host card for copied replacement effects - // needed for copied xPaid ETB effects (for the copy, xPaid = 0) - if (sa.hasParam("GainTextOf") && originalState != null) { state.setSetCode(originalState.getSetCode()); state.setRarity(originalState.getRarity()); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 975a5ad7b0a..40219ef3089 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -3396,7 +3396,6 @@ public class Player extends GameEntity implements Comparable { equippedThisTurn = 0; } - public boolean hasUrzaLands() { final CardCollectionView landsControlled = getCardsIn(ZoneType.Battlefield); return Iterables.any(landsControlled, Predicates.and(CardPredicates.isType("Urza's"), CardPredicates.isType("Mine"))) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 4740745cfa4..a255568c5ed 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1115,7 +1115,11 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit clone.changeZoneTable = new CardZoneTable(changeZoneTable); } - clone.payingMana = Lists.newArrayList(payingMana); + clone.payingMana = Lists.newArrayList(); + // mana is not copied + if (lki) { + clone.payingMana.addAll(payingMana); + } clone.paidAbilities = Lists.newArrayList(); clone.setPaidHash(Maps.newHashMap(getPaidHash()));