80 lines
3.0 KiB
C#
80 lines
3.0 KiB
C#
using System.Collections.Generic;
|
||
using Logic.Pool;
|
||
using RuntimeData;
|
||
using MemoryPack;
|
||
using TH1_Anim.Fragments;
|
||
using TH1_Core.Managers;
|
||
using TH1_Logic.Core;
|
||
using TH1Renderer;
|
||
|
||
namespace Logic.Skill
|
||
{
|
||
public partial class KomeijiFearSplashSkill : SkillBase
|
||
{
|
||
public KomeijiFearSplashSkill()
|
||
{
|
||
IsPermanent = true;
|
||
TurnsLimit = 0;
|
||
Score = 4;
|
||
}
|
||
|
||
public override SkillType GetSkillType()
|
||
{
|
||
return SkillType.KomeijiFearSplash;
|
||
}
|
||
|
||
public override void AfterActiveAttackOther(MapData mapData, AttackInfo attackInfo)
|
||
{
|
||
if (attackInfo == null) return;
|
||
if (attackInfo.DamageOrigin == null || attackInfo.DamageTargetGrid == null) return;
|
||
|
||
if (!mapData.GetPlayerDataByUnitId(attackInfo.DamageOrigin.Id, out var selfPlayer)) return;
|
||
using var pooledSelfUnitList = THCollectionPool.GetHashSetHandle<UnitData>(out var selfUnitList);
|
||
mapData.GetUnitDataListByPlayerId(selfPlayer.Id, selfUnitList);
|
||
|
||
bool isMainMap = mapData == Main.MapData;
|
||
var visualSteps = isMainMap ? new List<SkillVisualStep>() : null;
|
||
|
||
// 使用池化 buffer 避免嵌套调用时的集合修改异常
|
||
var aroundBuf = RentAroundBuf();
|
||
mapData.GridMap.GetAroundGridData(1, 1, attackInfo.DamageTargetGrid, aroundBuf);
|
||
|
||
foreach (var grid in aroundBuf)
|
||
{
|
||
if (!grid.RealUnit(mapData, out var unit)) continue;
|
||
// 跳过攻击目标本身(FearMaker已经处理)
|
||
if (attackInfo.DamageTarget != null && unit.Id == attackInfo.DamageTarget.Id) continue;
|
||
// 跳过自己
|
||
if (unit.Id == attackInfo.DamageOrigin.Id) continue;
|
||
// 跳过友军
|
||
if (selfUnitList.Contains(unit)) continue;
|
||
if (mapData.IsLeagueOrJustBreakByUnit(unit.Id, attackInfo.DamageOrigin.Id)) continue;
|
||
// 跳过免疫恐惧的单位
|
||
if (unit.GetSkill(SkillType.KomeijiFearImmune, out _)) continue;
|
||
|
||
unit.AddOrOverrideSkill(SkillType.KomeijiFear, mapData, attackInfo.DamageOrigin.Id);
|
||
|
||
if (isMainMap && MapRenderer.Instance != null &&
|
||
MapRenderer.Instance.ROUnitMap.TryGetValue(unit.Id, out var unitRenderer))
|
||
{
|
||
var gridRenderer = grid.Renderer(mapData);
|
||
visualSteps.Add(new SkillVisualStep
|
||
{
|
||
UnitRenderer = unitRenderer,
|
||
GridRenderer = gridRenderer,
|
||
VFXList = new List<GridVFXParams> { new GridVFXParams(GridVFXType.KomeijiFear) },
|
||
RefreshUnit = true,
|
||
});
|
||
}
|
||
}
|
||
|
||
ReturnAroundBuf();
|
||
|
||
if (visualSteps != null && visualSteps.Count > 0)
|
||
{
|
||
PresentationManager.EnqueueSkillEffect(visualSteps);
|
||
}
|
||
}
|
||
}
|
||
}
|