using System;
using UnityEngine;
namespace BaseGames.Enemies
{
// ── 连接段类型(映射 PB2d LinkTypeName 字符串)───────────────────────
public enum NavLinkType
{
None,
Segment, // 普通地面/平台段
Jump,
Fall,
Corner,
Climb,
Elevator,
Teleport,
Custom
}
///
/// 导航代理抽象接口(架构 07_EnemyModule §5)。
/// EnemyBase 和 BD Task 只依赖此接口,不依赖具体导航库。
/// 实现:EnemyNavAgent(PathBerserker2d);测试用 NullPathAgent。
///
public interface IPathAgent
{
// ── 核心移动 ────────────────────────────────────────────────────
/// 请求移动到世界坐标 target。
void RequestMoveTo(Vector2 target);
/// 立即停止导航(清除路径)。
void StopNavigation();
/// 是否已到达目标(距离 ≤ stoppingDistance)。
bool IsAtDestination();
/// 运行时覆盖移动速度。
void SetSpeed(float speed);
/// 当前帧是否在移动(速度 > 0.01 且有有效路径)。
bool IsMoving { get; }
/// 是否接近平台边缘(脚下或前方无地面时为 true)。
bool IsNearEdge();
// ── 连接段感知(NavLink 平台跳跃/爬梯/传送)─────────────────────
/// 当前是否正在穿越连接段(跳跃/下落/爬梯等)。
bool IsOnLink { get; }
/// 当前正在穿越的连接段类型;不在连接段时为 None。
NavLinkType CurrentLinkType { get; }
/// 当前连接段的起始世界坐标;不在连接段时为 Vector2.zero。
Vector2 CurrentLinkStart { get; }
/// 当前连接段的目标世界坐标;不在连接段时为 Vector2.zero。
Vector2 CurrentLinkEnd { get; }
/// 检查目标是否可以从当前位置导航到达(同步轻量查询)。
bool CanReach(Vector2 target);
/// 移动到随机可到达点(巡逻 fallback)。
bool WalkToRandom();
// ── 连接段事件 ──────────────────────────────────────────────────
/// 开始穿越连接段时触发(传入连接段类型)。
event Action OnLinkStarted;
/// 连接段穿越完成时触发。
event Action OnLinkCompleted;
/// 路径寻路失败事件(目标不可达时触发)。
event Action OnNavPathFailed;
/// 到达目标事件(替代轮询 IsAtDestination)。
event Action OnGoalReached;
}
// ── 无导航 / 测试用空实现 ─────────────────────────────────────────────
public sealed class NullPathAgent : IPathAgent
{
public void RequestMoveTo(Vector2 _) { }
public void StopNavigation() { }
public bool IsAtDestination() => true;
public void SetSpeed(float _) { }
public bool IsMoving => false;
public bool IsNearEdge() => false;
public bool IsOnLink => false;
public NavLinkType CurrentLinkType => NavLinkType.None;
public Vector2 CurrentLinkStart => Vector2.zero;
public Vector2 CurrentLinkEnd => Vector2.zero;
public bool CanReach(Vector2 _) => false;
public bool WalkToRandom() => false;
public event Action OnLinkStarted { add { } remove { } }
public event Action OnLinkCompleted{ add { } remove { } }
public event Action OnNavPathFailed { add { } remove { } }
public event Action OnGoalReached { add { } remove { } }
}
}