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

82 lines
3.9 KiB
Java

package magic.game.state;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import magic.utility.MagicFileSystem;
import magic.utility.MagicSystem;
import magic.utility.SortedProperties;
public final class GameStateFileWriter {
private GameStateFileWriter() {}
private static final String PROP_Version = "magarenaVersion";
private static final String PROP_PlayerCount = "players";
private static final String PROP_Difficulty = "difficulty";
private static final String PROP_StartPlayerIndex = "startPlayerIndex";
public static void createSaveGameFile(final GameState gameState, final File aFile) {
final Properties properties = new SortedProperties();
setGameProperties(properties, gameState);
setAllPlayerProperties(properties, gameState);
savePropertyFile(properties, aFile);
}
public static void createSaveGameFile(final GameState gameState, final String filename) {
final File propertyFile = MagicFileSystem.getDataPath(MagicFileSystem.DataPath.SAVED_GAMES).resolve(filename).toFile();
createSaveGameFile(gameState, propertyFile);
}
private static void savePropertyFile(final Properties properties, final File aFile) {
try (final FileOutputStream fos = new FileOutputStream(aFile)) {
properties.store(fos, "Magarena Saved Game");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
private static void setGameProperties(final Properties properties, final GameState gameState) {
properties.setProperty(PROP_Version, MagicSystem.VERSION);
properties.setProperty(PROP_PlayerCount, Integer.toString(gameState.getPlayers().size()));
properties.setProperty(PROP_Difficulty, Integer.toString(gameState.getDifficulty()));
properties.setProperty(PROP_StartPlayerIndex, Integer.toString(gameState.getStartPlayerIndex()));
}
private static void setAllPlayerProperties(final Properties properties, final GameState gameState) {
for (int i = 0; i < gameState.getPlayers().size(); i++) {
final GamePlayerState player = gameState.getPlayers().get(i);
final String playerKeyPrefix = "p" + i;
setPlayerProperties(properties, player, playerKeyPrefix);
setCardZoneProperties(player.getLibrary(), playerKeyPrefix + ".library", properties);
setCardZoneProperties(player.getPermanents(), playerKeyPrefix + ".permanent", properties);
setCardZoneProperties(player.getHand(), playerKeyPrefix + ".hand", properties);
setCardZoneProperties(player.getGraveyard(), playerKeyPrefix + ".graveyard", properties);
setCardZoneProperties(player.getExiled(), playerKeyPrefix + ".exiled", properties);
}
}
private static void setPlayerProperties(final Properties properties, final GamePlayerState player, final String keyPrefix) {
properties.setProperty(keyPrefix + ".name", player.getName());
properties.setProperty(keyPrefix + ".face", Integer.toString(player.getFace()));
properties.setProperty(keyPrefix + ".life", Integer.toString(player.getLife()));
properties.setProperty(keyPrefix + ".ai", player.getAiType());
properties.setProperty(keyPrefix + ".deck.color", player.getDeckProfileColors());
}
private static void setCardZoneProperties(final List<GameCardState> cards, final String keyPrefix, final Properties properties) {
for (int j = 0; j < cards.size(); j++) {
final GameCardState card = cards.get(j);
final String key = keyPrefix + j;
properties.setProperty(key + ".card", card.getCardName());
properties.setProperty(key + ".quantity", Integer.toString(card.getQuantity()));
if (card.isTapped()) {
properties.setProperty(key + ".tapped", Boolean.toString(card.isTapped()));
}
}
}
}