TH1/Unity/Assets/Scripts/TH1_Data/RuntimeData.cs
2025-09-03 20:57:12 +08:00

86 lines
2.4 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年04月03日 星期四 11:04:31
* @Modify:
*/
using System.Collections.Generic;
using Logic.Skill;
using MemoryPack;
namespace RuntimeData
{
[MemoryPackable]
[MemoryPackUnion(1, typeof(PlayerData))]
[MemoryPackUnion(2, typeof(UnitData))]
[MemoryPackUnion(3, typeof(CityData))]
[MemoryPackUnion(4, typeof(GridData))]
public abstract partial class IdentifierBase
{
// 唯一 ID
public uint Id;
// 技能信息
public List<SkillBase> Skills = new List<SkillBase>();
private Dictionary<SkillType, SkillBase> _skillDict;
// Mark 信息
[MemoryPackInclude]
protected bool _renderMark;
public bool RenderMark
{
get => _renderMark;
set => _renderMark = value;
}
public bool GetSkill(SkillType skillType, out SkillBase skill)
{
RefreshSkillDict();
return _skillDict.TryGetValue(skillType, out skill);
}
public void AddSkill(SkillType skillType)
{
RefreshSkillDict();
if (_skillDict.ContainsKey(skillType)) return;
var skill = SkillFactory.GetSkillBySkillType(skillType);
if (skill != null)
{
Skills.Add(skill);
_skillDict[skillType] = skill;
}
}
public void RemoveSkill(SkillType skillType)
{
RefreshSkillDict();
if (!_skillDict.TryGetValue(skillType, out var value)) return;
Skills.Remove(value);
_skillDict.Remove(skillType);
}
private void RefreshSkillDict()
{
if (_skillDict == null) _skillDict = new Dictionary<SkillType, SkillBase>();
if (_skillDict.Count != Skills.Count)
{
_skillDict.Clear();
foreach (var skill in Skills) _skillDict[skill.GetSkillType()] = skill;
}
}
// MemoryPack 反序列化之后的后处理
[MemoryPackOnDeserialized]
public void OnAfterMemoryPackDeserialize()
{
_skillDict ??= new Dictionary<SkillType, SkillBase>();
_skillDict.Clear();
foreach (var skill in Skills) _skillDict[skill.GetSkillType()] = skill;
}
}
}