diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 34947967c04..ad93f326739 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -19,6 +19,8 @@ import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObjectPredicates; import forge.game.ability.AbilityKey; +import forge.game.player.Player; +import forge.game.player.PlayerCollection; import forge.game.trigger.TriggerType; public class CardDamageMap extends ForwardingTable { @@ -66,11 +68,15 @@ public class CardDamageMap extends ForwardingTable { game.getTriggerHandler().runTrigger(TriggerType.DamageDealtOnce, runParams, false); } } + // Targets -> Source for (Map.Entry> e : columnMap().entrySet()) { int sum = 0; - for (final int i : e.getValue().values()) { - sum += i; + // controller list + PlayerCollection controllers = new PlayerCollection(); + for (Entry ec : e.getValue().entrySet()) { + sum += ec.getValue(); + controllers.add(ec.getKey().getController()); } if (sum > 0) { final GameEntity ge = e.getKey(); @@ -81,6 +87,15 @@ public class CardDamageMap extends ForwardingTable { game.getTriggerHandler().runTrigger(TriggerType.DamageDoneOnce, runParams, false); } + for (Player p : controllers) { + final GameEntity ge = e.getKey(); + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.DamageTarget, ge); + runParams.put(AbilityKey.DamageSource, p); + runParams.put(AbilityKey.IsCombatDamage, isCombat); + + game.getTriggerHandler().runTrigger(TriggerType.DamageDoneOnceByController, runParams, false); + } } final Map runParams = AbilityKey.newMap(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java index cbdb908480a..1c026b941da 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java @@ -17,14 +17,8 @@ public class TriggerDamageAll extends Trigger { @Override public boolean performTest(Map runParams) { if (hasParam("CombatDamage")) { - if (getParam("CombatDamage").equals("True")) { - if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } - } else if (getParam("CombatDamage").equals("False")) { - if (((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } + if (getParam("CombatDamage").equals("True") != (Boolean) runParams.get(AbilityKey.IsCombatDamage)) { + return false; } } final CardDamageMap table = (CardDamageMap) runParams.get(AbilityKey.DamageMap); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index bab0dc829bf..7107a67d31b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -60,14 +60,8 @@ public class TriggerDamageDealtOnce extends Trigger { @Override public final boolean performTest(final Map runParams) { if (hasParam("CombatDamage")) { - if (getParam("CombatDamage").equals("True")) { - if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } - } else if (getParam("CombatDamage").equals("False")) { - if (((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } + if (getParam("CombatDamage").equals("True") != (Boolean) runParams.get(AbilityKey.IsCombatDamage)) { + return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index 5c750c0a381..80f284edcaf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -22,14 +22,8 @@ public class TriggerDamageDoneOnce extends Trigger { @Override public boolean performTest(Map runParams) { if (hasParam("CombatDamage")) { - if (getParam("CombatDamage").equals("True")) { - if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } - } else if (getParam("CombatDamage").equals("False")) { - if (((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } + if (getParam("CombatDamage").equals("True") != (Boolean) runParams.get(AbilityKey.IsCombatDamage)) { + return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnceByController.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnceByController.java new file mode 100644 index 00000000000..a96243d52aa --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnceByController.java @@ -0,0 +1,57 @@ +package forge.game.trigger; + +import java.util.Map; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.card.CardUtil; +import forge.game.spellability.SpellAbility; +import forge.util.Localizer; + +public class TriggerDamageDoneOnceByController extends Trigger { + + public TriggerDamageDoneOnceByController(Map params, Card host, boolean intrinsic) { + super(params, host, intrinsic); + + } + + @Override + public boolean performTest(Map runParams) { + if (hasParam("CombatDamage")) { + if (getParam("CombatDamage").equals("True") != (Boolean) runParams.get(AbilityKey.IsCombatDamage)) { + return false; + } + } + + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { + return false; + } + + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { + return false; + } + + return true; + } + + @Override + public void setTriggeringObjects(SpellAbility sa, Map runParams) { + + Object target = runParams.get(AbilityKey.DamageTarget); + if (target instanceof Card) { + target = CardUtil.getLKICopy((Card)runParams.get(AbilityKey.DamageTarget)); + } + sa.setTriggeringObject(AbilityKey.Target, target); + sa.setTriggeringObject(AbilityKey.Source, runParams.get(AbilityKey.DamageSource)); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + if (sa.getTriggeringObject(AbilityKey.Target) != null) { + sb.append(Localizer.getInstance().getMessage("lblDamaged")).append(": ").append(sa.getTriggeringObject(AbilityKey.Target)).append(", "); + } + sb.append(Localizer.getInstance().getMessage("lblDamageSource")).append(": ").append(sa.getTriggeringObject(AbilityKey.Source)); + return sb.toString(); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index 3686a45805e..f58dab78055 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -65,14 +65,8 @@ public class TriggerDamagePrevented extends Trigger { } if (hasParam("CombatDamage")) { - if (getParam("CombatDamage").equals("True")) { - if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } - } else if (getParam("CombatDamage").equals("False")) { - if (((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } + if (getParam("CombatDamage").equals("True") != (Boolean) runParams.get(AbilityKey.IsCombatDamage)) { + return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 3dd96834576..656d88630a6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -53,6 +53,7 @@ public enum TriggerType { DamageDealtOnce(TriggerDamageDealtOnce.class), DamageDone(TriggerDamageDone.class), DamageDoneOnce(TriggerDamageDoneOnce.class), + DamageDoneOnceByController(TriggerDamageDoneOnceByController.class), DamagePrevented(TriggerDamagePrevented.class), DamagePreventedOnce(TriggerDamagePreventedOnce.class), DayTimeChanges (TriggerDayTimeChanges.class),