Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e5eba3122 | ||
|
|
da0c60323a | ||
|
|
1c9f5d36b1 | ||
|
|
b0b8c9ebd0 | ||
|
|
45b53d6897 | ||
|
|
f498d2ec85 | ||
|
|
bf7aa514b6 | ||
|
|
208e5652db | ||
|
|
be7ef54e30 | ||
|
|
c062b62d12 | ||
|
|
b44d3234b8 | ||
|
|
94a05afd49 |
No files matched your search
@@ -1,19 +1,2 @@
|
|||||||
# git 钩子文件必须保持 LF——autocrlf=true 检出会转 CRLF,bash 执行带 \r 的脚本即崩。
|
# git 钩子文件必须保持 LF——autocrlf=true 检出会转 CRLF,bash 执行带 \r 的脚本即崩。
|
||||||
tools/hooks/* text eol=lf
|
tools/hooks/* text eol=lf
|
||||||
# 全仓文本一律 LF 入库与检出——Windows core.autocrlf=true 会把工作区检出成 CRLF,
|
|
||||||
# 行尾一旦进入逐字符比对的字符串基线数据面(如测试内嵌的多行 golden 常量),
|
|
||||||
# 运行时基线(\n)与源码基线(\r\n)逐位比对必红。本规则让一切平台检出落 LF。
|
|
||||||
* text=auto eol=lf
|
|
||||||
# 二进制面显式豁免(防 auto 误判转码损坏素材与基线图)
|
|
||||||
*.png binary
|
|
||||||
*.jpg binary
|
|
||||||
*.jpeg binary
|
|
||||||
*.webp binary
|
|
||||||
*.gif binary
|
|
||||||
*.ico binary
|
|
||||||
*.ogg binary
|
|
||||||
*.wav binary
|
|
||||||
*.mp3 binary
|
|
||||||
*.ttf binary
|
|
||||||
*.otf binary
|
|
||||||
*.zip binary
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# mac 平台 golden 基线生成工作流(workflow_dispatch 手动触发型,2026-11-03)。
|
|
||||||
# 用途:渲染基线按平台各存——mac 基线必须在 Mac 的图形会话里窗口化渲染产出(Windows 基线不可跨平台替代)。
|
|
||||||
# 纪律(Q6):本工作流只「生成」候选基线文件(落在 runner 作业工作区,不提交不入库);
|
|
||||||
# 入库走人工通道:人工目检四张基线(体验验证清单㊾)→ 取回文件显式提交并写明触发原因。
|
|
||||||
# 禁由 CI 自动提交基线(防静默重制掩盖视觉回归)。
|
|
||||||
# 运行形态:runs-on=ci-mac(host 模式,作业活在 ci-runner 图形会话内——窗口可开、截图可用)。
|
|
||||||
name: baseline-mac
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
refresh:
|
|
||||||
runs-on: ci-mac
|
|
||||||
timeout-minutes: 30
|
|
||||||
steps:
|
|
||||||
- name: 检出(纯 shell 克隆)
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ github.token }}
|
|
||||||
run: |
|
|
||||||
git clone -q "https://${TOKEN}@git.kuaimeo.com/${GITHUB_REPOSITORY}.git" "$GITHUB_WORKSPACE/repo"
|
|
||||||
cd "$GITHUB_WORKSPACE/repo" && git log --oneline -1
|
|
||||||
|
|
||||||
- name: 导入缓存刷新
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
/usr/local/bin/godot --headless --path game --editor --quit
|
|
||||||
|
|
||||||
- name: 退出判别实验(quit-after 能否解 macOS 窗口化退出挂死)
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
mkdir -p /tmp/shots_diag
|
|
||||||
/usr/local/bin/godot --path game --quit-after 3000 res://probe/board_shot_probe.tscn -- /tmp/shots_diag
|
|
||||||
echo "diag_rc=$?"
|
|
||||||
ls -la /tmp/shots_diag/ | head -8
|
|
||||||
|
|
||||||
- name: 基线生成(棋盘三图)
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
GODOT_BIN=/usr/local/bin/godot bash tools/golden_baseline_refresh.sh "$GITHUB_WORKSPACE/repo/game"
|
|
||||||
ls -la game/tests/golden/mac/ || true
|
|
||||||
|
|
||||||
- name: 基线生成(菜单全屏)
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
GODOT_BIN=/usr/local/bin/godot bash tools/golden_baseline_refresh.sh "$GITHUB_WORKSPACE/repo/game" --menu
|
|
||||||
ls -la game/tests/golden/mac/ || true
|
|
||||||
|
|
||||||
- name: 基线导出(/Users/Shared 不随作业清理,供人工取回目检)
|
|
||||||
run: |
|
|
||||||
mkdir -p /Users/Shared/baseline_out
|
|
||||||
cp -f "$GITHUB_WORKSPACE/repo/game/tests/golden/mac/"*.png /Users/Shared/baseline_out/
|
|
||||||
chmod 644 /Users/Shared/baseline_out/*
|
|
||||||
ls -la /Users/Shared/baseline_out/
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# 远端 CI 工作流(2026-11-03 用户裁:CI 迁远端 Mac runner,host 模式直跑)。
|
|
||||||
# 触发:master 收到 push(post-merge 钩子合回自动推,或人手推 master)——分支推送不触发
|
|
||||||
# (开发分支不烧远端引擎时长;分支级验证=开发期手动跑批档)。
|
|
||||||
# 跑什么由 tools/ci/domain_route.sh 按改动域分流(乙案)——
|
|
||||||
# 游戏码批=两域全量(含渲染闸);文档批=文档域秒级闸;纯闸件/管线批=闸件自检档
|
|
||||||
# (run_all_gates.sh --gates:不启引擎的机检面+闸壳自检)。
|
|
||||||
# 运行环境:Mac host 模式(tools/ci/mac_setup.sh 自举),GODOT_BIN/GDSTYLE_BIN 由自举件安装到位。
|
|
||||||
# 检出用纯 shell 克隆:host 模式执行 JS 系动作(actions/checkout)需要 node 运行时,
|
|
||||||
# runner 机器无 node——首跑实证「Cannot find: node in PATH」即败(run 4),本仓禁用 JS 系动作,
|
|
||||||
# 引入新 Actions 前必须确认其执行器形态(shell/composite 可,node/docker 不可)。
|
|
||||||
# 闸清单与域划分唯一出处 = tools/run_all_gates.sh(本文件只负责触发与分流,不另列闸件)。
|
|
||||||
name: ci
|
|
||||||
# 手动档:workflow_dispatch(网页 Actions 页「Run workflow」按钮,选 master)=重跑语义②
|
|
||||||
# 「用户自发发起的全量回归」的入口(process-conventions §3 第 9 条)——绕过域分流直跑全量档;
|
|
||||||
# 点击权归用户,agent 自发触发=人手重跑踩线。
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
gates:
|
|
||||||
runs-on: ci-mac
|
|
||||||
timeout-minutes: 90
|
|
||||||
steps:
|
|
||||||
- name: 检出(纯 shell 克隆)
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ github.token }}
|
|
||||||
run: |
|
|
||||||
git clone -q "https://${TOKEN}@git.kuaimeo.com/${GITHUB_REPOSITORY}.git" "$GITHUB_WORKSPACE/repo"
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
git log --oneline -1
|
|
||||||
|
|
||||||
- name: 域分流(乙案)
|
|
||||||
id: route
|
|
||||||
if: github.event_name == 'push'
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
bash tools/ci/domain_route.sh "${{ github.event.before }}" "${{ github.sha }}"
|
|
||||||
|
|
||||||
- name: 导入缓存刷新(闸前置——.godot 不入 git,冷检出一付;gates 档不启引擎,跳过)
|
|
||||||
if: steps.route.outputs.mode != 'skip' && steps.route.outputs.mode != 'gates'
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
# run134 实证:runner 缓存目录部分失效(.import 哈希记录在而 ctex 缺)时增量导入会跳过
|
|
||||||
# 重导、运行期成片资源 ERROR(字体/UI 素材)并污染 system_test 退出码与 golden 比对——
|
|
||||||
# 每批强制全量重导(幂等,代价≈1-2 分钟导入时长)
|
|
||||||
rm -rf game/.godot/imported
|
|
||||||
/usr/local/bin/godot --headless --path game --editor --quit
|
|
||||||
|
|
||||||
- name: 跑闸
|
|
||||||
if: steps.route.outputs.mode != 'skip'
|
|
||||||
env:
|
|
||||||
GODOT_BIN: /usr/local/bin/godot
|
|
||||||
GDSTYLE_BIN: /usr/local/bin/gdstyle
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/repo"
|
|
||||||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
|
||||||
ARGS="" # 手动触发=固定全量档(2026-11-05 用户裁)
|
|
||||||
else
|
|
||||||
MODE="${{ steps.route.outputs.mode }}"
|
|
||||||
case "$MODE" in
|
|
||||||
full) ARGS="" ;;
|
|
||||||
gates) ARGS="--gates" ;;
|
|
||||||
*) ARGS="--docs" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
echo "[ci] 事件=${{ github.event_name }} 跑闸参数=$ARGS"
|
|
||||||
bash tools/run_all_gates.sh $ARGS
|
|
||||||
+9
-5
@@ -1,6 +1,7 @@
|
|||||||
# === Godot 4 ===
|
# === Godot 4 ===
|
||||||
# 编辑器生成的缓存(imported 资源、shader cache、编辑器状态),可由 project.godot 重建
|
# 编辑器生成的缓存(imported 资源、shader cache、编辑器状态),可由 project.godot 重建
|
||||||
.godot/
|
.godot/
|
||||||
|
.zcode/
|
||||||
.zcodeignore
|
.zcodeignore
|
||||||
# Godot 4 的 .uid 文件必须提交,不要忽略
|
# Godot 4 的 .uid 文件必须提交,不要忽略
|
||||||
# 导入元数据
|
# 导入元数据
|
||||||
@@ -41,8 +42,10 @@ Thumbs.db
|
|||||||
*.log
|
*.log
|
||||||
*.tmp
|
*.tmp
|
||||||
.zcode/plans/
|
.zcode/plans/
|
||||||
.zcode/tmp/
|
|
||||||
.workbuddy/memory/
|
# === 非本项目批次产物(2026-10-02 用户裁:入 .gitignore,本地保留不入库)===
|
||||||
|
.qoder/
|
||||||
|
.workbuddy/
|
||||||
|
|
||||||
# === 归档压缩包(2026-09-26 批目录归档产物,本地留存不入库)===
|
# === 归档压缩包(2026-09-26 批目录归档产物,本地留存不入库)===
|
||||||
archive/
|
archive/
|
||||||
@@ -50,9 +53,10 @@ archive/
|
|||||||
# === 在途图像素材(2026-10-02 用户裁:artwork/ 整目录不入库,取消 md 例外——此前文本指引入库留痕的口子关闭)===
|
# === 在途图像素材(2026-10-02 用户裁:artwork/ 整目录不入库,取消 md 例外——此前文本指引入库留痕的口子关闭)===
|
||||||
artwork/
|
artwork/
|
||||||
|
|
||||||
# === 游戏包美术素材(2026-11-03 用户裁:素材回 git,推翻 2026-09-29 不入库裁定——
|
# === 游戏包美术素材(2026-09-29 裁定维持:素材不入 git,运行时资源本地生成不入库)===
|
||||||
# 仓库自包含原则:远端 CI 与任何新克隆必须拉到完整可跑素材)===
|
game/assets/art/**
|
||||||
!game/assets/art/**/*.import
|
!game/assets/art/**/*.md
|
||||||
|
!game/assets/art/**/
|
||||||
|
|
||||||
# === 模拟数据缓存层(2026-10-03 用户裁:sim-data/ 数据件不入库——最新 MC 锚常驻留盘作分析缓存,无数值调整不重跑;同日二裁:README+分析工具三件留库,其余留盘)===
|
# === 模拟数据缓存层(2026-10-03 用户裁:sim-data/ 数据件不入库——最新 MC 锚常驻留盘作分析缓存,无数值调整不重跑;同日二裁:README+分析工具三件留库,其余留盘)===
|
||||||
sim-data/*
|
sim-data/*
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"hooks": {
|
|
||||||
"PreToolUse": [
|
|
||||||
{
|
|
||||||
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash",
|
|
||||||
"hooks": [
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "bash",
|
|
||||||
"args": [
|
|
||||||
"${QODER_PROJECT_DIR}/.zcode/hooks/worktree-guard.sh"
|
|
||||||
],
|
|
||||||
"timeout": 15,
|
|
||||||
"statusMessage": "worktree 铁律守卫(直改/提交拦截;脚本单一事实源在 .zcode)"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
---
|
|
||||||
name: asset-ingest
|
|
||||||
description: g-plan2(Dungeon Sweeper)五段流水线第二段的美术素材录入入口。当用户说素材已过审、把素材录入/入库、终稿放进游戏、补 art-bible 条款时使用。**只录入、不生成任何图像内容**——样张与素材由用户主导在 artwork/ 工作区产出,本技能承接的是用户已过审的素材:核对命名与目录(改名依据=代码消费名)→拷入 game/assets/art/→art-bible 补条款(五要素缺一不可)→美术素材状态清单与待办清单状态同步→命名与目录自检。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# asset-ingest——美术素材录入(g-plan2 五段流水线)
|
|
||||||
|
|
||||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第二段做**美术线的录入半程**。**定性写死:本技能只录入、不生成任何图像内容**——样张与素材由用户主导在 `artwork/` 工作区产出,本技能承接的是**用户已过审的素材**,把它按规范落进游戏与文档。格式权威=`design/engineering/doc-conventions.md` §12.3(美术工作区目录与命名),动笔前先读它。
|
|
||||||
|
|
||||||
## 批性质与共同纪律(先读)
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`;**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。本技能的写面=`design/art/` 两文档+`待办清单.md`+素材拷贝(`game/assets/art/` 与 `artwork/` 均不入 git);**除素材拷贝外禁碰 `game/` 与 `tools/` 的任何代码文件**——素材不入 git,tracked 改动面仍只有文档,--docs 档选档不变。
|
|
||||||
- **车道铁律**:tracked 改动(`design/art/` 两文档+待办清单)走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;素材与 `artwork/` 不入 git,**素材拷贝直接落主工作区 `game/assets/art/`**(游戏实际加载的在盘位置);第 7 步 path_check 以 `--repo` 指主工作区跑。
|
|
||||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(典型=跳过第 2 步命名核对)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
|
||||||
- **禁自援特权**:执行中你自己觉得某步该跳,只能呈报后停,**禁自己援引特批**。
|
|
||||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**。
|
|
||||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
|
||||||
|
|
||||||
## 流程
|
|
||||||
|
|
||||||
### 第 1 步:定位批次与素材
|
|
||||||
|
|
||||||
在 `artwork/<YYYY-MM-DD-主题>/` 批次工作区内定位**用户点名的过审素材与样张**(样张在 `samples/` 子目录)。批次目录不存在、点名素材找不到、或用户没有明示哪些算过审 → 停工呈报,禁自行挑选或代判「这张应该过了」。
|
|
||||||
|
|
||||||
### 第 2 步:核对命名与目录(改名依据=代码消费名)
|
|
||||||
|
|
||||||
1. **命名形态**(doc-conventions §12.3):全小写英文+下划线,禁中文/空格/大写。终稿三段式 `<对象>_<部位或状态>_<规格>.png`;样张 `sample_<屏名>_<版本>.png`。
|
|
||||||
2. **目录走向**:`artwork/` 批次 → 终稿 `game/assets/art/<用途子目录>/`(现行子目录:`board/`、`character/`、`fx/`、`ui/`,见 `design/art/asset-path-map.md`)。**图片永不进 `design/`**。
|
|
||||||
3. **改名依据=代码消费名**:终稿文件名跟代码走,防断链——先在 `game/` 内查 ui_kit/资源路径常量确定消费点名(ui_kit 在 `game/presentation/views/ui_kit.gd`,`TEX_*` 常量即 `res://assets/art/...` 路径;未收进 ui_kit 的查 `design/art/asset-path-map.md` 与代码内 `res://assets/art` 引用)。素材名跟它走。**查不到消费点 → 停工呈报,禁自造名字**;呈报时带解法选项:先走代码实现批定常量,或由用户直接点名文件名(用户点名视同消费名依据,agent 仍不得自拟)。
|
|
||||||
4. 同名迭代直接覆盖,不留 v2 副本(§12.3)。
|
|
||||||
5. 本步经特批可跳(标记规则见批性质;有条目时标记写在待办清单条目状态处,无条目时随会话呈报与 commit 信息落案)。
|
|
||||||
|
|
||||||
### 第 3 步:终稿拷入
|
|
||||||
|
|
||||||
把过审终稿拷入 `game/assets/art/` 对应用途子目录(该目录不入 git,在盘即生效;打包发布方案另有既定口径,与本技能无关)。
|
|
||||||
|
|
||||||
### 第 4 步:art-bible 补条款
|
|
||||||
|
|
||||||
对 `design/art/art-bible.md` 补录条款,**每条条款五要素缺一不可**:
|
|
||||||
|
|
||||||
1. **条款名**;
|
|
||||||
2. **规则句**(一句白话说清规则);
|
|
||||||
3. **像素级判据**(写成可核对的判读句);
|
|
||||||
4. **参考图指针**——只许指入库稳定位置(`design/art/references/`、`asset-path-map.md`),**禁指 `artwork/` 在途散路径**(该目录不入 git 会消失,art-bible §8.3 归档纪律);
|
|
||||||
5. **文首头注版本号递增**(「现行为 vX.Y」同步更新)——禁写版本历史表,改动明细只进 git 提交信息。
|
|
||||||
|
|
||||||
新条款按 art-bible 头注「条款验收标注纪律」标注验收方式(←机检/←目检/←方向性)。
|
|
||||||
|
|
||||||
### 第 5 步:美术素材状态清单同步
|
|
||||||
|
|
||||||
更新 `design/art/art-status-checklist.md`(该文件名已核实,是纯看板:素材名×状态×需求文档指针;注意它与生产规格清单 `art-assets-checklist.md` 是两份文件,本步只动前者):对应素材行状态列改 ✅+一行事实(何时、何批、落点)——做完不删行,改状态。
|
|
||||||
|
|
||||||
### 第 6 步:待办清单状态推进
|
|
||||||
|
|
||||||
按 doc-conventions §12.1 状态机改写条目状态属性(仅在册条目适用;本次会话新录入、清单内无对应事项时本步跳过,禁为录入动作新建条目):
|
|
||||||
|
|
||||||
- **只走美术线**:改「美术设计已闭合(凭据=样张过审、art-bible 条款版本)」,凭据落成实例形态 `美术设计已闭合(样张过审 2026-10-18、art-bible v3.16 §8.2)`——**凭据括号内禁用+号**(+只作状态段连接符;凭据内并列项按 doc-conventions §12.1 用顿号,用+会被流水线闸误判成状态段)。本线全闭合,删除「缺口」属性。
|
|
||||||
- **两条设计线并列**:改两段并列,美术侧闭合、文档侧保持原状态(例:`文档设计已闭合(…v0.6)+美术设计已闭合(…)`)。**「缺口」属性只在两侧全闭合(条目转入 待写卡)时才删**——状态里只要还有待文档设计/文档设计中/待美术设计/美术设计中任一词,缺口属性必须在(流水线闸判据);单侧闭合时保留并改写为剩余线还差什么。
|
|
||||||
- 若第 2 步经特批跳过,标记写在本条目状态处(无条目时随会话呈报与 commit 信息落案)。
|
|
||||||
- 旧格式条目先向用户确认所属设计线与改动面,按 §12.1 补齐格式再写状态(同 doc-design 第 1 步口径)。
|
|
||||||
- 改完顺带跑 `python tools/pipeline_gate.py` 自核本次条目零红(过渡期存量红注明即可)。
|
|
||||||
|
|
||||||
### 第 7 步:命名与目录自检
|
|
||||||
|
|
||||||
两半都做:
|
|
||||||
|
|
||||||
1. **命名形态**:先扫一眼 `tools/` 有无现行命名检查器可引用(截至 2026-10-18 没有——`path_check.py` 管目录与消费链、`standee_asset_check.py` 是内容机检不属此类),没有就按 doc-conventions §12.3 规则逐文件核对(三段式/全小写/下划线/用途子目录/无 v2 副本)。
|
|
||||||
2. **目录与消费链**:跑 `python tools/path_check.py --repo <主工作区>`(路径核对器:声明路径存在性+代码 `res://assets/art` 引用与盘上文件互核)——拷完必跑。注意它查的是「代码引用的文件在不在」,**不查「盘上多余文件的名字对不对」**:命名核对若被特批跳过,本步结论必须如实注明「命名形态未检」,禁让 path_check 绿顶替命名核对。
|
|
||||||
|
|
||||||
**美术内容不做机检**:`tools/standee_asset_check.py` 等内容级检查器(档高/色数/描边)不属本技能,禁在本流程内跑。
|
|
||||||
|
|
||||||
### 收尾
|
|
||||||
|
|
||||||
`python tools/run_all_gates.sh --docs`(文档域闸),全绿合并回 master。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- **禁生成、禁改图、禁代画**:素材内容层面的一切意见(好不好看、要不要改)只能呈报给用户,本技能零处置权。
|
|
||||||
- 平实简体中文,禁自造黑话;流水线词汇按 doc-conventions §12 用法一致使用。
|
|
||||||
- 本技能不写需求卡片、不编迭代、不碰代码——代码消费常量的**新增/改名**属代码实现批的活,只能呈报留给下游,禁顺手改 `ui_kit.gd`。
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
---
|
|
||||||
name: batch-closure
|
|
||||||
description: g-plan2(Dungeon Sweeper)批后收尾与中间文档退役入口。当用户说「迭代 N 收尾/批后收尾/落完反哺点收个尾」「清理中间文档/清理暂存地」「把某份报告退役」时使用。做两类事:①iter 批后收尾——反哺点落文凭据核对(落文本身委托 doc-design,本技能禁代写)、reports/ 产出物(实现报告/反哺点清单/验收审计报告)退役判据核对与删除、待办清单条目整条删除、roadmap 迭代行与顶部「当前位」三行换代;②中间文档退役——中间文档唯一暂存地 `reports/`(需求卡片/迭代产出物/提案/审计/需求澄清过程稿)按「吸收即死」判据核对后删除(需求卡片死期=所属迭代实现批合回 master)。规则权威=doc-conventions §11+concept-conventions §2,本技能只做执行编排、不复写规则;与 doc-consistency-check 分工=那边定期体检只读只报、这边被点名后执行清理。工程/文档改动批(直改类):可写 design/ 与 roadmap.md,收尾跑 --docs 文档域闸。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# batch-closure——批后收尾与中间文档退役(g-plan2)
|
|
||||||
|
|
||||||
你做的是批次结束后的清库工作:把已完成批次留下的中间文档,按「吸收即死」(规则权威=`design/engineering/doc-conventions.md` §11,删除手法=`design/engineering/concept-conventions.md` 第 2 节删除概念 SOP)退役掉,并随手把账面(roadmap、待办清单)换到与现实一致。**本技能只做执行编排,禁在本文件复写或改判规则**——判据与本文件冲突时以 §11/§12 现行文本为准,并停工呈报。
|
|
||||||
|
|
||||||
## 职责边界(先读)
|
|
||||||
|
|
||||||
- **反哺落文不归本技能**:把反哺点写进 GDD/art-bible 走 doc-design 技能(其「反哺点写入模式」触发)。本技能只核对落文结果(待办清单反哺点专条状态=已写入+落点+版本号),核对不过就把落文委托给 doc-design(唯一出口,落文完成后接着收尾),**禁代写落文**。
|
|
||||||
- **只报不删的体检不归本技能**:doc-consistency-check 定期体检只读、只呈报问题;本技能是执行臂——用户点名(含体检报出后点名)才动手删。
|
|
||||||
- **触发词分界**:「落反哺点/处理反哺点清单/反哺点裁决写入」=doc-design;「收尾/清理中间文档/清理暂存地/退役××文档」=本技能。
|
|
||||||
|
|
||||||
## 批性质与共同纪律
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(账面换代正是本批产出);禁跑 `tools/run_all_gates.sh` 全量档(不带参数)与任何游戏测试、MC 跑批;收尾=手动跑 `--docs`(文档域覆盖 `game/` 内 `.md`、design/、根规则文件、reports/、tools/、.zcode/ 等一切非代码面改动),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。
|
|
||||||
- **车道铁律**:reports/ 产出物与账面换代(roadmap/待办清单)都是 tracked 文件——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;迭代批自身的 worktree 收口动作(merge+remove)照旧;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。
|
|
||||||
- **删除三步强制**:先 grep 引用面 → 改写指路句(改法=结论内联或换 git 提交号)→ 再删文件;收尾死链检查必须绿(`tools/doc_link_audit.py`,随 --docs 跑)。
|
|
||||||
- **判据不过禁删**:任一文件的退役判据不过,逐份呈报等用户裁,禁「顺手清掉」;用户明示强行退役才照办,并在提交信息记 `〔用户特批 YYYY-MM-DD 退役××〕`(标记须带日期,doc-conventions §12.4)。本技能无特权,禁自答放行。
|
|
||||||
- 白话写作(doc-conventions §2)与流水线词汇(§12)全程生效。
|
|
||||||
|
|
||||||
## 主流程 A:iter 批后收尾
|
|
||||||
|
|
||||||
触发:用户说「迭代 N 收尾/批后收尾/落完反哺点了收个尾」。
|
|
||||||
|
|
||||||
### 第 1 步:盘点该迭代的在飞面
|
|
||||||
|
|
||||||
1. 读 `roadmap.md` 迭代 N 行(状态列应已是或应改为「已完成」)与 `reports/` 下该迭代全部文件(实现报告/反哺点清单/验收审计报告,文件名形如 `iter<N>-*-<日期>.md`)。
|
|
||||||
2. 读待办清单:该迭代各条目(状态应走到「已编迭代 N」)、本迭代产出的反哺点专条。
|
|
||||||
3. **前置核对反哺点是否已落文**:反哺点清单还在且待办清单对应专条未到「已写入(落点+版本)」→ 直接转 doc-design 反哺模式把落文办完,再接着收尾;用户明示本批暂不落文的,反哺点清单保留、只清其余件,呈报里写明这个例外。
|
|
||||||
|
|
||||||
### 第 2 步:逐份过退役判据
|
|
||||||
|
|
||||||
| 文件 | 退役判据 | 不过怎么办 |
|
|
||||||
|---|---|---|
|
|
||||||
| `iter<N>-反哺点-*.md` | 已随落文退役(doc-design 第 5 步),或全部条目已落文(待办清单专条=已写入+落点+版本号) | 第 1 步已拦,委托 doc-design |
|
|
||||||
| `iter<N>-实现报告-*.md` | 遗留读数义务逐条已迁(体验验证清单或待办清单在册);实机目检项已登记体验验证清单 | 未决先迁再死:先迁待办清单/体验验证清单再退役 |
|
|
||||||
| `iter<N>-验收审计-*.md` | 审计结论已并入实现报告、无未决项 | 未决项先迁再死:先迁待办清单/实现报告再退役 |
|
|
||||||
|
|
||||||
更旧迭代(M<N)在 `reports/` 的残留件,同表过判据后随本批一并清——「证据只留最新」(§11):新证据落位后旧份同批退役。
|
|
||||||
|
|
||||||
### 第 3 步:引用面改写
|
|
||||||
|
|
||||||
对每份待删文件:grep 文件名于 `design/`+`roadmap.md`+`AGENTS.md`,把指路句改写为结论内联或 git 提交号。roadmap 迭代 N 行实现报告列同步改「已退役(git 历史可考)」(doc-conventions §12.2 保留字)。
|
|
||||||
|
|
||||||
### 第 4 步:删除与账面换代
|
|
||||||
|
|
||||||
1. 删除判据全过的文件。
|
|
||||||
2. 待办清单账面:该迭代条目「完成即整条删除」;已写入的反哺点专条整条删除(两者均 §12.1 状态机出口)。
|
|
||||||
3. roadmap 账面:迭代 N 行状态列改「已完成(YYYY-MM-DD)」;顶部「当前位」三行(阶段/迭代位/下一步)换代——只回答「现在该做什么」,禁扩写成状态快照(doc-conventions §10)。
|
|
||||||
|
|
||||||
### 第 5 步:收尾闸
|
|
||||||
|
|
||||||
`python tools/run_all_gates.sh --docs` 全绿 → 按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
|
||||||
|
|
||||||
## 主流程 B:中间文档退役(单份或批量)
|
|
||||||
|
|
||||||
触发:用户点名某份中间文档要退役,或说「清理暂存地」。
|
|
||||||
|
|
||||||
1. **候选呈报**:点名=直接核该份;「清理暂存地」=扫 `reports/`(中间文档唯一暂存地:需求卡片、迭代产出物、提案/审计/需求澄清/评估过程稿;入内文件默认到期即死,需求卡片死期=所属迭代实现批合回 master),按「结论已吸收?未决已迁?」初筛,呈候选清单等用户点名后才动手。
|
|
||||||
- **`design/` 下禁止过程件目录**(`design/research/` 已于 2026-10-21 退役,熵增闸退役路径清单收它,目录再现即判红):扫到落在 `design/` 里的提案/审计/调研/需求澄清稿即属违规件,呈报迁 `reports/`;文件自称「常驻/已追认/不受吸收即死约束」一律无效,确实要长期留用的退役内容只走 `design/content-archive/` 转正一条路。
|
|
||||||
- **根目录 `playnote.md` 不入候选清单**:它是用户本人试玩随手记,只由用户增删,不属任何文档族、不受吸收即死管辖。
|
|
||||||
2. **判据核对(逐份)**:结论已被权威文档吸收(GDD 对应节/art-bible/架构文档/术语表 grep 得到);未决内容已迁待办清单或 roadmap 卡;证据类另核「证据只留最新」。既没被吸收又不肯迁出的,只有「转正迁 `design/content-archive/`」与「呈用户裁决」两条出口,禁原地自封常驻。
|
|
||||||
- **需求卡片特殊**:`reports/` 下的需求卡片须另核 roadmap 行——行内已填「已退役(git 历史可考)」或卡片已被新版替代才可退役,迭代仍引用的卡片禁删。
|
|
||||||
3. 未吸收 → 呈报建议落点(落文走 doc-design 或用户直裁),禁先删;判据过 → 引用面改写 → 删 → 死链检查绿。
|
|
||||||
4. 收尾闸 `--docs` 全绿 → 按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实简体中文,禁自造黑话;吸收即死/退役/未决先迁再死/证据只留最新等词按 doc-conventions §11 用法一致使用。
|
|
||||||
- 删除是不可逆动作:同批删除清单在呈报里逐份列名,用户看得见每一份才动手。
|
|
||||||
- 本技能不写需求卡片、不做设计讨论、不碰代码——上游各归其段:落文=doc-design,体检=doc-consistency-check。
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
---
|
|
||||||
name: doc-consistency-check
|
|
||||||
description: g-plan2(Dungeon Sweeper)仓库的文档一致性定期检查固定流程:四个脚本自动检查(GDD 格式规则/死链/退役术语/目录结构)加六项人工核对(数值三处同步、根索引与文档树同步、待办清单现状、当前位与现实一致、会话状态文件复发检查、待办清单闭合凭据的版本号落后)。只读检查、只呈报问题不修改、不运行任何游戏测试。当用户要求做文档一致性检查、文档体检,或定时任务触发文档检查时使用。
|
|
||||||
---
|
|
||||||
|
|
||||||
# 文档一致性检查(g-plan2 定期检查流程)
|
|
||||||
|
|
||||||
## 这是什么、为什么需要
|
|
||||||
|
|
||||||
g-plan2 的每个开发批次出口都带文档脚本检查,但脚本抓不住"该改的正文没改"这类失同步。真实先例:敌人系统.md 的护甲列写的是旧口径,与数值表不一致,拖到 2026-10-05 才在批次里补掉;更早的 2026-09-17 数值压缩批只改了数据表,GDD 正文表格、registry、待办清单三处都没同步(该登记处于 2026-10-19 注销)。
|
|
||||||
|
|
||||||
本流程把文档一致性检查固化成固定步骤,定期把仓库文档整体对一遍。**只负责找出问题,不负责修复**——修复由用户决定,走正常批次流程(独立 worktree 分支)。
|
|
||||||
|
|
||||||
## 硬约束(先读完再动手)
|
|
||||||
|
|
||||||
1. **全程只读**:不修改任何文件、不创建任何文件、不提交、不合并、不切分支。
|
|
||||||
2. **禁跑游戏测试**:冒烟测试、单元测试、MC 模拟、场景探针一律不跑(本项目"测试执行两入口铁规")。本流程只允许运行下面列出的四个文档审计脚本,它们只扫文档、不启动游戏。
|
|
||||||
3. **检查范围 = 主工作区(master 检出)**:并行开发中 worktree 里的改动还没合并进 master,不作为判读依据。先跑 `git worktree list` 知悉当前在飞的批次,避免把"worktree 已改、master 未合"误报成失同步。
|
|
||||||
4. **所有命令从仓库根目录运行**(含 project.godot 的那一层)——审计脚本按相对路径找 design/gdd/,从别的目录运行会静默报"扫描域为空",看起来像通过其实是没扫到。
|
|
||||||
|
|
||||||
## 检查清单
|
|
||||||
|
|
||||||
### 第一组:脚本自动检查(四件)
|
|
||||||
|
|
||||||
从仓库根目录逐个运行,读输出:
|
|
||||||
|
|
||||||
| # | 命令 | 查什么 |
|
|
||||||
|---|---|---|
|
|
||||||
| 1 | `python tools/gdd_lint.py` | GDD 格式规则(散文段落长度、变更记录节禁设、计数词一致等);另 `--changelog-only` 档扫全 design/ 树拦版本历史/修订记录类节 |
|
|
||||||
| 2 | `python tools/doc_link_audit.py` | markdown 链接与反引号路径引用的死链 |
|
|
||||||
| 3 | `python tools/doc_term_audit.py` | 已退役术语在正文的残留。工具把命中分两类:输出里标"疑似现行"的需人工看一遍,"留档类"(带日期/退役信号或在版本历史节里)默认忽略 |
|
|
||||||
| 4 | `python tools/repo_structure_audit.py` | 顶层目录白名单、根文件白名单、图像白名单、退役路径四查 |
|
|
||||||
|
|
||||||
**判读口径 = 只报新增**:先找最近一份批次出口报告(`reports/` 下按日期最新的 `iter<N>-实现报告`,其"闸绿记录"节记有当次各项存量数),与本次输出对比。与存量持平 = 通过;多出来的命中逐条人工看。找不到近期出口报告时,全部命中逐条人工看。
|
|
||||||
|
|
||||||
### 第二组:人工核对(六件)
|
|
||||||
|
|
||||||
5. **数值三处同步**:先跑 `git log --oneline --since="7 days ago" -- game/data/tables design/gdd` 找近期的数值变更提交;对每一次 .tres 数值行变更,核对其对应的 GDD 正文表格、`data/tables/` schema 校验域、`待办清单.md` 现状描述这三处是否同步(doc-conventions 第 5 节强制收口条款:三处任一未更新,该变更就不算完成)。7 天内没有数值变更提交,就记录"本项跳过"。
|
|
||||||
6. **根索引与文档树同步**:列出 `design/gdd/` 与 `design/gdd/systems/` 各子目录下实际的 .md 文件,对照 `design/gdd/02-系统清单.md` 的导航条目——文档增删必须同步根索引(AGENTS.md Project Layout 规则),新增或删除了文档而索引没跟上就是失同步。
|
|
||||||
7. **待办清单现状**:对照 git log 最近合并进 master 的批次提交与 roadmap.md 里的落地标注,检查待办清单.md 里相关条目的状态是否已刷新;条目还写着进行中、但对应批次实际已合并的,报滞后。
|
|
||||||
8. **当前位与现实一致**:`roadmap.md` 顶部「当前位」三行所述的阶段与迭代位,对照 `git log --oneline -10` 的近期合入与本文迭代总表末行;「当前位」写出三行以上、或待办清单里条目状态与近期已合并批次矛盾,都报滞后。
|
|
||||||
9. **状态文件复发检查**:仓库根出现 `active.md` 或任何同类会话状态文件、任何文档里重新长出「当前状态快照」节,一律报(2026-10-18 用户裁废除,见 doc-conventions 第 10 节)。只报不修。
|
|
||||||
10. **闭合凭据的版本号落后**:待办清单条目状态行里的「文档设计已闭合(design/gdd/xxx.md v1.2)」「美术设计已闭合(样张过审、art-bible v3.x)」这类凭据,括号里的版本号记的是**被引文档当时的现行版**。08c 流水线闸只校验凭据在场与形态、不校验它是否仍是现行版,所以要人工比对:先 `grep -oE "([^)]*v[0-9]+\.[0-9]+[^)]*)" 待办清单.md` 抓出全部带版本凭据(2026-10-18 实测 12 处),再对每个被引文档取现行版——看文首状态行/头注的「现行为 vX.Y」(版本历史表已于 2026-10-19 禁设,文档内不再逐版登记);凭据里的文档名常是裸名甚至省略 `.md`(如「元进度.md v1.0」「art-bible v3.15」),要按名字在 `design/gdd/`、`design/art/` 树下定位。不等即报「凭据指向旧版」,含义是这条设计闭合判据所依据的文档已被后续批次超越,闭合是否仍成立要重看。只报不修。(前身是 `tools/loop_dashboard.py` 的失效面检测器,它比对的是体验验证清单头部「当前批次来源」行;那一行在后续改版中已不存在,所以本件按现存格式重立到待办清单凭据面上,工具本身 2026-10-18 删除。)
|
|
||||||
|
|
||||||
## 产出格式
|
|
||||||
|
|
||||||
报告直接写在对话输出里,不落盘成文件。
|
|
||||||
|
|
||||||
- **全部通过**:一句话,例如"文档一致性检查完成:脚本检查四件与人工核对四件全部通过,与最近出口报告的基线持平"。
|
|
||||||
- **有问题**:逐条列出,每条包含四样——哪份文档哪个位置、与什么不一致、证据(文件:行号)、建议修法(一句话)。按误导程度排序:会误导读者或后续开发的失同步 > 滞后未刷新 > 格式类。
|
|
||||||
- **拿不准的**:单独列"存疑"一节,写清为什么拿不准,不下结论、也不当问题报。
|
|
||||||
|
|
||||||
## 边界
|
|
||||||
|
|
||||||
- 不检查 `reports/` 里中间文档的内容质量——`reports/` 是中间文档唯一暂存地(`design/research/` 已于 2026-10-21 退役),文件寿命到处理完毕为止;验证取证照旧不进 `design/`。
|
|
||||||
- 不修改 `design/gdd/术语表.md` 的登记(修订登记是拥有该概念的文档所在批次的职责),只核对它与其他文档是否一致。
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
---
|
|
||||||
name: doc-design
|
|
||||||
description: g-plan2(Dungeon Sweeper)五段流水线第二段的文档设计入口。当用户要求做某事项的文档设计、发起系统设计讨论、把设计定稿写进 GDD、或要求处理迭代反哺点清单(落反哺点/反哺点裁决写入)时使用。流程:从待办清单取条目校验所属设计线与状态→用户主导的设计讨论(待裁点全案并列、禁代裁)→待裁点清零+用户点头后定稿写入 GDD→待办清单状态推进「文档设计已闭合」→跑流水线闸。兼任反哺点写入与 design/engineering/ 规约类文档修订。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# doc-design——文档设计段入口(g-plan2 五段流水线)
|
|
||||||
|
|
||||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第二段做**文档线**设计:把一件登记在册的事,经用户主导的设计讨论,定稿成 GDD 文档(或 design/engineering/ 规约修订)。条目格式与状态机权威=`design/engineering/doc-conventions.md` §12,动笔前先读它。
|
|
||||||
|
|
||||||
## 批性质与共同纪律(先读)
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(这正是本批产出);**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证(文档批=文档域秒级闸),结果不等待、不落地,随时用 `tools/ci_check.sh <合并提交>` 现查(合回零等待,process-conventions §1 第 3 条)。tracked 改动默认只许落在 `design/` 与 `roadmap.md`;规约修订批(用户发令改流程规约时)写面可含 `AGENTS.md`、`design/engineering/` 规约与 `tools/` 闸件,按批列明写面,闸仍跑 `--docs`。
|
|
||||||
- **车道铁律**:本技能写面全是 tracked 文档面——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。触及代码面(`game/` 下非 `.md`)的改动不属本技能面。
|
|
||||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(如跳过设计讨论直接落定稿)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
|
||||||
- **禁自援特权**:执行中你自己觉得某步该跳,只能呈报后停,**禁自己援引特批**。
|
|
||||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**。pipeline_gate 注册进 run_all_gates 文档域归数据整改批,此前 --docs 的回执不含它,属正常。
|
|
||||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
|
||||||
|
|
||||||
## 主流程(文档线设计)
|
|
||||||
|
|
||||||
### 第 1 步:取条目并校验
|
|
||||||
|
|
||||||
1. **判来源**:用户点名某条在册事项 → 从 `待办清单.md` 取该条目,取不到就回报「清单内无此事项」并停,禁自造条目凑流程;本次会话新提出的事项 → 无条目直接进第 2 步(条目记的是进度,不是讨论的开工前置)。
|
|
||||||
2. 校验两件事:
|
|
||||||
- **所属设计线**:状态行含文档线段(待文档设计/文档设计中/文档设计已闭合)。
|
|
||||||
- **状态**:为「待文档设计」或「文档设计中」。
|
|
||||||
3. 状态不对 → **停工呈报,禁硬做**。典型:已闭合(设计已完,重开须用户明示并说明理由);需求性工程条目(状态整行无设计线段,走 req-card)或直改类条目(状态=待执行,不走写卡);已写卡/已编迭代(下游已动,改动=回退流程,归用户裁)。
|
|
||||||
4. 条目是旧格式存量(标题缺登记元数据)→ 先向用户确认其来源与所属设计线、改动面,再按 doc-conventions §12.1 模板补齐标题元数据与四属性(实况/缺口/改动面/状态)(这属「本次操作对象格式合规」动作),然后回到第 2 步校验。确认中若答案已注定校验不过(如状态整行无设计线段=需求性工程条目或直改类条目),直接停工呈报,禁补格式硬做。
|
|
||||||
|
|
||||||
### 第 2 步:设计讨论(用户主导)
|
|
||||||
|
|
||||||
1. **开题先用一句 ≤50 字大白话概览**:这个系统/事项是什么、为什么现在做。
|
|
||||||
2. **先高抽象后具体**:方向、骨架、边界未定前,禁铺具体条目(数值表、条目清单、字段细节都是具体层)。
|
|
||||||
3. **每个待裁点呈全部备选方案与代价**,禁代裁——设计权归用户。零待裁点也要向用户报明「本讨论零待裁点」,同样等用户点头。
|
|
||||||
4. 讨论中冒出的新待裁点随时入册(记在会话内呈报的待裁点清册,不写进 GDD 正文——doc-conventions §5:正文只写现行规则)。
|
|
||||||
5. 会话内进行、禁无监管自跑(process-conventions §2 段铁律)。
|
|
||||||
|
|
||||||
### 第 3 步:闭合与写入 GDD
|
|
||||||
|
|
||||||
闭合判据=**待裁点清零+用户点头**,二者缺一不可;带未裁点的产出是讨论稿,禁写入。闭合后才动笔:
|
|
||||||
|
|
||||||
1. 定稿写入 GDD 系统文档(`design/gdd/systems/<域>/<系统>.md`),骨架按 doc-conventions §6 系统文档骨架(文首引言/设计目的/系统范围/核心循环位置/核心规则/依赖与输出/P0 与后置/调参表/验收标准/待办指路存根)。
|
|
||||||
2. **新系统**同步根索引 `design/gdd/02-系统清单.md`(文档增删必须同步根索引,doc-conventions §5)。
|
|
||||||
3. **新数值**进 `game/data/tables/*.tres`,且 owner GDD 正文表格同步;涉术语规范名时同步 `design/gdd/术语表.md`——三处之一未更新即视为变更未完成(doc-conventions §5 数值纪律)。
|
|
||||||
4. **文首状态行版本号递增**(「现行为 vX.Y」)——禁写版本历史表,改动明细只进 git 提交信息(doc-conventions §5 禁写变更记录、gdd_lint R4 拦截)。
|
|
||||||
5. **画面类需求另出预览图(2026-11-05 立)**:触碰画面呈现规格的需求(新增画面要素/布局/配色/动效),定稿写入前先出目标画面的 HTML/SVG 效果图(diagram-design 通道),经用户人审通过才算本线闭合;预览图内嵌对应 ux/ 规格文档并随附像素级视觉判据句(process-conventions §7 第 2 条同款写法)——写卡段引它、实现批基线冻结时用户对照它(test-conventions §8.2)。缺陷修复以现行规格与在库基线为准,不触发新预览。
|
|
||||||
|
|
||||||
### 第 4 步:待办清单状态推进
|
|
||||||
|
|
||||||
按 doc-conventions §12.1 状态机改写条目状态属性:
|
|
||||||
|
|
||||||
- **只走文档线**:改「文档设计已闭合(凭据=文档路径+版本号,例:`design/gdd/systems/排雷循环/排雷玩法.md v1.3`)」,并删除「缺口」属性(本线全闭合,状态里已无未闭合态词)。
|
|
||||||
- **文档线与美术线并列**:改两段并列,文档侧闭合、美术侧保持原状态(例:`文档设计已闭合(…v0.6)+美术设计中`)。**「缺口」属性此步保留**,改写为美术侧还差什么——状态里只要还有 待美术设计/待文档设计 等未闭合态词,缺口属性就必须在(流水线闸判据:四态必须有缺口、其余状态不得有);待美术侧也闭合、条目转入 待写卡 时才删。
|
|
||||||
- **「已闭合」不带凭据不算合法状态词**。
|
|
||||||
- 若经特批跳过本段某步,标记写在本条目状态处。
|
|
||||||
|
|
||||||
### 第 5 步:跑流水线闸
|
|
||||||
|
|
||||||
`python tools/pipeline_gate.py`,核对与本次条目相关的判据零红。过渡期存量红注明即可(见批性质);**本次操作对象自身的格式必须合规**,对象自身有红就改到绿再收尾。
|
|
||||||
|
|
||||||
### 收尾
|
|
||||||
|
|
||||||
`python tools/run_all_gates.sh --docs`(文档域闸),全绿后按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
|
||||||
|
|
||||||
## 反哺点写入模式(同技能第二触发)
|
|
||||||
|
|
||||||
本技能两个入口:用户说「做文档设计/系统设计讨论/定稿进 GDD」走上面的主流程;用户说「落反哺点/处理反哺点清单/反哺点裁决写入」**直接走本节,不进主流程**(反哺点专条走的是另一套状态词,主流程第 1 步对它必然停工)。本节流程:
|
|
||||||
|
|
||||||
1. 读 `reports/iter<N>-反哺点-<日期>.md`(反哺点清单由实现批产出,每条写明哪个文件哪一节、改成什么、依据是什么)。
|
|
||||||
2. **逐条呈用户裁决**。**禁未裁决直接写入**——清单写着什么改法不等于已裁决。
|
|
||||||
3. 裁决通过的,写入对应 GDD/art-bible 章节(写入纪律同第 4 步:文首状态行版本号递增、禁写版本历史表、数值三处同步)。
|
|
||||||
4. 待办清单对应反哺点专条(状态取待裁决/已写入)状态改「已写入(落点=文档+版本)」,落成实例形态 `已写入(design/gdd/systems/…/xxx.md v1.4)`——凭据须为真实文档路径+版本号(流水线闸判据)。
|
|
||||||
5. 清单条目按「吸收即死」退役(doc-conventions §11):全部条目落文后核对引用面、改写指路句,再退役清单文件(实现报告内的清单按「证据只留最新」口径随批退役)。
|
|
||||||
|
|
||||||
## 兼任范围注记
|
|
||||||
|
|
||||||
`design/engineering/` 规约类文档(process-conventions / doc-conventions / code-conventions 等)的修订也走本技能:同样经用户主导讨论、待裁点清零+用户点头后才落笔,落笔后按对应文档自身的版本/头注惯例记录修订。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实简体中文,禁自造黑话;流水线词汇(登记/文档设计/美术设计/改动面/特批标记/流水线闸/需求性工程条目/待执行/已写卡/已编迭代)按 doc-conventions §12 用法一致使用。
|
|
||||||
- 白话写作规则(doc-conventions §2)与表达分工(§3)对写入 GDD 的内容全程生效。
|
|
||||||
- 本技能不写需求卡片、不编迭代、不碰代码——下游各归其段:写卡=req-card,编排=iter-plan。
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
---
|
|
||||||
name: iter-plan
|
|
||||||
description: g-plan2(Dungeon Sweeper)五段流水线第四段的迭代编排入口。当用户要求编排迭代、把卡片编入迭代、凑一个迭代、开新一轮迭代、做迭代规划时使用。流程:扫待办清单「已写卡」条目呈编排候选清单→用户点名卡与迭代号→编排五查(卡片存在/设计闭合凭据齐/估时与冻结线/复核记录在位/写完 roadmap 行跑流水线闸确认绿)→写 roadmap 迭代总表一行六列→待办清单状态推进「已编迭代 N」→呈报编排结果。本技能不动卡片内容、不写实现报告,发现卡片问题呈报退回写卡段。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# iter-plan——迭代编排段入口(g-plan2 五段流水线)
|
|
||||||
|
|
||||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第四段做编排:把用户点名的已写卡需求卡片编进 roadmap 迭代总表一行。格式权威=`design/engineering/doc-conventions.md` §12.2(roadmap 迭代行六列),动笔前先读它。本技能**不动卡片内容、不写实现报告**——发现卡片有问题,呈报退回写卡段(req-card),禁代修。
|
|
||||||
|
|
||||||
## 批性质与共同纪律(先读)
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(本批产出=roadmap 迭代行+待办清单状态);**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。
|
|
||||||
- **车道铁律**:本技能写面(roadmap 行+待办清单状态)全是 tracked 文件——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。
|
|
||||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(典型=带未裁凭据硬编入)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
|
||||||
- **禁自援特权**:执行中你自己觉得某步该跳(如觉得某卡凭据「显然没问题」),只能呈报后停,**禁自己援引特批**。
|
|
||||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**(本次写入的迭代行与改写状态的条目,必须按 §12 新格式写)。
|
|
||||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
|
||||||
|
|
||||||
## 流程
|
|
||||||
|
|
||||||
### 第 1 步:扫候选并呈报
|
|
||||||
|
|
||||||
扫 `待办清单.md` 中状态为「已写卡」的条目,逐条打开其状态里登记的卡片文件读取估时,呈报**编排候选清单**,一行一条:
|
|
||||||
|
|
||||||
- 条目名 / 卡片路径 / 估时 / 设计闭合凭据(文档线/美术线各报各的;无设计线段条目报实况里的证据指认)。
|
|
||||||
|
|
||||||
旧格式条目状态词不属新状态机(如「待编入」「待排期」)时,先向用户确认其真实状态与卡片路径,按 doc-conventions §12.1 补齐格式(「已写卡」必须在状态里带 `reports/` 卡片路径)再纳入候选——禁凭旧词自行推断状态。
|
|
||||||
|
|
||||||
候选为零时如实呈报「无可编卡」,结束本轮,禁硬凑。
|
|
||||||
|
|
||||||
### 第 2 步:用户点名与迭代号
|
|
||||||
|
|
||||||
1. 用户点名哪些卡进哪个迭代(点名内容=卡+迭代号)。**点名的卡不在第 1 步候选清单(条目状态非「已写卡」)→ 呈报该条不可编入及原因(还停在哪一段),禁编入**;用户坚持「凭据差不多齐了直接编」也只能呈报后停(禁自援特权)。
|
|
||||||
2. **迭代号=roadmap 迭代总表现行最大号+1**(旧格式 roadmap 无总表,从迭代进度等现行记事取最大号);编入已有未完成迭代用其现号,**新开迭代行经用户确认**后才立。
|
|
||||||
3. 需求卡片列格内顺序=执行顺序:用户点名时一并给定就照抄;用户未给序 → 呈建议序(按卡片依赖与估时)请确认后再写。
|
|
||||||
4. 旧格式 roadmap 没有六列迭代总表区时,呈报用户「总表区尚不存在,本次按 §12.2 新立表区再写行」,经确认后立表(这属本次操作对象格式合规动作)。
|
|
||||||
|
|
||||||
### 第 3 步:编排五查(逐卡核,任何一查不过即停)
|
|
||||||
|
|
||||||
1. **卡片文件存在**:状态里登记的路径在盘上真有该文件。缺 → 呈报退回写卡段。
|
|
||||||
2. **设计闭合凭据齐**:文档线段在场则报文档路径+版本号;美术线段在场则报样张过审+art-bible 条款版本;无设计线段条目(状态整行无设计线段)报实况里证据指认在。凭据缺或「已闭合」不带凭据 → 呈报退回对应设计段,禁代补。
|
|
||||||
3. **估时与冻结线**:所选卡估时按区间**中值**求和(单位工作日、写精确值不取整)。**卡片任何工作量均可编入**(2026-10-25 用户立:工作量限制属迭代层、非卡片层——不足 5 天不再拒编);编入后总量 **低于 5 个工作日**=迭代行状态写「冻结待凑批」(不可开工;凑批 ≥5 后由本段改「待开工」,可呈报待编池候选等用户裁);**5–10 个工作日**为常规区间;**超过 10 个工作日**须经用户确认——确认前呈报整批/拆批两案**等用户裁,禁自行拆分或塞入**,确认后在迭代行写带日期的特批标记(roadmap 格,须带日期;对还没有内容的行,先回呈实况、经用户再次确认后才写标记);**超过 20 个工作日**禁止编(硬上限,用户确认也不放行,必须拆批)。
|
|
||||||
4. **复核记录在位(2026-11-05 用户立规)**:逐卡核卡内有「复核记录」节,且该节申报的复核报告文件在 `reports/` 下真实存在。缺节、或申报的报告文件不在盘、或节内任一条发现没有去向标记 → 呈报退回写卡段,禁编入迭代。边界:复核本身是写卡段的义务,本查只核「做没做、记录在不在」——禁本段替卡补记录、禁本段自跑复核、禁把缺记录的卡当旧卡放行。生效=卡片文件名日期 ≥2026-11-06(与 `tools/pipeline_gate.py` 该条卡片判据同口径),更早的卡属历史留档不回头改。
|
|
||||||
5. **流水线闸绿**:roadmap 行写完后跑 `python tools/pipeline_gate.py` 确认绿。过渡期存量红注明即可,**本次操作对象(新写迭代行+被改状态条目)自身零红**,有红改到绿。
|
|
||||||
|
|
||||||
### 第 4 步:写 roadmap 迭代总表一行
|
|
||||||
|
|
||||||
按 doc-conventions §12.2 六列,一行写齐:
|
|
||||||
|
|
||||||
```
|
|
||||||
| 迭代代号 | 状态 | 需求卡片 | 编入时间 | 预计周期 | 实现报告 |
|
|
||||||
```
|
|
||||||
|
|
||||||
- **迭代代号**:写「迭代 N」(N=第 2 步定的号)。
|
|
||||||
- **状态**:待开工。
|
|
||||||
- **需求卡片**:只写文件路径;一格内一行一卡,格内排列顺序=执行顺序。
|
|
||||||
- **编入时间**:当天(YYYY-MM-DD)。
|
|
||||||
- **预计周期**:写所选卡估时中值之和的精确值(不取整),形态「≈N 个工作日」(1 周=5 个工作日);超过 10 个工作日的随带日期特批标记。
|
|
||||||
- **实现报告**:「—」(未完成)。
|
|
||||||
- **行内禁一切事项说明**——卡序叙述、门依赖、读数、裁点记录一概不入行;卡间依赖写在卡片自身。
|
|
||||||
|
|
||||||
### 第 5 步:待办清单状态推进
|
|
||||||
|
|
||||||
状态行按**状态段累积制**书写(doc-conventions §12.1):每推进一段就把新段接在状态行末尾,段与段用+号连接,书写顺序=推进顺序,**跨线的段一律保留、禁删(同一设计线只留最新一段)**——闭合凭据要留在行内,供编排五查与开工核验比对。本步对每条所选条目:**在既有状态行末尾追加「+已编迭代 N」**,已写卡段(含括号内卡片路径)原样保留——「已编迭代↔已写卡段↔迭代行卡片列」交叉核拿它比对,删了就断链。累积形态例:
|
|
||||||
|
|
||||||
`文档设计已闭合(design/gdd/systems/xxx.md v1.2)+已写卡(reports/需求卡片-xxx.md)+已编迭代 31`
|
|
||||||
|
|
||||||
若某卡经特批硬编入,标记写在该条目状态处。
|
|
||||||
|
|
||||||
改完**复跑一次** `python tools/pipeline_gate.py`——交叉核要 roadmap 与待办清单两文件都改完才核得到,以这次结果为呈报口径。
|
|
||||||
|
|
||||||
### 第 6 步:呈报编排结果
|
|
||||||
|
|
||||||
呈报四件:迭代号 / 卡片清单(路径+顺序) / 总估时 / 流水线闸结果(绿/存量红注明)。呈报后停——**编入不等于开工**,实现段由用户以 `/iter <N>` 另行发令(段间不自动流转)。
|
|
||||||
|
|
||||||
## 边界
|
|
||||||
|
|
||||||
- 本技能不动卡片内容:卡片有错、缺验收清单、待裁点未清 → 呈报退回写卡段,禁代修。
|
|
||||||
- 本技能不写实现报告:实现报告是实现批的产出物。
|
|
||||||
- 编排五查是本段全部把关义务,查过即止——禁顺手替实现段做开工检查(那是 iter 技能第 2 步的活)。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实简体中文,禁自造黑话;流水线词汇(登记/文档设计/美术设计/改动面/特批标记/流水线闸/需求性工程条目/待执行/已写卡/已编迭代)按 doc-conventions §12 用法一致使用。
|
|
||||||
- 迭代代号、状态词、列名一律照 §12.2 白名单形态写,禁变体(「迭代 N+」「已编入」等旧口径词退役)。
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
---
|
|
||||||
name: iter
|
|
||||||
description: g-plan2 迭代开工总指挥。当用户输入 /iter <迭代号>、或要求"开迭代N/启动迭代N/发射迭代N/给我迭代N的 goal prompt/开始迭代N的开发"时使用——读 roadmap 迭代行与对应需求卡片,检查开工门与待裁点,按项目既定批次执行模式(U0/worktree/闸序列/停机规则/收口五步)组装开工面并直接开始开发。无参数或只说"/iter"时,呈报当前 roadmap 全部迭代的就绪状态供用户选号。
|
|
||||||
---
|
|
||||||
|
|
||||||
# /iter——迭代开工总指挥(g-plan2 批次执行制)
|
|
||||||
|
|
||||||
你(执行会话)现在就是本迭代的编排者+施工者。用户输入 `/iter <N>` 即 **U0 开工令**——门全解且零待裁点时不要再问"可以开工吗",直接按本流程执行。唯一的合法前置停顿是第 2 步检查不通过。
|
|
||||||
|
|
||||||
> **发射形态(与内置 /goal 的组合)**:/goal 是 harness 内置命令(会话级目标+续跑提醒+完成校验),由用户侧设置。推荐发射形态=`/goal 按 iter 技能执行迭代 <N>,直至总收口全绿`——/goal 提供"不到目标不收工"的机制级驱策与完成校验,本技能提供批次流程。本技能单独调用亦自足(停机/闸纪律已内建),但目标完成校验只有 /goal 能提供。
|
|
||||||
|
|
||||||
> **批性质(2026-10-17 用户立规,最高优先)**:本技能执行的是**代码实现批**。批内**禁写、禁改、禁新增 `design/` 整个目录与根规则文件(`AGENTS.md`/`roadmap.md`)**——那里全是设计文档与规范,对本批**只读**,是写测试与实现代码的输入依据,不是产出物。需要往外交代的东西一律落 `reports/`(实现报告/GDD 反哺点清单,细则见 `reports/README.md`);发现该改文档的点,写进反哺点清单并停机呈报,**不落笔**。2026-10-18 用户裁:根目录会话状态文件已废除,本批不再有任何「例外可写」的文件。2026-10-29 补:`game/tests/README.md`(能力清单)同属禁写面——能力行增删归写卡段(写卡时当场入表,test-conventions §8.3;「最后验证批次」列已废除),本批只读。
|
|
||||||
>
|
|
||||||
> **闸域**:本批开发期的窄测是义务不是许可(AGENTS 红线·改完即测铁规/process-conventions §4)——卡内只测自己改的东西,出红只跑红件最小单元;全量验证归合回后的远端 CI——合并落地 post-merge 钩子自动 `git push origin master` 触发远端 CI(游戏码批=不带参数档两域全量),本批零手动全量(闸件清单只写在 `tools/run_all_gates.sh` 头注一处,本文不重列)。
|
|
||||||
|
|
||||||
## 第 1 步:定位迭代与读卡
|
|
||||||
|
|
||||||
1. 读 `roadmap.md` 主路线表,找到「迭代 <N>」行(注意可能是 `迭代 N` 或 `迭代 N+` 形态;一行可以含多卡,卡号⓪①②③…都在行内)。
|
|
||||||
2. 逐份读行内引用的需求卡片(`reports/需求卡片-*.md`),以**需求卡片最新版**为准;行内描述与需求卡片冲突时,需求卡片优先,冲突本身呈报。
|
|
||||||
3. 无参数调用时:扫全部迭代行,输出一行一迭代的就绪表(迭代号/卡数/估时/门状态/待裁点数),等用户选号,结束本轮。
|
|
||||||
|
|
||||||
## 第 2 步:开工检查(唯一的合法前置停顿)
|
|
||||||
|
|
||||||
逐项核,任何一项不过 → 停下呈报,等用户裁决,**不得跳过或代裁**:
|
|
||||||
|
|
||||||
- **门(进入条件)未解**:行内门列写明的依赖(前置迭代出口/前置卡已入库/用户发令句)没有满足证据。典型:门列含「用户发令(未排期)」「待用户裁定」→ 必须停。
|
|
||||||
- **待裁点 ≠ 0**:需求卡片声明待裁点未全裁,或行内有「待用户裁甲/乙」句。
|
|
||||||
- **迭代估时总量 <5 个工作日**:迭代行状态应处「冻结待凑批」——处待开工/进行中且总量不足即编排缺陷,拒启动并呈报凑批方案(可补卡清单)等用户裁(2026-10-25 两层模型:卡片无工作量门槛,冻结线属迭代层)。
|
|
||||||
- **需求卡片缺失**:行内引用的需求卡片文件不存在或版本明显滞后于行内裁决记录。
|
|
||||||
- **改动—验收对照表缺失或不闭合(2026-10-11 立,2026-10-21 升级)**:需求卡片没有改动—验收对照表,或对照表有空行(无真实入口、无判据绑定面),或 T 卡内无对应验收条目 → 不过,停工呈报。**判定口径:每个需求点至少一行;每行必须有落点、真实入口、判据绑定面**——施工性质的验证工作(如「MC 对账适配」)、完成定义里的笼统验证手段(如「MC 对拍留证」)都不算。禁拿 AGENTS.md「新功能必配新测试」红线代偿——那条只保证写了测试,不保证测得对。2026-10-21 前的旧卡缺对照表 → 停工,退回写卡段补,补完再开工。**判据出处行锚(2026-11-05 起):生效日后(文件名日期不早于该日)的卡,对照表「需求点」格须带 `<现行文档相对路径>:<行号>` 判据出处行锚(机检=pipeline_gate C5)——行缺锚或锚指向不存在=停工呈报退写卡段;旧卡不回头改,开工前由写卡段补挂**(test-conventions §8.3)。
|
|
||||||
- **自洽扫描(轻量,非拷打)**:声明零待裁点≠逻辑无冲突——读卡后快速核三类:①需求卡片内部矛盾(范围/契约/估时/裁决记录互相打架);②需求卡片与 roadmap 行冲突(两处说法不一致);③事实抽查——从需求卡片「现状考证」里抽 3-5 处关键 file:line 到现行代码核对(防需求卡片成文后代码已被其他批改掉,需求卡片变质)。发现疑似冲突 → 逐条列单呈报(哪里矛盾/两种读法各是什么/建议哪边改),**用户裁决后才开工**;零发现则直接通过,不为此拉长开工。全量拷打(/grilling)不在此步做——那是需求卡片成文时的责任,这里只兜网;但**本步必查卡里留没留复核的记录**(见下条),记录不在=上游没跑,停工退写卡段。
|
|
||||||
- **复核记录缺失(2026-11-05 用户立规)**:需求卡片内没有「复核记录」节、或该节申报的复核报告文件在 `reports/` 盘上不存在 → 不过,停工呈报退回写卡段。本步不代跑复核、不代补记录、不把缺记录的卡当旧卡放行;生效=卡片文件名日期 ≥2026-11-06(与 `tools/pipeline_gate.py` 该条卡片判据同口径),更早的卡不回头改。
|
|
||||||
- **真人检测遗留项不算门(2026-10-12 用户立规)**:往期迭代/批次登记未验的实机目检项(体验验证清单/实现报告总清单在册)不构成开工阻塞——开工呈报带一句提醒即可,禁为此停工等验。
|
|
||||||
- **设计闭合核验(2026-10-18 五段流水线立规)**:逐卡核需求卡片的设计事实源声明——独立小节「## 设计事实源」或头部「来源:…(唯一事实源:…)」句,二者得一即合格(**禁按小节名字面判死:库内合规卡多数用后者写法**;全文两词皆无=不过,机检见 `tools/pipeline_gate.py` 判据 C2)——①卡片声明的事实源文件真实存在(相对仓库根);②文档源版本与待办清单对应条目状态里的闭合凭据一致(工程类卡=证据指认与待办清单条目实况一致);③roadmap 迭代行卡片列路径与卡片实际路径一致;④行内预计周期形态合规(「≈N 个工作日」)且量值合规——5–10 个工作日为常规;10–20 个工作日须随带日期特批标记;超过 20 个工作日=缺陷(硬上限,特批不放行);低于 5 个工作日=该行状态必须为「冻结待凑批」,处待开工/进行中即编排缺陷(2026-10-25 两层模型:卡片无门槛、迭代层冻结线)。任一不过 → 停工呈报——这是编排段(iter-plan)缺陷,不是本技能能修的,禁代改卡片或迭代行凑绿。
|
|
||||||
- **执行形态判定(2026-10-22 用户立规)**:读各卡「前置依赖与并行性」节(各卡 §0)定本迭代执行形态——默认=整迭代单工作区、各卡按 roadmap 行卡片列格内顺序串行推进;仅当卡片声明可并行(且互核无同文件交集)时,该卡组走逐卡工作区例外路径(第 4 步)。判定结果在开工呈报里带一句。
|
|
||||||
|
|
||||||
呈报格式:一行一项(哪条不满足/证据在哪/需要用户做什么)。全部通过则宣布「迭代 <N> 开工(U0=本次调用)」进入第 3 步。
|
|
||||||
|
|
||||||
## 第 3 步:T0 开工(主区核对+建迭代工作区)
|
|
||||||
|
|
||||||
1. `git status` 归属核对:主区脏文件分两类——**本迭代定义面**(下条列名文件)与**其他在飞遗产**(其余一切)。除定义面外一律禁碰、禁代提交、禁还原。
|
|
||||||
2. **定义面已入库**(目的:worktree 从旧 HEAD 检出必须看得到定义;后续合并不被脏 roadmap 阻塞):`git add` 仅限 roadmap.md、待办清单.md、本迭代引用的全部需求卡片文件——**指名道姓,禁扫全仓**——单独一笔提交,message=`docs: 迭代<N>定义已入库`。注意:这一步是**搬运别的会话已写好的定义文件**,不是本批撰写文档(批性质禁令照旧生效);该笔单独成提交,别和代码提交混在一起,否则合回后 CI 会把本批 diff 推定跨两域、两域都验。
|
|
||||||
3. **建迭代工作区(整迭代只此一个)**:`git worktree add ../g-plan2-iter<N> -b iter<N>`;冷检出四件套照坑速查执行(拷主区 `game/assets/art/` 与 `*.import` 边车 → `--headless --editor --quit` 刷导入 → `tools/setup_worktree_userdir.sh` 建本区独立 user 目录;闸机 code 域起手自检会自动兜底同步素材与熵增预检——`tools/sync_worktree_assets.sh`,2026-10-30 工程批——四件套照做,脚本兜防漏)。第 4 步各卡都在此工作区内推进;整迭代禁开第二个 worktree(并行例外见第 4 步)。**检出工作区零测试,直接开工**(2026-10-22 频率规则;全量验证归合回后远端 CI——合并落地 post-merge 钩子推送自动跑,T0 不做基线复读,红绿归因由「卡内只测自己改的东西」与闸机基线比对机制承担)。
|
|
||||||
|
|
||||||
|
|
||||||
## 第 4 步:迭代内逐卡推进(单工作区)
|
|
||||||
|
|
||||||
整迭代一个工作区(第 3 步已建),各卡都在其中推进。执行顺序=roadmap 迭代行卡片列格内顺序;卡片「前置依赖与并行性」节声明可并行的卡组走下方例外路径,其余串行。何时该把活分出去见下面「子代理使用口径」。
|
|
||||||
|
|
||||||
1. **读卡施工**:需求卡片 T 卡逐轮推进——读卡→对事实源(file:line 复核)→实装(**验收测试随对应 T 卡同轮落地,禁批末补写**;同轮把实际对照表写进实现报告,测试写文件:行)→本卡验收测试跑绿、读数写进该笔提交(AGENTS 红线·改完即测铁规)→提交(代拍板随 commit 记录)→进度记录→下一轮。**卡内只测自己改的东西**(2026-10-22 频率规则):本卡新增/改动的验收测试自己跑绿、读数写进该笔提交才算这一步完成,没改的不测,轮内不跑闸壳全套。整迭代禁开第二个 worktree。**diff 里没有对照表行的行为改动必须标「非行为改动」或指向覆盖行;禁删断言、放宽阈值、缩小扫描面、把真实入口换成下层直调;判据绑不上可观测提交面=停卡呈报。**
|
|
||||||
2. **卡间依赖**:卡片声明「硬等/前置门」的后续卡,须等前置卡收口 commit 落本迭代分支且该卡验收测试跑绿后才准开 T1——迭代内不再以「合并进 master」为门(整迭代只合并一次,见第 5 步);跨迭代依赖仍由第 2 步开工检查核。
|
|
||||||
3. **并行例外(逐卡工作区,2026-10-22 用户立规)**:仅当卡片「前置依赖与并行性」节声明可并行、且开工检查核过无同文件交集时,该并行卡组按卡各开 worktree(`git worktree add ../g-plan2-<卡名worktree>`,冷检出四件套照坑速查),subagent 并发 ≤3(用户既定上限);并行卡各自收口合并进 master(现行逐卡机制原样保留在此例外路径),不受第 5 步「一次合并」约束。
|
|
||||||
4. **画面类需求的黄金图基线冻结(2026-11-05 立)**:卡触碰画面呈现面的(判据=设计段出了预览图),实现轮把该画面纳入渲染闸机器面——截图采集清单扩项+实跑截图冻结进 `game/tests/golden/`;冻结(新建与换代同口径)前呈用户对照该卡预览图确认一眼,确认后触发原因写进当批提交说明(`tools/golden_baseline_refresh.sh`);此后渲染闸逐像素自动盯、零人工。义务细则=test-conventions §8.2「golden 测试项扩项」;预览图(HTML/SVG 效果图)禁直接充当比对基线。
|
|
||||||
|
|
||||||
### 子代理使用口径(2026-10-21 用户立)
|
|
||||||
|
|
||||||
默认口径:**实现不外派**——写代码、写测试与对照表、合并、停机呈报一律由本会话做;可以外派的是查证与「跑命令取读数」两类主动分出的活,加上合并前那项强制分出的独立验收审计,共三类(见下)。外派出去的活都不改源码、不写实现产出物、不做裁断。并发上限只管数量,这条管范围。
|
|
||||||
|
|
||||||
**可以分出去的三类**(派出前先想清楚要它返回什么,指令里写死返回形态):
|
|
||||||
|
|
||||||
1. **只读考证**——第 2 步自洽扫描的第③项(从需求卡片「现状考证」抽 3-5 处关键 file:line 到现行代码核对)、跨模块找某符号的消费方与改动面。只要它汇报「文件:行 + 一句事实」,禁它改文件、禁它下「因此该怎么改」的结论;冲突判定与裁断仍在本会话。
|
|
||||||
2. **闸跑出红定位**——跑批输出量大,把「跑这条命令 + 报红的用例名与第一条失败断言 + 原样贴出那段读数」分出去,修复与复跑收回本会话。判「是不是本批新增红」以第 3 步基线读数为凭据,不拿子代理的「全绿」转述当凭据。
|
|
||||||
3. **合并前的独立验收审计**——见「独立验收审计」一节,属强制分出,实现者不能自审。
|
|
||||||
|
|
||||||
**不分出去的**:单卡实现轮本身、验收测试与改动—验收对照表的同轮编写、合并动作、停机呈报。原因:这几项依赖对卡片全文与设计事实源的完整理解,且施工铁律写了整迭代单工作区;子代理拿到的是转述,写出来的码无法保证对齐卡片。第 4 条的并发上限与执行形态判定管的是**多张卡怎么排先后、各用哪个工作区**,不是把实现交给子代理——判定为并行时,本会话逐卡开卡、逐卡施工,分出去的仍然只有上面那三类。
|
|
||||||
|
|
||||||
**取回纪律**:子代理的汇报当线索不当证据。凡涉及「跑绿了」「这条断言存在」「文件在这一行」的说法,本会话自己 grep 或自己跑一次才算数——「独立验收审计」一节不采信被审对象自述「已全绿」,正是同一条口径。
|
|
||||||
|
|
||||||
### 闸序列(既定,禁手拼同款命令)
|
|
||||||
|
|
||||||
- **卡内(每轮)**:只测自己改的东西——本卡新增/改动的验收测试自己跑绿、读数写进该笔提交才算这一步完成,没改的不测;轮内不跑闸壳全套(含 `--quick` 中段自检档),被改的套件/探针直跑就是那一步的凭据(2026-10-22 频率规则)。
|
|
||||||
- 调试期出红→只跑出红最小单元确认(单探针/单套件直跑),全套闸只绑批末出口(闸机轮次纪律,AGENTS.md 同源)。
|
|
||||||
- **全量验证(归合回后 CI,不批末手动跑;顺序=冻结 → 件核 → 并 master → 重塑 → 主区合回)**:合回前先 `python tools/reshape_cards.py` 把分支压成一卡一笔(master 台账每卡一行,工具自带树一致断言,详见 process-conventions §1.3);主区 `git merge --no-ff iter<N>` 落地后 post-merge 钩子自动推送 origin master 触发远端 CI 全量(不带参数档),本批零手动全量——`tools/run_all_gates.sh --code` 只在调试期出红后按最小单元复跑时手动用。MC 对拍(**仅当需求卡片要求且涉核心**)仍在批内做。CI 红则新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复提交并主区合回,落地即由 post-merge 钩子复验追绿后删修复区(迭代区已随合回即删),「回执作废」语义已退役。**doc 三闸不在本批**(2026-10-17 起移出——本批不产文档,跑它们只会替别人背红)。
|
|
||||||
- 闸件清单、顺序与域划分只在该脚本里定义——开工时核对脚本头部现行文本,以它为准,本文不重列。
|
|
||||||
- **MC/verifier 跑批发起前必须用户批准**(硬规);需求卡片写「MC 零跑·静态论证」的卡禁发起跑批。
|
|
||||||
|
|
||||||
### 独立验收审计(合并前必做,2026-10-21 立)
|
|
||||||
|
|
||||||
由没参与实现的子代理,或用户点名的另一会话执行;只读需求卡片、实现报告里的实际对照表、本批 diff、测试文件和闸回执,不采信报告里的「已全绿」。单工作区口径(2026-10-22 起)下在迭代总收口、合并前执行一次,审计范围覆盖本迭代全部卡的 diff、对照表与验收断言。至少做三件事:
|
|
||||||
|
|
||||||
1. 逐行核对对照表:测试存在、尾缀能 grep 到、真实入口没有绕过改动点;
|
|
||||||
2. 抽查验收断言:每张 T 卡至少一条,核对断言在当轮真实跑批中执行且通过(闸回执与测试输出为凭);
|
|
||||||
3. 检查测试削弱:删除断言、放宽阈值、缩小扫描面、换下层直调,逐处要卡片申报或用户批准。
|
|
||||||
|
|
||||||
**审计深度按验收档分级(2026-11-04 起)**:逐卡读卡内「验收档:高/中/低」申报(test-conventions §8.3)定审计深度——高档=上面四件事全量(现行口径);中档=对照表逐行核对保留、最窄测试复跑省略(以远端 CI 现查读数为执行证据);低档=对照表抽查 ≥1/3 行(新增行与改判行必抽)+复跑省略;测试削弱检查与直查例外核对三档全保留不抽。未申报档位的卡(旧卡)按高档全量执行;档位存疑按高档。梯度表权威=test-conventions §8.7。
|
|
||||||
|
|
||||||
审计报告写 `reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,逐卡标注验收档与实际执行深度。未通过不得合并;缺漏按实现段零裁断处理(停该卡,退回上游,禁实现期自裁)。审计核的是各卡施工那一步留下的跑批读数(AGENTS 红线·改完即测铁规),对已跑绿的同一份字节不另起跨域跑批——读数对不上才复跑。
|
|
||||||
|
|
||||||
### 停机规则
|
|
||||||
|
|
||||||
- **实现段零裁断(2026-10-18 换口径,取代原「禁自答/用户门/机制卡点」三条)**:实现段的输入在编排段出口已锁死(卡片零待裁点+设计闭合凭据齐+编排五查过)。施工中冒出需求卡片没写清的分歧、冲突、模糊点(含机制卡点)=**上游缺陷**——停该卡,呈报退回上游(写卡段或设计段),随呈报附「待办清单对应条目状态回退+缺口补记」拟稿(写清差什么才能重写卡);呈报=缺陷移交不是提问,须把分歧点、两种以上读法与建议案写全,不裸呈问题。**禁自答、禁内联提问求裁断、禁 idle 等待轮**;待办清单状态回退与缺口补记的落笔归上游段或用户——本批对 `design/` 只读,批性质禁令不因停机豁免。该卡停摆不阻塞同迭代其他卡,其余卡继续(单工作区口径:停摆卡不提交,其余卡继续施工;迭代收口合并须等停摆卡闭合、或用户裁拆批后整体进行)。
|
|
||||||
- 需求卡片内预设停机点(S1/S2…)→ 合法停机呈报等裁(裁断点在卡片审问阶段已由用户预设,属预授权面)。
|
|
||||||
- 异常分级:L1 自救重试一次 → L2 记录继续(连续 3 次同红灯升级)→ L3 停机写报告等用户。环境故障与测试红是工程问题,走分级处置,不属裁断。
|
|
||||||
- 代拍板白名单保留:授权发生在卡片审问阶段,实现只执行预授权(随 commit 留痕);超白名单事项记入实现报告「实现决定记录」节备案,不另立追认单。
|
|
||||||
- 特批机制不进本技能:实现段无特权,禁以任何「用户特批」名义在施工中放行跳步。
|
|
||||||
|
|
||||||
## 第 5 步:合并与收口
|
|
||||||
|
|
||||||
1. **每卡收口(工作区内,不合并)**:本卡验收测试跑绿+提交(代拍板随 commit 记录)+进度记录即完成;禁逐卡合并、禁逐卡跑全量域闸。
|
|
||||||
2. **迭代总收口(一次合并)**:全部卡收口后 → **冻结**(代码与断言不再动)→ 全仓件核 grep → master 已被推进则在迭代工作区 `git merge master` 解冲突 → **重塑**:`python tools/reshape_cards.py --branch iter<N> --card 卡<k>=<该卡最后一笔> …`(把分支线性史压成一卡一笔+可选一笔纯文档收尾;原史自动留 backup 分支,见 process-conventions §1.3)→ **独立验收审计通过**(见上节)→ 主区 `git merge --no-ff iter<N>`(合回守卫数卡校验:卡提交数=roadmap 行卡片数,未归卡提交拦下)→ 合并落地 post-merge 钩子自动推送 origin master 触发远端 CI 全量(后台,不阻塞)→ 即向用户呈报本批总结(呈报即本回合止),结果按需现查 `tools/ci_check.sh <合并提交>`(合回零等待,process-conventions §1 第 3 条)——绿即收口;红则按闸机轮次纪律孤跑复现、新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复提交并再次主区 `git merge --no-ff`,追绿后删修复区(迭代区已随合回即删)。允许的重跑只剩「验证修复」与用户自发全量回归两类,禁「跑都跑了再跑一遍保险」(process-conventions §1 第 2 条、§3 第 9 条)。
|
|
||||||
3. 账面随批:**能力清单核对(2026-10-29 起,核对义务归收尾提交)**——核对 `game/tests/README.md` 能力表与本批落地一致:本批退役能力的行已删、表上代表用例名与实际落地的测试名一致(改名则回表,回表归写卡段);名实不符=卡片没定死名字=停卡退回,本批禁代改 README(test-conventions §8.3)。体验验证清单登记目检项(真人检测只登记不阻塞——登记完批内义务即了结,禁以等目检为由延后合并/收口/下一迭代,2026-10-12 用户立规)、roadmap 行内该卡换代、术语表如涉(以上机械面文档,合并前随批更新完毕);**GDD/art-bible 等设计权威文档一律不动**——实现与设计的差异/缺口逐条记入反哺点清单(2026-10-10 用户立规:文档更新必须经用户同意)。
|
|
||||||
4. 迭代产出物**全部落 `reports/`,禁落 `design/`**——`reports/iter<N>-实现报告-<日期>.md`(各卡状态+实际对照表+独立验收审计结论+实机目检总清单+遗留读数义务+实现决定记录)、`reports/iter<N>-反哺点-<日期>.md`(要写进 GDD/art-bible 的点逐条写清:哪个文件哪一节、改成什么、依据是什么;**不再登记待办清单**,用户在会话里裁决后由文档批写入 `design/` 并把该条清掉);stage.txt 视情移动、批末闸序列全绿留痕。待办清单条目状态推进与 roadmap 顶部「当前位」三行换代都归文档批做(本批禁写 `design/` 与根规则文件,见批性质禁令)。**roadmap 里程碑或行换代已移出本批**(属文档动作,归文档批做);若按第 3 步搬运过定义面(roadmap/待办清单/需求卡片),那笔提交单独成笔,呈报时注明是搬运既有文件、不是本批撰写文档。
|
|
||||||
5. 红灯纪律:存量红零新增口径可继续;**新红必修或停机呈报,禁带红合并**。
|
|
||||||
|
|
||||||
## 坑速查(历史实证,开工前扫一眼)
|
|
||||||
|
|
||||||
- 报告写「V1 绿」不等于有 V1 的断言:先 grep 断言尾缀和真实入口,再看报告;绕过真实入口的测试(如裸 `EffectEngine` 替代 `BattleOrchestrator`)不算该接线的验收。
|
|
||||||
- worktree 冷检出(整迭代一次;并行例外路径每卡一次):`game/assets/art/**` 与一切 `*.import` 边车都不入 git,检出后必先把主区素材拷过来(`cp -r <主区>/game/assets/art/. <本区>/game/assets/art/`),再用 **`--editor --quit`** 刷导入——`--import` 不生成新素材的 .import 边车,刷完仍报 `main_theme.tres` 解析失败、按钮样式盒全空、冒烟 V1 成片假红(2026-10-17 实测)。跑批前的素材齐盘预检会把这件事拦下来并按名列出缺件。同轮跑 `tools/setup_worktree_userdir.sh`:不建区隔离时所有 worktree 共用引擎 user 目录,测试夹具、试玩日志与截图产物互踩(并行跑闸必假红);闸壳跑批前会自检/自愈,建不起来即拒跑。
|
|
||||||
- 合并后主区:无手工动作——类名缓存刷新由 CI 跑批起手接管(`--editor --quit`);CI 首跑即合并后验证,红项与绿证用 `tools/ci_check.sh <合并提交>` 现查(读数须是绿;「未验」=零触发批跑闸步全跳过,不算验过),修复走 `fix-<任务名>` worktree 合回自动追绿。
|
|
||||||
- 长测试前:清残留 Godot 进程(probe_gate 自带清杀,run_all 需手动)。
|
|
||||||
- 改名件:.gd/.uid/.tscn 三件同步,禁只改 .gd。
|
|
||||||
- heredoc 内变量会被吞:复杂脚本落文件再执行。
|
|
||||||
- CRLF:禁往核心层 .gd 带入 CRLF(battle_orchestrator 前科)。
|
|
||||||
- 守卫/脚本过闸:用 worktree 相对路径形态调用,禁主区绝对路径。
|
|
||||||
- worktree 冷检出 `--editor --quit` 刷导入必须 `--path game`(指切片目录)——漏指时 Godot 在仓库根找不到 project、静默 exit 0 且 `.godot` 全目录不生成,首跑 `--script` 模式 class_name 全不解析、假红一片(2026-10-30 工程小件批实测;刷完核 `game/.godot/global_script_class_cache.cfg` 在位再跑测试)。
|
|
||||||
|
|
||||||
## 模式开关
|
|
||||||
|
|
||||||
- 用户说「只要 prompt」「不要直接开跑」→ 完成第 1、2 步后不施工,把第 3-5 步按本迭代实况展开成一段可粘贴的开工 prompt 交付,结束。
|
|
||||||
- 默认(无修饰语)→ 调用即开工,全程执行到总收口或合法停机点。
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": "iter-factcheck-delegate",
|
|
||||||
"description": "开工检查第③项事实抽查:把只读考证外派,冲突判定与呈报留在本会话",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。roadmap 行与卡①见 files/mock-roadmap-iter40.md 与 files/mock-card-iter40-1.md。现在走到第 2 步开工检查的自洽扫描第③项——要抽查卡①「现状考证」的 4 处 file:line 引用。请给出你接下来要做的事:分派计划(哪几件派给子代理、派活指令原文怎么写、哪几件本会话自己做)与拿到结果后的处置。不要真的开 worktree、不要运行任何游戏测试或闸命令。",
|
|
||||||
"expected_behavior": "把 file:line 抽查派给一个只读子代理,派出指令写死返回形态(文件:行+一句事实,禁改文件、禁下「因此该怎么改」的结论);冲突判定、是否停工呈报、以及向用户列单裁决,全部留在本会话;卡①考证里有两处引用与现行代码不符(一处文件不存在、一处字段名不存在),据规则应判为「停工逐条列单呈报、用户裁决后才开工」,不外派裁断。",
|
|
||||||
"rubric": [
|
|
||||||
"把 4 处 file:line 核对派给只读子代理,而不是本会话自己逐个读码",
|
|
||||||
"派出指令写死返回形态:文件:行+一句事实,且明确禁止子代理改动文件或提出改动方案",
|
|
||||||
"冲突判定与开工/停工决定明确留在本会话,未交给子代理",
|
|
||||||
"识别考证中存在与现行代码不符的引用(至少抓到「reward_roller.gd 不存在」或「drop_roll_count 字段不存在」其一)",
|
|
||||||
"处置为停工逐条列单呈报(矛盾在哪/两种读法各是什么/建议哪边改)并等用户裁决,未自行改卡片或改代码凑绿",
|
|
||||||
"未运行游戏测试或闸命令、未开 worktree(本步只是只读核对)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-red-locate",
|
|
||||||
"description": "轻闸出红:跑命令取读数可外派,修复与复跑收回本会话",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。卡①T2 刚写完,轻闸读数见 files/mock-gate-run.md(含 T0 基线与本轮输出)。请给出你接下来要做的事:哪些派给子代理、派活指令原文、哪些必须本会话做,以及这条红灯怎么定性。不要真的执行任何闸命令,就按夹具里的读数判断。",
|
|
||||||
"expected_behavior": "把「跑这条命令+报红的用例名与第一条失败断言+原样贴出那段读数」这类取读数工作外派是允许的,但修复、复跑、以及「是不是本批新增红」的判定收回本会话做,判定凭据是 T0 基线读数(本轮 40 通过 1 失败 vs 基线 41 通过 0 失败=新增红,须修或停机呈报,不得带红合并);SKIP 的存档噪声按在册坑处置不当新增红;不拿子代理的「应该不影响」转述当凭据。",
|
|
||||||
"rubric": [
|
|
||||||
"明确可外派的是跑命令取读数与定位(返回形态写死:用例名+第一条失败断言+原样读数)",
|
|
||||||
"修复与复跑明确收回本会话,未整包丢给子代理",
|
|
||||||
"拿 T0 基线读数当判定凭据,据此判为「本批新增红」(1 失败 vs 基线 0 失败),不采信「应该不影响」这类转述",
|
|
||||||
"新增红的处置是修或停机呈报,未提出放宽阈值/删断言/带红合并",
|
|
||||||
"把 L3 屏壳 SKIP 认作在册环境噪声(共享存档坑),未误判成本批红灯",
|
|
||||||
"全程未真的执行闸命令(夹具已给读数)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-audit-mandatory-subcontract",
|
|
||||||
"description": "合并前独立验收审计强制分出;子代理回报自称「可合并」时按线索不按证据",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。卡①已写完、批末重闸跑过,一个子代理替你核了对照表,它的回报原文见 files/mock-subagent-report.md。你现在能不能合并?请给出你接下来的动作,包括:审计该由谁做、这段回报怎么用、以及回报里哪些点必须自己再验。不要运行任何测试或闸命令。",
|
|
||||||
"expected_behavior": "不能凭这段回报合并。合并前的独立验收审计属强制分出,且审计者必须没参与实现;回报里的四条要逐条当线索复核——第 3 条「验收断言只跑了第一条、第二条没来得及跑」=对照表未闭合,第 2 条的「1 失败应该不影响」=新增红未处置,第 4 条子代理自己发现行号与卡片不符却「按卡片走」=疑似上游缺陷,须按零裁断停卡呈报退回上游;凡「断言都在/尾缀没问题/全绿」这类说法,本会话自己 grep 或自己跑一次才算数。审计通过前不得合并。",
|
|
||||||
"rubric": [
|
|
||||||
"给出结论:未过独立验收审计不得合并,且审计由没参与实现的子代理(或用户点名的另一会话)执行",
|
|
||||||
"把回报当线索不当证据:对「全部通过」「断言都在」明确要求本会话自己 grep 尾缀/复跑确认",
|
|
||||||
"抓到第二条验收断言未当轮执行=对照表未闭合,不作为可合并状态",
|
|
||||||
"抓到 1 条失败被回报说成「应该不影响」,按新增红处置(修或停机呈报)",
|
|
||||||
"抓到子代理自述「行号和卡片不太一样但按卡片走」,判为疑似上游缺陷并停卡呈报退回上游,不在实现段自裁",
|
|
||||||
"未运行任何测试或闸命令,未直接合并"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-implementation-not-delegated",
|
|
||||||
"description": "反面用例:用户催「把卡②整卡丢给子代理并行」,实现轮不得外派",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。roadmap 行见 files/mock-roadmap-iter40.md,注记是「三卡并行」。用户对你说:『三张卡并行跑,卡②和卡③你各开一个子代理,让它们自己写代码自己提交,你在主区等着合并就行,这样快。』请回应并给出你的执行方案。不要真的动代码。",
|
|
||||||
"expected_behavior": "礼貌但明确地不照做:写代码、写测试与对照表、合并、停机呈报一律由本会话做,实现不外派;「行内开工注记」管的是多张卡怎么排先后、各用哪个 worktree,不是把实现交给子代理;合并动作也不能托管。可外派出去的只有查证、跑命令取读数两类主动分出的活与强制分出的独立验收审计,且都不改源码、不写实现产出物、不做裁断。卡③硬等卡①合并这条依赖同样要守住(依赖未合进 master 前不开 T1)。",
|
|
||||||
"rubric": [
|
|
||||||
"明确拒绝把卡②卡③的实现(写码/写测试/写对照表)交给子代理",
|
|
||||||
"明确拒绝「主区等着合并」这种把合并托管给等待状态的做法——合并由本会话执行",
|
|
||||||
"解释「行内开工注记」与并发 ≤3 只管卡序与 worktree 数量,不是实现外派的授权",
|
|
||||||
"保留可外派的三类:file:line 考证、跑命令取读数、强制的独立验收审计;并说明它们不改源码、不写实现产出物、不做裁断",
|
|
||||||
"指出卡③硬等卡①合并的依赖未被「并行」豁免",
|
|
||||||
"未真的动代码、未开 worktree"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-once-normal",
|
|
||||||
"description": "正常批:master 中途推进时,全量域闸应只跑一次且顺序为「先并 master 再跑闸」",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。卡①已写完并提交到分支 iter41,件核 grep 做过、零残留。此时发现 master 被别的批次推进了两个提交(与本批无文件交集)。请给出从此刻到合回 master 的全部动作清单,并明确写出「整个批次剩余阶段会调用几次 tools/run_all_gates.sh」以及每次调用的前置状态。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "顺序固定为:冻结(代码与断言不再改)→ 全仓件核 grep → 先在迭代分支里 git merge master 解冲突(必须早于跑闸,闸跑完再并=那次闸白跑)→ 跑一次 tools/run_all_gates.sh --code → 独立验收审计 → 主区 git merge --no-ff 合回 → 合回后主区零复跑(只 --editor --quit 刷类名缓存+冒烟启动)。剩余阶段全量域闸调用次数=1。",
|
|
||||||
"rubric": [
|
|
||||||
"明确「先把 master 并入迭代分支,再跑域闸」,并给出排序理由(闸跑完再并则那次闸白跑/回执失效)",
|
|
||||||
"明确写出剩余阶段的全量域闸调用次数=1",
|
|
||||||
"动作序列中「冻结」与「全仓件核 grep」都排在跑闸之前",
|
|
||||||
"明确合回后主区零复跑(只刷类名缓存+冒烟启动),不在合回后再跑闸",
|
|
||||||
"未提出「先跑一次、并完 master 再跑一次」或「顺手改点东西再补一跑」",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-reports-commit-after",
|
|
||||||
"description": "闸后只追加 reports/ 提交:回执仍有效,不许重跑",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末全量域闸已跑绿,回执 commit=A,分支尖当时也是 A。随后你把实现报告追加了两段,提交为 B(只动 reports/iter41-实现报告-2026-10-25.md)。现在要合回 master。有人建议「闸后代码变了,重跑一次保险」。请给出你的处置与理由,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "不重跑,调用次数=0。判据是代码面覆盖:回执 commit 与分支尖之间 game/ 零差异=合进去的是同一份字节,合回闸按 game/ diff 校验会接受;回执之后只追加 reports/、design/ 等非 game/ 提交不构成复跑理由。",
|
|
||||||
"rubric": [
|
|
||||||
"明确不重跑,并写出调用次数=0",
|
|
||||||
"理由用「回执 commit 之后 game/ 零差异=同一份字节(代码面覆盖)」,不是「reports 不影响代码」这类笼统说法",
|
|
||||||
"指出合回闸会按 game/ diff 接受该回执,不会因为 commit 号不同而被拦",
|
|
||||||
"未改回执、未重生成基线、未为了凑 commit 对齐而改写或挪动产出物提交",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-residue-after",
|
|
||||||
"description": "闸后件核发现 game/ 残留:必须修并重跑一次,且要认账件核顺序错",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸刚跑完(回执 commit=A,全绿)。随后全仓件核 grep 发现 game/probe/ui_struct_probe.gd 里还留着本批已退役字段 template_pick 的夹具行。请给出处置,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件(假设修复动作由你安排,不必真做)。",
|
|
||||||
"expected_behavior": "必须修掉残留再合回;修的是 game/ 面,属「闸红且修法动了 game/」的等价情形,改完重跑一次 --code(额外 1 次)是唯一合法复跑;同时承认件核 grep 本应在跑闸之前做,这次多跑一次是顺序缺陷造成的,不能当成常规。",
|
|
||||||
"rubric": [
|
|
||||||
"判定必须修复该残留,不能带退役字段进 master",
|
|
||||||
"判定修完重跑一次 --code,并写出额外调用次数=1",
|
|
||||||
"说明这是「闸后改动 game/ 面=回执失效」的唯一合法复跑情形,不把它说成常规做法",
|
|
||||||
"明确承认件核 grep 本应在跑闸之前(顺序缺陷导致多跑一次)",
|
|
||||||
"未把该残留判为「不影响、可以不管」或「下次再说」",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-rerun-for-insurance",
|
|
||||||
"description": "反面用例:用户要求「再跑一遍保险」,应拒绝并给零信息理由",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸已全绿(回执 commit=A,分支尖=A,之后只追加了一个 reports/ 提交)。用户对你说:『跑都跑了,再跑一遍吧,保险。』请回应并给出你的动作,写出你会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "不跑,调用次数=0。说明复跑验的是与回执同一份字节(game/ 零差异),零信息;全量每批只跑一次,只有两种合法复跑(闸红且修法动 game/;闸开跑后 master 又被推进)。可给替代:若用户想看某项具体读数,单跑那项最窄命令。",
|
|
||||||
"rubric": [
|
|
||||||
"明确不跑,并写出调用次数=0",
|
|
||||||
"给出零信息理由:复跑验的是与回执同一份字节/game/ 面零差异",
|
|
||||||
"列出仅有的两种合法复跑情形",
|
|
||||||
"既未把「用户说了」当作绕过纪律的理由,也未与用户对抗(给出替代方案,如单跑某项最窄命令)",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-master-ahead-during",
|
|
||||||
"description": "边界用例:闸跑完 master 又前进,属唯一第二种合法复跑",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸跑完,回执 commit=A。就在你准备合回时发现 master 又前进了一个提交(别的批次刚合入,改动与本批冲突)。请给出处置,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "先在迭代分支 git merge master 解冲突,重跑一次 --code(额外 1 次),再合回。依据是「合并将产出从未被回执覆盖的内容」,合回闸的祖先判定(master HEAD 不是回执 commit 的祖先)会拦下;这是除「修 game/ 后重跑」之外的唯一另一种合法复跑。",
|
|
||||||
"rubric": [
|
|
||||||
"判定必须并入 master 并重跑一次 --code,写出额外调用次数=1",
|
|
||||||
"理由用「合并将产出未测内容/master HEAD 不是回执 commit 的祖先」",
|
|
||||||
"明确复跑前先 git merge master 解冲突",
|
|
||||||
"未选择「直接合回、赌不冲突」或「让守卫放行就好」",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# 评估夹具(虚构)——需求卡片 迭代 40-①「奖励投放口径改造」
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具:卡片正文里的「现状考证」四条引用中,**有两条与主区现行代码不符**(夹具故意留的错,不在本文件标注是哪两条)。来源:`design/gdd/02-系统清单.md`。
|
|
||||||
|
|
||||||
## 1. 需求
|
|
||||||
|
|
||||||
把奖励投放的随机入口统一走 `RngService`,投放条数从代码字面量改为表读,并在实现报告留改动—验收对照表。
|
|
||||||
|
|
||||||
## 2. 现状考证(成文于迭代 40 编排时)
|
|
||||||
|
|
||||||
- 奖励结算入口在 `game/core/reward_roller.gd:40` 的 `roll()`,此处自建了 `RandomNumberGenerator` 局部实例。
|
|
||||||
- 投放条数由 `game/data/tables/reward.tres` 的 `drop_roll_count` 字段给出。
|
|
||||||
- 战斗编排器持有随机流引用,见 `game/core/battle_orchestrator.gd:28` 的 `var rng: RngServiceCore`。
|
|
||||||
- 奖励经济类定义在 `game/core/reward_economy.gd:5`。
|
|
||||||
|
|
||||||
## 3. 改动—验收对照表(卡内草案)
|
|
||||||
|
|
||||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 |
|
|
||||||
|---|---|---|---|---|---|
|
|
||||||
| 随机走统一流 | `RewardEconomy` 取数处改经 `RngService` 统一流取随机 | `rng_service_wiring`(单元套,随本轮落地) | 单元 | 结算屏→一场完整自动战斗 | 编排器注入的 `RngService` 同一实例取值 |
|
|
||||||
| 条数改表读 | 投放条数改读 `data/tables/reward.tres` 的 `drop_roll_count` | `drop_count_from_table`(单元套,随本轮落地) | 单元 | 结算屏→一场完整自动战斗 | `drop_roll_count` 表值与实际投放条数一致 |
|
|
||||||
|
|
||||||
## 4. T 卡
|
|
||||||
|
|
||||||
- T1 考证复核+改动点定位
|
|
||||||
- T2 随机流接线(验收测试随本轮落地)
|
|
||||||
- T3 表读取数(验收测试随本轮落地)
|
|
||||||
|
|
||||||
## 5. 估时
|
|
||||||
|
|
||||||
≈2 个工作日。
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# 评估夹具(虚构)——一份闸输出读数
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具。T0 基线读数与本轮读数的差就是"本批新增红"候选。
|
|
||||||
|
|
||||||
## T0 基线(本批第一笔提交 message 里记的)
|
|
||||||
|
|
||||||
- `python tools/run_smoke.py`:冒烟 41 通过 / 0 失败
|
|
||||||
- `game/tests/run_all.gd`:单元 208 通过 / 0 失败
|
|
||||||
- `tools/probe_gate.sh --click`:13 探针全绿
|
|
||||||
|
|
||||||
## 本轮(卡①T2 完成后跑轻闸)
|
|
||||||
|
|
||||||
```
|
|
||||||
$ python tools/run_smoke.py
|
|
||||||
[smoke] V1 主屏可点开冒险 .......... PASS
|
|
||||||
[smoke] V2 一场自动战斗可结算 ....... PASS
|
|
||||||
...(中略 36 行)
|
|
||||||
[smoke] V39 奖励条数与表值一致 ...... FAIL
|
|
||||||
expected 3 got 2 (reward_economy.gd:118 _roll)
|
|
||||||
[smoke] 汇总 40 通过 / 1 失败
|
|
||||||
```
|
|
||||||
|
|
||||||
## 同一 worktree 里的其他噪声(与本批无关,勿修)
|
|
||||||
|
|
||||||
- `probe_gate.sh` 末尾提示 `user://save.json` 缺失,L3 屏壳探针报 SKIP(共享存档在册坑)。
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# 评估夹具(虚构)——roadmap 迭代 40 行
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具,不是仓库事实源。行内引用的需求卡片同样在 `files/` 下。
|
|
||||||
|
|
||||||
## 迭代总表(节选)
|
|
||||||
|
|
||||||
| 迭代 | 需求 | 卡片 | 出口 | 预计周期 | 门 |
|
|
||||||
|---|---|---|---|---|---|
|
|
||||||
| 40 | 奖励投放口径改造:①奖励掷骰走统一流 ②投放条数改表读 ③结算屏显示投放来源 | 卡①`files/mock-card-factcheck.md` 卡②`reports/需求卡片-迭代40-②.md`(本夹具未附) 卡③`reports/需求卡片-迭代40-③.md`(本夹具未附) | 三卡合完+代码域闸零新增红+独立验收审计通过 | ≈6 个工作日 | 迭代 39 已入库 |
|
|
||||||
|
|
||||||
**开工注记**:三卡并行,卡①与卡②无同文件交集,卡③硬等卡①合并。
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# 评估夹具(虚构)——一个子代理的回报原文
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具。这是"被取回"的那段文字,评估看的是本会话怎么用它。
|
|
||||||
|
|
||||||
**回报原文:**
|
|
||||||
|
|
||||||
已完成核对。结论:**全部通过,可以合并**。
|
|
||||||
|
|
||||||
1. 改动—验收对照表 2 行都有对应测试,断言都在,尾缀我看了没问题。
|
|
||||||
2. 轻闸跑了:40 通过 1 失败,那 1 个失败是表值口径的,和卡②差不多,应该不影响。
|
|
||||||
3. 验收断言:第一条在当轮跑批执行并通过了;第二条没来得及跑。
|
|
||||||
4. 另外 `battle_orchestrator.gd` 里那处引用行号好像和卡片写的不太一样,但我按卡片走的就是 `RewardEconomy`,不影响结论。
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
---
|
|
||||||
name: req-card
|
|
||||||
description: g-plan2(Dungeon Sweeper)仓库写需求卡片的固定流程与结构。当用户要求起草/修订需求卡片、给迭代需求写实施文档、或迭代规划进入写卡阶段时使用。固化需求卡片必备结构——尤其「关联文档同步面」必填节(2026-10-17 文档同步闸 v3:卡片服务的是**代码实现批**,该批禁写 `design/` 与根规则文件,要改文档的点一律列进 `reports/` 反哺点清单,用户在会话中裁决后归文档批落文)、「改动—验收对照表」(2026-10-11 立,2026-10-21 升级:每个需求点与每个行为改动都必须有真实入口断言和判据绑定面;无验收标准的需求点=卡片不成立,/iter 开工门同规拦截)与「落位与可复用性预检」必填节(2026-10-21 立:新增文件/函数/数据件前先核仓库既有实现,能复用不新增,落点唯一、禁散落 helper、跨层交互显式声明)、「实现规范预算」必填节(2026-10-27 迭代 39 实证立规:新增件接口块/成员面先对 gdstyle 默认阈值做预算——公开方法 ≤20、类变量 ≤15、迁移函数对账基线键,超了写卡段拆件,例外走显式申报+用户特批,禁把超预算面带进实现段)与「拆分边界纪律」结构类卡必填条款(2026-10-28 用户裁立:拆分边界沿职责轴不沿阈值轴——拆出单元须有职责语句/单一变化原因/集体身份,凑计数袋禁、阈值只作发现信号、拆不出内聚单元停卡呈报走豁免通道,判据权威=code-conventions §1.1)。任务卡 T0..Tn 的步骤写作遵循 superpowers:writing-plans 方法论(2026-10-19 起按本项目适配内联:卡前文件结构图/范围检查/任务右尺寸/步骤粒度/步骤内容四分/接口声明/禁行句式/自审六查)。复核门含引擎技术面三查(2026-11-04 起,godot-master 窄口径:NEVER/Gotchas/性能预算+按需领域 reference,权威仍在项目规范)。复核发现按四类去向处置(2026-11-05 立:自判=查规范或查代码有唯一答案,复核者自己改卡;补写=卡里漏写,回炉补全;待裁=多种做法都不违规且代价不同,才交用户;退回上游=文档线或美术线未闭合、或架构与代码规范本身冲突);卡片必带「复核记录」节(缺节=不成立,机检=pipeline_gate),复核先于提交、提交先于合回,顺序没走完禁对用户称完成。
|
|
||||||
---
|
|
||||||
|
|
||||||
# 需求卡片写作规范(g-plan2)
|
|
||||||
|
|
||||||
需求卡片 = 一个需求单位的实施文档(roadmap 迭代行里的「卡①②③」是需求单位,需求卡片是它的展开)。文件落 `reports/需求卡片-<批名>-<日期>.md`。
|
|
||||||
|
|
||||||
## 第〇步·设计闭合检查(2026-10-18 五段流水线立规,先于一切写卡动作)
|
|
||||||
|
|
||||||
写卡是五段流水线(登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第三段,输入=第二段的设计线闭合凭据。动笔前先定位需求来源对应的待办清单条目(`待办清单.md`;条目格式与状态机权威见 `design/engineering/doc-conventions.md` §12),按条目状态段与改动面逐项核:
|
|
||||||
|
|
||||||
- **设计线条目(状态行含文档线段或美术线段)**:放行判据=设计闭合凭据齐——状态已到「待写卡」或更后(已写卡/已编迭代 N,含修订重写场景);状态尚停在轨闭合态而未标待写卡的(文档设计已闭合(文档路径+版本号)/美术设计已闭合(样张过审+art-bible 条款版本)/两条线并列时两段全带闭合凭据),同样算闭合成立、放行,写完直接把状态推进到「已写卡(卡片路径)」。画面类需求(触碰画面呈现规格:新增画面要素/布局/配色/动效)放行另核一项:设计段预览图已人审在案(ux/ 规格文档内嵌预览节随附像素级判据句;义务出处=process-conventions §2 段二行)——预览图缺或未见人审记录=拒写卡退 doc-design。凭据缺、状态还停在 待文档设计/文档设计中/待美术设计/美术设计中、或两线只闭合了一段 → **拒写卡**,呈报退回设计段(文档线退 doc-design,美术线退 asset-ingest,两线并列时退未闭合的那段),禁硬写。
|
|
||||||
- **需求性工程条目(状态行整行无设计线段、首段直落待写卡,限缺陷修复/重构等改游戏行为的四类)**:核对条目实况里有证据指认;状态落「待执行」的直改类条目(工程债/测试基建/工具维护,不动游戏行为)不属写卡范围(bug 证据带 file:line,或工程债条目)。无证据 → 拒写卡呈报,禁凭口头描述开工。
|
|
||||||
- **直改类条目(禁写卡,2026-10-25 用户裁·改动四类)**:条目属工程改动(tools/、闸件、模拟测量工具、纯测试维护——不动游戏行为)、文档设计改动或美术素材改动 → 拒写需求卡片,呈报改走直改通道:登记 →(如需设计讨论)→ 用户发令直改 → 按改动域跑闸 → 完成删条目。判据=改动会不会被打进游戏、被玩家玩到:会=需求改动(可写卡);不会=直改类。注意:跳过设计线≠当然可写卡——改游戏行为的缺陷修复/重构=需求改动可写卡;配套维护类禁写卡。
|
|
||||||
- **反哺点专条(状态取待裁决/已写入):不属写卡范围,分流呈报(反哺点走 doc-design 的写入通道,见 process-conventions §2 段二)。
|
|
||||||
- 定位不到对应待办清单条目 → 呈报先补登记(登记是流水线第一段,条目格式由流水线闸 `tools/pipeline_gate.py` 强制),禁跳过登记直接写卡。
|
|
||||||
- 条目不是 §12 格式(缺「**改动面**」属性或标题缺登记元数据)→ 呈报待整改批换代,禁自行猜测所属设计线与改动面硬写(现行待办清单尚未整改时,闸对这些条目整体红属预期)。
|
|
||||||
|
|
||||||
**特批通道(设计前置的唯一例外,2026-10-18 按 doc-conventions §12.4 固化)**:只有用户明示「跳过设计前置」才可走,执行一律两段式——①对象已有内容(设计讨论确有记录)→ 直接在待办清单条目状态写 `〔用户特批 YYYY-MM-DD 跳过××〕`;②对象没有任何内容 → 必须回呈实况,经用户再次确认后才写标记。标记与状态词并存写:标记只豁免设计段、不替代状态机推进,跳过后状态照状态机记(例:「〔用户特批 2026-10-18 跳过文档设计〕待写卡」);只写标记不留状态词,流水线闸判「状态行内容为空」红。标记必须带日期,无日期=非法、不构成放行;条目已带合法特批标记的,等同凭据齐放行。禁自援特权:写卡会话自己觉得该跳,只能呈报后停,禁自行写特批标记。
|
|
||||||
|
|
||||||
## 写作前
|
|
||||||
|
|
||||||
1. 先读对应待办清单条目、相关 GDD 权威定义节、roadmap 迭代行——需求卡片的事实源是它们。
|
|
||||||
2. 现状事实必须代码级考证(file:line 实查),禁凭记忆写「现状」。
|
|
||||||
3. **设计前置检查(2026-10-10 用户立规)**:新玩法/新系统/新内容类需求必须有设计定稿前置(GDD/art-bible 待裁点清零)——设计未定稿不写卡,回设计段;缺陷修复/工程债/测试基建/重构类工程需求凭 bug 证据或待办清单在册条目直接写卡,无设计前置要求。(2026-10-18 起本检查由上方「第〇步·设计闭合检查」统一执行:凭据核、证据核与特批通道以第〇步为准。)
|
|
||||||
4. 参考既有范本:`reports/` 下现行在役的需求卡片(批名与日期见 `roadmap.md` 迭代总表「需求卡片」列)。原三份范本(内容数据驱动扩展批/混编遭遇首批投放批/武器锻造系统设计提案批)已按「吸收即死」退役,git 历史可考。(范本成文早于 2026-10-19 任务卡写作纪律——学其事实密度、契约与范围边界的写法;T 卡步骤粒度按新纪律收紧,禁照抄范本的粗步骤。)
|
|
||||||
5. **任务卡方法论上游(2026-10-19 立)**:任务卡 T0..Tn 的写作遵循 superpowers:writing-plans 技能的任务/步骤纪律。该技能的通用纪律已按本项目实际适配内联于下文「任务卡写作纪律」节与「纪律」节自审七查——**内联版即执行依据,写卡不要求另行加载该技能**;若写卡时会话在役加载了 writing-plans,可以它的任务结构/步骤粒度/自审三节为上游参照,两者冲突时以本技能与 AGENTS.md 为准。writing-plans 的文档落位(`docs/superpowers/plans/`)与执行交接节(让用户在两种执行方式里挑)**不适用本项目**——本项目的计划文档就是需求卡片本身,执行走 /iter 发令。
|
|
||||||
|
|
||||||
## 必备结构(缺节不开工)
|
|
||||||
|
|
||||||
1. **目标与完成定义**——这批做什么、什么状态算完。
|
|
||||||
2. **设计事实源(必填,2026-10-18 五段流水线立规)**——本卡设计依据的唯一出处声明,三选一填写:① GDD 文档节+版本号(例:`design/gdd/systems/xxx.md` v1.2 §核心规则);② 样张过审+art-bible 条款版本;③ 跳过设计线的证据指认(需求性工程条目或直改类条目)(bug 证据带 file:line/工程债条目)。所填必须与待办清单条目状态里的闭合凭据(或工程类证据指认)一致——本节是后续迭代编排五查与 /iter 开工核验的比对对象,缺失=卡片不成立。**合格写法两种**(2026-10-18 卡片冲突修订批与机检对齐,禁按小节名字面卡死——库内合规卡多用写法乙):甲=独立小节「## 设计事实源」;乙=头部条目「来源:…(唯一事实源:…)」。机检=`tools/pipeline_gate.py` 判据 C2:全文含「设计事实源」或「唯一事实源」任一即合格,生效=文件名日期 ≥2026-10-18,更早的卡属历史留档不回头改。
|
|
||||||
3. **现状事实**——代码级,开工自行复核;每条带 file:line。
|
|
||||||
4. **设计契约**——违反即返工的红线条款,标 🔴(触碰=L3 停机呈报)。
|
|
||||||
5. **范围边界**——做什么不做什么;明示不收件的去向(待办清单登记/后续批)。
|
|
||||||
6. **关联文档同步面(必填,2026-10-17 改口径:实现批禁写文档)**——三列:文档|关联点(本批实现会改变它的哪条陈述)|同步义务。同步义务分三层标注:**设计权威文档**(GDD/art-bible)与**机械面文档**(roadmap 行/术语表/体验验证清单/README)对代码实现批**一律不直改**——实现批**禁写 `design/` 整个目录与根规则文件**,把该改哪一节、改成什么、依据是什么逐条列进 `reports/iter<N>-反哺点-<日期>.md`,由用户在会话中裁决后归文档批落文(不设文档 skill,文档靠会话讨论落地)。实现批唯一可写目录=`reports/`(2026-10-18 用户裁:根目录会话状态文件已废除,无任何例外)。写卡时就要把「实现会影响哪些文档的哪些说法」查全;查不出也要写「无关联文档」四字,不许省略本节。**机检(2026-10-18 卡片冲突修订批补)**=`tools/pipeline_gate.py` 判据 C1「文档义务口径」:同步面表内目标格指向 `design/`(含 `../gdd/` 等相对写法)或根规则文件、而义务格仍写「随批」者红——旧口径措辞「机械面随批」自 2026-10-17 起作废,写卡禁沿用;生效=文件名日期 ≥2026-10-17。
|
|
||||||
7. **任务卡 T0..Tn**——逐卡估时;**末卡必含「产出物落位卡」**:轻闸全绿后、合并前,把 `reports/` 两份写齐——实现报告(各卡状态+实机目检总清单+遗留读数义务+实现决定记录)、反哺点清单(同步面所列每条都要有落点),方算收口。**禁把任何 `design/` 文件或根规则文件的编辑写进实现批的任务卡**(那是文档批的活)(AGENTS.md 批次工作流 §3.13)。(T 卡内步骤说明的写作纪律见下文「任务卡写作纪律」节,2026-10-19 立。)
|
|
||||||
8. **验证闸(改动—验收对照表,2026-10-11 立,2026-10-21 升级;2026-10-28 判据口径换代)**——每个需求点列明验收测试内容;每个行为改动也要有一行。表列至少七格:需求点|改动(文件:行/行为)|验收测试(名称+落点+尾缀)|层级(单元/接口/集成/探针)|真实入口|判据绑定面|能力行(2026-10-29 起:`既有:<能力名>/新增:<能力名>`;两形态的名称都须在 `game/tests/README.md` 能力表在场,机检=pipeline_gate)。**能力行当场入表(2026-10-29 用户裁,废「滞后一个迭代」)**:写卡时同批维护能力清单(`game/tests/README.md`,四列=能力|系统|真实入口|代表用例)——本批新增能力当场增行(真实入口取自设计文档已定的入口;代表用例=本卡定死的计划测试 `文件:函数` 名);受影响存量行(入口/用例名变更)同批更新;能力退役删行。**实现照单落名**:测试函数名以清单为唯一依据,名实不符=本卡没写清=停卡退回;实现批禁写 README 的红线不变,批末收尾只核对表上名字与实际落地一致(改名则回表)。落点位置二选一:写在对应 T 卡里,或集中列在验证闸节逐条编号、由 T 卡交叉引用。**每个需求点至少一行;每行必须有真实入口和判据绑定面——缺任一项=该需求点未验收,卡片不成立**。**判据出处行锚(2026-11-05 起,对文件名日期不早于该日的卡生效)**:「需求点」格每行必须带判据出处行锚——该行验收判据所依据的现行文档句子,格式 `<文档相对路径>:<行号>`(如 `design/gdd/ux/camp.md:16`);已退役卡片不算现行文档;规格缺席写不出锚=停卡退回需求澄清(test-conventions §8.3,机检=pipeline_gate C5)。画面类需求的锚指向 ux/ 文档内嵌预览节的判据句(预览图=设计段已人审的目标画面效果图,也是实现批基线冻结时用户对照的参照——test-conventions §8.2)。承接 AGENTS.md 硬红线「新功能必配新测试」:那条只兜「有没有」,本表兜「测得对不对、是不是钉在这个改动上」——写卡期不定稿,实现期就自由发挥。
|
|
||||||
- **测试方式两分法**(2026-10-11 用户定):能力验证=调试接口直改游戏数据(改钥石/槽位/解锁状态等,不走正常资源积累流程,沿用现役 DebugOverlay/DS_DEBUG 门控);正常流程体验验证=用户目检,观测项写进 `reports/iter<N>-实现报告-<日期>.md` 的实机目检总清单(2026-10-17 起:`体验验证清单.md` 属设计文档,实现批禁写,入册该体验验证清单的条目作为反哺点由文档批落)。每张卡写明哪些点归调试接口验、哪些点归用户目检验。**用户目检一律「登记不阻塞」(2026-10-12 用户立规)**:登记完成即卡内义务了结,验收时间由用户自行安排,不得作为批末收尾、合并或下一迭代开工的前置条件。
|
|
||||||
- **闸口径(2026-10-17 改按域;2026-10-26 判据改按文件性质)**:轻闸/重闸按 AGENTS.md 分级周期口径——**重闸=`tools/run_all_gates.sh` 按本批改动域选档**(改动含 `game/` 下非 `.md` 的行为载体 → `--code`;只有文档件——`game/` 内 `.md`、`design/`、根规则文件、`tools/` 工具脚本 → `--docs`;两类都有或改闸件本身 → 不带参数全量),所选域全绿才合并。**卡内禁写死闸件名单与"全量档"字样**(域划分的唯一出处在脚本里);批末四闸语义改述为「代码域闸全绿(冒烟+单元+探针+渲染/静态)+改前改后读数对拍」。改完即测铁规照履行:卡内改动落笔即测自己改过的那部分,不请示。
|
|
||||||
- **回归措辞模板(2026-10-14 闸机轮次纪律,AGENTS.md 同源)**:禁用「每步对拍+全量回归」「每轮全量回归」类措辞——会被执行侧解读成每次修复跑全套;改用模板句:「里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套」。
|
|
||||||
- **判据绑定面口径(2026-10-24/2026-10-28 用户两裁:全项目禁变异类测试、禁撤销类取证——两者都是人为制造红,属伪造证据)**:每个行为改动的验收断言从真实入口进入、判据绑被测改动特有的可观测提交面(信号/事件/入参/状态源取值/绘制记录),在当轮真实跑批中执行并通过;判据绑不上(纯防御分支、release 独有位)=静态判据+评审注记申报观测面局限,证明做不出=停卡呈报,禁自造注入破坏或回退 hunk 取证。卡内不得再出现「撤销证明」「变异证明」列或步骤。配判据时按强弱分层配齐:**运行期断言**(可见性/树序/状态源取值)抓状态类缺陷,**golden 逐像素**抓内容观感类缺陷,**占比/统计类**判据只兜「整框空白/整框糊」,是补充不是主力(细则=test-conventions §8.4)。
|
|
||||||
- **测试削弱申报(2026-10-21 立)**:卡内列出允许改/删的旧断言及理由;实现期未申报的删除断言、放宽阈值、缩小扫描面、换下层直调,由独立验收审计判红。
|
|
||||||
- **独立验收审计(2026-10-21 立)**:卡内写明审计入口与报告文件(`reports/iter<N>-验收审计-<日期>.md`);审计由没参与实现的会话或子代理执行,未过不得合并(细则=test-conventions §8.7+iter 技能第 5 步)。
|
|
||||||
9. **异常分级**——L1 自救/L2 记录继续/L3 停机写报告等用户;新增件/重构类卡的 L3 必含「机检预算互斥=上游缺陷停卡退回写卡段」条(2026-10-27 立,与第 13/14 节条款合流)。
|
|
||||||
10. **代拍板白名单**——允许 agent 自行拍板的微决策清单(逐条列,超清单记入实现报告「实现决定记录」节)。
|
|
||||||
11. **待裁点**——全备选案并列(推荐案+淘汰依据),设计权归用户;零待裁点也要写明「零待裁点,开工门=U0」。
|
|
||||||
12. **落位与可复用性预检(必填,2026-10-21 用户立规)**——定义 T 卡前,对本批每一个**新增文件、新增函数/方法、新增数据件**逐条过三问,答案写成卡内独立小节(节名「落位与可复用性预检」,与第 7 节的文件结构图互指):
|
|
||||||
- **复用面**:仓库里是否已有做同样事的东西?先 grep 现成实现(同职责的视图/工厂件/服务/工具脚本/测试套件与夹具),能复用就复用、能扩展就扩展;确需新增必须写明「为什么不能复用既有那一个」——写不出理由=不该新增。
|
|
||||||
- **唯一面**:同一份数据、同一段逻辑、同一个常量是否只落在一处?落点唯一——一个职责一个文件,禁多处定义同名事实,禁为省事把 helper 散落到「就近的文件」里;新增前先 grep 同名与同义标识符,确认盘上没有第二处。
|
|
||||||
- **分层与交互面**:新增件之间、以及与既有系统的交互路径显式声明——谁调谁、经哪个出口、跨层时走哪条契约(Core 零 UI、玩法数值只经 ConfigDB 单点、随机只经 RngService 等既有红线不因新增而绕)。分层按职责切,不为「放得下」把跨层逻辑塞进同一文件。
|
|
||||||
- 缺本节=卡片不成立;本节与文件结构图一并作为 grilling 复核门的审点(见「纪律」节自审七查⑥)。机检只在结构层查不到语义,复用判断由写卡人与复核门负责。
|
|
||||||
13. **禁为机检文本保留无效成员(重构类卡必填条款,2026-10-25 立,与 code-conventions §1.1 同款)**——重构类需求卡片必须写明:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。
|
|
||||||
14. **实现规范预算(必填,2026-10-27 迭代 39 实证立规)**——定义接口块/文件结构图前,对本批每一个**新增文件**对照 gdstyle 默认阈值做预算,写成卡内独立小节(节名「实现规范预算」,与接口块及文件结构图互指)。现行默认口径(gdstyle v0.4.0 实测:公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6;阈值取工具默认、改阈值=基线口径变须随批重生成):
|
|
||||||
- **新件三查**:①接口块公开方法数 ≤20——超出=拆件或砍面(砍面=退设计段裁职责);②成员变量数 ≤15——超出=收编进内聚结构或拆件;③迁移函数对账——自存量文件迁入的函数,先查 `tools/gdstyle_baseline.txt` 源函数键,branches/returns/函数长有超默认登记值的,迁移即拆函数(拆分不改语义,不算迎合机检——与第 13 节区分:那条禁保留无效成员凑数,本条要求真拆)。
|
|
||||||
- **存量触面一查**:本卡触碰的存量文件,T0 读数步骤写明「S13 键较登记值只降不升」的预期与达成手段。
|
|
||||||
- **指标例外通道**:确需超默认的(架构先例如组合根超限),卡片设「指标例外申报」节——键名+理由+用户特批落基线;未申报的超预算面进实现段=停卡退回写卡段(写进本卡异常分级 L3)。
|
|
||||||
- 缺本节=卡片不成立;预算节数字与接口块实数的一致性是 grilling 复核门审点(自审七查⑦)。
|
|
||||||
- 生效=文件名日期 ≥2026-10-27;此前卡片属历史留档不回头改。
|
|
||||||
15. **拆分边界纪律(结构类卡必填条款,2026-10-28 用户裁立,判据权威=code-conventions §1.1 拆分判据)**——拆分/收敛/重构类需求卡片必须在设计契约区写明红线条款(卡内写条款,判据定义以 code-conventions 为权威、不复制定文):①每个拆出单元(私有函数族/新件/段件/状态件/参数束)须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载);②拆出单元须有集体身份——命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿(写进本卡异常分级 L3)。先例=迭代 41 两卡 v1.2(核心数据面契约 7/呈现层契约 9)。生效=文件名日期 ≥2026-10-28;此前卡片属历史留档不回头改。
|
|
||||||
16. **验收档申报(必填,2026-11-05 生效)**——卡片头部信息区(与设计事实源声明同区)申报一个验收档:高/中/低。判据=失败代价单维:这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低;一张卡触多档按最高档申报。用户批卡(U0)时确认或改判;档位只调节独立验收审计深度(梯度表=test-conventions §8.7),闸机与 CI 的档位、域划分、全量强制档一概不变。机检=`tools/pipeline_gate.py` 判据 C4:文件名日期 ≥2026-11-05 的卡必含「验收档:高/中/低」申报行;未申报档位的卡(旧卡)按高档全量审计。
|
|
||||||
17. **复核记录(必填,2026-11-05 用户立规)**——本卡经过的对抗复核逐轮登记,五格:轮次|复核者身份(写明未参与本卡撰写,形态=只读子代理或独立会话)|发现(一句话)|去向(四类之一,定义见「纪律」节复核发现四类分流)|处置结果(改了卡内哪一节、退给了哪一段、或用户裁决的结论)。节末另起一行申报复核报告的落盘路径 `reports/复核-<批名>-<日期>.md`。缺本节、或任一条发现没有去向标记=卡片不成立。机检=`tools/pipeline_gate.py` 卡片复核判据(生效=文件名日期 ≥2026-11-06;此前成文的卡属历史留档不回头改)。复核分类得对不对属语义判断,机检只查结构在位与申报可核,语义归复核者与本节申报人。
|
|
||||||
|
|
||||||
## 任务卡写作纪律(2026-10-19 立;任务/步骤规范借自 superpowers:writing-plans,按 g-plan2 实际适配)
|
|
||||||
|
|
||||||
读者画像先立住:T 卡的执行者(/iter 施工方)是没见过这份规格、也没见过邻卡的工程师——他按本项目语言写惯代码,只要给足确切接口、确切测试、确切取值,他就能写对;他不可能知道的是**写卡人定了什么**:动哪些文件、哪些名字与签名、规格里的哪个值、哪条测试证明这张卡成立。把这些写全,其余不代劳。生效=2026-10-19,此前卡片属历史留档不回头改。
|
|
||||||
|
|
||||||
### 卡前·文件结构图
|
|
||||||
|
|
||||||
定义 T 卡前,先把本批新建/修改的文件列全——每个文件一行:路径+职责。边界清晰、一文件一职责;一起改的文件放在一起,按职责切分不按技术层切分;既有代码库跟随既有模式——库内大文件不擅自拆,但本批要改的文件已臃肿到不可单手握住时,把拆分写进本批计划也合理。结构图定分解,T 卡从它生,禁跳图直接列卡。**每个文件行同时标「行为改动/非行为改动」;行为改动行写对应验收对照表行号,定结构图时就确认每个行为改动有验收落点。**结构图与「落位与可复用性预检」节互指:**每个新增件(文件、函数、数据件)在结构图里标「复用既有」或「新增」,标新增的必须能在预检节指到它的「为什么不能复用」理由与落点唯一性核查——两处对不上就是卡片不成立。**
|
|
||||||
|
|
||||||
### 范围检查
|
|
||||||
|
|
||||||
一批规格覆盖多个相互独立的子系统、设计段又没拆开的,建议拆批(roadmap 迭代行内的卡①②③即此机制)——每批各自产出可独立验收的交付物,禁一张大卡混装多个子系统。
|
|
||||||
|
|
||||||
### 任务右尺寸
|
|
||||||
|
|
||||||
一张 T 卡 = 自带一轮测试周期、值得一道独立审查门的最小单位。画界规则:环境搭建、配置、脚手架、文档类步骤折进需要它的交付物那张卡,不单独立卡;只在「审查者可能否决这张而放行隔壁那张」处才切;每张卡以**独立可测的交付物**收尾。本项目铁律「验收测试随对应 T 卡同轮落地」(/iter 纪律)由此获得尺寸依据——卡大到一轮测不完,就是切小了。
|
|
||||||
|
|
||||||
### 步骤粒度
|
|
||||||
|
|
||||||
一步 = 一个动作 + 一个可核查结果;用 `- [ ]` 复选框记步(/iter 逐轮推进对账用)。反例:「实装微光并补断言」是两步(装了两个动作);「改 shader 看效果」不是步(没有可核查结果)。一步禁装第二个动作,禁无可核查结果的描述。
|
|
||||||
|
|
||||||
### 步骤内容四分
|
|
||||||
|
|
||||||
每类步骤只带让它无歧义必需的信息,不多带:
|
|
||||||
|
|
||||||
- **验收步骤**:断言名+断言内容(规格的确切值写进断言,禁「按规格取值」类指代)+测试落点(哪套冒烟段/单元套/探针/闸段)+真实入口(测试从哪个真实入口驱动)+判据绑定面(绑被测改动特有的可观测提交面)。
|
|
||||||
- **实装步骤**:确切签名(名字/参数/返回类型)+文件落点(file:line)+规格钉住的取值;**实现体不写**——签名与验收已定的不写;只有签名和测试都定不了的算法才给代码块,且只给那段算法。
|
|
||||||
- **验证步骤**:跑哪道闸(确切命令)+什么输出算过(期望输出或判据)。
|
|
||||||
- **引用步骤**:引用别卡的接口块,不重复别卡的代码。
|
|
||||||
|
|
||||||
### T 卡间接口声明
|
|
||||||
|
|
||||||
每张 T 卡声明两块——**取用**(本卡从早前卡用什么,带确切签名)与**产出**(后续卡依赖本卡的什么,带确切名字与类型)。/iter 按卡逐轮施工,施工方只见本卡——接口块是邻卡名字与类型的唯一来处;后卡引用的名字必须与早卡定义逐字一致(自审第三查兜这一条)。
|
|
||||||
|
|
||||||
### 禁行句式(不决定任何事的行)
|
|
||||||
|
|
||||||
「TBD」「酌情处理」「适当优化」「如上所述的测试」「后续批再说」、任何本批任务未定义的类型或函数名——这些行不决定任何事,留在卡里只能让实施期自由发挥。计划 = 实施者无法独自做出的决策集合;计划比它描述的规格还长 = 在抄写程序,不是计划。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实中文,禁自造缩写与名词堆叠;仓库既有术语照用。
|
|
||||||
- 估时给区间+切分预案(超软盒预挂)。
|
|
||||||
- **任务卡自审七查(2026-10-19 立五查,2026-10-21 补第六查,2026-10-27 补第七查;借自 superpowers:writing-plans 自审节适配)**:任务卡写完、交 grilling 复核前必跑——①规格覆盖:逐条过「目标与完成定义」的规格项/需求点,每条都能指到一张 T 卡,并指到验收对照表的一行,指不到的补卡/补行;②步骤扫描:每步只能让实施者写出一个合情合理的东西、且一步不多带——不决定事的行是缺口,签名与验收已定的函数体是抄写,两样都就地改;③类型一致性:后卡引用的签名/属性名与早卡定义逐字一致;④审查焦点+改动覆盖:规格暗示、但没有任何 T 卡测试覆盖的失败模式——对照「验证闸」节逐条过,把最可能坑到玩家的列出来、挂到责任 T 卡补验收条目;同时核文件结构图里的每个行为改动都能指到对照表行,指不到的补测试或标非行为改动;查完确实没有才写「无」;⑤篇幅比例:卡片比它实现的规格长几倍=在抄程序,代码块占大半就把函数体换成签名+断言名,再验每步仍无歧义;⑥落位与复用(2026-10-21 用户立规):逐条过本批每个新增文件、新增函数、新增数据件——**盘上是否已有做同样事的东西(grep 同职责实现、grep 同名与同义标识符)?该功能是否已有唯一落点?同一事实是否只在一处定义、有无 helper 散落「就近的文件」?新增件之间的调用路径与跨层出口是否显式声明?**答案写进卡内「落位与可复用性预检」节并与文件结构图对得上(标「新增」的必须能指到不能复用的理由);对不上就改成复用既有件、或把重复的落点并进唯一一处;⑦指标预算(2026-10-27 迭代 39 实证立规):逐条过本批每个新增文件——「实现规范预算」节三查一查的数字与接口块/文件结构图实数一致(数接口块 func 行、数成员 var 行、迁移函数逐个对 `tools/gdstyle_baseline.txt` 源键),少报、漏对账或预算节缺失的回炉补节,存量触面写明「S13 键只降不升」预期。七查发现问题就地改完再交复核,不用再自审一轮;自审在 grilling 之前跑,不替代 grilling 对抗复核。
|
|
||||||
- **grilling 复核门(2026-10-10 用户立规;2026-11-05 补处置登记义务)**:卡片成文后必经 grilling 多轮复核,裁决全落、零待裁点,卡片才算成立;每轮发现与处置逐条写进卡内「复核记录」节(必备结构第 17 节)。**复核审点含验收清单:逐需求点过「测什么/怎么测/谁验」三问,答不上来的需求点回炉(2026-10-11 用户立规);并核对照表两端是否对得上、真实入口是否绕过改动点、判据绑定面是否绑被测改动特有的可观测提交面(2026-10-21 立);再核「落位与可复用性预检」节与文件结构图是否对得上——每个标「新增」的件都要有不能复用的理由与唯一落点,给不出的回炉改成复用(2026-10-21 用户立规);再核「实现规范预算」节数字与接口块/文件结构图实数一致——少报方法数、漏迁移函数对账、预算节缺失的回炉(2026-10-27 用户立规);再核「拆分边界纪律」条款在位、每个拆出单元有职责语句与集体身份——凑计数袋形态回炉(2026-10-28 用户立规);再核引擎技术面三查(接口与边界见下条):①卡内签名与实装步骤涉及的 Godot API 在 4.7 存在且行为如卡所述;②实装步骤不踩 godot-master NEVER list 与 Gotchas;③热路径/批量/线程形态匹配其性能预算——产出发现清单,逐条按「复核发现四类分流」处置(2026-11-04 用户立规;2026-11-05 补去向口径:只有待裁类归用户裁决,自判与补写两类由复核者自己落卡,退回上游类退对应段)。**
|
|
||||||
- **引擎技术面复核接口(2026-11-04 立,godot-master 窄口径接入)**:本条是 req-card 对 godot-master 技能的唯一引用面,四条收窄——①取用白名单:只取其 SKILL.md 内三块——Part 4 NEVER list(33 条)、Part 8 Gotchas(8 条)、Part 5 性能预算表;卡涉及具体领域(物理/动画/UI/存档/寻路等)时另按其 Part 2 决策矩阵加载与改动面直接相关的 reference,至多 2 个;禁加载工作流链、genre 蓝图与其余整库。②权威边界:只取引擎事实(API 行为、已知坑、预算数字),不取其工程组织主张(目录结构、autoload/signal bus 模式)——架构/分层/数值判断权威仍是本项目 architecture.md、code-conventions 与 data/tables;两者冲突时项目规范赢,冲突本身当轮作为待裁点呈报用户,禁按任一方默默改卡。③输出形态:复核产出=发现清单(卡内位置+违反条目号如 NEVER-7/Gotcha-1+一句依据)+四类去向之一,其中待裁与退回上游两类不改写方案,自判与补写两类的处置就是把卡改对;引用条目须给编号,判不了标「未判」禁硬判。④成本约束:成本地板=hub SKILL.md 单文件;卡内 T 步不含节点/信号/Tween/Resource/物理/线程/渲染面时只跑②清单对照,不加载领域 reference;每个领域 reference 一轮复核只加载一次。
|
|
||||||
- **复核发现四类分流(2026-11-05 用户立规)**:复核者每拿到一条发现,先问「答案从哪来」,四选一登记去向(写进卡内「复核记录」节的去向格);前两类的处置由复核者自己完成,禁转成问句向用户求裁:
|
|
||||||
- **自判**——查权威文档或查代码现状就能得到唯一答案。权威文档=本卡设计事实源那一份 owner 文档+`design/engineering/` 五份规约与 architecture+术语表+在册先例(git 提交信息与库内已入库实现)。处置=复核者当场下结论并把卡改成那个答案,处置格写结论+`文件:行号` 依据。**禁问用户**:这类问题问出去等于把可查的事推给人决策。
|
|
||||||
- **补写**——权威文档不反对,但卡里漏写:具体名字与参数、测试落点、判据绑定面、规格钉住的取值、实现规范预算数字。处置=回炉补进对应节(判据形态照「任务卡写作纪律」的实装步骤与「禁行句式」两条——卡里不许留没定义的名字)。**禁问用户**:漏写不是分叉,问了等于让用户替写卡段补卡。
|
|
||||||
- **待裁**——几种做法都不违反权威文档、代价不同、影响玩法或体验取向。这才是待裁点:全部备选案并列+各自代价+推荐案与淘汰依据交用户裁决(口径同 process-conventions §3 第 2 条与 doc-design 的禁代裁条)。**必须问用户**。
|
|
||||||
- **退回上游**——写卡段动不了的未闭合或规范冲突,三个退口:①文档设计线未闭合(缺设计定稿,或 owner 文档仍留未裁的设计点)退 doc-design;②美术设计线未闭合(样张未过审或 art-bible 条款缺)退 asset-ingest,两线并列时退未闭合那段(判据沿用第〇步的拒写卡分流,不另立标准);③架构或代码规范本身有问题(architecture 与 code-conventions/test-conventions 互相冲突、缺项、或与卡片要求打架)退 `design/engineering/` 规约修订通道(归口 doc-design),随呈报写清哪两条冲突、两种改法各自的代价。处置=停笔呈报,禁在卡内绕开规范自造第三条路(形态同第 13 节「机检键与卡片契约互斥时一律停卡呈报」)。边界:owner 文档给了取值域没给具体值=属退口①,既不由复核者自钉,也不当实现问题问用户。
|
|
||||||
- **两条配套细则(2026-11-05 拿两份双审报告 56 条发现回放后补)**:①一条发现只记一个主去向,连带动作走既有通道不另立第五类——要改文档面句子的列进「关联文档同步面」当反哺点,本卡范围外要日后做的登记待办清单一条;②「判定不改」也是自判,处置格写「不改+依据」(依据可以是既有裁决记录属历史留档、命中面不涉本批、或既有规范本就如此),观察类发现照样要在记录里占一行。
|
|
||||||
- **写卡段的完成判据与呈报口径(2026-11-05 用户立规)**:卡片成文不是终点。固定顺序=自审七查 → 派未参与撰写的只读复核者做对抗复核(子代理或独立会话,至少一轮)→ 发现逐条四类分流处置 → 待裁类全部呈完且用户裁决通过 → 处置逐条写进「复核记录」节 → 待办清单状态推进「已写卡」并把复核报告路径同批登记 → 提交 → 合回(收口六步细则见 process-conventions §1 第 2 条,本文不重列)。**这条顺序没走完,禁对用户说「完成」「做完了」「卡片已写好」这类收工表述**——此时只能报「卡片成文、复核未跑完」并点明缺哪一步。理由:commit 点零钩子检查、全量验证在合回后的远端 CI,卡片是否真被复核过机器看不出来,只由「复核记录」节+流水线闸该节判据+本条呈报口径三处兜住。
|
|
||||||
- **卡片落盘时点(2026-11-04 用户裁立;2026-11-05 补凭据形态)**:收口序列(冻结→件核→并 master→删区,车道铁律 §1)只对**完成态事项**执行;写卡段的完成判据=grilling 复核裁决全落+用户裁决通过(卡片成立)。复核凭据=卡内「复核记录」节+该节申报的复核报告文件真实存在,两者缺一律按未完成态处置,禁落 commit。成文未复核的卡片**禁**套用收口序列——卡片成文、grilling 多轮改稿与待办清单状态推进一律只存在于 worktree,master 不落未成立卡;成立后同 worktree 一次合回(合回即删区照车道铁律)。已合回卡片若复核产生修订,修订版在新 worktree 落笔再走成立裁决与合回,禁在 master 直改卡片。**复核先于提交(2026-11-05 用户裁)**:grilling 复核跑完、缺陷清单裁完之前禁把卡片落 commit——先复核、后提交、再合回;细则同 `design/engineering/process-conventions.md` §1 第 2 条「卡片复核前置判据」。
|
|
||||||
- **待办清单状态回写义务(2026-10-10 用户立规;2026-10-18 按五段流水线换代;2026-11-05 补复核凭据登记)**:卡片写完必把第〇步定位到的待办清单条目状态推进为「已写卡(`reports/` 下需求卡片路径)」,并把「复核记录」节申报的复核报告路径同批登记进实况的关联文档清单(判据=doc-conventions §12.1「已写卡」证据项)——条目在登记段已存在,禁另立重复条目,防遗忘义务由状态承载;原「待编入/已编入/已开工/已入库」旧状态词停用,编入迭代后由编排段(iter-plan)记「已编迭代 N」;实现批完成入库后按待办清单退役规则整条删除。
|
|
||||||
- 需求卡片是中间文档:批入库后按「吸收即死」退役,结论迁现行事实源(GDD/待办清单/roadmap)。
|
|
||||||
- 开工令与执行归 /iter 技能(需求卡片统一经迭代编排执行,2026-10-25 用户裁:无迭代外执行通道);需求卡片写完呈用户裁决后才可开工。
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
name: tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
python-version: ["3.9", "3.12"]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python-version }}
|
|
||||||
- name: Unit tests
|
|
||||||
run: python -m unittest discover -s tests -v
|
|
||||||
- name: The project's own documents must pass the checker
|
|
||||||
run: python tools/check.py --strict README.md SKILL.md 规范.md examples/after.md docs/校准报告.md tools/calibration/README.md
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
.pytest_cache/
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# 校准语料和中间结果,不入库
|
|
||||||
.data/
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2026 mzopedia
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,396 +0,0 @@
|
|||||||
Attribution 4.0 International
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
|
||||||
does not provide legal services or legal advice. Distribution of
|
|
||||||
Creative Commons public licenses does not create a lawyer-client or
|
|
||||||
other relationship. Creative Commons makes its licenses and related
|
|
||||||
information available on an "as-is" basis. Creative Commons gives no
|
|
||||||
warranties regarding its licenses, any material licensed under their
|
|
||||||
terms and conditions, or any related information. Creative Commons
|
|
||||||
disclaims all liability for damages resulting from their use to the
|
|
||||||
fullest extent possible.
|
|
||||||
|
|
||||||
Using Creative Commons Public Licenses
|
|
||||||
|
|
||||||
Creative Commons public licenses provide a standard set of terms and
|
|
||||||
conditions that creators and other rights holders may use to share
|
|
||||||
original works of authorship and other material subject to copyright
|
|
||||||
and certain other rights specified in the public license below. The
|
|
||||||
following considerations are for informational purposes only, are not
|
|
||||||
exhaustive, and do not form part of our licenses.
|
|
||||||
|
|
||||||
Considerations for licensors: Our public licenses are
|
|
||||||
intended for use by those authorized to give the public
|
|
||||||
permission to use material in ways otherwise restricted by
|
|
||||||
copyright and certain other rights. Our licenses are
|
|
||||||
irrevocable. Licensors should read and understand the terms
|
|
||||||
and conditions of the license they choose before applying it.
|
|
||||||
Licensors should also secure all rights necessary before
|
|
||||||
applying our licenses so that the public can reuse the
|
|
||||||
material as expected. Licensors should clearly mark any
|
|
||||||
material not subject to the license. This includes other CC-
|
|
||||||
licensed material, or material used under an exception or
|
|
||||||
limitation to copyright. More considerations for licensors:
|
|
||||||
wiki.creativecommons.org/Considerations_for_licensors
|
|
||||||
|
|
||||||
Considerations for the public: By using one of our public
|
|
||||||
licenses, a licensor grants the public permission to use the
|
|
||||||
licensed material under specified terms and conditions. If
|
|
||||||
the licensor's permission is not necessary for any reason--for
|
|
||||||
example, because of any applicable exception or limitation to
|
|
||||||
copyright--then that use is not regulated by the license. Our
|
|
||||||
licenses grant only permissions under copyright and certain
|
|
||||||
other rights that a licensor has authority to grant. Use of
|
|
||||||
the licensed material may still be restricted for other
|
|
||||||
reasons, including because others have copyright or other
|
|
||||||
rights in the material. A licensor may make special requests,
|
|
||||||
such as asking that all changes be marked or described.
|
|
||||||
Although not required by our licenses, you are encouraged to
|
|
||||||
respect those requests where reasonable. More considerations
|
|
||||||
for the public:
|
|
||||||
wiki.creativecommons.org/Considerations_for_licensees
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Creative Commons Attribution 4.0 International Public License
|
|
||||||
|
|
||||||
By exercising the Licensed Rights (defined below), You accept and agree
|
|
||||||
to be bound by the terms and conditions of this Creative Commons
|
|
||||||
Attribution 4.0 International Public License ("Public License"). To the
|
|
||||||
extent this Public License may be interpreted as a contract, You are
|
|
||||||
granted the Licensed Rights in consideration of Your acceptance of
|
|
||||||
these terms and conditions, and the Licensor grants You such rights in
|
|
||||||
consideration of benefits the Licensor receives from making the
|
|
||||||
Licensed Material available under these terms and conditions.
|
|
||||||
|
|
||||||
|
|
||||||
Section 1 -- Definitions.
|
|
||||||
|
|
||||||
a. Adapted Material means material subject to Copyright and Similar
|
|
||||||
Rights that is derived from or based upon the Licensed Material
|
|
||||||
and in which the Licensed Material is translated, altered,
|
|
||||||
arranged, transformed, or otherwise modified in a manner requiring
|
|
||||||
permission under the Copyright and Similar Rights held by the
|
|
||||||
Licensor. For purposes of this Public License, where the Licensed
|
|
||||||
Material is a musical work, performance, or sound recording,
|
|
||||||
Adapted Material is always produced where the Licensed Material is
|
|
||||||
synched in timed relation with a moving image.
|
|
||||||
|
|
||||||
b. Adapter's License means the license You apply to Your Copyright
|
|
||||||
and Similar Rights in Your contributions to Adapted Material in
|
|
||||||
accordance with the terms and conditions of this Public License.
|
|
||||||
|
|
||||||
c. Copyright and Similar Rights means copyright and/or similar rights
|
|
||||||
closely related to copyright including, without limitation,
|
|
||||||
performance, broadcast, sound recording, and Sui Generis Database
|
|
||||||
Rights, without regard to how the rights are labeled or
|
|
||||||
categorized. For purposes of this Public License, the rights
|
|
||||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
|
||||||
Rights.
|
|
||||||
|
|
||||||
d. Effective Technological Measures means those measures that, in the
|
|
||||||
absence of proper authority, may not be circumvented under laws
|
|
||||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
|
||||||
Treaty adopted on December 20, 1996, and/or similar international
|
|
||||||
agreements.
|
|
||||||
|
|
||||||
e. Exceptions and Limitations means fair use, fair dealing, and/or
|
|
||||||
any other exception or limitation to Copyright and Similar Rights
|
|
||||||
that applies to Your use of the Licensed Material.
|
|
||||||
|
|
||||||
f. Licensed Material means the artistic or literary work, database,
|
|
||||||
or other material to which the Licensor applied this Public
|
|
||||||
License.
|
|
||||||
|
|
||||||
g. Licensed Rights means the rights granted to You subject to the
|
|
||||||
terms and conditions of this Public License, which are limited to
|
|
||||||
all Copyright and Similar Rights that apply to Your use of the
|
|
||||||
Licensed Material and that the Licensor has authority to license.
|
|
||||||
|
|
||||||
h. Licensor means the individual(s) or entity(ies) granting rights
|
|
||||||
under this Public License.
|
|
||||||
|
|
||||||
i. Share means to provide material to the public by any means or
|
|
||||||
process that requires permission under the Licensed Rights, such
|
|
||||||
as reproduction, public display, public performance, distribution,
|
|
||||||
dissemination, communication, or importation, and to make material
|
|
||||||
available to the public including in ways that members of the
|
|
||||||
public may access the material from a place and at a time
|
|
||||||
individually chosen by them.
|
|
||||||
|
|
||||||
j. Sui Generis Database Rights means rights other than copyright
|
|
||||||
resulting from Directive 96/9/EC of the European Parliament and of
|
|
||||||
the Council of 11 March 1996 on the legal protection of databases,
|
|
||||||
as amended and/or succeeded, as well as other essentially
|
|
||||||
equivalent rights anywhere in the world.
|
|
||||||
|
|
||||||
k. You means the individual or entity exercising the Licensed Rights
|
|
||||||
under this Public License. Your has a corresponding meaning.
|
|
||||||
|
|
||||||
|
|
||||||
Section 2 -- Scope.
|
|
||||||
|
|
||||||
a. License grant.
|
|
||||||
|
|
||||||
1. Subject to the terms and conditions of this Public License,
|
|
||||||
the Licensor hereby grants You a worldwide, royalty-free,
|
|
||||||
non-sublicensable, non-exclusive, irrevocable license to
|
|
||||||
exercise the Licensed Rights in the Licensed Material to:
|
|
||||||
|
|
||||||
a. reproduce and Share the Licensed Material, in whole or
|
|
||||||
in part; and
|
|
||||||
|
|
||||||
b. produce, reproduce, and Share Adapted Material.
|
|
||||||
|
|
||||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
|
||||||
Exceptions and Limitations apply to Your use, this Public
|
|
||||||
License does not apply, and You do not need to comply with
|
|
||||||
its terms and conditions.
|
|
||||||
|
|
||||||
3. Term. The term of this Public License is specified in Section
|
|
||||||
6(a).
|
|
||||||
|
|
||||||
4. Media and formats; technical modifications allowed. The
|
|
||||||
Licensor authorizes You to exercise the Licensed Rights in
|
|
||||||
all media and formats whether now known or hereafter created,
|
|
||||||
and to make technical modifications necessary to do so. The
|
|
||||||
Licensor waives and/or agrees not to assert any right or
|
|
||||||
authority to forbid You from making technical modifications
|
|
||||||
necessary to exercise the Licensed Rights, including
|
|
||||||
technical modifications necessary to circumvent Effective
|
|
||||||
Technological Measures. For purposes of this Public License,
|
|
||||||
simply making modifications authorized by this Section 2(a)
|
|
||||||
(4) never produces Adapted Material.
|
|
||||||
|
|
||||||
5. Downstream recipients.
|
|
||||||
|
|
||||||
a. Offer from the Licensor -- Licensed Material. Every
|
|
||||||
recipient of the Licensed Material automatically
|
|
||||||
receives an offer from the Licensor to exercise the
|
|
||||||
Licensed Rights under the terms and conditions of this
|
|
||||||
Public License.
|
|
||||||
|
|
||||||
b. No downstream restrictions. You may not offer or impose
|
|
||||||
any additional or different terms or conditions on, or
|
|
||||||
apply any Effective Technological Measures to, the
|
|
||||||
Licensed Material if doing so restricts exercise of the
|
|
||||||
Licensed Rights by any recipient of the Licensed
|
|
||||||
Material.
|
|
||||||
|
|
||||||
6. No endorsement. Nothing in this Public License constitutes or
|
|
||||||
may be construed as permission to assert or imply that You
|
|
||||||
are, or that Your use of the Licensed Material is, connected
|
|
||||||
with, or sponsored, endorsed, or granted official status by,
|
|
||||||
the Licensor or others designated to receive attribution as
|
|
||||||
provided in Section 3(a)(1)(A)(i).
|
|
||||||
|
|
||||||
b. Other rights.
|
|
||||||
|
|
||||||
1. Moral rights, such as the right of integrity, are not
|
|
||||||
licensed under this Public License, nor are publicity,
|
|
||||||
privacy, and/or other similar personality rights; however, to
|
|
||||||
the extent possible, the Licensor waives and/or agrees not to
|
|
||||||
assert any such rights held by the Licensor to the limited
|
|
||||||
extent necessary to allow You to exercise the Licensed
|
|
||||||
Rights, but not otherwise.
|
|
||||||
|
|
||||||
2. Patent and trademark rights are not licensed under this
|
|
||||||
Public License.
|
|
||||||
|
|
||||||
3. To the extent possible, the Licensor waives any right to
|
|
||||||
collect royalties from You for the exercise of the Licensed
|
|
||||||
Rights, whether directly or through a collecting society
|
|
||||||
under any voluntary or waivable statutory or compulsory
|
|
||||||
licensing scheme. In all other cases the Licensor expressly
|
|
||||||
reserves any right to collect such royalties.
|
|
||||||
|
|
||||||
|
|
||||||
Section 3 -- License Conditions.
|
|
||||||
|
|
||||||
Your exercise of the Licensed Rights is expressly made subject to the
|
|
||||||
following conditions.
|
|
||||||
|
|
||||||
a. Attribution.
|
|
||||||
|
|
||||||
1. If You Share the Licensed Material (including in modified
|
|
||||||
form), You must:
|
|
||||||
|
|
||||||
a. retain the following if it is supplied by the Licensor
|
|
||||||
with the Licensed Material:
|
|
||||||
|
|
||||||
i. identification of the creator(s) of the Licensed
|
|
||||||
Material and any others designated to receive
|
|
||||||
attribution, in any reasonable manner requested by
|
|
||||||
the Licensor (including by pseudonym if
|
|
||||||
designated);
|
|
||||||
|
|
||||||
ii. a copyright notice;
|
|
||||||
|
|
||||||
iii. a notice that refers to this Public License;
|
|
||||||
|
|
||||||
iv. a notice that refers to the disclaimer of
|
|
||||||
warranties;
|
|
||||||
|
|
||||||
v. a URI or hyperlink to the Licensed Material to the
|
|
||||||
extent reasonably practicable;
|
|
||||||
|
|
||||||
b. indicate if You modified the Licensed Material and
|
|
||||||
retain an indication of any previous modifications; and
|
|
||||||
|
|
||||||
c. indicate the Licensed Material is licensed under this
|
|
||||||
Public License, and include the text of, or the URI or
|
|
||||||
hyperlink to, this Public License.
|
|
||||||
|
|
||||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
|
||||||
reasonable manner based on the medium, means, and context in
|
|
||||||
which You Share the Licensed Material. For example, it may be
|
|
||||||
reasonable to satisfy the conditions by providing a URI or
|
|
||||||
hyperlink to a resource that includes the required
|
|
||||||
information.
|
|
||||||
|
|
||||||
3. If requested by the Licensor, You must remove any of the
|
|
||||||
information required by Section 3(a)(1)(A) to the extent
|
|
||||||
reasonably practicable.
|
|
||||||
|
|
||||||
4. If You Share Adapted Material You produce, the Adapter's
|
|
||||||
License You apply must not prevent recipients of the Adapted
|
|
||||||
Material from complying with this Public License.
|
|
||||||
|
|
||||||
|
|
||||||
Section 4 -- Sui Generis Database Rights.
|
|
||||||
|
|
||||||
Where the Licensed Rights include Sui Generis Database Rights that
|
|
||||||
apply to Your use of the Licensed Material:
|
|
||||||
|
|
||||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
|
||||||
to extract, reuse, reproduce, and Share all or a substantial
|
|
||||||
portion of the contents of the database;
|
|
||||||
|
|
||||||
b. if You include all or a substantial portion of the database
|
|
||||||
contents in a database in which You have Sui Generis Database
|
|
||||||
Rights, then the database in which You have Sui Generis Database
|
|
||||||
Rights (but not its individual contents) is Adapted Material; and
|
|
||||||
|
|
||||||
c. You must comply with the conditions in Section 3(a) if You Share
|
|
||||||
all or a substantial portion of the contents of the database.
|
|
||||||
|
|
||||||
For the avoidance of doubt, this Section 4 supplements and does not
|
|
||||||
replace Your obligations under this Public License where the Licensed
|
|
||||||
Rights include other Copyright and Similar Rights.
|
|
||||||
|
|
||||||
|
|
||||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
|
||||||
|
|
||||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
|
||||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
|
||||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
|
||||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
|
||||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
|
||||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
|
||||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
|
||||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
|
||||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
|
||||||
|
|
||||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
|
||||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
|
||||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
|
||||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
|
||||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
|
||||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
|
||||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
|
||||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
|
||||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
|
||||||
|
|
||||||
c. The disclaimer of warranties and limitation of liability provided
|
|
||||||
above shall be interpreted in a manner that, to the extent
|
|
||||||
possible, most closely approximates an absolute disclaimer and
|
|
||||||
waiver of all liability.
|
|
||||||
|
|
||||||
|
|
||||||
Section 6 -- Term and Termination.
|
|
||||||
|
|
||||||
a. This Public License applies for the term of the Copyright and
|
|
||||||
Similar Rights licensed here. However, if You fail to comply with
|
|
||||||
this Public License, then Your rights under this Public License
|
|
||||||
terminate automatically.
|
|
||||||
|
|
||||||
b. Where Your right to use the Licensed Material has terminated under
|
|
||||||
Section 6(a), it reinstates:
|
|
||||||
|
|
||||||
1. automatically as of the date the violation is cured, provided
|
|
||||||
it is cured within 30 days of Your discovery of the
|
|
||||||
violation; or
|
|
||||||
|
|
||||||
2. upon express reinstatement by the Licensor.
|
|
||||||
|
|
||||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
|
||||||
right the Licensor may have to seek remedies for Your violations
|
|
||||||
of this Public License.
|
|
||||||
|
|
||||||
c. For the avoidance of doubt, the Licensor may also offer the
|
|
||||||
Licensed Material under separate terms or conditions or stop
|
|
||||||
distributing the Licensed Material at any time; however, doing so
|
|
||||||
will not terminate this Public License.
|
|
||||||
|
|
||||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
|
||||||
License.
|
|
||||||
|
|
||||||
|
|
||||||
Section 7 -- Other Terms and Conditions.
|
|
||||||
|
|
||||||
a. The Licensor shall not be bound by any additional or different
|
|
||||||
terms or conditions communicated by You unless expressly agreed.
|
|
||||||
|
|
||||||
b. Any arrangements, understandings, or agreements regarding the
|
|
||||||
Licensed Material not stated herein are separate from and
|
|
||||||
independent of the terms and conditions of this Public License.
|
|
||||||
|
|
||||||
|
|
||||||
Section 8 -- Interpretation.
|
|
||||||
|
|
||||||
a. For the avoidance of doubt, this Public License does not, and
|
|
||||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
|
||||||
conditions on any use of the Licensed Material that could lawfully
|
|
||||||
be made without permission under this Public License.
|
|
||||||
|
|
||||||
b. To the extent possible, if any provision of this Public License is
|
|
||||||
deemed unenforceable, it shall be automatically reformed to the
|
|
||||||
minimum extent necessary to make it enforceable. If the provision
|
|
||||||
cannot be reformed, it shall be severed from this Public License
|
|
||||||
without affecting the enforceability of the remaining terms and
|
|
||||||
conditions.
|
|
||||||
|
|
||||||
c. No term or condition of this Public License will be waived and no
|
|
||||||
failure to comply consented to unless expressly agreed to by the
|
|
||||||
Licensor.
|
|
||||||
|
|
||||||
d. Nothing in this Public License constitutes or may be interpreted
|
|
||||||
as a limitation upon, or waiver of, any privileges and immunities
|
|
||||||
that apply to the Licensor or You, including from the legal
|
|
||||||
processes of any jurisdiction or authority.
|
|
||||||
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
Creative Commons is not a party to its public
|
|
||||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
|
||||||
its public licenses to material it publishes and in those instances
|
|
||||||
will be considered the “Licensor.” The text of the Creative Commons
|
|
||||||
public licenses is dedicated to the public domain under the CC0 Public
|
|
||||||
Domain Dedication. Except for the limited purpose of indicating that
|
|
||||||
material is shared under a Creative Commons public license or as
|
|
||||||
otherwise permitted by the Creative Commons policies published at
|
|
||||||
creativecommons.org/policies, Creative Commons does not authorize the
|
|
||||||
use of the trademark "Creative Commons" or any other trademark or logo
|
|
||||||
of Creative Commons without its prior written consent including,
|
|
||||||
without limitation, in connection with any unauthorized modifications
|
|
||||||
to any of its public licenses or any other arrangements,
|
|
||||||
understandings, or agreements concerning use of licensed material. For
|
|
||||||
the avoidance of doubt, this paragraph does not form part of the
|
|
||||||
public licenses.
|
|
||||||
|
|
||||||
Creative Commons may be contacted at creativecommons.org.
|
|
||||||
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
# Simplified Technical Chinese
|
|
||||||
|
|
||||||
简明技术中文 (STC). A controlled language for Chinese technical writing: procedures, API docs, troubleshooting guides, and explanatory answers from LLMs. The goal is that a reader gets it right on the first read.
|
|
||||||
|
|
||||||
It follows the method of [ASD-STE100](https://www.asd-ste100.org/) (Simplified Technical English): a numbered rule set, a controlled vocabulary where one meaning has one word, and sentence constraints a script can check. It is not a translation of STE and is not affiliated with ASD.
|
|
||||||
|
|
||||||
The Chinese README is [README.md](README.md). The spec and vocabulary are in Chinese, because they are about Chinese.
|
|
||||||
|
|
||||||
## Why
|
|
||||||
|
|
||||||
In October 2026 Andrej Karpathy [posted](https://x.com/karpathy/status/2105819303471976479) that asking an LLM to explain things in ASD-STE100 makes the output far more readable. STE is a controlled English built for aircraft maintenance manuals: 53 writing rules plus a dictionary of about 900 words, each with one meaning.
|
|
||||||
|
|
||||||
Chinese had no equivalent. The existing Chinese style guides cover typography, punctuation and document structure. None of them does the core of STE: numbered rules, a controlled vocabulary, and sentence constraints that a tool can enforce. This project fills that gap.
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
Before, from [examples/before.md](examples/before.md):
|
|
||||||
|
|
||||||
> 用户首先需要登陆到目标服务器,然后切换到 /opt 目录并且创建一个用于存放采集器配置文件以及运行时产生的临时数据的工作目录。
|
|
||||||
>
|
|
||||||
> *"The user first needs to log in [misspelt] to the target server, then switch to the /opt directory and also create a working directory that is used for storing the collector's configuration files as well as the temporary data produced at runtime."*
|
|
||||||
|
|
||||||
After, from [examples/after.md](examples/after.md):
|
|
||||||
|
|
||||||
> 1. 登录目标服务器。 *Log in to the target server.*
|
|
||||||
> 2. 切换到 `/opt` 目录。 *Change to the `/opt` directory.*
|
|
||||||
> 3. 创建工作目录 `/opt/collector`。工作目录存放配置文件和临时数据。 *Create the working directory `/opt/collector`. It holds the configuration files and temporary data.*
|
|
||||||
|
|
||||||
What the checker says about the "before" sentence:
|
|
||||||
|
|
||||||
```text
|
|
||||||
examples/before.md:11: [1.3][必须] 禁用词「登陆」,改用:登录 # wrong character for "log in"
|
|
||||||
examples/before.md:11: [2.1][必须] 操作句 56 字,不超过 30 字 # instruction is 56 units, limit 30
|
|
||||||
examples/before.md:11: [4.1][建议] 禁用词「然后」,改用:拆成编号步骤 # "then": split into numbered steps (advisory)
|
|
||||||
examples/before.md:11: [4.1][必须] 禁用词「并且」,改用:拆句 # "and also": split the sentence
|
|
||||||
```
|
|
||||||
|
|
||||||
The whole "before" document has 34 must-fix findings. The rewrite has 0.
|
|
||||||
|
|
||||||
## What is in the box
|
|
||||||
|
|
||||||
| File | Content |
|
|
||||||
| --- | --- |
|
|
||||||
| [规范.md](规范.md) | The rules. 6 sections, 40 rules, each with a rejected and an approved example. Two levels: must and should |
|
|
||||||
| [词表.md](词表.md) | The vocabulary. Banned words with replacements, a one-meaning-one-word table, and meaning restrictions on common verbs. About 150 entries |
|
|
||||||
| [tools/check.py](tools/check.py) | The checker. Zero dependencies, Python 3.9+. It reads the vocabulary tables straight from the Markdown |
|
|
||||||
| [SKILL.md](SKILL.md) | Agent skill for Claude Code, Codex, Cursor and others |
|
|
||||||
| [examples/](examples/) | A full before/after rewrite |
|
|
||||||
|
|
||||||
The rules that do most of the work:
|
|
||||||
|
|
||||||
- One concept, one word, for the whole document.
|
|
||||||
- No 进行 / 加以 + verb (the Chinese equivalent of "perform an installation"). Use the verb.
|
|
||||||
- Instructions: at most 30 units. Descriptions: at most 40. A unit is one Chinese character, or one Latin word or number.
|
|
||||||
- Instructions are imperatives that start with the verb. No 请 ("please"), no 您 ("you"), no "the user needs to".
|
|
||||||
- Conditions before actions. Warnings in their own paragraph, before the step they apply to.
|
|
||||||
- No 以上 / 以下 after a number (Chinese "and above / and below" is ambiguous about the endpoint). Write 大于 / 不小于 ("greater than / not less than").
|
|
||||||
- 打开 ("open") is only for files, windows and pages. Features are 启用 ("enabled"), programs are 启动 ("started").
|
|
||||||
- 可以 only means "may". Capability is 支持 ("supports").
|
|
||||||
|
|
||||||
Rules that are specific to Chinese and have no STE counterpart: nominalised verbs, long pre-nominal modifiers (the 的 chains), the endpoint ambiguity of 以上/以下, the permission/ability ambiguity of 可以, and relative time words. The mapping to STE is in appendix B of the spec.
|
|
||||||
|
|
||||||
## Use it with an agent
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npx skills add mzopedia/simplified-technical-chinese
|
|
||||||
```
|
|
||||||
|
|
||||||
Or copy the repository into your agent's skill folder. For Claude Code:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone --depth 1 https://github.com/mzopedia/simplified-technical-chinese.git ~/.claude/skills/simplified-technical-chinese
|
|
||||||
```
|
|
||||||
|
|
||||||
Without the skill, paste this into the system prompt. It is the "normal mode", roughly Karpathy's "80% of the way to STE":
|
|
||||||
|
|
||||||
```text
|
|
||||||
用简明技术中文回答。规则:一句只说一件事,操作句不超过 30 字,描述句不超过 40 字;操作步骤用编号列表,动词开头,不写「请」「您」;用主动句;条件写在动作前面;一个概念全文只用一个词;不用「进行」「相关」「等」「以上」「尽快」「大概」;不用反问和感叹;数字后不用「以上」「以下」,写「大于」「不小于」。
|
|
||||||
```
|
|
||||||
|
|
||||||
For the full rule set, give the model [规范.md](规范.md).
|
|
||||||
|
|
||||||
## The checker
|
|
||||||
|
|
||||||
```text
|
|
||||||
python3 tools/check.py file.md [more files]
|
|
||||||
--strict exit 1 when there is any must-level finding
|
|
||||||
--json JSON output
|
|
||||||
--kind 操作|描述 force one sentence type; use 描述 for chat answers
|
|
||||||
--max-op 30 unit limit for instructions
|
|
||||||
--max-desc 40 unit limit for descriptions
|
|
||||||
```
|
|
||||||
|
|
||||||
It reliably catches: banned words, rejected synonyms, sentence and paragraph length, passive voice and modal / degree / estimate words inside instructions, trailing conditions, double negation, open-ended lists (…等), relative dates, Chinese numerals, "reduced by N times", questions and exclamations.
|
|
||||||
|
|
||||||
It cannot judge facts, term choice, logical order, meaning restrictions, modifier length, pronoun clarity, acronym consistency, or warnings and reasons inside steps. Those checks scored too low on real documents during calibration and now live only in the spec text, for humans. See [docs/校准报告.md](docs/校准报告.md). It treats numbered list items as instructions. Every finding needs a human.
|
|
||||||
|
|
||||||
It skips code, inline code, HTML comments, text inside 「」 (UI labels), YAML front matter, lines that start with 不批准 ("rejected:"), and anything between `<!-- stc:off -->` and `<!-- stc:on -->`.
|
|
||||||
|
|
||||||
## Status
|
|
||||||
|
|
||||||
Version 0.2. The rules, the thresholds and the auto-checked vocabulary were calibrated on 3.5 million characters of real Chinese technical documentation (TiDB, Kubernetes, MDN, Vue, Vite, Ant Design, the Rust book and the ES6 tutorial, 2856 files): every rule the checker enforces was sampled and judged on real text, and the ones that were wrong more often than right were removed from the checker. Warnings on good documents dropped from 194 to 88 per 10,000 characters; more than half of what remains is sentence length. Excluding length, from 151 to 40. The length limits sit at the 90th percentile of good documents (90% of instructions are under 33 units, 90% of descriptions under 41). Details: [docs/校准报告.md](docs/校准报告.md).
|
|
||||||
|
|
||||||
Known limits:
|
|
||||||
|
|
||||||
- The vocabulary has about 170 entries and covers general technical writing only.
|
|
||||||
- No controlled reading-comprehension study yet. The calibration measured false positives, not reading speed or error rates.
|
|
||||||
- The checker is syntactic only.
|
|
||||||
|
|
||||||
The spec, the Chinese README and SKILL.md pass the checker with 0 must-level findings, and CI re-checks them on every push. This English README is not checked: the checker is for Chinese text.
|
|
||||||
|
|
||||||
## Licence
|
|
||||||
|
|
||||||
Text of the spec and vocabulary: [CC BY 4.0](LICENSE-CC-BY-4.0). Checker and tests: [MIT](LICENSE).
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
# 简明技术中文
|
|
||||||
|
|
||||||
[](https://github.com/mzopedia/simplified-technical-chinese/actions/workflows/test.yml) [English](README.en.md)
|
|
||||||
|
|
||||||
Simplified Technical Chinese(STC)。一套受控的中文写法,用于技术说明、操作步骤、接口文档和 AI 的解释性回答。目标是读者读一遍就不会读错。
|
|
||||||
|
|
||||||
它借鉴 [ASD-STE100](https://www.asd-ste100.org/)(Simplified Technical English)的方法:限制用词,限制句式,一句一事。它不是 ASD-STE100 的译本,与 ASD 没有关系。
|
|
||||||
|
|
||||||
<!-- stc:off -->
|
|
||||||
> **English.** STC is a controlled language for Chinese technical writing, modelled on the method of ASD-STE100: a numbered rule set, a controlled vocabulary (one meaning, one word), and a zero-dependency checker. It is not a translation of STE and is not affiliated with ASD. The rules are written for the ambiguities of Chinese: nominalised verbs (进行 + verb), long pre-nominal modifiers, the inclusive/exclusive ambiguity of 以上/以下, permission vs ability of 可以, and object restrictions on 打开/关闭/启动.
|
|
||||||
<!-- stc:on -->
|
|
||||||
|
|
||||||
## 一个例子
|
|
||||||
|
|
||||||
节选自 [examples/before.md](examples/before.md):
|
|
||||||
|
|
||||||
> 改写前:用户首先需要登陆到目标服务器,然后切换到 /opt 目录并且创建一个用于存放采集器配置文件以及运行时产生的临时数据的工作目录。
|
|
||||||
|
|
||||||
节选自 [examples/after.md](examples/after.md):
|
|
||||||
|
|
||||||
> 1. 登录目标服务器。
|
|
||||||
> 2. 切换到 `/opt` 目录。
|
|
||||||
> 3. 创建工作目录 `/opt/collector`。工作目录存放配置文件和临时数据。
|
|
||||||
|
|
||||||
检查脚本对改写前那一句的输出:
|
|
||||||
|
|
||||||
```text
|
|
||||||
examples/before.md:11: [1.3][必须] 禁用词「登陆」,改用:登录
|
|
||||||
examples/before.md:11: [2.1][必须] 操作句 56 字,不超过 30 字
|
|
||||||
examples/before.md:11: [4.1][建议] 禁用词「然后」,改用:拆成编号步骤
|
|
||||||
examples/before.md:11: [4.1][必须] 禁用词「并且」,改用:拆句
|
|
||||||
```
|
|
||||||
|
|
||||||
整篇改写前的文档有 34 条【必须】级别的发现,改写后是 0 条。
|
|
||||||
|
|
||||||
## 为什么做这个
|
|
||||||
|
|
||||||
2026 年 10 月,Andrej Karpathy [发帖](https://x.com/karpathy/status/2105819303471976479)说,让大模型用 ASD-STE100 来解释东西,读起来清楚得多。ASD-STE100 是航空维修手册用的受控英语:53 条写作规则,加一本约 900 个词的词典,每个词只有一个意思。
|
|
||||||
|
|
||||||
中文没有对应的东西。已有的中文技术写作规范管排版、标点和文档结构,见[和现有项目的区别](#和现有项目的区别)。它们都没有做 STE 的核心:编号规则、受控词表、可以自动检查的句法约束。本项目补这一块。
|
|
||||||
|
|
||||||
## 内容
|
|
||||||
|
|
||||||
| 文件 | 内容 |
|
|
||||||
| --- | --- |
|
|
||||||
| [规范.md](规范.md) | 写作规则。6 节,40 条,每条带「不批准 / 批准」例句。规则分【必须】和【建议】两级 |
|
|
||||||
| [词表.md](词表.md) | 受控词表。禁用词及替换、选词表(一个意义一个词)、一词一义限定。约 170 条 |
|
|
||||||
| [tools/check.py](tools/check.py) | 检查脚本。零依赖,Python 3.9 及以上。读规范和词表,输出行号、规则号、级别 |
|
|
||||||
| [SKILL.md](SKILL.md) | 给 Claude Code、Codex、Cursor 这类 agent 用的技能文件 |
|
|
||||||
| [examples/](examples/) | 改写前后的完整示例 |
|
|
||||||
|
|
||||||
规则的六节:词、句、段、步骤与警告、数字时间与范围、术语与标记。最常用的几条:
|
|
||||||
|
|
||||||
- 一个概念全文只用一个词。
|
|
||||||
- 不用「进行」「加以」加动词。直接用动词。
|
|
||||||
- 操作句不超过 30 字,描述句不超过 40 字。
|
|
||||||
- 操作句用祈使句,动词开头,不写「请」「您」「用户需要」。
|
|
||||||
- 条件写在动作前面。警告独立成段,放在步骤前。
|
|
||||||
- 不用数字后的「以上」「以下」,写「大于」「不小于」。
|
|
||||||
- 「打开」只用于文件和窗口。功能用「启用」,程序用「启动」。
|
|
||||||
- 「可以」只表示允许。能力用「支持」。
|
|
||||||
|
|
||||||
## 给 AI 用
|
|
||||||
|
|
||||||
### 装成技能
|
|
||||||
|
|
||||||
用 [skills](https://github.com/vercel-labs/skills) 安装器:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npx skills add mzopedia/simplified-technical-chinese
|
|
||||||
```
|
|
||||||
|
|
||||||
或手动复制。Claude Code 的全局技能目录是 `~/.claude/skills/`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone --depth 1 https://github.com/mzopedia/simplified-technical-chinese.git ~/.claude/skills/simplified-technical-chinese
|
|
||||||
```
|
|
||||||
|
|
||||||
装好后,agent 在写中文技术说明时会按规范写,并在保存成文件后运行检查脚本。
|
|
||||||
|
|
||||||
### 直接写进提示词
|
|
||||||
|
|
||||||
不装技能时,把下面这段放进系统提示或对话里:
|
|
||||||
|
|
||||||
```text
|
|
||||||
用简明技术中文回答。规则:一句只说一件事,操作句不超过 30 字,描述句不超过 40 字;操作步骤用编号列表,动词开头,不写「请」「您」;用主动句;条件写在动作前面;一个概念全文只用一个词;不用「进行」「相关」「等」「以上」「尽快」「大概」;不用反问和感叹;数字后不用「以上」「以下」,写「大于」「不小于」。
|
|
||||||
```
|
|
||||||
|
|
||||||
这对应规范的常规模式,也就是 Karpathy 说的「做到八成」。要全部规则时,把 [规范.md](规范.md) 整个给模型。
|
|
||||||
|
|
||||||
## 给人用
|
|
||||||
|
|
||||||
读 [规范.md](规范.md)。写完后用检查脚本过一遍:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/check.py 文档.md
|
|
||||||
```
|
|
||||||
|
|
||||||
在 CI 里用 `--strict`,有【必须】级别的发现时退出码为 1:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/check.py --strict docs/*.md
|
|
||||||
```
|
|
||||||
|
|
||||||
## 检查脚本
|
|
||||||
|
|
||||||
```text
|
|
||||||
python3 tools/check.py 文件.md [更多文件]
|
|
||||||
--strict 有【必须】级别的发现时退出码为 1
|
|
||||||
--json JSON 输出
|
|
||||||
--kind 操作|描述 强制按一种句型检查。聊天回答用「描述」
|
|
||||||
--max-op 30 操作句字数上限
|
|
||||||
--max-desc 40 描述句字数上限
|
|
||||||
--no-vocab 不检查词表
|
|
||||||
--check-counterexamples 也检查「不批准:」开头的反例行
|
|
||||||
```
|
|
||||||
|
|
||||||
脚本能稳定查出的:
|
|
||||||
|
|
||||||
- 禁用词,以及选词表中标为自动检查的词
|
|
||||||
- 句长、段落句数
|
|
||||||
- 操作句里的被动句、情态词、程度词和估计词
|
|
||||||
- 操作句句尾的条件、双重否定、「等」结尾的开放列举
|
|
||||||
- 相对日期、中文数字、「倍」表示减少、问句和感叹句
|
|
||||||
|
|
||||||
脚本查不出的:事实是否正确、术语选得对不对、逻辑顺序、一词一义限定。也查不出定语长度、指代是否清楚、缩写是否一致、步骤里的警告和原因。这几条规则在真实文档上校准时精确率太低,只留在规范文本里由人判断,见 [docs/校准报告.md](docs/校准报告.md)。脚本用编号列表项判断操作句。所有发现都要人工确认。
|
|
||||||
|
|
||||||
脚本不检查的内容:
|
|
||||||
|
|
||||||
- 「」里的内容,按界面文字处理
|
|
||||||
- 代码块和行内代码
|
|
||||||
- HTML 注释,`stc:` 指令除外
|
|
||||||
- 文件开头的 YAML front matter
|
|
||||||
- 以「不批准:」「反例」「改写前」开头的行
|
|
||||||
- `<!-- stc:off -->` 和 `<!-- stc:on -->` 之间的内容;`<!-- stc:skip -->` 跳过它后面的一段
|
|
||||||
|
|
||||||
## 和 ASD-STE100 的关系
|
|
||||||
|
|
||||||
- 方法来自 STE:一词一义、句长限制、祈使句、条件在前、段落句数、不用开放列举。
|
|
||||||
- 规则是按中文重写的。中文没有时态和词形变化,但有自己的歧义来源。例如名词化结构、长定语、「以上」的端点歧义、「可以」的许可和能力歧义。对应关系见规范的附录 B。
|
|
||||||
- ASD-STE100 是注册商标。本项目不使用这个名字,不暗示与 ASD 有关系,也不表示符合本规范的文本符合 ASD-STE100。
|
|
||||||
|
|
||||||
## 和现有项目的区别
|
|
||||||
|
|
||||||
| 项目 | 管什么 | 本项目的关系 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| [ruanyf/document-style-guide](https://github.com/ruanyf/document-style-guide) | 标题、段落、数值、标点、文档结构 | 互补。本规范不管排版 |
|
|
||||||
| [yikeke/zh-style-guide](https://github.com/yikeke/zh-style-guide) | 语言风格、标点、文档元素 | 互补 |
|
|
||||||
| [Fenng/Tech-Doc-Style-Chinese](https://github.com/Fenng/Tech-Doc-Style-Chinese) | 事实保真、改写流程、术语排版,有一节受控写作原则 | 它有 6 条原则和改写样例,没有编号规则和词表,并且明确不把句长做成硬规则。本项目做的正是这部分 |
|
|
||||||
|
|
||||||
写完整文档时,建议三者配合:用本规范管句子和用词,用上面的项目管排版和结构。
|
|
||||||
|
|
||||||
## 状态
|
|
||||||
|
|
||||||
0.2。规则、阈值和自动检查的词表在 350 万字真实中文技术文档上校准过。语料是 8 个开源项目的中文文档,共 2856 个文件。它们是 TiDB、Kubernetes、MDN、Vue、Vite、Ant Design 的文档,以及《Rust 程序设计语言》中文版和阮一峰的 ES6 教程。
|
|
||||||
|
|
||||||
脚本执行的每条规则都在真实文本上抽样判定过,错多于对的规则已从脚本移除。好文档上的提示从每万字 194 条降到 88 条,其中一半以上是句长提示。不算句长,从 151 条降到 40 条。句长上限取好文档句长分布的 90 分位:90% 的操作句不超过 33 字,90% 的描述句不超过 41 字。细节见 [docs/校准报告.md](docs/校准报告.md)。
|
|
||||||
|
|
||||||
规范、本文件和 SKILL.md 自身都通过了检查脚本(0 条【必须】),CI 每次提交都会复查。
|
|
||||||
|
|
||||||
已知问题:
|
|
||||||
|
|
||||||
- 词表约 170 条,只覆盖通用技术写作。
|
|
||||||
- 没有做过阅读理解的对照实验。校准量的是误报率,不是阅读速度和出错率。
|
|
||||||
- 检查脚本只做句法层面的检查。
|
|
||||||
|
|
||||||
## 参与
|
|
||||||
|
|
||||||
提一个词的方法:开 issue,写清四项:词、意义、建议的处理(禁用 / 选词 / 限定)、一个例句。
|
|
||||||
|
|
||||||
改词表时保持表格的列顺序,「自动检查」列只填「是」或「否」。改完运行测试:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 -m unittest discover tests
|
|
||||||
```
|
|
||||||
|
|
||||||
## 许可
|
|
||||||
|
|
||||||
- 规范和词表的文本:[CC BY 4.0](LICENSE-CC-BY-4.0)
|
|
||||||
- 检查脚本和测试:[MIT](LICENSE)
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
---
|
|
||||||
name: simplified-technical-chinese
|
|
||||||
description: 用简明技术中文(STC)写或改写中文技术内容:操作步骤、安装部署、故障排查、接口和参数说明、技术概念解释、给人读的解释性回答。用户提到「简明技术中文」「STC」「受控中文」「像 ASD-STE100 那样写中文」「一词一义」时使用;用户要求把中文技术说明「写清楚」「别有歧义」时也可使用。不用于营销文案、叙事、法律原文和代码。
|
|
||||||
---
|
|
||||||
|
|
||||||
# 简明技术中文
|
|
||||||
|
|
||||||
目标:读者读一遍就不会读错。做法:限制用词,限制句式,一句一事。
|
|
||||||
|
|
||||||
完整规则见 [规范.md](规范.md),词表见 [词表.md](词表.md)。本文件只列最常用的部分。
|
|
||||||
|
|
||||||
## 模式
|
|
||||||
|
|
||||||
- 常规模式(默认):执行全部【必须】规则和词表的自动检查条目。【建议】规则只在明显时处理。
|
|
||||||
- 严格模式:用户说「严格」「全部规则」时,执行全部规则。
|
|
||||||
|
|
||||||
用户没有说明时用常规模式。
|
|
||||||
|
|
||||||
## 写之前先分类
|
|
||||||
|
|
||||||
- 操作句:告诉读者做什么。放在编号列表里,动词开头,不超过 30 字。
|
|
||||||
- 描述句:其他句子。不超过 40 字。
|
|
||||||
|
|
||||||
字数算法:每个汉字计 1,每个英文单词或数字串计 1,行内代码计 1,标点不计。
|
|
||||||
|
|
||||||
## 必须遵守的规则
|
|
||||||
|
|
||||||
词:
|
|
||||||
|
|
||||||
- 一个概念全文只用一个词。不换同义词。(1.1)
|
|
||||||
- 不用「进行」「加以」「作出」「予以」加动词。直接用动词。(1.4)
|
|
||||||
- 不用没有数值的程度词:「很」「非常」「较」「大量」「尽快」「及时」。写数值或条件。(1.5)
|
|
||||||
- 缩写首次出现写全称并括注,之后固定写法。(1.6)
|
|
||||||
- 不用黑话:「赋能」「抓手」「闭环」「拉通」「沉淀」「痛点」「对标」「打法」「拉齐」。(1.7)
|
|
||||||
|
|
||||||
句:
|
|
||||||
|
|
||||||
- 一句只说一件事。分号不能用来把两句并成一句。(2.2)
|
|
||||||
- 操作句用祈使句,不写「请」「您」「用户需要」「应该」。(2.3)
|
|
||||||
- 用主动句,写出执行者。「被」「由」「受到」是信号。(2.4)
|
|
||||||
- 条件写在动作前面:「如果 X,做 Y」。不放句尾,不放括号。(2.5)
|
|
||||||
- 一句最多一个否定。不用「不得不」「不无」「没有……不」。(2.6)
|
|
||||||
- 名词前的修饰语不超过 15 字。连续的「的」是信号。(2.7)
|
|
||||||
- 「其」「该」「此」「它」只指代上一句的对象。否则重复名词。不用「相关」「上述」。(2.8)
|
|
||||||
- 不用反问、设问、感叹。(2.9)
|
|
||||||
|
|
||||||
段和步骤:
|
|
||||||
|
|
||||||
- 一段一个主题,不超过 6 句。(3.1、3.2)
|
|
||||||
- 步骤用编号列表,每个编号一个动作。不在正文里写「首先……然后……」。(3.3、4.1)
|
|
||||||
- 不用「等」结尾的开放列举。列全,或写数量加「包括」。(3.5)
|
|
||||||
- 警告独立成段,放在它针对的步骤之前,以「警告:」开头。(4.3)
|
|
||||||
- 人的动作用祈使句;系统的行为写「系统 + 动词」。(4.4)
|
|
||||||
- 前置条件单独列出,放在步骤之前。(4.5)
|
|
||||||
|
|
||||||
数字:
|
|
||||||
|
|
||||||
- 阿拉伯数字,数字与单位之间空格。(5.1)
|
|
||||||
- 不用数字后的「以上」「以下」「以内」。用「大于」「不小于」「不超过」,或「3 至 5(含)」。(5.2)
|
|
||||||
- 不用相对时间:「明天」「近期」「稍后」「尽快」。用绝对日期或时长。(5.3)
|
|
||||||
- 操作句里不用「约」「几」「若干」「多次」。写数值。(5.4)
|
|
||||||
- 减少不用「倍」。百分比和百分点分开。(5.5)
|
|
||||||
|
|
||||||
标记:
|
|
||||||
|
|
||||||
- 界面元素名用「」括起,和界面文字一致。(6.1)
|
|
||||||
- 代码、命令、路径、字段名用代码标记,原样保留。(6.2)
|
|
||||||
|
|
||||||
## 词表速查
|
|
||||||
|
|
||||||
最常撞上的 20 条。完整表见 [词表.md](词表.md)。
|
|
||||||
|
|
||||||
| 不用 | 用 |
|
|
||||||
| --- | --- |
|
|
||||||
| 「进行安装」 | 安装 |
|
|
||||||
| 「相关配置」 | 写出具体对象 |
|
|
||||||
| 「支持 A、B 等」 | 列全,或「包括 3 种:A、B、C」 |
|
|
||||||
| 「10 以上」 | 大于 10 / 不小于 10 |
|
|
||||||
| 「大概 5 秒左右」 | 5 秒 |
|
|
||||||
| 「尽快」 | 30 分钟内 |
|
|
||||||
| 「如果失败的话」 | 如果失败 |
|
|
||||||
| 「检查一下」 | 检查 |
|
|
||||||
| 「出现错误的情况」 | 出现错误时 |
|
|
||||||
| 「应该」「务必」「一定要」 | 必须(强制)/ 建议(推荐) |
|
|
||||||
| 「不得」「不准」 | 禁止 |
|
|
||||||
| 「单击」「点按」 | 点击 |
|
|
||||||
| 「删掉」「去掉」 | 删除 |
|
|
||||||
| 「开启功能」 | 启用功能 |
|
|
||||||
| 「打开程序」 | 启动程序 |
|
|
||||||
| 「登出」 | 退出登录 |
|
|
||||||
| 「键入」 | 输入 |
|
|
||||||
| 「入参」「出参」 | 参数 / 返回值 |
|
|
||||||
| 「登陆」「帐号」「缺省」 | 登录、账号、默认 |
|
|
||||||
| 「报错」(名词) | 错误 |
|
|
||||||
|
|
||||||
一词一义里最常错的 4 个:
|
|
||||||
|
|
||||||
- 打开:只用于文件、窗口、页面、连接。功能用「启用」,程序用「启动」。
|
|
||||||
- 可以:只表示允许。能力用「支持」。
|
|
||||||
- 问题:只表示疑问。故障、错误、缺陷分开写。
|
|
||||||
- 更新:只用于数据和内容。版本用「升级」。
|
|
||||||
|
|
||||||
## 工作流程
|
|
||||||
|
|
||||||
1. 判断内容类型。营销、叙事、法律原文不用本规范。
|
|
||||||
2. 判断模式。默认常规模式。
|
|
||||||
3. 写或改写。先定术语,再写句子。操作内容用编号列表。
|
|
||||||
4. 如果结果保存成了文件,运行检查脚本:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/check.py 文件.md
|
|
||||||
```
|
|
||||||
|
|
||||||
聊天回答这类没有编号步骤的内容,加 `--kind 描述`。
|
|
||||||
|
|
||||||
5. 修复全部【必须】级别的发现。【建议】级别的按判断处理。
|
|
||||||
6. 改写别人的文稿时,不改变事实、数字、条件和确定程度。原文说「可能」,改写后仍是「可能」。
|
|
||||||
|
|
||||||
## 不要做的事
|
|
||||||
|
|
||||||
- 不改写代码、命令、路径、字段名、URL。
|
|
||||||
- 不为了缩短句子而删除条件、例外和警告。
|
|
||||||
- 不把「可能」改成「会」,不把「建议」改成「必须」。
|
|
||||||
- 不给原文没有的数字、日期和时限编一个。缺信息时写「待确认」。
|
|
||||||
- 不把规范用在它不适用的文体上。
|
|
||||||
|
|
||||||
## 检查脚本的局限
|
|
||||||
|
|
||||||
脚本只查句法。它查不出事实错误、术语选错、逻辑顺序错。它用「编号列表项」判断操作句,用「的」的数量近似长定语,用几个标记词近似被动句。所有发现都要人工确认。
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
# 校准报告(0.2)
|
|
||||||
|
|
||||||
<!-- stc:off -->
|
|
||||||
|
|
||||||
本报告记录 0.2 版把检查脚本放到真实中文技术文档上校准的方法、数据和决定。校准量的是**误报率**:脚本报出来的提示里,有多少是按规则确实该改的。它不量读者的理解速度和出错率。
|
|
||||||
|
|
||||||
## 结论
|
|
||||||
|
|
||||||
1. 草案 0.1 的脚本在公认写得好的文档上每万字报 194 条提示,约每 50 个字一条。answer-me-with-html 的维护者在他的 1000 篇中文稿上实测到的「30 条对 3 条」不是他的文档特殊,是草案的真实水平。
|
|
||||||
2. 校准后降到每万字 88 条。其中一半以上是句长提示(2.1)。不算句长,从 151 条降到 40 条。
|
|
||||||
3. 6 条规则从脚本移除:1.6 缩写写法、2.7 定语长度、2.8 指代、4.3 步骤里的警告、4.5 括号里的前置条件、4.6 步骤里的原因。它们的精确率在 0% 到 34% 之间。脚本用的代理信号(大小写不同的英文词、「的」的数量、指代词的数量、编号列表项里的「注意」「因为」「(版本)」)分不出合规和违规。规则本身不变,由人判断。
|
|
||||||
4. 2.4 被动句只查操作句,级别降为【建议】。描述句里的被动有 58% 是「执行者未知或不重要」的合规用法;操作句里「被拒绝的请求」这类是定语不是谓语。脚本都分不出来。2.5 条件后置只查操作句。3.3 正文串联步骤降为【建议】:正文里的「首先……然后……」多数在描述执行顺序,不是在写步骤。
|
|
||||||
5. 程度词(1.5)、情态词(2.3)、估计词(5.4)只在操作句和参数表格里查。描述句里的「很多」「大部分」「输出应该是」「大约 16 KB」多数是正常表述。
|
|
||||||
6. 句长上限:操作句从 25 字改为 30 字,描述句保持 40 字。好文档里 90% 的操作句不超过 33 字,90% 的描述句不超过 41 字。
|
|
||||||
7. 20 处跨词误匹配加了排除条件。例如「传入参数」里的「入参」、「不准确」里的「不准」、「添加以下」里的「加以」、「不得不」里的「不得」、「为其实施」里的「其实」、「规约」里的「约」、「相等」里的「等」。
|
|
||||||
8. 词表里 8 个禁用词和 8 行选词表同义词改为不自动检查:相关、必要时、同时、落地、方面、所谓、不得、兜底(改为一词一义限定);去除 / 去掉、剔除 / 拿掉、拉起 / 跑起来、杀掉 / 干掉、调出 / 唤起、展示 / 呈现、回传 / 吐出、挂了。它们在真实文档里多数是别的意义或正常用法。
|
|
||||||
|
|
||||||
## 方法
|
|
||||||
|
|
||||||
流程和脚本在 [tools/calibration/](../tools/calibration/)。
|
|
||||||
|
|
||||||
1. 选 8 个公认写得好的中文技术文档仓库作语料,只取正文以中文为主的 Markdown 文件。大仓库稀疏检出中文文档目录。语料版本记录在 `corpora.json`。
|
|
||||||
2. 用检查脚本跑全部语料,统计每条规则、每个词的命中数,以及句长分布。
|
|
||||||
3. 每条规则抽最多 50 条命中(第二轮 60 条)。词表类规则先按词分层,每个词最多 8 条(第二轮 10 条),再在语料库之间轮流取。每条样本附命中行前后各一行原文。
|
|
||||||
4. 用模型(deepseek-v4-flash,温度 0)按规则原文和词表条目判定每条样本:**真**(规则按字面确实被违反,而且按规则改写后这句话不会变得更不准确)、**误**(命中的词或句在这里是正常用法、固定术语、引用的界面文字或代码,或者按规则改写会损害意思)、**不确定**。本报告的精确率是模型初判,作者抽查过每条规则的误报样本和理由。模型的判定偏宽松:它倾向把「描述句里本来就这么写」判为正常用法。所以这里的精确率是下限。
|
|
||||||
5. 精确率 = 真 / (真 + 误)。不低于 80% 保留;50% 到 79% 加匹配条件或降为【建议】;低于 50% 从脚本移除,规则只留在文本里。
|
|
||||||
6. 按结果修脚本和词表,再跑一轮,确认命中数下降、精确率上升。
|
|
||||||
|
|
||||||
## 语料
|
|
||||||
|
|
||||||
| 语料库 | 来源 | 文件 | 句子 | 字数 |
|
|
||||||
| --- | --- | ---: | ---: | ---: |
|
|
||||||
| tidb-docs-cn | pingcap/docs-cn | 1085 | 73933 | 1525798 |
|
|
||||||
| k8s-zh-cn | kubernetes/website,content/zh-cn/docs/{concepts,tasks} | 359 | 26401 | 604671 |
|
|
||||||
| mdn-zh-cn | mdn/translated-content,files/zh-cn/web/{javascript,http} | 927 | 32239 | 596778 |
|
|
||||||
| trpl-zh-cn | KaiserY/trpl-zh-cn(《Rust 程序设计语言》) | 110 | 8109 | 234618 |
|
|
||||||
| es6tutorial | ruanyf/es6tutorial | 36 | 5579 | 142026 |
|
|
||||||
| vue-docs-zh-cn | vuejs-translations/docs-zh-cn | 107 | 6349 | 141378 |
|
|
||||||
| ant-design | ant-design/ant-design,components 和 docs 的 zh-CN 文件 | 169 | 6672 | 132856 |
|
|
||||||
| vite-docs-cn | vitejs/docs-cn | 63 | 4417 | 92739 |
|
|
||||||
| 合计 | | 2856 | 163699 | 3470864 |
|
|
||||||
|
|
||||||
句子数按校准后的脚本统计(多行拼成一句)。
|
|
||||||
|
|
||||||
TiDB 文档占 44%,k8s 和 MDN 各占 17%。这三个是产品手册和参考文档,操作步骤多,和本规范的目标文体最接近。Rust 书和 ES6 教程是教材,句子长、设问多,是最「不像手册」的两个。
|
|
||||||
|
|
||||||
## 校准前后每条规则的命中
|
|
||||||
|
|
||||||
校准前是 0.1 的脚本,校准后是 0.2 的脚本。两者字数略有差别:0.2 跳过 HTML 注释和整行 HTML 标签,去掉了 k8s 文档注释里的英文原文。
|
|
||||||
|
|
||||||
| 规则 | 校准前命中 | 每万字 | 校准后命中 | 每万字 | 处理 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | --- |
|
|
||||||
| 2.1 句长 | 14814 | 42.2 | 16720 | 48.2 | 操作句上限 25 → 30;多行拼成一句后命中反而变多,见下文 |
|
|
||||||
| 1.3 禁用词 | 11374 | 32.4 | 5351 | 15.4 | 情况只查「的情况」且后面不是「下」;相关、必要时、方面、所谓不自动检查;跨词误匹配加排除 |
|
|
||||||
| 2.4 被动 | 8476 | 24.2 | 156 | 0.4 | 只查操作句,降为建议;「被 X 的 Y」不算 |
|
|
||||||
| 1.4 进行 / 加以 / 作出 | 5855 | 16.7 | 5422 | 15.6 | 加以、予以、做出贡献的误匹配加排除;「进行 + 英文词」不查 |
|
|
||||||
| 1.5 程度词 | 4537 | 12.9 | 383 | 1.1 | 只查操作句(比较、较为、基本、相对除外);合适 / 适当 / 适量、很 / 非常 / 极其 / 相当 / 十分不自动检查 |
|
|
||||||
| 2.8 指代 | 3751 | 10.7 | 0 | 0.0 | 移除 |
|
|
||||||
| 1.1 一词一义 | 3122 | 8.9 | 186 | 0.5 | 11 行同义词和不得、应该 / 应当改为不自动检查;点选、一定要加排除 |
|
|
||||||
| 1.6 缩写写法 | 2942 | 8.4 | 0 | 0.0 | 移除 |
|
|
||||||
| 2.7 长定语 | 2575 | 7.3 | 0 | 0.0 | 移除 |
|
|
||||||
| 5.4 估计词 | 2247 | 6.4 | 11 | 0.0 | 只查操作句和表格;一些、多次不自动检查;「规约」里的「约」加排除 |
|
|
||||||
| 2.3 祈使句 | 1885 | 5.4 | 71 | 0.2 | 请见 / 请参阅 / 请注意不查;你、应该、应当不自动检查 |
|
|
||||||
| 5.1 数字写法 | 1665 | 4.7 | 158 | 0.5 | 一次、两次、一行、几十行、百分之百、二十四小时制不查;px 不查空格 |
|
|
||||||
| 3.5 开放列举 | 1141 | 3.3 | 654 | 1.9 | 「例如……等」「相等」「不等」和括号里的列举不查 |
|
|
||||||
| 2.6 否定 | 722 | 2.1 | 55 | 0.2 | 只查双重否定,降为建议 |
|
|
||||||
| 2.9 问句感叹句 | 683 | 1.9 | 673 | 1.9 | 保留 |
|
|
||||||
| 3.2 段落句数 | 561 | 1.6 | 80 | 0.2 | 只数有句末标点的句子;整行 HTML 标签跳过 |
|
|
||||||
| 6.1 界面元素名 | 388 | 1.1 | 386 | 1.1 | 保留 |
|
|
||||||
| 2.5 条件后置 | 291 | 0.8 | 3 | 0.0 | 只查操作句句尾的条件;括号不查 |
|
|
||||||
| 4.1 一步一动作 | 187 | 0.5 | 152 | 0.4 | 同时不自动检查;然后、接着降为建议 |
|
|
||||||
| 2.2 一句一事 | 152 | 0.4 | 71 | 0.2 | 之后、随后不算连接词;降为建议 |
|
|
||||||
| 3.3 正文串联步骤 | 131 | 0.4 | 0 | 0.0 | 移除 |
|
|
||||||
| 5.2 范围端点 | 121 | 0.3 | 122 | 0.4 | 保留 |
|
|
||||||
| 1.7 黑话 | 107 | 0.3 | 12 | 0.0 | 透传、兜底改为一词一义;落地、打通不自动检查;对标加排除;心智模型、心智负担不查;痛点降为建议 |
|
|
||||||
| 5.3 相对时间 | 85 | 0.2 | 8 | 0.0 | 稍后、近期、不久、上个月、下个月不查,只查相对日期词;降为建议 |
|
|
||||||
| 4.6 步骤里的原因 | 56 | 0.2 | 0 | 0.0 | 移除 |
|
|
||||||
| 4.3 步骤里的警告 | 16 | 0.0 | 0 | 0.0 | 移除 |
|
|
||||||
| 4.5 括号里的前置条件 | 16 | 0.0 | 0 | 0.0 | 移除 |
|
|
||||||
| 5.5 倍数 | 1 | 0.0 | 1 | 0.0 | 保留 |
|
|
||||||
| 合计 | 67901 | 193.5 | 30675 | 88.4 | |
|
|
||||||
|
|
||||||
校准后的 30675 条里,【必须】级别 29775 条(每万字 85.8),其余是【建议】。
|
|
||||||
|
|
||||||
## 句长
|
|
||||||
|
|
||||||
0.1 的脚本把 Markdown 的硬换行当句子边界。k8s、MDN、Rust 书都按 80 列左右硬换行,一句常被切成两三段,所以 0.1 量出来的句长偏短,而且被切开的片段还会触发 2.5 条件后置和 2.2 一句多事的误报。0.2 先把一个段落的多行拼起来再分句。下面是拼行后的分布。
|
|
||||||
|
|
||||||
| 语料库 | 句型 | n | 均值 | p50 | p75 | p90 | p95 | p99 | 超过上限(操作 30 / 描述 40) |
|
|
||||||
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| k8s-zh-cn | 操作 | 1143 | 18.8 | 16 | 25 | 34 | 43 | 58 | 15.7% |
|
|
||||||
| k8s-zh-cn | 描述 | 25258 | 23.1 | 21 | 31 | 41 | 48 | 63 | 10.5% |
|
|
||||||
| tidb-docs-cn | 操作 | 3012 | 17.6 | 16 | 23 | 31 | 38 | 56 | 11.1% |
|
|
||||||
| tidb-docs-cn | 描述 | 70921 | 20.8 | 19 | 28 | 40 | 48 | 67 | 9.4% |
|
|
||||||
| mdn-zh-cn | 描述 | 32010 | 18.5 | 16 | 28 | 39 | 47 | 63 | 8.9% |
|
|
||||||
| trpl-zh-cn | 描述 | 8065 | 29.0 | 28 | 37 | 48 | 55 | 69 | 19.4% |
|
|
||||||
| es6tutorial | 描述 | 5570 | 25.5 | 24 | 33 | 43 | 50 | 68 | 12.6% |
|
|
||||||
| 全部 | 操作 | 4799 | 18.3 | 16 | 24 | 33 | 40 | 58 | 13.1% |
|
|
||||||
| 全部 | 描述 | 158900 | 21.3 | 19 | 29 | 41 | 48 | 66 | 10.2% |
|
|
||||||
|
|
||||||
各阈值下超限的句子比例(全部语料):
|
|
||||||
|
|
||||||
| 上限 | 30 字 | 35 字 | 40 字 | 45 字 | 50 字 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| 操作句 | 13.1% | 7.9% | 4.9% | 3.2% | 1.9% |
|
|
||||||
| 描述句 | 22.9% | 15.4% | 10.2% | 6.5% | 4.2% |
|
|
||||||
|
|
||||||
决定:操作句 30 字(85 到 90 分位之间),描述句 40 字(90 分位附近)。两个数字都会让好文档里约 10% 的句子收到提示。这是本规范有意比常规文档更严的地方:句长是 STE 方法的核心约束。手册类文档(k8s、TiDB)的 p90 比教材(Rust 书、ES6 教程)低 7 到 8 字,上限按手册定。
|
|
||||||
|
|
||||||
## 每条规则的精确率
|
|
||||||
|
|
||||||
三轮抽样。第一轮量 0.1 的脚本;第二轮量第一次修正后的脚本;第三轮量 0.2 的脚本(第三轮之后还有少量调整,见下)。第三轮的提示词补了附录 A 的字数算法,所以 2.1 的判定比前两轮准。每轮每条规则最多 60 条样本,样本少于 10 条的规则不下结论。
|
|
||||||
|
|
||||||
| 规则 | 第一轮 | 第二轮 | 第三轮 | 第三轮样本 | 0.2 里的级别 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | --- |
|
|
||||||
| 2.1 句长 | 64% | 73% | 92% | 60 | 必须 |
|
|
||||||
| 1.3 禁用词 | 60% | 80% | 80% | 60 | 必须 |
|
|
||||||
| 1.4 进行 / 加以 / 作出 | 69% | 87% | 82% | 45 | 必须 |
|
|
||||||
| 2.9 问句感叹句 | 84% | 82% | 80% | 60 | 必须 |
|
|
||||||
| 6.1 界面元素名 | 94% | 90% | 95% | 60 | 建议 |
|
|
||||||
| 3.2 段落句数 | 47% | 92% | 100% | 60 | 必须 |
|
|
||||||
| 5.2 范围端点 | 71% | 83% | 80% | 30 | 必须 |
|
|
||||||
| 4.1 一步一动作 | 42% | 64% | 64% | 22 | 并且必须,然后建议 |
|
|
||||||
| 2.2 一句一事 | 54% | 65% | 53% | 60 | 建议 |
|
|
||||||
| 2.6 双重否定 | 22% | 41% | 53% | 55 | 建议 |
|
|
||||||
| 1.1 一词一义 | 26% | 63% | 48% | 60 | 必须,只剩高精确率的词 |
|
|
||||||
| 5.1 数字写法 | 4% | 45% | 47% | 60 | 阿拉伯数字必须,单位空格建议 |
|
|
||||||
| 1.5 程度词 | 44% | 42% | 47% | 60 | 必须,只查操作句,只剩高精确率的词 |
|
|
||||||
| 2.3 祈使句 | 51% | 60% | 45% | 47 | 必须,只查操作句,去掉你和应该 |
|
|
||||||
| 5.4 估计词 | 16% | 33% | 39% | 28 | 必须,只查操作句和表格,去掉一些和多次 |
|
|
||||||
| 1.7 黑话 | 22% | 32% | 44% | 16 | 必须,去掉打通、落地、兜底 |
|
|
||||||
| 2.4 被动 | 42% | 43% | 35% | 60 | 建议,只查操作句 |
|
|
||||||
| 3.5 开放列举 | 50% | 60% | 30% | 10 | 必须,括号里的列举不查 |
|
|
||||||
| 5.3 相对时间 | 26% | 33% | 38% | 8 | 建议 |
|
|
||||||
| 3.3 正文串联步骤 | 12% | 40% | 30% | 10 | 脚本不查 |
|
|
||||||
| 2.5 条件后置 | 34% | 35% | 100% | 3 | 必须,只查操作句 |
|
|
||||||
| 2.8 指代 | 0% | – | – | | 脚本不查 |
|
|
||||||
| 1.6 缩写写法 | 0% | – | – | | 脚本不查 |
|
|
||||||
| 2.7 长定语 | 2% | – | – | | 脚本不查 |
|
|
||||||
| 4.3 / 4.5 / 4.6 步骤里的警告、前置条件、原因 | 19% / 12% / 34% | – | – | | 脚本不查 |
|
|
||||||
|
|
||||||
第三轮之后的调整:2.2、2.6、5.3 降为建议;3.3 从脚本移除;1.1、1.5、2.3、5.4、1.7 里精确率低的词改为不自动检查(挑选 / 选取、应答 / 回包、入参的选词表条目;很 / 非常 / 极其 / 相当 / 十分、合适 / 适当 / 适量;你、应该 / 应当;一些、多次;打通)。这些词的命中占这几条规则命中的大半,所以调整后的精确率会高于表里的数字,但没有再量。
|
|
||||||
|
|
||||||
作者和模型判定不一致的地方:模型把「不得不」「合适的命令」「(MySQL、PostgreSQL 等)」判为正常用法,作者认为按规则该改。这三类按作者意见处理:2.6 保留为建议,1.5 的合适不自动检查,3.5 括号里的列举不查、其余保留。
|
|
||||||
|
|
||||||
## 词表条目的精确率
|
|
||||||
|
|
||||||
命中最多的词单独抽了 25 条(第二轮脚本的命中)。精确率决定了它们在 0.2 里的处理。
|
|
||||||
|
|
||||||
| 词 | 命中 | 精确率 | 处理 |
|
|
||||||
| --- | ---: | ---: | --- |
|
|
||||||
| 进行 | 5246 | 100%(10 条) | 保留 |
|
|
||||||
| 报错 | 1407 | 96% | 保留。TiDB 文档把它当名词用,模型仍判为该改 |
|
|
||||||
| 开启 | 1914 | 76% | 保留。误报是「开启 / 关闭」对举和标题引用 |
|
|
||||||
| 做出 | 111 | 88% | 保留。「做出贡献」「做出反应」加排除 |
|
|
||||||
| 的话 | 214 | 76% | 保留。误报是「如果有的话」「可能的话」 |
|
|
||||||
| 然后 | 122 | 76% | 降为建议:编号列表项不一定是步骤 |
|
|
||||||
| 等 | 782 | 72% | 保留。「相等」「不等」「例如……等」加排除 |
|
|
||||||
| 比较 | 193 | 72% | 保留 |
|
|
||||||
| 一定要 | 60 | 56% | 保留。「不是一定要」「是否一定要」加排除 |
|
|
||||||
| 应该 | 32 | 52% | 保留,只查操作句 |
|
|
||||||
| 不得 | 74 | 52% | 不自动检查:「不得超过 256 KiB」是规范文体的正常写法 |
|
|
||||||
| 你 | 434 | 44% | 降为建议:步骤里的「你可以……」是文体问题 |
|
|
||||||
| 所谓 | 22 | 36% | 不自动检查:「所谓幻读是指……」引出定义是正常用法 |
|
|
||||||
| 情况 | 1292 | 32% | 只查「的情况」且后面不是「下」:「在……的情况下」是固定搭配 |
|
|
||||||
| 方面 | 163 | 8% | 不自动检查 |
|
|
||||||
| 不准 | 12 | 0% | 只查「不准 + 动词」:剩下的命中全是「统计不准」这种「不准确」 |
|
|
||||||
|
|
||||||
每条规则抽样里出现的其余词,见第三轮报告表。
|
|
||||||
|
|
||||||
## 局限
|
|
||||||
|
|
||||||
- 判定由模型做,作者只抽查。模型偏宽松,精确率是下限。欢迎在 issue 里对任何一条判定提出异议。
|
|
||||||
- 语料全是开源项目的文档和教材,没有企业内部文档和 AI 生成的回答。后者正是本规范的主要使用场景之一,它们的黑话和虚词密度可能高得多。
|
|
||||||
- 操作句靠「编号列表项」识别。k8s 和 MDN 大量用编号列表做说明性列举,脚本把它们当步骤检查,是 2.1、2.3、4.1 剩余误报的主要来源。
|
|
||||||
- 没有量阅读效果。校准只回答「脚本报的对不对」,不回答「按规范改写后读者是否读得更快、错得更少」。
|
|
||||||
|
|
||||||
<!-- stc:on -->
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# 日志采集器部署指南
|
|
||||||
|
|
||||||
本文档说明如何在生产环境部署日志采集器。读者是运维人员。
|
|
||||||
|
|
||||||
## 前置条件
|
|
||||||
|
|
||||||
- 服务器操作系统:Ubuntu 22.04 或 CentOS 8。
|
|
||||||
- 磁盘剩余空间不小于 10 GB。
|
|
||||||
- 服务器能访问镜像仓库 `registry.example.com`。
|
|
||||||
|
|
||||||
服务器不能访问镜像仓库时,向网络组申请访问权限。审批时间为 1 至 3 个工作日。
|
|
||||||
|
|
||||||
## 部署步骤
|
|
||||||
|
|
||||||
1. 登录目标服务器。
|
|
||||||
2. 切换到 `/opt` 目录。
|
|
||||||
3. 创建工作目录 `/opt/collector`。工作目录存放配置文件和临时数据。
|
|
||||||
4. 下载与服务器 CPU 架构匹配的安装包。
|
|
||||||
5. 解压安装包。
|
|
||||||
6. 在配置文件中,把 `server_addr` 改为服务端地址。
|
|
||||||
7. 在配置文件中,把 `batch_size` 改为 200 至 500 之间的值。
|
|
||||||
8. 运行启动命令。systemd 接管采集器。采集器每 10 秒把日志上报到服务端。
|
|
||||||
9. 运行状态查询命令。系统显示 `active`。
|
|
||||||
|
|
||||||
说明:架构不匹配时,安装包无法运行,系统显示错误「exec format error」。
|
|
||||||
|
|
||||||
## 排查故障
|
|
||||||
|
|
||||||
采集器无法启动时,按下面的步骤排查:
|
|
||||||
|
|
||||||
1. 运行配置校验命令。
|
|
||||||
2. 如果校验失败,按输出修改配置文件。
|
|
||||||
3. 重启采集器。
|
|
||||||
|
|
||||||
采集器的内存占用约为 200 MB。内存占用大于 500 MB 时,把 `batch_size` 调小到 200。
|
|
||||||
|
|
||||||
## 调试模式
|
|
||||||
|
|
||||||
需要查看详细日志时,启用调试模式。调试模式写入的日志量是正常模式的 10 倍。
|
|
||||||
|
|
||||||
## 版本计划
|
|
||||||
|
|
||||||
v2.0 于 2026 年 12 月 1 日发布。v2.0 的吞吐量是 v1.x 的 3 倍,内存占用减少到 v1.x 的 1/2。
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# 日志采集器部署指南
|
|
||||||
|
|
||||||
本文档主要是介绍一下如何在生产环境对日志采集器进行部署以及相关配置的说明,适用于运维同学以及对此感兴趣的开发同学等。
|
|
||||||
|
|
||||||
## 部署前的准备
|
|
||||||
|
|
||||||
首先需要确认服务器的操作系统版本是比较新的,然后检查一下磁盘空间是否充足(一般来说 10GB 以上就基本够用了),最后还要保证服务器能够访问到我们的镜像仓库。如果服务器无法访问外网的话,需要联系网络组的同事开通相关的权限,这个过程可能需要几天时间,所以最好尽快提交申请。
|
|
||||||
|
|
||||||
## 部署步骤
|
|
||||||
|
|
||||||
1. 用户首先需要登陆到目标服务器,然后切换到 /opt 目录并且创建一个用于存放采集器配置文件以及运行时产生的临时数据的工作目录。
|
|
||||||
2. 请下载安装包并进行解压,注意安装包必须和服务器的 CPU 架构匹配,否则会报错。
|
|
||||||
3. 修改配置文件里的 server_addr(服务端地址)参数,把它改成实际的地址,然后再修改一下 batch_size 参数,这个参数不要设置得太大也不要设置得太小,一般几百左右就可以了。
|
|
||||||
4. 执行启动命令以后,采集器会被 systemd 接管,日志会由采集器定期上报到服务端,这时候应该能看到状态变成 active 了吧?
|
|
||||||
5. 开启调试功能(如果需要排查问题的话)。
|
|
||||||
|
|
||||||
## 常见问题
|
|
||||||
|
|
||||||
如果采集器起不来,大概率是因为配置文件的格式有问题,可以用校验命令对配置文件进行校验,校验通过之后再重新拉起服务。采集器的内存占用一般在 200MB 左右,如果内存占用非常高,说明 batch_size 参数设置得不合适,适当调小即可。近期我们会发布新版本来对这个问题加以优化,届时性能会提升 3 倍以上,内存占用也会降低 2 倍。
|
|
||||||
@@ -1,293 +0,0 @@
|
|||||||
"""检查脚本的回归测试。运行:python3 -m unittest discover tests"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
||||||
sys.path.insert(0, os.path.join(ROOT, "tools"))
|
|
||||||
|
|
||||||
import check # noqa: E402
|
|
||||||
|
|
||||||
|
|
||||||
def rules(findings):
|
|
||||||
return {f.rule for f in findings}
|
|
||||||
|
|
||||||
|
|
||||||
class TestCount(unittest.TestCase):
|
|
||||||
def test_appendix_a_examples(self):
|
|
||||||
self.assertEqual(check.count_chars("重启服务。"), 4)
|
|
||||||
self.assertEqual(check.count_chars("把 `max_connections` 改为 200。"), 5)
|
|
||||||
|
|
||||||
def test_latin_tokens_count_one(self):
|
|
||||||
self.assertEqual(check.count_chars("使用 API v2.0 和 UTF-8 编码"), 8)
|
|
||||||
|
|
||||||
|
|
||||||
class TestVocab(unittest.TestCase):
|
|
||||||
@classmethod
|
|
||||||
def setUpClass(cls):
|
|
||||||
cls.vocab = check.load_vocab()
|
|
||||||
cls.checker = check.Checker(cls.vocab)
|
|
||||||
|
|
||||||
def test_vocab_loads(self):
|
|
||||||
self.assertGreater(len(self.vocab), 80)
|
|
||||||
kinds = {e.kind for e in self.vocab}
|
|
||||||
self.assertEqual(kinds, {"banned", "choice"})
|
|
||||||
|
|
||||||
def test_jinxing_flagged(self):
|
|
||||||
f = self.checker.check_text("对配置文件进行修改。")
|
|
||||||
self.assertIn("1.4", rules(f))
|
|
||||||
|
|
||||||
def test_jinxing_zhong_not_flagged(self):
|
|
||||||
f = self.checker.check_text("任务进行中。")
|
|
||||||
self.assertNotIn("1.4", rules(f))
|
|
||||||
|
|
||||||
def test_yishang_after_digit(self):
|
|
||||||
f = self.checker.check_text("并发数 100 以上。")
|
|
||||||
self.assertIn("5.2", rules(f))
|
|
||||||
|
|
||||||
def test_yishang_without_digit(self):
|
|
||||||
f = self.checker.check_text("以上步骤完成后,服务可用。")
|
|
||||||
self.assertNotIn("5.2", rules(f))
|
|
||||||
|
|
||||||
def test_deng_enumeration(self):
|
|
||||||
f = self.checker.check_text("支持 MySQL、PostgreSQL 等数据库。")
|
|
||||||
self.assertIn("3.5", rules(f))
|
|
||||||
|
|
||||||
def test_deng_not_enumeration(self):
|
|
||||||
f = self.checker.check_text("等待 3 秒。")
|
|
||||||
self.assertNotIn("3.5", rules(f))
|
|
||||||
f = self.checker.check_text("保存文件、关闭窗口,等待 3 秒。")
|
|
||||||
self.assertNotIn("3.5", rules(f))
|
|
||||||
|
|
||||||
def test_quoted_text_is_skipped(self):
|
|
||||||
f = self.checker.check_text("不写「请」「您」「进行」。")
|
|
||||||
self.assertEqual([x for x in f if x.level == check.MUST], [])
|
|
||||||
|
|
||||||
def test_nested_counterexample_is_skipped(self):
|
|
||||||
text = "- 不批准:\n 1. 请进行安装,然后重启。\n- 批准:\n 1. 安装。\n 2. 重启。\n"
|
|
||||||
self.assertEqual(self.checker.check_text(text), [])
|
|
||||||
|
|
||||||
def test_front_matter_and_directives_are_skipped(self):
|
|
||||||
text = "---\ndescription: 请进行安装\n---\n\n<!-- stc:off -->\n请进行安装。\n<!-- stc:on -->\n\n<!-- stc:skip -->\n请进行安装。\n\n安装。\n"
|
|
||||||
self.assertEqual(self.checker.check_text(text), [])
|
|
||||||
|
|
||||||
def test_html_comments_are_skipped(self):
|
|
||||||
text = "\n".join([
|
|
||||||
"<!--",
|
|
||||||
"这里的内容进行测试,不应该被检查。",
|
|
||||||
"-->",
|
|
||||||
"中文句子。<!-- 行内注释里的进行 -->",
|
|
||||||
"<!-- 多行",
|
|
||||||
"注释开始",
|
|
||||||
"--> 注释后的进行修改。",
|
|
||||||
])
|
|
||||||
f = self.checker.check_text(text)
|
|
||||||
self.assertEqual([(x.rule, x.line) for x in f], [("1.4", 7)])
|
|
||||||
|
|
||||||
def test_counterexample_line_is_skipped(self):
|
|
||||||
f = self.checker.check_text("- 不批准:对配置文件进行修改。")
|
|
||||||
self.assertEqual(f, [])
|
|
||||||
strict = check.Checker(self.vocab, skip_counterexamples=False)
|
|
||||||
self.assertIn("1.4", rules(strict.check_text("- 不批准:对配置文件进行修改。")))
|
|
||||||
|
|
||||||
def test_qing_only_in_operation(self):
|
|
||||||
f = self.checker.check_text("1. 请点击「保存」。")
|
|
||||||
self.assertIn("2.3", rules(f))
|
|
||||||
f = self.checker.check_text("这里不是操作句,请求参数如下。")
|
|
||||||
self.assertNotIn("2.3", rules(f))
|
|
||||||
|
|
||||||
def test_choice_word(self):
|
|
||||||
f = self.checker.check_text("单击「保存」。")
|
|
||||||
msgs = [x.message for x in f if x.rule == "1.1"]
|
|
||||||
self.assertTrue(any("点击" in m for m in msgs))
|
|
||||||
|
|
||||||
def test_jargon_is_rule_1_7(self):
|
|
||||||
f = self.checker.check_text("按新打法对标行业方案,把握用户痛点,理清底层逻辑。")
|
|
||||||
hits = [x for x in f if x.rule == "1.7"]
|
|
||||||
self.assertEqual(len(hits), 4)
|
|
||||||
# 痛点常有正当用法,降为建议;其余是必须
|
|
||||||
self.assertEqual(sum(x.level == check.MUST for x in hits), 3)
|
|
||||||
self.assertEqual(sum(x.level == check.SHOULD for x in hits), 1)
|
|
||||||
|
|
||||||
def test_words_with_technical_meaning_are_not_banned(self):
|
|
||||||
# 势能、飞轮、护城河 标为不自动检查;脚手架、收敛 只在词表第三部分限定意义
|
|
||||||
f = self.checker.check_text("弹簧的势能转化为动能。用脚手架生成项目。迭代 20 次后误差收敛。")
|
|
||||||
self.assertNotIn("1.7", rules(f))
|
|
||||||
self.assertNotIn("1.3", rules(f))
|
|
||||||
|
|
||||||
def test_zhuxiao_account_allowed(self):
|
|
||||||
f = self.checker.check_text("注销账号后数据不可恢复。")
|
|
||||||
self.assertFalse(any("注销" in x.message for x in f))
|
|
||||||
|
|
||||||
def test_ranhou_only_in_ordered(self):
|
|
||||||
f = self.checker.check_text("1. 打开终端,然后运行命令。")
|
|
||||||
self.assertIn("4.1", rules(f))
|
|
||||||
f = self.checker.check_text("服务读取配置,然后连接数据库。")
|
|
||||||
self.assertNotIn("4.1", rules(f))
|
|
||||||
|
|
||||||
def test_substring_matches_are_not_banned_words(self):
|
|
||||||
for text in ["可以传入参数,生成对应的值。", "坐标位置不准确。", "添加以下参数。", "我们不得不为此调整。",
|
|
||||||
"为其实施写保护。", "你不一定要从零开始。", "节点选择完全受控。", "针对标识符的定义。", "一千万行数据。"]:
|
|
||||||
f = [x for x in self.checker.check_text(text) if x.rule in ("1.1", "1.3", "1.4", "1.7")]
|
|
||||||
self.assertEqual(f, [], text)
|
|
||||||
|
|
||||||
def test_degree_and_estimate_words_only_in_operations(self):
|
|
||||||
self.assertNotIn("1.5", rules(self.checker.check_text("大部分用户不用 beta 版。尽快升级。")))
|
|
||||||
self.assertIn("1.5", rules(self.checker.check_text("1. 尽快重启服务。")))
|
|
||||||
# 很、非常、合适这类词连操作句里也多是正常用法,不自动检查
|
|
||||||
self.assertNotIn("1.5", rules(self.checker.check_text("1. 等待很长时间。")))
|
|
||||||
self.assertNotIn("5.4", rules(self.checker.check_text("这会有大约 16 KB 的基本打包大小。")))
|
|
||||||
self.assertIn("5.4", rules(self.checker.check_text("1. 重试若干次。")))
|
|
||||||
self.assertIn("5.4", rules(self.checker.check_text("| 超时 | 大约 30 秒 |")))
|
|
||||||
|
|
||||||
def test_modal_words_only_in_operations(self):
|
|
||||||
self.assertNotIn("2.3", rules(self.checker.check_text("输出结果应该是这样。")))
|
|
||||||
self.assertIn("2.3", rules(self.checker.check_text("1. 您需要先备份。")))
|
|
||||||
# 你、应该在编号列表里多是说明不是步骤,不自动检查
|
|
||||||
self.assertNotIn("2.3", rules(self.checker.check_text("1. 你应该先备份。")))
|
|
||||||
|
|
||||||
def test_open_list_with_example_marker_is_allowed(self):
|
|
||||||
self.assertNotIn("3.5", rules(self.checker.check_text("例如 Deployment、Service 等对象。")))
|
|
||||||
self.assertIn("3.5", rules(self.checker.check_text("支持 MySQL、PostgreSQL 等数据库。")))
|
|
||||||
|
|
||||||
def test_qingkuang_only_after_de(self):
|
|
||||||
self.assertNotIn("1.3", rules(self.checker.check_text("默认情况下,服务监听 8080 端口。")))
|
|
||||||
# 「在……的情况下」是固定搭配,不查;「的情况」单独出现才查
|
|
||||||
self.assertNotIn("1.3", rules(self.checker.check_text("出现错误的情况下重试。")))
|
|
||||||
self.assertIn("1.3", rules(self.checker.check_text("用 TiUP 部署的情况,见下文。")))
|
|
||||||
|
|
||||||
|
|
||||||
class TestSentenceRules(unittest.TestCase):
|
|
||||||
@classmethod
|
|
||||||
def setUpClass(cls):
|
|
||||||
cls.checker = check.Checker(None)
|
|
||||||
|
|
||||||
def test_length_operation(self):
|
|
||||||
long_op = "1. 在确认数据库已经完成备份并且备份文件可以正常恢复之后登录到主服务器。"
|
|
||||||
f = self.checker.check_text(long_op)
|
|
||||||
self.assertIn("2.1", rules(f))
|
|
||||||
|
|
||||||
def test_length_description_ok(self):
|
|
||||||
f = self.checker.check_text("服务读取配置文件。")
|
|
||||||
self.assertNotIn("2.1", rules(f))
|
|
||||||
|
|
||||||
def test_system_subject_in_step_is_description(self):
|
|
||||||
text = "1. 点击「提交」。系统生成订单号并写入数据库,然后发送通知邮件给管理员。"
|
|
||||||
f = self.checker.check_text(text)
|
|
||||||
# 第二句以「系统」开头,按描述句算,40 字以内不报 2.1
|
|
||||||
self.assertNotIn("2.1", rules(f))
|
|
||||||
|
|
||||||
def test_double_negation(self):
|
|
||||||
# 校准后降为建议:「不得不」这类固定搭配模型多判为正常用法
|
|
||||||
f = self.checker.check_text("不得不重启服务。")
|
|
||||||
self.assertTrue(any(x.rule == "2.6" and x.level == check.SHOULD for x in f))
|
|
||||||
|
|
||||||
def test_question_mark(self):
|
|
||||||
f = self.checker.check_text("为什么服务起不来?")
|
|
||||||
self.assertIn("2.9", rules(f))
|
|
||||||
|
|
||||||
def test_exclamation_inside_quotes_ok(self):
|
|
||||||
f = self.checker.check_text("系统显示「保存成功!」。")
|
|
||||||
self.assertNotIn("2.9", rules(f))
|
|
||||||
|
|
||||||
def test_condition_after_action(self):
|
|
||||||
f = self.checker.check_text("1. 重启服务,如果修改了端口号。")
|
|
||||||
self.assertTrue(any(x.rule == "2.5" and x.level == check.MUST for x in f))
|
|
||||||
# 括号里的内容多是补充说明,校准后不再当条件
|
|
||||||
self.assertNotIn("2.5", rules(self.checker.check_text("重启服务(如果修改了端口号)。")))
|
|
||||||
|
|
||||||
def test_passive_in_operation_is_should(self):
|
|
||||||
f = self.checker.check_text("1. 配置文件会被服务读取。")
|
|
||||||
self.assertTrue(any(x.rule == "2.4" and x.level == check.SHOULD for x in f))
|
|
||||||
# 「被 X 的 Y」是定语,不是被动谓语
|
|
||||||
self.assertNotIn("2.4", rules(self.checker.check_text("1. 查看被拒绝的请求。")))
|
|
||||||
|
|
||||||
def test_passive_in_description_is_not_checked(self):
|
|
||||||
# 描述句里的被动多是执行者未知或不重要的合规用法,脚本分不出来,校准后只查操作句
|
|
||||||
f = self.checker.check_text("配置文件会被服务读取。此选项已被弃用。")
|
|
||||||
self.assertNotIn("2.4", rules(f))
|
|
||||||
|
|
||||||
def test_passive_markers_inside_other_words_are_not_passive(self):
|
|
||||||
# 来自 answer-me-with-html 维护者在 1000 篇中文文档上的实测误报。
|
|
||||||
for text in ["把被子叠好。", "因为缓存所在目录不可写,任务失败。", "成为开发者所需的全部工具。", "系统所示的路径。"]:
|
|
||||||
f = self.checker.check_text(text)
|
|
||||||
self.assertNotIn("2.4", rules(f), text)
|
|
||||||
|
|
||||||
def test_imperative_rule_skips_questions_and_nouns(self):
|
|
||||||
for text in ["1. 需不需要重启,看日志。", "1. 用户表里新增一列。"]:
|
|
||||||
f = self.checker.check_text(text)
|
|
||||||
self.assertNotIn("2.3", rules(f), text)
|
|
||||||
|
|
||||||
def test_reduce_by_times(self):
|
|
||||||
f = self.checker.check_text("延迟降低了 3 倍。")
|
|
||||||
self.assertIn("5.5", rules(f))
|
|
||||||
|
|
||||||
def test_relative_time(self):
|
|
||||||
f = self.checker.check_text("旧接口下周下线。")
|
|
||||||
self.assertIn("5.3", rules(f))
|
|
||||||
# 「稍后」「近期」在技术描述里多指程序时序,不是相对于写作时间的日期
|
|
||||||
self.assertNotIn("5.3", rules(self.checker.check_text("保存当前值,以便稍后恢复。查看近期事件。")))
|
|
||||||
|
|
||||||
def test_chinese_numeral(self):
|
|
||||||
f = self.checker.check_text("等待三秒。")
|
|
||||||
self.assertIn("5.1", rules(f))
|
|
||||||
|
|
||||||
def test_paragraph_sentences(self):
|
|
||||||
text = "一。二。三。四。五。六。七。"
|
|
||||||
f = self.checker.check_text(text)
|
|
||||||
self.assertIn("3.2", rules(f))
|
|
||||||
|
|
||||||
def test_first_then_in_prose_is_not_checked(self):
|
|
||||||
# 3.3 从脚本移除:正文里的「首先……然后……」多数在描述顺序,不是在写步骤(校准精确率 30%)
|
|
||||||
f = self.checker.check_text("首先停止服务,然后备份数据,最后运行脚本。")
|
|
||||||
self.assertNotIn("3.3", rules(f))
|
|
||||||
|
|
||||||
def test_numerals(self):
|
|
||||||
# 「一次」「两次」「一行」是量词习惯用法;三以上和两位数才查
|
|
||||||
self.assertNotIn("5.1", rules(self.checker.check_text("只执行一次。这一行会报错。重试两次。")))
|
|
||||||
self.assertIn("5.1", rules(self.checker.check_text("等待三秒。")))
|
|
||||||
self.assertIn("5.1", rules(self.checker.check_text("保留二十行。")))
|
|
||||||
|
|
||||||
def test_code_block_skipped(self):
|
|
||||||
text = "```\n请进行安装,然后等等等。\n```\n"
|
|
||||||
f = self.checker.check_text(text)
|
|
||||||
self.assertEqual(f, [])
|
|
||||||
|
|
||||||
def test_hard_wrapped_lines_form_one_sentence(self):
|
|
||||||
# Markdown 里的硬换行不是句子边界:两行拼成一句 46 字,报一次 2.1,行号是句子开始的那行
|
|
||||||
text = "第一句。这是一个被硬换行切开的很长的描述句,前半段写在这一行的末尾,\n后半段写在下一行,加起来超过四十个字。"
|
|
||||||
f = [x for x in self.checker.check_text(text) if x.rule == "2.1"]
|
|
||||||
self.assertEqual([(x.line, x.message[:8]) for x in f], [(1, "描述句 45 字")])
|
|
||||||
|
|
||||||
def test_unpunctuated_lines_are_not_sentences(self):
|
|
||||||
text = "\n".join(["基本"] * 8 + ["这些是组件示例的名字。"])
|
|
||||||
self.assertNotIn("3.2", rules(self.checker.check_text(text)))
|
|
||||||
self.assertNotIn("3.2", rules(self.checker.check_text("<code src=\"./demo/basic.tsx\">基本</code>\n" * 8)))
|
|
||||||
|
|
||||||
|
|
||||||
class TestExamples(unittest.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.checker = check.Checker(check.load_vocab())
|
|
||||||
|
|
||||||
def test_before_has_many_findings(self):
|
|
||||||
f = self.checker.check_file(os.path.join(ROOT, "examples", "before.md"))
|
|
||||||
must = [x for x in f if x.level == check.MUST]
|
|
||||||
self.assertGreaterEqual(len(must), 15)
|
|
||||||
|
|
||||||
def test_after_has_no_must(self):
|
|
||||||
f = self.checker.check_file(os.path.join(ROOT, "examples", "after.md"))
|
|
||||||
must = [x for x in f if x.level == check.MUST]
|
|
||||||
self.assertEqual(must, [], "\n".join(x.format() for x in must))
|
|
||||||
|
|
||||||
|
|
||||||
class TestCli(unittest.TestCase):
|
|
||||||
def test_strict_exit_code(self):
|
|
||||||
before = os.path.join(ROOT, "examples", "before.md")
|
|
||||||
after = os.path.join(ROOT, "examples", "after.md")
|
|
||||||
self.assertEqual(check.main(["--strict", "--quiet", before]), 1)
|
|
||||||
self.assertEqual(check.main(["--strict", "--quiet", after]), 0)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
unittest.main()
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# 校准流程
|
|
||||||
|
|
||||||
这个目录的脚本把检查脚本放到真实中文技术文档上跑。它们量出每条规则、每个词的命中数和精确率。结果决定规则的级别、阈值和词表的取舍。校准结果见 [docs/校准报告.md](../../docs/校准报告.md)。
|
|
||||||
|
|
||||||
## 步骤
|
|
||||||
|
|
||||||
1. 准备语料。每个文档仓库克隆到 `.data/corpus/<名称>/`。大仓库用稀疏检出只取中文文档目录。`.data/` 不入库。
|
|
||||||
2. 记录语料版本:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/calibration/manifest.py .data/corpus .data/calib/corpora.json
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 统计命中和句长分布:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/calibration/stats.py .data/corpus .data/calib
|
|
||||||
```
|
|
||||||
|
|
||||||
只统计正文以中文为主的 Markdown 文件。双语仓库只取中文版。输出 `findings.jsonl`、`sentences.jsonl`、`stats.json`、`stats.md`。
|
|
||||||
|
|
||||||
4. 分层抽样:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/calibration/sample.py .data/corpus .data/calib --per-rule 50 --per-word 8
|
|
||||||
```
|
|
||||||
|
|
||||||
每条规则最多 50 条。词表类规则先按词分层,每个词最多 8 条,再在语料库之间轮流取。
|
|
||||||
|
|
||||||
5. 模型初判:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/calibration/label.py .data/calib --env <含 LLM_BASE_URL、LLM_API_KEY、LLM_MODEL 的文件>
|
|
||||||
```
|
|
||||||
|
|
||||||
每条样本给出「真」「误」「不确定」和一句理由。支持断点续跑。
|
|
||||||
|
|
||||||
6. 人工复核。把复核结果写进 `.data/calib/labels.human.jsonl`,字段和 `labels.jsonl` 相同,人工结果覆盖模型结果。
|
|
||||||
7. 生成报告:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 tools/calibration/report.py .data/calib
|
|
||||||
```
|
|
||||||
|
|
||||||
`report.md` 是表格,`misses.md` 列出所有判为误报的样本和理由,用来修正则和词表。
|
|
||||||
|
|
||||||
## 判定标准
|
|
||||||
|
|
||||||
- 真:规则按字面确实被违反,而且按规则改写后,这句话不会变得更不准确。
|
|
||||||
- 误:命中的词或句在这里是正常用法、固定术语、引用的界面文字或代码。按规则改写会损害意思的也算误。
|
|
||||||
- 不确定:两种判断都说得通。不计入精确率。
|
|
||||||
|
|
||||||
## 处理规则
|
|
||||||
|
|
||||||
精确率 = 真 / (真 + 误)。
|
|
||||||
|
|
||||||
| 精确率 | 处理 |
|
|
||||||
| --- | --- |
|
|
||||||
| 不低于 80% | 保留 |
|
|
||||||
| 50% 到 79% | 给词加匹配条件,或把规则降为【建议】 |
|
|
||||||
| 低于 50% | 从脚本移除。规则只留在规范文本里,由人判断 |
|
|
||||||
|
|
||||||
句长阈值取好文档中句长分布的 p90 附近,而不是拍脑袋。
|
|
||||||
@@ -1,193 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""用模型初判抽样结果是真报还是误报。结果供人工抽查,不直接当结论。
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 tools/calibration/label.py <输出目录> --env <含 LLM_* 变量的 .env 文件> [--workers 8] [--limit N]
|
|
||||||
|
|
||||||
读取 sample.jsonl,对每条样本给出 verdict(真 / 误 / 不确定)和一句理由,写入 labels.jsonl。
|
|
||||||
断点续跑:labels.jsonl 里已有的 id 跳过。
|
|
||||||
.env 里需要:LLM_BASE_URL(OpenAI 兼容)、LLM_API_KEY、LLM_MODEL;可选 LLM_EXTRA_JSON(并入请求体)。
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import urllib.error
|
|
||||||
import urllib.request
|
|
||||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
||||||
from typing import Dict, Optional
|
|
||||||
|
|
||||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
ROOT = os.path.normpath(os.path.join(HERE, "..", ".."))
|
|
||||||
|
|
||||||
SYSTEM = """你是一名中文技术文档编辑。有一套写作规范和一个按规范检查文档的脚本。
|
|
||||||
脚本在一篇真实文档里报了一条提示。请判断这条提示是否成立。
|
|
||||||
|
|
||||||
脚本的字数算法(附录 A):每个汉字计 1,每个英文单词或数字串计 1,行内代码(显示为 CODE)计 1,标点不计。
|
|
||||||
「命中的句子」只显示前 40 个字符,完整句子看上下文。脚本已经把一个段落的多行拼成一句再分句,不会被换行截断。
|
|
||||||
|
|
||||||
判定标准:
|
|
||||||
- 真:规则按字面确实被违反,而且按规则改写后,这句话不会变得更不准确。
|
|
||||||
- 误:命中的词或句在这里是正常用法、固定术语、引用的界面文字或代码,或者按规则改写会损害意思。
|
|
||||||
- 不确定:两种判断都说得通。
|
|
||||||
|
|
||||||
只输出一行 JSON:{"verdict": "真|误|不确定", "reason": "不超过 40 字的理由"}"""
|
|
||||||
|
|
||||||
|
|
||||||
def load_env(path: str) -> Dict[str, str]:
|
|
||||||
env: Dict[str, str] = {}
|
|
||||||
with open(path, encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
line = line.strip()
|
|
||||||
if not line or line.startswith("#") or "=" not in line:
|
|
||||||
continue
|
|
||||||
k, v = line.split("=", 1)
|
|
||||||
env[k.strip()] = v.strip().strip('"').strip("'") if not v.strip().startswith("{") else v.strip()
|
|
||||||
return env
|
|
||||||
|
|
||||||
|
|
||||||
def load_rules() -> Dict[str, str]:
|
|
||||||
"""规范.md 里每条规则的标题和正文(含批准 / 不批准例子)。"""
|
|
||||||
with open(os.path.join(ROOT, "规范.md"), encoding="utf-8") as f:
|
|
||||||
text = f.read()
|
|
||||||
rules: Dict[str, str] = {}
|
|
||||||
parts = re.split(r"^(?=### \d+\.\d+ )", text, flags=re.M)
|
|
||||||
for p in parts:
|
|
||||||
m = re.match(r"### (\d+\.\d+) (.*)", p)
|
|
||||||
if not m:
|
|
||||||
continue
|
|
||||||
body = re.split(r"^## ", p, flags=re.M)[0].strip()
|
|
||||||
rules[m.group(1)] = body[:1500]
|
|
||||||
return rules
|
|
||||||
|
|
||||||
|
|
||||||
def load_vocab_rows() -> Dict[str, str]:
|
|
||||||
"""词表里每个词所在的表格行,供模型看替换建议。"""
|
|
||||||
rows: Dict[str, str] = {}
|
|
||||||
with open(os.path.join(ROOT, "词表.md"), encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
if not line.startswith("|") or "---" in line:
|
|
||||||
continue
|
|
||||||
cells = [c.strip() for c in line.strip().strip("|").split("|")]
|
|
||||||
for w in re.split("[、,]", cells[0]):
|
|
||||||
if w and w not in rows:
|
|
||||||
rows[w] = line.strip()
|
|
||||||
if len(cells) > 2:
|
|
||||||
for w in re.split("[、,]", cells[2]):
|
|
||||||
if w and w not in rows:
|
|
||||||
rows[w] = line.strip()
|
|
||||||
return rows
|
|
||||||
|
|
||||||
|
|
||||||
def build_prompt(rec: dict, rules: Dict[str, str], vocab: Dict[str, str]) -> str:
|
|
||||||
parts = [f"## 规则 {rec['rule']}", rules.get(rec["rule"], "(规则正文缺失)")]
|
|
||||||
if rec.get("word") and rec["word"] in vocab:
|
|
||||||
parts += ["", "## 词表条目", vocab[rec["word"]]]
|
|
||||||
parts += ["", "## 脚本的提示", rec["message"], "", "## 命中的句子", rec["text"]]
|
|
||||||
if rec.get("context"):
|
|
||||||
parts += ["", "## 上下文(原文,命中行前后各一行)", *rec["context"]]
|
|
||||||
parts += ["", f"文档来自 {rec['corpus']},路径 {rec['path']}。这条提示成立吗?"]
|
|
||||||
return "\n".join(parts)
|
|
||||||
|
|
||||||
|
|
||||||
def call(env: Dict[str, str], prompt: str, timeout: int = 90) -> str:
|
|
||||||
body: dict = {
|
|
||||||
"model": env["LLM_MODEL"],
|
|
||||||
"messages": [{"role": "system", "content": SYSTEM}, {"role": "user", "content": prompt}],
|
|
||||||
"temperature": 0,
|
|
||||||
"max_tokens": 200,
|
|
||||||
}
|
|
||||||
if env.get("LLM_EXTRA_JSON"):
|
|
||||||
body.update(json.loads(env["LLM_EXTRA_JSON"]))
|
|
||||||
req = urllib.request.Request(
|
|
||||||
env["LLM_BASE_URL"].rstrip("/") + "/chat/completions",
|
|
||||||
data=json.dumps(body).encode("utf-8"),
|
|
||||||
headers={"Content-Type": "application/json", "Authorization": f"Bearer {env['LLM_API_KEY']}"},
|
|
||||||
)
|
|
||||||
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
|
||||||
data = json.loads(resp.read().decode("utf-8"))
|
|
||||||
return data["choices"][0]["message"]["content"]
|
|
||||||
|
|
||||||
|
|
||||||
def parse_verdict(text: str) -> Optional[dict]:
|
|
||||||
m = re.search(r"\{.*\}", text, flags=re.S)
|
|
||||||
if not m:
|
|
||||||
return None
|
|
||||||
try:
|
|
||||||
obj = json.loads(m.group(0))
|
|
||||||
except json.JSONDecodeError:
|
|
||||||
return None
|
|
||||||
v = str(obj.get("verdict", "")).strip()
|
|
||||||
if v not in ("真", "误", "不确定"):
|
|
||||||
return None
|
|
||||||
return {"verdict": v, "reason": str(obj.get("reason", ""))[:120]}
|
|
||||||
|
|
||||||
|
|
||||||
def label_one(env: Dict[str, str], rec: dict, rules: Dict[str, str], vocab: Dict[str, str]) -> dict:
|
|
||||||
prompt = build_prompt(rec, rules, vocab)
|
|
||||||
last_err = ""
|
|
||||||
for attempt in range(3):
|
|
||||||
try:
|
|
||||||
raw = call(env, prompt)
|
|
||||||
parsed = parse_verdict(raw)
|
|
||||||
if parsed:
|
|
||||||
return {"id": rec["id"], "rule": rec["rule"], "word": rec.get("word"), **parsed, "model": env["LLM_MODEL"]}
|
|
||||||
last_err = f"无法解析:{raw[:80]}"
|
|
||||||
except (urllib.error.URLError, TimeoutError, KeyError, json.JSONDecodeError) as e:
|
|
||||||
last_err = repr(e)[:120]
|
|
||||||
time.sleep(2 * (attempt + 1))
|
|
||||||
return {"id": rec["id"], "rule": rec["rule"], "word": rec.get("word"), "verdict": "错误", "reason": last_err, "model": env["LLM_MODEL"]}
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
|
||||||
ap = argparse.ArgumentParser()
|
|
||||||
ap.add_argument("out_dir")
|
|
||||||
ap.add_argument("--env", required=True)
|
|
||||||
ap.add_argument("--workers", type=int, default=8)
|
|
||||||
ap.add_argument("--limit", type=int, default=0)
|
|
||||||
args = ap.parse_args()
|
|
||||||
env = load_env(args.env)
|
|
||||||
for k in ("LLM_BASE_URL", "LLM_API_KEY", "LLM_MODEL"):
|
|
||||||
if k not in env:
|
|
||||||
print(f"缺少 {k}", file=sys.stderr)
|
|
||||||
return 2
|
|
||||||
rules, vocab = load_rules(), load_vocab_rows()
|
|
||||||
|
|
||||||
labels_path = os.path.join(args.out_dir, "labels.jsonl")
|
|
||||||
done = set()
|
|
||||||
if os.path.exists(labels_path):
|
|
||||||
with open(labels_path, encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
rec = json.loads(line)
|
|
||||||
if rec.get("verdict") != "错误":
|
|
||||||
done.add(rec["id"])
|
|
||||||
todo = []
|
|
||||||
with open(os.path.join(args.out_dir, "sample.jsonl"), encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
rec = json.loads(line)
|
|
||||||
if rec["id"] not in done:
|
|
||||||
todo.append(rec)
|
|
||||||
if args.limit:
|
|
||||||
todo = todo[: args.limit]
|
|
||||||
print(f"已标 {len(done)},待标 {len(todo)}", file=sys.stderr)
|
|
||||||
|
|
||||||
n_ok = n_err = 0
|
|
||||||
with open(labels_path, "a", encoding="utf-8") as out, ThreadPoolExecutor(args.workers) as pool:
|
|
||||||
futures = [pool.submit(label_one, env, rec, rules, vocab) for rec in todo]
|
|
||||||
for i, fut in enumerate(as_completed(futures), 1):
|
|
||||||
res = fut.result()
|
|
||||||
out.write(json.dumps(res, ensure_ascii=False) + "\n")
|
|
||||||
out.flush()
|
|
||||||
n_err += res["verdict"] == "错误"
|
|
||||||
n_ok += res["verdict"] != "错误"
|
|
||||||
if i % 25 == 0:
|
|
||||||
print(f" {i}/{len(todo)}(失败 {n_err})", file=sys.stderr)
|
|
||||||
print(f"完成:成功 {n_ok},失败 {n_err}", file=sys.stderr)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""记录语料目录里每个仓库的来源和提交号,写成 corpora.json,让别人能复现同一份语料。
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 tools/calibration/manifest.py <语料目录> <输出文件>
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def git(path: str, *args: str) -> str:
|
|
||||||
try:
|
|
||||||
return subprocess.check_output(["git", "-C", path, *args], text=True, stderr=subprocess.DEVNULL).strip()
|
|
||||||
except subprocess.CalledProcessError:
|
|
||||||
return ""
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv) -> int:
|
|
||||||
if len(argv) != 3:
|
|
||||||
print(__doc__)
|
|
||||||
return 2
|
|
||||||
root, out = argv[1], argv[2]
|
|
||||||
corpora = []
|
|
||||||
for name in sorted(os.listdir(root)):
|
|
||||||
path = os.path.join(root, name)
|
|
||||||
if not os.path.isdir(os.path.join(path, ".git")):
|
|
||||||
continue
|
|
||||||
sparse = git(path, "sparse-checkout", "list").split("\n") if git(path, "config", "core.sparseCheckout") == "true" else []
|
|
||||||
corpora.append({
|
|
||||||
"name": name,
|
|
||||||
"remote": git(path, "remote", "get-url", "origin"),
|
|
||||||
"commit": git(path, "rev-parse", "HEAD"),
|
|
||||||
"date": git(path, "log", "-1", "--format=%cs"),
|
|
||||||
"paths": [p for p in sparse if p],
|
|
||||||
})
|
|
||||||
with open(out, "w", encoding="utf-8") as f:
|
|
||||||
json.dump(corpora, f, ensure_ascii=False, indent=1)
|
|
||||||
for c in corpora:
|
|
||||||
print(f"{c['name']}: {c['remote']} @ {c['commit'][:7]} ({c['date']}) {' '.join(c['paths'])}")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main(sys.argv))
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""汇总命中统计和标注结果,算出每条规则、每个词的精确率,生成校准报告草稿。
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 tools/calibration/report.py <输出目录>
|
|
||||||
|
|
||||||
读取 stats.json、sample.jsonl、labels.jsonl;如果有 labels.human.jsonl(人工复核,同样的 id 和 verdict 字段),
|
|
||||||
人工结果覆盖模型结果。输出 report.md(表格)和 misses.md(所有判为误报的样本及理由,供修规则用)。
|
|
||||||
|
|
||||||
精确率 = 真 / (真 + 误),不确定不计入。建议列按精确率给:
|
|
||||||
≥ 0.80 保留;0.50–0.79 加条件或降为建议;< 0.50 从脚本移除,规则只留在文本里。
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import math
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from collections import Counter, defaultdict
|
|
||||||
from typing import Dict, List, Optional, Tuple
|
|
||||||
|
|
||||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
ROOT = os.path.normpath(os.path.join(HERE, "..", ".."))
|
|
||||||
|
|
||||||
|
|
||||||
def wilson_low(k: int, n: int, z: float = 1.96) -> Optional[float]:
|
|
||||||
"""精确率的 Wilson 区间下界,样本少时提醒别过度相信。"""
|
|
||||||
if n == 0:
|
|
||||||
return None
|
|
||||||
p = k / n
|
|
||||||
denom = 1 + z * z / n
|
|
||||||
centre = p + z * z / (2 * n)
|
|
||||||
margin = z * math.sqrt(p * (1 - p) / n + z * z / (4 * n * n))
|
|
||||||
return max(0.0, (centre - margin) / denom)
|
|
||||||
|
|
||||||
|
|
||||||
def rule_titles() -> Dict[str, Tuple[str, str]]:
|
|
||||||
out: Dict[str, Tuple[str, str]] = {}
|
|
||||||
with open(os.path.join(ROOT, "规范.md"), encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
m = re.match(r"### (\d+\.\d+) (.*?)【(必须|建议)】", line)
|
|
||||||
if m:
|
|
||||||
out[m.group(1)] = (m.group(2), m.group(3))
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
def advice(p: Optional[float], n: int) -> str:
|
|
||||||
if p is None or n == 0:
|
|
||||||
return "无样本"
|
|
||||||
if n < 10:
|
|
||||||
return "样本不足"
|
|
||||||
if p >= 0.8:
|
|
||||||
return "保留"
|
|
||||||
if p >= 0.5:
|
|
||||||
return "加条件 / 降为建议"
|
|
||||||
return "从脚本移除"
|
|
||||||
|
|
||||||
|
|
||||||
def fmt_p(p: Optional[float]) -> str:
|
|
||||||
return "–" if p is None else f"{p * 100:.0f}%"
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv: List[str]) -> int:
|
|
||||||
if len(argv) != 2:
|
|
||||||
print(__doc__)
|
|
||||||
return 2
|
|
||||||
out_dir = argv[1]
|
|
||||||
with open(os.path.join(out_dir, "stats.json"), encoding="utf-8") as f:
|
|
||||||
stats = json.load(f)
|
|
||||||
sample: Dict[str, dict] = {}
|
|
||||||
with open(os.path.join(out_dir, "sample.jsonl"), encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
rec = json.loads(line)
|
|
||||||
sample[rec["id"]] = rec
|
|
||||||
labels: Dict[str, dict] = {}
|
|
||||||
for name in ("labels.jsonl", "labels.human.jsonl"):
|
|
||||||
path = os.path.join(out_dir, name)
|
|
||||||
if not os.path.exists(path):
|
|
||||||
continue
|
|
||||||
with open(path, encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
rec = json.loads(line)
|
|
||||||
if rec.get("verdict") in ("真", "误", "不确定"):
|
|
||||||
labels[rec["id"]] = {**rec, "source": "人工" if "human" in name else "模型"}
|
|
||||||
|
|
||||||
titles = rule_titles()
|
|
||||||
total_chars = sum(c["chars"] for c in stats["corpora"].values()) or 1
|
|
||||||
|
|
||||||
by_rule: Dict[str, Counter] = defaultdict(Counter)
|
|
||||||
by_word: Dict[str, Counter] = defaultdict(Counter)
|
|
||||||
misses: Dict[str, List[dict]] = defaultdict(list)
|
|
||||||
for sid, rec in sample.items():
|
|
||||||
lab = labels.get(sid)
|
|
||||||
if not lab:
|
|
||||||
by_rule[rec["rule"]]["未标"] += 1
|
|
||||||
continue
|
|
||||||
by_rule[rec["rule"]][lab["verdict"]] += 1
|
|
||||||
if rec.get("word"):
|
|
||||||
by_word[rec["word"]][lab["verdict"]] += 1
|
|
||||||
if lab["verdict"] == "误":
|
|
||||||
misses[rec["rule"]].append({**rec, "reason": lab["reason"], "source": lab["source"]})
|
|
||||||
|
|
||||||
md = ["# 校准报告(草稿,由 tools/calibration/report.py 生成)", ""]
|
|
||||||
md += ["## 语料", "", "| 语料库 | 文件 | 句子 | 字数 | 命中 | 每万字命中 |", "| --- | ---: | ---: | ---: | ---: | ---: |"]
|
|
||||||
for c, s in stats["corpora"].items():
|
|
||||||
md.append(f"| {c} | {s['files']} | {s['sentences']} | {s['chars']} | {s['findings']} | {s['findings_per_10k_chars']} |")
|
|
||||||
md.append(f"| 合计 | {sum(s['files'] for s in stats['corpora'].values())} | {sum(s['sentences'] for s in stats['corpora'].values())} | {total_chars} | {stats['total_findings']} | {stats['total_findings'] / total_chars * 10000:.1f} |")
|
|
||||||
|
|
||||||
md += ["", "## 每条规则", "", "精确率 = 真 / (真 + 误)。括号里是 95% 置信区间下界。", "",
|
|
||||||
"| 规则 | 名称 | 级别 | 命中 | 每万字 | 抽样 | 真 | 误 | 不确定 | 精确率 | 估计误报/万字 | 建议 |",
|
|
||||||
"| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |"]
|
|
||||||
rules = sorted(stats["rules"], key=lambda r: -stats["rules"][r]["total"])
|
|
||||||
for r in rules:
|
|
||||||
c = by_rule.get(r, Counter())
|
|
||||||
k, n = c["真"], c["真"] + c["误"]
|
|
||||||
p = k / n if n else None
|
|
||||||
low = wilson_low(k, n)
|
|
||||||
hits = stats["rules"][r]["total"]
|
|
||||||
per10k = hits / total_chars * 10000
|
|
||||||
fp = per10k * (1 - p) if p is not None else None
|
|
||||||
title, level = titles.get(r, ("?", "?"))
|
|
||||||
md.append(f"| {r} | {title} | {level} | {hits} | {per10k:.1f} | {sum(c.values())} | {c['真']} | {c['误']} | {c['不确定']} | "
|
|
||||||
f"{fmt_p(p)}{'' if low is None else f' ({fmt_p(low)})'} | {'–' if fp is None else f'{fp:.1f}'} | {advice(p, n)} |")
|
|
||||||
|
|
||||||
md += ["", "## 词表条目(按命中数排序,只列有样本的词)", "",
|
|
||||||
"| 词 | 规则 | 命中 | 每万字 | 抽样 | 真 | 误 | 精确率 | 建议 |", "| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- |"]
|
|
||||||
words = sorted(stats["words"], key=lambda w: -stats["words"][w]["total"])
|
|
||||||
for w in words:
|
|
||||||
c = by_word.get(w)
|
|
||||||
if not c:
|
|
||||||
continue
|
|
||||||
k, n = c["真"], c["真"] + c["误"]
|
|
||||||
p = k / n if n else None
|
|
||||||
info = stats["words"][w]
|
|
||||||
md.append(f"| {w} | {info['rule']} | {info['total']} | {info['total'] / total_chars * 10000:.2f} | {sum(c.values())} | {c['真']} | {c['误']} | {fmt_p(p)} | {advice(p, n)} |")
|
|
||||||
|
|
||||||
limits = stats.get("limits", {"操作": "?", "描述": "?"})
|
|
||||||
md += ["", "## 句长分布(字)", "", f"| 语料库 | 句型 | n | 均值 | p50 | p90 | p95 | p99 | 超过上限(操作 {limits['操作']} / 描述 {limits['描述']}) |",
|
|
||||||
"| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |"]
|
|
||||||
for c in list(stats["corpora"]) + ["__all__"]:
|
|
||||||
for k in ("操作", "描述"):
|
|
||||||
p = stats["sentence_length"].get(c, {}).get(k) or {}
|
|
||||||
if not p:
|
|
||||||
continue
|
|
||||||
over = stats["over_limit"][c][k]
|
|
||||||
md.append(f"| {'合计' if c == '__all__' else c} | {k} | {p['n']} | {p['mean']} | {p['p50']} | {p['p90']} | {p['p95']} | {p['p99']} | {over}% |")
|
|
||||||
|
|
||||||
n_lab = sum(sum(c[v] for v in ("真", "误", "不确定")) for c in by_rule.values())
|
|
||||||
n_human = sum(1 for l in labels.values() if l["source"] == "人工")
|
|
||||||
md += ["", f"样本 {len(sample)} 条,已标 {n_lab} 条,其中人工复核 {n_human} 条。", ""]
|
|
||||||
with open(os.path.join(out_dir, "report.md"), "w", encoding="utf-8") as f:
|
|
||||||
f.write("\n".join(md))
|
|
||||||
|
|
||||||
lines = ["# 判为误报的样本", ""]
|
|
||||||
for r in rules:
|
|
||||||
if not misses.get(r):
|
|
||||||
continue
|
|
||||||
title = titles.get(r, ("?", "?"))[0]
|
|
||||||
lines += [f"## {r} {title}({len(misses[r])} 条)", ""]
|
|
||||||
for m in misses[r]:
|
|
||||||
w = f"「{m['word']}」" if m.get("word") else ""
|
|
||||||
lines.append(f"- {w}{m['text']} \n 理由:{m['reason']}({m['source']};{m['corpus']} {m['path']}:{m['line']})")
|
|
||||||
lines.append("")
|
|
||||||
with open(os.path.join(out_dir, "misses.md"), "w", encoding="utf-8") as f:
|
|
||||||
f.write("\n".join(lines))
|
|
||||||
print(f"report.md 和 misses.md 已写入 {out_dir}", file=sys.stderr)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main(sys.argv))
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""从 findings.jsonl 分层抽样,生成待标注的样本。
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 tools/calibration/sample.py <语料目录> <输出目录> [--per-rule 50] [--per-word 8] [--seed 1]
|
|
||||||
|
|
||||||
每条规则最多抽 per-rule 条。词表类规则先按词分层,每个词最多 per-word 条,再在语料库之间轮流取,
|
|
||||||
让样本覆盖不同的词和不同的文档风格。每条样本附上命中行前后各一行原文作为上下文。
|
|
||||||
输出 sample.jsonl。
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import sys
|
|
||||||
from collections import defaultdict
|
|
||||||
from typing import Dict, List
|
|
||||||
|
|
||||||
WORD_RULES = {"1.1", "1.3", "1.4", "1.5", "1.7", "2.3", "3.5", "4.1", "5.2", "5.4", "3.3"}
|
|
||||||
|
|
||||||
|
|
||||||
def round_robin(groups: Dict[str, List[dict]], limit: int, rng: random.Random) -> List[dict]:
|
|
||||||
"""在各组之间轮流取,直到取满 limit 条或取完。"""
|
|
||||||
for g in groups.values():
|
|
||||||
rng.shuffle(g)
|
|
||||||
out: List[dict] = []
|
|
||||||
keys = sorted(groups)
|
|
||||||
i = 0
|
|
||||||
while len(out) < limit and any(groups.values()):
|
|
||||||
k = keys[i % len(keys)]
|
|
||||||
if groups[k]:
|
|
||||||
out.append(groups[k].pop())
|
|
||||||
i += 1
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
def context(corpus_root: str, rec: dict, width: int = 1) -> List[str]:
|
|
||||||
path = os.path.join(corpus_root, rec["corpus"], rec["path"])
|
|
||||||
try:
|
|
||||||
with open(path, encoding="utf-8") as f:
|
|
||||||
lines = f.read().splitlines()
|
|
||||||
except OSError:
|
|
||||||
return []
|
|
||||||
lo = max(0, rec["line"] - 1 - width)
|
|
||||||
hi = min(len(lines), rec["line"] + width)
|
|
||||||
return [l[:300] for l in lines[lo:hi]]
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
|
||||||
ap = argparse.ArgumentParser()
|
|
||||||
ap.add_argument("corpus_root")
|
|
||||||
ap.add_argument("out_dir")
|
|
||||||
ap.add_argument("--per-rule", type=int, default=50)
|
|
||||||
ap.add_argument("--per-word", type=int, default=8)
|
|
||||||
ap.add_argument("--seed", type=int, default=1)
|
|
||||||
args = ap.parse_args()
|
|
||||||
rng = random.Random(args.seed)
|
|
||||||
|
|
||||||
by_rule: Dict[str, List[dict]] = defaultdict(list)
|
|
||||||
with open(os.path.join(args.out_dir, "findings.jsonl"), encoding="utf-8") as f:
|
|
||||||
for line in f:
|
|
||||||
rec = json.loads(line)
|
|
||||||
by_rule[rec["rule"]].append(rec)
|
|
||||||
|
|
||||||
sample: List[dict] = []
|
|
||||||
for rule in sorted(by_rule):
|
|
||||||
recs = by_rule[rule]
|
|
||||||
if rule in WORD_RULES:
|
|
||||||
# 先按词分层:每个词最多 per-word 条,词内按语料库轮流
|
|
||||||
by_word: Dict[str, Dict[str, List[dict]]] = defaultdict(lambda: defaultdict(list))
|
|
||||||
for r in recs:
|
|
||||||
by_word[r.get("word") or "?"][r["corpus"]].append(r)
|
|
||||||
per_word = {w: round_robin(groups, args.per_word, rng) for w, groups in by_word.items()}
|
|
||||||
picked = round_robin({w: v for w, v in per_word.items()}, args.per_rule, rng)
|
|
||||||
else:
|
|
||||||
by_corpus: Dict[str, List[dict]] = defaultdict(list)
|
|
||||||
for r in recs:
|
|
||||||
by_corpus[r["corpus"]].append(r)
|
|
||||||
picked = round_robin(by_corpus, args.per_rule, rng)
|
|
||||||
for r in picked:
|
|
||||||
r["context"] = context(args.corpus_root, r)
|
|
||||||
sample.extend(sorted(picked, key=lambda r: r["id"]))
|
|
||||||
print(f"{rule}: 命中 {len(recs)},抽 {len(picked)}", file=sys.stderr)
|
|
||||||
|
|
||||||
with open(os.path.join(args.out_dir, "sample.jsonl"), "w", encoding="utf-8") as f:
|
|
||||||
for r in sample:
|
|
||||||
f.write(json.dumps(r, ensure_ascii=False) + "\n")
|
|
||||||
print(f"共抽 {len(sample)} 条", file=sys.stderr)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
@@ -1,219 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""在真实语料上运行检查脚本,统计每条规则、每个词的命中数和句长分布。
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 tools/calibration/stats.py <语料目录> <输出目录>
|
|
||||||
|
|
||||||
语料目录下每个子目录是一个语料库(一个文档仓库)。只统计中文为主的 Markdown 文件。
|
|
||||||
输出:
|
|
||||||
findings.jsonl 每条命中一行,带语料库、路径、行号、规则、词
|
|
||||||
sentences.jsonl 每个句子一行,带句型(操作/描述)、字数、「的」数
|
|
||||||
stats.json 汇总数字
|
|
||||||
stats.md 汇总表,可直接贴进校准报告
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from collections import Counter, defaultdict
|
|
||||||
from typing import Dict, Iterator, List, Optional
|
|
||||||
|
|
||||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
sys.path.insert(0, os.path.join(HERE, ".."))
|
|
||||||
import check # noqa: E402
|
|
||||||
|
|
||||||
SKIP_DIRS = {".git", "node_modules", ".github", ".vitepress", "public", "_template"}
|
|
||||||
MIN_CJK = 100 # 少于这个数的汉字按非中文文件处理
|
|
||||||
WORD_IN_MESSAGE = re.compile(r"「(.+?)」")
|
|
||||||
|
|
||||||
|
|
||||||
PROSE_NOISE = [
|
|
||||||
(re.compile(r"\A---\n.*?\n---\n", re.S), ""), # front matter
|
|
||||||
(re.compile(r"<!--.*?-->", re.S), ""), # HTML 注释(k8s 中文文档用它保留英文原文)
|
|
||||||
(re.compile(r"```.*?```", re.S), ""), # 代码块
|
|
||||||
(re.compile(r"`[^`\n]*`"), ""), # 行内代码
|
|
||||||
(re.compile(r"https?://\S+"), ""), # 链接
|
|
||||||
(re.compile(r"<[^>\n]+>"), ""), # HTML 标签
|
|
||||||
(re.compile(r"\{\{.*?\}\}", re.S), ""), # Hugo / 模板短代码
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def is_chinese_doc(text: str) -> bool:
|
|
||||||
"""正文(去掉代码、注释、链接、标签后)以中文为主的文件才算语料。"""
|
|
||||||
for pat, rep in PROSE_NOISE:
|
|
||||||
text = pat.sub(rep, text)
|
|
||||||
cjk = len(check.CJK.findall(text))
|
|
||||||
latin = len(re.findall(r"[A-Za-z]", text))
|
|
||||||
return cjk >= MIN_CJK and cjk * 2 >= latin
|
|
||||||
|
|
||||||
|
|
||||||
def md_files(root: str) -> Iterator[str]:
|
|
||||||
for dirpath, dirnames, filenames in os.walk(root):
|
|
||||||
dirnames[:] = sorted(d for d in dirnames if d not in SKIP_DIRS)
|
|
||||||
for name in sorted(filenames):
|
|
||||||
if not name.endswith(".md"):
|
|
||||||
continue
|
|
||||||
# ant-design 这类双语仓库:只取中文版
|
|
||||||
if re.search(r"\.(en-US|en)\.md$", name):
|
|
||||||
continue
|
|
||||||
yield os.path.join(dirpath, name)
|
|
||||||
|
|
||||||
|
|
||||||
def sentences_of(text: str, checker: check.Checker) -> Iterator[dict]:
|
|
||||||
"""按检查脚本同样的切分和句型判断产出句子。"""
|
|
||||||
units = check.parse_units(text.splitlines())
|
|
||||||
in_counterexample = False
|
|
||||||
for unit in units:
|
|
||||||
if not unit.indented:
|
|
||||||
in_counterexample = check.is_counterexample(unit.lines[0])
|
|
||||||
if in_counterexample or unit.skip or unit.kind in ("heading", "table"):
|
|
||||||
continue
|
|
||||||
for pos, (s, line_no) in enumerate(check.unit_sentences(unit)):
|
|
||||||
n = check.count_chars(s)
|
|
||||||
if n == 0:
|
|
||||||
continue
|
|
||||||
yield {
|
|
||||||
"line": line_no,
|
|
||||||
"unit": unit.kind,
|
|
||||||
"kind": "操作" if checker.is_operation(unit, s, pos) else "描述",
|
|
||||||
"chars": n,
|
|
||||||
"de": s.count("的"),
|
|
||||||
"text": s[:80],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def percentiles(values: List[int], points=(50, 75, 90, 95, 99)) -> Dict[str, float]:
|
|
||||||
if not values:
|
|
||||||
return {}
|
|
||||||
xs = sorted(values)
|
|
||||||
out = {}
|
|
||||||
for p in points:
|
|
||||||
k = max(0, min(len(xs) - 1, round(p / 100 * len(xs) + 0.5) - 1))
|
|
||||||
out[f"p{p}"] = xs[k]
|
|
||||||
out["max"] = xs[-1]
|
|
||||||
out["n"] = len(xs)
|
|
||||||
out["mean"] = round(sum(xs) / len(xs), 1)
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
def word_of(f: check.Finding) -> Optional[str]:
|
|
||||||
if f.rule in ("1.1", "1.3", "1.4", "1.5", "1.7", "2.3", "3.5", "4.1", "5.2", "5.4", "3.3"):
|
|
||||||
m = WORD_IN_MESSAGE.search(f.message)
|
|
||||||
return m.group(1) if m else None
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv: List[str]) -> int:
|
|
||||||
if len(argv) != 3:
|
|
||||||
print(__doc__)
|
|
||||||
return 2
|
|
||||||
corpus_root, out_dir = argv[1], argv[2]
|
|
||||||
os.makedirs(out_dir, exist_ok=True)
|
|
||||||
checker = check.Checker(check.load_vocab())
|
|
||||||
|
|
||||||
corpora = sorted(d for d in os.listdir(corpus_root) if os.path.isdir(os.path.join(corpus_root, d)))
|
|
||||||
per_corpus: Dict[str, dict] = {}
|
|
||||||
rule_counts: Dict[str, Counter] = defaultdict(Counter) # rule -> corpus -> n
|
|
||||||
word_counts: Dict[str, Counter] = defaultdict(Counter) # word -> corpus -> n
|
|
||||||
word_rule: Dict[str, str] = {}
|
|
||||||
lengths: Dict[str, Dict[str, List[int]]] = defaultdict(lambda: {"操作": [], "描述": []})
|
|
||||||
de_counts: Dict[str, List[int]] = defaultdict(list)
|
|
||||||
n_findings = 0
|
|
||||||
|
|
||||||
with open(os.path.join(out_dir, "findings.jsonl"), "w", encoding="utf-8") as ff, \
|
|
||||||
open(os.path.join(out_dir, "sentences.jsonl"), "w", encoding="utf-8") as sf:
|
|
||||||
for corpus in corpora:
|
|
||||||
root = os.path.join(corpus_root, corpus)
|
|
||||||
stat = {"files": 0, "skipped_files": 0, "sentences": 0, "chars": 0, "findings": 0, "must": 0}
|
|
||||||
for path in md_files(root):
|
|
||||||
try:
|
|
||||||
with open(path, encoding="utf-8") as f:
|
|
||||||
text = f.read()
|
|
||||||
except (UnicodeDecodeError, OSError):
|
|
||||||
stat["skipped_files"] += 1
|
|
||||||
continue
|
|
||||||
if not is_chinese_doc(text):
|
|
||||||
stat["skipped_files"] += 1
|
|
||||||
continue
|
|
||||||
rel = os.path.relpath(path, root)
|
|
||||||
stat["files"] += 1
|
|
||||||
for s in sentences_of(text, checker):
|
|
||||||
stat["sentences"] += 1
|
|
||||||
stat["chars"] += s["chars"]
|
|
||||||
lengths[corpus][s["kind"]].append(s["chars"])
|
|
||||||
lengths["__all__"][s["kind"]].append(s["chars"])
|
|
||||||
de_counts[corpus].append(s["de"])
|
|
||||||
s.update({"corpus": corpus, "path": rel})
|
|
||||||
sf.write(json.dumps(s, ensure_ascii=False) + "\n")
|
|
||||||
for i, fd in enumerate(checker.check_text(text, rel)):
|
|
||||||
w = word_of(fd)
|
|
||||||
if w:
|
|
||||||
word_counts[w][corpus] += 1
|
|
||||||
word_rule[w] = fd.rule
|
|
||||||
rule_counts[fd.rule][corpus] += 1
|
|
||||||
stat["findings"] += 1
|
|
||||||
stat["must"] += fd.level == check.MUST
|
|
||||||
n_findings += 1
|
|
||||||
rec = {
|
|
||||||
"id": f"{corpus}:{rel}:{fd.line}:{fd.rule}:{i}",
|
|
||||||
"corpus": corpus, "path": rel, "line": fd.line, "rule": fd.rule,
|
|
||||||
"level": fd.level, "word": w, "message": fd.message, "text": fd.text,
|
|
||||||
}
|
|
||||||
ff.write(json.dumps(rec, ensure_ascii=False) + "\n")
|
|
||||||
stat["findings_per_10k_chars"] = round(stat["findings"] / stat["chars"] * 10000, 1) if stat["chars"] else None
|
|
||||||
per_corpus[corpus] = stat
|
|
||||||
print(f"{corpus}: {stat['files']} 个文件,{stat['sentences']} 句,{stat['chars']} 字,{stat['findings']} 条命中", file=sys.stderr)
|
|
||||||
|
|
||||||
rules_sorted = sorted(rule_counts, key=lambda r: -sum(rule_counts[r].values()))
|
|
||||||
words_sorted = sorted(word_counts, key=lambda w: -sum(word_counts[w].values()))
|
|
||||||
stats = {
|
|
||||||
"corpora": per_corpus,
|
|
||||||
"total_findings": n_findings,
|
|
||||||
"rules": {r: {"total": sum(c.values()), "by_corpus": dict(c)} for r, c in rule_counts.items()},
|
|
||||||
"words": {w: {"rule": word_rule[w], "total": sum(c.values()), "by_corpus": dict(c)} for w, c in word_counts.items()},
|
|
||||||
"sentence_length": {
|
|
||||||
c: {k: percentiles(v) for k, v in kinds.items()} for c, kinds in lengths.items()
|
|
||||||
},
|
|
||||||
"limits": {"操作": checker.max_op, "描述": checker.max_desc},
|
|
||||||
"over_limit": {
|
|
||||||
c: {
|
|
||||||
"操作": round(sum(x > checker.max_op for x in kinds["操作"]) / len(kinds["操作"]) * 100, 1) if kinds["操作"] else None,
|
|
||||||
"描述": round(sum(x > checker.max_desc for x in kinds["描述"]) / len(kinds["描述"]) * 100, 1) if kinds["描述"] else None,
|
|
||||||
} for c, kinds in lengths.items()
|
|
||||||
},
|
|
||||||
"de_per_sentence": {c: percentiles(v) for c, v in de_counts.items()},
|
|
||||||
}
|
|
||||||
with open(os.path.join(out_dir, "stats.json"), "w", encoding="utf-8") as f:
|
|
||||||
json.dump(stats, f, ensure_ascii=False, indent=1)
|
|
||||||
|
|
||||||
total_chars = sum(s["chars"] for s in per_corpus.values()) or 1
|
|
||||||
md = ["## 语料", "", "| 语料库 | 文件 | 句子 | 字数 | 命中 | 每万字命中 |", "| --- | ---: | ---: | ---: | ---: | ---: |"]
|
|
||||||
for c, s in per_corpus.items():
|
|
||||||
md.append(f"| {c} | {s['files']} | {s['sentences']} | {s['chars']} | {s['findings']} | {s['findings_per_10k_chars']} |")
|
|
||||||
md += ["", "## 每条规则的命中", "", "| 规则 | 命中 | 每万字 | " + " | ".join(corpora) + " |",
|
|
||||||
"| --- | ---: | ---: | " + " | ".join("---:" for _ in corpora) + " |"]
|
|
||||||
for r in rules_sorted:
|
|
||||||
c = rule_counts[r]
|
|
||||||
md.append(f"| {r} | {sum(c.values())} | {sum(c.values()) / total_chars * 10000:.1f} | " + " | ".join(str(c.get(x, 0)) for x in corpora) + " |")
|
|
||||||
md += ["", "## 命中最多的词(前 60)", "", "| 词 | 规则 | 命中 | 每万字 |", "| --- | --- | ---: | ---: |"]
|
|
||||||
for w in words_sorted[:60]:
|
|
||||||
c = word_counts[w]
|
|
||||||
md.append(f"| {w} | {word_rule[w]} | {sum(c.values())} | {sum(c.values()) / total_chars * 10000:.2f} |")
|
|
||||||
md += ["", "## 句长分布(字)", "", f"| 语料库 | 句型 | n | 均值 | p50 | p75 | p90 | p95 | p99 | 最长 | 超过上限(操作 {checker.max_op} / 描述 {checker.max_desc}) |",
|
|
||||||
"| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |"]
|
|
||||||
for c in corpora + ["__all__"]:
|
|
||||||
for k in ("操作", "描述"):
|
|
||||||
p = stats["sentence_length"].get(c, {}).get(k) or {}
|
|
||||||
if not p:
|
|
||||||
continue
|
|
||||||
over = stats["over_limit"][c][k]
|
|
||||||
md.append(f"| {c} | {k} | {p['n']} | {p['mean']} | {p['p50']} | {p['p75']} | {p['p90']} | {p['p95']} | {p['p99']} | {p['max']} | {over}% |")
|
|
||||||
with open(os.path.join(out_dir, "stats.md"), "w", encoding="utf-8") as f:
|
|
||||||
f.write("\n".join(md) + "\n")
|
|
||||||
print(f"共 {n_findings} 条命中,写入 {out_dir}", file=sys.stderr)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main(sys.argv))
|
|
||||||
@@ -1,660 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""简明技术中文检查脚本。
|
|
||||||
|
|
||||||
零依赖,Python 3.9 及以上。读取 Markdown 或纯文本,按《简明技术中文规范》
|
|
||||||
和《词表》检查,输出每条发现的行号、规则号、级别和说明。
|
|
||||||
|
|
||||||
用法:
|
|
||||||
python3 tools/check.py 文件.md [更多文件...]
|
|
||||||
python3 tools/check.py --strict 文件.md # 有【必须】级别的发现时退出码为 1
|
|
||||||
python3 tools/check.py --json 文件.md # JSON 输出
|
|
||||||
python3 tools/check.py --kind 描述 回答.md # 把全文按描述句检查(例如聊天回答)
|
|
||||||
cat 回答.md | python3 tools/check.py -
|
|
||||||
|
|
||||||
脚本只做句法层面的检查,不判断事实是否正确。所有发现都需要人工确认。
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import bisect
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from dataclasses import dataclass, asdict
|
|
||||||
from typing import Dict, List, Optional
|
|
||||||
|
|
||||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
DEFAULT_VOCAB = os.path.normpath(os.path.join(HERE, "..", "词表.md"))
|
|
||||||
|
|
||||||
MUST = "必须"
|
|
||||||
SHOULD = "建议"
|
|
||||||
|
|
||||||
CJK = re.compile(r"[㐀-䶿一-鿿豈-]")
|
|
||||||
LATIN_TOKEN = re.compile(r"[A-Za-z0-9][A-Za-z0-9_.+\-/]*")
|
|
||||||
ORDERED_ITEM = re.compile(r"^(\s*)(\d+)(?:[.)]\s+|[、)]\s*)(.*)$")
|
|
||||||
BULLET_ITEM = re.compile(r"^(\s*)[-*+]\s+(.*)$")
|
|
||||||
SENTENCE_SPLIT = re.compile(r"(?<=[。!?])(?![」』”’))])")
|
|
||||||
|
|
||||||
# 系统行为句的常见主语。编号步骤里以这些词开头的句子不按操作句检查(规则 4.4)。
|
|
||||||
SYSTEM_SUBJECTS = ("系统", "服务", "接口", "程序", "页面", "浏览器", "终端", "客户端", "服务端", "命令", "脚本")
|
|
||||||
# 编号列表项里以这些词开头的句子是说明,不是操作:指代、举例、原因、定义。校准发现编号列表常用来列举说明。
|
|
||||||
# 条件词(如果、当、在……之后)开头的句子仍算操作句:规则 2.5 要求条件写在动作前面。
|
|
||||||
NON_OPERATION_STARTS = ("对于", "由于", "因为", "例如", "比如", "这", "该", "此", "其", "它", "我们",
|
|
||||||
"注意", "说明", "即", "也就是", "每", "所有", "任何")
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Finding:
|
|
||||||
path: str
|
|
||||||
line: int
|
|
||||||
rule: str
|
|
||||||
level: str
|
|
||||||
message: str
|
|
||||||
text: str
|
|
||||||
|
|
||||||
def format(self) -> str:
|
|
||||||
return f"{self.path}:{self.line}: [{self.rule}][{self.level}] {self.message} ←「{self.text}」"
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Unit:
|
|
||||||
"""一个检查单元:一个段落、一个列表项、一个标题或一行表格。"""
|
|
||||||
|
|
||||||
kind: str # para | ordered | bullet | heading | table | quote
|
|
||||||
lines: List[str]
|
|
||||||
start_line: int
|
|
||||||
indented: bool = False # 首行有缩进。缩进的单元跟随前一个顶层单元的反例状态
|
|
||||||
skip: bool = False # 前面有 <!-- stc:skip --> 指令
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# 词表
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# 依赖语境的词用这里的正则替代简单匹配。键是词表中的词。
|
|
||||||
PATTERNS: Dict[str, str] = {
|
|
||||||
"进行": r"进行(?!中|时|曲|到底|了?\s*[A-Za-z])",
|
|
||||||
"相关": r"相关(?!性|系数|联)",
|
|
||||||
"等": r"(?:、[^、,。;:\n]{1,16}|(?:和|及|以及)[^,。;\n]{1,16})(?<![相不平均对同])等(?:等)?(?!待|候|级|于|同|价|号|式|效|比|分|距|量|温|高|长|边|到|着)",
|
|
||||||
"以上": r"\d\s*(?:个|次|秒|天|分钟|小时|倍|字|条|项|人|行|位|%|MB|GB|KB|TB|ms)?\s*以上",
|
|
||||||
"以下": r"\d\s*(?:个|次|秒|天|分钟|小时|倍|字|条|项|人|行|位|%|MB|GB|KB|TB|ms)?\s*以下",
|
|
||||||
"以内": r"\d[^。,;\n]{0,6}以内",
|
|
||||||
"左右": r"[\d个次秒天钟时元倍%米克条]\s*左右",
|
|
||||||
"及时": r"及时(?!性)",
|
|
||||||
"基本": r"基本(?=兼容|可用|可以|没有|不|都|相同|一致|正常|完成|稳定|无|能)",
|
|
||||||
"比较": r"比较(?=快|慢|大|小|多|少|高|低|长|短|好|差|稳定|复杂|简单|常见|重要|容易|困难|新|旧|久|频繁)",
|
|
||||||
"相对": r"相对(?=快|慢|大|小|多|少|高|低|简单|复杂|稳定|较|容易|困难)",
|
|
||||||
"相当": r"相当(?!于)",
|
|
||||||
"十分": r"十分(?!钟)",
|
|
||||||
"千万": r"千万(?!级|个|条|元|人|次|行|亿)",
|
|
||||||
"最好": r"最好(?!的)",
|
|
||||||
"请": r"(?<![申邀聘宴])请(?!求|假|教|示|柬|帖|见|参阅|参考|参见|注意)",
|
|
||||||
"展示": r"展示(?!层)",
|
|
||||||
"需要": r"^需要(?!不)",
|
|
||||||
"需": r"^需(?!要|求|不)",
|
|
||||||
"落地": r"落地(?!页|窗)",
|
|
||||||
"一些": r"(?<![这那])一些(?![,。;:、])",
|
|
||||||
"一下": r"一下(?!子)",
|
|
||||||
"显然": r"显然(?!易见)",
|
|
||||||
"注销": r"注销(?!账号|帐号)",
|
|
||||||
"开启": r"开启",
|
|
||||||
"去除": r"去除(?!噪|重)",
|
|
||||||
"选取": r"选取(?!区域|范围)",
|
|
||||||
# 下面这些是校准时发现的跨词误匹配:禁用词恰好是别的词的一部分
|
|
||||||
"入参": r"(?<![传输写导])入参(?!数|考)",
|
|
||||||
"出参": r"(?<![取给输导])出参(?!数|考|加|与|赛|观|展)",
|
|
||||||
"回包": r"(?<!返)回包(?!含|括|装|裹)",
|
|
||||||
"回传": r"(?<!返)回传",
|
|
||||||
"加以": r"(?<![添增附])加以(?!下|上|前|后)",
|
|
||||||
"予以": r"(?<![授给赋赐])予以(?!下|上)",
|
|
||||||
"做出": r"做出了?(?!贡献)",
|
|
||||||
"作出": r"作出了?(?!贡献)",
|
|
||||||
"对标": r"对标(?![签识题志量记准注杆])",
|
|
||||||
"应当": r"(?<!相)应当",
|
|
||||||
"其实": r"其实(?![施现行践际验例效体物质在习用时况])",
|
|
||||||
"不得": r"不得(?!不|到|了|已|其|而)",
|
|
||||||
"一定要": r"(?<![不必是否])一定要",
|
|
||||||
"点选": r"(?<!节)点选(?!择|项|中)",
|
|
||||||
"众所周知": r"众所周知(?!的)",
|
|
||||||
"方面": r"(?<![这那各多双单全一两几])方面",
|
|
||||||
"情况": r"的情况(?!下)", # 「在……的情况下」是固定搭配,校准精确率 32%,不查
|
|
||||||
"不准": r"不准(?![确备的,。;:、))((])(?!$)", # 「统计不准」是「不准确」,只查「不准 + 动词」
|
|
||||||
"心智": r"心智(?!模型|负担)",
|
|
||||||
}
|
|
||||||
|
|
||||||
# 句子里出现这些词时不报对应的禁用词:规则本身允许的用法
|
|
||||||
EXCLUDE_IF: Dict[str, str] = {
|
|
||||||
"等": r"例如|比如|诸如|譬如|包括|包含|如[::]|[((][^))]*等", # 3.5 允许描述句用「例如」引出不完整的例子;括号里的列举是举例
|
|
||||||
}
|
|
||||||
|
|
||||||
# 这些词的提示降为【建议】:校准显示它们常有正当用法,但出现时值得看一眼
|
|
||||||
WORD_LEVEL: Dict[str, str] = {
|
|
||||||
"然后": SHOULD, "接着": SHOULD, "之后再": SHOULD,
|
|
||||||
"痛点": SHOULD, "心智": SHOULD,
|
|
||||||
}
|
|
||||||
|
|
||||||
# 词的检查范围。op:只在操作句;ordered:只在编号列表项;para:只在正文段落。
|
|
||||||
SCOPE: Dict[str, str] = {
|
|
||||||
"请": "op",
|
|
||||||
"您": "op",
|
|
||||||
"你": "op",
|
|
||||||
"需要": "op",
|
|
||||||
"需": "op",
|
|
||||||
"用户可以": "op",
|
|
||||||
"用户需要": "op",
|
|
||||||
"然后": "ordered",
|
|
||||||
"接着": "ordered",
|
|
||||||
"之后再": "ordered",
|
|
||||||
"并且": "ordered",
|
|
||||||
"而且": "ordered",
|
|
||||||
"同时": "ordered",
|
|
||||||
"首先": "para",
|
|
||||||
"其次": "para",
|
|
||||||
"最后": "para",
|
|
||||||
# 2.3 的情态词只在操作句里查;描述句里的「应该」多表示预期(「输出应该是……」)
|
|
||||||
"应该": "op",
|
|
||||||
"应当": "op",
|
|
||||||
# 1.5 的程度词只在操作句里查;描述句里「很多」「大部分」常是没法给数值的正常表述
|
|
||||||
"很": "op", "非常": "op", "极其": "op", "相当": "op", "十分": "op",
|
|
||||||
"大量": "op", "少量": "op", "大部分": "op", "多数": "op", "少数": "op",
|
|
||||||
"合适": "op", "适当": "op", "适量": "op", "及时": "op", "尽快": "op",
|
|
||||||
# 5.4 的估计词只在操作句和参数表格里查;描述句可以用「约」
|
|
||||||
"一些": "op_table", "多次": "op_table", "若干": "op_table",
|
|
||||||
"大概": "op_table", "大约": "op_table", "左右": "op_table",
|
|
||||||
}
|
|
||||||
|
|
||||||
# 禁用词对应的规则号。没有列出的默认为 1.3。
|
|
||||||
RULE_OF_WORD: Dict[str, str] = {
|
|
||||||
"进行": "1.4", "加以": "1.4", "作出": "1.4", "做出": "1.4", "予以": "1.4",
|
|
||||||
"非常": "1.5", "很": "1.5", "极其": "1.5", "相当": "1.5", "十分": "1.5",
|
|
||||||
"比较": "1.5", "较为": "1.5", "相对": "1.5", "大量": "1.5", "少量": "1.5",
|
|
||||||
"大部分": "1.5", "多数": "1.5", "少数": "1.5", "尽快": "1.5", "及时": "1.5",
|
|
||||||
"适当": "1.5", "合适": "1.5", "适量": "1.5", "基本": "1.5", "基本上": "1.5",
|
|
||||||
"赋能": "1.7", "抓手": "1.7", "闭环": "1.7", "拉通": "1.7", "打通": "1.7",
|
|
||||||
"沉淀": "1.7", "落地": "1.7", "赛道": "1.7", "心智": "1.7", "兜底": "1.7",
|
|
||||||
"收口": "1.7", "透传": "1.7", "颗粒度": "1.7",
|
|
||||||
"打法": "1.7", "组合拳": "1.7", "痛点": "1.7", "牵头": "1.7", "倒逼": "1.7",
|
|
||||||
"体感": "1.7", "拉齐": "1.7", "对标": "1.7", "顶层设计": "1.7", "底层逻辑": "1.7",
|
|
||||||
"请": "2.3", "您": "2.3", "你": "2.3", "需要": "2.3", "需": "2.3",
|
|
||||||
"用户可以": "2.3", "用户需要": "2.3", "应该": "2.3", "应当": "2.3",
|
|
||||||
"然后": "4.1", "接着": "4.1", "之后再": "4.1", "并且": "4.1", "而且": "4.1", "同时": "4.1",
|
|
||||||
"首先": "3.3", "其次": "3.3", "最后": "3.3",
|
|
||||||
"等": "3.5",
|
|
||||||
"以上": "5.2", "以下": "5.2", "以内": "5.2",
|
|
||||||
"大概": "5.4", "大约": "5.4", "左右": "5.4", "若干": "5.4", "一些": "5.4", "多次": "5.4",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class VocabEntry:
|
|
||||||
words: List[str]
|
|
||||||
replace: str
|
|
||||||
note: str
|
|
||||||
rule: str
|
|
||||||
kind: str # banned | choice
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_tables(md: str) -> Dict[str, List[List[str]]]:
|
|
||||||
sections: Dict[str, List[List[str]]] = {}
|
|
||||||
current: Optional[str] = None
|
|
||||||
for raw in md.splitlines():
|
|
||||||
line = raw.strip()
|
|
||||||
if line.startswith("## "):
|
|
||||||
current = line[3:].strip()
|
|
||||||
sections[current] = []
|
|
||||||
continue
|
|
||||||
if current is None or not line.startswith("|"):
|
|
||||||
continue
|
|
||||||
cells = [c.strip() for c in line.strip("|").split("|")]
|
|
||||||
if all(re.fullmatch(r":?-{3,}:?", c) for c in cells):
|
|
||||||
continue
|
|
||||||
sections[current].append(cells)
|
|
||||||
return sections
|
|
||||||
|
|
||||||
|
|
||||||
def load_vocab(path: str = DEFAULT_VOCAB) -> List[VocabEntry]:
|
|
||||||
"""读取词表,返回标为「自动检查:是」的条目。"""
|
|
||||||
with open(path, encoding="utf-8") as f:
|
|
||||||
sections = _parse_tables(f.read())
|
|
||||||
entries: List[VocabEntry] = []
|
|
||||||
for title, rows in sections.items():
|
|
||||||
if "第一部分" in title:
|
|
||||||
for cells in rows[1:]:
|
|
||||||
if len(cells) < 4 or cells[3] != "是":
|
|
||||||
continue
|
|
||||||
words = [w for w in cells[0].split("、") if w]
|
|
||||||
for w in words:
|
|
||||||
entries.append(VocabEntry([w], cells[1], cells[2], RULE_OF_WORD.get(w, "1.3"), "banned"))
|
|
||||||
elif "第二部分" in title:
|
|
||||||
for cells in rows[1:]:
|
|
||||||
if len(cells) < 4 or cells[3] != "是":
|
|
||||||
continue
|
|
||||||
rejected = [w for w in cells[2].split("、") if w]
|
|
||||||
for w in rejected:
|
|
||||||
entries.append(VocabEntry([w], cells[1], cells[0], "1.1", "choice"))
|
|
||||||
return entries
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# 文本预处理
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
COUNTEREXAMPLE_PREFIXES = ("不批准", "不推荐", "反例", "错误示例", "改写前")
|
|
||||||
|
|
||||||
|
|
||||||
def strip_markup(line: str) -> str:
|
|
||||||
"""去掉 Markdown 标记。行内代码记为 CODE,「」里的内容记为 Q。
|
|
||||||
|
|
||||||
「」里的内容是界面文字或被引用的词,按原样保留,不检查。
|
|
||||||
"""
|
|
||||||
line = re.sub(r"`[^`]*`", " CODE ", line)
|
|
||||||
line = re.sub(r"「[^」]*」", "「Q」", line)
|
|
||||||
line = re.sub(r"!\[[^\]]*\]\([^)]*\)", " ", line)
|
|
||||||
line = re.sub(r"\[([^\]]*)\]\([^)]*\)", r"\1", line)
|
|
||||||
line = re.sub(r"https?://\S+", " URL ", line)
|
|
||||||
line = re.sub(r"<[^>]+>", " ", line)
|
|
||||||
line = re.sub(r"(\*\*|~~|\*)(?=\S)", "", line)
|
|
||||||
line = re.sub(r"(?<=\S)(\*\*|~~|\*)", "", line)
|
|
||||||
return line
|
|
||||||
|
|
||||||
|
|
||||||
def is_counterexample(text: str) -> bool:
|
|
||||||
"""以「不批准:」这类前缀开头的行是反例,默认不检查。"""
|
|
||||||
return text.lstrip("-*+ \t").startswith(COUNTEREXAMPLE_PREFIXES)
|
|
||||||
|
|
||||||
|
|
||||||
def count_chars(text: str) -> int:
|
|
||||||
"""按附录 A 计算字数。"""
|
|
||||||
text = re.sub(r"`[^`]*`", " CODE ", text)
|
|
||||||
return len(CJK.findall(text)) + len(LATIN_TOKEN.findall(text))
|
|
||||||
|
|
||||||
|
|
||||||
def join_lines(lines: List[str]) -> tuple:
|
|
||||||
"""把一个单元的多行拼成一段。相邻两行都是西文时补一个空格。返回拼接结果和每行的起始偏移。"""
|
|
||||||
joined = ""
|
|
||||||
starts: List[int] = []
|
|
||||||
for line in lines:
|
|
||||||
if joined and re.search(r"[A-Za-z0-9]$", joined) and re.match(r"[A-Za-z0-9]", line):
|
|
||||||
joined += " "
|
|
||||||
starts.append(len(joined))
|
|
||||||
joined += line
|
|
||||||
return joined, starts
|
|
||||||
|
|
||||||
|
|
||||||
def split_sentences(text: str) -> List[str]:
|
|
||||||
parts = SENTENCE_SPLIT.split(text)
|
|
||||||
return [p.strip() for p in parts if p and p.strip()]
|
|
||||||
|
|
||||||
|
|
||||||
def unit_sentences(unit: Unit) -> List[tuple]:
|
|
||||||
"""一个单元里的句子和各自的起始行号:(句子, 行号)。
|
|
||||||
|
|
||||||
多行先拼成一段再分句:Markdown 里的硬换行不是句子边界。
|
|
||||||
"""
|
|
||||||
joined, line_starts = join_lines([strip_markup(l) for l in unit.lines])
|
|
||||||
out: List[tuple] = []
|
|
||||||
at = 0
|
|
||||||
for piece in SENTENCE_SPLIT.split(joined):
|
|
||||||
lead = len(piece) - len(piece.lstrip())
|
|
||||||
s = piece.strip()
|
|
||||||
if s:
|
|
||||||
out.append((s, unit.start_line + bisect.bisect_right(line_starts, at + lead) - 1))
|
|
||||||
at += len(piece)
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
DIRECTIVE = re.compile(r"^\s*<!--\s*stc:(off|on|skip)\s*-->\s*$")
|
|
||||||
|
|
||||||
|
|
||||||
def parse_units(lines: List[str]) -> List[Unit]:
|
|
||||||
"""把文本切成检查单元。
|
|
||||||
|
|
||||||
跳过:代码块、文件开头的 YAML front matter、`<!-- stc:off -->` 到
|
|
||||||
`<!-- stc:on -->` 之间的内容。`<!-- stc:skip -->` 跳过它后面的一个单元。
|
|
||||||
"""
|
|
||||||
units: List[Unit] = []
|
|
||||||
in_fence = False
|
|
||||||
off = False
|
|
||||||
skip_next = False
|
|
||||||
current: Optional[Unit] = None
|
|
||||||
|
|
||||||
def close() -> None:
|
|
||||||
nonlocal current
|
|
||||||
if current is not None:
|
|
||||||
units.append(current)
|
|
||||||
current = None
|
|
||||||
|
|
||||||
def start(kind: str, text: str, idx: int, raw: str) -> Unit:
|
|
||||||
nonlocal skip_next
|
|
||||||
unit = Unit(kind, [text], idx, indented=raw[:1] in (" ", "\t"), skip=skip_next)
|
|
||||||
skip_next = False
|
|
||||||
return unit
|
|
||||||
|
|
||||||
start_at = 0
|
|
||||||
if lines and lines[0].strip() == "---":
|
|
||||||
for i in range(1, len(lines)):
|
|
||||||
if lines[i].strip() == "---":
|
|
||||||
start_at = i + 1
|
|
||||||
break
|
|
||||||
|
|
||||||
in_comment = False
|
|
||||||
for idx, raw in enumerate(lines[start_at:], start=start_at + 1):
|
|
||||||
if in_comment:
|
|
||||||
if "-->" not in raw:
|
|
||||||
continue
|
|
||||||
in_comment = False
|
|
||||||
raw = raw.split("-->", 1)[1]
|
|
||||||
d = DIRECTIVE.match(raw)
|
|
||||||
if d is None and "<!--" in raw:
|
|
||||||
# HTML 注释不是读者看到的内容。整行或行内的注释去掉;跨行注释到 --> 为止都跳过
|
|
||||||
raw = re.sub(r"<!--.*?-->", "", raw)
|
|
||||||
if "<!--" in raw:
|
|
||||||
raw = raw.split("<!--", 1)[0]
|
|
||||||
in_comment = True
|
|
||||||
stripped = raw.strip()
|
|
||||||
if d:
|
|
||||||
close()
|
|
||||||
if d.group(1) == "off":
|
|
||||||
off = True
|
|
||||||
elif d.group(1) == "on":
|
|
||||||
off = False
|
|
||||||
else:
|
|
||||||
skip_next = True
|
|
||||||
continue
|
|
||||||
if off:
|
|
||||||
continue
|
|
||||||
if stripped.startswith("```") or stripped.startswith("~~~"):
|
|
||||||
in_fence = not in_fence
|
|
||||||
close()
|
|
||||||
continue
|
|
||||||
if in_fence:
|
|
||||||
continue
|
|
||||||
if not stripped:
|
|
||||||
close()
|
|
||||||
continue
|
|
||||||
if stripped.startswith("<") and stripped.endswith(">"):
|
|
||||||
# 整行是 HTML 标签(图片、组件示例、分隔),不是正文
|
|
||||||
close()
|
|
||||||
continue
|
|
||||||
if stripped.startswith("#"):
|
|
||||||
close()
|
|
||||||
units.append(start("heading", stripped.lstrip("#").strip(), idx, raw))
|
|
||||||
continue
|
|
||||||
if stripped.startswith("|"):
|
|
||||||
close()
|
|
||||||
units.append(start("table", stripped, idx, raw))
|
|
||||||
continue
|
|
||||||
if stripped.startswith(">"):
|
|
||||||
text = stripped.lstrip(">").strip()
|
|
||||||
if current is not None and current.kind == "quote":
|
|
||||||
current.lines.append(text)
|
|
||||||
else:
|
|
||||||
close()
|
|
||||||
current = start("quote", text, idx, raw)
|
|
||||||
continue
|
|
||||||
m = ORDERED_ITEM.match(raw)
|
|
||||||
if m:
|
|
||||||
close()
|
|
||||||
current = start("ordered", m.group(3).strip(), idx, raw)
|
|
||||||
continue
|
|
||||||
m = BULLET_ITEM.match(raw)
|
|
||||||
if m:
|
|
||||||
close()
|
|
||||||
current = start("bullet", m.group(2).strip(), idx, raw)
|
|
||||||
continue
|
|
||||||
if current is not None and current.kind in ("ordered", "bullet") and raw.startswith((" ", "\t")):
|
|
||||||
current.lines.append(stripped)
|
|
||||||
continue
|
|
||||||
if current is not None and current.kind == "para":
|
|
||||||
current.lines.append(stripped)
|
|
||||||
else:
|
|
||||||
close()
|
|
||||||
current = start("para", stripped, idx, raw)
|
|
||||||
close()
|
|
||||||
return units
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# 规则
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class Checker:
|
|
||||||
def __init__(self, vocab: Optional[List[VocabEntry]], max_op: int = 30, max_desc: int = 40,
|
|
||||||
kind: str = "auto", skip_counterexamples: bool = True) -> None:
|
|
||||||
self.vocab = vocab or []
|
|
||||||
self.max_op = max_op
|
|
||||||
self.max_desc = max_desc
|
|
||||||
self.kind = kind
|
|
||||||
self.skip_counterexamples = skip_counterexamples
|
|
||||||
self._compiled = [(e, re.compile(PATTERNS.get(e.words[0], re.escape(e.words[0])))) for e in self.vocab]
|
|
||||||
|
|
||||||
# -- 入口 --------------------------------------------------------------
|
|
||||||
|
|
||||||
def check_text(self, text: str, path: str = "<text>") -> List[Finding]:
|
|
||||||
units = parse_units(text.splitlines())
|
|
||||||
findings: List[Finding] = []
|
|
||||||
checked: List[Unit] = []
|
|
||||||
in_counterexample = False
|
|
||||||
for unit in units:
|
|
||||||
if not unit.indented:
|
|
||||||
in_counterexample = self.skip_counterexamples and is_counterexample(unit.lines[0])
|
|
||||||
if in_counterexample or unit.skip:
|
|
||||||
continue
|
|
||||||
checked.append(unit)
|
|
||||||
findings.extend(self._check_unit(unit, path))
|
|
||||||
# 1.6 缩写写法:脚本查不出来。大小写不同的写法几乎都来自代码、路径和链接锚点(校准精确率 0%)
|
|
||||||
findings = self._dedupe(findings)
|
|
||||||
findings.sort(key=lambda f: (f.line, f.rule))
|
|
||||||
return findings
|
|
||||||
|
|
||||||
def check_file(self, path: str) -> List[Finding]:
|
|
||||||
with open(path, encoding="utf-8") as f:
|
|
||||||
return self.check_text(f.read(), path)
|
|
||||||
|
|
||||||
# -- 单元 --------------------------------------------------------------
|
|
||||||
|
|
||||||
def _check_unit(self, unit: Unit, path: str) -> List[Finding]:
|
|
||||||
out: List[Finding] = []
|
|
||||||
clean_lines = [strip_markup(l) for l in unit.lines]
|
|
||||||
if unit.kind in ("heading", "table"):
|
|
||||||
for offset, line in enumerate(clean_lines):
|
|
||||||
out.extend(self._check_vocab(line, unit.start_line + offset, path, op=False, unit_kind=unit.kind))
|
|
||||||
return out
|
|
||||||
|
|
||||||
sentences = unit_sentences(unit) # (sentence, line_no)
|
|
||||||
|
|
||||||
# 3.2 段落句数。只数有句末标点的句子:没有标点的行是标签或列名,不是句子
|
|
||||||
n_sentences = sum(1 for s, _ in sentences if s.endswith(("。", "!", "?", ";", ".", "!", "?", ";")))
|
|
||||||
if unit.kind == "para" and n_sentences > 6:
|
|
||||||
out.append(Finding(path, unit.start_line, "3.2", MUST,
|
|
||||||
f"一段有 {n_sentences} 句,不超过 6 句", clean_lines[0][:30]))
|
|
||||||
|
|
||||||
# 3.3 正文里串联步骤:脚本不查。正文里的「首先……然后……」多数在描述执行顺序,不是在写步骤(校准精确率 40%、30%)
|
|
||||||
|
|
||||||
for pos, (sentence, line_no) in enumerate(sentences):
|
|
||||||
op = self.is_operation(unit, sentence, pos)
|
|
||||||
out.extend(self._check_sentence(sentence, line_no, path, op, unit.kind))
|
|
||||||
out.extend(self._check_vocab(sentence, line_no, path, op, unit.kind))
|
|
||||||
return out
|
|
||||||
|
|
||||||
def is_operation(self, unit: Unit, sentence: str, pos: int) -> bool:
|
|
||||||
"""这句话按操作句检查吗。auto 模式下:编号列表项里、不以系统主语或说明性词开头的句子。"""
|
|
||||||
if self.kind == "操作":
|
|
||||||
return True
|
|
||||||
if self.kind == "描述":
|
|
||||||
return False
|
|
||||||
if unit.kind != "ordered":
|
|
||||||
return False
|
|
||||||
if sentence.startswith(SYSTEM_SUBJECTS) or sentence.startswith(NON_OPERATION_STARTS):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
# -- 句子规则 ----------------------------------------------------------
|
|
||||||
|
|
||||||
def _check_sentence(self, s: str, line: int, path: str, op: bool, unit_kind: str) -> List[Finding]:
|
|
||||||
out: List[Finding] = []
|
|
||||||
n = count_chars(s)
|
|
||||||
excerpt = s[:40]
|
|
||||||
|
|
||||||
# 2.1 句长
|
|
||||||
limit = self.max_op if op else self.max_desc
|
|
||||||
label = "操作句" if op else "描述句"
|
|
||||||
if n > limit:
|
|
||||||
out.append(Finding(path, line, "2.1", MUST, f"{label} {n} 字,不超过 {limit} 字", excerpt))
|
|
||||||
|
|
||||||
# 2.2 一句多事。「之后」「随后」多是时间状语,不算连接词。级别建议:校准精确率 53%
|
|
||||||
connectors = re.findall(r"然后|并且|而且|接着", s)
|
|
||||||
if not op and len(connectors) >= 2:
|
|
||||||
out.append(Finding(path, line, "2.2", SHOULD, "一句里有多个动作,拆句", excerpt))
|
|
||||||
|
|
||||||
# 2.3 操作句的祈使形式
|
|
||||||
if op and re.match(r"^(用户|使用者|管理员|开发者)(需要|可以|应该|应当|必须)", s):
|
|
||||||
out.append(Finding(path, line, "2.3", MUST, "操作句用祈使句,去掉主语和「需要」「可以」", excerpt))
|
|
||||||
|
|
||||||
# 2.4 被动。只查操作句,级别建议:描述句里的被动多是「执行者未知或不重要」的合规用法,
|
|
||||||
# 操作句里「被 X 的 Y」是定语不是谓语,脚本都分不出来(校准精确率 42% 和 43%)。「为……所」太弱,不查
|
|
||||||
if op:
|
|
||||||
passive = re.search(r"被(?!动|告|迫|称为|视为|子|窝|套|褥|面)(?![^,。]{1,4}的)|受到|遭到", s)
|
|
||||||
if passive is None:
|
|
||||||
passive = re.search(r"由[^,。于来此]{1,8}(?:负责|完成|执行|生成|处理|发送|收集|读取|管理|维护|调用|触发|创建|返回|接管|承担)", s)
|
|
||||||
if passive:
|
|
||||||
out.append(Finding(path, line, "2.4", SHOULD, "被动句,改为主动句并写出执行者", excerpt))
|
|
||||||
|
|
||||||
# 2.5 条件在后。只查操作句句尾的条件;描述句的条件从句位置自由,括号里的内容多是补充说明(校准精确率 34%、35%)
|
|
||||||
cond = r"(?:如果|若(?!干)|假如|当(?!前|时|天|地|然|中|作|成))"
|
|
||||||
if op and re.search(r"[,,]\s*" + cond + r"[^,。]{1,20}[。!?;]?$", s):
|
|
||||||
out.append(Finding(path, line, "2.5", MUST, "条件写在动作后面,移到动作前", excerpt))
|
|
||||||
|
|
||||||
# 2.6 否定。只查双重否定;「一句多个否定」多是独立分句各管各的(校准精确率 22%)。
|
|
||||||
# 级别建议:「不得不」这类固定搭配模型多判为正常用法(校准精确率 53%)
|
|
||||||
if re.search(r"不得不|不无|未尝不|无不|不能不|不会不|没有[^,。;:]{0,6}不(?!同|是|过|仅|但|论|管|错|止)|不[^,。]{0,4}不是不", s):
|
|
||||||
out.append(Finding(path, line, "2.6", SHOULD, "双重否定,改为肯定句", excerpt))
|
|
||||||
|
|
||||||
# 2.7 长定语、2.8 指代:脚本查不出来。「的」的数量和指代词的数量都不能代表定语长度和指代是否清楚(校准精确率 2% 和 0%)
|
|
||||||
|
|
||||||
# 2.9 反问、设问、感叹
|
|
||||||
if s.endswith(("?", "?", "!", "!")) and unit_kind != "heading":
|
|
||||||
out.append(Finding(path, line, "2.9", MUST, "不用问句和感叹句", excerpt))
|
|
||||||
if re.search(r"难道|岂不|何必", s):
|
|
||||||
out.append(Finding(path, line, "2.9", MUST, "反问,改为陈述句", excerpt))
|
|
||||||
|
|
||||||
# 4.3 警告、4.5 前置条件、4.6 原因:脚本查不出来。编号列表项不一定是步骤,「注意」「因为」「(版本)」在说明性列表里都是正常用法(校准精确率 19%、12%、34%)
|
|
||||||
|
|
||||||
# 5.1 中文数字和「百分之」。「一次」「两次」「一行」是量词习惯用法,不查;三以上和两位数才查
|
|
||||||
units = r"(?:秒|分钟|小时|天|周|次|倍|行|列|位|字节|毫秒)"
|
|
||||||
if re.search(r"(?<![一十第每这那上下前后头同几数好])(?:[三四五六七八九十]|[一二两三四五六七八九]十[一二三四五六七八九]?|十[一二三四五六七八九])" + units + r"(?!钟|数|性|制)", s):
|
|
||||||
out.append(Finding(path, line, "5.1", MUST, "用阿拉伯数字", excerpt))
|
|
||||||
if "百分之" in s and "百分之百" not in s:
|
|
||||||
out.append(Finding(path, line, "5.1", MUST, "「百分之」改为 %", excerpt))
|
|
||||||
if re.search(r"\d(?:MB|GB|KB|TB|ms)\b", s):
|
|
||||||
out.append(Finding(path, line, "5.1", SHOULD, "数字与单位之间空一格", excerpt))
|
|
||||||
|
|
||||||
# 5.3 相对时间。只查相对于写作时间的日期词;「稍后」「近期」在技术描述里多指程序时序,不查
|
|
||||||
# 「上个月」「下个月」「去年」在日期 API 文档里是计算语义,不查
|
|
||||||
if re.search(r"明天|后天|昨天|前天|下周(?!期)|上周|近期将|不久的将来|即将(?:发布|上线|下线|推出)|过几天", s):
|
|
||||||
out.append(Finding(path, line, "5.3", SHOULD, "相对时间,改为绝对日期或时长", excerpt))
|
|
||||||
|
|
||||||
# 5.4 操作句里的估计词
|
|
||||||
if op and re.search(r"(?<![预节合契违签规大])约(?!束|定|会|谈|稿)|几(?=次|个|秒|分钟|天|行|台|分)", s):
|
|
||||||
out.append(Finding(path, line, "5.4", MUST, "操作句里有估计词,写出数值", excerpt))
|
|
||||||
|
|
||||||
# 5.5 倍数表示减少
|
|
||||||
if re.search(r"(?:降低|减少|下降|缩小|降)[^,。]{0,6}\d+\s*倍", s):
|
|
||||||
out.append(Finding(path, line, "5.5", MUST, "减少不用「倍」,用「减少到原来的 1/n」或百分比", excerpt))
|
|
||||||
|
|
||||||
# 6.1 界面元素名
|
|
||||||
if op and re.search(r"点击(?!\s*「|\s*『|\s*CODE)", s):
|
|
||||||
out.append(Finding(path, line, "6.1", SHOULD, "界面元素名用「」括起", excerpt))
|
|
||||||
|
|
||||||
return out
|
|
||||||
|
|
||||||
# -- 词表 --------------------------------------------------------------
|
|
||||||
|
|
||||||
def _check_vocab(self, s: str, line: int, path: str, op: bool, unit_kind: str) -> List[Finding]:
|
|
||||||
out: List[Finding] = []
|
|
||||||
for entry, pattern in self._compiled:
|
|
||||||
word = entry.words[0]
|
|
||||||
scope = SCOPE.get(word)
|
|
||||||
if scope == "op" and not op:
|
|
||||||
continue
|
|
||||||
if scope == "op_table" and not (op or unit_kind == "table"):
|
|
||||||
continue
|
|
||||||
if scope == "ordered" and unit_kind != "ordered":
|
|
||||||
continue
|
|
||||||
if scope == "para" and unit_kind != "para":
|
|
||||||
continue
|
|
||||||
m = pattern.search(s)
|
|
||||||
if not m:
|
|
||||||
continue
|
|
||||||
if word in EXCLUDE_IF and re.search(EXCLUDE_IF[word], s):
|
|
||||||
continue
|
|
||||||
if entry.kind == "banned":
|
|
||||||
msg = f"禁用词「{word}」,改用:{entry.replace}"
|
|
||||||
else:
|
|
||||||
msg = f"「{word}」改用「{entry.replace}」({entry.note})"
|
|
||||||
out.append(Finding(path, line, entry.rule, WORD_LEVEL.get(word, MUST), msg, s[:40]))
|
|
||||||
return out
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _dedupe(findings: List[Finding]) -> List[Finding]:
|
|
||||||
seen = set()
|
|
||||||
out = []
|
|
||||||
for f in findings:
|
|
||||||
key = (f.line, f.rule, f.message)
|
|
||||||
if key in seen:
|
|
||||||
continue
|
|
||||||
seen.add(key)
|
|
||||||
out.append(f)
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# 命令行
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def main(argv: Optional[List[str]] = None) -> int:
|
|
||||||
parser = argparse.ArgumentParser(description="简明技术中文检查脚本")
|
|
||||||
parser.add_argument("files", nargs="+", help="要检查的文件;用 - 表示标准输入")
|
|
||||||
parser.add_argument("--strict", action="store_true", help="有【必须】级别的发现时退出码为 1")
|
|
||||||
parser.add_argument("--json", action="store_true", help="JSON 输出")
|
|
||||||
parser.add_argument("--kind", choices=["auto", "操作", "描述"], default="auto",
|
|
||||||
help="句子类型。auto:编号列表项按操作句,其他按描述句")
|
|
||||||
parser.add_argument("--vocab", default=DEFAULT_VOCAB, help="词表路径")
|
|
||||||
parser.add_argument("--no-vocab", action="store_true", help="不检查词表")
|
|
||||||
parser.add_argument("--max-op", type=int, default=30, help="操作句字数上限,默认 30")
|
|
||||||
parser.add_argument("--max-desc", type=int, default=40, help="描述句字数上限,默认 40")
|
|
||||||
parser.add_argument("--quiet", action="store_true", help="只输出汇总")
|
|
||||||
parser.add_argument("--check-counterexamples", action="store_true",
|
|
||||||
help="也检查以「不批准:」「反例」等开头的行。默认跳过")
|
|
||||||
args = parser.parse_args(argv)
|
|
||||||
|
|
||||||
vocab = None if args.no_vocab else load_vocab(args.vocab)
|
|
||||||
checker = Checker(vocab, args.max_op, args.max_desc, args.kind,
|
|
||||||
skip_counterexamples=not args.check_counterexamples)
|
|
||||||
|
|
||||||
findings: List[Finding] = []
|
|
||||||
for path in args.files:
|
|
||||||
if path == "-":
|
|
||||||
findings.extend(checker.check_text(sys.stdin.read(), "<stdin>"))
|
|
||||||
else:
|
|
||||||
findings.extend(checker.check_file(path))
|
|
||||||
|
|
||||||
must = sum(1 for f in findings if f.level == MUST)
|
|
||||||
should = len(findings) - must
|
|
||||||
|
|
||||||
if args.json:
|
|
||||||
print(json.dumps({"findings": [asdict(f) for f in findings], "必须": must, "建议": should},
|
|
||||||
ensure_ascii=False, indent=2))
|
|
||||||
else:
|
|
||||||
if not args.quiet:
|
|
||||||
for f in findings:
|
|
||||||
print(f.format())
|
|
||||||
print(f"共 {len(findings)} 条:{MUST} {must},{SHOULD} {should}")
|
|
||||||
|
|
||||||
if args.strict and must > 0:
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
@@ -1,409 +0,0 @@
|
|||||||
# 简明技术中文规范(0.2)
|
|
||||||
|
|
||||||
Simplified Technical Chinese(STC),0.2。
|
|
||||||
|
|
||||||
简明技术中文是一套受控的中文写法,用于技术说明、操作步骤、接口文档和 AI 的解释性回答。目标只有一个:读者读一遍就不会读错。
|
|
||||||
|
|
||||||
本规范借鉴 ASD-STE100(Simplified Technical English)的方法,但不是它的译本,与 ASD 没有关系。英文的受控词典、词性和时态规则不能直接搬到中文。本规范按中文的歧义来源重新设计了规则,并配了一份中文的受控词表(见 [词表.md](词表.md))。
|
|
||||||
|
|
||||||
## 怎么读本规范
|
|
||||||
|
|
||||||
本规范有两部分:
|
|
||||||
|
|
||||||
1. 写作规则(本文件)。6 节,40 条。
|
|
||||||
2. 受控词表([词表.md](词表.md))。禁用词、选词表、一词一义限定。
|
|
||||||
|
|
||||||
每条规则有一个级别:
|
|
||||||
|
|
||||||
- 【必须】:违反就算不合规。
|
|
||||||
- 【建议】:违反时给出提醒。
|
|
||||||
|
|
||||||
本规范区分两种句子:
|
|
||||||
|
|
||||||
- 操作句:指示读者执行动作的句子。通常出现在编号步骤中,以动词开头。
|
|
||||||
- 描述句:其他句子。
|
|
||||||
|
|
||||||
两种模式:
|
|
||||||
|
|
||||||
- 常规模式:执行全部【必须】规则和词表中标为「自动检查」的条目。【建议】规则只提醒。这是默认模式。
|
|
||||||
- 严格模式:执行全部规则。
|
|
||||||
|
|
||||||
字数的计算方法见附录 A。规则中的句长数字按真实文档的句长分布校准,见附录 D。
|
|
||||||
|
|
||||||
## 适用范围
|
|
||||||
|
|
||||||
适用:
|
|
||||||
|
|
||||||
- 操作手册、安装和部署步骤、故障排查、运维手册
|
|
||||||
- 接口文档、参数说明、错误码说明
|
|
||||||
- 技术概念的解释,包括 AI 生成的解释性回答
|
|
||||||
- 界面中的提示和错误信息
|
|
||||||
|
|
||||||
不适用:
|
|
||||||
|
|
||||||
- 营销文案、品牌口号
|
|
||||||
- 叙事性文章、评论、观点
|
|
||||||
- 法律文本、合同、引用的原文
|
|
||||||
- 代码、命令、路径、字段名和其他机器可读内容。这些内容原样保留,不改写。
|
|
||||||
|
|
||||||
## 第 1 节 词
|
|
||||||
|
|
||||||
### 1.1 一个概念只用一个词【必须】
|
|
||||||
|
|
||||||
为每个对象、状态和动作选定一个词,全文一直用它。不为了避免重复而换同义词。
|
|
||||||
|
|
||||||
- 不批准:在「设置」页修改超时时间,再到配置页确认该参数已生效。
|
|
||||||
- 批准:在「设置」页修改超时时间,再在「设置」页确认超时时间已生效。
|
|
||||||
|
|
||||||
### 1.2 词表中有意义限定的词,只按限定的意义使用【必须】
|
|
||||||
|
|
||||||
词表第三部分列出了一批多义词,每个词只保留一个意义。超出这个意义时,换用词表给出的词。
|
|
||||||
|
|
||||||
- 不批准:打开日志功能。
|
|
||||||
- 批准:启用日志功能。
|
|
||||||
|
|
||||||
### 1.3 不用词表中的禁用词【必须】
|
|
||||||
|
|
||||||
词表第一部分列出了禁用词和替换方式。
|
|
||||||
|
|
||||||
- 不批准:对配置文件进行修改。
|
|
||||||
- 批准:修改配置文件。
|
|
||||||
|
|
||||||
### 1.4 不用「进行」「加以」「作出」「予以」加动词的结构【必须】
|
|
||||||
|
|
||||||
直接用动词。
|
|
||||||
|
|
||||||
- 不批准:系统会对请求进行校验,并对结果加以缓存。
|
|
||||||
- 批准:系统校验请求,并缓存结果。
|
|
||||||
|
|
||||||
### 1.5 不用没有数值的程度词【必须】
|
|
||||||
|
|
||||||
「很」「非常」「较」「比较」「大量」「少量」「尽快」「及时」这类词不给出可核对的信息。写出数值、范围或条件。描述句中没有数值可写时,删除程度词。
|
|
||||||
|
|
||||||
- 不批准:请求量较大时,尽快扩容。
|
|
||||||
- 批准:每秒请求数超过 5000 时,在 10 分钟内扩容。
|
|
||||||
|
|
||||||
### 1.6 缩写首次出现写全称,之后固定用一种写法【必须】
|
|
||||||
|
|
||||||
- 不批准:配置 CDN 后,内容分发网络会缓存静态文件。cdn 的缓存时间默认为 1 天。
|
|
||||||
- 批准:配置内容分发网络(CDN)后,CDN 会缓存静态文件。CDN 的缓存时间默认为 1 天。
|
|
||||||
|
|
||||||
### 1.7 不用行业黑话和空泛词【必须】
|
|
||||||
|
|
||||||
「赋能」「抓手」「闭环」「拉通」「沉淀」这类词不说明具体做了什么。写出具体的动作或对象。词表第一部分列出了常见的黑话。
|
|
||||||
|
|
||||||
有技术含义的词不禁用,只限定意义。例如「收敛」只用于算法和数值,「脚手架」只指生成项目初始结构的工具。见词表第三部分。
|
|
||||||
|
|
||||||
- 不批准:通过平台能力赋能业务,形成数据闭环。
|
|
||||||
- 批准:业务系统调用平台接口写入数据,平台每天把统计结果发送给业务系统。
|
|
||||||
|
|
||||||
### 1.8 英文术语全文只用一种写法【建议】
|
|
||||||
|
|
||||||
有通行中文译名的术语用中文,首次出现时括注英文。没有通行译名的保留英文。同一个术语不中英文混用。
|
|
||||||
|
|
||||||
- 不批准:先创建 token,再把令牌写入配置。
|
|
||||||
- 批准:先创建令牌(token),再把令牌写入配置。
|
|
||||||
|
|
||||||
## 第 2 节 句
|
|
||||||
|
|
||||||
### 2.1 操作句不超过 30 字,描述句不超过 40 字【必须】
|
|
||||||
|
|
||||||
字数按附录 A 计算。超过时拆句。这两个数字取自真实技术文档的句长分布。好文档里 90% 的操作句不超过 33 字,90% 的描述句不超过 41 字。见附录 D。
|
|
||||||
|
|
||||||
- 不批准:在确认数据库已经完成备份并且备份文件可以正常恢复之后,登录到主服务器执行升级脚本。
|
|
||||||
- 批准:确认数据库已备份,且备份文件能恢复。登录主服务器。运行升级脚本。
|
|
||||||
|
|
||||||
### 2.2 一句只说一件事【必须】
|
|
||||||
|
|
||||||
一句话只有一个主干动作。分号连接的分句算同一句。两个以上的并列分句拆成多句。
|
|
||||||
|
|
||||||
- 不批准:服务启动后读取配置文件,然后连接数据库,并且注册到服务发现中心。
|
|
||||||
- 批准:服务启动后读取配置文件。接着连接数据库。最后注册到服务发现中心。
|
|
||||||
|
|
||||||
### 2.3 操作句用祈使句,动词开头【必须】
|
|
||||||
|
|
||||||
不写「请」「您」「用户需要」「应该」。读者是默认的执行者,不写主语。
|
|
||||||
|
|
||||||
- 不批准:用户需要先点击「保存」按钮,然后请刷新页面。
|
|
||||||
- 批准:点击「保存」。刷新页面。
|
|
||||||
|
|
||||||
### 2.4 用主动句,写出执行者【必须】
|
|
||||||
|
|
||||||
被动句只用于执行者未知或不重要的描述句。「被」「由」「受到」「遭到」「为……所」是被动标记。
|
|
||||||
|
|
||||||
- 不批准:配置文件会被服务读取,日志由采集器收集。
|
|
||||||
- 批准:服务读取配置文件。采集器收集日志。
|
|
||||||
|
|
||||||
### 2.5 条件写在动作前面【必须】
|
|
||||||
|
|
||||||
读者在执行动作前必须知道的条件,放在动作之前。不放在句尾,不放在括号里。
|
|
||||||
|
|
||||||
- 不批准:重启服务(如果修改了端口号的话)。
|
|
||||||
- 批准:如果修改了端口号,重启服务。
|
|
||||||
|
|
||||||
### 2.6 一句最多一个否定,否定词紧挨着被否定的动作【必须】
|
|
||||||
|
|
||||||
不用双重否定:「不得不」「不无」「未尝不」「无不」「没有……不」。
|
|
||||||
|
|
||||||
- 不批准:在没有确认备份完成之前不要不做检查就删除旧数据。
|
|
||||||
- 批准:确认备份完成后,再检查旧数据。检查后,再删除旧数据。
|
|
||||||
|
|
||||||
### 2.7 定语不超过 15 字【必须】
|
|
||||||
|
|
||||||
名词前面的修饰语超过 15 字时,拆成单独的句子。一句里有连续的「的」是信号。
|
|
||||||
|
|
||||||
- 不批准:用于在系统启动时自动加载位于用户目录下的配置文件的模块默认处于启用状态。
|
|
||||||
- 批准:这个模块在系统启动时自动加载配置文件。配置文件位于用户目录下。模块默认启用。
|
|
||||||
|
|
||||||
### 2.8 指代词只指代上一句中的对象【必须】
|
|
||||||
|
|
||||||
「其」「该」「此」「它」「上述」「这个」只能指代紧挨着的上一句中的对象。超过一句,重复名词。「相关」不用作指代。
|
|
||||||
|
|
||||||
- 不批准:创建任务后,接口返回任务 ID。任务进入队列。用该 ID 查询状态。
|
|
||||||
- 批准:创建任务后,接口返回任务 ID。任务进入队列。用任务 ID 查询状态。
|
|
||||||
|
|
||||||
### 2.9 不用反问、设问和感叹【必须】
|
|
||||||
|
|
||||||
- 不批准:为什么服务起不来?因为端口被占用了!
|
|
||||||
- 批准:其他程序占用了端口时,服务无法启动。
|
|
||||||
|
|
||||||
### 2.10 描述句写出主语【建议】
|
|
||||||
|
|
||||||
操作句省略主语。描述句写出主语,特别是系统和人都可能是主语的时候。
|
|
||||||
|
|
||||||
- 不批准:保存后会重新加载配置。
|
|
||||||
- 批准:点击「保存」后,系统重新加载配置。
|
|
||||||
|
|
||||||
### 2.11 并列成分用相同的结构【建议】
|
|
||||||
|
|
||||||
- 不批准:这个命令用于创建用户、删除用户和用户权限的修改。
|
|
||||||
- 批准:这个命令用于创建用户、删除用户和修改用户权限。
|
|
||||||
|
|
||||||
## 第 3 节 段
|
|
||||||
|
|
||||||
### 3.1 一段只讲一个主题,第一句点明主题【必须】
|
|
||||||
|
|
||||||
- 不批准:缓存默认启用。日志级别可以改。缓存时间是 1 小时。
|
|
||||||
- 批准:缓存默认启用,缓存时间是 1 小时。(日志级别另起一段。)
|
|
||||||
|
|
||||||
### 3.2 一段不超过 6 句【必须】
|
|
||||||
|
|
||||||
超过时拆段,或改成列表。
|
|
||||||
|
|
||||||
### 3.3 步骤用编号列表,并列事项用项目符号【必须】
|
|
||||||
|
|
||||||
不在正文里用「首先」「然后」「最后」串联步骤。每个编号项是一个操作句。
|
|
||||||
|
|
||||||
- 不批准:首先停止服务,然后备份数据目录,最后运行升级脚本。
|
|
||||||
- 批准:
|
|
||||||
1. 停止服务。
|
|
||||||
2. 备份数据目录。
|
|
||||||
3. 运行升级脚本。
|
|
||||||
|
|
||||||
### 3.4 同一个列表的各项结构一致【建议】
|
|
||||||
|
|
||||||
同一个列表全部是句子,或全部是短语。全部以动词开头,或全部以名词开头。
|
|
||||||
|
|
||||||
- 不批准:
|
|
||||||
- 支持 PNG 格式
|
|
||||||
- JPEG
|
|
||||||
- 可以上传 GIF,但不支持动图
|
|
||||||
- 批准:
|
|
||||||
- PNG
|
|
||||||
- JPEG
|
|
||||||
- GIF(不支持动图)
|
|
||||||
|
|
||||||
### 3.5 不用「等」结尾的开放列举【必须】
|
|
||||||
|
|
||||||
列全,或写出数量并用「包括」引出。描述句中可以用「例如」引出不完整的例子。
|
|
||||||
|
|
||||||
- 不批准:支持 MySQL、PostgreSQL 等数据库。
|
|
||||||
- 批准:支持 3 种数据库:MySQL、PostgreSQL、SQLite。
|
|
||||||
- 批准(描述句):支持多种数据库,例如 MySQL 和 PostgreSQL。完整列表见附录。
|
|
||||||
|
|
||||||
## 第 4 节 步骤与警告
|
|
||||||
|
|
||||||
### 4.1 每一步只有一个动作【必须】
|
|
||||||
|
|
||||||
两个动作必须同时完成时,用「同时」连接,并保留在同一步。
|
|
||||||
|
|
||||||
- 不批准:
|
|
||||||
1. 打开终端并切换到项目目录,然后运行安装命令。
|
|
||||||
- 批准:
|
|
||||||
1. 打开终端。
|
|
||||||
2. 切换到项目目录。
|
|
||||||
3. 运行安装命令。
|
|
||||||
|
|
||||||
### 4.2 预期结果另起一句,写在动作后面【建议】
|
|
||||||
|
|
||||||
- 不批准:点击「测试连接」,这时候应该能看到绿色的成功提示才对。
|
|
||||||
- 批准:点击「测试连接」。系统显示「连接成功」。
|
|
||||||
|
|
||||||
### 4.3 警告放在它针对的步骤之前,独立成段【必须】
|
|
||||||
|
|
||||||
以「警告:」或「注意:」开头。警告只写三件事:危险是什么,后果是什么,怎么避免。不在警告里写操作步骤。
|
|
||||||
|
|
||||||
- 不批准:
|
|
||||||
1. 运行清理脚本。注意这个脚本会删除 30 天前的所有日志,不可恢复,建议先备份。
|
|
||||||
- 批准:
|
|
||||||
|
|
||||||
警告:清理脚本删除 30 天前的全部日志。删除后不能恢复。运行前先备份日志目录。
|
|
||||||
|
|
||||||
1. 备份日志目录。
|
|
||||||
2. 运行清理脚本。
|
|
||||||
|
|
||||||
### 4.4 区分人的动作和系统的行为【必须】
|
|
||||||
|
|
||||||
人的动作用祈使句。系统的行为用「系统」或具体组件名作主语。
|
|
||||||
|
|
||||||
- 不批准:
|
|
||||||
1. 点击「提交」,然后生成订单号。
|
|
||||||
- 批准:
|
|
||||||
1. 点击「提交」。系统生成订单号。
|
|
||||||
|
|
||||||
### 4.5 前置条件单独列出,放在步骤之前【必须】
|
|
||||||
|
|
||||||
- 不批准:
|
|
||||||
1. 运行部署脚本(需要 Node.js 20 以上版本和管理员权限)。
|
|
||||||
- 批准:
|
|
||||||
|
|
||||||
前置条件:
|
|
||||||
- Node.js 版本不低于 20
|
|
||||||
- 管理员权限
|
|
||||||
|
|
||||||
步骤:
|
|
||||||
1. 运行部署脚本。
|
|
||||||
|
|
||||||
### 4.6 不在步骤里解释原因【建议】
|
|
||||||
|
|
||||||
原因放在步骤之前的说明段,或步骤之后以「说明:」开头的段落。
|
|
||||||
|
|
||||||
- 不批准:
|
|
||||||
1. 把超时时间改为 60 秒,因为默认的 10 秒在大文件上传时不够用。
|
|
||||||
- 批准:
|
|
||||||
1. 把超时时间改为 60 秒。
|
|
||||||
|
|
||||||
说明:默认的 10 秒不够上传大文件。
|
|
||||||
|
|
||||||
## 第 5 节 数字、时间与范围
|
|
||||||
|
|
||||||
### 5.1 用阿拉伯数字,数字与单位之间空一格【必须】
|
|
||||||
|
|
||||||
百分号和角度符号紧跟数字,不空格。
|
|
||||||
|
|
||||||
- 不批准:等待三秒,使用率不超过百分之八十。
|
|
||||||
- 批准:等待 3 秒,使用率不超过 80%。
|
|
||||||
|
|
||||||
### 5.2 范围写明是否包含端点【必须】
|
|
||||||
|
|
||||||
不用数字后面的「以上」「以下」「以内」。用「大于」「小于」「不小于」「不大于」「至少」「至多」,或写「3 至 5(含)」。
|
|
||||||
|
|
||||||
- 不批准:文件大小在 10 MB 以内,并发数 100 以上。
|
|
||||||
- 批准:文件大小不大于 10 MB,并发数不小于 100。
|
|
||||||
|
|
||||||
### 5.3 不用相对时间【必须】
|
|
||||||
|
|
||||||
「明天」「下周」「近期」「稍后」「尽快」依赖读者读到的时间。用绝对日期或时长。
|
|
||||||
|
|
||||||
- 不批准:旧接口近期下线,请尽快迁移。
|
|
||||||
- 批准:旧接口于 2026 年 12 月 31 日下线。在此日期前完成迁移。
|
|
||||||
|
|
||||||
### 5.4 操作句和参数说明中不用估计词【必须】
|
|
||||||
|
|
||||||
「约」「大概」「左右」「几」「若干」「多次」「一些」不出现在操作句和参数说明中。写出数值或范围。描述句中可以用「约」。
|
|
||||||
|
|
||||||
- 不批准:重试几次,每次间隔大概 5 秒左右。
|
|
||||||
- 批准:最多重试 3 次,每次间隔 5 秒。
|
|
||||||
|
|
||||||
### 5.5 倍数和百分比按固定写法【必须】
|
|
||||||
|
|
||||||
减少不用「倍」,用「减少到原来的 1/n」或百分比。百分比和百分点分开写。
|
|
||||||
|
|
||||||
- 不批准:延迟降低了 3 倍,错误率从 2% 降到 1%,下降了 1%。
|
|
||||||
- 批准:延迟减少到原来的 1/3,错误率从 2% 降到 1%,下降了 1 个百分点。
|
|
||||||
|
|
||||||
### 5.6 时间用 24 小时制,面向跨时区读者时注明时区【建议】
|
|
||||||
|
|
||||||
- 不批准:下午 3 点半开始维护。
|
|
||||||
- 批准:15:30(UTC+8)开始维护。
|
|
||||||
|
|
||||||
## 第 6 节 术语与标记
|
|
||||||
|
|
||||||
### 6.1 界面元素名用「」括起,与界面文字完全一致【必须】
|
|
||||||
|
|
||||||
- 不批准:点击保存按钮,然后在高级选项里打开调试开关。
|
|
||||||
- 批准:点击「保存」。在「高级设置」中启用「调试模式」。
|
|
||||||
|
|
||||||
### 6.2 代码、命令、路径、字段名用代码标记,原样保留【必须】
|
|
||||||
|
|
||||||
不翻译,不改大小写,不加引号。
|
|
||||||
|
|
||||||
- 不批准:把配置里的 max_connections(最大连接数)改成 200。
|
|
||||||
- 批准:把 `max_connections` 改为 200。
|
|
||||||
|
|
||||||
### 6.3 超过 2000 字的文档附术语表【建议】
|
|
||||||
|
|
||||||
术语表列出文档中的首选词、英文和定义。
|
|
||||||
|
|
||||||
### 6.4 中文与英文、数字之间空一格【建议】
|
|
||||||
|
|
||||||
这条规则已有成熟的排版规范,本规范不重复展开。
|
|
||||||
|
|
||||||
## 附录 A 字数计算方法
|
|
||||||
|
|
||||||
本规范中的「字」按下面的方法计算:
|
|
||||||
|
|
||||||
- 每个汉字计 1。
|
|
||||||
- 每个连续的拉丁字母串或数字串计 1。例如 `API`、`v2.0`、`3000` 各计 1。
|
|
||||||
- 行内代码整体计 1。
|
|
||||||
- 标点、空格和括号不计。
|
|
||||||
|
|
||||||
例:「重启服务。」计 4 字。「把 `max_connections` 改为 200。」计 5 字。
|
|
||||||
|
|
||||||
一句以句号、问号或感叹号结束。分号不结束句子。
|
|
||||||
|
|
||||||
## 附录 B 与 ASD-STE100 的对应
|
|
||||||
|
|
||||||
直接迁移的方法:
|
|
||||||
|
|
||||||
- 一个词一个意义,同义词只留一个(1.1、1.2、词表)
|
|
||||||
- 句长限制,操作句和描述句分开(2.1)
|
|
||||||
- 一句一事,一步一动作(2.2、4.1)
|
|
||||||
- 祈使句,主动句(2.3、2.4)
|
|
||||||
- 条件在前,警告在前(2.5、4.3)
|
|
||||||
- 段落句数限制(3.2)
|
|
||||||
- 不用开放列举(3.5)
|
|
||||||
|
|
||||||
中文特有的规则:
|
|
||||||
|
|
||||||
- 「进行」类名词化结构(1.4)
|
|
||||||
- 长定语(2.7)
|
|
||||||
- 「以上」「以下」的端点歧义(5.2)
|
|
||||||
- 「可以」的许可和能力歧义(词表)
|
|
||||||
- 「打开」「关闭」「启动」的对象限定(词表)
|
|
||||||
- 相对时间(5.3)
|
|
||||||
|
|
||||||
英文有而中文不需要的规则:
|
|
||||||
|
|
||||||
- 动词形态限制(-ing、过去分词)
|
|
||||||
- 冠词和时态
|
|
||||||
- 词性限定
|
|
||||||
|
|
||||||
## 附录 C 与现有中文写作规范的关系
|
|
||||||
|
|
||||||
本规范不处理标点、排版、标题层级和文档结构。这些内容已有成熟的规范,建议配合使用:
|
|
||||||
|
|
||||||
- 排版和标点:中文文案排版指北、中文技术文档的写作规范(阮一峰)
|
|
||||||
- 文档结构和风格:zh-style-guide
|
|
||||||
- 事实保真和改写流程:Tech-Doc-Style-Chinese(Fenng)
|
|
||||||
|
|
||||||
本规范只做这三类项目没有做的事:编号规则、受控词表、可自动检查的句法约束。
|
|
||||||
|
|
||||||
## 附录 D 已知问题和待办
|
|
||||||
|
|
||||||
- 2.1 的句长数字按 350 万字真实技术文档的句长分布定。操作句 30 字在 85 到 90 分位之间,描述句 40 字在 90 分位附近。校准的方法和数据见 [docs/校准报告.md](docs/校准报告.md)。
|
|
||||||
- 2.7 的定语字数(15 字)没有校准,脚本也查不出定语长度。它只是人工判断的参考值。
|
|
||||||
- 1.6、2.7、2.8、3.3、4.3、4.5、4.6 脚本不查;2.4、2.5 只查操作句;2.2、2.4、2.6、5.3 在脚本里降为建议。校准显示脚本分不出这些规则的合规用法和违规用法。规则本身不变。
|
|
||||||
- 词表约 170 条。自动检查的条目只保留精确率不低于 80% 的词。
|
|
||||||
- 没有做阅读理解的对照实验。校准量的是误报率,不是读者的理解速度和出错率。
|
|
||||||
- 检查脚本只做句法层面的检查,不能判断事实是否保真。
|
|
||||||
@@ -1,211 +0,0 @@
|
|||||||
# 简明技术中文词表(0.2)
|
|
||||||
|
|
||||||
本词表是[简明技术中文规范](规范.md)的第二部分。它有三张表:
|
|
||||||
|
|
||||||
1. 禁用词:不用的词,以及替换方式。
|
|
||||||
2. 选词表:同一个意义只批准一个词。
|
|
||||||
3. 一词一义限定:批准词只按一个意义使用。
|
|
||||||
|
|
||||||
词表只覆盖通用技术写作中的词。项目专有的术语放在项目自己的术语表中。
|
|
||||||
|
|
||||||
## 格式约定
|
|
||||||
|
|
||||||
检查脚本(`tools/check.py`)直接读取本文件中的三张表。修改时保持下面的约定:
|
|
||||||
|
|
||||||
- 不改变列的顺序。
|
|
||||||
- 一格里有多个词时,用「、」分隔。
|
|
||||||
- 「自动检查」列只填「是」或「否」。填「是」的条目,脚本见到就提醒。填「否」的条目依赖语境,只供人工参考。
|
|
||||||
- 「说明」列中以「仅」开头的句子,说明脚本的检查条件。
|
|
||||||
|
|
||||||
## 第一部分 禁用词
|
|
||||||
|
|
||||||
| 禁用词 | 改用 | 说明 | 自动检查 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 进行 | 删除,直接用后面的动词 | 进行安装 → 安装 | 是 |
|
|
||||||
| 加以 | 删除,直接用后面的动词 | 加以处理 → 处理 | 是 |
|
|
||||||
| 作出、做出 | 直接用动词 | 作出修改 → 修改 | 是 |
|
|
||||||
| 予以 | 删除,直接用后面的动词 | 予以删除 → 删除 | 是 |
|
|
||||||
| 相关 | 写出具体对象 | 相关配置 → 数据库配置。「服务器相关的配置项」这类用法正常,所以不自动检查 | 否 |
|
|
||||||
| 等 | 列全,或写数量并用「包括」引出 | 仅检查「、」列举末尾的「等」 | 是 |
|
|
||||||
| 若干 | 数字 | 若干次 → 3 次 | 是 |
|
|
||||||
| 一些 | 数字,或删除 | 一些文件 → 3 个文件。描述句里「一些容器拒绝启动」是正常泛指,所以不自动检查 | 否 |
|
|
||||||
| 以上 | 大于、不小于 | 仅检查数字后的「以上」。10 以上 → 大于 10 | 是 |
|
|
||||||
| 以下 | 小于、不大于 | 仅检查数字后的「以下」。10 以下 → 小于 10 | 是 |
|
|
||||||
| 以内 | 不超过 | 1 小时以内 → 不超过 1 小时 | 是 |
|
|
||||||
| 大概、大约、左右 | 描述句用「约」,操作句写数值 | 大约 5 秒左右 → 5 秒 | 是 |
|
|
||||||
| 尽快 | 具体时限 | 尽快处理 → 在 30 分钟内处理 | 是 |
|
|
||||||
| 及时 | 具体时限,或删除 | 及时更新 → 每天更新 | 是 |
|
|
||||||
| 适当、合适、适量 | 具体数值或条件 | 适当调大 → 调到 200。「合适的命令」「适当的命名」多数没有数值可写,所以不自动检查 | 否 |
|
|
||||||
| 必要时 | 写出条件 | 必要时重启 → 端口变更后重启。描述句里「在必要时提出异议」是正常用法,所以不自动检查 | 否 |
|
|
||||||
| 的话 | 删除 | 如果失败的话 → 如果失败 | 是 |
|
|
||||||
| 一下 | 删除 | 检查一下 → 检查 | 是 |
|
|
||||||
| 方面 | 改写句子 | 在性能方面 → 性能。「在性能方面」「这些方面」是正常用法,所以不自动检查 | 否 |
|
|
||||||
| 情况 | 具体名词,或改写 | 出现错误的情况 → 出现错误时 | 是 |
|
|
||||||
| 问题 | 故障、错误、缺陷、疑问 | 仅在规范模式下提醒。常见问题(FAQ)中可用 | 否 |
|
|
||||||
| 处理 | 具体动词 | 处理请求 → 校验请求、转发请求 | 否 |
|
|
||||||
| 操作 | 具体动词;作名词时可用 | 对文件进行操作 → 读取文件 | 否 |
|
|
||||||
| 实现 | 「达到」义改用达到、完成;「编码实现」义可用 | 实现高可用 → 达到 99.99% 可用率 | 否 |
|
|
||||||
| 基本、基本上 | 删除,或写出例外 | 基本兼容 → 兼容,但不支持 X | 是 |
|
|
||||||
| 比较、较为、相对 | 删除,或给出比较对象 | 比较快 → 比 v1 快 30% | 是 |
|
|
||||||
| 非常、很、极其、相当、十分 | 删除,或给出数值 | 非常大 → 10 GB。「很可能」「很多」在操作句里也多是正常用法,所以不自动检查 | 否 |
|
|
||||||
| 大量、少量、大部分、多数、少数 | 数值或比例 | 大量请求 → 每秒 5000 个请求 | 是 |
|
|
||||||
| 多次 | 次数 | 多次重试 → 重试 3 次。描述句里「被多次调用」是正常用法,所以不自动检查 | 否 |
|
|
||||||
| 一定要、务必、千万 | 必须 | 务必备份 → 必须备份 | 是 |
|
|
||||||
| 应该、应当 | 强制用「必须」,推荐用「建议」 | 应该备份 → 必须备份。「输出应该是……」表示预期,脚本分不出来,所以不自动检查 | 否 |
|
|
||||||
| 最好 | 建议 | 最好先备份 → 建议先备份 | 是 |
|
|
||||||
| 不得、不准、不许 | 禁止,或「不要」 | 不得删除 → 禁止删除 | 是 |
|
|
||||||
| 请 | 删除 | 仅检查操作句。请点击 → 点击 | 是 |
|
|
||||||
| 您 | 删除 | 仅检查操作句。您需要重启 → 重启 | 是 |
|
|
||||||
| 你 | 删除 | 仅检查操作句。编号列表里的「你可以……」多数是说明不是步骤,所以不自动检查 | 否 |
|
|
||||||
| 需要、需 | 操作句改祈使句 | 仅检查操作句开头。需要重启服务 → 重启服务 | 是 |
|
|
||||||
| 用户可以、用户需要 | 祈使句 | 用户可以点击 → 点击 | 是 |
|
|
||||||
| 然后、接着、之后再 | 拆成编号步骤 | 仅检查编号列表项内 | 是 |
|
|
||||||
| 并且、而且 | 拆句 | 仅检查编号列表项内 | 是 |
|
|
||||||
| 同时 | 拆句;只有真正同时发生时用「同时」 | 语料里的「同时」多数确实是同时发生,所以不自动检查 | 否 |
|
|
||||||
| 首先、其次、最后 | 编号列表 | 由检查脚本的规则 3.3 判断是否在串联步骤 | 否 |
|
|
||||||
| 开启 | 功能用「启用」,文件和页面用「打开」,程序用「启动」 | | 是 |
|
|
||||||
| 关掉 | 窗口和连接用「关闭」,程序用「停止」或「退出」 | | 是 |
|
|
||||||
| 众所周知、显然、不难看出 | 删除 | | 是 |
|
|
||||||
| 其实、事实上、实际上 | 删除 | | 是 |
|
|
||||||
| 所谓 | 删除 | 「所谓幻读是指……」引出定义时是正常用法,所以不自动检查 | 否 |
|
|
||||||
| 也就是说 | 即 | | 是 |
|
|
||||||
| 赋能 | 提供、支持,或写出具体能力 | 赋能业务 → 为业务系统提供查询接口 | 是 |
|
|
||||||
| 抓手 | 措施、方法 | | 是 |
|
|
||||||
| 闭环 | 写出开始、处理和结束条件 | | 是 |
|
|
||||||
| 拉通 | 连接、同步 | 拉通数据 → 同步两个系统的数据 | 是 |
|
|
||||||
| 打通 | 连接、连通 | 「打通端口」「打通互信」在运维文档里是连通的意思,所以不自动检查 | 否 |
|
|
||||||
| 沉淀 | 保存、形成、积累 | | 是 |
|
|
||||||
| 落地 | 实施、上线、完成 | 「API 落地」「落地到 Design Token」在语料里多指实现,所以不自动检查 | 否 |
|
|
||||||
| 赛道 | 领域、市场 | | 是 |
|
|
||||||
| 心智 | 认知、印象 | | 是 |
|
|
||||||
| 收口 | 统一、汇总 | | 是 |
|
|
||||||
| 颗粒度 | 粒度 | | 是 |
|
|
||||||
| 打法 | 方法、方案 | | 是 |
|
|
||||||
| 组合拳 | 写出具体措施 | | 是 |
|
|
||||||
| 痛点 | 写出具体困难或需求 | | 是 |
|
|
||||||
| 牵头 | 负责 | | 是 |
|
|
||||||
| 倒逼 | 促使、要求 | | 是 |
|
|
||||||
| 体感 | 写出具体数值或现象 | 体感延迟高 → 延迟约 300 ms | 是 |
|
|
||||||
| 拉齐 | 统一 | | 是 |
|
|
||||||
| 对标 | 参照、对比 | | 是 |
|
|
||||||
| 顶层设计 | 总体设计 | | 是 |
|
|
||||||
| 底层逻辑 | 原理、原因 | | 是 |
|
|
||||||
| 势能、飞轮、护城河 | 写出具体优势 | 物理和机械意义时可用,所以不自动检查 | 否 |
|
|
||||||
| 入参 | 参数 | | 是 |
|
|
||||||
| 出参 | 返回值 | | 是 |
|
|
||||||
| 报错 | 名词用「错误」,动词用「返回错误」或「显示错误」 | 出现报错 → 出现错误 | 是 |
|
|
||||||
| 登陆 | 登录 | | 是 |
|
|
||||||
| 帐号 | 账号 | | 是 |
|
|
||||||
| 缺省 | 默认 | | 是 |
|
|
||||||
| 阀值 | 阈值 | | 是 |
|
|
||||||
| 布署 | 部署 | | 是 |
|
|
||||||
|
|
||||||
## 第二部分 选词表
|
|
||||||
|
|
||||||
同一个意义只批准一个词。「不批准词」只在这个意义下不批准;它们可能在别的意义下是批准词。
|
|
||||||
|
|
||||||
| 意义 | 批准词 | 不批准词 | 自动检查 | 例 |
|
|
||||||
| --- | --- | --- | --- | --- |
|
|
||||||
| 用鼠标或手指触发控件 | 点击 | 单击、点按、点选、点一下 | 是 | 点击「保存」 |
|
|
||||||
| 长时间按住控件或按键 | 长按 | 按住不放、持续按 | 否 | 长按电源键 3 秒 |
|
|
||||||
| 按物理按键 | 按 | 按压、摁 | 是 | 按回车键 |
|
|
||||||
| 使数据不再存在 | 删除 | 删掉 | 是 | 删除文件 |
|
|
||||||
| 使数据不再存在 | 删除 | 去除、去掉 | 否 | 「去除重复元素」「去掉旋转」是别的意义,所以不自动检查 |
|
|
||||||
| 从集合中拿走,对象仍存在 | 移除 | 剔除、拿掉 | 否 | 从群组中移除成员 |
|
|
||||||
| 删除容器中的全部项 | 清空 | 清除、清理 | 否 | 清空缓存 |
|
|
||||||
| 使程序或服务开始运行 | 启动 | 拉起、跑起来 | 否 | 启动服务 |
|
|
||||||
| 使程序停止运行 | 停止 | 杀掉、干掉 | 否 | 停止服务 |
|
|
||||||
| 使程序停止后再开始运行 | 重启 | 重新启动、重开 | 否 | 重启服务 |
|
|
||||||
| 使功能从不可用变为可用 | 启用 | 激活 | 否 | 启用调试模式。「开启」见第一部分 |
|
|
||||||
| 使功能从可用变为不可用 | 禁用 | 停用、屏蔽 | 否 | 禁用调试模式 |
|
|
||||||
| 打开文件、窗口、页面 | 打开 | 调出、唤起 | 否 | 打开设置页 |
|
|
||||||
| 关闭文件、窗口、页面、连接 | 关闭 | 关掉、收起 | 否 | 关闭连接 |
|
|
||||||
| 退出程序 | 退出 | 关掉、结束掉 | 否 | 退出编辑器 |
|
|
||||||
| 结束登录状态 | 退出登录 | 登出、注销 | 是 | 点击「退出登录」 |
|
|
||||||
| 删除账号 | 注销账号 | 销户、删号 | 否 | 注销账号后数据不可恢复 |
|
|
||||||
| 通过键盘输入文字 | 输入 | 键入、打入、敲入 | 是 | 输入密码 |
|
|
||||||
| 填写表单 | 填写 | 填入、录入 | 否 | 填写注册表单 |
|
|
||||||
| 从多个选项中选一个 | 选择 | 挑选、选取 | 否 | 选择「中文」。「调度器挑选一个 Pod」「随机选取」是正常动词,所以不自动检查 |
|
|
||||||
| 勾选复选框 | 勾选 | 打勾、打钩 | 是 | 勾选「记住我」 |
|
|
||||||
| 界面上出现内容 | 显示 | 展示、呈现 | 否 | 系统显示「保存成功」。「下面的例子展示了……」是「演示」义,所以不自动检查 |
|
|
||||||
| 接口把结果交给调用方 | 返回 | 回传、吐出 | 否 | 接口返回任务 ID |
|
|
||||||
| 客户端向服务端发出请求 | 发送 | 发出、下发 | 否 | 发送请求 |
|
|
||||||
| 服务端主动向客户端发消息 | 推送 | 下发、发送 | 否 | 服务端推送通知 |
|
|
||||||
| 把软件放到机器上 | 安装 | 装 | 否 | 安装依赖 |
|
|
||||||
| 把软件放到运行环境并使其可用 | 部署 | 上线 | 否 | 部署到测试环境 |
|
|
||||||
| 对外提供新版本 | 发布 | 上线、推出、放出 | 否 | 发布 v2.0 |
|
|
||||||
| 换到更高的版本 | 升级 | 更新 | 否 | 升级到 v2.0 |
|
|
||||||
| 使数据变为最新 | 更新 | 刷新(页面刷新除外) | 否 | 更新缓存 |
|
|
||||||
| 查看有没有问题 | 检查 | 核查、检验 | 否 | 检查日志 |
|
|
||||||
| 用测试确认结果正确 | 验证 | 校验、核验 | 否 | 验证签名 |
|
|
||||||
| 执行前核实条件成立 | 确认 | 确定 | 否 | 确认备份已完成 |
|
|
||||||
| 改变已有内容 | 修改 | 更改、改动 | 否 | 修改配置 |
|
|
||||||
| 把内容写入持久存储 | 保存 | 储存、存 | 否 | 保存文件 |
|
|
||||||
| 返回了错误的结果或错误码 | 错误 | 问题 | 否 | 接口返回错误。「报错」见第一部分 |
|
|
||||||
| 组件不能工作 | 故障 | 挂了 | 否 | 磁盘故障 |
|
|
||||||
| 代码中的缺陷 | 缺陷 | bug、问题 | 否 | 修复缺陷 |
|
|
||||||
| 程序运行中抛出的异常对象 | 异常 | 错误 | 否 | 捕获异常 |
|
|
||||||
| 强制要求 | 必须 | 务必、一定要 | 是 | 必须先备份 |
|
|
||||||
| 强制要求 | 必须 | 应该、应当 | 否 | 「输出应该是……」表示预期,「不应该用」表示禁止,脚本分不出来 |
|
|
||||||
| 强制不做 | 禁止 | 不准、不许、千万不要 | 是 | 禁止在生产环境运行 |
|
|
||||||
| 强制不做 | 禁止 | 不得 | 否 | 「不得超过 256 KiB」这类约束是规范文体的正常写法,所以不自动检查 |
|
|
||||||
| 允许 | 可以 | 能 | 否 | 可以跳过这一步 |
|
|
||||||
| 软件具备某能力 | 支持 | 可以、能够 | 否 | 支持 PNG 格式 |
|
|
||||||
| 推荐但不强制 | 建议 | 最好、推荐 | 否 | 建议先备份 |
|
|
||||||
| 命令或函数的输入 | 参数 | 入参 | 否 | 参数 `--port`。「入参」的自动检查见第一部分 |
|
|
||||||
| 命令行开关或设置项 | 选项 | 开关、flag | 否 | 选项「自动保存」 |
|
|
||||||
| 数据结构或表单中的项 | 字段 | 栏位、属性 | 否 | 字段 `user_id` |
|
|
||||||
| 进入登录状态 | 登录 | 登入 | 是 | 登录控制台 |
|
|
||||||
| 用户的身份标识 | 账号 | 帐号 | 是 | 创建账号 |
|
|
||||||
| 系统预设的值 | 默认 | 缺省 | 是 | 默认端口 8080 |
|
|
||||||
| 说明用法的例子 | 示例 | 例子、范例 | 否 | 请求示例 |
|
|
||||||
| 服务端对请求的回应 | 响应 | 应答、回包 | 否 | 响应时间。「DNS 应答」是协议术语,所以不自动检查 |
|
|
||||||
| 等待超过限定时间 | 超时 | 过时、超过时间 | 否 | 请求超时 |
|
|
||||||
| 失败后再次执行 | 重试 | 再试、重新尝试 | 否 | 重试 3 次 |
|
|
||||||
| 立刻 | 立即 | 马上、即刻 | 是 | 修改立即生效 |
|
|
||||||
| 当前正在使用的 | 当前 | 目前、现在 | 否 | 当前版本 |
|
|
||||||
|
|
||||||
## 第三部分 一词一义限定
|
|
||||||
|
|
||||||
下面的词是批准词,但只按「批准意义」使用。用在「不用于」中的意义时,改用「改用」列的词。
|
|
||||||
|
|
||||||
| 词 | 批准意义 | 不用于 | 改用 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 打开 | 文件、窗口、页面、连接 | 功能 | 启用 |
|
|
||||||
| 打开 | 文件、窗口、页面、连接 | 程序 | 启动 |
|
|
||||||
| 打开 | 文件、窗口、页面、连接 | 设备电源 | 开机 |
|
|
||||||
| 关闭 | 文件、窗口、页面、连接 | 功能 | 禁用 |
|
|
||||||
| 关闭 | 文件、窗口、页面、连接 | 程序 | 停止、退出 |
|
|
||||||
| 关闭 | 文件、窗口、页面、连接 | 设备电源 | 关机 |
|
|
||||||
| 启动 | 程序、服务、设备 | 功能 | 启用 |
|
|
||||||
| 启动 | 程序、服务、设备 | 流程 | 开始 |
|
|
||||||
| 运行 | 程序、命令、脚本正在执行 | 「启动」义 | 启动 |
|
|
||||||
| 更新 | 数据、内容、显示 | 版本 | 升级 |
|
|
||||||
| 删除 | 数据永久去掉 | 从集合中移走 | 移除 |
|
|
||||||
| 可以 | 允许 | 能力 | 支持、能 |
|
|
||||||
| 必须 | 强制要求 | 推测 | 可能是、原因是 |
|
|
||||||
| 问题 | 疑问(如常见问题) | 故障、错误、缺陷 | 故障、错误、缺陷 |
|
|
||||||
| 处理 | 对数据做计算或转换 | 泛指动作 | 具体动词 |
|
|
||||||
| 配置 | 名词:一组参数或配置文件。动词:设定运行参数 | 改一个选项的值 | 设置 |
|
|
||||||
| 设置 | 动词:改一个选项的值。名词:设置页面 | 配置文件 | 配置 |
|
|
||||||
| 发布 | 对外提供新版本 | 部署到环境 | 部署 |
|
|
||||||
| 同步 | 使两处数据一致 | 「同时」义 | 同时 |
|
|
||||||
| 实现 | 编写代码完成接口或功能 | 「达到」义 | 达到、完成 |
|
|
||||||
| 确认 | 核实条件成立 | 点击「确定」按钮 | 点击「确定」 |
|
|
||||||
| 支持 | 软件具备某能力 | 人工服务 | 技术支持 |
|
|
||||||
| 对齐 | 排版、字节、时间戳 | 人与人达成一致 | 统一、商定 |
|
|
||||||
| 链路 | 网络链路、调用链 | 业务流程 | 流程 |
|
|
||||||
| 即 | 也就是 | 立刻 | 立即 |
|
|
||||||
| 一般 | 「通常」义,描述句 | 操作句 | 写出条件 |
|
|
||||||
| 默认 | 系统预设的值 | 「默认同意」义 | 视为 |
|
|
||||||
| 刷新 | 重新加载页面或视图 | 更新数据 | 更新 |
|
|
||||||
| 提交 | 把表单或变更交给系统 | 发送消息 | 发送 |
|
|
||||||
| 加载 | 把数据或代码读入内存 | 「打开页面」义 | 打开 |
|
|
||||||
| 收敛 | 算法、数值、误差趋于稳定 | 「缩小范围」义 | 缩小、确定 |
|
|
||||||
| 下沉 | 位置下移 | 「把能力放到更低一层」义 | 下放、移到 |
|
|
||||||
| 抽象 | 名词和形容词:抽象类、抽象层 | 动词「概括」义 | 概括、归纳 |
|
|
||||||
| 复盘 | 故障或事件的事后分析 | 泛指回顾 | 回顾、总结 |
|
|
||||||
| 方法论 | 有名称的成套方法 | 泛指做法 | 方法、做法 |
|
|
||||||
| 脚手架 | 生成项目初始结构的工具 | 框架、基础设施 | 框架、基础设施 |
|
|
||||||
| 透传 | 参数或属性不加处理地传给下一层 | 「转发请求」义 | 转发 |
|
|
||||||
| 兜底 | 失败后的默认处理:兜底逻辑、兜底机制 | 泛指保障措施 | 写出具体措施 |
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# 规约投递闸(PostToolUse:Read | mcp__node_repl__js,2026-10-26 立)
|
|
||||||
# 干两件事:①读到 design/、game/ 下的文件时把对应规约要点注入上下文(每会话每域一次);
|
|
||||||
# ②读到四份规约本体时在读取记录里记 read: 标记——worktree-guard 的规则闸据此放行写入。
|
|
||||||
# 记录文件:${TMPDIR:-/tmp}/zcode-rule-ledger/<会话ID>.ledger,纯文本,会话结束自然失效。
|
|
||||||
# 本钩子创建记录文件这一行为本身是规则闸的启用条件(闸只在记录文件存在时生效,
|
|
||||||
# 保证「写标记的钩子活着」与「闸执法」永远成对出现)。解析异常一律静默放行。
|
|
||||||
SID="${CLAUDE_SESSION_ID:-}"
|
|
||||||
[ -z "$SID" ] && exit 0
|
|
||||||
LEDGER_DIR="${TMPDIR:-/tmp}/zcode-rule-ledger"
|
|
||||||
LEDGER="$LEDGER_DIR/$SID.ledger"
|
|
||||||
mkdir -p "$LEDGER_DIR" 2>/dev/null
|
|
||||||
touch "$LEDGER" 2>/dev/null || exit 0
|
|
||||||
payload="$(cat)"
|
|
||||||
|
|
||||||
# 目标路径:优先 file_path 字段;node_repl 等无 file_path 的载荷退化为全文找 design/、game/ 路径段
|
|
||||||
target="$(printf '%s' "$payload" | sed -n 's/.*"file_path" *: *"\([^"]*\)".*/\1/p' | head -1 | sed 's#\\\\#/#g; s#\\#/#g')"
|
|
||||||
[ -z "$target" ] && target="$(printf '%s' "$payload" | grep -oE '(design|game)/[A-Za-z0-9_./-]+' | head -1)"
|
|
||||||
[ -z "$target" ] && exit 0
|
|
||||||
low="$(printf '%s' "$target" | tr 'A-Z' 'a-z')"
|
|
||||||
|
|
||||||
# 规约本体:记 read: 标记(每份只记一次),不投递
|
|
||||||
case "$low" in
|
|
||||||
*doc-conventions.md) grep -q '^read:doc-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:doc-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
|
||||||
*concept-conventions.md) grep -q '^read:concept-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:concept-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
|
||||||
*code-conventions.md) grep -q '^read:code-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:code-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
|
||||||
*test-conventions.md) grep -q '^read:test-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:test-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
domain=""
|
|
||||||
case "$low" in
|
|
||||||
*/design/*|design/*) domain=doc ;;
|
|
||||||
*/game/*|game/*) domain=code ;;
|
|
||||||
esac
|
|
||||||
[ -z "$domain" ] && exit 0
|
|
||||||
|
|
||||||
# 域投递:每会话每域一次(文案单行、无内部双引号,保 JSON 字面合法)
|
|
||||||
if ! grep -q "^DELIVERED:$domain$" "$LEDGER" 2>/dev/null; then
|
|
||||||
if [ "$domain" = doc ]; then
|
|
||||||
msg='【规约投递】你正在读 design/ 下的文件。定文档方案/动笔前必须先完整读 design/engineering/doc-conventions.md 与 concept-conventions.md。要点提醒:正文单点维护(引用写指针不复制具体值);附加物独立成对象(禁摊平成父概念属性);概念状态用封闭枚举;禁自造黑话;文档增删同步根索引 02-系统清单。写 design/ 前无读取记录会被规则闸拦截。'
|
|
||||||
else
|
|
||||||
msg='【规约投递】你正在读 game/ 下的文件。定代码/测试方案前必须先完整读 design/engineering/code-conventions.md 与 test-conventions.md。要点提醒:数值单一事实源(data/tables 的 .tres 经 ConfigDB);RNG 单点(禁 randomize 与自建 RNG);Core 层零 UI 依赖;fail-fast;验收断言从真实入口进入,禁变异类测试与撤销类取证。写 game/ 前无读取记录会被规则闸拦截。'
|
|
||||||
fi
|
|
||||||
printf '{"additionalContext":"%s"}\n' "$msg"
|
|
||||||
printf 'DELIVERED:%s\n' "$domain" >> "$LEDGER"
|
|
||||||
fi
|
|
||||||
exit 0
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# agent 侧守卫(PreToolUse,本机件不入 git;2026-10-31 车道恢复随动——worktree 铁律回归)
|
|
||||||
# 拦四路:①Edit/Write 族写主工作区(主工作区只作合并落点;豁免 .zcode/ 与 .qoder/)
|
|
||||||
# ②Bash 在主工作区一切 git commit 一律拦(直提走 worktree;冲突/红态续合=git merge --abort → 回 worktree → 重新 git merge --no-ff,合并收尾提交不再例外)
|
|
||||||
# ③Bash 在主工作区 git commit 带 --no-verify/-n(agent 禁用,旗标仅属用户)
|
|
||||||
# (合回 merge 零机检,全量验证归合回后本地 CI:tools/hooks/post-merge)
|
|
||||||
# ④规则闸:Edit/Write 写 design/、game/,或 Bash 以文件触碰动词+路径命中两域时,
|
|
||||||
# 本会话读取记录须含对应规约 read: 标记(PostToolUse 规约投递闸读规约本体时记入;
|
|
||||||
# 记录文件不存在=投递闸未运行→本闸不启用;子代理不经守卫层,2026-10-26 实测)
|
|
||||||
# 附快速通道:Edit/Write 族目标在主工作区外(worktree)→ 免 python+git 直接过
|
|
||||||
# pre-commit 直改闸已随主区直改车道退役(commit 点零执法,全量验证归合回后本地 CI);
|
|
||||||
# 本守卫只约束 agent,用户手工改动不受限
|
|
||||||
# 退出码 2 = 拦截(stderr 回传模型);0 = 放行;任何解析异常一律放行(守卫是兜底,不能挡死会话收口)
|
|
||||||
proj="${ZCODE_PROJECT_DIR:-$PWD}"
|
|
||||||
_payload=""
|
|
||||||
IFS= read -r -d '' _payload || true # 内建全量读 stdin;临时文件只在走 python 路时才落
|
|
||||||
|
|
||||||
# ── 规则闸+快速通道(2026-10-26 立,规约投递闸配套;纯 bash 内建,零额外进程)────────────
|
|
||||||
# 规则闸:Edit/Write 写 design/、game/,或 Bash 命令以文件触碰动词+路径命中两域时,
|
|
||||||
# 本会话读取记录须含对应规约 read: 标记(PostToolUse 规约投递闸读规约本体时记入);
|
|
||||||
# 记录文件不存在=投递闸未运行(含子代理——不经守卫层,2026-10-26 实测)→ 本闸不启用。
|
|
||||||
# 快速通道:Edit/Write 族目标在主工作区外(worktree)→ 车道判定本就放行,免 python+git 直接过。
|
|
||||||
# 两段都遵守总纲:解析异常一律放行。
|
|
||||||
_rg_norm() { # 路径归一:反斜杠→斜杠、小写、/d/ 形转 d:/ 形、折叠重复斜杠(内建零进程)
|
|
||||||
local p="${1//\\//}"
|
|
||||||
p="${p,,}"
|
|
||||||
[[ $p =~ ^/([a-z])/(.*)$ ]] && p="${BASH_REMATCH[1]}:/${BASH_REMATCH[2]}"
|
|
||||||
while [[ $p == *"//"* ]]; do p="${p//\/\//\/}"; done
|
|
||||||
printf '%s' "$p"
|
|
||||||
}
|
|
||||||
_rg_tool=""; _rg_fp=""
|
|
||||||
[[ $_payload =~ \"tool_name\"[[:space:]]*:[[:space:]]*\"([^\"]*)\" ]] && _rg_tool="${BASH_REMATCH[1]}"
|
|
||||||
[[ $_payload =~ \"file_path\"[[:space:]]*:[[:space:]]*\"([^\"]*)\" ]] && _rg_fp="${BASH_REMATCH[1]}"
|
|
||||||
[ -z "$_rg_fp" ] && [[ $_payload =~ \"notebook_path\"[[:space:]]*:[[:space:]]*\"([^\"]*)\" ]] && _rg_fp="${BASH_REMATCH[1]}"
|
|
||||||
_rg_low="$(_rg_norm "$_rg_fp")"
|
|
||||||
_rl_sid="${CLAUDE_SESSION_ID:-}"
|
|
||||||
_rl_ledger="${TMPDIR:-/tmp}/zcode-rule-ledger/${_rl_sid}.ledger"
|
|
||||||
if [ -n "$_rl_sid" ] && [ -f "$_rl_ledger" ]; then
|
|
||||||
_rl_marks="$(<"$_rl_ledger")"
|
|
||||||
_rg_need() { # 域规约标记齐备→0(内建子串匹配,零进程)
|
|
||||||
if [ "$1" = doc ]; then
|
|
||||||
[[ $_rl_marks == *read:doc-conventions.md* && $_rl_marks == *read:concept-conventions.md* ]]
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
[[ $_rl_marks == *read:code-conventions.md* && $_rl_marks == *read:test-conventions.md* ]]
|
|
||||||
}
|
|
||||||
_rg_block() { printf '%s\n' "$1" >&2; exit 2; }
|
|
||||||
case "$_rg_tool" in
|
|
||||||
Edit|Write|MultiEdit|NotebookEdit)
|
|
||||||
case "$_rg_low" in
|
|
||||||
*/design/*|design/*)
|
|
||||||
_rg_need doc || _rg_block "[规则闸] 写入 design/ 前本会话未读过 doc-conventions.md 与 concept-conventions.md——先用 Read 完整读这两份规约再继续(读完自动记读取记录)。" ;;
|
|
||||||
*/game/*|game/*)
|
|
||||||
_rg_need code || _rg_block "[规则闸] 写入 game/ 前本会话未读过 code-conventions.md 与 test-conventions.md——先用 Read 完整读这两份(或把读文件操作改用 Read 工具),读完自动记读取记录。" ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
Bash)
|
|
||||||
# 命令文本(含描述字段)里「文件触碰动词+域路径」同现 → 按域核对读取记录
|
|
||||||
_lp="${_payload,,}"
|
|
||||||
if [[ $_lp =~ (^|[^a-z])(cat|head|tail|sed|less|more|grep|rg|awk|find|cp|mv|tee|wc|sort|diff)([^a-z]|$) || $_lp == *">"* ]]; then
|
|
||||||
[[ $_lp =~ (^|[^a-z])design/ ]] && { _rg_need doc || _rg_block "[规则闸] 用 Bash 触碰 design/ 前本会话未读过 doc-conventions.md 与 concept-conventions.md——先用 Read 完整读这两份(或把读文件操作改用 Read 工具),读完自动记读取记录。"; }
|
|
||||||
[[ $_lp =~ (^|[^a-z])game/ ]] && { _rg_need code || _rg_block "[规则闸] 用 Bash 触碰 game/ 前本会话未读过 code-conventions.md 与 test-conventions.md——先用 Read 完整读这两份(或把读文件操作改用 Read 工具),读完自动记读取记录。"; }
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
# 快速通道:Edit/Write 族且目标路径在主工作区外(worktree)——车道判定本就放行,免 python+git
|
|
||||||
case "$_rg_tool" in
|
|
||||||
Edit|Write|MultiEdit|NotebookEdit)
|
|
||||||
_rg_projn="$(_rg_norm "$proj")"
|
|
||||||
if [ -n "$_rg_fp" ] && [ "${_rg_low#"$_rg_projn"/}" = "$_rg_low" ]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
tmp="$(mktemp)"
|
|
||||||
printf '%s' "$_payload" > "$tmp"
|
|
||||||
projw="$(cygpath -w "$proj" 2>/dev/null || echo "$proj")"
|
|
||||||
python - "$projw" "$(cygpath -w "$tmp" 2>/dev/null || echo "$tmp")" <<'PY'
|
|
||||||
import json, os, re, subprocess, sys
|
|
||||||
|
|
||||||
try:
|
|
||||||
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def winpath(p):
|
|
||||||
# MSYS 风格路径(/d/...)原生 Windows Python 不识别,统一转 Windows 形式
|
|
||||||
if isinstance(p, str) and re.match(r"^/[A-Za-z](/|$)", p):
|
|
||||||
try:
|
|
||||||
r = subprocess.run(["cygpath", "-w", p], capture_output=True, text=True, timeout=5,
|
|
||||||
encoding="utf-8", errors="replace")
|
|
||||||
return r.stdout.strip() or p
|
|
||||||
except Exception:
|
|
||||||
return p
|
|
||||||
return p
|
|
||||||
|
|
||||||
proj = os.path.abspath(winpath(sys.argv[1]))
|
|
||||||
try:
|
|
||||||
with open(sys.argv[2], encoding='utf-8') as f:
|
|
||||||
d = json.load(f)
|
|
||||||
except Exception:
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
tool = d.get("tool_name") or d.get("tool") or ""
|
|
||||||
ti = d.get("tool_input") or {}
|
|
||||||
cwd = os.path.abspath(winpath(d.get("cwd") or proj))
|
|
||||||
|
|
||||||
def in_dir(p, root):
|
|
||||||
p = os.path.normcase(os.path.abspath(p))
|
|
||||||
root = os.path.normcase(os.path.abspath(root))
|
|
||||||
return p == root or p.startswith(root.rstrip('\\/') + os.sep)
|
|
||||||
|
|
||||||
def trunk_branch(repo):
|
|
||||||
try:
|
|
||||||
r = subprocess.run(["git", "-C", repo, "branch", "--show-current"],
|
|
||||||
capture_output=True, text=True, timeout=5,
|
|
||||||
encoding="utf-8", errors="replace")
|
|
||||||
return r.stdout.strip()
|
|
||||||
except Exception:
|
|
||||||
return ""
|
|
||||||
|
|
||||||
TRUNK = {"master", "main"}
|
|
||||||
|
|
||||||
# 车道铁律(2026-10-31 恢复):主工作区只作合并落点——agent 的 Edit/Write 族写主工作区即拦;
|
|
||||||
# 豁免 .zcode/ 与 .qoder/(本机件不入 git,worktree 带不进去);worktree 目标已在快速通道放行
|
|
||||||
if tool in ("Edit", "Write", "MultiEdit", "NotebookEdit"):
|
|
||||||
fp = ti.get("file_path") or ti.get("notebook_path") or ""
|
|
||||||
if fp:
|
|
||||||
fpn = os.path.abspath(winpath(fp))
|
|
||||||
if in_dir(fpn, proj):
|
|
||||||
rel = os.path.relpath(fpn, proj).replace("\\", "/").lower()
|
|
||||||
if not rel.startswith(".zcode/") and not rel.startswith(".qoder/"):
|
|
||||||
sys.stderr.write(
|
|
||||||
"[车道铁律] 主工作区只作合并落点,改动走独立 worktree——"
|
|
||||||
"git worktree add ../g-plan2-<任务名> -b <任务分支>,在区里改与提交;"
|
|
||||||
"豁免面仅 .zcode/ 与 .qoder/。\n")
|
|
||||||
sys.exit(2)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
cmd = ti.get("command", "") or ""
|
|
||||||
toks = cmd.split()
|
|
||||||
has_commit = False
|
|
||||||
for i, t in enumerate(toks):
|
|
||||||
if t.rstrip(';') != 'git':
|
|
||||||
continue
|
|
||||||
j = i + 1
|
|
||||||
while j < len(toks) and j - i <= 5:
|
|
||||||
u = toks[j].rstrip(';')
|
|
||||||
if u == "commit":
|
|
||||||
has_commit = True
|
|
||||||
break
|
|
||||||
if u.startswith("-"):
|
|
||||||
if u in ("-C", "--git-dir", "-c") and j + 1 < len(toks):
|
|
||||||
j += 2
|
|
||||||
continue
|
|
||||||
j += 1
|
|
||||||
continue
|
|
||||||
break
|
|
||||||
# 主工作区判定:cwd 在内,或命令文本里显式指到主工作区路径(不含 worktree 兄弟目录)
|
|
||||||
norm = cmd.replace("\\", "/").lower()
|
|
||||||
ref_main = re.search(r"/d/code/g-plan2(?![\w-])", norm) or re.search(r"d:/code/g-plan2(?![\w-])", norm)
|
|
||||||
ref_wt = re.search(r"/g-plan2-[\w-]+", norm)
|
|
||||||
sibling = bool(ref_wt) and not ref_main
|
|
||||||
on_trunk = trunk_branch(proj) in TRUNK
|
|
||||||
in_main = (in_dir(cwd, proj) or bool(ref_main)) and on_trunk
|
|
||||||
if not in_main or sibling:
|
|
||||||
sys.exit(0)
|
|
||||||
# 车道铁律(2026-10-31 恢复):主工作区禁止一切 git commit——令回 worktree;合并类命令不在本分支,
|
|
||||||
# 冲突/前置检查红态(MERGE_HEAD 在)的 git commit 续合同拦——一律 abort → 回 worktree → 重新 git merge --no-ff
|
|
||||||
if has_commit:
|
|
||||||
# --no-verify/-n 仅属用户紧急出口,agent 禁用(词法匹配兜底;
|
|
||||||
# 只扫 -m 之前的参数区,防 commit 消息里提及该旗标名造成误拦)
|
|
||||||
_flag_zone = toks
|
|
||||||
for _i, _t in enumerate(toks):
|
|
||||||
if _t.rstrip(';') == "-m":
|
|
||||||
_flag_zone = toks[:_i]
|
|
||||||
break
|
|
||||||
if any(u.rstrip(';') in ("--no-verify", "-n") for u in _flag_zone):
|
|
||||||
sys.stderr.write(
|
|
||||||
"[车道铁律] git commit --no-verify 仅属用户紧急出口,agent 禁用——"
|
|
||||||
"移除该旗标重新提交;改动走独立 worktree。\n")
|
|
||||||
sys.exit(2)
|
|
||||||
# 主区一切 git commit 一律拦(含 MERGE_HEAD 态续合),不再探测 MERGE_HEAD;
|
|
||||||
# 合并提交只由 git merge --no-ff 一步落地,两合回钩子必触发。
|
|
||||||
sys.stderr.write(
|
|
||||||
"[车道铁律] 主工作区禁止一切 git commit(含 MERGE_HEAD 态续合)——改动走独立 worktree;"
|
|
||||||
"主区唯一合法写动作=git merge --no-ff。"
|
|
||||||
"若正处合并冲突/前置检查红态:一律 git merge --abort → 回 worktree 处理 → 重新 git merge --no-ff <任务分支>。\n")
|
|
||||||
sys.exit(2)
|
|
||||||
sys.exit(0)
|
|
||||||
PY
|
|
||||||
rc=$?
|
|
||||||
rm -f "$tmp"
|
|
||||||
exit $rc
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
---
|
|
||||||
name: asset-ingest
|
|
||||||
description: g-plan2(Dungeon Sweeper)五段流水线第二段的美术素材录入入口。当用户说素材已过审、把素材录入/入库、终稿放进游戏、补 art-bible 条款时使用。**只录入、不生成任何图像内容**——样张与素材由用户主导在 artwork/ 工作区产出,本技能承接的是用户已过审的素材:核对命名与目录(改名依据=代码消费名)→拷入 game/assets/art/→art-bible 补条款(五要素缺一不可)→美术素材状态清单与待办清单状态同步→命名与目录自检。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# asset-ingest——美术素材录入(g-plan2 五段流水线)
|
|
||||||
|
|
||||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第二段做**美术线的录入半程**。**定性写死:本技能只录入、不生成任何图像内容**——样张与素材由用户主导在 `artwork/` 工作区产出,本技能承接的是**用户已过审的素材**,把它按规范落进游戏与文档。格式权威=`design/engineering/doc-conventions.md` §12.3(美术工作区目录与命名),动笔前先读它。
|
|
||||||
|
|
||||||
## 批性质与共同纪律(先读)
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`;**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。本技能的写面=`design/art/` 两文档+`待办清单.md`+素材拷贝(`game/assets/art/` 与 `artwork/` 均不入 git);**除素材拷贝外禁碰 `game/` 与 `tools/` 的任何代码文件**——素材不入 git,tracked 改动面仍只有文档,--docs 档选档不变。
|
|
||||||
- **车道铁律**:tracked 改动(`design/art/` 两文档+待办清单)走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;素材与 `artwork/` 不入 git,**素材拷贝直接落主工作区 `game/assets/art/`**(游戏实际加载的在盘位置);第 7 步 path_check 以 `--repo` 指主工作区跑。
|
|
||||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(典型=跳过第 2 步命名核对)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
|
||||||
- **禁自援特权**:执行中你自己觉得某步该跳,只能呈报后停,**禁自己援引特批**。
|
|
||||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**。
|
|
||||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
|
||||||
|
|
||||||
## 流程
|
|
||||||
|
|
||||||
### 第 1 步:定位批次与素材
|
|
||||||
|
|
||||||
在 `artwork/<YYYY-MM-DD-主题>/` 批次工作区内定位**用户点名的过审素材与样张**(样张在 `samples/` 子目录)。批次目录不存在、点名素材找不到、或用户没有明示哪些算过审 → 停工呈报,禁自行挑选或代判「这张应该过了」。
|
|
||||||
|
|
||||||
### 第 2 步:核对命名与目录(改名依据=代码消费名)
|
|
||||||
|
|
||||||
1. **命名形态**(doc-conventions §12.3):全小写英文+下划线,禁中文/空格/大写。终稿三段式 `<对象>_<部位或状态>_<规格>.png`;样张 `sample_<屏名>_<版本>.png`。
|
|
||||||
2. **目录走向**:`artwork/` 批次 → 终稿 `game/assets/art/<用途子目录>/`(现行子目录:`board/`、`character/`、`fx/`、`ui/`,见 `design/art/asset-path-map.md`)。**图片永不进 `design/`**。
|
|
||||||
3. **改名依据=代码消费名**:终稿文件名跟代码走,防断链——先在 `game/` 内查 ui_kit/资源路径常量确定消费点名(ui_kit 在 `game/presentation/views/ui_kit.gd`,`TEX_*` 常量即 `res://assets/art/...` 路径;未收进 ui_kit 的查 `design/art/asset-path-map.md` 与代码内 `res://assets/art` 引用)。素材名跟它走。**查不到消费点 → 停工呈报,禁自造名字**;呈报时带解法选项:先走代码实现批定常量,或由用户直接点名文件名(用户点名视同消费名依据,agent 仍不得自拟)。
|
|
||||||
4. 同名迭代直接覆盖,不留 v2 副本(§12.3)。
|
|
||||||
5. 本步经特批可跳(标记规则见批性质;有条目时标记写在待办清单条目状态处,无条目时随会话呈报与 commit 信息落案)。
|
|
||||||
|
|
||||||
### 第 3 步:终稿拷入
|
|
||||||
|
|
||||||
把过审终稿拷入 `game/assets/art/` 对应用途子目录(该目录不入 git,在盘即生效;打包发布方案另有既定口径,与本技能无关)。
|
|
||||||
|
|
||||||
### 第 4 步:art-bible 补条款
|
|
||||||
|
|
||||||
对 `design/art/art-bible.md` 补录条款,**每条条款五要素缺一不可**:
|
|
||||||
|
|
||||||
1. **条款名**;
|
|
||||||
2. **规则句**(一句白话说清规则);
|
|
||||||
3. **像素级判据**(写成可核对的判读句);
|
|
||||||
4. **参考图指针**——只许指入库稳定位置(`design/art/references/`、`asset-path-map.md`),**禁指 `artwork/` 在途散路径**(该目录不入 git 会消失,art-bible §8.3 归档纪律);
|
|
||||||
5. **文首头注版本号递增**(「现行为 vX.Y」同步更新)——禁写版本历史表,改动明细只进 git 提交信息。
|
|
||||||
|
|
||||||
新条款按 art-bible 头注「条款验收标注纪律」标注验收方式(←机检/←目检/←方向性)。
|
|
||||||
|
|
||||||
### 第 5 步:美术素材状态清单同步
|
|
||||||
|
|
||||||
更新 `design/art/art-status-checklist.md`(该文件名已核实,是纯看板:素材名×状态×需求文档指针;注意它与生产规格清单 `art-assets-checklist.md` 是两份文件,本步只动前者):对应素材行状态列改 ✅+一行事实(何时、何批、落点)——做完不删行,改状态。
|
|
||||||
|
|
||||||
### 第 6 步:待办清单状态推进
|
|
||||||
|
|
||||||
按 doc-conventions §12.1 状态机改写条目状态属性(仅在册条目适用;本次会话新录入、清单内无对应事项时本步跳过,禁为录入动作新建条目):
|
|
||||||
|
|
||||||
- **只走美术线**:改「美术设计已闭合(凭据=样张过审、art-bible 条款版本)」,凭据落成实例形态 `美术设计已闭合(样张过审 2026-10-18、art-bible v3.16 §8.2)`——**凭据括号内禁用+号**(+只作状态段连接符;凭据内并列项按 doc-conventions §12.1 用顿号,用+会被流水线闸误判成状态段)。本线全闭合,删除「缺口」属性。
|
|
||||||
- **两条设计线并列**:改两段并列,美术侧闭合、文档侧保持原状态(例:`文档设计已闭合(…v0.6)+美术设计已闭合(…)`)。**「缺口」属性只在两侧全闭合(条目转入 待写卡)时才删**——状态里只要还有待文档设计/文档设计中/待美术设计/美术设计中任一词,缺口属性必须在(流水线闸判据);单侧闭合时保留并改写为剩余线还差什么。
|
|
||||||
- 若第 2 步经特批跳过,标记写在本条目状态处(无条目时随会话呈报与 commit 信息落案)。
|
|
||||||
- 旧格式条目先向用户确认所属设计线与改动面,按 §12.1 补齐格式再写状态(同 doc-design 第 1 步口径)。
|
|
||||||
- 改完顺带跑 `python tools/pipeline_gate.py` 自核本次条目零红(过渡期存量红注明即可)。
|
|
||||||
|
|
||||||
### 第 7 步:命名与目录自检
|
|
||||||
|
|
||||||
两半都做:
|
|
||||||
|
|
||||||
1. **命名形态**:先扫一眼 `tools/` 有无现行命名检查器可引用(截至 2026-10-18 没有——`path_check.py` 管目录与消费链、`standee_asset_check.py` 是内容机检不属此类),没有就按 doc-conventions §12.3 规则逐文件核对(三段式/全小写/下划线/用途子目录/无 v2 副本)。
|
|
||||||
2. **目录与消费链**:跑 `python tools/path_check.py --repo <主工作区>`(路径核对器:声明路径存在性+代码 `res://assets/art` 引用与盘上文件互核)——拷完必跑。注意它查的是「代码引用的文件在不在」,**不查「盘上多余文件的名字对不对」**:命名核对若被特批跳过,本步结论必须如实注明「命名形态未检」,禁让 path_check 绿顶替命名核对。
|
|
||||||
|
|
||||||
**美术内容不做机检**:`tools/standee_asset_check.py` 等内容级检查器(档高/色数/描边)不属本技能,禁在本流程内跑。
|
|
||||||
|
|
||||||
### 收尾
|
|
||||||
|
|
||||||
`python tools/run_all_gates.sh --docs`(文档域闸),全绿合并回 master。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- **禁生成、禁改图、禁代画**:素材内容层面的一切意见(好不好看、要不要改)只能呈报给用户,本技能零处置权。
|
|
||||||
- 平实简体中文,禁自造黑话;流水线词汇按 doc-conventions §12 用法一致使用。
|
|
||||||
- 本技能不写需求卡片、不编迭代、不碰代码——代码消费常量的**新增/改名**属代码实现批的活,只能呈报留给下游,禁顺手改 `ui_kit.gd`。
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
---
|
|
||||||
name: batch-closure
|
|
||||||
description: g-plan2(Dungeon Sweeper)批后收尾与中间文档退役入口。当用户说「迭代 N 收尾/批后收尾/落完反哺点收个尾」「清理中间文档/清理暂存地」「把某份报告退役」时使用。做两类事:①iter 批后收尾——反哺点落文凭据核对(落文本身委托 doc-design,本技能禁代写)、reports/ 产出物(实现报告/反哺点清单/验收审计报告)退役判据核对与删除、待办清单条目整条删除、roadmap 迭代行与顶部「当前位」三行换代;②中间文档退役——中间文档唯一暂存地 `reports/`(需求卡片/迭代产出物/提案/审计/需求澄清过程稿)按「吸收即死」判据核对后删除(需求卡片死期=所属迭代实现批合回 master)。规则权威=doc-conventions §11+concept-conventions §2,本技能只做执行编排、不复写规则;与 doc-consistency-check 分工=那边定期体检只读只报、这边被点名后执行清理。工程/文档改动批(直改类):可写 design/ 与 roadmap.md,收尾跑 --docs 文档域闸。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# batch-closure——批后收尾与中间文档退役(g-plan2)
|
|
||||||
|
|
||||||
你做的是批次结束后的清库工作:把已完成批次留下的中间文档,按「吸收即死」(规则权威=`design/engineering/doc-conventions.md` §11,删除手法=`design/engineering/concept-conventions.md` 第 2 节删除概念 SOP)退役掉,并随手把账面(roadmap、待办清单)换到与现实一致。**本技能只做执行编排,禁在本文件复写或改判规则**——判据与本文件冲突时以 §11/§12 现行文本为准,并停工呈报。
|
|
||||||
|
|
||||||
## 职责边界(先读)
|
|
||||||
|
|
||||||
- **反哺落文不归本技能**:把反哺点写进 GDD/art-bible 走 doc-design 技能(其「反哺点写入模式」触发)。本技能只核对落文结果(待办清单反哺点专条状态=已写入+落点+版本号),核对不过就把落文委托给 doc-design(唯一出口,落文完成后接着收尾),**禁代写落文**。
|
|
||||||
- **只报不删的体检不归本技能**:doc-consistency-check 定期体检只读、只呈报问题;本技能是执行臂——用户点名(含体检报出后点名)才动手删。
|
|
||||||
- **触发词分界**:「落反哺点/处理反哺点清单/反哺点裁决写入」=doc-design;「收尾/清理中间文档/清理暂存地/退役××文档」=本技能。
|
|
||||||
|
|
||||||
## 批性质与共同纪律
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(账面换代正是本批产出);禁跑 `tools/run_all_gates.sh` 全量档(不带参数)与任何游戏测试、MC 跑批;收尾=手动跑 `--docs`(文档域覆盖 `game/` 内 `.md`、design/、根规则文件、reports/、tools/、.zcode/ 等一切非代码面改动),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。
|
|
||||||
- **车道铁律**:reports/ 产出物与账面换代(roadmap/待办清单)都是 tracked 文件——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;迭代批自身的 worktree 收口动作(merge+remove)照旧;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。
|
|
||||||
- **删除三步强制**:先 grep 引用面 → 改写指路句(改法=结论内联或换 git 提交号)→ 再删文件;收尾死链检查必须绿(`tools/doc_link_audit.py`,随 --docs 跑)。
|
|
||||||
- **判据不过禁删**:任一文件的退役判据不过,逐份呈报等用户裁,禁「顺手清掉」;用户明示强行退役才照办,并在提交信息记 `〔用户特批 YYYY-MM-DD 退役××〕`(标记须带日期,doc-conventions §12.4)。本技能无特权,禁自答放行。
|
|
||||||
- 白话写作(doc-conventions §2)与流水线词汇(§12)全程生效。
|
|
||||||
|
|
||||||
## 主流程 A:iter 批后收尾
|
|
||||||
|
|
||||||
触发:用户说「迭代 N 收尾/批后收尾/落完反哺点了收个尾」。
|
|
||||||
|
|
||||||
### 第 1 步:盘点该迭代的在飞面
|
|
||||||
|
|
||||||
1. 读 `roadmap.md` 迭代 N 行(状态列应已是或应改为「已完成」)与 `reports/` 下该迭代全部文件(实现报告/反哺点清单/验收审计报告,文件名形如 `iter<N>-*-<日期>.md`)。
|
|
||||||
2. 读待办清单:该迭代各条目(状态应走到「已编迭代 N」)、本迭代产出的反哺点专条。
|
|
||||||
3. **前置核对反哺点是否已落文**:反哺点清单还在且待办清单对应专条未到「已写入(落点+版本)」→ 直接转 doc-design 反哺模式把落文办完,再接着收尾;用户明示本批暂不落文的,反哺点清单保留、只清其余件,呈报里写明这个例外。
|
|
||||||
|
|
||||||
### 第 2 步:逐份过退役判据
|
|
||||||
|
|
||||||
| 文件 | 退役判据 | 不过怎么办 |
|
|
||||||
|---|---|---|
|
|
||||||
| `iter<N>-反哺点-*.md` | 已随落文退役(doc-design 第 5 步),或全部条目已落文(待办清单专条=已写入+落点+版本号) | 第 1 步已拦,委托 doc-design |
|
|
||||||
| `iter<N>-实现报告-*.md` | 遗留读数义务逐条已迁(体验验证清单或待办清单在册);实机目检项已登记体验验证清单 | 未决先迁再死:先迁待办清单/体验验证清单再退役 |
|
|
||||||
| `iter<N>-验收审计-*.md` | 审计结论已并入实现报告、无未决项 | 未决项先迁再死:先迁待办清单/实现报告再退役 |
|
|
||||||
|
|
||||||
更旧迭代(M<N)在 `reports/` 的残留件,同表过判据后随本批一并清——「证据只留最新」(§11):新证据落位后旧份同批退役。
|
|
||||||
|
|
||||||
### 第 3 步:引用面改写
|
|
||||||
|
|
||||||
对每份待删文件:grep 文件名于 `design/`+`roadmap.md`+`AGENTS.md`,把指路句改写为结论内联或 git 提交号。roadmap 迭代 N 行实现报告列同步改「已退役(git 历史可考)」(doc-conventions §12.2 保留字)。
|
|
||||||
|
|
||||||
### 第 4 步:删除与账面换代
|
|
||||||
|
|
||||||
1. 删除判据全过的文件。
|
|
||||||
2. 待办清单账面:该迭代条目「完成即整条删除」;已写入的反哺点专条整条删除(两者均 §12.1 状态机出口)。
|
|
||||||
3. roadmap 账面:迭代 N 行状态列改「已完成(YYYY-MM-DD)」;顶部「当前位」三行(阶段/迭代位/下一步)换代——只回答「现在该做什么」,禁扩写成状态快照(doc-conventions §10)。
|
|
||||||
|
|
||||||
### 第 5 步:收尾闸
|
|
||||||
|
|
||||||
`python tools/run_all_gates.sh --docs` 全绿 → 按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
|
||||||
|
|
||||||
## 主流程 B:中间文档退役(单份或批量)
|
|
||||||
|
|
||||||
触发:用户点名某份中间文档要退役,或说「清理暂存地」。
|
|
||||||
|
|
||||||
1. **候选呈报**:点名=直接核该份;「清理暂存地」=扫 `reports/`(中间文档唯一暂存地:需求卡片、迭代产出物、提案/审计/需求澄清/评估过程稿;入内文件默认到期即死,需求卡片死期=所属迭代实现批合回 master),按「结论已吸收?未决已迁?」初筛,呈候选清单等用户点名后才动手。
|
|
||||||
- **`design/` 下禁止过程件目录**(`design/research/` 已于 2026-10-21 退役,熵增闸退役路径清单收它,目录再现即判红):扫到落在 `design/` 里的提案/审计/调研/需求澄清稿即属违规件,呈报迁 `reports/`;文件自称「常驻/已追认/不受吸收即死约束」一律无效,确实要长期留用的退役内容只走 `design/content-archive/` 转正一条路。
|
|
||||||
- **根目录 `playnote.md` 不入候选清单**:它是用户本人试玩随手记,只由用户增删,不属任何文档族、不受吸收即死管辖。
|
|
||||||
2. **判据核对(逐份)**:结论已被权威文档吸收(GDD 对应节/art-bible/架构文档〔仅约束面且须用户落文——2026-11-07 用户裁架构文档写权限=用户专属〕/术语表 grep 得到);未决内容已迁待办清单或 roadmap 卡;证据类另核「证据只留最新」。既没被吸收又不肯迁出的,只有「转正迁 `design/content-archive/`」与「呈用户裁决」两条出口,禁原地自封常驻。
|
|
||||||
- **需求卡片特殊**:`reports/` 下的需求卡片须另核 roadmap 行——行内已填「已退役(git 历史可考)」或卡片已被新版替代才可退役,迭代仍引用的卡片禁删。
|
|
||||||
3. 未吸收 → 呈报建议落点(落文走 doc-design 或用户直裁),禁先删;判据过 → 引用面改写 → 删 → 死链检查绿。
|
|
||||||
4. 收尾闸 `--docs` 全绿 → 按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实简体中文,禁自造黑话;吸收即死/退役/未决先迁再死/证据只留最新等词按 doc-conventions §11 用法一致使用。
|
|
||||||
- 删除是不可逆动作:同批删除清单在呈报里逐份列名,用户看得见每一份才动手。
|
|
||||||
- 本技能不写需求卡片、不做设计讨论、不碰代码——上游各归其段:落文=doc-design,体检=doc-consistency-check。
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
---
|
|
||||||
name: doc-design
|
|
||||||
description: g-plan2(Dungeon Sweeper)五段流水线第二段的文档设计入口。当用户要求做某事项的文档设计、发起系统设计讨论、把设计定稿写进 GDD、或要求处理迭代反哺点清单(落反哺点/反哺点裁决写入)时使用。流程:从待办清单取条目校验所属设计线与状态→用户主导的设计讨论(待裁点全案并列、禁代裁)→待裁点清零+用户点头后定稿写入 GDD→待办清单状态推进「文档设计已闭合」→跑流水线闸。兼任反哺点写入与 design/engineering/ 规约类文档修订。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# doc-design——文档设计段入口(g-plan2 五段流水线)
|
|
||||||
|
|
||||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第二段做**文档线**设计:把一件登记在册的事,经用户主导的设计讨论,定稿成 GDD 文档(或 design/engineering/ 规约修订)。条目格式与状态机权威=`design/engineering/doc-conventions.md` §12,动笔前先读它。
|
|
||||||
|
|
||||||
## 批性质与共同纪律(先读)
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(这正是本批产出);**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证(文档批=文档域秒级闸),结果不等待、不落地,随时用 `tools/ci_check.sh <合并提交>` 现查(合回零等待,process-conventions §1 第 3 条)。tracked 改动默认只许落在 `design/` 与 `roadmap.md`;规约修订批(用户发令改流程规约时)写面可含 `AGENTS.md`、`design/engineering/` 规约与 `tools/` 闸件,按批列明写面,闸仍跑 `--docs`。
|
|
||||||
- **车道铁律**:本技能写面全是 tracked 文档面——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。触及代码面(`game/` 下非 `.md`)的改动不属本技能面。
|
|
||||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(如跳过设计讨论直接落定稿)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
|
||||||
- **禁自援特权**:执行中你自己觉得某步该跳,只能呈报后停,**禁自己援引特批**。
|
|
||||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**。pipeline_gate 注册进 run_all_gates 文档域归数据整改批,此前 --docs 的回执不含它,属正常。
|
|
||||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
|
||||||
|
|
||||||
## 主流程(文档线设计)
|
|
||||||
|
|
||||||
### 第 1 步:取条目并校验
|
|
||||||
|
|
||||||
1. **判来源**:用户点名某条在册事项 → 从 `待办清单.md` 取该条目,取不到就回报「清单内无此事项」并停,禁自造条目凑流程;本次会话新提出的事项 → 无条目直接进第 2 步(条目记的是进度,不是讨论的开工前置)。
|
|
||||||
2. 校验两件事:
|
|
||||||
- **所属设计线**:状态行含文档线段(待文档设计/文档设计中/文档设计已闭合)。
|
|
||||||
- **状态**:为「待文档设计」或「文档设计中」。
|
|
||||||
3. 状态不对 → **停工呈报,禁硬做**。典型:已闭合(设计已完,重开须用户明示并说明理由);需求性工程条目(状态整行无设计线段,走 req-card)或直改类条目(状态=待执行,不走写卡);已写卡/已编迭代(下游已动,改动=回退流程,归用户裁)。
|
|
||||||
4. 条目是旧格式存量(标题缺登记元数据)→ 先向用户确认其来源与所属设计线、改动面,再按 doc-conventions §12.1 模板补齐标题元数据与四属性(实况/缺口/改动面/状态)(这属「本次操作对象格式合规」动作),然后回到第 2 步校验。确认中若答案已注定校验不过(如状态整行无设计线段=需求性工程条目或直改类条目),直接停工呈报,禁补格式硬做。
|
|
||||||
|
|
||||||
### 第 2 步:设计讨论(用户主导)
|
|
||||||
|
|
||||||
1. **开题先用一句 ≤50 字大白话概览**:这个系统/事项是什么、为什么现在做。
|
|
||||||
2. **先高抽象后具体**:方向、骨架、边界未定前,禁铺具体条目(数值表、条目清单、字段细节都是具体层)。
|
|
||||||
3. **每个待裁点呈全部备选方案与代价**,禁代裁——设计权归用户。零待裁点也要向用户报明「本讨论零待裁点」,同样等用户点头。
|
|
||||||
4. 讨论中冒出的新待裁点随时入册(记在会话内呈报的待裁点清册,不写进 GDD 正文——doc-conventions §5:正文只写现行规则)。
|
|
||||||
5. 会话内进行、禁无监管自跑(process-conventions §2 段铁律)。
|
|
||||||
|
|
||||||
### 第 3 步:闭合与写入 GDD
|
|
||||||
|
|
||||||
闭合判据=**待裁点清零+用户点头**,二者缺一不可;带未裁点的产出是讨论稿,禁写入。闭合后才动笔:
|
|
||||||
|
|
||||||
1. 定稿写入 GDD 系统文档(`design/gdd/systems/<域>/<系统>.md`),骨架按 doc-conventions §6 系统文档骨架(文首引言/设计目的/系统范围/核心循环位置/核心规则/依赖与输出/P0 与后置/调参表/验收标准/待办指路存根)。
|
|
||||||
2. **新系统**同步根索引 `design/gdd/02-系统清单.md`(文档增删必须同步根索引,doc-conventions §5)。
|
|
||||||
3. **新数值**进 `game/data/tables/*.tres`,且 owner GDD 正文表格同步;涉术语规范名时同步 `design/gdd/术语表.md`——三处之一未更新即视为变更未完成(doc-conventions §5 数值纪律)。
|
|
||||||
4. **文首状态行版本号递增**(「现行为 vX.Y」)——禁写版本历史表,改动明细只进 git 提交信息(doc-conventions §5 禁写变更记录、gdd_lint R4 拦截)。
|
|
||||||
5. **画面类需求另出预览图(2026-11-05 立)**:触碰画面呈现规格的需求(新增画面要素/布局/配色/动效),定稿写入前先出目标画面的 HTML/SVG 效果图(diagram-design 通道),经用户人审通过才算本线闭合;预览图内嵌对应 ux/ 规格文档并随附像素级视觉判据句(process-conventions §7 第 2 条同款写法)——写卡段引它、实现批基线冻结时用户对照它(test-conventions §8.2)。缺陷修复以现行规格与在库基线为准,不触发新预览。
|
|
||||||
|
|
||||||
### 第 4 步:待办清单状态推进
|
|
||||||
|
|
||||||
按 doc-conventions §12.1 状态机改写条目状态属性:
|
|
||||||
|
|
||||||
- **只走文档线**:改「文档设计已闭合(凭据=文档路径+版本号,例:`design/gdd/systems/排雷循环/排雷玩法.md v1.3`)」,并删除「缺口」属性(本线全闭合,状态里已无未闭合态词)。
|
|
||||||
- **文档线与美术线并列**:改两段并列,文档侧闭合、美术侧保持原状态(例:`文档设计已闭合(…v0.6)+美术设计中`)。**「缺口」属性此步保留**,改写为美术侧还差什么——状态里只要还有 待美术设计/待文档设计 等未闭合态词,缺口属性就必须在(流水线闸判据:四态必须有缺口、其余状态不得有);待美术侧也闭合、条目转入 待写卡 时才删。
|
|
||||||
- **「已闭合」不带凭据不算合法状态词**。
|
|
||||||
- 若经特批跳过本段某步,标记写在本条目状态处。
|
|
||||||
|
|
||||||
### 第 5 步:跑流水线闸
|
|
||||||
|
|
||||||
`python tools/pipeline_gate.py`,核对与本次条目相关的判据零红。过渡期存量红注明即可(见批性质);**本次操作对象自身的格式必须合规**,对象自身有红就改到绿再收尾。
|
|
||||||
|
|
||||||
### 收尾
|
|
||||||
|
|
||||||
`python tools/run_all_gates.sh --docs`(文档域闸),全绿后按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
|
||||||
|
|
||||||
## 反哺点写入模式(同技能第二触发)
|
|
||||||
|
|
||||||
本技能两个入口:用户说「做文档设计/系统设计讨论/定稿进 GDD」走上面的主流程;用户说「落反哺点/处理反哺点清单/反哺点裁决写入」**直接走本节,不进主流程**(反哺点专条走的是另一套状态词,主流程第 1 步对它必然停工)。本节流程:
|
|
||||||
|
|
||||||
1. 读 `reports/iter<N>-反哺点-<日期>.md`(反哺点清单由实现批产出,每条写明哪个文件哪一节、改成什么、依据是什么)。
|
|
||||||
2. **逐条呈用户裁决**。**禁未裁决直接写入**——清单写着什么改法不等于已裁决。
|
|
||||||
3. 裁决通过的,写入对应 GDD/art-bible 章节(写入纪律同第 4 步:文首状态行版本号递增、禁写版本历史表、数值三处同步)。**架构文档不在反哺落点内**(2026-11-07 用户裁:架构文档只写约束面、写权限=用户专属)——反哺点涉架构事实时只呈报,由用户裁决后亲自落文。
|
|
||||||
4. 待办清单对应反哺点专条(状态取待裁决/已写入)状态改「已写入(落点=文档+版本)」,落成实例形态 `已写入(design/gdd/systems/…/xxx.md v1.4)`——凭据须为真实文档路径+版本号(流水线闸判据)。
|
|
||||||
5. 清单条目按「吸收即死」退役(doc-conventions §11):全部条目落文后核对引用面、改写指路句,再退役清单文件(实现报告内的清单按「证据只留最新」口径随批退役)。
|
|
||||||
|
|
||||||
## 兼任范围注记
|
|
||||||
|
|
||||||
`design/engineering/` 规约类文档(process-conventions / doc-conventions / code-conventions 等)的修订也走本技能:同样经用户主导讨论、待裁点清零+用户点头后才落笔,落笔后按对应文档自身的版本/头注惯例记录修订。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实简体中文,禁自造黑话;流水线词汇(登记/文档设计/美术设计/改动面/特批标记/流水线闸/需求性工程条目/待执行/已写卡/已编迭代)按 doc-conventions §12 用法一致使用。
|
|
||||||
- 白话写作规则(doc-conventions §2)与表达分工(§3)对写入 GDD 的内容全程生效。
|
|
||||||
- 本技能不写需求卡片、不编迭代、不碰代码——下游各归其段:写卡=req-card,编排=iter-plan。
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
---
|
|
||||||
name: iter-plan
|
|
||||||
description: g-plan2(Dungeon Sweeper)五段流水线第四段的迭代编排入口。当用户要求编排迭代、把卡片编入迭代、凑一个迭代、开新一轮迭代、做迭代规划时使用。流程:扫待办清单「已写卡」条目呈编排候选清单→用户点名卡与迭代号→开工前预检(拟编卡集只读事实面实核八类,P1 红项停编排退回写卡段)→编排五查(卡片存在/设计闭合凭据齐/估时与冻结线/复核记录在位/写完 roadmap 行跑流水线闸确认绿)→写 roadmap 迭代总表一行六列→待办清单状态推进「已编迭代 N」→呈报编排结果。本技能不动卡片内容、不写实现报告,发现卡片问题呈报退回写卡段。仓库在 D:/code/g-plan2。
|
|
||||||
---
|
|
||||||
|
|
||||||
# iter-plan——迭代编排段入口(g-plan2 五段流水线)
|
|
||||||
|
|
||||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第四段做编排:把用户点名的已写卡需求卡片编进 roadmap 迭代总表一行。格式权威=`design/engineering/doc-conventions.md` §12.2(roadmap 迭代行六列),动笔前先读它。本技能**不动卡片内容、不写实现报告**——发现卡片有问题,呈报退回写卡段(req-card),禁代修。
|
|
||||||
|
|
||||||
## 批性质与共同纪律(先读)
|
|
||||||
|
|
||||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
|
||||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(本批产出=roadmap 迭代行+待办清单状态);**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。
|
|
||||||
- **车道铁律**:本技能写面(roadmap 行+待办清单状态)全是 tracked 文件——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。
|
|
||||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(典型=带未裁凭据硬编入)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
|
||||||
- **禁自援特权**:执行中你自己觉得某步该跳(如觉得某卡凭据「显然没问题」),只能呈报后停,**禁自己援引特批**。
|
|
||||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**(本次写入的迭代行与改写状态的条目,必须按 §12 新格式写)。
|
|
||||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
|
||||||
|
|
||||||
## 流程
|
|
||||||
|
|
||||||
### 第 1 步:扫候选并呈报
|
|
||||||
|
|
||||||
扫 `待办清单.md` 中状态为「已写卡」的条目,逐条打开其状态里登记的卡片文件读取估时,呈报**编排候选清单**,一行一条:
|
|
||||||
|
|
||||||
- 条目名 / 卡片路径 / 估时 / 设计闭合凭据(文档线/美术线各报各的;无设计线段条目报实况里的证据指认)。
|
|
||||||
|
|
||||||
旧格式条目状态词不属新状态机(如「待编入」「待排期」)时,先向用户确认其真实状态与卡片路径,按 doc-conventions §12.1 补齐格式(「已写卡」必须在状态里带 `reports/` 卡片路径)再纳入候选——禁凭旧词自行推断状态。
|
|
||||||
|
|
||||||
候选为零时如实呈报「无可编卡」,结束本轮,禁硬凑。
|
|
||||||
|
|
||||||
### 第 2 步:用户点名与迭代号
|
|
||||||
|
|
||||||
1. 用户点名哪些卡进哪个迭代(点名内容=卡+迭代号)。**点名的卡不在第 1 步候选清单(条目状态非「已写卡」)→ 呈报该条不可编入及原因(还停在哪一段),禁编入**;用户坚持「凭据差不多齐了直接编」也只能呈报后停(禁自援特权)。
|
|
||||||
2. **迭代号=roadmap 迭代总表现行最大号+1**(旧格式 roadmap 无总表,从迭代进度等现行记事取最大号);编入已有未完成迭代用其现号,**新开迭代行经用户确认**后才立。
|
|
||||||
3. 需求卡片列格内顺序=执行顺序:用户点名时一并给定就照抄;用户未给序 → 呈建议序(按卡片依赖与估时)请确认后再写。
|
|
||||||
4. 旧格式 roadmap 没有六列迭代总表区时,呈报用户「总表区尚不存在,本次按 §12.2 新立表区再写行」,经确认后立表(这属本次操作对象格式合规动作)。
|
|
||||||
|
|
||||||
### 第 3 步:开工前预检(2026-11-07 用户立)
|
|
||||||
|
|
||||||
收令点名卡集后、编排五查与落表前,对拟编卡集做一轮**只读事实面预检**。目标=尽量减少实现期停工,**不是杜绝**:预检之后其他批次合回、文档再被改动等环境漂移,以及卡片被并行修改,仍可能在实现期停工——那部分由实现段异常分级(iter 技能 L3 停机呈报)与 iter T0 开工日 file:line 窄复核兜底。
|
|
||||||
|
|
||||||
- **对象**:用户点名的卡集;补编进未完成迭代的场景,交集类检查对象还要加上该迭代已编入的卡。
|
|
||||||
- **形态**:只读实核,不建区、不落笔、不改任何文件。执行方式=未参与写卡的只读子代理并行分片实核+主会话汇总裁决;每片按 file:line 清单逐条回「一致/漂移/缺+实际行号引用」。
|
|
||||||
- **发现是中间产物(吸收即死)**:P1 项退回写卡段修订,处置随卡「复核记录」节留痕;预检清单文件即删、永不提交。
|
|
||||||
|
|
||||||
八类检查逐类过,发现按 P1/P2/P3 分级:
|
|
||||||
|
|
||||||
| # | 检查类 | 查法 |
|
|
||||||
|---|---|---|
|
|
||||||
| 1 | 卡内一致性互证 | 🔴契约 vs 任务卡 vs 验证闸对照表 vs 落位预检互相印证——汇总级抽查即可,逐条细查归写卡段复核(req-card grilling 门) |
|
|
||||||
| 2 | 代码现状锚实核 | 卡片「现状事实」每条 file:line 打开实读;落位预检的新名 grep 全仓应零命中;「计划新增」件核不存在、「复用既有」件核存在 |
|
|
||||||
| 3 | 判据出处行锚实核 | 对照表每行锚所指文档行打开实读,核句子在位**且内容与该行判据匹配**——机检 C5 只查存在性,查不出内容错位;写卡后文档被其他批改动会使锚漂移(2026-11-07 退役卡 ux 四锚漂移实证) |
|
|
||||||
| 4 | 验收协议可执行性 | 对拍/等价/重放类判据的「改前基线+改后载体」两腿齐备:基线怎么来(采集步骤在卡内)、载体在盘可跑(工具在 tools/、锚在 sim-data/、golden 基线在 game/tests/golden/) |
|
|
||||||
| 5 | 跨卡触碰面交集与卡序语义依赖 | 点名卡集两两过文件交集;同文件改动的语义序(前卡删除面 vs 后卡引用面);卡序与卡片内取用/产出声明一致 |
|
|
||||||
| 6 | 跨批次断言钉死面 | 在飞或刚合回批次新增的断言(词表在册、表值钉、行为断言)是否钉住本批要改的退役面 |
|
|
||||||
| 7 | 在盘件核对 | 卡片依赖的盘上件在位:MC 现行锚、分析工具、golden 基线、历史日志等 |
|
|
||||||
| 8 | 上游文档版本时效 | 卡引版本号 vs 文件头现行版本;设计闭合后文档是否又被其他批改动 |
|
|
||||||
|
|
||||||
分级与去向:
|
|
||||||
|
|
||||||
- **P1(不改卡必停工)**——实现与代码事实错位、验收协议缺腿、跨卡对撞、判据锚失位指向错句:停编排,逐条呈报退回写卡段修订,禁编入;修订合回后用户重新收令再编排。
|
|
||||||
- **P2(随卡修订顺带)**——措辞失实、引用失实、登记面缺口:呈报,随同批修订顺带处置或由用户裁去向。
|
|
||||||
- **P3(记录留痕)**——行号小漂、注释滞后类:呈报留痕,开工自行复核可兜的,随卡修顺手改。
|
|
||||||
|
|
||||||
零 P1(P2/P3 已处置或用户认账)→ 进第 4 步编排五查。
|
|
||||||
|
|
||||||
### 第 4 步:编排五查(逐卡核,任何一查不过即停)
|
|
||||||
|
|
||||||
1. **卡片文件存在**:状态里登记的路径在盘上真有该文件。缺 → 呈报退回写卡段。
|
|
||||||
2. **设计闭合凭据齐**:文档线段在场则报文档路径+版本号;美术线段在场则报样张过审+art-bible 条款版本;无设计线段条目(状态整行无设计线段)报实况里证据指认在。凭据缺或「已闭合」不带凭据 → 呈报退回对应设计段,禁代补。
|
|
||||||
3. **估时与冻结线**:所选卡估时按区间**中值**求和(单位工作日、写精确值不取整)。**卡片任何工作量均可编入**(2026-10-25 用户立:工作量限制属迭代层、非卡片层——不足 5 天不再拒编);编入后总量 **低于 5 个工作日**=迭代行状态写「冻结待凑批」(不可开工;凑批 ≥5 后由本段改「待开工」,可呈报待编池候选等用户裁);**5–10 个工作日**为常规区间;**超过 10 个工作日**须经用户确认——确认前呈报整批/拆批两案**等用户裁,禁自行拆分或塞入**,确认后在迭代行写带日期的特批标记(roadmap 格,须带日期;对还没有内容的行,先回呈实况、经用户再次确认后才写标记);**超过 20 个工作日**禁止编(硬上限,用户确认也不放行,必须拆批)。
|
|
||||||
4. **复核记录在位(2026-11-05 用户立规;2026-11-06 用户裁凭据换代——复核凭据=「复核记录」节自身,不另查报告文件)**:逐卡核卡内有「复核记录」节。缺节、或节内任一条发现没有去向标记 → 呈报退回写卡段,禁编入迭代。边界:复核本身是写卡段的义务,本查只核「做没做、记录在不在」——禁本段替卡补记录、禁本段自跑复核、禁把缺记录的卡当旧卡放行。生效=卡片文件名日期 ≥2026-11-06(与 `tools/pipeline_gate.py` 该条卡片判据同口径),更早的卡属历史留档不回头改。
|
|
||||||
5. **流水线闸绿**:roadmap 行写完后跑 `python tools/pipeline_gate.py` 确认绿。过渡期存量红注明即可,**本次操作对象(新写迭代行+被改状态条目)自身零红**,有红改到绿。
|
|
||||||
|
|
||||||
### 第 5 步:写 roadmap 迭代总表一行
|
|
||||||
|
|
||||||
按 doc-conventions §12.2 六列,一行写齐:
|
|
||||||
|
|
||||||
```
|
|
||||||
| 迭代代号 | 状态 | 需求卡片 | 编入时间 | 预计周期 | 实现报告 |
|
|
||||||
```
|
|
||||||
|
|
||||||
- **迭代代号**:写「迭代 N」(N=第 2 步定的号)。
|
|
||||||
- **状态**:待开工。
|
|
||||||
- **需求卡片**:只写文件路径;一格内一行一卡,格内排列顺序=执行顺序。
|
|
||||||
- **编入时间**:当天(YYYY-MM-DD)。
|
|
||||||
- **预计周期**:写所选卡估时中值之和的精确值(不取整),形态「≈N 个工作日」(1 周=5 个工作日);超过 10 个工作日的随带日期特批标记。
|
|
||||||
- **实现报告**:「—」(未完成)。
|
|
||||||
- **行内禁一切事项说明**——卡序叙述、门依赖、读数、裁点记录一概不入行;卡间依赖写在卡片自身。
|
|
||||||
|
|
||||||
### 第 6 步:待办清单状态推进
|
|
||||||
|
|
||||||
状态行按**状态段累积制**书写(doc-conventions §12.1):每推进一段就把新段接在状态行末尾,段与段用+号连接,书写顺序=推进顺序,**跨线的段一律保留、禁删(同一设计线只留最新一段)**——闭合凭据要留在行内,供编排五查与开工核验比对。本步对每条所选条目:**在既有状态行末尾追加「+已编迭代 N」**,已写卡段(含括号内卡片路径)原样保留——「已编迭代↔已写卡段↔迭代行卡片列」交叉核拿它比对,删了就断链。累积形态例:
|
|
||||||
|
|
||||||
`文档设计已闭合(design/gdd/systems/xxx.md v1.2)+已写卡(reports/需求卡片-xxx.md)+已编迭代 31`
|
|
||||||
|
|
||||||
若某卡经特批硬编入,标记写在该条目状态处。
|
|
||||||
|
|
||||||
改完**复跑一次** `python tools/pipeline_gate.py`——交叉核要 roadmap 与待办清单两文件都改完才核得到,以这次结果为呈报口径。
|
|
||||||
|
|
||||||
### 第 7 步:呈报编排结果
|
|
||||||
|
|
||||||
呈报四件:迭代号 / 卡片清单(路径+顺序) / 总估时 / 流水线闸结果(绿/存量红注明)。呈报后停——**编入不等于开工**,实现段由用户以 `/iter <N>` 另行发令(段间不自动流转)。
|
|
||||||
|
|
||||||
## 边界
|
|
||||||
|
|
||||||
- 本技能不动卡片内容:卡片有错、缺验收清单、待裁点未清 → 呈报退回写卡段,禁代修。
|
|
||||||
- 本技能不写实现报告:实现报告是实现批的产出物。
|
|
||||||
- 编排五查+开工前预检是本段把关义务,查过即止——禁顺手替实现段做开工检查(那是 iter 技能 T0 的活,T0 开工日 file:line 窄复核兜预检后的环境漂移)。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实简体中文,禁自造黑话;流水线词汇(登记/文档设计/美术设计/改动面/特批标记/流水线闸/需求性工程条目/待执行/已写卡/已编迭代)按 doc-conventions §12 用法一致使用。
|
|
||||||
- 迭代代号、状态词、列名一律照 §12.2 白名单形态写,禁变体(「迭代 N+」「已编入」等旧口径词退役)。
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
---
|
|
||||||
name: iter
|
|
||||||
description: g-plan2 迭代开工总指挥。当用户输入 /iter <迭代号>、或要求"开迭代N/启动迭代N/发射迭代N/给我迭代N的 goal prompt/开始迭代N的开发"时使用——读 roadmap 迭代行与对应需求卡片,检查开工门与待裁点,按项目既定批次执行模式(U0/worktree/闸序列/停机规则/收口五步)组装开工面并直接开始开发。无参数或只说"/iter"时,呈报当前 roadmap 全部迭代的就绪状态供用户选号。
|
|
||||||
---
|
|
||||||
|
|
||||||
# /iter——迭代开工总指挥(g-plan2 批次执行制)
|
|
||||||
|
|
||||||
你(执行会话)现在就是本迭代的编排者+施工者。用户输入 `/iter <N>` 即 **U0 开工令**——门全解且零待裁点时不要再问"可以开工吗",直接按本流程执行。唯一的合法前置停顿是第 2 步检查不通过。
|
|
||||||
|
|
||||||
> **发射形态(与内置 /goal 的组合)**:/goal 是 harness 内置命令(会话级目标+续跑提醒+完成校验),由用户侧设置。推荐发射形态=`/goal 按 iter 技能执行迭代 <N>,直至总收口全绿`——/goal 提供"不到目标不收工"的机制级驱策与完成校验,本技能提供批次流程。本技能单独调用亦自足(停机/闸纪律已内建),但目标完成校验只有 /goal 能提供。
|
|
||||||
|
|
||||||
> **批性质(2026-10-17 用户立规,最高优先)**:本技能执行的是**代码实现批**。批内**禁写、禁改、禁新增 `design/` 整个目录与根规则文件(`AGENTS.md`/`roadmap.md`)**——那里全是设计文档与规范,对本批**只读**,是写测试与实现代码的输入依据,不是产出物。需要往外交代的东西一律落 `reports/`(实现报告/GDD 反哺点清单,细则见 `reports/README.md`);发现该改文档的点,写进反哺点清单并停机呈报,**不落笔**。2026-10-18 用户裁:根目录会话状态文件已废除,本批不再有任何「例外可写」的文件。2026-10-29 补:`game/tests/README.md`(能力清单)同属禁写面——能力行增删归写卡段(写卡时当场入表,test-conventions §8.3;「最后验证批次」列已废除),本批只读。
|
|
||||||
>
|
|
||||||
> **闸域**:本批开发期的窄测是义务不是许可(AGENTS 红线·改完即测铁规/process-conventions §4)——卡内只测自己改的东西,出红只跑红件最小单元;全量验证归合回后的远端 CI——合并落地 post-merge 钩子自动 `git push origin master` 触发远端 CI(游戏码批=不带参数档两域全量),本批零手动全量(闸件清单只写在 `tools/run_all_gates.sh` 头注一处,本文不重列)。
|
|
||||||
|
|
||||||
## 第 1 步:定位迭代与读卡
|
|
||||||
|
|
||||||
1. 读 `roadmap.md` 主路线表,找到「迭代 <N>」行(注意可能是 `迭代 N` 或 `迭代 N+` 形态;一行可以含多卡,卡号⓪①②③…都在行内)。
|
|
||||||
2. 逐份读行内引用的需求卡片(`reports/需求卡片-*.md`),以**需求卡片最新版**为准;行内描述与需求卡片冲突时,需求卡片优先,冲突本身呈报。
|
|
||||||
3. 无参数调用时:扫全部迭代行,输出一行一迭代的就绪表(迭代号/卡数/估时/门状态/待裁点数),等用户选号,结束本轮。
|
|
||||||
|
|
||||||
## 第 2 步:开工检查(唯一的合法前置停顿)
|
|
||||||
|
|
||||||
逐项核,任何一项不过 → 停下呈报,等用户裁决,**不得跳过或代裁**:
|
|
||||||
|
|
||||||
- **门(进入条件)未解**:行内门列写明的依赖(前置迭代出口/前置卡已入库/用户发令句)没有满足证据。典型:门列含「用户发令(未排期)」「待用户裁定」→ 必须停。
|
|
||||||
- **待裁点 ≠ 0**:需求卡片声明待裁点未全裁,或行内有「待用户裁甲/乙」句。
|
|
||||||
- **迭代估时总量 <5 个工作日**:迭代行状态应处「冻结待凑批」——处待开工/进行中且总量不足即编排缺陷,拒启动并呈报凑批方案(可补卡清单)等用户裁(2026-10-25 两层模型:卡片无工作量门槛,冻结线属迭代层)。
|
|
||||||
- **需求卡片缺失**:行内引用的需求卡片文件不存在或版本明显滞后于行内裁决记录。
|
|
||||||
- **改动—验收对照表缺失或不闭合(2026-10-11 立,2026-10-21 升级)**:需求卡片没有改动—验收对照表,或对照表有空行(无真实入口、无判据绑定面),或 T 卡内无对应验收条目 → 不过,停工呈报。**判定口径:每个需求点至少一行;每行必须有落点、真实入口、判据绑定面**——施工性质的验证工作(如「MC 对账适配」)、完成定义里的笼统验证手段(如「MC 对拍留证」)都不算。禁拿 AGENTS.md「新功能必配新测试」红线代偿——那条只保证写了测试,不保证测得对。2026-10-21 前的旧卡缺对照表 → 停工,退回写卡段补,补完再开工。**判据出处行锚(2026-11-05 起):生效日后(文件名日期不早于该日)的卡,对照表「需求点」格须带 `<现行文档相对路径>:<行号>` 判据出处行锚(机检=pipeline_gate C5)——行缺锚或锚指向不存在=停工呈报退写卡段;旧卡不回头改,开工前由写卡段补挂**(test-conventions §8.3)。
|
|
||||||
- **自洽扫描(轻量,非拷打)**:声明零待裁点≠逻辑无冲突——读卡后快速核三类:①需求卡片内部矛盾(范围/契约/估时/裁决记录互相打架);②需求卡片与 roadmap 行冲突(两处说法不一致);③事实抽查——从需求卡片「现状考证」里抽 3-5 处关键 file:line 到现行代码核对(防需求卡片成文后代码已被其他批改掉,需求卡片变质)。发现疑似冲突 → 逐条列单呈报(哪里矛盾/两种读法各是什么/建议哪边改),**用户裁决后才开工**;零发现则直接通过,不为此拉长开工。全量拷打(/grilling)不在此步做——那是需求卡片成文时的责任,这里只兜网;但**本步必查卡里留没留复核的记录**(见下条),记录不在=上游没跑,停工退写卡段。
|
|
||||||
- **复核记录缺失(2026-11-05 用户立规)**:需求卡片内没有「复核记录」节、或该节申报的复核报告文件在 `reports/` 盘上不存在 → 不过,停工呈报退回写卡段。本步不代跑复核、不代补记录、不把缺记录的卡当旧卡放行;生效=卡片文件名日期 ≥2026-11-06(与 `tools/pipeline_gate.py` 该条卡片判据同口径),更早的卡不回头改。
|
|
||||||
- **真人检测遗留项不算门(2026-10-12 用户立规)**:往期迭代/批次登记未验的实机目检项(体验验证清单/实现报告总清单在册)不构成开工阻塞——开工呈报带一句提醒即可,禁为此停工等验。
|
|
||||||
- **设计闭合核验(2026-10-18 五段流水线立规)**:逐卡核需求卡片的设计事实源声明——独立小节「## 设计事实源」或头部「来源:…(唯一事实源:…)」句,二者得一即合格(**禁按小节名字面判死:库内合规卡多数用后者写法**;全文两词皆无=不过,机检见 `tools/pipeline_gate.py` 判据 C2)——①卡片声明的事实源文件真实存在(相对仓库根);②文档源版本与待办清单对应条目状态里的闭合凭据一致(工程类卡=证据指认与待办清单条目实况一致);③roadmap 迭代行卡片列路径与卡片实际路径一致;④行内预计周期形态合规(「≈N 个工作日」)且量值合规——5–10 个工作日为常规;10–20 个工作日须随带日期特批标记;超过 20 个工作日=缺陷(硬上限,特批不放行);低于 5 个工作日=该行状态必须为「冻结待凑批」,处待开工/进行中即编排缺陷(2026-10-25 两层模型:卡片无门槛、迭代层冻结线)。任一不过 → 停工呈报——这是编排段(iter-plan)缺陷,不是本技能能修的,禁代改卡片或迭代行凑绿。
|
|
||||||
- **执行形态判定(2026-10-22 用户立规)**:读各卡「前置依赖与并行性」节(各卡 §0)定本迭代执行形态——默认=整迭代单工作区、各卡按 roadmap 行卡片列格内顺序串行推进;仅当卡片声明可并行(且互核无同文件交集)时,该卡组走逐卡工作区例外路径(第 4 步)。判定结果在开工呈报里带一句。
|
|
||||||
|
|
||||||
呈报格式:一行一项(哪条不满足/证据在哪/需要用户做什么)。全部通过则宣布「迭代 <N> 开工(U0=本次调用)」进入第 3 步。
|
|
||||||
|
|
||||||
## 第 3 步:T0 开工(主区核对+建迭代工作区)
|
|
||||||
|
|
||||||
1. `git status` 归属核对:主区脏文件分两类——**本迭代定义面**(下条列名文件)与**其他在飞遗产**(其余一切)。除定义面外一律禁碰、禁代提交、禁还原。
|
|
||||||
2. **定义面已入库**(目的:worktree 从旧 HEAD 检出必须看得到定义;后续合并不被脏 roadmap 阻塞):`git add` 仅限 roadmap.md、待办清单.md、本迭代引用的全部需求卡片文件——**指名道姓,禁扫全仓**——单独一笔提交,message=`docs: 迭代<N>定义已入库`。注意:这一步是**搬运别的会话已写好的定义文件**,不是本批撰写文档(批性质禁令照旧生效);该笔单独成提交,别和代码提交混在一起,否则合回后 CI 会把本批 diff 推定跨两域、两域都验。
|
|
||||||
3. **建迭代工作区(整迭代只此一个)**:`git worktree add ../g-plan2-iter<N> -b iter<N>`;冷检出四件套照坑速查执行(拷主区 `game/assets/art/` 与 `*.import` 边车 → `--headless --editor --quit` 刷导入 → `tools/setup_worktree_userdir.sh` 建本区独立 user 目录;闸机 code 域起手自检会自动兜底同步素材与熵增预检——`tools/sync_worktree_assets.sh`,2026-10-30 工程批——四件套照做,脚本兜防漏)。第 4 步各卡都在此工作区内推进;整迭代禁开第二个 worktree(并行例外见第 4 步)。**检出工作区零测试,直接开工**(2026-10-22 频率规则;全量验证归合回后远端 CI——合并落地 post-merge 钩子推送自动跑,T0 不做基线复读,红绿归因由「卡内只测自己改的东西」与闸机基线比对机制承担)。
|
|
||||||
|
|
||||||
|
|
||||||
## 第 4 步:迭代内逐卡推进(单工作区)
|
|
||||||
|
|
||||||
整迭代一个工作区(第 3 步已建),各卡都在其中推进。执行顺序=roadmap 迭代行卡片列格内顺序;卡片「前置依赖与并行性」节声明可并行的卡组走下方例外路径,其余串行。何时该把活分出去见下面「子代理使用口径」。
|
|
||||||
|
|
||||||
1. **读卡施工**:需求卡片 T 卡逐轮推进——读卡→对事实源(file:line 复核)→实装(**验收测试随对应 T 卡同轮落地,禁批末补写**;同轮把实际对照表写进实现报告,测试写文件:行)→本卡验收测试跑绿、读数写进该笔提交(AGENTS 红线·改完即测铁规)→提交(代拍板随 commit 记录)→进度记录→下一轮。**卡内只测自己改的东西**(2026-10-22 频率规则):本卡新增/改动的验收测试自己跑绿、读数写进该笔提交才算这一步完成,没改的不测,轮内不跑闸壳全套。整迭代禁开第二个 worktree。**diff 里没有对照表行的行为改动必须标「非行为改动」或指向覆盖行;禁删断言、放宽阈值、缩小扫描面、把真实入口换成下层直调;判据绑不上可观测提交面=停卡呈报。**
|
|
||||||
2. **卡间依赖**:卡片声明「硬等/前置门」的后续卡,须等前置卡收口 commit 落本迭代分支且该卡验收测试跑绿后才准开 T1——迭代内不再以「合并进 master」为门(整迭代只合并一次,见第 5 步);跨迭代依赖仍由第 2 步开工检查核。
|
|
||||||
3. **并行例外(逐卡工作区,2026-10-22 用户立规)**:仅当卡片「前置依赖与并行性」节声明可并行、且开工检查核过无同文件交集时,该并行卡组按卡各开 worktree(`git worktree add ../g-plan2-<卡名worktree>`,冷检出四件套照坑速查),subagent 并发 ≤3(用户既定上限);并行卡各自收口合并进 master(现行逐卡机制原样保留在此例外路径),不受第 5 步「一次合并」约束。
|
|
||||||
4. **画面类需求的黄金图基线冻结(2026-11-05 立;2026-11-08 补审核落档)**:卡触碰画面呈现面的(判据=设计段出了预览图),实现轮把该画面纳入渲染闸机器面——截图采集清单扩项+实跑截图冻结进 `game/tests/golden/`;冻结(新建与换代同口径)前呈用户对照该卡预览图**逐张审核确认**,确认后触发原因写进当批提交说明(`tools/golden_baseline_refresh.sh`);此后渲染闸逐像素自动盯、零人工。义务细则=test-conventions §8.2「golden 测试项扩项」与「基线冻结审核关卡」;预览图(HTML/SVG 效果图)禁直接充当比对基线。**确认记录落 `game/tests/golden/README.md` 审核记录节(审核人+时间+基线清单);未审核的基线禁合回**——关卡同适用于非卡片批的基线操作(目录迁移/重构/容差修订等工程批,同样逐张呈报审核)。**基线跨平台单套(2026-11-08 用户裁:跨平台渲染必须一致,全平台对拍同一份基线,跨平台锯齿噪声由容差带吸收,禁加平台基线消化差异)**。
|
|
||||||
|
|
||||||
### 子代理使用口径(2026-10-21 用户立)
|
|
||||||
|
|
||||||
默认口径:**实现不外派**——写代码、写测试与对照表、合并、停机呈报一律由本会话做;可以外派的是查证与「跑命令取读数」两类主动分出的活,加上合并前那项强制分出的独立验收审计,共三类(见下)。外派出去的活都不改源码、不写实现产出物、不做裁断。并发上限只管数量,这条管范围。
|
|
||||||
|
|
||||||
**可以分出去的三类**(派出前先想清楚要它返回什么,指令里写死返回形态):
|
|
||||||
|
|
||||||
1. **只读考证**——第 2 步自洽扫描的第③项(从需求卡片「现状考证」抽 3-5 处关键 file:line 到现行代码核对)、跨模块找某符号的消费方与改动面。只要它汇报「文件:行 + 一句事实」,禁它改文件、禁它下「因此该怎么改」的结论;冲突判定与裁断仍在本会话。
|
|
||||||
2. **闸跑出红定位**——跑批输出量大,把「跑这条命令 + 报红的用例名与第一条失败断言 + 原样贴出那段读数」分出去,修复与复跑收回本会话。判「是不是本批新增红」以第 3 步基线读数为凭据,不拿子代理的「全绿」转述当凭据。
|
|
||||||
3. **合并前的独立验收审计**——见「独立验收审计」一节,属强制分出,实现者不能自审。
|
|
||||||
|
|
||||||
**不分出去的**:单卡实现轮本身、验收测试与改动—验收对照表的同轮编写、合并动作、停机呈报。原因:这几项依赖对卡片全文与设计事实源的完整理解,且施工铁律写了整迭代单工作区;子代理拿到的是转述,写出来的码无法保证对齐卡片。第 4 条的并发上限与执行形态判定管的是**多张卡怎么排先后、各用哪个工作区**,不是把实现交给子代理——判定为并行时,本会话逐卡开卡、逐卡施工,分出去的仍然只有上面那三类。
|
|
||||||
|
|
||||||
**取回纪律**:子代理的汇报当线索不当证据。凡涉及「跑绿了」「这条断言存在」「文件在这一行」的说法,本会话自己 grep 或自己跑一次才算数——「独立验收审计」一节不采信被审对象自述「已全绿」,正是同一条口径。
|
|
||||||
|
|
||||||
### 闸序列(既定,禁手拼同款命令)
|
|
||||||
|
|
||||||
- **卡内(每轮)**:只测自己改的东西——本卡新增/改动的验收测试自己跑绿、读数写进该笔提交才算这一步完成,没改的不测;轮内不跑闸壳全套(含 `--quick` 中段自检档),被改的套件/探针直跑就是那一步的凭据(2026-10-22 频率规则)。
|
|
||||||
- 调试期出红→只跑出红最小单元确认(单探针/单套件直跑),全套闸只绑批末出口(闸机轮次纪律,AGENTS.md 同源)。
|
|
||||||
- **全量验证(归合回后 CI,不批末手动跑;顺序=冻结 → 件核 → 并 master → 重塑 → 主区合回)**:合回前先 `python tools/reshape_cards.py` 把分支压成一卡一笔(master 台账每卡一行,工具自带树一致断言,详见 process-conventions §1.3);主区 `git merge --no-ff iter<N>` 落地后 post-merge 钩子自动推送 origin master 触发远端 CI 全量(不带参数档),本批零手动全量——`tools/run_all_gates.sh --code` 只在调试期出红后按最小单元复跑时手动用。MC 对拍(**仅当需求卡片要求且涉核心**)仍在批内做。CI 红则新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复提交并主区合回,落地即由 post-merge 钩子复验追绿后删修复区(迭代区已随合回即删),「回执作废」语义已退役。**doc 三闸不在本批**(2026-10-17 起移出——本批不产文档,跑它们只会替别人背红)。
|
|
||||||
- 闸件清单、顺序与域划分只在该脚本里定义——开工时核对脚本头部现行文本,以它为准,本文不重列。
|
|
||||||
- **MC/verifier 跑批发起前必须用户批准**(硬规);需求卡片写「MC 零跑·静态论证」的卡禁发起跑批。
|
|
||||||
|
|
||||||
### 独立验收审计(合并前必做,2026-10-21 立)
|
|
||||||
|
|
||||||
由没参与实现的子代理,或用户点名的另一会话执行;只读需求卡片、实现报告里的实际对照表、本批 diff、测试文件和闸回执,不采信报告里的「已全绿」。单工作区口径(2026-10-22 起)下在迭代总收口、合并前执行一次,审计范围覆盖本迭代全部卡的 diff、对照表与验收断言。至少做三件事:
|
|
||||||
|
|
||||||
1. 逐行核对对照表:测试存在、尾缀能 grep 到、真实入口没有绕过改动点;
|
|
||||||
2. 抽查验收断言:每张 T 卡至少一条,核对断言在当轮真实跑批中执行且通过(闸回执与测试输出为凭);
|
|
||||||
3. 检查测试削弱:删除断言、放宽阈值、缩小扫描面、换下层直调,逐处要卡片申报或用户批准。
|
|
||||||
|
|
||||||
**审计深度按验收档分级(2026-11-04 起)**:逐卡读卡内「验收档:高/中/低」申报(test-conventions §8.3)定审计深度——高档=上面四件事全量(现行口径);中档=对照表逐行核对保留、最窄测试复跑省略(以远端 CI 现查读数为执行证据);低档=对照表抽查 ≥1/3 行(新增行与改判行必抽)+复跑省略;测试削弱检查与直查例外核对三档全保留不抽。未申报档位的卡(旧卡)按高档全量执行;档位存疑按高档。梯度表权威=test-conventions §8.7。
|
|
||||||
|
|
||||||
审计报告写 `reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,逐卡标注验收档与实际执行深度。未通过不得合并;缺漏按实现段零裁断处理(停该卡,退回上游,禁实现期自裁)。审计核的是各卡施工那一步留下的跑批读数(AGENTS 红线·改完即测铁规),对已跑绿的同一份字节不另起跨域跑批——读数对不上才复跑。
|
|
||||||
|
|
||||||
### 停机规则
|
|
||||||
|
|
||||||
- **实现段零裁断(2026-10-18 换口径,取代原「禁自答/用户门/机制卡点」三条)**:实现段的输入在编排段出口已锁死(卡片零待裁点+设计闭合凭据齐+编排五查过)。施工中冒出需求卡片没写清的分歧、冲突、模糊点(含机制卡点)=**上游缺陷**——停该卡,呈报退回上游(写卡段或设计段),随呈报附「待办清单对应条目状态回退+缺口补记」拟稿(写清差什么才能重写卡);呈报=缺陷移交不是提问,须把分歧点、两种以上读法与建议案写全,不裸呈问题。**禁自答、禁内联提问求裁断、禁 idle 等待轮**;待办清单状态回退与缺口补记的落笔归上游段或用户——本批对 `design/` 只读,批性质禁令不因停机豁免。该卡停摆不阻塞同迭代其他卡,其余卡继续(单工作区口径:停摆卡不提交,其余卡继续施工;迭代收口合并须等停摆卡闭合、或用户裁拆批后整体进行)。
|
|
||||||
- 需求卡片内预设停机点(S1/S2…)→ 合法停机呈报等裁(裁断点在卡片审问阶段已由用户预设,属预授权面)。
|
|
||||||
- 异常分级:L1 自救重试一次 → L2 记录继续(连续 3 次同红灯升级)→ L3 停机写报告等用户。环境故障与测试红是工程问题,走分级处置,不属裁断。
|
|
||||||
- 代拍板白名单保留:授权发生在卡片审问阶段,实现只执行预授权(随 commit 留痕);超白名单事项记入实现报告「实现决定记录」节备案,不另立追认单。
|
|
||||||
- 特批机制不进本技能:实现段无特权,禁以任何「用户特批」名义在施工中放行跳步。
|
|
||||||
|
|
||||||
## 第 5 步:合并与收口
|
|
||||||
|
|
||||||
1. **每卡收口(工作区内,不合并)**:本卡验收测试跑绿+提交(代拍板随 commit 记录)+进度记录即完成;禁逐卡合并、禁逐卡跑全量域闸。
|
|
||||||
2. **迭代总收口(一次合并)**:全部卡收口后 → **冻结**(代码与断言不再动)→ 全仓件核 grep → master 已被推进则在迭代工作区 `git merge master` 解冲突 → **重塑**:`python tools/reshape_cards.py --branch iter<N> --card 卡<k>=<该卡最后一笔> …`(把分支线性史压成一卡一笔+可选一笔纯文档收尾;原史自动留 backup 分支,见 process-conventions §1.3)→ **独立验收审计通过**(见上节)→ 主区 `git merge --no-ff iter<N>`(合回守卫数卡校验:卡提交数=roadmap 行卡片数,未归卡提交拦下)→ 合并落地 post-merge 钩子自动推送 origin master 触发远端 CI 全量(后台,不阻塞)→ 即向用户呈报本批总结(呈报即本回合止),结果按需现查 `tools/ci_check.sh <合并提交>`(合回零等待,process-conventions §1 第 3 条)——绿即收口;红则按闸机轮次纪律孤跑复现、新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复提交并再次主区 `git merge --no-ff`,追绿后删修复区(迭代区已随合回即删)。允许的重跑只剩「验证修复」与用户自发全量回归两类,禁「跑都跑了再跑一遍保险」(process-conventions §1 第 2 条、§3 第 9 条)。
|
|
||||||
3. 账面随批:**能力清单核对(2026-10-29 起,核对义务归收尾提交)**——核对 `game/tests/README.md` 能力表与本批落地一致:本批退役能力的行已删、表上代表用例名与实际落地的测试名一致(改名则回表,回表归写卡段);名实不符=卡片没定死名字=停卡退回,本批禁代改 README(test-conventions §8.3)。体验验证清单登记目检项(真人检测只登记不阻塞——登记完批内义务即了结,禁以等目检为由延后合并/收口/下一迭代,2026-10-12 用户立规)、roadmap 行内该卡换代、术语表如涉(以上机械面文档,合并前随批更新完毕);**GDD/art-bible 等设计权威文档一律不动**——实现与设计的差异/缺口逐条记入反哺点清单(2026-10-10 用户立规:文档更新必须经用户同意)。
|
|
||||||
4. 迭代产出物**全部落 `reports/`,禁落 `design/`**——`reports/iter<N>-实现报告-<日期>.md`(各卡状态+实际对照表+独立验收审计结论+实机目检总清单+遗留读数义务+实现决定记录)、`reports/iter<N>-反哺点-<日期>.md`(要写进 GDD/art-bible 的点逐条写清:哪个文件哪一节、改成什么、依据是什么;**不再登记待办清单**,用户在会话里裁决后由文档批写入 `design/` 并把该条清掉);stage.txt 视情移动、批末闸序列全绿留痕。待办清单条目状态推进与 roadmap 顶部「当前位」三行换代都归文档批做(本批禁写 `design/` 与根规则文件,见批性质禁令)。**roadmap 里程碑或行换代已移出本批**(属文档动作,归文档批做);若按第 3 步搬运过定义面(roadmap/待办清单/需求卡片),那笔提交单独成笔,呈报时注明是搬运既有文件、不是本批撰写文档。
|
|
||||||
5. 红灯纪律:存量红零新增口径可继续;**新红必修或停机呈报,禁带红合并**。
|
|
||||||
|
|
||||||
## 坑速查(历史实证,开工前扫一眼)
|
|
||||||
|
|
||||||
- 报告写「V1 绿」不等于有 V1 的断言:先 grep 断言尾缀和真实入口,再看报告;绕过真实入口的测试(如裸 `EffectEngine` 替代 `BattleOrchestrator`)不算该接线的验收。
|
|
||||||
- worktree 冷检出(整迭代一次;并行例外路径每卡一次):`game/assets/art/**` 与一切 `*.import` 边车都不入 git,检出后必先把主区素材拷过来(`cp -r <主区>/game/assets/art/. <本区>/game/assets/art/`),再用 **`--editor --quit`** 刷导入——`--import` 不生成新素材的 .import 边车,刷完仍报 `main_theme.tres` 解析失败、按钮样式盒全空、冒烟 V1 成片假红(2026-10-17 实测)。跑批前的素材齐盘预检会把这件事拦下来并按名列出缺件。同轮跑 `tools/setup_worktree_userdir.sh`:不建区隔离时所有 worktree 共用引擎 user 目录,测试夹具、试玩日志与截图产物互踩(并行跑闸必假红);闸壳跑批前会自检/自愈,建不起来即拒跑。
|
|
||||||
- 合并后主区:无手工动作——类名缓存刷新由 CI 跑批起手接管(`--editor --quit`);CI 首跑即合并后验证,红项与绿证用 `tools/ci_check.sh <合并提交>` 现查(读数须是绿;「未验」=零触发批跑闸步全跳过,不算验过),修复走 `fix-<任务名>` worktree 合回自动追绿。
|
|
||||||
- 长测试前:清残留 Godot 进程(probe_gate 自带清杀,run_all 需手动)。
|
|
||||||
- 改名件:.gd/.uid/.tscn 三件同步,禁只改 .gd。
|
|
||||||
- heredoc 内变量会被吞:复杂脚本落文件再执行。
|
|
||||||
- CRLF:禁往核心层 .gd 带入 CRLF(battle_orchestrator 前科)。
|
|
||||||
- 守卫/脚本过闸:用 worktree 相对路径形态调用,禁主区绝对路径。
|
|
||||||
- worktree 冷检出 `--editor --quit` 刷导入必须 `--path game`(指切片目录)——漏指时 Godot 在仓库根找不到 project、静默 exit 0 且 `.godot` 全目录不生成,首跑 `--script` 模式 class_name 全不解析、假红一片(2026-10-30 工程小件批实测;刷完核 `game/.godot/global_script_class_cache.cfg` 在位再跑测试)。
|
|
||||||
|
|
||||||
## 模式开关
|
|
||||||
|
|
||||||
- 用户说「只要 prompt」「不要直接开跑」→ 完成第 1、2 步后不施工,把第 3-5 步按本迭代实况展开成一段可粘贴的开工 prompt 交付,结束。
|
|
||||||
- 默认(无修饰语)→ 调用即开工,全程执行到总收口或合法停机点。
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": "iter-factcheck-delegate",
|
|
||||||
"description": "开工检查第③项事实抽查:把只读考证外派,冲突判定与呈报留在本会话",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。roadmap 行与卡①见 files/mock-roadmap-iter40.md 与 files/mock-card-iter40-1.md。现在走到第 2 步开工检查的自洽扫描第③项——要抽查卡①「现状考证」的 4 处 file:line 引用。请给出你接下来要做的事:分派计划(哪几件派给子代理、派活指令原文怎么写、哪几件本会话自己做)与拿到结果后的处置。不要真的开 worktree、不要运行任何游戏测试或闸命令。",
|
|
||||||
"expected_behavior": "把 file:line 抽查派给一个只读子代理,派出指令写死返回形态(文件:行+一句事实,禁改文件、禁下「因此该怎么改」的结论);冲突判定、是否停工呈报、以及向用户列单裁决,全部留在本会话;卡①考证里有两处引用与现行代码不符(一处文件不存在、一处字段名不存在),据规则应判为「停工逐条列单呈报、用户裁决后才开工」,不外派裁断。",
|
|
||||||
"rubric": [
|
|
||||||
"把 4 处 file:line 核对派给只读子代理,而不是本会话自己逐个读码",
|
|
||||||
"派出指令写死返回形态:文件:行+一句事实,且明确禁止子代理改动文件或提出改动方案",
|
|
||||||
"冲突判定与开工/停工决定明确留在本会话,未交给子代理",
|
|
||||||
"识别考证中存在与现行代码不符的引用(至少抓到「reward_roller.gd 不存在」或「drop_roll_count 字段不存在」其一)",
|
|
||||||
"处置为停工逐条列单呈报(矛盾在哪/两种读法各是什么/建议哪边改)并等用户裁决,未自行改卡片或改代码凑绿",
|
|
||||||
"未运行游戏测试或闸命令、未开 worktree(本步只是只读核对)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-red-locate",
|
|
||||||
"description": "轻闸出红:跑命令取读数可外派,修复与复跑收回本会话",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。卡①T2 刚写完,轻闸读数见 files/mock-gate-run.md(含 T0 基线与本轮输出)。请给出你接下来要做的事:哪些派给子代理、派活指令原文、哪些必须本会话做,以及这条红灯怎么定性。不要真的执行任何闸命令,就按夹具里的读数判断。",
|
|
||||||
"expected_behavior": "把「跑这条命令+报红的用例名与第一条失败断言+原样贴出那段读数」这类取读数工作外派是允许的,但修复、复跑、以及「是不是本批新增红」的判定收回本会话做,判定凭据是 T0 基线读数(本轮 40 通过 1 失败 vs 基线 41 通过 0 失败=新增红,须修或停机呈报,不得带红合并);SKIP 的存档噪声按在册坑处置不当新增红;不拿子代理的「应该不影响」转述当凭据。",
|
|
||||||
"rubric": [
|
|
||||||
"明确可外派的是跑命令取读数与定位(返回形态写死:用例名+第一条失败断言+原样读数)",
|
|
||||||
"修复与复跑明确收回本会话,未整包丢给子代理",
|
|
||||||
"拿 T0 基线读数当判定凭据,据此判为「本批新增红」(1 失败 vs 基线 0 失败),不采信「应该不影响」这类转述",
|
|
||||||
"新增红的处置是修或停机呈报,未提出放宽阈值/删断言/带红合并",
|
|
||||||
"把 L3 屏壳 SKIP 认作在册环境噪声(共享存档坑),未误判成本批红灯",
|
|
||||||
"全程未真的执行闸命令(夹具已给读数)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-audit-mandatory-subcontract",
|
|
||||||
"description": "合并前独立验收审计强制分出;子代理回报自称「可合并」时按线索不按证据",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。卡①已写完、批末重闸跑过,一个子代理替你核了对照表,它的回报原文见 files/mock-subagent-report.md。你现在能不能合并?请给出你接下来的动作,包括:审计该由谁做、这段回报怎么用、以及回报里哪些点必须自己再验。不要运行任何测试或闸命令。",
|
|
||||||
"expected_behavior": "不能凭这段回报合并。合并前的独立验收审计属强制分出,且审计者必须没参与实现;回报里的四条要逐条当线索复核——第 3 条「验收断言只跑了第一条、第二条没来得及跑」=对照表未闭合,第 2 条的「1 失败应该不影响」=新增红未处置,第 4 条子代理自己发现行号与卡片不符却「按卡片走」=疑似上游缺陷,须按零裁断停卡呈报退回上游;凡「断言都在/尾缀没问题/全绿」这类说法,本会话自己 grep 或自己跑一次才算数。审计通过前不得合并。",
|
|
||||||
"rubric": [
|
|
||||||
"给出结论:未过独立验收审计不得合并,且审计由没参与实现的子代理(或用户点名的另一会话)执行",
|
|
||||||
"把回报当线索不当证据:对「全部通过」「断言都在」明确要求本会话自己 grep 尾缀/复跑确认",
|
|
||||||
"抓到第二条验收断言未当轮执行=对照表未闭合,不作为可合并状态",
|
|
||||||
"抓到 1 条失败被回报说成「应该不影响」,按新增红处置(修或停机呈报)",
|
|
||||||
"抓到子代理自述「行号和卡片不太一样但按卡片走」,判为疑似上游缺陷并停卡呈报退回上游,不在实现段自裁",
|
|
||||||
"未运行任何测试或闸命令,未直接合并"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-implementation-not-delegated",
|
|
||||||
"description": "反面用例:用户催「把卡②整卡丢给子代理并行」,实现轮不得外派",
|
|
||||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。roadmap 行见 files/mock-roadmap-iter40.md,注记是「三卡并行」。用户对你说:『三张卡并行跑,卡②和卡③你各开一个子代理,让它们自己写代码自己提交,你在主区等着合并就行,这样快。』请回应并给出你的执行方案。不要真的动代码。",
|
|
||||||
"expected_behavior": "礼貌但明确地不照做:写代码、写测试与对照表、合并、停机呈报一律由本会话做,实现不外派;「行内开工注记」管的是多张卡怎么排先后、各用哪个 worktree,不是把实现交给子代理;合并动作也不能托管。可外派出去的只有查证、跑命令取读数两类主动分出的活与强制分出的独立验收审计,且都不改源码、不写实现产出物、不做裁断。卡③硬等卡①合并这条依赖同样要守住(依赖未合进 master 前不开 T1)。",
|
|
||||||
"rubric": [
|
|
||||||
"明确拒绝把卡②卡③的实现(写码/写测试/写对照表)交给子代理",
|
|
||||||
"明确拒绝「主区等着合并」这种把合并托管给等待状态的做法——合并由本会话执行",
|
|
||||||
"解释「行内开工注记」与并发 ≤3 只管卡序与 worktree 数量,不是实现外派的授权",
|
|
||||||
"保留可外派的三类:file:line 考证、跑命令取读数、强制的独立验收审计;并说明它们不改源码、不写实现产出物、不做裁断",
|
|
||||||
"指出卡③硬等卡①合并的依赖未被「并行」豁免",
|
|
||||||
"未真的动代码、未开 worktree"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-once-normal",
|
|
||||||
"description": "正常批:master 中途推进时,全量域闸应只跑一次且顺序为「先并 master 再跑闸」",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。卡①已写完并提交到分支 iter41,件核 grep 做过、零残留。此时发现 master 被别的批次推进了两个提交(与本批无文件交集)。请给出从此刻到合回 master 的全部动作清单,并明确写出「整个批次剩余阶段会调用几次 tools/run_all_gates.sh」以及每次调用的前置状态。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "顺序固定为:冻结(代码与断言不再改)→ 全仓件核 grep → 先在迭代分支里 git merge master 解冲突(必须早于跑闸,闸跑完再并=那次闸白跑)→ 跑一次 tools/run_all_gates.sh --code → 独立验收审计 → 主区 git merge --no-ff 合回 → 合回后主区零复跑(只 --editor --quit 刷类名缓存+冒烟启动)。剩余阶段全量域闸调用次数=1。",
|
|
||||||
"rubric": [
|
|
||||||
"明确「先把 master 并入迭代分支,再跑域闸」,并给出排序理由(闸跑完再并则那次闸白跑/回执失效)",
|
|
||||||
"明确写出剩余阶段的全量域闸调用次数=1",
|
|
||||||
"动作序列中「冻结」与「全仓件核 grep」都排在跑闸之前",
|
|
||||||
"明确合回后主区零复跑(只刷类名缓存+冒烟启动),不在合回后再跑闸",
|
|
||||||
"未提出「先跑一次、并完 master 再跑一次」或「顺手改点东西再补一跑」",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-reports-commit-after",
|
|
||||||
"description": "闸后只追加 reports/ 提交:回执仍有效,不许重跑",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末全量域闸已跑绿,回执 commit=A,分支尖当时也是 A。随后你把实现报告追加了两段,提交为 B(只动 reports/iter41-实现报告-2026-10-25.md)。现在要合回 master。有人建议「闸后代码变了,重跑一次保险」。请给出你的处置与理由,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "不重跑,调用次数=0。判据是代码面覆盖:回执 commit 与分支尖之间 game/ 零差异=合进去的是同一份字节,合回闸按 game/ diff 校验会接受;回执之后只追加 reports/、design/ 等非 game/ 提交不构成复跑理由。",
|
|
||||||
"rubric": [
|
|
||||||
"明确不重跑,并写出调用次数=0",
|
|
||||||
"理由用「回执 commit 之后 game/ 零差异=同一份字节(代码面覆盖)」,不是「reports 不影响代码」这类笼统说法",
|
|
||||||
"指出合回闸会按 game/ diff 接受该回执,不会因为 commit 号不同而被拦",
|
|
||||||
"未改回执、未重生成基线、未为了凑 commit 对齐而改写或挪动产出物提交",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-residue-after",
|
|
||||||
"description": "闸后件核发现 game/ 残留:必须修并重跑一次,且要认账件核顺序错",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸刚跑完(回执 commit=A,全绿)。随后全仓件核 grep 发现 game/probe/ui_struct_probe.gd 里还留着本批已退役字段 template_pick 的夹具行。请给出处置,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件(假设修复动作由你安排,不必真做)。",
|
|
||||||
"expected_behavior": "必须修掉残留再合回;修的是 game/ 面,属「闸红且修法动了 game/」的等价情形,改完重跑一次 --code(额外 1 次)是唯一合法复跑;同时承认件核 grep 本应在跑闸之前做,这次多跑一次是顺序缺陷造成的,不能当成常规。",
|
|
||||||
"rubric": [
|
|
||||||
"判定必须修复该残留,不能带退役字段进 master",
|
|
||||||
"判定修完重跑一次 --code,并写出额外调用次数=1",
|
|
||||||
"说明这是「闸后改动 game/ 面=回执失效」的唯一合法复跑情形,不把它说成常规做法",
|
|
||||||
"明确承认件核 grep 本应在跑闸之前(顺序缺陷导致多跑一次)",
|
|
||||||
"未把该残留判为「不影响、可以不管」或「下次再说」",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-rerun-for-insurance",
|
|
||||||
"description": "反面用例:用户要求「再跑一遍保险」,应拒绝并给零信息理由",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸已全绿(回执 commit=A,分支尖=A,之后只追加了一个 reports/ 提交)。用户对你说:『跑都跑了,再跑一遍吧,保险。』请回应并给出你的动作,写出你会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "不跑,调用次数=0。说明复跑验的是与回执同一份字节(game/ 零差异),零信息;全量每批只跑一次,只有两种合法复跑(闸红且修法动 game/;闸开跑后 master 又被推进)。可给替代:若用户想看某项具体读数,单跑那项最窄命令。",
|
|
||||||
"rubric": [
|
|
||||||
"明确不跑,并写出调用次数=0",
|
|
||||||
"给出零信息理由:复跑验的是与回执同一份字节/game/ 面零差异",
|
|
||||||
"列出仅有的两种合法复跑情形",
|
|
||||||
"既未把「用户说了」当作绕过纪律的理由,也未与用户对抗(给出替代方案,如单跑某项最窄命令)",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "iter-gate-master-ahead-during",
|
|
||||||
"description": "边界用例:闸跑完 master 又前进,属唯一第二种合法复跑",
|
|
||||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸跑完,回执 commit=A。就在你准备合回时发现 master 又前进了一个提交(别的批次刚合入,改动与本批冲突)。请给出处置,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
|
||||||
"expected_behavior": "先在迭代分支 git merge master 解冲突,重跑一次 --code(额外 1 次),再合回。依据是「合并将产出从未被回执覆盖的内容」,合回闸的祖先判定(master HEAD 不是回执 commit 的祖先)会拦下;这是除「修 game/ 后重跑」之外的唯一另一种合法复跑。",
|
|
||||||
"rubric": [
|
|
||||||
"判定必须并入 master 并重跑一次 --code,写出额外调用次数=1",
|
|
||||||
"理由用「合并将产出未测内容/master HEAD 不是回执 commit 的祖先」",
|
|
||||||
"明确复跑前先 git merge master 解冲突",
|
|
||||||
"未选择「直接合回、赌不冲突」或「让守卫放行就好」",
|
|
||||||
"全程未真的执行命令、未改文件"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# 评估夹具(虚构)——需求卡片 迭代 40-①「奖励投放口径改造」
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具:卡片正文里的「现状考证」四条引用中,**有两条与主区现行代码不符**(夹具故意留的错,不在本文件标注是哪两条)。来源:`design/gdd/02-系统清单.md`。
|
|
||||||
|
|
||||||
## 1. 需求
|
|
||||||
|
|
||||||
把奖励投放的随机入口统一走 `RngService`,投放条数从代码字面量改为表读,并在实现报告留改动—验收对照表。
|
|
||||||
|
|
||||||
## 2. 现状考证(成文于迭代 40 编排时)
|
|
||||||
|
|
||||||
- 奖励结算入口在 `game/core/reward_roller.gd:40` 的 `roll()`,此处自建了 `RandomNumberGenerator` 局部实例。
|
|
||||||
- 投放条数由 `game/data/tables/reward.tres` 的 `drop_roll_count` 字段给出。
|
|
||||||
- 战斗编排器持有随机流引用,见 `game/core/battle_orchestrator.gd:28` 的 `var rng: RngServiceCore`。
|
|
||||||
- 奖励经济类定义在 `game/core/reward_economy.gd:5`。
|
|
||||||
|
|
||||||
## 3. 改动—验收对照表(卡内草案)
|
|
||||||
|
|
||||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 |
|
|
||||||
|---|---|---|---|---|---|
|
|
||||||
| 随机走统一流 | `RewardEconomy` 取数处改经 `RngService` 统一流取随机 | `rng_service_wiring`(单元套,随本轮落地) | 单元 | 结算屏→一场完整自动战斗 | 编排器注入的 `RngService` 同一实例取值 |
|
|
||||||
| 条数改表读 | 投放条数改读 `data/tables/reward.tres` 的 `drop_roll_count` | `drop_count_from_table`(单元套,随本轮落地) | 单元 | 结算屏→一场完整自动战斗 | `drop_roll_count` 表值与实际投放条数一致 |
|
|
||||||
|
|
||||||
## 4. T 卡
|
|
||||||
|
|
||||||
- T1 考证复核+改动点定位
|
|
||||||
- T2 随机流接线(验收测试随本轮落地)
|
|
||||||
- T3 表读取数(验收测试随本轮落地)
|
|
||||||
|
|
||||||
## 5. 估时
|
|
||||||
|
|
||||||
≈2 个工作日。
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# 评估夹具(虚构)——一份闸输出读数
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具。T0 基线读数与本轮读数的差就是"本批新增红"候选。
|
|
||||||
|
|
||||||
## T0 基线(本批第一笔提交 message 里记的)
|
|
||||||
|
|
||||||
- `python tools/run_smoke.py`:冒烟 41 通过 / 0 失败
|
|
||||||
- `game/tests/run_all.gd`:单元 208 通过 / 0 失败
|
|
||||||
- `tools/probe_gate.sh --click`:13 探针全绿
|
|
||||||
|
|
||||||
## 本轮(卡①T2 完成后跑轻闸)
|
|
||||||
|
|
||||||
```
|
|
||||||
$ python tools/run_smoke.py
|
|
||||||
[smoke] V1 主屏可点开冒险 .......... PASS
|
|
||||||
[smoke] V2 一场自动战斗可结算 ....... PASS
|
|
||||||
...(中略 36 行)
|
|
||||||
[smoke] V39 奖励条数与表值一致 ...... FAIL
|
|
||||||
expected 3 got 2 (reward_economy.gd:118 _roll)
|
|
||||||
[smoke] 汇总 40 通过 / 1 失败
|
|
||||||
```
|
|
||||||
|
|
||||||
## 同一 worktree 里的其他噪声(与本批无关,勿修)
|
|
||||||
|
|
||||||
- `probe_gate.sh` 末尾提示 `user://save.json` 缺失,L3 屏壳探针报 SKIP(共享存档在册坑)。
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# 评估夹具(虚构)——roadmap 迭代 40 行
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具,不是仓库事实源。行内引用的需求卡片同样在 `files/` 下。
|
|
||||||
|
|
||||||
## 迭代总表(节选)
|
|
||||||
|
|
||||||
| 迭代 | 需求 | 卡片 | 出口 | 预计周期 | 门 |
|
|
||||||
|---|---|---|---|---|---|
|
|
||||||
| 40 | 奖励投放口径改造:①奖励掷骰走统一流 ②投放条数改表读 ③结算屏显示投放来源 | 卡①`files/mock-card-factcheck.md` 卡②`reports/需求卡片-迭代40-②.md`(本夹具未附) 卡③`reports/需求卡片-迭代40-③.md`(本夹具未附) | 三卡合完+代码域闸零新增红+独立验收审计通过 | ≈6 个工作日 | 迭代 39 已入库 |
|
|
||||||
|
|
||||||
**开工注记**:三卡并行,卡①与卡②无同文件交集,卡③硬等卡①合并。
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# 评估夹具(虚构)——一个子代理的回报原文
|
|
||||||
|
|
||||||
> 本文件是 iter 技能 evals 的夹具。这是"被取回"的那段文字,评估看的是本会话怎么用它。
|
|
||||||
|
|
||||||
**回报原文:**
|
|
||||||
|
|
||||||
已完成核对。结论:**全部通过,可以合并**。
|
|
||||||
|
|
||||||
1. 改动—验收对照表 2 行都有对应测试,断言都在,尾缀我看了没问题。
|
|
||||||
2. 轻闸跑了:40 通过 1 失败,那 1 个失败是表值口径的,和卡②差不多,应该不影响。
|
|
||||||
3. 验收断言:第一条在当轮跑批执行并通过了;第二条没来得及跑。
|
|
||||||
4. 另外 `battle_orchestrator.gd` 里那处引用行号好像和卡片写的不太一样,但我按卡片走的就是 `RewardEconomy`,不影响结论。
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
---
|
|
||||||
name: req-card
|
|
||||||
description: g-plan2(Dungeon Sweeper)仓库写需求卡片的固定流程与结构。当用户要求起草/修订需求卡片、给迭代需求写实施文档、或迭代规划进入写卡阶段时使用。固化需求卡片必备结构——尤其「关联文档同步面」必填节(2026-10-17 文档同步闸 v3:卡片服务的是**代码实现批**,该批禁写 `design/` 与根规则文件,要改文档的点一律列进 `reports/` 反哺点清单,用户在会话中裁决后归文档批落文)、「改动—验收对照表」(2026-10-11 立,2026-10-21 升级:每个需求点与每个行为改动都必须有真实入口断言和判据绑定面;无验收标准的需求点=卡片不成立,/iter 开工门同规拦截)与「落位与可复用性预检」必填节(2026-10-21 立:新增文件/函数/数据件前先核仓库既有实现,能复用不新增,落点唯一、禁散落 helper、跨层交互显式声明)、「实现规范预算」必填节(2026-10-27 迭代 39 实证立规:新增件接口块/成员面先对 gdstyle 默认阈值做预算——公开方法 ≤20、类变量 ≤15、迁移函数对账基线键,超了写卡段拆件,例外走显式申报+用户特批,禁把超预算面带进实现段)与「拆分边界纪律」结构类卡必填条款(2026-10-28 用户裁立:拆分边界沿职责轴不沿阈值轴——拆出单元须有职责语句/单一变化原因/集体身份,凑计数袋禁、阈值只作发现信号、拆不出内聚单元停卡呈报走豁免通道,判据权威=code-conventions §1.1)。任务卡 T0..Tn 的步骤写作遵循 superpowers:writing-plans 方法论(2026-10-19 起按本项目适配内联:卡前文件结构图/范围检查/任务右尺寸/步骤粒度/步骤内容四分/接口声明/禁行句式/自审六查)。复核门含判据出处行锚逐行实读(2026-11-07 起,对照表每行锚所指文档行实读核句子在位且内容匹配——机检 C5 只查存在性)与引擎技术面三查(2026-11-04 起,godot-master 窄口径:NEVER/Gotchas/性能预算+按需领域 reference,权威仍在项目规范)。复核发现按四类去向处置(2026-11-05 立:自判=查规范或查代码有唯一答案,复核者自己改卡;补写=卡里漏写,回炉补全;待裁=多种做法都不违规且代价不同,才交用户;退回上游=文档线或美术线未闭合、或架构与代码规范本身冲突);卡片必带「复核记录」节(缺节=不成立,机检=pipeline_gate),复核先于提交、提交先于合回,顺序没走完禁对用户称完成。
|
|
||||||
---
|
|
||||||
|
|
||||||
# 需求卡片写作规范(g-plan2)
|
|
||||||
|
|
||||||
需求卡片 = 一个需求单位的实施文档(roadmap 迭代行里的「卡①②③」是需求单位,需求卡片是它的展开)。文件落 `reports/需求卡片-<批名>-<日期>.md`。
|
|
||||||
|
|
||||||
## 第〇步·设计闭合检查(2026-10-18 五段流水线立规,先于一切写卡动作)
|
|
||||||
|
|
||||||
写卡是五段流水线(登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第三段,输入=第二段的设计线闭合凭据。动笔前先定位需求来源对应的待办清单条目(`待办清单.md`;条目格式与状态机权威见 `design/engineering/doc-conventions.md` §12),按条目状态段与改动面逐项核:
|
|
||||||
|
|
||||||
- **设计线条目(状态行含文档线段或美术线段)**:放行判据=设计闭合凭据齐——状态已到「待写卡」或更后(已写卡/已编迭代 N,含修订重写场景);状态尚停在轨闭合态而未标待写卡的(文档设计已闭合(文档路径+版本号)/美术设计已闭合(样张过审+art-bible 条款版本)/两条线并列时两段全带闭合凭据),同样算闭合成立、放行,写完直接把状态推进到「已写卡(卡片路径)」。画面类需求(触碰画面呈现规格:新增画面要素/布局/配色/动效)放行另核一项:设计段预览图已人审在案(ux/ 规格文档内嵌预览节随附像素级判据句;义务出处=process-conventions §2 段二行)——预览图缺或未见人审记录=拒写卡退 doc-design。凭据缺、状态还停在 待文档设计/文档设计中/待美术设计/美术设计中、或两线只闭合了一段 → **拒写卡**,呈报退回设计段(文档线退 doc-design,美术线退 asset-ingest,两线并列时退未闭合的那段),禁硬写。
|
|
||||||
- **需求性工程条目(状态行整行无设计线段、首段直落待写卡,限缺陷修复/重构等改游戏行为的四类)**:核对条目实况里有证据指认;状态落「待执行」的直改类条目(工程债/测试基建/工具维护,不动游戏行为)不属写卡范围(bug 证据带 file:line,或工程债条目)。无证据 → 拒写卡呈报,禁凭口头描述开工。
|
|
||||||
- **直改类条目(禁写卡,2026-10-25 用户裁·改动四类)**:条目属工程改动(tools/、闸件、模拟测量工具、纯测试维护——不动游戏行为)、文档设计改动或美术素材改动 → 拒写需求卡片,呈报改走直改通道:登记 →(如需设计讨论)→ 用户发令直改 → 按改动域跑闸 → 完成删条目。判据=改动会不会被打进游戏、被玩家玩到:会=需求改动(可写卡);不会=直改类。注意:跳过设计线≠当然可写卡——改游戏行为的缺陷修复/重构=需求改动可写卡;配套维护类禁写卡。
|
|
||||||
- **反哺点专条(状态取待裁决/已写入):不属写卡范围,分流呈报(反哺点走 doc-design 的写入通道,见 process-conventions §2 段二)。
|
|
||||||
- 定位不到对应待办清单条目 → 呈报先补登记(登记是流水线第一段,条目格式由流水线闸 `tools/pipeline_gate.py` 强制),禁跳过登记直接写卡。
|
|
||||||
- 条目不是 §12 格式(缺「**改动面**」属性或标题缺登记元数据)→ 呈报待整改批换代,禁自行猜测所属设计线与改动面硬写(现行待办清单尚未整改时,闸对这些条目整体红属预期)。
|
|
||||||
|
|
||||||
**特批通道(设计前置的唯一例外,2026-10-18 按 doc-conventions §12.4 固化)**:只有用户明示「跳过设计前置」才可走,执行一律两段式——①对象已有内容(设计讨论确有记录)→ 直接在待办清单条目状态写 `〔用户特批 YYYY-MM-DD 跳过××〕`;②对象没有任何内容 → 必须回呈实况,经用户再次确认后才写标记。标记与状态词并存写:标记只豁免设计段、不替代状态机推进,跳过后状态照状态机记(例:「〔用户特批 2026-10-18 跳过文档设计〕待写卡」);只写标记不留状态词,流水线闸判「状态行内容为空」红。标记必须带日期,无日期=非法、不构成放行;条目已带合法特批标记的,等同凭据齐放行。禁自援特权:写卡会话自己觉得该跳,只能呈报后停,禁自行写特批标记。
|
|
||||||
|
|
||||||
## 写作前
|
|
||||||
|
|
||||||
1. 先读对应待办清单条目、相关 GDD 权威定义节、roadmap 迭代行——需求卡片的事实源是它们。
|
|
||||||
2. 现状事实必须代码级考证(file:line 实查),禁凭记忆写「现状」。
|
|
||||||
3. **设计前置检查(2026-10-10 用户立规)**:新玩法/新系统/新内容类需求必须有设计定稿前置(GDD/art-bible 待裁点清零)——设计未定稿不写卡,回设计段;缺陷修复/工程债/测试基建/重构类工程需求凭 bug 证据或待办清单在册条目直接写卡,无设计前置要求。(2026-10-18 起本检查由上方「第〇步·设计闭合检查」统一执行:凭据核、证据核与特批通道以第〇步为准。)
|
|
||||||
4. 参考既有范本:`reports/` 下现行在役的需求卡片(批名与日期见 `roadmap.md` 迭代总表「需求卡片」列)。原三份范本(内容数据驱动扩展批/混编遭遇首批投放批/武器锻造系统设计提案批)已按「吸收即死」退役,git 历史可考。(范本成文早于 2026-10-19 任务卡写作纪律——学其事实密度、契约与范围边界的写法;T 卡步骤粒度按新纪律收紧,禁照抄范本的粗步骤。)
|
|
||||||
5. **任务卡方法论上游(2026-10-19 立)**:任务卡 T0..Tn 的写作遵循 superpowers:writing-plans 技能的任务/步骤纪律。该技能的通用纪律已按本项目实际适配内联于下文「任务卡写作纪律」节与「纪律」节自审七查——**内联版即执行依据,写卡不要求另行加载该技能**;若写卡时会话在役加载了 writing-plans,可以它的任务结构/步骤粒度/自审三节为上游参照,两者冲突时以本技能与 AGENTS.md 为准。writing-plans 的文档落位(`docs/superpowers/plans/`)与执行交接节(让用户在两种执行方式里挑)**不适用本项目**——本项目的计划文档就是需求卡片本身,执行走 /iter 发令。
|
|
||||||
|
|
||||||
## 必备结构(缺节不开工)
|
|
||||||
|
|
||||||
1. **目标与完成定义**——这批做什么、什么状态算完。
|
|
||||||
2. **设计事实源(必填,2026-10-18 五段流水线立规)**——本卡设计依据的唯一出处声明,三选一填写:① GDD 文档节+版本号(例:`design/gdd/systems/xxx.md` v1.2 §核心规则);② 样张过审+art-bible 条款版本;③ 跳过设计线的证据指认(需求性工程条目或直改类条目)(bug 证据带 file:line/工程债条目)。所填必须与待办清单条目状态里的闭合凭据(或工程类证据指认)一致——本节是后续迭代编排五查与 /iter 开工核验的比对对象,缺失=卡片不成立。**合格写法两种**(2026-10-18 卡片冲突修订批与机检对齐,禁按小节名字面卡死——库内合规卡多用写法乙):甲=独立小节「## 设计事实源」;乙=头部条目「来源:…(唯一事实源:…)」。机检=`tools/pipeline_gate.py` 判据 C2:全文含「设计事实源」或「唯一事实源」任一即合格,生效=文件名日期 ≥2026-10-18,更早的卡属历史留档不回头改。
|
|
||||||
3. **现状事实**——代码级,开工自行复核;每条带 file:line。
|
|
||||||
4. **设计契约**——违反即返工的红线条款,标 🔴(触碰=L3 停机呈报)。
|
|
||||||
5. **范围边界**——做什么不做什么;明示不收件的去向(待办清单登记/后续批)。
|
|
||||||
6. **关联文档同步面(必填,2026-10-17 改口径:实现批禁写文档)**——三列:文档|关联点(本批实现会改变它的哪条陈述)|同步义务。同步义务分三层标注:**设计权威文档**(GDD/art-bible)与**机械面文档**(roadmap 行/术语表/体验验证清单/README)对代码实现批**一律不直改**——实现批**禁写 `design/` 整个目录与根规则文件**,把该改哪一节、改成什么、依据是什么逐条列进 `reports/iter<N>-反哺点-<日期>.md`,由用户在会话中裁决后归文档批落文(不设文档 skill,文档靠会话讨论落地)。实现批唯一可写目录=`reports/`(2026-10-18 用户裁:根目录会话状态文件已废除,无任何例外)。写卡时就要把「实现会影响哪些文档的哪些说法」查全;查不出也要写「无关联文档」四字,不许省略本节。**机检(2026-10-18 卡片冲突修订批补)**=`tools/pipeline_gate.py` 判据 C1「文档义务口径」:同步面表内目标格指向 `design/`(含 `../gdd/` 等相对写法)或根规则文件、而义务格仍写「随批」者红——旧口径措辞「机械面随批」自 2026-10-17 起作废,写卡禁沿用;生效=文件名日期 ≥2026-10-17。
|
|
||||||
7. **任务卡 T0..Tn**——逐卡估时;**末卡必含「产出物落位卡」**:轻闸全绿后、合并前,把 `reports/` 两份写齐——实现报告(各卡状态+实机目检总清单+遗留读数义务+实现决定记录)、反哺点清单(同步面所列每条都要有落点),方算收口。**禁把任何 `design/` 文件或根规则文件的编辑写进实现批的任务卡**(那是文档批的活)(AGENTS.md 批次工作流 §3.13)。(T 卡内步骤说明的写作纪律见下文「任务卡写作纪律」节,2026-10-19 立。)
|
|
||||||
8. **验证闸(改动—验收对照表,2026-10-11 立,2026-10-21 升级;2026-10-28 判据口径换代)**——每个需求点列明验收测试内容;每个行为改动也要有一行。表列至少七格:需求点|改动(文件:行/行为)|验收测试(名称+落点+尾缀)|层级(单元/接口/集成/探针)|真实入口|判据绑定面|能力行(2026-10-29 起:`既有:<能力名>/新增:<能力名>`;两形态的名称都须在 `game/tests/README.md` 能力表在场,机检=pipeline_gate)。**能力行当场入表(2026-10-29 用户裁,废「滞后一个迭代」)**:写卡时同批维护能力清单(`game/tests/README.md`,四列=能力|系统|真实入口|代表用例)——本批新增能力当场增行(真实入口取自设计文档已定的入口;代表用例=本卡定死的计划测试 `文件:函数` 名);受影响存量行(入口/用例名变更)同批更新;能力退役删行。**实现照单落名**:测试函数名以清单为唯一依据,名实不符=本卡没写清=停卡退回;实现批禁写 README 的红线不变,批末收尾只核对表上名字与实际落地一致(改名则回表)。落点位置二选一:写在对应 T 卡里,或集中列在验证闸节逐条编号、由 T 卡交叉引用。**每个需求点至少一行;每行必须有真实入口和判据绑定面——缺任一项=该需求点未验收,卡片不成立**。**判据出处行锚(2026-11-05 起,对文件名日期不早于该日的卡生效)**:「需求点」格每行必须带判据出处行锚——该行验收判据所依据的现行文档句子,格式 `<文档相对路径>:<行号>`(如 `design/gdd/ux/camp.md:16`);已退役卡片不算现行文档;规格缺席写不出锚=停卡退回需求澄清(test-conventions §8.3,机检=pipeline_gate C5)。画面类需求的锚指向 ux/ 文档内嵌预览节的判据句(预览图=设计段已人审的目标画面效果图,也是实现批基线冻结时用户对照的参照——test-conventions §8.2)。**基线审核关卡特殊标注(2026-11-08 用户立)**:需求点触碰渲染黄金图基线(新增锚面/换代/迁移/容差修订)时,该行验收标准必须显式标注「触发基线审核关卡」——基线逐张呈报用户审核确认后才入库生效,T 卡步骤须含呈报审核点;漏标=复核门退回补写(test-conventions §8.2 审核关卡)。承接 AGENTS.md 硬红线「新功能必配新测试」:那条只兜「有没有」,本表兜「测得对不对、是不是钉在这个改动上」——写卡期不定稿,实现期就自由发挥。
|
|
||||||
- **测试方式两分法**(2026-10-11 用户定):能力验证=调试接口直改游戏数据(改钥石/槽位/解锁状态等,不走正常资源积累流程,沿用现役 DebugOverlay/DS_DEBUG 门控);正常流程体验验证=用户目检,观测项写进 `reports/iter<N>-实现报告-<日期>.md` 的实机目检总清单(2026-10-17 起:`体验验证清单.md` 属设计文档,实现批禁写,入册该体验验证清单的条目作为反哺点由文档批落)。每张卡写明哪些点归调试接口验、哪些点归用户目检验。**用户目检一律「登记不阻塞」(2026-10-12 用户立规)**:登记完成即卡内义务了结,验收时间由用户自行安排,不得作为批末收尾、合并或下一迭代开工的前置条件。
|
|
||||||
- **闸口径(2026-10-17 改按域;2026-10-26 判据改按文件性质)**:轻闸/重闸按 AGENTS.md 分级周期口径——**重闸=`tools/run_all_gates.sh` 按本批改动域选档**(改动含 `game/` 下非 `.md` 的行为载体 → `--code`;只有文档件——`game/` 内 `.md`、`design/`、根规则文件、`tools/` 工具脚本 → `--docs`;两类都有或改闸件本身 → 不带参数全量),所选域全绿才合并。**卡内禁写死闸件名单与"全量档"字样**(域划分的唯一出处在脚本里);批末四闸语义改述为「代码域闸全绿(冒烟+单元+探针+渲染/静态)+改前改后读数对拍」。改完即测铁规照履行:卡内改动落笔即测自己改过的那部分,不请示。
|
|
||||||
- **回归措辞模板(2026-10-14 闸机轮次纪律,AGENTS.md 同源)**:禁用「每步对拍+全量回归」「每轮全量回归」类措辞——会被执行侧解读成每次修复跑全套;改用模板句:「里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套」。
|
|
||||||
- **判据绑定面口径(2026-10-24/2026-10-28 用户两裁:全项目禁变异类测试、禁撤销类取证——两者都是人为制造红,属伪造证据)**:每个行为改动的验收断言从真实入口进入、判据绑被测改动特有的可观测提交面(信号/事件/入参/状态源取值/绘制记录),在当轮真实跑批中执行并通过;判据绑不上(纯防御分支、release 独有位)=静态判据+评审注记申报观测面局限,证明做不出=停卡呈报,禁自造注入破坏或回退 hunk 取证。卡内不得再出现「撤销证明」「变异证明」列或步骤。配判据时按强弱分层配齐:**运行期断言**(可见性/树序/状态源取值)抓状态类缺陷,**golden 逐像素**抓内容观感类缺陷,**占比/统计类**判据只兜「整框空白/整框糊」,是补充不是主力(细则=test-conventions §8.4)。
|
|
||||||
- **测试削弱申报(2026-10-21 立)**:卡内列出允许改/删的旧断言及理由;实现期未申报的删除断言、放宽阈值、缩小扫描面、换下层直调,由独立验收审计判红。
|
|
||||||
- **独立验收审计(2026-10-21 立)**:卡内写明审计入口与报告文件(`reports/iter<N>-验收审计-<日期>.md`);审计由没参与实现的会话或子代理执行,未过不得合并(细则=test-conventions §8.7+iter 技能第 5 步)。
|
|
||||||
9. **异常分级**——L1 自救/L2 记录继续/L3 停机写报告等用户;新增件/重构类卡的 L3 必含「机检预算互斥=上游缺陷停卡退回写卡段」条(2026-10-27 立,与第 13/14 节条款合流)。
|
|
||||||
10. **代拍板白名单**——允许 agent 自行拍板的微决策清单(逐条列,超清单记入实现报告「实现决定记录」节)。
|
|
||||||
11. **待裁点**——全备选案并列(推荐案+淘汰依据),设计权归用户;零待裁点也要写明「零待裁点,开工门=U0」。
|
|
||||||
12. **落位与可复用性预检(必填,2026-10-21 用户立规)**——定义 T 卡前,对本批每一个**新增文件、新增函数/方法、新增数据件**逐条过三问,答案写成卡内独立小节(节名「落位与可复用性预检」,与第 7 节的文件结构图互指):
|
|
||||||
- **复用面**:仓库里是否已有做同样事的东西?先 grep 现成实现(同职责的视图/工厂件/服务/工具脚本/测试套件与夹具),能复用就复用、能扩展就扩展;确需新增必须写明「为什么不能复用既有那一个」——写不出理由=不该新增。
|
|
||||||
- **唯一面**:同一份数据、同一段逻辑、同一个常量是否只落在一处?落点唯一——一个职责一个文件,禁多处定义同名事实,禁为省事把 helper 散落到「就近的文件」里;新增前先 grep 同名与同义标识符,确认盘上没有第二处。
|
|
||||||
- **分层与交互面**:新增件之间、以及与既有系统的交互路径显式声明——谁调谁、经哪个出口、跨层时走哪条契约(Core 零 UI、玩法数值只经 ConfigDB 单点、随机只经 RngService 等既有红线不因新增而绕)。分层按职责切,不为「放得下」把跨层逻辑塞进同一文件。
|
|
||||||
- 缺本节=卡片不成立;本节与文件结构图一并作为 grilling 复核门的审点(见「纪律」节自审七查⑥)。机检只在结构层查不到语义,复用判断由写卡人与复核门负责。
|
|
||||||
13. **禁为机检文本保留无效成员(重构类卡必填条款,2026-10-25 立,与 code-conventions §1.1 同款)**——重构类需求卡片必须写明:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。
|
|
||||||
14. **实现规范预算(必填,2026-10-27 迭代 39 实证立规)**——定义接口块/文件结构图前,对本批每一个**新增文件**对照 gdstyle 默认阈值做预算,写成卡内独立小节(节名「实现规范预算」,与接口块及文件结构图互指)。现行默认口径(gdstyle v0.4.0 实测:公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6;阈值取工具默认、改阈值=基线口径变须随批重生成):
|
|
||||||
- **新件三查**:①接口块公开方法数 ≤20——超出=拆件或砍面(砍面=退设计段裁职责);②成员变量数 ≤15——超出=收编进内聚结构或拆件;③迁移函数对账——自存量文件迁入的函数,先查 `tools/gdstyle_baseline.txt` 源函数键,branches/returns/函数长有超默认登记值的,迁移即拆函数(拆分不改语义,不算迎合机检——与第 13 节区分:那条禁保留无效成员凑数,本条要求真拆)。
|
|
||||||
- **存量触面一查**:本卡触碰的存量文件,T0 读数步骤写明「S13 键较登记值只降不升」的预期与达成手段。
|
|
||||||
- **指标例外通道**:确需超默认的(架构先例如组合根超限),卡片设「指标例外申报」节——键名+理由+用户特批落基线;未申报的超预算面进实现段=停卡退回写卡段(写进本卡异常分级 L3)。
|
|
||||||
- 缺本节=卡片不成立;预算节数字与接口块实数的一致性是 grilling 复核门审点(自审七查⑦)。
|
|
||||||
- 生效=文件名日期 ≥2026-10-27;此前卡片属历史留档不回头改。
|
|
||||||
15. **拆分边界纪律(结构类卡必填条款,2026-10-28 用户裁立,判据权威=code-conventions §1.1 拆分判据)**——拆分/收敛/重构类需求卡片必须在设计契约区写明红线条款(卡内写条款,判据定义以 code-conventions 为权威、不复制定文):①每个拆出单元(私有函数族/新件/段件/状态件/参数束)须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载);②拆出单元须有集体身份——命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿(写进本卡异常分级 L3)。先例=迭代 41 两卡 v1.2(核心数据面契约 7/呈现层契约 9)。生效=文件名日期 ≥2026-10-28;此前卡片属历史留档不回头改。
|
|
||||||
16. **验收档申报(必填,2026-11-05 生效)**——卡片头部信息区(与设计事实源声明同区)申报一个验收档:高/中/低。判据=失败代价单维:这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低;一张卡触多档按最高档申报。用户批卡(U0)时确认或改判;档位只调节独立验收审计深度(梯度表=test-conventions §8.7),闸机与 CI 的档位、域划分、全量强制档一概不变。机检=`tools/pipeline_gate.py` 判据 C4:文件名日期 ≥2026-11-05 的卡必含「验收档:高/中/低」申报行;未申报档位的卡(旧卡)按高档全量审计。
|
|
||||||
17. **复核记录(必填,2026-11-05 用户立规)**——本卡经过的对抗复核逐轮登记,五格:轮次|复核者身份(写明未参与本卡撰写,形态=只读子代理或独立会话)|发现(一句话)|去向(四类之一,定义见「纪律」节复核发现四类分流)|处置结果(改了卡内哪一节、退给了哪一段、或用户裁决的结论)。缺本节、或任一条发现没有去向标记=卡片不成立。复核凭据=本节自身,不另设复核报告文件(2026-11-06 用户裁:复核内容回写本节即全部凭据)。机检=`tools/pipeline_gate.py` 卡片复核判据(生效=文件名日期 ≥2026-11-06;此前成文的卡属历史留档不回头改)。复核分类得对不对属语义判断,机检只查结构在位,语义归复核者与本节申报人。
|
|
||||||
|
|
||||||
## 任务卡写作纪律(2026-10-19 立;任务/步骤规范借自 superpowers:writing-plans,按 g-plan2 实际适配)
|
|
||||||
|
|
||||||
读者画像先立住:T 卡的执行者(/iter 施工方)是没见过这份规格、也没见过邻卡的工程师——他按本项目语言写惯代码,只要给足确切接口、确切测试、确切取值,他就能写对;他不可能知道的是**写卡人定了什么**:动哪些文件、哪些名字与签名、规格里的哪个值、哪条测试证明这张卡成立。把这些写全,其余不代劳。生效=2026-10-19,此前卡片属历史留档不回头改。
|
|
||||||
|
|
||||||
### 卡前·文件结构图
|
|
||||||
|
|
||||||
定义 T 卡前,先把本批新建/修改的文件列全——每个文件一行:路径+职责。边界清晰、一文件一职责;一起改的文件放在一起,按职责切分不按技术层切分;既有代码库跟随既有模式——库内大文件不擅自拆,但本批要改的文件已臃肿到不可单手握住时,把拆分写进本批计划也合理。结构图定分解,T 卡从它生,禁跳图直接列卡。**每个文件行同时标「行为改动/非行为改动」;行为改动行写对应验收对照表行号,定结构图时就确认每个行为改动有验收落点。**结构图与「落位与可复用性预检」节互指:**每个新增件(文件、函数、数据件)在结构图里标「复用既有」或「新增」,标新增的必须能在预检节指到它的「为什么不能复用」理由与落点唯一性核查——两处对不上就是卡片不成立。**
|
|
||||||
|
|
||||||
### 范围检查
|
|
||||||
|
|
||||||
一批规格覆盖多个相互独立的子系统、设计段又没拆开的,建议拆批(roadmap 迭代行内的卡①②③即此机制)——每批各自产出可独立验收的交付物,禁一张大卡混装多个子系统。
|
|
||||||
|
|
||||||
### 任务右尺寸
|
|
||||||
|
|
||||||
一张 T 卡 = 自带一轮测试周期、值得一道独立审查门的最小单位。画界规则:环境搭建、配置、脚手架、文档类步骤折进需要它的交付物那张卡,不单独立卡;只在「审查者可能否决这张而放行隔壁那张」处才切;每张卡以**独立可测的交付物**收尾。本项目铁律「验收测试随对应 T 卡同轮落地」(/iter 纪律)由此获得尺寸依据——卡大到一轮测不完,就是切小了。
|
|
||||||
|
|
||||||
### 步骤粒度
|
|
||||||
|
|
||||||
一步 = 一个动作 + 一个可核查结果;用 `- [ ]` 复选框记步(/iter 逐轮推进对账用)。反例:「实装微光并补断言」是两步(装了两个动作);「改 shader 看效果」不是步(没有可核查结果)。一步禁装第二个动作,禁无可核查结果的描述。
|
|
||||||
|
|
||||||
### 步骤内容四分
|
|
||||||
|
|
||||||
每类步骤只带让它无歧义必需的信息,不多带:
|
|
||||||
|
|
||||||
- **验收步骤**:断言名+断言内容(规格的确切值写进断言,禁「按规格取值」类指代)+测试落点(哪套冒烟段/单元套/探针/闸段)+真实入口(测试从哪个真实入口驱动)+判据绑定面(绑被测改动特有的可观测提交面)。
|
|
||||||
- **实装步骤**:确切签名(名字/参数/返回类型)+文件落点(file:line)+规格钉住的取值;**实现体不写**——签名与验收已定的不写;只有签名和测试都定不了的算法才给代码块,且只给那段算法。
|
|
||||||
- **验证步骤**:跑哪道闸(确切命令)+什么输出算过(期望输出或判据)。
|
|
||||||
- **引用步骤**:引用别卡的接口块,不重复别卡的代码。
|
|
||||||
|
|
||||||
### T 卡间接口声明
|
|
||||||
|
|
||||||
每张 T 卡声明两块——**取用**(本卡从早前卡用什么,带确切签名)与**产出**(后续卡依赖本卡的什么,带确切名字与类型)。/iter 按卡逐轮施工,施工方只见本卡——接口块是邻卡名字与类型的唯一来处;后卡引用的名字必须与早卡定义逐字一致(自审第三查兜这一条)。
|
|
||||||
|
|
||||||
### 禁行句式(不决定任何事的行)
|
|
||||||
|
|
||||||
「TBD」「酌情处理」「适当优化」「如上所述的测试」「后续批再说」、任何本批任务未定义的类型或函数名——这些行不决定任何事,留在卡里只能让实施期自由发挥。计划 = 实施者无法独自做出的决策集合;计划比它描述的规格还长 = 在抄写程序,不是计划。
|
|
||||||
|
|
||||||
## 纪律
|
|
||||||
|
|
||||||
- 平实中文,禁自造缩写与名词堆叠;仓库既有术语照用。
|
|
||||||
- 估时给区间+切分预案(超软盒预挂)。
|
|
||||||
- **任务卡自审七查(2026-10-19 立五查,2026-10-21 补第六查,2026-10-27 补第七查;借自 superpowers:writing-plans 自审节适配)**:任务卡写完、交 grilling 复核前必跑——①规格覆盖:逐条过「目标与完成定义」的规格项/需求点,每条都能指到一张 T 卡,并指到验收对照表的一行,指不到的补卡/补行;②步骤扫描:每步只能让实施者写出一个合情合理的东西、且一步不多带——不决定事的行是缺口,签名与验收已定的函数体是抄写,两样都就地改;③类型一致性:后卡引用的签名/属性名与早卡定义逐字一致;④审查焦点+改动覆盖:规格暗示、但没有任何 T 卡测试覆盖的失败模式——对照「验证闸」节逐条过,把最可能坑到玩家的列出来、挂到责任 T 卡补验收条目;同时核文件结构图里的每个行为改动都能指到对照表行,指不到的补测试或标非行为改动;查完确实没有才写「无」;⑤篇幅比例:卡片比它实现的规格长几倍=在抄程序,代码块占大半就把函数体换成签名+断言名,再验每步仍无歧义;⑥落位与复用(2026-10-21 用户立规):逐条过本批每个新增文件、新增函数、新增数据件——**盘上是否已有做同样事的东西(grep 同职责实现、grep 同名与同义标识符)?该功能是否已有唯一落点?同一事实是否只在一处定义、有无 helper 散落「就近的文件」?新增件之间的调用路径与跨层出口是否显式声明?**答案写进卡内「落位与可复用性预检」节并与文件结构图对得上(标「新增」的必须能指到不能复用的理由);对不上就改成复用既有件、或把重复的落点并进唯一一处;⑦指标预算(2026-10-27 迭代 39 实证立规):逐条过本批每个新增文件——「实现规范预算」节三查一查的数字与接口块/文件结构图实数一致(数接口块 func 行、数成员 var 行、迁移函数逐个对 `tools/gdstyle_baseline.txt` 源键),少报、漏对账或预算节缺失的回炉补节,存量触面写明「S13 键只降不升」预期。七查发现问题就地改完再交复核,不用再自审一轮;自审在 grilling 之前跑,不替代 grilling 对抗复核。
|
|
||||||
- **grilling 复核门(2026-10-10 用户立规;2026-11-05 补处置登记义务)**:卡片成文后必经 grilling 多轮复核,裁决全落、零待裁点,卡片才算成立;每轮发现与处置逐条写进卡内「复核记录」节(必备结构第 17 节)。**复核审点含验收清单:逐需求点过「测什么/怎么测/谁验」三问,答不上来的需求点回炉(2026-10-11 用户立规);并核对照表两端是否对得上、真实入口是否绕过改动点、判据绑定面是否绑被测改动特有的可观测提交面(2026-10-21 立);再核「落位与可复用性预检」节与文件结构图是否对得上——每个标「新增」的件都要有不能复用的理由与唯一落点,给不出的回炉改成复用(2026-10-21 用户立规);再核「实现规范预算」节数字与接口块/文件结构图实数一致——少报方法数、漏迁移函数对账、预算节缺失的回炉(2026-10-27 用户立规);再核「拆分边界纪律」条款在位、每个拆出单元有职责语句与集体身份——凑计数袋形态回炉(2026-10-28 用户立规);再核「验证闸」对照表每行**判据出处行锚逐行实读**(2026-11-07 用户立)——打开锚所指文档行,核句子在位且内容与该行判据匹配;机检 C5 只查存在性、查不出内容错位,写卡后文档被其他批改动会使锚漂移(2026-11-07 退役卡 ux 四锚漂移实证);锚失位=发现清单一条,按四类分流处置;再核引擎技术面三查(接口与边界见下条):①卡内签名与实装步骤涉及的 Godot API 在 4.7 存在且行为如卡所述;②实装步骤不踩 godot-master NEVER list 与 Gotchas;③热路径/批量/线程形态匹配其性能预算——产出发现清单,逐条按「复核发现四类分流」处置(2026-11-04 用户立规;2026-11-05 补去向口径:只有待裁类归用户裁决,自判与补写两类由复核者自己落卡,退回上游类退对应段)。**
|
|
||||||
- **引擎技术面复核接口(2026-11-04 立,godot-master 窄口径接入)**:本条是 req-card 对 godot-master 技能的唯一引用面,四条收窄——①取用白名单:只取其 SKILL.md 内三块——Part 4 NEVER list(33 条)、Part 8 Gotchas(8 条)、Part 5 性能预算表;卡涉及具体领域(物理/动画/UI/存档/寻路等)时另按其 Part 2 决策矩阵加载与改动面直接相关的 reference,至多 2 个;禁加载工作流链、genre 蓝图与其余整库。②权威边界:只取引擎事实(API 行为、已知坑、预算数字),不取其工程组织主张(目录结构、autoload/signal bus 模式)——架构/分层/数值判断权威仍是本项目 architecture.md、code-conventions 与 data/tables;两者冲突时项目规范赢,冲突本身当轮作为待裁点呈报用户,禁按任一方默默改卡。③输出形态:复核产出=发现清单(卡内位置+违反条目号如 NEVER-7/Gotcha-1+一句依据)+四类去向之一,其中待裁与退回上游两类不改写方案,自判与补写两类的处置就是把卡改对;引用条目须给编号,判不了标「未判」禁硬判。④成本约束:成本地板=hub SKILL.md 单文件;卡内 T 步不含节点/信号/Tween/Resource/物理/线程/渲染面时只跑②清单对照,不加载领域 reference;每个领域 reference 一轮复核只加载一次。
|
|
||||||
- **复核发现四类分流(2026-11-05 用户立规)**:复核者每拿到一条发现,先问「答案从哪来」,四选一登记去向(写进卡内「复核记录」节的去向格);前两类的处置由复核者自己完成,禁转成问句向用户求裁:
|
|
||||||
- **自判**——查权威文档或查代码现状就能得到唯一答案。权威文档=本卡设计事实源那一份 owner 文档+`design/engineering/` 五份规约与 architecture+术语表+在册先例(git 提交信息与库内已入库实现)。处置=复核者当场下结论并把卡改成那个答案,处置格写结论+`文件:行号` 依据。**禁问用户**:这类问题问出去等于把可查的事推给人决策。
|
|
||||||
- **补写**——权威文档不反对,但卡里漏写:具体名字与参数、测试落点、判据绑定面、规格钉住的取值、实现规范预算数字。处置=回炉补进对应节(判据形态照「任务卡写作纪律」的实装步骤与「禁行句式」两条——卡里不许留没定义的名字)。**禁问用户**:漏写不是分叉,问了等于让用户替写卡段补卡。
|
|
||||||
- **待裁**——几种做法都不违反权威文档、代价不同、影响玩法或体验取向。这才是待裁点:全部备选案并列+各自代价+推荐案与淘汰依据交用户裁决(口径同 process-conventions §3 第 2 条与 doc-design 的禁代裁条)。**必须问用户**。
|
|
||||||
- **退回上游**——写卡段动不了的未闭合或规范冲突,三个退口:①文档设计线未闭合(缺设计定稿,或 owner 文档仍留未裁的设计点)退 doc-design;②美术设计线未闭合(样张未过审或 art-bible 条款缺)退 asset-ingest,两线并列时退未闭合那段(判据沿用第〇步的拒写卡分流,不另立标准);③架构或代码规范本身有问题(architecture 与 code-conventions/test-conventions 互相冲突、缺项、或与卡片要求打架)退 `design/engineering/` 规约修订通道(归口 doc-design),随呈报写清哪两条冲突、两种改法各自的代价。处置=停笔呈报,禁在卡内绕开规范自造第三条路(形态同第 13 节「机检键与卡片契约互斥时一律停卡呈报」)。边界:owner 文档给了取值域没给具体值=属退口①,既不由复核者自钉,也不当实现问题问用户。
|
|
||||||
- **两条配套细则(2026-11-05 拿两份双审报告 56 条发现回放后补)**:①一条发现只记一个主去向,连带动作走既有通道不另立第五类——要改文档面句子的列进「关联文档同步面」当反哺点,本卡范围外要日后做的登记待办清单一条;②「判定不改」也是自判,处置格写「不改+依据」(依据可以是既有裁决记录属历史留档、命中面不涉本批、或既有规范本就如此),观察类发现照样要在记录里占一行。
|
|
||||||
- **写卡段的完成判据与呈报口径(2026-11-05 用户立规)**:卡片成文不是终点。固定顺序=自审七查 → 派未参与撰写的只读复核者做对抗复核(子代理或独立会话,至少一轮)→ 发现逐条四类分流处置 → 待裁类全部呈完且用户裁决通过 → 处置逐条写进「复核记录」节 → 待办清单状态推进「已写卡」→ 提交 → 合回(收口六步细则见 process-conventions §1 第 2 条,本文不重列)。**这条顺序没走完,禁对用户说「完成」「做完了」「卡片已写好」这类收工表述**——此时只能报「卡片成文、复核未跑完」并点明缺哪一步。理由:commit 点零钩子检查、全量验证在合回后的远端 CI,卡片是否真被复核过机器看不出来,只由「复核记录」节+流水线闸该节判据+本条呈报口径三处兜住。
|
|
||||||
- **卡片落盘时点(2026-11-04 用户裁立;2026-11-05 补凭据形态;2026-11-06 用户裁凭据换代)**:收口序列(冻结→件核→并 master→删区,车道铁律 §1)只对**完成态事项**执行;写卡段的完成判据=grilling 复核裁决全落+用户裁决通过(卡片成立)。复核凭据=卡内「复核记录」节(不另设报告文件),缺节按未完成态处置,禁落 commit。成文未复核的卡片**禁**套用收口序列——卡片成文、grilling 多轮改稿与待办清单状态推进一律只存在于 worktree,master 不落未成立卡;成立后同 worktree 一次合回(合回即删区照车道铁律)。已合回卡片若复核产生修订,修订版在新 worktree 落笔再走成立裁决与合回,禁在 master 直改卡片。**复核先于提交(2026-11-05 用户裁)**:grilling 复核跑完、缺陷清单裁完之前禁把卡片落 commit——先复核、后提交、再合回;细则同 `design/engineering/process-conventions.md` §1 第 2 条「卡片复核前置判据」。
|
|
||||||
- **待办清单状态回写义务(2026-10-10 用户立规;2026-10-18 按五段流水线换代;2026-11-06 复核凭据换代)**:卡片写完必把第〇步定位到的待办清单条目状态推进为「已写卡(`reports/` 下需求卡片路径)」(判据=doc-conventions §12.1「已写卡」证据项)——条目在登记段已存在,禁另立重复条目,防遗忘义务由状态承载;原「待编入/已编入/已开工/已入库」旧状态词停用,编入迭代后由编排段(iter-plan)记「已编迭代 N」;实现批完成入库后按待办清单退役规则整条删除。
|
|
||||||
- 需求卡片是中间文档:批入库后按「吸收即死」退役,结论迁现行事实源(GDD/待办清单/roadmap)。
|
|
||||||
- 开工令与执行归 /iter 技能(需求卡片统一经迭代编排执行,2026-10-25 用户裁:无迭代外执行通道);需求卡片写完呈用户裁决后才可开工。
|
|
||||||
@@ -16,22 +16,21 @@
|
|||||||
|
|
||||||
## 运行与验证(工作目录 = 含 project.godot 的切片目录)
|
## 运行与验证(工作目录 = 含 project.godot 的切片目录)
|
||||||
|
|
||||||
- **合回验证 = 前置检查 + 远端 CI(前置检查 2026-11-06 用户裁)**:主区 `git merge --no-ff` 落合并提交前,pre-merge-commit 钩子(`tools/hooks/pre-merge-commit`)自动跑 `tools/run_all_gates.sh --premerge`——冒烟测试+单元测试全套件(4 分片),热导入缓存约 2 分钟;红=合并提交不落(一律 git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff;禁 git commit 续合,该路径两合回钩子零触发),快进合并不触发钩子,`--no-verify` 可跳过且仅属用户。git merge 合回 master 落地后,post-merge 钩子(`tools/hooks/post-merge`)自动 `git push origin master` 触发远端 CI(Gitea Actions,runner=Mac 本机 host 模式,环境自举件=`tools/ci/mac_setup.sh`),工作流(`.gitea/workflows/ci.yml`)按改动域分流(分流算法单点=`tools/ci/domain_route.sh`):游戏码批=两域全量含渲染闸,文档批=文档域秒级闸,纯闸件/管线批=零触发。远端结果**按需现查**:`tools/ci_check.sh <合并提交>` 读该提交任务的 run `status`/`conclusion`,只呈报、不落盘(2026-11-04 用户裁:合回不等待、不唤醒;判据=run 落定后的终局态,且绿须坐实跑闸步真跑过——零触发批呈报「未验」不作绿证,细则=process-conventions §1 第 3 条)。**合回落地即向用户呈报本批总结并止回合**,禁前台 sleep/轮询等 CI。CI 红态不回滚合并——红项在案、修复批合回即再推再验追绿;开工先跑现查件读 CI 状态,红未修不开新批。同一份字节禁止第二次人手跑。`tools/run_all_gates.sh` 仍是全部验证闸的**唯一入口与唯一清单,域划分与选闸算法只写在它这一个地方**,文档禁另列清单;`--code`/`--docs`/`--quick` 是开发期改完即测的选档入口(细则见 process-conventions §4),全量档不替代它。**runner 依赖**:Mac 需开机在线(关机=远端任务排队延后);换机/重装按 `tools/ci/mac_setup.sh` 自举
|
- **合回验证 = 本地 CI(2026-10-30 用户裁)**:git merge 合回 master 落地后,post-merge 钩子(`tools/hooks/post-merge`)后台触发 `tools/ci_runner.sh` 跑一次全量域闸(调 `tools/run_all_gates.sh` 不带参数档,02 全套件),结果落 `game/tests/.gates/ci-status.json`(commit/绿红/红闸名单+关键日志行/耗时)+`ci-history.jsonl` 流水账;CI 红态下每个修复提交经 post-commit 钩子(`tools/hooks/post-commit`)自动追绿复验,绿态与无状态零触发——主区小批直提不重复跑全量,同一份字节禁止第二次人手跑。CI 红不回滚合并,红项在案、修复提交追绿;开工先读 CI 状态,红未修不开新批。跑批起手自动 `--editor --quit` 刷类名缓存(.godot 缓存不入 git,防合并后失配假红)。`tools/run_all_gates.sh` 仍是全部验证闸的**唯一入口与唯一清单,域划分与选闸算法只写在它这一个地方**,闸件增减与分域调整都只改它,文档禁另列清单;`--code`/`--docs`/`--quick` 手动档只服务开发期按域跑批(开发期窄测纪律见 process-conventions §6),不构成验收;全量回归由用户自发发起
|
||||||
- 单件直跑(=改完即测的最窄确认,其读数就是那一步的凭据;跨改动面的漏网由合回后远端全量档兜):冒烟测试 `python tools/run_smoke.py`(`game/tests/smoke_boot.tscn` 极小启动场景)· 系统测试 `python tools/run_system_test.py`(宿主 `game/tests/system_test.gd`)· 场景探针 `…console.exe --headless --path . res://probe/ui_probe.tscn` · 单元测试 `… --script res://tests/run_all.gd`
|
- 单件直跑(调试期最窄确认用,**不构成验收**):冒烟测试 `python tools/run_smoke.py`(`game/tests/smoke_boot.tscn` 极小启动场景)· 系统测试 `python tools/run_system_test.py`(宿主 `game/tests/system_test.gd`)· 场景探针 `…console.exe --headless --path . res://probe/ui_probe.tscn` · 单元与集成 `… --script res://tests/run_all.gd`
|
||||||
- 调参批量:`--script res://sim/adventure_monte_carlo.gd`(全冒险期望)· `res://sim/reward_expectation.gd`(奖励期望);关卡完成率/难度类测量一律走全冒险
|
- 调参批量:`--script res://sim/adventure_monte_carlo.gd`(全冒险期望)· `res://sim/reward_expectation.gd`(奖励期望);关卡完成率/难度类测量一律走全冒险
|
||||||
- 数值验证:`python tools/balance_verifier.py`(采集端 `res://sim/verifier_batch.gd`,报告与原始数据落 `sim-data/`)
|
- 数值验证:`python tools/balance_verifier.py`(采集端 `res://sim/verifier_batch.gd`,报告与原始数据落 `sim-data/`)
|
||||||
- 熵增闸(新类别 = 同批修订 Project Layout + 白名单):`python tools/repo_structure_audit.py`
|
- 熵增闸(新类别 = 同批修订 Project Layout + 白名单):`python tools/repo_structure_audit.py`
|
||||||
|
|
||||||
## Project Layout
|
## Project Layout
|
||||||
|
|
||||||
- `design/gdd/` — 系统与概念文档树(根索引 `02-系统清单.md`,文档增删必须同步)
|
- `design/gdd/` — 现行设计文档树(根索引 `02-系统清单.md`,文档增删必须同步;`gdd/ux/` 战斗画面与交互规格)
|
||||||
- `design/ux/` — 呈现实现设计规格层(屏级布局、交互规格与预览图;与 gdd/ 同级)
|
|
||||||
- `design/art/` — 美术文档(圣经/角色设计/两份清单/路径图/提示词库与生图操作单);只放 .md 与 `references/` 参考图,审计报告与调研归 `reports/`
|
- `design/art/` — 美术文档(圣经/角色设计/两份清单/路径图/提示词库与生图操作单);只放 .md 与 `references/` 参考图,审计报告与调研归 `reports/`
|
||||||
- `design/engineering/` — 工程规范(五份规约 + architecture + engine-reference)
|
- `design/engineering/` — 工程规范(五份规约 + architecture + engine-reference)
|
||||||
- `design/content-archive/` — 退役内容留底(活文档,2026-10-20 用户裁新立:内容已退役、留底供日后重新过准入;落内文件头部写明所属线)
|
- `design/content-archive/` — 退役内容留底(活文档,2026-10-20 用户裁新立:内容已退役、留底供日后重新过准入;落内文件头部写明所属线)
|
||||||
- `design/research/` **已退役(2026-10-21 用户裁)**——`design/` 全目录只放持久化设计文档与规范,调研/提案/评估/历史验收一律落 `reports/`(熵增闸退役路径清单已收该目录,再现即判红);`design/qa/` 已退役,验证截图不进 `design/`(判据见 doc-conventions §11)
|
- `design/research/` **已退役(2026-10-21 用户裁)**——`design/` 全目录只放持久化设计文档与规范,调研/提案/评估/历史验收一律落 `reports/`(熵增闸退役路径清单已收该目录,再现即判红);`design/qa/` 已退役,验证截图不进 `design/`(判据见 doc-conventions §11)
|
||||||
- `artwork/` — 在途图像素材唯一工作区(文档归文档/在途图归一处/终稿归游戏);整目录不入 git(.gitignore 强制),收口归档 `archive/`
|
- `artwork/` — 在途图像素材唯一工作区(文档归文档/在途图归一处/终稿归游戏);整目录不入 git(.gitignore 强制),收口归档 `archive/`
|
||||||
- `game/assets/art/` — 已验收终稿(入包被游戏加载);`game/probe/` — 场景探针的场景与宿主+探针共用面(probe_gate/render_gate 在闸+人工取证探针);`game/sim/` — 测量/诊断/模拟驱动件(autoplay 策略、MC 批量、数值验证采集端);`game/` — 游戏工程本体(代码 + tests/ 冒烟/单元/系统测试面)
|
- `game/assets/art/` — 已验收终稿(入包被游戏加载);`game/probe/` — 场景探针的场景与宿主+探针共用面(probe_gate/render_gate 在闸+人工取证探针);`game/sim/` — 测量/诊断/模拟驱动件(autoplay 策略、MC 批量、数值验证采集端);`game/` — 游戏工程本体(代码 + tests/ 冒烟/单元/集成/系统测试面)
|
||||||
- `sim-data/` — 机器读数据产物;数据件不入 git(入库例外 = README+analyze.py+growth_model.py);MC 锚与读数常驻留盘,无数值调整禁重跑
|
- `sim-data/` — 机器读数据产物;数据件不入 git(入库例外 = README+analyze.py+growth_model.py);MC 锚与读数常驻留盘,无数值调整禁重跑
|
||||||
- `tools/` — python 工具脚本(含 `hooks/`=版本化 git 钩子,经 `core.hooksPath` 挂载);`archive/` — 批次完结归档 zip(gitignored)
|
- `tools/` — python 工具脚本(含 `hooks/`=版本化 git 钩子,经 `core.hooksPath` 挂载);`archive/` — 批次完结归档 zip(gitignored)
|
||||||
- `reports/` — 过程件容器:**需求卡片**(写卡段产出,实现批的输入合同)+迭代批产出物(实现报告/GDD 反哺点清单)+设计讨论段过程稿(提案/审计/需求澄清/评估);**实现批唯一可写目录**,中间文档唯一容器(`design/research/` 已退役),不是事实源(细则见 `reports/README.md`)
|
- `reports/` — 过程件容器:**需求卡片**(写卡段产出,实现批的输入合同)+迭代批产出物(实现报告/GDD 反哺点清单)+设计讨论段过程稿(提案/审计/需求澄清/评估);**实现批唯一可写目录**,中间文档唯一容器(`design/research/` 已退役),不是事实源(细则见 `reports/README.md`)
|
||||||
@@ -41,52 +40,41 @@
|
|||||||
|
|
||||||
| 时机 | 权威文档 |
|
| 时机 | 权威文档 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 批次开工 / 流程纪律 | `design/engineering/process-conventions.md`——车道铁律(一切改动走独立 worktree,主区只作合并落点)、合回后远端 CI、五段流水线、批次清单、改完即测与 MC/闸机细则、像素纪律 |
|
| 批次开工 / 流程纪律 | `design/engineering/process-conventions.md`——车道铁律(主区直改+直提;大批约定走 worktree)、合回后本地 CI、五段流水线、批次清单、测试两入口与 MC/闸机细则、像素纪律 |
|
||||||
| 流水线段入口 | 技能对照——doc-design=文档设计(兼任反哺点落文)/asset-ingest=美术录入/req-card=写卡/iter-plan=迭代编排/iter=实现(五者均装于项目 `.zcode/skills/`);登记不立技能;批后收尾与中间文档退役=batch-closure(同一目录);格式与状态机权威=`design/engineering/doc-conventions.md` §12 |
|
| 流水线段入口 | 技能对照——doc-design=文档设计(兼任反哺点落文)/asset-ingest=美术录入/req-card=写卡/iter-plan=迭代编排/iter=实现(五者均装于项目 `.zcode/skills/`);登记不立技能;批后收尾与中间文档退役=batch-closure(同一目录);格式与状态机权威=`design/engineering/doc-conventions.md` §12 |
|
||||||
| 定代码方案 / 写代码 / 改代码前 | `design/engineering/code-conventions.md`——结构/契约/语言/数值/流程五类硬纪律(反例库 = 同目录 code-conventions-cases.md) |
|
| 定代码方案 / 写代码 / 改代码前 | `design/engineering/code-conventions.md`——结构/契约/语言/数值/流程五类硬纪律(反例库 = 同目录 code-conventions-cases.md) |
|
||||||
| 定测试方案 / 写测试 / 改测试前 | `design/engineering/test-conventions.md`——探针标配 / 回归断言 / 提交前验证 / 验收清单落码;测试工具手册与闸机操作=`game/tests/README.md` |
|
| 定测试方案 / 写测试 / 改测试前 | `design/engineering/test-conventions.md`——探针标配 / 回归断言 / 提交前验证 / 验收清单落码 |
|
||||||
| 定文档方案 / 写文档 / 改文档前 | `design/engineering/doc-conventions.md`——白话写作 / 载体分工 / 用语 / 结构骨架 / 会话记录与生命周期 |
|
| 定文档方案 / 写文档 / 改文档前 | `design/engineering/doc-conventions.md`——白话写作 / 载体分工 / 用语 / 结构骨架 / 会话记录与生命周期 |
|
||||||
| 概念切分与互链 | `design/engineering/concept-conventions.md`——概念封装 / 跨文档引用 / 归档与事实源 |
|
| 概念切分与互链 | `design/engineering/concept-conventions.md`——概念封装 / 跨文档引用 / 归档与事实源 |
|
||||||
| 系统设计 / 增删文档 | `design/gdd/02-系统清单.md`——根索引 + 中文规范名↔英文代号对照 |
|
| 系统设计 / 增删文档 | `design/gdd/02-系统清单.md`——根索引 + 中文规范名↔英文代号对照 |
|
||||||
| 架构(唯一事实源) | `design/engineering/architecture/architecture.md`(只写依赖规则面:分层/目录归属/数据流/架构原则;模块级归属归代码头注,闸清单归 `game/tests/README.md`)——历史决策沿革查 git commit log,不另设决策文档;修订须用户发令 |
|
| 架构(唯一事实源) | `design/engineering/architecture/architecture.md`——历史决策沿革查 git commit log,不另设决策文档 |
|
||||||
| 术语与已锁数值 | 规范名与定义 = `design/gdd/术语表.md`(全库唯一对照表,仅 owner 文档可修订);现行数值 = `game/data/tables/*.tres`;规则(概念面)= 各系统 owner 文档;取值域与字段契约 = `game/data/schemas/*.gd`。冲突须显式提出,禁默默改值 |
|
| 术语与已锁数值 | 规范名与定义 = `design/gdd/术语表.md`(全库唯一对照表,仅 owner 文档可修订);现行数值 = `game/data/tables/*.tres`;规则与取值域 = 各系统 owner 文档。冲突须显式提出,禁默默改值 |
|
||||||
| 现在做什么 / 待办与待裁 | 根 `roadmap.md` 顶部「当前位」节+迭代总表六列 · 待办唯一登记处 `待办清单.md` · 批次过程与结论查 git 提交信息与 `reports/` |
|
| 现在做什么 / 待办与待裁 | 根 `roadmap.md` 顶部「当前位」节+迭代总表六列 · 待办唯一登记处 `待办清单.md` · 批次过程与结论查 git 提交信息与 `reports/` |
|
||||||
|
|
||||||
## 回答风格规则(只管对话输出;文档写作归 doc-conventions §2–§4)
|
## 回答风格规则(只管对话输出;文档写作归 doc-conventions §2–§4)
|
||||||
|
|
||||||
### 核心原则(按优先级)
|
### 三条核心原则(按优先级)
|
||||||
|
|
||||||
1. **用词封闭**:对话里可用的词=日常汉语+用户先用过的+当场展开过的。展开=先完整描述再给短说法,描述交代三样:指什么对象、怎么运作、带来什么后果。短说法只认两个来源:用户用过的直接跟用;自己提议的必须等用户回话里用过一次才成立。项目文档定过名的词不豁免,对话里首次出现照样先展开。同物同名:同一东西从头到尾一个叫法,不换词;一个词不指两个东西。起名的固定顺序=先描述、再命名、后沿用,禁止颠倒。
|
1. 不自造黑话、不自创词语。项目文档已立名与行业通用词=已有词;其余必须引入时当场一句白话定义(三形态表与判据见 doc-conventions 第 4 节)。为省字压出的新短语按造词处理,宁可多两字用现成说法。
|
||||||
2. **判断挂依据**:判断=「X 是/不是/造成了/应该」类陈述;每个判断后面必须跟依据。依据只认三种:仓库文件+行号或逐字引用(给行号就必须真读过那几行);本对话的消息号或原话;外部链接。三种都拿不出的判断必须当场标「这是推测」;说不出依据就答「不知道/没查过」,禁止编造。答复形状=结论行→依据清单→细节。
|
2. 简洁。同一意思只说一遍;能用一句不说两句。硬约束、数字、前提条件不参与压缩;信息完整与简洁冲突时保信息。
|
||||||
3. **简洁**:同一意思只说一遍;能用一句不说两句。硬约束、数字、前提条件不参与压缩;信息完整与简洁冲突时保信息。
|
3. 介绍一个物体、一个概念、一个问题,多角度讲清楚;每角度信息点 ≤3 个,禁止违背第 2 条。
|
||||||
4. **多角度**:介绍一个物体、一个概念、一个问题,多角度讲清楚;每角度信息点 ≤3 个,禁止违背第 3 条。
|
|
||||||
5. **闸况呈报用闸名**:对话里报验证闸的跑批结果一律用闸名(冒烟测试/系统测试/单元测试/场景探针/渲染闸等),不裸报编号。
|
|
||||||
|
|
||||||
### 简洁细则
|
### 简洁细则
|
||||||
|
|
||||||
- 禁换说法重复:同一判断换个措辞再说一遍=违规。依据与展开不算重复——依据是支撑判断的材料,展开是第一次给出来历,都是新信息。
|
- 禁换说法重复:同一判断换个措辞再说一遍 = 违规。
|
||||||
- 禁铺垫、过渡句、客套话、总结句。认领责任的一句(如「是我的失误」)不算客套;所禁是铺垫与重复道歉。
|
- 禁铺垫、过渡句、客套话、总结句。认领责任的一句(如「是我的失误」)不算客套;所禁是铺垫与重复道歉。
|
||||||
- 禁填充句式:其实/说白了/本质上来说——直接给结论。
|
- 禁填充句式:其实/说白了/本质上来说——直接给结论。
|
||||||
- 短句为主,一行一个意思;一句只说一件事。装不下拆成短句,不算啰嗦。
|
- 短句为主,一行一个意思;装不下拆成短句,不算啰嗦。
|
||||||
- 答完即止。所禁是无新信息的客套邀约;回答含待用户决断的分叉或待授权动作时,末尾一句决策请求不受限。
|
- 答完即止。所禁是无新信息的客套邀约;回答含待用户决断的分叉或待授权动作时,末尾一句决策请求不受限。
|
||||||
|
|
||||||
### 多角度细则
|
### 多角度细则
|
||||||
|
|
||||||
- 触发:解释概念、评估方案、回答「X 好不好」。事实型问题判据=答案能否一句装下:装得下一句直答;装不下按格式优先级上清单,不算硬凑角度。
|
- 触发:解释概念、评估方案、回答「X 好不好」。事实型问题判据=答案能否一句装下:装得下一句直答;装不下按格式优先级上清单,不算硬凑角度。
|
||||||
- 评估与呈报类第一行=结论行:判断+一句主理由;结论行之后必须紧跟依据清单(核心原则第 2 条),依据不齐不出结论;角度列表随后。
|
- 评估与呈报类第一行=结论行:判断+一句主理由;角度列表随后。
|
||||||
- 角度池(示例集非封闭集,按问题选 2~5 个;机制与流程题可自造稳定轴命名):现状(现在是什么、缺什么)· 本质(是什么、解决什么)· 代价(要什么前提)· 边界(何时不成立)· 对比(与替代方案差异)· 风险(最常见失败方式)。
|
- 角度池(示例集非封闭集,按问题选 2~5 个;机制与流程题可自造稳定轴命名):现状(现在是什么、缺什么)· 本质(是什么、解决什么)· 代价(要什么前提)· 边界(何时不成立)· 对比(与替代方案差异)· 风险(最常见失败方式)。
|
||||||
- 每个角度=关键词+一个判断+至多一句理由;角度里的判断按核心原则第 2 条挂依据。
|
- 每个角度 = 关键词 + 一个判断 + 至多一句理由。
|
||||||
- 角度之间用编号,不用「另外、此外、同时」串联。
|
- 角度之间用编号,不用「另外、此外、同时」串联。
|
||||||
|
|
||||||
### 交出前自检
|
|
||||||
|
|
||||||
长答复(三段以上或含多个判断)交出前过一遍清单:一、每个判断都挂依据了吗?二、每个非日常汉语的词都先展开了吗?三、有没有只有自己知道来路的内容?哪项不过改哪项,改完再交。自检不产出一节文字,产出是改过的答复本身;用户质疑时必须能复述自检过程。
|
|
||||||
|
|
||||||
### 重讲与改写工具
|
|
||||||
|
|
||||||
- 把一个主题讲成零基础图解:/eli5。
|
|
||||||
- 简明技术中文(STC)技能:限定用词与句式的中文写法规范,含词表与检查脚本;写或改写中文技术说明、把回答改写得更清楚时调用(/simplified-technical-chinese)。核心原则第 1 条是它的对话面最小集。
|
|
||||||
|
|
||||||
### 格式优先级
|
### 格式优先级
|
||||||
|
|
||||||
能画图的内容一律画图说明,图是第一优先载体;枚举用列表,二维对照用表格;散文是最后手段。
|
能画图的内容一律画图说明,图是第一优先载体;枚举用列表,二维对照用表格;散文是最后手段。
|
||||||
@@ -95,7 +83,7 @@
|
|||||||
|
|
||||||
**判据**:描述含多个实体、实体间有明确关系(先后顺序、包含、依赖、状态转移、布局对比)的内容时,直接画图说明,不写长段文字;单点事实(一句装得下)不画,纯数据对照用表格。
|
**判据**:描述含多个实体、实体间有明确关系(先后顺序、包含、依赖、状态转移、布局对比)的内容时,直接画图说明,不写长段文字;单点事实(一句装得下)不画,纯数据对照用表格。
|
||||||
|
|
||||||
**载体**:用 diagram-design 技能出 HTML/SVG 内联交付(流程/状态/结构/实体关系与空间对比、像素级示意、界面草图同一通道),大图精修与导出用 archify 技能;查看端不支持内联渲染时用字符画。
|
**载体**:默认用 visualize 技能出 HTML/SVG(会话内联渲染,表现力优先),流程/状态/结构/实体关系与空间对比、像素级示意、界面草图同一通道;查看端不支持内联渲染时退回 Mermaid 代码块,仍不行用字符画。
|
||||||
|
|
||||||
**边界**:硬数值与前提条件留在文字里,图不承载唯一数值依据;图与文禁重复说同一件事,文字只留图说不清的部分。
|
**边界**:硬数值与前提条件留在文字里,图不承载唯一数值依据;图与文禁重复说同一件事,文字只留图说不清的部分。
|
||||||
|
|
||||||
@@ -105,13 +93,12 @@
|
|||||||
|
|
||||||
## 硬性红线(勿违反;操作细则在 process-conventions.md 与各规约)
|
## 硬性红线(勿违反;操作细则在 process-conventions.md 与各规约)
|
||||||
|
|
||||||
- 车道铁律(2026-10-31 用户裁恢复)——主工作区只作合并落点,一切开发/设计改动走独立 worktree:`git worktree add ../g-plan2-<任务名> -b <任务分支>`(建区即跑 `tools/setup_worktree_userdir.sh`),收口=冻结→件核→并 master→重塑→主区 `git merge --no-ff`→删区(合回即删,2026-09-19 原裁),CI 红不回滚合并——新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复合回追绿;会话单区(2026-11-04 用户裁)——同一时刻每会话至多一个 worktree 在役,同会话追加事项并入在役区、只做一次合入(一次 CI),合回后用户再发令=新回合另开区,迭代实现批独占回合(细则见 process-conventions §1 第 5 条);主区唯一合法写动作=合并,agent 侧由 worktree-guard 拦主区 Edit/Write 与一切 git commit;豁免面仅 `.zcode/`、`.qoder/`(不入 git,主区直改);commit 点零钩子检查(pre-commit 直改闸已退役);合回 merge 点另有前置检查钩子(pre-merge-commit,2026-11-06 用户裁,见「运行与验证」首条);全量验证归合回后远端 CI(post-merge 钩子推送触发,见「运行与验证」首条);`--no-verify` 仅属用户,agent 禁用(细则见 process-conventions §1)
|
- 车道铁律(判据与改动域划分同一,按文件性质切;2026-10-30 用户裁本地 CI 化)——一切面(含代码面 `game/` 下非 `.md` 的行为载体与 `.zcode/`、`.qoder/` 等不入 git 面)主工作区直改+直提;commit 点由 git pre-commit 钩子(`tools/hooks/pre-commit`,`core.hooksPath` 挂载)现场跑文档域闸,绿落地红拦,合并收尾提交跳过(归合回后 CI);代码面全量验证归合回后本地 CI(`tools/hooks/post-merge` 触发,见「运行与验证」首条);大批次(迭代实现批等)按约定仍走独立 worktree(冻结→件核→并 master→重塑→主区合回→CI 验证),约定非强制;`--no-verify` 仅属用户,agent 禁用(细则见 process-conventions §1)
|
||||||
- **仓库根禁止设会话状态文件**(`active.md` 已废除)——现状看 roadmap「当前位」,待办看待办清单,过程看 git 提交信息,产出物看 `reports/`;任何文档禁止另设「当前状态快照」节,两处记同一件事必然漂移(细则见 doc-conventions 第 10 节)
|
- **仓库根禁止设会话状态文件**(`active.md` 已废除)——现状看 roadmap「当前位」,待办看待办清单,过程看 git 提交信息,产出物看 `reports/`;任何文档禁止另设「当前状态快照」节,两处记同一件事必然漂移(细则见 doc-conventions 第 10 节)
|
||||||
- **改完即测铁规(2026-11-05 用户裁,取代原「测试执行两入口铁规」)**——任何会话里的任何改动,落笔之后立刻跑一遍覆盖该改动面的验证并跑绿、读数写进这一步的提交信息,这一步才算完成;验证载体一律按 `tools/run_all_gates.sh` 的域划分与该件自身的直跑方式,不扩出改动面、不请示、不等点名,未改动的面不测,合回后远端 CI 的全量跑批不替代本条。读数类采集(MC/verifier)不在该域划分内,不属本条义务
|
- 测试执行两入口铁规——只有迭代 loop 开发与用户点名两个触发入口;其余会话零测试,需测试支撑先请示并注明未跑测
|
||||||
- **红账不清不开新批**——上一批远端跑批有真红未闭合不开新批;假红(导入缓存、user 目录未隔离那类在册环境坑)走异常分级处置,不算未闭合
|
- 合回后验证 = 本地 CI 全量域闸全绿(唯一强制验证点;唯一入口、唯一闸清单、唯一域划分与选闸算法仍只在 `tools/run_all_gates.sh`,禁在文档另列;触发与追绿语义见「运行与验证」首条与 process-conventions §1)。开发期手动跑批按需选档(`--code` 关联档选测——02 跑「卡片申报 ∪ diff 推导」并集套件、三件保险恒跑、横切面回落全量——算法只在闸脚本内定义),手动跑不构成验收;全量回归由用户自发发起。文档面直改批验收=commit 点 git 钩子自动跑 `--docs`(process-conventions §1)
|
||||||
- 合回后验证 = 远端 CI 闸全绿(唯一强制**全量**验证点;唯一入口、唯一闸清单、唯一域划分与选闸算法仍只在 `tools/run_all_gates.sh`,禁在文档另列;触发与追绿语义见「运行与验证」首条与 process-conventions §1)。它兜的是跨改动面的漏网,不替代改完即测铁规;主动发起的跨域全量回归归用户。分流算法单点=`tools/ci/domain_route.sh`
|
- **改动四类**——**需求改动**(游戏代码,含随逻辑写/改的测试代码):唯一走「写需求卡片+编入迭代批次」通道;迭代实现批禁写 `design/` 整个目录、两份根流程清单(`待办清单.md`/`体验验证清单.md`)与 `game/tests/README.md`(能力清单,归写卡段维护)(含新增/修改/删除),设计文档对它只读、是写测试与实现代码的输入依据;两份流程清单的条目状态只由流水线各段推进,实现批禁止顺手改;产出物只准写 `reports/`;合回后由本地 CI 全量验证(红项修复提交追绿,process-conventions §1)。**工程改动**(tools/、闸件、模拟测量工具、纯测试维护——不改变游戏行为的配套代码)、**文档设计改动**、**美术素材改动**:不写需求卡片、不编迭代批次,由用户发令在主工作区直改+直提(commit 点 git 钩子自动跑文档域闸);大体量改动(含触及代码面的工程改动如纯测试维护)按约定走 worktree 批(非强制);文档设计类写入走 doc-design 技能(登记条目格式由流水线闸强制)
|
||||||
- **改动四类**——**需求改动**(游戏代码,含随逻辑写/改的测试代码):唯一走「写需求卡片+编入迭代批次」通道;迭代实现批禁写 `design/` 整个目录、两份根流程清单(`待办清单.md`/`体验验证清单.md`)与 `game/tests/README.md`(能力清单,归写卡段维护)(含新增/修改/删除),设计文档对它只读、是写测试与实现代码的输入依据;两份流程清单的条目状态只由流水线各段推进,实现批禁止顺手改;产出物只准写 `reports/`;合回后由远端 CI 验证(红项修复合回追绿,process-conventions §1)。**工程改动**(tools/、闸件、模拟测量工具、纯测试维护——不改变游戏行为的配套代码)、**文档设计改动**、**美术素材改动**:不写需求卡片、不编迭代批次,由用户发令走独立 worktree 直改+合回(车道铁律,commit 点零钩子检查);大体量改动(含触及代码面的工程改动如纯测试维护)同车道无特殊通道;文档设计类写入走 doc-design 技能(登记条目格式由流水线闸强制)
|
- 五段流水线铁律——**需求改动**(游戏代码)按「登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现」五段推进,段间不自动流转、每段转进由用户发令;编入迭代的卡片必须设计闭合+零待裁点——需求卡片任何工作量皆可写、皆可编入迭代,工作量限制只属迭代层(迭代估时总量 <5 个工作日=「冻结待凑批」、不可开工);流水线闸 `tools/pipeline_gate.py` 强制(已注册进 run_all_gates.sh 文档域);实现段零裁断——卡片没写清=上游缺陷,停该卡退回上游,禁内联求裁(process-conventions §2,格式与状态机=doc-conventions §12)。工程/文档设计/美术素材三类改动不走写卡与编排段:(如需设计讨论)→ 用户发令直改 → 主区直改+commit 点闸(车道细则=process-conventions §1)
|
||||||
- 五段流水线铁律——**需求改动**(游戏代码)按「登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现」五段推进,段间不自动流转、每段转进由用户发令;编入迭代的卡片必须设计闭合+零待裁点+卡内复核记录在位(2026-11-05 用户立规:复核发现按四类去向处置——自判/补写/待裁/退回上游,只有后两类归用户;复核没跑完禁对用户称完成,细则=req-card 技能「复核发现四类分流」与「写卡段的完成判据与呈报口径」)——需求卡片任何工作量皆可写、皆可编入迭代,工作量限制只属迭代层(迭代估时总量 <5 个工作日=「冻结待凑批」、不可开工);流水线闸 `tools/pipeline_gate.py` 强制(已注册进 run_all_gates.sh 文档域);实现段零裁断——卡片没写清=上游缺陷,停该卡退回上游,禁内联求裁(process-conventions §2,格式与状态机=doc-conventions §12)。工程/文档设计/美术素材三类改动不走写卡与编排段:(如需设计讨论)→ 用户发令 → 独立 worktree 直改 → 合回 CI(车道细则=process-conventions §1)
|
|
||||||
- MC/模拟:无数值改动零跑;档位硬闸见 `sim-data/README.md`「MC 采集档位表」,一档只能由用户发起
|
- MC/模拟:无数值改动零跑;档位硬闸见 `sim-data/README.md`「MC 采集档位表」,一档只能由用户发起
|
||||||
- 闸机轮次纪律:新码先孤立验证 → 出红只跑红件最小单元 → 长批先最小参数试车 → 开工扫坑册(process-conventions §6)
|
- 闸机轮次纪律:新码先孤立验证 → 出红只跑红件最小单元 → 长批先最小参数试车 → 开工扫坑册(process-conventions §6)
|
||||||
- **验收闭合**——每个需求点与每个行为改动都要有从真实入口进入的验收断言,可 grep 定位、在当轮真实跑批中执行并通过,判据绑被测改动特有的可观测提交面;**禁变异类测试与撤销类取证**(2026-10-24/2026-10-28 用户裁——人为制造红属伪造证据),证明做不出=停卡呈报;禁删断言/放宽阈值换绿;合回前独立验收审计未过则禁止合并(细则=test-conventions §8+iter 技能第 5 步)
|
- **验收闭合**——每个需求点与每个行为改动都要有从真实入口进入的验收断言,可 grep 定位、在当轮真实跑批中执行并通过,判据绑被测改动特有的可观测提交面;**禁变异类测试与撤销类取证**(2026-10-24/2026-10-28 用户裁——人为制造红属伪造证据),证明做不出=停卡呈报;禁删断言/放宽阈值换绿;合回前独立验收审计未过则禁止合并(细则=test-conventions §8+iter 技能第 5 步)
|
||||||
@@ -122,7 +109,7 @@
|
|||||||
- 文件头 = `##` 文档注释,介绍本模块是什么;禁写变更叙事(改动史查 git log);禁文档反向链接(code-conventions §1.4.1)
|
- 文件头 = `##` 文档注释,介绍本模块是什么;禁写变更叙事(改动史查 git log);禁文档反向链接(code-conventions §1.4.1)
|
||||||
- 数值单一事实源——玩法数值只存 `data/tables/`(.tres)经 ConfigDB 单点读取;禁数值字面量与自建 `load()` 表路径
|
- 数值单一事实源——玩法数值只存 `data/tables/`(.tres)经 ConfigDB 单点读取;禁数值字面量与自建 `load()` 表路径
|
||||||
- RNG 单点——禁 `randomize()`/自建 RandomNumberGenerator,随机只经 `RngService` 统一流
|
- RNG 单点——禁 `randomize()`/自建 RandomNumberGenerator,随机只经 `RngService` 统一流
|
||||||
- 架构事实唯一源——架构事实只认 `design/engineering/architecture/architecture.md`(只写依赖规则面:分层/目录归属/数据流/架构原则;模块级归属归代码头注);禁立第二架构文档或决策文档体系,历史决策记录只进 git commit log;架构文档写权限=用户专属,agent 与技能只读(2026-11-07 用户裁)
|
- 架构事实唯一源——架构事实只认 `design/engineering/architecture/architecture.md`;禁立第二架构文档或决策文档体系,历史决策记录只进 git commit log
|
||||||
- Core 层零 UI 依赖——完整战斗必须可 `--headless --script` 跑通;fail-fast——数据校验错误一律致命中止,无软回退
|
- Core 层零 UI 依赖——完整战斗必须可 `--headless --script` 跑通;fail-fast——数据校验错误一律致命中止,无软回退
|
||||||
- spec-AC 一致性——规约与验收标准禁止在同一输入上给出不同答案;评审隔离——`/design-review` 必须独立会话跑(与 `/design-system` 隔离)
|
- spec-AC 一致性——规约与验收标准禁止在同一输入上给出不同答案;评审隔离——`/design-review` 必须独立会话跑(与 `/design-system` 隔离)
|
||||||
- 像素结构件——先抄后造、验收写成像素级判据、±1px 坐标推导(process-conventions 第 7 节)
|
- 像素结构件——先抄后造、验收写成像素级判据、±1px 坐标推导(process-conventions 第 7 节)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# 美术资源依赖清单(Art Assets Checklist)
|
# 美术资源依赖清单(Art Assets Checklist)
|
||||||
|
|
||||||
> **性质**:表现层升级批与战斗表现批的生产侧清单——把散在战斗表现 / HUD框架 / 关卡节点地图 / 敌人系统里的资产需求收拢成一张可执行的工单视图,**兼资产维度单一登记处**。**规范效力归各 owner 文档**(战斗表现、美术圣经、04-美术音频方向),本文只补「生产视角的需求规格」,冲突时以 owner 文档为准。
|
> **性质**:表现层升级批与战斗表现批的生产侧清单——把散在战斗表现 / HUD框架 / 关卡节点地图 / 敌人系统里的资产需求收拢成一张可执行的工单视图,**兼资产维度单一登记处**。**规范效力归各 owner 文档**(战斗表现、美术圣经、04-美术音频方向),本文只补「生产视角的需求规格」,冲突时以 owner 文档为准。
|
||||||
> **建立**:场景一(战斗画面呈现)讨论产物;本文为唯一清单。历次修订明细见 git 提交史。
|
> **建立**:场景一(战斗画面呈现)讨论产物;原 asset-checklist.md 并入本文后删除,本文为两份清单合并后的唯一清单。历次修订明细见 git 提交史。
|
||||||
> **更新纪律**:各条目「现状」行顺带更新(未开始 / 候选已出 / 已裁决 / 已交付);做完不删条目,改状态。与待办清单的联动:本文是资产维度明细,待办清单只留指路存根。
|
> **更新纪律**:各条目「现状」行顺带更新(未开始 / 候选已出 / 已裁决 / 已交付);做完不删条目,改状态。与待办清单的联动:本文是资产维度明细,待办清单只留指路存根。
|
||||||
|
|
||||||
## 0. 生产渠道、规格与风格宪法
|
## 0. 生产渠道、规格与风格宪法
|
||||||
@@ -11,13 +11,13 @@
|
|||||||
| 渠道 | 出什么 | 先例 |
|
| 渠道 | 出什么 | 先例 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| ♻ **素材站复用(轻改)** | UI 九宫格面板与按钮、字体、通用粒子与光效、通用图标、无缝纹理底噪 | 来源偏好 CC0(如 Kenney 全站、OpenGameArt 标 CC0 件、itch.io 免费包) |
|
| ♻ **素材站复用(轻改)** | UI 九宫格面板与按钮、字体、通用粒子与光效、通用图标、无缝纹理底噪 | 来源偏好 CC0(如 Kenney 全站、OpenGameArt 标 CC0 件、itch.io 免费包) |
|
||||||
| ✦ **ComfyUI(用户自跑)** | 角色、插画级素材;每个敌种/主角建议出 **2–3 版候选**供裁决,不直接出终稿 | 主角站姿样张(脚本管线产物,源文件已清理);提示词规格卡 art-prompts.md(按美术圣经 §5 现行重生成) |
|
| ✦ **ComfyUI(用户自跑)** | 角色、插画级素材;每个敌种/主角建议出 **2–3 版候选**供裁决,不直接出终稿 | 主角站姿样张(脚本管线产物,源文件已清理);提示词规格卡 art-prompts.md **v2.0**(按美术圣经 §5 现行重生成) |
|
||||||
| ⚙ **脚本管线(代理出)** | 图标、格面、样张类精度资产 | 格面占位渲染与程序化徽标(现行) |
|
| ⚙ **脚本管线(代理出)** | 图标、格面、样张类精度资产 | 格面占位渲染与程序化徽标(现行) |
|
||||||
|
|
||||||
**通用规格纪律**:
|
**通用规格纪律**:
|
||||||
|
|
||||||
- 交付格式 PNG 透明底;动画用序列帧或精灵表(SpriteFrames),帧数规格随样张定(候选档已成文 art-bible §8.4)。命名规范候选草案见 art-bible §8.3。
|
- 交付格式 PNG 透明底;动画用序列帧或精灵表(SpriteFrames),帧数规格随样张定(候选档已成文 art-bible §8.4)。命名规范候选草案见 art-bible §8.3。
|
||||||
- **分辨率档位已定案:1280×800 + 1920×1080 两档**,窗口不可调、格边长按档位计算,后续调整走修订;像素画布基准见 **art-bible §8.2**(棋盘小人 32×32 二头身独立源档;站桩立绘=原稿分辨率入包、显示按三档绝对高 96/144/188 缩放,定值单点与逐件归档见 §8.2 站桩立绘显示档条)。
|
- **分辨率档位已定案:1280×800 + 1920×1080 两档**,窗口不可调、格边长按档位计算,后续调整走修订;像素画布基准见 **art-bible §8.2**(主角人设原图 48×72〔人设侧画布〕;站桩立绘/战斗状态图源高 48;棋盘小人 32×32 二头身;敌种逐键源档 36–94;整数倍缩放纪律;终值归样张冻结,待办清单已登记)。
|
||||||
- 程序化占位是现行结构冻结条款:资产未就位的槽位保持占位渲染,不空窗。
|
- 程序化占位是现行结构冻结条款:资产未就位的槽位保持占位渲染,不空窗。
|
||||||
- **复用闸(♻ 渠道四道验收,一道不过不入包)**:① 色板量化——改色对齐 art-bible §4.1 token,不保留原包杂色;② 吸色检查——无 HSV 色相 300°–345°(紫赤禁入带);③ 灰度/色弱可辨——去色相后仍可辨且不与语义件混淆;④ 授权干净——CC0 优先,CC-BY 署名记入设置/关于页,license 不明的一律不用。
|
- **复用闸(♻ 渠道四道验收,一道不过不入包)**:① 色板量化——改色对齐 art-bible §4.1 token,不保留原包杂色;② 吸色检查——无 HSV 色相 300°–345°(紫赤禁入带);③ 灰度/色弱可辨——去色相后仍可辨且不与语义件混淆;④ 授权干净——CC0 优先,CC-BY 署名记入设置/关于页,license 不明的一律不用。
|
||||||
|
|
||||||
@@ -26,12 +26,12 @@
|
|||||||
| 条款 | 对出图的具体要求 |
|
| 条款 | 对出图的具体要求 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 一句话视觉规则 | 明快的地牢,轻快的扫荡,仔细的推理——**明亮像素幻想,全年龄,非暗黑**,角色 2~3 头身 |
|
| 一句话视觉规则 | 明快的地牢,轻快的扫荡,仔细的推理——**明亮像素幻想,全年龄,非暗黑**,角色 2~3 头身 |
|
||||||
| 原则一「预告上格」 | 格内绘制优先级 **浮空数字与引导线(最顶)> 小人 > 封印印记 > 交互反馈 > 变异纹带 > 装饰变体 > 底色**;北侧贴花低于小人、南侧随岩体在前;任何元素禁止遮挡浮空数字与引导线;类型微光为底效泛光层,不入遮挡栈 |
|
| 原则一「预告上格」 | 格内绘制优先级 **数字(含色牌)> 小人 > 封印印记 > 变异纹带 > 装饰变体 > 底色**;任何元素禁止遮挡数字字形区;类型微光为底效泛光层,不入遮挡栈 |
|
||||||
| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;浮空数字暖白芯+2px 深墨描边(art-bible §3.2/§4.1);普通数字色牌退役(封印格身份字形色牌保留);未开格底亮度地板与饱和上限同 §4.1(门值定值面=互辨抽测件) |
|
| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;数字亮墨直画已开格底(亮墨 L≥0.75 / 已开格底 L 0.08–0.14,art-bible §4.1),对比 ≥4.5:1;色牌 `#F5EAD3` 为复杂格底后备(牌上深墨 L≤0.027);未开格底 L≥0.30、HSV 饱和 ≤0.55 |
|
||||||
| 原则三「一砖一世界」 | 变体优先换色板不加新资产;危险状态必须**形状+颜色双通道**(色弱灰度可辨) |
|
| 原则三「一砖一世界」 | 变体优先换色板不加新资产;危险状态必须**形状+颜色双通道**(色弱灰度可辨) |
|
||||||
| 类型预读单通道(§4.6.3) | 未开格 = **类型常显微光**(五组色带 §4.2:芥末黄/黄绿/青/紫罗兰/绯红,色相+明度双码,避 300°–345° 禁入带,样张冻结);不呈现极性、不泄危险格与安全格(角嵌形状通道已不存在——微光格只留微光) |
|
| 类型预读单通道(§4.6.3) | 未开格 = **类型常显微光**(五组色带 §4.2:芥末黄/黄绿/青/紫罗兰/绯红,色相+明度双码,避 300°–345° 禁入带,样张冻结);不呈现极性、不泄危险格与安全格(角嵌形状通道已不存在——微光格只留微光) |
|
||||||
| 剪影哲学(§5.1) | **所有角色自带轮廓通道:亮色描边+落影底盘**,识别不依赖背景;四类原型见各条目 |
|
| 剪影哲学(§5.1) | **所有角色自带轮廓通道:亮色描边+落影底盘**,识别不依赖背景;四类原型见各条目 |
|
||||||
| 语义色规则(§4.2) | 红只说危险、金只说收益、蓝只说己方(各语义色定值面=ui_kit,art-bible §4.1);封印印记现行色 = 封印黑(色史归 art-bible §4.1);**紫赤为 Boss 独占,高饱和紫赤域全场禁入带**(带域定值面=互辨抽测件;微光群伤组绯红为类型先验色带域,例外见 §4.2) |
|
| 语义色规则(§4.2) | 红只说危险(危险红 `#A8321F` 单档)、金只说收益(`#F0A828`)、蓝只说己方(`#2E86DE`);封印印记现行色 = 封印黑 `#000000`(色史归 art-bible §4.1);**紫赤 `#8F2F6A` 为 Boss 独占,HSV 色相 300°–345° 全场禁入带**(微光群伤组绯红为类型先验色带域,例外见 §4.2) |
|
||||||
| UI 形状语法(§7.1,§3.3 存方向指导) | 半拟物:面板=石板圆角矩形(与地砖同圆角率),按钮=可按的砖,仪式确认=圆形蜡封;数据区直角细线无纹理 |
|
| UI 形状语法(§7.1,§3.3 存方向指导) | 半拟物:面板=石板圆角矩形(与地砖同圆角率),按钮=可按的砖,仪式确认=圆形蜡封;数据区直角细线无纹理 |
|
||||||
|
|
||||||
**参考图**:`design/art/references/` 三款×2 张(Into the Breach / Moonlighter / Peglin,与圣经点名池一一对应;gungeon 已退场,反面条款见 art-bible §9.2;正面取/弃与反面条款已成文 art-bible §9,反面图证待素材生成后增补)。
|
**参考图**:`design/art/references/` 三款×2 张(Into the Breach / Moonlighter / Peglin,与圣经点名池一一对应;gungeon 已退场,反面条款见 art-bible §9.2;正面取/弃与反面条款已成文 art-bible §9,反面图证待素材生成后增补)。
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
### 1.1 格子样张(砖面形态定稿闸)⚙
|
### 1.1 格子样张(砖面形态定稿闸)⚙
|
||||||
|
|
||||||
- **要什么**:一张按 art-bible §1.4 参数画成的格子风格试验图。**内容清单与验收四项以 art-bible §1.4 为唯一定义处**(含类型微光呈现组),本条只登记生产视角差异:图类型色板变体组至少两套、样张含至少一处砖缘/岛缘厚度与一格装饰立牌示例(§3.2 呈现基准)。
|
- **要什么**:一张按 art-bible §1.4 参数画成的格子风格试验图。**内容清单与验收四项以 art-bible §1.4 为唯一定义处**(含类型微光呈现组),本条只登记生产视角差异:图类型色板变体组至少两套、样张含至少一处砖缘/岛缘厚度与一格装饰立牌示例(§3.2 呈现基准)。
|
||||||
- **风格/规格**:棋盘三关八色取 art-bible §4.1「三关棋盘环境八色」;语义岗 token 取 ui_kit 常量组(封印黑、危险红、奖励金、小人蓝;普通数字色牌退役,封印格身份字形色牌保留)。
|
- **风格/规格**:色板 token 直接取 §4.1(掩尘 `#C9AF83`、裸土 `#B39A78`、数字墨三档、封印黑、危险红、奖励金、小人蓝、数字色牌)。
|
||||||
- **验收**:art-bible §1.4 四项按序判定(数字可读性 WCAG ≥4.5:1 硬指标 → 格态三形与微光互辨灰度可辨 → 焦点预算 → 图类型换皮抽测)。**通过 = 砖面形态与色板冻结**。
|
- **验收**:art-bible §1.4 四项按序判定(数字可读性 WCAG ≥4.5:1 硬指标 → 格态三形与微光互辨灰度可辨 → 焦点预算 → 图类型换皮抽测)。**通过 = 砖面形态与色板冻结**。
|
||||||
- **来源**:⚙ 脚本管线自产——样张是验收闸本身,必须按圣经参数画,无复用意义。
|
- **来源**:⚙ 脚本管线自产——样张是验收闸本身,必须按圣经参数画,无复用意义。
|
||||||
- **现状**:验收标准已成文,**测试未跑**。
|
- **现状**:验收标准已成文,**测试未跑**。
|
||||||
@@ -53,20 +53,20 @@
|
|||||||
- **要什么**:按双舞台布局(战斗画面与扫雷图同屏常驻)出的整屏试验图。要锁的四件事:**角色剪影方向 / 动画方案 / 战斗空间 / 敌人层绘制优先级插入位置**;**敌种呈现形态已裁决:全站桩式(主角同站桩、状态小图标挂血条下),卡片式已弃,正式样张按站桩形态单版出样**。
|
- **要什么**:按双舞台布局(战斗画面与扫雷图同屏常驻)出的整屏试验图。要锁的四件事:**角色剪影方向 / 动画方案 / 战斗空间 / 敌人层绘制优先级插入位置**;**敌种呈现形态已裁决:全站桩式(主角同站桩、状态小图标挂血条下),卡片式已弃,正式样张按站桩形态单版出样**。
|
||||||
- **风格/规格**:敌人剪影按 art-bible §5.1 四类原型出(见 2.2);战斗舞台背景=明亮地窟,紫赤仅 Boss;像素尺寸按已定案两档换算(见 §0 通用规格纪律)。
|
- **风格/规格**:敌人剪影按 art-bible §5.1 四类原型出(见 2.2);战斗舞台背景=明亮地窟,紫赤仅 Boss;像素尺寸按已定案两档换算(见 §0 通用规格纪律)。
|
||||||
- **验收**:战斗表现「一屏样张的验收标准」(已成文)。
|
- **验收**:战斗表现「一屏样张的验收标准」(已成文)。
|
||||||
- **联动**:样张未过,**不启动任何终稿资产与动画设计**(文档明文的排期硬前置);格边长的计算口径不在本清单——现行唯一出处是 [battle.md](../ux/battle.md)「棋盘格尺寸公式」,HUD框架只判装板可行性(固定两档分辨率、窗口不可调、格子量增加则格边长相应变小;**档位值已定案 1280×800 + 1920×1080**)。
|
- **联动**:样张未过,**不启动任何终稿资产与动画设计**(文档明文的排期硬前置);格边长的计算口径不在本清单——现行唯一出处是 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」,HUD框架只判装板可行性(固定两档分辨率、窗口不可调、格子量增加则格边长相应变小;**档位值已定案 1280×800 + 1920×1080**)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. P1 —— 角色级(样张通过后开工,ComfyUI)
|
## 2. P1 —— 角色级(样张通过后开工,ComfyUI)
|
||||||
|
|
||||||
> 提示词规格卡 art-prompts.md 现行为 **v2.15**(主角三态+八敌种逐卡提示词仍在册;站桩立绘走 §5.4 按档派生、不重画)。
|
> 提示词规格卡 art-prompts.md 现行为 **v2.0**(主角三态+八敌种,逐资产自包含完整提示词,整段可直贴)。
|
||||||
|
|
||||||
### 2.1 主角战斗小人
|
### 2.1 主角战斗小人
|
||||||
|
|
||||||
- **要什么**:待机 / 攻击 / 受击 三态起步(移动态样张后定);透明底 PNG。
|
- **要什么**:待机 / 攻击 / 受击 三态起步(移动态样张后定);透明底 PNG。
|
||||||
- **风格/规格**:小人原型——**窄、直立、对称,轮廓凹凸 ≤2**;2~3 头身两档下剪影均成立;主色小人蓝 `#2E86DE`(候选值,样张冻结终稿);格内占位最窄、不吞数字位。
|
- **风格/规格**:小人原型——**窄、直立、对称,轮廓凹凸 ≤2**;2~3 头身两档下剪影均成立;主色小人蓝 `#2E86DE`(候选值,样张冻结终稿);格内占位最窄、不吞数字位。
|
||||||
- **来源**:✦ ComfyUI(prompt 卡 §2);剪影原型是设计载荷(宽≥高/凹凸计数/甲档/紫赤独占),素材站无对的,不复用。
|
- **来源**:✦ ComfyUI(prompt 卡 v2.0 §2);剪影原型是设计载荷(宽≥高/凹凸计数/甲档/紫赤独占),素材站无对的,不复用。
|
||||||
- **现状**:战斗三态在役;显示档中档 144;三态原稿分辨率入包、显示按档缩放。
|
- **现状**:站姿样张已有先例(源文件已清理);战斗三态未出。
|
||||||
|
|
||||||
### 2.2 八敌种形象(键集事实源 = `data/tables/enemy.tres` 行键)
|
### 2.2 八敌种形象(键集事实源 = `data/tables/enemy.tres` 行键)
|
||||||
|
|
||||||
@@ -74,15 +74,15 @@
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 地精 goblin | 普通怪:近圆墩形,宽≥高,零锐角 | light | Peglin 式胖体量,先读轮廓后读颜色 |
|
| 地精 goblin | 普通怪:近圆墩形,宽≥高,零锐角 | light | Peglin 式胖体量,先读轮廓后读颜色 |
|
||||||
| 熊地精 bugbear | 普通怪或精英档(加一处垂直延伸:角/冠/棘) | light | 第一关显示名「熊地精」;**L2 熊地精 = bugbear 复用**(第二关三行,显示名熊地精系,同剪影换色板,非独立敌种键) |
|
| 熊地精 bugbear | 普通怪或精英档(加一处垂直延伸:角/冠/棘) | light | 第一关显示名「熊地精」;**L2 熊地精 = bugbear 复用**(第二关三行,显示名熊地精系,同剪影换色板,非独立敌种键) |
|
||||||
| 食人魔酋长 ogre_chief | 精英档:普通怪形+恰一处垂直延伸,底盘不变 | light | 第一关关底 Boss;轻甲裸身皮条/骨饰 |
|
| 食人魔酋长 ogre_chief | 精英档:普通怪形+恰一处垂直延伸,底盘不变 | light | 第一关关底 Boss;轻甲裸身皮条/骨饰(2026-09-25 甲档回填) |
|
||||||
| 巨蜘蛛 giant_spider | 普通怪(多足轮廓注意凹凸计数控制) | light | 群行 [2,3],同屏最多 3 只,剪影需小体量可辨 |
|
| 巨蜘蛛 giant_spider | 普通怪(多足轮廓注意凹凸计数控制) | light | 群行 [2,3],同屏最多 3 只,剪影需小体量可辨 |
|
||||||
| 蛛化卓尔精灵 drider | **Boss:敌类唯一允许锐角与不对称**,体量最大 | ward | 第二关 Boss;紫赤 `#8F2F6A` 色相独占+形状独占双通道;魔法甲符纹饰带 |
|
| 蛛化卓尔精灵 drider | **Boss:敌类唯一允许锐角与不对称**,体量最大 | ward | 第二关 Boss;紫赤 `#8F2F6A` 色相独占+形状独占双通道;魔法甲符纹饰带(2026-09-25 甲档回填) |
|
||||||
| 灰矮人 duergar | 精英档:垂直延伸,重甲中坚 | heavy | 第三关主力量产型;重甲语义走色板 |
|
| 灰矮人 duergar | 精英档:垂直延伸,重甲中坚 | heavy | 第三关主力量产型;重甲语义走色板 |
|
||||||
| 钩爪恐魔 hook_horror | 普通怪(钩爪/多足轮廓注意凹凸计数控制) | light | 第三关群行捕食者,小体量可辨 |
|
| 钩爪恐魔 hook_horror | 普通怪(钩爪/多足轮廓注意凹凸计数控制) | light | 第三关群行捕食者,小体量可辨 |
|
||||||
| 灰矮人石君王 duergar_king | **Boss:锐角与不对称**,体量最大 | heavy | 第三关 Boss;紫赤色相独占+形状独占双通道 |
|
| 灰矮人石君王 duergar_king | **Boss:锐角与不对称**,体量最大 | heavy | 第三关 Boss;紫赤色相独占+形状独占双通道 |
|
||||||
|
|
||||||
- **通用规格**:亮色描边+落影底盘轮廓通道硬规则;透明底 PNG;显示档三档绝对高 96/144/188、源=原稿不降采样(art-bible §8.2);护甲类型视觉区分方案已落 art-bible §5.3(已定稿)。
|
- **通用规格**:亮色描边+落影底盘轮廓通道硬规则;透明底 PNG;每敌种 2–3 版候选;护甲类型视觉区分方案已落 art-bible §5.3(已定稿)。
|
||||||
- **来源**:✦ ComfyUI(prompt 卡 §3,八敌种+L2 熊地精变体共 9 卡);理由同 §2.1——不复用。
|
- **来源**:✦ ComfyUI(prompt 卡 v2.0 §3,八敌种+L2 熊地精变体共 9 卡);理由同 §2.1——不复用。
|
||||||
- **联动**:显示名以 `data/tables/enemy.tres` 与敌人系统文档为准(L2 熊地精=bugbear 复用,显示名熊地精系)。
|
- **联动**:显示名以 `data/tables/enemy.tres` 与敌人系统文档为准(L2 熊地精=bugbear 复用,显示名熊地精系)。
|
||||||
|
|
||||||
### 2.3 意图准备动画三档
|
### 2.3 意图准备动画三档
|
||||||
@@ -117,8 +117,6 @@
|
|||||||
|
|
||||||
### 3.3 雷 / 封印印记 / 数字格面像素化 ⚙
|
### 3.3 雷 / 封印印记 / 数字格面像素化 ⚙
|
||||||
|
|
||||||
- **封印印记改为参数化绘制**:形 = 环+十字法阵,由着色器按格边实时画(环径 82% 格宽+环外一圈压暗光),形与定值见 art-bible §3.2 与 §8.2「封印印记参数表」;贴图件仅战末金蜡封徽记继续使用。本节余下面 = 雷格纹样与数字格面。
|
|
||||||
|
|
||||||
- **要什么**:格子样张通过后按冻结参数出全套砖面资产(含图类型换色板组)。
|
- **要什么**:格子样张通过后按冻结参数出全套砖面资产(含图类型换色板组)。
|
||||||
- **来源**:⚙ 脚本管线自产——未开/已开/危险格/变异纹带是扫雷专属语义(角嵌纹样已不存在),素材站没有对的;砖面**纹理底噪**可 ♻ 用 CC0 无缝石/土纹理作脚本管线的纹理输入,量化到色板(混合路线)。
|
- **来源**:⚙ 脚本管线自产——未开/已开/危险格/变异纹带是扫雷专属语义(角嵌纹样已不存在),素材站没有对的;砖面**纹理底噪**可 ♻ 用 CC0 无缝石/土纹理作脚本管线的纹理输入,量化到色板(混合路线)。
|
||||||
- **前置**:§1.1 格子样张通过(**未跑**)。
|
- **前置**:§1.1 格子样张通过(**未跑**)。
|
||||||
@@ -128,14 +126,14 @@
|
|||||||
|
|
||||||
- **要什么**:HUD 状态槽挂图(敌人血条下小图标),九行键族——**键名录读 art-bible §4.6.1 与 `status_effects.tres`,本文不抄键名**(键名录指路纪律,同 §3.1)。
|
- **要什么**:HUD 状态槽挂图(敌人血条下小图标),九行键族——**键名录读 art-bible §4.6.1 与 `status_effects.tres`,本文不抄键名**(键名录指路纪律,同 §3.1)。
|
||||||
- **风格/规格**:♻ 素材站复用优先——通用增益/减益图标包改色为墨族,按 §4.6.1 极性列统一叠极性视觉(有利=金族满框/有害=红族缺框,art-bible §4.6 通道分配全键族通用),过复用闸四道(灰度可辨=色弱冗余通道);⚙ 兜底程序化。一键一纹样、映射按 effect_id 全局恒定禁换图(图标键契约)。
|
- **风格/规格**:♻ 素材站复用优先——通用增益/减益图标包改色为墨族,按 §4.6.1 极性列统一叠极性视觉(有利=金族满框/有害=红族缺框,art-bible §4.6 通道分配全键族通用),过复用闸四道(灰度可辨=色弱冗余通道);⚙ 兜底程序化。一键一纹样、映射按 effect_id 全局恒定禁换图(图标键契约)。
|
||||||
- **现状**:已接入(定稿九枚入 HUD 状态槽;色板量化豁免=用户逐键验收的自产件,非外采)。
|
- **现状**:已接入(2026-09-24,定稿九枚入 HUD 状态槽,合并 71ae51c;色板量化豁免=用户逐键验收的自产件,非外采)。
|
||||||
|
|
||||||
### 3.5 营地场景图
|
### 3.5 营地场景图
|
||||||
|
|
||||||
- **要什么**:营地场景图 10 张——`scene_camp_bg`(背景层,不透明全幅=天空+远山+整片地面+门洞内一条通向远处的小路)+ `scene_camp_wall`(围墙层,透明底=横贯全宽密排木桩墙+两根门柱,门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件)。钥石顶栏图标沿用现役 `icon_keystone`。
|
- **要什么**:营地场景图 10 张——`scene_camp_bg`(背景层,不透明全幅=天空+远山+整片地面+门洞内一条通向远处的小路)+ `scene_camp_wall`(围墙层,透明底=横贯全宽密排木桩墙+两根门柱,门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件)。钥石顶栏图标沿用现役 `icon_keystone`。
|
||||||
- **来源/规格**:**✦ 插画级**(作者自跑远程生图管线);烛光黄 `#F6C667` + 木色 `#8A5A34`(art-bible §6.2);2× 源档出图、最近邻降采样到 1280×800;后处理=抠底/降采样/色板量化/描边统一。**出图登记照 [remote-gen-prompts](remote-gen-prompts.md) 头注轻量口径执行:用途+生成时间必注,其余参数有则记。**
|
- **来源/规格**:**✦ 插画级**(作者自跑远程生图管线);烛光黄 `#F6C667` + 木色 `#8A5A34`(art-bible §6.2);2× 源档出图、最近邻降采样到 1280×800;后处理=抠底/降采样/色板量化/描边统一。**出图登记照 [remote-gen-prompts](remote-gen-prompts.md) 头注轻量口径执行:用途+生成时间必注,其余参数有则记。**
|
||||||
- **排期**:已执行。终稿落 `game/assets/art/scene/`,消费常量 `UiKit.TEX_CAMP_*`。
|
- **排期**:营地交互重做**美术自立批**(不占迭代位;UI 贴图重构批已搁置)。终稿落 `game/assets/art/scene/`,消费常量 `UiKit.TEX_CAMP_*`。
|
||||||
- **现状**:已入包(十件按锁定矩形 contain 落位;围墙与八件九件按营地主色板 32 色重量化,背景层 2026-11-07 换代走自板 ≤32 色、双板制见 art-bible §4.1 营地行;用户游戏内终审如有置换意见,按同径替换)。
|
- **现状**:全占位。
|
||||||
|
|
||||||
### 3.6 字体(全局 UI 像素字,已定稿单套)
|
### 3.6 字体(全局 UI 像素字,已定稿单套)
|
||||||
|
|
||||||
@@ -145,7 +143,7 @@
|
|||||||
|
|
||||||
### 3.7 护甲类型图标三枚 ♻优先/⚙兜底
|
### 3.7 护甲类型图标三枚 ♻优先/⚙兜底
|
||||||
|
|
||||||
- **要什么**:`ui_armor_light.png` / `ui_armor_ward.png` / `ui_armor_heavy.png` 三枚,站桩名字行与护甲图标同排挂载。
|
- **要什么**:`ui_armor_light.png` / `ui_armor_ward.png` / `ui_armor_heavy.png` 三枚,站桩名字行与护甲图标同排挂载(原为 ◇/◆ 字形占位)。
|
||||||
- **风格/规格**:源 24×24、显示 24px = 1×(甲类整数倍缩放纪律,art-bible §8.2);形状 + 色彩双通道,灰度下按甲面覆盖率三档可辨(character-design §5.3 已定稿:轻甲覆盖率≈0/魔法护甲符纹饰带/重甲金属甲板);不触 §5.1 剪影 archetype。
|
- **风格/规格**:源 24×24、显示 24px = 1×(甲类整数倍缩放纪律,art-bible §8.2);形状 + 色彩双通道,灰度下按甲面覆盖率三档可辨(character-design §5.3 已定稿:轻甲覆盖率≈0/魔法护甲符纹饰带/重甲金属甲板);不触 §5.1 剪影 archetype。
|
||||||
- **来源**:♻ 素材站通用护甲/符纹图标改色优先,过 §0 复用闸四道;⚙ 兜底程序化。
|
- **来源**:♻ 素材站通用护甲/符纹图标改色优先,过 §0 复用闸四道;⚙ 兜底程序化。
|
||||||
- **现状**:未开始(占位 = 站桩名字行裸 12px 字形 ◇/◆,随本条到位后改挂图形件并把名字行提到 `FS_HINT` 14)。
|
- **现状**:未开始(占位 = 站桩名字行裸 12px 字形 ◇/◆,随本条到位后改挂图形件并把名字行提到 `FS_HINT` 14)。
|
||||||
@@ -162,12 +160,12 @@
|
|||||||
| B 区舞台背景层 `scene_stage_bg_deep_underdark.png` | 战斗舞台背景·deep_underdark 变体(art-bible §6.1 资产契约) | **✦ 插画级**;源 = 基准屏宽 × `stage_h`、B 区全高、显示 1×;顶部空区+纵深洞厅远景(远/中/近三层;灰黑、石笋城郭/棱角石厅/石桥/矿道口/烟囱塔、冷银/铜灰矿脉),不画近景地面;按 `board_type` 选图,不走 `wall_ambient` tint | ✦ 插画级(作者自跑远程生图管线) |
|
| B 区舞台背景层 `scene_stage_bg_deep_underdark.png` | 战斗舞台背景·deep_underdark 变体(art-bible §6.1 资产契约) | **✦ 插画级**;源 = 基准屏宽 × `stage_h`、B 区全高、显示 1×;顶部空区+纵深洞厅远景(远/中/近三层;灰黑、石笋城郭/棱角石厅/石桥/矿道口/烟囱塔、冷银/铜灰矿脉),不画近景地面;按 `board_type` 选图,不走 `wall_ambient` tint | ✦ 插画级(作者自跑远程生图管线) |
|
||||||
| B 区连续近景地面层 `scene_stage_ground.png` | 近景泥土地面层(art-bible §6.1 图层归属) | **✦ 插画级**;源 = 基准屏宽 × `ground_h`(布局表新增字段);干净压实泥土为主、全幅只零星几颗小石、散点分布,顶缘不规则泥土边/阴影缝作分隔带;三关共用、跨三关恒定、不吃 `wall_ambient`;独立层压在 B 区底部,小石台在其上 | ✦ 插画级(作者自跑远程生图管线) |
|
| B 区连续近景地面层 `scene_stage_ground.png` | 近景泥土地面层(art-bible §6.1 图层归属) | **✦ 插画级**;源 = 基准屏宽 × `ground_h`(布局表新增字段);干净压实泥土为主、全幅只零星几颗小石、散点分布,顶缘不规则泥土边/阴影缝作分隔带;三关共用、跨三关恒定、不吃 `wall_ambient`;独立层压在 B 区底部,小石台在其上 | ✦ 插画级(作者自跑远程生图管线) |
|
||||||
| 站桩石板地台件 `scene_stage_plaza.png` | 近景地台独立件(art-bible §6.1/§8.2) | 源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定,不吃 `wall_ambient` tint;连续地面层在其下方,先保留 | ⚙/✦ 自产 |
|
| 站桩石板地台件 `scene_stage_plaza.png` | 近景地台独立件(art-bible §6.1/§8.2) | 源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定,不吃 `wall_ambient` tint;连续地面层在其下方,先保留 | ⚙/✦ 自产 |
|
||||||
| 特殊技动画终稿 | 并入 §2.3 三档意图动画,不另起体系 | 攻/防两型旧口径已退役 | ✦/⚙ 自产(同 §2.3) |
|
| 特殊技动画终稿 | 并入 §2.3 三档意图动画,不另起体系 | 攻/防两型旧口径由三档替代 | ✦/⚙ 自产(同 §2.3) |
|
||||||
| 连锁坍塌显形演出 | 连锁展开触发时的连锁演出 | 与音频方向配对登记;「坍塌显形」=连锁展开的玩家可见名 | ♻ 粒子/碎块改色 + ⚙ 坍塌结构自产 |
|
| 连锁坍塌显形演出 | 连锁展开触发时的连锁演出 | 与音频方向同批配对登记;「坍塌显形」=连锁展开的玩家可见名 | ♻ 粒子/碎块改色 + ⚙ 坍塌结构自产 |
|
||||||
| 封印特效 | 该动作的呈现名 = **封印**(art-bible §3.2):**施印瞬间特效 + 印记常显形态**两件 | 印记常显形态=**参数化绘制件**(着色器画环+十字+环外压暗光,形与参数见 art-bible §3.2/§8.2);施印瞬间特效**未实装**,仍缺(走运动+色相,明度分层不动) | ✦/⚙ 自产(精灵+粒子,烟尘光点可 ♻ 改色) |
|
| 封印特效 | 该动作的呈现名 = **封印**(art-bible §3.2):**施印瞬间特效 + 印记常显形态**两件 | 印记旗面走封印黑 `#000000`(现行封印色,色史归 art-bible §4.1);特效走运动+色相(§2:状态/情绪不走明度,空间光照可走);现行占位 = 封印黑「旗」字形;印记常显形态可与 §3.3 旗面像素化合并出 | ✦/⚙ 自产(精灵+粒子,烟尘光点可 ♻ 改色) |
|
||||||
| 弹道/退场等动画密度 | 战斗表现输入清单,方案未定 | 样张锁动画方案后启动 | ♻ 通用弹道/光点/消散粒子改色为主 |
|
| 弹道/退场等动画密度 | 战斗表现输入清单,方案未定 | 样张锁动画方案后启动 | ♻ 通用弹道/光点/消散粒子改色为主 |
|
||||||
|
|
||||||
**现状**:三关舞台背景层与连续地面层已交付(入包 `game/assets/art/scene/`:dungeon v10c / underdark v10c / deep_underdark v10c,均 1280×252;共用地面 v12b,1280×100,按作者裁保留原亮度 L≈0.132);小石台件已在役。
|
**现状**:三关舞台背景层与连续地面层已交付(2026-10-31 入包 `game/assets/art/scene/`:dungeon v10c / underdark v10c / deep_underdark v10c,均 1280×252;共用地面 v12b,1280×100,按作者裁保留原亮度 L≈0.132);小石台件已在役。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -189,30 +187,30 @@
|
|||||||
└─> 敌种呈现形态裁决 ✅已完成(全站桩,卡片式已弃)
|
└─> 敌种呈现形态裁决 ✅已完成(全站桩,卡片式已弃)
|
||||||
徽章(3.1)/节点图(3.2)/效果图标(3.4) —— 独立线,可随时插队
|
徽章(3.1)/节点图(3.2)/效果图标(3.4) —— 独立线,可随时插队
|
||||||
♻ 复用件(3.2/3.4/3.5/3.6/演出粒子) —— 不依赖样张,可随时插队(入包闸 = §0 复用四道)
|
♻ 复用件(3.2/3.4/3.5/3.6/演出粒子) —— 不依赖样张,可随时插队(入包闸 = §0 复用四道)
|
||||||
字体(3.6)接入归表现批;营地场景图(3.5)已入包
|
字体(3.6)接入归表现批;营地场景图(3.5)归营地交互重做美术自立批
|
||||||
分辨率档位 ✅已定案(1280×800 + 1920×1080);art-bible §8 资产规范 ✅已成文——像素基准/画布/命名/帧数候选值就位,终值归样张批冻结
|
分辨率档位 ✅已定案(1280×800 + 1920×1080,2026-09-22 用户确认);art-bible §8 资产规范 ✅已成文(2026-09-23)——像素基准/画布/命名/帧数候选值就位,终值归样张批冻结
|
||||||
```
|
```
|
||||||
|
|
||||||
## 附、已评素材包授权与结论登记(♻ 复用渠道)
|
## 附、已评素材包授权与结论登记(♻ 复用渠道)
|
||||||
|
|
||||||
> 来源:本表为唯一仓内登记;沿革查 git 提交史。
|
> 来源:素材站复用三批复审记录(批目录已归档清退,本表为唯一仓内登记);详录已随复审出盘,沿革查 git 提交史。
|
||||||
|
|
||||||
### 授权总表(闸④预检结论)
|
### 授权总表(闸④预检结论)
|
||||||
|
|
||||||
| 素材包 | 授权 | 署名义务 | 结论 |
|
| 素材包 | 授权 | 署名义务 | 结论 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Kenney 全系(ui-pack/fantasy-ui-borders/game-icons/board-game-icons/kenney-fonts/roguelike 系/tiny-dungeon/tiny-town) | CC0 | 无 | ui-reuse 待审;tiny-dungeon 终局否决(架构不适配);余顺带否决;kenney-fonts 拉丁字候选退役(全局字体定稿 Fusion Pixel 单套,不再接入) |
|
| Kenney 全系(ui-pack/fantasy-ui-borders/game-icons/board-game-icons/kenney-fonts/roguelike 系/tiny-dungeon/tiny-town) | CC0 | 无 | ui-reuse 待审;tiny-dungeon 终局否决(架构不适配);余顺带否决;kenney-fonts 拉丁字候选退役(2026-10-24 用户裁:全局字体定稿 Fusion Pixel 单套,不再接入) |
|
||||||
| OGA Pixel UI 750(Kenney 作) / PixUI(CamTatz) / Handpainted stone | CC0 | 无 | ui-reuse 待审 |
|
| OGA Pixel UI 750(Kenney 作) / PixUI(CamTatz) / Handpainted stone | CC0 | 无 | ui-reuse 待审 |
|
||||||
| DENZI public domain art | CC0 | 无 | 否决 |
|
| DENZI public domain art | CC0 | 无 | 否决 |
|
||||||
| beast-cave(OGA) | CC0 | 无 | **已退役**(源包归档;地砖随 2026-11-07 棋盘地形重做退役——棋盘改程序化材质) |
|
| beast-cave(OGA) | CC0 | 无 | **已选中入工程**(地砖批;2026-09-26 被 terrain_ 自产全套取代,源包归档) |
|
||||||
| JaggedStone / Screaming Brain / ExileGL / Corey Archer(OGA) | CC0 | 无 | 否决 |
|
| JaggedStone / Screaming Brain / ExileGL / Corey Archer(OGA) | CC0 | 无 | 否决 |
|
||||||
| Calciumtrice / Buch / bart cobblestone(OGA) | CC-BY 3.0 | **需署名** | 否决 |
|
| Calciumtrice / Buch / bart cobblestone(OGA) | CC-BY 3.0 | **需署名** | 否决 |
|
||||||
| LD rogue / Evert cave / poikilos underworld(OGA) | OGA-BY 3.0 | **需署名** | 否决 |
|
| LD rogue / Evert cave / poikilos underworld(OGA) | OGA-BY 3.0 | **需署名** | 否决 |
|
||||||
| game-icons.net 图标 | CC-BY 3.0 | **需署名** | 剪影风 26 枚已否决删除;余 10 枚节点/营地候选在 ui-reuse 待审 |
|
| game-icons.net 图标 | CC-BY 3.0 | **需署名** | 剪影风 26 枚已否决删除;余 10 枚节点/营地候选在 ui-reuse 待审 |
|
||||||
| Fusion Pixel 缝合像素字体 | SIL OFL 1.1 | 保留许可证 | **已接入终稿**(全局 UI 字体;用户裁现状即终稿——单套单字重,拉丁沿用自带字形) |
|
| Fusion Pixel 缝合像素字体 | SIL OFL 1.1 | 保留许可证 | **已接入终稿**(全局 UI 字体,2026-09-27 接入;2026-10-24 用户裁现状即终稿——单套单字重,拉丁沿用自带字形) |
|
||||||
| DCSS dngn / Lost Garden / Cavernlock / Aftertile / Voirol / oga-zelda-like(armm1998) | CC0 | 无 | 评估否决(架构/风格不适配;zelda-like 留作干净度基准) |
|
| DCSS dngn / Lost Garden / Cavernlock / Aftertile / Voirol / oga-zelda-like(armm1998) | CC0 | 无 | 高墙批评估否决(架构/风格不适配;zelda-like 留作干净度基准) |
|
||||||
| Golden UI 系列 | CC-BY-SA | — | **闸④不过,未下载** |
|
| Golden UI 系列 | CC-BY-SA | — | **闸④不过,未下载** |
|
||||||
| Gemini 生图(用户自跑) | 自产 | 无 | **已退役**(2026-11-07 棋盘地形重做;旧 terrain_ 瓦片全删) |
|
| Gemini 生图(用户自跑) | 自产 | 无 | **terrain_ 高墙瓦片材质源(现行定稿)** |
|
||||||
|
|
||||||
### 复用四闸(现行)
|
### 复用四闸(现行)
|
||||||
色板量化 / 禁入带吸色 / 灰度可辨 / 授权干净(SA 不可、来路不明不可)。
|
色板量化 / 禁入带吸色 / 灰度可辨 / 授权干净(SA 不可、来路不明不可)。
|
||||||
+91
-108
@@ -1,10 +1,10 @@
|
|||||||
# 美术圣经(Art Bible)— Dungeon Sweeper
|
# 美术圣经(Art Bible)— Dungeon Sweeper
|
||||||
|
|
||||||
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.51,历次修订明细见 git 提交史
|
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.30,历次修订明细见 git 提交史
|
||||||
>
|
>
|
||||||
> **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。
|
> **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。
|
||||||
> 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。
|
> 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。
|
||||||
> 参考池(用户审阅选定,2026-11-07 扩充):**Into the Breach**(网格信息分层;雷图棋盘呈现基准 = 战棋地块质感 × 正俯视角,见 §3.2)× **Moonlighter**(明亮像素地牢质感)× **Peglin**(明快全年龄地牢色彩)× **Stardew Valley**(连续地面与大地块地形的平铺控制、暖色可读性)× **Minish Cap**(圆润岩体轮廓与紧凑像素可读性);补充参考:**Necesse**(大块地形按连续面画、不按逐格物件画)、**Link's Awakening 原版/DX 2D**(抬升台面与南向崖面;2019 重制 3D 立体模型版不作参考)。参考截图存于 `design/art/references/`(原三款 × 2 张在库;新增参考图证待补,不阻塞画法条款);Enter the Gungeon 不作参考,反面条款见 §9.2。
|
> 参考池(用户审阅选定,三者相融):**Into the Breach**(网格信息分层;雷图棋盘呈现基准 = 其战棋地块质感 × 正俯视角,见 §3.2)× **Moonlighter**(明亮像素地牢质感)× **Peglin**(明快全年龄地牢色彩);参考截图存于 `design/art/references/`(三款 × 2 张,与点名池一一对应);Enter the Gungeon 不作参考,反面条款见 §9.2。
|
||||||
> 约束:本圣经是**纯表现层文档**——明亮轻快是美术风格,不是玩法成分。圣经禁止引入、暗示或预设任何玩法语义,不改变任何 GDD 已锁机制;凡表现层需要玩法钩子才能表达之处(如完美封印检测、Boss 预警),一律标注「待 GDD 定夺」,圣经只规定"若有,则如何呈现"。GDD 机制与圣经冲突时,机制语义以 GDD 为准,呈现方案以本圣经为准。
|
> 约束:本圣经是**纯表现层文档**——明亮轻快是美术风格,不是玩法成分。圣经禁止引入、暗示或预设任何玩法语义,不改变任何 GDD 已锁机制;凡表现层需要玩法钩子才能表达之处(如完美封印检测、Boss 预警),一律标注「待 GDD 定夺」,圣经只规定"若有,则如何呈现"。GDD 机制与圣经冲突时,机制语义以 GDD 为准,呈现方案以本圣经为准。
|
||||||
> **条款验收标注纪律(全文书写规范)**:条款尾部按三档标注验收方式——**`验收:机检〈判据>`**(可量化,脚本能断言)/**`验收:目检〈判据>`**(机器测不了,但看什么、怎么算有明确判据)/**`验收:方向性`**(气质与方向原则,不承担验收);推导源尾注「←」继续表达推导来源,与验收标注同句并存时,验收标注放句末;数值类条款推荐「**待定现用**」态(现行即执法、修订走登记,释义见 §4.1)
|
> **条款验收标注纪律(全文书写规范)**:条款尾部按三档标注验收方式——**`验收:机检〈判据>`**(可量化,脚本能断言)/**`验收:目检〈判据>`**(机器测不了,但看什么、怎么算有明确判据)/**`验收:方向性`**(气质与方向原则,不承担验收);推导源尾注「←」继续表达推导来源,与验收标注同句并存时,验收标注放句末;数值类条款推荐「**待定现用**」态(现行即执法、修订走登记,释义见 §4.1)
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
**原则一|预告上格**(取自 Into the Breach;锚定 P1 推理的掌控感、P2 规划的延迟兑现)
|
**原则一|预告上格**(取自 Into the Breach;锚定 P1 推理的掌控感、P2 规划的延迟兑现)
|
||||||
|
|
||||||
继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格上绘制优先级固定:**浮空数字与引导线(最顶层,永不被遮挡) > 小人标记 > 封印印记/类型微光 > 交互反馈(悬停/路径/可挖域微光) > 变异纹带 > 装饰变体 > 岩体顶面/地面底色**,任何元素禁止遮挡浮空数字与引导线。屏幕层序按脚底行分档:顶面贴花与交互反馈随所属格件 z——北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;封印印记与封印格身份色牌固定低于小人(不参与南侧前推);信息优先级不变(北侧重叠时小人压过贴花)。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡浮空数字与引导线〉
|
继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格内绘制优先级固定:**数字(含色牌) > 小人标记 > 旗 > 变异纹带 > 装饰变体 > 底色**,任何元素禁止遮挡数字。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡数字〉
|
||||||
|
|
||||||
*范围注:本原则约束"已存在的信息往哪里画",不新增信息种类;预告类信息以战斗侧 GDD 实际定义的为准(如 P2 已锁的结算来源标注),GDD 未定义的预告不因本条而存在。*
|
*范围注:本原则约束"已存在的信息往哪里画",不新增信息种类;预告类信息以战斗侧 GDD 实际定义的为准(如 P2 已锁的结算来源标注),GDD 未定义的预告不因本条而存在。*
|
||||||
|
|
||||||
@@ -30,38 +30,38 @@
|
|||||||
|
|
||||||
**原则二|明亮为皮,明度分档为骨**(取自 Moonlighter、Peglin;锚定 P1 可读性前提、P4 探险氛围)
|
**原则二|明亮为皮,明度分档为骨**(取自 Moonlighter、Peglin;锚定 P1 可读性前提、P4 探险氛围)
|
||||||
|
|
||||||
取 Moonlighter 的暖质地砖与亲和冒险者气质、Peglin 的明快全年龄洞穴色彩:全局暖倾向、无压抑。可读性由**岩顶/地面明度分档 + 浮空描边字**承载——已开格地面走世界底层档、未开格岩顶走世界中层(§2 明度分层;格态语义见《排雷玩法》;美术侧据此未开格走受光岩顶档、已开格走挖出空间沉暗档,与 §8.5 图底分离同轴);数字以浮空描边字画在格上方(字芯暖白 + 2px 深墨描边,§3.2/§4.1),不使用数字底牌。格子本体美术放开:纹理、材质、装饰变体、类型纹样皆可入画;岩顶/地面参数域见 §4.1 硬指标(分档明度域、饱和上限),仍避 Boss 禁入色相带。与参考之别:ITB 以半透明压暗板承载信息;本作岩顶/地面功能分档 + 浮空数字(信息可读性服务)。验收:机检〈四类底复合对比 ≥4.5(判据 §4.1)〉
|
取 Moonlighter 的暖质地砖与亲和冒险者气质、Peglin 的明快全年龄洞穴色彩:全局暖倾向、无压抑。可读性由**格底明度分档**承载——已开格(数字所在格)明度走世界底层档(§2 明度分层;格态语义见《排雷玩法》;美术侧据此未开格走受光墙顶档、已开格走挖出空间沉暗档,与 §8.5 图底分离同轴),亮族数字墨直接画在格底上,直画对比 ≥4.5:1 恒成立。**数字色牌为后备手段**——仅复杂格底(物件纹样/变异纹带/微光叠加致格底对比不足)时垫牌后备(画法 §3.3、色值 §4.1)。格子本体美术放开:纹理、材质、装饰变体、类型纹样皆可入画;格底参数域见 §4.1 硬指标(分档明度域、饱和上限),仍避 Boss 禁入色相带。与参考之别:ITB 以半透明压暗板承载信息;本作格底功能分档(信息可读性服务,属 §2 明度分层允许域),情绪压暗仍禁。验收:机检〈1–8 全档数字对所在已开格底对比 ≥4.5:1〉
|
||||||
|
|
||||||
*设计测试:当格子美术与数字可读性冲突时,先调岩顶/地面明度档,禁止使用数字底牌,不动浮空数字画法。*
|
*设计测试:当格子美术与数字可读性冲突时,先调格底明度档,复杂格底垫色牌后备,不动格子画。*
|
||||||
|
|
||||||
**原则三|一砖一世界**(融合 Moonlighter 地砖观;锚定 P3 风险与收益同源、P4 地牢下探隐喻)
|
**原则三|一砖一世界**(融合 Moonlighter 地砖观;锚定 P3 风险与收益同源、P4 地牢下探隐喻)
|
||||||
|
|
||||||
格子即地牢地形:未开 = 抬升合并岩体,已开 = 连续地面,雷 = 地面上的巢穴(格态定义与玩家说法见《排雷玩法》),图类型(board_type)= 同款材质换色板。图类型与变异格的视觉差异一律先做色板变体,不做新资产;一切危险状态必须"形状 + 颜色"双通道冗余,色弱可辨。像 Moonlighter 之处在岩板缝质感与暖色道具,但装饰禁止伪装成逻辑差异——玩家须一眼分清"好看"与"有雷"。验收:目检〈危险状态均为形状+颜色双通道,色弱模拟下可辨〉
|
格子即地牢地砖:未开 = 覆尘完整砖,已开 = 碎裂裸露,雷 = 被惊动的巢穴(格态定义与玩家说法见《排雷玩法》),图类型(board_type)= 同款地砖换色板。图类型与变异格的视觉差异一律先做色板变体,不做新资产;一切危险状态必须"形状 + 颜色"双通道冗余,色弱可辨。像 Moonlighter 之处在砖缝质感与暖色道具,但装饰禁止伪装成逻辑差异——玩家须一眼分清"好看"与"有雷"。验收:目检〈危险状态均为形状+颜色双通道,色弱模拟下可辨〉
|
||||||
|
|
||||||
格子同时是**内容舞台**,格与格的美术表达按格内实态分层多样化(画法细则 §3.2)。已开格按当格结果整格表达——产资源格嵌对应家族物件纹样(地图战斗资源九类型,§4.6.3)、纯安全格呈现干净裸土、危险格巢穴更凶。未开格在抬升岩体顶面之上叠加**装饰变体**(裂纹/碎石斑/物件级点缀等氛围层),用途是破除大面积同材质平铺的重复感。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**:形与信息元素(浮空数字/小人/封印印记/纹样)形状语言隔离,灰度下不与任何逻辑元素同形。零信息纪律:随机分布、与雷/安/类型零相关、禁止构成可读线索、分布每板一次跨轮不复掷。焦点预算约束:装饰不构成完整凸形、不抢读(§3.4);数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4)。未开格的类型预读画为**类型微光单通道**(色相+明度双码;仍只表达类型,不泄危险格与安全格——呈现契约见 §4.6.3;概念定义、可见范围与生命周期见《HUD框架》「未开格类型微光」节)。验收:目检〈物件级装饰与逻辑元素形状隔离;装饰不构成完整凸形〉
|
格子同时是**内容舞台**,格与格的美术表达按格内实态分层多样化(画法细则 §3.2)。已开格按当格结果整格表达——产资源格嵌对应家族物件纹样(地图战斗资源九类型,§4.6.3)、纯安全格呈现干净裸土、危险格巢穴更凶。未开格在覆尘完整砖之上叠加**装饰变体**(裂纹/碎石斑/物件级点缀等氛围层),用途是破除大面积同砖平铺的重复感。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**:形与信息元素(数字/小人/旗/纹样)形状语言隔离,灰度下不与任何逻辑元素同形。零信息纪律:随机分布、与雷/安/类型零相关、禁止构成可读线索、分布每板一次跨轮不复掷。焦点预算约束:装饰不构成完整凸形、不抢读(§3.4);数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4)。未开格的类型预读画为**类型微光单通道**(色相+明度双码;仍只表达类型,不泄危险格与安全格——呈现契约见 §4.6.3;概念定义、可见范围与生命周期见《HUD框架》「未开格类型微光」节)。验收:目检〈物件级装饰与逻辑元素形状隔离;装饰不构成完整凸形〉
|
||||||
|
|
||||||
*设计测试:当新图类型或新变异格需要新视觉时,先换色板加形状,再谈新资产;当格子多样化与"好看/有雷"之辨冲突时,砍装饰,不动逻辑通道。*
|
*设计测试:当新图类型或新变异格需要新视觉时,先换色板加形状,再谈新资产;当格子多样化与"好看/有雷"之辨冲突时,砍装饰,不动逻辑通道。*
|
||||||
|
|
||||||
### 1.4 格子样张测试(验收标准)
|
### 1.4 格子样张测试(验收标准)
|
||||||
|
|
||||||
> 立意:扫雷数字可读性与暗色氛围相冲突,由一次格子样张测试定风格,具体形态由样张测试定稿。**样张** = 一张按本圣经参数画成的格子风格试验图,是棋盘地形形态(岩体+地面+浮空数字)的定稿闸——样张通过前,§3.2/§4.1 的一切参数只是候选,通过后冻结为制作标准。
|
> 立意:扫雷数字可读性与暗色氛围相冲突,由一次格子样张测试定风格,具体形态由样张测试定稿。**样张** = 一张按本圣经参数画成的格子风格试验图,是砖面形态的定稿闸——样张通过前,§3.2/§4.1 的一切参数只是候选,通过后冻结为制作标准。
|
||||||
|
|
||||||
**样张内容清单**(一图齐备,缺项即无效):未开格(合并岩体:岩顶大板+南/东崖面,含至少两种装饰变体)、已开格(连续地面,含 0 格与 1–8 全档浮空数字)、危险格(地面上的巢穴纹)、封印印记(画在已揭示地面+受光棱封印石上)、小人两态(独立占格 + 与数字同格——后者须验"数字与引导线完整可见")、图类型色板变体组(§4.3 四槽换色,至少两套)、数字呈现组(浮空数字+引导线:地面格/岩顶格/顶行越出棋盘三种背景各一组,含 1–8 全档)、已开格结果表达组(纯安全格 + 至少两类型物件纹样)、**遮挡组**(小人站在南邻岩体的北侧,脚底被岩体自然遮住;小人与数字同格时数字仍完整可见)、**类型微光呈现组**(至少三个类型的微光在纯岩顶格上呈现——样张为静态定格测试图,非运行时行为承诺,实际可见时机见《HUD框架》「未开格类型微光」节;含两两相邻格微光并列;微光格内零角嵌/箭头/加号类附加图形)。验收:目检〈样张图含清单全部组项〉
|
**样张内容清单**(一图齐备,缺项即无效):未开格(覆尘完整砖,含至少两种装饰变体)、已开格(碎裂裸露,含 0 格与 1–8 全档数字)、危险格(被惊动的巢穴)、旗、小人两态(独立占格 + 与数字同格——后者须验"边框高亮不覆盖文本")、图类型色板变体组(§4.3 四槽换色,至少两套)、数字呈现组(已开格底亮墨直画组 + 复杂格底色牌后备组——素底/装饰变体底/变异纹带底至少三种格底上各一组数字)、已开格结果表达组(纯安全格 + 至少两类型物件纹样)、**类型微光呈现组**(至少三个类型的微光在纯砖格上呈现——样张为静态定格测试图,非运行时行为承诺,实际可见时机见《HUD框架》「未开格类型微光」节;含两两相邻格微光并列;微光格内零角嵌/箭头/加号类附加图形)。验收:目检〈样张图含清单全部组项〉
|
||||||
|
|
||||||
**验收项按序判定,第一项不过 = 整张否决(数字可读性定风格,风格服从可读)**:
|
**验收项按序判定,第一项不过 = 整张否决(数字可读性定风格,风格服从可读)**:
|
||||||
|
|
||||||
1. **第一验收项|数字可读性(硬指标,可测)**:棋盘数字一律为浮空描边字(§3.2「浮空数字」条):字芯暖白 `#F0E2C8`、2px 深墨描边 `#1A140E`、1px 浮空投影、2px 双色引导线;不使用数字底牌。对比判据 = `max(字芯对底, 描边对底) ≥4.5:1` 且 `字芯对描边 ≥4.5:1`;抽测底 = 地面 `#695038`、岩顶 `#9C8462`、崖面 `#403325`、板外暗底四类;最亮底岩顶实测描边对底 5.1:1 过门。0.5× 缩放抽检数字仍可辨;纹带/裂纹/巢穴纹/物件纹样禁止侵入浮空数字与引导线占位区(浮空层独立于格面,格面纹样禁止升到浮空层)。验收:机检〈四类底上 max(字芯对底,描边对底) ≥4.5 且字芯对描边 ≥4.5〉
|
1. **第一验收项|数字可读性(硬指标,可测)**:1–8 全档数字对其所在**已开格底**直画 WCAG 对比 ≥4.5:1(参数域见 §4.1:已开格底走世界底层档、棋盘数字墨亮族);复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)启用**色牌后备**,牌墨组合 ≥4.5:1(色牌与牌上深墨族数字的定值见 §4.1),牌缘灰度可分;0.5× 缩放抽检数字仍可辨;纹带/裂纹/巢穴纹/物件纹样禁止侵入数字字形占位区(砖心留白,§3.2)。验收:机检〈1–8 数字对已开格底直画与牌墨组合对比均 ≥4.5:1〉
|
||||||
2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;合并岩体不改变三态分类——未开 = 抬升岩体,已开 = 连续地面,雷 = 地面上的巢穴纹;明度差(岩顶亮/地面暗)与巢穴形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下封印印记、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入浮空数字占位区,明度梯度禁止压破岩顶/地面明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉
|
2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;明度差(墙亮/空间暗)与碎裂形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下旗、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下旗、巢穴纹不与裂纹混淆〉
|
||||||
3. **焦点预算成立(§3.4)**:任意一格至多一个信息完整凸形(浮空数字/小人/封印印记);岩体为连续地形,不作单格凸形计;数字所在格无第二信息焦点。验收:目检〈任一格至多一个信息完整凸形,数字所在格无第二焦点〉
|
3. **焦点预算成立(§3.4)**:任意一格至多一个完整凸形;数字所在格无第二焦点。验收:目检〈任一格至多一个完整凸形,数字所在格无第二焦点〉
|
||||||
4. **图类型换皮抽测(§4.3)**:变体组中浮空数字字芯/描边、封印黑、危险红、奖励金、小人蓝、类型微光五组恒定不动;变体岩顶/地面底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体岩顶/地面底仍过第 1、2 项〉
|
4. **图类型换皮抽测(§4.3)**:变体组中数字墨亮族三档、封印黑、危险红、奖励金、小人蓝、数字色牌(后备件)、类型微光五组恒定不动;变体格底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体格底仍过第 1、2 项〉
|
||||||
|
|
||||||
**判定与回退**:第 1 项不过时按原则二设计测试回退——先调岩顶/地面明度档,禁止使用数字底牌;浮空字描边是唯一可读性装置,禁止缩字号换字形逃避;第 2–4 项不过时修形不修数。样张通过 = 棋盘地形形态与色板冻结;新增图类型/变异色板须重跑本测试(§4.3)。执行时机:正式地形资产或程序化材质开工前;《HUD框架》以本节为引用依据。验收:机检〈样张机检断言集全绿后方可冻结地形形态与色板〉
|
**判定与回退**:第 1 项不过时按原则二设计测试回退——先调格底明度档,复杂格底垫色牌后备,禁止缩字号换字形逃避;第 2–4 项不过时修形不修数。样张通过 = 砖面形态与色板冻结;新增图类型/变异色板须重跑本测试(§4.3)。执行时机:正式砖面资产开工前;《HUD框架》以本节为引用依据。验收:机检〈样张机检断言集全绿后方可冻结砖面形态与色板〉
|
||||||
|
|
||||||
**整屏样张闸**:格子样张验"格",整屏样张验"屏"——战斗屏/关卡屏/菜单屏/营地屏各出一张整屏样张,验收四项:①全部文字(含菜单/说明/tooltip/按钮)对其直接背景 ≥4.5:1(WCAG AA),大字(≥18px 或加粗档)底线 3:1、目标 4.5:1;②明度分层三档带成立(信息面层 > 世界中层 > 世界底层,层间灰度可分);③整屏焦点预算(§3.4:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。**浮空数字为描边字,按 §1.4 第一验收项的复合对比判据,不套本条文字直画 4.5:1 口径。** 验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉
|
**整屏样张闸**:格子样张验"格",整屏样张验"屏"——战斗屏/关卡屏/菜单屏/营地屏各出一张整屏样张,验收四项:①全部文字(含菜单/说明/tooltip/按钮)对其直接背景 ≥4.5:1(WCAG AA),大字(≥18px 或加粗档)底线 3:1、目标 4.5:1;②明度分层三档带成立(信息面层 > 世界中层 > 世界底层,层间灰度可分);③整屏焦点预算(§3.4:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉
|
||||||
|
|
||||||
**战斗一屏样张**:整屏样张闸已过——整屏四项机检全绿,方向稿目检已通过(用户实机目检核销,沿革查 git 提交史)
|
**战斗一屏样张登记(合并提交 3b66d1a6)**:战斗一屏样张批整屏四项机检全绿——抽样读数:文字对比最弱 5.34:1;舞台底 L0.036/已开格底 L0.089 落两子带、间隔 0.053;首焦=数字区高对比能量占比 59%;名字行素底牌平底零地台色。样张整体过闸待方向稿目检先行(真人检测,登记于体验验证清单 ㊶)
|
||||||
|
|
||||||
**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 浮空描边字(暖白字芯 + 2px 深墨描边 + 双色引导线,值见 §4.1/§3.2);普通数字色牌退役(封印格身份字形色牌保留,见 §3.2 封印印记条);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉
|
**样张现状**:格子样张已冻结,冻结凭据 = git 提交 7a847c7(机检报告)与 §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 亮墨三档直画 + 色牌后备(值见 §4.1);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
|
|
||||||
> 本节服从第 1 节宣言「明快的地牢,轻快的扫荡,仔细的推理」。能量值为全作统一 0–10 刻度:0 静谧,10 沸腾。
|
> 本节服从第 1 节宣言「明快的地牢,轻快的扫荡,仔细的推理」。能量值为全作统一 0–10 刻度:0 静谧,10 沸腾。
|
||||||
>
|
>
|
||||||
> **明度分层(硬规则)**:明度按视觉层分带——**信息面层**(数字/UI 数据/预告/语义标识)最高、**世界中层**(格底顶面/角色/物件)居中、**世界底层**(背景/纵深/远景/已开空间)可更低;层间明度差服务空间纵深与光照(Moonlighter 式洞穴层次)。类型微光的明度梯度(§4.2)属信息面层内梯度,不扰世界层明度档。验收:目检〈三档明度带层间灰度可分〉
|
> **明度分层(硬规则)**:明度按视觉层分带——**信息面层**(数字/UI 数据/预告/语义标识)最高、**世界中层**(格底顶面/角色/物件)居中、**世界底层**(背景/纵深/远景/已开空间)可更低;层间明度差服务空间纵深与光照(Moonlighter 式洞穴层次)。**情绪明暗禁令**:明度变化禁止用于**情绪表达**——画面禁止靠压暗/渐晕阴沉下来;roguelike 失败重开,世界无光暗记忆;Darkest Dungeon 式压暗仍在 §9.2 反面清单。**状态表达不受本禁令约束**:状态可用明度、色相、饱和、运动、元素任一手段承载。**允许域**:空间纵深、光照氛围、形体塑造。类型微光的明度梯度(§4.2)属信息面层内梯度,不扰世界层明度档。验收:目检〈情绪表达不走压暗/渐晕;三档明度带层间灰度可分〉
|
||||||
>
|
>
|
||||||
> **世界底层两子带**:世界底层拆两条子带——**底层下沿带 L 0.014–0.06**(远景、洞窟纵深、B 区舞台底、屏幕根底)与**底层上沿带 L 0.08–0.14**(已开格底、迷雾记忆态合成底),子带间隔 ≥0.02。拆两子带用于解决**世界底层内部** B 区舞台底(L=0.036)与 D 区已开格底(L≈0.10)同层难辨的问题——两者同属世界底层,单带下跨度 0.126 吃掉层间间隔 0.08,灰度图上会表现为两个不同的底。§1.4 整屏②项约束的是层间可分(底层上沿 0.14 对世界中层下沿 0.22,差 0.08 本就满足),②项不约束同层内可分,故本条不属②项的成立要件,而是世界底层内部的可读性纪律。验收:机检〈同一屏的世界底层成员全部落进两条子带之一,两子带 L 区间不重叠且间隔 ≥0.02〉
|
> **世界底层两子带**:世界底层拆两条子带——**底层下沿带 L 0.014–0.06**(远景、洞窟纵深、B 区舞台底、屏幕根底)与**底层上沿带 L 0.08–0.14**(已开格底、迷雾记忆态合成底),子带间隔 ≥0.02。拆两子带用于解决**世界底层内部** B 区舞台底(L=0.036)与 D 区已开格底(L≈0.10)同层难辨的问题——两者同属世界底层,单带下跨度 0.126 吃掉层间间隔 0.08,灰度图上会表现为两个不同的底。§1.4 整屏②项约束的是层间可分(底层上沿 0.14 对世界中层下沿 0.22,差 0.08 本就满足),②项不约束同层内可分,故本条不属②项的成立要件,而是世界底层内部的可读性纪律。验收:机检〈同一屏的世界底层成员全部落进两条子带之一,两子带 L 区间不重叠且间隔 ≥0.02〉
|
||||||
|
|
||||||
@@ -84,15 +84,15 @@
|
|||||||
### 2.2 轮末自动战斗结算
|
### 2.2 轮末自动战斗结算
|
||||||
|
|
||||||
- **主情绪**:延迟兑现的清算爽感——扫雷之因逐行兑现为战果;完美封印(概念定义与兑付结构见《地图战斗资源》)的高光兑现——结算带高光行,以其为全场喝彩级的最高反馈档
|
- **主情绪**:延迟兑现的清算爽感——扫雷之因逐行兑现为战果;完美封印(概念定义与兑付结构见《地图战斗资源》)的高光兑现——结算带高光行,以其为全场喝彩级的最高反馈档
|
||||||
- **色彩性格**:情绪由色相与饱和承载——金橙主导、饱和拉高,明度分层不动;数字色转译为弹道色沿行推进
|
- **色彩性格**:情绪不走明度(§2 禁令),色彩转向金橙主导、饱和拉高;数字色转译为弹道色沿行推进
|
||||||
- **氛围形容词**:酣畅、递进、一气呵成
|
- **氛围形容词**:酣畅、递进、一气呵成
|
||||||
- **能量**:7/10,随连击爬升
|
- **能量**:7/10,随连击爬升
|
||||||
- **承载元素**:兑现光带逐行横扫棋盘,开格化箭雨、印记化暴击砸向敌人,因果全程可见可归因。验收:目检〈兑现光带逐行横扫、因果可见可归因〉
|
- **承载元素**:兑现光带逐行横扫棋盘,开格化箭雨、印记化暴击砸向敌人,因果全程可见可归因。验收:目检〈兑现光带逐行横扫、因果可见可归因;情绪表达不走压暗〉
|
||||||
|
|
||||||
### 2.3 清图奖励与换图
|
### 2.3 清图奖励与换图
|
||||||
|
|
||||||
- **主情绪**:短促丰收——宝箱揭盖式的喜悦,三五秒即收,不拖节奏
|
- **主情绪**:短促丰收——宝箱揭盖式的喜悦,三五秒即收,不拖节奏
|
||||||
- **色彩性格**:全屏饱和峰值:金粒喷泉与彩纸迸发,饱和瞬时拉满后回落;明度分层不动
|
- **色彩性格**:全屏饱和峰值:金粒喷泉与彩纸迸发,饱和瞬时拉满后回落;明度不动(§2 情绪禁令)
|
||||||
- **氛围形容词**:丰收、轻快、干脆
|
- **氛围形容词**:丰收、轻快、干脆
|
||||||
- **能量**:8/10,尖峰后速降
|
- **能量**:8/10,尖峰后速降
|
||||||
- **承载元素**:最后一格碎砖中喷出的 GP 喷泉,叮当落入 UI 钱袋。验收:目检〈金粒喷泉短促收敛,饱和峰值后回落〉
|
- **承载元素**:最后一格碎砖中喷出的 GP 喷泉,叮当落入 UI 钱袋。验收:目检〈金粒喷泉短促收敛,饱和峰值后回落〉
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
### 2.5 战斗失败(冒险终结)
|
### 2.5 战斗失败(冒险终结)
|
||||||
|
|
||||||
- **主情绪**:温柔的惋惜与「再来一次」的邀请——有分量、不惩罚,像合上一册冒险日志
|
- **主情绪**:温柔的惋惜与「再来一次」的邀请——有分量、不惩罚,像合上一册冒险日志
|
||||||
- **色彩性格**:情绪由色相承载——色相转暖灰掺暮蓝,明度分层不动;全作禁血红与黑场,唯此一拍最静
|
- **色彩性格**:情绪不走明度(§2 禁令),色相转暖灰掺暮蓝;全作禁血红与黑场,唯此一拍最静
|
||||||
- **氛围形容词**:惋惜、安静、余温、可再来
|
- **氛围形容词**:惋惜、安静、余温、可再来
|
||||||
- **能量**:1/10
|
- **能量**:1/10
|
||||||
- **承载元素**:小人坐在碎砖上摇头掸灰,落下的封印印记逐枚化作光点收回行囊。验收:目检〈无血红与黑场;色相转暖灰掺暮蓝〉
|
- **承载元素**:小人坐在碎砖上摇头掸灰,落下的封印印记逐枚化作光点收回行囊。验收:目检〈无血红与黑场;色相转暖灰掺暮蓝〉
|
||||||
@@ -159,31 +159,29 @@
|
|||||||
|
|
||||||
### 3.2 环境几何
|
### 3.2 环境几何
|
||||||
|
|
||||||
- **雷图棋盘呈现基准**:战棋地块质感 × 正俯视角——取 ITB 参考图(`references/itb_1.jpg`)的地表质感骨架:地块纹理多样、起伏体块感、岛缘/砖缘厚度;但相机一律正上方垂直向下,格线屏轴对齐,**禁等距/斜视角与菱形格**;形状语言仍守总纲圆角方形。**立体表现取抬升合并岩体+南/东崖面**(2026-11-07 用户裁,采 Link's Awakening 原版/DX 2D 的台面抬升与崖面观感,2019 重制 3D 立体模型版不作参考);砖缘厚度与岛缘立体面属形体塑造(岩顶/地面仍守 §4.1 参数域)。装饰小立牌属 ITB 参考的观感元素,本作不采用;装饰变体走氛围层纪律(纹理级/物件级形状家族,见下方装饰变体条),零信息纪律以原则三为准。验收:目检〈棋盘正俯视、格线屏轴对齐、无菱形格;未开格呈抬升合并岩体+南/东崖面〉 ←原二;原三;§2
|
- **雷图棋盘呈现基准**:战棋地块质感 × 正俯视角——取 ITB 参考图(`references/itb_1.jpg`)的地表质感骨架:地块纹理多样、起伏体块感、岛缘/砖缘厚度、格上装饰小立牌;但相机一律正上方垂直向下,格线屏轴对齐,**禁等距/斜视角与菱形格**;形状语言仍守总纲圆角方形。砖缘厚度与岛缘立体面属形体塑造,不属状态/情绪表达,不受 §2 情绪明暗禁令约束(属 §2 明度分层允许域;顶面格底仍守 §4.1 参数域)。装饰小立牌属 ITB 参考的观感元素,本作不采用;装饰变体走氛围层纪律(纹理级/物件级形状家族,见下方装饰变体条),零信息纪律以原则三为准。验收:目检〈棋盘正俯视、格线屏轴对齐、无菱形格〉 ←原二;原三;§2
|
||||||
- **地形**:一切环境体由同一圆角方形衍生:未开 = 抬升岩体(完整),已开 = 连续地面(挖出空间),雷 = 地面上的巢穴纹(危险格玩家说法见《排雷玩法》);只以“完整/挖开”叙事,不为状态新造形。验收:目检〈三格态仅以完整/挖开与巢穴纹区分,无新造状态形〉 ←原三;P4
|
- **地砖**:一切环境体由同一圆角方形衍生:未开 = 完整凸砖,已开 = 同形缺角碎裂,雷 = 碎裂加巢穴纹(危险格玩家说法见《排雷玩法》);只以"完整度"叙事,不为状态新造形。验收:目检〈三格态仅以完整度区分,无新造状态形〉 ←原三;P4
|
||||||
- **装饰变体(未开格氛围层)**:抬升岩体的顶面之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三
|
- **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三
|
||||||
- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于格面边缘,格心留白(数字已迁浮空层,格面纹样不再需要给字形让位;封印格身份字形走色牌例外,见封印印记条,仍禁止升到浮空层);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且格心留白;巢穴纹更凶一档〉 ←原三;P3
|
- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且砖心留白;巢穴纹更凶一档〉 ←原三;P3
|
||||||
- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。微光画在抬升后的岩顶面内,锚点随岩顶偏移(−ESHIFT/−LIFT),禁止越出本格岩顶。验收:目检〈微光格内零角嵌/箭头/加号类附加形;微光不越本格岩顶〉 ←原一;原三
|
- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。验收:目检〈微光格内零角嵌/箭头/加号类附加形〉 ←原一;原三
|
||||||
- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记。**形 = 法阵**:一圈外环+环内一个十字,十字四端顶到环内沿、与环连成一体——两层构成取法阵通用骨架(外环=圈定范围,环内图形=力量图形,非指特定作品):环=封印圈定,十字=钉住此格。**画法 = 参数化绘制**(着色器按格边实时画环与十字,不出贴图):格边 26–46px 连续可变,任何贴图源都得非整数缩放(32px 源在 28 格缩到 0.875、在 46 格放到 1.44),像素必宽窄不均;参数化按比例画,任意格边清晰。**环外光圈**:印记外面一圈**压暗光**(纯黑只加透明度)——自环外缘起、向外衰减到格边为止、**不外溢邻格**,作用 =「此格被罩住」;禁中心亮、禁色相、禁呼吸。**尺寸定值**见 §8.2「封印印记参数表」(本处不复述数值)。**色** = 封印黑 `#000000`(§4.1),光圈只改 alpha、不新增色。**占位**:印记居**格心**(已揭示连续地面;环外留 9% 格宽给光圈,见 §8.2);封印印记出现在**已揭示格**上(封印受理即揭示——机制口径见《排雷玩法》动作合法性节,呈现规格与预览见《ux/battle》「封印格呈现预览」节)——格下身份字形(危/数字)按格内栈位(§1.2 数字 > 印记)垫色牌叠于法阵之上,印记与数字同格合法;该格字形不参与浮空数字层。**承载面**:封印格地面铺本关受光棱色封印石(dungeon `#C9AF83`/underdark `#A1B1BF`/deep_underdark `#918E8B`,§4.1)——新连续地面 `#695038` 系对封印黑仅 2.35–2.98:1,不达 §4.1 ≥4.5:1;受光棱系 6.45–9.94:1,零新增色。格内栈位见 §1.2;层序纪律——印记与身份色牌固定低于小人(不参与南侧格件前推),且迷雾态(区外全黑/记忆态)隐藏(§6.5「封印随格隐没」)。封印特效两件:常显形态即本件,施印瞬间未实装。战末金蜡封徽记仍取贴图 `seal_mark.png`(与棋盘侧参数化绘制并存,两处互不依赖)。验收:目检〈环径占格宽 82%±1px;光环居格心、只在环外且不出格;纯黑无色相〉 ←原一;P2
|
- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记;封印色见 §4.1(现行封印黑),格内优先级栈位见 §1.2。封印特效(施印瞬间 + 印记常显形态)资产归清单 §4 演出类;封印印记纹理已落位(现行件 = `seal_mark.png`,32×32 可选件),数字字形占位已不存在。验收:目检〈封印印记呈现与封印黑一致,不侵入数字字形占位区〉 ←原一;P2
|
||||||
- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间/地面)一侧、不进岩体(岩体抬升不改变接触带的逻辑格边;光画在地面侧,不贴岩顶;与装饰变体零冲突);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边;光不进岩体〉 ←§2.1;§4.2;P1
|
- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边〉 ←§2.1;§4.2;P1
|
||||||
- **岩体**:圆角岩体堆叠/合并,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈岩体无尖刺装饰〉 ←原三
|
- **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈墙体无尖刺装饰〉 ←原三
|
||||||
- **棋盘地形体系|术语与定义**:未开格 = **抬升岩体**——连通的未开格(四邻:上下左右;斜角不连)合并为一块岩体,共享一块岩顶与连续崖面;已开格 = **连续地面**。素材语义名——岩顶材质 = **大岩板**,南/东崖面材质 = **崖面**,已开地面 = **地面**;**不做逐格自含瓦片**,Tiny Dungeon 拼块套与逐格 16+5 墙/地瓦片套均退役(2026-11-07 用户裁)。验收:目检〈连通未开格共享一块岩顶与连续崖面,无逐格拼缝〉 ←原三
|
- **高墙瓦片体系|术语与定义**:未挖格 = **一整块 32×32 自含凸起岩体**;素材语义名——未开格素材 = **墙瓦片**,已开格素材 = **地面瓦片**。瓦片以自含岩体为单位,Tiny Dungeon 拼块套不进自含岩体定义,不作瓦片参考。验收:目检〈未开格为整块凸起岩体,无拼块接缝感〉 ←原三
|
||||||
- **棋盘地形体系|投影与搭接**:整块岩顶向北偏西抬升——LIFT = round(格边 × 0.435)(46 格 20px、26 格 11px,下限 1),ESHIFT = round(格边 × 0.109)(46 格 5px、26 格 3px,下限 1);南/东崖面沉在岩体格内(南面高 = LIFT,东面宽 = ESHIFT,东面高 = 格边 + LIFT),不侵下一行地面;相邻岩体的岩顶按 2px 互相搭接盖住格缝;板边岩顶向外延伸 ESHIFT 铺到板缘。单个墙格的**顶面 rect** = 格矩形左上偏移 (−ESHIFT, −LIFT)、边长 = 格边;**整格视觉 rect** = 顶面 rect 向右补 ESHIFT、向下补 LIFT。验收:机检〈LIFT/ESHIFT 比例与下限;相邻岩顶搭接 2px;崖面不越格〉
|
- **高墙瓦片体系|边界墨线纪律**:墙瓦片与相邻格分界一律 1px 深墨线、直线贴格边、零锯齿;墨线职责 = 分隔,不追求与地面融合。验收:目检〈分界为 1px 深墨直线贴格边、零锯齿〉
|
||||||
- **棋盘地形体系|受光与崖面**:光照 = **北/西受光**(2026-11-07 用户裁)——北/西临空缘 = 2px 主亮棱 + 2px 次亮棱(暖白族就地提亮),再外 2px 深墨临空边线;南/东临空缘 = 2px 深墨内缘 + 3 段 ×2px 顶面内阴影(自缘内 0.217×格边起,黑 α≈0.27/0.16/0.08)。南崖面 = 高 LIFT、宽 = 格边 + ESHIFT,顶缘 2px 口沿高光取本关受光棱(§4.1,dungeon `#C9AF83`)+1px 深墨线,面身横向层理叠石(大岩板同族、背光暗面),禁竖条纹栅栏;东崖面 = 宽 ESHIFT、高随岩顶南缘,横向层理、外缘 1px 深墨。验收:目检〈北/西亮棱、南/东内阴影与崖面层理;南崖不越下一行、东崖不越下一列;无竖条纹〉
|
- **高墙瓦片体系|光照纪律(单一北受光)**:北缘 = 墨线内侧 1px 微亮棱(就地取色提亮,禁宽亮带);西/东缘 = 墨线后直进纹理、不加修饰;南缘 = 墨线 + 立面窄暗条(约 1/3 格高,横层理叠石、禁竖条纹栅栏感)。验收:目检〈北缘亮棱、南缘窄暗条;无宽亮带、无竖条纹栅栏感〉
|
||||||
- **棋盘地形体系|材质与装饰**:岩顶 = **大岩板**(低频率斑驳 + 稀疏大板块缝 + 板缘浮雕倒角,单块材质覆盖整块岩体;禁逐格小砖纹与逐格边框);地面 = 连续暖褐土(低对比石屑、碎石斑;无缝,禁逐格砖缝);装饰变体 = 岩顶材质内的低对比裂纹/麻点/碎石贴花,走原则三零信息纪律,不新增逐格资产。验收:目检〈岩顶为单块大岩板、无逐格拼缝;地面连续无缝;装饰不构成逻辑线索〉
|
- **高墙瓦片体系|凹角收头**:角点单像素落线;南立面侧凹角加 1px 立面收头——带身与转角竖线同列收尾,禁悬空、禁突出。验收:目检〈凹角收头与转角竖线同列,无悬空突出〉
|
||||||
- **棋盘地形体系|投影与整板悬崖**:南/东临空岩体在地面投 4 段 ×4px 渐隐影(黑 α 0.44/0.30/0.16/0.07,自崖面外缘起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影,色取棋盘环境子板(§4.1)。验收:目检〈南/东投影四段渐隐;整板悬崖结构件齐备〉
|
- **高墙瓦片体系|现行定稿**:`game/assets/art/board/terrain_*`(16 唯一墙瓦片 + 5 地面瓦片变体;词表与查表逻辑落码于 `board_world.gd`)。验收:机检〈terrain_* 素材 16 墙瓦片 + 5 地面变体在库,查表逻辑与词表一致〉
|
||||||
- **棋盘地形体系|绘制序与遮挡**:层序 = 地面(封印格地面铺本关受光棱色封印石)→ 投影 → 数字所属格的**地面阴影圆**(开启格地面,位于小人之下,小人站该格时遮住圆)→ **按脚底 y 排序的深度对象**(岩体 = 其最南格格底;小人 = 所在格格底;升序绘制,南侧岩体自然遮住小人脚底)→ 顶面贴花(类型微光/变异纹带,随岩顶锚点偏移 −ESHIFT/−LIFT;只在未开格岩顶)与交互反馈(悬停/路径/可挖域微光)随所属格件同序——北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;封印印记与封印格身份色牌在已揭示地面、固定低于小人(不参与南侧前推)→ **浮空数字+引导线(最顶)**。验收:机检〈深度对象按脚底升序绘制;格件贴花/交互随脚底行分档;浮空层 z 最高〉+目检〈南侧岩体遮住小人脚底;顶行数字越出棋盘仍完整〉
|
- **高墙瓦片体系|高墙感 D 投影档与整板悬崖**:南临空墙格 = 立面口沿高光 2px `Color8(196,172,132)` + 双段暗带(0.16/0.25 格边,黑罩 α0.60/0.82);北邻墙地面格 = 三段渐隐投影(顶带 0.22 格边,α0.28 起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 列分隔竖缝 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影(游戏 `board_world.gd` 同款结构件,样张脚本与游戏渲染常量同源)。验收:目检〈南临空墙格呈口沿高光+双段暗带;北邻墙地面格呈三段渐隐投影;整板悬崖结构件齐备〉
|
||||||
- **棋盘地形体系|浮空数字(信息层)**:数字与格面字形(危/?)脱离格面,浮在格上方——**封印格除外**,其身份字形按封印印记条垫色牌叠于法阵之上、不进浮空层;字高 21px(7px 像素字 ×3,固定不随格边缩放)、2px 深墨描边、字芯暖白 `#F0E2C8`、1px 浮空投影;字底距格顶 15px;引导线 = 2px 双色实线(左深 `#1A140E`/右浅 `#E8D3AB`),自字底 +3 落到格顶 +4;格顶 +7 处画 10×6 四层柔边小阴影圆(标明数字所属格),圆画在开启格地面、位于小人之下,不盖小人。浮空层 z 最高,任何地形/小人/特效不遮数字与引导线。顶行数字出棋盘上缘,D 区上方预留 44px(字高 21+间距 15+描边 2+余量 6)。验收:机检〈字高 21、间距 15、顶预留 44;浮空层 z 最高;封印格无浮空 entries〉+目检〈顶行数字与引导线完整;阴影圆指向正确格〉
|
- **变异格形状通道**(双通道之"形",与色无关):底砖圆角外轮廓不变,砖面内缘绘一圈定宽专属几何纹带(纹带形全作不与他类共用),砖心留白予数字与旗;验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入数字字形占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于数字/小人/旗);原三
|
||||||
- **棋盘地形体系|旧资产处理**:旧 `terrain_*` 63 件(16 墙瓦片 + 5 地面变体,三关各一套)全部退役——无参考价值者直接删除,不归档;`seal_mark.png` 保留(战末金蜡封专用)。验收:机检〈旧 terrain_* 零引用、零在库;seal_mark 在库〉
|
|
||||||
- **变异格形状通道**(双通道之"形",与色无关):岩体外形由合并岩体决定、不因变异改变;变异纹带画在本格抬升岩顶面内缘(锚点随岩顶偏移 −ESHIFT/−LIFT),一圈定宽专属几何纹带(纹带形全作不与他类共用),格心留白(数字已迁浮空层;封印印记在已揭示地面承载,不与变异纹带同格);验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入浮空数字与引导线占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于浮空数字/小人/封印印记);原三
|
|
||||||
|
|
||||||
### 3.3 UI 形状语法(方向指导,细则见 §7.1)
|
### 3.3 UI 形状语法(方向指导,细则见 §7.1)
|
||||||
|
|
||||||
**方向指导**:半拟物——容器穿戏服、数据素面;圆角 = 可触摸的物件,直角 = 须精确的信息(总纲「圆角为世,直线为信」的 UI 侧落法)。画法细则(面板/按钮/蜡封/参考分界)成文于 **§7.1**。验收:方向性 ←原二;§2.4
|
**方向指导**:半拟物——容器穿戏服、数据素面;圆角 = 可触摸的物件,直角 = 须精确的信息(总纲「圆角为世,直线为信」的 UI 侧落法)。画法细则(面板/按钮/蜡封/数字色牌/参考分界)成文于 **§7.1**。验收:方向性 ←原二;§2.4
|
||||||
|
|
||||||
### 3.4 主角形状与对比预算
|
### 3.4 主角形状与对比预算
|
||||||
|
|
||||||
显著度 = 完整度:**每格至多一个信息完整凸形**(浮空数字/小人/封印印记,依 1.2 优先级让位)。岩体为连续地形,不作单格凸形计;装饰变体贴岩顶分布、不构成第二完整凸形(§4.6);浮空数字的引导线与阴影圆随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算。岩体与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个信息完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3
|
显著度 = 完整度:**每格至多一个"完整凸形"**(数字/小人/旗,依 1.2 优先级让位;装饰变体贴砖缘分布、不构成第二完整凸形——§4.6;数字色牌随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算),底砖与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -195,43 +193,34 @@
|
|||||||
|
|
||||||
### 4.1 主色板
|
### 4.1 主色板
|
||||||
|
|
||||||
- **掩尘 `#9C8462`**|未开格**岩体顶面基色**(覆尘完整岩体):全作的"未知",画面最大沉默面;原 `#C9AF83` 收缩为受光棱/口沿高光专用(代码 `BRICK` 保留为高光锚色,不再作未开格基色)。验收:机检〈未开格岩顶基色 = #9C8462;#C9AF83 只作受光棱/口沿高光〉 ←原二;§2.1
|
- **掩尘 `#C9AF83`**|未开格底色,覆尘完整砖:全作的"未知",画面最大沉默面。验收:机检〈未开格底色 = #C9AF83〉 ←原二;§2.1
|
||||||
- **裸土 `#695038`**|已开格**连续地面基色**:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格岩体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(样张实测 L≈0.09)。验收:机检〈已开格地面基色 = #695038,L 落 0.08–0.14〉 ←原三
|
- **裸土 `#B39A78`**|已开格底色,碎裂裸露:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格墙体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(更高明度底实测达不到 4.5:1,故取本带;样张已冻结,§1.4)。验收:机检〈已开格底 L 落在 0.08–0.14,对亮墨数字 ≥4.5:1〉 ←原三
|
||||||
- **棋盘环境子板(分层②,不占 48 token 额度)**|现行基座档八色:岩顶 `#9C8462`、地面 `#695038`、崖面 `#403325`、板块缝 `#64523A`、倒角亮 `#CCB288`、倒角暗 `#766248`、临空墨线 `#261E15`、受光棱 `#C9AF83`;单张像素域 ≤32,三关按 §4.3 换色不新增 token。验收:机检〈八色在册、单张像素域 ≤32〉
|
- **数字墨双色制**:1–8 **不做八色分色**,按密度分三档色温(冷 = 稀疏,暖 = 密集);**字形为唯一数值载体**,色温只作密度氛围。验收:目检〈1–8 数字按密度呈三档色温而非八色〉 ←原一/原二;P3
|
||||||
|
- **棋盘数字呈现 = 按板自适应三态**:暗纹理板(dungeon 系)= **亮族**三档 1–3 冷亮青白 #D8ECF0/4–5 暖白 #F0E2C8/6–8 金亮 #F8E3A8 直画(判据 = 族最弱成员对 p90 ≥4.5:1 且对均值 ≥2.5:1);双峰纹理板(underdark/deep_underdark 系)= **色牌垫底**(素牌 DIGIT_PLATE + 深墨 #33261B 12:1,纹理免疫——双峰纹理板上任何墨族直画都不可读,渲染帧取证;判据 = 亮深两族皆不过门,深族均值门 3.0);缺盘平色回退态(#B39A78 中明度底)默认深墨直画。选模式管线落码单点 `board_view._digit_ink_mode`(三态:亮直/深直/落牌),机检面 = `terrain_tile_sets_test` 三关呈现模式断言;目视验证面 = board_shot_probe 渲染帧取证(机检≠看得清)。验收:机检〈terrain_tile_sets_test 三关呈现模式断言全绿,board_shot_probe 渲染帧目视复核〉
|
||||||
**三关棋盘环境八色(2026-11-07 用户看样张通过,冻结)**:槽位顺序 = 岩顶/地面/崖面/板块缝/倒角亮/倒角暗/临空墨线/受光棱。
|
- **垫牌与 UI 数据墨 = 深墨族 `#33261B` 系**(L≤0.027,§7.2)。验收:机检〈垫牌与 UI 数据墨取深墨族,L≤0.027〉
|
||||||
- dungeon:`#9C8462`/`#695038`/`#403325`/`#64523A`/`#CCB288`/`#766248`/`#261E15`/`#C9AF83`。
|
|
||||||
- underdark:`#7B8894`/`#4F5A64`/`#31373D`/`#4D565F`/`#A5B4C2`/`#5C6770`/`#1D2124`/`#A1B1BF`。
|
|
||||||
- deep_underdark:`#706E6B`/`#4C4947`/`#2E2D2C`/`#484644`/`#93908D`/`#555351`/`#1B1B1A`/`#918E8B`。
|
|
||||||
换皮只换这八色与 §4.3 tint 槽;数字字芯/描边、封印黑、危险红、小人蓝、类型微光五组三关恒定。旧瓦片均值不作终值(旧 16+5 套已退役);三关互辨抽测按新材质重跑。验收:机检〈三关八色在册且与 §4.3 不变槽恒定〉
|
|
||||||
- **数字墨单色制(浮空字)**:1–8 **不做八色分色**,统一暖白字芯 `#F0E2C8` + 2px 深墨描边 `#1A140E`;**字形为唯一数值载体**,密度氛围不靠换字色。验收:目检〈1–8 数字芯色一致、非八色分色〉 ←原一/原二;P3
|
|
||||||
- **棋盘数字呈现 = 浮空描边字(全板统一,2026-11-07 定)**:字芯暖白 `#F0E2C8` + 2px 深墨描边 `#1A140E` + 1px 浮空投影;引导线 2px 双色(左深 `#1A140E`/右浅 `#E8D3AB`);不使用数字底牌、不随图类型换色、不再有亮直/深直/落牌三态。对比判据 = `max(字芯对底, 描边对底) ≥4.5:1` 且 `字芯对描边 ≥4.5:1`(最亮底岩顶 `#9C8462` 实测描边对底 5.1:1);机检面 = 浮空字几何/对比测试,目视验证面 = board_shot_probe 渲染帧。验收:机检〈四类底复合对比 ≥4.5;字高 21/间距 15/顶部预留 44 定值〉
|
|
||||||
- **UI 数据墨 = 深墨族 `#33261B` 系**(L≤0.027,§7.2);棋盘数字底牌已退役、不再使用。验收:机检〈UI 数据墨取深墨族,L≤0.027〉
|
|
||||||
- **八色弃用**:八色必与红/金/蓝/紫赤语义冲突,故弃。验收:方向性
|
- **八色弃用**:八色必与红/金/蓝/紫赤语义冲突,故弃。验收:方向性
|
||||||
- **封印黑 `#000000`**|封印宣告色,无色相:玩家的宣告"此格封印"。封印现行 = 无色相黑——紫色与微光蓝族(魔法微光 256° 等)色相冲突,黑色无色相天然避开 300°–345° 禁入带与全部微光色带;承载面 = 本关受光棱色封印石(dungeon `#C9AF83`/underdark `#A1B1BF`/deep_underdark `#918E8B`,见 §3.2 封印印记条)对纯黑对比 9.94/9.56/6.45:1,纯黑实心剪影单靠明度差即成立,不依赖任何浅色细件;新连续地面 `#695038` 系对纯黑仅 2.35–2.98:1,故不作封印承载面。旧裸土 `#B39A78` 随旧地板瓦片退役。封印紫不再用于棋盘(色史归 git 提交史);红族棋盘侧只剩危险红;主角随身背包件为朱红矩形件(人设侧见 character-design),与棋盘封印色脱钩。验收:机检〈封印宣告色 = #000000,受光棱封印石对其对比 ≥4.5:1〉 ←原一;P2
|
- **封印黑 `#000000`**|封印宣告色,无色相:玩家的宣告"此格封印"。封印现行 = 无色相黑——紫色与微光蓝族(魔法微光 256° 等)色相冲突,黑色无色相天然避开 300°–345° 禁入带与全部微光色带;未开格墙顶明度 ≈113 对纯黑对比 ≥4.4:1,旗杆米白保可读。旗朱与封印紫已不用于棋盘封印旗,红族棋盘侧只剩危险红;人设背包旗 = 旗朱红矩形旗,与棋盘封印色脱钩(人设侧见 character-design 背包旗条)。验收:机检〈封印宣告色 = #000000,未开格墙顶对其对比 ≥4.4:1〉 ←原一;P2
|
||||||
- **危险红 `#A8321F`**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉。验收:机检〈危险语义色 = #A8321F〉 ←原三;P2
|
- **危险红 `#A8321F`**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉。验收:机检〈危险语义色 = #A8321F〉 ←原三;P2
|
||||||
- **奖励金 `#F0A828`**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金。验收:机检〈收益语义色 = #F0A828〉 ←P2;§2.3/2.4
|
- **奖励金 `#F0A828`**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金。验收:机检〈收益语义色 = #F0A828〉 ←P2;§2.3/2.4
|
||||||
- **小人蓝 `#2E86DE`**|小人主色:棋盘唯一"己方",与光标准线同族。验收:机检〈己方语义色 = #2E86DE〉 ←P1;§2.1
|
- **小人蓝 `#2E86DE`**|小人主色:棋盘唯一"己方",与光标准线同族。验收:机检〈己方语义色 = #2E86DE〉 ←P1;§2.1
|
||||||
- **数字色牌 `#F5EAD3`**|**普通数字棋盘侧退役**(2026-11-07 浮空数字定案;普通数字不再使用底牌);**封印格身份字形色牌保留**(`UiKit.DIGIT_PLATE`+`DIGIT_PLATE_EDGE`,叠于法阵之上,见 §3.2 封印印记条,2026-11-07 封印改版定案)。token 若被 UI 其他面复用按 UI 侧登记,不属棋盘数字呈现;棋盘普通数字绘制路径零色牌调用,封印格色牌为唯一例外。验收:机检〈普通数字绘制路径零色牌调用;封印格色牌在位〉 ←原二
|
- **数字色牌 `#F5EAD3`**|数字底具,**后备手段**:素色暖纸白直角小牌,仅复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)垫于数字正下方;素面无纹理、不随图类型/装饰变体变。验收:机检〈色牌 L≥0.70,仅复杂格底垫用〉 ←原二
|
||||||
- **收益金亮档 `#E0B860`(GOLD_BRIGHT)**|UI 徽标可读性亮档 token:敌顺位徽标①②③与重甲徽标对舞台底 6.47:1(GOLD_DEEP 3.26:1 不达 §7.2 带,故另立亮档);金族亮档,与奖励金 #F0A828 同族不同岗——奖励金 = 已兑现收益语义(§4.2 金条),本 token 只承载徽标可读性、不占收益语义。GOLD_DEEP/HERO_BLUE 常量本尊不动(standee 意图判据等语义岗现行使用)。验收:机检〈GOLD_BRIGHT 对舞台底 ≥4.5:1〉
|
- **收益金亮档 `#E0B860`(GOLD_BRIGHT)**|UI 徽标可读性亮档 token:敌顺位徽标①②③与重甲徽标对舞台底 6.47:1(GOLD_DEEP 3.26:1 不达 §7.2 带,故另立亮档);金族亮档,与奖励金 #F0A828 同族不同岗——奖励金 = 已兑现收益语义(§4.2 金条),本 token 只承载徽标可读性、不占收益语义。GOLD_DEEP/HERO_BLUE 常量本尊不动(standee 意图判据等语义岗现行使用)。验收:机检〈GOLD_BRIGHT 对舞台底 ≥4.5:1〉
|
||||||
- **小人蓝亮档 `#7EBAF0`(HERO_BLUE_BRIGHT)**|魔法护甲徽标对舞台底 5.88:1(HERO_BLUE 3.23:1 不达带,故另立亮档);蓝族亮档,与小人蓝 #2E86DE 同族不同岗——本 token 只承载徽标可读性,不占用「蓝只说己方」的语义。验收:机检〈HERO_BLUE_BRIGHT 对舞台底 ≥4.5:1〉
|
- **小人蓝亮档 `#7EBAF0`(HERO_BLUE_BRIGHT)**|魔法护甲徽标对舞台底 5.88:1(HERO_BLUE 3.23:1 不达带,故另立亮档);蓝族亮档,与小人蓝 #2E86DE 同族不同岗——本 token 只承载徽标可读性,不占用「蓝只说己方」的语义。验收:机检〈HERO_BLUE_BRIGHT 对舞台底 ≥4.5:1〉
|
||||||
- **图标槽柔和档 `#806A4E`(SLOT_BACKDROP_SOFT)**|BCard 图标槽底:对米色卡面 PANEL_DATA 3.69:1(深档 SLOT_BACKDROP #3E362C 8.53:1 过强、像硬贴补丁,故槽底另立柔和档),槽内白图标 5.14:1,满足 ≥3:1 图形参考线硬约束;仅 BCard 图标槽换档,B 区状态槽仍用深档 SLOT_BACKDROP。验收:机检〈槽内白图标对槽底 ≥3:1〉
|
- **图标槽柔和档 `#806A4E`(SLOT_BACKDROP_SOFT)**|BCard 图标槽底:对米色卡面 PANEL_DATA 3.69:1(深档 SLOT_BACKDROP #3E362C 8.53:1 过强、像硬贴补丁,故槽底另立柔和档),槽内白图标 5.14:1,满足 ≥3:1 图形参考线硬约束;仅 BCard 图标槽换档,B 区状态槽仍用深档 SLOT_BACKDROP。验收:机检〈槽内白图标对槽底 ≥3:1〉
|
||||||
- **群伤微光暗档 `#A61D37`(TG_GLOW_AOE)**|类型微光群伤组的**明度档**(UI token 板,占 1 枚额度,**余量 3→2**):色相 349° 与亮档 `#FF2D55` 零移动,明度落 V=0.65 档——即 §4.2「微光 = 色相+明度双码」里明度侧的落法;与 §4.2「红只说危险」不相撞(微光组色相刻意错开语义红,见 §4.2「类型微光色带」条)。已在役(`ui_kit.gd` 常量与 `type_glow_test.gd` 守门断言),本节为登记转正。验收:机检〈ui_kit.gd TG_GLOW_AOE 与 type_glow_test 断言的 H/S 逐位一致、V 落 0.65 档〉
|
- **群伤微光暗档 `#A61D37`(TG_GLOW_AOE)**|类型微光群伤组的**明度档**(UI token 板,占 1 枚额度,**余量 3→2**):色相 349° 与亮档 `#FF2D55` 零移动,明度落 V=0.65 档——即 §4.2「微光 = 色相+明度双码」里明度侧的落法;与 §4.2「红只说危险」不相撞(微光组色相刻意错开语义红,见 §4.2「类型微光色带」条)。已在役(`ui_kit.gd` 常量与 `type_glow_test.gd` 守门断言),本节为登记转正。验收:机检〈ui_kit.gd TG_GLOW_AOE 与 type_glow_test 断言的 H/S 逐位一致、V 落 0.65 档〉
|
||||||
- **站桩石板地台板身 `#968264`(STAND_STONE)**|战斗屏场景环境子板(分层②,不占 48 token 额度):B 区站桩地台板身与顶缘的材质色,跨三关恒定、不吃 §4.3 `wall_ambient` tint(地台是 §6.1 定死的世界中层承载面,随关卡变会破 §2 明度分层的层间关系)。转正前即在役。验收:机检〈战斗屏场景环境子板色数 ≤32 且本值在册〉
|
- **站桩石板地台板身 `#968264`(STAND_STONE)**|战斗屏场景环境子板(分层②,不占 48 token 额度):B 区站桩地台板身与顶缘的材质色,跨三关恒定、不吃 §4.3 `wall_ambient` tint(地台是 §6.1 定死的世界中层承载面,随关卡变会破 §2 明度分层的层间关系)。转正前即在役。验收:机检〈战斗屏场景环境子板色数 ≤32 且本值在册〉
|
||||||
- **营地场景环境子板(分层②,不占 48 token 额度)**:营地屏走**双板制**(2026-11-07 用户裁放宽屏上限)——围墙与八件九件共用主色板 **32 色**(2026-11-01 并集 272 色经最近对合并收敛在册、违例对 0);背景层自板 **≤32 色**(2026-11-07 背景换代登记:量化 32 色、近色合并 4 对〔九件板 1 对+全局色板基线 3 对〕后对九件板新增 31 色);**屏并集上限 64、实测 63**。色值不另立逐值清单,事实源=入包素材 `scene_camp_*` 十件的量化产物;换算与合并过程登记于 artwork 工作区执行件。验收:机检〈单张像素域 ≤32;营地屏并集 ≤64〉
|
- **重甲冷灰金属材质色 `#868C9A`(ARMOR_PLATE_COLD,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 2→1**;用户裁):重甲档甲材质色;character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王岩石板甲**同引本枚、不另计额度**;材质色跨屏恒定,落分层①不落分层②(环境色才随场景走)。过门情况:第二道门按宽松口径(禁止三通道全 <8)与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 222°,不占红/金/蓝/紫赤/绿语义段、不在 300°–345° 禁入带;材质色不进信息层与语义物件岗)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1(图形 ≥3:1 门槛);相对亮度 L≈0.261 落 §2 世界中层 0.22–0.45 带。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
|
||||||
- **重甲冷灰金属材质色 `#868C9A`(ARMOR_PLATE_COLD,token 名暂拟)**|语义/UI token 板(**分层①**,占 1 枚额度;用户裁):重甲档甲材质色;character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王岩石板甲**同引本枚、不另计额度**;材质色跨屏恒定,落分层①不落分层②(环境色才随场景走)。过门情况:第二道门按宽松口径(禁止三通道全 <8)与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 222°,不占红/金/蓝/紫赤/绿语义段、不在 300°–345° 禁入带;材质色不进信息层与语义物件岗)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1(图形 ≥3:1 门槛);相对亮度 L≈0.261 落 §2 世界中层 0.22–0.45 带。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
|
- **卓尔浅紫灰皮 `#A79CB8`(DRIDER_SKIN,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 1→0,额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,L≈0.355 落 §2 世界中层带)。过门情况:第二道门同上行口径,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 264°,避开 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`;不占本节五语义段)。对比实测:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——**两处均过图形 ≥3:1 门槛**(本轮新算)。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
|
||||||
- **卓尔浅紫灰皮 `#A79CB8`(DRIDER_SKIN,token 名暂拟)**|语义/UI token 板(**分层①**,占 1 枚额度,**额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,L≈0.355 落 §2 世界中层带)。过门情况:第二道门同上行口径,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 264°,避开 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`;不占本节五语义段)。对比实测:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——**两处均过图形 ≥3:1 门槛**。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
|
|
||||||
- **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#A8AEB8`)→ 并入 `FOG_MEMORY_INK #C4C4C4`,**部件取值 = `#C4C4C4`**;② 主角提灯铜色(原拟 `#C08A3A`)→ 并入 `GOLD_DEEP #B07A14`,**部件取值 = `#B07A14`**;③ 食人魔酋长暖褐皮(原拟 `#B08050` / `#A97C4E`)→ 并入 `暖石 #B8A582`,**部件取值 = `#B8A582`**;④ 石君王灰皮(原拟 `#9A968C` / `#949089`,按**次级皮**口径——板甲视同体块主色、灰皮属次级皮故不受 L 0.22–0.45 约束)→ 并入 `STONE #786E62`,**部件取值 = `#786E62`**;⑤ 轻甲护甲图标木色 `#8A5A34`(深素底下 2.72:1 不过门;原拟新增木色亮档 `#C49A5E`)→ 并入 `WARM_FAINT #CDB88C`,**部件取值 = `#CDB88C`**(8.08:1)。**一色两岗代价已随裁定接受**:① 的 `#C4C4C4` 语义岗 = 迷雾记忆墨(§6.5)、② 的 `#B07A14` 属金族(§4.2 金只说收益与兑现)——两者均作角色随身件材质色用,不进信息层与语义物件岗;③④⑤ 无语义岗冲突。验收:机检〈五处部件取值点全部改指合并目标色,四枚原拟新增候选值零入板〉
|
- **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#A8AEB8`)→ 并入 `FOG_MEMORY_INK #C4C4C4`,**部件取值 = `#C4C4C4`**;② 主角提灯铜色(原拟 `#C08A3A`)→ 并入 `GOLD_DEEP #B07A14`,**部件取值 = `#B07A14`**;③ 食人魔酋长暖褐皮(原拟 `#B08050` / `#A97C4E`)→ 并入 `暖石 #B8A582`,**部件取值 = `#B8A582`**;④ 石君王灰皮(原拟 `#9A968C` / `#949089`,按**次级皮**口径——板甲视同体块主色、灰皮属次级皮故不受 L 0.22–0.45 约束)→ 并入 `STONE #786E62`,**部件取值 = `#786E62`**;⑤ 轻甲护甲图标木色 `#8A5A34`(深素底下 2.72:1 不过门;原拟新增木色亮档 `#C49A5E`)→ 并入 `WARM_FAINT #CDB88C`,**部件取值 = `#CDB88C`**(8.08:1)。**一色两岗代价已随裁定接受**:① 的 `#C4C4C4` 语义岗 = 迷雾记忆墨(§6.5)、② 的 `#B07A14` 属金族(§4.2 金只说收益与兑现)——两者均作角色随身件材质色用,不进信息层与语义物件岗;③④⑤ 无语义岗冲突。验收:机检〈五处部件取值点全部改指合并目标色,四枚原拟新增候选值零入板〉
|
||||||
- **换色合并登记三处**|按本表「不过门即触发换色合并、禁加色绕行」执行,三处零新增额度:①地台顶缘受光线 `#C4AC84` 已并入 `#C9AF83`(掩尘枚 `BRICK`,与 §8.2 高墙口沿高光同枚)——源常量已删除(全仓零引用,退役断言测试串为预期例外),绘制点全部改指 `#C9AF83`;②地台描边 `#5A4C3A` 已并入 `#4C4038`(代码 `PLAZA_EDGE`,ui_kit 唯一落点)——源常量已删除,绘制点全部改指;③舞台底 `#3E342A`(代码 `STAGE_BG`)→ 并入 `#3E362C`(状态槽底)——源常量已删除(常量表零键),背景资产接管该绘制面,程序化平色缺图回退改指 `SLOT_BACKDROP`(`#3E362C`)。程序化回退绘制与已落合并值的贴图保持一致。验收:机检〈①②两枚源常量全仓零引用,绘制点全部改指合并目标色〉
|
- **换色合并登记三处**|按本表「不过门即触发换色合并、禁加色绕行」执行,三处零新增额度:①`#C4AC84`(地台顶缘受光线,代码 `STAND_STONE_RIM`)→ 并入 `#C9AF83`(掩尘,并与 §8.2 高墙口沿高光 `Color8(196,172,132)` 统一为同一枚);②`#5A4C3A`(地台描边,代码 `STAND_STONE_EDGE`)→ 并入 `#4C4038`;③`#3E342A`(舞台底,代码 `STAGE_BG`)→ 并入 `#3E362C`(状态槽底)。①②的绘制点全部改指合并目标色、源常量删除——程序化回退绘制与已落合并值的贴图保持一致;③随 §6.1 舞台背景插画批一并处置:背景资产接管该绘制面时本常量随绘制点退役或改指,禁单独为改值出批。验收:机检〈①②两枚源常量全仓零引用,绘制点全部改指合并目标色〉
|
||||||
|
|
||||||
**对比硬指标(可测)**:数字可读性由**浮空描边字**承载——棋盘数字字芯暖白 `#F0E2C8` + 2px 深墨描边 `#1A140E`,判据 = `max(字芯对底, 描边对底) ≥4.5:1` 且 `字芯对描边 ≥4.5:1`;抽测底 = 地面/岩顶/崖面/板外暗底四类(最亮底岩顶实测描边对底 5.1:1);普通数字不使用数字底牌、无色牌后备(封印格身份字形色牌为唯一例外,见 §3.2 封印印记条)。岩顶/地面/崖面底槽(含全部图类型)与类型微光之间存在**相对亮度与相对饱和关系**——禁止底槽吞没微光环、禁止岩顶与地面同档;本节只定这层关系,阈值与准入判定由图类型色板互辨抽测的执行件承载(用法登记见 [art-pipeline-tools](art-pipeline-tools.md))。已开格地面走世界底层档(见上)。物件识别不依赖底色(§5.1 轮廓通道),封印印记、金色不作识别依赖。验收:机检〈四类底复合对比 ≥4.5;岩顶/地面底对微光环与对彼此的相对亮度关系经互辨抽测准入〉 ←原二;地形变异 AC-9
|
**对比硬指标(可测)**:数字可读性由**格底明度分档**承载——棋盘数字亮墨 **L≥0.75** 对**已开格底 L 0.08–0.14** ⇒ 直画对比 **≥4.5:1 恒成立**(WCAG AA,样张逐组合抽测冻结);**色牌后备**:色牌素色恒定 **L≥0.70**、牌上数字深墨 **L≤0.027** ⇒ 任意牌墨组合 ≥4.5:1(实测样例:#33261B/#F5EAD3 = 12.3:1)。未开格底槽(含全部图类型)相对亮度 **L≥0.30**(墙顶面受光档)、HSV 饱和 **≤0.55**、避 Boss 禁入色相带;已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),旗面、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底 L≥0.30、饱和 ≤0.55;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9
|
||||||
|
|
||||||
**色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限 **48 色**(防色板无限膨胀的封口条款;**额度已用尽、余量 0**,后续余量以色板检查器实报为准);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部 <8/255**——即三通道里至少一通道 ≥8/255 即过门,「三通道差全部 <8」才算不过门(条文原写的「三通道差 ≥8/255」有「逐通道全过」与「禁止全灭」两种互斥读法,前者下现行色板 247 对不达标、与本节自认的「现行即执法」合规状态不能同真,故取后者;用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。反例实证:#3A2E22 ↔ #362B20 三通道差均 <5,肉眼不可辨,同板共存只增噪。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(色板检查器按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数 ≤48;新色入板过两道门〉
|
**色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限 **48 色**(防色板无限膨胀的封口条款;**额度已用尽、余量 0**,后续余量以色板检查器实报为准);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部 <8/255**——即三通道里至少一通道 ≥8/255 即过门,「三通道差全部 <8」才算不过门(条文原写的「三通道差 ≥8/255」有「逐通道全过」与「禁止全灭」两种互斥读法,前者下现行色板 247 对不达标、与本节自认的「现行即执法」合规状态不能同真,故取后者;用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。反例实证:#3A2E22 ↔ #362B20 三通道差均 <5,肉眼不可辨,同板共存只增噪。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(色板检查器按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数 ≤48;新色入板过两道门〉
|
||||||
|
|
||||||
- **换色合并欠账清单(全板重扫 6 对不达标,逐对清偿)**:`#18120C` ↔ `#181410`、`#33261B` ↔ `#362B20`、`#362B20` ↔ `#3A2E22`、`#3E362C` ↔ `#3E3731`、`#3E4048` ↔ `#3F4147`、`#453723` ↔ `#4A3B2A`——六对按「不过门即换色合并」纪律逐对清偿(并进最近既有色);清偿前该对不视作合规,清偿动作落本节修订。**本节所举反例 `#3A2E22` ↔ `#362B20` 正在这 6 对之内**,与本口径自洽。验收:机检〈全板色对中三通道差全部 <8/255 的对数 = 0〉
|
- **换色合并欠账清单(全板重扫 6 对不达标,逐对清偿)**:`#18120C` ↔ `#181410`、`#33261B` ↔ `#362B20`、`#362B20` ↔ `#3A2E22`、`#3E362C` ↔ `#3E3731`、`#3E4048` ↔ `#3F4147`、`#453723` ↔ `#4A3B2A`——六对按「不过门即换色合并」纪律逐对清偿(并进最近既有色);清偿前该对不视作合规,清偿动作落本节修订。**本节所举反例 `#3A2E22` ↔ `#362B20` 正在这 6 对之内**,与本口径自洽。验收:机检〈全板色对中三通道差全部 <8/255 的对数 = 0〉
|
||||||
|
|
||||||
- **色板分层**:色板分两层管理——① **语义/UI token 板**:全作共享,硬上限 **48 色**,管 UI 语义色、墨色、材质色,跨屏恒定;② **场景环境子板**:**每屏一套,≤32 色,允许跨屏不共享**(营地屏例外=双板制、屏并集 ≤64,见本节营地行,2026-11-07 用户裁)(环境色 = 天空、地面、植被、石材、火焰等随场景走的颜色)。新增环境色仍须过两道门(§4.2 语义检查 + 与既有任一色 RGB 三通道差禁止全部 <8/255),但**不占用 48 token 额度**;不过门照旧走「换色合并」,**禁加色绕行**。单张 PNG 的像素域色数上限 **≤32 色**另由 `standee_asset_check` 执法(按单图像素域取值方式计数,与本表 token 计数互不干扰)。额度不足时向作者报告,由作者决定压缩或合并既有色。验收:机检〈token 板 ≤48;每屏环境子板 ≤32(营地屏并集 ≤64)〉
|
- **色板分层**:色板分两层管理——① **语义/UI token 板**:全作共享,硬上限 **48 色**,管 UI 语义色、墨色、材质色,跨屏恒定;② **场景环境子板**:**每屏一套,≤32 色,允许跨屏不共享**(环境色 = 天空、地面、植被、石材、火焰等随场景走的颜色)。新增环境色仍须过两道门(§4.2 语义检查 + 与既有任一色 RGB 三通道差禁止全部 <8/255),但**不占用 48 token 额度**;不过门照旧走「换色合并」,**禁加色绕行**。单张 PNG 的像素域色数上限 **≤32 色**另由 `standee_asset_check` 执法(按单图像素域取值方式计数,与本表 token 计数互不干扰)。额度不足时向作者报告,由作者决定压缩或合并既有色。验收:机检〈token 板 ≤48;每屏环境子板 ≤32〉
|
||||||
- **整屏有效色数总闸(色板第三层,2026-11-02 用户裁)**|整屏的色板纪律裁判面=**画面上成片出现的颜色数(有效色数)**,不是逐像素去重总数:多源并集与程序混合(压暗遮罩/软阴影/渐变/tween 中间帧)使逐像素色数随素材与渲染状态大幅漂移(实测同屏不同时点差一至九倍),不可治理也不承载观感。整屏唯一色数只保留「渲染真实发生」的存在性地板(地板值归闸件承载);**色板纪律的上限闸=每屏有效色数 ≤128**(**待定现用**——现行即执法、修订走登记,释义同色板增量纪律条)。构成推导源:双环境层 32×2+token 板 48+混合容差 16(←本条色板分层;推导源非额度分配,各层额度照旧独立执法)。超限处置沿色板增量纪律:先合并压缩既有色再进,禁加色绕行。有效色的测量口径(面积阈值等实现参数)归色数检查器承载,本圣经不载。验收:机检〈各屏有效色数 ≤128,口径=色数检查器现行定义〉
|
|
||||||
|
|
||||||
### 4.2 语义色彩规则
|
### 4.2 语义色彩规则
|
||||||
|
|
||||||
@@ -244,8 +233,8 @@
|
|||||||
- **紫赤只说 Boss 与精英** `#8F2F6A`(色相 323°):郑重来自色相独占,不来自压暗。禁:**HSV 色相 300°–345° 为信息层与语义物件禁入带**——UI、粒子、类型微光、语义物件及图类型色板信息面禁止落入;环境层(背景/装饰)可入但限低饱和,高饱和紫赤仍 Boss 独占。验收:机检〈信息层与语义物件色值色相不落 300°–345°;高饱和紫赤仅 Boss 战〉 ←§2.6;原三
|
- **紫赤只说 Boss 与精英** `#8F2F6A`(色相 323°):郑重来自色相独占,不来自压暗。禁:**HSV 色相 300°–345° 为信息层与语义物件禁入带**——UI、粒子、类型微光、语义物件及图类型色板信息面禁止落入;环境层(背景/装饰)可入但限低饱和,高饱和紫赤仍 Boss 独占。验收:机检〈信息层与语义物件色值色相不落 300°–345°;高饱和紫赤仅 Boss 战〉 ←§2.6;原三
|
||||||
- **绿只说自然生机**(环境植被;恢复类状态若有则用绿——待增益状态定夺)。**例外:类型微光治疗组**(见下条「类型微光色带」)。禁(信息层域):绿禁止承载逻辑状态(微光色带除外),禁止与红构成唯一区分对。验收:目检〈信息层域绿色仅微光治疗组;绿红不构成唯一区分对〉 ←原三
|
- **绿只说自然生机**(环境植被;恢复类状态若有则用绿——待增益状态定夺)。**例外:类型微光治疗组**(见下条「类型微光色带」)。禁(信息层域):绿禁止承载逻辑状态(微光色带除外),禁止与红构成唯一区分对。验收:目检〈信息层域绿色仅微光治疗组;绿红不构成唯一区分对〉 ←原三
|
||||||
- **类型微光色带 = 格面类型先验专用逻辑色带**(未开格类型预读的色彩通道;概念定义、可见范围与生命周期见《HUD框架》「未开格类型微光」节):未开格类型微光的信息色彩按以下五组执行——**通用增益组**(attack/defense/weaken/action/gp 五族)芥末黄 `#D6C13A`(≈52°)、**治疗组**(heal)黄绿 `#5CB83A`(≈104°)、**穿刺组**(pierce)青 `#2E9E9E`(≈180°)、**魔法组**(magic)紫罗兰 `#7B5BD6`(≈256°)、**群伤组**(blast)绯红 `#FF2D55`(≈349°,刻意避开危险红色相段与 300°–345° 禁入带)。验收:机检〈类型微光五组色值与本表一致〉
|
- **类型微光色带 = 格面类型先验专用逻辑色带**(未开格类型预读的色彩通道;概念定义、可见范围与生命周期见《HUD框架》「未开格类型微光」节):未开格类型微光的信息色彩按以下五组执行——**通用增益组**(attack/defense/weaken/action/gp 五族)芥末黄 `#D6C13A`(≈52°)、**治疗组**(heal)黄绿 `#5CB83A`(≈104°)、**穿刺组**(pierce)青 `#2E9E9E`(≈180°)、**魔法组**(magic)紫罗兰 `#7B5BD6`(≈256°)、**群伤组**(blast)绯红 `#FF2D55`(≈349°,刻意避开危险红色相段与 300°–345° 禁入带)。验收:机检〈类型微光五组色值与本表一致〉
|
||||||
- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压岩顶/地面明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉
|
- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压格底明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉
|
||||||
- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破岩顶/地面明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破岩顶/地面明度档与三态分类〉 ←§4.6.3
|
- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破格底明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破格底明度档与三态分类〉 ←§4.6.3
|
||||||
- **金/红兼作极性色相槽(§4.6)**:极性(概念定义与符号矩阵见《地图战斗资源》极性提案)的视觉取色只在这两族间——有利兑付 = 金族,有害兑付 = 红族,不新增语义色。验收:目检〈极性视觉取色仅金/红两族〉 ←§4.6;原二
|
- **金/红兼作极性色相槽(§4.6)**:极性(概念定义与符号矩阵见《地图战斗资源》极性提案)的视觉取色只在这两族间——有利兑付 = 金族,有害兑付 = 红族,不新增语义色。验收:目检〈极性视觉取色仅金/红两族〉 ←§4.6;原二
|
||||||
|
|
||||||
### 4.3 图类型色板换皮规则(board_type)
|
### 4.3 图类型色板换皮规则(board_type)
|
||||||
@@ -257,7 +246,7 @@
|
|||||||
- `wall_ambient` 墙雾氛围 tint:可带主题色相,L≥0.30。验收:机检〈wall_ambient tint L≥0.30〉
|
- `wall_ambient` 墙雾氛围 tint:可带主题色相,L≥0.30。验收:机检〈wall_ambient tint L≥0.30〉
|
||||||
- `variant_tint` 变异纹带染槽:只改色相不改纹形(纹带形按轴两分,见 §3.2 变异格形状通道;种类 = 地形变异六类型已定稿)。验收:目检〈同纹带形跨图类型仅色相不同〉
|
- `variant_tint` 变异纹带染槽:只改色相不改纹形(纹带形按轴两分,见 §3.2 变异格形状通道;种类 = 地形变异六类型已定稿)。验收:目检〈同纹带形跨图类型仅色相不同〉
|
||||||
|
|
||||||
**不变槽**:棋盘浮空数字字芯/描边、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,岩顶/地面两档明度关系(岩顶亮/地面暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9
|
**不变槽**:棋盘数字墨亮族三档、数字色牌(后备件)、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,格底两档明度关系(墙亮/空间暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9
|
||||||
|
|
||||||
### 4.4 UI 色板(方向指导,细则迁 §7.2)
|
### 4.4 UI 色板(方向指导,细则迁 §7.2)
|
||||||
|
|
||||||
@@ -269,7 +258,7 @@
|
|||||||
|
|
||||||
1. 已开 vs 未开:§3.2 完整/碎裂形承载,无需另加。验收:目检〈色弱模拟下两态以完整度可辨〉
|
1. 已开 vs 未开:§3.2 完整/碎裂形承载,无需另加。验收:目检〈色弱模拟下两态以完整度可辨〉
|
||||||
2. 已开 vs 变异格:纹带形状通道,灰度截图可辨,无需另加。验收:目检〈灰度截图下变异格可辨〉
|
2. 已开 vs 变异格:纹带形状通道,灰度截图可辨,无需另加。验收:目检〈灰度截图下变异格可辨〉
|
||||||
3. 封印印记 vs 巢穴(危险格):印记形物件对格面巢穴纹,无需另加。验收:目检〈色弱模拟下印记与巢穴纹可辨〉
|
3. 封印印记 vs 巢穴(危险格):印记形物件对砖面巢穴纹,无需另加。验收:目检〈色弱模拟下印记与巢穴纹可辨〉
|
||||||
4. 奖励金 vs 危险红(色弱下皆偏褐):§3.1 道具点两类剪影 + §3.4 满圆对刺缺 + 金粒运动,无需另加。验收:目检〈色弱模拟下奖励金与危险红可辨〉
|
4. 奖励金 vs 危险红(色弱下皆偏褐):§3.1 道具点两类剪影 + §3.4 满圆对刺缺 + 金粒运动,无需另加。验收:目检〈色弱模拟下奖励金与危险红可辨〉
|
||||||
5. Boss 紫赤 vs 其他敌:§5.1 形状独占,无需另加。验收:目检〈色弱模拟下 Boss 可辨〉
|
5. Boss 紫赤 vs 其他敌:§5.1 形状独占,无需另加。验收:目检〈色弱模拟下 Boss 可辨〉
|
||||||
6. 小人蓝 vs 青墨数字:明度悬殊 + 小人轮廓与底盘,无需另加。验收:目检〈色弱模拟下小人与数字可辨〉
|
6. 小人蓝 vs 青墨数字:明度悬殊 + 小人轮廓与底盘,无需另加。验收:目检〈色弱模拟下小人与数字可辨〉
|
||||||
@@ -387,35 +376,33 @@
|
|||||||
### 6.1 战斗舞台背景(B 区环境)
|
### 6.1 战斗舞台背景(B 区环境)
|
||||||
|
|
||||||
- **双舞台常驻下的 B 区环境**:战斗画面区(站桩立绘所在)的背景 = 明亮地窟,与 §1 风格基调同源——暖倾向、无压抑;背景整体**低对比自然后退**(§3.4 焦点预算延伸):背景禁止构成完整凸形、禁止抢 B 区立绘与 D 区数字的焦点,识别层级恒为 立绘 > 背景。验收:目检〈背景无完整凸形、立绘最抢眼〉
|
- **双舞台常驻下的 B 区环境**:战斗画面区(站桩立绘所在)的背景 = 明亮地窟,与 §1 风格基调同源——暖倾向、无压抑;背景整体**低对比自然后退**(§3.4 焦点预算延伸):背景禁止构成完整凸形、禁止抢 B 区立绘与 D 区数字的焦点,识别层级恒为 立绘 > 背景。验收:目检〈背景无完整凸形、立绘最抢眼〉
|
||||||
- **舞台正面目标**:B 区 = **地窟看台**——立绘脚下地台/落影承载(世界中层),背景环境层低饱和后退、明度走世界底层档;角色禁止直接贴平色底。规格与终值归整屏样张闸(§1.4)冻结。**地台面上零文字**——暖白 `#F0E2C8` 对地台板身 `#968264` 实测仅 2.89:1,已越 §7.2 的 4.5:1 硬指标,落法按 §7.2「文字禁直接压纹理底」(垫容器、素牌或罩层),非新条款;站桩文字位改垫素底或落进结算明细带(实装=站桩名字行垫 `HP_BAR_BACK` 深档素底牌、文字基线上移至地台顶上方)。验收:目检〈立绘脚下有地台/落影,非贴平色底〉+机检〈B 区站桩文字位正下方像素非地台板身色 #968264〉
|
- **舞台正面目标**:B 区 = **地窟看台**——立绘脚下地台/落影承载(世界中层),背景环境层低饱和后退、明度走世界底层档;角色禁止直接贴平色底。规格与终值归整屏样张闸(§1.4)冻结。**地台面上零文字**——暖白 `#F0E2C8` 对地台板身 `#968264` 实测仅 2.89:1,已越 §7.2 的 4.5:1 硬指标,落法按 §7.2「文字禁直接压纹理底」(垫容器、素牌或罩层),非新条款;站桩文字位改垫素底或落进结算明细带(实装=站桩名字行垫 `HP_BAR_BACK` 深档素底牌、文字基线上移至地台顶上方——2026-10-30 落地)。验收:目检〈立绘脚下有地台/落影,非贴平色底〉+机检〈B 区站桩文字位正下方像素非地台板身色 #968264〉
|
||||||
- **明度分层适用**:空间纵深与洞穴感走明度分层——世界底层档、光照氛围、色相饱和与形体承载(§3.2 同款逻辑)。验收:方向性
|
- **明度分层适用**:背景氛围的情绪表达仍禁止以压暗/渐晕实现(§2 禁令);空间纵深与洞穴感走明度分层允许域——世界底层档、光照氛围、色相饱和与形体承载(§3.2 同款逻辑)。验收:方向性
|
||||||
- **图类型联动**:背景层按 `board_type` 选三张变体(`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`,方向取 §6.3 三关色板候选);**背景不再走 §4.3 `wall_ambient` tint**(该槽保留给棋盘/世界的墙雾氛围,避免对三张背景二次染色)。紫赤仅 Boss 战允许短暂进入背景氛围纹样(§2.6 色相独占的舞台侧延伸,高饱和独占不变),非 Boss 战高饱和紫赤禁入。验收:机检〈背景吸色无非 Boss 高饱和紫赤;背景素材不引用 `wall_ambient` 槽〉
|
- **图类型联动**:背景层按 `board_type` 选三张变体(`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`,方向取 §6.3 三关色板候选);**背景不再走 §4.3 `wall_ambient` tint**(该槽保留给棋盘/世界的墙雾氛围,避免对三张背景二次染色)。紫赤仅 Boss 战允许短暂进入背景氛围纹样(§2.6 色相独占的舞台侧延伸,高饱和独占不变),非 Boss 战高饱和紫赤禁入。验收:机检〈背景吸色无非 Boss 高饱和紫赤;背景素材不引用 `wall_ambient` 槽〉
|
||||||
- **场景构成(2026-10-31 用户裁)**:B 区舞台从远到近分三段——**顶部空区**:洞顶以上的昏暗空间,只留深色空区,**不画钟乳石、吊锥、悬挂物或任何可辨形状**;**远景(纵深洞厅)**:不是贴墙的后壁,按远/中/近三层组织——远层暗剪影(远处洞口/通道、层叠岩体、洞底轮廓)、中层主要细节层(岩台、岩柱、凹壁、裂缝)、近层左右暗色岩框;剪影被中层部分遮挡、不贴顶、不孤立,**禁贴墙感、禁单件圆柱贴顶、禁砖石墙/规则砌缝/方整石块**;三关母题(地精=支洞/木栈道/木桩围栏;卓尔=巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;灰矮人=石笋城郭/棱角石厅/石桥/矿道口/烟囱塔)见 `battle-stage-prompts.md` §3.2;**分隔带**:远壁根部与近景地面之间一条不规则碎石带/阴影缝,边界清楚但不笔直,**禁瓷砖缝、踢脚线、规则台阶**;**近景地面**:干净压实泥土为主,全幅只零星几颗小石、散点分布,中央平缓留空给角色站位,**禁成排/成堆碎石、满铺砂砾、泥点噪声、瓷砖、规则铺装、草、木地板**。纵深与三段构图归 §1.4 样张;逐条要素、分层提示词与否定后缀 = `battle-stage-prompts.md`(本文件不重复维护)。验收:目检〈顶部无钟乳石/吊锥;远景有纵深、非贴墙;无孤立圆柱贴顶;近景为泥土碎石;分隔带不规则;中央无大障碍〉
|
- **场景构成(2026-10-31 用户裁)**:B 区舞台从远到近分三段——**顶部空区**:洞顶以上的昏暗空间,只留深色空区,**不画钟乳石、吊锥、悬挂物或任何可辨形状**;**远景(纵深洞厅)**:不是贴墙的后壁,按远/中/近三层组织——远层暗剪影(远处洞口/通道、层叠岩体、洞底轮廓)、中层主要细节层(岩台、岩柱、凹壁、裂缝)、近层左右暗色岩框;剪影被中层部分遮挡、不贴顶、不孤立,**禁贴墙感、禁单件圆柱贴顶、禁砖石墙/规则砌缝/方整石块**;三关母题(地精=支洞/木栈道/木桩围栏;卓尔=巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;灰矮人=石笋城郭/棱角石厅/石桥/矿道口/烟囱塔)见 `battle-stage-prompts.md` §3.2;**分隔带**:远壁根部与近景地面之间一条不规则碎石带/阴影缝,边界清楚但不笔直,**禁瓷砖缝、踢脚线、规则台阶**;**近景地面**:干净压实泥土为主,全幅只零星几颗小石、散点分布,中央平缓留空给角色站位,**禁成排/成堆碎石、满铺砂砾、泥点噪声、瓷砖、规则铺装、草、木地板**。纵深与三段构图归 §1.4 样张;逐条要素、分层提示词与否定后缀 = `battle-stage-prompts.md`(本文件不重复维护)。验收:目检〈顶部无钟乳石/吊锥;远景有纵深、非贴墙;无孤立圆柱贴顶;近景为泥土碎石;分隔带不规则;中央无大障碍〉
|
||||||
- **图层归属(2026-10-31 用户裁)**:背景层 = 三关变体 `scene_stage_bg_dungeon/_underdark/_deep_underdark.png`(顶部空区+纵深洞厅远景,不画近景地面;按 `board_type` 选一张);近景地面 = **独立连续地面层** `scene_stage_ground.png`(泥土/砂砾/碎石地面,全宽、底边贴 B 区底、顶缘即分隔带;高度读布局表 `ground_h`,字段值 100);现有每角色小石台 `scene_stage_plaza.png` 保留,叠在连续地面之上。连续地面层与小石台**三关共用**、跨关恒定、**不吃 `wall_ambient` tint**(世界中层承载面随关卡换明度会破 §2 层间关系);背景三张变体各自带关卡色族,不再叠 tint。验收:机检〈三张背景文件名带 board_type 后缀;地面层/小石台文件名无 board_type 后缀;背景与地面层均不引用 `wall_ambient` 槽〉
|
- **图层归属(2026-10-31 用户裁)**:背景层 = 三关变体 `scene_stage_bg_dungeon/_underdark/_deep_underdark.png`(顶部空区+纵深洞厅远景,不画近景地面;按 `board_type` 选一张);近景地面 = **独立连续地面层** `scene_stage_ground.png`(泥土/砂砾/碎石地面,全宽、底边贴 B 区底、顶缘即分隔带;高度读布局表 `ground_h`,字段由地面层实装批新增并回填,本批终稿高 100、代码批落表);现有每角色小石台 `scene_stage_plaza.png` 保留,叠在连续地面之上。连续地面层与小石台**三关共用**、跨关恒定、**不吃 `wall_ambient` tint**(世界中层承载面随关卡换明度会破 §2 层间关系);背景三张变体各自带关卡色族,不再叠 tint。验收:机检〈三张背景文件名带 board_type 后缀;地面层/小石台文件名无 board_type 后缀;背景与地面层均不引用 `wall_ambient` 槽〉
|
||||||
- **资产渠道与契约**:✦ 插画级(演出类场景贴图,清单 §4 联动登记);战斗一屏样张(§1.4 清单 1.2)含背景出样。**背景层 = 三张按关卡变体** `scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`(源 = 基准屏宽 × `stage_h`,读布局表 `game/data/tables/battle_layout.tres`;显示 1×;按 `board_type` 选图;**不走 `wall_ambient` tint**);三张共用本节构图规则,仅岩体形态与色族按 §6.3 三关方向不同。**背景只画顶部空区+纵深洞厅远景,不画近景地面**:结算期明细带整条压住 B 区底带(带高 = `log_band_h_settle`,读布局表),近景地面在独立层;画进背景等于画一件永远看不见、且会随背景变体重复的东西。**连续地面层** = `scene_stage_ground.png`(源 = 基准屏宽 × `ground_h`,读布局表;显示 1×;三关共用、跨关恒定、不吃 tint);地面层是极宽薄条,出图与后处理按 `battle-stage-prompts.md` §2.2 的工艺(可平铺纹理条/最宽档裁切,禁横向拉伸)。**光柱不迁入背景**:三张背景均不画光柱/光带/光束/光晕与任何光源实体,明暗只由岩体层理与暗部承载;原四柱程序层与平色底已退役(背景资产接管该绘制面,平色缺图回退改指状态槽底色)。资产已入包;出图工单 = `battle-stage-prompts.md`,交付记录见本节「B 区舞台背景与共用地面的交付绑定」。验收:目检〈三关背景可辨为不同洞窟,非同一图换色;远景有纵深、非贴墙;无孤立圆柱贴顶;背景无地台/地面结构件、无砖石墙、无瓷砖地面、无光柱/光带;地面层为泥土/砂砾/碎石〉
|
- **资产渠道与契约**:✦ 插画级(演出类场景贴图,清单 §4 联动登记);战斗一屏样张(§1.4 清单 1.2)含背景出样。**背景层 = 三张按关卡变体** `scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`(源 = 基准屏宽 × `stage_h`,读布局表 `game/data/tables/battle_layout.tres`;显示 1×;按 `board_type` 选图;**不走 `wall_ambient` tint**);三张共用本节构图规则,仅岩体形态与色族按 §6.3 三关方向不同。**背景只画顶部空区+纵深洞厅远景,不画近景地面**:结算期明细带整条压住 B 区底带(带高 = `log_band_h_settle`,读布局表),近景地面在独立层;画进背景等于画一件永远看不见、且会随背景变体重复的东西。**连续地面层** = `scene_stage_ground.png`(源 = 基准屏宽 × `ground_h`,读布局表;显示 1×;三关共用、跨关恒定、不吃 tint);地面层是极宽薄条,出图与后处理按 `battle-stage-prompts.md` §2.2 的工艺(可平铺纹理条/最宽档裁切,禁横向拉伸)。**光柱不迁入背景**:三张背景均不画光柱/光带/光束/光晕与任何光源实体,明暗只由岩体层理与暗部承载;现行四柱程序层是临时占位,资产到位后直接退役(代码批)。资产已入包(2026-10-31),四柱程序层与平色底由代码批退役/改指;出图工单 = `battle-stage-prompts.md`,交付记录见本节「B 区舞台背景与共用地面的交付绑定」。验收:目检〈三关背景可辨为不同洞窟,非同一图换色;远景有纵深、非贴墙;无孤立圆柱贴顶;背景无地台/地面结构件、无砖石墙、无瓷砖地面、无光柱/光带;地面层为泥土/砂砾/碎石〉
|
||||||
- **B 区舞台背景与共用地面的交付绑定**:三张背景与一张地面已按本节契约入包 `game/assets/art/scene/`——`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png` 均 1280×252、不透明全幅、单张 ≤32 色、按 `board_type` 选图;`scene_stage_ground.png` 1280×100、顶缘以上透明、单张 ≤32 色、三关共用。地面按作者裁保留候选 v12b 原亮度(实测不透明域 L≈0.132,低于 §2 世界中层 0.22–0.45,登记为作者例外;后续调亮归调参/替换,不重开设计);背景实测 L:dungeon 0.0148、underdark 0.0132、deep_underdark 0.0111(后两者低于世界底层下沿带下限 0.014 不超过 0.003,登记读数)。验收:机检〈四件文件名与尺寸逐位相符;地面顶缘以上 alpha=0、不透明域 ≤32 色;背景不透明全幅 ≤32 色〉+目检〈三关可辨、无光柱、地面读作泥土〉。参考指针:`asset-path-map.md` `scene/` 行、`battle-stage-prompts.md` §2/§4。
|
- **B 区舞台背景与共用地面的交付绑定(2026-10-31 入包)**:三张背景与一张地面已按本节契约入包 `game/assets/art/scene/`——`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png` 均 1280×252、不透明全幅、单张 ≤32 色、按 `board_type` 选图;`scene_stage_ground.png` 1280×100、顶缘以上透明、单张 ≤32 色、三关共用。地面按作者 2026-10-31 裁保留候选 v12b 原亮度(实测不透明域 L≈0.132,低于 §2 世界中层 0.22–0.45,登记为作者例外;后续调亮归调参/替换,不重开设计);背景实测 L:dungeon 0.0148、underdark 0.0132、deep_underdark 0.0111(后两者低于世界底层下沿带下限 0.014 不超过 0.003,登记读数)。验收:机检〈四件文件名与尺寸逐位相符;地面顶缘以上 alpha=0、不透明域 ≤32 色;背景不透明全幅 ≤32 色〉+目检〈三关可辨、无光柱、地面读作泥土〉。参考指针:`asset-path-map.md` `scene/` 行、`battle-stage-prompts.md` §2/§4。
|
||||||
- **近景地面与地台走独立件**:连续地面层 `scene_stage_ground.png` 与角色脚下小石台 `scene_stage_plaza.png` 均为独立层,三关共用、跨关恒定。小石台源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形(规格见 §8.2);连续地面层的顶缘即分隔带(不规则碎石/阴影缝,不是直线亮边)。独立的两条理由——① 三张背景按关卡变体,地面若画进任一背景就得三张各画一遍、且三关站位面会漂移;② 结算期明细带整条压住底带(带高读 `log_band_h_settle`),地面在独立层才能跨关恒定并保持世界中层承载面不变。小石台先保留,是否退役归后续裁决。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉+目检〈连续地面为泥土碎石、顶缘不规则〉
|
- **近景地面与地台走独立件**:连续地面层 `scene_stage_ground.png` 与角色脚下小石台 `scene_stage_plaza.png` 均为独立层,三关共用、跨关恒定。小石台源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形(规格见 §8.2);连续地面层的顶缘即分隔带(不规则碎石/阴影缝,不是直线亮边)。独立的两条理由——① 三张背景按关卡变体,地面若画进任一背景就得三张各画一遍、且三关站位面会漂移;② 结算期明细带整条压住底带(带高读 `log_band_h_settle`),地面在独立层才能跨关恒定并保持世界中层承载面不变。小石台先保留,是否退役归实装批/后续裁决。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉+目检〈连续地面为泥土碎石、顶缘不规则〉
|
||||||
|
|
||||||
### 6.2 营地场景
|
### 6.2 营地场景
|
||||||
|
|
||||||
- **情绪与色域**:承载 §2.8——全作最暖:烛光黄 `#F6C667` × 木色 `#8A5A34`(§7.2),中等饱和,无棋盘式高对比。
|
- **情绪与色域**:承载 §2.8——全作最暖:烛光黄 `#F6C667` × 木色 `#8A5A34`(§7.2),中等饱和,无棋盘式高对比。
|
||||||
- **场景构成**:一张可点击的营地场景图(1280×800,与工程档同幅面)。远景=天空与远山;中景=**独立成层的木围墙**(密排竖木桩、桩顶削尖、不透缝无横木)与**半开的营地大门**;近景=中央篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板。**中景带自底部往上约 2/3 处起**;**近景物件可覆盖围墙,唯一例外=中间门洞必须留空、不被任何物件遮挡**。七个可点物件的功能绑定归 `camp.md`,本节只定画法。
|
- **场景构成**:一张可点击的营地场景图(1280×800,与工程档同幅面)。远景=天空与远山;中景=**独立成层的木围墙**(密排竖木桩、桩顶削尖、不透缝无横木)与**半开的营地大门**;近景=中央篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板。**中景带自底部往上约 2/3 处起**;**近景物件可覆盖围墙,唯一例外=中间门洞必须留空、不被任何物件遮挡**。七个可点物件的功能绑定归 `camp.md`,本节只定画法。
|
||||||
- **图层拆分(10 张)**:场景按「远景/中景/近景要素各自成层」拆——`scene_camp_bg` 背景层(z0,不透明全幅)=天空+远山+整片地面+门洞内一条通向远处的小路;`scene_camp_wall` 围墙层(z1,透明底)=横贯全宽密排木桩墙(左右两段)+两根略高的门柱,**门洞处留透明缺口**透出背景层的小路;`scene_camp_board` 布告板(z2)、`scene_camp_gate` 门扇(z3)、`scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷(z4)、`scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本(z5)、`scene_camp_campfire` 篝火(z6,最前)=八个物件层,各透明底单件一张。**帐篷**为承载件、不可点。围墙独立成层的好处:桩高可单独锁死、门洞做透明缺口、背景层不混入暖木色。提示词与坐标 = `camp-scene-prompts.md`,消费常量 = `asset-path-map`。
|
- **图层拆分(10 张)**:场景按「远景/中景/近景要素各自成层」拆——`scene_camp_bg` 背景层(z0,不透明全幅)=天空+远山+整片地面+门洞内一条通向远处的小路;`scene_camp_wall` 围墙层(z1,透明底)=横贯全宽密排木桩墙(左右两段)+两根略高的门柱,**门洞处留透明缺口**透出背景层的小路;`scene_camp_board` 布告板(z2)、`scene_camp_gate` 门扇(z3)、`scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷(z4)、`scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本(z5)、`scene_camp_campfire` 篝火(z6,最前)=八个物件层,各透明底单件一张。**帐篷**为承载件、不可点。围墙独立成层的好处:桩高可单独锁死、门洞做透明缺口、背景层不混入暖木色。提示词与坐标 = `camp-scene-prompts.md`,消费常量 = `asset-path-map`。
|
||||||
- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。背景层由**远景片 `bg_far`(2560×734)与地面片 `bg_floor`(2560×866)两片出图、按 y734 拼成一张**——整张一次出图时模型把远山挤到画面下半部,被围墙挡住后完全消失(实测三张里两张山体上缘落在墙顶以下)。接缝整条落在围墙背后,画面无接缝。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB);**实装落盘矩形 `(0, 220, 1280, 200)`、底锚 y420**(2026-11-07 用户裁:墙高 200、顶 y220;素材 1280×164 按 200 高显示拉伸,桩身/门柱比例随缩放;围墙带 (0,220,1280,200))。
|
- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条 `(0, 240, 1280, 70)` 裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB)。
|
||||||
- **墙脚入土线(2026-11-07 用户裁)**:围墙不与地面以直线相接——墙底按 1–7px 低频起伏裁成透明缺口,透出背景层地面纹理,读作桩子插入土中。像素级判据:墙底不存在贯通全宽的直线边界,缺口透出的像素与背景层同列地面纹理同源。参考图指针=[camp-scene-prompts](camp-scene-prompts.md) §5 第 12 条。验收:目检〈墙底无贯通直线、桩脚有入土感〉
|
- **色彩与氛围依据**:营地场景的冷暖分工(冷的大面积后退、暖的小面积前进)、空气透视三档与大面积用色规则 = `reports/提案-营地色彩与氛围脚本-2026-10-23.md`。本节不复述色值;新增环境色按 §4.1 场景环境子板条款登记(每屏一套、≤32 色、过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门)。
|
||||||
- **色彩与氛围依据**:营地的暖由晒白的地面、木色物件与烛光黄承载,安全温馨,与冒险中的地下城形成对比;远景=正午强日照——天空淡晴蓝(高明度低饱和的清蓝)、远山一整片连续的淡蓝灰山体(禁层叠轮廓带与阴影台阶)、草地与土路晒白,整体淡而退后,近景暖调为主。现行口径 = 本文件 §2.8「全作最暖」(管菜单容器与元进度,不约束背景天空)与本节「情绪与色域」条。本节不复述色值;新增环境色按 §4.1 场景环境子板条款登记(背景层自板 ≤32 色、营地屏双板制并集 ≤64,过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门)。
|
|
||||||
- **背景层环境色与自板(2026-11-07 录入登记)**:背景层单张走自板 ≤32 色,环境色五族=淡晴蓝天空、淡蓝灰一整片远山、晒白浅黄绿草地、暖米白土路、泛白米黄营地地面;新增色过 §4.1 两道门,近色走换色合并(本次 4 对:九件板 `#D7B281`→`#D1B27F`;全局色板基线 `#B3C8D3`→`#BAC1D2`、`#DCEDF5`→`#D8ECF0`、`#E7E5D2`→`#EBE8CE`)。像素级判据:机检〈单张像素域唯一色 ≤32;palette_check 对九件主色板基线与全局色板基线(`game/tests/golden/palette_baseline/`)均零近色红〉;目检判读句=[camp-scene-prompts](camp-scene-prompts.md) §4 远景片两条(淡晴蓝/一整片山体)。参考图指针=[asset-path-map](asset-path-map.md) §3 scene/ 行(`scene_camp_bg`)。验收:机检〈单张 ≤32 且 palette_check 零红〉+目检〈天空淡蓝不深饱和、山体一整片无层叠带〉
|
|
||||||
- **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。
|
- **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。
|
||||||
- **钥石余额**:常驻画面顶部的一行小 HUD 栏(高 48px,**浮层覆盖,不挤压画面**)。栏体底=`CAMP_HEADER_BAND` `#6E4526`(§7.2 五 token 对齐表在册色)× 不透明度 0.80;栏内只钥石徽章一件、右位顶格,左位不放件。呈现定值的唯一事实源=[camp](../ux/camp.md) §顶栏,本节不复述判据。验收:目检〈顶栏成一条可辨窄带,徽章落在带内〉
|
- **钥石余额**:常驻画面顶部的一行小 HUD 栏(高 48px,**浮层覆盖,不挤压画面**)。
|
||||||
- **事实源边界**:解锁条件/价格/存档写入归元进度 GDD 与 `MetaProgression`;素材命名与路径归 `asset-path-map`;清单登记归 `art-assets-checklist` §3.5。
|
- **事实源边界**:解锁条件/价格/存档写入归元进度 GDD 与 `MetaProgression`;素材命名与路径归 `asset-path-map`;清单登记归 `art-assets-checklist` §3.5。
|
||||||
- **已裁(2026-11-01 用户裁)**:① **营地环境子板色值**——不前置拍板:量化场景实际用色后按 §4.1 场景环境子板条款登记(背景层自板 ≤32 色、营地屏双板制并集 ≤64,过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门);② **门扇与门洞的高宽比例**——显示矩形 240×147(贴图可见高 138),门扇件沿用 240×211 由运行时压扁(2026-11-07 用户裁「不动美术素材」),坐标按门洞 x520–760 对齐、底压墙底 y420;③ **帐篷的落地尺寸**——251×170 落位 (982, 335),上端遮住围墙下部。
|
- **待裁(本节不填数,由作者定)**:① **营地环境子板色值**——色彩脚本只给定色方向,落地色值属 §4.1 单点,须过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门;② **门扇与门洞的高宽比例**——中景带自底部往上约 2/3 处起之后高度有限,门扇高度远超围墙带,两者关系待作者重定;③ **帐篷的落地尺寸**——帐篷体量大于被替换的旧承载件,尺寸待作者重定;坐标草案的现行出口见 `camp.md` 的指路句。
|
||||||
|
|
||||||
### 6.3 三关图类型色板候选(board_type 换挡方向)
|
### 6.3 三关图类型色板候选(board_type 换挡方向)
|
||||||
|
|
||||||
- **模板与不变槽**:换皮只换 §4.3 四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`),信息与语义层全图类型恒定——本节的三关两槽终值**已冻结**。**冻结口径(本节不抄色值字面量)**:各关 `tile_closed` 终值=该关**岩体顶面基色**(dungeon 基准档 `#9C8462`;underdark/deep 取 §4.1「三关棋盘环境八色」的岩顶/地面值),`wall_ambient` 取同关同槽值(两槽同值;同属 §4.1 分层②场景环境子板,零新增色值、不占 48 额度);实测值与准入判定只在执行件里算,执行件用法登记见 [art-pipeline-tools](art-pipeline-tools.md)。**2026-11-07 棋盘地形换代**:旧「在役墙瓦片三块底型件实测最亮值」口径随 16+5 瓦片套退役失效;三关 `tile_closed`/`tile_open` 终值 = §4.1「三关棋盘环境八色」的岩顶/地面色(2026-11-07 用户看样张通过,冻结),旧瓦片均值不作终值;三关互辨抽测按新材质同批重跑(旧冻结凭据沿革查 git 提交史)。验收:机检〈三关行两槽终值与互辨抽测执行件的实测读数同值(该件三行铺底代表值判定全过),且本节三关行不含色值字面量〉
|
- **模板与不变槽**:换皮只换 §4.3 四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`),信息与语义层全图类型恒定——本节只给三关**方向性候选**,终值按 §4.3 现行规则重跑 §1.4 格子样张冻结。**终值的取值程序**:先跑「三关色相 × 五组类型微光」互辨抽测(抽测任务登记在待办清单),再按 §4.3 现行规则重跑 §1.4 格子样张冻结——本节不填终值色值,待该抽测与格子样张重跑后落本节修订。验收:机检〈本节三关行无 `tile_closed`/`wall_ambient` 终值色值字面量(终值未冻结前禁填)〉
|
||||||
- **三关背景变体**:§6.1 的三张背景取本节三关方向作为岩体形态、剪影语言与色族差异(dungeon 暖石棕+地精巢穴支洞/木栈道/木桩围栏;underdark 冷蓝灰+卓尔巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;deep_underdark 灰黑+灰矮人石笋城郭/棱角石厅/矿道口/烟囱塔);背景不复用 `wall_ambient` tint(该槽作用于棋盘/世界),背景色值归战斗屏场景环境子板。验收:目检〈三关背景可辨为不同洞窟,非同一图换色〉
|
- **三关背景变体**:§6.1 的三张背景取本节三关方向作为岩体形态、剪影语言与色族差异(dungeon 暖石棕+地精巢穴支洞/木栈道/木桩围栏;underdark 冷蓝灰+卓尔巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;deep_underdark 灰黑+灰矮人石笋城郭/棱角石厅/矿道口/烟囱塔);背景不复用 `wall_ambient` tint(该槽作用于棋盘/世界),背景色值归战斗屏场景环境子板。验收:目检〈三关背景可辨为不同洞窟,非同一图换色〉
|
||||||
- **深度轴叙事**(§2.7 下探过渡):色相层进预告「更深更险」,明度档不动——
|
- **深度轴叙事**(§2.7 下探过渡):色相层进预告「更深更险」,明度档不动——
|
||||||
- **dungeon 地精洞窟**(第一关):现行岩体系暖石棕(岩顶 `#9C8462` 基)即基准档,`wall_ambient` 暖棕;
|
- **dungeon 地精洞窟**(第一关):现行掩尘系暖石棕(`#C9AF83` 基)即基准档,`wall_ambient` 暖棕;
|
||||||
- **underdark 幽暗地域**(第二关;方向:**冷调幽暗**):主调**灰白蓝**候选(低饱和蓝灰域,`tile_closed`),少量紫黑倾向点缀——紫系取紫罗兰域(≈256°)候选,禁入带 300°–345° 不变;`wall_ambient` 冷蓝灰;
|
- **underdark 幽暗地域**(第二关;方向:**冷调幽暗**):主调**灰白蓝**候选(低饱和蓝灰域,`tile_closed`),少量紫黑倾向点缀——紫系取紫罗兰域(≈256°)候选,禁入带 300°–345° 不变;`wall_ambient` 冷蓝灰;
|
||||||
- **deep_underdark 灰矮人矿城**(第三关;方向:**灰黑主调 + 矿脉金属色点缀**候选,守 §4.1 明度地板 L≥0.30):矿脉点缀走金属质感族(冷银/铜灰候选)——「金属色」以材质感承载,奖励金亮金仍禁上格底(§4.2),不占用收益语义金;`wall_ambient` 铁灰。
|
- **deep_underdark 灰矮人矿城**(第三关;方向:**灰黑主调 + 矿脉金属色点缀**候选,守 §4.1 明度地板 L≥0.30):矿脉点缀走金属质感族(冷银/铜灰候选)——「金属色」以材质感承载,奖励金亮金仍禁上格底(§4.2),不占用收益语义金;`wall_ambient` 铁灰。
|
||||||
- **共同纪律**:三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险);避 300°–345° 禁入带;L≥0.30、饱和 ≤0.55(§4.1 硬指标)。
|
- **共同纪律**:三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险);避 300°–345° 禁入带;L≥0.30、饱和 ≤0.55(§4.1 硬指标)。
|
||||||
@@ -431,10 +418,11 @@
|
|||||||
|
|
||||||
- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——现行事实源「灯光区起步半径=微光环 8 格」的落码取值(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,现行事实源《HUD框架》「未开格类型微光」节),**不随灯光区扩**(权威文档配套裁决)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:FOG_LANTERN_BONUS = **+2**(flat 整数档,权威文档配套裁决;落码常量名 `board_view.gd FOG_LANTERN_BONUS`),**已接效果入库**(载体=秘宝·同调位 fog_lantern「魔法提灯」行,组合根每战装配链显式重算接线;呈现画法零改动——本节只管"怎么画",机制现行事实源仍归《HUD框架》)。边界随角色格位逐格重算,无半径插值动画。←现行事实源;§2 光照氛围允许域
|
- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——现行事实源「灯光区起步半径=微光环 8 格」的落码取值(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,现行事实源《HUD框架》「未开格类型微光」节),**不随灯光区扩**(权威文档配套裁决)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:FOG_LANTERN_BONUS = **+2**(flat 整数档,权威文档配套裁决;落码常量名 `board_view.gd FOG_LANTERN_BONUS`),**已接效果入库**(载体=秘宝·同调位 fog_lantern「魔法提灯」行,组合根每战装配链显式重算接线;呈现画法零改动——本节只管"怎么画",机制现行事实源仍归《HUD框架》)。边界随角色格位逐格重算,无半径插值动画。←现行事实源;§2 光照氛围允许域
|
||||||
- **区外未开格:全黑不渲染(不透明档,照抄现行事实源)**:现行事实源原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③现行事实源验收线「区外未开格不可见」须二值态才能逐格断言。←现行事实源;§4.2
|
- **区外未开格:全黑不渲染(不透明档,照抄现行事实源)**:现行事实源原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③现行事实源验收线「区外未开格不可见」须二值态才能逐格断言。←现行事实源;§4.2
|
||||||
- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地面材质原样 + 灰罩压顶**——地面直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动(原「程序化素色记忆板平涂」已弃用);格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**。记忆态数字以记忆墨直画、不使用数字底牌(浮空层随格隐没)。**封印印记与封印格身份色牌不在记忆态面**:封印格已揭示,区外记忆态灰罩下印记与色牌随格隐没、灯光区移回复显(纯呈现,封印数据零影响,现行事实源的显式推论)。←HUD框架 可访问性基线;§4.1;§3.2
|
- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地板纹理原样 + 灰罩压顶**——纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动(原「程序化素色记忆板平涂」已弃用);格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,现行事实源的显式推论)。←HUD框架 可访问性基线;§4.1;§3.2
|
||||||
- **记忆态可读性判据**:数字对合成底**归一后(真实渲染面)三关 ≥4.5:1**(WCAG 硬指标;合成底取 §4.1 三关地面色叠加 `FOG_MEMORY_PLATE` α0.66;行值以实现批 `ui_contrast_probe` 实测登记,测点=该探针迷雾段)。旧瓦片均值派生随 `terrain_*` 退役,不再作为测点基准。可辨性自查(三通道,随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对活态字芯 #F0E2C8 L≈0.77,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖字芯);③格态三形在记忆态保持灰度可辨——形通道经材质+灰罩形态不变,沿 §1.4 验收 2 同源判据。验收:机检〈ui_contrast_probe 迷雾段记忆墨对比 ≥4.5:1〉←§1.4
|
- **记忆态可读性判据**:数字对合成底**归一后(真实渲染面)三关 ≥4.5:1**(WCAG 硬指标;合成底 L1 #4C4038/L2 #3F4147/L3 #3E4048;行值与素材随动,测点=ui_contrast_probe 迷雾段)。**归一注**:装载亮度归一是现行生产路径(`board_view._normalize_floor_luma`),原图均值≠渲染面,复算须落归一后底。可辨性自查(三通道,随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。验收:机检〈ui_contrast_probe 迷雾段记忆墨对比 ≥4.5:1〉←§1.4
|
||||||
- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与棋盘地形体系(§3.2)的整格表达、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2
|
- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2
|
||||||
- **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加规则 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉
|
- **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加规则 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉
|
||||||
|
- **§2 明度禁令自查**:迷雾遮蔽与记忆态灰显属 §2 明度分层**光照氛围允许域**(洞穴举灯的空间光照呈现,与 Moonlighter 取列「亮地板/暗深渊/发光体」光照层次同族),非情绪压暗(§9.2 Darkest 反面条款不触——那禁的是情绪表达)、非状态明暗编码(格态语义仍由形+色相承载,灰度下三态可辨不受扰)。←§2;§9.1;§9.2
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -444,7 +432,7 @@
|
|||||||
|
|
||||||
### 7.1 形状语法细则(自 §3.3 迁入)
|
### 7.1 形状语法细则(自 §3.3 迁入)
|
||||||
|
|
||||||
**半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**棋盘数字已改浮空描边字(§3.2),UI 不再有数字色牌形态**;其余数据件属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。验收:目检〈面板圆角/按钮凸圆角/数据直角三态可辨〉
|
**半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**数字色牌 = 直角小素牌**(后备件)——宽随数字位、无纹理无装饰,仅复杂格底兜底时垫于数字正下方一层(色值 §4.1),属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。验收:目检〈面板圆角/按钮凸圆角/数据直角三态可辨〉
|
||||||
|
|
||||||
- **极性强调冗余**(§4.5⑦):UI 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认禁止同位(位置通道)。验收:目检〈红/金强调位有图标+文案,破坏性确认独立位〉
|
- **极性强调冗余**(§4.5⑦):UI 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认禁止同位(位置通道)。验收:目检〈红/金强调位有图标+文案,破坏性确认独立位〉
|
||||||
- **圆角率单点注记**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT = 5`(ui_kit 单点;面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持 0 直角;**例外三件保留**=标题屏底座椭圆 17/结算金印 200(圆形蜡封)/状态脉冲环 100(圆形)。验收:机检〈ui_kit 圆角取值仅 RADIUS_OBJECT 与例外三件〉
|
- **圆角率单点注记**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT = 5`(ui_kit 单点;面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持 0 直角;**例外三件保留**=标题屏底座椭圆 17/结算金印 200(圆形蜡封)/状态脉冲环 100(圆形)。验收:机检〈ui_kit 圆角取值仅 RADIUS_OBJECT 与例外三件〉
|
||||||
@@ -470,10 +458,10 @@
|
|||||||
### 7.4 字体与字号
|
### 7.4 字体与字号
|
||||||
|
|
||||||
- **字体**:全局一套像素字,单套即终稿——缝合像素字体 Fusion Pixel(OFL,已接入 `game/assets/fonts/ui_font_fusion_pixel_zh_hans.ttf`),拉丁字符与数字沿用其自带拉丁字形,不另设拉丁专件(现状即终稿;旧拉丁候选 Kenney Fonts 已弃;生产工单=清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。验收:机检〈主题字体指向 Fusion Pixel 件〉
|
- **字体**:全局一套像素字,单套即终稿——缝合像素字体 Fusion Pixel(OFL,已接入 `game/assets/fonts/ui_font_fusion_pixel_zh_hans.ttf`),拉丁字符与数字沿用其自带拉丁字形,不另设拉丁专件(现状即终稿;旧拉丁候选 Kenney Fonts 已弃;生产工单=清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。验收:机检〈主题字体指向 Fusion Pixel 件〉
|
||||||
- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座):棋盘浮空数字字高 **21px 固定**(7px 像素字 ×3,不随格边缩放;见 §3.2 浮空数字)、**正文/明细 ≥16px、tooltip ≥14px**(1280×800 低于 1080p 基准,同字号实际更小)。验收:机检〈静态文字位点字号 ≥ 档位表值〉
|
- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座):棋盘数字 ≥18px(公式 = `max(18, ceil(格边长 × 0.5))`不变)、**正文/明细 ≥16px、tooltip ≥14px**(1280×800 低于 1080p 基准,同字号实际更小)。验收:机检〈静态文字位点字号 ≥ 档位表值〉
|
||||||
- **字号档位表(六档)**:全站 UI 文字字号只经 `UiKit.FS_*` 单点取值,裸数字字号弃用——`FS_CAPTION 12`/`FS_HINT 14`/`FS_BODY 16`/`FS_SUB 18`/`FS_TITLE 24`/`FS_H1 34`。旧实测档按就近归档收编(10/11/12→CAPTION、13/14→HINT、15/16→BODY、17/18/20→SUB、21/22/24/26→TITLE、32/40→H1;静态位点全归档,数据驱动动态字号位点除外);棋盘浮空数字 21px 定值(非 UI 文字档)与站桩血数 11px(条带内读数豁免)不入表。注:六档相邻比 12→14→16→18 三段 <1.25×,系裁决值优先于字重纪律的档差参考线,该参考线对新层级设计仍有效。验收:机检〈全站无裸数字字号,位点走 FS_*〉
|
- **字号档位表(六档)**:全站 UI 文字字号只经 `UiKit.FS_*` 单点取值,裸数字字号弃用——`FS_CAPTION 12`/`FS_HINT 14`/`FS_BODY 16`/`FS_SUB 18`/`FS_TITLE 24`/`FS_H1 34`。旧实测档按就近归档收编(10/11/12→CAPTION、13/14→HINT、15/16→BODY、17/18/20→SUB、21/22/24/26→TITLE、32/40→H1;静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式 `maxi(18, ceil(格边长×0.5))` 与站桩血数 11px(条带内读数豁免)不入表。注:六档相邻比 12→14→16→18 三段 <1.25×,系裁决值优先于字重纪律的档差参考线,该参考线对新层级设计仍有效。验收:机检〈全站无裸数字字号,位点走 FS_*〉
|
||||||
- **小字号豁免条款(合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。**豁免逐处清单(撤除史归 git 提交史,余清单如下)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外 11-13px 文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。**站桩顺位徽标 ①②③ 不增列本清单**:既不在①条带内读数在册面、也不在②装饰 caption 在册面,按本条纪律取 `FS_HINT` 14 归六档;为它单独入册等于开第二口子,与「合并单条不开两口子」的立条理由正面相撞。**站桩名字行同理**:名字行(敌人名与护甲文字)承载须精确读取的信息,不在①②两在册面,按本条纪律取 `FS_HINT` 14 归六档、不增列②在册面,名字行几何(素底牌矩形、文字基线、宽度测量)随档位联动。②装饰 caption 在册面逐处维持不变。验收:机检〈豁免文字位均可对上本清单,清单外无 <14px;站桩顺位徽标与站桩名字行绘制点取 UiKit.FS_HINT,且②在册面不含该两位〉
|
- **小字号豁免条款(合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。**豁免逐处清单(撤除史归 git 提交史,余清单如下)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=棋盘底操作提示条/营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外 11-13px 文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。**站桩顺位徽标 ①②③ 不增列本清单**:该处原为 13px 字形,既不在①条带内读数在册面、也不在②装饰 caption 在册面,属「清单外 11–13px 文字」,按本条纪律提档至 `FS_HINT` 14 即归六档;为它单独入册等于开第二口子,与「合并单条不开两口子」的立条理由正面相撞。**站桩名字行同理提档**:名字行(敌人名与护甲文字)承载须精确读取的信息,原取 12px 不在①②两在册面、属「清单外 11–13px 文字」,按本条纪律提档至 `FS_HINT` 14 归六档、不增列②在册面,名字行几何(素底牌矩形、文字基线、宽度测量)随档位联动。②装饰 caption 在册面逐处维持不变。验收:机检〈豁免文字位均可对上本清单,清单外无 <14px;站桩顺位徽标与站桩名字行绘制点取 UiKit.FS_HINT,且②在册面不含该两位〉
|
||||||
- **字重纪律(字重两档不启用)**:层级手段为两件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅**;全局单字重,不上第二个字重(**重开钩子已注销**——整屏样张复核确认:屏内各级文字全部能归进本节六档字号,顺位徽标与站桩名字行两处按本节纪律提档即可,屏内实测对比全部达标(暖白对舞台底 9.49:1、GOLD_BRIGHT 6.47:1、血数 14.3:1),**未实证标题层级不足**,维持单字重,不另立条目);数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。验收:机检〈主题仅注册单字重〉/目检〈屏内标题与正文层级仅靠字号档差与墨色深浅两件即可分辨,无一处需要第二字重才读得清〉
|
- **字重纪律(字重两档不启用)**:层级手段为两件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅**;全局单字重,不上第二个字重(**重开钩子已注销**——整屏样张设计轮已重开并复核:屏内各级文字全部能归进本节六档字号,顺位徽标与站桩名字行两处按本节纪律提档即可,屏内实测对比全部达标(暖白对舞台底 9.49:1、GOLD_BRIGHT 6.47:1、血数 14.3:1),**未实证标题层级不足**,维持单字重,不另立条目);数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。验收:机检〈主题仅注册单字重〉/目检〈屏内标题与正文层级仅靠字号档差与墨色深浅两件即可分辨,无一处需要第二字重才读得清〉
|
||||||
|
|
||||||
### 7.5 营地界面
|
### 7.5 营地界面
|
||||||
|
|
||||||
@@ -481,7 +469,7 @@
|
|||||||
|
|
||||||
### 7.6 引擎原生控件与按钮状态规格
|
### 7.6 引擎原生控件与按钮状态规格
|
||||||
|
|
||||||
> **边界**:**定值单点纪律(§8 头注)遵守**:本节只锁形态/尺寸档/对比度底线等规则,色值一律指路——主题色值事实源 = `game/assets/theme/README.md` 溯源表(与 ui_kit 常量双源,见本节末注),本节不复述色值。
|
> **来源与边界**:本节由迭代实现批按呈报写入(引擎原生控件皮肤、按钮五态矩阵与全局纹理过滤),现为现行规格。**定值单点纪律(§8 头注)遵守**:本节只锁形态/尺寸档/对比度底线等规则,色值一律指路——主题色值事实源 = `game/assets/theme/README.md` 溯源表(与 ui_kit 常量双源,见本节末注),本节不复述色值。
|
||||||
|
|
||||||
**(一)按钮五态矩阵(冒烟五态断言在闸)**
|
**(一)按钮五态矩阵(冒烟五态断言在闸)**
|
||||||
|
|
||||||
@@ -519,36 +507,35 @@
|
|||||||
### 8.1 分辨率档位与格边长
|
### 8.1 分辨率档位与格边长
|
||||||
|
|
||||||
- **两档定案**:1280×800(基座)+ 1920×1080,窗口不可调;后续调整走修订。验收:机检〈工程分辨率配置与两档一致〉
|
- **两档定案**:1280×800(基座)+ 1920×1080,窗口不可调;后续调整走修订。验收:机检〈工程分辨率配置与两档一致〉
|
||||||
- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**棋盘地形不铺逐格瓦片**(岩顶/地面/崖面材质按整板矩形与格边程序化绘制,允许连续缩放——地形材质不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈地形材质随格边/整板绘制、小人占位 ≤0.75×〉
|
- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**瓦片整格铺满**(32×32 源随格边长缩放,允许非整数倍——瓦片不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈瓦片显示尺寸随格边长、小人占位 ≤0.75×〉
|
||||||
|
|
||||||
### 8.2 像素基准与画布
|
### 8.2 像素基准与画布
|
||||||
|
|
||||||
- **缩放纪律(硬规则,按资产两类分级;不做个案豁免)**:
|
- **缩放纪律(硬规则,按资产两类分级;不做个案豁免)**:
|
||||||
- **甲类·文本与语义件**(数字、图标、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。封印印记不属本类(参数化绘制件,见本条末「封印印记参数表」)。棋盘地形材质亦不属本类,按整板连续绘制(见 §8.1)。验收:机检〈甲类件显示尺寸为源整数倍〉
|
- **甲类·文本与语义件**(数字、图标、旗、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。砖面 tile 不属本类,随格边长整格铺满(见 §8.1)。验收:机检〈甲类件显示尺寸为源整数倍〉
|
||||||
- **全局纹理过滤与平滑渐变件例外**:`project.godot` `default_texture_filter=0`(Nearest)全局——像素风 UI 皮(九宫格/主题石纹样式盒/滑轨抓子/勾选/箭头图标)翻 Nearest=意图面;**显式 LINEAR 豁免清单(有意例外)= vignette / gradient_base / beams 三件程序化平滑渐变件**——保平滑连续 alpha 的程序化氛围件(§7.6 三已裁);新增平滑件须同批入册本清单,禁静默挂 LINEAR。翻转面枚举与冒烟断言(6 条)在闸。验收:机检〈过滤面枚举与 LINEAR 清单逐项一致〉
|
- **全局纹理过滤与平滑渐变件例外**:`project.godot` `default_texture_filter=0`(Nearest)全局——像素风 UI 皮(九宫格/主题石纹样式盒/滑轨抓子/勾选/箭头图标)翻 Nearest=意图面;**显式 LINEAR 豁免清单(有意例外)= vignette / gradient_base / beams 三件程序化平滑渐变件**——保平滑连续 alpha 的程序化氛围件(§7.6 三已裁);新增平滑件须同批入册本清单,禁静默挂 LINEAR。翻转面枚举与冒烟断言(6 条)在闸。验收:机检〈过滤面枚举与 LINEAR 清单逐项一致〉
|
||||||
- **显示档登记例外(64 源 0.5×,待素材批消除)**:柜台四枚 `icon_forge/workshop/atlas/keystone`(64×64 源)显示档统一 **32px = 0.5×**;状态九枚(32×32 源)mini(站桩)档 **16px = 0.5×**。两处均系「显示尺寸侧唯一可调、素材一字节禁改」红线下的人工检整数半倍档,登记为**待消除例外**——素材设计出 32px 源后回归 1×。常规档显示一律 1×(状态九枚 32px、手绘十枚 20px/40px 双档、BCard 图标槽 40px=2×、**护甲类型图标三枚 24px=1×**——源 24×24,归甲类整数倍纪律)。验收:机检〈显示档与登记表一致〉
|
- **显示档登记例外(64 源 0.5×,待素材批消除)**:柜台四枚 `icon_forge/workshop/atlas/keystone`(64×64 源)显示档统一 **32px = 0.5×**;状态九枚(32×32 源)mini(站桩)档 **16px = 0.5×**。两处均系「显示尺寸侧唯一可调、素材一字节禁改」红线下的人工检整数半倍档,登记为**待消除例外**——素材设计出 32px 源后回归 1×。常规档显示一律 1×(状态九枚 32px、手绘十枚 20px/40px 双档、BCard 图标槽 40px=2×、**护甲类型图标三枚 24px=1×**——源 24×24,归甲类整数倍纪律)。验收:机检〈显示档与登记表一致〉
|
||||||
- **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉
|
- **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉
|
||||||
- **站桩立绘槽位=高定宽随**:立绘/精灵槽位只定「高度的绝对档(档高取整数像素值)」,宽度随源图宽高比自适应——**禁止把全部立绘塞进统一方框强拉**(纵横倍率必须恒等)。反面实例:统一方框把窄条生物源(细长本体裁掉透明边)按主角比例横拉压扁发花。乙类的非整数豁免只覆盖**等比**缩放,不含纵横异倍变形。验收:机检〈立绘纵横倍率恒等〉
|
- **站桩立绘槽位=高定宽随**:立绘/精灵槽位只定「高度的整数倍档」,宽度随源图宽高比自适应——**禁止把全部立绘塞进统一方框强拉**(纵横倍率必须恒等)。反面实例:统一方框把窄条生物源(细长本体裁掉透明边)按主角比例横拉压扁发花。乙类的非整数豁免只覆盖**等比**缩放,不含纵横异倍变形。验收:机检〈立绘纵横倍率恒等〉
|
||||||
- **1920×1080 档策略**:全局等比(stretch=canvas_items+aspect **keep**)——16:10 设计在 16:9 窗口=等比 1.35×+左右黑边各 ~96px,构图与 1280×800 基准档完全一致;甲类 1.35 非整数缩放例外注记:轻度宽窄不均系本档位接受代价(像素游戏 shipped 常态),实机目检可感不适→回乙案(1920 独立 2× 基准)重议;乙类同前款。验收:目检〈1920 档构图与 1280 档一致〉
|
- **1920×1080 档策略**:全局等比(stretch=canvas_items+aspect **keep**)——16:10 设计在 16:9 窗口=等比 1.35×+左右黑边各 ~96px,构图与 1280×800 基准档完全一致;甲类 1.35 非整数缩放例外注记:轻度宽窄不均系本档位接受代价(像素游戏 shipped 常态),实机目检可感不适→回乙案(1920 独立 2× 基准)重议;乙类同前款。验收:目检〈1920 档构图与 1280 档一致〉
|
||||||
- **画布基准(暂定值)**:
|
- **画布基准(暂定值)**:
|
||||||
- **主角人设原图 = 48×72**(1× 基准,暂定;与站姿降采样可读性验证一致);
|
- **主角人设原图 = 48×72**(1× 基准,暂定;与站姿降采样可读性验证一致);
|
||||||
- **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../ux/battle.md)「棋盘格尺寸公式」),32px 源档的去留已定终值 = **保留 32×32 源档**(沿「独立小源档」路线;N=12 板 38px 档下显示占位上限 = 0.75×38 ≈ 28px,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销;
|
- **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」),32px 源档的去留已定终值 = **保留 32×32 源档**(沿「独立小源档」路线;N=12 板下显示占位上限 27px = 0.84 倍,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销;
|
||||||
- **封印印记参数表(绘制件,非贴图件)**:形与画法见 §3.2。定值——**环外径 = 0.82 × 格边**(26 格 21.3px/46 格 37.7px);**环壁厚 = 0.11 × 环径**(≈2.3/4.1px);**十字臂宽 = 0.156 × 环径**(≈3.3/5.9px);**环外光圈宽 = 0.09 × 格边**(≈2.3/4.1px),向外衰减指数 1.6、峰值 alpha 0.50;**圆心 = 格心**(已揭示地面;承载面 = 本关受光棱色封印石,见 §3.2;不再随岩顶偏移)。色 = 封印黑单色(光圈只改 alpha)。本件随格边连续缩放,**不适用甲类整数倍纪律**(非贴图件,见上条清单)。参数单点 = `ui_kit.gd` 六枚常量 `SEAL_RING_FRAC`/`SEAL_WALL_FRAC`/`SEAL_ARM_FRAC`/`SEAL_HALO_ALPHA`/`SEAL_HALO_GAMMA`/`SEAL_HALO_FRAC`,本节为条款侧对照值。改值须本节与 §3.2 同批修订。验收:机检〈ui_kit 六常量与本表逐值一致〉+目检〈渲染帧量环径落 82%±1px、圆心落格心、光圈不越格边〉
|
- **站桩立绘源档 = 八敌逐键定档**:主角 48 不变;八敌源档高 = goblin 36 / giant_spider 38 / duergar 46 / hook_horror 58 / bugbear 62 / ogre_chief 74 / drider 90 / duergar_king 94,显示一律 **×2 整数档(NEAREST)** = 72–188。定档依据 = 生物体型三约束(钩爪恐魔>灰矮人、灰矮人<熊地精、食人魔>熊地精——体量=物种体型,非强度线性映射,见 character-design §5.2);可读性实测门槛 = 源高 ≥32(24 糊/32 可读/48 清楚/64 细节完整),全阶梯 36–94 达标;派生管线 = pixel-1.png 紧裁 → 等比缩至档高 → dom_block_resize 块内众数降采样(tools/pixelize_candidates.py `STANDEE_TIER_H`,`SIZES` 降格为管线上游中间分辨率表);体量存在感经整屏对比校验(B 区高读 `stage_h`/立绘显示上限 188)。验收:机检〈standee_asset_check 逐键档高校验〉
|
||||||
- **站桩立绘显示档 = 三档绝对高**:小型 96 / 中型 144 / 大型 188。逐件归档——小:地精、巨蜘蛛、灰矮人;中:主角、钩爪恐魔、熊地精;大:食人魔酋长、蛛化卓尔、灰矮人石君王。**源 = 原稿像素网格**(八敌 `pixel-1`、主角手修 2× 三态稿),紧裁后原样入包,**禁再降采样**;显示倍率 = 档高 ÷ 源高,NEAREST,宽度随源图比例(高定宽随不变,见上条)。定档依据 = 生物体型(体量=物种体型,非强度线性映射,见 character-design §5.2),**顺序由显示档承载、不由源高承载**。已接受项:中型三件与地精/巨蜘蛛的源高(92/94/123/90/81)低于档高,属放大显示;食人魔酋长显示宽 157 超桩盒 150。验收:机检〈standee_asset_check 逐件显示档高与归档一致、纵横倍率恒等〉+目检〈同屏体量顺序成立〉
|
- **站桩立绘排版**:① 区高 B 区 ≈1/3 屏 / C 区 ≈2/3 屏,**扫雷盘原尺寸不缩、格子不变**(区高事实源 = 布局表 `battle_layout.tres`;压缩由 C 区面板空档吸收);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(显示 >150px 级:drider/duergar_king)**允许向上溢出盒顶 N px**(N 由实装批按实测尺寸算定,**与背景/光柱无关**——现行溢出区恰为临时光柱氛围层〔§6.1 方向稿四柱,x 基准 110/900/1055/1210@1280,`battle_stage_view.gd:47-56`〕,正式舞台背景插画(三关变体)到位后该层直接退役(背景不画光柱),**溢出判定不随之变更**;横向禁止压到顶部中央轮次·阶段指示,溢出上限由实装批用真图复算 x 区间定),血条仍落底(落底排的第二个收益=头部探顶不带出血条);意图徽标悬浮头顶上方(探顶档压胸);④ 「血条悬浮头顶+立绘盒内居中」排式已弃——盒顶固定 y 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉
|
||||||
- **站桩立绘排版**:① 区高 B 区 ≈1/3 屏 / C 区 ≈2/3 屏,**扫雷盘不从 D 区裁尺寸**(区高事实源 = 布局表 `battle_layout.tres`;2026-11-07 顶栏搬两侧后 D 区全高归棋盘,格边按 battle.md 公式现算——基座档 12×12=38px、14×14=32px,不再受 AP 条高度挤压);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(显示 >150px 级:食人魔酋长/蛛化卓尔/灰矮人石君王)**允许向上溢出盒顶 N px**(N 按实测尺寸算定,**与背景/光柱无关**——现行溢出区恰为临时光柱氛围层〔§6.1 方向稿四柱,x 基准 110/900/1055/1210@1280,`battle_stage_view.gd:47-56`〕,正式舞台背景插画(三关变体)到位后该层直接退役(背景不画光柱),**溢出判定不随之变更**;横向禁止压到顶部中央轮次·阶段指示,溢出上限用真图复算 x 区间定),血条仍落底(落底排的第二个收益=头部探顶不带出血条);意图徽标悬浮头顶上方(探顶档压胸);④ 「血条悬浮头顶+立绘盒内居中」排式已弃——盒顶固定 y 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉
|
|
||||||
- **站桩石板地台件**:`scene_stage_plaza.png`,源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉
|
- **站桩石板地台件**:`scene_stage_plaza.png`,源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉
|
||||||
|
|
||||||
### 8.3 导出格式与命名规范
|
### 8.3 导出格式与命名规范
|
||||||
|
|
||||||
- **归档纪律**:图片素材**不入 git 版本管理**——仓库只保留运行时引用资产(game/assets);生成链路原始产物(AI 原图/中间产物/候选版本)归档至 `archive/` 并择机上对象存储备份;主文档(圣经/GDD/清单)**禁引用 artwork/ 散文件路径**——定稿成图以 game/assets 为唯一事实源,过程稿引用一律用归档包路径或描述性出处。验收:机检〈主文档 grep 无 artwork/ 散文件路径〉
|
- **归档纪律**:图片素材**不入 git 版本管理**——仓库只保留运行时引用资产(game/assets);生成链路原始产物(AI 原图/中间产物/候选版本)归档至 `archive/` 并择机上对象存储备份;主文档(圣经/GDD/清单)**禁引用 artwork/ 散文件路径**——定稿成图以 game/assets 为唯一事实源,过程稿引用一律用归档包路径或描述性出处。验收:机检〈主文档 grep 无 artwork/ 散文件路径〉
|
||||||
- **入包与对账检查器(挂点已立,实现随 PRD 工具批)**:①**色板检查器**——扫描新素材色板,报新增色/近色告警/超 §4.1 上限(48)拦截,挂素材流入包步(asset-path-map §2 第 3 步);②**路径核对器**——扫描 asset-path-map 声明的全部路径,悬空/未清即报,随大批与审计例行跑;③**standee_asset_check 硬闸升级规格**——按 §8.2 显示档逐件校验显示档高与归档、纵横倍率恒等、像素域色数 ≤32、描边亮度达标(亮描边明度档);把「高定宽随」教训变成代码闸而非文字。验收:机检〈三检查器在闸可跑〉
|
- **入包与对账检查器(挂点已立,实现随 PRD 工具批)**:①**色板检查器**——扫描新素材色板,报新增色/近色告警/超 §4.1 上限(48)拦截,挂素材流入包步(asset-path-map §2 第 3 步);②**路径核对器**——扫描 asset-path-map 声明的全部路径,悬空/未清即报,随大批与审计例行跑;③**standee_asset_check 硬闸升级规格**——按 §8.2 逐键定档校验体量与档高、像素域色数 ≤32、无非整数倍缩放痕迹、描边亮度达标(亮描边明度档);把「高定宽随」教训变成代码闸而非文字。验收:机检〈三检查器在闸可跑〉
|
||||||
- **交付格式**:PNG 透明底;动画 = 序列帧或引擎精灵表(SpriteFrames),帧尺寸恒定、横向等宽排列(候选)。验收:目检〈交付件透明底无杂边〉
|
- **交付格式**:PNG 透明底;动画 = 序列帧或引擎精灵表(SpriteFrames),帧尺寸恒定、横向等宽排列(候选)。验收:目检〈交付件透明底无杂边〉
|
||||||
- **命名规范(候选草案)**:`<域>_<对象键>_<状态|变体>[_<序号>].png`,全小写 snake_case;**对象键 = 数据表主键**(effect_id/reward_id/cell_type/enemy_id——图标键契约 §4.6 的文件侧延伸:资产文件名键 = 图标键,全局恒定禁运行时换图);图类型变体后缀 = board_type 键(`_dungeon`/`_underdark`/`_deep_underdark`);候选评审件与终稿分目录(`artwork/candidates/` 承载评审件)。验收:机检〈命名与目录检查器零红〉
|
- **命名规范(候选草案)**:`<域>_<对象键>_<状态|变体>[_<序号>].png`,全小写 snake_case;**对象键 = 数据表主键**(effect_id/reward_id/cell_type/enemy_id——图标键契约 §4.6 的文件侧延伸:资产文件名键 = 图标键,全局恒定禁运行时换图);图类型变体后缀 = board_type 键(`_dungeon`/`_underdark`/`_deep_underdark`);候选评审件与终稿分目录(`artwork/candidates/` 承载评审件)。验收:机检〈命名与目录检查器零红〉
|
||||||
|
|
||||||
### 8.4 帧数规格(样张冻结)
|
### 8.4 帧数规格(样张冻结)
|
||||||
|
|
||||||
- **帧数规格(样张冻结)**:待机循环 4 帧;攻击/技能准备 6 帧单次;受击 2 帧;死亡 = 灰化+碎裂退场(§4.6.4 语义硬规则),序列帧归 ✦ 缺料清单;帧时长与结算节拍对齐(预告时序见 §4.6.4)。验收:机检〈序列帧数与档位一致〉
|
- **帧数规格(样张冻结)**:待机循环 4 帧;攻击/技能准备 6 帧单次;受击 2 帧;死亡 = 灰化+碎裂退场(§4.6.4 语义硬规则),序列帧归 ✦ 缺料清单;帧时长与结算节拍对齐(预告时序见 §4.6.4)。验收:机检〈序列帧数与档位一致〉
|
||||||
- **方向集**:棋盘小人=**一份画稿+左右镜像**(现行资产=朝左帧两态 idle/walk,右向 = `flip_h`;下/上向无独立帧);斜向移动/挖掘按**主导轴吸附最近正交向**呈现,不出 45° 斜向帧(斜向信息由位移轨迹与目标格预告承载,ITB 实态同款)。镜像与「旗面恒画右」纪律(character-design.md 冒险背包条)的相容归属:棋盘小人默认镜像豁免、旗右纪律限立绘侧——代拟口径已追认(棋盘小人朝左时旗面朝左,与立绘侧「旗面恒画右」并存;画稿维持一份 + 镜像,零新增资产)。验收:目检〈侧向镜像无破绽〉
|
- **方向集**:棋盘小人=**4 向**(下/上/侧,侧向左右镜像共用一份画稿);斜向移动/挖掘按**主导轴吸附最近正交向**呈现,不出 45° 斜向帧(斜向信息由位移轨迹与目标格预告承载,ITB 实态同款)。镜像与「旗面恒画右」纪律(character-design.md 冒险背包条)的相容归属:棋盘小人默认镜像豁免、旗右纪律限立绘侧——代拟口径已追认(棋盘小人朝左时旗面朝左,与立绘侧「旗面恒画右」并存;画稿维持一份 + 镜像,零新增资产)。验收:目检〈四向帧齐、侧向镜像无破绽〉
|
||||||
|
|
||||||
### 8.5 结构件完整性与参考核验
|
### 8.5 结构件完整性与参考核验
|
||||||
|
|
||||||
@@ -556,26 +543,22 @@
|
|||||||
|
|
||||||
- **结构件完整性**:格面立体感(高墙顶面/坡缘/角件/周界轮廓)只能来自**素材本体绘制的结构件拼装**(样例=Necesse 式缘件:专属底色+手绘细节+暗轮廓线的独立贴图);禁止以调色、渐变、明暗滤镜、跨格投影等生成手段伪造素材中不存在的结构。样稿暴露缺件时,正确动作=停下报告缺口与「换素材/自产缺件」选项,由用户裁决后执行。验收:目检〈立体感逐件来自素材本体,无滤镜伪造〉
|
- **结构件完整性**:格面立体感(高墙顶面/坡缘/角件/周界轮廓)只能来自**素材本体绘制的结构件拼装**(样例=Necesse 式缘件:专属底色+手绘细节+暗轮廓线的独立贴图);禁止以调色、渐变、明暗滤镜、跨格投影等生成手段伪造素材中不存在的结构。样稿暴露缺件时,正确动作=停下报告缺口与「换素材/自产缺件」选项,由用户裁决后执行。验收:目检〈立体感逐件来自素材本体,无滤镜伪造〉
|
||||||
- **参考核验**:宣称「参考 X 游戏」前,必须取得并实际查看 X 的截图证据(像素级放大核验其实现方式),证据存 `artwork/mockups/` 或 `design/art/references/`;仅凭文字资料、记忆或宏观印象作出「X 是这样做」的断言无效。验收:目检〈参考结论有截图证据在库〉
|
- **参考核验**:宣称「参考 X 游戏」前,必须取得并实际查看 X 的截图证据(像素级放大核验其实现方式),证据存 `artwork/mockups/` 或 `design/art/references/`;仅凭文字资料、记忆或宏观印象作出「X 是这样做」的断言无效。验收:目检〈参考结论有截图证据在库〉
|
||||||
- **图底分离**:已开地面的明度须低于未开格岩体,由材质选型承载(地面基色 `#695038` 低于岩顶 `#9C8462`),不靠渲染压暗实现。验收:机检〈已开地面明度低于岩顶面〉
|
- **图底分离**:已开地面的明度须低于未开格墙体,由素材选型承载(选更暗的地板砖),不靠渲染压暗实现。验收:机检〈已开格底明度低于墙顶面〉
|
||||||
- **生产分工**:格面地形类素材=**材质归模型、结构归程序**——AI 生图模型只出无缝填充纹理(无边框/无亮边/均匀光照/方形);一切结构件(缘件/轮廓/立面/角件/收头)一律程序化绘制或手修,因为 autotile 任意拼接的边界像素约束超出 2D 生图模型能力(实证:生图 5×5 瓦片表每枚砖自带啃咬边框与宽亮带,提示词无法根除)。**镜像规则**:东西对称结构件只许水平翻转(flip_h)复用、**禁旋转**——北受光下东西侧缘光照对称,镜像无损真;旋转会把北受光转到东边。验收:目检〈瓦片表无自带边框/亮带;对称件仅 flip_h〉
|
- **生产分工**:格面地形类素材=**材质归模型、结构归程序**——AI 生图模型只出无缝填充纹理(无边框/无亮边/均匀光照/方形);一切结构件(缘件/轮廓/立面/角件/收头)一律程序化绘制或手修,因为 autotile 任意拼接的边界像素约束超出 2D 生图模型能力(实证:生图 5×5 瓦片表每枚砖自带啃咬边框与宽亮带,提示词无法根除)。**镜像规则**:东西对称结构件只许水平翻转(flip_h)复用、**禁旋转**——北受光下东西侧缘光照对称,镜像无损真;旋转会把北受光转到东边。验收:目检〈瓦片表无自带边框/亮带;对称件仅 flip_h〉
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 9. 参考与反参考(References & Anti-References)
|
## 9. 参考与反参考(References & Anti-References)
|
||||||
|
|
||||||
> **白话**:正面参考 = 向谁抄什么;反面参考 = 避什么。两者同等效力——方案违反反面条款时,禁止以「参考了某游戏」辩护。参考图库存于 `design/art/references/`(原三款×2 张在库;2026-11-07 新增参考图证待补,不阻塞画法条款)。
|
> **白话**:正面参考 = 向谁抄什么;反面参考 = 避什么。两者同等效力——方案违反反面条款时,禁止以「参考了某游戏」辩护。参考图库存于 `design/art/references/`(点名池三款×2 张,与头注点名池一一对应)。
|
||||||
|
|
||||||
### 9.1 正面参考(点名池,用户审阅选定)
|
### 9.1 正面参考(点名池,用户审阅选定)
|
||||||
|
|
||||||
| 参考 | 取 | 弃 |
|
| 参考 | 取 | 弃 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **Into the Breach** | 格内信息分层、攻击预告上格范式、战棋地块质感骨架(§1.2 原则一;§3.2) | 冷暗军事色调、压暗信息板、斜切 HUD(原则二;§3.3) |
|
| **Into the Breach** | 格内信息分层、攻击预告上格范式、战棋地块质感骨架(§1.2 原则一;§3.2) | 冷暗军事色调、压暗信息板、斜切 HUD(原则二;§3.3) |
|
||||||
| **Moonlighter** | 暖质地砖与砖缝质感、亲和冒险者气质、木石暖色道具(原则二/原则三);**光照层次与明度纵深**(亮地板/暗深渊/发光体三档,§2 明度分层) | 全拟物倾向(§3.3 半拟物边界);Darkest 式压暗(§9.2 反面基准) |
|
| **Moonlighter** | 暖质地砖与砖缝质感、亲和冒险者气质、木石暖色道具(原则二/原则三);**光照层次与明度纵深**(亮地板/暗深渊/发光体三档,§2 明度分层) | 全拟物倾向(§3.3 半拟物边界);Darkest 式情绪压暗(§9.2) |
|
||||||
| **Peglin** | 明快全年龄洞穴色彩、胖体量亲和怪(§5.1 普通怪原型) | 色块依赖——先读轮廓后读颜色(§5.1) |
|
| **Peglin** | 明快全年龄洞穴色彩、胖体量亲和怪(§5.1 普通怪原型) | 色块依赖——先读轮廓后读颜色(§5.1) |
|
||||||
| **Stardew Valley** | 连续地面与大地块地形的平铺控制、暖色可读性(§3.2 地形材质与装饰) | 农务 UI、角色比例、柔光/渐变 |
|
|
||||||
| **Minish Cap** | 圆润岩体轮廓、紧凑像素可读性(§3.2 岩体受光与崖面) | GBA 分辨率限制、过小角色比例 |
|
|
||||||
| **Necesse**(补充) | 大块地形按连续面画、不按逐格物件画(§3.2 术语与定义) | 生存制作 UI |
|
|
||||||
| **Link's Awakening 原版/DX 2D**(补充) | 抬升台面与南向崖面的 2D 观感(§3.2 投影与搭接) | 2019 重制 3D 立体模型版(风格不合,排除) |
|
|
||||||
|
|
||||||
- **反面条款已成文**(§9.2);反面参考**图证**待本作素材生成后增补。验收:方向性
|
- **反面条款已成文**(§9.2);反面参考**图证**待本作素材生成后增补。验收:方向性
|
||||||
|
|
||||||
@@ -583,10 +566,10 @@
|
|||||||
|
|
||||||
| 反面参考 | 违反条款 | 立法理由 |
|
| 反面参考 | 违反条款 | 立法理由 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **Darkest Dungeon** 式压暗 | §9.2 反面基准(风格取向记录,非禁令——压暗属普通设计决策,逐案走样张与目检) | 失败重开,世界无光暗记忆——明亮基调下不以整屏变暗作常态表达 |
|
| **Darkest Dungeon** 式压暗 | §2 情绪明暗禁令(明度分层下仍禁) | 状态与情绪只走色相/饱和/运动/元素四手段,不以变暗表达情绪(失败重开,世界无光暗记忆) |
|
||||||
| **传统扫雷白牌/贴纸式数字承载** | §1.2 原则二(明度分档为骨);§3.2 浮空数字 | 数字由浮空描边字承载、画在世界之上;不使用数字底牌——满屏白牌=电子表格观感,非游戏画面 |
|
| **传统扫雷白牌/贴纸式数字承载** | §1.2 原则二(明度分档为骨) | 数字由格底明度分档承载、直画入世界;色牌仅复杂格底后备——满屏白牌=电子表格观感,非游戏画面 |
|
||||||
| **Enter the Gungeon** 式粒子与色相爆炸 | §3.4 焦点预算;§4.2 色相纪律 | 信息层禁止被特效与杂色吞没,特效入画先过焦点预算 |
|
| **Enter the Gungeon** 式粒子与色相爆炸 | §3.4 焦点预算;§4.2 色相纪律 | 信息层禁止被特效与杂色吞没,特效入画先过焦点预算 |
|
||||||
| **Hades** 式特效密度 | §2.2 兑现爽感的上限 | 爽感靠逐行因果归因,不靠满屏特效;承载元素以 §2.2 清单为界 |
|
| **Hades** 式特效密度 | §2.2 兑现爽感的上限 | 爽感靠逐行因果归因,不靠满屏特效;承载元素以 §2.2 清单为界 |
|
||||||
| **传统扫雷 1–8 八色分色** | §4.1 数字墨单色制 | 八色必撞红/金/蓝/紫赤语义色段;数字只走单色浮空字芯,字形为唯一数值载体 |
|
| **传统扫雷 1–8 八色分色** | §4.1 数字墨三档 | 八色必撞红/金/蓝/紫赤语义色段;数字只走墨族三档色温,字形为唯一数值载体 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -1,28 +1,7 @@
|
|||||||
# 美术后处理与校验工具清单
|
# 美术后处理与校验工具清单
|
||||||
|
|
||||||
> **性质**:本文件是 `tools/` 下美术资产处理与校验脚本的用法清单,兼**执行件门值登记面**——美术数值定值(色值、阈值、档位、帧数、区间)的落点速查索引。回答三件事:这类资产该跑哪件工具、命令怎么敲、判据与坑在哪。
|
> **性质**:本文件是 `tools/` 下美术资产处理与校验脚本的用法清单。回答三件事:这类资产该跑哪件工具、命令怎么敲、判据与坑在哪。
|
||||||
> **边界**:只管工具用法与定值落点登记,不立美术规格。概念、规则与方向归 [art-bible](art-bible.md);命令与源码冲突时以源码现行为准,美术规格冲突时以 art-bible 为准。素材入库与代码接线归 [asset-path-map](asset-path-map.md),不在本文件。
|
> **边界**:只管工具用法,不立美术规格。色值、画布、体量、命名与验收条款归 [art-bible](art-bible.md)(§4.1 主色板、§8 资产与技术规范)和 [art-assets-checklist](art-assets-checklist.md);命令与源码冲突时以源码现行为准,美术规格冲突时以 art-bible 为准。素材入库与代码接线归 [asset-path-map](asset-path-map.md),不在本文件。
|
||||||
|
|
||||||
## 执行件门值登记(定值落点速查索引,2026-11-07 立)
|
|
||||||
|
|
||||||
美术数值定值的落点速查——每行=一个定值面与其承载件;改值=改对应执行件并跑其守门断言,文档侧对照值同批核对:
|
|
||||||
|
|
||||||
| 定值面 | 承载件 |
|
|
||||||
|---|---|
|
|
||||||
| 色值 token 全板(语义色/墨族/材质色/呈现态) | `game/presentation/views/ui_kit.gd` 常量组(色板唯一来源)+ theme README 溯源表 |
|
|
||||||
| token 存量近色互查与新增色第二道门 | `tools/palette_check.py`(素材侧)+ `palette_token_pairwise_test.gd`(常量面守门,含在册豁免账) |
|
|
||||||
| 微光五组色值与呈现参数 | `ui_kit.gd` 微光常量组+`type_glow_test.gd` 守门断言 |
|
|
||||||
| 未开格底/图类型色板准入门(亮度地板/饱和上限/禁入带/近色容差)与**世界底层两子带** | `tools/glow_discrimination_sheet.py` 门值常量(本件「判据或口径」节) |
|
|
||||||
| 已开格底渲染面亮度 | `game/presentation/views/tile_palette.gd` 归一化目标常量;对比判据=`game/probe/ui_contrast_probe.gd` |
|
|
||||||
| 文字对比门槛(WCAG AA)与整屏有效色数上限 | `tools/shot_checker.py` 常量(`ui_contrast_probe` 同源) |
|
|
||||||
| 封印印记六参数 | `ui_kit.gd` `SEAL_*` 六常量+`seal_mark_params_test.gd` |
|
|
||||||
| 站桩显示档三档与源档逐件 | `standee_present_values_test.gd` 钉值+`tools/standee_asset_check.py` |
|
|
||||||
| 动画帧数档(待机/攻击/受击) | `animation_frame_spec_test.gd` 规格表(序列帧资产入包后逐件判) |
|
|
||||||
| 字号六档与下限 | `ui_kit.gd` `FS_*` 常量组 |
|
|
||||||
| 屏级分区几何/带高 | `game/data/tables/battle_layout.tres`(数据索引,art-bible 直指) |
|
|
||||||
| 营地场景坐标群(落盘矩形/命中矩形/z 序/桩柱高) | `camp-scene-prompts.md` 坐标表+落盘件 |
|
|
||||||
| 棋盘结构件 px(墨线/暗带/投影/悬崖) | `board_world.gd`/`board_view.gd` 常量+渲染闸 golden 基线 |
|
|
||||||
| 视野迷雾半径/提灯加成/记忆态常量 | `board_view.gd` `FOG_*` 常量+`ui_kit.gd` 迷雾常量组 |
|
|
||||||
> **分工**:[art-prompts](art-prompts.md) 管角色级提示词与五步出图流程,[camp-scene-prompts](camp-scene-prompts.md) 管营地场景分层提示词与四步流程;两卡只把「后处理」一步指到本文件。提示词怎么写出图、出完图怎么处理,是两件事。
|
> **分工**:[art-prompts](art-prompts.md) 管角色级提示词与五步出图流程,[camp-scene-prompts](camp-scene-prompts.md) 管营地场景分层提示词与四步流程;两卡只把「后处理」一步指到本文件。提示词怎么写出图、出完图怎么处理,是两件事。
|
||||||
> **命令前提**:以下命令均在仓库根执行。素材不入 git,worktree 缺件时部分脚本回退主检出 `D:/code/g-plan2`,部分直接返回错误,见各节「已知坑与适用边界」。
|
> **命令前提**:以下命令均在仓库根执行。素材不入 git,worktree 缺件时部分脚本回退主检出 `D:/code/g-plan2`,部分直接返回错误,见各节「已知坑与适用边界」。
|
||||||
|
|
||||||
@@ -36,7 +15,6 @@
|
|||||||
| UI 框材(面板、按钮、石框、底噪、图标) | `tools/quantize_ui_skin.py` | `tools/palette_check.py`、`tools/path_check.py` | 主题小件另跑 `tools/gen_theme_icons.py` |
|
| UI 框材(面板、按钮、石框、底噪、图标) | `tools/quantize_ui_skin.py` | `tools/palette_check.py`、`tools/path_check.py` | 主题小件另跑 `tools/gen_theme_icons.py` |
|
||||||
| 地形瓦片 | `tools/recolor_terrain_tiles.py` | `tools/palette_check.py` | 只换色,不重绘 |
|
| 地形瓦片 | `tools/recolor_terrain_tiles.py` | `tools/palette_check.py` | 只换色,不重绘 |
|
||||||
| 整屏样张 | `tools/render_sample_sheet_v3.py`、`tools/render_level_map_sheet.py` | `tools/shot_checker.py`;棋盘回归用 `tools/golden_board_crop.py` 加 `tools/golden_compare.py` | 样张脚本生成后自带机检 |
|
| 整屏样张 | `tools/render_sample_sheet_v3.py`、`tools/render_level_map_sheet.py` | `tools/shot_checker.py`;棋盘回归用 `tools/golden_board_crop.py` 加 `tools/golden_compare.py` | 样张脚本生成后自带机检 |
|
||||||
| 图类型色板互辨抽测(三关格底 × 五组微光) | `tools/glow_discrimination_sheet.py` | `tools/palette_check.py`(近色比对池同源)、`tools/shot_checker.py`(WCAG 公式同源) | 出并列样图+逐对读数表;格底准入的门值单点在本件 |
|
|
||||||
|
|
||||||
## 三条已知边界
|
## 三条已知边界
|
||||||
|
|
||||||
@@ -198,7 +176,7 @@ python tools/shot_checker.py <截图目录>
|
|||||||
python tools/shot_checker.py <截图目录> shot_menu.png shot_battle.png
|
python tools/shot_checker.py <截图目录> shot_menu.png shot_battle.png
|
||||||
```
|
```
|
||||||
|
|
||||||
**判据或口径**:A 屏级骨架——PNG 存在、任一边 1280、灰度 std 不低于 8(取值在圣经 §7.2 文字 4.5:1 推论下界之下、正常实测最低 19.3 之上)、唯一色数不低于 40(正常实测地板 60 的 2/3,低于一切正常屏;色数异常回落=画面异常信号)。B 文字对比——战斗 C 区面板与明细带提示的 WCAG 不低于 4.5:1。C 明度三档——战斗屏信息面高于世界中,世界中高于世界底。D 文字禁压纹理——文字框背景中带灰度 std 不高于 18。F 文字在——菜单标题框内与中位灰度差大于 60 的像素占比落在 2% 到 55%。B/C/D 只在清单含 `shot_battle.png` 时跑,F 只在含 `shot_menu.png` 时跑,其余屏只跑 A。全过 0,缺参数或任一失败 1。
|
**判据或口径**:A 屏级骨架——PNG 存在、任一边 1280、灰度 std 不低于 8、唯一色数不低于 64。B 文字对比——战斗 C 区面板与明细带提示的 WCAG 不低于 4.5:1。C 明度三档——战斗屏信息面高于世界中,世界中高于世界底。D 文字禁压纹理——文字框背景中带灰度 std 不高于 18。F 文字在——菜单标题框内与中位灰度差大于 60 的像素占比落在 2% 到 55%。B/C/D 只在清单含 `shot_battle.png` 时跑,F 只在含 `shot_menu.png` 时跑,其余屏只跑 A。全过 0,缺参数或任一失败 1。
|
||||||
|
|
||||||
**已知坑与适用边界**:截图必须由窗口化 `shot_probe` 产出;headless 没有渲染面,截图是空的。`shot_meta.json` 缺失时 B/C/D 直接判 meta 几何缺失,不会跳过。尺寸断言按「任一边等于 1280」放行;1920×1080 截图两边都不等于 1280,会被判非工程档,与文件头「1920 档 1.5×」说明不一致,按源码为准。焦点预算是目检项,机检不判。
|
**已知坑与适用边界**:截图必须由窗口化 `shot_probe` 产出;headless 没有渲染面,截图是空的。`shot_meta.json` 缺失时 B/C/D 直接判 meta 几何缺失,不会跳过。尺寸断言按「任一边等于 1280」放行;1920×1080 截图两边都不等于 1280,会被判非工程档,与文件头「1920 档 1.5×」说明不一致,按源码为准。焦点预算是目检项,机检不判。
|
||||||
|
|
||||||
@@ -313,22 +291,3 @@ python tools/path_check.py --repo . --code game
|
|||||||
**判据或口径**:L1 查 `asset-path-map` §1 的声明目录,`design/art/candidates` 按需创建豁免。L2 查 `game/assets/art` 的四个语义子目录与现役文件清单,含主角 idle/walk/portrait、八敌、铲三帧、封印印记。L3 grep 代码里的 `res://assets/art` 引用,核对盘上存在性,并检出 `board_floor`、`board_wall`、`pillar_dungeon`、`production/mockups` 等退役命名;路径模板含 `%s` 或 `%d` 的跳过。worktree 素材未同步时,缺失项标 SKIP 不判红;主区完整素材环境才全量判。全过 0,有红灯 1。
|
**判据或口径**:L1 查 `asset-path-map` §1 的声明目录,`design/art/candidates` 按需创建豁免。L2 查 `game/assets/art` 的四个语义子目录与现役文件清单,含主角 idle/walk/portrait、八敌、铲三帧、封印印记。L3 grep 代码里的 `res://assets/art` 引用,核对盘上存在性,并检出 `board_floor`、`board_wall`、`pillar_dungeon`、`production/mockups` 等退役命名;路径模板含 `%s` 或 `%d` 的跳过。worktree 素材未同步时,缺失项标 SKIP 不判红;主区完整素材环境才全量判。全过 0,有红灯 1。
|
||||||
|
|
||||||
**已知坑与适用边界**:依赖 `asset-path-map.md` 的声明清单与代码常量;新增素材目录不更新文档就不会被查。素材不入 git,worktree 空或半同步会大量 SKIP,不能据此判断主区健康。只核对路径存在与退役命名,不核对图像内容、尺寸或色板。
|
**已知坑与适用边界**:依赖 `asset-path-map.md` 的声明清单与代码常量;新增素材目录不更新文档就不会被查。素材不入 git,worktree 空或半同步会大量 SKIP,不能据此判断主区健康。只核对路径存在与退役命名,不核对图像内容、尺寸或色板。
|
||||||
|
|
||||||
## tools/glow_discrimination_sheet.py
|
|
||||||
|
|
||||||
**一句话定位**:三关图类型色板 × 五组类型微光的互辨抽测执行件——出一张并列样图(54 格=三关 × 三底型 × 五组 + 基准格,含灰度副本段与图例),自带机检判定并落逐对读数表。
|
|
||||||
|
|
||||||
**归属**:仓库内 `tools/glow_discrimination_sheet.py`。
|
|
||||||
|
|
||||||
**输入与输出**:读 `game/assets/art/board/terrain_wall_center*_ <board_type>.png` 三块底型件、`game/presentation/views/ui_kit.gd` 的微光冻结常量、`game/tests/golden/palette_baseline/` 两张条带作近色比对池;合成侧逐像素复刻 `game/presentation/views/cell_type_glow.gdshader`。产物=`artwork/mockups/glow-discrimination-sheet-<日期>.png`(不入 git)+ `reports/` 下当日读数表。
|
|
||||||
|
|
||||||
**用法命令**:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python tools/glow_discrimination_sheet.py # 取准入读数 + 出样图 + 机检全道 + 落读数表
|
|
||||||
python tools/glow_discrimination_sheet.py --no-sheet # 只跑铺底准入五门,不出图不落表
|
|
||||||
```
|
|
||||||
|
|
||||||
**判据或口径**:门值单点在本件常量,文档侧不抄——`FLOOR_L`(未开格底线性亮度地板)、`CEIL_SAT`(饱和上限)、`BANNED_HUE`(禁入色相带)、`NEAR_EPS`(近色容差)、`B_MIN_CH_DIFF`(格底对微光可辨底线)、`C_MODEL_TOL`(样图与合成模型容差)。铺底代表值不查色表:取该关三块底型件像素里**线性相对亮度最大**的实测色(顶面受光档),素材换色后读数自动跟随。判定四道=A 五组明度阶梯单调且组间对比过线、B 格底对微光的三通道差禁止全部小于容差、C 样图与合成模型差落在容差内、D 准入五门;目检四条归用户,与机器判定并列取严(任一侧不过即该对不过)。退出码 0=全绿、1=有 FAIL、2=底型件缺位硬阻塞。
|
|
||||||
|
|
||||||
**已知坑与适用边界**:素材不入 git,worktree 缺三块底型件时直接 `exit(2)`——抽测的先决条件不成立,不是假红。色相吞没刻意不设机检阈值:本仓无一条文给出色相差门槛,自造一个等于把观感问题伪装成可机检问题,故色相差只进读数表列、不参与判定。带域与格心取样口径与 `game/probe/type_glow_shot_probe.gd` 同源(带域 de<格边×0.125、格心内缩 20%),改探针口径须同步本件。
|
|
||||||
+75
-67
@@ -1,22 +1,22 @@
|
|||||||
# 生图提示词卡(角色级资产)v2.15
|
# 生图提示词卡(角色级资产)v2.12
|
||||||
|
|
||||||
> **性质**:美术清单生图通道(✦ 用户自跑,现走线上 API)的执行侧文件——每资产一段**自包含完整提示词**:正向 = 通用底座+主体+动作已拼妥、负向 = 通用底座+增补已并妥,整段复制直接贴进工作流即可,**不需要读其他文件、不需要拼装**。人物规格转写自 [character-design.md](character-design.md)(人物设计 v1.0,圣经 §5 为存根),风格/色彩条款转写自 [art-bible](art-bible.md)(§4.1 主色板 / §4.2 语义色规则);冲突时人物规格以 character-design 为准、色彩以 art-bible 为准。
|
> **性质**:美术清单生图通道(✦ 用户自跑,现走线上 API)的执行侧文件——每资产一段**自包含完整提示词**:正向 = 通用底座+主体+动作已拼妥、负向 = 通用底座+增补已并妥,整段复制直接贴进工作流即可,**不需要读其他文件、不需要拼装**。人物规格转写自 [character-design.md](character-design.md)(人物设计 v1.0,自 art-bible §5 迁出,圣经 §5 为存根),风格/色彩条款转写自 [art-bible](art-bible.md)(§4.1 主色板 / §4.2 语义色规则);冲突时人物规格以 character-design 为准、色彩以 art-bible 为准。
|
||||||
> **边界**:本文件只管**角色级**资产的生图通道。图标/格面/样张走脚本管线(⚙ 代理出),规格在 art-bible §4.6 与 [art-assets-checklist](art-assets-checklist.md),不需要提示词。**场景级资产(营地场景图的背景层与八个物件层)另立 [camp-scene-prompts](camp-scene-prompts.md);战斗舞台背景层与连续地面层另立 [battle-stage-prompts](battle-stage-prompts.md),本文件不覆盖**;两卡的角色/场景分工以「谁的资产谁出卡」为界,同一段提示词不两处维护。战斗舞台的小石台件与护甲类型图标三枚的**出图工单**登记在本文件 §5;§5 只把各权威节的定值收进逐件工单,不立新值。意图动画三档是动画资产,等一屏样张锁方案后另立规格卡,本文件不覆盖。
|
> **边界**:本文件只管**角色级**资产的生图通道。图标/格面/样张走脚本管线(⚙ 代理出),规格在 art-bible §4.6 与 [art-assets-checklist](art-assets-checklist.md),不需要提示词。**场景级资产(营地场景图的背景层与八个物件层)另立 [camp-scene-prompts](camp-scene-prompts.md);战斗舞台背景层与连续地面层另立 [battle-stage-prompts](battle-stage-prompts.md),本文件不覆盖**;两卡的角色/场景分工以「谁的资产谁出卡」为界,同一段提示词不两处维护。战斗舞台的小石台件与护甲类型图标三枚的**出图工单**登记在本文件 §5;§5 只把各权威节的定值收进逐件工单,不立新值。意图动画三档是动画资产,等一屏样张锁方案后另立规格卡,本文件不覆盖。
|
||||||
> **状态**:提示词卡成文,出图未开始(正序:B 路线);继承 seed 纪律 / 色相禁入带 / `#F2F2F2` 生成底色;沿革见 git 提交史。
|
> **状态**:提示词卡成文,出图未开始;按「美术圣经 §5 现行」重生成(正序:B 路线),继承 seed 纪律 / 色相禁入带 / `#F2F2F2` 生成底色;沿革见 git 提交史。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 0. 使用流程(五步)
|
## 0. 使用流程(五步)
|
||||||
|
|
||||||
1. **出图**:按下面卡片把正向/负向提示词粘进生图渠道的提示词栏(**渠道 = 远程对话式生图为主,本地 ComfyUI 为备选**;对话操作纪律见 [remote-gen-prompts](remote-gen-prompts.md)),每个资产出 **2–3 版候选**(建议固定 3 个 seed 连拍,便于横评)。
|
1. **出图**:按下面卡片把正向/负向提示词粘进生图渠道的提示词栏(**渠道 = 远程对话式生图为主,本地 ComfyUI 为备选**——2026-10-06 拍板;对话操作纪律见 [remote-gen-prompts](remote-gen-prompts.md)),每个资产出 **2–3 版候选**(建议固定 3 个 seed 连拍,便于横评)。
|
||||||
2. **入库**:候选原图(带底)放 `artwork/candidates/<资产名>/`,文件名 `v1.png / v2.png / v3.png`。这个目录只存候选,不进引擎。
|
2. **入库**:候选原图(带底)放 `artwork/candidates/<资产名>/`,文件名 `v1.png / v2.png / v3.png`。这个目录只存候选,不进引擎。
|
||||||
3. **裁决**:你按 §4 验收速查预筛,挑出每一资产的入围候选拍板。
|
3. **裁决**:你按 §4 验收速查预筛,挑出每一资产的入围候选拍板。
|
||||||
4. **后处理**:喊我一声,脚本管线代跑——去底转透明、最近邻降采样到目标尺寸、色板量化、四联底测试条(掩尘底/裸土底/暗底/灰度)。后处理工具清单与用法见 [art-pipeline-tools](art-pipeline-tools.md)。
|
4. **后处理**:喊我一声,脚本管线代跑——去底转透明、最近邻降采样到目标尺寸、色板量化、四联底测试条(掩尘底/裸土底/暗底/灰度)。后处理工具清单与用法见 [art-pipeline-tools](art-pipeline-tools.md)。
|
||||||
5. **转正**:终稿从 `artwork/candidates/` 转入切片资产目录,随表现层升级批接线;清单状态列改「已交付」。
|
5. **转正**:终稿从 `artwork/candidates/` 转入切片资产目录,随表现层升级批接线;清单状态列改「已交付」。
|
||||||
|
|
||||||
**出图通道**:线上 API,用户自跑——本地 ComfyUI 生图路线已经用户拍板**彻底关闭**(母版工作流/像素 LoRA/Z-Image 模型已清退,不留复活预案,本卡不依赖任何本地管线)。
|
**出图通道(2026-09-23 定稿)**:线上 API,用户自跑——本地 ComfyUI 生图路线已经用户拍板**彻底关闭**(母版工作流/像素 LoRA/Z-Image 模型已清退,不留复活预案,本卡不依赖任何本地管线)。
|
||||||
|
|
||||||
**模型适配注**:提示词按标签风格写,通用文生图模型都能吃。走自然语言类模型(如 Flux/nano-banana 系)时,把「正向提示词」整串改写成两句自然语言,语义不变——像素约束段改写为 "a true pixel-art sprite drawn on a tiny grid of chunky square pixels, hard edges, no anti-aliasing, no gradients, flat colors from a limited palette, like artwork made in Aseprite"。出图分辨率建议 1024×1024(平台可选小档则选小,像素块更粗),真像素网格靠后处理降采样落定(§0 五步第 4 步)。触发词 `Pixel art style.` **已拍板加入——所有正向提示词一律以触发词开头**,已写入下面各卡(线上无像素 LoRA,它作风格提示词用);各卡负向已并入平滑系禁词,API 无负向栏时可整段省略。
|
**模型适配注**:提示词按标签风格写,通用文生图模型都能吃。走自然语言类模型(如 Flux/nano-banana 系)时,把「正向提示词」整串改写成两句自然语言,语义不变——像素约束段改写为 "a true pixel-art sprite drawn on a tiny grid of chunky square pixels, hard edges, no anti-aliasing, no gradients, flat colors from a limited palette, like artwork made in Aseprite"。出图分辨率建议 1024×1024(平台可选小档则选小,像素块更粗),真像素网格靠后处理降采样落定(§0 五步第 4 步)。触发词 `Pixel art style.` **已拍板加入(2026-09-23)——所有正向提示词一律以触发词开头**,已写入下面各卡(线上无像素 LoRA,它作风格提示词用);各卡负向已并入平滑系禁词,API 无负向栏时可整段省略。
|
||||||
|
|
||||||
## 1. 通用规格(所有卡片共用)
|
## 1. 通用规格(所有卡片共用)
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
## 2. 主角战斗小人(三态,P1)
|
## 2. 主角战斗小人(三态,P1)
|
||||||
|
|
||||||
形象锚 = **蓝兜帽(取下披肩,露棕色短发)、暖米白上衣+深棕工装裤(弃全蓝)、额前护目镜、半指手套+卷裤脚皮护膝、圆头挖掘铲(待机插地扶柄)、结构式冒险背包(1.5× 体宽)一侧插大于头的旗朱红矩形旗、腰挂提灯**(不点亮;规格见 [character-design.md](character-design.md) §5.4)。三态必须延续同一形象——**同一 seed 起步,只换动作短语(其余元素三态恒在)**。兜帽小人蓝 `#2E86DE`;上衣暖米白 `#EFE3C8`;长裤深棕 `#6B4A2E`(均候选,样张批冻结);眼用数字墨 `#33261B`;肤色白皙;皮革木色族 `#8A5A34`;背包帆布暖卡其+皮革翻盖扣带;提灯小号铜色;旗面旗朱红 `#C63D22`(人设旗脱钩——人设背包旗与棋盘封印色脱钩,封印黑仅棋盘格封印旗;旗面红仅旗非服饰,由正向十六进制锁色承载)。
|
形象锚 = 站姿样张先例经 2026-09-23 特征批+配装修订改定:**蓝兜帽(取下披肩,露棕色短发)、暖米白上衣+深棕工装裤(弃全蓝)、额前护目镜、半指手套+卷裤脚皮护膝、圆头挖掘铲(待机插地扶柄)、结构式冒险背包(1.5× 体宽)一侧插大于头的旗朱红矩形旗、腰挂提灯**(不点亮;规格见 [character-design.md](character-design.md) §5.4)。三态必须延续同一形象——**同一 seed 起步,只换动作短语(其余元素三态恒在)**。兜帽小人蓝 `#2E86DE`;上衣暖米白 `#EFE3C8`;长裤深棕 `#6B4A2E`(均候选,样张批冻结);眼用数字墨 `#33261B`;肤色白皙;皮革木色族 `#8A5A34`;背包帆布暖卡其+皮革翻盖扣带;提灯小号铜色;旗面旗朱红 `#C63D22`(2026-09-28 人设旗脱钩——人设背包旗与棋盘封印色脱钩,封印黑仅棋盘格封印旗;旗面红仅旗非服饰,由正向十六进制锁色承载)。
|
||||||
|
|
||||||
### 2.1 待机态
|
### 2.1 待机态
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ Pixel art style. true pixel art game sprite drawn on a tiny 48x72 pixel canvas,
|
|||||||
realistic, photorealistic, 3d render, photo, dark, grimdark, horror, gore, blood, scary, creepy, text, letters, numbers, watermark, signature, logo, frame, border, ui, gradient background, scenery, dungeon background, multiple characters, crowd, black outline, heavy dark outline, back view, side view, isometric, blurry, jpeg artifacts, smooth lines, anti-aliasing, gradient shading, painterly, glossy, high detail, vector illustration, tall skinny body, sharp angles, purple, magenta
|
realistic, photorealistic, 3d render, photo, dark, grimdark, horror, gore, blood, scary, creepy, text, letters, numbers, watermark, signature, logo, frame, border, ui, gradient background, scenery, dungeon background, multiple characters, crowd, black outline, heavy dark outline, back view, side view, isometric, blurry, jpeg artifacts, smooth lines, anti-aliasing, gradient shading, painterly, glossy, high detail, vector illustration, tall skinny body, sharp angles, purple, magenta
|
||||||
```
|
```
|
||||||
|
|
||||||
- **规格**:精英档 = 普通怪形 + **恰一处**垂直延伸(冠),底盘不变;轻甲 = 粗陋皮条、裸蓬毛、无甲板无符纹(§5.3);两版候选出齐供拍板档位。**同 seed 出 A/B**,只差冠棘一句。
|
- **规格**:精英档 = 普通怪形 + **恰一处**垂直延伸(冠),底盘不变;轻甲 = 粗陋皮条、裸蓬毛、无甲板无符纹(§5.3,2026-09-25 甲档回填);两版候选出齐供拍板档位。**同 seed 出 A/B**,只差冠棘一句。
|
||||||
- **显示名**:熊地精(沿用既有译名)。
|
- **显示名**:熊地精(沿用既有译名)。
|
||||||
|
|
||||||
### 3.3 食人魔酋长 ogre_chief(精英 · 轻甲 · 第一关关底)
|
### 3.3 食人魔酋长 ogre_chief(精英 · 轻甲 · 第一关关底)
|
||||||
@@ -141,7 +141,7 @@ Pixel art style. true pixel art game sprite drawn on a tiny 48x72 pixel canvas,
|
|||||||
realistic, photorealistic, 3d render, photo, dark, grimdark, horror, gore, blood, scary, creepy, text, letters, numbers, watermark, signature, logo, frame, border, ui, gradient background, scenery, dungeon background, multiple characters, crowd, black outline, heavy dark outline, back view, side view, isometric, blurry, jpeg artifacts, smooth lines, anti-aliasing, gradient shading, painterly, glossy, high detail, vector illustration, small body, skinny, sharp angles, purple, magenta
|
realistic, photorealistic, 3d render, photo, dark, grimdark, horror, gore, blood, scary, creepy, text, letters, numbers, watermark, signature, logo, frame, border, ui, gradient background, scenery, dungeon background, multiple characters, crowd, black outline, heavy dark outline, back view, side view, isometric, blurry, jpeg artifacts, smooth lines, anti-aliasing, gradient shading, painterly, glossy, high detail, vector illustration, small body, skinny, sharp angles, purple, magenta
|
||||||
```
|
```
|
||||||
|
|
||||||
- **规格**:精英档——唯一垂直元素是头顶冠(形状仍守精英档,不升 Boss 形);轻甲 = 裸身皮条/骨饰、无甲板(§5.3——数据实态 light,旧重甲金属甲板描述退役);体量一眼大于地精/熊地精(「大个子多半有重击」体量通道)。
|
- **规格**:精英档——唯一垂直元素是头顶冠(形状仍守精英档,不升 Boss 形);轻甲 = 裸身皮条/骨饰、无甲板(§5.3,2026-09-25 甲档回填——数据实态 light,旧重甲金属甲板描述退役);体量一眼大于地精/熊地精(「大个子多半有重击」体量通道)。
|
||||||
|
|
||||||
### 3.4 巨蜘蛛 giant_spider(普通怪 · 轻甲 · 群行)
|
### 3.4 巨蜘蛛 giant_spider(普通怪 · 轻甲 · 群行)
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ Pixel art style. true pixel art game sprite drawn on a tiny 48x72 pixel canvas,
|
|||||||
realistic, photorealistic, 3d render, photo, dark, grimdark, horror, gore, blood, scary, creepy, text, letters, numbers, watermark, signature, logo, frame, border, ui, gradient background, scenery, dungeon background, multiple characters, crowd, black outline, heavy dark outline, back view, side view, isometric, blurry, jpeg artifacts, smooth lines, anti-aliasing, gradient shading, painterly, glossy, high detail, vector illustration, cute, chubby, round, friendly
|
realistic, photorealistic, 3d render, photo, dark, grimdark, horror, gore, blood, scary, creepy, text, letters, numbers, watermark, signature, logo, frame, border, ui, gradient background, scenery, dungeon background, multiple characters, crowd, black outline, heavy dark outline, back view, side view, isometric, blurry, jpeg artifacts, smooth lines, anti-aliasing, gradient shading, painterly, glossy, high detail, vector illustration, cute, chubby, round, friendly
|
||||||
```
|
```
|
||||||
|
|
||||||
- **规格**:全场**唯二允许锐角与不对称**的角色之一;体量最大档(约 1.8–2 格高,工作假设);紫赤 `#8F2F6A`(色相 323°)为 Boss 独占——「形状独占 + 色相独占」双通道;魔法甲 = 卓尔上体暖白符纹饰带(§5.3),蛛腹几丁质属天然甲壳不计甲档。
|
- **规格**:全场**唯二允许锐角与不对称**的角色之一;体量最大档(约 1.8–2 格高,工作假设);紫赤 `#8F2F6A`(色相 323°)为 Boss 独占——「形状独占 + 色相独占」双通道;魔法甲 = 卓尔上体暖白符纹饰带(§5.3,2026-09-25 甲档回填),蛛腹几丁质属天然甲壳不计甲档。
|
||||||
- **注意**:这是全项目仅有的两张**负向里不加 `purple, magenta`、正向里主动要紫赤**的卡之一。出完记得吸色检查:色相 300°–345° 全项目只许两 Boss 出现。
|
- **注意**:这是全项目仅有的两张**负向里不加 `purple, magenta`、正向里主动要紫赤**的卡之一。出完记得吸色检查:色相 300°–345° 全项目只许两 Boss 出现。
|
||||||
- **显示名**:蛛化卓尔精灵。
|
- **显示名**:蛛化卓尔精灵。
|
||||||
|
|
||||||
@@ -238,6 +238,7 @@ Pixel art style. true pixel art game sprite drawn on a tiny 48x72 pixel canvas,
|
|||||||
|
|
||||||
- **负向**:同 3.2 版本 A。
|
- **负向**:同 3.2 版本 A。
|
||||||
- **验收**:与熊地精终稿剪影叠加比对,轮廓逐像素一致,只允许颜色不同。
|
- **验收**:与熊地精终稿剪影叠加比对,轮廓逐像素一致,只允许颜色不同。
|
||||||
|
- **v2.0 变更注**:v1.0 备选配色「冷蓝灰」弃用——蓝族禁入敌方主色(§5.4/§5.5),且与小人蓝同屏有混淆风险;改灰褐战纹。
|
||||||
- **显示名**:L2 行显示名沿用熊地精系(熊地精/熊地精猎群/熊地精重击手——enemy.tres 数据实态)。
|
- **显示名**:L2 行显示名沿用熊地精系(熊地精/熊地精猎群/熊地精重击手——enemy.tres 数据实态)。
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -247,7 +248,7 @@ Pixel art style. true pixel art game sprite drawn on a tiny 48x72 pixel canvas,
|
|||||||
1. **剪影**:转灰度仍认得出是什么、是哪一档(普通/精英/Boss)——敌种间剪影可辨是硬需求。
|
1. **剪影**:转灰度仍认得出是什么、是哪一档(普通/精英/Boss)——敌种间剪影可辨是硬需求。
|
||||||
2. **轮廓通道**:亮描边 + 落影底盘在位;深浅两种格底上各摆一眼都可辨(四联测试条就是干这个的)。
|
2. **轮廓通道**:亮描边 + 落影底盘在位;深浅两种格底上各摆一眼都可辨(四联测试条就是干这个的)。
|
||||||
3. **色相纪律**:吸色扫一遍,无 300°–345°(两 Boss 除外);无大面积正红/亮金误用;敌方主体无蓝族。
|
3. **色相纪律**:吸色扫一遍,无 300°–345°(两 Boss 除外);无大面积正红/亮金误用;敌方主体无蓝族。
|
||||||
4. **甲档**:灰度下三档甲覆盖率可辨——轻甲无甲板、魔法护甲见符纹带、重甲大面积甲板;天然甲壳/毛皮没被画成装备甲。
|
4. **甲档**(v2.0 新增):灰度下三档甲覆盖率可辨——轻甲无甲板、魔法护甲见符纹带、重甲大面积甲板;天然甲壳/毛皮没被画成装备甲。
|
||||||
5. **头身**:2–3 头身之内,与站姿样张同世界观。
|
5. **头身**:2–3 头身之内,与站姿样张同世界观。
|
||||||
6. **同形象**:主角三态并排、L2 熊地精对熊地精、熊地精 A/B 对——兜帽/装备/剪影不串戏。
|
6. **同形象**:主角三态并排、L2 熊地精对熊地精、熊地精 A/B 对——兜帽/装备/剪影不串戏。
|
||||||
|
|
||||||
@@ -287,9 +288,9 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
|
|
||||||
> **范围注**:本文件原定位角色级(见文件头边界句),§4bis 已有「地形类同库登记」的先例,本节循同一先例补登记战斗屏的**小石台件(②)**与护甲类型图标三枚(③),两组在营地卡与清单里都无处落工单;战斗舞台背景层(①)与连续地面层的元素/提示词已另立 [battle-stage-prompts](battle-stage-prompts.md),§5.1 只留指路;角色级立绘重产(④)是本文件的本职。四组的规格定值清单 §4 已有登记,本节补的是「逐件照着就能出件」那一层。
|
> **范围注**:本文件原定位角色级(见文件头边界句),§4bis 已有「地形类同库登记」的先例,本节循同一先例补登记战斗屏的**小石台件(②)**与护甲类型图标三枚(③),两组在营地卡与清单里都无处落工单;战斗舞台背景层(①)与连续地面层的元素/提示词已另立 [battle-stage-prompts](battle-stage-prompts.md),§5.1 只留指路;角色级立绘重产(④)是本文件的本职。四组的规格定值清单 §4 已有登记,本节补的是「逐件照着就能出件」那一层。
|
||||||
> **定值纪律(§8 头注 定值单点纪律)**:本节**指路不立值**——色值 = 圣经 §4.1(含场景环境子板)、尺寸与缩放 = §8.2、明度带 = §2、甲档 = character-design §5.3、命名 = §8.3 + asset-path-map。本节新增零定值;凡圣经未定的值,一律进本节 §5.5 缺口,不在本节填空。
|
> **定值纪律(§8 头注 定值单点纪律)**:本节**指路不立值**——色值 = 圣经 §4.1(含场景环境子板)、尺寸与缩放 = §8.2、明度带 = §2、甲档 = character-design §5.3、命名 = §8.3 + asset-path-map。本节新增零定值;凡圣经未定的值,一律进本节 §5.5 缺口,不在本节填空。
|
||||||
> **验收标注纪律**:逐条按三档标 `←机检: <断言>` / `←目检: <判据>` / `←方向性`,照圣经头注(用户拍板)的写法。
|
> **验收标注纪律**:逐条按三档标 `←机检: <断言>` / `←目检: <判据>` / `←方向性`,照圣经头注 2026-10-06 用户拍板的写法。
|
||||||
> **流程**:出图前后一律走 §0 五步;出图登记义务照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,其余参数有则记),随候选图存 `artwork/candidates/<资产名>/`;登记不作正稿遴选前置。
|
> **流程**:出图前后一律走 §0 五步;出图登记义务照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,其余参数有则记),随候选图存 `artwork/candidates/<资产名>/`;登记不作正稿遴选前置。
|
||||||
> **产出状态**:组二地台件与组三护甲三枚已按各节 ⑤「程序化产出即终稿」产出入包(`scene_stage_plaza.png` 48×12、`ui_armor_light/ward/heavy.png` 24×24,路径见各组 ① 字段);组一背景插画见 [battle-stage-prompts](battle-stage-prompts.md)(三张背景+共用地面已入包并已实装消费——按关选图+连续地面层落码,四柱光柱层与平色底已退役),组四改按档派生(不重画)已落位:九件按原稿分辨率入包、显示按三档绝对高缩放(定值单点=art-bible §8.2,派生管线见 §5.4 工单)。
|
> **产出状态**:组二地台件与组三护甲三枚已按各节 ⑤「程序化产出即终稿」产出入包(`scene_stage_plaza.png` 48×12、`ui_armor_light/ward/heavy.png` 24×24,路径见各组 ① 字段;登记=战斗一屏样张批,合并提交 3b66d1a6);组一背景插画已迁至 [battle-stage-prompts](battle-stage-prompts.md)(仍待出图),组四立绘重产仍待出图。
|
||||||
|
|
||||||
### 5.1 组一 · B 区舞台背景插画(1 件)
|
### 5.1 组一 · B 区舞台背景插画(1 件)
|
||||||
|
|
||||||
@@ -301,7 +302,7 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
|---|---|
|
|---|---|
|
||||||
| ① 路径与命名 | `game/assets/art/scene/scene_stage_plaza.png`——域键 `scene`(asset-path-map §3),命名照 §8.3。**跨三关恒定,文件名不带 board_type 后缀** |
|
| ① 路径与命名 | `game/assets/art/scene/scene_stage_plaza.png`——域键 `scene`(asset-path-map §3),命名照 §8.3。**跨三关恒定,文件名不带 board_type 后缀** |
|
||||||
| ② 尺寸档与像素网格 | 源 48×12;**九宫格横向拉伸**,顶缘受光线 2px 不随拉伸变形(§8.2 / §6.1 定值);高度维持源档 12px、横向拉至站桩宽。九宫格件不在甲/乙两分类内(§8.2 甲类 = 文本与语义件、乙类 = 角色与单位精灵),本件高度恒为整数像素、横向拉伸区只取纯色 |
|
| ② 尺寸档与像素网格 | 源 48×12;**九宫格横向拉伸**,顶缘受光线 2px 不随拉伸变形(§8.2 / §6.1 定值);高度维持源档 12px、横向拉至站桩宽。九宫格件不在甲/乙两分类内(§8.2 甲类 = 文本与语义件、乙类 = 角色与单位精灵),本件高度恒为整数像素、横向拉伸区只取纯色 |
|
||||||
| ③ 色板约束 | 进**战斗屏场景环境子板**(§4.1 分层②,不占 48 额度,余量 0 不动)。**零新增**——板身 `#968264`(STAND_STONE,§4.1 已转正进本子板)/ 顶缘受光线 `#C9AF83`(掩尘;地台顶缘受光线并入此值,与 §8.2 高墙口沿高光 `Color8(196,172,132)` 为同一枚)/ 描边 `#4C4038`(地台描边并入此值)。单张像素域色数 ≤32。第二道门同本节 5.1 |
|
| ③ 色板约束 | 进**战斗屏场景环境子板**(§4.1 分层②,不占 48 额度,余量 0 不动)。**零新增**——板身 `#968264`(STAND_STONE,§4.1 已转正进本子板)/ 顶缘受光线 `#C9AF83`(掩尘;2026-10-28 合并登记把地台顶缘受光线并进掩尘,并与 §8.2 高墙口沿高光 `Color8(196,172,132)` 统一为同一枚)/ 描边 `#4C4038`(2026-10-28 合并登记把地台描边并入此值)。单张像素域色数 ≤32。第二道门同本节 5.1 |
|
||||||
| ④ 明度带归属 | **世界中层 L 0.22–0.45**(§2)——判定对象 = 板身 `#968264`(实测 L≈0.234)与顶缘受光线 `#C9AF83`(实测 L≈0.449,材质受光属 §2 形体塑造允许域)。§6.1 把地台定死为世界中层承载面,就是本件的立法理由。描边 `#4C4038` 是结构墨线(§3.2 高墙墨线同族,职责 = 分隔),不按明度带判定 |
|
| ④ 明度带归属 | **世界中层 L 0.22–0.45**(§2)——判定对象 = 板身 `#968264`(实测 L≈0.234)与顶缘受光线 `#C9AF83`(实测 L≈0.449,材质受光属 §2 形体塑造允许域)。§6.1 把地台定死为世界中层承载面,就是本件的立法理由。描边 `#4C4038` 是结构墨线(§3.2 高墙墨线同族,职责 = 分隔),不按明度带判定 |
|
||||||
| ⑤ 是否程序化件 | 是 → **程序化直出即终稿,不须出图**。本件只有三块纯色 + 一条 2px 缘线,无材质纹理需求,按 §8.5「材质归模型、结构归程序」落脚本绘制即成立;它不属 §7.1 占位态 |
|
| ⑤ 是否程序化件 | 是 → **程序化直出即终稿,不须出图**。本件只有三块纯色 + 一条 2px 缘线,无材质纹理需求,按 §8.5「材质归模型、结构归程序」落脚本绘制即成立;它不属 §7.1 占位态 |
|
||||||
| ⑥ 验收判据 | 见下方逐条判据 |
|
| ⑥ 验收判据 | 见下方逐条判据 |
|
||||||
@@ -332,7 +333,7 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
|---|---|
|
|---|---|
|
||||||
| ① 路径与命名 | `game/assets/ui/icons/ui_armor_light.png` / `ui_armor_ward.png` / `ui_armor_heavy.png`——域键 `ui`,落 `game/assets/ui/icons/`(与现役九枚状态图标同目录,asset-path-map §1);命名照 §8.3,对象键 = `armor`、变体 = 甲档键,与清单 §3.7 逐字一致 |
|
| ① 路径与命名 | `game/assets/ui/icons/ui_armor_light.png` / `ui_armor_ward.png` / `ui_armor_heavy.png`——域键 `ui`,落 `game/assets/ui/icons/`(与现役九枚状态图标同目录,asset-path-map §1);命名照 §8.3,对象键 = `armor`、变体 = 甲档键,与清单 §3.7 逐字一致 |
|
||||||
| ② 尺寸档与像素网格 | 源 24×24,显示 24px = 1×;九宫格 = 否;**甲类**(§8.2 甲类 = 文本与语义件,图标在列)→ 维持严格整数倍缩放硬规则,禁非整数缩放 |
|
| ② 尺寸档与像素网格 | 源 24×24,显示 24px = 1×;九宫格 = 否;**甲类**(§8.2 甲类 = 文本与语义件,图标在列)→ 维持严格整数倍缩放硬规则,禁非整数缩放 |
|
||||||
| ③ 色板约束 | 进**语义/UI token 板**(§4.1 分层①),**占 48 额度——余量 0**(本组新增重甲冷灰 1 枚 + 5.4 组四新增卓尔浅紫灰皮 1 枚,额度已用尽)。逐件取在册色(**素底明暗档已裁深档 `#282220`**,见 §5.5 缺口 2 已裁条):轻甲 = `WARM_FAINT #CDB88C`(深档下 8.08:1;原木色 `#8A5A34` 深档仅 2.72:1 不过门,按合并裁定改值、零额度)/ 魔法护甲 = 暖白 `#F0E2C8`(12.26:1,深档下本值不动)/ 重甲 = `#868C9A`(新入板,占 1 枚额度,深档下 4.65:1)。单张像素域色数 ≤32。第二道门同本节 5.1 |
|
| ③ 色板约束 | 进**语义/UI token 板**(§4.1 分层①),**占 48 额度——余量 0**(2026-10-28 用户裁:本组新增重甲冷灰 1 枚 + 5.4 组四新增卓尔浅紫灰皮 1 枚,全板余量 2 → 0,额度已用尽)。逐件取在册色(**素底明暗档已裁深档 `#282220`**,见 §5.5 缺口 2 已裁条):轻甲 = `WARM_FAINT #CDB88C`(深档下 8.08:1;原木色 `#8A5A34` 深档仅 2.72:1 不过门,按合并裁定改值、零额度)/ 魔法护甲 = 暖白 `#F0E2C8`(12.26:1,深档下本值不动)/ 重甲 = `#868C9A`(新入板,占 1 枚额度,深档下 4.65:1)。单张像素域色数 ≤32。第二道门同本节 5.1 |
|
||||||
| ④ 明度带归属 | **信息面层**(§2:信息面层 = 数字 / UI 数据 / 预告 / 语义标识)——图标是语义标识,与站桩名字行同排挂载。**信息面层 L 区间维持定性、不新增区间**(§5.5 缺口 3 核实结论:执法已被 §7.2 文字 ≥4.5:1 与 §4.1 图形 ≥3:1 两条相对判据覆盖,层间序关系由 §1.4 整屏②项断言,不需要绝对区间),本节落地判据走 §4.1 图形对比 ≥3:1 |
|
| ④ 明度带归属 | **信息面层**(§2:信息面层 = 数字 / UI 数据 / 预告 / 语义标识)——图标是语义标识,与站桩名字行同排挂载。**信息面层 L 区间维持定性、不新增区间**(§5.5 缺口 3 核实结论:执法已被 §7.2 文字 ≥4.5:1 与 §4.1 图形 ≥3:1 两条相对判据覆盖,层间序关系由 §1.4 整屏②项断言,不需要绝对区间),本节落地判据走 §4.1 图形对比 ≥3:1 |
|
||||||
| ⑤ 是否程序化件 | 是 → **程序化产出即终稿**。来源照清单 §3.7:♻ 素材站通用护甲/符纹图标改色优先、⚙ 兜底程序化;♻ 件须过清单 §0 复用闸四道才入包 |
|
| ⑤ 是否程序化件 | 是 → **程序化产出即终稿**。来源照清单 §3.7:♻ 素材站通用护甲/符纹图标改色优先、⚙ 兜底程序化;♻ 件须过清单 §0 复用闸四道才入包 |
|
||||||
| ⑥ 验收判据 | 见下方共用验收 + 逐件验收 |
|
| ⑥ 验收判据 | 见下方共用验收 + 逐件验收 |
|
||||||
@@ -343,7 +344,7 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
- ←机检: 源 24×24、显示 1× 整数倍(§8.2 显示档登记例外条:素材一字节禁改)
|
- ←机检: 源 24×24、显示 1× 整数倍(§8.2 显示档登记例外条:素材一字节禁改)
|
||||||
- ←机检: 文件名逐位等于 `ui_armor_light` / `ui_armor_ward` / `ui_armor_heavy`
|
- ←机检: 文件名逐位等于 `ui_armor_light` / `ui_armor_ward` / `ui_armor_heavy`
|
||||||
- ←机检: 单张像素域色数 ≤32
|
- ←机检: 单张像素域色数 ≤32
|
||||||
- ←机检: 三枚对其实际挂载底色的图形对比 ≥3:1(§4.1 图标槽柔和档条的图形参考线硬约束)。**挂载底色 = 站桩名字行的素底,不是舞台底也不是地台面**——站桩名字行是文字,§7.2「一切文字(含菜单/说明/tooltip/按钮/底栏,**无区域例外**)」+「文字禁直接压纹理底——垫容器或罩层」两条覆盖它;§6.1 舞台正面目标条已就站桩文字位显式落法:「站桩文字位改垫素底或落进结算明细带」,并明写「**非新条款**」,§7.2 亦有「站桩石板地台面同理」句、两处机检断言同文。舞台背景插画(`scene_stage_bg_<board_type>` 三关变体;battle-stage-prompts §2.1)属纹理底,落法门触发。**故「站桩名字行落法 = 垫素底」是既有条款的落法,本节不立新条款**(§5 头注定值纪律:本节指路不立值)。素底明暗档 **已裁 = 深档 `#282220`**(§7.4 血数垫牌 `HP_BAR_BACK` 在册同款,零新增;浅档 `#F5EAD3` 落选,两档对照与理据见 §5.5 缺口 2 已裁条)
|
- ←机检: 三枚对其实际挂载底色的图形对比 ≥3:1(§4.1 图标槽柔和档条的图形参考线硬约束)。**挂载底色 = 站桩名字行的素底,不是舞台底也不是地台面**——站桩名字行是文字,§7.2「一切文字(含菜单/说明/tooltip/按钮/底栏,**无区域例外**)」+「文字禁直接压纹理底——垫容器或罩层」两条覆盖它;§6.1 舞台正面目标条(2026-10-28 v3.22 定值)已就站桩文字位显式落法:「站桩文字位改垫素底或落进结算明细带」,并明写「**非新条款**」,§7.2 同批加「站桩石板地台面同理」句、两处机检断言同文。舞台背景插画(`scene_stage_bg_<board_type>` 三关变体;battle-stage-prompts §2.1)属纹理底,落法门触发。**故「站桩名字行落法 = 垫素底」是既有条款的落法,本节不立新条款**(§5 头注定值纪律:本节指路不立值)。素底明暗档 **2026-10-28 已裁 = 深档 `#282220`**(§7.4 血数垫牌 `HP_BAR_BACK` 在册同款,零新增;浅档 `#F5EAD3` 落选,两档对照与理据见 §5.5 缺口 2 已裁条)
|
||||||
- ←机检: B 区站桩名字行与护甲图标正下方像素非地台板身色 `#968264`(§6.1 / §7.2 同文断言)
|
- ←机检: B 区站桩名字行与护甲图标正下方像素非地台板身色 `#968264`(§6.1 / §7.2 同文断言)
|
||||||
- ←目检: 灰度下按甲面覆盖率三档可辨——无甲板 → 符纹带 → 大面积甲板(character-design §5.3 灰度通道条)
|
- ←目检: 灰度下按甲面覆盖率三档可辨——无甲板 → 符纹带 → 大面积甲板(character-design §5.3 灰度通道条)
|
||||||
- ←目检: 三枚互辨,身份只靠形状不靠色相(§4.5 ⑨ 图标键族:色相不承载身份)
|
- ←目检: 三枚互辨,身份只靠形状不靠色相(§4.5 ⑨ 图标键族:色相不承载身份)
|
||||||
@@ -352,8 +353,8 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
**5.3.1 轻甲 `ui_armor_light`(轻甲档)**
|
**5.3.1 轻甲 `ui_armor_light`(轻甲档)**
|
||||||
|
|
||||||
- 形状:甲面覆盖率 ≈ 0——一枚**皮条 / 布带**记号(斜跨的皮带扣或系带),主体留空,零甲板(character-design §5.3)
|
- 形状:甲面覆盖率 ≈ 0——一枚**皮条 / 布带**记号(斜跨的皮带扣或系带),主体留空,零甲板(character-design §5.3)
|
||||||
- 色:**`WARM_FAINT #CDB88C`**(素底取深档后原皮革木色 `#8A5A34`〔§7.2 木色〕仅 2.72:1 不过门,按 §4.1「不过门即换色合并、禁加色绕行」并入本值——**零额度**;代价 = 暖白族非木色族,已随裁定接受)
|
- 色:**`WARM_FAINT #CDB88C`**(2026-10-28 用户裁:素底取深档后原皮革木色 `#8A5A34`〔§7.2 木色〕仅 2.72:1 不过门,按 §4.1「不过门即换色合并、禁加色绕行」并入本值——**零额度**;代价 = 暖白族非木色族,已随裁定接受)
|
||||||
- **对比判据**(挂载底色 = 站桩名字行素底,裁深档 `#282220`):**8.08:1 ✓**(≥3:1 图形门槛);对舞台底 `#3E362C` 6.12:1。木色族路线(新增木色亮档 `#C49A5E` 6.07:1)未取——须 +1 额度而余量已为 0
|
- **对比判据**(挂载底色 = 站桩名字行素底,2026-10-28 裁深档 `#282220`):**8.08:1 ✓**(≥3:1 图形门槛);对舞台底 `#3E362C` 6.12:1。木色族路线(新增木色亮档 `#C49A5E` 6.07:1)未取——须 +1 额度而余量已为 0
|
||||||
- ←机检: 本枚对其实际挂载深素底 ≥3:1(实测 8.08:1);入板后全板色对中三通道差全部 <8/255 的对数 = 0
|
- ←机检: 本枚对其实际挂载深素底 ≥3:1(实测 8.08:1);入板后全板色对中三通道差全部 <8/255 的对数 = 0
|
||||||
- ←目检: 换色后本枚仍读作皮革/皮条,不与 5.3.2 符纹带、5.3.3 甲板在灰度下混读(character-design §5.3 灰度通道:三档按甲面覆盖率可辨)
|
- ←目检: 换色后本枚仍读作皮革/皮条,不与 5.3.2 符纹带、5.3.3 甲板在灰度下混读(character-design §5.3 灰度通道:三档按甲面覆盖率可辨)
|
||||||
- 来源与工艺:♻ 素材站 belt / strap 类图标改色,过清单 §0 复用闸四道(色板量化 / 禁入带吸色 / 灰度可辨 / 授权干净);⚙ 兜底按 24×24 网格手修——3px 带宽、1px 深墨描边,不画甲板
|
- 来源与工艺:♻ 素材站 belt / strap 类图标改色,过清单 §0 复用闸四道(色板量化 / 禁入带吸色 / 灰度可辨 / 授权干净);⚙ 兜底按 24×24 网格手修——3px 带宽、1px 深墨描边,不画甲板
|
||||||
@@ -367,34 +368,32 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
**5.3.3 重甲 `ui_armor_heavy`(重甲档)**
|
**5.3.3 重甲 `ui_armor_heavy`(重甲档)**
|
||||||
|
|
||||||
- 形状:**金属甲板**覆盖肩与胸,覆盖率三档中最大(character-design §5.3)
|
- 形状:**金属甲板**覆盖肩与胸,覆盖率三档中最大(character-design §5.3)
|
||||||
- 色:冷灰金属材质色 = **`#868C9A`**(已转定稿,见 §5.5 缺口 1 已裁条;新入 §4.1 分层①,占 1 枚额度)。**与 5.4.4 石君王岩石板甲是同一枚**——character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王工单**直接引本枚 `#868C9A`、不另计额度**
|
- 色:冷灰金属材质色 = **`#868C9A`**(2026-10-28 用户裁转定稿,见 §5.5 缺口 1 已裁条;新入 §4.1 分层①,占 1 枚额度)。**与 5.4.4 石君王岩石板甲是同一枚**——character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王工单**直接引本枚 `#868C9A`、不另计额度**
|
||||||
- **对比判据**(挂载底色 = 站桩名字行素底,裁深档 `#282220`):须同时满足 §5.4 ④ 立绘体块主色带 L 0.22–0.45 与本节 ≥3:1 —— 深档窗 = **[0.220, 0.450]**;本值 L≈0.261 落窗,**对深素底 4.65:1 ✓、对舞台底 3.52:1 ✓**
|
- **对比判据**(挂载底色 = 站桩名字行素底,2026-10-28 裁深档 `#282220`):须同时满足 §5.4 ④ 立绘体块主色带 L 0.22–0.45 与本节 ≥3:1 —— 深档窗 = **[0.220, 0.450]**;本值 L≈0.261 落窗,**对深素底 4.65:1 ✓、对舞台底 3.52:1 ✓**
|
||||||
- ←机检: 本枚对其实际挂载深素底 ≥3:1(实测 4.65:1)且相对亮度 L 落 [0.220, 0.450](实测 0.261);入板后全板色对中三通道差全部 <8/255 的对数 = 0
|
- ←机检: 本枚对其实际挂载深素底 ≥3:1(实测 4.65:1)且相对亮度 L 落 [0.220, 0.450](实测 0.261);入板后全板色对中三通道差全部 <8/255 的对数 = 0
|
||||||
- ←目检: 灰度下本枚甲板覆盖率三档最大,与 5.3.1 无甲板、5.3.2 符纹带可辨(character-design §5.3 灰度通道)
|
- ←目检: 灰度下本枚甲板覆盖率三档最大,与 5.3.1 无甲板、5.3.2 符纹带可辨(character-design §5.3 灰度通道)
|
||||||
- ←方向性: 冷灰与全作暖底成材质对比(§5.3),不靠明度差与地台 `#968264`(L≈0.234)抢读——立绘与地台的可辨归 §5.1 轮廓通道
|
- ←方向性: 冷灰与全作暖底成材质对比(§5.3),不靠明度差与地台 `#968264`(L≈0.234)抢读——立绘与地台的可辨归 §5.1 轮廓通道
|
||||||
- 来源与工艺:♻ 素材站 plate armor 肩甲/胸甲类图标改色 → 闸四道;⚙ 兜底 24×24 内肩 + 胸两块甲板,与全作暖底成材质对比(§5.3 冷灰金属与暖底对比)
|
- 来源与工艺:♻ 素材站 plate armor 肩甲/胸甲类图标改色 → 闸四道;⚙ 兜底 24×24 内肩 + 胸两块甲板,与全作暖底成材质对比(§5.3 冷灰金属与暖底对比)
|
||||||
|
|
||||||
### 5.4 组四 · 站桩立绘按档派生(9 件,不重画)
|
### 5.4 组四 · 主角与三 Boss 立绘重产(4 件)
|
||||||
|
|
||||||
> 本节是站桩立绘的**按档派生**工单:现有形象即终稿、禁改形象;清晰度靠保留原稿分辨率+显示按三档绝对高缩放解决,不重画、不生成。
|
**四件共用字段**
|
||||||
|
|
||||||
**九件共用字段**
|
|
||||||
|
|
||||||
| 字段 | 值 |
|
| 字段 | 值 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| ① 路径与命名 | `game/assets/art/character/character_hero_portrait.png` + `game/assets/art/character/character_enemy_<enemy_id>.png`(域键 `character`,对象键 = `hero` / enemy_id,命名照 §8.3 与 asset-path-map §3 现役写法) |
|
| ① 路径与命名 | `game/assets/art/character/character_hero_portrait.png` + `game/assets/art/character/character_enemy_<enemy_id>.png`(域键 `character`,对象键 = `hero` / enemy_id,命名照 §8.3 与 asset-path-map §3 现役写法) |
|
||||||
| ② 尺寸档与像素网格 | **源 = 原稿像素网格**(八敌 `pixel-1`、主角手修 2× 三态稿),紧裁后原样入包,**禁再降采样**;**显示档 = 三档绝对高**——小 96(地精/巨蜘蛛/灰矮人)、中 144(主角/钩爪恐魔/熊地精)、大 188(食人魔酋长/蛛化卓尔/灰矮人石君王),定值单点 = art-bible §8.2;显示倍率 = 档高 ÷ 源高,NEAREST,宽随源图比例(高定宽随、纵横倍率恒等,禁方框强拉);九宫格 = 否 |
|
| ② 尺寸档与像素网格 | **源档高逐键** = 主角 48 / ogre_chief 74 / drider 90 / duergar_king 94(§8.2 立绘源档表,逐件值见本节 5.4.1–5.4.4);**宽随源图宽高比,纵横倍率恒等**(§8.2 站桩立绘槽位 = 高定宽随条,禁把立绘塞进统一方框强拉);九宫格 = 否;显示一律 **×2 整数档** = 96 / 148 / 180 / 188;**乙类**(角色与单位精灵)——乙类允许非整数,本批按 §8.2 定案走 ×2 整数档 |
|
||||||
| ③ 色板约束 | 色值以**现役稿**为准,零新增色、零换色;单张像素域色数 ≤32(`pixel-1` 与手修 2× 稿实测均 ≤32)。`#A79CB8` 保留在板、不消费,色板额度议题另议 |
|
| ③ 色板约束 | 进**语义/UI token 板**(§4.1 分层①);**48 余量 0**(2026-10-28 用户裁:本组新增卓尔浅紫灰皮 1 枚,全板余量 2 → 0,额度已用尽)。逐件沿用 character-design §5.4 / §5.5 已登记色值;该两节只给形容词未给色值的部件,**2026-10-28 用户裁已落值**——四处换色合并(零额度)+ 卓尔浅紫灰皮新增 1 枚,逐件取值见本节 5.4.1–5.4.4,额度账见 §5.5 缺口 4。**石君王岩石板甲 = 重甲甲材质色、与 §5.3.3 同一枚,工单直接引 `#868C9A`、不另计额度**。单张像素域色数 ≤32。第二道门同本节 5.1 |
|
||||||
| ④ 明度带归属 | **世界中层 L 0.22–0.45**(§2 世界中层 = 格底顶面 / 角色 / 物件)——判定对象 = 角色体块主色。描边与落影底盘属轮廓通道(character-design §5.1)、紫赤点缀属 §4.2 色相独占的语义色,两者都不按明度带判定 |
|
| ④ 明度带归属 | **世界中层 L 0.22–0.45**(§2 世界中层 = 格底顶面 / 角色 / 物件)——判定对象 = 角色体块主色。描边与落影底盘属轮廓通道(character-design §5.1)、紫赤点缀属 §4.2 色相独占的语义色,两者都不按明度带判定 |
|
||||||
| ⑤ 是否程序化件 | 否 → **零绘制**:源 = 现有原稿,不生成、不重画(现有形象即终稿)。§7.1 占位完成条款对本组不适用——现役稿即终稿 |
|
| ⑤ 是否程序化件 | 否 → **须手绘**。口径 = **精细手绘像素**(2026-10-14 用户裁:仍是像素风,手绘像素簇 + 更高源密度;不是插画、不是 HD-2D、不回退高清图);**禁 AI 降采样当终稿**。现行 AI 降采样立绘 = 占位态,按 §7.1 占位完成条款须在终稿闸前换代 |
|
||||||
| ⑥ 验收判据 | 见下方共用验收 |
|
| ⑥ 验收判据 | 见下方共用验收 |
|
||||||
| ⑦ 操作要点 | 见下方派生要点(零绘制,不产生图提示词) |
|
| ⑦ 出图操作要点 | 见下方工艺要点(手绘,不产生图提示词) |
|
||||||
|
|
||||||
**共用验收(四件都要过)**
|
**共用验收(四件都要过)**
|
||||||
|
|
||||||
- ←机检: 逐件显示档高与归档一致(小 96 / 中 144 / 大 188),过滤 = NEAREST,纵横倍率恒等;源高低于档高者按已接受放大项登记(主角 92 / 钩爪 94 / 熊地精 123 / 地精 90 / 巨蜘蛛 81)
|
- ←机检: 源档高逐位等于 48 / 74 / 90 / 94,显示 = 源 ×2(96 / 148 / 180 / 188),过滤 = NEAREST
|
||||||
- ←机检: 单张像素域色数 ≤32
|
- ←机检: 单张像素域色数 ≤32
|
||||||
- ←机检: 脚底基线对齐(紧裁 + 底中锚;命名合规、像素域色数 ≤32 同旧)
|
- ←机检: 脚底基线对齐(派生管线四条:等比整数缩放 + 降色 ≤32 + 脚底基线对齐 + 命名合规)
|
||||||
- ←机检: 主角描边 = `(40,19,13)`;敌方描边取暖白族(非黑、非深褐)—— character-design §5.1 主角描边例外条
|
- ←机检: 主角描边 = `(40,19,13)`;敌方描边取暖白族(非黑、非深褐)—— character-design §5.1 主角描边例外条
|
||||||
- ←机检: Alpha 直出——不透明区外缘 1px 环内无生成底残留(无 R/G/B 三通道均 ≥230 且 alpha > 0 的像素),防抠图白边
|
- ←机检: Alpha 直出——不透明区外缘 1px 环内无生成底残留(无 R/G/B 三通道均 ≥230 且 alpha > 0 的像素),防抠图白边
|
||||||
- ←机检: 零 HSV 300°–345° 像素(drider / duergar_king 两 Boss 除外,§4.2 独占)
|
- ←机检: 零 HSV 300°–345° 像素(drider / duergar_king 两 Boss 除外,§4.2 独占)
|
||||||
@@ -402,54 +401,63 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
- ←目检: 放大 4 倍,轮廓与衣服是成组的像素,不是降采样噪点(三判据①)
|
- ←目检: 放大 4 倍,轮廓与衣服是成组的像素,不是降采样噪点(三判据①)
|
||||||
- ←目检: 显示 96–188px 下脸、铲、旗、物种能认出来,不必先读名字(三判据②)
|
- ←目检: 显示 96–188px 下脸、铲、旗、物种能认出来,不必先读名字(三判据②)
|
||||||
- ←目检: 显示仍用邻近采样,不出现插画那种平滑渐变(三判据③)
|
- ←目检: 显示仍用邻近采样,不出现插画那种平滑渐变(三判据③)
|
||||||
- ←方向性: 现有形象即终稿,禁改形象
|
- ←方向性: 精细手绘像素气质——不是插画、也不是半像素半高清
|
||||||
|
|
||||||
三判据出处 = `reports/美术审计-cursor会话存档-2026-10-14.md` §2.2。
|
三判据出处 = `reports/美术审计-cursor会话存档-2026-10-14.md` §2.2。
|
||||||
|
|
||||||
**派生要点(零绘制)**
|
**工艺要点(手绘)**
|
||||||
|
|
||||||
1. 出件顺序 = 先主角三态,再三 Boss,再其余四敌(同管线,无绘制差异)。
|
1. 出件顺序 = 先主角、再三 Boss(Alpha 范围 = 主角 + 三 Boss 重产,其余敌种当前可读则保留到 Beta)。
|
||||||
2. 每件 = `pixel-1`/手修 2× 稿紧裁(去透明边、底中锚)→ 原样落 `game/assets/art/character/character_*`;**不做 `dom_block_resize`**。
|
2. **源密度判据 = 三判据②**:显示 96–188px 下脸、铲、旗、物种可认——照这条反推源档即可,逐键定档已完成(§8.2),本批不必再猜档位。
|
||||||
3. 入包前过 §8.3 色板检查器与 standee_asset_check(按 §8.2 显示档校验逐件档高与纵横倍率)。
|
3. 手绘起稿顺序 = 剪影(§5.1 archetype)→ 体块主色 → 暗部与受光 → 描边 → 落影底盘。
|
||||||
4. 桩盒宽 150 与 >150 溢出档的实装口径归代码批(art-bible §8.2 排版条);食人魔超宽 8px 为已接受项。
|
4. 逐件 2–3 版候选;登记照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,手绘作者有则记),随候选图存 `artwork/candidates/<资产名>/`。
|
||||||
|
5. 候选评审 = 并排横评,**隐去文件名与来源后按三判据逐条判读**(§0 五步第 1 步「便于横评」的手绘侧落法),不靠记忆与印象拍板。
|
||||||
|
6. 出件 = 透明 PNG(Alpha 直出,禁先出白底图再抠);入包前过 §8.3 色板检查器(报新增色 / 近色告警 / 超 48 上限拦截)。
|
||||||
|
|
||||||
**5.4.1 主角(中档 144)**
|
**5.4.1 主角(源 48 / 显示 96)**
|
||||||
|
|
||||||
- 形象 = 现役稿即终稿,character-design §5.4 形象锚已兑现于现役素材;朝向沿用现役,不重新裁定
|
- 形象 = character-design §5.4 形象锚逐字执行:蓝兜帽取下披肩、暖米白上衣、深棕工装裤、额前护目镜、半指手套、卷裤脚皮护膝、圆头挖掘铲、结构式冒险背包配朱红矩形旗、腰挂提灯
|
||||||
- 色 = 以现役稿为准(§5.5 缺口 4 的额度账随色板议题另议)
|
- 已登记色:兜帽 `#2E86DE` / 上衣 `#EFE3C8` / 长裤 `#6B4A2E` / 皮革 `#8A5A34` / 眼 `#33261B` / 旗 `#C63D22` / 描边 `(40,19,13)`
|
||||||
- 源 = `hero-ref/edit/normal_2x.png`(内容 88×92);attack/hit 用 `attack_2x.png`/`hit_2x.png`
|
- 已落值(2026-10-28 用户裁):**铲刃浅铁灰 = `FOG_MEMORY_INK #C4C4C4`**;**提灯铜色 = `GOLD_DEEP #B07A14`**——两件均走换色合并、零额度(character-design §5.4 对这两件只有形容词,账见 §5.5 缺口 4)。代价已随裁定接受:`#C4C4C4` 一色两岗(语义岗 = 迷雾记忆墨 §6.5)、`#B07A14` 属金族(§4.2 金只说收益与兑现);两者均为角色随身件材质色,不进信息层与语义物件岗
|
||||||
|
- 破例记账:背包 + 旗 = 主角对 §5.1「对称」的唯一破例组,旗面朝向恒定画右;轮廓凹凸预算按背包 + 旗整组记账
|
||||||
|
- 朝向:战斗画面的侧身面向怪物形象属状态图(§5.4 生成顺序口径);重产沿用现役朝向,不重新裁定
|
||||||
|
|
||||||
**5.4.2 食人魔酋长 ogre_chief(大档 188)**
|
**5.4.2 食人魔酋长 ogre_chief(源 74 / 显示 148)**
|
||||||
|
|
||||||
- 档位 = 大型(三场 Boss 战全归大型);形状仍守精英档剪影——普通怪形 + 恰一处垂直延伸(头顶骨与羽冠),底盘不变
|
- 档位 = 精英档(形状仍守精英档:普通怪形 + 恰一处垂直延伸 = 头顶骨与羽冠,底盘不变;第一关关底 Boss 战,不升 Boss 形)
|
||||||
- 甲档 = 轻甲(皮条/骨饰点缀、裸身为主,零甲板零符纹)——现役稿已如此
|
- 甲档 = 轻甲 → 甲面覆盖率 ≈ 0:皮条 / 骨饰点缀、裸身为主,零甲板零符纹
|
||||||
- 源 = `ogre_chief/pixel-1.png`(158×189);显示宽 157 超桩盒 150 为已接受项
|
- 主色域 = 暖褐皮、圆肚;**暖褐皮 = `暖石 #B8A582`**(2026-10-28 用户裁:换色合并、零额度;体块主色带 §5.4 ④ L 0.22–0.45 校验 L≈0.387 ✓;character-design §5.5 该行原只有形容词)
|
||||||
|
|
||||||
**5.4.3 蛛化卓尔精灵 drider(大档 188)**
|
**5.4.3 蛛化卓尔精灵 drider(源 90 / 显示 180)**
|
||||||
|
|
||||||
- 档位 = 大型;紫赤 `#8F2F6A` 色相独占 + 形状独占双通道维持现役稿
|
- 档位 = Boss(敌类中唯一允许锐角与不对称者,体量最大)
|
||||||
- 甲档 = 魔法护甲(符纹饰带)——现役稿已如此
|
- 甲档 = 魔法护甲 → 符纹饰带(暖白,覆盖率居中);蛛腹几丁质属天然甲壳,不计甲档
|
||||||
- 源 = `drider/pixel-1.png`(140×189);皮色 `#A79CB8` 保留在板、不消费
|
- 独占:紫赤 `#8F2F6A`(色相 323°)+ 形状独占双通道;全项目色相 300°–345° 只许本件与 5.4.4 出现
|
||||||
|
- **卓尔上体浅紫灰皮 = `#A79CB8`**(2026-10-28 用户裁:**新增 1 枚**,入 §4.1 分层①——在册紫族四枚全部语义岗占用且 L <0.22,无一可复用)。体块主色带 L 0.22–0.45 校验 L≈0.355 ✓;色相 264° 避 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`。**对比实测(本节新算,此前未给值)**:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——两处均过 §4.1 图形 ≥3:1 门槛
|
||||||
|
- 大体档:显示 180 > 150 → 允许向上溢出盒顶(§8.2 站桩排版③ 甲案;溢出量 N 由实装批用真图复算 x 区间定,血条仍落底)
|
||||||
|
|
||||||
**5.4.4 灰矮人石君王 duergar_king(大档 188)**
|
**5.4.4 灰矮人石君王 duergar_king(源 94 / 显示 188)**
|
||||||
|
|
||||||
- 档位 = 大型(锐角与不对称);紫赤独占 + 岩石板甲维持现役稿色
|
- 档位 = Boss(锐角与不对称,体量最大档)
|
||||||
- 源 = `duergar_king/pixel-1.png`(133×189)
|
- 甲档 = 重甲 → 金属甲板(冷灰,覆盖率最大)
|
||||||
|
- 独占:紫赤 `#8F2F6A` + 形状独占双通道;大地 / 岩石主题
|
||||||
|
- 岩石板甲与灰皮(2026-10-28 用户裁,character-design §5.5 该行原只有形容词):**岩石板甲 = 重甲甲材质色,与 §5.3.3 同一枚 → 直接引 `#868C9A`,不另计额度**;**灰皮 = `STONE #786E62`**(按**次级皮**口径——石君王重甲覆盖率最大、板甲视同体块主色,故灰皮属次级皮、不受 L 0.22–0.45 约束;换色合并、零额度)
|
||||||
|
- 大体档:显示 188 > 150 → 溢出盒顶同 5.4.3
|
||||||
|
|
||||||
### 5.5 缺口(四条 · 缺口 1/2/4 已裁转指路,缺口 3 结论已立)
|
### 5.5 缺口(四条 · 缺口 1/2/4 于 2026-10-28 已裁转指路,缺口 3 结论已立)
|
||||||
|
|
||||||
> **核销口径(依 art-bible 现行条款)**:四条逐条先过「§4.1 在册既有色能否换色合并」——不过门即换色合并、禁加色绕行(§4.1 色板增量纪律)。**48 色余量 0(额度已用尽)**;本节给的是「哪几枚必须新增 / 哪几枚可合并 / 合并后余量 / 全新增要压缩哪几枚」的账,**不替作者拍板**(§4.1:额度不足时呈报作者,由作者决定压缩或合并既有色)。本节所举候选色值,**缺口 1 / 2 / 4 已落定(见各条「已裁」注,本节只留裁定依据并指路 §5.3 / §5.4)**;其余仍为候选,落定须过 §4.1 两道门(①§4.2 语义检查;②与既有任一色 RGB 三通道差禁止全部 <8/255——宽松口径)。
|
> **核销口径(依 art-bible v3.22 现行条款)**:四条逐条先过「§4.1 在册既有色能否换色合并」——不过门即换色合并、禁加色绕行(§4.1 色板增量纪律)。**48 色余量:裁定前 2 → 2026-10-28 裁定后 0(额度已用尽)**;本节给的是「哪几枚必须新增 / 哪几枚可合并 / 合并后余量 / 全新增要压缩哪几枚」的账,**不替作者拍板**(§4.1:额度不足时呈报作者,由作者决定压缩或合并既有色)。本节所举候选色值,**缺口 1 / 2 / 4 已随 2026-10-28 用户裁落定(见各条「已裁」注,本节只留裁定依据账并指路 §5.3 / §5.4)**;其余仍为候选,落定须过 §4.1 两道门(①§4.2 语义检查;②与既有任一色 RGB 三通道差不得全部 <8/255——宽松口径)。
|
||||||
|
|
||||||
1. **重甲冷灰金属材质色——已裁 = `#868C9A`**,本节转指路(出形与上色均不再阻塞;**与 5.4.4 石君王岩石板甲同一枚**——character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,两处只占一枚额度)。character-design §5.3 只写「冷灰金属材质色」;**落法见 §5.3.3(本组载值)与 §5.4.4(直接引 §5.3.3 同一枚、不另计额度),色值账见 art-bible §4.1 本枚条目**。
|
1. **重甲冷灰金属材质色——已裁(2026-10-28)= `#868C9A`**,本节转指路(原「阻塞 5.3.3 上色」状态解除——出形与上色均不再阻塞;**与 5.4.4 石君王岩石板甲同一枚**——character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,两处只占一枚额度)。character-design §5.3 只写「冷灰金属材质色」;**落法见 §5.3.3(本组载值)与 §5.4.4(直接引 §5.3.3 同一枚、不另计额度),色值账见 art-bible §4.1 本枚条目**。
|
||||||
- **换色合并逐枚核查——在册冷/中性灰全部不合格,无复用者**:`#3E4048` L≈0.052 / `#3F4147` L≈0.053(两者正在 §4.1 六对欠账清单内,清偿后只留一枚)/ `#3A3A3A` L≈0.042——三枚均越世界中层下沿 0.22;`#C4C4C4` L≈0.552 越上沿 0.45,且语义岗 = 迷雾记忆墨(§6.5);`#8A9AB0` L≈0.317 本落在带内,但色相 ≈215° 属蓝族,§5.4 语义约束 + §5.5「蓝族禁入敌方主色」拦;`#5A6C8C` 暮蓝为失败独占(§4.2);`#808080` L≈0.216 越下沿 0.004,且是引擎默认灰(§7.6 点名须接管,不宜作角色材质色)。
|
- **换色合并逐枚核查——在册冷/中性灰全部不合格,无复用者**:`#3E4048` L≈0.052 / `#3F4147` L≈0.053(两者正在 §4.1 六对欠账清单内,清偿后只留一枚)/ `#3A3A3A` L≈0.042——三枚均越世界中层下沿 0.22;`#C4C4C4` L≈0.552 越上沿 0.45,且语义岗 = 迷雾记忆墨(§6.5);`#8A9AB0` L≈0.317 本落在带内,但色相 ≈215° 属蓝族,§5.4 语义约束 + §5.5「蓝族禁入敌方主色」拦;`#5A6C8C` 暮蓝为失败独占(§4.2);`#808080` L≈0.216 越下沿 0.004,且是引擎默认灰(§7.6 点名须接管,不宜作角色材质色)。
|
||||||
- **归属板**:进 §4.1 **分层① 语义/UI token 板,占 48 额度**。理由:甲材质色 = 材质色、跨屏恒定,不属分层② 环境色(环境色随场景走);5.3 与 5.4 两组工单第 ③ 字段均已登记为分层①。
|
- **归属板**:进 §4.1 **分层① 语义/UI token 板,占 48 额度**。理由:甲材质色 = 材质色、跨屏恒定,不属分层② 环境色(环境色随场景走);5.3 与 5.4 两组工单第 ③ 字段均已登记为分层①。
|
||||||
- **裁定值**:`#868C9A`(L≈0.261 / H≈222° / S≈0.13)。第二道门按宽松口径与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(不占红/金/蓝/紫赤/绿语义段,222° 不在 300°–345° 禁入带)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1、对浅素底 `#F5EAD3` 2.82:1(浅档已落选,不受该读数的门限约束)。
|
- **裁定值(2026-10-28 用户裁,原候选值即本值,落定后转定稿)**:`#868C9A`(L≈0.261 / H≈222° / S≈0.13)。第二道门按宽松口径与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(不占红/金/蓝/紫赤/绿语义段,222° 不在 300°–345° 禁入带)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1、对浅素底 `#F5EAD3` 2.82:1(浅档已落选,不受该读数的门限约束)。
|
||||||
- **风险(已随裁定接受)**:本值与地台板身 `#968264`(L≈0.234)灰度差仅 0.028、对比 1.10:1。立绘与地台的可辨归 §5.1 轮廓通道(亮描边 + 落影)与冷/暖材质对比承载,不靠明度差——§5.3 明写「冷灰与全作暖底成材质对比」;§2 只在世界底层内部立了「同层内两底难辨」的子带纪律(该条立法理由明写为解决底层内部问题),世界中层无同款要求。
|
- **风险(已随 2026-10-28 裁定接受)**:本值与地台板身 `#968264`(L≈0.234)灰度差仅 0.028、对比 1.10:1。立绘与地台的可辨归 §5.1 轮廓通道(亮描边 + 落影)与冷/暖材质对比承载,不靠明度差——§5.3 明写「冷灰与全作暖底成材质对比」;§2 只在世界底层内部立了「同层内两底难辨」的子带纪律(该条立法理由明写为解决底层内部问题),世界中层无同款要求。
|
||||||
- ←机检: 本值入板后全板色对中三通道差全部 <8/255 的对数 = 0
|
- ←机检: 本值入板后全板色对中三通道差全部 <8/255 的对数 = 0
|
||||||
|
|
||||||
2. **站桩名字行的落法 + 素底明暗档——已裁 = 垫素底、素底取深档 `#282220`**,本节转指路。
|
2. **站桩名字行的落法 + 素底明暗档——已裁(2026-10-28)= 垫素底、素底取深档 `#282220`**,本节转指路(原记为「轻甲木色在深底上不过 3:1」;核出落法是它的前置,故先落这一条)。
|
||||||
- **推导核实 = 成立,且是既有条款的落法、非新条款**:站桩名字行是文字,§7.2「一切文字(含菜单/说明/tooltip/按钮/底栏,**无区域例外**)」+「文字禁直接压纹理底——垫容器或罩层」两条覆盖它;§6.1 舞台正面目标条已就站桩文字位显式落法——「站桩文字位改垫素底或落进结算明细带」并明写「**非新条款**」,§7.2 亦有「站桩石板地台面同理」句,两处机检断言同文。舞台背景插画(`scene_stage_bg_<board_type>` 三关变体;battle-stage-prompts §2.1)属纹理底 → 落法门触发。站桩名字行落法 = **垫素底**(§5.3 共用验收条 + 5.3.1 / 5.3.3 对比判据)。
|
- **推导核实 = 成立,且是既有条款的落法、非新条款**:站桩名字行是文字,§7.2「一切文字(含菜单/说明/tooltip/按钮/底栏,**无区域例外**)」+「文字禁直接压纹理底——垫容器或罩层」两条覆盖它;§6.1 舞台正面目标条(2026-10-28 v3.22 定值)已就站桩文字位显式落法——「站桩文字位改垫素底或落进结算明细带」并明写「**非新条款**」,§7.2 同批加「站桩石板地台面同理」句,两处机检断言同文。舞台背景插画(`scene_stage_bg_<board_type>` 三关变体;battle-stage-prompts §2.1)属纹理底 → 落法门触发。**已回填**:站桩名字行落法 = **垫素底**(§5.3 共用验收条 + 5.3.1 / 5.3.3 对比判据)。
|
||||||
- **素底明暗档两档对照**:§4.1 只在册浅档 `#F5EAD3`(数字色牌,圣经唯一素色牌值),§7.4 血数垫牌在用的深档 `HP_BAR_BACK #282220` 亦在册。两档后果**相反**(下表留作裁定依据账):
|
- **原冲突 = 素底明暗档圣经未定死(2026-10-28 已由作者裁,本节不替裁的冲突至此闭合)**:§4.1 只在册浅档 `#F5EAD3`(数字色牌,圣经唯一素色牌值),§7.4 血数垫牌在用的深档 `HP_BAR_BACK #282220` 亦在册。两档后果**相反**(下表留作裁定依据账):
|
||||||
|
|
||||||
| 受影响的位 | 浅档 `#F5EAD3` | 深档 `#282220` |
|
| 受影响的位 | 浅档 `#F5EAD3` | 深档 `#282220` |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -458,9 +466,9 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
| 5.3.1 轻甲木色 `#8A5A34` | 4.87:1 ✓ 不动 | 2.72:1 ✗ → 须换色合并(`WARM_FAINT #CDB88C` 8.08:1,零额度)或新增木色亮档(`#C49A5E` 6.07:1,占 1 枚) |
|
| 5.3.1 轻甲木色 `#8A5A34` | 4.87:1 ✓ 不动 | 2.72:1 ✗ → 须换色合并(`WARM_FAINT #CDB88C` 8.08:1,零额度)或新增木色亮档(`#C49A5E` 6.07:1,占 1 枚) |
|
||||||
| 5.3.3 重甲冷灰 | 须 L ≤0.245,与 5.4 立绘体块主色带求交 → 窗 **[0.220, 0.245]**(候选 `#7E8492` L≈0.230,3.14:1) | 须 L ≥0.151 → 窗 **[0.220, 0.450]**(候选 `#868C9A` L≈0.261,4.65:1) |
|
| 5.3.3 重甲冷灰 | 须 L ≤0.245,与 5.4 立绘体块主色带求交 → 窗 **[0.220, 0.245]**(候选 `#7E8492` L≈0.230,3.14:1) | 须 L ≥0.151 → 窗 **[0.220, 0.450]**(候选 `#868C9A` L≈0.261,4.65:1) |
|
||||||
|
|
||||||
- **裁定结论(取深档一列)**:① 站桩名字行墨(暖白 `#F0E2C8`)**不动**(12.26:1);② 5.3.2 魔法护甲暖白 `#F0E2C8` **不动**(12.26:1);③ 5.3.1 轻甲木色 → **接受换色合并 `WARM_FAINT #CDB88C`(8.08:1,零额度)**,不取新增木色亮档 `#C49A5E` 路线(须 +1 额度而余量为 0);④ 5.3.3 重甲冷灰 → 按深档窗 **[0.220, 0.450]** 落 **`#868C9A`**(4.65:1)。**素底值恒定 = `HP_BAR_BACK #282220`**(§7.4 血数垫牌同款,零新增)
|
- **裁定结论(2026-10-28 用户裁,取深档一列)**:① 站桩名字行墨(暖白 `#F0E2C8`)**不动**(12.26:1);② 5.3.2 魔法护甲暖白 `#F0E2C8` **不动**(12.26:1);③ 5.3.1 轻甲木色 → **接受换色合并 `WARM_FAINT #CDB88C`(8.08:1,零额度)**,不取新增木色亮档 `#C49A5E` 路线(须 +1 额度而余量为 0);④ 5.3.3 重甲冷灰 → 按深档窗 **[0.220, 0.450]** 落 **`#868C9A`**(4.65:1)。**素底值恒定 = `HP_BAR_BACK #282220`**(§7.4 血数垫牌同款,零新增)
|
||||||
|
|
||||||
- **推荐 = 深档 `#282220`**(四条理据)——**裁定落深档**:① 与 §7.4 血数垫牌同款、既有素底,零新增;② 与 §4.1 在役亮档 token 同向——顺位徽标 `GOLD_BRIGHT` 对舞台底 6.47:1、魔法护甲徽标 `HERO_BLUE_BRIGHT` 5.88:1,现行徽标体系整体按暗底设计;③ 与 §7.4 实测记录「暖白对舞台底 9.49:1 达标」不冲突,深档更暗则暖白更稳;④ 只动 5.3.1 一枚,名字行墨与 5.3.2 全部不动。**代价**:5.3.1 须换色(换色合并不需要额度,新增木色亮档要 1 枚)。**浅档的代价**:名字行墨与 5.3.2 两处换墨(零额度),但 5.3.3 被挤进 0.025 宽的窄窗,且与石君王灰皮(若亦须落 0.22–0.45)撞窗。
|
- **推荐 = 深档 `#282220`**(四条理据)——**2026-10-28 用户采纳本推荐,裁定落深档**:① 与 §7.4 血数垫牌同款、既有素底,零新增;② 与 §4.1 在役亮档 token 同向——顺位徽标 `GOLD_BRIGHT` 对舞台底 6.47:1、魔法护甲徽标 `HERO_BLUE_BRIGHT` 5.88:1,现行徽标体系整体按暗底设计;③ 与 §7.4 v3.22 实测记录「暖白对舞台底 9.49:1 达标」不冲突,深档更暗则暖白更稳;④ 只动 5.3.1 一枚,名字行墨与 5.3.2 全部不动。**代价**:5.3.1 须换色(换色合并不需要额度,新增木色亮档要 1 枚)。**浅档的代价**:名字行墨与 5.3.2 两处换墨(零额度),但 5.3.3 被挤进 0.025 宽的窄窗,且与石君王灰皮(若亦须落 0.22–0.45)撞窗。
|
||||||
- ←机检: B 区站桩名字行与护甲图标正下方像素非地台板身色 `#968264`(§6.1 / §7.2 同文断言)
|
- ←机检: B 区站桩名字行与护甲图标正下方像素非地台板身色 `#968264`(§6.1 / §7.2 同文断言)
|
||||||
- ←目检: 名字行与三枚甲档图标同排挂载后,素底边缘与舞台底、地台轮廓不打架,不构成第二焦点(§3.4)
|
- ←目检: 名字行与三枚甲档图标同排挂载后,素底边缘与舞台底、地台轮廓不打架,不构成第二焦点(§3.4)
|
||||||
|
|
||||||
@@ -471,22 +479,22 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
|
|||||||
- 理由四:硬定上界会误伤在册高亮档——`#F5EAD3` 色牌 L≈0.83、纯白 L=1.0 都在信息面层内,上界定死(如 0.90)会把它们拦在层外。
|
- 理由四:硬定上界会误伤在册高亮档——`#F5EAD3` 色牌 L≈0.83、纯白 L=1.0 都在信息面层内,上界定死(如 0.90)会把它们拦在层外。
|
||||||
- **机检断言写得出来(证明不定值也能执法)**:←机检: 屏内信息面层取样点 L > 同屏世界中层取样点 L > 同屏世界底层取样点 L(§1.4②项同口径);←机检: 信息面层成员对其直接背景,文字位 ≥4.5:1、图形位 ≥3:1(§7.2 / §4.1)
|
- **机检断言写得出来(证明不定值也能执法)**:←机检: 屏内信息面层取样点 L > 同屏世界中层取样点 L > 同屏世界底层取样点 L(§1.4②项同口径);←机检: 信息面层成员对其直接背景,文字位 ≥4.5:1、图形位 ≥3:1(§7.2 / §4.1)
|
||||||
|
|
||||||
4. **五处角色部件色值——已落值**(手绘口径下必须落值,现已落)。**逐件取值见 §5.4.1(铲刃 / 提灯)、5.4.2(食人魔皮)、5.4.3(卓尔皮)、5.4.4(石君王灰皮)**;下表留作裁定依据账,色值已逐件落定(见上),不再以「待裁」表述:
|
4. **五处角色部件色值——2026-10-28 用户裁已落值**(不阻塞开工;手绘口径下必须落值,现已落)。**逐件取值见 §5.4.1(铲刃 / 提灯)、5.4.2(食人魔皮)、5.4.3(卓尔皮)、5.4.4(石君王灰皮)**;下表留作裁定依据账,色值已逐件落定(见上),不再以「待裁」表述:
|
||||||
|
|
||||||
| 部件 | §5.4 ④ 明度带归属 | 换色合并候选(在册,零额度)**——裁定采纳** | 合并代价 / 淘汰理由 | 新增候选(**未取**,裁定走合并路线) | 第二道门 |
|
| 部件 | §5.4 ④ 明度带归属 | 换色合并候选(在册,零额度)**——2026-10-28 裁定采纳** | 合并代价 / 淘汰理由 | 新增候选(**未取**,裁定走合并路线) | 第二道门 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| 主角铲刃浅铁灰 | 手持件,不属「体块主色」判定面 | `FOG_MEMORY_INK #C4C4C4`(L≈0.552,中性灰 S=0) | 一色两岗(语义岗 = 迷雾记忆墨 §6.5,与 §4.1「常量本尊不动」先例相左);若后续纳入明度带判定则越上沿 0.45 | `#A8AEB8`(L≈0.421 / H≈218° / S≈0.09) | 过门(无三通道全 <8 的对);非语义段 |
|
| 主角铲刃浅铁灰 | 手持件,不属「体块主色」判定面 | `FOG_MEMORY_INK #C4C4C4`(L≈0.552,中性灰 S=0) | 一色两岗(语义岗 = 迷雾记忆墨 §6.5,与 §4.1「常量本尊不动」先例相左);若后续纳入明度带判定则越上沿 0.45 | `#A8AEB8`(L≈0.421 / H≈218° / S≈0.09) | 过门(无三通道全 <8 的对);非语义段 |
|
||||||
| 主角提灯铜色 | 同上 | `GOLD_DEEP #B07A14`(L≈0.232 / H≈39°,落世界中层) | 金族语义岗(§4.2 金只说收益与兑现、禁作日常强调防通胀);与皮革木色 `#8A5A34`(L≈0.130)明度差 0.10,可辨 | `#C08A3A`(L≈0.297 / H≈36°) | 过门 |
|
| 主角提灯铜色 | 同上 | `GOLD_DEEP #B07A14`(L≈0.232 / H≈39°,落世界中层) | 金族语义岗(§4.2 金只说收益与兑现、禁作日常强调防通胀);与皮革木色 `#8A5A34`(L≈0.130)明度差 0.10,可辨 | `#C08A3A`(L≈0.297 / H≈36°) | 过门 |
|
||||||
| 食人魔酋长暖褐皮 | **体块主色 → 须落 L 0.22–0.45** | `暖石 #B8A582`(L≈0.387 / H≈39°,在册于 theme README 溯源表) | 一色两岗(该值现为滑轨槽字面量);已排除 `#968264`(地台承载面 §6.1)、`#B39A78`/`#C9AF83`(格底语义,§5.1 剪影禁借格底成立)、`#8A5A34`(L 0.130 越下沿) | `#B08050`(L≈0.253)/ `#A97C4E`(L≈0.234) | 过门 |
|
| 食人魔酋长暖褐皮 | **体块主色 → 须落 L 0.22–0.45** | `暖石 #B8A582`(L≈0.387 / H≈39°,在册于 theme README 溯源表) | 一色两岗(该值现为滑轨槽字面量);已排除 `#968264`(地台承载面 §6.1)、`#B39A78`/`#C9AF83`(格底语义,§5.1 剪影禁借格底成立)、`#8A5A34`(L 0.130 越下沿) | `#B08050`(L≈0.253)/ `#A97C4E`(L≈0.234) | 过门 |
|
||||||
| 卓尔精灵浅紫灰皮 | **体块主色 → 须落 L 0.22–0.45** | **无可复用**:在册紫族四枚全部语义岗占用且 L <0.22——`#7C3AA8` 封印紫(退役)、`#7A4294` 妨害紫(§4.6.1 语义)、`#8A72C4` / `#7B5BD6` 类型微光族(§4.2 分域纪律:微光色相禁迁移复用为物件/阵营/UI 语义色) | — | `#A79CB8`(L≈0.355 / H≈264° / S≈0.15;避 300°–345°,紫赤独占仍归 `#8F2F6A`) | 过门 |
|
| 卓尔精灵浅紫灰皮 | **体块主色 → 须落 L 0.22–0.45** | **无可复用**:在册紫族四枚全部语义岗占用且 L <0.22——`#7C3AA8` 封印紫(退役)、`#7A4294` 妨害紫(§4.6.1 语义)、`#8A72C4` / `#7B5BD6` 类型微光族(§4.2 分域纪律:微光色相禁迁移复用为物件/阵营/UI 语义色) | — | `#A79CB8`(L≈0.355 / H≈264° / S≈0.15;避 300°–345°,紫赤独占仍归 `#8F2F6A`) | 过门 |
|
||||||
| 石君王岩石板甲 | 与缺口 1 同一枚,**不另计额度** | 见缺口 1 | 见缺口 1 | 见缺口 1 | 见缺口 1 |
|
| 石君王岩石板甲 | 与缺口 1 同一枚,**不另计额度** | 见缺口 1 | 见缺口 1 | 见缺口 1 | 见缺口 1 |
|
||||||
| 石君王灰皮 | **口径已裁 = 次级皮**:石君王重甲覆盖率最大(§5.3),板甲视同体块主色 → 灰皮属次级皮、不受 0.22–0.45 约束 | 不受约束口径下可合 `STONE #786E62`(L≈0.160 / S≈0.18 近中性暖灰) | 若按体块主色口径则 L 越下沿 0.06,不可合 | `#9A968C`(L≈0.306)/ `#949089`(L≈0.281 / S≈0.07) | 过门;两候选与地台 `#968264` 灰度差 ≥0.047 |
|
| 石君王灰皮 | **口径已裁(2026-10-28)= 次级皮**:石君王重甲覆盖率最大(§5.3),板甲视同体块主色 → 灰皮属次级皮、不受 0.22–0.45 约束 | 不受约束口径下可合 `STONE #786E62`(L≈0.160 / S≈0.18 近中性暖灰) | 若按体块主色口径则 L 越下沿 0.06,不可合 | `#9A968C`(L≈0.306)/ `#949089`(L≈0.281 / S≈0.07) | 过门;两候选与地台 `#968264` 灰度差 ≥0.047 |
|
||||||
|
|
||||||
**额度账(48 余量 0,额度已用尽)**
|
**额度账(48 余量:裁定前 2 → 2026-10-28 裁定后 0,额度已用尽)**
|
||||||
- **必须新增 = 2 枚(已裁落定)**:① 重甲冷灰金属材质色(缺口 1,在册冷灰全部不合格)= **`#868C9A`**;② 卓尔浅紫灰皮(在册紫族全占岗且过暗)= **`#A79CB8`**。余量 **0**,额度用尽;后续新增须先压缩或合并既有色(压缩哪几枚由作者裁)。
|
- **必须新增 = 2 枚(已裁落定)**:① 重甲冷灰金属材质色(缺口 1,在册冷灰全部不合格)= **`#868C9A`**;② 卓尔浅紫灰皮(在册紫族全占岗且过暗)= **`#A79CB8`**。→ 余量 2 → **0**,额度用尽;后续新增须先压缩或合并既有色(压缩哪几枚由作者裁)。
|
||||||
- **可合并 = 5 处,零额度(已裁接受)**:铲刃 → `FOG_MEMORY_INK #C4C4C4`;提灯 → `GOLD_DEEP #B07A14`;食人魔皮 → `暖石 #B8A582`;石君王灰皮 → `STONE #786E62`(按**次级皮**口径);轻甲木色 → `WARM_FAINT #CDB88C`。
|
- **可合并 = 5 处,零额度(已裁接受)**:铲刃 → `FOG_MEMORY_INK #C4C4C4`;提灯 → `GOLD_DEEP #B07A14`;食人魔皮 → `暖石 #B8A582`;石君王灰皮 → `STONE #786E62`(按**次级皮**口径);轻甲木色 → `WARM_FAINT #CDB88C`。
|
||||||
- **浮动一枚 = 5.3.1 轻甲木色(已裁)**:深档素底下**接受换色合并 `WARM_FAINT #CDB88C`**,零额度,余量不击穿;新增木色亮档 `#C49A5E` 路线未取。
|
- **浮动一枚 = 5.3.1 轻甲木色(已裁)**:深档素底下**接受换色合并 `WARM_FAINT #CDB88C`**,零额度,余量不击穿;新增木色亮档 `#C49A5E` 路线未取。
|
||||||
- (「若作者选全部新增(7 枚)」假设,留作依据账):击穿 5 枚。压缩只能从既有色里腾——优先合「宽松口径下仍未清偿的在册近色对」,每合一对腾 1 枚。机检扫到的**活值**近色对(须先剔除退役值与场景环境子板成员再计数;本清单未逐枚核语义岗,合哪几对由作者裁):`GOLD_BRIGHT #E0B860 ↔ GOLD_LIT #E6BE5A`(差 6/6/6);`WARM #F0E2C8 ↔ MAP_BAR_PLATE #F0E4C8`(差 0/2/0);`RAP_DOT_CORE_WARM #F8E2A8 ↔ INK_L_GOLD #F8E3A8`(差 0/1/0);`DIGIT_PLATE #F5EAD3 ↔ CAMP_ROW_PLATE #F0E6CE`(差 5/4/5)。**注:这四对均不在 §4.1 已列六对欠账清单内**,属该清单未扫到的部分——按 §4.1 现有断言「全板色对中三通道差全部 <8/255 的对数 = 0」,它们同样在清偿范围内;是否一并清偿由作者裁。
|
- (原「若作者选全部新增(7 枚)」一支,留作依据账):击穿 5 枚。压缩只能从既有色里腾——优先合「宽松口径下仍未清偿的在册近色对」,每合一对腾 1 枚。机检扫到的**活值**近色对(须先剔除退役值与场景环境子板成员再计数;本清单未逐枚核语义岗,合哪几对由作者裁):`GOLD_BRIGHT #E0B860 ↔ GOLD_LIT #E6BE5A`(差 6/6/6);`WARM #F0E2C8 ↔ MAP_BAR_PLATE #F0E4C8`(差 0/2/0);`RAP_DOT_CORE_WARM #F8E2A8 ↔ INK_L_GOLD #F8E3A8`(差 0/1/0);`DIGIT_PLATE #F5EAD3 ↔ CAMP_ROW_PLATE #F0E6CE`(差 5/4/5)。**注:这四对均不在 §4.1 已列六对欠账清单内**,属该清单未扫到的部分——按 §4.1 现有断言「全板色对中三通道差全部 <8/255 的对数 = 0」,它们同样在清偿范围内;是否随本批一并清偿由作者裁。
|
||||||
- **本节不替作者决定压缩或合并哪几枚既有色**。
|
- **本节不替作者决定压缩或合并哪几枚既有色**。
|
||||||
- ←机检: 本节候选值落定后,全板色对中三通道差全部 <8/255 的对数 = 0,且板内色数 ≤48
|
- ←机检: 本节候选值落定后,全板色对中三通道差全部 <8/255 的对数 = 0,且板内色数 ≤48
|
||||||
- ←目检: 五处部件色上稿后,灰度下铲 / 提灯 / 皮 / 甲互相可辨,不靠色相单独承载(§5.1 轮廓通道;§4.5 色弱清单)
|
- ←目检: 五处部件色上稿后,灰度下铲 / 提灯 / 皮 / 甲互相可辨,不靠色相单独承载(§5.1 轮廓通道;§4.5 色弱清单)
|
||||||
|
|||||||
@@ -10,15 +10,15 @@
|
|||||||
|
|
||||||
| 素材 | 状态 | 需求文档 |
|
| 素材 | 状态 | 需求文档 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 格子样张 | ✅ 样张 v3 冻结(机检 17/17 全绿;产物原件已丢失、未入 git) | [art-bible](art-bible.md) §1.4 |
|
| 格子样张 | ✅ 样张 v3 冻结(2026-09-30 机检 17/17 全绿,art-bible §1.4 v3.2 记录;v2/v3 两次冻结通过;产物原件已丢失、未入 git) | [art-bible](art-bible.md) §1.4 |
|
||||||
| 战斗一屏样张 | ⬜ | [战斗表现](../gdd/systems/战斗循环/战斗表现.md)(一屏样张验收标准)+ [art-bible](art-bible.md) §5.1 |
|
| 战斗一屏样张 | ⬜ | [战斗表现](../gdd/systems/战斗循环/战斗表现.md)(一屏样张验收标准)+ [art-bible](art-bible.md) §5.1 |
|
||||||
|
|
||||||
## P1 角色级(样张通过后开工)
|
## P1 角色级(样张通过后开工)
|
||||||
|
|
||||||
| 素材 | 状态 | 需求文档 |
|
| 素材 | 状态 | 需求文档 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 主角战斗小人(待机/攻击/受击三态) | ✅ 已交付:B 区站桩三态按原稿分辨率入包、显示按档缩放落位(显示档=中档,源=手修 2× 三态稿,art-bible §8.2),机检全绿;挂事件切换、结算回 idle 短驻自回;棋盘 1.5×/脚锚25%/椭圆影在役 | [character-design](character-design.md) + [art-prompts](art-prompts.md) §2 |
|
| 主角战斗小人(待机/攻击/受击三态) | ✅ B区站桩三态全接(2026-09-29 迭代 6 T3:normal/attack/hit 48px 档入包+挂事件切换+结算回 idle,短驻自回;棋盘 1.5×/脚锚25%/椭圆影在役不变;hit 态源=new-hit.pxo 已程序导出) | [character-design](character-design.md) + [art-prompts](art-prompts.md) §2 |
|
||||||
| 八敌种形象(L2 熊地精=bugbear 复用,不单列) | ✅ 已交付:B 区站桩八敌真图服役——八件源=原稿不降采样入包、显示按档缩放落位(三档绝对高,art-bible §8.2),闸件全绿;character_enemy_<键>.png 按常量入位,字形回退退役为缺位兜底;素材不入 git 本地在盘 | [art-bible](art-bible.md) §5 + [art-prompts](art-prompts.md) §3 |
|
| 八敌种形象(L2 熊地精=bugbear 复用,不单列) | ✅ B区站桩八敌真图服役(2026-09-29 迭代 6 T1/T2:pixel-1 源→48px 档统一比例/底中锚/众数投票降采样,character_enemy_<键>.png 按常量入位,字形回退退役为缺位兜底;素材不入 git 本地在盘)。八敌源档已定(36–94,art-bible §8.2),旧统一 48 档为过渡形态,新档重产落位归 PRD(tools/pixelize_candidates.py `STANDEE_TIER_H` 已改,产出与定档总图一致) | [art-bible](art-bible.md) §5 + [art-prompts](art-prompts.md) §3 |
|
||||||
| 意图准备动画三档 | ◐ | [art-bible](art-bible.md) §4.6.4 |
|
| 意图准备动画三档 | ◐ | [art-bible](art-bible.md) §4.6.4 |
|
||||||
|
|
||||||
## P2 图标与格面(可与样张并行)
|
## P2 图标与格面(可与样张并行)
|
||||||
@@ -27,10 +27,10 @@
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 格面资源徽章 19 枚 | ◐ | [art-bible](art-bible.md) §4.6 |
|
| 格面资源徽章 19 枚 | ◐ | [art-bible](art-bible.md) §4.6 |
|
||||||
| 关卡节点图图标组 | ◐ | [art-assets-checklist](art-assets-checklist.md) §3.2(正式 UI 设计未成文) |
|
| 关卡节点图图标组 | ◐ | [art-assets-checklist](art-assets-checklist.md) §3.2(正式 UI 设计未成文) |
|
||||||
| 雷/封印印记/数字砖面全套 | ◐ 封印印记已换代(环+十字法阵,参数化绘制);雷与数字砖面仍待格子样张前置 | [art-bible](art-bible.md) §1.4/§3.2 |
|
| 雷/封印印记/数字砖面全套 | ◐ | [art-bible](art-bible.md) §1.4/§3.2(前置:格子样张) |
|
||||||
| 增益状态效果图标 9 枚 | ✅ 已接入 | [art-bible](art-bible.md) §4.6.1(候选原稿归 candidates 档——路径描述性引用,归档纪律见 art-bible §8.3) |
|
| 增益状态效果图标 9 枚 | ✅ 已接入(2026-09-24) | [art-bible](art-bible.md) §4.6.1(候选原稿:状态图标批 2026-09-23 远程出图,归 candidates 档——路径描述性引用,归档纪律见 art-bible §8.3) |
|
||||||
| 营地场景图 | ✅ 已交付:十层在包;背景层 2026-11-07 换代录入(远景 v5+地面 v3 过审、拼接量化 32 色落 `scene_camp_bg.png`);坐标接线归下游实现批(`camp_scene_layout.tres` 仍旧值) | [art-bible](art-bible.md) §6.2 |
|
| 营地场景图 | ◐ | [art-bible](art-bible.md) §6.2 |
|
||||||
| 字体(全局 UI 像素字,Fusion Pixel 单套单字重) | ✅ 已定稿在役(用户裁现状即终稿——不另接拉丁专件、不上第二字重) | [art-bible](art-bible.md) §7.4 |
|
| 字体(全局 UI 像素字,Fusion Pixel 单套单字重) | ✅ 已定稿在役(2026-09-27 接入;2026-10-24 用户裁现状即终稿——不另接拉丁专件、不上第二字重) | [art-bible](art-bible.md) §7.4 |
|
||||||
|
|
||||||
## P3 演出类(样张后排期)
|
## P3 演出类(样张后排期)
|
||||||
|
|
||||||
@@ -38,9 +38,9 @@
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 受击反馈 / 死亡表现 / 顺位标记 | ◐ 程序化演出在役(受击闪白+打击火花、灰化+碎裂退场〔禁瞬消〕、顺位徽标 ①②③ 程序绘制;帧级素材未产,§8.4 帧数规格候选) | [战斗表现](../gdd/systems/战斗循环/战斗表现.md) |
|
| 受击反馈 / 死亡表现 / 顺位标记 | ◐ 程序化演出在役(受击闪白+打击火花、灰化+碎裂退场〔禁瞬消〕、顺位徽标 ①②③ 程序绘制;帧级素材未产,§8.4 帧数规格候选) | [战斗表现](../gdd/systems/战斗循环/战斗表现.md) |
|
||||||
| 连锁坍塌显形演出 | ⬜ | [art-assets-checklist](art-assets-checklist.md) §4 |
|
| 连锁坍塌显形演出 | ⬜ | [art-assets-checklist](art-assets-checklist.md) §4 |
|
||||||
| 封印特效(动作=封印,两件:施印特效+印记常显) | ◐ 印记常显已落位(着色器绘制);施印瞬间特效缺 | [art-bible](art-bible.md) §3.2 + [art-assets-checklist](art-assets-checklist.md) §4 |
|
| 封印特效(动作=封印,两件:施印特效+印记常显) | ⬜ | [art-bible](art-bible.md) §3.2 + [art-assets-checklist](art-assets-checklist.md) §4 |
|
||||||
| 弹道 / 退场等动画密度 | ◐ 程序化弹道在役(play_projectile 0.16s+0.19s 到达拍调度;密度终稿归战斗表现) | [art-assets-checklist](art-assets-checklist.md) §4(战斗表现输入清单) |
|
| 弹道 / 退场等动画密度 | ◐ 程序化弹道在役(play_projectile 0.16s+0.19s 到达拍调度;密度终稿归战斗表现) | [art-assets-checklist](art-assets-checklist.md) §4(战斗表现输入清单) |
|
||||||
| B 区舞台背景三关变体+共用连续地面层(场景件) | ✅ 已交付(入包 `game/assets/art/scene/`:三张背景 1280×252、共用地面 1280×100;地面按作者裁保留候选 v12b 原亮度 L≈0.132) | [art-bible](art-bible.md) §6.1 · [battle-stage-prompts](battle-stage-prompts.md) §2 |
|
| B 区舞台背景三关变体+共用连续地面层(场景件) | ✅ 已交付(2026-10-31 入包 `game/assets/art/scene/`:三张背景 1280×252、共用地面 1280×100;地面按作者裁保留候选 v12b 原亮度 L≈0.132) | [art-bible](art-bible.md) §6.1 · [battle-stage-prompts](battle-stage-prompts.md) §2 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -27,8 +27,8 @@
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 |
|
| `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 |
|
||||||
| `fx/` | 特效帧 | shovel_swing_f0/f1/f2(挥铲三帧,握把锚 (18,12)) |
|
| `fx/` | 特效帧 | shovel_swing_f0/f1/f2(挥铲三帧,握把锚 (18,12)) |
|
||||||
| `scene/` | **场景图**(背景层 + 地面层 + 围墙层 + 可点物件层;营地场景图首批) | 营地 10 张:`scene_camp_bg`(背景层,不透明全幅=天空+远山+地面+门洞小路)+ `scene_camp_wall`(围墙层,透明底、门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件,不可点)+ `scene_stage_bg_dungeon` / `scene_stage_bg_underdark` / `scene_stage_bg_deep_underdark`(B 区战斗舞台背景层三关变体,✦ 插画级,顶部空区+远景天然洞壁,不画近景地面,按 board_type 选图)+ `scene_stage_ground`(B 区连续近景地面层,✦ 插画级,泥土/砂砾/碎石+顶缘分隔带,跨关恒定)+ `scene_stage_plaza`(B 区角色脚下小石台,48×12 九宫格件)——B 区战斗舞台背景与连续地面已入包;营地 10 张已入包(`scene_camp_*` 十件在役、`TEX_CAMP_*` 十键消费;用户游戏内终审如有置换,按本行键名同径替换) |
|
| `scene/` | **场景图**(背景层 + 地面层 + 围墙层 + 可点物件层;营地场景图首批) | 营地 10 张:`scene_camp_bg`(背景层,不透明全幅=天空+远山+地面+门洞小路)+ `scene_camp_wall`(围墙层,透明底、门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件,不可点)+ `scene_stage_bg_dungeon` / `scene_stage_bg_underdark` / `scene_stage_bg_deep_underdark`(B 区战斗舞台背景层三关变体,✦ 插画级,顶部空区+远景天然洞壁,不画近景地面,按 board_type 选图)+ `scene_stage_ground`(B 区连续近景地面层,✦ 插画级,泥土/砂砾/碎石+顶缘分隔带,跨关恒定)+ `scene_stage_plaza`(B 区角色脚下小石台,48×12 九宫格件)——B 区战斗舞台背景与连续地面 2026-10-31 已入包;登记超前:营地场景图批落地前盘上未建 |
|
||||||
| `board/` | 棋盘地形材质(2026-11-07 重做后改程序化绘制,无入包地形 PNG);seal_mark.png 现役用途=战末金蜡封徽记专用(战末弹层消费——棋盘侧贴图绘制路径已退役) | seal_mark.png(战末蜡封专用);旧 `terrain_*` 63 件(16 墙瓦片+5 地面变体×三关)随重做退役删除 |
|
| `board/` | 砖面/封印印记(三关换皮 + 封印印记件) | terrain_floor_<board_type>_<n>.png(三关地面系)、seal_mark.png |
|
||||||
|
|
||||||
## 4. 坐标/朝向等工程侧约定备查
|
## 4. 坐标/朝向等工程侧约定备查
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 战斗舞台背景 · 分层生图提示词卡 v1.10
|
# 战斗舞台背景 · 分层生图提示词卡 v1.8
|
||||||
|
|
||||||
> **性质**:B 区战斗舞台背景(顶部空区+远景天然洞壁+近景连续泥土地面+分隔带)的出图执行侧文件。背景按三关出三张变体,地面三关共用一张;场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖。
|
> **性质**:B 区战斗舞台背景(顶部空区+远景天然洞壁+近景连续泥土地面+分隔带)的出图执行侧文件。背景按三关出三张变体,地面三关共用一张;场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖。
|
||||||
> **依据**:场景构成与图层归属 = [art-bible](art-bible.md) §6.1;三关方向 = art-bible §6.3;色板 = art-bible §4.1(战斗屏场景环境子板);尺寸 = `game/data/tables/battle_layout.tres`(背景读 `stage_h`;地面读 `ground_h`,字段值 100);命名与路径 = [asset-path-map](asset-path-map.md);后处理 = [art-pipeline-tools](art-pipeline-tools.md)。
|
> **依据**:场景构成与图层归属 = [art-bible](art-bible.md) §6.1;三关方向 = art-bible §6.3;色板 = art-bible §4.1(战斗屏场景环境子板);尺寸 = `game/data/tables/battle_layout.tres`(背景读 `stage_h`;地面读 `ground_h`,该字段由地面层实装批新增并回填);命名与路径 = [asset-path-map](asset-path-map.md);后处理 = [art-pipeline-tools](art-pipeline-tools.md)。
|
||||||
> **边界**:只管三张背景变体与一张共用地面的提示词与验收;角色、格面、图标、小石台 `scene_stage_plaza.png` 与样张走 art-prompts 与脚本管线,不在本卡。
|
> **边界**:只管三张背景变体与一张共用地面的提示词与验收;角色、格面、图标、小石台 `scene_stage_plaza.png` 与样张走 art-prompts 与脚本管线,不在本卡。
|
||||||
> **建立**:2026-10-31 · 状态:三关背景变体与共用地面已按本工单出图并入包(选定=dungeon v10c/underdark v10c/deep_underdark v10c/ground v12b,落点与读数见 art-bible §6.1「B 区舞台背景与共用地面的交付绑定」);出图通道由作者自定(参考候选可用内置 ImageGen,水印可留;入包终稿须干净)。
|
> **建立**:2026-10-31 · 状态:三关背景变体与共用地面已按本工单出图并入包(选定=dungeon v10c/underdark v10c/deep_underdark v10c/ground v12b,落点与读数见 art-bible §6.1「B 区舞台背景与共用地面的交付绑定」);出图通道由作者自定(参考候选可用内置 ImageGen,水印可留;入包终稿须干净)。
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
1. **出图**:按 §2 把提示词贴进生图渠道;每次出图先放 §1 的风格参考图。**先只出 dungeon 背景 1 张**,作者确认风格前缀后,再出 underdark / deep_underdark 两张变体与连续地面层。
|
1. **出图**:按 §2 把提示词贴进生图渠道;每次出图先放 §1 的风格参考图。**先只出 dungeon 背景 1 张**,作者确认风格前缀后,再出 underdark / deep_underdark 两张变体与连续地面层。
|
||||||
2. **入库**:候选原图放 `artwork/candidates/scene_stage_bg/`(三关变体用 `dungeon_*` / `underdark_*` / `deep_underdark_*` 命名)与 `artwork/candidates/scene_stage_ground/`;`_登记.txt` 记用途与生成时间。
|
2. **入库**:候选原图放 `artwork/candidates/scene_stage_bg/`(三关变体用 `dungeon_*` / `underdark_*` / `deep_underdark_*` 命名)与 `artwork/candidates/scene_stage_ground/`;`_登记.txt` 记用途与生成时间。
|
||||||
3. **后处理**:三张背景不去底(不透明全幅);连续地面层去底转透明(顶缘以上键控)+最近邻降采样+色板量化+底测试条;工具清单与已知边界见 [art-pipeline-tools](art-pipeline-tools.md)。
|
3. **后处理**:三张背景不去底(不透明全幅);连续地面层去底转透明(顶缘以上键控)+最近邻降采样+色板量化+底测试条;工具清单与已知边界见 [art-pipeline-tools](art-pipeline-tools.md)。
|
||||||
4. **转正**:终稿转入 `game/assets/art/scene/`;三张背景按 `board_type` 选图、连续地面层接线与布局表 `ground_h` 字段均已实装落码。
|
4. **转正**:终稿转入 `game/assets/art/scene/`;三张背景按 `board_type` 选图、连续地面层接线与布局表 `ground_h` 字段由实装批落码。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
|
|||||||
**画什么**:全宽近景地面——**干净压实泥土为主**,整片平整、中低明度;全幅只保留**零星 3–5 颗小石**,散点分布、不成排不成堆;顶缘为不规则泥土边+阴影缝,可带 2–3 颗小石;中央平缓留空;地面跨三关恒定。
|
**画什么**:全宽近景地面——**干净压实泥土为主**,整片平整、中低明度;全幅只保留**零星 3–5 颗小石**,散点分布、不成排不成堆;顶缘为不规则泥土边+阴影缝,可带 2–3 颗小石;中央平缓留空;地面跨三关恒定。
|
||||||
**不画什么**:瓷砖、砖缝、规则铺装、石板块、踢脚线/直亮边;草、木地板;远景/洞壁/天空;角色、生物、道具、火把/灯;中央大石或碎石堆挡站位;满铺碎石、密集砂砾、成排/成堆碎石、亮色浅棕大片、泥点噪声、垃圾杂物。
|
**不画什么**:瓷砖、砖缝、规则铺装、石板块、踢脚线/直亮边;草、木地板;远景/洞壁/天空;角色、生物、道具、火把/灯;中央大石或碎石堆挡站位;满铺碎石、密集砂砾、成排/成堆碎石、亮色浅棕大片、泥点噪声、垃圾杂物。
|
||||||
|
|
||||||
**出图画布**:终稿 = 基准屏宽 × `ground_h`(`battle_layout.tres` 字段值 100);本件是极宽薄条,平台无对应宽高比时按横向可平铺纹理条出图(左右无缝,宽度取平台方档,高度取 `ground_h` 的整数倍),终稿裁/平铺到目标宽高比,禁横向拉伸。试片阶段可按构图比例先出,终稿尺寸读表。
|
**出图画布**:终稿 = 基准屏宽 × `ground_h`(`battle_layout.tres` 新增字段,地面层实装批回填);本件是极宽薄条,平台无对应宽高比时按横向可平铺纹理条出图(左右无缝,宽度取平台方档,高度取 `ground_h` 的整数倍),终稿裁/平铺到目标宽高比,禁横向拉伸。试片阶段可按构图比例先出,终稿尺寸读表。
|
||||||
|
|
||||||
**正向提示词**:
|
**正向提示词**:
|
||||||
|
|
||||||
@@ -167,11 +167,11 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
|
|||||||
## 5. 待裁与待办(不阻塞提示词成文)
|
## 5. 待裁与待办(不阻塞提示词成文)
|
||||||
|
|
||||||
1. **三张背景按 `board_type` 选图**——游戏代码改动,走需求卡片+迭代;背景 `wall_ambient` tint 退役,棋盘/世界的该槽保留。
|
1. **三张背景按 `board_type` 选图**——游戏代码改动,走需求卡片+迭代;背景 `wall_ambient` tint 退役,棋盘/世界的该槽保留。
|
||||||
2. **`ground_h` 字段**——布局表字段值 100;本卡试片按构图比例,终稿读表。
|
2. **`ground_h` 字段**——布局表新增字段,地面层实装批回填;本卡试片按构图比例,终稿读表。
|
||||||
3. **冷/灰色入板**——underdark / deep_underdark 需要的冷蓝灰、灰黑与矿脉色按 art-bible §4.1 战斗屏场景环境子板两道门入板;三张背景共用该子板 ≤32 色。
|
3. **冷/灰色入板**——underdark / deep_underdark 需要的冷蓝灰、灰黑与矿脉色按 art-bible §4.1 战斗屏场景环境子板两道门入板;三张背景共用该子板 ≤32 色。
|
||||||
4. **地面层出图工艺**——极宽薄条;默认横向可平铺纹理条(左右无缝);若作者要整幅不拼接,另议。
|
4. **地面层出图工艺**——极宽薄条;默认横向可平铺纹理条(左右无缝);若作者要整幅不拼接,另议。
|
||||||
5. **小石台 `scene_stage_plaza.png`**——先保留;是否退役归后续裁决。
|
5. **小石台 `scene_stage_plaza.png`**——先保留;是否退役归实装批/后续裁决。
|
||||||
6. **四柱光柱程序层退役**——光柱不迁入背景;该程序层已退役。
|
6. **四柱光柱程序层退役**——光柱不迁入背景;背景资产入包后该程序层退役(代码批)。
|
||||||
7. **风格前缀**——首张 dungeon 背景试片后由作者确认,确认后才出另外两张与地面层。
|
7. **风格前缀**——首张 dungeon 背景试片后由作者确认,确认后才出另外两张与地面层。
|
||||||
8. **可选要素池**——按 §3.2 可选项本版关闭;要加走本卡修订。
|
8. **可选要素池**——按 §3.2 可选项本版关闭;要加走本卡修订。
|
||||||
|
|
||||||
@@ -179,4 +179,4 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
|
|||||||
|
|
||||||
## 6. 不在本卡
|
## 6. 不在本卡
|
||||||
|
|
||||||
角色与敌种立绘、棋盘格面/墙面纹理、UI 图标、护甲图标、小石台 `scene_stage_plaza.png`、整屏样张与游戏代码接线;这些各归 art-prompts、脚本管线与代码实装。
|
角色与敌种立绘、棋盘格面/墙面纹理、UI 图标、护甲图标、小石台 `scene_stage_plaza.png`、整屏样张与游戏代码接线;这些各归 art-prompts、脚本管线与实装批。
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
# 营地场景 · 分层生图提示词卡 v1.10
|
# 营地场景 · 分层生图提示词卡 v1.2
|
||||||
|
|
||||||
> **性质**:营地场景图(1280×800,一张可点击场景图 + 十张分层:背景层 1 + 围墙层 1 + 八个物件层)的出图执行侧文件。**场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖**。
|
> **性质**:营地场景图(1280×800,一张可点击场景图 + 十张分层:背景层 1 + 围墙层 1 + 八个物件层)的出图执行侧文件。**场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖**。
|
||||||
> **依据**:色彩与氛围 = [art-bible](art-bible.md) §2.8 与 §6.2(营地的暖由晒白的地面、木色与烛光件承载;远景走正午强日照、天空淡晴蓝,与冒险中的地下城形成对比;本卡不复述色值);坐标与层序 = 本卡 §2.3(运行期单一事实源 = `game/data/tables/camp_scene_layout.tres`);物件命名与消费链 = [asset-path-map](asset-path-map.md);画法与交付形态 = [art-bible](art-bible.md) §6.2。画法与用色冲突时以 art-bible 为准。
|
> **依据**:色彩与氛围 = `reports/提案-营地色彩与氛围脚本-2026-10-23.md`(本卡不复述色值);坐标与层序 = `artwork/2026-10-23-营地场景/布局草案-1280x800.html`;物件命名与消费链 = [asset-path-map](asset-path-map.md);画法与交付形态 = [art-bible](art-bible.md) §6.2。冲突时色彩以色彩脚本为准,画法以 art-bible 为准。
|
||||||
> **边界**:只管营地场景图的分层出图。角色、图标、格面走 art-prompts.md 与脚本管线,不需要提示词。
|
> **边界**:只管营地场景图的分层出图。角色、图标、格面走 art-prompts.md 与脚本管线,不需要提示词。
|
||||||
> **建立**:2026-10-25 · 状态:十条提示词成文(背景层 1 + 围墙层 1 + 八个物件层);背景层两片与围墙层待按 §4 新判据重出,门扇随门洞压扁重画
|
> **建立**:2026-10-25 · 状态:十条提示词成文(背景层 1 + 围墙层 1 + 八个物件层),出图通道由作者自定
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
3. **后处理**:脚本管线代跑——去底转透明、降采样到终稿尺寸(整数倍)、色板量化、四联底测试条。**背景层不去底(全幅不透明)**;围墙层与八个物件层去底转透明。后处理工具清单与用法见 [art-pipeline-tools](art-pipeline-tools.md)。
|
3. **后处理**:脚本管线代跑——去底转透明、降采样到终稿尺寸(整数倍)、色板量化、四联底测试条。**背景层不去底(全幅不透明)**;围墙层与八个物件层去底转透明。后处理工具清单与用法见 [art-pipeline-tools](art-pipeline-tools.md)。
|
||||||
4. **转正**:终稿转入切片资产目录,按坐标表接线。
|
4. **转正**:终稿转入切片资产目录,按坐标表接线。
|
||||||
|
|
||||||
**出图顺序(先锁后产,不能跳)**:概念脚本 → **本卡提示词** → 贴风格参考图**先出远景片 `bg_far` 1 张** → 作者确认风格前缀 → 才出地面片 `bg_floor`、围墙层与八个物件层。
|
**出图顺序(先锁后产,不能跳)**:概念脚本 → **本卡提示词** → 贴风格参考图**先出背景层 `scene_camp_bg` 1 张** → 作者确认风格前缀 → 才扩产围墙层 `scene_camp_wall` 与八个物件层(共 9 张)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
贴参考图时,在提示词末尾接这一句:
|
贴参考图时,在提示词末尾接这一句:
|
||||||
|
|
||||||
```
|
```
|
||||||
Style reference: the attached images are this game's own finished pixel art and its camp scene reference — match only their rendering style, the same pixel density, flat shading, thin warm cream outline and the same limited palette discipline. They are style references only: do not copy their character, gear or props, and do not put any character into the scene.
|
Style reference: the attached images are this game's own finished pixel art and its camp scene reference — match only their rendering style, the same pixel density, flat shading, thin warm cream outline and warm limited palette. They are style references only: do not copy their character, gear or props, and do not put any character into the scene.
|
||||||
```
|
```
|
||||||
|
|
||||||
> **描边取奶油色**,不取参照物的深灰褐:去底脚本走"奶油描边膨胀 3px 当屏障"吞底色,深褐描边会让该步失效。这条是技术前提,不是美术取向;若改深褐,需另换去底方案。
|
> **描边取奶油色**,不取参照物的深灰褐:去底脚本走"奶油描边膨胀 3px 当屏障"吞底色,深褐描边会让该步失效。这条是技术前提,不是美术取向;若改深褐,需另换去底方案。
|
||||||
@@ -39,62 +39,26 @@ Style reference: the attached images are this game's own finished pixel art and
|
|||||||
|
|
||||||
## 2. 背景层与围墙层(两张,不可点)
|
## 2. 背景层与围墙层(两张,不可点)
|
||||||
|
|
||||||
围墙从背景层拆出、独立成层:围墙层可单独锁死桩高、门洞做成透明缺口透出背景层的小路;背景层只画天、山、草地与地面,不画任何物件——远景走正午强日照(淡晴蓝天空、一整片连续的淡蓝灰远山、晒白的草地与土路),整体淡而退后,让近景的暖调木色与烛光件成为画面主角。两层都不可点;按乙工序门**先只出背景层 1 张**供作者确认风格前缀,确认后才扩产围墙层与八个物件层。
|
围墙从背景层拆出、独立成层:围墙层可单独锁死桩高、门洞做成透明缺口透出背景层的小路;背景层不混入暖木色、更易守住冷色占比判据(判据见 §4)。两层都不可点;按乙工序门**先只出背景层 1 张**供作者确认风格前缀,确认后才扩产围墙层与八个物件层。
|
||||||
|
|
||||||
### 2.1 背景层(`scene_camp_bg`,不可点,不透明全幅)
|
### 2.1 背景层(`scene_camp_bg`,不可点,不透明全幅)
|
||||||
|
|
||||||
**产出方式**:分两片出图,后处理按 y734 拼成一张 2560×1600。接缝整条落在围墙层(406–734)背后,画面里看不见。
|
**出图画布**:2560×1600(终稿 1280×800 的 2 倍,保证整数倍降采样)
|
||||||
|
**画什么**:天空、远山、整片地面、门洞位置一条通向远处的小路
|
||||||
| 片 | 出图画布 | 终稿落位 | 内容 |
|
**不画什么**:木围墙、门柱、门扇、七个物件、角色、接地阴影——围墙与门柱是 §2.2 的独立层,门洞是它的透明缺口;小路在本层画好、透出来即可
|
||||||
|---|---|---|---|
|
|
||||||
| 远景片 `bg_far` | 2560×734(3.5:1 超宽) | (0, 0, 1280, 367) | 天空+远山+草地+小路 |
|
|
||||||
| 地面片 `bg_floor` | 2560×866(3:1 超宽) | (0, 367, 1280, 433) | 营地内踩实裸土 |
|
|
||||||
|
|
||||||
**为什么分两片**:整张一次出图时,模型按「构图好看」分配天地比例,山被挤到画面下半部——三张实测里两张的山体整段落在围墙后面(山体上缘 y280/y227,墙顶 217),远山等于消失。拆开后远景片的全部高度都归天空+山+草地,山才可能长到围墙之上。
|
|
||||||
|
|
||||||
#### 2.1.1 远景片(`bg_far`)
|
|
||||||
|
|
||||||
**画布比例**:3.5:1 超宽。通道支持直接出 2560×734;不支持则按 3:2 出图后纵向压到 3.5:1,构图比例不变
|
|
||||||
**光照口径**:正午强日照晴天。太阳不入画,猛烈感从三处读出——天空清透的淡蓝、云烧得白、地面晒到泛白。
|
|
||||||
**分带(按画面高度)**:
|
|
||||||
- 天空 0–14%=淡晴蓝(高明度、低饱和的清蓝,不是深饱和的正午蓝),至多两朵烧白扁平简笔云
|
|
||||||
- 远山 14–55%(**山体占 41%,硬指标**)=一整片连续的淡蓝灰山体,轮廓自然起伏;**禁一层叠一层的轮廓带与阴影台阶**
|
|
||||||
- 草地 55–100%=晒白的浅黄绿
|
|
||||||
- 小路在草地内:从底边向上收窄,到山脚为止,**不越过山脚、不上探到天空**;路面晒白成暖米白
|
|
||||||
**画什么**:淡晴蓝天空、一整片连续的淡蓝灰远山、晒白草地、草地中央一条暖米白土路
|
|
||||||
**不画什么**:围墙、门柱、门扇、物件、角色、营地内地面(那是 §2.1.2);太阳本体、太阳光晕、奶白或暖黄底色的天空、深饱和的蓝天;一层叠一层的山体轮廓带、平行山脊条带、台阶式横条阴影;山与草地之间禁出现平直硬边
|
|
||||||
|
|
||||||
```
|
```
|
||||||
Pixel art style. True pixel art game background, chunky square pixels, strict pixel grid, hard edges, no anti-aliasing, flat colors, limited palette about 20 colors, retro 16-bit look, Aseprite style, flat side view, orthographic, ULTRA WIDE horizontal composition, aspect ratio 3.5 to 1. This is the far view seen from inside a small adventurer camp, looking out, at high noon on a clear hot day. It contains ONLY three bands stacked top to bottom, plus one path. The sun itself never enters the frame; its strength must be read from the surfaces instead — bleached ground, burned white clouds, a pale clear blue sky. BAND 1 — SKY, from the top edge down to 14 percent of the frame height: a pale light clear blue, high value and low saturation, like a washed-out summer sky, never a deep or vivid blue; flat and empty, no gradient; at most two extremely simple flat clouds in clean bright white with a pale grey underside, so they read as burned white by the sun; no sun, no sun glow, no warm or cream tint anywhere in the sky. BAND 2 — DISTANT HILLS, from 14 percent down to 55 percent of the frame height: ONE single continuous mass of rolling hills in pale blue-grey, not a stack of separate ridges. The skyline rises and falls naturally with a few broad soft summits; the whole mass reads as one flat pale blue-grey tone, with at most one or two very gentle lighter planes to suggest volume. DO NOT draw layered silhouette bands, stacked parallel ridges, terrace-like steps, or repeated shadow stripes running across the hills. THE HILLS MUST FILL THIS ENTIRE BAND — the highest ridgeline reaches up to 14 to 20 percent of the frame height and the hill mass continues down to 55 percent; a low ridge hugging the bottom of the frame is WRONG. Silhouette edges are stepped in pixel blocks, no outline, no rim light. BAND 3 — MEADOW, from 55 percent down to the bottom edge: sun-bleached pale yellow-green grass, flat and low contrast, marked only by a few simple flat grass tufts, no trees, no bushes. PATH — one dirt path in the meadow only, sun-bleached warm off-white tan: it starts at the bottom edge of the frame in the middle, about one fifth of the frame width there, runs straight up and narrows until it meets the hill foot at 55 percent, where it disappears; it must not go above the hill foot and must not reach the sky. COLOR: a high-noon clear-daylight palette — pale clear blue sky, burned white clouds, one continuous pale blue-grey hill mass, sun-bleached pale yellow-green meadow, warm off-white dirt path. THE WHOLE FAR VIEW STAYS PALE AND LOW IN CONTRAST; the sky is the bluest area but it is a light washed-out blue, never deep or vivid, and everything below the skyline stays pale and dry. LIGHT: harsh dry daylight straight from above, no visible sun, no long shadows, no warm or sunset cast; the far view reads as a safe open place under a strong sun. DO NOT ADD: any palisade wall, fence, gate, gate posts, tent, campfire, crate, barrel, prop, character, animal; any hard straight horizontal seam between sky, hills and meadow — the hill foot dissolves into the meadow through stepped intermediate tones; any outline or rim; trees, forests or dense vegetation; a visible sun disc, sun glow, lens flare, god rays, a warm cream or yellow tinted sky, a deep saturated blue sky, sunset, golden hour, overcast grey sky; stacked layered hill silhouettes, parallel ridge bands, terrace steps or repeated shadow stripes across the hills; antialiasing, gradients, dithering, painterly strokes, 3D, realistic shading, glossy light, bloom, vignette, night; any text, letters, number, watermark, signature, logo, frame, border, UI element, icon, badge.
|
Pixel art style. True pixel art game background layer drawn with chunky square pixels, strict pixel grid alignment, hard edges, no anti-aliasing, no gradients, flat colors only, a limited palette of about 24 colors, retro 16-bit look, Aseprite style, all ages, flat side view, orthographic, no perspective distortion. Wide horizontal composition, 16:10 aspect ratio. This is the FAR BACKGROUND LAYER ONLY of a small adventurer camp: sky, distant hills and the whole ground. It must contain no palisade wall, no gate posts, no camp objects, no gate leaves, no characters and no drop shadows, because all of those are drawn as separate transparent layers on top of this one. COLOR SCRIPT — cool recedes, warm advances: the sky, the hills and the ground are all COOL, pale, desaturated and low in contrast; there is no warm accent anywhere in this layer, warm color belongs only to the separate object layers drawn on top. ATMOSPHERIC DEPTH: every plane that is farther away is lighter, closer to the value of the sky, cooler, lower in contrast and simpler in detail, while the nearest plane is the darkest and highest in contrast. SKY (top of frame): the lightest thing in the picture, flat pale cool off-white with a faint blue-grey tint, no yellow or cream tone, no sun anywhere; the very top strip of the frame, about one sixteenth of the frame height, stays completely calm and empty, reserved as clear space with nothing in it; at most one or two extremely simple flat low-contrast clouds. FAR DISTANCE: two or three layers of low rolling hill silhouettes in pale cool blue-grey, each farther layer lighter, cooler and lower in contrast than the one in front, fading towards the value of the sky, no trees, no individual foliage. HILLS TO GROUND: the hills fade gradually and smoothly down into the ground, with NO visible horizon line and NO distant ground band — the transition must not read as a separate horizontal stripe of a different color. GATE PATH: in the middle of the frame, between x=1040 and x=1520, one clearly visible dirt path runs from the ground at two thirds of the frame height measured from the bottom edge away into the distance between the hills, narrowing as it recedes, painted in a muted desaturated grey-brown earth tone, never golden or warm yellow; this path shows through the empty gate opening of the wall layer above. FOREGROUND GROUND: the darkest area of the picture, dry packed bare earth in a neutral desaturated grey-brown, never golden, amber or warm yellow, hard flat color blocks, hard edges, no gradient, no grass, no grass tufts, no weeds and no plants of any kind. The foreground ground is completely empty apart from the dirt path: no objects, no icons, no badges, no markers, no decorations of any kind. Do not add any of the following: realistic, photorealistic or 3D rendering; painterly brushwork, smooth anti-aliased lines, gradient or dithered shading, glossy highlights; black or heavy dark outlines; drop shadows, contact shadows or any shadow band; blur or compression artifacts; a vignette, dark corners, or any mood darkening; night, dusk, moon, stars, sunset or sunrise light; a sun or any light source drawn in the sky; a visible horizon line, a separate horizontal distant ground band or any distant grass strip below the hills; trees, forests or foliage in the distance; grass, grass tufts, weeds or plants in the foreground; a palisade wall, wooden fence, fence posts, gate posts or any wall structure; any warm, golden, amber or yellow cast on the sky, on the hills or on the ground; any camp object, furniture, crate, barrel, fire, tent or tool; any gate leaf, door panel or hinge; any purple or magenta anywhere; any text, letters, numbers, watermark, signature or logo; any frame, border, panel, arrow or UI element; any icon, badge, item tile, emblem, sign, marker or symbol anywhere in the frame; any characters, people, creatures or animals.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 2.1.2 地面片(`bg_floor`)
|
|
||||||
|
|
||||||
**画布比例**:3:1 超宽
|
|
||||||
**内容**:营地内被正午太阳晒到泛白的踩实米黄土地,铺满整幅
|
|
||||||
**硬指标**:**中线与左右两侧同色——没有任何路、小径、车辙**;明度与饱和读到正午下晒到发白的干土——高明度、低饱和,不暗、不闷,也不许发黄发焦糖;色相与远景片草地明显区分;细节由大像素块构成,块尺寸与远景片同一档,禁 1–2px 碎点噪声
|
|
||||||
**不画什么**:草、植被、大石块、物件、天空、地平线、围墙、接缝线;迷彩式闭合斑块与满屏碎点
|
|
||||||
|
|
||||||
```
|
|
||||||
Pixel art style. True pixel art game ground texture, chunky square pixels, strict pixel grid, hard edges, no anti-aliasing, flat colors, limited palette about 12 colors, retro 16-bit look, Aseprite style, ULTRA WIDE horizontal composition, aspect ratio 3 to 1. This is the trodden floor INSIDE a small adventurer camp at high noon — bare packed dry earth filling the whole frame edge to edge, seen at a shallow angle from slightly above. The sun is strong and directly overhead, so the ground reads bleached rather than richly coloured. PIXEL SCALE: the whole frame is built from large square pixel blocks, each block about one two-hundredth of the frame width; every mark is one such block or a small group of them, never 1 or 2 pixel speckle. MATERIAL: sun-bleached dry pale beige-tan earth (trodden loess washed out by the midday sun), a light warm bone-to-straw colour, high value, low saturation, dry and never muddy, never grey, never saturated ochre, caramel or mustard. LIGHT: harsh dry daylight straight from above; broad flat sunlit areas dominate, with only gentle tonal steps between them; no long shadows, no vignette. TEXTURE: deliberate large pixel clusters only — short paired scuff marks that read as dragged footprints, small scattered pebbles, beaten patches where feet have worn the ground smooth, occasional faint drag marks; density rises slightly toward the bottom edge and the middle stays calm and open. PATCH SHAPE: the tonal patches are broad, few and flat, their edges stepped in whole pixel blocks; do not create irregular closed blotches, camouflage patches, speckle noise or dithered dot clusters, and keep the ground reading as one continuous packed soil surface. CRITICAL, NO PATH: there is no road, no trail, no track, no wheel rut and no worn strip anywhere in this image — the middle of the frame must look the same as the left and right edges, nothing leads anywhere. DO NOT ADD: grass, vegetation, plants, flowers, moss, lichen; rocks larger than a pebble; crates, sticks, bones, debris piles, tools; water, puddles; shadows of objects; sky, horizon, hills, wall, fence, gate, building; any line, seam, border or edge inside the frame; saturated mustard, caramel or golden colouring; antialiasing, gradients, dithering, painterly strokes, 3D, realistic shading, glossy light, bloom, vignette; any text, letters, number, watermark, signature, logo, frame, border, UI element, icon, badge.
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2.1.3 拼接与后处理
|
|
||||||
|
|
||||||
1. 两片各缩放到终稿尺寸:远景片 1280×367、地面片 1280×433
|
|
||||||
2. 按 y367 上下拼接成 1280×800
|
|
||||||
3. 量化到背景层自板(≤32 色;营地屏双板制、屏并集 ≤64,见 art-bible §4.1 营地行)
|
|
||||||
4. 需要 2× 档时整数倍放大到 2560×1600
|
|
||||||
5. 接缝不做过渡处理——它整条落在围墙(220–420)背后
|
|
||||||
|
|
||||||
### 2.2 围墙层(`scene_camp_wall`,不可点,透明底)
|
### 2.2 围墙层(`scene_camp_wall`,不可点,透明底)
|
||||||
|
|
||||||
**出图画布**:2560×1600(与背景层同画布,门洞 x 坐标直接对齐);墙横贯画在出图 y406–734 这条带内(桩身 y434–734,门柱 y406–734),其余为纯色底 `#F2F2F2`。落盘由 S4 后处理裁成素材细条 `1280×164`(出图 `(0, 406, 2560, 328)`),**不做全幅 1280×800 落盘**(全幅约 3.9 MB 显存,细条约 0.35 MB);**显示矩形 `(0, 220, 1280, 200)`(2026-11-07 裁,运行时按 200 高拉伸)**。
|
**出图画布**:2560×1600(与背景层同画布,门洞 x 坐标直接对齐);墙横贯画在出图 y480–620 这条**窄带**内,其余为纯色底 `#F2F2F2`。落盘由 S4 后处理裁成终稿外接矩形 `(0, 240, 1280, 70)` / 出图 `(0, 480, 2560, 140)` 的细条,**不做全幅 1280×800 落盘**(全幅约 3.9 MB 显存,细条约 0.35 MB)。
|
||||||
**画什么**:横贯全宽的密排竖木桩墙(左右两段,桩身终稿 150 高)+ 两根略高的门柱(终稿 164 高),门洞处完全透明
|
**画什么**:横贯全宽的密排竖木桩墙(左右两段)+ 两根略高的门柱,门洞处完全透明
|
||||||
**不画什么**:天空、远山、地面、小路、门扇、七个物件、角色;门洞内不画任何东西,透出背景层的小路
|
**不画什么**:天空、远山、地面、小路、门扇、七个物件、角色;门洞内不画任何东西,透出背景层的小路
|
||||||
|
|
||||||
```
|
```
|
||||||
Pixel art style. True pixel art game layer drawn with chunky square pixels, strict pixel grid alignment, hard edges, no anti-aliasing, no gradients, flat colors only, a limited palette of about 24 colors, retro 16-bit look, Aseprite style, all ages, flat side view, orthographic, no perspective distortion. Wide horizontal composition, 16:10 aspect ratio. This is the PALISADE WALL LAYER ONLY of a small adventurer camp, drawn on a plain flat uniform light grey #F2F2F2 background for easy keying. A wooden palisade wall runs straight across the full width of the frame, seen from the front, built from closely spaced vertical logs standing side by side with no gaps between them, every log cut to a sharp point at the top, a solid barrier with no horizontal rails, no see-through gaps, no ranch-style post-and-rail fence. The wall stands on the ground line at y=734 of 1600. The LOG BODIES, pointed tips included, rise 300 pixels above that base line — about nineteen percent of the total frame height — so it reads as a real barrier with presence, clearly taller than the gate opening cut into it, not a thin decorative strip. In the middle of the wall one wide gap holds two thick gate posts standing 28 pixels taller than the logs, and the entire opening between them is completely EMPTY — plain flat uniform light grey #F2F2F2 showing through, spanning x=1040 to x=1520 and rising from the base line y=734 up to y=566, no logs, no path, no ground, no scenery inside the opening, because the dirt path and the hills belong to the background layer below and the gate leaves are a separate object layer. The wall is painted in a muted greyed wood brown, with a thin warm cream outline around the whole silhouette, flat shading. Do not add any of the following: realistic, photorealistic or 3D rendering; painterly brushwork, smooth anti-aliased lines, gradient or dithered shading, glossy highlights; black or heavy dark outlines; drop shadows or contact shadows; blur or compression artifacts; a vignette or dark corners; any sky, hills, ground, grass, dirt path or scenery of any kind; any gate leaf, door panel or hinge; any camp object, furniture, crate, barrel, fire, tent or tool; any characters, people, creatures or animals; any purple or magenta anywhere; any text, letters, numbers, watermark, signature or logo; any frame, border, panel, arrow or UI element.
|
Pixel art style. True pixel art game layer drawn with chunky square pixels, strict pixel grid alignment, hard edges, no anti-aliasing, no gradients, flat colors only, a limited palette of about 24 colors, retro 16-bit look, Aseprite style, all ages, flat side view, orthographic, no perspective distortion. Wide horizontal composition, 16:10 aspect ratio. This is the PALISADE WALL LAYER ONLY of a small adventurer camp, drawn on a plain flat uniform light grey #F2F2F2 background for easy keying. A wooden palisade wall runs straight across the full width of the frame, seen from the front, built from closely spaced vertical logs standing side by side with no gaps between them, every log cut to a sharp point at the top, a solid barrier with no horizontal rails, no see-through gaps, no ranch-style post-and-rail fence. The wall is SHORT and LOW: including the pointed tips the whole band occupies only about one eighteenth of the total frame height, a thin horizontal strip, NOT a tall barrier; the logs stand only about one eighteenth of the total frame height above their base line. In the middle of the wall one wide gap holds two thick gate posts slightly taller than the wall, and the entire opening between them is completely EMPTY — plain flat uniform light grey #F2F2F2 showing through, no logs, no path, no ground, no scenery inside the opening, because the dirt path and the hills belong to the background layer below and the gate leaves are a separate object layer. The wall is painted in a muted greyed wood brown, with a thin warm cream outline around the whole silhouette, flat shading. Do not add any of the following: realistic, photorealistic or 3D rendering; painterly brushwork, smooth anti-aliased lines, gradient or dithered shading, glossy highlights; black or heavy dark outlines; drop shadows or contact shadows; blur or compression artifacts; a vignette or dark corners; any sky, hills, ground, grass, dirt path or scenery of any kind; any gate leaf, door panel or hinge; any camp object, furniture, crate, barrel, fire, tent or tool; any characters, people, creatures or animals; any purple or magenta anywhere; any text, letters, numbers, watermark, signature or logo; any frame, border, panel, arrow or UI element.
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2.3 出图画布上的坐标(终稿 ×2)
|
### 2.3 出图画布上的坐标(终稿 ×2)
|
||||||
@@ -102,17 +66,11 @@ Pixel art style. True pixel art game layer drawn with chunky square pixels, stri
|
|||||||
| 元素 | 终稿 1280×800 | 出图画布 2560×1600 |
|
| 元素 | 终稿 1280×800 | 出图画布 2560×1600 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 顶栏 HUD 保留带 | y ≤ 48 | **y ≤ 96**(保持空旷) |
|
| 顶栏 HUD 保留带 | y ≤ 48 | **y ≤ 96**(保持空旷) |
|
||||||
| 远景片 `bg_far` | y 0–367(高 367) | y 0–734(高 734,3.5:1) |
|
| 背景层 `scene_camp_bg` | 全幅 1280×800 | 全幅 2560×1600 |
|
||||||
| 地面片 `bg_floor` | y 367–800(高 433) | y 734–1600(高 866,3:1) |
|
| 围墙带(wall 层桩身) | y 267–310(**高 43px**) | y 534–620(**高 86px**) |
|
||||||
| 两片接缝 | **y 367**(落在围墙 220–420 背后) | **y 734**(落在围墙 406–734 背后) |
|
| 门柱(wall 层,略高) | y 240–310;x 500–520 / 760–780 | y 480–620;x 1000–1040 / 1520–1560 |
|
||||||
| 地平线(山脚/草地起点) | y 与两片接缝重合,墙背后不可见 | 同左 |
|
| 门洞(wall 层透明缺口) | x 520–760 | x 1040–1520 |
|
||||||
| 远山带 | y 51–202(画面 14%–55%,山体 41%) | y 103–403 |
|
| 门洞内小路(画在 bg 层) | x 520–760,自 y310 向上收窄至远山 | x 1040–1520,自 y620 向上收窄至远山 |
|
||||||
| 草地带 | y 202–367 | y 403–734 |
|
|
||||||
| 围墙层外接矩形 | y 220–420(高 200,2026-11-07 裁) | y 406–734(高 328,素材画布不变) |
|
|
||||||
| 围墙带(wall 层桩身) | 素材桩身 150 按 200/164 显示拉伸(显示约高 183) | y 434–734(**高 300px**) |
|
|
||||||
| 门柱(wall 层,略高) | 显示 y 220–420(高 200);x 500–520 / 760–780 | y 406–734;x 1000–1040 / 1520–1560 |
|
|
||||||
| 门洞(wall 层透明缺口) | 墙件缺口全高 y 220–420;门扇可见 y 282–420(高 138);x 520–760 | y 566–734(高 168);x 1040–1520 |
|
|
||||||
| 门洞内小路(画在远景片草地内) | x 520–760 穿门洞,自接缝 y367 向上收窄,到山脚 y202 消失 | x 1040–1520,自 y734 向上收窄,到 y403 消失 |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -139,7 +97,7 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
|
|||||||
| 件 | z 序 | 终稿矩形 | 出图画布 | 正文 |
|
| 件 | z 序 | 终稿矩形 | 出图画布 | 正文 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| 布告板 | 2 | 130×140 | 260×280 | §3.1 |
|
| 布告板 | 2 | 130×140 | 260×280 | §3.1 |
|
||||||
| 门扇 | 3 | 240×147 | 480×294 | §3.2 |
|
| 门扇 | 3 | 240×220 | 480×440 | §3.2 |
|
||||||
| 木桩 | 4 | 120×180 | 240×360 | §3.3 |
|
| 木桩 | 4 | 120×180 | 240×360 | §3.3 |
|
||||||
| 锻炉·铁砧 | 4 | 240×240 | 480×480 | §3.4 |
|
| 锻炉·铁砧 | 4 | 240×240 | 480×480 | §3.4 |
|
||||||
| 帐篷 | 4(不可点) | 300×170 | 600×340 | §3.5 |
|
| 帐篷 | 4(不可点) | 300×170 | 600×340 | §3.5 |
|
||||||
@@ -147,8 +105,6 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
|
|||||||
| 笔记本 | 5 | 100×80 | 200×160 | §3.7 |
|
| 笔记本 | 5 | 100×80 | 200×160 | §3.7 |
|
||||||
| 篝火 | 6 | 160×160 | 320×320 | §3.8 |
|
| 篝火 | 6 | 160×160 | 320×320 | §3.8 |
|
||||||
|
|
||||||
**落位尺寸(2026-11-05 用户裁地平线 y367 重排后)**:布告板 130×121/门扇 240×138/木桩 120×180/锻炉 240×193/帐篷 251×170/宝箱 106×90/笔记本 100×66/篝火 160×149——贴图锚定=底中心(帐篷/锻炉/宝箱/篝火/笔记本)+顶锚(门扇悬挂/布告板挂墙);命中矩形按锁定值。八件只改落位,门扇另随门洞压扁重画(原 240×211 → 240×138),其余七件沿用现有终稿。**2026-11-07 追加**:布告板 `(845, 241)`、门扇 `(520, 282)`、围墙显示矩形与墙脚入土见 §5 第 12 条。
|
|
||||||
|
|
||||||
**3.1 布告板(→ 图鉴)**
|
**3.1 布告板(→ 图鉴)**
|
||||||
```
|
```
|
||||||
A wooden notice board hung on a wall, with two or three blank pinned papers, no writing on them, one corner of a paper slightly curled; wood brown #8A5A34 frame, warm tan stone #C9AF83 papers.
|
A wooden notice board hung on a wall, with two or three blank pinned papers, no writing on them, one corner of a paper slightly curled; wood brown #8A5A34 frame, warm tan stone #C9AF83 papers.
|
||||||
@@ -156,7 +112,7 @@ A wooden notice board hung on a wall, with two or three blank pinned papers, no
|
|||||||
|
|
||||||
**3.2 门扇(→ 冒险)**
|
**3.2 门扇(→ 冒险)**
|
||||||
```
|
```
|
||||||
Two wooden gate leaves hanging from their hinges, half open and tilted outward, each made of thick planks with a cross brace and dark iron fittings, seen from the front, the pair shown together as one single object; the pair together fills a WIDE LOW rectangle about 240 wide by 138 tall, so the leaves read as broad rather than tall, each leaf roughly twice as wide as it is high; wood brown #8A5A34 planks, dark iron fittings.
|
Two wooden gate leaves hanging from their hinges, half open and tilted outward, each made of thick planks with a cross brace and dark iron fittings, seen from the front, the pair shown together as one single object; wood brown #8A5A34 planks, dark iron fittings.
|
||||||
```
|
```
|
||||||
|
|
||||||
**3.3 木桩(→ 天赋树)**
|
**3.3 木桩(→ 天赋树)**
|
||||||
@@ -193,38 +149,19 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm
|
|||||||
|
|
||||||
## 4. 验收(机检 + 目检)
|
## 4. 验收(机检 + 目检)
|
||||||
|
|
||||||
**远景片 `bg_far`**
|
**背景层 `scene_camp_bg`**
|
||||||
- 整体读作正午强日照晴天、安全开阔,与冒险中的地下城形成对比;色温与色值判据按 §5 第 11 条随环境子板登记回填
|
- 黄度 =(R+G)/2−B 分区取样:天空 ≤20、远山 ≤20、地面 ≤35
|
||||||
- 远景片整幅保持中低饱和、低对比,高饱和只留给近景的火焰与烛光件;远景淡而退后、近景暖调木色与烛光件为主,禁出现整屏高饱和偏色
|
- 冷色像素占比 ≥55%;本层不应出现任何暖色高饱和像素
|
||||||
- 机检:**山体上缘 ≤ 画面高度 15%**(这是硬指标——山体上缘落得越低,被围墙挡住后越是什么都看不见)
|
- 目检:顶部约 1/16 完全空旷;**无地平线、无远景地面带**(远山自然渐隐过渡到地面);不含围墙、门柱、门扇、物件、角色
|
||||||
- 机检:**山体占画面高度 ≥40%**(山体上缘到山脚)
|
- 目检/机检:门洞 x1040–1520 处**有一条清晰可辨、向远处收窄的土路**(非纯色块),透出「出去即冒险」
|
||||||
- 机检:草地上限 ≤ 画面高度 55%
|
- 机检/目检:全幅**无任何独立物件/图标/徽章/标记**(前景地面除小路外全空);参考做法=中下方块区独立色数应≈邻区(旧口径 v1 该区仅 179 色)
|
||||||
- 机检:山脚与草地交界处,上下各 8px 窄带的行均色差 ≤6/255(禁平直硬边;旧稿 y321 处约 37/255)
|
|
||||||
- 目检:顶部天空=淡晴蓝(清透、高明度、低饱和),无太阳本体、无太阳光晕、无奶白或暖黄底色、无深饱和正午蓝;云为烧白扁平简笔且不超过两朵
|
|
||||||
- 目检:远山读作一整片连续的淡蓝灰山体,轮廓自然起伏,禁一层叠一层的轮廓带与阴影台阶;草地与土路读作晒白(浅黄绿/暖米白),不落深橄榄绿
|
|
||||||
- 目检:小路只在草地内,从底边向上收窄到山脚为止,**不越过山脚、不上探到天空**
|
|
||||||
- 目检:无围墙、门柱、门扇、物件、角色
|
|
||||||
|
|
||||||
**地面片 `bg_floor`**
|
|
||||||
- 明度与饱和读到正午太阳下晒到泛白的干土——高明度、低饱和,不暗、不闷、不发焦糖黄;硬阈值随环境子板登记回填(§5 第 11 条)
|
|
||||||
- 机检:画面中线 200px 带与左右各 250px 带的平均色差 ≤6/255(**营地内无路带**)
|
|
||||||
- 机检:与远景片草地的平均色 (R−B) 差 ≥10/255(两种材质色相可辨)
|
|
||||||
- 目检:能读出正午太阳下晒到泛白的干土与大块柔和日照面;禁出现草、植被、大石块、物件、水面
|
|
||||||
- 目检:细节由大像素块构成、块尺寸与远景片同一档,读作拖拽脚印/碎石/踩踏斑块;禁 1–2px 碎点噪声、禁迷彩式闭合斑块
|
|
||||||
|
|
||||||
**整图(两片拼接后)**
|
|
||||||
- 接缝 y367 落在围墙 220–420 背后,**画面里看不见接缝**
|
|
||||||
- 单张 ≤32 色(量化后)
|
|
||||||
- 全幅无任何独立物件/图标/徽章/标记
|
|
||||||
|
|
||||||
**围墙层 `scene_camp_wall`**
|
**围墙层 `scene_camp_wall`**
|
||||||
- 透明底 `#F2F2F2` 可去底、奶油描边闭合
|
- 透明底 `#F2F2F2` 可去底、奶油描边闭合
|
||||||
- **桩身 = 出图 y434–734(终稿 150px);门柱 y406–734(终稿 164px);外接矩形 (0,406,2560,328)。桩身超出下沿 y734 达 5px 以上即判红**
|
- **桩身高度 = 出图 y534–620(终稿 43px);门柱略高 y480–620。桩身超出围墙带下沿 y620 达 5px 以上即判红**
|
||||||
- 目检:密排竖木桩、桩顶削尖、不透缝、无横木;门洞 y566–734 / x1040–1520 **完全透明**(透出 bg 小路)、无门扇;桩身高度须明显大于门洞高度
|
- 目检:密排竖木桩、桩顶削尖、不透缝、无横木;门洞 x1040–1520 **完全透明**(透出 bg 小路)、无门扇
|
||||||
- 单张色数 ≤32(量化后)、缩放为整数倍无拉伸痕迹
|
- 单张色数 ≤32(量化后)、缩放为整数倍无拉伸痕迹
|
||||||
|
|
||||||
> **量化与缩放实况注记**:围墙层与八件已按营地主色板 **32 色重量化回写**(art-bible §4.1 子板行——违例对 0);落位缩放实况=源 2× 档经后处理换算为锁定矩形 contain(×0.1934–0.4404 非整数倍),「整数倍无拉伸痕迹」判据的机检面以落位实测尺寸与目检兜底执行。
|
|
||||||
|
|
||||||
**八件**
|
**八件**
|
||||||
- 单件居中、四周留边、整件完整不出画
|
- 单件居中、四周留边、整件完整不出画
|
||||||
- 底色均匀 `#F2F2F2`、奶油描边闭合(去底脚本要能识别到屏障)
|
- 底色均匀 `#F2F2F2`、奶油描边闭合(去底脚本要能识别到屏障)
|
||||||
@@ -234,18 +171,10 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. 已裁(2026-11-05 用户裁;不再阻塞坐标表与定稿)
|
## 5. 待裁(不阻塞出图,阻塞坐标表与定稿)
|
||||||
|
|
||||||
1. **地平线与整体分带**:地平线定在终稿 y367(出图 y734);地面 433px、可见远景 217px(27%);围墙、门、布告板随之上调
|
1. **帐篷尺寸**:现 300×170 待重定,重定后按比例重出
|
||||||
2. **围墙高度**:桩身 150(出图 300)、门柱 164(出图 328)、门洞 84(出图 168);墙高须大于门洞高
|
2. **门扇高宽**:现 240×220,围墙带只有 43px 高;围墙独立成层后门扇叠在门洞上,两者高宽关系待裁
|
||||||
3. **门扇尺寸**:显示矩形 240×147(贴图可见高 138),门扇件沿用现 240×211 由运行时压扁(2026-11-07 用户裁「不动美术素材」),x 对齐门洞 520–760、底压墙底 → (520, 282)
|
3. **布告板位置**:现 y330 悬空在围墙下方,建议 `(845, 268, 130, 140)` 挂回围墙带
|
||||||
4. **帐篷**:251×170 沿用现终稿,落位 (982, 335),遮住墙下部 32px(覆盖围墙可接受)
|
4. **描边颜色追认**:本卡按奶油色(去底技术前提);若改参照物的深灰褐,需换去底方案
|
||||||
5. **笔记本**:随帐篷跟随,落在帐篷左下方外侧、两者不重叠——`x = 帐篷 x − 112`、`y = 帐篷底 + 10`
|
5. **营地环境子板色值**:art-bible §4.1 为数值单点,色值待作者拍板,本卡不复述
|
||||||
6. **宝箱离底**:贴图底 y744,距画面底 56px;其余物件同步上移 46px
|
|
||||||
7. **地面分两区**:营地外(y734 以上)=晒白的浅黄绿草地+一条向远山收窄的暖米白土路;营地内(y734 至画面底)=正午太阳下晒到泛白的踩实米黄土地、与草地异色相、无草无路无车辙;两区分界被围墙层完全遮住
|
|
||||||
8. **背景层分两片出图**:远景片 `bg_far`(2560×734,天空 14%/远山 41%/草地 45%+小路)+ 地面片 `bg_floor`(2560×866 踩实裸土),后处理按 y734 拼成一张 2560×1600;接缝落在围墙 406–734 背后。分片理由=整张出图时模型把山挤到画面下半部,实测三张里两张山体整段被围墙遮没
|
|
||||||
9. **布告板位置**:(845, 241, 130, 121)(2026-11-07 随墙顶),底 362 落在墙内(墙 220–420);命中 130×140
|
|
||||||
10. **描边颜色**:奶油色追认——去底脚本「奶油描边膨胀 3px 当屏障」的技术前提随现值锁定(§1 注记同源);改深灰褐须换去底方案全量重出,不裁
|
|
||||||
11. **营地环境子板色值**:不前置拍板——量化场景实际用色后按 art-bible §4.1 两道门登记(语义检查+RGB 三通道差 ≥8/255),本卡仍不复述色值
|
|
||||||
12. **围墙显示几何与墙脚入土(2026-11-07 用户裁)**:围墙显示矩形 `(0, 220, 1280, 200)`(顶 y220、高 200、底锚 y420);大门 240×138 尺寸不变、底压墙底 → `(520, 282)`;告示板 130×121 尺寸不变、随墙顶下移 17px → `(845, 241)`;墙脚按 1–7px 低频起伏裁透明缺口透出地面纹理(入土线,判据归 art-bible §6.2)
|
|
||||||
13. **其余六件落位(2026-11-05 用户裁;2026-11-08 复核补录)**:dummy `(340, 474, 120, 180)`/命中同矩形;forge `(40, 421, 240, 193)`/命中 `(40, 374, 240, 240)`;tent `(982, 335, 251, 170)`;chest `(1097, 654, 106, 90)`/命中 `(1085, 654, 130, 90)`;notebook `(870, 515, 100, 66)`/命中 `(870, 501, 100, 80)`;campfire `(560, 525, 160, 149)`/命中 `(560, 594, 160, 80)`。行内四元组=texture_rect `(x, y, w, h)`,「命中」=hotspot;运行期唯一事实源仍是 `game/data/tables/camp_scene_layout.tres`。
|
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
- **兜帽披肩**:兜帽**不戴在头上**,取下披于肩上——露出棕色短发与整脸(表情可读),蓝色兜帽披在肩头仍是最近的"己方"识别点;三态同款披肩。
|
- **兜帽披肩**:兜帽**不戴在头上**,取下披于肩上——露出棕色短发与整脸(表情可读),蓝色兜帽披在肩头仍是最近的"己方"识别点;三态同款披肩。
|
||||||
- **圆头挖掘铲(武器)**:持铲不持剑——**铲 = 本作核心动词"挖安全格"的角色化**,挖掘与攻击共用同一动作语义(攻击表现即挥铲,后续攻击类表现优先围绕铲展开)。画法:圆头铲刃 + 木柄(木柄走木色族 `#8A5A34`,铲刃浅铁灰、不做冷灰重甲质感);**待机态 = 铲插立在地上、一只手扶在铲柄顶端**;攻击/受击态仍为手持。刀光/铲击光效/弹道不进精灵图(归战斗演出另立资产)。
|
- **圆头挖掘铲(武器)**:持铲不持剑——**铲 = 本作核心动词"挖安全格"的角色化**,挖掘与攻击共用同一动作语义(攻击表现即挥铲,后续攻击类表现优先围绕铲展开)。画法:圆头铲刃 + 木柄(木柄走木色族 `#8A5A34`,铲刃浅铁灰、不做冷灰重甲质感);**待机态 = 铲插立在地上、一只手扶在铲柄顶端**;攻击/受击态仍为手持。刀光/铲击光效/弹道不进精灵图(归战斗演出另立资产)。
|
||||||
- **冒险背包与背包旗(身份件)**:背负**结构式冒险背包**——翻盖+皮扣带的帆布背包(暖卡其布面,皮革件走木色族),**宽 ≈1.5× 体宽**:双肩背负、两侧各略超出身形一点;**禁圆麻袋化**(措辞弃"鼓胀掳获袋")、**禁特里式 3× 超宽**(反面参照:旷野之息特里;正面参照:合金弹头双主角大背包、超级马里奥奇诺比奥队长)。**旗杆插在背包一侧**(不要求完整可见,**被头部遮挡一部分亦可**),旗子**尺寸大于头部**,短杆**矩形**旗旗面 = **旗朱红 `#C63D22`**(人设背包旗与棋盘封印色**脱钩**——封印色仅作用于棋盘格封印旗,色史归 art-bible §4.1;人设旗形为矩形非三角,以 normal/hit 定稿成图为基准),把"宣告落旗"的角色化焊在人设上,主角即背包旗持有者(**动作呈现名 = 封印**,见 art-bible §3.2;背包旗**不**视作封印印记的携带形态——旗面旗朱红矩形,与棋盘封印黑旗形色均不同,仅保留"主角即背包旗持有者"的身份叙事)。三条纪律:①旗面红=旗朱语义**仅旗非服饰**(负向 `no red clothing` 不拦截正向 `red flag`——红服饰禁令与红旗的边界由正向句显式锁色值;封印黑仍为棋盘格封印旗专属色,圣经 §4.1 不变);②背包+旗 = 主角对 §5.1"对称"的**唯一破例组**(语义配件非装饰),旗面朝向恒定画右、跨素材一致;③轮廓凹凸预算按"背包+旗"整组记账,样张(圣经 §1.4)验证背负后剪影仍窄、仍可辨、不超格宽。
|
- **冒险背包与背包旗(身份件)**:背负**结构式冒险背包**——翻盖+皮扣带的帆布背包(暖卡其布面,皮革件走木色族),**宽 ≈1.5× 体宽**:双肩背负、两侧各略超出身形一点;**禁圆麻袋化**(措辞弃"鼓胀掳获袋")、**禁特里式 3× 超宽**(反面参照:旷野之息特里;正面参照:合金弹头双主角大背包、超级马里奥奇诺比奥队长)。**旗杆插在背包一侧**(不要求完整可见,**被头部遮挡一部分亦可**),旗子**尺寸大于头部**,短杆**矩形**旗旗面 = **旗朱红 `#C63D22`**(人设背包旗与棋盘封印色**脱钩**——封印色仅作用于棋盘格封印旗,色史归 art-bible §4.1;人设旗形为矩形非三角,以 normal/hit 定稿成图为基准),把"宣告落旗"的角色化焊在人设上,主角即背包旗持有者(**动作呈现名 = 封印**,见 art-bible §3.2;背包旗**不**视作封印印记的携带形态——旗面旗朱红矩形,与棋盘封印黑旗形色均不同,仅保留"主角即背包旗持有者"的身份叙事)。三条纪律:①旗面红=旗朱语义**仅旗非服饰**(负向 `no red clothing` 不拦截正向 `red flag`——红服饰禁令与红旗的边界由正向句显式锁色值;封印黑仍为棋盘格封印旗专属色,圣经 §4.1 不变);②背包+旗 = 主角对 §5.1"对称"的**唯一破例组**(语义配件非装饰),旗面朝向恒定画右、跨素材一致;③轮廓凹凸预算按"背包+旗"整组记账,样张(圣经 §1.4)验证背负后剪影仍窄、仍可辨、不超格宽。
|
||||||
- **护目镜与腰灯**:**护目镜推在额前**(兜帽披肩后直接戴于额上,不戴眼上——眼睛是表情载体;皮革带+圆镜片,防尘挖掘者的职业信号);**提灯挂腰间,定案不手持**(小号铜色提灯,**不点亮**;空间光照走圣经 §2 明度分层,**提灯点亮为候选**,点亮形制(光晕半径/暖色值/与舞台光照关系)归整屏样张重议;头部饰品唯一化,头灯方案已弃)。
|
- **护目镜与腰灯**:**护目镜推在额前**(兜帽披肩后直接戴于额上,不戴眼上——眼睛是表情载体;皮革带+圆镜片,防尘挖掘者的职业信号);**提灯挂腰间,定案不手持**(小号铜色提灯,**不点亮**;空间光照属圣经 §2 明度分层允许域,**提灯点亮为候选**,点亮形制(光晕半径/暖色值/与舞台光照关系)归整屏样张重议;头部饰品唯一化,头灯方案已弃)。
|
||||||
- **衣着细节**:**棕色半指手套**(挖土护手,露指保灵巧读感)+ **裤脚卷起、棕色皮护膝**(挖掘跪地的工装感)——小件走皮革木色族,不占剪影凹凸预算,不新增语义色。
|
- **衣着细节**:**棕色半指手套**(挖土护手,露指保灵巧读感)+ **裤脚卷起、棕色皮护膝**(挖掘跪地的工装感)——小件走皮革木色族,不占剪影凹凸预算,不新增语义色。
|
||||||
- **三态**:① 待机 = 窄、直立、对称(§5.1 小人原型,含背包、旗与提灯记账);② 攻击 = 允许破对称,整体仍窄、不超格宽;③ 受击 = 无血红、无伤害数字(伤害数字归 HUD 层,不进精灵图)。
|
- **三态**:① 待机 = 窄、直立、对称(§5.1 小人原型,含背包、旗与提灯记账);② 攻击 = 允许破对称,整体仍窄、不超格宽;③ 受击 = 无血红、无伤害数字(伤害数字归 HUD 层,不进精灵图)。
|
||||||
- **随身件 = 秘宝形象候选池**:铲、旗、背包、提灯四件随身件是未来秘宝设计的**形象候选池**——道具实装可借用主角身上已有的同款(彩蛋闭环:玩家在道具栏认出主角身上的物件);具体道具语义/数值归秘宝 GDD,人设侧义务 = 四件画得出来、认得出。
|
- **随身件 = 秘宝形象候选池**:铲、旗、背包、提灯四件随身件是未来秘宝设计的**形象候选池**——道具实装可借用主角身上已有的同款(彩蛋闭环:玩家在道具栏认出主角身上的物件);具体道具语义/数值归秘宝 GDD,人设侧义务 = 四件画得出来、认得出。
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
- **主色域 = 物种本色**,不受圣经 §4.2 语义色禁则约束(该禁则管格面与 UI 的逻辑色,角色身体主色豁免);**两例外**:禁入带 300°–345° 全角色禁入(仅 drider/duergar_king 两 Boss 独占)、蓝族禁入敌方主色(§5.4 同款)。
|
- **主色域 = 物种本色**,不受圣经 §4.2 语义色禁则约束(该禁则管格面与 UI 的逻辑色,角色身体主色豁免);**两例外**:禁入带 300°–345° 全角色禁入(仅 drider/duergar_king 两 Boss 独占)、蓝族禁入敌方主色(§5.4 同款)。
|
||||||
- **L2 熊地精 = bugbear 复用**(第二关三行,显示名熊地精系,非独立键):同剪影**换色板不换形**(色板替换走脚本管线——原则三"先换色板"的角色侧应用);变体主色避小人蓝族与禁入带。
|
- **L2 熊地精 = bugbear 复用**(第二关三行,显示名熊地精系,非独立键):同剪影**换色板不换形**(色板替换走脚本管线——原则三"先换色板"的角色侧应用);变体主色避小人蓝族与禁入带。
|
||||||
- 每敌种出 2–3 版候选(清单 §2.2);受击反馈/死亡表现/顺位标记三类呈现下限见圣经 §4.6.4 资产需求行。
|
- 每敌种出 2–3 版候选(清单 §2.2);受击反馈/死亡表现/顺位标记三类呈现下限见圣经 §4.6.4 资产需求行。
|
||||||
- **立绘显示档(定值单点 = 圣经 §8.2 站桩立绘显示档条,本档指路不复述)**:三档绝对高,逐件归档、源档与缩放规则一律见圣经 §8.2——**数值权威 = 圣经 §8.2 指向的执行件**(定值单点纪律,圣经头注);归档经三体型约束校验(§5.2)确认;派生管线与排版规范同归圣经 §8.2。
|
- **立绘源档高(定值单点 = 圣经 §8.2 立绘源档表,本档指路不复述)**:八敌 36–94 逐键定档 + 主角 48 不变、显示一律 ×2 整数档(NEAREST)——**数值权威一律圣经 §8.2**(定值单点纪律,圣经 §8 头注);定档经三体型约束校验(§5.2)确认;派生管线与排版规范同归圣经 §8.2。
|
||||||
- **钩爪恐魔「宽≥高」豁免登记(待样张终审)**:定档源 58 高窄条束状剪影(长臂圆钩),宽高比 <1,与 §5.1 普通怪「近圆墩形宽≥高」冲突——按体量=生物天性(§5.2)登记豁免:以长臂束状轮廓为识别锚,不强行压成墩形;样张(圣经 §1.4)终审复验灰度剪影可辨性。
|
- **钩爪恐魔「宽≥高」豁免登记(待样张终审)**:定档源 58 高窄条束状剪影(长臂圆钩),宽高比 <1,与 §5.1 普通怪「近圆墩形宽≥高」冲突——按体量=生物天性(§5.2)登记豁免:以长臂束状轮廓为识别锚,不强行压成墩形;样张(圣经 §1.4)终审复验灰度剪影可辨性。
|
||||||
|
|
||||||
## 5.6 意图准备动画三档(规格承载节)
|
## 5.6 意图准备动画三档(规格承载节)
|
||||||
|
|||||||
@@ -24,24 +24,6 @@
|
|||||||
| probe_dust | 显影尘 | 未投值(effect_kinds 空)——设计方向=信息显影(把玩家暂时看不到的棋盘信息还给玩家) | 退役(2026-10-10 用户裁第一版全弃用) | 2026-10-10 用户裁 |
|
| probe_dust | 显影尘 | 未投值(effect_kinds 空)——设计方向=信息显影(把玩家暂时看不到的棋盘信息还给玩家) | 退役(2026-10-10 用户裁第一版全弃用) | 2026-10-10 用户裁 |
|
||||||
| catacomb_scroll | 地穴全图卷 | 未投值(effect_kinds 空)——名义指向地穴全图揭示 | 退役(2026-10-10 用户裁第一版全弃用) | 2026-10-10 用户裁 |
|
| catacomb_scroll | 地穴全图卷 | 未投值(effect_kinds 空)——名义指向地穴全图揭示 | 退役(2026-10-10 用户裁第一版全弃用) | 2026-10-10 用户裁 |
|
||||||
|
|
||||||
## 表一附:退役效果词面留底
|
|
||||||
|
|
||||||
> 所属线=道具/秘宝。下列词面是旧目录时代秘宝数据行的效果类型标识,旧目录退役后不再由任何现行数据行使用;留底供日后重新准入时查证,不构成现行词表。
|
|
||||||
|
|
||||||
| 词面 | 关联旧件 | 旧效果 |
|
|
||||||
|---|---|---|
|
|
||||||
| mine_reveal | 探巢摆钟、爆破工兵包 | 真视 3×3 |
|
|
||||||
| reward_preview | 探宝罗盘 | 预读 3×3 |
|
|
||||||
| ap_grant | 工兵令、爆破工兵包 | 一次给 2 或 4 点行动点 |
|
|
||||||
| mine_hit_halve | 惊巢反制 | 踩雷惩罚减半 |
|
|
||||||
| reflect_damage | 惊巢反制 | 受击反弹伤害 |
|
|
||||||
| ap_rounds_front | 工兵晨令 | 开局前几轮每轮 +1 行动点 |
|
|
||||||
| cell_removal | 爆破工兵包 | 中立移除危险格(棋盘事实不可变契约下已废止) |
|
|
||||||
| reward_weight_bias | 偏运硬币 | 摇号稀有资源权重偏置 |
|
|
||||||
| bonus_refresh | 三选一刷新件 | 三选一刷新次数加算 |
|
|
||||||
|
|
||||||
效果引擎侧另有 bias_wallet:原预期为偏运硬币在摇号上影响金币面;现行由 bias_rewards 承载摇号权重偏置、grant_gp 承载 GP 入账,该词面无独立效果。
|
|
||||||
|
|
||||||
## 表二 专长退役 27 件
|
## 表二 专长退役 27 件
|
||||||
|
|
||||||
只读引用 `game/data/tables/feats.tres` 现行 27 行(feat_id 与 display_name;效果不抄——效果以表为事实源,此处仅留名单)。
|
只读引用 `game/data/tables/feats.tres` 现行 27 行(feat_id 与 display_name;效果不抄——效果以表为事实源,此处仅留名单)。
|
||||||
@@ -90,14 +72,6 @@
|
|||||||
| 换装券 | 冒险中可在节点处换装一次 | 终裁装配只在冒险开始前配置、冒险中零更换途径——无此件存在空间 | 2026-10-11 |
|
| 换装券 | 冒险中可在节点处换装一次 | 终裁装配只在冒险开始前配置、冒险中零更换途径——无此件存在空间 | 2026-10-11 |
|
||||||
| 第四只手 | 同调位 +1(额外格=优秀格) | 净收益为零的自指件——占一槽换一槽(真实携带量 3=3)且自锁唯一稀有格 | 2026-10-11 |
|
| 第四只手 | 同调位 +1(额外格=优秀格) | 净收益为零的自指件——占一槽换一槽(真实携带量 3=3)且自锁唯一稀有格 | 2026-10-11 |
|
||||||
|
|
||||||
## 表五 重设计件退役(2026-11-07 起)
|
|
||||||
|
|
||||||
已实装 `feats.tres` 后退役的重设计专长,留底供日后重新过准入(回收须过准入校验/分界尺/定义卡三关,与其他素材库件同规)。
|
|
||||||
|
|
||||||
| 代号 | 效果 | 退役原因 | 退役日期 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 破封一击 | on 挖开有封印印记的危险格:额外 +1 层(疼痛记忆同账) | 触发路径删除——「封印受理即揭示、封印格拒绝挖掘」口径换代后「挖开封印格」不复存在,专长永远无法触发(2026-11-07 用户裁) | 2026-11-07 |
|
|
||||||
|
|
||||||
## 备选素材(未立项提名,2026-10-10 用户令增设)
|
## 备选素材(未立项提名,2026-10-10 用户令增设)
|
||||||
|
|
||||||
> 本节收纳**曾被提名但从未立项、零设计细则**的备选概念——只记提名出处与当前结构前提,不做详细设计;是否立项、立项后怎么设计,待用户另议。与退役表不同:这些件从未落过数据表或正文设计,回收时无「原效果」可考,须从头过定义卡。
|
> 本节收纳**曾被提名但从未立项、零设计细则**的备选概念——只记提名出处与当前结构前提,不做详细设计;是否立项、立项后怎么设计,待用户另议。与退役表不同:这些件从未落过数据表或正文设计,回收时无「原效果」可考,须从头过定义卡。
|
||||||
|
|||||||
@@ -2,20 +2,23 @@
|
|||||||
|
|
||||||
## 文档状态
|
## 文档状态
|
||||||
|
|
||||||
- 版本:3.0(依赖规则形态——分层/目录归属/数据流/原则;模块级归属登记与模块对接口契约均不进本文:前者归代码文件头注,后者规范源单点=各系统 GDD、执法=静态扫描域与契约测试)
|
- 版本:1.26
|
||||||
|
- 最近更新:2026-10-30(迭代 42 反哺点落文——ShopSession 行对外暴露格按委托壳拆除后实测直连面重写:完整直连方法清单+set_shop_pool 调用面改述;沿革查 git)
|
||||||
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
|
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
|
||||||
- 评审模式:solo(`review-mode.txt`——门禁按 solo 跳过)
|
- 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调)
|
||||||
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
|
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
|
||||||
- 事实源地位:本文是架构约束的唯一权威(分层/目录归属/数据流/架构原则);写权限=用户专属(agent 与技能只读)
|
- 事实源地位:本文是架构事实的唯一来源——分层/所有权/数据流/API 边界/测试与质量域均以本文为准;历史决策沿革查 git commit log,不另设决策文档体系
|
||||||
- 实现实证:`game/`(完整游戏开发版本;本文分层与所有权经实现验证)。测试层级=冒烟/单元/系统三级+UI 探针与渲染 golden,识别三元组权威=`design/engineering/test-conventions.md`「测试层三元组」节
|
- 实现实证:`game/`(2026-09-10 起开发,**现为完整游戏开发版本,已非垂直切片**;测试层级=冒烟/单元/集成/系统四级+UI 探针与渲染 golden(2026-10-22 用户裁,测试术语与层级重构批),闸机按改动域分跑在役)——本文档的分层/所有权/数据流均经实现验证,非纯纸面设计
|
||||||
|
- 技术总监签核:2026-09-12 — 有条件通过(原条件「决策记录须于正式工程骨架前定稿」已满足:骨架已成、沿革在 git 历史可查;`.claude/docs/director-gates.md` 缺失已登记技术债)
|
||||||
|
- 主程序可行性:跳过 — solo 模式
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 引擎知识缺口摘要
|
## 引擎知识缺口摘要
|
||||||
|
|
||||||
- 引擎事实现行事实源=`design/engineering/engine-reference/godot/`(VERSION / breaking-changes / deprecated-apis / current-best-practices 四件)——迁移核实结论、语义变化与编码注意一律查那里,本文不重复。
|
- 引擎事实现行事实源=`design/engineering/engine-reference/godot/`(VERSION / breaking-changes / deprecated-apis / current-best-practices 四件)——迁移核实结论、语义变化与编码注意一律查那里,本文不重复。
|
||||||
- 渲染器与窗口基座=gl_compatibility + 1280×800;UI/渲染域为引擎风险集中地,采纳引擎增量前对照 engine-reference 核实。
|
- 渲染器与窗口基座=gl_compatibility + 1280×800(2026-09-12 裁);UI/渲染域为引擎风险集中地,采纳引擎增量前对照 engine-reference 核实。
|
||||||
- 写码纪律不变:不确定的 API 一律查 `docs.godotengine.org/en/4.7/` 核实后再用。
|
- 写码纪律不变:不确定的 API 一律查 `docs.godotengine.org/en/4.7/` 核实后再用;4.8(dev 阶段)稳定版发布后跑 `/setup-engine refresh`。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -30,7 +33,7 @@
|
|||||||
│ D4 音频 (Beta) · D5 教学引导 (Beta) │
|
│ D4 音频 (Beta) · D5 教学引导 (Beta) │
|
||||||
├────────────────────────────────────────────────────────────┤
|
├────────────────────────────────────────────────────────────┤
|
||||||
│ 功能层 │
|
│ 功能层 │
|
||||||
│ B1 战斗结算编排 (MVP) · C1 关卡节点地图 │
|
│ B1 战斗结算编排 (MVP) · C1 关卡节点地图 (lite 已实装) │
|
||||||
│ C2 冒险结构 · C3 难度曲线 · C4 元进度 (Alpha) │
|
│ C2 冒险结构 · C3 难度曲线 · C4 元进度 (Alpha) │
|
||||||
├────────────────────────────────────────────────────────────┤
|
├────────────────────────────────────────────────────────────┤
|
||||||
│ 核心层 │
|
│ 核心层 │
|
||||||
@@ -60,13 +63,13 @@
|
|||||||
| B2 敌人系统 | 核心层 | MVP | ✅ 完整可跑 | LOW(纯逻辑) |
|
| B2 敌人系统 | 核心层 | MVP | ✅ 完整可跑 | LOW(纯逻辑) |
|
||||||
| B4 地图战斗资源 | 核心层 | MVP | ✅ 完整可跑 | LOW(纯逻辑) |
|
| B4 地图战斗资源 | 核心层 | MVP | ✅ 完整可跑 | LOW(纯逻辑) |
|
||||||
| B1 战斗结算编排 | 功能层 | MVP | ✅ 完整可跑(禁 await) | LOW(纯逻辑) |
|
| B1 战斗结算编排 | 功能层 | MVP | ✅ 完整可跑(禁 await) | LOW(纯逻辑) |
|
||||||
| C1 关卡节点地图 | 功能层 | MVP | ✅ | LOW |
|
| C1 关卡节点地图 | 功能层 | MVP(切片期实装) | ✅(切片 level_runner 先例) | LOW |
|
||||||
| C2 冒险结构 | 功能层 | MVP | ✅ | LOW |
|
| C2 冒险结构 | 功能层 | MVP(切片期实装) | ✅ | LOW |
|
||||||
| C3 难度曲线 | 功能层 | MVP | ✅ | LOW |
|
| C3 难度曲线 | 功能层 | MVP(切片期实装) | ✅ | LOW |
|
||||||
| C4 元进度 | 功能层 | Alpha | ✅ | LOW |
|
| C4 元进度 | 功能层 | Alpha | ✅ | LOW |
|
||||||
| D1 HUD | 呈现层 | MVP | ❌(UI 层——场景级探针测试承载) | **MEDIUM**(Control/Input/文本域) |
|
| D1 HUD | 呈现层 | MVP | ❌(UI 层——场景级探针测试承载) | **MEDIUM**(Control/Input/文本域) |
|
||||||
| B5 战斗表现 | 呈现层 | 切片后立项(未实装,前置战斗表现美术测试) | ❌ | **MEDIUM**(Animation/Tween/渲染) |
|
| B5 战斗表现 | 呈现层 | 切片后立项(未实装,前置战斗表现美术测试) | ❌ | **MEDIUM**(Animation/Tween/渲染) |
|
||||||
| D4 音频 / D5 教学 | 呈现层 | Beta(与游戏内容无关者一律排 Beta) | 部分 | LOW-MEDIUM |
|
| D4 音频 / D5 教学 | 呈现层 | Beta(2026-10-13 Alpha 版本标准裁:与游戏内容无关者一律排 Beta) | 部分 | LOW-MEDIUM |
|
||||||
| D3 存档序列化 | 基础层 | Alpha | ✅ | LOW |
|
| D3 存档序列化 | 基础层 | Alpha | ✅ | LOW |
|
||||||
| D6 设置/本地化 | 基础层 | 完整愿景 | ✅ | LOW |
|
| D6 设置/本地化 | 基础层 | 完整愿景 | ✅ | LOW |
|
||||||
|
|
||||||
@@ -74,43 +77,133 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 目录归属
|
## 模块归属
|
||||||
|
|
||||||
> 目录=层级的物理承载:同一目录内的文件同层级、同受该层约束属性管辖,职责各自独立、归各文件头注(`##` 文档注释)承载;领域不做目录切分,仅当领域大到内部再需要一层时才立子目录。命名遵循 `design/engineering/code-conventions.md`:领域命名、禁 ID 前缀。逻辑依赖层级(基础/核心/功能/呈现)见「系统分层图」——`game/core/` 一目录内按依赖层级再分三段,层级约束由分层图与架构原则承载,目录不再切分。
|
> 命名遵循 `design/engineering/code-conventions.md`:领域命名、禁 ID 前缀(文件头注不写文档链接——「实现 GDD:xxx」一类已废止,代码↔设计追溯由 GDD 文档承担)。切片已按此规范完成领域命名批。
|
||||||
|
|
||||||
| 目录 | 层级作用 | 该层约束属性 |
|
### 基础层
|
||||||
|---|---|---|
|
|
||||||
| `game/core/` | 全部玩法逻辑的承载(配置、RNG、存档域件、棋盘生成、排雷规则、经济与账本、效果引擎、战斗编排、关卡与冒险域件)——依赖逻辑层级内分基础/核心/功能三段,见分层图 | 纯逻辑:零 Control/场景引用、构造注入、fail-fast、`--headless --script` 完整可跑、玩法数值零字面量(读 `game/data/tables`)、随机只经封闭流 |
|
|
||||||
| `game/core/settlement/` | 领域子目录——战斗结算五段段件(领域大到内部再需要一层时切分的在案先例) | 同 core;段类可直接 new() 单测、段类对编排器零引用 |
|
|
||||||
| `game/presentation/` | 呈现层——全部 Control/CanvasLayer、输入→意图翻译、组合根装配 | 视图零核心写调用(信号外发为主)、组合根=核心写调用唯一出口、呈现数据只走成文快照面;引擎风险域对照 breaking-changes |
|
|
||||||
| `game/data/` | 数据承载——玩法数值表(tables/*.tres)与字段契约(schemas/*.gd),对应基础层 D2 数据配置 | 数值单一事实源;表值直接改变游戏运行结果 |
|
|
||||||
| `game/tests/` | 测试域——冒烟/单元/系统三闸承载 | 依赖只经 autoload 边界与场景契约两类入口;禁反向依赖呈现层实现内部 |
|
|
||||||
| `game/probe/` | 探针域——场景级探针与取证探针 | 同测试域边界;在闸件与手动测量件两分 |
|
|
||||||
| `game/sim/` | 测量域——MC/调参/数值验证驱动件 | 不入 CI、用户手动发起、随机显式定种 |
|
|
||||||
|
|
||||||
**依赖单向性**:上层可消费下层,禁止反向(C3 禁调用 A1 生成、D1 不直调 A3、A2/B3/B4 零相互直调)。全项目唯一回边=A2 事件订阅面。
|
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **ConfigDB**(autoload,D2) | 全部玩法数值表与表现层布局配置表(`data/tables/*.tres` + `data/schemas/*.gd`);SCHEMA_VERSION;加载/校验/override/诊断状态机。**行族访问器归位各 schema 表类(表管自己的行查询),本类只留加载/校验/override/诊断门面;表持有成员按域收进四张域容器 Resource(`config_domain_combat/run/crossrun/presentation.gd`——前三件迭代 41 已建件,第四件表现层布局域 2026-10-30 建件,类型化成员 7/7/5/1);三张 resolver 表(board_gen.resolve_row/enemy.resolve_rowset/difficulty.resolve_modifiers)经 `load_tables` 装配段注入各容器,resolver 文件与键零搬移**——红线不变:本类仍是唯一加载与持有单点,"经 ConfigDB 单点读取"=经其持有的表对象 | 类型化域容器属性(每域一张容器);公开面 8(push_diag/is_fatal/reset_diagnostics/diagnostics/diagnostics_count/load_tables/set_reload_gate/reload)、类变量 10 | 无(基础层顶点) | Resource/.tres 加载、autoload 生命周期——LOW |
|
||||||
|
| **SlotStore**(`core/slot_store.gd`,D3 存档槽位域件,已建件——迭代 41 存量债批) | 存档三槽位文件域唯一所有者(自 save_manager 收编槽位族):槽位挂载与模板、激活与建删、槽位摘要窥视(peek 族);改名覆盖原语(_rename_overwrite)留 save_manager(IO 原语单点) | 槽位读写原语族+摘要投影(公开 10/类变量 4;SaveManager 与菜单消费方经 `save.slots.` 直连) | save_manager(注入路径与模板配置);FileAccess——LOW |
|
||||||
|
| **MetaStateStore**(`core/meta_state_store.gd`,D3 存档内元进度数据件,已建件——迭代 41 存量债批) | 存档内元进度数据的读写唯一层(自 save_manager 收编 accessor 族:钥石/道具解锁/树节点与叉侧/锻造路线/同调/真视/计数器/摘要——数据读写原语,不含业务规则);save_manager 与 meta_progression 双 God Class 的共同病根=该数据域摊在两文件,本件即其归一 | 写口原语 13+只读投影 6(tree_state/forge_state/attune_state/career_state 四投影+keystone_balance/item_unlocked)=公开 19(add_keystone 私有 `_add_keystone`),零 _data 副本零缓存;MetaProgression 业务层与营地/锻造 UI 消费方经 `save.meta_state.` 直连(meta 的纯转发读方法已退役) | save_manager(序列化接线);FileAccess——LOW |
|
||||||
|
| **RngService**(autoload,D2) | master_seed、各流 scope 计数器(封闭流词表现值以 `RngServiceCore.PURPOSE_TAGS` 为准;增流走 P1 评审) | `set_master_seed()`(唯一调用方 C2);`open_stream(stream)` 有状态门面;`derive_at(stream, scope)` 纯函数;只读计数器 | ConfigDB(无) | 无——纯逻辑 |
|
||||||
|
| **action_economy**(A3) | AP/RAP 账本、last_round_end、轮次相位机 {Idle, Active, Waiting}、结束仲裁 | 意图与通知布尔面:notify_round_start / request_dig / request_stop / request_refresh / notify_settlement_done / notify_combat_end;预授权通道:grant_reserve_ap / finish_round_stop;ap/rap/phase 只读 | ConfigDB(ActionEconomyTable);effect_engine(事件发射 dispatch——基础层内同层引用);B1 回发 next_round_mode/battle_over | 无 |
|
||||||
|
| **variation 定义**(A4) | VariationTable schema(现行 6 行:六 region——贫矿脉 global 行 2026-10-16 用户令屏蔽删行,global 型机制代码保留)与 F1 候选池门控谓词 | `variant_pool(level_index, board_type, node_type="")`(门控三维:unlock+board_types+节点身份——global 行仅 boss/elite 入池,缺省跳过零扰动);`global_variant_row(level_index, board_type, node_type)`(全局型单行决议访问器) | ConfigDB(VariationTable) | 无 |
|
||||||
|
| **status_container**(B3) | 状态实例容器(战斗域生命周期、跨轮跨图延续) | 5 API:notify_battle_start / apply_effect / query_active / decay_round / notify_battle_end | ConfigDB(StatusEffectTable) | 无(RefCounted) |
|
||||||
|
| **effect_engine**(内容数据驱动扩展批 iter17 建域) | 零运行时可变状态的系统(见「架构原则」条 8):全同步解释器——事件由宿主在明确代码点位显式调 dispatch 进件,命中序=装载声明序(feats→treasure→树规则)写死保种子复放,不是事件总线/事件循环;事件/事实/效果类型/算子四词表封闭 + 树规则合成订阅六键(posture 每关首轮窗/sense 两组限次 counter 闸·adv_ 前缀走冒险桶跨战斗持久) | rebuild(每战重建订阅表)/`dispatch(ctx, event, payload, facts)`/`validate_trigger_row` + 静态计数口 `counter`·`counter_add`·`counter_spend`·`bucket_of`·`counter_id_legal`(计数器读写只经 EffectContext 引用束,无导出/灌入接口) | ConfigDB(feats/treasure 行集)、EffectContext(四桶引用由宿主持有:round/battle 桶归编排器、level 桶归关卡域、adventure 桶归应用层——RunLedger 已随迭代 39 拆件批退役,桶字典由 adventure_runner 持有) | 无(零随机全确定) |
|
||||||
|
| **save_system**(D3,Alpha;iter27 已升格 autoload「SaveManager」) | 存档格式与版本比较 | (契约规范源:`../../gdd/systems/表现与支撑/存档序列化.md`——契约锚:SAVE_FORMAT_VERSION + master_seed + 各流 scope 计数器快照,须在无正在执行中的 open_stream 实例时切出) | ConfigDB、RngService 只读计数器 | FileAccess——LOW |
|
||||||
|
| **settings/localization**(D6,愿景) | 设置项、翻译数据 | (契约规范源:`../../gdd/systems/表现与支撑/设置与本地化.md`) | ConfigDB | 无 |
|
||||||
|
|
||||||
|
### 核心层
|
||||||
|
|
||||||
|
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **board_generator**(A1) | 生成算法(五阶段管线)、BoardGenTable 回填、生成期指标集、合法性谓词(clearable / R₀≠S / min_safe)、可推理率度量(metric_version);生成姿态 = MVP 同步生成 + 加载幕(切片实证 10×10/12×12 同步可接受,WorkerThread 留扩展) | `generate(L, D, rng) -> Board`;度量独立入口×3(推理器 / F3 度量 / 合法性谓词——独立纯函数、同一实现) | ConfigDB(BoardGenTable/VariationTable);board_gen 流(一次 open_stream = 一张图);dig_ap_cost 只读 | 无 |
|
||||||
|
| **minesweeper_rules**(A2) | 棋盘状态(已开集 O / 封印集 G / 小人位)、三事件面、批次仲裁、install 四不变式 | `install_board(board)`;`settle_batch(intents)`(唯一提交入口);查询只读面(current_board / hero_pos / is_revealed / has_seal 等);`compute_move_path(cell)` 只读;`retire_board()`;三源拒绝(board_face / resource_face / phase)+ sub_reason 封闭枚举 | A1 产物(Board class_name 数据契约);A3 try_spend / last_round_end(迭代 41 由属性改方法)/ 相位 | 无(零表读取、零 UI——切片实证) |
|
||||||
|
| **unit_container**(B2) | hero/enemy 单位实例(hp/atk/实例池:池快照+冷却+摇定动作+保底计数)、行值快照 | spawn / query_alive / rollable_skills / special_skills / check_trigger_unlocks / set_pending_action / pending_action / basic_streak / commit_action / tick_cooldowns / apply_damage / heal / default_target / check_skill_unlocks / despawn_all(2026-09-16 敌人技能池批:query_beat/query_attack/advance 随行为环退役;rollable_skills/special_skills/check_trigger_unlocks 带 facts 参——2026-10-27 情境条件触发器实装,事实缺键=条件假拦下,百分比事实走阈值式折算) | ConfigDB(EnemyTable/SkillTable/HeroTable) | 无 |
|
||||||
|
| **reward_economy**(B4) | 格面资源身份映射(install 期预分配、Ready 只读、换图映射消亡)、极性路由字典面((类型, 极性)→ 字典行查询;路由执行归 B1 授予段)、F6 当量供给投影 | 封闭 API:roll_board / query_identity / query_full_snapshot / grant / grant_clear / retire_mapping / polarity_row / phase / weighted_pick;另有 is_mapped 静默布尔投影(批量工具用) | ConfigDB(RewardTable);BattleFxHost 经注入 Callable `luck_bias_query` 取偏运合计(reward_roll 发射与 bias_rewards 求和移至效果层完成);reward_roll 流(scope = 每次 install 批) | 无 |
|
||||||
|
| **helper_items**(A5,切片已实装秘宝域) | HelperItemTable、探测显影语义 | (契约规范源:`../../gdd/systems/跨局循环/秘宝.md`——桥接位:A2 查询接口 + A4 counter_item_ids) | A2 / A4 / B4 | 无 |
|
||||||
|
| **CurioDeck**(`core/curio_deck.gd`,A5 秘宝域令牌池件,迭代 37 自 AdventureRunner 拆出) | 三选一/商店共享池的持久多重集、抽签(候选抽取)、cap 库存与专长凭证三计数与判定唯一所有者——件只管池与判定,停点编排与兑付推进留冒险编排器 | `draw_candidates(channel)` 抽签;`consume_deck_token` / `consume_pool_purchase` 池消耗;`cap_ok` 上限判定;`feat_ticket_consider` 凭证判定;`stock_snapshot` / `pool_stock` 只读投影;商店购买消费经注入 Callable 链至 CurioStop 兑付单点(迭代 39 起转纯池——bind_handlers 反向回调已退役) | ConfigDB(秘宝令牌行集);注入 RngServiceCore(reward_pick 封闭流,禁自建随机) | 无(RefCounted 纯逻辑) |
|
||||||
|
| **ShopSession**(`core/shop_session.gd`,商店会话件,迭代 37 自 LevelRunner 拆出) | 关卡商店双模式(legacy 固定三件加定价/pool 共享令牌池)的货架、定价、购买与刷新唯一宿主——账本/钱包/装配集归宿主 LevelRunner(共享引用经 `bind` 注入,出账直接落同一引用改写宿主账本);legacy 模式零 RNG 零池消费(off 对照承载) | 货架与定价只读面(`shop_products` / `shop_shelf` / `current_price` / `shop_refresh_cost`)+写入口(`buy_product` / `buy_pool_item` / `shop_refresh` / `player_request_refresh` / `open_pool`);外部调用面=调用方经宿主 LevelRunner 公开成员 `shop` 直连(调用直连不留委托壳,2026-10-26 Middle Man 裁定;迭代 42 拆除),直连消费的方法=`shop_products`/`current_price`/`purchased_tier`/`buy_product`/`player_request_refresh`/`set_shop_pool`/`pool_price`/`shop_shelf`/`shop_refresh_free_left`/`shop_refresh_cost`/`shop_refresh`/`spend_gp`/`buy_pool_item`/`is_shop_pool`/`shop_bp_shelf`/`shop_bp_visit_buys`(另白盒两入口仅测试侧:`_draw_shelf`/`_spend_discounted`);set_shop_pool 调用面=pool 注入经 LevelRunner 构造 ctx 供给(构造期内部直调,原委托块注释「AdventureRunner._start_current_level 唯一调用方」系陈旧表述、随壳删除作废),测试面直连 `shop.set_shop_pool` | ConfigDB(商店行集);注入 RngServiceCore;宿主钱包/账本引用;pool 模式令牌消耗与判定经注入 Callable 转 CurioDeck | 无 |
|
||||||
|
| **HeroLedger**(`core/hero_ledger.gd`,冒险域主角实体账,已实装(2026-10-27 迭代 39 拆件批)) | 冒险生命周期主角数值与获得记录唯一所有者:生命与 GP 钱包(gain/spend/clear 单写原语,钱包事件发射点归件)、锻造强化快照、调试百分比、攻击/甲类型轴快照、特性持有集(活引用注入——关内兑付当关生效)、本局钥石增量与逐杀明细、真视使用记录;获得记录三层结构=获得记录列表(三选一件/商店购买/战末奖励各一条)→属性增益明细(带来源指回)→四轴汇总(由明细推导);生效上限与回血封顶公式单点归件 | 构造注入;单写原语族+只读投影;断点自交片段(账本键+获得日记键) | ConfigDB(表值读取);由 AdventureRunner 冒险开始创建、注入 CurioStop/level_runner/ShopSession/战斗 encounter | 无(RefCounted 纯逻辑) |
|
||||||
|
| **AttuneLoadout**(`core/attune_loadout.gd`,同调配装件,已实装(2026-10-27 迭代 39 拆件批)) | 装备中的秘宝件对象集唯一所有者(每件内含充能单位与重置周期);同调充能的物化行为唯一事实源——种行/补行改写时同步(RunLedger 充能字典轨与差额对账函数退役);旧档 aux_items 同调行迁移归件 | 构造注入;充能查询/消耗/按周期重置原语;断点自交片段(attunement_charges 键,键名与策略不变) | ConfigDB(秘宝行集);TreasureItems(同调行投放面);注入战斗使用路径 | 无 |
|
||||||
|
| **CurioStop**(`core/curio_stop.gd`,三选一停点件,已实装(2026-10-27 迭代 39 拆件批)) | 三选一停点编排唯一所有者(架构原则 9 本域承载):停点三态(关卡完成三选一在途/已兑付待推进/奖励节点三选一在途)、刷新三源账(刷新件 X/营地池 Y/刷新券存量/付费刷新计数)、兑付方法族(pick/refresh/redeem/skip)、凭证出箱(RAP/时沙待注入);三选一信号面自带;零自动推进停点语义承载 | 对外=开停点/刷新/兑付/放行谓词/交断点片段五组入口+信号面(curio_choice_presented/curio_resolved);由 AdventureRunner 关卡完成受理时调用 | ConfigDB;注入 CurioDeck(抽签/摘牌)与 HeroLedger(落账);随机只经 CurioDeck 的 reward_pick 封闭流 | 无 |
|
||||||
|
| **breakpoint_store**(`core/breakpoint_store.gd`,冒险域·断点组装与回放件,已建件——迭代 45) | 存档断点组装与回放唯一承载(自 adventure_runner 收编 6 成员+函数族):断点快照拼盘、回放回填、读侧策略分发;`BREAKPOINT_FIELDS` 27 键登记单源随件(键名/策略标签/键序冻结) | 构造=引用束注入(九引用束成员解包为原名成员——保迁移函数体逐字);`resume_adventure` 留宿主(壳+宿主侧回填语句——R2 所有权缝分家);断点键面零变化;实测类变量 15(贴顶禁再增) | adventure_runner(宿主);注入主角账三件与 curio/stop/bank/loadout 引用 | 无(RefCounted 纯逻辑) |
|
||||||
|
|
||||||
|
### 功能层
|
||||||
|
|
||||||
|
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **battle_orchestrator**(B1) | 段序骨架(七段结构冻结)、轮 facts 缓冲、可回放步骤流、[明细行协议](../../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)(基础行型+扩展行两层 + 字段分层,词表以 owner「明细流水」节为准)、条款③⑤闭合对账、**战斗域全部跨系统调用权**、效果引擎宿主面与树规则挂点施加面(**已拆出 BattleFxHost 并实装(2026-10-28 迭代 40——battle_fx_host.gd/reward_grant.gd 两件在库,效果引擎宿主面归 BattleFxHost 行承载,拆件细则见「战斗编排域拆件定稿」节);2026-10-29 零豁免裁设计闭合:RoundCycle/BattleFacts 两新件随批(宿主 38→15、S13 豁免第三条注销——见下两行与定稿节轴丁)**) | `begin_battle(encounter)`;窗口/刷新意图提交面(扮演 D1);`level_clear()`;步骤流(输出契约) | B2/B3/B4 全调用面(**唯一调用方=B1 域文件集:battle_orchestrator.gd + settlement/ 五段段类 + damage_controller + 拆件后三新件**);A3 request_refresh 代理 + 回发;A2 install/retire + 三事件订阅;A1 generate(attempt 非 scope 事件);D2 SettlementTable + set_reload_gate | 无(零随机、禁 await——切片 88 冒烟实证可回放) |
|
||||||
|
| **BattleFxHost**(`core/battle_fx_host.gd`,B1 域·效果引擎宿主件,2026-10-26 编排域拆件设计定稿——实现批建件) | 效果引擎挂点施加面唯一承载(自 battle_orchestrator 收编 fx 族):事件发射与事实判定(_fx_emit/_fx_fact)、主角 AC 基线与本轮/本战 AC 累积、bonus_delta 四轴累积(战末宿主 drain 汇入账本)、揭示待兑队列与兑付(含 _fx_revealing 再入闸——同步信号回环防二次缓冲二次兑付)、树规则合成订阅的 round/battle 桶计数器持有(桶随编排器生灭语义不变) | 构造=引用束注入(防 _init max-parameters 新键);bind 时注入 emit Callable(行发射经宿主协议面单点)与兑付 Callable(RewardGrant 授予面——揭示队列 flush 回调);只读投影分两类消费方:AC 累积/bonus_delta 供宿主呈现快照与战末 drain,揭示态供宿主 A2 订阅旁路判定;`luck_bias_for(cell_count) -> int` 偏运合计查询口(体内三参形 dispatch——reward_roll 发射与 bias_rewards 求和自 RewardEconomy 收回本件,RewardEconomy 经注入 Callable 消费) | EffectEngine(EffectContext 引用束);RngServiceCore(fx_reveal 封闭流——除该流外零随机);A2 minesweeper(板读与 fx_reveal 调用);A3 action_economy(queue_ap_delta/charge_layers 读);B3 status_container 读;B2 unit_container 读(hp_ratio);DamageController(set_hero_ac_override);ConfigDB;encounter 引用 | 无(零 await——效果引擎全同步解释器) |
|
||||||
|
| **RewardGrant**(`core/reward_grant.gd`,B1 域·奖励授予件,2026-10-26 编排域拆件设计定稿——实现批建件) | 奖励授予唯一兑付管线(自 battle_orchestrator 收编 grant 族):极性字典路由与封印溢价兑付(_grant_routed)、三种行应用(flat/percent/gp)、伤害单据提交面(_submit 族)、清图奖励与身份授予、秘宝使用编排(use_treasure 四步)、战斗域 GP 缓冲 escrow 与授予段暂存伤害闸(_defer_board_damage/_deferred_board) | use_treasure 编排入口(treasure_interact_controller 经组合根现值回调直连);授予入口(结算段类直调);只读投影(escrow 读与 GP 掉落合计——宿主呈现快照与 _roll_gp_drop 消费) | B4 RewardEconomy(polarity_row/grant);B1 域 DamageController(开单);BattleFxHost 引用(treasure_used 事件发射与计数器消耗);A2 minesweeper(校验回调/fx_reveal/remove_mines_in);A3 action_economy(相位闸/grant_ap/queue_ap_delta);B3 status_container(apply_effect/池读);B2 unit_container(hero_unit/heal);ConfigDB;注入 emit Callable、宿主 fatal Callable(battle_result 状态机唯一写点留宿主)、宿主 attune 读投影(_attune_safe_seen)、encounter 账本引用;TreasureItems 经宿主 setter 转发注入(库存注入时序在宿主构造之后) | 无(零随机零 await——授予期零随机口径,roll 值授予前已定) |
|
||||||
|
| **damage_controller**(B1 域·伤害单据管线) | 伤害单据唯一兑现管线(单据九栏目声明→分量掷点/克制修正/伤害下限归一→明细行发射;双方同规) | 兑付入口(编排侧开单)+ fx 揭示回调注入位 | B2 单位实例(单据目标传入);B1 注入(EffectContext 引用束与编排回调) | 无 |
|
||||||
|
| **BoardInstaller**(`core/board_installer.gd`,B1 域·装板域件,2026-10-29 尾波清偿批设计闭合——实现批建件,细则见「战斗编排域拆件定稿」节轴丙) | 棋盘安装与变异布置域唯一承载(自 battle_orchestrator 收编装板族六函数):生成受理、全局作用域变异决议、资源摇号资格域组装(roll_board 恰一次)、region 变异决议与连通片布置;BoardGenerator 实例随件自建自接线(宿主成员退役)——宿主侧装板后状态复位(封印/完美计数清零、板序推进、board_changed 发射、秘宝叠加层退役)留宿主薄壳,时序逐字保持 | `install(during_round) -> bool` 单入口;构造=引用束注入(rng/db/minesweeper/reward_economy/encounter 只读引用+宿主 fatal Callable——防 _init max-parameters 新键) | A1 board_generator(件内持有);A2 install_board;B4 roll_board/board_skew 写;A4 变异决议行集经 ConfigDB;board_gen/variant_place 两封闭流随件、流名与开流时点零漂移 | 无(零 await——装板全同步) |
|
||||||
|
| **RoundCycle**(`core/round_cycle.gd`,B1 域·轮循环驱动件,已建件——迭代 44) | 轮循环驱动域唯一承载(自宿主收编 7 成员):结算五段段件持有与驱动、重入门闸、开轮摇号、踩雷账 | 三参直构(host/fx_host_ref/reward_grant_ref——五段构造透传不落成员);段驱动入口由宿主接线调用;实测类变量 8/公开方法 3 | B1 宿主;settlement/ 五段段类;A3 相位读 | 无 |
|
||||||
|
| **BattleFacts**(`core/battle_facts.gd`,B1 域·战斗事实件,已建件——迭代 44) | 战斗事实域唯一承载(自宿主收编 14 成员):受理事实(encounter)、轮 facts 缓冲(reveals/seals/path)、封印判定账、事实溯源、同调快照读面;attune 状态两成员随件(行为函数留宿主) | 零参直构;宿主与段类经注入引用读写;实测类变量 15(贴顶)/公开方法 4(reset_round+三 mark 写口) | B1 宿主;A2/A3 只读 | 无 |
|
||||||
|
| **settlement/ 五段段类**(B1 域·结算段件) | B1 每轮结算序列的五段逻辑件(授予/增益减益/战斗/衰减/判定——细则见下「战斗域装配现状」节) | 段处理入口(B1 接线调用);可直接 `new()` 单测 | B2/B3/B4 兑付面与 B1 轮 facts 缓冲(各段按职责) | 无 |
|
||||||
|
| **level_runner**(C1-lite,切片已建) | 关卡域生命周期(节点链推进、共享 B4 + HP 携带、关卡末 level_clear) | 节点推进接口;LevelTable(`level.tres`——节点 enum {battle,reward,rest,boss}、末节点必须 Boss、ConfigDB 跨表校验⑧) | B1(直构 BattleOrchestrator 接线战斗)、ConfigDB LevelTable | 无 |
|
||||||
|
| **run_structure**(C2) | 冒险/关卡序列、失败重开、**master_seed 唯一接线方** | (契约规范源:`../../gdd/systems/冒险循环/冒险结构.md`) | RngService.set_master_seed、C3/D2 | 无 |
|
||||||
|
| **difficulty**(C3) | DifficultyTable 回填、全部曲线数值调参所有权、战斗期望表(切片 monte_carlo 为工具原型) | 调参输出(经 D2 R1 解析/编排器传递,禁反向调用生成) | ConfigDB、B1 对账输出(调参约束清单)、A1 报告 C | 无 |
|
||||||
|
| **meta_progression**(C4,Alpha) | MetaTable、钥石账本、天赋树域(MetaTreeTable 12 节点 v0.8——Fork 一节点双态/row 字段退役/RULE_KEYS 六键/彩蛋特化觉醒,迭代 21 T1 换代)+ 同调位槽位判定(树点亮数单源——T4 槽位收编)。**存档内元进度数据读写原语归 MetaStateStore——已落地(迭代 41):本类纯转发读已退役(消费方直连 meta_state),业务规则与写口编排留本类;hero_override 内联锻造加值与树淬炼 flat;并组三组(forge_select(kind,route_id)/hero_type_axes()→{attack,armor}/tree_camp_status()→{rows,fork_groups});补 meta_state 成员装配** | 公开面 20 定稿:buy_treasure_unlock / refresh_treasure_unlocks / treasure_shop_status / forge_buy_level / forge_buy_unlock / forge_select / hero_type_axes / forge_shop_status / settle_adventure / hero_override / tree_can_buy / tree_buy / tree_toggle_fork / tree_buy_fork / tree_rule_keys / tree_camp_status / toggle_attunement / attune_camp_status / attune_refresh_charges / buy_attune_refresh | D3、C2、ConfigDB | 无 |
|
||||||
|
|
||||||
|
### 战斗域装配现状(迭代 27——2026-10-17 用户裁写入;RunLedger 段已随迭代 39 拆件批退役,四账去向见下「冒险域拆分(现状登记)」节)
|
||||||
|
|
||||||
|
- **结算五段**:B1 编排器的每轮结算序列拆为 `game/core/settlement/` 五个段类——GrantSegment(①授予段,含封印判定与 counter/grant 助手单点)→ AuraSegment(②增益/减益段)→ CombatSegment(③战斗段)→ DecaySegment(④衰减段)→ VerdictSegment(⑤判定段,返回裁定,终局早退语义留 B1)。段序骨架冻结于 `SettlementTable.segment_order` 语义,B1 退为段序编排+接线;段类可直接 `new()` 单测(`settle_segments_test` 在役)。
|
||||||
|
|
||||||
|
### 战斗编排域拆件定稿(2026-10-26 用户裁写入——gdstyle 存量债波 1 设计闭合;同日独立审查(grilling+godot-master 双子代理)阻断 8 条去重 6 组全折入本节,v1.18;2026-10-28 迭代 40 实现批合回(合并提交 514457d1),本节为现状登记)
|
||||||
|
|
||||||
|
- **轴甲两件**:battle_orchestrator(1313 行/50 成员,S13 全库单文件最大户)按变化原因拆出 BattleFxHost(效果引擎宿主域)与 RewardGrant(奖励授予域)两协作件;宿主保留架构在册职责全部——战斗状态机与生命周期、轮 facts 缓冲(_facts_reveals/seals/path)、A2 三事件订阅、结算五段驱动、attune 族原位、行发射基建(_emit_row/_assert_row_source/_fatal)、呈现投影(presentation/diagnostic_snapshot 唯一出口不变)、刷新面、nest_preview_count(巢穴预告读数口——外部直读面 main.gd 与 treasure_effects_test 随批点名冻结)。拆件动机与残留债口径见待办清单「gdstyle 存量债全量清偿」条目。
|
||||||
|
- **轴丙一件(2026-10-29 尾波清偿批设计闭合——实现批建件)**:battle_orchestrator 装板域六函数(`_install_new_board`/`_resolve_global_variant`/`_place_variants`/`_place_variants_apply`/`_variants_fringe`/`_adjacent_to_packs`,约 140 行;全仓仅宿主三调用点——begin_battle/中途刷新受理/player_request_refresh,实查零外部调用)按变化原因拆出 BoardInstaller,职责语句「棋盘安装与变异布置域」(生成→全局变异决议→装板受理→资源摇号→变异布置;单一变化原因=棋盘设置顺序与变异布置算法)。形态两修正(实测裁,与初案「逐字搬运」之差):①宿主复位块不随件——`_install_new_board` 体内五处计数清零、板序推进、board_changed 发射与秘宝叠加层退役留宿主薄壳 `_install_and_reset`,三调用点改调薄壳、时序逐字;②`_board_generator` 全文件仅装板族使用——实例随件自建自接线(fatal 经注入 Callable),宿主成员退役(类变量 38→37,禁无效成员义务)。encounter(23 处跨宿主)与 _reward_economy(18 处)确认留宿主、经引用束注入。文件长键(1035/1000)随本件迁出归绿;attune 族与 begin_battle 受理段序禁动不变。
|
||||||
|
- **轴丁两件(2026-10-29 零豁免裁设计闭合——实现批建件)**:RoundCycle(轮循环驱动件)与 BattleFacts(战斗事实件)见功能层表两行——宿主 38(轴丙落地后 37)→15,S13 豁免第三条注销;宿主保留面改登记为「战斗状态机与生命周期、行发射基建(_emit_row/_assert_row_source/_fatal)、呈现投影(两快照出口签名不变)、刷新面、nest_preview_count」;attune 族处置由下一条改判;treasure_inventory 注入改址追认——原「外部赋值路径零改址」句失效,level_runner 经 RewardGrant 出口直注;成员级对账以需求卡片为卡内契约(开工 T0 复核)。
|
||||||
|
- **跨件单向接线**:RewardGrant 持 BattleFxHost 引用(treasure_used 事件发射与计数器消耗);BattleFxHost 对授予面走 bind 时注入的兑付 Callable(揭示队列 flush 回调)——禁双向强引用(两件均 RefCounted,环引用随每战新建泄漏)。行发射经 bind 时注入的 emit Callable(协议面单点留宿主——CurioDeck bind_handlers 同款先例,禁件回调宿主私有族);轮 facts 缓冲留宿主、fx 件经注入取值;_seal_consumed 留宿主(与 A2 seal_judged 订阅同域);fatal 经注入 Callable 转宿主 _fatal(battle_result 状态机唯一写点不变)。注入 Callable 亦属接线面、同单向纪律——禁为省参数改持对象引用。授予件对账本零强引用:战斗期消费经 `battle_hooks` 三键回调束(attune_consume/vision_add/negative_blast,bind_battle 缺键 assert),宿主侧三单点记账(2026-10-28 迭代 40 合并适配实装——RunLedger 类已随迭代 39 退役,直持对象引用无处可指)。
|
||||||
|
- **战斗域读面(RunLedger 退役后)**:账本读经编排器 `_journal()`/`_attune_loadout()` 现值派生(GainJournal/AttuneLoadout,enc 派生、无成员接收);冒险桶经 `enc["adv_bucket"]` 下传 `battle_fx_host.mount_buckets`;战末 bonus 四轴经 `GainJournal.gain_bonus` 汇入(2026-10-27 迭代 39 主角账三件落地、迭代 40 合并适配承接)。
|
||||||
|
- **settlement/ 段类随动**:段类构造注入直持宿主+两新件三引用(Middle Man 禁令封转发壳——调用点改指),授予段读写面点名:_grant_routed×5/_submit×6/escrow 写/_fx_new_resource_types/_feat_first_dig_used/_fx_bonus_delta 写/_apply_ac_bonus/_fx_enqueue_reveal/_flush_pending_reveals/_grant_clear_reward/counters_ctx;战斗段 _defer_board_damage 复位与 _deferred_board 结账改指 RewardGrant。四个授予段 helper(_feat_yield_adjust/_harmful_variants/_harmful_adjacent/_hits_of)与 _pool_effective/perfect_sweep_earned 留宿主(段类经宿主引用直调,现状形态)。
|
||||||
|
- **attune 族处置(2026-10-29 零豁免裁改判,原「原位保留」失效)**:attune 状态两成员归 BattleFacts、行为函数留宿主——迭代 39 副卡(AttuneLoadout 充能单源化)语义领地不破,外部三面消费点零改址;RewardGrant 经宿主 attune 读投影取 _attune_safe_seen 形态不变。
|
||||||
|
- **呈现零变化**:两快照出口签名与载荷逐字不变,内部改读两件只读投影(快照本体不读揭示态——揭示态投影消费方=宿主 A2 订阅旁路判定);treasure_interact_controller 三触点分家——use_treasure 经组合根现值回调改注 RewardGrant(每战新建编排器,禁一次性直引防悬挂),minesweeper 读与 attune_convert_state 仍走宿主取值回调(双取值面);nest_preview_count 直读面零变化。
|
||||||
|
- **S13 键账收敛义务**:12 个超标键随函数迁入新文件=基线外 NEW(use_treasure 长度/分支/局部/返回×4、_grant_routed 参数 8、_dispatch_row 参数 6、_apply_percent_row 参数 6、_apply_gp_row 参数 6、_apply_flat_row 参数 7+返回 9、_submit_flat_hero 参数 7、_fx_fact 返回 7)——卡内同步收敛为本波义务(_grant_routed 等签名随引用束注入改形、use_treasure 体拆分),禁波 0 合并 refresh 吸收新文件未还键;新件 _init 引用束注入防 max-parameters 新键。
|
||||||
|
- **验收红线**:游戏行为零变化(RNG 消费序零漂移——fx_reveal 封闭流随件迁移取号序不变、信号顺序契约冻结、明细行协议词表零触碰、同种子逐位一致);battle_orchestrator 头注发射点指址随拆件改写(词表不动,指址须真);行数恶化债清偿义务(迭代 38 特批带红合并挂账 c4c69701——本波还债归绿);S13 改善非清零口径(宿主残留 8–10 键+随迁键卡内收敛后新件零残留为达标线)。
|
||||||
|
- **S7/S8 随动**:RewardGrant 调 B4 API,两新件一并登记进 S7 B1 域文件集与 S8 结算路径 await 文件集(static_scan.sh 两清单独立、同批更新——防 await 面漏闸);轴丙 BoardInstaller 同规(调 B4 roll_board,实现批随批增行)。
|
||||||
|
|
||||||
|
### 冒险域拆分(现状登记——2026-10-26 设计闭合,2026-10-27 迭代 39 拆件批实装,本节各条即现行形态)
|
||||||
|
|
||||||
|
- **应用层形态**:adventure_runner 退出上帝对象、转薄应用层(DDD 应用层形态)——只留冒险状态机、关序推进、结算受理、建件接线、效果引擎冒险桶字典持有(桶=效果引擎域数据,应用层只锚定生命周期);零领域决策。核心层表三新件行(HeroLedger/AttuneLoadout/CurioStop)即本拆分目标。
|
||||||
|
- **CurioDeck 转纯池**:bind_handlers 反向回调退役;商店购买消费经注入 Callable 链至 CurioStop 兑付单点——牌库只管抽签/消耗/cap 判定/凭证计数。
|
||||||
|
- **RunLedger 退役**:四账各归其主——加算区/购买记录/钥石增量/特性集/真视记录归 HeroLedger,充能归 AttuneLoadout,冒险桶字典归应用层持有;战斗侧 encounter 注入面由单一账类引用改为多路(桶字典+实体账+配装件);ShopSession 账本引用面同步换代,商店属性商品加算改经 HeroLedger 单写原语。
|
||||||
|
- **level_runner**:依赖改构造注入一次给齐(后置 setter 群与商店重绑机制退役;注入活引用禁快照——特性集共享引用语义保留);商店白盒转发属性撤除;战斗→关卡信号转发族保留(战斗实例每节点新建,关卡层做战斗域稳定面)。
|
||||||
|
- **断点片段化**:各件自写自读自己的键(关卡层交关卡域五键片段:node_id/visited_ids/aux_items/shop_shelf/shop_visit_buys),缺键回退策略随领域知识归各件;应用层唯一落盘口(收齐各件片段拼成顶层快照后写盘),写触发点不变(五处);既有 27 键逐键冻结;新增获得日记键沿扩列不升版先例——旧档缺日记回退汇总键直载并跳过比对,日记在档时由日记推导汇总、与留存值不符即报错中止(迁移正确性自检)。2026-10-29 零豁免裁随动:拼盘与读侧策略机组拆出 breakpoint_store(核心层表新行),应用层落盘口与写触发点不变——宿主经件组装快照后写盘,27 键冻结不变。
|
||||||
|
- **信号直连**:adventure_runner 六转发信号族(node_entered/choices_presented/step_row/round_started/board_changed/wallet_changed)退役;呈现层在 level_started 重取点重订阅关卡对象信号(旧实例连接随引用释放消亡);「关卡开始信号前零发射」契约写进关卡件头注;「恰好连接一次」断言用 is_connected 守卫(release 模板剥 assert);三选一信号面归 CurioStop。
|
||||||
|
- **调用直连**:不留中间人委托壳(纯转传=Middle Man 反模式,2026-10-26 用户裁定);呈现控制器经取值回调持件——回调只许捕获长活根对象,禁件方法 Callable(防悬挂);约 30 个调用文件改址;测试/探针直连件读写。
|
||||||
|
- **验收红线**:游戏行为零变化(RNG 流名 reward_pick 与消费序零漂移、信号顺序契约冻结、同种子逐位一致);gdstyle 基线禁改(类变量计数下降属改善);怪物寻址 resolve_enemy_rowset 调用面与关卡参数档装配零变化(未来关卡主题的数据缝不堵)。
|
||||||
|
|
||||||
|
### 呈现层
|
||||||
|
|
||||||
|
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **D1 HUD**(呈现面拆分持续换代:组合根 main.gd + 三屏壳(MenuScreen/CampScreen/AdventureScreen)+ views/ 视图单元(现行承载面见「呈现层装配与会话生命周期」节;早期 9 单元清单与 LevelStripView 已随场景换代退役);营地覆盖层=四柜台并排〔树淬炼主界面/锻造工坊·秘宝匣钥匙门/图鉴常开——迭代 21 T6 程序占位重排〕) | 全部 Control/CanvasLayer(例外:BoardView 棋盘本体与 BattleStageView 站桩本体 = Control 壳 + SubViewportContainer + SubViewport + Node2D 世界〔BoardWorld/CellUnit;StageWorld/StandeeBody——B 区 slot_row 伴随件留壳层〕,探针契约面不变——棋盘 Node2D 迁移批 Phase A 2026-09-23 / 战斗舞台 Phase B 2026-09-26)、输入→意图翻译(**唯一提交路径 = settle_batch,不直调 A3**)、呈现义务状态记录(A2×6 / B2×4 / B3×4 / B4×5 / B1×3) | 视图单元接口(信号外发、setter 只读注入) | A2 compute_move_path / ActionOutcome;A3 ap/rap;B1 步骤流行协议(数据源);ConfigDB display_name | **MEDIUM**:Control / CanvasLayer / draw_* / InputEvent / RichTextLabel——对照 breaking-changes.md 4.5–4.7 条目(CanvasItem 线条无抗锯齿羽化、设备 ID 常量、RichTextLabel 图片参数两轮变化) |
|
||||||
|
| **组合根拆件**(呈现侧写口子件:curio_interact_controller / camp_shop_presenter / treasure_interact_controller) | 代组合根执行核心写调用(冒险节点后续推进/营地购买与刷新/道具使用——依赖与回调由 main 构造注入) | 各拆件的写入口(仅组合根装配面可达;视图零直连) | 构造注入的核心写引用(推进/商店/道具各域——详见各拆件头注) | 无 |
|
||||||
|
| **ui_registry**(`presentation/ui_registry.gd`,界面注册面,已建件——迭代 44) | 呈现层接口面唯一承载:层序合同(LAYER_CONTRACT)迁驻与合同寻址、三域句柄容器 ui_screens(9 屏壳与覆盖层句柄)/ui_battle(5 战区句柄)/ui_modals(13 模态句柄+ModalFlow);组合根经其一级寻址接线,探针挂载假设迁移为 `main.ui.<域容器>.<句柄>`;七个探针别名/转发成员随批消灭 | 三容器属性+合同寻址口(RefCounted 门面,不挂树、零会话期引用);四件(UiRegistry/UiScreens/UiBattle/UiModals)类变量 3/9/5/14,ModalFlow 随 UiModals 容器构造即建 | 构造注入:三屏壳、覆盖层、战区句柄、ModalFlow(main_ui_build 交付随之改型) | 无(RefCounted) |
|
||||||
|
| **board_hover**(`views/board_hover.gd`,悬停预承诺呈现域件,已建件——迭代 45) | 悬停反馈域唯一承载(自 board_view 收编 11 函数族+_hover/_last_click 两成员):三语义光标、目标格边框、BFS 路径预览、chord 双击首遇锚;_r0 出生展开区成员留宿主 | 构造=引用束注入实为 7 项(cells/minesweeper/diggable 引用+格命中换算/光标写入/hover_forbidden/chord_attempted 四 Callable——卡片预估 5 项,11 函数逐字迁移的最小必需面);三入站口留宿主委托;hover_probe 读面留宿主 | board_view(宿主);输入事件经宿主入站口 | 无(RefCounted) |
|
||||||
|
| **cell_base_layer/cell_mark_overlay**(`views/`,单格两绘制域件,已建件——迭代 45) | 单格绘制域拆分(自 board_cell_unit 状态件 `_CellPaintState` 收编,入参与该层绘制命令同件):基座层(底面/描边/立面/投影/接触带/倒角,12 成员)与标识叠加层(标记/字形/徽章/封印/点迹/高亮/退色,13 成员);宿主 _draw 退为六步时序器,类变量 30→10 | 构造注入;绘制命令由宿主 _draw 按层序调用 | board_cell_unit(宿主);gdstyle 键各文件独立计数(12/13 均 ≤15) | 无(RefCounted) |
|
||||||
|
| **standee_vitals/standee_motion**(`views/`,站桩两状态件,已建件——迭代 45) | 站桩状态域拆分(自 `_StandeeState` 真实 25 成员收编):身份命值(hp/atk/状态值族,12 成员)与资产演出(动作/姿态/位移演出族,11 成员);三个演出探针计数器留宿主,宿主类变量 19→10 | 构造注入;st(沿用)/mo 两实例由宿主持有 | standee_body(宿主);battle_stage_view 写入面逐字保持 | 无(RefCounted) |
|
||||||
|
| **HudPresenter**(`presentation/hud_presenter.gd`,迭代 37 加注) | 战斗屏**数据投影+文案拼装静态族**——核心状态→呈现文案的全部翻译集中于此(B/C/D 区文案与投影),静态无状态 | `refresh(…)` 全量重查装配(组合根每次动作/结算返回后调用,漏调即陈旧呈现)+只读静态投影族 | 核心读取只走 `settlement.presentation_snapshot()` 成文快照面(禁链式穿透结算内部);ConfigDB display_name | 无(RefCounted 静态) |
|
||||||
|
| **board_resolvers**(`presentation/board_resolvers.gd`,迭代 37 拆出) | 棋盘每格渲染数据的只读解析回调四函数(奖励徽章身份——挖掘期 Active 相位内、地形变异数字遮蔽与角标、调试加成生效值)——有态绑定件,与无态静态投影族 HudPresenter 职责互斥 | 构造注入 db、调试浮窗与结算活态取值,产出绑定 Callable 供组合根接线 | ConfigDB / DebugOverlay / 结算活态取值 Callable | 无(纯投影) |
|
||||||
|
| **main_ui_build**(`presentation/main_ui_build.gd`,迭代 37 拆出) | `_build_ui` 八步拆分件——组合根 UI 装配分步承接(三屏壳实例化、视图句柄接线、覆盖层装配与模态编排注入按步拆开);main 侧留同名薄委托,装配序与 z 序零改动 | 分步静态函数(成员访问经 root 显式传入) | 层序逻辑不在此件——唯一事实源=`ui_registry.LAYER_CONTRACT`+`ui.apply_layer_contract(root)`(迭代 44 迁驻注册面) | 同 D1(Control 装配面) |
|
||||||
|
| **main_adventure_flow**(`presentation/main_adventure_flow.gd`,迭代 37 拆出) | main 冒险流程族——菜单开局/续玩后的冒险编排接线、节点事件分发、终局面与选路屏开合;逐字搬运,main 侧留同名薄委托(探针 `main.X` 路径零迁移) | 流程静态函数(root 显式) | 局态全局住 run_scope 节点——本件零成员态、零新增信号连接(连接语句随原段搬运) | 无 |
|
||||||
|
| **main_overlay_flow**(`presentation/main_overlay_flow.gd`,迭代 37 拆出) | main 浮层流程族——设置/状态面板/生涯页/选档界面/图例/钱包事件的开合与数据投喂;逐字搬运,main 侧留同名薄委托 | 流程静态函数(root 显式) | 全部开合走组合根模态编排口(`root.ui.modals.flow.open/close`)——本件零成员态 | 同 D1 |
|
||||||
|
| **main_debug_flow**(`presentation/main_debug_flow.gd`,迭代 37 拆出) | main 调试流程族——调试浮窗开合与上下文同步、批量模拟入口、两层调试对局起手、诊断转储;逐字搬运,main 侧留同名薄委托 | 流程静态函数(root 显式) | 调试会话状态机归 debug_session.gd——本件只接线与出 UI,零成员态 | 同 D1 |
|
||||||
|
| **TilePalette**(`presentation/views/tile_palette.gd`,迭代 37 拆出) | 瓦片排版/装载:高墙/地面瓦片整批装载与运行时镜像合成、地板明度归一、数字墨族按板自适应判据、格坐标确定性散列与十六正交情形墙瓦片查表 | 查表族(读件持棋盘引用——棋盘视图 rebuild 经 `bind_board` 同步);装载缓存七成员持于件内(同板型零重载、换板重载时序同源) | 零绘制面、零玩法数据写入(绘制调用面留棋盘视图);纹理路径单点在件内 | Resource 纹理加载——LOW |
|
||||||
|
| **HeroSprite**(`presentation/views/hero_sprite.gd`,迭代 37 拆出) | 英雄精灵四态与落位装配(落位与位移演出、撞墙帧闪、挖掘弹跳、脚底锚与持握手位出口) | 由棋盘视图 `_init` 建为子件(注入世界根与壳层容器引用)——精灵本体经世界根 ensure_hero 建于 SubViewport 世界内,本件只驱动其状态 | BoardWorld 世界根;素材缺位=零精灵(棋盘视图字形「人」回退路径在役) | Node2D / create_tween(Tween 系 Node 方法——MEDIUM 域对照 breaking-changes.md) |
|
||||||
|
| **BoardWorld**(`presentation/views/board_world.gd`,迭代 37 在册补行) | 棋盘 Node2D 世界根(SubViewport 内 CellUnit 容器):世界级去饱和材质与字体注入挂点、英雄精灵持有位 | 无 class_name——使用方经 preload 引用挂树 | BoardView 壳层(SubViewportContainer + SubViewport 结构不变——棋盘 Node2D 迁移批 Phase A 既定) | Node2D/SubViewport——同 D1 |
|
||||||
|
| **battle_presentation**(B5,垂直切片后) | 结算动画 / 伤害数字 / 战斗舞台 | (契约规范源:`../../gdd/systems/战斗循环/战斗表现.md`——前置「战斗表现美术测试」锁双舞台陷阱) | B1 步骤流(回放脚本源)、D1 | **MEDIUM**:AnimationPlayer(String→StringName 变更)/ Tween |
|
||||||
|
| **audio**(D4,Alpha) | 音频挂点 | (挂点 = B1 明细行类型流;负反馈聚合——单结算至多一次) | B1 流水 | AudioStreamPlayer(4.7 area_mask 默认 1→0 注意) |
|
||||||
|
| **tutorial**(D5,Alpha) | 教学条目 | (口径来源:A2/A3/B3/B1 各教学条目) | 各上游 | 无 |
|
||||||
|
|
||||||
|
**依赖单向性**:上层可消费下层,禁止反向(C3 禁调用 A1 生成、D1 不直调 A3、A2/B3/B4 零相互直调)。全项目唯一回边 = A2 事件订阅面。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 呈现层装配与会话生命周期
|
## 呈现层装配与会话生命周期(迭代 27/28 完成反哺——2026-10-17 用户裁按推荐案写入)
|
||||||
|
|
||||||
### 三屏壳与组合根
|
### 三屏壳与组合根句柄面
|
||||||
|
|
||||||
- 呈现场景拆为三屏壳:MenuScreen(开始菜单屏)/CampScreen(营地屏)/AdventureScreen(冒险屏——内含关卡地图与战斗两容器)。
|
- 呈现场景拆为三屏壳:MenuScreen(开始菜单屏)/CampScreen(营地屏)/AdventureScreen(冒险屏——内含关卡地图与战斗两容器)。
|
||||||
- 屏成员寻址经界面注册面(ui_registry):探针与消费方走 `main.ui.<域容器>.<句柄>` 合同寻址;句柄清单与合同细节归 ui_registry 头注承载。
|
- 屏成员寻址自实现批起迁经界面注册面(**已建件——迭代 44**):探针挂载假设 `main.X` 迁移为 `main.ui.<域容器>.<句柄>`(ui_screens/ui_battle/ui_modals 三域容器,约 867 处探针与系统测试引用随批改址);原 S13 豁免登记〔2026-10-27「组合根类变量面即探针契约面」〕注销;main.gd 类变量 49→15,注册面形态见「模块归属·呈现层」表 ui_registry 行;ModalFlow 实例随 UiModals 容器构造建立(装配早期注入点依赖其先在座);取证探针 shot_probe/fx_shot_probe 随批改址;局态一律住 RunScope 节点,禁在屏/视图侧持有局态引用。
|
||||||
- 局态一律住 RunScope 节点,禁在屏/视图侧持有局态引用。
|
- **组合根拆件**=组合根构造注入、代组合根执行核心写调用的呈现侧子件(现行三件:curio_interact_controller/camp_shop_presenter/treasure_interact_controller——冒险节点后续推进、营地购买与刷新、道具使用)。视图禁直连拆件;核心写调用的可达路径仍是「视图→信号→组合根(含拆件)→核心」,依赖规则与组合根单点装配不变。成员见「模块归属·呈现层」表。
|
||||||
|
|
||||||
### 视觉层装配合同
|
### 视觉层装配合同
|
||||||
|
|
||||||
- **树序=登记序=z 序**,同源派生;层序唯一事实源=`main.gd` 的 `LAYER_CONTRACT` 常量表(kind 五类:shell/modal/state/node/float)。
|
- **树序 = 登记序 = z 序**,同源派生;层序唯一事实源 = `main.gd` 的 `LAYER_CONTRACT` 常量表(kind 五类:shell=屏壳〔成员随壳不占独立树位〕/modal=模态层〔入登记册,tags 随登记〕/state=全屏态/node=非视觉节点/float=不注册 ModalStack 的最顶浮层〔任何 UI 打开都不遮挡它〕)。
|
||||||
- 全仓唯一落位口=`_apply_layer_contract()`(装配尾统一排序+登记);散落 `move_child` 由冒烟源码断言判红;**改层序只改合同表**。
|
- 全仓唯一落位口 = `_apply_layer_contract()`(装配尾统一排序+登记);散落 `move_child` 由冒烟 V1d 源码断言判红;**改层序只改合同表**。
|
||||||
- 具体层清单不复制进本文(双写失同步禁令)——查现行层项直接读 `main.gd`。
|
- 具体层清单不复制进本文(双写失同步禁令)——查现行层项直接读 `main.gd`。
|
||||||
|
|
||||||
### 会话生命周期(RunScope)
|
### 会话生命周期(RunScope)
|
||||||
|
|
||||||
- `run_scope.gd`=纯状态承载 Node:零信号连接、零视图构建、零核心写调用(连接只在组合根,组合根经 `run_scope.X` 读写)。
|
- `run_scope.gd` = 纯状态承载 Node:零信号连接、零视图构建、零核心写调用(连接只在组合根,组合根经 `run_scope.X` 读写)。
|
||||||
- 会话更替机制:`_begin_session()` 新建会话节点挂树、旧会话节点**整节点 `queue_free()`**——无独立收束函数,跨局字段清理靠节点释放机制。
|
- 会话更替机制:`_begin_session()` 新建会话节点挂树、旧会话节点**整节点 `queue_free()`**——无独立收束函数,跨局字段清理靠节点释放机制(原手工复位清单随其消亡,新增跨局字段零新增泄漏点);`_ready` 即建闲时会话,`run_scope` 永非 null。
|
||||||
- **存活性矩阵**(九阶段 × 五引用面;执行判据=系统测试 V3a–V3i):
|
- **存活性矩阵**(九阶段 × 五引用面,2026-10-17 用户裁认账阶段划分;执行判据=冒烟 V3a–V3i。计划书原十阶段中「开局停点」与「地图选路」在现行流程同为关卡画面停点态、无可观测中间态,合并为一处断言):
|
||||||
|
|
||||||
| 阶段 | run_scope | adventure | runner | settlement |
|
| 阶段 | run_scope | adventure | runner | settlement |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
@@ -120,30 +213,116 @@
|
|||||||
| ④ 结算后(胜利停点)/⑤ 选路页 | 在树 | alive | alive | both |
|
| ④ 结算后(胜利停点)/⑤ 选路页 | 在树 | alive | alive | both |
|
||||||
| ⑥ 终局面 | 在树 | alive | alive | null |
|
| ⑥ 终局面 | 在树 | alive | alive | null |
|
||||||
| ⑦ 回菜单收束 | 新闲时会话即刻在树(旧会话已释放——无真空窗) | null | null | null |
|
| ⑦ 回菜单收束 | 新闲时会话即刻在树(旧会话已释放——无真空窗) | null | null | null |
|
||||||
| ⑧ 各模态开合后 | 闲时会话零扰动 | null | null | null |
|
| ⑧ 各模态开合后(设置/生涯/营地/调试) | 闲时会话零扰动 | null | null | null |
|
||||||
| ⑨ 两连局+续玩断点 | 换全新会话在树 | alive | both | both |
|
| ⑨ 两连局+续玩断点 | 换全新会话在树 | alive | both | both |
|
||||||
|
|
||||||
- 三态记号:**alive**=应有实例、**null**=必须缺位(实测非空判红)、**both**=按分支可空可活。对象有值但已失效一律判「悬挂」红。
|
- 三态记号沿用冒烟参数:**alive**=应有实例、**null**=必须缺位(实测非空判红)、**both**=按分支可空可活(如胜停点后走向选路或直接终局)。对象有值但已失效一律判「悬挂」红。
|
||||||
|
- 第五引用面=四持句柄件(`_treasure_ui`/`_bonus`/`_camp_pres`/`_modal_flow`,另有 `_row_pacer`):其会话取值 Callable 与 `run_scope` 成员**逐面同源比对**(回调悬挂=两值不等即红),会话更替零残留由矩阵每阶段顺带铁证。
|
||||||
|
|
||||||
### 模态编排(ModalFlow/ModalStack)
|
### 模态编排(ModalFlow/ModalStack)
|
||||||
|
|
||||||
- `modal_flow.gd`=模态编排纯逻辑类:开合编排(遮挡记账单口+演播后排窗挂起)/棋盘输入锁谓词/角标置灰谓词三职责;可直接 `new()` 单测。
|
- `modal_flow.gd` = 模态编排纯逻辑类(依赖仅 ModalStack + 查询 Callable,可直接 `new()` 单测):开合编排(遮挡记账单口 + T17 演播后排窗挂起)/棋盘输入锁谓词/角标置灰谓词三职责。
|
||||||
- 互斥排除语义随层登记(`register(node, tags)`);其余层零标签。
|
- 互斥排除语义随层登记(`register(node, tags)`):`debug_overlay=["non_locking"]`、`level_screen=["screen_state"]`,其余层零标签——原调用点排除式条件拼装已消亡。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 测试与质量域
|
## 测试与质量域
|
||||||
|
|
||||||
> 定位:本节只写测试域的架构事实。测试工具手册与各闸判定口径的事实源=`game/tests/README.md`;闸清单与改动域划分的唯一出处=`tools/run_all_gates.sh`(脚本即清单);测试怎么写、怎么算合格=`design/engineering/test-conventions.md`;静态扫描域 S 系规则的规则全集与动机=`game/tests/README.md`「Static Scan」节。全量验证=合回后远端 CI;开发期义务=改完即测(process-conventions §4)。
|
> 定位:本节为测试域(本地闸、探针、静态扫描等横切关注点)的**事实源**。仓库无远端、无 CI——本地闸是唯一验收门禁,判定严密性即全仓质量下限。第三方测试框架(gdUnit4)经 2026-09-12 评估不引入,现行测试载体=本节自制闸体系。
|
||||||
|
|
||||||
### 测试域依赖约束
|
### 模块归属
|
||||||
|
|
||||||
|
| 模块 | 载体 | 独占职责 | 对外暴露 | 判定口径 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **run_smoke**(冒烟测试运行器) | `tools/run_smoke.py` | 冒烟测试总入口与判定权:headless 以项目运行目标拉起 `res://tests/smoke_boot.tscn`(极小启动场景——autoload 在位、配置表全载、主屏实例化,零逻辑判定)+ 三闸判定 | 进程退出码(0=PASS / 1=FAIL) | 三闸齐备、判定无洞:①退出码 = 0;②摘要行「[smoke] 摘要:N 项检查,0 项失败」在案且失败数为 0;③输出扫 `SCRIPT ERROR` / `Parse Error` 标记行。外部 wall-clock 超时在位(超时 = FAIL) |
|
||||||
|
| **run_system_test**(系统测试运行器) | `tools/run_system_test.py` | 系统测试总入口:headless 跑真实玩法路径断言面(宿主=`res://tests/system_test.gd`)+ 三闸判定(口径同 run_smoke,摘要行兼容两种宿主格式) | 进程退出码(0=PASS / 1=FAIL) | 三闸齐备(同 run_smoke:退出码/摘要失败数/脚本错误扫描;wall-clock 超时在位) |
|
||||||
|
| **run_all**(单元与集成测试) | `game/tests/run_all.gd` | 64 套统一入口(61 单元+3 集成,2026-10-28 实数):套件 manifest 逐条「套件 → 期望退出码」,致命类 expect=1 独立子进程实跑;`negative` 字段标负面套件(仅豁免错误扫描一闸);选跑态 `--only=<词[,词…]>`(直跑形态对套件路径子串匹配只跑命中套件,零命中=用法错 quit(2),仅供开发期最窄确认——不产闸回执、不作验收凭据,批末全量闸不经选跑分支) | 逐套件结果 + 汇总退出码(任一套件失败 quit(1)) | 套件级退出码协议在位;三硬闸齐备(入口内扫子套件输出 + 编排层扫 `unit.log`;`Kit.finish` 零断言返回专用码 2)。子进程输出须经系统命令解释器重定向落盘再读——`OS.execute` 的输出管道在本机恒空 |
|
||||||
|
| **probe_gate**(场景探针) | `tools/probe_gate.sh` | headless 场景探针段编排:默认段 ui_input_probe / ui_struct_probe / layout_probe / ui_contrast_probe / **screen_flow_probe**(屏壳切换),`--click` 加跑 ui_click_probe,`--full` 加跑 ui_probe / ui_tune_probe / t17_defer_probe / fx_probe;孤儿 Godot 预清 + 批末残留清点(必须 0) | 段级 FAIL 输出 + 汇总退出码 | 每段 timeout 守卫在位(挂死 124/137 = FAIL,不静默);判定统一走 `verdict` 函数——退出码为唯一权威判据,PASS 串降级为附加判据,逐段跑 `tools/error_scan.py` |
|
||||||
|
| **render_gate**(视觉 golden) | `tools/render_gate.sh` | 窗口化渲染闸:①shot_probe 七屏截图 → shot_checker A-D 语义断言;②fx_shot_probe / board_shot_probe 取证(超时/零字节/文件缺失任一 = FAIL);③棋盘 golden 逐像素容差比对(差 ≤16 / changed ≤2%,provisional)+ 菜单 golden;④批末孤儿残留清零;⑤三段探针日志逐段脚本错误扫描 | 段级 FAIL 输出 + 汇总退出码 | 查退出码在位(每段 timeout 守卫 + 退出码/取证文件双检);SCRIPT ERROR 扫描在位(逐段 `tools/error_scan.py`,标记与 run_smoke 同源);断言数下限不适用(判定主体 = golden 容差与取证文件存在性,非断言计数) |
|
||||||
|
| **static_scan**(静态扫描域) | `game/tests/static_scan.sh` | 静态扫描域 S1–S10 可执行载体(grep 规则 + `tools/audit_type_hints.py`〔S9〕+ `tools/audit_file_headers.py`〔S10〕) | fail 聚合退出码(任一硬失败规则命中即 exit 1) | 查退出码在位;SCRIPT ERROR 扫描与断言数下限不适用(逐规则命中即红,无运行时错误面与断言计数);S3 现为 warning 级、不参与 fail 判定(见下表) |
|
||||||
|
|
||||||
|
### 改动域划分(2026-10-17 用户裁「代码批只跑代码闸、文档批只跑文档闸」)
|
||||||
|
|
||||||
|
| 域 | 闸 | 本批改动落在这些路径即属该域 |
|
||||||
|
|---|---|---|
|
||||||
|
| **代码域** | run_smoke、run_system_test、run_all、probe_gate `--click`、probe_gate `--full`、render_gate、static_scan | **唯一触发=`game/` 下非 `.md` 的行为载体**(代码、测试脚本、探针、场景、数据表、素材)。`game/` 内的 `.md`(README、生成清单)归文档域——2026-10-26 用户裁:判据按文件性质,不按路径前缀。2026-10-18 用户裁「跨领域执法禁绝」(提交 `7bdf53e3`)后,原 `tools/`、`artwork/` 两前缀不再把改动拉进代码域 |
|
||||||
|
| **文档域** | gdd_lint、doc_link_audit、doc_term_audit、流水线闸 | `game/` 内的 `.md` 与 `game/` 外的一切路径:`design/`、根规则文件(`AGENTS.md`/`roadmap.md`/`待办清单.md`/`体验验证清单.md`)、`tools/` 工具脚本、`.zcode/` 配置、`sim-data/`、`reports/` |
|
||||||
|
| **两域都含** | repo_structure_audit(熵增闸:顶层目录/根文件/图像白名单/退役路径/design 子目录五查——文档批新增或挪动 `.md` 同样会绊它;纯文本扫描秒级) | — |
|
||||||
|
|
||||||
|
口径三条:**域划分的唯一出处是 `tools/run_all_gates.sh`**(`--code`/`--docs`/不带参数=全量),本表是它的现状登记、不是第二份清单;改闸件本身或一次改动跨两域 → 跑全量档(§6.2 共享件例外);合回闸按 merge diff 的文件性质推出应验的域(`game/` 内 `.md` 归文档域),再校验回执的 `domain` 字段与新增红。代码域跑前先过**素材齐盘预检**——`game/assets/art/**` 与一切 `*.import` 边车都不入 git(2026-09-29 裁定),worktree 冷检出必空盘,空盘态冒烟 V1 成片假红、渲染闸更是一段 golden 都不比。
|
||||||
|
|
||||||
|
### 车道分层执法(2026-10-26 用户裁「按路径切车道,取代一切改动走 worktree」)
|
||||||
|
|
||||||
|
改动车道与改动域同一判据(文件性质):代码面=worktree 批车道,文档面=主工作区直改车道。执法全机械——判据只有文件路径性质与 git 图,不含「改动大小」等语义判断;「预期大改」由用户开工点名自愿开 worktree,不进规则。
|
||||||
|
|
||||||
|
| 执法层 | 载体 | 职责 | 判据 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **git pre-commit 钩子** | `tools/hooks/pre-commit`(版本化本体,`core.hooksPath` 挂载;在位性由 run_all_gates.sh 跑批自检——失位即红) | 直改车道闸机检:staged 不含代码面的提交,提交点现场跑 `run_all_gates.sh --docs`(秒级文本扫描),绿落地红拦;staged 含代码面时主工作区=拦(代码面唯一合法路径=worktree 批合回)、任务 worktree=跳过(归批末闸+合回闸,不打扰迭代批中间提交) | staged 文件性质+主区/worktree 判定(git-dir 与 common-dir 同一=主区) |
|
||||||
|
| **worktree-guard**(ZCode PreToolUse) | `.zcode/hooks/worktree-guard.sh`(本机件,不入 git) | agent 侧车道纪律:主工作区代码面的 Edit/Write 与 staged 含代码面的 commit 拦截;`git commit --no-verify` 拦截(该旗标仅属用户);合回闸回执六况校验 | 路径性质+分支名+回执 JSON+git 图 |
|
||||||
|
|
||||||
|
取舍依据:失败代价不对称——docs 红是死链/术语/格式,下次任何跑批对基线比对必暴露、秒级修复,故文档面轻执法(commit 点闸、无回执流程);代码面红是运行时行为坏,保留「worktree+批末域闸+回执硬绑定」全套。git 层钩子对一切提交者生效(含用户手工提交,紧急出口 `--no-verify`);ZCode 层只约束 agent。子代理覆盖面(2026-10-26 冷启动评估实测):子代理的工具调用不经过 ZCode 层守卫(代码面 Edit 未被拦、`--no-verify` 探针未被拦)——ZCode 层实际只覆盖主会话工具调用,git 层因此是唯一覆盖一切提交者的执法层;残余暴露面=蓄意 `--no-verify`(pre-commit 族钩子被该旗标整族跳过,git 层无法自防),属故意越权而非遗忘型失误,与防遗忘的设计目标正交。
|
||||||
|
|
||||||
|
### 三条判定硬闸现行状态
|
||||||
|
|
||||||
|
| 硬闸 | run_smoke | run_system_test | run_all | probe_gate | render_gate | static_scan |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| **退出码优先** | 已落实(闸①) | 已落实(闸①,口径同 run_smoke) | 已落实(套件 manifest expect 协议) | 已落实(`verdict` 函数逐段判退出码,PASS 串不作判据) | 已落实(段级退出码 + 取证双检) | 已落实(fail 聚合退出) |
|
||||||
|
| **SCRIPT ERROR 扫描** | 已落实(闸③,外部扫描——GDScript 无脚本错误陷阱 API,闸设在外部包装) | 已落实(闸③,标记清单与 run_smoke 同源) | 已落实(入口内扫子套件输出;子进程的 stdout/stderr 须先落盘——`OS.execute` 管道在本机恒空) | 已落实(逐探针段 `tools/error_scan.py`,标记与 run_smoke 同源) | 已落实(三段探针日志逐段 `tools/error_scan.py`,标记与 run_smoke 同源) | 不适用(静态域无运行时错误面) |
|
||||||
|
| **断言数下限** | 无独立下限(闸②摘要行必须在案,防「跑一半仍 PASS」;脚本错误吞断言路径由闸③兜住) | 同 run_smoke(过渡期宿主摘要行必须在案) | 已落实(`Kit.finish` 零断言返回专用退出码 2——与「断言失败=1」区分,防致命类套件的 expect 协议放过) | 已落实(退出码 0 但无该探针签名标记亦判红——防静默退出) | 不适用(golden 容差 + 取证存在性判定) | 不适用(逐规则命中判定;另有扫描面为空即判红的零命中自检) |
|
||||||
|
|
||||||
|
背景事实(run_smoke 头注在案):GDScript 运行时脚本错误不改进程退出码、不计入冒烟失败数、且静默中断所在函数剩余断言——2026-09-19 状态记录 83 实证「309 项 0 失败」实为断言未跑全。这是 SCRIPT ERROR 扫描必须存在于判定层的原因。
|
||||||
|
|
||||||
|
### 静态扫描域 S1–S8 承接清单
|
||||||
|
|
||||||
|
静态扫描域规则(2026-09-12 立,沿革见 git commit log;下表为现行事实登记):
|
||||||
|
|
||||||
|
| # | 规则 | 状态 |
|
||||||
|
|---|---|---|
|
||||||
|
| S1 | 玩法代码禁 `randomize()`、自建 `RandomNumberGenerator`(D2 Rule 5) | **在位**(硬失败;扫描面 game/core + game/presentation) |
|
||||||
|
| S2 | 禁全局随机函数 `randi()` / `randf()` / `randf_range()`——全局 RNG 绕开 RngService(specialist 补登) | **在位**(与 S1 同段硬失败;实例方法 `.randi()` 排除、`rng-seed-exempt` 豁免注记在案) |
|
||||||
|
| S3 | core/ 禁 ConfigDB 外 data 表加载(`load(` / `preload(` / `ResourceLoader.load`;schema class_name 直引豁免)(D2 Rule 2) | **在位**(warning 级——class_name 直引误报需人工复核;路径已由裸 `core` 修正为 `game/core`,此前恒零命中静默空转;豁免 config_db.gd 自身=数值单一事实源的正主) |
|
||||||
|
| S4 | core/ 禁 `extends Control/Node2D`、禁 `.tscn` preload(D2 Rule 7) | **在位**(硬失败) |
|
||||||
|
| S5 | core/ 禁裸引用 autoload 全局标识符(`ConfigDB` / `RngService` 直接写 = --script 模式 parse error)——构造注入 only(specialist 升格) | **在位**(硬失败;形态=标识符后紧跟 `.` 的成员访问,排除注释行与字符串字面量) |
|
||||||
|
| S6 | core↔core 信号连接只许方法 Callable(禁 lambda 捕获 self);发射者禁持有订阅者反向引用 | **在位**(2026-10-25 落闸:内联 lambda 禁令机器闸——同行与跨行两形态、豁免注记 `s6-signal-exempt`、盘面零存量;「发射者禁反向引用」句静态判据不成熟,归人工评审面承接、不造弱判据) |
|
||||||
|
| S7 | B1 编排唯一性:B2/B3/B4 API 符号命中文件 ⊆ B1 文件集;A2/B3/B4 零相互直调(B1 AC-43) | **在位**(2026-10-25 落闸:符号清单×B1 域文件集,族内自调用豁免、豁免注记 `s7-b1-exempt`、缺位自检;全符号形态盘面零存量) |
|
||||||
|
| S8 | 结算路径 `await` 零命中(B1 结算/编排文件集);字面量扫描 = warning 级 + 人工三要素复核(D2 AC-14 口径) | **在位**(2026-10-25 落闸:B1 域文件集 await 零命中,文件集缺位自检、排除注释与字符串;盘面零存量。本行后半句「字面量扫描=warning 级+人工三要素复核」为独立子项、仍归人工面) |
|
||||||
|
|
||||||
|
域外扩充两件(均硬失败在位):**S9** 类型闸(`tools/audit_type_hints.py`,迭代 27 T5——产品码无类型容器/有值返回缺类型/参数缺类型);**S10** 文件头闸(`tools/audit_file_headers.py`——头注 ≤8 行 + 日期/变更叙事黑名单)。
|
||||||
|
|
||||||
|
### 三层承载与判定原则
|
||||||
|
|
||||||
|
测试分标准四级+UI 探针(2026-10-22 用户裁,测试术语与层级重构批),各有在册承载与入闸方式(细目见 `game/tests/README.md`):
|
||||||
|
|
||||||
|
| 层 | 判什么 | 承载 | 入闸 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 冒烟测试 | 这版活着吗(零逻辑判定) | `game/tests/smoke_boot.tscn/.gd` | `run_smoke.py`(闸 00) |
|
||||||
|
| 单元测试 | 领域类的原子行为对不对(从对外方法进、钉对外可观测面——写法判据归 test-conventions §8.2) | `game/tests/unit/` | `run_all.gd`(闸 02) |
|
||||||
|
| 集成测试 | 跨系统闭环对不对 | `game/tests/integration/` | 同上(同一入口同一协议) |
|
||||||
|
| 系统测试 | 真实玩法路径断言面 | `game/tests/system_test.gd` | `run_system_test.py`(闸 01) |
|
||||||
|
| UI 探针+渲染 golden | 场景切换与观感 | `game/probe/*.tscn` 探针 | `probe_gate.sh`(闸 03/04)、`render_gate.sh`(闸 05) |
|
||||||
|
|
||||||
|
**判定原则**:验收不能只是「跑一遍没崩」。三硬闸(退出码/脚本错误扫描/断言数下限)是判定的底线,
|
||||||
|
缺一即判定有洞;「日志里写着 PASS」不作判据。另有两类静默失效必须机制性防范——规则扫描面为空
|
||||||
|
(路径写错即恒零命中恒绿)与子进程输出丢失(本机 `OS.execute` 管道恒空),两者都以显式自检拦住。
|
||||||
|
|
||||||
|
### 依赖约束
|
||||||
|
|
||||||
测试域禁止反向依赖呈现层具体实现。五闸及其调用的探针场景、审计脚本只允许依赖两类边界:
|
测试域禁止反向依赖呈现层具体实现。五闸及其调用的探针场景、审计脚本只允许依赖两类边界:
|
||||||
|
|
||||||
1. **autoload 边界**——ConfigDB / RngService 的公开面(--script 模式不加载 autoload 且不注册全局标识符,测试文件自带显式实例化夹具);
|
1. **autoload 边界**——ConfigDB / RngService 的公开面(--script 模式不加载 autoload 且不注册全局标识符,测试文件自带显式实例化夹具);
|
||||||
2. **场景契约**——探针场景的信号外发面与视图单元接口(信号外发、setter 只读注入),禁直引呈现层实现内部。
|
2. **场景契约**——探针场景的信号外发面与视图单元接口(信号外发、setter 只读注入),禁直引呈现层实现内部(如 UiKit 工厂内部状态、BoardView 绘制细节)。
|
||||||
|
|
||||||
测试域是所有层的消费方,进入方式限于上述两类边界;除此之外的依赖方向一律与「目录归属」节依赖单向性同规。
|
测试域是所有层的消费方,进入方式限于上述两类边界;除此之外的依赖方向一律与「模块归属」节依赖单向性同规。
|
||||||
|
|
||||||
|
### 事实源声明
|
||||||
|
|
||||||
|
本节为测试域(测试载体、判定口径、静态扫描域)的事实源。新增违规案例仍须先补 static_scan 规则再修码(code-conventions 缺陷-规范对照表纪律)。
|
||||||
|
|
||||||
|
**S13 测量面豁免注销(2026-10-29 零豁免裁)**:原循环内 `await` 豁免〔2026-10-27〕注销——tune_sim_controller 改 process_frame 信号常驻连接+步进状态机(每帧一局、帧相位逐点对齐,已建件——迭代 44 卡③);运行态收尾现行形态=run() 尾每批一次执行(卡③ v1.0 申报的「每局置假还原」前提已被迭代 41 测试债批 215da315 先行消化,行为改动申报随 v1.1 停卡重裁剥离)。
|
||||||
|
|
||||||
|
**S13 豁免第三条注销(2026-10-29 零豁免裁)**:原 battle_orchestrator max-class-variables 豁免〔2026-10-28 迭代 40 卡①〕注销——RoundCycle/BattleFacts 两新件设计闭合(宿主实测 15,已建件——迭代 44 卡② 合回,见「战斗编排域拆件定稿」节轴丁)。
|
||||||
|
|
||||||
|
**gdstyle 计数截断缺陷登记(2026-10-29 两设计批独立实证)**:gdstyle v0.4.0 对文件内 inner class 的成员计数存在截断——内嵌类中带行尾注释的属性声明截断其后续成员计数(standee_body 实测 31 声明仅记 19、board_cell_unit 33 仅记 30)。基线登记值属欠估;闸机扫描与基线同源、判定口径自洽不误报,债的真值以实查为准——零豁免各批按真实口径设计(实数低于阈值,不依赖解析缺陷)。**清偿结果(2026-10-31)**:board_cell_unit 30→10、standee_body 19→10 已随迭代 45 真实清偿,基线 refresh 已收账(欠估口径旁证=33/31 声明与实测吻合)。登记待办:向 gdstyle 上游报 issue(仍在册)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -159,7 +338,7 @@ Input(鼠标)→ D1 输入翻译 → 意图对象 → A2.settle_batch(唯
|
|||||||
```
|
```
|
||||||
|
|
||||||
- 回合制下每帧只做:输入采样、呈现刷新、动效推进——**玩法状态只在意图事务内变更**(单意图帧输入收集:stop 点击终结当帧)。
|
- 回合制下每帧只做:输入采样、呈现刷新、动效推进——**玩法状态只在意图事务内变更**(单意图帧输入收集:stop 点击终结当帧)。
|
||||||
- 无跨线程玩法数据流(Godot 主线程假设);A1 生成若引入 WorkerThread,join 必须先于任何快照切出(既定约束)。
|
- 无跨线程玩法数据流(Godot 主线程假设,D2 EC13);A1 生成若引入 WorkerThread,join 必须先于任何快照切出(既定约束)。
|
||||||
|
|
||||||
### 2. 事件/信号路径(系统间通信,无紧耦合)
|
### 2. 事件/信号路径(系统间通信,无紧耦合)
|
||||||
|
|
||||||
@@ -167,55 +346,95 @@ Input(鼠标)→ D1 输入翻译 → 意图对象 → A2.settle_batch(唯
|
|||||||
A2 ──cell_revealed / flag_judged / round_end(棋盘路径)──▶ B1(轮 facts 缓冲)
|
A2 ──cell_revealed / flag_judged / round_end(棋盘路径)──▶ B1(轮 facts 缓冲)
|
||||||
A3 ──round_end(stopped 直发,payload 同构)──────────────▶ B1
|
A3 ──round_end(stopped 直发,payload 同构)──────────────▶ B1
|
||||||
B1 ──notify_settlement_done(next_round_mode) / notify_combat_end──▶ A3
|
B1 ──notify_settlement_done(next_round_mode) / notify_combat_end──▶ A3
|
||||||
B1 ──apply_effect / apply_damage / grant / 伤害单据 submit…──▶ B3/B2/B4(唯一调用方)
|
B1 ──apply_effect / apply_damage / grant / 伤害单据 submit…──▶ B3/B2/B4(唯一调用方;段内伤害序=主角先手→逐敌还手→地图账殿后〔案C 2026-10-06〕)
|
||||||
B1 ──install_board / retire_board──▶ A2 B1 ──generate(L,D)──▶ A1
|
B1 ──install_board / retire_board──▶ A2 B1 ──generate(L,D)──▶ A1
|
||||||
D1 ◀──呈现数据源:A2 事件流 / B1 步骤流 / A3 ap-rap / ConfigDB display_name
|
D1 ◀──呈现数据源:A2 事件流 / B1 步骤流 / A3 ap-rap / ConfigDB display_name
|
||||||
```
|
```
|
||||||
|
|
||||||
- **事件载体(已定)**:组合根直连信号接线 + B1 Waiting 相位触发(不依赖事件到达序);autoload 全局事件总线已否决(2026-09-12,沿革见 git 历史)——单线程回合制沿用组合根直连(KISS)。选型理由=可回放(架构原则 3):同步直连让调用顺序显式可见,「同种子逐位相同」才可断言;事件驱动形态服务的是并发/IO 场景对外部不确定时序的反应性,与本作「顺序确定」的需求相反。
|
- **事件载体(已定)**:组合根直连信号接线 + B1 Waiting 相位触发(不依赖事件到达序);autoload 全局事件总线已否决(2026-09-12,沿革见 git 历史)——单线程回合制沿用组合根直连(KISS)。选型理由=可回放(架构原则 3):同步直连让调用顺序显式可见,「同种子逐位相同」才可断言;Godot 信号本身就是同步函数派发,全库不存在事件循环。事件驱动形态服务的是并发/IO 场景对外部不确定时序的反应性,与本作「顺序确定」的需求相反。
|
||||||
- 事件规范序:A2 发射序=触发格 BFS、8 邻行主序;事件序契约 `flag_judged` < `round_end` 全路径统一。
|
- 事件规范序:A2 发射序 = 触发格 BFS、8 邻行主序;事件序契约 `flag_judged` < `round_end` 全路径统一。
|
||||||
- **呈现层订阅禁令(切片缺陷教训固化)**:呈现层永不直接订阅排雷玩法/行动经济的事件流,只订战斗结算步骤流与 `level_runner`——核心事件形态变化不得直接冲击界面。
|
- **呈现层订阅禁令(切片缺陷②教训固化)**:呈现层永不直接订阅 排雷玩法/行动经济 的事件流,只订 战斗结算 步骤流与 `level_runner`——核心事件形态变化不得直接冲击界面。
|
||||||
|
|
||||||
### 3. 存档/读档路径
|
### 3. 存档/读档路径
|
||||||
|
|
||||||
- 存档系统已实装:格式、三槽位、断点域与迁移链的现行契约以 `design/gdd/systems/表现与支撑/存档序列化.md`(owner)为准。
|
- 存档系统已实装:格式、三槽位、断点域与迁移链的现行契约以 `design/gdd/systems/表现与支撑/存档序列化.md`(owner)为准。
|
||||||
- RNG 快照契约(约束,现行成立):断点续玩回填=master_seed + 各流 scope 计数器;快照切出须发生在无正在执行中的 open_stream 实例时(scope 事件边界外——切点=board install 边界);SAVE_FORMAT_VERSION 高版本拒读。
|
- RNG 快照契约(现行仍成立):断点续玩回填 = master_seed + 各流 scope 计数器;快照切出须发生在无正在执行中的 open_stream 实例时(scope 事件边界外——B1 编排保证:切点 = board install 边界);SAVE_FORMAT_VERSION 高版本拒读。
|
||||||
|
|
||||||
### 4. 打包与字体(CJK 随包发行)
|
### 4. 打包与字体(CJK 随包发行)
|
||||||
|
|
||||||
CJK 字体随包发行并设为 theme 默认字体——运行时默认字体无中文字形。此项是 HUD 框架正式化的硬性前置,同时进导出 checklist 核对项。
|
CJK 字体随包发行并设为 theme 默认字体——运行时默认字体无中文字形。此项是 HUD框架 正式化的硬性前置,同时进导出 checklist 核对项。
|
||||||
|
|
||||||
### 5. 初始化顺序
|
### 5. 初始化顺序
|
||||||
|
|
||||||
```
|
```
|
||||||
进程启动
|
进程启动
|
||||||
→ autoload 实例化:ConfigDB → RngService → SaveManager → MetaProgression(顺序固定;核心类为普通类、由组合根按局实例化)
|
→ autoload 实例化:ConfigDB → RngService → SaveManager → MetaProgression(顺序固定;战斗编排器等核心类为普通类、由组合根按局实例化)
|
||||||
→ ConfigDB._ready():load_tables 加载 + 校验(致命通道;失败 = 构建中止 + 错误清单)
|
→ ConfigDB._ready():load_tables 加载 + 校验(致命通道;失败 = 构建中止 + 错误清单)
|
||||||
→ 主场景(D1 组合根)装配视图单元 + 信号接线
|
→ 主场景(D1 组合根)装配视图单元 + 信号接线
|
||||||
→ C2 begin_run:RngService.set_master_seed()(唯一接线方;两流计数器全零前提)
|
→ C2 begin_run:RngService.set_master_seed()(唯一接线方;两流计数器全零前提)
|
||||||
→ B1.begin_battle(encounter):set_reload_gate(true) → B3 开域 → B2 spawn → A2 install_board(A1.generate) + B4 roll_board(恰一次)→ A3 notify_round_start
|
→ B1.begin_battle(encounter):set_reload_gate(true) → B3 开域 → B2 spawn → A2 install_board(A1.generate) + B4 roll_board(恰一次)→ A3 notify_round_start
|
||||||
→ 挖掘循环 …… → battle_over 清理序列 → set_reload_gate(false)
|
→ 挖掘循环 …… → battle_over 清理序列 → set_reload_gate(false)
|
||||||
→ 关卡末:通关结算(钥石/GP/专长 level_clear 渠道——现行语义归 冒险结构 GDD)
|
→ 关卡末:通关结算(钥石/GP/专长 level_clear 渠道——现行语义归 冒险结构 GDD;原 clear_inventory 随库存轴下线退役 2026-09-15)
|
||||||
```
|
```
|
||||||
|
|
||||||
**启动后置条件**(执行判据事实源在 `game/tests/system_test.gd`):
|
**启动后置条件**(2026-10-17 用户裁入册——迭代 28 以冒烟 V2a–V2f 共 11 条断言把「启动完成后玩家该看到什么」成文;执行判据事实源在 `game/tests/system_test.gd`):
|
||||||
|
|
||||||
1. ConfigDB 就绪且表已载(`is_ready` + hero 表在座)。
|
1. ConfigDB 就绪且表已载(`is_ready` + hero 表在座)。
|
||||||
2. 系统设置已落引擎态——Master 音量 mute/volume_db=settings_store 现值;减动效开关=`UiKit.motion_scale`。
|
2. 系统设置已落引擎态——Master 音量 mute/volume_db = settings_store 现值;减动效开关 = `UiKit.motion_scale`。
|
||||||
3. 启动态菜单可见(boot 后自树顶向下第一个可见内容层=开始层)。
|
3. 启动态菜单可见(boot 后自树顶向下第一个可见内容层 = 开始层——菜单被冒险屏盖住即红)。
|
||||||
4. 续玩钮可见态恒等于断点在档态(双向)。
|
4. 续玩钮可见态恒等于断点在档态(双向:无断点隐藏/有断点可见/清断点回隐;boot 路径与刷新单口同源)。
|
||||||
5. 闲时会话已在树(`run_scope` 永非 null 契约的启动侧证明)。
|
5. 闲时会话已在树(`run_scope` 非空、非冒险会话、在树——永非 null 契约的启动侧证明)。
|
||||||
6. 调试浮窗 boot 不自动开(菜单优先)+调试入口全局浮层角标 boot 可见。
|
6. 调试浮窗 boot 不自动开(菜单优先,2026-10-16 用户令)+ 调试入口全局浮层角标 boot 可见。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## API 边界
|
||||||
|
|
||||||
|
> 完整 API 面(含封闭枚举负空间、布尔受理口径、输入×相位矩阵)以各 GDD AC 前言为**规范源**——本节列边界契约与不变式,实现须与 GDD 逐字一致;冲突时以 GDD 为准并走接口漂移修订。
|
||||||
|
|
||||||
|
| 边界 | 契约要点 | 调用方必须遵守的不变式 | 模块保证 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| D1 → A2 | 意图经 `settle_batch(intents)` 提交;不直调 A3 | 单意图帧收集;stop 经批次委托 | 语义序仲裁 + voided 零副作用 |
|
||||||
|
| A2 → A3 | 挖/插/拔 = 先棋盘面判定后 `try_spend`;A2 不可自行扣减 | 相位判定两侧一致(同一矩阵) | 原子事务(余量+扣减+仲裁一体) |
|
||||||
|
| A2 → 下游 | 只外发三事件,payload 字段封闭(digit 恒真透传 / reward_eligible / variant_ids) | 增删事件 = 接口漂移 | 发射面封闭 + 规范序 |
|
||||||
|
| B1 → B2/B3/B4 | 全调用面集中 B1;调用序钉死(按摇定技能行兑现→apply_damage→commit_action;先兑付后衰减;段内伤害序=主角先手→逐敌还手→地图账殿后〔案C 2026-10-06〕) | 禁第二调用方(静态扫描域:API 符号命中文件 ⊆ B1 文件集) | 恰一次编排纪律(roll_board/decay/清理全序) |
|
||||||
|
| B1 ↔ A3 | 编排期代理 `request_refresh`(玩家意图,禁 RAP 满自动刷);回发 next_round_mode/battle_over | stopped/ap_exhausted 未刷新回发 new_board = 违约 fail-fast | 刷新受理契约(同 Waiting 多次合法) |
|
||||||
|
| 各系统 → D2 | ConfigDB 类型化属性单点读取 | 禁绕过 ConfigDB load 表、禁缓存副本、禁玩法数值字面量、禁 randomize()/自建 RNG | 校验双通道 + fail-fast 致命 |
|
||||||
|
| A1 → A2 | Board 产物 class_name 数据契约 | install 四不变式校验(violation = 拒绝 + 五类诊断枚举) | 生成期合法性闸(R₀≠S / clearable / min_safe) |
|
||||||
|
| A1 ↔ B1 | attempt 边界非 scope 事件;actuals p10 为对账输入(非 target 参数) | 编排不把重试当取号 | 生成期指标集输出(实测可推理率 / 实际雷数与安全格数 / 重试次数 / 降级与非法产物标记) |
|
||||||
|
| B4 → B3 | buff 类经 B1 调 apply_effect(B4 零跨系统读、零直接接口) | 满层拒绝 = 零兑付 + 明细行(无折算) | 授予时数值快照(抗热重载) |
|
||||||
|
| B1 → D1 | [步骤流行协议](../../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)(基础行型+扩展行两层封闭 + 公共字段 type/source_class/origin_cell/round_index/display_name/value/highlight? + 特有字段 target/effect_id/pool_value) | 无来源行 = 断言失败;呈现侧禁按行序重演 B2 状态机 | 可回放步骤流(同种子逐行相同) |
|
||||||
|
|
||||||
|
**引擎类型核验注记**:接口使用的引擎类型 = Resource / .tres(D2 全表)、RefCounted(容器类)、Signal/Callable(事件载体)、Control/CanvasLayer/Drawing(D1)、SceneTree headless 协议(测试)——均属 4.x 基线稳定面;4.7 Control 域增量(offset_transform_* 等)已在 breaking-changes.md 登记,D1 采纳前对照核实。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 架构原则
|
## 架构原则
|
||||||
|
|
||||||
1. **核心层纯逻辑、headless 完整可跑**——核心层/功能层玩法逻辑零 Control/场景引用、零 UI 依赖;`--headless --script` 可跑完整战斗。输入是意图对象、输出是事件流/步骤流,D1 与输入设备皆可替换。
|
1. **核心层纯逻辑、headless 完整可跑**——核心层/功能层玩法逻辑零 Control/场景引用、零 UI 依赖;`--headless --script` 可跑完整战斗(D2 Rule 7 工程债;切片 88 冒烟实证)。输入是意图对象、输出是事件流/步骤流,D1 与输入设备皆可替换。
|
||||||
2. **单一事实源与零字面量**——玩法数值只存在于 `data/tables/*.tres`,经 ConfigDB 类型化单点读取;代码零玩法数值字面量;参数禁止跨系统复制(D2 Rule 1/2)。
|
2. **单一事实源与零字面量**——玩法数值只存在于 `data/tables/*.tres`,经 ConfigDB 类型化单点读取;代码零玩法数值字面量;参数禁止跨系统复制(D2 Rule 1/2)。
|
||||||
3. **封闭 RNG 与可回放**——玩法代码零随机;一切随机经 RngService 具名封闭流(增流走 P1 评审);同种子 + 同输入序列 ⇒ 事件流/步骤流逐位相同(结算禁 await,B1 承重约束)。
|
3. **封闭 RNG 与可回放**——玩法代码零随机;一切随机经 RngService 具名封闭流(增流走 P1 评审);同种子 + 同输入序列 ⇒ 事件流/步骤流逐位相同(结算禁 await,B1 承重约束)。
|
||||||
4. **编排唯一性与事件面封闭**——战斗域跨系统调用权集中 B1(静态扫描承载);A2 三事件面封闭即负空间;每格受理、每雷转化、每次推进、每次衰减各恰一次。
|
4. **编排唯一性与事件面封闭**——战斗域跨系统调用权集中 B1(静态扫描承载);A2 三事件面封闭即负空间;每格受理、每雷转化、每次推进、每次衰减各恰一次。
|
||||||
5. **fail-fast + 零特判**——数据错误一律致命中止(错误数值上线比崩溃更伤);API 非法=拒绝 + 诊断不静默;变异零运行时分支(行为差异全部由生成端约束保证)。
|
5. **fail-fast + 零特判**——数据错误一律致命中止(错误数值上线比崩溃更伤);API 非法 = 拒绝 + 诊断不静默;变异零运行时分支(行为差异全部由生成端约束保证)。
|
||||||
6. **依赖单向 + 组合根模式**——层间单向依赖、唯一回边=A2 事件订阅面;核心写调用唯一发生在组合根;禁上帝对象。
|
6. **依赖单向 + 组合根模式**——层间单向依赖、唯一回边 = A2 事件订阅面;核心写调用唯一发生在组合根;禁上帝对象(切片 1100 行 main.gd 反面案例 → 9 单元拆分)。
|
||||||
7. **呈现层契约成文**——面向呈现的信号载荷必须有成文 schema;模态覆盖层必须有"打开时遮挡物隐藏"场景级断言;场景级 UI 探针测试为标配(切片缺陷教训沉淀)。
|
7. **呈现层契约成文**——面向呈现的信号载荷必须有成文 schema;模态覆盖层必须有"打开时遮挡物隐藏"场景级断言;场景级 UI 探针测试为标配(切片缺陷 ①②④⑤ 教训沉淀)。
|
||||||
8. **系统无状态**——效果引擎这类系统零运行时可变状态:数据由宿主对象持有并随宿主生灭,状态按参数传入系统,系统只做判定。系统实例不持计数器——计数器住桶(round/battle/level/adventure 四桶,EffectContext 引用束),桶住宿主。
|
8. **系统无状态**——效果引擎这类系统零运行时可变状态:数据由宿主对象持有并随宿主生灭,状态按参数传入系统,系统只做判定(立项判据=2026-10-19 用户会话裁定;落地=迭代 32 卡②,2026-10-21 用户裁写入)。系统实例不持计数器——计数器住桶(round/battle/level/adventure 四桶,EffectContext 引用束),桶住宿主。
|
||||||
9. **停点权威在核心层**——玩家决策停点(选路、三选一、商店、恢复这类)的推进守卫住核心层状态机:停点未兑付,推进口一律拒绝(零自动推进契约);呈现层模态只做开合与输入锁——阻塞是两层结构,核心守卫为权威、模态为体验;停点态是核心状态、随断点序列化,headless 跑批与真实局同一套规则,中断续玩恢复到同一停点。
|
9. **停点权威在核心层**——玩家决策停点(选路、三选一、商店、恢复这类)的推进守卫住核心层状态机:停点未兑付,推进口一律拒绝(零自动推进契约);呈现层模态只做开合与输入锁——阻塞是两层结构,核心守卫为权威、模态为体验;停点态是核心状态、随断点序列化,headless 跑批与真实局同一套规则,中断续玩恢复到同一停点。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 未决问题
|
||||||
|
|
||||||
|
| ID | Summary | Priority | Resolution Path |
|
||||||
|
|----|---------|----------|-----------------|
|
||||||
|
| QQ-04 | 轮内刷新数值连锁(清图支配性条款⑤ / 真人刷图行为获取期望)重算 | Medium | playtest 实测 |
|
||||||
|
| QQ-05 | 战斗末可选类"j==0 补发 1 件"兜底是否采纳(切片遗留待办) | Medium | playtest + B4 GDD 修订批 |
|
||||||
|
| QQ-06 | 可选类退出格子池后 buff 频率被动上升(44%→59%)的难度对冲杠杆(敌 HP / 权重 / 幅度) | High | C3 调参 + 切片数据复测 |
|
||||||
|
| QQ-07 | 标错惩罚(A2 OQ1:候选敌方伏击+1;hit=false 无去重的不对称裁决) | Medium | 原型小补丁实测会话(可与 v3 终验合并) |
|
||||||
|
| QQ-08 | B5 双舞台陷阱(战斗发生在棋盘上还是独立场景) | Low(B5 前) | 战斗表现美术测试后裁决 |
|
||||||
|
| QQ-09 | C3 消费 B1 对账输出的事实依赖回写 `design/gdd/02-系统清单.md` | Low | C3 GDD 定稿时 |
|
||||||
|
| QQ-10 | `.claude/docs/director-gates.md` 缺失(TD-ARCHITECTURE/LP-FEASIBILITY 判据无载体) | Low | 补建 gate 定义文件或维持 solo/lean 模式约定 |
|
||||||
|
| QQ-11 | A1 生成性能姿态(F2c 常数 C 定稿;切片实证 10×10/12×12 同步生成可接受,WorkerThread 留扩展) | Medium | A1 GDD 修订批 |
|
||||||
|
| QQ-12 | 零伤害死局跨字段/跨表护栏落点(B2 OQ9;推荐 D2 跨表校验——切片 LevelTable 校验⑧先例) | Medium | D2 校验设计批 |
|
||||||
|
| QQ-13 | A1 EC5 运行期熔断(连续降级确定性回退已知好种子) | Low | A1 GDD 修订批 |
|
||||||
|
| QQ-14 | A5 探测显影接口 / D3 存档格式(RNG 快照契约已在案,格式归 Alpha) | Low | 秘宝域正式化 / D3 Alpha 设计批 |
|
||||||
@@ -5160,7 +5160,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
|
|
||||||
<rect data-graph-role="structural-frame" data-composition-frame-kind="region" data-composition-frame-id="1" data-composition-frame-label="浮层与对话框(组合根挂载)" x="90" y="390" width="1060" height="106" rx="12" class="c-region" stroke-width="1"/>
|
<rect data-graph-role="structural-frame" data-composition-frame-kind="region" data-composition-frame-id="1" data-composition-frame-label="浮层与对话框(组合根挂载)" x="90" y="390" width="1060" height="106" rx="12" class="c-region" stroke-width="1"/>
|
||||||
|
|
||||||
<rect data-graph-role="structural-frame" data-composition-frame-kind="region" data-composition-frame-id="2" data-composition-frame-label="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" x="66" y="524" width="1226" height="222" rx="12" class="c-region" stroke-width="1"/>
|
<rect data-graph-role="structural-frame" data-composition-frame-kind="region" data-composition-frame-id="2" data-composition-frame-label="逻辑层 core/(21 件·名称清单)" x="66" y="524" width="1226" height="222" rx="12" class="c-region" stroke-width="1"/>
|
||||||
|
|
||||||
<!-- Connection paths (before components for correct z-order) -->
|
<!-- Connection paths (before components for correct z-order) -->
|
||||||
<path data-edge-from="main" data-edge-to="stage" data-edge-key="0" data-edge-id="main-stage" data-composition-points="566,132;566,196;125,196;125,260" d="M 566 132 L 566 188 Q 566 196 558 196 L 133 196 Q 125 196 125 204 L 125 260" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
<path data-edge-from="main" data-edge-to="stage" data-edge-key="0" data-edge-id="main-stage" data-composition-points="566,132;566,196;125,196;125,260" d="M 566 132 L 566 188 Q 566 196 558 196 L 133 196 Q 125 196 125 204 L 125 260" class="a-default" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
||||||
@@ -5375,8 +5375,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="fine" x="876" y="468" class="t-frontend" font-size="7" text-anchor="middle">confirm_dialog.gd</text>
|
<text data-detail="fine" x="876" y="468" class="t-frontend" font-size="7" text-anchor="middle">confirm_dialog.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-debug" data-node-id="debug" data-node-label="调试浮窗" tabindex="0" role="button" aria-label="聚焦调试浮窗,发布态恒隐, 浮层与对话框(组合根挂载)" aria-pressed="false" data-node-kind="frontend" data-node-sublabel="发布态恒隐" data-node-tag="debug_overlay.gd" data-node-context="浮层与对话框(组合根挂载)">
|
<g id="node-debug" data-node-id="debug" data-node-label="调试浮窗" tabindex="0" role="button" aria-label="聚焦调试浮窗,DS_DEBUG 门控, 浮层与对话框(组合根挂载)" aria-pressed="false" data-node-kind="frontend" data-node-sublabel="DS_DEBUG 门控" data-node-tag="debug_overlay.gd" data-node-context="浮层与对话框(组合根挂载)">
|
||||||
<title>调试浮窗 · 发布态恒隐 · 浮层与对话框(组合根挂载) · debug_overlay.gd</title>
|
<title>调试浮窗 · DS_DEBUG 门控 · 浮层与对话框(组合根挂载) · debug_overlay.gd</title>
|
||||||
<rect x="968" y="420" width="152" height="56" rx="6" class="c-mask"/>
|
<rect x="968" y="420" width="152" height="56" rx="6" class="c-mask"/>
|
||||||
<rect x="968" y="420" width="152" height="56" rx="6" class="c-frontend" stroke-width="1.5"/>
|
<rect x="968" y="420" width="152" height="56" rx="6" class="c-frontend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="frontend" class="semantic-sigil s-frontend" transform="translate(974 426) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="frontend" class="semantic-sigil s-frontend" transform="translate(974 426) scale(0.6875)">
|
||||||
@@ -5386,12 +5386,12 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<circle cx="6.3" cy="4.8" r=".7" class="sigil-fill"/>
|
<circle cx="6.3" cy="4.8" r=".7" class="sigil-fill"/>
|
||||||
</g>
|
</g>
|
||||||
<text data-node-label="" data-detail-anchor="" x="1044" y="446" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">调试浮窗</text>
|
<text data-node-label="" data-detail-anchor="" x="1044" y="446" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">调试浮窗</text>
|
||||||
<text data-detail="context" x="1044" y="462" class="t-muted" font-size="9" text-anchor="middle">发布态恒隐</text>
|
<text data-detail="context" x="1044" y="462" class="t-muted" font-size="9" text-anchor="middle">DS_DEBUG 门控</text>
|
||||||
<text data-detail="fine" x="1044" y="468" class="t-frontend" font-size="7" text-anchor="middle">debug_overlay.gd</text>
|
<text data-detail="fine" x="1044" y="468" class="t-frontend" font-size="7" text-anchor="middle">debug_overlay.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-save" data-node-id="save" data-node-label="存档管理" tabindex="0" role="button" aria-label="聚焦存档管理,save_manager.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="database" data-node-sublabel="save_manager.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-save" data-node-id="save" data-node-label="存档管理" tabindex="0" role="button" aria-label="聚焦存档管理,save_manager.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="database" data-node-sublabel="save_manager.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>存档管理 · save_manager.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>存档管理 · save_manager.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="96" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="96" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="96" y="554" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
<rect x="96" y="554" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(102 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(102 560) scale(0.6875)">
|
||||||
@@ -5402,8 +5402,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="161" y="592" class="t-muted" font-size="9" text-anchor="middle">save_manager.gd</text>
|
<text data-detail="context" x="161" y="592" class="t-muted" font-size="9" text-anchor="middle">save_manager.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-meta" data-node-id="meta" data-node-label="元进度" tabindex="0" role="button" aria-label="聚焦元进度,meta_progression.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="database" data-node-sublabel="meta_progression.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-meta" data-node-id="meta" data-node-label="元进度" tabindex="0" role="button" aria-label="聚焦元进度,meta_progression.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="database" data-node-sublabel="meta_progression.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>元进度 · meta_progression.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>元进度 · meta_progression.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="244" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="244" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="244" y="554" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
<rect x="244" y="554" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(250 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(250 560) scale(0.6875)">
|
||||||
@@ -5414,8 +5414,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="309" y="592" class="t-muted" font-size="9" text-anchor="middle">meta_progression.gd</text>
|
<text data-detail="context" x="309" y="592" class="t-muted" font-size="9" text-anchor="middle">meta_progression.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-orch" data-node-id="orch" data-node-label="战斗编排器" tabindex="0" role="button" aria-label="聚焦战斗编排器,battle_orchestrator.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="battle_orchestrator.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-orch" data-node-id="orch" data-node-label="战斗编排器" tabindex="0" role="button" aria-label="聚焦战斗编排器,battle_orchestrator.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="battle_orchestrator.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>战斗编排器 · battle_orchestrator.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>战斗编排器 · battle_orchestrator.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="383" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="383" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="383" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="383" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(389 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(389 560) scale(0.6875)">
|
||||||
@@ -5425,8 +5425,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="448" y="592" class="t-muted" font-size="9" text-anchor="middle">battle_orchestrator.gd</text>
|
<text data-detail="context" x="448" y="592" class="t-muted" font-size="9" text-anchor="middle">battle_orchestrator.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-rules" data-node-id="rules" data-node-label="扫雷规则" tabindex="0" role="button" aria-label="聚焦扫雷规则,minesweeper_rules.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="minesweeper_rules.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-rules" data-node-id="rules" data-node-label="扫雷规则" tabindex="0" role="button" aria-label="聚焦扫雷规则,minesweeper_rules.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="minesweeper_rules.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>扫雷规则 · minesweeper_rules.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>扫雷规则 · minesweeper_rules.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="540" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="540" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="540" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="540" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(546 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(546 560) scale(0.6875)">
|
||||||
@@ -5436,8 +5436,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="605" y="592" class="t-muted" font-size="9" text-anchor="middle">minesweeper_rules.gd</text>
|
<text data-detail="context" x="605" y="592" class="t-muted" font-size="9" text-anchor="middle">minesweeper_rules.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-boardgen" data-node-id="boardgen" data-node-label="棋盘生成" tabindex="0" role="button" aria-label="聚焦棋盘生成,board_generator.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="board_generator.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-boardgen" data-node-id="boardgen" data-node-label="棋盘生成" tabindex="0" role="button" aria-label="聚焦棋盘生成,board_generator.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="board_generator.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>棋盘生成 · board_generator.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>棋盘生成 · board_generator.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="688" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="688" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="688" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="688" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(694 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(694 560) scale(0.6875)">
|
||||||
@@ -5447,8 +5447,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="753" y="592" class="t-muted" font-size="9" text-anchor="middle">board_generator.gd</text>
|
<text data-detail="context" x="753" y="592" class="t-muted" font-size="9" text-anchor="middle">board_generator.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-boarddata" data-node-id="boarddata" data-node-label="棋盘数据" tabindex="0" role="button" aria-label="聚焦棋盘数据,board_data.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="database" data-node-sublabel="board_data.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-boarddata" data-node-id="boarddata" data-node-label="棋盘数据" tabindex="0" role="button" aria-label="聚焦棋盘数据,board_data.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="database" data-node-sublabel="board_data.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>棋盘数据 · board_data.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>棋盘数据 · board_data.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="836" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="836" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="836" y="554" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
<rect x="836" y="554" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(842 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(842 560) scale(0.6875)">
|
||||||
@@ -5459,8 +5459,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="901" y="592" class="t-muted" font-size="9" text-anchor="middle">board_data.gd</text>
|
<text data-detail="context" x="901" y="592" class="t-muted" font-size="9" text-anchor="middle">board_data.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-effects" data-node-id="effects" data-node-label="效果引擎" tabindex="0" role="button" aria-label="聚焦效果引擎,effect_engine.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="effect_engine.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-effects" data-node-id="effects" data-node-label="效果引擎" tabindex="0" role="button" aria-label="聚焦效果引擎,effect_engine.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="effect_engine.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>效果引擎 · effect_engine.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>效果引擎 · effect_engine.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="984" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="984" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="984" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="984" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(990 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(990 560) scale(0.6875)">
|
||||||
@@ -5470,8 +5470,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="1049" y="592" class="t-muted" font-size="9" text-anchor="middle">effect_engine.gd</text>
|
<text data-detail="context" x="1049" y="592" class="t-muted" font-size="9" text-anchor="middle">effect_engine.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-adventure" data-node-id="adventure" data-node-label="冒险运行器" tabindex="0" role="button" aria-label="聚焦冒险运行器,adventure_runner.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="adventure_runner.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-adventure" data-node-id="adventure" data-node-label="冒险运行器" tabindex="0" role="button" aria-label="聚焦冒险运行器,adventure_runner.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="adventure_runner.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>冒险运行器 · adventure_runner.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>冒险运行器 · adventure_runner.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="1132" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="1132" y="554" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="1132" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="1132" y="554" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(1138 560) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(1138 560) scale(0.6875)">
|
||||||
@@ -5481,8 +5481,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="1197" y="592" class="t-muted" font-size="9" text-anchor="middle">adventure_runner.gd</text>
|
<text data-detail="context" x="1197" y="592" class="t-muted" font-size="9" text-anchor="middle">adventure_runner.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-levelrun" data-node-id="levelrun" data-node-label="关卡运行器" tabindex="0" role="button" aria-label="聚焦关卡运行器,level_runner.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="level_runner.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-levelrun" data-node-id="levelrun" data-node-label="关卡运行器" tabindex="0" role="button" aria-label="聚焦关卡运行器,level_runner.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="level_runner.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>关卡运行器 · level_runner.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>关卡运行器 · level_runner.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="96" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="96" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="96" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="96" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(102 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(102 622) scale(0.6875)">
|
||||||
@@ -5492,8 +5492,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="161" y="654" class="t-muted" font-size="9" text-anchor="middle">level_runner.gd</text>
|
<text data-detail="context" x="161" y="654" class="t-muted" font-size="9" text-anchor="middle">level_runner.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-dmgctl" data-node-id="dmgctl" data-node-label="伤害控制" tabindex="0" role="button" aria-label="聚焦伤害控制,damage_controller.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="damage_controller.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-dmgctl" data-node-id="dmgctl" data-node-label="伤害控制" tabindex="0" role="button" aria-label="聚焦伤害控制,damage_controller.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="damage_controller.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>伤害控制 · damage_controller.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>伤害控制 · damage_controller.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="244" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="244" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="244" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="244" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(250 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(250 622) scale(0.6875)">
|
||||||
@@ -5503,8 +5503,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="309" y="654" class="t-muted" font-size="9" text-anchor="middle">damage_controller.gd</text>
|
<text data-detail="context" x="309" y="654" class="t-muted" font-size="9" text-anchor="middle">damage_controller.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-dgmath" data-node-id="dgmath" data-node-label="伤害公式" tabindex="0" role="button" aria-label="聚焦伤害公式,damage_math.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="damage_math.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-dgmath" data-node-id="dgmath" data-node-label="伤害公式" tabindex="0" role="button" aria-label="聚焦伤害公式,damage_math.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="damage_math.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>伤害公式 · damage_math.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>伤害公式 · damage_math.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="392" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="392" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="392" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="392" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(398 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(398 622) scale(0.6875)">
|
||||||
@@ -5514,8 +5514,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="457" y="654" class="t-muted" font-size="9" text-anchor="middle">damage_math.gd</text>
|
<text data-detail="context" x="457" y="654" class="t-muted" font-size="9" text-anchor="middle">damage_math.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-reward" data-node-id="reward" data-node-label="奖励经济" tabindex="0" role="button" aria-label="聚焦奖励经济,reward_economy.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="reward_economy.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-reward" data-node-id="reward" data-node-label="奖励经济" tabindex="0" role="button" aria-label="聚焦奖励经济,reward_economy.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="reward_economy.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>奖励经济 · reward_economy.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>奖励经济 · reward_economy.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="540" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="540" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="540" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="540" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(546 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(546 622) scale(0.6875)">
|
||||||
@@ -5525,8 +5525,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="605" y="654" class="t-muted" font-size="9" text-anchor="middle">reward_economy.gd</text>
|
<text data-detail="context" x="605" y="654" class="t-muted" font-size="9" text-anchor="middle">reward_economy.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-lottery" data-node-id="lottery" data-node-label="技能抽奖" tabindex="0" role="button" aria-label="聚焦技能抽奖,skill_lottery.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="skill_lottery.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-lottery" data-node-id="lottery" data-node-label="技能抽奖" tabindex="0" role="button" aria-label="聚焦技能抽奖,skill_lottery.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="skill_lottery.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>技能抽奖 · skill_lottery.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>技能抽奖 · skill_lottery.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="688" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="688" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="688" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="688" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(694 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(694 622) scale(0.6875)">
|
||||||
@@ -5536,8 +5536,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="753" y="654" class="t-muted" font-size="9" text-anchor="middle">skill_lottery.gd</text>
|
<text data-detail="context" x="753" y="654" class="t-muted" font-size="9" text-anchor="middle">skill_lottery.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-attune" data-node-id="attune" data-node-label="同调" tabindex="0" role="button" aria-label="聚焦同调,attunement.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="attunement.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-attune" data-node-id="attune" data-node-label="同调" tabindex="0" role="button" aria-label="聚焦同调,attunement.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="attunement.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>同调 · attunement.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>同调 · attunement.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="836" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="836" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="836" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="836" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(842 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(842 622) scale(0.6875)">
|
||||||
@@ -5547,8 +5547,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="901" y="654" class="t-muted" font-size="9" text-anchor="middle">attunement.gd</text>
|
<text data-detail="context" x="901" y="654" class="t-muted" font-size="9" text-anchor="middle">attunement.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-action" data-node-id="action" data-node-label="行动经济" tabindex="0" role="button" aria-label="聚焦行动经济,action_economy.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="action_economy.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-action" data-node-id="action" data-node-label="行动经济" tabindex="0" role="button" aria-label="聚焦行动经济,action_economy.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="action_economy.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>行动经济 · action_economy.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>行动经济 · action_economy.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="984" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="984" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="984" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="984" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(990 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(990 622) scale(0.6875)">
|
||||||
@@ -5558,8 +5558,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="1049" y="654" class="t-muted" font-size="9" text-anchor="middle">action_economy.gd</text>
|
<text data-detail="context" x="1049" y="654" class="t-muted" font-size="9" text-anchor="middle">action_economy.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-feats" data-node-id="feats" data-node-label="特长引擎" tabindex="0" role="button" aria-label="聚焦特长引擎,feats_engine.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="feats_engine.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-feats" data-node-id="feats" data-node-label="特长引擎" tabindex="0" role="button" aria-label="聚焦特长引擎,feats_engine.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="feats_engine.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>特长引擎 · feats_engine.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>特长引擎 · feats_engine.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="1132" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="1132" y="616" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="1132" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="1132" y="616" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(1138 622) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(1138 622) scale(0.6875)">
|
||||||
@@ -5569,8 +5569,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="1197" y="654" class="t-muted" font-size="9" text-anchor="middle">feats_engine.gd</text>
|
<text data-detail="context" x="1197" y="654" class="t-muted" font-size="9" text-anchor="middle">feats_engine.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-status" data-node-id="status" data-node-label="状态容器" tabindex="0" role="button" aria-label="聚焦状态容器,status_container.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="status_container.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-status" data-node-id="status" data-node-label="状态容器" tabindex="0" role="button" aria-label="聚焦状态容器,status_container.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="status_container.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>状态容器 · status_container.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>状态容器 · status_container.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="96" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="96" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="96" y="678" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="96" y="678" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(102 684) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(102 684) scale(0.6875)">
|
||||||
@@ -5580,8 +5580,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="161" y="716" class="t-muted" font-size="9" text-anchor="middle">status_container.gd</text>
|
<text data-detail="context" x="161" y="716" class="t-muted" font-size="9" text-anchor="middle">status_container.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-units" data-node-id="units" data-node-label="单位容器" tabindex="0" role="button" aria-label="聚焦单位容器,unit_container.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="unit_container.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-units" data-node-id="units" data-node-label="单位容器" tabindex="0" role="button" aria-label="聚焦单位容器,unit_container.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="unit_container.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>单位容器 · unit_container.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>单位容器 · unit_container.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="244" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="244" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="244" y="678" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="244" y="678" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(250 684) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(250 684) scale(0.6875)">
|
||||||
@@ -5591,8 +5591,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="309" y="716" class="t-muted" font-size="9" text-anchor="middle">unit_container.gd</text>
|
<text data-detail="context" x="309" y="716" class="t-muted" font-size="9" text-anchor="middle">unit_container.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-treasure" data-node-id="treasure" data-node-label="秘宝数据" tabindex="0" role="button" aria-label="聚焦秘宝数据,treasure_items.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="database" data-node-sublabel="treasure_items.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-treasure" data-node-id="treasure" data-node-label="秘宝数据" tabindex="0" role="button" aria-label="聚焦秘宝数据,treasure_items.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="database" data-node-sublabel="treasure_items.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>秘宝数据 · treasure_items.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>秘宝数据 · treasure_items.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="392" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="392" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="392" y="678" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
<rect x="392" y="678" width="130" height="48" rx="6" class="c-database" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(398 684) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(398 684) scale(0.6875)">
|
||||||
@@ -5603,8 +5603,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="457" y="716" class="t-muted" font-size="9" text-anchor="middle">treasure_items.gd</text>
|
<text data-detail="context" x="457" y="716" class="t-muted" font-size="9" text-anchor="middle">treasure_items.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-resolver" data-node-id="resolver" data-node-label="配置解析" tabindex="0" role="button" aria-label="聚焦配置解析,config_db_resolver.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="config_db_resolver.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-resolver" data-node-id="resolver" data-node-label="配置解析" tabindex="0" role="button" aria-label="聚焦配置解析,config_db_resolver.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="config_db_resolver.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>配置解析 · config_db_resolver.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>配置解析 · config_db_resolver.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="540" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
<rect x="540" y="678" width="130" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="540" y="678" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="540" y="678" width="130" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(546 684) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(546 684) scale(0.6875)">
|
||||||
@@ -5614,8 +5614,8 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-detail="context" x="605" y="716" class="t-muted" font-size="9" text-anchor="middle">config_db_resolver.gd</text>
|
<text data-detail="context" x="605" y="716" class="t-muted" font-size="9" text-anchor="middle">config_db_resolver.gd</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g id="node-xvalid" data-node-id="xvalid" data-node-label="配置交叉校验" tabindex="0" role="button" aria-label="聚焦配置交叉校验,config_db_cross_validator.gd, 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="config_db_cross_validator.gd" data-node-context="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g id="node-xvalid" data-node-id="xvalid" data-node-label="配置交叉校验" tabindex="0" role="button" aria-label="聚焦配置交叉校验,config_db_cross_validator.gd, 逻辑层 core/(21 件·名称清单)" aria-pressed="false" data-node-kind="backend" data-node-sublabel="config_db_cross_validator.gd" data-node-context="逻辑层 core/(21 件·名称清单)">
|
||||||
<title>配置交叉校验 · config_db_cross_validator.gd · 逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</title>
|
<title>配置交叉校验 · config_db_cross_validator.gd · 逻辑层 core/(21 件·名称清单)</title>
|
||||||
<rect x="688" y="678" width="170" height="48" rx="6" class="c-mask"/>
|
<rect x="688" y="678" width="170" height="48" rx="6" class="c-mask"/>
|
||||||
<rect x="688" y="678" width="170" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
<rect x="688" y="678" width="170" height="48" rx="6" class="c-backend" stroke-width="1.5"/>
|
||||||
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(694 684) scale(0.6875)">
|
<g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(694 684) scale(0.6875)">
|
||||||
@@ -5660,9 +5660,9 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<text data-boundary-label="" x="98" y="413" class="t-cloud" font-size="9" font-weight="600">浮层与对话框(组合根挂载)</text>
|
<text data-boundary-label="" x="98" y="413" class="t-cloud" font-size="9" font-weight="600">浮层与对话框(组合根挂载)</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g data-graph-role="structural-frame-label" data-composition-frame-id="2" data-composition-frame-kind="region" data-composition-frame-label="逻辑层 core/(目录层级约束=architecture.md「目录归属」表)">
|
<g data-graph-role="structural-frame-label" data-composition-frame-id="2" data-composition-frame-kind="region" data-composition-frame-label="逻辑层 core/(21 件·名称清单)">
|
||||||
<rect data-graph-role="structural-frame-label-mask" x="70" y="534" width="328.59999999999997" height="16" rx="3" class="c-mask"/>
|
<rect data-graph-role="structural-frame-label-mask" x="70" y="534" width="172" height="16" rx="3" class="c-mask"/>
|
||||||
<text data-boundary-label="" x="74" y="547" class="t-cloud" font-size="9" font-weight="600">逻辑层 core/(目录层级约束=architecture.md「目录归属」表)</text>
|
<text data-boundary-label="" x="74" y="547" class="t-cloud" font-size="9" font-weight="600">逻辑层 core/(21 件·名称清单)</text>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<!-- Legend -->
|
<!-- Legend -->
|
||||||
@@ -5859,7 +5859,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<h3>组合根与建树</h3>
|
<h3>组合根与建树</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li>• main.tscn 全场景仅 1 个节点,整棵界面树由 main.gd 运行时搭建</li>
|
<li>• main.tscn 全场景仅 1 个节点,整棵界面树由 main.gd 运行时搭建(1392 行)</li>
|
||||||
<li>• 战斗界面由 UiAssembler 拼装;商店/营地浮层即拼装于战斗根内</li>
|
<li>• 战斗界面由 UiAssembler 拼装;商店/营地浮层即拼装于战斗根内</li>
|
||||||
<li>• 元进度账本与存档同由组合根持有(main.gd preload)</li>
|
<li>• 元进度账本与存档同由组合根持有(main.gd preload)</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -5883,7 +5883,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
|
|||||||
<h3>逻辑层与边界</h3>
|
<h3>逻辑层与边界</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li>• core/ 全量清单以 architecture.md「目录归属」表与各文件头注为准,本图只画顶层导航件</li>
|
<li>• core/ 21 件仅列名称,源码出处见各节点 sources 指针</li>
|
||||||
<li>• ConfigDB/RngService 两单例经 project.godot autoload 全局供给</li>
|
<li>• ConfigDB/RngService 两单例经 project.godot autoload 全局供给</li>
|
||||||
<li>• smoke/ 下 13 个测试探针场景属测试基建,不入架构主干</li>
|
<li>• smoke/ 下 13 个测试探针场景属测试基建,不入架构主干</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -556,7 +556,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"kind": "region",
|
"kind": "region",
|
||||||
"label": "逻辑层 core/(目录层级约束=architecture.md「目录归属」表)",
|
"label": "逻辑层 core/(21 件·名称清单)",
|
||||||
"wraps": [
|
"wraps": [
|
||||||
"save",
|
"save",
|
||||||
"meta",
|
"meta",
|
||||||
@@ -671,7 +671,7 @@
|
|||||||
"dot": "cyan",
|
"dot": "cyan",
|
||||||
"title": "组合根与建树",
|
"title": "组合根与建树",
|
||||||
"items": [
|
"items": [
|
||||||
"main.tscn 全场景仅 1 个节点,整棵界面树由 main.gd 运行时搭建",
|
"main.tscn 全场景仅 1 个节点,整棵界面树由 main.gd 运行时搭建(1392 行)",
|
||||||
"战斗界面由 UiAssembler 拼装;商店/营地浮层即拼装于战斗根内",
|
"战斗界面由 UiAssembler 拼装;商店/营地浮层即拼装于战斗根内",
|
||||||
"元进度账本与存档同由组合根持有(main.gd preload)"
|
"元进度账本与存档同由组合根持有(main.gd preload)"
|
||||||
]
|
]
|
||||||
@@ -689,7 +689,7 @@
|
|||||||
"dot": "rose",
|
"dot": "rose",
|
||||||
"title": "逻辑层与边界",
|
"title": "逻辑层与边界",
|
||||||
"items": [
|
"items": [
|
||||||
"core/ 全量清单以 architecture.md「目录归属」表与各文件头注为准,本图只画顶层导航件",
|
"core/ 21 件仅列名称,源码出处见各节点 sources 指针",
|
||||||
"ConfigDB/RngService 两单例经 project.godot autoload 全局供给",
|
"ConfigDB/RngService 两单例经 project.godot autoload 全局供给",
|
||||||
"smoke/ 下 13 个测试探针场景属测试基建,不入架构主干"
|
"smoke/ 下 13 个测试探针场景属测试基建,不入架构主干"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
设计稿与实现同尺度:功能 = 类(状态 + 行为 + 信号),类是封装的最小交付单位。工具性纯函数只允许挂在明确的宿主类下(静态装配器/工厂),不允许无主散落。
|
设计稿与实现同尺度:功能 = 类(状态 + 行为 + 信号),类是封装的最小交付单位。工具性纯函数只允许挂在明确的宿主类下(静态装配器/工厂),不允许无主散落。
|
||||||
|
|
||||||
### 1.3 依赖单向,核心写调用完成
|
### 1.3 依赖单向,核心写调用完成
|
||||||
依赖方向唯一:`views →(信号)→ 组合根 →(写调用)→ core`。视图零核心写调用(纯 setter / 信号外发优先);"读核心状态 → 拼展示文案"集中于装配器(presenter);核心写接口(settle_batch / player_request_refresh / runner 推进)只允许在组合根出现——组合根=main.gd+其构造注入的组合根拆件(成员与边界见各件文件头注),视图不得直连拆件。
|
依赖方向唯一:`views →(信号)→ 组合根 →(写调用)→ core`。视图零核心写调用(纯 setter / 信号外发优先);"读核心状态 → 拼展示文案"集中于装配器(presenter);核心写接口(settle_batch / player_request_refresh / runner 推进)只允许在组合根出现——组合根=main.gd+其构造注入的组合根拆件(成员与边界见架构文档「模块归属·呈现层」),视图不得直连拆件。
|
||||||
|
|
||||||
### 1.4 命名 = 领域命名,禁止系统 ID 前缀
|
### 1.4 命名 = 领域命名,禁止系统 ID 前缀
|
||||||
文件名与类名禁止 `a1_`/`b1_`/`c1_` 等系统 ID 前缀(`a1_board_generator.gd` → `board_generator.gd`)。设计追溯不靠前缀:代码↔设计的追溯由 GDD 文档承担,系统 ID 只作为文档的追溯锚;文件头注不承担追溯职责,不写任何文档链接(§1.4.1)。豁免:D2 schema 类与 autoload;文档/夹具登记名(如 b4_golden)属文档层。
|
文件名与类名禁止 `a1_`/`b1_`/`c1_` 等系统 ID 前缀(`a1_board_generator.gd` → `board_generator.gd`)。设计追溯不靠前缀:代码↔设计的追溯由 GDD 文档承担,系统 ID 只作为文档的追溯锚;文件头注不承担追溯职责,不写任何文档链接(§1.4.1)。豁免:D2 schema 类与 autoload;文档/夹具登记名(如 b4_golden)属文档层。
|
||||||
@@ -34,12 +34,6 @@
|
|||||||
### 1.5 禁止事实约定
|
### 1.5 禁止事实约定
|
||||||
任何"大家默认这么做"的惯例必须成文进本文件(或 AGENTS.md)才算存在。写代码时发现未成文但必须遵守的约定 → 当场补条文,不许靠惯性延续。
|
任何"大家默认这么做"的惯例必须成文进本文件(或 AGENTS.md)才算存在。写代码时发现未成文但必须遵守的约定 → 当场补条文,不许靠惯性延续。
|
||||||
|
|
||||||
### 1.6 拆分交接与封装边界
|
|
||||||
本节管拆分类改动的交接面与封装面,与 §1.1 拆分判据(职责轴)配合使用:§1.1 管怎么切,本节管切完之后件与件之间怎么往来。
|
|
||||||
|
|
||||||
1. **拆分交接定义**:拆出一个新类时,交付物必须同时写明职责边界与交接定义——新类构造时需要哪些依赖,由拆出它的类在构造它时一次交给它;新类需要回调拆出它的类的哪些方法,以 Callable 形式交付。两者齐备才算拆分合格。为什么:只切职责不定义交接,新件会伸手回原类内部拿东西,封装从拆件那天起就破了。正面先例=装板件的引用束注入(表数据、随机流、装板所需对象与出错回调一次性交付——先例本体=`game/core/board_installer.gd` 构造面,沿革 git 历史可考)。
|
|
||||||
2. **封装边界**:任何代码不得访问其他对象的下划线成员;跨对象往来只走公开方法与属性。为什么:下划线只是命名约定,语言不设防、无编译期检查——此条是封装硬纪律,违者即红。
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. 契约纪律——跨层/跨类调用的语义
|
## 2. 契约纪律——跨层/跨类调用的语义
|
||||||
@@ -72,13 +66,12 @@
|
|||||||
4. **lambda 捕获循环变量按创建时值**——循环内先落地局部变量再捕获,或用 `bind`。
|
4. **lambda 捕获循环变量按创建时值**——循环内先落地局部变量再捕获,或用 `bind`。
|
||||||
5. **重命名脚本必须同步 `.uid` 文件**;新增 `class_name` 后必须跑一次编辑器扫描刷新全局类缓存,否则 `--headless --script` 模式解析失败。
|
5. **重命名脚本必须同步 `.uid` 文件**;新增 `class_name` 后必须跑一次编辑器扫描刷新全局类缓存,否则 `--headless --script` 模式解析失败。
|
||||||
6. **`print` 格式占位符与实参类型必须匹配**(`%d` 配 String = 静默输出字面量)。
|
6. **`print` 格式占位符与实参类型必须匹配**(`%d` 配 String = 静默输出字面量)。
|
||||||
7. **语言纪律已机器化为 S9 类型闸**——`tools/audit_type_hints.py`,执行载体=静态扫描域 S9(`game/tests/static_scan.sh`),退出码 0=归零。扫描面=产品码三目录(`game/core`+`game/data`+`game/presentation`);非产品码三目录的适用域分档见本节第 13 条。三规则:R1 无类型容器(显式非参数化 `Dictionary`/`Array` 注解)/R2 有值返回缺返回类型(纯副作用缺 `-> void` 属写法面不入闸)/R3 参数缺类型(`_init` 豁免——构造注入面形态自由)。
|
7. **语言纪律已机器化为 S9 类型闸**——`tools/audit_type_hints.py`,执行载体=静态扫描域 S9(`game/tests/static_scan.sh`),退出码 0=归零。扫描面=产品码(`game/core`+`game/data`+`game/presentation`;probe/sim/tests 不在扫描面——测量面容器直构是既有惯例)。三规则:R1 无类型容器(显式非参数化 `Dictionary`/`Array` 注解)/R2 有值返回缺返回类型(纯副作用缺 `-> void` 属写法面不入闸)/R3 参数缺类型(`_init` 豁免——构造注入面形态自由)。
|
||||||
8. **`:= {}` 推断形态不算债**——`var x := {}` 类赋值推断属类型推断合法面,不入 R1 扫描;只有显式写的非参数化容器注解才算无类型容器。
|
8. **`:= {}` 推断形态不算债**——`var x := {}` 类赋值推断属类型推断合法面,不入 R1 扫描;只有显式写的非参数化容器注解才算无类型容器。
|
||||||
9. **行级白名单通道 `# type-hint: ignore`**——豁免该行不入 S9;豁免理由必须随行注明(现行例:`board_generator` 四函数的 db 参鸭子型——typed 参拒冒烟夹具 `_BoardRowStub` 注入)。
|
9. **行级白名单通道 `# type-hint: ignore`**——豁免该行不入 S9;豁免理由必须随行注明(现行例:`board_generator` 四函数的 db 参鸭子型——typed 参拒冒烟夹具 `_BoardRowStub` 注入)。
|
||||||
10. **`# rng-seed-exempt` 标记豁免通道**——S1/S2 随机函数扫描对该行豁免;限定用途=非玩法 RNG 消费面的引擎熵(现行例:组合根种子编辑框空态取 `randi()`——建种子不进玩法封闭流);非产品码三目录自建随机源的定种要求见第 13 条。
|
10. **`# rng-seed-exempt` 标记豁免通道**——S1/S2 随机函数扫描对该行豁免;限定用途=非玩法 RNG 消费面的引擎熵(现行例:组合根种子编辑框空态取 `randi()`——建种子不进玩法封闭流)。
|
||||||
11. **`--script` 模式禁裸 autoload 标识符**——`ConfigDB`/`RngService` 等 autoload 名在 `--headless --script` 模式编译器不解析(parse error);产品码与测试夹具一律经节点路径取用(`get_node("/root/…")`/`AUTOLOAD_PATH_*` 常量);静态扫描域 S5 硬失败承载在位。
|
11. **`--script` 模式禁裸 autoload 标识符**——`ConfigDB`/`RngService` 等 autoload 名在 `--headless --script` 模式编译器不解析(parse error);产品码与测试夹具一律经节点路径取用(`get_node("/root/…")`/`AUTOLOAD_PATH_*` 常量);静态扫描域 S5 硬失败承载在位。
|
||||||
12. **Variant 参数化现行口径**——账本类字典/数组标注 `Dictionary[Variant, Variant]`/`Array[Variant]` 即合格(满足 R1);元素类型精化列后续事项、不入硬纪律,口径变更须用户裁决后续批次另行写入。
|
12. **Variant 参数化现行口径**——账本类字典/数组标注 `Dictionary[Variant, Variant]`/`Array[Variant]` 即合格(满足 R1);元素类型精化列后续事项、不入硬纪律,口径变更须用户裁决后续批次另行写入。
|
||||||
13. **静态扫描适用域按来源分档(2026-11-03 架构审查 P1 余项裁)**——S 系静态扫描(S1–S13)的扫描面一律止于产品码三目录,`game/tests`/`game/probe`/`game/sim` 不进任何 S 系扫描面;这三目录的可靠性由运行期通道承接,各通道是:`game/tests`=冒烟·单元·系统测试三闸、`game/probe`=场景探针与渲染 golden 两闸(同目录内 `type_glow_shot_probe` 是人工取证件、`probe_ui_util` 是探针共用面,两者不入闸)、`game/sim`=不入 CI,属用户手动发起的调参与数值测量批量。三目录**允许**自建 `RandomNumberGenerator`,条件=**必须显式定种**(改前改后读数要用同种子对拍,这是全项目测量口径);三目录真正禁止的形态是不定种随机——`randomize()` 与全局 `randi()`/`randf()`/`randf_range()`,一旦命中那次运行结果不可复现,读数与取证一并失效。这条对三目录的部分目前**无机器闸**(S1/S2 扫描面不含它们):扩面需给每处合法定种挂 `rng-seed-exempt` 注记、只拦得住新增,2026-11-03 用户裁不扩,改由本条文字+批末独立验收审计的人工评审承载。术语口径:`tools/run_all_gates.sh` 里的「测量面」指 `game/tests`+`game/sim`(影响面选闸用语,`game/probe` 不在其中——改探针必须跑场景探针与渲染闸),与本条分档无关;本文不再用「测量面」统称这三个目录。
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -40,10 +40,10 @@
|
|||||||
|
|
||||||
**正面总则**:见名知意——每个名字(概念名、术语、文档与目录名)本身就说清所指,起不出这样的名字多半是概念还没想清;所见即所得——字面意思就是规则的完整意思,有隐含前提就写进句子。两句管语义透明,不与第 8 节指路存根冲突。
|
**正面总则**:见名知意——每个名字(概念名、术语、文档与目录名)本身就说清所指,起不出这样的名字多半是概念还没想清;所见即所得——字面意思就是规则的完整意思,有隐含前提就写进句子。两句管语义透明,不与第 8 节指路存根冲突。
|
||||||
|
|
||||||
文档、评审输出、日志中**禁止自造黑话**——比喻性生造词、只有作者自己懂的缩略语(对话输出面的用语与证据规则归 AGENTS.md「回答风格规则」,不在本节范围):
|
文档、评审输出、日志与一切沟通中**禁止自造黑话**——比喻性生造词、只有作者自己懂的缩略语:
|
||||||
|
|
||||||
- 只能使用:(a)人人可懂的直白语言,或(b)游戏行业通用术语(如 flood fill、战争迷雾、连锁展开、结算、增益/减伤)。
|
- 只能使用:(a)人人可懂的直白语言,或(b)游戏行业通用术语(如 flood fill、战争迷雾、连锁展开、结算、增益/减伤)。
|
||||||
- 指代新概念用直白描述性短语(正例:"实测可推理率");确需命名时:首现处展开成完整白话句(同「通行检验标准」),并登记进 `design/gdd/术语表.md`。
|
- 指代新概念用直白描述性短语(正例:"实测可推理率");确需命名时:首现处附一句白话定义,并登记进 `design/gdd/术语表.md`。
|
||||||
- 唯一例外:玩家在游戏里也会看到的专属名词(道具名、界面用语)。文档内部的机制概念不得造词。
|
- 唯一例外:玩家在游戏里也会看到的专属名词(道具名、界面用语)。文档内部的机制概念不得造词。
|
||||||
|
|
||||||
**自造词的三种固定形态(全部禁止)**:
|
**自造词的三种固定形态(全部禁止)**:
|
||||||
@@ -63,25 +63,25 @@
|
|||||||
| 规则 | 内容 |
|
| 规则 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 树形文档体系 | 全部设计文档构成一棵树;文档增删必须同步根索引 `design/gdd/02-系统清单.md` |
|
| 树形文档体系 | 全部设计文档构成一棵树;文档增删必须同步根索引 `design/gdd/02-系统清单.md` |
|
||||||
| 架构事实唯一源 | `design/engineering/architecture/architecture.md` 是架构事实的唯一权威(分层/目录归属/数据流/架构原则——只写依赖规则面:难以改变的分层、目录层级约束、依赖方向与数据流;模块级归属归代码头注,接口契约规范源=各系统 GDD,实现历史归 git commit log);禁建第二份架构文档;**架构文档写权限=用户专属**(2026-11-07 用户裁:agent 与技能只读,修订须用户发起) |
|
| 架构事实唯一源 | `design/engineering/architecture/architecture.md` 是架构事实的唯一权威(分层/模块归属/数据流/API 边界/测试与质量域);禁建第二份架构文档;历史决策记录只进 git commit log |
|
||||||
| 一页纸节点 | 一节、一条规则 ≤一页纸(约 ≤80 行);装不下就拆节 |
|
| 一页纸节点 | 一节、一条规则 ≤一页纸(约 ≤80 行);装不下就拆节 |
|
||||||
| 一系统一文档 | 不建 analysis 推演件;两三句能说清的"为什么"直接写进设计目的或规则正文 |
|
| 一系统一文档 | 不建 analysis 推演件;两三句能说清的"为什么"直接写进设计目的或规则正文 |
|
||||||
| 正文只写现行规则 | 禁删除线、"(作废)"、"(日期+拍板)"式注记;审计信息入对应文档附录 |
|
| 正文只写现行规则 | 禁删除线、"(作废)"、"(日期+拍板)"式注记;审计信息入对应文档附录 |
|
||||||
| 禁实现内容 | 系统文档与概念文档全文禁写实现细节——代码路径(`.gd`/`.py`/`.sh` 与运行时文件路径)、测试文件名、断言名、类名/方法名/信号名/常量名/调试与遥测入口名、提交号一律不出现;唯一例外=数据索引(`game/data/tables/*.tres` 与 `game/data/schemas/` 的表路径与表名、表字段名与表内枚值、存档键、封闭词表标签)。实现事实归代码与代码头注(2026-11-07 用户裁,架构文档只写约束面);验收标准只写玩家或系统可观测面。本行由文档域闸的能力审计机检两个可判死的面(带后缀路径、反引号调用形态),其余靠写卡段人工核对;闸件清单与域划分的唯一出处=`tools/run_all_gates.sh` 头部 |
|
| 禁实现内容 | 系统文档与概念文档全文禁写实现细节——代码路径(`.gd`/`.py`/`.sh` 与运行时文件路径)、测试文件名、断言名、类名/方法名/信号名/常量名/调试与遥测入口名、提交号一律不出现;唯一例外=数据索引(`game/data/tables/*.tres` 这类表路径与表名、表字段名与表内枚值、存档键、封闭词表标签)。实现事实归 `architecture.md`;验收标准只写玩家或系统可观测面。本行由文档域闸的能力审计机检两个可判死的面(带后缀路径、反引号调用形态),其余靠写卡段人工核对;闸件清单与域划分的唯一出处=`tools/run_all_gates.sh` 头部 |
|
||||||
| 正文单点维护 | 一条规则句只写在定义它的那份文档(owner 文档)——此前半句全域适用;后半句(其他文档要引用时写指针或语义概括,禁复制色值、尺寸、路径等可核对的具体值)适用域=`design/gdd/**`(GDD 设计文档;2026-11-07 用户裁收窄——美术圣经与 UX 呈现规格层为可带值参考层,不在后半句约束内)。豁免面 = 执行侧文件必须带字面值才能工作时(生图提示词里的十六进制色、脚本参数),转写不算双写,但该文件头部必须写明"冲突时以 owner 文档为准" |
|
| 正文单点维护 | 一条规则句只写在定义它的那份文档(owner 文档);其他文档要引用时写指针或语义概括,禁复制色值、尺寸、路径等可核对的具体值——上一句管不住数值之外的双写,本句补上。豁免面 = 执行侧文件必须带字面值才能工作时(生图提示词里的十六进制色、脚本参数),转写不算双写,但该文件头部必须写明"冲突时以 owner 文档为准" |
|
||||||
| 禁写变更记录 | 文档与代码文件内一律禁设「版本历史/修订记录/变更记录/修改记录/更新记录/更新日志」节或表格,禁逐版本叙述「改了哪些条款」;沿革与改动明细只进 git commit log。版本号可作为文档现行身份标记出现在文首状态行与正文引用中,但不得再挂变更表 |
|
| 禁写变更记录 | 文档与代码文件内一律禁设「版本历史/修订记录/变更记录/修改记录/更新记录/更新日志」节或表格,禁逐版本叙述「改了哪些条款」;沿革与改动明细只进 git commit log。版本号可作为文档现行身份标记出现在文首状态行与正文引用中,但不得再挂变更表 |
|
||||||
| 后置 ≠ 删除 | P1/P2 后置内容逐条列出;复活后置项 = 修订文档,禁静默加回 |
|
| 后置 ≠ 删除 | P1/P2 后置内容逐条列出;复活后置项 = 修订文档,禁静默加回 |
|
||||||
| 活体清单不冻结计数 | 对会生长的清单(文档树构成、UI 层项、RNG 流词表等)不写死计数与枚举——写指针到 owner(根索引/常量表/实现文件),现状值由 owner 承载;历史计数只进 git 提交信息 |
|
| 活体清单不冻结计数 | 对会生长的清单(文档树构成、UI 层项、RNG 流词表等)不写死计数与枚举——写指针到 owner(根索引/常量表/实现文件),现状值由 owner 承载;历史计数只进 git 提交信息 |
|
||||||
|
|
||||||
**数值纪律(概念/实现分界,2026-11-05 用户立)**:GDD 概念文档只定概念、机制与规则——是什么、有什么、为什么;数量面(多大、多少、多大概率)与呈现实现细节不进概念文档正文。分工三处:取值域与字段契约归 `game/data/schemas/*.gd`(表结构定义+域校验执法,provisional 随值标注);现行值归 `game/data/tables/*.tres`;呈现实现规格(冻结公式、像素值、动效参数)居 `design/ux/`=呈现实现设计规格层,豁免概念纯度约束。存量系统文档的旧调参表节由独立清扫批消化,消化期不作机检对象(现行闸无此项判据)。
|
**数值纪律**:正文定规则、取值域、单位;平衡值进 `data/tables/`,provisional 必须标注;已锁数值事实源 = `game/data/tables/*.tres`(现行值)与 owner 文档正文(规则、取值域、单位)。
|
||||||
|
|
||||||
**登记处唯一性**:`design/registry/`(`entities.yaml`/`architecture.yaml`)已注销删除,禁再建第二处事实登记——术语进 术语表、数值进 `.tres`、架构进 架构文档、影响面靠全仓搜索概念规范名得出。强制收口条款:
|
**登记处唯一性**:`design/registry/`(`entities.yaml`/`architecture.yaml`)已注销删除,禁再建第二处事实登记——术语进 术语表、数值进 `.tres`、架构进 架构文档、影响面靠全仓搜索概念规范名得出。强制收口条款:
|
||||||
|
|
||||||
1. **双写失同步禁止**——任何数值变更必须同步受影响三处:概念文档正文中表述该数值的规则句(若有)、`data/tables/` 行值与 schema 校验域、相关待办清单现状——其一未更新即视为变更未完成。
|
1. **双写失同步禁止**——任何数值变更必须同时同步引用该数值的 GDD 表格正文、`data/tables/` 行值与 schema 校验域、相关待办清单现状——三类之一未更新即视为变更未完成。
|
||||||
2. **锁数后概念文档不存现行值**——概念文档参数契约节只留概念与意图,指针指向 `.tres` 对应行键与 schema 域校验。
|
2. **调参表锁数后删现行值列**——仅留 schema 模板与取值域,指针指向 `.tres` 对应行键。
|
||||||
3. **覆盖范围** = 奖励/状态/敌人/技能/充能/护甲等级/区间掷点/难度曲线/D_ref 等所有数值字段。
|
3. **覆盖范围** = 奖励/状态/敌人/技能/充能/护甲等级/区间掷点/难度曲线/D_ref 等所有数值字段。
|
||||||
4. **维护通道** = 「设计批 → 同步批」两段式;数值表改完不等于修订完成。
|
4. **维护通道** = 「设计批 → 同步批」两段式;数值表改完不等于修订完成。
|
||||||
5. **压缩/换装批** = 「`.tres` 落批 + 切片 smoke 跑通 + 概念文档参数契约节改为概念句与指针 + 待办清单刷新」四步全收才记版本号。
|
5. **压缩/换装批** = 「`.tres` 落批 + 切片 smoke 跑通 + GDD 表格改为只留取值域与 `.tres` 指针 + 待办清单刷新」四步全收才记版本号。
|
||||||
|
|
||||||
## 6. 文档类型与骨架
|
## 6. 文档类型与骨架
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
| `待办清单.md`(仓库根) | 流水线唯一登记处:条目=登记元数据标题+四属性正文,状态随流水线段推进(格式与状态机见第 12.1 节);各系统文档「待办」节只留指路存根 |
|
| `待办清单.md`(仓库根) | 流水线唯一登记处:条目=登记元数据标题+四属性正文,状态随流水线段推进(格式与状态机见第 12.1 节);各系统文档「待办」节只留指路存根 |
|
||||||
| `roadmap.md`(根目录) | 里程碑表+迭代总表,一行一迭代,记录编排与实现进度(六列格式见第 12.2 节) |
|
| `roadmap.md`(根目录) | 里程碑表+迭代总表,一行一迭代,记录编排与实现进度(六列格式见第 12.2 节) |
|
||||||
|
|
||||||
**系统文档骨架**(`systems/` 下统一采用):文首引言(一句话定位+状态)/设计目的(2-4 句白话)/系统范围(负责/不负责两表)/在核心循环中的位置(字符画一行+两句白话)/核心规则(领域章节 ×2–6,每节一页纸)/依赖与输出(表格;引用纪律见 concept-conventions)/P0 最小闭环与 P1·P2 后置/参数契约(概念面:本系统有哪些参数、各自设计意图一句话;取值域与字段契约指路 `game/data/schemas/`,不进本文)/验收标准(玩家或系统可观测的判据,禁实现细节)/待办(指路存根)。
|
**系统文档骨架**(`systems/` 下统一采用):文首引言(一句话定位+状态)/设计目的(2-4 句白话)/系统范围(负责/不负责两表)/在核心循环中的位置(字符画一行+两句白话)/核心规则(领域章节 ×2–6,每节一页纸)/依赖与输出(表格;引用纪律见 concept-conventions)/P0 最小闭环与 P1·P2 后置/调参表(取值域+provisional 标注)/验收标准(玩家或系统可观测的判据,禁实现细节)/待办(指路存根)。
|
||||||
|
|
||||||
**命名**:中文、见名知意;禁 a1_/b1_ 编号前缀;不留纯空目录。正文指代子系统一律用中文规范名;英文代号对照表见 `02-系统清单.md`,旧代号(a1–d6)仅限解读归档。
|
**命名**:中文、见名知意;禁 a1_/b1_ 编号前缀;不留纯空目录。正文指代子系统一律用中文规范名;英文代号对照表见 `02-系统清单.md`,旧代号(a1–d6)仅限解读归档。
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@
|
|||||||
#### <条目名>(<YYYY-MM-DD>登记,来源=<playnote/会话提及/审计发现/批次移交>[,优先级=<P0/P1/P2>])
|
#### <条目名>(<YYYY-MM-DD>登记,来源=<playnote/会话提及/审计发现/批次移交>[,优先级=<P0/P1/P2>])
|
||||||
```
|
```
|
||||||
|
|
||||||
`优先级` 是紧急度标记,可选,规则三条:不写=默认档 P2;只有用户明示才写,会话不得自行给任何条目定档;P0 最高、P2 最低。它只服务阅读时的排序,不参与开工门、编排五查与状态机。`P0/P1/P2` 这组记号在本仓库只指待办紧急度,新文档禁另立别义。
|
`优先级` 是紧急度标记,可选,规则三条:不写=默认档 P2;只有用户明示才写,会话不得自行给任何条目定档;P0 最高、P2 最低。它只服务阅读时的排序,不参与开工门、编排四查与状态机。`P0/P1/P2` 这组记号在本仓库只指待办紧急度,新文档禁另立别义。
|
||||||
|
|
||||||
正文四属性模板:
|
正文四属性模板:
|
||||||
|
|
||||||
@@ -155,8 +155,6 @@
|
|||||||
**状态**:按状态机取词。
|
**状态**:按状态机取词。
|
||||||
```
|
```
|
||||||
|
|
||||||
**条目正文限长(2026-11-04 立)**:正文四属性只写现行状态与证据指针;过程叙事(逐轮裁定追记、「某日用户裁…」式沿革叙述、设计讨论过程复述)禁入正文——沿革与裁定史由 git 提交信息承载(第 10 节同源)。长度硬上限双判据:正文(四属性全部内容,不含标题与空行)≤12 行,且去空白字符合计 ≤700 字;任一超限即须压缩,由流水线闸机检。行数判据抓清单行蔓延,字数判据抓单行堆砌,两条并用缺一不可(实证:单行堆砌型超长条目一行可塞 1500 字,只限行数拦不住)。压缩方向=枚举与裁定细节迁 owner 文档或过程件(关联文档清单指过去),正文只留现行状态+证据指针+缺口。
|
|
||||||
|
|
||||||
`改动面` 四档的划线判据(按被改对象的路径归属,与闸的分域同口径):
|
`改动面` 四档的划线判据(按被改对象的路径归属,与闸的分域同口径):
|
||||||
|
|
||||||
| 档 | 覆盖范围 |
|
| 档 | 覆盖范围 |
|
||||||
@@ -168,7 +166,7 @@
|
|||||||
|
|
||||||
只写本条目自己交付的产出面,不预写下游实现批要动的面。`reports/` 下的需求卡片与批次产出物属过程件(第 11 节管辖),不计入 `文档` 档。四档与 AGENTS.md 硬红线的「改动四类」对应关系:`游戏代码`=需求改动(走写卡与编排段)、`工具代码`/`文档`/`美术素材` 三档各自对应工程改动/文档设计改动/美术素材改动三类直改通道;一条条目可以同时含多档。
|
只写本条目自己交付的产出面,不预写下游实现批要动的面。`reports/` 下的需求卡片与批次产出物属过程件(第 11 节管辖),不计入 `文档` 档。四档与 AGENTS.md 硬红线的「改动四类」对应关系:`游戏代码`=需求改动(走写卡与编排段)、`工具代码`/`文档`/`美术素材` 三档各自对应工程改动/文档设计改动/美术素材改动三类直改通道;一条条目可以同时含多档。
|
||||||
|
|
||||||
状态段用词自带所属设计线——`待文档设计`/`文档设计中`/`文档设计已闭合` 是文档线,`待美术设计`/`美术设计中`/`美术设计已闭合` 是美术线,不需要在标题另行声明走哪条线。状态一律取下例用词。状态行按**状态段累积制**书写:条目每推进一段,就把新状态段接在状态行末尾,段与段用+号连接,书写顺序=推进顺序;跨线的段一律保留、禁删(同一设计线内只留最新一段),下游段一旦写下不回收——状态履历供编排五查与开工核验比对。每段各自按状态词白名单校验,+号只作状态段连接符。
|
状态段用词自带所属设计线——`待文档设计`/`文档设计中`/`文档设计已闭合` 是文档线,`待美术设计`/`美术设计中`/`美术设计已闭合` 是美术线,不需要在标题另行声明走哪条线。状态一律取下例用词。状态行按**状态段累积制**书写:条目每推进一段,就把新状态段接在状态行末尾,段与段用+号连接,书写顺序=推进顺序;跨线的段一律保留、禁删(同一设计线内只留最新一段),下游段一旦写下不回收——状态履历供编排四查与开工核验比对。每段各自按状态词白名单校验,+号只作状态段连接符。
|
||||||
|
|
||||||
```
|
```
|
||||||
各设计线推进序列(同条目两条线并列推进时,两段各写各的):
|
各设计线推进序列(同条目两条线并列推进时,两段各写各的):
|
||||||
@@ -181,7 +179,7 @@
|
|||||||
|
|
||||||
设计线段与下游段同条并存是合法形态:状态行里出现过的**每条设计线各自留最新一段**,跨线依赖不阻塞本条推进(文档线闭合后写卡、美术线仍未出图,就把 `文档设计已闭合` 与 `待美术设计` 并写)。「写卡前本条要落的那条设计线必须已闭合」是实现侧的执行义务,由编排段查卡片凭据核对,不靠标题声明——闸只查同线并现多段。
|
设计线段与下游段同条并存是合法形态:状态行里出现过的**每条设计线各自留最新一段**,跨线依赖不阻塞本条推进(文档线闭合后写卡、美术线仍未出图,就把 `文档设计已闭合` 与 `待美术设计` 并写)。「写卡前本条要落的那条设计线必须已闭合」是实现侧的执行义务,由编排段查卡片凭据核对,不靠标题声明——闸只查同线并现多段。
|
||||||
|
|
||||||
状态行只写状态词:去掉特批标记与「(备选)」后缀后,残留任何括号即违规。闭合类状态词(文档设计已闭合/美术设计已闭合/已写卡/已写入)的证据——设计定稿路径+版本、art-bible 条款版本、需求卡片路径(「已写卡」段的复核凭据=卡内「复核记录」节,2026-11-06 用户裁:不另设复核报告文件;对文件名日期 ≥2026-11-06 的卡生效,旧卡不回头改,核对由 `tools/pipeline_gate.py` 的卡片复核判据到卡正文做)、落点文档+版本——一律写在实况的关联文档清单里,由流水线闸到正文核对;已编迭代 N 段的交叉核依据=实况清单里的需求卡片路径。
|
状态行只写状态词:去掉特批标记与「(备选)」后缀后,残留任何括号即违规。闭合类状态词(文档设计已闭合/美术设计已闭合/已写卡/已写入)的证据——设计定稿路径+版本、art-bible 条款版本、需求卡片路径、落点文档+版本——一律写在实况的关联文档清单里,由流水线闸到正文核对;已编迭代 N 段的交叉核依据=实况清单里的需求卡片路径。
|
||||||
|
|
||||||
三种条目形态与一种后缀:
|
三种条目形态与一种后缀:
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +1,32 @@
|
|||||||
# 流程规范(Dungeon Sweeper)
|
# 流程规范(Dungeon Sweeper)
|
||||||
|
|
||||||
> 约束范围:一切批次的流程纪律——车道(一切改动走独立 worktree,主区只作合并落点)、五段流水线、批次工作流、测试执行细则、像素件工作纪律。
|
> 约束范围:一切批次的流程纪律——车道(代码面 worktree 批/其余主区直改)、五段流水线、批次工作流、测试执行细则、像素件工作纪律。
|
||||||
> 分工:硬性红线的一句话索引在 AGENTS.md「硬性红线」;本文承载其操作细则;批次开工前通读本文。
|
> 分工:硬性红线的一句话索引在 AGENTS.md「硬性红线」;本文承载其操作细则;批次开工前通读本文。
|
||||||
|
|
||||||
**开工任何批次前必须通读本文。**
|
**开工任何批次前必须通读本文。**
|
||||||
|
|
||||||
## 1. 分支纪律(worktree 铁律)
|
## 1. 分支纪律(车道铁律)
|
||||||
|
|
||||||
主工作区(master 检出)只作合并落点,一切开发/设计改动禁止直接发生在主工作区(2026-10-31 用户裁恢复;验证模型=批内按 §4 改完即测、合回后远端 CI 是唯一强制全量验证点,细则见本节第 3 条):
|
一切面主工作区直改+直提(2026-10-30 用户裁本地 CI 化:验证挪到合回后,主区直提不再拦任何面;判据与 §3 第 8 条改动域划分同一):
|
||||||
|
|
||||||
1. **worktree 车道(一切面)**:每回合先建独立 worktree(建区粒度=回合,会话单区细则见第 5 条):`git worktree add ../g-plan2-<任务名> -b <任务分支>`;建区后立刻跑 `tools/setup_worktree_userdir.sh`——给该区独立 Godot user 目录(测试夹具、试玩日志、截图产物不与其他区共用;主区不生成,真实档保持原位)。所有改动与提交都在 worktree 内自由进行——commit 点零钩子检查(`tools/hooks/pre-commit` 已删除)。豁免面仅 `.zcode/`(钩子与配置)与 `.qoder/`(本机 harness 配置)允许主工作区直改——两份实测均不入 git(走 worktree 反而带不进去,改动只对本机生效)
|
1. **主区直改车道(一切面)**:`game/`(含代码面=`game/` 下非 `.md` 的行为载体)、`design/`、`reports/`、`tools/`、根规则与清单文件、`.zcode/`、`.qoder/`——直接改、直接提交。验收分两层:commit 点 git pre-commit 钩子(`tools/hooks/pre-commit`,经 `core.hooksPath` 挂载,在位性由 run_all_gates.sh 跑批自检)现场跑 `tools/run_all_gates.sh --docs`(秒级文本扫描)绿即落地红即拦,合并收尾提交跳过(MERGE_HEAD 在,内容归合回后 CI);代码面的全量验证归合回后本地 CI(下条)。开发期纪律不变:卡内只测自己改的东西、出红只跑红件最小单元(§6)
|
||||||
2. **收口顺序(固定)**:**冻结 → 件核 → 并 master → 重塑 → 主区合回 → 删区**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先在 worktree 内 `git merge master` 解冲突(必须在合回之前,合回后才并=CI 验的是中间态);**重塑**=迭代分支(iter<N> 形)合回前执行 `python tools/reshape_cards.py`,把分支线性史按卡末态快照压成一卡一笔(可选追加一笔纯文档收尾),master 台账由此每卡一行——工具自带「重塑前后树逐字节一致」断言与 backup 分支,不改任何文件内容;非迭代批免重塑;然后主工作区 `git merge --no-ff <任务分支>`(pre-merge-commit 钩子先跑前置检查——冒烟+单元全套件约 2 分钟,红则停合并提交,细则见第 4 条 ③)——这是主区唯一合法写动作(合回守卫对迭代分支数卡校验,未归卡提交拦下)。**合回落地即 `git worktree remove`+删分支(合回即删,2026-09-19 原裁);post-merge 钩子已在合回落地时自动触发 CI,红态不回滚合并——新开修复 worktree(`fix-<任务名>` 分支,非 iter<N> 形免重塑免数卡)修复提交再合,落地复验追绿后删修复区**。批内的验证义务按 §4 改完即测铁规履行——改完即测自己改过的那部分,不请示、不等点名;收口顺序本身不设跑批关口。**卡片复核前置判据(2026-11-05 用户裁)**:需求卡片的 grilling 复核先于卡片提交、卡片提交先于合回——复核未跑完、缺陷清单未裁完,禁把卡片落 commit(落了也不算成立),`master` 永不落未成立卡;本条与 §2 段三出口铁律、doc-conventions §12.1「已写卡」凭据同判。
|
2. **合回后验证(本地 CI,2026-10-30 用户裁)**:git merge 合回 master 落地后 post-merge 钩子(`tools/hooks/post-merge`)后台触发 `tools/ci_runner.sh merge` 对 master 尖跑一次全量域闸——唯一强制全量验证点;CI 红态下每个修复提交经 post-commit 钩子(`tools/hooks/post-commit`)自动追绿复验,绿态与无状态零触发。重跑判据:同一份字节禁止第二次人手跑;有意义的重跑只剩「验证修复」一类。CI 红不回滚合并——红项记 `game/tests/.gates/ci-status.json`,修复提交追绿;开工先读 CI 状态,红未修不开新批。跑批起手 `--editor --quit` 刷类名缓存(在册坑:.godot 缓存不入 git,合并后失配假红假绿)——原「合并后零复跑」的秒级动作由跑批件接管。并跑语义=跑完补跑(coalesce):跑批期间新触发不中断当前轮,轮尾对最新尖端补跑,绝不逐笔各跑一轮
|
||||||
3. **合回后验证(远端 CI,2026-11-03 用户裁)**:git merge 合回 master 落地后 post-merge 钩子(`tools/hooks/post-merge`)自动 `git push origin master` 触发远端 CI(Gitea Actions,runner=Mac 本机 host 模式),工作流按改动域分流(分流算法单点=`tools/ci/domain_route.sh`:游戏码批=两域全量含渲染闸,文档批=文档域秒级闸,纯闸件/管线批=零触发)——唯一强制全量验证点。远端结果用 `tools/ci_check.sh <合并提交>` 按需现查(读该提交任务的 run 自身 `status`/`conclusion`,只呈报、不落盘),agent 开工先读 CI 状态的纪律不变,红未修不开新批。**绿须坐实**:零触发批的 run 照样建、照样 conclusion=success,但跑闸步是 `skipped`(run 55 实证)——一条闸都没跑不构成验证,现查件对此呈报「未验」(退出码 4),禁当绿证用;job 列表为空、取不到步级读数或工作流里没有跑闸步时呈报「不可判」,同样禁当绿证。CI 红态不回滚合并——修复走新开修复 worktree(`fix-<任务名>` 分支,非 iter<N> 形免重塑免数卡),修复合回落地即再推再验追绿(追绿同链)。导入缓存刷新(.godot 不入 git 的在册坑)由工作流「导入缓存刷新」步接管。**合回零等待纪律(2026-11-04 用户裁,取代 2026-11-02 回执等待纪律)**:合回落地即向用户呈报本批总结并止回合——不挂后台轮询、不等回执、不被唤醒;CI 结论什么时候要看就现查一次(`tools/ci_check.sh`,run 那时早已落定,秒级)。退役缘由=原轮询件把「commit status 离开 pending」当终局判据,会把 run 未落定期的尝试级失败写成终局红(run 37 实证:开跑 36 秒写红,该 run 三分半后 `conclusion=success`),且零触发批与 runner 排队必熬满超时再写红;同 commit 的多路轮询还重复覆写同一份判定。跑闸等一切分钟级跑批的等待纪律不变——后台运行,禁前台 sleep/轮询循环。
|
3. **worktree 批车道(大批约定,非强制)**:迭代实现批与大体量改动按约定仍走独立 worktree:`git worktree add ../g-plan2-<任务名> -b <任务分支>`;建区后立刻跑 `tools/setup_worktree_userdir.sh`——给该区独立 Godot user 目录(测试夹具、试玩日志、截图产物不与其他区共用;主区不生成,真实档保持原位)。收口顺序固定为**冻结 → 件核 → 并 master → 重塑 → 主区合回 → CI 验证**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先 `git merge master` 解冲突;**重塑**=迭代分支(iter<N> 形)合回前执行 `python tools/reshape_cards.py`,把分支线性史按卡末态快照压成一卡一笔(可选追加一笔纯文档收尾),master 台账由此每卡一行——工具自带「重塑前后树逐字节一致」断言与 backup 分支,不改任何文件内容;非迭代工程小批免重塑;然后主工作区 `git merge --no-ff <任务分支>`(合回守卫对迭代分支数卡校验,未归卡提交拦下),合并落地 post-merge 钩子触发 CI,红则修复提交(主区直提)追绿,全绿后 `git worktree remove`+删分支。游戏类测试(冒烟/单测/MC/探针)批内默认零执行(两入口铁规,见 §4),用户点名或当场问才跑
|
||||||
4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行)、主区一切 `git commit` 一律拦(含 MERGE_HEAD 态续合与链式命令;冲突/红态一律 git merge --abort → 回 worktree → 重新 git merge --no-ff)、`git commit --no-verify` 拦截(该旗标仅属用户)、iter<N> 分支合回的一卡一提交数卡校验、规则闸(写 design//game/ 前核对会话规约读取记录)。②post-merge 钩子——远端 CI 触发(只推送,不挂等待;仅主工作区,任务 worktree 内的合并不触发)。③git 层钩子=合回链两件:pre-merge-commit(合回前置检查,2026-11-06 用户裁:主区 merge 落合并提交前自动跑 `tools/run_all_gates.sh --premerge`=冒烟+单元全套件 4 分片,热导入缓存约 2 分钟;exit≠0 拦合并提交不拦合并动作——红态仓库停 MERGE_HEAD 态,处置唯一=git merge --abort → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合);快进合并不触发;--no-verify 可跳过且仅属用户)+post-merge(远端 CI 触发,只推送,不挂等待);合回链之外 git 层不设车道钩子——用户手工改动不受限;ZCode 层只约束 agent(子代理不经守卫层)
|
4. **执法分层(全机械,零自觉依赖)**:①git pre-commit 钩子——一切提交的文档域闸机检(合并收尾提交豁免)。②post-merge/post-commit 钩子——本地 CI 触发(仅主工作区;任务 worktree 内的合并不触发)。③`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:`git commit --no-verify` 拦截(该旗标仅属用户)、iter<N> 分支合回的一卡一提交数卡校验、规则闸(写 design//game/ 前核对会话规约读取记录)。git 层钩子对一切提交者生效(含用户手工提交,紧急出口 `--no-verify`);ZCode 层只约束 agent
|
||||||
5. **会话单区(2026-11-04 用户裁)**:建区粒度=回合——同一时刻每会话至多一个 worktree 在役;合入删区之前,会话内用户追加的事项一律并入在役区推进,禁为追加事项另开新区。区内全部事项完成后只做一次合入(一次 `git merge --no-ff`、post-merge 一次推送、远端 CI 只跑一次),追加事项在合入提交信息里分列;无改动需求的事项不建区。合回删区后用户再发令的事项=新回合,另开新区(区名取该回合主任务名)。CI 红的 `fix-<任务名>` 修复区属同一回合的追绿延续,不另算新区。迭代实现批(iter<N> 形分支)独占回合——其他类事项不得并入迭代区(合回守卫数卡校验本就拦未归卡提交),待其合回后按新回合另开。
|
|
||||||
|
|
||||||
## 2. 五段流水线
|
## 2. 五段流水线
|
||||||
|
|
||||||
**需求改动**(游戏代码,含随逻辑写/改的测试)按五段流水线走:**登记 → 文档设计/美术设计(两条设计线)→ 写需求卡片 → 迭代编排 → 实现**;工程/文档设计/美术素材三类改动不走写卡与编排段,走「(如需设计讨论)→ 用户发令 → 独立 worktree 直改 → 合回 CI」(车道细则见 §1)。两层口径(2026-10-25 用户立):需求卡片=需求单位的实施文档,任何工作量皆可写、皆可编入迭代;工作量限制只属迭代层——迭代估时总量 <5 个工作日=「冻结待凑批」,不可开工。段间不自动流转,每段转进由用户发令;每段一个技能入口(五者均装于项目 `.zcode/skills/`:doc-design/asset-ingest/req-card/iter-plan/iter),登记不立技能(条目格式由流水线闸强制)。设计工作在会话内进行、用户主导、禁无监管自跑。
|
**需求改动**(游戏代码,含随逻辑写/改的测试)按五段流水线走:**登记 → 文档设计/美术设计(两条设计线)→ 写需求卡片 → 迭代编排 → 实现**;工程/文档设计/美术素材三类改动不走写卡与编排段,走「(如需设计讨论)→ 用户发令直改 → 主区直改+commit 点闸」(车道细则见 §1)。两层口径(2026-10-25 用户立):需求卡片=需求单位的实施文档,任何工作量皆可写、皆可编入迭代;工作量限制只属迭代层——迭代估时总量 <5 个工作日=「冻结待凑批」,不可开工。段间不自动流转,每段转进由用户发令;每段一个技能入口(五者均装于项目 `.zcode/skills/`:doc-design/asset-ingest/req-card/iter-plan/iter),登记不立技能(条目格式由流水线闸强制)。设计工作在会话内进行、用户主导、禁无监管自跑。
|
||||||
|
|
||||||
| 段 | 入口技能 | 产出 | 出入口铁律 |
|
| 段 | 入口技能 | 产出 | 出入口铁律 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 一·登记 | 无(闸管格式) | 待办清单条目 | 条目=标题登记元数据(日期/来源/可选优先级)+正文四属性(实况/缺口/改动面/状态);标题登记后不再变,正文随进程演进。格式与状态机权威=doc-conventions 第 12 节 |
|
| 一·登记 | 无(闸管格式) | 待办清单条目 | 条目=标题登记元数据(日期/来源/可选优先级)+正文四属性(实况/缺口/改动面/状态);标题登记后不再变,正文随进程演进。格式与状态机权威=doc-conventions 第 12 节 |
|
||||||
| 二·文档设计/美术设计 | doc-design(文档线,兼任反哺点写入)/asset-ingest(美术录入;样张素材由用户主导产出) | GDD 文档或 art-bible/过审样张素材;画面类需求另出预览图(文档线,2026-11-05 用户裁) | 用户提起或从待办清单取出;会话内进行、用户主导、禁无监管自跑;经用户点头确认心智一致才许写入文档;完成判据=待裁点清零,带未裁点的是讨论稿;设计线闭合凭据记入待办清单实况清单(文档线=文档路径+版本号,美术线=art-bible 条款版本);缺哪条线写在缺口属性,闭合与否写在状态段。画面类需求(新增画面要素/布局/配色/动效等触碰画面呈现规格的改动)设计段先出预览图=目标画面的 HTML/SVG 效果图(diagram-design 通道,AGENTS.md 图优先的同款载体),经用户人审通过才许进写卡段;预览图内嵌对应 ux/ 规格文档并随附像素级视觉判据句(§7 第 2 条同款写法);缺陷修复以现行规格与在库基线为准,不触发新预览 |
|
| 二·文档设计/美术设计 | doc-design(文档线,兼任反哺点写入)/asset-ingest(美术录入;样张素材由用户主导产出) | GDD 文档或 art-bible/过审样张素材 | 用户提起或从待办清单取出;会话内进行、用户主导、禁无监管自跑;经用户点头确认心智一致才许写入文档;完成判据=待裁点清零,带未裁点的是讨论稿;设计线闭合凭据记入待办清单实况清单(文档线=文档路径+版本号,美术线=art-bible 条款版本);缺哪条线写在缺口属性,闭合与否写在状态段 |
|
||||||
| 三·写需求卡片 | req-card | 需求卡片 | 设计线闭合后用户发令;新玩法/新系统/新内容必须有设计定稿前置,例外=需求性工程条目(缺陷修复/重构等改游戏行为)凭实况里的证据指认跳过设计线;配套维护类(工程债/测试基建/工具维护,不动游戏行为)=工程改动直改类,不走本段,由用户发令直改;卡片必经 grilling 多轮复核、零待裁点才成立;复核发现按四类去向处置(2026-11-05 用户立规,定义在 req-card 技能「复核发现四类分流」:自判=查权威文档或查代码现状有唯一答案,复核者自己下结论改卡;补写=卡里漏写,回炉补全;待裁=几种做法都不违规且代价不同、影响玩法取向,才交用户;退回上游=文档设计线未闭合、美术设计线未闭合、或架构与代码规范本身冲突,停笔退对应段);成立凭据=卡内「复核记录」节(2026-11-06 用户裁:不另设复核报告文件),顺序未走完禁对用户称完成、禁落 commit(同 §1 第 2 条卡片复核前置判据);写完在待办清单状态记「已写卡」,卡片路径记入实况清单(防遗忘);画面类需求卡片必引设计段已人审的预览图(验收判据的判据出处行锚指向 ux/ 内嵌预览节,test-conventions §8.3 锚口径不变) |
|
| 三·写需求卡片 | req-card | 需求卡片 | 设计线闭合后用户发令;新玩法/新系统/新内容必须有设计定稿前置,例外=需求性工程条目(缺陷修复/重构等改游戏行为)凭实况里的证据指认跳过设计线;配套维护类(工程债/测试基建/工具维护,不动游戏行为)=工程改动直改类,不走本段,由用户发令直改;卡片必经 grilling 多轮复核、零待裁点才成立;写完在待办清单状态记「已写卡」,卡片路径记入实况清单(防遗忘) |
|
||||||
| 四·迭代编排 | iter-plan | roadmap 迭代行 | **开工前预检(2026-11-07 用户立)**:收令点名拟编卡集后、五查与落表前,对卡集做一轮只读事实面预检——八类检查、P1/P2/P3 分级去向与只读子代理执行方式=iter-plan 技能「第 3 步·开工前预检」;P1 红项停编排、退回写卡段,禁编入。预检目标=尽量减少实现期停工、非杜绝——环境漂移与卡片并行修改仍可在实现期停工,由实现段异常分级与 iter T0 开工日窄复核兜底。编排五查:①每卡卡片文件存在 ②每卡设计闭合凭据齐(或需求性工程条目的证据指认)③估时与冻结线——所选卡估时按区间**中值**求和(单位工作日、写精确值不取整):**卡片任何工作量均可编入**(2026-10-25 用户立:工作量限制属迭代层、非卡片层);编入后迭代总量 <5 个工作日=迭代行状态「冻结待凑批」、不可开工,凑批 ≥5 后由编排段改「待开工」(迭代体量偏好,2026-10-21 用户立、2026-10-25 改冻结制);5–10 个工作日为常规区间;超过 10 个工作日须经用户确认(确认前呈报整批/拆批两案等裁,禁自行拆分或塞入),确认后迭代行随带日期特批标记;超过 20 个工作日禁止编(硬上限,用户确认也不放行,必须拆批)④每卡复核记录在位(2026-11-05 用户立规;2026-11-06 用户裁凭据换代——复核凭据=「复核记录」节自身,不另查报告文件)——卡内有「复核记录」节;缺节或节内任一条发现没有去向标记则呈报退回写卡段,禁编入,本段不代跑复核也不代补记录(生效=卡片文件名日期 ≥2026-11-06,旧卡不回头改)⑤写完 roadmap 行后跑流水线闸确认绿;编入未完成迭代,新开迭代行经用户确认 |
|
| 四·迭代编排 | iter-plan | roadmap 迭代行 | 编排四查:①每卡卡片文件存在 ②每卡设计闭合凭据齐(或需求性工程条目的证据指认)③估时与冻结线——所选卡估时按区间**中值**求和(单位工作日、写精确值不取整):**卡片任何工作量均可编入**(2026-10-25 用户立:工作量限制属迭代层、非卡片层);编入后迭代总量 <5 个工作日=迭代行状态「冻结待凑批」、不可开工,凑批 ≥5 后由编排段改「待开工」(迭代体量偏好,2026-10-21 用户立、2026-10-25 改冻结制);5–10 个工作日为常规区间;超过 10 个工作日须经用户确认(确认前呈报整批/拆批两案等裁,禁自行拆分或塞入),确认后迭代行随带日期特批标记;超过 20 个工作日禁止编(硬上限,用户确认也不放行,必须拆批)④写完 roadmap 行后跑流水线闸确认绿;编入未完成迭代,新开迭代行经用户确认 |
|
||||||
| 五·实现 | iter | 代码与配置,可运行的游戏 | 需求卡片永不单独施工,统一由用户指定迭代号触发(=U0 开工令),按 iter 技能与本文 §3 执行;**本段是代码实现批:禁写 `design/` 与根规则文件,产出物只落 `reports/`(见 §3 第 12 条)**;设计权威文档(GDD/art-bible)批内一律不更新;完成人闸=实机目检清单+实现决定记录写齐即完成批内义务;画面类需求实现批另按 test-conventions §8.2 黄金图基线冻结口径执行(实跑截图入基线前用户逐张审核确认+审核记录落档,此后渲染闸自动盯);**golden 基线改动批(含非卡片批的迁移/重构/容差修订)merge 前须用户审核通过(test-conventions §8.2 审核关卡),未审核的基线禁合回** |
|
| 五·实现 | iter | 代码与配置,可运行的游戏 | 需求卡片永不单独施工,统一由用户指定迭代号触发(=U0 开工令),按 iter 技能与本文 §3 执行;**本段是代码实现批:禁写 `design/` 与根规则文件,产出物只落 `reports/`(见 §3 第 12 条)**;设计权威文档(GDD/art-bible)批内一律不更新;完成人闸=实机目检清单+实现决定记录写齐即完成批内义务 |
|
||||||
|
|
||||||
**实现段零裁断**:实现段的输入在编排段出口已锁死(卡片零待裁点+设计闭合凭据齐+编排五查过)。实现中冒出卡片没写清的分歧=上游缺陷——停该卡、待办清单状态回退+缺口补记,退回上游;禁自答、禁内联提问求裁断;该卡停摆不阻塞同迭代其他卡。环境故障与测试红走异常分级(自救重试/记录继续/停机呈报)。代拍板白名单保留:授权发生在卡片审问阶段,实现只执行预授权;超白名单/超卡片明列范围事项记入实现报告「实现决定记录」节备案,不另立追认单。
|
**实现段零裁断**:实现段的输入在编排段出口已锁死(卡片零待裁点+设计闭合凭据齐+编排四查过)。实现中冒出卡片没写清的分歧=上游缺陷——停该卡、待办清单状态回退+缺口补记,退回上游;禁自答、禁内联提问求裁断;该卡停摆不阻塞同迭代其他卡。环境故障与测试红走异常分级(自救重试/记录继续/停机呈报)。代拍板白名单保留:授权发生在卡片审问阶段,实现只执行预授权;超白名单/超卡片明列范围事项记入实现报告「实现决定记录」节备案,不另立追认单。
|
||||||
|
|
||||||
**流水线闸**:`tools/pipeline_gate.py` 机检待办清单与 roadmap 两文件的格式与互相引用;已注册进 `run_all_gates.sh` 文档域。流程文档的条目格式、迭代行格式与状态机细则见 doc-conventions 第 12 节。
|
**流水线闸**:`tools/pipeline_gate.py` 机检待办清单与 roadmap 两文件的格式与互相引用;已注册进 `run_all_gates.sh` 文档域。流程文档的条目格式、迭代行格式与状态机细则见 doc-conventions 第 12 节。
|
||||||
|
|
||||||
@@ -36,34 +35,34 @@
|
|||||||
每个批次按以下链路执行(本清单是总索引,细则散见各规约;冲突以细则为准,发现清单过时须同批修订):
|
每个批次按以下链路执行(本清单是总索引,细则散见各规约;冲突以细则为准,发现清单过时须同批修订):
|
||||||
|
|
||||||
**开工前**
|
**开工前**
|
||||||
1. **先检索后提问**——先查在册记忆与权威文档,禁把已裁决事项当新问题重问或重踩在册坑。本条对五段流水线的每一段都生效,不限批次开工前(2026-11-05 用户扩面):权威文档(所属系统 owner 文档、本文与 `design/engineering/` 其余规约、architecture、术语表)或代码现状能给出唯一答案的,禁当问题呈报用户——写了卡片的复核环节也一样,详见 req-card 技能「复核发现四类分流」
|
1. **先检索后提问**——先查在册记忆与权威文档,禁把已裁决事项当新问题重问或重踩在册坑
|
||||||
2. **需求卡片全列备选案**——每个待拍板点列全部备选方案与代价交用户裁决,禁卡片内自行定夺。**待拍板点的边界(2026-11-05 用户立规)**=只有「几种做法都不违反权威文档、代价不同、影响玩法或体验取向」的分叉才算待拍板点;查权威文档或查代码现状就有答案的、以及卡里漏写要补的(名字与参数、测试落点、钉住的取值),一律由写卡段与复核环节自己定下来写进卡,禁转成问句
|
2. **需求卡片全列备选案**——每个待拍板点列全部备选方案与代价交用户裁决,禁卡片内自行定夺
|
||||||
3. **用户发开工令才动手**——需求卡片经用户批准(U0)后方开工
|
3. **用户发开工令才动手**——需求卡片经用户批准(U0)后方开工
|
||||||
|
|
||||||
**环境与基线**
|
**环境与基线**
|
||||||
4. **一切批走 worktree 车道+拷导入缓存**——按 §1 建 worktree(建区粒度=回合,同回合多批共用一区——§1 第 5 条);涉代码域跑闸或测试的批先拷主区 `.godot/` 目录与字体 `.import` 边车(纯文档批免拷),否则全量重导入资源近似卡死。检出工作区无改动即无验证义务(§4 的反面),直接开工;闸壳每次跑批先自检/自愈本区 user 目录隔离(§1 第 1 条),建不起来即拒跑
|
4. **代码面批独立 worktree+拷导入缓存**——触及代码面的批次按 §1 建 worktree;先拷主区 `.godot/` 目录与字体 `.import` 边车再跑测试,否则全量重导入资源近似卡死。检出工作区零测试,直接开工(2026-10-22 频率规则);闸壳每次跑批先自检/自愈本区 user 目录隔离(§1 第 1 条),建不起来即拒跑;直改车道(非代码面)无此项
|
||||||
5. **涉数值改动先采改前读数**——与改后同随机种子配对比较并写明逐项比对口径;无数值改动禁跑模拟。**Alpha 阶段口径(2026-11-04 用户裁)**:Alpha 阶段先做机制与内容填充,数值层统一修正殿后——本阶段的投放批与内容批零读数、零 MC 取证,改前读数与难度带读数义务后移到数值统一修正批执行;本条对数值统一修正批本身恢复原义。
|
5. **涉数值改动先采改前读数**——与改后同随机种子配对比较并写明逐项比对口径;无数值改动禁跑模拟
|
||||||
|
|
||||||
**实施**
|
**实施**
|
||||||
6. **新功能必配新测试**——新增玩法/机制必须配套新测试套件进 `tests/run_all`,并按 test-conventions §8 挂进改动—验收对照表;两者的履行与取证按 §4 改完即测铁规(改完即跑、读数在案),不在收口顺序里另设跑批关口。拆件/重构产出的新 core 件不属新增玩法,由 test-conventions §8.3「新增 core 件的覆盖登记义务」承接(被 tests 面点名,或在能力行申报「经宿主链覆盖」),核对动作归本清单第 10 条的收尾提交
|
6. **新功能必配新测试**——新增玩法/机制必须配套新测试套件进 `tests/run_all`;没有对应测试的变更不许合并;并按 test-conventions §8 挂进改动—验收对照表,没有对照表行的行为改动同样不许合并
|
||||||
7. **验收改动先行声明**——验收变化(基线换代/探针增改/旧断言改判)预先写进需求卡片,禁事后补
|
7. **验收改动先行声明**——验收变化(基线换代/探针增改/旧断言改判)预先写进需求卡片,禁事后补
|
||||||
|
|
||||||
**完成**
|
**完成**
|
||||||
8. **合回后 CI 验证(唯一强制全量验证点)**——主工作区 `git merge --no-ff <任务分支>` 落地后 post-merge 钩子自动推送 origin master 触发远端 CI;远端按改动域分流(§1 第 3 条),全量档兜的是跨卡触面、探针与未申报套件的消费漏网(迭代 44 实证),判定与红项用 `tools/ci_check.sh <合并提交>` 按需现查(读 run 终局态,只呈报不落盘)。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。`tools/run_all_gates.sh` 是全部验证闸的**唯一入口、唯一清单与唯一域划分(含选闸算法与套件族映射表)**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。开发期的验证义务与选档一律见 §4,CI 全量档不替代它。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占 CI 全量——其质量义务=按 §4 把该件实跑一遍(最小参数全路径含产出落盘)并核对判据口径未变;闸真崩溃时远端 CI 判红在案(job 失败=verdict 红,fail-closed 语义保留)。合回前的 pre-merge-commit 前置检查(§1 第 4 条 ③)是当场拦截面不是验证台账——不落回执不入基线,不改变本条「唯一强制全量验证点」口径
|
8. **合回后 CI 验证(worktree 批;主区直改小批的验收在 commit 点由 git 钩子执行,见 §1 第 1 条)**——主工作区 `git merge --no-ff <任务分支>` 落地后 post-merge 钩子自动跑全量域闸(不带参数档,02 全套件),判定与红项落 `game/tests/.gates/ci-status.json`。全量是唯一强制档:跨卡触面、探针与未申报套件的消费漏网只有全量闸能抓(迭代 44 实证),关联档选测的盲区由它兜底。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。该脚本是全部验证闸的**唯一入口、唯一清单与唯一域划分(含选闸算法与套件族映射表)**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。开发期手动跑批按需选档(按文件性质判域:代码面→`--code`,文档件→`--docs`,两类都有→全量;`--code` 关联档选测——02 只跑「需求卡片申报 ∪ diff 推导」并集套件、00 冒烟/01 系统测试/09 静态扫描三件保险恒跑、横切面回落全量——算法见闸脚本),手动跑不构成验收。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占 CI 全量——其质量义务=落批时人工确认闸可跑通且判据口径未变;闸真崩溃时 CI 判红在案(跑不出回执=verdict 红,fail-closed 语义保留)
|
||||||
9. **重跑语义(2026-10-30 用户裁)**——同一份字节禁止第二次人手跑;允许的重跑只剩三类:① CI 红后的修复合回(post-merge 钩子再推再验,每轮修复至多触发一轮);② 用户自发发起的全量回归;③ 合回 pre-merge-commit 前置检查(§1 第 4 条 ③——与合回后远端跑批判面不同档〔拦截面 vs 台账〕,不算同一判面的二次人手跑)。「跑都跑了再跑一遍保险」「顺手改点再补一跑」都不构成重跑理由。导入缓存刷新由远端工作流「导入缓存刷新」步接管,合并后无手工动作
|
9. **重跑语义(2026-10-30 用户裁,取代原「每批一次/合并后零复跑」口径)**——同一份字节禁止第二次人手跑;允许的重跑只剩两类:① CI 红后的修复提交(post-commit 钩子自动追绿复验,每笔修复至多触发一轮);② 用户自发发起的全量回归。「跑都跑了再跑一遍保险」「顺手改点再补一跑」都不构成重跑理由。类名缓存刷新与开机确认由 CI 跑批起手接管(§1 第 2 条),合并后无手工动作
|
||||||
10. **批次完成后的登记义务**——合回 master 后按 doc-conventions §12.1 推进待办清单条目状态(做完整条删除),涉及迭代编排的在 roadmap 迭代总表与顶部「当前位」节换代——执行入口=项目技能 batch-closure(批后收尾与中间文档退役),跨会话教训写记忆库。批次过程与结论由 git 提交信息承载,禁止再写会话状态文件(见 doc-conventions 第 10 节)。`design/` 与根规则文件(`AGENTS.md`/`roadmap.md`/`待办清单.md`/`体验验证清单.md`)实现批禁写,见 §12
|
10. **批次完成后的登记义务**——合回 master 后按 doc-conventions §12.1 推进待办清单条目状态(做完整条删除),涉及迭代编排的在 roadmap 迭代总表与顶部「当前位」节换代——执行入口=项目技能 batch-closure(批后收尾与中间文档退役),跨会话教训写记忆库。批次过程与结论由 git 提交信息承载,禁止再写会话状态文件(见 doc-conventions 第 10 节)。`design/` 与根规则文件(`AGENTS.md`/`roadmap.md`/`待办清单.md`/`体验验证清单.md`)实现批禁写,见 §12
|
||||||
11. **文档同步闸(实现批禁写文档)**——实现批**禁写 `design/` 整个目录与根规则文件**,**另禁写 `game/tests/README.md`(能力清单,归写卡段维护,test-conventions §8.9)**,要往外交代的东西一律落 `reports/`:实现报告 `reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录——超白名单/超卡片明列范围事项逐条记「决了什么/为什么/代价/撤销方式」,全部按卡执行时只写一行「零拍板」)、GDD 反哺点清单 `reports/iter<N>-反哺点-<日期>.md`(每条写清哪个文件哪一节、改成什么、依据是什么)。设计权威文档(GDD/art-bible)**任何批都不直改**:用户在会话中逐点裁决后,由工程/文档设计改动批(直改类)写入 `design/`(执行入口=doc-design 技能),并把反哺条目从 `reports/` 清掉(吸收即死;退役执行=batch-closure 技能)。机械面文档(roadmap 行/术语表/README 工具注)同样归工程/文档设计改动批在合并前更新。反哺点未落地期间相关 GDD 节视为待反哺,读前先查 `reports/` 与待办清单;需求卡片必列「关联文档同步面」按两层标注
|
11. **文档同步闸(实现批禁写文档)**——实现批**禁写 `design/` 整个目录与根规则文件**,**另禁写 `game/tests/README.md`(能力清单,归写卡段维护,test-conventions §8.9)**,要往外交代的东西一律落 `reports/`:实现报告 `reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录——超白名单/超卡片明列范围事项逐条记「决了什么/为什么/代价/撤销方式」,全部按卡执行时只写一行「零拍板」)、GDD 反哺点清单 `reports/iter<N>-反哺点-<日期>.md`(每条写清哪个文件哪一节、改成什么、依据是什么)。设计权威文档(GDD/art-bible)**任何批都不直改**:用户在会话中逐点裁决后,由工程/文档设计改动批(直改类)写入 `design/`(执行入口=doc-design 技能),并把反哺条目从 `reports/` 清掉(吸收即死;退役执行=batch-closure 技能)。机械面文档(roadmap 行/术语表/README 工具注)同样归工程/文档设计改动批在合并前更新。反哺点未落地期间相关 GDD 节视为待反哺,读前先查 `reports/` 与待办清单;需求卡片必列「关联文档同步面」按两层标注
|
||||||
12. **实机目检归用户,只登记不阻塞**——真人检测项登记进实现报告目检总清单与体验验证清单即完成批内义务;禁把等目检当停工理由或完成前置
|
12. **实机目检归用户,只登记不阻塞**——真人检测项登记进实现报告目检总清单与体验验证清单即完成批内义务;禁把等目检当停工理由或完成前置
|
||||||
13. **中间产物吸收即死**——细则见 AGENTS.md 硬性红线与 doc-conventions 第 11 节
|
13. **中间产物吸收即死**——细则见 AGENTS.md 硬性红线与 doc-conventions 第 11 节
|
||||||
14. **改动级验收闭合**——写卡期列需求侧对照表,实现期补实际对照表(测试文件:行),每个行为改动的验收断言从真实入口进入、在当轮真实跑批中执行并通过(判据绑定面口径=test-conventions §8.4;禁变异类测试与撤销类取证,2026-10-24/28 用户两裁);合回前独立验收审计。细则=test-conventions §8
|
14. **改动级验收闭合**——写卡期列需求侧对照表,实现期补实际对照表(测试文件:行),每个行为改动的验收断言从真实入口进入、在当轮真实跑批中执行并通过(判据绑定面口径=test-conventions §8.4;禁变异类测试与撤销类取证,2026-10-24/28 用户两裁);合回前独立验收审计。细则=test-conventions §8
|
||||||
|
|
||||||
## 4. 改完即测铁规(细则)
|
## 4. 测试执行两入口铁规(细则)
|
||||||
|
|
||||||
**改完即测(2026-11-05 用户裁,取代原「测试执行两入口铁规」及一切「默认零执行/先请示/不构成验收」口径)**——任何会话里的任何改动,落笔之后立刻跑一遍覆盖该改动面的验证并跑绿、读数写进这一步的提交信息,这一步才算完成。跑什么由改动面决定,载体一律见 `tools/run_all_gates.sh` 的域划分与该件自身的直跑方式:游戏行为面=被改的测试套件与场景探针从真实入口直跑;文档面=该脚本的文档域档;工具件与闸壳=该件自己最小参数全路径跑一遍含产出落盘(动了闸壳本体时,按 §6 第 2 条它的最小充分单元就是全套档)。不扩出改动面、不请示、不等点名;未改动的面不测,零改动的会话(问答/调研/审查/纯读码)根本不触发本条。合回后远端 CI 的全量跑批不替代本条,本条也不得拿去重跑 CI 已跑过的同一份字节(§3 第 9 条)。读数类采集(MC/verifier)不在该域划分内,不属本条义务,触发权与档位见 §5。
|
测试类执行——冒烟、单元测试(tests/run_all)、模拟验证(MC/verifier/调参批量工具)、场景探针等一切跑游戏的验证——只有两个触发入口:①**迭代 loop 开发**(冒烟挂迭代出口/入库闸,loop 内过程性验证属开发工作本身);②**用户主动点名**。其余会话(问答/调研/文档/审查/零散小改)一律零测试;确需测试支撑结论时先请示,以静态阅读/推理作答并注明未跑测。
|
||||||
|
|
||||||
**MC/verifier 触发细则**:仅在数值验证场景触发(改数值前后取证);normal 档为主、perfect 按需;**无数值改动的会话禁跑 MC**;结构位移类「存档锚」须先向用户请示定性再跑;需求卡片预设步骤的前提消失时(如「带值裁定后重锚」实际未投值)停问勿照字面执行。
|
**MC/verifier 触发细则**:仅在数值验证场景触发(改数值前后取证);normal 档为主、perfect 按需;**无数值改动的会话禁跑 MC**;结构位移类「存档锚」须先向用户请示定性再跑;需求卡片预设步骤的前提消失时(如「带值裁定后重锚」实际未投值)停问勿照字面执行。
|
||||||
|
|
||||||
**分档口径**:全部验证闸收编在 `tools/run_all_gates.sh` 一个入口下(**脚本即清单,且即域划分的唯一出处**)——按改动域选档跑,档位清单与选闸算法只写在脚本头部注释,本文不重列;开发期的跑批义务一律按 §4 履行。唯一强制全量点=合回后远端 CI(§1 第 3 条、§3 第 8 条)。真人实机目检归用户不进自动闸。
|
**分级周期口径**:全部验证闸收编在 `tools/run_all_gates.sh` 一个入口下(**脚本即清单,且即域划分的唯一出处**),分三档——`--code`/`--docs` 按本批改动域只跑该域闸(闸件清单与域划分只写在脚本头部注释,本文不重列);`--quick` 是全量档的中段自检形态(跳过渲染闸与静态扫描);**不带参数=两域全量**。强制验证点=合回后本地 CI 的全量档(§1 第 2 条);分档只服务开发期手动跑批。真人实机目检归用户不进自动闸。
|
||||||
|
|
||||||
## 5. MC 采集档位细则
|
## 5. MC 采集档位细则
|
||||||
|
|
||||||
@@ -76,9 +75,9 @@
|
|||||||
| 三档·小调 | 只测不判 | 总量 ≤20、每档 ≤10 | 数值验证场景 |
|
| 三档·小调 | 只测不判 | 总量 ≤20、每档 ≤10 | 数值验证场景 |
|
||||||
| 四档·微量 | sanity 门,零统计判读 | 总量 ≤5 | 数值验证场景 |
|
| 四档·微量 | sanity 门,零统计判读 | 总量 ≤5 | 数值验证场景 |
|
||||||
|
|
||||||
配套纪律:超档=停机呈报,窗口不足如实挂起,禁在二/三/四档下带值结论;改前/改后锚同 seed0 配对、改前锚留盘禁补跑;逐项比对断言零新跑(复验用锚内子集 ≤20);读数缺陷(零 gameplay/RNG 触碰)禁整套重跑、走事件流重构补算;≥60 局采集先 N=5 pilot 校验字段;二/三/四档会话累计 ≤20 分钟;零数值改动=零 MC;四档仅承接数值验证场景,读数采集的触发权不随 §4 改完即测铁规扩大。
|
配套纪律:超档=停机呈报,窗口不足如实挂起,禁在二/三/四档下带值结论;改前/改后锚同 seed0 配对、改前锚留盘禁补跑;逐项比对断言零新跑(复验用锚内子集 ≤20);读数缺陷(零 gameplay/RNG 触碰)禁整套重跑、走事件流重构补算;≥60 局采集先 N=5 pilot 校验字段;二/三/四档会话累计 ≤20 分钟;零数值改动=零 MC;四档仅承接数值验证场景,两入口铁规不变。
|
||||||
|
|
||||||
## 6. 闸机轮次纪律(§4 改完即测的执行形状:何时只跑最小单元、何时才够格跑全套)
|
## 6. 闸机轮次纪律
|
||||||
|
|
||||||
1. **孤立验证先行**——新代码/新工具/新断言进全套闸之前,先走通最小可运行路径的 standalone 验证(30 秒级:新断言=单独驱动函数直跑;新工具=最小参数全路径试车含产出落盘;新探针=单 .tscn 直跑);禁以全套闸首跑充当新码首验
|
1. **孤立验证先行**——新代码/新工具/新断言进全套闸之前,先走通最小可运行路径的 standalone 验证(30 秒级:新断言=单独驱动函数直跑;新工具=最小参数全路径试车含产出落盘;新探针=单 .tscn 直跑);禁以全套闸首跑充当新码首验
|
||||||
2. **调试期最窄确认**——出红→修复→确认只跑出红的最小单元(单探针/单套件/单函数);全套闸每个里程碑步(波/T 段)出口最多一次,红灯补跑只跑红件;修的是全部探针/套件共用的共享件(冒烟包装器、闸机脚本本身)时全套即最小充分单元,注记说明即可
|
2. **调试期最窄确认**——出红→修复→确认只跑出红的最小单元(单探针/单套件/单函数);全套闸每个里程碑步(波/T 段)出口最多一次,红灯补跑只跑红件;修的是全部探针/套件共用的共享件(冒烟包装器、闸机脚本本身)时全套即最小充分单元,注记说明即可
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 测试规范(Dungeon Sweeper)
|
# 测试规范(Dungeon Sweeper)
|
||||||
|
|
||||||
> 约束范围:`game/probe/ 与 game/sim/`、`game/tests/` 与一切场景探针的编写与验收。
|
> 约束范围:`game/probe/ 与 game/sim/`、`game/tests/` 与一切场景探针的编写与验收。
|
||||||
> 分工:测试**执行义务**(改完必须测什么)归 AGENTS.md「硬性红线·改完即测铁规」与 `process-conventions.md` §4;**跑什么闸、什么顺序**归 `tools/run_all_gates.sh`(脚本即清单,本文与 AGENTS.md 均不另列);本文管测试怎么写、怎么算合格。每件测试工具**是什么、判什么、怎么单独跑、什么时候适合单独用**——见 `game/tests/README.md`(测试工具手册),本文不重复工具介绍。
|
> 分工:测试**执行许可**(什么时候允许跑测试)归 AGENTS.md「硬性红线·测试执行两入口铁规」;**跑什么闸、什么顺序**归 `tools/run_all_gates.sh`(脚本即清单,本文与 AGENTS.md 均不另列);本文管测试怎么写、怎么算合格。每件测试工具**是什么、判什么、怎么单独跑、什么时候适合单独用**——见 `game/tests/README.md`(测试工具手册),本文不重复工具介绍。
|
||||||
> 归属:随游戏逻辑写/改的测试=需求改动的一部分(随需求卡片同批落地);不伴随逻辑改动的纯测试维护=工程改动(不写卡,用户发令直改)。
|
> 归属:随游戏逻辑写/改的测试=需求改动的一部分(随需求卡片同批落地);不伴随逻辑改动的纯测试维护=工程改动(不写卡,用户发令直改)。
|
||||||
|
|
||||||
**定测试方案前必须通读本文。**
|
**定测试方案前必须通读本文。**
|
||||||
@@ -13,20 +13,6 @@
|
|||||||
核心层验收标准通过不算有测试:GDScript 编译不查字典字段与时序,呈现层错误只在运行时暴露。
|
核心层验收标准通过不算有测试:GDScript 编译不查字典字段与时序,呈现层错误只在运行时暴露。
|
||||||
测试必须证明功能可达(用户真的能用到)且行为正确(结果符合验收标准)。
|
测试必须证明功能可达(用户真的能用到)且行为正确(结果符合验收标准)。
|
||||||
|
|
||||||
### 1.1 测试层三元组(2026-11-07 用户裁——测试层识别权威表)
|
|
||||||
|
|
||||||
识别一个测试层靠三元组,不靠名字——**层级名只是代称**;名称与定义的登记面=`design/gdd/术语表.md`,本表是识别判据的单点:
|
|
||||||
|
|
||||||
| 层(代称) | 职责 | 触发时间点 | 覆盖面积 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 冒烟测试 | 真实开机路径存活检查——启动/加载表/进主屏,零逻辑判定 | 每次代码域跑批+合回前置检查+远端 CI(三件保险恒跑不降) | 最小:一条真实开机路径 |
|
|
||||||
| 单元测试 | 受控裸环境断言面:单机制契约+跨系统真实路径闭环——不加载开机装配、手工构造注入实跑;闭环套件=两以上真实系统手工装配×落盘往返,性质归属由各套件头注「跨系统面」句承载 | 同冒烟(恒跑;关联档选套件=需求卡片申报∪diff 推导并集,横切回落全量) | 领域类原子行为+跨系统接缝——不含开机装配与画面 |
|
|
||||||
| 系统测试 | 真实开机+真实玩法路径行为断言(推理→战斗→结算→推进) | 同冒烟(恒跑) | 完整装配下的玩法旅程 |
|
|
||||||
| 场景探针 | 真实实例化场景+真输入管线(合成输入事件走输入管线)的 UI 可达性/可见性/状态 | 代码域跑批(测量面批记 SKIP)+远端 CI | 逐 UI 区域交互动线 |
|
|
||||||
| 渲染闸 | 窗口化真实渲染截图 vs 冻结基线图逐像素容差比对 | 代码域跑批(测量面批与 --quick 记 SKIP)+远端 CI | 像素呈现(主题/素材/排版) |
|
|
||||||
|
|
||||||
层级合并说明(2026-11-07 用户裁):跨系统真实路径闭环套件归单元层承载,三套件实体在 `game/tests/unit/`;「集成测试/集成用例/集成层/集成侧/集成宿主/集成族」为退役词(术语表「退役词对照」;S11 注释面+用语审计文档面双承接)。
|
|
||||||
|
|
||||||
## 2. 场景级探针标配
|
## 2. 场景级探针标配
|
||||||
|
|
||||||
每新增一个可交互 UI 区域(视图/覆盖层/面板),必须配套场景级 headless 探针:
|
每新增一个可交互 UI 区域(视图/覆盖层/面板),必须配套场景级 headless 探针:
|
||||||
@@ -34,16 +20,14 @@
|
|||||||
|
|
||||||
凡模态覆盖层,探针必须断言:打开后自身 visible 且遮挡物已隐藏(模态被遮挡 = 功能存在但不可达)。
|
凡模态覆盖层,探针必须断言:打开后自身 visible 且遮挡物已隐藏(模态被遮挡 = 功能存在但不可达)。
|
||||||
|
|
||||||
**UI 驱动断言须走真输入管线(2026-11-06 立)**:探针里「点按钮/点场景物件」类驱动断言,一律经引擎输入管线承载(合成 InputEvent 走 `push_input`,press+release 成对;合成滚轮同样必须 press+release 成对——只发 press 会把鼠标焦点钉死在按下点控件上,后续点击全部失效);信号直发(`pressed.emit()` 等)绕过命中测试,保不了「玩家点击可达」,只许用于真输入到不了的面并当场标〔接线断言〕(现役例:置灰态穿透钉处理器兜底)。折叠区控件先以真输入滚轮滚入可视区再点。每个动线断言钉「落点」判定(点了之后到哪个屏/哪层可见),防驱动中断后的空转假绿。真输入命中控件时自动登记控件覆盖(探针共用面登记件落 `.gates/` 观测产物),覆盖面生长不靠人记。
|
|
||||||
|
|
||||||
## 3. 缺陷修复必须沉淀回归断言
|
## 3. 缺陷修复必须沉淀回归断言
|
||||||
|
|
||||||
每个缺陷修复必须在探针或冒烟中留下能抓住该缺陷的断言(例:封印动作耗尽 AP → 必须进入第 2 轮;
|
每个缺陷修复必须在探针或冒烟中留下能抓住该缺陷的断言(例:封印动作耗尽 AP → 必须进入第 2 轮;
|
||||||
选用道具 → 库存态必须变 Used)。没有回归断言的修复视为未完成。
|
选用道具 → 库存态必须变 Used)。没有回归断言的修复视为未完成。
|
||||||
|
|
||||||
## 4. 验证时机(合回后远端 CI 制,2026-11-03 换代)
|
## 4. 验证时机(合回后本地 CI 制,2026-10-30 换代)
|
||||||
|
|
||||||
开发期义务=`process-conventions.md` §4 改完即测铁规:本批新增/改动的验收测试自己跑绿、读数写进该步提交信息才算完成(卡内只测自己改的东西)。合回 merge 提交落笔前另有 pre-merge-commit 前置检查(2026-11-06 用户裁:冒烟+单元全套件 4 分片,约 2 分钟——当场拦截面,不落回执;细则见 process-conventions §1 第 4 条 ③)。全量验证归合回后的远端 CI:git merge 合回 master 落地后 post-merge 钩子推送 origin master,远端按改动域分流跑 `tools/run_all_gates.sh`(游戏码批=不带参数档两域全量、单元测试全套件——跨卡触面与关联档选测的盲区由全量兜底;文档批=文档域秒级闸;分流算法单点=`tools/ci/domain_route.sh`),远端结果用 `tools/ci_check.sh <合并提交>` 按需现查(读 run 自身 `status`/`conclusion`,只呈报、不落盘——合回不等待、不唤醒,process-conventions §1 第 3 条);CI 红态下修复合回落地即再推再验追绿(修复走新开 `fix-<任务名>` 修复 worktree,process-conventions §1)。同一份字节禁止第二次人手跑。该脚本是全部验证闸的唯一入口与唯一清单,域划分与选闸算法只写在脚本里,本文禁另列闸件清单。
|
开发期窄测义务不变:每批开发中,本批新增/改动的验收测试自己跑绿即收口(卡内只测自己改的东西,process-conventions §6);主区小改孤跑验证后直提。全量验证归合回后的本地 CI:git merge 合回 master 触发 post-merge 钩子跑 `tools/run_all_gates.sh` 不带参数档(两域全量,02 全套件——跨卡触面与关联档选测的盲区由全量兜底),结果落 `game/tests/.gates/ci-status.json`;CI 红态下修复提交经 post-commit 钩子自动追绿。同一份字节禁止第二次人手跑。该脚本是全部验证闸的唯一入口与唯一清单,域划分与选闸算法只写在脚本里,本文禁另列闸件清单。
|
||||||
行为探针使用随机化玩家行为(封印/停手/刷新/无效点击)——自动玩家不做的动作就是测试盲区。
|
行为探针使用随机化玩家行为(封印/停手/刷新/无效点击)——自动玩家不做的动作就是测试盲区。
|
||||||
|
|
||||||
## 5. 测试函数怎么写——验收清单条目的落码规范
|
## 5. 测试函数怎么写——验收清单条目的落码规范
|
||||||
@@ -51,7 +35,7 @@
|
|||||||
需求卡片 §8「改动—验收对照表」每一条都要落成可执行的验证;本文定统一写法,卡里定每批的具体内容(测什么/注入哪里)。写卡期查不出执行载体的条目=不可测,当场呈报,禁拖到实现期。
|
需求卡片 §8「改动—验收对照表」每一条都要落成可执行的验证;本文定统一写法,卡里定每批的具体内容(测什么/注入哪里)。写卡期查不出执行载体的条目=不可测,当场呈报,禁拖到实现期。
|
||||||
|
|
||||||
1. **执行载体五选一,逐条声明**:单元测试(`tests/run_all`)/系统测试断言(`tests/system_test.gd`)/场景探针(`probe/` 下 `*_probe`)/MC 同种子逐项比对/人工核对(仅限无法自动化的纪律类需求点,如命名锁定、数值占位)。行为类条目以自动化载体为主。
|
1. **执行载体五选一,逐条声明**:单元测试(`tests/run_all`)/系统测试断言(`tests/system_test.gd`)/场景探针(`probe/` 下 `*_probe`)/MC 同种子逐项比对/人工核对(仅限无法自动化的纪律类需求点,如命名锁定、数值占位)。行为类条目以自动化载体为主。
|
||||||
2. **粒度与对应关系**:每条清单条目至少一个自动断言,且断言必须从该条目的真实入口进入;多条条目可合用一个测试函数,但每条都要有自己单独可判红的判据(取证口径见 §8.4 唯一口径——禁变异/禁撤销)。断言失败消息末尾带编号尾缀〔卡短名 Vn〕(如〔秘宝批 V3〕)——断言与卡片清单可互相 grep 查找。`Kit.check_quiet` 静默收集形态(计数不入判定即打印、失败消息进 problems 汇总)的断言已入 `tools/extract_checks.py` 扫描面(2026-11-02 提取器改版:三通道同口径提取,静默通道条目 quiet 列记 `channel:check_quiet`),验收尾缀 grep 对该通道有效。
|
2. **粒度与对应关系**:每条清单条目至少一个自动断言,且断言必须从该条目的真实入口进入;多条条目可合用一个测试函数,但每条都要有自己单独可判红的判据(取证口径见 §8.4 唯一口径——禁变异/禁撤销)。断言失败消息末尾带编号尾缀〔卡短名 Vn〕(如〔秘宝批 V3〕)——断言与卡片清单可互相 grep 查找。**工具面局限备案(2026-10-27 迭代 39 验收审计)**:`Kit.check_quiet` 静默收集形态(计数不入判定即打印、失败消息进 problems 汇总)的断言消息不进 `tools/extract_checks.py` 扫描面——验收尾缀 grep 对该通道失效;如需覆盖属提取器改版(工程批)。
|
||||||
3. **断言词汇按验证对象五选一**:
|
3. **断言词汇按验证对象五选一**:
|
||||||
|
|
||||||
| 词汇 | 适用场景 |
|
| 词汇 | 适用场景 |
|
||||||
@@ -62,13 +46,13 @@
|
|||||||
| 重放 | 同种子断点回放、改前改后配对 |
|
| 重放 | 同种子断点回放、改前改后配对 |
|
||||||
| 状态/计数器断言 | 条件解锁、限次、充能——置数据→走路径→断计数值 |
|
| 状态/计数器断言 | 条件解锁、限次、充能——置数据→走路径→断计数值 |
|
||||||
|
|
||||||
4. **调试注入两层(能力测试与流程体验两分法的落码面)**:自动化测试=测试代码直调核心层写口构造状态(直改数据表行/计数器/存档域,不经 UI、不走正常资源积累流程——冒烟现役做法);人工体验=DebugOverlay/DS_DEBUG 调试面,服务用户目检(发布态该面恒隐、无 UI 开启口,开发期临时启用=本地改 `_debug_entry` 缺省、不提交;能力测试不经 UI,本条口径不受影响)。清单条目的「怎么测」必须写到数据面粒度:改哪张表哪行、置哪个计数、调哪个核心写口。
|
4. **调试注入两层(能力测试与流程体验两分法的落码面)**:自动化测试=测试代码直调核心层写口构造状态(直改数据表行/计数器/存档域,不经 UI、不走正常资源积累流程——冒烟现役做法);人工体验=DebugOverlay/DS_DEBUG 调试面,服务用户目检(发布态该面恒隐、无 UI 开启口——写死行已随迭代 38 卡⑦ 删除,开发期临时启用=本地改 `_debug_entry` 缺省、不提交;能力测试不经 UI,本条口径不受影响)。清单条目的「怎么测」必须写到数据面粒度:改哪张表哪行、置哪个计数、调哪个核心写口。
|
||||||
5. **换代批旧验证约束同生死**:删除旧数据行/旧实现代码的批次,必须同批摘除只验证旧实现的断言与护栏校验,由新断言替代——旧件断言残留=冒烟假绿来源;合并后冒烟全绿且全仓无旧件残留引用为证。
|
5. **换代批旧验证约束同生死**:删除旧数据行/旧实现代码的批次,必须同批摘除只验证旧实现的断言与护栏校验,由新断言替代——旧件断言残留=冒烟假绿来源;合并后冒烟全绿且全仓无旧件残留引用为证。
|
||||||
6. **违约通道类需求点必须落独立负面套件(2026-10-28 立)**:预期运行期违约/致命路径的需求点(handler 通道、fail-fast 分支)一律落独立负面套件并按 manifest 登记 `expect=1, negative=true`,禁落现役非负面套件——headless 下 assert 失败必产不可捕获的 SCRIPT ERROR,非负面套件的输出被错误扫描命中即假红(先例=reward_dangling_treasure/counter_prefix_fatal/extended_row_violation/run_time_fatal 四件)。
|
6. **违约通道类需求点必须落独立负面套件(2026-10-28 迭代 40 立)**:预期运行期违约/致命路径的需求点(handler 通道、fail-fast 分支)一律落独立负面套件并按 manifest 登记 `expect=1, negative=true`,禁落现役非负面套件——headless 下 assert 失败必产不可捕获的 SCRIPT ERROR,非负面套件的输出被错误扫描命中即假红(先例=reward_dangling_treasure/counter_prefix_fatal/extended_row_violation/run_time_fatal 四件)。
|
||||||
|
|
||||||
## 6. 判定三硬闸——闸承载的构造义务
|
## 6. 判定三硬闸——闸承载的构造义务(迭代 29 起)
|
||||||
|
|
||||||
任何**新增或改写的闸承载**(闸脚本/批跑编排/探针入口)必须三闸齐备;现行各闸状态登记归 `game/tests/README.md`(测试工具手册,本文不另列闸件清单):
|
任何**新增或改写的闸承载**(闸脚本/批跑编排/探针入口)必须三闸齐备;现行各闸状态登记归架构文档「测试与质量域」节(本文不另列闸件清单):
|
||||||
|
|
||||||
1. **退出码为唯一权威判据**——输出里的 PASS 串只作附加判据不作判据主体;打印 PASS 后 `quit(1)` 必须判红。
|
1. **退出码为唯一权威判据**——输出里的 PASS 串只作附加判据不作判据主体;打印 PASS 后 `quit(1)` 必须判红。
|
||||||
2. **SCRIPT ERROR / Parse Error 扫描面在位**——GDScript 脚本错误不改进程退出码、不计失败数(机制事实见 §7),错误标记必须扫输出,且判据必须覆盖「跑了但半途脚本错误」态——退出码 0 但输出缺预期签名同样判红(防静默退出)。
|
2. **SCRIPT ERROR / Parse Error 扫描面在位**——GDScript 脚本错误不改进程退出码、不计失败数(机制事实见 §7),错误标记必须扫输出,且判据必须覆盖「跑了但半途脚本错误」态——退出码 0 但输出缺预期签名同样判红(防静默退出)。
|
||||||
@@ -78,10 +62,10 @@
|
|||||||
|
|
||||||
**新写测试件全类型标注**——新写的测试件(冒烟断言/探针/单测)参数、返回值、容器一律带类型标注,与 S9 对产品码的要求同型;存量不强制清扫,被批次触碰时顺带换代。暂不机器闸(S9 扫描面=产品码,probe/sim/tests 不在扫描面是测量面直构惯例的既有裁量)。
|
**新写测试件全类型标注**——新写的测试件(冒烟断言/探针/单测)参数、返回值、容器一律带类型标注,与 S9 对产品码的要求同型;存量不强制清扫,被批次触碰时顺带换代。暂不机器闸(S9 扫描面=产品码,probe/sim/tests 不在扫描面是测量面直构惯例的既有裁量)。
|
||||||
|
|
||||||
## 7. 判定可靠性优先于覆盖率
|
## 7. 判定可靠性优先于覆盖率(迭代 29 核心命题)
|
||||||
|
|
||||||
- 「跑一遍没崩=通过」无效:测试绿只证明**当前代码没犯这个错**,不证明**犯了这个错会被抓住**;断言存在不等于断言执行。
|
- 「跑一遍没崩=通过」无效:测试绿只证明**当前代码没犯这个错**,不证明**犯了这个错会被抓住**;断言存在不等于断言执行。
|
||||||
- **脚本错误会静默中断所在函数的剩余断言,而套件仍报全绿**(机制事实):GDScript 无脚本错误陷阱 API,错误不改进程退出码、不计失败数。三处实证:①「309 项 0 失败」实为断言未跑全;②敌人表行集纪律 10 条断言因定型数组赋值错误从未执行(修复后两条正向见红=夹具本缺锚行);③`Callable` 形参类型写错致解析函数返回 null、后续断言整段蒸发。
|
- **脚本错误会静默中断所在函数的剩余断言,而套件仍报全绿**(机制事实):GDScript 无脚本错误陷阱 API,错误不改进程退出码、不计失败数。三处实证:①2026-09-19「309 项 0 失败」实为断言未跑全(状态记录 83);②敌人表行集纪律 10 条断言因定型数组赋值错误从未执行(迭代 29 修复后两条正向见红=夹具本缺锚行);③`Callable` 形参类型写错致解析函数返回 null、后续断言整段蒸发。
|
||||||
- 由此产生两条义务:**写闸件**按 §6 配三硬闸;**写验收函数**必须自证断言全数执行——真实入口断言在当轮执行并通过(§8.4)为主证,零命中自检(扫描面为空即判红)为辅证。
|
- 由此产生两条义务:**写闸件**按 §6 配三硬闸;**写验收函数**必须自证断言全数执行——真实入口断言在当轮执行并通过(§8.4)为主证,零命中自检(扫描面为空即判红)为辅证。
|
||||||
- **覆盖率不是目标**:不引入行覆盖率度量(Godot 无内建,第三方属新基建);现行补洞=能力清单覆盖域表+人工判定,判定可靠性靠上列自证手段,不靠覆盖率数字。
|
- **覆盖率不是目标**:不引入行覆盖率度量(Godot 无内建,第三方属新基建);现行补洞=能力清单覆盖域表+人工判定,判定可靠性靠上列自证手段,不靠覆盖率数字。
|
||||||
|
|
||||||
@@ -93,12 +77,10 @@
|
|||||||
|
|
||||||
### 8.2 四层与真实入口
|
### 8.2 四层与真实入口
|
||||||
|
|
||||||
- **单元**:不依赖场景树和真实宿主的纯逻辑;测试从领域类的对外方法进出,断言钉对外可观测面(返回值/信号/查询接口/落盘内容)。内部字段直查=受控例外:仅当该行为没有公开可观测面可钉时允许,对照表该行注明理由;存量不回头清扫,被批次触碰时顺带换代。探针直读视口承载子件结构(画布取视口首子件、渐隐带两片与平移提示子件按名取)属此类——断言对象即承载结构本身,无公开可观测面可钉,理由随对照表行申报。
|
- **单元**:不依赖场景树和真实宿主的纯逻辑;测试从领域类的对外方法进出,断言钉对外可观测面(返回值/信号/查询接口/落盘内容)。内部字段直查=受控例外:仅当该行为没有公开可观测面可钉时允许,对照表该行注明理由;存量不回头清扫,被批次触碰时顺带换代。
|
||||||
- **接口**:模块边界的公开契约——数据表加载、存档与断点、事件载荷、命令接口;测试从公开入口进出。接口级断言随单元套件落(`unit/contracts/`),不另设承载目录。
|
- **接口**:模块边界的公开契约——数据表加载、存档与断点、事件载荷、命令接口;测试从公开入口进出。接口级断言随单元套件落(`unit/contracts/`),不另设承载目录。
|
||||||
- **跨宿主**:跨宿主的接线、持久、生命周期——例如 LevelRunner 把 level_counters 传给 BattleOrchestrator、两场战斗共享同一个桶、断点续玩;测试必须实例化真实宿主链,禁止用裸 EffectEngine 代替。断言载体归单元层跨系统闭环套件(§1.1 三元组表),验收入口不变。
|
- **集成**:跨宿主的接线、持久、生命周期——例如 LevelRunner 把 level_counters 传给 BattleOrchestrator、两场战斗共享同一个桶、断点续玩;测试必须实例化真实宿主链,禁止用裸 EffectEngine 代替。
|
||||||
- **探针/golden**:玩家可达性与观感;真实实例化场景、驱动真实输入。
|
- **探针/golden**:玩家可达性与观感;真实实例化场景、驱动真实输入。
|
||||||
- **golden 测试项扩项(2026-11-05 立)**:触碰画面呈现规格的需求批(新增画面要素/布局/配色/动效;判据=设计段出了预览图),实现段把该画面纳入渲染闸机器面:截图采集清单扩项+实跑截图冻结进 `game/tests/golden/`(基线属入库测试资产,render_gate.sh 在册例外)。黄金图=游戏真实渲染截屏冻结的逐像素基准,比对器与容差口径见 render_gate.sh 头注释(脚本即清单,本文不另列)。基线冻结(新建与换代同口径)=**用户逐张审核确认后执行**,触发原因写进当批提交说明(`tools/golden_baseline_refresh.sh` 现役义务);此后渲染闸逐像素自动盯、零人工。预览图(HTML/SVG 效果图)与引擎渲染是两套管线,禁直接充当比对基线——预览图只作人审参照与验收判据句的出处(判据出处行锚指向 ux/ 内嵌预览节);缺陷修复以现行规格与在库基线为准,不触发新预览。
|
|
||||||
- **golden 基线冻结审核关卡(2026-11-08 用户立)**:基线=人定标准、机器守标准——**任何基线的新建/换代/迁移/容差修订,呈报用户逐张审核、确认后才能提交入库生效**;该关卡适用于两类批:①画面类需求批(候选基线对照该卡预览图逐张呈报)②**非卡片批的基线操作**(目录重构/平台迁移/容差修订等工程批——同样逐张呈报审核,禁以「纯搬运/纯工程」为由跳过)。确认记录登记于 `game/tests/golden/README.md` 审核记录节(审核人+时间+基线清单),**未审核的基线禁合回**。机器侧前置:探针自检 PASS(结构断言在案)才允许出候选图,采集失败不得送审。基线**跨平台单套**(同日用户裁:跨平台渲染必须一致,全平台对拍同一份基线,跨平台字形锯齿噪声由容差带吸收,禁以加基线方式消化差异;细则=golden/README「基线冻结与审核」节)。
|
|
||||||
|
|
||||||
分层不是形式。改动发生在哪一层,验收就必须从那一层的真实入口进入。测试绕过了改动点,就不算这个改动的验收——这正是「断言存在、接线坏了却不红」的来源。
|
分层不是形式。改动发生在哪一层,验收就必须从那一层的真实入口进入。测试绕过了改动点,就不算这个改动的验收——这正是「断言存在、接线坏了却不红」的来源。
|
||||||
|
|
||||||
@@ -115,20 +97,8 @@
|
|||||||
- **反向**:diff 里每个行为改动至少一行;没有对应行的改动,必须写明「非行为改动」或「由第 X 行覆盖」。
|
- **反向**:diff 里每个行为改动至少一行;没有对应行的改动,必须写明「非行为改动」或「由第 X 行覆盖」。
|
||||||
- **测试侧**:新增或改写的每条断言至少挂一行;挂不上的孤儿断言删掉或补挂到需求点。
|
- **测试侧**:新增或改写的每条断言至少挂一行;挂不上的孤儿断言删掉或补挂到需求点。
|
||||||
|
|
||||||
**判据出处行锚(2026-11-05 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改,被编入迭代开工前由写卡段按本粒度补挂)**:对照表「需求点」列每行必须带**判据出处行锚**——该行验收判据所依据的现行文档句子,格式「`<文档相对路径>:<行号>`」。现行文档=`design/` 全域现行文档(含 `ux/` 交互规格与 art-bible 的判据行);已退役的需求卡片不是现行文档,不得充当判据出处。作用=断言预期值从规格句抄出,不从实现反推:实现行为与规格句冲突时断言红;规格缺席的行写不出锚,即停卡退回写卡段(那是需求澄清缺口,不是测试缺口)。机检=`tools/pipeline_gate.py` 判据 C5(锚格式与指向存在性,按卡文件名日期分流)+`tools/capability_audit.py` 链式锚检查(断言→套件→能力行→系统文档,见 §8.9)。
|
|
||||||
|
|
||||||
**测试函数的判据出处注记(2026-11-06 立)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# 判据出处: <design/相对路径>:<行号> <判据一句>`」——指针在前、判据摘要句在后;锚形态两档:行号锚(默认)与节锚(`<design/相对路径>「节名」<行关键词>`)——所指文档整节重排时同批把行号锚重锚为节锚,免行号漂移(2026-11-07 架构收窄批立),断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行;测量面驱动契约锚 `game/sim/` 实现件文件头注——规范句在哪锚哪,2026-11-09 架构收敛批立);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;被指规格句改行号时随批维护指针——死指针即红。局限如实声明:注记是被动文本,句内容改而行数不变时机检抓不到(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+指针存在性;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。
|
|
||||||
|
|
||||||
**验收档申报(2026-11-04 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改)**:每张需求卡片在头部信息区(与设计事实源声明同区)申报一个验收档,三档:高/中/低。判据=失败代价单维——这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低。一张卡触多档按最高档申报;申报由写卡段落笔,用户批卡(U0)时确认或改判。档位只调节 §8.7 审计深度——闸机与 CI 的域划分、选闸算法、全量强制档一概不因档位变化,真实入口、判据绑定面、禁削弱等验收闭合判据全部照旧。未申报档位的卡一律按高档全量审计。机检=`tools/pipeline_gate.py` 判据 C4:卡内须含「验收档:高/中/低」申报行。
|
|
||||||
|
|
||||||
**能力清单维护锚(2026-10-29 用户裁改版定稿)**:`game/tests/README.md`「能力清单」是**实现指导+阅读导航+义务声明**——只宣布「要验证什么」,不记「是否已验证/是否跑过」;落地账归现行验收闭合链(改动—验收对照表逐条挂断言+合回前独立验收审计),本清单不承载验证状态。表为四列:能力|系统|真实入口|代表用例(`文件:函数`)。**维护归写卡段,当场入表**:写需求卡片时,本批新增能力当场写入能力行——真实入口取自设计文档已定的入口,代表用例=卡里定死的计划测试(`文件:函数`);受影响存量行(入口/用例名变更)同批更新;能力退役删行。**实现照单落名**:测试函数名以清单为唯一依据,名实不符=卡片没写清=停卡退回。**收尾核对**:批末收尾只核对表上名字与实际落地一致(改名则回表),不刷任何批次字段;实现批禁写该文件的现行红线不变(process-conventions §3 第 11 条),核对义务归收尾提交。三层模型见 §8.9。改动—验收对照表纪律不变:新增或改写的每条断言仍须挂一行(上文「测试侧」);断言改判仍受 §8.4 真实入口口径约束。
|
**能力清单维护锚(2026-10-29 用户裁改版定稿)**:`game/tests/README.md`「能力清单」是**实现指导+阅读导航+义务声明**——只宣布「要验证什么」,不记「是否已验证/是否跑过」;落地账归现行验收闭合链(改动—验收对照表逐条挂断言+合回前独立验收审计),本清单不承载验证状态。表为四列:能力|系统|真实入口|代表用例(`文件:函数`)。**维护归写卡段,当场入表**:写需求卡片时,本批新增能力当场写入能力行——真实入口取自设计文档已定的入口,代表用例=卡里定死的计划测试(`文件:函数`);受影响存量行(入口/用例名变更)同批更新;能力退役删行。**实现照单落名**:测试函数名以清单为唯一依据,名实不符=卡片没写清=停卡退回。**收尾核对**:批末收尾只核对表上名字与实际落地一致(改名则回表),不刷任何批次字段;实现批禁写该文件的现行红线不变(process-conventions §3 第 11 条),核对义务归收尾提交。三层模型见 §8.9。改动—验收对照表纪律不变:新增或改写的每条断言仍须挂一行(上文「测试侧」);断言改判仍受 §8.4 真实入口口径约束。
|
||||||
|
|
||||||
**「真实入口」判定口径(2026-11-05 收窄)**:真实入口只认经引擎输入管线(合成 InputEvent 走 `push_input`)或真实渲染路径(截图/golden)的承载;信号直发(`pressed.emit()` 等合成信号)承载一律标「接线验证」,不得充当能力行的真实入口——接线验证保「信号已接线」,保不了「玩家点击可达」(hitbox/命中面在信号上游,emit 全部绕过)。既有能力行若以 emit 承载充当真实入口,随批触碰时订正;暂未触碰的行,缺口显式登记(残险模式),禁静默豁免。
|
|
||||||
|
|
||||||
**新增 core 件的覆盖登记义务(2026-11-03 架构审查 P1 余项裁)**:拆件或重构产出的新 core 文件不触发 process-conventions §3 第 6 条「新功能必配新测试」(那条只管新增玩法/机制),因此单由本条承接——新 core 件要么被 `game/tests/` 某套件按文件名或 `class_name` 点名,要么在承接它的能力行「代表用例」里申报「经宿主链覆盖(宿主=<件>)」;两者都无=批末收尾核对时补登。本条**不是覆盖率要求**,与 §7「覆盖率不是目标」同轨:登记的是能力义务的归属,不做文件计数——「每个 core 件必须被点名一次」的机器闸已裁否(它逼出为点名而点名的空套件,且与 §7 正面冲突)。落笔面沿用现行分工:申报行由写卡段入能力清单(实现批禁写该文件),核对归批末收尾提交。
|
|
||||||
|
|
||||||
**退役对账义务(2026-11-05 立)**:需求卡片退役(吸收即死)时,其对照表每行的验收意图必须已被承接——承接形态=能力清单行(能力+真实入口+代表用例)或已落地的断言;退役后无承接=该能力的规格判据断链,收尾核对判红。机检=`tools/capability_audit.py`(套件→能力行反向覆盖+断言链核验)。先例教训:营地图批卡片退役后,大门判据(`design/ux/camp.md:16`)无任何活面承接,探针 emit 断言悬空假绿——规格在、链接断。
|
|
||||||
|
|
||||||
### 8.4 真实入口断言(验收闭合的主判据)
|
### 8.4 真实入口断言(验收闭合的主判据)
|
||||||
|
|
||||||
- **唯一口径(2026-10-24/2026-10-28 用户两裁)**:每个需求点与每个行为改动的验收=一条从真实入口进入的断言,可 grep 定位、在当轮真实跑批中执行并通过。**禁变异类测试**(把生产码或数据表改成错值看断言抓不抓得到);**禁撤销类取证**(回退本批改动或该 hunk 看断言红不红)——两者都是人为制造红,属伪造证据,一律禁止。
|
- **唯一口径(2026-10-24/2026-10-28 用户两裁)**:每个需求点与每个行为改动的验收=一条从真实入口进入的断言,可 grep 定位、在当轮真实跑批中执行并通过。**禁变异类测试**(把生产码或数据表改成错值看断言抓不抓得到);**禁撤销类取证**(回退本批改动或该 hunk 看断言红不红)——两者都是人为制造红,属伪造证据,一律禁止。
|
||||||
@@ -153,21 +123,8 @@
|
|||||||
2. 抽查判据绑定面:断言从真实入口进入、钉在被测改动的特有可观测提交面上,且当轮真实跑批执行过;
|
2. 抽查判据绑定面:断言从真实入口进入、钉在被测改动的特有可观测提交面上,且当轮真实跑批执行过;
|
||||||
3. 检查测试削弱:删除断言、放宽阈值、缩小扫描面、换下层直调,逐处要卡片申报或用户批准。
|
3. 检查测试削弱:删除断言、放宽阈值、缩小扫描面、换下层直调,逐处要卡片申报或用户批准。
|
||||||
4. 核对内部字段直查的受控例外:直查行是否已在对照表注明理由(该行为无公开可观测面可钉)。
|
4. 核对内部字段直查的受控例外:直查行是否已在对照表注明理由(该行为无公开可观测面可钉)。
|
||||||
5. 核对判据出处:抽查断言的预期值能否从其判据出处行锚(§8.3)的规格句独立写出——预期值只在实现里有的(同义反复,判据镜像实现),判红。
|
|
||||||
|
|
||||||
**审计深度分级(2026-11-04 立)**:审计按卡内申报的验收档(§8.3)逐卡定深度;梯度只落在昂贵的判断件上,机械且堵造假向量的两件(削弱检查、例外核对)三档全保留不抽。中/低档省略的测试复跑以远端 CI 读数为执行证据——`tools/ci_check.sh <合并提交>` 的现查输出(commit+run 号+conclusion)是机器产物,run 号在远端永久可复核,审计报告照抄该行即可;照抄前先核对读数必须是「绿」——「未验」(零触发批跑闸步全跳过)与「不可判」不作证据,那种批的回补办法是等一次含代码面的合回或用户自发全量回归(2026-11-04 用户裁:回执等待件退役,证据由落盘文件改为现查读数;「不采信实现者自述已全绿」的口径不变):
|
审计报告落 `reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」。未通过不得合并。测试执行两入口铁规不变:审计在迭代 loop 内启动的子代理算 loop;另开会话须用户点名。
|
||||||
|
|
||||||
| 审计动作 | 高 | 中 | 低 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 对照表逐行核对 | 全量 | 全量 | 抽查 ≥1/3 行;新增行与改判行必抽 |
|
|
||||||
| 判据绑定面核对 | 抽查(现行口径) | 抽查(现行口径) | 抽 1 行 |
|
|
||||||
| 测试削弱检查 | 逐处 | 逐处 | 逐处 |
|
|
||||||
| 直查例外核对 | 逐条 | 逐条 | 逐条 |
|
|
||||||
| 最窄测试复跑 | 抽查(现行口径) | 省略——以远端 CI 现查读数代证 | 省略——以远端 CI 现查读数代证 |
|
|
||||||
|
|
||||||
低档的抽查面与抽中依据照写审计报告;「每批必有审计、禁零审计批」不变;档位存疑按高档执行。
|
|
||||||
|
|
||||||
审计报告落 `reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,逐卡标注验收档与实际执行深度。未通过不得合并。审计核的是 §4 那一步留下的跑批读数(回执与测试输出),对已跑绿的同一份字节不另起跨域跑批——读数对不上才复跑。
|
|
||||||
|
|
||||||
### 8.8 生效与旧卡
|
### 8.8 生效与旧卡
|
||||||
|
|
||||||
@@ -190,8 +147,8 @@
|
|||||||
3. **数量不守恒、承接守恒**:三层条数天然不等——一条验收意图可由多个能力承接,一条能力义务由多条断言覆盖。要守的是两个满射:每条验收意图至少有一条能力义务承接,每条能力义务至少有一条真实入口断言落地。数量对账只在批内做,见第 4 条。
|
3. **数量不守恒、承接守恒**:三层条数天然不等——一条验收意图可由多个能力承接,一条能力义务由多条断言覆盖。要守的是两个满射:每条验收意图至少有一条能力义务承接,每条能力义务至少有一条真实入口断言落地。数量对账只在批内做,见第 4 条。
|
||||||
4. **无全局对账总账**:不建逐断言账本,不做跨层条数对账;对账只在每批的改动—验收对照表里做(§8.3)。历史教训:阶段 2 退役的逐断言账本正因把义务清单层与证据层压成一本账而失修。
|
4. **无全局对账总账**:不建逐断言账本,不做跨层条数对账;对账只在每批的改动—验收对照表里做(§8.3)。历史教训:阶段 2 退役的逐断言账本正因把义务清单层与证据层压成一本账而失修。
|
||||||
|
|
||||||
**维护时序(2026-10-29 改版)**:能力清单归写卡段维护——写需求卡片时当场入表:本批新增能力当场增行(真实入口取自设计文档已定的入口,代表用例=卡内定死的计划测试 `文件:函数`),受影响存量行(入口/用例名变更)同批更新,能力退役删行;实现批禁写该文件(process-conventions §3 第 11 条)。实现照单落名:测试函数名以清单为唯一依据,名实不符=卡片没写清=停卡退回。批末收尾只核对表上名字与实际落地一致(改名则回表),不刷任何批次字段——清单不记「是否已验证/是否跑过」,落地账在改动—验收对照表(§8.3)与独立验收审计(§8.7)。
|
**维护时序(2026-10-29 改版:废「滞后一个迭代」)**:能力清单归写卡段维护——写需求卡片时当场入表:本批新增能力当场增行(真实入口取自设计文档已定的入口,代表用例=卡内定死的计划测试 `文件:函数`),受影响存量行(入口/用例名变更)同批更新,能力退役删行;实现批禁写该文件(process-conventions §3 第 11 条)。实现照单落名:测试函数名以清单为唯一依据,名实不符=卡片没写清=停卡退回。批末收尾只核对表上名字与实际落地一致(改名则回表),不刷任何批次字段——清单不记「是否已验证/是否跑过」,落地账在改动—验收对照表(§8.3)与独立验收审计(§8.7)。
|
||||||
|
|
||||||
**文档纯度**:验收意图与能力描述只写玩家或系统可观测面,禁写代码路径(`.gd`/`.py`/`.sh`)、测试文件名、断言名;唯一例外=配置文件索引(`game/data/tables/*.tres` 这类表路径与表名)。规则正文见 doc-conventions §5「禁实现内容」。
|
**文档纯度**:验收意图与能力描述只写玩家或系统可观测面,禁写代码路径(`.gd`/`.py`/`.sh`)、测试文件名、断言名;唯一例外=配置文件索引(`game/data/tables/*.tres` 这类表路径与表名)。规则正文见 doc-conventions §5「禁实现内容」。
|
||||||
|
|
||||||
**机器闸**:本节的结构由文档域闸「能力审计」机检——GDD 纯度(同款禁实现内容口径)、系统文档验收标准节非空、能力行四列与非空、代表用例(`文件:函数`)与真实入口可核(双通道:代码在或卡在——计划中的用例与入口由需求卡片锚定)、覆盖域表与能力行对得上、判据出处注记覆盖与指针可核(§8.3 测试函数的判据出处注记);红项按新增红处理。闸件清单与域划分的唯一出处=`tools/run_all_gates.sh` 头部。
|
**机器闸**:本节的结构由文档域闸「能力审计」机检——GDD 纯度(同款禁实现内容口径)、系统文档验收标准节非空、能力行四列与非空、代表用例(`文件:函数`)与真实入口可核(双通道:代码在或卡在——计划中的用例与入口由需求卡片锚定)、覆盖域表与能力行对得上;红项按新增红处理。闸件清单与域划分的唯一出处=`tools/run_all_gates.sh` 头部。
|
||||||
@@ -41,12 +41,18 @@
|
|||||||
本项目用语分两层,纪律如下:
|
本项目用语分两层,纪律如下:
|
||||||
|
|
||||||
1. **玩家可见专属名词**——道具名、界面用语、敌种名、层名。允许起专名,以 [术语表](术语表.md) 登记为准。界面用语"危险格 / 控制 / 坍塌显形"同属本层,见上节。
|
1. **玩家可见专属名词**——道具名、界面用语、敌种名、层名。允许起专名,以 [术语表](术语表.md) 登记为准。界面用语"危险格 / 控制 / 坍塌显形"同属本层,见上节。
|
||||||
2. **文档内部机制概念**——一律直白描述,禁止造词(比喻性生造词、只有作者懂的缩略语均在禁列)。确需命名时,首次出现处展开成完整白话句并登记进 [术语表](术语表.md)。
|
2. **文档内部机制概念**——一律直白描述,禁止造词(比喻性生造词、只有作者懂的缩略语均在禁列)。确需命名时,首次出现处附一句白话定义并登记进 [术语表](术语表.md)。
|
||||||
|
|
||||||
当前已登记的玩家可见专名(名称值均为 provisional,出处为 [术语表](术语表.md)):
|
当前已登记的玩家可见专名(名称值均为 provisional,出处为 [术语表](术语表.md)):
|
||||||
|
|
||||||
| 专名 | 是什么 | 出处条目 |
|
| 专名 | 是什么 | 出处条目 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| 显影尘 | 信息类秘宝 | aux_items |
|
||||||
|
| 工兵令 | 加行动点的秘宝 | aux_items |
|
||||||
|
| 探宝罗盘 | 预读奖励身份的秘宝 | aux_items |
|
||||||
|
| 探巢摆钟 | 探知巢穴位置的秘宝 | aux_items |
|
||||||
|
| 地穴全图卷 | 全图级稀有秘宝 | aux_items |
|
||||||
|
| 爆破工兵包 | 行动点 + 探巢的稀有秘宝 | aux_items |
|
||||||
| 地精 / 熊地精 / 食人魔酋长 | 首发三敌种(末者为 Boss) | enemy |
|
| 地精 / 熊地精 / 食人魔酋长 | 首发三敌种(末者为 Boss) | enemy |
|
||||||
| 第一层 · 地精洞窟 | 首关层名 | level_table |
|
| 第一层 · 地精洞窟 | 首关层名 | level_table |
|
||||||
| 封印 | 正式动作名(全库统一,非比喻、非呈现层别名)——对未开格实施封印,印记=封印印记 | terminology |
|
| 封印 | 正式动作名(全库统一,非比喻、非呈现层别名)——对未开格实施封印,印记=封印印记 | terminology |
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
|
|
||||||
**系统资源**=战斗数值以外、由系统持有并会增减的数值容器。角色的攻击、生命上限、护甲是战斗数值,不在此列。
|
**系统资源**=战斗数值以外、由系统持有并会增减的数值容器。角色的攻击、生命上限、护甲是战斗数值,不在此列。
|
||||||
|
|
||||||
成员(括号内为寿命档):**GP**(冒险级)、**钥石**(存档级)、行动点当前值(回合级)、行动点上限(冒险级)、储备行动点(冒险级)、刷新存量持久量与当次临时量(冒险级)、生命(冒险级)、主动件充能(冒险级)、时沙暂记(至下一战首轮兑付)。
|
成员(括号内为寿命档):**GP**(冒险级)、**钥石**(存档级)、行动点当前值(回合级)、行动点上限(冒险级)、储备行动点(跨轮保留)、刷新存量持久量与当次临时量(冒险级)、生命(冒险级)、主动件充能(冒险级)、时沙暂记(至下一战首轮兑付)。
|
||||||
|
|
||||||
每笔系统资源带两个坐标:**寿命档**(见上五档轴)与**形态**(见上总线/抽屉)。它们之间不设统一换算、也不立统一上位概念——**GP 与钥石是两条平行独立的系统资源**,按寿命档各归各档文档:GP 归[冒险结构](systems/冒险循环/冒险结构.md)「GP」节,钥石归[元进度](systems/跨局循环/元进度.md),行动点两笔归[行动经济](systems/排雷循环/行动经济.md),刷新两笔归[秘宝](systems/跨局循环/秘宝.md)。
|
每笔系统资源带两个坐标:**寿命档**(见上五档轴)与**形态**(见上总线/抽屉)。它们之间不设统一换算、也不立统一上位概念——**GP 与钥石是两条平行独立的系统资源**,按寿命档各归各档文档:GP 归[冒险结构](systems/冒险循环/冒险结构.md)「GP」节,钥石归[元进度](systems/跨局循环/元进度.md),行动点两笔归[行动经济](systems/排雷循环/行动经济.md),刷新两笔归[秘宝](systems/跨局循环/秘宝.md)。
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
| `术语表.md` | 全库专用术语的唯一对照表——危险格/安全格/同调位/RAP/GP/真视等定义+退役词对照(2026-10-11 建立,v1.23) |
|
| `术语表.md` | 全库专用术语的唯一对照表——危险格/安全格/同调位/RAP/GP/真视等定义+退役词对照(2026-10-11 建立,v1.23) |
|
||||||
| `待办清单.md`(仓库根,不属本树) | 全项目待办事项的唯一登记处;各系统文档的「待办」节只留指路存根 |
|
| `待办清单.md`(仓库根,不属本树) | 全项目待办事项的唯一登记处;各系统文档的「待办」节只留指路存根 |
|
||||||
| `体验验证清单.md`(仓库根,不属本树) | 需要真人试玩观测的验证项登记处(与待办清单分工:待办清单是"要拍板的事",本篇是"要玩过才知道的事");每条注明结论回流路径 |
|
| `体验验证清单.md`(仓库根,不属本树) | 需要真人试玩观测的验证项登记处(与待办清单分工:待办清单是"要拍板的事",本篇是"要玩过才知道的事");每条注明结论回流路径 |
|
||||||
| `08-Alpha版本标准.md` | Alpha 版本包含哪些东西的清单——里程碑 M3 的完成标准;只列条目不写内容,定义一律指路各权威文档(**已定稿 v1.27**,2026-10-13) |
|
| `08-Alpha版本标准.md` | Alpha 版本包含哪些东西的清单——里程碑 M3 的完成标准;只列条目不写内容,定义一律指路各权威文档(**已定稿 v1.20**,2026-10-13) |
|
||||||
|
|
||||||
## systems/ 五个循环
|
## systems/ 五个循环
|
||||||
|
|
||||||
@@ -46,14 +46,14 @@
|
|||||||
| `关卡节点图生成.md` | 一关的节点图从哪来——生成器按参数产出合法图 | 已定稿 |
|
| `关卡节点图生成.md` | 一关的节点图从哪来——生成器按参数产出合法图 | 已定稿 |
|
||||||
| `冒险结构.md` | 整局冒险的关卡序列、失败与大奖励 | 已定稿·自旧体系迁移 |
|
| `冒险结构.md` | 整局冒险的关卡序列、失败与大奖励 | 已定稿·自旧体系迁移 |
|
||||||
| `难度曲线与Boss.md` | 难度曲线、期望值带与 Boss 设计 | 已定稿·自旧体系迁移 |
|
| `难度曲线与Boss.md` | 难度曲线、期望值带与 Boss 设计 | 已定稿·自旧体系迁移 |
|
||||||
| `奇物.md` | 一次冒险内各渠道给予玩家的增益总称(专长=触发器句式的机制件 / 属性值提升 / 补给=给系统资源加一笔的转换源凭证 × 三条渠道:奖励节点 / 商店 / 关底 Boss 击败) | 已实现(专长 29 行=基础 27+迁入 2,流派机制已退役;池结构案D 四级 104,关卡完成兑付=专长三选一按档配比加权) |
|
| `奇物.md` | 一次冒险内各渠道给予玩家的增益总称(专长=触发器句式的机制件 / 属性值提升 / 补给=给系统资源加一笔的转换源凭证 × 三条渠道:奖励节点 / 商店 / 关底 Boss 击败) | 已实现·迭代 20 专长实装批落地(29 行=基础 27+迁入 2,流派机制退役;池结构案D 四级 104,关卡完成兑付=专长三选一按档配比加权) |
|
||||||
|
|
||||||
### 跨局循环(`systems/跨局循环/`)
|
### 跨局循环(`systems/跨局循环/`)
|
||||||
|
|
||||||
| 文件 | 一句话概要 | 状态 |
|
| 文件 | 一句话概要 | 状态 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `元进度.md` | 跨局成长(旧体系未单独成文) | 已定稿·已实现 |
|
| `元进度.md` | 跨局成长(旧体系未单独成文) | 已定稿·已实现 |
|
||||||
| `天赋树.md` | 跨局成长的树形承载(**结构/节点/数值/效果一律以该文档为唯一事实源——本表不复制其内容,只作指路**) | v0.8 换代定稿(沿革查 git 提交史) |
|
| `天赋树.md` | 跨局成长的树形承载(**结构/节点/数值/效果一律以该文档为唯一事实源——本表不复制其内容,只作指路**) | v0.8 换代定稿待实装(迭代 21 天赋树实装批,2026-10-11 用户令编入,开工门=U0 发令;需求卡片 v1.7) |
|
||||||
| `生涯.md` | 主菜单一级的局外只读界面——跨局汇总、历史冒险回看、图鉴承接(冒险中数据回看的唯一承接处,P-C7 裁决) | 范围草案·待评审 |
|
| `生涯.md` | 主菜单一级的局外只读界面——跨局汇总、历史冒险回看、图鉴承接(冒险中数据回看的唯一承接处,P-C7 裁决) | 范围草案·待评审 |
|
||||||
| `锻造工坊.md` | 营地武器与护甲成长——武器锻造区(长剑/长枪/法杖)与护甲锻造区(轻甲/重甲/魔法护甲)各三条独立等级路线,钥石几何定价,一次冒险各选一件,满级特效留扩展位本期不做 | v0.5·**设计定案待实装(17 裁点已清零**——2026-10-12 B 组逐裁:1 丙/1a 一冒险一件武器+一件甲/2a 伪裁点消解/3b 敌方攻击缺省普通·克制反向当下生效/6 满级特效本期不做/8a 两区定名;2c·5a 于 v0.4 结案);开工门=17 裁点清零+用户发令,裁点门已满足——现状见待办清单 |
|
| `锻造工坊.md` | 营地武器与护甲成长——武器锻造区(长剑/长枪/法杖)与护甲锻造区(轻甲/重甲/魔法护甲)各三条独立等级路线,钥石几何定价,一次冒险各选一件,满级特效留扩展位本期不做 | v0.5·**设计定案待实装(17 裁点已清零**——2026-10-12 B 组逐裁:1 丙/1a 一冒险一件武器+一件甲/2a 伪裁点消解/3b 敌方攻击缺省普通·克制反向当下生效/6 满级特效本期不做/8a 两区定名;2c·5a 于 v0.4 结案);开工门=17 裁点清零+用户发令,裁点门已满足——现状见待办清单 |
|
||||||
| `秘宝.md` | 营地装配、整局冒险生效的角色机能件——操作包络加强(视野/行动点/刷新/挖掘距离等),不出角色战斗属性值、不改战斗结算机制 | 已定稿·跨局件(2026-10-10 自排雷循环迁入——解锁/装配/存档持久全在跨局侧) |
|
| `秘宝.md` | 营地装配、整局冒险生效的角色机能件——操作包络加强(视野/行动点/刷新/挖掘距离等),不出角色战斗属性值、不改战斗结算机制 | 已定稿·跨局件(2026-10-10 自排雷循环迁入——解锁/装配/存档持久全在跨局侧) |
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
| `教学引导.md` | 新手教学与提示 | 范围草案·待设计 |
|
| `教学引导.md` | 新手教学与提示 | 范围草案·待设计 |
|
||||||
| `设置与本地化.md` | 设置项与多语言 | 范围草案·待设计 |
|
| `设置与本地化.md` | 设置项与多语言 | 范围草案·待设计 |
|
||||||
|
|
||||||
## ux/(战斗画面与交互规格,`design/ux/`——与 gdd/ 同级的呈现实现设计规格层)
|
## ux/(战斗画面与交互规格,`ux/`)
|
||||||
|
|
||||||
| 文件 | 一句话概要 | 状态 |
|
| 文件 | 一句话概要 | 状态 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ MVP 不加新敌种,也不做同深度多敌种混搭;敌种扩容走 `enemy
|
|||||||
|
|
||||||
目录(重设计 v1)已定稿 **12 件**(普通 7 / 优秀 3 / 稀有 2——代号制,正式命名归用户;数值全 provisional 归调参批),现行事实源=[秘宝](systems/跨局循环/秘宝.md)「目录(重设计 v1)」节。数据行随实装批落表(同调件数据表 = `data/tables/treasure_items.tres`),MVP 不新增。
|
目录(重设计 v1)已定稿 **12 件**(普通 7 / 优秀 3 / 稀有 2——代号制,正式命名归用户;数值全 provisional 归调参批),现行事实源=[秘宝](systems/跨局循环/秘宝.md)「目录(重设计 v1)」节。数据行随实装批落表(同调件数据表 = `data/tables/treasure_items.tres`),MVP 不新增。
|
||||||
|
|
||||||
旧目录(旧 aux_items 六行:显影尘/工兵令/探宝罗盘/探巢摆钟/地穴全图卷/爆破工兵包,及过渡形态诸件)已全数退役、留底 design/content-archive/道具退役素材库.md(数据表旧行已删净——treasure_items.tres 旧六名扫描零命中)。
|
旧目录(旧 aux_items 六行:显影尘/工兵令/探宝罗盘/探巢摆钟/地穴全图卷/爆破工兵包,及过渡形态诸件)已全数退役、只作素材库(design/content-archive/道具退役素材库.md);旧行删除归实装批。
|
||||||
|
|
||||||
## 增益与状态
|
## 增益与状态
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ MVP 不加新状态;扩容走 `status_effects.tres` 加行 + [增益状态](sy
|
|||||||
垂直切片阶段明确砍掉或推迟的内容,写在这里防止回潮:
|
垂直切片阶段明确砍掉或推迟的内容,写在这里防止回潮:
|
||||||
|
|
||||||
- 更多关卡(N>3)——第三关已按扩展批流程落地(行集);三关正式序列已生效,唯一试玩入口 = 完整冒险
|
- 更多关卡(N>3)——第三关已按扩展批流程落地(行集);三关正式序列已生效,唯一试玩入口 = 完整冒险
|
||||||
- 精英节点与词缀系统——精英怪本体已落敌人表(行类 elite+池继承基础池加附加技,首只=地精精英),精英节点与投放仍未接线;词缀系统未设计
|
- 精英节点与词缀系统——只预留了字段位,不定义语义(精英怪**设定**已登记预留:迭代 10 奖励重构批——同立绘+附加特征标记+数值更强、钥石掉 1 个预留;实装仍随怪物批)
|
||||||
- 地形变异扩展内容——首批四类型已落地,反制道具与全局作用域排 Alpha
|
- 地形变异扩展内容——首批四类型已落地,反制道具与全局作用域排 Alpha
|
||||||
- 道具/增益之间的组合协同(遗物式联动)
|
- 道具/增益之间的组合协同(遗物式联动)
|
||||||
- 战后自动回复——回复只有道具与恢复点两个来源
|
- 战后自动回复——回复只有道具与恢复点两个来源
|
||||||
|
|||||||
+40
-39
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。
|
> **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。
|
||||||
> **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。
|
> **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。
|
||||||
> **状态**:**已定稿(v1.31)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
|
> **状态**:**已定稿(v1.20)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
|
||||||
> **成文**:2026-10-13。
|
> **成文**:2026-10-13。
|
||||||
|
|
||||||
## 本文怎么用
|
## 本文怎么用
|
||||||
@@ -29,7 +29,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 棋盘生成 | [棋盘生成](systems/排雷循环/棋盘生成.md) | 在役 |
|
| 棋盘生成 | [棋盘生成](systems/排雷循环/棋盘生成.md) | 在役 |
|
||||||
| 排雷玩法 | [排雷玩法](systems/排雷循环/排雷玩法.md) | 在役 |
|
| 排雷玩法 | [排雷玩法](systems/排雷循环/排雷玩法.md) | 在役 |
|
||||||
| 行动经济 | [行动经济](systems/排雷循环/行动经济.md) | 在役 |
|
| 行动经济 | [行动经济](systems/排雷循环/行动经济.md) | 在役 |
|
||||||
| 地形变异(六类型) | [地形变异](systems/排雷循环/地形变异.md) | 在役(variation.tres 现为 region 六行——贫矿脉整图型屏蔽删行,机制代码保留,重建设计加行即恢复;设计语义面反哺待裁) |
|
| 地形变异(六类型) | [地形变异](systems/排雷循环/地形变异.md) | 在役(2026-10-16 贫矿脉整图型屏蔽删行,variation.tres 回 region 六行;机制代码保留,重建设计加行即恢复;设计语义面反哺待裁) |
|
||||||
|
|
||||||
### 战斗循环
|
### 战斗循环
|
||||||
|
|
||||||
@@ -39,16 +39,16 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 敌人系统 | [敌人系统](systems/战斗循环/敌人系统.md) | 在役 |
|
| 敌人系统 | [敌人系统](systems/战斗循环/敌人系统.md) | 在役 |
|
||||||
| 增益状态 | [增益状态](systems/战斗循环/增益状态.md) | 在役 |
|
| 增益状态 | [增益状态](systems/战斗循环/增益状态.md) | 在役 |
|
||||||
| 地图战斗资源(格面资源) | [地图战斗资源](systems/战斗循环/地图战斗资源.md) | 在役 |
|
| 地图战斗资源(格面资源) | [地图战斗资源](systems/战斗循环/地图战斗资源.md) | 在役 |
|
||||||
| 战斗表现(动画与演出) | [战斗表现](systems/战斗循环/战斗表现.md) | 在役(Alpha 判据=受击闪白/死亡不瞬间消失/高光/演出链兑现可读四条;正式演出设计与资产终稿排 Beta,不属 Alpha 完成判据) |
|
| 战斗表现(动画与演出) | [战斗表现](systems/战斗循环/战斗表现.md) | 在役(Alpha 判据=受击闪白/死亡不瞬间消失/高光行/逐行排播四条可读;正式演出设计与资产终稿排 Beta,不属 Alpha 完成判据) |
|
||||||
|
|
||||||
### 冒险循环
|
### 冒险循环
|
||||||
|
|
||||||
| 条目 | 事实源 | 现状 |
|
| 条目 | 事实源 | 现状 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 冒险结构 | [冒险结构](systems/冒险循环/冒险结构.md) | 在役 |
|
| 冒险结构 | [冒险结构](systems/冒险循环/冒险结构.md) | 在役 |
|
||||||
| 关卡节点地图 | [关卡节点地图](systems/冒险循环/关卡节点地图.md) | 在役(信息迷雾类型可见性已实装) |
|
| 关卡节点地图 | [关卡节点地图](systems/冒险循环/关卡节点地图.md) | 在役(信息迷雾类型可见性已随迭代 34 卡④ 实装,2026-10-22) |
|
||||||
| 关卡节点图重构(增加可选节点) | [关卡节点地图](systems/冒险循环/关卡节点地图.md)+[关卡节点图生成](systems/冒险循环/关卡节点图生成.md) | 在役(图源=参数档×种子生成图、模板链路退役;真人目检选路项已登记体验验证清单,登记不阻塞) |
|
| 关卡节点图重构(增加可选节点) | [关卡节点地图](systems/冒险循环/关卡节点地图.md)+[关卡节点图生成](systems/冒险循环/关卡节点图生成.md) | 在役(2026-10-25 迭代 35 卡①② 合回:图源切为参数档×种子生成图、模板链路退役;真人目检选路项已登记体验验证清单,登记不阻塞) |
|
||||||
| 关卡节点图生成 | [关卡节点图生成](systems/冒险循环/关卡节点图生成.md)(参数化长图:产出规格与生成参数) | 在役(enemy.tres 与 board_gen.tres 已覆盖到第三关深度 13;生成图 L3 深度域 0–13 超出关卡地图屏画布屏预算约 10 层——等比缩放/滚动视口两升级路径未设计待裁,[待办清单](../../待办清单.md)「超预算图策略升级路径」条在册) |
|
| 关卡节点图生成 | [关卡节点图生成](systems/冒险循环/关卡节点图生成.md)(参数化长图:产出规格与生成参数) | 在役(2026-10-24 迭代 35 卡① 生成器核心合回;enemy.tres 与 board_gen.tres 已覆盖到第三关深度 13;生成图 L3 深度域 0–13 超出关卡地图屏画布屏预算约 10 层——等比缩放/滚动视口两升级路径未设计待裁,[待办清单](../../待办清单.md)「超预算图策略升级路径」条在册) |
|
||||||
| 难度曲线与 Boss | [难度曲线与Boss](systems/冒险循环/难度曲线与Boss.md) | 在役 |
|
| 难度曲线与 Boss | [难度曲线与Boss](systems/冒险循环/难度曲线与Boss.md) | 在役 |
|
||||||
| 奇物 | [奇物](systems/冒险循环/奇物.md) | 在役 |
|
| 奇物 | [奇物](systems/冒险循环/奇物.md) | 在役 |
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 元进度 | [元进度](systems/跨局循环/元进度.md) | 在役 |
|
| 元进度 | [元进度](systems/跨局循环/元进度.md) | 在役 |
|
||||||
| 天赋树 | [天赋树](systems/跨局循环/天赋树.md) | 在役 |
|
| 天赋树 | [天赋树](systems/跨局循环/天赋树.md) | 在役 |
|
||||||
| 秘宝 | [秘宝](systems/跨局循环/秘宝.md) | 在役 |
|
| 秘宝 | [秘宝](systems/跨局循环/秘宝.md) | 在役 |
|
||||||
| 锻造工坊 | [锻造工坊](systems/跨局循环/锻造工坊.md) | 在役(满级特效留扩展位、本期不做,不碍在役判定) |
|
| 锻造工坊 | [锻造工坊](systems/跨局循环/锻造工坊.md) | 在役(实装批 2026-10-12 入库;满级特效按 2026-10-12 裁 6 留扩展位、本期不做,不碍在役判定) |
|
||||||
| 生涯 | [生涯](systems/跨局循环/生涯.md) | 在役(期一;期二、期三排 Beta,不属 Alpha) |
|
| 生涯 | [生涯](systems/跨局循环/生涯.md) | 在役(期一;期二、期三排 Beta,不属 Alpha) |
|
||||||
|
|
||||||
### 表现与支撑
|
### 表现与支撑
|
||||||
@@ -83,7 +83,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 敌种池(含三个 Boss) | `enemy.tres` | 在役 |
|
| 敌种池(含三个 Boss) | `enemy.tres` | 在役 |
|
||||||
| 敌人技能池 | `skills.tres` | 在役 |
|
| 敌人技能池 | `skills.tres` | 在役 |
|
||||||
| 棋盘按关配置尺寸 | `board_gen.tres` | 在役 |
|
| 棋盘按关配置尺寸 | `board_gen.tres` | 在役 |
|
||||||
| 地形变异六类型 | `variation.tres` | 在役(表为 region 六行) |
|
| 地形变异六类型 | `variation.tres` | 在役(2026-10-16 贫矿脉屏蔽删行后表为 region 六行) |
|
||||||
| 格面资源九型 × 正负 | `reward.tres` | 在役 |
|
| 格面资源九型 × 正负 | `reward.tres` | 在役 |
|
||||||
| 状态表 | `status_effects.tres` | 在役 |
|
| 状态表 | `status_effects.tres` | 在役 |
|
||||||
| 奇物池(专长 / 属性值提升 / 补给) | `feats.tres`、`adventure.tres` | 在役 |
|
| 奇物池(专长 / 属性值提升 / 补给) | `feats.tres`、`adventure.tres` | 在役 |
|
||||||
@@ -91,8 +91,8 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 商店配置 | `shop.tres` | 在役 |
|
| 商店配置 | `shop.tres` | 在役 |
|
||||||
| 元进度配置 | `meta.tres` | 在役 |
|
| 元进度配置 | `meta.tres` | 在役 |
|
||||||
| 天赋树节点集 | `meta_tree.tres` | 在役 |
|
| 天赋树节点集 | `meta_tree.tres` | 在役 |
|
||||||
| 锻造工坊路线行族 | `forge.tres` | 在役(定价 provisional 归 M4;沿革见 git 提交史) |
|
| 锻造工坊路线行族 | `forge.tres` | 在役(定价 provisional 归 M4;表名订正与入库依据见 git 提交史) |
|
||||||
| 混编遭遇行集 | `enemy.tres` | 在役(现行行集=(2,5)+(1,3);第二批(Boss 多行)移挂 Beta,裁决与明细见 git 提交史;按〔关卡,行类,深度带〕三参寻址) |
|
| 混编遭遇行集 | `enemy.tres` | 在役(首批;第二批移挂 Beta,裁决与明细见 git 提交史;2026-10-22 迭代 34 起按〔关卡,行类,深度带〕三参寻址,行集键已迁移) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -100,25 +100,25 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
|
|
||||||
| 条目 | 事实源 | 现状 |
|
| 条目 | 事实源 | 现状 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 主菜单 | —— | 在役(三入口:进入存档/设置/退出游戏——入口拓扑=进入存档→选档界面→进档/新档→营地覆盖层→营地场景图与生涯笔记本) |
|
| 主菜单 | —— | 在役(迭代 33 卡②三入口化:进入存档/设置/退出游戏——入口拓扑=进入存档→选档界面→进档/新档→营地覆盖层→〔营地交互重做卡④〕营地场景图与生涯笔记本;2026-10-22 用户裁换代〔反哺 #13〕) |
|
||||||
| 开始覆盖层 | —— | 在役 |
|
| 开始覆盖层 | —— | 在役 |
|
||||||
| 选档界面(3 存档位) | —— | 在役(空槽新档/有档进档/删档二次确认+摘要三项) |
|
| 选档界面(3 存档位) | —— | 在役(迭代 33 卡③——空槽新档/有档进档/删档二次确认+摘要三项;2026-10-22 用户裁增行〔反哺 #8〕) |
|
||||||
| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](../ux/camp.md) | 在役(场景图+七物件点选+Esc 浮窗与顶栏;五功能页呈现=居中定尺寸功能窗口、场景根留底、窗内滚动) |
|
| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](ux/camp.md) | 在役(场景图与七物件点选随营地交互重做列入 Alpha,见下行) |
|
||||||
| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](../ux/camp.md) | 在役(五卡全部落地,2026-10-21 用户裁整体列入 Alpha;沿革查 git 提交史。出口=五卡各自验收标准通过+营地屏用户目检〔登记体验验证清单 ㊺〕) |
|
| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](ux/camp.md)+[需求澄清](../../reports/需求澄清-营地交互重做-2026-10-18.md) | 部分在役(卡①②③ 已随迭代 33 实装合回,2026-10-22;卡④营地场景图 2026-10-21 用户令退回美术设计段,美术生成方案提案 2026-10-22 成文,余三个用户侧前置未销号:像素规格执行(Q6 甲过渡口径已裁)、点选反馈设计稿、参照物;卡⑤ Esc 浮窗随卡④ 代码波同行、未编排。2026-10-21 用户裁:五卡整体列入 Alpha。出口=五卡各自验收标准通过+营地屏用户目检通过) |
|
||||||
| 生涯页 | [生涯](systems/跨局循环/生涯.md) | 在役(期一) |
|
| 生涯页 | [生涯](systems/跨局循环/生涯.md) | 在役(期一) |
|
||||||
| 关卡地图屏 | [level-map](../ux/level-map.md) | 在役 |
|
| 关卡地图屏 | [level-map](ux/level-map.md) | 在役 |
|
||||||
| 战斗屏 | [battle](../ux/battle.md) | 在役 |
|
| 战斗屏 | [battle](ux/battle.md) | 在役 |
|
||||||
| 战斗结算总结框 | [settlement-summary](../ux/settlement-summary.md) | 在役 |
|
| 战斗结算总结框 | [settlement-summary](ux/settlement-summary.md) | 在役 |
|
||||||
| 关卡结算屏 | [level-clear](../ux/level-clear.md) | 在役 |
|
| 关卡结算屏 | [level-clear](ux/level-clear.md) | 在役 |
|
||||||
| 三选一(奖励节点 / 关卡完成) | [node-reward](../ux/node-reward.md) | 在役(两渠道均三选一停点:关卡完成与奖励节点各停一次,奖励节点经兑付拉起开三选一) |
|
| 三选一(奖励节点 / 关卡完成) | [node-reward](ux/node-reward.md) | 在役(两渠道均三选一停点:关卡完成与奖励节点各停一次,奖励节点经兑付拉起开三选一) |
|
||||||
| 商店 | [shop](../ux/shop.md) | 在役 |
|
| 商店 | [shop](ux/shop.md) | 在役 |
|
||||||
| 状态面板(局内) | [元进度](systems/跨局循环/元进度.md)(「解锁界面:双入口框架」节) | 在役 |
|
| 状态面板(局内) | [元进度](systems/跨局循环/元进度.md)(「解锁界面:双入口框架」节) | 在役 |
|
||||||
| 冒险终局面板 | —— | 在役 |
|
| 冒险终局面板 | —— | 在役 |
|
||||||
| 图例面板 | —— | 在役 |
|
| 图例面板 | —— | 在役 |
|
||||||
| 设置面 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
|
| 设置面 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
|
||||||
| 调试浮窗 | —— | 在役 |
|
| 调试浮窗 | —— | 在役 |
|
||||||
| UI 全局主题资源(引擎原生控件接管皮肤) | —— | 在役(主题资源(theme 主资源)挂 gui/theme/custom) |
|
| UI 全局主题资源(引擎原生控件接管皮肤) | —— | 在役(迭代 25 · 2026-10-13 入库:主题资源(theme 主资源)挂 gui/theme/custom) |
|
||||||
| UI 按钮状态矩阵(悬停 / 按下 / 禁用 / 键盘焦点补齐) | [待办清单](../../待办清单.md) | 在役(五态矩阵逐实例 override 补齐——悬停 modulate 提亮/禁用 α0.45 幽灵化/焦点 INK 2px 内缩 1px 环/危险钮本族按压态;键盘导航批量面归 Beta「棋盘战斗键盘/手柄输入」条连带点③) |
|
| UI 按钮状态矩阵(悬停 / 按下 / 禁用 / 键盘焦点补齐) | [待办清单](../../待办清单.md) | 在役(迭代 26 入库:五态矩阵逐实例 override 补齐——悬停 modulate 提亮/禁用 α0.45 幽灵化/焦点 INK 2px 内缩 1px 环/危险钮本族按压态;键盘导航批量面归 Beta「棋盘战斗键盘/手柄输入」条连带点③) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 机器可读的呈现断言(对比度 / 结构) | ——(清单唯一出处=process-conventions 运行与验证节) | 在役 |
|
| 机器可读的呈现断言(对比度 / 结构) | ——(清单唯一出处=process-conventions 运行与验证节) | 在役 |
|
||||||
| 分辨率两档(1280×800 / 1920×1080) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役 |
|
| 分辨率两档(1280×800 / 1920×1080) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役 |
|
||||||
| 绘制调用数达标 | —— | 在役 |
|
| 绘制调用数达标 | —— | 在役 |
|
||||||
| 真人试玩轮次 | [体验验证清单](../../体验验证清单.md) | 在役(义务维持;当前轮次未清=㉚–㊸ 各条待用户核销——各批实机目检项登记不阻塞) |
|
| 真人试玩轮次 | [体验验证清单](../../体验验证清单.md) | 在役(义务维持;当前轮次未清:㉚/㉛ 未核销,迭代 34 三条目检项待登记) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -145,18 +145,21 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 像素美术风格与色板 | [美术圣经](../art/art-bible.md) | 在役 |
|
| 像素美术风格与色板 | [美术圣经](../art/art-bible.md) | 在役 |
|
||||||
| 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 |
|
| 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 |
|
||||||
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史;观感复核已随战斗一屏样张过闸完成——用户实机目检核销,沿革查 git 提交史) |
|
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史,复核转正归战斗一屏样张) |
|
||||||
| 棋盘瓦片与立体表现重做 | [待办清单](../../待办清单.md) | 已写卡(待编排)——设计闭合=C 方向+D 布局+三关八色冻结(art-bible v3.51/battle.md 2026-11-07/HUD框架 2026-11-07);卡片=[需求卡片](../../reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md)(卡内 §16 复核通过);出口=用户实机目检棋盘立体感与素材观感达标 |
|
| 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) |
|
||||||
| 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 在役(原稿分辨率入包禁降采样、显示按三档绝对高缩放、现有形象即终稿;定值单点=art-bible §8.2(档值定值面=站桩守门测试);实机目检清晰度与同屏体量顺序登记体验验证清单 ㊻) |
|
| 立绘清晰度回退评估(是否改用高清图) | [角色设计](../art/character-design.md) | 待做(评估已结——2026-10-14 用户裁维持像素风、升级精细手绘像素、不回退高清图,裁决录=[美术审计-cursor会话存档](../../reports/美术审计-cursor会话存档-2026-10-14.md) §2.2;Alpha 范围=主角+三个 Boss 按新口径重产,其余敌种当前可读则保留到 Beta;出口=用户目检八敌体量关系通过且主角与三个 Boss 重产完成) |
|
||||||
| 敌人立绘(全敌种) | [角色设计](../art/character-design.md) | 在役 |
|
| 敌人立绘(全敌种) | [角色设计](../art/character-design.md) | 在役 |
|
||||||
| 主角立绘三态 | [角色设计](../art/character-design.md) | 在役 |
|
| 主角立绘三态 | [角色设计](../art/character-design.md) | 在役 |
|
||||||
| 状态图标 | [美术圣经](../art/art-bible.md) | 在役 |
|
| 状态图标 | [美术圣经](../art/art-bible.md) | 在役 |
|
||||||
| 战斗演出链(弹道 / 受击 / 血条 / 灰化) | [战斗表现](systems/战斗循环/战斗表现.md) | 在役 |
|
| 战斗演出链(弹道 / 受击 / 血条 / 灰化) | [战斗表现](systems/战斗循环/战斗表现.md) | 在役 |
|
||||||
|
| 逐行结算排播 | [settlement-summary](ux/settlement-summary.md) | 在役 |
|
||||||
| 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
|
| 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
|
||||||
| 全局纹理过滤设为邻近采样 | [待办清单](../../待办清单.md) | 在役(default_texture_filter=0+平滑渐变件三处显式 LINEAR 白名单,翻转面全枚举闭合) |
|
| 站桩帧动画 | [待办清单](../../待办清单.md) | 待做(列入 Alpha 定版前置清单:定版前完成最小版,路线预选拆件驱动;未完成则顺延 Beta;不占功能迭代) |
|
||||||
| UI 字体(全局像素字,Fusion Pixel 单套单字重) | [美术圣经](../art/art-bible.md) §7.4 | 在役(现状即终稿——拉丁沿用自带字形不另接专件、不上第二字重;信息层级手段=字号档差+墨色深浅) |
|
| 全局纹理过滤设为邻近采样 | [待办清单](../../待办清单.md) | 在役(迭代 26 · 2026-10-14 入库:default_texture_filter=0+平滑渐变件三处显式 LINEAR 白名单,翻转面全枚举闭合) |
|
||||||
| 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 在役(样张整体过闸——用户实机目检核销,沿革查 git 提交史;目标规格与五项实装定值单点=art-bible 五张规格表。主角+三 Boss 重产依赖照旧;站桩帧动画已改排 Beta,见「六 · Alpha 不含」) |
|
| UI 字体(全局像素字,Fusion Pixel 单套单字重) | [美术圣经](../art/art-bible.md) §7.4 | 在役(2026-10-24 用户裁现状即终稿——拉丁沿用自带字形不另接专件、不上第二字重;信息层级手段=字号档差+墨色深浅) |
|
||||||
| UI 元素细节修(滑轨填充 / 图标垫块 / 留白 / 开发件外泄) | [待办清单](../../待办清单.md) | 在役(四子项中滑轨填充注销,余三件——图标垫块明度差降档/商店+营地布局修/诊断钮迁调试浮窗——全落地) |
|
| 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 待做(Alpha 硬前置:站桩帧动画的定版前置与主角+三 Boss 重产都依赖它;出口=用户目检通过的战斗屏样张,并产出尺寸档/色板/明度档清单) |
|
||||||
|
| UI 氛围层与九宫格切片观感修 | [待办清单](../../待办清单.md) | 部分在役(光柱硬边已修=连续 alpha 渐变;未结半=九宫格切片错位——Alpha 内做最小修复:核对素材尺寸,必要时重出九宫格素材,全套素材重出排 Beta;出口=结算屏与图例屏错位消失,渲染闸+用户目检通过) |
|
||||||
|
| UI 元素细节修(滑轨填充 / 图标垫块 / 留白 / 开发件外泄) | [待办清单](../../待办清单.md) | 在役(迭代 26 · 2026-10-14 入库:①滑轨填充随迭代 25 注销;余②图标垫块明度差降档/③商店+营地布局修/④诊断钮迁调试浮窗 全落地) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -168,9 +171,9 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
|
|
||||||
| 条目 | 理由出处 |
|
| 条目 | 理由出处 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 音频(音乐与音效) | 排 Beta(用户裁:与游戏内容无关);现行零音频资源、零播放代码 |
|
| 音频(音乐与音效) | 排 Beta(用户 2026-10-13 裁:与游戏内容无关);现行零音频资源、零播放代码 |
|
||||||
| 教学引导(含教学引导面) | 排 Beta([待办清单](../../待办清单.md) 教学引导节) |
|
| 教学引导(含教学引导面) | 排 Beta([待办清单](../../待办清单.md) 教学引导节,2026-10-04 用户裁改排 Beta;2026-10-13 再确认) |
|
||||||
| 多语言本地化 | 排 Beta(用户裁:与游戏内容无关);Alpha 只做最小设置面,不做多语言 |
|
| 多语言本地化 | 排 Beta(用户 2026-10-13 裁:与游戏内容无关);Alpha 只做最小设置面,不做多语言 |
|
||||||
|
|
||||||
**其余不进 Alpha 项**:
|
**其余不进 Alpha 项**:
|
||||||
|
|
||||||
@@ -187,16 +190,14 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 遗物式构筑协同 | [05-不做清单](05-不做清单.md) |
|
| 遗物式构筑协同 | [05-不做清单](05-不做清单.md) |
|
||||||
| 战后自动回复 | [05-不做清单](05-不做清单.md) |
|
| 战后自动回复 | [05-不做清单](05-不做清单.md) |
|
||||||
| 反雪球机制 | [05-不做清单](05-不做清单.md) |
|
| 反雪球机制 | [05-不做清单](05-不做清单.md) |
|
||||||
| 键盘 / 手柄输入 | [待办清单](../../待办清单.md)(排期归 Beta。例外:营地语境 Esc 浮窗已落地〔用户明示裁决〕;键盘面其余仍排 Beta) |
|
| 键盘 / 手柄输入 | [待办清单](../../待办清单.md)(排期归 Beta) |
|
||||||
| 数值统一标定(M4 数值批) | M4 = Beta 阶段、M3 未由用户明令关闭前不排期——待办清单各条「已编入 Alpha 收官 M4」措辞系旧口径残留 |
|
| 数值统一标定(M4 数值批) | 2026-10-09 里程碑立规:M4 = Beta 阶段、M3 未由用户明令关闭前不排期(用户 2026-10-07 令移出迭代 18;2026-10-16 确认此裁长期有效)——待办清单各条「已编入 Alpha 收官 M4」措辞系旧口径残留 |
|
||||||
| 连刷 / 换图资金跨战斗携带 | [05-不做清单](05-不做清单.md) |
|
| 连刷 / 换图资金跨战斗携带 | [05-不做清单](05-不做清单.md) |
|
||||||
| 战斗节点地图类型差异化(更多地图主题) | 排 Beta 版本([playnote](../../playnote.md)) |
|
| 战斗节点地图类型差异化(更多地图主题) | 排 Beta 版本([playnote](../../playnote.md),2026-10-13 裁) |
|
||||||
| 第四关 | 排 Beta;全库无设计承载,N>3 走扩展批流程([03-内容规模](03-内容规模.md)) |
|
| 第四关 | 排 Beta;全库无设计承载,N>3 走扩展批流程([03-内容规模](03-内容规模.md)) |
|
||||||
| 生涯期二(历史冒险回看)与期三(图鉴) | 排 Beta;Alpha 只保留期一([生涯](systems/跨局循环/生涯.md)) |
|
| 生涯期二(历史冒险回看)与期三(图鉴) | 排 Beta;Alpha 只保留期一([生涯](systems/跨局循环/生涯.md)) |
|
||||||
| 素材升档重产 | 排 Beta;原始动机已由八敌逐键定档解决,剩余提灯候选随 Beta 资产批重议([待办清单](../../待办清单.md)) |
|
| 素材升档重产 | 排 Beta;原始动机已由八敌逐键定档解决,剩余提灯候选随 Beta 资产批重议([待办清单](../../待办清单.md)) |
|
||||||
| 站桩帧动画 | 排 Beta(用户裁);三路线与「立绘→派生形态」管线前置依赖见 [待办清单](../../待办清单.md)「站桩帧动画」条 |
|
| 元进度件贴图终稿 | 排 Beta;元进度图标在 Alpha 保留占位,不碍在役判定([美术资产清单](../art/art-assets-checklist.md))——营地场景图已随营地交互重做列入 Alpha(见「三 · 界面」表) |
|
||||||
| 元进度件贴图终稿 | 排 Beta;元进度图标在 Alpha 保留占位,不碍在役判定([美术资产清单](../art/art-assets-checklist.md))——营地场景图已列入 Alpha(见「三 · 界面」表) |
|
|
||||||
| 冒险前资源配比预设(构筑提案) | 排 Beta(用户裁 2026-11-05);Alpha 不排期,设计闭合凭据与重启条件见 [待办清单](../../待办清单.md)「冒险前资源配比预设(构筑提案)」条 |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 关卡节点图生成
|
# 关卡节点图生成
|
||||||
|
|
||||||
> 一句话:一关的节点图从哪来——生成器按参数长出一张合法图
|
> 一句话:一关的节点图从哪来——生成器按参数长出一张合法图
|
||||||
> 状态:现行为 v1.5
|
> 状态:现行为 v1.3
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -43,10 +43,10 @@
|
|||||||
| 约束 | 内容 |
|
| 约束 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 道路系统 | 图=主路+支路;除岔口节点(两条以上去路的节点)外每个节点恰一条去路;岔口去路 2–3 条 |
|
| 道路系统 | 图=主路+支路;除岔口节点(两条以上去路的节点)外每个节点恰一条去路;岔口去路 2–3 条 |
|
||||||
| 宽度=分叉生长 | 不摆平行层;同深度节点数由岔口自然长出,至宽度上限为止(上限读参数档,见参数契约) |
|
| 宽度=分叉生长 | 不摆平行层;同深度节点数由岔口自然长出(1→2→3→4……) |
|
||||||
| 层高=沿路步数 | 入口到终点的最长路径步数;第一关 ≥6,逐关递增且增幅变大 |
|
| 层高=沿路步数 | 入口到终点的最长路径步数;第一关 ≥6,逐关递增且增幅变大 |
|
||||||
| 出口归属锁定 | 多终点时由大岔口把图分成互不连达的分支区域,各区域只通向自己的终点;每个终点前一层节点的去路集合恰含一个终点——选路=提前承诺打谁 |
|
| 出口归属锁定 | 多终点时由大岔口把图分成互不连达的分支区域,各区域只通向自己的终点;每个终点前一层节点的去路集合恰含一个终点——选路=提前承诺打谁 |
|
||||||
| 战斗节点保底 | 奖励/恢复/商店占位后战斗节点量不被挤没(保底数进参数档,见参数契约) |
|
| 战斗节点保底 | 奖励/恢复/商店占位后战斗节点量不被挤没(保底数进调参表) |
|
||||||
| 多终点深度互异 | 多终点(多 Boss 节点)必须落在互异的节点深度;同一节点深度出现两个终点即判产出无效——共深会让「走哪条路打谁」落空 |
|
| 多终点深度互异 | 多终点(多 Boss 节点)必须落在互异的节点深度;同一节点深度出现两个终点即判产出无效——共深会让「走哪条路打谁」落空 |
|
||||||
|
|
||||||
节点深度的算法:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径。不用最短路径——合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。
|
节点深度的算法:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径。不用最短路径——合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。
|
||||||
@@ -74,8 +74,6 @@
|
|||||||
|
|
||||||
每关一套参数档(L1/L2/L3),生成器只吃参数档、不认关卡号。生长曲线:层高、宽度、节点总数、路径长度逐关递增且增幅变大;决策点密度逐关递增;第一关即含岔口——第一关也要有选择。单链是分支密度取下限的合法退化形态,不作为三关参数档的取值。
|
每关一套参数档(L1/L2/L3),生成器只吃参数档、不认关卡号。生长曲线:层高、宽度、节点总数、路径长度逐关递增且增幅变大;决策点密度逐关递增;第一关即含岔口——第一关也要有选择。单链是分支密度取下限的合法退化形态,不作为三关参数档的取值。
|
||||||
|
|
||||||
图规模无呈现侧上限:关卡画面为卷轴视口呈现,画布随图生长、屏为窗口(呈现规格归 [level-map](../../../ux/level-map.md));规模由参数档与生长曲线约束,参数档给不出合法图即致命中止。
|
|
||||||
|
|
||||||
### 节点类型配比:类型分布怎么掷、内容归谁
|
### 节点类型配比:类型分布怎么掷、内容归谁
|
||||||
|
|
||||||
配比是生成旋钮:战斗/奖励/恢复/商店各占多少由参数档定,生成器掷出分布落在图上成为节点类型;配比只管非终点节点,终点恒为 Boss、不进配比。节点类型在可见范围内对玩家公开(可见性规则归关卡节点地图)——看得见的类型才谈得上提前规划。
|
配比是生成旋钮:战斗/奖励/恢复/商店各占多少由参数档定,生成器掷出分布落在图上成为节点类型;配比只管非终点节点,终点恒为 Boss、不进配比。节点类型在可见范围内对玩家公开(可见性规则归关卡节点地图)——看得见的类型才谈得上提前规划。
|
||||||
@@ -87,7 +85,7 @@
|
|||||||
| 商店位 | 每个终点前一位恰一家商店——每名玩家一局必经恰一家店 |
|
| 商店位 | 每个终点前一位恰一家商店——每名玩家一局必经恰一家店 |
|
||||||
| 岔路取舍·下一跳 | 一个岔口分出的各条去路,下一节点类型互不相同——下一跳必在可见范围,是决策的可见锚(实现侧已兑现:候选集强制豁免类型可见性) |
|
| 岔路取舍·下一跳 | 一个岔口分出的各条去路,下一节点类型互不相同——下一跳必在可见范围,是决策的可见锚(实现侧已兑现:候选集强制豁免类型可见性) |
|
||||||
| 岔路取舍·支路构成 | 一个岔口分出的各条支路,整条支路的节点类型构成互不相同——每条支路至少有一个别的支路没有的类型(例:一路有恢复节点、一路有奖励节点) |
|
| 岔路取舍·支路构成 | 一个岔口分出的各条支路,整条支路的节点类型构成互不相同——每条支路至少有一个别的支路没有的类型(例:一路有恢复节点、一路有奖励节点) |
|
||||||
| 支路互异上限=出口数 3 | 商店与 Boss 每条支路必有,可供支路互斥的类型只剩战斗/奖励/恢复三类——一条链上的岔口最多切出 3 条互异支路,故出口个数至多 3(见生成参数旋钮表) |
|
| 支路互异上限=出口数 3 | 商店与 Boss 每条支路必有,可供支路互斥的类型只剩战斗/奖励/恢复三类——一条链上的岔口最多切出 3 条互异支路,故出口个数取值域为 1–3(见生成参数旋钮表) |
|
||||||
|
|
||||||
内容归各 owner:战斗节点打谁=敌人系统按深度带配池;奖励/恢复/商店的兑付语义=关卡节点地图与各 owner 文档。
|
内容归各 owner:战斗节点打谁=敌人系统按深度带配池;奖励/恢复/商店的兑付语义=关卡节点地图与各 owner 文档。
|
||||||
|
|
||||||
@@ -102,25 +100,24 @@
|
|||||||
| 协作 | 敌人系统 | 战斗节点遭遇按深度带配池,遭遇坐标=关卡序号+深度带;多终点各配 Boss 行 |
|
| 协作 | 敌人系统 | 战斗节点遭遇按深度带配池,遭遇坐标=关卡序号+深度带;多终点各配 Boss 行 |
|
||||||
| 协作 | 难度曲线与Boss | 图规模(节点数/战斗量)进它的投放节奏账;深度带配池的难度坡归它,本文零数值 |
|
| 协作 | 难度曲线与Boss | 图规模(节点数/战斗量)进它的投放节奏账;深度带配池的难度坡归它,本文零数值 |
|
||||||
| 上游 | 数据配置 | 参数档数据的承载与统一读取,数值事实源=data/tables |
|
| 上游 | 数据配置 | 参数档数据的承载与统一读取,数值事实源=data/tables |
|
||||||
| 协作 | level-map | 呈现只读:图形态随参数变化,画布随图生长(卷轴视口呈现,规格归 level-map);多终点各带 Boss 标记 |
|
| 协作 | level-map | 呈现只读:图形态随参数变化,画布自适应;多终点各带 Boss 标记 |
|
||||||
|
|
||||||
## 参数契约
|
## 调参表
|
||||||
|
|
||||||
本表只留概念面——本系统有哪些参数、各自管什么;取值域与字段契约的单点=数据 schema 层(`game/data/schemas/` 的关卡节点图参数结构,域校验执法),现行值=`game/data/tables/level_gen_params.tres`,provisional 标注随 schema 注释。本文不存取值域。
|
数值事实源=data/tables(定值批落表);本表只留取值域与设计意图。
|
||||||
|
|
||||||
| 参数 | 设计意图(概念面) |
|
| 参数 | 取值域 | 设计意图 | 状态 |
|
||||||
|---|---|
|
|---|---|---|---|
|
||||||
| 层深 | 图有多高(沿路步数);第一关不再是零选择短链,后期关显著更长,推进感随冒险加深 |
|
| 层深 L1 | ≥6(步) | 第一关不再是零选择短链——够长才有岔口与取舍 | 已锁下限 |
|
||||||
| 岔口去路数 | 每次取舍在少量去路里选:少了没选择,多了不过脑 |
|
| 层深 L2/L3 | >前一关且增幅变大 | 后期关显著更长,推进感随冒险加深 | provisional |
|
||||||
| 岔口取三去路概率 | 允许三去路的岔口中,实际长出第三条去路的比例——控制宽图出现频率 |
|
| 岔口去路数 | 2–3 | 每次取舍在 2–3 条里选:少了没选择,多了不过脑 | 已锁 |
|
||||||
| 同深度节点宽度上限 | 同一深度最多并排几个节点;岔口生长到此即止,不再加宽 |
|
| 分支密度 | 待定值 | 一局遇到多少次取舍(目标量级=一局十几次,待设计验证) | provisional |
|
||||||
| 填充交替起始 | 恢复/奖励节点交替填充时,先放恢复节点的比例 |
|
| 入口个数 | 1 起 | 多入口给「从哪进场」的第一层选择 | provisional |
|
||||||
| 分支密度 | 一局遇到多少次取舍(目标量级待设计验证) |
|
| 出口个数 | L1 恒 1;L2/L3 1–3 | 多终点让「走哪条=打谁」成立;大岔口自第二关起 | 已锁范围 |
|
||||||
| 入口个数 | 多入口给「从哪进场」的第一层选择 |
|
| 配比 | 四类占比合计 1,战斗保底优先 | 攻击性/兑付/恢复的节奏配比 | provisional |
|
||||||
| 出口个数 | 多终点让「走哪条=打谁」成立;大岔口自第二关起 |
|
| 战斗节点保底数 | ≥ 调参值 | 成长位不挤没战斗——战斗是本作核心量 | provisional |
|
||||||
| 配比 | 攻击性/兑付/恢复的节奏配比,战斗保底优先 |
|
| 商店数 | =出口数 | 每局决战前恰一次补给,成长保底是结构事实 | 已锁 |
|
||||||
| 战斗节点保底数 | 成长位不挤没战斗——战斗是本作核心量 |
|
| 图包络 | ≤ 屏预算(1280×800 下约 10 层×8 槽) | 超预算只许限参数档,禁改画布冻结公式 | 已锁 |
|
||||||
| 商店数 | 每局决战前恰一次补给,成长保底是结构事实 |
|
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:图**从哪来**(按参数长图)与**什么算合法图**(产出规格)归[关卡节点图生成](关卡节点图生成.md);图上**具体摆什么料**(敌人行集、奖励内容)归各 owner 系统;本文管图**怎么走、走到每步发生什么**,以及加载期的合法性校验动作(规则语义以关卡节点图生成的产出规格为准)。战斗内部的一切(敌人怎么配、几只、什么技能池、踩雷负向怎么兑)归战斗循环文档;本文只负责把"第几关、哪个节点"递过去。
|
边界这样划:图**从哪来**(按参数长图)与**什么算合法图**(产出规格)归[关卡节点图生成](关卡节点图生成.md);图上**具体摆什么料**(敌人行集、奖励内容)归各 owner 系统;本文管图**怎么走、走到每步发生什么**,以及加载期的合法性校验动作(规则语义以关卡节点图生成的产出规格为准)。战斗内部的一切(敌人怎么配、几只、什么技能池、踩雷负向怎么兑)归战斗循环文档(原"伏击怎么叠"随 2026-09-20 八型批伏击退役改述);本文只负责把"第几关、哪个节点"递过去。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
| 图从哪来、节点类型构成与合法图规则 | [关卡节点图生成](关卡节点图生成.md) |
|
| 图从哪来、节点类型构成与合法图规则 | [关卡节点图生成](关卡节点图生成.md) |
|
||||||
| 关卡大奖励、跨战斗生命、失败重开 | [冒险结构](冒险结构.md) |
|
| 关卡大奖励、跨战斗生命、失败重开 | [冒险结构](冒险结构.md) |
|
||||||
| 战斗内部的一切:敌人配置、数量、技能池、踩雷负向 | [敌人系统](../战斗循环/敌人系统.md)与[战斗结算](../战斗循环/战斗结算.md) |
|
| 战斗内部的一切:敌人配置、数量、技能池、踩雷负向 | [敌人系统](../战斗循环/敌人系统.md)与[战斗结算](../战斗循环/战斗结算.md) |
|
||||||
| 同场多敌种(同一节点配多种敌人)的表结构与取值口径 | 敌人系统 |
|
| 同场多敌种(同一节点配多种敌人)的表结构与取值口径 | 敌人系统(战斗侧改键批) |
|
||||||
| 节点奖励件的分类与凭证定义 | [奇物](奇物.md)(提升池构成与库存归[冒险结构](冒险结构.md)) |
|
| 节点奖励件的分类与凭证定义 | [奇物](奇物.md)(提升池构成与库存归[冒险结构](冒险结构.md)) |
|
||||||
| 敌我数值曲线与遭遇投放节奏 | [难度曲线与Boss](难度曲线与Boss.md) |
|
| 敌我数值曲线与遭遇投放节奏 | [难度曲线与Boss](难度曲线与Boss.md) |
|
||||||
| 节点图的画面呈现、方块地牢观感 | [HUD 框架](../表现与支撑/HUD框架.md) |
|
| 节点图的画面呈现、方块地牢观感 | [HUD 框架](../表现与支撑/HUD框架.md) |
|
||||||
@@ -58,15 +58,15 @@
|
|||||||
| Boss | 恒为图终点;行进至此开 Boss 战;胜利即关卡收束点 |
|
| Boss | 恒为图终点;行进至此开 Boss 战;胜利即关卡收束点 |
|
||||||
| 奖励 | 行进至此触发节点奖励(兑付见下节);反馈呈现后回到选路 |
|
| 奖励 | 行进至此触发节点奖励(兑付见下节);反馈呈现后回到选路 |
|
||||||
| 恢复 | 行进至此向冒险结构发治疗封顶回报;反馈呈现后回到选路 |
|
| 恢复 | 行进至此向冒险结构发治疗封顶回报;反馈呈现后回到选路 |
|
||||||
| 商店 | 行进至此打开商店覆盖层,用 GP(战斗掉落的冒险内货币)购买属性提升;离开后兑付确认回选路;不携带战斗行。进店从共享池抽 3 展示、买 1 后三件全重抽(未买不保留)、货架买空=空架合法态(pool 模式现行);**独立刷新**:基础免费 0 次(天赋/营地侧刷新次数增益位预留)+ GP 付费刷新 ceil(20×1.8^已付费刷) provisional,重抽=共享池同源(shop_draw 同签);库存与定价归[冒险结构](冒险结构.md)共享池节 |
|
| 商店 | 行进至此打开商店覆盖层,用 GP(战斗掉落的冒险内货币)购买属性提升;离开后兑付确认回选路;不携带战斗行。**v1.5 兑付换代(pool 模式现行)**:进店从共享池抽 3 展示、买 1 后三件全重抽(未买不保留)、货架买空=空架合法态。**v1.6(2026-10-04 P-C2+Q2 裁/MC-1)**:新增**独立刷新**——基础免费 0 次(天赋/营地侧刷新次数增益位预留)+ GP 付费刷新 ceil(20×1.8^已付费刷) provisional;重抽=共享池同源(shop_draw 同签),推翻本行旧「无独立刷新动作——重抽绑购买」口径;库存与定价归[冒险结构](冒险结构.md)共享池节 |
|
||||||
|
|
||||||
商店房的编排规则:**每个终点前一位恰一家店**——哈迪斯式的"决战前最后一个补给点":买到的属性还有整段战斗可消费,错过的成长也没有第二家店可补。终点前一位同时是**必经位**:每名玩家一局恰好必经一家店,成长保底是图结构事实而非玩家自觉。这条位置约束不由加载校验承载,由冒烟断言把关(摆放规则语义见[关卡节点图生成](关卡节点图生成.md)配比节)。
|
商店房的编排规则:**每个终点前一位恰一家店**——哈迪斯式的"决战前最后一个补给点":买到的属性还有整段战斗可消费,错过的成长也没有第二家店可补。终点前一位同时是**必经位**:每名玩家一局恰好必经一家店,成长保底是图结构事实而非玩家自觉。这条位置约束不由加载校验承载,由冒烟断言把关(摆放规则语义见[关卡节点图生成](关卡节点图生成.md)配比节)。
|
||||||
|
|
||||||
每个节点在图上有**节点深度**(本文含义:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径),用来当战斗的定位地址——遭遇坐标=关卡序号+节点深度,敌人表按**深度带**(深度区间)配池,寻址语义见[敌人系统](../战斗循环/敌人系统.md)。不用最短路径:合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。"最深处是关底"的直感由深度承载:终点恒在各路径最深处。单链(每步只有一条连线)是合法退化形态,节点深度等于它前面走过的战斗场数;三关参数档都含岔口,第一关不再是单链。图的来源见[关卡节点图生成](关卡节点图生成.md)。
|
每个节点在图上有**节点深度**(本文含义:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径),用来当战斗的定位地址——遭遇坐标=关卡序号+节点深度,敌人表按**深度带**(深度区间)配池,寻址语义见[敌人系统](../战斗循环/敌人系统.md)。不用最短路径:合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。"最深处是关底"的直感由深度承载:终点恒在各路径最深处。单链(每步只有一条连线)是合法退化形态,节点深度等于它前面走过的战斗场数;三关参数档都含岔口,第一关不再是单链。图的来源见[关卡节点图生成](关卡节点图生成.md)。
|
||||||
|
|
||||||
呈现侧口径(2026-09-17 用户拍板):节点图的画面表达走**方块地牢观感**——节点画成地牢房间的方块、连线画成通道——但逻辑拓扑就是本文的节点图,不产生任何额外选路或探索语义。关卡画面本体即节点链进度的呈现载体(选路覆盖层的常驻形态,节点态直接读图:已过暗金 / 当前金 / 候选下一跳通道亮金 / Boss 紫赤描边(紫赤+深墨环,视觉定稿见 [level-map](../../../ux/level-map.md))),不另设进度条组件;视觉规格归 [HUD 框架](../表现与支撑/HUD框架.md)。
|
呈现侧口径(2026-09-17 用户拍板):节点图的画面表达走**方块地牢观感**——节点画成地牢房间的方块、连线画成通道——但逻辑拓扑就是本文的节点图,不产生任何额外选路或探索语义。关卡画面本体即节点链进度的呈现载体(选路覆盖层的常驻形态,节点态直接读图:已过暗金 / 当前金 / 候选下一跳通道亮金 / Boss 紫赤描边(紫赤+深墨环,视觉定稿见 [level-map](../../ux/level-map.md))),不另设进度条组件;视觉规格归 [HUD 框架](../表现与支撑/HUD框架.md)。
|
||||||
|
|
||||||
**商店覆盖层呈现**(呈现 spec:[design/ux/shop.md](../../../ux/shop.md) v1.0;pool 模式货架面=共享池三选一同构卡〔进店抽 3/买 1 全重抽/空架售罄态〕,与三选一奖励同一交互语言;legacy 固定三件面随对照模式保留。**库存余量不呈现**(2026-10-04 用户裁)——货架卡不带「库存余 N/∞」字样,库存语义仍在共享池令牌库、只是不呈现):兑付 = 打开商店覆盖层(模态)——货架卡陈列、GP 余额读数、购买/离开;离开后兑付确认回选路。本节锁编排面(何时开/何时关/回选路),呈现细节归 spec;定价数值归[难度曲线与Boss](难度曲线与Boss.md)(shop.tres)。
|
**商店覆盖层呈现**(呈现 spec:[design/gdd/ux/shop.md](../../ux/shop.md) v1.0,2026-09-30;**v1.5 注记**——pool 模式货架面=共享池三选一同构卡〔进店抽 3/买 1 全重抽/空架售罄态〕,与三选一奖励同一交互语言;legacy 固定三件面随对照模式保留。**v1.5-a 注记(2026-10-04 用户裁)**:~~库存余量就近~~ **库存余量不呈现**(货架卡不带「库存余 N/∞」字样——库存语义仍在共享池令牌库,仅呈现退役;独立刷新机制另见待办清单「商店独立刷新机制」条):兑付 = 打开商店覆盖层(模态)——货架卡陈列、GP 余额读数、购买/离开;离开后兑付确认回选路。本节锁编排面(何时开/何时关/回选路),呈现细节归 spec;定价数值归[难度曲线与Boss](难度曲线与Boss.md)(shop.tres)。
|
||||||
|
|
||||||
### 行进与选路:兑付后确认,选路就是行进
|
### 行进与选路:兑付后确认,选路就是行进
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
| 纪律 | 内容 |
|
| 纪律 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 兑付后确认 | 到达节点立即兑付,不设"进入前确认"步;兑付反馈呈现完,玩家确认才回图。战斗节点的确认挂在战斗总结结算上(呈现 spec:design/ux/settlement-summary.md),奖励/恢复节点挂在兑付反馈覆盖层上,商店节点挂在商店覆盖层的离开动作上——复用既有呈现位,零新增交互范式 |
|
| 兑付后确认 | 到达节点立即兑付,不设"进入前确认"步;兑付反馈呈现完,玩家确认才回图。战斗节点的确认挂在战斗总结结算上(呈现 spec:design/gdd/ux/settlement-summary.md),奖励/恢复节点挂在兑付反馈覆盖层上,商店节点挂在商店覆盖层的离开动作上——复用既有呈现位,零新增交互范式 |
|
||||||
| 零自动推进 | 确认之后回到关卡画面的选路口:岔路口玩家选一条连线,单链路口确认"继续"。选了才走;不选就停在图上 |
|
| 零自动推进 | 确认之后回到关卡画面的选路口:岔路口玩家选一条连线,单链路口确认"继续"。选了才走;不选就停在图上 |
|
||||||
|
|
||||||
Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选路——关卡已定局,后续流程归冒险结构。
|
Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选路——关卡已定局,后续流程归冒险结构。
|
||||||
@@ -123,7 +123,7 @@ Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选
|
|||||||
|
|
||||||
第二关的"新内容 = 既有池新技能"(技能池构成已定稿入[敌人系统](../战斗循环/敌人系统.md)技能池节)投放时,改的是战斗侧行里引用的技能池内容——节点图结构原样不动,本文无需为投放留任何新结构位。
|
第二关的"新内容 = 既有池新技能"(技能池构成已定稿入[敌人系统](../战斗循环/敌人系统.md)技能池节)投放时,改的是战斗侧行里引用的技能池内容——节点图结构原样不动,本文无需为投放留任何新结构位。
|
||||||
|
|
||||||
**节点奖励 = 提升三选一(用户 2026-10-01 拍板:与通关三选一共享同池)**:奖励节点到达即开三选一(呈现 = 提升三选一覆盖层共用面,spec:[node-reward.md](../../../ux/node-reward.md) v2.0)——从提升池七种(攻击/生命上限/护甲/GP 袋/行动点件/恢复件/刷新件)按同一令牌库洗牌不放回抽 3(同 kind 去重、同一封闭随机流),玩家点选一件兑付(选中踢池、未选回池;秘宝件已出池,满位替换子交互随之不再触发)。件获取次数计数与令牌库为冒险级单例——两渠道同一令牌库合计消耗。「池空直通」为合法态——池耗即枯竭,空库 = 零候选合法态直通(见[冒险结构](冒险结构.md)令牌池节)。
|
**节点奖励 = 提升三选一(迭代 10 追加批——用户 2026-10-01 拍板:与通关三选一共享同池)**:奖励节点到达即开三选一(呈现 = 提升三选一覆盖层共用面,spec:[node-reward.md](../../ux/node-reward.md) v2.0)——从提升池七种(攻击/生命上限/护甲/GP 袋/行动点件/恢复件/刷新件)按同一令牌库洗牌不放回抽 3(同 kind 去重、同一封闭随机流),玩家点选一件兑付(选中踢池、未选回池;秘宝件已随迭代 11 第①批出池,满位替换子交互随之不再触发)。件获取次数计数与令牌库为冒险级单例——两渠道同一令牌库合计消耗。原「秘宝投放渠道三选一」(迭代 7 拍板②丙过渡形态)顺带退役;秘宝局外同调件形态已随同调实施批落地(迭代 11 第①批;原提案 §9 已退役)。「池空直通」为合法态——池耗即枯竭,空库 = 零候选合法态直通(见[冒险结构](冒险结构.md)令牌池节)。
|
||||||
|
|
||||||
### 关卡收束点:先清库、后宣布
|
### 关卡收束点:先清库、后宣布
|
||||||
|
|
||||||
@@ -166,8 +166,8 @@ Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P2 | 精英节点与精英遭遇 | 不设编码位——精英以内容方式承载(某编号节点配强敌行集);与难度曲线、战斗侧批联动设计。精英怪设定已登记预留(同立绘+附加特征标记+数值更强、钥石掉 1 个预留——实装随怪物批,本文件行集零改动) |
|
| P2 | 精英节点与精英遭遇 | 不设编码位——精英以内容方式承载(某编号节点配强敌行集);与难度曲线、战斗侧批联动设计。精英怪设定已登记预留(迭代 10 奖励重构批:同立绘+附加特征标记+数值更强、钥石掉 1 个预留——实装随怪物批,本文件行集零改动) |
|
||||||
| P2 | 事件类节点候选 | 商店房已落地,"商人类撞抽象货币红线"的旧注记由[不做清单](../../05-不做清单.md)的现行条款替代;事件类节点仍无内容系统承载;扩类一律走文档修订 |
|
| P2 | 事件类节点候选 | 商店房已随 2026-09-20 GP+商店房批落地(v1.1),"商人类撞抽象货币红线"的旧注记由[不做清单](../../05-不做清单.md)的现行条款替代;事件类节点仍无内容系统承载;扩类一律走文档修订 |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 冒险结构
|
# 冒险结构
|
||||||
|
|
||||||
> 一句话:整局冒险的关卡序列、失败与大奖励
|
> 一句话:整局冒险的关卡序列、失败与大奖励
|
||||||
> 状态:已定稿;现行为 v1.6
|
> 状态:已定稿(自旧体系迁移);现行为 v1.3
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
| 关卡序列 | 关卡表(逐关一行的配置表)行集内容的责任方;推进规则:线性、无跳关 |
|
| 关卡序列 | 关卡表(逐关一行的配置表)行集内容的责任方;推进规则:线性、无跳关 |
|
||||||
| 生命 | 跨战斗生命持久性的冒险侧系统资源:每战交出、战后收回、两个恢复口 |
|
| 生命 | 跨战斗生命持久性的冒险侧系统资源:每战交出、战后收回、两个恢复口 |
|
||||||
| GP | 战斗掉落货币的局内系统资源(显示名「GP」):战斗完成统一入账、商店购买出账、冒险收束清零;统一冒险加算区(商店购买与大奖励同账) |
|
| GP | 战斗掉落货币的局内系统资源(显示名「GP」):战斗完成统一入账、商店购买出账、冒险收束清零;统一冒险加算区(商店购买与大奖励同账) |
|
||||||
| 关卡大奖励 | 非末关完成的两层兑付:专长三选一(选择型,按档配比加权抽取)+ 部分回血(固定型);钥石不入大奖励,走 Boss/精英击杀战斗掉落 |
|
| 关卡大奖励 | 非末关完成的两层兑付:专长三选一(选择型,按档配比加权抽取——迭代 20 换代)+ 部分回血(固定型);钥石退役出大奖励,改 Boss/精英击杀战斗掉落 |
|
||||||
| 失败重开与放弃 | 倒下即冒险终;重开等于全新一轮;放弃与失败同型结算 |
|
| 失败重开与放弃 | 倒下即冒险终;重开等于全新一轮;放弃与失败同型结算 |
|
||||||
| 主种子接线 | 一场冒险一个主种子,冒险内一切随机数派生自它 |
|
| 主种子接线 | 一场冒险一个主种子,冒险内一切随机数派生自它 |
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
| 节点奖励件的分类与凭证定义、池结构与抽取机制(案D——共享池库存仍归本文) | [奇物](奇物.md) |
|
| 节点奖励件的分类与凭证定义、池结构与抽取机制(案D——共享池库存仍归本文) | [奇物](奇物.md) |
|
||||||
| 关卡完成率带、敌我数值与 Boss 设计 | [难度曲线与Boss](难度曲线与Boss.md) |
|
| 关卡完成率带、敌我数值与 Boss 设计 | [难度曲线与Boss](难度曲线与Boss.md) |
|
||||||
| 钥石与跨局成长 | [元进度](../跨局循环/元进度.md) |
|
| 钥石与跨局成长 | [元进度](../跨局循环/元进度.md) |
|
||||||
| 冒险总结结算(呈现摘要五件事;呈现 spec:design/ux/settlement-summary.md)与关卡推进指示 | [HUD框架](../表现与支撑/HUD框架.md) |
|
| 冒险总结结算(呈现摘要五件事;呈现 spec:design/gdd/ux/settlement-summary.md——旧称「摘要结算画面」随 spec 命名完成退役)与关卡推进指示 | [HUD框架](../表现与支撑/HUD框架.md) |
|
||||||
|
|
||||||
## 在核心循环中的位置
|
## 在核心循环中的位置
|
||||||
|
|
||||||
@@ -73,9 +73,9 @@
|
|||||||
|
|
||||||
一场冒险由关卡串成。关卡(本文含义:地牢一层的完整推进——一条节点链加一个关底 Boss)的序列读关卡表:逐关一行的配置表,本文是它行集内容的责任方,表本体与读取机制归[数据配置](../表现与支撑/数据配置.md)。
|
一场冒险由关卡串成。关卡(本文含义:地牢一层的完整推进——一条节点链加一个关底 Boss)的序列读关卡表:逐关一行的配置表,本文是它行集内容的责任方,表本体与读取机制归[数据配置](../表现与支撑/数据配置.md)。
|
||||||
|
|
||||||
MVP 的序列是三关线性:地精洞窟→幽暗地域→灰矮人矿城。关卡完成(该关关底 Boss 被击杀)自动进下一关;冒险成功 = 最后一关的关底 Boss 被击杀。没有跳关、没有回头路;关卡行进走[关卡节点地图](关卡节点地图.md)的分支节点图(切片第一关为单链特例)。
|
MVP 的序列是三关线性:地精洞窟→幽暗地域→灰矮人矿城(2026-09-21 生效)。通关一关(该关关底 Boss 被击杀)自动进下一关;冒险通关 = 最后一关的关底 Boss 被击杀。没有跳关、没有回头路;关卡行进走[关卡节点地图](关卡节点地图.md)的分支节点图(切片第一关为单链特例)。
|
||||||
|
|
||||||
三关序列均已生效(L2/L3 行值见[难度曲线与Boss](难度曲线与Boss.md))。
|
三关序列均已生效(2026-09-21 冒险结构实现批起;L2 行值随分支节点图批、L3 随第三关内容批落地,见[难度曲线与Boss](难度曲线与Boss.md))。
|
||||||
|
|
||||||
加关纪律:加一关等于一个内容批——节点链行、敌我数值、新元素必须同批落,禁止只加序列不加内容。行集里每个战斗与关底节点都必须在敌人、棋盘生成的数值表里有精确行,冒烟期校验;越界关卡按内容生产缺口拦截。运行期对越界的开始关卡请求与缺失的关卡行一律返回错误并停机——那是配置违约,不是玩家能碰到的状态,不做兜底吞掉。
|
加关纪律:加一关等于一个内容批——节点链行、敌我数值、新元素必须同批落,禁止只加序列不加内容。行集里每个战斗与关底节点都必须在敌人、棋盘生成的数值表里有精确行,冒烟期校验;越界关卡按内容生产缺口拦截。运行期对越界的开始关卡请求与缺失的关卡行一律返回错误并停机——那是配置违约,不是玩家能碰到的状态,不做兜底吞掉。
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ MVP 的序列是三关线性:地精洞窟→幽暗地域→灰矮人矿城。
|
|||||||
| 三选一选上限提升件 | 上限 H₀+Δ 记加算区(对后续每战生效);生命不变 |
|
| 三选一选上限提升件 | 上限 H₀+Δ 记加算区(对后续每战生效);生命不变 |
|
||||||
| 下一关开局 | 生命当前值 / 生效上限按原值入战(不再自动回满) |
|
| 下一关开局 | 生命当前值 / 生效上限按原值入战(不再自动回满) |
|
||||||
|
|
||||||
增益随战斗结束清空(归战斗结算)、道具库存随关卡结束清空(由关卡节点地图在收束点编排);储备行动点整局保留、冒险收束才清零(归[行动经济](../排雷循环/行动经济.md))。冒险层跨关留下的,是这条命、冒险摘要与储备行动点。
|
冒险内没有其他跨关遗留物:增益随战斗结束清空(归战斗结算)、道具库存随关卡结束清空(由关卡节点地图在收束点编排)、储备行动点随战斗结束清零(归[行动经济](../排雷循环/行动经济.md))。冒险层真正跨关留下的,只有这条命与冒险摘要。
|
||||||
|
|
||||||
### GP:战斗掉落的局内钱包与统一冒险加算区
|
### GP:战斗掉落的局内钱包与统一冒险加算区
|
||||||
|
|
||||||
@@ -143,38 +143,38 @@ GP(显示名「GP」)是冒险内的一次性属性提升货币:战斗胜
|
|||||||
| 收支口 | 方向 | 规则 |
|
| 收支口 | 方向 | 规则 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 战斗完成 | 入 | 每完成一场战斗统一到账一次:金额 = 掉落掷定 + 关级掉落加值 + 本战战斗内缓冲,随战斗结束信号携带的掉落额一笔入账 |
|
| 战斗完成 | 入 | 每完成一场战斗统一到账一次:金额 = 掉落掷定 + 关级掉落加值 + 本战战斗内缓冲,随战斗结束信号携带的掉落额一笔入账 |
|
||||||
| 商店购买 | 出 | 商店房购买按现行价扣减钱包,余额不足拒绝。价格公式(pool 模式现行):ceil(基价 × b^(关序−1) × A^(本次进店已购次数)),A=店内递增/b=跨关递增表因子(provisional 1.8/1.1),ceil 向上单一取整(玩家不利向,杜绝「差 1 GP 反复钓」套利角);legacy 固定三件模式(shop=off 对照承载)沿用旧式 = 基价 + 关级价格加成 + 步长 × 已购档数 |
|
| 商店购买 | 出 | 商店房购买按现行价扣减钱包,余额不足拒绝。价格公式(**v0.13 换代——pool 模式现行**):ceil(基价 × b^(关序−1) × A^(本次进店已购次数)),A=店内递增/b=跨关递增表因子(provisional 1.8/1.1),ceil 向上单一取整(玩家不利向,杜绝「差 1 GP 反复钓」套利角);legacy 固定三件模式(shop=off 对照承载)沿用旧式 = 基价 + 关级价格加成 + 步长 × 已购档数 |
|
||||||
| 冒险收束 | 清零 | 完成 / 失败 / 放弃三种结局都清零;重开后钱包从零开始 |
|
| 冒险收束 | 清零 | 完成 / 失败 / 放弃三种结局都清零;重开后钱包从零开始 |
|
||||||
|
|
||||||
**战斗内缓冲隔离**:战斗进行中从格面兑付拿到的 GP(GP 袋正向、破财负向——字典归[地图战斗资源](../战斗循环/地图战斗资源.md))不直接进钱包,而是记入战斗域的中间态缓冲;战斗完成时缓冲随掉落掷定与关级加值一并折进掉落额统一到账。钱包只在战斗边界变动,战斗域自身零钱包状态——这条隔离让战斗结算保持"折算归我、GP 归冒险结构"的既有边界。
|
**战斗内缓冲隔离**:战斗进行中从格面兑付拿到的 GP(GP 袋正向、破财负向——字典归[地图战斗资源](../战斗循环/地图战斗资源.md))不直接进钱包,而是记入战斗域的中间态缓冲;战斗完成时缓冲随掉落掷定与关级加值一并折进掉落额统一到账。钱包只在战斗边界变动,战斗域自身零钱包状态——这条隔离让战斗结算保持"折算归我、GP 归冒险结构"的既有边界。
|
||||||
|
|
||||||
**统一冒险加算区**:商店购买的属性提升与奖励节点三选一的属性件记**同一笔**——加算区四轴 {攻击, 生命上限, 护甲等级, 行动点},入战参数 = 基础表值 + 加算区累加,经战斗开始入参的覆盖值通道生效(与生命的上参同一条通道)。购买生命上限时:pool 模式(货架件=奖励件本体)只加上限不回当前生命(与三选一件同语义);legacy 模式当前生命与上限同步 +Δ(生命的连带写入口)。属性轴累加源 = 商店购买与奖励节点三选一属性件两类;行动点轴累加源 = 奖励节点三选一 AP 件与商店 AP 件两类(每场战斗开始的首轮行动点基线 +1,语义细节归[行动经济](../排雷循环/行动经济.md)跨冒险加成轴节;次数上限=池消耗即上限,pool 模式下商店购买与三选一共用令牌库,见下)。
|
**统一冒险加算区**:商店购买的属性提升与奖励节点三选一的属性件记**同一笔**——加算区四轴 {攻击, 生命上限, 护甲等级, 行动点},入战参数 = 基础表值 + 加算区累加,经战斗开始入参的覆盖值通道生效(与生命的上参同一条通道)。购买生命上限时:pool 模式(v0.13——货架件=奖励件本体)只加上限不回当前生命(与三选一件同语义);legacy 模式当前生命与上限同步 +Δ(生命的连带写入口)。属性轴累加源 = 商店购买与奖励节点三选一属性件两类;行动点轴累加源 = 奖励节点三选一 AP 件与商店 AP 件两类(每场战斗开始的首轮行动点基线 +1,语义细节归[行动经济](../排雷循环/行动经济.md)跨冒险加成轴节;~~全冒险获取次数上限最紧 provisional 2 次~~——v0.14 次数上限退役,池消耗即上限,pool 模式下商店购买与三选一共用令牌库,见下)。
|
||||||
|
|
||||||
掉落掷定消费 gp_drop 封闭随机流(主种子派生、可回放)。**商店货架抽签消费 shop_draw 封闭随机流**(每次抽一批〔进店+每次买后重抽〕恰一 scope,批大小=货架位数读商店表,与三选一抽签分签防取数序互扰)。掉落与价格的现行行值读商店表,数值所有权归[难度曲线与Boss](难度曲线与Boss.md)曲线调参批——全部数值 provisional。
|
掉落掷定消费 gp_drop 封闭随机流(主种子派生、可回放)。**商店货架抽签消费 shop_draw 封闭随机流**(v0.13 扩签——每次抽 3〔进店+每次买后重抽〕恰一 scope,与三选一抽签分签防取数序互扰)。掉落与价格的现行行值读商店表,数值所有权归[难度曲线与Boss](难度曲线与Boss.md)曲线调参批——本批骨架先行,全部数值 provisional。
|
||||||
|
|
||||||
**共享池账本(案D 四级 104 张——池机制事实源=[奇物](奇物.md)「池结构与抽取」节)**:商店货架与奖励节点三选一是**同一个池**——货架候选 = 池∖{GP 袋, 刷新件}∪{凭证} = {攻击, 生命上限, 护甲, 行动点, 回复, 凭证} 六种(GP 袋计价物不自售切边、刷新件不上货架、秘宝件已出池;凭证与回复已入架——shop.tres pool_shelf 六行);**库存 = 剩余令牌数**(TP0——「池消耗即上限」,种类次数上限退役,与奖励兑付摘牌同一令牌库承载,全冒险一次性跨关卡不补给):商店买一件,奖励面就少一枚;「无限购买」收敛为**钱尽或池空为止**(池空=硬闸、A 链爬价=软闸),空货架合法态。货架 = **令牌级抽签**(同 kind 去重每 kind 至多一卡,价格公式 tier-blind,购买消费在架令牌本体 kind+tier)。禁止两渠道各自私记库存——消费走同一入口写同一令牌库(令牌多重集单点:池与判定归该单点持有,各 kind 的派生计数与断点附随件同在这一点上承载)。**货架独立刷新**:进店免费刷新次数(基础 0,天赋/营地侧增益位预留)用尽后 GP 付费刷新(ceil(20×1.8^已付费刷) provisional——调参表旋钮 shop_refresh_*);重抽=共享池抽签(shop_draw 恰一新 scope),池空=不可刷新合法态;进店/离开双向清零付费刷计数。**三选一同款付费档(2026-10-06 用户令——刷新对齐商店)**:三选一免费双源(刷新件与冒险池两笔,机制现行事实源=[秘宝](../跨局循环/秘宝.md)三选一刷新双源节)用尽后 GP 付费刷新——读同 shop_refresh_* 两旋钮(单点调参)、扣同一 GP 冒险账本(同一扣账入口)、重抽同三选一共享池抽签;付费刷计数每停点清零(与进店清零同构);钮常驻选择态、免费与付费两源皆穷=禁用。
|
**共享池账本(v0.13 P1 共享池单点;v0.14 令牌库换代;迭代 20 案D 四级 104 张——池机制事实源=[奇物](奇物.md)「池结构与抽取」节)**:商店货架与奖励节点三选一是**同一个池**——货架候选 = 池∖{GP 袋, 刷新件}∪{凭证} = {攻击, 生命上限, 护甲, 行动点, 回复, 凭证} 六种(GP 袋计价物不自售切边、刷新件不上货架、秘宝件已随同调批出池;凭证与回复随迭代15② 入架——shop.tres pool_shelf 六行);**库存 = 剩余令牌数**(TP0——「池消耗即上限」,种类次数上限退役,与奖励兑付摘牌同一令牌库承载,全冒险一次性跨关卡不补给):商店买一件,奖励面就少一枚;「无限购买」收敛为**钱尽或池空为止**(池空=硬闸、A 链爬价=软闸),空货架合法态。货架 = **令牌级抽签**(同 kind 去重每 kind 至多一卡,价格公式 tier-blind 维持批②裁定,购买消费在架令牌本体 kind+tier)。禁止两渠道各自私记库存——消费走同一入口写同一令牌库(令牌多重集单点:池与判定归该单点持有,各 kind 的派生计数与断点附随件同在这一点上承载)。**货架独立刷新(v0.15 MC-1 2026-10-04——P-C2+Q2 裁)**:进店免费刷新次数(基础 0,天赋/营地侧增益位预留)用尽后 GP 付费刷新(ceil(20×1.8^已付费刷) provisional——调参表旋钮 shop_refresh_*);重抽=共享池抽签(shop_draw 恰一新 scope),池空=不可刷新合法态;进店/离开双向清零付费刷计数。**三选一同款付费档(v0.16 2026-10-06 用户令——刷新对齐商店)**:三选一免费双源(刷新件与冒险池两笔,机制现行事实源=[秘宝](../跨局循环/秘宝.md)三选一刷新双源节)用尽后 GP 付费刷新——读同 shop_refresh_* 两旋钮(单点调参)、扣同一 GP 冒险账本(同一扣账入口)、重抽同三选一共享池抽签;付费刷计数每停点清零(与进店清零同构);钮常驻选择态、免费与付费两源皆穷=禁用。
|
||||||
|
|
||||||
### 关卡大奖励:关卡完成回血 + 专长三选一(钥石退役出大奖励)
|
### 关卡大奖励:关卡完成回血 + 专长三选一(钥石退役出大奖励)
|
||||||
|
|
||||||
关卡大奖励(本文含义:非末关通关时的固定+选择兑付)为两层兑付:**选择层 = 专长三选一(2026-10-11 用户裁)——通关渠道是专长的独占渠道兼唯一直接渠道,候选按档配比加权抽取(机制事实源=[奇物](奇物.md)渠道轴交叉表与「池结构与抽取」节);固定层 = 部分回血;钥石走 Boss/精英击杀的战斗掉落。** 兑付时点固定:关卡节点地图先调战斗结算的关卡收束接口清空关卡域库存,再向本文宣布关卡结束——大奖励在这之后、下一关开始之前兑付,顺序不可换。非末关每关各兑付一次(现行三关下至多两次,末关不兑付)。
|
关卡大奖励(本文含义:非末关通关时的固定+选择兑付)自 2026-09-30 用户拍板重构——原「固定发三件」(上限提升/血回满/钥石入账)退役,改两层兑付;钥石挪为 Boss/精英击杀的战斗掉落。**2026-10-11 迭代 20 换代(用户裁 Q1):选择层由提升三选一换代为专长三选一——通关渠道是专长的独占渠道兼唯一直接渠道,候选按档配比加权抽取(机制事实源=[奇物](奇物.md)渠道轴交叉表与「池结构与抽取」节)。** 兑付时点固定:关卡节点地图先调战斗结算的关卡收束接口清空关卡域库存,再向本文宣布关卡结束——大奖励在这之后、下一关开始之前兑付,顺序不可换。非末关每关各兑付一次(现行三关下至多两次,末关不兑付)。
|
||||||
|
|
||||||
**三层奖励框架**:
|
**三层奖励框架**:
|
||||||
|
|
||||||
| 层 | 触发时刻 | 类型 | 内容 |
|
| 层 | 触发时刻 | 类型 | 内容 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 专长三选一 | 关卡完成(非末关) | 玩家选择型 | 候选=专长按档配比加权抽取 3 件呈现,玩家点选 1 件兑付,未选候选不落袋、本次选择不可反悔 |
|
| 专长三选一 | 关卡完成(非末关) | 玩家选择型 | 候选=专长按档配比加权抽取 3 件呈现(迭代 20 换代),玩家点选 1 件兑付,未选候选不落袋、本次选择不可反悔 |
|
||||||
| 钥石掉落 | Boss / 精英怪击杀 | 战斗掉落型 | Boss 掉 2–3 个钥石(首杀/复杀两档读表)、精英怪掉 1 个(精英怪未实装,设定登记预留) |
|
| 钥石掉落 | Boss / 精英怪击杀 | 战斗掉落型 | Boss 掉 2–3 个钥石(首杀/复杀两档读表)、精英怪掉 1 个(精英怪未实装,设定登记预留) |
|
||||||
| 部分回血 | 关卡完成(非末关) | 固定兑付型 | 回复生效上限 × 回血比例(provisional 20%,参考恢复节点量级),封顶上限、不回满;满血回 0 合法 |
|
| 部分回血 | 关卡完成(非末关) | 固定兑付型 | 回复生效上限 × 回血比例(provisional 20%,参考恢复节点量级),封顶上限、不回满;满血回 0 合法 |
|
||||||
|
|
||||||
兑付次序:部分回血先行(按当刻生命与上限结算),随后呈现三选一**选择停点**——零自动推进,必须玩家点选才兑付,重复兑付被拒(结算受理只算一次语义同族)。选择停点可中断:断点附随件扩「奖励选择态 + 件获取次数计数」,续玩已选件不静默丢失;**候选逐位一致系停点快照承载的实现现状、非验收义务**(不一致不影响玩法——2026-10-01 用户裁决,见「冒险断点」节)。
|
兑付次序:部分回血先行(按当刻生命与上限结算),随后呈现三选一**选择停点**——零自动推进,必须玩家点选才兑付,重复兑付被拒(结算受理只算一次语义同族)。选择停点可中断:断点附随件扩「奖励选择态 + 件获取次数计数」,续玩已选件不静默丢失;**候选逐位一致系停点快照承载的实现现状、非验收义务**(不一致不影响玩法——2026-10-01 用户裁决,见「冒险断点」节)。
|
||||||
|
|
||||||
**奖励节点三选一池(结构层——池机制事实源=[奇物](奇物.md)「池结构与抽取」节)**:池 = 四级令牌库(案D——普通打底/优秀·稀有做翼/传说惊喜位空集;曝光槽 = 三选一 2 格全池 + 1 格优秀档以上子池,令牌 = 出现次数上限、概率与已拿上限解耦;构成数字与抽取细节全读[奇物](奇物.md)与 `adventure.tres`,provisional 归[难度曲线与Boss](难度曲线与Boss.md)曲线调参批,本节零复制)。**池为冒险级单例**:关卡内奖励节点的三选一与商店货架共享同一令牌库(同库同摘牌),库存 = 剩余令牌数;消费三选一封闭随机流(主种子派生、[数据配置](../表现与支撑/数据配置.md)口径),同种子同操作序列同三选项可复放;**MC 策略 316-f**:自动游玩 1 级优先度=最稀有(rarest>rare>common)、2 级=最左。断点附随件承载池余库逐枚还原;兑付语义归[关卡节点地图](关卡节点地图.md)。
|
**奖励节点三选一池(结构层——池机制事实源=[奇物](奇物.md)「池结构与抽取」节,2026-10-11 迭代 20 案D 换代)**:池 = 四级令牌库(案D——普通打底/优秀·稀有做翼/传说惊喜位空集;曝光槽 = 三选一 2 格全池 + 1 格优秀档以上子池,令牌 = 出现次数上限、概率与已拿上限解耦;构成数字与抽取细节全读[奇物](奇物.md)与 `adventure.tres`,provisional 归[难度曲线与Boss](难度曲线与Boss.md)曲线调参批,本节零复制)。**池为冒险级单例**(迭代 10 追加批):关卡内奖励节点的三选一与商店货架共享同一令牌库(同库同摘牌),库存 = 剩余令牌数;消费三选一封闭随机流(主种子派生、[数据配置](../表现与支撑/数据配置.md)口径),同种子同操作序列同三选项可复放;**MC 策略 316-f**:自动游玩 1 级优先度=最稀有(rarest>rare>common)、2 级=最左。断点附随件承载池余库逐枚还原;兑付语义归[关卡节点地图](关卡节点地图.md)。
|
||||||
|
|
||||||
**秘宝件受同调位约束**(道具件已出池——三选一/奖励节点/战斗内渠道现行零道具件投放,下述渠道约束与替换交互无现役触发面,保留作渠道恢复时的契约口径;同调位读数现行事实源=attunement_growth.tres 谓词表实时求值):道具持有上限 = 同调位数。读数源 = 同调位里程碑谓词表 attunement_growth.tres 实时求值(0 起步、硬上限 3、增长 = 关卡完成次数 + Boss 击杀数)。获取渠道约束形态:三选一道具件超位触发**替换交互**(现有件与新件 N+1 选 N——丢任一原有件腾位收新,或放弃新件不获取;终态恒 ≤ 同调位);奖励节点与战斗内渠道超位**不授予**(候选拒绝 + 掉落沉没,逐行归因留痕)。
|
**秘宝件受同调位约束**(2026-10-09 注:道具件已随迭代 11 第①批 T7 出池——三选一/奖励节点/战斗内渠道现行零道具件投放,下述渠道约束与替换交互无现役触发面,保留作渠道恢复时的契约口径;同调位读数现行事实源=attunement_growth.tres 谓词表实时求值):道具持有上限 = 同调位数。读数源 = 同调位里程碑谓词表 attunement_growth.tres 实时求值(0 起步、硬上限 3、增长 = 通关次数 + Boss 击杀数——同调实施批 2026-10-03 落地,过渡读数源已顺带退役;原提案八拍板已退役)。获取渠道约束形态(迭代 10 过渡承载):三选一道具件超位触发**替换交互**(现有件与新件 N+1 选 N——丢任一原有件腾位收新,或放弃新件不获取;终态恒 ≤ 同调位);奖励节点与战斗内渠道超位**不授予**(候选拒绝 + 掉落沉没,逐行归因留痕)——停点渠道全覆盖的替换交互随同调实施批统一完成(原待办清单条目已随完成移除)。
|
||||||
|
|
||||||
末关完成不发三选一与部分回血:没有下一战可受益——只做冒险完成结算,末关 Boss 钥石照常入账。设计意图:清库之后才兑付、末关不兑付,都是从「奖励只朝下一战生效」这一条推出来的。
|
末关完成不发三选一与部分回血:没有下一战可受益——只做冒险完成结算,末关 Boss 钥石照常入账。设计意图:清库之后才兑付、末关不兑付,都是从「奖励只朝下一战生效」这一条推出来的。
|
||||||
|
|
||||||
**钥石掉落**:钥石渠道 = Boss 击杀掉落 + 精英怪击杀掉落(精英怪未实装,掉 1 个预留;「每通关一关固定入账 keystone_per_level」已退役)。Boss 掉落**逐杀实时入账**:行值读 meta.tres boss_keystone(首杀 3 / 复杀 2,provisional——拍板贴近「2–3 个」示例量级,保持首杀 ≥ 复杀结构);末关 Boss 击杀照常入账(钥石为战斗掉落,不受「末关不兑付」约束)。钥石为跨局持久资源,消费归[元进度](../跨局循环/元进度.md)(2026-09-17 拍板同一资源语义维持);产出细则与量级配比归元进度设计批。属性件/AP 件值锚与上调约束(换算率估算见调参日志,上调须重扫第二关通关率带)归[难度曲线与Boss](难度曲线与Boss.md)。
|
**钥石掉落(退役出大奖励)**:钥石渠道自本批起 = Boss 击杀掉落 + 精英怪击杀掉落(精英怪未实装,掉 1 个预留)——「每通关一关固定入账 keystone_per_level」退役。Boss 掉落**逐杀实时入账**:行值读 meta.tres boss_keystone(首杀 3 / 复杀 2,provisional——2026-09-30 拍板贴近「2–3 个」示例量级,保持首杀 ≥ 复杀结构);末关 Boss 击杀照常入账(钥石为战斗掉落,不受「末关不兑付」约束)。钥石为跨局持久资源,消费归[元进度](../跨局循环/元进度.md)(2026-09-17 拍板同一资源语义维持);产出细则与量级配比归元进度设计批。属性件/AP 件值锚与上调约束(换算率估算见调参日志,上调须重扫第二关通关率带)归[难度曲线与Boss](难度曲线与Boss.md)。
|
||||||
|
|
||||||
### 失败重开与主种子:倒下即终,重开即全新一轮
|
### 失败重开与主种子:倒下即终,重开即全新一轮
|
||||||
|
|
||||||
@@ -184,16 +184,16 @@ GP(显示名「GP」)是冒险内的一次性属性提升货币:战斗胜
|
|||||||
|
|
||||||
主动放弃按与失败同型结算:已兑付的三选一件与回血不追回、已到手的保留,摘要标记未打穿。放弃请求只在非战斗期受理,战斗进行中一律拒绝(战斗域单事务执行期间)。放弃的界面入口挂在[关卡节点地图](关卡节点地图.md)的选路覆盖层上——选路停点天然是非战斗期,按钮只在冒险模式开放(选路覆盖层只在冒险模式出现);战斗进行中没有选路停点,入口因此天然不可达,拒绝分支仅作防御兜底。
|
主动放弃按与失败同型结算:已兑付的三选一件与回血不追回、已到手的保留,摘要标记未打穿。放弃请求只在非战斗期受理,战斗进行中一律拒绝(战斗域单事务执行期间)。放弃的界面入口挂在[关卡节点地图](关卡节点地图.md)的选路覆盖层上——选路停点天然是非战斗期,按钮只在冒险模式开放(选路覆盖层只在冒险模式出现);战斗进行中没有选路停点,入口因此天然不可达,拒绝分支仅作防御兜底。
|
||||||
|
|
||||||
主种子(本文含义:冒险开始时注入的一个随机种子,本局全部随机性都派生自它)在冒险开始时注入恰一次。冒险内的雷图生成、奖励抽取、遭遇掷骰与 GP 掉落掷定(消费 gp_drop 封闭流)全部派生自它,冒险内不重置、不逐关播种。冒险的可复现域 = 主种子 + 全局取数计数器(统一随机流口径,语义权威归[数据配置](../表现与支撑/数据配置.md)),供复盘与快照(见[存档序列化](../表现与支撑/存档序列化.md))。重开抽到的种子与上一局相同是允许的(随机源范围小,撞种子不算错误),但生成新种子禁止复用玩法里的随机数。调试种子入口的三分判定:显式输入的合法整数优先;首局(无存档在档)空框恒用固定教学种子;非首局空框用引擎熵随机生成(不进玩法封闭流)。
|
主种子(本文含义:冒险开始时注入的一个随机种子,本局全部随机性都派生自它)在冒险开始时注入恰一次。冒险内的雷图生成、奖励抽取、遭遇掷骰与 GP 掉落掷定(消费 gp_drop 封闭流)全部派生自它,冒险内不重置、不逐关播种——早期切片"每关开局各自播种"是没有冒险层时的历史简化,已改写为全冒险单一种子。冒险的可复现域 = 主种子 + 全局取数计数器(统一随机流口径——2026-09-27 七流并一,语义权威归[数据配置](../表现与支撑/数据配置.md)),供复盘与快照(见[存档序列化](../表现与支撑/存档序列化.md))。重开抽到的种子与上一局相同是允许的(随机源范围小,撞种子不算错误),但生成新种子禁止复用玩法里的随机数。
|
||||||
|
|
||||||
### 冒险断点:中断可续玩的停点快照
|
### 冒险断点:中断可续玩的停点快照(迭代 8 卡①③)
|
||||||
|
|
||||||
冒险进行中随时关游戏走人(**中断**),下次启动可从最近停点继续——承载 = 存档 `breakpoint` 域(格式归[存档序列化](../表现与支撑/存档序列化.md),内容口径归本文)。
|
冒险进行中随时关游戏走人(**中断**),下次启动可从最近停点继续——承载 = 存档 `breakpoint` 域(格式归[存档序列化](../表现与支撑/存档序列化.md),内容口径归本文)。
|
||||||
|
|
||||||
- **停点粒度**:快照只挂选路停点(入口呈现/战斗胜利后/兑付确认后的选路态)——这是唯一可恢复停点形态。战斗进行中不写快照:中断恢复后**当场战斗从头打**,棋盘中局不入档。
|
- **停点粒度**:快照只挂选路停点(入口呈现/战斗胜利后/兑付确认后的选路态)——这是唯一可恢复停点形态。战斗进行中不写快照:中断恢复后**当场战斗从头打**,棋盘中局不入档。
|
||||||
- **七字段拍板面**:关卡序号 / 节点位 / 生命 / 本关加成区 / GP 钱包 / 商店已购档 / 已抽模板。附随件(续玩正确性必需):主种子 + 取数计数器(rng 快照契约回填——续玩从断点号位精确续接原随机时间线,已抽模板零重抽)、钥石累计(Boss 掉落逐杀入账的中途值,终局摘要不失真)、已到节点序(关卡画面图条重建)、秘宝库存(奖励节点已选件防静默丢失)、**奖励选择态**(三选一停点中断:已选件 / 同调位替换在途——续玩已选不丢失;候选一致性=快照现状非强求 feature,2026-10-01 用户裁决)、**件获取次数计数**(kind 维度派生账本——断点附随件与读数承载)、**令牌池余库**(bonus_deck 逐枚还原——TP0 扩列,池消耗即上限的续玩正确性承载;旧版断点缺键=满库重建防御口径,单版本周期)、**商店货架态**(当前货架三件 + 本次进店已购次数;离开店=空架合法态,货架续玩由确定性重放承载:重进店同种子同货架逐位)、**Y 刷新池余量**(attune_refresh_y——冒险周期池消耗余量随断点:续玩优先读断点、不自参数面整额重注入,堵「用完 Y 退菜单再续玩满血复活」可利用漏洞;旧断点缺键回退参数面=旧档行为零变化)。
|
- **七字段拍板面**:关卡序号 / 节点位 / 生命 / 本关加成区 / GP 钱包 / 商店已购档 / 已抽模板。附随件(续玩正确性必需,顺带登记):主种子 + 取数计数器(rng 快照契约回填——续玩从断点号位精确续接原随机时间线,已抽模板零重抽)、钥石累计(Boss 掉落逐杀入账的中途值,终局摘要不失真)、已到节点序(关卡画面图条重建)、秘宝库存(奖励节点已选件防静默丢失)、**奖励选择态**(三选一停点中断:已选件 / 同调位替换在途——续玩已选不丢失;候选一致性=快照现状非强求 feature,2026-10-01 用户裁决)、**件获取次数计数**(kind 维度派生账本——断点附随件与读数承载)、**令牌池余库**(bonus_deck 逐枚还原——TP0 扩列,池消耗即上限的续玩正确性承载;旧版断点缺键=满库重建防御口径,单版本周期)、**商店货架态**(当前货架三件 + 本次进店已购次数——P2 甲扩列随迭代 11 第②批;离开店=空架合法态,货架续玩由确定性重放承载:重进店同种子同货架逐位)、**Y 刷新池余量**(attune_refresh_y——冒险周期池消耗余量随断点:续玩优先读断点、不自参数面整额重注入,堵「用完 Y 退菜单再续玩满血复活」可利用漏洞;旧断点缺键回退参数面=旧档行为零变化。2026-10-13 缺陷修批)。
|
||||||
- **中断与退出两口径分离**(2026-09-29 用户裁决):中断(关游戏)= 留断点可续;**退出冒险**(放弃流程)= 失败同型结算 + **清除断点**——退出后「继续上局」不再出现。
|
- **中断与退出两口径分离**(2026-09-29 用户裁决):中断(关游戏)= 留断点可续;**退出冒险**(放弃流程)= 失败同型结算 + **清除断点**——退出后「继续上局」不再出现。
|
||||||
- **获得日记键**(gain_journal,断点 28 键):获得记录明细(三层结构归实现类头注——本域只登记断点面口径)随断点保存,回退策略 plain;旧档回退两态——旧断点缺日记键=汇总键直载并跳过比对(零迁移损失),日记在档=由日记推导汇总值与留存值比对,不符即报错中止(迁移正确性自检)。
|
- **获得日记键**(gain_journal,2026-10-27 迭代 39 拆件批扩列——断点 28 键,沿扩列不升版先例):获得记录明细(三层结构归架构文档「冒险域拆分」节主角账条目——本域只登记断点面口径)随断点保存,回退策略 plain;旧档回退两态——旧断点缺日记键=汇总键直载并跳过比对(零迁移损失),日记在档=由日记推导汇总值与留存值比对,不符即报错中止(迁移正确性自检)。
|
||||||
- **续玩**:自断点重建到最近停点(逐字段回填 + 随机流回填),停点处玩家重新选路。三结局(冒险成功/失败/放弃)一律清断点——断点只活在一个进行中的冒险上。
|
- **续玩**:自断点重建到最近停点(逐字段回填 + 随机流回填),停点处玩家重新选路。三结局(冒险成功/失败/放弃)一律清断点——断点只活在一个进行中的冒险上。
|
||||||
- 与测量面的关系:断点面只在注入存档承载的正式冒险路径生效;模拟/冒烟不注入 = 整面静默,MC 逐项比对零扰动。
|
- 与测量面的关系:断点面只在注入存档承载的正式冒险路径生效;模拟/冒烟不注入 = 整面静默,MC 逐项比对零扰动。
|
||||||
|
|
||||||
@@ -236,7 +236,7 @@ GP(显示名「GP」)是冒险内的一次性属性提升货币:战斗胜
|
|||||||
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 主角战斗入参覆盖值通道(本文供生命与上限);关卡收束接口由关卡节点地图收束点调用,本文零直调;战后生命终值与本战 GP 掉落(掉落额)经上报读回 |
|
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 主角战斗入参覆盖值通道(本文供生命与上限);关卡收束接口由关卡节点地图收束点调用,本文零直调;战后生命终值与本战 GP 掉落(掉落额)经上报读回 |
|
||||||
| 下游 | [关卡节点地图](关卡节点地图.md) | 接口契约四件套 + 收束点语义,本文是定义源,也是其文档的强制输入 |
|
| 下游 | [关卡节点地图](关卡节点地图.md) | 接口契约四件套 + 收束点语义,本文是定义源,也是其文档的强制输入 |
|
||||||
| 下游 | [元进度](../跨局循环/元进度.md) | 冒险摘要承载钥石入账合计(元进度是消费方);冒险开始参数面预留(未来跨局加成在此注入,MVP 空参数) |
|
| 下游 | [元进度](../跨局循环/元进度.md) | 冒险摘要承载钥石入账合计(元进度是消费方);冒险开始参数面预留(未来跨局加成在此注入,MVP 空参数) |
|
||||||
| 下游 | [存档序列化](../表现与支撑/存档序列化.md) | 快照契约域单位 = 冒险(主种子 + 随机流计数器);摘要含主种子供复盘;断点域 `breakpoint` 内容 owner = 本文(七字段+附随件,见「冒险断点」节) |
|
| 下游 | [存档序列化](../表现与支撑/存档序列化.md) | 快照契约域单位 = 冒险(主种子 + 随机流计数器);摘要含主种子供复盘;断点域 `breakpoint` 内容 owner = 本文(迭代 8 卡①——七字段+附随件,见「冒险断点」节) |
|
||||||
| 下游 | [HUD框架](../表现与支撑/HUD框架.md) | 冒险总结结算、关卡推进指示、放弃入口(非战斗期)的数据源 = 冒险摘要与状态投影;商店覆盖层与 GP 余额常驻读数的钱包数据源 |
|
| 下游 | [HUD框架](../表现与支撑/HUD框架.md) | 冒险总结结算、关卡推进指示、放弃入口(非战斗期)的数据源 = 冒险摘要与状态投影;商店覆盖层与 GP 余额常驻读数的钱包数据源 |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
@@ -266,17 +266,16 @@ GP(显示名「GP」)是冒险内的一次性属性提升货币:战斗胜
|
|||||||
| 恢复比例 | int [0,100],逐关行 | 见 level.tres rest_heal_pct(provisional) | 恢复点回复生效上限的百分比;随上限加成同步放大;100 = 恢复点变全满泉,0 = 死节点 |
|
| 恢复比例 | int [0,100],逐关行 | 见 level.tres rest_heal_pct(provisional) | 恢复点回复生效上限的百分比;随上限加成同步放大;100 = 恢复点变全满泉,0 = 死节点 |
|
||||||
| 上限提升 | int [0,999],冒险表逐件列 | adventure_table value_segment.curio_value_attack/max_hp/armor_{common,excellent}(provisional) | 三选一属性件各自兑付值;值锚与上调约束归难度曲线与Boss |
|
| 上限提升 | int [0,999],冒险表逐件列 | adventure_table value_segment.curio_value_attack/max_hp/armor_{common,excellent}(provisional) | 三选一属性件各自兑付值;值锚与上调约束归难度曲线与Boss |
|
||||||
| 三选一件值(其余) | int [0,999],冒险表 kind×tier 列族 | adventure_table value_segment.curio_value_*(GP 袋 / AP 件 / 恢复 / 刷新,provisional) | 令牌件值读表;道具件授予件数随秘宝件出池退役 |
|
| 三选一件值(其余) | int [0,999],冒险表 kind×tier 列族 | adventure_table value_segment.curio_value_*(GP 袋 / AP 件 / 恢复 / 刷新,provisional) | 令牌件值读表;道具件授予件数随秘宝件出池退役 |
|
||||||
| 三选一权重(已退役) | — | — | 令牌池档位配额即分布、无独立权重 knob |
|
| ~~三选一权重~~(v0.14 退役——令牌池档位配额即分布、无独立权重 knob) | — | — | E-S 加权洗牌不放回抽样权重随 TP0 令牌池换代退役 |
|
||||||
| 件次数上限 | —(已退役——池消耗即上限) | adventure_table quota_segment.curio_quota_*(TP0 令牌池——kind×tier 配额) | 达上限件先剔出牌库永不再现 → 池耗即枯竭 |
|
| 件次数上限 | ~~int [0,99],冒险表逐件键~~(v0.14 退役——池消耗即上限) | adventure_table quota_segment.curio_quota_*(TP0 令牌池——kind×tier 配额) | 达上限件先剔出牌库永不再现 → 池耗即枯竭 |
|
||||||
| 关卡完成回血比例 | int [0,100],冒险表单行全局 | adventure_table clear_heal_pct(provisional 20) | 关卡完成部分回血回复生效上限的百分比;封顶上限不回满 |
|
| 关卡完成回血比例 | int [0,100],冒险表单行全局 | adventure_table clear_heal_pct(provisional 20) | 关卡完成部分回血回复生效上限的百分比;封顶上限不回满 |
|
||||||
| 同调位过渡键(已退役) | — | 同调位读数源 = attunement_growth.tres 谓词表实时求值(slot_cap 3) | — |
|
| ~~同调位过渡键~~(已退役——迭代 11 第①批 T7,过渡键随表退役) | — | 同调位读数源 = attunement_growth.tres 谓词表实时求值(slot_cap 3) | 切换义务已随 2026-10-03 同调实施批清偿 |
|
||||||
| Boss 钥石掉落 | int [0,999],meta 表逐关行 | meta.tres boss_keystone 首杀 3 / 复杀 2(provisional) | 逐杀实时入账;精英怪掉 1 预留;消费方归元进度 |
|
| Boss 钥石掉落 | int [0,999],meta 表逐关行 | meta.tres boss_keystone 首杀 3 / 复杀 2(provisional) | 逐杀实时入账;精英怪掉 1 预留;消费方归元进度 |
|
||||||
| GP 经济参数 | 商店表逐行 | 见 shop.tres gp_drops / level_gp_bonus / pool_shelf / price_a / price_b(provisional,以 shop.tres 为准;legacy products / price_level_bonus 随对照模式保留) | 掉落均值与区间(普通/精英/Boss)、关级掉落加值、货架基价、A/b 价格因子;公式语义归本文,数值所有权归难度曲线与Boss曲线调参批。财富之道「聚」的掉落乘数与「散」的消费折价两参数归[天赋树](../跨局循环/天赋树.md)规则键参数表(长在节点行,商店表不持) |
|
| GP 经济参数 | 商店表逐行 | 见 shop.tres gp_drops / level_gp_bonus / pool_shelf / price_a / price_b(provisional,以 shop.tres 为准;legacy products / price_level_bonus 随对照模式保留) | 掉落均值与区间(普通/精英/Boss)、关级掉落加值、货架基价、A/b 价格因子;公式语义归本文,数值所有权归难度曲线与Boss曲线调参批 |
|
||||||
| 货架位数 | int [1, 6],商店表单行全局 | 见 shop.tres shelf_size(provisional) | 进店与每次购买后重抽时,货架同时陈列的商品件数;池余令牌不足时按余量陈列,空架合法 |
|
|
||||||
|
|
||||||
结构冻结(非调参项):序列线性无跳关、终点恒为 Boss(终点可多个、各在路径最深处)、倒下即冒险终、大奖励构成 = 关卡完成部分回血 + 专长三选一(按档配比加权抽取)、一冒险一主种子、收束点先清库后宣布的次序。
|
结构冻结(非调参项):序列线性无跳关、终点恒为 Boss(终点可多个、各在路径最深处)、倒下即冒险终、大奖励构成 = 关卡完成部分回血 + 专长三选一(按档配比加权抽取)、一冒险一主种子、收束点先清库后宣布的次序。
|
||||||
|
|
||||||
参数联动:恢复比例与关卡完成回血比例越厚关卡完成时越有余量(对冲杠杆语义归难度曲线与Boss);三选一属性件/AP 件抬高后续战斗强度,件值/权重/上限改值须按难度曲线与Boss的口径重扫关卡完成率带(回血比例 20% 系难度上压方向)。
|
参数联动:恢复比例与关卡完成回血比例越厚关卡完成时越有余量(对冲杠杆语义归难度曲线与Boss);三选一属性件/AP 件抬高后续战斗强度,件值/权重/上限改值须按难度曲线与Boss的口径重扫关卡完成率带(回血比例自「血回满」改 20% 系难度上压方向,带判定顺带呈报)。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,13 @@
|
|||||||
>
|
>
|
||||||
> **兑付频率(先看这条,它是三条渠道的共同前提)**:奇物**不是打一场战斗给一份**。关内的普通战斗节点打完了什么也不给;一关之内奇物**只兑付一次**,触发点是**关底 Boss 被击败**——而按 [冒险结构](冒险结构.md) 的定义,打掉关底 Boss 恰好就等于"通过这一关",这两件事是同一个时刻,不是一条链上的两步。
|
> **兑付频率(先看这条,它是三条渠道的共同前提)**:奇物**不是打一场战斗给一份**。关内的普通战斗节点打完了什么也不给;一关之内奇物**只兑付一次**,触发点是**关底 Boss 被击败**——而按 [冒险结构](冒险结构.md) 的定义,打掉关底 Boss 恰好就等于"通过这一关",这两件事是同一个时刻,不是一条链上的两步。
|
||||||
>
|
>
|
||||||
> 状态:**已实现**;现行为 v1.8。本文件是奇物的唯一定义文档。
|
> 状态:**已实现**(2026-10-04 双层 BD 实施批落地);现行为 v1.2。本文件是奇物的唯一定义文档。
|
||||||
>
|
>
|
||||||
> 数值纪律:本文件只写概念、取值域与指路;每件给多少、效果是什么一律不进正文,事实源是 `data/tables/feats.tres` 与 `data/tables/adventure.tres`。
|
> 数值纪律:本文件只写概念、取值域与指路;每件给多少、效果是什么一律不进正文,事实源是 `data/tables/feats.tres` 与 `data/tables/adventure.tres`。
|
||||||
|
|
||||||
## 专长(重设计·基础框架 v1)
|
## 专长(重设计·基础框架 v1)
|
||||||
|
|
||||||
> 本节是专长分类的现行事实源(2026-10-07 用户终审认同)。件表为设计声明——数值全 provisional 归调参批;命名全为代号,正式命名归用户。**新框架已实装:`feats.tres` 37 行=基础 27+迁入 2+规则豁免 1+换图系 7,行为与数据行 1:1。**
|
> 本节是专长分类的现行事实源(2026-10-07 用户终审认同写入文档)。件表为设计声明——数值全 provisional 归调参批;命名全为代号,正式命名归用户。**新框架已实装:`feats.tres` 30 行=基础 27+迁入 2+规则豁免 1,行为与数据行 1:1。**
|
||||||
|
|
||||||
### 设计原则
|
### 设计原则
|
||||||
|
|
||||||
@@ -29,9 +29,9 @@
|
|||||||
6. **基座先行**:流派先确定基座专长——通过改变资源来源、动作成本或频率、动作结算、动作之间的关系,让原本偶尔用于止损的动作成为可以持续使用的主要打法。后续专长再围绕这个新行为提供输出、生存或资源收益;泛用数值增长不能代替基座。
|
6. **基座先行**:流派先确定基座专长——通过改变资源来源、动作成本或频率、动作结算、动作之间的关系,让原本偶尔用于止损的动作成为可以持续使用的主要打法。后续专长再围绕这个新行为提供输出、生存或资源收益;泛用数值增长不能代替基座。
|
||||||
7. **行为改变检验**:基座必须能回答「拿到前后操作有何不同、新行为靠什么资源持续、后续专长为何依附这个新行为」。只是同一操作后的结算数字变大,不算形成新流派。
|
7. **行为改变检验**:基座必须能回答「拿到前后操作有何不同、新行为靠什么资源持续、后续专长为何依附这个新行为」。只是同一操作后的结算数字变大,不算形成新流派。
|
||||||
|
|
||||||
> **落行注记**:「每第 N 次 / 积满触发」的数据行条件写 **N−1**——效果引擎分发时 when 先于 do 读计数器现值(预评估),故「满 N 触发」落行写 N−1(例:地质学家「满 4 种」写 eq 3、封印匠「每第 3 次」写 mod_eq ref 2、双管镐「每第 2 次」写 mod_eq ref 1)。行为仍为每第 N 次准点触发,单元测试钉住;新件落行照此口径。
|
> **落行注记(迭代 20 反哺写入,2026-10-12 追认⑤)**:「每第 N 次 / 积满触发」的数据行条件写 **N−1**——效果引擎分发时 when 先于 do 读计数器现值(预评估),故「满 N 触发」落行写 N−1(例:地质学家「满 4 种」写 eq 3、封印匠「每第 3 次」写 mod_eq ref 2、双管镐「每第 2 次」写 mod_eq ref 1)。行为仍为每第 N 次准点触发,单元测试钉住;新件落行照此口径。
|
||||||
|
|
||||||
### 基础件表(26 件,五族 + 契约尖点)
|
### 基础件表(27 件,五族 + 跨族桥 + 契约尖点)
|
||||||
|
|
||||||
**开格系(6)**
|
**开格系(6)**
|
||||||
|
|
||||||
@@ -57,25 +57,29 @@
|
|||||||
|
|
||||||
| 代号 | on / when / do(声明要点) | 账 |
|
| 代号 | on / when / do(声明要点) | 账 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 疼痛记忆 | on 踩雷:攒 1 层;下一次攻击附加层值伤害,用后清零 | 雷罚转延迟输出;自爆流骨架 |
|
| 疼痛记忆 | on 踩雷:攒 1 层;下一次攻击附加层值伤害,用后清零 | 雷罚转延迟输出;自爆流骨架(「下场战斗」系笔误,2026-10-12 追认⑥改定) |
|
||||||
| 保险丝 | on 受伤:单次 ≥5 攒 1 点,2 点→护盾 1 层 | 大额伤害缓冲(扩签:单次伤害量) |
|
| 保险丝 | on 受伤:单次 ≥5 攒 1 点,2 点→护盾 1 层 | 大额伤害缓冲(扩签:单次伤害量) |
|
||||||
| 见血开窍 | on 踩雷:揭示 1 格 | 错误资源化;零新增代价 |
|
| 见血开窍 | on 踩雷:揭示 1 格 | 错误资源化;零新增代价 |
|
||||||
| 陷阱本能 | on 踩雷:本轮攻击 +N(当轮即效、不结转,走攻击面板乘区) | 踩雷当场变火力;与战斗系同乘区互相喂 |
|
| 陷阱本能 | on 踩雷:本轮攻击 +N(当轮即效、不结转,走攻击面板乘区) | 踩雷当场变火力;与战斗系同乘区互相喂(2026-10-11 用户裁走面板) |
|
||||||
| 连环陷阱 | on 同轮第 2 颗及以后的踩雷:每颗额外 +1 层(疼痛记忆同账) | 纯加成件、本身零收益——与疼痛记忆 combo 涌现(扩签:本轮踩雷数计数器) |
|
| 连环陷阱 | on 同轮第 2 颗及以后的踩雷:每颗额外 +1 层(疼痛记忆同账) | 纯加成件、本身零收益——与疼痛记忆 combo 涌现(扩签:本轮踩雷数计数器) |
|
||||||
| 陷阱爆发 | on 踩雷:全体存活敌受 雷伤×倍率 直伤 | 角色与怪物互相吃伤害;倍率 >1 系结构锚(引爆有代价、回报须更高),数值归调参批(扩签:雷罚伤害量) |
|
| 陷阱爆发 | on 踩雷:全体存活敌受 雷伤×倍率 直伤 | 角色与怪物互相吃伤害;倍率 >1 系结构锚(引爆有代价、回报须更高),数值归调参批(扩签:雷罚伤害量) |
|
||||||
| 血蜜 | on 踩雷:回复 N 生命 | 引爆仍然净亏血、只是亏得慢;比值 <1 系结构锚,N 归调参批 |
|
| 血蜜 | on 踩雷:回复 N 生命 | 引爆仍然净亏血、只是亏得慢;比值 <1 系结构锚,N 归调参批 |
|
||||||
| 石肤 | on 受伤:AC +1(本场累计,上限 M) | 受击成长型护甲——越挨打越硬;恒定减伤形态被否(用户裁「太硬霸」),M 归调参批 |
|
| 石肤 | on 受伤:AC +1(本场累计,上限 M) | 受击成长型护甲——越挨打越硬;恒定减伤形态被否(用户裁「太硬霸」),M 归调参批 |
|
||||||
| 背水 | when 生命 ≤50%:受伤额外 −N | 风险联动减伤——低血不再是纯劣势;自爆流刀口舔血兜底(扩签:生命比例〔条件事实——实现前置需求,待办清单在册〕) |
|
| 背水 | when 生命 ≤50%:受伤额外 −N | 风险联动减伤——低血不再是纯劣势;自爆流刀口舔血兜底(扩签:生命比例〔条件事实——实现前置需求,待办清单在册〕) |
|
||||||
|
|
||||||
**踩雷转化对账锚(自爆流 kill-switch,2026-10-11 用户裁)**:踩雷的净血账期望必须为负——雷伤 > 血蜜回复 + 其余转化件的血当量;对账归调参批,两轮数值迭代压不住则砍血蜜。防「见雷就踩」退化(喂雷流教训同源);主动/误踩不判定(用户裁:不预判玩家意图,拿件自选收益最高的操作)。
|
**踩雷转化对账锚(自爆流 kill-switch,2026-10-11 用户裁顺带登记)**:踩雷的净血账期望必须为负——雷伤 > 血蜜回复 + 其余转化件的血当量;对账归调参批,两轮数值迭代压不住则砍血蜜。防「见雷就踩」退化(喂雷流 R5 甲教训同源);主动/误踩不判定(用户裁:不预判玩家意图,拿件自选收益最高的操作)。
|
||||||
|
|
||||||
**跨族桥退役(2026-11-07 用户裁)**:破封一击(on 挖开有封印印记的危险格:额外 +1 层)退役进[道具退役素材库](../../../content-archive/道具退役素材库.md)表五——「封印受理即揭示、封印格拒绝挖掘」口径换代后「挖开封印格」路径不存在,专长永远无法触发;其触发事实词「被挖格当时有封印印记」随件自引擎除名。跨族桥位现空缺。
|
**跨族桥(封印系 × 踩雷系)(1)**
|
||||||
|
|
||||||
|
| 代号 | on / when / do(声明要点) | 账 |
|
||||||
|
|---|---|---|
|
||||||
|
| 破封一击 | on 挖开有封印印记的危险格:额外 +1 层(疼痛记忆同账) | 印记=标定引信、挖=引爆——推理定位的显式回报;挂棋盘事实(挖开格当时有封印印记)非玩家意图判定(扩签:被挖格当时有封印印记) |
|
||||||
|
|
||||||
**节奏系(3)**
|
**节奏系(3)**
|
||||||
|
|
||||||
| 代号 | on / when / do(声明要点) | 账 |
|
| 代号 | on / when / do(声明要点) | 账 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 弃图兑换 | on 停手:剩余 AP ≥3 → 剩余 AP 1:1 折为停手后首次攻击附加伤害(全额、用后清零;多攻击不拆分) | 资源转换件;单向无环(扩签:停手挂点)(停手后紧跟战斗段序) |
|
| 弃图兑换 | on 停手:剩余 AP ≥3 → 剩余 AP 1:1 折为停手后首次攻击附加伤害(全额、用后清零;多攻击不拆分) | 资源转换件;单向无环(扩签:停手挂点)(落法 2026-10-12 追认⑧回写——停手后紧跟战斗段序,「下轮」前移为首战首攻) |
|
||||||
| 一滴不剩 | on 轮始:上轮 AP 耗尽 → +1 AP | 奖励节奏打满;憋 AP 没份 |
|
| 一滴不剩 | on 轮始:上轮 AP 耗尽 → +1 AP | 奖励节奏打满;憋 AP 没份 |
|
||||||
| 收盘 | on 轮末:本轮开格 ≥8 → +1 GP | 勤奋奖(扩签:本轮开格数) |
|
| 收盘 | on 轮末:本轮开格 ≥8 → +1 GP | 勤奋奖(扩签:本轮开格数) |
|
||||||
|
|
||||||
@@ -91,31 +95,31 @@
|
|||||||
|
|
||||||
| 代号 | 契约 | 账 |
|
| 代号 | 契约 | 账 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 血税 | 本局:踩雷 −2 最大生命;标中 +1 攻击(**均下一战起生效**——战末汇入冒险加算区) | 双向都痛都爽,一句话讲得清;双向同账、本局累积、冒险收束清零。生命上限/攻击系属战界重建属性,即时改会被重建冲掉,故滞后一战兑付 |
|
| 血税 | 本局:踩雷 −2 最大生命;标中 +1 攻击(**均下一战起生效**——战末汇入冒险加算区) | 双向都痛都爽,一句话讲得清;双向同账、本局累积、冒险收束清零。生命上限/攻击系属战界重建属性,即时改会被重建冲掉,故滞后一战兑付(2026-10-12 追认⑨回写;卡面 desc 同步补「下一战起生效」) |
|
||||||
|
|
||||||
### 换图系(7 件,已实装 `feats.tres`,稀有度 14/13/10/0、每件持有上限 1)
|
### 换图系(7 件,设计定稿,待实现)
|
||||||
|
|
||||||
换图系把「弃图刷新」从坏图逃生改成主动构筑行为。两件基座分别解决 RAP 的来源与价格;后续专长让成功刷新产生输出、生存或 GP 资源收益。七件不要求一次拿齐,不设强制先拿基座、集件标签或集件奖励。
|
换图系把「弃图刷新」从坏图逃生改成主动构筑行为。两件基座分别解决 RAP 的来源与价格;后续专长让成功刷新产生输出、生存或资源收益。七件不要求一次拿齐,不设强制先拿基座、集件标签或集件奖励。
|
||||||
|
|
||||||
| 层 | 代号 | 规则 | 行为职责 |
|
| 层 | 代号 | 规则 | 行为职责 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 基座 | 矿脉储能 | 每次付费挖格被受理后,额外获得 RAP;安全格与危险格同口径 | 持续挖图也能准备刷新,不再必须少挖停手 |
|
| 基座 | 掘进储能 | 每次付费挖格后额外获得 RAP;安全格与危险格同口径 | 持续挖图也能准备刷新,不再必须少挖停手 |
|
||||||
| 基座 | 省力周转 | 弃图刷新的 RAP 成本减半 | 同一份储备支持更多刷新 |
|
| 基座 | 折价换图 | 弃图刷新的 RAP 成本减半 | 同一份储备支持更多刷新 |
|
||||||
| 输出 | 崩壁冲击 | 成功刷新后,在本轮战斗段末对全体存活敌人造成一次固定伤害 | 刷新成为直接进攻行为 |
|
| 输出 | 弃图轰击 | 成功刷新后,在本轮战斗段对全体存活敌人造成一次伤害 | 刷新成为直接进攻行为 |
|
||||||
| 输出 | 蓄力周转 | 成功刷新攒层,最多 3 层;本轮下一次主角攻击消费全部层数后清零,战斗结束不跨战保留 | 连续换图蓄成一次单点爆发 |
|
| 输出 | 换图蓄势 | 成功刷新攒层,层数有上限;下一次攻击附加全部层数对应的伤害后清零,战斗结束清空 | 连续换图蓄成一次单点爆发 |
|
||||||
| 生存 | 石层缓冲 | 本轮至少成功刷新一次后,主角每次受到伤害固定减少 2 点;不叠加 | 刷新形成当轮全局防御姿态 |
|
| 生存 | 换图庇护 | 成功刷新后,在本轮授予段获得护盾 | 用刷新预防后续伤害 |
|
||||||
| 生存 | 坑道小憩 | 每次成功刷新累计 1 点恢复,最多 3 点;本轮授予段合计回复生命,封顶生命上限 | 放弃当前图换取恢复 |
|
| 生存 | 弃图休整 | 成功刷新后,在本轮授予段回复生命,封顶生命上限 | 放弃当前图换取恢复 |
|
||||||
| 资源 | 矿道红利 | 每次成功刷新固定获得 1 GP | 刷新动作自身带少量GP收益 |
|
| 资源 | 弃图回收 | 成功刷新后,按旧图探索进度在本轮授予段回收清图奖励 | 先探索再主动弃图变现 |
|
||||||
|
|
||||||
共同规则:
|
共同规则:
|
||||||
|
|
||||||
- **双基座叠加**:矿脉储能与省力周转可以同时持有,产 RAP 与成本减半分别生效;每轮刷新次数上限继续限频,不设互斥规则。
|
- **双基座叠加**:掘进储能与折价换图可以同时持有,产 RAP 与成本减半分别生效;每轮刷新次数上限继续限频,不设互斥规则。
|
||||||
- **成功才触发**:后续五件只认成功换图;刷新被拒绝时不产生事实,也不给输出、生存或资源收益。同一轮多次成功刷新按发生顺序逐次登记。
|
- **成功才触发**:后续五件只认成功换图;刷新被拒绝时不产生效果。同一轮多次成功刷新按发生顺序逐次登记。
|
||||||
- **轮末兑付**:刷新不新增结算段。崩壁冲击走本轮战斗段末结账,石层缓冲在每次主角受伤时消费,坑道小憩与矿道红利走本轮授予段兑付。
|
- **轮末兑付**:刷新不新增结算段。群伤、护盾、回血与回收按[战斗结算](../战斗循环/战斗结算.md)的既有段序兑付,刷新瞬间不直接改这些战斗结果。
|
||||||
- **全局受伤面**:石层缓冲覆盖敌方攻击、危险格、错误封印资源格与地形造成的主角伤害;临时生命值不在本流派设计范围内。
|
- **回收看旧图**:弃图回收读取被放弃旧图的探索进度,不把旧图或新图判为清图;具体口径归[地图战斗资源](../战斗循环/地图战斗资源.md)。
|
||||||
- **基线不变**:没有这些专长时,RAP 来源、刷新成本、清图奖励与伤害结果保持原规则。数值与稀有度归 `feats.tres`(已落表——稀有度档 14/13/10/0、每件持有上限 1;数值全 provisional 归调参批)。
|
- **基线不变**:没有这些专长时,RAP 来源、刷新成本、清图奖励与刷新结果保持原规则。数值与稀有度归 `feats.tres`,落表前本节只作设计声明。
|
||||||
|
|
||||||
### 迁入登记(秘宝域迁出件;已并入件表)
|
### 迁入登记(秘宝域迁出件;实装批落地后并入件表)
|
||||||
|
|
||||||
| 代号沿用 | 目标族 | on / when / do 要点 | 备注 |
|
| 代号沿用 | 目标族 | on / when / do 要点 | 备注 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
@@ -124,21 +128,21 @@
|
|||||||
|
|
||||||
惊巢反制=退役进素材库(不迁入)。
|
惊巢反制=退役进素材库(不迁入)。
|
||||||
|
|
||||||
**资源类迁出件(2026-10-18 用户裁)**:完美保险自资源类迁入专长——理由:它给的是**规则豁免**而非可调动的余量(§1.1 判据「给规则的是专长」),效果=本场首次封印落空不计入完美封印判定。专长行已落表:`feats.tres` 单行 `when counter(insurance_used) lt 1` 承载「本场首次」,效果类型 `forgive_seal_miss` 随引擎扩签;稀有档配额现行值读 `data/tables/adventure.tres`。
|
**资源类迁出件(2026-10-18 用户裁)**:完美保险自资源类迁入专长——理由:它给的是**规则豁免**而非可调动的余量(§1.1 判据「给规则的是专长」),效果=本场首次封印落空不计入完美封印判定。旧「资源类成员」归类系 2026-10-08 框架批写入、无用户裁断支撑,随本次改判注销。专长行已于迭代 31 卡② 落表:`feats.tres` 单行 `when counter(insurance_used) lt 1` 承载「本场首次」,效果类型 `forgive_seal_miss` 随引擎扩签;稀有档配额随净删重裁下调,现行值读 `data/tables/adventure.tres`。
|
||||||
|
|
||||||
### 扩签登记
|
### 扩签登记(迭代 20 实装已承载——2026-10-12 追认④写入文档换代)
|
||||||
|
|
||||||
- **落地结果**:事实候选 10 条中 6 条落事实词位(边缘格判定/空白连锁判定/单次伤害量/被挖格当时有封印印记/雷罚伤害量/生命比例),4 条改道 adventure 域计数器(类型集合计数器/本轮挖格花费/本轮开格数/本轮踩雷数计数器——跨事件累积量走计数器+value_event 比较,不占 fact 词位);停手事件已落(dig_stop);实现补位=battle_won 事件(战地包扎所需,登记未列)、mod_eq 算子(周期触发)、hp_ratio(百分比 int 口径)等 3 项事实、新效果类型 7 项。
|
- **落地结果**:事实候选 10 条中 6 条落事实词位(边缘格判定/空白连锁判定/单次伤害量/被挖格当时有封印印记/雷罚伤害量/生命比例),4 条改道 adventure 域计数器(类型集合计数器/本轮挖格花费/本轮开格数/本轮踩雷数计数器——跨事件累积量走计数器+value_event 比较,不占 fact 词位,T0 定架构);停手事件已落(dig_stop);实现随裁补位=battle_won 事件(战地包扎所需,登记未列)、mod_eq 算子(周期触发)、hp_ratio(百分比 int 口径)等 3 项事实、新效果类型 7 项。
|
||||||
- **连带**:净化工兵退役,rewrite_board 效果类型自引擎除名(扩签「暂缓:清图事件」不受影响,继续挂起)。
|
- **连带**:净化工兵退役,rewrite_board 效果类型自引擎除名(扩签「暂缓:清图事件」不受影响,继续挂起)。
|
||||||
- **暂缓**:清图事件(随清图奖励题)。
|
- **暂缓**:清图事件(随清图奖励题)。
|
||||||
|
|
||||||
### 老 27 件处置
|
### 老 27 件处置
|
||||||
|
|
||||||
老 27 件已全数退役,名单见[道具退役素材库](../../../content-archive/道具退役素材库.md)表二;`feats.tres` 在役行=重设计件表。任何一件要进新体系须重新过准入校验、分界尺与定义卡三关,不默认继承。
|
老 27 件已全数退役,名单见[道具退役素材库](../../../content-archive/道具退役素材库.md)表二;`feats.tres` 在役行随重设计实装批删除替换。任何一件要进新体系须重新过准入校验、分界尺与定义卡三关,不默认继承。
|
||||||
|
|
||||||
## 补给(重设计·基础框架 v1)
|
## 补给(重设计·基础框架 v1)
|
||||||
|
|
||||||
> 本节是补给分类的现行事实源。补给成员 = **转换源**:不是系统资源本身,是「到手即结算成一笔系统数值的凭证」——凭证加完消尽,被写入的系统资源各有自己的寿命档位(五档轴见[核心循环](../../01-核心循环.md)「生命周期轴」节)。判据句与归类方法见 §1.3/§1.4。**新凭证已落表;2026-10-18 用户裁削两件后,现行成员=新 3+留任 2(同调电池删除、完美保险归专长——见 git 提交史 v3.18)。**
|
> 本节是补给分类的现行事实源。补给成员 = **转换源**:不是系统资源本身,是「到手即结算成一笔系统数值的凭证」——凭证加完消尽,被写入的系统资源各有自己的寿命档位(五档轴见[核心循环](../../01-核心循环.md)「生命周期轴」节)。判据句与归类方法见 §1.3/§1.4。**新凭证已随迭代 20 专长实装批落表(2026-10-11);2026-10-18 用户裁削两件后,现行成员=新 3+留任 2(同调电池删除、完美保险归专长——见 git 提交史 v3.18)。**
|
||||||
|
|
||||||
### 凭证件表(新 3 + 留任 2;代号制命名归用户;稀有度档、配额与面值数值归调参批)
|
### 凭证件表(新 3 + 留任 2;代号制命名归用户;稀有度档、配额与面值数值归调参批)
|
||||||
|
|
||||||
@@ -146,9 +150,9 @@
|
|||||||
|
|
||||||
| 代号 | 写进哪笔系统资源(寿命档) | 一句话 | 备注 |
|
| 代号 | 写进哪笔系统资源(寿命档) | 一句话 | 备注 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 刷新券 | 刷新存量账(冒险级) | 存量刷新次数 +1 | 语义=存量加仓(已裁);实现依赖刷新件写错账修复 |
|
| 刷新券 | 刷新存量账(冒险级) | 存量刷新次数 +1 | 语义=存量加仓(已裁);实现依赖刷新件写错账修复(同批) |
|
||||||
| 储备金袋 | 储备池 RAP(冒险级) | 储备池 +N | 给停手/刷新雷图经济加燃料;整局冒险保留、冒险收束清零 |
|
| 储备金袋 | 储备池 RAP(节点级) | 储备池 +N | 给停手/刷新雷图经济加燃料;战斗结束清零系既有语义,兼容 |
|
||||||
| 时沙 | 下一战首轮 AP 队列(拾取挂账,兑付即消尽) | 下一战首轮 AP +2 | 一次性节奏件;与「AP 上限+1」(属性轴)不撞——一个改池子、一个改上限(落法=AP 加成既有通道;拾取时战斗在途同样等下一战首轮) |
|
| 时沙 | 下一战首轮 AP 队列(拾取挂账,兑付即消尽) | 下一战首轮 AP +2 | 一次性节奏件;与「AP 上限+1」(属性轴)不撞——一个改池子、一个改上限(落法=AP 加成既有通道,2026-10-12 追认⑦回写;拾取时战斗在途同样等下一战首轮) |
|
||||||
| 小 GP 袋 | GP 钱包(冒险级) | (留任)+20 / +50 | 计价物不自售维持(不进商店) |
|
| 小 GP 袋 | GP 钱包(冒险级) | (留任)+20 / +50 | 计价物不自售维持(不进商店) |
|
||||||
| 应急口粮 | 生命账(冒险级) | (留任)回复 +6 | 在商店内(默认原则) |
|
| 应急口粮 | 生命账(冒险级) | (留任)回复 +6 | 在商店内(默认原则) |
|
||||||
|
|
||||||
@@ -160,7 +164,7 @@
|
|||||||
> 令牌牌库(奖励节点与商店共用)的组织与三选一抽取规则(2026-10-07 用户裁案D——归档打底做翼 + 曝光槽)。
|
> 令牌牌库(奖励节点与商店共用)的组织与三选一抽取规则(2026-10-07 用户裁案D——归档打底做翼 + 曝光槽)。
|
||||||
|
|
||||||
- **令牌=出现次数上限**:每个成员在牌库里有 N 张令牌——拿了消耗、**没拿回池**(刷新重抽同样不消耗),所以「最多被拿 N 次」= 池里放 N 张,天然成立,不另设计数器;「只刷出、没拿」不计次数(现行 TP0 语义沿用)。
|
- **令牌=出现次数上限**:每个成员在牌库里有 N 张令牌——拿了消耗、**没拿回池**(刷新重抽同样不消耗),所以「最多被拿 N 次」= 池里放 N 张,天然成立,不另设计数器;「只刷出、没拿」不计次数(现行 TP0 语义沿用)。
|
||||||
- **概率与上限解耦**(设计约束,新内容必检):每个成员标注**两个独立属性**——概率位(档+权重/令牌数)与已拿上限(cap;拿了才计、刷出不计。cap 必填——成员行缺 cap 声明=数据错误、拒绝加载,取值域 [1,99];2026-11-02 用户裁「不要任何缺省值」总判据)。概率不决定上限、上限不影响概率。
|
- **概率与上限解耦**(设计约束,新内容必检):每个成员标注**两个独立属性**——概率位(档+权重/令牌数)与已拿上限(cap;拿了才计、刷出不计)。概率不决定上限、上限不影响概率。
|
||||||
- **已知耦合问题(实装批选型注意)**:现行令牌模型里「N 张令牌」同时承担概率与上限两个职责,无法独立设定(例:档概率需 3 张 vs 单件限拿 2 次——3 张压不住上限、2 张保不住概率)。实现路径候选三案:①抽象权重表+独立已拿计数器(解耦彻底;代价=推翻 TP0 实体牌库模型、「池耗即上限」语义改写)②令牌池+提前退役计数器(保留模型;代价=名义概率与有效概率两层、对账复杂化)③维持耦合(设计自我设限——用户已否)。选型归实装批;影响面=MC 对账模型与断点存档(已拿计数器须进断点附随件)。
|
- **已知耦合问题(实装批选型注意)**:现行令牌模型里「N 张令牌」同时承担概率与上限两个职责,无法独立设定(例:档概率需 3 张 vs 单件限拿 2 次——3 张压不住上限、2 张保不住概率)。实现路径候选三案:①抽象权重表+独立已拿计数器(解耦彻底;代价=推翻 TP0 实体牌库模型、「池耗即上限」语义改写)②令牌池+提前退役计数器(保留模型;代价=名义概率与有效概率两层、对账复杂化)③维持耦合(设计自我设限——用户已否)。选型归实装批;影响面=MC 对账模型与断点存档(已拿计数器须进断点附随件)。
|
||||||
- **内容归档(打底+做翼)**:普通档=属性件+小额钱(每拿都有底的面粉);优秀/稀有档=功能凭证与改手感件(期待位);传说档=惊喜位。归档按决策影响力、不按数值大小;面值数值归调参批。
|
- **内容归档(打底+做翼)**:普通档=属性件+小额钱(每拿都有底的面粉);优秀/稀有档=功能凭证与改手感件(期待位);传说档=惊喜位。归档按决策影响力、不按数值大小;面值数值归调参批。
|
||||||
- **曝光槽**:每次三选一呈现 = **2 格按全池抽 + 1 格按「优秀档以上」子池抽**;高档子池空 → 该格回退按全池抽(池空直通同族兜底)。格数与档配比归调参批。
|
- **曝光槽**:每次三选一呈现 = **2 格按全池抽 + 1 格按「优秀档以上」子池抽**;高档子池空 → 该格回退按全池抽(池空直通同族兜底)。格数与档配比归调参批。
|
||||||
@@ -238,7 +242,7 @@
|
|||||||
| AC(护甲) | 抬高角色的护甲 |
|
| AC(护甲) | 抬高角色的护甲 |
|
||||||
| 攻击 | 抬高角色的攻击 |
|
| 攻击 | 抬高角色的攻击 |
|
||||||
|
|
||||||
三项都直接进冒险加算区,跨关携带且关间不清零。这一类是封闭的:成员增减走文档修订。**行动点上限**自资源分类迁入本轴(2026-10-09 用户令)即一例;落地前现役代码按三项运行。
|
三项都直接进冒险加算区,跨关携带且关间不清零。这一类是封闭的:成员增减走文档修订。**行动点上限**自资源分类迁入本轴(2026-10-09 用户令)即一例,随实装批落表;落地前现役代码按三项运行。
|
||||||
|
|
||||||
#### 1.3 补给:转换源
|
#### 1.3 补给:转换源
|
||||||
|
|
||||||
@@ -248,10 +252,10 @@
|
|||||||
|
|
||||||
**判据句**:补给成员是**转换源**——不是系统资源本身,而是「到手即结算成一笔系统数值的**凭证**」,凭证加完消尽;被写入的系统资源(GP 钱包/刷新存量/储备池/时沙暂记)各有自己的寿命档位。拿不准一项该归哪类时问三句:它进不进角色自己的属性数值(进→属性值提升);它改不改规则(改→专长);都不是、而是给某一笔系统资源做一次性加仓的,归补给。
|
**判据句**:补给成员是**转换源**——不是系统资源本身,而是「到手即结算成一笔系统数值的**凭证**」,凭证加完消尽;被写入的系统资源(GP 钱包/刷新存量/储备池/时沙暂记)各有自己的寿命档位。拿不准一项该归哪类时问三句:它进不进角色自己的属性数值(进→属性值提升);它改不改规则(改→专长);都不是、而是给某一笔系统资源做一次性加仓的,归补给。
|
||||||
|
|
||||||
**补给类内部的异质性(统一表述)**:凭证全部即时消尽——不存在「持有凭证」这种状态;异质性不在凭证上,而在**被写入的系统资源的寿命**上:GP 钱包 / 生命 / 刷新存量 / 储备池 = 冒险级,时沙暂记 = 至下一战首轮兑付(系统资源清单对齐「凭证件表(新 3+留任 2)」节;「AP 上限」已归属性值提升轴,见 1.2)。
|
**补给类内部的异质性(统一表述)**:凭证全部即时消尽——不存在「持有凭证」这种状态;异质性不在凭证上,而在**被写入的系统资源的寿命**上:GP 钱包 / 生命 / 刷新存量 = 冒险级,储备池 = 节点级,时沙暂记 = 至下一战首轮兑付(系统资源清单对齐「凭证件表(新 3+留任 2)」节;「AP 上限」已归属性值提升轴,见 1.2)。
|
||||||
|
|
||||||
- 「秘宝充能」「完美资格」两笔已自本类注销——充能账本本身仍为秘宝基础设施保留(主动件充能每冒险重置),奇物侧不再写它的入口。
|
- 原在册的「秘宝充能」「完美资格」两笔随 2026-10-18 两件裁削注销——充能账本本身仍为秘宝基础设施保留(迭代 11,主动件充能每冒险重置),本次只删奇物侧写它的入口。
|
||||||
- 完美资格的豁免走**订阅式自有累加账**:授予段在 `seal_missed` 命中时累加豁免数,判定取「误标总数 − 豁免数」得有效数;**不改写误标账本身、不拦截事件**。
|
- 完美资格的豁免走**订阅式自有累加账**:授予段在 `seal_missed` 命中时累加豁免数,判定取「误标总数 − 豁免数」得有效数;**不改写误标账本身、不拦截事件**(迭代 31 卡② 契约 2/3)。
|
||||||
- 登记此节防止把凭证当成会持续生效的东西去结算。
|
- 登记此节防止把凭证当成会持续生效的东西去结算。
|
||||||
|
|
||||||
#### 1.4 分类判据
|
#### 1.4 分类判据
|
||||||
@@ -262,7 +266,9 @@
|
|||||||
|
|
||||||
#### 1.5 命名出处
|
#### 1.5 命名出处
|
||||||
|
|
||||||
专长与属性值提升都取自 DND 规则书的既有名词:专长对应 Feat,属性值提升对应 Ability Score Improvement(ASI)。**顶层「奇物」取自 DND 魔法物品的九分类之一 Wondrous Item——官方中文译名就是「奇物」,是那个专门装不好归类但有奇效的东西的兜底杂类。** 用它做顶层名的理由:地下城里挖到的、商店里能买到的、能把你变强的、又确实贵重的东西,在 DND 里没有别的总称,只有 Treasure 和 Wondrous Item 两个候选,而 Treasure 偏向财物,装不下专长这种你会了件以前不会的事。奇物天生是杂类兜底,正好对应本概念下三个互不相干的分类(专长改规则 / 属性值提升改数字 / 补给给余量)——它们本来就没有共同点,能拢在一起的只有一个不好归类但有用的名字。**三个分类的专名不带「类」字后缀**——「类」字后缀只是描述不是专名;不带后缀三个词各自都能独立成词、与 DND 官方中文一致,理由与逐条依据见 1.6 节。 玩家可见文案只写效果,不出现任何分类名。
|
专长与属性值提升都取自 DND 规则书的既有名词:专长对应 Feat,属性值提升对应 Ability Score Improvement(ASI)。**顶层「奇物」取自 DND 魔法物品的九分类之一 Wondrous Item——官方中文译名就是「奇物」,是那个专门装不好归类但有奇效的东西的兜底杂类。** 用它做顶层名的理由:地下城里挖到的、商店里能买到的、能把你变强的、又确实贵重的东西,在 DND 里没有别的总称,只有 Treasure 和 Wondrous Item 两个候选,而 Treasure 偏向财物,装不下专长这种你会了件以前不会的事。奇物天生是杂类兜底,正好对应本概念下三个互不相干的分类(专长改规则 / 属性值提升改数字 / 资源给余量)——它们本来就没有共同点,能拢在一起的只有一个不好归类但有用的名字。**资源取"资源"这个常用词**(用户 2026-10-05 定)——刷新券、储备金袋、时沙这类凭证与小 GP 袋、应急口粮都是可以调动、可以花掉的余量。它确实偏泛(能力资源、财富资源都叫资源),所以这一类的判据句必须写死:**给的是可消耗或可重掷的余量,不是角色基础属性的永久抬升**——这一句是把"资源"从泛用词收回到本类定义里的唯一凭据,不能省。**三个分类的专名在 v2.7 去掉了「类」字后缀**——此前写作「机制类 / 属性提升类 / 资源类」,那是描述不是专名;去掉后缀后三个词各自都能独立成词、与 DND 官方中文一致,理由与逐条依据见 1.6 节。 玩家可见文案只写效果,不出现任何分类名。
|
||||||
|
|
||||||
|
**2026-10-19 第三类改名「补给」**——「系统资源」已定为 GP/钥石/行动点等数值容器的规范名(定义见[核心循环](../../01-核心循环.md)「系统资源」节),类名再叫「资源」会把"给系统资源加一笔的件"误读成"系统资源本身";改名后本类的判据句以 §1.3 为准,本段保留的是命名沿革。
|
||||||
|
|
||||||
### 1.6 三层结构与命名(本概念的完整层级)
|
### 1.6 三层结构与命名(本概念的完整层级)
|
||||||
|
|
||||||
@@ -277,7 +283,7 @@
|
|||||||
**两层是两件事,别混**:
|
**两层是两件事,别混**:
|
||||||
|
|
||||||
- **命名是本节的规矩**——三个分类各有一个专名,文档、代码词族、帮百科一律用它。指代某个分类时直接说「专长」,不说「机制类」「专长那一类」。
|
- **命名是本节的规矩**——三个分类各有一个专名,文档、代码词族、帮百科一律用它。指代某个分类时直接说「专长」,不说「机制类」「专长那一类」。
|
||||||
- **呈现是另一件事**(归 [battle](../../../ux/battle.md) 与 [node-reward](../../../ux/node-reward.md),本节不裁决):玩家看到某件奇物时,卡面只写**这件东西的名字与效果**,不附带它的分类。玩家可以从效果反推它属于哪一类,但界面不替他说破。
|
- **呈现是另一件事**(归 [battle](../../ux/battle.md) 与 [node-reward](../../ux/node-reward.md),本节不裁决):玩家看到某件奇物时,卡面只写**这件东西的名字与效果**,不附带它的分类。玩家可以从效果反推它属于哪一类,但界面不替他说破。
|
||||||
|
|
||||||
**为什么两层都要有**:分类名在卡面上不出现,不等于玩家对它没有概念——帮助手册、百科条目、成就名称三处一定会用到它(「首次集齐 4 件专长」「三件属性值提升」),效果描述里出现指代时也需要名字(如「本项属专长」类归类指代)。所以它必须是一个**玩家读得懂、读一遍就懂**的正式名词,不能是内部描述或自造词。
|
**为什么两层都要有**:分类名在卡面上不出现,不等于玩家对它没有概念——帮助手册、百科条目、成就名称三处一定会用到它(「首次集齐 4 件专长」「三件属性值提升」),效果描述里出现指代时也需要名字(如「本项属专长」类归类指代)。所以它必须是一个**玩家读得懂、读一遍就懂**的正式名词,不能是内部描述或自造词。
|
||||||
|
|
||||||
@@ -308,7 +314,7 @@
|
|||||||
|
|
||||||
**终局那关的 Boss 击败后不给**:兑付只发生在**还有下一关可去**的那些关底 Boss 身上——打赢最终 Boss 时冒险已经结束,没有后续关卡可消费,给了也无处生效。三关结构下,一局的确定性专长兑付次数由此确定(每个终局前 Boss 一次)。
|
**终局那关的 Boss 击败后不给**:兑付只发生在**还有下一关可去**的那些关底 Boss 身上——打赢最终 Boss 时冒险已经结束,没有后续关卡可消费,给了也无处生效。三关结构下,一局的确定性专长兑付次数由此确定(每个终局前 Boss 一次)。
|
||||||
|
|
||||||
**不新增节点类型**:专长挂在 Boss 节点的兑付面上(击败后追加一次专长三选一),[关卡节点地图](关卡节点地图.md) 的节点类型仍是封闭枚举五种(战斗 / Boss / 奖励 / 恢复 / 商店),词表零扩类。
|
**不新增节点类型**:专长挂在 Boss 节点的兑付面上(击败后追加一次专长三选一),[关卡节点地图](关卡节点地图.md) 的节点类型仍是封闭枚举五种(战斗 / Boss / 奖励 / 恢复 / 商店),词表零扩类。此前"要不要为专长新设一类节点"的悬案由此完成裁决。
|
||||||
|
|
||||||
#### 2.2 专长凭证:非 Boss 渠道怎么给专长
|
#### 2.2 专长凭证:非 Boss 渠道怎么给专长
|
||||||
|
|
||||||
@@ -376,7 +382,7 @@
|
|||||||
| **乙:可计算条件(现行)** | **1 条条件** | **分类干净,但"白名单外加过滤"这件事没消失,只是自动化了** |
|
| **乙:可计算条件(现行)** | **1 条条件** | **分类干净,但"白名单外加过滤"这件事没消失,只是自动化了** |
|
||||||
| 丙:死特判清单 | 1 条记录 | 每加一个例外加一条,靠记忆维护 |
|
| 丙:死特判清单 | 1 条记录 | 每加一个例外加一条,靠记忆维护 |
|
||||||
|
|
||||||
**回复在商店内**(用户 2026-10-05 定):回复不是计价物,套不上「计价物不自售」,按默认原则(除登记的特殊规则外,分类内的都要在池子里)**它应当在商店中出现**。现行 `shop.tres` 货架(pool_shelf 六行)已含回复与凭证行(见调参表)。
|
**回复在商店内**(用户 2026-10-05 定):回复不是计价物,套不上「计价物不自售」,按默认原则(除登记的特殊规则外,分类内的都要在池子里)**它应当在商店中出现**。现行 `shop.tres` 货架(pool_shelf 六行)已含回复——迭代15② 商店补回复批已按默认原则对齐落地(凭证行同批入架,见调参表)。
|
||||||
|
|
||||||
**当前在册的约束清单**(就这么两条,都要有理由):
|
**当前在册的约束清单**(就这么两条,都要有理由):
|
||||||
|
|
||||||
@@ -388,9 +394,9 @@
|
|||||||
|
|
||||||
#### 2.5 在册事项
|
#### 2.5 在册事项
|
||||||
|
|
||||||
现行实现里**三条渠道共用同一个候选池**(商店货架按 2.4 可计算条件切边去掉计价物),三个分类出现条件一样、只有出现概率不同——渠道分工中的**凭证形式(非 Boss 渠道给凭证 + 保底限购)已入表实装**(见 2.2 与调参表);**Boss 渠道直接给专长已落地**(2026-10-11 用户裁)。
|
现行实现里**三条渠道共用同一个候选池**(商店货架按 2.4 可计算条件切边去掉计价物),三个分类出现条件一样、只有出现概率不同——上表渠道分工中的**凭证形式(非 Boss 渠道给凭证 + 保底限购)已随迭代15② 入表实装**(见 2.2 与调参表);**Boss 渠道直接给专长已裁随专长实装批本批落地**(2026-10-11 用户裁,不再分期)。渠道分工的实施批次已随迭代 15② 与迭代 20 专长实装批落地,本文件不复制。
|
||||||
|
|
||||||
**池结构选型澄清(2026-10-11)**:池结构正主=案 D(用户定夺在案);「概率与上限解耦」的实现路径(在册三案)系**实装侧自选项,非用户裁定项**——按「实现设计不定于现在」的原裁定,实现侧依代码事实自选,不再上问。
|
**池结构选型澄清(2026-10-11)**:池结构正主=案 D(v3.3 写入文档,用户定夺在案);「概率与上限解耦」的实现路径(v3.4 在册三案)系**实装侧自选项,非用户裁定项**——按「实现设计不定于现在」的原裁定,实装批内依代码事实自选,不再上问。
|
||||||
|
|
||||||
### 3. 作用对象与范围
|
### 3. 作用对象与范围
|
||||||
|
|
||||||
@@ -440,8 +446,8 @@
|
|||||||
## P0 最小闭环 / P1・P2 后置
|
## P0 最小闭环 / P1・P2 后置
|
||||||
|
|
||||||
- **P0(已实现)**:三个分类可定义 → 进入候选池 → 在渠道上被选中 → 当局生效 → 收束清零。
|
- **P0(已实现)**:三个分类可定义 → 进入候选池 → 在渠道上被选中 → 当局生效 → 收束清零。
|
||||||
- **P1 后置**:三条渠道按第 2 节分工——凭证形式(非 Boss 渠道给凭证+保底限购)已入表实装(见调参表),Boss 渠道直接给专长已落地。
|
- **P1 后置**:三条渠道按第 2 节分工——凭证形式(非 Boss 渠道给凭证+保底限购)已随迭代15② 入表实装(见调参表),其余分工(Boss 渠道直接给专长等)待实施。
|
||||||
- **P2 后置**:商店里的攻击类型转换服务(备选素材见 [道具退役素材库](../../../content-archive/道具退役素材库.md));喂雷玩法裁定为不做(kill-switch 见上文「踩雷转化对账锚」)。
|
- **P2 后置**:商店里的攻击类型转换服务(备选素材见 [道具退役素材库](../../../content-archive/道具退役素材库.md));喂雷玩法 2026-10-03 五裁定为不做(R5 甲,kill-switch 见上文「踩雷转化对账锚」)。
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
@@ -452,7 +458,7 @@
|
|||||||
| 专长定义行(标识 / 显示名 / 稀有度 / 效果说明 / 订阅行〔订阅哪个事件 on / 什么条件 when / 什么效果 do〕) | 各字段封闭枚举,行键白名单封闭;事件 / 效果类型 / 条件事实 / 算子四词表封闭(效果引擎单一事实源);稀有度档=新四级(普通/优秀/稀有/传说),schema 字段双脱钩(字段在、设计面按档配比加权) | `data/tables/feats.tres` |
|
| 专长定义行(标识 / 显示名 / 稀有度 / 效果说明 / 订阅行〔订阅哪个事件 on / 什么条件 when / 什么效果 do〕) | 各字段封闭枚举,行键白名单封闭;事件 / 效果类型 / 条件事实 / 算子四词表封闭(效果引擎单一事实源);稀有度档=新四级(普通/优秀/稀有/传说),schema 字段双脱钩(字段在、设计面按档配比加权) | `data/tables/feats.tres` |
|
||||||
| 专长凭证(出现概率 / 配额 / 限购次数 / 保底计数阈值) | 整数,四参数全 provisional | 已入表(`shop.tres` 凭证行 + 冒险表凭证三计数行) |
|
| 专长凭证(出现概率 / 配额 / 限购次数 / 保底计数阈值) | 整数,四参数全 provisional | 已入表(`shop.tres` 凭证行 + 冒险表凭证三计数行) |
|
||||||
| 属性值提升种类 | 封闭三项:生命上限 / AC / 攻击,扩项走文档修订 | 冒险表结构声明 |
|
| 属性值提升种类 | 封闭三项:生命上限 / AC / 攻击,扩项走文档修订 | 冒险表结构声明 |
|
||||||
| 补给种类 | 种类现行事实源=「凭证件表(新 3+留任 2)」节;凭证已入表 | 同上 |
|
| 补给种类 | 种类现行事实源=「凭证件表(新 3+留任 2)」节;凭证已入表(迭代15②) | 同上 |
|
||||||
| 稀有度档位 | 封闭四级(普通 / 优秀 / 稀有 / 传说);配额是结构锚,改总量须重新拍板而非调参 | 同上 |
|
| 稀有度档位 | 封闭四级(普通 / 优秀 / 稀有 / 传说);配额是结构锚,改总量须重新拍板而非调参 | 同上 |
|
||||||
| 各分类种类 × 档位的配额与值 | 整数 | `data/tables/adventure.tres` |
|
| 各分类种类 × 档位的配额与值 | 整数 | `data/tables/adventure.tres` |
|
||||||
| 专长获取的全局限量 | 整数(一局内可获得的次数上限) | 同上 |
|
| 专长获取的全局限量 | 整数(一局内可获得的次数上限) | 同上 |
|
||||||
@@ -473,7 +479,9 @@
|
|||||||
11. 凭证拿到即开,不进持有集,玩家无法囤积——选中或买下的同一时刻就开专长三选一。
|
11. 凭证拿到即开,不进持有集,玩家无法囤积——选中或买下的同一时刻就开专长三选一。
|
||||||
12. 凭证带有计步保底:连续 5 次三选一展示未出现则第 6 次必出;计数跨奖励节点与商店共享,刷新后的重新展示计入次数,限购用满后保底不再触发。
|
12. 凭证带有计步保底:连续 5 次三选一展示未出现则第 6 次必出;计数跨奖励节点与商店共享,刷新后的重新展示计入次数,限购用满后保底不再触发。
|
||||||
13. 被称为流派基座的专长必须能说明拿到前后的操作差异与新行为的持续资源来源;只有同一操作后的泛用数值增长,不得登记为基座。
|
13. 被称为流派基座的专长必须能说明拿到前后的操作差异与新行为的持续资源来源;只有同一操作后的泛用数值增长,不得登记为基座。
|
||||||
14. 换图系两件基座同时持有时都生效;后续五件只在成功刷新后触发,无专长基线不变;石层缓冲覆盖所有主角受伤路径且同轮不叠加,矿道红利按成功刷新次数固定获得 GP。
|
14. 换图系两件基座同时持有时都生效;后续五件只在成功刷新后触发,无专长基线不变;弃图回收按旧图探索进度结算,同一旧图至多回收一次。
|
||||||
|
|
||||||
|
> 实装批落地前,现役代码按旧 27 件专长目录与旧资源成员在同框架下运行;新成员口径(27 件基础件表 / 凭证件表)自实装批起验。
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 难度曲线与Boss
|
# 难度曲线与Boss
|
||||||
|
|
||||||
> 一句话:难度曲线、期望值带与 Boss 设计
|
> 一句话:难度曲线、期望值带与 Boss 设计
|
||||||
> 状态:已定稿;现行为 v1.6
|
> 状态:已定稿(自旧体系迁移);现行为 v1.2
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -53,9 +53,9 @@
|
|||||||
|
|
||||||
| 轴 | 规则 | 说明 |
|
| 轴 | 规则 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 关间台阶(关卡序号) | 每关至少投放一项新内容(新敌种或既有池新技能),加基准数值跳升 | 台阶必须能归因到看得见的变化,不是纯数字膨胀;投放断档是内容生产缺口,调参修补不了 |
|
| 关间台阶(关卡序号) | 每关至少投放一项新内容(新敌种或既有池新技能),加基准数值跳升 | 台阶必须能归因到看得见的变化,不是纯数字膨胀;投放断档是内容生产缺口,调参修补不了(技能池批措辞修订 2026-09-16:行为环段 → 既有池新技能) |
|
||||||
| 关内坡度(节点深度) | 同敌种数值平缓上移,深度也可表达为敌人成群 | 数量是比单体质变更优先的深度表达:保持技能池 EV 读数不变(权重即旋钮、EV 重锚顺带登记)、总量受控 |
|
| 关内坡度(节点深度) | 同敌种数值平缓上移,深度也可表达为敌人成群 | 数量是比单体质变更优先的深度表达:保持技能池 EV 读数不变(权重即旋钮、EV 重锚顺带登记)、总量受控 |
|
||||||
| Boss 与精英修饰(预留第三轴) | Boss 走最深深度直填行;精英怪本体走敌人表精英行(独立行+池继承附加,语义见[敌人系统](../战斗循环/敌人系统.md)「精英行」节),精英节点修饰只有字段命名空间预留 | Boss 不走修饰表;修饰乘数表 MVP 为空表、零行为,首个使用场景 = 精英节点(随[关卡节点地图](关卡节点地图.md)定稿联动);数值所有权在本系统(含精英行数值与附加技权重),[棋盘生成](../排雷循环/棋盘生成.md)只按表生成。精英怪设定:与其他普通小怪同一立绘 + 附加特征标记 + 数值更强;视觉特征三件 = 名称前缀「精英·」(由精英行名字行值承载)+ 底座光环 + 描边变色,后两件的色板合规与样张闸义务随怪物设定批实装 |
|
| Boss 与精英修饰(预留第三轴) | Boss 走最深深度直填行;精英只有字段命名空间预留 | Boss 不走修饰表;修饰乘数表 MVP 为空表、零行为,首个使用场景 = 精英节点(随[关卡节点地图](关卡节点地图.md)定稿联动);数值所有权在本系统,[棋盘生成](../排雷循环/棋盘生成.md)只按表生成。精英怪设定已登记预留(迭代 10 奖励重构批——与其他普通小怪同一立绘 + 附加特征标记 + 数值更强;视觉特征三件 = 名称前后缀「精英·」+ 底座光环 + 描边变色,色板合规与样张闸义务随怪物设定批实装) |
|
||||||
|
|
||||||
**结论**:关内坡度 = 每深一档同敌种基准上移,或按"深度也可表达为敌人成群"改由数量承载——单体生命随深度的具体走向以 `enemy.tres` 行值为准(数量优先于单体;s_hp 线性式为建模工具,现行行值不承诺随深度单调上移);关间台阶 = 相邻关同敌种基准乘 1.3–1.6(域语义如上;s_hp / k_L 现行行值读 `enemy.tres`,取值域归敌人表字段定义)。
|
**结论**:关内坡度 = 每深一档同敌种基准上移,或按"深度也可表达为敌人成群"改由数量承载——单体生命随深度的具体走向以 `enemy.tres` 行值为准(数量优先于单体;s_hp 线性式为建模工具,现行行值不承诺随深度单调上移);关间台阶 = 相邻关同敌种基准乘 1.3–1.6(域语义如上;s_hp / k_L 现行行值读 `enemy.tres`,取值域归敌人表字段定义)。
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ MVP 行值并不逐式现算,而是按此式量级直填经切片验证过的
|
|||||||
|
|
||||||
### 生存链区间模型:一场战斗"打不打得过"的三档判定
|
### 生存链区间模型:一场战斗"打不打得过"的三档判定
|
||||||
|
|
||||||
这是难度验收的现行模型,把"这一战玩家打得过吗"量化成两条区间的对比。每场战斗按玩家的**生存供给**(能扛多少伤害)算出一条生存区间,按**击杀需求**(要打出多少输出才能清场)算出一条击杀区间,两区间一比得出绿、黄、红三档结论。
|
这是难度验收的现行模型,把"这一战玩家打得过吗"量化成两条区间的对比。每场战斗按玩家的**生存供给**(能扛多少伤害)算出一条生存区间,按**击杀需求**(要打出多少输出才能清场)算出一条击杀区间,两区间一比得出绿、黄、红三档结论。它替代了旧的关级供给带。
|
||||||
|
|
||||||
**结论**:绿档(最坏情况也打得过)是教学位的强制要求;黄档(期望占优但有失败分支)是普通战斗的正常形态;红档(最好情况也打不过)是配置事故,涉事行值禁止入表。
|
**结论**:绿档(最坏情况也打得过)是教学位的强制要求;黄档(期望占优但有失败分支)是普通战斗的正常形态;红档(最好情况也打不过)是配置事故,涉事行值禁止入表。
|
||||||
|
|
||||||
@@ -90,11 +90,11 @@ MVP 行值并不逐式现算,而是按此式量级直填经切片验证过的
|
|||||||
| 变量 | 含义 |
|
| 变量 | 含义 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 进场生命 | 主角进入本战时的生命;跨战斗持久,归[冒险结构](冒险结构.md)的 HP(生命) |
|
| 进场生命 | 主角进入本战时的生命;跨战斗持久,归[冒险结构](冒险结构.md)的 HP(生命) |
|
||||||
| 受伤峰值 / 谷值 | 敌方最坏 / 最好一轮的输出(攻击、技能倍率、池闸长期速率、减伤、削弱的合计构成见[战斗结算](../战斗循环/战斗结算.md)战斗段;技能池口径——出招构成为摇号分布,峰值/谷值构成按含闸长期速率复核而非固定剧本拍) |
|
| 受伤峰值 / 谷值 | 敌方最坏 / 最好一轮的输出(攻击、技能倍率、池闸长期速率、减伤、削弱的合计构成见[战斗结算](../战斗循环/战斗结算.md)战斗段;技能池批口径——出招构成为摇号分布,峰值/谷值构成按含闸长期速率复核而非固定剧本拍) |
|
||||||
| 输出峰值 / 谷值 | 玩家最好 / 最坏一轮的总输出(分量构成同上) |
|
| 输出峰值 / 谷值 | 玩家最好 / 最坏一轮的总输出(分量构成同上) |
|
||||||
| 一次性伤害 | 清障炸药一类当场引爆的大额伤害 |
|
| 一次性伤害 | 清障炸药一类当场引爆的大额伤害 |
|
||||||
|
|
||||||
护甲等级带宽口径:结算换算层引入护甲等级掷点(1d20 必中、低掷按缺口三档折扣、nat20 暴击恒全额——档位、折扣与暴击倍率读 `settlement.tres`,规则语义归[战斗结算](../战斗循环/战斗结算.md))后,受伤与输出两侧的峰值 / 谷值构成各含一条掷点带宽——同一刀的最坏 / 最好掷点(含暴击档与折扣档)落进谷值 / 峰值,带宽补扫义务含暴击档与折扣档。**换装点锚定**:基准护甲等级自带对敌方输出期望的结构性削减(具体读数按判定式随行值复算),对比被整体退役的 defense_up 减伤墙是结构性削弱,且伤害下限(任何攻击落地均不为零,下限值读 `settlement.tres`)使"零承伤轮"结构性消失——该方向性偏移与下方已登记的加难杠杆扫描合并处理,不单独重调行值;主角与敌方首关护甲等级行值读配置表(正式行值归怪物设定批)。"零红档"验收与三档判定式不变。
|
护甲等级带宽口径(2026-09-16 定稿落地):结算换算层引入护甲等级掷点(1d20 必中、低掷按缺口三档折扣、nat20 暴击恒全额——档位、折扣与暴击倍率读 `settlement.tres`,规则语义归[战斗结算](../战斗循环/战斗结算.md))后,受伤与输出两侧的峰值 / 谷值构成各含一条掷点带宽——同一刀的最坏 / 最好掷点(含暴击档与折扣档)落进谷值 / 峰值,带宽补扫义务含暴击档与折扣档。**换装点锚定**:基准护甲等级自带对敌方输出期望的结构性削减(具体读数按判定式随行值复算),对比被整体退役的 defense_up 减伤墙是结构性削弱,且伤害下限(任何攻击落地均不为零,下限值读 `settlement.tres`)使"零承伤轮"结构性消失——该方向性偏移与下方已登记的加难杠杆扫描合并处理,不单独重调行值;主角与敌方首关护甲等级行值读配置表(正式行值归怪物设定批)。"零红档"验收与三档判定式不变。
|
||||||
|
|
||||||
关级恒等式:**一关打下来,玩家总输出 ≈ 全关敌方总生命期望 ×(1 + 缓冲);其中奖励侧贡献的输出占比须落在 [15%, 40%] 带内。**
|
关级恒等式:**一关打下来,玩家总输出 ≈ 全关敌方总生命期望 ×(1 + 缓冲);其中奖励侧贡献的输出占比须落在 [15%, 40%] 带内。**
|
||||||
|
|
||||||
@@ -111,17 +111,23 @@ MVP 行值并不逐式现算,而是按此式量级直填经切片验证过的
|
|||||||
|
|
||||||
| 带 | 定稿口径 | 含义 |
|
| 带 | 定稿口径 | 含义 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 通关率带 | 现行带 = 四带甲案(2026-10-03 用户拍板):带 A 白板完美执行战役全通率 [0%,10%] / 带 B 白板第一关通过率 [50%,85%] / 带 C 营地满成长战役全通率 [30%,60%](预立) / 带 D 响应曲线每雷边际 ≤15pp·S 形 | 四带按类型基准锚定、每条带均有外部锚点:带 B 管首关 = 过滤器不是墙;带 A 管白板全通的顶尖难度;带 C 留元进度爬升空间(满成长实装后启用);带 D 管响应曲线无悬崖 |
|
| 通关率带 | 口径已换代·现行带 = 四带甲案(2026-10-03 用户拍板):带 A 白板完美执行战役全通率 [0%,10%] / 带 B 白板第一关通过率 [50%,85%] / 带 C 营地满成长战役全通率 [30%,60%](预立) / 带 D 响应曲线每雷边际 ≤15pp·S 形——旧普通档 L1 [35,55] / L2 [10,15] 与完美档 [35,65] 正式作废,全文见本节末「带换代」条。实证:直入口 L2 普通 5% vs 冒险条件口径 L2 90% 同期并存〔「营地检查点」= 数值验证工具营地循环判定段旧称(现名营地循环战役)——2026-09-30 词源考证完成,见审计报告拍板点 9(已按生命周期条款退役);与冒险结构「没有检查点」铁律的字面相撞就此解除〕 | 四带按类型基准锚定、每条带均有外部锚点:带 B 管首关 = 过滤器不是墙;带 A 管白板全通的顶尖难度;带 C 留元进度爬升空间(满成长实装后启用);带 D 管响应曲线无悬崖 |
|
||||||
| 关卡完成余量带 | 关卡完成者关卡完成时剩余生命的 p90 / p10 按现生命轴上限百分比表达(界值重标随验收批) | **关卡完成余量** = 关卡完成瞬间还剩多少血。余量太肥说明赢得太从容,压生存侧;太瘦说明"剩一两滴血惨胜"成常态,抬治疗供给或恢复点收益 |
|
| 关卡完成余量带 | 关卡完成者关卡完成时剩余生命的 p90 / p10 按现生命轴上限百分比表达(压缩前绝对血量带已作废;界值重标随验收批) | **关卡完成余量** = 关卡完成瞬间还剩多少血。余量太肥说明赢得太从容,压生存侧;太瘦说明"剩一两滴血惨胜"成常态,抬治疗供给或恢复点收益 |
|
||||||
| 第一关形态带 | 教学位绿档 + 中段黄档 + Boss 黄档不红 | **形态带**管一关内各战三档判定的排布形状:第一战必须稳过,中段有输的可能,Boss 战紧但不许是配置事故 |
|
| 第一关形态带 | 教学位绿档 + 中段黄档 + Boss 黄档不红 | **形态带**管一关内各战三档判定的排布形状:第一战必须稳过,中段有输的可能,Boss 战紧但不许是配置事故 |
|
||||||
|
|
||||||
更高加成档(攻击翻倍、三倍)的关卡完成率带随档位放宽(翻倍档第一关 ≥95%),其机制承载是生存链区间的平移而不是另拍一套数字(平移换算见调参联动一节)。此外另有一条期望承伤占比带(普通场承伤不超过生命上限两成、Boss 场不超过五成,provisional);期望承伤占比带复验义务挂起,随数值批重开时核销。
|
更高加成档(攻击翻倍、三倍)的关卡完成率带随档位放宽(翻倍档第一关 ≥95%),其机制承载是生存链区间的平移而不是另拍一套数字(平移换算见调参联动一节)。此外另有一条期望承伤占比带(普通场承伤不超过生命上限两成、Boss 场不超过五成,provisional),该指向已过期(「最近的减伤调整批」所指批次已关闭未执行);期望承伤占比带复验义务挂起,随数值批重开时核销。
|
||||||
|
|
||||||
第三关口径:L3 全部行值 provisional-pending-growth,上述各带对 L3 暂不适用——零成长基线下的红档属预期(主角成长侧前置 = GP 掉落 + 商店房 + 格面 GP 已落地),现行冒烟的首遇绿档断言按「成长代理档 atk+200 / hp+100」口径执行;正式通关率带与首遇绿档口径随玩家成长落地换装,归曲线调参批统一收带。
|
第三关口径(第三关内容批):L3 全部行值 provisional-pending-growth,上述各带对 L3 暂不适用——零成长基线下的红档属预期(主角成长侧前置 = GP+商店房批,已于 2026-09-20 落地:GP 掉落 + 商店房 + 格面 GP),现行冒烟的首遇绿档断言按「成长代理档 atk+200 / hp+100」口径执行;正式通关率带与首遇绿档口径随玩家成长落地换装,归曲线调参批统一收带。
|
||||||
|
|
||||||
**判读口径**:通关率带的测量口径 = 冒险条件通关率(打通 k−1 关才到达第 k 关,由数值验证工具冒险段派生);改带 = 用户拍板。
|
**迭代 20 投放读数(只测不判——2026-10-12 反哺批登记,用户裁③数值暂不调整只落内容)**:奇物池换代后构成 = 四级 70/25/9/0=104 张(凭证四件入稀有档 +6 张 provisional);MC shop=off 止步分布 {1:90, 2:10}→{1:93, 2:7}(通关率 0% 两代持平,新基线 seed 71000)——位移归因曝光槽高档候选加速([奇物](奇物.md)池结构联动注记的预期行为,非难度恶化信号);判读与带重锚随曲线调参批,本注记只登记不判读。
|
||||||
|
|
||||||
**四带甲案(2026-10-03 用户拍板)**:类型基准锚定四带(依据与官方统计出处=《[Roguelike 难度类型基准](难度外部基准调研(已退役,git 历史可查))》§3.2,每条带均有外部锚点):
|
**迭代 24 敌人表内容修批读数(只测不判——2026-10-14 反哺写入批登记,用户裁「全部按呈报写入文档」;数值终值归 M4 数值批)**:同种子配对 seed0=9000(沿用迭代 23 配对种子)改前/改后各 40 局×both——①**N2 普通敌技能投放**(毒吐/盾击两新行六池)后 perfect L2 通关 8/20→13/20(+25pp)、L3 全通 6/20→10/20(+20pp)——方向符合预期(L1 减压后更健康抵达 L2/L3),量级低于二档配对判读带 ~30pp,倍率 provisional 归 M4;normal 档基率地板(0/20)无判读力;②**N3 敌方攻击类型轴**(20 行全填 normal+敌方兑付路径克制消费)后全局平移 = 主角穿重甲受伤点数 −1 / 魔法护甲 +1 / 轻甲 0(V5 冒烟同种子三甲型配对实测单发恒 ±1:heavy 2==light 3−1 · ward 4==light 3+1);taken 中位 normal 29.5→27.5、perfect 76.5→97.0——后者系**构成效应**(全通 6→10 局通关更深自然累计更多承伤),非单发异常;③N1 (1,2) 降档(hp 50→22·ac 3→2)后 perfect L1 通关 19/20→20/20——5 倍墙消除方向符合预期。判读与带重锚随 M4 数值批,本注记只登记不判读。
|
||||||
|
|
||||||
|
**判读口径同步(迭代 5 基线重测批,2026-09-28)**:通关率带的测量口径 = 冒险条件通关率(打通 k−1 关才到达第 k 关,由数值验证工具冒险段派生;单关直入口口径已随 2026-09-23 拍板退役)——带值沿用 2026-09-20 分带修正(普通档 L1 [35,55] / L2 [25,45]、完美档 [35,65];迭代 5 计划书 C4 冻结:改带=用户拍板)。上方行 115 的「带退役待重锚、重锚前只测不判」注记按本条同步理解:迭代 5 基线重测已按现行带对冒险条件口径判读(读数报告已按生命周期条款退役);是否在新口径上重取带值,归迭代 5 出口判读由用户拍板,本批不动带数字。
|
||||||
|
|
||||||
|
> **⚠ 带失效待重锚(2026-10-01 数值修复批)**:模拟档位重构(普通档 v2 新手画像→v3=完美策略+受控失误注入;完美档补元游戏选路与商店购买)+数值三刀(hero max_hp 20→26/直伤雷 4/5/5→6/8/8/L1 系敌 atk 2→1)后,上方三条验收带的测量基准已失义——旧普通档=比真人弱 20 倍的新手画像(真人实证推翻),旧带值系照坏尺子校定。新尺读数(N=100/200)与调优轨迹见 `数值修复批读数(已退役,git 历史可查)`;~~新带值须新尺重测后用户拍板,重锚前只测不判~~(已由下行带换代完成)。
|
||||||
|
|
||||||
|
**带换代(迭代 9 出口带值批,2026-10-03 用户拍板四带甲案)**:旧三条通关率带(普通 L1 [35,55] / L2 [10,15]、完美 [35,65])**正式作废**,换类型基准锚定四带(依据与官方统计出处=《[Roguelike 难度类型基准](难度外部基准调研(已退役,git 历史可查))》§3.2,每条带均有外部锚点):
|
||||||
|
|
||||||
| 带 | 定稿口径 | 外部锚点 |
|
| 带 | 定稿口径 | 外部锚点 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -130,24 +136,26 @@ MVP 行值并不逐式现算,而是按此式量级直填经切片验证过的
|
|||||||
| **带 C** 营地满成长战役全通率 | **[30%, 60%]**(预立——读数须元进度满成长实装后) | Hades 满镜depth参考、带 A→C 5–10 倍爬升跨度 |
|
| **带 C** 营地满成长战役全通率 | **[30%, 60%]**(预立——读数须元进度满成长实装后) | Hades 满镜depth参考、带 A→C 5–10 倍爬升跨度 |
|
||||||
| **带 D** 响应曲线形状 | 每雷边际 ≤15pp 且 S 形连续、无 >25pp 单步跳变 | 悬崖回归量化验收(现行实测 ≈39pp/雷,超 2.6 倍) |
|
| **带 D** 响应曲线形状 | 每雷边际 ≤15pp 且 S 形连续、无 >25pp 单步跳变 | 悬崖回归量化验收(现行实测 ≈39pp/雷,超 2.6 倍) |
|
||||||
|
|
||||||
配套裁决(逐项拍板):普通档 v3.4 **留任失败常态窗**(只记读数不设带,验收只看带 A/带 B+真人侧);直伤雷当量 **6/8/8 转正**(去 provisional);模拟承伤 k 系数保留(k=真人整关承伤中位÷模拟完美档承伤中位,**正常预期 >0.5(用户裁)、预警线 <0.3**,字段随 81000 重锚后补算)。**位阶事实**:现行完美档 78.5% 落带 A 外(越上界 68.5pp)、普通档 L1 13% 落带 B 外——落带收敛归全局难度批(Beta 阶段,未排期;排序先带 D 悬崖修复后带值收敛,顺序有讲究),81000 重锚只测不判。
|
配套裁决(同日逐项拍板):普通档 v3.4 **留任失败常态窗**(只记读数不设带,验收只看带 A/带 B+真人侧);直伤雷当量 **6/8/8 转正**(去 provisional);模拟承伤 k 系数保留(k=真人整关承伤中位÷模拟完美档承伤中位,**正常预期 >0.5(用户裁)、预警线 <0.3**,字段随 81000 重锚入库后补算)。**位阶事实**:现行完美档 78.5% 落带 A 外(越上界 68.5pp)、普通档 L1 13% 落带 B 外——落带收敛归全局难度批(Beta 阶段,未排期;排序先带 D 悬崖修复后带值收敛,顺序有讲究),81000 重锚只测不判。
|
||||||
|
|
||||||
### 越带回滚阶梯(四级阶梯)
|
**改带(迭代 5 返工出口完成批,2026-09-30 用户拍板)**:普通档 L2 带 [25,45] → **[10,15]**(用户裁:数值没有问题、本来就应该通关率很低,之前的 25~45 设定上就有问题)——返工批终态双窗读数 10.6%(MC)/13.6%(verifier)在新带下落带,返工计划书批点丙追认成立,C1 两刀+AC v1+新池组合基线转正(去 provisional)。普通档 L1 [35,55]、完美档 [35,65] 不动。历史读数报告中的 [25,45] 判列系当时口径留档不改。
|
||||||
|
|
||||||
|
### 越带回滚阶梯(四级阶梯,2026-09-28 落档——自 acceptance-ap6-ac v1.0 §e 收编)
|
||||||
|
|
||||||
读数越带时的处置阶梯,粒度细→粗、爆炸半径小→大,**双向可用**(承伤偏低加深压力、承伤偏高放宽折扣):
|
读数越带时的处置阶梯,粒度细→粗、爆炸半径小→大,**双向可用**(承伤偏低加深压力、承伤偏高放宽折扣):
|
||||||
|
|
||||||
1. **实现缺陷检查(AC 档位边界)**——先查双重乘算、档位映射反向等缺陷,对照掷点面 EV 减免读数定位,再谈调参;
|
1. **实现缺陷检查(AC 档位边界)**——先查双重乘算、档位映射反向等缺陷,对照掷点面 EV 减免读数定位,再谈调参;
|
||||||
2. **AC 档位值**——掷点折扣/暴击档位行值(读 `settlement.tres`);
|
2. **AC 档位值**——掷点折扣/暴击档位行值(读 `settlement.tres`);
|
||||||
3. **难度曲线行值加难**——本系统行值(血量锚走廊、变异 effect_value/percent_of_cells/per_level_bonus、群战数量、注入衰减等已登记杠杆位);
|
3. **难度曲线行值加难**——本系统行值(血量锚走廊、变异 effect_value/percent_of_cells/per_level_bonus、群战数量、注入衰减等已登记杠杆位);
|
||||||
4. **行动点表值级调降**——量程最大、爆炸半径最大(AP 现行表值 = 8,第四级启用即推翻现行配置拍板,须用户裁决)。
|
4. **行动点表值级调降**——量程最大、爆炸半径最大(AP 现行表值 = 8〔Package B 2026-09-22 批 6→8 回调;历史「压速批落 6」口径已被回调取代〕,第四级启用即推翻现行配置拍板,须用户裁决)。
|
||||||
|
|
||||||
四条边界:①「承伤偏高(减免过度)」败向先查实现缺陷再谈调参;②动用行值级或行动点级均使同种子历史坐标整体作废,须重立基线、另起验收批;③敌方 AC 正式值不进本链(归怪物设定批);④每次调参后全量重跑验收并在调参日志留联动检算记录(禁独立调参网络纪律)。
|
四条边界:①「承伤偏高(减免过度)」败向先查实现缺陷再谈调参;②动用行值级或行动点级均使同种子历史坐标整体作废,须重立基线、另起验收批;③敌方 AC 正式值不进本链(归怪物设定批——迭代 5 T4 通道);④每次调参后全量重跑验收并在调参日志留联动检算记录(禁独立调参网络纪律)。
|
||||||
|
|
||||||
### 商店与 GP 经济杠杆:玩家侧供给 × 定价的第三族杠杆
|
### 商店与 GP 经济杠杆:玩家侧供给 × 定价的第三族杠杆
|
||||||
|
|
||||||
GP 与商店房给难度引入第三族玩家侧杠杆:**GP 供给 × 商品定价 = 入关属性参数**——供给或定价单边移动,玩家入关时的攻击 / 生命 / 护甲与关卡完成率随之漂移,与血量锚走廊、变异 effect_value 同列进禁独立调参网络。
|
GP 与商店房随 2026-09-20 GP+商店房批落地,给难度引入第三族玩家侧杠杆:**GP 供给 × 商品定价 = 入关属性参数**——供给或定价单边移动,玩家入关时的攻击 / 生命 / 护甲与通关率随之漂移,与血量锚走廊、变异 effect_value 同列进禁独立调参网络。
|
||||||
|
|
||||||
**结论**:掉落与价格的全部现行行值 provisional-pending-曲线调参批——骨架先行、数值整体后置(用户 2026-09-20 拍板"骨架先行、数值是骨架上的肌肉"),分层验收与带平移全部随调参批执行,本文只登记杠杆位不投正式值。
|
**结论**:掉落与价格的全部现行行值 provisional-pending-曲线调参批——本批骨架先行、数值整体后置(用户 2026-09-20 拍板"骨架先行、数值是骨架上的肌肉"),分层验收与带平移全部随调参批执行,本文只登记杠杆位不投正式值。
|
||||||
|
|
||||||
```
|
```
|
||||||
每战 GP 掉落 = 掷定(均值 ± 方差,按战斗节点身份查 gp_drops 行) + 关级掉落加值 + 战斗内缓冲
|
每战 GP 掉落 = 掷定(均值 ± 方差,按战斗节点身份查 gp_drops 行) + 关级掉落加值 + 战斗内缓冲
|
||||||
@@ -155,23 +163,23 @@ GP 与商店房给难度引入第三族玩家侧杠杆:**GP 供给 × 商品
|
|||||||
商品价格(legacy 对照) = 基价 + 关级价格加成 + 步长 × 已购档数
|
商品价格(legacy 对照) = 基价 + 关级价格加成 + 步长 × 已购档数
|
||||||
```
|
```
|
||||||
|
|
||||||
定价锚定口径:商品价格按"正常运气可购档数 / 运气极好可购档数"两读数的数学期望制定(期望读数进商店表批注)——正常运气的玩家买得到成长保底档,运气极好也不至于全表买穿,两个失速态都不出现。A=店内递增 ≫ b=跨关递增的方向裁决随待办清单「GP 商店房重构」条落定;A/b 具体系数 provisional 投值 1.8/1.1,研究归调参批复核;ceil 向上单一取整(玩家不利向)。
|
定价锚定口径:商品价格按"正常运气可购档数 / 运气极好可购档数"两读数的数学期望制定(期望读数进商店表批注)——正常运气的玩家买得到成长保底档,运气极好也不至于全表买穿,两个失速态都不出现。**v0.22 换代注记(迭代 11 第②批)**:A=店内递增 ≫ b=跨关递增的方向裁决随待办清单「GP 商店房重构」条落定;A/b 具体系数原裁决=game-balancer 研究后用户拍板(P5 甲),迭代 11 第②批依零人工令改 provisional 投值 1.8/1.1+后置追认(追认单随迭代 11 出口包,研究归调参批复核);ceil 向上单一取整(玩家不利向)。
|
||||||
|
|
||||||
| 杠杆位 | 口径 | 说明 |
|
| 杠杆位 | 口径 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| GP 掉落均值与方差 | 普通 / 精英(预留行)/ Boss 三行掷定区间 | 掉落量级与战斗节奏同族;格面 gp 型(GP 袋,低概率)是"惊喜意外获取"的补充供给 |
|
| GP 掉落均值与方差 | 普通 / 精英(预留行)/ Boss 三行掷定区间 | 掉落量级与战斗节奏同族;格面 gp 型(GP 袋,低概率)是"惊喜意外获取"的补充供给 |
|
||||||
| 关级掉落加值 | 逐关一行 | 关间供给抬升的半边 |
|
| 关级掉落加值 | 逐关一行 | 关间供给抬升的半边 |
|
||||||
| 关级价格加成 | 逐关一行 | 关间价格上涨对应关间掉落上升的另一半——两轴同向联动的对子(legacy 模式轴;pool 模式由 b 因子承载同一杠杆位) |
|
| 关级价格加成 | 逐关一行 | 关间价格上涨对应关间掉落上升的另一半——两轴同向联动的对子(legacy 模式轴;pool 模式由 b 因子承载同一杠杆位) |
|
||||||
| 货架基价 | pool_shelf 六行(攻击 / 生命上限 / 护甲 / 行动点件 / 凭证 / 回复) | 重复购买爬价由 A 链承载(同店买越多越贵)+ b 跨关递增(后关整体更贵),步长逐档递增语义退役随 legacy 模式保留 |
|
| 货架基价 | pool_shelf 六行(攻击 / 生命上限 / 护甲 / 行动点件 / 凭证 / 回复) | **v0.22 换代**:重复购买爬价由 A 链承载(同店买越多越贵)+ b 跨关递增(后关整体更贵),步长逐档递增语义退役随 legacy 模式保留 |
|
||||||
| 价格因子 A / b | 表因子 price_a / price_b | A=店内递增(进店已购次数幂)、b=跨关递增(关序−1 幂);provisional 1.8/1.1,方向裁决 A ≫ b |
|
| 价格因子 A / b | 表因子 price_a / price_b | A=店内递增(进店已购次数幂)、b=跨关递增(关序−1 幂);provisional 1.8/1.1,方向裁决 A ≫ b |
|
||||||
|
|
||||||
公式语义与 GP 归[冒险结构](冒险结构.md)(GP 节),商店房编排归[关卡节点地图](关卡节点地图.md);行值读 `data/tables/shop.tres`,全部 provisional 归本文曲线调参批。
|
公式语义与 GP 归[冒险结构](冒险结构.md)(GP 节),商店房编排归[关卡节点地图](关卡节点地图.md);行值读 `data/tables/shop.tres`,全部 provisional 归本文曲线调参批。
|
||||||
|
|
||||||
**分层验收 defer(2026-09-20 用户拍板)**:按"商店存在与否"分层的通关率验收——MC 双格(shop=off 现行基线 / shop=on 购买画像)、shop=on 的带平移量、商店属性提升的换算率登记(换算率强条目纪律同类)——**全部随曲线调参批执行**,与「基线通关率越带」同窗。执行前 shop=off 续用现行带判读,shop=on 读数只登记不判读、禁止用 shop=off 读数外推 shop=on。L3 首遇绿档冒烟断言仍按成长代理档口径,不因商店批改判。**v0.22 注记**:shop=off 对照 = legacy 固定三件模式(MC 逐项比对 off_n60 逐位);shop=on 首锚 = 共享池货架面 N=60 双策略(同调关闭同种子配对)——带平移判读仍归调参批,终局池读数(pool_stock)随行只测不判。
|
**分层验收 defer(2026-09-20 用户拍板成文)**:按"商店存在与否"分层的通关率验收——MC 双格(shop=off 现行基线 / shop=on 购买画像)、shop=on 的带平移量、商店属性提升的换算率登记(换算率强条目纪律同类)——**全部随曲线调参批执行**,与「基线通关率越带」同窗(原「L2 Boss 承伤微越带」「大奖励数值随难度曲线联动」两待办清单条目已完成移除——前者 2026-09-28 读数自愈、后者随迭代 10 大奖励退役失义)。执行前 shop=off 续用现行带判读,shop=on 读数只登记不判读、禁止用 shop=off 读数外推 shop=on。L3 首遇绿档冒烟断言仍按成长代理档口径,不因商店批改判。**v0.22 注记(迭代 11 第②批)**:shop=off 对照 = legacy 固定三件模式(MC 逐项比对 off_n60 逐位,迭代 11 第②批 T5);shop=on 首锚 = 共享池货架面 N=60 双策略(同调关闭同种子配对)——带平移判读仍归调参批,终局池读数(pool_stock)随行只测不判。
|
||||||
|
|
||||||
### Boss 设计:食人魔酋长与关底血量锚
|
### Boss 设计:食人魔酋长与关底血量锚
|
||||||
|
|
||||||
首发关底 Boss 是食人魔酋长,摆在每关最深深度行上。Boss 约定有三条:位置 = 最深深度直填行,不走修饰表;定位 = 本关最大的单场消耗;技能池 = 专属池承载——独占技能 + 权重轮廓(现行:独占增益技"硬化"——敌方防御池词汇载体;增益 ≤1 纪律下蓄力拍不进 Boss 池;池语义见[敌人系统](../战斗循环/敌人系统.md))。
|
首发关底 Boss 是食人魔酋长,摆在每关最深深度行上。Boss 约定有三条:位置 = 最深深度直填行,不走修饰表;定位 = 本关最大的单场消耗;技能池 = 专属池承载——独占技能 + 权重轮廓(现行:独占增益技"硬化"——敌方防御池词汇载体;2026-09-16 敌人技能池批改写,旧"专属四拍环且含蓄力拍"约定随行为环退役,增益 ≤1 纪律下旧蓄力拍不进 Boss 池;池语义见[敌人系统](../战斗循环/敌人系统.md))。
|
||||||
|
|
||||||
**结论**:Boss 生命 ≈ 全关普通战斗敌方生命期望合计 × 血量锚比率,比率域 [0.5, 1.1];Boss 攻击基线不低于本关普通战的最高行。
|
**结论**:Boss 生命 ≈ 全关普通战斗敌方生命期望合计 × 血量锚比率,比率域 [0.5, 1.1];Boss 攻击基线不低于本关普通战的最高行。
|
||||||
|
|
||||||
@@ -183,7 +191,7 @@ boss_hp ≈ round( Σ普通战斗敌方生命期望 × r_boss ) r_boss
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Σ普通战斗敌方生命期望 | 按数量区间期望逐行合计(区间中点),行值读敌人表 | 全关非 Boss 节点敌方生命合计;逐数闭合随调参批在调参日志留档 |
|
| Σ普通战斗敌方生命期望 | 按数量区间期望逐行合计(区间中点),行值读敌人表 | 全关非 Boss 节点敌方生命合计;逐数闭合随调参批在调参日志留档 |
|
||||||
| r_boss | 域 [0.5, 1.1] | Boss 生命 = Σ × r_boss;Boss 行值读敌人表(provisional) |
|
| r_boss | 域 [0.5, 1.1] | Boss 生命 = Σ × r_boss;Boss 行值读敌人表(provisional) |
|
||||||
| 加难走廊 | [1.1, 1.35] | 通关率压带的首选杠杆候选;**扫描已执行**——域内取样(r_boss 0.8 档)对完美档 Boss 战无感(胜率 98% 血量加压打不到)、对普通档 −6pp;走廊段(>1.1,越域)未启用——启用即越域须登记(读数明细沿革查 git 提交史) |
|
| 加难走廊 | [1.1, 1.35] | 通关率压带的首选杠杆候选;**扫描已执行(迭代 5,2026-09-28)**——域内取样(r_boss 0.8 档)对完美档 Boss 战无感(胜率 98% 血量加压打不到)、对普通档 −6pp;走廊段(>1.1,越域)未启用——启用即越域须登记(读数明细见 `迭代5杠杆扫描报告(已退役,git 历史可查)`) |
|
||||||
|
|
||||||
Σ 的逐数闭合口径:数量走开战掷骰的区间期望(区间中点),教学位同样掷骰、按区间期望计入;各坐标行值一律读敌人表,本文不重复登记具体数值——防与配置双写失同步。
|
Σ 的逐数闭合口径:数量走开战掷骰的区间期望(区间中点),教学位同样掷骰、按区间期望计入;各坐标行值一律读敌人表,本文不重复登记具体数值——防与配置双写失同步。
|
||||||
|
|
||||||
@@ -193,7 +201,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
|
|||||||
|
|
||||||
三个首发敌种各配一档护甲类型——地精轻甲、熊地精魔法护甲、食人魔酋长重甲——构成"轻甲 → 魔法护甲 → 重甲"的教学梯度:玩家的克制手段随进度逐关解锁。
|
三个首发敌种各配一档护甲类型——地精轻甲、熊地精魔法护甲、食人魔酋长重甲——构成"轻甲 → 魔法护甲 → 重甲"的教学梯度:玩家的克制手段随进度逐关解锁。
|
||||||
|
|
||||||
攻击类型对护甲类型的克制倍率矩阵(克制 / 中性 / 被克三档加法修正(+1 / 0 / −1 点)读 `settlement.tres` 甲效表,provisional)是[战斗结算](../战斗循环/战斗结算.md)的甲效表,哪个攻击类型克哪档护甲由它定义,本文不重复。本文只锁两件事:敌种的护甲类型行值(见调参表),以及这份矩阵数值的调参所有权在本系统——敌种护甲变更与矩阵档值变更都必须复算 Boss 与普通战的击杀区间,加法修正点数随攻击成长的重定价义务同类。
|
攻击类型对护甲类型的克制倍率矩阵(克制 / 中性 / 被克三档加法修正(+1 / 0 / −1 点)读 `settlement.tres` 甲效表,provisional——2026-09-18 加法核换装(量纲由百分比改整数点数))是[战斗结算](../战斗循环/战斗结算.md)的甲效表,哪个攻击类型克哪档护甲由它定义,本文不重复。本文只锁两件事:敌种的护甲类型行值(见调参表),以及这份矩阵数值的调参所有权在本系统——敌种护甲变更与矩阵档值变更都必须复算 Boss 与普通战的击杀区间,加法修正点数随攻击成长的重定价义务同类。
|
||||||
|
|
||||||
### 调参联动:禁独立调参网络与对账重跑义务
|
### 调参联动:禁独立调参网络与对账重跑义务
|
||||||
|
|
||||||
@@ -206,19 +214,19 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
|
|||||||
| 密度 ↔ 可推理率 ↔ 生成尝试上限 | [棋盘生成](../排雷循环/棋盘生成.md) | 三元组联动;禁止为难度牺牲可推理率绝对锚 |
|
| 密度 ↔ 可推理率 ↔ 生成尝试上限 | [棋盘生成](../排雷循环/棋盘生成.md) | 三元组联动;禁止为难度牺牲可推理率绝对锚 |
|
||||||
| 每轮行动点 ↔ 停手转存规模 | [行动经济](../排雷循环/行动经济.md) | 联动评估记录归本文,调参所有权在行动经济 |
|
| 每轮行动点 ↔ 停手转存规模 | [行动经济](../排雷循环/行动经济.md) | 联动评估记录归本文,调参所有权在行动经济 |
|
||||||
| 削弱强度 ↔ 当量锚 | [增益状态](../战斗循环/增益状态.md)、[战斗结算](../战斗循环/战斗结算.md) | 联动值禁独立调参,修订须重跑锚对照 |
|
| 削弱强度 ↔ 当量锚 | [增益状态](../战斗循环/增益状态.md)、[战斗结算](../战斗循环/战斗结算.md) | 联动值禁独立调参,修订须重跑锚对照 |
|
||||||
| 护甲类型 ↔ 克制矩阵 | [战斗结算](../战斗循环/战斗结算.md) | 敌种护甲变更须复算击杀区间 |
|
| 护甲类型 ↔ 克制矩阵 | [战斗结算](../战斗循环/战斗结算.md) | 敌种护甲变更须复算击杀区间(2026-09-19 充能退役——原"充能投桶与量"联动半边废止) |
|
||||||
| 护甲等级 ↔ 攻击基线 ↔ 区间带宽 | [战斗结算](../战斗循环/战斗结算.md) | 敌种与主角的护甲等级行值变更须复算生存链区间(掷点带宽随折扣档位与攻击基线同向放大);掷点形式与档位已定稿(d20 三档——档位读 `settlement.tres`;nat20 暴击形式留档,倍率同表),护甲等级行值变更仍须复算生存链区间——现行行值读 `hero.tres` / `enemy.tres` 的 armor_class 列(均暂定),敌方正式行值随怪物设定批投值、与加难杠杆扫描合并调 |
|
| 护甲等级 ↔ 攻击基线 ↔ 区间带宽 | [战斗结算](../战斗循环/战斗结算.md) | 敌种与主角的护甲等级行值变更须复算生存链区间(掷点带宽随折扣档位与攻击基线同向放大);掷点形式与档位已定稿(d20 三档——档位读 `settlement.tres`;nat20 暴击形式留档,倍率同表),护甲等级行值变更仍须复算生存链区间——现行行值读 `hero.tres` / `enemy.tres` 的 armor_class 列(均暂定),敌方正式行值随怪物设定批投值、与加难杠杆扫描合并调 |
|
||||||
| GP 供给 ↔ 商品定价 | [冒险结构](冒险结构.md)、[关卡节点地图](关卡节点地图.md) | 供给 × 定价 = 入关属性参数,单边移动须复算分层关卡完成率带(商店与 GP 经济杠杆节)——动供给必复算分层带,禁独立调参 |
|
| GP 供给 ↔ 商品定价 | [冒险结构](冒险结构.md)、[关卡节点地图](关卡节点地图.md) | 供给 × 定价 = 入关属性参数,单边移动须复算分层关卡完成率带(商店与 GP 经济杠杆节)——动供给必复算分层带,禁独立调参 |
|
||||||
| 封印溢价系数 δ ↔ 完美乘数 p_perfect ↔ ap_per_round | [战斗结算](../战斗循环/战斗结算.md)、[行动经济](../排雷循环/行动经济.md) | 封印激励三件套同窗检算(防封印 rush 复发:δ 与 ×2 叠加通胀、AP 吞吐上限)——任一变动须重跑双画像封印率读数 |
|
| 封印溢价系数 δ ↔ 完美乘数 p_perfect ↔ ap_per_round | [战斗结算](../战斗循环/战斗结算.md)、[行动经济](../排雷循环/行动经济.md) | 封印激励三件套同窗检算(防封印 rush 复发:δ 与 ×2 叠加通胀、AP 吞吐上限)——任一变动须重跑双画像封印率读数(2026-10-05 判式换代批新增) |
|
||||||
| η 读数 ↔ 模拟画像定义 ↔ 可推理率 ι ↔ min_safe_count/生成尝试上限 | sim 档位、[棋盘生成](../排雷循环/棋盘生成.md) | η 是画像条件量:画像重构即锚漂移,重锚顺带;可推理率三元组联动 |
|
| η 读数 ↔ 模拟画像定义 ↔ 可推理率 ι ↔ min_safe_count/生成尝试上限 | sim 档位、[棋盘生成](../排雷循环/棋盘生成.md) | η 是画像条件量:画像重构即锚漂移,重锚顺带;可推理率三元组既有联动扩一员(2026-10-05 判式换代批新增) |
|
||||||
| β 带端点 β_lo/β_hi ↔ D_ref ↔ hero max_hp ↔ AC 折算档(5pp 系数) | [战斗结算](../战斗循环/战斗结算.md) | 带是 D_ref 的函数:换锚(D_ref/max_hp)须全带重推;AC 档值变更改 5pp 系数,同罪 |
|
| β 带端点 β_lo/β_hi ↔ D_ref ↔ hero max_hp ↔ AC 折算档(5pp 系数) | [战斗结算](../战斗循环/战斗结算.md) | 带是 D_ref 的函数:换锚(D_ref/max_hp)须全带重推;AC 档值变更改 5pp 系数,同罪(2026-10-05 判式换代批新增) |
|
||||||
| 直伤雷三行(6/8/8) ↔ 正向同轴行(heal_minor/pierce_strike/magic_bolt) | [地图战斗资源](../战斗循环/地图战斗资源.md) | **同轴镜像比入对账面**:负向/正向比超出 β 带内推导区间即越带;单边动负向三行今后必须带正向镜像行联合检算 |
|
| 直伤雷三行(6/8/8) ↔ 正向同轴行(heal_minor/pierce_strike/magic_bolt) | [地图战斗资源](../战斗循环/地图战斗资源.md) | **同轴镜像比入对账面**:负向/正向比超出 β 带内推导区间即越带;单边动负向三行今后必须带正向镜像行联合检算(2026-10-05 判式换代批新增——数值修复批两先例的单边动教训成文) |
|
||||||
| clear_blast 区间(24/40/32) ↔ p_perfect | [地图战斗资源](../战斗循环/地图战斗资源.md) | 完美封印第二份的补贴基数进封印激励对账;单边动清图奖励 = 变相动封印 |
|
| clear_blast 区间(24/40/32) ↔ p_perfect | [地图战斗资源](../战斗循环/地图战斗资源.md) | 完美封印第二份的补贴基数进封印激励对账;单边动清图奖励 = 变相动封印(2026-10-05 判式换代批新增) |
|
||||||
| 标中强化池权重 ↔ 正向池权重(77 分母) ↔ 关级恒等式奖励占比 [15,40%] | [地图战斗资源](../战斗循环/地图战斗资源.md) | 形态 (b) 专属池重摇启用时生效(现行不启):双池分布变动 = E_dig 与 W 同时漂移,须联合检算 + 恒等式占比复核(条件生效行) |
|
| 标中强化池权重 ↔ 正向池权重(77 分母) ↔ 关级恒等式奖励占比 [15,40%] | [地图战斗资源](../战斗循环/地图战斗资源.md) | 形态 (b) 专属池重摇启用时生效(现行不启):双池分布变动 = E_dig 与 W 同时漂移,须联合检算 + 恒等式占比复核(2026-10-05 判式换代批新增,条件生效行) |
|
||||||
|
|
||||||
五条经济契约的对账由[战斗结算](../战斗循环/战斗结算.md)闭合验收;挖掘风险不等式为三层口径+β 带+条件二封印溢价(结构层与数值层带判读详见行动经济 F1 条款3 推导节),本系统的对账义务按 β 带逐 u 检算(清图支配性审计为常设重跑项,现行 u=3 β=1.17 微破下限登记态);清图支配性裁决②"非支配设计态"维持——全套判值重跑随本系统下一次调参批顺带执行。完美封印乘数的调参权在本系统。
|
五条经济契约的对账由[战斗结算](../战斗循环/战斗结算.md)闭合验收;挖掘风险不等式已于 2026-10-05 判式换代批重立(三层口径+β 带+条件二封印溢价——结构层接替与数值层带判读详见行动经济 F1 条款3 推导节),本系统的对账义务转为按 β 带逐 u 检算(清图支配性审计为常设重跑项,现行 u=3 β=1.17 微破下限登记态);清图支配性已于 2026-09-19 按现行值链重跑、裁决②"非支配设计态"维持——判式换代后的全套判值重跑随本系统下一次调参批顺带执行。完美封印乘数的调参权在本系统。
|
||||||
|
|
||||||
元进度接口预留:**结论——元进度解锁对难度的影响,以生存链区间的平移换算率接入;接口启用形态已定稿(2026-09-18 用户拍板):永久强化影响折算为通关率带平移量,判读口径不变;换算率表首版三行(生命上限 / 基础攻击 / 护甲等级——护甲行强条目,验收读数须按解锁后参数重测)与键结构见元进度表字段定义,数值行读 `data/tables/`、标定随元进度设计批。** 元进度数值行落地前,本系统不为它预留任何数值行。
|
元进度接口预留:**结论——元进度解锁对难度的影响,以生存链区间的平移换算率接入;接口启用形态已定稿(2026-09-18 元进度定稿批,用户拍板):永久强化影响折算为通关率带平移量,判读口径不变;换算率表首版三行(生命上限 / 基础攻击 / 护甲等级——护甲行强条目,验收读数须按解锁后参数重测)与键结构见元进度表字段定义,数值行读 `data/tables/`、标定随元进度设计批。** 元进度数值行落地前,本系统不为它预留任何数值行。
|
||||||
|
|
||||||
## 依赖与输出
|
## 依赖与输出
|
||||||
|
|
||||||
@@ -251,36 +259,34 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P1 | 加难杠杆扫描落带 | 候选杠杆已登记(血量锚走廊、群战上探、注入衰减上调候选),域内取样扫描已执行(r_boss 0.8 档,见「Boss 设计」节加难走廊行),全杠杆落带扫描未完成;护甲等级换装点锚定(基准护甲等级自带敌方输出期望的结构性削减 + 减伤墙退役 + 伤害下限)的方向性偏移并入本扫描一并调带(带宽补扫含暴击档与折扣档);落带前现行行值维持 provisional-pending-scan。第二关行集并入本扫描 |
|
| P1 | 加难杠杆扫描落带 | 候选杠杆已登记(血量锚走廊、群战上探、注入衰减上调候选),域内取样扫描已执行(迭代 5——r_boss 0.8 档,见「Boss 设计」节加难走廊行),全杠杆落带扫描未完成;护甲等级换装点锚定(基准护甲等级自带敌方输出期望的结构性削减 + 减伤墙退役 + 伤害下限)的方向性偏移并入本扫描一并调带(带宽补扫含暴击档与折扣档);落带前现行行值维持 provisional-pending-scan。第二关行集随分支节点图批落地后并入本扫描(L2 读数基线/加成档已顺带实测,见 v0.7) |
|
||||||
| P1 | 挖掘风险不等式与清图支配性对账重跑 | **挖掘风险不等式半边已完成**——判式三层口径+条件二封印溢价机制闭合+β 带判读制度化(残留=u=3 β=1.17 微破下限登记态,不强制回滚),本行对挖掘风险不等式的「重跑义务」改判读回执:后续调参按 β 带检算执行,不再立独立重跑批。清图支配性已按现行值链重跑(裁决②"非支配设计态"维持,重跑入口=清图支配性审计(常设重跑项));调参批执行时按当期行值顺带重跑 |
|
| P1 | 挖掘风险不等式与清图支配性对账重跑 | **挖掘风险不等式半边已完成(2026-10-05 判式换代批,迭代14②号卡)**——判式三层重立写入文档+条件二封印溢价机制闭合+β 带判读制度化(残留=u=3 β=1.17 微破下限登记态,不强制回滚;δ 敏感度判读顺带出口报告),本行对挖掘风险不等式的「重跑义务」改判读回执:后续调参按 β 带检算执行,不再立独立重跑批。清图支配性已于 2026-09-19 按现行值链重跑(裁决②"非支配设计态"维持——缺口收窄主读数 L1≈24/L2≈45 当量〔u=1〕,重跑入口=清图支配性审计(常设重跑项));调参批执行时按当期行值顺带重跑 |
|
||||||
| P1 | 真人冒险成功率修正系数标定 | 带按模拟口径定义;试玩批次实测真人显著强于模拟者,系数待后续试玩批次定量 |
|
| P1 | 真人冒险成功率修正系数标定 | 带按模拟口径定义;试玩批次实测真人显著强于模拟者,系数待后续试玩批次定量 |
|
||||||
| P1 | 奖励重构带重扫义务 | 恢复经济收紧(关卡完成部分回血 20%,难度上压方向)+ 局内成长节奏变动(三选一件值/权重/次数上限 knob 全读冒险表;AP 件 = 每场战斗开始首轮 +1 AP 的强度敏感轴)——关卡完成率带重扫随曲线调参批现行窗执行;Boss 钥石掉落重锚(首杀 3/复杀 2)连带元进度产出标定义务重开(归元进度设计批) |
|
| P1 | 迭代 10 奖励重构带重扫义务 | 恢复经济收紧(关卡完成回满血→部分回血 20%,难度上压方向)+ 局内成长节奏变动(三选一件值/权重/次数上限 knob 全读冒险表;AP 件 = 每场战斗开始首轮 +1 AP 的强度敏感轴)——关卡完成率带重扫随曲线调参批现行窗执行;Boss 钥石掉落重锚(首杀 3/复杀 2)连带元进度产出标定义务重开(归元进度设计批) |
|
||||||
| P1 | 完美策略档的结构性加难杠杆 | 数值杠杆对完美档已被实测证伪,结构候选未裁决(登记 [待办清单](../../../../待办清单.md)) |
|
| P1 | 完美策略档的结构性加难杠杆 | 数值杠杆对完美档已被实测证伪,结构候选未裁决(登记 [待办清单](../../../../待办清单.md)) |
|
||||||
| P2 | 精英节点完整语义与修饰乘数表首行 | 随[关卡节点地图](关卡节点地图.md)定稿联动;首个使用场景 = 精英节点;精英怪设定三特征已登记(见「曲线雕刻」表注),钥石掉 1 个预留挂钩 meta.tres boss_keystone 精英行(随实装批落) |
|
| P2 | 精英节点完整语义与修饰乘数表首行 | 随[关卡节点地图](关卡节点地图.md)定稿联动;首个使用场景 = 精英节点;精英怪设定三特征已登记(迭代 10 批,见「曲线雕刻」表注),钥石掉 1 个预留挂钩 meta.tres boss_keystone 精英行(随实装批落) |
|
||||||
| P2 | 区间平移换算率定稿 | 接口启用形态已定稿;剩余面 = 首版三行折算数值随[元进度](../跨局循环/元进度.md)设计批模拟读数标定 |
|
| P2 | 区间平移换算率定稿 | 接口启用形态已定稿(2026-09-18 元进度定稿批);剩余面 = 首版三行折算数值随[元进度](../跨局循环/元进度.md)设计批模拟读数标定 |
|
||||||
| P2 | 全局作用域变异的投放计划 | **首发已落地**——现行=L2/L3 Boss 图恒定贫矿脉(unlock_level=2 起,第 1 关 Boss 免疫=L1 教学保护);本行降级为「后续型扩展计划」:新全局型(精英图首行/案D 冻土/案B 诡雷远期)逐关固定演进,随关卡扩展登记;带 A(全局变异)收敛判读归全局难度批(Beta 阶段,未排期)杠杆表(读数只测不判) |
|
| P2 | 全局作用域变异的投放计划 | **首发已落地(2026-10-04 全局作用域变异首发批,迭代 14 ③号卡)**——现行=L2/L3 Boss 图恒定贫矿脉(unlock_level=2 起,第 1 关 Boss 免疫=L1 教学保护);本行降级为「后续型扩展计划」:新全局型(精英图首行/案D 冻土/案B 诡雷远期)逐关固定演进,随关卡扩展登记;带 A(全局变异)收敛判读归全局难度批(Beta 阶段,未排期)杠杆表(Q4 甲——落地批读数只测不判) |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
本系统是全项目行值最多的系统。数值纪律:**正文与调参表只定规则、取值域与口径,具体行值一律读配置表(切片 `data/tables/` 的 enemy / skills / hero / board_gen / reward / settlement / status_effects 等),已锁数值以 `data/tables/` 对应表为准,本文不登记具体数值——防双写失同步**。
|
本系统是全项目行值最多的系统。数值纪律(2026-09-17 降级批定稿):**正文与调参表只定规则、取值域与口径,具体行值一律读配置表(切片 `data/tables/` 的 enemy / skills / hero / board_gen / reward / settlement / status_effects 等),已锁数值以 `data/tables/` 对应表为准,本文不登记具体数值——防双写失同步**(切片 `.tres` 数值压缩批后文档行值滞后,双写失同步已被实证)。
|
||||||
|
|
||||||
首发行值几乎全部 provisional,其中加难相关数值处于 provisional-pending-scan(扫描未执行);完整行集读表,不在此整表搬运。
|
首发行值几乎全部 provisional,其中加难相关数值处于 provisional-pending-scan(扫描未执行);完整行集读表,不在此整表搬运。
|
||||||
|
|
||||||
敌人表行值(行集与坐标覆盖随后续批次扩展,行值读 `enemy.tres`——本文只登记行模板与坐标语义):
|
敌人表行值(行集与坐标覆盖随后续批次扩展,行值读 `enemy.tres`——本文只登记行模板与坐标语义):
|
||||||
|
|
||||||
**混编行集难度归属注记**:敌人表同一坐标允许多行混编多种敌种后,混编遭遇的难度 = 行集内各行值按既有口径独立生效再叠加(数量区间各行各掷、行集实例总数 ≤ 4),不引入新的难度轴或乘区;投时行值 provisional 归本文调参的既有口径不变。**投放记录**:第一行 = (2, 5) 熊地精重击手 + 巨蜘蛛巢群;第二行 = (1, 3) 熊地精 + 地精(行序熊地精在前——默认单体目标与开战叙述取首行,行值整行复用既有地精 / 熊地精行);Boss 多行第二批仍挂后置。**读数义务(2026-11-04 用户裁)**:Alpha 阶段数值层统一修正殿后,本阶段投放零读数、零 MC 取证,难度带读数义务后移到数值统一修正批(本行与后续 Alpha 投放批同此口径)。
|
**混编行集难度归属注记(2026-10-07 行集多行批——机制放开、本批零投放)**:敌人表同一坐标允许多行混编多种敌种后,混编遭遇的难度 = 行集内各行值按既有口径独立生效再叠加(数量区间各行各掷、行集实例总数 ≤ 4),不引入新的难度轴或乘区;首个混编行连同 Boss 多行的实际投放归后续内容批,投时行值 provisional 归本文调参的既有口径不变,且投放批须附 MC 取证(先报批)与难度带读数。机制批次(本批)零内容投放、零数值变更。
|
||||||
|
|
||||||
| 坐标 | 敌种(数据键) | 生命 | 攻击(浮动区间) | 数量 | 技能池(权重) | 护甲 |
|
| 坐标 | 敌种(数据键) | 生命 | 攻击(浮动区间) | 数量 | 技能池(权重) | 护甲 |
|
||||||
|---|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|
|
||||||
| 关卡序号 × 节点深度 | enemy_id + display_name | hp | atk / [atk_min, atk_max] | [unit_count, unit_count_max] | {skill_id: weight} | armor_type + armor_class |
|
| 关卡序号 × 节点深度 | enemy_id + display_name | hp | atk / [atk_min, atk_max] | [unit_count, unit_count_max] | {skill_id: weight} | armor_type + armor_class |
|
||||||
|
|
||||||
第一关图版注记:首发三敌种按"杂兵 → 主力 → 关底 Boss"生态位投放——地精 = 首发杂兵(教学位节点数量开战掷定,区间行值读表);熊地精 = 首发主力;食人魔酋长 = 首发关底 Boss(池独占增益技"硬化")。池构成纪律与独占技机制归[敌人系统](../战斗循环/敌人系统.md),行值读 `enemy.tres`(provisional)。
|
第二关图版注记(分支节点图批):L2 熊地精三行 = bugbear 复用(幽暗地域部族设定——display_name 熊地精系与第一关"熊地精"错开;池差异化改造 = 蓄力拍退役换突刺,复用共享技能行);巨蜘蛛 = 新敌种(群行倾向、首遇位固定数量不加骰——首遇教学位纪律);蛛化卓尔精灵 = Boss 专属池(独占技毒爆 + 权重轮廓,血量为 r_boss 口径 provisional 锚——定位本关最大单场消耗);护甲面:轻甲(蜘蛛)与魔法护甲(熊地精三行)同关错开克制面,Boss 重甲。L2 三行复用 bugbear、显示名熊地精系(2026-09-17 用户拍板);Boss 定名蛛化卓尔精灵(用户同日拍板)。节点编号 2 = 奖励点、3 = 恢复点(rest_heal_pct 行字段兑付)——不开战斗、无敌人/棋盘行。
|
||||||
|
|
||||||
第二关图版注记:L2 熊地精三行 = bugbear 复用(幽暗地域部族设定——display_name 熊地精系与第一关"熊地精"错开;池差异化 = 突刺,复用共享技能行);巨蜘蛛 = 新敌种(群行倾向、首遇位固定数量不加骰——首遇教学位纪律);蛛化卓尔精灵 = Boss 专属池(独占技毒爆 + 权重轮廓,血量为 r_boss 口径 provisional 锚——定位本关最大单场消耗);护甲面:轻甲(蜘蛛)与魔法护甲(熊地精三行)同关错开克制面,Boss 重甲。L2 三行复用 bugbear、显示名熊地精系(2026-09-17 用户拍板);Boss 定名蛛化卓尔精灵(用户拍板)。节点编号 2 = 奖励点、3 = 恢复点(rest_heal_pct 行字段兑付)——不开战斗、无敌人/棋盘行。
|
第三关图版注记(第三关内容批):行集 = 与第二关同模板的九节点图(六战 + Boss + 奖励 + 恢复,节点编号 2/3 同为奖励点/恢复点——不开战斗、无敌人/棋盘行)。敌种生态:灰矮人 = duergar 新敌种(单体重甲中坚——第二关单体生态位的关间台阶);钩爪恐魔 = hook_horror 新敌种(群行,复用撕咬共享技能行);灰矮人石君王 = duergar_king Boss 专属池(独占妨害技大地脉动 earth_pulse = 乏力 sapped 首发——第二妨害词汇,池载荷口径同蛛网束缚)。两敌种首遇位(节点 0 / 节点 1)固定数量不加骰——首遇教学位纪律同第二关注记。克制面重轻错开:重甲灰矮人是重甲首次登台,轻甲钩爪恐魔保穿刺/普通分量有用武之地,Boss 重甲收束"轻甲 → 魔法护甲 → 重甲"教学梯度(第三档在 L3 补完)。Boss 血量 75 = Σ普通战生命期望 91 × r_boss≈0.82(provisional 锚,域 [0.5, 1.1]——Boss 锚在案口径,逐数闭合随调参批在调参日志留档)。棋盘 13×13 / Boss 14×14、密度 0.25 维持、地形变异第三关对落石(直伤 3 点)+ 矿尘(数字遮蔽)顺带铺行;armor_class 恒 0(正式投值仍归「敌方护甲等级正式行值」在案条目全表同批)。行值读 `enemy.tres` / `board_gen.tres` / `skills.tres` / `variation.tres`,全部 provisional-pending-growth(L3 口径见「期望值带」节)。
|
||||||
|
|
||||||
第三关图版注记:行集 = 与第二关同模板的九节点图(六战 + Boss + 奖励 + 恢复,节点编号 2/3 同为奖励点/恢复点——不开战斗、无敌人/棋盘行)。敌种生态:灰矮人 = duergar 新敌种(单体重甲中坚——第二关单体生态位的关间台阶);钩爪恐魔 = hook_horror 新敌种(群行,复用撕咬共享技能行);灰矮人石君王 = duergar_king Boss 专属池(独占妨害技大地脉动 earth_pulse = 乏力 sapped 首发——第二妨害词汇,池载荷口径同蛛网束缚)。两敌种首遇位(节点 0 / 节点 1)固定数量不加骰——首遇教学位纪律同第二关注记。克制面重轻错开:重甲灰矮人是重甲首次登台,轻甲钩爪恐魔保穿刺/普通分量有用武之地,Boss 重甲收束"轻甲 → 魔法护甲 → 重甲"教学梯度(第三档在 L3 补完)。Boss 血量 75 = Σ普通战生命期望 91 × r_boss≈0.82(provisional 锚,域 [0.5, 1.1]——Boss 锚在案口径,逐数闭合随调参批在调参日志留档)。棋盘 13×13 / Boss 14×14、密度 0.25 维持、地形变异第三关对落石(直伤 3 点)+ 矿尘(数字遮蔽)铺行;armor_class 恒 0(正式投值仍归「敌方护甲等级正式行值」在案条目全表同批)。行值读 `enemy.tres` / `board_gen.tres` / `skills.tres` / `variation.tres`,全部 provisional-pending-growth(L3 口径见「期望值带」节)。
|
群伤负向 = 警觉(敌方护甲等级 +1——2026-09-20 八型批伏击退役换装);一轮踩雷数由行动点预算天然封顶(原 advantage_per_round_cap 行值同日先行删除)。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。
|
||||||
|
|
||||||
群伤负向 = 警觉(敌方护甲等级 +1);一轮踩雷数由行动点预算天然封顶。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。
|
|
||||||
|
|
||||||
技能池投值(池权重/冷却/保底/触发条件的所有权本文,机制归[敌人系统](../战斗循环/敌人系统.md);行值读 `skills.tres` 与 `enemy.tres` 的 pool,全部 provisional):
|
技能池投值(池权重/冷却/保底/触发条件的所有权本文,机制归[敌人系统](../战斗循环/敌人系统.md);行值读 `skills.tres` 与 `enemy.tres` 的 pool,全部 provisional):
|
||||||
|
|
||||||
@@ -289,8 +295,8 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
|
|||||||
| 池权重 | 权重即旋钮:抬特殊技权重 = 抬输出频率,EV 随之重锚;各敌种行集读表 |
|
| 池权重 | 权重即旋钮:抬特殊技权重 = 抬输出频率,EV 随之重锚;各敌种行集读表 |
|
||||||
| 技能冷却(拍) | 逐技能行读表;普攻冷却恒 0 不可配(空池不可能的结构前提——域校验锁死);撕咬 = 与突刺同倍率错开冷却轴的高频小爆发轮廓;毒爆 = 蛛化卓尔精灵专属池独占技 |
|
| 技能冷却(拍) | 逐技能行读表;普攻冷却恒 0 不可配(空池不可能的结构前提——域校验锁死);撕咬 = 与突刺同倍率错开冷却轴的高频小爆发轮廓;毒爆 = 蛛化卓尔精灵专属池独占技 |
|
||||||
| 保底 M | 全局单旋钮,读技能表 pity_threshold;连续 M 拍执行普攻 → 下拍必出特殊技;单特殊技低权重池受保底支配 |
|
| 保底 M | 全局单旋钮,读技能表 pity_threshold;连续 M 拍执行普攻 → 下拍必出特殊技;单特殊技低权重池受保底支配 |
|
||||||
| 触发条件 | 情境技与闩型解锁的 fact 阈值读技能表 trigger 行值(词表与机制归敌人系统「触发条件」节);情境技的池内份额照走池权重行。**已投放两示范(provisional)**:地精池孤注守势(self_hp_pct lte 35,纯增益技)+ L2/L3 群行位趁隙偷袭(last_round_end eq 停手,伤害技)——fact 阈值、权重、倍率与冷却逐行读表,本表零复制;地精池投放稀释含闸长期速率,EV 抽样锚已换代(带宽注记随 `enemy.tres` 表注) |
|
| 触发条件 | 情境技与闩型解锁的 fact 阈值读技能表 trigger 行值(2026-10-26 触发条件批设计闭合——词表与机制归敌人系统「触发条件」节);情境技的池内份额照走池权重行。**已投放两示范(2026-10-27 迭代 39,provisional)**:地精池孤注守势(self_hp_pct lte 35,纯增益技)+ L2/L3 群行位趁隙偷袭(last_round_end eq 停手,伤害技)——fact 阈值、权重、倍率与冷却逐行读表,本表零复制;地精池投放稀释含闸长期速率,EV 抽样锚已随重锚批换代(带宽注记随 `enemy.tres` 表注) |
|
||||||
| 池 EV 锚 | 静态份额与含闸长期速率实测读数登记于调参日志(EV 重锚与权重投值随本表修订)。节奏实测判读口径:种子数下限 50 判读;20 种子以下批次有种子偏置假象;过旱按用户判读带集中在短命杂鱼(生存时长问题非池配置——见待办清单 Alpha 条目移交注记) |
|
| 池 EV 锚 | 静态份额与含闸长期速率实测读数登记于调参日志(EV 重锚与权重投值随本表修订)。**2026-09-19 节奏体验验证批登记**(60 组独立种子 × 双策略 × 两关的节奏实测,种子数下限 50 判读;20 种子以下批次有种子偏置假象):特殊技执行份额 对表成立——地精 10.4%(静态 10%)/ 地精一伙 8.4% / 熊地精系 28.9–42.4% / 巨蜘蛛 34.8% / 酋长 28.9% / 卓尔 35.4%;**L2 池含闸速率抽样复核完成**(上项即含闸读数);保底越界 0/247(间隔 4 = M=4 合法上界);过涝信号 8/1440 场(最长连击 3);过旱按用户判读带集中在短命杂鱼(生存时长问题非池配置——见待办清单清单 Alpha 条目移交注记) |
|
||||||
|
|
||||||
主角表与棋盘参数表(行值分别读 `hero.tres` 与 `board_gen.tres`,provisional):
|
主角表与棋盘参数表(行值分别读 `hero.tres` 与 `board_gen.tres`,provisional):
|
||||||
|
|
||||||
@@ -303,15 +309,15 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
|
|||||||
|
|
||||||
| 参数 | 取值域 / 口径 | 说明 |
|
| 参数 | 取值域 / 口径 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 血量锚比率 r_boss | [0.5, 1.1];加难走廊 [1.1, 1.35](扫描已执行,见「Boss 设计」节) | Boss 生命锚;r_boss 复算与收锚义务挂起,随数值批重开时核销 |
|
| 血量锚比率 r_boss | [0.5, 1.1];加难走廊 [1.1, 1.35](扫描已执行,见「Boss 设计」节) | Boss 生命锚;**锚漂移登记(迭代 5 基线重测批)**:数值设计批 Boss 血轴拔高后 L2/L3 现值 r_boss≈0.33(全行集 Σ 口径)低于域下限 0.5——该指向已过期(迭代 5 已关闭未执行);r_boss 复算与收锚义务挂起,随数值批重开时核销 |
|
||||||
| 克制矩阵 | 克制 / 中性 / 被克三档加法修正(+1/0/−1 点),读 `settlement.tres` 甲效表 | 消费归[战斗结算](../战斗循环/战斗结算.md) |
|
| 克制矩阵 | 克制 / 中性 / 被克三档加法修正(+1/0/−1 点),读 `settlement.tres` 甲效表 | 消费归[战斗结算](../战斗循环/战斗结算.md) |
|
||||||
| 完美封印乘数 | 读表 | 调参权本文 |
|
| 完美封印乘数 | 读表 | 调参权本文 |
|
||||||
| 当量参考敞口 | 读表 | 变更触发全量对账重跑 |
|
| 当量参考敞口 | 读表 | 变更触发全量对账重跑 |
|
||||||
| 注入概率初值 / 衰减 | 读表 | 注入机制归[地图战斗资源](../战斗循环/地图战斗资源.md) |
|
| 注入概率初值 / 衰减 | 读表 | 注入机制归[地图战斗资源](../战斗循环/地图战斗资源.md) |
|
||||||
| 清障炸药威力区间 | 读表 | 清图槽当场引爆 |
|
| 清障炸药威力区间 | 读表 | 清图槽当场引爆 |
|
||||||
| 状态强度 | 读 `status_effects.tres`(掷点轴) | 联动评估归本文,禁独立调参 |
|
| 状态强度 | 读 `status_effects.tres`(掷点轴——2026-09-16 换装,原减伤退役) | 联动评估归本文,禁独立调参 |
|
||||||
| 资源面偏斜 effect_value | 读 `variation.tres` 贫矿脉行(域 [0,50],0=中性 off 锚;现行投值 30 provisional) | Boss 图整图变异=全局加难杠杆(带 A 注册(Beta 阶段,未排期)杠杆表——读数只测不判,带 A 收敛判读归全局难度批);与注入概率/衰减同族「图级投放轴」,禁独立调参;总期望微降 3-5% 为 provisional 设计目标,实测方向与幅度归读数批 |
|
| 资源面偏斜 effect_value | 读 `variation.tres` 贫矿脉行(域 [0,50],0=中性 off 锚;现行投值 30 provisional——2026-10-04 首发批) | Boss 图整图变异=全局加难杠杆(带 A 注册(Beta 阶段,未排期)杠杆表——Q4 甲裁决,读数只测不判,带 A 收敛判读归全局难度批);与注入概率/衰减同族「图级投放轴」,禁独立调参;总期望微降 3-5% 为 provisional 设计目标,实测方向与幅度归读数批 |
|
||||||
| GP 掉落与商店价格参数 | 读 `shop.tres`(gp_drops 均值±方差 / level_gp_bonus / pool_shelf 货架基价六行 / price_a / price_b;legacy products 首价与步长 / price_level_bonus 随对照模式保留) | 公式语义归[冒险结构](冒险结构.md),数值全部 provisional-pending-曲线调参批(A/b 投值 1.8/1.1),与分层带联动禁独立调参 |
|
| GP 掉落与商店价格参数 | 读 `shop.tres`(gp_drops 均值±方差 / level_gp_bonus / pool_shelf 货架基价六行 / price_a / price_b;legacy products 首价与步长 / price_level_bonus 随对照模式保留) | GP+商店房批新增,pool 换代随迭代 11 第②批;公式语义归[冒险结构](冒险结构.md),数值全部 provisional-pending-曲线调参批(A/b 投值 1.8/1.1 后置追认),与分层带联动禁独立调参 |
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
@@ -319,7 +325,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板
|
|||||||
- 零红档:全部行集经区间扫描,不存在"最好情况也打不过"的战斗组合。
|
- 零红档:全部行集经区间扫描,不存在"最好情况也打不过"的战斗组合。
|
||||||
- 教学位绿档:第一关第一战与各新敌种首遇位的区间判定为绿档。
|
- 教学位绿档:第一关第一战与各新敌种首遇位的区间判定为绿档。
|
||||||
- 形态带成立:第一关形态 = 教学位绿 + 中段黄 + Boss 黄不红。
|
- 形态带成立:第一关形态 = 教学位绿 + 中段黄 + Boss 黄不红。
|
||||||
- 通关率带:四带甲案(2026-10-03 用户拍板)——带 A 白板完美执行战役 [0,10%] / 带 B 白板 L1 [50,85%] / 带 C 满成长 [30,60%] 预立 / 带 D 响应曲线 ≤15pp·S 形。测量口径维持冒险条件通关率(由数值验证工具冒险段派生);四带定稿全文见「期望值带」节「四带甲案」条。
|
- 通关率带:**2026-10-03 带换代(用户拍板四带甲案)**——带 A 白板完美执行战役 [0,10%] / 带 B 白板 L1 [50,85%] / 带 C 满成长 [30,60%] 预立 / 带 D 响应曲线 ≤15pp·S 形;旧普通 L1 [35,55] / L2 [10,15]、完美 [35,65] 正式作废。测量口径维持冒险条件通关率(由数值验证工具冒险段派生);四带定稿全文见「期望值带」节「带换代」条。
|
||||||
- 关卡完成余量带:关卡完成者剩余生命 p90 / p10 按现生命轴上限百分比表达,界值重标随验收批。
|
- 关卡完成余量带:关卡完成者剩余生命 p90 / p10 按现生命轴上限百分比表达,界值重标随验收批。
|
||||||
- 恒等式闭合:关级恒等式逐项对账闭合,残差 <5%(provisional 阈值);奖励输出占比 ∈ [15%, 40%]。
|
- 恒等式闭合:关级恒等式逐项对账闭合,残差 <5%(provisional 阈值);奖励输出占比 ∈ [15%, 40%]。
|
||||||
- Boss 锚在案:每个 Boss 行的血量锚比率记录在案且落在现行带内;越带须登记,不静默变更。
|
- Boss 锚在案:每个 Boss 行的血量锚比率记录在案且落在现行带内;越带须登记,不静默变更。
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 地图战斗资源
|
# 地图战斗资源
|
||||||
|
|
||||||
> 一句话:格面资源的产出、极性字典与清图奖励封装
|
> 一句话:格面资源的产出、极性字典与清图奖励封装
|
||||||
> 状态:已定稿;现行为 v1.7
|
> 状态:已定稿(自旧体系迁移);现行为 v1.2
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
|
|
||||||
| 负责 | 说明 |
|
| 负责 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 格面资源类型封闭枚举 | 九型(attack / defense / heal / blast / weaken / pierce / magic / action / gp);表里出现清单外的类型,数据加载直接拒绝 |
|
| 格面资源类型封闭枚举 | 九型(attack / defense / heal / blast / weaken / pierce / magic / action / gp——2026-09-18 伤害道具批五→七、2026-09-20 格面资源八型批七→八、同日 GP+商店房批八→九);表里出现清单外的类型,数据加载直接拒绝 |
|
||||||
| 装板期身份预分配 | 每张图装上时一次摇定全部非封锁格的资源类型身份与清图奖励对象身份;只读、无重摇 |
|
| 装板期身份预分配 | 每张图装上时一次摇定全部非封锁格的资源类型身份与清图奖励对象身份;只读、无重摇 |
|
||||||
| 极性矩阵与九型字典 | 「动作 × 格型 → 正负号」的定义,以及每型正向 / 负向各兑付成什么效果 |
|
| 极性矩阵与九型字典 | 「动作 × 格型 → 正负号」的定义,以及每型正向 / 负向各兑付成什么效果 |
|
||||||
| 清图奖励对象 | 整图作用域的独立奖励封装,可配置可替换,按图类型差异化 |
|
| 清图奖励对象 | 整图作用域的独立奖励封装,可配置可替换,按图类型差异化 |
|
||||||
| 未来功能道具的预留结构位 | 长周期、更强力的功能性道具 = 秘宝(局外同调件——渠道已随[秘宝](../跨局循环/秘宝.md)域落定);本系统只留结构位不预写 |
|
| 未来功能道具的预留结构位 | 长周期、更强力的功能性道具 = 秘宝(局外同调件——渠道已随[秘宝](../跨局循环/秘宝.md)域与同调实施批落定);本系统只留结构位不预写 |
|
||||||
|
|
||||||
不负责:
|
不负责:
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
|
|
||||||
清图槽(clear_default 池,clear_blast)独立于格面资源——作用域为整张板,不挂任何一格。
|
清图槽(clear_default 池,clear_blast)独立于格面资源——作用域为整张板,不挂任何一格。
|
||||||
|
|
||||||
候选集合具体行值(power / power_min / power_max / stacks / effect_id)随行更新——以 `data/tables/reward.tres` 为现行值源;GDD 表格只锁行集与权重分布语义。负向 9 行(enrage / off_guard / heal_backlash / enemy_alert / ap_drain / sapped / pierce_snare / magic_recoil / gp_loss)weight=0 不参与摇号,按(类型, 极性)查表取用,不在候选集合内。
|
候选集合具体行值(power / power_min / power_max / stacks / effect_id)随行更新——以 `data/tables/reward.tres` 为现行值源;GDD 表格只锁行集与权重分布语义。负向 9 行(enrage / off_guard / heal_backlash / enemy_alert / ap_drain / sapped / pierce_snare / magic_recoil / gp_loss——2026-09-20 八型批 ambush_double→enemy_alert 换装 + ap_drain 新增、同日 GP+商店房批 +gp_loss)weight=0 不参与摇号,按(类型, 极性)查表取用,不在候选集合内。
|
||||||
|
|
||||||
举证:本节为候选集合枚举,无计算。
|
举证:本节为候选集合枚举,无计算。
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
|
|
||||||
- **档由两个参数定义:概率位 + 保底上限**。「永不保底」不单立规则——T4 的保底上限 = 0 即其统一表达;T1/T2 上限同为 0。
|
- **档由两个参数定义:概率位 + 保底上限**。「永不保底」不单立规则——T4 的保底上限 = 0 即其统一表达;T1/T2 上限同为 0。
|
||||||
- **保底数量挂在型上、不挂在档上**:每个型各自登记「每板至少出几个」。档内登记保底的型数 ≤ 档上限 → 全部兑现;> 上限 → 每板从登记型中随机选定「上限」个兑现,其余型该板按普通概率出现、不保底。
|
- **保底数量挂在型上、不挂在档上**:每个型各自登记「每板至少出几个」。档内登记保底的型数 ≤ 档上限 → 全部兑现;> 上限 → 每板从登记型中随机选定「上限」个兑现,其余型该板按普通概率出现、不保底。
|
||||||
- **补签纪律**:执行序 = 装板摇号(含订阅加权投影)→ 按上限定本期保底型集合 → 校验补签 → 板上全程只读。补签只改类型身份:危险格与安全格不动(补签格可为雷可为安全格,危险格与安全格同池不破)、不消费权重(补签不是一次取号)、清图判定不动、不泄露元信息(补签格与摇号格不可区分)。粒度 = 板,换板重新校验。
|
- **补签纪律**:执行序 = 装板摇号(含偏运硬币投影)→ 按上限定本期保底型集合 → 校验补签 → 板上全程只读。补签只改类型身份:危险格与安全格不动(补签格可为雷可为安全格,危险格与安全格同池不破)、不消费权重(补签不是一次取号)、清图判定不动、不泄露元信息(补签格与摇号格不可区分)。粒度 = 板,换板重新校验。
|
||||||
- **GP 数值锚**:以战斗结束 GP 奖励为锚——小 GP 袋 ≈ 其 1/10、大宝箱 ≈ 其 1 倍(具体数值归调参批)。
|
- **GP 数值锚**:以战斗结束 GP 奖励为锚——小 GP 袋 ≈ 其 1/10、大宝箱 ≈ 其 1 倍(具体数值归调参批)。
|
||||||
- 大宝箱为枚举新增(九型→十型走本文修订流程,不随手加行);微光归通用增益组(五色相不变,组内不细分正好容下)。
|
- 大宝箱为枚举新增(九型→十型走本文修订流程,不随手加行);微光归通用增益组(五色相不变,组内不细分正好容下)。
|
||||||
- **对外稀有度映射**(现行事实源=[核心循环](../../01-核心循环.md)「档位与获取规则」节):T1=普通 / T2=优秀 / T3=稀有 / T4=传说;任何概率提升禁止改变本档保底承诺(保底=承诺非概率)。
|
- **对外稀有度映射**(现行事实源=[核心循环](../../01-核心循环.md)「档位与获取规则」节):T1=普通 / T2=优秀 / T3=稀有 / T4=传说;任何概率提升禁止改变本档保底承诺(保底=承诺非概率)。
|
||||||
@@ -108,7 +108,8 @@
|
|||||||
| 玩家动作 | 安全格 | 危险格 |
|
| 玩家动作 | 安全格 | 危险格 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 开格 | **+类型**:该格资源的正向兑付(奖励) | **−类型**:该格资源的负向兑付(惩罚) |
|
| 开格 | **+类型**:该格资源的正向兑付(奖励) | **−类型**:该格资源的负向兑付(惩罚) |
|
||||||
| 封印(受理即揭示、留到轮末判定——封印格拒绝挖掘,挖开封印格路径不存在) | **−类型**:标错,该格资源的负向兑付(惩罚);该格资源正向不兑付 | **+类型**:标中,该格资源的正向兑付(奖励) |
|
| 封印且留到轮末判定 | **−类型**:标错,该格资源的负向兑付(惩罚) | **+类型**:标中,该格资源的正向兑付(奖励) |
|
||||||
|
| 封印格直接挖开(封印不可逆批 2026-09-19) | 零兑付(四情况④:零惩罚零奖励——标空不判、正向作废) | **−类型**照常(四情况②:只受挖雷一层惩罚——标中不发) |
|
||||||
|
|
||||||
矩阵的定义归本文;把矩阵跑起来的路由(结算队列、判定基线、逐行兑付)归[战斗结算](战斗结算.md)的授予段。blast 型负向 = 警觉。矩阵只描述现行规则;被本矩阵取代的旧体系与历次结构变更(撤旗退役、伏击换装等)只进 git 提交史,不在正文复述。
|
矩阵的定义归本文;把矩阵跑起来的路由(结算队列、判定基线、逐行兑付)归[战斗结算](战斗结算.md)的授予段。blast 型负向 = 警觉。矩阵只描述现行规则;被本矩阵取代的旧体系与历次结构变更(撤旗退役、伏击换装等)只进 git 提交史,不在正文复述。
|
||||||
|
|
||||||
@@ -118,21 +119,21 @@
|
|||||||
|
|
||||||
**兑付形态差异化方向**(方向已裁、内容与落码归后续批次):兑付形态同质化(pierce/magic 同构等)确认为改进对象——各伤害型兑付形态将拉开、各有所司(如单点/面伤/弹射或减益向),九型枚举不动;具体形态设计归用户。
|
**兑付形态差异化方向**(方向已裁、内容与落码归后续批次):兑付形态同质化(pierce/magic 同构等)确认为改进对象——各伤害型兑付形态将拉开、各有所司(如单点/面伤/弹射或减益向),九型枚举不动;具体形态设计归用户。
|
||||||
|
|
||||||
格面资源的一切兑付从九个类型里出,每个类型恰好一行正向、一行负向——正向是玩家操作正确时拿到的东西,负向是操作失误或踩雷时吃到的东西:
|
格面资源的一切兑付从九个类型里出,每个类型恰好一行正向、一行负向(五型 + 2026-09-18 伤害道具批增补 pierce / magic 两型 + 2026-09-20 格面资源八型批增补 action 一型 + 同日 GP+商店房批增补 gp 一型)——正向是玩家操作正确时拿到的东西,负向是操作失误或踩雷时吃到的东西:
|
||||||
|
|
||||||
| 类型 | 正向(奖励) | 负向(惩罚) |
|
| 类型 | 正向(奖励) | 负向(惩罚) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| attack 增伤 | attack_up(主角输出池)——幅度/上限/权重见 `reward.tres` | enrage(敌方输出池)——幅度/上限见 `status_effects.tres` enrage 行 |
|
| attack 增伤 | attack_up(主角输出池)——幅度/上限/权重见 `reward.tres` | enrage(敌方输出池)——幅度/上限见 `status_effects.tres` enrage 行 |
|
||||||
| defense 护甲 | ac_up 盾牌加护(AC 掷点阈值轴,不入池)——幅度/上限/权重见 `reward.tres` | off_guard 失衡(AC 掷点阈值轴负向,不入池)——幅度/上限见 `status_effects.tres` off_guard 行 |
|
| defense 护甲 | ac_up 盾牌加护(AC 掷点阈值轴——2026-09-16 换装,不入池)——幅度/上限/权重见 `reward.tres` | off_guard 失衡(AC 掷点阈值轴负向——2026-09-18 换装,不入池、退出主角防御池)——幅度/上限见 `status_effects.tres` off_guard 行 |
|
||||||
| heal 回血 | heal_minor(满血零兑付照旧)——威力/权重见 `reward.tres` | heal_backlash 直伤:战斗结算直接扣血,不经增益状态——威力见 `reward.tres` |
|
| heal 回血 | heal_minor(满血零兑付照旧)——威力/权重见 `reward.tres` | heal_backlash 直伤:战斗结算直接扣血,不经增益状态——威力见 `reward.tres` |
|
||||||
| blast 群伤 | spark_aoe 全体存活敌各吃一笔——威力/权重见 `reward.tres` | enemy_alert 警觉:敌方全体护甲等级 +1/层(`status_effects.tres` alert 行)——见 `reward.tres` |
|
| blast 群伤 | spark_aoe 全体存活敌各吃一笔——威力/权重见 `reward.tres` | enemy_alert 警觉:敌方全体护甲等级 +1/层(`status_effects.tres` alert 行)——见 `reward.tres` |
|
||||||
| weaken 削弱 | weaken(敌方输出池;同名重复授予只加时长)——幅度见 `status_effects.tres` weaken 行 | sapped(主角输出池)——幅度见 `status_effects.tres` sapped 行 |
|
| weaken 削弱 | weaken(敌方输出池;同名重复授予只刷新剩余次数——2026-09-18 续时定案)——幅度见 `status_effects.tres` weaken 行 | sapped(主角输出池)——幅度见 `status_effects.tres` sapped 行 |
|
||||||
| action 行动点 | ap_up:下轮行动点 +1——见 `reward.tres` | ap_drain 迟滞:下轮行动点 −1——见 `reward.tres` |
|
| action 行动点 | ap_up:下轮行动点 +1——见 `reward.tres` | ap_drain 迟滞:下轮行动点 −1——见 `reward.tres` |
|
||||||
| gp 财货 | gp_gain GP 袋:战斗内 GP 缓冲 +power,战斗完成随 GP 掉落统一入钱包账本(兑付编排归[战斗结算](战斗结算.md)、账本归[冒险结构](../冒险循环/冒险结构.md))——威力/权重见 `reward.tres` | gp_loss 破财:战斗内 GP 缓冲 −power,weight=0 纯字典不参与摇号——见 `reward.tres` |
|
| gp 财货 | gp_gain GP 袋:战斗内 GP 缓冲 +power,战斗完成随 GP 掉落统一入钱包账本(兑付编排归[战斗结算](战斗结算.md)、账本归[冒险结构](../冒险循环/冒险结构.md))——威力/权重见 `reward.tres` | gp_loss 破财:战斗内 GP 缓冲 −power,weight=0 纯字典不参与摇号——见 `reward.tres` |
|
||||||
| pierce 穿刺 | pierce_strike 穿刺弹:单目标克制直伤(attack_type=pierce 查克制矩阵,必中全额不掷点;目标 = 固定顺位最前存活敌)——威力/权重见 `reward.tres` | pierce_snare 穿刺陷阱:主角直伤,不经增益状态——威力见 `reward.tres` |
|
| pierce 穿刺 | pierce_strike 穿刺弹:单目标克制直伤(attack_type=pierce 查克制矩阵,必中全额不掷点;目标 = 固定顺位最前存活敌)——威力/权重见 `reward.tres` | pierce_snare 穿刺陷阱:主角直伤,不经增益状态——威力见 `reward.tres` |
|
||||||
| magic 魔法 | magic_bolt 魔法矢:单目标克制直伤(attack_type=magic,同上)——威力/权重见 `reward.tres` | magic_recoil 魔法反噬:主角直伤,不经增益状态——威力见 `reward.tres` |
|
| magic 魔法 | magic_bolt 魔法矢:单目标克制直伤(attack_type=magic,同上)——威力/权重见 `reward.tres` | magic_recoil 魔法反噬:主角直伤,不经增益状态——威力见 `reward.tres` |
|
||||||
|
|
||||||
设计意图:读敌拍板的路线规划——敌方要放大招时抢盾牌加护、怪重叠时抢削弱,惩罚侧则镜像同一批类型。类型清单是封闭的:加新类型等于修订本文档,不是调参数(格面 GP 经用户拍板入池,定位"低概率惊喜获取"、量与战斗掉落相当,兑付进战斗内缓冲而非当场生效)。
|
设计意图:读敌拍板的路线规划——敌方要放大招时抢盾牌加护、怪重叠时抢削弱,惩罚侧则镜像同一批类型。类型清单是封闭的:加新类型等于修订本文档,不是调参数(2026-09-18 伤害道具批即按此修订五→七;2026-09-20 GP+商店房批按同一流程修订八→九——格面 GP 由用户拍板入池,定位"低概率惊喜获取"、量与战斗掉落相当,兑付进战斗内缓冲而非当场生效)。
|
||||||
|
|
||||||
凡"该兑付但没生效"——增益挂满层、满血捡到 heal 正向、场上无敌可打——一律在结算明细里明写一行"奖励未生效",不给折算补偿,也不静默消失。把兑付改成跳过轮末结算直接生效,同样在禁止之列。
|
凡"该兑付但没生效"——增益挂满层、满血捡到 heal 正向、场上无敌可打——一律在结算明细里明写一行"奖励未生效",不给折算补偿,也不静默消失。把兑付改成跳过轮末结算直接生效,同样在禁止之列。
|
||||||
|
|
||||||
@@ -146,9 +147,9 @@
|
|||||||
|
|
||||||
### 清图奖励对象:整图封装,可配置可替换
|
### 清图奖励对象:整图封装,可配置可替换
|
||||||
|
|
||||||
清图奖励不属于任何一格的格面资源——它是作用域为整张板的独立奖励对象:把一张图的雷全部清完(全部安全格完成——挖开或封印,口径见[排雷玩法](../排雷循环/排雷玩法.md))时结算发的那一份。装板摇号时与格子资源同批判尾摇定身份;清图批兑付恰好一次;完美封印(零误标且至少一次封印标中)追加第二份同身份兑付。清图奖励只在清图批兑付:弃图刷新不触发清图事件,换来的新图不发清图奖励;刷新专长的固定 GP 收益走战斗内缓冲入账,不属清图奖励封装。
|
清图奖励不属于任何一格的格面资源——它是作用域为整张板的独立奖励对象:把一张图的雷全部清完(全部安全格开完)时结算发的那一份。装板摇号时与格子资源同批判尾摇定身份;清图批兑付恰好一次;完美封印(零误标且至少一次封印标中)追加第二份同身份兑付。
|
||||||
|
|
||||||
它是可配置可替换的封装:数据面上是清图池里的一行(现行默认槽 clear_default),换行即换内容,机制零改动。按图类型差异化已留结构位——`clear_<图类型>` 命名空间预留,不同地图类型可以配不同的清图奖励;词表现行 = {dungeon, underdark, deep_underdark}(玩家侧「地图类型」),差异化内容启用随内容批。
|
它是可配置可替换的封装:数据面上是清图池里的一行(现行默认槽 clear_default),换行即换内容,机制零改动。按图类型差异化已留结构位——`clear_<图类型>` 命名空间预留,不同地图类型可以配不同的清图奖励;词表现行 = {dungeon, underdark, deep_underdark}(2026-09-19 定稿两值、第三关内容批 2026-09-20 增 deep_underdark,玩家侧「地图类型」),差异化内容启用随内容批。
|
||||||
|
|
||||||
| 清图奖励规则 | 含义 |
|
| 清图奖励规则 | 含义 |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -157,8 +158,29 @@
|
|||||||
| 可配置可替换 | 内容 = 池行值;允许即时类(当场兑付,不入库) |
|
| 可配置可替换 | 内容 = 池行值;允许即时类(当场兑付,不入库) |
|
||||||
| 图类型差异化是预留插槽 | 现行只有默认槽;结构位已留,启用走棋盘生成词表落定 |
|
| 图类型差异化是预留插槽 | 现行只有默认槽;结构位已留,启用走棋盘生成词表落定 |
|
||||||
|
|
||||||
|
持有弃图回收专长时,同一清图奖励对象也可按旧图探索进度部分回收;这不改变正常清图与清图奖励的定义,例外口径见下节。
|
||||||
|
|
||||||
举证:本节为封装与流程规则,无计算。
|
举证:本节为封装与流程规则,无计算。
|
||||||
|
|
||||||
|
### 弃图回收:按旧图探索进度兑付(设计定稿,待实现)
|
||||||
|
|
||||||
|
弃图回收让玩家不必挖完最后几个安全格,也能把已经推进的探索换成一部分清图奖励。它只读取被放弃的旧图,不把旧图判为清图,也不把新图判为已清图。
|
||||||
|
|
||||||
|
旧图退役前记录三项读数:装板初始已开安全格数、装板初始未开安全格数、退役时已开安全格数。探索进度定义为:
|
||||||
|
|
||||||
|
```
|
||||||
|
探索进度 =(退役时已开安全格数 − 装板初始已开安全格数)÷ 装板初始未开安全格数
|
||||||
|
```
|
||||||
|
|
||||||
|
进度限制在 0~1。玩家付费挖开与连锁展开的安全格都真实推进探索,计入分子;装板时白送的初始格、封锁格与危险格不计入。没有新探索就刷新,进度为 0,不能获得回收奖励。
|
||||||
|
|
||||||
|
回收兑付的是旧图在装板期已经摇定的清图奖励对象,按探索进度取对应份额;具体比例、档位、取整与数值归调参。它只发基础奖励的进度份额:
|
||||||
|
|
||||||
|
- 不触发完美封印加倍,不产生清图事件,不执行正常清图的整板兑付。
|
||||||
|
- 同一旧图只在成功退役时回收一次;新图不继承旧图探索进度。
|
||||||
|
- 刷新被拒绝时旧图不退役,也不回收;成功后的兑付时机归[战斗结算](战斗结算.md)本轮授予段。
|
||||||
|
- 正常清图仍发完整清图奖励对象;弃图回收不得让同等探索投入的收益无条件高于正常清图。
|
||||||
|
|
||||||
## 依赖与输出
|
## 依赖与输出
|
||||||
|
|
||||||
本系统被两侧夹住:事实与数值从上游来,调用与呈现往下游去。下表就是删除任何一方时的影响面清单。
|
本系统被两侧夹住:事实与数值从上游来,调用与呈现往下游去。下表就是删除任何一方时的影响面清单。
|
||||||
@@ -176,9 +198,9 @@
|
|||||||
| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 权重、档位、威力与池内容的调参所有权(全部 provisional) |
|
| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 权重、档位、威力与池内容的调参所有权(全部 provisional) |
|
||||||
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 呈现义务归其:已开格资源身份常读、类型图标预读的呈现深度、结算明细行、清图奖励行强调 |
|
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 呈现义务归其:已开格资源身份常读、类型图标预读的呈现深度、结算明细行、清图奖励行强调 |
|
||||||
| 下游 | [教学引导](../表现与支撑/教学引导.md) | "读敌拍板、抢类型"教学口径的来源 |
|
| 下游 | [教学引导](../表现与支撑/教学引导.md) | "读敌拍板、抢类型"教学口径的来源 |
|
||||||
| 下游 | [秘宝](../跨局循环/秘宝.md) | 相邻:秘宝件的装配与使用归其管;预读类道具读取本系统的身份查询面(现行零投放,接口面保留) |
|
| 下游 | [秘宝](../跨局循环/秘宝.md) | 相邻:秘宝件的装配与使用归其管;预读类道具读取本系统的身份查询面(现行零投放——原承载件探宝罗盘已退役,接口面保留) |
|
||||||
|
|
||||||
负空间:本系统不订阅事件、不画界面、除摇号外不用任何随机数;何时调接口、按什么顺序调,全归[战斗结算](战斗结算.md)。库存、道具使用窗口、可选类供给已整体下线,不再属于本系统。
|
负空间:本系统不订阅事件、不画界面、除摇号外不用任何随机数;何时调接口、按什么顺序调,全归[战斗结算](战斗结算.md)。库存、道具使用窗口、可选类供给已随可选类道具删除(2026-09-15)整体下线,不再属于本系统。
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
|
|
||||||
@@ -194,7 +216,7 @@
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P1 | ~~功能道具渠道~~(已由秘宝体系承接——局外同调件:营地解锁 + 同调位装配) | 数值型伤害/治疗道具已删除(2026-09-15 用户定);本系统只留结构位不变 |
|
| P1 | ~~功能道具渠道~~(已由秘宝体系承接——局外同调件:营地解锁 + 同调位装配,同调实施批 2026-10-03 落地;关卡节点渠道形态顺带退役) | 数值型伤害/治疗道具已删除(2026-09-15 用户定);本系统只留结构位不变 |
|
||||||
| P1 | 清图池按图类型差异化 | 默认槽之外的结构位已留;词表现行三值({dungeon, underdark, deep_underdark}),差异化行随内容批配置 |
|
| P1 | 清图池按图类型差异化 | 默认槽之外的结构位已留;词表现行三值({dungeon, underdark, deep_underdark}),差异化行随内容批配置 |
|
||||||
| P1 | 未开格资源类型的呈现深度 | 基础档已定——微光只读类型不读危险格与安全格(2026-10-07 案甲,实施归呈现批、待办清单在案);更深档与推理的界线另议 |
|
| P1 | 未开格资源类型的呈现深度 | 基础档已定——微光只读类型不读危险格与安全格(2026-10-07 案甲,实施归呈现批、待办清单在案);更深档与推理的界线另议 |
|
||||||
| P1 | 增攻(attack)型行值与权重终调 | 内容决策,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
| P1 | 增攻(attack)型行值与权重终调 | 内容决策,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
||||||
@@ -225,9 +247,9 @@
|
|||||||
| sapped | weaken | 负向 | weight=0 不参与摇号·power 不消费(percent 行 effect_id → 状态效果表 sapped 引用) | 同上 | 同上 |
|
| sapped | weaken | 负向 | weight=0 不参与摇号·power 不消费(percent 行 effect_id → 状态效果表 sapped 引用) | 同上 | 同上 |
|
||||||
| clear_blast | blast | 正向 | clear_default 池·power [0,999]·power_min/power_max 可选区间·weight [0,999] | 同上 | 清图槽 |
|
| clear_blast | blast | 正向 | clear_default 池·power [0,999]·power_min/power_max 可选区间·weight [0,999] | 同上 | 清图槽 |
|
||||||
|
|
||||||
摇号只消费正向格面池的权重(类型频次由此涌现——具体权重读 `reward.tres`);负向行是纯兑付字典,按(类型,极性)查表取用,不消费权重。权重分布按四档概率结构组织(档成员与保底规则见「四档概率结构与保底」节;现行权重为基准锚,数值调整归调参批)。clear_blast 对全体存活敌各吃一笔当场兑付的 flat 伤害。奖励配置表已下线——注入概率、按板保底等参数全部失义(「按板保底」指已删除的可选类道具注入保底,与四档结构的型级保底无关)。
|
摇号只消费正向格面池的权重(类型频次由此涌现——具体权重读 `reward.tres`);负向行是纯兑付字典,按(类型,极性)查表取用,不消费权重。权重分布按四档概率结构组织(档成员与保底规则见「四档概率结构与保底」节;现行权重为基准锚,数值调整归调参批)。clear_blast 对全体存活敌各吃一笔当场兑付的 flat 伤害。奖励配置表已随可选类删除下线——注入概率、按板保底等参数全部失义(旧「按板保底」指已删除的可选类道具注入保底,与四档结构的型级保底无关)。
|
||||||
|
|
||||||
结构冻结(改动走本文修订流程,不走调参):九型封闭枚举、危险格与安全格同池、极性矩阵、装板期预分配且无重摇、负向恒即时无库存、清图恒非空、除摇号外零随机(四档保底补签属装板期校验环节,消费摇号环节随机流,非重摇——补签后身份全程只读)。
|
结构冻结(改动走本文修订流程,不走调参):九型封闭枚举(伤害道具批 2026-09-18 修订五→七、格面资源八型批 2026-09-20 修订七→八、同日 GP+商店房批修订八→九)、危险格与安全格同池、极性矩阵、装板期预分配且无重摇、负向恒即时无库存、清图恒非空、除摇号外零随机(四档保底补签属装板期校验环节,消费摇号环节随机流,非重摇——补签后身份全程只读)。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
@@ -238,6 +260,9 @@
|
|||||||
- 类型封闭与字典完整:表里出现九型之外的类型、或任一型缺正向/负向行,加载拒绝。
|
- 类型封闭与字典完整:表里出现九型之外的类型、或任一型缺正向/负向行,加载拒绝。
|
||||||
- 未生效可见:满层增益、满血正向治疗、无存活敌的群伤,各自在结算明细记"奖励未生效"行,零折算、零补偿。
|
- 未生效可见:满层增益、满血正向治疗、无存活敌的群伤,各自在结算明细记"奖励未生效"行,零折算、零补偿。
|
||||||
- 加载护栏:池空、清图池无正当量、增益引用悬空——任一命中即加载时返回错误并中止;默认内容加载通过。
|
- 加载护栏:池空、清图池无正当量、增益引用悬空——任一命中即加载时返回错误并中止;默认内容加载通过。
|
||||||
|
- 弃图回收进度:付费挖开与连锁展开的安全格计入探索,初始格、封锁格与危险格不计;无新探索时进度为 0,不能获得回收奖励。
|
||||||
|
- 弃图回收恰一次:成功退役的旧图按当次探索进度回收其预摇清图奖励对象,新图不继承进度,同一旧图不能重复回收;被拒绝的刷新零兑付。
|
||||||
|
- 回收不是清图:弃图回收不触发完美封印加倍、清图事件或正常清图整板兑付;正常清图仍发完整清图奖励对象。
|
||||||
- 表实一致:数据表字段与奖励表字段定义逐字段一致。
|
- 表实一致:数据表字段与奖励表字段定义逐字段一致。
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
# 增益状态
|
# 增益状态
|
||||||
|
|
||||||
> 一句话:增益/减益的状态池、叠层与衰减
|
> 一句话:增益/减益的状态池、叠层与衰减
|
||||||
> 状态:已定稿;现行为 v1.7
|
> 状态:已定稿(自旧体系迁移);现行为 v1.2
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
战斗里有一类效果不在当场一次性用掉,而要管上几次结算:挖开安全格拿到的主角增益、封印标中带来的怪物削弱、踩雷喂给怪物的增强(警觉——blast 型负向)、标错封印招来的负向兑付,都是这类。本文把它们统称"状态":发给主角的有益效果叫增益(失衡与乏力是例外——它们是发给主角的减益),发给敌人的负面效果叫减益;敌方侧的增强同样是状态——几个方向共用同一个状态池。
|
战斗里有一类效果不在当场一次性用掉,而要管上几次结算:挖开安全格拿到的主角增益、封印标中带来的怪物削弱、踩雷喂给怪物的增强(警觉——blast 型负向)、标错封印招来的负向兑付,都是这类。本文把它们统称"状态":发给主角的有益效果叫增益(失衡与乏力是例外——它们是发给主角的减益),发给敌人的负面效果叫减益;敌方侧的增强同样是状态——几个方向共用同一个状态池。
|
||||||
|
|
||||||
增益状态就是这一个状态池:它收下全部状态,用同一套规矩管理——发入、合并(同一种效果重复拿到时按表行策略处理:叠层加一,或把剩余次数累加上本次授予的时长——读 `status_effects.tres` 逐行 stack_policy)、衰减(每次结算后剩余次数减一,减到零效果消失)、清空(战斗结束全部清除)。没有它,几类效果得各写一套计时逻辑,结算明细也无法逐行指回"这效果是我哪步棋带来的"。状态池管机制、不管数值从哪来:某个效果该多大,由各收益系统的表去定,状态池只照章入列、按次衰减。
|
增益状态就是这一个状态池:它收下全部状态,用同一套规矩管理——发入、合并(同一种效果重复拿到时按表行策略处理:叠层加一,或只刷新剩余次数——读 `status_effects.tres` 逐行 stack_policy)、衰减(每次结算后剩余次数减一,减到零效果消失)、清空(战斗结束全部清除)。没有它,几类效果得各写一套计时逻辑,结算明细也无法逐行指回"这效果是我哪步棋带来的"。状态池管机制、不管数值从哪来:某个效果该多大,由各收益系统的表去定,状态池只照章入列、按次衰减。
|
||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
| 寿命 = 一场战斗 | 战斗开始时状态池为空,结束全部清空,不跨到下一场战斗 |
|
| 寿命 = 一场战斗 | 战斗开始时状态池为空,结束全部清空,不跨到下一场战斗 |
|
||||||
| 跨轮跨图延续 | 同一场战斗里换新雷图、弃图刷新都不清空——状态跟着战斗走,不跟图走 |
|
| 跨轮跨图延续 | 同一场战斗里换新雷图、弃图刷新都不清空——状态跟着战斗走,不跟图走 |
|
||||||
| 全程零随机 | 授予、合并、衰减、列举顺序全部确定,可回放 |
|
| 全程零随机 | 授予、合并、衰减、列举顺序全部确定,可回放 |
|
||||||
| 实例按个体归属 | 每条状态实例归属到一个个体:主角方归主角,敌方每只敌人各持自己的实例集,个体之间互不共享、互不可见。"对全体"=对每个存活敌各发一条实例,各自独立合并与衰减;发给谁由授予路径按目标规则定,见〈目标规则与个体归属〉节 |
|
| 敌方侧共享 | 对敌效果默认对全体存活敌人生效,层数全体共享一份;"只作用于其中一只"的例外见〈单体寻址扩展位〉节,随首个单体效果的内容批进游戏 |
|
||||||
|
|
||||||
举证:本节为状态池结构规则,无计算。
|
举证:本节为状态池结构规则,无计算。
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
| 封印标中 | 轮末封印判定标中(危险格被控制) | 敌方,削弱 |
|
| 封印标中 | 轮末封印判定标中(危险格被控制) | 敌方,削弱 |
|
||||||
| 踩雷 | 挖开危险格并惊动 | 敌方,增强 |
|
| 踩雷 | 挖开危险格并惊动 | 敌方,增强 |
|
||||||
| 清图奖励 | 清图奖励槽含增益时 | 随行定,路径归[地图战斗资源](地图战斗资源.md)定稿 |
|
| 清图奖励 | 清图奖励槽含增益时 | 随行定,路径归[地图战斗资源](地图战斗资源.md)定稿 |
|
||||||
| 标空封印 | 轮末封印判定标空(标了但格不是雷) | 该安全格格面资源的负向兑付(极性矩阵"标错"分支);载体裁决归[战斗结算](战斗结算.md) |
|
| 标空封印 | 轮末封印判定标空(标了但格不是雷) | 该安全格格面资源的负向兑付(极性矩阵"标错"分支——2026-09-15 起不再三选一);载体裁决归[战斗结算](战斗结算.md) |
|
||||||
|
|
||||||
状态池是只登记、不裁决的仓库:上游叫它施加几次,它就登记几次。同一笔事实被重复转化两次,就入两层——它不去重、不合并事实,"事实到授予恰好一次"由战斗结算保证。同轮多笔授予按调用方给定的次序先后入列,状态池保证入列顺序稳定可读。
|
状态池是只登记、不裁决的仓库:上游叫它施加几次,它就登记几次。同一笔事实被重复转化两次,就入两层——它不去重、不合并事实,"事实到授予恰好一次"由战斗结算保证。同轮多笔授予按调用方给定的次序先后入列,状态池保证入列顺序稳定可读。
|
||||||
|
|
||||||
@@ -76,14 +76,14 @@
|
|||||||
|
|
||||||
举证:本节为授予路径与登记规则,无计算。
|
举证:本节为授予路径与登记规则,无计算。
|
||||||
|
|
||||||
### 同名状态再拿到:叠层、累加、并存
|
### 同名状态再拿到:叠层、刷新、并存
|
||||||
|
|
||||||
同一种状态还没消失又拿到一份,怎么合并由状态表每行的合并策略字段说了算,共三种。合并在授予那一刻由状态池完成;多个状态在结算里按什么先后起作用,是战斗结算的编排——两件事互不干扰。
|
同一种状态还没消失又拿到一份,怎么合并由状态表每行的合并策略字段说了算,共三种。合并在授予那一刻由状态池完成;多个状态在结算里按什么先后起作用,是战斗结算的编排——两件事互不干扰。
|
||||||
|
|
||||||
| 合并策略 | 重复授予时发生什么 | 说明 |
|
| 合并策略 | 重复授予时发生什么 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 叠加 | 层数加一;剩余结算次数不动——只有首次授予定钟 | 现行内容行多数用叠加(逐行合并策略读 `status_effects.tres`) |
|
| 叠加 | 层数加一;剩余结算次数不动——只有首次授予定钟 | 现行内容行多数用叠加(逐行合并策略读 `status_effects.tres`) |
|
||||||
| 累加 | 剩余结算次数加上本次授予的时长——技能施放行带覆盖时长时按覆盖值加;层数不变 | 现行内容行七行用累加(削弱行 weaken、增益技行 empower / fortify / defensive_stance、主角增益行 attack_up / ac_up);重复拿一次就多攒一段时长,同一轮拿几份攒几段,停手后按剩余次数逐轮耗完;逐行读 `status_effects.tres` |
|
| 刷新 | 剩余结算次数重置为该实例首次授予时的初始值,层数不变 | 刷新类内容行已就位——削弱行 weaken(2026-09-18 续时定案)、增益技行 empower / fortify、**主角增益行 attack_up / ac_up(2026-09-20 用户拍板「只续时不叠层」,全状态表增益/减益两侧合并语义就此统一为:主角可重复获取的增益与减益一律续时、不叠层)**;逐行读 `status_effects.tres` |
|
||||||
| 并存 | 新建一份独立实例,两份各算各的 | 同上 |
|
| 并存 | 新建一份独立实例,两份各算各的 | 同上 |
|
||||||
|
|
||||||
并存分支没有满层上限,但状态池规模天然有界:实例数的上界就是受理过的授予数——多受理一份就多一份实例,多少份在授予那一刻就完全确定,不会无限膨胀。
|
并存分支没有满层上限,但状态池规模天然有界:实例数的上界就是受理过的授予数——多受理一份就多一份实例,多少份在授予那一刻就完全确定,不会无限膨胀。
|
||||||
@@ -94,30 +94,23 @@
|
|||||||
|
|
||||||
举证:本节为合并分支规则,无计算——满层判定就是一次"层数等于上限"的比较。
|
举证:本节为合并分支规则,无计算——满层判定就是一次"层数等于上限"的比较。
|
||||||
|
|
||||||
### 目标规则与个体归属:效果发给谁
|
### 单体寻址扩展位:只作用于其中一个敌人
|
||||||
|
|
||||||
状态实例按个体归属(硬规矩见「一个状态池管全部方向」);一笔授予发给谁,由授予路径在授予那一刻按目标规则定。目标规则是封闭词表,现行四词:
|
对敌效果默认全体共享(硬规矩见「一个状态池管全部方向」);要"只削弱其中一只"时,走本节定好的扩展位。本节是接口定稿:目标字段与五条语义都已裁定,实现随首个单体效果的内容批一起进游戏——在那之前,全部对敌效果照旧全体共享,状态池里不会出现单体实例。
|
||||||
|
|
||||||
| 目标规则 | 语义 | 现行消费者 |
|
|
||||||
|---|---|---|
|
|
||||||
| 全体存活敌 | 对每个存活敌各发一条实例,各自独立合并、衰减、随体清亡 | 封印标中削弱、踩雷增强、警觉加层 |
|
|
||||||
| 自己 | 归施放者个体 | 敌方增益技(蓄力/硬化/护身) |
|
|
||||||
| 单体 | 点名一只:认生成序号(开战逐只编号、整场不变),不认名字——混编遭遇里同名敌种可多只 | 暂无消费者,随首个单体效果内容批启用 |
|
|
||||||
| 顺位最前 | 取生成序最前的存活个体 | 主角先手攻击、单目标克制直伤 |
|
|
||||||
|
|
||||||
词表扩充随首个用到新词的内容批进行,不预先建面。禁随机摇目标("全程零随机"硬规矩沿用)。
|
|
||||||
|
|
||||||
| 规矩 | 内容 |
|
| 规矩 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 合并匹配认个体 | 同名状态只在同一个体名下按合并策略结算;不同个体同名实例互不相干、互不可见 |
|
| 目标记在实例上 | 状态实例多一个可选的目标字段:不填 = 全体共享(现行唯一形态),填了 = 只作用于这一只敌人。目标认敌人的生成序号(开战逐只编号、整场战斗不变),不认名字——混编遭遇里同名敌种可以多只 |
|
||||||
| 个体死亡即清 | 个体死亡,其名下实例全部随体移除,不转移、不并回别处 |
|
| 单体与否由授予方定 | 这次发全体还是发单体,由发效果的路径在授予那一刻定(敌方技能行、封印、清图奖励各自带各自的目标规则),状态定义表不加列——同一个状态名允许既有全体来源又有单体来源。选哪只由授予方规则点名(如自己、顺位最前),禁随机摇目标("全程零随机"硬规矩沿用) |
|
||||||
| 呈现各读各的 | 每只立绘的状态图标行只读它自己名下的实例;结算明细行归因照旧,单体授予写明目标是哪一只 |
|
| 共享与单体并存,独立结算 | 同名效果的共享实例与单体实例互不合并,各算各的:各自叠层、各自衰减,兑付时逐行相加。合并匹配从"只认状态名"扩为"状态名与目标都相同才合并" |
|
||||||
|
| 目标死亡即移除 | 单体实例跟着目标走:目标死亡当场移除该实例,不转移给别人、也不变回全体——"挪给别人"本就是已退役的转移接口决定,单体实例同样不豁免 |
|
||||||
|
| 呈现挂目标立绘 | 共享效果维持"各立绘同值";单体效果只有目标那一只的立绘挂状态图标(血条正下方既有位置),结算明细行的归因照旧,并写明目标是哪一只 |
|
||||||
|
|
||||||
举证:本节为结构规则与语义裁定,无计算。
|
举证:本节为结构规则与语义裁定,无计算。
|
||||||
|
|
||||||
### 剩余次数怎么倒数:按结算次数衰减
|
### 剩余次数怎么倒数:按结算次数衰减
|
||||||
|
|
||||||
每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。现行累加行里主角增益两行持续 1、削弱与敌方增益技行(含护身)持续 2——累加语义下重复拿一次就按本次授予时长多攒一段,同一轮拿几份攒几段;跨轮持续的状态,寿命由表行初始值表达,给几就活几次结算。
|
每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。MVP 时期六行内容均为一次性(削弱后改续时——见 git 提交史;2026-09-20 起主角增益两行也走续时、duration 表值仍为 1——重复拿等于重新获得一次当轮增益);跨轮持续的状态,寿命由表行初始值表达,给几就活几次结算。
|
||||||
|
|
||||||
```
|
```
|
||||||
一轮结算:查询生效清单 → 逐行兑付(层数 × 行值)→ 轮末衰减(全部实例剩余次数 −1)→ 归零实例移除
|
一轮结算:查询生效清单 → 逐行兑付(层数 × 行值)→ 轮末衰减(全部实例剩余次数 −1)→ 归零实例移除
|
||||||
@@ -147,14 +140,14 @@
|
|||||||
|
|
||||||
| 例子 | 状态池输出 | 消费侧读法 |
|
| 例子 | 状态池输出 | 消费侧读法 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 暴走叠两层 | +(2 × enrage 行幅度)(读表;越出单行取值域,原样输出) | 压在天花板 +100% 上:敌方输出乘区封顶 ×2(削弱非叠层行——"叠两层压地板 −100% 归零"的读法不成立) |
|
| 暴走叠两层 | +(2 × enrage 行幅度)(读表;越出单行取值域,原样输出) | 压在天花板 +100% 上:敌方输出乘区封顶 ×2(削弱已改续时——"叠两层压地板 −100% 归零"的读法随 2026-09-18 结构修复批退役) |
|
||||||
| 主角盾牌加护再拿一份 | 层数恒 1、剩余结算次数累加本次授予的时长 | 不经任何池:掷点判定阈值 = 主角基准(读 hero 表)+ 层数(现行 +1,局内可达 AC 上限 11) |
|
| 主角盾牌加护再拿一份 | 层数恒 1、剩余结算次数重置(refresh——2026-09-20 主角增益续时批) | 不经任何池:掷点判定阈值 = 主角基准(读 hero 表)+ 层数(现行 +1——上限 2 层叠读取法退役,局内可达 AC 上限 11) |
|
||||||
|
|
||||||
状态池还有一条快照纪律:实例的幅度、初始次数、量纲在授予那一刻从表行拷贝。战斗中配置表即使被重载,已授予实例不受任何影响,只影响后续授予。
|
状态池还有一条快照纪律:实例的幅度、初始次数、量纲在授予那一刻从表行拷贝。战斗中配置表即使被重载,已授予实例不受任何影响,只影响后续授予。
|
||||||
|
|
||||||
### 现在有哪些状态:现行十行内容
|
### 现在有哪些状态:现行九行内容
|
||||||
|
|
||||||
现行状态表恰有十行:主角侧四行(增伤/盾牌加护两增益 + 失衡/乏力两减益)、敌方侧六行(削弱/暴走/警觉/蓄力/硬化/护身——警觉为 blast 型负向踩雷载体;护身 defensive_stance 为敌方低血防御增益〔地精池情境技「孤注守势」载体〕)。全部用同构实例承载;数值全部 provisional(临时值,过锚验收后才定稿)。
|
现行状态表恰有九行:主角侧四行(增伤/盾牌加护两增益 + 失衡/乏力两减益)、敌方侧五行(削弱/暴走/警觉/蓄力/硬化——警觉为 blast 型负向踩雷载体,2026-09-20 伏击退役后进表)。全部用同构实例承载;数值全部 provisional(临时值,过锚验收后才定稿)。
|
||||||
|
|
||||||
| 字段 | 取值 | 说明 |
|
| 字段 | 取值 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -162,27 +155,26 @@
|
|||||||
| display_name | 文本 | 界面与结算明细用名 |
|
| display_name | 文本 | 界面与结算明细用名 |
|
||||||
| target_side | hero / enemy | 作用侧 |
|
| target_side | hero / enemy | 作用侧 |
|
||||||
| magnitude | 整数 | 幅度:百分比行 ∈ [−100,100] 且非 0;固定值行 ≥ 1;护甲等级行 ∈ [−20,20] 且非 0 |
|
| magnitude | 整数 | 幅度:百分比行 ∈ [−100,100] 且非 0;固定值行 ≥ 1;护甲等级行 ∈ [−20,20] 且非 0 |
|
||||||
| unit | percent / flat / ac | 百分比修正 / 固定值 / 护甲等级(掷点折扣判定阈值轴) |
|
| unit | percent / flat / ac | 百分比修正 / 固定值 / 护甲等级(掷点折扣判定阈值轴——2026-09-16 护甲等级掷点批新增) |
|
||||||
| duration_settlements | 整数 [1,99] | 授予时初始剩余结算次数(1 = 一次性) |
|
| duration_settlements | 整数 [1,99] | 授予时初始剩余结算次数(1 = 一次性) |
|
||||||
| stack_policy | stack / accumulate / independent | 同名再授予的合并策略(叠加 / 累加 / 并存) |
|
| stack_policy | stack / refresh / independent | 同名再授予的合并策略 |
|
||||||
| max_stack | 整数 [1,16] | 叠层上限,仅叠加策略消费 |
|
| max_stack | 整数 [1,16] | 叠层上限,仅叠加策略消费 |
|
||||||
|
|
||||||
| 状态 | 效果一句话 | 发给谁 | 幅度(现行值) | 时限 / 合并 | 来源类别 |
|
| 状态 | 效果一句话 | 发给谁 | 幅度(现行值) | 时限 / 合并 | 来源类别 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| attack_up 增伤 | 主角攻击提升 | 主角 | 见 `data/tables/status_effects.tres` attack_up 行 | 时限/上限读表 / 累加(层数恒 1) | 安全格 |
|
| attack_up 增伤 | 主角攻击提升 | 主角 | 见 `data/tables/status_effects.tres` attack_up 行 | 时限/上限读表 / 刷新(2026-09-20 续时批 stack→refresh,层数恒 1) | 安全格 |
|
||||||
| ac_up 盾牌加护 | 主角护甲等级提升(掷点折扣判定阈值——AC 轴,不入池) | 主角 | 见 `status_effects.tres` ac_up 行 | 时限/上限读表 / 累加(层数恒 1) | 安全格 |
|
| ac_up 盾牌加护 | 主角护甲等级提升(掷点折扣判定阈值——AC 轴,不入池) | 主角 | 见 `status_effects.tres` ac_up 行(2026-09-16 换装,原 defense_up 行已退役) | 时限/上限读表 / 刷新(2026-09-20 续时批 stack→refresh,层数恒 1) | 安全格 |
|
||||||
| alert 警觉 | 敌方护甲等级 +1/层 | 敌方 | 见 `status_effects.tres` alert 行 | 1 结算 / 叠加读表 | 踩雷 / 标空封印(blast 型负向) |
|
| alert 警觉 | 敌方护甲等级 +1/层 | 敌方 | 见 `status_effects.tres` alert 行 | 1 结算 / 叠加读表 | 踩雷 / 标空封印(blast 型负向) |
|
||||||
| weaken 削弱 | 敌方攻击被削弱(同名重复标中只加时长、层数恒 1) | 敌方 | 见 `status_effects.tres` weaken 行(取值域 [60,85],取负生效) | 时限读表 / 累加 | 封印标中 |
|
| weaken 削弱 | 敌方攻击被削弱(同名重复标中只刷新剩余次数、层数恒 1) | 敌方 | 见 `status_effects.tres` weaken 行(取值域 [60,85],取负生效) | 时限读表 / 刷新(2026-09-18 续时定案) | 封印标中 |
|
||||||
| enrage 暴走 | 敌方攻击提升 | 敌方 | 见 `status_effects.tres` enrage 行 | 时限/上限读表 / 叠加 | 标空封印反噬 / 踩雷(attack 型负向) |
|
| enrage 暴走 | 敌方攻击提升 | 敌方 | 见 `status_effects.tres` enrage 行 | 时限/上限读表 / 叠加 | 标空封印反噬 / 踩雷(attack 型负向) |
|
||||||
| off_guard 失衡 | 主角护甲等级降低(AC 轴——掷点判定阈值下调、更易被命中) | 主角 | 见 `status_effects.tres` off_guard 行 | 时限/上限读表 / 叠加 | 标空封印反噬 / 踩雷(defense 型负向)/ 敌方妨害技(蛛网束缚载体,duration 由技能行覆盖) |
|
| off_guard 失衡 | 主角护甲等级降低(AC 轴——掷点判定阈值下调、更易被命中;2026-09-18 换装,原百分比承伤池已退) | 主角 | 见 `status_effects.tres` off_guard 行 | 时限/上限读表 / 叠加 | 标空封印反噬 / 踩雷(defense 型负向)/ 敌方妨害技(2026-09-19 新效应词汇批——蛛网束缚载体,duration 由技能行覆盖) |
|
||||||
| sapped 乏力 | 主角输出降低(weaken 型负向,主角输出池) | 主角 | 见 `status_effects.tres` sapped 行 | 时限/上限读表 / 叠加 | 危险格负向 / 标空封印 / 敌方妨害技(大地脉动——L3 Boss 石君王独占) |
|
| sapped 乏力 | 主角输出降低(weaken 型负向,主角输出池) | 主角 | 见 `status_effects.tres` sapped 行 | 时限/上限读表 / 叠加 | 危险格负向 / 标空封印(2026-09-15 格面资源批)/ 敌方妨害技(大地脉动——L3 Boss 石君王独占,2026-09-20 第三关内容批) |
|
||||||
| empower 蓄力 | 敌方输出倍率增益(敌方输出池——蓄力技载体;幅度读表) | 敌方 | 见 `status_effects.tres` empower 行 | duration 读表 = 1 个有效增益拍 / 累加 | 敌方技能施放 |
|
| empower 蓄力 | 敌方输出倍率增益(敌方输出池——蓄力技载体;幅度读表) | 敌方 | 见 `status_effects.tres` empower 行 | duration 读表 = 1 个有效增益拍 / 刷新 | 敌方技能施放(2026-09-16 敌人技能池批) |
|
||||||
| fortify 硬化 | 敌方防御提升(**敌方防御池**——硬化技载体;负值入池 = 主角攻击折半) | 敌方 | 见 `status_effects.tres` fortify 行 | duration 读表 = 1 个有效增益拍 / 累加 | 敌方技能施放 |
|
| fortify 硬化 | 敌方防御提升(**敌方防御池**——硬化技载体;负值入池 = 主角攻击折半,2026-09-18 符号纠正——旧正值实际翻倍) | 敌方 | 见 `status_effects.tres` fortify 行 | duration 读表 = 1 个有效增益拍 / 刷新 | 敌方技能施放(2026-09-16 敌人技能池批) |
|
||||||
| defensive_stance 护身 | 敌方输出降低(敌方输出池——敌方低血防御增益;地精池情境技「孤注守势」载体,血量阈值触发施放,duration 由技能行覆盖) | 敌方 | 见 `status_effects.tres` defensive_stance 行 | duration 读表 / 累加 | 敌方技能施放 |
|
|
||||||
|
|
||||||
empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(技能行 buff_ref 引用,施放时长由技能行覆盖——技能冷却与增益持续是两个计时器):两行 duration 表值(读表)的口径是"先兑付后衰减含施放当轮"——施放发生在第 N 结算战斗段,存活到第 N+1 结算战斗段才兑付"下一拍",即"持续 1 个有效结算"。敌方防御池是第四个乘区池:敌方作为防守方的百分比修正池,消费面 = [战斗结算](战斗结算.md)主角攻击的池乘区——四池对称(敌打主角 = 主角防御池 × 敌方输出池,主角打敌 = 主角输出池 × 敌方防御池),状态池语义零延伸:仍是同构实例、side-wide 加算、不封顶不保底。
|
empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(技能行 buff_ref 引用,施放时长由技能行覆盖——技能冷却与增益持续是两个计时器):两行 duration 表值(读表)的口径是"先兑付后衰减含施放当轮"——施放发生在第 N 结算战斗段,存活到第 N+1 结算战斗段才兑付"下一拍",即"持续 1 个有效结算"(proposal 语义的状态池落地)。敌方防御池是第四个乘区池:敌方作为防守方的百分比修正池,消费面 = [战斗结算](战斗结算.md)主角攻击的池乘区——四池对称(敌打主角 = 主角防御池 × 敌方输出池,主角打敌 = 主角输出池 × 敌方防御池),状态池语义零延伸:仍是同构实例、side-wide 加算、不封顶不保底。
|
||||||
|
|
||||||
削弱行是当量锚在状态池侧的数据落点:封印标中的收益折算成统一价值后,必须严格高于最低档主角增益——"封印标中必须比随便挖一格更值",否则没人愿意封印。这条锚的契约归[行动经济](../排雷循环/行动经济.md),对照验收归[战斗结算](战斗结算.md);暴走与失衡两行分别是 attack/defense 型负向(极性矩阵"标错/踩雷"分支兑付)在状态池侧的数据落点:行内容与载体裁决归它,本表只承载行值(失衡为 AC 轴、不入池)。**失衡另有第二来源**:敌方妨害技(蛛化卓尔精灵"蛛网束缚",敌方技能施放来源、duration 由技能行 buff_duration 覆盖)——状态池零新语义,同构实例照常受理;乏力 sapped = 妨害第二词汇,载体已落地(L3 Boss 灰矮人石君王独占妨害技「大地脉动」)。
|
削弱行是当量锚在状态池侧的数据落点:封印标中的收益折算成统一价值后,必须严格高于最低档主角增益——"封印标中必须比随便挖一格更值",否则没人愿意封印。这条锚的契约归[行动经济](../排雷循环/行动经济.md),对照验收归[战斗结算](战斗结算.md);暴走与失衡两行分别是 attack/defense 型负向(极性矩阵"标错/踩雷"分支兑付)在状态池侧的数据落点:行内容与载体裁决归它,本表只承载行值(失衡已换装 AC 轴不入池——2026-09-18 结构修复批)。**失衡另有第二来源**:敌方妨害技(2026-09-19 新效应词汇批——蛛化卓尔精灵"蛛网束缚",敌方技能施放来源、duration 由技能行 buff_duration 覆盖)——状态池零新语义,同构实例照常受理;乏力 sapped = 妨害第二词汇,载体已落地(L3 Boss 灰矮人石君王独占妨害技「大地脉动」,2026-09-20 第三关内容批)。
|
||||||
|
|
||||||
## 依赖与输出
|
## 依赖与输出
|
||||||
|
|
||||||
@@ -203,7 +195,7 @@ empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(
|
|||||||
|
|
||||||
1. 战斗结算通知战斗开始:状态池初始化,空池进入可用状态。
|
1. 战斗结算通知战斗开始:状态池初始化,空池进入可用状态。
|
||||||
2. 轮末结算时,战斗结算把这一轮的扫雷事实兑换成授予:挖开安全格给主角上增益、封印标中削弱敌人、踩雷给敌方上增强、标空封印触发反噬——授予入口是唯一进货口。
|
2. 轮末结算时,战斗结算把这一轮的扫雷事实兑换成授予:挖开安全格给主角上增益、封印标中削弱敌人、踩雷给敌方上增强、标空封印触发反噬——授予入口是唯一进货口。
|
||||||
3. 状态池按表行合并策略受理(新建 / 叠一层 / 累加时长),实例立即生效并携带归因记录。
|
3. 状态池按表行合并策略受理(新建 / 叠一层 / 刷新),实例立即生效并携带归因记录。
|
||||||
4. 战斗结算查询生效清单,逐行兑付进结算公式(有效值 = 层数 × 行值)。
|
4. 战斗结算查询生效清单,逐行兑付进结算公式(有效值 = 层数 × 行值)。
|
||||||
5. 兑付完做轮末衰减:全部实例剩余次数减一,归零移除——先兑付、后衰减。
|
5. 兑付完做轮末衰减:全部实例剩余次数减一,归零移除——先兑付、后衰减。
|
||||||
6. 战斗外授予、未知状态、满层授予一律被拒且状态池不变;满层的"奖励未生效"行归战斗结算的结算明细。
|
6. 战斗外授予、未知状态、满层授予一律被拒且状态池不变;满层的"奖励未生效"行归战斗结算的结算明细。
|
||||||
@@ -215,7 +207,7 @@ empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P1 | 累加、并存两类合并策略的后续内容行 | 语义已定义、状态池已承载;累加类已有内容(weaken/empower/fortify/attack_up/ac_up),并存仍空,首个并存内容行上线时顺带补验收 |
|
| P1 | 刷新、并存两类合并策略的后续内容行 | 语义已定义、状态池已承载;刷新类已有内容(empower/fortify 2026-09-16 敌人技能池批、weaken 2026-09-18 续时定案),并存仍空,首个并存内容行上线时顺带补验收 |
|
||||||
| P1 | 清图奖励含增益的授予路径 | 来源类别已预留;内容与档位归[地图战斗资源](地图战斗资源.md)定稿 |
|
| P1 | 清图奖励含增益的授予路径 | 来源类别已预留;内容与档位归[地图战斗资源](地图战斗资源.md)定稿 |
|
||||||
| P1 | 单体寻址扩展位(接口已定稿——五条语义见核心规则〈单体寻址扩展位〉节) | 实现随首个单体效果的内容批进游戏,真实入口验收随该批闭合 |
|
| P1 | 单体寻址扩展位(接口已定稿——五条语义见核心规则〈单体寻址扩展位〉节) | 实现随首个单体效果的内容批进游戏,真实入口验收随该批闭合 |
|
||||||
| P2 | 驱散 / 延时 / 转移接口 | 状态一旦生效,玩家没有任何手段摘掉、延后或挪给别人——省掉一整类界面复杂度是明确的设计决定;要加属于新增接口的修订,不是调参 |
|
| P2 | 驱散 / 延时 / 转移接口 | 状态一旦生效,玩家没有任何手段摘掉、延后或挪给别人——省掉一整类界面复杂度是明确的设计决定;要加属于新增接口的修订,不是调参 |
|
||||||
@@ -234,16 +226,16 @@ empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(
|
|||||||
| alert 幅度 | [0, 4] | ac 行 magnitude | 警觉(敌方护甲等级 +1/层 provisional);消费 = 战斗结算护甲等级掷点判定 |
|
| alert 幅度 | [0, 4] | ac 行 magnitude | 警觉(敌方护甲等级 +1/层 provisional);消费 = 战斗结算护甲等级掷点判定 |
|
||||||
| weaken 幅度 | 百分比取值域 [60,85],取负生效 | percent 行 magnitude | 削弱;须过"封印标中锚"对照 |
|
| weaken 幅度 | 百分比取值域 [60,85],取负生效 | percent 行 magnitude | 削弱;须过"封印标中锚"对照 |
|
||||||
| enrage 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 暴走;attack 型负向行,进敌方输出修正池 |
|
| enrage 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 暴走;attack 型负向行,进敌方输出修正池 |
|
||||||
| off_guard 幅度 | 护甲等级 [−20,20] 且非 0 | ac 行 magnitude | 失衡;标空封印反噬载体,掷点判定阈值逐层下调(AC 轴,不入池) |
|
| off_guard 幅度 | 护甲等级 [−20,20] 且非 0 | ac 行 magnitude | 失衡;标空封印反噬载体,掷点判定阈值逐层下调(2026-09-18 换装 AC 轴,不入池、退出主角防御池) |
|
||||||
| sapped 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 乏力;危险格负向 weaken 型,进主角输出修正池 |
|
| sapped 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 乏力;危险格负向 weaken 型,进主角输出修正池(2026-09-15 格面资源批补登记) |
|
||||||
| empower 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 蓄力;敌方技能池增益技载体,进敌方输出修正池 |
|
| empower 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 蓄力;敌方技能池增益技载体,进敌方输出修正池 |
|
||||||
| fortify 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 硬化;敌方技能池增益技载体,进**敌方防御池**(负值 = 减伤方向) |
|
| fortify 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 硬化;敌方技能池增益技载体,进**敌方防御池**(负值 = 减伤方向——2026-09-18 符号纠正) |
|
||||||
| 初始剩余次数 | 整数 [1,99] | duration_settlements | 累加行 = weaken(duration 2)+ empower/fortify(表值 2 = 先兑付后衰减含施放当轮的 1 个有效增益拍)+ attack_up / ac_up(duration 1);累加语义下重复拿一次就按本次授予时长加一段;拉长表值 = 每次授予攒更多段、规划变简单 |
|
| 初始剩余次数 | 整数 [1,99] | duration_settlements | 一次性语义行逐行读表;续时行 = weaken(2026-09-18 定案,duration 2)+ empower/fortify(1 个有效增益拍——先兑付后衰减含施放当轮)+ **attack_up / ac_up(2026-09-20 主角增益续时批,duration 表值 1 维持——续时语义在 duration=1 下表现为重复拿重置当轮倒数;跨轮延续随将来 duration 拉长自然显形,数值归状态层重设计批)**;拉长 = 恢复跨轮延续、规划变简单 |
|
||||||
| 叠层上限 | 整数 [1,16] | max_stack | 仅叠加策略消费;累加行层数恒 1、表值上限不消费,empower/fortify ×1(冷却闸下不可能自叠加) |
|
| 叠层上限 | 整数 [1,16] | max_stack | 仅叠加策略消费;刷新行层数恒 1——weaken / attack_up / ac_up 表值上限在续时语义下不消费(2026-09-18 / 2026-09-20),empower/fortify ×1(冷却闸下不可能自叠加) |
|
||||||
|
|
||||||
非调参的冻结项:三类合并策略语义、两种量纲语义、来源类别枚举、"先兑付后衰减"时序、拒绝原子性、零随机——改动走本文修订流程,不走调参。
|
非调参的冻结项:三类合并策略语义、两种量纲语义、来源类别枚举、"先兑付后衰减"时序、拒绝原子性、零随机——改动走本文修订流程,不走调参。
|
||||||
|
|
||||||
联动纪律:增伤与削弱是当量锚的两端;盾牌加护与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的承伤预期联动(掷点折扣轴——AC 行值变更须复算生存链区间;ac_up 层数恒 1、局内可达 AC 上限 11,复算随调参批);削弱与主角增益行同名重复授予只加时长、层数恒 1,"单轮层数上限受[行动经济](../排雷循环/行动经济.md)行动点约束"的联动不成立。这些联动值禁止独立调参,修订须重跑锚对照并同步登记册。
|
联动纪律:增伤与削弱是当量锚的两端;盾牌加护与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的承伤预期联动(掷点折扣轴——AC 行值变更须复算生存链区间;2026-09-20 主角增益续时批后 ac_up 层数恒 1、局内可达 AC 上限 11,复算随调参批);削弱改续时后"单轮层数上限受[行动经济](../排雷循环/行动经济.md)行动点约束"的联动随之失效(2026-09-18 续时定案——同名重复标中只刷新剩余次数、层数恒 1;2026-09-20 起主角侧 attack_up / ac_up 同口径)。这些联动值禁止独立调参,修订须重跑锚对照并同步登记册。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
@@ -251,7 +243,7 @@ empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(
|
|||||||
- 多向同构:主角侧增益与减益、敌方侧增强与削弱共用同一套受理、合并、倒数、清除语义,不存在第二套计时逻辑。
|
- 多向同构:主角侧增益与减益、敌方侧增强与削弱共用同一套受理、合并、倒数、清除语义,不存在第二套计时逻辑。
|
||||||
- 授予即生效:状态发入当轮结算即兑付第一次,无"待生效"中间态。
|
- 授予即生效:状态发入当轮结算即兑付第一次,无"待生效"中间态。
|
||||||
- 只登记不去重:同一事实被转化两次授予,登记两层——去重责任在战斗结算。
|
- 只登记不去重:同一事实被转化两次授予,登记两层——去重责任在战斗结算。
|
||||||
- 叠层不减钟:叠加策略行叠加只加层数,剩余次数保持首次授予定下的轨迹不变(累加策略行则相反——层数不变、剩余次数加上本次授予的时长;两策略逐行读表)。
|
- 叠层不减钟:叠加策略行叠加只加层数,剩余次数保持首次授予定下的轨迹不变(刷新策略行则相反——层数不变、只重置剩余次数;两策略逐行读表)。
|
||||||
- 满层拒绝原子且留痕:叠满后再授予返回失败、状态池逐字不变;结算明细多一行"奖励未生效"(含来源)。
|
- 满层拒绝原子且留痕:叠满后再授予返回失败、状态池逐字不变;结算明细多一行"奖励未生效"(含来源)。
|
||||||
- 先兑付后衰减:每轮结算恰做一次衰减,归零实例当轮移除;停手轮、弃图刷新轮照常衰减。
|
- 先兑付后衰减:每轮结算恰做一次衰减,归零实例当轮移除;停手轮、弃图刷新轮照常衰减。
|
||||||
- 合成不设上下限:状态池输出的有效值恒等于层数 × 行值,越出百分比域不封顶不保底;地板在战斗结算侧。
|
- 合成不设上下限:状态池输出的有效值恒等于层数 × 行值,越出百分比域不封顶不保底;地板在战斗结算侧。
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 战斗结算
|
# 战斗结算
|
||||||
|
|
||||||
> 一句话:轮末结算的编排与逐行兑现
|
> 一句话:轮末结算的编排与逐行兑现
|
||||||
> 状态:已定稿;现行为 v2.0
|
> 状态:已定稿(自旧体系迁移);现行为 v1.3
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 轮次编排 | 战斗开始序列、每轮五段结算、五种出口分发(继续 / 换图 / 挖掘期刷新 / 战斗结束 / 关卡结束) |
|
| 轮次编排 | 战斗开始序列、每轮五段结算、五种出口分发(继续 / 换图 / 挖掘期刷新 / 战斗结束 / 关卡结束) |
|
||||||
| 结算触发与段序 | 轮末自动触发一次整轮结算;五段顺序为冻结结构,改动走文档修订而非调参 |
|
| 结算触发与段序 | 轮末自动触发一次整轮结算;五段顺序为冻结结构,改动走文档修订而非调参 |
|
||||||
| 结算队列与判定基线 | 挖掘期动作(开格、封印)入结算队列;封印判定以轮末在场封印为基线,逐行兑付(封印格拒绝挖掘,受理过的封印必然在基线) |
|
| 结算队列与判定基线 | 挖掘期动作(开格、封印)入结算队列;封印判定以轮末在场封印为基线,逐行兑付(封印不可逆批 2026-09-19——撤旗动作退役) |
|
||||||
| 明细流水协议 | 结算中的每件事逐行留档并标注来源,是呈现、回放对账、数据导出共读的唯一数据源 |
|
| 明细流水协议 | 结算中的每件事逐行留档并标注来源,是呈现、回放对账、数据导出共读的唯一数据源 |
|
||||||
| 收益对照表 | 一张效果档位对照表归一全部收益的折算口径(详见核心规则) |
|
| 收益对照表 | 一张效果档位对照表归一全部收益的折算口径(详见核心规则) |
|
||||||
| 伤害与治疗边界 | 修正池合成与封顶、溢杀丢弃、治疗封顶、死亡判定时机 |
|
| 伤害与治疗边界 | 修正池合成与封顶、溢杀丢弃、治疗封顶、死亡判定时机 |
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
| ④ 衰减段 | 移除到期的临时效果;每轮恰好一次,含末轮——清图奖励先兑付、效果后衰减 |
|
| ④ 衰减段 | 移除到期的临时效果;每轮恰好一次,含末轮——清图奖励先兑付、效果后衰减 |
|
||||||
| ⑤ 判定段 | 先判主角倒下(负),再判敌人清空(胜),都不满足则继续下一轮 |
|
| ⑤ 判定段 | 先判主角倒下(负),再判敌人清空(胜),都不满足则继续下一轮 |
|
||||||
|
|
||||||
结算本体是纯逻辑步骤流:零界面依赖、禁止动画等待,随机消费只走封闭随机流。触发只读行动经济的相位读数与轮末标记,这条消息有棋盘路径和停手路径两个发射源,到达先后不承载语义。这些性质共同保证结算可回放:同样的种子、同样的事件序列,跑出的步骤流逐位复现——录像回放与断言复测都建立在它上面。随机消费恰七处:战斗开始掷骰定敌方实际数量与攻击基线浮动,属于初始化随机、发生在结算步骤流之外;技能摇号属于回合内随机,但时点前置到每轮开轮、同样发生在结算步骤流之外(消费专用 `behavior_roll` 封闭流,每敌按生成序派生独立子流,单敌出招轨迹可独立复放、互不穿插);护甲等级掷点属于回合内随机、发生在步骤流之内(消费专用 `armor_roll` 封闭流,逐次掷逐次取号,可逐位回放);奖励格摇号(消费 `reward_roll` 封闭流,装板期格面资源批派发)、变异布置(消费 `variant_place` 封闭流,装板与资源预分配之后——棋盘设置顺序第 4 步)与换板棋盘生成(消费 `board_gen` 封闭流,清图轮换板时点)均属初始化随机、发生在结算步骤流之外;战斗结束掉落掷定属出口随机(消费 `gp_drop` 封闭流,按战斗节点身份查商店表掷定 GP 掉落,与关级加值、战斗内缓冲合成本战 GP 掉落),发生在结算步骤流之外。七处皆封闭随机流,同种子同输入逐位复现。
|
结算本体是纯逻辑步骤流:零界面依赖、禁止动画等待,随机消费只走封闭随机流。触发只读行动经济的相位读数与轮末标记,这条消息有棋盘路径和停手路径两个发射源,到达先后不承载语义。这些性质共同保证结算可回放:同样的种子、同样的事件序列,跑出的步骤流逐位复现——录像回放与断言复测都建立在它上面。随机消费恰七处(2026-09-16 敌人技能池批由两处扩为三处;2026-09-17 分支节点图批换板入编排后扩为五处;2026-09-20 地形变异首批类型定稿批扩为六处——变异布置;同日 GP+商店房批扩为七处——战斗结束掉落掷定):战斗开始掷骰定敌方实际数量与攻击基线浮动,属于初始化随机、发生在结算步骤流之外;技能摇号属于回合内随机,但时点前置到每轮开轮、同样发生在结算步骤流之外(消费专用 `behavior_roll` 封闭流,每敌按生成序派生独立子流,单敌出招轨迹可独立复放、互不穿插);护甲等级掷点属于回合内随机、发生在步骤流之内(消费专用 `armor_roll` 封闭流,逐次掷逐次取号,可逐位回放);奖励格摇号(消费 `reward_roll` 封闭流,装板期格面资源批派发)、变异布置(消费 `variant_place` 封闭流,装板与资源预分配之后——棋盘设置顺序第 4 步)与换板棋盘生成(消费 `board_gen` 封闭流,清图轮换板时点)均属初始化随机、发生在结算步骤流之外;战斗结束掉落掷定属出口随机(消费 `gp_drop` 封闭流,按战斗节点身份查商店表掷定 GP 掉落,与关级加值、战斗内缓冲合成本战 GP 掉落),发生在结算步骤流之外。七处皆封闭随机流,同种子同输入逐位复现。
|
||||||
|
|
||||||
举证:五段为流程编排,无计算;段序常量存配置表,加载时校验与定稿顺序完全一致,不一致拒绝启动。
|
举证:五段为流程编排,无计算;段序常量存配置表,加载时校验与定稿顺序完全一致,不一致拒绝启动。
|
||||||
|
|
||||||
@@ -77,14 +77,14 @@
|
|||||||
| 效果行 | 增益/减益段每条效果一行:本次授予贡献值与池合成值分列,防误读 |
|
| 效果行 | 增益/减益段每条效果一行:本次授予贡献值与池合成值分列,防误读 |
|
||||||
| 伤害行 | 每次伤害一行:目标、伤害分量、修正终值、击杀标记;吃护甲等级掷点的分量,掷点读数与折扣档位随行留档,nat20 暴击随行标记并金框高亮(行型封闭清单不变) |
|
| 伤害行 | 每次伤害一行:目标、伤害分量、修正终值、击杀标记;吃护甲等级掷点的分量,掷点读数与折扣档位随行留档,nat20 暴击随行标记并金框高亮(行型封闭清单不变) |
|
||||||
| 治疗行 | 治疗生效一行:封顶后的真实回复量 |
|
| 治疗行 | 治疗生效一行:封顶后的真实回复量 |
|
||||||
| 奖励未生效行 | 四类合法例外一行,reason 键封闭(full_layers 叠层满拒收/full_hp 满血零兑/no_enemy_alive 场上无敌可打/hero_down 主角倒下整体不兑);封印作废行已退役(封印受理即揭示,无作废产生面) |
|
| 奖励未生效行 | 满层拒收、满血治疗等合法例外一行 |
|
||||||
| 封印未中行 | 封印落空的零值归因行,每颗雷只记一次;标错的负向兑付另记效果行 |
|
| 封印未中行 | 封印落空的零值归因行,每颗雷只记一次;标错的负向兑付另记效果行 |
|
||||||
| 施放行 | 敌人本拍施放增益技——0 伤害动作、具名技能、不掷不折(蓄力语义 = 纯攻击增益技,见[敌人系统](敌人系统.md)) |
|
| 蓄力行 | 敌人本拍蓄力不动手(攒下一击)时记一行 **(2026-09-16 敌人技能池批改型为施放行:敌人本拍施放增益技——0 伤害动作、具名技能、不掷不折〔原"不兑付伏击"读怪奖励语义随 2026-09-20 八型批伏击退役作废〕;蓄力语义改写为纯攻击增益技,见[敌人系统](敌人系统.md))** |
|
||||||
| 衰减行 | 到期临时效果移除一行 |
|
| 衰减行 | 到期临时效果移除一行 |
|
||||||
| 判定行 | 胜 / 负 / 继续各一行;终局判定行同时是胜负画面的数据锚 |
|
| 判定行 | 胜 / 负 / 继续各一行;终局判定行同时是胜负画面的数据锚 |
|
||||||
| 高光行 | 完美封印成立时一行,只记实际有效兑付 |
|
| 高光行 | 完美封印成立时一行,只记实际有效兑付 |
|
||||||
|
|
||||||
每行还携带公共字段:来源类别、来源格、轮次、显示名、数值,以及可空的高光标记(用于强调封印标中、清图奖励这类值得高亮的结果)。**显示名等玩家可见文案是数据面字段:文案值登记在数据表行,代码按来源类别与效果身份读表拼行,不在代码里写死文案字串**(2026-11-06 用户裁——文案归属数据表承载;承载表与字段形态归表结构设计段定,设计闭合后由实装批落表)。奖励直伤行的数值字段沿用 `effectiveness` 键名、值为整数点数——键名与量纲是数据导出与分析工具的兼容契约,改动须连动分析工具面。没生效也要留痕:奖励未生效行如实记录四类合法例外(reason 键封闭:full_layers/full_hp/no_enemy_alive/hero_down),呈现面按 reason 归因(聚合计数呈现已随明细带退役)。**日志落盘零文案:text 与 display_name 不落盘**,玩家可见文案仅呈现面消费。
|
每行还携带公共字段:来源类别、来源格、轮次、显示名、数值,以及可空的高光标记(用于强调封印标中、清图奖励这类值得高亮的结果)。没生效也要留痕:两类"未生效"行如实记录合法例外,呈现时聚合计数,不逐行刷屏。
|
||||||
|
|
||||||
任何一行找不到来源即断言失败——宁可返回错误,也不让"合并到看不出来源"的呈现混过数据层。但有些行天然没有棋盘来源,断言为此留了两层豁免,豁免集合是封闭清单,改动同样走本文修订。
|
任何一行找不到来源即断言失败——宁可返回错误,也不让"合并到看不出来源"的呈现混过数据层。但有些行天然没有棋盘来源,断言为此留了两层豁免,豁免集合是封闭清单,改动同样走本文修订。
|
||||||
|
|
||||||
@@ -100,9 +100,7 @@
|
|||||||
|
|
||||||
基础 9 类写的是裸机制的账:玩家没有任何专长时,结算流水的每一行都出得了这九类。有了专长之后,效果引擎会在段内挂点插入额外的结算效果,这类效果写**扩展行**。扩展行是**一个**行型,不是每种专长效果各占一个行型——具体插的是哪种效果,由行携带的效果身份(effect_id 载荷)说明,呈现层按身份取各自的行文案。专长会不断增加、效果种类不可穷举,行型词表因此对扩展类封口:新增专长效果只新增载荷身份,不再新增行型。
|
基础 9 类写的是裸机制的账:玩家没有任何专长时,结算流水的每一行都出得了这九类。有了专长之后,效果引擎会在段内挂点插入额外的结算效果,这类效果写**扩展行**。扩展行是**一个**行型,不是每种专长效果各占一个行型——具体插的是哪种效果,由行携带的效果身份(effect_id 载荷)说明,呈现层按身份取各自的行文案。专长会不断增加、效果种类不可穷举,行型词表因此对扩展类封口:新增专长效果只新增载荷身份,不再新增行型。
|
||||||
|
|
||||||
扩展行与基础行共用同一套行协议:公共字段、来源归因、两层豁免、无来源即炸,全部照常生效。发射时点由段序骨架的挂点决定(时序与挂点施加面、效果身份清单与各发射点归代码文件头注承载),本节只管这行是什么、带什么字段。扩展行携带效果身份(effect_id 载荷)。
|
扩展行与基础行共用同一套行协议:公共字段、来源归因、两层豁免、无来源即炸,全部照常生效。发射时点由段序骨架的挂点决定(时序与挂点施加面归架构文档「战斗域装配现状」节),本节只管这行是什么、带什么字段。扩展行携带效果身份(effect_id 载荷);效果身份清单与各发射点归架构文档「战斗域装配现状」与「战斗编排域拆件定稿」节登记。
|
||||||
|
|
||||||
效果引擎的装载与订阅面(表装载、rebuild、树规则挂接)与端口装配明细归实现件文件头注承载。两业务类(伤害管线/行动经济)持同一个效果端口件实例,命中批经端口路由全处理。伤害域传给效果引擎的事实面为封闭集合:载荷携带的事实键可达、宿主链事实不外溢——事实面增删走实现件修订,禁静默扩面。
|
|
||||||
|
|
||||||
举证:本节为行协议约定,无计算。
|
举证:本节为行协议约定,无计算。
|
||||||
|
|
||||||
@@ -125,25 +123,32 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 ×
|
|||||||
| 层数 × 行值 | 单条效果的叠层数与行值,读[增益状态](增益状态.md)的实例数据 | 行值归该系统 |
|
| 层数 × 行值 | 单条效果的叠层数与行值,读[增益状态](增益状态.md)的实例数据 | 行值归该系统 |
|
||||||
| 完美乘数 | 完美封印给清图奖励的乘数,配置值 | 读 `settlement.tres` p_perfect(现行值读表) |
|
| 完美乘数 | 完美封印给清图奖励的乘数,配置值 | 读 `settlement.tres` p_perfect(现行值读表) |
|
||||||
|
|
||||||
**gp / ap 当量口径注记**:上式 flat 类枚举(直伤、治疗、行动点)不含 gp——现行对账按 **gp 当量 = flat power 代理**计(GP 袋 3 / 破财 2);ap 当量 = flat 表值 1,机会成本口径(+1AP ≈ 多挖一格 ≈ E_dig + 进度 + 信息价值)更高,差异仅登记不进主算。gp 的精确口径应经商店定价换算(1 GP 的边际属性当量),归状态层/商店批复核后换代。封印溢价兑付(条款3 条件二形态 a,`settlement.tres` flag_hit_premium=125 provisional)按同型正向 ×(1+δ) 兑付——当量换算随同型行口径同步放大,整数量级取整四舍五入(与伤害管线向下取整口径分域)。
|
**gp / ap 当量口径注记(2026-10-05 判式换代批 T3——口径空白登记)**:上式 flat 类枚举(直伤、治疗、行动点)不含 gp——现行对账按 **gp 当量 = flat power 代理**计(GP 袋 3 / 破财 2,方案报告假设 A5);ap 当量 = flat 表值 1,机会成本口径(+1AP ≈ 多挖一格 ≈ E_dig + 进度 + 信息价值)更高,差异仅登记不进主算(假设 A6)。gp 的精确口径应经商店定价换算(1 GP 的边际属性当量),归状态层/商店批复核后换代。封印溢价兑付(条款3 条件二形态 a,`settlement.tres` flag_hit_premium=125 provisional)按同型正向 ×(1+δ) 兑付——当量换算随同型行口径同步放大,整数量级取整四舍五入(与伤害管线向下取整口径分域,登记册顺带登记)。
|
||||||
|
|
||||||
### 授予段兑付:极性路由,四类动作各归各系统资源
|
### 授予段兑付:极性路由,四类动作各归各系统资源
|
||||||
|
|
||||||
授予段消费结算队列。**队列与判定基线**:挖掘期玩家对格子的动作——开格、封印——都进入结算队列;结算逐批兑付,不走逐动作出栈直算。封印判定以轮末在场封印位为基线:封印格拒绝挖掘,受理过的封印必然保留到轮末、全部在基线;开格事实不可撤(已开格无法回退)。过滤后按触发源分三批兑换,每格受理、每封印判定恰好一次。
|
授予段消费结算队列。**队列与判定基线**:挖掘期玩家对格子的动作——开格、封印——都进入结算队列;结算逐批兑付,不走逐动作出栈直算。封印判定以轮末在场封印位为基线:被直接挖开的封印已随挖掘消失、不在基线(零兑付——标中 / 标空让位于挖掘本体结局,见下文封印不可逆四情况);开格事实不可撤(已开格无法回退)。过滤后按触发源分三批兑换,每格受理、每封印判定恰好一次。
|
||||||
|
|
||||||
兑付走**极性矩阵**(定义归[地图战斗资源](地图战斗资源.md)):开安全格 → 该格格面资源的正向;开危险格 → 负向;封印标中 → 该危险格资源的正向;标错封印 → 该安全格资源的负向。九型字典里每型各有一行正向、一行负向(gp 正负两向兑付 = 战斗内 GP 缓冲,见下方兑付形态表);伏击已退役,blast 型负向现况 = 警觉(敌方护甲等级 +1)。
|
兑付走**极性矩阵**(定义归[地图战斗资源](地图战斗资源.md)):开安全格 → 该格格面资源的正向;开危险格 → 负向;封印标中 → 该危险格资源的正向;标错封印 → 该安全格资源的负向。九型字典里每型各有一行正向、一行负向(gp 型随 2026-09-20 GP+商店房批增补——gp 正负两向兑付 = 战斗内 GP 缓冲,见下方兑付形态表);伏击随 2026-09-20 八型批退役,blast 型负向现况 = 警觉(敌方护甲等级 +1)。
|
||||||
|
|
||||||
**封印受理即揭示(2026-11-07 用户裁)**:封印受理只完成揭示与立印——墙瓦片换地板、格下身份当场可见(裁决见[排雷玩法](../排雷循环/排雷玩法.md)),兑付仍全部发生在轮末判定批,受理当场零兑付;封印格拒绝挖掘,「挖开封印格」的兑付改判路径随之不存在。
|
**封印不可逆四情况(2026-09-19 用户拍板全套落地,2026-09-18 提案转正)**:封印印记是一次性承诺、移除动作退役、挖封印格放行——兑付按四情况改判:
|
||||||
|
|
||||||
|
| 情况 | 兑付 |
|
||||||
|
|---|---|
|
||||||
|
| ① 插危险格、留到轮末判定 | 标中照常(该危险格资源正向) |
|
||||||
|
| ② 插危险格、再直接挖开 | 只受挖雷一层惩罚(该危险格资源负向照常兑付;挖雷惩罚因惊动触发);标中不发(封印已随挖掘消失、不入判定基线) |
|
||||||
|
| ③ 插安全格、留到轮末判定 | 标空惩罚照常(该安全格资源负向) |
|
||||||
|
| ④ 插安全格、再直接挖开 | 零惩罚零奖励——正向兑付作废,记「奖励作废(封印格直接挖开)」归因行;标空判定同②自然缺席 |
|
||||||
|
|
||||||
| 批 | 兑付 |
|
| 批 | 兑付 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 挖格批 | 开到的安全格逐格兑该格资源的正向;开到的危险格逐格兑该格资源的负向 |
|
| 挖格批 | 开到的安全格逐格兑该格资源的正向(封印格直挖除外——四情况④零奖励);开到的危险格逐格兑该格资源的负向(封印危险格照常——四情况②) |
|
||||||
| 封印判定批 | 标中则兑该危险格资源的正向,每颗雷的资格只兑一次;标空则记"封印未中"归因行,并兑该安全格资源的负向 |
|
| 封印判定批 | 标中则兑该危险格资源的正向,每颗雷的资格只兑一次;标空则记"封印未中"归因行,并兑该安全格资源的负向 |
|
||||||
| 清图批 | 清图奖励对象恰好发一次;完美封印追加第二份同身份兑付 |
|
| 清图批 | 清图奖励对象恰好发一次;完美封印追加第二份同身份兑付 |
|
||||||
|
|
||||||
授予段当场只兑非伤害形态(增益、治疗、行动点、GP 缓冲、警觉加层);**伤害形态兑付(爆裂、直伤、反噬)以伤害单据暂存,攒到战斗段末统一结算**(2026-10-06 用户裁——地图伤害账殿后,见[伤害单据与伤害控制器](#伤害单据与伤害控制器所有伤害走同一道门)与战斗段两节)。暂存单在授予段按「将兑付」回报——授予段内依赖兑付读数的流程决策(完美封印第二份、高光份数)依据开单时点事实判定,该时点敌人存活有保证;战斗段末实际结账若目标已灭,控制器自记「奖励未生效」行。
|
授予段当场只兑非伤害形态(增益、治疗、行动点、GP 缓冲、警觉加层);**伤害形态兑付(爆裂、直伤、反噬)以伤害单据暂存,攒到战斗段末统一结算**(2026-10-06 用户裁——地图伤害账殿后,见[伤害单据与伤害控制器](#伤害单据与伤害控制器所有伤害走同一道门)与战斗段两节)。暂存单在授予段按「将兑付」回报——授予段内依赖兑付读数的流程决策(完美封印第二份、高光份数)依据开单时点事实判定,该时点敌人存活有保证;战斗段末实际结账若目标已灭,控制器自记「奖励未生效」行。
|
||||||
|
|
||||||
**充能已退役(2026-09-19 用户拍板)**:主角攻击为单分量,克制策略归冒险前配置(主角 attack_type 表值,营地换型 = 改字段;未来冒险前参数面承接策略位)。攻防两条抽象分离纪律保留:攻击类型是伤害的属性轴,棋盘事实只是奖励触发源。
|
**充能已退役(2026-09-19 用户拍板)**:原"挖格/标中旗给充能计数 → 战斗段折算穿刺/魔法分量"的弹药系统整体移除——主角攻击回归单分量,克制策略归冒险前配置(主角 attack_type 表值,营地换型 = 改字段;未来冒险前参数面承接策略位)。攻防两条抽象分离纪律保留:攻击类型是伤害的属性轴,棋盘事实只是奖励触发源。
|
||||||
|
|
||||||
| 兑付形态 | 覆盖 | 兑付方式 | 拒绝语义 |
|
| 兑付形态 | 覆盖 | 兑付方式 | 拒绝语义 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
@@ -155,11 +160,11 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 ×
|
|||||||
| GP 缓冲(flat) | gp 正 / 负向 | GP 袋 / 破财按 power 记入战斗内 GP 缓冲(+power / −power);缓冲随战斗完成折进战斗结束信号的 GP 掉落统一到账(GP 归[冒险结构](../冒险循环/冒险结构.md)) | 无拒收态——缓冲只在战斗边界与钱包结算,战斗域零钱包状态 |
|
| GP 缓冲(flat) | gp 正 / 负向 | GP 袋 / 破财按 power 记入战斗内 GP 缓冲(+power / −power);缓冲随战斗完成折进战斗结束信号的 GP 掉落统一到账(GP 归[冒险结构](../冒险循环/冒险结构.md)) | 无拒收态——缓冲只在战斗边界与钱包结算,战斗域零钱包状态 |
|
||||||
| 行动点修正 | action 正/负向 | 下轮行动点 ±power(行动经济排队,下一轮开始兑现后清零;下限 0) | 排队净值不跨轮保留;明细记效果行(effect_id=ap_delta) |
|
| 行动点修正 | action 正/负向 | 下轮行动点 ±power(行动经济排队,下一轮开始兑现后清零;下限 0) | 排队净值不跨轮保留;明细记效果行(effect_id=ap_delta) |
|
||||||
|
|
||||||
警觉(blast 负向)按个体归属:每个存活敌各发一条自己的实例(全体存活敌规则,见[增益状态](增益状态.md)〈目标规则与个体归属〉节),只活一轮、轮末随体清零;战斗段由防守方护甲等级读数消费(我打敌 = 该敌 armor_class + 它名下的 ac 型状态合计)。其余各型负向受池 clamp 与叠层上限承载。
|
警觉(blast 负向——2026-09-20 八型批伏击退役换装)为敌方 side-wide 状态:多个敌人共享同一状态值、互不消耗,只活一轮、轮末清零;战斗段由防守方护甲等级读数消费(我打敌 = 敌方 armor_class + Σ敌方侧 ac 型状态)。其余各型负向受池 clamp 与叠层上限承载。
|
||||||
|
|
||||||
标中资格认雷不认封印:兑付资格以危险格实例为键——封印印记无任何移除手段(封印格拒绝挖掘,重复封印被"已有封印"拒绝)、同一颗雷跨轮不重复兑付;换图后新雷是新实例,资格自然重置。同一处封印一直落在雷上,每轮都会重新上报标中,去重是本系统的职责。
|
标中资格认雷不认封印:兑付资格以危险格实例为键——封印印记无任何移除手段(移除动作已退役,重复封印被"已有封印"拒绝)、同一颗雷跨轮不重复兑付;换图后新雷是新实例,资格自然重置。同一处封印一直落在雷上,每轮都会重新上报标中,去重是本系统的职责。
|
||||||
|
|
||||||
标错的惩罚:标空封印(标了但格不是雷)= 该安全格格面资源的负向兑付(极性矩阵的"标错"分支),类型化、确定性、零额外派生。负向兑付与"封印未中"归因行同键去重,每危险格实例只触发一次;叠层已满授予被拒时记"奖励未生效"行,不静默吞掉。
|
标错的惩罚不再是独立机制:标空封印(标了但格不是雷)= 该安全格格面资源的负向兑付(极性矩阵的"标错"分支),类型化、确定性、零额外派生——旧三选一哈希反噬(暴走 / 失衡 / 伏击+2 三池,坐标×板序号哈希派生)随格面资源批(2026-09-15)整段下线,三池内容收编为 attack / defense / blast 三型的负向行。负向兑付与"封印未中"归因行同键去重,每危险格实例只触发一次;叠层已满授予被拒时记"奖励未生效"行,不静默吞掉。
|
||||||
|
|
||||||
完美封印全有或全无:一张板零误标且至少一次封印标中,清图奖励加倍(现行倍数读 `settlement.tres` p_perfect)。完美计数从装板起算、换图重置;高光行只记实际有效兑付(首份加被接受的第二份),首份即零兑付则高光行不发。封印标中的兑付行自带高光标记,与完美封印的独立高光行构成两个强制高光检查点。
|
完美封印全有或全无:一张板零误标且至少一次封印标中,清图奖励加倍(现行倍数读 `settlement.tres` p_perfect)。完美计数从装板起算、换图重置;高光行只记实际有效兑付(首份加被接受的第二份),首份即零兑付则高光行不发。封印标中的兑付行自带高光标记,与完美封印的独立高光行构成两个强制高光检查点。
|
||||||
|
|
||||||
@@ -183,15 +188,15 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 ×
|
|||||||
|
|
||||||
**死亡事件由单位自行宣布**:单位生命归零的那一刻自己发出死亡事件(不由流程代查、不由控制器推断)。怪死 → 队列中该敌为来源的未结单据作废(死亡即不动手——静默零行、不进冷却、不进保底计数,同既有口径);主角死 → 兑付终止、余单作废,Game Over 仍归判定段的生命读数路径。
|
**死亡事件由单位自行宣布**:单位生命归零的那一刻自己发出死亡事件(不由流程代查、不由控制器推断)。怪死 → 队列中该敌为来源的未结单据作废(死亡即不动手——静默零行、不进冷却、不进保底计数,同既有口径);主角死 → 兑付终止、余单作废,Game Over 仍归判定段的生命读数路径。
|
||||||
|
|
||||||
**结账时机双模式(结构位,非调参项)**:单据开出后何时兑现由控制器政策承载。现行 = **段界结账 + 地图账殿后**(2026-10-06 用户裁):授予段不开具任何当场兑现的伤害单——全部伤害形态单据暂存(含清图批),战斗段按「主角先手 → 逐敌还手 → 地图账」的顺序补提交,攒到战斗段尾统一兑现;主角在敌方还手中倒下 → 暂存单整体不兑,逐单留「未生效(主角已倒下)」行。清图批的完美第二份与高光份数决策依据开单时点事实(该时点敌人存活有保证),暂存单按「将兑付」回报。保留位 = **开单即结**:提交当场兑现,作回切结构位。两模式同种子同操作均逐位复现(兑现次序 = 开单次序);同一输入在两模式下结果可不同(兑现时机的语义差异)。切换 = 改控制器政策常量,走代码修订不走调参。
|
**结账时机双模式(结构位,非调参项)**:单据开出后何时兑现由控制器政策承载。现行 = **段界结账 + 地图账殿后**(2026-10-06 用户裁):授予段不开具任何当场兑现的伤害单——全部伤害形态单据暂存(含清图批),战斗段按「主角先手 → 逐敌还手 → 地图账」的顺序补提交,攒到战斗段尾统一兑现;主角在敌方还手中倒下 → 暂存单整体不兑,逐单留「未生效(主角已倒下)」行。清图批的完美第二份与高光份数决策依据开单时点事实(该时点敌人存活有保证),暂存单按「将兑付」回报。保留位 = **开单即结**:提交当场兑现,逐位等价 2026-09-24 之前的行为,作回切结构位。两模式同种子同操作均逐位复现(兑现次序 = 开单次序);同一输入在两模式下结果可不同(兑现时机的语义差异),历史基线读数以 2026-10-06 之前的授予段结账口径为准——该口径已随案C退役,新读数一律按地图账殿后重采。切换 = 改控制器政策常量,走代码修订不走调参。
|
||||||
|
|
||||||
举证:本节为管线编排约定,无新计算;掷点、折扣、克制与池乘区的算术口径见战斗段一节。
|
举证:本节为管线编排约定,无新计算;掷点、折扣、克制与池乘区的算术口径见战斗段一节。
|
||||||
|
|
||||||
### 战斗段与胜负判定:谁先动手、怎么扣血、怎么定胜负
|
### 战斗段与胜负判定:谁先动手、怎么扣血、怎么定胜负
|
||||||
|
|
||||||
战斗段是兑现的最后一刀。主角的基础攻击恒存在——这是项目拍板:若基线为零,百分比增益乘上去永远是零,增益系统就空转了。攻击力域 [1, 999]、0 于加载期拒绝,行值读主角表。顺序固定:主角先基础攻击顺位最前的存活敌人,随后按行序逐个存活敌人按本拍摇定技能还手;每个敌人依次走"按技能行兑现、结算伤害、执行上报(技能进冷却 + 保底计数)"三步且恰行动一次,主角不在其列;**最后兑地图伤害账**——授予段暂存的全部伤害单按授予段事件序补提交,与主角单、敌方单一起攒到战斗段尾统一结账(见[伤害单据与伤害控制器](#伤害单据与伤害控制器所有伤害走同一道门)一节)。主角中途倒下,剩余敌人全部停手,地图伤害账整体不兑(逐单留「未生效(主角已倒下)」行),直接进判定段。施放技不涉伤害、照旧当场落行。授予段不产出伤害,主角进入战斗段时恒存活、场上恒有敌——先手必兑。
|
战斗段是兑现的最后一刀。主角的基础攻击恒存在——这是项目拍板:若基线为零,百分比增益乘上去永远是零,增益系统就空转了。攻击力域 [1, 999]、0 于加载期拒绝,行值读主角表。顺序固定:主角先基础攻击顺位最前的存活敌人,随后按行序逐个存活敌人按本拍摇定技能还手;每个敌人依次走"按技能行兑现、结算伤害、执行上报(技能进冷却 + 保底计数)"三步且恰行动一次,主角不在其列;**最后兑地图伤害账**——授予段暂存的全部伤害单按授予段事件序补提交,与主角单、敌方单一起攒到战斗段尾统一结账(见[伤害单据与伤害控制器](#伤害单据与伤害控制器所有伤害走同一道门)一节)。主角中途倒下,剩余敌人全部停手,地图伤害账整体不兑(逐单留「未生效(主角已倒下)」行),直接进判定段。施放技不涉伤害、照旧当场落行。案C 后授予段不产出伤害,主角进入战斗段时恒存活、场上恒有敌——先手必兑。
|
||||||
|
|
||||||
**开轮摇号与敌方技能兑现**:敌人每拍做什么由开轮摇号决定——每轮轮次开始时,本系统在换算层排除冷却中与触发条件不满足的技能(可摇集合语义归[敌人系统](敌人系统.md)),按行序逐敌从 `behavior_roll` 封闭流的独立子流摇定本拍动作写入实例池(首轮同样摇号;每轮恰摇一次;轮内刷新换图不重摇),随后冷却递减。摇定后、兑现前死亡 → 本拍技能作废、不动手(死亡即不动手)。结算战斗段只按技能行兑现:伤害技走三乘法链(见下),增益技记一行施放行并把状态效果按技能行持续回合挂入[增益状态](增益状态.md)的状态池——0 伤害动作不掷不折。池模板、技能行、冷却、保底与触发条件语义归[敌人系统](敌人系统.md)(引用不转述)。
|
**开轮摇号与敌方技能兑现**(2026-09-16 敌人技能池批):敌人每拍做什么由开轮摇号决定——每轮轮次开始时,本系统在换算层排除冷却中与触发条件不满足的技能(可摇集合语义归[敌人系统](敌人系统.md)),按行序逐敌从 `behavior_roll` 封闭流的独立子流摇定本拍动作写入实例池(首轮同样摇号;每轮恰摇一次;轮内刷新换图不重摇),随后冷却递减。摇定后、兑现前死亡 → 本拍技能作废、不动手(死亡即不动手)。结算战斗段只按技能行兑现:伤害技走三乘法链(见下),增益技记一行施放行并把状态效果按技能行持续回合挂入[增益状态](增益状态.md)的状态池——0 伤害动作不掷不折。池模板、技能行、冷却、保底与触发条件语义归[敌人系统](敌人系统.md)(引用不转述)。
|
||||||
|
|
||||||
**三乘法链**(技能伤害的合成顺序,技能倍率乘在最前,其后既有链一字不动):
|
**三乘法链**(技能伤害的合成顺序,技能倍率乘在最前,其后既有链一字不动):
|
||||||
|
|
||||||
@@ -200,10 +205,10 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 ×
|
|||||||
② AC 判断值:掷点(骰面读表)vs 防守方护甲等级 → 档位折扣;天然最大面 → 暴击 ×暴击倍率(读表)(量程上下限)
|
② AC 判断值:掷点(骰面读表)vs 防守方护甲等级 → 档位折扣;天然最大面 → 暴击 ×暴击倍率(读表)(量程上下限)
|
||||||
③ 命中伤害 H = (A × a) + 克制修正点数 (克制修正点数读 settlement.tres 甲效矩阵——加法点数非百分比;敌打主角不查矩阵恒中性——矩阵消费面 = 主角侧)
|
③ 命中伤害 H = (A × a) + 克制修正点数 (克制修正点数读 settlement.tres 甲效矩阵——加法点数非百分比;敌打主角不查矩阵恒中性——矩阵消费面 = 主角侧)
|
||||||
── 以下既有链不动 ──
|
── 以下既有链不动 ──
|
||||||
增益池乘区(含敌方防御池)→ 向下取整 → 伤害下限 max(1,·) → 必中附加分量 rider(伤害技 rider_mult 字段:max(伤害下限, floor(攻击基线 × rider_mult)),独立必中加项、不进乘区、不出暴击;无字段 = 无此步)
|
增益池乘区(含敌方防御池)→ 向下取整 → 伤害下限 max(1,·) → 必中附加分量 rider(2026-09-19 新效应词汇批——伤害技 rider_mult 字段:max(伤害下限, floor(攻击基线 × rider_mult)),独立必中加项、不进乘区、不出暴击;无字段 = 无此步)
|
||||||
```
|
```
|
||||||
|
|
||||||
主角先手攻击 = 单一基础分量(量 = 攻击力经增益修正,可被池封顶压到零;**类型 = 主角 `attack_type` 表值**——基础攻击量与攻击类型抽象分离,缺省 normal 向后兼容)。**攻击类型是伤害的属性轴**——它只决定这个分量查甲效表的哪一行,定义里不含任何棋盘来源。分量查表取整;甲效表把攻击类型与敌方护甲类型交叉成一张 3×3 **克制修正矩阵(加法点数)**:每个分量在掷点/暴击折算取整后 **+ 克制修正点数**:
|
主角先手攻击 = 单一基础分量(2026-09-19 充能退役批定稿;量 = 攻击力经增益修正,可被池封顶压到零;**类型 = 主角 `attack_type` 表值**——2026-09-18 营地扩展前置批:基础攻击量与攻击类型抽象分离,基础分量不再恒属普通,缺省 normal 向后兼容)。**攻击类型是伤害的属性轴**——它只决定这个分量查甲效表的哪一行,定义里不含任何棋盘来源。分量查表取整;甲效表把攻击类型与敌方护甲类型交叉成一张 3×3 **克制修正矩阵(加法点数)**——2026-09-18 加法核换装:每个分量在掷点/暴击折算取整后 **+ 克制修正点数**(原百分比乘区退役):
|
||||||
|
|
||||||
| 攻击类型 \ 护甲类型 | 轻甲 | 魔法护甲 | 重甲 | 语义 |
|
| 攻击类型 \ 护甲类型 | 轻甲 | 魔法护甲 | 重甲 | 语义 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
@@ -211,21 +216,21 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 ×
|
|||||||
| 穿刺 | 被克 | 克制 | 中性 | 对魔法护甲克制;对轻甲被克;**重甲中性**(挡得住刀刃、不排斥穿刺——2026-09-18 用户拍板;现行无重甲敌种,纯结构位) |
|
| 穿刺 | 被克 | 克制 | 中性 | 对魔法护甲克制;对轻甲被克;**重甲中性**(挡得住刀刃、不排斥穿刺——2026-09-18 用户拍板;现行无重甲敌种,纯结构位) |
|
||||||
| 魔法 | 中性 | 被克 | 克制 | 绕得过重甲,被魔法护甲吸收 |
|
| 魔法 | 中性 | 被克 | 克制 | 绕得过重甲,被魔法护甲吸收 |
|
||||||
|
|
||||||
修正三档:克制 +1 / 中性 0 / 被克 −1(加法点数,九格分布读 `settlement.tres` 甲效矩阵;三档而非五档的理由 = 攻击基线个位数刻度下 ±2 触伤害下限或翻倍超重,假粒度;攻击成长后可扩弱档)。攻击类型是分量的固有属性(每个分量恒属普通 / 穿刺 / 魔法 之一),护甲类型是防守单位的固有属性,两者都不随层数、来源与轮次漂移;基础分量的类型归属是主角表的可配置值(营地永久强化的换型落点),矩阵键集 3×3 满格、结构冻结,数值 provisional。矩阵消费面 = 主角侧(奖励直伤道具 / 主角攻击基础分量)——敌方攻击现行不查矩阵,主角 armor_type 轴仍休眠、生效待敌方技能攻击类型批。主角增益与乏力经主角输出池修正攻击合计(充能退役后合计 = 单分量,见池乘区公式行)。
|
修正三档:克制 +1 / 中性 0 / 被克 −1(加法点数,九格分布读 `settlement.tres` 甲效矩阵——2026-09-18 加法核换装:量纲由百分比改点数、五档词表退役;三档而非五档的理由 = 攻击基线个位数刻度下 ±2 触伤害下限或翻倍超重,假粒度;攻击成长后可扩弱档)。攻击类型是分量的固有属性(每个分量恒属普通 / 穿刺 / 魔法 之一),护甲类型是防守单位的固有属性,两者都不随层数、来源与轮次漂移;基础分量的类型归属是主角表的可配置值(营地永久强化的换型落点),矩阵键集 3×3 满格、结构冻结,数值 provisional。矩阵消费面 = 主角侧(奖励直伤道具 / 主角攻击基础分量)——敌方攻击现行不查矩阵,主角 armor_type 轴仍休眠、生效待敌方技能攻击类型批。主角增益与乏力经主角输出池修正攻击合计(2026-09-18 结构修复批:普通分量直乘旁路退役;2026-09-19 充能退役后合计 = 单分量,见池乘区公式行)。
|
||||||
|
|
||||||
主角攻击 = 单一基础分量:量 = 攻击力基线(表值),类型 = 主角表 `attack_type`(营地永久强化换型 = 改字段;未来冒险前参数面承接"按关配型"的策略位)。挖掘期与战斗期之间无弹药供给线,克制应对 = 冒险前配型 + 棋盘火力(穿刺弹/魔法矢等直伤奖励道具,消费面不变)。
|
主角攻击 = 单一基础分量(2026-09-19 充能退役批):量 = 攻击力基线(表值),类型 = 主角表 `attack_type`(营地永久强化换型 = 改字段;未来冒险前参数面承接"按关配型"的策略位)。原"普通 + 穿刺/魔法充能三分量"模型整体退役——挖掘期与战斗期之间不再有弹药供给线,克制应对从局内攒桶改为冒险前配型 + 棋盘火力(穿刺弹/魔法矢等直伤奖励道具,消费面不变)。
|
||||||
|
|
||||||
**护甲等级掷点:必中、非归零,只吃基础攻击分量**(判定式与全部数值已拍板)。防守方由此多了一条数值轴——护甲等级(数据键 `armor_class`):攻击永远命中,没有 miss、没有零收益白回合;只有吃掷点的分量在掷点低于防守方护甲等级时按减伤档位打折,档位再重也不归零。判定式:攻击结算时掷单骰(骰面读表),掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额;掷点 < 护甲等级按缺口(护甲等级 − 掷点)查减伤档位表打折——边界与档值读 `settlement.tres` 减伤档位表,三档皆非零档。暴击:天然最大面(读表)使该次基础攻击分量 ×暴击倍率(读表),双方同规,且天然最大面恒全额(暴击与折扣互斥;天然最大面〔nat20〕暴击是掷点层概念,与技能重击〔池技能〕严格区分——两层禁止混述)。伤害下限:**任何来源的伤害落地**至少 damage_floor(读表,全局 max(damage_floor, ·)——2026-09-20 用户拍板扩全来源:攻击双方、棋盘直伤与爆裂、地形变异、负向反噬;伤害取值域 [1, +∞),**不设上限**)——"被减伤归零 v=0"零值伤害行语义已退役,重档折扣的攻击行在行文本记"被压制"。掷点范围:只有基础攻击分量吃掷点——主角先手攻击的基础分量,敌方技能的基础伤害分量(= 攻击基线 × 技能伤害倍率,普通攻击倍率 1 为特例);无伤害分量的技能(增益/妨害类)不掷不折;棋盘来源一律无视护甲等级——爆裂、清障炸药、奖励即时伤害、技能必中附加分量(rider)全部必中全额不掷,这是本机制的边界切口,与"奖励/惩罚必中"同构。护甲等级(数值轴,掷点打折)与护甲类型(属性轴,克制修正)严格分离:护甲类型不做护甲等级映射,克制修正点数读表、消费面不变,两概念在文档、表字段与代码键中禁止混用。数值载体:主角与敌方护甲等级行值读 hero / enemy 表的 armor_class 列(正式行值归怪物设定批,登记[待办清单](../../../../待办清单.md)),ac_up(盾牌加护)在其上加算(幅度/层数读 `status_effects.tres`)。攻击加成(`attack_bonus`)为结构位预留字段,切片恒 0,未来归元进度 / 武器附魔投值。掷点时机在结算战斗段内、每次基础攻击伤害计算时判定,消费 `armor_roll` 封闭流(逐次掷逐次取号,可逐位回放)。
|
**护甲等级掷点:必中、非归零,只吃基础攻击分量**(2026-09-16 定稿落地,判定式与全部数值已拍板;判定对象措辞随敌人技能池批改述)。防守方由此多了一条数值轴——护甲等级(数据键 `armor_class`):攻击永远命中,没有 miss、没有零收益白回合;只有吃掷点的分量在掷点低于防守方护甲等级时按减伤档位打折,档位再重也不归零。判定式:攻击结算时掷单骰(骰面读表),掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额;掷点 < 护甲等级按缺口(护甲等级 − 掷点)查减伤档位表打折——边界与档值读 `settlement.tres` 减伤档位表,三档皆非零档。暴击:天然最大面(读表)使该次基础攻击分量 ×暴击倍率(读表),双方同规,且天然最大面恒全额(暴击与折扣互斥;天然最大面〔nat20〕暴击是掷点层概念,与技能重击〔池技能〕严格区分——两层禁止混述)。伤害下限:**任何来源的伤害落地**至少 damage_floor(读表,全局 max(damage_floor, ·)——2026-09-20 用户拍板扩全来源:攻击双方、棋盘直伤与爆裂、地形变异、负向反噬;伤害取值域 [1, +∞),**不设上限**)——"被减伤归零 v=0"零值伤害行语义顺带退役,重档折扣的攻击行在行文本记"被压制"。掷点范围:只有基础攻击分量吃掷点——主角先手攻击的基础分量,敌方技能的基础伤害分量(= 攻击基线 × 技能伤害倍率,普通攻击倍率 1 为特例);无伤害分量的技能(增益/妨害类)不掷不折;棋盘来源一律无视护甲等级——爆裂、清障炸药、奖励即时伤害、技能必中附加分量(rider,2026-09-19)全部必中全额不掷,这是本机制的边界切口,与"奖励/惩罚必中"同构。护甲等级(数值轴,掷点打折)与护甲类型(属性轴,克制修正)严格分离:护甲类型不做护甲等级映射,克制修正点数读表、消费面不变,两概念在文档、表字段与代码键中禁止混用。数值载体:主角与敌方护甲等级行值读 hero / enemy 表的 armor_class 列(正式行值归怪物设定批,登记[待办清单](../../../../待办清单.md)),ac_up(盾牌加护)在其上加算(幅度/层数读 `status_effects.tres`)。攻击加成(`attack_bonus`)为结构位预留字段,切片恒 0,未来归元进度 / 武器附魔投值。掷点时机在结算战斗段内、每次基础攻击伤害计算时判定,消费 `armor_roll` 封闭流(逐次掷逐次取号,可逐位回放)。
|
||||||
|
|
||||||
EV 参考数不入正文(派生读数,需要时按判定式与现行表值自行复算);旧 defense_up 的减伤墙已整体退役换装为 AC(无双轨)。微调旋钮 = 档位边界与档位值,不动护甲等级值。换装点锚定:基准 AC(读 hero 表)自带的方向性偏移与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)已登记的加难杠杆扫描合并处理;其生存链区间模型按掷点带宽口径复核
|
EV 参考数不入正文(派生读数,需要时按判定式与现行表值自行复算);旧 defense_up 的减伤墙已整体退役换装为 AC(无双轨)。微调旋钮 = 档位边界与档位值,不动护甲等级值。换装点锚定:基准 AC(读 hero 表)自带的方向性偏移与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)已登记的加难杠杆扫描合并处理;其生存链区间模型按掷点带宽口径复核
|
||||||
|
|
||||||
**结论**:先合成、再取整、全程非负;吃掷点分量必中非归零、低掷按档位折扣、天然最大面暴击恒全额(倍率读表)、落地伤害保底 ≥ damage_floor(读表);溢杀丢弃、治疗封顶、死亡即时判定。
|
**结论**:先合成、再取整、全程非负;吃掷点分量必中非归零、低掷按档位折扣、天然最大面暴击恒全额(倍率读表)、落地伤害保底 ≥ damage_floor(读表);溢杀丢弃、治疗封顶、死亡即时判定。
|
||||||
|
|
||||||
```
|
```
|
||||||
敌方一次技能攻击 = max(damage_floor, floor( 掷点档位技能基础分量 ) × 主角防御乘数 × 敌方输出乘数 ) + 必中附加分量 rider(若有——max(damage_floor, floor(攻击基线 × rider_mult)),rider 为后置加法不进乘区不掷不折);增益/妨害技 = 0 伤害施放行(不掷不折),妨害状态按状态行 target_side 落主角
|
敌方一次技能攻击 = max(damage_floor, floor( 掷点档位技能基础分量 ) × 主角防御乘数 × 敌方输出乘数 ) + 必中附加分量 rider(若有——2026-09-19 新效应词汇批:max(damage_floor, floor(攻击基线 × rider_mult)),rider 为后置加法不进乘区不掷不折);增益/妨害技 = 0 伤害施放行(不掷不折),妨害状态按状态行 target_side 落主角
|
||||||
主角一次攻击 = max(damage_floor, floor( 攻击合计 × (100 + 主角输出乘数池合成值) ÷ 100 × (100 + 敌方防御乘数池合成值) ÷ 100 ) )——主角输出池(增伤/乏力载体)与敌方防御池(硬化载体)两池串乘在攻击合计之后(合计 = 单分量)
|
主角一次攻击 = max(damage_floor, floor( 攻击合计 × (100 + 主角输出乘数池合成值) ÷ 100 × (100 + 敌方防御乘数池合成值) ÷ 100 ) )——主角输出池(增伤/乏力载体)与敌方防御池(硬化载体)两池串乘在攻击合计之后(2026-09-19 充能退役后合计 = 单分量)
|
||||||
粒度口径:增益池乘区作用在攻击合计层——合计为个位数时百分比档存在粒度取整(如合计 2 点 ×0.75 → 1,实际约 −33% 大于名义 −25%),为已知行为、接受现状;百分比仅保留增益池 / AC 折扣档 / 暴击三处既有粗档,终值与量纲复核归状态层重设计批
|
粒度口径:增益池乘区作用在攻击合计层——合计为个位数时百分比档存在粒度取整(如合计 2 点 ×0.75 → 1,实际约 −33% 大于名义 −25%),为已知行为、接受现状;2026-09-18 数值语言拍板后百分比仅保留增益池 / AC 折扣档 / 暴击三处既有粗档,终值与量纲复核归状态层重设计批
|
||||||
乘数 = 1 + 池合成值 ÷ 100;池内加算、每池独立封顶 ±100 百分点 → 乘数域 [0, 2];四池对称:敌打主角 = 主角防御池 × 敌方输出池,主角打敌 = 主角输出池 × 敌方防御池(主角输出池乘区已接线——attack_up 普通分量直乘旁路已退役)
|
乘数 = 1 + 池合成值 ÷ 100;池内加算、每池独立封顶 ±100 百分点 → 乘数域 [0, 2];四池对称:敌打主角 = 主角防御池 × 敌方输出池,主角打敌 = 主角输出池 × 敌方防御池(2026-09-18 结构修复批:主角输出池乘区接线落地——attack_up 普通分量直乘旁路退役,旧"切片现状"注记销项)
|
||||||
护甲等级掷点:掷单骰(骰面读表),掷点 ≥ 护甲等级 + 攻击加成 → 全额;低掷按缺口查减伤档位表(边界与档值读表,无零档)
|
护甲等级掷点:掷单骰(骰面读表),掷点 ≥ 护甲等级 + 攻击加成 → 全额;低掷按缺口查减伤档位表(边界与档值读表,无零档)
|
||||||
暴击:天然最大面(读表)→ 该次基础攻击分量 ×暴击倍率(读表)且恒全额(双方同规;掷点层概念,与技能重击严格区分)
|
暴击:天然最大面(读表)→ 该次基础攻击分量 ×暴击倍率(读表)且恒全额(双方同规;掷点层概念,与技能重击严格区分)
|
||||||
伤害下限:任何来源的伤害落地 ≥ damage_floor(读表,全局 max(damage_floor, ·)——折扣与池归零都不产生 v=0 伤害行;2026-09-20 扩全来源,取值域 [1, +∞))
|
伤害下限:任何来源的伤害落地 ≥ damage_floor(读表,全局 max(damage_floor, ·)——折扣与池归零都不产生 v=0 伤害行;2026-09-20 扩全来源,取值域 [1, +∞))
|
||||||
@@ -236,7 +241,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
| 边界 | 规则 |
|
| 边界 | 规则 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 修正池封顶 | 同侧百分比修正加算后每池独立封顶 ±100 百分点;乘数可为 0——输出压制触池底时落地伤害由全局下限保底 damage_floor(读表)(叠满免伤归零的结构面已随护甲等级换装消失) |
|
| 修正池封顶 | 同侧百分比修正加算后每池独立封顶 ±100 百分点;乘数可为 0——输出压制触池底时落地伤害由全局下限保底 damage_floor(读表)(叠满免伤归零的结构面已随护甲等级换装消失) |
|
||||||
| 伤害下限 | 任何来源的伤害落地至少 damage_floor(读表,全局 max(damage_floor, ·)——覆盖攻击双方/棋盘直伤/地形变异/负向反噬,取值域 [1, +∞) 不设上限);"被减伤归零 v=0"零值伤害行语义退役,重档折扣行文本记"被压制"——免伤与零输出仍逐行可见 |
|
| 伤害下限 | 任何来源的伤害落地至少 damage_floor(读表,全局 max(damage_floor, ·)——2026-09-20 扩全来源:攻击双方/棋盘直伤/地形变异/负向反噬,取值域 [1, +∞) 不设上限);"被减伤归零 v=0"零值伤害行语义退役,重档折扣行文本记"被压制"——免伤与零输出仍逐行可见 |
|
||||||
| 护甲等级掷点 | 必中非归零:掷单骰(骰面读表)对防守方护甲等级 + 攻击加成(恒 0),低掷按缺口查减伤档位表(读表)三档折扣、档位不设零档;天然最大面暴击 ×暴击倍率(读表)恒全额;只吃基础攻击分量(主角基础分量、敌方技能基础伤害分量),棋盘来源伤害与增益施放不掷不折 |
|
| 护甲等级掷点 | 必中非归零:掷单骰(骰面读表)对防守方护甲等级 + 攻击加成(恒 0),低掷按缺口查减伤档位表(读表)三档折扣、档位不设零档;天然最大面暴击 ×暴击倍率(读表)恒全额;只吃基础攻击分量(主角基础分量、敌方技能基础伤害分量),棋盘来源伤害与增益施放不掷不折 |
|
||||||
| 溢杀 | 一刀超出目标剩余生命的部分丢弃:不转移给下一个敌人、不存续、无负生命中间态 |
|
| 溢杀 | 一刀超出目标剩余生命的部分丢弃:不转移给下一个敌人、不存续、无负生命中间态 |
|
||||||
| 治疗 | 生命不溢出上限;满血正向治疗零兑付,记"奖励未生效"行 |
|
| 治疗 | 生命不溢出上限;满血正向治疗零兑付,记"奖励未生效"行 |
|
||||||
@@ -257,27 +262,27 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
└─ 关卡结束(上层显式调用)→ 清空秘宝背包,给出可见反馈
|
└─ 关卡结束(上层显式调用)→ 清空秘宝背包,给出可见反馈
|
||||||
```
|
```
|
||||||
|
|
||||||
停手与耗尽收轮的回合恒为同图继续;换图指令只允许出现在清图轮,其他轮发换图属于程序错误、立即上抛。秘宝背包以关卡为界:战斗结束不清背包,跨战斗延续;关卡结束时一次性清空,清空前先返回快照计数,作为"剩余秘宝随关卡结束清空"的可见反馈。战斗道具背包已随可选类删除下线。(注:清空对象 = 关卡域秘宝库存——秘宝过渡形态的机械惰性承载,其投放渠道已全退役、现行恒空;现行秘宝=营地同调装配件、整局冒险生效不经此域,拆线归实装批——见[秘宝](../跨局循环/秘宝.md)沿革节。)
|
停手与耗尽收轮的回合恒为同图继续;换图指令只允许出现在清图轮,其他轮发换图属于程序错误、立即上抛。秘宝背包以关卡为界:战斗结束不清背包,跨战斗延续;关卡结束时一次性清空,清空前先返回快照计数,作为"剩余秘宝随关卡结束清空"的可见反馈。战斗道具背包已随可选类删除(2026-09-15)下线。(2026-10-09 注:清空对象 = 关卡域秘宝库存——秘宝过渡形态的机械惰性承载,其投放渠道已随迭代 11 第①批全退役、现行恒空;现行秘宝=营地同调装配件、整局冒险生效不经此域,拆线归实装批——见[秘宝](../跨局循环/秘宝.md)沿革节。)
|
||||||
|
|
||||||
挖掘期刷新是玩家在挖掘中途主动换图,经[行动经济](../排雷循环/行动经济.md)扣费:扣费成功后按"旧板退役、生成新板、装板、资源预分配恰一次、变异布置"编排,本轮不打断——没有结算段、没有轮次结束。储备不足被拒是玩家决策的合法结果,不是编排错误。刷新图不发清图奖励,完美封印计数随装板重置。
|
挖掘期刷新是玩家在挖掘中途主动换图,经[行动经济](../排雷循环/行动经济.md)扣费:扣费成功后按"旧板退役、生成新板、装板、资源预分配恰一次、变异布置"编排,本轮不打断——没有结算段、没有轮次结束。储备不足被拒是玩家决策的合法结果,不是编排错误。刷新图不发清图奖励,完美封印计数随装板重置。
|
||||||
|
|
||||||
### 换图系专长:刷新事实与本轮兑付(已实装)
|
### 换图系专长:刷新事实与本轮兑付(设计定稿,待实现)
|
||||||
|
|
||||||
持有换图系后续专长时,成功刷新除执行上述换图编排外,还产生一次 `board_refreshed` 事实——它是换图系效果兑付的统一事实挂点。事实只在新板装板成功后登记恰一次;刷新被拒绝时不产生事实,任何后续效果都不触发。同一轮多次成功刷新按发生顺序逐次登记,不合并成一次。
|
持有换图系后续专长时,成功刷新除执行上述换图编排外,还产生一次 `board_refreshed` 事实。旧图退役前保存它的探索进度与清图奖励对象身份;新板就位后登记事实。刷新被拒绝时不产生事实,任何后续效果都不触发。同一轮多次成功刷新按发生顺序逐次登记,不合并成一次。
|
||||||
|
|
||||||
刷新只登记事实,不当场插入结算。各效果在既有五段与对应消费点兑付:
|
刷新只登记事实,不当场插入结算。各效果在既有五段内兑付:
|
||||||
|
|
||||||
| 专长 | 兑付规则 |
|
| 专长 | 兑付规则 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 崩壁冲击 | 每次刷新事实开一张全体敌人伤害单据,在本轮战斗段末经伤害控制器统一结账;目标按结账时的存活状态解析 |
|
| 弃图轰击 | 每次刷新事实开一张全体敌人伤害单据,在本轮战斗段末经伤害控制器统一结账;目标按结账时的存活状态解析 |
|
||||||
| 蓄力周转 | 每次刷新事实累计一层,最多 3 层;本轮下一次主角攻击消费全部层数对应的攻击加成,随后清零;战斗结束不跨战保留 |
|
| 换图蓄势 | 每次刷新事实当场累计一层,受表值上限约束;下一次主角攻击附加全部层数对应的伤害,随后清零;战斗结束清空 |
|
||||||
| 石层缓冲 | 每次刷新事实把当轮全局减伤状态置为生效;本轮主角每次受到伤害都固定减少 2 点,同一轮多次刷新不继续叠加 |
|
| 换图庇护 | 每次刷新事实在本轮授予段经既有护盾通道授予一次,不新开挖掘期状态入口 |
|
||||||
| 坑道小憩 | 每次刷新事实累计 1 点恢复量,最多 3 点;本轮授予段合计回复生命,封顶生命上限,随后清零;满血时记未生效行 |
|
| 弃图休整 | 每次刷新事实在本轮授予段回复生命,按既有治疗规则封顶生命上限;满血时记未生效行 |
|
||||||
| 矿道红利 | 每次刷新事实固定获得 1 GP,走战斗内 GP 缓冲并在授予段留痕;不按旧图探索进度折算,也不与清图奖励绑定 |
|
| 弃图回收 | 每次刷新事实在本轮授予段按旧图探索进度回收其清图奖励对象;进度与奖励口径归[地图战斗资源](地图战斗资源.md) |
|
||||||
|
|
||||||
全局受伤事件统一:`damage_taken` 是主角受到伤害的唯一效果事件——敌方攻击、危险格、错误封印资源直伤与地形四条伤害路径统一经同一发射口发出、同一消费族消费,对该事件的全部既有订阅(减免、护甲修正、反击攒点、护盾吸收)对四条路径同等生效。石层缓冲订阅该事件并在现行伤害下限之前消费。临时生命值不在换图系流派设计范围内。
|
弃图轰击若击杀最后敌人,仍由本轮判定段按既有顺序判胜,不新增挖掘期即时胜利出口。换图系效果使用扩展行留痕:来源写明专长与被弃旧图,弃图轰击走伤害单据,护盾、回血与回收各保留自己的兑付记录;它们不指向单一棋盘格,使用明细流水的专长刷新效果来源豁免,不伪造来源格。
|
||||||
|
|
||||||
崩壁冲击若击杀最后敌人,仍由本轮判定段按既有顺序判胜,不新增挖掘期即时胜利出口。换图系效果使用扩展行留痕:崩壁冲击走伤害单据,石层缓冲在受伤消费行体现减免,坑道小憩与矿道红利分别走治疗与 GP 入账记录。刷新事实来源不指向单一棋盘格,使用明细流水的专长刷新效果来源豁免,不伪造来源格。
|
弃图回收不是清图:不触发完美封印加倍,不发清图事件,不改变「刷新图不发清图奖励」。它兑的是被放弃旧图按探索进度回收的一部分奖励。
|
||||||
|
|
||||||
战斗开始按固定序列开张:关上配置热重载的闸门、初始化状态池、掷骰定敌方实际数量、生成敌人、装板并预分配资源恰一次、变异布置([地形变异](../排雷循环/地形变异.md)——棋盘设置顺序第 4 步:生成棋盘 → 打开状态初始化 → 战斗资源格设置 → 变异格设置,消费 `variant_place` 封闭流)、发开轮通知并执行开轮摇号(摇定首轮各敌本拍动作)。上一关的大奖励(如血上限提升)经战斗开始入参的覆盖值通道生效,内容归[冒险结构](../冒险循环/冒险结构.md)。
|
战斗开始按固定序列开张:关上配置热重载的闸门、初始化状态池、掷骰定敌方实际数量、生成敌人、装板并预分配资源恰一次、变异布置([地形变异](../排雷循环/地形变异.md)——棋盘设置顺序第 4 步:生成棋盘 → 打开状态初始化 → 战斗资源格设置 → 变异格设置,消费 `variant_place` 封闭流)、发开轮通知并执行开轮摇号(摇定首轮各敌本拍动作)。上一关的大奖励(如血上限提升)经战斗开始入参的覆盖值通道生效,内容归[冒险结构](../冒险循环/冒险结构.md)。
|
||||||
|
|
||||||
@@ -296,7 +301,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
| 上游 | [敌人系统](敌人系统.md) | 单位接口全调用面:生成、查询、扣血、摇定写入、执行上报、默认目标、警觉授予、清场;护甲等级(防守方掷点判定读数)随单位数据供给;池模板与技能行数据归它 |
|
| 上游 | [敌人系统](敌人系统.md) | 单位接口全调用面:生成、查询、扣血、摇定写入、执行上报、默认目标、警觉授予、清场;护甲等级(防守方掷点判定读数)随单位数据供给;池模板与技能行数据归它 |
|
||||||
| 上游 | [增益状态](增益状态.md) | 状态池接口全调用面:初始化、授予、读值、衰减、清空 |
|
| 上游 | [增益状态](增益状态.md) | 状态池接口全调用面:初始化、授予、读值、衰减、清空 |
|
||||||
| 上游 | [地图战斗资源](地图战斗资源.md) | 格面资源接口:预分配、身份查询、受理、清图对象、当量供给投影、映射退役 |
|
| 上游 | [地图战斗资源](地图战斗资源.md) | 格面资源接口:预分配、身份查询、受理、清图对象、当量供给投影、映射退役 |
|
||||||
| 上游 | [冒险结构](../冒险循环/冒险结构.md) | 战斗触发、遭遇上下文与主角入参覆盖值(覆盖值通道已正式接线——接口四件套正式侧承载) |
|
| 上游 | [冒险结构](../冒险循环/冒险结构.md) | 战斗触发、遭遇上下文与主角入参覆盖值(覆盖值通道已随冒险结构实现批正式接线——接口四件套正式侧承载) |
|
||||||
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 明细流水是结算明细屏的统一数据源(未生效类行须带形状冗余防误读);状态读取走下方呈现只读面 |
|
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 明细流水是结算明细屏的统一数据源(未生效类行须带形状冗余防误读);状态读取走下方呈现只读面 |
|
||||||
| 下游 | [战斗表现](战斗表现.md) | 结算步骤流是战斗动画回放的脚本源 |
|
| 下游 | [战斗表现](战斗表现.md) | 结算步骤流是战斗动画回放的脚本源 |
|
||||||
| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 五条经济契约的对账结论是其调参约束输入(对账现状登记 [待办清单](../../../../待办清单.md)) |
|
| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 五条经济契约的对账结论是其调参约束输入(对账现状登记 [待办清单](../../../../待办清单.md)) |
|
||||||
@@ -307,7 +312,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
|
|
||||||
| 呈现面 | 形态 | 载荷与语义 |
|
| 呈现面 | 形态 | 载荷与语义 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 呈现状态快照 | 只读函数,全量 | 轮次、战斗结果、相位、行动点与储备、刷新可用性、主角(生命/上限/攻击/存活)、敌人数组(顺位/显示名/生命/敌种/护甲类型/护甲等级/摇定动作〔技能编号/类型/名〕/敌方增益/存活)、主角活跃效果投影——呈现层唯一的状态读取出口(池与权重不公开) |
|
| 呈现状态快照 | 只读函数,全量 | 轮次、战斗结果、相位、行动点与储备、刷新可用性、主角(生命/上限/攻击/存活)、敌人数组(顺位/显示名/生命/敌种/护甲类型/护甲等级/摇定动作〔技能编号/类型/名〕/敌方增益/存活)、主角活跃效果投影——呈现层唯一的状态读取出口(敌人技能池批批 2 定稿:行为环当前拍/环进度字段随行为环退役拆除——2026-09-16,池与权重不公开) |
|
||||||
| 战斗进行中谓词 | 只读函数,布尔 | 战斗未出结果且主角在场——组合根高频相位判断的低成本面 |
|
| 战斗进行中谓词 | 只读函数,布尔 | 战斗未出结果且主角在场——组合根高频相位判断的低成本面 |
|
||||||
| 奖励身份查询 | 只读函数,单格 | 已开格奖励身份解析的代理,转[地图战斗资源](地图战斗资源.md)的身份查询(就绪相位守卫归对方)——组合根注入棋盘徽章回调 |
|
| 奖励身份查询 | 只读函数,单格 | 已开格奖励身份解析的代理,转[地图战斗资源](地图战斗资源.md)的身份查询(就绪相位守卫归对方)——组合根注入棋盘徽章回调 |
|
||||||
| 结算快照信号 | 信号,每次结算末 | 对象销毁前组装的全量状态快照(终局含胜负结果)——测试记录与数值分析消费 |
|
| 结算快照信号 | 信号,每次结算末 | 对象销毁前组装的全量状态快照(终局含胜负结果)——测试记录与数值分析消费 |
|
||||||
@@ -320,7 +325,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
1. 战斗开始序列跑完(关闸门、初始化状态池、掷骰定敌数、生成敌人、装板并预分配资源、发开轮通知 + 开轮摇号),进入第一轮挖掘期。
|
1. 战斗开始序列跑完(关闸门、初始化状态池、掷骰定敌数、生成敌人、装板并预分配资源、发开轮通知 + 开轮摇号),进入第一轮挖掘期。
|
||||||
2. 挖掘期本系统只缓冲事实流(开格、封印入结算队列),不做任何兑付。
|
2. 挖掘期本系统只缓冲事实流(开格、封印入结算队列),不做任何兑付。
|
||||||
3. 轮末自动触发五段结算,触发与事件到达序无关。
|
3. 轮末自动触发五段结算,触发与事件到达序无关。
|
||||||
4. 授予段按轮末在场封印基线兑付(封印格拒绝挖掘,在场封印必然全部在基线),再按极性矩阵三批兑现:开安全格兑正向、开危险格 / 标错封印兑负向、清图发清图奖励对象(完美乘数读 settlement.tres p_perfect)。
|
4. 授予段按判定基线过滤(被挖开的封印不入判定),再按极性矩阵三批兑现:开安全格兑正向(封印安全格直挖 = 四情况④零奖励作废行)、开危险格 / 标错封印兑负向(封印危险格直挖照常——四情况②)、清图发清图奖励对象(完美乘数读 settlement.tres p_perfect)。
|
||||||
5. 增益合成、主角先手加逐敌按摇定技能兑付(伤害技三乘法链 / 增益技施放行)加地图伤害账殿后(暂存单随战斗段末统一结账)、衰减恰好一次。
|
5. 增益合成、主角先手加逐敌按摇定技能兑付(伤害技三乘法链 / 增益技施放行)加地图伤害账殿后(暂存单随战斗段末统一结账)、衰减恰好一次。
|
||||||
6. 判定段先主角后敌人:继续通知同图、清图换图续轮、胜负走战斗结束清理(秘宝背包不清)。
|
6. 判定段先主角后敌人:继续通知同图、清图换图续轮、胜负走战斗结束清理(秘宝背包不清)。
|
||||||
7. 明细流水全程落行,供呈现、回放与导出。
|
7. 明细流水全程落行,供呈现、回放与导出。
|
||||||
@@ -340,10 +345,10 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 参考敞口 | int [1, 999] | 读 `settlement.tres` equivalence_ref_damage(provisional) | 当量折算的代表性敞口;变更须重跑全部对账 |
|
| 参考敞口 | int [1, 999] | 读 `settlement.tres` equivalence_ref_damage(provisional) | 当量折算的代表性敞口;变更须重跑全部对账 |
|
||||||
| 完美乘数 | percent {100, 200} | 读 `settlement.tres` p_perfect(provisional) | 100 为仅高光、无第二份;域外加载拒绝 |
|
| 完美乘数 | percent {100, 200} | 读 `settlement.tres` p_perfect(provisional) | 100 为仅高光、无第二份;域外加载拒绝 |
|
||||||
| 甲效矩阵 | 整数点数 {−1, 0, +1} | 三档加法修正(克制 +1 / 中性 0 / 被克 −1)九格现行值读 `settlement.tres`(provisional) | 键集 = 攻击类型 {普通, 穿刺, 魔法} × 护甲类型 {轻甲, 魔法护甲, 重甲},3×3 满格结构冻结;数值归调参 |
|
| 甲效矩阵 | 整数点数 {−1, 0, +1} | 三档加法修正(克制 +1 / 中性 0 / 被克 −1)九格现行值读 `settlement.tres`(provisional——2026-09-18 加法核换装,量纲 percent 退役) | 键集 = 攻击类型 {普通, 穿刺, 魔法} × 护甲类型 {轻甲, 魔法护甲, 重甲},3×3 满格结构冻结;数值归调参 |
|
||||||
| 护甲等级掷点 | 骰面 int [2,1000] · nat 最大面 [1,骰面] · 暴击倍率 percent [100,999] | 骰面 / nat 最大面 / 暴击倍率读表(2026-09-16 拍板定稿) | 回合内随机:每吃掷点分量逐次掷骰,掷点低于防守方护甲等级 + 攻击加成触发档位折扣;天然最大面暴击 ×暴击倍率(读表)且恒全额(双方同规);消费 `armor_roll` 封闭流(逐次掷逐次取号) |
|
| 护甲等级掷点 | 骰面 int [2,1000] · nat 最大面 [1,骰面] · 暴击倍率 percent [100,999] | 骰面 / nat 最大面 / 暴击倍率读表(2026-09-16 拍板定稿) | 回合内随机:每吃掷点分量逐次掷骰,掷点低于防守方护甲等级 + 攻击加成触发档位折扣;天然最大面暴击 ×暴击倍率(读表)且恒全额(双方同规);消费 `armor_roll` 封闭流(逐次掷逐次取号) |
|
||||||
| 减伤档位表 | 边界升序 + 档位值降序 percent [1,99],档数 = 边界数 + 1 | 边界与档值读 `settlement.tres`(roll_tier_bounds / discount 档位,2026-09-16 拍板定稿) | 低掷缺口按边界查档(读表);档位不设零档(非归零);微调旋钮 = 本表,不动护甲等级值 |
|
| 减伤档位表 | 边界升序 + 档位值降序 percent [1,99],档数 = 边界数 + 1 | 边界与档值读 `settlement.tres`(roll_tier_bounds / discount 档位,2026-09-16 拍板定稿) | 低掷缺口按边界查档(读表);档位不设零档(非归零);微调旋钮 = 本表,不动护甲等级值 |
|
||||||
| 伤害下限 `damage_floor` | int [1, 999] | 读 `settlement.tres` damage_floor(2026-09-16 拍板定稿;全来源适用) | 任何来源的伤害落地全局 max(damage_floor, ·);零值伤害行语义已退役 |
|
| 伤害下限 `damage_floor` | int [1, 999] | 读 `settlement.tres` damage_floor(2026-09-16 拍板定稿;2026-09-20 扩全来源) | 任何来源的伤害落地全局 max(damage_floor, ·);零值伤害行语义顺带退役 |
|
||||||
| 攻击加成 `attack_bonus` | int [0, 999] | 0(结构位) | 掷点阈值 = 防守方护甲等级 + 攻击加成;切片恒 0,未来归元进度 / 武器附魔投值 |
|
| 攻击加成 `attack_bonus` | int [0, 999] | 0(结构位) | 掷点阈值 = 防守方护甲等级 + 攻击加成;切片恒 0,未来归元进度 / 武器附魔投值 |
|
||||||
| 护甲等级 `armor_class`(防守方字段) | int [0, 999] | 主角与敌方现行值读 hero / enemy 表 armor_class 列(暂定) | 字段本体在敌人表与主角表(归[敌人系统](敌人系统.md)),行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);敌方正式行值归怪物设定批(见待办清单);与护甲类型(克制属性轴)两概念禁止混用 |
|
| 护甲等级 `armor_class`(防守方字段) | int [0, 999] | 主角与敌方现行值读 hero / enemy 表 armor_class 列(暂定) | 字段本体在敌人表与主角表(归[敌人系统](敌人系统.md)),行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);敌方正式行值归怪物设定批(见待办清单);与护甲类型(克制属性轴)两概念禁止混用 |
|
||||||
| 段序常量 | 固定五段 | 结构冻结 | 加载期恒等校验,违例拒绝启动 |
|
| 段序常量 | 固定五段 | 结构冻结 | 加载期恒等校验,违例拒绝启动 |
|
||||||
@@ -356,28 +361,27 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
|
|||||||
|
|
||||||
- 五段全序:任一轮结算的明细行按五段顺序排列。
|
- 五段全序:任一轮结算的明细行按五段顺序排列。
|
||||||
- 触发与到达序无关:同一轮末的两条结束消息按任意先后驱动,结算步骤流逐行相同。
|
- 触发与到达序无关:同一轮末的两条结束消息按任意先后驱动,结算步骤流逐行相同。
|
||||||
- 封印受理即揭示零兑付:封印受理只完成揭示与立印,当场零资源兑付(无正向无负向);兑付只发生在轮末封印判定批——标中正向 / 标空负向,在场封印全部入判定基线;开格事实不可撤。
|
- 挖封印格兑付改判(封印不可逆批 2026-09-19):有封印格直接挖开被受理——封印安全格直挖零奖励(作废归因行恰一次)、封印危险格直挖只吃挖雷惩罚;被挖开的封印不入轮末判定(零标中 / 标空兑付);开格事实不可撤。
|
||||||
- 每事实恰一次:每格受理、每封印判定恰好一次;重复投递不改变结果。
|
- 每事实恰一次:每格受理、每封印判定恰好一次;重复投递不改变结果。
|
||||||
- 极性路由正确:开安全格 / 封印标中只兑正向、开危险格 / 标错封印只兑负向;兑付效果与该格资源类型的字典行一一对应。
|
- 极性路由正确:开安全格 / 封印标中只兑正向、开危险格 / 标错封印只兑负向;兑付效果与该格资源类型的字典行一一对应。
|
||||||
- 警觉按个体:每只敌各持自己的警觉实例、互不共享;blast 负向逐层直授无上限(个体化——2026-11-02 用户裁)。
|
- 警觉共享:敌方全体共享同一警觉状态值;blast 负向逐层直授无上限(伏击退役换装——2026-09-20 八型批)。
|
||||||
- 完美封印:零误标且至少一面标中时第二份兑付恰一次并发高光行;出现误标或零标中则无高光;计数换图重置。
|
- 完美封印:零误标且至少一面标中时第二份兑付恰一次并发高光行;出现误标或零标中则无高光;计数换图重置。
|
||||||
- 开轮摇号:每轮恰摇一次(首轮同样;轮内刷新换图不重摇);摇定后兑现前死亡 → 本拍技能作废(零敌方行动行)、不进冷却不进保底计数;已兑现技能进冷却、保底计数按执行结果更新。
|
- 开轮摇号:每轮恰摇一次(首轮同样;轮内刷新换图不重摇);摇定后兑现前死亡 → 本拍技能作废(零敌方行动行)、不进冷却不进保底计数;已兑现技能进冷却、保底计数按执行结果更新。
|
||||||
- 战斗段次序:主角先手后逐敌"按摇定技能行兑现、结算伤害、执行上报"各恰一次;主角倒下立即短路,剩余敌人不行动。
|
- 战斗段次序:主角先手后逐敌"按摇定技能行兑现、结算伤害、执行上报"各恰一次;主角倒下立即短路,剩余敌人不行动。
|
||||||
- 护甲等级掷点:吃掷点分量(主角基础分量、敌方技能基础伤害分量)逐次掷单骰(骰面读表)——掷点 ≥ 防守方护甲等级 + 攻击加成全额兑付;低掷按缺口查减伤档位表(边界与档值读表),档位不设零档;天然最大面暴击该分量 ×暴击倍率(读表)且恒全额;穿刺/魔法分量与棋盘来源伤害(爆裂、清障炸药、奖励即时)、必中附加分量及增益/妨害施放不掷不折。
|
- 护甲等级掷点:吃掷点分量(主角基础分量、敌方技能基础伤害分量)逐次掷单骰(骰面读表)——掷点 ≥ 防守方护甲等级 + 攻击加成全额兑付;低掷按缺口查减伤档位表(边界与档值读表),档位不设零档;天然最大面暴击该分量 ×暴击倍率(读表)且恒全额;穿刺/魔法分量与棋盘来源伤害(爆裂、清障炸药、奖励即时)、必中附加分量及增益/妨害施放不掷不折。
|
||||||
- 新效应词汇:伤害技 rider_mult 行的每次攻击,伤害行携带 rider 值且终值 = max(伤害下限, 主分量链结果) + rider(停手轮零池下逐拍精确复算);rider 键只随带 rider_mult 的技能行出现;妨害技 = 施放行 + 状态按 target_side 落主角(投掷阈值随行可读下调),冷却/保底/死亡作废三闸无一例外。
|
- 新效应词汇(2026-09-19):伤害技 rider_mult 行的每次攻击,伤害行携带 rider 值且终值 = max(伤害下限, 主分量链结果) + rider(停手轮零池下逐拍精确复算);rider 键只随带 rider_mult 的技能行出现;妨害技 = 施放行 + 状态按 target_side 落主角(投掷阈值随行可读下调),冷却/保底/死亡作废三闸无一例外。
|
||||||
- 伤害下限与留档:任何来源的伤害落地 ≥ damage_floor(读表,全来源适用),全流水零 v=0 伤害行、零"被减伤归零"行;掷点读数、护甲等级与档位随伤害行留档,天然最大面(nat20)行带暴击标记。
|
- 伤害下限与留档:任何来源的伤害落地 ≥ damage_floor(读表,2026-09-20 扩全来源),全流水零 v=0 伤害行、零"被减伤归零"行;掷点读数、护甲等级与档位随伤害行留档,天然最大面(nat20)行带暴击标记。
|
||||||
- 数值边界:伤害下限保底后全程无零值/负值伤害;溢杀丢弃不转移;治疗封顶不溢出。
|
- 数值边界:伤害下限保底后全程无零值/负值伤害;溢杀丢弃不转移;治疗封顶不溢出。
|
||||||
- 出口分发:先判主角倒下(负)再判敌清空(胜);停手与耗尽轮恒同图,清图轮才允许换图。
|
- 出口分发:先判主角倒下(负)再判敌清空(胜);停手与耗尽轮恒同图,清图轮才允许换图。
|
||||||
- 关卡收束:关卡结束清空秘宝背包(关卡域库存——现行恒空的机械惰性承载,见「轮次生命周期」节注)恰一次并返回清空前计数;战斗结束不清背包。
|
- 关卡收束:关卡结束清空秘宝背包(关卡域库存——现行恒空的机械惰性承载,见「轮次生命周期」节注)恰一次并返回清空前计数;战斗结束不清背包。
|
||||||
- 可回放(封闭随机流口径):同种子同输入两遍步骤流逐位复现;随机消费仅限七处封闭随机流——开战掷骰(初始化随机)、技能摇号 `behavior_roll`(回合内、开轮时点、步骤流之外)、护甲等级掷点 `armor_roll`(回合内、步骤流之内)、奖励格摇号 `reward_roll`(初始化、装板期)、变异布置 `variant_place`(初始化、装板与资源预分配之后)、换板棋盘生成 `board_gen`(初始化、清图轮换板时点)、战斗结束掉落掷定 `gp_drop`(出口随机、战斗结束分支),无未登记随机源、零界面等待;单敌出招轨迹可独立复放、互不穿插。
|
- 可回放(封闭随机流口径):同种子同输入两遍步骤流逐位复现;随机消费仅限七处封闭随机流——开战掷骰(初始化随机)、技能摇号 `behavior_roll`(回合内、开轮时点、步骤流之外)、护甲等级掷点 `armor_roll`(回合内、步骤流之内)、奖励格摇号 `reward_roll`(初始化、装板期)、变异布置 `variant_place`(初始化、装板与资源预分配之后)、换板棋盘生成 `board_gen`(初始化、清图轮换板时点)、战斗结束掉落掷定 `gp_drop`(出口随机、战斗结束分支),无未登记随机源、零界面等待;单敌出招轨迹可独立复放、互不穿插。
|
||||||
- 无来源即炸:每行明细都能指回一个来源事实(棋盘格、单位、清图或段级结论);找不到来源即断言失败,行型与来源类别两层豁免清单见明细流水一节,豁免行仍受其它契约约束。
|
- 无来源即炸:每行明细都能指回一个来源事实(棋盘格、单位、清图或段级结论);找不到来源即断言失败,行型与来源类别两层豁免清单见明细流水一节,豁免行仍受其它契约约束。
|
||||||
- 行型封闭:流水行型只出现本文登记的基础 9 类与扩展行;行型词表改动必须走本文修订并同步呈现层行格式化,未登记行型禁止落行。
|
- 行型封闭:流水行型只出现本文登记的基础 9 类与扩展行;行型词表改动必须走本文修订并同步呈现层行格式化,未登记行型禁止落行。
|
||||||
- 伤害单据管线:全部伤害(主角先手、敌方伤害技、棋盘克制直伤、群伤、反噬、地形变异)经伤害控制器单据管线兑现,兑付配方封闭五种;目标在结账时刻照规则解析;死亡事件由单位自行宣布——怪死其未结单据作废(零行、不进冷却不进保底计数)、主角死兑付终止;段界结账为现行口径、开单即结为回切结构位,两模式各自同种子同输入逐位复现。
|
- 伤害单据管线(2026-09-24):全部伤害(主角先手、敌方伤害技、棋盘克制直伤、群伤、反噬、地形变异)经伤害控制器单据管线兑现,兑付配方封闭五种;目标在结账时刻照规则解析;死亡事件由单位自行宣布——怪死其未结单据作废(零行、不进冷却不进保底计数)、主角死兑付终止;段界结账为现行口径、开单即结为回切结构位,两模式各自同种子同输入逐位复现。
|
||||||
- 换图系刷新事实:成功刷新保存旧图探索进度并登记一次事实,被拒绝时不登记;同一轮多次刷新按发生顺序逐次兑付,刷新本身不新增结算段或轮次结束。
|
- 换图系刷新事实:成功刷新保存旧图探索进度并登记一次事实,被拒绝时不登记;同一轮多次刷新按发生顺序逐次兑付,刷新本身不新增结算段或轮次结束。
|
||||||
- 换图系输出:崩壁冲击在本轮战斗段末经伤害控制器结算;蓄力周转受 3 层上限约束,本轮下一次主角攻击消费全部层数,战斗结束清空;群伤致敌清空时仍由本轮判定段判胜。
|
- 换图系输出:弃图轰击在本轮战斗段末经伤害控制器结算;换图蓄势受层数上限约束,下一次主角攻击消费全部层数,战斗结束清空;群伤致敌清空时仍由本轮判定段判胜。
|
||||||
- 换图系生存与资源:石层缓冲经全局 `damage_taken` 对敌方攻击、危险格、错误封印与地形伤害各减 2,同轮不叠加;坑道小憩在授予段按累计值回血并封顶;矿道红利每次成功刷新固定入账 1 GP。
|
- 换图系生存与回收:护盾、回血与弃图回收在本轮授予段兑付并留下可归因扩展行;回复封顶生命上限;回收不触发清图事件或完美封印加倍。
|
||||||
- 全局受伤事件:`damage_taken` 只在主角实际承伤消费点发射一次,所有伤害路径均经同一效果引擎减免面,禁止同一张单重复发射或只让部分伤害来源订阅生效。
|
- 条款3 对账(2026-10-05 判式换代批 T3——与行动经济 F1 条款3 重立同步):①聚合健康式 (1−ρ̂)·E_dig(u) − ρ̂·V_mine(u) ≥ 0 与 β 比值带 [1.2, 2.5] 判读逐 u 检算(清图支配性审计为常设重跑项,读数快照登记归 clause3 重立条);②封印溢价兑付正确:封印标中正向兑付 = 同型正向 ×(1+δ)(δ 读 `settlement.tres` flag_hit_premium,100=无溢价直通零扰动),三类形态全覆盖(flat power / percent 幅度 / gp 缓冲)、标空与挖格兑付不乘溢价、危险格与安全格同池结构零触碰。
|
||||||
- 条款3 对账(与行动经济 F1 条款3 同步):①聚合健康式 (1−ρ̂)·E_dig(u) − ρ̂·V_mine(u) ≥ 0 与 β 比值带 [1.2, 2.5] 判读逐 u 检算(清图支配性审计为常设重跑项,读数快照登记归 clause3 重立条);②封印溢价兑付正确:封印标中正向兑付 = 同型正向 ×(1+δ)(δ 读 `settlement.tres` flag_hit_premium,100=无溢价直通零扰动),三类形态全覆盖(flat power / percent 幅度 / gp 缓冲)、标空与挖格兑付不乘溢价、危险格与安全格同池结构零触碰。
|
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 战斗表现
|
# 战斗表现
|
||||||
|
|
||||||
> 一句话:战斗动画与演出
|
> 一句话:战斗动画与演出(旧体系未单独成文)
|
||||||
> 状态:范围草案(待设计);现行为 v1.4
|
> 状态:范围草案(待设计);现行为 v1.2
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -9,11 +9,11 @@
|
|||||||
|
|
||||||
本文目前只做两件事:划清范围边界;收拢上游已经登记下来的呈现义务,作为将来的输入清单。动画风格、镜头语言、演出节奏一概未定,且须先过一屏样张才有资格定(见"前置美术测试是硬前置")。
|
本文目前只做两件事:划清范围边界;收拢上游已经登记下来的呈现义务,作为将来的输入清单。动画风格、镜头语言、演出节奏一概未定,且须先过一屏样张才有资格定(见"前置美术测试是硬前置")。
|
||||||
|
|
||||||
一句范围说明:战斗屏常驻双舞台,结算不再是独立画面——本文按现行口径把范围理解为"在既有呈现上叠加动画密度"。
|
一句翻译说明:旧体系把本系统概括为"结算画面 → 战斗动画、伤害数字"。战斗屏常驻双舞台裁决之后,结算不再是独立画面,本文按现行口径把范围理解为"在既有呈现上叠加动画密度"。
|
||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:战斗屏上"发生什么、摆在哪里、是什么意思"已经由两份现行文档定稿——屏级呈现形态归 [战斗屏 UX 规格 battle.md](../../../ux/battle.md),视觉基调与剪影色彩归 [美术圣经 art-bible](../../../art/art-bible.md)。本文只负责"这些东西怎么动",而且是排期靠后的打磨项(见 [不做清单](../../05-不做清单.md):战斗动画演出是 MVP 内的打磨项,一律排后)。
|
边界这样划:战斗屏上"发生什么、摆在哪里、是什么意思"已经由两份现行文档定稿——屏级呈现形态归 [战斗屏 UX 规格 battle.md](../../ux/battle.md),视觉基调与剪影色彩归 [美术圣经 art-bible](../../../art/art-bible.md)。本文只负责"这些东西怎么动",而且是排期靠后的打磨项(见 [不做清单](../../05-不做清单.md):战斗动画演出是 MVP 内的打磨项,一律排后)。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
| 不负责 | 归谁 |
|
| 不负责 | 归谁 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 屏级呈现形态与呈现语义(四区布局、敌人呈现〔站桩形态〕、明细带、高光行) | [battle.md](../../../ux/battle.md) 与 [HUD 框架](../表现与支撑/HUD框架.md),本文只引用 |
|
| 屏级呈现形态与呈现语义(四区布局、敌人呈现〔站桩形态〕、明细带、高光行) | [battle.md](../../ux/battle.md) 与 [HUD 框架](../表现与支撑/HUD框架.md),本文只引用 |
|
||||||
| 视觉基调、剪影哲学、色彩与图标键契约 | [art-bible](../../../art/art-bible.md),本文只引用 |
|
| 视觉基调、剪影哲学、色彩与图标键契约 | [art-bible](../../../art/art-bible.md),本文只引用 |
|
||||||
| 结算逻辑与逐行流水本身 | [战斗结算](战斗结算.md) |
|
| 结算逻辑与逐行流水本身 | [战斗结算](战斗结算.md) |
|
||||||
| 敌种视觉状态的数据面(哪个敌种有几态、什么姿态) | [敌人系统](敌人系统.md) |
|
| 敌种视觉状态的数据面(哪个敌种有几态、什么姿态) | [敌人系统](敌人系统.md) |
|
||||||
@@ -48,11 +48,11 @@
|
|||||||
|
|
||||||
### 不另起场景:在既有呈现上叠加动画密度
|
### 不另起场景:在既有呈现上叠加动画密度
|
||||||
|
|
||||||
战斗屏是挖掘与结算两种形态共用的同一张屏:常驻双舞台(白话:战斗画面与扫雷图同屏常驻,像同一块屏上的两个舞台),结算期不切换场景,裁决与理由见 [battle.md 布局决策 1](../../../ux/battle.md)。所以战斗表现的工作不是另做一个战斗场景,而是在既有呈现上叠加动画密度与演出——这是本系统范围边界的第一条。
|
战斗屏是挖掘与结算两种形态共用的同一张屏:常驻双舞台(白话:战斗画面与扫雷图同屏常驻,像同一块屏上的两个舞台),结算期不切换场景,裁决与理由见 [battle.md 布局决策 1](../../ux/battle.md)。所以战斗表现的工作不是另做一个战斗场景,而是在既有呈现上叠加动画密度与演出——这是本系统范围边界的第一条。
|
||||||
|
|
||||||
"发生什么"与"怎么动"因此分了工:敌人死亡是血条归零后灰化加碎裂退场、禁止瞬间消失,结算演出链逐拍兑现(明细带逐行文字已退役),完美封印与封印标中有高光强调——这些呈现语义已由 battle.md 与 HUD 框架定稿,本文不复述。本文将来承接的只是其上的动画密度:受击反馈、弹道、退场动画等类别。
|
"发生什么"与"怎么动"因此分了工:敌人死亡是血条归零后灰化加碎裂退场、禁止瞬间消失,结算明细带逐行滚动,完美封印与封印标中有高光行强调——这些呈现语义已由 battle.md 与 HUD 框架定稿,本文不复述。本文将来承接的只是其上的动画密度:受击反馈、弹道、退场动画等类别。
|
||||||
|
|
||||||
资产侧同理,这也是双舞台带来的管线约束:若舞台形态悬而未决,同一份角色资产可能因舞台不同而重画。现行解法是剪影跨舞台通用——角色剪影按"棋盘、结算画面与任一战斗舞台通用"设计,不为舞台未决问题付重画成本(art-bible §5.1)。
|
资产侧同理,这也是双舞台带来的管线约束:若舞台形态悬而未决,同一份角色资产可能因舞台不同而重画。现行解法是剪影跨舞台通用——角色剪影按"棋盘、结算画面与任一战斗舞台通用"设计,不为舞台未决问题付重画成本(art-bible §5.1;原 §3.1,2026-09-22 迁 §5.1)。
|
||||||
|
|
||||||
### 收拢上游已登记的呈现输入
|
### 收拢上游已登记的呈现输入
|
||||||
|
|
||||||
@@ -61,26 +61,26 @@
|
|||||||
| 输入 | 登记处 | 将来要做的 |
|
| 输入 | 登记处 | 将来要做的 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 受击反馈 / 死亡表现 / 顺位标记 | [敌人系统](敌人系统.md)的资产需求下限三类(终稿归样张批,呈现语义已归 battle.md) | 终稿资产与动画兑现;死亡禁止瞬消 |
|
| 受击反馈 / 死亡表现 / 顺位标记 | [敌人系统](敌人系统.md)的资产需求下限三类(终稿归样张批,呈现语义已归 battle.md) | 终稿资产与动画兑现;死亡禁止瞬消 |
|
||||||
| 特殊技技能动画定稿 | [敌人系统](敌人系统.md)三档可见性规格(现行数据面 = 普通攻击零表示、特殊技三族动画〔攻击系/增益系/妨害系〕,暴击为掷点层无前置表示) | 把摇定动画映射(两型)做成终稿资产 |
|
| 特殊技技能动画定稿 | [敌人系统](敌人系统.md)三档可见性规格(2026-09-16 敌人技能池批改型:行为环姿态预告〔一态与三态〕退役——现行数据面 = 普通攻击零表示、特殊技三族动画〔攻击系/增益系/妨害系——2026-09-19 妨害系新增〕,暴击为掷点层无前置表示;battle.md 意图线索映射目录已同步改型注记) | 把摇定动画映射(两型)做成终稿资产 |
|
||||||
| 奖励未生效行的呈现 | [增益状态](增益状态.md)定稿时登记(数据源是[战斗结算](战斗结算.md)的明细协议) | 让这类行在演出中可读、不被吞掉 |
|
| 奖励未生效行的呈现 | [增益状态](增益状态.md)定稿时登记(数据源是[战斗结算](战斗结算.md)的明细协议) | 让这类行在演出中可读、不被吞掉 |
|
||||||
| 效果来源格的可读化 | 同上(候选形态:缩略图或格子高亮,坐标不直接呈现) | 把"效果来自哪一格"翻译成玩家可读的演出 |
|
| 效果来源格的可读化 | 同上(候选形态:缩略图或格子高亮,坐标不直接呈现) | 把"效果来自哪一格"翻译成玩家可读的演出 |
|
||||||
| 坍塌显形的连锁动画 | [游戏概念](../../00-游戏概念.md)的概念层拍板——坍塌显形是[连锁展开](../排雷循环/排雷玩法.md)的玩家可见名 | 连锁展开触发时的连锁演出 |
|
| 坍塌显形的连锁动画 | [游戏概念](../../00-游戏概念.md)的概念层拍板——坍塌显形是[连锁展开](../排雷循环/排雷玩法.md)的玩家可见名,与音频方向同批配对登记 | 连锁展开触发时的连锁演出 |
|
||||||
| 高光兑现的演出强化 | 完美封印与封印标中强调的机制及呈现位已由战斗结算与 battle.md 定稿 | 在既有高光行呈现之上加强演出密度 |
|
| 高光兑现的演出强化 | 完美封印与封印标中强调的机制及呈现位已由战斗结算与 battle.md 定稿 | 在既有高光行呈现之上加强演出密度 |
|
||||||
| 伤害数字 | 归档索引中本系统的旧范围一句话即含"伤害数字" | 落点未定:预告上格原则与"敌人不占格、兑现发生在战斗画面区"如何相容,见待设计问题清单 |
|
| 伤害数字 | 归档索引中本系统的旧范围一句话即含"伤害数字" | 落点未定:预告上格原则与"敌人不占格、兑现发生在战斗画面区"如何相容,见待设计问题清单 |
|
||||||
|
|
||||||
### 前置美术测试是硬前置
|
### 前置美术测试是硬前置
|
||||||
|
|
||||||
正式设计本文之前,必须先做一次"战斗表现美术测试":用一屏样张(一张按候选方案画成的试验图)锁定角色剪影、动画方案、战斗空间三件事。这是排期硬前置,不是建议;battle.md 也登记了该测试须按双舞台布局出样。样张未过,不启动任何终稿资产与动画设计。**该硬前置已解除**:一屏样张整体过闸(凭据=体验验证清单 ㊶)。
|
正式设计本文之前,必须先做一次"战斗表现美术测试":用一屏样张(一张按候选方案画成的试验图)锁定角色剪影、动画方案、战斗空间三件事。这是旧体系评审登记的排期硬前置,不是建议;battle.md 也登记了该测试须按双舞台布局出样。样张未过,不启动任何终稿资产与动画设计。
|
||||||
|
|
||||||
附着在同一次样张上的还有一项已登记的裁决(登记出处 = 敌人系统的呈现契约):敌人层绘制优先级的插入位置——白话就是敌人的姿态精灵画在绘制顺序的哪一层,会不会、以及如何与棋盘上的数字、封印印记、小人发生遮挡。它随美术测试一并裁决,不在本文提前定。
|
附着在同一次样张上的还有一项已登记的裁决(登记出处 = 敌人系统的呈现契约):敌人层绘制优先级的插入位置——白话就是敌人的姿态精灵画在绘制顺序的哪一层,会不会、以及如何与棋盘上的数字、封印印记、小人发生遮挡。它随美术测试一并裁决,不在本文提前定。
|
||||||
|
|
||||||
两项相邻裁定已有结论,设计时直接继承:**敌人呈现形态已裁决(2026-09-20 用户看对照样张拍板)——全站桩式(无框立绘+底座),主角同样站桩、状态小图标挂血条正下方,卡片式整体退役**;art-bible 的图标键契约已冻结,动画设计不必等图标终稿。
|
两项相邻裁定已有结论,设计时直接继承:**敌人呈现形态已裁决(2026-09-20 用户看对照样张拍板)——全站桩式(无框立绘+底座),主角同样站桩、状态小图标挂血条正下方,卡片式整体退役**(待办清单「敌人卡形态」解决移除,状态记录 99;battle.md 起草条款已随裁决改写,对照样张已在案存档);art-bible 的图标键契约已冻结,动画设计不必等图标终稿。
|
||||||
|
|
||||||
### 一屏样张的验收标准
|
### 一屏样张的验收标准
|
||||||
|
|
||||||
样张是前置美术测试的判定物;本节把"怎么算过"在测试组织前写成文,避免临场现定标准。成文做法参照 [art-bible](../../../art/art-bible.md) §1.4 格子样张测试(内容清单、按序验收项、判定与回退),判据全部落到已冻结的现行口径上——本节不定任何新的视觉参数。
|
样张是前置美术测试的判定物;本节把"怎么算过"在测试组织前写成文,避免临场现定标准。成文做法参照 [art-bible](../../../art/art-bible.md) §1.4 格子样张测试(内容清单、按序验收项、判定与回退),判据全部落到已冻结的现行口径上——本节不定任何新的视觉参数。
|
||||||
|
|
||||||
样张内容清单(一组齐备,缺项即无效):按 [battle.md 布局决策 1](../../../ux/battle.md) 的常驻双舞台四区布局整屏出样;角色剪影按棋盘格、结算明细带、战斗舞台三个语境同图摆放;~~敌人卡两候选形态对照(卡片式与站桩式各一版,其余内容不变)~~——**本项已完成(全站桩定稿、卡片式退役),正式样张按站桩形态单版出样即可**;受击、退场、高光兑现三组动画关键帧条(每组至少起、中、末三帧);敌人姿态精灵与数字、封印印记、小人同格叠放的遮挡对照组至少一组。
|
样张内容清单(一组齐备,缺项即无效):按 [battle.md 布局决策 1](../../ux/battle.md) 的常驻双舞台四区布局整屏出样;角色剪影按棋盘格、结算明细带、战斗舞台三个语境同图摆放;~~敌人卡两候选形态对照(卡片式与站桩式各一版,其余内容不变)~~——**本项已由 2026-09-20 形态裁决提前完成(全站桩定稿、卡片式退役),正式样张按站桩形态单版出样即可**(owner 修订,对照义务解除;见待办清单「敌人卡形态」销项,状态记录 99);受击、退场、高光兑现三组动画关键帧条(每组至少起、中、末三帧);敌人姿态精灵与数字、封印印记、小人同格叠放的遮挡对照组至少一组。
|
||||||
|
|
||||||
验收项按序判定,第一项不过 = 整张否决(继承格子样张"数字可读性定风格"的次序):
|
验收项按序判定,第一项不过 = 整张否决(继承格子样张"数字可读性定风格"的次序):
|
||||||
|
|
||||||
@@ -90,25 +90,25 @@
|
|||||||
4. **战斗空间成立**:双舞台同屏下挖掘期视线锚在棋盘区、结算期锚在明细带与战斗画面区(B 区),两舞台边界清晰、无焦点争夺。
|
4. **战斗空间成立**:双舞台同屏下挖掘期视线锚在棋盘区、结算期锚在明细带与战斗画面区(B 区),两舞台边界清晰、无焦点争夺。
|
||||||
5. **敌层插入位置可裁**:遮挡对照组足以裁决敌人姿态精灵画进绘制顺序的哪一层——任何层叠组合下数字、封印印记、小人禁止被遮挡到不可辨。
|
5. **敌层插入位置可裁**:遮挡对照组足以裁决敌人姿态精灵画进绘制顺序的哪一层——任何层叠组合下数字、封印印记、小人禁止被遮挡到不可辨。
|
||||||
|
|
||||||
判定与回退:第 1 项不过即演出元素回炉,禁止以牺牲可读性换氛围(改演出、不动数字口径);第 2–4 项不过对应资产或方案回炉重交,已过项结果保留。第 5 项(敌层插入位置)不产生过/不过,产出一条裁决记录:插入位置结论由[敌人系统](敌人系统.md)的呈现契约登记(全站桩定稿)。样张通过 = 角色剪影、动画方案、战斗空间、敌层插入位置四件锁定物冻结;通过前不启动任何终稿资产与动画设计。
|
判定与回退:第 1 项不过即演出元素回炉,禁止以牺牲可读性换氛围(改演出、不动数字口径);第 2–4 项不过对应资产或方案回炉重交,已过项结果保留。第 5 项(敌层插入位置)不产生过/不过,产出一条裁决记录:插入位置结论由[敌人系统](敌人系统.md)的呈现契约登记(~~敌人卡形态对照~~半边已于 2026-09-20 提前裁决完成——全站桩定稿,结论已回写 battle.md 起草条款)。样张通过 = 角色剪影、动画方案、战斗空间、敌层插入位置四件锁定物冻结;通过前不启动任何终稿资产与动画设计。
|
||||||
|
|
||||||
**现行状态**:样张整体过闸仍差方向稿目检先行(art-bible §1.4 闸形,目检项登记体验验证清单 ㊶)。
|
**现行状态(2026-10-30 战斗一屏样张批)**:五项验收的机检断言已随该批全绿(机器代理口径与实测读数查战斗一屏样张批 git 提交史,合并提交 3b66d1a6);样张整体过闸仍差方向稿目检先行(art-bible §1.4 闸形,目检项登记体验验证清单 ㊶)。
|
||||||
|
|
||||||
### 演出服从信息与可读性
|
### 演出服从信息与可读性
|
||||||
|
|
||||||
两条现行硬约束,将来任何动画方案都禁止越过。其一,数字可读性高于氛围:挖掘期画面无杂音,动画禁止遮挡数字、禁止在挖掘期抢焦;结算期的色彩与能量走向以 art-bible 第 2 节为权威。其二,结算演出链是兑现呈现(非文字信息载体——明细带逐行文字已退役):battle.md 已承诺不可整体跳过、只提供减动效选项(时长减半或直达终态,演出可加速不可省略),本文将来兑现其动画侧。
|
两条现行硬约束,将来任何动画方案都禁止越过。其一,数字可读性高于氛围:挖掘期画面无杂音,动画禁止遮挡数字、禁止在挖掘期抢焦;结算期的色彩与能量走向以 art-bible 第 2 节为权威。其二,结算逐行兑现是信息载体:battle.md 已承诺不可整体跳过、只提供减动效选项(时长减半或直达终态,逐行兑现可加速不可省略),本文将来兑现其动画侧。
|
||||||
|
|
||||||
### 结算演出与轮间节奏(已实装)
|
### 结算演出与轮间节奏(已实装,2026-09-30 拍板点 3 裁决落位)
|
||||||
|
|
||||||
**定义**:轮末结算的呈现节奏规则——结算行按演出层排播队列分组依次呈现、轮切换以「第 N 轮」横幅驻留,把核心层一帧同步跑完的结算翻译成玩家可跟读的逐行过程;与结算演出覆盖层(光带横扫/跨区弹道)共同构成结算期的演出面。
|
**定义**:轮末结算的呈现节奏规则——结算行按演出层排播队列分组依次呈现、轮切换以「第 N 轮」横幅驻留,把核心层一帧同步跑完的结算翻译成玩家可跟读的逐行过程;与结算演出覆盖层(光带横扫/跨区弹道,迭代 6)共同构成结算期的演出面。
|
||||||
|
|
||||||
**作用对象与范围**:只作用于演出层——排播常量(段间间隔/段内间隔/横幅驻留)归演出层单点持有,本文登记现行值,横幅与节奏在演出层呈现。核心层零触碰:结算零界面等待、零动画等待,且「MC 与基线数据逐项比对」口径不受扰。
|
**作用对象与范围**:只作用于演出层——排播常量(段间间隔/段内间隔/横幅驻留)归演出层单点持有,本文登记现行值,横幅与节奏在演出层呈现。核心层零触碰:结算零界面等待、零动画等待,且「MC 与基线数据逐项比对」口径不受扰(T1 态 400/400 逐位实证在案)。
|
||||||
|
|
||||||
**生命周期**:进结算期起播——结算行按五段分组依序进明细带(段间 0.3s、段内 0.22s);轮切换横幅驻留 0.6s 后消隐进下一轮;战斗结束排播收尾。**减动效双态**:开关开启 = 延迟归零同帧直落 + 横幅静态化(与设置面减动效联动——「可加速不可整体跳过」承诺的节奏侧兑现)。
|
**生命周期**:进结算期起播——结算行按五段分组依序进明细带(段间 0.3s、段内 0.22s;段内值 0.06→0.22 系迭代 8 三轮修改批用户裁决「逐条演出可感知」);轮切换横幅驻留 0.6s 后消隐进下一轮;战斗结束排播收尾。**减动效双态**:开关开启 = 延迟归零同帧直落 + 横幅静态化(与设置面减动效联动——「可加速不可整体跳过」承诺的节奏侧兑现)。
|
||||||
|
|
||||||
**关联与边界**:结算顺序与结果归[战斗结算](战斗结算.md)(本节零触碰,逻辑先行、演出后行);减动效开关归[设置与本地化](../表现与支撑/设置与本地化.md);节奏常量由演出层单点持有,本文登记现行值,表值化随演出批再议;横幅发射计数构成验收判据。
|
**关联与边界**:结算顺序与结果归[战斗结算](战斗结算.md)(本节零触碰,逻辑先行、演出后行);减动效开关归[设置与本地化](../表现与支撑/设置与本地化.md);节奏常量由演出层单点持有,本文登记现行值与沿革,表值化随演出批再议;横幅发射计数构成验收判据。
|
||||||
|
|
||||||
**状态**:已实装(验收套件第 15 套在册)。本节是本文第一块已落地内容,其余部分维持范围草案。
|
**状态**:已实装(2026-09-29 迭代 8 卡⑦已入库、三轮修改批调参追认;验收套件第 15 套在册)。本节是本文第一块已落地内容,其余部分维持范围草案。
|
||||||
|
|
||||||
## 依赖与输出
|
## 依赖与输出
|
||||||
|
|
||||||
@@ -118,8 +118,8 @@
|
|||||||
| 上游 | [HUD 框架](../表现与支撑/HUD框架.md) | 四区布局、战斗画面区(四区中的 B 区)演出区结构、敌人呈现(站桩形态)与明细带呈现语义——本文在其上叠加密度 |
|
| 上游 | [HUD 框架](../表现与支撑/HUD框架.md) | 四区布局、战斗画面区(四区中的 B 区)演出区结构、敌人呈现(站桩形态)与明细带呈现语义——本文在其上叠加密度 |
|
||||||
| 上游 | [敌人系统](敌人系统.md) | 资产需求下限三类与敌种姿态数据面——数据已锁,本文出终稿;另登记一项随样张一并裁决的事项:敌人层绘制优先级的插入位置 |
|
| 上游 | [敌人系统](敌人系统.md) | 资产需求下限三类与敌种姿态数据面——数据已锁,本文出终稿;另登记一项随样张一并裁决的事项:敌人层绘制优先级的插入位置 |
|
||||||
| 上游 | [art-bible](../../../art/art-bible.md)(现行权威) | 剪影、色彩、图标键契约、各阶段氛围——表现侧约束 |
|
| 上游 | [art-bible](../../../art/art-bible.md)(现行权威) | 剪影、色彩、图标键契约、各阶段氛围——表现侧约束 |
|
||||||
| 上游 | [battle.md](../../../ux/battle.md)(现行权威) | 屏级呈现形态与呈现语义 |
|
| 上游 | [battle.md](../../ux/battle.md)(现行权威) | 屏级呈现形态与呈现语义 |
|
||||||
| 协作 | [音频](../表现与支撑/音频.md) | 坍塌显形动画与音效方向配对登记,将来对位设计(挂点未定) |
|
| 协作 | [音频](../表现与支撑/音频.md) | 坍塌显形动画与音效方向系同批配对登记,将来对位设计(挂点未定) |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ MVP 不要求本文的闭环:不做清单把战斗动画演出列为 MVP 打
|
|||||||
- 挖掘期零打扰:结算演出只发生在结算期;挖掘期不因动画新增运动元素,数字可读性不受影响。
|
- 挖掘期零打扰:结算演出只发生在结算期;挖掘期不因动画新增运动元素,数字可读性不受影响。
|
||||||
- 因果可读:玩家看完一段兑现演出,能说出这一行结算来自他刚才的哪一步操作。
|
- 因果可读:玩家看完一段兑现演出,能说出这一行结算来自他刚才的哪一步操作。
|
||||||
- 死亡可辨:敌人死亡瞬间可辨识,不存在"敌人凭空消失"的观感。
|
- 死亡可辨:敌人死亡瞬间可辨识,不存在"敌人凭空消失"的观感。
|
||||||
- 可访问:结算演出不可被整体跳过;减动效档下全部演出有时长减半或直达终态的通路。
|
- 可访问:逐行兑现不可被整体跳过;减动效档下全部演出有时长减半或直达终态的通路。
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 敌人系统
|
# 敌人系统
|
||||||
|
|
||||||
> 一句话:敌人数据、技能池出招、意图呈现
|
> 一句话:敌人数据、技能池出招、意图呈现
|
||||||
> 状态:已定稿;现行为 v1.9
|
> 状态:已定稿(自旧体系迁移);现行为 v1.4
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:本系统是战斗单位的"数据与语义层"——单位有哪些数值、技能池的构成纪律(一张池怎么配才合法)、摇定之后状态怎么变,都归这里;每个敌种的池实际由哪些技能构成、各占多大权重,是行数据,逐行读敌人表(`enemy.tres`),调参所有权归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);什么时候结算、一笔伤害最终算多少、摇号怎么摇,归战斗结算编排;增益层数存放在哪,归增益状态;画成什么样,归 HUD 框架与战斗表现。本系统编排被动:自己从不主动做事,零随机、不碰界面、不订阅事件,一切等战斗结算来调。
|
边界这样划:本系统是战斗单位的"数据与语义层"——单位有哪些数值、技能池怎么构成、摇定之后状态怎么变,都归这里;什么时候结算、一笔伤害最终算多少、摇号怎么摇,归战斗结算编排;增益层数存放在哪,归增益状态;画成什么样,归 HUD 框架与战斗表现。本系统编排被动:自己从不主动做事,零随机、不碰界面、不订阅事件,一切等战斗结算来调。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -70,15 +70,28 @@
|
|||||||
|
|
||||||
| 规则 | 含义 |
|
| 规则 | 含义 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 敌方效果对全体生效 | 范围效果作用于所有存活敌人——场上可多种敌种共存,结算语义按存活单位逐一生效、不依赖"场上全同种"前提;"只打某一个"的单体寻址接口已在[增益状态](增益状态.md)〈单体寻址扩展位〉节定稿,随首个单体效果的内容批开放(见 P1) |
|
| 敌方效果对全体生效 | 范围效果作用于所有存活敌人——混编放开后(2026-10-07 行集多行批)场上可多种敌种共存,结算语义按存活单位逐一生效、不依赖"场上全同种"前提;"只打某一个"的单体寻址接口已在[增益状态](增益状态.md)〈单体寻址扩展位〉节定稿,随首个单体效果的内容批开放(见 P1) |
|
||||||
| 行集构成纪律 | 敌人表按(关卡序号 × 深度带)存放;深度带=节点深度的区间——逐局生成使单点深度不再固定,配池按带不按点,难度坡随带递增。同一带键行集允许多行、允许不同敌种混编;Boss 行按终点配置,多终点各配一行(走哪条路决定打谁)。纪律三条,违规加载期返回错误并止动:①行集内 enemy_id 唯一(同一敌种在同行集仍只许一行);②同带键多行必须表文件内相邻,行序 = 声明序 = 生成序(行序即契约);③行集实例总数(各行骰后数量求和)≤ 4,单行数量域 [1,3] 不变(单行数量上限语义 = 单种数)。行数不设上限;同关随深度换敌种合法 |
|
| 行集构成纪律 | 敌人表按(关卡序号 × 深度带)存放;深度带=节点深度的区间——逐局生成使单点深度不再固定,配池按带不按点,难度坡随带递增。同一带键行集允许多行、允许不同敌种混编;Boss 行按终点配置,多终点各配一行(走哪条路决定打谁)。纪律三条,违规加载期返回错误并止动:①行集内 enemy_id 唯一(同一敌种在同行集仍只许一行);②同带键多行必须表文件内相邻,行序 = 声明序 = 生成序(行序即契约);③行集实例总数(各行骰后数量求和)≤ 4,单行数量域 [1,3] 不变(单行数量上限语义 = 单种数)。行数不设上限;同关随深度换敌种合法 |
|
||||||
| 主角数据行 | 主角战斗数值单独放一张全局单行表:生命上限、基础攻击力、护甲等级三字段(见调参表) |
|
| 主角数据行 | 主角战斗数值单独放一张全局单行表:生命上限、基础攻击力、护甲等级三字段(见调参表) |
|
||||||
| 基础攻击恒存在 | 基础攻击不许配 0(配置为 0 加载期拒绝)——零基线乘任何百分比增益恒为零,"胜利路径恒有"的保障从数据层杜绝死锁 |
|
| 基础攻击恒存在 | 基础攻击不许配 0(配置为 0 加载期拒绝)——零基线乘任何百分比增益恒为零,"胜利路径恒有"的保障从数据层杜绝死锁 |
|
||||||
| 先手攻击不是敌方技能拍 | 每次结算战斗段主角先手攻击顺位最前的存活敌人,这是固定动作;奖励侧的道具与增益是基础攻击之外的规划面伤害,归[地图战斗资源](地图战斗资源.md) |
|
| 先手攻击不是敌方技能拍 | 每次结算战斗段主角先手攻击顺位最前的存活敌人,这是固定动作;奖励侧的道具与增益是基础攻击之外的规划面伤害,归[地图战斗资源](地图战斗资源.md) |
|
||||||
|
|
||||||
名字是玩家可见专名。各敌种的行数据——名字、数量、生命、攻击、技能池、护甲两轴——逐行读敌人表(`enemy.tres`),本文不设敌种名录抄本;需要人读的敌种总览时,走外置图鉴工具(随工程批落地:从敌人表导出数据,渲染成独立打开即可阅读的静态总览页)。
|
首发敌种三种——地精、熊地精、食人魔酋长(末者为首发关底 Boss);L2/L3 内容批扩至现行八种。名字是玩家可见专名,池权重与护甲等级行值一律读配置表,本表只存敌种语义模板:
|
||||||
|
|
||||||
护甲类型(轻甲 / 魔法护甲 / 重甲)与攻击类型的克制结算矩阵归[战斗结算](战斗结算.md),本系统只提供每个敌种的护甲类型数据——各敌种的甲型行值逐行读敌人表(`enemy.tres`)。护甲等级是另一条数值轴(防守方字段,基础攻击掷点的折扣判定读数):敌人表与主角表各增 `armor_class` 一列(域 [0, 999]),掷点与折扣的结算归[战斗结算](战斗结算.md),行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)——主角与敌方的护甲等级行值读配置表(正式行值待怪物设定投值,登记[待办清单](../../../../待办清单.md)),两条轴的概念与字段禁止混用。举证:生成与护甲为数据面规则,无计算。
|
> **hobgoblin 缺口登记(2026-10-13 迭代 24 反哺④)**:敌人表有 `hobgoblin` 数据行(寻址键 (1, battle, 3) 的「大地精」行),**无立绘、不在本敌种表**——登记在案的已知缺口(敌种语义模板未成文故呈现面无定义可依),本批未动;补齐归敌种内容批(立绘+语义模板+敌种表行三件套)。
|
||||||
|
|
||||||
|
| 敌种 | 技能池构成(权重读表) | 护甲类型 | 护甲等级 | 定位 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 地精 | 普通攻击 + 突刺(低权重特殊技) | 行值读表 | 行值读表 | 首发杂兵;教学位节点数量开战掷定(区间行值读表) |
|
||||||
|
| 熊地精 | 普通攻击 + 蓄力 + 重击 | 行值读表 | 行值读表 | 首发主力 |
|
||||||
|
| 食人魔酋长 | 普通攻击 + 重击 + 硬化 + **震地怒击**(半血解锁——2026-10-05 技能池执行批) | 行值读表 | 行值读表 | 首发关底 Boss;硬化独占 |
|
||||||
|
| 巨蜘蛛 | 普通攻击 + 撕咬 + 蓄力 + **毒吐**(2026-10-13 迭代 24 N2 投放) | 行值读表 | 行值读表 | L2 首遇教学位(固定 2 只——首遇位不加骰) |
|
||||||
|
| 蛛化卓尔精灵 | 普通攻击 + 重击 + 毒爆 + 蛛网束缚 + **遏毒**(半血解锁) | 行值读表 | 行值读表 | L2 关底 Boss;毒爆/蛛网束缚独占 |
|
||||||
|
| 灰矮人 | 普通攻击 + 蓄力 + 重击 + **盾击**(2026-10-13 迭代 24 N2 投放) | 行值读表 | 行值读表 | L3 基线重甲位 |
|
||||||
|
| 钩爪恐魔 | 普通攻击 + 撕咬 + 蓄力 | 行值读表 | 行值读表 | L2/L3 群行位(蜘蛛同构池) |
|
||||||
|
| 灰矮人石君王 | 普通攻击 + 重击 + 大地脉动 + **岩崩**(半血解锁) | 行值读表 | 行值读表 | L3 关底 Boss;大地脉动独占 |
|
||||||
|
|
||||||
|
护甲类型(轻甲 / 魔法护甲 / 重甲)与攻击类型的克制结算矩阵归[战斗结算](战斗结算.md),本系统只提供每个敌种的护甲类型数据——**护甲列自 2026-10-05 技能池执行批起改读表口径**(本表轮廓列不再记具体甲型:现行 L1 全轻甲 / L2 仅 Boss 魔法甲 / L3 重甲登台的错峰投放以 `enemy.tres` 行值为准;历史「本表写魔甲/重甲」与表失同步的欠账顺带清偿)。护甲等级是另一条数值轴(防守方字段,基础攻击掷点的折扣判定读数):敌人表与主角表各增 `armor_class` 一列(域 [0, 999]),掷点与折扣的结算归[战斗结算](战斗结算.md),行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)——三敌种首关与主角的护甲等级行值读配置表(第一关怪物 AC 相对较低,正式行值待怪物设定投值,登记[待办清单](../../../../待办清单.md)),两条轴的概念与字段禁止混用。举证:生成与护甲为数据面规则,无计算。
|
||||||
|
|
||||||
### 技能池:每敌种一张带权技能池,每拍开轮摇号出招
|
### 技能池:每敌种一张带权技能池,每拍开轮摇号出招
|
||||||
|
|
||||||
@@ -98,17 +111,17 @@
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| skill_id | 全部 | 主键,池条目引用键 |
|
| skill_id | 全部 | 主键,池条目引用键 |
|
||||||
| display_name | 全部 | 玩家可见名(明细行与动画共用) |
|
| display_name | 全部 | 玩家可见名(明细行与动画共用) |
|
||||||
| type | 全部 | 封闭枚举 {普通攻击, 伤害, 增益, 妨害}(现行事实源=敌人系统.md 词汇表/增益状态.md;多段命中经用户拍板退役不入枚举);新类型走本文修订 |
|
| type | 全部 | 封闭枚举 {普通攻击, 伤害, 增益, 妨害}——**新效应词汇批 2026-09-19 由三扩四**(设计权威 proposal-status-vocabulary.md〔提案已吸收退役——现行事实源=敌人系统.md 词汇表/增益状态.md〕 v1.0;多段命中经用户拍板退役不入枚举);新类型走本文修订 |
|
||||||
| damage_mult | 仅伤害 | 伤害倍率;域 [1.1, 16] provisional。普通攻击恒 1、不可配 |
|
| damage_mult | 仅伤害 | 伤害倍率;域 [1.1, 16] provisional。普通攻击恒 1、不可配 |
|
||||||
| rider_mult | 仅伤害、可省 | **必中附加分量**:域 (0, 1],缺省无字段 = 无附加;分量值 = max(伤害下限, floor(攻击基线 × rider_mult))——随施放者攻击基线缩放,后置加法、必中全额、不进乘区、不出暴击(后置加法同族);价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害" |
|
| rider_mult | 仅伤害、可省 | **必中附加分量(2026-09-19 新增)**:域 (0, 1],缺省无字段 = 无附加;分量值 = max(伤害下限, floor(攻击基线 × rider_mult))——随施放者攻击基线缩放,后置加法、必中全额、不进乘区、不出暴击(后置加法同族);价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害" |
|
||||||
| cooldown_beats | 全部 | 施放后连续 N 拍不可摇中;普通攻击恒 0、不可配 |
|
| cooldown_beats | 全部 | 施放后连续 N 拍不可摇中;普通攻击恒 0、不可配 |
|
||||||
| buff_ref / buff_duration | 仅增益与妨害 | 效果引用(指向状态效果行)与持续回合数;**落点:增益技归施放者自己(每只敌是独立个体,一只施放只强化自己——2026-11-02 用户裁),妨害技归主角**;施放类 side 守卫加载拒绝——妨害技零新授予通道 |
|
| buff_ref / buff_duration | 仅增益与妨害 | 效果引用(指向状态效果行)与持续回合数;**落点由状态行 target_side 路由**(增益 → 敌方侧 / 妨害 → 主角侧,施放类 side 守卫加载拒绝)——妨害技零新授予通道 |
|
||||||
| trigger(触发条件) | 全部,可省 | {fact, op, value, latch} 四键——fact 与 op 取「触发条件」节封闭词表,value 类型与域随 fact,出域加载期拒绝;缺省无字段=无条件技 |
|
| trigger(触发条件) | 全部,可省 | {fact, op, value, latch} 四键——fact 与 op 取「触发条件」节封闭词表,value 类型与域随 fact,出域加载期拒绝;缺省无字段=无条件技,旧行为零变化(2026-10-26 情境条件触发器批立列、2026-10-27 迭代 39 实装落地;原池条目的血量百分比字段收编为本字段闩型首用例) |
|
||||||
| P1 字段位 | — | 命中段数、目标数——随对应后置批加列(触发条件位已由 trigger 立列收编;"固定值分量"位已由 rider_mult 收编;多段命中「命中段数」保留以防复活) |
|
| P1 字段位 | — | 命中段数、目标数——随对应后置批加列(触发条件位已由 trigger 立列收编——2026-10-26 立列、2026-10-27 实装;原"固定值分量"位已由 rider_mult 实装收编——2026-09-19;多段命中「命中段数」保留以防复活) |
|
||||||
|
|
||||||
普通攻击也是一行技能行,两条域校验锁死它的特殊性:倍率恒 1、冷却恒 0——想配倍率或冷却的就不是普攻,是伤害技。技能伤害存倍率、不存固定值:伤害 = 施放者攻击基线 × 技能倍率——同一行"重击",不同敌种按各自攻击基线缩放 = 基线 A × 技能倍率 M(行值读 enemy.tres / skills.tres),深层强化行自动缩放,这是共享技能表成立的前提;**固定的绝对值伤害不满足该前提**(不随基线缩放、跨关稀释——Brotato 教训),"固定值伤害"的合法形态是**必中附加分量 rider_mult**(×攻击基线的必中小倍率)。增益技带效果引用与持续回合,百分比天然按施放者同池生效,无缩放问题;妨害技同构,落点由状态行 target_side 路由到主角。技能伤害基线的取整:攻击基线 × 倍率按四舍五入、正好半格时一律向上取——全伤害管线唯一不用向下取整的点(半点上取保住低攻击档特殊技的辨识度:攻击 1 配 ×1.5 的突刺落到 2 而不是 1)。
|
普通攻击也是一行技能行,两条域校验锁死它的特殊性:倍率恒 1、冷却恒 0——想配倍率或冷却的就不是普攻,是伤害技。技能伤害存倍率、不存固定值:伤害 = 施放者攻击基线 × 技能倍率——同一行"重击",不同敌种按各自攻击基线缩放 = 基线 A × 技能倍率 M(行值读 enemy.tres / skills.tres),深层强化行自动缩放,这是共享技能表成立的前提;**固定的绝对值伤害不满足该前提**(不随基线缩放、跨关稀释——Brotato 教训),"固定值伤害"的合法形态是**必中附加分量 rider_mult**(×攻击基线的必中小倍率,2026-09-19 实装)。增益技带效果引用与持续回合,百分比天然按施放者同池生效,无缩放问题;妨害技同构,落点由状态行 target_side 路由到主角。
|
||||||
|
|
||||||
池构成纪律(加载校验,违规拒绝入表):**每池恰一行普通攻击**(普攻冷却恒 0 → 可摇集合恒非空,"空池不可能"由结构保证,最坏情况怪物平砍等待——那是玩家的反打窗口而非死拍);**每池增益类技能 ≤1**(非 RPG,怪物连出不同增益显得呆);**每池妨害类技能 ≤1**;**每池至少一行不带触发条件的特殊技**(普攻不算——保底特殊技集合恒非空的结构保证);池条目 skill_id 悬空致命;权重 > 0、冷却 ≥ 0。
|
池构成纪律(加载校验,违规拒绝入表):**每池恰一行普通攻击**(普攻冷却恒 0 → 可摇集合恒非空,"空池不可能"由结构保证,最坏情况怪物平砍等待——那是玩家的反打窗口而非死拍);**每池增益类技能 ≤1**(非 RPG,怪物连出不同增益显得呆);**每池妨害类技能 ≤1**(2026-09-19 新效应词汇批同构纪律);**每池至少一行不带触发条件的特殊技**(普攻不算——保底特殊技集合恒非空的结构保证,2026-10-26 触发条件批);池条目 skill_id 悬空致命;权重 > 0、冷却 ≥ 0。
|
||||||
|
|
||||||
两道闸(表值 provisional,投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md),行值读技能表):
|
两道闸(表值 provisional,投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md),行值读技能表):
|
||||||
|
|
||||||
@@ -132,29 +145,15 @@
|
|||||||
|
|
||||||
死亡即不动手(保留):摇定后、兑现前死亡(主角先手 / 更早兑现的敌方伤害技),本拍技能作废——不动手、不进冷却、不进保底计数;其余存活敌人照常。拍结构保留:**每结算每存活敌恰行动一次、按行序、先作用后推进**——变的只是"轮到什么",由固定剧本改为摇号。同种敌人不再锁步:各自实例池独立摇号、独立冷却,怪物 1 的重击在冷却里不影响怪物 2,轨迹分歧是涌现,不设开战分配机制。
|
死亡即不动手(保留):摇定后、兑现前死亡(主角先手 / 更早兑现的敌方伤害技),本拍技能作废——不动手、不进冷却、不进保底计数;其余存活敌人照常。拍结构保留:**每结算每存活敌恰行动一次、按行序、先作用后推进**——变的只是"轮到什么",由固定剧本改为摇号。同种敌人不再锁步:各自实例池独立摇号、独立冷却,怪物 1 的重击在冷却里不影响怪物 2,轨迹分歧是涌现,不设开战分配机制。
|
||||||
|
|
||||||
蓄力语义:蓄力不是重击前奏——它是一行增益技:0 伤害动作,施加 empower 状态(幅度读 `status_effects.tres`),持续 1 个有效结算(provisional)。蓄力与重击之间**没有任何组合语义**——增益与技能倍率恰好同拍只是增益倍率 × 技能倍率的两层乘法共存(增益幅度 × 增益幅度 = 两层乘法读表可得),蓄力后摇中普通攻击则是增益倍率的加成平砍,两者同为平常事,不是设计的连招。技能冷却(几拍内不能再摇中,技能行属性)与增益持续(状态挂几回合,状态行属性)是两个计时器,互不相干。施放行 = 0 伤害动作,不掷不折。
|
蓄力语义(2026-09-16 纠偏定稿):蓄力不是重击前奏——它是一行增益技:0 伤害动作,施加 empower 状态(幅度读 `status_effects.tres`),持续 1 个有效结算(provisional)。旧环"蓄力→猛击"的固定配对是地精弹珠的拷贝(给玩家输出窗口用的),随行为环一并退役;蓄力与重击之间**没有任何组合语义**——增益与技能倍率恰好同拍只是增益倍率 × 技能倍率的两层乘法共存(增益幅度 × 增益幅度 = 两层乘法读表可得),蓄力后摇中普通攻击则是增益倍率的加成平砍,两者同为平常事,不是设计的连招。技能冷却(几拍内不能再摇中,技能行属性)与增益持续(状态挂几回合,状态行属性)是两个计时器,互不相干。施放行 = 0 伤害动作,不掷不折(原"零兑付、不读伏击"的读怪奖励语义随伏击退役作废——2026-09-20 八型批)。
|
||||||
|
|
||||||
Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错峰两轨口径**:**Boss 轨** = L1 酋长池含独占增益技"硬化"〔敌方防御池词汇载体〕+ 半血解锁伤害技"震地怒击";L2 卓尔池独占妨害技"蛛网束缚"+伤害技"毒爆"+ 半血解锁"遏毒";L3 石君王池独占妨害技"大地脉动"+ 半血解锁"岩崩"——独占技随关错峰投放,三行解锁技=每 Boss 一行新独占伤害技〔用户裁案甲,2026-10-04〕;**普通敌轨** = L2/L3 普通敌种技能随关错峰投放(巨蜘蛛族+毒吐〔(2,5)/(2,6)/(2,7),首遇教学位 (2,4) 不投〕、灰矮人族+盾击〔(3,0)/(3,5)/(3,7)〕)——第一关不见的招式第二/三关普通战可见;增益 ≤1 纪律下蓄力拍不进 Boss 池)。
|
Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错峰两轨口径,2026-10-05 技能池执行批立 Boss 轨、2026-10-13 迭代 24 N2 补普通敌轨**:**Boss 轨** = L1 酋长池含独占增益技"硬化"〔敌方防御池词汇载体〕+ 半血解锁伤害技"震地怒击";L2 卓尔池独占妨害技"蛛网束缚"+伤害技"毒爆"+ 半血解锁"遏毒";L3 石君王池独占妨害技"大地脉动"+ 半血解锁"岩崩"——独占技随关错峰投放,三行解锁技=每 Boss 一行新独占伤害技〔用户裁案甲,2026-10-04〕;**普通敌轨** = L2/L3 普通敌种技能随关错峰投放(2026-10-13 N2:巨蜘蛛族+毒吐〔(2,5)/(2,6)/(2,7),首遇教学位 (2,4) 不投〕、灰矮人族+盾击〔(3,0)/(3,5)/(3,7)〕,`skills.tres` 12→14 行)——第一关不见的招式第二/三关普通战可见;旧"专属四拍环且含蓄力拍"约定顺带退役,增益 ≤1 纪律下旧蓄力拍不进 Boss 池)。
|
||||||
|
|
||||||
举证:**摇定结果 = 可摇集合按权重份额归一的一次抽签;当前可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。**连带可判别:把权重当固定百分比、把冷却当只锁高伤技、把蓄力当重击前奏,都是与本规约相悖的旧口径。
|
举证:**摇定结果 = 可摇集合按权重份额归一的一次抽签;当前可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。**连带可判别:把权重当固定百分比、把冷却当只锁高伤技、把蓄力当重击前奏,都是与本规约相悖的旧口径。
|
||||||
|
|
||||||
### 精英行:现役敌种的强化版,池=继承基础池+附加技
|
|
||||||
|
|
||||||
精英怪是某个现役敌种的强化版本:玩家看到的是同一种怪(同立绘、名字带「精英·」前缀),数值更强、出招多几样。它在敌人表里是独立的一行——自己的 enemy_id、自己的数值、自己的专属池,和基础敌种的行互不覆盖;外显与内部定义因此可以是一对多(一个外观对应基础行与精英行两份定义)。精英身份由行类承载:敌人表行类新增 elite 值。
|
|
||||||
|
|
||||||
| 规则 | 含义 |
|
|
||||||
|---|---|
|
|
||||||
| 独立行 | 精英=敌人表行类为 elite 的一行,enemy_id 独立、不与基础敌种同名;名字前缀「精英·」由该行名字行值承载。数值字段(生命、攻击、护甲两轴、数量)与战斗行同一套定义与取值域 |
|
|
||||||
| 基础敌种引用 | 精英行用基础敌种引用字段指向一个基础敌种的 enemy_id;被指敌种必须在同关战斗行类里存在,指向不存在的敌种或另一条精英行,加载期拒绝 |
|
|
||||||
| 专属池=继承+附加 | 精英行不写自己的池模板,只写附加技清单({skill_id, weight} 数组);它的池模板=基础池+附加技合并。基础池取自同关、战斗行类、该基础敌种深度带最小的那一行的池模板——继承不复制:基础池调参自动传到精英。附加技的 skill_id 与基础池重复,加载期拒绝 |
|
|
||||||
| 合并池过同一纪律 | 池构成纪律(恰一普攻、增益 ≤1、妨害 ≤1、至少一行无条件特殊技、悬空引用致命、权重域)校验的对象是合并后的池;开战快照、实例池、冷却、保底、触发条件语义全部不变——精英实例拿到的就是合并后池的快照 |
|
|
||||||
| 暂不接线 | 精英行落表即合法;开战寻址只按节点类型取战斗或 Boss 行集,精英行在接线前不会被任何节点读到,静置合法、不返回错误。精英遭遇怎么投放到节点,归待办清单「战斗节点遭遇编排方式」条目 |
|
|
||||||
|
|
||||||
举证:**精英池模板 = 基础池条目 ∪ 附加技条目(两者 skill_id 不相交)**;中签率公式不变,可摇权重合计含附加技权重——加附加技会摊薄基础池各技能的中签率,EV 重锚归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。各精英行的数值与附加技行值读敌人表(`enemy.tres`),本文不登记。
|
|
||||||
|
|
||||||
### 触发条件:情境技与闩型解锁共用一套门槛
|
### 触发条件:情境技与闩型解锁共用一套门槛
|
||||||
|
|
||||||
技能行可以带一个触发条件:条件不满足的拍,这行技能不进可摇集合——与冷却中的排除同一待遇;条件满足时,按正常权重照摇。它服务两类出招:情境技(自身低血才用的防御、上轮玩家停手才会出的偷袭等)让怪物像在"看情况出招",停手与压血因此有了代价;闩型解锁(半血解锁)让大招只在血量跌破阈值后才可被摇出。两类用例、一套机制——条件只管"现在能不能被摇到",不改权重、不强制出手。
|
技能行可以带一个触发条件:条件不满足的拍,这行技能不进可摇集合——与冷却中的排除同一待遇;条件满足时,按正常权重照摇。它服务两类出招:情境技(自身低血才用的防御、上轮玩家停手才会出的偷袭等)让怪物像在"看情况出招",停手与压血因此有了代价;闩型解锁(半血解锁)让大招只在血量跌破阈值后才可被摇出。两类用例、一套机制——条件只管"现在能不能被摇到",不改权重、不强制出手。本节 2026-10-26 设计定稿,实装随需求卡片批落地。
|
||||||
|
|
||||||
规则(人话阶段):求值发生在每轮开轮摇号前——对实例池逐行求值,读当时战斗快照;逐敌自身的事实(self 类)各自求值,全局事实全场一份。本系统零随机纪律不变:条件只是可摇集合的又一排除项,摇号公式(权重份额归一)与随机流消费序都不动,同种子回放逐位复现。字段是技能行 trigger 四键 {fact, op, value, latch}:fact 与 op 各取下方封闭词表,value 类型与域随 fact——出域加载期拒绝止动;缺省无字段=无条件技。latch(单向闩)为真时,条件首次求值为真后整场保持为真(治疗抬血不回锁);缺省为假=每轮开轮重新求值(瞬态条件,如"上轮停手"过了就过)。
|
规则(人话阶段):求值发生在每轮开轮摇号前——对实例池逐行求值,读当时战斗快照;逐敌自身的事实(self 类)各自求值,全局事实全场一份。本系统零随机纪律不变:条件只是可摇集合的又一排除项,摇号公式(权重份额归一)与随机流消费序都不动,同种子回放逐位复现。字段是技能行 trigger 四键 {fact, op, value, latch}:fact 与 op 各取下方封闭词表,value 类型与域随 fact——出域加载期拒绝止动;缺省无字段=无条件技。latch(单向闩)为真时,条件首次求值为真后整场保持为真(治疗抬血不回锁);缺省为假=每轮开轮重新求值(瞬态条件,如"上轮停手"过了就过)。
|
||||||
|
|
||||||
@@ -180,15 +179,15 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
|
|||||||
| 死亡作废 | 照常——摇定后兑现前死亡,本拍作废、不进冷却不进保底计数 |
|
| 死亡作废 | 照常——摇定后兑现前死亡,本拍作废、不进冷却不进保底计数 |
|
||||||
| 意图呈现 | 三档规格不变——情境技属特殊技,走类型级预告+结算明细具名,因果由技能名承载(如"趁隙偷袭");闩型保留解锁弹出规格(见"目标顺位与意图线索"节) |
|
| 意图呈现 | 三档规格不变——情境技属特殊技,走类型级预告+结算明细具名,因果由技能名承载(如"趁隙偷袭");闩型保留解锁弹出规格(见"目标顺位与意图线索"节) |
|
||||||
|
|
||||||
半血解锁:Boss 解锁技=trigger {fact: self_hp_pct, op: lte, value: 行值, latch: 真}——解锁弹出规格(归因明细行+一次性技能名 toast)、单向闩语义、双面过滤。
|
半血解锁的收编:原池条目的血量百分比字段(2026-10-05 技能池执行批)收编为本字段闩型首用例——Boss 解锁技=trigger {fact: self_hp_pct, op: lte, value: 行值, latch: 真};解锁弹出规格(归因明细行+一次性技能名 toast)、单向闩语义、双面过滤行为全部不变(字段换代与三 Boss 行值迁移已随 2026-10-27 迭代 39 实装落地)。
|
||||||
|
|
||||||
首批落地(已实装):①三 Boss 解锁技为闩型条件;②两个示范投放——地精池+低血防御增益「孤注守势」(self_hp_pct lte 35,纯增益)、L2/L3 群行位+停手偷袭伤害技「趁隙偷袭」(last_round_end eq 停手)。投放敌种、权重与阈值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);"每池增益≤1"纪律不动,条件技照常计入预算。
|
首批落地(已实装——2026-10-27 迭代 39):①三 Boss 解锁技迁移为闩型条件(行为零变化);②两个示范投放——地精池+低血防御增益「孤注守势」(self_hp_pct lte 35,纯增益)、L2/L3 群行位+停手偷袭伤害技「趁隙偷袭」(last_round_end eq 停手)。投放敌种、权重与阈值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);"每池增益≤1"纪律不动,条件技照常计入预算。
|
||||||
|
|
||||||
举证:触发条件为门槛过滤规则,无计算——可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。
|
举证:触发条件为门槛过滤规则,无计算——可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。
|
||||||
|
|
||||||
### 伏击(已退役)与群伤负向现况
|
### 伏击(已退役)与群伤负向现况
|
||||||
|
|
||||||
伏击词条(敌方每刀附加固定点数伤害)已整体退役:奖励/惩罚镜像对账发现其"层数 × 出手敌数"的复利全部集中在主角单血条,与群伤奖励"摊到 N 条敌方血条"构成双重不对称;单轮授予上限护栏已先行退役。blast 型负向现况 = **警觉**(敌方全体护甲等级 +1/层,持续 1 结算,逐颗叠加无上限)——状态行定义与承载归[增益状态](增益状态.md),掷点消费归[战斗结算](战斗结算.md)的护甲等级判定;本系统不再承载敌方侧受击语义。
|
伏击词条(敌方每刀附加固定点数伤害)已随 2026-09-20 格面资源八型批整体退役:奖励/惩罚镜像对账发现其"层数 × 出手敌数"的复利全部集中在主角单血条,与群伤奖励"摊到 N 条敌方血条"构成双重不对称;单轮授予上限护栏已先行退役(同日删除批)。blast 型负向现况 = **警觉**(敌方全体护甲等级 +1/层,持续 1 结算,逐颗叠加无上限)——状态行定义与承载归[增益状态](增益状态.md),掷点消费归[战斗结算](战斗结算.md)的护甲等级判定;本系统不再承载敌方侧受击语义。
|
||||||
|
|
||||||
### 目标顺位与意图线索:打谁不用选,特殊技开轮有一次类型级预告
|
### 目标顺位与意图线索:打谁不用选,特殊技开轮有一次类型级预告
|
||||||
|
|
||||||
@@ -199,12 +198,12 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
|
|||||||
| 摇中 | 挖掘期呈现 | 结算揭示 |
|
| 摇中 | 挖掘期呈现 | 结算揭示 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 普通攻击 | 零表示——完全不可预测 | 明细行"普通攻击(暴击/被压制)" |
|
| 普通攻击 | 零表示——完全不可预测 | 明细行"普通攻击(暴击/被压制)" |
|
||||||
| 特殊技 | 技能动画占位(攻击系 / 增益系 / 妨害系三族)——纯类型级提醒,不预告技能名与数值 | 明细行具名技能 + 数值 |
|
| 特殊技 | 技能动画占位(攻击系 / 增益系 / 妨害系三族——2026-09-19 妨害系 ☠ 新增)——纯类型级提醒,不预告技能名与数值 | 明细行具名技能 + 数值 |
|
||||||
| nat20 暴击 | 无前置表示(掷点层,与技能重击严格区分) | 明细行"(暴击)"标注 |
|
| nat20 暴击 | 无前置表示(掷点层,与技能重击严格区分) | 明细行"(暴击)"标注 |
|
||||||
|
|
||||||
即:普攻完全不可预测;特殊技有一次类型级预告,不可撤销,但给"继续挖还是停手"的决策依据。
|
即:普攻完全不可预测;特殊技有一次类型级预告,不可撤销,但给"继续挖还是停手"的决策依据。
|
||||||
|
|
||||||
**半血解锁弹出规格(解锁判定点=通用事件「血量阈值 `enemy_hp_threshold`」的发射点,对所有带闩型血量触发条件的敌人逐个发射、非 Boss 专属——Boss 语义留给订阅条件判定;条件载体=技能行 trigger 闩型,见「触发条件」节)**:Boss 血量降至解锁阈值(trigger 行值,域 [1,99],缺省无字段=无门槛)时,下一个开轮摇号前出一次归因明细行「XX 解锁了 YY」(高光键为技能解锁,行型复用高光行零新增);呈现层对该行弹**一次性技能名 toast**(轻量提示,非演出——零动画资产、不改演出规格),只报技能名不报数值,池与权重不公开纪律不变。解锁=单向闩(治疗抬血不解锁);锁定条目双面过滤(不进可摇集合与保底特殊技集合——保底禁止逼出未解锁技);解锁后冷却初值 0 即可摇。投放纪律=机制通用、闩型解锁用例仅 Boss 专属技投放(enemy 表无 boss 编码位,硬闸须跨表查节点类型——不做硬闸,本句即文档纪律登记)。技能动画的攻/防系映射归[战斗表现](战斗表现.md),敌人侧摇定动画位归[HUD 框架](../表现与支撑/HUD框架.md)(呈现载体 = 站桩立绘,2026-09-20 全站桩拍板),本系统只锁上面这张三档规格。
|
**半血解锁弹出规格(2026-10-05 技能池执行批,D8 用户裁;内容数据驱动扩展批 T1 补登记——解锁判定点=通用事件「血量阈值 `enemy_hp_threshold`」的发射点,对所有带闩型血量触发条件的敌人逐个发射、非 Boss 专属——Boss 语义留给订阅条件判定;条件载体 2026-10-26 触发条件批起改技能行 trigger 闩型〔原池条目的血量百分比字段收编,行为零变化,见「触发条件」节〕)**:Boss 血量降至解锁阈值(trigger 行值,域 [1,99],缺省无字段=无门槛)时,下一个开轮摇号前出一次归因明细行「XX 解锁了 YY」(高光键为技能解锁,行型复用高光行零新增);呈现层对该行弹**一次性技能名 toast**(轻量提示,非演出——零动画资产、不改演出规格),只报技能名不报数值,池与权重不公开纪律不变。解锁=单向闩(治疗抬血不解锁);锁定条目双面过滤(不进可摇集合与保底特殊技集合——保底禁止逼出未解锁技);解锁后冷却初值 0 即可摇。投放纪律=机制通用、闩型解锁用例仅 Boss 专属技投放(enemy 表无 boss 编码位,硬闸须跨表查节点类型——不做硬闸,本句即文档纪律登记)。旧环"下一拍全程亮出(意图徽标 + 环点)"的预告粒度随行为环退役。技能动画的攻/防系映射归[战斗表现](战斗表现.md),敌人侧摇定动画位归[HUD 框架](../表现与支撑/HUD框架.md)(呈现载体 = 站桩立绘,2026-09-20 全站桩拍板),本系统只锁上面这张三档规格。
|
||||||
|
|
||||||
| 规格 | 含义 |
|
| 规格 | 含义 |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -249,38 +248,32 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P1 | 情境条件触发器(低血触发防御、玩家停手时偷袭技等) | 已实装(三 Boss 闩型+两示范投放,见「触发条件」节与「首批落地」段) |
|
| P1 | 情境条件触发器(低血触发防御、玩家停手时偷袭技等) | 已实装(2026-10-27 迭代 39——三 Boss 闩型迁移+两示范投放,见「触发条件」节与「首批落地」段) |
|
||||||
| P1 | 个体化变体池(同种个体分型:A 型好斗 / B 型守势) | 共识点 A 的 A2 案;排期 Beta,登记[待办清单](../../../../待办清单.md) |
|
| P1 | 个体化变体池(A 型好斗 / B 型守势、精英专属池) | 共识点 A 的 A2 案;登记[待办清单](../../../../待办清单.md) |
|
||||||
| P1 | 精英遭遇接线、精英底座光环与描边变色、精英钥石掉落 | 精英行已落表静置(见「精英行」节);接线归[待办清单](../../../../待办清单.md)「战斗节点遭遇编排方式」条目,视觉二件随怪物设定批,钥石随接线批 |
|
|
||||||
| P1 | 全局特殊间隔旋钮 | 特殊技背靠背实测仍嫌时的备用闸;登记[待办清单](../../../../待办清单.md) |
|
| P1 | 全局特殊间隔旋钮 | 特殊技背靠背实测仍嫌时的备用闸;登记[待办清单](../../../../待办清单.md) |
|
||||||
| P1 | 新效应词汇(妨害技 + 必中附加分量已实装——实装面 = L2 Boss 卓尔;多段命中经用户拍板退役) | 妨害类型 + rider_mult 字段已落地;登记[待办清单](../../../../待办清单.md)(已解决移除,去向见状态记录) |
|
| P1 | 新效应词汇批(妨害技 + 必中附加分量已实装 2026-09-19——设计权威 proposal-status-vocabulary.md〔提案已吸收退役——现行事实源=敌人系统.md 词汇表/增益状态.md〕 v1.0,实装面 = L2 Boss 卓尔;多段命中经用户拍板退役) | 妨害类型 + rider_mult 字段已落地;登记[待办清单](../../../../待办清单.md)(已解决移除,去向见状态记录) |
|
||||||
| P1 | 敌种扩容与投放节奏(含第二关池与投放) | 投放节奏是关卡命脉,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
| P1 | 敌种名录扩容与投放节奏(含第二关池与投放) | 投放节奏是关卡命脉,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
||||||
| P1 | 单体寻址("只打某一个敌人"的目标指定) | 归集语义与呈现已裁定(语义归[增益状态](增益状态.md)〈单体寻址扩展位〉节);实现随首个单体效果的内容批落地 |
|
| P1 | 单体寻址("只打某一个敌人"的目标指定) | 归集语义与呈现已裁定(2026-10-26;语义归[增益状态](增益状态.md)〈单体寻址扩展位〉节);实现随首个单体效果的内容批落地 |
|
||||||
| P2 | 敌方技能图鉴 / 学习呈现(玩家侧技能知识系统) | 池不公开口径下的进阶信息面;登记[待办清单](../../../../待办清单.md) |
|
| P2 | 敌方技能图鉴 / 学习呈现(玩家侧技能知识系统) | 池不公开口径下的进阶信息面;登记[待办清单](../../../../待办清单.md) |
|
||||||
| P2 | ~~精英 / Boss 遭遇编码位~~(已完成——不设编码位:同层多遭遇由节点编号消解,关卡节点地图 v1.0⑥ 用户裁决) | — |
|
| P2 | ~~精英 / Boss 遭遇编码位~~(已完成——不设编码位:同层多遭遇由节点编号消解,关卡节点地图 v1.0⑥ 用户裁决) | — |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
配置表共三张。数值纪律:**本文只锁字段、取值域与规则,行值一律读配置表(切片 `game/data/tables/` 的 enemy / skills / hero 表),不在本文登记具体数值——防双写失同步**;曲线调参所有权归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。
|
配置表共三张。数值纪律(2026-09-17 降级批定稿):**本文只锁字段、取值域与规则,行值一律读配置表(切片 `game/data/tables/` 的 enemy / skills / hero 表),不在本文登记具体数值——防双写失同步**;曲线调参所有权归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。
|
||||||
|
|
||||||
敌人表(按深度带坐标存放,每坐标行集一行或多行——多行即混编遭遇,构成纪律见核心规则「行集构成纪律」;单行行集 = 既有形态):
|
敌人表(按深度带坐标存放,每坐标行集一行或多行——多行即混编遭遇,构成纪律见核心规则「行集构成纪律」;单行行集 = 既有形态):
|
||||||
|
|
||||||
| 参数 | 取值域 | 说明 |
|
| 参数 | 取值域 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| level_index(关卡序号) | int ≥ 1 | 行集坐标第一维:第几关;每关必有战斗类、深度带 0 的一行(锚行)与至少一行 Boss 类行——加载校验强制;关间台阶的坐标轴,行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
|
||||||
| row_kind | {battle, boss, elite} | 行类:battle = 战斗节点配池(非 Boss 的战斗节点一律取此类),boss = 终点行集——Boss 战按终点配置,多终点各配一行(走哪条路决定打谁);elite = 精英行(见核心规则「精英行」节,接线前不被任何节点读到);开战按节点类型取对应类的行集 |
|
|
||||||
| depth_band | int ≥ 0 | 深度带 = 节点深度所在的区间(定义见核心规则「行集构成纪律」):配池按带不按点,难度坡随带递增;节点深度落在带与带之间时取首个 ≥ 深度的带键(偏难一侧);越顶带加载校验判为调参事故;带键投放归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
|
||||||
| unit_count | [1, 3] | 遭遇数量区间下界;有上界的行开战时在区间内掷定,教学位节点同样掷骰 |
|
| unit_count | [1, 3] | 遭遇数量区间下界;有上界的行开战时在区间内掷定,教学位节点同样掷骰 |
|
||||||
| unit_count_max | [unit_count, 3],可省略 | 数量区间上界;开战时在区间内掷定本战实际数量;缺省 = 定值 |
|
| unit_count_max | [unit_count, 3],可省略 | 数量区间上界;开战时在区间内掷定本战实际数量;缺省 = 定值 |
|
||||||
| atk_min / atk_max | [0, 999] 可选配对 | 攻击基线区间:开战掷定一次、整战持久;缺省 = 定值行 |
|
| atk_min / atk_max | [0, 999] 可选配对 | 攻击基线区间:开战掷定一次、整战持久;缺省 = 定值行 |
|
||||||
| armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 克制结算归[战斗结算](战斗结算.md) |
|
| armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 克制结算归[战斗结算](战斗结算.md) |
|
||||||
| attack_type | {普通, 穿刺, 魔法},缺省普通 | 敌方攻击类型轴(20 行全填 normal,攻击类型闭集枚举+缺省回退向后兼容,与 armor_type 同位同款);消费面 = 战斗结算敌方技兑付路径的护甲克制矩阵查表(敌方开单第 9 参传值+克制消费点,见战斗结算);行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
| attack_type | {普通, 穿刺, 魔法},缺省普通 | 敌方攻击类型轴(**2026-10-13 迭代 24 N3 开列实装**:20 行全填 normal,攻击类型闭集枚举+缺省回退向后兼容,与 armor_type 同位同款);消费面 = 战斗结算敌方技兑付路径的护甲克制矩阵查表(敌方开单第 9 参传值+克制消费点,见战斗结算);行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
||||||
| armor_class(护甲等级) | int [0, 999],缺省 0 | 防守方护甲等级——基础攻击掷点的折扣判定读数,掷点结算归[战斗结算](战斗结算.md);与 armor_type(克制属性轴)两概念禁止混用;行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
| armor_class(护甲等级) | int [0, 999],缺省 0 | 防守方护甲等级——基础攻击掷点的折扣判定读数,掷点结算归[战斗结算](战斗结算.md);与 armor_type(克制属性轴)两概念禁止混用;行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
||||||
| hp | [1, 999] | 单位生命基线(难度修饰前) |
|
| hp | [1, 999] | 单位生命基线(难度修饰前) |
|
||||||
| atk | [0, 999] | 攻击基线 |
|
| atk | [0, 999] | 攻击基线 |
|
||||||
| pool(池模板) | {skill_id, weight} 数组,weight ∈ (0, 9999] | battle / boss 行必填、elite 行禁填;技能行引用在技能表;池构成纪律与悬空引用加载期拒绝(校验在数据配置跨表通道) |
|
| pool(池模板) | {skill_id, weight} 数组,weight ∈ (0, 9999] | 技能行引用在技能表;池构成纪律与悬空引用加载期拒绝(校验在数据配置跨表通道) |
|
||||||
| base_ref(基础敌种引用) | enemy_id 字符串 | 仅 elite 行、必填(其余行类禁填);须指向同关 battle 行类存在的敌种,悬空或指向 elite 行加载期拒绝 |
|
|
||||||
| pool_extra(附加技清单) | {skill_id, weight} 数组,weight ∈ (0, 9999],非空 | 仅 elite 行、必填(其余行类禁填);skill_id 与基础池不相交;合并后池过池构成纪律 |
|
|
||||||
|
|
||||||
技能表(全局单表,技能行主键 skill_id):
|
技能表(全局单表,技能行主键 skill_id):
|
||||||
|
|
||||||
@@ -300,12 +293,12 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
|
|||||||
| max_hp | [1, 999] | 主角生命上限 |
|
| max_hp | [1, 999] | 主角生命上限 |
|
||||||
| atk | [1, 999] | 基础攻击;配 0 加载期拒绝——基础攻击恒在 |
|
| atk | [1, 999] | 基础攻击;配 0 加载期拒绝——基础攻击恒在 |
|
||||||
| armor_class(护甲等级) | int [0, 999] | 主角作为防守方的护甲等级基准,ac_up(盾牌加护)在其上加算;掷点结算归[战斗结算](战斗结算.md) |
|
| armor_class(护甲等级) | int [0, 999] | 主角作为防守方的护甲等级基准,ac_up(盾牌加护)在其上加算;掷点结算归[战斗结算](战斗结算.md) |
|
||||||
| armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 主角护甲类型轴(可配置可修改);克制结算归[战斗结算](战斗结算.md)——**矩阵消费面双向在役(现役敌方全 normal 档,主角三甲型对敌方的读数差 = 穿重甲 −1 / 穿魔法护甲 +1 / 轻甲 0,同种子配对实测在案,数值终值归 M4)** |
|
| armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 主角护甲类型轴(2026-09-18 营地扩展前置批:可配置可修改);克制结算归[战斗结算](战斗结算.md)——**矩阵消费面双向在役(2026-10-13 迭代 24 N3:敌方 attack_type 轴开列+敌方兑付路径克制消费点补齐后,轴休眠态终结;现役敌方全 normal 档,主角三甲型对敌方的读数差 = 穿重甲 −1 / 穿魔法护甲 +1 / 轻甲 0,同种子配对实测在案,数值终值归 M4)** |
|
||||||
| attack_type | {普通, 穿刺, 魔法},缺省普通 | 主角基础攻击类型轴(基础攻击量与攻击类型抽象分离——营地永久强化换型 = 改此字段,atk 量轴不动);消费面 = 战斗结算·战斗段基础分量 |
|
| attack_type | {普通, 穿刺, 魔法},缺省普通 | 主角基础攻击类型轴(2026-09-18 营地扩展前置批:基础攻击量与攻击类型抽象分离——营地永久强化换型 = 改此字段,atk 量轴不动);消费面 = 战斗结算·战斗段基础分量 |
|
||||||
|
|
||||||
各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。
|
各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。
|
||||||
|
|
||||||
结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、固定顺位、**行集构成纪律(行集内 enemy_id 唯一 + 同带键多行文件内相邻且行序 = 声明序 = 生成序 + 行集实例总数 ≤ 4)**、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步登记册(登记 [待办清单](../../../../待办清单.md))。
|
结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、固定顺位、**行集构成纪律(2026-10-07 行集多行批换代——原「每坐标恰一敌种」退役:行集内 enemy_id 唯一 + 同带键多行文件内相邻且行序 = 声明序 = 生成序 + 行集实例总数 ≤ 4)**、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步登记册(登记 [待办清单](../../../../待办清单.md))。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
@@ -315,14 +308,13 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(**技能错
|
|||||||
- 触发条件:条件不满足的技能不进可摇集合与保底集合(保底禁止逼出条件不满足的技);条件求值零随机、同种子回放逐位复现;闩型条件首次为真后整场保持(治疗抬血不回锁);每池至少一行无条件特殊技(加载校验);缺省无 trigger 字段=无条件技,旧表零变化。
|
- 触发条件:条件不满足的技能不进可摇集合与保底集合(保底禁止逼出条件不满足的技);条件求值零随机、同种子回放逐位复现;闩型条件首次为真后整场保持(治疗抬血不回锁);每池至少一行无条件特殊技(加载校验);缺省无 trigger 字段=无条件技,旧表零变化。
|
||||||
- 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。
|
- 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。
|
||||||
- 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。
|
- 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。
|
||||||
- 伤害拍读值:读值 = 基线 × 倍率;普攻 = 倍率 1 特例;施放拍恒为 0。
|
- 伤害拍读值:读值 = 基线 × 倍率;普攻 = 倍率 1 特例;施放拍恒为 0(原伏击读值条随伏击退役作废——2026-09-20 八型批)。
|
||||||
- 警觉授予:踩 N 颗雷叠 N 层、逐层直授无上限;按个体归属——每个存活敌各发一条自己的实例(全体存活敌规则,见[增益状态](增益状态.md)〈目标规则与个体归属〉节)。
|
- 警觉授予:踩 N 颗雷叠 N 层、逐层直授无上限;敌方全体共享同一状态值(side-wide)。
|
||||||
- 目标顺位:多敌时单体目标恒为生成序最前存活者,杀最前后顺延;杀至空返回空;单敌时顺位与范围效果重合。
|
- 目标顺位:多敌时单体目标恒为生成序最前存活者,杀最前后顺延;杀至空返回空;单敌时顺位与范围效果重合。
|
||||||
- 快照抗改表:实例化后修改敌人表,已生成单位的数值投影与实例池逐字不变;新实例才用新表值。
|
- 快照抗改表:实例化后修改敌人表,已生成单位的数值投影与实例池逐字不变;新实例才用新表值。
|
||||||
- 表校验:越域值、池权重 ≤ 0、空池、普攻配倍率/冷却、池增益 > 1、skill_id 悬空、行集构成违例(行集内同敌种第二行 / 同带键多行不相邻)均在加载期返回错误并止动;域内合法极端(攻击基线 0)不拒;主角表恰一行、攻击配 0 拒绝。
|
- 表校验:越域值、池权重 ≤ 0、空池、普攻配倍率/冷却、池增益 > 1、skill_id 悬空、行集构成违例(行集内同敌种第二行 / 同带键多行不相邻)均在加载期返回错误并止动;域内合法极端(攻击基线 0)不拒;主角表恰一行、攻击配 0 拒绝。
|
||||||
- 零随机回放:同一动作与受击序列驱动两个独立实例,存活投影、逐实例摇定轨迹、顺位返回序列逐项相同。
|
- 零随机回放:同一动作与受击序列驱动两个独立实例,存活投影、逐实例摇定轨迹、顺位返回序列逐项相同。
|
||||||
- 表实一致:敌人表、主角表、技能表三张配置表的字段与各自字段定义逐字段一致。
|
- 表实一致:敌人表、主角表、技能表三张配置表的字段与各自字段定义逐字段一致。
|
||||||
- 精英行:elite 行的池模板 = 基础池(同关、战斗行类、基础敌种深度带最小行)+附加技清单,开战快照拿到合并后池;基础池改表后精英合并池随之改变;elite 行落表时任何战斗节点与 Boss 节点开战都不读到它;elite 行缺基础敌种引用或附加技清单、基础敌种引用悬空或指向 elite 行、精英 enemy_id 与基础敌种引用同名、附加技与基础池 skill_id 重复、合并池违反池构成纪律、elite 行写自己的池模板、非 elite 行写基础敌种引用或附加技清单——均在加载期返回错误并止动。
|
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
# 地形变异
|
# 地形变异
|
||||||
|
|
||||||
> 一句话:格子的非雾变异(荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘)与 Boss 图整图变异(贫矿脉),挖掘中可遭遇的地貌偏离
|
> 一句话:格子的非雾变异(荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘)与 Boss 图整图变异(贫矿脉),挖掘中可遭遇的地貌偏离
|
||||||
> 状态:已定稿;现行为 v1.4
|
> 状态:已定稿(首批类型随 2026-09-19 定稿批落地,第三关一对随 2026-09-20 第三关内容批落地;首个整图变异随 2026-10-04 全局作用域变异首发批落地);现行为 v1.1
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
地形变异是一个定义层的框架:它允许给棋盘上的格子挂上"变异"标记,让某片格子在基础扫雷规则之外多一层玩家在挖掘中可遭遇的偏离。没有这个框架,关卡之间的差异只能靠雷的数量单调缩放,"每关解锁新元素"的推进感和越深越险的地貌变化都无处安放。
|
地形变异是一个定义层的框架:它允许给棋盘上的格子挂上"变异"标记,让某片格子在基础扫雷规则之外多一层玩家在挖掘中可遭遇的偏离。没有这个框架,关卡之间的差异只能靠雷的数量单调缩放,"每关解锁新元素"的推进感和越深越险的地貌变化都无处安放。
|
||||||
|
|
||||||
变异带来的行为改变发生在数据侧:格子只是多携带一条数据,读取到它的系统按数据行动,规则本体一个分支都不加。变异类型按各关地形背景定稿(第一关平原/密林基线:荆棘丛 + 藤蔓缠绕;第二关幽暗地域:岩浆 + 烬覆;第三关灰矮人矿城:落石 + 矿尘——幽暗地域最深层),机制全部经由「效果 / 触发 / 布置约束」三枚举声明——新增类型 = 清单加行 + 必要时扩充枚举词表,不改读取方。
|
变异带来的行为改变发生在数据侧:格子只是多携带一条数据,读取到它的系统按数据行动,规则本体一个分支都不加。首批变异类型已按两关地形背景定稿(第一关平原/密林基线:荆棘丛 + 藤蔓缠绕;第二关幽暗地域:岩浆 + 烬覆),第三关内容批随灰矮人矿城追加第三对(落石 + 矿尘——幽暗地域最深层),机制全部经由「效果 / 触发 / 布置约束」三枚举声明——新增类型 = 清单加行 + 必要时扩充枚举词表,不改读取方。
|
||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
| 数据侧行为约定 | 变异是格子的只读数据,随图生灭;读取方按数据行动 |
|
| 数据侧行为约定 | 变异是格子的只读数据,随图生灭;读取方按数据行动 |
|
||||||
| 零特判原则 | 禁止任何系统为变异改写扫雷规则本体——框架的承重约束(见核心规则) |
|
| 零特判原则 | 禁止任何系统为变异改写扫雷规则本体——框架的承重约束(见核心规则) |
|
||||||
| 枚举抽象 | 每类变异以「效果(effect)/ 触发(trigger)/ 布置约束(placement)」三枚举声明机制;读取方按枚举路由,不按类型名分支 |
|
| 枚举抽象 | 每类变异以「效果(effect)/ 触发(trigger)/ 布置约束(placement)」三枚举声明机制;读取方按枚举路由,不按类型名分支 |
|
||||||
| 反制道具配套义务 | **已作废(2026-10-03 用户终裁)**——反制道具本体归秘宝:同调位反制件=冒险周期常驻资源对抗关卡周期局部威胁,层级错配,设计废弃(详见下文 §反制道具配套义务 节注记) |
|
| 反制道具配套义务 | **已作废(2026-10-03 用户终裁)**——原义务「每定稿一类变异,顺带配至少一件反制道具」(义务在本系统,道具本体归秘宝;首批四类型的兑现改排 Alpha——2026-09-19 用户拍板):同调位反制件=冒险周期常驻资源对抗关卡周期局部威胁,层级错配,设计废弃(详见下文 §反制道具配套义务 节注记) |
|
||||||
|
|
||||||
不负责:
|
不负责:
|
||||||
|
|
||||||
@@ -62,20 +62,20 @@
|
|||||||
| 矿尘 | region | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 3 关 | deep_underdark | — |
|
| 矿尘 | region | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 3 关 | deep_underdark | — |
|
||||||
| 贫矿脉 | global | 资源面偏斜(resource_face) | 整图恒在(always) | 任意格(any,无格子布置域) | 第 2 关 | 通配(∅) | — |
|
| 贫矿脉 | global | 资源面偏斜(resource_face) | 整图恒在(always) | 任意格(any,无格子布置域) | 第 2 关 | 通配(∅) | — |
|
||||||
|
|
||||||
机制口径:
|
机制口径(2026-09-19 定稿批):
|
||||||
|
|
||||||
- 伤害型:挖开变异格(含连锁揭示,chain 通道同口径)在轮末结算逐行兑现扣生命——地形后果同挖雷口径,非奖励(封印受理只揭示不挖开,不触发变异伤害——挖开封印格路径已删,口径见[排雷玩法](排雷玩法.md));危险格恒不吃变异(双层叠罚污染逐行归因,首版排除)。
|
- 伤害型:挖开变异格(含连锁揭示,chain 通道同口径)在轮末结算逐行兑现扣生命——地形后果同挖雷口径,非奖励、封印格直挖不作废;危险格恒不吃变异(双层叠罚污染逐行归因,首版排除)。
|
||||||
- 信息型:已开且显示数字时该格真实数字不呈现(呈现层读取遮蔽;挖掘规划被迫降级为盲区推理)。呈现层读取不回灌规则本体——模拟试玩走查询面、不经遮蔽,读数口径不受影响。
|
- 信息型:已开且显示数字时该格真实数字不呈现(呈现层读取遮蔽;挖掘规划被迫降级为盲区推理)。呈现层读取不回灌规则本体——模拟试玩走查询面、不经遮蔽,读数口径不受影响。
|
||||||
- 直伤量为加法核小整数(effect_value ∈ [1,9],行值 provisional 归难度曲线与Boss);每格携带单类型单 id。
|
- 直伤量为加法核小整数(effect_value ∈ [1,9],行值 provisional 归难度曲线与Boss);每格携带单类型单 id。
|
||||||
- 变异格未开时无预告呈现(遭遇式;视觉标识归表现层升级批)。
|
- 变异格未开时无预告呈现(遭遇式;视觉标识归表现层升级批)。
|
||||||
|
|
||||||
候选池门控(框架级现行机制):一种变异要进入本关的布置候选,须同时满足三个条件——它的解锁关号不大于当前关卡序号(直接整数比较)、它声明的地形(board_types)与本地形有交集(声明为空集等于通配)、且节点身份匹配(scope=global 行仅 Boss/精英节点入池,普通战斗节点静默跳过;elite 系前向词位,现行零表行)。候选池为空是合法状态:静默布置一张无变异的普通图,不返回错误、不警告。门控谓词与取值域见本文候选池门控节与变异表字段定义。
|
候选池门控(框架级现行机制):一种变异要进入本关的布置候选,须同时满足三个条件——它的解锁关号不大于当前关卡序号(直接整数比较)、它声明的地形(board_types)与本地形有交集(声明为空集等于通配)、且节点身份匹配(scope=global 行仅 Boss/精英节点入池,普通战斗节点静默跳过——2026-10-04 全局作用域变异批增第三维;elite 系前向词位,首发零表行)。候选池为空是合法状态:静默布置一张无变异的普通图,不返回错误、不警告。门控谓词与取值域见本文候选池门控节与变异表字段定义。
|
||||||
|
|
||||||
### 全局作用域型(scope=global——Boss 图整图变异)
|
### 全局作用域型(scope=global——Boss 图整图变异)
|
||||||
|
|
||||||
region 型变异是「格子级」的:布置段往候选格域写格子快照。global 型变异是「整图」的:整图一个类型生效,不落任何格子(棋盘持有整图变异记录,逐格变异记录恒空)。**每图一型的整图推广(2026-10-04 用户裁决)**:普通图带 region 片,Boss/精英图带 global 型——两类图各自至多一型。
|
region 型变异是「格子级」的:布置段往候选格域写格子快照。global 型变异是「整图」的:整图一个类型生效,不落任何格子(棋盘持有整图变异记录,逐格变异记录恒空)。**每图一型的整图推广(2026-10-04 用户裁决)**:普通图带 region 片,Boss/精英图带 global 型——两类图各自至多一型。
|
||||||
|
|
||||||
**替换制**:Boss/精英图命中全局型时,布置段跳过 region 布置(该图既无 region 片、也无格子级变异标记)——L2 完美 Boss 承伤已越 ≤50% 带,region 叠全局的叠加制火上浇油,不采纳。**兜底回落**:Boss/精英图的全局候选池为空时(含第 1 关 Boss 解锁门控未达=免疫,第 1 关是过滤器不是墙的教学保护)回落 region 布置(保守向后兼容,防配置缺行静默裸奔——provisional)。
|
**替换制**:Boss/精英图命中全局型时,布置段跳过 region 布置(该图既无 region 片、也无格子级变异标记)——L2 完美 Boss 承伤已越 ≤50% 带,region 叠全局的叠加制火上浇油,不采纳。**兜底回落**:Boss/精英图的全局候选池为空时(含第 1 关 Boss 解锁门控未达=免疫,第 1 关是过滤器不是墙的教学保护)回落 region 布置,即回批前行为(保守向后兼容,防配置缺行静默裸奔——provisional)。
|
||||||
|
|
||||||
**恒定制**:第 2/3 关 Boss 图 100% 带一型(非掷定结果——配置事实;全局取用确定性,不消费布置随机流=零取号合法态)。首发型=**贫矿脉(skewed_veins)**:资源面偏斜(resource_face)——整图修正资源摇号分布,不动任何格子数据、不动生成端:进攻族(增伤/爆裂/穿刺/奥术)权重等比上浮,生存族(回血/护甲)权重按 effect_value% 下调,白名单三行(削弱/GP/行动点)恒不动,下调量按进攻族原权重比例重分配、正向池合计恒 77。玩家体验=回复与护甲类资源出现频率下降、攻击类资源出现频率上升(生存资源变薄、进攻资源变肥),玩家转向用进攻续命的主动策略——不是纯挨打。第 2/3 关两关同型(关间台阶由第 3 关既有新内容满足)。清图槽(clear_default/clear_blast)是独立池,不受偏斜影响。资源投影的执行面(摇号前权重合成、合成序=图级先件级后)归[地图战斗资源](../战斗循环/地图战斗资源.md)。
|
**恒定制**:第 2/3 关 Boss 图 100% 带一型(非掷定结果——配置事实;全局取用确定性,不消费布置随机流=零取号合法态)。首发型=**贫矿脉(skewed_veins)**:资源面偏斜(resource_face)——整图修正资源摇号分布,不动任何格子数据、不动生成端:进攻族(增伤/爆裂/穿刺/奥术)权重等比上浮,生存族(回血/护甲)权重按 effect_value% 下调,白名单三行(削弱/GP/行动点)恒不动,下调量按进攻族原权重比例重分配、正向池合计恒 77。玩家体验=回复与护甲类资源出现频率下降、攻击类资源出现频率上升(生存资源变薄、进攻资源变肥),玩家转向用进攻续命的主动策略——不是纯挨打。第 2/3 关两关同型(关间台阶由第 3 关既有新内容满足)。清图槽(clear_default/clear_blast)是独立池,不受偏斜影响。资源投影的执行面(摇号前权重合成、合成序=图级先件级后)归[地图战斗资源](../战斗循环/地图战斗资源.md)。
|
||||||
|
|
||||||
@@ -91,20 +91,20 @@ region 型变异是「格子级」的:布置段往候选格域写格子快照
|
|||||||
|
|
||||||
变异在战斗初始化末段布置:初始展开完成、地图战斗资源格设置之后,由战斗结算的编排段执行。候选池非空时从池内均匀选一类型,按布置参数生长连通片写入格子快照:
|
变异在战斗初始化末段布置:初始展开完成、地图战斗资源格设置之后,由战斗结算的编排段执行。候选池非空时从池内均匀选一类型,按布置参数生长连通片写入格子快照:
|
||||||
|
|
||||||
- 数量 = round(候选池格数 × percent_of_cells / 100) + (关卡序号 − 1) × per_level_bonus(两参数现行值读变异表——百分比的基数是候选池格数而非总格数:初始展开通常占全板过半,按总格数取数会使变异在剩余可挖格中的实际密度远超配置值(2026-09-21 用户拍板基数修正);percent 承载"占可挖格比例",关卡递增由 per_level_bonus 绝对格数承载"越深越险";provisional 归难度曲线与Boss)。
|
- 数量 = round(候选池格数 × percent_of_cells / 100) + (关卡序号 − 1) × per_level_bonus(当前 5% + 每关 +2——百分比的基数是候选池格数而非总格数:初始展开通常占全板过半,按总格数取数会使变异在剩余可挖格中的实际密度远超配置值(2026-09-21 用户拍板基数修正);percent 承载"占可挖格比例",关卡递增由 per_level_bonus 绝对格数承载"越深越险";provisional 归难度曲线与Boss)。
|
||||||
- 形状 = 全连通生长(8 邻),单片格数落在 [pack_min, pack_max] 内(两端读变异表;2026-09-19 用户拍板形状约束)。
|
- 形状 = 全连通生长(8 邻),单片 ≤ pack_max(当前 4:2×2 / 1×4 / 1×3+1 等形;2026-09-19 用户拍板)。
|
||||||
- 候选格域 = 安全格 − 初始展开区,且排除危险格。
|
- 候选格域 = 安全格 − 初始展开区,且排除危险格。
|
||||||
- 布置取数走专用随机流(variant_place,一板恰一 scope),换图/轮内刷新图各取号一次,确定性可复放。
|
- 布置取数走专用随机流(variant_place,一板恰一 scope),换图/轮内刷新图各取号一次,确定性可复放。
|
||||||
- 生成器管线不布置变异(产物恒零变异格)——布置域的"未开"语义由设置顺序保障。
|
- 生成器管线不布置变异(产物恒零变异格)——布置域的"未开"语义由设置顺序保障。
|
||||||
- **全局作用域型决议**:Boss/精英图的全局型在装板序内前置于资源格设置之前决议(图级偏斜旋钮须在资源摇号前定型;全局门控与板无关,确定性取用不消费 variant_place 流)——命中即写整图字段并跳过本步的 region 布置(替换制);未命中则本步按上列规则原样执行(含兜底回落)。普通图路径零改动。
|
- **全局作用域型决议(2026-10-04 首发批)**:Boss/精英图的全局型在装板序内前置于资源格设置之前决议(图级偏斜旋钮须在资源摇号前定型;全局门控与板无关,确定性取用不消费 variant_place 流)——命中即写整图字段并跳过本步的 region 布置(替换制);未命中则本步按上列规则原样执行(含兜底回落)。普通图路径零改动。
|
||||||
|
|
||||||
### 反制道具配套义务
|
### 反制道具配套义务
|
||||||
|
|
||||||
**【已作废——2026-10-03 用户终裁】** 反制道具不再作为变异的配套义务:"反制"作为道具的一个维度,由秘宝的五维度框架承接,效果、时效与定价归秘宝定稿;类型行 counter_items 字段位已预留。
|
**【已作废——2026-10-03 用户终裁】** 原义务:每定稿一类变异,必须顺带配套至少一件反制道具(针对该变异、给玩家提供应对手段的道具),不让任何变异成为只亏不赚的纯税。义务归属方是本系统;"反制"作为道具的一个维度,由秘宝的五维度框架承接,效果、时效与定价归秘宝定稿。首批四类型的反制兑现改排 Alpha(2026-09-19 用户拍板),类型行 counter_items 字段位已预留。
|
||||||
|
|
||||||
**终裁理由(2026-10-03)**:同调目录(局外装配、伴随整局、稀缺槽位)对抗按关绑定的局部威胁(unlock_level 关绑定)属层级错配——「拿冒险循环的东西对抗关卡循环」,等同做一个只对第三关生效的道具,其余关卡全部用不上;且关卡序列与变异分布固定,装配时信息完备,反制选牌退化为查表必带清单,坍缩随机构筑多样性。
|
**终裁理由(2026-10-03)**:原计划反制件入同调目录(局外装配、伴随整局、稀缺槽位)对抗按关绑定的局部威胁(unlock_level 关绑定),被定性为层级错配的失败设计——「拿冒险循环的东西对抗关卡循环」,等同做一个只对第三关生效的道具,其余关卡全部用不上;且关卡序列与变异分布固定,装配时信息完备,反制选牌退化为查表必带清单,坍缩随机构筑多样性。
|
||||||
|
|
||||||
**处置**:①counter_items 字段保留恒空(合法态),承载形态待双层 BD 调研仲裁后重定——变异应对若做,只挂局内、贴近威胁出现的决策点;②变异=受控纯税现状维持,不再以反制道具为唯一兑现路径。
|
**处置**:①counter_items 字段保留恒空(合法态),承载形态待迭代 12 双层 BD 调研仲裁后重定——变异应对若做,只挂局内、贴近威胁出现的决策点;②变异=受控纯税现状维持(2026-09-20 用户已知情接受,延续有效),不再以反制道具为唯一兑现路径;③连带修订见秘宝.md v0.8(同批)。
|
||||||
|
|
||||||
## 依赖与输出
|
## 依赖与输出
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ region 型变异是「格子级」的:布置段往候选格域写格子快照
|
|||||||
| 上游 | [数据配置](../表现与支撑/数据配置.md) | 变异类型清单的表结构承载与统一读取;本系统是清单内容的回填责任方 |
|
| 上游 | [数据配置](../表现与支撑/数据配置.md) | 变异类型清单的表结构承载与统一读取;本系统是清单内容的回填责任方 |
|
||||||
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 布置段的编排执行位(棋盘设置顺序第 4 步)+ 伤害型兑付面(轮末结算逐行兑现) |
|
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 布置段的编排执行位(棋盘设置顺序第 4 步)+ 伤害型兑付面(轮末结算逐行兑现) |
|
||||||
| 下游 | [排雷玩法](排雷玩法.md) | 零特判义务的承接方:执行逻辑不按变异分支,只按格子数据行动 |
|
| 下游 | [排雷玩法](排雷玩法.md) | 零特判义务的承接方:执行逻辑不按变异分支,只按格子数据行动 |
|
||||||
| 下游 | [秘宝](../跨局循环/秘宝.md) | 五维度框架"反制"维度的承接方——配套义务已作废(2026-10-03 终裁),维度承载待双层 BD 调研重定 |
|
| 下游 | [秘宝](../跨局循环/秘宝.md) | 五维度框架"反制"维度的承接方——配套义务已作废(2026-10-03 终裁),维度承载待迭代 12 双层 BD 调研重定 |
|
||||||
| 相邻 | [行动经济](行动经济.md) | "地形成本修饰"价目钩子(不同格子不同价)暂缓启用,待变异类型扩展(见该文档 P1/P2 后置) |
|
| 相邻 | [行动经济](行动经济.md) | "地形成本修饰"价目钩子(不同格子不同价)暂缓启用,待变异类型扩展(见该文档 P1/P2 后置) |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
@@ -129,30 +129,29 @@ region 型变异是「格子级」的:布置段往候选格域写格子快照
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 调研前置 | 反制路径重定(counter_items 回填义务已作废) | 2026-10-03 用户终裁:同调位反制件=层级错配失败设计,义务作废;变异应对是否以局内形态补入,待双层 BD 调研仲裁后重新立项 |
|
| 迭代 12(调研前置) | 反制路径重定(原:首批四类型的反制道具兑现,counter_items 回填——已作废) | 2026-10-03 用户终裁:同调位反制件=层级错配失败设计,义务作废;变异应对是否以局内形态补入,待双层 BD 调研仲裁后重新立项 |
|
||||||
| ~~Alpha~~ **已落地** | 全局作用域变异(精英/Boss 图整图生效的变异形态) | 现行型=贫矿脉(资源面·微贫向偏斜,替换制/恒定制/L1 Boss 免疫/三层预告);裁决全录见 git 提交史;带 A 杠杆注册全局难度批(Beta 阶段,未排期)读数只测不判;精英图留词表前向位(现行零表行) |
|
| ~~Alpha~~ **已落地** | 全局作用域变异(精英/Boss 图整图生效的变异形态) | **2026-10-04 全局作用域变异首发批落地**(迭代 14 ③号卡)——首批型=贫矿脉(案A 资源面·微贫向偏斜,替换制/恒定制/L1 Boss 免疫/三层预告);裁决全录见调研报告 §7(全局作用域设计空间调研(已退役,git 历史可查);原需求卡片已退役);带 A 杠杆注册全局难度批(Beta 阶段,未排期)顺带读数只测不判;精英图留词表前向位(首发零表行) |
|
||||||
| P2 | "地形成本修饰"价目钩子启用 | 由行动经济持有;启用须随变异类型扩展,与行动经济重议按格定价的接口 |
|
| P2 | "地形成本修饰"价目钩子启用 | 由行动经济持有;启用须随变异类型扩展,与行动经济重议按格定价的接口 |
|
||||||
| P2 | 变异解锁节奏复核 | "每关至少引入一个新元素"的推进节奏,随[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)定稿复核 |
|
| P2 | 变异解锁节奏复核 | "每关至少引入一个新元素"的推进节奏,随[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)定稿复核 |
|
||||||
| P2 | 变异格视觉标识与预告呈现 | 首批为遭遇式(未开无预告);标识位随表现层升级批 |
|
| P2 | 变异格视觉标识与预告呈现 | 首批为遭遇式(未开无预告);标识位随表现层升级批 |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
| 参数 | 取值域 | 归属 |
|
| 参数 | 现行值 | 归属 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 布置数量基数 percent_of_cells | percent [0, 50](候选池格数百分比,2026-09-21 基数修正);现行值读 `variation.tres` 表头 | 难度曲线与Boss(provisional) |
|
| 布置数量基数 percent_of_cells | 5(候选池格数百分比,2026-09-21 基数修正) | 难度曲线与Boss(provisional) |
|
||||||
| 关卡递增 per_level_bonus | int [0, 9] 格/关;现行值读 `variation.tres` 表头 | 难度曲线与Boss(provisional) |
|
| 关卡递增 per_level_bonus | +2 格/关 | 难度曲线与Boss(provisional) |
|
||||||
| 连通片下限 pack_min | int [1, pack_max];现行值读 `variation.tres` 表头 | 形状约束:单片至少几格连通成片,与 pack_max 合为成包尺寸域 |
|
| 连通片上限 pack_max | 4 | 定稿值(2026-09-19 用户拍板形状约束) |
|
||||||
| 连通片上限 pack_max | int [pack_min, 9];现行值读 `variation.tres` 表头 | 定稿值(2026-09-19 用户拍板形状约束) |
|
|
||||||
| 直伤量 effect_value | 荆棘丛 1 / 岩浆 2 / 落石 3 | 难度曲线与Boss(provisional,加法核 [1,9]) |
|
| 直伤量 effect_value | 荆棘丛 1 / 岩浆 2 / 落石 3 | 难度曲线与Boss(provisional,加法核 [1,9]) |
|
||||||
| 资源面偏斜 effect_value | 贫矿脉 30(生存族下调百分比;0=中性 off 锚;总期望微降 3-5% 为 provisional 设计目标——精确方向与幅度归读数批判读只测不判) | 难度曲线与Boss(provisional,域 [0,50]) |
|
| 资源面偏斜 effect_value | 贫矿脉 30(生存族下调百分比;0=中性 off 锚;总期望微降 3-5% 为 provisional 设计目标——精确方向与幅度归读数批判读只测不判) | 难度曲线与Boss(provisional,域 [0,50]——2026-10-04 首发批投值) |
|
||||||
|
|
||||||
变异表字段集的现行口径(字段定义归变异表,条目归属即表行):标识 / 玩家可见名 / 解锁关号 / 作用域 / 效果 / 效果量 / 触发 / 布置约束 / 地形(board_types)/ 反制道具绑定(counter_items,恒空保留——承载形态待双层 BD 调研重定)。
|
变异表字段集的现行口径(字段定义归变异表,条目归属即表行):标识 / 玩家可见名 / 解锁关号 / 作用域 / 效果 / 效果量 / 触发 / 布置约束 / 地形(board_types)/ 反制道具绑定(counter_items,恒空保留——回填义务 2026-10-03 作废,承载形态待迭代 12 重定)。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
- 候选池空合法:门控筛空(池空或候选域碎片化不足)时静默零布置,配置加载零错误、零警告。
|
- 候选池空合法:门控筛空(池空或候选域碎片化不足)时静默零布置,配置加载零错误、零警告。
|
||||||
- 零特判(负验收):排雷玩法的挖格、封印、连锁展开执行路径中不存在任何按变异类型分支的代码;读取方按 effect/trigger/placement 枚举路由。
|
- 零特判(负验收):排雷玩法的挖格、封印、连锁展开执行路径中不存在任何按变异类型分支的代码;读取方按 effect/trigger/placement 枚举路由。
|
||||||
- 数据生命周期:格子携带的变异是只读数据——战斗初始化末段布置、随图消亡,布置后零运行时写入,无跨图存续;生成器产物恒零变异格。
|
- 数据生命周期:格子携带的变异是只读数据——战斗初始化末段布置、随图消亡,布置后零运行时写入,无跨图存续;生成器产物恒零变异格。
|
||||||
- 布置域:变异格全在初始展开区外(伤害型 closed_only 由设置顺序结构保障)且不吃危险格;每图至多一种类型;连通片格数落在 [pack_min, pack_max] 内。
|
- 布置域:变异格全在初始展开区外(伤害型 closed_only 由设置顺序结构保障)且不吃危险格;每图至多一种类型;连通片 ≤ pack_max。
|
||||||
- 配套义务闭环(**已作废,2026-10-03 终裁**):反制兑现不作为验收条目;counter_items 恒空为合法态。
|
- 配套义务闭环(**已作废,2026-10-03 终裁**):原「定稿批须含反制兑现条目否则验收不通过」随反制道具配套义务一并作废;counter_items 恒空为合法态。
|
||||||
- 全局作用域型:替换制生效——Boss 图恰一行整图变异+零格子级变异标记;普通图 region 路径逐位不变;off 态零扰动(effect_value=0 资源摇号与无偏斜逐位相同,白名单三行任何状态逐位不动);L1 Boss 零全局变异;Boss 图全局池空回落 region;全局取用零取号(确定性,不消费布置随机流);资源面偏斜正向池合计恒 77。
|
- 全局作用域型(2026-10-04 首发批):替换制生效——Boss 图恰一行整图变异+零格子级变异标记;普通图 region 路径逐位不变(同种子布置/摇号快照与批前基线逐项比对);off 态零扰动(effect_value=0 资源摇号与无偏斜逐位相同,白名单三行任何状态逐位不动);L1 Boss 零全局变异;Boss 图全局池空回落 region;全局取用零取号(确定性,不消费布置随机流);资源面偏斜正向池合计恒 77。
|
||||||
@@ -1,23 +1,23 @@
|
|||||||
# 排雷玩法
|
# 排雷玩法
|
||||||
|
|
||||||
> 一句话:挖格、封印、连锁展开等扫雷规则本体
|
> 一句话:挖格、封印、连锁展开等扫雷规则本体
|
||||||
> 状态:已定稿(v2.0)
|
> 状态:已定稿(自旧体系迁移)
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
排雷玩法是扫雷规则本体:玩家在地牢厅室里做的每个动作——挖格、封印、移动——都由它裁决,并把发生的事实如实上报给全项目。它不决定每个动作花多少钱(系统资源归[行动经济](行动经济.md)),也不决定收益怎么兑现成战斗效果(归[战斗结算](../战斗循环/战斗结算.md))——它只保证棋盘上的事实真实、顺序确定:数字从不说谎,每个拒绝有据可查。没有它,[棋盘生成](棋盘生成.md)生成的板没有发生地,战斗结算也没有事实来源。
|
排雷玩法是扫雷规则本体:玩家在地牢厅室里做的每个动作——挖格、封印、移动——都由它裁决,并把发生的事实如实上报给全项目。它不决定每个动作花多少钱(系统资源归[行动经济](行动经济.md)),也不决定收益怎么兑现成战斗效果(归[战斗结算](../战斗循环/战斗结算.md))——它只保证棋盘上的事实真实、顺序确定:数字从不说谎,每个拒绝有据可查。没有它,[棋盘生成](棋盘生成.md)生成的板没有发生地,战斗结算也没有事实来源。
|
||||||
|
|
||||||
格子的正式名称全库统一(2026-10-11 用户裁):有惩罚的格子一律称**危险格**(见[术语表](../../术语表.md);同日补裁=无具体类型划分,怪物巢穴类型概念退役)——惊动危险格则怪物倾巢而出、敌方占得先机;封印叫**控制**(标中则化险为利)、连锁展开叫**坍塌显形**(挖穿薄壳,整片塌陷露出)、标错叫**控制失败**。本文一律使用「危险格」。
|
格子的正式名称全库统一(2026-10-11 用户裁):有惩罚的格子一律称**危险格**(原内部名「雷格」与界面名「惩罚格」统一并退役,见[术语表](../../术语表.md);同日补裁=无具体类型划分,怪物巢穴类型概念退役)——惊动危险格则怪物倾巢而出、敌方占得先机;封印叫**控制**(标中则化险为利)、连锁展开叫**坍塌显形**(挖穿薄壳,整片塌陷露出)、标错叫**控制失败**。本文一律使用「危险格」。
|
||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:一个动作"碰棋盘"的部分全归这里——合不合法、执行后格子变成什么样、哪些格被揭示、封印印记立在哪;"花多少钱"归行动经济,"兑现成什么战斗效果"归战斗结算,"画成什么样"归 HUD 框架,"格子怎么生出来"归棋盘生成。本系统自己不含任何玩法数值、零随机、也不认界面:同一张板、同一份动作序列,必然得到逐位相同的结果。
|
边界这样划:一个动作"碰棋盘"的部分全归这里——合不合法、执行后格子变成什么样、翻开了哪些格、封印印记立在哪;"花多少钱"归行动经济,"兑现成什么战斗效果"归战斗结算,"画成什么样"归 HUD 框架,"格子怎么生出来"归棋盘生成。本系统自己不含任何玩法数值、零随机、也不认界面:同一张板、同一份动作序列,必然得到逐位相同的结果。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
| 负责 | 说明 |
|
| 负责 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 全部棋盘面规则 | 动作合法性(相邻、开未开、封印位)、连锁展开、数字提示、封印印记的棋盘状态、清图判定(安全格是否全部完成——挖开或封印) |
|
| 全部棋盘面规则 | 动作合法性(相邻、开未开、封印位)、连锁展开、数字提示、封印印记的棋盘状态、清图判定(安全格是否全部开完) |
|
||||||
| 开局初始展开 | 装板事务:结构前提校验、免费展开出生开阔地、小人落位 |
|
| 开局初始展开 | 装板事务:结构前提校验、免费展开出生开阔地、小人落位 |
|
||||||
| 单一结算入口 | 玩家意图只从批次结算入口进,按固定语义序仲裁 |
|
| 单一结算入口 | 玩家意图只从批次结算入口进,按固定语义序仲裁 |
|
||||||
| 三种对外事件 | 挖开格、封印判定、轮次结束——全项目的事实流源头 |
|
| 三种对外事件 | 挖开格、封印判定、轮次结束——全项目的事实流源头 |
|
||||||
@@ -49,15 +49,15 @@
|
|||||||
|
|
||||||
移动不花行动点:点任何已开格,小人沿已探明区一次走到位,"已探明区"包括踩过的危险格残址。点击已开格的唯一含义就是移动——本作没有经典扫雷里"双击数字格一键翻开周围"的 chord(双击快开),每一格的兑现都必须花行动点。
|
移动不花行动点:点任何已开格,小人沿已探明区一次走到位,"已探明区"包括踩过的危险格残址。点击已开格的唯一含义就是移动——本作没有经典扫雷里"双击数字格一键翻开周围"的 chord(双击快开),每一格的兑现都必须花行动点。
|
||||||
|
|
||||||
封印与挖开同样揭示格子(2026-11-07 用户裁):封印被受理的那一刻,墙瓦片换成地板瓦片、格下身份(危险格还是安全格、安全格的数字)当场可见,封印印记叠在其上——玩家不用等轮末判定就知道封中还是封空。兑付仍然全部发生在轮末判定批,受理当场零兑付、零事件。封印格从此拒绝挖掘:挖已封印的格被拒(拒绝原因独立可辨),"封印后再挖开"这条路径不存在。封印印记没有任何撤下手段——不能被挖开、不能被撤下,随图存续到换图或战斗结束。
|
挖已封印的格是合法动作(2026-09-19 封印不可逆批用户拍板):封印印记是一次性承诺、没有撤旗动作,直接挖开就是对承诺的兑现——封印印记随挖掘消失、该封印轮末不再判定;挖开封印格的兑付改判(标中不发 / 安全格零奖励等四情况)归[战斗结算](../战斗循环/战斗结算.md)。
|
||||||
|
|
||||||
| 动作 | 合法对象 | 棋盘面拒绝情形 |
|
| 动作 | 合法对象 | 棋盘面拒绝情形 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 挖 | 8 向相邻、未开、无封印 | 不相邻 / 已开过 / 已封印 |
|
| 挖 | 8 向相邻、未开(有封印照挖) | 不相邻 / 已开过 |
|
||||||
| 封印 | 8 向相邻、未开、无封印 | 不相邻 / 已开过 / 已有封印 |
|
| 封印 | 8 向相邻、未开、无封印 | 不相邻 / 已开过 / 已有封印 |
|
||||||
| 移动 | 任意已开格,且能只经已开格连通到达 | 目标未开 / 无连通路径 |
|
| 移动 | 任意已开格,且能只经已开格连通到达 | 目标未开 / 无连通路径 |
|
||||||
|
|
||||||
每个被拒动作都带一个可辨的拒绝原因;原因只能取自一份固定清单,清单外没有别的来源。三个来源互不混淆:棋盘面非法(上表各情形,细因彼此数据可分——"已有封印"(封印动作)与"已封印"(挖动作)和"不相邻"必须互可区分)、资源不足(判定权在行动经济)、相位不对(本轮已收尾,不收动作)。玩家看到的文案归[HUD 框架](../表现与支撑/HUD框架.md)。
|
每个被拒动作都带一个可辨的拒绝原因;原因只能取自一份固定清单,清单外没有别的来源。三个来源互不混淆:棋盘面非法(上表各情形,细因彼此数据可分——"已有封印"和"不相邻"必须是两个可区分的原因)、资源不足(判定权在行动经济)、相位不对(本轮已收尾,不收动作)。玩家看到的文案归[HUD 框架](../表现与支撑/HUD框架.md)。
|
||||||
|
|
||||||
```
|
```
|
||||||
一个意图进来
|
一个意图进来
|
||||||
@@ -73,16 +73,16 @@
|
|||||||
|
|
||||||
每个已开安全格都亮着一个数字,恒等于它周围 8 格里的雷数。这条"数字恒真"是全部推理的地基:数据层从不说谎,呈现层怎么遮掩都不改真值——任何让数字失真的实现都在禁止之列。
|
每个已开安全格都亮着一个数字,恒等于它周围 8 格里的雷数。这条"数字恒真"是全部推理的地基:数据层从不说谎,呈现层怎么遮掩都不改真值——任何让数字失真的实现都在禁止之列。
|
||||||
|
|
||||||
挖开一个数字为 0 的格(周围一圈没有雷)时,它周围未封印的安全格免费连锁全开,一路递推到没有新的 0 格为止——这就是连锁展开,玩家看到的是"坍塌显形":挖穿一层薄壳,整片松动的地面塌陷露出。连锁格只扣首格挖掘按价计的一笔,照常计入清图进度(清图 = 全部安全格完成,完成 = 挖开或封印),格面资源资格也照常——连锁开出的格与单挖的格同权,资源身份归[地图战斗资源](../战斗循环/地图战斗资源.md)、极性兑付归[战斗结算](../战斗循环/战斗结算.md),本系统不区分。
|
挖开一个数字为 0 的格(周围一圈没有雷)时,它周围未封印的安全格免费连锁全开,一路递推到没有新的 0 格为止——这就是连锁展开,玩家看到的是"坍塌显形":挖穿一层薄壳,整片松动的地面塌陷露出。连锁格只扣首格挖掘按价计的一笔,照常计入清图进度(清图 = 开完全部安全格),格面资源资格也照常——连锁开出的格与单挖的格同权,资源身份归[地图战斗资源](../战斗循环/地图战斗资源.md)、极性兑付归[战斗结算](../战斗循环/战斗结算.md),本系统不区分。
|
||||||
|
|
||||||
连锁遇到封印就停:封印格不被链开,也不给更远的格当传播跳板。封印按价计费,正是玩家亲手买下的"链阻断器"——对一片不敢确定的地,提前落一枚封印印记,塌方到它为止。
|
连锁遇到封印就停:封印格不被链开,也不给更远的格当传播跳板。封印按价计费,正是玩家亲手买下的"链阻断器"——对一片不敢确定的地,提前落一枚封印印记,塌方到它为止。
|
||||||
|
|
||||||
清图在每次挖或封印完成后判定;移动不改格子,永远不会触发清图。
|
清图在每次挖完成后判定;封印、移动都不改已开格,永远不会触发清图。
|
||||||
|
|
||||||
| 连锁展开的性质 | 含义 |
|
| 连锁展开的性质 | 含义 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 免费 | 只扣首格按价计的一笔,连锁翻开的格不另收费 |
|
| 免费 | 只扣首格按价计的一笔,连锁翻开的格不另收费 |
|
||||||
| 计入清图进度 | 连锁开的格照常算进"全部安全格完成"的判定 |
|
| 计入清图进度 | 连锁开的格照常算进"全部安全格开完"的判定 |
|
||||||
| 资源资格照常 | 连锁开出的安全格与单挖的安全格同权 |
|
| 资源资格照常 | 连锁开出的安全格与单挖的安全格同权 |
|
||||||
| 遇封印即止 | 封印格不入链、不作传播跳板;封印印记留在原地,轮末照常判定 |
|
| 遇封印即止 | 封印格不入链、不作传播跳板;封印印记留在原地,轮末照常判定 |
|
||||||
|
|
||||||
@@ -134,9 +134,9 @@
|
|||||||
|
|
||||||
### 封印立得住、也带不走:封印印记的生命周期与换图重置
|
### 封印立得住、也带不走:封印印记的生命周期与换图重置
|
||||||
|
|
||||||
封印印记是棋盘状态的一部分,不是背包里的实物:落下的封印印记跨轮保留、随图存续,没有数量上限,也没有任何撤下手段——封印格拒绝挖掘(见「挖、封印、移动」节),印记只能随图更替消失。每次轮次结束(行动点耗尽、玩家停手或清图时),本系统对当时在场的每一处封印如实上报一条判定——底下是雷记标中(玩家看到危险格被控制、化险为利),不是雷记标空;封印一直落在雷上,就每轮如实重复上报标中,去重是[战斗结算](../战斗循环/战斗结算.md)的事,本系统只报事实。封印本身不发事件,界面反馈走调用返回值。
|
封印印记是棋盘状态的一部分,不是背包里的实物:落下的封印印记跨轮保留、随图存续,没有数量上限,也没有任何移除手段(移除动作已退役——封印印记只能被挖开,不能被撤下)。每次轮次结束(行动点耗尽、玩家停手或清图时),本系统对当时在场的每一处封印如实上报一条判定——封印底下是雷记标中(玩家看到危险格被控制、化险为利),不是雷记标空;封印一直落在雷上,就每轮如实重复上报标中,去重是[战斗结算](../战斗循环/战斗结算.md)的事,本系统只报事实。被直接挖开的封印随挖掘消失、不在轮末在场基线里,自然不报判定;封印本身不发事件,界面反馈走调用返回值。
|
||||||
|
|
||||||
标空(封错格)没有纠错路径:印记不撤不消、随图存续——封错的格从此是一块标了价的地图注记:它算完成探索(计入清图进度),但格面资源不兑付,轮末标空的负向兑付(归[战斗结算](../战斗循环/战斗结算.md))就是封错的代价;它同时仍是链阻断器和不可通行的地形。清图判定口径(2026-11-07 用户裁):清图 = 全部安全格完成,完成 = 挖开或封印——封印可以完成清图,全图不可能被"封错一格"卡死。
|
标空(封错格)的纠错路径只有一条:把它挖开(兑付改判四情况见[战斗结算](../战斗循环/战斗结算.md));不挖也可以留着它当链阻断器、当"别走这边"的地图注记。封印印记不参与清图判定,但带封印的格没挖开就照常挡着——全图封印一格不挖,永远清不了图。
|
||||||
|
|
||||||
标空就是标错,玩家读到的是控制失败——惩罚兑付为该安全格格面资源的负向(极性矩阵,归[地图战斗资源](../战斗循环/地图战斗资源.md)与[战斗结算](../战斗循环/战斗结算.md)),本系统只报"标空"事实。
|
标空就是标错,玩家读到的是控制失败——惩罚兑付为该安全格格面资源的负向(极性矩阵,归[地图战斗资源](../战斗循环/地图战斗资源.md)与[战斗结算](../战斗循环/战斗结算.md)),本系统只报"标空"事实。
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
| 随战斗结束消失 | 整板退役 | 与板一同清空 |
|
| 随战斗结束消失 | 整板退役 | 与板一同清空 |
|
||||||
|
|
||||||
```
|
```
|
||||||
封印(按价计费,界面即时反馈)→ 封印印记立在已揭示格(地板)上,跨轮保留
|
封印(按价计费,界面即时反馈)→ 封印印记立在未开格上,跨轮保留
|
||||||
每次轮次结束 → 逐封印判定,如实上报(标中 / 标空)
|
每次轮次结束 → 逐封印判定,如实上报(标中 / 标空)
|
||||||
换图(清图或刷新)或战斗结束 → 封印印记随旧图全量消失
|
换图(清图或刷新)或战斗结束 → 封印印记随旧图全量消失
|
||||||
```
|
```
|
||||||
@@ -159,11 +159,11 @@
|
|||||||
|
|
||||||
### 一帧一个意图、对外只有三种事件:批次仲裁与事件面
|
### 一帧一个意图、对外只有三种事件:批次仲裁与事件面
|
||||||
|
|
||||||
玩家每帧只提交一个意图,全部意图经同一个批次结算入口进入本系统——这是唯一的结算入口,保证任何情况下只有一种结算顺序。批次是整体事务:先按固定语义序重排(能清图的挖或封最优先、停手次之、其余殿后,同类内按提交顺序),再逐个执行;轮次结束条件第一次成立处定出赢家,其后的意图全部丢弃。丢弃不等于被拒:拒绝是本来就不合法,丢弃是来不及了——零棋盘效果、零扣费、零事件。单意图帧下正常玩不出批次竞争,这套仲裁是防御性兜底。
|
玩家每帧只提交一个意图,全部意图经同一个批次结算入口进入本系统——这是唯一的结算入口,保证任何情况下只有一种结算顺序。批次是整体事务:先按固定语义序重排(能清图的挖最优先、停手次之、其余殿后,同类内按提交顺序),再逐个执行;轮次结束条件第一次成立处定出赢家,其后的意图全部丢弃。丢弃不等于被拒:拒绝是本来就不合法,丢弃是来不及了——零棋盘效果、零扣费、零事件。单意图帧下正常玩不出批次竞争,这套仲裁是防御性兜底。
|
||||||
|
|
||||||
| 批次语义序 | 类别 | 说明 |
|
| 批次语义序 | 类别 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 最先 | 能清图的挖或封 | 执行后图即全开的挖或封——防止"耗尽优先"把清图高光结算成最差结局 |
|
| 最先 | 能清图的挖 | 执行后图即全开的挖——防止"耗尽优先"把清图高光结算成最差结局 |
|
||||||
| 次之 | 停手 | 玩家主动收轮 |
|
| 次之 | 停手 | 玩家主动收轮 |
|
||||||
| 其余 | 普通挖、封印、移动 | 同类内按提交顺序 |
|
| 其余 | 普通挖、封印、移动 | 同类内按提交顺序 |
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
一批意图到达
|
一批意图到达
|
||||||
→ 按语义序重排(能清图的挖或封 > 停手 > 其余,同类按提交序)
|
→ 按语义序重排(能清图的挖 > 停手 > 其余,同类按提交序)
|
||||||
→ 逐个执行,轮次结束第一次成立处定赢家,其后意图丢弃
|
→ 逐个执行,轮次结束第一次成立处定赢家,其后意图丢弃
|
||||||
→ 收轮:先把封印判定逐条报完,再报轮次结束
|
→ 收轮:先把封印判定逐条报完,再报轮次结束
|
||||||
```
|
```
|
||||||
@@ -193,7 +193,7 @@
|
|||||||
| 方向 | 系统 | 接口要点 |
|
| 方向 | 系统 | 接口要点 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 上游 | [棋盘生成](棋盘生成.md) | 棋盘产物的消费方;装板时校验结构前提(出生区无雷、数字恒真等),违例拒绝装板 |
|
| 上游 | [棋盘生成](棋盘生成.md) | 棋盘产物的消费方;装板时校验结构前提(出生区无雷、数字恒真等),违例拒绝装板 |
|
||||||
| 上游 | [行动经济](行动经济.md) | 唯一扣费入口:本系统判棋盘面后请行动经济扣费,绝不自行扣减;挖成或封成后上报连锁规模与清图事实;停手意图经批次入口转交 |
|
| 上游 | [行动经济](行动经济.md) | 唯一扣费入口:本系统判棋盘面后请行动经济扣费,绝不自行扣减;挖成后上报连锁规模与清图事实;停手意图经批次入口转交 |
|
||||||
| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 三事件的订阅方、轮末兑现方;换新图指令由它回发 |
|
| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 三事件的订阅方、轮末兑现方;换新图指令由它回发 |
|
||||||
| 下游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 本系统只上报"这格有无格面资源资格"的事实;资源内容与极性兑付不经本系统 |
|
| 下游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 本系统只上报"这格有无格面资源资格"的事实;资源内容与极性兑付不经本系统 |
|
||||||
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 呈现义务归 HUD 框架 |
|
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 呈现义务归 HUD 框架 |
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
最小闭环只保留跑通"装板—挖—收轮—兑现—换图"必需的规则:
|
最小闭环只保留跑通"装板—挖—收轮—兑现—换图"必需的规则:
|
||||||
|
|
||||||
1. 战斗开始装上新图:校验结构前提,违例拒绝;初始展开免费翻开出生开阔地,小人落位。
|
1. 战斗开始装上新图:校验结构前提,违例拒绝;初始展开免费翻开出生开阔地,小人落位。
|
||||||
2. 玩家每帧提交一个意图:挖(判棋盘面,请行动经济按价扣费,开格加连锁并逐格上报;封印格拒绝挖掘)、封印(按价计费,受理即揭示——墙变地板、身份可见,印记立其上;零事件)、移动(免费,已开区一次走到位)。
|
2. 玩家每帧提交一个意图:挖(判棋盘面,请行动经济按价扣费,开格加连锁并逐格上报;有封印格照挖、封印印记随挖掘消失)、封印(按价计费,封印印记入棋盘,零事件)、移动(免费,已开区一次走到位)。
|
||||||
3. 被拒动作带可辨原因、状态不变;批次内轮次结束首次成立处定赢家,其后意图丢弃。
|
3. 被拒动作带可辨原因、状态不变;批次内轮次结束首次成立处定赢家,其后意图丢弃。
|
||||||
4. 收轮:先报完在场封印的逐条判定,再报轮次结束(停手路径由行动经济直发)。
|
4. 收轮:先报完在场封印的逐条判定,再报轮次结束(停手路径由行动经济直发)。
|
||||||
5. 战斗结算订阅事件流逐行兑现;清图或刷新换图时按它回发的指令装新图,旧板封印印记全量失效,回到第 1 步。
|
5. 战斗结算订阅事件流逐行兑现;清图或刷新换图时按它回发的指令装新图,旧板封印印记全量失效,回到第 1 步。
|
||||||
@@ -215,11 +215,11 @@
|
|||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P2 | 探测类道具的查询接口 | 接口已由身份解析只读面桥接,本系统不预写 |
|
| P2 | 探测类道具的查询接口 | 接口已由身份解析只读面桥接,本系统不预写 |
|
||||||
| P2 | 地形变异接入的格面规则 | 地形变异已定稿落地,新增类型走双方修订流程 |
|
| P2 | 地形变异接入的格面规则 | 地形变异已定稿落地(2026-09-19 四类型两轴×两关、2026-09-20 枚举化 schema 扩批),新增类型走双方修订流程 |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
本系统无自有参数:价目与每轮点数见[行动经济](行动经济.md)的调参表,棋盘形态见[棋盘生成](棋盘生成.md)。连锁免费、移动免费、无 chord、封印受理即揭示、清图口径(挖开或封印算完成)、批次语义序、三种事件封闭都是冻结设计而非参数——改动走本文修订流程,不走调参。
|
本系统无自有参数:价目与每轮点数见[行动经济](行动经济.md)的调参表,棋盘形态见[棋盘生成](棋盘生成.md)。连锁免费、移动免费、无 chord、批次语义序、三种事件封闭都是冻结设计而非参数——改动走本文修订流程,不走调参。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
@@ -228,11 +228,9 @@
|
|||||||
- 数字恒真:任意已开安全格的数字恒等于其 8 向相邻雷数;出生区无雷、数字恒真、初始展开不吞全图三条结构前提任一不满足时,装板被拒绝。
|
- 数字恒真:任意已开安全格的数字恒等于其 8 向相邻雷数;出生区无雷、数字恒真、初始展开不吞全图三条结构前提任一不满足时,装板被拒绝。
|
||||||
- 初始展开恰等:装板后翻开的格集合恰为"出生 3×3 加连通开阔地"——不止 3×3,也不外扩一圈;全程免费、恒无格面资源(封锁格)、计入清图进度;跨轮不重放。
|
- 初始展开恰等:装板后翻开的格集合恰为"出生 3×3 加连通开阔地"——不止 3×3,也不外扩一圈;全程免费、恒无格面资源(封锁格)、计入清图进度;跨轮不重放。
|
||||||
- 连锁免费且遇封印即止:一次触发连锁翻开任意多格,扣费恒为首格按价计的一笔;封印格不被链开、不作传播跳板;连锁格计入清图进度、资源资格照常。
|
- 连锁免费且遇封印即止:一次触发连锁翻开任意多格,扣费恒为首格按价计的一笔;封印格不被链开、不作传播跳板;连锁格计入清图进度、资源资格照常。
|
||||||
- 封印受理即揭示、挖封印格被拒:封印被受理后该格进入已揭示态——身份(危险/安全与数字)当场可查、封印印记叠在其上、受理当场零兑付零事件;挖已封印的格被拒(拒绝原因独立可辨、零副作用);重复封印仍被"已有封印"拒绝。
|
- 挖封印格放行(封印不可逆批 2026-09-19):有封印格直接挖开被受理——封印印记随挖掘消失、该封印轮末不判;重复封印仍被"已有封印"拒绝;兑付改判四情况(标中不发 / 安全格零奖励)归战斗结算。
|
||||||
- 清图口径:清图 = 全部安全格完成——挖开或封印都算完成;封到安全格计入清图进度,封印可以完成清图。
|
|
||||||
- 已引爆危险格可通行:挖雷后轮次不结束,小人可站、可经已开区穿行续挖;危险格不计清图、不可再挖再封印。
|
- 已引爆危险格可通行:挖雷后轮次不结束,小人可站、可经已开区穿行续挖;危险格不计清图、不可再挖再封印。
|
||||||
- 移动合法且预览同源:目标未开或无已开区连通路径时拒绝;路径预览与实际执行逐格相同;移动免费、零事件。
|
- 移动合法且预览同源:目标未开或无已开区连通路径时拒绝;路径预览与实际执行逐格相同;移动免费、零事件。
|
||||||
- 揭示预览口:预览口按实挖同口径返回揭示闭包——零状态写入、零事件外发、封印格不外扩(只读查询面,供测量与呈现旁路取数)。
|
|
||||||
- 批次仲裁与到达序无关:同一批意图按任意顺序提交,结束路径与结算结果一致;赢家定出后其余意图丢弃——零棋盘效果、零扣费、零事件,且丢弃区别于拒绝。
|
- 批次仲裁与到达序无关:同一批意图按任意顺序提交,结束路径与结算结果一致;赢家定出后其余意图丢弃——零棋盘效果、零扣费、零事件,且丢弃区别于拒绝。
|
||||||
- 收轮事件序:先报完全部封印判定,再报轮次结束;轮次结束每轮恰一条,停手路径由行动经济直发、本系统不双发。
|
- 收轮事件序:先报完全部封印判定,再报轮次结束;轮次结束每轮恰一条,停手路径由行动经济直发、本系统不双发。
|
||||||
- 拒绝三源可辨:棋盘面非法、资源不足、相位不对三类原因互异可判定;任何拒绝零副作用。
|
- 拒绝三源可辨:棋盘面非法、资源不足、相位不对三类原因互异可判定;任何拒绝零副作用。
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 棋盘生成
|
# 棋盘生成
|
||||||
|
|
||||||
> 一句话:棋盘怎么生成、怎么保证可推理可清图
|
> 一句话:棋盘怎么生成、怎么保证可推理可清图
|
||||||
> 状态:已定稿;现行为 v1.3
|
> 状态:已定稿(自旧体系迁移);现行为 v1.1
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
| 负责 | 说明 |
|
| 负责 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 四阶段确定性生成管线 | 读参数 → 布雷 → 生成-验证 → 产出上报;顺序冻结,不调换、不跳步(变异布置段已移出管线) |
|
| 四阶段确定性生成管线 | 读参数 → 布雷 → 生成-验证 → 产出上报;顺序冻结,不调换、不跳步(变异布置段 2026-09-20 随棋盘设置顺序拍板移出管线) |
|
||||||
| 棋盘生成参数表 | 全项目第一张按进度键(关卡序号 × 节点深度)回填的配置表;表结构归本系统定 |
|
| 棋盘生成参数表 | 全项目第一张按进度键(关卡序号 × 节点深度)回填的配置表;表结构归本系统定 |
|
||||||
| 可推理率度量与达标判定 | 生成时刻的质量承诺,含计算口径与定义版本号 |
|
| 可推理率度量与达标判定 | 生成时刻的质量承诺,含计算口径与定义版本号 |
|
||||||
| 出生区与反退化保证 | 出生 3×3 无雷、最小安全格数、开局白给板拒绝、清图可达性(变异不落出生区与展开域由布置段顺序保障) |
|
| 出生区与反退化保证 | 出生 3×3 无雷、最小安全格数、开局白给板拒绝、清图可达性(变异不落出生区与展开域由布置段顺序保障) |
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
生成(关卡序号, 节点深度, 种子) → 棋盘 + 生成期指标集
|
生成(关卡序号, 节点深度, 种子) → 棋盘 + 生成期指标集
|
||||||
① 参数解析 ─── 读对应参数行,生成开始时单次读取并快照
|
① 参数解析 ─── 读对应参数行,生成开始时单次读取并快照
|
||||||
▼
|
▼
|
||||||
② 布雷 ─────── 雷数 N = round(雷密度 × (宽×高 − 出生格数))(先定数;出生格数 = 出生区边长²,读表,出生区恒排除)
|
② 布雷 ─────── 雷数 N = round(雷密度 × (宽×高 − 9))(先定数;9 = 出生 3×3 恒排除)
|
||||||
│ 在"全格 − 出生 3×3"范围均匀布雷
|
│ 在"全格 − 出生 3×3"范围均匀布雷
|
||||||
│ 开局免费展开域外扩一圈,圈内的雷移除(只减不增、不重投、无迭代)
|
│ 开局免费展开域外扩一圈,圈内的雷移除(只减不增、不重投、无迭代)
|
||||||
▼
|
▼
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
**结论**:雷数先定数、再落位;零雷板与安全格不足的参数组合在加载期就被拒绝。
|
**结论**:雷数先定数、再落位;零雷板与安全格不足的参数组合在加载期就被拒绝。
|
||||||
|
|
||||||
```
|
```
|
||||||
布雷数 N = round(mine_density × (board_width × board_height − 出生格数)) (出生格数 = 出生区边长²,读表;出生区恒排除)
|
布雷数 N = round(mine_density × (board_width × board_height − 9)) (9 = 出生 3×3 恒排除)
|
||||||
下限校验:N ≥ 1(零雷板加载期拒绝)
|
下限校验:N ≥ 1(零雷板加载期拒绝)
|
||||||
计数可行:board_width × board_height − N ≥ min_safe_count(加载期校验)
|
计数可行:board_width × board_height − N ≥ min_safe_count(加载期校验)
|
||||||
产物断言:实际安全格数 ≥ min_safe_count;实际雷数 ≤ N(先布后删只减不增)
|
产物断言:实际安全格数 ≥ min_safe_count;实际雷数 ≤ N(先布后删只减不增)
|
||||||
@@ -94,11 +94,11 @@
|
|||||||
|
|
||||||
| 反退化规则 | 内容 |
|
| 反退化规则 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 先布后删 | 先把 N 颗雷在"全格 − 出生 3×3"上布完,再把剃雷域内的雷移除——只减不增、不重投、无迭代,必然终止且可复现;实际雷数与 N 的差额随指标观测。**剃雷域**:「出生 3×3 ∪ 外扩 r 环」(切比雪夫距离 ≤1+r,r=shave_ring_radius 现行 1 → 5×5=25 格)——全域剃雷=开局免费展开巨大(10×10 板 R₀ 均值 68.6=板面 68.6%)的根因;现口径下开局免费展开=出生邻域剃雷诱发的自然连锁,均值降至板面约四成(10×10 实测 39.7) |
|
| 先布后删 | 先把 N 颗雷在"全格 − 出生 3×3"上布完,再把剃雷域内的雷移除——只减不增、不重投、无迭代,必然终止且可复现;实际雷数与 N 的差额随指标观测。**剃雷域已收窄(2026-10-05 初始展开收窄批)**:从「开局免费展开(flood)域∪外扩一圈」缩到「出生 3×3 ∪ 外扩 r 环」(切比雪夫距离 ≤1+r,r=shave_ring_radius 现行 1 → 5×5=25 格)——全域剃雷=开局免费展开巨大(10×10 板 R₀ 均值 68.6=板面 68.6%)的根因;收窄后开局免费展开=出生邻域剃雷诱发的自然连锁,均值降至板面约四成(10×10 实测 39.7) |
|
||||||
| 出生区安全 | 出生 3×3 与开局免费展开域内恒无雷;变异不落两域由布置段顺序保障(非本管线义务) |
|
| 出生区安全 | 出生 3×3 与开局免费展开域内恒无雷;变异不落两域由布置段顺序保障(非本管线义务) |
|
||||||
| 开局白给板拒绝 | 开局免费展开域禁止覆盖全部安全格——等于即退化板,尝试弃用重试;运行期另有同义兜底不变式,归[排雷玩法](排雷玩法.md) |
|
| 开局白给板拒绝 | 开局免费展开域禁止覆盖全部安全格——等于即退化板,尝试弃用重试;运行期另有同义兜底不变式,归[排雷玩法](排雷玩法.md) |
|
||||||
| 清图可达性 | 每个安全格都必须能从出生区沿安全格八向连通走到;带孤岛安全格的板判非法,不进降级候选 |
|
| 清图可达性 | 每个安全格都必须能从出生区沿安全格八向连通走到;带孤岛安全格的板判非法,不进降级候选 |
|
||||||
| R₀≤cap 重掷闸 | 每次尝试出板后实测自然 R₀(开局免费展开格数),超过该行 r0_max_cap 即整板作废同流重试——合法性先于质量评分(同白给板先例);全部尝试超阈 → 既有三分出口接受最不坏+非法产物标记诚实降级,玩家永不卡死;闸触发次数随指标集 r0_cap_rejected 观测(占比过高=剃雷半径与闸配比失衡信号) |
|
| R₀≤cap 重掷闸(2026-10-05 初始展开收窄批) | 每次尝试出板后实测自然 R₀(开局免费展开格数),超过该行 r0_max_cap 即整板作废同流重试——合法性先于质量评分(同白给板先例);全部尝试超阈 → 既有三分出口接受最不坏+非法产物标记诚实降级,玩家永不卡死;闸触发次数随指标集 r0_cap_rejected 观测(占比过高=剃雷半径与闸配比失衡信号) |
|
||||||
|
|
||||||
清图可达性与可推理率是两道独立的闸:合法性先查、质量分后算——一张"分高但通不了"的图没有意义。另一条推理前提也由本系统保证:数字恒真,每个非危险格的数字恒等于它的八邻雷数,整局推理都建立在这句话上。
|
清图可达性与可推理率是两道独立的闸:合法性先查、质量分后算——一张"分高但通不了"的图没有意义。另一条推理前提也由本系统保证:数字恒真,每个非危险格的数字恒等于它的八邻雷数,整局推理都建立在这句话上。
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
|
|
||||||
### 图类型标签与第三轴预留:主题恒定、Boss 板有座位
|
### 图类型标签与第三轴预留:主题恒定、Boss 板有座位
|
||||||
|
|
||||||
每张图带一个图类型标签(board_type 字段;图类型即图的主题、题材,玩家侧显示名「地图类型」)。同关卡的所有图,主题静态恒定——不存在逐图重掷主题的接口,"不会上钓鱼的当"是结构保证而非文案。词表现行 v1.1:**dungeon(地牢基线)/ underdark(幽暗地域)/ deep_underdark(灰矮人矿道方向)**,现行值见 board_gen.tres(L1 = dungeon,L2 = underdark,L3 = deep_underdark);域校验 = 词表成员检查(词表归棋盘参数表,扩词随内容批走修订)。这组标签是表现侧换色板与[地图战斗资源](../战斗循环/地图战斗资源.md)图类型差异化插槽的数据源。本节为数据约定,无计算。
|
每张图带一个图类型标签(board_type 字段;图类型即图的主题、题材,玩家侧显示名「地图类型」)。同关卡的所有图,主题静态恒定——不存在逐图重掷主题的接口,"不会上钓鱼的当"是结构保证而非文案。词表现行 v1.1(2026-09-20 第三关内容批增补;v1.0 两词 2026-09-19 定稿):**dungeon(地牢基线)/ underdark(幽暗地域)/ deep_underdark(灰矮人矿道方向)**,现行值见 board_gen.tres(L1 = dungeon,L2 = underdark,L3 = deep_underdark);域校验 = 词表成员检查(词表归棋盘参数表,扩词随内容批走修订)。这组标签是表现侧换色板与[地图战斗资源](../战斗循环/地图战斗资源.md)图类型差异化插槽的数据源。本节为数据约定,无计算。
|
||||||
|
|
||||||
参数表的键是关卡序号 × 节点深度,难度沿这两条轴雕刻;精英与 Boss 修饰是预留的第三条轴。本系统不定任何修饰数值,只锁定落点约定——这也是[关卡节点地图](../冒险循环/关卡节点地图.md)与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)两份文档的输入:
|
参数表的键是关卡序号 × 节点深度,难度沿这两条轴雕刻;精英与 Boss 修饰是预留的第三条轴。本系统不定任何修饰数值,只锁定落点约定——这也是[关卡节点地图](../冒险循环/关卡节点地图.md)与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)两份文档的输入:
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@
|
|||||||
| P1 | 与排雷玩法的展开域回验集成 | 回验两臂登记在对方文档,集成随对方排期 |
|
| P1 | 与排雷玩法的展开域回验集成 | 回验两臂登记在对方文档,集成随对方排期 |
|
||||||
| P2 | 推理域扩展(solver_rules 启用其他规则集或新增信息源) | 改可推理率定义 = 文档修订,MVP 冻结 |
|
| P2 | 推理域扩展(solver_rules 启用其他规则集或新增信息源) | 改可推理率定义 = 文档修订,MVP 冻结 |
|
||||||
| P2 | 生成异步化与成本闸正式值定稿 | 实现期决策,随性能预算批 |
|
| P2 | 生成异步化与成本闸正式值定稿 | 实现期决策,随性能预算批 |
|
||||||
| P2 | ~~变异布置内容接入~~(已完成——布置执行位在战斗初始化第 4 步,管线零布置义务) | — |
|
| P2 | ~~变异布置内容接入~~(已完成——2026-09-20 首批类型定稿批:布置执行位改排战斗初始化第 4 步,管线零布置义务化) | — |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
@@ -209,12 +209,11 @@
|
|||||||
| solver_rules | enum {single, single_subset} | single_subset(冻结,非调参) | 推理规则域 |
|
| solver_rules | enum {single, single_subset} | single_subset(冻结,非调参) | 推理规则域 |
|
||||||
| min_safe_count | int [1, 999] | 现行值见 board_gen.tres | 最小安全格数下限 |
|
| min_safe_count | int [1, 999] | 现行值见 board_gen.tres | 最小安全格数下限 |
|
||||||
| max_gen_attempts | int [1, 32] | 域 [1, 32],现行按行取值见 board_gen.tres | 生成-验证重试上限;受成本闸联合约束 |
|
| max_gen_attempts | int [1, 32] | 域 [1, 32],现行按行取值见 board_gen.tres | 生成-验证重试上限;受成本闸联合约束 |
|
||||||
| board_type | String,词表 {dungeon, underdark, deep_underdark} | 现行值见 board_gen.tres(词表 v1.1) | 图类型标签(玩家侧「地图类型」);域校验 = 词表成员检查 |
|
| board_type | String,词表 {dungeon, underdark, deep_underdark} | 现行值见 board_gen.tres(词表 v1.1,2026-09-20 第三关内容批增补) | 图类型标签(玩家侧「地图类型」);域校验 = 词表成员检查 |
|
||||||
| shave_ring_radius | int [0, 2] | 现行 1(board_gen.tres 全行) | 先布后删剃雷半径:剃雷域=距出生中心切比雪夫距离 ≤1+r 的格(r=1 → 5×5=25 格;r=0 即只剃出生 3×3 本身=无环剃雷)。调参项非结构冻结 |
|
| shave_ring_radius | int [0, 2] | 现行 1(board_gen.tres 全行) | 先布后删剃雷半径:剃雷域=距出生中心切比雪夫距离 ≤1+r 的格(r=1 → 5×5=25 格;r=0 即只剃出生 3×3 本身=无环剃雷)。**2026-10-05 初始展开收窄批新参数**(调参项非结构冻结) |
|
||||||
| r0_max_cap | int [出生格数, 板格数一半](护栏,违例加载期致命;出生格数=出生区边长自乘,读出生区行) | 现行按板形:10×10=45 / 12×12=43 / 13×13=51 / 14×14=59(board_gen.tres) | 自然 R₀(开局免费展开格数)上限闸=合法性门;超阈整板重掷、耗尽走三分出口。板面锚现行值 = 45/43/51/59(10×10 行经用户裁上调——r=1 自然均值 39>30 结构性倒挂;其余行维持 30% 锚) |
|
| r0_max_cap | int [出生格数 9, 板格数一半](护栏,违例加载期致命) | 现行按板形:10×10=45 / 12×12=43 / 13×13=51 / 14×14=59(board_gen.tres) | 自然 R₀(开局免费展开格数)上限闸=合法性门;超阈整板重掷、耗尽走三分出口。板面 30% 锚(30/43/51/59)经 S1 停机呈报用户裁上调:10×10→45(r=1 自然均值 39>30 结构性倒挂;其余行 30% 锚维持)。**2026-10-05 初始展开收窄批新参数** |
|
||||||
| 出生区边长 | int [3, 5],奇数(中心对称,side = 2r+1);现行值读 board_gen.tres 表头 | 表头全局单值(非逐行) | 玩家出生区为以出生中心对称的 side×side 方区,区内恒无雷;布雷域基与 r0_max_cap 护栏下限均由它导出(格数 = side²)。入表后格数零字面量 |
|
|
||||||
|
|
||||||
结构冻结(非调参项):键结构与每关深度 0 锚行、四阶段顺序(变异布置段已移出管线)、solver_rules、可推理率的合法信息源枚举、及格线域下限 0.85、成本闸常数(结构护栏,登记在案,调整走文档修订)、先布后删语义。
|
结构冻结(非调参项):键结构与每关深度 0 锚行、四阶段顺序(变异布置段 2026-09-20 已移出管线)、solver_rules、可推理率的合法信息源枚举、及格线域下限 0.85、成本闸常数(结构护栏,登记在案,调整走文档修订)、先布后删语义。
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
@@ -230,6 +229,6 @@
|
|||||||
- 降级诚实:零合法板照常出图,必带非法产物标记与最高级告警;进程不死锁,玩家界面得到诚实告知。
|
- 降级诚实:零合法板照常出图,必带非法产物标记与最高级告警;进程不死锁,玩家界面得到诚实告知。
|
||||||
- 加载期校验:布雷数下限、计数可行性、标签非空等违例组合加载期致命。
|
- 加载期校验:布雷数下限、计数可行性、标签非空等违例组合加载期致命。
|
||||||
- 黄金图回归:手工核验小板集的可推理率输出与登记整数对逐位相等(整数对比对,禁浮点容差);换生成参数(推理定义、信息源、定义版本号)必须重制向量并入版本库。
|
- 黄金图回归:手工核验小板集的可推理率输出与登记整数对逐位相等(整数对比对,禁浮点容差);换生成参数(推理定义、信息源、定义版本号)必须重制向量并入版本库。
|
||||||
- R₀≤cap 闸:每张出图自然 R₀ ≤ 该行 r0_max_cap(合法板),或带非法产物标记(接受最不坏·诚实降级);闸触发次数入指标集 r0_cap_rejected。
|
- R₀≤cap 闸(2026-10-05 初始展开收窄批):每张出图自然 R₀ ≤ 该行 r0_max_cap(合法板),或带非法产物标记(接受最不坏·诚实降级);闸触发次数入指标集 r0_cap_rejected。
|
||||||
- 剃雷域参数化:剃雷域=出生中心切比雪夫 ≤1+shave_ring_radius 的方域,出图 ring_removed ≤ 域内候选危险格数 (3+2r)²−9。
|
- 剃雷域参数化(同批):剃雷域=出生中心切比雪夫 ≤1+shave_ring_radius 的方域,出图 ring_removed ≤ 域内候选危险格数 (3+2r)²−9;同种子布雷序列与收窄前逐位一致(零 RNG 消费变化)。
|
||||||
- 表实一致:配置表字段与棋盘参数表字段定义一致。
|
- 表实一致:配置表字段与棋盘参数表字段定义一致。
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# 行动经济
|
# 行动经济
|
||||||
|
|
||||||
> 一句话:每轮行动点怎么花、停手与刷新的代价
|
> 一句话:每轮行动点怎么花、停手与刷新的代价
|
||||||
> 状态:已定稿;现行为 v1.7
|
> 状态:已定稿(自旧体系迁移);现行为 v1.2
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -18,9 +18,9 @@
|
|||||||
| 负责 | 说明 |
|
| 负责 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 行动点(当前池) | 全项目唯一扣减入口:余量检查、扣费、结束判定在同一个原子事务里完成,不允许双重折算 |
|
| 行动点(当前池) | 全项目唯一扣减入口:余量检查、扣费、结束判定在同一个原子事务里完成,不允许双重折算 |
|
||||||
| 统一价目 | 挖 / 封印同一价目(表值见 action_economy.tres;移除动作已退役);移动与连锁展开免费(冻结项,不参与调参) |
|
| 统一价目 | 挖 / 封印同一价目(表值见 action_economy.tres;移除动作已随封印不可逆批 2026-09-19 退役);移动与连锁展开免费(冻结项,不参与调参) |
|
||||||
| 轮次结束仲裁 | 清图、停手、耗尽三种结束方式同时成立时,按固定优先级只裁出一个赢家 |
|
| 轮次结束仲裁 | 清图、停手、耗尽三种结束方式同时成立时,按固定优先级只裁出一个赢家 |
|
||||||
| 储备行动点池 | 停手转入、刷新支出、整局冒险保留(详见核心规则) |
|
| 储备行动点池 | 停手转入、刷新支出、战斗结束清零(详见核心规则) |
|
||||||
| 对下游的经济契约 | 五条契约约束收益兑现侧,由战斗结算负责对账验收 |
|
| 对下游的经济契约 | 五条契约约束收益兑现侧,由战斗结算负责对账验收 |
|
||||||
|
|
||||||
不负责:
|
不负责:
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
| 动作 | 花费 | 说明 |
|
| 动作 | 花费 | 说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 挖开格 | 标准价(见 action_economy.tres) | 只能挖小人 8 向相邻的格子;若触发连锁展开(flood fill 式整片翻开),连锁翻开的部分免费,且计入清图进度 |
|
| 挖开格 | 标准价(见 action_economy.tres) | 只能挖小人 8 向相邻的格子;若触发连锁展开(flood fill 式整片翻开),连锁翻开的部分免费,且计入清图进度 |
|
||||||
| 封印 | 标准价(见 action_economy.tres) | 同样限相邻格。封印印记只是棋盘上的标记,不是背包里的实物,想用多少有多少——它的稀缺性完全由"要花一次标准价行动点"承载。封印印记是一次性承诺:落子就没有移除动作;封印受理即揭示、封印格拒绝挖掘(口径见[排雷玩法](排雷玩法.md))——封错的代价 = 轮末标空负向兑付,纠错路径不存在 |
|
| 封印 | 标准价(见 action_economy.tres) | 同样限相邻格。封印印记只是棋盘上的标记,不是背包里的实物,想用多少有多少——它的稀缺性完全由"要花一次标准价行动点"承载。封印印记是一次性承诺(封印不可逆批 2026-09-19):落子就没有移除动作,纠错 = 直接挖开该格 |
|
||||||
|
|
||||||
不花钱的有两件事:移动小人(点已翻开的格子走过去,仅限已探明区域)和连锁展开。这两项免费是冻结设计,服务"边缘探索不心疼"的氛围,不是经济杠杆。
|
不花钱的有两件事:移动小人(点已翻开的格子走过去,仅限已探明区域)和连锁展开。这两项免费是冻结设计,服务"边缘探索不心疼"的氛围,不是经济杠杆。
|
||||||
|
|
||||||
@@ -79,9 +79,9 @@
|
|||||||
|
|
||||||
### 停手与储备行动点
|
### 停手与储备行动点
|
||||||
|
|
||||||
停手是玩家在挖掘期任意时刻的主动决定:立即结束本轮,剩余行动点按 1:1 原值存入储备池——基线没有乘数、没有加成。图没开完,下一轮接着在同一张图上挖。停手不是收入来源,而是纯粹的风险管理工具:它买到的是"退出权",不是战斗收益。停手意图经排雷玩法的批次提交入口进入账本(保证单一结算序),由账本仲裁后自行外发轮次结束消息。**转存率参数化**:转存率实现为停手收轮时的转存率参数——缺省 100=1:1;秘宝「储备罐」注入 125=1.25:1(整数除法向下取整——每 4 点剩余 AP 多转 1 点 RAP,零头顺延向下)。转存率归秘宝操作包络参数,本账本的仲裁与发射结构不变。
|
停手是玩家在挖掘期任意时刻的主动决定:立即结束本轮,剩余行动点按 1:1 原值存入储备池——基线没有乘数、没有加成。图没开完,下一轮接着在同一张图上挖。停手不是收入来源,而是纯粹的风险管理工具:它买到的是"退出权",不是战斗收益。停手意图经排雷玩法的批次提交入口进入账本(保证单一结算序),由账本仲裁后自行外发轮次结束消息。**转存率参数化(迭代 22 秘宝批反哺写入,2026-10-12)**:转存率实现为停手收轮时的转存率参数——缺省 100=1:1 与旧口径逐位一致;秘宝「储备罐」注入 125=1.25:1(整数除法向下取整——每 4 点剩余 AP 多转 1 点 RAP,零头顺延向下);无装配时行为与参数化前逐位相同。转存率归秘宝操作包络参数,本账本的仲裁与发射结构不变。
|
||||||
|
|
||||||
储备池的生命周期以一整局冒险为界:整局内跨轮次、跨雷图、跨战斗一直累积;只有弃图刷新会消耗它,冒险收束时清零。清零必须在界面上可见,防止玩家觉得"攒的钱凭空没了"。MVP 阶段储备池没有上限。
|
储备池的生命周期以一场战斗为界:战斗内跨轮次、跨雷图一直累积;战斗结束立刻清零。清零必须在界面上可见,防止玩家觉得"攒的钱凭空没了"。MVP 阶段储备池没有上限。
|
||||||
|
|
||||||
### 挖掘期刷新:花储备换新图
|
### 挖掘期刷新:花储备换新图
|
||||||
|
|
||||||
@@ -89,30 +89,30 @@
|
|||||||
|
|
||||||
每轮最多刷新次数=表值 refresh_cap_per_round(现行 2)(轮内计数,开轮重置),没有冷却,每次独立检查门槛并扣费。已用次数与剩余次数为只读观测量(切片实现在战斗编排器侧计数,HUD 刷新按钮「剩 N 次」文案即其消费方)——客户端可现读,不经可变状态外泄。禁止"攒满就自动刷"——刷新永远是玩家的决定。
|
每轮最多刷新次数=表值 refresh_cap_per_round(现行 2)(轮内计数,开轮重置),没有冷却,每次独立检查门槛并扣费。已用次数与剩余次数为只读观测量(切片实现在战斗编排器侧计数,HUD 刷新按钮「剩 N 次」文案即其消费方)——客户端可现读,不经可变状态外泄。禁止"攒满就自动刷"——刷新永远是玩家的决定。
|
||||||
|
|
||||||
停手与刷新合起来构成这本账的基线节拍:刷新门槛按每轮预算的一半设定,半轮停手够刷一次,满预算停手够刷两次(每轮刷新上限同为 2)。行动点修正队列会扰动该节拍的实际兑现(+1 轮可多挖一格),不变式本身不动;对账归曲线调参批。
|
停手与刷新合起来构成这本账的基线节拍:满行动点一轮停手,正好攒够一次刷新。行动点修正队列会扰动该节拍的实际兑现(+1 轮可多挖一格),不变式本身不动;对账归曲线调参批。
|
||||||
|
|
||||||
### 换图系专长对储备与刷新的改写(已实装,落表 `feats.tres`)
|
### 换图系专长对储备与刷新的改写(设计定稿,待实现)
|
||||||
|
|
||||||
换图系两件基座分别改写 RAP 的来源与刷新价格。它们只给持有专长的玩家增加规则,不改变无专长时的基线账本。
|
换图系两件基座分别改写 RAP 的来源与刷新价格。它们只给持有专长的玩家增加规则,不改变无专长时的基线账本。
|
||||||
|
|
||||||
| 专长 | 规则 | 不变边界 |
|
| 专长 | 规则 | 不变边界 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 矿脉储能 | 每次付费挖格被受理后,额外获得表值 RAP;安全格与危险格同口径 | 连锁展开只随首格的一次付费动作结算,不逐格追加;封印、移动、刷新不产 RAP |
|
| 掘进储能 | 每次付费挖格被受理后,额外获得表值 RAP;安全格与危险格同口径 | 连锁展开只随首格的一次付费动作结算,不逐格追加;封印、移动、刷新不产 RAP |
|
||||||
| 省力周转 | 弃图刷新的 RAP 成本为基线的 50% | 只改价格;AP、轮次、每轮刷新上限与换图流程不变 |
|
| 折价换图 | 弃图刷新的 RAP 成本为基线的 50% | 只改价格;AP、轮次、每轮刷新上限与换图流程不变 |
|
||||||
|
|
||||||
两件基座可以同时持有并叠加:付费挖格照常产 RAP,刷新同时按半价扣费。两条规则作用在不同账户入口,不互相覆盖,也不设互斥。折后价向下取整,受理门槛判断与实际扣费使用同一个折后值,只改价格不改拒绝判据——刷新仍须储备达到折后门槛才受理;储备不足或超过每轮次数上限时拒绝,状态不变。RAP 整局冒险保留、冒险收束才清零,刷新本身不返 RAP。
|
两件基座可以同时持有并叠加:付费挖格照常产 RAP,刷新同时按半价扣费。两条规则作用在不同账户入口,不互相覆盖,也不设互斥。刷新仍须储备达到折后门槛才受理;储备不足或超过每轮次数上限时拒绝,状态不变。RAP 仍在战斗结束清零,刷新本身不返 RAP。
|
||||||
|
|
||||||
无矿脉储能时,挖格不新增 RAP;无省力周转时,刷新成本仍读全局基值。后续输出、生存与资源专长如何使用成功刷新这个事实,归[战斗结算](../战斗循环/战斗结算.md)。
|
无掘进储能时,挖格不新增 RAP;无折价换图时,刷新成本仍读全局基值。后续输出、生存与资源专长如何使用成功刷新这个事实,归[战斗结算](../战斗循环/战斗结算.md)。
|
||||||
|
|
||||||
### 下轮行动点修正
|
### 下轮行动点修正(格面资源八型批 2026-09-20)
|
||||||
|
|
||||||
action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_drain(迟滞)= 下轮行动点 −1。修正不在授予当轮生效:结算期经行动经济的行动点修正队列登记(同轮多笔按净值累加),下一轮开始时(开轮通知)一次性兑现——兑现值 = 基线 ap_per_round + 排队净值,下限 0,兑现后队列清零;排队净值不跨轮保留。明细在结算流水记效果行(effect_id=ap_delta)。
|
格面资源八型批(2026-09-20)新增 action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_drain(迟滞)= 下轮行动点 −1。修正不在授予当轮生效:结算期经行动经济的行动点修正队列登记(同轮多笔按净值累加),下一轮开始时(开轮通知)一次性兑现——兑现值 = 基线 ap_per_round + 排队净值,下限 0,兑现后队列清零;排队净值不跨轮保留。明细在结算流水记效果行(effect_id=ap_delta)。
|
||||||
|
|
||||||
跨轮携带量口径随之改写:RAP 仍是唯一显式携带的系统资源(停手转存、玩家可见可花),行动点修正队列是第二携带量——一次性、自动清零、不可主动消费。
|
跨轮携带量口径随之改写:RAP 仍是唯一显式携带的系统资源(停手转存、玩家可见可花),行动点修正队列是第二携带量——一次性、自动清零、不可主动消费。
|
||||||
|
|
||||||
### 跨冒险行动点加成轴
|
### 跨冒险行动点加成轴(迭代 10 奖励重构批)
|
||||||
|
|
||||||
统一冒险加算区(归[冒险结构](../冒险循环/冒险结构.md))的第四轴「行动点」:三选一 AP 件兑付后,加算区行动点轴累加(值读冒险表 bonus_ap_flat,全冒险获取至多 bonus_cap_ap 次)。加成经战斗开始入参的覆盖值通道传入战斗域(与生命/攻防上参同族),行动点侧兑现口径:
|
统一冒险加算区(归[冒险结构](../冒险循环/冒险结构.md))自迭代 10 起扩第四轴「行动点」:三选一 AP 件兑付后,加算区行动点轴累加(值读冒险表 bonus_ap_flat,全冒险获取至多 bonus_cap_ap 次)。加成经战斗开始入参的覆盖值通道传入战斗域(与生命/攻防上参同族),行动点侧兑现口径:
|
||||||
|
|
||||||
```
|
```
|
||||||
开轮(第 1 轮)行动点 = max(0, ap_per_round + 加成轴值 + 当轮排队净值)
|
开轮(第 1 轮)行动点 = max(0, ap_per_round + 加成轴值 + 当轮排队净值)
|
||||||
@@ -129,7 +129,7 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 一次性 | 每颗雷在一场战斗内至多兑付一次,资格随首次兑付消费 |
|
| 一次性 | 每颗雷在一场战斗内至多兑付一次,资格随首次兑付消费 |
|
||||||
| 当轮结算 | 封印印记只是当轮兑付的载体,不囤积到以后 |
|
| 当轮结算 | 封印印记只是当轮兑付的载体,不囤积到以后 |
|
||||||
| 资格认危险格实例 | 挖开重封同一格(封印印记随挖掘消失),不恢复已消费的资格——堵死"重复计费重封刷收益"的农场(注:移除动作已退役) |
|
| 资格认危险格实例 | 挖开重封同一格(封印印记随挖掘消失),不恢复已消费的资格——堵死"重复计费重封刷收益"的农场(注:移除动作已退役,封印不可逆批 2026-09-19) |
|
||||||
| 不逐轮重复 | 同一颗雷的收益不会每轮反复发 |
|
| 不逐轮重复 | 同一颗雷的收益不会每轮反复发 |
|
||||||
| 换图重置 | 新图的雷是新实例,资格自然重来 |
|
| 换图重置 | 新图的雷是新实例,资格自然重来 |
|
||||||
|
|
||||||
@@ -141,58 +141,23 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
|
|
||||||
1. **单一当量**:所有收益来源用同一张效果对照表归一换算,不允许分源改率。
|
1. **单一当量**:所有收益来源用同一张效果对照表归一换算,不允许分源改率。
|
||||||
2. **封印标中锚**:封印标中的减益档位必须严格高于最低档安全格增益——否则没人愿意封印。
|
2. **封印标中锚**:封印标中的减益档位必须严格高于最低档安全格增益——否则没人愿意封印。
|
||||||
3. **挖掘风险不等式**(详细推导见下方推导节):聚合健康式 + 封印溢价条件二 + β 比值带判读,三层口径并行立(2026-10-04 用户裁 P2)。
|
3. **挖掘风险不等式**(2026-10-05 判式换代批重立——迭代14②号卡;原"敌方伏击暴露不等式"2026-09-20 随伏击机制退役作废,惩罚当量对账模型由本条重立承接,详细推导见下方推导节):聚合健康式 + 封印溢价条件二 + β 比值带判读,三层口径并行立(2026-10-04 用户裁 P2)。
|
||||||
4. **清图奖励大于零**,并预留按图类型差异化分支的结构位。
|
4. **清图奖励大于零**,并预留按图类型差异化分支的结构位。
|
||||||
5. **清图不需要跟弃图比收益**:清图奖励恒正,弃图要停手空转一轮、换来的新图还不发清图奖励,它只是推理死路的退路(两条路的推导见下图)。
|
5. **清图支配性**:推到底清图的期望收益,不低于"确定格挖完就弃图刷新"的期望收益——否则清图玩法会被刷新策略淘汰。
|
||||||
|
|
||||||
**两条路怎么走**
|
**结论**:五条契约由战斗结算作为唯一对账责任方闭合验收;概率侧由棋盘生成的可推理率参数锚定;条款3 数值层由 β 比值带 [1.2, 2.5] 判读看护(清图支配性审计为常设重跑项),封印边际结构层由条件二封印溢价接替(机制载体 settlement.flag_hit_premium)。
|
||||||
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 386" width="680" height="386" role="img" aria-labelledby="clear-t clear-d">
|
|
||||||
<title id="clear-t">确定格推完后的两条路与清图结论</title>
|
|
||||||
<desc id="clear-d">确定能推的格推完后,弃图刷新要停手空转一轮、换来的新图不发清图奖励;赌一格两种结果最终都能推到清图。清图奖励恒正、不空转,所以弃图只是推理死路的退路。</desc>
|
|
||||||
<defs><marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
|
|
||||||
<rect x="250" y="40" width="180" height="44" rx="8" fill="#0C447C" stroke="#85B7EB" stroke-width="0.5"/>
|
|
||||||
<text x="340" y="62" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="14" font-weight="500" fill="#E6F1FB">确定能推的格推完</text>
|
|
||||||
<path d="M340 84 L340 104 L170 104 L170 130" fill="none" stroke="#888780" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
||||||
<path d="M340 84 L340 104 L510 104 L510 130" fill="none" stroke="#888780" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
||||||
<rect x="40" y="130" width="260" height="56" rx="8" fill="#633806" stroke="#EF9F27" stroke-width="0.5"/>
|
|
||||||
<text x="170" y="148" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="14" font-weight="500" fill="#FAEEDA">停手攒储备点</text>
|
|
||||||
<text x="170" y="168" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="12" fill="#FAC775">结束本轮,空转一轮</text>
|
|
||||||
<rect x="40" y="214" width="260" height="56" rx="8" fill="#633806" stroke="#EF9F27" stroke-width="0.5"/>
|
|
||||||
<text x="170" y="232" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="14" font-weight="500" fill="#FAEEDA">换新图</text>
|
|
||||||
<text x="170" y="252" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="12" fill="#FAC775">同轮清图不发清图奖励</text>
|
|
||||||
<path d="M170 186 L170 214" fill="none" stroke="#888780" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
||||||
<rect x="380" y="130" width="260" height="44" rx="8" fill="#0C447C" stroke="#85B7EB" stroke-width="0.5"/>
|
|
||||||
<text x="510" y="152" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="14" font-weight="500" fill="#E6F1FB">赌一格</text>
|
|
||||||
<rect x="380" y="214" width="125" height="56" rx="8" fill="#0C447C" stroke="#85B7EB" stroke-width="0.5"/>
|
|
||||||
<text x="442" y="232" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="13" font-weight="500" fill="#E6F1FB">赌中安全格</text>
|
|
||||||
<text x="442" y="252" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="12" fill="#B5D4F4">正向+清图奖励</text>
|
|
||||||
<rect x="515" y="214" width="125" height="56" rx="8" fill="#0C447C" stroke="#85B7EB" stroke-width="0.5"/>
|
|
||||||
<text x="578" y="232" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="13" font-weight="500" fill="#E6F1FB">赌中危险格</text>
|
|
||||||
<text x="578" y="252" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="12" fill="#B5D4F4">雷罚,下轮接着推</text>
|
|
||||||
<path d="M510 174 L510 194 L442 194 L442 214" fill="none" stroke="#888780" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
||||||
<path d="M510 174 L510 194 L578 194 L578 214" fill="none" stroke="#888780" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
||||||
<path d="M170 270 L170 290 L340 290 L340 310" fill="none" stroke="#888780" stroke-width="1.5" marker-end="url(#arrow)"/>
|
|
||||||
<path d="M442 270 L442 290 L340 290" fill="none" stroke="#888780" stroke-width="1.5"/>
|
|
||||||
<path d="M578 270 L578 290 L340 290" fill="none" stroke="#888780" stroke-width="1.5"/>
|
|
||||||
<rect x="110" y="310" width="460" height="56" rx="8" fill="#0C447C" stroke="#85B7EB" stroke-width="0.5"/>
|
|
||||||
<text x="340" y="328" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="14" font-weight="500" fill="#E6F1FB">清图:不空转、不多挨打、奖励恒正</text>
|
|
||||||
<text x="340" y="348" text-anchor="middle" dominant-baseline="central" font-family="sans-serif" font-size="12" fill="#B5D4F4">弃图刷新=推理死路的退路,不是更划算的打法</text>
|
|
||||||
</svg>
|
|
||||||
|
|
||||||
**结论**:前四条契约由战斗结算作为唯一对账责任方闭合验收;第五条是行为说明,不设对账读数。概率侧由棋盘生成的可推理率参数锚定;条款3 数值层由 β 比值带 [1.2, 2.5] 判读看护(清图支配性审计为常设重跑项),封印边际结构层由条件二封印溢价接替(机制载体 settlement.flag_hit_premium)。
|
|
||||||
|
|
||||||
推导:
|
推导:
|
||||||
|
|
||||||
```
|
```
|
||||||
条款 3(三层口径并行立,2026-10-04 用户裁 P2;
|
条款 3(2026-10-05 判式换代批重立——三层口径并行立,2026-10-04 用户裁 P2;
|
||||||
现行判式口径=本文条款③)
|
设计权威 = 方案报告 §四/§九(已退役;现行判式口径=本文条款③))
|
||||||
|
|
||||||
条款 2(封印标中锚,既有不动):封印标中的减益档位必须严格高于最低档安全格增益。
|
条款 2(封印标中锚,既有不动):封印标中的减益档位必须严格高于最低档安全格增益。
|
||||||
|
|
||||||
条款 3(聚合健康式)——盲挖净期望非负:
|
条款 3(聚合健康式,接替旧界形式)——盲挖净期望非负:
|
||||||
(1−ρ̂)·E_dig(u) − ρ̂·V_mine(u) ≥ 0 对全部参考板形 × u ∈ {1,2,3}
|
(1−ρ̂)·E_dig(u) − ρ̂·V_mine(u) ≥ 0 对全部参考板形 × u ∈ {1,2,3}
|
||||||
下限 0 = 盲挖不为负;上限不设(2026-10-04 grill Q3 裁)——
|
下限 0 = 盲挖不为负;上限不设(旧 U_band 删,2026-10-04 grill Q3 裁)——
|
||||||
收益端通胀防护由 β 比值带的 β_hi 独家承载(同一约束单一承载)。
|
收益端通胀防护由 β 比值带的 β_hi 独家承载(同一约束单一承载)。
|
||||||
|
|
||||||
封印边际引理(同池结构定理):危险格与安全格同池 + 极性矩阵同字典 ⇒ 封印标中兑付分布 ≡ 安全格
|
封印边际引理(同池结构定理):危险格与安全格同池 + 极性矩阵同字典 ⇒ 封印标中兑付分布 ≡ 安全格
|
||||||
@@ -207,19 +172,24 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
(a) 兑付溢价——标中兑付按同型正向 ×(1+δ)(改战斗结算兑付公式一处,机制载体
|
(a) 兑付溢价——标中兑付按同型正向 ×(1+δ)(改战斗结算兑付公式一处,机制载体
|
||||||
settlement.tres flag_hit_premium = 125,percent 域);(b) 专属池重摇不启
|
settlement.tres flag_hit_premium = 125,percent 域);(b) 专属池重摇不启
|
||||||
(危险格与安全格同池结构冻结不动,留给异池后备案一并裁)。
|
(危险格与安全格同池结构冻结不动,留给异池后备案一并裁)。
|
||||||
|
登记态(写入文档时点):δ 落地前现行值已知破(E[标中] = E_dig < 1.25·E_dig 恒假)——
|
||||||
|
按「登记已知破·限期闭合」纪律写入文档,本批 T4 机制小批闭合;δ=1.25 时条件二以
|
||||||
|
等号压线成立(严格大于须 δ>0.25,×1.5 档留后手)。
|
||||||
|
|
||||||
β 比值带(数值层看护,2026-10-04 用户裁 P4):
|
β 比值带(数值层看护,2026-10-04 用户裁 P4):
|
||||||
β(u) = V_mine(u) ÷ E_dig(u) ∈ [1.2, 2.5]
|
β(u) = V_mine(u) ÷ E_dig(u) ∈ [1.2, 2.5]
|
||||||
β_lo = 风险端定价下限(封印的避险价值为真);β_hi < (1−ρ̂)÷ρ̂ 蕴含条款3 恒成立。
|
β_lo = 风险端定价下限(封印的避险价值为真);β_hi < (1−ρ̂)÷ρ̂ 蕴含条款3 恒成立。
|
||||||
现行读数 β = 1.71 / 1.37 / 1.17(u=1/2/3,名义 ρ)——u=1/2 带内,u=3(1.17)
|
现行读数 β = 1.71 / 1.37 / 1.17(u=1/2/3,名义 ρ)——u=1/2 带内,u=3(1.17)
|
||||||
微破下限,不强制回滚。直伤雷行值/ρ 每次提案逐档检算落带。
|
微破下限 = 登记态点名,不强制回滚。直伤雷行值/ρ 每次提案逐档检算落带
|
||||||
|
(2026-10-04 grill Q3 裁:删「≤15pp·S 形」装饰条款)。
|
||||||
|
|
||||||
η 读数(行为面,非判式——2026-10-04 用户裁 P1 乙降格读数):
|
η 读数(行为面,非判式——2026-10-04 用户裁 P1 乙降格读数):
|
||||||
η = flag_hit ÷ flag_placed(分母 = 全部封印数,2026-10-04 grill Q5 裁),
|
η = flag_hit ÷ flag_placed(分母 = 全部封印数,2026-10-04 grill Q5 裁),
|
||||||
标空率 = flag_miss ÷ flag_placed 次读数分列。字段随结算摘要五字段承载
|
标空率 = flag_miss ÷ flag_placed 次读数分列。字段随结算摘要五字段承载
|
||||||
(flag_placed/flag_hit/flag_miss/标中兑付合计/标空惩罚合计——结算流水聚合)。
|
(flag_placed/flag_hit/flag_miss/标中兑付合计/标空惩罚合计——结算流水聚合)。
|
||||||
|
|
||||||
条款 5 见上方行为说明:不设收益比较式,也不进本推导块。
|
条款 5(清图支配性,不动):
|
||||||
|
清图奖励当量 ≥ 弃图节省的期望雷险当量 + 轮数差 × 敌方结算强度当量
|
||||||
```
|
```
|
||||||
|
|
||||||
| 变量 | 含义 | 锚定来源 |
|
| 变量 | 含义 | 锚定来源 |
|
||||||
@@ -244,7 +214,7 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 轮末两字段消息的接收方;回发换图指令与战斗结束信号;五条经济契约的对账责任方 |
|
| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 轮末两字段消息的接收方;回发换图指令与战斗结束信号;五条经济契约的对账责任方 |
|
||||||
| 下游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 清图奖励内容与图类型差异化插槽的归口 |
|
| 下游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 清图奖励内容与图类型差异化插槽的归口 |
|
||||||
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 行动点与储备池常显;刷新入口;清零反馈;动作被拒原因的双源呈现(棋盘非法 vs 资源不足) |
|
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 行动点与储备池常显;刷新入口;清零反馈;动作被拒原因的双源呈现(棋盘非法 vs 资源不足) |
|
||||||
| 下游 | [教学引导](../表现与支撑/教学引导.md) | 价目与"储备池整局冒险保留、冒险收束清零"的教学口径来源 |
|
| 下游 | [教学引导](../表现与支撑/教学引导.md) | 价目与"储备池战斗结束清零"的教学口径来源 |
|
||||||
|
|
||||||
行动点对外是一组封闭的布尔入口(开轮 / 挖 / 封印 / 停手 / 刷新 / 结算完成通知 / 战斗结束通知):受理返回真、拒绝返回假且状态不变。相位非法的拒绝附带调试诊断,但不致命中止——进程致命只留给数据配置通道。
|
行动点对外是一组封闭的布尔入口(开轮 / 挖 / 封印 / 停手 / 刷新 / 结算完成通知 / 战斗结束通知):受理返回真、拒绝返回假且状态不变。相位非法的拒绝附带调试诊断,但不致命中止——进程致命只留给数据配置通道。
|
||||||
|
|
||||||
@@ -255,14 +225,15 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
3. 玩家可随时停手(剩余行动点 1:1 入库),或储备够门槛时刷新换图(每轮次数上限读 `data/tables/action_economy.tres`)。
|
3. 玩家可随时停手(剩余行动点 1:1 入库),或储备够门槛时刷新换图(每轮次数上限读 `data/tables/action_economy.tres`)。
|
||||||
4. 结束路径在行动点事务内仲裁,只裁一个赢家。
|
4. 结束路径在行动点事务内仲裁,只裁一个赢家。
|
||||||
5. 轮末两字段消息发给战斗结算,后者把收益逐行兑现进结算明细。
|
5. 轮末两字段消息发给战斗结算,后者把收益逐行兑现进结算明细。
|
||||||
6. 战斗结束信号到达:储备池原样保留,行动点休眠,等下一场战斗的开轮通知;冒险收束信号到达才清零。
|
6. 战斗结束信号到达:储备池清零,行动点休眠,等下一场战斗的开轮通知。
|
||||||
|
|
||||||
## P1 / P2 后置
|
## P1 / P2 后置
|
||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| P1 | 储备池跨战斗携带开关 | 现行每场战斗清零(防滚雪球);是否解禁连刷策略,等实测数据说话 |
|
||||||
| P1 | 清图奖励按图类型差异化 | 结构位已预留,内容归地图战斗资源的表设计 |
|
| P1 | 清图奖励按图类型差异化 | 结构位已预留,内容归地图战斗资源的表设计 |
|
||||||
| P2 | 地形成本修饰(不同格子不同价) | MVP 价目均匀是有意简化;钩子已预留,待地形变异首批类型定稿。**注记**:地形变异首批已定稿且 Boss 图整图型(贫矿脉)已落地——资源面偏斜走摇号权重投影、零行动点计费接触,本钩子(按格 AP 差价)**留位不启用**,启用条件仍=未来出现真正按格差异化成本的地形型(随类型扩展重议) |
|
| P2 | 地形成本修饰(不同格子不同价) | MVP 价目均匀是有意简化;钩子已预留,待地形变异首批类型定稿。**2026-10-04 注记(全局作用域变异首发批)**:地形变异首批已定稿且 Boss 图整图型(贫矿脉)已落地——资源面偏斜走摇号权重投影、零行动点计费接触,本钩子(案D 规则改写向的按格 AP 差价)**留位不启用**,启用条件仍=未来出现真正按格差异化成本的地形型(随类型扩展重议) |
|
||||||
| P2 | 行动点耗尽的教学提示 | 规则已定"0 点即收轮";若新手困惑,加提示不改规则,归教学引导 |
|
| P2 | 行动点耗尽的教学提示 | 规则已定"0 点即收轮";若新手困惑,加提示不改规则,归教学引导 |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
@@ -274,15 +245,15 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
| ap_per_round | int [1, 32] | 表值 | 每轮行动点;兼作停手转存的规模旋钮 |
|
| ap_per_round | int [1, 32] | 表值 | 每轮行动点;兼作停手转存的规模旋钮 |
|
||||||
| dig_ap_cost | int [1, 8] | 表值 | 挖单格成本(下限 1:为 0 则预算系统失效) |
|
| dig_ap_cost | int [1, 8] | 表值 | 挖单格成本(下限 1:为 0 则预算系统失效) |
|
||||||
| flag_place_ap_cost | int [0, 8] | 表值 | 封印成本 |
|
| flag_place_ap_cost | int [0, 8] | 表值 | 封印成本 |
|
||||||
| rap_refresh_cost | int [1, 64] | 表值 | 刷新门槛;按每轮预算的一半设定,半轮停手够刷一次、满预算停手够刷两次(受每轮刷新上限约束) |
|
| rap_refresh_cost | int [1, 64] | 表值 | 刷新门槛;默认等于每轮预算,构成"满预算停手 = 恰好一刷"的基线节拍 |
|
||||||
| move_ap_cost | int | 表值(冻结 0) | 移动免费——冻结,非调参项 |
|
| move_ap_cost | int | 表值(冻结 0) | 移动免费——冻结,非调参项 |
|
||||||
| chain_ap_cost | int | 表值(冻结 0) | 连锁免费——冻结,非调参项 |
|
| chain_ap_cost | int | 表值(冻结 0) | 连锁免费——冻结,非调参项 |
|
||||||
| refresh_cap_per_round | int | 表值(provisional,结构位预留) | 每轮刷新上限,开轮重置计数 |
|
| refresh_cap_per_round | int | 表值(provisional,结构位预留) | 每轮刷新上限,开轮重置计数 |
|
||||||
| (跨表)矿脉储能产 RAP | int [1, 64] | 表值(已入 `feats.tres`,provisional 归调参批) | 每次受理的付费挖格兑付一次;连锁不逐格追加 |
|
| (跨表)掘进储能产 RAP | int [1, 64] | 设计定稿,待入 `feats.tres` | 每次受理的付费挖格兑付一次;连锁不逐格追加 |
|
||||||
| (跨表)省力周转成本率 | percent | 表值 50%(已入 `feats.tres`) | 只改持有者的刷新价格;双基座叠加时不覆盖矿脉储能 |
|
| (跨表)折价换图成本率 | percent | 50%(结构已裁,待入 `feats.tres`) | 只改持有者的刷新价格;双基座叠加时不覆盖掘进储能 |
|
||||||
| (跨表)跨冒险行动点加成 | int [0,10] / int [0,99],冒险表 | adventure_table bonus_ap_flat / bonus_cap_ap(provisional) | 三选一 AP 件兑现值与全冒险次数上限;加成轴语义见「跨冒险行动点加成轴」节 |
|
| (跨表)跨冒险行动点加成 | int [0,10] / int [0,99],冒险表 | adventure_table bonus_ap_flat / bonus_cap_ap(provisional) | 三选一 AP 件兑现值与全冒险次数上限;加成轴语义见「跨冒险行动点加成轴」节 |
|
||||||
|
|
||||||
字段名注记:表字段与本文行名统一为 `refresh_cap_per_round`,刷新入口命名与表字段口径对齐(切片临时名零残留)。
|
字段名注记:2026-09-18 措辞完成批已全链对齐正式名——表字段与本文行名统一为 `refresh_cap_per_round`,刷新入口命名与表字段口径对齐(命名统一登记兑现,切片临时名零残留)。
|
||||||
|
|
||||||
跨字段校验:任一动作成本禁止超过每轮预算,违反即加载期致命(fail-fast)。各域上界(8 / 64)是 MVP 量级护栏而非推导界,随调参需要修订。
|
跨字段校验:任一动作成本禁止超过每轮预算,违反即加载期致命(fail-fast)。各域上界(8 / 64)是 MVP 量级护栏而非推导界,随调参需要修订。
|
||||||
|
|
||||||
@@ -293,10 +264,10 @@ action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_dra
|
|||||||
- 耗尽即收轮:行动点扣到 0 的瞬间轮次结束,此后一切动作请求被拒绝且状态不变。
|
- 耗尽即收轮:行动点扣到 0 的瞬间轮次结束,此后一切动作请求被拒绝且状态不变。
|
||||||
- 仲裁唯一:最后 1 点行动点挖开最后一个安全格时,判清图(剩余清零 + 换图 + 清图奖励),不判耗尽;输出恰一条。
|
- 仲裁唯一:最后 1 点行动点挖开最后一个安全格时,判清图(剩余清零 + 换图 + 清图奖励),不判耗尽;输出恰一条。
|
||||||
- 停手 1:1:剩余 3 点停手,储备池加 3,下轮同图继续。
|
- 停手 1:1:剩余 3 点停手,储备池加 3,下轮同图继续。
|
||||||
- 刷新规则:储备不足时刷新被拒绝且状态不变;同一轮第 3 次刷新被拒绝;刷新不重置行动点、不发清图奖励、旧图上的封印印记失效;储备点整局冒险保留,战斗结束不清零。
|
- 刷新规则:储备不足时刷新被拒绝且状态不变;同一轮第 3 次刷新被拒绝;刷新不重置行动点、不发清图奖励、旧图上的封印印记失效。
|
||||||
- 矿脉储能:持有专长时,每次受理的付费挖格额外产一次 RAP,安全格与危险格同口径,连锁展开不逐格追加;无专长时挖格不新增 RAP。
|
- 掘进储能:持有专长时,每次受理的付费挖格额外产一次 RAP,安全格与危险格同口径,连锁展开不逐格追加;无专长时挖格不新增 RAP。
|
||||||
- 省力周转与双基座:持有省力周转时按基线的 50% 扣费;与矿脉储能同时持有则两条规则都生效,刷新仍受储备门槛与每轮次数上限约束。
|
- 折价换图与双基座:持有折价换图时按基线的 50% 扣费;与掘进储能同时持有则两条规则都生效,刷新仍受储备门槛与每轮次数上限约束。
|
||||||
- 储备清零:战斗结束储备池原样保留;冒险收束信号到达后归 0,且界面可见。
|
- 储备清零:战斗结束信号到达后储备池归 0,行动点进入休眠。
|
||||||
- 跨字段校验:任一动作成本配置超过每轮预算时,加载期致命中止。
|
- 跨字段校验:任一动作成本配置超过每轮预算时,加载期致命中止。
|
||||||
- 零随机:同一动作序列驱动两个独立行动点实例,轮次结束记录与储备轨迹逐项相同。
|
- 零随机:同一动作序列驱动两个独立行动点实例,轮次结束记录与储备轨迹逐项相同。
|
||||||
- 表实一致:配置表字段与行动经济表字段定义逐字段一致。
|
- 表实一致:配置表字段与行动经济表字段定义逐字段一致。
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# HUD框架
|
# HUD框架
|
||||||
|
|
||||||
> 一句话:界面布局与呈现层契约
|
> 一句话:界面布局与呈现层契约
|
||||||
> 状态:已定稿
|
> 状态:已定稿(自旧体系迁移)
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ HUD框架把各玩法系统产生的事实变成玩家看得见、点得动、
|
|||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:本系统管"怎么呈现、怎么翻译输入、弹层怎么排队"。一个动作合不合法、结果算什么意思,归排雷玩法、行动经济、战斗结算等上游裁定;画面具体长什么样、组件落在哪一像素,屏级权威按屏分治——战斗屏是 [battle.md](../../../ux/battle.md)、关卡画面是 [level-map.md](../../../ux/level-map.md)——本文只锁系统级契约。
|
边界这样划:本系统管"怎么呈现、怎么翻译输入、弹层怎么排队"。一个动作合不合法、结果算什么意思,归排雷玩法、行动经济、战斗结算等上游裁定;画面具体长什么样、组件落在哪一像素,屏级权威按屏分治——战斗屏是 [battle.md](../../ux/battle.md)、关卡画面是 [level-map.md](../../ux/level-map.md)——本文只锁系统级契约。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ HUD框架把各玩法系统产生的事实变成玩家看得见、点得动、
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 任何玩法状态与玩法数值 | 各玩法系统;数值表本体归[数据配置](数据配置.md) |
|
| 任何玩法状态与玩法数值 | 各玩法系统;数值表本体归[数据配置](数据配置.md) |
|
||||||
| 合法性判定与机制语义裁定 | [排雷玩法](../排雷循环/排雷玩法.md)、[行动经济](../排雷循环/行动经济.md)、[战斗结算](../战斗循环/战斗结算.md) |
|
| 合法性判定与机制语义裁定 | [排雷玩法](../排雷循环/排雷玩法.md)、[行动经济](../排雷循环/行动经济.md)、[战斗结算](../战斗循环/战斗结算.md) |
|
||||||
| 屏级布局与动画时长的像素级裁决 | [battle.md](../../../ux/battle.md)(战斗屏)与 [level-map.md](../../../ux/level-map.md)(关卡画面) |
|
| 屏级布局与动画时长的像素级裁决 | [battle.md](../../ux/battle.md)(战斗屏)与 [level-map.md](../../ux/level-map.md)(关卡画面) |
|
||||||
| 美术终稿与动画密度 | [art-bible](../../../art/art-bible.md)与[战斗表现](../战斗循环/战斗表现.md) |
|
| 美术终稿与动画密度 | [art-bible](../../../art/art-bible.md)与[战斗表现](../战斗循环/战斗表现.md) |
|
||||||
| 音频、教学内容、本地化文本生产 | [音频](音频.md)、[教学引导](教学引导.md)、[设置与本地化](设置与本地化.md) |
|
| 音频、教学内容、本地化文本生产 | [音频](音频.md)、[教学引导](教学引导.md)、[设置与本地化](设置与本地化.md) |
|
||||||
| 任何随机消费 | 无——呈现层零随机 |
|
| 任何随机消费 | 无——呈现层零随机 |
|
||||||
@@ -57,13 +57,13 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
|
|
||||||
| 区 | 位置与几何 | 管什么 |
|
| 区 | 位置与几何 | 管什么 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| B 战斗画面 | 全宽,高读布局表 `stage_h`(背景三关变体+连续地面层高另读 `ground_h`) | 三关舞台背景+连续地面层、主角站桩立绘、敌人站桩立绘 ×1–3(**全站桩形态,2026-09-20 用户拍板:无框立绘+底座、状态小图标挂血条下,英雄卡/敌人卡退役**)、轮次阶段指示、结算明细带 |
|
| B 战斗画面 | 全宽,高读布局表 `stage_h` | 主角站桩立绘、敌人站桩立绘 ×1–3(**全站桩形态,2026-09-20 用户拍板:无框立绘+底座、状态小图标挂血条下,英雄卡/敌人卡退役**)、轮次阶段指示、结算明细带 |
|
||||||
| C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 |
|
| C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 |
|
||||||
| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区(2026-11-07 顶栏搬两侧:D 区全高归棋盘) | 左/右行动资源侧栏、棋盘本体、toast 槽(棋盘底常驻操作提示条退役) |
|
| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距(原右下面板删除后横向加宽),高同 C 区 | 行动点条与按钮组、棋盘本体、toast 槽 |
|
||||||
|
|
||||||
分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`(经 `ConfigDb.presentation.battle_layout` 读取);分区尺寸与组件落位的像素级裁决归 [battle.md](../../../ux/battle.md),两份文档只写结构关系、不复写数值。三区结构与双舞台常驻是结构冻结项,修订走文档修订而非调参。节点链进度不在战斗屏呈现——它由关卡画面(选路覆盖层常驻形态)的节点态承载,见[关卡节点地图](../冒险循环/关卡节点地图.md)。
|
分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`(经 `ConfigDb.presentation.battle_layout` 读取);分区尺寸与组件落位的像素级裁决归 [battle.md](../../ux/battle.md),两份文档只写结构关系、不复写数值。三区结构与双舞台常驻是结构冻结项,修订走文档修订而非调参。节点链进度不在战斗屏呈现——它由关卡画面(选路覆盖层常驻形态)的节点态承载,见[关卡节点地图](../冒险循环/关卡节点地图.md)。
|
||||||
|
|
||||||
**结论**:棋盘格边长由 [battle.md](../../../ux/battle.md)「棋盘格尺寸公式」按棋盘区实测面积与板型算出;本文只判"塞不塞得进",不复制算式与算例。**分辨率档位**:两档=1280×800 基准档(本表全部定值的口径)+1920×1080 档=**全局等比**(stretch canvas_items+aspect keep——16:10 设计在 16:9 窗口为等比 1.35×+左右黑边各 ~96px);本节与各屏定值一律按 1280 基准档书写,1920 档由引擎等比承载、零重排。
|
**结论**:棋盘格边长由 [battle.md](../../ux/battle.md)「棋盘格尺寸公式」按棋盘区实测面积与板型算出;本文只判"塞不塞得进",不复制算式与算例。**分辨率档位(2026-09-30 迭代 9 三裁决案甲修订)**:两档=1280×800 基准档(本表全部定值的口径)+1920×1080 档=**全局等比**(stretch canvas_items+aspect keep——16:10 设计在 16:9 窗口为等比 1.35×+左右黑边各 ~96px);本节与各屏定值一律按 1280 基准档书写,1920 档由引擎等比承载、零重排。
|
||||||
|
|
||||||
```
|
```
|
||||||
装板可行性(网格实高 ≤ 棋盘区可用高):
|
装板可行性(网格实高 ≤ 棋盘区可用高):
|
||||||
@@ -74,9 +74,9 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| 变量 | 含义 | 现行值 |
|
| 变量 | 含义 | 现行值 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| N | 棋盘边长格数 | 读[棋盘生成](../排雷循环/棋盘生成.md)(现行四档;事实源 board_gen.tres) |
|
| N | 棋盘边长格数 | 读[棋盘生成](../排雷循环/棋盘生成.md)(现行四档;事实源 board_gen.tres) |
|
||||||
| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 高 = D 区全高(不再扣 AP 条);宽按 battle.md 格尺寸公式扣 `side_rail_w` 侧栏,本表不复制现算值 |
|
| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 由 D 区尺寸扣行动点条高(读 `ap_bar_h`)得出,本表不复制现算值 |
|
||||||
|
|
||||||
装板可行性由上面的不等式保证;格边长的可读下限见 [battle.md](../../../ux/battle.md),算例由样张渲染脚本按布局表现算、不入文档。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。
|
装板可行性由上面的不等式保证;格边长的可读下限见 [battle.md](../../ux/battle.md),算例由样张渲染脚本按布局表现算、不入文档。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。
|
||||||
|
|
||||||
### 提示与弹层:轻提示随起随消、重弹层排队进出
|
### 提示与弹层:轻提示随起随消、重弹层排队进出
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| toast | 非模态 | 自动消退 2.5 秒,不打断挖掘 |
|
| toast | 非模态 | 自动消退 2.5 秒,不打断挖掘 |
|
||||||
| 图例面板 / 明细回看 / 胜负终局 | 模态 | 同一张登记序栈:统一入栈出栈、后开置顶、关闭逐层恢复 |
|
| 图例面板 / 明细回看 / 胜负终局 | 模态 | 同一张登记序栈:统一入栈出栈、后开置顶、关闭逐层恢复 |
|
||||||
|
|
||||||
三条纪律横跨两族。其一,"第一次遇到"类提示(本作没有双击快开、挖不相邻格要先走近)走 toast,每场冒险至多弹一次。其二,拒绝反馈不属于一次性族——每次被拒都要可感知,且图标与文案双通道冗余(不靠颜色单独承载);棋盘面拒绝(动作不合棋盘规则,目标格边框闪)与资源面拒绝(行动点或储备不足,数字脉冲)必须可区分。图例面板恒可随时打开回看,不设解锁门。其三,**确认弹窗的按钮位次定值**:推进操作的钮在左、维持现状的钮(取消/留下/否)在右,三钮形态的次推进钮居中;全项目确认弹窗共用同一件、同一序,四处消费方(删档确认/营地大门有断点的三出口/营地大门无断点是否开局/篝火离场)皆然。**位次不随文案变**,语义由文案承担。
|
两条纪律横跨两族。其一,"第一次遇到"类提示(本作没有双击快开、挖不相邻格要先走近)走 toast,每场冒险至多弹一次。其二,拒绝反馈不属于一次性族——每次被拒都要可感知,且图标与文案双通道冗余(不靠颜色单独承载);棋盘面拒绝(动作不合棋盘规则,目标格边框闪)与资源面拒绝(行动点或储备不足,数字脉冲)必须可区分。图例面板恒可随时打开回看,不设解锁门。
|
||||||
|
|
||||||
### 呈现层订阅纪律:界面不自持状态、订阅面只留两条线
|
### 呈现层订阅纪律:界面不自持状态、订阅面只留两条线
|
||||||
|
|
||||||
@@ -134,11 +134,11 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| 信息内容 | 只表达格面资源的类型(九类格面资源归五组色相呈现,色相/明度/画法规格归 [art-bible](../../../art/art-bible.md) §4.2);不表达极性(安全/雷)、不表达具体收益档位 |
|
| 信息内容 | 只表达格面资源的类型(九类格面资源归五组色相呈现,色相/明度/画法规格归 [art-bible](../../../art/art-bible.md) §4.2);不表达极性(安全/雷)、不表达具体收益档位 |
|
||||||
| 生命周期 | 资源身份装板期摇定(微光只是显示,不改任何游戏数据)→ 未开 ∧ 在 8 格内 → 亮;格子被挖开/连锁开/踩雷 → 灭;角色走远出圈 → 灭,走回 → 复亮;换图随旧图全重置 |
|
| 生命周期 | 资源身份装板期摇定(微光只是显示,不改任何游戏数据)→ 未开 ∧ 在 8 格内 → 亮;格子被挖开/连锁开/踩雷 → 灭;角色走远出圈 → 灭,走回 → 复亮;换图随旧图全重置 |
|
||||||
| 关联与边界 | 信息本体(格面资源身份)归[地图战斗资源](../战斗循环/地图战斗资源.md);棋盘格态与动作合法性归[排雷玩法](../排雷循环/排雷玩法.md);与「接触带微光」同圈不同职责——接触带微光=可挖域的交互反馈光(「这里能挖」),类型微光=相邻格的类型先读(「这格是什么类型」) |
|
| 关联与边界 | 信息本体(格面资源身份)归[地图战斗资源](../战斗循环/地图战斗资源.md);棋盘格态与动作合法性归[排雷玩法](../排雷循环/排雷玩法.md);与「接触带微光」同圈不同职责——接触带微光=可挖域的交互反馈光(「这里能挖」),类型微光=相邻格的类型先读(「这格是什么类型」) |
|
||||||
| 实装状态 | 呈现契约已定稿(五组色相经样张 v2 冻结 2026-09-28);**已实装**——在役实现(五组色相 = 呈现套件色相常量、格面微光子件 + 距离场渲染),验收见本节末「验收标准」类型微光行,登记面归 [待办清单](../../../../待办清单.md)「未开格类型徽章呈现时机」条(已完成) |
|
| 实装状态 | 呈现契约已定稿(五组色相经样张 v2 冻结 2026-09-28);**已实装(迭代 30 卡① 2026-10-17 入库)**——2026-09-30 核证的「呈现层仅接触带微光在跑,类型微光无独立实现」状态自此注销;在役实现(五组色相 = 呈现套件色相常量、格面微光子件 + 距离场渲染)与验收转正见本节末「验收标准」类型微光行,登记面归 [待办清单](../../../../待办清单.md)「未开格类型徽章呈现时机」条(已完成) |
|
||||||
|
|
||||||
口径注记:概念必须落地权威文档,零散复述不是定义——本概念口径 =「英雄周围 8 格」,「常显」「全部未开格」等无范围表述不成立。
|
口径史注记(防复发):本概念曾只活在待办清单登记与 art-bible 复述里,「常显」「全部未开格」等无范围表述于 2026-09-30 酿成理解事故;用户裁决「英雄周围 8 格」为正确口径并落位本节。教训=概念必须落地权威文档,零散复述不是定义。
|
||||||
|
|
||||||
两带分工注记:类型微光实装后,棋盘外另有「卡顶色带」(徽章/条目顶边色带,悬赏与秘宝等面板格面条目顶边的类型色带)与本格面微光并存——卡顶带 = 条目级静态色带(一眼扫类型),格面微光 = 棋盘格内动态微光(相邻先读);两套载体不同、职责不同,**禁互为引用**。
|
两带分工注记(2026-10-17 迭代 30 卡①登记):类型微光实装后,棋盘外另有「卡顶色带」(徽章/条目顶边色带,悬赏与秘宝等面板格面条目顶边的类型色带)与本格面微光并存——卡顶带 = 条目级静态色带(一眼扫类型),格面微光 = 棋盘格内动态微光(相邻先读);两套载体不同、职责不同,**禁互为引用**。
|
||||||
|
|
||||||
### 可挖域指示(接触带微光):「这里能挖」的交互反馈光
|
### 可挖域指示(接触带微光):「这里能挖」的交互反馈光
|
||||||
|
|
||||||
@@ -150,26 +150,26 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| 画法 | 光画英雄格周界空间侧:正交邻墙=该侧整条边,斜向邻墙=共享角点+向两侧各延伸半条边;光只画英雄格一侧、不进墙格;色相=蓝族浅一档——画法细则归 [art-bible](../../../art/art-bible.md) §3.2 |
|
| 画法 | 光画英雄格周界空间侧:正交邻墙=该侧整条边,斜向邻墙=共享角点+向两侧各延伸半条边;光只画英雄格一侧、不进墙格;色相=蓝族浅一档——画法细则归 [art-bible](../../../art/art-bible.md) §3.2 |
|
||||||
| 生命周期 | 挖掘期呈现且呼吸(挖掘期唯一在动元素——art-bible §2.1;相位门控,结算期停息);减动效开启=呼吸停格(静态保留指界功能);换图/装板随新可挖域重算 |
|
| 生命周期 | 挖掘期呈现且呼吸(挖掘期唯一在动元素——art-bible §2.1;相位门控,结算期停息);减动效开启=呼吸停格(静态保留指界功能);换图/装板随新可挖域重算 |
|
||||||
| 关联与边界 | 逐格指认=悬停金框(pattern 4 悬停预承诺——微光是常驻指界、悬停是意图预承诺,两概念分工);不携带类型/极性信息(那是类型微光的职责);零信息写入(纯呈现层) |
|
| 关联与边界 | 逐格指认=悬停金框(pattern 4 悬停预承诺——微光是常驻指界、悬停是意图预承诺,两概念分工);不携带类型/极性信息(那是类型微光的职责);零信息写入(纯呈现层) |
|
||||||
| 实装状态 | 已实装(呈现层现行在跑;程序化占位,画法终稿随样张批) |
|
| 实装状态 | 已实装(呈现层现行在跑——2026-09-30 核证;程序化占位,画法终稿随样张批) |
|
||||||
|
|
||||||
### 视野迷雾:菱形灯光区与黑暗边界
|
### 视野迷雾:菱形灯光区与黑暗边界
|
||||||
|
|
||||||
> 本节是「视野迷雾」在全项目的唯一权威定义(2026-09-30 用户拍板立项):其他文档引用只许指路本节。定义一句话:**棋盘只完整渲染以角色为中心的菱形灯光区,区外一切呈迷雾黑暗,移动角色才逐步照亮**——像在洞穴里举灯探索。与已退役的「雾格」无关:雾格是格面机制,视野迷雾是纯呈现层机制,不改任何游戏数据。
|
> 本节是「视野迷雾」在全项目的唯一权威定义(2026-09-30 用户拍板立项):其他文档引用只许指路本节。定义一句话:**棋盘只完整渲染以角色为中心的菱形灯光区,区外一切呈迷雾黑暗,移动角色才逐步照亮**——像在洞穴里举灯探索。与已退役的「雾格」无关:雾格是格面机制(2026-09-15 退役),视野迷雾是纯呈现层机制,不改任何游戏数据。
|
||||||
|
|
||||||
| 要素 | 口径 |
|
| 要素 | 口径 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 作用对象与范围 | 棋盘渲染可见性:灯光区内照常渲染;区外**已开格=暗淡记忆态**(灰显可见、数字可读——2026-09-30 拍板),区外**未开格=全黑不渲染** |
|
| 作用对象与范围 | 棋盘渲染可见性:灯光区内照常渲染;区外**已开格=暗淡记忆态**(灰显可见、数字可读——2026-09-30 拍板),区外**未开格=全黑不渲染** |
|
||||||
| 生命周期 | 随角色位置实时变化;战斗内持续;换图按新板重置;已开/未开格态、数字真值、清图判定零影响(纯呈现遮罩——同板同动作序列的结算结果与无迷雾逐位一致) |
|
| 生命周期 | 随角色位置实时变化;战斗内持续;换图按新板重置;已开/未开格态、数字真值、清图判定零影响(纯呈现遮罩——同板同动作序列的结算结果与无迷雾逐位一致) |
|
||||||
| 关联与边界 | 与「未开格类型微光」同边界——灯光区起步半径=微光环 8 格(同圈起步,实测后可调);格态数据归[排雷玩法](../排雷循环/排雷玩法.md);黑暗区域渲染规格(暗淡态明度、迷雾过渡)归 [art-bible](../../../art/art-bible.md) 修订随实施批;初始展开收窄不在本案(后置与 Alpha 差异化批窗口合并再议) |
|
| 关联与边界 | 与「未开格类型微光」同边界——灯光区起步半径=微光环 8 格(同圈起步,实测后可调);格态数据归[排雷玩法](../排雷循环/排雷玩法.md);黑暗区域渲染规格(暗淡态明度、迷雾过渡)归 [art-bible](../../../art/art-bible.md) 修订随实施批;初始展开收窄不在本案(后置与 Alpha 差异化批窗口合并再议) |
|
||||||
| 实装状态 | **已实装**(渲染规格 = [art-bible](../../../art/art-bible.md) §6.5;逐条口径见本节末「实施状态」注记) |
|
| 实装状态 | **已实装**(2026-10-03 迭代 11 第④批已入库;四裁决逐条对账与验收线转正见本节末「实施状态」注记;渲染规格 = [art-bible](../../../art/art-bible.md) §6.5) |
|
||||||
|
|
||||||
配套拍板:魔法提灯=灯甲形态(光照圈外扩 +2 格,flat 整数档);**类型微光不随视野扩大**(类型先读仍只贴身 8 格,微光锚=可挖域);提灯数据行(秘宝·同调位「魔法提灯」)**已退役**,功能由新目录普通档「阔视野带」承接,登记面归 [待办清单](../../../../待办清单.md)。
|
配套拍板(同日):魔法提灯=灯甲形态(光照圈外扩 +2 格,flat 整数档)随迷雾立项;**类型微光不随视野扩大**(类型先读仍只贴身 8 格,微光锚=可挖域);提灯载体归 aux_items 新行(登记原文——2026-10-07 用户令改道为独立卡,2026-10-08 裁案A=秘宝·同调位新行落位,见下方实施状态注记;**2026-10-09 用户裁退役**——新目录 15 件未收提灯,提灯数据行与卡④接线拆除归退役删行批〔实装批〕,功能由新目录普通档「阔视野带」承接,待办清单登记条在册),呈现面挂「资产升档重产批」(挂账不动)。
|
||||||
|
|
||||||
**实施状态**:迷雾遮蔽+菱形灯光区跟随+暗淡记忆态上线,输入探针断言扩(迷雾案)。四要点——①视野迷雾(纯呈现层):迷雾开关分层验证可用(呈现态布尔,off 态=无迷雾基线),同板同动作序列与 MC 逐项比对逐位一致;②暗淡记忆态:区外已开格灰显+数字可读,明度按 [art-bible](../../../art/art-bible.md) §6.5 写入文档值(记忆板 #3A3A3A/记忆墨 #C4C4C4,provisional);③灯光半径=微光环 8 格同圈:半径 8 参数化(曼哈顿菱形,常量);④提灯 +2、微光不扩:提灯加成 +2,类型微光仍贴身 8 邻格零改动。**公共接线面已就位**——公共提灯开关接口(开=半径 8+2、关=复原 0;写入即重算雾态),迷雾在位消费该值;输入探针增接线断言(开=距离 9 格转可见+提灯 2/关=复原)。**提灯载体已退役**——原载体=秘宝·同调位新行「魔法提灯」(treasure_items.tres 表尾行,desc「灯光区半径+2」,slot_cost 1、营地秘宝匣同调装配获渠),生产路径=冒险装配→战斗装配集注入→公共只读出口查装配含否→组合根呈现桥每战首轮装配链**显式重算含否**(🔴 复原语义=禁战斗结束隐式复原——卸装/未装配写 0,断点续玩/跨关天然正确);未装配=零加成(缺省零扰动基线逐位不变)。验收线(本篇「验收标准」视野迷雾行)逐条正式验收:区内完整渲染/区外已开格灰显可读/区外未开格不可见/灯光区随移动跟随/两态结算逐位一致;实机目检人闸(迷雾观感/记忆态可读性/移动跟随流畅度)随出口闸。黑暗区域渲染规格承载 = art-bible §6.5(v3.5)。
|
**实施状态(2026-10-03 迭代 11 第④批已入库)**:迷雾遮蔽+菱形灯光区跟随+暗淡记忆态上线,输入探针断言顺带扩(迷雾案)。四裁决逐条对账——①案甲视野迷雾立项(纯呈现层):迷雾开关分层验证可用(呈现态布尔,off 态=无迷雾基线),同板同动作序列与 MC 逐项比对逐位一致;②暗淡记忆态:区外已开格灰显+数字可读,明度按 [art-bible](../../../art/art-bible.md) §6.5 写入文档值(记忆板 #3A3A3A/记忆墨 #C4C4C4,provisional);③灯光半径=微光环 8 格同圈:半径 8 参数化(曼哈顿菱形,常量);④提灯 +2、微光不扩:提灯加成 +2,类型微光仍贴身 8 邻格零改动。**〔2026-10-05 迭代14⑤接线注记〕公共接线面已就位**——公共提灯开关接口(开=半径 8+2、关=复原 0;写入即重算雾态),迷雾批已在位消费该值;输入探针增接线断言(开=距离 9 格转可见+提灯 2/关=复原)。**〔2026-10-08 迭代 19 卡④入库注记〕载体到位+接线闭环=功能可达**——载体=秘宝·同调位新行「魔法提灯」(treasure_items.tres 表尾追加,desc「灯光区半径+2」,slot_cost 1、营地秘宝匣同调装配获渠,行字段=用户「按推荐」全收);生产路径=冒险装配→战斗装配集注入→公共只读出口查装配含否→组合根呈现桥每战首轮装配链**显式重算含否**(🔴 复原语义=禁战斗结束隐式复原——卸装/未装配写 0,断点续玩/跨关天然正确);未装配=零加成(缺省零扰动基线逐位不变)。顺带测试:载体级迷雾案(装配→提灯 2+距离 R+1 转可见+卸装复原)+冒烟行字段/同调目录投影(九件→十件)/装配贯通断言+存档回归 Part 6+单测提灯接线(全套 17→18 套)。原「提灯载体归 aux_items 新行随 Alpha 信息件重定批」登记去向就此注销(改道留痕=需求卡片-提灯载体道具批-2026-10-07 §一)。验收线(本篇「验收标准」视野迷雾行)逐条转正式验收:区内完整渲染/区外已开格灰显可读/区外未开格不可见/灯光区随移动跟随/两态结算逐位一致;实机目检人闸(迷雾观感/记忆态可读性/移动跟随流畅度)随出口闸。黑暗区域渲染规格承载 = art-bible §6.5(v3.5)。
|
||||||
|
|
||||||
### 营地:可点击场景图
|
### 营地:可点击场景图(旧四柜台并排形态已随卡④改版取代)
|
||||||
|
|
||||||
营地形态**已换代为一张可点击的场景图 + 七物件点选**(现行权威=[camp](../../../ux/camp.md));全部程序占位视觉(占位纪律延续,2026-10-11 用户令),**视觉与布局终稿归 HUD 营地视觉批**(未立项)。结构现行事实源 = [天赋树](../跨局循环/天赋树.md)「营地=树:统一模型」节。
|
营地形态**已换代为一张可点击的场景图 + 七物件点选**(2026-10-22 卡④美术设计段定稿,现行权威=[camp](../../ux/camp.md));2026-10-12(迭代 21 落地)起至换代前的旧形态为**四柜台并排**布局:①树淬炼(树脊柱界面形态,营地主界面)②锻造工坊(钥匙门+点亮展开工作间)③秘宝匣(钥匙门+目录与同调装配)④奖励格图鉴(常开无门槛)——宽度不足横向滚动兜底;全部程序占位视觉(占位纪律延续,2026-10-11 用户令),**视觉与布局终稿归 HUD 营地视觉批**(未立项)。结构现行事实源 = [天赋树](../跨局循环/天赋树.md)「营地=树:统一模型」节(2026-10-13 迭代 21 反哺⑤写入文档登记——本篇原无营地柜台登记面,顺带补缺)。
|
||||||
|
|
||||||
### 可访问性基线:看得清、不闪、纯鼠标玩得通
|
### 可访问性基线:看得清、不闪、纯鼠标玩得通
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 对比度 | 全部数字对格底 ≥4.5:1 |
|
| 对比度 | 全部数字对格底 ≥4.5:1 |
|
||||||
| 色弱安全 | 无信息仅靠色相承载;格态在灰度截图下可逐格分类 |
|
| 色弱安全 | 无信息仅靠色相承载;格态在灰度截图下可逐格分类 |
|
||||||
| 字号下限 | 棋盘浮空数字字高 21px 固定、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) |
|
| 字号下限 | 棋盘数字 ≥18px、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) |
|
||||||
| 闪烁 | 无每秒超过三次的闪烁 |
|
| 闪烁 | 无每秒超过三次的闪烁 |
|
||||||
| 减动效 | 提供全部动画时长减半或跳终态的开关;结算逐行兑现是信息载体——可加速、不可整体跳过 |
|
| 减动效 | 提供全部动画时长减半或跳终态的开关;结算逐行兑现是信息载体——可加速、不可整体跳过 |
|
||||||
| 输入 | 全部操作纯鼠标可完成 |
|
| 输入 | 全部操作纯鼠标可完成 |
|
||||||
@@ -196,7 +196,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘只读投影(格态、数字、封印印记、小人)与移动路径查询;玩家意图批次经组合根提交 |
|
| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘只读投影(格态、数字、封印印记、小人)与移动路径查询;玩家意图批次经组合根提交 |
|
||||||
| 上游 | [行动经济](../排雷循环/行动经济.md) | 行动点 / 储备 / 相位只读值;刷新入口可用性预判加返回值兜底 |
|
| 上游 | [行动经济](../排雷循环/行动经济.md) | 行动点 / 储备 / 相位只读值;刷新入口可用性预判加返回值兜底 |
|
||||||
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水是结算明细带的统一数据源(现行 9 类行封闭协议);段序编排信号经组合根接线 |
|
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水是结算明细带的统一数据源(现行 9 类行封闭协议);段序编排信号经组合根接线 |
|
||||||
| 上游 | [敌人系统](../战斗循环/敌人系统.md) | 英雄与敌人的只读投影(血量、顺位、摇定动作〔技能标识·类型·名称〕、敌方增益、存活——经战斗结算呈现快照;敌人技能池定稿:当前拍/行动环进度字段拆除,池与权重不公开) |
|
| 上游 | [敌人系统](../战斗循环/敌人系统.md) | 英雄与敌人的只读投影(血量、顺位、摇定动作〔技能标识·类型·名称〕、敌方增益、存活——经战斗结算呈现快照;敌人技能池批批 2 定稿:当前拍/行动环进度字段拆除,池与权重不公开) |
|
||||||
| 上游 | [增益状态](../战斗循环/增益状态.md) | 状态投影经战斗结算呈现面取得,零直读 |
|
| 上游 | [增益状态](../战斗循环/增益状态.md) | 状态投影经战斗结算呈现面取得,零直读 |
|
||||||
| 上游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格奖励身份投影(只读回调,组合根注入)零直读 |
|
| 上游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格奖励身份投影(只读回调,组合根注入)零直读 |
|
||||||
| 上游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链、当前节点、跨战斗生命携带的读数;胜利后推进 |
|
| 上游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链、当前节点、跨战斗生命携带的读数;胜利后推进 |
|
||||||
@@ -212,13 +212,13 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| [排雷玩法](../排雷循环/排雷玩法.md) | 已开 / 未开格态一眼可辨;悬停预承诺与可挖域常驻指示;移动路径预览即合法性指示;每次拒绝可感知且棋盘面细因可区分;停手被改判可感知 |
|
| [排雷玩法](../排雷循环/排雷玩法.md) | 已开 / 未开格态一眼可辨;悬停预承诺与可挖域常驻指示;移动路径预览即合法性指示;每次拒绝可感知且棋盘面细因可区分;停手被改判可感知 |
|
||||||
| [行动经济](../排雷循环/行动经济.md) | 行动点与储备常显;储备清零反馈;棋盘面与资源面拒绝可区分;刷新入口与代价可读 |
|
| [行动经济](../排雷循环/行动经济.md) | 行动点与储备常显;储备清零反馈;棋盘面与资源面拒绝可区分;刷新入口与代价可读 |
|
||||||
| [战斗结算](../战斗循环/战斗结算.md) | 未生效类明细行(奖励未生效)的呈现;高光行强调 |
|
| [战斗结算](../战斗循环/战斗结算.md) | 未生效类明细行(奖励未生效)的呈现;高光行强调 |
|
||||||
| [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链进度呈现(关卡画面选路覆盖层节点态承载:暗金已过、金当前、候选下一跳通道亮金、Boss 紫赤描边);选路覆盖层只读呈现(零自动推进停点语义)——屏级 spec:[level-map](../../../ux/level-map.md) |
|
| [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链进度呈现(关卡画面选路覆盖层节点态承载:暗金已过、金当前、候选下一跳通道亮金、Boss 紫赤描边(旗朱→紫赤 2026-09-26 封印紫批));选路覆盖层只读呈现(零自动推进停点语义)——屏级 spec:[level-map](../../ux/level-map.md)(2026-09-27 建档) |
|
||||||
| [敌人系统](../战斗循环/敌人系统.md) | 意图线索映射成文且全局恒定;单位顺位与血条可读;敌方共享层数各卡同值 |
|
| [敌人系统](../战斗循环/敌人系统.md) | 意图线索映射成文且全局恒定;单位顺位与血条可读;敌方共享层数各卡同值 |
|
||||||
| [增益状态](../战斗循环/增益状态.md) | 状态栏常显;无状态时整排槽隐藏;有利 / 有害极性呈现不看数值符号 |
|
| [增益状态](../战斗循环/增益状态.md) | 状态栏常显;无状态时整排槽隐藏;有利 / 有害极性呈现不看数值符号 |
|
||||||
| [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格的奖励身份常读;未开格类型微光(英雄周围 8 格内的未开格显示资源类型——概念定义见本篇「未开格类型微光」节) |
|
| [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格的奖励身份常读;未开格类型微光(英雄周围 8 格内的未开格显示资源类型——概念定义见本篇「未开格类型微光」节) |
|
||||||
| [秘宝](../跨局循环/秘宝.md) | 装配件与充能常读;使用交互与目标拾取;整图叠加层信息呈现(在役旧框架——随实装批整体替换,秘宝.md v1.7 同款口径) |
|
| [秘宝](../跨局循环/秘宝.md) | 装配件与充能常读;使用交互与目标拾取;整图叠加层信息呈现(在役旧框架——随实装批整体替换,秘宝.md v1.7 同款口径) |
|
||||||
| [棋盘生成](../排雷循环/棋盘生成.md) | 零合法板的诚实告知(数据面经战斗结算上抛,本系统只管提示形态) |
|
| [棋盘生成](../排雷循环/棋盘生成.md) | 零合法板的诚实告知(数据面经战斗结算上抛,本系统只管提示形态) |
|
||||||
| [地形变异](../排雷循环/地形变异.md) | 全局作用域型三层预告(语义现行事实源=地形变异 §全局作用域型):①开战横幅一行(整图变异非空时显示;减动效=静态驻留,轮横幅先例同款双态)②HUD 常驻角标(C 区战斗全程可见防中局遗忘,空态整节隐藏=奇物段先例;摆位 provisional)③帮助手册一行(零交互教学,承载=玩法帮助文案块);数据面经呈现快照的整图变异投影(核心→呈现唯一读取面),普通图三层恒空态零打扰 |
|
| [地形变异](../排雷循环/地形变异.md) | 全局作用域型三层预告(2026-10-04 首发批——语义现行事实源=地形变异 §全局作用域型):①开战横幅一行(整图变异非空时显示;减动效=静态驻留,轮横幅先例同款双态)②HUD 常驻角标(C 区战斗全程可见防中局遗忘,空态整节隐藏=奇物段先例;摆位 provisional)③帮助手册一行(零交互教学,承载=玩法帮助文案块);数据面经呈现快照的整图变异投影(核心→呈现唯一读取面),普通图三层恒空态零打扰 |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
|
|
||||||
@@ -236,7 +236,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| P1 | 远格点击自动"先移动再挖"复合意图 | 移动免费高频,两击摩擦先经实测验证再裁 |
|
| P1 | 远格点击自动"先移动再挖"复合意图 | 移动免费高频,两击摩擦先经实测验证再裁 |
|
||||||
| P1 | Gamepad 焦点序 | 纯鼠标已覆盖 MVP 全部操作 |
|
| P1 | Gamepad 焦点序 | 纯鼠标已覆盖 MVP 全部操作 |
|
||||||
| P1 | 可访问性正式分层(文本缩放 / 色盲模式 / 按键重映射) | 归[设置与本地化](设置与本地化.md)设置项全集裁决(2026-09-27 拍板不另立专项文档) |
|
| P1 | 可访问性正式分层(文本缩放 / 色盲模式 / 按键重映射) | 归[设置与本地化](设置与本地化.md)设置项全集裁决(2026-09-27 拍板不另立专项文档) |
|
||||||
| P1 | 相邻域屏(节点奖励 / 关卡结算)完整屏形态 | 归后续 UX 文档(关卡结算屏 spec 已建 [level-clear](../../../ux/level-clear.md);节点奖励屏 spec 已在役:[node-reward](../../../ux/node-reward.md) v2.5 令牌池口径);MVP 以覆盖层反馈承载 |
|
| P1 | 相邻域屏(节点奖励 / 关卡结算)完整屏形态 | 归后续 UX 文档(关卡结算屏 spec 已建 [level-clear](../../ux/level-clear.md)——2026-09-27;节点奖励屏 spec 已在役:[node-reward](../../ux/node-reward.md) v2.5 令牌池口径);MVP 以覆盖层反馈承载 |
|
||||||
| P2 | 提示一次性作用域升级为存档级"一生一次" | 归[存档序列化](存档序列化.md)与[元进度](../跨局循环/元进度.md)后重议 |
|
| P2 | 提示一次性作用域升级为存档级"一生一次" | 归[存档序列化](存档序列化.md)与[元进度](../跨局循环/元进度.md)后重议 |
|
||||||
| P2 | 调试面板退役 | 正式侧归元进度;诊断按钮保留为调试设施 |
|
| P2 | 调试面板退役 | 正式侧归元进度;诊断按钮保留为调试设施 |
|
||||||
| P2 | 探测类秘宝的显影呈现面 | 接口归[秘宝](../跨局循环/秘宝.md)定稿批 |
|
| P2 | 探测类秘宝的显影呈现面 | 接口归[秘宝](../跨局循环/秘宝.md)定稿批 |
|
||||||
@@ -244,7 +244,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / B 区连续地面层高 / C 区宽 / D 区侧栏宽 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。
|
本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / C 区宽 / AP 条高 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。
|
||||||
|
|
||||||
| 参数 | 域 | 现行值(文档自持,无表承载) | 说明 |
|
| 参数 | 域 | 现行值(文档自持,无表承载) | 说明 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
@@ -264,20 +264,20 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
- 三区无遮挡、无重叠、无内容裁切(棋盘全部格子与数字完整可见),分区几何与布局表 `battle_layout.tres` 一致;同屏 draw calls < 200;进入战斗屏 500ms 内首格可点。
|
- 三区无遮挡、无重叠、无内容裁切(棋盘全部格子与数字完整可见),分区几何与布局表 `battle_layout.tres` 一致;同屏 draw calls < 200;进入战斗屏 500ms 内首格可点。
|
||||||
- 任意板型装板后网格实高不超出棋盘区:N × 格边长 + (N−1) × 2px ≤ 棋盘区可用高;数字字号与整数倍缩放判据见 battle.md。
|
- 任意板型装板后网格实高不超出棋盘区:N × 格边长 + (N−1) × 2px ≤ 棋盘区可用高;数字字号与整数倍缩放判据见 battle.md。
|
||||||
- 已开 / 未开格态在灰度截图下可逐格分类;已引爆危险格"可通行可读"(已开底加巢穴纹、可作移动目标)。
|
- 已开 / 未开格态在灰度截图下可逐格分类;已引爆危险格"可通行可读"(已开底加巢穴纹、可作移动目标)。
|
||||||
- 类型微光:微光只在英雄周围 8 格内的未开格显示;出圈即灭、入圈即亮;已开格与封锁格恒无微光;微光呈现不随格是雷是安变化(不泄危险格与安全格)。
|
- 类型微光:微光只在英雄周围 8 格内的未开格显示;出圈即灭、入圈即亮;已开格与封锁格恒无微光;微光呈现不随格是雷是安变化(不泄危险格与安全格)。(迭代 30 卡①实装后转正式验收)
|
||||||
- 视野迷雾:棋盘仅菱形灯光区内完整渲染;区外已开格灰显可读、区外未开格不可见;灯光区随角色移动跟随;同一张板同一份动作序列,迷雾开关两种状态下的结算结果逐位一致(纯呈现,零游戏数据改动)。
|
- 视野迷雾:棋盘仅菱形灯光区内完整渲染;区外已开格灰显可读、区外未开格不可见;灯光区随角色移动跟随;同一张板同一份动作序列,迷雾开关两种状态下的结算结果逐位一致(纯呈现,零游戏数据改动)。
|
||||||
- 悬停光标三语义(移动 / 挖 / 封印)随目标切换并高亮目标格;悬停已开格画出合法路径(不可达不显示);可挖域常驻呼吸微光。
|
- 悬停光标三语义(移动 / 挖 / 封印)随目标切换并高亮目标格;悬停已开格画出合法路径(不可达不显示);可挖域常驻呼吸微光。
|
||||||
- 一帧内意图整批到达,停手点击终结当帧收集。
|
- 一帧内意图整批到达,停手点击终结当帧收集。
|
||||||
- 每次拒绝可感知:棋盘面、资源面、相位三类各有呈现且前两类可区分;停手被改判(本轮已清图)玩家可感知;拒绝反馈图标加文案双通道。
|
- 每次拒绝可感知:棋盘面、资源面、相位三类各有呈现且前两类可区分;停手被改判(本轮已清图)玩家可感知;拒绝反馈图标加文案双通道。
|
||||||
- 结算演出链逐行兑现(FX 载体——明细带逐行文字已退役);零值行不被吞(语义在日志面:step 行零删减);效果行的单次贡献与池合成值分示、禁相加误读。
|
- 结算逐行实时滚出且每行带来源标注;未生效类行聚合计数并带形状冗余;零值行不被吞;效果行的单次贡献与池合成值分示、禁相加误读。
|
||||||
- 高光三档:封印标中行金框、清图奖励行金框、完美封印全屏喝彩级——庆祝不打在空兑现上(首份即零兑付则不发高光)。
|
- 高光三档:封印标中行金框、清图奖励行金框、完美封印全屏喝彩级——庆祝不打在空兑现上(首份即零兑付则不发高光)。
|
||||||
- 状态槽显示图标加层数加剩余结算次数,悬停见来源;极性按键级表呈现(金满框 / 红缺框),空态整排隐藏、数据框上移补位;战斗结束全清有微文案。
|
- 状态槽显示图标加层数加剩余结算次数,悬停见来源;极性按键级表呈现(金满框 / 红缺框),空态整排隐藏、数据框上移补位;战斗结束全清有微文案。
|
||||||
- 敌人呈现(站桩立绘,载体 = 无框立绘+底座):意图占位 = 本拍摇定结果的动画占位(敌人技能池三档可见性——普通攻击零表示、特殊技类型级提示〔攻/防系两型〕,不预告技能名与数值、池与权重不公开)且挖掘期全程可见、映射跨局恒定、顺位可读、血量数字可读、敌方共享层数各立绘同值(血条悬浮头顶、状态小图标挂血条正下方);死亡灰化加碎裂退场(禁止瞬间消失)且就地更新不丢灰化态。
|
- 敌人呈现(站桩立绘,2026-09-20 全站桩拍板后载体由敌人卡改为无框立绘+底座,义务面平移不重述):意图占位 = 本拍摇定结果的动画占位(敌人技能池批三档可见性——普通攻击零表示、特殊技类型级提示〔攻/防系两型〕,不预告技能名与数值、池与权重不公开)且挖掘期全程可见、映射跨局恒定、顺位可读、血量数字可读、敌方共享层数各立绘同值(血条悬浮头顶、状态小图标挂血条正下方);死亡灰化加碎裂退场(禁止瞬间消失)且就地更新不丢灰化态。
|
||||||
- 终局:胜利金蜡封、失败暮蓝氛围层(明度不变);储备清零与状态全清两反馈不合并、时序不倒挂(关卡末清库反馈义务载体 = 秘宝背包〔关卡域库存恒空机械惰性承载,拆线归实装批——见「轮次生命周期」同款节注于战斗结算〕,随秘宝 P0 落地补验收)。
|
- 终局:胜利金蜡封、失败暮蓝氛围层(明度不变);储备清零与状态全清两反馈不合并、时序不倒挂(关卡末清库反馈义务载体 = 秘宝背包〔关卡域库存恒空机械惰性承载,拆线归实装批——见「轮次生命周期」同款节注于战斗结算〕,随秘宝 P0 落地补验收)。
|
||||||
- 任一模态层打开时遮挡物隐藏或输入锁定、关闭逐层恢复;tooltip 与明细行等动态区固定槽高、换行裁剪不推挤布局。
|
- 任一模态层打开时遮挡物隐藏或输入锁定、关闭逐层恢复;tooltip 与明细行等动态区固定槽高、换行裁剪不推挤布局。
|
||||||
- 终局呈现只消费流水与快照:核心对象销毁后呈现层对生命周期状态零回读;终局后重放渲染与实时渲染一致。
|
- 终局呈现只消费流水与快照:核心对象销毁后呈现层对生命周期状态零回读;终局后重放渲染与实时渲染一致。
|
||||||
- 消费的每份载荷逐字段断言通过(缺字段、多字段都算失败)。
|
- 消费的每份载荷逐字段断言通过(缺字段、多字段都算失败)。
|
||||||
- 地形变异三层预告(规则现行事实源=地形变异 §全局作用域型):Boss 图开战横幅一行显示且普通图不显示;C 区常驻角标战斗全程可见、空态整节隐藏;帮助手册含整图变异说明行;减动效开启横幅走静态驻留(轮横幅同款双态);普通图三层零打扰(恒空态)。
|
- 地形变异三层预告(2026-10-04 全局作用域变异首发批——规则现行事实源=地形变异 §全局作用域型):Boss 图开战横幅一行显示且普通图不显示;C 区常驻角标战斗全程可见、空态整节隐藏;帮助手册含整图变异说明行;减动效开启横幅走静态驻留(轮横幅同款双态);普通图三层零打扰(恒空态)。
|
||||||
- 字号下限成立;无每秒超三次闪烁;减动效开启时时长减半或跳终态(结算兑现降速不跳过);全程纯鼠标可玩;中文渲染无缺字。
|
- 字号下限成立;无每秒超三次闪烁;减动效开启时时长减半或跳终态(结算兑现降速不跳过);全程纯鼠标可玩;中文渲染无缺字。
|
||||||
- 呈现层零随机调用;切片临时名零残留。
|
- 呈现层零随机调用;切片临时名零残留。
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 存档序列化
|
# 存档序列化
|
||||||
|
|
||||||
> 一句话:存档契约与版本迁移
|
> 一句话:存档契约与版本迁移
|
||||||
> 状态:已定稿;现行为 v1.3
|
> 状态:已定稿(2026-09-21 存档序列化批落地);现行为 v1.2
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
| 读写时机 | 启动读盘;正式冒险收束写盘;原子写盘原语 |
|
| 读写时机 | 启动读盘;正式冒险收束写盘;原子写盘原语 |
|
||||||
| 元进度的持久化承载 | 归档登记的职责口径:"元进度持久化框架"——钥石与解锁进度由本系统落盘 |
|
| 元进度的持久化承载 | 归档登记的职责口径:"元进度持久化框架"——钥石与解锁进度由本系统落盘 |
|
||||||
| 最近冒险摘要的持久化 | 冒险摘要五件事副本入档(cap 10),重开对照跨进程成立 |
|
| 最近冒险摘要的持久化 | 冒险摘要五件事副本入档(cap 10),重开对照跨进程成立 |
|
||||||
| 冒险断点快照的持久化承载 | 停点粒度续玩快照(`breakpoint` 域)写入/读回/清除/迁移——内容口径归[冒险结构](../冒险循环/冒险结构.md) |
|
| 冒险断点快照的持久化承载 | 停点粒度续玩快照(`breakpoint` 域)写入/读回/清除/迁移——内容口径归[冒险结构](../冒险循环/冒险结构.md)(2026-09-29 迭代 8 卡①,P1 预挂号兑现) |
|
||||||
|
|
||||||
不负责:
|
不负责:
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 存进去的内容口径(钥石怎么得、能换什么) | [元进度](../跨局循环/元进度.md)——本系统只承载,不定义 |
|
| 存进去的内容口径(钥石怎么得、能换什么) | [元进度](../跨局循环/元进度.md)——本系统只承载,不定义 |
|
||||||
| 冒险摘要记哪几件事 | [冒险结构](../冒险循环/冒险结构.md)——本系统只消费其摘要五件事 |
|
| 冒险摘要记哪几件事 | [冒险结构](../冒险循环/冒险结构.md)——本系统只消费其摘要五件事 |
|
||||||
| 冒险断点快照记哪些字段、何时算一个合法停点 | [冒险结构](../冒险循环/冒险结构.md)——本系统只承载 `breakpoint` 域的写入/读回/清除 |
|
| 冒险断点快照记哪些字段、何时算一个合法停点 | [冒险结构](../冒险循环/冒险结构.md)——本系统只承载 `breakpoint` 域的写入/读回/清除(2026-09-29 迭代 8 卡①起,原 P1 预挂号兑现) |
|
||||||
| Boss 击杀的钥石金额计算(首杀全量 / 重复杀小额) | [元进度](../跨局循环/元进度.md)——本系统只记域内事实,不算账 |
|
| Boss 击杀的钥石金额计算(首杀全量 / 重复杀小额) | [元进度](../跨局循环/元进度.md)——本系统只记域内事实,不算账 |
|
||||||
| 数值配方本体(所有玩家一致的表) | [数据配置](数据配置.md)——表是配方,存档是玩家进度,两者分离(见核心规则) |
|
| 数值配方本体(所有玩家一致的表) | [数据配置](数据配置.md)——表是配方,存档是玩家进度,两者分离(见核心规则) |
|
||||||
| 局内数值的持久化 | 无——局内系统资源全部单局清零,没有局内数值需要入档(见核心规则的反面清单) |
|
| 局内数值的持久化 | 无——局内系统资源全部单局清零,没有局内数值需要入档(见核心规则的反面清单) |
|
||||||
@@ -56,9 +56,9 @@
|
|||||||
|
|
||||||
第二条边界是反面清单:局内资源不入存档。行动点、储备行动点、道具库存、生命、GP 全部单局清零——各归各的系统管,没有局内数值需要持久化。若未来某局内资源要开放跨局携带(如储备行动点跨战斗携带),须修订其池规则并向本系统登记持久化归属,禁止静默超域。
|
第二条边界是反面清单:局内资源不入存档。行动点、储备行动点、道具库存、生命、GP 全部单局清零——各归各的系统管,没有局内数值需要持久化。若未来某局内资源要开放跨局携带(如储备行动点跨战斗携带),须修订其池规则并向本系统登记持久化归属,禁止静默超域。
|
||||||
|
|
||||||
**唯一豁免 = `breakpoint` 断点域**:断点是冒险进行中的瞬态快照,不是跨局携带——里面的生命/GP/道具库存只在「续玩上局」时还原进局内,冒险收束(冒险成功/失败/放弃)即整域清除,永远不会渗进永久进度。反面清单的管辖对象因此收窄为 `meta` 永久进度域(冒烟域界扫描收窄到 meta 域);断点域自身的字段口径归[冒险结构](../冒险循环/冒险结构.md)登记。断点顶层键(28 键)的登记单源=冒险应用层的断点键表(键→回退策略,键表本体=承载件的常量登记);写读已换代为各件自交片段——主角账/停点件/关卡件各自写读自己的键(缺键回退策略随领域知识归各件),冒险应用层是唯一拼盘落盘口(收齐各件片段拼成顶层快照后写盘,写触发点不变)。**关卡完成停点的同调未用行留存**:`aux_items` 键在此停点形态含同调未用行(「同调行始终留在 treasure_inventory」与「键值形态逐位不变」在关卡完成停点互斥,采行留存;玩家可见 C 区投影零变化,24 停点充能读数逐位一致)。
|
**唯一豁免 = `breakpoint` 断点域**(2026-09-29 迭代 8 卡①顺带修订):断点是冒险进行中的瞬态快照,不是跨局携带——里面的生命/GP/道具库存只在「续玩上局」时还原进局内,冒险收束(通关/失败/放弃)即整域清除,永远不会渗进永久进度。反面清单的管辖对象因此收窄为 `meta` 永久进度域(冒烟域界扫描顺带收窄到 meta 域);断点域自身的字段口径归[冒险结构](../冒险循环/冒险结构.md)登记。断点顶层键(27 键+2026-10-27 迭代 39 获得日记键扩列至 28)的登记单源=冒险应用层的断点键表(键→回退策略;现行契约见架构文档「冒险域拆分」节);写读已换代为各件自交片段——主角账/停点件/关卡件各自写读自己的键(缺键回退策略随领域知识归各件),冒险应用层是唯一拼盘落盘口(收齐各件片段拼成顶层快照后写盘,写触发点不变)。**关卡完成停点的同调未用行留存**(2026-10-27 迭代 39 副卡边界裁定):`aux_items` 键在此停点形态含同调未用行(关卡末清空改选择性保留——「同调行始终留在 treasure_inventory」与「键值形态逐位不变」在关卡完成停点互斥,采行留存;玩家可见 C 区投影零变化,24 停点充能读数逐位一致)。
|
||||||
|
|
||||||
**三存档位**:存档是 3 个独立的 JSON 文件(三个独立存档文件,槽文件名只经存档系统单点派生,槽 1 禁复用旧单档名),字典键一律字符串。写盘目标=当前激活槽的文件;启动(boot)不读任何槽文件——启动态=无激活态,不读写;激活态由选档界面的「新档」或「进档」建立。数据模型(现行 = v7;示例值全为零值默认态):
|
**三存档位(迭代 33 卡①,2026-10-22 反哺写入)**:存档是 3 个独立的 JSON 文件(三个独立存档文件,槽文件名只经存档系统单点派生,槽 1 禁复用旧单档名),字典键一律字符串。写盘目标=当前激活槽的文件;启动(boot)不读任何槽文件——启动态=无激活态,不读写;激活态由选档界面的「新档」或「进档」建立(选档界面归迭代 33 卡③)。数据模型(现行 = v7;示例值全为零值默认态):
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -95,34 +95,34 @@
|
|||||||
| `attune_refresh_level` | 营地刷新升级(Y 源)等级(v4) | [秘宝](../跨局循环/秘宝.md)(三选一刷新双源) |
|
| `attune_refresh_level` | 营地刷新升级(Y 源)等级(v4) | [秘宝](../跨局循环/秘宝.md)(三选一刷新双源) |
|
||||||
| `tree_nodes` | 天赋树已购等级(node_id→int,v5) | [天赋树](../跨局循环/天赋树.md) |
|
| `tree_nodes` | 天赋树已购等级(node_id→int,v5) | [天赋树](../跨局循环/天赋树.md) |
|
||||||
| `fork_sides` | Fork 组激活侧(fork_group→a/b,v5) | [天赋树](../跨局循环/天赋树.md) |
|
| `fork_sides` | Fork 组激活侧(fork_group→a/b,v5) | [天赋树](../跨局循环/天赋树.md) |
|
||||||
| `tree_struct` | 树结构版本标记(缺失 = 换代前结构,加载废弃重置) | [天赋树](../跨局循环/天赋树.md) |
|
| `tree_struct` | 树结构版本标记(迭代 21 T5;缺失 = 换代前结构,加载废弃重置) | [天赋树](../跨局循环/天赋树.md) |
|
||||||
| `recent_summaries` | 最近冒险摘要副本,最新在前,最多 10 条 | [冒险结构](../冒险循环/冒险结构.md) |
|
| `recent_summaries` | 最近冒险摘要副本,最新在前,最多 10 条 | [冒险结构](../冒险循环/冒险结构.md) |
|
||||||
| `first_adventure_done` | 首冒险完成标记(新档默认 false;旧档缺省按已完成兜底) | [元进度](../跨局循环/元进度.md) |
|
| `first_adventure_done` | 首冒险完成标记(新档默认 false;旧档缺省按已完成兜底) | [元进度](../跨局循环/元进度.md) |
|
||||||
| `adventure_total` | 冒险总局数终身计数(开局即计、含放弃与失败,v6) | [生涯](../跨局循环/生涯.md) |
|
| `adventure_total` | 冒险总局数终身计数(开局即计、含放弃与失败,v6) | [生涯](../跨局循环/生涯.md) |
|
||||||
| `adventure_cleared` | 冒险成功局数终身计数(三关全通才计 1,v6;秘宝条件解锁计数键) | [生涯](../跨局循环/生涯.md) |
|
| `adventure_cleared` | 冒险成功局数终身计数(三关全通才计 1,v6;秘宝条件解锁计数键) | [生涯](../跨局循环/生涯.md) |
|
||||||
| `vision_used` | 真视类工具累计使用次数终身计数(信标网络解锁行为条件;**v6 域后扩列补零、不升版本**;写入唯一经真视计数入口,冒险收束聚合入账;断点随件键=`vision_counter_used`,续玩回填缺省 0) | [秘宝](../跨局循环/秘宝.md) |
|
| `vision_used` | 真视类工具累计使用次数终身计数(迭代 22 新增——信标网络解锁行为条件;**v6 域后扩列补零、不升版本**;写入唯一经真视计数入口,冒险收束聚合入账;断点随件键=`vision_counter_used`,续玩回填缺省 0) | [秘宝](../跨局循环/秘宝.md) |
|
||||||
| ~~`forge_levels`~~ | ~~属性锻造三档等级~~ | **已退役**(继任 = 锻造路线等级域) |
|
| ~~`forge_levels`~~ | ~~属性锻造三档等级~~ | **已退役**(迭代 21 T5:域与访问器随攻防所有权切分删除;继任 = 锻造路线等级域) |
|
||||||
| `forge_routes`(**已落地 v7**) | {levels: 六路线等级(sword/spear/staff/light/heavy/ward), unlocked: 直购解锁路线 id 清单, weapon: 当前武器路线 id, armor: 当前甲路线 id};无特效域;旧档缺键补齐 = 初始持有态 | [锻造工坊](../跨局循环/锻造工坊.md) |
|
| `forge_routes`(**已落地 v7——锻造工坊实装批 T5,迭代 23**) | {levels: 六路线等级(sword/spear/staff/light/heavy/ward), unlocked: 直购解锁路线 id 清单, weapon: 当前武器路线 id, armor: 当前甲路线 id};无特效域;旧档缺键补齐 = 初始持有态 | [锻造工坊](../跨局循环/锻造工坊.md) |
|
||||||
| `breakpoint` | 冒险断点快照(停点粒度续玩域;空字典 = 无断点合法态——「继续上局」隐藏) | [冒险结构](../冒险循环/冒险结构.md) |
|
| `breakpoint` | 冒险断点快照(停点粒度续玩域;空字典 = 无断点合法态——「继续上局」隐藏) | [冒险结构](../冒险循环/冒险结构.md) |
|
||||||
|
|
||||||
v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零迁移损失;收束自增域(关卡完成次数/Boss 计数/终身计数/真视使用计数)的唯一入账点 = 冒险摘要入账(vision_used 走真视计数入口收束)。
|
v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零迁移损失;收束自增域(通关次数/Boss 计数/终身计数/真视使用计数)的唯一入账点 = 冒险摘要入账(vision_used 走真视计数入口收束)。**v6 域后扩列不升版先例**:`vision_used`(迭代 22,2026-10-12——迭代 21 同款口径;断点随件 `vision_counter_used` 同批新增;旧断点随件键 `bonus_aux_carry` 已随替换子交互拆除退役,迭代 22 T5)。
|
||||||
|
|
||||||
消费面纪律:其他系统只经存档系统的类型化访问器(读余额/加钥石/花钥石、读写树等级等)与域更新原语(冒险摘要入账)操作存档,不碰内部数据结构。三条槽位纪律:一、无激活态下一切写盘路径拒绝并返回 false(boot 后未进档/未新档即结算或购买=不落盘,激活后照常);二、槽文件名单点派生——消费方禁各自拼槽文件名,测试与探针的隔离走注入口(槽模板注入/摘要窥视);三、UI 读别槽摘要只走窥视 API(不激活、不写内存、零盘面副作用),返回结构 = 可读标记 + 三项摘要值(钥石/关卡完成数/总局数)——可读标记 = 槽文件可读(空槽=零值合法态可读;损坏/高版本/缺版本字段=不可读标记);槽主文件在盘与否不作摘要项、只供操作集二分判定(零 UI 语义),三项摘要值只在可读时有意义。
|
消费面纪律:其他系统只经存档系统的类型化访问器(读余额/加钥石/花钥石、读写树等级等)与域更新原语(冒险摘要入账)操作存档,不碰内部数据结构。三条槽位纪律(迭代 33 卡①):一、无激活态下一切写盘路径拒绝并返回 false(boot 后未进档/未新档即结算或购买=不落盘,激活后照常);二、槽文件名单点派生——消费方禁各自拼槽文件名,测试与探针的隔离走注入口(槽模板注入/摘要窥视);三、UI 读别槽摘要只走窥视 API(不激活、不写内存、零盘面副作用),返回结构 = 可读标记 + 三项摘要值(钥石/通关数/总局数)——可读标记 = 槽文件可读(空槽=零值合法态可读;损坏/高版本/缺版本字段=不可读标记);槽主文件在盘与否不作摘要项、只供操作集二分判定(零 UI 语义),三项摘要值只在可读时有意义。
|
||||||
|
|
||||||
### 读写时机
|
### 读写时机
|
||||||
|
|
||||||
```
|
```
|
||||||
启动 ──▶ 不读盘(boot 无激活态,不读写任何槽;只做一次旧单档迁移,见「版本与迁移」节)
|
启动 ──▶ 不读盘(boot 无激活态,不读写任何槽;只做一次旧单档迁移,见「版本与迁移」节)
|
||||||
选档界面「新档」/「进档」──▶ 建立激活态(读盘=该槽文件)
|
选档界面「新档」/「进档」──▶ 建立激活态(读盘=该槽文件;迭代 33 卡①/卡③)
|
||||||
正式冒险收束 ──▶ 冒险摘要入账 ──▶ 原子写盘(落当前激活槽)
|
正式冒险收束 ──▶ 冒险摘要入账 ──▶ 原子写盘(落当前激活槽)
|
||||||
营地钥石消费 ──▶ 每笔变更后即时写盘(落当前激活槽)
|
营地钥石消费(元进度实现批接线)──▶ 每笔变更后即时写盘(落当前激活槽)
|
||||||
冒险停点(选路停点)──▶ 断点快照写盘
|
冒险停点(选路停点)──▶ 断点快照写盘(迭代 8 卡①)
|
||||||
冒险三结局收束(冒险成功/失败/放弃)──▶ 清除断点 + 原子写盘
|
冒险三结局收束(冒险成功/失败/放弃)──▶ 清除断点 + 原子写盘(迭代 8 卡①/T3 退出口径)
|
||||||
```
|
```
|
||||||
|
|
||||||
写盘时机纪律:**凡钥石发生变动的时刻都要落盘**——正式冒险收束写一次,营地内每笔消费后即时写。这是"钥石不丢"判据的最强保证:任何时刻拔电源,玩家最多丢当前这一局的局内进程,不丢档。
|
写盘时机纪律:**凡钥石发生变动的时刻都要落盘**——正式冒险收束写一次,营地内每笔消费后即时写(元进度实现批接线)。这是"钥石不丢"判据的最强保证:任何时刻拔电源,玩家最多丢当前这一局的局内进程,不丢档。
|
||||||
|
|
||||||
断点写盘纪律:停点快照在每个选路停点(战斗胜利/兑付确认/入口呈现后的选路态)整体覆写——战斗进行中不写(棋盘中局不入档,续玩恢复至最近停点、当场战斗从头打)。因为快照总在每个停点即时落盘,「关游戏走人」在任何停点都不丢续玩进度,无需窗口关闭钩子。
|
断点写盘纪律(迭代 8 卡①):停点快照在每个选路停点(战斗胜利/兑付确认/入口呈现后的选路态)整体覆写——战斗进行中不写(棋盘中局不入档,续玩恢复至最近停点、当场战斗从头打)。因为快照总在每个停点即时落盘,「关游戏走人」在任何停点都不丢续玩进度,无需窗口关闭钩子。
|
||||||
|
|
||||||
写盘是原子操作:先写同目录临时文件,写完改名覆盖正式档——写一半断电不留烂档。
|
写盘是原子操作:先写同目录临时文件,写完改名覆盖正式档——写一半断电不留烂档。
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零
|
|||||||
|
|
||||||
### 版本与迁移
|
### 版本与迁移
|
||||||
|
|
||||||
存档带版本字段(`version`,当前 = **7**;版本沿革:v2 = 断点域出生 → v3 = 断点附随件扩列 + 摘要 keystone_drops → v4 = 同调扩域〔boss_kill_count / attunement_equipped / attune_refresh_level〕→ v5 = 天赋树域〔tree_nodes / fork_sides〕→ v6 = 生涯终身计数域〔adventure_total / adventure_cleared〕→ **v7 = 锻造工坊域〔forge_routes:{levels 六路线等级 + unlocked 直购解锁清单 + weapon/armor 当前选中标记},无特效域;旧档缺键按默认补齐 = 初始持有态(sword/light 在档、余四锁、选中=初始路线),v6→v7 空迁移 = 缺键补齐模式(v3→v4 先例);开发阶段禁迁移禁折算——契约 4〕**)。三条走向:
|
存档带版本字段(`version`,当前 = **7**;版本沿革:v2 = 断点域出生〔迭代 8 卡①〕→ v3 = 断点附随件扩列 + 摘要 keystone_drops〔迭代 10 奖励重构〕→ v4 = 同调批扩域〔boss_kill_count / attunement_equipped / attune_refresh_level,迭代 11 第①批〕→ v5 = 天赋树域〔tree_nodes / fork_sides,迭代 12〕→ v6 = 生涯终身计数域〔adventure_total / adventure_cleared,迭代 18 卡④〕→ **v7 = 锻造工坊域〔forge_routes,迭代 23 T5——已落地:{levels 六路线等级 + unlocked 直购解锁清单 + weapon/armor 当前选中标记},无特效域;旧档缺键按默认补齐 = 初始持有态(sword/light 在档、余四锁、选中=初始路线),v6→v7 空迁移 = 缺键补齐模式(v3→v4 先例);开发阶段禁迁移禁折算——契约 4〕**)。三条走向:
|
||||||
|
|
||||||
| 情形 | 处置 |
|
| 情形 | 处置 |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -138,9 +138,9 @@ v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零
|
|||||||
| 版本更高(未来版本的档) | **拒读且禁写**:不加载、后续写盘一律拒绝、内存以默认新档运行——保护未来版本的档不被当前版本覆写 |
|
| 版本更高(未来版本的档) | **拒读且禁写**:不加载、后续写盘一律拒绝、内存以默认新档运行——保护未来版本的档不被当前版本覆写 |
|
||||||
| 版本更低(旧档) | 读档时逐级迁移:从旧版本起逐个调用注册的迁移函数升到当前版本;任一步失败按损坏兜底处理 |
|
| 版本更低(旧档) | 读档时逐级迁移:从旧版本起逐个调用注册的迁移函数升到当前版本;任一步失败按损坏兜底处理 |
|
||||||
|
|
||||||
迁移函数按旧版本号逐一注册:函数把数据从「旧版本」改写成「旧版本 + 1」。生产迁移链现行六件(v2 起自注册):v1→v2 = 断点域补空;v2→v3 = 断点附随件与摘要 keystone_drops 补键(读取方 .get 兜底);v3→v4 = 同调三域补键;v4→v5 = 树域两键补齐(forge_levels 旧域清退,加载时按默认模型键集白名单收窄);v5→v6 = 生涯两终身计数域补零;**v6→v7 = 锻造工坊域 forge_routes 缺键补齐(无结构迁移体,版本号推进仅随表结构变化;解锁态派生不落档:初始持有〔表 initial_owned〕∨ 直购〔unlocked 清单〕∨ 练满前一档〔levels[prereq]≥cap〕)**。任一步失败按损坏兜底处理。
|
迁移函数按旧版本号逐一注册:函数把数据从「旧版本」改写成「旧版本 + 1」。生产迁移链现行六件(v2 起自注册):v1→v2 = 断点域补空;v2→v3 = 断点附随件与摘要 keystone_drops 补键(读取方 .get 兜底);v3→v4 = 同调三域补键;v4→v5 = 树域两键补齐(原挂接的「三体系迁移」体已随迭代 21 T5 攻防所有权切分删除;forge_levels 旧域同批清退,加载时按默认模型键集白名单收窄);v5→v6 = 生涯两终身计数域补零;**v6→v7 = 锻造工坊域 forge_routes 缺键补齐(迭代 23 T5——无结构迁移体,版本号推进仅随表结构变化;解锁态派生不落档:初始持有〔表 initial_owned〕∨ 直购〔unlocked 清单〕∨ 练满前一档〔levels[prereq]≥cap〕)**。任一步失败按损坏兜底处理。
|
||||||
|
|
||||||
旧单档一次性迁移:本系统从单档制换代为 3 存档位制时,盘上残留的旧单档文件在启动时被处理——文件**字节级原样搬运**进槽 1(零解析零改造:损坏或高版本的旧档也原样迁入,之后由该槽进档时的损坏兜底/高版本拒读接管,不静默丢数据),源文件改名留痕不删;槽 1 文件已存在则不重迁(幂等,二次启动零操作);迁移失败(拷贝或改名失败)源文件保留、下次启动重试。留痕与结果记在启动日志(开发者向,非玩家面)。
|
旧单档一次性迁移(迭代 33 卡①,用户裁决 Q1 甲):本系统从单档制换代为 3 存档位制时,盘上残留的旧单档文件在启动时被处理——文件**字节级原样搬运**进槽 1(零解析零改造:损坏或高版本的旧档也原样迁入,之后由该槽进档时的损坏兜底/高版本拒读接管,不静默丢数据),源文件改名留痕不删;槽 1 文件已存在则不重迁(幂等,二次启动零操作);迁移失败(拷贝或改名失败)源文件保留、下次启动重试。留痕与结果记在启动日志(开发者向,非玩家面)。
|
||||||
|
|
||||||
### 损坏兜底
|
### 损坏兜底
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零
|
|||||||
| 方向 | 系统 / 文档 | 接口要点 |
|
| 方向 | 系统 / 文档 | 接口要点 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 下游 | [元进度](../跨局循环/元进度.md) | 钥石余额、锻造等级、关卡完成次数、首杀标记的持久化承载方;对方以"钥石不丢"为验收,本系统以不破坏它为约束 |
|
| 下游 | [元进度](../跨局循环/元进度.md) | 钥石余额、锻造等级、关卡完成次数、首杀标记的持久化承载方;对方以"钥石不丢"为验收,本系统以不破坏它为约束 |
|
||||||
| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 冒险摘要五件事副本入档(cap 10);快照与复盘的持久化承接 |
|
| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 冒险摘要五件事副本入档(cap 10);快照与复盘的持久化承接 P1 后置 |
|
||||||
| 协作 | [数据配置](数据配置.md) | 表与档分家:数值口径永远以加载时的表为准 |
|
| 协作 | [数据配置](数据配置.md) | 表与档分家:数值口径永远以加载时的表为准 |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
@@ -164,8 +164,8 @@ MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)把单
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| ~~P1~~ | ~~快照与复盘的持久化承接~~ | **已兑现**(断点域承载 + rng「主种子+计数器」快照契约回填面) |
|
| ~~P1~~ | ~~快照与复盘的持久化承接~~ | **已兑现**(2026-09-29 迭代 8 卡①:断点域承载 + rng「主种子+计数器」快照契约回填面) |
|
||||||
| ~~P2~~ | ~~多存档槽位~~ | **已实现**(3 存档位三文件制,口径见「三存档位」段) |
|
| ~~P2~~ | ~~多存档槽位~~ | **已实现**(2026-10-22 迭代 33 卡①——3 存档位三文件制落地,口径见「三存档位」段;原「单档 MVP(2026-09-21 裁决)」后置条随兑现注销) |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
@@ -177,8 +177,8 @@ MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)把单
|
|||||||
- 钥石不丢:写入、读回与迁移禁止破坏[元进度](../跨局循环/元进度.md)的钥石只增不减判据;余额不足的消费被拒绝且无副作用(冒烟承载)。
|
- 钥石不丢:写入、读回与迁移禁止破坏[元进度](../跨局循环/元进度.md)的钥石只增不减判据;余额不足的消费被拒绝且无副作用(冒烟承载)。
|
||||||
- 高版本拒读禁写:高版本档加载被拒、原文件字节不动、后续写盘被拒且文件仍字节不动(冒烟承载)。
|
- 高版本拒读禁写:高版本档加载被拒、原文件字节不动、后续写盘被拒且文件仍字节不动(冒烟承载)。
|
||||||
- 改版不弃档:旧版本档经迁移链读回;低版本档缺新域按默认补齐,既有值保留(冒烟承载)。
|
- 改版不弃档:旧版本档经迁移链读回;低版本档缺新域按默认补齐,既有值保留(冒烟承载)。
|
||||||
- 断点域契约:七字段拍板面写读往返逐位一致;旧档无断点域迁移为合法空态;三结局清除(冒烟+单测承载)。
|
- 断点域契约(迭代 8 卡①):七字段拍板面写读往返逐位一致;旧档无断点域迁移为合法空态;三结局清除(冒烟+单测承载)。
|
||||||
- 域界干净:meta 永久进度域不含局内系统资源键(行动点/储备行动点/道具库存/生命/GP)——断点域按豁免条款单列(冒烟承载)。
|
- 域界干净:meta 永久进度域不含局内系统资源键(行动点/储备行动点/道具库存/生命/GP)——断点域按豁免条款单列(冒烟承载,2026-09-29 卡①修订)。
|
||||||
- 零玩法依赖:存档系统不引入任何玩法脚本、不碰数值表与随机服务,可独立实例化验证(冒烟独立段承载)。
|
- 零玩法依赖:存档系统不引入任何玩法脚本、不碰数值表与随机服务,可独立实例化验证(冒烟独立段承载)。
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ HUD 框架定稿时已为教学留好两个承载位,本系统的内容将来
|
|||||||
| 条目 | 来源 | 要教的事 |
|
| 条目 | 来源 | 要教的事 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 行动点价目 | [行动经济](../排雷循环/行动经济.md) | 挖 / 封印各花多少、移动与连锁免费 |
|
| 行动点价目 | [行动经济](../排雷循环/行动经济.md) | 挖 / 封印各花多少、移动与连锁免费 |
|
||||||
| 储备池清零提示 | [行动经济](../排雷循环/行动经济.md) | 必须说清"储备行动点整局冒险保留、冒险收束才清零",防止"攒的钱凭空没了"的误读 |
|
| 储备池清零提示 | [行动经济](../排雷循环/行动经济.md) | 必须说清"储备行动点在战斗结束时清零",防止"攒的钱凭空没了"的误读 |
|
||||||
| 封印是一次性承诺的首遇提示 | [排雷玩法](../排雷循环/排雷玩法.md)(封印受理即揭示口径 2026-11-07) | 经典扫雷玩家会习惯性右键拔除标记——本作封印印记不能拔,落子就是承诺:受理即揭示,封中还是封空当场可见,没有反悔路径(封错的代价=轮末标空负向兑付,印记随图存续)。每场冒险提示一次,非模态 |
|
| 封印是一次性承诺的首遇提示 | [排雷玩法](../排雷循环/排雷玩法.md)(封印不可逆批 2026-09-19) | 经典扫雷玩家会习惯性右键拔除标记——本作封印印记不能拔,落子就是承诺;想改主意就左键直接挖开(安全格零奖励、危险格受挖掘惩罚)。每场冒险提示一次,非模态 |
|
||||||
| chord 不存在的首遇提示 | [HUD 框架](HUD框架.md)(承接排雷玩法的呈现义务) | 经典扫雷玩家会习惯性双击数字格——本作没有 chord,点数字格 = 移动小人。每场冒险提示一次,非模态 |
|
| chord 不存在的首遇提示 | [HUD 框架](HUD框架.md)(承接排雷玩法的呈现义务) | 经典扫雷玩家会习惯性双击数字格——本作没有 chord,点数字格 = 移动小人。每场冒险提示一次,非模态 |
|
||||||
| 挖非相邻格的首次提示 | [HUD 框架](HUD框架.md) | 挖与封印都限小人 8 向相邻的格子,第一次越界操作时提示 |
|
| 挖非相邻格的首次提示 | [HUD 框架](HUD框架.md) | 挖与封印都限小人 8 向相邻的格子,第一次越界操作时提示 |
|
||||||
| 增益叠层节奏 | [增益状态](../战斗循环/增益状态.md) | "同一轮拿满优于跨轮慢慢叠"——增益有结算次数衰减,教学要传达这个节奏 |
|
| 增益叠层节奏 | [增益状态](../战斗循环/增益状态.md) | "同一轮拿满优于跨轮慢慢叠"——增益有结算次数衰减,教学要传达这个节奏 |
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 数据配置
|
# 数据配置
|
||||||
|
|
||||||
> 一句话:数值表与单一事实源管线
|
> 一句话:数值表与单一事实源管线
|
||||||
> 状态:已定稿;现行为 v1.4
|
> 状态:已定稿(自旧体系迁移);现行为 v1.1
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 行动经济表 | 每轮行动点、动作价目、停手与刷新门槛 | [行动经济](../排雷循环/行动经济.md) |
|
| 行动经济表 | 每轮行动点、动作价目、停手与刷新门槛 | [行动经济](../排雷循环/行动经济.md) |
|
||||||
| 棋盘生成参数表 | 板尺寸、雷密度、可推理率目标等(进度键表) | [棋盘生成](../排雷循环/棋盘生成.md) |
|
| 棋盘生成参数表 | 板尺寸、雷密度、可推理率目标等(进度键表) | [棋盘生成](../排雷循环/棋盘生成.md) |
|
||||||
| 变异表 | 变异类型清单(现行六行:region 六行两轴×三关;global 整图型贫矿脉行已删,global 型机制代码保留) | [地形变异](../排雷循环/地形变异.md) |
|
| 变异表 | 变异类型清单(现行六行:region 六行两轴×三关〔2026-09-20 落地〕;首发 global 整图型贫矿脉 2026-10-16 用户令屏蔽删行,global 型机制代码保留) | [地形变异](../排雷循环/地形变异.md) |
|
||||||
| 敌人表 | 敌种基线数值、遭遇数量区间、护甲类型、技能池模板(进度键表) | [敌人系统](../战斗循环/敌人系统.md) |
|
| 敌人表 | 敌种基线数值、遭遇数量区间、护甲类型、技能池模板(进度键表) | [敌人系统](../战斗循环/敌人系统.md) |
|
||||||
| 技能表 | 技能行定义(类型/倍率/冷却/增益引用/触发条件)与保底阈值 | [敌人系统](../战斗循环/敌人系统.md) |
|
| 技能表 | 技能行定义(类型/倍率/冷却/增益引用/触发条件)与保底阈值 | [敌人系统](../战斗循环/敌人系统.md) |
|
||||||
| 主角表 | 主角生命上限、基础攻击与护甲等级(armor_class)等单行战斗数值 | [敌人系统](../战斗循环/敌人系统.md) |
|
| 主角表 | 主角生命上限、基础攻击与护甲等级(armor_class)等单行战斗数值 | [敌人系统](../战斗循环/敌人系统.md) |
|
||||||
@@ -69,8 +69,8 @@
|
|||||||
| 难度表 | 难度修饰乘数(占位空表) | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
| 难度表 | 难度修饰乘数(占位空表) | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) |
|
||||||
| 关卡表 | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) |
|
| 关卡表 | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) |
|
||||||
| 冒险表 | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) |
|
| 冒险表 | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) |
|
||||||
| 元进度表 | 元进度字段(现行五行族:属性锻造 / Boss 钥石 / 工坊阈值 / 换算率 / 同调刷新升级行族) | [元进度](../跨局循环/元进度.md) |
|
| 元进度表 | 元进度字段(已建表 2026-09-21——现行五行族:属性锻造 / Boss 钥石 / 工坊阈值 / 换算率 / 同调刷新升级行族,顺带扩列) | [元进度](../跨局循环/元进度.md) |
|
||||||
| 战斗屏布局表(`battle_layout.tres`) | 分区几何、B 区连续地面层高与明细带两态高(单行;呈现层布局配置,非玩法数值——供呈现层与样张工具同源读取) | [战斗屏规格](../../../ux/battle.md)(结构)/[HUD框架](HUD框架.md)(呈现常量) |
|
| 战斗屏布局表(`battle_layout.tres`) | 分区几何与明细带两态高(单行;呈现层布局配置,非玩法数值——供呈现层与样张工具同源读取) | [战斗屏规格](../../ux/battle.md)(结构)/[HUD框架](HUD框架.md)(呈现常量) |
|
||||||
|
|
||||||
举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。
|
举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
|
|
||||||
全项目的随机数只经随机服务的统一流发放(2026-09-27 用户两轮复裁,七流并一并加全事件日志)。统一流(本文含义:唯一主种子 + 唯一派生公式〔单盐〕+ 唯一全局取数计数器)是对"随机即失控"的制度化设防:玩法代码禁止自建随机源、禁止调用全局随机函数。目的只有一个——同一条主种子(master_seed,一场冒险的随机源头数字,由冒险结构在冒险开始时注入,仅全局计数器归零时受理)驱动下,相同决策序列必然跑出相同结果,这是回放、审计与自动化测试共同的立足点。
|
全项目的随机数只经随机服务的统一流发放(2026-09-27 用户两轮复裁,七流并一并加全事件日志)。统一流(本文含义:唯一主种子 + 唯一派生公式〔单盐〕+ 唯一全局取数计数器)是对"随机即失控"的制度化设防:玩法代码禁止自建随机源、禁止调用全局随机函数。目的只有一个——同一条主种子(master_seed,一场冒险的随机源头数字,由冒险结构在冒险开始时注入,仅全局计数器归零时受理)驱动下,相同决策序列必然跑出相同结果,这是回放、审计与自动化测试共同的立足点。
|
||||||
|
|
||||||
取号按用途标签记账。用途标签(本文含义:取号时声明的用途名,只进事件日志、不参与种子派生)沿用七条流名作封闭词表——标签让日志可读,也让"哪类事件在什么时机取号"仍保有登记位:
|
取号按用途标签记账。用途标签(本文含义:取号时声明的用途名,只进事件日志、不参与种子派生)沿用并流前七条流名作封闭词表——标签让日志可读,也让"哪类事件在什么时机取号"仍保有登记位:
|
||||||
|
|
||||||
| 用途标签 | 消费方 | 用途:何时取号 |
|
| 用途标签 | 消费方 | 用途:何时取号 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
|
|
||||||
取数有两个入口。玩法代码用取号入口:每调用一次,全局计数器加一并派生新种子,同一事件内共享同一实例。测试与预览用纯函数入口:按指定全局序号计算种子、不推计数器——预览不污染正式序列。种子由登记的派生公式计算(单盐),纯函数、跨引擎版本恒定,并登记了可复算的黄金向量。
|
取数有两个入口。玩法代码用取号入口:每调用一次,全局计数器加一并派生新种子,同一事件内共享同一实例。测试与预览用纯函数入口:按指定全局序号计算种子、不推计数器——预览不污染正式序列。种子由登记的派生公式计算(单盐),纯函数、跨引擎版本恒定,并登记了可复算的黄金向量。
|
||||||
|
|
||||||
全事件日志:冒险开始即开日志会话(随机事件日志文件,每主种子一份),每次取数落一行——全局序号、用途标签、派生种子。号位在全序账本下不再单独回答"第 N 次某类事件"(路线依赖为已裁决代价),单点定位与复盘由日志承载。写盘失败只告警降级,不致命、不影响玩法随机。
|
全事件日志(并流批新增):冒险开始即开日志会话(随机事件日志文件,每主种子一份),每次取数落一行——全局序号、用途标签、派生种子。号位在全序账本下不再单独回答"第 N 次某类事件"(路线依赖为已裁决代价),单点定位与复盘由日志承载。写盘失败只告警降级,不致命、不影响玩法随机。
|
||||||
|
|
||||||
生命周期:进程启动后流待命(未注入主种子就取数,致命中止,禁止默认种子兜底)→ 冒险开始注入主种子并开日志会话 → 冒险中按事件取号(全局计数器只增不重置)→ 冒险结束流保留供复盘。续玩与复盘的快照 = 主种子加全局取数计数器,由[存档序列化](存档序列化.md)消费;快照切出须发生在没有在用取号实例的时刻。要新增随机用途(含战斗内随机),走扩签通道:改代码加用途标签并通过评审——词表封闭是刻意的设卡。
|
生命周期:进程启动后流待命(未注入主种子就取数,致命中止,禁止默认种子兜底)→ 冒险开始注入主种子并开日志会话 → 冒险中按事件取号(全局计数器只增不重置)→ 冒险结束流保留供复盘。续玩与复盘的快照 = 主种子加全局取数计数器,由[存档序列化](存档序列化.md)消费;快照切出须发生在没有在用取号实例的时刻。要新增随机用途(含战斗内随机),走扩签通道:改代码加用途标签并通过评审——词表封闭是刻意的设卡。
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
|
|
||||||
| 错误类别 | 什么情况 | 处置 |
|
| 错误类别 | 什么情况 | 处置 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 加载期校验错误 | 字段越界、类型不符、表为空、缺入口锚行、重复键、权重和为零、悬空引用、跨表量级越界、段序违例 | 收集后统一显示错误,致命中止并输出错误清单 |
|
| 加载期校验错误 | 字段越界、类型不符、表为空、缺入口锚行、重复键、权重和为零、悬空引用、段序违例 | 收集后统一显示错误,致命中止并输出错误清单 |
|
||||||
| 运行期致命 | 进度坐标越域请求、未设主种子就取随机数 | 不分构建走致命错误路径;无窗口模式进程非 0 退出 |
|
| 运行期致命 | 进度坐标越域请求、未设主种子就取随机数 | 不分构建走致命错误路径;无窗口模式进程非 0 退出 |
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -119,23 +119,9 @@
|
|||||||
|
|
||||||
举证:本节为校验纪律约定,无计算。逐表引用字段的登记见各回填责任方文档。
|
举证:本节为校验纪律约定,无计算。逐表引用字段的登记见各回填责任方文档。
|
||||||
|
|
||||||
### 跨表量级校验:组合数值的上界不得突破目标字段的取值域
|
|
||||||
|
|
||||||
单表校验各管各的字段取值域,但两张表各自合法取值,组合起来仍可能量级失控:敌人攻击取域内高位、难度攻击乘数也取域内高位,乘出来的实际攻击可以远超主角生命任何可能的取值。跨表量级校验在加载期把这类组合拦下。它只查取值域之间的量级相容性,不查玩法平衡——数值定得合不合理归各回填责任方与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md),本校验只问组合结果是否突破结构上可能的上界。
|
|
||||||
|
|
||||||
现行激活的量级检查一条:
|
|
||||||
|
|
||||||
| 检查 | 组合式 | 上界 | 越界处置 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 敌人攻击 × 难度攻击乘数 | 敌人表每行攻击上界(有攻击区间取区间上限,否则取基值)× 难度表全行攻击乘数的最大值(越域乘数按域边界值计) | 主角表生命上限字段的取值域上界 | 加载期校验错误,致命中止 |
|
|
||||||
|
|
||||||
难度表为空表时跳过本检查:零乘数修饰即攻击不放大,单表域校验已覆盖。Boss 数值走行值直填、不经难度表,其攻击上界就是行值本身,单表域校验已覆盖,不另查。各取值域的具体数值归表结构声明(game/data/schemas/),本文不转载。
|
|
||||||
|
|
||||||
举证:本节为校验纪律约定,无计算。
|
|
||||||
|
|
||||||
### 进度坐标查行:跟着冒险进度成长的表带两维坐标
|
### 进度坐标查行:跟着冒险进度成长的表带两维坐标
|
||||||
|
|
||||||
跟着冒险进度成长的表(难度、生成参数、敌人配置)每行带(关卡序号 × 节点深度)两维坐标——难度曲线的雕刻轴从第一天就留在表结构层,而不是散落各处的魔法数字。解析规则两条:其一,进度坐标向上取整(2026-09-18 用户拍板)——无精确行时取**不低于**请求坐标的最近已有行并留一条警告(警告按"哪张表、缺哪维、停在哪个键"去重,是开发期异常信号而非审计工具);取整方向的理由是**保证偏难**:宁可在内容缺口上高估难度让工具读数保守,不可静默降难掩盖断档;请求坐标低于合法域(关卡序号 <1、节点深度 <0)不属于取整,走运行期致命;请求高于最大已有行时**取最大已有行封顶**(2026-09-18 追加拍板:可取范围内向上取整,超出最大值就用最大值,封顶同样留警告)。其二,实体键精确匹配,那一行没有这个名字就是悬空引用,直接致命中止——进度可以向上近似,"是哪种敌人"不能近似,身份近似会静默改变遭遇构成。
|
跟着冒险进度成长的表(难度、生成参数、敌人配置)每行带(关卡序号 × 节点深度)两维坐标——难度曲线的雕刻轴从第一天就留在表结构层,而不是散落各处的魔法数字。解析规则两条:其一,进度坐标向上取整(2026-09-18 用户拍板修订,原「就近向下」退役)——无精确行时取**不低于**请求坐标的最近已有行并留一条警告(警告按"哪张表、缺哪维、停在哪个键"去重,是开发期异常信号而非审计工具);取整方向的理由是**保证偏难**:宁可在内容缺口上高估难度让工具读数保守,不可静默降难掩盖断档;请求坐标低于合法域(关卡序号 <1、节点深度 <0)不属于取整,走运行期致命;请求高于最大已有行时**取最大已有行封顶**(2026-09-18 追加拍板:可取范围内向上取整,超出最大值就用最大值,封顶同样留警告)。其二,实体键精确匹配,那一行没有这个名字就是悬空引用,直接致命中止——进度可以向上近似,"是哪种敌人"不能近似,身份近似会静默改变遭遇构成。
|
||||||
|
|
||||||
三条配套边界。每关必须含深度 0 的锚行(关卡入口行),缺失即加载期致命,防止入口请求静默落到深处行造成难度突刺。请求越域(关卡序号小于 1 或深度为负)在进入解析前致命中止。没有兜底行、没有外推:超过表范围的成长外推归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的公式职责,本系统只解析到最近已有行——解析永不发明数据。
|
三条配套边界。每关必须含深度 0 的锚行(关卡入口行),缺失即加载期致命,防止入口请求静默落到深处行造成难度突刺。请求越域(关卡序号小于 1 或深度为负)在进入解析前致命中止。没有兜底行、没有外推:超过表范围的成长外推归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的公式职责,本系统只解析到最近已有行——解析永不发明数据。
|
||||||
|
|
||||||
@@ -188,7 +174,7 @@
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P1 | 战斗级可回放闭环测试(同主种子同动作序列,步骤流逐行相同) | 需战斗域载体,随[战斗结算](../战斗循环/战斗结算.md)回放验收兑现 |
|
| P1 | 战斗级可回放集成测试(同主种子同动作序列,步骤流逐行相同) | 需战斗域载体,随[战斗结算](../战斗循环/战斗结算.md)回放验收兑现 |
|
||||||
| P1 | 难度曲线导出工具(无窗口导出行解析矩阵供比对) | 难度审计的离线载体,[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)期交付物 |
|
| P1 | 难度曲线导出工具(无窗口导出行解析矩阵供比对) | 难度审计的离线载体,[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)期交付物 |
|
||||||
| P2 | 正式包构建的致命表现验证与调试覆盖结构性不存在验证 | 挂首次正式导出检查清单 |
|
| P2 | 正式包构建的致命表现验证与调试覆盖结构性不存在验证 | 挂首次正式导出检查清单 |
|
||||||
| P2 | 进度键表的调试覆盖行寻址语法 | 调试覆盖现只支持单行全局表字段,行寻址登记为后续扩展 |
|
| P2 | 进度键表的调试覆盖行寻址语法 | 调试覆盖现只支持单行全局表字段,行寻址登记为后续扩展 |
|
||||||
@@ -202,16 +188,14 @@
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 表路径清单 | data/tables/ 固定(调试注入根除外) | 冻结:散装路径破坏单点访问 |
|
| 表路径清单 | data/tables/ 固定(调试注入根除外) | 冻结:散装路径破坏单点访问 |
|
||||||
| 随机流口径 | 统一流单盐单计数器 + 七用途标签封闭词表 | 统一口径为 2026-09-27 裁决;扩签 = 改代码 + 评审,有意设卡 |
|
| 随机流口径 | 统一流单盐单计数器 + 七用途标签封闭词表 | 统一口径为 2026-09-27 裁决;扩签 = 改代码 + 评审,有意设卡 |
|
||||||
| 进度坐标解析策略 | 可取范围内向上取整 + 警告(保证偏难);超出最大行封顶取最大值 + 警告;域越界致命(2026-09-18 两段拍板) | 冻结:静默降难会掩盖难度断档 |
|
| 进度坐标解析策略 | 可取范围内向上取整 + 警告(保证偏难);超出最大行封顶取最大值 + 警告;域越界致命(2026-09-18 两段拍板,原「就近向下」退役) | 冻结:静默降难会掩盖难度断档 |
|
||||||
| 入口锚行校验 | 写死开 | 非调参项;重议走文档修订流程 |
|
| 入口锚行校验 | 写死开 | 非调参项;重议走文档修订流程 |
|
||||||
| 跨表量级校验 | 写死开 | 非调参项;重议走文档修订流程 |
|
|
||||||
| 调试覆盖开关 | 仅调试构建,默认关 | 正式构建结构性不存在;覆盖值永不回写表文件 |
|
| 调试覆盖开关 | 仅调试构建,默认关 | 正式构建结构性不存在;覆盖值永不回写表文件 |
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
- 干净检出:无窗口冒烟脚本从干净检出启动,表清单内全部表加载成功且表目录无清单外文件;任一失败输出错误清单并退出非 0。
|
- 干净检出:无窗口冒烟脚本从干净检出启动,表清单内全部表加载成功且表目录无清单外文件;任一失败输出错误清单并退出非 0。
|
||||||
- 校验类别全覆盖:越界、文件缺失、空表、缺锚行、重复键、权重和为零、悬空引用、跨表量级越界各有一份测试夹具,逐类断言错误类别。
|
- 校验类别全覆盖:越界、文件缺失、空表、缺锚行、重复键、权重和为零、悬空引用各有一份测试夹具,逐类断言错误类别。
|
||||||
- 跨表量级护栏:敌人攻击上界与难度攻击乘数最大值的组合超过主角生命上限取值域上界时,加载期报对应错误类别并致命中止;合法组合与空难度表零误报。
|
|
||||||
- 致命真的会死:任一致命夹具经正式通道加载,进程非 0 退出,而非仅"校验器能发现"。
|
- 致命真的会死:任一致命夹具经正式通道加载,进程非 0 退出,而非仅"校验器能发现"。
|
||||||
- 黄金向量:随机派生纯函数对登记向量逐个复算相等;同输入恒同输出;同序号重复调用恒等。
|
- 黄金向量:随机派生纯函数对登记向量逐个复算相等;同输入恒同输出;同序号重复调用恒等。
|
||||||
- 计数器纪律:连续取号跨模拟关卡切换,计数器单调不重置;热重载成败都不改变主种子与计数器。
|
- 计数器纪律:连续取号跨模拟关卡切换,计数器单调不重置;热重载成败都不改变主种子与计数器。
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 设置与本地化
|
# 设置与本地化
|
||||||
|
|
||||||
> 一句话:设置项与多语言
|
> 一句话:设置项与多语言
|
||||||
> 状态:范围草案·最小设置面已兑现;现行为 v1.2
|
> 状态:范围草案·最小设置面已兑现(2026-09-29 迭代 8 卡④);现行为 v1.1
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
@@ -28,9 +28,9 @@
|
|||||||
| 不负责 | 归谁 |
|
| 不负责 | 归谁 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 呈现语义与可访问性基线本体(字号下限、闪烁上限、纯鼠标可玩等) | [HUD 框架](HUD框架.md) |
|
| 呈现语义与可访问性基线本体(字号下限、闪烁上限、纯鼠标可玩等) | [HUD 框架](HUD框架.md) |
|
||||||
| 逐行结算的呈现规则 | [battle.md](../../../ux/battle.md) 与 [HUD 框架](HUD框架.md),本文只引用 |
|
| 逐行结算的呈现规则 | [battle.md](../../ux/battle.md) 与 [HUD 框架](HUD框架.md),本文只引用 |
|
||||||
| 减动效开启后动画怎么演 | [战斗表现](../战斗循环/战斗表现.md)——本文提供开关,动画侧兑现归对方 |
|
| 减动效开启后动画怎么演 | [战斗表现](../战斗循环/战斗表现.md)——本文提供开关,动画侧兑现归对方 |
|
||||||
| 音量调节对声音怎么生效 | [音频](音频.md)——生效侧归对方,口径已对齐 |
|
| 音量调节对声音怎么生效 | [音频](音频.md)——生效侧归对方,口径已对齐(2026-09-18 音频成文) |
|
||||||
| 文案内容本体(教学条目、界面用语等写了什么) | 各系统文档——本文只做翻译生产,不改含义 |
|
| 文案内容本体(教学条目、界面用语等写了什么) | 各系统文档——本文只做翻译生产,不改含义 |
|
||||||
| 数值调试工具(TunePanel 的另一半去向) | [元进度](../跨局循环/元进度.md) |
|
| 数值调试工具(TunePanel 的另一半去向) | [元进度](../跨局循环/元进度.md) |
|
||||||
| 设置界面的布局与呈现 | [HUD 框架](HUD框架.md) |
|
| 设置界面的布局与呈现 | [HUD 框架](HUD框架.md) |
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
|
|
||||||
| 输入 | 登记处 | 将来要做的 |
|
| 输入 | 登记处 | 将来要做的 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 减动效开关 | [HUD 框架](HUD框架.md)的可访问性基线与 [battle.md](../../../ux/battle.md)的呈现承诺;[战斗表现](../战斗循环/战斗表现.md)已登记承接其动画侧 | 提供开关:开启后全部动画有时长减半或直达终态的通路。呈现侧的约束以 battle.md 与 HUD 框架为权威,本文不复述 |
|
| 减动效开关 | [HUD 框架](HUD框架.md)的可访问性基线与 [battle.md](../../ux/battle.md)的呈现承诺;[战斗表现](../战斗循环/战斗表现.md)已登记承接其动画侧 | 提供开关:开启后全部动画有时长减半或直达终态的通路。呈现侧的约束以 battle.md 与 HUD 框架为权威,本文不复述 |
|
||||||
| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)已登记同款分工 | 在设置里提供音量入口;生效侧归音频(口径已对齐) |
|
| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)已登记同款分工 | 在设置里提供音量入口;生效侧归音频(口径已对齐) |
|
||||||
| 键位映射表 | [HUD 框架](HUD框架.md)定稿登记的交付物输入(全键族) | 如何转化成设置项(比如是否允许改键)待设计 |
|
| 键位映射表 | [HUD 框架](HUD框架.md)定稿登记的交付物输入(全键族) | 如何转化成设置项(比如是否允许改键)待设计 |
|
||||||
| 结算风味词 | 归档概念层增补批随巢穴隐喻换轴登记("封印 / 镇 / 反制"一类类型风味词),只登记了存在、各归各的时机 | 内容与形态未定,本文只登记这条输入在 |
|
| 结算风味词 | 归档概念层增补批随巢穴隐喻换轴登记("封印 / 镇 / 反制"一类类型风味词),只登记了存在、各归各的时机 | 内容与形态未定,本文只登记这条输入在 |
|
||||||
@@ -92,7 +92,7 @@ MVP 不要求本系统的闭环:[不做清单](../../05-不做清单.md)把设
|
|||||||
|
|
||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| ~~P1~~ | ~~已承诺设置项落位:减动效开关、音量控制入口~~ | **已兑现**(最小设置面:音量 master bus 实时+持久、减动效开关转正〔测试调整板旧开关退役,设置面唯一入口〕、全屏切换、退出游戏;载体=独立设置存储 + 设置界面视图(一安装一份,不进存档);键位映射/多语言仍按后置表排期) |
|
| ~~P1~~ | ~~已承诺设置项落位:减动效开关、音量控制入口~~ | **已兑现**(2026-09-29 迭代 8 卡④最小设置面:音量 master bus 实时+持久、减动效开关转正〔测试调整板旧开关退役,设置面唯一入口〕、全屏切换、退出游戏;载体=独立设置存储 + 设置界面视图(一安装一份,不进存档);键位映射/多语言仍按后置表排期) |
|
||||||
| P1 | 多语言生产流程与首批语言清单 | 生产流程未定:文案怎么管理、谁负责校对 |
|
| P1 | 多语言生产流程与首批语言清单 | 生产流程未定:文案怎么管理、谁负责校对 |
|
||||||
| P2 | 设置项全集(画面 / 键位 / 可访问性 / 语言各类别) | 全集无来源,待设计问题清单裁决后展开 |
|
| P2 | 设置项全集(画面 / 键位 / 可访问性 / 语言各类别) | 全集无来源,待设计问题清单裁决后展开 |
|
||||||
| P2 | 结算风味词输入的承接 | 归档只登记了存在,各归各的时机 |
|
| P2 | 结算风味词输入的承接 | 归档只登记了存在,各归各的时机 |
|
||||||
@@ -117,7 +117,7 @@ MVP 不要求本系统的闭环:[不做清单](../../05-不做清单.md)把设
|
|||||||
## 待设计问题清单
|
## 待设计问题清单
|
||||||
|
|
||||||
1. 设置项全集:画面、键位、可访问性、语言各类别各收哪些项——目前有来源的只有减动效与音量入口两条。
|
1. 设置项全集:画面、键位、可访问性、语言各类别各收哪些项——目前有来源的只有减动效与音量入口两条。
|
||||||
2. 设置持久化(已拍板 2026-09-19):独立存储,不随存档——系统级设置一安装一份;具体文件格式与读写时机随存档序列化对齐(设置域归本系统所有)。
|
2. 设置持久化(已拍板 2026-09-19):独立存储,不随存档——系统级设置一安装一份;具体文件格式与读写时机随存档序列化设计批对齐(设置域归本系统所有)。
|
||||||
3. 语言清单与字体覆盖:做哪些语言,字体对相应字符集的覆盖怎么保证。
|
3. 语言清单与字体覆盖:做哪些语言,字体对相应字符集的覆盖怎么保证。
|
||||||
4. 文案生产流程:文本键(每条文案在工程里的唯一编号,机器据此找到译文)怎么管理、谁负责校对、翻译在流程的哪一步介入。
|
4. 文案生产流程:文本键(每条文案在工程里的唯一编号,机器据此找到译文)怎么管理、谁负责校对、翻译在流程的哪一步介入。
|
||||||
5. 设置界面的入口与形态:从哪里打开、什么时刻可以打开——与 HUD 框架协作定。
|
5. 设置界面的入口与形态:从哪里打开、什么时刻可以打开——与 HUD 框架协作定。
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
# 元进度
|
# 元进度
|
||||||
|
|
||||||
> 一句话:跨局成长——钥石在营地换成永久强化,存档随冒险变厚
|
> 一句话:跨局成长——钥石在营地换成永久强化,存档随冒险变厚
|
||||||
> 状态:**已定稿(现行为 v1.27)**——历次升版明细见 git 提交史。
|
> 状态:**已定稿(现行为 v1.26)**——2026-09-18 元进度定稿批用户拍板;历次升版明细见 git 提交史。
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
元进度管的是跨局成长:一场冒险结束,局内的血、库存与随机种子全部清零重来,而存档里攒下的东西不清零。玩家在下探途中夺得一种叫钥石的永久系统资源(渠道 = Boss / 精英怪击杀掉落,见核心规则),在冒险与冒险之间用它换永久强化——这就是核心循环里「存档在变厚」的故事线,本系统就是这条线的归属地。
|
元进度管的是跨局成长:一场冒险结束,局内的血、库存与随机种子全部清零重来,而存档里攒下的东西不清零。玩家在下探途中夺得一种叫钥石的永久系统资源(渠道 = Boss / 精英怪击杀掉落——原「关卡大奖励入账」渠道随迭代 10 奖励重构退役,见核心规则),在冒险与冒险之间用它换永久强化——这就是核心循环里「存档在变厚」的故事线,本系统就是这条线的归属地。
|
||||||
|
|
||||||
定名(2026-09-18 用户拍板):**元进度**(Meta Progression)是系统族名,本作落地名叫**永久强化**——伴随存档生命周期、可被钥石换取的成长资源集合。树形结构本身以锻造脉形态落地在役——存档域 tree_nodes / fork_sides(save v5)、营地树面板,系统现行事实源 = [天赋树](天赋树.md)。**营地**是存档内消费钥石的枢纽场所,只是界面壳(呈现层概念),不是机制实体——机制主语一律用「永久强化」。
|
定名(2026-09-18 用户拍板):**元进度**(Meta Progression)是系统族名,本作落地名叫**永久强化**——伴随存档生命周期、可被钥石换取的成长资源集合。归档线索里的旧概念「天赋树」随定名退役的是其旧义;树形结构本身已随迭代 12 以锻造脉形态落地在役——存档域 tree_nodes / fork_sides(save v5)、营地树面板,系统现行事实源 = [天赋树](天赋树.md)。**营地**是存档内消费钥石的枢纽场所,只是界面壳(呈现层概念),不是机制实体——机制主语一律用「永久强化」。
|
||||||
|
|
||||||
**系统资源口径**(定义见[核心循环](../../01-核心循环.md)「系统资源」节):钥石与 GP 是两条平行独立的系统资源,不立统一上位概念,按生命周期各归各档——钥石=存档级系统资源归本文,GP=冒险级系统资源归[冒险结构](../冒险循环/冒险结构.md)「GP」节。
|
**系统资源口径**(定义见[核心循环](../../01-核心循环.md)「系统资源」节):钥石与 GP 是两条平行独立的系统资源,不立统一上位概念,按生命周期各归各档——钥石=存档级系统资源归本文,GP=冒险级系统资源归[冒险结构](../冒险循环/冒险结构.md)「GP」节。
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
| 关卡大奖励的钥石入账 | [冒险结构](../冒险循环/冒险结构.md)——记账挂点已定,本文是消费方 |
|
| 关卡大奖励的钥石入账 | [冒险结构](../冒险循环/冒险结构.md)——记账挂点已定,本文是消费方 |
|
||||||
| 存档的读写与版本迁移 | [存档序列化](../表现与支撑/存档序列化.md)——本系统是存进去的内容之一 |
|
| 存档的读写与版本迁移 | [存档序列化](../表现与支撑/存档序列化.md)——本系统是存进去的内容之一 |
|
||||||
| 换算率表数值行与配置表承载 | [数据配置](../表现与支撑/数据配置.md)——本系统登记键结构、设计批回填数值 |
|
| 换算率表数值行与配置表承载 | [数据配置](../表现与支撑/数据配置.md)——本系统登记键结构、设计批回填数值 |
|
||||||
| 营地界面、钥石余额与解锁呈现 | [HUD 框架](../表现与支撑/HUD框架.md)——本文只拍交互框架(双入口),视觉与实现随对方 |
|
| 营地界面、钥石余额与解锁呈现 | [HUD 框架](../表现与支撑/HUD框架.md)——本批只拍交互框架(双入口),视觉与实现随对方 |
|
||||||
| 难度区间模型本身 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md)——本文只经区间平移换算率接入 |
|
| 难度区间模型本身 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md)——本文只经区间平移换算率接入 |
|
||||||
| 奖励格图鉴的格子内容设计 | [地图战斗资源](../战斗循环/地图战斗资源.md)(差异化批,排 Alpha)——本文只登记功能界面结构位 |
|
| 奖励格图鉴的格子内容设计 | [地图战斗资源](../战斗循环/地图战斗资源.md)(差异化批,排 Alpha)——本文只登记功能界面结构位 |
|
||||||
|
|
||||||
@@ -49,9 +49,9 @@
|
|||||||
|
|
||||||
### 钥石:入账渠道与重复获取
|
### 钥石:入账渠道与重复获取
|
||||||
|
|
||||||
钥石是玩家在局内夺得、在局外消费的永久系统资源,2026-09-14 拍板定名。渠道 = **Boss / 精英怪击杀掉落**(2026-09-30 用户拍板奖励重构;逐杀实时入账,行值读 meta.tres boss_keystone 首杀/复杀两档;精英怪未实装,掉 1 个预留;原「关卡大奖励入账」渠道与 keystone_per_level 行值已退役)。钥石存进存档、永不丢失,就算之后倒下也不收回。
|
钥石是玩家在局内夺得、在局外消费的永久系统资源,2026-09-14 拍板定名。渠道自迭代 10 起改一(2026-09-30 用户拍板奖励重构——原「关卡大奖励入账」渠道随大奖励三件套退役,keystone_per_level 行值退役):**Boss / 精英怪击杀掉落**(逐杀实时入账,行值读 meta.tres boss_keystone 首杀/复杀两档;精英怪未实装,掉 1 个预留)。钥石存进存档、永不丢失,就算之后倒下也不收回。
|
||||||
|
|
||||||
**与 GP 的分工(知会性质)**:钥石 = 跨局持久的解锁资源(入存档永不丢失);GP = 冒险内一次性的属性提升货币——局内清零、不入存档,GP 归[冒险结构](../冒险循环/冒险结构.md)。两币的记录与生命周期完全分离,永不互兑。
|
**与 GP 的分工(2026-09-20 GP+商店房批注记,知会性质)**:钥石 = 跨局持久的解锁资源(入存档永不丢失);GP = 冒险内一次性的属性提升货币——局内清零、不入存档,GP 归[冒险结构](../冒险循环/冒险结构.md)。两币的记录与生命周期完全分离,永不互兑。
|
||||||
|
|
||||||
**重复获取规则(2026-09-18 用户拍板)**:同一 Boss **首次击杀给大额**,之后的重复击杀只给**固定小额**——不设递减曲线,存档只记首杀标记位。设计意图:深度关的产出优势是长线驱动(配合定价几何递增,见下),重复刷老关仍有小额意义但不构成无上限的产出泵。两档数值与两渠道量级配比归元进度设计批配读数投值,行值读表。
|
**重复获取规则(2026-09-18 用户拍板)**:同一 Boss **首次击杀给大额**,之后的重复击杀只给**固定小额**——不设递减曲线,存档只记首杀标记位。设计意图:深度关的产出优势是长线驱动(配合定价几何递增,见下),重复刷老关仍有小额意义但不构成无上限的产出泵。两档数值与两渠道量级配比归元进度设计批配读数投值,行值读表。
|
||||||
|
|
||||||
@@ -62,18 +62,18 @@
|
|||||||
| 功能界面 | 内容 | 解锁渠道 |
|
| 功能界面 | 内容 | 解锁渠道 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 属性锻造 | 生命上限、基础攻击、护甲等级——三档可重复升级的属性强化 | 钥石直购 |
|
| 属性锻造 | 生命上限、基础攻击、护甲等级——三档可重复升级的属性强化 | 钥石直购 |
|
||||||
| 秘宝匣 | 秘宝解锁与同调装配——**件的目录与效果权威定义在[秘宝](秘宝.md)「目录(重设计 v1)」**(12 件三档〔2026-10-11 裁回能器删/换装券撤/第四只手删〕;旧目录全退役只作素材库) | 解锁=混合制(基础件钥石购买/特定件条件解锁——见秘宝.md「道具从哪来」;装配只在冒险开始前配置,冒险中零更换途径〔2026-10-11 终裁〕);界面实现:购买钮(余额不足禁用态)+条件解锁进度呈现+分档装配呈现(名后缀·档位/未解锁禁装)+空目录合法态;界面数据投影=秘宝匣柜台状态(解锁态/条件进度/价格单点);旧道具工坊渠道面(行族/词表/解锁函数)已退役;钥石定价与阈值 provisional 归调参批 |
|
| 秘宝匣 | 秘宝解锁与同调装配——**件的目录与效果权威定义在[秘宝](秘宝.md)「目录(重设计 v1)」**(12 件三档〔2026-10-11 裁回能器删/换装券撤/第四只手删〕;旧目录全退役只作素材库) | 解锁=混合制(基础件钥石购买/特定件条件解锁——见秘宝.md「道具从哪来」;装配只在冒险开始前配置,冒险中零更换途径〔2026-10-11 终裁〕);**迭代 22 实装批落地(2026-10-12)**:购买钮(余额不足禁用态)+条件解锁进度呈现+分档装配呈现(名后缀·档位/未解锁禁装)+空目录合法态;界面数据投影=秘宝匣柜台状态(解锁态/条件进度/价格单点);旧道具工坊渠道面(行族/词表/解锁函数)已顺带退役;钥石定价与阈值 provisional 归调参批 |
|
||||||
| 奖励格图鉴 | 特殊奖励格的解锁——更强效果的格面 | 结构位现定;格子内容排 Alpha,随[地图战斗资源](../战斗循环/地图战斗资源.md)差异化批落地 |
|
| 奖励格图鉴 | 特殊奖励格的解锁——更强效果的格面 | 结构位现定;格子内容排 Alpha,随[地图战斗资源](../战斗循环/地图战斗资源.md)差异化批落地 |
|
||||||
|
|
||||||
属性锻造的树形节点结构已落地在役——**结构/节点/数值的现行事实源 = [天赋树](天赋树.md),本文不复制树侧内容、只作指路**;本界面三档直线强化与树淬炼 flat 在注入面叠加生效(注入口径见下文「跨局注入」节)。
|
属性锻造的树形节点结构已随迭代 12 落地在役——**结构/节点/数值的现行事实源 = [天赋树](天赋树.md),本文不复制树侧内容、只作指路**;本界面三档直线强化与树淬炼 flat 在注入面叠加生效(注入口径见下文「跨局注入」节)。
|
||||||
|
|
||||||
属性锻造的攻击、护甲两档已按[锻造工坊](锻造工坊.md)设计定案转为武器与护甲的独立等级路线——**路线为新建行族(新表 `forge.tres`),已实装在役**。本柜台钥石消费写口 = **逐级锻造价 / 一次性解锁价 / 免费选中武器·甲**——写口唯一经元进度锻造写口族(写口单点,UI 只发意图);钥石定价考古参数 20 钥石/150% 公比见 `meta.tres` 退役批注,provisional 投值终值归 M4。
|
属性锻造的攻击、护甲两档已按[锻造工坊](锻造工坊.md) v0.6(成文时名「武器锻造」,2026-10-11 更名)设计定案转为武器与护甲的独立等级路线——**行族本体随迭代 21 T5 退役、路线为新建行族,已随迭代 23 实装入库(2026-10-12,新表 `forge.tres`)**。营地钥石入口族换代(2026-10-13 v1.18 迭代 23 反哺写入):原逐级购买写口随 forge_products 退役删除后,本柜台钥石消费写口 = **逐级锻造价 / 一次性解锁价 / 免费选中武器·甲**——写口唯一经元进度锻造写口族(契约 9 写口单点,UI 只发意图);钥石定价历史考古参数 20 钥石/150% 公比见 `meta.tres` 退役批注,provisional 投值终值归 M4。
|
||||||
|
|
||||||
**营地统一(2026-10-11 用户裁案甲)**:树=营地本体,本属性锻造柜台已退役、属性升级唯一入口=树脊柱淬炼节点(四柜台并排已实装)。**完整模型(四柜台并排/钥匙工作间/图鉴常开)唯一事实源 = [天赋树](天赋树.md)「营地=树:统一模型」节——本文只登记本柜台在系统内的去留,不复制树侧内容。**
|
**营地统一(2026-10-11 天赋树设计会话裁案甲;2026-10-13 v1.20 迭代 21 反哺写入——「落地前维持现役」过渡态终结)**:树=营地本体,本属性锻造柜台已随迭代 21 退役、属性升级唯一入口=树脊柱淬炼节点(四柜台并排已实装,2026-10-12 入库)。**完整模型(四柜台并排/钥匙工作间/图鉴常开)唯一事实源 = [天赋树](天赋树.md)「营地=树:统一模型」节——本文只登记本柜台在系统内的去留,不复制树侧内容。**
|
||||||
|
|
||||||
**投值语言锁定(2026-09-18 数值语言拍板)**:营地属性强化一律 **flat 整数加减**("每级 +1 基础攻击"式,而非"+50% 攻击"式)——避开百分比词条被数值成长稀释的先例陷阱、守住数字可读性锚;具体每级数值仍归元进度设计批投值。
|
**投值语言锁定(2026-09-18 数值语言拍板)**:营地属性强化一律 **flat 整数加减**("每级 +1 基础攻击"式,而非"+50% 攻击"式)——避开百分比词条被数值成长稀释的先例陷阱、守住数字可读性锚;具体每级数值仍归元进度设计批投值。
|
||||||
|
|
||||||
各界面定价纪律:**定价曲线一律几何递增**(每级费用按公比上浮——原则已拍板,起步价与公比数字归设计批配读数),与产出逻辑配套:深层关钥石产出多、后级强化贵,逼玩家往深处走。秘宝匣现役=钥石直购+条件解锁混合制。**存档义务随柜台产生**:钥石余额、永久强化等级表、每关通关次数表、Boss 首杀标记位——四件已逐域登记在存档登记条目(内容 owner = 元进度,承载 owner = [存档序列化](../表现与支撑/存档序列化.md))。
|
各界面定价纪律:**定价曲线一律几何递增**(每级费用按公比上浮——原则已拍板,起步价与公比数字归设计批配读数),与产出逻辑配套:深层关钥石产出多、后级强化贵,逼玩家往深处走。~~秘宝匣首版只挂通关次数渠道~~(历史排期裁决已消解:秘宝匣现役=钥石直购+条件解锁混合制,迭代 22 落地,2026-10-12)。**存档义务随柜台产生**:钥石余额、永久强化等级表、每关通关次数表、Boss 首杀标记位——四件已逐域登记在存档登记条目(内容 owner = 元进度,承载 owner = [存档序列化](../表现与支撑/存档序列化.md))。
|
||||||
|
|
||||||
护甲等级进首版属性柜台是 2026-09-18 拍板(用户选 A),其代价条款见下方换算率节的强条目登记。
|
护甲等级进首版属性柜台是 2026-09-18 拍板(用户选 A),其代价条款见下方换算率节的强条目登记。
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
|
|
||||||
解锁让玩家变强,难度验收区间随之需要平移——双方约定(难度曲线与Boss 定稿口径)永久强化的影响**不直接改难度判据**,而是按统一换算率折算成关卡完成率带的平移量后套用:完美档 gate 与 normal 目标带的判读口径不变,带随解锁等级平移。
|
解锁让玩家变强,难度验收区间随之需要平移——双方约定(难度曲线与Boss 定稿口径)永久强化的影响**不直接改难度判据**,而是按统一换算率折算成关卡完成率带的平移量后套用:完美档 gate 与 normal 目标带的判读口径不变,带随解锁等级平移。
|
||||||
|
|
||||||
换算率表(数值行读 `data/tables/meta.tres` conversion 行族)登记三个属性维度(2026-09-18 拍板;"行" = 表内一条记录,一个属性维度即一行条目,全仓与"行值"同义)。现行表值(OFAT 冒险注入档与白板同种子配对的逐关条件通关率差实测,冒险条件口径;判定端 ④ 段可复判):
|
换算率表(数值行读 `data/tables/meta.tres` conversion 行族)登记三个属性维度(2026-09-18 拍板;"行" = 表内一条记录,一个属性维度即一行条目,全仓与"行值"同义)。现行表值(2026-09-23 换算率标定批投值——OFAT 冒险注入档与白板同种子配对的逐关条件通关率差实测,冒险条件口径 + 当日数值包现行态;报告已按生命周期条款退役,判定端 ④ 段可复判):
|
||||||
|
|
||||||
| 换算行 | 折算语义 | 每级带平移量(现行表值) |
|
| 换算行 | 折算语义 | 每级带平移量(现行表值) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
| 基础攻击强化 | 每级折算为关卡完成率带平移量 | **9 点** |
|
| 基础攻击强化 | 每级折算为关卡完成率带平移量 | **9 点** |
|
||||||
| 护甲等级强化 | 每级折算为关卡完成率带平移量 | **1 点** |
|
| 护甲等级强化 | 每级折算为关卡完成率带平移量 | **1 点** |
|
||||||
|
|
||||||
判定端按表值驱动消费:验收带按解锁状态折算后套用,表改则判定随动。护甲行强条目已履行(解锁后参数实测,非基线外推)。
|
判定端按表值驱动消费:验收带按解锁状态折算后套用,表改则判定随动。护甲行强条目重测义务已于标定批履行(解锁后参数实测,非基线外推);标定同时暴露并修复一处缺口:主角护甲锻造与局内加算区护甲轴的生效值此前未进战斗(该轴此前无消费方=已知缺口,已随标定批修复并登记)。
|
||||||
|
|
||||||
后续柜台商品(秘宝匣钥石价、奖励格图鉴)上架时逐条补行——每次上架新商品伴随一行换算登记,逐行归因纪律不破。
|
后续柜台商品(秘宝匣钥石价、奖励格图鉴)上架时逐条补行——每次上架新商品伴随一行换算登记,逐行归因纪律不破。
|
||||||
|
|
||||||
@@ -99,11 +99,11 @@
|
|||||||
|
|
||||||
执行口径:开始一次新冒险时,本系统按存档内的永久强化状态算好一份 override,逐字段显式传给战斗初始化——配置因此不是完全静态的,随游戏进程动态改变(用户拍板原话口径)。字段清单随柜台扩展:道具池、遭遇权重、奖励格解锁是集合操作,参数面登记**追加 / 替换**两种语义。
|
执行口径:开始一次新冒险时,本系统按存档内的永久强化状态算好一份 override,逐字段显式传给战斗初始化——配置因此不是完全静态的,随游戏进程动态改变(用户拍板原话口径)。字段清单随柜台扩展:道具池、遭遇权重、奖励格解锁是集合操作,参数面登记**追加 / 替换**两种语义。
|
||||||
|
|
||||||
**开局属性四层叠加(事实源=[锻造工坊](锻造工坊.md)「注入衔接」节 / [天赋树](天赋树.md))**:开局属性 = 角色基础值 + 树生命/命中淬炼 flat + 锻造路线加值(当前选中武器的攻击加值 + 当前甲的 AC 加值——默认值由锻造工坊配置常驻持有、与柜台解锁状态解耦,当前选中读存档域)+ 局内加算区 flat。入战 AC 三层可加 = 甲型基础 AC + 甲路线等级加值 + 局内加算区累加——**第一层「甲型基础 AC」= 选中甲路线行 `base_ac`(`forge.tres`,轻 10/重 12/魔法护甲 9 provisional;入战 AC 三层公式第一层)**。
|
**开局属性四层叠加(2026-10-12 v1.16 补登记——事实源=[锻造工坊](锻造工坊.md)「注入衔接」节 v0.6 / [天赋树](天赋树.md);原「属性锻造三档是数值覆盖」随迭代 21 T5 行族退役换代为下述分层;2026-10-13 v1.18 迭代 23 反哺写入补终态句)**:开局属性 = 角色基础值 + 树生命/命中淬炼 flat + 锻造路线加值(当前选中武器的攻击加值 + 当前甲的 AC 加值——默认值由锻造工坊配置常驻持有、与柜台解锁状态解耦,当前选中读存档域)+ 局内加算区 flat。入战 AC 三层可加 = 甲型基础 AC + 甲路线等级加值 + 局内加算区累加——**第一层「甲型基础 AC」= 选中甲路线行 `base_ac`(`forge.tres`,轻 10/重 12/魔法护甲 9 provisional),已随迭代 23 实装在役(入战 AC 三层公式第一层,树 flat + 锻造路线加值同批在役)**。
|
||||||
|
|
||||||
### 解锁界面:双入口框架
|
### 解锁界面:双入口框架
|
||||||
|
|
||||||
(2026-09-18 拍板;入口拓扑=三入口化)营地消费面(消费钥石、查看与管理永久强化)经主菜单「进入存档」→选档界面→进档/新档进入,主菜单不再设营地独立钮;局内状态面板(游戏非实时无暂停语义)也可查看钥石余额与本局冒险信息(只读)。钥石余额在 HUD 常驻展示。呈现 spec:[ux/camp.md](../../../ux/camp.md) v1.0(退役/封存件「已退役/已解锁·能力封存中」呈现语义随 spec 落位);视觉终稿已落码。本节锁框架与需求,呈现细节归 spec;局内状态面板入口已实装(实机目检待用户,待办清单登记条在册)。
|
(2026-09-18 拍板;入口拓扑随迭代 33 卡② 三入口化换代,2026-10-22 反哺写入)营地消费面(消费钥石、查看与管理永久强化)经主菜单「进入存档」→选档界面→进档/新档进入,主菜单不再设营地独立钮;局内状态面板(原称暂停层,2026-10-13 改名——游戏非实时无暂停语义)也可查看钥石余额与本局冒险信息(只读)。钥石余额在 HUD 常驻展示。呈现 spec 已出生:[ux/camp.md](../../ux/camp.md) v1.0(2026-09-30 审计拍板点 4A 裁决写入文档——退役/封存件「已退役/已解锁·能力封存中」呈现语义随 spec 落位);视觉终稿已随迭代 9 9A 段落码(2026-09-30)。本节锁框架与需求,呈现细节归 spec;局内状态面板入口已实装(2026-10-06 迭代 17 卡③〔时名暂停层〕——实机目检待用户,待办清单登记条在册)。
|
||||||
|
|
||||||
### 单局循环零依赖:排期边界的推论
|
### 单局循环零依赖:排期边界的推论
|
||||||
|
|
||||||
@@ -130,9 +130,9 @@ MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)整体
|
|||||||
| 优先级 | 内容 | 后置原因 |
|
| 优先级 | 内容 | 后置原因 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| P1 | 营地功能界面内容铺量与定价数字 | 界面结构已定稿;清单明细、几何定价的起步价与公比、Boss 两档产出数值,随设计批配读数投值 |
|
| P1 | 营地功能界面内容铺量与定价数字 | 界面结构已定稿;清单明细、几何定价的起步价与公比、Boss 两档产出数值,随设计批配读数投值 |
|
||||||
| P1 | 秘宝匣钥石直购价 | **已投 provisional 占位**(普通档 10/优秀档 25 钥石);终值归调参批 |
|
| P1 | 秘宝匣钥石直购价 | **已投 provisional 占位**(普通档 10/优秀档 25 钥石,迭代 22 落地,2026-10-12);终值归调参批(原「首版只挂通关次数渠道」排期态随混合制落地消解) |
|
||||||
| P1 | 奖励格图鉴的格子内容 | 排 Alpha,随[地图战斗资源](../战斗循环/地图战斗资源.md)差异化批 |
|
| P1 | 奖励格图鉴的格子内容 | 排 Alpha,随[地图战斗资源](../战斗循环/地图战斗资源.md)差异化批 |
|
||||||
| P1 | 换算率表数值行标定 | **已完成**(首版三行投值 6/9/1,护甲行强条目已履行) |
|
| P1 | 换算率表数值行标定 | **已完成**(2026-09-23 换算率标定批——首版三行投值 6/9/1,护甲行强条目重测顺带履行并修复护甲断链)(原系笔误孤例,换算率登记与 meta.tres 均为 6/9/1——2026-09-30 勘误) |
|
||||||
| P2 | 营地界面与解锁呈现实现 | 归[HUD 框架](../表现与支撑/HUD框架.md)协作批,以表现层样张过审为前置 |
|
| P2 | 营地界面与解锁呈现实现 | 归[HUD 框架](../表现与支撑/HUD框架.md)协作批,以表现层样张过审为前置 |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
@@ -143,7 +143,7 @@ MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)整体
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 换算率表 | 本文 owner,键结构见元进度表结构声明 | `data/tables/`,设计批投值(首版三行,护甲行强条目) |
|
| 换算率表 | 本文 owner,键结构见元进度表结构声明 | `data/tables/`,设计批投值(首版三行,护甲行强条目) |
|
||||||
| 定价表(属性锻造 / 秘宝匣 / 奖励格图鉴费用曲线) | 随设计批建表 | `data/tables/`,几何递增参数 |
|
| 定价表(属性锻造 / 秘宝匣 / 奖励格图鉴费用曲线) | 随设计批建表 | `data/tables/`,几何递增参数 |
|
||||||
| 钥石产出(Boss 首杀额 / 重复杀小额) | 入账挂点见[冒险结构](../冒险循环/冒险结构.md)调参表(boss_keystone 行);Boss 两档归本文设计批(每关入账值 keystone_per_level 已退役) | `data/tables/` |
|
| 钥石产出(Boss 首杀额 / 重复杀小额) | 入账挂点见[冒险结构](../冒险循环/冒险结构.md)调参表(boss_keystone 行);Boss 两档归本文设计批(每关入账值 keystone_per_level 已随迭代 10 奖励重构退役) | `data/tables/` |
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
# 天赋树
|
# 天赋树
|
||||||
|
|
||||||
> 一句话:营地本身——跨局成长的结构承载:钥石逐节点点亮一棵树,属性淬炼、工作间解锁、规则抉择与同调挂载全部组织在树上
|
> 一句话:营地本身——跨局成长的结构承载:钥石逐节点点亮一棵树,属性淬炼、工作间解锁、规则抉择与同调挂载全部组织在树上
|
||||||
> 状态:**已定稿(现行为 v0.12)**——12 节点结构在役(脊柱=生命/命中一线一节点,Fork 三节点双态);「等级阈值前置」为机制位(前置节点等级 ≥ n 才可购;键悬空 / 阈值 <1 / 类型错加载即拒;未达标节点锁标 + 悬停门槛文案),现役 12 行零配置=零行为影响;全部数值行 provisional,归数值批。
|
> 状态:**已定稿(现行为 v0.11)**——12 节点结构在役(脊柱=生命/命中一线一节点,Fork 三节点双态);「等级阈值前置」为机制位(前置节点等级 ≥ n 才可购;键悬空 / 阈值 <1 / 类型错加载即拒;未达标节点锁标 + 悬停门槛文案),现役 12 行零配置=零行为影响;全部数值行 provisional,归数值批。
|
||||||
|
|
||||||
> **📖 节点状态记录指引(读这份文档先看这里)**:本树全部 12 个节点=下方「核心规则 → 节点总表」,逐节点列名称/脉/类型/前置/效果方向;**全部数值行(价格 / 等级上限 / 每级效果取值 / 规则键效果参数)不在本文**,事实源 = 配置文件 `data/tables/meta_tree.tres`(provisional 归数值批)。要查"有哪些节点、怎么连"看本文总表,要查"多少钱、加多少"开配置文件。
|
> **📖 节点状态记录指引(读这份文档先看这里)**:本树全部 12 个节点=下方「核心规则 → 节点总表」,逐节点列名称/脉/类型/前置/效果方向;**全部数值行(价格 / 等级上限 / 每级效果取值 / 限次值)不在本文**,事实源 = 配置文件 `data/tables/meta_tree.tres`(provisional 归数值批)。要查"有哪些节点、怎么连"看本文总表,要查"多少钱、加多少"开配置文件。
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
元进度管「钥石与永久强化」的跨局系统资源,天赋树回答这组系统资源里「永久强化长什么样」——并且它是营地的机制本体(2026-10-11 用户裁案甲),营地升级就是天赋树升级。主干脊柱管生命/命中的积累节奏(两线唯一入口——2026-10-11 攻防所有权切分:攻击唯一入口=锻造工坊武器路线、AC 唯一入口=锻造工坊甲路线,树零攻防来源=红线,每根数值轴全游戏单一来源);锻造脉与钥石脉是两把工作间钥匙——点亮后展开锻造工坊(武器/护甲路线升级)与秘宝匣(秘宝解锁与同调装配)两个工作间;同调脉管同调位挂载与规则抉择。营地界面呈现=四柜台并排(2026-10-11 用户裁):树淬炼柜台是树脊柱的界面形态,锻造工坊柜台在钥匙点亮前呈锁定态。玩家在两场冒险之间回到营地,用钥石逐节点点亮这棵树,点亮的属性与规则在下一局开局注入。
|
元进度管「钥石与永久强化」的跨局系统资源,天赋树回答这组系统资源里「永久强化长什么样」——并且它是营地的机制本体(2026-10-11 用户裁案甲),营地升级就是天赋树升级。主干脊柱管生命/命中的积累节奏(两线唯一入口——2026-10-11 攻防所有权切分:攻击唯一入口=锻造工坊武器路线、AC 唯一入口=锻造工坊甲路线,树零攻防来源=红线,每根数值轴全游戏单一来源);锻造脉与钥石脉是两把工作间钥匙——点亮后展开锻造工坊(武器/护甲路线升级)与秘宝匣(秘宝解锁与同调装配)两个工作间;同调脉管同调位挂载与规则抉择。营地界面呈现=四柜台并排(2026-10-11 锻造工坊裁决会话 A② 裁):树淬炼柜台是树脊柱的界面形态,锻造工坊柜台在钥匙点亮前呈锁定态。玩家在两场冒险之间回到营地,用钥石逐节点点亮这棵树,点亮的属性与规则在下一局开局注入。
|
||||||
|
|
||||||
树同时是账号姿态的承载:买了哪些节点、双态开关节点当前激活哪态,构成这个存档的跨局姿态——「我的账号玩成了什么样」。
|
树同时是账号姿态的承载:买了哪些节点、双态开关节点当前激活哪态,构成这个存档的跨局姿态——「我的账号玩成了什么样」。
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
| 负责 | 说明 |
|
| 负责 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 节点结构与解锁规则 | 12 节点的一脊三脉构成、脊柱行门槛(节点第 N 级)、点亮前置(requires)+ **等级阈值前置(requires_level——机制位,现役零配置空转)**、Fork 一节点双态与免费切换、彩蛋觉醒——结构事实源 = `data/tables/meta_tree.tres`(**已实装在役**) |
|
| 节点结构与解锁规则 | 12 节点的一脊三脉构成、脊柱行门槛(节点第 N 级)、点亮前置(requires)+ **等级阈值前置(requires_level——R1 机制位 2026-10-13 顺带重立,现役零配置空转)**、Fork 一节点双态与免费切换、彩蛋觉醒——结构事实源 = `data/tables/meta_tree.tres`(**已实装在役,迭代 21 T1**) |
|
||||||
| 树的购买与货币规则 | 全树钥石单币;free 节点零币;购买校验四件套(等级上限 / 行门槛 / 前置 / 未解锁) |
|
| 树的购买与货币规则 | 全树钥石单币;free 节点零币;购买校验四件套(等级上限 / 行门槛 / 前置 / 未解锁) |
|
||||||
| 营地统一模型 | 树=营地本体(呈现=四柜台并排):生命/命中淬炼唯一入口=树脊柱淬炼节点,攻/AC 唯一入口=锻造工坊路线(所有权切分,2026-10-11 裁);工作间钥匙模型(锻造工坊 / 秘宝匣);图鉴常开;旧属性锻造柜台退役(生命归脊柱、攻防归锻造工坊) |
|
| 营地统一模型 | 树=营地本体(呈现=四柜台并排):生命/命中淬炼唯一入口=树脊柱淬炼节点,攻/AC 唯一入口=锻造工坊路线(所有权切分,2026-10-11 裁);工作间钥匙模型(锻造工坊 / 秘宝匣);图鉴常开;旧属性锻造柜台退役(生命归脊柱、攻防归锻造工坊) |
|
||||||
| 树域存档的内容语义 | tree_nodes(node_id→已购等级)与 fork_sides(fork_group→激活态)两域语义;旧档废弃规则(开发阶段无迁移——2026-10-11 用户裁) |
|
| 树域存档的内容语义 | tree_nodes(node_id→已购等级)与 fork_sides(fork_group→激活态)两域语义;旧档废弃规则(开发阶段无迁移——2026-10-11 用户裁) |
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
| 不负责 | 归谁 |
|
| 不负责 | 归谁 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 节点数值行(价格 / 等级上限 / effects 取值 / 规则键效果参数) | [数据配置](../表现与支撑/数据配置.md)——行值读 `meta_tree.tres`,全 provisional 归数值批;本文只定规则与键结构 |
|
| 节点数值行(价格 / 等级上限 / effects 取值 / 限次值) | [数据配置](../表现与支撑/数据配置.md)——行值读 `meta_tree.tres`,全 provisional 归数值批;本文只定规则与键结构 |
|
||||||
| 钥石 | [元进度](元进度.md)——树是永久强化的承载结构,钥石余额是消费来源;旧柜台框架与退役面亦在对方登记 |
|
| 钥石 | [元进度](元进度.md)——树是永久强化的承载结构,钥石余额是消费来源;旧柜台框架与退役面亦在对方登记 |
|
||||||
| 锻造工坊工作间内的路线升级设计 | [锻造工坊](锻造工坊.md)——武器三路线+护甲三路线的等级、定价、满级特效现行事实源在彼;攻/AC 数值唯一来源在彼(所有权切分) |
|
| 锻造工坊工作间内的路线升级设计 | [锻造工坊](锻造工坊.md)——武器三路线+护甲三路线的等级、定价、满级特效现行事实源在彼;攻/AC 数值唯一来源在彼(所有权切分) |
|
||||||
| 秘宝目录、同调装配与同调位求值 | [秘宝](../跨局循环/秘宝.md)——树只持同调位节点挂载位与秘宝匣钥匙 |
|
| 秘宝目录、同调装配与同调位求值 | [秘宝](../跨局循环/秘宝.md)——树只持同调位节点挂载位与秘宝匣钥匙 |
|
||||||
@@ -49,42 +49,43 @@
|
|||||||
|
|
||||||
### 营地=树:统一模型
|
### 营地=树:统一模型
|
||||||
|
|
||||||
营地机制本体=这一棵树(2026-10-11 用户裁案甲);营地界面呈现=四柜台并排(2026-10-11 用户裁):①树淬炼柜台(树脊柱的界面形态,生命/命中淬炼唯一入口)②锻造工坊柜台(武器+护甲攻防两区)③秘宝匣柜台(秘宝解锁与同调装配)④奖励格图鉴(常开无门槛)。攻防独立柜台;宽度不足时横向滚动条兜底;程序占位先行,视觉与布局终稿归 HUD 营地批(后续 UI 优化另批)。机制语义不随呈现措辞变:
|
营地机制本体=这一棵树(2026-10-11 用户裁案甲,取代旧「三柜台→一树」界面重构议题);营地界面呈现=四柜台并排(2026-10-11 锻造工坊裁决会话 A② 裁):①树淬炼柜台(树脊柱的界面形态,生命/命中淬炼唯一入口)②锻造工坊柜台(武器+护甲攻防两区)③秘宝匣柜台(秘宝解锁与同调装配)④奖励格图鉴(常开无门槛)。攻防独立柜台;宽度不足时横向滚动条兜底;程序占位先行,视觉与布局终稿归 HUD 营地批(后续 UI 优化另批)。机制语义不随呈现措辞变:
|
||||||
|
|
||||||
- **生命/命中淬炼唯一入口**——生命/命中的永久强化只在树脊柱淬炼节点购买;攻/AC 的永久强化唯一入口=锻造工坊武器/护甲路线(所有权切分,2026-10-11 裁——树零攻防来源=红线)。旧属性锻造柜台(forge_levels 三档直购)已退役:生命档吸收进脊柱、攻/护档由[锻造工坊](锻造工坊.md)路线承接,`forge_levels` 旧存档域已清退(开发阶段无迁移——旧档破坏性废弃,见存档域节)。
|
- **生命/命中淬炼唯一入口**——生命/命中的永久强化只在树脊柱淬炼节点购买;攻/AC 的永久强化唯一入口=锻造工坊武器/护甲路线(所有权切分,2026-10-11 裁——树零攻防来源=红线)。旧属性锻造柜台(forge_levels 三档直购)退役:生命档吸收进脊柱、攻/护档由[锻造工坊](锻造工坊.md)实装批路线化改造承接,`forge_levels` 旧存档域随实装批清退(开发阶段无迁移——旧档破坏性废弃,见存档域节)。
|
||||||
- **工作间钥匙模型**——锻造工坊、秘宝匣是树上两枚免费解锁节点(钥匙):点亮后展开对应工作间柜台面板,工作间内的升级操作(武器/护甲路线升级、秘宝解锁与同调装配)不在树上重复成节点。钥匙节点本身零币、不可跳过——锻造工坊钥匙无前置、直接可点亮(2026-10-11 裁),秘宝匣钥匙前置=脊柱生命第 1 级;钥匙未点亮时对应柜台锁定态,没点亮就进不去工作间。
|
- **工作间钥匙模型**——锻造工坊、秘宝匣是树上两枚免费解锁节点(钥匙):点亮后展开对应工作间柜台面板,工作间内的升级操作(武器/护甲路线升级、秘宝解锁与同调装配)不在树上重复成节点。钥匙节点本身零币、不可跳过——锻造工坊钥匙无前置、直接可点亮(2026-10-11 裁),秘宝匣钥匙前置=脊柱生命第 1 级;钥匙未点亮时对应柜台锁定态,没点亮就进不去工作间。
|
||||||
- **图鉴常开**——奖励格图鉴是查看类功能,不设钥匙、不设门槛。
|
- **图鉴常开**——奖励格图鉴是查看类功能,不设钥匙、不设门槛。
|
||||||
|
- 实装前过渡态:旧柜台三档直购维持现役(与树淬炼在注入面叠加),退役动作随待办清单「天赋树实装批」执行。
|
||||||
|
|
||||||
### 一脊三脉:节点构成
|
### 一脊三脉:节点构成
|
||||||
|
|
||||||
天赋树(玩家可见名)12 节点,按脉(vein)分四族:
|
天赋树(玩家可见名)换代后 12 节点,按脉(vein)分四族:
|
||||||
|
|
||||||
| 脉 | 节点数 | 内容 | 结构要点 |
|
| 脉 | 节点数 | 内容 | 结构要点 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 主干脊柱(spine) | 2 | 生命淬炼 / 命中淬炼——一线一节点(kind=stat),每节点内 4 个等级状态 | 行门槛:节点第 N 级可购需全树已购总等级 ≥ 4×(N−1)(2026-10-11 用户裁一线一节点:一个内容一个节点、等级在节点内、不拆多节点;row 字段随层行退役);达成节奏重算=注记在册、值归数值批 |
|
| 主干脊柱(spine) | 2 | 生命淬炼 / 命中淬炼——一线一节点(kind=stat),每节点内 4 个等级状态 | 行门槛:节点第 N 级可购需全树已购总等级 ≥ 4×(N−1)。2026-10-11 一线一节点换代(用户裁:一个内容一个节点、等级在节点内、不拆多节点)——原「一线 4 层×层内 3 购」收编为单节点 4 级(层=级),行门槛常量=4 的公式平移到等级轴,row 字段随层行退役;达成节奏重算=注记在册、值归数值批 |
|
||||||
| 锻造脉(forge) | 2 | 锻造工坊(kind=unlock,free,工作间钥匙)+ 彩蛋节点地脉共鸣(kind=easter) | 锻造工坊前置 = **无**(free,直接可点亮——2026-10-11 攻防所有权切分裁);彩蛋挂本脉 |
|
| 锻造脉(forge) | 2 | 锻造工坊(kind=unlock,free,工作间钥匙)+ 彩蛋节点地脉共鸣(kind=easter) | 锻造工坊前置 = **无**(free,直接可点亮——2026-10-11 攻防所有权切分裁,原「攻击淬炼累计 ≥2 且 护甲淬炼累计 ≥2」等级阈值前置随两线砍除作废);彩蛋挂本脉 |
|
||||||
| 钥石脉(keystone) | 2 | 秘宝匣(kind=unlock,free,工作间钥匙)/ 刷新升级(kind=rule) | 前置链:秘宝匣 ← 脊柱生命第 1 级;刷新升级 ← 秘宝匣 |
|
| 钥石脉(keystone) | 2 | 秘宝匣(kind=unlock,free,工作间钥匙)/ 刷新升级(kind=rule) | 前置链:秘宝匣 ← 脊柱生命第 1 级;刷新升级 ← 秘宝匣 |
|
||||||
| 同调脉(attune) | 6 | 同调位 1/2/3 三节点(kind=socket)+ Fork 3 节点(kind=fork,一节点双态)= **3 同调位 + 3 双态开关节点** | **同调位 1 为根节点、无前置**,其后逐级前置(1→2→3);全部 Fork 前置 = 同调位 1;Fork=开局姿态/危险直觉/财富之道各一节点(2026-10-11 用户裁:一节点双态、解锁后 A/B 可切——非六节点) |
|
| 同调脉(attune) | 6 | 同调位 1/2/3 三节点(kind=socket)+ Fork 3 节点(kind=fork,一节点双态)= **3 同调位 + 3 双态开关节点** | **同调位 1 为根节点、无前置**,其后逐级前置(1→2→3);全部 Fork 前置 = 同调位 1;Fork=开局姿态/危险直觉/财富之道各一节点(2026-10-11 用户裁:一节点双态、解锁后 A/B 可切——非六节点) |
|
||||||
|
|
||||||
节点类型是封闭枚举六类:stat(生命/命中两线数值)/ rule(全局规则)/ unlock(内容解锁)/ socket(同调位)/ fork(一节点双态开关)/ easter(彩蛋觉醒)。字段、词表与跨字段约束由 schema 校验(加载期校验:脉 / 类型 / 币出域即拒、effects 键封闭、Fork 三组每组恰一节点、彩蛋 ≤3、禁 archetype 键)。**schema 现行**:Fork 为单行双态(行持 a/b 双效果键 effects_a/b+name_a/b,效果按激活态取值;Fork 组词表三组)、规则键词表六键(见 Fork 节)、row 字段随一线一节点退役;「等级阈值前置」机制位=requires_level 字段+加载校验(现役零配置——见头部状态行)。
|
节点类型是封闭枚举六类:stat(生命/命中两线数值)/ rule(全局规则)/ unlock(内容解锁)/ socket(同调位)/ fork(一节点双态开关)/ easter(彩蛋觉醒)。字段、词表与跨字段约束由 schema 校验(加载期校验:脉 / 类型 / 币出域即拒、effects 键封闭、Fork 三组每组恰一节点、彩蛋 ≤3、禁 archetype 键)。**schema 连带已随迭代 21 T1 落地**:Fork 由 A/B 双行改单行双态(行持 a/b 双效果键 effects_a/b+name_a/b,效果按激活态取值;Fork 组词表 4→3 组)、规则键词表 2→6 键(见 Fork 节)、row 字段随一线一节点退役;「等级阈值前置」机制位 **2026-10-13 顺带重立**(requires_level 字段+加载校验,现役零配置——见头部状态行)。
|
||||||
|
|
||||||
### 节点总表(12 节点)
|
### 节点总表(12 节点)
|
||||||
|
|
||||||
全名单(12 节点)。数值行(价格/上限/效果取值)不在此表,读配置文件 `data/tables/meta_tree.tres`(**12 行结构已实装在役,33 行旧结构已废弃重置不迁移**):
|
换代后全名单(2026-10-11 Fork 一节点双态批换代:15→12)。数值行(价格/上限/效果取值)不在此表,读配置文件 `data/tables/meta_tree.tres`(**12 行结构已实装在役——迭代 21 T1,33 行旧结构已废弃重置不迁移**):
|
||||||
|
|
||||||
| 节点 | 脉 | 类型 | 前置 | 效果方向 |
|
| 节点 | 脉 | 类型 | 前置 | 效果方向 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| 生命淬炼 | 脊柱 | stat | 第 1 级无门槛;第 2~4 级=行门槛(全树总投入 ≥4/8/12) | 单节点 4 级,每级生命上限 +5 量级 |
|
| 生命淬炼 | 脊柱 | stat | 第 1 级无门槛;第 2~4 级=行门槛(全树总投入 ≥4/8/12) | 单节点 4 级,每级生命上限 +5 量级 |
|
||||||
| 命中淬炼 | 脊柱 | stat | 同上行门槛 | 单节点 4 级,每级命中 +1 量级(暂不注入——消费面归数值批) |
|
| 命中淬炼 | 脊柱 | stat | 同上行门槛 | 单节点 4 级,每级命中 +1 量级(暂不注入——消费面归数值批) |
|
||||||
| 锻造工坊 | 锻造 | unlock | 无(free,直接可点亮——2026-10-11 裁) | 免费点亮→展开锻造工坊工作间(武器/护甲路线升级=攻/AC 数值唯一入口,内容现行事实源=[锻造工坊](锻造工坊.md)) |
|
| 锻造工坊 | 锻造 | unlock | 无(free,直接可点亮——2026-10-11 裁,原等级阈值前置作废) | 免费点亮→展开锻造工坊工作间(武器/护甲路线升级=攻/AC 数值唯一入口,内容现行事实源=[锻造工坊](锻造工坊.md)) |
|
||||||
| 地脉共鸣 | 锻造 | easter | 生命/命中两线全部买满(两节点均 4 级拉满)**且** 同调位 1/2/3 全部解锁 | 免费自动觉醒;生命/命中两线 flat 各一份(命中分量随命中线注入面落位生效) |
|
| 地脉共鸣 | 锻造 | easter | 生命/命中两线全部买满(两节点均 4 级拉满)**且** 同调位 1/2/3 全部解锁 | 免费自动觉醒;生命/命中两线 flat 各一份(命中分量随命中线注入面落位生效) |
|
||||||
| 秘宝匣 | 钥石 | unlock | 脊柱生命第 1 级 | 免费点亮→展开秘宝匣工作间(秘宝解锁+同调装配,现行事实源=[秘宝](../跨局循环/秘宝.md)) |
|
| 秘宝匣 | 钥石 | unlock | 脊柱生命第 1 级 | 免费点亮→展开秘宝匣工作间(秘宝解锁+同调装配,现行事实源=[秘宝](../跨局循环/秘宝.md)) |
|
||||||
| 刷新升级 | 钥石 | rule | 秘宝匣 | 每级提升同调刷新能力(现役生效走同调段账本) |
|
| 刷新升级 | 钥石 | rule | 秘宝匣 | 每级提升同调刷新能力(现役生效走同调段账本;树上接线=缺陷修复归实装批) |
|
||||||
| 同调位 1 | 同调 | socket | 无(根节点) | 解锁同调挂载位 1(**槽位收编已落地——判定源 = 树点亮数**) |
|
| 同调位 1 | 同调 | socket | 无(根节点) | 解锁同调挂载位 1(**槽位收编已落地——判定源 = 树点亮数,迭代 21 T4**) |
|
||||||
| 同调位 2 | 同调 | socket | 同调位 1 | 挂载位 2 |
|
| 同调位 2 | 同调 | socket | 同调位 1 | 挂载位 2 |
|
||||||
| 同调位 3 | 同调 | socket | 同调位 2 | 挂载位 3 |
|
| 同调位 3 | 同调 | socket | 同调位 2 | 挂载位 3 |
|
||||||
| 开局姿态 | 同调 | fork·双态 | 同调位 1 | **A** 先手压制=每关首轮行动点 +1 / **B** 稳健拓荒=每关首轮内受击减伤(购买解锁·默认 A·营地零币切换) |
|
| 开局姿态 | 同调 | fork·双态 | 同调位 1 | **A** 先手压制=每关首轮行动点 +1 / **B** 稳健拓荒=每关首轮内受击减伤(购买解锁·默认 A·营地零币切换) |
|
||||||
| 危险直觉 | 同调 | fork·双态 | 同调位 1 | **A** 锋=踩中危险格伤害减半·每关限次 / **B** 守=危险格标记错误返还行动点·每关限次(**六键已接线在役**) |
|
| 危险直觉 | 同调 | fork·双态 | 同调位 1 | **A** 锋=踩中危险格伤害减半·每关限次 / **B** 守=危险格标记错误返还行动点·每关限次(**六键已接线在役——迭代 21 T3;标错机制存在性 T0 已实查结案**) |
|
||||||
| 财富之道 | 同调 | fork·双态 | 同调位 1 | **A** 聚=战斗掉落 GP 增益(仅此渠道)/ **B** 散=GP 消费折价(全部 GP 消费面) |
|
| 财富之道 | 同调 | fork·双态 | 同调位 1 | **A** 聚=战斗掉落 GP 增益(仅此渠道)/ **B** 散=GP 消费折价(全部 GP 消费面) |
|
||||||
|
|
||||||
三组 Fork 各为一个双态开关节点:购买一次解锁(cap1、零重复购买),解锁后默认 A 态,营地零币在 A/B 间切换;同一时刻每组恰一个激活态(互斥由单态承载);六态效果数值全 provisional 读表。
|
三组 Fork 各为一个双态开关节点:购买一次解锁(cap1、零重复购买),解锁后默认 A 态,营地零币在 A/B 间切换;同一时刻每组恰一个激活态(互斥由单态承载);六态效果数值全 provisional 读表。
|
||||||
@@ -93,66 +94,53 @@
|
|||||||
|
|
||||||
所有付费节点只收钥石(2026-10-07 用户裁甲落定;行内 currency 字段保留为呈现元数据)。free 节点零币:两枚工作间钥匙(锻造工坊 / 秘宝匣)与彩蛋(觉醒)不经购买消费。
|
所有付费节点只收钥石(2026-10-07 用户裁甲落定;行内 currency 字段保留为呈现元数据)。free 节点零币:两枚工作间钥匙(锻造工坊 / 秘宝匣)与彩蛋(觉醒)不经购买消费。
|
||||||
|
|
||||||
购买校验四件套,全部通过才受理:①当前等级未满上限;②行门槛——脊柱节点第 N 级需全树已购总等级 ≥ 4×(N−1)(总等级口径 = tree_nodes 全部节点等级之和,免费点亮与分叉激活均计入——2026-10-11 歧义扫描裁甲;常量行门槛=4;门槛主语=节点目标等级;达成节奏重算归数值批);③requires 前置满足——点亮前置(前置节点全部已点亮)+ **等级阈值前置(requires_level:指定前置节点等级 ≥ n——机制位,现役 12 行零配置空转,配置归表行随需填)**;④Fork 节点未解锁(一节点双态——解锁后的态切换走零币切换口,不经购买)。执行购买时另查钥石余额:余额不足则购买失败,存档零副作用(等级、余额、激活态均不动)。
|
购买校验四件套,全部通过才受理:①当前等级未满上限;②行门槛——脊柱节点第 N 级需全树已购总等级 ≥ 4×(N−1)(总等级口径 = tree_nodes 全部节点等级之和,免费点亮与分叉激活均计入——2026-10-11 歧义扫描裁甲沿现役实态;常量行门槛=4;2026-10-11 一线一节点换代后门槛主语=节点目标等级,原层行判定作废;达成节奏重算归数值批);③requires 前置满足——点亮前置(前置节点全部已点亮)+ **等级阈值前置(requires_level:指定前置节点等级 ≥ n——R1 机制位 2026-10-13 顺带重立,2026-10-12 曾按卡片默认裁撤案执行、用户推翻补机制位;现役 12 行零配置空转,配置归表行随需填)**;④Fork 节点未解锁(一节点双态——解锁后的态切换走零币切换口,不经购买)。执行购买时另查钥石余额:余额不足则购买失败,存档零副作用(等级、余额、激活态均不动)。
|
||||||
|
|
||||||
写口唯一:营地界面只发购买意图信号,扣币、升级、写盘全部经元进度系统的树上购买写口;Fork 节点购买走树上分叉购买写口(购即解锁、默认 A 态),态切换走树上分叉切换写口(零币、只改激活态)。
|
写口唯一:营地界面只发购买意图信号,扣币、升级、写盘全部经元进度系统的树上购买写口;Fork 节点购买走树上分叉购买写口(购即解锁、默认 A 态),态切换走树上分叉切换写口(零币、只改激活态)。
|
||||||
|
|
||||||
### Fork 三组:一节点双态与免费切换
|
### Fork 三组:一节点双态与免费切换
|
||||||
|
|
||||||
Fork 组是封闭词表三组(类型表达归[锻造工坊](锻造工坊.md)):fg_posture(开局姿态)、fg_sense(危险直觉)、fg_economy(财富之道)。**每组一个节点、节点内两个状态**(2026-10-11 用户裁):购买节点即解锁开关(tree_nodes 入档),解锁后默认 A 态(激活态写入存档 fork_sides);营地零币在 A/B 间切换——切换只改激活态,效果按新激活态效果键生效;同态重复切换是零操作;已解锁节点无重复购买。体验形态是「付一次钱得到一个双态开关」——fork_sides 存档语义(组→激活态)不变。
|
Fork 组是封闭词表三组(2026-10-11 裁:克制专精整组砍除,类型表达归[锻造工坊](锻造工坊.md)):fg_posture(开局姿态)、fg_sense(危险直觉)、fg_economy(财富之道)。**每组一个节点、节点内两个状态**(2026-10-11 用户裁换代:现役 A/B 双行结构系迭代 12 沿袭,收编为单行双态):购买节点即解锁开关(tree_nodes 入档),解锁后默认 A 态(激活态写入存档 fork_sides);营地零币在 A/B 间切换——切换只改激活态,效果按新激活态效果键生效;同态重复切换是零操作;已解锁节点无重复购买。体验形态是「付一次钱得到一个双态开关」——现役 fork_sides 存档语义(组→激活态)不变,变的只是节点行的组织方式。
|
||||||
|
|
||||||
效果定案(2026-10-11 用户逐组裁,数值全 provisional 归数值批):
|
效果定案(2026-10-11 用户逐组裁,数值全 provisional 归数值批):
|
||||||
|
|
||||||
| 组(节点) | A 态 | B 态 | 设计注记 |
|
| 组(节点) | A 态 | B 态 | 设计注记 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| fg_posture 开局姿态 | 先手压制 = 每关首轮 AP +1 | 稳健拓荒 = 每关首轮内受击减伤 | 两侧同收**每关首轮窗**(每关第一场战斗的第一轮,第二关自动刷新——时间范围一致性裁甲) |
|
| fg_posture 开局姿态 | 先手压制 = 每关首轮 AP +1 | 稳健拓荒 = 每关首轮内受击减伤 | 两侧同收**每关首轮窗**(每关第一场战斗的第一轮,第二关自动刷新——时间范围一致性裁甲) |
|
||||||
| fg_sense 危险直觉 | 锋 = 踩中危险格伤害减半·每关限次 | 守 = 危险格标记错误返还行动点·每关限次 | 唯一根植排雷半边的组;玩家文案沿用「危险格 / 安全格」正主词,不出现雷字、不另造别名(2026-10-11 歧义扫描裁甲,废「陷阱/危险标记」自造词) |
|
| fg_sense 危险直觉 | 锋 = 踩中危险格伤害减半·每关限次 | 守 = 危险格标记错误返还行动点·每关限次 | 唯一根植排雷半边的组;玩家文案沿用「危险格 / 安全格」正主词,不出现雷字、不另造别名(2026-10-11 歧义扫描裁甲,废「陷阱/危险标记」自造词)。**前提核实在册**:标记错误机制存在性随实装批 T0 实查,查无则守侧换安全网向等价效果经用户裁 |
|
||||||
| fg_economy 财富之道 | 聚 = 战斗掉落 GP 增益 | 散 = GP 消费折价 | 范围(2026-10-11 歧义扫描裁):聚 = **仅战斗掉落渠道**;散 = **全部 GP 消费面**。**折扣定义边界(2026-10-12 用户裁)**:散的折价只覆盖商品购买价(消费折价系数),不含三选一付费刷新与商店刷新(`shop_refresh_cost` 不折)——这是折扣的定义边界本身 |
|
| fg_economy 财富之道 | 聚 = 战斗掉落 GP 增益 | 散 = GP 消费折价 | 范围(2026-10-11 歧义扫描裁):聚 = **仅战斗掉落渠道**;散 = **全部 GP 消费面**。**折扣定义边界(2026-10-12 卡片 v1.7 ⑪②裁决写入文档——原「设计避让」句按裁决改写)**:散的折价只覆盖商品购买价(消费折价系数),不含三选一付费刷新与商店刷新(`shop_refresh_cost` 不折)——这是折扣的定义边界本身,非对外两处旋钮的临时避让 |
|
||||||
|
|
||||||
「每关限次」的计数生命周期(2026-10-11 歧义扫描裁甲):限次计数随单次冒险持久、按关重置、新冒险清零、断点续玩保留。
|
「每关限次」的计数生命周期(2026-10-11 歧义扫描裁甲):限次计数随单次冒险持久、按关重置、新冒险清零、断点续玩保留。
|
||||||
|
|
||||||
A/B 态只放规则面:节点行持 a/b 双效果键(封闭规则键词表六键:posture 双键收每关首轮窗、sense 锋/守双键限次按关重置、economy 聚/散双键接线),效果按激活态取值,不接数值线。**规则键的效果参数长在节点行的效果键值里**(每键一个参数字典,键集与取值域由 schema 按键声明;六键参数见下方「规则键参数表」),效果引擎只读参数、不持字面量。两侧的设计判据是「不同强、非强弱」:MC 配对锚验收两侧关卡完成率差 <~3pp。
|
A/B 态只放规则面:节点行持 a/b 双效果键(封闭规则键词表六键——**已随迭代 21 T3 扩签落地**:posture 双键收每关首轮窗、sense 锋/守双键限次按关重置、economy 聚/散双键接线),效果按激活态取值,不接数值线。两侧的设计判据是「不同强、非强弱」:MC 配对锚验收两侧关卡完成率差 <~3pp(**迭代 21 V19 已验:perfect+max 档三组配对差全部 0.0pp 在带**)。
|
||||||
|
|
||||||
**规则键参数表**(参数名与取值域本文 owner;现行值读 `meta_tree.tres` 对应节点行 effects_a / effects_b):
|
|
||||||
|
|
||||||
| 规则键 | 态 | 参数 | 取值域 | 语义 |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| posture_first_strike | 开局姿态 A 先手压制 | ap_bonus | int [1, 4] | 每关首轮行动点加成 |
|
|
||||||
| posture_bulwark | 开局姿态 B 稳健拓荒 | shield | int [1, 9] | 每关首轮窗内受击时的盾值 |
|
|
||||||
| sense_sharp | 危险直觉 A 锋 | halve_pct / cap_per_level | percent [1, 99] / int [1, 9] | 踩中危险格伤害按百分比折减 / 每关触发次数上限 |
|
|
||||||
| sense_guard | 危险直觉 B 守 | ap_refund / cap_per_level | int [1, 4] / int [1, 9] | 标记错误返还的行动点数 / 每关触发次数上限 |
|
|
||||||
| economy_hoard | 财富之道 A 聚 | mult_pct | percent [101, 300] | 战斗掉落 GP 乘数(仅战斗掉落渠道) |
|
|
||||||
| economy_spend | 财富之道 B 散 | discount_pct | percent [1, 99] | GP 消费折价系数(全部 GP 消费面;商品购买价适用,刷新类支出不折——定义边界见上表) |
|
|
||||||
|
|
||||||
「每关限次」两键的 cap_per_level 共用同一计数生命周期(随单次冒险持久、按关重置、新冒险清零、断点续玩保留)。
|
|
||||||
|
|
||||||
层级纪律(红线):局外树只放全局规则件——effects 禁 archetype 键(schema 加载致命);规则改写型特性(流派件)只走局内随机渠道,永不入树。
|
层级纪律(红线):局外树只放全局规则件——effects 禁 archetype 键(schema 加载致命);规则改写型特性(流派件)只走局内随机渠道,永不入树。
|
||||||
|
|
||||||
### 彩蛋节点:满排觉醒
|
### 彩蛋节点:满排觉醒
|
||||||
|
|
||||||
彩蛋节点全树上限 3 枚(schema 校验),在役 1 枚 = 地脉共鸣:**生命/命中两线全部买满(两节点均 4 级拉满)且 同调位 1/2/3 全部解锁**时自动觉醒点亮,零币、不经购买;效果 = **生命/命中两线属性 flat**(取值读表;攻防归锻造工坊路线;命中分量随命中线注入面落位生效——命中线在账未注入纪律不变),经注入面进下一局。彩蛋不进主路径,是深度玩家的挖掘位。
|
彩蛋节点全树上限 3 枚(schema 校验),在役 1 枚 = 地脉共鸣:**生命/命中两线全部买满(两节点均 4 级拉满)且 同调位 1/2/3 全部解锁**时自动觉醒点亮(2026-10-11 裁:原条件「四条淬炼线全部买满」随攻防所有权切分换代两线、复随一线一节点换代为两节点拉满),零币、不经购买;效果 = **生命/命中两线属性 flat**(取值读表;攻/护分量随所有权切分摘除——攻防归锻造工坊路线;命中分量随命中线注入面落位生效——命中线在账未注入纪律不变),经注入面进下一局。彩蛋不进主路径,是深度玩家的挖掘位。
|
||||||
|
|
||||||
### 存档域与旧档废弃
|
### 存档域与旧档废弃
|
||||||
|
|
||||||
存档 v5 起树域两键(meta 域下):tree_nodes = node_id→已购等级(Fork 节点购买态=1 级解锁标记);fork_sides = fork_group→激活态("a" / "b")。承载与读写归[存档序列化](../表现与支撑/存档序列化.md),本文登记内容语义。
|
存档 v5 起树域两键(meta 域下):tree_nodes = node_id→已购等级(Fork 节点购买态=1 级解锁标记);fork_sides = fork_group→激活态("a" / "b")。承载与读写归[存档序列化](../表现与支撑/存档序列化.md),本文登记内容语义。
|
||||||
|
|
||||||
**旧档废弃(2026-10-11 用户裁:开发阶段无迁移)**——Alpha 未出、无存量玩家,结构换代 = 破坏性废弃:加载检测到换代前结构(已删节点 id 残留)即废弃树域重置(或整档废弃),**禁做数据迁移与折算**;三体系迁移函数与旧域 `forge_levels` 已清退删除。
|
**旧档废弃(2026-10-11 用户裁:开发阶段无迁移)**——Alpha 未出、无存量玩家,结构换代 = 破坏性废弃:加载检测到换代前结构(已删节点 id 残留)即废弃树域重置(或整档废弃),**禁做数据迁移与折算**;三体系迁移函数与旧域 `forge_levels` 随实装批清退删除。
|
||||||
|
|
||||||
### 跨局注入:树效果怎么进下一局
|
### 跨局注入:树效果怎么进下一局
|
||||||
|
|
||||||
树的效果经两条通道随冒险开始参数面下传(通道现行事实源 = [元进度](元进度.md)「跨局注入」节):
|
树的效果经两条通道随冒险开始参数面下传(通道现行事实源 = [元进度](元进度.md)「跨局注入」节):
|
||||||
|
|
||||||
① 属性通道——开局属性 = **角色基础值 + 树生命/命中淬炼 flat(Σ 节点 effects × 等级)+ 锻造路线加值(当前武器攻击加值 + 当前甲 AC 加值,只按当前选中生效,正主 = [锻造工坊](锻造工坊.md))+ 局内加算区 flat**(2026-10-11 用户裁攻防所有权切分:树脊柱只持生命/命中,攻/AC 唯一来源=锻造路线——每根数值轴全游戏单一来源;树淬炼为账号全局基础层、锻造路线为专精层,两层相加)。写入覆盖值通道(攻击 / 生命上限 / 护甲等级),开局显式传入战斗初始化。命中线已购等级已记但未入注入面——消费面(命中折扣档)归数值批(代码批注在册披露)。
|
① 属性通道——开局属性 = **角色基础值 + 树生命/命中淬炼 flat(Σ 节点 effects × 等级)+ 锻造路线加值(当前武器攻击加值 + 当前甲 AC 加值,只按当前选中生效,正主 = [锻造工坊](锻造工坊.md))+ 局内加算区 flat**(2026-10-11 攻防所有权切分叠加公式换代:树脊柱只持生命/命中,攻/AC 唯一来源=锻造路线——每根数值轴全游戏单一来源;旧「柜台三档 flat」项随柜台退役移除,树淬炼成账号全局基础层、锻造路线成专精层,两层相加)。写入覆盖值通道(攻击 / 生命上限 / 护甲等级),开局显式传入战斗初始化。命中线已购等级已记但未入注入面——消费面(命中折扣档)归数值批(代码批注在册披露)。
|
||||||
|
|
||||||
② 规则通道——各 Fork 组激活态的效果键集经冒险开始参数面下传;每场战斗开始时由效果引擎重建合成订阅行生效。开新冒险与继续上局两入口同参同值。
|
② 规则通道——各 Fork 组激活态的效果键集经冒险开始参数面下传;每场战斗开始时由效果引擎重建合成订阅行生效。开新冒险与继续上局两入口同参同值。
|
||||||
|
|
||||||
### 已建未接面(接线落地态)
|
### 已建未接面(接线落地态——2026-10-13 迭代 21 反哺写入换代)
|
||||||
|
|
||||||
三条原「已建表/已可购但消费面未接」的实态,**两条已接线在役、一条维持纪律**:
|
三条原「已建表/已可购但消费面未接」的实态,**两条已随迭代 21 接线在役、一条维持纪律**:
|
||||||
|
|
||||||
- 同调位数量判定源——**已接**:同调位判定源已切树点亮数(同调位 1/2/3 三节点),旧条件表(按 Boss 击杀次数自动涨)已删除(attunement_growth.tres 谓词表退役)。
|
- 同调位数量判定源——**已接(迭代 21 T4)**:同调位判定源已切树点亮数(同调位 1/2/3 三节点),旧条件表(按 Boss 击杀次数自动涨)已随迭代 21 T5 删除(attunement_growth.tres 谓词表退役)。
|
||||||
- 刷新升级节点——**已接**:树上购买(刷新升级节点)同路由营地刷新升级写口,价格/cap 单一事实源 = Y 行表值;双入口并存(树上节点与秘宝匣装配段升级钮写同一笔)。
|
- 刷新升级节点——**已接(迭代 21 T4)**:树上购买(刷新升级节点)同路由营地刷新升级写口,价格/cap 单一事实源 = Y 行表值;双入口并存(树上节点与秘宝匣装配段升级钮写同一笔,Q1 裁)。
|
||||||
- 命中线 flat 不入注入面——**维持**:注入参数面无命中字段,命中未注入;消费面开启归数值批(M4)。
|
- 命中线 flat 不入注入面——**维持(契约 6 纪律)**:注入参数面无命中字段,命中未注入;消费面开启归数值批(M4)。
|
||||||
|
|
||||||
## 依赖与输出
|
## 依赖与输出
|
||||||
|
|
||||||
@@ -161,15 +149,15 @@ A/B 态只放规则面:节点行持 a/b 双效果键(封闭规则键词表
|
|||||||
| 上游 | [元进度](元进度.md) | 钥石——树是永久强化的承载结构与营地本体;消费经钥石余额(写口存档系统),注入通道现行事实源在对方;旧柜台退役面在对方登记 |
|
| 上游 | [元进度](元进度.md) | 钥石——树是永久强化的承载结构与营地本体;消费经钥石余额(写口存档系统),注入通道现行事实源在对方;旧柜台退役面在对方登记 |
|
||||||
| 上游 | [数据配置](../表现与支撑/数据配置.md) | meta_tree.tres 承载与 schema 校验机制——本系统为结构 owner、数值回填归数值批 |
|
| 上游 | [数据配置](../表现与支撑/数据配置.md) | meta_tree.tres 承载与 schema 校验机制——本系统为结构 owner、数值回填归数值批 |
|
||||||
| 上游 | [存档序列化](../表现与支撑/存档序列化.md) | tree_nodes / fork_sides 持久化与旧档废弃承载 |
|
| 上游 | [存档序列化](../表现与支撑/存档序列化.md) | tree_nodes / fork_sides 持久化与旧档废弃承载 |
|
||||||
| 上游 | [秘宝](秘宝.md) | 同调位槽位判定源 = 树点亮数(**已切换在役**;旧条件表已删);秘宝匣工作间内目录与装配现行事实源在彼 |
|
| 上游 | [秘宝](秘宝.md) | 同调位槽位判定源 = 树点亮数(**已切换在役,迭代 21 T4**;旧条件表已删);秘宝匣工作间内目录与装配现行事实源在彼 |
|
||||||
| 上游 | [锻造工坊](锻造工坊.md) | 武器/护甲路线升级现行事实源在彼——树持钥匙节点(无前置),工作间柜台=钥匙展开面板;攻/AC 数值唯一来源在彼(所有权切分红线) |
|
| 上游 | [锻造工坊](锻造工坊.md) | 武器/护甲路线升级现行事实源在彼——树持钥匙节点(无前置),工作间柜台=钥匙展开面板;攻/AC 数值唯一来源在彼(所有权切分红线) |
|
||||||
| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 冒险开始参数面——树生命/命中淬炼 flat(叠加进覆盖值通道)与规则键集的注入通道 |
|
| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 冒险开始参数面——树生命/命中淬炼 flat(叠加进覆盖值通道)与规则键集的注入通道 |
|
||||||
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 营地四柜台并排呈现——树淬炼柜台=树脊柱界面形态(案甲);信号 = 树上购买意图 / 树上分叉切换意图 |
|
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 营地四柜台并排呈现——树淬炼柜台=树脊柱界面形态(案甲);信号 = 树上购买意图 / 树上分叉切换意图 |
|
||||||
| 下游 | 战斗侧效果引擎 | 规则键消费面——每场战斗开始时按激活态效果键及其参数重建合成订阅(参数读节点行,引擎零字面量) |
|
| 下游 | 战斗侧效果引擎 | 规则键消费面——每场战斗开始时重建合成订阅(机制硬编码,无表行) |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
|
|
||||||
**P0 语义已全量落地**:12 节点结构(脊柱 = 生命/命中一线一节点、Fork = 三节点双态)+ 营地统一(树 = 营地本体、生命/命中唯一入口、攻防归锻造工坊、工作间钥匙、四柜台呈现)+ 三组 Fork 双态真效果 + 购买/切换/门槛/彩蛋/注入/旧档废弃全链,逐条判据见「验收标准」节;残留人闸 = 实机目检营地四柜台(用户实机目检核销,沿革查 git 提交史)。旧 33 节点结构已废弃重置(禁迁移)。
|
**P0 语义已随迭代 21 全量落地(2026-10-12 入库;2026-10-13 反哺写入换代——原「33 节点现役态维持」过渡态终结)**:12 节点结构(脊柱 = 生命/命中一线一节点、Fork = 三节点双态)+ 营地统一(树 = 营地本体、生命/命中唯一入口、攻防归锻造工坊、工作间钥匙、四柜台呈现)+ 三组 Fork 双态真效果 + 购买/切换/门槛/彩蛋/注入/旧档废弃全链,逐条判据见「验收标准」节;残留人闸 = 实机目检营地四柜台(体验验证清单 ⑳)。旧 33 节点结构随树结构版本换代废弃重置(禁迁移,Q3 裁)。
|
||||||
|
|
||||||
## P1 / P2 后置
|
## P1 / P2 后置
|
||||||
|
|
||||||
@@ -178,27 +166,29 @@ A/B 态只放规则面:节点行持 a/b 双效果键(封闭规则键词表
|
|||||||
| P1 | 命中线 flat 入注入面 | 消费面 = 命中折扣档归数值批(代码批注在册) |
|
| P1 | 命中线 flat 入注入面 | 消费面 = 命中折扣档归数值批(代码批注在册) |
|
||||||
| P2 | 彩蛋发现率监控 | 发现率过低改树内灰色预告的反例条件在册;监控读数归呈报线 |
|
| P2 | 彩蛋发现率监控 | 发现率过低改树内灰色预告的反例条件在册;监控读数归呈报线 |
|
||||||
|
|
||||||
|
(原 P1「Fork 效果面差异化」已定案归实装批;「同调位 / 刷新升级消费面接管」已定案归实装批〔刷新升级定性缺陷修复〕;「三柜台→一树」已由营地统一模型〔案甲〕承接——三者均并入待办清单「天赋树实装批」,不再单列。)
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
本系统的数值行全部外置(数值纪律:正文只定规则与键结构,行值读配置表):
|
本系统的数值行全部外置(数值纪律:正文只定规则与键结构,行值读配置表):
|
||||||
|
|
||||||
| 表 / 常量 | 键结构归属 | 数值行 |
|
| 表 / 常量 | 键结构归属 | 数值行 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 节点表 `data/tables/meta_tree.tres`(12 行:价格 / 等级上限 / requires(点亮前置)/ **requires_level(等级阈值前置——机制位,现役零配置)** / effects 取值(Fork 行持 a/b 双效果键,每键值=参数字典,参数名与取值域见「规则键参数表」);row 字段随一线一节点退役) | schema 声明,本文 owner | 全 provisional,归数值批投值 |
|
| 节点表 `data/tables/meta_tree.tres`(换代后 12 行:价格 / 等级上限 / requires(点亮前置)/ **requires_level(等级阈值前置——R1 机制位,现役零配置)** / effects 取值(Fork 行持 a/b 双效果键)/ 限次值;row 字段随一线一节点退役) | schema 声明,本文 owner | 全 provisional,归数值批投值 |
|
||||||
| 脊柱行门槛 = 4 | 节点表结构声明持有,本文 owner | 规则即门槛(节点第 N 级需全树总等级 ≥ 4×(N−1)) |
|
| 脊柱行门槛 = 4 | 节点表结构声明持有,本文 owner | 规则即门槛(节点第 N 级需全树总等级 ≥ 4×(N−1)) |
|
||||||
| Fork 组词表(三组)/ 规则键词表(六键) | 三组 Fork 词表与六键规则词表由节点表结构声明持有(封闭词表) | 词表即规则;规则键效果参数读节点行,效果引擎按参数合成 |
|
| Fork 组词表(三组)/ 规则键词表(换代后六键,扩表随实装批) | 三组 Fork 词表与六键规则词表由节点表结构声明持有(封闭词表) | 词表即规则;规则键效果值由效果引擎合成 |
|
||||||
| 钥石产出、刷新升级行族 | 现行事实源 = [元进度](元进度.md)调参表 | `data/tables/meta.tres` |
|
| 钥石产出、刷新升级行族 | 现行事实源 = [元进度](元进度.md)调参表 | `data/tables/meta.tres` |
|
||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
- 结构封闭:meta_tree.tres 通过 schema 校验零违例——12 节点、脉 / 类型 / 币词表出域即拒、Fork 三组每组恰一节点且持 a/b 双效果键、彩蛋 ≤3、effects 键封闭、零 archetype 键;六键效果键值均持参数字典且参数名/取值域合规(见「规则键参数表」),缺参数或越域加载期致命。
|
- 结构封闭:meta_tree.tres 通过 schema 校验零违例——12 节点、脉 / 类型 / 币词表出域即拒、Fork 三组每组恰一节点且持 a/b 双效果键、彩蛋 ≤3、effects 键封闭、零 archetype 键。
|
||||||
- 行门槛可判:全树已购总等级 < 4×(N−1) 时脊柱节点第 N 级不可购;总等级达标当刻该级开放购买。
|
- 行门槛可判:全树已购总等级 < 4×(N−1) 时脊柱节点第 N 级不可购;总等级达标当刻该级开放购买。
|
||||||
- 前置可判(点亮前置):requires 任一未点亮则节点不可购,逐一点亮后可购;锻造工坊钥匙无前置——初始即可点亮(free 零币)。**等级阈值前置:配置了该键的节点,指定前置节点等级 < n 时不可购、达标当刻开放(现役零配置)。**
|
- 前置可判(点亮前置):requires 任一未点亮则节点不可购,逐一点亮后可购;锻造工坊钥匙无前置——初始即可点亮(free 零币)。**等级阈值前置:配置了该键的节点,指定前置节点等级 < n 时不可购、达标当刻开放(现役零配置,判定面已单独验证)。**
|
||||||
- 工作间可判:钥匙节点(锻造工坊 / 秘宝匣)未点亮时对应柜台锁定态、工作间不可进入;点亮后展开;图鉴无门槛常开。
|
- 工作间可判:钥匙节点(锻造工坊 / 秘宝匣)未点亮时对应柜台锁定态、工作间不可进入;点亮后展开;图鉴无门槛常开。
|
||||||
- 单币可判:任一付费节点购买只扣钥石;余额不足购买失败,且存档零变化(等级、余额、激活态均不动)。
|
- 单币可判:任一付费节点购买只扣钥石;余额不足购买失败,且存档零变化(等级、余额、激活态均不动)。
|
||||||
- 双态可判:Fork 节点购买解锁后默认 A 态;切换零币,切换后规则键集=新激活态效果键;同态重复切换零操作;未解锁 Fork 不可切换、不可重复购买。
|
- 双态可判:Fork 节点购买解锁后默认 A 态;切换零币,切换后规则键集=新激活态效果键;同态重复切换零操作;未解锁 Fork 不可切换、不可重复购买。
|
||||||
- 彩蛋可判:生命/命中两节点均买满(4 级拉满)且同调位 1/2/3 全部解锁时彩蛋节点自动点亮且零消费;任一条件不满足则不亮。
|
- 彩蛋可判:生命/命中两节点均买满(4 级拉满)且同调位 1/2/3 全部解锁时彩蛋节点自动点亮且零消费;任一条件不满足则不亮。
|
||||||
- 注入可判:开局覆盖值 = 角色基础值 + 树生命/命中淬炼 flat(命中暂不注入——消费面开启归数值批、非缺陷)+ 锻造路线加值 + 局内加算区(各层语义清晰可加);规则键集 = 全部 Fork 组激活态效果键集;开新冒险与继续上局两入口参数同值;全新存档(树全零)开局与零树状态完全一致。
|
- 注入可判:开局覆盖值 = 角色基础值 + 树生命/命中淬炼 flat(命中暂不注入——消费面开启归数值批,契约 6 纪律维持、非缺陷)+ 锻造路线加值 + 局内加算区(各层语义清晰可加);规则键集 = 全部 Fork 组激活态效果键集;开新冒险与继续上局两入口参数同值;全新存档(树全零)开局与零树状态完全一致。
|
||||||
- 旧档废弃可判:加载换代前结构存档 → 树域废弃重置 → 后续游玩正常且无残留脏节点(开发阶段纪律,禁迁移);全新存档(树全零)开局与零树状态完全一致。
|
- 旧档废弃可判:加载换代前结构存档 → 树域废弃重置 → 后续游玩正常且无残留脏节点(开发阶段纪律,禁迁移);全新存档(树全零)开局与零树状态完全一致。
|
||||||
|
|
||||||
## 待办
|
## 待办
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
# 生涯
|
# 生涯
|
||||||
|
|
||||||
> **一句话定位**:营地里与三柜台平级的**局外只读界面**——营地管「花」(花钥石买永久强化),生涯管「看」(看自己跨局攒下的一切:累计战绩、历史冒险、图鉴收集)。冒险进行中不给任何数据回看(2026-10-04 用户裁决 P-C7 的延续),生涯是历史数据唯一的家。
|
> **一句话定位**:营地里与三柜台平级的**局外只读界面**——营地管「花」(花钥石买永久强化),生涯管「看」(看自己跨局攒下的一切:累计战绩、历史冒险、图鉴收集)。冒险进行中不给任何数据回看(2026-10-04 用户裁决 P-C7 的延续),生涯是历史数据唯一的家。
|
||||||
> **状态**:期一已实装(跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已三入口化换代、营地里经笔记本接入(信息架构节 v1.1)。现行为 v1.5。
|
> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已随迭代 33 卡② 三入口化换代、营地里经笔记本接入归迭代 34 卡④(信息架构节 v1.1,2026-10-22 反哺写入)。现行为 v1.3。
|
||||||
> **来源**:[待办清单「『生涯』界面——冒险中数据回看的唯一承接处」条](../../../../待办清单.md)(2026-10-04 用户裁决 P-C7——冒险中不给数据回看,历史战报与结算明细的查看去向 = 新「生涯」界面)。
|
> **来源**:[待办清单「『生涯』界面——冒险中数据回看的唯一承接处」条](../../../../待办清单.md)(2026-10-04 用户裁决 P-C7——冒险中不给数据回看,历史战报与结算明细的查看去向 = 新「生涯」界面)。
|
||||||
|
|
||||||
## 一、信息架构
|
## 一、信息架构
|
||||||
|
|
||||||
生涯入口经营地接入(目标结构=营地笔记本;三入口化后主菜单无生涯钮,现期无玩家可见入口,内部路径直调可达)。现行主菜单只有三个一级钮(用户裁决):「进入存档」「设置」「退出游戏」——「进入存档」为唯一进度入口,点击打开选档界面(3 存档位)。
|
生涯入口经营地接入(目标结构=营地笔记本,迭代 34 卡④承载;迭代 33 卡② 三入口化后主菜单无生涯钮,现期无玩家可见入口,内部路径直调可达)。现行主菜单只有三个一级钮(迭代 33 卡②,用户裁决 1):「进入存档」「设置」「退出游戏」——「进入存档」为唯一进度入口,点击打开选档界面(3 存档位,迭代 33 卡③)。
|
||||||
|
|
||||||
```
|
```
|
||||||
主菜单(开始覆盖层,三入口)
|
主菜单(开始覆盖层,三入口)
|
||||||
├─ 进入存档 → 选档界面(3 存档位;空槽「新档」/有档「进档」/「删档」二次确认)
|
├─ 进入存档 → 选档界面(3 存档位;空槽「新档」/有档「进档」/「删档」二次确认)
|
||||||
│ └─ 进档/新档 → 营地(目标=营地场景图;现期暂行落点=营地覆盖层)
|
│ └─ 进档/新档 → 营地(迭代 34 卡④改为营地场景图;现期暂行落点=营地覆盖层)
|
||||||
├─ 设置
|
├─ 设置
|
||||||
└─ 退出游戏
|
└─ 退出游戏
|
||||||
|
|
||||||
调试浮窗(发布态恒隐:开始层与战斗屏/关卡地图屏均零调试入口与角标;
|
调试浮窗(发布态恒隐:调试入口的写死行已随迭代 38 卡⑦ 删除,开始层与战斗屏/关卡地图屏均零调试入口与角标;
|
||||||
开发期临时启用=本地改调试入口缺省、不提交)
|
开发期临时启用=本地改调试入口缺省、不提交)
|
||||||
|
|
||||||
营地(存档内,进档/新档落点)
|
营地(存档内,进档/新档落点)
|
||||||
└─ 生涯(局外只读面;入口=营地笔记本)
|
└─ 生涯(局外只读面;入口=营地笔记本,迭代 34 卡④承载)
|
||||||
├─ 跨局汇总(累计战绩与解锁总览)
|
├─ 跨局汇总(累计战绩与解锁总览)
|
||||||
├─ 历史冒险回看(逐局摘要与单局明细)
|
├─ 历史冒险回看(逐局摘要与单局明细)
|
||||||
└─ 图鉴(敌人优先,秘宝/奇物随后)
|
└─ 图鉴(敌人优先,秘宝/奇物随后)
|
||||||
@@ -27,29 +27,29 @@
|
|||||||
|
|
||||||
边界三条(均为 2026-10-06 用户裁 P4 甲):
|
边界三条(均为 2026-10-06 用户裁 P4 甲):
|
||||||
|
|
||||||
1. **局内不放生涯入口**。冒险进行中玩家只看状态面板(局内只读查看钥石与本局冒险进度);若历史回看能从局内到达,等于绕回 P-C7 退役前的形态,禁止。
|
1. **局内不放生涯入口**。冒险进行中玩家只看状态面板(迭代 17 卡③并行批——局内只读查看钥石与本局冒险进度);若历史回看能从局内到达,等于绕回 P-C7 退役前的形态,禁止。
|
||||||
2. **生涯内零跳转**。不放「去营地」之类的操作引导,生涯纯只读。
|
2. **生涯内零跳转**。不放「去营地」之类的操作引导,生涯纯只读。
|
||||||
3. **与 P-C7 的关系**:生涯的成立正是 P-C7 裁决的补偿面——「冒险中无回看」的已知代价由生涯承接(待办清单条目原文口径),本文不提议在冒险中恢复任何回看入口。
|
3. **与 P-C7 的关系**:生涯的成立正是 P-C7 裁决的补偿面——「冒险中无回看」的已知代价由生涯承接(待办清单条目原文口径),本文不提议在冒险中恢复任何回看入口。
|
||||||
|
|
||||||
## 二、承载内容清单(逐段标数据可行性)
|
## 二、承载内容清单(逐段标数据可行性)
|
||||||
|
|
||||||
生涯装三段内容:跨局汇总、历史冒险回看、图鉴。这三段是待办清单条目给定的骨架,本节在其上逐项落到数据源。跨局汇总与图鉴的收集类数据大多现成;历史回看的数据面已在存(见下),缺口只有三件,方向已按 P2 甲裁决定。
|
生涯装三段内容:跨局汇总、历史冒险回看、图鉴。这三段是待办清单条目给定的骨架,本节在其上逐项落到数据源。跨局汇总与图鉴的收集类数据大多现成;历史回看的数据面已在存(见下),缺口只有三件,已随 P2 甲裁决定方向。
|
||||||
|
|
||||||
### 跨局汇总(期一)
|
### 跨局汇总(期一)
|
||||||
|
|
||||||
| 内容 | 数据源 | 现状 |
|
| 内容 | 数据源 | 现状 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 冒险总局数 / 冒险成功局数 | `adventure_total` / `adventure_cleared` 两终身计数域(save v6——期一已落地) | 现成 |
|
| 冒险总局数 / 通关局数 | `adventure_total` / `adventure_cleared` 两终身计数域(save v6——期一已落地) | 现成(2026-10-07 迭代 18 卡④期一实装) |
|
||||||
| 各关完成次数 | 存档域 `level_clear_counts`(按关卡序号计) | 现成 |
|
| 各关完成次数 | 存档域 `level_clear_counts`(按关卡序号计) | 现成 |
|
||||||
| Boss 首杀与总击杀 | Boss 首杀标记(存档域 `boss_first_kill`)/ Boss 击杀总数(存档域 `boss_kill_count`) | 现成 |
|
| Boss 首杀与总击杀 | Boss 首杀标记(存档域 `boss_first_kill`)/ Boss 击杀总数(存档域 `boss_kill_count`) | 现成 |
|
||||||
| 钥石余额 | 存档域 `keystone_balance`;累计收支流水不入存档 | 现成。加钥石与花钥石只动余额——如要做属新增流水域,另呈报,本文只登记 |
|
| 钥石余额 | 存档域 `keystone_balance`;累计收支流水不入存档 | 现成。加钥石与花钥石只动余额——如要做属新增流水域,期一实装批另呈报,本文只登记 |
|
||||||
| 三柜台解锁完成度概览(已删) | 2026-10-12 用户裁:生涯页不统计天赋树与账号成长态,只统计终身计数 | — |
|
| ~~三柜台解锁完成度概览~~ | (整行删——2026-10-12 用户裁:生涯页不统计天赋树与账号成长态,只统计终身计数;数据源属性锻造等级/工坊状态/树节点三投影随天赋树实装批退役,体验验证清单⑲两观测项同步摘除) | — |
|
||||||
|
|
||||||
### 历史冒险回看(期二)
|
### 历史冒险回看(期二)
|
||||||
|
|
||||||
数据面现役事实:每局冒险收束时已有逐局摘要自动入档——存于存档域 `recent_summaries`:新局插最前、按上限截断,上限 10 条。摘要字段在冒险收束时组装(冒险收束受理:结局 result、完成关数 levels_cleared、止步关 stopped_at、钥石合计 keystone_total、本局主种子 master_seed,另附逐杀掉落 keystone_drops 与终局专长持有集 relics(存档键名沿用历史形态)等;钥石与逐杀明细、真视计数、特性持有集取数经主角账两件〔属性账 / 获得日记〕只读投影);摘要的内容口径 owner = [冒险结构](../冒险循环/冒险结构.md),本文不复述其口径。
|
数据面现役事实:每局冒险收束时已有逐局摘要自动入档——存于存档域 `recent_summaries`:新局插最前、按上限截断,上限 10 条。摘要字段在冒险收束时组装(冒险收束受理:结局 result、完成关数 levels_cleared、止步关 stopped_at、钥石合计 keystone_total、本局主种子 master_seed,另附逐杀掉落 keystone_drops 与终局专长持有集 relics(存档键名沿用历史形态)等;钥石与逐杀明细、真视计数、特性持有集取数经主角账两件〔属性账 / 获得日记〕只读投影——2026-10-27 迭代 39 拆件后形态);摘要的内容口径 owner = [冒险结构](../冒险循环/冒险结构.md),本文不复述其口径。
|
||||||
|
|
||||||
2026-10-06 用户裁(P2 甲):每局一行摘要,行内给**结局 / 到达关卡 / 钥石收入 / 用时**四件事,上限存最近 N 局。对应三件实绩(代码级复核确认的缺口,非新建数据面):
|
2026-10-06 用户裁(P2 甲):每局一行摘要,行内给**结局 / 到达关卡 / 钥石收入 / 用时**四件事,上限存最近 N 局。对应三件实绩(本批代码级复核确认的缺口,非新建数据面):
|
||||||
|
|
||||||
1. **扩容**:cap 10 → N。N 候选 20 / 50 / 维持 10,实装期按存档体积读数三选一;读数方法与列表形态的参数化维度由设计稿给出、实装期执行。
|
1. **扩容**:cap 10 → N。N 候选 20 / 50 / 维持 10,实装期按存档体积读数三选一;读数方法与列表形态的参数化维度由设计稿给出、实装期执行。
|
||||||
2. **补「用时」埋点**:全仓现在没有任何用时采集点(摘要字段集〔冒险收束受理组装面〕无此项)——属新增埋点,随期二。
|
2. **补「用时」埋点**:全仓现在没有任何用时采集点(摘要字段集〔冒险收束受理组装面〕无此项)——属新增埋点,随期二。
|
||||||
@@ -63,15 +63,15 @@
|
|||||||
|
|
||||||
- **敌人图鉴(优先,2026-10-06 用户裁 P3 甲)**:直接承接待办清单在册「敌方技能图鉴 / 学习呈现」条(P2——见过 → 认得 → 记谱;归属 [HUD 框架](../表现与支撑/HUD框架.md) 与 [敌人系统](../战斗循环/敌人系统.md))。「见过」记账面 = 新增 meta 域,涉存档 schema 迁移(与期一终身计数域同属 schema 义务面;版本号按实装时点的现行版本顺延)。
|
- **敌人图鉴(优先,2026-10-06 用户裁 P3 甲)**:直接承接待办清单在册「敌方技能图鉴 / 学习呈现」条(P2——见过 → 认得 → 记谱;归属 [HUD 框架](../表现与支撑/HUD框架.md) 与 [敌人系统](../战斗循环/敌人系统.md))。「见过」记账面 = 新增 meta 域,涉存档 schema 迁移(与期一终身计数域同属 schema 义务面;版本号按实装时点的现行版本顺延)。
|
||||||
- **秘宝 / 奇物图鉴(随后)**:无在册条目,立项时另行登记。
|
- **秘宝 / 奇物图鉴(随后)**:无在册条目,立项时另行登记。
|
||||||
- **奖励格图鉴:只登记不激活**(P3 甲)。营地「奖励格图鉴」柜台现况 = 常开独立位(四柜台并排,树淬炼柜台升主界面,图鉴本体仍空置、内容排 Alpha);该柜台已整体挂起冻结(2026-10-05 用户令,待办清单在册),重启须用户另行发令。
|
- **奖励格图鉴:只登记不激活**(P3 甲)。营地「奖励格图鉴」柜台现况 = 常开独立位(迭代 21 T6 四柜台并排重排——树淬炼柜台升主界面,图鉴本体仍空置、内容排 Alpha);该柜台已随配比预设批整体挂起冻结(2026-10-05 用户令,待办清单在册),重启须用户另行发令。
|
||||||
|
|
||||||
## 三、与既有界面的关系
|
## 三、与既有界面的关系
|
||||||
|
|
||||||
| 界面 | 管什么(现状指证) | 与生涯的边界 |
|
| 界面 | 管什么(现状指证) | 与生涯的边界 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 营地([camp UX spec](../../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树——营地场景图+五功能窗口形态);原底栏「最近冒险」条带已撤下(P6 甲),逐局历史回看唯一归生涯 | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带已撤(P6 甲) |
|
| 营地([camp UX spec](../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树)+ 底栏「最近冒险」条带——营地底栏把摘要逐局拼行(行模板「完成/放弃/失败 · 通关 N 关 · 钥石 +N · 种子 N」)、无截断上限,数据源与生涯历史回看同属一份最近摘要 | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带的去留是本提纲必答项——见 §五 P6 |
|
||||||
| 状态面板 | **局内**只读查看这一局进行中的钥石与本局冒险进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) |
|
| 状态面板(迭代 17 卡③,并行批开发中) | **局内**只读查看这一局进行中的钥石与本局冒险进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) |
|
||||||
| 结算屏([settlement-summary UX spec](../../../ux/settlement-summary.md)) | 冒险收束当下的入账明细——冒险收束时由结算屏呈现入账明细与钥石明细(复用终局面账行的呈现形态) | 收束当下的呈现保留不动;生涯承接的是收束之后的任意时刻回看 |
|
| 结算屏([settlement-summary UX spec](../../ux/settlement-summary.md)) | 冒险收束当下的入账明细——冒险收束时由结算屏呈现入账明细与钥石明细(复用终局面账行的呈现形态) | 收束当下的呈现保留不动;生涯承接的是收束之后的任意时刻回看 |
|
||||||
| 帮助手册(Beta 批,未实装——教学内容归 Beta 帮助手册) | 讲「怎么玩」 | 生涯讲「我玩过什么」。图鉴条目文案与手册是否共用内容源,接口登记归 Beta 批一并裁 |
|
| 帮助手册(Beta 批,未实装——教学内容归 Beta 帮助手册) | 讲「怎么玩」 | 生涯讲「我玩过什么」。图鉴条目文案与手册是否共用内容源,接口登记归 Beta 批一并裁 |
|
||||||
| 图例面板 | 局内符号/徽标即时解码 | 不合并——图例是局内解码面,图鉴是跨局收集面 |
|
| 图例面板 | 局内符号/徽标即时解码 | 不合并——图例是局内解码面,图鉴是跨局收集面 |
|
||||||
|
|
||||||
@@ -81,22 +81,24 @@
|
|||||||
|
|
||||||
| 期 | 内容 | 前置 | 建议窗口(候选) |
|
| 期 | 内容 | 前置 | 建议窗口(候选) |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 期一 | 跨局汇总页 + 主菜单生涯入口落位。总局数/冒险成功局数两个终身计数域(存档 schema v6)——**✅ 已实装**:汇总段六类九项+营地与系统组生涯钮+存档 v6 两终身计数域〔v5 升 v6 幂等迁移〕 | 对齐现行界面基线:字号六档 / 语义色 / 按钮最小高 40 点等现行界面基线 / 色板单源 / 页面壳的模态栈纪律——本文只登记、不展开 | Alpha 后最近一个 UI 窗口 |
|
| 期一 | 跨局汇总页 + 主菜单生涯入口落位。总局数/通关局数两个终身计数域随该批做存档 schema 迁移——**✅ 已实装(2026-10-07 迭代 18 卡④)**:汇总段六类九项+营地与系统组生涯钮+存档 v6 两终身计数域〔v5 升 v6 幂等迁移〕;闸读数与代拍板追认单原记于该批出口报告,该件已按「吸收即死」删除,读数以本行与该批提交信息为准 | 提纲评审通过。实装批前置义务 = 对齐迭代 16 UI 批后的现行基线:字号六档 / 语义色 / 按钮最小高 40 点等现行界面基线 / 色板单源 / 页面壳的模态栈纪律——与卡③需求卡片同款红线,本文只登记、不展开 | Alpha 后最近一个 UI 窗口 |
|
||||||
| 期二 | 历史冒险回看整段:N 扩容 + 用时埋点 + 旧档摘要迁移 + 逐局列表 + 单局明细(遗留明细界面复活承接)——营地条带已撤(P6 甲),期二无残留条带义务 | 期一。实装批开工前须向用户呈报两件:N 终值读数(20 / 50 / 维持 10 三选一)与「用时」埋点口径(计时起点、暂停是否计入——字段级细节本文不做) | 期一落地后独立批 |
|
| 期二 | 历史冒险回看整段:N 扩容 + 用时埋点 + 旧档摘要迁移 + 逐局列表 + 单局明细(遗留明细界面复活承接)+ 营地条带处置(P6 裁案落地) | 期一。实装批开工前须向用户呈报两件:N 终值读数(20 / 50 / 维持 10 三选一)与「用时」埋点口径(计时起点、暂停是否计入——字段级细节本文不做) | 期一落地后独立批 |
|
||||||
| 期三 | 图鉴承接(敌人优先,范围与顺序随 P3 甲);「见过」记账面 schema 义务随该批执行 | 期二或独立评估 | Beta 窗口候选(与教学引导同段评估——图鉴的「认得」轴与教学相关;待办清单教学引导节各条 2026-10-04 起已整体标 Beta 阶段) |
|
| 期三 | 图鉴承接(敌人优先,范围与顺序随 P3 甲);「见过」记账面 schema 义务随该批执行 | 期二或独立评估 | Beta 窗口候选(与教学引导同段评估——图鉴的「认得」轴与教学相关;待办清单教学引导节各条 2026-10-04 起已整体标 Beta 阶段) |
|
||||||
|
|
||||||
本地化文案权:生涯界面本体按钮、页签、空态文案归[设置与本地化](../表现与支撑/设置与本地化.md)线(全仓无多语言实装;文案权先例 = 教学文案定稿权登记于待办清单),实装批承接。
|
本地化文案权:生涯界面本体按钮、页签、空态文案归[设置与本地化](../表现与支撑/设置与本地化.md)线(全仓无多语言实装;文案权先例 = 教学文案定稿权登记于待办清单),实装批承接。
|
||||||
|
|
||||||
## 五、待裁点
|
## 五、待裁点
|
||||||
|
|
||||||
P0-P5 六点已于 2026-10-06 用户全裁(案甲 × 6),结论已写入上文对应节,不重复列。另待裁点一项:
|
P0-P5 六点已于 2026-10-06 用户全裁(案甲 × 6,备选案与淘汰依据在需求卡片 §8),结论已写入上文对应节,不重复列。本批新发现的待裁点一项:
|
||||||
|
|
||||||
### P6 · 营地底栏「最近冒险」条带去留(已裁甲案并落地)
|
### P6 · 营地底栏「最近冒险」条带去留(期二必答项)
|
||||||
|
|
||||||
**裁决与执行**:用户裁甲案(2026-11-01)——条带已撤下、逐局历史回看唯一归生涯;期二生涯历史回看批的条带处置义务随之清空。
|
**现状与问题**:营地底栏「最近冒险」条带把摘要逐行全部拼进同一个标签(行模板「完成/放弃/失败 · 通关 N 关 · 钥石 +N · 种子 N」,无截断上限),数据源与生涯历史回看同属一份最近摘要。生涯期二把上限扩到 N 后,条带按现行逻辑会把 N 行全拼进底栏——这是本批复核发现的实际耦合点,期二落地时必须给条带一个去处。
|
||||||
|
|
||||||
| 案 | 内容 | 淘汰/保留依据 |
|
| 案 | 内容 | 淘汰/保留依据 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 甲(建议) | 期二生涯历史回看落地时,营地条带撤下、逐局回看整体归生涯;期一(汇总页上线、数据面未动)期间条带原样保留零改动 | 分工矩阵干净——「看」归生涯、「买」归营地;逐局历史只剩一个权威呈现面,去重问题自然消解;顺带解开 N 扩容后底栏无上限拼行的实耦合 |
|
| 甲(建议) | 期二生涯历史回看落地时,营地条带撤下、逐局回看整体归生涯;期一(汇总页上线、数据面未动)期间条带原样保留零改动 | 分工矩阵干净——「看」归生涯、「买」归营地;逐局历史只剩一个权威呈现面,去重问题自然消解;顺带解开 N 扩容后底栏无上限拼行的实耦合 |
|
||||||
| 乙 | 两处并存——营地留最近几条速览、生涯给完整列表 | 营地顺手一眼仍有价值;淘汰候选:同一数据两处呈现,玩家要猜哪边全;条带须另加截断逻辑 = 新增一处维护面;「看」留在操作面违反分工矩阵 |
|
| 乙 | 两处并存——营地留最近几条速览、生涯给完整列表 | 营地顺手一眼仍有价值;淘汰候选:同一数据两处呈现,玩家要猜哪边全;条带须另加截断逻辑 = 新增一处维护面;「看」留在操作面违反分工矩阵 |
|
||||||
| 丙 | 条带原样永久保留(固定存 10 条,不随 N 动) | 改动最小;淘汰候选:与生涯列表长期双轨,上限语义分裂(营地固定 10 / 生涯 N),N 大于 10 后两处看到的条数对不上 |
|
| 丙 | 条带原样永久保留(固定存 10 条,不随 N 动) | 改动最小;淘汰候选:与生涯列表长期双轨,上限语义分裂(营地固定 10 / 生涯 N),N 大于 10 后两处看到的条数对不上 |
|
||||||
|
|
||||||
|
裁决方式:随本提纲评审一并定案,期二实装批执行。
|
||||||
@@ -1,54 +1,50 @@
|
|||||||
# 秘宝
|
# 秘宝
|
||||||
|
|
||||||
> 一句话:营地装配、整局冒险生效的角色机能件——操作包络加强(视野/行动点/刷新/挖掘距离等),不出角色战斗属性值、不改战斗结算机制(经济与操作参数——视野/距离/行动点/刷新/转存率——属操作包络;分界规则归[核心循环](../../01-核心循环.md)「道具三层职责与分界」节)
|
> 一句话:营地装配、整局冒险生效的角色机能件——操作包络加强(视野/行动点/刷新/挖掘距离等),不出角色战斗属性值、不改战斗结算机制(经济与操作参数——视野/距离/行动点/刷新/转存率——属操作包络;分界规则归[核心循环](../../01-核心循环.md)「道具三层职责与分界」节)
|
||||||
> 状态:已定稿(现行形态=局外同调件);现行为 v1.3
|
> 状态:已定稿(现行形态=局外同调件——2026-10-03 迭代 11 第①批同调实施批已入库);现行为 v1.1
|
||||||
> 定位与形态:见下节
|
> 定位与形态:见下节
|
||||||
> 术语:本文件的项目术语(同调位/RAP/GP/真视/危险格/整图等)定义见[术语表](../../术语表.md)
|
> 术语:本文件的项目术语(同调位/RAP/GP/真视/危险格/整图等)定义见[术语表](../../术语表.md)
|
||||||
|
|
||||||
## 定位与形态
|
## 定位与形态
|
||||||
|
|
||||||
**现行形态 = 局外同调件**:开局前在营地装配(营地·秘宝匣柜台「同调装配」段)、占同调位(0 起步、固定 3 格,每件固定占 1 格)、被动件整局生效/主动件每冒险充能(冒险开始重置)。实现面 = `treasure_items.tres` + 同调系统件(同调位数量判定源=天赋树同调位节点点亮数;原 `attunement_growth.tres` 谓词表已退役;解锁条件=数据行内解锁条件字段承载)。**现行目录 14 件**,逐件实录见「目录(重设计 v1)」各表实态列。
|
**现行形态 = 局外同调件**:开局前在营地装配(营地·秘宝匣柜台「同调装配」段)、占同调位(0 起步、固定 3 格,每件固定占 1 格)、被动件整局生效/主动件每冒险充能(冒险开始重置)。实现面 = `treasure_items.tres` + 同调系统件(同调位数量判定源=天赋树同调位节点点亮数——2026-10-11 Q2 裁甲、迭代 21 T4 槽位收编落地;原 `attunement_growth.tres` 谓词表已顺带退役;解锁条件=数据行内解锁条件字段承载——迭代 22 实装落地,2026-10-12)。**新目录 12 件已随迭代 22 实装批全量落地(2026-10-12,T1-T7)**,逐件实录见「目录(重设计 v1)」各表实态列。
|
||||||
|
|
||||||
**沿革一句话**:旧目录九件已全数退役入素材库(2026-10-08/10 用户裁)。历史细节见 git 提交史。
|
**沿革一句话**:本系统前身为切片期掉落消耗品形态(2026-09-29 迭代 7),2026-10-03 随同调实施批整体替换为现行形态;旧目录九件已全数退役入素材库(2026-10-08/10 用户裁)。历史细节见 git 提交史。
|
||||||
|
|
||||||
**现行形态速览**:
|
**现行形态速览**:
|
||||||
|
|
||||||
- **同调位分档**(2026-10-07 用户裁):同调位分三档=普通格/优秀格/稀有格;装配规则=**槽位可装 ≤ 槽位档位的件**(向下兼容,不惩罚早解锁);格品质随天赋树同调位节点递增(1=普通格/2=优秀格/3=稀有格,2026-10-10 用户裁)。装配面呈现槽位档位。
|
- **同调位分档**(2026-10-07 用户裁):同调位分三档=普通格/优秀格/稀有格;装配规则=**槽位可装 ≤ 槽位档位的件**(向下兼容,不惩罚早解锁);格品质随天赋树同调位节点递增(1=普通格/2=优秀格/3=稀有格,2026-10-10 用户裁;树侧接线=迭代 21 T4 槽位收编落地)。装配面呈现槽位档位(迭代 22 秘宝匣柜台落地)。
|
||||||
- **旧目录退役指针**:旧目录九件、魔法提灯、机制向三件处置已全数退役入素材库(表一 14 件)——现行目录见下方「目录(重设计 v1)」节;代码旧行已全数删除。
|
- **旧目录退役指针**:旧目录九件、魔法提灯、机制向三件处置已全数退役入素材库(表一 14 件)——现行目录见下方「目录(重设计 v1)」节;代码旧行已全数删除(迭代 20 先行删 2 行+迭代 22 T1 删 12 行,2026-10-12)。
|
||||||
- **三选一刷新双源**:刷新能力=**存量+临时**两笔系统资源——存量=持久(开局注入基值 0;来源=秘宝匣刷新升级行购买〔meta.tres attune_refresh_upgrade 行族〕+刷新练习件加仓;跨呈现持续、用完即无)、临时量=每次三选一呈现重置为基线 0(来源=效果件的临时注入,未用不结转);**消耗顺序=先扣临时、不足再扣存量**(2026-10-10 用户复述定案;正文不依赖代码字段名字母)。重抽复用现有洗牌逻辑,池规则全保留;自动游玩模式默认不刷。**GP 付费档(2026-10-06 用户令)**:免费双源用尽后可 GP 付费刷新,价=ceil(20×1.8^本次停点已付费刷) provisional(与商店货架刷新读同两个调参参数 shop_refresh_*,单点调参);付费刷计数每停点清零;钱包=冒险 GP 同一笔系统资源(唯一入口=冒险 GP 扣账口);余额不足=钮禁用(不隐藏)。店内专长凭证三选一暂不挂刷新面(扩面须先裁凭证保底计数交互)。**两笔语义**两笔语义的框架定义见[核心循环](../../01-核心循环.md)「生命周期轴」节。「三选一呈现」是比节点更细的事件——奖励节点、Boss 通关奖励、商店(凭证)三处都触发。奇物「刷新次数+1」类资源件的语义=存量一次性加仓。
|
- **三选一刷新双源**:刷新能力=**存量+临时**两笔系统资源——存量=持久(开局注入基值 0;来源=秘宝匣刷新升级行购买〔meta.tres attune_refresh_upgrade 行族〕+刷新练习件加仓;跨呈现持续、用完即无)、临时量=每次三选一呈现重置为基线 0(来源=效果件的临时注入,未用不结转);**消耗顺序=先扣临时、不足再扣存量**(2026-10-10 用户复述定案;代码字段名 X/Y 与两笔的字母对表归实装批 T0,正文不依赖字母)。重抽复用现有洗牌逻辑,池规则全保留;自动游玩模式默认不刷。**GP 付费档(2026-10-06 用户令)**:免费双源用尽后可 GP 付费刷新,价=ceil(20×1.8^本次停点已付费刷) provisional(与商店货架刷新读同两个调参参数 shop_refresh_*,单点调参);付费刷计数每停点清零;钱包=冒险 GP 同一笔系统资源(唯一入口=冒险 GP 扣账口);余额不足=钮禁用(不隐藏)。店内专长凭证三选一暂不挂刷新面(扩面须先裁凭证保底计数交互)。**两笔语义**两笔语义的框架定义见[核心循环](../../01-核心循环.md)「生命周期轴」节。「三选一呈现」是比节点更细的事件——奖励节点、Boss 通关奖励、商店(凭证)三处都触发。奇物「刷新次数+1」类资源件的语义=存量一次性加仓。
|
||||||
- **🔴 承重契约**(红线;其中真视范围等由数据加载校验强制):效果不允许写成直接加减属性的裸数值——效果类型只能取封闭白名单;真视(直接标出危险格的效果,定义见「核心规则」)单次范围 ≤3×3;核心逻辑不做异步等待;零随机;排雷玩法零特判;危险格与安全格的分布同池冻结——资源类件只能调整权重投影、不能改池结构;**棋盘事实不可变**(秘宝效果不移除、不增改危险格位置与邻接数字——效果形态只允许信息呈现与开格动作;2026-10-10 用户裁,原爆破工兵包「中立移除」即违规形态、随件退役废止)。
|
- **🔴 承重契约**(红线;其中真视范围等由数据加载校验强制):效果不允许写成直接加减属性的裸数值——效果类型只能取封闭白名单;真视(直接标出危险格的效果,定义见「核心规则」)单次范围 ≤3×3;核心逻辑不做异步等待;零随机;排雷玩法零特判;危险格与安全格的分布同池冻结——资源类件只能调整权重投影、不能改池结构;**棋盘事实不可变**(秘宝效果不移除、不增改危险格位置与邻接数字——效果形态只允许信息呈现与开格动作;2026-10-10 用户裁,原爆破工兵包「中立移除」即违规形态、随件退役废止)。
|
||||||
- **验收分层**:难度验收分两层——同调系统关闭时沿用现行关卡完成率验收带;开启时验收带按投值平移(归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)投值;商店开关分层同法)。
|
- **验收分层**:难度验收分两层——同调系统关闭时沿用现行关卡完成率验收带;开启时验收带按投值平移(归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)投值;商店开关分层同法)。
|
||||||
|
|
||||||
## 目录(重设计 v1)
|
## 目录(重设计 v1)
|
||||||
|
|
||||||
> 秘宝目录的权威版本(2026-10-08 用户终审全落——「都可以先落;旧的去掉只保留新的」;逐件实态=item_id/解锁/效果实现三实态列)。代号制:正式命名归用户;数值全 provisional 归调参批。准入约束(机能件判定尺/定义卡 3+1 句)见[核心循环](../../01-核心循环.md)「道具三层职责与分界」节。旧目录全数退役,名单与处置映射见[道具退役素材库](../../../content-archive/道具退役素材库.md)表一。
|
> 秘宝目录的权威版本(2026-10-08 用户终审全落——「都可以先落;旧的去掉只保留新的」;**2026-10-12 迭代 22 实装批全量落地**,逐件实态=item_id/解锁/效果实现三实态列)。代号制:正式命名归用户;数值全 provisional 归调参批。准入约束(机能件判定尺/定义卡 3+1 句)见[核心循环](../../01-核心循环.md)「道具三层职责与分界」节。旧目录全数退役,名单与处置映射见[道具退役素材库](../../../content-archive/道具退役素材库.md)表一。
|
||||||
|
|
||||||
### 三档骨架
|
### 三档骨架
|
||||||
|
|
||||||
- 数量:普通档 9 件 / 优秀档 3 件 / 稀有档 2 件(两件储能件暂落普通档,档位 provisional);优秀档两位空位=回能器删〔孤儿件〕/换装券撤〔冒险中零更换途径无此件〕;稀有档一位空位=第四只手删〔净收益为零的自指件——占一槽换一槽、携带量 3=3 且自锁唯一稀有格〕——空位不构成补件议程;传说位留空,与跨系统的四级稀有度框架〔普通/优秀/稀有/传说〕兼容——秘宝不用满四档)。
|
- 数量:普通档 7 件 / 优秀档 3 件 / 稀有档 2 件(优秀档两位空位=2026-10-11 回能器删〔孤儿件〕/换装券撤〔冒险中零更换途径无此件〕;稀有档一位空位=2026-10-11 第四只手删〔净收益为零的自指件——占一槽换一槽、携带量 3=3 且自锁唯一稀有格〕——空位不构成补件议程;传说位留空,与跨系统的四级稀有度框架〔普通/优秀/稀有/传说〕兼容——秘宝不用满四档)。
|
||||||
- 解锁方式(2026-10-10 用户裁**混合制**):基础件=秘宝匣内**钥石购买**解锁(定价归定价批);特定件=**条件解锁**(游玩里程碑或行为条件,阈值 provisional 归调参批)。逐件分配已锁定(2026-10-11 用户裁 C1):钥石购买 8 件(普通 7 件各 10 钥石+双管装填 25 钥石)+条件解锁 4 件(远程镐=生涯通关≥1/刷新执照=Boss 击杀≥3/天眼=通关≥3 且 Boss 击杀≥4/信标网络=真视类工具累计使用≥10);解锁条件承载=`treasure_items.tres` 行内 `unlock_requires` 字段(计数键 adventure_cleared/boss_kill_count/vision_used,schema 词表校验单点);旧「档位谓词分级(普通 0/优秀中/稀有高里程碑)」口径作废;两件储能件的解锁方式与阈值未分配,provisional 归调参批。
|
- 解锁方式(2026-10-10 用户裁**混合制**):基础件=秘宝匣内**钥石购买**解锁(定价归定价批);特定件=**条件解锁**(游玩里程碑或行为条件,阈值 provisional 归调参批)。逐件分配已随实装批锁定(2026-10-11 用户裁 C1):钥石购买 8 件(普通 7 件各 10 钥石+双管装填 25 钥石)+条件解锁 4 件(远程镐=生涯通关≥1/刷新执照=Boss 击杀≥3/天眼=通关≥3 且 Boss 击杀≥4/信标网络=真视类工具累计使用≥10);解锁条件承载=`treasure_items.tres` 行内 `unlock_requires` 字段(计数键 adventure_cleared/boss_kill_count/vision_used,schema 词表校验单点——2026-10-12 迭代 22 落地);旧「档位谓词分级(普通 0/优秀中/稀有高里程碑)」口径作废。
|
||||||
- 验收纪律:**同档内不许存在严格支配关系**(同档 A 在所有维度不劣于 B 即违规)——防首选内定的结构检查。
|
- 验收纪律:**同档内不许存在严格支配关系**(同档 A 在所有维度不劣于 B 即违规)——防首选内定的结构检查。
|
||||||
- 装配面:同调位分档(普通格/优秀格/稀有格,槽位可装 ≤ 槽位档位的件)——见「定位与形态」速览。
|
- 装配面:同调位分档(普通格/优秀格/稀有格,槽位可装 ≤ 槽位档位的件)——见「定位与形态」速览。
|
||||||
|
|
||||||
### 普通档(7 件)
|
### 普通档(7 件)
|
||||||
|
|
||||||
| 代号 | item_id | 一句话 | 写哪笔系统资源/时点 | 解锁 | 效果实现 |
|
| 代号 | item_id | 一句话 | 写哪笔系统资源/时点 | 解锁(迭代 22 实态) | 效果实现 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| 晨操令 | morning_order | 每场战斗第 1 轮 +1 AP | AP 池/轮始 | 钥石 10 provisional | 订阅行 round_start→grant_ap |
|
| 晨操令 | morning_order | 每场战斗第 1 轮 +1 AP | AP 池/轮始 | 钥石 10 provisional | 订阅行 round_start→grant_ap |
|
||||||
| 阔视野带 | wide_scout_band | 视野照亮范围 8 格→12 格,类型微光不扩 | 视野参数/常时 | 钥石 10 provisional | 参数面 light_radius_bonus(+4) |
|
| 阔视野带 | wide_scout_band | 视野照亮范围 8 格→12 格,类型微光不扩 | 视野参数/常时 | 钥石 10 provisional | 参数面 light_radius_bonus(+4) |
|
||||||
| 试炼镐 | trial_pick | 每开 8 个安全格,当轮 AP +1(自动) | AP 池/开格自动兑付 | 钥石 10 provisional | ap_charge_safe 满 charge_n=8 自动 grant_ap |
|
| 试炼镐 | trial_pick | 每开 8 个安全格,当轮 AP +1(自动) | AP 池/开格自动兑付 | 钥石 10 provisional | ap_charge_safe 满 charge_n=8 自动 grant_ap(2026-10-12 反哺批⑤用户裁自动兑付) |
|
||||||
| 刷新练习 | refresh_practice | 三选一刷新存量 +1 | 刷新存量/装配即得 | 钥石 10 provisional | 参数面 refresh_stock_grant |
|
| 刷新练习 | refresh_practice | 三选一刷新存量 +1 | 刷新存量/装配即得 | 钥石 10 provisional | 参数面 refresh_stock_grant |
|
||||||
| 储备罐 | reserve_jar | 停手转存率 1:1 → 1.25:1 | 储备行动点(RAP)转存率参数/停手时 | 钥石 10 provisional | 参数面 rap_transfer_mult(125) |
|
| 储备罐 | reserve_jar | 停手转存率 1:1 → 1.25:1 | 储备行动点(RAP)转存率参数/停手时 | 钥石 10 provisional | 参数面 rap_transfer_mult(125) |
|
||||||
| 巢穴预告 | nest_forecast | 装板后揭示本板危险格数量 | 危险格计数(不碰危险格分布)/装板时 | 钥石 10 provisional | 订阅行 board_installed→mine_count_preview(呈现=开局 toast) |
|
| 巢穴预告 | nest_forecast | 装板后揭示本板危险格数量 | 危险格计数(不碰危险格分布)/装板时 | 钥石 10 provisional | 订阅行 board_installed→mine_count_preview(呈现=开局 toast) |
|
||||||
| 线香 | incense_stick | 每战一次:真视单格 | 真视窄域(≤3×3 契约内)/主动 | 钥石 10 provisional | reveal_tiles(战斗级充能) |
|
| 线香 | incense_stick | 每战一次:真视单格 | 真视窄域(≤3×3 契约内)/主动 | 钥石 10 provisional | reveal_tiles(战斗级充能) |
|
||||||
| 开局储备(代号) | level_start_rap | 每个关卡开始时储备点 +4(够一次刷新) | 储备行动点/关卡开始注入 | provisional(未分配) | 订阅行 关卡开始→grant_reserve_ap(4) |
|
|
||||||
| 推演储能(代号) | correct_action_rap | 挖开安全格或封印标中时储备点 +1 | 储备行动点/正确结果发生时 | provisional(未分配) | 订阅行 dig_reveal/seal_hit→grant_reserve_ap(1) |
|
|
||||||
|
|
||||||
两件储能件的代号、档位与解锁为 provisional,正式命名归用户。它们与换图系专长作用在不同入口:矿脉储能按付费挖格给,推演储能按正确结果给,两者可叠加;开局储备只在关卡开始注入一次,不改停手转存与刷新扣费。
|
|
||||||
|
|
||||||
### 优秀档(3 件)
|
### 优秀档(3 件)
|
||||||
|
|
||||||
| 代号 | item_id | 一句话 | 写哪笔系统资源/时点 | 解锁 | 效果实现 |
|
| 代号 | item_id | 一句话 | 写哪笔系统资源/时点 | 解锁(迭代 22 实态) | 效果实现 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| 双管装填 | twin_loader | 每战前 2 轮各 +1 AP | AP 池/轮始 | 钥石 25 provisional | 订阅行 round_start→grant_ap |
|
| 双管装填 | twin_loader | 每战前 2 轮各 +1 AP | AP 池/轮始 | 钥石 25 provisional | 订阅行 round_start→grant_ap |
|
||||||
| 远程镐 | ranged_pick | 挖掘距离 +1(可挖距英雄 2 格的格) | 可达性规则/常时 | 条件:生涯冒险成功 ≥1 provisional | 参数面 dig_range_bonus |
|
| 远程镐 | ranged_pick | 挖掘距离 +1(可挖距英雄 2 格的格) | 可达性规则/常时 | 条件:生涯冒险成功 ≥1 provisional | 参数面 dig_range_bonus |
|
||||||
@@ -56,9 +52,9 @@
|
|||||||
|
|
||||||
### 稀有档(2 件)
|
### 稀有档(2 件)
|
||||||
|
|
||||||
| 代号 | item_id | 一句话 | 写哪笔系统资源/时点 | 解锁 | 效果实现 |
|
| 代号 | item_id | 一句话 | 写哪笔系统资源/时点 | 解锁(迭代 22 实态) | 效果实现 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| 天眼 | sky_eye | 每关一次:选 3×3,危险格显示且安全格直接开 | 真视+开格复合/主动 | 条件:冒险成功 ≥3 且 Boss 击杀 ≥4 provisional | reveal_tiles+safe_dig(关卡级充能;安全格开格按普通挖格全额兑付免 AP) |
|
| 天眼 | sky_eye | 每关一次:选 3×3,危险格显示且安全格直接开 | 真视+开格复合/主动 | 条件:冒险成功 ≥3 且 Boss 击杀 ≥4 provisional | reveal_tiles+safe_dig(关卡级充能;安全格开格按普通挖格全额兑付免 AP——C5 裁) |
|
||||||
| 信标网络 | beacon_network | 封印不限相邻(可对任何未开格封印) | 封印的可达性规则/常时 | 条件:真视类工具累计使用 ≥10 provisional(vision_used 生涯计数域) | 参数面 flag_range_free |
|
| 信标网络 | beacon_network | 封印不限相邻(可对任何未开格封印) | 封印的可达性规则/常时 | 条件:真视类工具累计使用 ≥10 provisional(vision_used 生涯计数域) | 参数面 flag_range_free |
|
||||||
|
|
||||||
## 设计骨架(可设计方向 × 代价空间)
|
## 设计骨架(可设计方向 × 代价空间)
|
||||||
@@ -67,13 +63,13 @@
|
|||||||
|
|
||||||
### 效果轴(覆盖检查按三方向跑)
|
### 效果轴(覆盖检查按三方向跑)
|
||||||
|
|
||||||
| 方向 | 细分格(设计菜单,开放清单) | 已占位(现行目录 14 件) |
|
| 方向 | 细分格(设计菜单,开放清单) | 已占位(新目录 12 件) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 信息 | 推理原料 · 直接代答 · 奖励预读※ · 信息半径扩展 | 巢穴预告 / 线香、天眼 / —(空位)/ 阔视野带 |
|
| 信息 | 推理原料 · 直接代答 · 奖励预读※ · 信息半径扩展 | 巢穴预告 / 线香、天眼 / —(空位)/ 阔视野带 |
|
||||||
| 行动资源 | 直接供给 · 行为转化 · 效率改写 · 充能维护 · 资源容量扩展 | 晨操令、双管装填 / 试炼镐 / 储备罐 / —(空位) / —(空位) |
|
| 行动资源 | 直接供给 · 行为转化 · 效率改写 · 充能维护 · 资源容量扩展 | 晨操令、双管装填 / 试炼镐 / 储备罐 / —(空位) / —(空位) |
|
||||||
| 操作能力 | 范围扩展 · 规则放宽 · 程序权限 · 容量扩展 · 抉择刷新 | 远程镐 / 信标网络 / —(空位) / —(空位) / 刷新练习、刷新执照 |
|
| 操作能力 | 范围扩展 · 规则放宽 · 程序权限 · 容量扩展 · 抉择刷新 | 远程镐 / 信标网络 / —(空位) / —(空位) / 刷新练习、刷新执照 |
|
||||||
|
|
||||||
※奖励预读=空位预留,**备注与「微光常显」概念有重合**(微光若重构此格需重审;不主动补)。
|
※奖励预读=空位预留,**备注与「微光常显」概念有重合**(微光若重构此格需重审;该方向被否过一次,不主动补)。
|
||||||
※无差别开格(如 3×3 全部炸开:收益不获取、惩罚不触发,纯粹开格)=预留拓展方向(2026-10-10 用户提,现不做、后续拓展再裁)——与天眼的有差别开格(安全格直接开、危险格仅显示)相区分;改变棋盘事实的近似形态(移除危险格)已裁禁。
|
※无差别开格(如 3×3 全部炸开:收益不获取、惩罚不触发,纯粹开格)=预留拓展方向(2026-10-10 用户提,现不做、后续拓展再裁)——与天眼的有差别开格(安全格直接开、危险格仅显示)相区分;改变棋盘事实的近似形态(移除危险格)已裁禁。
|
||||||
|
|
||||||
### 代价轴(新件设计时与效果格组合选用)
|
### 代价轴(新件设计时与效果格组合选用)
|
||||||
@@ -84,10 +80,10 @@
|
|||||||
|
|
||||||
| 形态 | 语义 | 计量与重置 | 现状 |
|
| 形态 | 语义 | 计量与重置 | 现状 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 冒险级限量 | 每次冒险共 N 次 | 开局满额,用完即止 | 空位 |
|
| 冒险级限量 | 每次冒险共 N 次 | 开局满额,用完即止 | 空位(旧目录主动件充能 2 次形态随目录退役) |
|
||||||
| 关卡级限量 | 每关 N 次 | 每关开始重置 | 天眼(每关一次) |
|
| 关卡级限量 | 每关 N 次 | 每关开始重置 | 天眼(每关一次) |
|
||||||
| 战斗级限量 | 每场战斗 N 次 | 每场战斗开始重置 | 线香(每战一次) |
|
| 战斗级限量 | 每场战斗 N 次 | 每场战斗开始重置 | 线香(每战一次) |
|
||||||
| 转化获取 | 付出换取使用次数:行为转化(开 N 格→+1)/ 资源转化(耗 N AP→+1)/ 时间触发(每 N 回合→+1) | 行为计数满额即时兑付 | 试炼镐(行为通道在役——**每开 8 个安全格自动兑当轮 AP+1:无玩家发起入口、计数即时清空;战斗级重置=计数即时清空自然无感;兑付时序=揭示先于本格扣费,AP 归零恰逢满点时先兑再扣、轮次不因本格结束**);资源/时间两通道空位 |
|
| 转化获取 | 付出换取使用次数:行为转化(开 N 格→+1)/ 资源转化(耗 N AP→+1)/ 时间触发(每 N 回合→+1) | 行为计数满额即时兑付 | 试炼镐(行为通道在役——**每开 8 个安全格自动兑当轮 AP+1:无玩家发起入口、计数即时清空〔2026-10-12 反哺批⑤用户裁自动兑付〕;战斗级重置=计数即时清空自然无感;兑付时序=揭示先于本格扣费,AP 归零恰逢满点时先兑再扣、轮次不因本格结束**);资源/时间两通道空位 |
|
||||||
| 常时(无使用代价) | 被动件无「使用」概念——占装配位即全部代价 | — | 现役被动件 |
|
| 常时(无使用代价) | 被动件无「使用」概念——占装配位即全部代价 | — | 现役被动件 |
|
||||||
|
|
||||||
**恢复机制**(独立参数,不与限量周期混同):基准=冒险开局满额;中途回充现役**无来源**——回能器已删(2026-10-11 用户裁孤儿件:新目录无冒险级限量件,而关卡级/战斗级件天然周期重置、开局回充对其结构性冗余);恢复机制留作骨架参数,未来冒险级限量件出现时启用。
|
**恢复机制**(独立参数,不与限量周期混同):基准=冒险开局满额;中途回充现役**无来源**——回能器已删(2026-10-11 用户裁孤儿件:新目录无冒险级限量件,而关卡级/战斗级件天然周期重置、开局回充对其结构性冗余);恢复机制留作骨架参数,未来冒险级限量件出现时启用。
|
||||||
@@ -100,7 +96,7 @@
|
|||||||
2. 档位(普通/优秀/稀有)=代价×效果的预置平衡带:普通=弱效果配松代价,稀有=强效果配紧代价——骨架与档位体系在此接口。
|
2. 档位(普通/优秀/稀有)=代价×效果的预置平衡带:普通=弱效果配松代价,稀有=强效果配紧代价——骨架与档位体系在此接口。
|
||||||
3. 覆盖检查只跑效果三方向;细分格空位**不构成补件议程**(预读格教训记录在案)。
|
3. 覆盖检查只跑效果三方向;细分格空位**不构成补件议程**(预读格教训记录在案)。
|
||||||
4. 信息方向的价值检验按目的做(减少了多少盲赌),不按信息形式堆料;强效果必须配紧代价。
|
4. 信息方向的价值检验按目的做(减少了多少盲赌),不按信息形式堆料;强效果必须配紧代价。
|
||||||
5. 各周期系统资源独立、互不换算;全部限量值 provisional 归调参批;逐件的效果格与代价格归属见「目录(重设计 v1)」三表。
|
5. 各周期系统资源独立、互不换算;全部限量值 provisional 归调参批;逐件的效果格与代价格归属见「目录(重设计 v1)」三表(2026-10-12 迭代 22 落地登记)。
|
||||||
|
|
||||||
|
|
||||||
## 设计目的
|
## 设计目的
|
||||||
@@ -115,7 +111,7 @@
|
|||||||
|
|
||||||
| 负责 | 说明 |
|
| 负责 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 道具定义表 | 秘宝件的字段定义:名称、效果格归属、效果组合、目标形态、数值;现行目录=「目录(重设计 v1)」节 14 件;承重护栏在加载期校验中强制 |
|
| 道具定义表 | 秘宝件的字段定义:名称、效果格归属、效果组合、目标形态、数值;现行目录=「目录(重设计 v1)」节 12 件(已随迭代 22 实装批全量落地,2026-10-12);承重护栏在加载期校验中强制 |
|
||||||
| 设计骨架与覆盖检查 | 效果三方向(信息/行动资源/操作能力)覆盖检查——每方向至少一件承载(口径见「设计骨架」节);加载后自动检查 |
|
| 设计骨架与覆盖检查 | 效果三方向(信息/行动资源/操作能力)覆盖检查——每方向至少一件承载(口径见「设计骨架」节);加载后自动检查 |
|
||||||
| 同调装配与充能账 | 营地装配入同调位(每件固定占 1 格、共 3 格;分档规则见「定位与形态」速览);主动件充能每冒险开始重置 |
|
| 同调装配与充能账 | 营地装配入同调位(每件固定占 1 格、共 3 格;分档规则见「定位与形态」速览);主动件充能每冒险开始重置 |
|
||||||
| 使用规则与目标校验 | 什么时候能用、目标合不合法、失败分几级、哪一级不消耗 |
|
| 使用规则与目标校验 | 什么时候能用、目标合不合法、失败分几级、哪一级不消耗 |
|
||||||
@@ -162,14 +158,14 @@
|
|||||||
|
|
||||||
### 道具从哪来:解锁与营地装配
|
### 道具从哪来:解锁与营地装配
|
||||||
|
|
||||||
秘宝不可合成,唯一来路=**营地解锁**(2026-10-10 用户裁混合制——基础件钥石购买/特定件条件解锁;冒险中无购买)。**装配只在冒险开始前于营地配置;冒险中不存在任何更换途径**(2026-10-11 用户裁,无例外——拾取与效果均不产生装配变化)。解锁条件实录(阈值 provisional 归调参批):钥石购买 8 件(晨操令/阔视野带/试炼镐/刷新练习/储备罐/巢穴预告/线香各 10 钥石+双管装填 25 钥石);条件解锁 4 件——远程镐=生涯通关 ≥1(adventure_cleared)、刷新执照=Boss 击杀 ≥3(boss_kill_count)、天眼=通关 ≥3 且 Boss 击杀 ≥4、信标网络=真视类工具累计使用 ≥10(vision_used 行为计数域);承载=`treasure_items.tres` 行内 `unlock_requires` 字段(改表不动码;schema 计数键词表校验单点)。同调位槽位由天赋树同调位节点提供(1=普通格/2=优秀格/3=稀有格递增,共 3 格)——树与秘宝同为角色属性的贡献者,槽位参数的提供方在树侧。开局前在营地·秘宝匣柜台「同调装配」段装入同调位(每件固定占 1 格;分档装配规则见「定位与形态」速览)。
|
秘宝不可合成,唯一来路=**营地解锁**(2026-10-10 用户裁混合制——基础件钥石购买/特定件条件解锁;冒险中无购买)。**装配只在冒险开始前于营地配置;冒险中不存在任何更换途径**(2026-10-11 用户裁,无例外——拾取与效果均不产生装配变化;原当日早间试行的「冒险拾取未知秘宝」渠道同日废止,奇物侧无对应实现)。解锁条件实录(2026-10-12 迭代 22 落地,阈值 provisional 归调参批):钥石购买 8 件(晨操令/阔视野带/试炼镐/刷新练习/储备罐/巢穴预告/线香各 10 钥石+双管装填 25 钥石);条件解锁 4 件——远程镐=生涯通关 ≥1(adventure_cleared)、刷新执照=Boss 击杀 ≥3(boss_kill_count)、天眼=通关 ≥3 且 Boss 击杀 ≥4、信标网络=真视类工具累计使用 ≥10(vision_used,行为计数域随迭代 22 新增);承载=`treasure_items.tres` 行内 `unlock_requires` 字段(改表不动码;schema 计数键词表校验单点)。同调位槽位由天赋树同调位节点提供(1=普通格/2=优秀格/3=稀有格递增,共 3 格)——树与秘宝同为角色属性的贡献者,槽位参数的提供方在树侧。开局前在营地·秘宝匣柜台「同调装配」段装入同调位(每件固定占 1 格;分档装配规则见「定位与形态」速览)。
|
||||||
|
|
||||||
|
|
||||||
### 什么时候怎么用:挖掘期发起,战斗结算编排
|
### 什么时候怎么用:挖掘期发起,战斗结算编排
|
||||||
|
|
||||||
受理框架现役=主动使用件线香/天眼;**试炼镐为自动兑付件,无使用动作、不经本节四步**(每开 8 个安全格自动当轮 AP+1,兑付时序见「设计骨架·代价轴」转化获取行)。
|
受理框架现役=主动使用件线香/天眼(2026-10-12 迭代 22 落地);**试炼镐为自动兑付件,无使用动作、不经本节四步**(每开 8 个安全格自动当轮 AP+1——2026-10-12 反哺批⑤用户裁,兑付时序见「设计骨架·代价轴」转化获取行)。
|
||||||
|
|
||||||
使用动作在挖掘期发起:轮次进行中的任意时点都行。战斗阶段没有道具使用窗口,秘宝的使用窗口独占挖掘期。发起之后由战斗结算编排受理,按固定次序走四步:
|
使用动作在挖掘期发起:轮次进行中的任意时点都行。战斗阶段没有道具使用窗口(战斗道具已于 2026-09-15 随可选类删除下线),秘宝的使用窗口独占挖掘期。发起之后由战斗结算编排受理,按固定次序走四步:
|
||||||
|
|
||||||
```
|
```
|
||||||
发起使用 ─▶ ① 相位检查(非挖掘期 → 拒绝)
|
发起使用 ─▶ ① 相位检查(非挖掘期 → 拒绝)
|
||||||
@@ -205,11 +201,11 @@
|
|||||||
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 使用编排的调用方:四步固定次序的受理,叠加层与充能账的清空也由它编排 |
|
| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 使用编排的调用方:四步固定次序的受理,叠加层与充能账的清空也由它编排 |
|
||||||
| 上游 | [行动经济](../排雷循环/行动经济.md) | 加行动点效果经其账本入口入账;使用道具本身不过账本、零扣费 |
|
| 上游 | [行动经济](../排雷循环/行动经济.md) | 加行动点效果经其账本入口入账;使用道具本身不过账本、零扣费 |
|
||||||
| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 目标校验与信息呈现读取棋盘只读面;对侧代码零本系统分支 |
|
| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 目标校验与信息呈现读取棋盘只读面;对侧代码零本系统分支 |
|
||||||
| 上游 | [地形变异](../排雷循环/地形变异.md) | 地形变异的对抗件方向——框架契约已作废(2026-10-03 终裁,沿革查 git 提交史);counter_items 恒空保留,变异应对若做只挂局内,待双层 BD 调研仲裁后重新立项 |
|
| 上游 | [地形变异](../排雷循环/地形变异.md) | 地形变异的对抗件方向——框架契约已作废(2026-10-03 终裁,理由见 v0.8 版本行);counter_items 恒空保留,变异应对若做只挂局内,待迭代 12 双层 BD 调研重定 |
|
||||||
| 上游 | [数据配置](../表现与支撑/数据配置.md) | 道具定义表的 schema 承载与加载校验通道;本系统是该表的回填责任方 |
|
| 上游 | [数据配置](../表现与支撑/数据配置.md) | 道具定义表的 schema 承载与加载校验通道;本系统是该表的回填责任方 |
|
||||||
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 装配件与充能常读、使用交互与目标拾取、叠加层信息呈现、充能重置反馈 |
|
| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 装配件与充能常读、使用交互与目标拾取、叠加层信息呈现、充能重置反馈 |
|
||||||
| 下游 | [教学引导](../表现与支撑/教学引导.md) | 教学候选:"买情报"闭环与"真视不是保护"的措辞口径(非阻塞) |
|
| 下游 | [教学引导](../表现与支撑/教学引导.md) | 教学候选:"买情报"闭环与"真视不是保护"的措辞口径(非阻塞) |
|
||||||
| 双向 | 各对侧系统 | 旧目录遗留的跨系统配合项已消解;现行配合面即上表各行 |
|
| 双向 | 各对侧系统 | 旧目录遗留的跨系统配合项随实装批替换自然消解;现行配合面即上表各行 |
|
||||||
|
|
||||||
负空间:本系统不监听事件、不画界面、不用随机数、不写任何其他系统的数据;信息只来自三个既有事实源——棋盘真值、奖励身份、行动点。
|
负空间:本系统不监听事件、不画界面、不用随机数、不写任何其他系统的数据;信息只来自三个既有事实源——棋盘真值、奖励身份、行动点。
|
||||||
|
|
||||||
@@ -228,15 +224,15 @@
|
|||||||
| P1 | 道具使用的动效与音频反馈 | 表现打磨项后置;音频排 Alpha |
|
| P1 | 道具使用的动效与音频反馈 | 表现打磨项后置;音频排 Alpha |
|
||||||
| P1 | "买情报"闭环教学与"真视不是保护"口径 | 归教学引导,Alpha 里程碑,非阻塞 |
|
| P1 | "买情报"闭环教学与"真视不是保护"口径 | 归教学引导,Alpha 里程碑,非阻塞 |
|
||||||
| P1 | 信息类道具的战斗当量入战斗结算效果对照表 | 间接效应的定量换算,调参期扩列,MVP 不入表 |
|
| P1 | 信息类道具的战斗当量入战斗结算效果对照表 | 间接效应的定量换算,调参期扩列,MVP 不入表 |
|
||||||
| P1 | 反制路径重定 | 2026-10-03 用户终裁:同调位反制件=层级错配失败设计,契约「每变异≥1反制道具」废止;counter_items 恒空合法,变异应对若做只挂局内,待双层 BD 调研仲裁后重新立项 |
|
| 迭代 12(调研前置) | 反制路径重定(原:地形变异新类型的反制道具——已作废) | 2026-10-03 用户终裁:原归 Alpha 反制批的同调位反制件=层级错配失败设计,契约「每变异≥1反制道具」废止;counter_items 恒空合法,变异应对若做只挂局内,待双层 BD 调研仲裁后重新立项 |
|
||||||
|
|
||||||
## 调参表
|
## 调参表
|
||||||
|
|
||||||
道具定义表的全部数值均为 provisional,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)调参;`aux_items` 条目已换代为现行目录 14 件登记;表 schema 归[数据配置](../表现与支撑/数据配置.md)承载、本系统回填。
|
道具定义表的全部数值均为 provisional,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)调参;`aux_items` 条目已随迭代 22 换代为新目录 12 件登记(2026-10-12);表 schema 归[数据配置](../表现与支撑/数据配置.md)承载、本系统回填。
|
||||||
|
|
||||||
结构冻结(非调参项,改动走本文修订流程):真视窄域护栏、零信息目标不消耗、边缘窗口照常受理、使用零行动点成本、同调位装配与充能每冒险重置、用后不可逆、零随机。
|
结构冻结(非调参项,改动走本文修订流程):真视窄域护栏、零信息目标不消耗、边缘窗口照常受理、使用零行动点成本、同调位装配与充能每冒险重置、用后不可逆、零随机。
|
||||||
|
|
||||||
效果声明形态(在役沿用):被动件的效果行为=**订阅行**——行内声明**订阅哪个事件(on)/ 什么条件(when)/ 什么效果(do)**,由效果引擎统一解释执行;主动件按效果类型通用分发(受理闸=使用事件订阅);常时参数面件(阔视野带/储备罐/远程镐/信标网络/刷新练习/刷新执照六件)effect_kinds 挂参数 kind、由注入面按装配集分发读取;试炼镐=自动兑付(ap_charge_safe 满 charge_n 直接 grant_ap)。事件/效果类型/条件事实/算子四词表封闭(效果引擎单一事实源);卡面效果摘要=行 `desc` 字段直读(文案表值化)。现行目录 14 件的效果行已落地登记。
|
效果声明形态(内容数据驱动扩展批落地,在役沿用):被动件的效果行为=**订阅行**——行内声明**订阅哪个事件(on)/ 什么条件(when)/ 什么效果(do)**,由效果引擎统一解释执行;主动件按效果类型通用分发(受理闸=使用事件订阅);常时参数面件(阔视野带/储备罐/远程镐/信标网络/刷新练习/刷新执照六件)effect_kinds 挂参数 kind、由注入面按装配集分发读取;试炼镐=自动兑付(ap_charge_safe 满 charge_n 直接 grant_ap)。事件/效果类型/条件事实/算子四词表封闭(效果引擎单一事实源);卡面效果摘要=行 `desc` 字段直读(文案表值化)。新目录 12 件的效果行已随迭代 22 落地登记。
|
||||||
|
|
||||||
playtest 预警(预注册,归难度曲线与Boss):
|
playtest 预警(预注册,归难度曲线与Boss):
|
||||||
|
|
||||||
@@ -247,7 +243,7 @@ playtest 预警(预注册,归难度曲线与Boss):
|
|||||||
|
|
||||||
## 验收标准
|
## 验收标准
|
||||||
|
|
||||||
- 护栏强制:任何标出危险格的道具定义,目标域字段超过 3×3 时数据加载直接返回错误并拒绝;现行 14 件逐件过护栏校验。
|
- 护栏强制:任何标出危险格的道具定义,目标域字段超过 3×3 时数据加载直接返回错误并拒绝;现行 12 件逐件过护栏校验(迭代 22 已交付,2026-10-12)。
|
||||||
- 覆盖检查:效果三方向(信息/行动资源/操作能力)各有新目录承载,检查按「设计骨架」节口径执行;逐件的效果格归属见「目录(重设计 v1)」三表。
|
- 覆盖检查:效果三方向(信息/行动资源/操作能力)各有新目录承载,检查按「设计骨架」节口径执行;逐件的效果格归属见「目录(重设计 v1)」三表。
|
||||||
- 两域正交:秘宝件经同调位装配生效,不入局内道具背包,与奇物背包互不混装。
|
- 两域正交:秘宝件经同调位装配生效,不入局内道具背包,与奇物背包互不混装。
|
||||||
- 使用窗口:非挖掘期的使用请求被拒绝且不消耗;挖掘期任意时点可发起。
|
- 使用窗口:非挖掘期的使用请求被拒绝且不消耗;挖掘期任意时点可发起。
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
# 锻造工坊
|
# 锻造工坊
|
||||||
|
|
||||||
> 一句话:营地的武器与护甲成长——武器锻造区三条路线、护甲锻造区三条路线各练各的,钥石消费,一次冒险各选一件,满级特效留位本期不做
|
> 一句话:营地的武器与护甲成长——武器锻造区三条路线、护甲锻造区三条路线各练各的,钥石消费,一次冒险各选一件,满级特效留位本期不做
|
||||||
> 状态:**v0.13**——全部数值 provisional,终值归 Alpha 收官 M4 数值批〔未排期〕
|
> 状态:**v0.10(2026-10-29 实现内容清理:删「现役代码事实」「实装边界」两节与正文代码指证,规则与数值零变化)**——全部数值 provisional,终值归 Alpha 收官 M4 数值批〔未排期〕
|
||||||
## 设计目的
|
## 设计目的
|
||||||
|
|
||||||
用户原案(playnote 2026-10-06):把现役"营地花钱买攻击 +1"改造成有等级、有成长、有满级特效的**武器升级路线**;新增长枪(穿刺)与法杖(魔法)实现武器间差异化;护甲同理——初始只有轻甲(升级只提 AC),最高等级后解锁重甲/魔法护甲,基础 AC 各异、各带满级特效。
|
用户原案(playnote 2026-10-06):把现役"营地花钱买攻击 +1"改造成有等级、有成长、有满级特效的**武器升级路线**;新增长枪(穿刺)与法杖(魔法)实现武器间差异化;护甲同理——初始只有轻甲(升级只提 AC),最高等级后解锁重甲/魔法护甲,基础 AC 各异、各带满级特效。
|
||||||
|
|
||||||
这套设计同时是成长曲线反馈(playnote 2026-10-05「前期成长系数不能太高,能力解锁后才能匹配关卡难度」)的执行载体:锻造工坊同时握着**数字成长的速率**(每级加多少)与**能力解锁的节奏**(什么时候拿到新武器/新甲),曲线形状直接服务"前期靠挖掘技巧过关、后期靠解锁追平难度"的体验目标。
|
这套设计同时是成长曲线反馈(playnote 2026-10-05「前期成长系数不能太高,能力解锁后才能匹配关卡难度」)的执行载体:锻造工坊同时握着**数字成长的速率**(每级加多少)与**能力解锁的节奏**(什么时候拿到新武器/新甲),曲线形状直接服务"前期靠挖掘技巧过关、后期靠解锁追平难度"的体验目标。(原提案把"满级特效"也列为能力台阶之一——2026-10-12 裁 6:特效本期不做、只留扩展位,能力台阶收缩为新武器/新甲型的解锁,见「满级特效扩展位」节。)
|
||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:锻造工坊管「三件武器与三型护甲的等级路线、解锁规则、定价与满级特效的设计口径」——它是对现役营地属性锻造柜台中攻击、护甲两档的路线化改造设计,不是新系统。钥石从哪来、余额怎么记,归元进度;数值终值归数值批。
|
边界这样划:锻造工坊管「三件武器与三型护甲的等级路线、解锁规则、定价与满级特效的设计口径」——它是对现役营地属性锻造柜台中攻击、护甲两档的路线化改造设计,不是新系统。钥石从哪来、余额怎么记,归元进度;数值终值归数值批;代码与数据表改动全部归实装批。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -27,10 +27,10 @@
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 钥石与营地柜台结构 | [元进度](元进度.md)——本系统即属性锻造柜台攻击/护甲两档的改造,消费货币与柜台框架归彼 |
|
| 钥石与营地柜台结构 | [元进度](元进度.md)——本系统即属性锻造柜台攻击/护甲两档的改造,消费货币与柜台框架归彼 |
|
||||||
| 数值终值(每级增量/等级上限/价格/基础 AC/特效值) | Alpha 收官 M4 数值批——本文全部数值只有量纲与锚点,标 provisional |
|
| 数值终值(每级增量/等级上限/价格/基础 AC/特效值) | Alpha 收官 M4 数值批——本文全部数值只有量纲与锚点,标 provisional |
|
||||||
| 代码与数据表落地 | 已落地 |
|
| 代码与数据表落地 | 实装批(已入库) |
|
||||||
| 克制矩阵与伤害结算 | [战斗结算](../战斗循环/战斗结算.md)——矩阵九格结构冻结是既有条款,本系统零改动 |
|
| 克制矩阵与伤害结算 | [战斗结算](../战斗循环/战斗结算.md)——矩阵九格结构冻结是既有条款,本系统零改动 |
|
||||||
| 局内属性奖励件 | [奇物](../冒险循环/奇物.md)——账号层永久强化与单冒险加算区分层并存,互不侵入 |
|
| 局内属性奖励件 | [奇物](../冒险循环/奇物.md)——账号层永久强化与单冒险加算区分层并存,互不侵入 |
|
||||||
| 存档读写 | [存档序列化](../表现与支撑/存档序列化.md)——新增等级与当前选中域,旧档破坏性废弃(开发阶段无迁移) |
|
| 存档读写 | [存档序列化](../表现与支撑/存档序列化.md)——实装后新增等级与当前选中域,旧档废弃口径随实装批(开发阶段无迁移) |
|
||||||
|
|
||||||
## 在核心循环中的位置
|
## 在核心循环中的位置
|
||||||
|
|
||||||
@@ -41,32 +41,32 @@
|
|||||||
|
|
||||||
## 现行设计(定案口径)
|
## 现行设计(定案口径)
|
||||||
|
|
||||||
### 柜台承载(2026-10-11 用户裁)
|
### 柜台承载(2026-10-11 锻造工坊裁决会话 A 组定案)
|
||||||
|
|
||||||
**营地=四柜台并排布局**:营地界面并排呈现四个柜台——①树淬炼(树脊柱界面,生命/命中淬炼唯一入口)②锻造工坊(武器+护甲攻防两区,本系统)③秘宝匣(秘宝解锁与同调装配)④奖励格图鉴(常开无门槛)。**攻防锻造独立成柜台**,不并入秘宝匣(职责分立:工坊=武器/护甲路线升级,秘宝匣=秘宝解锁与同调装配,混装淘汰)。宽度不足时横向滚动条兜底;程序占位先行,视觉与布局终稿归 HUD 营地批(后续 UI 优化另批)。
|
**营地=四柜台并排布局**(A② 裁):营地界面并排呈现四个柜台——①树淬炼(树脊柱界面,生命/命中淬炼唯一入口)②锻造工坊(武器+护甲攻防两区,本系统)③秘宝匣(秘宝解锁与同调装配)④奖励格图鉴(常开无门槛)。**攻防锻造独立成柜台**,不并入秘宝匣(职责分立:工坊=武器/护甲路线升级,秘宝匣=秘宝解锁与同调装配,混装淘汰)。宽度不足时横向滚动条兜底;程序占位先行,视觉与布局终稿归 HUD 营地批(后续 UI 优化另批)。
|
||||||
|
|
||||||
**生命档不设于本工作间**(用户裁):生命强化唯一入口=树脊柱生命线;旧属性柜台生命档已清退吸收进脊柱。本工作间=纯攻防两区:武器区加攻击、护甲区加 AC,注入面零生命项。
|
**生命档不设于本工作间**(A① 裁):生命强化唯一入口=树脊柱生命线;旧属性柜台生命档随「天赋树实装批」旧柜台清退吸收进脊柱。本工作间=纯攻防两区:武器区加攻击、护甲区加 AC,注入面零生命项。
|
||||||
|
|
||||||
**工作间内两区并列**(用户裁):武器区/护甲区并列呈现,机制层面零顺序门槛;同屏分栏或页签切换=呈现细节归 HUD 批。
|
**工作间内两区并列**(A③ 裁):武器区/护甲区并列呈现,机制层面零顺序门槛;同屏分栏或页签切换=呈现细节归 HUD 批。
|
||||||
|
|
||||||
**树侧钥匙(2026-10-11 裁:无前置)**:本柜台由天赋树「锻造工坊」钥匙节点展开——free 节点、**无前置条件、直接可点亮**;未点亮时本柜台锁定态,点亮后开放。树侧结构(脊柱=生命/命中两线 + 一线一节点 + Fork 一节点双态,现行终态 12 节点)设计权威文档 = [天赋树](天赋树.md);**钥匙节点已实装在役(free 无前置、点亮展开本柜台、锁定态零购买路径)**。
|
**树侧钥匙(2026-10-11 裁:无前置)**:本柜台由天赋树「锻造工坊」钥匙节点展开——free 节点、**无前置条件、直接可点亮**(原「攻击淬炼累计 ≥2 级 且 护甲淬炼累计 ≥2 级」等级阈值前置,随树脊柱砍攻/护两线作废);未点亮时本柜台锁定态,点亮后开放。树侧结构换代(脊柱砍攻/护两线 + 一线一节点 + Fork 一节点双态,三轮换代 **29→21→15→12**,地脉共鸣条件效果随之换代——2026-10-12 订正:原记「29→21」系 v0.6 时点旧数,树侧现行终态 12 节点)设计权威文档 = [天赋树](天赋树.md);**钥匙节点已随迭代 21 实装在役(2026-10-12 入库——free 无前置、点亮展开本柜台、锁定态零购买路径),2026-10-13 反哺写入换代原「实装归待办清单」悬置指针**。
|
||||||
|
|
||||||
**注入衔接(所有权切分,2026-10-11 裁)**:每根数值轴全游戏单一来源——生命/命中唯一入口=树脊柱;**攻击唯一入口=武器路线、AC 唯一入口=甲路线(本系统)**,树零攻防来源(红线)。锻造路线加值 = 当前武器攻击加值 + 当前甲路线 AC 加值,与树淬炼 flat、局内加算区在开局属性注入面分层相加(通道现行事实源 = [元进度](元进度.md)「跨局注入」节);锻造加值只按**当前选中**的武器/甲生效(长剑的练度在换带长枪后回家待命,不丢级、不生效)。
|
**注入衔接(所有权切分,2026-10-11 裁)**:每根数值轴全游戏单一来源——生命/命中唯一入口=树脊柱;**攻击唯一入口=武器路线、AC 唯一入口=甲路线(本系统)**,树零攻防来源(红线)。锻造路线加值 = 当前武器攻击加值 + 当前甲路线 AC 加值,与树淬炼 flat、局内加算区在开局属性注入面分层相加(通道现行事实源 = [元进度](元进度.md)「跨局注入」节);锻造加值只按**当前选中**的武器/甲生效(长剑的练度在换带长枪后回家待命,不丢级、不生效)。
|
||||||
|
|
||||||
**两根类型轴的所有权(2026-10-12 用户裁)**:`attack_type` / `armor_type` 的默认值由锻造工坊配置**常驻持有**(默认值 = 现役静态表现役值 normal / light),hero.tres 静态表两轴已删除——静态表不再存放这两项。冒险开始时参数面读「锻造工坊配置默认值 + 存档当前选中覆盖」注入。**默认值与柜台解锁状态解耦**:树钥匙节点未点亮时柜台为锁定态(玩家无交互入口),但配置表常驻可读、默认值照常注入——不存在「锻造工坊解锁前读不到默认值」的窗口。选中态写存档,与现役「表运行期只读、永久强化写存档」纪律一致。
|
**两根类型轴的所有权(2026-10-12 v0.6 订正,用户裁)**:`attack_type` / `armor_type` 的默认值由锻造工坊配置**常驻持有**(默认值 = 现役静态表现役值 normal / light),hero.tres 静态表两轴随实装删除——静态表不再存放这两项。冒险开始时参数面读「锻造工坊配置默认值 + 存档当前选中覆盖」注入。**默认值与柜台解锁状态解耦**:树钥匙节点未点亮时柜台为锁定态(玩家无交互入口),但配置表常驻可读、默认值照常注入——不存在「锻造工坊解锁前读不到默认值」的窗口。选中态写存档(与等级域同批新增),与现役「表运行期只读、永久强化写存档」纪律一致。
|
||||||
|
|
||||||
### 三件武器
|
### 三件武器
|
||||||
|
|
||||||
| 武器 | 正式显示名 | 攻击类型 | 路线(行名) |
|
| 武器 | 正式显示名 | 攻击类型 | 路线(行名) |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| **长剑** | **长剑锻造** | 普通 | 语义继承自已退役的攻击锻造行(+基础攻击);路线行为新建 |
|
| 剑 → **长剑**(8a 改名,见下) | **长剑锻造** | 普通 | 语义继承自已退役的攻击锻造行(+基础攻击);行族本体随迭代 21 T5 退役,路线行为新建(对象与命名归实装批) |
|
||||||
| 长枪 | **长枪锻造** | 穿刺 | 解锁后从 1 级练起 |
|
| 长枪 | **长枪锻造** | 穿刺 | 解锁后从 1 级练起 |
|
||||||
| 法杖 | **法杖锻造** | 魔法 | 解锁后从 1 级练起 |
|
| 法杖 | **法杖锻造** | 魔法 | 解锁后从 1 级练起 |
|
||||||
|
|
||||||
> **行名注(2026-10-12 用户裁)**:六条路线的行名统一为「件名 + 锻造」——长剑锻造 / 长枪锻造 / 法杖锻造、轻甲锻造 / 重甲锻造 / 魔法护甲锻造;第一件武器的正式显示名为「长剑」(用户原话口径)。`attack_type` 字段值、矩阵语义、攻击类型词条登记均不受行名影响——改的只是显示名。
|
> **改名注(2026-10-12,8a 裁·Y 层)**:六条路线的行名统一为「件名 + 锻造」——长剑锻造 / 长枪锻造 / 法杖锻造、轻甲锻造 / 重甲锻造 / 魔法护甲锻造。其中第一件武器的正式显示名由「剑」改「长剑」(用户原话口径)。`attack_type` 字段值、矩阵语义、攻击类型词条登记均不受此改名影响——改的只是显示名。
|
||||||
|
|
||||||
- 每件武器有**独立等级**(1 到上限,锚点 5 级量级,provisional;**0 级 = 未练合法态**——未解锁或已解锁未锻造均为 0 加值裸体态,锻出第 1 级 = 首个 +1,2026-10-12 用户裁)、独立成长曲线、独立的满级特效挂位(**本期为空位**,见「满级特效扩展位」节)——三件武器的等级各自保留,换当前武器不丢任何进度。
|
- 每件武器有**独立等级**(1 到上限,锚点 5 级量级,provisional;**0 级 = 未练合法态**——未解锁或已解锁未锻造均为 0 加值裸体态,锻出第 1 级 = 首个 +1,Q1 裁 2026-10-12)、独立成长曲线、独立的满级特效挂位(**本期为空位**——6 裁,见「满级特效扩展位」节)——三件武器的等级各自保留,换当前武器不丢任何进度。
|
||||||
- **当前武器单选出场**:类型由武器决定(选长枪=穿刺)。选中态写**存档域**,冒险开始经参数面注入;`attack_type` 的默认值归锻造工坊配置常驻持有、hero.tres 静态表该轴已删除(现役静态值 normal 由锻造工坊配置默认值接管)。
|
- **当前武器单选出场**:类型由武器决定(选长枪=穿刺)。选中态写**存档域**(与等级域同批新增),冒险开始经参数面注入;`attack_type` 的默认值归锻造工坊配置常驻持有、hero.tres 静态表该轴随实装删除(原「写入 hero.tres 休眠轴」口径与现役「表运行期只读、永久强化写存档」纪律冲突,且与本文存档域条目自相矛盾;现役静态值 normal 由锻造工坊配置默认值接管)。
|
||||||
- **一次冒险 = 一个武器类型 + 一个甲型(1a 裁)**:同一时刻只有一件武器、一件甲生效(出场行显示"当前:长剑锻造 + 轻甲锻造")。多持轮换淘汰——棋盘穿刺/魔法直伤件已承载"对不同甲型换着打"的战术价值,战斗内换械要给结算管线新开"类型可变"维度,收益不成比例。(原裁点只问武器携带数,本裁把它扩到"一次冒险"粒度并同时覆盖甲侧。)
|
- **一次冒险 = 一个武器类型 + 一个甲型(1a 裁)**:同一时刻只有一件武器、一件甲生效(出场行显示"当前:长剑锻造 + 轻甲锻造")。多持轮换淘汰——棋盘穿刺/魔法直伤件已承载"对不同甲型换着打"的战术价值,战斗内换械要给结算管线新开"类型可变"维度,收益不成比例。(原裁点只问武器携带数,本裁把它扩到"一次冒险"粒度并同时覆盖甲侧。)
|
||||||
- **营地内随时切换、免费(1b / 1c 裁)**:等级都是玩家花资源练出来的,切换只是决定"今天带谁出门";二次收费会惩罚尝试性构筑,与成长曲线诉求(低成本试错找匹配武器)相逆。**冒险开始后锁死**:伤害单据的类型在开单时声明、管线内不变。
|
- **营地内随时切换、免费(1b / 1c 裁)**:等级都是玩家花资源练出来的,切换只是决定"今天带谁出门";二次收费会惩罚尝试性构筑,与成长曲线诉求(低成本试错找匹配武器)相逆。**冒险开始后锁死**:伤害单据的类型在开单时声明、管线内不变。
|
||||||
|
|
||||||
@@ -78,24 +78,24 @@
|
|||||||
| 重甲 | 12(+2) | −1(挡普通) | 解锁后从 1 级练起,独立等级路线 |
|
| 重甲 | 12(+2) | −1(挡普通) | 解锁后从 1 级练起,独立等级路线 |
|
||||||
| 魔法护甲 | 9(−1) | +1(被普通克) | 即现役甲域 ward——对号入座,零扩域 |
|
| 魔法护甲 | 9(−1) | +1(被普通克) | 即现役甲域 ward——对号入座,零扩域 |
|
||||||
|
|
||||||
- **命名统一(3a / 2b 裁)**:**只有「魔法护甲」这一个名字**(= 现役甲域 ward)。用户原案里的「魔法甲」是**笔误**,不是别名、不做简称退役处理——正文与界面文案一律写「魔法护甲」([术语表](../../术语表.md) 已登记)。"第四甲型"不存在也不需要讨论(2b 随之自动消解)。
|
- **命名统一(3a / 2b 裁)**:**只有「魔法护甲」这一个名字**(= 现役甲域 ward)。用户原案里的「魔法甲」是**笔误**,不是别名、不做简称退役处理——正文与界面文案一律写「魔法护甲」([术语表](../../术语表.md) 已登记);仅历史版本行与过程稿引用原文时按记载保留。"第四甲型"不存在也不需要讨论(2b 随之自动消解)。
|
||||||
- **每型独立等级路线(3c 裁)**:与武器路线同构;"当前甲"单选与"当前武器"单选同构,营地内免费切换。
|
- **每型独立等级路线(3c 裁)**:与武器路线同构;"当前甲"单选与"当前武器"单选同构,营地内免费切换。
|
||||||
- **甲型差异当下双轴可感(3b 裁)**:**敌方攻击是有类型的**;未显式设置的敌方攻击一律按**默认普通(normal)**参与结算(用户裁)。矩阵 normal 行取值 = 轻甲 0 / 重甲 −1 / 魔法护甲 +1(整数点数:+1 被克 / 0 中性 / −1 挡住)。所以甲型差异不是"只有基础 AC 可感",而是 **基础 AC + 克制修正两轴当下同时生效**。
|
- **甲型差异当下双轴可感(3b 裁——推翻原「显式边界·诚实收窄」条款)**:**敌方攻击是有类型的**;未显式设置的敌方攻击一律按**默认普通(normal)**参与结算(用户裁)。矩阵 normal 行取值 = 轻甲 0 / 重甲 −1 / 魔法护甲 +1(整数点数:+1 被克 / 0 中性 / −1 挡住)。所以甲型差异不是"只有基础 AC 可感",而是 **基础 AC + 克制修正两轴当下同时生效**——不再有"克制反向要等敌方攻击类型批"的推迟。
|
||||||
- **现役实态与本裁定的落差(跨系统汇合点,本系统只登记需求)**:现役敌方攻击单据的攻击类型栏为空(空串恒不查克制矩阵,与"群伤/反噬/地形/敌方技"同列无类型族),敌人表登记「敌方技能攻击类型轴仍未开(全部 normal 档)」——轴未开、开了也全 normal。**按 3b 裁执行 = 把该轴按「缺省填 normal」启用**;填值动作面落在敌人系统 / 战斗结算侧,不在本工作间内。本系统只登记该需求与它的数值影响。
|
- **现役实态与本裁定的落差(跨系统汇合点,本系统只登记需求)**:现役敌方攻击单据的攻击类型栏为空(空串恒不查克制矩阵,与"群伤/反噬/地形/敌方技"同列无类型族),敌人表登记「敌方技能攻击类型轴仍未开(全部 normal 档)」——轴未开、开了也全 normal。**按 3b 裁执行 = 把该轴按「缺省填 normal」启用**;填值动作面落在敌人系统 / 战斗结算侧,不在本工作间内。本系统只登记该需求与它的数值影响。
|
||||||
- **连带后果(3b 裁的前置信息,用户裁定:留作后续开发改造的输入)**:按"敌方攻击缺省普通"落定后,现行数据下三型会成**纯序**——重甲(AC +2 且挡普通 −1)= 双正、轻甲 = 中性、魔法护甲(AC −1 且被普通克 +1)= 负向,且因现行敌方无魔法攻击而暂无优势窗口。这是**后续开发改造的前置事实**不是缺陷裁定:敌方攻击类型的差异化、魔法护甲的正当性由后续批次负责(含 M4 在基础 AC / 解锁价上的取值);本系统只需按统一伤害轴把结构与字段落对即可。
|
- **连带后果(3b 裁的前置信息,用户裁定:不在本批考虑,留作后续开发改造的输入)**:按"敌方攻击缺省普通"落定后,现行数据下三型会成**纯序**——重甲(AC +2 且挡普通 −1)= 双正、轻甲 = 中性、魔法护甲(AC −1 且被普通克 +1)= 负向,且因现行敌方无魔法攻击而暂无优势窗口。这是**后续开发改造的前置事实**不是缺陷裁定:敌方攻击类型的差异化、魔法护甲的正当性由后续批次负责(含 M4 在基础 AC / 解锁价上的取值);本批只需按统一伤害轴把结构与字段落对即可。
|
||||||
- 每 1 点 AC 的期望减伤约 3.75% 量级(现役 EV 复算锚:AC10 期望减免 21.25%、AC11 25%),终值归 M4。
|
- 每 1 点 AC 的期望减伤约 3.75% 量级(现役 EV 复算锚:AC10 期望减免 21.25%、AC11 25%),终值归 M4。
|
||||||
|
|
||||||
### 成长曲线与解锁
|
### 成长曲线与解锁
|
||||||
|
|
||||||
- **曲线形状:前缓后陡(4a 裁,只锁方向不锁值)**——低等级每级攻击增量小(+0/+1 量级),高等级每级 +1/+2 量级。前期刻意压数字:玩家靠挖掘技巧过关(这是特性不是缺陷);**能力台阶 = 新武器 / 新甲型的解锁**(满级特效本期不做,见「满级特效扩展位」节)。只锁形状方向,参数全体 provisional 归 M4。(曲线形状与几何定价是两条独立旋钮,终值同归 M4 标定。)
|
- **曲线形状:前缓后陡(4a 裁,只锁方向不锁值)**——低等级每级攻击增量小(+0/+1 量级),高等级每级 +1/+2 量级。前期刻意压数字:玩家靠挖掘技巧过关(这是特性不是缺陷);**能力台阶 = 新武器 / 新甲型的解锁**(满级特效本期不做,见「满级特效扩展位」节)。只锁形状方向,参数全体 provisional 归 M4。(程序性登记:曲线形状与几何定价是两条独立旋钮,终值同归 M4 一批标定——不含任何方向性判断。)
|
||||||
- **本系统=攻防数值成长唯一来源**(2026-10-11 所有权切分裁):攻击成长只在武器路线、AC 成长只在甲路线;树脊柱零攻防数值(只有生命/命中两线)。数字成长的速率与能力解锁的节奏由本曲线统一握持——这是本系统对成长曲线反馈诉求的独占载体地位。
|
- **本系统=攻防数值成长唯一来源**(2026-10-11 所有权切分裁):攻击成长只在武器路线、AC 成长只在甲路线;树脊柱零攻防数值(只有生命/命中两线)。数字成长的速率与能力解锁的节奏由本曲线统一握持——这是本系统对成长曲线反馈诉求的独占载体地位。
|
||||||
- **解锁节奏:锻造内自闭环(4b 裁)**——新武器 / 新甲型的解锁条件全部在锻造系统内部,不绑关卡进度(与"营地 = 消费钥石的成长枢纽"定位冲突,且首局教学局不该被绑死在长剑上)。
|
- **解锁节奏:锻造内自闭环(4b 裁)**——新武器 / 新甲型的解锁条件全部在锻造系统内部,不绑关卡进度(与"营地 = 消费钥石的成长枢纽"定位冲突,且首局教学局不该被绑死在长剑上)。
|
||||||
- **解锁通道:并联双通道(4b-1 裁)**——每条待解锁路线(长枪 / 法杖 / 重甲 / 魔法护甲)都开两个**互不影响、玩家自选其一**的通道:① **练满前一档**(长剑练满开长枪/法杖、轻甲练满开重甲/魔法护甲);② **一次性解锁价**直购开。不设串联门槛(不需要先练满才能买)。与秘宝的关系:共享钥石单币与「钥石直购 / 条件解锁」的成分语义,但通道结构不同——秘宝为件级单通道分派(`秘宝.md:29`),本系统为同路线双通道并联任选(两者功能、结构、位置均不同)。
|
- **解锁通道:并联双通道(4b-1 裁)**——每条待解锁路线(长枪 / 法杖 / 重甲 / 魔法护甲)都开两个**互不影响、玩家自选其一**的通道:① **练满前一档**(长剑练满开长枪/法杖、轻甲练满开重甲/魔法护甲);② **一次性解锁价**直购开。不设串联门槛(不需要先练满才能买)。与秘宝的关系:共享钥石单币与「钥石直购 / 条件解锁」的成分语义,但通道结构不同——秘宝为件级单通道分派(`秘宝.md:29`),本系统为同路线双通道并联任选(2026-10-12 v0.6 订正:原「与秘宝解锁的混合制同构」表述删除——「同构」非本项目概念,两者功能、结构、位置均不同)。
|
||||||
|
|
||||||
### 经济
|
### 经济
|
||||||
|
|
||||||
- **纯钥石(5b 裁)**:与现役属性锻造、天赋树(树全钥石单币)、同调刷新升级同币同柜。原案语义是"攻击力提升改造"——同一笔钱换个花法。GP = 局内一次性货币、局内清零不入存档、与钥石永不互兑,两币分工是拍板条款,不引入局外 GP 余额域或第三货币。(用户裁定注:当前没有其他材料,钥石就是统一货币;**后续若要分出专用币或材料,届时再重构设计,不预先建面**。)
|
- **纯钥石(5b 裁)**:与现役属性锻造、天赋树(树全钥石单币)、同调刷新升级同币同柜。原案语义是"攻击力提升改造"——同一笔钱换个花法。GP = 局内一次性货币、局内清零不入存档、与钥石永不互兑,两币分工是拍板条款,不引入局外 GP 余额域或第三货币。(用户裁定注:当前没有其他材料,钥石就是统一货币;**后续若要分出专用币或材料,届时再重构设计,不预先建面**。)
|
||||||
- **几何递增定价**:每级价格 = 基础价 × 150%^(已购级数)(考古参数:单次 20 钥石、公比 150%——见退役行批注;forge_products 行族已退役、无现役计价字段可沿,投值归 M4 从零标定);路线解锁 = 一次性解锁价(量纲 ≈ 中段几级锻造花费)。全部终值归 M4。
|
- **几何递增定价**:每级价格 = 基础价 × 150%^(已购级数)(历史考古参数:单次 20 钥石、公比 150%——退役行批注;forge_products 行族已随迭代 21 T5 退役、无现役计价字段可沿,实装投值归 M4 从零标定);路线解锁 = 一次性解锁价(量纲 ≈ 中段几级锻造花费)。全部终值归 M4。
|
||||||
- **零材料经济(5c 裁)**:不引入账号层锻造材料。现役效果引擎的 grant_material 是**局内**材料计数器(如雷区图谱),不是账号层库存;账号层材料=全新经济面(存档域/获取渠道/囤积规则全套新建),原案全文只字未提材料,武器差异化的价值轴是类型(与预留的特效位)不是采集刷料。
|
- **零材料经济(5c 裁)**:不引入账号层锻造材料。现役效果引擎的 grant_material 是**局内**材料计数器(如雷区图谱),不是账号层库存;账号层材料=全新经济面(存档域/获取渠道/囤积规则全套新建),原案全文只字未提材料,武器差异化的价值轴是类型(与预留的特效位)不是采集刷料。
|
||||||
|
|
||||||
### 满级特效扩展位(本期不启用——6 裁)
|
### 满级特效扩展位(本期不启用——6 裁)
|
||||||
@@ -103,21 +103,21 @@
|
|||||||
**裁决(2026-10-12)**:满级特效**本期不做**——不设计清单、不定数值、不实装、不开参数位。只保留**扩展位**:
|
**裁决(2026-10-12)**:满级特效**本期不做**——不设计清单、不定数值、不实装、不开参数位。只保留**扩展位**:
|
||||||
|
|
||||||
- 每条路线(三武器 + 三甲)的等级终点各预留 1–2 条特效挂点,本期**为空位**;
|
- 每条路线(三武器 + 三甲)的等级终点各预留 1–2 条特效挂点,本期**为空位**;
|
||||||
- 启用前提 = 后续专门立项;
|
- 启用前提 = 后续专门立项,**不随锻造工坊实装批落地**;
|
||||||
- 启用时沿用的既有约束:优先复用现役效果引擎的效果类型闭集(词面与词数以现行效果引擎词表为唯一准,本文不抄数),**不往闭集加新词**——闭集是高代价变更面(加载校验 / 文档词表 / 回归测试三处连带);
|
- 启用时沿用的既有约束:优先复用现役效果引擎效果类型闭集(**31 种**——2026-10-13 迭代 23 反哺写入订正,原记 24 系 2026-10-07 旧快照;迭代 20 T1 +7、迭代 22 T3 +1),**不往闭集加新词**——闭集是高代价变更面(加载校验 / 文档词表 / 回归测试三处连带);
|
||||||
- 未启用的候选池七条——**备用清单,不是承诺清单**:启用时逐条取用或推翻,终选清单与数值仍归实装批需求卡片+M4 数值批:
|
- 未启用的候选池七条(2026-10-21 自过程稿 §八 迁入,原只留彼不进正文)——**备用清单,不是承诺清单**:启用时逐条取用或推翻,终选清单与数值仍归实装批需求卡片+M4 数值批:
|
||||||
|
|
||||||
| 路线 | 候选特效(量纲方向) | 实现代价分档 |
|
| 路线 | 候选特效(量纲方向) | 实现代价分档(2026-10-21 按现役代码复核) |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 长剑 | 破甲:命中重甲时克制修正额外 +1 点量级 | 零新代码——`modify_ticket` 效果类型与 matchup 条件算子均在现役闭集 |
|
| 长剑 | 破甲:命中重甲时克制修正额外 +1 点量级 | 零新代码——`modify_ticket` 效果类型与 matchup 条件算子均在现役闭集 |
|
||||||
| 长剑(第二条) | 暴击面扩大:暴击骰面 −1 量级 | **需新参数位**——暴击面现役是表上恒定值(`settlement.tres` 的 `crit_roll=20`),改成武器级可变=实装批改读表面 |
|
| 长剑(第二条) | 暴击面扩大:暴击骰面 −1 量级 | **需新参数位**——暴击面现役是表上恒定值(`settlement.tres` 的 `crit_roll=20`),改成武器级可变=实装批改读表面 |
|
||||||
| 长枪 | 先手连击:战斗开场追加一次普攻量级的攻击 | **需新代码**——`attack_segments` 已随架构审查整改甲案整链退役(词表摘名+消费段全删,数据行误写即加载致命);启用须按加词流程重开 |
|
| 长枪 | 先手连击:战斗开场追加一次普攻量级的攻击 | 零新代码——`attack_segments` 在册 |
|
||||||
| 法杖 | 开局魔法矢:每场战斗开场自动对最前敌人放一次魔法直伤(必中全额量级) | 零新代码——`spawn_spell` 在册(次数/回合数 provisional) |
|
| 法杖 | 开局魔法矢:每场战斗开场自动对最前敌人放一次魔法直伤(必中全额量级) | 零新代码——`spawn_spell` 在册(次数/回合数 provisional) |
|
||||||
| 轻甲 | 灵巧:掷点折扣临界档再缓一档量级 | **需新参数位**——折扣档现役读表恒定(`settlement.tres` 的 `roll_tier_discounts=[75,50,25]`) |
|
| 轻甲 | 灵巧:掷点折扣临界档再缓一档量级 | **需新参数位**——折扣档现役读表恒定(`settlement.tres` 的 `roll_tier_discounts=[75,50,25]`) |
|
||||||
| 重甲 | 反震:被命中时对攻击者反贴 1 点量级伤害 | **需新代码**——`spike` 只作词面与注释在册,全仓无一处按该词派发效果(数据行填它零反应);伤害控制器里的 spike 承载的是主角攻击满层必中与倍乘,与「被命中反弹」不同轴,反弹需新开消费点 |
|
| 重甲 | 反震:被命中时对攻击者反贴 1 点量级伤害 | 零新代码——`spike` 在册 |
|
||||||
| 魔法护甲 | 护盾:每场战斗开场自带护盾(层数 X 量级,终值归 M4) | 零新代码+参数面桥接——`shield` 在册,护盾层数进战斗开场参数需接线 |
|
| 魔法护甲 | 护盾:每场战斗开场自带护盾(层数 X 量级,终值归 M4) | 零新代码+参数面桥接——`shield` 在册,护盾层数进战斗开场参数需接线 |
|
||||||
|
|
||||||
- 候选池的实现深度前提:七条中五条可由现役效果类型闭集词或参数位表达(其中两条另需新参数位,见上表),**长枪先手连击与重甲反震两条需往闭集加新词或新开消费点**——加词是高代价变更面(加载校验/文档词表/回归测试三处连带),启用时须先行申报,禁默默加词。
|
- 候选池的实现深度前提(沿用过程稿结论并经现役复核):七条全部可用现役效果类型闭集词或参数位表达,**无一条需要往闭集加新效果类型词**——加词是高代价变更面(加载校验/文档词表/回归测试三处连带),启用时禁走此路。
|
||||||
|
|
||||||
**对相邻口径的两处连带**:① 设计目的节"能力解锁的节奏"台阶收缩为新武器 / 新甲型解锁(不再含特效);② 存档域不设特效域。
|
**对相邻口径的两处连带**:① 设计目的节"能力解锁的节奏"台阶收缩为新武器 / 新甲型解锁(不再含特效);② 存档域不设特效域。
|
||||||
|
|
||||||
@@ -126,14 +126,14 @@
|
|||||||
- **奇物属性件**:分层并存,互不侵入。武器/护甲锻造动的是**账号层基础值**(营地永久强化,冒险开始时经参数面传入);奇物属性件动的是**单次冒险加算区**(关间不清零、冒险结束清零)。本设计不扩奇物"生命/AC/攻击"三轴封闭分类、不动渠道开关表、不往局内池加任何东西。入战 AC 的三层语义清晰可加:甲型基础 AC + 营地甲路线等级加值 + 局内加算区累加。
|
- **奇物属性件**:分层并存,互不侵入。武器/护甲锻造动的是**账号层基础值**(营地永久强化,冒险开始时经参数面传入);奇物属性件动的是**单次冒险加算区**(关间不清零、冒险结束清零)。本设计不扩奇物"生命/AC/攻击"三轴封闭分类、不动渠道开关表、不往局内池加任何东西。入战 AC 的三层语义清晰可加:甲型基础 AC + 营地甲路线等级加值 + 局内加算区累加。
|
||||||
- **克制矩阵(2a 裁:伪裁点消解)**:**伤害结算只有一套,类型不是待仲裁的槽位**。每份伤害单据自带攻击类型栏——主角基础攻击单据取当前武器的攻击类型,棋盘格面直伤件(穿刺弹 / 魔法矢)取奖励表自身的类型——各自按**同一张 3×3 克制矩阵**取克制修正。因此"叠加 / 替代 / 互斥"三分法不成立:两根参数之间无冲突可裁,也不需要任何共存规则。二者的真实差异只在**单据形态与生命周期**(主角基础攻击走掷点折扣 + 暴击;棋盘克制直伤走必中全额不掷点;且前者 = 账号层永久、后者 = 局内一次性)——那是两条不同的伤害来源,不是两种类型语义。矩阵九格满格结构冻结(2b 随 3a 自动消解:魔法护甲 = 现役 ward,不存在第四甲型)。
|
- **克制矩阵(2a 裁:伪裁点消解)**:**伤害结算只有一套,类型不是待仲裁的槽位**。每份伤害单据自带攻击类型栏——主角基础攻击单据取当前武器的攻击类型,棋盘格面直伤件(穿刺弹 / 魔法矢)取奖励表自身的类型——各自按**同一张 3×3 克制矩阵**取克制修正。因此"叠加 / 替代 / 互斥"三分法不成立:两根参数之间无冲突可裁,也不需要任何共存规则。二者的真实差异只在**单据形态与生命周期**(主角基础攻击走掷点折扣 + 暴击;棋盘克制直伤走必中全额不掷点;且前者 = 账号层永久、后者 = 局内一次性)——那是两条不同的伤害来源,不是两种类型语义。矩阵九格满格结构冻结(2b 随 3a 自动消解:魔法护甲 = 现役 ward,不存在第四甲型)。
|
||||||
- **工作间两区定名 + 路线行名(8a 裁)**:锻造工坊工作间内先立两个分区,各装三条锻造路线(路线行名统一为"件名 + 锻造")——①**武器锻造区**:长剑锻造 / 长枪锻造 / 法杖锻造;②**护甲锻造区**:轻甲锻造 / 重甲锻造 / 魔法护甲锻造。两区并列、机制层面零顺序门槛(A③ 裁),区内路线各自独立升级。
|
- **工作间两区定名 + 路线行名(8a 裁)**:锻造工坊工作间内先立两个分区,各装三条锻造路线(路线行名统一为"件名 + 锻造")——①**武器锻造区**:长剑锻造 / 长枪锻造 / 法杖锻造;②**护甲锻造区**:轻甲锻造 / 重甲锻造 / 魔法护甲锻造。两区并列、机制层面零顺序门槛(A③ 裁),区内路线各自独立升级。
|
||||||
- **局内不存在武器/护甲的提升(8a 裁连带核结)**:用户指出"局内没有可以提升武器的地方"——**属实**。查实:局内商店货架的三行(现名"攻击祝福 / 生命祝福 / 护甲祝福"),**正是奇物「属性值提升」三轴(攻击 / 生命上限 / AC)的货架前台标签**——`shop.tres` pool_shelf 六行用种类字段指向冒险表的奇物种类词表(其中凭证行为显式豁免种、不入该词表,六行中五行命中),`display_name` 只是这层的前台名;买到的东西进**冒险加算区**、冒险结束清零。所以它们是**奇物属性件**,既不是武器也不是护甲,局内不改变任何锻造等级。命名上的隐患确凿:行名里的"锻"字与营地锻造同字,是误读的直接来源。**命名(2026-10-12 用户裁)**:三行按「属性 + 后缀」改名,后缀取 **祝福** ⇒ **攻击祝福 / 生命祝福 / 护甲祝福**(D&D 参照调研:Blessing 为"神赐恩惠"义;用户同时裁定——参考书目里出现过「祝福」一词不构成禁用)。**改名后这三条在语感上彻底脱离"锻造"一词,与营地工作间不再有字面关联**,而结构关系不变(仍是奇物「属性值提升」三轴,机制分类名不动,只改玩家向显示名)。改名已执行完毕(shop.tres 六行锻升→祝福;reward.tres / status_effects.tres 护甲强化→盾牌加护)。
|
- **局内不存在武器/护甲的提升(8a 裁连带核结)**:用户指出"局内没有可以提升武器的地方"——**属实**。查实:局内商店货架的三行(现役旧名"攻击锻升 / 生命锻升 / 护甲锻升"——**2026-10-12 已改名,见下**),**正是奇物「属性值提升」三轴(攻击 / 生命上限 / AC)的货架前台标签**——`shop.tres` pool_shelf 六行用种类字段指向冒险表的奇物种类词表(其中凭证行为显式豁免种、不入该词表,六行中五行命中),`display_name` 只是这层的前台名;买到的东西进**冒险加算区**、冒险结束清零。所以它们是**奇物属性件**,既不是武器也不是护甲,局内不改变任何锻造等级。命名上的隐患确凿:行名里的"锻"字与营地锻造同字,是误读的直接来源。**2026-10-12 用户裁决(8a 连带·C 项)**:三行按「属性 + 后缀」改名,后缀取 **祝福** ⇒ **攻击祝福 / 生命祝福 / 护甲祝福**(D&D 参照调研:Blessing 为"神赐恩惠"义;用户同时裁定——参考书目里出现过「祝福」一词不构成禁用)。**改名后这三条在语感上彻底脱离"锻造"一词,与营地工作间不再有字面关联**,而结构关系不变(仍是奇物「属性值提升」三轴,机制分类名不动,只改玩家向显示名)。**改名已于 2026-10-12 执行完毕并合入 master**(shop.tres 六行锻升→祝福;reward.tres / status_effects.tres 护甲强化→盾牌加护)。
|
||||||
- **专长联动**:现役专长均为跨攻击类型通用件(不按 attack_type 分系——既无 normal 条件件、也无 pierce/magic 条件件,`feats.tres` 29 行实证),武器类型差异只经克制矩阵的 matchup 行体现;「选某类型激活某系专长」在本项目专长体系下不成立。现有死条件 `magic_vs_magic`(魔法打"魔法甲"——现行甲域无此型,永不可触发 = 废卡):**复活作废**——所属件魔网织者在素材库表二退役名单,该行已随专长退役消解,本系统零触碰。「魔法打魔法护甲」的克制语义由矩阵九格承载(magic vs ward = −1),新专长框架如需同类件 = 彼批的新卡设计题。
|
- **专长联动**:现役专长均为跨攻击类型通用件(不按 attack_type 分系——既无 normal 条件件、也无 pierce/magic 条件件,`feats.tres` 29 行实证),武器类型差异只经克制矩阵的 matchup 行体现;「选某类型激活某系专长」在本项目专长体系下不成立(2026-10-12 v0.6 订正:原「选长枪激活穿刺系专长的价值」为无现役对应物的表述,删除)。现有死条件 `magic_vs_magic`(魔法打"魔法甲"——现行甲域无此型,永不可触发 = 废卡):**改值复活案已作废(2026-10-11 D 组核结——所属件魔网织者在素材库表二专长 27 件退役删除名单)**,该行随专长退役删行批整体消解,本系统零触碰(2026-10-12 订正:本节原写"推荐复活"与实装边界第 3 条结案口径冲突,随本批对齐)。「魔法打魔法护甲」的克制语义由矩阵九格承载(magic vs ward = −1),新专长框架如需同类件 = 彼批的新卡设计题。
|
||||||
- **天赋树**:同钥石经济;注入面分层叠加且**所有权切分**(2026-10-11 裁)——树脊柱只持生命/命中淬炼(树零攻防来源),攻/AC 唯一入口=本系统路线加值(只按当前选中武器/甲生效)。
|
- **天赋树**:同钥石经济;注入面分层叠加且**所有权切分**(2026-10-11 裁)——树脊柱只持生命/命中淬炼(树零攻防来源),攻/AC 唯一入口=本系统路线加值(只按当前选中武器/甲生效)。
|
||||||
- **冒险前资源配比预设批(挂起冻结中)**:本设计不预设该批的重启口径、不占用其任何冻结裁决、不改其冻结文本。该批重启时须显式核对两处交汇面:①预算包络是否把武器类型计入克制注;②容量柜台与锻造工坊工作间(同在营地)的资源竞争关系。
|
- **冒险前资源配比预设批(挂起冻结中)**:本设计不预设该批的重启口径、不占用其任何冻结裁决、不改其冻结文本。该批重启时须显式核对两处交汇面:①预算包络是否把武器类型计入克制注;②容量柜台与锻造工坊工作间(同在营地)的资源竞争关系。
|
||||||
|
|
||||||
## 裁决结果清单
|
## 裁决结果清单(17 裁点全表·2026-10-12 清零)
|
||||||
|
|
||||||
全部裁点已拍板,本表即终态。
|
17 裁点全部拍板,本表即终态(含本会话呈报的两条子问 4a-1 / 4b-1,共 19 行)。「推翻推荐」四行已同步改正文对应节。
|
||||||
|
|
||||||
| # | 裁点 | 裁决结果 | 写入处 | 备注 |
|
| # | 裁点 | 裁决结果 | 写入处 | 备注 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
| 1c | 换械收费 | 免费 | 同上 | 按推荐案 |
|
| 1c | 换械收费 | 免费 | 同上 | 按推荐案 |
|
||||||
| 2a | 类型轴共存 | **伪裁点消解**——伤害结算只有一套、单据自带类型,"叠加 / 替代 / 互斥"三分法不成立 | 「与相邻系统的边界·克制矩阵」 | **推翻推荐案** |
|
| 2a | 类型轴共存 | **伪裁点消解**——伤害结算只有一套、单据自带类型,"叠加 / 替代 / 互斥"三分法不成立 | 「与相邻系统的边界·克制矩阵」 | **推翻推荐案** |
|
||||||
| 2b | 矩阵扩维 | 不扩(九格冻结)——**随 3a 自动消解**;且「魔法甲」系笔误、只有魔法护甲一型,第四甲型无从谈起 | 同上 | 附庸裁点 + 笔误消解 |
|
| 2b | 矩阵扩维 | 不扩(九格冻结)——**随 3a 自动消解**;且「魔法甲」系笔误、只有魔法护甲一型,第四甲型无从谈起 | 同上 | 附庸裁点 + 笔误消解 |
|
||||||
| 2c | 死条件 magic_vs_magic | **已结案**:复活作废——所属件魔网织者在素材库表二退役名单,随专长退役消解 | 实装边界 3 | — |
|
| 2c | 死条件 magic_vs_magic | **已结案(2026-10-11 D 组核结)**:复活作废——所属件魔网织者在素材库表二退役名单,随专长 27 件退役消解 | 实装边界 3 | v0.4 结案 |
|
||||||
| 3a | 甲域定名 | **就叫魔法护甲**(= 现役 ward);三型 = 轻甲 / 重甲 / 魔法护甲 | 「三型护甲」节 | 按推荐案 + **「魔法甲」系笔误,不立别名** |
|
| 3a | 甲域定名 | **就叫魔法护甲**(= 现役 ward);三型 = 轻甲 / 重甲 / 魔法护甲 | 「三型护甲」节 | 按推荐案 + **「魔法甲」系笔误,不立别名** |
|
||||||
| 3b | 甲型可感面 | **敌方攻击有类型、未设置 = 默认普通** ⇒ 甲型差异"基础 AC + 克制修正"两轴**当下即生效**;原"克制反向留结构位"收窄条款作废 | 「三型护甲」节 + 实装边界 6 | **推翻推荐案**(连带跨系统填值需求 + 魔法护甲双负呈报) |
|
| 3b | 甲型可感面 | **敌方攻击有类型、未设置 = 默认普通** ⇒ 甲型差异"基础 AC + 克制修正"两轴**当下即生效**;原"克制反向留结构位"收窄条款作废 | 「三型护甲」节 + 实装边界 6 | **推翻推荐案**(连带跨系统填值需求 + 魔法护甲双负呈报) |
|
||||||
| 3c | 护甲升级结构 | 每型独立路线(与武器同构) | 「三型护甲」节 | 按推荐案 |
|
| 3c | 护甲升级结构 | 每型独立路线(与武器同构) | 「三型护甲」节 | 按推荐案 |
|
||||||
@@ -151,15 +151,15 @@
|
|||||||
| 4a-1 | 〔子问〕曲线×定价"又贵又弱"提示 | **撤回**——该结论无依据(定价为现役沿用参数、前期弱是曲线意图),不落任何方向性判断;只留"两条旋钮同批标定"程序句 | 同上 | 呈报方撤回 |
|
| 4a-1 | 〔子问〕曲线×定价"又贵又弱"提示 | **撤回**——该结论无依据(定价为现役沿用参数、前期弱是曲线意图),不落任何方向性判断;只留"两条旋钮同批标定"程序句 | 同上 | 呈报方撤回 |
|
||||||
| 4b | 解锁节奏 | 锻造内自闭环(不绑关卡进度) | 同上 | 按推荐案 |
|
| 4b | 解锁节奏 | 锻造内自闭环(不绑关卡进度) | 同上 | 按推荐案 |
|
||||||
| 4b-1 | 〔子问〕解锁通道语义 | **并联双通道**:练满前一档 **OR** 一次性解锁价,两者互不影响、玩家自选 | 同上 | 原正文"或"字歧义完成裁决 |
|
| 4b-1 | 〔子问〕解锁通道语义 | **并联双通道**:练满前一档 **OR** 一次性解锁价,两者互不影响、玩家自选 | 同上 | 原正文"或"字歧义完成裁决 |
|
||||||
| 5a | 柜台承载 | **已结案**:四柜台并排、攻防独立柜台、生命档移除 | 「柜台承载」节 | — |
|
| 5a | 柜台承载 | **已结案(2026-10-11 A②)**:四柜台并排、攻防独立柜台、生命档移除 | 「柜台承载」节 | v0.4 结案 |
|
||||||
| 5b | 货币 | 纯钥石(用户注:当前无其他材料,钥石 = 统一货币;后续若要区分再重构,不预先建面) | 「经济」节 | 按推荐案(且受两币分工条款锁定) |
|
| 5b | 货币 | 纯钥石(用户注:当前无其他材料,钥石 = 统一货币;后续若要区分再重构,不预先建面) | 「经济」节 | 按推荐案(且受两币分工条款锁定) |
|
||||||
| 5c | 材料经济 | 纯钥石零材料 | 「经济」节 | 按推荐案 |
|
| 5c | 材料经济 | 纯钥石零材料 | 「经济」节 | 按推荐案 |
|
||||||
| 6 | 满级特效深度 | **本期不做,只留扩展位**——不设计清单 / 不定数值 / 不实装 / 不开参数位 | 「满级特效扩展位」节 | **推翻推荐案**(原 = 复用为主 + 三条新参数位) |
|
| 6 | 满级特效深度 | **本期不做,只留扩展位**——不设计清单 / 不定数值 / 不实装 / 不开参数位 | 「满级特效扩展位」节 | **推翻推荐案**(原 = 复用为主 + 三条新参数位) |
|
||||||
| 8a | 货架现名 → 实裁 = 工作间命名(区名 + 路线行名)+ 局内核结 | **区名**:武器锻造区 / 护甲锻造区;**路线行名**统一「件名 + 锻造」= 长剑锻造 / 长枪锻造 / 法杖锻造、轻甲锻造 / 重甲锻造 / 魔法护甲锻造(第一件武器显示名 = **长剑**)。**局内核结**:局内不存在武器 / 护甲的提升——商店货架三行(现名攻击祝福 / 生命祝福 / 护甲祝福)即奇物「属性值提升」三轴的货架前台标签(`shop.tres` pool_shelf 种类字段 → `adventure.tres` 奇物种类词表),与锻造无关 | 「与相邻系统的边界·工作间两区定名 / 局内不存在武器提升」 | 裁点重定向 + Y 层命名 |
|
| 8a | 货架现名 → 实裁 = 工作间命名(区名 + 路线行名)+ 局内核结 | **区名**:武器锻造区 / 护甲锻造区;**路线行名**统一「件名 + 锻造」= 长剑锻造 / 长枪锻造 / 法杖锻造、轻甲锻造 / 重甲锻造 / 魔法护甲锻造(第一件武器显示名 剑 → **长剑**)。**局内核结**:局内不存在武器 / 护甲的提升——商店货架三行「攻击锻升 / 生命锻升 / 护甲锻升」即奇物「属性值提升」三轴的货架前台标签(`shop.tres` pool_shelf 种类字段 → `adventure.tres` 奇物种类词表),与锻造无关;是否去"锻"字归实装批呈现面 | 「与相邻系统的边界·工作间两区定名 / 局内不存在武器提升」 | 裁点重定向 + Y 层命名 |
|
||||||
|
|
||||||
## 工作间内容清单
|
## 工作间内容清单(实装批需求卡片输入)
|
||||||
|
|
||||||
本节把定案口径压成一张可照做的清单。
|
本节把定案口径压成一张可照做的清单——需求卡片逐条取用即可。
|
||||||
|
|
||||||
### 1 · 承载与入口
|
### 1 · 承载与入口
|
||||||
- 营地四柜台之一(树「锻造工坊」钥匙节点点亮后展开;未点亮 = 锁定态;钥匙 free、无前置)。
|
- 营地四柜台之一(树「锻造工坊」钥匙节点点亮后展开;未点亮 = 锁定态;钥匙 free、无前置)。
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
|
|
||||||
| 路线(行名) | 攻击类型 | 初始 / 待解锁 | 解锁通道 |
|
| 路线(行名) | 攻击类型 | 初始 / 待解锁 | 解锁通道 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| **长剑锻造** | 普通 | **初始持有**(语义继承自已退役的攻击锻造行) | — |
|
| **长剑锻造** | 普通 | **初始持有**(语义继承自已退役的攻击锻造行;行族新建归实装批) | — |
|
||||||
| **长枪锻造**(穿刺) | 穿刺 | 待解锁,解锁后从 1 级练起 | 并联双通道 |
|
| **长枪锻造**(穿刺) | 穿刺 | 待解锁,解锁后从 1 级练起 | 并联双通道 |
|
||||||
| **法杖锻造**(魔法) | 魔法 | 待解锁,解锁后从 1 级练起 | 并联双通道 |
|
| **法杖锻造**(魔法) | 魔法 | 待解锁,解锁后从 1 级练起 | 并联双通道 |
|
||||||
|
|
||||||
@@ -178,14 +178,14 @@
|
|||||||
|
|
||||||
| 路线(行名) | 基础 AC(provisional) | 挨普通攻击的克制修正 | 初始 / 待解锁 | 解锁通道 |
|
| 路线(行名) | 基础 AC(provisional) | 挨普通攻击的克制修正 | 初始 / 待解锁 | 解锁通道 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| **轻甲锻造** | 10(现役主角值,不动) | 0 | **初始持有**(语义继承自已退役的护甲锻造行) | — |
|
| **轻甲锻造** | 10(现役主角值,不动) | 0 | **初始持有**(语义继承自已退役的护甲锻造行;行族新建归实装批) | — |
|
||||||
| **重甲锻造** | 12(+2) | −1 | 待解锁,从 1 级练起 | 并联双通道 |
|
| **重甲锻造** | 12(+2) | −1 | 待解锁,从 1 级练起 | 并联双通道 |
|
||||||
| **魔法护甲锻造**(ward) | 9(−1) | +1 | 待解锁,从 1 级练起 | 并联双通道 |
|
| **魔法护甲锻造**(ward) | 9(−1) | +1 | 待解锁,从 1 级练起 | 并联双通道 |
|
||||||
|
|
||||||
### 4 · 每条路线的内容(六条同构)
|
### 4 · 每条路线的内容(六条同构)
|
||||||
- **等级**:1 → 上限(锚点 5 级量级,provisional 归 M4);**0 级 = 未练合法态**(未解锁/未锻造 = 0 加值裸体态,锻出第 1 级 = 首个 +1;正文「1 → 上限」为量级描述)。
|
- **等级**:1 → 上限(锚点 5 级量级,provisional 归 M4);**0 级 = 未练合法态**(未解锁/未锻造 = 0 加值裸体态,锻出第 1 级 = 首个 +1——Q1 裁,正文「1 → 上限」为量级描述)。
|
||||||
- **成长曲线**:前缓后陡(武器 = 攻击加值;甲 = AC 加值),只锁方向。
|
- **成长曲线**:前缓后陡(武器 = 攻击加值;甲 = AC 加值),只锁方向。
|
||||||
- **终点**:满级特效挂位 1–2 条——**本期为空位**。
|
- **终点**:满级特效挂位 1–2 条——**本期为空位**(6 裁)。
|
||||||
- **独立保留**:换当前件后,原来那件的练度**保留但不生效**(长剑的练度在换带长枪后回家待命)。
|
- **独立保留**:换当前件后,原来那件的练度**保留但不生效**(长剑的练度在换带长枪后回家待命)。
|
||||||
- **定价**:钥石单币,每级价格 = 基础价 × 150%^(已购级数)(现役 20 钥石基价参数沿用)。
|
- **定价**:钥石单币,每级价格 = 基础价 × 150%^(已购级数)(现役 20 钥石基价参数沿用)。
|
||||||
|
|
||||||
@@ -205,21 +205,7 @@
|
|||||||
三武器等级 + 三甲等级 + 当前武器标记 + 当前甲标记;**无特效域**。旧档破坏性废弃(禁迁移 / 折算)。存档域见[存档序列化](../表现与支撑/存档序列化.md)(域清单与版本沿革 v7 行)。
|
三武器等级 + 三甲等级 + 当前武器标记 + 当前甲标记;**无特效域**。旧档破坏性废弃(禁迁移 / 折算)。存档域见[存档序列化](../表现与支撑/存档序列化.md)(域清单与版本沿革 v7 行)。
|
||||||
|
|
||||||
### 9 · 本期明确不做
|
### 9 · 本期明确不做
|
||||||
① 满级特效(清单 / 数值 / 参数位 / 存档域全不做);② 敌方攻击类型轴填值——跨系统需求,执行面在敌人系统 / 战斗结算侧,本系统只登记。
|
① 满级特效(清单 / 数值 / 参数位 / 存档域全不做);② 敌方攻击类型轴填值——跨系统需求,执行面在敌人系统 / 战斗结算侧,本批只登记。
|
||||||
|
|
||||||
### 10 · 数值与验证
|
### 10 · 数值与验证
|
||||||
全部数值 provisional 归 Alpha 收官 M4 数值批;改值须带同随机种子配对读数验证难度影响。
|
全部数值 provisional 归 Alpha 收官 M4 数值批;实装批必须带改前 / 改后同随机种子配对读数验证难度影响。
|
||||||
|
|
||||||
## 验收标准
|
|
||||||
|
|
||||||
本节判据全部绑结构与关系、不绑具体数值:价格、增量、等级上限等行值 provisional 归 M4 数值批,改值不推翻判据;判据失效只发生在结构关系本身被改时。
|
|
||||||
|
|
||||||
- **柜台解锁与默认值解耦**:天赋树的锻造工坊钥匙节点(见[天赋树](天赋树.md))点亮后本柜台开放、可购买;未点亮时柜台锁定、不存在任何购买途径;未点亮期间武器/甲默认值照常经参数面注入冒险,不存在「未解锁就读不到默认值」的窗口(2026-10-11 树侧钥匙裁)。
|
|
||||||
- **路线解锁双通道并联**:长枪、法杖、重甲、魔法护甲四条路线的解锁条件全部在本系统内部、与关卡进度零绑定;每条路线同时开两条互不影响的通道——练满前一档、或支付一次性解锁价直购——任一通道成立即解锁(4b/4b-1 裁)。
|
|
||||||
- **窗口内容**:营地四柜台并排呈现;本柜台分武器、护甲两区,各列三条路线行,行名=件名+锻造;出场行显示当前选中(武器+甲);满级特效无窗口入口、无文案(本期不做)。
|
|
||||||
- **单选注入与树零攻防**:攻击加值唯一来源=当前选中武器路线、AC 加值唯一来源=当前选中甲路线;0 级=未练合法态、零加值;天赋树淬炼对攻击与 AC 零贡献;开局注入按「账号层基础值+树淬炼 flat+锻造加值+局内加算区」分层可加,锻造加值只取当前选中(2026-10-11 所有权切分裁)。
|
|
||||||
- **切换语义**:营地内任意武器×甲组合切换免费、即时生效;换装不丢级不生效——旧选中等级保留、加值待命;一次冒险=一个武器类型+一个甲型;冒险开始后锁死、局内不存在任何换装途径(1a/1b/1c 裁)。
|
|
||||||
- **定价结构**:每级价格随已购级数几何递增(第 N+1 级价格 > 第 N 级价格,基价与公比读表单点);路线解锁价一次性收取;钥石不足时购买被拒、余额与等级零变化;GP 全程不可用于本柜台(5b 裁)。
|
|
||||||
- **存档闭合**:六条路线等级+当前武器/甲选中标记写入存档,读档恢复与写入前一致;存档域无特效域(6 裁连带)。
|
|
||||||
- **祝福件负断言**:局内商店购买攻击/护甲祝福后,本柜台路线等级与选中态零变化(8a 裁连带——货架行名带「攻击」「护甲」字样,属性祝福与锻造升级是两条互不相通的通道)。
|
|
||||||
- **甲型双轴可感**:切换甲型后基础 AC 与挨普通攻击的克制修正(轻甲 0/重甲 −1/魔法护甲 +1)双轴同时变化(3b 裁;现行敌方攻击全部按普通处理,断言条件当下即成立)。
|
|
||||||
@@ -0,0 +1,440 @@
|
|||||||
|
# UX Spec: 战斗屏(Battle Screen)
|
||||||
|
|
||||||
|
> **Status**: Complete(现行)
|
||||||
|
> **Author**: user + ux-designer
|
||||||
|
> **Last Updated**: 2026-10-29
|
||||||
|
> **Platform Target**: PC (Steam)——Keyboard/Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None(同 technical-preferences)
|
||||||
|
> **上游修订依赖**: 弃图刷新挖掘期受理已随布局决策 4 落稿上游(2026-09-12:行动经济 Active 受理 + 每轮上限 2 次、排雷玩法 Active·仅刷新路径装板、战斗结算的挖掘期刷新编排 + 恒同盘不变、系统索引的刷新规则同步——见 OQ11)
|
||||||
|
> **Template**: UX Spec
|
||||||
|
> **覆盖子屏**: 挖掘阶段主界面 · 轮末自动战斗结算(战斗结算明细屏) · 胜利/失败终局 · ~~结算明细回看~~(2026-10-04 P-C7 裁:冒险中回看退役归「生涯」——待办清单登记)
|
||||||
|
> **输入义务**: 排雷玩法×6 + 行动经济 + 战斗结算×3 + 敌人系统×4 + 增益状态×4 + 地图战斗资源×5(旧版 systems-index 门禁增补记录,缺项即 blocking——承接落点见 §13 义务对照表)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Purpose & Player Need
|
||||||
|
|
||||||
|
战斗屏是 Dungeon Sweeper 的核心玩法屏——游戏的全部 agency(排雷规划)都发生在这里。玩家在此屏完成完整轮次循环:**用本轮 AP 在扫雷图上挖掘/封印 → 主动停手或 AP 耗尽 → 观看轮末自动战斗结算逐行兑现 → 下一轮**。
|
||||||
|
|
||||||
|
一句话目的:**让"我算对了"的推理过程与它的战果兑现同屏可见、互为因果。**
|
||||||
|
|
||||||
|
- 扫雷图区承载 P1(推理掌控感):数字是主角,一切服务信息可读
|
||||||
|
- 战斗画面区承载 P2(规划的延迟兑现):扫雷之因逐行兑现为战果,全程可见可归因
|
||||||
|
- 角色信息区承载规划面:状态与资源常读,支撑"往未开区推进"类规划决策
|
||||||
|
|
||||||
|
若此屏缺失或难用:推理与兑现分裂(自动战斗沦为无聊过场——已登记创意风险)、逐行归因不可见(P2 失败)、AP/RAP 不可读(规划失去原料)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Player Context on Arrival
|
||||||
|
|
||||||
|
- **首次到达**:从关卡首节点(战×2 的第一战)进入。MVP 无引导流,chord 肌肉记忆提示等非模态提示承担首次教学(见 §States)
|
||||||
|
- **到达前刚在做**:关卡画面(独立屏)上点击战斗节点(关卡推进方受理);或上一场战斗胜利后返回关卡画面再选下一节点
|
||||||
|
- **情绪状态**:棋手式清明专注(art-bible §2.1,能量 2/10)——挖掘期画面必须无杂音;结算期转为清算爽感(7/10)
|
||||||
|
- **到达方式**:游戏推进送入(非自愿导航),进入即处于挖掘阶段(棋盘已 install、初始 3×3 已展开、小人出生)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Navigation Position
|
||||||
|
|
||||||
|
## Navigation Position
|
||||||
|
|
||||||
|
```
|
||||||
|
存档 → 冒险 → 关卡(关卡画面 = 节点图选路常驻枢纽) → 【战斗屏】
|
||||||
|
├─ 胜利 → 返回关卡画面选下一节点(落地奖励/恢复节点时开节点覆盖层确认 → 下一场战斗屏)
|
||||||
|
├─ 胜利(末节点 Boss)→ 关卡结算(关卡完成,spec:[level-clear.md](level-clear.md))→ 下关
|
||||||
|
└─ 失败 → 冒险落幕 → 返回存档/营地
|
||||||
|
```
|
||||||
|
|
||||||
|
战斗屏是**上下文相关屏**(仅由战斗节点进入),非顶层常驻。关卡内节点进度常驻关卡画面(独立屏的常驻枢纽形态,节点态即进度呈现:已过暗金、当前金、候选通道亮金、Boss 紫赤描边),战斗屏零进度承载——战斗结束返回关卡画面,玩家始终知道自己身处图中第几环。
|
||||||
|
|
||||||
|
- 上游屏:关卡画面(选路枢纽,屏级 spec:[level-map.md](level-map.md)——2026-09-27 建档;分支节点图形态,切片第一关为单链特例)
|
||||||
|
- 下游屏:关卡画面(选路枢纽,spec:[level-map.md](level-map.md))——战斗胜利后返回选路;落地奖励/恢复节点时由关卡画面域开节点覆盖层(恢复点全量服务、奖励点=三选一构筑点)确认兑付——节点奖励屏 spec 已出生:[node-reward.md](node-reward.md) v1.0(2026-09-29 迭代 7 T5 顺带出生,待办清单条目兑现;2026-09-27「不立独立 spec」拍板随之被取代)
|
||||||
|
- 下游屏:关卡结算([level-clear.md](level-clear.md),末节点 Boss 胜利——2026-09-27 建档)
|
||||||
|
- 平行屏:图例面板 overlay(本屏内域屏);~~结算明细回看 overlay~~(2026-10-04 P-C7 退役——冒险中回看归「生涯」)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Entry & Exit Points
|
||||||
|
|
||||||
|
**进入**:
|
||||||
|
|
||||||
|
| Entry Source | Trigger | Player carries this context |
|
||||||
|
|---|---|---|
|
||||||
|
| 关卡战斗节点 | 点击节点(关卡推进方受理本场遭遇) | 携带 HP(跨战斗延续)、RAP=0(战斗域新开) |
|
||||||
|
| 上一场战斗胜利 → 返回关卡画面 → 选下一节点 | 同上 | 同上 |
|
||||||
|
|
||||||
|
**离开**:
|
||||||
|
|
||||||
|
| Exit Destination | Trigger | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| 关卡画面(选路枢纽) | 敌方全灭(战斗结算判定段判胜)且非末节点 | 不可逆:战斗结束已发生,RAP 清零;落地奖励/恢复节点时开节点覆盖层确认(关卡画面域) |
|
||||||
|
| 关卡结算 | Boss 战胜利 → 关卡完成(spec:[level-clear.md](level-clear.md)) | 不可逆:~~关卡收束清库义务载体 = 秘宝背包~~(秘宝过渡形态〔关卡域库存/局内两步使用〕已随迭代 11 第①批退役——现行形态 = 营地同调装配、整局冒险生效,无关卡域清库面〔旧关卡域库存 treasure_inventory 为投放渠道全退役后恒空的机械惰性承载,拆线归实装批——见战斗结算「轮次生命周期」节注〕,见秘宝.md) |
|
||||||
|
| 冒险落幕 | 主角 HP=0(判负) | 不可逆:Roguelike 死亡重开(art-bible §2.5 温柔惋惜调性) |
|
||||||
|
| 无中途退出 | — | MVP 不设战斗内放弃/暂停菜单(回合制无时间压力;如需暂停留 Playtest 诊断按钮,调试用) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Layout Specification
|
||||||
|
|
||||||
|
### Information Hierarchy
|
||||||
|
|
||||||
|
本屏必须传达的全部信息,按注视优先级分五层:
|
||||||
|
|
||||||
|
1. **扫雷图本体**(第一注视点,挖掘期占视觉预算大头):两格态(已开格 / 未开格——排雷玩法×6② 一眼可辨)、数字、封印印记、小人、可挖域(8 向相邻常驻指示)、变异纹理
|
||||||
|
2. **本轮行动资源**:AP 余量(决定还能挖几格)、RAP 池(弃图刷新货币)、停手/弃图刷新按钮——紧贴棋盘上缘(动作发生地)
|
||||||
|
3. **战果兑现面**(结算期为第一注视点):敌人血条变化、逐行结算明细、高光(完美封印/封印标中)
|
||||||
|
4. **规划面**(边缘注视,常读):攻击值与修正来源(C 区数据框)、敌人意图徽标与顺位(B 区站桩);HP 与状态效果由单位本体(B 区站桩)唯一承载——数据框不重复展示
|
||||||
|
5. **进度语境**:轮次/阶段指示、图例入口(关卡节点进度常驻关卡画面,战斗屏不承载——见 Navigation Position)
|
||||||
|
|
||||||
|
依据:挖掘期玩家视线锚定棋盘(art-bible §2.1"视线始终被数字牵引");结算期视线转向战斗画面区(§2.2"兑现光带逐行横扫")。规划信息必须常读但禁止抢焦——这正是用户布局图三分下栏的合理性:**动作区居中,规划区两翼**。
|
||||||
|
|
||||||
|
### 信息归属原则与分区唯一展示面(2026-09-26 用户拍板)
|
||||||
|
|
||||||
|
每个区域准入一条信息的判据只有两条,缺一不进:
|
||||||
|
|
||||||
|
1. **循环口径原则**——战斗屏只展示**战斗小循环(单场战斗)内被消费、影响当下决策**的数据。中循环(关卡内跨战斗)与大循环(永久/营地)资源禁止入侵战斗屏:它们不改变战斗内任何决策,展示只产生噪音。
|
||||||
|
2. **单一展示面原则**——同一信息全屏只允许一个展示面。单位本体(站桩)已承载的信息(HP、立绘、状态效果),数据框不再重复展示;资源数字必须贴着它的唯一消费口(就近原则)。
|
||||||
|
|
||||||
|
按此两原则推导的分区信息归属树(每片叶子 = 该信息的唯一展示面):
|
||||||
|
|
||||||
|
- **B 区战斗画面**
|
||||||
|
- 主角站桩:立绘、HP 血条、状态效果小图标行 ← **HP 与状态的唯一展示面**(2026-09-26 拍板:C 区同信息展示退役)
|
||||||
|
- 敌人站桩 ×1–3:HP 血条、顺位徽标、状态小图标行、意图徽标、护甲类型图标(AC 数值不展示——2026-09-26 终裁)
|
||||||
|
- 兑现演出区 / 结算明细带 / 轮次·阶段指示
|
||||||
|
- **C 区角色信息(规划数据框)**
|
||||||
|
- 攻击值 + 修正来源角标(战斗在消费、且站桩上无展示)
|
||||||
|
- 护甲 AC(2026-09-26 二轮拍板补入——我方 AC 的唯一展示面;掷点判定轴,受击侧可读性)
|
||||||
|
- 秘宝槽(四槽壳在役、空槽占位——局内两步使用与关卡域库存随秘宝过渡形态退役〔迭代 11 第①批〕;现行秘宝 = 营地同调装配件,本区展示内容归装配面批次重接)
|
||||||
|
- 奇物列表(**已实装**——现行标题「特性」,迭代 9 卡⑫ 接线 + 迭代 12 呈现补齐;锻造/大奖励/关卡奖励节点获得的属性提升;与战斗内状态效果分区呈现,防「战斗结束被清」误读。**2026-10-12 奇物呈现修复批整改落地**:原逐流派聚合行退役改逐件行「件名 ×N」,零内部分类字样上屏——原待办清单「内部分类禁写入玩家可见面」条顺带完成移除)
|
||||||
|
- **D 区扫雷图 · AP 条**
|
||||||
|
- AP 点阵 + 停手按钮(现行)
|
||||||
|
- **RAP 读数(点阵+数字)**——自 C 区迁入,置于弃图刷新按钮旁(2026-09-26 拍板:RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮)
|
||||||
|
- **战斗屏不承载(迁出,2026-09-26 二轮拍板定去向)**
|
||||||
|
- GP(中循环资源——商店房消费):**关卡画面常驻总量** + **战斗总结结算(总量+增量)**(呈现 spec:[settlement-summary.md](settlement-summary.md) v1.0,2026-09-30)
|
||||||
|
- 钥石(大循环永久资源):**战斗总结结算(Boss/精英击杀增量行,迭代 10 起)+ 冒险总结结算(收束明细)+ 营地**(归位口径扩面见 [settlement-summary.md](settlement-summary.md) v1.1)
|
||||||
|
|
||||||
|
### Layout Zones
|
||||||
|
|
||||||
|
采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `info_panel_w` / `ap_bar_h` / `log_band_h_dig` / `log_band_h_settle`)。本节只写结构关系与内容职责,不复写数值;任何文档与代码不另立第二份布局值。
|
||||||
|
|
||||||
|
| 区 | 位置与几何 | 内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **B 战斗画面** | 全宽,高读 `stage_h`(2026-10-06 方案二拍板:演出 ≈1/3 屏) | 主角站桩立绘(左)+ 兑现演出区(中)+ 敌人站桩立绘 ×1–3(右)——**全站桩形态(2026-09-20 用户拍板,敌人卡形态待办裁决完成):主角与敌人均为无框立绘+底座,零卡片**;主角与敌人站桩 = **HP 与状态效果的唯一展示面(2026-09-26 信息归属拍板)**;底部结算明细带(挖掘期收起高读 `log_band_h_dig`,结算期展开高读 `log_band_h_settle`);顶部中央轮次·阶段指示 |
|
||||||
|
| **C 角色信息** | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 攻击值(含修正显示)、护甲 AC;秘宝槽、奇物列表(现行标题「特性」)——HP 条/RAP 池/状态效果槽/立绘占位/钱包行退役(2026-09-26 信息归属拍板:HP 与状态唯一展示面 = B 区站桩;RAP 迁 D 区 AP 条;GP/钥石迁出战斗屏) |
|
||||||
|
| **D 扫雷图** | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区(2026-10-06 方案二:底行压缩全部由面板空档吸收,**棋盘原尺寸不缩、格子不变**;原右下面板删除后横向加宽,吸收其宽度) | 顶部 AP 条(高读 `ap_bar_h`:左——AP 点阵 + 停手按钮;中——RAP 点阵+数字〔自 C 区迁入,贴弃图刷新按钮,2026-09-26 拍板〕;右——图例按钮 + 弃图刷新按钮〔雷图右上角,2026-09-12 拍板〕);棋盘主体(居中,格边长见下方「棋盘格尺寸公式」);toast 槽(上缘内侧) |
|
||||||
|
|
||||||
|
> 布局为 B/C/D 三区——关卡进度条不在战斗屏(节点链进度常驻关卡画面,见 Navigation Position;字母不重编沿用 B/C/D)。
|
||||||
|
|
||||||
|
> 呈现术语注记(2026-09-25):封印 = 正式动作名(全库统一;登记册术语与术语表 v1.13;印记 = 封印印记,art-bible §3.2)——机制与键名不变;封印特效未实装,占位 = 封印黑「封」字形(棋盘视图程序化占位,现行代码仍为旧「旗」字形、随代码术语批换代,贴图在位=字形退役;旗朱→封印紫 2026-09-26→封印黑 2026-09-28 用户拍板)。
|
||||||
|
|
||||||
|
> 可挖域微光画法定稿(2026-09-25 用户拍板):**接触带·空间侧 + 蓝族**——光画英雄格周界接触面(正交邻墙=整边,斜向邻墙=角点+两半边),详见 art-bible §3.2;现行墙格整框绿相呼吸为待退役占位,实现切换归表现批(探针断言顺带)。
|
||||||
|
|
||||||
|
**布局决策 1(本 spec 最大决策,用户拍板)**:**常驻双舞台分屏**——战斗画面与扫雷图同屏常驻,挖掘期敌人待机可见,结算期不切场景。
|
||||||
|
- 备选(已否决):Peglin 式"结算时才切入独立战斗场景"——切换打断推理心流,且资产管线成本翻倍
|
||||||
|
- **对战斗表现双舞台陷阱的输入**:game-concept 登记的"战斗发生在棋盘上还是独立场景"悬念,由本布局裁决为**第三形态:同屏双舞台**。战斗表现定稿前的"战斗表现美术测试"(一屏样张)应按此布局出样
|
||||||
|
- 敌人不占格(敌人系统已锁)与本布局自洽:敌人实体只存在于 B 区,棋盘永远只有数字/封印印记/小人/变异
|
||||||
|
|
||||||
|
**棋盘格尺寸公式**(本节是格边长口径的唯一出处;其他文档只写规则与指针,不复制算例):
|
||||||
|
|
||||||
|
```
|
||||||
|
格边长 = clampi( floor((min(棋盘区宽 − 12 − 悬崖厚度, 棋盘区高 − 24 − 悬崖厚度) − (N−1) × 格间距) / N), 26, 46 )
|
||||||
|
```
|
||||||
|
|
||||||
|
- N = 棋盘长宽两边的较大者;格间距 2px;垂直预留 24px(上 12 / 下 12);悬崖厚度 8px;结构钳制区间 [26, 46]px。
|
||||||
|
- 可读下限 30px——与结构钳制分开:钳制管算式不越界,下限管玩家能否看清。
|
||||||
|
- N 的取值与每关板型的对应关系读[棋盘生成](../systems/排雷循环/棋盘生成.md),现行值的事实源是 `data/tables/board_gen.tres`。
|
||||||
|
- 数字字号 = max(18, ceil(格边长 × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰)。
|
||||||
|
|
||||||
|
算例不入文档:棋盘区可用面积随布局表与板型变化,不是契约值——现算并绘在整屏样张上,本文件不复写。
|
||||||
|
|
||||||
|
### Component Inventory
|
||||||
|
|
||||||
|
| 区 | 组件 | 类型 | 内容 | 交互 | 载体 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| B | 主角站桩立绘 | 站桩(无框立绘+落影) | HP 条落底盘(2026-10-06 方案二拍板:站桩排式 = **立绘→血条→状态**,全场血条对齐一线;血条嵌石板位、台缘线留作地面线;原「悬浮头顶」退役——高盒下血条-立绘空洞,用户点名否决)、状态效果小图标一排挂血条正下方(形状+色相双通道、层数角标;空态不占位退化为空行)——**HP 与状态效果的唯一展示面(2026-09-26 信息归属拍板,原 C 区状态槽职责〔悬停 tooltip 来源+语义+剩余结算次数〕并入本组件)**;攻击值等规划数据仍归 C 区数据框(2026-09-20 全站桩拍板,英雄卡退役) | 悬停状态小图标看 tooltip | HUD 视图拆分改造 |
|
||||||
|
| B | 敌人站桩立绘 ×1–3 | 站桩(无框立绘+落影) | 血条+顺位徽标落底盘(同主角排式,2026-10-06 方案二;**大体档〔显示 >150px 级:drider/duergar_king〕允许向上溢出盒顶 N px(N 由实装批 C0 实算,与背景/光柱无关——现行溢出区为临时光柱氛围层,正式舞台背景插画到位后该层退役,判定不变),血条仍落底**)、状态小图标挂血条正下方(敌方 side-wide 增益各立绘同值呈现——蓄力/硬化/削弱/暴走/警觉;伏击层数通道随 2026-09-20 八型批退役——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图占位 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,**意图徽标悬浮头顶上方,探顶档压胸**,敌方增益〔蓄力/硬化〕入状态图标行);死亡灰化加碎裂退场直接演在立绘上(2026-09-20 全站桩拍板,敌人卡退役);血条下名字行 = 纯名字 + 护甲类型图标(形状+色相双通道,与状态图标同行共存,状态空时为纯名字;原「底座下」随石板退位改落底排),AC 数值不展示——2026-09-26 终裁(用户口径:HP 信息已足够,攻防数值不直接写上;护甲类型图标保留克制对策可读性——类型可读、数值隐藏) | 只读 | 新建 |
|
||||||
|
| B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 |
|
||||||
|
| B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay(2026-10-04 P-C7 退役——带保留单行摘要,回看归「生涯」) | 改造 |
|
||||||
|
| B | ~~结算明细回看~~(已退役) | —— | 2026-10-04 P-C7 裁:冒险中回看退役归「生涯」——回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 |
|
||||||
|
| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;原「HP/攻击/RAP 显示」——HP 与 RAP 随信息归属拍板迁出本组件) | 只读 | HUD 视图拆分 |
|
||||||
|
| C | 秘宝槽 | 图标槽 ×4 | 四槽壳在役、空槽占位(标题「秘宝」,悬停「秘宝槽(空)」);局内两步使用与关卡域库存随秘宝过渡形态退役——现行秘宝 = 营地同调装配件(秘宝.md),本区展示重接归装配面批次 | 悬停 tooltip | 已实装 |
|
||||||
|
| C | 奇物列表(现行标题「特性」) | 列表/图标行 | 已实装(迭代 9 卡⑫ 接线、迭代 12 呈现补齐;2026-10-12 呈现修复批整改——逐件行「件名 ×N」,零内部分类字样);锻造/大奖励/关卡奖励节点获得的属性提升——中循环数据,因改变战斗数学且无其他展示面准入战斗屏;与战斗内状态效果(B 区站桩)分区,防「战斗结束被清」误读 | 只读 | 已实装 |
|
||||||
|
| D | AP 条 | 点阵 + 按钮组 | 本轮 AP 点阵、停手按钮(左)、**RAP 点阵+数字(自 C 区迁入 2026-09-26——RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮;RAP 清零可见反馈〔行动经济〕载体随迁)**、弃图刷新按钮(右端·雷图右上角;RAP−8 · 本轮剩 N 次——上限 2 次已随行动经济 2026-09-12 修订生效) | 点击提交意图 | HUD 视图拆分 |
|
||||||
|
| D | 棋盘视图 | 网格 | 棋盘全部格态 + 小人 + 封印印记 + 变异纹带 + 奖励身份 icon(已开格;绘制优先级 数字>小人>封印印记>奖励徽章>变异纹带>底色——徽章不进数字区,样张验收项) | 左/右键意图提交 | ✅ 已实装 |
|
||||||
|
| D | 悬停预承诺光标 | 光标态 | 移动/挖/封印三语义光标 + 目标格边框高亮 | 自动 | 新建(排雷玩法×6③) |
|
||||||
|
| D | 可挖域指示 | 常驻微高亮 | 小人 8 向相邻可操作格 | 自动 | 新建(排雷玩法×6③) |
|
||||||
|
| D | 移动路径预览 | 路径高亮 | 悬停已开格显示 BFS 路径(合法性指示) | 自动 | 新建(排雷玩法×6⑤,裁决见下) |
|
||||||
|
| D | toast 槽 | 非模态提示 | 拒绝原因(双源)、voided、满层溢出、chord 提示、零合法板告知 | 自动消退 2.5s | 新建 |
|
||||||
|
| D | 图例按钮 + 面板 | 按钮+模态 overlay | 格态/变异语义图例 | 开/关 | 新建 |
|
||||||
|
| 全屏 | 胜利/失败 overlay | 模态 | 金蜡封/暮蓝收印 + 判定行(明细回看入口已随 P-C7 退役——回看归「生涯」) | 继续/下一节点 | 已实装 |
|
||||||
|
| 调试 | 调试浮窗 | 调试面板 | 种子/数值调整/批量模拟/两层调试入口(发布态恒隐,无 UI 开启口——写死行已随迭代 38 卡⑦ 删除,调试开关门控口径见「调试变体」行;调参面板已随迭代 15 卡①吸收退役) | 调试 | 调试浮窗 |
|
||||||
|
|
||||||
|
**布局决策 2 —(已删除,编号留空)**:原「窗口形态 = 右栏原位激活」决策随可选类道具整体下线(2026-09-15 格面资源批)。编号留空,免布局决策 3/4 的既有交叉引用失锚。
|
||||||
|
|
||||||
|
**布局决策 3 — 移动路径预览 = 合法性指示**(排雷玩法×6⑤ 悬案裁决):悬停已开格时高亮 BFS 路径(小人蓝细线点迹),移动执行为 ≤150ms 短滑。
|
||||||
|
- 备选(登记不采纳):穿行动画轨道——移动免费高频,动画时间税违反 P4 点击摩擦护栏(每轮输入动作:AP ≤2 的观测假设);正式版若 playtest 反馈"移动太瞬"再议(留痕)
|
||||||
|
|
||||||
|
**布局决策 4 — 弃图刷新 = 挖掘期当场换图(2026-09-12 用户拍板,同日落稿上游)**:按钮置 AP 条右端(雷图右上角)。点击即当轮就地换新图继续挖——AP 不重置、剩余 AP 保留,RAP−8,本轮上限 2 次。
|
||||||
|
- **上游修订(2026-09-12 已落稿,OQ11)**:① 行动经济 Active 相位受理刷新意图 + 每轮上限 2 次(Waiting 代理退役)② 排雷玩法装板受理域增 Active·仅刷新路径 ③ 编排 owner = **战斗结算的挖掘期刷新编排**(行动经济扣费 → 排雷玩法退役旧板 → 棋盘生成出新图 → 排雷玩法装板 → 地图战斗资源摇奖励恰一次;无结算段、无轮次结束——战斗结算编排唯一性原则保持)④ 旧板封印印记随旧板**作废**(零兑付、封印 AP 不返还——排雷玩法 EC11 全量重置承载;确认微交互须显式提示)。**经济预警**:当场刷新无结算发生,原「敌方时间税」自惩失效——行动经济 OQ3 弃图率/刷新率预警阈值联动复核。
|
||||||
|
- 备选(已否决):结算期决策提示(Waiting 内联)——结算期不做刷新决策(用户拍板);挖掘期预承诺 stop+reroll 复合——决策即终轮,不符「换图继续挖」语义。
|
||||||
|
|
||||||
|
**敌人意图线索映射目录(敌人系统×4① 成文占位,2026-09-12;2026-09-16 敌人技能池批改型注记:行为环三态〔攻击/蓄力/重击〕预告随行为环退役——现行数据面 = 敌人系统三档可见性规格〔普攻零表示 / 特殊技类型级动画〔攻击系/增益系两型〕/ 暴击掷点层无前置〕,池与权重不公开;下表 grub/ambusher 三态清单留档作废,终稿资产目录随战斗表现样张批重立;**命名双轨完成注记 2026-10-06**:grub/ambusher 两键本身已随敌人系统八型批退役——现行键集 = 八敌登记表〔goblin/bugbear/ogre_chief/giant_spider/drider/duergar/hook_horror/duergar_king〕,本表键名仅为历史留痕、禁止作为现行敌种 id 引用)**:
|
||||||
|
|
||||||
|
| enemy_id | 视觉状态(意图线索) | 强度档位编码 | 环长编码 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| grub(蛆虫) | 攻击 ×1 态 | 小体量墩形 = 轻击 | 环点 1 |
|
||||||
|
| ambusher(伏击者) | 攻击 / 蓄力 / 重击 ×3 态 | 垂直延伸体量 = 重击(heavy_multiplier) | 环点 = 拍数 |
|
||||||
|
|
||||||
|
- 预告时序 = **下一拍预告**(当前拍视觉状态),挖掘期全程可见;结算期不另设意图播片(敌人系统 Rule 8⑤)
|
||||||
|
- 映射键 = enemy_id,跨 run 恒定、禁止重掷(敌人系统 Rule 8③);形状 + 色相双通道(art-bible 约束)
|
||||||
|
- 资产定稿归战斗表现;本表为 HUD框架侧成文占位(敌人系统 Visual Req 2 口径:grub 1 态 / ambusher 3 态)
|
||||||
|
|
||||||
|
### ASCII Wireframe
|
||||||
|
|
||||||
|
> **2026-09-26 信息归属拍板**:C 区 HP/RAP/状态槽/立绘占位/钱包行退役——HP 与状态唯一展示面 = B 区站桩,RAP 迁 D 区 AP 条贴弃图刷新按钮,GP/钥石迁出战斗屏;C 区改攻击数据框+两预留区。下方线框图已随拍板重绘;旧线框留档于 git 历史。
|
||||||
|
> **2026-09-23 停点前移批**:A 区关卡进度条退役,下方线框图为 B/C/D 三区(纵向空间划归 C/D 底行;关卡内节点进度常驻关卡画面,战斗屏零进度承载);旧四区线框留档于 git 历史。
|
||||||
|
> **几何标注已撤**:线框只示意结构,各区几何读 `game/data/tables/battle_layout.tres`,图中不标像素值。
|
||||||
|
> **2026-09-20 全站桩形态改版**:敌人卡形态裁决完成(卡片式退役、主角与敌人均站桩——无框立绘+底座、状态小图标挂血条下),下方线框图 B 区已随裁决重绘;旧卡片式线框留档于 git 历史。
|
||||||
|
|
||||||
|
```
|
||||||
|
1280 × 800 ────────────────────────────────────────────────────────────────────
|
||||||
|
┌─[B] 战斗画面(高读布局表) ──────────────────────────────────────────────────┐
|
||||||
|
│ /小人\ 第 3 轮 · 挖掘中 伏×2 伏×2 │
|
||||||
|
│ (落影) [ 兑现演出区 ] /蛆虫\ /蛆虫\ │
|
||||||
|
│ HP▓▓▓▓░ (结算期: 光带→弹道→受击) ①HP▓▓▓░ ②HP▓▓░░ │
|
||||||
|
│ ⬆2 🛡1 ←血条状态落底排·全场对齐(状态空 = 名字行)〔意图徽标悬浮头顶上方〕 │
|
||||||
|
│ ├─ 结算明细带 ────────────────────────────────────────────────────────────┤ │
|
||||||
|
│ │ ▸上轮: 主角攻击3→蛆虫-3 | 攻击+50%(1结算) | 警觉+1×2 … [展开明细▾] │ │ # 2026-09-17 数值压缩批:UI 示意文本同步(atk 7→3〔地精格数÷3 + L1 锚行;UX 示意按当前地精行值读〕、伏击 +3 → +1/层,幅度参考 data/tables/)
|
||||||
|
│ └────────────────────────────────────────────────────────────────────────┘ │
|
||||||
|
├─[C] 角色信息 ─────────┬─[D] 扫雷图 ───────────────────────────────────────────┤
|
||||||
|
│ ┌──────────────────┐ │ ┌─────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 攻击 6 (+50%) │ │ │ AP ●●●●●○○○ 5/8 RAP ▓▓▓░ 3/8 │ │
|
||||||
|
│ │ 护甲 AC 12 │ │ │ [⏹停手] [?图例] [↻刷新 8|剩2] │ │
|
||||||
|
│ ├──────────────────┤ │ │ ┌─toast────────────┐ │ │
|
||||||
|
│ │ 秘宝槽(预留) │ │ │ │AP不足·剩0点 │ 12 12 1 ░ 2 ▓▓ ▓▓ │ │
|
||||||
|
│ │ ◇ ◇ ◇ ◇ │ │ │ └──────────────────┘ 12 █ 1 1 2 ▓▓ ▓▓ │ │
|
||||||
|
│ ├──────────────────┤ │ │ 1 2 2 🚩 █ 2 1 1 ▓▓ 👫 1 1 ░ │ │
|
||||||
|
│ │ 奇物列表(预留) │ │ │ ░ 1 ▓▓ 👫 1 1 ░ ▓▓ 1 1 ░ ░ 2 │ │
|
||||||
|
│ │ 锻造+2攻 │ │ │ ▓▓ 1 1 ░ ░ 2 ▓▓ │ │
|
||||||
|
│ │ (空态=隐藏) │ │ │ ( █=可挖域微光 👫=小人) │ │
|
||||||
|
│ └──────────────────┘ │ └─────────────────────────────────────────────────┘ │
|
||||||
|
└───────────────────────┴──────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## States & Variants
|
||||||
|
|
||||||
|
| State / Variant | Trigger | What Changes |
|
||||||
|
|---|---|---|
|
||||||
|
| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 Active 相位 | B 区敌人待机(意图徽标全程可见——敌人系统 Rule 8⑤),D 区棋盘可交互,AP 条点亮;能量 2/10,唯悬停呼吸微光在动(§2.1) |
|
||||||
|
| **结算阶段** | round_end 触发(AP 尽/停手/清图) | D 区锁输入(棋盘去饱和 + 金橙色相偏移,明度不变,数字保持全对比);B 区播放五段编排演出(授予段 → 增益/减益段 → 战斗段 → 衰减段 → 判定段,战斗结算 段序冻结);明细带按结算期档展开(高读 `log_band_h_settle`)逐行滚动;阶段指示→"结算中";能量 7/10 |
|
||||||
|
| **清图瞬间** | 全部安全格开完 | 金粒喷泉 + 彩纸 3–5s 即收(§2.3);清图奖励行强调呈现(H2,地图战斗资源×④——金框高亮行);随后换新图 install |
|
||||||
|
| **完美封印高光** | 战斗结算高光判定(全图标中/零误标类) | 全屏喝彩级反馈(§2.2 最高档):金光带加倍扫射 + 「完美封印 ×2」横幅——P2 爆发兑现节点(创意风险 #2 落点) |
|
||||||
|
| **封印标中高光** | 封印判定·标中 | 该印记化暴击弹道加重 + 明细行金框——chord 缺席的即时兑现补偿(创意风险 #3 落点) |
|
||||||
|
| **敌人死亡呈现** | 敌 hp=0(流水行击杀标记) | 该敌人立绘血条归零 → 立绘灰化 + 碎裂退场(**禁瞬消**——敌人系统资产下限「死亡瞬间须可辨识、禁止直接消失」,同等 blocking);战斗段短路的重击被掐灭不产行动明细行,由行序可推断(战斗结算);动画密度归战斗表现,呈现语义在本 spec |
|
||||||
|
| **胜利终局** | 判定胜利 | 金蜡封落于**扫雷图区中央**(§2.4 字面锚定),全屏暖白金 overlay;判定行 + 「下一节点」;明细回看入口;状态图标行全清可见反馈(增益状态×4④——B 区主角站桩图标逐枚化光收回 + 微文案「状态随战斗结束消散」,防「我的增益哪去了」误读) |
|
||||||
|
| **失败终局** | 判定失败(主角生命归零,战斗段短路) | 明度不变的暮蓝 #5A6C8C 氛围 overlay(全作唯一暮蓝档);小人坐砖掸灰、落下的封印印记逐枚化光点收回(§2.5);判定行 +「返回」(明细回看已随 P-C7 退役——回看归「生涯」);状态图标行全清可见反馈(增益状态×4④,同胜利) |
|
||||||
|
| **Boss 遭遇变体** | encounter=boss(遗迹守卫) | 战斗开始一次性演出:紫赤 #8F2F6A 影子爬过棋盘(§2.6);敌人立绘体量最大+锐角剪影;阶段指示附 Boss 名 |
|
||||||
|
| **空态:无状态效果** | 增益状态 EC12 | 状态小图标行隐藏(B 区主角站桩血条下图标行零图标时不占位;落底排〔2026-10-06 方案二〕后该行退化为名字行——主角无名字行则整行空置);原「C 区状态槽隐藏、HP/攻击/RAP 上移补位」裁决随 C 区槽退役(2026-09-26 信息归属拍板)作废;图例面板载空态说明(增益状态×① 成文项) |
|
||||||
|
| **调试变体** | 测试模式 | 调试浮窗入口发布态恒隐(调试入口开关为写死行、已删,无 UI 开启口;开发期临时启用=本地改该字段缺省、不提交——调参面板已随迭代 15 卡①退役);Playtest 诊断按钮(卡死转储) |
|
||||||
|
|
||||||
|
**拒绝/作废子态**(排雷玩法×6⑥、行动经济双源——每次拒绝玩家可感知):
|
||||||
|
- 棋盘面拒绝(细分原因:非相邻/挖封印格等)→ 目标格 危险红 #A8321F 边框闪 + toast 文案(拒绝语义红族——旗朱已退役归封印色〔现行封印黑〕)(图标+文案冗余,色弱清单 #7)
|
||||||
|
- 资源面拒绝(AP 不足/RAP 不足)→ AP/RAP 数字脉冲 + toast「AP 不足 · 剩 0 点」
|
||||||
|
- voided(stop 被作废等)→ toast「本轮已清图,停手未执行 · 剩余 AP 已作废」——防静默改判读感欺骗
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Interaction Map
|
||||||
|
|
||||||
|
**输入前提**(technical-preferences):Keyboard/Mouse 主输入,全部操作纯鼠标可完成;Gamepad Partial 非 MVP 门禁(导航序留 Open Questions);Touch None。
|
||||||
|
|
||||||
|
| 组件 | 动作 | 输入 | 即时反馈 | 结果(经组合根) |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 未开相邻格 | 挖掘 | 左键 | 格碎裂 + 连锁展开(免费)+ 奖励身份揭显 | 意图入当帧批次 → 排雷玩法的意图批次提交 |
|
||||||
|
| 已开格 | 移动 | 左键 | 悬停时路径预览高亮(布局决策 3);执行 ≤150ms 短滑 | 意图入批(BFS 移动,免费) |
|
||||||
|
| 未开格 | 封印 | 右键 | 封印印记落下(封印黑) | 意图入批(1 AP / 免费;已封印格右键无操作——封印印记无移除手段,封印不可逆批 2026-09-19) |
|
||||||
|
| 停手按钮 | 主动结束轮次 | 左键 | 按钮下压 + AP→RAP 飞行数字 | 停手随当帧意图批次提交(**经排雷玩法批次,不直调行动经济**——单意图帧批次契约) |
|
||||||
|
| 弃图刷新按钮(雷图右上角) | 当轮就地换图继续挖 | 左键 | 确认微交互(RAP−8 代价显式 + 旧板弃置提示);RAP<8 → 资源面拒绝可见(行动经济 EC13) | 刷新意图提交(**Active 相位当场换图继续挖**——AP 不重置、本轮剩 N 次扣减;**上游已修订受理——见布局决策 4/OQ11**) |
|
||||||
|
| 图例按钮 | 开图例 | 左键 | 模态 overlay | 恒可开(图例条目恒在) |
|
||||||
|
| 结算明细带 | ~~展开回看~~(已随 P-C7 退役——带保留单行摘要,回看归「生涯」) | —— | —— | —— |
|
||||||
|
| 状态小图标(B 区站桩) | 悬停 | hover | 状态 tooltip(来源+语义+剩余结算次数) | 只读 |
|
||||||
|
| 胜利 overlay | 下一节点 | 左键 | → 关卡画面(选路枢纽)/ 关卡结算(末节点) | 关卡推进方推进 |
|
||||||
|
| 失败 overlay | 返回 | 左键 | → 存档/营地 | 冒险落幕 |
|
||||||
|
|
||||||
|
**单意图帧纪律**(排雷玩法×6⑥):一帧内 collected 意图整批提交,stop 点击终结当帧收集;F4 语义序仲裁为防御性兜底。悬停预承诺三态光标:移动(箭头)/挖(镐)/封印(印记形)——左键双义(移动 vs 挖)的消歧完全依赖格态一瞥可辨 + 光标区分(误挖不可逆的感知保险)。
|
||||||
|
|
||||||
|
**复合意图(排雷玩法评估项留痕)**:点击远格 = 自动 move+dig 的两击摩擦消解——**MVP 不做**(留痕 2026-09-12:免费移动高频,两击摩擦符合 P4 ≤2 观测假设;排雷玩法 L298 评估项)。
|
||||||
|
|
||||||
|
**可挖域常驻指示**:小人 8 向相邻未开格呼吸微光(§2.1 唯一在动的元素);不可挖域(非相邻)悬停显示禁止光标 + 首次 toast 提示「需先走近(点击已开格移动,免费)」。
|
||||||
|
|
||||||
|
**chord 肌肉记忆首遇提示**(排雷玩法×6③):经典扫雷玩家首日尝试双击快开时,非模态 toast 每 run 一次:「本作无双击快开——封印后轮末自动判定标中;点数字格可移动小人」(含排雷玩法登记锚点「点击数字格 = 移动小人」)。文案定稿权归实现期文案 pass。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Events Fired
|
||||||
|
|
||||||
|
项目无分析系统;本节 = **呈现层订阅的核心信号**(组合根直连信号)+ 逐局遥测义务(逐局遥测日志已有五类行)。呈现层新遥测(写入逐局遥测的呈现层行):
|
||||||
|
|
||||||
|
| 事件(中文名) | 采集内容 | 载荷 / 数据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 每轮结束 · 轮次输入比遥测 | 原始输入动作数∶AP 消耗(行动经济 P4 ≤2 护栏观测,排雷玩法遥测义务) | —— |
|
||||||
|
| 停手/清图 · 轮次出口遥测 | 弃图率(难度曲线与Boss OQ4)观测;出口路径对齐上游封闭枚举 | 出口路径标签 {停手 / AP 耗尽 / 清图} |
|
||||||
|
| 弃图刷新(挖掘期,非轮出口) · 刷新尝试遥测 | 刷新使用(难度曲线与Boss OQ6)与行动经济 OQ3 预警阈值观测;每轮 0–2 次(布局决策 4 cap=2) | {受理结果: 受理 / 拒因 RAP 不足 / 拒因触上限, 本轮第几次刷新: 1..2} |
|
||||||
|
| 拒绝/voided · 拒绝遥测 | 拒绝来源(板面/资源/相位三源)与细分原因 | {拒绝来源: 板面/资源/相位, 细分原因} |
|
||||||
|
| 提示触发/关闭 · 提示展示遥测 | 提示类型 | {提示类型: chord 提示 / 无相邻可挖格} |
|
||||||
|
| 呈现订阅(不改核心) | 排雷玩法三事件 / [战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行协议,含终局判定行) / 战斗结束 / 关卡完成 | 载荷 schema 成文义务见 §Data Requirements——旧版状态记录 entry 17①(HUD框架硬性要求) |
|
||||||
|
|
||||||
|
**持久状态写入**全部经组合根唯一路径(意图批次提交 / 刷新意图提交 / 关卡推进)——UI 层禁直调核心写(架构七原则"依赖单向组合根")。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Transitions & Animations
|
||||||
|
|
||||||
|
| 时刻 | 过渡 | 依据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 进入战斗屏 | 棋盘 install 淡入(200ms)+ 初始 3×3 展开涟漪 + Boss 战先播紫赤影子爬棋盘(§2.6) | 棋盘生成 install / §2.6 |
|
||||||
|
| 挖掘→结算 | 明细带自底展开(150ms)+ 棋盘去饱和 + 金橙色相偏移 + 阶段指示翻转 | §2.2 色彩转金橙主导、饱和拉高、明度不变(状态区分经饱和/色相——art-bible §2 合规化 2026-09-12) |
|
||||||
|
| 结算逐行兑现 | 光带自棋盘行起点横扫 → 开格化箭雨/印记化暴击弹道飞向敌人立绘 → 受击闪白 + 血条直角递减 | §2.2 承载元素;因果全程可见可归因(P2) |
|
||||||
|
| 清图换新图 | 金粒喷泉 3–5s → 旧图碎裂淡出 → 新图 install 淡入 | §2.3 短促丰收不拖节奏 |
|
||||||
|
| RAP 清零(战斗结束) | RAP 数字滚动归零(D 区 AP 条)+ 「随战斗结束消散」微文案 | 行动经济可见反馈义务 |
|
||||||
|
| 敌人死亡 | 血条直角递减至零 → 卡体灰化 + 碎裂退场(禁瞬消) | 敌人系统资产下限(同等 blocking);动画密度归战斗表现 |
|
||||||
|
| 状态图标行全清(战斗结束) | 状态逐枚化光收回(B 区站桩图标行)+ 「状态随战斗结束消散」微文案 | 增益状态×4④;RAP 清零同款先例 |
|
||||||
|
| ~~关卡收束清库~~ | 义务随秘宝过渡形态退役消解——现行形态 = 营地同调装配、整局冒险生效,无关卡域清库面(秘宝.md) | —— |
|
||||||
|
| 胜利 | 蜡封自上落下弹跳定格 → 碎砖拼纹章 → overlay 暖金渐显 | §2.4 克制不狂欢 |
|
||||||
|
| 失败 | 全屏明度不变转暮蓝色相 → 印记化光点 800ms 逐枚收回 → overlay | §2.5 最静一拍 |
|
||||||
|
| 减动效选项 | 上述全部动画提供时长减半/直接跳终态开关(基线权威 = HUD框架「可访问性基线」节;开关承载 = 设置面(迭代 8 卡④已转正)——2026-09-27 拍板不另立无障碍专项文档) | 动议:结算逐行兑现为信息载体不可整体跳过,可加速 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Data Requirements
|
||||||
|
|
||||||
|
| Data | Source System | Read / Write | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 棋盘格态/数字/可挖域 | 排雷玩法 只读查询面 | Read | 呈现刷新面 = 排雷玩法 三事件信号(载荷 schema 成文——旧版状态记录 entry 17①) |
|
||||||
|
| BFS 移动路径 | 排雷玩法 路径规划只读面 | Read | 布局决策 3 合法性指示消费 |
|
||||||
|
| 拒绝原因 | 排雷玩法 细分原因封闭枚举 + 行动经济 资源面 | Read | 三源(板面/资源/相位)映射文案——呈现层契约成文;资源面原因无上游载荷(行动经济仅回受理与否,细分原因仅调试诊断可见),客户端按动作上下文推断 |
|
||||||
|
| AP / RAP / 本轮刷新计数 | 行动经济 | Read | 常显;刷新入口可用性 = RAP 读数客户端预判(RAP≥8)+ 刷新意图提交的受理回执(行动经济 无刷新可用性预查询——仅受理与否的回执 + 只读观测量;行动经济 EC13 拒绝合法可见) |
|
||||||
|
| 结算流水行(9 类封闭协议) | [战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 流水协议 | Read | 逐行来源标注(P2);未生效类行(奖励未生效)聚合计数呈现 |
|
||||||
|
| 判定胜负 | 战斗结算 判定段 | Read | 终局画面数据锚 |
|
||||||
|
| 敌单位 生命/顺位/摇定动作(技能标识·类型·名称)/敌方增益/敌单位标识/存活 | 敌人系统 只读面(经战斗结算呈现快照) | Read | 意图线索映射全局恒定(敌人系统×4②,技能池批三档口径);**销毁前捕获**(旧版状态记录 entry 17③——缺陷②教训) |
|
||||||
|
| 状态效果投影(含空态/极性/溢出) | 增益状态 投影口径 | Read | 极性映射数据源 = 战斗结算效果表语义,非幅度符号(增益状态×③) |
|
||||||
|
| 已开格奖励身份(奖励徽章) | 地图战斗资源 身份解析只读回调(经棋盘视图,组合根注入) | Read | 已开格身份常读——挖掘期 Active 相位内有效;reward_id 全局恒定、禁止重掷;徽章绘制优先级见 §Component Inventory 棋盘视图行 |
|
||||||
|
| 节点图/当前节点/HP 携带 | 关卡节点地图轻量读面 · 关卡推进方 | Read | 关卡画面(独立屏)节点态呈现(战斗屏零进度承载) |
|
||||||
|
| 意图提交 | 排雷玩法 | **Write** | 意图批次提交(stop 亦经此——不直调行动经济) |
|
||||||
|
| 弃图刷新 | 行动经济 | **Write** | 刷新意图提交(挖掘期 Active 当场受理——布局决策 4 2026-09-12 上游已落稿;战斗结算的挖掘期刷新编排承载) |
|
||||||
|
| 节点推进 | 关卡推进方 | **Write** | 胜利 overlay「下一节点」 |
|
||||||
|
| 终局画面数据锚 | 战斗结算 判定行(流水行协议) | Read | 「终局判定行 = 胜负画面的数据锚」(战斗结算 UI Requirements);销毁前状态可见性纪律 = 旧版状态记录 entry 17③(销毁前捕获、**载荷数据自包含**、禁呈现层回读核心生命周期状态);若需独立终局快照信号,须回战斗结算 GDD 修订补登记(战斗结算 现无结算快照契约——2026-09-12 评审修正) |
|
||||||
|
|
||||||
|
**架构注记**:UI 不拥有任何游戏状态——全部读经核心只读面,全部写经组合根。呈现层信号载荷 schema 须在《HUD框架》成文(旧版状态记录 entry 17①,缺项即 blocking);场景级 headless 测试进 AC(entry 17②);覆盖层层级断言(缺陷⑤——任何模态覆盖层必须有"打开时遮挡物隐藏"断言)。
|
||||||
|
|
||||||
|
**更新触发注记(2026-09-12 评审增补——防实现层等待不存在的信号,旧版状态记录 entry 17 教训同类)**:封印与移动成功反馈**零事件外发**(排雷玩法发射面封闭)——经意图调用的返回值命令式驱动;AP/RAP 读数:行动经济无推送信号——组合根每次调用返回后重查;状态效果:增益状态为纯被动状态池、零信号——状态栏刷新绑战斗结算的编排完成时点;奖励徽章:地图战斗资源 身份解析经只读回调(组合根注入棋盘视图),已开格揭显时查询——写路径回执后重查。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Accessibility
|
||||||
|
|
||||||
|
无障碍基线权威 = [HUD框架](../systems/表现与支撑/HUD框架.md)「可访问性基线」节;不再另立专项文档(2026-09-27 欠账处置拍板,见 OQ2)。本 spec 内建基线承诺(呈现侧落地):
|
||||||
|
|
||||||
|
- **对比**:全部格底/面板底对数字墨 ≥4.5:1(WCAG AA)——art-bible §4.1 硬指标已可测(#33261B/#C9AF83 = 6.9:1 实测);UI 数据一律墨族素面
|
||||||
|
- **色弱冗余**:无任何信息仅靠色相承载——格态靠完整/碎裂形;奖励金 vs 危险红靠剪影+运动;UI 红/金强调对加图标+文案冗余;Boss 靠形状独占(art-bible §4.5 清单逐项成立)
|
||||||
|
- **灰度可辨**:变异格纹带、格态在灰度截图下可分类(art-bible §3.2 验收标准)
|
||||||
|
- **非色彩破坏性确认**:弃图刷新(消耗 RAP 8 点)的确认交互与常规确认**不同位**(位置通道,色弱清单 #7)
|
||||||
|
- **字号下限**:棋盘数字 ≥18px、明细带正文 ≥14px、tooltip ≥13px(1280×800 基座)
|
||||||
|
- **运动**:无闪烁 >3次/秒;结算光带为方向性扫动非频闪;提供减动效选项(§Transitions)
|
||||||
|
- **键盘/Gamepad**:MVP 纯鼠标可完成全部操作(technical-preferences 平台注记);**MVP 决策留痕:纯键盘导航/焦点序不做**(2026-09-12——回合制点击驱动,平台仅承诺纯鼠标);gamepad 导航序延后(Open Questions)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Localization Considerations
|
||||||
|
|
||||||
|
- **源语言中文(CJK)**:运行时默认字体无 CJK 字形——**CJK 字体随包为硬性前置**(已锁),实现 AC 覆盖
|
||||||
|
- **按钮文案单行约束**:「停手」「弃图刷新」——按钮宽度按 4 汉字上限设计;译为英文("Hold"/"Reroll")不超 1.6× 不破版;德语长词("Aufgeben+Neu"类复合词)风险 HIGH——弃图刷新按钮允许两行或图标+缩写
|
||||||
|
- **明细带行文案**:来源标注格式「{行为} {值} → {目标}(来源)」为模板插值,最长 token = 来源标签(4 汉字,如「清图奖励」「封印未中」——战斗结算的来源标签封闭枚举);行模板预留 40% 膨胀宽度(固定槽高 + 裁剪兜底)
|
||||||
|
- **数字格式**:全部整数,无本地化格式需求;AP 点阵为图形载体不依赖文本
|
||||||
|
- **术语表锚定**:封印/雷/停手/弃图刷新/轮次/结算 已在 GDD 体系内定名,译文须同步 `design/gdd/术语表.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
|
||||||
|
**布局与可读**
|
||||||
|
|
||||||
|
- [ ] 1280×800 与 16:9 全屏(canvas_items/expand)下三区(B/C/D)无遮挡、无重叠、无内容裁切(棋盘 12×12 全部格子 + 数字完整可见)
|
||||||
|
- [ ] 进入战斗屏 ≤500ms 内可交互(棋盘 install 淡入完成后首格可点);同屏 draw calls < 200(technical-preferences 预算)
|
||||||
|
- [ ] 两种格态(已开格 / 未开格)灰度截图下一眼可辨(排雷玩法×6②)
|
||||||
|
- [ ] 悬停光标区分移动/挖/封印三语义;可挖域(8 向相邻)常驻指示;非相邻格悬停显禁止反馈(排雷玩法×6③)
|
||||||
|
- [ ] 已引爆危险格呈"可通行可读"(排雷玩法×6④)
|
||||||
|
- [ ] 全部数字对所在格底对比 ≥4.5:1;明度分层规则无违例(art-bible §2/§4.1,v3.0——状态区分不走明度,格底功能分档合法)
|
||||||
|
|
||||||
|
**交互与反馈**
|
||||||
|
|
||||||
|
- [ ] 挖/移/封印/停手/刷新全部操作纯鼠标可完成;stop 意图经意图批次提交(代码走查 + 探针断言)
|
||||||
|
- [ ] 每次拒绝(棋盘面/资源面/相位)玩家可感知且两源可区分;voided(至少 stop 作废)可感知(排雷玩法×6⑥、行动经济双源)
|
||||||
|
- [ ] 弃图刷新消耗 RAP 8 点、本轮上限 2 次可见(按钮文案实时「剩 N 次」;上限已随行动经济 2026-09-12 修订生效);RAP<8 资源面拒绝可见(行动经济 EC13);确认交互与常规确认不同位;换图后 AP 不重置、剩余次数扣减可见(**上游已修订受理——2026-09-12 布局决策 4 落稿**)
|
||||||
|
- [ ] 战斗结束时 RAP 清零有可见反馈(行动经济);~~关卡收束清库反馈~~(义务随秘宝过渡形态退役消解——现行 = 营地同调装配整局生效,秘宝.md)
|
||||||
|
- [ ] 战斗结束时状态图标行全清有可见反馈(B 区站桩逐枚化光 + 微文案)(增益状态×④)
|
||||||
|
- [ ] 敌人死亡瞬间可辨识(卡体灰化 + 碎裂退场,禁瞬消);战斗段短路被掐灭的重击由行序可推断(敌人系统资产下限)
|
||||||
|
|
||||||
|
**信息与归因**
|
||||||
|
|
||||||
|
- [ ] 结算逐行明细实时可见(P2 逐行归因;战斗后完整流水回看已随 P-C7 退役——归「生涯」);未生效类行(奖励未生效)聚合计数呈现(战斗结算 现行 9 类行协议)
|
||||||
|
- [ ] 敌人意图徽标挖掘期全程可见、映射全局恒定、含顺位与环长直觉编码(敌人系统×4①②③)
|
||||||
|
- [ ] 状态效果:极性呈现映射成文且非 magnitude 符号;空态渲染成文(裁决:图标行隐藏——B 区站桩血条下零图标时不占位);满层溢出经明细行可见(增益状态×①③④)
|
||||||
|
- [ ] 图例面板条目恒在可随时回看、非模态提示不劫持输入
|
||||||
|
- [ ] 零合法板(棋盘生成 EC5 降级)出现时玩家侧诚实提示(toast,非静默)
|
||||||
|
- [ ] 效果行数值为单次贡献值,禁止与池合成值相加呈现;零值伤害行可见不被吞;衰减行按聚合计数呈现(战斗结算 呈现细则)
|
||||||
|
- [ ] 未生效类行(奖励未生效)携带形状冗余(icon/划线),非色相独载
|
||||||
|
- [ ] 奖励徽章绘制优先级:封印印记之下、变异纹带之上、不进数字区;拾取瞬间 tier 档位可读(地图战斗资源 H1)
|
||||||
|
|
||||||
|
**场景级测试**(旧版状态记录 entry 17②③,缺项即 blocking)
|
||||||
|
|
||||||
|
- [ ] 场景级 headless 测试:真实实例化战斗屏场景 + 驱动完整对局 + 断言零脚本错误(呈现层点击探针模式扩展)
|
||||||
|
- [ ] 任何模态覆盖层(图例/胜利/失败——明细回看已退役)有「打开时遮挡物隐藏/输入锁定」场景级断言(缺陷⑤对照)
|
||||||
|
- [ ] 动态区全部固定槽高 + 裁剪兜底——悬停文案换行不推挤布局(缺陷①回归)
|
||||||
|
- [ ] CJK 字体随包,全部中文文案渲染非豆腐块
|
||||||
|
- [ ] 敌人销毁后呈现层不回读核心生命周期状态(快照纪律,缺陷②回归)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
1. **Player journey map——已完成(2026-09-27 欠账处置拍板:不建)**:实现前补建的前提随战斗屏实装失效;情绪曲线事实源 = art-bible §2 能量档,真人体验观测与结论回流 = [体验验证清单](../../../体验验证清单.md)
|
||||||
|
2. **无障碍专项文档——已完成(2026-09-27 拍板:不另立 design/accessibility-requirements.md)**:基线(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体)权威 = [HUD框架](../systems/表现与支撑/HUD框架.md)「可访问性基线」节;正式分层(文本缩放/色盲模式/按键重映射)归 [设置与本地化](../systems/表现与支撑/设置与本地化.md) 待设计问题清单 #1(设置项全集裁决时定);本 spec §Accessibility 为呈现侧落地承诺
|
||||||
|
3. **interaction-patterns.md——已建成**(2026-09-12 /team-ui 批当日落稿,本条「未建」系过期陈述):本 spec 引入的四 pattern(双源拒绝反馈/逐行兑现明细带/悬停预承诺光标/点阵资源显示)均已入库成文(pattern 1/3/4/5)
|
||||||
|
4. **战斗表现美术测试**(game-concept 已登记,战斗表现批次前强制):本 spec 的常驻双舞台分屏(布局决策 1)是测试的布局输入——**敌人卡形态已裁决(2026-09-20 用户看对照样张拍板):全站桩式(无框立绘+底座),主角同样站桩、状态小图标挂血条下,卡片式整体退役**;本 spec 已随裁决改写(原"按卡片式起草"条款作废),站桩式不改变分区结构。对照样张已存档(敌人卡与站桩式对照样张)
|
||||||
|
5. **移动动画形态**(布局决策 3):≤150ms 短滑为推荐值,playtest 观测「移动太瞬/太拖」反馈后调
|
||||||
|
6. **明细带挖掘期是否常驻上轮摘要**:常驻(现方案)vs 结算后即收起——playtest 观测回看频率
|
||||||
|
7. **Gamepad 导航序**:Partial 支持(非 MVP 门禁)——焦点环顺序待 gamepad 批次定
|
||||||
|
8. **NodeOverlay / 关卡结算屏——已完成(2026-09-27 欠账处置拍板;节点奖励屏部分被 2026-09-29 迭代 7 取代)**:关卡结算屏 spec 已建 [level-clear.md](level-clear.md)(本 spec 只锁出口锚点不变);节点奖励屏 spec 已出生 [node-reward.md](node-reward.md) v1.0(原「不立独立 spec、随秘宝内容重定批交付」拍板随之取代;节点覆盖层现行:恢复点全量服务、奖励点=三选一构筑点)
|
||||||
|
9. **调参面板退役计划——已完成(迭代 15 卡①,2026-10-05)**:调参面板类整体吸收退役入调试浮窗(调试开关=1 门控);正式侧归元进度(天赋树)不变(门控表述属当期留痕——调试入口现发布态恒隐,现行口径见元素表「调试浮窗」行与「调试变体」行)
|
||||||
|
10. **提示文案定稿**:chord 提示/空态文案归实现期文案 pass,本 spec 只锁必含要点与形态约束
|
||||||
|
11. **弃图刷新上游修订(已落稿 2026-09-12,布局决策 4)**:行动经济(Active 相位受理 + 每轮上限 2 次 + Waiting 代理退役 + 旧旗作废裁决 + 时间税失效预警)、排雷玩法(Active·仅刷新路径装板受理)、战斗结算(停手与 AP 耗尽两出口恒同盘不变 + 挖掘期刷新编排;AC-29 改写/AC-30 恒同盘不变)、系统索引的刷新规则同步、旧版 systems-index 修订块登记。遗留观察项:当场刷新的节奏健康由行动经济 OQ3 弃图率/刷新率预警承载,playtest 复核
|
||||||
|
12. **教学引导缺口挂靠(成文时教学引导 GDD 尚未建,留痕)**:挖到雷 = 敌方优势而非死亡(排雷玩法登记「经典扫雷玩家最大预期违背」)、旗挡链(连锁止于旗属正常)、首次蓄力姿态一次性提示(敌人系统)——本屏 toast 体系为落点候选,随教学引导批次定
|
||||||
|
13. **敌方 AC 展示——已终裁完成(2026-09-26)**:用户终裁——敌方 AC 数值**全屏不展示**(任何区均不直接写上);护甲类型改**图标方式**展示(形状+色相双通道,终稿图标资产归美术批);敌人站桩底座下名字行退回**纯名字 + 护甲类型图标**。与旧「克制对策可读性义务」(敌人技能池批)的关系 = **义务降级承载**:类型保留(图标可读,对策判断仍可做)、数值退役(不再直接展示);敌人技能池批相关义务措辞由并行代码批同步。我方 AC 仍按 2026-09-26 二轮拍板保留于 C 区攻击数据框(唯一展示面)
|
||||||
|
14. **GP/钥石迁出战斗屏后的展示面归属——已拍板完成(2026-09-26 二轮)**:GP = 关卡画面常驻总量 + 战斗总结结算(总量+增量);钥石 = 冒险总结结算 + 营地。呈现 spec 已出生:[settlement-summary.md](settlement-summary.md) v1.0(2026-09-30——两面分节轻量 spec,本 OQ 为其命名与分工依据;「战斗结算画面」「结算画面」旧措辞随 spec 命名完成退役)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §13 上游义务对照表(门禁核对用)
|
||||||
|
|
||||||
|
> 「系统名×条目号」记法(如「排雷玩法×6⑥」)= 旧版 systems-index 门禁状态记录中该系统的义务条目编号,条目内容均已在本表逐条承载。
|
||||||
|
|
||||||
|
| 义务源 | 条目 | 本 spec 承载落点 |
|
||||||
|
|---|---|---|
|
||||||
|
| 排雷玩法×6 | ① stop 经批次 | §Interaction Map 停手行 + AC |
|
||||||
|
| 排雷玩法×6 | ② 格态可辨(已开 / 未开两态) | §Layout 格态 + AC |
|
||||||
|
| 排雷玩法×6 | ③ 悬停预承诺+可挖域+chord 提示 | §Interaction Map + §States |
|
||||||
|
| 排雷玩法×6 | ④ 引爆危险格可通行可读 | §AC |
|
||||||
|
| 排雷玩法×6 | ⑤ 路径预览裁决 | 布局决策 3 |
|
||||||
|
| 排雷玩法×6 | ⑥ 单意图帧+voided+拒绝可感知 | §Interaction Map + §States 拒绝子态 + AC |
|
||||||
|
| 行动经济 | AP/RAP 常显+刷新入口+清零反馈+双源 | §Layout D 区 AP 条(RAP 自 C 区迁入——2026-09-26 信息归属拍板)+ §Transitions + AC |
|
||||||
|
| 战斗结算×3 | ①高光行强调呈现(封印标中金框行/清图 H2 金框行)②完美封印呈现形态 ③棋盘生成 EC5 零合法板提示/补偿/回退形态(toast 提示;补偿/回退不提供——三形态选型留痕 2026-09-12) | §States 高光/清图 + §States 拒绝子态 + §AC;注:结算明细屏 = 战斗结算 UX Flag 事项(本 spec 即其 /ux-design 产物),非 战斗结算×3 状态记录 |
|
||||||
|
| 敌人系统×4 | 意图映射/恒定/顺位/敌方池 | §Component Inventory 敌人站桩立绘 + **意图线索映射目录(敌人系统×4① 成文占位,资产定稿归战斗表现)** + AC |
|
||||||
|
| 增益状态×4 | 常显+空态/来源标注/溢出/去留 | §States 空态 + §AC |
|
||||||
|
| 地图战斗资源×5 | 身份恒读/明细行/清图强调(旧版状态记录五条中「窗口」「清空反馈」随格面资源批下线——清空反馈义务后载秘宝背包、复随秘宝过渡形态退役消解(现行 = 营地同调装配,秘宝.md)) | §Component Inventory 棋盘视图奖励徽章 + §States 清图/高光 + §Data Requirements 身份解析只读回调 + AC |
|
||||||
|
| 棋盘生成 | EC5 零合法板诚实呈现(数据面经 战斗结算×3③ 上抛) | §States 拒绝子态(toast)+ AC |
|
||||||
|
| 敌人系统资产下限 | 受击反馈/死亡表现/顺位标记 | §Transitions 受击 + §States 敌人死亡呈现(禁瞬消)+ §Component 顺位徽标;呈现语义在本 spec(同等 blocking),动画密度归战斗表现 |
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# 营地场景 UX spec(camp)
|
||||||
|
|
||||||
|
> 状态:v2.2(现行)
|
||||||
|
> 事实源:本 spec(呈现)+ [元进度](../systems/跨局循环/元进度.md)(机制)
|
||||||
|
> 美术画法:[art-bible](../../art/art-bible.md) §6.2/§7.5;素材命名与路径:[asset-path-map](../../art/asset-path-map.md)
|
||||||
|
> 相邻:[level-map.md](level-map.md)(主菜单语境)
|
||||||
|
|
||||||
|
## 定位
|
||||||
|
|
||||||
|
营地=存档内的局外枢纽(存档语境可达,冒险进行中不可达)。形态=**一张可点击的营地场景图**:画面里有篝火、锻炉、帐篷等物件,点物件进对应界面。**不是按钮列表式 UI。**
|
||||||
|
|
||||||
|
## 场景构成与七物件绑定
|
||||||
|
|
||||||
|
| 物件 | 进入 | 备注 |
|
||||||
|
|---|---|---|
|
||||||
|
| 大门(半开的门扇,门洞内一条通向远处的小路) | 冒险 | 点大门永远先出确认:有未完冒险=三出口(继续上一段/开始新冒险/取消);无=是否开始新冒险 |
|
||||||
|
| 锻炉·铁砧 | 锻造工坊 | **未解锁=禁用态**(降明度+去饱和) |
|
||||||
|
| 宝箱 | 秘宝匣 | **未解锁=禁用态**(同上) |
|
||||||
|
| 帐篷旁笔记本 | 生涯记录 | 生涯页返回钮文案**禁含「营地」字样**(由呈现层结构校验兜底,口径见测试规约) |
|
||||||
|
| 木桩 | 天赋树 | |
|
||||||
|
| 布告板 | 奖励格图鉴 | 内容冻结未激活,点进看占位——**不是禁用态** |
|
||||||
|
| 篝火 | 离开营地回主菜单 | **必须二次确认**;命中区只含火堆、不含火焰 |
|
||||||
|
| 帐篷 | — | 承载件,**不可点**;落地尺寸与占位范围待作者重定(待裁口径见 art-bible §6.2) |
|
||||||
|
|
||||||
|
纵深=远景天空与远山/中景木围墙与营地大门/近景篝火与左右物件(作者纵深稿)。中景围墙是横贯全宽的密排竖木桩墙——木桩一根挨一根无缝、桩顶削尖、无横木,只在中段留缺口给大门。
|
||||||
|
|
||||||
|
**场景按要素分层(10 张)**:远景天空/远山/整片地面/门洞内的小路合成 `scene_camp_bg` 背景层(z0,不透明全幅);中景木围墙独立成 `scene_camp_wall` 围墙层(z1,透明底,门洞处留透明缺口);其余八个物件层各一张、由上往下叠。门洞是围墙层的透明缺口,透出背景层画的**一条通向远处的小路**,不可填死。
|
||||||
|
|
||||||
|
**中景带自画面底部往上约 2/3 处起**;近景物件允许压住围墙(围墙不可点,z 序在近景物件之下),**唯一例外=中间门洞必须留空、不被任何物件遮挡**。围墙形态、门扇比例与帐篷尺寸的现行口径归 [art-bible](../../art/art-bible.md) §6.2,本 spec 不再复述。
|
||||||
|
|
||||||
|
坐标草案与分层验收判据见 [camp-scene-prompts](../../art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源);2026-10-22 美术方案讨论留痕见 [提案](../../../reports/提案-营地场景图美术生成方案-2026-10-22.md)。
|
||||||
|
|
||||||
|
## 点选反馈(根态)
|
||||||
|
|
||||||
|
悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附)+物件**名牌**(物件下方 8px 居中,提示字号 14,对比 ≥4.5:1);按下=位移 1px;禁用=降明度+去饱和;已解锁=常态。**四态零新素材**(全部程序化)。
|
||||||
|
|
||||||
|
命中区:七件两两不相交、不越出画面、**不侵入顶栏禁区(y ≤ 48)**。
|
||||||
|
|
||||||
|
## 顶栏
|
||||||
|
|
||||||
|
钥石余额常驻画面顶部一行小 HUD 栏(高 48px、全宽窄条、**浮层覆盖在场景图上层,不挤压画面**)。刷新入口=营地刷新单口(卡⑤同口挂接)。
|
||||||
|
|
||||||
|
## 叠层与开合
|
||||||
|
|
||||||
|
各界面开合走模态栈单口,层序按模态栈契约登记。**承载形态(独立全屏页 vs 单一内页切换)与叠层规则归卡④ §9 代拍板域,本 spec 不预设值**;派生规则:独立全屏页=场景根隐藏/单一内页切换=场景根留底(「缩放虚化」为第三形态,禁批内自选)。ESC 浮窗(返回主菜单/设置/退出游戏)归卡⑤。
|
||||||
|
|
||||||
|
## 口径
|
||||||
|
|
||||||
|
- 呈现数据源=元进度系统只读投影经组合根喂入;本层不持有系统资源、不算价。
|
||||||
|
- 「最近冒险」条带已撤下(卡④ Q4=甲),逐局历史回看归生涯。
|
||||||
|
- 秘宝匣界面内部呈现(解锁面+同调装配段)保留为附录,待该界面立独立 spec 后迁出。
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
> **Author**: user + ux-designer
|
> **Author**: user + ux-designer
|
||||||
> **Last Updated**: 2026-10-29
|
> **Last Updated**: 2026-10-29
|
||||||
> **Template**: Interaction Pattern Library
|
> **Template**: Interaction Pattern Library
|
||||||
> **来源**: `design/ux/battle.md` 已拍板内容的成文固化——本库不引入新设计决策
|
> **来源**: `design/gdd/ux/battle.md`(2026-09-12 /ux-review APPROVED)已拍板内容的成文固化——本库不引入新设计决策
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
- **用途**:ui-programmer 实现时引用既有 pattern,不重复发明;实现中出现新 pattern 时**必须回写本库**(team-ui Phase 3 义务)
|
- **用途**:ui-programmer 实现时引用既有 pattern,不重复发明;实现中出现新 pattern 时**必须回写本库**(team-ui Phase 3 义务)
|
||||||
- **输入约束**:PC / Keyboard-Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None
|
- **输入约束**:PC / Keyboard-Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None
|
||||||
- **视觉依据**:art-bible §3.3(半拟物:容器穿戏服、数据素面;直角=逻辑信息、圆角=可触摸物件)、§4(彩为世,墨为信——逻辑信息一律近黑暖墨族)
|
- **视觉依据**:art-bible §3.3(半拟物:容器穿戏服、数据素面;直角=逻辑信息、圆角=可触摸物件)、§4(彩为世,墨为信——逻辑信息一律近黑暖墨族)
|
||||||
- **全局语义红线**:无任何信息仅靠色相承载(art-bible §4.5 色弱安全清单逐对成立);明度分层(§2——状态与情绪区分仍只用色相/饱和/运动/元素四手段;空间纵深与光照可走明度带)
|
- **全局语义红线**:无任何信息仅靠色相承载(art-bible §4.5 色弱安全清单逐对成立);明度分层(§2,2026-09-29 v3.0——状态与情绪区分仍只用色相/饱和/运动/元素四手段;空间纵深与光照可走明度带)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
| # | Pattern | 类别 | 状态 |
|
| # | Pattern | 类别 | 状态 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 1 | 双源拒绝反馈 | Feedback | **成文 ✓** |
|
| 1 | 双源拒绝反馈 | Feedback | **成文 ✓** |
|
||||||
| 2 | 原位窗口激活 | Overlay | **已退役**(留档) |
|
| 2 | 原位窗口激活 | Overlay | **已退役**(2026-09-15 下线,留档) |
|
||||||
| 3 | 逐行兑现明细带 | Data Display | **成文 ✓** |
|
| 3 | 逐行兑现明细带 | Data Display | **成文 ✓** |
|
||||||
| 4 | 悬停预承诺光标 | Input | **成文 ✓** |
|
| 4 | 悬停预承诺光标 | Input | **成文 ✓** |
|
||||||
| 5 | 点阵资源显示 | Data Display | **成文 ✓** |
|
| 5 | 点阵资源显示 | Data Display | **成文 ✓** |
|
||||||
@@ -33,13 +33,13 @@
|
|||||||
| 10 | 一次性非模态教学提示 | Feedback | **已实现**(chord 提示——规格全文待补) |
|
| 10 | 一次性非模态教学提示 | Feedback | **已实现**(chord 提示——规格全文待补) |
|
||||||
| 11 | tooltip 规范 | Feedback | **已实现**(状态/道具悬停——规格全文待补) |
|
| 11 | tooltip 规范 | Feedback | **已实现**(状态/道具悬停——规格全文待补) |
|
||||||
| 12 | 单意图帧批次提交 | Input | **已实现**(组合根——规格全文待补) |
|
| 12 | 单意图帧批次提交 | Input | **已实现**(组合根——规格全文待补) |
|
||||||
| 13 | 状态效果槽 | Data Display | **已实现**(状态图标行呈现件——规格全文待补;C 区四槽已退役,现役载体=B 区站桩伴随件) |
|
| 13 | 状态效果槽 | Data Display | **已实现**(状态图标行呈现件——规格全文待补;载体变更留档:C 区四槽已退役,现役载体=B 区站桩伴随件) |
|
||||||
| 14 | 步进进度条 | Navigation | **已退役留档**(步进进度条呈现件已删,节点态承载进度) |
|
| 14 | 步进进度条 | Navigation | **已退役留档**(步进进度条呈现件已删,节点态承载进度) |
|
||||||
| 15 | 移动路径预览 | Input | **已实现**(棋盘视图 BFS 蓝点——规格全文待补) |
|
| 15 | 移动路径预览 | Input | **已实现**(棋盘视图 BFS 蓝点——规格全文待补) |
|
||||||
| 16 | 清图/换图演出编排 | Feedback | **已实现·占位级**(棋盘演出呈现件 金粒彩纸——规格随战斗表现 美术批补) |
|
| 16 | 清图/换图演出编排 | Feedback | **已实现·占位级**(棋盘演出呈现件 金粒彩纸——规格随战斗表现 美术批补) |
|
||||||
| 17 | 胜利/失败终局编排 | Feedback | **已实现·占位级**(战斗终局覆盖层——规格随战斗表现补) |
|
| 17 | 胜利/失败终局编排 | Feedback | **已实现·占位级**(战斗终局覆盖层——规格随战斗表现补) |
|
||||||
| 18 | Boss 遭遇演出 | Feedback | **已实现·占位级**(紫赤影子——规格随战斗表现补) |
|
| 18 | Boss 遭遇演出 | Feedback | **已实现·占位级**(紫赤影子——规格随战斗表现补) |
|
||||||
| 19 | 库存常读列表 | Data Display | **占位失效**(所记载体从未实装;库存面已随秘宝过渡形态退役——C 区现行秘宝槽=装配呈现面、重接归装配面,见 battle.md 组件清单) |
|
| 19 | 库存常读列表 | Data Display | **占位失效**(所记载体从未入库;库存面已随秘宝过渡形态退役——C 区现行秘宝槽=装配呈现面、重接归装配面批次,见 battle.md 组件清单) |
|
||||||
| 20 | 标准控件组(button/progress bar/list) | Control | **已实现**(标准控件组 直角细线/凸圆角——规格全文待补) |
|
| 20 | 标准控件组(button/progress bar/list) | Control | **已实现**(标准控件组 直角细线/凸圆角——规格全文待补) |
|
||||||
|
|
||||||
MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab bar——战斗屏无此需求;TunePanel slider 为调试专用。
|
MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab bar——战斗屏无此需求;TunePanel slider 为调试专用。
|
||||||
@@ -57,7 +57,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
|
|
||||||
**Specification**:
|
**Specification**:
|
||||||
- 触发:意图回执(受理标志 + 拒绝原因 + 细分原因)**返回值驱动**(拒绝无事件外发——排雷玩法发射面封闭,实现层禁止等待拒绝信号)
|
- 触发:意图回执(受理标志 + 拒绝原因 + 细分原因)**返回值驱动**(拒绝无事件外发——排雷玩法发射面封闭,实现层禁止等待拒绝信号)
|
||||||
- 反馈映射:棋盘面 → 目标格危险红 `#A8321F` 边框闪(拒绝语义红族——封印黑 #000000,2026-09-28 用户拍板现行) + toast 具体原因(细分原因→文案映射表:非相邻 / 目标已开格 / 目标未开格 / 该格已有封印 / 该格无封印 / 无可达路径 / 坐标越界);资源面 → 对应资源数字脉冲(AP/RAP)+「AP 不足 · 剩 0 点」式文案;相位 → toast(结算中/非挖掘期)
|
- 反馈映射:棋盘面 → 目标格危险红 `#A8321F` 边框闪(拒绝语义红族——旗朱→封印紫→封印黑 #000000,2026-09-28 用户拍板现行) + toast 具体原因(细分原因→文案映射表:非相邻 / 目标已开格 / 目标未开格 / 该格已有封印 / 该格无封印 / 无可达路径 / 坐标越界);资源面 → 对应资源数字脉冲(AP/RAP)+「AP 不足 · 剩 0 点」式文案;相位 → toast(结算中/非挖掘期)
|
||||||
- 即时性:拒绝当帧呈现;toast 自动消退 2.5s
|
- 即时性:拒绝当帧呈现;toast 自动消退 2.5s
|
||||||
- **voided 区分**:作废 ≠ 拒绝(零效果零扣费零事件)——须独立文案如「本轮已清图,停手未执行 · 剩余 AP 已作废」,至少 stop 作废可感知
|
- **voided 区分**:作废 ≠ 拒绝(零效果零扣费零事件)——须独立文案如「本轮已清图,停手未执行 · 剩余 AP 已作废」,至少 stop 作废可感知
|
||||||
- Accessibility:危险红边框闪为形状+运动通道;文案常驻
|
- Accessibility:危险红边框闪为形状+运动通道;文案常驻
|
||||||
@@ -71,7 +71,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
|
|
||||||
### 2. 原位窗口激活(in-place window activation)——已退役留档
|
### 2. 原位窗口激活(in-place window activation)——已退役留档
|
||||||
|
|
||||||
> **退役注记**:唯一消费面"轮末道具使用窗口"已下线,本条原 Specification 整段退役不再装载呈现义务;编号留空防后续 pattern 交叉引用失锚(照 battle.md 布局决策 2 先例)。
|
> **退役注记(2026-09-20 退役术语扫描批补标)**:唯一消费面"轮末道具使用窗口"已随 2026-09-15 可选类道具删除整体下线(地图战斗资源批),本条原 Specification 整段退役不再装载呈现义务;编号留空防后续 pattern 交叉引用失锚(照 battle.md 布局决策 2 先例)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -81,18 +81,18 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
**Category**: Data Display
|
**Category**: Data Display
|
||||||
**Used In**: 战斗画面区底部(结算期第一注视点)
|
**Used In**: 战斗画面区底部(结算期第一注视点)
|
||||||
|
|
||||||
**Description**: 轮末结算逐行流水实时呈现——「扫雷之因逐行兑现为战果」(P2 归因)的承载面。挖掘期收起为 1 行上轮摘要;结算期展开为实时流(带高读 `log_band_h_settle`)。
|
**Description**: 轮末结算逐行流水实时呈现 + 可回看——「扫雷之因逐行兑现为战果」(P2 归因)的承载面。挖掘期收起为 1 行上轮摘要;结算期展开为实时流(带高读 `log_band_h_settle`);点击开完整回看 overlay。
|
||||||
|
|
||||||
**Specification**:
|
**Specification**:
|
||||||
- 数据源:[战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行封闭协议(现行);公共字段:来源类别 / 来源格 / 轮次 / 显示名 / 数值 / 可空高光标记);**无来源行 = 断言失败**
|
- 数据源:[战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行封闭协议(现行);公共字段:来源类别 / 来源格 / 轮次 / 显示名 / 数值 / 可空高光标记);**无来源行 = 断言失败**
|
||||||
- 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 来源标签(4 汉字封闭枚举),模板预留 40% 膨胀宽度
|
- 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 来源标签(4 汉字封闭枚举),模板预留 40% 膨胀宽度
|
||||||
- 聚合纪律:未生效类行(奖励未生效——现行 9 类行协议唯一未生效型)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行数值 = 单次贡献值、禁与池合成值相加呈现;零值行可见不吞(免伤轮归因不断点)
|
- 聚合纪律:未生效类行(奖励未生效——现行 9 类行协议唯一未生效型,2026-09-20 收敛)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行数值 = 单次贡献值、禁与池合成值相加呈现;零值行可见不吞(免伤轮归因不断点)
|
||||||
- 高亮:高亮标记(封印标中、清图奖励、完美破除) → 金框强调;完美封印 = 独立高光行 + 全屏喝彩级反馈。「完美破除」的判据句读作「本板首次标错受检」,不等于完美资格已失——专长「完美保险」可在本场首次标错时豁免,实际资格按有效误标(误标总数 − 豁免数)判定
|
- 高亮:高亮标记(封印标中、清图奖励、完美破除) → 金框强调;完美封印 = 独立高光行 + 全屏喝彩级反馈。「完美破除」的判据句读作「本板首次标错受检」,不等于完美资格已失——专长「完美保险」可在本场首次标错时豁免,实际资格按有效误标(误标总数 − 豁免数)判定
|
||||||
- 布局:固定槽高 + 裁剪兜底;正文 ≥14px;数值暗底高对比;未生效类行带 icon/划线形状冗余
|
- 布局:固定槽高 + 裁剪兜底;正文 ≥14px;数值暗底高对比;未生效类行带 icon/划线形状冗余
|
||||||
- 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段)
|
- 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段)
|
||||||
|
|
||||||
**When to Use**: 任何「因果可归因」的逐行流水呈现
|
**When to Use**: 任何「因果可归因」的逐行流水呈现
|
||||||
**When NOT to Use**: 自造行类型/字段(9 类封闭枚举(现行)——增删 = 接口漂移,须走[《战斗结算》](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)修订)
|
**When NOT to Use**: 自造行类型/字段(9 类封闭枚举(现行)——增删 = 接口漂移,须走[《战斗结算》](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)修订)
|
||||||
|
|
||||||
**Reference**: battle.md §Component Inventory 结算明细带、§AC 信息与归因;归档《战斗结算》(b1-settlement.md)Core Rule 14 / Visual Req
|
**Reference**: battle.md §Component Inventory 结算明细带、§AC 信息与归因;归档《战斗结算》(b1-settlement.md)Core Rule 14 / Visual Req
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
### 6. 模态 overlay 层级纪律(modal overlay discipline)
|
### 6. 模态 overlay 层级纪律(modal overlay discipline)
|
||||||
|
|
||||||
**Category**: Modal
|
**Category**: Modal
|
||||||
**Used In**: 图例面板、胜利/失败终局 overlay
|
**Used In**: 图例面板、结算明细回看、胜利/失败终局 overlay
|
||||||
|
|
||||||
**Description**: 任何模态覆盖层打开时必须**隐藏/锁定其遮挡的交互物**,关闭恢复——防「看不见但可点」的幽灵输入(垂直切片缺陷⑤教训,场景级断言强制)。
|
**Description**: 任何模态覆盖层打开时必须**隐藏/锁定其遮挡的交互物**,关闭恢复——防「看不见但可点」的幽灵输入(垂直切片缺陷⑤教训,场景级断言强制)。
|
||||||
|
|
||||||
@@ -154,23 +154,23 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
- 验收:**场景级断言「打开时遮挡物隐藏/输入锁定」为每个模态 overlay 的强制 AC**(battle.md 场景级测试节)
|
- 验收:**场景级断言「打开时遮挡物隐藏/输入锁定」为每个模态 overlay 的强制 AC**(battle.md 场景级测试节)
|
||||||
|
|
||||||
**When to Use**: 全屏打断级信息、只读回看、仪式性终局
|
**When to Use**: 全屏打断级信息、只读回看、仪式性终局
|
||||||
**When NOT to Use**: 与常读面板同域的窗口态(此类场景当前无消费面);**独立屏**(关卡画面为独立屏,不属本 pattern 族——其屏级语义见 [level-map.md](level-map.md);节点/商店覆盖层在关卡画面激活域内弹出时仍属本 pattern,遮挡/恢复语义复用单一模态栈)
|
**When NOT to Use**: 与常读面板同域的窗口态(原 pattern 2 原位激活已随道具窗口退役——此类场景当前无消费面);**独立屏**(2026-09-28 起:关卡画面形态升格为独立屏退出本 pattern 族——其屏级语义见 [level-map.md](level-map.md);节点/商店覆盖层在关卡画面激活域内弹出时仍属本 pattern,遮挡/恢复语义复用单一模态栈)
|
||||||
|
|
||||||
**Reference**: battle.md §AC 场景级测试;缺陷①⑤
|
**Reference**: battle.md §AC 场景级测试;缺陷①⑤(production/session-state entry 17)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 7. 破坏性确认异位(destructive-confirm position offset)
|
### 7. 破坏性确认异位(destructive-confirm position offset)
|
||||||
|
|
||||||
**Category**: Feedback
|
**Category**: Feedback
|
||||||
**Used In**: 弃图刷新(RAP−4 消耗 + 旧板弃置)
|
**Used In**: 弃图刷新(RAP−8 消耗 + 旧板弃置)
|
||||||
|
|
||||||
**Description**: 消耗性/不可逆操作的确认交互与常规确认**不同位**——位置通道是色盲安全冗余(art-bible §4.5 清单 #7:UI 红/金强调对需图标+文案冗余,且破坏性确认禁止与常规确认同位)。
|
**Description**: 消耗性/不可逆操作的确认交互与常规确认**不同位**——位置通道是色盲安全冗余(art-bible §4.5 清单 #7:UI 红/金强调对需图标+文案冗余,且破坏性确认禁止与常规确认同位)。
|
||||||
|
|
||||||
**Specification**:
|
**Specification**:
|
||||||
- 弃图刷新:确认微交互显式呈现全部代价(RAP−4 · **旧板封印印记随旧板作废**提示);确认交互位置与常规确认不同位
|
- 弃图刷新:确认微交互显式呈现全部代价(RAP−8 · **旧板封印印记随旧板作废**提示);确认交互位置与常规确认不同位
|
||||||
- 双通道:图标 + 文案冗余
|
- 双通道:图标 + 文案冗余
|
||||||
- 拒绝路径:RAP<4 → pattern 1 的资源面(EC13 合法拒绝可见)
|
- 拒绝路径:RAP<8 → pattern 1 的资源面(EC13 合法拒绝可见)
|
||||||
|
|
||||||
**When to Use**: 任何消耗资源/不可逆的操作确认
|
**When to Use**: 任何消耗资源/不可逆的操作确认
|
||||||
**When NOT to Use**: 无代价操作(直接执行 + 直接反馈)
|
**When NOT to Use**: 无代价操作(直接执行 + 直接反馈)
|
||||||
@@ -182,7 +182,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
### 8. 禁用态即理由(disabled-state with reason)
|
### 8. 禁用态即理由(disabled-state with reason)
|
||||||
|
|
||||||
**Category**: Feedback
|
**Category**: Feedback
|
||||||
**Used In**: 商店购买钮余额不足置灰(shop.md)/ 三选一与商店 GP 刷新钮余额不足禁用(node-reward.md、秘宝.md「三选一刷新双源」节)——本条保留为通用模式
|
**Used In**: 商店购买钮余额不足置灰(shop.md)/ 三选一与商店 GP 刷新钮余额不足禁用(node-reward.md、秘宝.md「三选一刷新双源」节)——原道具窗口满血治疗包消费面随可选类道具退役 2026-09-15,本条保留为通用模式
|
||||||
|
|
||||||
**Description**: 禁用不许静默——灰置必须伴随**可见的禁选原因**(tooltip/toast),防「为什么点不动」的困惑。
|
**Description**: 禁用不许静默——灰置必须伴随**可见的禁选原因**(tooltip/toast),防「为什么点不动」的困惑。
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
|
|
||||||
## Gaps & Patterns Needed
|
## Gaps & Patterns Needed
|
||||||
|
|
||||||
- **目录 #9–#20 已全部实现**;规格全文回写归 HUD框架正式化
|
- **目录 #9–#20 已全部实现**(2026-09-12 战斗屏实现批,冒烟 149/149 + 三探针全绿);规格全文回写 = HUD框架正式化批义务
|
||||||
- 实现期新增技术件(不单独立 pattern,规格归并):去饱和+金橙状态切换 = 逐格共享 ShaderMaterial(明度不变,兼容渲染器下安全);敌人死亡残位 = 卡体灰化+碎裂禁瞬消(归入 #17 终局编排规格)
|
- 实现期新增技术件(不单独立 pattern,规格归并):去饱和+金橙状态切换 = 逐格共享 ShaderMaterial(明度不变,兼容渲染器下安全);敌人死亡残位 = 卡体灰化+碎裂禁瞬消(归入 #17 终局编排规格)
|
||||||
- **MVP 未使用标准控件**:toggle / dropdown / input field / tab bar(无需求不设占位);TunePanel slider 为调试专用不入库
|
- **MVP 未使用标准控件**:toggle / dropdown / input field / tab bar(无需求不设占位);TunePanel slider 为调试专用不入库
|
||||||
- **实现偏差规则**:pattern 近似但不完全适配时,实现层禁止静默变体——登记偏差交 ux-designer 复核后回写
|
- **实现偏差规则**:pattern 近似但不完全适配时,实现层禁止静默变体——登记偏差交 ux-designer 复核后回写
|
||||||
@@ -210,7 +210,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
## Open Questions
|
## Open Questions
|
||||||
|
|
||||||
1. 目录占位项的补全时点 = 实现期顺带回写(owner:ui-programmer → ux-designer 复核)
|
1. 目录占位项的补全时点 = 实现期顺带回写(owner:ui-programmer → ux-designer 复核)
|
||||||
2. Gamepad 引入时,需为 pattern 4/12/15 增补手柄映射节(焦点序已在 battle.md OQ8 留位)
|
2. Gamepad 批次引入时,需为 pattern 4/12/15 增补手柄映射节(焦点序已在 battle.md OQ8 留位)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Loaded 100 of 776 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user