TH1/Unity/Assets/Scripts/TH1_Data/RuntimeData.cs

122 lines
3.6 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.

/*
* @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 virtual void AddSkill(SkillType skillType)
{
RefreshSkillDict();
if (_skillDict.ContainsKey(skillType)) return;
var skill = SkillFactory.GetSkillBySkillType(skillType);
if (skill != null)
{
Skills.Add(skill);
skill.OnGet();
_skillDict[skillType] = skill;
}
}
public virtual void AddSkill(SkillType skillType,uint TurnLimit)
{
RefreshSkillDict();
//如果已经有这个技能了
if (_skillDict.ContainsKey(skillType))
{
var skill = _skillDict[skillType];
//如果对方本来就是永久直接return
if(!skill.HasTimeLimit) return;
//否则让对方的limit增加
skill.AddTurnLimit(TurnLimit);
}
//如果还没有这个技能
else{
var skill = SkillFactory.GetSkillBySkillType(skillType);
if (skill != null)
{
Skills.Add(skill);
skill.OnGet();
_skillDict[skillType] = skill;
skill.SetTurnsLimit(TurnLimit);
}
}
}
public void RemoveSkill(SkillType skillType)
{
RefreshSkillDict();
if (!_skillDict.TryGetValue(skillType, out var value)) return;
value.OnLose();
Skills.Remove(value);
_skillDict.Remove(skillType);
}
public void RemoveInActiveSkill()
{
for (int i = Skills.Count - 1; i >= 0; i--)
{
if (Skills[i].IsActive()) continue;
Skills[i].OnLose();
Skills.RemoveAt(i);
}
}
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;
}
}
}