mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
LifeGain + LifeLost Effect: make AFLifeLost better. No warnings anymore for Gray Merchant of Asphodel
This commit is contained in:
@@ -5,44 +5,47 @@ import forge.game.ability.AbilityUtils;
|
|||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class LifeGainEffect extends SpellAbilityEffect {
|
public class LifeGainEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (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
|
@Override
|
||||||
protected String getStackDescription(SpellAbility sa) {
|
protected String getStackDescription(SpellAbility sa) {
|
||||||
final StringBuilder sb = new StringBuilder();
|
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(Lang.joinHomogenous(getDefinedPlayersOrTargeted(sa)));
|
||||||
sb.append(player).append(" ");
|
|
||||||
|
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();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (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
|
@Override
|
||||||
public void resolve(SpellAbility sa) {
|
public void resolve(SpellAbility sa) {
|
||||||
final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
|
final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
|
||||||
|
|
||||||
final TargetRestrictions tgt = sa.getTargetRestrictions();
|
|
||||||
List<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa);
|
List<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa);
|
||||||
if( tgtPlayers.isEmpty() ) {
|
if( tgtPlayers.isEmpty() ) {
|
||||||
tgtPlayers.add(sa.getActivatingPlayer());
|
tgtPlayers.add(sa.getActivatingPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final Player p : tgtPlayers) {
|
for (final Player p : tgtPlayers) {
|
||||||
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
|
||||||
p.gainLife(lifeAmount, sa.getHostCard());
|
p.gainLife(lifeAmount, sa.getHostCard());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,15 +2,16 @@ package forge.game.ability.effects;
|
|||||||
|
|
||||||
|
|
||||||
import forge.game.ability.AbilityUtils;
|
import forge.game.ability.AbilityUtils;
|
||||||
|
import forge.game.ability.ApiType;
|
||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.util.Lang;
|
||||||
|
|
||||||
public class LifeLoseEffect extends SpellAbilityEffect {
|
public class LifeLoseEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (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
|
@Override
|
||||||
protected String getStackDescription(SpellAbility sa) {
|
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);
|
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
|
||||||
|
|
||||||
int affected = getTargetPlayers(sa).size();
|
int affected = getTargetPlayers(sa).size();
|
||||||
for (int i = 0; i < affected; i++) {
|
sb.append(Lang.joinHomogenous(getTargetPlayers(sa)));
|
||||||
final Player player = getTargetPlayers(sa).get(i);
|
|
||||||
sb.append(player);
|
|
||||||
sb.append(i < (affected - 2) ? ", " : i == (affected - 2) ? " and " : " ");
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.append(affected > 1 ? "each lose " : "loses ");
|
sb.append(affected > 1 ? " each lose " : " loses ");
|
||||||
sb.append(amount).append(" life.");
|
sb.append(amount).append(" life.");
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (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
|
@Override
|
||||||
public void resolve(SpellAbility sa) {
|
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 int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa);
|
||||||
|
|
||||||
final TargetRestrictions tgt = sa.getTargetRestrictions();
|
|
||||||
for (final Player p : getTargetPlayers(sa)) {
|
for (final Player p : getTargetPlayers(sa)) {
|
||||||
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
|
||||||
lifeLost += p.loseLife(lifeAmount);
|
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,
|
// Exceptional case for Extort: must propagate the amount of life lost to subability,
|
||||||
// otherwise the first Extort trigger per game won't work
|
// 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));
|
sa.getSubAbility().setSVar("AFLifeLost", "Number$" + Integer.toString(lifeLost));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -283,6 +283,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
|||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasSVar(final String name) {
|
||||||
|
return sVars.containsKey(name);
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getSVarInt(final String name) {
|
public Integer getSVarInt(final String name) {
|
||||||
String var = sVars.get(name);
|
String var = sVars.get(name);
|
||||||
if (var != null) {
|
if (var != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user