diff --git a/Assets/Scripts/Save/SaveAndLoad.cs b/Assets/Scripts/Save/SaveAndLoad.cs new file mode 100644 index 0000000000000000000000000000000000000000..45fed20c3ecd3a8de7e28f898ae7de738b3aa69e --- /dev/null +++ b/Assets/Scripts/Save/SaveAndLoad.cs @@ -0,0 +1,192 @@ +using UnityEngine; +using UnityEngine.SceneManagement; +using System.Security.Cryptography; +using System.IO; +using System; + +public class SaveAndLoad +{ + private SaveSlot saveSlot; + private string savePath = Application.dataPath+"/customsave.cssav"; + private static byte[] saveKey = System.Text.Encoding.ASCII.GetBytes("Extended+Survival+Shooter+Secret"); + + public SaveSlot LoadState(){ + try + { + using (AesManaged aes = new AesManaged()) + { + byte[] iv; + byte[] data; + int filesize = (int)(new FileInfo(savePath).Length); + using (var stream = File.OpenRead(savePath)) + { + using(var reader = new BinaryReader(stream, System.Text.Encoding.UTF8, false)) + { + iv = reader.ReadBytes(16); + data = reader.ReadBytes(filesize-16); + } + } + + string decrypted = Decrypt(data, saveKey, iv); + saveSlot = JsonUtility.FromJson<SaveSlot>(decrypted); + Debug.Log(decrypted); + } + } + catch (System.Exception) + { + return saveSlot = new SaveSlot(); + } + + return saveSlot; + } + + public SaveInstance LoadSaveSlot(int index) + { + + SaveInstance selectedSave; + + switch (index) + { + case 1: + selectedSave = saveSlot.slot1; + break; + case 2: + selectedSave = saveSlot.slot2; + break; + default: + selectedSave = saveSlot.slot3; + break; + } + + return selectedSave; + } + + public void SaveState(int index, + int playerHP, + string current_level, + string completedQuest, + string saveTitle){ + string encrSave; + SaveInstance currentState = new SaveInstance( + saveTitle, playerHP, current_level, DateTime.Now, completedQuest + ); + + // Pick the Save Slot + switch (index) + { + case 1: + saveSlot.slot1 = currentState; + break; + case 2: + saveSlot.slot2 = currentState; + break; + default: + saveSlot.slot3 = currentState; + break; + } + + // Create JSON object + encrSave = JsonUtility.ToJson(saveSlot); + Debug.Log(encrSave); + + // Encrypt + try + { + using(AesManaged aes = new AesManaged()) { + byte[] encrypted = Encrypt(encrSave, saveKey, aes.IV); + using (var stream = File.OpenWrite(savePath)) + { + using(BinaryWriter writer = new BinaryWriter(stream, System.Text.Encoding.UTF8, false)) + { + writer.Write(aes.IV); + writer.Write(encrypted); + } + } + } + } + catch (System.Exception) + { + throw; + } + } + + static byte[] Encrypt(string plaintext, byte[] Key, byte[] IV) { + byte[] encrypted; + + using(AesManaged aes = new AesManaged()) { + ICryptoTransform encryptor = aes.CreateEncryptor(Key,IV); + using(MemoryStream ms = new MemoryStream()) { + using(CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { + using(StreamWriter sw = new StreamWriter(cs)) + sw.Write(plaintext); + encrypted = ms.ToArray(); + } + } + } + + return encrypted; + } + + static string Decrypt(byte[] cipherteks, byte[] Key, byte[] IV) { + string plainteks = null; + + using(AesManaged aes = new AesManaged()) { + ICryptoTransform decryptor = aes.CreateDecryptor(Key, IV); + using(MemoryStream ms = new MemoryStream(cipherteks)) { + using(CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { + using(StreamReader reader = new StreamReader(cs)) + plainteks = reader.ReadToEnd(); + } + } + } + + return plainteks; + } + + [Serializable] + public class SaveInstance { + public bool isEmpty; + public string saveTitle; + public int playerHealth; + public string currentLevel; + public string dateTime; + public string completedQuest; + + public SaveInstance( + string saveTitle, + int playerHealth, + string currentLevel, + DateTime dateTime, + string completedQuest + ){ + this.saveTitle = saveTitle; + this.playerHealth = playerHealth; + this.currentLevel = currentLevel; + this.dateTime = dateTime.ToString(); + this.completedQuest = completedQuest; + this.isEmpty = false; + } + + public SaveInstance() { + this.saveTitle = ""; + this.playerHealth = -1; + this.currentLevel = ""; + this.dateTime = ""; + this.completedQuest = ""; + this.isEmpty = true; + } + } + + [Serializable] + public class SaveSlot { + public SaveInstance slot1; + public SaveInstance slot2; + public SaveInstance slot3; + + public SaveSlot() { + this.slot1 = new SaveInstance(); + this.slot2 = new SaveInstance(); + this.slot3 = new SaveInstance(); + } + } +} \ No newline at end of file