Fix Baeloth and some others

This commit is contained in:
tool4EvEr
2022-07-24 11:49:37 +02:00
parent 0eabb47003
commit c86c1d7c1b
16 changed files with 40 additions and 59 deletions

View File

@@ -131,9 +131,9 @@ public class Game {
private Map<Player, Card> topLibsCast = Maps.newHashMap(); private Map<Player, Card> topLibsCast = Maps.newHashMap();
private Map<Card, Integer> facedownWhileCasting = Maps.newHashMap(); private Map<Card, Integer> facedownWhileCasting = Maps.newHashMap();
private Player monarch = null; private Player monarch;
private Player initiative = null; private Player initiative;
private Player monarchBeginTurn = null; private Player monarchBeginTurn;
private Player startingPlayer; private Player startingPlayer;
private Direction turnOrder = Direction.getDefaultDirection(); private Direction turnOrder = Direction.getDefaultDirection();

View File

@@ -665,13 +665,6 @@ public class AbilityUtils {
for (final SpellAbility s : saList) { for (final SpellAbility s : saList) {
tgtList.addAll(getDefinedCards(s.getHostCard(), "Targeted", s)); tgtList.addAll(getDefinedCards(s.getHostCard(), "Targeted", s));
// Check sub-abilities, so that modal cards like Abzan Charm are correctly handled.
// TODO: Should this be done in a more general place, like in getDefinedCards()?
AbilitySub abSub = s.getSubAbility();
while (abSub != null) {
tgtList.addAll(getDefinedCards(abSub.getHostCard(), "Targeted", abSub));
abSub = abSub.getSubAbility();
}
} }
val = handlePaid(tgtList, calcX[1], card, ability); val = handlePaid(tgtList, calcX[1], card, ability);
} }

View File

@@ -261,6 +261,6 @@ public class DigUntilEffect extends SpellAbilityEffect {
game.fireEvent(new GameEventCombatChanged()); game.fireEvent(new GameEventCombatChanged());
} }
table.triggerChangesZoneAll(game, sa); table.triggerChangesZoneAll(game, sa);
} // end resolve }
} }

View File

@@ -6744,6 +6744,10 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
return new PlayerCollection(goad.values()); // 701.38d return new PlayerCollection(goad.values()); // 701.38d
} }
public final Map<Long, Player> getGoadMap() {
return goad;
}
/** /**
* Returns the last known zone information for the card. If the card is a LKI copy of another card, * Returns the last known zone information for the card. If the card is a LKI copy of another card,
* then it stores the relevant information in savedLastKnownZone, which is returned. If the card is * then it stores the relevant information in savedLastKnownZone, which is returned. If the card is

View File

@@ -1792,7 +1792,7 @@ public class CardFactoryUtil {
//upkeep trigger //upkeep trigger
StringBuilder upkeepTrig = new StringBuilder(); StringBuilder upkeepTrig = new StringBuilder();
upkeepTrig.append("Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Exile "); upkeepTrig.append("Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Exile");
upkeepTrig.append(" | IsPresent$ Card.Self+suspended | PresentZone$ Exile"); upkeepTrig.append(" | IsPresent$ Card.Self+suspended | PresentZone$ Exile");
// Mark this trigger as Secondary, so it's not displayed twice // Mark this trigger as Secondary, so it's not displayed twice
upkeepTrig.append(" | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, if this card is suspended, remove a time counter from it"); upkeepTrig.append(" | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, if this card is suspended, remove a time counter from it");
@@ -1805,7 +1805,7 @@ public class CardFactoryUtil {
//play trigger //play trigger
StringBuilder playTrig = new StringBuilder(); StringBuilder playTrig = new StringBuilder();
playTrig.append("Mode$ CounterRemoved | TriggerZones$ Exile | ValidCard$ Card.Self | CounterType$ TIME | NewCounterAmount$ 0 | Secondary$ True "); playTrig.append("Mode$ CounterRemoved | TriggerZones$ Exile | ValidCard$ Card.Self | CounterType$ TIME | NewCounterAmount$ 0 | Secondary$ True");
playTrig.append(" | TriggerDescription$ When the last time counter is removed from this card, if it's exiled, play it without paying its mana cost if able. "); playTrig.append(" | TriggerDescription$ When the last time counter is removed from this card, if it's exiled, play it without paying its mana cost if able. ");
playTrig.append("If you can't, it remains exiled. If you cast a creature spell this way, it gains haste until you lose control of the spell or the permanent it becomes."); playTrig.append("If you can't, it remains exiled. If you cast a creature spell this way, it gains haste until you lose control of the spell or the permanent it becomes.");

View File

@@ -321,6 +321,8 @@ public final class CardUtil {
newCopy.setCombatLKI(in.getGame().getCombat().saveLKI(newCopy)); newCopy.setCombatLKI(in.getGame().getCombat().saveLKI(newCopy));
} }
newCopy.getGoadMap().putAll(in.getGoadMap());
return newCopy; return newCopy;
} }

View File

@@ -1919,27 +1919,11 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
if (splitTargetRestrictions != null) { if (splitTargetRestrictions != null) {
// TODO Ensure that spells with subabilities are processed correctly // TODO Ensure that spells with subabilities are processed correctly
TargetChoices matchTgt = topSA.getTargets();
if (matchTgt == null) {
return false;
}
boolean result = false; boolean result = false;
SpellAbility subAb = topSA;
for (final GameObject o : matchTgt) { while (subAb != null && !result) {
if (o.isValid(splitTargetRestrictions.split(","), getActivatingPlayer(), getHostCard(), this)) { if (subAb.usesTargeting()) {
result = true; TargetChoices matchTgt = subAb.getTargets();
break;
}
}
// spells with subabilities
if (!result) {
AbilitySub subAb = topSA.getSubAbility();
while (subAb != null) {
if (subAb.getTargetRestrictions() != null) {
matchTgt = subAb.getTargets();
if (matchTgt == null) { if (matchTgt == null) {
continue; continue;
} }
@@ -1952,7 +1936,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
} }
subAb = subAb.getSubAbility(); subAb = subAb.getSubAbility();
} }
}
if (!result) { if (!result) {
return false; return false;

View File

@@ -44,7 +44,6 @@ public class StaticAbilityActivateAbilityAsIfHaste {
} }
public static boolean applyCanActivateAbility(final StaticAbility stAb, final Card card) { public static boolean applyCanActivateAbility(final StaticAbility stAb, final Card card) {
if (!stAb.matchesValidParam("ValidCard", card)) { if (!stAb.matchesValidParam("ValidCard", card)) {
return false; return false;
} }

View File

@@ -2,8 +2,8 @@ Name:Archelos, Lagoon Mystic
ManaCost:1 B G U ManaCost:1 B G U
Types:Legendary Creature Turtle Shaman Types:Legendary Creature Turtle Shaman
PT:2/4 PT:2/4
R:Event$ Moved | ValidCard$ Permanent | Destination$ Battlefield | IsPresent$ Card.Self+tapped | ReplaceWith$ ETBTapped | ActiveZones$ Battlefield | Description$ As long as CARDNAME is tapped, other permanents enter the battlefield tapped. R:Event$ Moved | ValidCard$ Permanent | Destination$ Battlefield | IsPresent$ Card.Self+tapped | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ As long as CARDNAME is tapped, other permanents enter the battlefield tapped.
SVar:ETBTapped:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Tapped$ True | Defined$ ReplacedCard SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard
R:Event$ Moved | ValidCard$ Permanent | Destination$ Battlefield | IsPresent$ Card.Self+untapped | ReplaceWith$ ETBUntapped | ActiveZones$ Battlefield | Description$ As long as NICKNAME is untapped, other permanents enter the battlefield untapped. R:Event$ Moved | ValidCard$ Permanent | Destination$ Battlefield | IsPresent$ Card.Self+untapped | ReplaceWith$ ETBUntapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ As long as NICKNAME is untapped, other permanents enter the battlefield untapped.
SVar:ETBUntapped:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Untapped$ True | Defined$ ReplacedCard SVar:ETBUntapped:DB$ Untap | ETB$ True | Defined$ ReplacedCard
Oracle:As long as Archelos, Lagoon Mystic is tapped, other permanents enter the battlefield tapped.\nAs long as Archelos is untapped, other permanents enter the battlefield untapped. Oracle:As long as Archelos, Lagoon Mystic is tapped, other permanents enter the battlefield tapped.\nAs long as Archelos is untapped, other permanents enter the battlefield untapped.

View File

@@ -4,6 +4,6 @@ Types:Legendary Creature Bird
PT:1/3 PT:1/3
K:Flying K:Flying
K:Partner K:Partner
S:Mode$ RaiseCost | ValidTarget$ Card.IsCommander+YouCtrl | Activator$ Opponent | Type$ Spell | Amount$ 3 | Description$ Spells your opponents cast that target one or more commanders you control cost {3} more to cast. S:Mode$ RaiseCost | ValidTarget$ Card.IsCommander+YouCtrl+inZoneBattlefield | Activator$ Opponent | Type$ Spell | Amount$ 3 | Description$ Spells your opponents cast that target one or more commanders you control cost {3} more to cast.
AI:RemoveDeck:NonCommander AI:RemoveDeck:NonCommander
Oracle:Flying\nSpells your opponents cast that target one or more commanders you control cost {3} more to cast.\nPartner (You can have two commanders if both have partner.) Oracle:Flying\nSpells your opponents cast that target one or more commanders you control cost {3} more to cast.\nPartner (You can have two commanders if both have partner.)

View File

@@ -2,7 +2,7 @@ Name:Kasmina, Enigmatic Mentor
ManaCost:3 U ManaCost:3 U
Types:Legendary Planeswalker Kasmina Types:Legendary Planeswalker Kasmina
Loyalty:5 Loyalty:5
S:Mode$ RaiseCost | ValidTarget$ Creature.YouOwn+inZoneBattlefield | Activator$ Player.Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target a creature or planeswalker you control cost {2} more to cast. S:Mode$ RaiseCost | ValidTarget$ Creature.YouCtrl+inZoneBattlefield,Planeswalker.YouCtrl+inZoneBattlefield | Activator$ Player.Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target a creature or planeswalker you control cost {2} more to cast.
A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ u_2_2_wizard | TokenOwner$ You | SubAbility$ DBDraw | SpellDescription$ Create a 2/2 blue Wizard creature token. Draw a card, then discard a card. A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ u_2_2_wizard | TokenOwner$ You | SubAbility$ DBDraw | SpellDescription$ Create a 2/2 blue Wizard creature token. Draw a card, then discard a card.
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1

View File

@@ -2,6 +2,6 @@ Name:Kopala, Warden of Waves
ManaCost:1 U U ManaCost:1 U U
Types:Legendary Creature Merfolk Wizard Types:Legendary Creature Merfolk Wizard
PT:2/2 PT:2/2
S:Mode$ RaiseCost | ValidTarget$ Creature.Merfolk+YouCtrl | Activator$ Player.Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target a Merfolk you control cost {2} more to cast. S:Mode$ RaiseCost | ValidTarget$ Creature.Merfolk+YouCtrl+inZoneBattlefield | Activator$ Player.Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target a Merfolk you control cost {2} more to cast.
S:Mode$ RaiseCost | ValidTarget$ Creature.Merfolk+YouCtrl | Activator$ Player.Opponent | Type$ Ability | Amount$ 2 | Description$ Abilities your opponents activate that target a Merfolk you control cost {2} more to activate. S:Mode$ RaiseCost | ValidTarget$ Creature.Merfolk+YouCtrl+inZoneBattlefield | Activator$ Player.Opponent | Type$ Ability | Amount$ 2 | Description$ Abilities your opponents activate that target a Merfolk you control cost {2} more to activate.
Oracle:Spells your opponents cast that target a Merfolk you control cost {2} more to cast.\nAbilities your opponents activate that target a Merfolk you control cost {2} more to activate. Oracle:Spells your opponents cast that target a Merfolk you control cost {2} more to cast.\nAbilities your opponents activate that target a Merfolk you control cost {2} more to activate.

View File

@@ -5,7 +5,7 @@ PT:2/3
K:Flying K:Flying
A:AB$ Effect | Cost$ 0 | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | TgtZone$ Graveyard | TgtPrompt$ Select target instant or sorcery card in your graveyard | ActivationLimit$ 1 | RememberObjects$ Targeted | StaticAbilities$ MayPlay,RaiseCost | ReplacementEffects$ ReplaceGraveyard | SubAbility$ DBCleanup | SpellDescription$ You may cast target instant or sorcery card from your graveyard this turn. If that spell doesn't target a creature you control, it costs {8} more to cast this way. If that spell would be put into your graveyard, exile it instead. Activate only once each turn. (You still pay the spell's costs. Timing rules for the spell still apply.) A:AB$ Effect | Cost$ 0 | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | TgtZone$ Graveyard | TgtPrompt$ Select target instant or sorcery card in your graveyard | ActivationLimit$ 1 | RememberObjects$ Targeted | StaticAbilities$ MayPlay,RaiseCost | ReplacementEffects$ ReplaceGraveyard | SubAbility$ DBCleanup | SpellDescription$ You may cast target instant or sorcery card from your graveyard this turn. If that spell doesn't target a creature you control, it costs {8} more to cast this way. If that spell would be put into your graveyard, exile it instead. Activate only once each turn. (You still pay the spell's costs. Timing rules for the spell still apply.)
SVar:MayPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may cast target instant or sorcery card from your graveyard this turn. (You still pay the spell's costs. Timing rules for the spell still apply.) SVar:MayPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may cast target instant or sorcery card from your graveyard this turn. (You still pay the spell's costs. Timing rules for the spell still apply.)
SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.IsRemembered | ValidTarget$ Creature.YouCtrl | UnlessValidTarget$ True | Activator$ You | Type$ Spell | Amount$ 8 | EffectZone$ Command | Description$ If that spell doesn't target a creature you control, it costs {8} more to cast this way. SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.IsRemembered | ValidTarget$ Creature.YouCtrl+inZoneBattlefield | UnlessValidTarget$ True | Activator$ You | Type$ Spell | Amount$ 8 | EffectZone$ Command | Description$ If that spell doesn't target a creature you control, it costs {8} more to cast this way.
SVar:ReplaceGraveyard:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Graveyard | ReplaceWith$ MoveExile | Description$ If that spell would be put into your graveyard, exile it instead. SVar:ReplaceGraveyard:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Graveyard | ReplaceWith$ MoveExile | Description$ If that spell would be put into your graveyard, exile it instead.
SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destination$ Exile | SubAbility$ ExileSelf SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destination$ Exile | SubAbility$ ExileSelf
SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile

View File

@@ -8,5 +8,5 @@ SVar:KhansTrigger:Mode$ Phase | Phase$ Draw | TriggerZones$ Battlefield | ValidP
SVar:Filter:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard SVar:Filter:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1
SVar:Dragons:DB$ Animate | Defined$ Self | staticAbilities$ DragonsST | Duration$ Permanent | SpellDescription$ Dragons SVar:Dragons:DB$ Animate | Defined$ Self | staticAbilities$ DragonsST | Duration$ Permanent | SpellDescription$ Dragons
SVar:DragonsST:Mode$ RaiseCost | ValidTarget$ You,Card.YouCtrl | Activator$ Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target you or a permanent you control cost {2} more to cast. SVar:DragonsST:Mode$ RaiseCost | ValidTarget$ You,Card.YouCtrl+inZoneBattlefield | Activator$ Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target you or a permanent you control cost {2} more to cast.
Oracle:As Monastery Siege enters the battlefield, choose Khans or Dragons.\n• Khans — At the beginning of your draw step, draw an additional card, then discard a card.\n• Dragons — Spells your opponents cast that target you or a permanent you control cost {2} more to cast. Oracle:As Monastery Siege enters the battlefield, choose Khans or Dragons.\n• Khans — At the beginning of your draw step, draw an additional card, then discard a card.\n• Dragons — Spells your opponents cast that target you or a permanent you control cost {2} more to cast.

View File

@@ -3,10 +3,10 @@ ManaCost:4 R
Types:Legendary Creature Elf Shaman Types:Legendary Creature Elf Shaman
PT:2/5 PT:2/5
K:Choose a Background K:Choose a Background
S:Mode$ Continuous | Affected$ Creature.powerLTY+OppCtrl | Goad$ True | SubAbility$ TrigChangesZone | Description$ Creatures your opponents control with power less than CARDNAME power are goaded. (They attacks each combat if able and attack a player other than you if able.) S:Mode$ Continuous | Affected$ Creature.powerLTY+OppCtrl | Goad$ True | Description$ Creatures your opponents control with power less than CARDNAME power are goaded. (They attack each combat if able and attack a player other than you if able.)
SVar:Y:Count$CardPower SVar:Y:Count$CardPower
SVar:TrigChangesZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.attacking+IsGoaded,Creature.blocking+IsGoaded | Execute$ TrigToken | TriggerZones$ Battlefield | SubAbility$ TrigToken | TriggerDescription$ Whenever a goaded attacking or blocking creature dies, you create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.") T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.attacking+IsGoaded,Creature.blocking+IsGoaded | Execute$ TrigToken | TriggerZones$ Battlefield | SubAbility$ TrigToken | TriggerDescription$ Whenever a goaded attacking or blocking creature dies, you create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You
SVar:HasAttackEffect:TRUE SVar:HasAttackEffect:TRUE
DeckHas:Ability$Token|Sacrifice & Type$Artifact|Treasure DeckHas:Ability$Token|Sacrifice & Type$Artifact|Treasure
Oracle:Creatures your opponents control with power less than Baeloth Barrityl's power are goaded. (They attacks each combat if able and attack a player other than you if able.)\nWhenever a goaded attacking or blocking creature dies, you create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")\nChoose a Background (You can have a Background as a second commander.) Oracle:Creatures your opponents control with power less than Baeloth Barrityl's power are goaded. (They attack each combat if able and attack a player other than you if able.)\nWhenever a goaded attacking or blocking creature dies, you create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")\nChoose a Background (You can have a Background as a second commander.)

View File

@@ -1,8 +1,8 @@
Name:Gond Gate Name:Gond Gate
ManaCost:no cost ManaCost:no cost
Types:Land Gate Types:Land Gate
R:Event$ Moved | ValidCard$ Gate.YouCtrl | Destination$ Battlefield | ReplaceWith$ ETBUntapped | ActiveZones$ Battlefield | Description$ Gates you control enter the battlefield untapped. R:Event$ Moved | ValidCard$ Gate.YouCtrl | Destination$ Battlefield | ReplaceWith$ ETBUntapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ Gates you control enter the battlefield untapped.
SVar:ETBUntapped:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Untapped$ True | Defined$ ReplacedCard SVar:ETBUntapped:DB$ Untap | ETB$ True | Defined$ ReplacedCard
A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 1 | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 1 | SpellDescription$ Add {C}.
A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Gate.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add one mana of any color that a Gate you control could produce. A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Gate.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add one mana of any color that a Gate you control could produce.
DeckNeeds:Type$Gate DeckNeeds:Type$Gate