diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 91e0320ebbb..b655b4c5a66 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -62,6 +62,9 @@ public abstract class GameState { private String tChangePlayer = "NONE"; private String tChangePhase = "NONE"; + + private String precastHuman = null; + private String precastAI = null; public GameState() { } @@ -198,6 +201,10 @@ public abstract class GameState { } if (c.getCurrentStateName().equals(CardStateName.Transformed)) { newText.append("|Transformed"); + } else if (c.getCurrentStateName().equals(CardStateName.Flipped)) { + newText.append("|Flipped"); + } else if (c.getCurrentStateName().equals(CardStateName.Meld)) { + newText.append("|Meld"); } Map counters = c.getCounters(); if (!counters.isEmpty()) { @@ -372,10 +379,16 @@ public abstract class GameState { aiCardTexts.put(ZoneType.Command, categoryValue); } - else if (categoryName.startsWith("ability")) { + else if (categoryName.endsWith("ability")) { abilityString.put(categoryName.substring("ability".length()), categoryValue); } + else if (categoryName.endsWith("precast")) { + if (isHuman) + precastHuman = categoryValue; + else + precastAI = categoryValue; + } else { System.out.println("Unknown key: " + categoryName); } @@ -430,6 +443,7 @@ public abstract class GameState { handleChosenEntities(); handleRememberedEntities(); handleScriptExecution(); + handlePrecastSpells(human, ai); handleMarkedDamage(); // Combat only works for 1v1 matches for now (which are the only matches dev mode supports anyway) @@ -520,7 +534,35 @@ public abstract class GameState { } sa.resolve(); } + } + private void handlePrecastSpells(final Player human, final Player ai) { + if (precastHuman != null) { + String[] spellList = TextUtil.split(precastHuman, ','); + for (String spell : spellList) { + precastSpellFromCard(spell, human); + } + } + if (precastAI != null) { + String[] spellList = TextUtil.split(precastAI, ','); + for (String spell : spellList) { + precastSpellFromCard(spell, ai); + } + } + } + + private void precastSpellFromCard(String cardName, Player activator) { + PaperCard pc = StaticData.instance().getCommonCards().getCard(cardName); + + if (pc == null) { + System.err.println("ERROR: Could not find a card with name " + cardName + " to precast!"); + return; + } + + Card c = Card.fromPaperCard(pc, activator); + SpellAbility sa = c.getFirstSpellAbility(); + sa.setActivatingPlayer(activator); + sa.resolve(); } private void handleMarkedDamage() { @@ -698,6 +740,10 @@ public abstract class GameState { } } else if (info.startsWith("Transformed")) { c.setState(CardStateName.Transformed, true); + } else if (info.startsWith("Flipped")) { + c.setState(CardStateName.Flipped, true); + } else if (info.startsWith("Meld")) { + c.setState(CardStateName.Meld, true); } else if (info.startsWith("IsCommander")) { // TODO: This doesn't seem to properly restore the ability to play the commander. Why? c.setCommander(true); diff --git a/forge-gui/src/main/java/forge/puzzle/Puzzle.java b/forge-gui/src/main/java/forge/puzzle/Puzzle.java index 36243a6db6c..3030b34b1d0 100644 --- a/forge-gui/src/main/java/forge/puzzle/Puzzle.java +++ b/forge-gui/src/main/java/forge/puzzle/Puzzle.java @@ -34,19 +34,19 @@ public class Puzzle extends GameState implements InventoryItem, Comparable { for(String line : metadataLines) { String[] split = line.split(":"); if ("Name".equalsIgnoreCase(split[0])) { - this.name = split[1]; + this.name = split[1].trim(); } else if ("Goal".equalsIgnoreCase(split[0])) { - this.goal = split[1]; + this.goal = split[1].trim(); } else if ("Url".equalsIgnoreCase(split[0])) { - this.url = split[1]; + this.url = split[1].trim(); } else if ("Turns".equalsIgnoreCase(split[0])) { this.turns = Integer.parseInt(split[1]); } else if ("Difficulty".equalsIgnoreCase(split[0])) { - this.difficulty = split[1]; + this.difficulty = split[1].trim(); } else if ("Description".equalsIgnoreCase(split[0])) { - this.description = split[1]; + this.description = split[1].trim(); } else if ("Targets".equalsIgnoreCase(split[0])) { - this.targets = split[1]; + this.targets = split[1].trim(); } } }