Merge pull request #2490 from tool4ever/prowl

Prowl & support
This commit is contained in:
Anthony Calosa
2023-02-20 12:20:18 +08:00
committed by GitHub
6 changed files with 63 additions and 14 deletions

View File

@@ -89,7 +89,6 @@ public class GameAction {
public Card changeZone(final Zone zoneFrom, Zone zoneTo, final Card c, Integer position, SpellAbility cause) { public Card changeZone(final Zone zoneFrom, Zone zoneTo, final Card c, Integer position, SpellAbility cause) {
return changeZone(zoneFrom, zoneTo, c, position, cause, null); return changeZone(zoneFrom, zoneTo, c, position, cause, null);
} }
private Card changeZone(final Zone zoneFrom, Zone zoneTo, final Card c, Integer position, SpellAbility cause, Map<AbilityKey, Object> params) { private Card changeZone(final Zone zoneFrom, Zone zoneTo, final Card c, Integer position, SpellAbility cause, Map<AbilityKey, Object> params) {
// 111.11. A copy of a permanent spell becomes a token as it resolves. // 111.11. A copy of a permanent spell becomes a token as it resolves.
// The token has the characteristics of the spell that became that token. // The token has the characteristics of the spell that became that token.
@@ -273,7 +272,6 @@ public class GameAction {
copied.setExiledBy(c.getExiledBy()); copied.setExiledBy(c.getExiledBy());
copied.setDrawnThisTurn(c.getDrawnThisTurn()); copied.setDrawnThisTurn(c.getDrawnThisTurn());
if (cause != null && cause.isSpell() && c.equals(cause.getHostCard())) { if (cause != null && cause.isSpell() && c.equals(cause.getHostCard())) {
copied.setCastSA(cause); copied.setCastSA(cause);
copied.setSplitStateToPlayAbility(cause); copied.setSplitStateToPlayAbility(cause);
@@ -481,10 +479,6 @@ public class GameAction {
} }
} }
if (!zoneTo.is(ZoneType.Exile) && !zoneTo.is(ZoneType.Stack)) {
c.cleanupExiledWith();
}
// 400.7a Effects from static abilities that give a permanent spell on the stack an ability // 400.7a Effects from static abilities that give a permanent spell on the stack an ability
// that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes. // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes.
if (zoneFrom.is(ZoneType.Stack) && toBattlefield) { if (zoneFrom.is(ZoneType.Stack) && toBattlefield) {
@@ -624,6 +618,11 @@ public class GameAction {
zoneTo.saveLKI(copied, lastKnownInfo); zoneTo.saveLKI(copied, lastKnownInfo);
} }
// only now that the LKI preserved it
if (!zoneTo.is(ZoneType.Exile) && !zoneTo.is(ZoneType.Stack)) {
c.cleanupExiledWith();
}
game.getTriggerHandler().clearActiveTriggers(copied, null); game.getTriggerHandler().clearActiveTriggers(copied, null);
// register all LTB trigger from last state battlefield // register all LTB trigger from last state battlefield
for (Card lki : lastBattlefield) { for (Card lki : lastBattlefield) {

View File

@@ -733,12 +733,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
moveParams.put(AbilityKey.LastStateBattlefield, lastStateBattlefield); moveParams.put(AbilityKey.LastStateBattlefield, lastStateBattlefield);
moveParams.put(AbilityKey.LastStateGraveyard, lastStateGraveyard); moveParams.put(AbilityKey.LastStateGraveyard, lastStateGraveyard);
movedCard = game.getAction().moveTo(destination, gameCard, sa, moveParams); movedCard = game.getAction().moveTo(destination, gameCard, sa, moveParams);
if (ZoneType.Hand.equals(destination) && ZoneType.Command.equals(originZone.getZoneType())) { if (ZoneType.Hand.equals(destination) && ZoneType.Command.equals(originZone.getZoneType())) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(movedCard.getName()).append(" has moved from Command Zone to ").append(player).append("'s hand."); sb.append(movedCard.getName()).append(" has moved from Command Zone to ").append(player).append("'s hand.");
game.getGameLog().add(GameLogEntryType.ZONE_CHANGE, sb.toString()); game.getGameLog().add(GameLogEntryType.ZONE_CHANGE, sb.toString());
commandCards.add(movedCard); //add to list to reveal the commandzone cards commandCards.add(movedCard); //add to list to reveal the commandzone cards
} }
// If a card is Exiled from the stack, remove its spells from the stack // If a card is Exiled from the stack, remove its spells from the stack
if (sa.hasParam("Fizzle")) { if (sa.hasParam("Fizzle")) {
if (gameCard.isInZone(ZoneType.Exile) || gameCard.isInZone(ZoneType.Hand) if (gameCard.isInZone(ZoneType.Exile) || gameCard.isInZone(ZoneType.Hand)

View File

@@ -6297,7 +6297,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
public SpellAbility getCastSA() { public SpellAbility getCastSA() {
return castSA; return castSA;
} }
public void setCastSA(SpellAbility castSA) { public void setCastSA(SpellAbility castSA) {
this.castSA = castSA; this.castSA = castSA;
} }

View File

@@ -357,6 +357,29 @@ public class CardProperty {
if (!card.getExiledBy().equals(sourceController)) { if (!card.getExiledBy().equals(sourceController)) {
return false; return false;
} }
} else if (property.startsWith("ExiledWithSourceLKI")) {
List<Card> exiled = card.getZone().getCardsAddedThisTurn(null);
int idx = exiled.lastIndexOf(card);
if (idx == -1) {
return false;
}
Card lkiExiled = exiled.get(idx);
if (lkiExiled.getExiledWith() == null) {
return false;
}
Card host = source;
//Static Abilites doesn't have spellAbility or OriginalHost
if (spellAbility != null) {
host = spellAbility.getOriginalHost();
if (host == null) {
host = spellAbility.getHostCard();
}
}
if (!lkiExiled.getExiledWith().equalsWithTimestamp(host)) {
return false;
}
} else if (property.startsWith("ExiledWithSource")) { } else if (property.startsWith("ExiledWithSource")) {
if (card.getExiledWith() == null) { if (card.getExiledWith() == null) {
return false; return false;

View File

@@ -0,0 +1,30 @@
Name:Prowl, Stoic Strategist
ManaCost:3 W
Types:Legendary Artifact Creature Robot
PT:3/3
K:More Than Meets the Eye:2 W
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever NICKNAME attacks, exile up to one other target tapped creature or Vehicle. For as long as that card remains exiled, its owner may play it.
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.Other+tapped,Vehicle.Other+tapped | TgtPrompt$ Select up to one other target tapped creature or Vehicle | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | StaticAbilities$ Play | ForgetOnMoved$ Exile | EffectOwner$ TargetedOwner | Duration$ Permanent
SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ For as long as that card remains exiled, its owner may play it.
T:Mode$ SpellCast | ValidCard$ Card.ExiledWithSourceLKI | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a player plays a card exiled with NICKNAME, you draw a card and convert NICKNAME.
T:Mode$ LandPlayed | ValidCard$ Card.ExiledWithSourceLKI | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever a player plays a card exiled with NICKNAME, you draw a card and convert NICKNAME.
SVar:TrigDraw:DB$ Draw | SubAbility$ DBConvert
SVar:DBConvert:DB$ SetState | Mode$ Transform
AlternateMode:DoubleFaced
Oracle:More Than Meets the Eye {1}{R}{G} (You may cast this card converted for {1}{R}{G}.)\nWhenever Prowl attacks, exile up to one other target tapped creature or Vehicle. For as long as that card remains exiled, its owner may play it.\nWhenever a player plays a card exiled with Prowl, you draw a card and convert Prowl.
ALTERNATE
Name:Prowl, Pursuit Vehicle
ManaCost:no cost
Colors:white
Types:Legendary Artifact Vehicle
PT:2/3
K:Living metal
T:Mode$ ChangesZone | ValidCard$ Creature.Other,Vehicle | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever another creature or Vehicle enters the battlefield under your control, put a +1/+1 counter on NICKNAME. If this is the second time this ability has resolved this turn, convert NICKNAME.
SVar:TrigCounter:DB$ PutCounter | CounterType$ P1P1 | SubAbility$ DBConvert
SVar:DBConvert:DB$ SetState | Mode$ Transform | ConditionCheckSVar$ TrigAmount | ConditionSVarCompare$ EQ2
SVar:TrigAmount:Count$ResolvedThisTurn
DeckHas:Ability$Counters
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nWhenever another creature or Vehicle enters the battlefield under your control, put a +1/+1 counter on Prowl. If this is the second time this ability has resolved this turn, convert Prowl.

View File

@@ -3,17 +3,13 @@ ManaCost:1 R
Types:Creature Human Wizard Types:Creature Human Wizard
PT:3/1 PT:3/1
A:AB$ DealDamage | Cost$ T | NumDmg$ 2 | Defined$ You | SorcerySpeed$ True | SubAbility$ DBExile | SpellDescription$ CARDNAME deals 2 damage to you. A:AB$ DealDamage | Cost$ T | NumDmg$ 2 | Defined$ You | SorcerySpeed$ True | SubAbility$ DBExile | SpellDescription$ CARDNAME deals 2 damage to you.
SVar:DBExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | Imprint$ True | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Exile the top card of your library. SVar:DBExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Exile the top card of your library.
SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SubAbility$ DBCleanup | ForgetOnMoved$ Exile | StackDescription$ SpellDescription | SpellDescription$ You may play that card this turn. Activate only as a sorcery. SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SubAbility$ DBCleanup | ForgetOnMoved$ Exile | StackDescription$ SpellDescription | SpellDescription$ You may play that card this turn. Activate only as a sorcery.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play the exiled card this turn. SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play the exiled card this turn.
T:Mode$ SpellCast | ValidCard$ Card.IsImprinted | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ When you play a card exiled with CARDNAME, transform it. T:Mode$ SpellCast | ValidCard$ Card.ExiledWithSourceLKI | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ When you play a card exiled with CARDNAME, transform it.
T:Mode$ LandPlayed | ValidCard$ Land.IsImprinted+YouCtrl | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When you play a card exiled with CARDNAME, transform it. T:Mode$ LandPlayed | ValidCard$ Land.ExiledWithSourceLKI | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When you play a card exiled with CARDNAME, transform it.
SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBClear | Static$ True
SVar:DBClear:DB$ Cleanup | ClearImprinted$ True
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget
SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard
AlternateMode:DoubleFaced AlternateMode:DoubleFaced
Oracle:{T}: Voltaic Visionary deals 2 damage to you. Exile the top card of your library. You may play that card this turn. Activate only as a sorcery.\nWhen you play a card exiled with Voltaic Visionary, transform it. Oracle:{T}: Voltaic Visionary deals 2 damage to you. Exile the top card of your library. You may play that card this turn. Activate only as a sorcery.\nWhen you play a card exiled with Voltaic Visionary, transform it.