using System.Collections;
using Animancer;
using BaseGames.Combat;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
///
/// 多段砸地能力:起手 → 循环砸地(N次,带 HitBox 激活)→ 收招。
/// 支持霸体(ABL SO 配置 interruptOnHurt=false),后摇时间可配置。
/// 可复用于任何多段地面攻击型敌人。
///
public class RepeatSlamAbility : EnemyAbilityBase
{
[Header("打击")]
[SerializeField] private HitBox _hitBox;
private RepeatSlamAbilitySO _cfg;
protected override void Awake()
{
base.Awake();
_cfg = ResolveConfig();
}
protected override IEnumerator ExecuteCoroutine()
{
if (_cfg == null) yield break;
Phase = AbilityRunState.Active;
if (_cfg.startClip.Clip != null)
{
_animancer.Play(_cfg.startClip);
yield return EnemyAbilityWaits.Get(_cfg.startClip.Clip.length);
}
for (int i = 0; i < _cfg.slamCount; i++)
{
if (_cfg.loopClip.Clip != null)
{
_animancer.Play(_cfg.loopClip);
float preHit = Mathf.Max(0f, _cfg.loopClip.Clip.length - _cfg.hitActiveTime - 0.05f);
yield return EnemyAbilityWaits.Get(preHit);
}
var dmgSrc = _config?.attackSequence?.Length > 0 ? _config.attackSequence[0].damageSource : null;
_hitBox?.Activate(dmgSrc, _transform);
yield return EnemyAbilityWaits.Get(_cfg.hitActiveTime);
_hitBox?.Deactivate();
if (i < _cfg.slamCount - 1)
yield return EnemyAbilityWaits.Get(0.1f);
}
if (_cfg.endClip.Clip != null)
{
_animancer.Play(_cfg.endClip);
yield return EnemyAbilityWaits.Get(_cfg.endClip.Clip.length + _cfg.staggerDuration);
}
else
{
yield return EnemyAbilityWaits.Get(_cfg.staggerDuration);
}
}
protected override void OnInterrupted(InterruptReason reason)
{
_hitBox?.Deactivate();
}
}
}