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$ ");
sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered"));
sb.append(" | PreventionEffect$ True | Description$ Prevent the next ").append(numDam).append(" damage.");
String repeffstr = sb.toString();
String effect = "DB$ ReplaceDamage | Amount$ ShieldAmount";
final Card eff = createEffect(sa, player, name, image);
@@ -51,9 +50,13 @@ public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
}
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);
re.setOverridingAbility(replaceDamage);
eff.addReplacementEffect(re);

View File

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

View File

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

View File

@@ -21,11 +21,14 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import forge.game.Game;
import forge.game.TriggerReplacementBase;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.phase.PhaseType;
import forge.game.spellability.SpellAbility;
@@ -229,6 +232,30 @@ public abstract class ReplacementEffect extends TriggerReplacementBase {
if (desc.contains("EFFECTSOURCE")) {
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;
} else {
return "";

View File

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