89 lines
2.6 KiB
C#

/*
* @Author: 白哉
* @Description: 游戏的成就系统数据
* @Date: 2025年05月14日 星期三 19:05:32
* @Modify:
*/
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Logic.Achievement
{
public class AchievementAsset : ScriptableObject
{
public AchievementData Data;
public AchievementAsset()
{
Data = new AchievementData();
}
}
[Serializable]
public class AchievementData
{
public List<AchievementItem> AchievementList;
private Dictionary<uint, AchievementItem> _achievementItems;
public AchievementData()
{
AchievementList = new List<AchievementItem>();
}
public void AddNewAchievementItem(uint big, uint small)
{
RefreshAchievementDict();
var item = new AchievementItem();
item.BigID = big;
item.SmallID = small;
for (int i = 1; i < 20; i++)
{
if (_achievementItems.ContainsKey((uint)(big * 10000 + small * 100 + i))) continue;
item.InternalID = (uint)i;
break;
}
AchievementList.Add(item);
AchievementList.Sort((a, b) => a.ID.CompareTo(b.ID));
}
public List<AchievementItem> GetAchievementItemList(uint big, uint small, uint internalId)
{
RefreshAchievementDict();
var result = new List<AchievementItem>();
foreach (var achievement in AchievementList)
{
if (big != 0 && achievement.BigID != big) continue;
if (small != 0 && achievement.SmallID != small) continue;
if (internalId != 0 && achievement.InternalID != internalId) continue;
result.Add(achievement);
}
return result;
}
public AchievementItem GetAchievementItem(uint big, uint small, uint internalId)
{
RefreshAchievementDict();
var id = big * 10000 + small * 100 + internalId;
return _achievementItems.GetValueOrDefault(id);
}
public void RefreshAchievementDict()
{
_achievementItems ??= new Dictionary<uint, AchievementItem>();
if (_achievementItems.Count == AchievementList.Count) return;
_achievementItems.Clear();
foreach (var item in AchievementList) _achievementItems[item.ID] = item;
}
public void ClearAchievementFinishedInfo()
{
foreach (var item in AchievementList) item.IsFinished = false;
}
}
}