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

View File

@@ -97,13 +97,13 @@ public class DamageAllEffect extends DamageBaseEffect {
} }
for (final Card c : list) { for (final Card c : list) {
c.addDamage(dmg, sourceLKI, damageMap, preventMap); c.addDamage(dmg, sourceLKI, damageMap, preventMap, sa);
} }
if (!players.equals("")) { if (!players.equals("")) {
final List<Player> playerList = AbilityUtils.getDefinedPlayers(card, players, sa); final List<Player> playerList = AbilityUtils.getDefinedPlayers(card, players, sa);
for (final Player p : playerList) { 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); Player assigningPlayer = players.get(0);
Map<Card, Integer> map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true); Map<Card, Integer> map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true);
for (Entry<Card, Integer> dt : map.entrySet()) { 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) { if (!usedDamageMap) {
@@ -183,13 +183,13 @@ public class DamageDealEffect extends DamageBaseEffect {
c.clearAssignedDamage(); c.clearAssignedDamage();
} }
else { else {
c.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap); c.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap, sa);
} }
} }
} else if (o instanceof Player) { } else if (o instanceof Player) {
final Player p = (Player) o; final Player p = (Player) o;
if (!targeted || p.canBeTargetedBy(sa)) { 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) { if (o instanceof Card) {
final Card c = (Card) o; final Card c = (Card) o;
if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { 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) { } else if (o instanceof Player) {
final Player p = (Player) o; final Player p = (Player) o;
if (!targeted || p.canBeTargetedBy(sa)) { 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")); final int dmg = CardFactoryUtil.xCount(source, card.getSVar("X"));
// System.out.println(source+" deals "+dmg+" damage to "+source); // 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")) { if (sa.getParam("DefinedCards").equals("Remembered")) {
@@ -122,7 +122,7 @@ public class DamageEachEffect extends DamageBaseEffect {
if (o instanceof Card) { if (o instanceof Card) {
Card rememberedcard = (Card) o; Card rememberedcard = (Card) o;
// System.out.println(source + " deals " + dmg + " damage to " + rememberedcard); // 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 dmg1 = fightToughness ? fighters.get(0).getNetToughness() : fighters.get(0).getNetPower();
final int dmg2 = fightToughness ? fighters.get(1).getNetToughness() : fighters.get(1).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(0), fighters.get(1), dmg1, damageMap, preventMap, sa);
dealDamage(fighters.get(1), fighters.get(0), dmg2, damageMap, preventMap); dealDamage(fighters.get(1), fighters.get(0), dmg2, damageMap, preventMap, sa);
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false); damageMap.triggerDamageDoneOnce(false);
@@ -121,8 +121,8 @@ public class FightEffect extends DamageBaseEffect {
return fighterList; return fighterList;
} }
private void dealDamage(Card source, Card target, int damage, CardDamageMap damageMap, CardDamageMap preventMap) { private void dealDamage(Card source, Card target, int damage, CardDamageMap damageMap, CardDamageMap preventMap, final SpellAbility sa) {
target.addDamage(damage, source, damageMap, preventMap); 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 damageMap = (CardDamageMap) originalParams.get("DamageMap");
CardDamageMap preventMap = (CardDamageMap) originalParams.get("PreventMap"); CardDamageMap preventMap = (CardDamageMap) originalParams.get("PreventMap");
SpellAbility cause = (SpellAbility) originalParams.get("Cause");
boolean isCombat = (Boolean) originalParams.get("IsCombat"); boolean isCombat = (Boolean) originalParams.get("IsCombat");
boolean noPrevention = (Boolean) originalParams.get("NoPreventDamage"); boolean noPrevention = (Boolean) originalParams.get("NoPreventDamage");
GameEntity obj = (GameEntity) list.get(0); 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 // no damage for original target anymore

View File

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

View File

@@ -67,6 +67,22 @@ public class ReplaceDamage extends ReplacementEffect {
return false; 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 (((Integer) runParams.get("DamageAmount")) == 0) {
// If no actual damage is dealt, there is nothing to replace // If no actual damage is dealt, there is nothing to replace
return false; return false;

View File

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