mirror of
https://github.com/motajs/template.git
synced 2026-10-17 03:10:17 +08:00
docs(09-06): complete book enemy handbook plan
- bookDetail.tsx: independent detail UI (base/computed, special list, critical table) - book.tsx: handbook list UI (enemyContext, dedupe by code, 9 columns, open detail) - static symbol + CRLF + scope gates all pass; OI-4..OI-6 recorded
This commit is contained in:
parent
0f0b2770fe
commit
11aaafeaef
155
.planning/phases/09-minimum-browser-runnable/09-06-SUMMARY.md
Normal file
155
.planning/phases/09-minimum-browser-runnable/09-06-SUMMARY.md
Normal file
@ -0,0 +1,155 @@
|
||||
---
|
||||
phase: 09-minimum-browser-runnable
|
||||
plan: 6
|
||||
subsystem: ui
|
||||
tags: [ui, book, enemy-handbook, data-system, damage-critical, client-modules]
|
||||
|
||||
# Dependency graph
|
||||
requires:
|
||||
- phase: 09-minimum-browser-runnable
|
||||
provides: 09-05 (post-migration UI fixes; statusBar/toolbar baseline stable)
|
||||
provides:
|
||||
- 独立怪物详情 UI bookDetail.tsx(BookDetail/BookDetailUI),入参 IEnemy | IEnemyView,基础/计算后切换、特殊列表、临界表
|
||||
- 怪物手册列表 UI book.tsx(Book/BookUI),绑定 current EnemyContext、按 code 去重、9 项数值、滚动、点击开详情
|
||||
affects: [book, equipbox, toolbox, shop]
|
||||
|
||||
actuals:
|
||||
tokens: 4600
|
||||
tasks: 3
|
||||
commits: 2
|
||||
|
||||
# Tech tracking
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns:
|
||||
- 新 UI 组件以 props.state.enemyContext / props.state.hero 读数据端(无 client 单例)
|
||||
- 基础属性临界走 calculateEnemyCritical(enemy,'atk',locator|null);计算后走 calculateViewCritical(view,'atk')
|
||||
- 「1 防」= getIsolatedAttribute().add('def',1) + damage.with(isolated).calculateEnemyCritical(...) 求差
|
||||
|
||||
key-files:
|
||||
created:
|
||||
- packages-user/client-modules/src/ui/bookDetail.tsx
|
||||
- packages-user/client-modules/src/ui/book.tsx
|
||||
modified: []
|
||||
|
||||
key-decisions:
|
||||
- "OI-4:数字格式化沿用 core.formatBigNumber(as-is)"
|
||||
- "OI-5:命名照准 book.tsx/bookDetail.tsx、Book/BookDetail、GameUI 'book'/'book-detail'、BookProps/BookDetailProps、BookUI/BookDetailUI"
|
||||
- "OI-6:「1 防」以基础属性路径计算——getIsolatedAttribute().add('def',1) + with(...).calculateEnemyCritical(...) 求差"
|
||||
- "详情为独立 UI,不 import book.tsx;列表通过 controller.open(BookDetailUI, { enemy: view }) 打开详情"
|
||||
- "按 base.code 去重时仅收集 IEnemyView,不新增内部命名接口"
|
||||
|
||||
patterns-established:
|
||||
- "详情/列表两文件独立:详情入参 IEnemy|IEnemyView 结构判别('getBaseEnemy' in enemy),列表传 IEnemyView 以启用切换"
|
||||
|
||||
requirements-completed: []
|
||||
|
||||
coverage:
|
||||
- id: D1
|
||||
description: "bookDetail.tsx 独立敌人详情 UI:基础/计算后属性切换、特殊属性列表、临界表、左下切换/右下返回"
|
||||
verification:
|
||||
- kind: automated_ui
|
||||
ref: "node -e BOOKDETAIL GATE (interface BookDetailProps / getBaseEnemy/getComputedEnemy / iterateSpecials / getSpecialName/getDescription / calculateEnemyCritical / calculateViewCritical / BookDetailUI)"
|
||||
status: pass
|
||||
- kind: automated_ui
|
||||
ref: "node -e CRLF GATE bookDetail.tsx"
|
||||
status: pass
|
||||
human_judgment: true
|
||||
rationale: "本计划验证仅为静态源码断言(无 pnpm check:type / build / 浏览器运行);渲染与交互行为未经机器或人工运行验证,需 verifier 按 UAT 确认"
|
||||
- id: D2
|
||||
description: "book.tsx 怪物手册列表 UI:绑定 enemyContext、按 code 去重、9 项数值(含「1 防」)、滚动、点击开详情、右下退出"
|
||||
verification:
|
||||
- kind: automated_ui
|
||||
ref: "node -e BOOK GATE (interface BookProps / props.state.enemyContext / iterateEnemy / getBaseEnemy / .code / calculateEnemyCritical / baseInfo / with( / <icon / <Scroll / BookDetailUI / controller.open / controller.close)"
|
||||
status: pass
|
||||
- kind: automated_ui
|
||||
ref: "node -e CRLF GATE book.tsx + bookDetail.tsx"
|
||||
status: pass
|
||||
- kind: other
|
||||
ref: "git status --porcelain (scope guard: 仅本计划文件)"
|
||||
status: pass
|
||||
human_judgment: true
|
||||
rationale: "同上:仅静态断言,布局/交互/数值正确性未经运行验证,需 verifier 确认"
|
||||
|
||||
duration: 3min
|
||||
completed: 2026-10-11
|
||||
status: complete
|
||||
---
|
||||
|
||||
# Phase 9 Plan 6: 怪物手册(book 列表 + 独立详情)Summary
|
||||
|
||||
**移植 legacy 怪物手册到新 UI 接口:独立详情 `bookDetail.tsx`(`IEnemy | IEnemyView` 入参、基础/计算后切换、特殊列表、系统二分法临界表)+ 列表 `book.tsx`(绑定当前 `EnemyContext`、按 `code` 去重、9 项数值含「1 防」、滚动、点击开详情、右下退出)。**
|
||||
|
||||
## Performance
|
||||
|
||||
- **Duration:** ~3 min
|
||||
- **Started:** 2026-10-11T05:40:00Z
|
||||
- **Completed:** 2026-10-11T05:45:41Z
|
||||
- **Tasks:** 3(Task 0 汇报关卡已闭环 + Task 1 + Task 2)
|
||||
- **Files modified:** 2(均为新增)
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- 新增 `bookDetail.tsx`:独立详情 UI,入参 `IEnemy<IEnemyAttr> | IEnemyView<IEnemyAttr>`;结构判别(`'getBaseEnemy' in props.enemy`)区分视图;基础/计算后属性经 `getBaseEnemy()`/`getComputedEnemy()` 切换;特殊列表经 `iterateSpecials()` + `getSpecialName()`/`getDescription()`;临界表基础模式 `calculateEnemyCritical(base,'atk',locator)`、计算模式 `calculateViewCritical(view,'atk')`;左下角切换按钮文案随模式变化,右下角「返回上一级」调用 `close(props.instance)`。
|
||||
- 新增 `book.tsx`:绑定 `props.state.enemyContext`,按 `base.code` 去重;纵向 `<Scroll noscroll>` 平铺行;每行 `<icon icon={base.code}>` + 名称 + 特殊名 + 生命/攻击/防御/金币/经验 + 伤害/临界/减伤/「1 防」;伤害/临界/减伤经基础路径 `calculateEnemyCritical`,「1 防」经 `with(隔离属性 add('def',1))` 求差;点击行 `controller.open(BookDetailUI, { enemy: view })`;右下「退出」`controller.close(props.instance)`。
|
||||
- 两文件均通过静态符号门禁 + CRLF 门禁 + 范围守卫;未改 `package.json`、未改任何既有文件、未触碰用户并发改动。
|
||||
|
||||
## Task Commits
|
||||
|
||||
Each task was committed atomically:
|
||||
|
||||
1. **Task 0: 预执行汇报关卡(checkpoint:decision, gate=blocking-human)** - 无提交(纯汇报/只读;用户已在父会话回复「可以执行」并采纳默认处置,见 OI-4..OI-6)
|
||||
2. **Task 1: 新建 bookDetail.tsx(独立详情 UI)** - `04fc4ff` (feat)
|
||||
3. **Task 2: 新建 book.tsx(列表 UI + 最终静态门禁)** - `0f0b277` (feat)
|
||||
|
||||
**Plan metadata:** 见本 SUMMARY 提交
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
- `packages-user/client-modules/src/ui/bookDetail.tsx` - 独立怪物详情 UI(BookDetail/BookDetailUI/BookDetailProps),基础/计算后切换、特殊列表、临界表、左下切换/右下返回
|
||||
- `packages-user/client-modules/src/ui/book.tsx` - 怪物手册列表 UI(Book/BookUI/BookProps),enemyContext 绑定、code 去重、9 项数值、滚动、开详情、右下退出
|
||||
|
||||
## Decisions Made
|
||||
|
||||
- OI-4:数字格式化沿用 `core.formatBigNumber`(as-is,无新等价 API)。
|
||||
- OI-5:命名照准(文件名 `book.tsx`/`bookDetail.tsx`;组件 `Book`/`BookDetail`;GameUI `'book'`/`'book-detail'`;props 接口 `BookProps`/`BookDetailProps`;导出 `BookUI`/`BookDetailUI`)。未向 `src/ui/index.ts` 添加导出。
|
||||
- OI-6:「1 防」以基础属性路径计算——`getIsolatedAttribute()` 取隔离属性并 `add('def',1)`,用 `damage.with(isolated).calculateEnemyCritical(base,'atk',locator)` 与当前 `baseInfo.damage` 求差。
|
||||
- 详情独立(不 import `book.tsx`);列表传 `IEnemyView` 使详情可切换基础/计算后。
|
||||
- 去重时仅收集 `IEnemyView`(`Map<number, IEnemyView>`),避免引入未在 Task 0 呈报的额外命名接口。
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
None - plan executed exactly as written.
|
||||
|
||||
(说明:GSD 执行器规范建议将本计划 `book.tsx` 的空值 TODO 记入跨阶段 `.planning/WINDOWS.md`;但本计划执行约束明确「仅暂存/提交两个新文件 + SUMMARY」,故已回退该账本写入,改为记入下方「Known Stubs」。)
|
||||
|
||||
## Known Stubs
|
||||
|
||||
- `packages-user/client-modules/src/ui/book.tsx:62` — `// TODO: 伤害系统未绑定或已达临界上界时,伤害 / 临界 / 减伤 / 「1 防」留空`。此为**计划明确要求**的优雅降级(`getDamageSystem()` 返回 `null` 或 `next().done === true` 时对应数值留空),非阻碍本计划目标的桩;数据端绑定后自动显示。非本计划范围,无需后续计划解决。
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
None.
|
||||
|
||||
## Threat Flags
|
||||
|
||||
None(仅读取 `props.state.enemyContext` / `props.state.hero`,不写数据端;无新增网络/文件/信任边界)。
|
||||
|
||||
## Next Phase Readiness
|
||||
|
||||
- book 列表与独立详情均已落地并通过静态门禁,位于 `packages-user/client-modules/src/ui/`。
|
||||
- 未接线「如何从地图打开 book」(D-27 明确不在本计划范围);`book.tsx`/`bookDetail.tsx` 未向 `src/ui/index.ts` 添加导出(保持与同 wave 计划互不冲突)。
|
||||
- 若需浏览器/交互层验证,须另行走 UAT(本计划仅静态断言)。
|
||||
|
||||
## Self-Check: PASSED
|
||||
|
||||
- `packages-user/client-modules/src/ui/book.tsx` 存在(9777 bytes)
|
||||
- `packages-user/client-modules/src/ui/bookDetail.tsx` 存在(8670 bytes)
|
||||
- 提交 `04fc4ff`、`0f0b277` 存在于 `refine/data-client`
|
||||
- 计划级验收符号门禁:两文件均通过
|
||||
- CRLF 门禁:两文件均通过
|
||||
- 范围守卫 `git status --porcelain`:无越界改动
|
||||
|
||||
---
|
||||
*Phase: 09-minimum-browser-runnable*
|
||||
*Completed: 2026-10-11*
|
||||
Loading…
Reference in New Issue
Block a user