import type { Component, Node, sp } from 'cc'; import type { EntityId } from 'db://assets/mx/module/battle'; /** * 怪物 Cocos 视图组件契约(实现方:`ui/BattleGame/Monster.ts`) * * 逻辑层(MX WaveSpawner)只发 UnitSpawned; * CocosBattleMonsterPresenter 负责实例化 prefab 并调用此接口。 * battle 层不静态 import ui 模块,避免循环依赖。 */ export interface IBattleMonsterView extends Component { anim?: sp.Skeleton; /** MX 实体 id(由 Presenter 赋值) */ entityId?: EntityId | null; /** 配表怪物数据(setData 写入) */ Data?: ITableMonster | null; /** 相对 Monster.size 的表现倍率 */ sizeMul?: number; /** 由 MX MovementSystem 驱动位移时为 true */ useMxMovement?: boolean; /** 机制怪落地后不可移动(由 Presenter 赋值) */ mechanismImmobile?: boolean; /** 播放 Spine 动画(机制怪下落等) */ playSpineAnim?(name: string, loop?: boolean, onComplete?: () => void): void; /** 空降兵落地动画 */ playParatroopLand?(): void; setData(data: ITableMonster, hp: number): void; playWalk(speed?: number): void; /** * 播契约死亡轨(五行=`{系}小怪2`);无契约返回 false。 * @param onComplete 播完 */ playDeath?(onComplete?: () => void): boolean; /** 绑定 MapManager 后计算寻路目标(须在 MapGridsReady 之后) */ bindPathTarget(): void; /** 同步 MX 层 HP(受击/治疗后由表现层调用,刷新血条) */ syncMxHp?(hp: number, maxHp: number): void; /** * 播放加血特效(`怪物加血`)。 * @param statusText 可选状态飘字;默认「加血」 */ playHealEffect?(statusText?: string): void; /** 血上限提升:播 `血量上限` 并飘「血上限」,不播 `怪物加血` */ playHpCapEffect?(): void; /** 阎王技能命中:播 `怪_流血`(已有流血则保持) */ playBleedHitFx?(): void; /** * 还魂丹原地复活:在死亡点播 `小怪复活效果`(不跟随怪物)。 * @param fxParent 特效父节点(怪物层,勿挂怪身上以免跟随缩放) * @returns 特效动画时长(秒);失败为 0 */ playReviveEffect?(fxParent?: Node): number; /** 显示加速特效(`怪_加速`) */ showAccelerateFx?(): void; /** 回收加速特效 */ clearAccelerateFx?(): void; /** 创建/刷新血条(皮肤就绪后再次调用) */ ensureBloodBar?(): void; /** 按 Spine 重算血条挂点 */ syncBloodPosToSkin?(): void; /** 行军小怪:换皮后进入 PRIVATE_CACHE */ applyMarchSpineCache?(): void; /** 用 Sorting2D 按脚底 Y 叠层,返回写入的 order */ syncYSortOrder?(): number; /** 播放受击反馈(闪白 + 按来击方向后仰);hitDir 为击退方向(目标−来源) */ playHit?(damageType?: string, hitDirX?: number, hitDirY?: number): void; /** 对象中心播放受击 Spine 特效;faceSource 为攻击来源方向(刀痕等需朝向来源) */ showHitEffect?(hitEffectCfg?: string, faceSourceX?: number, faceSourceY?: number): void; upEff?: Node | null; bloodPos?: Node | null; } export const BATTLE_MONSTER_CCCLASS = 'Monster';