LifeGain + LifeLost Effect: make AFLifeLost better. No warnings anymore for Gray Merchant of Asphodel

This commit is contained in:
Hanmac
2016-12-29 09:16:55 +00:00
parent 3959d171dc
commit c56c8af0bc
3 changed files with 25 additions and 22 deletions

View File

@@ -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.");
}
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<Player> 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());
}
}

View File

@@ -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));
}

View File

@@ -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) {