docs(02): capture phase context

This commit is contained in:
unanmed 2026-09-09 14:27:21 +08:00
parent cd81f9b6bc
commit 6197d5ba23
2 changed files with 186 additions and 0 deletions

View File

@ -0,0 +1,107 @@
# Phase 2: 寻路系统 - Context
**Gathered:** 2026-09-09
**Status:** Ready for planning
<domain>
## Phase Boundary
本阶段交付**数据端寻路系统**:在两点间寻找损失最小的路径并驱动移动对象移动(逐步寻路 / 瞬移两种方式),支持自定义损失函数、有向图寻路、仅获取路径的 API。玩家点击交互点击地图触发寻路属于渲染端内容本阶段不做接线——数据端只提供供渲染端后续调用的移动入口PATH-02 的点击接线在 Phase 4 渲染适配时完成)。
</domain>
<decisions>
## Implementation Decisions
### 算法与接口
- **D-01:** 寻路目标是两点之间**损失最小**的路径;系统允许调用方自定义损失函数,默认实现为每格损失 1
- **D-02:** 算法流程:(1) 将地图转换为**有向图**——仅包含从当前位置可以到达的位置,由于存在单向通行位置,图必须是有向的;(2) 对图中每个图块用自定义损失函数计算损失;(3) 用算法找出损失最少的路径并返回
- **D-03:** 寻路系统具备足够扩展性,允许绑定 `IMapLayer`(地图)与 `IObjectMovable`(移动对象)两类对象
- **D-04:** 系统提供**两种移动方式**:逐步寻路至目标点;瞬移至目标点。瞬移前经回退策略判定,判定需要回退则自动退为逐步寻路
- **D-05:** 提供**回退决策接口**:接收一个策略函数,函数入参为寻路路径及每步会到达的位置,由该函数决策是否回退移动方式。默认策略实现为"路径上存在事件即回退"(事件可能改变状态,瞬移会跳过副作用)
- **D-06:** 提供**仅获取寻路路径**的方法(不移动,只返回路径)
- **D-07:** 接口设计流程AI 先按现有接口设计理念起草接口草案,**经用户修改拍板后才进入实现**——planner 必须内置该 review 关卡(接口经用户确认前不得开始实现任务)
### 不可达目标语义
- **D-08:** 寻路至不可达位置时分两种情况:(1) 目标本身是 no-pass 类图块且四周有坐标可以到达——移动到该相邻格,触发目标位置的 **OnTouch** 触发器(走 Phase 1 事件链路),勇士面朝目标位置;(2) 其他情况——忽略本次寻路移动,路径为空数组
### 移动执行
- **D-09:** 逐步寻路的执行**复用现有 hero mover**`DefaultHeroMoveTopImpl`),每步走 enter/leave/hit hooks途经事件自然触发与 Phase 1 source-aware 事件派发一致)
- **D-10:** 自动寻路途中**可被玩家输入打断**:新的方向键输入或新的点击立即打断并接管(魔塔惯例)
### 范围收窄
- **D-11:** 本阶段仅关注数据端系统玩家点击交互是渲染端内容PATH-02 的点击触发接线延迟到 Phase 4 渲染适配
### the agent's Discretion
- 图的构建时机与缓存策略(每次寻路动态构建 vs 缓存)——数据端状态可变(敌人/门/道具),默认建议动态构建
- 具体算法选型(满足"最小损失 + 有向图"语义即可AI 决定)
- 接口命名、签名与文件归属层的细节——在**接口草案**中提出,最终由用户拍板
</decisions>
<canonical_refs>
## Canonical References
**Downstream agents MUST read these before planning or implementing.**
### 寻路相关现有接口
- `packages-user/data-common/src/common/mover.ts``IObjectMovable` 接口与 mover 抽象(寻路绑定对象之一)
- `packages-user/data-state/src/hero/moverImpl.ts` — 现有 hero 移动实现(`DefaultHeroMoveTopImpl`Phase 1 已重写为事件驱动enter/leave/hit hooks
- `packages-user/data-base/src/map/mapLayer.ts``IMapLayer`(寻路绑定对象之一,图构建的数据来源)
### 事件系统OnTouch 链路)
- `packages-user/data-common/src/event/types.ts``EventTrigger` 枚举OnTouch 等)+ `IGameEvent` 接口
- `packages-user/data-common/src/store/eventStore.ts``GameEventStore`id → event
### 规划与约束文档
- `dev.md` — 项目开发规范(模块原则、类型规则、禁 `as`、logger 错误码、禁循环依赖)
- `.planning/ROADMAP.md` — Phase 2 目标与成功标准
- `.planning/REQUIREMENTS.md` — PATH-01 / PATH-02
- `.planning/PROJECT.md` — 协作模型(接口设计用户主导)与双端约束
</canonical_refs>
<code_context>
## Existing Code Insights
### Reusable Assets
- `IObjectMovable``data-common/common/mover.ts`):移动对象抽象,寻路系统直接绑定
- `DefaultHeroMoveTopImpl``data-state/hero/moverImpl.ts`现有逐步移动执行器Phase 1 已接入 source-aware 事件派发,逐步寻路复用它
- `IMapLayer` / `MapLayer``data-base/map/`):地图层数据,含碰撞/图块信息,是图的构建来源
- `hook` 事件(`data-base/game.ts``moveOneStep` 等生命周期事件,逐步移动的每步钩子
### Established Patterns
- 数据端分层L0data-common放公共接口L1data-base放可存档数据L2data-system放游戏逻辑动作不存档——寻路算法/系统按此分层归属(草案中定位,用户拍板)
- 接口前缀 `I`、禁 `as` 断言、logger 数字错误码、禁循环依赖、模块无顶层副作用(`createXxx()` 工厂模式)
- 双端分离:数据端无 DOM寻路逻辑必须在数据端Node 回放可验证
### Integration Points
- 渲染端 action`client-modules/src/action/`)在 Phase 4 将点击意图发到数据端寻路入口
- hero enter/leave/hit hooksPhase 1在逐步移动经过图块时派发 OnEnter/OnLeave/OnTouch 事件
</code_context>
<specifics>
## Specific Ideas
用户明确阐述的算法流程(两点最小损失路径、有向图、逐格自定义损失、最小损失算法求解)见 D-01/D-02瞬移回退策略、不可达目标双语义相邻格 + OnTouch / 空数组)见 D-05/D-08。无外部参考文档。
</specifics>
<deferred>
## Deferred Ideas
- 移动端点击地图触发寻路的**渲染端接线**(点击拾取、不可达格点击反馈等 UI 行为)——属 Phase 4 渲染适配
</deferred>
---
*Phase: 2-寻路系统*
*Context gathered: 2026-09-09*

View File

@ -0,0 +1,79 @@
# Phase 2: 寻路系统 - Discussion Log
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
**Date:** 2026-09-09
**Phase:** 2-寻路系统
**Areas discussed:** 用户设计阐述, 算法与接口细节, 不可达目标语义, 范围收窄
---
## 用户设计阐述free-form
用户先完整阐述寻路系统设计想法,替代逐项选择题:
- 目标:两点之间损失最小的路径;系统允许自定义损失函数
- 流程:地图 → 有向图(仅当前位置可达位置,含单向通行)→ 逐图块自定义损失 → 最小损失路径算法求解
- 扩展性:可绑定 `IMapLayer`(地图)与 `IObjectMovable`(移动对象)
- 两种移动方式:逐步寻路 / 瞬移;瞬移路径上有事件、道具等则回退为逐步
- 额外提供仅获取路径的方法
- 协作方式AI 自行设计接口(参考现有接口理念),**经用户修改拍板后再实现**
---
## 算法与接口细节
| Option | Description | Selected |
|--------|-------------|----------|
| 每格 1推荐 | 默认每移动一格损失 1可被自定义函数覆盖 | ✓ |
| 无默认,强制传入 | 无损失函数时需显式传入才能寻路 | |
| Option | Description | Selected |
|--------|-------------|----------|
| 存在事件即回退(推荐) | 路径上任一格存在点事件或图块事件即回退逐步 | ✓ |
| 仅点事件 | 只有点事件触发回退 | |
| Option | Description | Selected |
|--------|-------------|----------|
| 复用现有 mover推荐 | 复用 DefaultHeroMoveTopImpl 逐格移动,每步走 enter/leave/hit hooks | ✓ |
| 自建执行 | 寻路系统自建步进执行 | |
| Option | Description | Selected |
|--------|-------------|----------|
| 可打断(推荐) | 新方向键/点击输入立即打断并接管 | ✓ |
| 不可打断 | 走完为止 | |
**User's choice:** 全部选择推荐项
**Notes:** 用户补充:应提供接口用于决策是否回退移动方式——接收一个函数,入参为寻路路径及每步会到达的位置(即 D-05 的策略函数注入设计)
---
## 不可达目标语义
| Option | Description | Selected |
|--------|-------------|----------|
| 不移动(针对点击不可达格) | 角色停在原地 | (语义被后续补充取代) |
| 走近到最近可达格 | 寻路到最近可达格停下 | (语义被后续补充取代) |
**User's choice:** 用户后续补充更精确的双语义:目标为 no-pass 图块且四周有可达坐标 → 移到相邻格并触发目标位置 OnTouch 触发器、勇士面朝目标;其他情况 → 忽略本次移动,路径为空数组
**Notes:** 该补充取代了最初的简单选项
---
## 范围收窄
**User's choice:** 玩家交互先不完成,这部分是渲染端的内容;本次任务仅关注数据端系统
**Notes:** PATH-02 点击触发接线延迟到 Phase 4 渲染适配
---
## the agent's Discretion
- 图构建时机与缓存策略(默认建议动态构建)
- 具体算法选型(满足最小损失 + 有向图语义即可)
- 接口命名、签名、文件归属层细节——草案中提出,用户拍板
## Deferred Ideas
- 移动端点击地图触发寻路的渲染端接线 → Phase 4 渲染适配