- Added a way to force execution of a portion of card script when setting up game state (needed for some puzzles that utilize cards that dynamically set up effects when they ETB, e.g. Suspension Field).

- Added PC_041415 puzzle by Xitax.
This commit is contained in:
Agetian
2017-07-31 05:27:15 +00:00
parent 7957135979
commit c34fae302e
3 changed files with 54 additions and 0 deletions

1
.gitattributes vendored
View File

@@ -19407,6 +19407,7 @@ forge-gui/res/music/menus/Lord[!!-~]of[!!-~]the[!!-~]Land.mp3 -text
forge-gui/res/music/menus/The[!!-~]Pyre.mp3 -text
forge-gui/res/puzzle/PC_033115.pzl -text
forge-gui/res/puzzle/PC_040715.pzl -text
forge-gui/res/puzzle/PC_041415.pzl -text
forge-gui/res/puzzle/PC_050515.pzl -text
forge-gui/res/puzzle/PC_051215.pzl -text
forge-gui/res/puzzle/PC_051915.pzl -text

View File

@@ -21,6 +21,7 @@ import forge.game.card.CardFactory;
import forge.game.card.CounterType;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
@@ -54,6 +55,8 @@ public abstract class GameState {
private final Map<Card, List<String>> cardToChosenClrs = new HashMap<>();
private final Map<Card, String> cardToChosenType = new HashMap<>();
private final Map<Card, String> cardToScript = new HashMap<>();
private final Map<String, String> abilityString = new HashMap<>();
private String tChangePlayer = "NONE";
@@ -332,6 +335,7 @@ public abstract class GameState {
markedDamage.clear();
cardToChosenClrs.clear();
cardToChosenType.clear();
cardToScript.clear();
Player newPlayerTurn = tChangePlayer.equals("human") ? human : tChangePlayer.equals("ai") ? ai : null;
PhaseType newPhase = tChangePhase.equals("none") ? null : PhaseType.smartValueOf(tChangePhase);
@@ -356,6 +360,7 @@ public abstract class GameState {
handleCardAttachments();
handleChosenEntities();
handleScriptExecution();
handleMarkedDamage();
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
@@ -367,6 +372,35 @@ public abstract class GameState {
game.getAction().checkStateEffects(true); //ensure state based effects and triggers are updated
}
private void handleScriptExecution() {
for (Entry<Card, String> scriptPtr : cardToScript.entrySet()) {
Card c = scriptPtr.getKey();
String sPtr = scriptPtr.getValue();
// Determine if there's a forced target involved
int tgtID = -1;
if (sPtr.contains("->")) {
tgtID = Integer.parseInt(sPtr.substring(sPtr.indexOf("->") + 2));
sPtr = sPtr.substring(0, sPtr.indexOf("->"));
}
for (Entry<String, String> svar : c.getSVars().entrySet()) {
String svarName = svar.getKey();
String svarValue = svar.getValue();
if (svarName.equals(sPtr)) {
SpellAbility sa = AbilityFactory.getAbility(svarValue, c);
sa.setActivatingPlayer(c.getController());
if (tgtID != -1) {
sa.getTargets().add(idToCard.get(tgtID));
}
sa.resolve();
}
}
}
}
private void handleMarkedDamage() {
for (Entry<Card, Integer> entry : markedDamage.entrySet()) {
Card c = entry.getKey();
@@ -557,6 +591,8 @@ public abstract class GameState {
cardToChosenClrs.put(c, Arrays.asList(info.substring(info.indexOf(':') + 1).split(",")));
} else if (info.startsWith("ChosenType:")) {
cardToChosenType.put(c, info.substring(info.indexOf(':') + 1));
} else if (info.startsWith("ExecuteScript:")) {
cardToScript.put(c, info.substring(info.indexOf(':') + 1));
}
}

View File

@@ -0,0 +1,17 @@
[metadata]
Name:Perplexing Chimera (GatheringMagic.com) 041415 - Plans Within Plans
URL:http://www.gatheringmagic.com/seanuy-041415-perplexing-chimera-3-plans-within-plans/
Goal:Win
Turns:1
Difficulty:Hard
Description:Win this turn. Start by casting Taigam's Scheming.
[state]
ActivePlayer=Human
ActivePhase=Main1
HumanLife=9
AILife=6
humanhand=Reduce in Stature|Set:DTK; Cloudform|Set:FRF; Flamewake Phoenix|Set:FRF; Taigam's Scheming|Set:KTK
humanlibrary=Mountain|Set:DTK; Vial of Dragonfire|Set:DTK; Hidden Dragonslayer|Set:DTK; Mirror Mockery|Set:DTK; Rite of Undoing|Set:FRF
humanbattlefield=Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Wind-Scarred Crag|Set:KTK; Monastery Flock|Set:KTK; Zephyr Scribe|Set:DTK; Watcher of the Roost|FaceDown|Set:KTK; Ugin's Construct|Set:FRF; Suspension Field|Set:KTK|ExecuteScript:DBEffect->101
AIexile=Mistfire Adept|Set:FRF|Id:101
aibattlefield=Island|Set:DTK|Tapped; Island|Set:DTK; Swamp|Set:DTK|Tapped; Swamp|Set:DTK|Tapped; Swamp|Set:DTK; Forest|Set:DTK|Tapped; Forest|Set:DTK; Thornwood Falls|Set:FRF; Opulent Palace|Set:KTK; Elusive Spellfist|Tapped|Set:DTK; Jeskai Windscout|Set:KTK; Monastery Loremaster|Set:DTK; Bellowing Saddlebrute|Set:KTK; Sagu Archer|Set:KTK; Goblin Boom Keg|Set:FRF