mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
- Some puzzle mode improvements. Added support for precasting simple (untargeted) spells at the beginning of the game via AIPrecast/HumanPrecast parameters. Added support for Flipped and Meld card states.
This commit is contained in:
@@ -63,6 +63,9 @@ public abstract class GameState {
|
|||||||
private String tChangePlayer = "NONE";
|
private String tChangePlayer = "NONE";
|
||||||
private String tChangePhase = "NONE";
|
private String tChangePhase = "NONE";
|
||||||
|
|
||||||
|
private String precastHuman = null;
|
||||||
|
private String precastAI = null;
|
||||||
|
|
||||||
public GameState() {
|
public GameState() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,6 +201,10 @@ public abstract class GameState {
|
|||||||
}
|
}
|
||||||
if (c.getCurrentStateName().equals(CardStateName.Transformed)) {
|
if (c.getCurrentStateName().equals(CardStateName.Transformed)) {
|
||||||
newText.append("|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<CounterType, Integer> counters = c.getCounters();
|
Map<CounterType, Integer> counters = c.getCounters();
|
||||||
if (!counters.isEmpty()) {
|
if (!counters.isEmpty()) {
|
||||||
@@ -372,10 +379,16 @@ public abstract class GameState {
|
|||||||
aiCardTexts.put(ZoneType.Command, categoryValue);
|
aiCardTexts.put(ZoneType.Command, categoryValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (categoryName.startsWith("ability")) {
|
else if (categoryName.endsWith("ability")) {
|
||||||
abilityString.put(categoryName.substring("ability".length()), categoryValue);
|
abilityString.put(categoryName.substring("ability".length()), categoryValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (categoryName.endsWith("precast")) {
|
||||||
|
if (isHuman)
|
||||||
|
precastHuman = categoryValue;
|
||||||
|
else
|
||||||
|
precastAI = categoryValue;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
System.out.println("Unknown key: " + categoryName);
|
System.out.println("Unknown key: " + categoryName);
|
||||||
}
|
}
|
||||||
@@ -430,6 +443,7 @@ public abstract class GameState {
|
|||||||
handleChosenEntities();
|
handleChosenEntities();
|
||||||
handleRememberedEntities();
|
handleRememberedEntities();
|
||||||
handleScriptExecution();
|
handleScriptExecution();
|
||||||
|
handlePrecastSpells(human, ai);
|
||||||
handleMarkedDamage();
|
handleMarkedDamage();
|
||||||
|
|
||||||
// Combat only works for 1v1 matches for now (which are the only matches dev mode supports anyway)
|
// 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();
|
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() {
|
private void handleMarkedDamage() {
|
||||||
@@ -698,6 +740,10 @@ public abstract class GameState {
|
|||||||
}
|
}
|
||||||
} else if (info.startsWith("Transformed")) {
|
} else if (info.startsWith("Transformed")) {
|
||||||
c.setState(CardStateName.Transformed, true);
|
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")) {
|
} else if (info.startsWith("IsCommander")) {
|
||||||
// TODO: This doesn't seem to properly restore the ability to play the commander. Why?
|
// TODO: This doesn't seem to properly restore the ability to play the commander. Why?
|
||||||
c.setCommander(true);
|
c.setCommander(true);
|
||||||
|
|||||||
@@ -34,19 +34,19 @@ public class Puzzle extends GameState implements InventoryItem, Comparable {
|
|||||||
for(String line : metadataLines) {
|
for(String line : metadataLines) {
|
||||||
String[] split = line.split(":");
|
String[] split = line.split(":");
|
||||||
if ("Name".equalsIgnoreCase(split[0])) {
|
if ("Name".equalsIgnoreCase(split[0])) {
|
||||||
this.name = split[1];
|
this.name = split[1].trim();
|
||||||
} else if ("Goal".equalsIgnoreCase(split[0])) {
|
} else if ("Goal".equalsIgnoreCase(split[0])) {
|
||||||
this.goal = split[1];
|
this.goal = split[1].trim();
|
||||||
} else if ("Url".equalsIgnoreCase(split[0])) {
|
} else if ("Url".equalsIgnoreCase(split[0])) {
|
||||||
this.url = split[1];
|
this.url = split[1].trim();
|
||||||
} else if ("Turns".equalsIgnoreCase(split[0])) {
|
} else if ("Turns".equalsIgnoreCase(split[0])) {
|
||||||
this.turns = Integer.parseInt(split[1]);
|
this.turns = Integer.parseInt(split[1]);
|
||||||
} else if ("Difficulty".equalsIgnoreCase(split[0])) {
|
} else if ("Difficulty".equalsIgnoreCase(split[0])) {
|
||||||
this.difficulty = split[1];
|
this.difficulty = split[1].trim();
|
||||||
} else if ("Description".equalsIgnoreCase(split[0])) {
|
} else if ("Description".equalsIgnoreCase(split[0])) {
|
||||||
this.description = split[1];
|
this.description = split[1].trim();
|
||||||
} else if ("Targets".equalsIgnoreCase(split[0])) {
|
} else if ("Targets".equalsIgnoreCase(split[0])) {
|
||||||
this.targets = split[1];
|
this.targets = split[1].trim();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user