TH1/Unity/Assets/Scripts/TH1_Logic/Achievement/AchievementDataManager.cs
2025-09-01 17:46:41 +08:00

134 lines
4.2 KiB
C#

/*
* @Author: 白哉
* @Description: 成就数据管理
* @Date: 2025年05月14日 星期三 21:05:54
* @Modify:
*/
using System.Collections.Generic;
using System.IO;
using Logic.Achievement;
using Logic.CrashSight;
using UnityEngine;
namespace RuntimeData
{
public class AchievementDataManager
{
public static AchievementDataManager Instance = new AchievementDataManager();
public AchievementData Achievement;
public List<uint> FinishedCache;
public void Init()
{
string path = Application.persistentDataPath + "/achievement.json";
if (File.Exists(path))
{
string json = File.ReadAllText(path);
Achievement = JsonUtility.FromJson<AchievementData>(json);
}
if (Achievement == null)
{
var asset = Resources.Load<AchievementAsset>("Export/Achievement");
Achievement = asset.Data;
Achievement.ClearAchievementFinishedInfo();
}
FinishedCache ??= new List<uint>();
FinishedCache.Clear();
}
public void BindMapData(MapData mapData)
{
foreach (var item in Achievement.AchievementList)item.BindMapData(mapData);
}
public void ReCheckAchievementDataNotComplete()
{
foreach (var item in Achievement.AchievementList)
item.ReCheckConditionsNotComplete();
}
public void OnTurnStart(MapData map, PlayerData player)
{
foreach (var item in Achievement.AchievementList)
item.OnTurnStart(map, player);
SaveAchievementData();
}
public void OnTrainUnit(MapData map, PlayerData player, CityData city, UnitData newUnit)
{
foreach (var item in Achievement.AchievementList)
item.OnTrainUnit(map, player, city, newUnit);
SaveAchievementData();
}
public void OnBuildWonder(MapData map, PlayerData player, CityData city, GridData grid)
{
foreach (var item in Achievement.AchievementList)
item.OnBuildWonder(map, player, city, grid);
SaveAchievementData();
}
public void OnKillUnit(MapData map, UnitData origin, UnitData target)
{
foreach (var item in Achievement.AchievementList)
item.OnKillUnit(map, origin, target);
SaveAchievementData();
}
public void OnUnitMove(MapData map, UnitData unit, GridData gridData)
{
foreach (var item in Achievement.AchievementList)
item.OnUnitMove(map, unit, gridData);
SaveAchievementData();
}
public bool IsFinished(uint bigId, uint smallId, uint internalID)
{
var item = Achievement.GetAchievementItem(bigId, smallId, internalID);
if (item == null) return false;
return item.IsFinished;
}
public string GetNoFinishDescription(uint bigId, uint smallId, uint internalID)
{
var item = Achievement.GetAchievementItem(bigId, smallId, internalID);
if (item == null) return "";
if (item.IsFinished) return "";
return item.GetConditionDescription();
}
public void SaveAchievementData()
{
if (Achievement == null) return;
string json = JsonUtility.ToJson(Achievement);
string path = Application.persistentDataPath + "/achievement.json";
int retryCount = 3;
while (retryCount > 0)
{
try
{
using (StreamWriter writer = new StreamWriter(path, false))
{
writer.Write(json);
writer.Close();
}
return;
}
catch (IOException ex)
{
retryCount--;
if (retryCount <= 0)
{
LogSystem.LogError($"保存成就数据失败: {ex.Message}");
}
}
}
}
}
}