From 681a54310232ea7d548a0d9bd4dc769b5a2a8b4b Mon Sep 17 00:00:00 2001 From: Glorax <114269106+Glorax@users.noreply.github.com> Date: Sat, 8 Jun 2024 14:44:58 -0700 Subject: [PATCH 1/4] Update atraxa_grand_unifier.txt Removed "horror" from creature types. --- forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt b/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt index 62f4b1480e2..a7e61df3d4d 100644 --- a/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt +++ b/forge-gui/res/cardsfolder/a/atraxa_grand_unifier.txt @@ -1,6 +1,6 @@ Name:Atraxa, Grand Unifier ManaCost:3 G W U B -Types:Legendary Creature Phyrexian Angel Horror +Types:Legendary Creature Phyrexian Angel PT:7/7 K:Flying K:Vigilance From a9849696d30bb0f09b8f5c47536c709d4be50325 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Sun, 9 Jun 2024 06:08:45 +0200 Subject: [PATCH 2/4] CardRules: fix case with null tokens list (#5395) * CardRules: fix NPE * clean up --------- Co-authored-by: tool4EvEr --- forge-core/src/main/java/forge/card/CardRules.java | 12 +++++++++--- .../main/java/forge/card/CardRulesPredicates.java | 3 ++- .../forge/game/ability/effects/RepeatEachEffect.java | 8 ++------ forge-gui/res/cardsfolder/d/desecrate_reality.txt | 2 +- .../res/cardsfolder/k/korvold_fae_cursed_king.txt | 2 +- forge-gui/res/cardsfolder/t/tempting_contract.txt | 6 +++--- .../grist_voracious_larva_grist_the_plague_swarm.txt | 4 ++-- .../res/cardsfolder/upcoming/tempt_with_mayhem.txt | 6 +++--- .../src/main/java/forge/itemmanager/SFilterUtil.java | 1 - 9 files changed, 23 insertions(+), 21 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index ce0e8600e22..3390ff98150 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -92,6 +92,7 @@ public final class CardRules implements ICardCharacteristics { colorIdentity = newRules.colorIdentity; meldWith = newRules.meldWith; partnerWith = newRules.partnerWith; + tokens = newRules.tokens; } private static byte calculateColorIdentity(final ICardFace face) { @@ -386,7 +387,7 @@ public final class CardRules implements ICardCharacteristics { private int deltaHand; private int deltaLife; - private List tokens; + private List tokens = Collections.emptyList(); public List getTokens() { return tokens; @@ -484,7 +485,9 @@ public final class CardRules implements ICardCharacteristics { result.setNormalizedName(this.normalizedName); result.meldWith = this.meldWith; result.partnerWith = this.partnerWith; - result.tokens = tokens.isEmpty() ? Collections.emptyList() : tokens; + if (!tokens.isEmpty()) { + result.tokens = tokens; + } if (StringUtils.isNotBlank(handLife)) result.setVanguardProperties(handLife); return result; @@ -742,7 +745,10 @@ public final class CardRules implements ICardCharacteristics { } public boolean hasStartOfKeyword(final String k) { - for (final String inst : mainPart.getKeywords()) { + return hasStartOfKeyword(k, mainPart); + } + public boolean hasStartOfKeyword(final String k, ICardFace cf) { + for (final String inst : cf.getKeywords()) { final String[] parts = inst.split(":"); if (parts[0].equals(k)) { return true; diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index 572d9dd6664..16123d574bd 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; import forge.util.CardTranslation; import forge.util.ComparableOp; @@ -186,7 +187,7 @@ public final class CardRulesPredicates { return new Predicate() { @Override public boolean apply(final CardRules card) { - return card.hasStartOfKeyword(keyword); + return Iterables.any(card.getAllFaces(), cf -> cf != null && card.hasStartOfKeyword(keyword, cf)); } }; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index 1b3869cd50c..bf5ec71316d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -180,12 +180,8 @@ public class RepeatEachEffect extends SpellAbilityEffect { } } for (final Player p : repeatPlayers) { - if (optional) { - if (!p.getController().confirmAction(repeat, null, sa.getParam("RepeatOptionalMessage"), null)) { - continue; - } else if (sa.hasParam("RememberDeciders")) { - source.addRemembered(p); - } + if (optional && !p.getController().confirmAction(repeat, null, sa.getParam("RepeatOptionalMessage"), null)) { + continue; } if (nextTurn) { game.getCleanup().addUntil(p, new GameCommand() { diff --git a/forge-gui/res/cardsfolder/d/desecrate_reality.txt b/forge-gui/res/cardsfolder/d/desecrate_reality.txt index cf25f75752a..c36ac922a6f 100644 --- a/forge-gui/res/cardsfolder/d/desecrate_reality.txt +++ b/forge-gui/res/cardsfolder/d/desecrate_reality.txt @@ -1,7 +1,7 @@ Name:Desecrate Reality ManaCost:7 Types:Instant -A:SP$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl+cmcEven | TargetMin$ 0 | TargetMax$ OneEach | TargetsForEachPlayer$ True | TgtPrompt$ Select up to one target nonland permanent each opponent controls | SubAbility$ DBReturn | SpellDescription$ For each opponent, exile up to one target permanent that player controls with an even mana value. (Zero is even.) +A:SP$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.OppCtrl+cmcEven | TargetMin$ 0 | TargetMax$ OneEach | TargetsForEachPlayer$ True | TgtPrompt$ Select up to one target permanent with an even mana value each opponent controls | SubAbility$ DBReturn | SpellDescription$ For each opponent, exile up to one target permanent that player controls with an even mana value. (Zero is even.) SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Permanent.cmcOdd+YouOwn | Hidden$ True | Mandatory$ True | ChangeTypeDesc$ permanent card with an odd mana value | ChangeNum$ 1 | ConditionCheckSVar$ X | SpellDescription$ Adamant — If at least three colorless mana was spent to cast this spell, return a permanent card with an odd mana value from your graveyard to the battlefield. SVar:X:Count$Adamant.Colorless.1.0 SVar:OneEach:PlayerCountOpponents$Amount diff --git a/forge-gui/res/cardsfolder/k/korvold_fae_cursed_king.txt b/forge-gui/res/cardsfolder/k/korvold_fae_cursed_king.txt index 68f07fd16ff..303a5b5ce84 100644 --- a/forge-gui/res/cardsfolder/k/korvold_fae_cursed_king.txt +++ b/forge-gui/res/cardsfolder/k/korvold_fae_cursed_king.txt @@ -7,7 +7,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, sacrifice another permanent. SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Permanent.Other SVar:NeedsToPlay:Permanent.YouCtrl+cmcLE2 -T:Mode$ Sacrificed | ValidCard$ Permanent | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a permanent, put a +1/+1 counter on CARDNAME and draw a card. +T:Mode$ Sacrificed | ValidCard$ Permanent | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a permanent, put a +1/+1 counter on NICKNAME and draw a card. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/t/tempting_contract.txt b/forge-gui/res/cardsfolder/t/tempting_contract.txt index 1e8182f4225..de5440b17be 100644 --- a/forge-gui/res/cardsfolder/t/tempting_contract.txt +++ b/forge-gui/res/cardsfolder/t/tempting_contract.txt @@ -2,10 +2,10 @@ Name:Tempting Contract ManaCost:4 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBRepeat | SubAbility$ DBToken | TriggerDescription$ At the beginning of your upkeep, each opponent may create a Treasure token. For each opponent who does, you create a Treasure token. -SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBOppToken | RepeatPlayers$ Opponent | RepeatOptionalForEachPlayer$ True | RememberDeciders$ True | RepeatOptionalMessage$ Do you want to create a Treasure token? | ChangeZoneTable$ True | SubAbility$ DBToken -SVar:DBOppToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenOwner$ Player.IsRemembered +SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBOppToken | RepeatPlayers$ Opponent | RepeatOptionalForEachPlayer$ True | RepeatOptionalMessage$ Do you want to create a Treasure token? | ChangeZoneTable$ True | SubAbility$ DBToken +SVar:DBOppToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenOwner$ Player.IsRemembered | RememberTokens$ True SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_treasure_sac | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$RememberedSize +SVar:X:PlayerCountRememberedOwner$Amount DeckHas:Ability$Token|Sacrifice Oracle:At the beginning of your upkeep, each opponent may create a Treasure token. For each opponent who does, you create a Treasure token. diff --git a/forge-gui/res/cardsfolder/upcoming/grist_voracious_larva_grist_the_plague_swarm.txt b/forge-gui/res/cardsfolder/upcoming/grist_voracious_larva_grist_the_plague_swarm.txt index 70f533020ec..ddab1d42bd5 100644 --- a/forge-gui/res/cardsfolder/upcoming/grist_voracious_larva_grist_the_plague_swarm.txt +++ b/forge-gui/res/cardsfolder/upcoming/grist_voracious_larva_grist_the_plague_swarm.txt @@ -3,8 +3,8 @@ ManaCost:G Types:Legendary Creature Insect PT:1/2 K:Deathtouch -T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | ValidCard$ Card.Self,Creature.YouCtrl | Execute$ TrigTransform | TriggerDescription$ When CARDNAME or another creature enters the battlefield under your control, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. -T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou,Creature.YouCtrl+wasCastFromYourGraveyardByYou | Execute$ TrigTransform | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. +T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | ValidCard$ Card.Self,Creature.YouCtrl | Execute$ TrigTransform | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME or another creature enters the battlefield under your control, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou,Creature.YouCtrl+wasCastFromYourGraveyardByYou | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. SVar:TrigTransform:AB$ ChangeZone | Cost$ G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/tempt_with_mayhem.txt b/forge-gui/res/cardsfolder/upcoming/tempt_with_mayhem.txt index c032f8b72f5..d48a1eebb78 100644 --- a/forge-gui/res/cardsfolder/upcoming/tempt_with_mayhem.txt +++ b/forge-gui/res/cardsfolder/upcoming/tempt_with_mayhem.txt @@ -1,9 +1,9 @@ Name:Tempt with Mayhem ManaCost:1 R R Types:Instant -A:SP$ RepeatEach | ValidTgts$ Instant,Sorcery | TgtZone$ Stack | TgtPrompt$ Select target instant or sorcery spell | RepeatSubAbility$ DBCopy | RepeatPlayers$ Player.Opponent | SubAbility$ DBCopySelf | RepeatOptionalForEachPlayer$ True | RememberDeciders$ True | RepeatOptionalMessage$ Do you want to copy the targeted spell? | SpellDescription$ Tempting offer — Choose target instant or sorcery spell. Each opponent may copy that spell and may choose new targets for the copy they control. You copy that spell once plus an additional time for each opponent who copied the spell this way. You may choose new targets for the copies you control. -SVar:DBCopy:DB$ CopySpellAbility | Defined$ Targeted | Controller$ Remembered | Amount$ 1 | MayChooseTarget$ True +A:SP$ RepeatEach | ValidTgts$ Instant,Sorcery | TgtZone$ Stack | TgtPrompt$ Select target instant or sorcery spell | RepeatSubAbility$ DBCopy | RepeatPlayers$ Player.Opponent | SubAbility$ DBCopySelf | RepeatOptionalForEachPlayer$ True | RepeatOptionalMessage$ Do you want to copy the targeted spell? | SpellDescription$ Tempting offer — Choose target instant or sorcery spell. Each opponent may copy that spell and may choose new targets for the copy they control. You copy that spell once plus an additional time for each opponent who copied the spell this way. You may choose new targets for the copies you control. +SVar:DBCopy:DB$ CopySpellAbility | Defined$ Targeted | Controller$ Remembered | Amount$ 1 | MayChooseTarget$ True | RememberCopies$ True SVar:DBCopySelf:DB$ CopySpellAbility | Defined$ Targeted | Amount$ X | MayChooseTarget$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$RememberedSize/Plus.1 +SVar:X:PlayerCountRememberedController$Amount/Plus.1 Oracle:Tempting offer — Choose target instant or sorcery spell. Each opponent may copy that spell and may choose new targets for the copy they control. You copy that spell once plus an additional time for each opponent who copied the spell this way. You may choose new targets for the copies you control. diff --git a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java index 98cc5269900..6d14b52396e 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java @@ -223,7 +223,6 @@ public class SFilterUtil { } }; - } public static Predicate buildColorFilter(Map buttonMap) { From ca197bb2bc7f91a45ad6bfabfd43043a47791a0b Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Sun, 9 Jun 2024 01:53:30 -0400 Subject: [PATCH 3/4] M3C: 3 "easy" cards (#5396) * aether_refinery, blaster_hulk * benthic_anomaly --- .../res/cardsfolder/upcoming/aether_refinery.txt | 11 +++++++++++ forge-gui/res/cardsfolder/upcoming/aether_spike.txt | 2 +- .../res/cardsfolder/upcoming/benthic_anomaly.txt | 11 +++++++++++ forge-gui/res/cardsfolder/upcoming/blaster_hulk.txt | 12 ++++++++++++ forge-gui/res/tokenscripts/b_x_x_aetherborn.txt | 6 ++++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/aether_refinery.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/benthic_anomaly.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/blaster_hulk.txt create mode 100644 forge-gui/res/tokenscripts/b_x_x_aetherborn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/aether_refinery.txt b/forge-gui/res/cardsfolder/upcoming/aether_refinery.txt new file mode 100644 index 00000000000..6bbc6106a2d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aether_refinery.txt @@ -0,0 +1,11 @@ +Name:Aether Refinery +ManaCost:4 R R +Types:Artifact +R:Event$ AddCounter | ActiveZones$ Battlefield | ValidPlayer$ You | ValidCounterType$ ENERGY | ReplaceWith$ Twice | Description$ If you would get one or more {E}, you get twice that many {E} instead. +SVar:Twice:DB$ ReplaceCounter | ValidCounterType$ ENERGY | ChooseCounter$ True | Amount$ ReplaceCount$CounterNum/Twice +A:AB$ PutCounter | Cost$ T | Defined$ You | CounterType$ ENERGY | SubAbility$ DBChooseNumber | StackDescription$ SpellDescription | SpellDescription$ You get {E}, then you may pay one or more {E}. +SVar:DBChooseNumber:DB$ ChooseNumber | Max$ Count$YourCountersEnergy | ListTitle$ Choose amount for X | SubAbility$ DBToken | StackDescription$ None +SVar:DBToken:DB$ Token | ConditionCheckSVar$ X | UnlessCost$ Mandatory PayEnergy | UnlessPayer$ You | UnlessSwitched$ True | TokenScript$ b_x_x_aetherborn | TokenPower$ X | TokenToughness$ X | StackDescription$ SpellDescription | SpellDescription$ If you do, create an X/X black Aetherborn creature token, where X is the amount of {E} paid this way. +SVar:X:Count$ChosenNumber +DeckHas:Ability$Token & Type$Aetherborn & Color$Black +Oracle:If you would get one or more {E}, you get twice that many {E} instead.\n{T}: You get {E}, then you may pay one or more {E}. If you do, create an X/X black Aetherborn creature token, where X is the amount of {E} paid this way. diff --git a/forge-gui/res/cardsfolder/upcoming/aether_spike.txt b/forge-gui/res/cardsfolder/upcoming/aether_spike.txt index 22c3edd2270..92e5a6a1d27 100644 --- a/forge-gui/res/cardsfolder/upcoming/aether_spike.txt +++ b/forge-gui/res/cardsfolder/upcoming/aether_spike.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Instant A:SP$ Pump | TargetType$ Spell | TgtZone$ Stack | ValidTgts$ Card | SubAbility$ DBPutCounter | StackDescription$ {p:You} chooses {s:Targeted}. | SpellDescription$ Choose target spell. SVar:DBPutCounter:DB$ PutCounter | Defined$ You | AILogic$ PayEnergy | CounterType$ ENERGY | CounterNum$ 2 | SubAbility$ DBChooseNumber | SpellDescription$ You get {E}{E} (two energy counters), then you may pay any amount of {E}. -SVar:DBChooseNumber:DB$ ChooseNumber | Max$ Max | ListTitle$ Pay Energy to counter targeted spell | SubAbility$ DBPay +SVar:DBChooseNumber:DB$ ChooseNumber | Max$ Max | ListTitle$ Pay Energy to counter targeted spell | SubAbility$ DBPay | StackDescription$ None SVar:DBPay:DB$ Pump | UnlessCost$ Mandatory PayEnergy | UnlessPayer$ You | UnlessSwitched$ True | StackDescription$ None | SubAbility$ DBCounter SVar:DBCounter:DB$ Counter | Defined$ Targeted | UnlessCost$ N | UnlessPayer$ TargetedController | StackDescription$ SpellDescription | SpellDescription$ Counter that spell unless its controller pays {1} for each {E} paid this way. SVar:Max:Count$YourCountersEnergy diff --git a/forge-gui/res/cardsfolder/upcoming/benthic_anomaly.txt b/forge-gui/res/cardsfolder/upcoming/benthic_anomaly.txt new file mode 100644 index 00000000000..aa07d0c4cd0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/benthic_anomaly.txt @@ -0,0 +1,11 @@ +Name:Benthic Anomaly +ManaCost:6 U +Types:Creature Eldrazi Serpent +PT:7/8 +K:Devoid +T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigForEach | TriggerDescription$ When you cast this spell, for each opponent, choose a creature that player controls. Create a token that's a copy of one of those creatures, except its power is equal to the total power of those creatures, its toughness is equal to the total toughness of those creatures, and it's a colorless Eldrazi creature. +SVar:TrigForEach:DB$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBCopy +SVar:DBChoose:DB$ ChooseCard | Choices$ Creature.RememberedPlayerCtrl | Mandatory$ True | Amount$ 1 | ChoiceTitle$ Choose a creature this player controls | ImprintChosen$ True +SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.IsImprinted | ChoiceTitle$ Choose one of those creatures to copy | SetPower$ Imprinted$CardPower | SetToughness$ Imprinted$CardToughness | SetColor$ Colorless | SetCreatureTypes$ Eldrazi | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearImprinted$ True +Oracle:Devoid\nWhen you cast this spell, for each opponent, choose a creature that player controls. Create a token that's a copy of one of those creatures, except its power is equal to the total power of those creatures, its toughness is equal to the total toughness of those creatures, and it's a colorless Eldrazi creature. diff --git a/forge-gui/res/cardsfolder/upcoming/blaster_hulk.txt b/forge-gui/res/cardsfolder/upcoming/blaster_hulk.txt new file mode 100644 index 00000000000..5bd4b6e8b63 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blaster_hulk.txt @@ -0,0 +1,12 @@ +Name:Blaster Hulk +ManaCost:6 R R +Types:Artifact Creature Pirate +PT:8/8 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Count$CountersRemovedThisTurn ENERGY You | EffectZone$ All | Description$ This spell costs {1} less to cast for each {E} (energy counter) you've paid or lost this turn. +K:Haste +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigEnergy | TriggerDescription$ Whenever CARDNAME attacks, you get {E}{E}, then you may pay eight {E}. When you do, CARDNAME deals 8 damage divided as you choose among up to eight targets. +SVar:TrigEnergy:DB$ PutCounter | Defined$ You | CounterType$ ENERGY | CounterNum$ 2 | SubAbility$ DBTrigger +SVar:DBTrigger:DB$ ImmediateTrigger | UnlessCost$ PayEnergy<8> | UnlessPayer$ You | UnlessSwitched$ True | Execute$ TrigDamage | TriggerDescription$ When you do, CARDNAME deals 8 damage divided as you choose among up to eight targets. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | TgtPrompt$ Select up to eight targets | NumDmg$ 8 | TargetMin$ 0 | TargetMax$ 8 | DividedAsYouChoose$ 8 +SVar:HasAttackEffect:TRUE +Oracle:This spell costs {1} less to cast for each {E} (energy counter) you've paid or lost this turn.\nHaste\nWhenever Blaster Hulk attacks, you get {E}{E}, then you may pay eight {E}. When you do, Blaster Hulk deals 8 damage divided as you choose among up to eight targets. diff --git a/forge-gui/res/tokenscripts/b_x_x_aetherborn.txt b/forge-gui/res/tokenscripts/b_x_x_aetherborn.txt new file mode 100644 index 00000000000..b0b24282d7f --- /dev/null +++ b/forge-gui/res/tokenscripts/b_x_x_aetherborn.txt @@ -0,0 +1,6 @@ +Name:Aetherborn Token +ManaCost:no cost +Colors:black +Types:Creature Aetherborn +PT:*/* +Oracle: From d06aab9a0b972c571dd137840ff364cc5840a7a3 Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Sun, 9 Jun 2024 01:55:06 -0400 Subject: [PATCH 4/4] MH3: volatile_stormdrake + support (#5385) --- .../main/java/forge/game/card/CardFactoryUtil.java | 3 ++- .../cardsfolder/upcoming/volatile_stormdrake.txt | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/volatile_stormdrake.txt diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 3f0aa5edfa7..0be50093c44 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3875,7 +3875,8 @@ public class CardFactoryUtil { final String[] k = keyword.split(":"); sbDesc.append(" from ").append(k[2]); - sbValid.append("| ValidSource$ ").append(k[1]); + final String param = k[2].contains("abilities") ? "ValidSA$ " : "ValidSource$ "; + sbValid.append("| ").append(param).append(k[1]); } String effect = "Mode$ CantTarget | ValidCard$ Card.Self | Secondary$ True" diff --git a/forge-gui/res/cardsfolder/upcoming/volatile_stormdrake.txt b/forge-gui/res/cardsfolder/upcoming/volatile_stormdrake.txt new file mode 100644 index 00000000000..0b57938a920 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/volatile_stormdrake.txt @@ -0,0 +1,14 @@ +Name:Volatile Stormdrake +ManaCost:1 U +Types:Creature Drake +PT:3/2 +K:Flying +K:Hexproof:Activated,Triggered:activated and triggered abilities +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExchange | TriggerDescription$ When CARDNAME enters the battlefield, exchange control of CARDNAME and target creature an opponent controls. If you do, you get {E}{E}{E}{E}, then sacrifice that creature unless you pay an amount of {E} equal to its mana value. +SVar:TrigExchange:DB$ ExchangeControl | Defined$ Self | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberExchanged$ True | SubAbility$ Energy +SVar:Energy:DB$ PutCounter | ConditionDefined$ Remembered | ConditionPresent$ Card | Defined$ You | CounterType$ ENERGY | CounterNum$ 4 | SubAbility$ Sacrifice +SVar:Sacrifice:DB$ SacrificeAll | ConditionDefined$ Remembered | ConditionPresent$ Card | Defined$ Targeted | UnlessCost$ PayEnergy | UnlessPayer$ You | SubAbility$ Cleanup +SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True +SVar:N:Targeted$CardManaCost +DeckHas:Ability$Sacrifice +Oracle:Flying, hexproof from activated and triggered abilities\nWhen Volatile Stormdrake enters the battlefield, exchange control of Volatile Stormdrake and target creature an opponent controls. If you do, you get {E}{E}{E}{E}, then sacrifice that creature unless you pay an amount of {E} equal to its mana value.