From c56c8af0bc17d906873994d0ea0fad4dda85cc4d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 29 Dec 2016 09:16:55 +0000 Subject: [PATCH] LifeGain + LifeLost Effect: make AFLifeLost better. No warnings anymore for Gray Merchant of Asphodel --- .../game/ability/effects/LifeGainEffect.java | 23 +++++++++++-------- .../game/ability/effects/LifeLoseEffect.java | 20 +++++++--------- .../forge/game/spellability/SpellAbility.java | 4 ++++ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java index a0b288395a7..02e2517df00 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java @@ -5,44 +5,47 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.util.Lang; import java.util.List; public class LifeGainEffect extends SpellAbilityEffect { /* (non-Javadoc) - * @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) + * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) */ @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); + final String amountStr = sa.getParam("LifeAmount"); - for (final Player player : getDefinedPlayersOrTargeted(sa)) { - sb.append(player).append(" "); + sb.append(Lang.joinHomogenous(getDefinedPlayersOrTargeted(sa))); + + if (!amountStr.equals("AFLifeLost") || sa.hasSVar(amountStr)) { + final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa); + + sb.append("gains ").append(amount).append(" life."); + } else { + sb.append("gains life equal to the life lost this way."); } - sb.append("gains ").append(amount).append(" life."); - return sb.toString(); } /* (non-Javadoc) - * @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) + * @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility) */ @Override public void resolve(SpellAbility sa) { final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); - final TargetRestrictions tgt = sa.getTargetRestrictions(); List tgtPlayers = getDefinedPlayersOrTargeted(sa); if( tgtPlayers.isEmpty() ) { tgtPlayers.add(sa.getActivatingPlayer()); } for (final Player p : tgtPlayers) { - if ((tgt == null) || p.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { p.gainLife(lifeAmount, sa.getHostCard()); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java index 1b2162fb1b0..ace4ff26c96 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java @@ -2,15 +2,16 @@ package forge.game.ability.effects; import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.util.Lang; public class LifeLoseEffect extends SpellAbilityEffect { /* (non-Javadoc) - * @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) + * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) */ @Override protected String getStackDescription(SpellAbility sa) { @@ -19,20 +20,16 @@ public class LifeLoseEffect extends SpellAbilityEffect { final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); int affected = getTargetPlayers(sa).size(); - for (int i = 0; i < affected; i++) { - final Player player = getTargetPlayers(sa).get(i); - sb.append(player); - sb.append(i < (affected - 2) ? ", " : i == (affected - 2) ? " and " : " "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); - sb.append(affected > 1 ? "each lose " : "loses "); + sb.append(affected > 1 ? " each lose " : " loses "); sb.append(amount).append(" life."); return sb.toString(); } /* (non-Javadoc) - * @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) + * @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility) */ @Override public void resolve(SpellAbility sa) { @@ -41,9 +38,8 @@ public class LifeLoseEffect extends SpellAbilityEffect { final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); - final TargetRestrictions tgt = sa.getTargetRestrictions(); for (final Player p : getTargetPlayers(sa)) { - if ((tgt == null) || p.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { lifeLost += p.loseLife(lifeAmount); } } @@ -51,7 +47,7 @@ public class LifeLoseEffect extends SpellAbilityEffect { // Exceptional case for Extort: must propagate the amount of life lost to subability, // otherwise the first Extort trigger per game won't work - if (sa.getHostCard().hasKeyword("Extort") && sa.getSubAbility() != null) { + if (sa.getSubAbility() != null && ApiType.GainLife.equals(sa.getSubAbility().getApi())) { sa.getSubAbility().setSVar("AFLifeLost", "Number$" + Integer.toString(lifeLost)); } 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 1c89044c2b6..684dff7092c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -283,6 +283,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return var; } + public boolean hasSVar(final String name) { + return sVars.containsKey(name); + } + public Integer getSVarInt(final String name) { String var = sVars.get(name); if (var != null) {