/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.gamestate;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.happydroids.droidtowers.TowerConsts;
import com.happydroids.droidtowers.gamestate.migrations.Migration_GameSave_MoveMetadata;
import com.happydroids.droidtowers.gamestate.migrations.Migration_GameSave_RemoveObjectCounts;
import com.happydroids.droidtowers.gamestate.migrations.Migration_GameSave_UnhappyrobotToDroidTowers;
import com.happydroids.droidtowers.gamestate.server.TowerGameService;
import com.happydroids.jackson.HappyDroidObjectMapper;
import sk.seges.acris.json.server.migrate.JacksonTransformer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.UUID;
public class GameSaveFactory {
public static String generateFilename() {
return UUID.randomUUID().toString().replaceAll("-", "") + ".json";
}
public static GameSave readFile(FileHandle fileHandle) throws Exception {
return readFile(fileHandle.read(), fileHandle.name());
}
public static GameSave readFile(InputStream inputStream, String fileName) {
try {
return TowerGameService.instance().getObjectMapper().readValue(inputStream, GameSave.class);
} catch (Exception e) {
throw new RuntimeException("There was a problem parsing: " + fileName, e);
}
}
@SuppressWarnings("PointlessBooleanExpression")
public static void save(GameSave gameSave, FileHandle gameFile) throws IOException {
if (TowerConsts.DEBUG && gameSave.isSaveToDiskDisabled()) {
return;
}
gameSave.getMetadata().lastPlayed = new Date();
OutputStream stream = gameFile.write(false);
TowerGameService.instance().getObjectMapper().writeValue(stream, gameSave);
stream.flush();
stream.close();
}
public static GameSave readMetadata(InputStream inputStream) {
try {
HappyDroidObjectMapper objectMapper = TowerGameService.instance().getObjectMapper();
return objectMapper.reader(GameSave.class).withView(GameSave.Views.Metadata.class).readValue(inputStream);
} catch (Exception e) {
throw new RuntimeException("There was a problem parsing gamesave metadata.", e);
}
}
public static FileHandle getStorageRoot() {
if (Gdx.files.isExternalStorageAvailable()) {
return Gdx.files.external(TowerConsts.GAME_SAVE_DIRECTORY);
} else if (Gdx.files.isLocalStorageAvailable()) {
return Gdx.files.local(TowerConsts.GAME_SAVE_DIRECTORY);
}
throw new RuntimeException("No storage device available.");
}
public static GameSave upgradeGameSave(InputStream inputStream, String fileName) {
try {
JacksonTransformer transformer = new JacksonTransformer(inputStream, fileName);
transformer.addTransform(Migration_GameSave_UnhappyrobotToDroidTowers.class);
transformer.addTransform(Migration_GameSave_RemoveObjectCounts.class);
transformer.addTransform(Migration_GameSave_MoveMetadata.class);
return TowerGameService.instance().getObjectMapper().readValue(transformer.process(), GameSave.class);
} catch (Exception e) {
throw new RuntimeException("There was a problem parsing: " + fileName, e);
}
}
}