diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 5119777c154..d6a2d2cbe30 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -358,7 +358,7 @@ public class DamageDealAi extends DamageAiBase { return c.getSVar("Targeting").equals("Dies") || (ComputerUtilCombat.getEnoughDamageToKill(c, d, source, false, noPrevention) <= d) && !ComputerUtil.canRegenerate(ai, c) - && !(c.getSVar("SacMe").length() > 0) + && !c.hasSVar("SacMe") && !ComputerUtilCard.hasActiveUndyingOrPersist(c); } }); @@ -437,7 +437,7 @@ public class DamageDealAi extends DamageAiBase { return c.getSVar("Targeting").equals("Dies") || (ComputerUtilCombat.getEnoughDamageToKill(c, d, source, false, noPrevention) <= d) && !ComputerUtil.canRegenerate(ai, c) - && !(c.getSVar("SacMe").length() > 0); + && !c.hasSVar("SacMe"); } }); diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 95cf9e0700a..354ed3b8835 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -905,7 +905,7 @@ public abstract class SpellAbilityEffect { return activator.getController().chooseSingleEntityForEffect(options, sa, Localizer.getInstance().getMessage("lblChoosePlayer"), null); } - public void handleExiledWith(final Card movedCard, final SpellAbility cause) { + public static void handleExiledWith(final Card movedCard, final SpellAbility cause) { Card exilingSource = cause.getHostCard(); // during replacement LKI might be used if (cause.isReplacementAbility() && exilingSource.isLKI()) { diff --git a/forge-game/src/main/java/forge/game/cost/CostExile.java b/forge-game/src/main/java/forge/game/cost/CostExile.java index 275dbbd17e1..e14ce97c019 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExile.java +++ b/forge-game/src/main/java/forge/game/cost/CostExile.java @@ -19,6 +19,7 @@ package forge.game.cost; import forge.card.CardType; import forge.game.Game; +import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; @@ -187,11 +188,8 @@ public class CostExile extends CostPartWithList { @Override protected Card doPayment(SpellAbility ability, Card targetCard, final boolean effect) { final Game game = targetCard.getGame(); - final Card host = ability.getHostCard(); Card newCard = game.getAction().exile(targetCard, null); - host.addExiledCard(newCard); - newCard.setExiledWith(host); - newCard.setExiledBy(ability.getActivatingPlayer()); + SpellAbilityEffect.handleExiledWith(newCard, ability); return newCard; } diff --git a/forge-gui/res/cardsfolder/t/tetravus.txt b/forge-gui/res/cardsfolder/t/tetravus.txt index d297bb28d1a..23cda05fe71 100644 --- a/forge-gui/res/cardsfolder/t/tetravus.txt +++ b/forge-gui/res/cardsfolder/t/tetravus.txt @@ -5,9 +5,9 @@ PT:1/1 K:etbCounter:P1P1:3 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you may remove any number of +1/+1 counters from CARDNAME. If you do, create that many 1/1 colorless Tetravite artifact creature tokens. They each have flying and "This creature can't be enchanted." -SVar:TrigToken:AB$Token | Cost$ SubCounter | TokenAmount$ X | TokenScript$ c_1_1_a_tetravite_flying_noenchant | TokenOwner$ You | RememberTokens$ True +SVar:TrigToken:AB$ Token | Cost$ SubCounter | TokenAmount$ X | TokenScript$ c_1_1_a_tetravite_flying_noenchant | TokenOwner$ You | RememberTokens$ True SVar:X:Count$xPaid T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounters | TriggerDescription$ At the beginning of your upkeep, you may exile any number of tokens created with CARDNAME. If you do, put that many +1/+1 counters on CARDNAME. -SVar:TrigPutCounters:AB$PutCounter | Cost$ Exile | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | CostDesc$ Exile any number of tokens put onto the battlefield with CARDNAME. +SVar:TrigPutCounters:AB$ PutCounter | Cost$ Exile | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | CostDesc$ Exile any number of tokens put onto the battlefield with CARDNAME. DeckHas:Ability$Token|Counters Oracle:Flying\nTetravus enters the battlefield with three +1/+1 counters on it.\nAt the beginning of your upkeep, you may remove any number of +1/+1 counters from Tetravus. If you do, create that many 1/1 colorless Tetravite artifact creature tokens. They each have flying and "This creature can't be enchanted."\nAt the beginning of your upkeep, you may exile any number of tokens created with Tetravus. If you do, put that many +1/+1 counters on Tetravus. diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 477a3e2ce32..d38c8bdf1e1 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -379,8 +379,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { private PaymentDecision exileFromMiscZone(final CostExile cost, final SpellAbility sa, final int nNeeded, final CardCollection typeList) { if (typeList.size() < nNeeded) { return null; } - final List origin = Lists.newArrayList(); - origin.add(cost.from); + final List origin = Lists.newArrayList(cost.from); final CardCollection exiled = new CardCollection(); final List chosen = controller.chooseCardsForZoneChange(ZoneType.Exile, origin, sa, typeList, mandatory ? nNeeded : 0,