mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
- 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.
This commit is contained in:
@@ -1,16 +1,11 @@
|
|||||||
package forge.ai;
|
package forge.ai;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import java.io.InputStream;
|
import com.google.common.collect.Lists;
|
||||||
import java.io.InputStreamReader;
|
import com.google.common.collect.Maps;
|
||||||
import java.util.*;
|
import com.google.common.collect.Multimap;
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import com.google.common.collect.*;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import forge.StaticData;
|
import forge.StaticData;
|
||||||
|
import forge.card.CardEdition;
|
||||||
import forge.card.CardStateName;
|
import forge.card.CardStateName;
|
||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
import forge.card.mana.ManaAtom;
|
import forge.card.mana.ManaAtom;
|
||||||
@@ -18,12 +13,7 @@ import forge.game.Game;
|
|||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.ability.AbilityFactory;
|
import forge.game.ability.AbilityFactory;
|
||||||
import forge.game.ability.effects.DetachedCardEffect;
|
import forge.game.ability.effects.DetachedCardEffect;
|
||||||
import forge.game.card.Card;
|
import forge.game.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.token.TokenInfo;
|
import forge.game.card.token.TokenInfo;
|
||||||
import forge.game.combat.Combat;
|
import forge.game.combat.Combat;
|
||||||
import forge.game.combat.CombatUtil;
|
import forge.game.combat.CombatUtil;
|
||||||
@@ -38,8 +28,17 @@ import forge.game.zone.PlayerZone;
|
|||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.item.IPaperCard;
|
import forge.item.IPaperCard;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
|
import forge.item.PaperToken;
|
||||||
import forge.util.TextUtil;
|
import forge.util.TextUtil;
|
||||||
import forge.util.collect.FCollectionView;
|
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 {
|
public abstract class GameState {
|
||||||
private static final Map<ZoneType, String> ZONES = new HashMap<>();
|
private static final Map<ZoneType, String> ZONES = new HashMap<>();
|
||||||
@@ -1201,6 +1200,15 @@ public abstract class GameState {
|
|||||||
// TODO Make sure Game State conversion works with new tokens
|
// TODO Make sure Game State conversion works with new tokens
|
||||||
String tokenStr = cardinfo[0].substring(2);
|
String tokenStr = cardinfo[0].substring(2);
|
||||||
c = new TokenInfo(tokenStr).makeOneToken(player);
|
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 {
|
} else {
|
||||||
PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode);
|
PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode);
|
||||||
if (pc == null) {
|
if (pc == null) {
|
||||||
|
|||||||
18
forge-gui/res/puzzle/PS_BRO1.pzl
Normal file
18
forge-gui/res/puzzle/PS_BRO1.pzl
Normal file
@@ -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
|
||||||
16
forge-gui/res/puzzle/PS_BRO2.pzl
Normal file
16
forge-gui/res/puzzle/PS_BRO2.pzl
Normal file
@@ -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
|
||||||
17
forge-gui/res/puzzle/PS_BRO3.pzl
Normal file
17
forge-gui/res/puzzle/PS_BRO3.pzl
Normal file
@@ -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
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
Name:Spirit token
|
Name:Spirit Token
|
||||||
ManaCost:no cost
|
ManaCost:no cost
|
||||||
Types:Creature Spirit
|
Types:Creature Spirit
|
||||||
Colors:blue
|
Colors:blue
|
||||||
|
|||||||
Reference in New Issue
Block a user