Merge branch 'Card-Forge:master' into master

This commit is contained in:
Suthro
2022-06-17 22:47:44 -05:00
committed by GitHub
17 changed files with 47 additions and 38 deletions

View File

@@ -15,7 +15,6 @@ import forge.card.MagicColor;
import forge.card.mana.ManaAtom; import forge.card.mana.ManaAtom;
import forge.game.Game; import forge.game.Game;
import forge.game.GameEntity; import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
import forge.game.ability.effects.DetachedCardEffect; import forge.game.ability.effects.DetachedCardEffect;
import forge.game.card.Card; import forge.game.card.Card;
@@ -862,9 +861,7 @@ public abstract class GameState {
} }
if (sa.hasParam("RememberTargets")) { if (sa.hasParam("RememberTargets")) {
for (final GameObject o : sa.getTargets()) { sa.getHostCard().addRemembered(sa.getTargets());
sa.getHostCard().addRemembered(o);
}
} }
} }

View File

@@ -326,7 +326,7 @@ public class GameAction {
CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command); CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command);
for (final Card effCard : comCards) { for (final Card effCard : comCards) {
for (final ReplacementEffect re : effCard.getReplacementEffects()) { for (final ReplacementEffect re : effCard.getReplacementEffects()) {
if (re.hasParam("CommanderMoveReplacement") && effCard.getEffectSource().getName().equals(c.getRealCommander().getName())) { if (re.hasParam("CommanderMoveReplacement") && c.getMergedCards().contains(effCard.getEffectSource())) {
commanderEffect = effCard; commanderEffect = effCard;
break; break;
} }
@@ -1211,6 +1211,9 @@ public class GameAction {
} }
} }
// preList means that this is run by a pre Check with LKI objects
// in that case Always trigger should not Run
if (preList.isEmpty()) {
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
for (Card c : p.getCardsIn(ZoneType.Battlefield).threadSafeIterable()) { for (Card c : p.getCardsIn(ZoneType.Battlefield).threadSafeIterable()) {
if (!c.getController().equals(p)) { if (!c.getController().equals(p)) {
@@ -1228,9 +1231,6 @@ public class GameAction {
} }
} }
// preList means that this is run by a pre Check with LKI objects
// in that case Always trigger should not Run
if (preList.isEmpty()) {
final Map<AbilityKey, Object> runParams = AbilityKey.newMap(); final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
game.getTriggerHandler().runTrigger(TriggerType.Always, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.Always, runParams, false);
@@ -1245,6 +1245,8 @@ public class GameAction {
c.updateAbilityTextForView(); // only update keywords and text for view to avoid flickering c.updateAbilityTextForView(); // only update keywords and text for view to avoid flickering
} }
// TODO filter out old copies from zone change
if (runEvents && !affectedCards.isEmpty()) { if (runEvents && !affectedCards.isEmpty()) {
game.fireEvent(new GameEventCardStatsChanged(affectedCards)); game.fireEvent(new GameEventCardStatsChanged(affectedCards));
} }

View File

@@ -72,7 +72,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
} }
if (sa.hasParam("RememberSVarAmount")) { if (sa.hasParam("RememberSVarAmount")) {
delTrig.addRemembered(AbilityUtils.calculateAmount(host, host.getSVar(sa.getParam("RememberSVarAmount")), sa)); delTrig.addRemembered(AbilityUtils.calculateAmount(host, sa.getSVar(sa.getParam("RememberSVarAmount")), sa));
} }
if (sa.hasAdditionalAbility("Execute")) { if (sa.hasAdditionalAbility("Execute")) {

View File

@@ -67,7 +67,7 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect {
if (sa.hasParam("RememberSVarAmount")) { if (sa.hasParam("RememberSVarAmount")) {
immediateTrig.addRemembered(AbilityUtils.calculateAmount(host, immediateTrig.addRemembered(AbilityUtils.calculateAmount(host,
host.getSVar(sa.getParam("RememberSVarAmount")), sa)); sa.getSVar(sa.getParam("RememberSVarAmount")), sa));
} }
if (sa.hasAdditionalAbility("Execute")) { if (sa.hasAdditionalAbility("Execute")) {

View File

@@ -503,7 +503,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
if (game != null) { if (game != null) {
// update Type, color and keywords again if they have changed // update Type, color and keywords again if they have changed
if (!changedCardTypes.isEmpty()) { if (!changedCardTypes.isEmpty()) {
currentState.getView().updateType(currentState); updateTypesForView();;
} }
updateColorForView(); updateColorForView();

View File

@@ -2680,7 +2680,7 @@ public class CardFactoryUtil {
final String[] k = keyword.split(":"); final String[] k = keyword.split(":");
final Cost blitzCost = new Cost(k[1], false); final Cost blitzCost = new Cost(k[1], false);
final SpellAbility newSA = card.getFirstSpellAbility().copyWithDefinedCost(blitzCost); final SpellAbility newSA = card.getFirstSpellAbility().copyWithManaCostReplaced(host.getController(), blitzCost);
if (k.length > 2) { if (k.length > 2) {
newSA.getMapParams().put("ValidAfterStack", k[2]); newSA.getMapParams().put("ValidAfterStack", k[2]);

View File

@@ -3036,7 +3036,7 @@ public class Player extends GameEntity implements Comparable<Player> {
StaticAbility stAb = StaticAbility.create(addToHandAbility, eff, eff.getCurrentState(), true); StaticAbility stAb = StaticAbility.create(addToHandAbility, eff, eff.getCurrentState(), true);
stAb.setSVar("MoveToHand", moveToHand); stAb.setSVar("MoveToHand", moveToHand);
eff.addStaticAbility(addToHandAbility); eff.addStaticAbility(stAb);
return eff; return eff;
} }

View File

@@ -3,7 +3,7 @@ ManaCost:W
Types:Creature Human Soldier Types:Creature Human Soldier
PT:1/1 PT:1/1
K:Provoke K:Provoke
A:AB$ Effect | Cost$ 1 W | ReplacementEffects$ RPrevent1,RPrevent2 | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn. A:AB$ Effect | Cost$ 1 W | ReplacementEffects$ RPrevent1,RPrevent2 | RememberObjects$ Self | ExileOnMoved$ Battlefield | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn.
SVar:RPrevent1:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidSource$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt to and dealt by EFFECTSOURCE this turn. SVar:RPrevent1:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidSource$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt to and dealt by EFFECTSOURCE this turn.
SVar:RPrevent2:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidTarget$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt to and dealt by EFFECTSOURCE this turn. | Secondary$ True SVar:RPrevent2:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidTarget$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt to and dealt by EFFECTSOURCE this turn. | Secondary$ True
AI:RemoveDeck:All AI:RemoveDeck:All

View File

@@ -5,7 +5,7 @@ PT:2/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile another target creature or artifact until CARDNAME leaves the battlefield. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any type to cast that spell. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile another target creature or artifact until CARDNAME leaves the battlefield. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any type to cast that spell.
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other,Artifact.Other | TgtPrompt$ Select another target creature or artifact | Duration$ UntilHostLeavesPlay | RememberChanged$ True | SubAbility$ DBEffect SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other,Artifact.Other | TgtPrompt$ Select another target creature or artifact | Duration$ UntilHostLeavesPlay | RememberChanged$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup
SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreType$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may cast that card and you may spend mana as though it were mana of any type to cast it. SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreType$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card and you may spend mana as though it were mana of any type to cast it.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
SVar:NeedsToPlay:Artifact.OppCtrl,Creature.OppCtrl SVar:NeedsToPlay:Artifact.OppCtrl,Creature.OppCtrl

View File

@@ -5,7 +5,7 @@ K:Enchant creature
A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Pump A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Pump
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a fuse counter on CARDNAME. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a fuse counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ FUSE | CounterNum$ 1 SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ FUSE | CounterNum$ 1
T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Any | Destination$ Graveyard | Execute$ TrigDamage | TriggerDescription$ When enchanted creature dies, CARDNAME deals X damage to any target, where X is the number of fuse counters on CARDNAME. T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDamage | TriggerDescription$ When enchanted creature dies, CARDNAME deals X damage to any target, where X is the number of fuse counters on CARDNAME.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X
SVar:X:Count$CardCounters.FUSE SVar:X:Count$CardCounters.FUSE
Oracle:Enchant creature\nAt the beginning of your upkeep, you may put a fuse counter on Incendiary.\nWhen enchanted creature dies, Incendiary deals X damage to any target, where X is the number of fuse counters on Incendiary. Oracle:Enchant creature\nAt the beginning of your upkeep, you may put a fuse counter on Incendiary.\nWhen enchanted creature dies, Incendiary deals X damage to any target, where X is the number of fuse counters on Incendiary.

View File

@@ -3,7 +3,7 @@ ManaCost:1 B
Types:Creature Nightmare Horror Types:Creature Nightmare Horror
PT:1/1 PT:1/1
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMesmericExile | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals their hand and you choose a nonland card from it. Exile that card. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMesmericExile | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals their hand and you choose a nonland card from it. Exile that card.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigMesmericBounce | Secondary$ True | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to its owner's hand. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigMesmericBounce | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to its owner's hand.
SVar:TrigMesmericExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True SVar:TrigMesmericExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True
SVar:TrigMesmericBounce:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ Remembered | SubAbility$ DBMesmericCleanup SVar:TrigMesmericBounce:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ Remembered | SubAbility$ DBMesmericCleanup
SVar:DBMesmericCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBMesmericCleanup:DB$ Cleanup | ClearRemembered$ True

View File

@@ -3,7 +3,7 @@ ManaCost:2 R
Types:Creature Goblin Assassin Types:Creature Goblin Assassin
PT:2/1 PT:2/1
A:AB$ Pump | Cost$ T | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberObjects$ ThisTargetedCard | IsCurse$ True | SubAbility$ DBPump | StackDescription$ You choose {c:ThisTargetedCard} | SpellDescription$ You choose target creature an opponent controls, and that opponent chooses target creature. Flip a coin. If you win the flip, destroy the creature you chose. If you lose the flip, destroy the creature your opponent chose. A:AB$ Pump | Cost$ T | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberObjects$ ThisTargetedCard | IsCurse$ True | SubAbility$ DBPump | StackDescription$ You choose {c:ThisTargetedCard} | SpellDescription$ You choose target creature an opponent controls, and that opponent chooses target creature. Flip a coin. If you win the flip, destroy the creature you chose. If you lose the flip, destroy the creature your opponent chose.
SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TargetingPlayer$ Player.Opponent | IsCurse$ True | ImprintCards$ ThisTargetedCard | SubAbility$ DBFlip | StackDescription$ That player chooses {c:ThisTargetedCard} SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TargetingPlayer$ ParentTargetedController | IsCurse$ True | ImprintCards$ ThisTargetedCard | SubAbility$ DBFlip | StackDescription$ That player chooses {c:ThisTargetedCard}
SVar:DBFlip:DB$ FlipACoin | WinSubAbility$ DestroyRemembered | LoseSubAbility$ DestroyImprinted | SubAbility$ DBCleanup SVar:DBFlip:DB$ FlipACoin | WinSubAbility$ DestroyRemembered | LoseSubAbility$ DestroyImprinted | SubAbility$ DBCleanup
SVar:DestroyRemembered:DB$ Destroy | Defined$ Remembered SVar:DestroyRemembered:DB$ Destroy | Defined$ Remembered
SVar:DestroyImprinted:DB$ Destroy | Defined$ Imprinted SVar:DestroyImprinted:DB$ Destroy | Defined$ Imprinted

View File

@@ -2,7 +2,7 @@ Name:Searing Blaze
ManaCost:R R ManaCost:R R
Types:Instant Types:Instant
A:SP$ DealDamage | Cost$ R R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ SearingX | DamageMap$ True | SubAbility$ SearingDamage | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker and 1 damage to target creature that player or that planeswalker's controller controls. Landfall — If you had a land enter the battlefield under your control this turn, CARDNAME deals 3 damage to that player or planeswalker and 3 damage to that creature instead. A:SP$ DealDamage | Cost$ R R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ SearingX | DamageMap$ True | SubAbility$ SearingDamage | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker and 1 damage to target creature that player or that planeswalker's controller controls. Landfall — If you had a land enter the battlefield under your control this turn, CARDNAME deals 3 damage to that player or planeswalker and 3 damage to that creature instead.
SVar:SearingDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TargetedOrController | TgtPrompt$ Select target creature that player or that planeswalker's controller controls | NumDmg$ SearingX | SubAbility$ DBDamageResolve SVar:SearingDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy ParentTargetedController,Creature.ControlledBy ParentTarget | TgtPrompt$ Select target creature that player or that planeswalker's controller controls | NumDmg$ SearingX | SubAbility$ DBDamageResolve
SVar:DBDamageResolve:DB$ DamageResolve SVar:DBDamageResolve:DB$ DamageResolve
SVar:SearingX:Count$Landfall.3.1 SVar:SearingX:Count$Landfall.3.1
Oracle:Searing Blaze deals 1 damage to target player or planeswalker and 1 damage to target creature that player or that planeswalker's controller controls.\nLandfall — If you had a land enter the battlefield under your control this turn, Searing Blaze deals 3 damage to that player or planeswalker and 3 damage to that creature instead. Oracle:Searing Blaze deals 1 damage to target player or planeswalker and 1 damage to target creature that player or that planeswalker's controller controls.\nLandfall — If you had a land enter the battlefield under your control this turn, Searing Blaze deals 3 damage to that player or planeswalker and 3 damage to that creature instead.

View File

@@ -3,6 +3,6 @@ ManaCost:3
Types:Artifact Types:Artifact
K:ETBReplacement:Other:ChooseCT K:ETBReplacement:Other:ChooseCT
SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type.
S:Mode$ ReduceCost | ValidCard$ Creature.ChosenType | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Creature spells of the chosen type cost {2} less to cast. S:Mode$ ReduceCost | ValidCard$ Creature.ChosenType | Type$ Spell | Amount$ 2 | Description$ Creature spells of the chosen type cost {2} less to cast.
AI:RemoveDeck:Random AI:RemoveDeck:Random
Oracle:As Urza's Incubator enters the battlefield, choose a creature type.\nCreature spells of the chosen type cost {2} less to cast. Oracle:As Urza's Incubator enters the battlefield, choose a creature type.\nCreature spells of the chosen type cost {2} less to cast.

View File

@@ -6,6 +6,7 @@ K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigRoll | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, roll a d20. When you do, put X +1/+1 counters on each of up to two target creatures, where X is the result. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigRoll | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, roll a d20. When you do, put X +1/+1 counters on each of up to two target creatures, where X is the result.
SVar:TrigRoll:DB$ RollDice | ResultSVar$ Result | Sides$ 20 | SubAbility$ DBImmediateTrigPutCounter SVar:TrigRoll:DB$ RollDice | ResultSVar$ Result | Sides$ 20 | SubAbility$ DBImmediateTrigPutCounter
SVar:DBImmediateTrigPutCounter:DB$ ImmediateTrigger | Execute$ TrigPutCounter | RememberSVarAmount$ Result | TriggerDescription$ When you do, put X +1/+1 counters on each of up to two target creatures, where X is the result. SVar:DBImmediateTrigPutCounter:DB$ ImmediateTrigger | Execute$ TrigPutCounter | RememberSVarAmount$ Result | TriggerDescription$ When you do, put X +1/+1 counters on each of up to two target creatures, where X is the result.
SVar:TrigPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | CounterNum$ Result SVar:TrigPutCounter:DB$ PutCounter | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | CounterNum$ X
SVar:X:Count$TriggerRememberAmount
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:Flying\nWhenever Ancient Bronze Dragon deals combat damage to a player, roll a d20. When you do, put X +1/+1 counters on each of up to two target creatures, where X is the result. Oracle:Flying\nWhenever Ancient Bronze Dragon deals combat damage to a player, roll a d20. When you do, put X +1/+1 counters on each of up to two target creatures, where X is the result.

View File

@@ -4,6 +4,6 @@ Types:Legendary Creature Dragon Spirit
PT:5/5 PT:5/5
K:Flying K:Flying
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSkipPhase | TriggerDescription$ When CARDNAME dies, target player skips their next untap step. Tap up to five target permanents that player controls. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSkipPhase | TriggerDescription$ When CARDNAME dies, target player skips their next untap step. Tap up to five target permanents that player controls.
SVar:TrigSkipPhase:DB$ SkipPhase | ValidTgts$ Player | Step$ Untap | IsCurse$ True | SubAbility$ TrigTap SVar:TrigSkipPhase:DB$ SkipPhase | ValidTgts$ Player | Step$ Untap | RememberOriginalTargets$ True | IsCurse$ True | SubAbility$ TrigTap
SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 5 | TargetsWithDefinedController$ ParentTarget | ValidTgts$ Permanent SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ 5 | ValidTgts$ Permanent.ControlledBy ParentTarget,Permanent.ControlledBy Remembered
Oracle:Flying\nWhen Yosei, the Morning Star dies, target player skips their next untap step. Tap up to five target permanents that player controls. Oracle:Flying\nWhen Yosei, the Morning Star dies, target player skips their next untap step. Tap up to five target permanents that player controls.

View File

@@ -717,6 +717,15 @@ public class DeckgenUtil {
List<PaperCard> partners = new ArrayList<>(); List<PaperCard> partners = new ArrayList<>();
for (PaperCard c : preSelectedCards) { for (PaperCard c : preSelectedCards) {
if (c.getRules().canBePartnerCommander()) { if (c.getRules().canBePartnerCommander()) {
if (commander.getRules().hasKeyword("Partner") && commander.getRules().getPartnerWith().isEmpty() && c.getRules().hasKeyword("Partner") && c.getRules().getPartnerWith().isEmpty())
partners.add(c);
else if (commander.getRules().getPartnerWith().equals(c.getName()) && c.getRules().getPartnerWith().equals(commander.getName()))
partners.add(c);
else if (commander.getRules().hasKeyword("Friends forever") && c.getRules().hasKeyword("Friends forever"))
partners.add(c);
else if (commander.getRules().hasKeyword("Choose a Background") && c.getRules().canBeBackground())
partners.add(c);
else if (c.getRules().hasKeyword("Choose a Background") && commander.getRules().canBeBackground())
partners.add(c); partners.add(c);
} }
} }