- 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

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));
}
}