2026-06-05 21:01:46 +08:00

96 lines
3.0 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年10月12日 星期六 10:10:12
* @Modify:
*/
using RuntimeData;
namespace Logic.Skill
{
public partial class FlandreBuffSkill : SkillBase
{
public FlandreBuffSkill()
{
IsLevelSkill = true;
IsPermanent = false;
TurnsLimit = 0;
Score = 2;
_levelLimit = 4;
}
public override void OnTurnEnd(IdentifierBase identifier, MapData mapData)
{
var self = identifier as UnitData;
if (self == null) return;
SyncFlandreBuffLevel(mapData, 0);
}
public override SkillType GetSkillType()
{
return SkillType.FLANDREBUFF;
}
public override void AddLevel(MapData map, UnitData origin, UnitData self, int add)
{
var nextLevel = GetSharedFlandreBuffLevel(map) + add;
if (nextLevel > _levelLimit) nextLevel = _levelLimit;
SyncFlandreBuffLevel(map, nextLevel);
if (!map.GetPlayerDataByUnitId(origin.Id, out _)) return;
origin.HeroTask(map)?.OnAddSkillLevels(map, GetSkillType(), (uint)add);
}
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return 0.5f * Level;
}
public override bool ReservedOnTransform(UnitData self, UnitFullType fullType)
{
return true;
}
public override void OnAnyUnitCreate(MapData map, IdentifierBase identifier, UnitData newUnit)
{
if (newUnit?.UnitFullType.GiantType != GiantType.EgyptianFlandre) return;
var sharedLevel = GetSharedFlandreBuffLevel(map);
if (sharedLevel <= 0) return;
EnsureFlandreBuff(map, newUnit).SetLevel(sharedLevel);
}
private int GetSharedFlandreBuffLevel(MapData map)
{
var level = 0;
foreach (var unit in map.UnitMap.UnitList)
{
if (unit.UnitFullType.GiantType != GiantType.EgyptianFlandre) continue;
if (unit.GetSkill(SkillType.FLANDREBUFF, out var skill))
level = System.Math.Max(level, skill.Level);
}
return level;
}
private void SyncFlandreBuffLevel(MapData map, int level)
{
foreach (var unit in map.UnitMap.UnitList)
{
if (unit.UnitFullType.GiantType != GiantType.EgyptianFlandre) continue;
EnsureFlandreBuff(map, unit).SetLevel(level);
}
}
private SkillBase EnsureFlandreBuff(MapData map, UnitData unit)
{
if (unit.GetSkill(SkillType.FLANDREBUFF, out var skill)) return skill;
unit.AddSkill_Legacy(SkillType.FLANDREBUFF, map, false, 0, true, 0, false,
SpecialAddSkillType.Normal, 0);
unit.GetSkill(SkillType.FLANDREBUFF, out skill);
return skill;
}
}
}