mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user