From 793bb979094c97cccced96e3fa1807c22b210e63 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 4 Jun 2021 12:13:58 -0400 Subject: [PATCH 1/6] thrasta_tempests_roar.txt --- .../cardsfolder/upcoming/thrasta_tempests_roar.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt b/forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt new file mode 100644 index 00000000000..b2be79410a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt @@ -0,0 +1,11 @@ +Name:Thrasta, Tempest's Roar +ManaCost:10 G G +Types:Legendary Creature Dinosaur +PT:7/7 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {3} less to cast for each other spell cast this turn. +SVar:X:Count$ThisTurnCast_Card.Other/Times.3 +K:Trample +K:Haste +K:Trample over planeswalkers +S:Mode$ Continuous | Affected$ Card.Self+ThisTurnEntered | AddKeyword$ Hexproof | Description$ CARDNAME has hexproof as long as it entered the battlefield this turn. +Oracle:This spell costs {3} less to cast for each other spell cast this turn.\nTrample, haste\nTrample over planeswalkers (This creature can deal excess combat damage to the controller of the planeswalker it’s attacking.)\nThrasta, Tempest’s Roar has hexproof as long as it entered the battlefield this turn. From 35477a5edb146adc71ba051bbc19320849421ff0 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 4 Jun 2021 12:18:31 -0400 Subject: [PATCH 2/6] Trample over planeswalkers reminder text --- forge-game/src/main/java/forge/game/keyword/Keyword.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 8ccd3bde82c..d2b3dd41127 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -153,6 +153,7 @@ public enum Keyword { SUSPEND("Suspend", Suspend.class, false, "Rather than cast this card from your hand, you may pay %s and exile it with {%d:time counter} on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost."), TOTEM_ARMOR("Totem armor", SimpleKeyword.class, true, "If enchanted permanent would be destroyed, instead remove all damage marked on it and destroy this Aura."), TRAMPLE("Trample", SimpleKeyword.class, true, "This creature can deal excess combat damage to the player or planeswalker it's attacking."), + TRAMPLE_OVER_PLANESWALKERS("Trample over planeswalkers", SimpleKeyword.class, true, "This creature can deal excess combat damage to the controller of the planeswalker it’s attacking."), TRANSFIGURE("Transfigure", KeywordWithCost.class, false, "%s, Sacrifice this creature: Search your library for a creature card with the same mana value as this creature and put that card onto the battlefield, then shuffle. Transfigure only as a sorcery."), TRANSMUTE("Transmute", KeywordWithCost.class, false, "%s, Discard this card: Search your library for a card with the same mana value as this card, reveal it, and put it into your hand, then shuffle. Transmute only as a sorcery."), TRIBUTE("Tribute", KeywordWithAmount.class, false, "As this creature enters the battlefield, an opponent of your choice may put {%d:+1/+1 counter} on it."), From 3010657620be0060af107abaf3749a8b280f5bdf Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 4 Jun 2021 12:20:09 -0400 Subject: [PATCH 3/6] handle Trample over planeswalkers keyword --- forge-game/src/main/java/forge/game/card/Card.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9c518a4d416..7aafdbd53cf 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2028,9 +2028,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") || keyword.equals("Changeling") || keyword.equals("Delve") || keyword.equals("Split second") || keyword.equals("Sunburst") - || keyword.equals("Suspend") // for the ones without amounnt + || keyword.equals("Suspend") // for the ones without amount || keyword.equals("Foretell") // for the ones without cost || keyword.equals("Hideaway") || keyword.equals("Ascend") + || keyword.equals("Trample over planeswalkers") || keyword.equals("Totem armor") || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot")){ sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); From dfea87ed0eb88296bb36679406612b6b30df8b58 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 4 Jun 2021 12:21:05 -0400 Subject: [PATCH 4/6] properly calculate lethal for planeswalkers being trampled over --- .../main/java/forge/screens/match/VAssignCombatDamage.java | 4 +++- .../src/forge/screens/match/views/VAssignCombatDamage.java | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java index 6551d293db4..987d866d720 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java @@ -448,7 +448,9 @@ public class VAssignCombatDamage { } else { lethalDamage = Math.max(0, card.getLethalDamage()); - if (attackerHasDeathtouch) { + if (card.getCurrentState().getType().isPlaneswalker()) { + lethalDamage = Integer.valueOf(card.getCurrentState().getLoyalty()); + } else if (attackerHasDeathtouch) { lethalDamage = Math.min(lethalDamage, 1); } } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java index c9f5e70a492..5b9e9228d08 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java @@ -461,8 +461,10 @@ public class VAssignCombatDamage extends FDialog { } else { lethalDamage = Math.max(0, source.getLethalDamage()); - if (attackerHasDeathtouch) { - lethalDamage = Math.min(lethalDamage, 1); + if (card.getCurrentState().getType().isPlaneswalker()) { + lethalDamage = Integer.valueOf(card.getCurrentState().getLoyalty()); + } else if (attackerHasDeathtouch) { + lethalDamage = Math.min(lethalDamage, 1); } } return lethalDamage; From 60f98c84d50445f26b78570b5b4e660018391cc0 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 4 Jun 2021 12:23:30 -0400 Subject: [PATCH 5/6] make sure damage assign window pops up for trampling over planeswalkers --- .../src/main/java/forge/player/PlayerControllerHuman.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index a447ffe0e01..aa64776001e 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -356,8 +356,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont map.put(null, damageDealt); } else { if ((attacker.hasKeyword(Keyword.TRAMPLE) && defender != null) || (blockers.size() > 1) - || (attacker.hasKeyword("You may assign CARDNAME's combat damage divided as you choose among defending" + - " player and/or any number of creatures they control.")) && overrideOrder && blockers.size() >0) { + || ((attacker.hasKeyword("You may assign CARDNAME's combat damage divided as you choose among " + + "defending player and/or any number of creatures they control.")) && overrideOrder && + blockers.size() >0) || (attacker.hasKeyword("Trample over planeswalkers") && defender instanceof Card)) { GameEntityViewMap gameCacheBlockers = GameEntityView.getMap(blockers); final CardView vAttacker = CardView.get(attacker); final GameEntityView vDefender = GameEntityView.get(defender); From 2364e8dd264b26610d5f7b5e96d19bc974561c86 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 4 Jun 2021 12:24:55 -0400 Subject: [PATCH 6/6] Combat.java set up defending planeswalker and controller to receive damage with trample over planeswalkers --- forge-game/src/main/java/forge/game/combat/Combat.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 19439cb9363..aaddc15cd7b 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -779,6 +779,16 @@ public class Combat { assignedDamage = true; GameEntity defender = getDefenderByAttacker(band); // If the Attacker is unblocked, or it's a trampler and has 0 blockers, deal damage to defender + if (defender instanceof Card && attacker.hasKeyword("Trample over planeswalkers")) { + if (orderedBlockers == null || orderedBlockers.isEmpty()) { + CardCollection cc = new CardCollection(); + cc.add((Card)defender); + orderedBlockers = cc; + } else { + orderedBlockers.add((Card) defender); + } + defender = getDefenderPlayerByAttacker(attacker); + } if (orderedBlockers == null || orderedBlockers.isEmpty()) { if (trampler || !band.isBlocked()) { // this is called after declare blockers, no worries 'bout nulls in isBlocked damageMap.put(attacker, defender, damageDealt);