mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 02:08:00 +00:00
- 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:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
17
forge-gui/res/puzzle/PC_041415.pzl
Normal file
17
forge-gui/res/puzzle/PC_041415.pzl
Normal 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
|
||||
Reference in New Issue
Block a user