TH1/Unity/Assets/Scripts/TH1_Logic/Skill/AllSkill/KomeijiFearSplashSkill.cs
2026-04-24 18:22:21 +08:00

80 lines
3.0 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.

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);
}
}
}
}