From 5a6f0cab0d5606bd6ec01bfdfb263f1567ac5e58 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 20 Jan 2023 11:35:11 +0300 Subject: [PATCH] - Added puzzles PS_BRO1 - PS_BRO3. (#2279) - Added a way to add tokens by script from GameState. - Fixed u_2_2_spirit_vigilance_drawcounter token name capitalization. --- .../src/main/java/forge/ai/GameState.java | 40 +++++++++++-------- forge-gui/res/puzzle/PS_BRO1.pzl | 18 +++++++++ forge-gui/res/puzzle/PS_BRO2.pzl | 16 ++++++++ forge-gui/res/puzzle/PS_BRO3.pzl | 17 ++++++++ .../u_2_2_spirit_vigilance_drawcounter.txt | 2 +- 5 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 forge-gui/res/puzzle/PS_BRO1.pzl create mode 100644 forge-gui/res/puzzle/PS_BRO2.pzl create mode 100644 forge-gui/res/puzzle/PS_BRO3.pzl diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 7ad1fd3632a..56dc02ed8c7 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1,16 +1,11 @@ package forge.ai; -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.*; -import java.util.Map.Entry; - -import com.google.common.collect.*; -import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; - +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import forge.StaticData; +import forge.card.CardEdition; import forge.card.CardStateName; import forge.card.MagicColor; import forge.card.mana.ManaAtom; @@ -18,12 +13,7 @@ import forge.game.Game; import forge.game.GameEntity; import forge.game.ability.AbilityFactory; import forge.game.ability.effects.DetachedCardEffect; -import forge.game.card.Card; -import forge.game.card.CardCloneStates; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardFactory; -import forge.game.card.CounterType; +import forge.game.card.*; import forge.game.card.token.TokenInfo; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; @@ -38,8 +28,17 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperToken; import forge.util.TextUtil; import forge.util.collect.FCollectionView; +import org.apache.commons.lang3.StringUtils; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.*; +import java.util.Map.Entry; +import java.util.stream.Stream; public abstract class GameState { private static final Map ZONES = new HashMap<>(); @@ -1201,6 +1200,15 @@ public abstract class GameState { // TODO Make sure Game State conversion works with new tokens String tokenStr = cardinfo[0].substring(2); c = new TokenInfo(tokenStr).makeOneToken(player); + } else if (cardinfo[0].startsWith("T:")) { + String tokenStr = cardinfo[0].substring(2); + PaperToken token = StaticData.instance().getAllTokens().getToken(tokenStr, + setCode != null ? setCode : CardEdition.UNKNOWN.getName()); + if (token == null) { + System.err.println("ERROR: Tried to create a non-existent token named " + cardinfo[0] + " when loading game state!"); + continue; + } + c = Card.fromPaperCard(token, player, player.getGame()); } else { PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode); if (pc == null) { diff --git a/forge-gui/res/puzzle/PS_BRO1.pzl b/forge-gui/res/puzzle/PS_BRO1.pzl new file mode 100644 index 00000000000..95ecd4612ca --- /dev/null +++ b/forge-gui/res/puzzle/PS_BRO1.pzl @@ -0,0 +1,18 @@ +[metadata] +Name:Possibility Storm - The Brothers' War #01 +URL:https://www.patreon.com/mtgpuzzles +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Start in your upkeep while resolving The Temporal Anchor's Scry 2 trigger. Assume that, in your library, you have additional copies of each card under your control and in your hand. Both graveyards start empty. Remember that your solution must satisfy all possible blocking decisions. +[state] +turn=1 +activeplayer=p1 +activephase=CLEANUP +activephaseadvance=UPKEEP +p0life=20 +p0hand=Defenestrate;Carrion Locust;Dreadhound +p0library=Haywire Mite;Bushwhack;Defenestrate;Forest;Swamp;Island;The Temporal Anchor;Rona, Sheoldred's Faithful;Hoarding Recluse;Fauna Shaman;Island;Swamp;Forest;Carrion Locust;Dreadhound +p0battlefield=The Temporal Anchor;Rona, Sheoldred's Faithful;Hoarding Recluse;Fauna Shaman;Island;Island;Swamp;Swamp;Forest;Forest +p1life=3 +p1battlefield=The Stasis Coffin;Glittering Stockpile|Counters:STASH=3;Patchwork Crawler;Patchwork Crawler;Cradle Clearcutter diff --git a/forge-gui/res/puzzle/PS_BRO2.pzl b/forge-gui/res/puzzle/PS_BRO2.pzl new file mode 100644 index 00000000000..fc54e74508c --- /dev/null +++ b/forge-gui/res/puzzle/PS_BRO2.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - The Brothers' War #02 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2022/12/213.-BRO2-scaled.jpg?ssl=1 +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Assume your opponent has no mana available. Remember that your solution must satisfy all possible blocking decisions. +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0hand=Giant Growth;Mishra's Command;Audacity;Sibling Rivalry +p0battlefield=Rootwire Amalgam;Cradle Clearcutter;Hurler Cyclops;Rockfall Vale;Rockfall Vale;Mountain;Mountain;Forest +p1life=26 +p1battlefield=Ivy, Gleeful Spellthief|Counters:P1P1=1 diff --git a/forge-gui/res/puzzle/PS_BRO3.pzl b/forge-gui/res/puzzle/PS_BRO3.pzl new file mode 100644 index 00000000000..d1ce36a3586 --- /dev/null +++ b/forge-gui/res/puzzle/PS_BRO3.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - The Brothers' War #03 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2023/01/latest-scaled.jpg?ssl=1 +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Assume that any unknown cards you could draw are not relevant to the puzzle. Remember that your solution must satisfy all possible blocking decisions. +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0hand=Planar Incision;Fateful Handoff;Energy Refractor;Grafted Identity +p0library=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +p0battlefield=Phyrexian Fleshgorger;Teferi, Temporal Pilgrim|Counters:LOYALTY=5;Island;Island;Island;Swamp;Swamp;Swamp;T:u_2_2_spirit_vigilance_drawcounter|Counters:P1P1=1 +p1life=10 +p1battlefield=Devilish Valet diff --git a/forge-gui/res/tokenscripts/u_2_2_spirit_vigilance_drawcounter.txt b/forge-gui/res/tokenscripts/u_2_2_spirit_vigilance_drawcounter.txt index 284e5b3cab0..ab6000bc60d 100644 --- a/forge-gui/res/tokenscripts/u_2_2_spirit_vigilance_drawcounter.txt +++ b/forge-gui/res/tokenscripts/u_2_2_spirit_vigilance_drawcounter.txt @@ -1,4 +1,4 @@ -Name:Spirit token +Name:Spirit Token ManaCost:no cost Types:Creature Spirit Colors:blue