From 412cadf63ae86903fecbc45c4296b0297045f713 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Nov 2020 14:38:23 -0500 Subject: [PATCH 1/8] commanders_plate.txt --- forge-gui/res/cardsfolder/upcoming/commanders_plate.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/commanders_plate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/commanders_plate.txt b/forge-gui/res/cardsfolder/upcoming/commanders_plate.txt new file mode 100644 index 00000000000..a5686c36dbf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/commanders_plate.txt @@ -0,0 +1,7 @@ +Name:Commander's Plate +ManaCost:1 +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddToughness$ 3 | AddKeyword$ Protection from NotCommanderColorID | Description$ Equipped creature gets +3/+3 and has protection from each color that's not in your commander's color identity. +K:Equip:3:Creature.IsCommander+YouCtrl:commander +K:Equip:5 +Oracle:Equipped creature gets +3/+3 and has protection from each color that's not in your commander's color identity.\nEquip commander {3}\nEquip {5} From 940e95781c6183cec666254550ad2b77d6169a58 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Nov 2020 14:41:06 -0500 Subject: [PATCH 2/8] add ColorSets "getCommanderColorID" and "getNotCommanderColorID" to Player.java --- .../main/java/forge/game/player/Player.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) 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 7bc1152b202..52317aac0e0 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -24,6 +24,7 @@ import forge.ImageKeys; import forge.LobbyPlayer; import forge.card.CardStateName; import forge.card.CardType; +import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; @@ -2760,6 +2761,26 @@ public class Player extends GameEntity implements Comparable { return damage == null ? 0 : damage.intValue(); } + public ColorSet getCommanderColorID() { + if (commanders.isEmpty()) { + return null; + } + byte ci = 0; + for (final Card c : commanders) { + ci |= c.getRules().getColorIdentity().getColor(); + } + ColorSet identity = ColorSet.fromMask(ci); + return identity; + } + + public ColorSet getNotCommanderColorID() { + if (commanders.isEmpty()) { + return null; + } + ColorSet identity = getCommanderColorID(); + return identity.inverse(); + } + public int getCommanderCast(Card commander) { Integer cast = commanderCast.get(commander); return cast == null ? 0 : cast.intValue(); From 34a21d309b8cd77e65e3c756d364d8431d3796f5 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Nov 2020 14:44:18 -0500 Subject: [PATCH 3/8] add keyword "Protection from CommanderColorID" and "Protection from NotCommanderColorID" support to StaticAbilityContinuous.java --- .../StaticAbilityContinuous.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index e2e5be9066f..13e6bf0e81f 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -632,12 +632,29 @@ public final class StaticAbilityContinuous { } } // replace one Keyword with list of keywords - if (input.startsWith("Protection") && input.contains("CardColors")) { - for (Byte color : affectedCard.determineColor()) { - extraKeywords.add(input.replace("CardColors", MagicColor.toLongString(color))); + if (input.startsWith("Protection")) { + if (input.contains("CardColors")) { + for (Byte color : affectedCard.determineColor()) { + extraKeywords.add(input.replace("CardColors", MagicColor.toLongString(color))); + } + return true; + } + if (input.contains("CommanderColorID")) { + if (!affectedCard.getController().getCommanders().isEmpty()) { + if (input.contains("NotCommanderColorID")) { + for (Byte color : affectedCard.getController().getNotCommanderColorID()) { + extraKeywords.add(input.replace("NotCommanderColorID", MagicColor.toLongString(color))); + } + return true; + } else for (Byte color : affectedCard.getController().getCommanderColorID()) { + extraKeywords.add(input.replace("CommanderColorID", MagicColor.toLongString(color))); + } + return true; + } + return true; } - return true; } + return false; } }); From ed7955306abc389addb062b5bdde4af077daaa34 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Nov 2020 14:53:12 -0500 Subject: [PATCH 4/8] streamline other Commander color identity references --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 7 +------ .../java/forge/game/spellability/AbilityManaPart.java | 8 +------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 463fbaeb0cc..0053e0e1dad 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1109,12 +1109,7 @@ public class CardFactoryUtil { } if (sq[0].equals("ColorsColorIdentity")) { - byte ci = 0; - List commanders = c.getController().getCommanders(); - for (final Card comm : commanders) { - ci |= comm.getRules().getColorIdentity().getColor(); - } - return doXMath(ColorSet.fromMask(ci).countColors(), m, c); + return doXMath(c.getController().getCommanderColorID().countColors(), m, c); } if (sq[0].contains("CreatureType")) { diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index ddee3945b53..0b5ff4626ef 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -615,14 +615,8 @@ public class AbilityManaPart implements java.io.Serializable { if (commanders.isEmpty()) { return ""; } - - byte ci = 0; - for (final Card c : commanders) { - ci |= c.getRules().getColorIdentity().getColor(); - } - StringBuilder sb = new StringBuilder(); - ColorSet identity = ColorSet.fromMask(ci); + ColorSet identity = getSourceCard().getController().getCommanderColorID(); if (identity.hasWhite()) { sb.append("W "); } if (identity.hasBlue()) { sb.append("U "); } if (identity.hasBlack()) { sb.append("B "); } From a9c1542d2482ec2ecfec1545d71e1a27f79210e9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Nov 2020 11:56:04 -0500 Subject: [PATCH 5/8] move Commander color ID keyword builder to correct spot --- .../StaticAbilityContinuous.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 13e6bf0e81f..cb684eff919 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -232,7 +232,20 @@ public final class StaticAbilityContinuous { } return true; } - + if (input.contains("CommanderColorID")) { + if (!hostCard.getController().getCommanders().isEmpty()) { + if (input.contains("NotCommanderColorID")) { + for (Byte color : hostCard.getController().getNotCommanderColorID()) { + newKeywords.add(input.replace("NotCommanderColorID", MagicColor.toLongString(color))); + } + return true; + } else for (Byte color : hostCard.getController().getCommanderColorID()) { + newKeywords.add(input.replace("CommanderColorID", MagicColor.toLongString(color))); + } + return true; + } + return true; + } // two variants for Red vs. red in keyword if (input.contains("ColorsYouCtrl") || input.contains("colorsYouCtrl")) { for (byte color : colorsYouCtrl) { @@ -632,27 +645,11 @@ public final class StaticAbilityContinuous { } } // replace one Keyword with list of keywords - if (input.startsWith("Protection")) { - if (input.contains("CardColors")) { - for (Byte color : affectedCard.determineColor()) { - extraKeywords.add(input.replace("CardColors", MagicColor.toLongString(color))); - } - return true; - } - if (input.contains("CommanderColorID")) { - if (!affectedCard.getController().getCommanders().isEmpty()) { - if (input.contains("NotCommanderColorID")) { - for (Byte color : affectedCard.getController().getNotCommanderColorID()) { - extraKeywords.add(input.replace("NotCommanderColorID", MagicColor.toLongString(color))); - } - return true; - } else for (Byte color : affectedCard.getController().getCommanderColorID()) { - extraKeywords.add(input.replace("CommanderColorID", MagicColor.toLongString(color))); - } - return true; - } - return true; + if (input.startsWith("Protection") && input.contains("CardColors")) { + for (Byte color : affectedCard.determineColor()) { + extraKeywords.add(input.replace("CardColors", MagicColor.toLongString(color))); } + return true; } return false; From dcf6537e32b9ae9ca29e71ddde72aec4aaa4c85b Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Nov 2020 11:57:39 -0500 Subject: [PATCH 6/8] rebbec_architect_of_ascension.txt --- .../upcoming/rebbec_architect_of_ascension.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/rebbec_architect_of_ascension.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rebbec_architect_of_ascension.txt b/forge-gui/res/cardsfolder/upcoming/rebbec_architect_of_ascension.txt new file mode 100644 index 00000000000..b2e4e930381 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rebbec_architect_of_ascension.txt @@ -0,0 +1,8 @@ +Name:Rebbec, Architect of Ascension +ManaCost:3 W +Types:Legendary Creature Human Artificer +PT:3/4 +S:Mode$ Continuous | Affected$ Artifact.YouCtrl | AddKeyword$ Protection from EachCMCAmongDefined | KeywordDefined$ Artifact.YouCtrl | Description$ Artifacts you control have protection from each converted mana cost among artifacts you control. +DeckNeeds:Type$Artifact +K:Partner +Oracle:Artifacts you control have protection from each converted mana cost among artifacts you control.\nPartner (You can have two commanders if both have partner.) From ab8b3e7a0910487f6c11a8f96720f9c343553df3 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Nov 2020 12:00:17 -0500 Subject: [PATCH 7/8] add EachCMCAmongDefined multiple keyword builder to StaticAbilityContinuous --- .../staticability/StaticAbilityContinuous.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index cb684eff919..5bab1e7375b 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -651,6 +651,21 @@ public final class StaticAbilityContinuous { } return true; } + if (input.contains("EachCMCAmongDefined")) { + String keywordDefined = params.get("KeywordDefined"); + CardCollectionView definedCards = game.getCardsIn(ZoneType.Battlefield); + definedCards = CardLists.getValidCards(definedCards, keywordDefined, hostCard.getController(), + hostCard, null); + for (Card c : definedCards) { + final int cmc = c.getCMC(); + String newKW = (input.replace(" from EachCMCAmongDefined", ":Card.cmcEQ" + + (cmc) + ":Protection from converted mana cost " + (cmc))); + if (!extraKeywords.contains(newKW)) { + extraKeywords.add(newKW); + } + } + return true; + } return false; } From 59144873b921bcb5763bd4c4a226093efbc50976 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Nov 2020 14:42:23 -0500 Subject: [PATCH 8/8] move EachCMCAmongDefined up as well --- .../StaticAbilityContinuous.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 5bab1e7375b..3f73cc9db33 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -256,6 +256,21 @@ public final class StaticAbilityContinuous { } return true; } + if (input.contains("EachCMCAmongDefined")) { + String keywordDefined = params.get("KeywordDefined"); + CardCollectionView definedCards = game.getCardsIn(ZoneType.Battlefield); + definedCards = CardLists.getValidCards(definedCards, keywordDefined, hostCard.getController(), + hostCard, null); + for (Card c : definedCards) { + final int cmc = c.getCMC(); + String y = (input.replace(" from EachCMCAmongDefined", ":Card.cmcEQ" + + (cmc) + ":Protection from converted mana cost " + (cmc))); + if (!newKeywords.contains(y)) { + newKeywords.add(y); + } + } + return true; + } return false; } @@ -651,21 +666,6 @@ public final class StaticAbilityContinuous { } return true; } - if (input.contains("EachCMCAmongDefined")) { - String keywordDefined = params.get("KeywordDefined"); - CardCollectionView definedCards = game.getCardsIn(ZoneType.Battlefield); - definedCards = CardLists.getValidCards(definedCards, keywordDefined, hostCard.getController(), - hostCard, null); - for (Card c : definedCards) { - final int cmc = c.getCMC(); - String newKW = (input.replace(" from EachCMCAmongDefined", ":Card.cmcEQ" - + (cmc) + ":Protection from converted mana cost " + (cmc))); - if (!extraKeywords.contains(newKW)) { - extraKeywords.add(newKW); - } - } - return true; - } return false; }