docs(enemy): 按 Task 1+2 审查结论修订 spec 与计划

spec:ResourceFull 由「无组件时恒 false」改为显式抛,与 Boss facet、AnchorAt
统一为「依赖组件缺失一律抛,不返默认值」。
计划:Task 16 补上 BossBase 残余三处行为树残留的清理项(含运行时告警字符串);
Task 19 记录 Patterns/ 是零外部引用的独立程序集,可整目录删。
This commit is contained in:
2026-07-30 12:32:43 +08:00
parent 2a1ada4388
commit b0fd040904
2 changed files with 17 additions and 1 deletions
@@ -219,7 +219,7 @@ namespace BaseGames.AI
{
int CurrentPhase { get; }
bool IsPhaseTransitioning { get; }
bool ResourceFull { get; } // BossResource 满值;无资源组件时恒 false
bool ResourceFull { get; } // BossResource 满值;未挂该组件即抛(见下)
void BeginPhaseTransition(int targetPhase, float invincibleDuration);
// 竞技场锚点(§5.5)。归本 facet 而非黑板:见下方修订说明。
@@ -242,6 +242,12 @@ namespace BaseGames.AI
`EnemyBrainContext.Boss => _boss ?? throw new InvalidOperationException(...)`
按 CLAUDE.md 第 6 条:小怪图误用它必须崩,不能返回一个空对象把问题盖住。
> 修订(2026-07-30Task 1+2 代码审查):`ResourceFull` 初稿定为「无资源组件时恒 false」,
> **已改为未挂 `BossResource` 时显式抛**。原设计是同一条第 6 条禁止的下游兜底——
> 图上挂了 `When(x => x.Boss.ResourceFull)` 边、预制体却漏挂组件时,那条边会永远不成立且零报错。
> 与紧邻的 `Boss` facet、以及 §5.5 的 `AnchorAt` 保持同一失败语义:**Boss 专属 facet 的每个成员,
> 在其依赖组件缺失时一律显式抛,不返回默认值。**
`BossBase` 实现 `IBossControl``EnemyBrainContext` 在构造时 `_boss = enemy as BossBase`
### 5.2 `BossPhaseAbilityGate`