140 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 => 5;
public static List<Prize> LoadPrizes()
{
if (PrizeSystemManager.cachedPrizes != null)
return PrizeSystemManager.cachedPrizes;
List<Prize> prizes;
try
{
if (File.Exists(FILE_PATH))
{
string fileString = File.ReadAllText(FILE_PATH);
prizes = DeserializePrizes(fileString);
}
else
{
Debug.Log($"Файл {FILE_PATH} не найден, создаю с призами по умолчанию");
prizes = GetDefaultPrizes();
SavePrizes(prizes);
}
}
catch (Exception e)
{
Debug.LogError($"Ошибка загрузки призов: {e.Message}");
prizes = GetDefaultPrizes();
}
PrizeSystemManager.SetPrizesCache(prizes);
return prizes;
}
/// <summary>
/// Сериализует и записывает в файл
/// </summary>
/// <param name="prizes"></param>
public static void SavePrizes(List<Prize> prizes)
{
string serialized = SerializePrizes(prizes);
Debug.Log($"serialized: {serialized}");
File.WriteAllText(FILE_PATH, serialized);
PrizeSystemManager.SetPrizesCache(prizes);
}
public static string SerializePrizes(List<Prize> 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;
}
/// <summary>
/// Преобразовать сериализованную строку в список призов
/// </summary>
public static List<Prize> DeserializePrizes(string serialized)
{
List<Prize> 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<Prize> GetDefaultPrizes()
{
List<Prize> prizes = new();
for (int i = 0; i < CharactersAmount - 1; i++)
{
prizes.Add(PrizeUtils.CreatePrize());
}
prizes.Add(PrizeUtils.CreatePrize(3, "5000 руб."));
SerializePrizes(prizes);
return prizes;
}
}
}