122 lines
3.6 KiB
C#
122 lines
3.6 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 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;
|
||
}
|
||
}
|
||
} |