Merge branch 'show_remaining_shield' into 'master'

Show remaining shields amount for damage prevention and redirection effect

See merge request core-developers/forge!4684
This commit is contained in:
Michael Kamensky
2021-05-10 03:27:03 +00:00
5 changed files with 35 additions and 2 deletions

View File

@@ -28,7 +28,6 @@ public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ "); StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ ");
sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered")); sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered"));
sb.append(" | PreventionEffect$ True | Description$ Prevent the next ").append(numDam).append(" damage."); sb.append(" | PreventionEffect$ True | Description$ Prevent the next ").append(numDam).append(" damage.");
String repeffstr = sb.toString();
String effect = "DB$ ReplaceDamage | Amount$ ShieldAmount"; String effect = "DB$ ReplaceDamage | Amount$ ShieldAmount";
final Card eff = createEffect(sa, player, name, image); final Card eff = createEffect(sa, player, name, image);
@@ -51,9 +50,13 @@ public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
} }
subAbString = TextUtil.fastReplace(subAbString, "ShieldEffectTarget", effTgtString); subAbString = TextUtil.fastReplace(subAbString, "ShieldEffectTarget", effTgtString);
} }
replaceDamage.setSubAbility((AbilitySub) AbilityFactory.getAbility(subAbString, eff)); AbilitySub subSA = (AbilitySub) AbilityFactory.getAbility(subAbString, eff);
replaceDamage.setSubAbility(subSA);
// Add SpellDescription of PreventionSubAbility to effect description
sb.append(" ").append(subSA.getParam("SpellDescription"));
} }
String repeffstr = sb.toString();
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
re.setOverridingAbility(replaceDamage); re.setOverridingAbility(replaceDamage);
eff.addReplacementEffect(re); eff.addReplacementEffect(re);

View File

@@ -50,6 +50,7 @@ public class ReplaceDamageEffect extends SpellAbilityEffect {
game.getAction().exile(card, null); game.getAction().exile(card, null);
} else if (!StringUtils.isNumeric(varValue) && card.getSVar(varValue).startsWith("Number$")) { } else if (!StringUtils.isNumeric(varValue) && card.getSVar(varValue).startsWith("Number$")) {
card.setSVar(varValue, "Number$" + prevent); card.setSVar(varValue, "Number$" + prevent);
card.updateAbilityTextForView();
} }
// Set PreventedDamage SVar for PreventionSubAbility // Set PreventedDamage SVar for PreventionSubAbility
card.setSVar("PreventedDamage", "Number$" + n); card.setSVar("PreventedDamage", "Number$" + n);

View File

@@ -54,6 +54,7 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect {
game.getAction().exile(card, null); game.getAction().exile(card, null);
} else if (!StringUtils.isNumeric(varValue)) { } else if (!StringUtils.isNumeric(varValue)) {
sa.setSVar(varValue, "Number$" + prevent); sa.setSVar(varValue, "Number$" + prevent);
card.updateAbilityTextForView();
} }
Card sourceLKI = (Card) sa.getReplacingObject(AbilityKey.Source); Card sourceLKI = (Card) sa.getReplacingObject(AbilityKey.Source);

View File

@@ -21,11 +21,14 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import forge.game.Game; import forge.game.Game;
import forge.game.TriggerReplacementBase; import forge.game.TriggerReplacementBase;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey; import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -229,6 +232,30 @@ public abstract class ReplacementEffect extends TriggerReplacementBase {
if (desc.contains("EFFECTSOURCE")) { if (desc.contains("EFFECTSOURCE")) {
desc = TextUtil.fastReplace(desc, "EFFECTSOURCE", getHostCard().getEffectSource().toString()); desc = TextUtil.fastReplace(desc, "EFFECTSOURCE", getHostCard().getEffectSource().toString());
} }
// Add remaining shield amount
if (mode == ReplacementType.DamageDone) {
SpellAbility repSA = getOverridingAbility();
if (repSA != null && repSA.getApi() == ApiType.ReplaceDamage && repSA.hasParam("Amount")) {
String varValue = repSA.getParam("Amount");
if (!StringUtils.isNumeric(varValue)) {
varValue = repSA.getSVar(varValue);
if (varValue.startsWith("Number$")) {
desc += " \nShields remain: " + varValue.substring(7);
}
}
}
if (repSA != null && repSA.getApi() == ApiType.ReplaceSplitDamage) {
String varValue = repSA.getParamOrDefault("VarName", "1");
if (varValue.equals("1")) {
desc += " \nShields remain: 1";
} else if (!StringUtils.isNumeric(varValue)) {
varValue = repSA.getSVar(varValue);
if (varValue.startsWith("Number$")) {
desc += " \nShields remain: " + varValue.substring(7);
}
}
}
}
return desc; return desc;
} else { } else {
return ""; return "";

View File

@@ -497,6 +497,7 @@ public class ReplacementHandler {
&& re.getLayer() == ReplacementLayer.Other && re.getLayer() == ReplacementLayer.Other
&& re.hasParam("Prevent") && re.getParam("Prevent").equals("True") && re.hasParam("Prevent") && re.getParam("Prevent").equals("True")
&& re.hasParam("IsCombat") && re.getParam("IsCombat").equals("True") && re.hasParam("IsCombat") && re.getParam("IsCombat").equals("True")
&& !re.hasParam("ValidSource") && !re.hasParam("ValidTarget")
&& re.zonesCheck(game.getZoneOf(c))) { && re.zonesCheck(game.getZoneOf(c))) {
list.add(re); list.add(re);
} }