diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index b981a8cc4ab..a188b59d903 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -228,7 +228,8 @@ public final class CardRules implements ICardCharacteristics { } public boolean canBePartnerCommander() { - return canBeCommander() && (hasKeyword("Partner") || !this.partnerWith.isEmpty()); + return canBeCommander() && (hasKeyword("Partner") || !this.partnerWith.isEmpty() || + hasKeyword("Friends forever")); } public boolean canBeOathbreaker() { diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 76de92988d4..841fd40b747 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -259,6 +259,9 @@ public enum DeckFormat { } else if (a.getName().equals(b.getRules().getPartnerWith()) && b.getName().equals(a.getRules().getPartnerWith())) { // paired partner commander + } else if (a.getRules().hasKeyword("Friends forever") && + b.getRules().hasKeyword("Friends forever")) { + // Stranger Things Secret Lair gimmick partner commander } else { return "has an illegal commander partnership"; } 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 6d6601f2229..8d32022a3c1 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2086,7 +2086,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Foretell") // for the ones without cost || keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor") || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot") - || keyword.equals("Daybound") || keyword.equals("Nightbound")) { + || keyword.equals("Daybound") || keyword.equals("Nightbound") + || keyword.equals("Friends forever")) { sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); 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 d184c619c1d..ca576fe253c 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -85,6 +85,7 @@ public enum Keyword { FORETELL("Foretell", KeywordWithCost.class, false, "During your turn, you may pay {2} and exile this card from your hand face down. Cast it on a later turn for its foretell cost."), FORTIFY("Fortify", KeywordWithCost.class, false, "%s: Attach to target land you control. Fortify only as a sorcery."), FRENZY("Frenzy", KeywordWithAmount.class, false, "Whenever this creature attacks and isn't blocked, it gets +%d/+0 until end of turn."), + FRIENDS_FOREVER("Friends forever", Partner.class, true, "You can have two commanders if both have friends forever."), FUSE("Fuse", SimpleKeyword.class, true, "You may cast one or both halves of this card from your hand."), GRAFT("Graft", KeywordWithAmount.class, false, "This permanent enters the battlefield with {%d:+1/+1 counter} on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this permanent onto it."), GRAVESTORM("Gravestorm", SimpleKeyword.class, false, "When you cast this spell, copy it for each permanent that was put into a graveyard from the battlefield this turn. If the spell has any targets, you may choose new targets for any of the copies."), diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java index d02b173a8ce..4c148d3fa7e 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java @@ -411,7 +411,7 @@ public final class CardScriptParser { "CanBeEquippedBy", "Equipped", "Fortified", "HauntedBy", "notTributed", "madness", "Paired", "NotPaired", "PairedWith", "Above", "DirectlyAbove", "TopGraveyardCreature", - "BottomGraveyard", "TopLibrary", "Cloned", "DamagedBy", "Damaged", + "BottomGraveyard", "TopLibrary", "BottomLibrary", "Cloned", "DamagedBy", "Damaged", "sharesPermanentTypeWith", "canProduceSameManaTypeWith", "SecondSpellCastThisTurn", "ThisTurnCast", "withFlashback", "tapped", "untapped", "faceDown", "faceUp", "hasLevelUp", "DrawnThisTurn", "notDrawnThisTurn",