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/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(); 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 "); } 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..3f73cc9db33 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) { @@ -243,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; } @@ -638,6 +666,7 @@ public final class StaticAbilityContinuous { } return true; } + return false; } }); 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} 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.)