TH1/Unity/Assets/Scripts/TH1_Logic/Skill/AllSkill/SkillBanBombSkill.cs

102 lines
3.2 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.

/*
* @Author: 白哉
* @Description: 技能封印炸弹技能
* @Date: 2026年03月06日
* @Modify:
*/
using System.Collections.Generic;
using RuntimeData;
using Logic.CrashSight;
using TH1_Anim.Fragments;
using TH1_Core.Managers;
using TH1_Logic.Core;
using TH1Renderer;
using UnityEngine;
namespace Logic.Skill
{
public partial class SkillBanBombSkill : SkillBase
{
public SkillBanBombSkill()
{
IsPermanent = true;
TurnsLimit = 0;
Score = 4;
}
public override SkillType GetSkillType()
{
return SkillType.SkillBanBoom;
}
public override void OnDamaged(MapData mapData, SettlementInfo info)
{
if (!info.IsKill || info.DamageTarget == null) return;
var grid = info.DamageTargetGrid;
if (grid == null)
{
LogSystem.LogError($"Explode Error grid is null");
return;
}
var unitsToRefresh = new System.Collections.Generic.List<uint>();
var aroundBuf = RentAroundBuf();
mapData.GridMap.GetAroundGridData(1, 1, grid, aroundBuf);
foreach (var around in aroundBuf)
{
if (around == grid) continue;
around.RealUnit(mapData,out var target);
if (target == null) continue;
target.AddOrOverrideSkill(SkillType.SkillBan, mapData, info.DamageTarget.Id);
unitsToRefresh.Add(target.Id);
}
ReturnAroundBuf();
// 视觉更新刷新所有受影响单位的UI显示显示debuff图标
if (mapData != Main.MapData) return;
// OnDamaged 在攻击命中时触发,根据攻击类型选择正确的 phase
int phase = info.DamageType == DamageType.ActiveAttack
? AnimPhase.AttackImpact + 50
: AnimPhase.CounterImpact + 50;
var scope = PresentationManager.CurrentScope;
if (scope != null)
{
// 在攻击流程中:延迟注入到攻击 Fragment
foreach (var unitId in unitsToRefresh)
{
if (MapRenderer.Instance != null &&
MapRenderer.Instance.ROUnitMap.TryGetValue(unitId, out var unitRenderer))
{
var renderer = unitRenderer; // 捕获变量
scope.Add(new FragmentStep
{
Phase = phase,
Duration = 0.1f,
Execute = () => { renderer.InstantUpdateUnit(false); }
});
}
}
}
else
{
// 不在攻击流程中:直接刷新
if (MapRenderer.Instance == null) return;
foreach (var unitId in unitsToRefresh)
{
if (MapRenderer.Instance.ROUnitMap.TryGetValue(unitId, out var unitRenderer))
{
unitRenderer.RenderUpdateUnitImage();
}
}
}
}
}
}