134 lines
4.1 KiB
C#
134 lines
4.1 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, MapData mapData, uint originId = 0)
|
||
{
|
||
RefreshSkillDict();
|
||
if (_skillDict.ContainsKey(skillType)) return;
|
||
var skill = SkillFactory.GetSkillBySkillType(skillType);
|
||
if (skill != null)
|
||
{
|
||
Skills.Add(skill);
|
||
_skillDict[skillType] = skill;
|
||
skill.OnSkillAdd(mapData, originId);
|
||
}
|
||
}
|
||
|
||
public virtual void AddSkill(SkillType skillType, uint turnLimit, MapData mapData, uint originId = 0)
|
||
{
|
||
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);
|
||
_skillDict[skillType] = skill;
|
||
skill.SetTurnsLimit(turnLimit);
|
||
skill.OnSkillAdd(mapData, originId);
|
||
}
|
||
}
|
||
}
|
||
|
||
public void RemoveSkill(SkillType skillType, MapData map)
|
||
{
|
||
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;
|
||
}
|
||
|
||
protected void OnSkillsTurnStart(MapData map)
|
||
{
|
||
var copy = new List<SkillBase>(Skills);
|
||
foreach (var skill in copy)
|
||
{
|
||
skill.BeforeTurnStart();
|
||
if (skill.IsFinished())
|
||
{
|
||
skill.OnFinished(this, map);
|
||
Skills.Remove(skill);
|
||
continue;
|
||
}
|
||
skill.OnTurnStart(this, map);
|
||
}
|
||
}
|
||
|
||
protected void OnSkillsTurnEnd(MapData map)
|
||
{
|
||
var copy = new List<SkillBase>(Skills);
|
||
foreach (var skill in copy) skill.OnTurnEnd(this, map);
|
||
}
|
||
}
|
||
} |