using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using UnityEngine; namespace PrizeSystem { public static class PrizeSerializer { const string CHARACTERS_PRIZES = "CharPrizes.prizRR"; static string FILE_PATH => Path.Combine(Application.persistentDataPath, CHARACTERS_PRIZES); static int CharactersAmount => GameManager.instance.botsAmount; public static List LoadPrizes() { if (!File.Exists(FILE_PATH)) { Debug.Log("Не записаны призы беру дефолт"); return GetDefaultPrizes(); } string fileString = File.ReadAllText(FILE_PATH); return DeserializePrizes(fileString); } /// /// Сериализует и записывает в файл /// /// public static void SavePrizes(List prizes) { string serialized = SerializePrizes(prizes); Debug.Log($"serialized: {serialized}"); File.WriteAllText(FILE_PATH, serialized); } public static string SerializePrizes(List prizes) { StringBuilder sb = new(); for (int i = 0; i < CharactersAmount; i++) { sb.Append(prizes[i].Body); string endOfLine = i < CharactersAmount - 1 ? "\n" : ""; sb.Append(endOfLine); } string result = sb.ToString(); return result; } /// /// Преобразовать сериализованную строку в список призов /// public static List DeserializePrizes(string serialized) { List prizes = new(); string[] lines = serialized.Split('\n'); if (lines.Length != CharactersAmount) { return GetDefaultPrizes(); } foreach (string line in lines) { if (line == "None") { prizes.Add(PrizeUtils.CreatePrize()); } else if (line.StartsWith("VitrinaBox:")) { string stripped = line.Substring("VitrinaBox:".Length); int[] boxes = stripped.Split(",").Select(int.Parse).ToArray(); prizes.Add(PrizeUtils.CreatePrize(boxes)); } else if (line.StartsWith("Qr:")) { string stripped = line.Substring("Qr:".Length); string[] entries = stripped.Split(','); int rank = int.Parse(entries[0]); string text = entries[1]; prizes.Add(PrizeUtils.CreatePrize(rank,text)); } else {//считаемый приз string[] entries = line.Split(":"); CountablePrizeType Type = (CountablePrizeType)Enum.Parse(typeof(CountablePrizeType), entries[0]); int amount = int.Parse(entries[1]); prizes.Add(PrizeUtils.CreatePrize(Type, amount)); } } return prizes; } //делает список пустых призов, последний индекс - приз с хоппера public static List GetDefaultPrizes() { List prizes = new(); for (int i = 0; i < CharactersAmount - 1; i++) { prizes.Add(PrizeUtils.CreatePrize()); } prizes.Add(PrizeUtils.CreatePrize(3, "5000 руб.")); SerializePrizes(prizes); return prizes; } } }