magarena/src/magic/game/state/GameStateFileReader.java

84 lines
3.6 KiB
Java

package magic.game.state;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import magic.utility.FileIO;
public final class GameStateFileReader {
private GameStateFileReader() {}
public static final String TEST_FILE_EXTENSION = ".game";
private static final String PROP_PlayerCount = "players";
private static final String PROP_Difficulty = "difficulty";
private static final String PROP_StartPlayerIndex = "startPlayerIndex";
public static GameState loadGameStateFromFile(final File gameFile) {
final Properties prop = FileIO.toProp(gameFile);
final GameState gameState = new GameState();
//
gameState.setDifficulty(Integer.parseInt(prop.getProperty(PROP_Difficulty)));
gameState.setStartPlayerIndex(Integer.parseInt(prop.getProperty(PROP_StartPlayerIndex)));
//
final int players = Integer.parseInt(prop.getProperty(PROP_PlayerCount));
for (int i = 0; i < players; i++) {
final GamePlayerState playerState = gameState.getPlayer(i);
setPlayerState(prop, gameState, i);
setCardsZoneState(prop, "hand", playerState.getHand(), i);
setCardsZoneState(prop, "permanent", playerState.getPermanents(), i);
setCardsZoneState(prop, "library", playerState.getLibrary(), i);
setCardsZoneState(prop, "graveyard", playerState.getGraveyard(), i);
setCardsZoneState(prop, "exiled", playerState.getExiled(), i);
}
return gameState;
}
private static void setPlayerState(final Properties prop, final GameState scenario, final int playerIndex) {
final GamePlayerState player = scenario.getPlayer(playerIndex);
final String keyPrefix = "p" + playerIndex;
player.setName(prop.getProperty(keyPrefix + ".name"));
player.setFace(Integer.parseInt(prop.getProperty(keyPrefix + ".face")));
player.setLife(Integer.parseInt(prop.getProperty(keyPrefix + ".life")));
player.setAiType(prop.getProperty(keyPrefix + ".ai"));
player.setDeckProfileColors(prop.getProperty(keyPrefix + ".deck.color"));
}
private static void setCardsZoneState(final Properties prop, final String zoneName, final List<GameCardState> cards, final int playerIndex) {
final List<String> usedKeys = new ArrayList<>();
for (int i = 0; i < prop.size(); i++) {
// card name
String cardName = "";
final String cardKey = "p" + playerIndex + "." + zoneName + i + ".card";
if (prop.containsKey(cardKey)) {
cardName = prop.getProperty(cardKey);
usedKeys.add(cardKey);
}
// card quantity
int cardQuantity = 1;
final String quantityKey = "p" + playerIndex + "." + zoneName + i + ".quantity";
if (prop.containsKey(quantityKey)) {
cardQuantity = Integer.parseInt(prop.getProperty(quantityKey));
usedKeys.add(quantityKey);
}
// card tapped state
boolean isCardTapped = false;
final String tappedKey = "p" + playerIndex + "." + zoneName + i + ".tapped";
if (prop.containsKey(tappedKey)) {
isCardTapped = Boolean.parseBoolean(prop.getProperty(tappedKey));
usedKeys.add(tappedKey);
}
if (!cardName.isEmpty()) {
cards.add(new GameCardState(cardName, cardQuantity, isCardTapped));
}
}
for (String usedKey : usedKeys) {
prop.remove(usedKey);
}
}
}