From be81ba5e15c61e2c31bf9c230e59d8c56311bbc6 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 13 Aug 2021 21:25:24 +0200 Subject: [PATCH 1/3] Fix life lost triggers --- forge-ai/src/main/java/forge/ai/AiAttackController.java | 1 - forge-core/src/main/java/forge/CardStorageReader.java | 2 +- forge-core/src/main/java/forge/card/CardRules.java | 2 +- .../src/main/java/forge/game/ability/effects/RepeatEffect.java | 2 +- forge-gui/res/cardsfolder/f/first_response.txt | 2 +- forge-gui/res/cardsfolder/p/paladin_of_atonement.txt | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index a0dd1b7bbbc..cbebf5990d8 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -208,7 +208,6 @@ public class AiAttackController { * @return a boolean. */ public final boolean isEffectiveAttacker(final Player ai, final Card attacker, final Combat combat) { - // if the attacker will die when attacking don't attack if ((attacker.getNetToughness() + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, null, combat, true)) <= 0) { return false; diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index 3f6c89288df..12184eecf60 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -310,7 +310,7 @@ public class CardStorageReader { private void executeLoadTask(final Collection result, final List>> tasks, final CountDownLatch cdl) { try { - if ( useThreadPool ) { + if (useThreadPool) { final ExecutorService executor = ThreadUtil.getComputingPool(0.5f); final List>> parts = executor.invokeAll(tasks); executor.shutdown(); diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 174229fe0c0..ff8b6dd08fc 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -423,7 +423,7 @@ public final class CardRules implements ICardCharacteristics { String variable = colonPos > 0 ? value.substring(0, colonPos) : value; value = colonPos > 0 ? value.substring(1+colonPos) : null; - if ( "RemoveDeck".equals(variable) ) { + if ("RemoveDeck".equals(variable)) { this.removedFromAIDecks |= "All".equalsIgnoreCase(value); this.removedFromRandomDecks |= "Random".equalsIgnoreCase(value); this.removedFromNonCommanderDecks |= "NonCommander".equalsIgnoreCase(value); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index 92652afa881..9b72db247ed 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -17,7 +17,7 @@ public class RepeatEffect extends SpellAbilityEffect { @Override protected String getStackDescription(final SpellAbility sa) { return "Repeat something. Somebody should really write a better StackDescription!"; - } // end repeatStackDescription() + } @Override public void resolve(final SpellAbility sa) { diff --git a/forge-gui/res/cardsfolder/f/first_response.txt b/forge-gui/res/cardsfolder/f/first_response.txt index 92ed33c8ec9..cfdedce96d5 100644 --- a/forge-gui/res/cardsfolder/f/first_response.txt +++ b/forge-gui/res/cardsfolder/f/first_response.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | LegacyImage$ w 1 1 soldier m15 -SVar:X:Count$Controller$LifeLostLastTurn +SVar:X:PlayerCountPropertyYou$LifeLostLastTurn SVar:Picture:http://www.wizards.com/global/images/magic/general/first_response.jpg Oracle:At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/paladin_of_atonement.txt b/forge-gui/res/cardsfolder/p/paladin_of_atonement.txt index c026ed41c79..d53113eadaf 100644 --- a/forge-gui/res/cardsfolder/p/paladin_of_atonement.txt +++ b/forge-gui/res/cardsfolder/p/paladin_of_atonement.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you gain life equal to its toughness. SVar:TrigGainLife:DB$GainLife | Defined$ TriggeredCardController | LifeAmount$ Y -SVar:X:Count$Controller$LifeLostLastTurn +SVar:X:PlayerCountPropertyYou$LifeLostLastTurn SVar:Y:TriggeredCard$CardToughness SVar:Picture:http://www.wizards.com/global/images/magic/general/paladin_of_atonement.jpg Oracle:At the beginning of each upkeep, if you lost life last turn, put a +1/+1 counter on Paladin of Atonement.\nWhen Paladin of Atonement dies, you gain life equal to its toughness. \ No newline at end of file From d9411ae2a23b32be05b471056f6a63e7e138d259 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Fri, 13 Aug 2021 23:27:07 +0100 Subject: [PATCH 2/3] Small edition fixes --- forge-gui/res/editions/Jumpstart Historic Horizons.txt | 5 +++++ forge-gui/res/editions/Magic Premiere Shop 2008.txt | 2 +- forge-gui/res/editions/Secret Lair Drop Series.txt | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Jumpstart Historic Horizons.txt b/forge-gui/res/editions/Jumpstart Historic Horizons.txt index f408849e34e..c999db4ba6e 100644 --- a/forge-gui/res/editions/Jumpstart Historic Horizons.txt +++ b/forge-gui/res/editions/Jumpstart Historic Horizons.txt @@ -788,6 +788,11 @@ ScryfallCode=J21 780 C Tranquil Thicket 781 C Unknown Shores 782 C Wind-Scarred Crag +783 L Plains +784 L Island +785 L Swamp +786 L Mountain +787 L Forest [tokens] u_8_8_kraken diff --git a/forge-gui/res/editions/Magic Premiere Shop 2008.txt b/forge-gui/res/editions/Magic Premiere Shop 2008.txt index 63b990b169a..8d5fca248b0 100644 --- a/forge-gui/res/editions/Magic Premiere Shop 2008.txt +++ b/forge-gui/res/editions/Magic Premiere Shop 2008.txt @@ -12,4 +12,4 @@ ScryfallCode=PMPS08 3 R Swamp @John Avon 4 R Mountain @John Avon 5 R Forest @John Avon -a1%202007 R Jaya Ballard, Task Mage @Matt Cavotta +A1 R Jaya Ballard, Task Mage @Matt Cavotta diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index cd84f9bcac1..b6940c4e8bf 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -55,6 +55,7 @@ ScryfallCode=SLD 56 R Arcbound Ravager @Danny Miller 57 M Darksteel Colossus @Hector Ortiz 58 R Walking Ballista @Bad Flip Productions, Inc. +59 R Squire @Noah Bradley 60 R Storm Crow @Jesper Ejsing 61 R Goblin Snowman @Victor Adame Minguez 62 R Mudhole @Titus Lunter From c9d88ae384f616c90929e9a3a52b064e12684624 Mon Sep 17 00:00:00 2001 From: Bug Hunter Date: Sat, 14 Aug 2021 04:26:30 +0000 Subject: [PATCH 3/3] Fixes for Grist --- forge-ai/src/main/java/forge/ai/GameState.java | 6 +++--- forge-gui/res/cardsfolder/g/grist_the_hunger_tide.txt | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 5ad90a81653..53ea7c874bd 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -314,14 +314,14 @@ public abstract class GameState { } else if (c.getCurrentStateName().equals(CardStateName.Modal)) { newText.append("|Modal"); } - if (c.isAttachedToEntity()) { - newText.append("|AttachedTo:").append(c.getEntityAttachedTo().getId()); - } + if (c.getPlayerAttachedTo() != null) { // TODO: improve this for game states with more than two players newText.append("|EnchantingPlayer:"); Player p = c.getPlayerAttachedTo(); newText.append(p.getController().isAI() ? "AI" : "HUMAN"); + } else if (c.isAttachedToEntity()) { + newText.append("|AttachedTo:").append(c.getEntityAttachedTo().getId()); } if (c.getDamage() > 0) { diff --git a/forge-gui/res/cardsfolder/g/grist_the_hunger_tide.txt b/forge-gui/res/cardsfolder/g/grist_the_hunger_tide.txt index 013b20ecb5d..f7d863ac76a 100644 --- a/forge-gui/res/cardsfolder/g/grist_the_hunger_tide.txt +++ b/forge-gui/res/cardsfolder/g/grist_the_hunger_tide.txt @@ -3,13 +3,11 @@ ManaCost:1 B G Types:Legendary Planeswalker Grist Loyalty:3 S:Mode$ Continuous | Affected$ Card.Self | ExcludeZone$ Battlefield | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature & Insect | CharacteristicDefining$ True | Description$ As long as CARDNAME isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types. -A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | SubAbility$ DBRepeat | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process. -SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ CleanupBegin | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledInsect | RepeatSVarCompare$ EQ1 | SubAbility$ DBCleanup +A:AB$ Repeat | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | RepeatSubAbility$ CleanupBegin | RepeatCheckSVar$ MilledInsect | RepeatSVarCompare$ EQ1 | SubAbility$ DBCleanup | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process. | StackDescription$ Spelldescription SVar:CleanupBegin:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ bg_1_1_insect | TokenOwner$ You | Planeswalker$ True | SubAbility$ DBMill | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process. SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 1 | RememberMilled$ True | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Insect | ConditionCompare$ EQ1 -SVar:MaxRepeats:Count$InYourLibrary +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Insect | ConditionCompare$ EQ1 SVar:MilledInsect:Remembered$Valid Card.Insect SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ ImmediateTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Execute$ TrigDestroy | UnlessCost$ Sac<1/Creature> | UnlessPayer$ You | UnlessSwitched$ True | SpellDescription$ You may sacrifice a creature. When you do, destroy target creature or planeswalker. @@ -18,4 +16,4 @@ A:AB$ LoseLife | Cost$ SubCounter<5/LOYALTY> | LifeAmount$ X | Defined$ Player.O SVar:X:Count$TypeInYourYard.Creature DeckHas:Ability$Token & Ability$Mill DeckHints:Type$Insect -Oracle:As long as Grist, the Hunger Tide isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types.\n[+1]: Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.\n[−2]: You may sacrifice a creature. When you do, destroy target creature or planeswalker.\n[−5]: Each opponent loses life equal to the number of creature cards in your graveyard. +Oracle:As long as Grist, the Hunger Tide isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types.\n[+1]: Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.\n[-2]: You may sacrifice a creature. When you do, destroy target creature or planeswalker.\n[-5]: Each opponent loses life equal to the number of creature cards in your graveyard.