From 93059a4355934c6fd17e63d093f0914dedae00df Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 25 May 2025 02:09:06 +0400 Subject: [PATCH] GUI, deck: improved bracket level calculations (added mass land destruction support, part of #13341) --- .../components/BracketLegalityLabel.java | 59 ++++++++++++++++++- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java b/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java index e387b8c8cc0..aa163daaa4a 100644 --- a/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java +++ b/Mage.Client/src/main/java/mage/client/components/BracketLegalityLabel.java @@ -17,7 +17,7 @@ import java.util.stream.Stream; * Support: * - [x] game changers * - [ ] infinite combos - * - [ ] mass land destruction + * - [x] mass land destruction * - [x] extra turns * - [x] tutors * @@ -27,7 +27,7 @@ public class BracketLegalityLabel extends LegalityLabel { private static final String GROUP_GAME_CHANGES = "Game Changers"; private static final String GROUP_INFINITE_COMBOS = "Infinite Combos (unsupported)"; - private static final String GROUP_MASS_LAND_DESTRUCTION = "Mass Land Destruction (unsupported)"; + private static final String GROUP_MASS_LAND_DESTRUCTION = "Mass Land Destruction"; private static final String GROUP_EXTRA_TURN = "Extra Turns"; private static final String GROUP_TUTORS = "Tutors"; @@ -248,8 +248,20 @@ public class BracketLegalityLabel extends LegalityLabel { } private void collectMassLandDestruction(Deck deck) { - // TODO: implement + // https://mtg.wiki/page/Land_destruction + // https://draftsim.com/mtg-mass-land-destruction/ this.foundMassLandDestruction.clear(); + Stream.concat(deck.getCards().stream(), deck.getSideboard().stream()) + .filter(card -> card.getRules().stream() + .map(s -> s.toLowerCase(Locale.ENGLISH)) + .anyMatch(s -> (s.contains("destroy") || s.contains("sacrifice")) + && (s.contains("all") || s.contains("x target") || s.contains("{x} target")) + && isTextContainsLandName(s) + ) + ) + .map(Card::getName) + .sorted() + .forEach(this.foundMassLandDestruction::add); } private void collectExtraTurn(Deck deck) { @@ -287,4 +299,45 @@ public class BracketLegalityLabel extends LegalityLabel { || lowerText.contains("mountain card") || lowerText.contains("forest card"); } + + private boolean isTextContainsLandName(String lowerText) { + // TODO: add tests to find all cards from https://mtg.wiki/page/Land_destruction + // TODO: add tests + /* +// mass land destruction +Ajani Vengeant +Armageddon +Avalanche +Bend or Break +Boil +Boiling Seas +Boom // Bust +Burning of Xinye +Catastrophe +Decree of Annihilation +Desolation Angel +Devastation +Fall of the Thran +From the Ashes +Impending Disaster +Jokulhaups +Myojin of Infinite Rage +Numot, the Devastator +Obliterate +Orcish Settlers +Ravages of War +Ruination +Rumbling Crescendo +Scorched Earth +Tsunami +Wake of Destruction +Wildfire + */ + return lowerText.contains("lands") + || lowerText.contains("plains") + || lowerText.contains("island") + || lowerText.contains("swamp") + || lowerText.contains("mountain") + || lowerText.contains("forest"); + } } \ No newline at end of file