TH1/Unity/Assets/Scripts/TH1_Logic/Skill/AllSkill/SkillBanBombSkill.cs
2026-05-21 13:22:05 +08:00

137 lines
4.7 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 MemoryPack;
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
{
// 来源阵营PlayerId, 0=未记录(老存档反序列化默认值, 走旧逻辑不过滤盟友)
[MemoryPackInclude]
private uint _originPlayerId;
public SkillBanBombSkill()
{
IsPermanent = true;
TurnsLimit = 0;
Score = 4;
}
public override SkillType GetSkillType()
{
return SkillType.SkillBanBoom;
}
public override void OnSkillAdd(MapData mapData, uint originId)
{
base.OnSkillAdd(mapData, originId);
_originPlayerId = ResolveOriginPlayerId(mapData, originId);
}
public override void OnSkillOverride(MapData mapData, uint originId, uint selfId)
{
base.OnSkillOverride(mapData, originId, selfId);
// 覆盖叠加时以最新一次施加者的阵营为准; 查不到则保留原阵营信息
var refreshed = ResolveOriginPlayerId(mapData, originId);
if (refreshed != 0) _originPlayerId = refreshed;
}
private static uint ResolveOriginPlayerId(MapData mapData, uint originId)
{
if (mapData == null) return 0;
return mapData.GetPlayerDataByUnitId(originId, out var player) && player != null
? player.Id
: 0u;
}
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;
// 跳过来源阵营的盟友(_originPlayerId==0 时跳过过滤, 兼容老存档)
if (_originPlayerId != 0 &&
mapData.GetPlayerDataByUnitId(target.Id, out var targetPlayer) &&
targetPlayer != null &&
mapData.SameUnion(_originPlayerId, targetPlayer.Id))
{
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();
}
}
}
}
}
}