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(out var selfUnitList); mapData.GetUnitDataListByPlayerId(selfPlayer.Id, selfUnitList); bool isMainMap = mapData == Main.MapData; var visualSteps = isMainMap ? new List() : 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 { new GridVFXParams(GridVFXType.KomeijiFear) }, RefreshUnit = true, }); } } ReturnAroundBuf(); if (visualSteps != null && visualSteps.Count > 0) { PresentationManager.EnqueueSkillEffect(visualSteps); } } } }