diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 2a9bb30ba4b..450f727c3e4 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -324,6 +324,12 @@ public final class CardRules implements ICardCharacteristics { } if (hasKeyword("Friends forever") && b.hasKeyword("Friends forever")) { legal = true; // Stranger Things Secret Lair gimmick partner commander + } + if (hasKeyword("Partner - Survivors") && b.hasKeyword("Partner - Survivors")) { + legal = true; // The Last of Us Secret Lair gimmick partner commander + } + if (hasKeyword("Partner - Father & Son") && b.hasKeyword("Partner - Father & Son")) { + legal = true; // God of War Secret Lair gimmick partner commander } if (hasKeyword("Choose a Background") && b.canBeBackground() || b.hasKeyword("Choose a Background") && canBeBackground()) { @@ -342,6 +348,7 @@ public final class CardRules implements ICardCharacteristics { } return canBeCommander() && (hasKeyword("Partner") || !this.partnerWith.isEmpty() || hasKeyword("Friends forever") || hasKeyword("Choose a Background") || + hasKeyword("Partner - Father & Son") || hasKeyword("Partner - Survivors") || hasKeyword("Doctor's companion") || isDoctor()); } 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 49894c670aa..35acfe1de7a 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2598,6 +2598,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot") || keyword.equals("Daybound") || keyword.equals("Nightbound") || keyword.equals("Friends forever") || keyword.equals("Choose a Background") + || keyword.equals("Partner - Father & Son") || keyword.equals("Partner - Survivors") || keyword.equals("Space sculptor") || keyword.equals("Doctor's companion") || keyword.equals("Start your engines")) { sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); 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 8a28b77cf5c..809b824c07f 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -141,6 +141,8 @@ public enum Keyword { OFFSPRING("Offspring", KeywordWithCost.class, false, "You may pay an additional %s as you cast this spell. If you do, when this creature enters, create a 1/1 token copy of it."), OVERLOAD("Overload", KeywordWithCost.class, false, "You may cast this spell for its overload cost. If you do, change its text by replacing all instances of \"target\" with \"each.\""), PARTNER("Partner", Partner.class, true, "You can have two commanders if both have partner."), + PARTNER_SURVIVOR("Partner - Survivors", Partner.class, true, "You can have two commanders if both have this ability."), + PARTNER_FATHER_AND_SON("Partner - Father & Son", Partner.class, true, "You can have two commanders if both have this ability."), PERSIST("Persist", SimpleKeyword.class, false, "When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it."), PHASING("Phasing", SimpleKeyword.class, true, "This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist."), PLOT("Plot", KeywordWithCost.class, false, "You may pay %s and exile this card from your hand. Cast it as a sorcery on a later turn without paying its mana cost. Plot only as a sorcery."), diff --git a/forge-gui/res/cardsfolder/upcoming/abby_merciless_soldier.txt b/forge-gui/res/cardsfolder/upcoming/abby_merciless_soldier.txt new file mode 100644 index 00000000000..d83e8604560 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/abby_merciless_soldier.txt @@ -0,0 +1,13 @@ +Name:Abby, Merciless Soldier +ManaCost:1 R G +Types:Legendary Creature Human Survivor +PT:4/4 +K:Partner - Survivors +T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When you cast this spell, create a number of 1/1 black Fungus Zombie creature tokens named Cordyceps Infected equal to the amount of mana spent to cast it. +SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ cordyceps_infected | TokenOwner$ You +SVar:X:Count$CastTotalManaSpent +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ DBChooseOpp | Layer$ Control | Description$ NICKNAME enters under the control of an opponent of your choice. +SVar:DBChooseOpp:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent to give control to | AILogic$ Curse | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | GainControl$ ChosenPlayer +DeckHas:Ability$Token & Type$Zombie|Fungus +Oracle:When you cast this spell, create a number of 1/1 black Fungus Zombie creature tokens named Cordyceps Infected equal to the amount of mana spent to cast it.\nAbby enters under the control of an opponent of your choice.\nPartner—Survivors (You can have two commanders if both have this ability.) diff --git a/forge-gui/res/cardsfolder/upcoming/aloy_savior_of_meridian.txt b/forge-gui/res/cardsfolder/upcoming/aloy_savior_of_meridian.txt new file mode 100644 index 00000000000..ae6ec383090 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aloy_savior_of_meridian.txt @@ -0,0 +1,11 @@ +Name:Aloy, Savior of Meridian +ManaCost:3 G U +Types:Legendary Creature Human Warrior +PT:3/5 +K:Vigilance +K:Reach +T:Mode$ AttackersDeclared | AttackingPlayer$ You | ValidAttackers$ Creature.Artifact+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDiscover | TriggerDescription$ In You, All Things Are Possible — Whenever one or more artifact creatures you control attack, discover X, where X is the greatest power among them. (Exile cards from the top of your library until you exile a nonland card with that mana value or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order.) +SVar:TrigDiscover:DB$ Discover | Num$ X +SVar:X:TriggerObjectsAttackers$GreatestPower +DeckNeeds:Type$Artifact & Type$Creature +Oracle:Vigilance, reach\nIn You, All Things Are Possible — Whenever one or more artifact creatures you control attack, discover X, where X is the greatest power among them. (Exile cards from the top of your library until you exile a nonland card with that mana value or less. Cast it without paying its mana cost or put it into your hand. Put the rest on the bottom in a random order.) diff --git a/forge-gui/res/cardsfolder/upcoming/atreus_impulsive_son.txt b/forge-gui/res/cardsfolder/upcoming/atreus_impulsive_son.txt new file mode 100644 index 00000000000..b6fc41bbc8d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/atreus_impulsive_son.txt @@ -0,0 +1,10 @@ +Name:Atreus, Impulsive Son +ManaCost:1 U R +Types:Legendary Creature God Archer +PT:2/4 +K:Reach +K:Partner - Father & Son +A:AB$ Draw | Cost$ 3 T | NumCards$ X | SubAbility$ DBDamage | SpellDescription$ Draw a card for each experience counter you have, then discard a card. +SVar:DBDamage:DB$ DealDamage | NumDmg$ 2 | Defined$ Opponent | SpellDescription$ CARDNAME deals 2 damage to each opponent. +SVar:X:Count$YourCountersExperience +Oracle:Reach\n{3}, {T}: Draw a card for each experience counter you have, then discard a card. Atreus, Impulsive Son deals 2 damage to each opponent.\nPartner-Father & son diff --git a/forge-gui/res/cardsfolder/upcoming/ellie_brick_master.txt b/forge-gui/res/cardsfolder/upcoming/ellie_brick_master.txt new file mode 100644 index 00000000000..2823c85f96f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ellie_brick_master.txt @@ -0,0 +1,9 @@ +Name:Ellie, Brick Master +ManaCost:1 R +Types:Legendary Creature Human Survivor +PT:2/1 +K:Partner - Survivors +T:Mode$ AttackersDeclaredOneTarget | AttackedTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Distract the Horde - Whenever a player attacks one of your opponents, that attacking player creates a tapped 1/1 black Fungus Zombie creature token named Cordyceps Infected that's attacking that opponent. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ cordyceps_infected | TokenOwner$ TriggeredAttackingPlayer | TokenTapped$ True | TokenAttacking$ TriggeredAttackedTarget +DeckHas:Ability$Token & Type$Zombie|Fungus +Oracle:Distract the Horde - Whenever a player attacks one of your opponents, that attacking player creates a tapped 1/1 black Fungus Zombie creature token named Cordyceps Infected that's attacking that opponent.\nPartner — Survivors (You can have two commanders if both have this ability.) diff --git a/forge-gui/res/cardsfolder/upcoming/ellie_vengeful_hunter.txt b/forge-gui/res/cardsfolder/upcoming/ellie_vengeful_hunter.txt new file mode 100644 index 00000000000..30b5001b11c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ellie_vengeful_hunter.txt @@ -0,0 +1,9 @@ +Name:Ellie, Vengeful Hunter +ManaCost:1 B R +Types:Legendary Creature Human Survivor +PT:3/1 +K:Partner - Survivors +A:AB$ DealDamage | Cost$ PayLife<2> Sac<1/Creature.Other/another creature> | NumDmg$ 2 | ValidTgts$ Player | SubAbility$ DBPump | SpellDescription$ NICKNAME deals 2 damage to target player and gains indestructible until end of turn. +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Indestructible +DeckHas:Ability$Sacrifice +Oracle:Pay 2 life, Sacrifice another creature: Ellie deals 2 damage to target player and gains indestructible until end of turn.\nPartner - Survivors (You can have two commanders if both have this ability.) diff --git a/forge-gui/res/cardsfolder/upcoming/jaws_relentless_predator.txt b/forge-gui/res/cardsfolder/upcoming/jaws_relentless_predator.txt new file mode 100644 index 00000000000..f54416fbd56 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/jaws_relentless_predator.txt @@ -0,0 +1,15 @@ +Name:Jaws, Relentless Predator +ManaCost:3 R R +Types:Legendary Creature Shark +PT:5/5 +K:Trample +K:Haste +T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, create that many Blood tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_blood_draw | TokenOwner$ You +SVar:X:TriggerCount$DamageAmount +T:Mode$ Sacrificed | ValidCard$ Artifact.nonCreature | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a noncreature artifact is sacrificed or destroyed, NICKNAME deals 1 damage to each opponent. +T:Mode$ Destroyed | ValidCard$ Artifact.nonCreature | Execute$ TrigDamage | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever a noncreature artifact is sacrificed or destroyed, NICKNAME deals 1 damage to each opponent. +SVar:TrigDamage:DB$ DealDamage | NumDmg$ 1 | Defined$ Opponent +DeckHints:Ability$Sacrifice|Token & Type$Blood|Treasure|Map|Clue +DeckHas:Ability$Token|Sacrifice & Type$Artifact|Blood +Oracle:Trample, haste\nWhenever Jaws deals combat damage to a player, create that many Blood tokens.\nWhenever a noncreature artifact is sacrificed or destroyed, Jaws deals 1 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/jin_sakai_ghost_of_tsushima.txt b/forge-gui/res/cardsfolder/upcoming/jin_sakai_ghost_of_tsushima.txt new file mode 100644 index 00000000000..28c9904ee1b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/jin_sakai_ghost_of_tsushima.txt @@ -0,0 +1,12 @@ +Name:Jin Sakai, Ghost of Tsushima +ManaCost:1 W U B +Types:Legendary Creature Human Samurai +PT:2/4 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigCharm | IsPresent$ Creature.attacking+Other | NoResolvingCheck$ True | PresentCompare$ EQ0 | TriggerDescription$ Whenever a creature you control attacks a player, if no other creatures are attacking that player, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ Standoff,Ghost +SVar:Standoff:DB$ Pump | Defined$ TriggeredAttackerLKICopy | KW$ Double Strike | SpellDescription$ Standoff — It gains double strike until end of turn. +SVar:Ghost:DB$ Effect | RememberObjects$ Self | ExileOnMoved$ Battlefield | StaticAbilities$ Unblockable | SpellDescription$ Ghost — It can't be blocked this turn. +SVar:Unblockable:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | Description$ EFFECTSOURCE can't be blocked this turn. +Oracle:Whenever Jin Sakai deals combat damage to a player, draw a card.\nWhenever a creature you control attacks a player, if no other creatures are attacking that player, choose one —-\n• Standoff — It gains double strike until end of turn.\n• Ghost — It can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/joel_resolute_survivor.txt b/forge-gui/res/cardsfolder/upcoming/joel_resolute_survivor.txt new file mode 100644 index 00000000000..d95aa4ce05d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/joel_resolute_survivor.txt @@ -0,0 +1,12 @@ +Name:Joel, Resolute Survivor +ManaCost:3 B G +Types:Legendary Creature Human Survivor +PT:4/4 +K:Menace +K:Partner - Survivors +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.token | Execute$ TrigPutCounter | ActivationLimit$ 1 | TriggerDescription$ Whenever a creature token dies, put a +1/+1 counter on NICKNAME and draw a card. This ability triggers only once each turn. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterNum$ 1 | CounterType$ P1P1 | SubAbility$ DBDraw +SVar:TrigDraw:DB$ Draw +DeckHas:Ability$Counters +DeckHints:Ability$Sacrifice|Token +Oracle:Menace\nWhenever a creature token dies, put a +1/+1 counter on Joel and draw a card. This ability triggers only once each turn.\nPartner — Survivors (You can have two commanders if both have this ability.) diff --git a/forge-gui/res/cardsfolder/upcoming/kratos_god_of_war.txt b/forge-gui/res/cardsfolder/upcoming/kratos_god_of_war.txt new file mode 100644 index 00000000000..ebdc6fd9082 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kratos_god_of_war.txt @@ -0,0 +1,10 @@ +Name:Kratos, God of War +ManaCost:R R R +Types:Legendary Creature God Warrior +PT:2/3 +K:Double Strike +S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Haste | Description$ All creatures have haste. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's end step, NICKNAME deals damage to that player equal to the number of creatures that player controls that didn't attack this turn. +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X +SVar:X:Count$Valid Creature.!attackedThisTurn+ActivePlayerCtrl +Oracle:Double strike\nAll creatures have haste.\nAt the beginning of each player's end step, Kratos deals damage to that player equal to the number of creatures that player controls that didn't attack this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/kratos_stoic_father.txt b/forge-gui/res/cardsfolder/upcoming/kratos_stoic_father.txt new file mode 100644 index 00000000000..c1cba612160 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kratos_stoic_father.txt @@ -0,0 +1,14 @@ +Name:Kratos, Stoic Father +ManaCost:2 R W +Types:Legendary Creature God Warrior +PT:4/4 +K:Partner - Father & Son +T:Mode$ AttackersDeclared | ValidAttackers$ God.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExperience | TriggerDescription$ Whenever you attack with one or more Gods and whenever a God dies, you get an experience counter. +T:Mode$ ChangesZone | ValidCard$ God | TriggerZones$ Battlefield | Secondary$ True | Destination$ Graveyard | Execute$ TrigExperience | TriggerDescription$ Whenever you attack with one or more Gods and whenever a God dies, you get an experience counter. +SVar:TrigExperience:DB$ PutCounter | Defined$ You | CounterType$ Experience | CounterNum$ 1 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a number of +1/+1 counters on target creature equal to the number of experience counters you have. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ X +SVar:X:Count$YourCountersExperience +DeckHas:Ability$Counters +DeckHints:Type$God +Oracle:Whenever you attack with one or more Gods and whenever a God dies, you get an experience counter.\nAt the beginning of your end step, put a number of +1/+1 counters on target creature equal to the number of experience counters you have.\nPartner-Father & son (You can have two commanders if both have this ability.) diff --git a/forge-gui/res/cardsfolder/upcoming/nathan_drake_treasure_hunter.txt b/forge-gui/res/cardsfolder/upcoming/nathan_drake_treasure_hunter.txt new file mode 100644 index 00000000000..2a035bb2972 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nathan_drake_treasure_hunter.txt @@ -0,0 +1,11 @@ +Name:Nathan Drake, Treasure Hunter +ManaCost:U B R +Types:Legendary Creature Human Rogue +PT:3/2 +K:First Strike +S:Mode$ ManaConvert | ValidPlayer$ You | ValidCard$ Card.YouDontOwn+YouCtrl | ValidSA$ Spell,Activated | ManaConversion$ AnyType->AnyColor | Description$ You may spend mana as though it were mana of any color to cast spells you don't own or to activate abilities of permanents you control but don't own. +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever NICKNAME attacks, exile the top card of each player's library. You may cast a spell from among those cards. +SVar:TrigExile:DB$ Dig | Defined$ Player | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBPlay +SVar:DBPlay:DB$ Play | Valid$ Card.IsRemembered | ValidSA$ Spell | ValidZone$ Exile | Controller$ You | Optional$ True | Amount$ 1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:First strike\nYou may spend mana as though it were mana of any color to cast spells you don't own or to activate abilities of permanents you control but don't own.\nWhenever Nathan Drake attacks, exile the top card of each player's library. You may cast a spell from among those cards. diff --git a/forge-gui/res/tokenscripts/cordyceps_infected.txt b/forge-gui/res/tokenscripts/cordyceps_infected.txt new file mode 100644 index 00000000000..52dad650b09 --- /dev/null +++ b/forge-gui/res/tokenscripts/cordyceps_infected.txt @@ -0,0 +1,6 @@ +Name:Cordyceps Infected +ManaCost:no cost +Colors:black +Types:Creature Fungus Zombie +PT:1/1 +Oracle: