From d9683252f1658ca81086ba4e241c5444462f7120 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Mon, 20 Dec 2021 18:09:57 +0100 Subject: [PATCH 1/2] Deal combat damage to players simultaneously --- .../src/main/java/forge/game/GameAction.java | 8 ++++++++ .../src/main/java/forge/game/card/Card.java | 3 +-- .../src/main/java/forge/game/player/Player.java | 15 +++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 44cea24e6f9..56dd3f74495 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -2268,6 +2268,14 @@ public class GameAction { } } + // lose life simultaneously + if (isCombat) { + for (Player p : game.getPlayers()) { + p.dealCombatDamage(); + } + game.getTriggerHandler().runWaitingTriggers(); + } + if (cause != null) { // Remember objects as needed final Card sourceLKI = game.getChangeZoneLKIInfo(cause.getHostCard()); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 443be2eeae7..a85b2f3755b 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5269,8 +5269,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { Log.debug(this + " - was assigned " + assignedDamage0 + " damage, by " + sourceCard); if (!assignedDamageMap.containsKey(sourceCard)) { assignedDamageMap.put(sourceCard, assignedDamage0); - } - else { + } else { assignedDamageMap.put(sourceCard, assignedDamageMap.get(sourceCard) + assignedDamage0); } if (assignedDamage0 > 0) { diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index e51dccd6ab2..443a41b5c12 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -174,6 +174,8 @@ public class Player extends GameEntity implements Comparable { private int numForetoldThisTurn = 0; private int numCardsInHandStartedThisTurnWith = 0; + private int simultaneousDamage = 0; + private int lastTurnNr = 0; private final Map> notes = Maps.newHashMap(); @@ -671,7 +673,11 @@ public class Player extends GameEntity implements Comparable { } else if (!hasKeyword("Damage doesn't cause you to lose life.")) { // rule 118.2. Damage dealt to a player normally causes that player to lose that much life. - loseLife(amount, true, false); + if (isCombat) { + simultaneousDamage += amount; + } else { + loseLife(amount, true, false); + } } //Oathbreaker, Tiny Leaders, and Brawl ignore commander damage rule @@ -710,7 +716,7 @@ public class Player extends GameEntity implements Comparable { runParams.put(AbilityKey.IsCombatDamage, isCombat); // Defending player at the time the damage was dealt runParams.put(AbilityKey.DefendingPlayer, game.getCombat() != null ? game.getCombat().getDefendingPlayerRelatedTo(source) : null); - game.getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); + game.getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, isCombat); game.fireEvent(new GameEventPlayerDamaged(this, source, amount, isCombat, infect)); @@ -810,6 +816,11 @@ public class Player extends GameEntity implements Comparable { return restDamage; } + public final void dealCombatDamage() { + loseLife(simultaneousDamage, true, false); + simultaneousDamage = 0; + } + public final void clearAssignedDamage() { assignedDamage.clear(); assignedCombatDamage.clear(); From e87def539813f8b8626657de79928d40c91363e0 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Tue, 21 Dec 2021 22:53:14 +0100 Subject: [PATCH 2/2] Clean up --- .../src/main/java/forge/game/ability/AbilityUtils.java | 3 --- forge-game/src/main/java/forge/game/card/Card.java | 8 ++++---- forge-game/src/main/java/forge/game/player/Player.java | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index d0af5946cda..d79d614c985 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -808,9 +808,6 @@ public class AbilityUtils { if (parent != null) { list = parent.findTargetedCards(); } - else { - list = null; - } } else if (calcX[0].startsWith("TriggerRemembered")) { final SpellAbility root = sa.getRootAbility(); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index a85b2f3755b..a2d14977b24 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5431,13 +5431,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars { excess = damageIn + getDamage() - getLethal(); } - GameEventCardDamaged.DamageType damageType = DamageType.Normal; + DamageType damageType = DamageType.Normal; if (isPlaneswalker()) { // 120.3c subtractCounter(CounterType.get(CounterEnumType.LOYALTY), damageIn); } if (isCreature()) { - boolean wither = (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.alwaysWither) - || source.hasKeyword(Keyword.WITHER) || source.hasKeyword(Keyword.INFECT)); + boolean wither = game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.alwaysWither) + || source.hasKeyword(Keyword.WITHER) || source.hasKeyword(Keyword.INFECT); if (wither) { // 120.3d addCounter(CounterType.get(CounterEnumType.M1M1), damageIn, source.getController(), null, true, counterTable); @@ -5448,7 +5448,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { view.updateDamage(this); } - if (source.hasKeyword(Keyword.DEATHTOUCH) && isCreature()) { + if (source.hasKeyword(Keyword.DEATHTOUCH)) { setHasBeenDealtDeathtouchDamage(true); damageType = DamageType.Deathtouch; } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 443a41b5c12..f52db4b1fc1 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -663,7 +663,6 @@ public class Player extends GameEntity implements Comparable { if (amount <= 0 || hasLost()) { return 0; } - //String additionalLog = ""; boolean infect = source.hasKeyword(Keyword.INFECT) || hasKeyword("All damage is dealt to you as though its source had infect."); @@ -674,6 +673,7 @@ public class Player extends GameEntity implements Comparable { else if (!hasKeyword("Damage doesn't cause you to lose life.")) { // rule 118.2. Damage dealt to a player normally causes that player to lose that much life. if (isCombat) { + // currently all abilities treat is as single event simultaneousDamage += amount; } else { loseLife(amount, true, false);