public void StartUpSequence() { StartCoroutine(LoadMainMenu()); string oldPath = Path.Combine(Application.persistentDataPath, "SaveFiles"); oldPath = Path.Combine(oldPath, "SaveData.sav"); //Check if old format exists if (File.Exists(oldPath) && !File.Exists(dataPath)) { LoadingText("Old Save Format Detected"); //Load Old format SaveData oldSave; BinaryFormatter binaryFormatter = new BinaryFormatter(); using (FileStream fileStream = File.Open(oldPath, FileMode.Open)) { oldSave = (SaveData)binaryFormatter.Deserialize(fileStream); } LoadingText("Converting Old Save"); //Save into new format JSONSaveData.currentSave = JSONSaveData.ConvertToNew(oldSave); SaveGame(); loadComplete = true; //Done } else { LoadGame(); } }
public static JSONSaveData ConvertToNew(SaveData file) { JSONSaveData newSave = new JSONSaveData(); newSave.BGMVol = file.BGMVol; newSave.SFXVol = file.SFXVol; newSave.displayType = file.displayType; newSave.tutorialCompleted = file.tutorialCompleted; newSave.tutorialBadgeShown = file.tutorialBadgeShown; newSave.displayType = file.displayType; for (int i = 0; i < file.defeated.Length; i++) { newSave.defeated[i] = file.defeated[i]; } for (int i = 0; i < file.marbleUnlocked.Length - 1; i++) { newSave.marbleUnlocked[i] = file.marbleUnlocked[i]; } newSave.marbleUnlocked[(int)MarbleDesign.Golden] = file.marbleUnlocked[file.marbleUnlocked.Length - 1]; newSave.selectedDesign = file.selectedDesign; return(newSave); }
} // ToJSONSaveData // Genera un código hash SHA-1 a partir de los datos de la partida public static string GenerateHashCode(JSONSaveData data) { // Generar string a partir de los datos de pistas y progreso en niveles string input = ""; if (data == null || data.levelGroups == null) { return(input); } input += data.hints.ToString(); // Nº de pistas foreach (JSONLevelGroup group in data.levelGroups) { for (int i = 0; i < group.levelStates.Count; i++) { input += group.levelStates[i].ToString(); // Progreso de los niveles } } // Generar el código hash usando el algoritmo SHA-1 using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input)); var sb = new StringBuilder(hash.Length * 2); foreach (byte b in hash) { sb.Append(b.ToString("x2")); // Escribe en sb el byte b en formato hexadecimal } return(sb.ToString()); } }
// -------------------- // Métodos // -------------------- // Serializa el progreso del jugador y lo almacena en PlayerPrefs public static void SaveGameData(GameData data) { JSONSaveData jsonData = ToJSONSaveData(data); // Crea un JSONSaveData con los datos de la partida string hashCode = GenerateHashCode(jsonData); // Genera un hash a partir de jsonData jsonData.saveId = hashCode; // Añade el hash a jsonData string json = JsonUtility.ToJson(jsonData); PlayerPrefs.SetString("progress", json); }
private void LoadCompletedCallback(SavedGameRequestStatus status, byte[] savedData) { //if reading of the data was successful if (status == SavedGameRequestStatus.Success) { //if we've never played the game before, savedData will have length of 0 if (savedData.Length == 0) { LoadingText("No save in cloud"); JSONSaveData.currentSave = LoadGameLocal(false); return; } else { //Compare cloud and local JSONSaveData jsonCloud = JsonUtility.FromJson <JSONSaveData>(Encoding.ASCII.GetString(savedData)); JSONSaveData jsonLocal = LoadGameLocal(); LoadingText("Comparing files"); if (jsonCloud.playTime >= jsonLocal.playTime) { LoadingText("Loading from cloud"); loadComplete = true; JSONSaveData.currentSave = jsonCloud; } else { LoadingText("Loading from local"); loadComplete = true; JSONSaveData.currentSave = jsonLocal; } } } else { JSONSaveData.currentSave = LoadGameLocal(); } }
} // LoadGameData // Devuelve un JSONSaveData con los datos actuales del progreso y el nº de pistas del jugador static JSONSaveData ToJSONSaveData(GameData data) { JSONSaveData jsonData = new JSONSaveData(); // nº de pistas desbloqueadas jsonData.hints = data.numOfHints; // progreso en los niveles List <JSONLevelGroup> groups = new List <JSONLevelGroup>(); for (int g = 0; g < data.levelProgress.Count; g++) { List <int> states = new List <int>(); // Lista con el estado de cada nivel int levelsLength = data.levelProgress[g].Length; int level = 0; bool locked = false; // Guarda el estado de los niveles hasta encontrar el primero bloqueado (a partir de él, todos están bloqueados y no se guardan) while (level < levelsLength && !locked) { LevelState state = data.levelProgress[g][level]; if (state != LevelState.LOCKED) // Solo guardamos los niveles desbloqueados o completados { states.Add((int)state); } else { locked = true; } level++; } JSONLevelGroup levels = new JSONLevelGroup(); levels.levelStates = states; groups.Add(levels); // Añade el grupo a la lista de grupos } jsonData.levelGroups = groups; // Establece la lista de grupos return(jsonData); } // ToJSONSaveData
// Carga el progreso del jugador, si no hay progreso guardado guarda el estado inicial del juego public static void LoadGameData(ref GameData data) { string json = PlayerPrefs.GetString("progress"); if (json == "") // No hay progreso guardado { SaveGameData(data); // Guarda el estado inicial por defecto return; } JSONSaveData jsonData = JsonUtility.FromJson <JSONSaveData>(json); // Comprobación del código hash de la partida string saveDataHash = jsonData.saveId; string testHash = GenerateHashCode(jsonData); // Genera un hash de comprobación if (saveDataHash != testHash) // Si los hash no coinciden => Sobreescribir la partida guardada { SaveGameData(data); // Guarda el estado inicial por defecto return; } // Carga el número de pistas data.numOfHints = jsonData.hints; // Carga del progreso de los niveles List <JSONLevelGroup> jsonGroups = jsonData.levelGroups; for (int i = 0; i < data.levelProgress.Count; i++) { JSONLevelGroup group = jsonGroups[i]; for (int j = 0; j < group.levelStates.Count; j++) { data.levelProgress[i][j] = (LevelState)group.levelStates[j]; } } } // LoadGameData