136 lines
5.2 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年04月23日 星期三 21:04:18
* @Modify:
*/
using System.Collections.Generic;
using RuntimeData;
using System;
using Logic.CrashSight;
using TH1_Logic.Core;
using TH1_Anim.Fragments;
using TH1_Core.Managers;
using TH1Renderer;
using UnityEngine;
using MemoryPack;
namespace Logic.Skill
{
public partial class SplashSkill : SkillBase
{
public SplashSkill()
{
IsPermanent = true;
TurnsLimit = 0;
Score = 4;
}
public override SkillType GetSkillType()
{
return SkillType.SPLASH;
}
public override void OnDamageOther(MapData mapData, SettlementInfo info)
{
if (info == null) return;
if (info.DamageType != DamageType.ActiveAttack) return;
if (info.DamageOrigin == null )return;//|| info.DamageTarget == null) return;
if (!mapData.GetPlayerDataByUnitId(info.DamageOrigin.Id, out var player)) return;
var selfUnitList = new HashSet<UnitData>();
mapData.GetUnitDataListByPlayerId(player.Id, selfUnitList);
if (info.DamageTargetGrid == null)
{
LogSystem.LogError($"SplashSkill info.DamageTarget is null");
return;
}
// 收集需要延迟刷新的单位
var unitsToRefresh = new List<(UnitData unit, GridData grid, int damage)>();
var aroundBuf = RentAroundBuf();
mapData.GridMap.GetAroundGridData(1, 1, info.DamageTargetGrid, aroundBuf);
foreach (var grid in aroundBuf)
{
if (!grid.RealUnit(mapData, out var unit)) continue;
if (unit == info.DamageTarget) continue;
if (selfUnitList.Contains(unit)) continue;
if (mapData.IsLeagueOrJustBreakByUnit(unit.Id, info.DamageOrigin.Id)) continue;
// 计算攻击伤害
var damage = Table.Instance.CalcDamage(mapData, info.DamageOrigin, unit, damagePara:0.5f);
unitsToRefresh.Add((unit, grid, damage));
Main.UnitLogic.DamageSettlement(mapData, info.DamageOrigin, unit, damage, DamageType.Splash);
}
ReturnAroundBuf();
// 视觉更新:延迟刷新所有溅射目标单位的显示
if (mapData != Main.MapData) return;
int phase = AnimPhase.AttackImpact + 50;
float projectileTime = Table.Instance.ProjectileTypeDataAssets.GetProjectileTypeInfo(ProjectileType.Bomb, out var pinfo)
? pinfo.AnimTime
: 0.5f;
var scope = PresentationManager.CurrentScope;
if (scope != null)
{
// 在攻击流程中:延迟注入到攻击 Fragment
foreach (var (unit, grid, dmg) in unitsToRefresh)
{
if (!unit.IsAlive()) continue;
if (MapRenderer.Instance != null)
{
var g = grid;
var u = unit;
var d = dmg;
scope.Add(new FragmentStep
{
Phase = phase,
Duration = projectileTime,
Execute = () =>
{
if (g.InMainSight())
{
u.Renderer(mapData)?.InstantUpdateUnit(true);
u.Renderer(mapData)?.InstantUpdateTryDie();
g.Renderer(mapData)?.InstantUpdateGrid();
g.Renderer(mapData)?.SetBounceAnim(NeedRandomWait:true);
g.Renderer(mapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
g.Renderer(mapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage, d));
}
}
});
}
}
}
else
{
// 不在攻击流程中:使用原有 Timer 逻辑
foreach (var (unit, grid, dmg) in unitsToRefresh)
{
if (grid.InMainSight())
{
var g = grid;
var u = unit;
var d = dmg;
Timer.Instance.TimerRegister(this, () =>
{
u.Renderer(mapData)?.InstantUpdateUnit(true);
u.Renderer(mapData)?.InstantUpdateTryDie();
g.Renderer(mapData)?.InstantUpdateGrid();
g.Renderer(mapData)?.SetBounceAnim(NeedRandomWait:true);
g.Renderer(mapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
g.Renderer(mapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage, d));
}, projectileTime, "SPLASHANIM TMP");
}
}
}
}
}
}