Damage: add Cause Param for damage deal, needed for Silhouette or Bronze Horse

This commit is contained in:
Hanmac
2018-03-04 20:22:45 +01:00
parent 70301e8e91
commit c74b0a017b
9 changed files with 59 additions and 33 deletions

View File

@@ -24,6 +24,7 @@ import forge.game.card.CardDamageMap;
import forge.game.card.CounterType;
import forge.game.event.GameEventCardAttachment;
import forge.game.event.GameEventCardAttachment.AttachMethod;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.collect.FCollection;
@@ -58,22 +59,22 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
}
public final int addDamage(final int damage, final Card source, boolean isCombat, boolean noPrevention,
final CardDamageMap damageMap, final CardDamageMap preventMap) {
final CardDamageMap damageMap, final CardDamageMap preventMap, final SpellAbility cause) {
if (noPrevention) {
return addDamageWithoutPrevention(damage, source, damageMap, preventMap);
return addDamageWithoutPrevention(damage, source, damageMap, preventMap, cause);
} else if (isCombat) {
return addCombatDamage(damage, source, damageMap, preventMap);
} else {
return addDamage(damage, source, damageMap, preventMap);
return addDamage(damage, source, damageMap, preventMap, cause);
}
}
public int addDamage(final int damage, final Card source, final CardDamageMap damageMap,
final CardDamageMap preventMap) {
final CardDamageMap preventMap, final SpellAbility cause) {
int damageToDo = damage;
damageToDo = replaceDamage(damageToDo, source, false, true, damageMap, preventMap);
damageToDo = preventDamage(damageToDo, source, false, preventMap);
damageToDo = replaceDamage(damageToDo, source, false, true, damageMap, preventMap, cause);
damageToDo = preventDamage(damageToDo, source, false, preventMap, cause);
return addDamageAfterPrevention(damageToDo, source, false, damageMap);
}
@@ -82,8 +83,8 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
final CardDamageMap preventMap) {
int damageToDo = damage;
damageToDo = replaceDamage(damageToDo, source, true, true, damageMap, preventMap);
damageToDo = preventDamage(damageToDo, source, true, preventMap);
damageToDo = replaceDamage(damageToDo, source, true, true, damageMap, preventMap, null);
damageToDo = preventDamage(damageToDo, source, true, preventMap, null);
if (damageToDo > 0) {
source.getDamageHistory().registerCombatDamage(this);
@@ -97,13 +98,13 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
}
public int addDamageWithoutPrevention(final int damage, final Card source, final CardDamageMap damageMap,
final CardDamageMap preventMap) {
int damageToDo = replaceDamage(damage, source, false, false, damageMap, preventMap);
final CardDamageMap preventMap, final SpellAbility cause) {
int damageToDo = replaceDamage(damage, source, false, false, damageMap, preventMap, cause);
return addDamageAfterPrevention(damageToDo, source, false, damageMap);
}
public int replaceDamage(final int damage, final Card source, final boolean isCombat, final boolean prevention,
final CardDamageMap damageMap, final CardDamageMap preventMap) {
final CardDamageMap damageMap, final CardDamageMap preventMap, final SpellAbility cause) {
// Replacement effects
final Map<String, Object> repParams = Maps.newHashMap();
repParams.put("Event", "DamageDone");
@@ -114,6 +115,9 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
repParams.put("NoPreventDamage", !prevention);
repParams.put("DamageMap", damageMap);
repParams.put("PreventMap", preventMap);
if (cause != null) {
repParams.put("Cause", cause);
}
switch (getGame().getReplacementHandler().run(repParams)) {
case NotReplaced:
@@ -126,7 +130,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
return newDamage;
} else {
if (prevention) {
newDamage = newTarget.preventDamage(newDamage, source, isCombat, preventMap);
newDamage = newTarget.preventDamage(newDamage, source, isCombat, preventMap, cause);
}
newTarget.addDamageAfterPrevention(newDamage, source, isCombat, damageMap);
}
@@ -146,7 +150,9 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
// not change the game state)
public abstract int staticReplaceDamage(final int damage, final Card source, final boolean isCombat);
public final int preventDamage(final int damage, final Card source, final boolean isCombat, CardDamageMap preventMap) {
public final int preventDamage(
final int damage, final Card source, final boolean isCombat, CardDamageMap preventMap,
final SpellAbility cause) {
if (getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)
|| source.hasKeyword("Damage that would be dealt by CARDNAME can't be prevented.")) {
return damage;
@@ -163,6 +169,9 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
repParams.put("IsCombat", isCombat);
repParams.put("Prevention", true);
repParams.put("PreventMap", preventMap);
if (cause != null) {
repParams.put("Cause", cause);
}
switch (getGame().getReplacementHandler().run(repParams)) {
case NotReplaced:

View File

@@ -97,13 +97,13 @@ public class DamageAllEffect extends DamageBaseEffect {
}
for (final Card c : list) {
c.addDamage(dmg, sourceLKI, damageMap, preventMap);
c.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
}
if (!players.equals("")) {
final List<Player> playerList = AbilityUtils.getDefinedPlayers(card, players, sa);
for (final Player p : playerList) {
p.addDamage(dmg, sourceLKI, damageMap, preventMap);
p.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
}
}

View File

@@ -156,7 +156,7 @@ public class DamageDealEffect extends DamageBaseEffect {
Player assigningPlayer = players.get(0);
Map<Card, Integer> map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true);
for (Entry<Card, Integer> dt : map.entrySet()) {
dt.getKey().addDamage(dt.getValue(), sourceLKI, damageMap, preventMap);
dt.getKey().addDamage(dt.getValue(), sourceLKI, damageMap, preventMap, sa);
}
if (!usedDamageMap) {
@@ -183,13 +183,13 @@ public class DamageDealEffect extends DamageBaseEffect {
c.clearAssignedDamage();
}
else {
c.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap);
c.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap, sa);
}
}
} else if (o instanceof Player) {
final Player p = (Player) o;
if (!targeted || p.canBeTargetedBy(sa)) {
p.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap);
p.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap, sa);
}
}
}

View File

@@ -91,13 +91,13 @@ public class DamageEachEffect extends DamageBaseEffect {
if (o instanceof Card) {
final Card c = (Card) o;
if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) {
c.addDamage(dmg, sourceLKI, damageMap, preventMap);
c.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
}
} else if (o instanceof Player) {
final Player p = (Player) o;
if (!targeted || p.canBeTargetedBy(sa)) {
p.addDamage(dmg, sourceLKI, damageMap, preventMap);
p.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
}
}
}
@@ -110,7 +110,7 @@ public class DamageEachEffect extends DamageBaseEffect {
final int dmg = CardFactoryUtil.xCount(source, card.getSVar("X"));
// System.out.println(source+" deals "+dmg+" damage to "+source);
source.addDamage(dmg, sourceLKI, damageMap, preventMap);
source.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
}
}
if (sa.getParam("DefinedCards").equals("Remembered")) {
@@ -122,7 +122,7 @@ public class DamageEachEffect extends DamageBaseEffect {
if (o instanceof Card) {
Card rememberedcard = (Card) o;
// System.out.println(source + " deals " + dmg + " damage to " + rememberedcard);
rememberedcard.addDamage(dmg, sourceLKI, damageMap, preventMap);
rememberedcard.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
}
}
}

View File

@@ -63,8 +63,8 @@ public class FightEffect extends DamageBaseEffect {
final int dmg1 = fightToughness ? fighters.get(0).getNetToughness() : fighters.get(0).getNetPower();
final int dmg2 = fightToughness ? fighters.get(1).getNetToughness() : fighters.get(1).getNetPower();
dealDamage(fighters.get(0), fighters.get(1), dmg1, damageMap, preventMap);
dealDamage(fighters.get(1), fighters.get(0), dmg2, damageMap, preventMap);
dealDamage(fighters.get(0), fighters.get(1), dmg1, damageMap, preventMap, sa);
dealDamage(fighters.get(1), fighters.get(0), dmg2, damageMap, preventMap, sa);
preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false);
@@ -121,8 +121,8 @@ public class FightEffect extends DamageBaseEffect {
return fighterList;
}
private void dealDamage(Card source, Card target, int damage, CardDamageMap damageMap, CardDamageMap preventMap) {
target.addDamage(damage, source, damageMap, preventMap);
private void dealDamage(Card source, Card target, int damage, CardDamageMap damageMap, CardDamageMap preventMap, final SpellAbility sa) {
target.addDamage(damage, source, damageMap, preventMap, sa);
}
}

View File

@@ -57,13 +57,14 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect {
CardDamageMap damageMap = (CardDamageMap) originalParams.get("DamageMap");
CardDamageMap preventMap = (CardDamageMap) originalParams.get("PreventMap");
SpellAbility cause = (SpellAbility) originalParams.get("Cause");
boolean isCombat = (Boolean) originalParams.get("IsCombat");
boolean noPrevention = (Boolean) originalParams.get("NoPreventDamage");
GameEntity obj = (GameEntity) list.get(0);
obj.addDamage(n, sourceLKI, isCombat, noPrevention, damageMap, preventMap);
obj.addDamage(n, sourceLKI, isCombat, noPrevention, damageMap, preventMap, cause);
}
// no damage for original target anymore

View File

@@ -64,7 +64,7 @@ public class CostDamage extends CostPart {
CardDamageMap damageMap = new CardDamageMap();
CardDamageMap preventMap = new CardDamageMap();
payer.addDamage(decision.c, source, damageMap, preventMap);
payer.addDamage(decision.c, source, damageMap, preventMap, null);
preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false);

View File

@@ -54,19 +54,35 @@ public class ReplaceDamage extends ReplacementEffect {
return false;
}
if (hasParam("ValidSource")) {
String validSource = getParam("ValidSource");
validSource = AbilityUtils.applyAbilityTextChangeEffects(validSource, this);
String validSource = getParam("ValidSource");
validSource = AbilityUtils.applyAbilityTextChangeEffects(validSource, this);
if (!matchesValid(runParams.get("DamageSource"), validSource.split(","), getHostCard())) {
return false;
}
}
if (hasParam("ValidTarget")) {
String validTarget = getParam("ValidTarget");
validTarget = AbilityUtils.applyAbilityTextChangeEffects(validTarget, this);
String validTarget = getParam("ValidTarget");
validTarget = AbilityUtils.applyAbilityTextChangeEffects(validTarget, this);
if (!matchesValid(runParams.get("Affected"), validTarget.split(","), getHostCard())) {
return false;
}
}
if (hasParam("ValidCause")) {
if (!runParams.containsKey("Cause")) {
return false;
}
SpellAbility cause = (SpellAbility) runParams.get("Cause");
String validCause = getParam("ValidCause");
validCause = AbilityUtils.applyAbilityTextChangeEffects(validCause, this);
if (!matchesValid(cause, validCause.split(","), getHostCard())) {
return false;
}
if (hasParam("CauseIsSource")) {
if (!cause.getHostCard().equals(runParams.get("DamageSource"))) {
return false;
}
}
}
if (((Integer) runParams.get("DamageAmount")) == 0) {
// If no actual damage is dealt, there is nothing to replace
return false;

View File

@@ -424,7 +424,7 @@ public class HumanPlay {
CardDamageMap damageMap = new CardDamageMap();
CardDamageMap preventMap = new CardDamageMap();
p.addDamage(amount, source, damageMap, preventMap);
p.addDamage(amount, source, damageMap, preventMap, null);
preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false);