mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 20:58:03 +00:00
Some fixes (#5230)
* Fix bad Discord change * Fix Risen Executioner using X shard * Fix Marshland Bloodcaster * Clean up
This commit is contained in:
@@ -32,6 +32,7 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.game.ability.AbilityFactory;
|
import forge.game.ability.AbilityFactory;
|
||||||
|
import forge.game.ability.AbilityUtils;
|
||||||
import forge.game.ability.ApiType;
|
import forge.game.ability.ApiType;
|
||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
import forge.game.card.CardPlayOption.PayManaCost;
|
import forge.game.card.CardPlayOption.PayManaCost;
|
||||||
@@ -317,6 +318,9 @@ public final class GameActionUtil {
|
|||||||
if (o.getAbility().hasParam("ValidAfterStack")) {
|
if (o.getAbility().hasParam("ValidAfterStack")) {
|
||||||
newSA.getMapParams().put("ValidAfterStack", o.getAbility().getParam("ValidAfterStack"));
|
newSA.getMapParams().put("ValidAfterStack", o.getAbility().getParam("ValidAfterStack"));
|
||||||
}
|
}
|
||||||
|
if (o.getAbility().hasParam("RaiseCost")) {
|
||||||
|
newSA.getMapParams().put("RaiseCost", Integer.toString(AbilityUtils.calculateAmount(host, o.getAbility().getParam("RaiseCost"), o.getAbility())));
|
||||||
|
}
|
||||||
|
|
||||||
final SpellAbilityRestriction sar = newSA.getRestrictions();
|
final SpellAbilityRestriction sar = newSA.getRestrictions();
|
||||||
if (o.isWithFlash()) {
|
if (o.isWithFlash()) {
|
||||||
|
|||||||
@@ -170,8 +170,6 @@ public class PlayEffect extends SpellAbilityEffect {
|
|||||||
Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), controller);
|
Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), controller);
|
||||||
// so it gets added to stack
|
// so it gets added to stack
|
||||||
card.setCopiedPermanent(card);
|
card.setCopiedPermanent(card);
|
||||||
// Keeps adventures from leaving the recast effect
|
|
||||||
card.setCopiedSpell(true);
|
|
||||||
card.setToken(true);
|
card.setToken(true);
|
||||||
tgtCards = new CardCollection(card);
|
tgtCards = new CardCollection(card);
|
||||||
} else {
|
} else {
|
||||||
@@ -287,7 +285,6 @@ public class PlayEffect extends SpellAbilityEffect {
|
|||||||
tgtCard.setZone(zone);
|
tgtCard.setZone(zone);
|
||||||
// to fix the CMC
|
// to fix the CMC
|
||||||
tgtCard.setCopiedPermanent(original);
|
tgtCard.setCopiedPermanent(original);
|
||||||
tgtCard.setCopiedSpell(true);
|
|
||||||
if (zone != null) {
|
if (zone != null) {
|
||||||
zone.add(tgtCard);
|
zone.add(tgtCard);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4012,7 +4012,7 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
||||||
|
|
||||||
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
|
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell+nonToken";
|
||||||
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
|
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
|
||||||
|
|
||||||
StringBuilder sbPlay = new StringBuilder();
|
StringBuilder sbPlay = new StringBuilder();
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ public class StaticAbilityAlternativeCost {
|
|||||||
newSA.setBasicSpell(false);
|
newSA.setBasicSpell(false);
|
||||||
|
|
||||||
if (cost.hasXInAnyCostPart()) {
|
if (cost.hasXInAnyCostPart()) {
|
||||||
|
// TODO this is problematic for Spells that already have (non-mana) X SVar
|
||||||
newSA.setSVar("X", stAb.getSVar("X"));
|
newSA.setSVar("X", stAb.getSVar("X"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +51,9 @@ public class StaticAbilityAlternativeCost {
|
|||||||
newSA.putParam("ManaRestriction", stAb.getParam("ManaRestriction"));
|
newSA.putParam("ManaRestriction", stAb.getParam("ManaRestriction"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stAb.hasParam("EffectZone") && !"All".equals(stAb.getParam("EffectZone"))) {
|
if (stAb.hasParam("AffectedZone")) {
|
||||||
|
newSA.getRestrictions().setZone(ZoneType.smartValueOf(stAb.getParam("AffectedZone")));
|
||||||
|
} else if (!stAb.getHostCard().isImmutable() && stAb.hasParam("EffectZone") && !"All".equals(stAb.getParam("EffectZone"))) {
|
||||||
newSA.getRestrictions().setZone(ZoneType.smartValueOf(stAb.getParam("EffectZone")));
|
newSA.getRestrictions().setZone(ZoneType.smartValueOf(stAb.getParam("EffectZone")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import forge.game.keyword.Keyword;
|
|||||||
import forge.game.phase.PhaseHandler;
|
import forge.game.phase.PhaseHandler;
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.OptionalCost;
|
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.zone.CostPaymentStack;
|
import forge.game.zone.CostPaymentStack;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
@@ -398,11 +397,7 @@ public abstract class Trigger extends TriggerReplacementBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("AltCost".equals(condition)) {
|
if ("LifePaid".equals(condition)) {
|
||||||
final Card moved = (Card) runParams.get(AbilityKey.Card);
|
|
||||||
if (null != moved && !moved.isOptionalCostPaid(OptionalCost.AltCost))
|
|
||||||
return false;
|
|
||||||
} else if ("LifePaid".equals(condition)) {
|
|
||||||
final SpellAbility trigSA = (SpellAbility) runParams.get(AbilityKey.SpellAbility);
|
final SpellAbility trigSA = (SpellAbility) runParams.get(AbilityKey.SpellAbility);
|
||||||
if (trigSA != null && trigSA.getAmountLifePaid() <= 0) {
|
if (trigSA != null && trigSA.getAmountLifePaid() <= 0) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Batt
|
|||||||
SVar:TrigExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose up to one target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | RememberChanged$ True | SubAbility$ DBPlay
|
SVar:TrigExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose up to one target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | RememberChanged$ True | SubAbility$ DBPlay
|
||||||
SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidSA$ Spell | Optional$ True | CopyCard$ True | SubAbility$ DBCleanup
|
SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidSA$ Spell | Optional$ True | CopyCard$ True | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ U U U U ExileFromGrave<4/Instant;Sorcery/instant or sorcery cards> | ActivationZone$ Graveyard | Description$ You may cast CARDNAME from your graveyard by exiling four instant and/or sorcery cards from your graveyard in addition to paying its other costs.
|
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ U U U U ExileFromGrave<4/Instant;Sorcery/instant or sorcery cards> | Description$ You may cast CARDNAME from your graveyard by exiling four instant and/or sorcery cards from your graveyard in addition to paying its other costs.
|
||||||
SVar:X:Count$ThisTurnCast_Instant.YouCtrl,Sorcery.YouCtrl
|
SVar:X:Count$ThisTurnCast_Instant.YouCtrl,Sorcery.YouCtrl
|
||||||
DeckNeeds:Type$Instant|Sorcery
|
DeckNeeds:Type$Instant|Sorcery
|
||||||
Oracle:This spell costs {U} less to cast for each instant and sorcery spell you've cast this turn.\nWhenever Demilich attacks, exile up to one target instant or sorcery card from your graveyard. Copy it. You may cast the copy.\nYou may cast Demilich from your graveyard by exiling four instant and/or sorcery cards from your graveyard in addition to paying its other costs.
|
Oracle:This spell costs {U} less to cast for each instant and sorcery spell you've cast this turn.\nWhenever Demilich attacks, exile up to one target instant or sorcery card from your graveyard. Copy it. You may cast the copy.\nYou may cast Demilich from your graveyard by exiling four instant and/or sorcery cards from your graveyard in addition to paying its other costs.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Types:Enchantment Aura
|
|||||||
K:Enchant creature
|
K:Enchant creature
|
||||||
A:SP$ Attach | Cost$ 1 B B | ValidTgts$ Creature | AILogic$ Pump
|
A:SP$ Attach | Cost$ 1 B B | ValidTgts$ Creature | AILogic$ Pump
|
||||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 1 | AddKeyword$ Flying | AddType$ Demon | Description$ Enchanted creature gets +3/+1, has flying, and is a Demon in addition to its other types.
|
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 1 | AddKeyword$ Flying | AddType$ Demon | Description$ Enchanted creature gets +3/+1, has flying, and is a Demon in addition to its other types.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ 1 B B PayLife<3> Discard<1/Card> | ActivationZone$ Graveyard | Description$ You may cast CARDNAME from your graveyard by paying 3 life and discarding a card in addition to paying its other costs.
|
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ 1 B B PayLife<3> Discard<1/Card> | Description$ You may cast CARDNAME from your graveyard by paying 3 life and discarding a card in addition to paying its other costs.
|
||||||
DeckHas:Ability$Discard|Graveyard
|
DeckHas:Ability$Discard|Graveyard
|
||||||
SVar:DiscardMe:1
|
SVar:DiscardMe:1
|
||||||
Oracle:Enchant creature\nEnchanted creature gets +3/+1, has flying, and is a Demon in addition to its other types.\nYou may cast Demonic Embrace from your graveyard by paying 3 life and discarding a card in addition to paying its other costs.
|
Oracle:Enchant creature\nEnchanted creature gets +3/+1, has flying, and is a Demon in addition to its other types.\nYou may cast Demonic Embrace from your graveyard by paying 3 life and discarding a card in addition to paying its other costs.
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ ManaCost:3 B R
|
|||||||
Types:Artifact Creature Astartes Dreadnought
|
Types:Artifact Creature Astartes Dreadnought
|
||||||
PT:5/4
|
PT:5/4
|
||||||
K:Haste
|
K:Haste
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ 3 B R ExileFromGrave<1/Creature.Other/another creature card> | ActivationZone$ Graveyard | Description$ Sarcophagus — You may cast CARDNAME from your graveyard by exiling another creature card from your graveyard in addition to paying its other costs.
|
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ 3 B R ExileFromGrave<1/Creature.Other/another creature card> | Description$ Sarcophagus — You may cast CARDNAME from your graveyard by exiling another creature card from your graveyard in addition to paying its other costs.
|
||||||
DeckHas:Ability$Graveyard
|
DeckHas:Ability$Graveyard
|
||||||
Oracle:Haste\nSarcophagus — You may cast Helbrute from your graveyard by exiling another creature card from your graveyard in addition to paying its other costs.
|
Oracle:Haste\nSarcophagus — You may cast Helbrute from your graveyard by exiling another creature card from your graveyard in addition to paying its other costs.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ PT:3/3
|
|||||||
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ At the beginning of combat on your turn, put your choice of a +1/+1, first strike, vigilance, or menace counter on CARDNAME.
|
T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ At the beginning of combat on your turn, put your choice of a +1/+1, first strike, vigilance, or menace counter on CARDNAME.
|
||||||
SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1,First Strike,Vigilance,Menace | CounterNum$ 1
|
SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1,First Strike,Vigilance,Menace | CounterNum$ 1
|
||||||
K:Counters remain on CARDNAME as it moves to any zone other than a player's hand or library.
|
K:Counters remain on CARDNAME as it moves to any zone other than a player's hand or library.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ 2 G U R Discard<2/Card> | ActivationZone$ Graveyard | Description$ You may cast NICKNAME from your graveyard by discarding two cards in addition to paying its other costs.
|
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ 2 G U R Discard<2/Card> | Description$ You may cast NICKNAME from your graveyard by discarding two cards in addition to paying its other costs.
|
||||||
DeckHas:Ability$Counters|Discard
|
DeckHas:Ability$Counters|Discard
|
||||||
DeckHints:Ability$Counters
|
DeckHints:Ability$Counters
|
||||||
Oracle:At the beginning of combat on your turn, put your choice of a +1/+1, first strike, vigilance, or menace counter on Me, the Immortal.\nCounters remain on Me as it moves to any zone other than a player's hand or library.\nYou may cast Me from your graveyard by discarding two cards in addition to paying its other costs.
|
Oracle:At the beginning of combat on your turn, put your choice of a +1/+1, first strike, vigilance, or menace counter on Me, the Immortal.\nCounters remain on Me as it moves to any zone other than a player's hand or library.\nYou may cast Me from your graveyard by discarding two cards in addition to paying its other costs.
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ Name:Phyrexian Rebirth
|
|||||||
ManaCost:4 W W
|
ManaCost:4 W W
|
||||||
Types:Sorcery
|
Types:Sorcery
|
||||||
A:SP$ DestroyAll | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBToken | SpellDescription$ Destroy all creatures, then create an X/X colorless Phyrexian Horror artifact creature token, where X is the number of creatures destroyed this way.
|
A:SP$ DestroyAll | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBToken | SpellDescription$ Destroy all creatures, then create an X/X colorless Phyrexian Horror artifact creature token, where X is the number of creatures destroyed this way.
|
||||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_x_x_a_phyrexian_horror | TokenOwner$ You | TokenPower$ X | TokenToughness$ X
|
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_x_x_a_phyrexian_horror | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SubAbility$ DBCleanup
|
||||||
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
SVar:X:Remembered$Amount
|
SVar:X:Remembered$Amount
|
||||||
Oracle:Destroy all creatures, then create an X/X colorless Phyrexian Horror artifact creature token, where X is the number of creatures destroyed this way.
|
Oracle:Destroy all creatures, then create an X/X colorless Phyrexian Horror artifact creature token, where X is the number of creatures destroyed this way.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Types:Creature Zombie Warrior
|
|||||||
PT:4/3
|
PT:4/3
|
||||||
K:CARDNAME can't block.
|
K:CARDNAME can't block.
|
||||||
S:Mode$ Continuous | Affected$ Creature.Zombie+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Zombie creatures you control get +1/+1.
|
S:Mode$ Continuous | Affected$ Creature.Zombie+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Zombie creatures you control get +1/+1.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlayAltManaCost$ X 2 B B | ActivationZone$ Graveyard | Description$ You may cast CARDNAME from your graveyard if you pay {1} more to cast it for each other creature card in your graveyard.
|
S:Mode$ Continuous | Affected$ Card.Self | MayPlay$ True | AffectedZone$ Graveyard | EffectZone$ Graveyard | RaiseCost$ X | Description$ You may cast CARDNAME from your graveyard if you pay {1} more to cast it for each other creature card in your graveyard.
|
||||||
SVar:X:Count$ValidGraveyard Creature.Other+YouOwn
|
SVar:X:Count$ValidGraveyard Creature.Other+YouOwn
|
||||||
SVar:PlayMain1:TRUE
|
SVar:PlayMain1:TRUE
|
||||||
Oracle:Risen Executioner can't block.\nOther Zombie creatures you control get +1/+1.\nYou may cast Risen Executioner from your graveyard if you pay {1} more to cast it for each other creature card in your graveyard.
|
Oracle:Risen Executioner can't block.\nOther Zombie creatures you control get +1/+1.\nYou may cast Risen Executioner from your graveyard if you pay {1} more to cast it for each other creature card in your graveyard.
|
||||||
|
|||||||
Reference in New Issue
Block a user