137 lines
4.7 KiB
C#
137 lines
4.7 KiB
C#
/*
|
||
* @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();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|