From 661c2fcc79dca7636d96a95e89914f9d3f61755a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 00:53:09 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=90=88=E5=9B=9E?= =?UTF-8?q?=E9=93=BE=E5=86=B2=E7=AA=81=E8=B7=AF=E5=BE=84=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=C2=B7=E5=B7=A5=E5=85=B7=E4=BB=B6):=20pre-merge-commit=20?= =?UTF-8?q?=E7=BA=A2=E6=80=81=E5=A4=84=E7=BD=AE=E6=94=B9=E4=B8=BA=E5=94=AF?= =?UTF-8?q?=E4=B8=80=20abort=20=E9=87=8D=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 禁 git commit 续合——该路径只触发提交类钩子,pre-merge-commit/post-merge 零触发,前置检查与推送靠人手补。 配套 .zcode/hooks/worktree-guard.sh(本机件 gitignored,主区直改,无独立提交)去掉 MERGE_HEAD 豁免:主区一切 git commit 一律拦(:175 删 and not has_merge,:176-190 换统一拦截块,不再探测 MERGE_HEAD)。 读数(改完即测铁规): - bash -n tools/hooks/pre-merge-commit PASS - bash tools/run_all_gates.sh --gates exit=0【验收通过】闸况与基线一致无新增红;闸壳自检 bash -n × 13 件失败 0 - 守卫自测(归并): bash -n PASS;stdin 五态期望/实测全一致 ①主区 git commit=2 ②主区 merge --no-ff=0 ③worktree 内 commit=0 ④--no-verify=2 ⑤畸形 payload=0 --- tools/hooks/pre-merge-commit | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/hooks/pre-merge-commit b/tools/hooks/pre-merge-commit index 95289288..cafbaa5c 100755 --- a/tools/hooks/pre-merge-commit +++ b/tools/hooks/pre-merge-commit @@ -2,7 +2,7 @@ # 合回前置检查钩子(git pre-merge-commit,2026-11-06 用户裁)——主工作区 git merge 落合并提交前 # 跑最小验证面:tools/run_all_gates.sh --premerge(冒烟测试+单元与集成全套件 4 分片,热导入缓存约 2 分钟)。 # 语义(git 2.45.2.windows.1 本机实测):本钩子拦的是「合并提交」不是「合并动作」——exit≠0 时合并结果 -# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置二选一:修红后 git commit 续合,或 git merge --abort 放弃。 +# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:该路径 pre-merge-commit/post-merge 两钩子零触发)。 # 快进合并不触发本钩子(git 语义)——本仓合回铁规恒 --no-ff,漏写时远端 CI 兜底仍在。 # --no-verify 可整体跳过(实测)——仅属用户,agent 禁用(worktree-guard 在案)。 # 仅主工作区触发(worktree 内合并不触发,与 post-merge 同款 git-dir 判别)。 @@ -18,7 +18,7 @@ RC=$? if [ "$RC" -ne 0 ]; then echo "" >&2 echo "[pre-merge-commit] ✗ 前置检查红(读数如上)——合并提交未落,仓库停 MERGE_HEAD 待提交态。" >&2 - echo " 处置二选一:① 修红后 git commit 续合本合并;② 放弃整次合并=git merge --abort。" >&2 + echo " 处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:两合回钩子零触发)。" >&2 exit 1 fi echo "[pre-merge-commit] ✓ 前置检查绿——合并提交继续。" From 7d720f58a1817d627cde264b0d6da09682352a3d Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 00:53:49 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=90=88=E5=9B=9E?= =?UTF-8?q?=E9=93=BE=E5=86=B2=E7=AA=81=E8=B7=AF=E5=BE=84=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=C2=B7=E8=A7=84=E5=88=99=E5=90=8C=E6=AD=A5):=20=E4=B8=A4?= =?UTF-8?q?=E5=A4=84=E7=BA=A2=E6=80=81=E5=A4=84=E7=BD=AE=E6=94=B9=E5=94=AF?= =?UTF-8?q?=E4=B8=80=20abort=20=E9=87=8D=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AGENTS.md「运行与验证」首条与 process-conventions.md §1 第 4 条①③ 同步新口径;禁在主区 git commit 续合,改走 git merge --abort → 回 worktree → 重新 git merge --no-ff。 读数(改完即测铁规): bash tools/run_all_gates.sh --docs exit=0【验收通过】闸况与基线一致,无新增红(文档域八闸全过) --- AGENTS.md | 2 +- design/engineering/process-conventions.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index cd6a56a3..456dfc54 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ ## 运行与验证(工作目录 = 含 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 commit 续合,或 git merge --abort 放弃),快进合并不触发钩子,`--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-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` 自举 - 单件直跑(=改完即测的最窄确认,其读数就是那一步的凭据;跨改动面的漏网由合回后远端全量档兜):冒烟测试 `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`(奖励期望);关卡完成率/难度类测量一律走全冒险 - 数值验证:`python tools/balance_verifier.py`(采集端 `res://sim/verifier_batch.gd`,报告与原始数据落 `sim-data/`) diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md index 7404aed4..b105ab1e 100644 --- a/design/engineering/process-conventions.md +++ b/design/engineering/process-conventions.md @@ -12,7 +12,7 @@ 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 反而带不进去,改动只对本机生效) 2. **收口顺序(固定)**:**冻结 → 件核 → 并 master → 重塑 → 主区合回 → 删区**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先在 worktree 内 `git merge master` 解冲突(必须在合回之前,合回后才并=CI 验的是中间态);**重塑**=迭代分支(iter 形)合回前执行 `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 形免重塑免数卡)修复提交再合,落地复验追绿后删修复区**。批内的验证义务按 §4 改完即测铁规履行——改完即测自己改过的那部分,不请示、不等点名;收口顺序本身不设跑批关口。**卡片复核前置判据(2026-11-05 用户裁)**:需求卡片的 grilling 复核先于卡片提交、卡片提交先于合回——复核未跑完、缺陷清单未裁完,禁把卡片落 commit(落了也不算成立),`master` 永不落未成立卡;本条与 §2 段三出口铁律、doc-conventions §12.1「已写卡」凭据同判。 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 形免重塑免数卡),修复合回落地即再推再验追绿(追绿同链)。导入缓存刷新(.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/轮询循环。 -4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;合并收尾提交凭 MERGE_HEAD 豁免)、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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 commit 续合或 git merge --abort 放弃;快进合并不触发;--no-verify 可跳过且仅属用户)+post-merge(远端 CI 触发,只推送,不挂等待);合回链之外 git 层不设车道钩子——用户手工改动不受限;ZCode 层只约束 agent(子代理不经守卫层) +4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;主区一切非 merge 的 git commit 均拦(含 MERGE_HEAD 态续合;冲突/红态一律 git merge --abort → 回 worktree → 重新 git merge --no-ff))、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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(子代理不经守卫层) 5. **会话单区(2026-11-04 用户裁)**:建区粒度=回合——同一时刻每会话至多一个 worktree 在役;合入删区之前,会话内用户追加的事项一律并入在役区推进,禁为追加事项另开新区。区内全部事项完成后只做一次合入(一次 `git merge --no-ff`、post-merge 一次推送、远端 CI 只跑一次),追加事项在合入提交信息里分列;无改动需求的事项不建区。合回删区后用户再发令的事项=新回合,另开新区(区名取该回合主任务名)。CI 红的 `fix-<任务名>` 修复区属同一回合的追绿延续,不另算新区。迭代实现批(iter 形分支)独占回合——其他类事项不得并入迭代区(合回守卫数卡校验本就拦未归卡提交),待其合回后按新回合另开。 ## 2. 五段流水线 From 11eed6ac80725056953b390d9143cbc1215277ea Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 00:54:32 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=90=88=E5=9B=9E?= =?UTF-8?q?=E9=93=BE=E5=86=B2=E7=AA=81=E8=B7=AF=E5=BE=84=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=C2=B7=E6=94=B6=E5=B0=BE):=20=E5=BE=85=E5=8A=9E=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E6=95=B4=E6=9D=A1=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按 doc-conventions.md:178 直改序列「待执行 → 完成即整条删除」;条目状态/改动面/实况一字未改,删后自然消失。删除随合入提交落地生效。 读数(改完即测铁规): bash tools/run_all_gates.sh --docs exit=0【验收通过】闸况与基线一致无新增红(流水线闸确认删后清单格式合法);grep 确认「合回链两钩子冲突路径绕过」已不在清单 --- 待办清单.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/待办清单.md b/待办清单.md index bccdc129..2518873a 100644 --- a/待办清单.md +++ b/待办清单.md @@ -100,14 +100,6 @@ **状态**:待执行 -#### 合回链两钩子冲突路径绕过(2026-11-07 登记,来源=批次移交) - -**实况**:合并遇冲突时 pre-merge-commit 不触发(合并策略失败未到提交点),续提交 `git commit` 收束 MERGE_HEAD 时两钩子(pre-merge-commit/post-merge)均不触发——前置检查由 agent 手动补跑、推送由 agent 手动补做。证据=合并提交 2a17260c 冲突续提交流(git 历史可考)+主区 .gates 前置检查补跑读数(冒烟绿/单元绿)。修法方向=续提交路径补钩子触发(pre-commit 侧判 MERGE_HEAD 分流到 premerge 语义,post-merge 侧同理),细则归工程改动。 - -**改动面**:工具代码 - -**状态**:待执行 - #### 层序落位单口检查的扫描面不含子目录——视图层插位不在该闸视野(2026-11-05 登记,来源=会话提及) **实况**:契约件 `game/tests/unit/contracts/source_guard_test.gd` 的「V1d 层序落位单口」用平铺列目录(`:86-99`,只收 `.gd` 文件名、不递归),注释 `:85` 仍写「presentation 无子目录」;而 `game/presentation/` 现实有 `views/` 与 `scenes/` 两目录,视图层全部文件不在该闸视野内。 From 9f683800fa3b304eea6124273275fe987a813993 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 01:03:39 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0):=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=B5=81=E6=B0=B4=E7=BA=BF=E9=97=B8=E8=AE=A4?= =?UTF-8?q?=E9=94=9A=E5=BC=8F=E4=B8=8D=E5=90=AB=E4=B8=AD=E6=96=87=E5=90=8D?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 待办清单.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/待办清单.md b/待办清单.md index 2518873a..13b64d3b 100644 --- a/待办清单.md +++ b/待办清单.md @@ -90,16 +90,6 @@ **改动面**:文档+游戏代码 **状态**:待写卡 -#### 流水线闸认锚式不含中文名文档——判据出处行锚对半数现行文档失效(2026-11-05 登记,来源=批次移交) - -**实况**:判据出处行锚的机检式 `ANCHOR_RE`(`tools/pipeline_gate.py:68`)字符类=`[A-Za-z0-9_\-.\\/]`,不含中文段——凡验收判据句落在中文名现行文档(本库 GDD 多为此形态:`HUD框架.md`/`关卡节点地图.md`/`待办清单.md`),机检一律认不到锚、判「判据出处行锚缺失」红。 -- 批次实证=营地交互修复批需求卡片(2026-11-05,已退役 git 历史可考):R2/R3/R4/R8 四行的真出处是中文名文档,只能另挂一个 ASCII 路径文档当替身锚才过闸 -- 发现与依据=该卡独立复核第 22 条(`tools/pipeline_gate.py:68`,已退役 git 历史可考) - -**改动面**:工具代码 - -**状态**:待执行 - #### 层序落位单口检查的扫描面不含子目录——视图层插位不在该闸视野(2026-11-05 登记,来源=会话提及) **实况**:契约件 `game/tests/unit/contracts/source_guard_test.gd` 的「V1d 层序落位单口」用平铺列目录(`:86-99`,只收 `.gd` 文件名、不递归),注释 `:85` 仍写「presentation 无子目录」;而 `game/presentation/` 现实有 `views/` 与 `scenes/` 两目录,视图层全部文件不在该闸视野内。 From 7fc7a8925a4605d2eb53bff41f31b2ca52a01b1f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 01:05:16 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E9=97=B8=E6=9C=BA?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E5=AE=88=E5=8D=AB=E4=BF=AE=E5=A4=8D):=20gate?= =?UTF-8?q?=5Frun=5Ftimeout=20=E5=8F=8C=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E2=80=94=E2=80=94=E2=91=A0=E6=A0=87=E5=BF=97=E6=96=87=E4=BB=B6?= =?UTF-8?q?mktemp=E5=BB=BA=E6=97=B6=E5=8D=B3=E7=9C=9F=E8=87=B4=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=A0=81=E6=81=92124(=E5=88=A4=E6=8D=AE[-f]=E6=81=92?= =?UTF-8?q?=E7=9C=9F,=E6=AD=A3=E5=B8=B8=E5=AE=8C=E6=88=90/=E7=9C=9F?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5/=E7=9C=9F=E8=B6=85=E6=97=B6=E4=B8=89?= =?UTF-8?q?=E6=80=81=E4=B8=8D=E5=8F=AF=E5=88=86)=E2=91=A1=E5=AE=88?= =?UTF-8?q?=E5=8D=AB=E5=AD=90=E5=A3=B3=E8=A2=AB=E6=9D=80=E7=95=99=E5=AD=A4?= =?UTF-8?q?=E5=84=BFsleep=E6=94=A5=E8=BE=93=E5=87=BA=E7=AE=A1=E9=81=93?= =?UTF-8?q?=E8=87=B3=E6=BB=A1=E6=A1=A3(golden=E9=87=8D=E9=87=87=E9=9B=86?= =?UTF-8?q?=E7=99=BD=E7=AD=897=E5=88=86=E9=92=9F=E7=97=87=E7=8A=B6)?= =?UTF-8?q?=E2=80=94=E2=80=94=E4=BF=AE=E6=B3=95:=E6=A0=87=E5=BF=97?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=94=B9=E5=85=88=E8=B5=8B=E8=B7=AF=E5=BE=84?= =?UTF-8?q?+rm-f=E5=9E=AB=E5=BA=95+=E7=9C=9F=E8=B6=85=E6=97=B6=E6=89=8D?= =?UTF-8?q?=E8=90=BD(probe=5Fgate=20run=5Fsuite=E5=90=8C=E6=AC=BE),?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=E6=94=B90.2=E7=A7=92=E6=AD=A5=E8=BF=9B?= =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E7=9B=AF=E5=81=9C=E6=AD=A2=E6=96=87=E4=BB=B6?= =?UTF-8?q?(SECONDS=E6=88=AA=E6=AD=A2=E7=BA=BF,=E5=91=BD=E4=BB=A4=E5=85=88?= =?UTF-8?q?=E5=AE=8C=E7=88=B6=E6=B5=81=E7=A8=8B=E6=94=BE=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=AE=88=E5=8D=AB=E8=87=AA=E8=A7=81=E8=87=AA?= =?UTF-8?q?=E9=80=80,=E6=9C=BA=E5=88=B6=E4=B8=8A=E6=97=A0=E5=AD=A4?= =?UTF-8?q?=E5=84=BF=E5=8F=AF=E7=95=99,=E4=B8=8D=E4=BE=9D=E8=B5=96pkill/pg?= =?UTF-8?q?rep=E2=80=94=E2=80=94Git=20Bash=E5=AE=9E=E6=B5=8B=E4=B8=A4?= =?UTF-8?q?=E4=BB=B6=E5=9D=87=E7=BC=BA=E4=BD=8D=E5=9C=A8=E6=A1=88);=20gate?= =?UTF-8?q?=5Fkill=5Ftree=E5=A4=B4=E6=B3=A8=E8=A1=A5Windows=E7=BC=BApgrep?= =?UTF-8?q?=E9=80=80=E5=8C=96=E6=B3=A8=E8=AE=B0(=E5=8F=AA=E6=9D=80?= =?UTF-8?q?=E9=A1=B6=E6=A0=BC,=E8=B0=83=E7=94=A8=E6=96=B9=E6=AE=B5?= =?UTF-8?q?=E6=9C=ABkill=5Forphans=E5=85=9C=E5=BA=95);=20=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=A0=81=E5=90=88=E5=90=8C=E6=81=A2=E5=A4=8D(?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=3D=E5=91=BD=E4=BB=A4=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E9=80=80=E5=87=BA=E7=A0=81,=E8=B6=85=E6=97=B6=3D124);=20?= =?UTF-8?q?=E4=B8=89=E7=B1=BB=E8=B0=83=E7=94=A8=E6=96=B9=E5=9B=9E=E5=BD=92?= =?UTF-8?q?=E6=A0=B8=E5=AF=B9(render=5Fgate5=E5=A4=84/probe=5Fgate2?= =?UTF-8?q?=E5=A4=84/golden=E5=88=B7=E6=96=B03=E5=A4=84)=E6=97=A0=E5=88=86?= =?UTF-8?q?=E6=94=AF=E7=BF=BB=E8=BD=AC=20=E6=94=B9=E5=AE=8C=E5=8D=B3?= =?UTF-8?q?=E6=B5=8B=E8=AF=BB=E6=95=B0:=20A1=E6=8D=95=E8=8E=B7=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E8=B7=AF=E5=BE=8460s=E6=A1=A3=E8=B7=914s=E6=B4=BB=3D4?= =?UTF-8?q?.7s=E8=BF=94=E5=9B=9Eexit=3D0(=E4=BF=AE=E5=89=8D=E5=9F=BA?= =?UTF-8?q?=E7=BA=BF60.3s/124);=20A2=E7=9C=9F=E8=B6=85=E6=97=B63s=E6=A1=A3?= =?UTF-8?q?=E8=B7=9130s=E6=B4=BB=3D3.4s=E8=BF=94=E5=9B=9Eexit=3D124?= =?UTF-8?q?=E6=AE=8B=E7=95=990;=20A3=E5=A4=B1=E8=B4=A5=E7=A0=81=E7=A9=BF?= =?UTF-8?q?=E9=80=8Fexit=3D7(=E4=BF=AE=E5=89=8D=E8=AF=AF=E6=8A=A5124);=20A?= =?UTF-8?q?4=E7=BB=88=E7=AB=AF=E7=9B=B4=E8=B7=914.6s=20exit=3D0;=20B?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E9=97=B8=E5=85=A8=E9=87=8F=E3=80=90=E5=85=A8?= =?UTF-8?q?=E7=BB=BF=E3=80=91(=E4=BF=AE=E5=90=8E=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E5=85=A5=E5=8F=A35=E6=AC=A1=E8=B0=83?= =?UTF-8?q?=E7=94=A8:=E5=86=B7=E5=AF=BC=E5=85=A5+shot/fx/board/lmap?= =?UTF-8?q?=E5=9B=9B=E6=AE=B5,golden=E9=80=90=E5=83=8F=E7=B4=A07=E5=9B=BE?= =?UTF-8?q?=E5=85=A8=E8=BF=87,=E6=89=B9=E6=9C=AB=E6=AE=8B=E7=95=990);=20--?= =?UTF-8?q?docs=E3=80=90=E9=AA=8C=E6=94=B6=E9=80=9A=E8=BF=87=E3=80=91?= =?UTF-8?q?=E6=97=A0=E6=96=B0=E5=A2=9E=E7=BA=A2=20=E6=94=B6=E5=8F=A3:=20?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95=E3=80=8C=E9=97=B8=E6=9C=BA?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E5=AE=88=E5=8D=AB=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=8D=E6=9D=A1=E7=9B=AE=E6=95=B4=E6=9D=A1=E5=88=A0?= =?UTF-8?q?=E9=99=A4(=E7=8A=B6=E6=80=81=E6=9C=BA=E5=87=BA=E5=8F=A3=3D?= =?UTF-8?q?=E5=AE=8C=E6=88=90,=E5=87=AD=E6=8D=AE=3D=E6=9C=AC=E6=89=B9?= =?UTF-8?q?=E8=AF=BB=E6=95=B0);=20mac=E4=BE=A7=E5=87=AD=E6=8D=AE=E6=8C=82?= =?UTF-8?q?=E8=B4=A6=E9=9A=8F=E4=B8=8B=E6=AC=A1Mac=E8=B7=91=E6=89=B9(?= =?UTF-8?q?=E8=BD=BD=E4=BD=93=3D=E5=85=B3=E5=8D=A1=E8=A7=86=E5=8F=A3?= =?UTF-8?q?=E4=B8=A4Shot=E5=9F=BA=E7=BA=BFmac=E4=BE=A7=E5=86=BB=E7=BB=93?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E9=82=A3=E8=B6=9F=E5=BF=85=E8=B7=91=E7=9A=84?= =?UTF-8?q?golden=E5=88=B7=E6=96=B0420s=E6=A1=A3);=20=E8=BF=9C=E7=AB=AFCI?= =?UTF-8?q?=E7=BA=AF=E9=97=B8=E4=BB=B6=E6=89=B9=E9=A2=84=E8=AE=A1=E9=9B=B6?= =?UTF-8?q?=E8=A7=A6=E5=8F=91,mac=E8=AF=BB=E6=95=B0=E6=8C=89=E3=80=8C?= =?UTF-8?q?=E6=9C=AA=E9=AA=8C=E3=80=8D=E5=8F=A3=E5=BE=84=E5=91=88=E6=8A=A5?= =?UTF-8?q?=E4=B8=8D=E5=85=85=E7=BB=BF=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/gate_platform.sh | 30 +++++++++++++++++++++--------- 待办清单.md | 8 -------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/tools/gate_platform.sh b/tools/gate_platform.sh index 8847cae3..15ae5f70 100644 --- a/tools/gate_platform.sh +++ b/tools/gate_platform.sh @@ -20,6 +20,8 @@ gate_game_path() { # 杀整棵进程树()——递归杀子进程后杀本进程。macOS/Linux 走 pgrep -P; # Windows 侧 MSYS kill 对其可见进程有效,带 wrapper 树的场景仍由调用方原 taskkill /T 逻辑负责。 +# 注意:Windows Git Bash 实测无 pgrep/pkill(2026-11-08 修复批)——本函数在 Windows 退化成只杀 +# 顶格进程,引擎子进程残留由调用方段末 kill_orphans 清场兜底(probe_gate/render_gate 均有段后清点)。 gate_kill_tree() { local p c kill -9 "$1" 2>/dev/null @@ -29,26 +31,36 @@ gate_kill_tree() { # 带超时执行(coreutils timeout 的纯 bash 替代,双平台同语义): # gate_run_timeout <秒> <日志路径> <命令...> # 命令输出重定向到日志;退出码=命令退出码,超时=124(与 coreutils 语义一致,判据与既有闸一致)。 -# 实现=后台启动+守卫落标志文件(probe_gate run_suite 同款手法:taskkill 强杀后 wait 报 0 的 -# 假绿以标志文件纠偏);超时先杀整树再回 124。 +# 实现=后台启动+守卫轮询(守卫每 0.2 秒醒一次,看两样:停止文件在不在/到点没; +# 命令先完时父流程放停止文件,守卫看见即自己退场——没有嵌套长 sleep,从机制上无孤儿可留; +# 2026-11-08 修复批:旧版 mktemp 建标志文件「建时即真」致退出码恒 124+守卫被杀留孤儿 sleep +# 占输出管道至满档);到点未见停止文件=真超时:落标志文件+杀整树+回 124。 gate_run_timeout() { local t="$1" log="$2"; shift 2 - local kf - kf="$(mktemp "${TMPDIR:-/tmp}/gatetime_XXXXXX")" + local kf stop + kf="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.kf" # 只赋路径、不建文件——建时即真=旧缺陷病根(probe_gate run_suite 同款) + stop="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.stop" + rm -f "$kf" "$stop" "$@" >"$log" 2>&1 & local pid=$! - ( sleep "$t" 2>/dev/null - touch "$kf" - gate_kill_tree "$pid" + ( end=$((SECONDS+t)) + until [ -f "$stop" ] || [ "$SECONDS" -ge "$end" ]; do + sleep 0.2 2>/dev/null || sleep 1 + done + if [ ! -f "$stop" ]; then + touch "$kf" + gate_kill_tree "$pid" + fi true ) & local guard=$! wait "$pid"; local st=$? - kill "$guard" 2>/dev/null; wait "$guard" 2>/dev/null + touch "$stop" # 放停止文件=通知守卫收工,0.2 秒内自退,无需 kill + wait "$guard" 2>/dev/null if [ -f "$kf" ]; then gate_kill_tree "$pid" st=124 fi - rm -f "$kf" + rm -f "$kf" "$stop" return "$st" } diff --git a/待办清单.md b/待办清单.md index bccdc129..8f363bba 100644 --- a/待办清单.md +++ b/待办清单.md @@ -391,14 +391,6 @@ **状态**:待执行 -#### 闸机超时守卫缺陷修复——gate_run_timeout 标志文件恒真(2026-11-06 登记,来源=批次移交) - -**实况**:tools/gate_platform.sh 的 gate_run_timeout 用 mktemp 预建超时标志文件,判据 `[ -f ]` 建时即真、超时态无法与正常完成区分(Windows Git Bash 实测直接调用 4 秒返回 124;远端各闸以工件锚定未受影响)。连带 tools/golden_baseline_refresh.sh 的 guard 子Shell sleep 420 未被 kill 短路(重采集等待 7 分钟症状)。修法=kf 先赋路径+rm -f 后置守卫(probe_gate.sh:97 run_suite 同款正确写法)。证据=tools/gate_platform.sh:37/:48+迭代53实现报告遗留呈报 1(git 历史可考)。 - -**改动面**:工具代码 - -**状态**:待执行 - #### 关卡视口两 Shot 基线 mac 侧冻结(2026-11-06 登记,来源=批次移交) **实况**:golden/windows/ 已锚 lmap_entry/lmap_boss(提交 6394abf7);mac 子目录无该两 Shot——渲染闸对 mac 缺基线记 SKIP 不判红,两平台同盯缺一。义务=Mac 侧跑 tools/golden_baseline_refresh.sh --lmap 冻结 mac 基线并呈报确定性读数。证据=game/tests/golden/README.md 现持清单行与时效判定纪律行+迭代53实现报告遗留 2(git 历史可考)。 From b8125cde0cd91708ab7776696a01af5047d11eec Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 01:22:47 +0800 Subject: [PATCH 06/16] =?UTF-8?q?=E7=BC=96=E6=8E=92(=E8=BF=AD=E4=BB=A357):?= =?UTF-8?q?=20=E7=BC=96=E5=85=A5=E4=B8=A4=E5=8D=A1=E2=80=94=E2=80=94?= =?UTF-8?q?=E8=90=A5=E5=9C=B0=E5=9C=BA=E6=99=AF=E9=87=8D=E6=8E=92=E6=8E=A5?= =?UTF-8?q?=E7=BA=BF(1.75=E6=97=A5,=E5=85=88)+=E6=A3=8B=E7=9B=98=E7=93=A6?= =?UTF-8?q?=E7=89=87=E4=B8=8E=E7=AB=8B=E4=BD=93=E8=A1=A8=E7=8E=B0=E9=87=8D?= =?UTF-8?q?=E5=81=9A(9.5=E6=97=A5,=E5=90=8E),=20=E5=90=88=E8=AE=A111.25?= =?UTF-8?q?=E4=B8=AA=E5=B7=A5=E4=BD=9C=E6=97=A5=E8=B6=8510=E6=97=A5?= =?UTF-8?q?=E7=BA=BF=E3=80=94=E7=94=A8=E6=88=B7=E7=89=B9=E6=89=B92026-11-0?= =?UTF-8?q?8=E3=80=95;=20=E5=BE=85=E5=8A=9E=E4=B8=A4=E5=8D=A1=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E7=8A=B6=E6=80=81=E6=8E=A8=E8=BF=9B=E5=B7=B2=E7=BC=96?= =?UTF-8?q?=E8=BF=AD=E4=BB=A357=E3=80=82=E9=A2=84=E6=A3=80=E5=87=AD?= =?UTF-8?q?=E6=8D=AE(=E5=8F=AA=E8=AF=BB=E5=AD=90=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E5=AE=9E=E6=A0=B8):=20=E8=90=A5=E5=9C=B0=E5=8D=A1=E9=9B=B6P1(P?= =?UTF-8?q?2=C3=971=E5=8D=A1=E5=A4=B4art-bible=E7=89=88=E6=9C=ACv3.48?= =?UTF-8?q?=E6=9C=AA=E9=9A=8F=E7=8E=B0=E8=A1=8Cv3.51/P3=C3=973=E8=A1=8C?= =?UTF-8?q?=E5=8F=B7=E5=B0=8F=E6=BC=82),=20=E6=A3=8B=E7=9B=98=E7=93=A6?= =?UTF-8?q?=E7=89=87=E5=8D=A1P1=C3=971=3D=C2=A712=20battle.md=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E9=94=9A8=E5=A4=84=E6=95=B4=E4=BD=93+42=E8=A1=8C?= =?UTF-8?q?=E6=BC=82=E7=A7=BB(=E7=9C=9F=E5=AE=9E=E5=88=A4=E6=8D=AE:179-187?= =?UTF-8?q?/:205/:207/:349-355)=E7=BB=8F=E7=94=A8=E6=88=B72026-11-08?= =?UTF-8?q?=E8=AE=A4=E8=B4=A6=E6=94=BE=E8=A1=8C=E3=80=82=E5=8C=BA=E5=86=85?= =?UTF-8?q?=E8=AF=BB=E6=95=B0:=20pipeline=5Fgate=20PASS(=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?42/=E6=80=BB=E8=A1=A857/=E4=BA=A4=E5=8F=89=E6=A0=B84=E9=93=BE/?= =?UTF-8?q?=E5=8D=A1=E7=89=874=E5=BC=A0)+--docs=E3=80=90=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E3=80=91=E6=97=A0=E6=96=B0=E5=A2=9E=E7=BA=A2?= =?UTF-8?q?(receipt.json)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roadmap.md | 1 + 待办清单.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/roadmap.md b/roadmap.md index a15996be..72e347da 100644 --- a/roadmap.md +++ b/roadmap.md @@ -90,6 +90,7 @@ | 迭代 54 | 已完成(2026-11-07) | 已退役(git 历史可考) | 2026-11-07 | ≈8.625 个工作日 | 已退役(git 历史可考) | | 迭代 55 | 已完成(2026-11-07) | 已退役(git 历史可考) | 2026-11-07 | ≈8.75 个工作日 | 已退役(git 历史可考) | | 迭代 56 | 待开工 | reports/需求卡片-结算期文字列表退役批-2026-11-07.md
reports/需求卡片-封印动作改版批-2026-11-07.md | 2026-11-07 | ≈12.25 个工作日〔用户特批 2026-11-07 超 10 个工作日〕 | — | +| 迭代 57 | 待开工 | reports/需求卡片-营地场景重排接线-2026-11-07.md
reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md | 2026-11-08 | ≈11.25 个工作日〔用户特批 2026-11-08 超 10 个工作日〕 | — | - 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。 - 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。 diff --git a/待办清单.md b/待办清单.md index 483cf56e..f0a3b229 100644 --- a/待办清单.md +++ b/待办清单.md @@ -251,7 +251,7 @@ **改动面**:文档+美术素材+游戏代码 -**状态**:已写卡 +**状态**:已写卡+已编迭代 57 #### 营地场景重排接线——十层新矩形与游戏内终审(2026-11-07 登记,来源=批次移交) @@ -260,7 +260,7 @@ **改动面**:美术素材+游戏代码 -**状态**:文档设计已闭合+美术设计已闭合+已写卡 +**状态**:文档设计已闭合+美术设计已闭合+已写卡+已编迭代 57 #### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现) From bccc2d825d2d985f9c1f8cc9f21169554a1c187f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 03:20:22 +0800 Subject: [PATCH 07/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(MC=E6=A1=A3=E4=BD=8D?= =?UTF-8?q?=E8=A1=A8=E4=BF=AE=E8=AE=A2):=20=E4=B8=80=E6=A1=A3N=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E6=94=B6=E6=95=9B=E4=B8=BA50/100=E3=80=94=E7=94=A8?= =?UTF-8?q?=E6=88=B72026-11-08=E8=A3=81=E3=80=95=E2=80=94=E2=80=9450=3D95%?= =?UTF-8?q?=20CI=20=C2=B113.9pp/100=3D95%=20CI=20=C2=B19.8pp(=E5=8D=95?= =?UTF-8?q?=E6=AF=94=E4=BE=8B=E5=85=AC=E5=BC=8Fn=3Dz=C2=B2p(1=E2=88=92p)/E?= =?UTF-8?q?=C2=B2,p=3D0.5=E6=9C=80=E5=9D=8F=E6=83=85=E5=BD=A2=E6=8E=A8?= =?UTF-8?q?=E7=AE=97),=20=E5=88=A060(=E7=BB=93=E6=9E=84=E5=9B=9E=E5=BD=92)?= =?UTF-8?q?/170(=C2=B17.5pp)/400(=E6=BB=A1=E6=A1=A3=C2=B14.9pp=E8=B4=B4?= =?UTF-8?q?=E8=BE=B9=E8=A3=81=E5=86=B3)=E4=B8=89=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E5=8F=8Anormal=E6=BB=A1=E6=A1=A3~8=E5=88=86=E9=92=9F=E6=B3=A8?= =?UTF-8?q?=E8=AE=B0;=20=E5=8D=95=E6=AC=A1=E8=80=97=E6=97=B6=E5=88=9716?= =?UTF-8?q?=E2=80=9365=E5=88=86=E9=92=9F=E2=86=928=E2=80=9316=E5=88=86?= =?UTF-8?q?=E9=92=9F(50/100=C3=97=E5=8F=8C=E7=AD=96=E7=95=A5=C3=97?= =?UTF-8?q?=E5=8D=95=E5=B1=80=E8=B4=B9=E7=8E=87normal1.21s+perfect8.47s?= =?UTF-8?q?=E6=8E=A8=E7=AE=97);=20=E4=BE=9D=E6=8D=AE=E8=A1=8C=E4=B8=A4?= =?UTF-8?q?=E6=AF=94=E4=BE=8B=E5=8A=9F=E6=95=88=E5=85=AC=E5=BC=8F=E4=BF=9D?= =?UTF-8?q?=E7=95=99(=E4=BA=8C=E6=A1=A3=E5=88=A4=E8=AF=BB=E5=8A=9B?= =?UTF-8?q?=E2=89=A5~40pp=E4=BB=8D=E7=94=B1=E5=85=B6=E6=89=BF=E8=BD=BD);?= =?UTF-8?q?=20=E2=89=A560=E5=B1=80=E9=A1=BBN=3D5=20pilot=E5=89=8D=E7=BD=AE?= =?UTF-8?q?=E9=98=88=E5=80=BC=E6=9C=AA=E5=8A=A8;=20=E7=8E=B0=E8=A1=8C?= =?UTF-8?q?=E9=94=9An400=E7=95=99=E7=9B=98=E4=B8=8D=E5=8F=97=E5=BD=B1?= =?UTF-8?q?=E5=93=8D(=E6=97=A0=E6=95=B0=E5=80=BC=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=A6=81=E9=87=8D=E8=B7=91)=E3=80=82=E6=94=B9=E5=AE=8C?= =?UTF-8?q?=E5=8D=B3=E6=B5=8B=E8=AF=BB=E6=95=B0:=20--docs=E3=80=90?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E9=80=9A=E8=BF=87=E3=80=91=E6=97=A0=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=BA=A2(receipt.json)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sim-data/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sim-data/README.md b/sim-data/README.md index 4569f08b..7c92bbde 100644 --- a/sim-data/README.md +++ b/sim-data/README.md @@ -19,7 +19,7 @@ | 档 | 用途(唯一触发面) | 局数上限 | 单次耗时 | 判读力(能下什么结论) | |---|---|---|---|---| -| 一档·调研 | 调研/数值分析 | 总量 >40(100+ 为常用锚量级);N 按分析方案:60/档=结构回归(80% 功效 ≥25pp)/ 100=95% CI ±9.8pp / 170=±7.5pp(15pp 带半宽)/ 400 满档=±4.9pp 贴边裁决(normal 独立满档 ~8 分钟同属一档) | 16–65 分钟 | 带值判定/CI 结论仅本档可下;≥60 局须 N=5 pilot 前置 | +| 一档·调研 | 调研/数值分析 | 总量 >40(100 为常用锚量级);N 按分析方案两选一:50=95% CI ±13.9pp / 100=95% CI ±9.8pp | 8–16 分钟 | 带值判定/CI 结论仅本档可下;≥60 局须 N=5 pilot 前置 | | 二档·验证 | 数值修改后回归验证 | 总量 ≤40(每档 ≤20) | ~3.2 分钟 | 结构性大位移可判(≥~40pp;改前/改后同种子配对下 ~30pp)——带值判读不在本档 | | 三档·小调 | 小调整后快检 | 总量 ≤20(每档 ≤10) | ~1.6 分钟 | 只测不判——仅灾难级破坏(通关率腰斩级)可判 | | 四档·微量 | 微调后确认没大问题 | 总量 ≤5 | <1 分钟 | 零统计判读——通过判据=不崩+RUNSUM 字段完整+方向不反直觉 | From 908e518306c99e26c5c93c8ff633c5f568e732cc Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 03:47:33 +0800 Subject: [PATCH 08/16] =?UTF-8?q?iter56-=E5=8D=A11=EF=BC=9A=E7=BB=93?= =?UTF-8?q?=E7=AE=97=E6=9C=9F=E6=96=87=E5=AD=97=E5=88=97=E8=A1=A8=E9=80=80?= =?UTF-8?q?=E5=BD=B9=E4=B8=8E=E6=97=A5=E5=BF=97=E9=9B=B6=E6=96=87=E6=A1=88?= =?UTF-8?q?(=E8=BF=AD=E4=BB=A356=E5=8D=A11):=20=E6=92=A4B=E5=8C=BA?= =?UTF-8?q?=E9=80=90=E8=A1=8C=E6=96=87=E5=AD=97=E5=88=97=E8=A1=A8(row=5Fpa?= =?UTF-8?q?cer=E6=96=87=E5=AD=97=E5=85=A5=E5=B8=A6=E4=B8=89=E8=B0=83?= =?UTF-8?q?=E7=94=A8/=E8=A1=8C=E6=A0=BC=E5=BC=8F=E5=8C=96=E5=9F=9F?= =?UTF-8?q?=E5=88=A0=E5=87=80=E2=80=94=E2=80=94FX=E6=8E=92=E6=92=AD?= =?UTF-8?q?=E9=93=BE=E9=9B=B6diff=E4=BF=9D=E7=95=99)+=E6=97=A5=E5=BF=97ste?= =?UTF-8?q?p=E8=A1=8C=E9=9B=B6=E6=96=87=E6=A1=88(text/display=5Fname?= =?UTF-8?q?=E4=B8=8D=E8=90=BD=E7=9B=98)+reward=5Fineffective=E5=85=AD?= =?UTF-8?q?=E5=8F=91=E5=B0=84=E7=82=B9=E8=A1=A5reason=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=8C=96(full=5Flayers/full=5Fhp/no=5Fenemy=5Falive/hero=5Fdow?= =?UTF-8?q?n);=20=E5=88=86=E6=9E=90=E5=B7=A5=E5=85=B7=E6=94=B9=E8=AF=BB?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8C=96=E5=AD=97=E6=AE=B5(target=3D=3Dall?= =?UTF-8?q?=5Fenemies/reason=E4=BC=98=E5=85=88text=E5=85=9C=E5=BA=95?= =?UTF-8?q?=E5=8F=8C=E5=88=86=E6=94=AF)+analyze=5Fparity=5Fcheck=E5=AF=B9?= =?UTF-8?q?=E6=8B=8D=E8=BD=BD=E4=BD=93=E3=80=82=E8=AF=BB=E6=95=B0:=20R1?= =?UTF-8?q?=E9=9B=B6=E9=80=90=E8=A1=8C=E6=96=87=E5=AD=97/R2=20FX=E9=93=BE?= =?UTF-8?q?=E8=A1=8C=E5=9E=8B=E5=88=86=E5=B8=83=E7=8B=AC=E7=AB=8B=E6=8E=A8?= =?UTF-8?q?=E5=AF=BC=E9=80=90=E4=BD=8D=E4=B8=80=E8=87=B4/R3=E9=9B=B6?= =?UTF-8?q?=E6=96=87=E6=A1=88+=E5=85=A8=E5=AD=97=E6=AE=B5=E8=90=BD?= =?UTF-8?q?=E7=9B=98/R4=E5=88=A4=E8=AF=BB=E7=AD=89=E4=BB=B7=E4=B8=89?= =?UTF-8?q?=E8=AF=BB=E6=95=B0=E5=85=A8=E4=B8=80=E8=87=B4/R5=E5=9B=9B?= =?UTF-8?q?=E7=B1=BBreason=E9=80=90=E4=B8=80=E5=91=BD=E4=B8=AD=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=90=84T=E6=8F=90=E4=BA=A4=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E8=BD=BD;=20=E8=83=BD=E5=8A=9B=E8=A1=8C:137/:138=E5=90=8D?= =?UTF-8?q?=E5=AE=9E=E4=B8=80=E8=87=B4(=5Fsmoke=5Fsettle=5Fzero=5Frows/=5F?= =?UTF-8?q?assert=5Ffx=5Fchain/=5Fassert=5Fno=5Ftext=5Fand=5Ffull=5Fpayloa?= =?UTF-8?q?d/=5Fassert=5Ffour=5Freasons);=20=E6=B5=8B=E8=AF=95=E5=89=8A?= =?UTF-8?q?=E5=BC=B1=E5=85=A8=E9=83=A8=E7=94=B3=E6=8A=A5=E5=86=85(=C2=A710?= =?UTF-8?q?=E6=B8=85=E5=8D=95+=C2=A75.5=E5=90=8C=E7=94=9F=E6=AD=BB?= =?UTF-8?q?=E6=B3=A2=E5=8F=8A=E9=9D=A211=E5=A4=84=E7=99=BB=E8=AE=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=8A=A5=E5=91=8A);=20=E4=B8=AD=E6=A1=A3?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- design/art/art-assets-checklist.md | 10 +- design/art/art-bible.md | 139 +++-- design/art/asset-path-map.md | 2 +- design/art/camp-scene-prompts.md | 3 +- design/engineering/process-conventions.md | 2 +- design/gdd/08-Alpha版本标准.md | 2 +- design/gdd/systems/表现与支撑/HUD框架.md | 8 +- design/gdd/术语表.md | 11 +- design/ux/battle.md | 174 ++----- game/core/damage_controller.gd | 2 +- game/core/reward_grant.gd | 6 +- game/core/settlement/combat_segment.gd | 2 +- game/core/settlement/grant_segment.gd | 2 +- game/presentation/main.gd | 11 +- game/presentation/main_ui_build.gd | 1 - game/presentation/playtest_logger.gd | 7 +- game/presentation/row_pacer.gd | 16 +- game/presentation/views/battle_log_view.gd | 210 +------- game/probe/ui_click_probe.gd | 36 +- game/tests/README.md | 14 +- game/tests/golden/README.md | 8 +- game/tests/run_all.gd | 3 + .../reward_ineffective_reason_test.gd | 138 +++++ game/tests/unit/core/feat_vouchers_test.gd | 25 +- .../presentation/battle_log_zero_text_test.gd | 105 ++++ .../unit/presentation/pacing_queue_test.gd | 126 ++++- .../presentation/player_copy_sweep_test.gd | 16 +- .../playtest_logger_step_fields_test.gd | 108 ++++ .../presentation/theme_projection_test.gd | 115 +++-- .../需求卡片-二三关棋盘观感批-2026-10-16.md | 292 +++++++++++ ...‚卡片-棋盘瓦片与立体表现重做批-2026-11-07.md | 484 ------------------ .../需求卡片-营地场景重排接线-2026-11-07.md | 271 +++------- roadmap.md | 3 +- sim-data/README.md | 2 +- tools/analyze_parity_check.py | 92 ++++ tools/analyze_playtest.py | 31 +- tools/gate_platform.sh | 30 +- tools/hooks/pre-merge-commit | 4 +- 待办清单.md | 43 +- 40 files changed, 1258 insertions(+), 1298 deletions(-) create mode 100644 game/tests/unit/battle_settlement/reward_ineffective_reason_test.gd create mode 100644 game/tests/unit/presentation/battle_log_zero_text_test.gd create mode 100644 game/tests/unit/presentation/playtest_logger_step_fields_test.gd create mode 100644 reports/需求卡片-二三关棋盘观感批-2026-10-16.md delete mode 100644 reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md create mode 100644 tools/analyze_parity_check.py diff --git a/AGENTS.md b/AGENTS.md index 456dfc54..cd6a56a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ ## 运行与验证(工作目录 = 含 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-11-06 用户裁)**:主区 `git merge --no-ff` 落合并提交前,pre-merge-commit 钩子(`tools/hooks/pre-merge-commit`)自动跑 `tools/run_all_gates.sh --premerge`——冒烟测试+单元测试全套件(4 分片),热导入缓存约 2 分钟;红=合并提交不落(修红后 git commit 续合,或 git merge --abort 放弃),快进合并不触发钩子,`--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` 自举 - 单件直跑(=改完即测的最窄确认,其读数就是那一步的凭据;跨改动面的漏网由合回后远端全量档兜):冒烟测试 `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`(奖励期望);关卡完成率/难度类测量一律走全冒险 - 数值验证:`python tools/balance_verifier.py`(采集端 `res://sim/verifier_batch.gd`,报告与原始数据落 `sim-data/`) diff --git a/design/art/art-assets-checklist.md b/design/art/art-assets-checklist.md index a6a724f1..589c39eb 100644 --- a/design/art/art-assets-checklist.md +++ b/design/art/art-assets-checklist.md @@ -26,8 +26,8 @@ | 条款 | 对出图的具体要求 | |---|---| | 一句话视觉规则 | 明快的地牢,轻快的扫荡,仔细的推理——**明亮像素幻想,全年龄,非暗黑**,角色 2~3 头身 | -| 原则一「预告上格」 | 格内绘制优先级 **浮空数字与引导线(最顶)> 小人 > 封印印记 > 交互反馈 > 变异纹带 > 装饰变体 > 底色**;北侧贴花低于小人、南侧随岩体在前;任何元素禁止遮挡浮空数字与引导线;类型微光为底效泛光层,不入遮挡栈 | -| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;浮空数字暖白芯+2px 深墨描边(art-bible §3.2/§4.1);普通数字色牌退役(封印格身份字形色牌保留);未开格底亮度地板与饱和上限同 §4.1(门值定值面=互辨抽测件) | +| 原则一「预告上格」 | 格内绘制优先级 **数字(含色牌)> 小人 > 封印印记 > 变异纹带 > 装饰变体 > 底色**;任何元素禁止遮挡数字字形区;类型微光为底效泛光层,不入遮挡栈 | +| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;数字亮墨直画已开格底(对比过 WCAG AA,art-bible §4.1);色牌为复杂格底后备;未开格底亮度地板与饱和上限同 §4.1(门值定值面=互辨抽测件) | | 原则三「一砖一世界」 | 变体优先换色板不加新资产;危险状态必须**形状+颜色双通道**(色弱灰度可辨) | | 类型预读单通道(§4.6.3) | 未开格 = **类型常显微光**(五组色带 §4.2:芥末黄/黄绿/青/紫罗兰/绯红,色相+明度双码,避 300°–345° 禁入带,样张冻结);不呈现极性、不泄危险格与安全格(角嵌形状通道已不存在——微光格只留微光) | | 剪影哲学(§5.1) | **所有角色自带轮廓通道:亮色描边+落影底盘**,识别不依赖背景;四类原型见各条目 | @@ -43,7 +43,7 @@ ### 1.1 格子样张(砖面形态定稿闸)⚙ - **要什么**:一张按 art-bible §1.4 参数画成的格子风格试验图。**内容清单与验收四项以 art-bible §1.4 为唯一定义处**(含类型微光呈现组),本条只登记生产视角差异:图类型色板变体组至少两套、样张含至少一处砖缘/岛缘厚度与一格装饰立牌示例(§3.2 呈现基准)。 -- **风格/规格**:棋盘三关八色取 art-bible §4.1「三关棋盘环境八色」;语义岗 token 取 ui_kit 常量组(封印黑、危险红、奖励金、小人蓝;普通数字色牌退役,封印格身份字形色牌保留)。 +- **风格/规格**:色板 token 直接取 ui_kit 常量组(语义岗清单见 art-bible §4.1:掩尘、裸土、数字墨三档、封印黑、危险红、奖励金、小人蓝、数字色牌)。 - **验收**:art-bible §1.4 四项按序判定(数字可读性 WCAG ≥4.5:1 硬指标 → 格态三形与微光互辨灰度可辨 → 焦点预算 → 图类型换皮抽测)。**通过 = 砖面形态与色板冻结**。 - **来源**:⚙ 脚本管线自产——样张是验收闸本身,必须按圣经参数画,无复用意义。 - **现状**:验收标准已成文,**测试未跑**。 @@ -204,7 +204,7 @@ | 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 单套,不再接入) | | OGA Pixel UI 750(Kenney 作) / PixUI(CamTatz) / Handpainted stone | CC0 | 无 | ui-reuse 待审 | | DENZI public domain art | CC0 | 无 | 否决 | -| beast-cave(OGA) | CC0 | 无 | **已退役**(源包归档;地砖随 2026-11-07 棋盘地形重做退役——棋盘改程序化材质) | +| beast-cave(OGA) | CC0 | 无 | **已退役**(源包归档;地砖现行 = terrain_ 自产全套) | | JaggedStone / Screaming Brain / ExileGL / Corey Archer(OGA) | CC0 | 无 | 否决 | | Calciumtrice / Buch / bart cobblestone(OGA) | CC-BY 3.0 | **需署名** | 否决 | | LD rogue / Evert cave / poikilos underworld(OGA) | OGA-BY 3.0 | **需署名** | 否决 | @@ -212,7 +212,7 @@ | Fusion Pixel 缝合像素字体 | SIL OFL 1.1 | 保留许可证 | **已接入终稿**(全局 UI 字体;用户裁现状即终稿——单套单字重,拉丁沿用自带字形) | | DCSS dngn / Lost Garden / Cavernlock / Aftertile / Voirol / oga-zelda-like(armm1998) | CC0 | 无 | 评估否决(架构/风格不适配;zelda-like 留作干净度基准) | | Golden UI 系列 | CC-BY-SA | — | **闸④不过,未下载** | -| Gemini 生图(用户自跑) | 自产 | 无 | **已退役**(2026-11-07 棋盘地形重做;旧 terrain_ 瓦片全删) | +| Gemini 生图(用户自跑) | 自产 | 无 | **terrain_ 高墙瓦片材质源(现行定稿)** | ### 复用四闸(现行) 色板量化 / 禁入带吸色 / 灰度可辨 / 授权干净(SA 不可、来路不明不可)。 diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 2e2ee732..0451f660 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -1,10 +1,10 @@ # 美术圣经(Art Bible)— Dungeon Sweeper -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.51,历次修订明细见 git 提交史 +> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.48,历次修订明细见 git 提交史 > > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 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 为准,呈现方案以本圣经为准。 > **条款验收标注纪律(全文书写规范)**:条款尾部按三档标注验收方式——**`验收:机检〈判据>`**(可量化,脚本能断言)/**`验收:目检〈判据>`**(机器测不了,但看什么、怎么算有明确判据)/**`验收:方向性`**(气质与方向原则,不承担验收);推导源尾注「←」继续表达推导来源,与验收标注同句并存时,验收标注放句末;数值类条款推荐「**待定现用**」态(现行即执法、修订走登记,释义见 §4.1) @@ -22,7 +22,7 @@ **原则一|预告上格**(取自 Into the Breach;锚定 P1 推理的掌控感、P2 规划的延迟兑现) -继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格上绘制优先级固定:**浮空数字与引导线(最顶层,永不被遮挡) > 小人标记 > 封印印记/类型微光 > 交互反馈(悬停/路径/可挖域微光) > 变异纹带 > 装饰变体 > 岩体顶面/地面底色**,任何元素禁止遮挡浮空数字与引导线。屏幕层序按脚底行分档:顶面贴花与交互反馈随所属格件 z——北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;封印印记与封印格身份色牌固定低于小人(不参与南侧前推);信息优先级不变(北侧重叠时小人压过贴花)。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡浮空数字与引导线〉 +继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格内绘制优先级固定:**数字(含色牌) > 小人标记 > 封印印记 > 变异纹带 > 装饰变体 > 底色**,任何元素禁止遮挡数字。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡数字〉 *范围注:本原则约束"已存在的信息往哪里画",不新增信息种类;预告类信息以战斗侧 GDD 实际定义的为准(如 P2 已锁的结算来源标注),GDD 未定义的预告不因本条而存在。* @@ -30,38 +30,38 @@ **原则二|明亮为皮,明度分档为骨**(取自 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 以半透明压暗板承载信息;本作格底功能分档(信息可读性服务)。验收:机检〈1–8 全档数字对所在已开格底对比 ≥4.5:1〉 -*设计测试:当格子美术与数字可读性冲突时,先调岩顶/地面明度档,禁止使用数字底牌,不动浮空数字画法。* +*设计测试:当格子美术与数字可读性冲突时,先调格底明度档,复杂格底垫色牌后备,不动格子画。* **原则三|一砖一世界**(融合 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 格子样张测试(验收标准) -> 立意:扫雷数字可读性与暗色氛围相冲突,由一次格子样张测试定风格,具体形态由样张测试定稿。**样张** = 一张按本圣经参数画成的格子风格试验图,是棋盘地形形态(岩体+地面+浮空数字)的定稿闸——样张通过前,§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〉 -2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;合并岩体不改变三态分类——未开 = 抬升岩体,已开 = 连续地面,雷 = 地面上的巢穴纹;明度差(岩顶亮/地面暗)与巢穴形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下封印印记、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入浮空数字占位区,明度梯度禁止压破岩顶/地面明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉 -3. **焦点预算成立(§3.4)**:任意一格至多一个信息完整凸形(浮空数字/小人/封印印记);岩体为连续地形,不作单格凸形计;数字所在格无第二信息焦点。验收:目检〈任一格至多一个信息完整凸形,数字所在格无第二焦点〉 -4. **图类型换皮抽测(§4.3)**:变体组中浮空数字字芯/描边、封印黑、危险红、奖励金、小人蓝、类型微光五组恒定不动;变体岩顶/地面底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体岩顶/地面底仍过第 1、2 项〉 +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 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉 +3. **焦点预算成立(§3.4)**:任意一格至多一个完整凸形;数字所在格无第二焦点。验收:目检〈任一格至多一个完整凸形,数字所在格无第二焦点〉 +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 提交史) -**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 浮空描边字(暖白字芯 + 2px 深墨描边 + 双色引导线,值见 §4.1/§3.2);普通数字色牌退役(封印格身份字形色牌保留,见 §3.2 封印印记条);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉 +**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 亮墨三档直画 + 色牌后备(值见 §4.1);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉 --- @@ -159,31 +159,29 @@ ### 3.2 环境几何 -- **雷图棋盘呈现基准**:战棋地块质感 × 正俯视角——取 ITB 参考图(`references/itb_1.jpg`)的地表质感骨架:地块纹理多样、起伏体块感、岛缘/砖缘厚度;但相机一律正上方垂直向下,格线屏轴对齐,**禁等距/斜视角与菱形格**;形状语言仍守总纲圆角方形。**立体表现取抬升合并岩体+南/东崖面**(2026-11-07 用户裁,采 Link's Awakening 原版/DX 2D 的台面抬升与崖面观感,2019 重制 3D 立体模型版不作参考);砖缘厚度与岛缘立体面属形体塑造(岩顶/地面仍守 §4.1 参数域)。装饰小立牌属 ITB 参考的观感元素,本作不采用;装饰变体走氛围层纪律(纹理级/物件级形状家族,见下方装饰变体条),零信息纪律以原则三为准。验收:目检〈棋盘正俯视、格线屏轴对齐、无菱形格;未开格呈抬升合并岩体+南/东崖面〉 ←原二;原三;§2 -- **地形**:一切环境体由同一圆角方形衍生:未开 = 抬升岩体(完整),已开 = 连续地面(挖出空间),雷 = 地面上的巢穴纹(危险格玩家说法见《排雷玩法》);只以“完整/挖开”叙事,不为状态新造形。验收:目检〈三格态仅以完整/挖开与巢穴纹区分,无新造状态形〉 ←原三;P4 -- **装饰变体(未开格氛围层)**:抬升岩体的顶面之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三 -- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于格面边缘,格心留白(数字已迁浮空层,格面纹样不再需要给字形让位;封印格身份字形走色牌例外,见封印印记条,仍禁止升到浮空层);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且格心留白;巢穴纹更凶一档〉 ←原三;P3 -- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。微光画在抬升后的岩顶面内,锚点随岩顶偏移(−ESHIFT/−LIFT),禁止越出本格岩顶。验收:目检〈微光格内零角嵌/箭头/加号类附加形;微光不越本格岩顶〉 ←原一;原三 -- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../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 -- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间/地面)一侧、不进岩体(岩体抬升不改变接触带的逻辑格边;光画在地面侧,不贴岩顶;与装饰变体零冲突);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边;光不进岩体〉 ←§2.1;§4.2;P1 -- **岩体**:圆角岩体堆叠/合并,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈岩体无尖刺装饰〉 ←原三 -- **棋盘地形体系|术语与定义**:未开格 = **抬升岩体**——连通的未开格(四邻:上下左右;斜角不连)合并为一块岩体,共享一块岩顶与连续崖面;已开格 = **连续地面**。素材语义名——岩顶材质 = **大岩板**,南/东崖面材质 = **崖面**,已开地面 = **地面**;**不做逐格自含瓦片**,Tiny Dungeon 拼块套与逐格 16+5 墙/地瓦片套均退役(2026-11-07 用户裁)。验收:目检〈连通未开格共享一块岩顶与连续崖面,无逐格拼缝〉 ←原三 -- **棋盘地形体系|投影与搭接**:整块岩顶向北偏西抬升——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;崖面不越格〉 -- **棋盘地形体系|受光与崖面**:光照 = **北/西受光**(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 深墨。验收:目检〈北/西亮棱、南/东内阴影与崖面层理;南崖不越下一行、东崖不越下一列;无竖条纹〉 -- **棋盘地形体系|材质与装饰**:岩顶 = **大岩板**(低频率斑驳 + 稀疏大板块缝 + 板缘浮雕倒角,单块材质覆盖整块岩体;禁逐格小砖纹与逐格边框);地面 = 连续暖褐土(低对比石屑、碎石斑;无缝,禁逐格砖缝);装饰变体 = 岩顶材质内的低对比裂纹/麻点/碎石贴花,走原则三零信息纪律,不新增逐格资产。验收:目检〈岩顶为单块大岩板、无逐格拼缝;地面连续无缝;装饰不构成逻辑线索〉 -- **棋盘地形体系|投影与整板悬崖**:南/东临空岩体在地面投 4 段 ×4px 渐隐影(黑 α 0.44/0.30/0.16/0.07,自崖面外缘起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影,色取棋盘环境子板(§4.1)。验收:目检〈南/东投影四段渐隐;整板悬崖结构件齐备〉 -- **棋盘地形体系|绘制序与遮挡**:层序 = 地面(封印格地面铺本关受光棱色封印石)→ 投影 → 数字所属格的**地面阴影圆**(开启格地面,位于小人之下,小人站该格时遮住圆)→ **按脚底 y 排序的深度对象**(岩体 = 其最南格格底;小人 = 所在格格底;升序绘制,南侧岩体自然遮住小人脚底)→ 顶面贴花(类型微光/变异纹带,随岩顶锚点偏移 −ESHIFT/−LIFT;只在未开格岩顶)与交互反馈(悬停/路径/可挖域微光)随所属格件同序——北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;封印印记与封印格身份色牌在已揭示地面、固定低于小人(不参与南侧前推)→ **浮空数字+引导线(最顶)**。验收:机检〈深度对象按脚底升序绘制;格件贴花/交互随脚底行分档;浮空层 z 最高〉+目检〈南侧岩体遮住小人脚底;顶行数字越出棋盘仍完整〉 -- **棋盘地形体系|浮空数字(信息层)**:数字与格面字形(危/?)脱离格面,浮在格上方——**封印格除外**,其身份字形按封印印记条垫色牌叠于法阵之上、不进浮空层;字高 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〉+目检〈顶行数字与引导线完整;阴影圆指向正确格〉 -- **棋盘地形体系|旧资产处理**:旧 `terrain_*` 63 件(16 墙瓦片 + 5 地面变体,三关各一套)全部退役——无参考价值者直接删除,不归档;`seal_mark.png` 保留(战末金蜡封专用)。验收:机检〈旧 terrain_* 零引用、零在库;seal_mark 在库〉 -- **变异格形状通道**(双通道之"形",与色无关):岩体外形由合并岩体决定、不因变异改变;变异纹带画在本格抬升岩顶面内缘(锚点随岩顶偏移 −ESHIFT/−LIFT),一圈定宽专属几何纹带(纹带形全作不与他类共用),格心留白(数字已迁浮空层;封印印记在已揭示地面承载,不与变异纹带同格);验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入浮空数字与引导线占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于浮空数字/小人/封印印记);原三 +- **雷图棋盘呈现基准**:战棋地块质感 × 正俯视角——取 ITB 参考图(`references/itb_1.jpg`)的地表质感骨架:地块纹理多样、起伏体块感、岛缘/砖缘厚度、格上装饰小立牌;但相机一律正上方垂直向下,格线屏轴对齐,**禁等距/斜视角与菱形格**;形状语言仍守总纲圆角方形。砖缘厚度与岛缘立体面属形体塑造(顶面格底仍守 §4.1 参数域)。装饰小立牌属 ITB 参考的观感元素,本作不采用;装饰变体走氛围层纪律(纹理级/物件级形状家族,见下方装饰变体条),零信息纪律以原则三为准。验收:目检〈棋盘正俯视、格线屏轴对齐、无菱形格〉 ←原二;原三;§2 +- **地砖**:一切环境体由同一圆角方形衍生:未开 = 完整凸砖,已开 = 同形缺角碎裂,雷 = 碎裂加巢穴纹(危险格玩家说法见《排雷玩法》);只以"完整度"叙事,不为状态新造形。验收:目检〈三格态仅以完整度区分,无新造状态形〉 ←原三;P4 +- **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三 +- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且砖心留白;巢穴纹更凶一档〉 ←原三;P3 +- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §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 数字 > 印记)垫色牌叠于法阵之上,印记与数字同格合法。格内栈位见 §1.2;层序纪律——印记层低于小人,且迷雾态(区外全黑/记忆态)隐藏(§6.5「封印随格隐没」)。封印特效两件:常显形态即本件,施印瞬间未实装。战末金蜡封徽记仍取贴图 `seal_mark.png`(与棋盘侧参数化绘制并存,两处互不依赖)。验收:目检〈环径占格宽 82%±1px;光圈只在环外且不出格;纯黑无色相〉 ←原一;P2 +- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边〉 ←§2.1;§4.2;P1 +- **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈墙体无尖刺装饰〉 ←原三 +- **高墙瓦片体系|术语与定义**:未挖格 = **一整块 32×32 自含凸起岩体**;素材语义名——未开格素材 = **墙瓦片**,已开格素材 = **地面瓦片**。瓦片以自含岩体为单位,Tiny Dungeon 拼块套不进自含岩体定义,不作瓦片参考。验收:目检〈未开格为整块凸起岩体,无拼块接缝感〉 ←原三 +- **高墙瓦片体系|边界墨线纪律**:墙瓦片与相邻格分界一律 1px 深墨线、直线贴格边、零锯齿;墨线职责 = 分隔,不追求与地面融合。验收:目检〈分界为 1px 深墨直线贴格边、零锯齿〉 +- **高墙瓦片体系|光照纪律(单一北受光)**:北缘 = 墨线内侧 1px 微亮棱(就地取色提亮,禁宽亮带);西/东缘 = 墨线后直进纹理、不加修饰;南缘 = 墨线 + 立面窄暗条(约 1/3 格高,横层理叠石、禁竖条纹栅栏感)。验收:目检〈北缘亮棱、南缘窄暗条;无宽亮带、无竖条纹栅栏感〉 +- **高墙瓦片体系|凹角收头**:角点单像素落线;南立面侧凹角加 1px 立面收头——带身与转角竖线同列收尾,禁悬空、禁突出。验收:目检〈凹角收头与转角竖线同列,无悬空突出〉 +- **高墙瓦片体系|现行定稿**:`game/assets/art/board/terrain_*`(16 唯一墙瓦片 + 5 地面瓦片变体;词表与查表逻辑落码于 `board_world.gd`)。验收:机检〈terrain_* 素材 16 墙瓦片 + 5 地面变体在库,查表逻辑与词表一致〉 +- **高墙瓦片体系|高墙感 D 投影档与整板悬崖**:南临空墙格 = 立面口沿高光 2px `#C9AF83`(201,175,131——代码色 `BRICK`,与掩尘枚同源单点) + 双段暗带(0.16/0.25 格边,黑罩 α0.60/0.82);北邻墙地面格 = 三段渐隐投影(顶带 0.22 格边,α0.28 起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 列分隔竖缝 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影(游戏 `board_world.gd` 同款结构件,样张脚本与游戏渲染常量同源)。验收:目检〈南临空墙格呈口沿高光+双段暗带;北邻墙地面格呈三段渐隐投影;整板悬崖结构件齐备〉 +- **变异格形状通道**(双通道之"形",与色无关):底砖圆角外轮廓不变,砖面内缘绘一圈定宽专属几何纹带(纹带形全作不与他类共用),砖心留白予数字与封印印记;验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入数字字形占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于数字/小人/封印印记);原三 ### 3.3 UI 形状语法(方向指导,细则见 §7.1) -**方向指导**:半拟物——容器穿戏服、数据素面;圆角 = 可触摸的物件,直角 = 须精确的信息(总纲「圆角为世,直线为信」的 UI 侧落法)。画法细则(面板/按钮/蜡封/参考分界)成文于 **§7.1**。验收:方向性 ←原二;§2.4 +**方向指导**:半拟物——容器穿戏服、数据素面;圆角 = 可触摸的物件,直角 = 须精确的信息(总纲「圆角为世,直线为信」的 UI 侧落法)。画法细则(面板/按钮/蜡封/数字色牌/参考分界)成文于 **§7.1**。验收:方向性 ←原二;§2.4 ### 3.4 主角形状与对比预算 -显著度 = 完整度:**每格至多一个信息完整凸形**(浮空数字/小人/封印印记,依 1.2 优先级让位)。岩体为连续地形,不作单格凸形计;装饰变体贴岩顶分布、不构成第二完整凸形(§4.6);浮空数字的引导线与阴影圆随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算。岩体与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个信息完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3 +显著度 = 完整度:**每格至多一个"完整凸形"**(数字/小人/封印印记,依 1.2 优先级让位;装饰变体贴砖缘分布、不构成第二完整凸形——§4.6;数字色牌随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算),底砖与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3 --- @@ -195,24 +193,17 @@ ### 4.1 主色板 -- **掩尘 `#9C8462`**|未开格**岩体顶面基色**(覆尘完整岩体):全作的"未知",画面最大沉默面;原 `#C9AF83` 收缩为受光棱/口沿高光专用(代码 `BRICK` 保留为高光锚色,不再作未开格基色)。验收:机检〈未开格岩顶基色 = #9C8462;#C9AF83 只作受光棱/口沿高光〉 ←原二;§2.1 -- **裸土 `#695038`**|已开格**连续地面基色**:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格岩体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(样张实测 L≈0.09)。验收:机检〈已开格地面基色 = #695038,L 落 0.08–0.14〉 ←原三 -- **棋盘环境子板(分层②,不占 48 token 额度)**|现行基座档八色:岩顶 `#9C8462`、地面 `#695038`、崖面 `#403325`、板块缝 `#64523A`、倒角亮 `#CCB288`、倒角暗 `#766248`、临空墨线 `#261E15`、受光棱 `#C9AF83`;单张像素域 ≤32,三关按 §4.3 换色不新增 token。验收:机检〈八色在册、单张像素域 ≤32〉 - - **三关棋盘环境八色(2026-11-07 用户看样张通过,冻结)**:槽位顺序 = 岩顶/地面/崖面/板块缝/倒角亮/倒角暗/临空墨线/受光棱。 - - 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〉 +- **掩尘 `#C9AF83`**|未开格底色,覆尘完整砖:全作的"未知",画面最大沉默面。验收:机检〈未开格底色 = #C9AF83〉 ←原二;§2.1 +- **裸土 `#B39A78`**|已开格底色,碎裂裸露:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格墙体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(更高明度底实测达不到 4.5:1,故取本带;样张已冻结,§1.4)。验收:机检〈已开格底 L 落在 0.08–0.14,对亮墨数字 ≥4.5:1〉 ←原三 +- **数字墨双色制**: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 渲染帧目视复核〉 +- **垫牌与 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° 禁入带与全部微光色带;裸土底(`#B39A78`,印记现行承载面——封印格已揭示,见 §3.2 封印印记条)明度对纯黑对比 ≈7.8:1、未开格墙顶明度 ≈113 对纯黑对比 ≥4.4:1,纯黑实心剪影单靠明度差即成立,不依赖任何浅色细件。封印紫不再用于棋盘(色史归 git 提交史);红族棋盘侧只剩危险红;主角随身背包件为朱红矩形件(人设侧见 character-design),与棋盘封印色脱钩。验收:机检〈封印宣告色 = #000000,裸土底对其对比 ≥4.5:1〉 ←原一;P2 - **危险红 `#A8321F`**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉。验收:机检〈危险语义色 = #A8321F〉 ←原三;P2 - **奖励金 `#F0A828`**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金。验收:机检〈收益语义色 = #F0A828〉 ←P2;§2.3/2.4 - **小人蓝 `#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〉 - **小人蓝亮档 `#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〉 @@ -224,7 +215,7 @@ - **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#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`)。程序化回退绘制与已落合并值的贴图保持一致。验收:机检〈①②两枚源常量全仓零引用,绘制点全部改指合并目标色〉 -**对比硬指标(可测)**:数字可读性由**浮空描边字**承载——棋盘数字字芯暖白 `#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)。未开格底槽(含全部图类型)与类型微光、已开格底之间存在**相对亮度与相对饱和关系**——禁止底槽吞没微光环、禁止底槽与已开格底同档;本节只定这层关系,阈值与准入判定由图类型色板互辨抽测的执行件承载(用法登记见 [art-pipeline-tools](art-pipeline-tools.md))。已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),封印印记、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底对微光环与对已开格底的相对亮度关系经互辨抽测准入;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9 **色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限 **48 色**(防色板无限膨胀的封口条款;**额度已用尽、余量 0**,后续余量以色板检查器实报为准);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部 <8/255**——即三通道里至少一通道 ≥8/255 即过门,「三通道差全部 <8」才算不过门(条文原写的「三通道差 ≥8/255」有「逐通道全过」与「禁止全灭」两种互斥读法,前者下现行色板 247 对不达标、与本节自认的「现行即执法」合规状态不能同真,故取后者;用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。反例实证:#3A2E22 ↔ #362B20 三通道差均 <5,肉眼不可辨,同板共存只增噪。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(色板检查器按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数 ≤48;新色入板过两道门〉 @@ -244,8 +235,8 @@ - **紫赤只说 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° 禁入带)。验收:机检〈类型微光五组色值与本表一致〉 -- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压岩顶/地面明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉 -- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破岩顶/地面明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破岩顶/地面明度档与三态分类〉 ←§4.6.3 +- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压格底明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉 +- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破格底明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破格底明度档与三态分类〉 ←§4.6.3 - **金/红兼作极性色相槽(§4.6)**:极性(概念定义与符号矩阵见《地图战斗资源》极性提案)的视觉取色只在这两族间——有利兑付 = 金族,有害兑付 = 红族,不新增语义色。验收:目检〈极性视觉取色仅金/红两族〉 ←§4.6;原二 ### 4.3 图类型色板换皮规则(board_type) @@ -257,7 +248,7 @@ - `wall_ambient` 墙雾氛围 tint:可带主题色相,L≥0.30。验收:机检〈wall_ambient tint L≥0.30〉 - `variant_tint` 变异纹带染槽:只改色相不改纹形(纹带形按轴两分,见 §3.2 变异格形状通道;种类 = 地形变异六类型已定稿)。验收:目检〈同纹带形跨图类型仅色相不同〉 -**不变槽**:棋盘浮空数字字芯/描边、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,岩顶/地面两档明度关系(岩顶亮/地面暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9 +**不变槽**:棋盘数字墨亮族三档、数字色牌(后备件)、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,格底两档明度关系(墙亮/空间暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9 ### 4.4 UI 色板(方向指导,细则迁 §7.2) @@ -269,7 +260,7 @@ 1. 已开 vs 未开:§3.2 完整/碎裂形承载,无需另加。验收:目检〈色弱模拟下两态以完整度可辨〉 2. 已开 vs 变异格:纹带形状通道,灰度截图可辨,无需另加。验收:目检〈灰度截图下变异格可辨〉 -3. 封印印记 vs 巢穴(危险格):印记形物件对格面巢穴纹,无需另加。验收:目检〈色弱模拟下印记与巢穴纹可辨〉 +3. 封印印记 vs 巢穴(危险格):印记形物件对砖面巢穴纹,无需另加。验收:目检〈色弱模拟下印记与巢穴纹可辨〉 4. 奖励金 vs 危险红(色弱下皆偏褐):§3.1 道具点两类剪影 + §3.4 满圆对刺缺 + 金粒运动,无需另加。验收:目检〈色弱模拟下奖励金与危险红可辨〉 5. Boss 紫赤 vs 其他敌:§5.1 形状独占,无需另加。验收:目检〈色弱模拟下 Boss 可辨〉 6. 小人蓝 vs 青墨数字:明度悬殊 + 小人轮廓与底盘,无需另加。验收:目检〈色弱模拟下小人与数字可辨〉 @@ -412,10 +403,10 @@ ### 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`),信息与语义层全图类型恒定——本节的三关两槽终值**已冻结**。**冻结口径(本节不抄色值字面量)**:各关 `tile_closed` 终值=该关在役墙瓦片三块底型件(素砖/裂纹/碎石斑)顶面受光档的实测最亮值,`wall_ambient` 取同关同槽值(两槽同值;同属 §4.1 分层②场景环境子板,零新增色值、不占 48 额度);实测值与准入判定只在执行件里算,执行件用法登记见 [art-pipeline-tools](art-pipeline-tools.md)。**冻结凭据**=「三关色相 × 五组类型微光」互辨抽测闭合(机检 17 项 0 红+目检四条全过;抽测样图与 2026-11-05 出图件同哈希,目检面未重跑)+ §1.4 格子样张重跑机检 30/31 绿(唯一红灯=改前/改后对拍一件,因在途素材区无改前基线件、属素材区环境坑不属色板回归,沿革查 git 提交史)——砖面形态与色板维持冻结。验收:机检〈三关行两槽终值与互辨抽测执行件的实测读数同值(该件三行铺底代表值判定全过),且本节三关行不含色值字面量〉 - **三关背景变体**:§6.1 的三张背景取本节三关方向作为岩体形态、剪影语言与色族差异(dungeon 暖石棕+地精巢穴支洞/木栈道/木桩围栏;underdark 冷蓝灰+卓尔巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;deep_underdark 灰黑+灰矮人石笋城郭/棱角石厅/矿道口/烟囱塔);背景不复用 `wall_ambient` tint(该槽作用于棋盘/世界),背景色值归战斗屏场景环境子板。验收:目检〈三关背景可辨为不同洞窟,非同一图换色〉 - **深度轴叙事**(§2.7 下探过渡):色相层进预告「更深更险」,明度档不动—— - - **dungeon 地精洞窟**(第一关):现行岩体系暖石棕(岩顶 `#9C8462` 基)即基准档,`wall_ambient` 暖棕; + - **dungeon 地精洞窟**(第一关):现行掩尘系暖石棕(`#C9AF83` 基)即基准档,`wall_ambient` 暖棕; - **underdark 幽暗地域**(第二关;方向:**冷调幽暗**):主调**灰白蓝**候选(低饱和蓝灰域,`tile_closed`),少量紫黑倾向点缀——紫系取紫罗兰域(≈256°)候选,禁入带 300°–345° 不变;`wall_ambient` 冷蓝灰; - **deep_underdark 灰矮人矿城**(第三关;方向:**灰黑主调 + 矿脉金属色点缀**候选,守 §4.1 明度地板 L≥0.30):矿脉点缀走金属质感族(冷银/铜灰候选)——「金属色」以材质感承载,奖励金亮金仍禁上格底(§4.2),不占用收益语义金;`wall_ambient` 铁灰。 - **共同纪律**:三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险);避 300°–345° 禁入带;L≥0.30、饱和 ≤0.55(§4.1 硬指标)。 @@ -431,9 +422,9 @@ - **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ 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 -- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地面材质原样 + 灰罩压顶**——地面直画后 `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 -- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与棋盘地形体系(§3.2)的整格表达、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2 +- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地板纹理原样 + 灰罩压顶**——纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动(原「程序化素色记忆板平涂」已弃用);格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。**封印印记不在记忆态面**:印记只落在未开格,区外未开格全黑——印记随格隐没、灯光区移回复显(纯呈现,封印数据零影响,现行事实源的显式推论)。←HUD框架 可访问性基线;§4.1;§3.2 +- **记忆态可读性判据**:数字对合成底**归一后(真实渲染面)三关 ≥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 - **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加规则 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉 --- @@ -444,7 +435,7 @@ ### 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 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认禁止同位(位置通道)。验收:目检〈红/金强调位有图标+文案,破坏性确认独立位〉 - **圆角率单点注记**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT = 5`(ui_kit 单点;面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持 0 直角;**例外三件保留**=标题屏底座椭圆 17/结算金印 200(圆形蜡封)/状态脉冲环 100(圆形)。验收:机检〈ui_kit 圆角取值仅 RADIUS_OBJECT 与例外三件〉 @@ -470,9 +461,9 @@ ### 7.4 字体与字号 - **字体**:全局一套像素字,单套即终稿——缝合像素字体 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 基准,同字号实际更小)。验收:机检〈静态文字位点字号 ≥ 档位表值〉 -- **字号档位表(六档)**:全站 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_*〉 -- **小字号豁免条款(合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤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,且②在册面不含该两位〉 +- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(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;静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式 `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,且②在册面不含该两位〉 - **字重纪律(字重两档不启用)**:层级手段为两件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅**;全局单字重,不上第二个字重(**重开钩子已注销**——整屏样张复核确认:屏内各级文字全部能归进本节六档字号,顺位徽标与站桩名字行两处按本节纪律提档即可,屏内实测对比全部达标(暖白对舞台底 9.49:1、GOLD_BRIGHT 6.47:1、血数 14.3:1),**未实证标题层级不足**,维持单字重,不另立条目);数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。验收:机检〈主题仅注册单字重〉/目检〈屏内标题与正文层级仅靠字号档差与墨色深浅两件即可分辨,无一处需要第二字重才读得清〉 ### 7.5 营地界面 @@ -519,12 +510,12 @@ ### 8.1 分辨率档位与格边长 - **两档定案**:1280×800(基座)+ 1920×1080,窗口不可调;后续调整走修订。验收:机检〈工程分辨率配置与两档一致〉 -- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**棋盘地形不铺逐格瓦片**(岩顶/地面/崖面材质按整板矩形与格边程序化绘制,允许连续缩放——地形材质不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈地形材质随格边/整板绘制、小人占位 ≤0.75×〉 +- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**瓦片整格铺满**(32×32 源随格边长缩放,允许非整数倍——瓦片不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈瓦片显示尺寸随格边长、小人占位 ≤0.75×〉 ### 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 清单逐项一致〉 - **显示档登记例外(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 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉 @@ -532,10 +523,10 @@ - **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× 基准,暂定;与站姿降采样可读性验证一致); - - **棋盘小人 = 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,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销; - - **封印印记参数表(绘制件,非贴图件)**:形与画法见 §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、圆心落格心、光圈不越格边〉 + - **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../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;圆心 = 格心。色 = 封印黑单色(光圈只改 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、光圈不越格边〉 - **站桩立绘显示档 = 三档绝对高**:小型 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 屏,**扫雷盘不从 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 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉 + - **站桩立绘排版**:① 区高 B 区 ≈1/3 屏 / C 区 ≈2/3 屏,**扫雷盘原尺寸不缩、格子不变**(区高事实源 = 布局表 `battle_layout.tres`;压缩由 C 区面板空档吸收);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(显示 >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〉 ### 8.3 导出格式与命名规范 @@ -556,14 +547,14 @@ - **结构件完整性**:格面立体感(高墙顶面/坡缘/角件/周界轮廓)只能来自**素材本体绘制的结构件拼装**(样例=Necesse 式缘件:专属底色+手绘细节+暗轮廓线的独立贴图);禁止以调色、渐变、明暗滤镜、跨格投影等生成手段伪造素材中不存在的结构。样稿暴露缺件时,正确动作=停下报告缺口与「换素材/自产缺件」选项,由用户裁决后执行。验收:目检〈立体感逐件来自素材本体,无滤镜伪造〉 - **参考核验**:宣称「参考 X 游戏」前,必须取得并实际查看 X 的截图证据(像素级放大核验其实现方式),证据存 `artwork/mockups/` 或 `design/art/references/`;仅凭文字资料、记忆或宏观印象作出「X 是这样做」的断言无效。验收:目检〈参考结论有截图证据在库〉 -- **图底分离**:已开地面的明度须低于未开格岩体,由材质选型承载(地面基色 `#695038` 低于岩顶 `#9C8462`),不靠渲染压暗实现。验收:机检〈已开地面明度低于岩顶面〉 +- **图底分离**:已开地面的明度须低于未开格墙体,由素材选型承载(选更暗的地板砖),不靠渲染压暗实现。验收:机检〈已开格底明度低于墙顶面〉 - **生产分工**:格面地形类素材=**材质归模型、结构归程序**——AI 生图模型只出无缝填充纹理(无边框/无亮边/均匀光照/方形);一切结构件(缘件/轮廓/立面/角件/收头)一律程序化绘制或手修,因为 autotile 任意拼接的边界像素约束超出 2D 生图模型能力(实证:生图 5×5 瓦片表每枚砖自带啃咬边框与宽亮带,提示词无法根除)。**镜像规则**:东西对称结构件只许水平翻转(flip_h)复用、**禁旋转**——北受光下东西侧缘光照对称,镜像无损真;旋转会把北受光转到东边。验收:目检〈瓦片表无自带边框/亮带;对称件仅 flip_h〉 --- ## 9. 参考与反参考(References & Anti-References) -> **白话**:正面参考 = 向谁抄什么;反面参考 = 避什么。两者同等效力——方案违反反面条款时,禁止以「参考了某游戏」辩护。参考图库存于 `design/art/references/`(原三款×2 张在库;2026-11-07 新增参考图证待补,不阻塞画法条款)。 +> **白话**:正面参考 = 向谁抄什么;反面参考 = 避什么。两者同等效力——方案违反反面条款时,禁止以「参考了某游戏」辩护。参考图库存于 `design/art/references/`(点名池三款×2 张,与头注点名池一一对应)。 ### 9.1 正面参考(点名池,用户审阅选定) @@ -572,10 +563,6 @@ | **Into the Breach** | 格内信息分层、攻击预告上格范式、战棋地块质感骨架(§1.2 原则一;§3.2) | 冷暗军事色调、压暗信息板、斜切 HUD(原则二;§3.3) | | **Moonlighter** | 暖质地砖与砖缝质感、亲和冒险者气质、木石暖色道具(原则二/原则三);**光照层次与明度纵深**(亮地板/暗深渊/发光体三档,§2 明度分层) | 全拟物倾向(§3.3 半拟物边界);Darkest 式压暗(§9.2 反面基准) | | **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);反面参考**图证**待本作素材生成后增补。验收:方向性 @@ -584,9 +571,9 @@ | 反面参考 | 违反条款 | 立法理由 | |---|---|---| | **Darkest Dungeon** 式压暗 | §9.2 反面基准(风格取向记录,非禁令——压暗属普通设计决策,逐案走样张与目检) | 失败重开,世界无光暗记忆——明亮基调下不以整屏变暗作常态表达 | -| **传统扫雷白牌/贴纸式数字承载** | §1.2 原则二(明度分档为骨);§3.2 浮空数字 | 数字由浮空描边字承载、画在世界之上;不使用数字底牌——满屏白牌=电子表格观感,非游戏画面 | +| **传统扫雷白牌/贴纸式数字承载** | §1.2 原则二(明度分档为骨) | 数字由格底明度分档承载、直画入世界;色牌仅复杂格底后备——满屏白牌=电子表格观感,非游戏画面 | | **Enter the Gungeon** 式粒子与色相爆炸 | §3.4 焦点预算;§4.2 色相纪律 | 信息层禁止被特效与杂色吞没,特效入画先过焦点预算 | | **Hades** 式特效密度 | §2.2 兑现爽感的上限 | 爽感靠逐行因果归因,不靠满屏特效;承载元素以 §2.2 清单为界 | -| **传统扫雷 1–8 八色分色** | §4.1 数字墨单色制 | 八色必撞红/金/蓝/紫赤语义色段;数字只走单色浮空字芯,字形为唯一数值载体 | +| **传统扫雷 1–8 八色分色** | §4.1 数字墨三档 | 八色必撞红/金/蓝/紫赤语义色段;数字只走墨族三档色温,字形为唯一数值载体 | --- diff --git a/design/art/asset-path-map.md b/design/art/asset-path-map.md index 79366e99..381edd1f 100644 --- a/design/art/asset-path-map.md +++ b/design/art/asset-path-map.md @@ -28,7 +28,7 @@ | `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 | | `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_*` 十键消费;用户游戏内终审如有置换,按本行键名同径替换) | -| `board/` | 棋盘地形材质(2026-11-07 重做后改程序化绘制,无入包地形 PNG);seal_mark.png 现役用途=战末金蜡封徽记专用(战末弹层消费——棋盘侧贴图绘制路径已退役) | seal_mark.png(战末蜡封专用);旧 `terrain_*` 63 件(16 墙瓦片+5 地面变体×三关)随重做退役删除 | +| `board/` | 砖面(三关换皮);seal_mark.png 现役用途=战末金蜡封徽记专用(战末弹层消费——棋盘侧贴图绘制路径已退役) | terrain_floor__.png(三关地面系)、seal_mark.png(战末蜡封专用) | ## 4. 坐标/朝向等工程侧约定备查 diff --git a/design/art/camp-scene-prompts.md b/design/art/camp-scene-prompts.md index d4369803..9510c8aa 100644 --- a/design/art/camp-scene-prompts.md +++ b/design/art/camp-scene-prompts.md @@ -1,4 +1,4 @@ -# 营地场景 · 分层生图提示词卡 v1.10 +# 营地场景 · 分层生图提示词卡 v1.9 > **性质**:营地场景图(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 为准。 @@ -248,4 +248,3 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm 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`。 diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md index b105ab1e..7404aed4 100644 --- a/design/engineering/process-conventions.md +++ b/design/engineering/process-conventions.md @@ -12,7 +12,7 @@ 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 反而带不进去,改动只对本机生效) 2. **收口顺序(固定)**:**冻结 → 件核 → 并 master → 重塑 → 主区合回 → 删区**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先在 worktree 内 `git merge master` 解冲突(必须在合回之前,合回后才并=CI 验的是中间态);**重塑**=迭代分支(iter 形)合回前执行 `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 形免重塑免数卡)修复提交再合,落地复验追绿后删修复区**。批内的验证义务按 §4 改完即测铁规履行——改完即测自己改过的那部分,不请示、不等点名;收口顺序本身不设跑批关口。**卡片复核前置判据(2026-11-05 用户裁)**:需求卡片的 grilling 复核先于卡片提交、卡片提交先于合回——复核未跑完、缺陷清单未裁完,禁把卡片落 commit(落了也不算成立),`master` 永不落未成立卡;本条与 §2 段三出口铁律、doc-conventions §12.1「已写卡」凭据同判。 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 形免重塑免数卡),修复合回落地即再推再验追绿(追绿同链)。导入缓存刷新(.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/轮询循环。 -4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;主区一切非 merge 的 git commit 均拦(含 MERGE_HEAD 态续合;冲突/红态一律 git merge --abort → 回 worktree → 重新 git merge --no-ff))、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;合并收尾提交凭 MERGE_HEAD 豁免)、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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 commit 续合或 git merge --abort 放弃;快进合并不触发;--no-verify 可跳过且仅属用户)+post-merge(远端 CI 触发,只推送,不挂等待);合回链之外 git 层不设车道钩子——用户手工改动不受限;ZCode 层只约束 agent(子代理不经守卫层) 5. **会话单区(2026-11-04 用户裁)**:建区粒度=回合——同一时刻每会话至多一个 worktree 在役;合入删区之前,会话内用户追加的事项一律并入在役区推进,禁为追加事项另开新区。区内全部事项完成后只做一次合入(一次 `git merge --no-ff`、post-merge 一次推送、远端 CI 只跑一次),追加事项在合入提交信息里分列;无改动需求的事项不建区。合回删区后用户再发令的事项=新回合,另开新区(区名取该回合主任务名)。CI 红的 `fix-<任务名>` 修复区属同一回合的追绿延续,不另算新区。迭代实现批(iter 形分支)独占回合——其他类事项不得并入迭代区(合回守卫数卡校验本就拦未归卡提交),待其合回后按新回合另开。 ## 2. 五段流水线 diff --git a/design/gdd/08-Alpha版本标准.md b/design/gdd/08-Alpha版本标准.md index b6f0dfcd..3e335e3c 100644 --- a/design/gdd/08-Alpha版本标准.md +++ b/design/gdd/08-Alpha版本标准.md @@ -146,7 +146,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战 | 像素美术风格与色板 | [美术圣经](../art/art-bible.md) | 在役 | | 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 | | 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史;观感复核已随战斗一屏样张过闸完成——用户实机目检核销,沿革查 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) | 在役 | | 主角立绘三态 | [角色设计](../art/character-design.md) | 在役 | diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md index b05323c7..00d0f550 100644 --- a/design/gdd/systems/表现与支撑/HUD框架.md +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -59,7 +59,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 |---|---|---| | B 战斗画面 | 全宽,高读布局表 `stage_h`(背景三关变体+连续地面层高另读 `ground_h`) | 三关舞台背景+连续地面层、主角站桩立绘、敌人站桩立绘 ×1–3(**全站桩形态,2026-09-20 用户拍板:无框立绘+底座、状态小图标挂血条下,英雄卡/敌人卡退役**)、轮次阶段指示、结算明细带 | | 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)。 @@ -74,7 +74,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 | 变量 | 含义 | 现行值 | |---|---|---| | N | 棋盘边长格数 | 读[棋盘生成](../排雷循环/棋盘生成.md)(现行四档;事实源 board_gen.tres) | -| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 高 = D 区全高(不再扣 AP 条);宽按 battle.md 格尺寸公式扣 `side_rail_w` 侧栏,本表不复制现算值 | +| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 由 D 区尺寸扣行动点条高(读 `ap_bar_h`)得出,本表不复制现算值 | 装板可行性由上面的不等式保证;格边长的可读下限见 [battle.md](../../../ux/battle.md),算例由样张渲染脚本按布局表现算、不入文档。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。 @@ -179,7 +179,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 |---|---| | 对比度 | 全部数字对格底 ≥4.5:1 | | 色弱安全 | 无信息仅靠色相承载;格态在灰度截图下可逐格分类 | -| 字号下限 | 棋盘浮空数字字高 21px 固定、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) | +| 字号下限 | 棋盘数字 ≥18px、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) | | 闪烁 | 无每秒超过三次的闪烁 | | 减动效 | 提供全部动画时长减半或跳终态的开关;结算逐行兑现是信息载体——可加速、不可整体跳过 | | 输入 | 全部操作纯鼠标可完成 | @@ -244,7 +244,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 ## 调参表 -本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / B 区连续地面层高 / C 区宽 / D 区侧栏宽 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。 +本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / B 区连续地面层高 / C 区宽 / AP 条高 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。 | 参数 | 域 | 现行值(文档自持,无表承载) | 说明 | |---|---|---|---| diff --git a/design/gdd/术语表.md b/design/gdd/术语表.md index 010ff0c7..f75da6f5 100644 --- a/design/gdd/术语表.md +++ b/design/gdd/术语表.md @@ -103,13 +103,12 @@ | 术语 | 定义 | |---|---| -| 样张 | 按美术圣经参数画成的风格试验图,是棋盘地形形态(岩体+地面+浮空数字)等视觉定稿的验收闸(规格见[美术圣经](../art/art-bible.md) §1.4) | +| 样张 | 按美术圣经参数画成的风格试验图,是砖面形态等视觉定稿的验收闸(规格见[美术圣经](../art/art-bible.md) §1.4) | | 整屏样张 | 整屏级样张——战斗/关卡/菜单/营地屏各出一张,验屏级文字对比度、明度分层与焦点预算 | -| 掩尘 | 未开格岩体顶面基色的专色名——覆尘完整岩体的「未知」面色(现行值 `#9C8462`,见美术圣经 §4.1) | -| 裸土 | 已开格连续地面基色的专色名——挖出空间的沉暗面色(现行值 `#695038`,见美术圣经 §4.1) | -| 色牌 | 棋盘数字底具——普通数字已退役(2026-11-07 浮空数字定案,棋盘普通数字不再使用底牌);封印格身份字形色牌保留(2026-11-07 封印改版,叠于法阵之上);沿革查美术圣经 §4.1 | -| 浮空数字 | 棋盘数字的现行呈现——数字与格面字形浮在格上方,暖白字芯+2px 深墨描边+双色引导线;字高 21px、字底距格顶 15px(规格见[美术圣经](../art/art-bible.md) §3.2) | -| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地形材质换色板) | +| 掩尘 | 未开格底色的专色名——覆尘完整砖的「未知」面色 | +| 裸土 | 已开格底色的专色名——碎裂裸露空间的沉暗面色 | +| 色牌 | 垫在数字正下方的素色直角小牌,复杂格底时保数字可读的后备手段 | +| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地砖换色板) | | 方向稿 | 冻结前的方向性候选稿,供气质目检;过目检后才进机检冻结 | | 站桩 | 战斗画面区(B 区)里角色直立立绘的显示形态(配血条与状态行) | | 显示档 | 站桩立绘的显示尺寸规则——源用原稿分辨率入包(禁降采样),显示按三档绝对高缩放、宽随源比例;定值单点见[美术圣经](../art/art-bible.md) §8.2 站桩立绘显示档条(档值定值面=站桩呈现守门测试) | diff --git a/design/ux/battle.md b/design/ux/battle.md index 8e62519a..f35ad071 100644 --- a/design/ux/battle.md +++ b/design/ux/battle.md @@ -81,7 +81,7 @@ 本屏必须传达的全部信息,按注视优先级分五层: 1. **扫雷图本体**(第一注视点,挖掘期占视觉预算大头):两格态(已开格 / 未开格——排雷玩法×6② 一眼可辨)、数字、封印印记、小人、可挖域(8 向相邻常驻指示)、变异纹理 -2. **本轮行动资源**:AP 余量(决定还能挖几格)、RAP 池(弃图刷新货币)、停手/弃图刷新按钮——紧贴棋盘左右两侧(动作发生地;2026-11-07 顶栏搬两侧后由侧栏承载) +2. **本轮行动资源**:AP 余量(决定还能挖几格)、RAP 池(弃图刷新货币)、停手/弃图刷新按钮——紧贴棋盘上缘(动作发生地) 3. **战果兑现面**(结算期为第一注视点):敌人血条变化、逐行结算明细、高光(完美封印/封印标中) 4. **规划面**(边缘注视,常读):攻击值与修正来源(C 区数据框)、敌人意图徽标与顺位(B 区站桩);HP 与状态效果由单位本体(B 区站桩)唯一承载——数据框不重复展示 5. **进度语境**:轮次/阶段指示、图例入口(关卡节点进度常驻关卡画面,战斗屏不承载——见 Navigation Position) @@ -106,22 +106,22 @@ - 护甲 AC(2026-09-26 二轮拍板补入——我方 AC 的唯一展示面;掷点判定轴,受击侧可读性) - 秘宝槽(四槽壳在役、空槽占位——局内两步使用与关卡域库存随秘宝过渡形态退役;现行秘宝 = 营地同调装配件,本区展示内容归装配面重接) - 奇物列表(**已实装**——现行标题「特性」;锻造/大奖励/关卡奖励节点获得的属性提升,逐件行「件名 ×N」呈现、零内部分类字样上屏;与战斗内状态效果分区呈现,防「战斗结束被清」误读) -- **D 区扫雷图 · 行动资源侧栏(原 AP 条,2026-11-07 顶栏搬两侧)** - - 左栏:AP 点阵 + 停手按钮 - - 右栏:**RAP 读数(点阵+数字)** + 图例按钮 + 弃图刷新按钮——RAP 贴弃图刷新(2026-09-26 拍板:RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮) +- **D 区扫雷图 · AP 条** + - AP 点阵 + 停手按钮(现行) + - **RAP 读数(点阵+数字)**——置于弃图刷新按钮旁(2026-09-26 拍板:RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮) - **战斗屏不承载(2026-09-26 二轮拍板)** - GP(中循环资源——商店房消费):**关卡画面常驻总量** + **战斗总结结算(总量+增量)**(呈现 spec:[settlement-summary.md](settlement-summary.md)) - 钥石(大循环永久资源):**战斗总结结算(Boss/精英击杀增量行)+ 冒险总结结算(收束明细)+ 营地**(呈现 spec:[settlement-summary.md](settlement-summary.md)) ### Layout Zones -采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `ground_h`(B 区连续地面层高)/ `info_panel_w` / `side_rail_w`(D 区行动资源侧栏宽,2026-11-07 顶栏搬两侧后新增)/ `log_band_h_dig` / `log_band_h_settle`;游戏视图不再读 `ap_bar_h`;布局表字段暂留供样张渲染工具,删除归工具批)。本节只写结构关系与内容职责,不复写数值;任何文档与代码不另立第二份布局值。 +采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `ground_h`(B 区连续地面层高)/ `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 区右栏;GP/钥石迁出战斗屏) | -| **D 扫雷图** | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区(2026-11-07 顶栏搬两侧:**D 区全高归棋盘**,不再让出 AP 条高度;棋盘不缩,格边按公式现算) | 左栏(宽读 `side_rail_w`,贴棋盘左缘):AP 点阵 + 停手按钮;右栏(同宽,贴棋盘右缘):RAP 点阵+数字 + 图例按钮 + 弃图刷新按钮(RAP 贴唯一消费口,2026-09-26 拍板);棋盘主体居中(格边长见下方「棋盘格尺寸公式」;上方留 44px 给浮空数字越出棋盘,下方 12px+悬崖 8px);toast 槽(D 区上缘内侧左栏顶部,不覆盖棋盘与浮空数字);棋盘底常驻操作提示条退役(2026-11-07 用户裁,不占棋盘高度) | +| **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 点阵+数字〔贴弃图刷新按钮,2026-09-26 拍板〕;右——图例按钮 + 弃图刷新按钮〔雷图右上角,2026-09-12 拍板〕);棋盘主体(居中,格边长见下方「棋盘格尺寸公式」);toast 槽(上缘内侧) | > 布局为 B/C/D 三区——关卡进度条不在战斗屏(节点链进度常驻关卡画面,见 Navigation Position;字母不重编沿用 B/C/D)。 @@ -129,7 +129,7 @@ ### 封印格呈现预览(2026-11-07 用户裁「封印受理即揭示」的呈现规格;2026-11-07 用户人审通过——按此先落实现,观感细化后置,不阻塞基线冻结) -封印受理后格子进入**已揭示+封印**态:墙格换已揭示连续地面,封印法阵(环+十字)叠在其上,格下身份字形(危险格「危」朱字/安全格数字)按既有绘制优先级(数字 > 小人 > 封印印记)叠于法阵之上、垫既有色牌机制保可读。棋盘重做批后承载面取本关受光棱色封印石(新连续地面 `#695038` 系对封印黑仅 2.35–2.98:1,不达 ≥4.5:1;受光棱系 6.45–9.94:1,零新增色,见 art-bible §3.2/§4.1)。轮末判定后印记不撤,随图存续。 +封印受理后格子进入**已揭示+封印**态:墙瓦片换地板瓦片(裸土),封印法阵(环+十字)叠在其上,格下身份字形(危险格「危」朱字/安全格数字)按既有绘制优先级(数字 > 小人 > 封印印记)叠于法阵之上、垫既有色牌机制保可读。轮末判定后印记不撤,随图存续。 @@ -167,7 +167,7 @@ -像素级判据句(实现批验收锚):①印记参数沿用现行五常量单点(环外径 0.82 格边、环壁 0.11 环径、十字臂宽 0.156 环径、光圈 alpha 0.50/γ1.6),零新增美术件、零参数改动;②封印格承载 = 已揭示地面(棋盘重做批后为本关受光棱色封印石),印记居格心、环外留 9% 格宽光圈、光圈不外溢邻格;③身份字形(危/数字)垫既有色牌件叠于法阵之上——色牌取现行色板素色小牌件,墨字对色牌对比 ≥4.5:1;④封印黑对承载面对比:旧裸土 ≈7.8:1,棋盘重做批后受光棱 6.45–9.94:1(均 ≥4.5:1);⑤未开格与已开普通格观感按棋盘重做批新地形规格(对照列)。 +像素级判据句(实现批验收锚):①印记参数沿用现行五常量单点(环外径 0.82 格边、环壁 0.11 环径、十字臂宽 0.156 环径、光圈 alpha 0.50/γ1.6),零新增美术件、零参数改动;②封印格承载 = 地板瓦片(裸土),印记居格心、环外留 9% 格宽光圈、光圈不外溢邻格;③身份字形(危/数字)垫既有色牌件叠于法阵之上——色牌取现行色板素色小牌件,墨字对色牌对比 ≥4.5:1;④封印黑对裸土底对比 ≈7.8:1(≥4.5:1);⑤未开格与已开普通格观感与现行逐像素一致(对照列)。 > 可挖域微光画法定稿(2026-09-25 用户拍板):**接触带·空间侧 + 蓝族**——光画英雄格周界接触面(正交邻墙=整边,斜向邻墙=角点+两半边),详见 art-bible §3.2;现行墙格整框绿相呼吸为待退役占位,切换待表现侧实现(含探针断言)。 @@ -179,14 +179,13 @@ **棋盘格尺寸公式**(本节是格边长口径的唯一出处;其他文档只写规则与指针,不复制算例): ``` -格边长 = clampi( floor((min(棋盘区宽 − 2 × 侧栏宽 − 12 − 悬崖厚度, 棋盘区高 − 44 − 12 − 悬崖厚度) − (N−1) × 格间距) / N), 26, 46 ) +格边长 = clampi( floor((min(棋盘区宽 − 12 − 悬崖厚度, 棋盘区高 − 24 − 悬崖厚度) − (N−1) × 格间距) / N), 26, 46 ) ``` -- **棋盘区** = D 区矩形(宽 = 基准屏宽 − C 区宽 − 列间距,高 = 基准屏高 − B 区高);2026-11-07 顶栏搬两侧后,D 区全高归棋盘,AP 条高度不再参与算式。 -- N = 棋盘长宽两边的较大者;格间距 2px;侧栏宽读布局表 `side_rail_w`(基座档 200);水平预留 12px(左右各 6);垂直预留 56px(**上 44 / 下 12**——上方 44px 给浮空数字越出棋盘上缘,推导 = 字高 21+字底距格顶 15+描边 2+余量 6);悬崖厚度 8px;结构钳制区间 [26, 46]px。 -- 格边长可读性以用户验收的现行画面为锚点(2026-11-01 用户裁——现行渲染值即基准;2026-11-07 顶栏搬两侧后基座档 12×12=38px、14×14=32px);全域不设人造的格边长可读阈值。结构钳制 [26, 46] 只管算式结果不越界;格边长接线守卫=生产写入值与上式单点算式的返回值严格相等,最大板型的推定读数仅留痕观察、不作判红依据。 +- N = 棋盘长宽两边的较大者;格间距 2px;垂直预留 24px(上 12 / 下 12);悬崖厚度 8px;结构钳制区间 [26, 46]px。 +- 格边长可读性以用户验收的现行画面为锚点(2026-11-01 用户裁——现行渲染值即基准,基座档 14×14=28px 达标);全域不设人造的格边长可读阈值。结构钳制 [26, 46] 只管算式结果不越界;格边长接线守卫=生产写入值与上式单点算式的返回值严格相等,最大板型的推定读数仅留痕观察、不作判红依据。 - N 的取值与每关板型的对应关系读[棋盘生成](../gdd/systems/排雷循环/棋盘生成.md),现行值的事实源是 `data/tables/board_gen.tres`。 -- 浮空数字字高 = 21px(7px 像素字 ×3,固定,不随格边缩放)+2px 深墨描边;引导线 2px、字底距格顶 15px;旧「数字字号 = max(18, ceil(格边长 × 0.5))」随格内数字退役。 +- 数字字号 = max(18, ceil(格边长 × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰)。 算例不入文档:棋盘区可用面积随布局表与板型变化,不是契约值——现算并绘在整屏样张上,本文件不复写。 @@ -199,13 +198,11 @@ | B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 | | B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 无明细回看——带保留单行摘要,冒险中回看归「生涯」 | 改造 | | B | 结算明细回看(已退役) | —— | 冒险中回看归「生涯」;回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 | -| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;HP 与状态归 B 区站桩、RAP 归 D 区右栏,不在本组件) | 只读 | HUD 视图拆分 | +| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;HP 与状态归 B 区站桩、RAP 归 D 区 AP 条,不在本组件) | 只读 | HUD 视图拆分 | | C | 秘宝槽 | 图标槽 ×4 | 四槽壳在役、空槽占位(标题「秘宝」,悬停「秘宝槽(空)」);局内两步使用与关卡域库存随秘宝过渡形态退役——现行秘宝 = 营地同调装配件(秘宝.md),本区展示重接归装配面 | 悬停 tooltip | 已实装 | | C | 奇物列表(现行标题「特性」) | 列表/图标行 | 已实装——逐件行「件名 ×N」呈现、零内部分类字样;锻造/大奖励/关卡奖励节点获得的属性提升——中循环数据,因改变战斗数学且无其他展示面准入战斗屏;与战斗内状态效果(B 区站桩)分区,防「战斗结束被清」误读 | 只读 | 已实装 | -| D | 行动资源侧栏(原 AP 条) | 两侧点阵 + 按钮组 | 左栏:本轮 AP 点阵、停手按钮;右栏:**RAP 点阵+数字(RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮——2026-09-26 拍板;RAP 清零可见反馈〔行动经济〕)**、图例按钮、弃图刷新按钮(RAP−8 · 本轮剩 N 次,上限 2 次为行动经济口径)。2026-11-07 顶栏搬两侧——原顶部整条 AP 条退役,数据按左/右栏分置,D 区全高归棋盘 | 点击提交意图 | HUD 视图拆分改造 | -| D | 棋盘地形层 | 合并岩体/连续地面 | 地面连续无缝;连通未开格(四邻)合并为抬升岩体(岩顶大板+南/东崖面+四段投影+整板悬崖);岩顶向北偏西抬升(LIFT/ESHIFT 比例见 art-bible §3.2);三关八色见 art-bible §4.1「三关棋盘环境八色」;不铺逐格瓦片;深度对象按脚底 y 排序,南侧岩体可遮住小人脚底(2026-11-07 用户裁) | 只读 | 新建(替换 cell_base_layer/tile_palette) | -| D | 棋盘浮空数字层 | 最顶层文字层 | 数字与格面字形(危/?)浮在格上方:字高 21px、2px 深墨描边、1px 浮空投影、暖白字芯、2px 双色引导线;字底阴影圆 10×6 画在开启格地面(格顶+7,位于小人之下,小人站该格时遮住圆);顶行数字越出棋盘上缘(D 区上方预留 44px);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;封印格身份字形走色牌、不进浮空层;普通数字色牌退役 | 只读 | 新建 | -| D | 棋盘视图 | 网格 | 棋盘全部格态 + 小人 + 封印印记 + 变异纹带 + 奖励身份 icon(已开格;信息层叠放序 浮空数字>小人>封印印记>奖励徽章/类型微光>交互反馈>变异纹带>地形底色——浮空数字永不被遮,徽章不进数字区;屏幕层序按脚底行分档:北侧贴花低于小人、南侧随岩体在前;封印印记与封印格身份色牌固定低于小人,样张验收项) | 左/右键意图提交 | 改造 | +| D | AP 条 | 点阵 + 按钮组 | 本轮 AP 点阵、停手按钮(左)、**RAP 点阵+数字(RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮——2026-09-26 拍板;RAP 清零可见反馈〔行动经济〕)**、弃图刷新按钮(右端·雷图右上角;RAP−8 · 本轮剩 N 次,上限 2 次为行动经济口径) | 点击提交意图 | HUD 视图拆分 | +| D | 棋盘视图 | 网格 | 棋盘全部格态 + 小人 + 封印印记 + 变异纹带 + 奖励身份 icon(已开格;绘制优先级 数字>小人>封印印记>奖励徽章>变异纹带>底色——徽章不进数字区,样张验收项) | 左/右键意图提交 | ✅ 已实装 | | D | 悬停预承诺光标 | 光标态 | 移动/挖/封印三语义光标 + 目标格边框高亮 | 自动 | 新建(排雷玩法×6③) | | D | 可挖域指示 | 常驻微高亮 | 小人 8 向相邻可操作格 | 自动 | 新建(排雷玩法×6③) | | D | 移动路径预览 | 路径高亮 | 悬停已开格显示 BFS 路径(合法性指示) | 自动 | 新建(排雷玩法×6⑤,裁决见下) | @@ -219,7 +216,7 @@ **布局决策 3 — 移动路径预览 = 合法性指示**(排雷玩法×6⑤ 悬案裁决):悬停已开格时高亮 BFS 路径(小人蓝细线点迹),移动执行为 ≤150ms 短滑。 - 备选(不采纳):穿行动画轨道——移动免费高频,动画时间税违反 P4 点击摩擦护栏(每轮输入动作:AP ≤2 的观测假设);正式版若 playtest 反馈"移动太瞬"再议 -**布局决策 4 — 弃图刷新 = 挖掘期当场换图(2026-09-12 用户拍板;2026-11-07 按钮位随顶栏搬两侧改到 D 区右栏)**:按钮置 D 区右栏(贴棋盘右缘)。点击即当轮就地换新图继续挖——AP 不重置、剩余 AP 保留,RAP−8,本轮上限 2 次。 +**布局决策 4 — 弃图刷新 = 挖掘期当场换图(2026-09-12 用户拍板)**:按钮置 AP 条右端(雷图右上角)。点击即当轮就地换新图继续挖——AP 不重置、剩余 AP 保留,RAP−8,本轮上限 2 次。 - **上游修订(OQ11)**:① 行动经济 Active 相位受理刷新意图 + 每轮上限 2 次(Waiting 代理退役)② 排雷玩法装板受理域增 Active·仅刷新路径 ③ 编排 owner = **战斗结算的挖掘期刷新编排**(行动经济扣费 → 排雷玩法退役旧板 → 棋盘生成出新图 → 排雷玩法装板 → 地图战斗资源摇奖励恰一次;无结算段、无轮次结束——战斗结算编排唯一性原则保持)④ 旧板封印印记随旧板**作废**(零兑付、封印 AP 不返还——排雷玩法 EC11 全量重置承载;确认微交互须显式提示)。**经济预警**:当场刷新无结算发生,原「敌方时间税」自惩失效——行动经济 OQ3 弃图率/刷新率预警阈值联动复核。 - 备选(已否决):结算期决策提示(Waiting 内联)——结算期不做刷新决策(用户拍板);挖掘期预承诺 stop+reroll 复合——决策即终轮,不符「换图继续挖」语义。 @@ -250,109 +247,20 @@ │ ├─ 结算明细带 ────────────────────────────────────────────────────────────┤ │ │ │ ▸上轮: 主角攻击3→蛆虫-3 | 攻击+50%(1结算) | 警觉+1×2 … │ │ │ └────────────────────────────────────────────────────────────────────────┘ │ -├─[C] 角色信息 ─────────┬─[D] 扫雷图(顶栏已搬两侧) ───────────────────────────┤ -│ ┌──────────────────┐ │ ┌──────┐ ┌───────────────────────────┐ ┌──────┐ │ -│ │ 攻击 6 (+50%) │ │ │ AP │ │ (上方 44px 留白) │ │ RAP │ │ -│ │ 护甲 AC 12 │ │ │ ●●●● │ │ 1 2 ░ 3 ... │ │ ▓▓▓░ │ │ -│ ├──────────────────┤ │ │ ●○○○ │ │ ╱│ ╱│ ... │ │ 3/8 │ │ -│ │ 秘宝槽 │ │ │ 5/8 │ │ ┌───────────────────────┐ │ │[?图例]│ │ -│ │ ◇ ◇ ◇ ◇ │ │ │ │ │ │ 岩体顶面(合并岩体) │ │ │[↻刷新]│ │ -│ ├──────────────────┤ │ │[⏹停手]│ │ │ 南/东崖面+四段投影 │ │ │ 8|剩2 │ │ -│ │ 特性(奇物) │ │ │ │ │ │ 1 2 👫 1 1 ░ 2 │ │ └──────┘ │ -│ │ 锻造+2攻 │ │ │ │ │ │ ▓▓ 1 1 ░ ░ 2 ▓▓ │ │ │ -│ │ (空态=隐藏) │ │ └──────┘ └───────────────────────────┘ │ │ -│ └──────────────────┘ │ 左栏 AP 棋盘居中·浮空数字最顶 右栏 RAP │ +├─[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 ▓▓ │ │ +│ │ (空态=隐藏) │ │ │ ( █=可挖域微光 👫=小人) │ │ +│ └──────────────────┘ │ └─────────────────────────────────────────────────┘ │ └───────────────────────┴──────────────────────────────────────────────────────┘ ``` -> **D 区结构注记(2026-11-07 用户裁)**:原顶部 AP 条整条退役,AP 在左栏、RAP/图例/弃图刷新在右栏;棋盘占 D 区全高,上方 44px 留白给顶行浮空数字越出棋盘;棋盘地形为合并岩体+南/东崖面,浮空数字+引导线为最顶层。 - -### D 区布局与棋盘画法预览(2026-11-07 用户人审通过,内嵌备查) - -> 预览依据 = art-bible §3.2/§4.1(v3.51)+本节布局表与格边公式。效果图是目标画面;像素判据以 1280×800 基座档钉死,实现批按此冻结基线(test-conventions §8.2)。 - - - D 区布局——顶栏搬两侧、棋盘全高、上方 44px 浮空数字预留 - D 区 1036×548:左栏 200px 放 AP 与停手,右栏 200px 放 RAP、图例、弃图刷新;棋盘 12×12 格 38px 居中,上方留白 44px,下方 12px+悬崖 8px。 - - - - 左栏 · AP - 右栏 · RAP - - - - - - 停手 - - 3 - 图例 - 弃图刷新 - RAP−8 · 剩 2 次 - - - - 上方 44px · 浮空数字越出棋盘 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 22 - 22 - 22 - 22 - - 2 - - 棋盘 478×478(12×12 · 格 38 · 间距 2) - 悬崖 8 · 下方 12 - - -**像素判据(1280×800 基座档;实现批按此冻结基线)** - -| 判据 | 读数 | -|---|---| -| D 区 | x 244–1280、y 252–800,1036×548 | -| 侧栏 | 左栏 x 244–444、右栏 x 1080–1280,各宽 200(布局表 `side_rail_w`) | -| 棋盘 12×12 | 格边 38、格间距 2、外框 478×478;原点 x=523、y=296;棋盘底 774、悬崖到 782、屏底余 18 | -| 棋盘 14×14 | 格边 32、外框 474×474;原点 x=525、y=296;棋盘底 770、悬崖到 778、屏底余 22 | -| 上方预留 | y 252–296 共 44;顶行字视觉顶 y=258(含 2px 描边),距 D 区上缘 6 | -| 浮空字 | 字高 21、字底距格顶 15、视觉顶距格顶 38;2px 深墨描边+1px 浮空投影;引导线 2px(左深右浅),自格顶−12 到格顶+4;字底阴影圆 10×6、圆心格顶+7,画在开启格地面、位于小人之下 | -| 岩体投影 | LIFT=round(38×0.435)=17;ESHIFT=round(38×0.109)=4;相邻岩顶搭接 2;板边岩顶外延 ESHIFT;南崖高 17、宽 42(38+4)、顶缘 2px 口沿高光取本关受光棱(dungeon #C9AF83)+1px 深墨线;东崖宽 4、高 55(38+17);北/西临空缘 2px 主亮棱+2px 次亮棱+外 2px 深墨边;南/东临空缘 2px 深墨内缘+3 段×2px 内阴影(自缘内 0.217×格边起,α0.27/0.16/0.08);南/东投影 4 段×4px 渐隐(α0.44/0.30/0.16/0.07);整板悬崖 8 | -| 深度遮挡 | 深度键 = 脚底格底 y;岩体取最南格格底;升序绘制;南侧岩体(键更大)画在小人之后、遮住小人脚底 | -| 层序 | 地面(封印格地面铺受光棱色封印石)→投影→开启格地面阴影圆(小人之下)→深度对象(岩体+小人;格件顶面贴花〔微光/变异〕与交互反馈随脚底行同序——北侧低于小人、南侧随岩体在前;封印印记与封印格身份色牌固定低于小人)→浮空数字+引导线(z 最高) | -| 顶面/视觉 rect | 墙格顶面 rect = 格矩形左上偏移 (−ESHIFT,−LIFT)、边长=格边;整格视觉 rect = 顶面向右补 ESHIFT、向下补 LIFT;微光/变异锚顶面 rect;封印锚逻辑格心;迷雾黑罩覆盖顶面+南面+东面三块 | -| 悬停/路径 rect | 墙格悬停金框按顶面 rect;已开地面格悬停/路径点迹按逻辑 rect(不偏移) | -| 禁裁切 | 顶行数字、引导线、阴影圆全部落在 D 区内;任何地形/小人/特效不遮浮空数字与引导线 | --- @@ -360,7 +268,7 @@ | State / Variant | Trigger | What Changes | |---|---|---| -| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 Active 相位 | B 区敌人待机(意图徽标全程可见——敌人系统 Rule 8⑤),D 区棋盘可交互,左右行动资源侧栏点亮;能量 2/10,唯悬停呼吸微光在动(§2.1) | +| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 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 落点) | @@ -387,10 +295,10 @@ |---|---|---|---|---| | 未开相邻格 | 挖掘 | 左键 | 格碎裂 + 连锁展开(免费)+ 奖励身份揭显 | 意图入当帧批次 → 排雷玩法的意图批次提交 | | 已开格 | 移动 | 左键 | 悬停时路径预览高亮(布局决策 3);执行 ≤150ms 短滑 | 意图入批(BFS 移动,免费) | -| 未开格 | 封印 | 右键 | **受理即揭示**:墙格换已揭示地面 + 封印印记落下(封印黑)+ 格下身份揭显(危/数字,垫色牌) | 意图入批(1 AP / 免费;受理当场零兑付——兑付在轮末判定批) | +| 未开格 | 封印 | 右键 | **受理即揭示**:墙瓦片换地板 + 封印印记落下(封印黑)+ 格下身份揭显(危/数字) | 意图入批(1 AP / 免费;受理当场零兑付——兑付在轮末判定批) | | 已封印格(已揭示) | 无 | 左键/右键 | 禁止光标 + 悬停说明(封印格无可用动作) | 零意图(不入批——封印格拒绝挖掘、不可通行、不可再封印;封印印记无移除手段,封印不可逆) | | 停手按钮 | 主动结束轮次 | 左键 | 按钮下压 + AP→RAP 飞行数字 | 停手随当帧意图批次提交(**经排雷玩法批次,不直调行动经济**——单意图帧批次契约) | -| 弃图刷新按钮(D 区右栏) | 当轮就地换图继续挖 | 左键 | 确认微交互(RAP−8 代价显式 + 旧板弃置提示);RAP<8 → 资源面拒绝可见(行动经济 EC13) | 刷新意图提交(**Active 相位当场换图继续挖**——AP 不重置、本轮剩 N 次扣减;受理口径见布局决策 4/OQ11) | +| 弃图刷新按钮(雷图右上角) | 当轮就地换图继续挖 | 左键 | 确认微交互(RAP−8 代价显式 + 旧板弃置提示);RAP<8 → 资源面拒绝可见(行动经济 EC13) | 刷新意图提交(**Active 相位当场换图继续挖**——AP 不重置、本轮剩 N 次扣减;受理口径见布局决策 4/OQ11) | | 图例按钮 | 开图例 | 左键 | 模态 overlay | 恒可开(图例条目恒在) | | 状态小图标(B 区站桩) | 悬停 | hover | 状态 tooltip(来源+语义+剩余结算次数) | 只读 | | 胜利 overlay | 下一节点 | 左键 | → 关卡画面(选路枢纽)/ 关卡结算(末节点) | 关卡推进方推进 | @@ -431,7 +339,7 @@ | 挖掘→结算 | 明细带自底展开(150ms)+ 棋盘去饱和 + 金橙色相偏移 + 阶段指示翻转 | §2.2 色彩转金橙主导、饱和拉高、明度不变(状态区分经饱和/色相——art-bible §2) | | 结算逐行兑现 | 光带自棋盘行起点横扫 → 开格化箭雨/印记化暴击弹道飞向敌人立绘 → 受击闪白 + 血条直角递减 | §2.2 承载元素;因果全程可见可归因(P2) | | 清图换新图 | 金粒喷泉 3–5s → 旧图碎裂淡出 → 新图 install 淡入 | §2.3 短促丰收不拖节奏 | -| RAP 清零(战斗结束) | RAP 数字滚动归零(D 区右栏)+ 「随战斗结束消散」微文案 | 行动经济可见反馈义务 | +| RAP 清零(战斗结束) | RAP 数字滚动归零(D 区 AP 条)+ 「随战斗结束消散」微文案 | 行动经济可见反馈义务 | | 敌人死亡 | 血条直角递减至零 → 卡体灰化 + 碎裂退场(禁瞬消) | 敌人系统资产下限(同等 blocking);动画密度归战斗表现 | | 状态图标行全清(战斗结束) | 状态逐枚化光收回(B 区站桩图标行)+ 「状态随战斗结束消散」微文案 | 增益状态×4④;RAP 清零同款先例 | | 胜利 | 蜡封自上落下弹跳定格 → 碎砖拼纹章 → overlay 暖金渐显 | §2.4 克制不狂欢 | @@ -469,11 +377,11 @@ 无障碍基线权威 = [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)「可访问性基线」节;不再另立专项文档(2026-09-27 拍板,见 OQ2)。本 spec 内建基线承诺(呈现侧落地): -- **对比**:浮空数字按 art-bible §1.4 第一验收项的复合判据过门(四类底上 max(字芯对底,描边对底) ≥4.5 且字芯对描边 ≥4.5;最亮底岩顶实测描边对底 5.1:1);UI 数据一律墨族素面对面板底 ≥4.5:1 +- **对比**:全部格底/面板底对数字墨 ≥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) -- **字号下限**:浮空数字字高 21px(固定,含描边视觉 25px)、明细带正文 ≥14px、tooltip ≥13px(1280×800 基座) +- **字号下限**:棋盘数字 ≥18px、明细带正文 ≥14px、tooltip ≥13px(1280×800 基座) - **运动**:无闪烁 >3次/秒;结算光带为方向性扫动非频闪;提供减动效选项(§Transitions) - **键盘/Gamepad**:MVP 纯鼠标可完成全部操作(technical-preferences 平台注记);**MVP 纯键盘导航/焦点序不做**(2026-09-12 拍板——回合制点击驱动,平台仅承诺纯鼠标);gamepad 导航序延后(Open Questions) @@ -493,16 +401,12 @@ **布局与可读** -- [ ] 1280×800 与 16:9 全屏(canvas_items/expand)下三区(B/C/D)无遮挡、无重叠、无内容裁切(棋盘 12×12 全部格子 + 浮空数字与引导线完整可见) -- [ ] D 区基座档读数落预览判据:左/右栏各 200、棋盘 12×12 格 38(原点 x=523、y=296)、14×14 格 32;上方 44px 预留内顶行字完整、无裁切 -- [ ] 棋盘地形为合并岩体+连续地面:连通未开格共享岩顶/崖面无逐格拼缝;北/西受光棱、南/东崖面与四段投影在位;旧 16+5 瓦片路径零引用、零在库 -- [ ] 浮空数字+引导线 z 最高:任何地形/小人/特效不遮数字与引导线;格顶阴影圆标出数字所属格 -- [ ] 深度排序:南侧岩体画在小人之后并自然遮住小人脚底;小人所在格数字仍完整可见 +- [ ] 1280×800 与 16:9 全屏(canvas_items/expand)下三区(B/C/D)无遮挡、无重叠、无内容裁切(棋盘 12×12 全部格子 + 数字完整可见) - [ ] 进入战斗屏 ≤500ms 内可交互(棋盘 install 淡入完成后首格可点);同屏 draw calls < 200(technical-preferences 预算) - [ ] 两种格态(已开格 / 未开格)灰度截图下一眼可辨(排雷玩法×6②) - [ ] 悬停光标区分移动/挖/封印三语义;可挖域(8 向相邻)常驻指示;非相邻格悬停显禁止反馈(排雷玩法×6③) - [ ] 已引爆危险格呈"可通行可读"(排雷玩法×6④) -- [ ] 浮空数字按 art-bible §1.4 第一验收项的复合对比判据过门(四类底上 max(字芯对底,描边对底) ≥4.5 且字芯对描边 ≥4.5);明度分层规则无违例(art-bible §2/§4.1——岩顶/地面功能分档合法,格态语义由形与色相承载);棋盘普通数字绘制路径零色牌调用(封印格身份字形色牌为唯一例外) +- [ ] 全部数字对所在格底对比 ≥4.5:1;明度分层规则无违例(art-bible §2/§4.1——格底功能分档合法,格态语义由形与色相承载) **交互与反馈** @@ -522,7 +426,7 @@ - [ ] 零合法板(棋盘生成 EC5 降级)出现时玩家侧诚实提示(toast,非静默) - [ ] 效果行数值为单次贡献值,禁止与池合成值相加呈现;零值伤害行可见不被吞;衰减行按聚合计数呈现(战斗结算 呈现细则) - [ ] 未生效类行(奖励未生效)携带形状冗余(icon/划线),非色相独载 -- [ ] 奖励徽章绘制优先级:封印印记之下、变异纹带之上、不遮浮空数字与引导线;拾取瞬间 tier 档位可读(地图战斗资源 H1) +- [ ] 奖励徽章绘制优先级:封印印记之下、变异纹带之上、不进数字区;拾取瞬间 tier 档位可读(地图战斗资源 H1) **场景级测试**(缺项即 blocking) @@ -565,7 +469,7 @@ | 排雷玩法×6 | ④ 引爆危险格可通行可读 | §AC | | 排雷玩法×6 | ⑤ 路径预览裁决 | 布局决策 3 | | 排雷玩法×6 | ⑥ 单意图帧+voided+拒绝可感知 | §Interaction Map + §States 拒绝子态 + AC | -| 行动经济 | AP/RAP 常显+刷新入口+清零反馈+双源 | §Layout D 区行动资源侧栏(RAP 贴弃图刷新按钮——2026-09-26 信息归属拍板;2026-11-07 顶栏搬两侧)+ §Transitions + AC | +| 行动经济 | AP/RAP 常显+刷新入口+清零反馈+双源 | §Layout D 区 AP 条(RAP 贴弃图刷新按钮——2026-09-26 信息归属拍板)+ §Transitions + AC | | 战斗结算×3 | ①高光行强调呈现(封印标中金框行/清图 H2 金框行)②完美封印呈现形态 ③棋盘生成 EC5 零合法板提示/补偿/回退形态(toast 提示;补偿/回退不提供——2026-09-12 选型) | §States 高光/清图 + §States 拒绝子态 + §AC;注:结算明细屏 = 战斗结算 UX Flag 事项,由本 spec 承载 | | 敌人系统×4 | 意图映射/恒定/顺位/敌方池 | §Component Inventory 敌人站桩立绘 + **意图线索映射目录(敌人系统×4① 成文占位,资产定稿归战斗表现)** + AC | | 增益状态×4 | 常显+空态/来源标注/溢出/去留 | §States 空态 + §AC | diff --git a/game/core/damage_controller.gd b/game/core/damage_controller.gd index 2b32f298..caed1e80 100644 --- a/game/core/damage_controller.gd +++ b/game/core/damage_controller.gd @@ -621,4 +621,4 @@ func _target_for(rule: String) -> Variant: func _ineffective_row(t: Dictionary, reason: String) -> void: emit_row_cb.call({"type": "reward_ineffective", "source_class": String(t.source_class), "origin_cell": t.origin_cell, "highlight": String(t.highlight)}, int(t.round_index), - "%s 未生效(%s)" % [String(t.display), reason], 0, {"batch_key": String(t.context.get("batch_key", "")), "deferred": true}) + "%s 未生效(%s)" % [String(t.display), reason], 0, {"batch_key": String(t.context.get("batch_key", "")), "deferred": true, "reason": "no_enemy_alive"}) diff --git a/game/core/reward_grant.gd b/game/core/reward_grant.gd index 565bc045..8aa3911e 100644 --- a/game/core/reward_grant.gd +++ b/game/core/reward_grant.gd @@ -268,7 +268,7 @@ func _apply_percent_row(row: Dictionary, att: Dictionary) -> bool: return true emit_cb.call({"type": "reward_ineffective", "source_class": String(att.get("source_class", "")), "origin_cell": att.get("cell", Vector2i(-1, -1)), "highlight": String(att.get("highlight", ""))}, int(att.get("ri", 0)), "奖励未生效(满层)%s" % String(att.get("label_suffix", "")), 0, - {"batch_key": eff}) + {"batch_key": eff, "reason": "full_layers"}) return false @@ -361,12 +361,12 @@ func _flat_heal(row: Dictionary, display: String, att: Dictionary, sync: bool) - # 主角已倒下(同轮更早的负向直伤致死)——治疗不再合法作用,按"奖励未生效"留痕 emit_cb.call({"type": "reward_ineffective", "source_class": String(att.get("source_class", "")), "origin_cell": att.get("cell", Vector2i(-1, -1)), "highlight": String(att.get("highlight", ""))}, int(att.get("ri", 0)), "%s 未生效(主角已倒下)" % display, 0, - {"batch_key": String(row.reward_id)}) + {"batch_key": String(row.reward_id), "reason": "hero_down"}) return "zero" if int(units.hero_unit().hp) >= int(units.hero_unit().max_hp): emit_cb.call({"type": "reward_ineffective", "source_class": String(att.get("source_class", "")), "origin_cell": att.get("cell", Vector2i(-1, -1)), "highlight": String(att.get("highlight", ""))}, int(att.get("ri", 0)), "%s 未生效(满血)" % display, 0, - {"batch_key": String(row.reward_id)}) + {"batch_key": String(row.reward_id), "reason": "full_hp"}) return "zero" var healed: int = units.heal(units.hero_unit(), power) # clamp 归 战斗结算 emit_cb.call({"type": "heal", "source_class": String(att.get("source_class", "")), "origin_cell": att.get("cell", Vector2i(-1, -1)), "highlight": String(att.get("highlight", ""))}, diff --git a/game/core/settlement/combat_segment.gd b/game/core/settlement/combat_segment.gd index 15918f9f..d59ea8ec 100644 --- a/game/core/settlement/combat_segment.gd +++ b/game/core/settlement/combat_segment.gd @@ -121,7 +121,7 @@ func _board_deferred_settle(ri: int) -> void: if int(units.hero_unit().get("hp", 0)) <= 0: for t in (reward_grant.defer["queue"] as Array): emit_row_cb.call({"type": "reward_ineffective", "source_class": String(t.get("source_class", "")), "origin_cell": t.get("origin_cell", Vector2i(-1, -1))}, ri, - "%s 未生效(主角已倒下)" % String(t.get("display", "")), 0, {"forfeit": "hero_down"}) + "%s 未生效(主角已倒下)" % String(t.get("display", "")), 0, {"forfeit": "hero_down", "reason": "hero_down"}) else: for t in (reward_grant.defer["queue"] as Array): damage.submit(t) diff --git a/game/core/settlement/grant_segment.gd b/game/core/settlement/grant_segment.gd index eb472a60..f5a818ef 100644 --- a/game/core/settlement/grant_segment.gd +++ b/game/core/settlement/grant_segment.gd @@ -318,7 +318,7 @@ func _round_end_heal_value_counter(re_fx: Array, ri: int) -> void: continue var hu: Dictionary[Variant, Variant] = units.hero_unit() if int(hu.get("hp", 0)) >= int(hu.get("max_hp", 1)): - emit_row_cb.call({"type": "reward_ineffective", "source_class": "fx_board_refresh", "origin_cell": Vector2i(-1, -1)}, ri, "坑道小憩 未生效(满血)", 0, {"batch_key": String(h.get("value_counter", ""))}) + emit_row_cb.call({"type": "reward_ineffective", "source_class": "fx_board_refresh", "origin_cell": Vector2i(-1, -1)}, ri, "坑道小憩 未生效(满血)", 0, {"batch_key": String(h.get("value_counter", "")), "reason": "full_hp"}) continue var healed: int = units.heal(hu, layers) emit_row_cb.call({"type": "heal", "source_class": "fx_board_refresh", "origin_cell": Vector2i(-1, -1)}, ri, "坑道小憩 回复", healed, {"target": "hero"}) diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 3c4887df..cf76ec99 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -249,7 +249,6 @@ func _resume_from_menu() -> void: run_scope.level_active = true sync_status_entry() # 续玩恢复点亮状态面板入口角标 ui.modals.run.level_screen.set_abandon_available(true) - ui.battle.log_view.clear() logger.start_session(int(bp.get("master_seed", 0))) run_scope.adventure.set_hero_override(ui.modals.menu.debug_overlay.atk_pct(), ui.modals.menu.debug_overlay.hp_pct()) # 同调三键随续玩下传(build_adventure_params 统一构造,与开新局同源同口径) @@ -297,7 +296,6 @@ func _start_adventure() -> void: run_scope.level_active = true sync_status_entry() # 进对局点亮状态面板入口角标 ui.modals.run.level_screen.set_abandon_available(true) # 放弃入口挂选路停点(天然非战斗期) - ui.battle.log_view.clear() var seed_val := seed_value() logger.start_session(seed_val) run_scope.adventure.set_hero_override(ui.modals.menu.debug_overlay.atk_pct(), ui.modals.menu.debug_overlay.hp_pct()) @@ -432,13 +430,8 @@ func pace_delay_for(prev_seg: String, next_seg: String) -> float: func _on_round_started(ri: int) -> void: - # 轮首分隔行随排播队列走(落在前轮各行之后——带序正确);轮横幅即轮切换时刻发射 - #(view 内判减动效=静态化变体)。减动效快路=分隔行同帧直落(不跳过——consume_now 复用 - # _consume_row 轮首分隔行分支)。 - if UiKit.motion_scale < 1.0: - ui.screens.row_pacer.consume_now({"__round_line": ri}) - else: - ui.screens.row_pacer.enqueue({"__round_line": ri}) + # 轮横幅即轮切换时刻发射(view 内判减动效=静态化变体);逐行文字列表退役后 + # 轮首分隔行不再入队(B 区明细带承载面已撤)。 ui.battle.settlement_fx.play_round_banner(ri) # 秘宝呈现同步:每战首轮装配链 # 显式重算〔🔴 契约复原语义:下一战装配链重算即含「未装配→写 0」复原〕。 diff --git a/game/presentation/main_ui_build.gd b/game/presentation/main_ui_build.gd index 3ecb916e..b35e21a3 100644 --- a/game/presentation/main_ui_build.gd +++ b/game/presentation/main_ui_build.gd @@ -51,7 +51,6 @@ static func _build_screens(root: Variant) -> void: static func _build_battle_wiring(root: Variant, handlers: Dictionary) -> void: # 结算行排播泵(本体在 row_pacer.gd;本类注入视图句柄与呈现刷新回调,零信号连接) root.ui.screens.row_pacer = RowPacer.new() - root.ui.screens.row_pacer.log_view = root.ui.battle.log_view root.ui.screens.row_pacer.stage = root.ui.battle.stage root.ui.screens.row_pacer.board_zone = root.ui.battle.board_zone root.ui.screens.row_pacer.settlement_fx = root.ui.battle.settlement_fx diff --git a/game/presentation/playtest_logger.gd b/game/presentation/playtest_logger.gd index b8fb64b4..0a7b701f 100644 --- a/game/presentation/playtest_logger.gd +++ b/game/presentation/playtest_logger.gd @@ -129,15 +129,18 @@ func log_level_end(payload: Dictionary) -> void: func _on_step_row(row: Dictionary) -> void: _ring(_recent_steps, {"t": row.type, "src": row.source_class, "v": int(row.value), "r": int(row.round_index)}) - # 结算明细行逐行落盘(五段结算完整回放数据面); + # 结算明细行逐行落盘(五段结算完整回放数据面);零中文文案——text/display_name 两份 + # 玩家文案不落盘(日志零文案裁定 2026-11-07),未生效原因走结构化 reason 键; # 公共七字段之外的全部行字段(payload:roll/ac/tier/crit/normal/pierce/magic/baseline/rider/target/ # effect_id/pool_value 等)随行平铺落盘(无 payload 时反事实只能 # 比例近似,带 payload 可精确重算)。 var line := {"kind": "step", "type": row.type, "source": row.source_class, "cell": row.origin_cell, "round": int(row.round_index), - "text": String(row.display_name), "value": int(row.value), + "value": int(row.value), "highlight": String(row.get("highlight", ""))} for k in row.keys(): + if k == "display_name": + continue # 日志零文案:display_name 平铺跳过(toast 等呈现面消费,日志不落) if not line.has(k): line[k] = row[k] _append(line) diff --git a/game/presentation/row_pacer.gd b/game/presentation/row_pacer.gd index 9791fa8d..9102997b 100644 --- a/game/presentation/row_pacer.gd +++ b/game/presentation/row_pacer.gd @@ -1,20 +1,19 @@ ## VERTICAL SLICE - NOT FOR PRODUCTION -## 结算行排播泵:逻辑先行零回压,行按段分组阶梯延迟进明细带。 -## 硬契约:只做信号的后置消费——结算顺序/结果/时序逻辑零改动;减动效开=延迟归零同帧直落,行呈现不跳过。 -## 开模态前必须 flush()——明细回看/停点/终局面所见明细带恒完整。 +## 结算行排播泵:逻辑先行零回压,行按段分组阶梯延迟驱动演出链(伤害飘字/弹道/站桩反馈)。 +## 硬契约:只做信号的后置消费——结算顺序/结果/时序逻辑零改动;减动效开=延迟归零同帧直落,演出不跳过。 +## 开模态前必须 flush()——停点/终局面演出链逐行消费恒完整。 ## 视图句柄与 refresh_request/pump_ended 回调由组合根注入——本类零信号连接。 extends Node const PACE_SEGMENT_GAP := 0.3 # 段间阶梯延迟(取值须落白名单 0.2–0.4s 档位带内) const PACE_ROW_GAP := 0.22 # 段内间隔(三轮 #3 上调 0.06→0.22——逐条演出可感知,配合数字浮现/状态脉冲) -var _rows: Array[Variant] = [] # 待排播行(step_row 载荷原样入队;__round_line 标记=轮首分隔行) +var _rows: Array[Variant] = [] # 待排播行(step_row 载荷原样入队) var _pace_wait := 0.0 # 距下一行排播的剩余秒(_process 消耗) var _prev_segment := "" # 上一排播行的段型(段间/段内延迟判据) var _was_pumping := false # 排播活跃边沿(T17——末行消费帧触发结算视觉回挖掘态刷新) # 组合根注入面(_build_ui 装配——呈现句柄 + 演播完边沿的呈现刷新回调) -var log_view: BattleLogView var stage: BattleStageView var board_zone: BoardZoneView var settlement_fx: SettlementFxView @@ -79,13 +78,8 @@ func _process(delta: float) -> void: _prev_segment = seg -# 行消费(排播队列的出队步 / 减动效快路共用):明细带入带+演出链+呈现刷新 +# 行消费(排播队列的出队步 / 减动效快路共用):演出链+呈现刷新 func _consume_row(row: Dictionary) -> void: - if row.has("__round_line"): - log_view.finish_settlement_round() # 上轮摘要行(明细带 pattern 3)随轮首分隔行落带 - log_view.append_bb("[color=#e0b860]── 第 %d 轮 ──[/color]" % int(row["__round_line"])) - return - log_view.append_row(row) stage.on_step_row_fx(row) _play_cross_zone_fx(row) # 跨区因果演出(结算演出链批):开格之因 → 站桩之果 _play_settlement_mark(row) # 三轮 #3——逐条标出:Buff/Debuff 色环脉冲 → 伤害/治疗数字浮现 diff --git a/game/presentation/views/battle_log_view.gd b/game/presentation/views/battle_log_view.gd index 10444258..10d6fd86 100644 --- a/game/presentation/views/battle_log_view.gd +++ b/game/presentation/views/battle_log_view.gd @@ -1,21 +1,16 @@ ## VERTICAL SLICE - NOT FOR PRODUCTION -## B 区结算明细带——战斗结算步骤流到玩家文案的全部行格式化规则内聚于此(挖掘期收起 1 行上轮摘要、结算期实时流)。 +## B 区结算明细带壳——结算期逐行文字列表退役后保留挖掘期摘要位与冒险流程叙述行承载(append_bb)。 class_name BattleLogView extends PanelContainer -const AGG_TYPES := ["reward_ineffective"] -const COL_GOLD := UiKit.HEX_GOLD - var _db var _band_h_dig := 0 var _band_h_settle := 0 var _log: RichTextLabel var _summary: Label var _hint: Label -var _mode := "dig" # dig = 收起摘要 / settle = 实时流(模式归组合根驱动) -var _round_rows: Array[String] = [] # 本结算轮行缓冲(上轮摘要构建源——append 的是 _format_row 格式化产物 String) -var _pending_agg := {} # 聚合计数行 pending(type+batch_key → {row, count}) +var _mode := "dig" # dig = 收起摘要 / settle = 展开空带(模式归组合根驱动;逐行流退役后 settle 态无逐行内容) func _init(db_ref, layout: BattleLayoutTable) -> void: @@ -64,213 +59,12 @@ func mode() -> String: func clear() -> void: _log.clear() - _round_rows.clear() - _pending_agg = {} _summary.text = "" -# 每结算轮结束(下一轮开始/终局)——刷新挖掘期"上轮摘要"行 -func finish_settlement_round() -> void: - _flush_pending_agg() - if _round_rows.is_empty(): - return - var parts: Array[String] = [] - for bb in _round_rows: - parts.append(_strip_bb(str(bb))) - var text := "上轮: " + " | ".join(parts) - if text.length() > 190: - text = text.substr(0, 190) + "…" - _summary.text = text - _round_rows.clear() - - func append_bb(bb: String) -> void: - _flush_pending_agg() - _log.append_text(bb + "\n") - - -func append_row(row: Dictionary) -> void: - if AGG_TYPES.has(String(row.get("type", ""))): - _accumulate_agg(row) - return - _flush_pending_agg() - var bb := _format_row(row) - _round_rows.append(bb) _log.append_text(bb + "\n") func parsed_text() -> String: return _log.get_parsed_text() - - -# 无点击回看入口——冒险中不给数据回看(归「生涯」06 登记);带保留单行摘要显示 - - -# ---- 聚合计数(未生效类行防逐行惩罚轰炸——pattern 3 聚合纪律) ---- - -func _accumulate_agg(row: Dictionary) -> void: - var key := "%s|%s" % [String(row.get("type", "")), String(row.get("batch_key", ""))] - if _pending_agg.has(key): - _pending_agg[key]["count"] = int(_pending_agg[key]["count"]) + 1 - else: - _flush_pending_agg() - _pending_agg[key] = {"row": row, "count": 1} - - -func _flush_pending_agg() -> void: - if _pending_agg.is_empty(): - return - for key in _pending_agg: - var item: Dictionary[Variant, Variant] = _pending_agg[key] - var row: Dictionary[Variant, Variant] = item["row"] - var count: int = item["count"] - var bb := _format_row(row, count) - _round_rows.append(bb) - _log.append_text(bb + "\n") - _pending_agg = {} - - -# ---- 行格式化(模板「{行为} {值} → {目标}(来源)」) ---- - -func _source_label(src_key: String) -> String: - if src_key == "": - return "" - return String(_db.combat.settlement.core.source_label_map.get(src_key, src_key)) - - -func _gold_frame(text: String) -> String: - # highlight 金框强调(形状+色彩双通道:■ 前缀 + 金底) - return "[bgcolor=%s][color=#%s]■ %s[/color][/bgcolor]" % [COL_GOLD, UiKit.HEX_ON_GOLD, text] - - -func _format_row(row: Dictionary, agg_count := -1) -> String: - var src := _source_label(String(row.get("source_class", ""))) - var round_no: int = int(row.get("round_index", 0)) - var prefix := " [color=#%s]R%d%s[/color] " % [UiKit.HEX_LOG_ROUND, round_no, ("·" + src) if src != "" else ""] - var suffix := "(%s)" % src if src != "" else "" - var kind := String(row.get("type", "")) - var body := "" - match kind: - "effect": - body = _fmt_effect(row, prefix, suffix) - "damage": - body = _fmt_damage(row, prefix, suffix) - "heal", "cast", "decay": - body = _fmt_simple(kind, row, prefix, suffix) - "reward_ineffective": - body = _fmt_ineffective(row, prefix, suffix, agg_count) - "seal_miss": - body = _fmt_seal_miss(row, prefix) - "verdict": - body = _fmt_verdict(row) - _: - body = _fmt_default(row, prefix, suffix) - return body - - -## 简单行域(heal/cast/decay 三型——单行单墨直排) -func _fmt_simple(kind: String, row: Dictionary, prefix: String, suffix: String) -> String: - var name_: String = String(row.get("display_name", "")) - match kind: - "heal": - return prefix + "[color=#%s]%s +%d%s%s[/color]" % [UiKit.HEX_LOG_HEAL, name_, int(row.get("value", 0)), _tail_of(row), suffix] - "cast": - # 施放行:增益技 0 伤害施放,具名技能 - return prefix + "[color=#%s]✦ %s%s[/color]" % [UiKit.HEX_LOG_CAST, name_, suffix] - "decay": - return prefix + "[color=#%s]状态衰减 ×%d[/color]" % [UiKit.HEX_LOG_DECAY, int(row.get("value", 0))] - return "" - - -## 默认行域(未知型/高亮星标——未知型=名行直排) -func _fmt_default(row: Dictionary, prefix: String, suffix: String) -> String: - var name_: String = String(row.get("display_name", "")) - if String(row.get("type", "")) == "highlight": - return prefix + _gold_frame("★ %s" % name_) - return prefix + name_ + suffix - - -## 尾注域:目标格指向(行文附加) -func _tail_of(row: Dictionary) -> String: - var target := String(row.get("target", "")) - return " → %s" % target if target != "" else "" - - -## GP 型效果行域:「GP 袋 +3」兑付反馈——value = 本行 ±power, -## escrow = 战斗内缓冲现值(入钱包在战斗末一次上抛——呈现语义与增益池分账) -func _fmt_effect(row: Dictionary, prefix: String, suffix: String) -> String: - var v: int = int(row.get("value", 0)) - var hl := String(row.get("highlight", "")) - var name_: String = String(row.get("display_name", "")) - if String(row.get("effect_id", "")) in ["gp_gain", "gp_loss"]: - var gp_col := UiKit.HEX_LOG_GAIN if v > 0 else UiKit.HEX_LOG_LOSS - var gp_body := "%s %+d(战斗暂存 %+d)%s" % [name_, v, int(row.get("escrow", 0)), suffix] - return prefix + (_gold_frame(gp_body) if hl != "" else "[color=%s]%s[/color]" % [gp_col, gp_body]) - # 效果行 value = 单次贡献值,pool_value = 池合成值——禁相加呈现(战斗结算 呈现细则) - var pool: int = int(row.get("pool_value", 0)) - var col := UiKit.HEX_LOG_HEAL if v > 0 else UiKit.HEX_LOG_LOSS - var body := "%s 单次%+d(池 %+d)%s" % [name_, v, pool, suffix] - return prefix + (_gold_frame(body) if hl != "" else "[color=%s]%s[/color]" % [col, body]) - - -## 伤害行域:行上归因读数只剩掷点档位随行(护甲等级掷点留档——掷点读数与档位随行可读; -## 吃掷点分量恒带,棋盘来源行不带)。伤害数字不明显——伤害值放大加色独立于行文(朱红大一号) -func _fmt_damage(row: Dictionary, prefix: String, suffix: String) -> String: - var v: int = int(row.get("value", 0)) - var name_: String = String(row.get("display_name", "")) - var tail := _tail_of(row) - var roll_txt := "" - if row.get("roll", null) != null: - roll_txt = "〔掷 %d vs 护甲 %d" % [int(row.roll), int(row.ac)] - if bool(row.get("crit", false)): - roll_txt += " · 暴击×%d" % int(_db.combat.settlement.damage_roll.crit_multiplier) - elif int(row.tier) < 100: - roll_txt += " · ×%d%%" % int(row.tier) - roll_txt += "〕" - var kill := " ⚔击杀!" if row.get("killed", false) else "" - var body := "%s [color=#%s][size=17]-%d[/size][/color]%s%s%s%s" % [name_, UiKit.HEX_LOG_DMG_NUM, v, roll_txt, tail, kill, suffix] - if bool(row.get("crit", false)): - return prefix + _gold_frame(body) # nat 最大面暴击 = 金框高亮行 - var body_col := UiKit.HEX_LOG_DMG_KILL if row.get("killed", false) else (UiKit.HEX_LOG_ROUND if v == 0 else UiKit.HEX_LOG_DMG_BODY) - return prefix + "[color=%s]%s[/color]" % [body_col, body] - - -## 未生效行域:⚠ icon + 划线形状冗余(非色相独载)+ 聚合计数 -func _fmt_ineffective(row: Dictionary, prefix: String, suffix: String, agg_count: int) -> String: - var name_: String = String(row.get("display_name", "")) - var n := (" ×%d" % agg_count) if agg_count > 1 else "" - return prefix + "[s][color=#%s]⚠ %s%s[/color][/s]%s" % [UiKit.HEX_LOG_VOIDED, name_, n, suffix] - - -## 封印落空行域:完美破/首失豁免两注记分档(金框=破完美/普通墨=豁免) -func _fmt_seal_miss(row: Dictionary, prefix: String) -> String: - var hl := String(row.get("highlight", "")) - var name_: String = String(row.get("display_name", "")) - var miss_note := "" - if hl == "perfect_broken": - miss_note = "(本图完美封印已破——清图奖励不再加倍)" - elif hl == "": - miss_note = "(首次封印落空已豁免——不计入完美封印判定)" - var body := "✗ %s%s" % [name_, miss_note] - return prefix + (_gold_frame(body) if hl == "perfect_broken" else "[color=#%s]%s[/color]" % [UiKit.HEX_LOG_ROUND, body]) - - -## 裁定行域:胜金/负绿双墨(粗体菱形头) -func _fmt_verdict(row: Dictionary) -> String: - var name_: String = String(row.get("display_name", "")) - if int(row.value) == 1: - return "[color=#%s][b]◆ %s[/b][/color]" % [UiKit.HEX_LOG_WIN, name_] - return "[color=#%s][b]◆ %s[/b][/color]" % [UiKit.HEX_LOG_GAIN, name_] - - -func _strip_bb(bb: String) -> String: - var out := "" - var in_tag := false - for ch in bb: - if ch == "[": - in_tag = true - elif ch == "]": - in_tag = false - elif not in_tag: - out += ch - return out.replace(" ", " ").strip_edges() diff --git a/game/probe/ui_click_probe.gd b/game/probe/ui_click_probe.gd index b14e898c..00355107 100644 --- a/game/probe/ui_click_probe.gd +++ b/game/probe/ui_click_probe.gd @@ -870,13 +870,14 @@ func _ready() -> void: "phase": main.run_scope.settlement.action_economy.phase, "ap": main.run_scope.settlement.action_economy.ap, "settling": diag.settling, } - # 上轮摘要恢复断言(卡⑥ wr1-b——改前 _round_rows 类型错 append 全数失败、缓冲恒空、 - # 摘要自引入类型错以来从未显示):战中场观测点=round≥2 且排播队列已排空(轮首分隔行 - # 已消费=finish_settlement_round 已刷);不挂循环出口——收尾的续玩重建段会再走 log_view.clear() + # 上轮摘要位退役改判〔退役改 V-退役卡 R1 波及面——test-conventions §5.5 同生死〕: + # 原卡⑥ wr1-b 断言「摘要非空」(功能在役性回归);逐行文字列表退役后摘要内容源 + # (行缓冲)摘除、摘要位恒空——断言反转为退役态防回潮(摘要非空=旧行缓冲复活)。 + # 观测点不变=round≥2 且排播队列已排空;不挂循环出口——收尾的续玩重建段会再走本观测点。 if not _tested_round_summary and int(st["round"]) >= 2 and main.ui.screens.row_pacer.pending_rows().is_empty(): _tested_round_summary = true - if main.ui.battle.log_view._summary.text == "": - _problems.append("上轮摘要恒空(卡⑥ wr1-b——结算行缓冲仍失真)") + if main.ui.battle.log_view._summary.text != "": + _problems.append("上轮摘要非空(逐行流退役后摘要位应恒空——旧行缓冲复活)〔退役改 V-退役卡 R1〕") if JSON.stringify(st) == JSON.stringify(_last_state): # 排播演播期豁免(硬锁 v3——合法停顿态):演播期棋盘锁生效、probe 点击被吞、 # 逻辑态恒定属预期。判据=纯队列(与 main 锁同源)。Waiting 收尾等待期**不豁免**—— # 锁若把收尾链卡死,此处 stall 照报(探测面)。 @@ -1118,9 +1119,13 @@ func _ready() -> void: while ol_l1_wait < 24 and String(main.ui.battle.log_view._log.get_parsed_text()).count("· 种子 ") < 1: ol_l1_wait += 1 await get_tree().process_frame - if ol_l1_wait >= 24: - _problems.append("开场行路径①:L1 开场行未达日志(开局清日志后 24 帧内未现种子行)") - elif String(main.ui.battle.log_view._log.get_parsed_text()).count("(含面板加成)") > 0: + # 判定面换代〔退役改 V-退役卡 R1 波及面〕:逐行文字列表退役后开局清日志动作摘除 + # (main.gd 两处 clear 移除),前段叙述残留不再被清——判定面从「全文本计数」改 + # 「最新开场行本体」(按「· 种子 」形态锚取最后一行,不受残留影响) + var ol_l1_line := _latest_open_line(main) + if ol_l1_wait >= 24 or ol_l1_line == "": + _problems.append("开场行路径①:L1 开场行未达日志(24 帧内未现种子行)") + elif ol_l1_line.count("(含面板加成)") > 0: _problems.append("开场行路径①失守:白板局 L1 开场行带「(含面板加成)」(wc1 反向)") print("[click_probe] 开场行①判定 wait=%d 帧断言完成" % ol_l1_wait) # ②③ 断点续玩正向(既有快照喂入形态——代拍板 2 预授权;生产「继续上局」钮已随三入口化 @@ -1149,9 +1154,10 @@ func _ready() -> void: await get_tree().process_frame if main.run_scope.runner == null or main.run_scope.runner.journal().bonus_total("atk") != 5: _problems.append("开场行路径②③前提失守:续玩重建后加算区 atk!=5(断点回填链断)") - if ol_r_wait >= 24: + var ol_r_line := _latest_open_line(main) # 判定面换代同路径①——最新开场行本体(残留免疫) + if ol_r_wait >= 24 or ol_r_line == "": _problems.append("开场行路径②③失守:续玩重建未发开场行(选路停点形应重发——形态/驱动复核)") - elif String(main.ui.battle.log_view._log.get_parsed_text()).count("(含面板加成)") < 1: + elif ol_r_line.count("(含面板加成)") < 1: _problems.append("开场行路径②③失守:bonus 已入账(pct=0/ov=0)的续玩重建开场行未带「(含面板加成)」(wc1 正向/wc2)") else: print("[click_probe] 开场行②③判定:续玩重建开场行带后缀(bonus.atk=5、pct=0)— wait=%d 帧" % ol_r_wait) @@ -1560,6 +1566,16 @@ func _stoptest_assert_hit() -> void: _problems.append("停手定型化段:停手钮真点零命中登记(驱动空转假绿)〔QA收口 V2〕") +# 最新开场行本体(开场行①③判定面换代〔退役改 V-退役卡 R1〕——逐行流退役后开局清日志动作 +# 摘除,判定从「全文本计数」改「最后一行开场行」:按「· 种子 」形态锚自尾向头取首命中行) +func _latest_open_line(main: Node) -> String: + var lines := String(main.ui.battle.log_view._log.get_parsed_text()).split("\n") + for i in range(lines.size() - 1, -1, -1): + if String(lines[i]).count("· 种子 ") >= 1: + return String(lines[i]) + return "" + + func _first_hbox(node: Node) -> HBoxContainer: # 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:90 (位次真点定位——R4 判据面辅助) if node is HBoxContainer: diff --git a/game/tests/README.md b/game/tests/README.md index b5eb8dee..c6d8f259 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -138,23 +138,17 @@ tests/ | 日志 step 行零文案与结构化判读等价 | 表现与支撑 | `PlaytestLogger._on_step_row()`→`PlaytestLogger._append()`(真实结算→落盘 JSONL 读回) | `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`;`reward_ineffective_reason_test.gd:_assert_four_reasons` | | 模态覆盖层编排与输入锁 | HUD框架 | `ModalFlow.locks_input()`/`ModalFlow.open_after_playback()` | `modal_flow_test.gd:_init`;`reward_overlay_test.gd:_run` | | 模态句柄分域寻址面 | HUD框架 | 局内/菜单/营地三子容器句柄经注册面合同寻址(`UiRegistry.node()` 逐键取层)+模态编排口开合(`ModalFlow.open()`/`ModalFlow.close()`) | `ui_struct_probe.gd:_modal_registry_contract`(registry 合同序段+分域句柄段) | -| 未开格类型微光(8 邻作用集、五组色相、零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` | +| 未开格类型微光(8 邻作用集/五组色相/零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` | | 棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | HUD框架 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()`;读面 `BoardView.hover_probe()` | `ui_input_probe.gd:_ready`(case①到达②禁入③路径预览三语义) | | UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks`;`palette_token_pairwise_test.gd:_test_pairwise`(色板近色纪律存量面) | | 中文字体随包与字形覆盖 | HUD框架 | `UiKit.load_font()` | `ui_font_asset_test.gd:_init`;`theme_projection_test.gd:_smoke_global_theme` | -| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes`(旧行保留,删行归写卡段后续,实现批禁写) | -| 棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | 美术圣经 | `BoardTerrainLayer.setup()`/`BoardTerrainLayer.terrain_metrics()` | `board_terrain_test.gd:_test_merged_mass_geometry`;`board_terrain_test.gd:_test_projection_ratios`;`board_terrain_test.gd:_test_depth_order` | -| 棋盘浮空数字与引导线(最顶层、顶部预留) | 美术圣经 | `BoardFloatLayer.set_entries()`/`BoardFloatLayer.label_metrics()`/`BoardLabelShadowLayer.setup()` | `board_float_label_test.gd:_test_label_geometry`;`board_float_label_test.gd:_test_topmost_layer`;`board_float_label_test.gd:_test_contrast` | -| 棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | 美术圣经 | `BoardView.refresh()`/`BoardView._visual_rect_for()`/`CellUnit.fog_state` | `board_terrain_test.gd:_test_top_face_anchor`;`board_terrain_test.gd:_test_fog_rect` | -| D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | HUD框架 | `ApBarView.set_ap()`/`ApBarView.set_rap()`/`BoardZoneView._on_board_area_resized()` | `board_side_rail_test.gd:_test_side_rail_layout`;`board_side_rail_test.gd:_test_signals`;`stage_background_test.gd:_test_side_rail_width_from_table` | -| 棋盘点击命中与格边公式(逻辑格矩形) | HUD框架 | `BoardView.set_cell_area()`/`BoardView.cell_center_local()` | `board_terrain_test.gd:_test_cell_formula_base`;`board_terrain_test.gd:_test_hit_test_logical_rect`;`layout_probe.gd:_ready` | -| 旧瓦片退役与普通数字零底牌 | 美术圣经 | `BoardView.rebuild()`/`BoardView.refresh()`(资产装载与绘制路径) | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path` | +| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes` | | 站桩敌人呈现与结算演出落点 | 战斗表现 | `BattleStageView.enemy_standee_center()`/`BattleEndOverlay.open_victory()` | `standee_fx_sweep_test.gd:_init`;`pacing_queue_test.gd:_init` | | 站桩呈现定值与素材绑定 | 战斗表现 | `UiKit.load_tex()`/`StandeeBody.name_line_probe()` | `standee_present_values_test.gd:_init` | | 站桩显示档与素材分辨率绑定 | 战斗表现 | `StandeeBody.portrait_probe()`/`StandeeMotion.PORTRAIT_DISPLAY_H` | `standee_present_values_test.gd:_check_display_tier` | | B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) | HUD框架 | `BattleStageView.set_board_type()` | `stage_background_test.gd:_test_background_selection`;`stage_background_test.gd:_test_ground_layer_geometry`;`stage_background_test.gd:_test_beams_retired` | | 动画帧数规格(待机/攻击/受击;现役单帧形制锚定) | 战斗表现 | `UiKit.load_tex()`(`TEX_HERO_*` 四态件装载链——棋盘站立/行走与舞台三态同源) | `animation_frame_spec_test.gd:_test_spec_table`;`animation_frame_spec_test.gd:_test_current_form` | -| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula`;`stage_background_test.gd:_test_side_rail_width_from_table`/`_test_log_band_settle_height`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | +| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula`;`stage_background_test.gd:_test_ap_bar_height_from_table`/`_test_log_band_settle_height`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | | 调参测速批量模拟(逐帧步进与统计读数) | 调参测量 | `TuneSimController.run()`(调试浮窗批量模拟入口) | `tune_sim_batch_parity_test.gd:_init`(配对对拍套件) | | sim 驱动循环单点(缺省零变化与策略/日志回调形态) | 调参测量 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | `battle_driver_drive_test.gd:_smoke_drive_round_contract` | | 模拟玩家 0 格连锁算子(经真实闭包,零盲挖语义保持) | 调参测量×排雷玩法 | `AutoPlayer._deduce()`(经 `perfect_action()` 装配链) | `auto_player_deduce_test.gd:_smoke_zero_chain_rule` | @@ -224,7 +218,7 @@ tests/ | 排雷循环 | 排雷玩法.md | 装板与开局免费展开(封锁格无资源、计入清图);挖/封印合法性与可辨拒绝(拒绝零副作用、挖封印格被拒);封印受理即揭示(身份可查、受理零事件);清图口径换代(挖开∪封印、封印可完成清图) | 已覆盖 | — | | 排雷循环 | 棋盘生成.md | 棋盘按参数行出图、数字恒真;同参数同种子逐位复现、异种子不退化;可推理率与清图可达(合法性先于质量分)、重试有界、降级诚实 | 已覆盖 | — | | 排雷循环 | 行动经济.md | AP 扣费、末点耗尽即收轮与战斗收束清零;停手转存储备与轮内刷新(上限/AP 不重置/刷新图零清图奖励);下轮行动点修正排队与兑现 | 已覆盖 | — | -| 表现与支撑 | HUD框架.md | 拒绝反馈分面可辨与未知兜底文案;结算期零逐行文字与 FX 排播链保持;模态覆盖层编排与输入锁;未开格类型微光(8 邻作用集、五组色相、零玩法写入);UI 全局主题与按钮五态(含对比度锚);中文字体随包与字形覆盖;地形瓦片套与格面数字可读(旧行保留,删行归写卡段后续,实现批禁写);棋盘合并岩体与连续地面(深度遮挡、投影、崖面);棋盘浮空数字与引导线(最顶层、顶部预留);D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘);棋盘点击命中与格边公式(逻辑格矩形);旧瓦片退役与普通数字零底牌;棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心);战斗叙述与终局文案(数值带入/胜负互异);玩家面文案与危险格格面字形;战斗屏三区几何与棋盘格边长(分辨率两档×四档板型);B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役);模态句柄分域寻址面 | 已覆盖 | — | +| 表现与支撑 | HUD框架.md | 拒绝反馈分面可辨与未知兜底文案;结算期零逐行文字与 FX 排播链保持;模态覆盖层编排与输入锁;未开格类型微光(8 邻作用集/五组色相/零玩法写入);UI 全局主题与按钮五态(含对比度锚);中文字体随包与字形覆盖;地形瓦片套与格面数字可读;战斗叙述与终局文案(数值带入/胜负互异);玩家面文案与危险格格面字形;战斗屏三区几何与棋盘格边长(分辨率两档×四档板型);B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役);模态句柄分域寻址面 | 已覆盖 | — | | 表现与支撑 | 存档序列化.md | 存档写盘⇄读回往返保真;三槽位隔离与激活失败回滚;槽位摘要窥视与坏槽三态;启动态无激活不写盘;旧档迁移链与断点续玩零跳号;存档⇄RNG 快照往返保真 | 已覆盖 | — | | 表现与支撑 | 教学引导.md | — | 未覆盖 | 教学形态与首遇时机待设计;见待办清单「教学形态未定」条 | | 表现与支撑 | 数据配置.md | 全表装载、就绪态与表清单目录对账;进度坐标查行:精确命中/向上取整/封顶/警告去重;运行期越域致命与进程非 0 退出;加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域;表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 已覆盖 | — | diff --git a/game/tests/golden/README.md b/game/tests/golden/README.md index 5921d948..69a090e0 100644 --- a/game/tests/golden/README.md +++ b/game/tests/golden/README.md @@ -4,8 +4,7 @@ `windows/` 与 `mac/` 子目录各持一套,平台内部照常严格比对,跨平台不互比; 平台选择实现单点 = `tools/gate_platform.sh` 的 `gate_platform_id`,比较器 `tools/golden_compare.py` 自动拼平台子目录)。本目录现持:`windows/`(棋盘三图 `board_L1_dungeon` / `board_L2_underdark` / -`board_L3_deep_underdark`,裁剪区 1036×548(D 区基座档全幅;2026-11-07 棋盘地形换代后由探针视图全幅裁剪, -原 900×760 口径退役)+ 启动态菜单 `menu_boot`,全屏 + 关卡视口两 Shot +`board_L3_deep_underdark`,裁剪区 900×760 + 启动态菜单 `menu_boot`,全屏 + 关卡视口两 Shot `lmap_entry` / `lmap_boss`——2026-11-05 用户裁两 Shot 面:只对拍关卡最开始(入口停点)与 关卡 Boss 节点(末列锚定),中间过程不对拍)、 `level_map`(关卡画面全屏,历史基线留根——现行闸件未对拍它,由两 Shot 面接替)、 @@ -25,9 +24,6 @@ - **判有效**(changed 远低于 2% 阈值):基线**留在位**,不得顺手重制; - **判失效**(changed 超阈值或换代面落在裁剪区外):**显式重制 + 呈报 + 复闸**, 禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。 -- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(1036×548)一律按**判失效** +- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(900×760)一律按**判失效** 处理——占比远低于 2% 阈值也不判有效,显式呈报后由用户定是否重制。该口径只收紧棋盘三图的判读, 不改写 2% 容差本身的语义(`golden_compare.py` 判据不动);启动态菜单不适用本口径。 -- **越格口径(2026-11-07 棋盘地形换代)**:棋盘地形允许越格绘制——岩顶抬升、南/东崖面、四段投影、 - 浮空数字与引导线均按 art-bible §3.2 越出逻辑格边界;**「禁越圈」只约束类型微光层**(按该格抬升后 - 岩顶面 rect 判,不按逻辑格 rect),不约束地形/小人/浮空层。棋盘金标仍按上一条加严口径整幅严格比对。 diff --git a/game/tests/run_all.gd b/game/tests/run_all.gd index ae7a4287..1287b52f 100644 --- a/game/tests/run_all.gd +++ b/game/tests/run_all.gd @@ -192,6 +192,8 @@ func _suites() -> Array: {"path": "res://tests/unit/core/curio_refresh_paid_test.gd", "expect": 0}, # 三选一刷新免费双源+GP 付费档(对齐商店 MC-1:价曲线/优先序/停点清零/钱包单口) {"path": "res://tests/unit/core/level_map_type_vis_test.gd", "expect": 0}, # 信息迷雾——类型可见性(层距 N+Boss/候选豁免+单圈+N 读表+续玩同值) {"path": "res://tests/unit/presentation/pacing_queue_test.gd", "expect": 0}, # AC⑤/T9——排空零分叉/零丢行/延迟双态 + {"path": "res://tests/unit/presentation/battle_log_zero_text_test.gd", "expect": 0}, # 结算期 B 区零逐行文字(逐行结算排播退役——FX 排播链保持〔退役改 V-退役卡 R1〕) + {"path": "res://tests/unit/presentation/playtest_logger_step_fields_test.gd", "expect": 0}, # 日志 step 行零文案与全字段落盘〔退役改 V-退役卡 R3〕 {"path": "res://tests/unit/presentation/settings_store_test.gd", "expect": 0}, # 减动效开关存储契约(持久化回读/缺省值/引擎动效档应用)〔断言补齐批〕 {"path": "res://tests/unit/battle_settlement/boss_gate_test.gd", "expect": 0}, # Boss 节点开战必选 Boss 行集(行类路由+端到端)〔断言补齐批〕 {"path": "res://tests/unit/data_config/effect_kind_retired_test.gd", "expect": 1, "negative": true}, # 甲案词表退役——overflow/attack_segments 误写加载致命〔架构整改〕 @@ -211,6 +213,7 @@ func _suites() -> Array: {"path": "res://tests/unit/presentation/palette_token_pairwise_test.gd", "expect": 0}, # token 板两两互查守门(色板增量纪律存量面——豁免账外零近色对,六对欠账在册) {"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0}, {"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0}, + {"path": "res://tests/unit/battle_settlement/reward_ineffective_reason_test.gd", "expect": 0}, # 奖励未生效 reason 四类结构化〔退役改 V-退役卡 R5〕 {"path": "res://tests/unit/battle_settlement/effect_port_test.gd", "expect": 0}, # 效果端口件(效果端口与掷格分件批 V1–V3——端口单实例/业务类零引擎直连源码锚/事实面闭集两对照) {"path": "res://tests/unit/battle_settlement/roll_multiplier_test.gd", "expect": 0}, # 掷点与乘区宿主(敌攻击类型轴/护甲掷点行为面/乘区接线/伤害类型克制与标错/fresh 池攻击链——批 B 自 smoke_all 迁入) {"path": "res://tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd", "expect": 0}, # 结算接线同种子逐项 golden 对拍主证〔封装5.1〕(架构审查 5.1 封装修复——段类束注入改造零行为变更基线) diff --git a/game/tests/unit/battle_settlement/reward_ineffective_reason_test.gd b/game/tests/unit/battle_settlement/reward_ineffective_reason_test.gd new file mode 100644 index 00000000..74385f89 --- /dev/null +++ b/game/tests/unit/battle_settlement/reward_ineffective_reason_test.gd @@ -0,0 +1,138 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# 奖励未生效行 reason 结构化断言(结算期文字列表退役批 T2——日志零文案后未生效原因的分析判读面): +# 四类合法例外(满层拒收 / 满血治疗 / 无存活敌人 / 主角已倒下)的真实结算行各带结构化 reason 键, +# 取值逐一命中 full_layers / full_hp / no_enemy_alive / hero_down(分析工具按此四值分类—— +# 旧 text 子串判读退役后的替代判据面)。 +# 真实入口:真实板格身份快照(query_full_snapshot)→ grant_routed 正向路由 → 轮末结账; +# 两处受控例外直改(对照表申报:无公开 setter 可钉)——hero hp=0(倒下因)与敌 hp=1(先手清场因)。 +# 运行:godot --headless --path game --script res://tests/unit/battle_settlement/reward_ineffective_reason_test.gd(expect 0) +extends SceneTree + +const Kit := preload("res://tests/unit/test_kit.gd") +const ConfigDBScript := preload("res://core/config_db.gd") +const RewardTable := preload("res://data/schemas/reward_table.gd") + +var _db + + +func _init() -> void: +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:80 奖励未生效行=满层拒收、满血治疗等合法例外一行 +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:87 显示名等玩家可见文案是数据面字段(日志消费端零文案——reason 结构化替代) + _db = ConfigDBScript.new() + if not _db.load_tables("res://data/tables", true): + print("[reward_ineffective_reason_test] FAIL — 数值表加载失败") + quit(1) + return + _assert_four_reasons() + quit(Kit.finish("reward_ineffective_reason_test")) + + +func _orch(seed_v: int): + var rng = load("res://core/rng_service.gd").new() + rng.set_master_seed(seed_v) + return load("res://core/battle_orchestrator.gd").new(_db, rng) + + +# 真实板扫描:取某 cell_type 的首个非封锁格身份快照(seal_polarity 负向直验同款形态) +func _snap_of_type(settlement, ctype: String): + var board = settlement.minesweeper.current_board() + var r0 := {} + for c in board.compute_r0(): + r0[c] = true + for y in board.height: + for x in board.width: + var c := Vector2i(x, y) + if r0.has(c): + continue + var ident = settlement.query_reward_identity(c) + if ident != null and String(ident.cell_type) == ctype \ + and String(ident.cell_type) != RewardTable.TREASURE_ITEM_TYPE: + return settlement._reward_economy.query_full_snapshot(c) + return null + + +func _ineffective_rows(rows: Array) -> Array: + var out: Array = [] + for r in rows: + if String(r.get("type", "")) == "reward_ineffective": + out.append(r) + return out + + +# 四类 reason 逐一命中(断言前提=各类未生效行在案;reason 键取值=分析判读契约四值) +func _assert_four_reasons() -> void: +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:80 奖励未生效行四类合法例外 + print("--- 奖励未生效 reason 四类逐一命中 ---") + + # ---- ① full_hp:满血主角 + heal 型格正向(_flat_heal 满血分支即时兑付)---- + var s1 = _orch(20261108) + var rows1: Array = [] + s1.step_row.connect(func(row): rows1.append(row.duplicate(true))) + Kit.check("① 前提:战斗受理", s1.begin_battle({"level_index": 1, "node_depth": 0, + "hero_hp": int(_db.combat.hero.max_hp), "hero_max_hp": int(_db.combat.hero.max_hp)})) + var heal_snap = _snap_of_type(s1, "heal") + Kit.check("① 前提:heal 型格在板", heal_snap != null) + if heal_snap != null: + s1.reward_grant().grant_routed(heal_snap, "positive", {"source_class": "safe_cell", "cell": Vector2i(0, 0), "ri": 1}) + var hits := 0 + for r in _ineffective_rows(rows1): + if String(r.get("reason", "")) == "full_hp": + hits += 1 + Kit.check("① 满血治疗行带 reason=full_hp(命中 %d 行)" % hits, hits >= 1) + + # ---- ② hero_down:主角 hp=0(受控例外直改——无公开 setter)+ heal 正向 → 倒下分支 ---- + var s2 = _orch(20261109) + var rows2: Array = [] + s2.step_row.connect(func(row): rows2.append(row.duplicate(true))) + Kit.check("② 前提:战斗受理", s2.begin_battle({"level_index": 1, "node_depth": 0, + "hero_hp": int(_db.combat.hero.max_hp), "hero_max_hp": int(_db.combat.hero.max_hp)})) + var heal_snap2 = _snap_of_type(s2, "heal") + Kit.check("② 前提:heal 型格在板", heal_snap2 != null) + if heal_snap2 != null: + var hu = s2._enemy_system.hero_unit() # 受控例外:hero hp 直改(倒下因无公开写口) + hu["hp"] = 0 + s2.reward_grant().grant_routed(heal_snap2, "positive", {"source_class": "safe_cell", "cell": Vector2i(0, 0), "ri": 1}) + var hits2 := 0 + for r in _ineffective_rows(rows2): + if String(r.get("reason", "")) == "hero_down": + hits2 += 1 + Kit.check("② 主角已倒下行带 reason=hero_down(命中 %d 行)" % hits2, hits2 >= 1) + + # ---- ③ full_layers:defense 型格负向 → off_guard(stack 策略 max 16)反复授予至满层 → 全体拒收行 + # (满层拒收只发生在 stack 策略——accumulate 恒加层无拒收面;负向 mine_hit 路由=真实入口)---- + var s3 = _orch(20261110) + var rows3: Array = [] + s3.step_row.connect(func(row): rows3.append(row.duplicate(true))) + Kit.check("③ 前提:战斗受理", s3.begin_battle({"level_index": 1, "node_depth": 0, + "hero_hp": int(_db.combat.hero.max_hp), "hero_max_hp": int(_db.combat.hero.max_hp)})) + var def_snap = _snap_of_type(s3, "defense") + Kit.check("③ 前提:defense 型格在板", def_snap != null) + if def_snap != null: + var max_stack: int = int(_db.combat.status_effects.row_by_id("off_guard").get("max_stack", 16)) + for i in range(max_stack + 3): # 堆满后再给 3 份——拒收段必然到达 + s3.reward_grant().grant_routed(def_snap, "negative", {"source_class": "mine_hit", "cell": Vector2i(0, 0), "ri": 1}) + var hits3 := 0 + for r in _ineffective_rows(rows3): + if String(r.get("reason", "")) == "full_layers": + hits3 += 1 + Kit.check("③ 满层拒收行带 reason=full_layers(off_guard max_stack=%d,命中 %d 行)" % [max_stack, hits3], hits3 >= 1) + + # ---- ④ no_enemy_alive:敌 hp=1(受控例外直改)+ blast 正向单两张 defer → 轮末结账首单清场、次单无敌 ---- + var s4 = _orch(20261111) + var rows4: Array = [] + s4.step_row.connect(func(row): rows4.append(row.duplicate(true))) + Kit.check("④ 前提:战斗受理", s4.begin_battle({"level_index": 1, "node_depth": 0, + "hero_hp": int(_db.combat.hero.max_hp), "hero_max_hp": int(_db.combat.hero.max_hp)})) + var blast_snap = _snap_of_type(s4, "blast") + Kit.check("④ 前提:blast 型格在板", blast_snap != null) + if blast_snap != null: + for u in s4._enemy_system.query_alive("enemy"): # 受控例外:敌 hp 直改(先手清场因) + u["hp"] = 1 + s4.reward_grant().grant_routed(blast_snap, "positive", {"source_class": "safe_cell", "cell": Vector2i(0, 0), "ri": 1}) + s4.reward_grant().grant_routed(blast_snap, "positive", {"source_class": "safe_cell", "cell": Vector2i(0, 0), "ri": 1}) # 次单=结账时已无敌 + s4.minesweeper.settle_batch([{"action": "stop"}]) # 轮末五段——战斗段末 defer 统一结账 + var hits4 := 0 + for r in _ineffective_rows(rows4): + if String(r.get("reason", "")) == "no_enemy_alive": + hits4 += 1 + Kit.check("④ 无存活敌人行带 reason=no_enemy_alive(命中 %d 行)" % hits4, hits4 >= 1) diff --git a/game/tests/unit/core/feat_vouchers_test.gd b/game/tests/unit/core/feat_vouchers_test.gd index a312428b..e847e6de 100644 --- a/game/tests/unit/core/feat_vouchers_test.gd +++ b/game/tests/unit/core/feat_vouchers_test.gd @@ -288,20 +288,17 @@ func _init() -> void: Kit.check_quiet(o11.perfect_sweep_earned(), "A11 真值:误标 1 − 豁免 1 = 有效 0 且标中≥1 → 完美成立(与 highlight==空 一致)〔卡① N7〕") - # A12 呈现两态文案与 _format_row 一致:两态均零「雷」字面 - var LogViewScript := load("res://presentation/views/battle_log_view.gd") - var lv = LogViewScript.new(db, db.presentation.battle_layout) - var broken_row := {"type": "seal_miss", "source_class": "seal_miss", "origin_cell": [0, 0], - "round_index": 1, "display_name": "封印未中", "value": 0, "highlight": "perfect_broken"} - var forgiven_row := {"type": "seal_miss", "source_class": "seal_miss", "origin_cell": [0, 0], - "round_index": 1, "display_name": "封印未中", "value": 0} - var s_broken := String(lv._format_row(broken_row)) - var s_forgiven := String(lv._format_row(forgiven_row)) - Kit.check_quiet(s_broken.find("完美封印已破") >= 0 and s_broken.find("雷") == -1, - "A12 已破态:_format_row 输出「完美封印已破」且零「雷」字面〔卡① N7〕") - Kit.check_quiet(s_forgiven.find("已豁免") >= 0 and s_forgiven.find("雷") == -1, - "A12 豁免态:_format_row 输出「已豁免」且零「雷」字面〔卡① N7〕") - lv.free() + # A12 呈现两态文案退役改写〔退役改 V-退役卡 R1 波及面——test-conventions §5.5 同生死〕: + # 逐行文字列表退役后 _format_row 行格式化域整体摘除,seal_miss 两态文案(「完美封印已破」/ + # 「已豁免」)随明细带退出玩家面;断言改为退役态防回潮——行格式化方法不在位。 + var LogViewScript: Script = load("res://presentation/views/battle_log_view.gd") + var has_fmt := false + for m in LogViewScript.get_script_method_list(): + if String(m.get("name", "")) == "_format_row": + has_fmt = true + break + Kit.check_quiet(not has_fmt, + "A12 行格式化域已退役(_format_row 不在位——seal_miss 两态文案退出玩家面)〔卡① N7〕") sm.clear_breakpoint() diff --git a/game/tests/unit/presentation/battle_log_zero_text_test.gd b/game/tests/unit/presentation/battle_log_zero_text_test.gd new file mode 100644 index 00000000..84ffb32d --- /dev/null +++ b/game/tests/unit/presentation/battle_log_zero_text_test.gd @@ -0,0 +1,105 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# 结算期 B 区零逐行文字断言(逐行结算排播退役——08-Alpha v1.29 删「逐行结算排播」行、 +# 用户裁定 2026-11-07 撤逐行滚动文字列表保留伤害飘字与攻击特效): +# ① 真实结算产生逐行后(排播队列非空前提),B 区 RichTextLabel 行文本恒空(零逐行追加); +# ② 排播泵消费期间与 flush 排空后 parsed_text 恒空——step_row 消费零产生 append_text 行; +# ③ FX 排播链仍在(伤害行驱动演出层弹道/数字——演出不随文字退役,〔退役改 V-退役卡 R1〕)。 +# 载体:main.tscn 实例(组合根全链在座),真实冒险驱动至首战结算后断言(同 pacing_queue_test 形态)。 +# 运行:godot --headless --path game --script res://tests/unit/presentation/battle_log_zero_text_test.gd(expect 0) +extends SceneTree + +var _problems: Array = [] + + +func check(cond: bool, msg: String) -> void: +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) + if not cond: + _problems.append(msg) + + +func _init() -> void: +# 判据出处: design/gdd/08-Alpha版本标准.md:154 战斗演出链(弹道 / 受击 / 血条 / 灰化)在役; +# 逐行结算排播行已随 v1.29 退役——结算期 B 区零逐行文字、FX 排播链保持 + var main: Node = load("res://presentation/main.tscn").instantiate() + root.add_child(main) + await process_frame + for p in ["user://test_log_zero_text_save.json", "user://test_log_zero_text_save.json.tmp"]: + if FileAccess.file_exists(p): + DirAccess.remove_absolute(p) + var sm = main.get_node("/root/SaveManager") + sm.slots.attach_path("user://test_log_zero_text_save.json") + sm.meta_state.mark_first_adventure_done() + main._start_adventure_from_menu() + await process_frame + if not main.ui.modals.run.level_screen.visible: + _problems.append("入口停点未呈现(前置失守)") + _finish() + return + main.run_scope.runner.pick_next_node(int(main.run_scope.runner.next_candidate_ids()[0])) + await process_frame + await process_frame + var battle = main.run_scope.runner.current_battle() + if battle == null: + _problems.append("首战未开打(零文字断言无载体)") + _finish() + return + var rows_seen: Array = [] + battle.step_row.connect(_count_row.bind(rows_seen)) + # 理性策略挖掘至受理一动作(auto_player 单一实现复用——同 pacing_queue_test 两步消费) + var ms = battle.minesweeper + var ap = load("res://sim/auto_player.gd") + var acted := false + for guard in range(40): + var plan: Dictionary = ap.choose_dig(ms) + if plan.is_empty(): + break + if plan.hero_cell != ms.hero_pos(): + ms.settle_batch([{"action": "move", "cell": plan.hero_cell}]) + if battle.action_economy.phase != "Active": + break + var outcomes: Array = ms.settle_batch([{"action": "dig", "cell": plan.dig_cell}]) + acted = not outcomes.is_empty() and bool(outcomes[0].accepted) + if acted: + break + if battle.action_economy.phase == "Active": + ms.settle_batch([{"action": "stop"}]) + if not acted: + _problems.append("首战无受理动作(零文字断言无行)") + _finish() + return + await process_frame + check(rows_seen.size() > 0, "结算行已产生(断言前提:%d 行)" % rows_seen.size()) + var log_view = main.ui.battle.log_view + # 判据绑定面 = append_text 调用计数=0(「不绑终屏态」):进节点叙述行(node_banner,真实入口 + # 既有叙述面、非 step_row 消费产物)落带后采基线,断言 step_row 消费全程文本冻结零追加。 + var base_text: String = log_view.parsed_text() + # ---- 时点一:行已入队、排播泵消费中——零新增行 ---- + check(log_view.parsed_text() == base_text, "结算消费中 B 区零新增行(时点一:逐行追加零发生)〔退役改 V-退役卡 R1〕") + await process_frame + await process_frame + # ---- 时点二:泵已消费若干行——仍零新增(文字入带调用已撤,泵只驱动演出链)---- + check(log_view.parsed_text() == base_text, "泵消费数帧后 B 区零新增行(时点二)〔退役改 V-退役卡 R1〕") + # ---- flush 同步排空(模态前置契约路径)后再采——仍零新增 ---- + main.ui.screens.row_pacer.flush() + check(main.ui.screens.row_pacer.pending_rows().is_empty(), "flush 后队列排空(完整性前提)") + check(log_view.parsed_text() == base_text, "排空后 B 区零新增行(时点三:step_row 消费 append_text 计数=0)〔退役改 V-退役卡 R1〕") + _finish() + + +func _count_row(row: Dictionary, arr: Array) -> void: + arr.append(row.duplicate(true)) + + +func _finish() -> void: +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) + for p in ["user://test_log_zero_text_save.json", "user://test_log_zero_text_save.json.tmp"]: + if FileAccess.file_exists(p): + DirAccess.remove_absolute(p) + if _problems.is_empty(): + print("[battle_log_zero_text_test] PASS — 结算期 B 区零逐行文字 全绿") + quit(0) + else: + for p in _problems: + push_error("[battle_log_zero_text_test] FAIL — " + p) + print("[battle_log_zero_text_test] FAIL — " + p) + quit(1) diff --git a/game/tests/unit/presentation/pacing_queue_test.gd b/game/tests/unit/presentation/pacing_queue_test.gd index 5b093080..30f7e13e 100644 --- a/game/tests/unit/presentation/pacing_queue_test.gd +++ b/game/tests/unit/presentation/pacing_queue_test.gd @@ -15,11 +15,18 @@ var _problems: Array = [] # 记参假站桩(d12 排播半):继承真类以过类型面,只记解析入参 class FakeStage extends BattleStageView: var calls: Array[Array] = [] + var fx_rows: Array[Dictionary] = [] # on_step_row_fx 收到的行(FX 链计数载体) + + func on_step_row_fx(row: Dictionary) -> void: + fx_rows.append(row.duplicate(true)) func enemy_standee_center(target_id: String, display_name: String) -> Variant: calls.append([target_id, display_name]) return Vector2(10, 10) + func hero_standee_center() -> Vector2: + return Vector2(10, 10) + # 记参假演出层(同上——play_* 全部只记不演) class FakeFx extends SettlementFxView: @@ -105,19 +112,12 @@ func _init() -> void: main.ui.screens.row_pacer.flush() var snap_after: String = JSON.stringify(battle.diagnostic_snapshot()) check(snap_before == snap_after, "排空前后核心诊断快照逐位一致(AC⑤ 演出关停零分叉)") - # ---- 断言②:零丢行(结构判据:排空后队列恒空 + 末信号行原文在带——append_row 直落不吞行)---- + # ---- 断言②:零丢行(逐行文字列表退役后改判〔退役改 V-退役卡 R2〕:结构判据=排空后队列恒空, + # 行的落地面由「原文在明细带」改为「逐行进 FX 链」——由下方 _assert_fx_chain 对全行集断言承接)---- check(rows_seen.size() > 0, "结算行已产生(断言前提)") check(main.ui.screens.row_pacer.pending_rows().is_empty(), "排空后队列恒空(flush 完整性)") - var last_text := "" - for i in range(rows_seen.size() - 1, -1, -1): - var cand_row: Dictionary = rows_seen[i] - last_text = String(cand_row.get("text", "")) - if last_text == "": - last_text = String(cand_row.get("display_name", "")) - if last_text != "": - break - check(last_text != "" and main.ui.battle.log_view.parsed_text().contains(last_text), - "末信号行原文在明细带(排空不吞行:『%s』)" % last_text) + # ---- 断言②改判承接:FX 链逐行收拍(真实行集驱动——每行一拍站桩反馈,弹道/标出按型计数逐位对上)---- + _assert_fx_chain(main, rows_seen) # ---- 断言③:段间延迟取数面双态 ---- UiKit.motion_scale = 1.0 var d_on: float = main.pace_delay_for("damage", "heal") @@ -156,6 +156,110 @@ func _count_row(row: Dictionary, arr: Array) -> void: arr.append(row.duplicate(true)) +# FX 排播链断言(逐行文字列表退役后的行落地面——〔退役改 V-退役卡 R2〕): +# 判据出处: design/ux/battle.md:439 动效:结算逐行兑现为信息载体不可整体跳过,可加倍(减动效只调时长) +# 判据出处: design/gdd/08-Alpha版本标准.md:154 战斗演出链(弹道 / 受击 / 血条 / 灰化)在役 +# 真实行集(夹具采样的 step_row 载荷)驱动独立 RowPacer,断言: +# ① 每行恰好一拍站桩反馈(on_step_row_fx 计数=行数);② 弹道/标出调用计数与行型分布逐位对上 +# (期望从行集独立推导、实际从记参假件读——不镜像实现);③ 断言前提=行集非空(非空自检)。 +# 记参假棋盘 FX(highlight 分支载体——perfect sweep / seal hit 弹道只记不演) +class FakeBoardFx extends BoardFxView: + var calls: Array[String] = [] + + func play_perfect_sweep() -> void: + calls.append("perfect_sweep") + + func play_seal_hit_projectile(_heavy: bool) -> void: + calls.append("seal_hit_projectile") + + +# 记参假 toast(skill_unlock 行载体) +class FakeToast extends ToastStack: + var texts: Array[String] = [] + + func show_toast(text: String, _tone: String = "info") -> void: + texts.append(text) + + +# 记参假棋盘区(_consume_row highlight 分支的 fx/toast 载体) +class FakeBoardZone extends BoardZoneView: + var board_fx := FakeBoardFx.new() + var toast_stack := FakeToast.new() + + +func _assert_fx_chain(main: Node, rows_seen: Array) -> void: + var rp = RowPacerScript.new() + var fstage := FakeStage.new(null, root.get_node("/root/ConfigDB").presentation.battle_layout) + var ffx := FakeFx.new() + var fzone := FakeBoardZone.new(root.get_node("/root/ConfigDB").presentation.battle_layout) + fzone.fx = fzone.board_fx + fzone.toast = fzone.toast_stack + rp.stage = fstage + rp.board_view = main.ui.battle.board_zone.board_view + rp.settlement_fx = ffx + rp.board_zone = fzone + rp.refresh_request = func() -> void: pass + rp.pump_ended = func() -> void: pass + for row in rows_seen: + rp.enqueue(row.duplicate(true)) + rp.flush() + check(rows_seen.size() > 0, "FX 链断言前提:行集非空(非空自检)") + check(fstage.fx_rows.size() == rows_seen.size(), + "每行恰好一拍站桩反馈(on_step_row_fx %d/%d)〔退役改 V-退役卡 R2〕" % [fstage.fx_rows.size(), rows_seen.size()]) + # 期望计数从行集独立推导(演出语义=0.4 硬契约:伤害行弹道+数字、治疗行弹道+数字、效果行色环) + var exp_projectile := 0 + var exp_mark := 0 + var exp_pulse := 0 + for row in rows_seen: + var t := String(row.get("type", "")) + var tgt := String(row.get("target", "")) + if t == "damage": + exp_projectile += 1 + exp_mark += 1 + elif t == "heal" and (tgt == "hero" or tgt == ""): + exp_projectile += 1 + exp_mark += 1 + elif t == "heal": + exp_mark += 1 + elif t == "effect": + exp_pulse += 1 + var got_projectile := 0 + var got_mark := 0 + var got_pulse := 0 + for c in ffx.calls: + match String(c[0]): + "projectile": got_projectile += 1 + "mark": got_mark += 1 + "pulse": got_pulse += 1 + check(got_projectile == exp_projectile, + "跨区弹道计数与行型分布逐位一致(%d/%d)〔退役改 V-退役卡 R2〕" % [got_projectile, exp_projectile]) + check(got_mark == exp_mark, + "结算标出数字计数与行型分布逐位一致(%d/%d)〔退役改 V-退役卡 R2〕" % [got_mark, exp_mark]) + check(got_pulse == exp_pulse, + "状态色环计数与行型分布逐位一致(%d/%d)〔退役改 V-退役卡 R2〕" % [got_pulse, exp_pulse]) + # highlight 三路(完美封印横幅=高光行非解锁技;封印命中加重弹道=seal_hit 高亮键不限行型; + # Boss 解锁技名 toast=skill_unlock 键)——期望按行协议语义独立推导 + var exp_sweep := 0 + var exp_seal_hit := 0 + var exp_toast := 0 + for row in rows_seen: + var t := String(row.get("type", "")) + var hl := String(row.get("highlight", "")) + if t == "highlight" and hl != "skill_unlock": + exp_sweep += 1 + elif hl == "seal_hit": + exp_seal_hit += 1 + if hl == "skill_unlock": + exp_toast += 1 + check(fzone.board_fx.calls.count("perfect_sweep") == exp_sweep, + "完美封印横幅计数与行分布逐位一致(%d/%d)〔退役改 V-退役卡 R2〕" % [fzone.board_fx.calls.count("perfect_sweep"), exp_sweep]) + check(fzone.board_fx.calls.count("seal_hit_projectile") == exp_seal_hit, + "封印命中弹道计数与行分布逐位一致(%d/%d)〔退役改 V-退役卡 R2〕" % [fzone.board_fx.calls.count("seal_hit_projectile"), exp_seal_hit]) + check(fzone.toast_stack.texts.size() == exp_toast, + "解锁技名 toast 计数与行分布逐位一致(%d/%d)〔退役改 V-退役卡 R2〕" % [fzone.toast_stack.texts.size(), exp_toast]) + rp.free() + + func _finish() -> void: # 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) for p in ["user://test_pacing_queue_save.json", "user://test_pacing_queue_save.json.tmp"]: diff --git a/game/tests/unit/presentation/player_copy_sweep_test.gd b/game/tests/unit/presentation/player_copy_sweep_test.gd index 9cbb480c..c4e78de3 100644 --- a/game/tests/unit/presentation/player_copy_sweep_test.gd +++ b/game/tests/unit/presentation/player_copy_sweep_test.gd @@ -101,11 +101,17 @@ func _sweep_source_names() -> void: row_view._hide_tip() Kit.check("结算表 source_label_map[mine_hit]==「危险格」(u6 换代——ConfigDB 真装载)〔wa7〕", String(_db.combat.settlement.core.source_label_map.get("mine_hit", "")) == "危险格") - var log_view = load("res://presentation/views/battle_log_view.gd").new(_db, _db.presentation.battle_layout) - var row_txt := String(log_view._format_row({"type": "effect", "source_class": "mine_hit", - "display_name": "挖掘反噬", "value": -5, "pool_value": -5, "round_index": 1})) - Kit.check("战斗日志 mine_hit 来源行含「(危险格)」(u6 消费半——_format_row 生产路径)〔wa7〕", - row_txt.contains("(危险格)")) + # u6 消费半退役改写〔退役改 V-退役卡 R1——test-conventions §5.5 同生死〕:逐行文字列表退役后 + # 行格式化域(_format_row)摘除,来源标签玩家可见面只余状态槽 tooltip(u5 承接)与数据表; + # 断言改为退役态防回潮——行格式化方法不在位(防旧行文本呈现路径复活)。 + var LogViewScript: Script = load("res://presentation/views/battle_log_view.gd") + var has_fmt := false + for m in LogViewScript.get_script_method_list(): + if String(m.get("name", "")) == "_format_row": + has_fmt = true + break + Kit.check("行格式化域已退役(_format_row 不在位——来源标签只由数据表与 tooltip 承载)〔wa7〕", + not has_fmt) # ⑦⑧ 已开危险格字形族(u7/u8/u9——BoardView rebuild 真实刷新路径+源 token 扫描) diff --git a/game/tests/unit/presentation/playtest_logger_step_fields_test.gd b/game/tests/unit/presentation/playtest_logger_step_fields_test.gd new file mode 100644 index 00000000..b3ff11a4 --- /dev/null +++ b/game/tests/unit/presentation/playtest_logger_step_fields_test.gd @@ -0,0 +1,108 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# 日志 step 行零文案与全字段落盘断言(结算期文字列表退役批 T2——日志零文案只存字段): +# 真实入口 = sim 采集链(LevelAutoplay.run_level 挂 PlaytestLogger.start_session → 真实结算 → +# close_session 落盘 JSONL 读回),断言: +# ① 全型 step 行零中文文案(text / display_name 两键不存在); +# ② 公共七字段(kind/type/source/cell/round/value/highlight)与平铺原件(origin_cell/round_index/ +# source_class)逐型在位——日志逐行全字段落盘义务不变(公共字段集除文案两键外零删减); +# ③ payload 键抽样在位(damage 行 roll/ac/tier/normal/pierce/magic/baseline——改前键集实证在册, +# 反事实精确重算数据面不被零文案改动静默吞键)。 +# 运行:godot --headless --path game --script res://tests/unit/presentation/playtest_logger_step_fields_test.gd(expect 0) +extends SceneTree + +const Kit := preload("res://tests/unit/test_kit.gd") +const ConfigDBScript := preload("res://core/config_db.gd") + +var _problems: Array = [] + + +func check(cond: bool, msg: String) -> void: +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) + if not cond: + _problems.append(msg) + + +func _init() -> void: +# 判据出处: design/gdd/08-Alpha版本标准.md:154 演出链在役(逐行结算排播已随 v1.29 退役)—— +# 日志零文案只存字段(text/display_name 不落盘),其余全字段与 payload 逐键保留 + var db = ConfigDBScript.new() + if not db.load_tables("res://data/tables", true): + _problems.append("数值表加载失败(夹具前提)") + _finish() + return + _assert_no_text_and_full_payload(db) + _finish() + + +func _assert_no_text_and_full_payload(db) -> void: +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:87 显示名等玩家可见文案是数据面字段(日志消费端零文案) + var logger = load("res://presentation/playtest_logger.gd").new() + logger.ap_per_round = int(db.run.action_economy.ap_per_round) # 注入序前置(守卫拒后开——R5 必填) + var log_path: String = logger.start_session(4242) + var autoplay = load("res://sim/level_autoplay.gd") + var st = autoplay.run_level(db, 4242, 1, 0, 0, false, logger, "normal", "min") + logger.close_session() + check(bool(st.get("terminated", false)) or int(st.get("rounds", 0)) > 0, + "真实结算已跑(夹具前提:rounds>0——result=%s log_path=%s)" % [String(st.get("result", "?")), String(st.get("log_path", "?"))]) + # 落盘 JSONL 读回(start_session 返回路径——采集链同源) + var f := FileAccess.open(log_path, FileAccess.READ) + check(f != null, "日志文件可读(%s)" % log_path) + if f == null: + return + var steps: Array = [] + while not f.eof_reached(): + var line := f.get_line() + if line.strip_edges() == "": + continue + var parsed: Variant = JSON.parse_string(line) + if parsed is Dictionary and String(parsed.get("kind", "")) == "step": + steps.append(parsed) + f.close() + check(steps.size() > 0, "step 行非空(断言前提:%d 行)" % steps.size()) + # ---- ① 全型零文案(text / display_name 两键不存在)---- + var text_hits := 0 + var display_hits := 0 + for s in steps: + if (s as Dictionary).has("text"): + text_hits += 1 + if (s as Dictionary).has("display_name"): + display_hits += 1 + check(text_hits == 0, "全 step 行零 text 键(命中 %d/%d)〔退役改 V-退役卡 R3〕" % [text_hits, steps.size()]) + check(display_hits == 0, "全 step 行零 display_name 键(命中 %d/%d)〔退役改 V-退役卡 R3〕" % [display_hits, steps.size()]) + # ---- ② 公共七字段 + 平铺原件逐型在位 ---- + var common := ["kind", "type", "source", "cell", "round", "value", "highlight", + "origin_cell", "round_index", "source_class"] + var misses: Array[String] = [] + for s in steps: + for k in common: + if not (s as Dictionary).has(k): + misses.append("%s 缺 %s" % [String(s.get("type", "?")), k]) + check(misses.is_empty(), "公共字段与平铺原件逐行在位(缺:%s)〔退役改 V-退役卡 R3〕" % [", ".join(misses)]) + # ---- ③ damage 行 payload 键并集抽样(反事实精确重算数据面在册——单行键随行型分布, + # 并集才是改前契约形态:掷点键逐行必有、分量键按攻击来源分布)---- + var dmg_union := {} + var dmg_seen := 0 + for s in steps: + if String(s.get("type", "")) == "damage": + dmg_seen += 1 + for k in (s as Dictionary).keys(): + dmg_union[k] = true + check(dmg_seen > 0, "damage 行在册(抽样前提:%d 行)" % dmg_seen) + var payload_missing: Array[String] = [] + for k in ["roll", "ac", "tier", "normal", "baseline"]: + if not dmg_union.has(k): + payload_missing.append(k) + check(payload_missing.is_empty(), + "damage 行 payload 键并集在位(缺:%s)〔退役改 V-退役卡 R3〕" % [", ".join(payload_missing)]) + + +func _finish() -> void: +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) + if _problems.is_empty(): + print("[playtest_logger_step_fields_test] PASS — 日志 step 行零文案与全字段落盘 全绿") + quit(0) + else: + for p in _problems: + push_error("[playtest_logger_step_fields_test] FAIL — " + p) + print("[playtest_logger_step_fields_test] FAIL — " + p) + quit(1) diff --git a/game/tests/unit/presentation/theme_projection_test.gd b/game/tests/unit/presentation/theme_projection_test.gd index 0e0093ef..e5a30f51 100644 --- a/game/tests/unit/presentation/theme_projection_test.gd +++ b/game/tests/unit/presentation/theme_projection_test.gd @@ -378,51 +378,92 @@ func _smoke_type_glow() -> void: viewB.free() -# ---- 战斗日志视图·行格式化呈现层同步闸(真人试玩卡断 bug 回归: -# 伤害行 attach 字段变更后本视图拆行分支漏网未同步——敌方首笔攻击行带 baseline 无 attach, -# _format_row Invalid access 使结算段中途夭折、界面卡死。行协议变更必须同步呈现层〔战斗结算 §行协议〕, -# 本段把现行行形态逐型喂进真实视图:拆行残留与行字段错位在此转红)---- +# ---- 行消费 FX 链呈现层同步闸(原「行格式化 9 类同步闸」退役改写〔退役改 V-退役卡 R1〕: +# 逐行文字列表退役后行格式化域摘除,行协议的呈现层消费面 = row_pacer FX 链——原防 +# 「格式化 Invalid access 卡死结算段」的盲区检测法(解析文本增长)等价迁移为 FX 落拍计数增长: +# 行协议 9 类逐型经排播泵消费零炸、每型落拍一拍站桩反馈)---- func _smoke_battle_log_view() -> void: -# 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:272 (明细带行协议组) - print("--- 战斗日志视图行格式化(行协议 9 类呈现层同步闸)---") - var view = load("res://presentation/views/battle_log_view.gd").new(_db, _db.presentation.battle_layout) - # 敌方行动伤害行(现行形态:baseline 在场、attach 已出协议——修复前此行即 Invalid access) - view.append_row({"type": "damage", "display_name": "地精 撕咬", "value": 2, "target": "主角", - "baseline": 3, "roll": 15, "ac": 12, "tier": 100, - "source_class": "enemy_action", "round_index": 2}) - var enemy_txt: String = view.parsed_text() - Kit.check("敌方伤害行格式化(baseline 行不读退役 attach)", - enemy_txt.contains("撕咬") and enemy_txt.contains("〔掷 15 vs 护甲 12")) - Kit.check("退役伏击/基线拆行文案不再出现", - not enemy_txt.contains("伏击") and not enemy_txt.contains("基线")) - # 主角攻击行·单分量模型(payload 只带实际攻击类型一键——pierce/magic 多键即崩) - view.append_row({"type": "damage", "display_name": "主角攻击", "value": 4, "pierce": 4, - "roll": 20, "ac": 13, "tier": 100, "crit": true, "killed": true, - "source_class": "hero_attack", "round_index": 2}) - var hero_txt: String = view.parsed_text() - Kit.check("主角穿刺型暴击行金框(单分量 payload 不触发三分量拆行)", - hero_txt.contains("暴击×") and hero_txt.contains("⚔击杀") and hero_txt.contains("■")) - Kit.check("退役三分量拆行文案不再出现", not hero_txt.contains(" + 穿刺 ")) - # 未生效行聚合(pattern 3 聚合纪律——同键两行呈现 ×2 不逐行刷屏) - view.append_row({"type": "reward_ineffective", "display_name": "增益未生效(满层)", "batch_key": "attack_up", "source_class": "safe_cell", "round_index": 1}) - view.append_row({"type": "reward_ineffective", "display_name": "增益未生效(满层)", "batch_key": "attack_up", "source_class": "safe_cell", "round_index": 1}) - view.append_row({"type": "heal", "display_name": "急救包", "value": 3, "target": "主角", "source_class": "safe_cell", "round_index": 1}) - var agg_txt: String = view.parsed_text() - Kit.check("未生效行聚合计数 ×2 呈现", agg_txt.contains("⚠") and agg_txt.contains("×2")) - # 其余行型逐型喂入:格式化中途夭折 = 解析文本零增长(脚本错误静默吞断言的盲区由此转为可见 FAIL) - var rest := { +# 判据出处: design/gdd/08-Alpha版本标准.md:154 战斗演出链(弹道 / 受击 / 血条 / 灰化)在役—— +# 行协议 9 类逐型经排播泵消费零炸、每型落拍(明细带行协议呈现已退役) + print("--- 行消费 FX 链同步闸(行协议 9 类逐型零炸)---") + var rp = load("res://presentation/row_pacer.gd").new() + var fstage := _FxChainFakeStage.new(null, _db.presentation.battle_layout) + var ffx := _FxChainFakeFx.new() + var fzone := _FxChainFakeZone.new(_db.presentation.battle_layout) + fzone.fx = fzone.board_fx + fzone.toast = fzone.toast_stack + rp.stage = fstage + rp.board_view = BoardView.new() + rp.settlement_fx = ffx + rp.board_zone = fzone + rp.refresh_request = func() -> void: pass + rp.pump_ended = func() -> void: pass + # 行协议 9 类逐型喂入(现行形态样本——敌方伤害行 baseline 在场 attach 已出协议; + # 格式化中途夭折 = 落拍零增长,脚本错误静默吞断言的盲区由此转为可见 FAIL) + var samples := { + "damage": {"type": "damage", "display_name": "地精 撕咬", "value": 2, "target": "主角", + "baseline": 3, "roll": 15, "ac": 12, "tier": 100, + "source_class": "enemy_action", "round_index": 2}, "effect": {"type": "effect", "display_name": "攻击强化", "value": 1, "pool_value": 2, "effect_id": "attack_up", "source_class": "seal_hit", "round_index": 1}, + "heal": {"type": "heal", "display_name": "急救包", "value": 3, "target": "主角", "source_class": "safe_cell", "round_index": 1}, + "reward_ineffective": {"type": "reward_ineffective", "display_name": "增益未生效(满层)", "batch_key": "attack_up", "source_class": "safe_cell", "round_index": 1}, "seal_miss": {"type": "seal_miss", "display_name": "封印未中", "source_class": "seal_miss", "round_index": 1}, "cast": {"type": "cast", "display_name": "卓尔精灵 施放 毒雾", "source_class": "enemy_action", "round_index": 3}, "decay": {"type": "decay", "value": 1, "round_index": 3}, "verdict": {"type": "verdict", "display_name": "下一轮次", "value": 0, "round_index": 3}, "highlight": {"type": "highlight", "display_name": "完美封印!清图奖励 ×2", "value": 2, "source_class": "clear_reward", "round_index": 4}, } - for row_type in rest: - var before: int = view.parsed_text().length() - view.append_row(rest[row_type]) - Kit.check("行型 %s 格式化落地(解析文本增长)" % String(row_type), - view.parsed_text().length() > before) + for row_type in samples: + var before: int = fstage.fx_rows.size() + rp.enqueue(samples[row_type]) + rp.flush() # rp 未进树——同步排空消费(pacing_queue_test 同款) + Kit.check("行型 %s FX 落拍(站桩反馈计数增长)" % String(row_type), + fstage.fx_rows.size() > before) + Kit.check("逐型全落拍(9 类行协议消费零炸)", fstage.fx_rows.size() == samples.size()) + rp.free() + + +# FX 链逐型闸记参假件(pacing_queue_test 同款形态——本套件独立定义防跨套件耦合) +class _FxChainFakeStage extends BattleStageView: + var fx_rows: Array[Dictionary] = [] + + func on_step_row_fx(row: Dictionary) -> void: + fx_rows.append(row.duplicate(true)) + + func enemy_standee_center(_target_id: String, _display_name: String) -> Variant: + return Vector2(10, 10) + + func hero_standee_center() -> Vector2: + return Vector2(10, 10) + + +class _FxChainFakeFx extends SettlementFxView: + func play_projectile(_from: Vector2, _to: Vector2, _glyph: String, _col: Color, _crit: bool = false) -> void: + pass + + func play_damage_number(_pos: Vector2, _text: String, _col: Color, _crit: bool = false) -> void: + pass + + func play_status_pulse(_pos: Vector2, _col: Color) -> void: + pass + + +class _FxChainFakeZone extends BoardZoneView: + var board_fx := _FxChainFakeBoardFx.new() + var toast_stack := _FxChainFakeToast.new() + + +class _FxChainFakeBoardFx extends BoardFxView: + func play_perfect_sweep() -> void: + pass + + func play_seal_hit_projectile(_heavy: bool) -> void: + pass + + +class _FxChainFakeToast extends ToastStack: + func show_toast(_text: String, _tone: String = "info") -> void: + pass # ---- 开场行后缀尾接协议(迭代36 wc1 静态半——level_open_line 第五参布尔直控尾接,签名零变; diff --git a/reports/需求卡片-二三关棋盘观感批-2026-10-16.md b/reports/需求卡片-二三关棋盘观感批-2026-10-16.md new file mode 100644 index 00000000..584a91a7 --- /dev/null +++ b/reports/需求卡片-二三关棋盘观感批-2026-10-16.md @@ -0,0 +1,292 @@ +# 需求卡片:第二 / 三关棋盘观感——亮度与对比度批(T1 定性人闸 · T2 按轴修法 · 验收三件套 · 文档面全走反哺点) + +- 版本:**v1.4(2026-10-17 开工前预授权 U1〔用户于开工前一次性决断,防开发中反复打断〕——①Q2 甲/乙由「延裁·T1 出口现场裁」改**判据自动裁**:甲案候选样张读数达标即直接走甲不停机,仅当读数证伪「纹理太碎」假说时才呈报裁乙;②V2 定向目标带数值授权批内按 T1 实测读数自定并随定性报告呈报,T1 出口人闸只确认轴归因与修法方向;③详见 §10 Q2 条与开工门 U1 预授权条);v1.3(2026-10-17 文档同步闸 v3 口径修订,纯文档批〔分支 carddoc-20261017〕按用户六条裁定执行——①本批(代码实现批)禁写 `design/` 整目录与根规则文件,§5 同步面的同步义务一律执行为「列进 `reports/iter30-反哺点-<完成日>.md`(哪个文件哪一节、改成什么、依据),用户会话裁决后归文档批落文」;②产出物落位换代:实现报告/代拍板追认单/反哺点清单三份落 `reports/`,不再 `design/qa/`;③T5 末卡改「产出物落位卡」(三份 reports/ 文件写齐才算收口);④闸口径按域选档:重闸 = `tools/run_all_gates.sh` 按改动域选档(本批 → `--code`),卡内不再写死闸件名单与「全量档」类字样;⑤实机目检项写进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单,「登记 07」转反哺点;§10 裁决留痕原文不动);v1.2(2026-10-16 裁决留痕版:三卡待裁项按用户令定案——Q3 已裁甲·同批、Q2 延裁留痕并将裁点挂至 T1 出口呈报硬流程步骤、排期栏定实「已编入迭代 30」与三卡串行序位、§4B 跨卡依赖按已裁事实改实、全卡零悬空待裁点;v1.1 同日 grilling 审查修订见 §11;v1.0 同日成文)** +- **指路订正(2026-10-20)**:徽章卡(迭代 30 卡①)已按 doc-conventions §11「吸收即死」退役,本卡对其三处指路句改为结论内联+提交号 `7ffd1dc0`,裁决内容零变更。 +- 来源:[06-待办清单](../design/gdd/06-待办清单.md)「第二 / 三关棋盘观感——亮度与对比度」小节(2026-10-13 用户裁定条)+ [playnote](../playnote.md) 用户试玩原始记录:「UI优化,第二第三关的棋盘看着太累了;不知道是因为亮度还是对比度的原因,看着非常费劲,非常不舒服」 +- 归属:**表现层美术修批**(06 在册条目直接写卡;两轴归属 = [HUD框架](../design/gdd/systems/表现与支撑/HUD框架.md)(UI 轴)+ [美术圣经](../design/art/art-bible.md)(素材轴),定性前两方共裁——沿用 06 条裁决) +- 排期:**已编入迭代 30(2026-10-16 用户令编入,roadmap 行已在案;批内状态刷新列反哺点)**。同迭代三卡串行序位第 3:未开格类型徽章批卡(迭代 30 卡①,已入库合并 7ffd1dc0,卡片已退役)→[战斗一屏样张批卡](需求卡片-战斗一屏样张批-2026-10-16.md)→本卡(徽章→样张→观感)。**并行例外**:本卡 T1/T1b 采样与定性读数允许与前两卡并行穿插——依据=采样是只读动作(出帧/读数/样张均不触碰 golden 三张、样张主板、§5 同步面文档等汇聚文件),落码修改(T2 起)仍按上述序位串行。开工门 = U0,须用户 `/iter` 发令;且 T1 出口定性人闸未过之前禁止动码——该闸 = [06 本条](../design/gdd/06-待办清单.md)既有裁决硬步骤(「开工前先过『素材轴 / UI 轴』定性人闸」,2026-10-13 用户裁定;[08 git 提交史](../design/gdd/08-Alpha版本标准.md) v0.3 同款注),**不是待裁点**(v1.1 撤销原 Q1,见 §10)。 +- **立场前提(用户原话,本卡设计的第一约束)**:此条立项原因就是用户实机觉得现在的画面累眼、且对「纯程序化重产现状」明确不满——「如果还是用原有方式弄出来的东西,有没有可能还是我不满意的?」。本卡对此的正面回应 = ①第一步定性用**可量化的读数归因**(明度直方图 / 相邻格对比 / 高频能量 / WCAG 对),禁止凭感觉猜轴;②两条修法各自的产出物写清**相对现状新增什么**(§6 T2 两案效果上限表);③**诚实的效果声明**:观感是主观项,机检只能证伪(读数红 = 必有问题)不能证真(读数绿 ≠ 用户满意),**阻塞性人闸全部前置**(T1 定性闸 + 契约 4 方向闸),入库后实机目检按 2026-10-12 用户令口径**登记不阻塞**——目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单(「入册 07」列反哺点;[AGENTS.md](../AGENTS.md) 红线「真人检测只登记不阻塞——禁以等目检为停工理由」口径不变),用户复判否决走 §7 V4 回补机制(行回待做 + 06 立残留条,落文按 v3 口径归文档批)。防「改一轮还是不满意」的机制 = **先出改前/改后并排对比读数样张给用户定性确认方向,方向过了人闸才落码**(🔴 契约 4)——方向若被否决,返工停在样张层,不烧落码与基线。 + +--- + +### 0. 前置依赖与既有裁决 + +| # | 前置 | 内容 | +|---|---|---| +| P1 | **定性人闸(06 条既有裁决——流程硬步骤,非待裁点)** | 06 原文(445 节内):「开工前须先定性(沿用既有裁决)……两轴修法完全不同,定性错了等于白改一轮」+ 状态行「开工前先过『素材轴 / UI 轴』定性人闸」(2026-10-13 用户裁定条;该要求最早载于 06「奇物呈现优化探讨备忘两孤儿点」(e),本条承接转正)。本卡 T1 即该闸承载,结论过用户确认才进 T2——v1.0 曾把此闸再列 Q1 待裁,v1.1 撤销(禁再问已裁项) | +| P2 | **与「呈现层残余 <4.5:1 文字位」条的分工(06 条既有注记)** | 06:451 分工句原文:「本条管**棋盘区域整体的观感**(亮度/对比度/费劲感),是体感问题;『呈现层残余 <4.5:1 文字位』管**具体文字位的对比度读数不达标**(B 区站桩名行/敌顺位徽标/RAP 反馈行三处),是机检可判的硬指标。两条不同面,不互相替代,各自保留」;该文字位条已随迭代 26 T3 完成(06:443)。本卡管棋盘区域整体观感(体感问题),**禁吞并该条**(🔴 契约 2);T1 读数若发现新的文字位红点,另行登记,不并入本卡 | +| P3 | **08 标准覆盖行** | [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md)「五 · 表现」表「棋盘观感(第二/三关亮度与对比度)」行(08:145)现为**待做**(事实源指向本 06 条);Alpha 完成判据 = 全部条目在役 ⇒ 本卡完成时该行 待做→在役 改写列反哺点(§6 T5;时机=本批入库,落文归文档批,目检复判否决的回补机制见 V4) | +| P4 | **08 未决项关联(按名指路;v1.1 按实查改写)** | 08「七 · 未决项」现行表含「**素材升档重产进不进 Alpha**」行(2026-10-16 实查为该表第 6 行,另有「**立绘清晰度回退评估**」行——未决项表 2026-10-16 v1.6 重编号过,**行号不作指路依据,一律按名找**);「素材升档重产」在「五 · 表现」表现为**待裁**(08:154)。06「资产升档重产批」条现行状态注记 = 2026-10-04 用户令「暂不做、先忽略,重启=用户点名」+ 2026-10-06「优先级再降」+ 2026-10-06 方案二注记(原升档路线已被八敌逐键定档实质走完、剩余挂起项=提灯点亮解禁候选)。划界:该批面向**立绘/小人帧尺寸升档**,本卡素材轴乙案 = **L2/L3 棋盘瓦片色板/纹理方案重做**——对象、管线、闸面均不同面,**裁本卡乙案 ≠ 放开升档重产**,呈报时须带此划界(§6 T2 乙案行) | +| P5 | **渲染闸与基线现状** | 棋盘三关 golden 基线冻结于 2026-09-30(`tools/golden_compare.py:11`),改瓦片/改常量**必然**破 Δ≤16/changed≤2% 容差 ⇒ 基线换代是本卡的确定义务而非例外处理(§7 V3) | + +--- + +## 1. 目标与完成定义 + +**目标**:把 L2/L3 棋盘「看着太累」的观感问题**归因到轴**(素材轴 / UI 轴 / 两轴共因),按轴修复,并经用户实机复核确认体感改善。 + +**完成定义**(五件齐才算完成,缺一即该条在 06 保持待办): +1. T1 定性报告交付:逐关三测面(棋盘瓦片区 / 舞台底与屏根 / 叠加层)读数表 + 归因结论(轴判定,引用具体数值);**T1 出口定性人闸过**(06 已裁硬步骤,P1); +2. T2 修法按裁定轴别落码/落素材,既有样张口径闸全部保持绿(A6 梯度均值 ≥4.70、F6 立面双明度带 Δ≥18、格底明度档 §4.1、图底分离——见 §2.4;**注**:该组断言现行落点=样张主板(dungeon 拼板,`render_sample_sheet_v3.py:130-131`),L2/L3 分关实测属本批新建读数件(T1b),见 §11 攻击面 2); +3. 验收三件套走完:机检读数达标 + 渲染闸 golden 基线显式重制并呈报换代面 + 用户实机目检轮**登记**(目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单,「入册 07」列反哺点;2026-10-12 用户令=登记不阻塞入库,否决走 V4 回补); +4. 08「五 · 表现」棋盘观感行 待做→在役 改写列反哺点(含 07 目检登记注;落文归文档批); +5. §5 同步面每条在 `reports/iter30-反哺点-<完成日>.md` 有落点(06 对应条目状态更新条在内);权威文档与根规则文件零直改。 + +**效果不确定性的诚实声明**:观感是主观项。机检读数能证伪(超带 = 必有问题)不能证真(达标 ≠ 满意)。证真面由**前置人闸**承担(T1 定性闸 + 契约 4 方向样张闸——方向不过不落码);入库后的实机目检轮按 2026-10-12 用户令「真人检测只登记不阻塞」执行,用户复判若仍不满意 = V4 回补机制触发(08 行回待做 + 06 记残留、下批重开),不算本批未入库。 + +--- + +## 2. 现状事实(2026-10-16 实查;开工日自行复核行号) + +### 2.1 关级与瓦片(素材轴现状) + +| # | 事实 | 出处 | +|---|---|---| +| F1 | 三关板型与图类型:L2 12×12 underdark / L3 13×13 deep_underdark;**L1 行群主体 10×10 dungeon、但含 12×12 dungeon 行**(2026-10-16 逐行实查 `board_gen.tres`——level_index 1 段内有一行 12×12),故 T1 的 L1 参照位读数面须覆盖两种板型(词表 v1.1) | `game/data/tables/board_gen.tres` 各行;`game/data/schemas/board_gen_table.gd:13` | +| F2 | 每关瓦片 = **墙 16 件 + 地面 5 变体,合计 21 件**(v1.0 误写「墙类 21 件」,v1.1 订正:16 唯一墙名单单点在 `TILE_WALL_NAMES` 常量数组,件名数=16;21 为总数)按 `terrain_%s_%s.png` / `terrain_floor_%s_%d.png` 格式装载;源 dungeon 套为 v9.3 定稿,underdark/deep_underdark 套由程序换色产出;另有**不参与换色的板面相关件**:`flag_seal.png`(封印旗,三关共用独立可选件) | `game/presentation/views/board_view.gd:80-89`;`tools/recolor_terrain_tiles.py` 头注;素材实盘 `game/assets/art/board/`(underdark/deep_underdark 各 21 件与 dungeon 套同构;素材不入 git,用户裁定) | +| F3 | 换色方法 = 槽位家族重映射(wall/facade/floor/crater 四族),**亮度秩序逐像素保持**、确定性零随机、唯一色数与源一致;目标色表在脚本 `PALETTES` 内 | `tools/recolor_terrain_tiles.py:10-12`(方法注)+ `:40-60`(色表) | +| F4 | 现行换色色表读值:underdark 地面 `G_BASE (62,66,80)`、crater 最深 `P_DEEP (9,10,15)`;deep_underdark 地面 `G_BASE (46,48,64)`、crater 最深 `P_DEEP (5,5,9)`——**冷蓝紫、低明度、crater 近纯黑**;对照 dungeon 源 `G_BASE (88,66,50)` 暖中明度 | 同上 `PALETTES` | +| F5 | 色相域方向(机检在案):underdark ≈180°–260° 灰白蓝紫 / deep_underdark ≈200°–280° 蓝黑紫黑;断言「deep 墙顶明度恒暗于 underdark」 | `game/tests/unit/presentation/terrain_tile_sets_test.gd:61-64, :82`;方向权威 = art-bible §4.3 | +| F6 | 图类型换皮四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`)与恒定不变槽(信息语义色全图型恒定、格底两档明度关系恒定);格底硬指标:未开墙顶 L≥0.30、已开底走世界底层档候选 L 0.08–0.14、饱和 ≤0.55、避 300°–345° 禁入带 | [art-bible](../design/art/art-bible.md) §4.3 / §4.1「对比硬指标」/ §4.2 紫赤条 | + +### 2.2 UI 轴现状(舞台底与叠加层常量位点) + +| # | 事实 | 出处 | +|---|---|---| +| F7 | 舞台底 `STAGE_BG #3E342A`(62,52,42)= B 区舞台面板暗底;屏根 `BG_ROOT #3A2E22`;暖亮档 `BG_BRIGHT #453723`(提暖提亮禁近黑配色总纲在册) | `game/presentation/views/ui_kit.gd:111-113, :121`;`battle_stage_view.gd:44-47` | +| F8 | 视野迷雾叠加层:灯光区半径 `FOG_RADIUS 8`(基准值改动 = 非白名单须用户);**区外未开格 = 全黑不渲染(不透明纯黑盖全部叠层)**;区外已开格 = 记忆态灰显;雾轮廓 `UiKit.FOG_OUTLINE` | `board_view.gd:137, :817-822`;`board_cell_unit.gd:111-117, :252-256`;规格 = art-bible §6.5 + HUD框架「视野迷雾」节 | +| F9 | 数字墨三态管线(v3.4 定案):双峰纹理板(underdark/deep_underdark 系)= 色牌垫底 `DIGIT_PLATE + 深墨 #33261B`;亮族判据 p90 ≥4.5:1 / 均值 ≥2.5:1 | `board_view.gd:987-989`;art-bible §4.1 数字墨条 | +| F10 | 类型微光 v2 呈现**规格** = 内缘带状泛光 α170 / 带宽 cell÷8,亮度不压格底明度档(§2 微光例外);五组色带样张 v2 定稿。**v1.1 注**:类型微光游戏内**尚无独立实装**(呈现层仅接触带微光在跑;实施归同迭代 30 的未开格徽章批,见 §4A)——本卡 T1 的微光测面读数源=样张 v2 静态定稿图,实机渲染帧里没有该层 | art-bible §4.2「类型微光色带」条;HUD框架「未开格类型微光」节实装状态行(:130-142) | + +### 2.3 L2/L3 差异面(同批与否的判据) + +- 板型不同(12×12 vs 13×13)、色板不同(F4/F5 两套槽值,deep 系整体再暗一档)、格边长换算随板型变(06 在册「格边长三方取值不一致」条为已知偏差,本卡不动);数字墨模式两关同属双峰板色牌态(F9)。⇒ L2、L3 观感读数**必须分开设点**,修法同批——Q3 已裁甲·同批(2026-10-16 用户令,§10),两关槽值差异由 T1 分关读数(T1b)承载。 + +### 2.4 既有量化口径(样张 v3 与机检链,验收判据引用面) + +| # | 口径 | 定值 | 出处 | +|---|---|---|---| +| C1 | **A6 观感密度:明度梯度均值**(相邻像素相对亮度差均值——高频细节能量;低频双峰由 A3 承载) | ≥4.70(v1 同口径实测 4.09 上调 15%) | `tools/render_sample_sheet_v3.py:26, :338, :1007-1022`(历史脚本注释含 v1 实测值)。**v1.1 核注**:该组断言(A3/A6/F6)现行作用面 = 样张主板(`terrain_*_dungeon` 拼板,脚本 `:130-131`)——L2/L3 瓦片改动**既不会触动这组闸、也测不到它们**;「分关实测」属本批新建读数件(T1b),非现成能力 | +| C2 | **F6 立面双明度带** | Δ≥18(现行执法定值 `FACADE_MIN`) | 同上 `:339`、`:996` 消费点与 v3.5 冻结口径注(`:1154`) | +| C3 | **A3 图底分离**(墙/地) | **现行执法 = v3.5 冻结定值 A3b Δ≥30**(方向稿实测 38);旧 Δ≥55 系色牌制地板 L0.036 时代校定,与格底分档带数学冲突已退役 | 同上 `:975-979`(退役注+现行 check)、`:1154`;`:23, :340` 之 55 为历史注释残迹 | +| C4 | 格底明度档 | §4.1:世界底层档候选 L 0.08–0.14 / 墙顶 L≥0.30 / 饱和 ≤0.55(48 色上限与 RGB 三通道差 ≥8/255 双门在 §4.1 增量纪律在案;「待定现用」态释义同节) | art-bible §4.1 | +| C5 | 渲染闸现行链 | `tools/render_gate.sh` 四段:shot_probe 七屏→`shot_checker.py` A–D+F 语义断言(B 文字对比 ≥4.5:1 / C 明度三档带 / D 文字禁压纹理 / F 文字在判据〔2026-10-15 补〕;E 焦点预算归人闸)→ fx/board 取证 → 棋盘三张 golden(差 ≤16、changed ≤2%)→ 菜单 golden;基线重制工具 `tools/golden_baseline_refresh.sh`(缺省模式=棋盘三张;`--menu`=菜单全屏;素材缺位拒跑;呈现批 agent 自行换代+提交说明强制写明触发原因——权限口径在其头注) | `render_gate.sh:8-25, :109-155`;`shot_checker.py:8-19`;`golden_baseline_refresh.sh:2-14` | +| C6 | 三关棋盘抓帧承载(读数采样源) | `board_shot_probe` targets = L1_dungeon / L2_underdark / L3_deep_underdark,随 render_gate 周期跑;同关驱动确定性=种子 420000+关号 + novice 18 步 + 1.2s 动画完结等待(可复现)。**v1.1 边界注**:帧面 = 空视口上裸挂 BoardView(900×900)——棋盘瓦片区与迷雾遮罩层**在帧内**,**舞台底/屏根像素不在帧内**(battle_stage_view/BG_ROOT 未实例化);「舞台底/叠加层只在渲染帧里存在」系 v1.0 不准确表述,舞台底为常量平铺(UiKit 可读值)。且 render_gate 过程帧落 mktemp 即弃禁入 git——T1 用帧须自行留档于库外目录 | `game/smoke/board_shot_probe.gd:34, :38-66`;`render_gate.sh:22`(过程产物纪律) | + +--- + +## 3. 设计契约(红线,违反 = L3 停机呈报) + +🔴 **契约 1 · 零玩法逻辑变更**:只动呈现(瓦片素材/色表、舞台底与叠加层常量、样张脚本判据)。板生成、数字真值、迷雾判定逻辑、`FOG_RADIUS` 基准值(改动须用户,`board_view.gd:137` 注)零触碰。 + +🔴 **契约 2 · 禁吞并文字位条**:「呈现层残余 <4.5:1 文字位」是另一面(该条已随迭代 26 完成,本卡不复活、不并账);本卡发现的任何文字位新红点 = 新登记条目,另批处理。 + +🔴 **契约 3 · 色板纪律不破**:任何换色/重产色板须过 art-bible §4.1 增量纪律双门(48 色上限、与既有任一色 RGB 三通道差 ≥8/255)+ §4.2 语义检查与信息面禁入带 300°–345°;素材轴甲案并须保持 recolor 脚本的亮度秩序逐像素保持方法学(改了方法 = 换案,须重述本契约)。 + +🔴 **契约 4 · 样张先行、方向人闸后落码**:T2 任一修法落码前,必先出**改前/改后并排对比样张 + 读数表**给用户定性;用户未确认方向 = 停在样张层,禁先行改素材改常量。此条是「防改一轮还是不满意」的机制本体。**v1.2 注**:素材轴甲/乙裁决呈报件(§6 T1 呈报硬步骤)与本闸是同批产物——用户呈报现场裁甲后,裁甲案时本闸即已过关、不重复呈报;裁乙案时乙方向样张另走本闸。 + +🔴 **契约 5 · 机检 ≠ 观感,前置人闸承担方向证真**:读数达标只构成必要条件,机检不能证明满意——「证真」面由**前置**人闸承担(T1 定性闸〔06 已裁〕+ 契约 4 方向样张闸)。入库后的实机目检轮按 2026-10-12 用户令口径执行(AGENTS.md 红线「真人检测只登记不阻塞」):目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单即完成义务、不卡入库(「入册 07」列反哺点);**禁把「机检全绿」写成「用户满意」的等价表述**——用户复判否决时按 V4 回补(08 行回待做 + 06 记残留、下批重开,落文按 v3 口径归文档批)。(v1.1 改写注:v1.0 本条「完成判定必须含用户实机目检轮、目检未过禁宣布在役」与 2026-10-12 用户令冲突,已对齐。) + +🔴 **契约 6 · golden 基线换代显式化**:改图必破基线——重制走 `tools/golden_baseline_refresh.sh` 显式流程(缺省模式重制棋盘三张:board_shot_probe 抓帧→`golden_board_crop.py` 按 meta 坐标裁剪→覆盖 `game/tests/golden/` 三张;触及菜单态加跑 `--menu`),并逐屏呈报换代面(新旧基线并排,沿 render_gate S2 停机点口径);权限与义务=呈现批 agent 自行换代、**提交说明强制写明触发原因**(refresh 脚本头注 Q6 在册);前置=素材齐盘(脚本逐项守卫,缺位拒跑)。**禁先刷基线后改图**(基线是判据不是障碍物)。 + +--- + +## 4. 范围边界 + +**做**:L2/L3 棋盘区域观感的定性归因(T1)、按轴修复落码(T2)、同批策略(T3)、验收三件套与基线换代(T4)、产出物落位(T5)。 + +**不做**(明示去向): +- 不动 L1 dungeon 套外观——除非 T1 读数显示问题为系统性共因(如迷雾档/舞台底全关同因,则 UI 轴修法天然全关生效,素材轴仍只动 L2/L3 色表); +- 不动数字墨三态管线本身(`_digit_ink_mode` 选模逻辑维持),只动其消费的板面;改后三模式断言 `terrain_tile_sets_test` 必仍绿; +- 不做「格边长三方取值不一致」条的处置(06 在册待扩板定档,另批); +- 不做「立绘清晰度回退评估」/「素材升档重产」两未决项的代裁(本卡甲/乙裁点仅覆盖棋盘瓦片重产路线,且已挂至 T1 出口呈报硬流程步骤——裁决留痕见 §10,未决项不代裁、禁重开); +- 不动未开格类型微光的呈现规格(§4.2 单通道纪律维持;**该层引擎尚未实装,实施归未开格徽章批——§4B**;T1 会把微光层列为读数额外测面〔证据级别=样张 v2 静态图,F10〕,T2 无「动参数」可言——若归因指向它,处置为联裁或走 art-bible §4.2 修订登记)。 + +--- + +## 4B. 跨卡依赖(同迭代 30 的两张同板面批——v1.1 新增;v1.2 按 2026-10-16 三卡已裁定案改实) + +本卡与**未开格类型徽章批**(迭代 30 卡①,已入库合并 7ffd1dc0,卡片已退役)、**战斗一屏样张批**(`需求卡片-战斗一屏样张批-2026-10-16.md`)共用 L2/L3 板面,事实与已裁结果如下(只列事实与裁决留痕,他批未裁项仍不代裁): + +| # | 交叠面 | 事实 | 本卡处置 | +|---|---|---|---| +| X1 | **徽章批微光层 × 本卡格底/墙顶瓦片改色,同一张未开格面** | 徽章批把五组类型微光实装进未开格(其 T0-② 五组明度档以 art-bible §4.1「未开格底 L≥0.30 不被压破」为约束基线);本卡素材轴改的正是 `tile_closed`(墙顶/未开底)明度——**两批改同一板面、先后互为约束**:本卡若抬/压墙顶档,徽章批五组明度档取值基线随之移动。art-bible §4.3 共同纪律已册:「三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险)」(:379) | 色板/微光互辨复测两批并档一次跑;本卡新色表呈报件须含「对五组微光色带吞没风险」逐项比对;**v1.2 定实(2026-10-16 用户令)**:三卡串行序位徽章→样张→观感(排期栏),golden 棋盘三张换代次数=先落者(徽章批)刷一次、本卡作为后落者再刷一次,不再挂呈报定序;徽章批微光**明度档 provisional 值**(其 Q2 已裁甲=本批定档)与本卡**格底明度档同基线**(art-bible §4.1 格底档 L 0.08–0.14、墙顶/未开格底 L≥0.30)——两卡改格底/叠光时须逐位比对 golden 防互踩,该约束已同步写入 §6 T2 修法约束 | +| X2 | **战斗一屏样张批 Q1(素材输入级别)/Q3(渲染手段)与本卡乙案(瓦片重产)** | 样张批 Q1 丙案语义 =「样张反向给素材重产提规格」;样张批明示「本批不重产任何正式素材」——**重产的产出义务全在本卡(若裁乙)**,样张的规格输入义务也在本卡上游对齐;若样张批先以占位板面冻结,本卡乙案重产后整屏样张的板面内容过期 | **v1.2 定实(2026-10-16 用户令)**:样张批已裁 **Q1 丙**(样张反提素材规格)/**Q3 乙**(引擎实拍+shader)——本卡乙案(远程生图重产)**若**在 T1 出口呈报后被裁,瓦片规格**必须与样张卡已冻结的目标规格清单对齐,先后次序=样张规格先行、本卡乙案在后**;甲案 recolor 换色不触样张主板(dungeon 拼板,C1 核注),对样张批零连带、不受该次序约束 | +| X3 | **徽章批「不动格底明度档、棋盘瓦片素材、图类型换皮四槽」红线(其 §4 不做条)** | 徽章批单向避撞本卡面;反向不成立——本卡改瓦片会动其微光绘制基面(其 F5:微光画在 CellUnit `_draw` 瓦片层上) | 本卡任何改图产物过 V5 时须同时跑徽章批既有断言面(若其已入库);串行序位已定实(徽章→样张→观感,排期栏)——徽章批先落,本卡 T1 报告按该序位复核 X1/X3 承接项,不再挂定序呈报 | + +**结论笔**:两依赖均为**次序与规格联动**问题,不是范围冲突;2026-10-16 用户令已定案——串行序位徽章→样张→观感(排期栏)、Q3 已裁甲(同批)、Q2 甲/乙裁点挂 T1 出口呈报硬流程步骤(§6 T1/§10);本卡无悬空待裁点。 + +--- + +## 5. 关联文档同步面 + +> **v1.3 执行口径(2026-10-17 文档同步闸 v3)**:本批(代码实现批)**禁写 `design/` 整目录与根规则文件**,唯一可写目录 = `reports/`(`active.md` 唯一例外)。下表「同步义务」列一律执行为「列进 `reports/iter30-反哺点-<完成日>.md`:哪个文件哪一节、改成什么、依据,用户会话裁决后归文档批落文」——下表保留原关联点事实供写反哺点条目时对表。 + +| 文档 | 关联点 | 同步义务(v1.3 全部=反哺点列清单,另注者除外) | +|---|---|---| +| [06-待办清单](../design/gdd/06-待办清单.md) 本条 | 状态行改写(定性报告交付/完成注记);T1 发现的新红点若立新条则同批登记 | 反哺点 · 列清单待裁 | +| [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md) 「五 · 表现」棋盘观感行 | 待做→在役(完成定义第 4 件;批入库时改写并顺带 07 目检登记注;用户复判否决走 V4 回补——行回待做+06 记残留) | 反哺点 · 完成时列清单 | +| [art-bible](../design/art/art-bible.md) §4.1/§4.3(素材轴改色表值)或 §6.5/§7(UI 轴改常量方向) | 数值定值单点纪律:改值 = 走该节修订并登记(「待定现用」态),禁只改代码不改文档 | 反哺点 · 列清单待裁(条目写明改值与修订登记要求) | +| [HUD框架](../design/gdd/systems/表现与支撑/HUD框架.md) 视野迷雾节 | 仅当 T2 裁到迷雾灰显档参数时 | 反哺点 · 条件列清单 | +| [07-体验验证清单](../design/gdd/07-体验验证清单.md) | T4 登记实机目检条目(L1/L2/L3 并排看后问卷式回报) | 反哺点 · 列清单待裁(目检项另进 reports/ 实现报告目检总清单) | +| [roadmap](../roadmap.md) | 迭代 30 行已编入(2026-10-16 用户令,行已在案);余留义务=估时刷新(T5) | 反哺点 · 列清单待裁 | +| `active.md` 状态记录 | 本批条目进度刷新 | **本批更新(唯一例外 · 会话状态源)** | +| `tools/recolor_terrain_tiles.py` / `game/tests/golden/` | 甲案色表修订 = 脚本内定值换代;golden 基线三张重制 | 工程面 · 随修法落地(可写) | +| [playnote](../playnote.md) | 历史试玩记录不回改(沿革留档),本卡即其正式承接 | 无义务 | + +--- + +## 6. 任务卡 + +> 估时按工作日口径;每卡出口自跑轻闸;批末重闸 = `tools/run_all_gates.sh` 按改动域选档(本批 → `--code`)全绿才合入(脚本即唯一闸清单,卡内不另列名单)。 + +### T1 定性步骤(人闸前置;含 T1b 新建采样件合计 ≈2–2.5d,**必先做,产出物 = 定性报告 + 对比样张**) + +逐关(L1 参照位·注意含 10×10 与 12×12 两板型〔F1〕 / L2 / L3)三测面采样。**采样源按测面分治(v1.1 修正)**: +- 测面一(棋盘瓦片区)与测面三(迷雾遮罩部分)= `board_shot_probe` 实机渲染帧(确定性可复现,C6;过程帧 render_gate 即弃——本批帧自行留档于库外目录,读数表进 `reports/iter30-实现报告-<完成日>.md`);**禁拿素材文件代替渲染帧**(迷雾遮罩/揭示态只在渲染帧里存在); +- 测面二(舞台底与屏根)= **现有探针拿不到**(board_shot_probe 帧内无舞台底/屏根像素;shot_probe 战斗屏只到 L1 首战)⇒ 由 **T1b 新建采样件**补齐,见下;退而求其次可用 UiKit 常量×帧内实测值合成 WCAG 对(可算,但板缘对比带需几何语境,合成判据只能佐证不能实证); +- 测面三中的类型微光贡献 = 读数源仅样张 v2 静态定稿图(引擎未实装,F10),T1 报告如实标注该测面的证据级别。 + +输出读数表: + +| 测面 | 指标(全部数值化,禁裸形容词) | +|---|---| +| 棋盘瓦片区 | 整板明度直方图 p10/p50/p90;A6 同口径**明度梯度均值**(相邻格/相邻像素亮度差——高频能量);唯一色数与色域跨度 | +| 舞台底与屏根 | `STAGE_BG`/`BG_ROOT` 对棋盘墙顶、米白装饰族的两两 **WCAG 对比对**;三档带序(shot_checker C 断言口径的层带思想,按帧实测复算——其现行取样面是 L1 战斗屏,不直接复用)实测值——**取样依赖 T1b 全框帧** | +| 叠加层 | 迷雾**全黑档面积占比**(区外未开格 = 不透明纯黑)与记忆档灰显值;色牌占板面像素占比;微光带宽与泛光 α 的观感贡献(**证据级别=样张 v2 静态图,引擎未实装——F10**;若徽章批同迭代先行实装则可升级为帧内实测,见 §4B) | + +**T1b 新建采样件(批内任务,≈0.5–1d;v1.1 补——v1.0 默认现成件够用,实查不成立)**:给测面二供帧、并承载 **L2/L3 分关读数**(直方图/A6 同口径梯度按关出值——样张 v3 断言现只跑主板,C1 核注)。落点取一(白名单 1 域内):① 扩 `board_shot_probe` 加全框模式(BoardView 挂进 battle_stage_view/屏根底之上出 L2/L3 全框帧,与既有三张 golden 取样帧互不污染);② 新建 L2/L3 战斗整屏取证探针(shot_probe 真实路径口径只达 L1 首战,扩关需确定性到达方案)。出口判据:帧面含棋盘+舞台底+屏根三层且逐跑可复现。 + +**归因判据(写死在报告模板里)**: +- 素材轴信号 = L2/L3 板区读数与 L1 参照位在 明度带(对照 §4.1 档)/ 梯度均值 / 色域 上的偏离为主因(例:crater `P_DEEP (5,5,9)` 近纯黑叠加迷雾纯黑 ⇒ 大面积死黑;亮部墙顶跨度过大 ⇒ 闪烁感;「纹理太碎」假说在案最强证据 = 2026-10-14 美术审计结论条「第二 / 三关地面是近黑斑加亮筋的双峰纹理——数字无论亮墨还是垫牌,盯久了都会累。这不是再叠一层界面能救的」〔`reports/美术审计-cursor会话存档-2026-10-14.md` 结论区〕); +- UI 轴信号 = 舞台底/叠加层贡献为主因(例:全黑面积占比 × 边缘对比产生的频闪感;`STAGE_BG` 对板缘对比带过宽); +- 两轴共因 = 两类偏离同时显著(报告须给出各自量级占比,修法按主次分配工作量)。 + +出口 = 定性报告 + **改前基准样张**提交用户,过 **T1 出口定性人闸**——06 已裁硬步骤(P1:「开工前先过『素材轴 / UI 轴』定性人闸」),闸上同时冻结轴归因结论与 §7 V2 定向目标带数值;v1.0 曾误把该闸本身列为待裁点 Q1,v1.1 撤销(禁再问已裁项)。 + +**T1 出口素材轴甲/乙裁决呈报点(v1.2 新增硬流程步骤——Q2 延裁所挂裁点的具名呈报动作,裁决留痕见 §10)**: +- **触发条件**:T1 归因结论产出即触发,随定性报告一并呈报(无论归因指向哪条轴,呈报不可省略); +- **动作**:开工默认先做**甲案(recolor 换色)候选样张**——按甲案试算槽值出改前/改后并排样张,用 T1b 分关读数证伪「纹理太碎」假说(甲样张读数达标而用户方向仍否决 = 指向乙); +- **产物与落点**:改前/改后并排样张 + 分关读数表(含甲案试算槽值清单)随定性报告呈报用户。**v1.4 预授权(2026-10-17 用户裁)**:甲案样张读数达标即按 §10 Q2 判据**自动走甲**、不停机等现场裁;仅当读数证伪「纹理太碎」假说时才呈报裁乙(呈报内容照旧:改前/改后并排样张+分关读数表)。结论按 §10 格式补记留痕后即成 T2 执行依据——裁点由该具名动作承载,全卡不留悬空待裁点。 + +### T2 修法(按轴分支;≈1.5–2.5d,落码前须过契约 4 对比样张人闸) + +**素材轴——甲/乙裁点已由 2026-10-16 用户令定为「延至 T1 定性读数出具后再裁;开工默认先做甲案候选样张以证伪纹理说」(裁决留痕 §10;呈报硬流程步骤见 §6 T1 末)**: + +| 案 | 产出物**相对现状新增什么** | 效果上限 | 成本与风险 | +|---|---|---|---| +| **甲 · recolor 程序换色重校** | 新色表(`PALETTES` 两族槽值修订:抬地面明度地板、压 crater 近黑与墙顶亮端跨度、家族间 Δ 重排)+ 改前/改后并排样张 + 基线换代。输入面(v1.1 实查):脚本只重映射 wall/facade/floor/crater 四族颜色的 `terrain_*_dungeon.png`→underdark/deep_underdark 两套,**L2/L3 板面瓦片 2×21 件全在其输入面内**;不在输入面的板面相关件=`flag_seal.png`(三关共用,若归因触它另行呈报) | 确定性、可复现、逐项可机检比对;**明度水平与色相可调,纹理高频结构逐像素保持**——若 T1 归因指向「亮度秩序/对比带」,本案直达;若指向「纹理本身太碎/太 busy」,本案调不动(方法学上限——脚本头注定死「亮度秩序逐像素保持」,高频结构不改;在案佐证=2026-10-14 美术审计「双峰纹理…不是再叠一层界面能救的」) | 低;零新素材;不破 §4.3 三关方向需在修订登记中说明偏转幅度 | +| **乙 · 瓦片重产(远程生图管线)** | 按新规格重出 L2/L3 瓦片([remote-gen-prompts](../design/art/remote-gen-prompts.md) 对话操作单 + [art-prompts](../design/art/art-prompts.md) 词库),纹理本体可重设计 | 上限高——高频细节/材质/装饰密度均可换;代价 = 非确定性、过闸周期长、需重锁色板与重跑 `terrain_tile_sets_test`+样张全套 | 高;与 08「五 · 表现」**待裁**行「素材升档重产」及 06「资产升档重产批」条(按名指路,08 未决项表行号以实查为准)方向相邻不同面——该批=立绘/小人帧尺寸升档(2026-10-04 用户令暂不做、重启=用户点名),本卡=棋盘瓦片色板/纹理方案重做,**裁本案不等于放开升档**,呈报须带划界;样张批 Q1 已裁丙案(样张反提素材规格,2026-10-16 用户令)——本案规格以其已冻结目标规格清单为上游,次序=样张规格先行(§4B X2) | + +**T2 修法约束(v1.2 新增,承载 §4B X1/X2 已裁事实)**:①本卡改格底明度档与徽章批叠微光同基线(art-bible §4.1 格底档 L 0.08–0.14)——落码后两卡逐位比对 golden 棋盘三张防互踩;②串行序位徽章→样张→观感(排期栏),本卡落码在两批落码之后,基线换代走契约 6 显式流程;③若 T1 出口裁乙,瓦片规格与样张卡已冻结目标规格清单对齐,次序=样张规格先行(§4B X2);裁甲则对样张批零连带。 + +**UI 轴——参数重校(现读常量与候选方向,全部走样张人闸后定值)**: +- 迷雾全黑档:现值 = 不透明纯黑盖全部叠层(HUD框架/art-bible §6.5 三档信息阶梯的既有裁决,改它 = 改概念定义,须回 HUD框架 修订);候选方向 = 保持三档结构下调不透明度或对纯黑加主题 tint——**列为 T2 内二级裁点,报告须呈报不动定义的纯参数位有哪些先穷尽**; +- 舞台底:`STAGE_BG #3E342A` 对板缘对比带宽——候选 = 向 `BG_BRIGHT #453723` 方向提一档或收窄棋盘外缘留白; +- 色牌/微光占用:色牌垫底是 v3.4 定案(改板纹理高频结构才谈撤牌);**类型微光引擎未实装(F10),本卡对该层无可动参数——读数若显示微光规格(α170/带宽 cell÷8)贡献显著,处置=与未开格徽章批联裁实施参数或走 art-bible §4.2 修订登记,呈报为 L3 停机点(触既定裁决面),不在本卡单方改动**。 + +### T3 L2/L3 同批与否(≈0.25d 结论笔) + +事实:两关色板两套槽值、板型 12×12 vs 13×13、数字墨同模式(§2.3)。两案成本对照(v1.1 中立化留档;v1.2 已裁,见下):**同批** = 一次基线换代、一轮目检登记,色表两套槽值各改各的、互不连带;**分两批** = golden 链换代两次、目检登记两轮,单批体量更小、L3 可在 L2 复判后单独叫停。**Q3 已裁(2026-10-16 用户令,§10):甲·同批**——理由=基线换代与目检各只走一轮;两关槽值差异由 T1 分关读数(T1b)承载,不需以拆批消化。 + +### T4 验收三件套与换代(≈1–1.5d) + +1. 机检读数达标:见 §7 V2 判据表; +2. **渲染闸基线换代**:跑 `tools/golden_baseline_refresh.sh`(缺省模式=棋盘三张;触及菜单态加 `--menu`)显式重制基线,呈报换代面与新旧读数差、提交说明写明触发原因(契约 6 实操步骤); +3. 用户实机目检轮:目检项(玩法:L1/L2/L3 各开一局,并排回报「费劲感」相对改善)登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单——登记即完成本批义务、不阻塞入库(2026-10-12 用户令;「入册 07」列反哺点);用户复判否决走 V4 回补。方向级否决(样张层)已在契约 4 前置拦截,本步只剩终验。 + +### T5 产出物落位卡(≈0.5d,末卡——三份 reports/ 文件写齐才算收口) + +轻闸全绿后、合并前,把本批三份 `reports/` 产出物写齐(权威文档与根规则文件零直改;`active.md` 状态记录照常更新): + +1. `reports/iter30-实现报告-<完成日>.md`——各卡状态+**实机目检总清单**(T4-3 目检条目)+遗留读数义务+T1 定性报告读数表归档指引+变异验证记录表(新建断言/读数件的注入实验记录); +2. `reports/iter30-代拍板追认单-<完成日>.md`——§9 白名单内代拍板逐项留痕(含 Q2 甲/乙现场裁决的留痕补记); +3. `reports/iter30-反哺点-<完成日>.md`——§5 同步面每条一落点(哪个文件哪一节、改成什么、依据):06 本条状态行、08「五 · 表现」棋盘观感行(含 07 目检登记注与 V4 回补条款)、art-bible §4.1/§4.3 或 §6.5/§7 修订登记条(色值/常量若动)、HUD框架迷雾节(迷雾参数若动)、07 入册条、roadmap 估时刷新。 + +**原 §5 机械面直改义务零执行(v3 口径),落文归文档批。** + +**估时合计 ≈ 5–7d**(v1.1 上调:T1 新增 T1b 采样件 0.5–1d;v1.0 为 4–6d——彼时漏了采样件,批内各卡加总实为 4.25–6.25d);**v1.2 估时不动**:Q2 延裁的甲案候选样张与契约 4/T2 样张同源产出,仅时点前移至 T1 出口呈报点,批内不新增总量;T1b 职责不变(全框帧+分关读数与甲/乙裁决无涉),不因本批裁决再调;天然切分点:**T1 末**(定性报告+甲/乙裁决呈报即交付物,人闸天然停点)、**T2+T3 末**(修法落地)。 + +--- + +## 7. 验证闸(逐需求点验收清单) + +| # | 需求点 | 测什么 | 判据 | +|---|---|---|---| +| V1 | T1 定性报告 | 读数表覆盖 3 关 × 3 测面 × 各指标(§6 T1 表全列,测面二经 T1b 全框帧);L1 参照位在场(含两板型,F1);归因结论引用数值;**v1.2 增**:甲/乙裁决呈报件(甲案候选样张+分关读数表)随报告同出、用户当场裁决记录在案(§6 T1 呈报硬步骤) | 报告模板齐件 + 用户过闸记录在案(**T1 出口定性人闸=06 已裁硬步骤,P1**;**v1.4 预授权:人闸只确认轴归因与修法方向,V2 定向目标带数值由批内按 T1 实测读数自定并随定性报告呈报,禁拍脑袋现编**)+ 裁决留痕补记 §10 | +| V2 | 修法后机检达标 | **既有口径不破坏**:样张主板断言 A6 ≥4.70 / F6 Δ≥18 / A3b Δ≥30 / 格底明度档(已开 L 0.08–0.14 / 墙顶 ≥0.30 / 饱和 ≤0.55)保持绿(v1.1 注:该组现行只跑 dungeon 拼板主板,对 L2/L3 属「不动即可」约束而非覆盖,C1 核注);**L2/L3 分关实测 = T1b 新建读数件出值**;shot_checker A–D+F 零新增红;`terrain_tile_sets_test`/`ui_contrast_probe` 全绿。**定向判据**(针对「累眼」的归因侧):若 T1 判「死黑面积」→ 全黑档面积占比与明度直方图 p10 改善入目标带;若判「对比带过宽」→ 墙顶/地面 Δ 与板/舞台底对值入 T1 定标带——目标带数值由 T1 报告给出、**T1 出口定性人闸冻结**,禁拍脑袋现编。**目标带自设的合法性注(v1.1)**:art-bible §4.1「待定现用」态只管圣经在册数值(现行即执法、调整=修订登记,:207 释义);本卡自设目标带**首先只是批次验收判据**,过闸即合法生效于本批;若某带值要长期执法,须写入 art-bible 相应节修订登记转「待定现用」态,禁以批次判据身份直接成为执法值 | 读数表(改前/改后并排)进 `reports/iter30-实现报告-<完成日>.md`;**v1.4 预授权:目标带数值由批内按 T1 实测读数自定、随定性报告呈报即生效**(原「人闸冻结目标带」改为「人闸确认方向与量级」,数值仍禁拍脑袋现编) | +| V3 | 渲染闸换代 | 先跑 `render_gate.sh` 见棋盘 golden 段红(确认破的是预期面)→ 跑 `golden_baseline_refresh.sh`(缺省=棋盘三张,菜单态触及加 `--menu`;素材齐盘前置)→ 复跑 `render_gate.sh` 全绿;三张新旧基线并排呈报,changed 面 = 预期面,零超预期漂移 | 闸日志 + 呈报件;提交说明含触发原因(契约 6) | +| V4 | 用户实机目检 | 目检项登记(实现报告目检总清单;「入册 07」列反哺点)+ 用户回报「费劲感」相对改善且 L1 无退化——**登记不阻塞入库(2026-10-12 用户令)**;用户复判否决 = 回补机制触发:08 行回待做、06 本条记残留重开(落文按 v3 口径经反哺点归文档批)、返工起点=T1/T2 重议(不回滚已入库码面,按新条处置) | 主观判据的唯一权威=用户回报;入库前方向由契约 4 样张闸把关 | +| V5 | 邻接零回归 | 冒烟全套 + 单元 + 探针链零新增红(呈现面触碰加跑 ui_contrast);同迭代徽章批断言面零回归(§4B X3) | 重闸 = `tools/run_all_gates.sh --code`(脚本即唯一闸清单) | +| V6 | 反哺点清单 | §5 所列各条(08 行改写要求+目检登记注、06 状态刷新、art-bible 修订登记〔色值若动〕、HUD框架〔迷雾参数若动〕、07 入册、roadmap 估时)在 `reports/iter30-反哺点-<完成日>.md` 逐条有落点(文件/节/改成什么/依据) | 件核:§5 反哺点行数=清单条数 | + +**闸口径**:机检(V2/V3/V5)自动判;V1 = 人闸停点(T1 出口定性闸,06 已裁);V4 = 登记后回补机制(非停点,2026-10-12 用户令);契约 5——机检绿 ≠ 用户满意,禁作等价表述写入 06/08。 + +--- + +## 8. 异常分级 + +- **L1(自救)**:采样脚本参数笔误、读数表排版缺件、文档行号漂移——立红即修。 +- **L2(记录继续)**:色表具体槽值、候选样张的构图取舍、07 目检条目的问法措辞——批内消化并登记。 +- **L3(停机呈报)**:①T1 读数显示 L1 同病(范围外溢,重划批次);②归因指向三态墨管线/迷雾概念定义本体(触既有裁决面);③用户否决对比样张方向两次以上(说明读数口径与体感脱节,须重议 T1 指标本身);④golden 重制后 changed 面超出预期(隐性回归);⑤色板增量纪律双门过不了且无合并方案;⑥跨卡同板面次序破裂——与徽章批/样张批的 §4B 联动被裁决成互相破坏已冻结断言面的顺序(§4B 呈报件被否即停,禁单方推进)。 + +--- + +## 9. 代拍板白名单(超清单必呈报) + +1. 采样读数脚本的实现落点(新工具件 vs 扩 `shot_checker.py`,禁动其现有 A–D+F 断言语义)。**v1.1 注**:T1b 全框帧件(扩 board_shot_probe 或新建 L2/L3 整屏探针)即落在本条授权域内。 +2. 明度直方图/梯度均值在「整板」与「灯光区内」两口径的取舍(以 T1 报告说明为准)。 +3. 甲案色表的具体槽值设计(参数域内自由,出域即 L3)。 +4. 对比样张的排版形式(并排同屏 vs 逐关两帧)。 +5. 目检轮的注册话术与回报表格式(07 口径内)。 +6. 基线重制的执行时机(T2 出口 vs T4 出口,取一)。 +7. 提交切分与 worktree 分支命名(走既有纪律)。 + +--- + +## 10. 裁决留痕(v1.2 换代:原 Q1 撤销结论保留——已裁项禁再问;Q3 已裁甲·同批;Q2 延裁留痕;全卡零悬空待裁点) + +**统一来源(逐条留痕均引此令)**:「2026-10-16 用户令:三卡全部待裁项按推荐方案裁决(用户将裁权授出,由主线会话代拍板留痕)」。以下 Q2/Q3 各行引该令留痕;两案选项原文照录,供后续复看。 + +**已裁移除项(原 Q1「定性报告要不要用户过目才进 T2」)——撤销结论不动(2026-10-16 用户令未触及,维持 grilling 结论)**:06 本条条内已明文裁决——「开工前须先定性(沿用既有裁决)……**开工前先过『素材轴 / UI 轴』定性人闸**」(06:449/:453,2026-10-13 用户裁定条;08 的 git 提交史同款注「P2 棋盘观感标『Alpha 阶段需完成 · 开工前过素材轴/UI 轴定性人闸』」)。「要不要过闸」不成立为问句,本卡处置 = 落为 T1 出口**流程硬步骤**(P1/V1),闸上同时冻结轴归因与 V2 目标带数值——**既裁人闸,不占裁点**。 + +### Q2 · 素材轴修法走哪案:程序换色重校(甲)还是瓦片重产(乙)?——**延裁留痕** + +- **裁决(2026-10-16 用户令,来源句见本节顶)**:「待 T1 定性读数出来后再裁甲/乙;开工默认先做甲案(recolor 换色)候选样张以证伪纹理说」。 +- **v1.4 预授权(2026-10-17 用户裁):延裁改判据自动裁,不再停机等现场裁**——甲案候选样张读数达标(进入 §7 V2 定向目标带)→ **直接走甲**;仅当读数**证伪**「纹理太碎」假说(甲样张读数不达标、方向仍不成立)时才呈报裁乙。乙案分支的代价与划界(P4/§6 乙案行:本卡重产 ≠ 放开升档、规格与样张卡已冻结目标规格清单对齐)全部不变。 +- **延裁≠回避**:裁点挂到 T1 出口的**具名呈报动作**——硬流程步骤(触发条件/动作/产物)已成文于 §6 T1「素材轴甲/乙裁决呈报点」:产物=改前/改后并排样张+分关读数表,呈报后**用户当场裁**。本节不留悬空 Q。 +- **判据(原文照录)**:判据 = T1 归因指向:亮度秩序/对比带问题 → 甲可直达;纹理本身太碎太 busy → 甲调不动(recolor 头注定死「亮度秩序逐像素保持」,方法学上限;碎纹理假说在案证据 = 2026-10-14 美术审计双峰纹理结论条),须乙。乙与 08/06「素材升档重产」的关系已划界(P4/§6 乙案行):本卡重产 ≠ 放开升档,裁乙不重开该未决项。 +- **选项原文(保留)**:甲=recolor 换色重校(确定性、可复现、逐项可机检比对、零新素材;效果上限 = 参数域内明度/色相重排);乙=远程生图重产(可重设计纹理与高频细节,上限高;周期长、非确定性、全套闸重跑;若裁,规格与样张卡已冻结目标规格清单对齐、样张规格先行——§4B X2)。 +- **换向处置**:呈报点甲样张被当场否决→裁乙,属裁决规则本身(即「证伪纹理说」动作的出口分岔),不计入 §8 L3③「否决两次以上重议 T1 指标」计数;裁乙即为批次正式进入 T2 乙案行执行。 + +### Q3 · L2 与 L3 同批修还是分两批?——**已裁·甲(同批)** + +- **裁决(2026-10-16 用户令,来源句见本节顶)**:**甲·同批**。理由 = 基线换代与目检登记各只走一轮;两关槽值差异(两套色板槽值、12×12 vs 13×13)由 T1 分关读数(§2.3 分关设点 / T1b)承载,无需拆批消化。 +- **事实(原文保留)**:两关色板两套槽值、板型 12×12 vs 13×13、数字墨同属双峰板色牌态;06 以单条覆盖两关。 +- **选项原文(保留)**:甲=同批(一次基线换代、一轮目检登记,色表各改各的);乙=分两批先 L2 后 L3(单批更小、L3 可在 L2 复判后单独叫停;基线换代两次、目检登记两轮)。 + +**开工门(v1.2 定实)**:Q3 已裁甲·同批;Q2 裁点由 T1 出口呈报硬流程步骤承载(§6 T1)——开工门 = U0,用户 `/iter` 发令即开(已编入迭代 30,2026-10-16 用户令,排期栏);原「Q2/Q3 裁决落」前置表述不再成立。本卡全卡无悬空待裁点(§10 之外各处 Q 指涉均已改为裁决留痕/流程步骤引用)。 + +**U1 预授权(2026-10-17 用户于开工前一次性决断,防开发中反复打断)**: +1. **Q2 判据自动裁**——甲案候选样张读数达标即走甲,不停机等现场裁;仅读数证伪「纹理太碎」才呈报裁乙(§10 Q2、§6 T1 出口呈报点)。 +2. **V2 定向目标带授权批内自定**——按 T1 实测读数定并随定性报告呈报;T1 出口定性人闸(06 已裁硬步骤,不可跳过)只确认轴归因与修法方向。 +3. 其余 L3 停机点维持不变:触既有裁决面类(L1 同病外溢/迷雾概念定义本体/方向被否决两次以上/golden changed 超预期/色板双门/跨卡次序破裂)一律停机呈报。三卡串行序位不变(徽章→样张→观感),本卡位第 3。 + +--- + +## 11. grilling 审查记录(v1.0→v1.1,2026-10-16 对抗性审查;逐攻击面:结论/证据/处置) + +| # | 攻击面 | 结论 | 证据(2026-10-16 实查) | v1.1 处置 | +|---|---|---|---|---| +| 1 | 工具实存性 | `board_shot_probe` **实存非臆名**(三关 targets 名/行号 :34 全对,且自带确定性驱动可复现);render_gate/golden_compare/shot_checker 能力与 C5 描述相符。**翻案**:board_shot_probe 帧 = 空视口裸挂 BoardView,**不含舞台底/屏根像素**(探针只实例化 BoardView,battle_stage_view/BG_ROOT 未挂载);shot_probe 战斗屏真实路径只达 **L1 首战**(其头注商店房不纳屏段自证)⇒ T1「舞台底与屏根」测面与「L2/L3 分关实测」均**无现成采样件**,v1.0「采样源=board_shot_probe 渲染帧」对该测面不成立 | `game/smoke/board_shot_probe.gd:34, :55-61`;`game/smoke/shot_probe.gd:12-14, :159-164`;`tools/render_gate.sh:9, :55-68, :95-107` | 新增 **T1b 新建采样件任务**(≈0.5–1d,白名单 1 域内);T1 估时上调、合计 4–6d→**5–7d**;C6 加帧面边界注 + 过程帧即弃纪律注 | +| 2 | 量化判据出处 | A6 ≥4.70(`:26/:338/:1021-1022`,v1 4.09×1.15)、F6 Δ≥18(`:339/:996`)、格底档 L 0.08–0.14/墙顶 ≥0.30/饱和 ≤0.55(art-bible :194/:205/:225-227)、48 色+三通道差 ≥8/255(art-bible :207)**全部实值相符**。**翻案两件**:①A3 现行执法 = **v3.5 冻结定值 Δ≥30**(实测 38),Δ≥55 已数学冲突退役(`:975-979`),v1.0 C3「开工时以当期为准复核」含糊化——已写死;②样张 v3 断言(A3/A6/F6)只跑 **dungeon 拼板主板**(`:130-131`),S3 underdark 仅为 HSV 示意不参断言——「分关实测」非现成能力。自设目标带合法性:「待定现用」态释义(:207)只覆盖**圣经在册数值**的执法态,不自动覆盖批次自设判据——二者不冲突但须写明边界 | 如上各行号 | C1–C3 加核注重写;V2 增「批次判据身份≠执法值,转执法须 art-bible 修订登记」条款;T1b 承载分关读数 | +| 3 | 「重产≠放开升档」划界 | 划界**成立但引据须换代**:08 未决项表 2026-10-16 v1.6 已重编号(八项减七项)——行号指路不可靠,按名「素材升档重产进不进 Alpha」「立绘清晰度回退评估」现行确在第 6/7 行(实查);06「资产升档重产批」现行状态 = 2026-10-04 令暂不做 + 2026-10-06 优先级再降 + **2026-10-06 方案二注记:原 64/96/128 升档路线已被八敌逐键定档实质走完,剩余挂起=提灯点亮解禁候选**——v1.0 P4「该条方向=帧尺寸升档」表述滞后 | 08:154, :209-210, v1.6 行(:226);06 升档批条状态行全文 | P4 重写(按名指路+行号注明以实查为准+方案二注记现状);T2 乙案行同改 | +| 4 | recolor 能力边界 | 头注方法=仅对 `terrain_*_dungeon.png` 按 wall/facade/floor/crater 四族槽重映射、输出 underdark/deep_underdark 两套;实盘 board/ 目录两套各 21 件(**墙 16+地 5**)与脚本输入面完全对齐,`flag_seal.png` 不在输入面。v1.0 F2「墙类 21 件」**件数错**(21 为总数,16 唯一墙名单单点 `TILE_WALL_NAMES`)。「纹理太碎调不动」有实证:recolor 头注定死亮度秩序逐像素保持(方法学上限)+ 2026-10-14 美术审计结论区「第二/三关地面=近黑斑加亮筋双峰纹理,盯久了累,不是再叠一层界面能救的」(该审计 md 在盘;同日另存 2026-10-06 旧审计 HTML,其棋盘相关结论未涉 L2L3 瓦片碎度) | `tools/recolor_terrain_tiles.py:1-12`;`game/presentation/views/board_view.gd:81-88`(16 件名数组+头注「16 唯一墙瓦片名单」);`reports/美术审计-cursor会话存档-2026-10-14.md` 结论区;Glob `game/assets/art/board/` 两套件名清点 | F2 订正件数+flag_seal 例外注;甲案行写明输入面全覆盖;T1 归因判据与 Q2 引审计实证 | +| 5 | 文字位条分工句 | 06:451 原文在册:「两条不同面,不互相替代,各自保留」;三处文字位=站桩名行/敌顺位徽标/RAP 反馈行,06:443 已随迭代 26 T3 完成——v1.0 P2 语义与原文一致 | 06:451, :437-443 | P2 补原文引述 | +| 6 | V 条判具 | V2=样张 v3(主板)+T1b 分关读数+shot_checker A–D**+F**(v1.0 漏 F 判据,2026-10-15 已入闸)+`terrain_tile_sets_test`/`ui_contrast_probe`(两探针实存);V3=`golden_baseline_refresh.sh` **实存**且用法查明:缺省模式=棋盘三张(probe 抓帧→crop→覆盖 `game/tests/golden/`),`--menu`=菜单全屏,素材缺位拒跑,呈现批 agent 自换代+提交说明强制写触发原因(其头注 Q5/Q6/S3 在册) | `tools/golden_baseline_refresh.sh:2-14, :52-76`;`tools/shot_checker.py:8-19` | C5/契约 6/T4/V2/V3 补齐实操步骤与 F 断言 | +| 7 | Q1/Q3 已裁检索 | **Q1 属已裁项**:06:449 条内明文「开工前须先定性(沿用既有裁决)」+ 状态行「开工前先过定性人闸」(2026-10-13 用户裁定)+ 08 的 git 提交史同款注——v1.0 一边在 P1 引该裁决、一边把同一闸列为 Q1 待裁,自相矛盾,触用户红线。Q3(同批与否)与 Q2(甲/乙)全库检索**无既裁**(06 单条覆盖两关但未裁批次数;playnote 无;git log 无)——保留为待裁 | 06:445-453;08:220(v0.3);playnote.md:5;git log 2026-10 检索 | Q1 从 §10 删除、改 P1/T1 出口/V1 流程硬步骤引用(§10 载明移除理由);Q2/Q3 保留 | +| 8 | 中立性 | v1.0 四处「推荐」:Q1(已裁项附裁决,撤销后消失)、T1 出口句(撤销)、T3「推荐=同批」与 §10 Q3「推荐 甲」(**无既裁依据→中立化**)、Q2 立场句「开工默认先做甲案候选样张」(改写为白名单内样张层探针动作,非路线裁决) | 全文 grep 推荐=0 残留(仅剩「已删字样」自述与列名注) | 列头改「卡片立场(不代裁)」;§10/§6 T3 中立化 | +| 9 | 跨卡依赖 | 两卡同抢 L2/L3 板面:徽章批(类型微光实装者,其 T0-② 五组明度档以未开格底 L≥0.30 为基线——本卡改的正是该基线;art-bible :379 已册「格底与微光同在未开格面,邻近色相有吞没风险」互辨复测义务;其 §4「不动格底/瓦片/四槽」系单向避撞);样张批(Q1 丙案语义=样张反提素材规格、Q3 路线选型——本卡乙案重产与其冻结次序互锁) | `徽章卡(迭代 30 卡①,合并 7ffd1dc0,卡片已退役):13/82/109`;`需求卡片-战斗一屏样张批:33/59/70-71/168/170`;art-bible:379 | 新增 **§4B 跨卡依赖**(X1/X2/X3 三行+结论笔:次序与规格联动问题,不新增裁点,随 Q2/Q3 呈报交用户定序);§8 L3 增⑥跨卡次序破裂停机型 | +| 10 | 外加翻案(非清单内,敌意自查所得) | **契约 5/完成定义 3/V4/T5「目检未过禁宣布完成/在役」与 2026-10-12 用户令红线冲突**:AGENTS.md「真人检测只登记不阻塞——禁以等目检为停工理由」(入库先例:迭代 25/26/28 均入库翻行、07 目检留残,git 提交 d337c9e5 立规)。另:F1「L1 10×10」不全——`board_gen.tres` level_index 1 段含一行 **12×12 dungeon**;F10/C6:类型微光引擎未实装(徽章批 F2 引 HUD框架实装状态行佐证),v1.0 把它当实机可测层不成立 | AGENTS.md:68;git log d337c9e5;roadmap 迭代 25/28 行「残留人闸=目检」先例;`game/data/tables/board_gen.tres` 行段实查 | 契约 5 重写(阻塞闸全前置:T1 定性闸+契约 4;V4 改登记不阻塞+回补机制:否决→08 行回待做+06 记残留重开);F1 补两板型注;F10/T1 微光测面降为样张 v2 证据级别并注升级路径 | + +**词面合规自查**:v1.1 全部新增/改写文本已按仓库现行用语规范禁词表逐词 grep 复扫,命中 0(他文档引文原貌除外);本次修订同时把卡片里 v1.0 残留的两处旧措辞换代为规范词。**v1.2 增补**:本次裁决留痕新增/改写文本同口径 grep 复扫,禁词命中 0。**v1.2 留档注**:下表 §11 中「Q2/Q3 保留待裁」「随 Q2/Q3 呈报交用户定序」「无既裁→中立化」均为 v1.1 时点的审查动作实录,不作现行状态读——2026-10-16 用户令已定案(Q3=甲·同批;Q2=延裁挂 T1 出口呈报硬步骤),现行裁决状态一律以 §10 为准。 diff --git a/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md b/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md deleted file mode 100644 index 0b75ad18..00000000 --- a/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md +++ /dev/null @@ -1,484 +0,0 @@ -# 需求卡片:棋盘瓦片与立体表现重做批 - -> 来源:`待办清单.md`「棋盘瓦片与立体表现重做」(2026-11-07 登记)。 -> **设计事实源(唯一事实源)**:`design/art/art-bible.md` v3.51 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.2+`design/ux/battle.md`(Last Updated 2026-11-07)「Layout Zones」D 区行/「D 区布局与棋盘画法预览」/「封印格呈现预览」+`design/gdd/systems/表现与支撑/HUD框架.md`(2026-11-07)D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。 -> **验收档:中**(呈现与交互几何改动,后果玩家可见但不损持久状态;用户 U0 可改判)。 -> **预计**:9.5 个工作日(区间 9–10;T0 0.5/T1 1.5/T2 0.5/T3 2.0/T4 1.5/T5 1.5/T6 0.5/T7 1.0/T8 0.5)。 -> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条、第六轮(合并整合)6 条均已处置,第六轮定向复核通过。 - ---- - -## 1. 目标与完成定义 - -把棋盘从「逐格 32×32 墙/地瓦片+格内立面」换成**合并岩体+连续地面**的 2.5D 画法:连通未开格(四邻)共享一块抬升岩顶与连续南/东崖面,北/西受光,南/东投影;数字脱离格面,变成**浮空数字+双色引导线+格面小阴影圆**,数字与引导线永远最顶、阴影圆在小人之下;封印按迭代56已闭合的「受理即揭示」呈现——印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、不参与浮空层,承载面取本关受光棱色封印石以保 ≥4.5:1 对比;D 区顶部 AP 条整条撤掉,AP 放左栏、RAP/图例/弃图刷新放右栏,棋盘占 D 区全高并在上方预留 44px 给顶行浮空数字越出棋盘;棋盘底常驻操作提示条退役;小人与南侧岩体按脚底 y 排序遮挡;旧 `terrain_*` 63 件与普通数字底牌路径退役(封印格身份色牌保留);三关色板按已过审样张冻结。 - -**完成定义**(全部满足才算完): - -1. 1280×800 基座档:12×12 格边 38px、14×14 格边 32px;D 区 1036×548;左/右栏各 200px;棋盘 12×12 外框 478×478、**屏幕坐标**原点 (523,296)、board_area 局部原点 (279,44);14×14 外框 474×474、屏幕原点 (525,296)、局部原点 (281,44)。 -2. 顶行浮空数字视觉顶 y=258(含 2px 描边+1px 浮空投影),距 D 区上缘 6px;数字、引导线、阴影圆全部在 D 区内,无裁切。 -3. 岩体投影:LIFT=round(格边×0.435)、ESHIFT=round(格边×0.109);四邻连通合并;相邻岩顶搭接 2px;南崖高 LIFT、宽 格边+ESHIFT、顶缘 2px 口沿高光取本关受光棱(§4.1);东崖宽 ESHIFT、高 格边+LIFT;北/西 2px 主亮棱+2px 次亮棱+外 2px 深墨边;南/东 2px 深墨内缘+3×2px 内阴影(自缘内 0.217×格边起,α0.27/0.16/0.08);四段投影 4×4px(α0.44/0.30/0.16/0.07);整板悬崖 8px。 -4. 深度排序:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体画在小人之后并遮住小人脚底;小人所在格数字仍完整可见。格件顶面贴花/交互反馈随所属格件参与同一深度排序——北侧(脚底≤小人)低于小人(`z=0`),南侧(脚底>小人)随岩体在前(`z=3`);浮空数字仍最顶。 -5. 浮空数字:字高 21px、2px 深墨描边+1px 浮空投影、暖白字芯、字底距格顶 15px、2px 双色引导线、10×6 阴影圆(圆心格顶+7,画在开启格地面、位于小人之下);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;小人可遮阴影圆。 -6. D 区:左栏 AP 点阵+停手,右栏 RAP 点阵+数字+图例+弃图刷新;`side_rail_w=200` 入布局表;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张渲染工具,删除归工具批);棋盘底常驻操作提示条退役;toast 槽在左栏顶部且不覆盖棋盘与浮空数字。 -7. 旧 `terrain_*` 63 件与 `tile_palette.gd`/`cell_base_layer.gd` 删除;`seal_mark.png` 保留;**普通数字**棋盘绘制路径零 `DIGIT_PLATE`/`plate` 调用;封印格身份字形色牌保留(迭代56封印改版,唯一例外)。 -8. 封印呈现按迭代56「受理即揭示」口径:印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、印记与色牌固定低于小人、该格不生成浮空 entries;封印格地面铺本关受光棱色封印石(零新增色,对封印黑对比 6.45–9.94:1),普通已开格地面仍为连续新地面。 -9. 三关(dungeon/underdark/deep_underdark)都走新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 golden 基线重制并在渲染闸通过。 -10. 命中仍按逻辑格矩形:点在抬升岩顶/崖面/浮空数字上不改变格坐标映射;16×16 等非当前板型由同一公式求值。 - -**不做**:真 3D、HD-2D、A/B 方案对照、旧瓦片回退、逐格新 PNG 瓦片、B/C 区改版、核心规则/数值/RNG 改动。 - ---- - -## 2. 设计事实源 - -- **画法与配色**:`design/art/art-bible.md` v3.51 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)+封印印记条、§4.1「棋盘环境子板/三关棋盘环境八色/封印黑/数字色牌」、§6.3「三关 tile_closed/tile_open 终值」、§8.2「封印印记参数表」、§1.4 第一验收项。 -- **封印呈现前置**:迭代56「封印动作改版批」已闭合 `design/gdd/systems/排雷循环/排雷玩法.md` v2.0「封印受理即揭示」与 `design/ux/battle.md`「封印格呈现预览」——封印格 = 已揭示地面+法阵+身份字形色牌;本卡承接其地形换代(承载面改受光棱封印石、圆心仍格心、色牌与法阵层序不变),不重写揭牌逻辑。 -- **布局与像素判据**:`design/ux/battle.md`(2026-11-07)D 区行、棋盘格尺寸公式、「D 区布局与棋盘画法预览」像素判据表(含顶面/视觉 rect、悬停/路径 rect、层序)、Component Inventory 三行(行动资源侧栏/棋盘地形层/棋盘浮空数字层)。 -- **HUD 契约**:`design/gdd/systems/表现与支撑/HUD框架.md` D 区行(侧栏/全高棋盘/提示条退役)、布局表高度口径、字号下限(浮空数字 21px 固定)。 -- **验收面**:`game/tests/golden/README.md`「加严口径(棋盘三图)」「越格口径(2026-11-07 棋盘地形换代)」。 -- **上游已裁**:C 方向(合并岩体+越格画法+新大岩板材质)2026-11-07 用户看样张通过;顶栏搬两侧(D)2026-11-07 用户看三方案预览后选定;北/西受光、按样张调深、脚底行排序三项同会话裁定;underdark/deep 两关色板 2026-11-07 用户看方向样张后选定「按目标八色冻结」;棋盘底操作提示条退役同会话选定。 - ---- - -## 3. 现状事实(代码级,开工自行复核) - -| 现状 | 证据 | -|---|---| -| D 区当前是「AP 条 44px+棋盘区+底部提示条」的 VBox 结构;board_area 实际高度需扣 VBox 间距与提示条(T0 实读,禁预设 504) | `game/presentation/views/board_zone_view.gd:23-37`(VBox+`ApBarView`+board_area+hint);`ap_bar_view.gd:35`(`custom_minimum_size.y = layout.ap_bar_h`);`board_zone_view.gd:74-79`(hint 条) | -| 布局表只有 `ap_bar_h`,没有 `side_rail_w` | `game/data/schemas/battle_layout_table.gd:10,21-22`;`game/data/tables/battle_layout.tres` | -| 格边公式预留为「上 12+下 12+悬崖 8」,无顶栏/侧栏项 | `game/presentation/views/board_view.gd:205-232`(`_cell_for`:`reserve := 24.0 + d`、`avail.x - 12.0 - d`) | -| 棋盘原点由 CenterContainer 居中;`cell_origin` 读 `_svp_container.position` | `board_view.gd:403-404`;`_wrap`/`_svp_container` 建于 `board_view.gd:90-110` | -| 棋盘逐格 16 墙瓦片+5 地面变体,按 `board_type` 装 PNG | `game/presentation/views/tile_palette.gd:17-20,66-94`;`board_view.gd:118,264-267` | -| 数字有「亮直/深直/落牌」三态与色牌垫底;封印格身份字形同走色牌 | `tile_palette.gd:50,88-94,166`;`board_view.gd:517-518,586-591`;`cell_mark_overlay.gd:74-104` | -| 封印当前代码仍是「未开格+`seal_on = seal and not revealed`」;迭代56封印改版已编未开工(本卡排其后,按其实装后的「已揭示地面+身份色牌」口径承接) | `board_view.gd:536-545`;`board_cell_unit.gd:31,39,51-77`;`seal_mark_layer.gd:12-20`;`reports/需求卡片-封印动作改版批-2026-11-07.md` §7 | -| 封印取证选择器仍 `has_seal and not is_revealed`、取证 rect 按逻辑格(圆心格心) | `game/probe/board_shot_probe.gd:264-281`;迭代56卡片 §7 换代选择器 | -| 格内立面/北投影/东立面全在本格内画;接触带也在基座层 | `game/presentation/views/cell_base_layer.gd:60,82-91,109-115,168,183,196` | -| 小人 z=1、落影相对 z=-1(全局 0);无脚底排序;格件默认 z=0 | `game/presentation/views/board_world.gd:39,48`;`board_cell_unit.gd`(全文无 `z_index` 赋值) | -| 旧 `terrain_*` 63 件(16+5,三关各一套)在库 | `game/assets/art/board/`(63 PNG+63 `.import`+`seal_mark.png`+其 `.import`) | -| 棋盘取证探针视图 900×900,微光「禁越圈」按逻辑格;封印取证也按逻辑 rect | `game/probe/board_shot_probe.gd:179,261,318,369` | -| 微光取证探针同用逻辑 rect | `game/probe/type_glow_shot_probe.gd:126,161` | -| 变格边长探针恢复时调 `set_cell_area(bv.size)`(无侧栏参) | `game/probe/ui_input_probe.gd:360-366` | -| 布局探针等价断言 `_cell_for(n, bv.size)`(无侧栏参) | `game/probe/layout_probe.gd:108-120` | -| 对比度探针的迷雾派生段依赖 TilePalette | `game/probe/ui_contrast_probe.gd:119-147,164-190` | -| 能力清单旧行「地形瓦片套与格面数字可读」仍引用 terrain 套件 | `game/tests/README.md`(旧行保留;删除归写卡段后续) | -| 普通已开危险格「危」当前垫色牌;落牌断言在玩家复制回归件(本卡后普通「危」改浮空、plate=false;封印格「危」仍垫牌) | `game/tests/unit/presentation/player_copy_sweep_test.gd:142-147`(`u.plate == true`) | -| 单元测试入口登记 terrain 套件 | `game/tests/run_all.gd:225` | -| 布局表字段被样张渲染工具读取(本批不改工具) | `tools/layout_config.py:12`;`tools/render_sample_sheet.py:51,956`;`tools/render_sample_sheet_v3.py:862,936` | -| 档期现状:待办清单已「已写卡」、roadmap 待编池「棋盘瓦片与立体表现重做(已写卡,待编排)」、08 已写卡 | `待办清单.md:265-268`;`roadmap.md:9`;`design/gdd/08-Alpha版本标准.md:149` | - ---- - -## 4. 设计契约(🔴 触碰=L3 停机呈报) - -1. 🔴 **只改呈现层与必要接线**:禁止改 `game/core/` 的排雷规则、棋盘数据、AP/RAP、战斗结算、RNG;棋盘数据只读。新增/修改只落 `game/presentation/`(含 `main.gd`/`main_debug_flow.gd` 的重建接线)、`game/probe/`、`game/tests/`、`game/data/schemas/`、`game/data/tables/` 与 `reports/`。 -2. 🔴 **不做逐格瓦片**:禁止保留或新增 16+5 逐格瓦片路径、`terrain_*` 回退、`TilePalette` 装图链;岩体/地面/崖面必须按整板矩形与格边程序化绘制,连通按四邻。 -3. 🔴 **普通数字零底牌**:普通数字(含普通已开格的「危」/「?」)只走浮空描边字;禁止 `_digit_ink_mode` 三态、`plate_digit` 在普通数字路径复活。**封印格身份字形色牌为唯一例外**(迭代56封印改版:`plate=true`、`_draw_digit_plate` 保留、字形叠于法阵之上),禁把例外扩回普通数字。 -4. 🔴 **浮空分层**:数字+引导线必须比地形/小人/封印/微光/交互反馈都高,任何元素不得遮数字与引导线;**阴影圆相反——画在开启格地面、位于小人之下**,小人站该格时遮住圆;顶行数字必须在 D 区内完整可见。**顶面贴花/交互反馈不得一律置顶**——随所属格件脚底行分档:北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;禁恢复“格件一律 z=3”。**封印格例外**:该格不生成浮空 entries/阴影圆,印记与身份色牌固定低于小人(整格 z=0,不参与南侧前推)。 -5. 🔴 **命中按逻辑格**:`_cell_at` 仍用逻辑格矩形与 `SEP` 步长;抬升岩顶、崖面、浮空数字不是命中区;顶面左上角点按逻辑公式归属北/西邻格,不做“归本格”特判。 -6. 🔴 **脚底排序**:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体必须能遮住小人脚底;格件贴花/交互反馈按同一格底 y 分档(北侧 z=0 低于小人、南侧 z=3 随岩体在前;**封印格恒 0**);禁止退回“全部岩体先画、小人最后画”。 -7. 🔴 **顶预留 44px**:`TOP_RESERVE=44`、`BOTTOM_RESERVE=12`、`DEPTH_PX=8`;公式与预览判据一致;禁止用 AP 条高度重新挤压棋盘;board_area 高 = D 区全高 548。 -8. 🔴 **侧栏宽表单源**:`side_rail_w` 只从 `BattleLayoutTable` 读,视图内禁止硬编码 200;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张工具,删除归工具批)。 -9. 🔴 **旧资产先验后删**:T0 采样三关当前画面读数入报告;新路径三关 golden 绿后,才允许删除 63 件 PNG 与 `.import`;`seal_mark.png` 禁删。 -10. 🔴 **文档不直改**:实现批禁写 `design/`、`game/tests/README.md`(能力清单由写卡段本批入表)、`roadmap.md`、`08-Alpha版本标准.md`、`待办清单.md`;发现条款偏差一律列 `reports/iter-反哺点-<日期>.md`。 -11. 🔴 **不删断言换绿**:不得删除或放宽 `board_shot_probe` 的加严口径、渲染闸 2% 判据、`ui_contrast_probe` 对比断言;只允许按本卡 §12「测试削弱申报」列出的旧断言删除/替换。 -12. 🔴 **拆分边界**:判据权威=`design/engineering/code-conventions.md` §1.1;每个拆出单元必须有职责语句与单一变化原因(§10);禁止为过阈值凑数拆件;拆不出内聚单元=停卡呈报。 -13. 🔴 **RNG 单点**:程序化材质/装饰噪声禁止 `randomize()`、自建 `RandomNumberGenerator`、消耗 `RngService` 共享流;一律用格坐标确定性哈希(同板同参逐位复现)。 -14. 🔴 **色字面量落点**:三关八色只落 `board_terrain_palette.gd`;用 `Color("#RRGGBB")` 常量,禁 `Color8` 散落;其它绘制点只读 palette,禁第二份色值表。 -15. 🔴 **BoardView 公开面不增**:`board_view.gd` 公开方法保持 27、类成员 ≤31(S13 基线;删 `_palette` 后 30);新增地形/浮空/阴影圆层一律落为**固定名字子节点**(`_world` 下 `TerrainBack`/`TerrainFront`/`LabelShadow`,壳层下 `FloatLayer`),三层在 `_init` 创建一次常驻、`rebuild` 只重跑 `setup` 不重建节点,经 `get_node_or_null` 取用,不新增类成员;只允许 `set_cell_area`/`rebuild` 增加可选参数与私有 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals`,禁新增公开方法或成员。 -16. 🔴 **封印呈现对齐迭代56**:封印印记居已揭示地面格心(不随岩顶 −ESHIFT/−LIFT 偏移);身份字形垫色牌叠于法阵之上(`seal_mark_layer` 子件 `show_behind_parent=true` 或等价实装)、不参与浮空层、不生成阴影圆;印记与色牌固定低于小人(封印格整格 z=0);封印格地面铺本关受光棱色封印石(零新增色,`palette.light_edge`);法阵参数(环径/环壁/十字/光圈)与揭牌逻辑沿迭代56,禁在本卡重写。 - ---- - -## 5. 范围边界 - -**收件**: - -- D 区布局(左右侧栏、全高棋盘、44px 顶预留、toast 槽移位、底部提示条退役)。 -- 棋盘地形深度层(连续地面、合并岩顶、南/东崖面、内阴影、四段投影、整板悬崖)。 -- 浮空数字层(阴影圆、引导线、描边字、1px 浮空投影、数字/线最顶、顶行越界)。 -- 小人与岩体的脚底排序;阴影圆在小人之下。 -- 封印印记/身份色牌的承载面与层序(已揭示地面格心+受光棱封印石+色牌叠于法阵之上且低于小人);类型微光/变异纹带/奖励徽章/悬停/路径/可挖域微光的锚点迁移(顶面 rect)。 -- 迷雾黑罩/记忆态与抬升岩顶的几何对齐。 -- 布局表 schema/tres、AP 条→侧栏的视图改造、命中测试。 -- 旧瓦片与普通数字色牌路径退役(封印格身份色牌保留)、三关色板、三关 golden 基线重制、测试与能力行落地。 -- 棋盘底常驻操作提示条退役(`board_zone_view` 的 hint 条删除)。 - -**不收件**: - -- B 区舞台/站桩、C 区数据框、AP/RAP 数值与规则、战斗结算、RNG、存档——一律不动。 -- 新增地形 PNG 素材:本批按已过审样张做程序化材质;若后续要换成 PNG 材质,另立登记条目走 asset-ingest。 -- 真 3D/HD-2D、A/B 方案对照、用户试玩结论——试玩只登记不阻塞。 -- 三关之外的板型专属美术(16×16 等)——同一公式与材质覆盖,不另出资产。 -- 样张渲染工具(`tools/layout_config.py`、`render_sample_sheet*`)的 `ap_bar_h` 字段清理——布局表字段本批保留,工具换代登记待办清单后续直改。 -- 三关互辨抽测工具 `tools/glow_discrimination_sheet.py` 的换代(读已删旧 `terrain_*`)——本批不跑;三关互辨由用户过审样张+`board_terrain_test._test_palette_three_boards` 逐值承担,工具换代登记待办清单后续工具批。 - -**不收件去向**:B/C 区改版→待办清单新条目;PNG 材质替换→asset-ingest 登记;样张/互辨工具换代→待办清单(tools 批);条款偏差→反哺点清单。 - ---- - -## 6. 关联文档同步面 - -| 文档 | 关联点(实现会改变它的哪条陈述) | 同步义务 | -|---|---|---| -| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.2 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役;封印印记改已揭示地面格心+受光棱封印石+身份色牌层序(v3.51) | 设计段已按本卡写入 v3.51;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 | -| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役;封印格承载面改受光棱封印石、圆心格心、色牌叠法阵 | 设计段已同步(2026-11-07);实现偏差→反哺点 | -| `design/gdd/systems/表现与支撑/HUD框架.md` D 区/字号 | D 区侧栏、全高棋盘、`ap_bar_h` 不再参与、浮空数字 21px、提示条退役 | 设计段已同步(2026-11-07);实现偏差→反哺点 | -| `game/tests/golden/README.md` | 棋盘裁剪 1036×548、越格口径、类型微光禁越圈范围 | 设计段已同步;实现批禁直改,基线重制按该文件口径执行(重制前用户确认) | -| `design/gdd/术语表.md` 掩尘/裸土/浮空数字/色牌 | 基色值、浮空数字定义、普通数字色牌退役+封印格色牌例外 | 设计段已同步;实现批禁直改 | -| `design/art/asset-path-map.md`/`art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、普通数字色牌退役+封印格色牌例外、程序化材质无入包 PNG | 设计段已同步;实现删除资产后按反哺点核对 | -| `design/engineering/architecture/architecture.md:178` | 单格两绘制域件行把 `cell_base_layer` 记为在役组件;本批删除该件、新增地形/浮空/阴影层 | 架构文档写权限=用户专属(2026-11-07 裁):实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 | -| `game/tests/README.md` 能力表 | 新增 6 条能力;旧「地形瓦片套与格面数字可读」保留(删除归写卡段后续;实现批禁写);「战斗屏三区几何」代表用例改名 | 写卡段本批入表(本卡同 commit);实现批只核对名字与实际落地一致 | -| `roadmap.md`/`design/gdd/08-Alpha版本标准.md`/`待办清单.md` | 本卡已写/待编排状态 | 编排段与收尾段推进;实现批禁直改 | - ---- - -## 7. 文件结构图 - -| 文件 | 行为改动/非行为 | 职责 | 验收行 | -|---|---|---|---| -| `game/presentation/views/board_terrain_palette.gd`(新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)`;dungeon/underdark/deep 取 art-bible v3.51 §4.1 冻结值;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;封印石读 `light_edge`(零新增色);只读 | §12-14 | -| `game/presentation/views/board_terrain_layer.gd`(新增) | 行为 | 地面、合并岩顶、南/东崖面、内阴影、四段投影、封印格受光棱封印石贴片;`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`/`set_hero_foot_y()`/`set_pass()`/`mass_rects()`/`terrain_metrics()`;静态 `lift_for()`/`eshift_for()`;back/front 两实例(`_world` 下固定名字 `TerrainBack`/`TerrainFront`,不占 BoardView 成员) | §12-3/4/5/8 | -| `game/presentation/views/board_float_layer.gd`(新增,Control) | 行为 | 外壳层浮空字:2px 描边、1px 浮空投影、双色引导线;`setup()`/`set_entries()`/`set_font()`/`label_rects()`/`label_metrics()`;不画阴影圆;**封印格不生成 entries**;壳层固定名字子节点 `FloatLayer`,不占 BoardView 成员 | §12-6/7 | -| `game/presentation/views/board_label_shadow_layer.gd`(新增,Node2D) | 行为 | 开启格地面 10×6 四层阴影圆;`setup(cell, cells)`/`circle_rects()`(世界局部/格坐标);**封印格不生成圆**;`_world` 下固定名字 `LabelShadow`,不占 BoardView 成员;z=0,位于小人之下 | §12-6/7 | -| `game/presentation/views/ap_bar_view.gd`(修改,保留类名/字段名) | 行为 | 根改为全幅 Control(IGNORE)+左右两个 PanelContainer(`_init` 局部变量,不新增成员);左 AP+停手,右 RAP+图例+弃图刷新;信号/setter 名不变;`side_rail_w` 从布局表读 | §12-1/12 | -| `game/presentation/views/board_view.gd`(修改) | 行为 | 新格边公式、顶预留 44、棋盘原点、地形/浮空/阴影圆固定名字子节点装配(不新增成员)、`rebuild` 清场跳过三层、`_resort_cell_decals` 按脚底行分档、命中测试、refresh 清理(删 `_paint_cell_base`/`_paint_cell_facade` 与 `u.base.*`)、迷雾 rect、rebuild/set_cell_area 侧栏参 | §12-2~9 | -| `game/presentation/views/board_zone_view.gd`(修改) | 行为 | 去掉 VBox/AP 条/hint;board_area 全幅;侧栏叠层;toast 左栏顶部;`_side_rail_w` 存 layout 值 | §12-1 | -| `game/presentation/views/board_world.gd`(修改) | 行为 | 悬崖保留 z=0、材质色接新 palette;小人 z=1、落影相对 z=-1;格子 z 对齐 | §12-5 | -| `game/presentation/views/board_cell_unit.gd`(修改) | 行为 | 去基座层(删 `base` 成员);新增 `top_face_offset`/`visual_rect`;**保留 `plate`**(封印格身份色牌);`z_index` 按脚底行分档(北侧 0/南侧 3;**封印格恒 0**,由 `_resort_cell_decals` 重算);`glyph` 只写封印格(色牌字形),普通数字不写格面;封印子件 `show_behind_parent=true`(法阵在色牌下);迷雾三块;记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下),不整矩形压南邻岩顶;`draw_removed_dim` 墙格改顶面 rect;接触带迁入固定名字低层子件 `ContactGlow`(同全局 -1);文件头注删 `cell_base_layer` 引用 | §12-8/9/13 | -| `game/presentation/views/cell_mark_overlay.gd`(修改) | 行为 | 删普通数字字形/色牌路径;**保留封印格字形+`_draw_digit_plate` 色牌+徽章**;保留变异/路径/高亮/退色;顶面 rect 参数 | §12-8/11 | -| `game/presentation/views/cell_base_layer.gd`(删除) | 非行为(清理) | 逐格基座/立面/投影/接触带职责移交 | §12-3/13 | -| `game/presentation/views/tile_palette.gd`(删除) | 非行为(清理) | 16+5 装图/三态墨色职责退役 | §12-11 | -| `game/data/schemas/battle_layout_table.gd`(修改) | 非行为(数据契约) | 增 `side_rail_w`;`ap_bar_h` 保留字段(游戏视图零读) | §12-1 | -| `game/data/tables/battle_layout.tres`(修改) | 非行为(数据) | `side_rail_w = 200`;`ap_bar_h` 字段保留 | §12-1 | -| `game/presentation/main.gd`/`main_debug_flow.gd`(修改) | 非行为(接线) | `BoardView.rebuild(..., side_rail_w)` 传布局表值 | §12-2 | -| `game/probe/board_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、侧栏 200、顶面 rect 微光圈;**封印取证保持逻辑格 rect(圆心格心)**,选择器按迭代56后 `has_seal` 口径;三关截图 | §12-15 | -| `game/probe/type_glow_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、`rebuild(..., 200)`、微光允许区改顶面 rect | §12-15 | -| `game/probe/layout_probe.gd`(修改) | 非行为(取证) | `_cell_for` 带侧栏;D 区/原点/顶预留读数(含 1920 档) | §12-2/15 | -| `game/probe/ui_input_probe.gd`(修改) | 非行为(取证) | `set_cell_area` 恢复时带侧栏参 | §12-2/15 | -| `game/probe/ui_contrast_probe.gd`(修改) | 非行为(取证) | 去旧瓦片均值段;加浮空字四类底复合对比;迷雾派生段改读新 palette | §12-6/9 | -| `game/tests/unit/presentation/board_terrain_test.gd`(新增) | 非行为(测试) | 格边/合并/投影/深度/锚点/命中/迷雾/接触/色板/旧资产/封印承载与色牌 | §12-2~5,8,9,11,13,14 | -| `game/tests/unit/presentation/board_float_label_test.gd`(新增) | 非行为(测试) | 字高/间距/顶预留/最顶/阴影视小/复合对比/普通数字零底牌(封印格跳过) | §12-6/7/11 | -| `game/tests/unit/presentation/board_side_rail_test.gd`(新增) | 非行为(测试) | 侧栏几何、信号、setter、提示条退役 | §12-1/12 | -| `game/tests/unit/presentation/terrain_tile_sets_test.gd`(删除) | 非行为(测试) | 旧瓦片套断言整体退役 | §12-11 | -| `game/tests/unit/presentation/stage_background_test.gd`(修改) | 非行为(测试) | 新增 `_test_side_rail_width_from_table`(现无 AP 条高度测试) | §12-1 | -| `game/tests/unit/presentation/player_copy_sweep_test.gd`(修改) | 非行为(测试) | 普通已开危险格:`u.plate==true` 改 `u.plate==false`+浮空 entries 含该格;封印格色牌断言归 `board_terrain_test` | §12-6/11 | -| `game/tests/unit/presentation/standee_present_values_test.gd`(修改) | 非行为(测试) | V11 口沿高光源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱);`body_src` 段保留 | §12-3/11 | -| `game/tests/run_all.gd`(修改) | 非行为(测试入口) | 注册三个新套件、移除 terrain 套件 | §12-16 | -| `game/tests/README.md`(写卡段本批改) | 非行为(能力清单) | 新增 6 条能力;旧地形行保留(删除归写卡段后续);代表用例改名 | §12 全表 | - ---- - -## 8. 落位与可复用性预检 - -| 新增件 | 复用面(为什么不能复用既有) | 唯一面 | 分层与交互 | -|---|---|---|---| -| `board_terrain_palette.gd` | 现有 `TilePalette` 只装 PNG/算墨色,不含三关程序化八色;改它会保留装图职责,职责混杂,故新件只放色表 | 三关八色只在此文件定义;视图只读 `palette_for()` | 纯数据件,不引用 UI/节点;`board_terrain_layer` 消费 | -| `board_terrain_layer.gd` | `cell_base_layer.gd` 是逐格基座,无法表达合并岩体/脚底排序;扩它会变成两个职责,故新件承接地形 | 地面/岩体/崖面/投影只在此件绘制;`cell_base_layer` 删除;LIFT/ESHIFT 只在此件静态函数 | 由 `BoardView` 创建两个实例(back/front),读 `wall_at` Callable 与 palette;不反向调用 BoardView | -| `board_float_layer.gd` | `cell_mark_overlay` 是逐格绘制域件,无法做跨格最高层与引导线;且 SubViewport 尺寸只到棋盘+悬崖,顶行浮空字会被裁,故必须做 BoardView 外壳 Control 覆盖层 | 数字/引导线只在此件绘制;`cell_mark_overlay` 删数字路径;不画阴影圆 | 由 `BoardView` 创建为全幅 Control;读 entries(cell/glyph);不写核心 | -| `board_label_shadow_layer.gd` | 浮空层在外壳、会盖小人;阴影圆必须在小人之下且在地面之上,无法复用浮空层或格件(格件 z=3 会盖小人) | 阴影圆只在此件绘制;开启格局部圆心格顶+7 | 由 `BoardView` 创建于 `_world`,z=0;读 entries 的 cell 列表;不反向调用 BoardView | -| `ap_bar_view.gd`(改造不换名) | 现有 `ApBarView` 已含 AP/RAP/确认/图例/刷新全部逻辑与信号,且被组合根/探针以字段名 `ap_bar` 引用;改名会波及 7 个接线文件,收益低风险高,故保留类名/字段名,只改布局职责 | 侧栏只此一件;`BoardZoneView` 只持有它 | 由 `BoardZoneView` 创建;信号经原有组合根路径上抛 | -| 三个测试件 | 现有 `terrain_tile_sets_test` 只测旧瓦片套;新职责无法复用;按职责拆三件(地形/浮空/侧栏) | 每个测试件只测对应域 | 经真实 `BoardView`/`BoardZoneView` 入口实例化;不直调核心写 | - -**唯一面核查**:`LIFT`/`ESHIFT`/`TOP_RESERVE`/`side_rail_w` 各只有一个定义点;普通数字路径 `DIGIT_PLATE`/`plate` 零引用(封印格身份色牌为唯一例外,`cell_mark_overlay`/`CellUnit.plate`);`terrain_*` 零引用;三关八色只在 palette 件;封印格承载色只读 `palette.light_edge`;层节点名 `_world/TerrainBack`/`_world/TerrainFront`/`_world/LabelShadow`/壳层 `FloatLayer` 各只有一个创建点,`rebuild` 只清格件与英雄、不误清三层。 - -**分层与交互**:Core 零 UI、数据只经 ConfigDB、RNG 零触碰、命中只读——全部保持;新增件不互相反向持宿主引用。 - ---- - -## 9. 实现规范预算 - -| 新文件 | 公开方法预算 | 成员变量预算 | 说明 | -|---|---|---|---| -| `board_terrain_palette.gd` | 1(`palette_for`) | 8 个常量 | 纯数据;不新增类状态 | -| `board_terrain_layer.gd` | ≤7(`setup`/`set_hero_foot_y`/`set_pass`/`mass_rects`/`terrain_metrics`/`lift_for`/`eshift_for`) | ≤13(新增 `_sealed_at` 一个成员——封印石贴片输入;其余同前) | 两个实例共享一个类;`pass_mode` 区分 back/front | -| `board_float_layer.gd` | ≤5(`setup`/`set_entries`/`set_font`/`label_rects`/`label_metrics`) | ≤8 | 一个 Control;所有数字在一个 `_draw` | -| `board_label_shadow_layer.gd` | ≤2(`setup`/`circle_rects`) | ≤6 | 一个 Node2D;所有圆在一个 `_draw`;坐标=世界局部/格坐标 | -| `ap_bar_view.gd`(改造) | 既有 10 个公开函数不减 | 既有 14 个成员不增(左右栏容器为 `_init` 局部变量) | 不新增公开面/成员;只改 `_init`/`_build_*` | -| 三个测试件 | 每件 ≤20 个 `func _test_*` | 夹具变量 ≤15 | 不计生产接口;测试件无消费面 | - -**存量触面**:`board_view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette`);本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`);S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w`,默认阈值内)。`board_cell_unit.gd` 12→13 成员(删 `base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset`/`visual_rect`,保留 `plate` 封印色牌;净 +1;`ContactGlow`/`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 普通数字路径只减面,封印格色牌/字形面保留。迁移函数对账:`cell_base_layer.gd` 的 `draw_base`/`_draw_south_facade`/`_draw_north_projection`/`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles`/`digit_ink_mode`/`normalize_floor_luma` 不迁移(职责退役)。 - -**指标例外申报**:无。若实现期发现 `board_terrain_layer.gd` 超过 7/13,按职责拆 `board_terrain_face_layer.gd`(崖面/投影)——先停卡呈报,不在实现段自行扩面。 - ---- - -## 10. 拆分边界纪律 - -判据权威 = `design/engineering/code-conventions.md` §1.1;本卡不复制定义,只写条款: - -- 每个拆出单元(地形层/浮空层/阴影圆层/侧栏)必须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载)。 -- 拆出单元必须有集体身份,命不出名字的「剩下的成员」打包=凑计数袋,禁止。 -- 过阈值只作发现信号,作拆分或收拢动机即违规。 -- 按职责拆不出内聚单元→停卡呈报走豁免/还债通道,禁硬拆凑绿。 - -职责语句:`board_terrain_layer`=「把棋盘格态画成连续地面/合并岩体/崖面/投影」;`board_float_layer`=「把开启格字形画成高于一切的浮空标注」;`board_label_shadow_layer`=「把浮空标注的所属格画成小人脚下的地面阴影圆」;`ap_bar_view`=「承载 D 区左/右行动资源读数与按钮」。 - ---- - -## 11. 任务卡 T0..T8 - -### T0 读数与基线(0.5 日) - -**取用**:无(首卡)。 -**产出**:`reports/iter-实现报告-<日期>.md` 的 T0 读数段;当前棋盘 golden 三图 hash;三关当前画面读数。 - -- [ ] 实读 `battle_layout.tres`:`stage_h=252`/`info_panel_w=240`/`ap_bar_h=44`/`log_band_h_dig=24`/`log_band_h_settle=84`,写入报告。 -- [ ] 实读当前 `board_area.size` 与 `BoardView.cell_size`(含 VBox 间距/hint 扣减;禁预设 504/37);写入报告。 -- [ ] 跑 `board_shot_probe` 存三关当前帧与 `board_meta.json`,记下 hash;不重制基线(T7 才换代)。 -- [ ] 确认 `game/assets/art/board/` 63 PNG+63 `.import`+`seal_mark.png` 在库;报告列清单。 -- [ ] 跑 `python tools/gdstyle_gate.py` 记录 `board_view.gd` 当前 27/31 基线读数;跑 `python tools/capability_audit.py` 记录当前红项(T8 复跑)。 -- [ ] 录三关 `board_type` 字符串与 art-bible v3.51 §4.1 三关八色;不采样旧瓦片均值。 - -### T1 布局表与 D 区侧栏(1.5 日) - -**取用**:T0 读数。 -**产出**:`BattleLayoutTable.side_rail_w`(200);`ApBarView` 双侧栏改造;`BoardZoneView` 全高 board_area+toast 左栏+hint 删除;`stage_background_test` 改名断言。 - -- [ ] `battle_layout_table.gd` 增 `@export var side_rail_w: int = 200`;`validate()` 增域 [160,260];`ap_bar_h` 保留字段与校验(游戏视图零读)。 -- [ ] `battle_layout.tres` 写 `side_rail_w = 200`;`ap_bar_h` 保留。 -- [ ] `ap_bar_view.gd`:根改全幅 `Control`(`mouse_filter=IGNORE`),内部左右两个 `PanelContainer`(各宽 `layout.side_rail_w`,贴 D 区左右缘;两个容器用 `_init` 局部变量创建并 `add_child`,不新增成员);左栏 `_build_ap_face`(含停手按钮);右栏 `_build_rap_face`+`_build_legend_refresh`+`_build_refresh_confirm`;保留 `class_name ApBarView`、`stop_pressed`/`refresh_confirmed`/`legend_toggled` 与 `set_ap`/`set_rap`/`set_refresh_cost`/`set_refresh_state`/`set_stop_enabled` 签名;删除 `custom_minimum_size = layout.ap_bar_h`。 -- [ ] `BoardZoneView` 删 VBox;`ap_bar` 字段保留、改为全幅叠层子件(不再挂 VBox);删 hint 条(`board_zone_view.gd:74-79`);根 PanelContainer 清空 panel style(或改 Control 根),`board_area` 占满 D 区(1036×548);toast 挂 `ap_bar` 左上、宽 `side_rail_w`;`_init(layout)` 存 `_side_rail_w = layout.side_rail_w`;`_on_board_area_resized` 调 `board_view.set_cell_area(_board_area.size, float(_side_rail_w))`。 -- [ ] `stage_background_test.gd`:新增 `_test_side_rail_width_from_table`(该件现无 AP 条高度测试;读 `layout.side_rail_w==200`,并断言 `ApBarView` 无 `custom_minimum_size.y==ap_bar_h` 路径)。 -- [ ] `board_side_rail_test.gd` 新建:`_test_side_rail_layout`(左/右栏 x 宽、board_area 高 548、toast 不压棋盘、hint 节点不存在)+`_test_signals`(三个信号与 setter)。 -- [ ] `run_all.gd` 注册 `board_side_rail_test.gd`。 -- [ ] 跑 `board_side_rail_test` 与 `stage_background_test`;报告写读数。 - -### T2 格边公式、顶预留与命中(0.5 日) - -**取用**:T1 的 `side_rail_w`;`BoardZoneView._side_rail_w`。 -**产出**:`board_view.gd` 的 `TOP_RESERVE=44`/`BOTTOM_RESERVE=12`、`_cell_for(n, avail, side_rail_w := 0.0)`、棋盘原点、命中不变;`layout_probe`/`ui_input_probe` 带侧栏参。 - -- [ ] `board_view.gd` 加 `const TOP_RESERVE := 44.0`、`const BOTTOM_RESERVE := 12.0`;`set_cell_area(avail: Vector2, side_rail_w: float = 0.0)`、`rebuild(board, minesweeper, side_rail_w: float = 0.0)`(公开方法数保持 27;`rebuild` 内调 `set_cell_area(size, side_rail_w)`)。 -- [ ] `_cell_for(n: int, avail: Vector2, side_rail_w: float = 0.0)`:`floor((min(avail.x - 2*side_rail_w - 12 - DEPTH_PX, avail.y - TOP_RESERVE - BOTTOM_RESERVE - DEPTH_PX) - (n-1)*SEP)/n)`,`clampi [26,46]` 不变。 -- [ ] `_wrap` 由 `CenterContainer` 改为全幅 `Control`(`mouse_filter=IGNORE`);`board_px` = 棋盘外框(`cols*stride - SEP`,12×12=478;**不含悬崖 8**);`_svp_container.position = Vector2((avail.x - board_px.x)*0.5, TOP_RESERVE)`;容器尺寸 = `board_px + Vector2(DEPTH_PX, DEPTH_PX)`(`_update_world_size` 现有 `px` 含悬崖,仅用于容器尺寸);`_update_world_size`/`set_cell_area` 同一处写入;`cell_origin`/`_cell_at` 继续读该 position;`set_cell_area` 同拍重跑 `TerrainBack/Front.setup(...)`、`FloatLayer.setup(cell, origin, entries, font)`、`LabelShadow.setup(cell, cells)`(格边/原点变更)。 -- [ ] `main.gd:470` 与 `main_debug_flow.gd:104` 的 `rebuild` 调用传布局表值(main 用 `db.presentation.battle_layout.side_rail_w`;debug flow 用 `root.db.presentation.battle_layout.side_rail_w`);`ApBarView` 不新增公开 `side_rail_w` 成员。 -- [ ] `board_terrain_test.gd:_test_cell_formula_base`:`_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`;`cell_origin(Vector2i(0,0))==Vector2(279,44)`(board_area 局部;屏幕 523,296);14×14 局部 (281,44)。 -- [ ] `board_terrain_test.gd:_test_hit_test_logical_rect`:`_cell_at(cell_center_local(c))==c` 对 12×12 全格;顶面左上角点按逻辑公式归属北/西邻格(不做归本格特判);板外返回 `(-9,-9)`。 -- [ ] `layout_probe.gd` 的 `_cell_for` 调用带 `main.db.presentation.battle_layout.side_rail_w`;加 D 区/棋盘原点/顶预留读数;1920 档按全局等比 1.35 断言构图一致。 -- [ ] `ui_input_probe.gd:360-366` 的 `set_cell_area` 恢复调用带 `main.db.presentation.battle_layout.side_rail_w`;`board_gen_reward_test` 的 2 参调用保持(测试独立口径)。 -- [ ] 跑 `board_terrain_test` 与 `layout_probe`;报告写读数。 - -### T3 地形深度层(2.0 日) - -**取用**:T2 的格边/原点;art-bible v3.51 §4.1 三关八色。 -**产出**:`board_terrain_palette.gd`、`board_terrain_layer.gd` 两个实例(back/front);`BoardView` 装配;`cell_base_layer.gd` 删除;接触带迁入 CellUnit。 - -- [ ] `board_terrain_palette.gd`:八色常量(`Color("#...")`)按 art-bible v3.51 §4.1 三关表;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;`palette_for(board_type)` 返回 Dictionary;未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。 -- [ ] `board_terrain_layer.gd`:`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`(`sealed_at` = 封印格查询 Callable);`set_pass("back"/"front")`;`set_hero_foot_y(y)`;`_draw()` 中**地面/投影/封印石/背岩体只在 back 画**(整板悬崖仍由 `BoardWorld._draw` 承担,不重复绘制),岩体按 pass 过滤(back=脚底≤hero,front=>hero),每个 setter 调 `queue_redraw()`;静态 `lift_for(cell)`/`eshift_for(cell)`。 -- [ ] 封印石贴片(back):`sealed_at(c)` 为真的格,在连续地面之上铺本格逻辑 rect 的 `palette.light_edge` 实色(可带 1px `palette.seam` 收边),不越格、不加新色;封印黑对受光棱对比 6.45–9.94:1(art-bible v3.51 §3.2/§4.1)。 -- [ ] 岩顶公式:`LIFT=round(cell*0.435)`、`ESHIFT=round(cell*0.109)`;四邻连通合并;相邻墙顶搭接 2;板边外延 ESHIFT;南崖高 LIFT、宽 cell+ESHIFT;东崖宽 ESHIFT、高 cell+LIFT;禁竖条纹。 -- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `_world/TerrainBack`(z=-1)与 `_world/TerrainFront`(z=2),不新增类成员;两层设 `use_parent_material = true`(随 `_world.material` 去饱和);back 画地面/投影/封印石/背岩体;front 画南侧岩体;`hero z=1` 不变;格件 z 按脚底行分档(北侧 0、南侧 3;**封印格恒 0**),由 `_resort_cell_decals` 重算(顶面贴花/交互/迷雾同格件 z);`board_world` 悬崖保留 z=0、`mat` 取新 palette 岩顶色(`_refresh_slab` 不再写 `COL_BRICK`);`rebuild` 清 `_world` 子件时跳过 `TerrainBack`/`TerrainFront`/`LabelShadow`(只清格件与英雄),再对各层重跑 `setup`(不重建节点);`setup` 传入 `_minesweeper.has_seal` 作 `sealed_at`。 -- [ ] `BoardView._resort_cell_decals()`(私有):遍历 `_cells`,`u.z_index = 0 if u.seal_on else (3 if c.y > hero.y else 0)`;`ContactGlow`/`MemoryGround` 子件 `z_as_relative=false`、`z_index=-1`(全局 -1:地面之上、阴影圆 0 之下);`refresh` 与 `_update_hero` 末尾调用;hero 缺位时全部按 0 档。 -- [ ] `board_view.gd` 删 `_paint_cell_base`/`_paint_cell_facade`(及 `_paint_cell`/`refresh` 调用)、`_floor_tile_for`/`_wall_tile_for`、`_build_cell_unit` 的 `u.base.bevel`;`_paint_cell_ink` 删 `bg` 计算/返回(`COL_FLOOR`/`COL_BRICK` 随之删)但保留 glyph 计算:**封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`(色牌字形),普通已开格只把 glyph 交给浮空 entries、`u.glyph` 留空**;`_apply_contact_bands`/`_process`/`_reset_breath` 的 `u.base.contact_*` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`(不再经 `u.base`);`COL_DIGIT` 无引用即删;英雄贴图缺位字形「人」回退随基座退役(T4 登记)。 -- [ ] 删除 `cell_base_layer.gd`;`board_cell_unit.gd` 去 `_BASE_LAYER` 预载、`base` 成员与 `base.draw_base`,文件头注删 `cell_base_layer` 引用;英雄蓝框随基座退役;接触带绘制迁入固定名字低层子件 `ContactGlow`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下;只画英雄格地面侧,正交整边/斜向角点+两半边,逻辑格边,不进岩体);记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(同全局 -1);BoardView 计算 `ground_visible_rect`(本格逻辑 rect 扣除南/东邻未开格岩顶越入,南邻约 LIFT−SEP、东邻约 ESHIFT−SEP)并下发 `MemoryGround.setup(...)`/`ContactGlow.set_bands(..., ground_visible_rect)`,子件不读棋盘、CellUnit 不增成员;两个低层子件只绘地面可见区,禁整矩形覆盖 back 岩顶/崖面;设 `use_parent_material = true`(随世界去饱和);`draw_removed_dim` 墙格改顶面 rect。 -- [ ] `standee_present_values_test.gd:79-86`:`cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱绘制点),删 `FACADE_HIGHLIGHT_PX), UiKit.BRICK, true` 断言;`body_src` 段保留;跑该件至 0。 -- [ ] `board_terrain_test.gd:_test_merged_mass_geometry`:四邻合并、相邻墙顶 rect 相交/搭接 2、无墙顶内框、地面无缝;`_test_projection_ratios`:38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外 2 墨边、南/东内阴影 3×2。 -- [ ] `board_terrain_test.gd:_test_depth_order`:三行夹具,断言 back 含北岩体、front 含南岩体、hero 在两者之间;北侧格件 `z_index=0`、南侧格件 `z_index=3`、**封印格(含南侧)`z_index=0`**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素(探针)。 -- [ ] `run_all.gd` 注册 `board_terrain_test.gd`。 -- [ ] 跑三关 golden 采集(先不重制基线)看差异落点;报告写地形层 draw calls。 - -### T4 浮空数字层与阴影圆(1.5 日) - -**取用**:T2 的原点/格边;T3 的深度分层。 -**产出**:`board_float_layer.gd`(Control 外壳)、`board_label_shadow_layer.gd`(Node2D 世界层);`BoardView` 装配;`cell_mark_overlay` 删数字路径。 - -- [ ] `board_float_layer.gd`:`setup(cell, origin, entries, font)`(origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4)→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()`/`label_metrics()`(壳层局部坐标);全幅 Control(`mouse_filter=IGNORE`)、z 最高;每个 setter 调 `queue_redraw()`;**不画阴影圆;封印格不进 entries**。 -- [ ] `board_label_shadow_layer.gd`:`setup(cell, cells)`(世界局部/格坐标系,不传 shell 原点;`cells` = 浮空 entries 的格集,**不含封印格**);`_draw()` 画 10×6 四层同心椭圆(外→内 α40/70/105/140,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle`);圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()`(世界局部);setter 调 `queue_redraw()`。 -- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `FloatLayer`(BoardView 子 Control,全幅,z 最高)与 `_world/LabelShadow`(Node2D,z=0),不新增类成员;`LabelShadow` 设 `use_parent_material = true`,`FloatLayer` 不在 `_world` 材质链,`set_desaturated` 同拍给 `FloatLayer.material = _desat_mat`/`null`(结算期浮空数字同样灰化,禁成彩色例外);`rebuild` 清 `_world` 子件时跳过 `LabelShadow`(T3 同款跳过表);entries 由 `refresh` 的已开记录生成(`1–8`/`危`/`?`),**封印格跳过**(其字形走色牌),记忆态不生成 entries。 -- [ ] `BoardView.set_world_font(f)` 同时 `FloatLayer.set_font(f)`;`cell_mark_overlay.gd` 删普通数字字形/色牌路径,**保留封印格字形+`_draw_digit_plate` 色牌**;`BoardCellUnit.plate` 保留(封印格 `true`、普通格 `false`);`board_view.gd` 删 `_digit_ink`/`_palette.digit_*`;`refresh` 字形段删 `_digit_ink` 三档与 `plate_digit` 普通路径(:586-591),封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`,普通已开格只交 entries(记忆墨仍用 `FOG_MEMORY_INK`;浮空字固定暖白芯);英雄贴图缺位字形「人」回退随基座退役(资产在包,正常路径不可达),实现报告「实现决定记录」登记。 -- [ ] `run_all.gd` 注册 `board_float_label_test.gd`。 -- [ ] `board_float_label_test.gd:_test_label_geometry`:字高 21、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;`_test_topmost_layer`:`FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle`:圆 10×6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆、封印格无圆;`_test_desaturation`:`set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast`:四类底复合对比 ≥4.5。 -- [ ] `board_float_label_test.gd:_test_no_ordinary_plate_path` 与 `board_terrain_test.gd:_test_seal_substrate` 扫描/断言:普通数字路径(`board_view.gd`/`board_float_layer.gd` 与 `cell_mark_overlay` 的非封印分支)零 `plate_digit`/`_digit_ink_mode`;`DIGIT_PLATE`/`_draw_digit_plate` 只在封印格分支命中。 -- [ ] 跑 `board_float_label_test`;三关截图看顶行数字越界与小人遮圆;报告写读数。 - -### T5 交互/封印/微光/迷雾锚点(1.5 日) - -**取用**:T3 的地形顶面;T4 的浮空层/阴影圆。 -**产出**:`cell_mark_overlay`/`cell_unit`/`seal_mark_layer`/`cell_type_glow_layer`/`board_view` 锚点与 fog rect;`board_terrain_test` 锚点/迷雾断言。 - -- [ ] `BoardView._top_face_rect(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell, cell)`、地面格逻辑 rect;`BoardView._visual_rect_for(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell+ESHIFT, cell+LIFT)`、地面格逻辑 rect;两者不新增公开方法。 -- [ ] `CellUnit` 增 `top_face_offset`(墙格 `(-ESHIFT,-LIFT)`、地面 `(0,0)`)与 `visual_rect`;`_draw` 用 `Rect2(top_face_offset, edge, edge)` 传给 face;`_sync_seal_layer` 调 `setup(edge, visible)`(**不传 top_face_offset**——封印居逻辑格心,见下条);`cell_type_glow_layer.setup(edge, group, top_face_offset)`;`cell_mark_overlay` 的变异/徽章/悬停/退色/路径按该 rect(墙格顶面、地面逻辑;路径点迹只地面逻辑)。 -- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible)` 不变(子件本地全幅 draw_rect,圆心 = CellUnit 本地 `(edge/2, edge/2)` = 逻辑格心);**不随岩顶 −ESHIFT/−LIFT 偏移**(art-bible v3.51 §3.2/§8.2);环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。封印子件设 `show_behind_parent = true`,保证身份色牌叠于法阵之上;封印格地面受光棱石由 `board_terrain_layer` back 画(T3)。 -- [ ] 类型微光:绘制 rect 改顶面 rect;`board_shot_probe`/`type_glow_shot_probe` 的「禁越圈」允许区改顶面 rect;微光不越出本格岩顶。 -- [ ] 迷雾:`CellUnit._draw_fog_layer` 墙格画三块黑罩(顶面 rect+南面 `Rect2(x-ESHIFT,y-LIFT+cell,cell+ESHIFT,LIFT)`+东面 `Rect2(x-ESHIFT+cell,y-LIFT,ESHIFT,cell+LIFT)`;只在未开格);记忆态由固定名字低层子件 `MemoryGround` 画新地面色(palette floor)+灰罩+记忆墨数字,不读 `base.tex_base`,不生成浮空 entries;只绘地面可见区(扣南/东邻岩顶越入),不覆盖北/西邻格地面;封印格在记忆态同样随格隐没(印记与色牌不显)。 -- [ ] 接触带:绘制迁入固定名字低层子件 `ContactGlow`(全局 z=-1:地面之上、阴影圆 0 之下);`board_view._apply_contact_bands`/`_process`/`_reset_breath` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`,不再经 `u.base.contact_*`;只画英雄格地面侧,正交整边/斜向角点+两半边;只绘地面可见区(扣南/东邻岩顶越入);`_contact_unit` rect 不改;光不进岩体。 -- [ ] `board_terrain_test.gd:_test_top_face_anchor`:**封印圆心 = 逻辑格心(不偏移)**、变异纹带/微光 rect 按 `-ESHIFT/-LIFT`;`_test_seal_substrate`:封印格地面像素 = 本关 `palette.light_edge`、普通已开格 = `palette.ground`;封印格 `plate=true`、`glyph` 为危/数字、无浮空 entries/无阴影圆;封印格 `z_index=0`;`_test_fog_rect`:墙格三块黑罩覆盖顶面+南+东、地面格不越格;采样北邻格左上 (x_n+2,y_n+2) 与西邻格左上 (x_w+2,y_w+2) 的非岩顶地面像素 = 原地面色、零黑罩(岩顶投影可越入邻格屏幕区);`_test_memory_cover`:记忆态格与南邻墙体重叠区采样,`MemoryGround` 只绘地面可见区,记忆地面/灰罩/记忆墨与 `removed_dim` 不覆盖南邻岩顶(重叠区像素来自南邻墙体);`_test_contact_glow`:接触带只绘地面可见区、在英雄格地面侧且全局 z=-1。 -- [ ] 跑 `seal_mark_params_test`/`type_glow_test`/`board_terrain_test`;报告写读数。 - -### T6 旧瓦片与旧路径退役(0.5 日) - -**取用**:T3/T4/T5 绿。 -**产出**:63 PNG+63 `.import` 删除;`tile_palette.gd`/`terrain_tile_sets_test.gd` 删除;`player_copy_sweep_test` 落牌断言替换;`ui_contrast_probe` 迷雾派生段替换。 - -- [ ] 删除 `game/assets/art/board/terrain_*` 63 PNG 与同名 `.import`;保留 `seal_mark.png`+`.import`。 -- [ ] 删除 `tile_palette.gd`、`terrain_tile_sets_test.gd`;`run_all.gd` 移除该套件;`board_view.gd`/`board_world.gd`/`ui_contrast_probe.gd` 的 `TilePalette` 引用全清。 -- [ ] `player_copy_sweep_test.gd:142-147`:普通已开危险格 `u.plate==true` 改 `u.plate==false`,并断言浮空 entries 含该格(或 `label_metrics()` 有该格);封印格色牌断言归 `board_terrain_test._test_seal_substrate`;`ui_contrast_probe._fog_derived_check` 改读 `board_terrain_palette` 的新地面/岩顶色或渲染帧取样,三行行值按新地面色重算(±2/255),删除旧瓦片均值段。 -- [ ] `board_terrain_test.gd:_test_legacy_assets_absent`:目录无 `terrain_*`、`seal_mark.png` 在库;源码 grep 零 `terrain_`/`TilePalette`/`CellBaseLayer`/`u.base`。 -- [ ] 跑 `repo_structure_audit.py`、`capability_audit.py` 与 `board_terrain_test`;报告写清单;旧地形行**保留**(实现批禁写 `game/tests/README.md`;删除归写卡段后续,T8 audit 经卡内豁免通道绿)。 - -### T7 验收面换代与三关 golden(1.0 日) - -**取用**:T3–T6 全绿。 -**产出**:`board_shot_probe` 视图 1036×548、侧栏 200、顶面 rect 微光圈/封印 rect;三关 golden 重制;渲染闸绿;`type_glow_shot_probe`/`layout_probe`/`ui_input_probe`/`ui_contrast_probe` 换代;三关色板逐值/互辨。 - -- [ ] `board_shot_probe.gd`:`view.size=Vector2(1036,548)`、`view.position=Vector2.ZERO`;`view.rebuild(..., 200)`;`_meta` 写全幅 rect;`_crop_cell` 用 `_visual_rect_for` 的屏幕换算;`_check_dual_frames` 的允许区改顶面 rect(用 `lift_for/eshift_for` 换算);**`_seal_evidence` 保持逻辑格 rect(封印居格心),选择器按迭代56后的 `has_seal` 口径**;注释与 `game/tests/golden/README.md` 口径一致。 -- [ ] `type_glow_shot_probe.gd:64-78` 视图改 1036×548、`rebuild(..., 200)`(与生产同格边 38),允许区/取样改顶面 rect;`layout_probe.gd` 的 `_cell_for` 带侧栏;`ui_input_probe.gd` 的恢复调用带侧栏;`ui_contrast_probe` 浮空四类底段与迷雾段换代。 -- [ ] 跑一次渲染闸看差异(预判棋盘三图全幅 changed>0,属换代);**显式呈报用户,按 `game/tests/golden/README.md` 现行口径获用户确认后**再按 `tools/golden_baseline_refresh.sh` 重制三关基线;复闸绿。 -- [ ] 三关色板逐值核对:`board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.51 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结);`glow_discrimination_sheet.py` 读已删旧 `terrain_*`,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过。 -- [ ] 跑 `bash tools/run_all_gates.sh --code`;报告写 smoke/unit/probe/render 读数。 - -### T8 产出物落位(0.5 日) - -**取用**:T7 全绿。 -**产出**:`reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录);`reports/iter-反哺点-<日期>.md`(§6 每条同步面的落点);本卡验收对照表逐行勾选。 - -- [ ] 实现报告写 T0–T7 状态、三关实机目检清单、draw calls/格边/原点/锚点读数、旧资产删除清单、三关色板读数。 -- [ ] 反哺点清单逐条列 §6 各行的落点:已同步的写“无新增”,实现偏差写“待文档批裁决”,架构表 `cell_base_layer` 行写“待用户发令修订”。 -- [ ] 验收对照表 §12 每行勾选;未过行标红并停卡,不合并。 -- [ ] 独立验收审计(未参与实现的会话/子代理)按 `test-conventions §8.7` 跑;报告落 `reports/iter-验收审计-<日期>.md`;未过不合并。 -- [ ] 复跑 `capability_audit.py`(红项 0)与 `pipeline_gate.py`(卡片自身零红);能力表名实一致(旧地形行为保留行,不参与核对;删除归写卡段后续)。 - ---- - -## 12. 验证闸(改动—验收对照表) - -> 层级:单元/接口/集成/探针;真实入口列写实际驱动面;判据绑定面写被测改动特有的可观测面;能力行名称与 `game/tests/README.md` 同批入表。 - -| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+通过判据) | 层级 | 真实入口 | 判据绑定面 | 能力行 | -|---|---|---|---|---|---|---| -| 1. D 区侧栏+提示条退役(判据:`design/ux/battle.md:124`、`design/gdd/systems/表现与支撑/HUD框架.md:62`) | `battle_layout_table.gd`、`battle_layout.tres`、`ap_bar_view.gd`、`board_zone_view.gd:23-37,74-79,91-92` | `board_side_rail_test.gd:_test_side_rail_layout`+`_test_signals`;`stage_background_test.gd:_test_side_rail_width_from_table`;`layout_probe.gd:_ready` | 单元+探针 | `BoardZoneView.new(layout)`→`ap_bar`/`_board_area`(测试读私有) | 左/右栏各宽 200、board_area 高 548、`side_rail_w==200`、hint 节点不存在、toast 不压棋盘 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | -| 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md:140,144`) | `board_view.gd:205-232,403-404,428-439`、`main.gd:470`、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base`+`_test_hit_test_logical_rect`;`layout_probe.gd:_ready`;`ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)`/`rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) | -| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md:170,173`) | `board_terrain_layer.gd`(新增)、`board_view.gd`、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry`;`standee_present_values_test.gd:_init`(V11 源码锚改指 `board_terrain_layer.gd`);三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()`→`_world/TerrainBack`、`_world/TerrainFront` 的 `mass_rects()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 4. 投影/崖面/受光(判据:`design/art/art-bible.md:171,172,174`) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios`;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外2、南/东内阴影 3×2 自 0.217 起、投影 4×4 α0.44/0.30/0.16/0.07 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 5. 脚底排序遮挡(判据:`design/art/art-bible.md:175`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md:176`、`design/ux/battle.md:307`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21、间距 15、视觉顶 38、线 2、1px 投影;圆 10×6、圆心格顶+7、z=0 低于 hero;**封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | -| 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md:165,307,313`) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer`+`_test_desaturation`;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack`/`TerrainFront`/`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | -| 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md:167,175`、`design/ux/battle.md:311-312`) | `board_view.gd`、`cell_mark_overlay.gd`、`seal_mark_layer`、`cell_type_glow_layer`、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor`+`_test_seal_substrate`;`seal_mark_params_test.gd`;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.visual_rect`/`CellUnit.z_index`/封印格 `plate` | **封印圆心=逻辑格心(不偏移)**、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true`、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | -| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md:427-429`) | `board_cell_unit.gd:_draw_fog_layer`/`MemoryGround`、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect`+`_test_memory_cover`;`ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.fog_state`/`MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | -| 10. 命中逻辑格(判据:`design/ux/battle.md:140`) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()`/`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c`;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) | -| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md:177,215`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 在库、普通数字零 `plate_digit`/`_digit_ink_mode`(封印格 `plate`/`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 | -| 12. 侧栏信号/setter(判据:`design/ux/battle.md:163`) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed`/setter | `stop_pressed`/`refresh_confirmed`/`legend_toggled` 逐信号;`set_ap`/`set_rap`/`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | -| 13. 接触带延续(判据:`design/art/art-bible.md:168`) | `board_cell_unit.gd`、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow`;`type_glow_test.gd` | 单元 | `BoardView.refresh()`→`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) | -| 14. 三关色板/互辨(判据:`design/art/art-bible.md:202,415`) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` | 三关八色与 art-bible v3.51 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge` | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 15. 取证面换代(判据:`game/tests/golden/README.md:28,31`) | `board_shot_probe.gd`、`type_glow_shot_probe.gd`、`layout_probe.gd`、`ui_input_probe.gd`、`ui_contrast_probe.gd` | 三关 `board_shot_probe`+渲染闸;`type_glow_shot_probe`;`layout_probe.gd:_ready`;`ui_input_probe.gd`;`ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn`;`tools/render_gate.sh` | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈、**封印取证保持逻辑格 rect(圆心格心)**、三关 golden 重制后 0 差异 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | -| 16. 测试入口/能力审计(判据:`design/engineering/test-conventions.md:196`) | `run_all.gd:225`、新增测试件、`game/tests/README.md` | `bash tools/run_all_gates.sh --code`;`capability_audit.py` | 集成 | 单元测试全套件 | 三新套件在册、terrain 套件移除、能力审计红项 0、全绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 17. 产出物/独立审计(判据:`design/engineering/test-conventions.md:147`) | `reports/` | 末卡产出物落位;`reports/iter-验收审计-<日期>.md` | 集成 | 实现报告/反哺点清单/审计报告 | 三件齐、逐行勾选、审计未过不合并 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | - -**测试削弱申报**(允许删除/替换的旧断言): - -- `terrain_tile_sets_test.gd` 整件删除(旧瓦片套/三态墨色已退役);其“格套完整性/色相域/墨模式”覆盖由 `board_terrain_test`/`board_float_label_test` 接班。 -- `ui_contrast_probe.gd` 旧瓦片均值段与 `_fog_derived_check` 的 TilePalette 依赖删除;改为读新 palette/渲染帧,浮空字四类底段新增。 -- `stage_background_test.gd` 新增 `_test_side_rail_width_from_table`(该件无旧 AP 条高度测试可改名),等价断言 `side_rail_w==200`;`player_copy_sweep_test.gd:142-147` 的普通已开危险格 `u.plate==true` 改 `u.plate==false`+浮空 entries 含该格(封印格色牌保留,归 `_test_seal_substrate`)。 -- `board_view.gd` 的 `_paint_cell_base`/`_paint_cell_facade` 段随基座退役(其立面/投影/蓝框覆盖由 `board_terrain_test` 的岩体/崖面/接触带断言接班);`u.base.*` 无残留。 -- `standee_present_values_test.gd:79-86` 的 `cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(旧口沿高光绘制点随基座退役,等价断言改新落点);`body_src` 的 V11 断言保留。 -- `board_shot_probe.gd` 的 900×900 视图与逻辑格“禁越圈”允许区替换为 1036×548 与顶面 rect;加严口径本身不删、不放宽。 -- 其它旧断言禁止删除/放宽;未申报的删除由独立验收审计判红。 - -**判据绑定面口径**:所有行为行都绑被测改动特有的可观测面(绘制 rect/z 序/常量/信号/读数);`board_terrain_test` 的地形断言读 `mass_rects()`/`terrain_metrics()`,不读私有 `_draw` 内部;浮空断言读 `label_rects()`/`label_metrics()`/`circle_rects()`;侧栏读公开 setter/信号;golden 绑渲染帧。 - ---- - -## 13. 异常分级 - -- **L1 自救**:测试环境缺 `user://`、字体、导入缓存——按 `game/tests/README.md` 现行坑册处置。 -- **L2 记录继续**:三关色板派生读数偏差在 ±1 通道内、draw calls 波动 <10%——记入实现报告继续。 -- **L3 停机呈报**: - - 新路径与 art-bible 条款冲突(比例/顶预留/圆心/层序/三关色板/封印承载任一不符)——停卡,列反哺点,禁自行改条款。 - - 封印呈现与迭代56「受理即揭示」或 art-bible v3.51 封印条冲突(印记落未开格、圆心随岩顶偏移、身份字形进浮空层、色牌层序颠倒、封印石对比 <4.5)——停卡呈报,禁把封印改回旧假设。 - - `board_terrain_layer` 超 7 公开方法/12 成员且按职责拆不出内聚单元——停卡走豁免/还债通道,禁凑数拆绿。 - - 机检键与卡片契约互斥(如测试要求保留 `plate` 字段)——停卡呈报,禁为机检保留无效成员。 - - 三关色板逐值/互辨不过——停卡呈报,禁调色绕过或改判据。 - - 三关 golden 重制后仍有非预期差异——停卡,先判有效/失效,禁“重制一下就绿”。 - - 迷雾黑罩覆盖北/西邻格地面——停卡,按三块形状修正,禁扩大/缩小判据掩盖。 - - 固定名字层子件(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`)在 `rebuild`/换板后出现重名、丢失或被清场误删——停卡,按固定名字表修正,禁改成 BoardView 成员绕过 S13。 - ---- - -## 14. 代拍板白名单 - -允许实现期自行拍板(超清单记入实现报告「实现决定记录」): - -1. `board_terrain_layer` 内 back/front 两实例的精确 z 值(只要满足 back 批名:营地场景重排接线 · 日期:2026-11-07 · 验收档:中(布局呈现数据面,无存档/结算传播) -> **接管必读**:本卡对应工作已有部分实现落库且未做完。已完成项/未完成项见 §2「写卡时实查基线」;接管人必须先按 §1.3 做 T0 扫描,逐项复核当前 commit 的真实状态,禁按「未做」整批重写,也禁按「已有」跳过核对。 -> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交;**已补回**,状态「已写卡」,见 `待办清单.md`)。 -> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.10 §2.3/§3/§5 第 12 条+第 13 条+[art-bible](../design/art/art-bible.md) v3.48 §6.2+[camp](../design/ux/camp.md) 第 29 行+2026-11-07 用户讨论定稿(土线覆盖围墙底与门扇底;最终墙件预览过目;渲染闸与独立审计入场)+2026-11-05 用户裁定的六件落位值。**设计已补录**:六件逐值矩形(dummy/forge/tent/chest/notebook/campfire)已补入 `camp-scene-prompts.md` v1.10 §5 第 13 条(2026-11-08);art-bible §6.2 门扇底同口径仍列反哺点(不阻塞本卡成立)。 -> 本版任务边界:**只出需求卡片与两条上游缺口补录**(设计文档六件逐值、待办条目);不实现游戏代码、不提交、不合并。实现与提交须用户另行发令。 +> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交) +> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.9 §2.3/§3/§5 第 12 条(2026-11-05 与 2026-11-07 用户裁)+[art-bible](../design/art/art-bible.md) v3.48 §6.2(围墙显示矩形与墙脚入土线)+[camp](../design/ux/camp.md) 第 29 行(围墙带 y220–420)+2026-11-07 用户裁原话(墙高 200、顶 y220、门/板跟随、墙脚入土;预览过审 `artwork/2026-11-07-营地接线预览/camp_new_layout_preview_c.png`) ## 1. 目标与完成定义 -### 1.1 目标 +把营地十层的运行数据换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;新围墙件(1280×164,补尖+墙脚入土缺口)入包;布局表几何红线单测与冒烟全绿;游戏内营地图层按新矩形铺底、墙脚无贯通直线。 -把营地十层换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;围墙最终件(1280×164,补尖+底边入土缺口)入包;**土线同时覆盖围墙底与门扇底**,实机读作插在土里;十层结构不变(不新增图层);最终墙件重新出预览并经用户过目;布局/土线/渲染/独立审计全部有读数;营地屏按 `test-conventions.md:100` 纳入渲染闸 golden 机器面。 +完成定义:`camp_scene_layout_test.gd` V14 全绿(含新值钉断言)+冒烟测试 exit 0+`palette_check` 围墙对八件零新增色+`path_check` 0 问题;游戏内目检归用户(登记不阻塞)。 -### 1.2 完成定义 +## 2. 现状事实(开工自行复核) -本批算完成,必须同时满足: - -1. 最终墙件预览已用 `scene_camp_wall_final.png` 重新生成,并经用户过目(U0)。 -2. 十层 `.tres` 值与 §3 逐字一致;schema 默认值、视图层构建一致;层数仍为 10,bg/wall 仍占 z0/z1。 -3. 土线(围墙底+门扇底)与过审预览读感一致;底边界不是贯通全宽的直线;门扇底不再单独露直边,也不出现独立灰影;门扇 NORMAL/HOVER/DISABLED 切换后土线仍在。 -4. 营地单测 V14+新钉值+门扇状态土线保留单测全绿;结构探针 PASS;营地截图的土线机检 PASS;营地屏 camp golden 已冻结并经用户确认;渲染闸全绿。 -5. 独立验收审计(未参与实现的会话或子代理)通过,报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`(日期取审计当日)。 -6. 游戏内终审已登记(用户自排,登记不阻塞);art-status-checklist 的营地行补录事实已列反哺点。 -7. 代码域闸全绿,远端 CI 对合并提交为绿(跑闸步真跑过);静态扫描零新增红(S11「雷格」已在当前基线修复)。 -8. 实现报告与反哺点清单写齐;实现报告内含**完成进度扫描记录**(见 1.3)。 -9. 上游缺口已闭合:设计文档六件逐值已补录(`camp-scene-prompts.md` v1.10 §5 第 13 条);待办清单条目已在册(状态「已写卡」)。编入迭代/开工/提交/合并仍须用户发令。 - -### 1.3 完成需求时的完成进度扫描(收口前置,必做) - -**任何卡或批次在宣称完成、写实现报告、请求合并之前,必须先扫描当前仓库的完成进度。未扫描不得宣称完成。** - -- 扫描时以实查为准:已存在的实现也要逐项对照本卡,不因“看起来已有”而跳过;不假设“应该没做”或“应该已经做了”。 -- 发现缺失、值不一致、素材与卡不符、测试缺读数、文档未同步,一律记为未完成;逐条列缺口,不得用一句“已完成”带过。 -- 扫描记录写进实现报告,至少含:检查时间、当前 commit、每一项的实查值/实际状态、与卡的差异、结论。 -- 扫描时点:**T0 开工扫描一次(基线)**;**T4 收口再扫描一次(最终)**。两次都留读数。 - -扫描面(逐项勾): - -| 面 | 要读什么 | 完成判据 | -|---|---|---| -| 布局表 | `game/data/tables/camp_scene_layout.tres` 十层 texture_rect/hotspot、wall_band、gate_gap | 与 §3 表逐字一致;层序不变 | -| schema | `game/data/schemas/camp_scene_layout_table.gd` 默认值/注释 | wall_band=(0,220,1280,200);validate 通过 | -| 视图 | `game/presentation/views/camp_scene_view.gd` 层构建、`expand_mode`、土线材质、门扇状态材质 | 门扇 138 高生效;土线覆盖墙+门扇底;NORMAL/HOVER/DISABLED 不丢土线;10 层 | -| 素材 | `scene_camp_wall.png` 尺寸/色数/柱尖/底边;`scene_camp_gate.png`;`scene_camp_bg.png`;源/包 md5 | 墙 1280×164、不透明 12 色、柱尖完整、底边有缺口、源包 md5 一致;门扇 240×211;背景 1280×800 | -| 导入缓存 | `game/.godot/imported/*.ctex` 的 mtime 与 `source_md5` | 与盘上源文件 md5 一致;改素材后已强制重导入 | -| 单测 | `camp_scene_layout_test.gd` V14+钉值+门扇状态土线保留 | 全 PASS,exit 0 | -| 结构探针 | `ui_struct_probe` camp 段 | PASS | -| 渲染/土线/golden | `shot_probe` 营地截图+`check_soil_line`+camp golden+`render_gate.sh` | 土线断言 PASS;camp golden 在位且经用户确认;渲染闸全绿 | -| 设计文档 | `design/art/camp-scene-prompts.md` §5 第 6 条/第 13 条、`design/art/art-bible.md` §6.2 | 六件逐值在册(本卡前置);门扇底同口径/240×147 与 138 口径统一属文档批反哺点,不阻塞本卡 | -| 审计 | 独立验收审计报告 | 报告在位、发现已闭合 | -| 文档/记录 | art-status-checklist、实现报告、反哺点清单、终审登记 | 各自落位;反哺点有去向 | -| 仓库红账 | 当前 master 静态扫描/CI | 本卡改动面零新增红;静态扫描 S11 零命中;外部红有处置结论 | - -## 2. 现状事实(开工复核基线,本卡不预写完成结论) - -- 当前分支**已经包含**本卡的部分实现(历史合并所致),且**未做完**。开工先按 §1.3 扫描,按实查值决定“已对/需改/缺件”,禁按“未做”整批重写,也禁按“已有”跳过核对。 -- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):以 §3 为目标值逐层核对;当前值以实查为准。 -- 视图 [camp_scene_view.gd:130](../game/presentation/views/camp_scene_view.gd#L130) 按表建层,[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136) 有 `EXPAND_IGNORE_SIZE`;土线材质是本案新增面。 -- schema 加载期 fail-fast:[camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);`wall_band` 包络校验在 [:59–:62](../game/data/schemas/camp_scene_layout_table.gd#L59-L62)。 -- 单测 [camp_scene_layout_test.gd:26](../game/tests/unit/presentation/camp_scene_layout_test.gd#L26) 读表动态取值;[:88](../game/tests/unit/presentation/camp_scene_layout_test.gd#L88) 起为 2026-11-07 钉值断言。 -- 素材:包内 [scene_camp_wall.png](../game/assets/art/scene/scene_camp_wall.png)、[scene_camp_bg.png](../game/assets/art/scene/scene_camp_bg.png)、[scene_camp_gate.png](../game/assets/art/scene/scene_camp_gate.png);尺寸与色数以 T0 实查为准。 -- **素材源路径**:最终墙件 `scene_camp_wall_final.png` 在主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/`(artwork 不入 git,worktree 无副本);T0 从主区取源,核 md5 与包内一致。 -- **写卡时实查基线(2026-11-08,worktree 基线 89f4fc78,供 T0 对照,不作完成结论)**: - - **已完成(实查)**:`.tres` 十层与 §3 逐字一致;schema 默认 `wall_band=(0,220,1280,200)`;view 有 `EXPAND_IGNORE_SIZE`/`STRETCH_SCALE`;V14 钉值断言在位;包内墙件 1280×164、全色 16(含透明/边缘 alpha)、不透明 12 色,与主区源件 md5 一致;门扇 240×211;背景 1280×800;`bash tests/static_scan.sh` S11 ok。 - - **未完成(实查)**:土线裁切材质(wall/gate);门扇 NORMAL/HOVER/DISABLED 保土线;土线机检 `check_soil_line`;门扇状态单测 `_test_gate_state_keeps_soil_cut`;camp golden+`render_gate.sh` camp 段+`golden_baseline_refresh.sh --camp`;最终墙件预览 U0;游戏内终审登记;实现报告/反哺点。 - - **接手动作**:上述均为写卡时点读数,接管人必须按 §1.3 做 T0 扫描复核当前 commit 的真实状态;已存在项逐项对照,不因「看起来已有」跳过;未完成项逐条补,不以一句「已完成」带过。 -- **导入缓存坑(本会话实证)**:主区曾出现 `.ctex` 停在 11-06、源文件已是 11-07 的旧缓存;旧缓存会让渲染闸拿到旧背景/旧围墙,绿读数无效。改素材后必须 `--editor --quit` 强制重导入,并核对 `source_md5`。 -- **S11 现状**:worktree 基线 89f4fc78 的 `game/probe/board_shot_probe.gd:34,35` 已是「危险格」;`bash tests/static_scan.sh` 实跑 S11 ok(扫描面 317 个文件)。历史日志里的「雷格」为旧读数,不构成本卡开工门;T3 复跑静态扫描,零新增红。 -- 待办清单条目已补回(状态「已写卡」);设计文档六件逐值已补录 `camp-scene-prompts.md` v1.10 §5 第 13 条;见头部。 +- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):wall `texture_rect=(0,261,1280,49)`、gate `(520,250,240,211)`、board `(845,268,130,121)`、tent `(982,520,251,170)`、forge `(40,467,240,193)`、dummy `(340,520,120,180)`、chest `(1097,700,106,90)`、notebook `(818,704,100,66)`、campfire `(560,571,160,149)`;`wall_band=(0,240,1280,70)`;`gate_gap=(520,760)`。 +- 视图按表建层、`TextureRect.STRETCH_SCALE` 拉伸到矩形尺寸:[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136);子节点序=表序=z 序(同文件头注)。 +- schema 加载期 fail-fast:validate 入口 [camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);贴图矩形不出画布、命中区不出画布/不侵 y<48/两两不相交、`wall_band` 必须包含 wall 贴图矩形([camp_scene_layout_table.gd:67](../game/data/schemas/camp_scene_layout_table.gd#L67))。 +- 单测读表动态取值、以关系谓词为主:[camp_scene_layout_test.gd:82](../game/tests/unit/presentation/camp_scene_layout_test.gd#L82)(门扇命中对齐 gate_gap)、`:87`(布告板命中顶落围墙带)、`:77`(篝火命中贴贴图底)。 +- 包内围墙件仍是旧 1280×49(`game/assets/art/scene/scene_camp_wall.png`);门扇件 240×211 由运行时压扁到矩形高(STRETCH_SCALE,2026-11-07 用户裁「不动美术素材」),无需换件。 ## 3. 设计契约(违反即返工) -🔴 逐层锁定值(写进 `.tres`,值逐字照此): +🔴 逐层锁定值(写进 .tres,值逐字照此): | 层键 | texture_rect | hotspot | hotspot_key | |---|---|---|---| @@ -86,193 +35,103 @@ | notebook | (870,515,100,66) | (870,501,100,80) | notebook | | campfire | (560,525,160,149) | (560,594,160,80) | campfire | -表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire),**总层数仍为 10**。 +表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire)。 -🔴 围墙最终件:1280×164、RGBA、≤32 色(全色 16 含透明/边缘 alpha;**不透明色实测 12**)、柱尖完整、奶油描边(与既有物件同色)、底边 1–7px 低频起伏透明缺口(按 200 高拉伸后约 1.2–8.5px);显示矩形 (0,220,1280,200),运行时按 200 高拉伸;源文件主区 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 与包内文件 md5 必须一致(写卡时实查 md5 `328b83fa3a79a97ae3d0c02f5abf4604`)。 +🔴 围墙件:1280×164、RGBA、≤32 色(实测 12 色)、顶行仅柱尖若干列不透明(柱尖补全)、底行全透明(入土缺口 1–7px 低频起伏);源文件=主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png`。 -🔴 门扇:沿用 240×211,不换件;运行时压扁到矩形 240×138,底压 y420;hotspot 240×147(贴图 138+9px 余量);门扇件底行中心区不透明(写卡时实查:底行局部 x99–143、全局 619–663 不透明,两侧为透明拱边),土线作用于底边中心可见区,两侧透明像素本就透出背景。 +🔴 门扇 hotspot 高 147=贴图 138+底部 9px 余量(沿用旧表「命中比贴图高 9」口径,属实现微决策,见 §9 代拍板)。门扇件不换件:现 240×211 由运行时压扁到矩形(用户 2026-11-07 裁「不动美术素材」;设计文档中「随门洞压扁重画」旧句已在本批改为运行时压扁口径)。 -🔴 **土线/入土线(围墙底+门扇底,2026-11-07 用户讨论定稿)**: - -- 目标读感:围墙底与门扇底都不与地面形成直边,边界按低频起伏裁切,裁切处透出背景层同列地面像素;门扇底不能单独露直边加灰影。 -- 实现形态:在 `CampSceneView` 内新增一个**土线裁切材质**(shader 字符串常量+一个私有应用函数),同时挂到 wall 层与 gate 层;不改 10 层结构、不新增图层、不新增运行时图片素材、不重画门扇件。 -- 裁切参数:底边基线 y420;起伏带**名义 9px**(基准顶线 411,即基线往上 9px);逐列顶线 `top = 411 + round(2 + 1.5*sin(gx/11.0) + 1.0*sin(gx/29.0+1.3))`,公式摆动后**实际顶线 410–416(裁切深度 4–10px)**;`round` 半值方向按引擎实现,机检容差 ±1;`y ≥ top` 的像素裁掉(透出背景);紧邻裁切口的**最后可见行 `y = top−1` 压暗 0.85**(1px 暗边;`top` 行已被裁掉,压暗它无意义)。 -- 全局坐标:`gx = UV.x * u_width + u_x_offset`(wall:offset 0、width 1280;gate:offset 520、width 240);`gy = u_y_offset + UV.y * u_height`(wall:220/200;gate:282/138)。不用 `FRAGCOORD`,避免视口缩放/黑边影响。gate 局部 x 经 offset 520 还原成画布全局 x,保证墙与门扇接缝处同一条边界。 -- 材质与状态:土线材质直接挂 wall/gate 节点的 `material`。gate 的 NORMAL/HOVER **不得把 `material` 置 null**;DISABLED **不得替换成 `_desat_mat`**——土线 shader 内含 `desat` 强度 uniform(默认 0),gate DISABLED 时置 1、NORMAL/HOVER 时置 0;forge/chest 仍走既有 `_desat_mat`。`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void` 以区分 gate;`_apply_state`/`_apply_hover` 的 `node.material = null` 对 gate 改为保留土线材质。wall 无状态切换,材质常驻。 -- 层序:视图子节点序=表序(bg 0、wall 1、board 2、gate 3、dummy 4、forge 5、tent 6、chest 7、notebook 8、campfire 9);设计 z 层为 wall z1、gate z3、其余物件 z4–z6(同 z 内按表序)。土线是 wall/gate 自身的材质,不新增节点/图层,**10 层不变**;其余物件绘制在 wall/gate 之后,土线不遮物件。 -- 悬停浮动:gate 既有 1–4px 整像素浮动沿用;土线裁切按节点基准矩形的 UV 计算,浮动时随节点整体移动(读作门扇抬起离土),验收截图取 NORMAL 态;浮动期 1–4px 离土读感不在本卡土线判据内。 -- 验收:营地截图在墙底与门扇底都能看到同一条起伏边界;边界不是贯通全宽的直线;裁切边界以下首行像素与背景层同列地面像素颜色距离 ≤ 容差,且与墙件不透明色集合的最小距离 > 容差(排除灰影/墙色);接缝 x519/521 的顶线差 ≤1px;门扇底无单独直边/灰影。 -- 素材与材质关系:围墙件底边 1–7px 缺口保留为素材属性(拉伸后约 1.2–8.5px);运行时土线材质按 4–10px 裁切;最终可见边界取两者**较深者(并集)**,两者都是低频起伏、方向一致,不冲突。 - -🔴 **最终墙件预览**:过审预览 `camp_new_layout_preview_c.png` 用的是候选墙 `wall_tipped_preview.png`;实现前必须用最终墙件(主区 artwork `scene_camp_wall_final.png`)重新生成预览(含土线裁切效果,裁切参数与 §3 同源),用户过目后才可开工。预览未过目=U0 未过,停。 - -🔴 背景:`scene_camp_bg.png` 1280×800(远景片+地面片拼接),接缝在围墙后;改素材后强制重导入。 +🔴 其余六件的 hotspot 由旧表相对关系同偏移得出(dummy 同贴图;forge y−46/高+46;chest y−46/x−12/宽+24;notebook y−14/高+14;campfire y−46/高 80;board 同贴图 y/高+19)——值已列上表,禁止再自拟。 ## 4. 范围边界 -做:§3 十层数据与视图、土线裁切材质与门扇状态材质保留、最终墙件预览、单测/结构探针/土线机检/camp golden/渲染闸、独立审计、实现报告与反哺点。 - -不做:重画背景;重画门扇/布告板/其余七件素材;新增第 11 层;新增运行时图片素材(golden 测试基线除外);把土线做成独立图层;直接改 `design/`、根规则文件、`待办清单.md`、`体验验证清单.md`、`game/tests/README.md`(实现批禁写;一律列反哺点);不改 `board_shot_probe.gd`(S11 已在当前基线修复,非本卡面)。 - -不收件去向:art-status-checklist 营地行 → 文档批反哺点;门扇底口径/240×147 与 138 口径 → doc-design(六件逐值已补录);待办条目状态 → 登记段(已补回);编入迭代 → 编排段;游戏内终审 → 用户(登记不阻塞);README 能力行代表用例 → 反哺点。 +做:上表十层数据、围墙件入包、单测新值钉断言(追加,不删旧断言)。 +不做:门扇/布告板/其余七件素材重出;背景层;土线改为独立代码层(入土效果落在围墙件缺口,零新代码);camp.md/art-bible/camp-scene-prompts 的进一步改写(归文档批)。 +不收件去向:art-status-checklist 营地行状态更新归文档批(反哺点);游戏内终审归用户(登记不阻塞)。 ## 5. 关联文档同步面 | 文档 | 关联点 | 同步义务 | |---|---|---| -| design/art/art-bible.md §6.2 :405 | 入土线条款只写围墙底;§3 要求门扇底同口径 | 实现批不直改;反哺点,文档批补一句“门扇底同口径” | -| design/art/camp-scene-prompts.md §5 第 12 条 :250 | 现写墙脚 1–7px;门扇底与最终墙件口径需补 | 反哺点,归文档批 | -| design/art/camp-scene-prompts.md §5 第 3 条 :241 vs §2.3 :114 | :241 写“显示矩形 240×147”,:114 写“门扇可见 y282–420(高 138)”;本卡口径=显示矩形 240×138、命中 240×147 | 反哺点,文档批统一口径 | -| design/art/camp-scene-prompts.md §5 第 6 条 :244+第 13 条 | 第 6 条只载“宝箱离底、其余上移 46px”关系句;六件逐值已由第 13 条补录 | 已闭合(2026-11-08 补录);实现批不直改设计文档 | -| design/ux/camp.md 第 29 行 | 现写围墙带/墙脚入土;门扇底土线需补 | 反哺点,归文档批 | -| design/art/art-status-checklist.md 营地行 | 需补“围墙件最终件 2026-11-07 换代+土线”事实 | 反哺点,归文档批 | -| game/tests/README.md:165 能力表 | 营地能力行代表用例需补 `check_soil_line`、`_test_gate_state_keeps_soil_cut`、camp golden | 实现批禁写;反哺点 | -| roadmap.md / 待办清单.md | 本卡编入迭代与状态推进 | 待办条目已补回(状态「已写卡」);编入迭代归编排段 | -| 体验验证清单.md | 游戏内终审登记项 | 归文档批/实现报告登记,实现批不直改 | - -## 5.5 文件结构图(T 卡分解依据) - -| 文件 | 职责 | 改动性质 | 验收对照表行 | 复用/新增 | -|---|---|---|---|---| -| `game/data/tables/camp_scene_layout.tres` | 十层 texture_rect/hotspot/表级值唯一数据源 | 行为改动(数据);T0/T1 核对,若已一致则零改动 | 1–3 | 复用既有 | -| `game/data/schemas/camp_scene_layout_table.gd` | 默认值/加载期校验 | 非行为(仅核对;默认值已一致) | 1(schema 前置) | 复用既有 | -| `game/presentation/views/camp_scene_view.gd` | 十层建层、`EXPAND_IGNORE_SIZE`、土线裁切材质、门扇状态材质保留 | 行为改动 | 4、6、7 | 复用既有(新增 1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整;不新增类变量) | -| `game/tests/unit/presentation/camp_scene_layout_test.gd` | V14 钉值+门扇状态土线保留单测 | 非行为(测试) | 1–3、7 | 复用既有(新增 1 个测试函数) | -| `tools/shot_checker.py` | 土线机检 `check_soil_line` | 非行为(闸机检) | 6 | 复用既有(新增 1 个函数) | -| `tools/render_gate.sh` | camp 全屏 golden 段 | 非行为(闸机检) | 8 | 复用既有(新增 1 段) | -| `tools/golden_baseline_refresh.sh` | `--camp` 冻结模式 | 非行为(闸机检) | 8 | 复用既有(新增 1 模式) | -| `game/tests/golden//camp.png` | camp 全屏逐像素基线 | 非行为(测试资产) | 8 | **新增**(测试基线;test-conventions:100 在册例外;运行时零新增图片) | -| `game/assets/art/scene/scene_camp_wall.png` | 围墙最终件 | 资产改动(运行时) | 5 | 复用既有(覆盖同名件) | -| `reports/实现报告-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 | -| `reports/反哺点-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 | -| `reports/验收审计-营地场景重排接线-<实现日期>.md` | 独立审计报告 | 非行为(报告) | — | 新增产出物 | -| `artwork/2026-11-07-营地接线预览/compose_preview.py` | 最终预览生成 | 非行为(工作区,不入 git) | —(U0 人审) | 复用既有(改墙源/土线) | +| design/art/art-bible.md §6.2 | 围墙显示矩形与墙脚入土线(已随设计批改到 v3.48) | 实现批不直改;若实现取此卡值时偏差则列反哺点 | +| design/art/camp-scene-prompts.md §2.3/§3/§5 | 坐标表(已随设计批改到 v1.9) | 同上 | +| design/ux/camp.md 第 29 行 | 围墙带 y220–420(已随设计批改) | 同上 | +| design/art/art-status-checklist.md 营地行 | 需补「围墙件 2026-11-07 换代」事实 | 反哺点,归文档批落文 | ## 6. 任务卡 -### T0 最终墙件预览+导入基线+开工扫描(≈0.25 天) +### T0 围墙件入包(≈0.25 工作日) -- 取用:无。产出:用户过目的最终预览、导入缓存基线、开工扫描记录。 -- [ ] 从主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/` 取 `scene_camp_wall_final.png`;把 `compose_preview.py` 的墙源改为该件;把“土线贴条”改为与 §3 同参数的裁切(wall+gate、`gx` 全局坐标、顶线公式、`top−1` 暗边),生成 `camp_new_layout_preview_final.png`。 -- [ ] 用户过目最终预览(U0);未过目停。 -- [ ] 跑 `Godot_console.exe --headless --path game --editor --quit` 强制重导入;核对 `scene_camp_bg/wall/gate` 的 `.ctex` mtime 与 `source_md5` 和源文件一致,记录读数。 -- [ ] 按 §1.3 做 T0 扫描:读 `.tres`、schema、view、素材、单测、设计文档、golden、静态扫描,逐项记录实查值与差异;扫描记录进实现报告草稿。 -- [ ] 跑 `python tools/palette_check.py game/assets/art --baseline game/tests/golden/palette_baseline` 与 `python tools/path_check.py --repo D:/code/g-plan2`(artwork 在主区,worktree 无副本),核源/包 md5 一致;记录读数;预览文件不入 git(artwork 工作区)。 +- 取用:无。产出:`game/assets/art/scene/scene_camp_wall.png`(覆盖)。 +- [ ] 从主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 拷入 → 核对尺寸 1280×164、模式 RGBA +- [ ] 建隔离基线目录并跑色板闸:`mkdir -p /tmp/wall_base /tmp/wall_only && cp game/assets/art/scene/scene_camp_{board,gate,dummy,forge,tent,chest,notebook,campfire}.png /tmp/wall_base/ && cp game/assets/art/scene/scene_camp_wall.png /tmp/wall_only/ && python tools/palette_check.py /tmp/wall_only --baseline /tmp/wall_base` → 围墙零新增色(八件基线) +- [ ] 跑 `python tools/path_check.py` → 0 问题(worktree 缺 `artwork/mockups` 时该项 SKIP/FAIL 属环境坑:以主检出 `--repo` 口径复核) -### T1 十层布局与视图(≈0.25 天) +### T1 布局表换代(≈0.25 工作日) -- 取用:T0 的扫描基线。产出:与 §3 逐字一致的 `.tres`/schema/视图。 -- [ ] 按 §3 表逐层核对 `camp_scene_layout.tres` 的 texture_rect/hotspot/hotspot_key、`wall_band`、`gate_gap`;不一致的按表改,已一致的保留并记录“已对”。 -- [ ] 核对 `camp_scene_layout_table.gd:9` 默认 `wall_band=(0,220,1280,200)` 与注释。 -- [ ] 核对 `camp_scene_view.gd:136` 的 `TextureRect.EXPAND_IGNORE_SIZE`+`STRETCH_SCALE`;确认门扇节点高 138。 -- [ ] 跑 `Godot_console.exe --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑 `Godot_console.exe --headless --path game res://probe/ui_struct_probe.tscn` → PASS。 -- 产出:布局/视图一致;两条读数。 +- 取用:T0 的素材。产出:`game/data/tables/camp_scene_layout.tres`(十层+表级值)。 +- [ ] 按 §3 表逐字改十层 texture_rect/hotspot 与 wall_band → 跑 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(加载期 validate+钉值+关系谓词全绿,exit 0) +- [ ] `_build_layer_node` 的 TextureRect 加 `expand_mode = EXPAND_IGNORE_SIZE`(否则门扇节点被贴图最小高 211 夹住、矩形 138 不生效)→ 场景探针 ui_struct_probe camp V1 转绿 -### T2 土线(围墙底+门扇底)+机检+camp golden(≈0.5 天) +### T2 新值钉断言+收口(≈0.25 工作日) -- 取用:T1 的 view。产出:土线材质+土线机检+camp golden+营地截图读数。 -- [ ] 在 `camp_scene_view.gd` 新增 `_SOIL_CUT_SHADER_SRC`(字符串常量)与 `_apply_soil_cut(node: TextureRect, x_offset: float, rect_w: float, y_offset: float, rect_h: float) -> void`;按 §3 的参数裁 wall/gate 底边;`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void`,gate 走 `desat` uniform、NORMAL/HOVER 保留土线材质;不新增文件、不新增图层、不新增运行时素材、不新增类变量。 -- [ ] 在 `camp_scene_layout_test.gd` 新增 `_test_gate_state_keeps_soil_cut` 并接入 `_run_all`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化;跑单测 → exit 0。 -- [ ] 在 `tools/shot_checker.py` 新增 `check_soil_line(img: Image.Image, failures: list) -> None`,在 `main()` 处理 `shot_camp.png` 时调用;对墙底与门扇底取样:按截图宽高与设计基准 1280×800 的比例换算坐标(禁写死 1280/420);墙底取可见段(避开帐篷/门扇覆盖),门扇底取底行不透明中心区(写卡时实查全局 x619–663);断言顶线 410–416、≥3 个不同顶线值、接缝 x519/521 差 ≤1px、边界下首行对 `scene_camp_bg.png` 同列颜色距离 ≤ 容差且非墙色、`top−1` 暗边、gate 底无直边/灰影;失败写入 failures。 -- [ ] 窗口化跑 `Godot_console.exe --path game --quit-after 3000 res://probe/shot_probe.tscn -- <截图目录>` 产出营地截图;跑 `python tools/shot_checker.py <截图目录> shot_camp.png` → PASS。 -- [ ] 在 `tools/golden_baseline_refresh.sh` 增 `--camp` 模式(`shot_probe` 截图 → `game/tests/golden//camp.png`);用户对照最终预览确认 `shot_camp.png` 后跑 `bash tools/golden_baseline_refresh.sh --camp` 冻结;未确认不得冻结。 -- [ ] 在 `tools/render_gate.sh` 菜单 golden 段后增加 camp 全屏 golden 段(比对 `camp.png`,容差沿用脚本头注释口径);跑 `bash tools/render_gate.sh game` → 全绿。 -- [ ] 记录营地截图的 std/colors/eff 与土线断言读数。 - -### T3 全量验证与独立审计(≈0.5 天) - -- 取用:T2 的土线+机检+camp golden。产出:代码域全绿、独立审计报告、CI 读数。 -- [ ] 改素材后再次强制重导入;跑 `bash tools/run_all_gates.sh --code` → 冒烟/系统/单元 4 分片/探针/渲染/色板/静态扫描全绿;静态扫描零新增红(S11 已在基线修复)。 -- [ ] 独立验收审计:未参与实现的会话或子代理按本卡 §7 逐行核;发现按四类分流处置;报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。 -- [ ] 游戏内终审登记到实现报告实机目检总清单(用户自排,不阻塞)。 -- [ ] 合并后按需 `tools/ci_check.sh <合并提交>` 现查;绿必须坐实“跑闸”步真跑过;clone 失败不算绿。 - -### T4 收口产出物+最终完成进度扫描(≈0.25 天) - -- 取用:T0–T3 全部读数。产出:实现报告、反哺点清单、最终扫描记录。 -- [ ] 写 `reports/实现报告-营地场景重排接线-<实现日期>.md`:各卡状态、实机目检总清单、遗留读数义务、实现决定记录;**内含 §1.3 的 T4 完成进度扫描记录**。 -- [ ] 写 `reports/反哺点-营地场景重排接线-<实现日期>.md`:§5 每条同步面都有落点;art-status-checklist、README 能力行、体验验证清单按实况列。 -- [ ] 按 §1.3 做 T4 扫描:逐项实查;缺项/偏差列清单;未闭合不得宣称完成。 -- [ ] 提交与合并前向用户请示;未获指令不得 commit/merge。 +- 取用:T1 的表。产出:`game/tests/unit/presentation/camp_scene_layout_test.gd`(追加断言);`reports/iter-实现报告-2026-11-07.md`;`reports/iter-反哺点-2026-11-07.md`。 +- [ ] 在 `_test_layout_hotspot_geometry` 追加:wall/gate/board/wall_band 四条钉值(已在本批落笔);六件落位钉值一条(逐层 Rect2 比对) +- [ ] 跑 `python tools/run_smoke.py` → exit 0;跑营地套件 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑场景探针 `…console.exe --headless --path . res://probe/shot_probe.tscn` + `python tools/shot_checker.py <截图目录>` → A 段 PASS +- [ ] 写实现报告(各卡状态+目检清单+决定记录)与反哺点清单(§5 四条逐条落点) ## 7. 验证闸(改动—验收对照表) | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| -| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | `camp_scene_layout.tres` wall | V14 围墙矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | `.tres` gate/board | V14 门扇/告示板矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244+§5 第 13 条) | `.tres` 六件 | V14 六件落位钉值+几何红线(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | `camp_scene_view.gd` `EXPAND_IGNORE_SIZE` | `ui_struct_probe` camp V1 层贴图矩形(`ui_struct_probe.gd:_ready` camp 段) | 探针 | `res://probe/ui_struct_probe.tscn` | 节点 position/size | 既有:营地场景图十层铺底与门洞留空呈现 | -| 围墙最终件(判据出处 design/art/art-bible.md:404) | `scene_camp_wall.png` | T0 `palette_check`/`path_check`+最终墙预览过目 | 资产 | 文件读数+用户过目 | 尺寸 1280×164、不透明 12 色、柱尖/奶油描边/底缺口、源包 md5 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 土线覆盖围墙底+门扇底(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` 土线裁切材质挂 wall/gate | `shot_checker.py:check_soil_line(img, failures)`+`shot_camp.png`:顶线 410–416、≥3 个不同顶线值、接缝差≤1px、边界下首行对背景同列颜色距离≤容差且非墙色、`top−1` 暗边、gate 底无直边/灰影 | 探针 | `shot_probe` 营地窗口化截图 | 截图像素:边界行/颜色距离/暗边亮度 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 门扇状态切换保留土线(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` `_apply_state`/`_apply_hover`/`_apply_disabled` | `camp_scene_layout_test.gd:_test_gate_state_keeps_soil_cut`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化 | 单元 | `camp_scene_view.gd` 真实类+`camp_scene_layout.tres` | `gate.material` 引用+shader uniform 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 营地屏渲染不回归+golden(判据出处 design/engineering/test-conventions.md:100) | 十层+土线整体;`tools/render_gate.sh` camp 段;`game/tests/golden//camp.png` | `render_gate.sh` 七屏+A-D+土线机检+camp golden 逐像素 | 探针 | `bash tools/render_gate.sh game` | 截图色彩/骨架/土线/camp.png 逐像素 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | camp_scene_layout.tres wall | V14 围墙矩形钉值(camp_scene_layout_test.gd `_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | .tres gate/board | V14 门板矩形钉值 | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244) | .tres 六件 | V14 六件落位钉值+七命中区几何红线(validate+不相交+不越界) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | camp_scene_view.gd `_build_layer_node` 加 `EXPAND_IGNORE_SIZE` | 场景探针 ui_struct_probe camp V1「层贴图矩形≠layout 表」 | 探针 | `res://probe/ui_struct_probe.tscn`(camp 段) | 节点 position/size 逐值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 围墙件换代(判据出处 design/art/art-bible.md:212) | scene_camp_wall.png | T0 `palette_check`/`path_check` | 资产 | 文件读数 | 色数 12、零新增色 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 墙脚入土(判据出处 design/art/art-bible.md:396) | 围墙件底行 | 目检(游戏内终审,登记式) | 目检 | 营地屏 | 墙底无贯通直线 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 营地屏铺底不回归(判据出处 design/ux/camp.md:29) | 十层矩形整体 | 场景探针 `shot_probe` camp 截图+`shot_checker` A 段(角色/面板骨架不回归) | 探针 | `--headless --path . res://probe/shot_probe.tscn` | 截图色彩数/骨架 | 既有:营地场景图十层铺底与门洞留空呈现 | -注:未删改 V14 旧断言;新增钉值、门扇状态土线保留单测、土线机检与 camp golden 属追加。测试削弱申报:无。 +注:未删改任何旧断言;新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位),测试削弱申报:无。 -**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。 +**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/iter-验收审计-2026-11-07.md`;未过不得合并。 ## 8. 异常分级 -- L1 自救:导入缓存/格式类异常自行重跑重导入。 -- L2 记录继续:非本卡面的存量红记录归属;若挡住代码域全绿,停在该红上,不修别批文件。当前基线 S11 已清零;若 T3 复跑出现新红,按红账不清不开新批处置。 -- L3 停机呈报:表值与 §3 冲突、schema fail-fast、最终墙预览未过目、土线机检失败、camp golden 未获用户确认即冻结、独立审计未过、CI 红、gdstyle/预算互斥——停卡写报告等用户;机检预算互斥=上游缺陷,退回写卡段。 +L1 自救:格式/导入缓存类异常自行重跑。L2 记录继续:非本卡面的既有红记录进报告。L3 停机:表值触 schema fail-fast 或与 §3 冲突=停卡呈报(上游缺陷退写卡段);素材缺位=停卡(不得用旧 49px 墙凑合)。 ## 9. 代拍板白名单 -- 门扇 hotspot 高 147、六件 hotspot 平移口径(§3 已定值)。 -- 土线 shader 的内部结构、uniform/material 命名;土线机检的取样窗口、颜色距离容差、暗边阈值;camp golden 的比对容差沿用 `render_gate.sh` 现行口径(但起伏带名义 9px/顶线 410–416、`top−1` 0.85 暗边、顶部函数为锁定值)。 -- 新测试函数命名与所在行:`check_soil_line(img: Image.Image, failures: list) -> None`、`_test_gate_state_keeps_soil_cut`(以本卡 §7 为准,实现照单落名)。 -- 超出=记实现报告“实现决定记录”。 +门扇 hotspot 高 147(贴图 138+9 余量);七件 hotspot 的平移口径(§3 已列值);T2 钉值断言的命名与位置(同套件内追加)。超出=记实现报告「实现决定记录」。 ## 10. 待裁点 -零待裁点。上游缺口已闭合(设计文档六件逐值补录于 `camp-scene-prompts.md` v1.10 §5 第 13 条;待办清单条目已补回,状态「已写卡」)。开工门=U0:最终墙件预览用户过目;提交/合并须用户发令。 +零待裁点(用户已裁:墙 220/200、门板跟随、入土线;2026-11-07)。开工门=U0。 ## 11. 落位与可复用性预检 -- 土线裁切:新增 1 个 shader 字符串常量+1 个私有应用函数+`_apply_disabled` 签名调整;落 `camp_scene_view.gd`;盘上无同类土线 shader(`_DESAT_SHADER_SRC` 是禁用态去饱和,职责不同,不能复用);wall/gate 共用同一 wave 函数,唯一落点在该文件;不新增文件、不新增图层、不新增运行时素材;土线材质挂节点 `material`,不新增类变量。 -- 土线机检:在 `tools/shot_checker.py` 新增 1 个函数,复用现有 PIL 读图与 `main()` 循环;不新增脚本文件;对 `shot_camp.png` 调用。 -- camp golden:新增 1 张测试基线 `game/tests/golden//camp.png`(test-conventions:100 在册例外);`tools/golden_baseline_refresh.sh` 增 `--camp` 模式、`tools/render_gate.sh` 增 camp 段,均不新增脚本。 -- 预览:只改 `artwork/` 工作区 `compose_preview.py`(不入 git),不改游戏素材;最终预览是用户过目件,不是运行时资产。 -- 数据/素材:无新增运行时数据件、无新增运行时图片;十层结构不变;墙件覆盖同名件。 +本批零新增代码文件、零新增函数:改既有 `camp_scene_layout.tres`(数据行唯一落点)、既有单测追加断言、覆盖既有 `scene_camp_wall.png`(消费名不变,`UiKit.TEX_CAMP_WALL`);另产出两份 `reports/` 过程件(实现报告、反哺点清单)。复用面:视图/装载/校验链现成(camp_scene_view.gd、schema.validate、camp_scene_layout_test.gd),不新增渲染件。唯一面:坐标只落表一处,视图/探针/单测均读表。 ## 12. 实现规范预算 -- `camp_scene_view.gd` 存量触面:`tools/gdstyle_baseline.txt` 无本文件登记键(实查零命中);按默认阈值 20/15 自查:公开方法 4/20、类变量 13/15;新增面=1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整,**不新增类变量**;改后 4/20、13/15;超预算=停卡。 -- `tools/shot_checker.py` 新增 1 个函数,不新增文件;无 gdstyle 约束。 -- `tools/render_gate.sh`/`tools/golden_baseline_refresh.sh` 各增 1 段/1 模式,不新增文件;无 gdstyle 约束。 -- 零新增 `.gd` 文件、零新增 `.tscn`、零新增运行时资源;shader 以字符串常量存在,不新增 `.gdshader`;唯一新增入库件=`game/tests/golden//camp.png`(测试基线,test-conventions:100 在册例外)。 +零新增文件、零新增方法 → gdstyle 阈值面无新增;存量触面:camp_scene_layout_test.gd 追加一段断言(方法数不变、成员数不变)。 ## 13. 复核记录 -> 第 1 轮=写卡人自审(非独立);第 2 轮=独立只读子代理复核(未参与本卡撰写,2026-11-08,17 条发现、零待裁);第 3 轮=复核处置中自审。17 条已全部处置:15 条就地改卡,2 条退回上游后经用户 2026-11-08 授权闭合(设计文档六件逐值补录、待办条目补回)。复核证据(文件/行锚/实跑命令)已并入 §2、§5、§7 与本节各条;复核报告文件按用户 2026-11-08 裁清理,不提交、不合回。**卡片达到成立判据;编入迭代/开工/提交/合并仍须用户发令。** - | 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 | |---|---|---|---|---| -| 1 | 写卡人自审(非独立) | 旧方案把土线限定为“围墙件缺口、零新代码”,会丢掉门扇底土线 | 补写 | 本卡 §3 改为 wall+gate 共用土线裁切材质;10 层不变;不新增素材 | -| 1 | 同上 | 过审预览用候选墙,最终墙件未单独过目 | 补写 | 本卡 §3/T0 增加最终墙预览用户过目(U0) | -| 1 | 同上 | 渲染闸 A-D 不覆盖土线像素,旧完成定义只写单测/冒烟 | 补写 | 本卡 §1.2/§7/T2 增加土线机检与渲染闸 | -| 1 | 同上 | 旧导入缓存会让渲染闸拿旧素材,绿读数无效 | 补写 | 本卡 §2/§6 T0/T3 增加强制重导入与 source_md5 核对 | -| 1 | 同上 | 独立审计、游戏内终审、art-status-checklist 未进完成定义 | 补写 | 本卡 §1.2/§5/§6 T3/T4 补齐 | -| 1 | 同上 | 待办清单已无本条目,卡片来源悬空 | 退回上游 | 头部记登记缺口;§10 开工门;编入迭代前由登记段补回 | -| 1 | 同上 | 写卡时曾见外部 S11 红(board_shot_probe「雷格」),会挡住代码域全绿 | 自判 | 实查当前基线 89f4fc78 已修复为「危险格」,`static_scan.sh` S11 ok;本卡去除该开工门,T3 复跑确认零新增红 | -| 1 | 同上 | 10 层结构不能新增图层,土线必须挂在既有 wall/gate 层 | 自判 | 本卡 §3/§11 采用裁切材质挂 wall/gate,不新增第 11 层 | -| 2 | 独立只读子代理(未参与本卡撰写) | §7 art-bible 锚 `:395/:396` 实为 `:404/:405` | 自判 | 已改 §7 行 5/6 锚为 `:404/:405` | -| 2 | 同上 | 六件逐值未载于设计文档(`prompts:244` 仅关系句;`grep design/` 零命中) | 退回上游(已闭合) | 用户 2026-11-08 授权补录:`camp-scene-prompts.md` v1.10 §5 第 13 条载六件逐值;头部/§5/§7/§10 同步 | -| 2 | 同上 | 顶部公式实际 410–416(裁 4–10px),与“9px 带”表述矛盾 | 自判 | §3 改为“名义 9px(基准顶线 411)+实际 410–416”;§9 同步 | -| 2 | 同上 | “y≥top 裁掉”与“top 行压暗”互斥(被裁行不可见) | 自判 | §3 改为“最后可见行 `top−1` 压暗 0.85” | -| 2 | 同上 | “其余物件 z4–z6”与视图子节点 0–9 混淆 | 自判 | §3 写明视图子节点序 0–9+设计 z 层 wall1/gate3/其余 z4–z6 | -| 2 | 同上 | 单一材质无法处理 gate 局部 x 的 +520 偏移 | 补写 | §3 钉 `gx=UV.x*u_width+u_x_offset`(wall 0/1280;gate 520/240) | -| 2 | 同上 | gate NORMAL 置 null、DISABLED 换 `_desat_mat` 会抹掉土线 | 补写 | §3 钉土线材质常驻+`desat` uniform;§7 增行 7;新增单测 `_test_gate_state_keeps_soil_cut` | -| 2 | 同上 | 缺 camp golden(`test-conventions.md:100`) | 补写 | §1.2/§6 T2/T3/§7 行 8/§11/§12 增 camp golden;`render_gate.sh`+`golden_baseline_refresh.sh --camp` | -| 2 | 同上 | 土线机检写死 1280 且“同源”判据循环 | 补写 | §6 T2 改为按截图宽高比例取样;对 `scene_camp_bg.png` 同列颜色距离+非墙色;容差归白名单 | -| 2 | 同上 | 缺文件结构图 | 补写 | 增 §5.5 文件结构图 | -| 2 | 同上 | 测试函数名未钉(“或等价函数”、§9 循环) | 补写 | 钉 `check_soil_line(img: Image.Image, failures: list) -> None`+`_test_gate_state_keeps_soil_cut`;§7/§9 同步 | -| 2 | 同上 | §2 行锚错:schema `:67`→`:59–:62`、view `:133`→`:130`、test `:82`→`:26` | 自判 | 已改 | -| 2 | 同上 | §12 写 S13 键,但 `camp_scene_view.gd` 无登记键 | 自判 | §12 改为“无登记键;默认 20/15;现状公开方法 4、类变量 13;不新增类变量” | -| 2 | 同上 | 外部 S11 已不成立(`board_shot_probe` 现为「危险格」) | 自判 | §1.2/§2/§4/§8/§10/§13 去除 S11 红;T3 静态扫描零新增红 | -| 2 | 同上 | `prompts` §5 第 3 条 `:241` 240×147 与 §2.3 `:114` 138 矛盾未列同步面 | 补写 | §5 增行;本卡口径=显示 240×138、命中 240×147 | -| 2 | 同上 | §13 无独立复核记录 | 补写 | 本节增 17 行+复核报告路径 | -| 2 | 同上 | 待办清单无本条目 | 退回上游(已闭合) | 用户 2026-11-08 授权补回:`待办清单.md` 条目状态「已写卡」;头部/§5/§10 同步 | -| 3 | 写卡人自审(复核处置中,非独立) | 原文写“门扇件底行 alpha 全 255”,实查底行仅局部 x99–143 不透明、两侧 195px 透明,表述失真 | 自判 | §3 改为“底行中心区不透明+两侧透明拱边”;T2 门扇取样窗口钉全局 x619–663 | +| 1 | 前台只读复核子代理(未参与撰写) | 七件/六件计数不一(§1/§3/§7) | 补写 | 统一为六件(dummy/forge/tent/chest/notebook/campfire) | +| 1 | 同上 | 六件新值未钉,V14 只证互斥/边界 | 补写 | T2 增六件落位钉值断言,本批已落(PASS 实测) | +| 1 | 同上 | T2 单元套件无真实入口命令 | 补写 | 改为 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` | +| 1 | 同上 | T1 `python -c` 不能读 .tres;`db.load_tables` 无命令入口 | 补写 | T1 改为直跑该单测(加载期 validate+钉值) | +| 1 | 同上 | T0 基线写占位目录;扫全 scene 会带 stage 件红 | 补写 | 写入临时隔离基线命令(八件拷贝)与限定扫描面;path_check 环境坑注明 | +| 1 | 同上 | prompts §5 第 9 条布告板旧值 (845,224) | 退回上游 | 文档区已修:(845,241,130,121),底 362 落在墙内 | +| 1 | 同上 | art-bible §6.2 门扇旧句「贴图 240×138 随门洞压扁重画、y283–367」 | 退回上游 | 文档区已修:运行时压扁、底压 y420 | +| 1 | 同上 | prompts §2.3 门洞 y282–420 与在包墙件全高缺口不相符 | 退回上游 | 文档区已修:墙件缺口全高 220–420、门扇可见 282–420 | +| 1 | 同上 | art-bible:395 不含色数判据 | 补写 | 锚改 art-bible.md:212(营地子板色数行) | +| 1 | 同上 | §13 复核报告文件行违反 2026-11-06 裁(凭据=本节) | 自判 | 删除该行 | +| 1 | 同上 | 门扇「重画 138」vs 运行时压扁,§10 零待裁是否成立 | 自判 | 用户 2026-11-07 明裁「不需要动任何美术素材」,运行时压扁即终稿;§10 零待裁成立 | +| 2 | 后台只读复核子代理(未参与撰写) | schema 默认 `wall_band=(0,240,1280,70)` 与注释仍旧值 | 补写 | schema 默认改 (0,220,1280,200)+注释同步 | +| 2 | 同上 | §7「未新增/删除任何断言」措辞与 +5 条钉值矛盾 | 补写 | 改为「未删改旧断言,新增 5 条钉值断言」 | +| 2 | 同上 | test.gd 头注「禁坐标字面量」与新钉值冲突 | 补写 | 头注改为「关系谓词为主+重排钉值」,钉值前加 `# oracle:` 行锚 | + diff --git a/roadmap.md b/roadmap.md index 72e347da..64af57a7 100644 --- a/roadmap.md +++ b/roadmap.md @@ -6,7 +6,7 @@ - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 - **迭代位**:迭代 1–55 已完成。迭代 56 已编待开工(结算期文字列表退役+封印动作改版两卡)。各迭代收口与批后收尾沿革查 git 提交信息与 `reports/`。 -- **下一步**:发令开工 56(≈12.25 日,两卡:结算期文字退役先行+封印改版);待编池:效果通道与事件词零现役普查(唯一遗留待裁=秘宝表 schema 旧词面 9 词收尾)、结算明细文案入表(待文档设计)、棋盘瓦片与立体表现重做(已写卡,待编排)、测试面真输入化批发现四项待裁(待执行);EC8 热重载实装待用户另立条目。 +- **下一步**:发令开工 56(≈12.25 日,两卡:结算期文字退役先行+封印改版);待编池:效果通道与事件词零现役普查(唯一遗留待裁=秘宝表 schema 旧词面 9 词收尾)、结算明细文案入表(待文档设计)、二三关棋盘观感(待设计+待美术)、测试面真输入化批发现四项待裁(待执行);EC8 热重载实装待用户另立条目。 ## 里程碑时间线 @@ -90,7 +90,6 @@ | 迭代 54 | 已完成(2026-11-07) | 已退役(git 历史可考) | 2026-11-07 | ≈8.625 个工作日 | 已退役(git 历史可考) | | 迭代 55 | 已完成(2026-11-07) | 已退役(git 历史可考) | 2026-11-07 | ≈8.75 个工作日 | 已退役(git 历史可考) | | 迭代 56 | 待开工 | reports/需求卡片-结算期文字列表退役批-2026-11-07.md
reports/需求卡片-封印动作改版批-2026-11-07.md | 2026-11-07 | ≈12.25 个工作日〔用户特批 2026-11-07 超 10 个工作日〕 | — | -| 迭代 57 | 待开工 | reports/需求卡片-营地场景重排接线-2026-11-07.md
reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md | 2026-11-08 | ≈11.25 个工作日〔用户特批 2026-11-08 超 10 个工作日〕 | — | - 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。 - 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。 diff --git a/sim-data/README.md b/sim-data/README.md index 7c92bbde..4569f08b 100644 --- a/sim-data/README.md +++ b/sim-data/README.md @@ -19,7 +19,7 @@ | 档 | 用途(唯一触发面) | 局数上限 | 单次耗时 | 判读力(能下什么结论) | |---|---|---|---|---| -| 一档·调研 | 调研/数值分析 | 总量 >40(100 为常用锚量级);N 按分析方案两选一:50=95% CI ±13.9pp / 100=95% CI ±9.8pp | 8–16 分钟 | 带值判定/CI 结论仅本档可下;≥60 局须 N=5 pilot 前置 | +| 一档·调研 | 调研/数值分析 | 总量 >40(100+ 为常用锚量级);N 按分析方案:60/档=结构回归(80% 功效 ≥25pp)/ 100=95% CI ±9.8pp / 170=±7.5pp(15pp 带半宽)/ 400 满档=±4.9pp 贴边裁决(normal 独立满档 ~8 分钟同属一档) | 16–65 分钟 | 带值判定/CI 结论仅本档可下;≥60 局须 N=5 pilot 前置 | | 二档·验证 | 数值修改后回归验证 | 总量 ≤40(每档 ≤20) | ~3.2 分钟 | 结构性大位移可判(≥~40pp;改前/改后同种子配对下 ~30pp)——带值判读不在本档 | | 三档·小调 | 小调整后快检 | 总量 ≤20(每档 ≤10) | ~1.6 分钟 | 只测不判——仅灾难级破坏(通关率腰斩级)可判 | | 四档·微量 | 微调后确认没大问题 | 总量 ≤5 | <1 分钟 | 零统计判读——通过判据=不崩+RUNSUM 字段完整+方向不反直觉 | diff --git a/tools/analyze_parity_check.py b/tools/analyze_parity_check.py new file mode 100644 index 00000000..e4946559 --- /dev/null +++ b/tools/analyze_parity_check.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""判读等价对拍工具(结算期文字列表退役批 R4 载体——日志零文案改后分析判读逐位一致)。 + +用法: + python tools/analyze_parity_check.py <输入A> <输入B> [<输入C> ...] [--runs N] + +输入 = 日志(.jsonl,各跑一次 tools/analyze_playtest.py 完整判读)或基线快照 +(.md,analyze_playtest.py 输出重定向落盘的静态文本,直读不重跑)。全部剥去文件名 +标题行后相邻逐位 diff——任一对不一致即 exit 1 并打印第一条分歧行。 + +三读数跑法(改前改后配对,卡 R4): + ① 历史锚日志 vs 改前 T0 基线快照(兼容分支等价) + ② 改前同种子日志 vs 改前 T0 基线快照(复现等价) + ③ 改前同种子日志 vs 改后同种子新日志(同种子+玩法零改动=事件流逐位同) + +退出码: 0=全部逐位一致 1=判读分歧 2=参数/执行错误 +""" +import subprocess +import sys +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ANALYZE = HERE / "analyze_playtest.py" + + +def run_analyze(log_path: str, runs: str) -> str: + cmd = [sys.executable, str(ANALYZE), log_path] + if runs: + cmd += [runs] + proc = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8") + if proc.returncode != 0: + print("[parity] 判读执行失败(%s)exit=%d" % (log_path, proc.returncode)) + print(proc.stdout[-2000:]) + print(proc.stderr[-2000:]) + sys.exit(2) + # 剥文件名标题行(playtest_*.jsonl 文件名随输入变,不参与逐位比对) + return strip_name_lines(proc.stdout) + + +def strip_name_lines(text: str) -> str: + out_lines = [] + for ln in text.splitlines(): + if "playtest_" in ln and ".jsonl" in ln: + continue + out_lines.append(ln) + return "\n".join(out_lines) + + +def first_diff(a: str, b: str): + la, lb = a.splitlines(), b.splitlines() + for i in range(max(len(la), len(lb))): + xa = la[i] if i < len(la) else "<缺行>" + xb = lb[i] if i < len(lb) else "<缺行>" + if xa != xb: + return i + 1, xa, xb + return None + + +def main(): + args = sys.argv[1:] + runs = "" + if "--runs" in args: + i = args.index("--runs") + runs = args[i + 1] + args = args[:i] + args[i + 2:] + if len(args) < 2: + print(__doc__) + sys.exit(2) + outputs = [] + for p in args: + if p.lower().endswith(".jsonl"): + outputs.append(run_analyze(p, runs)) + else: # 基线快照(.md)——静态文本直读,剥名规则同判读输出 + outputs.append(strip_name_lines(Path(p).read_text(encoding="utf-8"))) + ok = True + for i in range(1, len(outputs)): + d = first_diff(outputs[i - 1], outputs[i]) + pair = "%s <-> %s" % (Path(args[i - 1]).name, Path(args[i]).name) + if d is None: + print("[parity] 一致 | %s | 判读逐位一致" % pair) + else: + ln, xa, xb = d + print("[parity] 分歧 | %s | 第 %d 行" % (pair, ln)) + print(" A: %s" % xa) + print(" B: %s" % xb) + ok = False + sys.exit(0 if ok else 1) + + +if __name__ == "__main__": + main() diff --git a/tools/analyze_playtest.py b/tools/analyze_playtest.py index 524c8e47..72ba188c 100644 --- a/tools/analyze_playtest.py +++ b/tools/analyze_playtest.py @@ -186,7 +186,7 @@ def analyze_run_core(rows, meta): if cur_b is not None: cur_b["hero_dmg"] += v elif src in ("safe_cell", "clear_reward", "flag_hit") or ( - src == "mine_hit" and "全体敌人" in r.get("text", "")): + src == "mine_hit" and r.get("target") == "all_enemies"): out["reward_dmg"] += v out["rewards_n"] += 1 name = "清障炸药" if src == "clear_reward" else "群伤" @@ -431,7 +431,7 @@ def analyze(rows, label): cf_n = int(round(n * 100.0 / (100 + up))) rowout["cf_hero"] += cf_n elif src in ("safe_cell", "clear_reward", "flag_hit") or ( - src == "mine_hit" and "全体敌人" in s.get("text", "")): + src == "mine_hit" and s.get("target") == "all_enemies"): # 奖励伤害 = 打敌人的棋盘来源伤害;踩雷负向打主角的(反噬震荡)归承伤侧 rowout["rw"] += int(s["value"]) rowout["pos_n"] += 1 @@ -468,17 +468,32 @@ def analyze(rows, label): rowout["cf_tr"] += cf_norw for s in steps: if s["type"] == "reward_ineffective": - txt = s.get("text", "") - if "满层" in txt: + # 结构化 reason 优先(日志零文案批——四类枚举 full_layers/full_hp/ + # no_enemy_alive/hero_down);text 子串兜底 = 旧日志兼容分支(改前日志 + # 无 reason 键——判读等价两腿各走各分支,结论逐位一致) + reason = s.get("reason", "") + if reason == "full_layers": key = "增益满层" - elif "满血" in txt: + elif reason == "full_hp": key = "回血满血" - elif "无存活敌人" in txt: + elif reason == "no_enemy_alive": key = "无存活敌人" - elif "主角已倒下" in txt: + elif reason == "hero_down": key = "主角已倒下" - else: + elif reason: key = "其他" + else: + txt = s.get("text", "") + if "满层" in txt: + key = "增益满层" + elif "满血" in txt: + key = "回血满血" + elif "无存活敌人" in txt: + key = "无存活敌人" + elif "主角已倒下" in txt: + key = "主角已倒下" + else: + key = "其他" rowout["ineff_counts"][key] = rowout["ineff_counts"].get(key, 0) + 1 bstat["hero_dmg"] += rowout["hero"] bstat["reward_dmg"] += rowout["rw"] diff --git a/tools/gate_platform.sh b/tools/gate_platform.sh index 15ae5f70..8847cae3 100644 --- a/tools/gate_platform.sh +++ b/tools/gate_platform.sh @@ -20,8 +20,6 @@ gate_game_path() { # 杀整棵进程树()——递归杀子进程后杀本进程。macOS/Linux 走 pgrep -P; # Windows 侧 MSYS kill 对其可见进程有效,带 wrapper 树的场景仍由调用方原 taskkill /T 逻辑负责。 -# 注意:Windows Git Bash 实测无 pgrep/pkill(2026-11-08 修复批)——本函数在 Windows 退化成只杀 -# 顶格进程,引擎子进程残留由调用方段末 kill_orphans 清场兜底(probe_gate/render_gate 均有段后清点)。 gate_kill_tree() { local p c kill -9 "$1" 2>/dev/null @@ -31,36 +29,26 @@ gate_kill_tree() { # 带超时执行(coreutils timeout 的纯 bash 替代,双平台同语义): # gate_run_timeout <秒> <日志路径> <命令...> # 命令输出重定向到日志;退出码=命令退出码,超时=124(与 coreutils 语义一致,判据与既有闸一致)。 -# 实现=后台启动+守卫轮询(守卫每 0.2 秒醒一次,看两样:停止文件在不在/到点没; -# 命令先完时父流程放停止文件,守卫看见即自己退场——没有嵌套长 sleep,从机制上无孤儿可留; -# 2026-11-08 修复批:旧版 mktemp 建标志文件「建时即真」致退出码恒 124+守卫被杀留孤儿 sleep -# 占输出管道至满档);到点未见停止文件=真超时:落标志文件+杀整树+回 124。 +# 实现=后台启动+守卫落标志文件(probe_gate run_suite 同款手法:taskkill 强杀后 wait 报 0 的 +# 假绿以标志文件纠偏);超时先杀整树再回 124。 gate_run_timeout() { local t="$1" log="$2"; shift 2 - local kf stop - kf="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.kf" # 只赋路径、不建文件——建时即真=旧缺陷病根(probe_gate run_suite 同款) - stop="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.stop" - rm -f "$kf" "$stop" + local kf + kf="$(mktemp "${TMPDIR:-/tmp}/gatetime_XXXXXX")" "$@" >"$log" 2>&1 & local pid=$! - ( end=$((SECONDS+t)) - until [ -f "$stop" ] || [ "$SECONDS" -ge "$end" ]; do - sleep 0.2 2>/dev/null || sleep 1 - done - if [ ! -f "$stop" ]; then - touch "$kf" - gate_kill_tree "$pid" - fi + ( sleep "$t" 2>/dev/null + touch "$kf" + gate_kill_tree "$pid" true ) & local guard=$! wait "$pid"; local st=$? - touch "$stop" # 放停止文件=通知守卫收工,0.2 秒内自退,无需 kill - wait "$guard" 2>/dev/null + kill "$guard" 2>/dev/null; wait "$guard" 2>/dev/null if [ -f "$kf" ]; then gate_kill_tree "$pid" st=124 fi - rm -f "$kf" "$stop" + rm -f "$kf" return "$st" } diff --git a/tools/hooks/pre-merge-commit b/tools/hooks/pre-merge-commit index cafbaa5c..95289288 100755 --- a/tools/hooks/pre-merge-commit +++ b/tools/hooks/pre-merge-commit @@ -2,7 +2,7 @@ # 合回前置检查钩子(git pre-merge-commit,2026-11-06 用户裁)——主工作区 git merge 落合并提交前 # 跑最小验证面:tools/run_all_gates.sh --premerge(冒烟测试+单元与集成全套件 4 分片,热导入缓存约 2 分钟)。 # 语义(git 2.45.2.windows.1 本机实测):本钩子拦的是「合并提交」不是「合并动作」——exit≠0 时合并结果 -# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:该路径 pre-merge-commit/post-merge 两钩子零触发)。 +# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置二选一:修红后 git commit 续合,或 git merge --abort 放弃。 # 快进合并不触发本钩子(git 语义)——本仓合回铁规恒 --no-ff,漏写时远端 CI 兜底仍在。 # --no-verify 可整体跳过(实测)——仅属用户,agent 禁用(worktree-guard 在案)。 # 仅主工作区触发(worktree 内合并不触发,与 post-merge 同款 git-dir 判别)。 @@ -18,7 +18,7 @@ RC=$? if [ "$RC" -ne 0 ]; then echo "" >&2 echo "[pre-merge-commit] ✗ 前置检查红(读数如上)——合并提交未落,仓库停 MERGE_HEAD 待提交态。" >&2 - echo " 处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:两合回钩子零触发)。" >&2 + echo " 处置二选一:① 修红后 git commit 续合本合并;② 放弃整次合并=git merge --abort。" >&2 exit 1 fi echo "[pre-merge-commit] ✓ 前置检查绿——合并提交继续。" diff --git a/待办清单.md b/待办清单.md index f0a3b229..f7a32307 100644 --- a/待办清单.md +++ b/待办清单.md @@ -90,6 +90,24 @@ **改动面**:文档+游戏代码 **状态**:待写卡 +#### 流水线闸认锚式不含中文名文档——判据出处行锚对半数现行文档失效(2026-11-05 登记,来源=批次移交) + +**实况**:判据出处行锚的机检式 `ANCHOR_RE`(`tools/pipeline_gate.py:68`)字符类=`[A-Za-z0-9_\-.\\/]`,不含中文段——凡验收判据句落在中文名现行文档(本库 GDD 多为此形态:`HUD框架.md`/`关卡节点地图.md`/`待办清单.md`),机检一律认不到锚、判「判据出处行锚缺失」红。 +- 批次实证=营地交互修复批需求卡片(2026-11-05,已退役 git 历史可考):R2/R3/R4/R8 四行的真出处是中文名文档,只能另挂一个 ASCII 路径文档当替身锚才过闸 +- 发现与依据=该卡独立复核第 22 条(`tools/pipeline_gate.py:68`,已退役 git 历史可考) + +**改动面**:工具代码 + +**状态**:待执行 + +#### 合回链两钩子冲突路径绕过(2026-11-07 登记,来源=批次移交) + +**实况**:合并遇冲突时 pre-merge-commit 不触发(合并策略失败未到提交点),续提交 `git commit` 收束 MERGE_HEAD 时两钩子(pre-merge-commit/post-merge)均不触发——前置检查由 agent 手动补跑、推送由 agent 手动补做。证据=合并提交 2a17260c 冲突续提交流(git 历史可考)+主区 .gates 前置检查补跑读数(冒烟绿/单元绿)。修法方向=续提交路径补钩子触发(pre-commit 侧判 MERGE_HEAD 分流到 premerge 语义,post-merge 侧同理),细则归工程改动。 + +**改动面**:工具代码 + +**状态**:待执行 + #### 层序落位单口检查的扫描面不含子目录——视图层插位不在该闸视野(2026-11-05 登记,来源=会话提及) **实况**:契约件 `game/tests/unit/contracts/source_guard_test.gd` 的「V1d 层序落位单口」用平铺列目录(`:86-99`,只收 `.gd` 文件名、不递归),注释 `:85` 仍写「presentation 无子目录」;而 `game/presentation/` 现实有 `views/` 与 `scenes/` 两目录,视图层全部文件不在该闸视野内。 @@ -244,23 +262,16 @@ **状态**:待文档设计 -#### 棋盘瓦片与立体表现重做(2026-11-07 登记,来源=会话提及) +#### 第二 / 三关棋盘观感——亮度与对比度(2026-10-13 登记,来源=playnote) -**实况**:用户裁定(2026-11-07 会话)棋盘难看根因=瓦片素材与立体画法,非亮度/对比度;原「第二 / 三关棋盘观感——亮度与对比度」条误诊退役、旧卡已删除。真 3D 与 HD-2D 排除(风格不合)。证据:art-bible §3.2「未挖格=一整块 32×32 自含凸起岩体」冻结条款锁死立体表现;cell_base_layer.gd 南立面/北投影全在本格内、board_view.gd 无 y-sort;tile_palette.gd digit_plate 落牌=亮度修补已失败(违 §9.2 满屏白牌反参考)。设计已闭合(C 方向+D 布局+三关八色冻结;art-bible v3.51/battle.md 2026-11-07/HUD框架 2026-11-07)。 -- 相关文档:[美术圣经](design/art/art-bible.md) §3.2/§4.1/§6.3(画法解冻+三关八色)+ [battle.md](design/ux/battle.md)(D 区布局与像素判据)+ [需求卡片](reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md)(已写卡,卡内 §16 复核通过) +**实况**:来源=playnote 试玩记录「第二第三关棋盘看着费劲」;用户裁定要做,[08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「五 · 表现」已立行标待做。旧卡 reports/需求卡片-二三关棋盘观感批-2026-10-16.md(v1.4)在册但非已写卡状态,重启须重新立卡。分工:本条管棋盘区域整体观感(亮度/对比度/费劲感,体感问题),与已注销的「呈现层残余 <4.5:1 文字位」条(机检硬指标)不同面不互代。Alpha 出口=用户实机目检不再判「看着费劲」。 -**改动面**:文档+美术素材+游戏代码 - -**状态**:已写卡+已编迭代 57 - -#### 营地场景重排接线——十层新矩形与游戏内终审(2026-11-07 登记,来源=批次移交) - -**实况**:用户 2026-11-05/2026-11-07 裁定营地十层重排——围墙显示矩形 `(0,220,1280,200)`、大门/告示板跟随、其余六件按裁定落位;围墙最终件 1280×164 入包;土线同时覆盖围墙底与门扇底(门扇运行时压扁 240×138);最终墙件预览过目(U0)与游戏内终审归实现批。设计已闭合(`camp-scene-prompts.md` v1.10 §5 第 13 条六件逐值;`art-bible.md` v3.48 §6.2 :404–405;`camp.md:29`)。需求卡片:[需求卡片-营地场景重排接线-2026-11-07.md](reports/需求卡片-营地场景重排接线-2026-11-07.md)(独立复核 17 条已处置,复核记录在卡内 §13);实现待编排。 -- 相关文档:[营地场景提示词卡](design/art/camp-scene-prompts.md) §5 第 6/12/13 条+[美术圣经](design/art/art-bible.md) §6.2+[营地 UX](design/ux/camp.md) 第 29 行;复核记录见[需求卡片](reports/需求卡片-营地场景重排接线-2026-11-07.md) §13 +**缺口**:还差「素材轴 / UI 轴」定性设计讨论与甲(recolor 现瓦片)/乙(远程生图重产)素材裁点裁决——定性是既有条款的开工前置;素材轴若走重产,依赖战斗一屏样张批目标规格清单(已随 art-bible v3.22 落定)。 +- 相关文档:[HUD框架](design/gdd/systems/表现与支撑/HUD框架.md)(UI 轴:舞台底与叠加层)+ [美术圣经](design/art/art-bible.md)(素材轴:瓦片与格面图标的明度色相)——定性前两方共裁 **改动面**:美术素材+游戏代码 -**状态**:文档设计已闭合+美术设计已闭合+已写卡+已编迭代 57 +**状态**:待文档设计+待美术设计 #### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现) @@ -373,6 +384,14 @@ **状态**:待执行 +#### 闸机超时守卫缺陷修复——gate_run_timeout 标志文件恒真(2026-11-06 登记,来源=批次移交) + +**实况**:tools/gate_platform.sh 的 gate_run_timeout 用 mktemp 预建超时标志文件,判据 `[ -f ]` 建时即真、超时态无法与正常完成区分(Windows Git Bash 实测直接调用 4 秒返回 124;远端各闸以工件锚定未受影响)。连带 tools/golden_baseline_refresh.sh 的 guard 子Shell sleep 420 未被 kill 短路(重采集等待 7 分钟症状)。修法=kf 先赋路径+rm -f 后置守卫(probe_gate.sh:97 run_suite 同款正确写法)。证据=tools/gate_platform.sh:37/:48+迭代53实现报告遗留呈报 1(git 历史可考)。 + +**改动面**:工具代码 + +**状态**:待执行 + #### 关卡视口两 Shot 基线 mac 侧冻结(2026-11-06 登记,来源=批次移交) **实况**:golden/windows/ 已锚 lmap_entry/lmap_boss(提交 6394abf7);mac 子目录无该两 Shot——渲染闸对 mac 缺基线记 SKIP 不判红,两平台同盯缺一。义务=Mac 侧跑 tools/golden_baseline_refresh.sh --lmap 冻结 mac 基线并呈报确定性读数。证据=game/tests/golden/README.md 现持清单行与时效判定纪律行+迭代53实现报告遗留 2(git 历史可考)。 From 5ec4a311bb6bf080fb11c12179da30cf0859a2e2 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 03:47:33 +0800 Subject: [PATCH 09/16] =?UTF-8?q?iter56-=E5=8D=A12=EF=BC=9A=E5=B0=81?= =?UTF-8?q?=E5=8D=B0=E5=8A=A8=E4=BD=9C=E6=94=B9=E7=89=88(=E8=BF=AD?= =?UTF-8?q?=E4=BB=A356=E5=8D=A12=C2=B7=E5=8F=97=E7=90=86=E5=8D=B3=E6=8F=AD?= =?UTF-8?q?=E7=A4=BA):=20=E8=A7=84=E5=88=99=E6=A0=B8=E5=BF=83(target=5Fsea?= =?UTF-8?q?led=E6=8C=96=E5=B0=81=E5=8D=B0=E6=A0=BC=E6=8B=92/=E6=B8=85?= =?UTF-8?q?=E5=9B=BE=E5=8F=A3=E5=BE=84=3D=E6=8C=96=E5=BC=80=E2=88=AA?= =?UTF-8?q?=E5=B0=81=E5=8D=B0/=E8=83=BD=E6=B8=85=E5=9B=BE=E7=9A=84?= =?UTF-8?q?=E5=B0=81=E6=9C=80=E4=BC=98=E5=85=88/notify=5Fcleared=E6=B8=85?= =?UTF-8?q?=E5=9B=BE=E6=94=B6=E8=BD=AE/sealed=5Fidentity=E6=92=A4=E5=87=BA?= =?UTF-8?q?=E2=86=92BoardData.cell=5Fidentity=E2=80=94=E2=80=94=E4=B8=8A?= =?UTF-8?q?=E9=99=9020=E7=94=A8=E6=88=B7=E8=A3=81)+=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E9=9D=A2dug=5Funder=5Fseal=E5=88=A0=E5=87=80+=E7=A0=B4?= =?UTF-8?q?=E5=B0=81=E4=B8=80=E5=87=BB=E9=80=80=E5=BD=B9+=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E5=B1=82(=E5=9C=B0=E6=9D=BF+=E8=BA=AB=E4=BB=BD?= =?UTF-8?q?=E5=AD=97=E5=BD=A2+=E5=8D=B0=E8=AE=B0=E4=B8=8D=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E6=8F=AD=E7=A4=BA=E6=80=81+=E6=96=87=E6=A1=88?= =?UTF-8?q?=E5=9B=9B=E4=BB=B6)+=E6=8E=A2=E9=92=88V8-V10+sim=E5=9F=9F(?= =?UTF-8?q?=E6=A0=87=E7=A9=BA=E5=B0=81=E5=8D=B0=E5=89=94=E9=99=A4=E7=BA=A6?= =?UTF-8?q?=E6=9D=9F=E5=A2=9E=E5=BC=BA+=E9=94=99=E8=A7=A6=E7=9B=B4?= =?UTF-8?q?=E6=8C=96=E8=A1=A5=E5=81=BF=E6=B3=A8=E5=85=A50.10)+golden?= =?UTF-8?q?=E4=B8=89=E5=9B=BE=E6=8D=A2=E4=BB=A3;=20MC=E5=90=8C=E6=89=B9?= =?UTF-8?q?=E9=87=8D=E9=94=9A50/=E6=A1=A3=3D100=E5=B1=80(2026-11-08?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=89=B9=E5=87=86)=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=AF=B9=E7=85=A7=E6=97=A0=E7=BB=93=E6=9E=84=E6=80=A7=E6=81=B6?= =?UTF-8?q?=E5=8C=96;=20=E9=AB=98=E6=A1=A3=E5=AE=A1=E8=AE=A1=E9=80=9A?= =?UTF-8?q?=E8=BF=87(17=E8=A1=8C=E5=85=A8=E9=87=8F=C2=B7=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=E5=90=8E=E5=8B=98=E8=AF=AF2=E9=A1=B9=E9=97=AD=E7=8E=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/action_economy.gd | 9 + game/core/board_data.gd | 8 + game/core/effect_engine.gd | 6 +- game/core/minesweeper_rules.gd | 104 ++++++----- game/core/reward_grant.gd | 2 +- game/core/settlement/grant_segment.gd | 15 +- game/data/tables/feats.tres | 24 --- game/presentation/hud_presenter.gd | 3 +- game/presentation/views/board_hover.gd | 2 +- game/presentation/views/board_view.gd | 41 +++-- game/presentation/views/board_zone_view.gd | 2 +- game/presentation/views/legend_overlay.gd | 2 +- game/probe/board_shot_probe.gd | 2 +- game/probe/ui_click_probe.gd | 18 +- game/probe/ui_input_probe.gd | 28 ++- game/sim/auto_player.gd | 5 +- game/sim/level_autoplay.gd | 17 +- .../tests/golden/windows/board_L1_dungeon.png | Bin 108511 -> 110257 bytes .../golden/windows/board_L2_underdark.png | Bin 126929 -> 128581 bytes .../windows/board_L3_deep_underdark.png | Bin 116834 -> 126520 bytes game/tests/smoke/critical-paths.md | 4 +- .../battle_settlement/seal_polarity_test.gd | 41 +++-- .../settlement_wiring_snapshot_test.gd | 2 + game/tests/unit/core/adventure_feats_test.gd | 22 +-- game/tests/unit/core/effect_words_t1_test.gd | 6 +- .../tests/unit/core/minesweeper_rules_test.gd | 171 +++++++++++++++++- .../presentation/battle_log_zero_text_test.gd | 5 + .../unit/presentation/hud_presenter_test.gd | 3 +- .../presentation/player_copy_sweep_test.gd | 5 +- .../presentation/seal_mark_params_test.gd | 14 ++ reports/iter56-代拍板追认单-2026-11-08.md | 46 +++++ reports/iter56-反哺点-2026-11-08.md | 28 +++ reports/iter56-实现报告-2026-11-08.md | 105 +++++++++++ sim-data/README.md | 13 +- 34 files changed, 589 insertions(+), 164 deletions(-) create mode 100644 reports/iter56-代拍板追认单-2026-11-08.md create mode 100644 reports/iter56-反哺点-2026-11-08.md create mode 100644 reports/iter56-实现报告-2026-11-08.md diff --git a/game/core/action_economy.gd b/game/core/action_economy.gd index 6becbdfc..7c46f0c0 100644 --- a/game/core/action_economy.gd +++ b/game/core/action_economy.gd @@ -142,6 +142,15 @@ func _spend_cost_and_arbitrate(cost: int, clears_map: bool) -> bool: return true +# 封印路径清图事实上报(排雷玩法 _do_seal_place 受理后清图判定成立时调用): +# 轮末仲裁与 request_dig 的 cleared 语义同源——剩余 AP 当场清零作废、不进 RAP(EC7/EC10), +# 同帧 cleared > ap_exhausted 胜出(覆盖写 _last_round_end)。封印不产挖掘计费, +# 清图事实经独立上报口进入仲裁(硬塞 request_dig 会引入假挖掘记账)。 +func notify_cleared() -> void: + _ap = 0 + _finish_round("cleared", "new_board") + + func _spend_and_arbitrate(action_kind: String, clears_map: bool) -> bool: var cost := _cost(action_kind) if _ap < cost: diff --git a/game/core/board_data.gd b/game/core/board_data.gd index fa7651b9..3b06fc2f 100644 --- a/game/core/board_data.gd +++ b/game/core/board_data.gd @@ -43,6 +43,14 @@ func is_safe(c: Vector2i) -> bool: func digit_of(c: Vector2i) -> int: return digits.get(c, -1) +## 格身份事实(封闭枚举):kind = "mine"(digit 恒 -1)| "safe"(digit = 邻雷数)。 +## 封印受理即揭示的消费形态 = 呈现/测量侧按封印态(MinesweeperRules.has_seal)取本读数拼装—— +## 身份事实单点在板数据(is_mine/digit_of 同源),禁消费方各自拼 kind 枚举。 +func cell_identity(c: Vector2i) -> Dictionary: + if is_mine(c): + return {"kind": "mine", "digit": -1} + return {"kind": "safe", "digit": digit_of(c)} + func variant_ids(c: Vector2i) -> Array: return variants.get(c, []) diff --git a/game/core/effect_engine.gd b/game/core/effect_engine.gd index 56b9e75f..f8b18cfc 100644 --- a/game/core/effect_engine.gd +++ b/game/core/effect_engine.gd @@ -52,12 +52,12 @@ const EFFECT_KINDS := ["add_ticket_rider", "modify_ticket", "damage_mult", "open ## fact 条件词汇(封闭枚举——payload 同名键直读面〔fact 取值序 payload ## 优先——effect_engine._fact_value 既有机制〕。new_resource_type=首开资源类型〔地质学家〕; -## is_edge_cell=边缘格〔边陲矿工〕;is_blank_zero=空白连锁〔跳格采掘〕;dug_under_seal=被挖格 -## 当时有封印〔破封一击〕;ap_exhausted_last=上轮 AP 耗尽〔一滴不剩〕;hp_ratio=生命比例〔背水 +## is_edge_cell=边缘格〔边陲矿工〕;is_blank_zero=空白连锁〔跳格采掘〕;ap_exhausted_last=上轮 +## AP 耗尽〔一滴不剩〕;hp_ratio=生命比例〔背水 ## 06 前置条兑付〕;amount=单次伤害量〔保险丝〕;ap_left=停手剩余 AP〔弃图兑换〕) const FACTS := ["matchup", "is_first_dig_of_battle", "terrain_kind", "target_armor_class", "seals_count", "nest_count", "round_index", "counter", - "new_resource_type", "is_edge_cell", "is_blank_zero", "dug_under_seal", + "new_resource_type", "is_edge_cell", "is_blank_zero", "ap_exhausted_last", "hp_ratio", "amount", "ap_left", "pct", "battle_index"] # 关卡域战斗序(1 基,enc 携带;开局姿态组「每关首轮窗」条件面) diff --git a/game/core/minesweeper_rules.gd b/game/core/minesweeper_rules.gd index 78612ef1..bf2bb1dc 100644 --- a/game/core/minesweeper_rules.gd +++ b/game/core/minesweeper_rules.gd @@ -8,8 +8,7 @@ extends RefCounted ## 揭示事实流:每格首次进入已开集恰发一次(已开格零事件)。 ## 载荷键集(四处发射位并集):cell: Vector2i/kind: "safe"|"mine"/digit: int(安全格邻雷数;危险格 -1)/ ## variant_ids: Array(地形变异身份,危险格空集)/channel: "initial"|"dig"|"chain"|"fx_reveal"/ -## resource: bool(格面资源兑付资格:initial=false,其余 true)/dug_under_seal: bool(首格带封印直挖标记—— -## initial 通道不发此键)。 +## resource: bool(格面资源兑付资格:initial=false,其余 true)。 ## 发送时点:initial=install_board 初始展开逐格;dig/chain=_do_dig 揭示闭包内(本格 AP 扣费在其后); ## fx_reveal=fx_reveal 闭包内(零 AP 消耗零相位要求)。 ## 消费方依赖:战斗结算 _on_cell_revealed 以 resource 分流缓冲(fx_reveal 由兑付点直入账,禁二次缓冲)、 @@ -94,14 +93,16 @@ func has_seal(c: Vector2i) -> bool: return _seals.has(c) + func revealed_cells() -> Array: return _revealed.keys() func _safe_remaining() -> int: + # 清图口径 = 已挖 ∪ 已封印(封印受理即揭示改版——封掉的安全格计入完成) var n := 0 for c in _board.safe_cells(): - if not _revealed.has(c): + if not _revealed.has(c) and not _seals.has(c): n += 1 return n @@ -266,25 +267,41 @@ func settle_batch(intents: Array) -> Array: func _classify(intent: Dictionary) -> int: # 0 = C_dig(执行后清图——真模拟,禁计数器捷径);1 = C_stop;2 = C_other + # 清图口径 = 已挖 ∪ 已封印(封印受理即揭示改版——「能清图的挖或封」同归最先类) if intent.get("action", "") == "dig": var c: Vector2i = intent.get("cell", Vector2i(-9, -9)) if _board_face_dig(c) == "" and not _board.is_mine(c): - # 模拟 Chain(O, c) 后清图判定——挖封印格同口径:本格封印视为已隐式退役(其余封印照挡) - var sim_seals: Dictionary[Variant, Variant] = _seals.duplicate() - sim_seals.erase(c) - var chain := _chain_closure(c, sim_seals) # 与真实执行同口径——空封印集捷径会在封印挡连锁时误判 C_dig(排雷玩法:真模拟) + # 模拟 Chain(O, c) 后清图判定——真模拟禁计数器捷径(连锁不越封印,真封印集口径) + var chain := _chain_closure(c, _seals) var remaining := 0 for sc in _board.safe_cells(): - if not _revealed.has(sc) and not chain.has(sc): + if not _revealed.has(sc) and not chain.has(sc) and not _seals.has(sc): remaining += 1 if remaining == 0: return 0 return 2 + if intent.get("action", "") == "seal_place": + return _classify_seal(intent.get("cell", Vector2i(-9, -9))) if intent.get("action", "") == "stop": return 1 return 2 +# 封印意图的清图预判分类(批次语义序「能清图的封」取数面——受理合法性模拟与清图口径模拟) +func _classify_seal(c: Vector2i) -> int: + if not _board.in_bounds(c) or is_revealed(c) or has_seal(c) or _removed.has(c): + return 2 + if _board.is_mine(c): + return 2 # 封危险格不清图(封印受理即揭示——身份当场可见但安全格分母不减) + # 模拟封印受理后清图判定(换装口径:安全格完成 = 已揭示 ∪ 已封印) + var sim_seals: Dictionary[Variant, Variant] = _seals.duplicate() + sim_seals[c] = true + for sc in _board.safe_cells(): + if not _revealed.has(sc) and not sim_seals.has(sc): + return 2 + return 0 + + func _execute(intent: Dictionary) -> Dictionary: match intent.get("action", ""): "dig": @@ -305,16 +322,8 @@ func _do_dig(c: Vector2i) -> Dictionary: var sub := _board_face_dig(c) if sub != "": return _outcome(false, "rejected", "board_face", sub) - # 挖封印格(封印不可逆):本格封印事务内隐式退役——链闭包按「本格无封印、其余封印照挡」 - # 计算(封印格为 0 时连锁照常外扩);request_dig 被拒则封印原地保留(事务性),受理后该封印轮末不判 - # (发射面基线 = 在场封印——标中/标空兑付让位于挖掘本体结局,四情况②④)。 - var was_sealed := has_seal(c) - var eff_seals: Dictionary[Variant, Variant] = _seals - if was_sealed: - eff_seals = _seals.duplicate() - eff_seals.erase(c) - # 真模拟连锁与清图(F2/F1——单一实现两名字) - var chain := _chain_closure(c, eff_seals) + # 真模拟连锁与清图(F2/F1——单一实现两名字;连锁不越封印,挖封印格已被合法性表拒绝) + var chain := _chain_closure(c, _seals) var clears: bool = _cleared_after(chain) # F2 口径:chain_size = |O′ ∖ (O ∪ {c})|——闭包含已开集 O,只数新开格(不含首格) var chain_size := 0 @@ -325,10 +334,8 @@ func _do_dig(c: Vector2i) -> Dictionary: if not action_economy.request_dig(chain_size, clears): return _outcome(false, "rejected", "resource_face", "") # 事务内执行:首格 + 连锁新格揭示(BFS 规范序,零特判);事件 = O′ ∖ O - if was_sealed: - _seals.erase(c) - var reveal_order: Array[Variant] = _chain_reveal_order(c, eff_seals) - _reveal_chain(c, reveal_order, was_sealed) + var reveal_order: Array[Variant] = _chain_reveal_order(c, _seals) + _reveal_chain(c, reveal_order) if action_economy.phase != action_economy.PHASE_ACTIVE: _emit_round_end_seals_and_payload() return _outcome(true, "executed", "", "") @@ -337,8 +344,7 @@ func _do_dig(c: Vector2i) -> Dictionary: ## 连锁揭示域:首格+连锁新格揭示(BFS 规范序——cell_revealed 发射序即链序,整体随段搬迁)。 ## 格面资源资格:chain/dig 恒 true——安全格与危险格一视同仁(危险格亦携带, ## 负向兑付归 战斗结算 极性路由);initial(封锁格)恒 false。资源本体与极性不在本系统。 -## dug_under_seal = 首格带封印直挖标记(战斗结算 情况④兑付改判消费;连锁格恒 false——连锁不越封印) -func _reveal_chain(c: Vector2i, reveal_order: Array, was_sealed: bool) -> void: +func _reveal_chain(c: Vector2i, reveal_order: Array) -> void: for rc in reveal_order: if _revealed.has(rc): continue # 闭包可穿过已开区——已开格零事件(cell_revealed × |O′ ∖ O|) @@ -348,14 +354,12 @@ func _reveal_chain(c: Vector2i, reveal_order: Array, was_sealed: bool) -> void: cell_revealed.emit({ "cell": rc, "kind": "mine", "digit": -1, "variant_ids": [], "channel": channel, "resource": true, - "dug_under_seal": was_sealed and rc == c, }) else: _revealed[rc] = {"kind": "safe", "digit": _board.digit_of(rc)} cell_revealed.emit({ "cell": rc, "kind": "safe", "digit": _board.digit_of(rc), "variant_ids": _board.variant_ids(rc), "channel": channel, "resource": true, - "dug_under_seal": was_sealed and rc == c, }) @@ -366,9 +370,10 @@ func _board_face_dig(c: Vector2i) -> String: return "not_adjacent" if is_revealed(c): return "target_revealed" + if has_seal(c): + return "target_sealed" # 封印受理即揭示、不可再挖开(封印承诺 = 对该格的最终处置——改判路径已退役) if _removed.has(c): return "target_removed" # 中立移除格不可交互(拒绝先于消耗,pattern 1 board_face 腿) - # 封印不拦挖掘(封印不可逆):有封印格直接挖 = 对承诺的兑现,兑付改判归 战斗结算。 return "" @@ -387,17 +392,14 @@ func fx_reveal(c: Vector2i) -> bool: cell_revealed.emit({ "cell": rc, "kind": "safe", "digit": _board.digit_of(rc), "variant_ids": _board.variant_ids(rc), "channel": "fx_reveal", "resource": true, - "dug_under_seal": false, }) return true -## 挖一格→真实翻开集只读预览(sim 信息面出口——与 _classify 同口径:本格封印视为已隐式退役、 -## 其余封印照挡;复用 _chain_closure 闭包;零状态写入、零事件发射) +## 挖一格→真实翻开集只读预览(sim 信息面出口——与 _classify 同口径:连锁不越封印、 +## 真封印集口径;复用 _chain_closure 闭包;零状态写入、零事件发射) func preview_reveal(c: Vector2i) -> Array[Vector2i]: - var sim_seals := _seals.duplicate() - sim_seals.erase(c) - var closure := _chain_closure(c, sim_seals) + var closure := _chain_closure(c, _seals) var out: Array[Vector2i] = [] for cc in closure.keys(): if cc != c and not _revealed.has(cc): @@ -436,34 +438,44 @@ func _chain_reveal_order(start: Vector2i, seal_set: Dictionary) -> Array: func _cleared_after(chain: Dictionary) -> bool: + # 清图口径 = 已挖 ∪ 已封印(与 _safe_remaining 同源——私有共享口径单点,禁第三处重复实现) for c in _board.safe_cells(): - if not _revealed.has(c) and not chain.has(c): + if not _revealed.has(c) and not chain.has(c) and not _seals.has(c): return false return true # ---- 封印 ---- -func _do_seal_place(c: Vector2i) -> Dictionary: - var sub := "" +# 封印棋盘面合法性(board_face 拒绝情形序:目录外/不相邻/已开/已有封印/已移除——与挖掘合法性同构分域) +func _seal_face_reject(c: Vector2i) -> String: if not _board.in_bounds(c): - sub = "out_of_catalog" - elif not (seal_range_free or _adjacent_to_hero(c)): - sub = "not_adjacent" # 信标网络装配时豁免(封印不限相邻——封印动作仍按标准价计费,规则放宽仅可达性) - elif is_revealed(c): - sub = "target_revealed" - elif has_seal(c): - sub = "seal_present" - elif _removed.has(c): - sub = "target_removed" # 中立移除格不可交互 + return "out_of_catalog" + if not (seal_range_free or _adjacent_to_hero(c)): + return "not_adjacent" # 信标网络装配时豁免(封印不限相邻——封印动作仍按标准价计费,规则放宽仅可达性) + if is_revealed(c): + return "target_revealed" + if has_seal(c): + return "seal_present" + if _removed.has(c): + return "target_removed" # 中立移除格不可交互 + return "" + + +func _do_seal_place(c: Vector2i) -> Dictionary: + var sub := _seal_face_reject(c) if sub != "": return _outcome(false, "rejected", "board_face", sub) if not action_economy.try_spend("seal_place"): return _outcome(false, "rejected", "resource_face", "") _seals[c] = true # 封印动作零格子事件外发(发射面封闭;反馈经调用返回值命令式驱动) + if _cleared_after({}): + # 封印受理即揭示改版:封掉最后安全格 = 清图完成——轮末仲裁走 cleared(行动经济 + # notify_cleared 独立上报口,与 request_dig 的 cleared 语义同源;同帧覆盖 ap_exhausted) + action_economy.notify_cleared() if action_economy.phase != action_economy.PHASE_ACTIVE: # 封印动作花完末点 AP 同样终结轮次(行动经济 三出口——AP 用完与动作种类无关;缺漏使 round_end - # 永不发出、战斗结算 的 Waiting 结算点永不到达 = 整局软锁) + # 永不发出、战斗结算 的 Waiting 结算点永不到达 = 整局软锁);清图收轮同此出口发判定批 _emit_round_end_seals_and_payload() return _outcome(true, "executed", "", "") diff --git a/game/core/reward_grant.gd b/game/core/reward_grant.gd index 8aa3911e..00d7c329 100644 --- a/game/core/reward_grant.gd +++ b/game/core/reward_grant.gd @@ -172,7 +172,7 @@ func _safe_dig_open(v: Dictionary) -> Dictionary: for c_v in v.resolved: var c := Vector2i(c_v) if fx_host.minesweeper.has_seal(c): - continue + continue # 封印格不代开(封印受理即揭示——天眼揭示绕开承诺格,零动作) if fx_host.minesweeper.fx_reveal(c): opened_any = true if not opened_any: diff --git a/game/core/settlement/grant_segment.gd b/game/core/settlement/grant_segment.gd index f5a818ef..157de961 100644 --- a/game/core/settlement/grant_segment.gd +++ b/game/core/settlement/grant_segment.gd @@ -93,15 +93,12 @@ func _reveal_batch(ri: int) -> void: _reveal_mine(evt, snap, ri) -# safe 事件兑付(封印不可逆四情况④:插安全格再挖开 = 零惩罚零奖励——正向兑付作废〔归因行在案〕; -# 标空判定已随封印擦除自然缺席——被挖的封印不在轮末在场基线。dig_reveal 发射+施加序: +# safe 事件兑付(封印受理即揭示改版:挖封印格已被规则合法性表拒绝——改判路径整体退役, +# 本函数只受理真实揭示的 safe 事件。dig_reveal 发射+施加序: # 乘区收集 → 正向兑付 → 施加面〔计数器/揭示入队/追加产出/奥术矢〕。 # payload 携 is_edge_cell〔边陲矿工〕/is_blank_zero〔跳格采掘〕/ # new_resource_type〔地质学家——快照 cell_type 首见判定,见后集登记〕) func _reveal_safe(evt: Dictionary, snap: Dictionary, ri: int) -> void: - if bool(evt.get("dug_under_seal", false)): - emit_row_cb.call({"type": "reward_ineffective", "source_class": "safe_cell", "origin_cell": evt.cell}, ri, "奖励作废(封印格直接挖开——零惩罚零奖励)", 0, {}) - return var board_b: BoardData = minesweeper.current_board() var ctype := String(snap.get("cell_type", "")) var is_new_type := fx_host.mark_new_resource_type(ctype) @@ -145,12 +142,12 @@ func _reveal_safe_apply(dr_hits: Array, evt: Dictionary, ri: int) -> void: # mine 事件兑付(封印不可逆四情况②:插危险格再挖开 = 只受挖雷一层惩罚——mine_hit 照常兑付惊动巢穴, -# 标中不发〔封印已随挖掘擦除、不入轮末判定基线〕。mine_hit 发射+施加序:施加面收集 → 减伤落快照 → +# mine_hit 发射+施加序:施加面收集 → 减伤落快照 → # 计数器 → 揭示入队 → 负向兑付〔带减半系数〕→ 反打开单) func _reveal_mine(evt: Dictionary, snap: Dictionary, ri: int) -> void: var mine_power := int(snap.get("power", 0)) var mh_hits := fx_host.fx_emit("mine_hit", {"cell": evt.cell, "round": ri, - "damage": mine_power, "dug_under_seal": bool(evt.get("dug_under_seal", false)), + "damage": mine_power, "hp_ratio": int(round(100.0 * float(int(units.hero_unit().get("hp", 0))) / float(maxi(1, int(units.hero_unit().get("max_hp", 1))))))}) var applied := _reveal_mine_apply(mh_hits, snap, evt.cell, ri) if int(applied["mine_reduce"]) > 0: @@ -201,8 +198,8 @@ func _reveal_mine_apply(mh_hits: Array, snap: Dictionary, cell: Vector2i, ri: in # 地形变异 兑付批(授予段尾——触发枚举 on_open:挖开即伤、chain 通道同口径;伤害单据案C 暂存到 # 战斗段末兑付〔案C〕;信息型 hide_number 不进结算——呈现层读取,见 board_view 数字遮蔽; -# 危险格恒无变异——布置段排除,双层叠罚不存在;封印格直挖照吃变异伤害——地形后果同 mine_hit 口径, -# 非奖励不作废;吞噬流资源兑付〔荆棘编织/地脉补偿〕中伤害形态行同样经案C闸暂存,非伤害形态照常当场) +# 危险格恒无变异——布置段排除,双层叠罚不存在;封印格不可挖(封印受理即揭示——变异伤害只随 +# 真实揭示兑付);吞噬流资源兑付〔荆棘编织/地脉补偿〕中伤害形态行同样经案C闸暂存,非伤害形态照常当场) func _terrain_batch(ri: int) -> void: for evt in facts.reveals: var vids: Array[Variant] = evt.get("variant_ids", []) diff --git a/game/data/tables/feats.tres b/game/data/tables/feats.tres index 28687a22..0d749b00 100644 --- a/game/data/tables/feats.tres +++ b/game/data/tables/feats.tres @@ -619,30 +619,6 @@ rows = [ } ] }, - { - "feat_id": "breaker_strike", - "display_name": "破封一击", - "rarity": "excellent", - "cap": 1, - "desc": "挖开带封印的危险格:+1 层(疼痛记忆同账)", - "triggers": [ - { - "on": "mine_hit", - "when": [ - { - "fact": "dug_under_seal", - "op": "eq", - "value": true - } - ], - "do": { - "kind": "counter_add", - "counter_id": "pain_layers", - "value": 1 - } - } - ] - }, { "feat_id": "map_exchange", "display_name": "弃图兑换", diff --git a/game/presentation/hud_presenter.gd b/game/presentation/hud_presenter.gd index 8fa60738..09e7f290 100644 --- a/game/presentation/hud_presenter.gd +++ b/game/presentation/hud_presenter.gd @@ -176,7 +176,8 @@ static func outcome_text(outcome: Dictionary) -> String: "not_adjacent": "不能执行:目标与小人不相邻", "target_revealed": "不能执行:目标已开", "target_concealed": "不能移动:目标未开", - "seal_present": "不能封印:此格已有封印印记(封印为一次性承诺——相邻时左键直接挖开)", + "target_sealed": "不能挖:此格已封印(封印受理即揭示——不可再挖开)", + "seal_present": "不能封印:此格已有封印印记(封印受理即揭示——印记随图存续)", "no_path": "不能移动:已探明区不连通", "out_of_catalog": "无效目标", } diff --git a/game/presentation/views/board_hover.gd b/game/presentation/views/board_hover.gd index ceb59525..4dc6eab1 100644 --- a/game/presentation/views/board_hover.gd +++ b/game/presentation/views/board_hover.gd @@ -108,7 +108,7 @@ func _apply_hover_visuals(c: Vector2i) -> void: _show_path_preview(c) elif adjacent: u.face.hl_visible = true - u.face.hl_color = COL_HL_TARGET # 挖掘目标格边框(相邻封印格同此——左键直接挖) + u.face.hl_color = COL_HL_TARGET # 挖掘目标格边框(已封印格不入 _diggable——落下方封印禁入分支) _set_cursor_shape(c, CURSOR_DIG) elif seal: u.face.hl_visible = true diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index 394cb56f..9ad8f01c 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -300,8 +300,8 @@ func refresh() -> void: var hero: Vector2i = _minesweeper.hero_pos() _diggable.clear() for n in _board.neighbors8(hero): - if not _minesweeper.is_revealed(n) and not _minesweeper.is_removed(n): - _diggable[n] = true + if not _minesweeper.is_revealed(n) and not _minesweeper.is_removed(n) and not _minesweeper.has_seal(n): + _diggable[n] = true # 已封印格不入可挖域(封印受理即揭示——挖封印格被拒) _recompute_glow(hero) for y in _board.height: for x in _board.width: @@ -474,14 +474,15 @@ func _on_cell_input(c: Vector2i, ev: InputEvent) -> void: if ev.button_index == MOUSE_BUTTON_LEFT: if _minesweeper.is_revealed(c): action_requested.emit(c, "move") + elif _minesweeper.has_seal(c): + pass # 已封印格零动作(封印受理即揭示——挖封印格被拒,左右键同零意图) else: action_requested.emit(c, "dig") _hover_comp.detect_chord(c) elif ev.button_index == MOUSE_BUTTON_RIGHT: if not _minesweeper.has_seal(c): action_requested.emit(c, "seal_place") - # 封印 = 一次性承诺:右键对封印格零动作(无撤封印); - # 左键相邻封印格直接挖(规则引擎放行)。 + # 封印 = 受理即揭示的最终承诺:右键对封印格零动作(无撤封印),左键同零动作。 # ---- 奖励徽章(已开格身份 icon——封印之下、纹带之上、不进数字区) ---- @@ -536,20 +537,22 @@ func _paint_cell(c: Vector2i, hero: Vector2i) -> void: var seal: bool = _minesweeper.has_seal(c) var removed: bool = _minesweeper.is_removed(c) # 中立移除格(退色降档) var is_hero: bool = c == hero - # 封印印记下发(卡④ 法阵化):封印格=未开且未移除 → CellUnit 封印子件绘制(着色器参数化); - # 其余格撤子件。层序与迷雾门控在 CellUnit 侧承载(seal_mark_layer/fog_state 联动)。 - u.seal_on = seal and not revealed + # 封印印记下发(卡④ 法阵化+封印受理即揭示改版):封印格(未移除)→ CellUnit 封印子件绘制 + # (着色器参数化)——印记可见性不依赖揭示态(已揭示格承载=新组合态);其余格撤子件。 + # 层序与迷雾门控在 CellUnit 侧承载(seal_mark_layer/fog_state 联动)。 + u.seal_on = seal if removed: revealed = false # 移除格固定未开呈现基座(退色暗幕层承载;危险格本无数字,周边数字冻结) seal = false u.seal_on = false # 绘制层五段(字形与色牌→基底瓦片→立面投影→秘宝/变异叠加→迷雾)——段间交换经单元状态面 #(u.base/u.face 域件与 u.glyph/u.glyph_color),唯一例外=基底色 bg 经 ink 段返回值交 base 段(无单元场域承载) + var shown: bool = revealed or seal # 呈现揭示态(封印受理即揭示——地板瓦片/身份字形/迷雾开启) var bg: Color = _paint_cell_ink(c, u, revealed, seal) - _paint_cell_base(c, u, revealed, is_hero, bg) - _paint_cell_facade(c, u, revealed) + _paint_cell_base(c, u, shown, is_hero, bg) + _paint_cell_facade(c, u, shown) _paint_cell_overlays(c, u, revealed) - _paint_cell_fog(c, u, revealed, hero) + _paint_cell_fog(c, u, shown, hero) u.face.removed_dim = removed u.queue_redraw() @@ -575,11 +578,19 @@ func _paint_cell_ink(c: Vector2i, u: Node2D, revealed: bool, seal: bool) -> Colo else: glyph = str(d) digit_col = _digit_ink(d) # 数字墨三档色温(§4.1) + elif seal: + # 封印受理即揭示:身份字形按板事实当场可见(cell_identity 单点——不用等轮末判定; + # 数字遮蔽不适用——遮蔽打脸受理即揭示)。 + bg = COL_FLOOR + var ident: Dictionary = _board.cell_identity(c) + if String(ident.get("kind", "")) == "mine": + glyph = "危" + digit_col = UiKit.RED_MINE + elif int(ident.get("digit", 0)) > 0: + glyph = str(int(ident.get("digit", 0))) + digit_col = _digit_ink(int(ident.get("digit", 0))) else: - if seal: - bg = COL_BRICK # 封印印记由 CellUnit 封印子件绘制(卡④ 法阵化——缺图字形回退随贴图路径退役) - else: - bg = COL_BRICK + bg = COL_BRICK u.glyph = glyph u.glyph_color = digit_col # 色牌后备(数字直画退牌;「危」/「?」维持牌载保读性)+ v3.4:双峰纹理板 @@ -588,7 +599,7 @@ func _paint_cell_ink(c: Vector2i, u: Node2D, revealed: bool, seal: bool) -> Colo if plate_digit: digit_col = COL_DIGIT # 牌上深墨族(素牌 12:1——双峰纹理免疫) u.glyph_color = digit_col - u.plate = revealed and (glyph == "危" or glyph == "?" or plate_digit) + u.plate = (revealed or seal) and (glyph == "危" or glyph == "?" or plate_digit) return bg diff --git a/game/presentation/views/board_zone_view.gd b/game/presentation/views/board_zone_view.gd index 52390e21..e1d7f612 100644 --- a/game/presentation/views/board_zone_view.gd +++ b/game/presentation/views/board_zone_view.gd @@ -77,7 +77,7 @@ func _build_board_children(board_area: Control, vb: VBoxContainer) -> void: hint.size_flags_horizontal = Control.SIZE_SHRINK_CENTER hint.mouse_filter = Control.MOUSE_FILTER_IGNORE vb.add_child(hint) - var hl := UiKit.label("左键 挖掘 / 移动 · 右键 封印(不可逆) · 同格双击 快开",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT) + var hl := UiKit.label("左键 挖掘 / 移动 · 右键 封印(受理即揭示·不可逆)",UiKit.FS_CAPTION, false, UiKit.WARM_FAINT) hint.add_child(hl) # 信号转发(组合根只接线一处) board_view.action_requested.connect(_forward_action) diff --git a/game/presentation/views/legend_overlay.gd b/game/presentation/views/legend_overlay.gd index 238d4c0c..dd7f86ff 100644 --- a/game/presentation/views/legend_overlay.gd +++ b/game/presentation/views/legend_overlay.gd @@ -8,7 +8,7 @@ signal closed const ENTRIES := [ ["#C9AF83", "完整覆尘地砖", "未开格——左键挖开(1AP,须相邻)· 右键封印(1AP)"], ["#B39A78", "碎裂裸土", "已开 0 格——可通行,左键移动(免费)"], - ["#000000", "封印", "封印印记(呈现名·不能拔)——轮末自动判定标中;标空可左键直接挖开(安全格零奖励、危险格受挖掘惩罚)"], + ["#000000", "封印", "封印印记(受理即揭示——落定当场可见格下身份,随图存续不能拔)——轮末自动判定标中/标空;已封印格零动作(不可再挖开)"], ["#2e86de", "小人", "探险者——8 向相邻未开格常驻微光 = 可挖域"], ["#F0A828", "金徽章", "已开格奖励身份 icon(封印之下、数值之上,不进数字区)"], ["#F0A828", "九徽章解码", "攻=攻击 · 守=护甲 · 爆=爆裂 · 医=回复 · 弱=削弱 · 穿=穿刺 · 魔=魔法 · 行=行动点 · 金=GP"], diff --git a/game/probe/board_shot_probe.gd b/game/probe/board_shot_probe.gd index 5a8805e3..d976684d 100644 --- a/game/probe/board_shot_probe.gd +++ b/game/probe/board_shot_probe.gd @@ -142,7 +142,7 @@ func _ready() -> void: # 全拒则免邻接旗标+任意未开格重试,AP 不足先 grant_ap 兜底;拒绝全数=取证段红)---- var seal_cell := Vector2i(-9, -9) for c in settlement.minesweeper.current_board().safe_cells(): - if settlement.minesweeper.has_seal(c) and not settlement.minesweeper.is_revealed(c): + if settlement.minesweeper.has_seal(c): # 取证选择器换代〔封印改 V8〕——印记可见性不依赖揭示态(受理即揭示) seal_cell = c break if seal_cell.x < 0: diff --git a/game/probe/ui_click_probe.gd b/game/probe/ui_click_probe.gd index 00355107..343baa33 100644 --- a/game/probe/ui_click_probe.gd +++ b/game/probe/ui_click_probe.gd @@ -20,7 +20,6 @@ var _stall_frames := 0 var _closed_via_abandon := false # T17——预算耗尽经放弃路径收口(断点段返回断言豁免位) var _done := false var _rand := RandomNumberGenerator.new() -var _seals_placed: Array = [] var _ap_spent_this_round := 0 var _problems: Array = [] # 新增覆盖的问题收集(退出码合并判定) var _tested_legend := false @@ -37,6 +36,7 @@ var _tested_map_status := false # 地图屏角标一次性 case(选路态 var _inter_confirms := 0 # 大奖励屏确认计数(冒险推进停点——首见确认推进 L2,再见 = L2 关卡完成收口) var _settlement_confirms := 0 # 卡⑥ 胜利结算框确认计数(观测面——每场普通战斗胜利恰一) var _route_clicks := 0 # 选路覆盖层点击计数(岔路使用率观测面) +var _seals_placed: Array = [] # 随机封印簿记(行为①仍在役;行为②撤封印已退役——dump 读数面保留) var _locktest_state := 0 # T1 D1 锁期/重放断言状态机(0=待注入 1=等重放 2=完结)——每 run 一次 var _locktest_cell := Vector2i(-9, -9) var _locktest_frames := 0 @@ -827,7 +827,6 @@ func _ready() -> void: _done = true print("[click_probe] 第二关大奖励屏(L2 关卡完成)——探针收口 · 选路口点击 %d 次" % _route_clicks) break - _seals_placed.clear() continue if main.ui.modals.run.end_overlay.is_open() and main.run_scope.settlement_stop_timer.is_armed(): # 战斗胜利总结结算框(真实信号路径——每场普通胜利到达):断言已拍板面后点「下一节点」 @@ -1216,8 +1215,9 @@ func _run_modal_probes_once() -> void: for e in main.ui.modals.run.legend_overlay.ENTRIES: if String(e[1]) == "封印": legend_has_seal = true - # 图例封印行换代断言(迭代36 卡A wa5——真实 AP 条图例钮开层路径) - if not String(e[2]).contains("标空") or not String(e[2]).contains("受挖掘惩罚") or String(e[2]).contains("插错") or String(e[2]).contains("挖雷"): + # 图例封印行换代断言〔封印改 V10〕(迭代36 卡A wa5 载体——真实 AP 条图例钮开层路径): + # 新口径=受理即揭示/已封印格零动作;旧「受挖掘惩罚」句随改判路径退役,雷字清零照守 + if not String(e[2]).contains("受理即揭示") or not String(e[2]).contains("零动作") or String(e[2]).contains("插错") or String(e[2]).contains("挖雷") or String(e[2]).contains("雷格"): _problems.append("图例封印行旧词残留(wa5——%s)" % String(e[2]).replace(" ", "|")) if not legend_has_seal: @@ -1391,12 +1391,8 @@ func _play_one_action() -> void: _seals_placed.append(target) _ap_spent_this_round += 1 return - # 行为②:随机撤封印(右键已封印格),约 10% 轮次 - if _rand.randf() < 0.1 and not _seals_placed.is_empty(): - var fc: Vector2i = _seals_placed.pop_back() - if minesweeper.has_seal(fc) and not minesweeper.is_revealed(fc): - main.ui.battle.board_zone.board_view.click_cell(fc, MOUSE_BUTTON_RIGHT) - _ap_spent_this_round += 1 + # 行为②撤封印退役〔封印改 V9 波及面——test-conventions §5.5 同生死〕:右键已封印格零动作 + # (封印受理即揭示——撤封印路径不存在),随机撤封印行为段整体摘除;_seals_placed 簿记随段退役。 return # 行为③:随机无效点击(非相邻格/已开格),约 8% 轮次 if _rand.randf() < 0.08: @@ -1500,7 +1496,7 @@ func _locktest_tick() -> void: b.width, b.height, str(settlement.minesweeper.hero_pos())]) _problems.append("重放断言:锁期缓存点击未受理恰一次(封印未置位——零发或双发)") _locktest_state = 2 - main.ui.battle.board_zone.board_view.click_cell(_locktest_cell, MOUSE_BUTTON_RIGHT) # 撤封印恢复现场(尽力而为不判定) + # 撤封印恢复现场调用随行为②退役〔封印改 V9〕——右键已封印格零动作(改判路径不存在) func _locktest_pick_cell(minesweeper) -> Vector2i: diff --git a/game/probe/ui_input_probe.gd b/game/probe/ui_input_probe.gd index 6cae1d92..c38fc033 100644 --- a/game/probe/ui_input_probe.gd +++ b/game/probe/ui_input_probe.gd @@ -271,7 +271,7 @@ func _ready() -> void: if bv.mouse_default_cursor_shape != Input.CURSOR_ARROW: _problems.append("case③ 移动光标缺失(%d)" % bv.mouse_default_cursor_shape) # ---- case④ 右键封印:seal_place 到达组合根 + 核心封印态落位 ---- - # 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:231 封印受理与印记随挖消失(case④/④b) + # 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:52 封印受理即揭示、受理零兑付零事件(case④/④b——受理即揭示改版换代) _push_click(_pos(bv, seal_t), MOUSE_BUTTON_RIGHT) await get_tree().process_frame if not _has_action(seal_t, "seal_place"): @@ -284,6 +284,32 @@ func _ready() -> void: var seal_unit = bv.cells_probe().get(seal_t) if seal_unit == null or not seal_unit.seal_on: _problems.append("case④b 封印印记未下发(seal_on=%s)" % ["无单元" if seal_unit == null else str(seal_unit.seal_on)]) + # ---- case④c(V9 新增)已封印格零动作:真输入左/右键 → action_requested 零发射、光标态=禁止 ---- + # 判据出处: design/ux/battle.md Interaction Map 已封印格行——已封印格无动作(左右键同零意图) + var acts_before_v9: int = _actions.size() + _push_motion(_pos(bv, seal_t)) + await get_tree().process_frame + if bv.mouse_default_cursor_shape != Input.CURSOR_FORBIDDEN: + _problems.append("case④c 悬停已封印格光标非禁止(%d)〔封印改 V9〕" % bv.mouse_default_cursor_shape) + if bv.cells_probe()[seal_t].face.hl_color != bv.COL_SEAL: + _problems.append("case④c 已封印格悬停未落封印禁入框(color=%s)〔封印改 V9〕" % str(bv.cells_probe()[seal_t].face.hl_color)) + _push_click(_pos(bv, seal_t), MOUSE_BUTTON_LEFT) + await get_tree().process_frame + _push_click(_pos(bv, seal_t), MOUSE_BUTTON_RIGHT) + await get_tree().process_frame + if _actions.size() != acts_before_v9: + _problems.append("case④c 已封印格左右键仍发射意图(新增 %d——应零发射)〔封印改 V9〕" % (_actions.size() - acts_before_v9)) + if not ms.is_revealed(seal_t): + pass # 封印格保持未开(零副作用同源佐证) + else: + _problems.append("case④c 已封印格被挖开(零副作用失守)〔封印改 V9〕") + # 悬停说明在册:图例封印行承载悬停语义说明(受理即揭示口径——ENTRIES 在册断言) + var legend_seal_line := "" + for e in main.ui.modals.run.legend_overlay.ENTRIES: + if String(e[1]) == "封印": + legend_seal_line = String(e[2]) + if not legend_seal_line.contains("受理即揭示"): + _problems.append("case④c 悬停说明在册缺新口径(图例封印行=%s)〔封印改 V9〕" % legend_seal_line) # ---- case⑤ 双击 chord:禁入格双左击(核心拒挖零副作用)→ chord_attempted ---- # 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:236 拒绝三源可辨、任何拒绝零副作用(case⑤ chord) _push_click(_pos(bv, forbid_t), MOUSE_BUTTON_LEFT) diff --git a/game/sim/auto_player.gd b/game/sim/auto_player.gd index c840b608..6ed6ba46 100644 --- a/game/sim/auto_player.gd +++ b/game/sim/auto_player.gd @@ -174,7 +174,10 @@ static func _constraints(minesweeper, board, mines: Dictionary) -> Array: var known := 0 for n in board.neighbors8(c): if minesweeper.has_seal(n): - known += 1 + # 封印受理即揭示:封印格身份当场可查(测量侧镜像玩家可读信息——cell_identity 板事实单点)。 + # 标中(雷)计已知雷;标空(安全格)=已完成格,剔除出约束(旧口径一律计已知雷=失真)。 + if String(board.cell_identity(n).get("kind", "")) == "mine": + known += 1 elif not minesweeper.is_revealed(n): if mines.has(n): known += 1 diff --git a/game/sim/level_autoplay.gd b/game/sim/level_autoplay.gd index ec06dab9..bfba1ce7 100644 --- a/game/sim/level_autoplay.gd +++ b/game/sim/level_autoplay.gd @@ -25,7 +25,8 @@ const BattleDriver := preload("res://sim/battle_driver.gd") # 庚案收敛: # ── 普通档 v3 失误注入参数(踩雷期望=完美+2/板、每板少挖几个正确格)── # 标雷→误挖转化率:主踩雷源=卡死赌挖(不确定性概率命中),误挖只作偶发真手滑—— # 真人几乎不挖自己封印的格(p 过高会让首轮已证封印变保底命中,非失误形态) -const NORMAL_MINE_SLIP_P := 0.10 +const NORMAL_MISDIG_P := 0.10 # 错触直挖率(补偿注入——用户 2026-11-07 裁③:初值承旧注入 0.10, +# 标定目标=改前锚普通档踩雷读数量级;同批同码态锚只采一次,偏差记实现决定) # 安全挖跳过率:每板安全格 ~70-90 × p ≈ 3-5 次漏挖(信息与推进双损失) const NORMAL_SKIP_DIG_P := 0.05 # 空闲提前赌挖率:已证安全格在手时小概率先赌一格——完美系把不确定性攒到残局 @@ -471,7 +472,7 @@ static func _autoplay_battle(runner, settlement, st: Dictionary, logger) -> void # 普通策略档 v3:完美策略 + 受控失误注入(标定依据=真人实证: # 零加成真人首通三关踩 23 雷)。 # v3 语义 = 会玩的普通玩家:推理与完美档同源(subset 解算/封印/卡死刷新),失误只注入两手—— - # 标雷误挖(NORMAL_MINE_SLIP_P)+ 安全挖跳过(NORMAL_SKIP_DIG_P)。连续拒绝 ≥3 = 编排违约防御。 + # 错触直挖(NORMAL_MISDIG_P——标雷误挖换代名)+ 安全挖跳过(NORMAL_SKIP_DIG_P)。连续拒绝 ≥3 = 编排违约防御。 # 完美策略档:单步决策循环——move/dig/seal 经 排雷玩法 settle_batch 提交, # refresh 经 settlement.player_request_refresh(战斗结算 核心编排:行动经济 扣 RAP + 退役 + 当场换新板), # stop 出内环走统一停手提交。连续拒绝 ≥3 = 编排违约防御(fail-fast 语义,停手防死循环)。 @@ -503,9 +504,11 @@ static func _action_logger(st: Dictionary, logger) -> Callable: st.refreshes = int(st.refreshes) + 1 elif ok and kind == "seal_place": st.seal_placed = int(st.get("seal_placed", 0)) + 1 # 封印数(η 分母=全部封印数〔Q5〕;失误注入转化封印不计数=转化后实为挖) -# 普通档 v3 失误注入:三类—— -# ①标雷误挖:把「封印已证雷」动作直接转成「挖该格」(真人手滑原型:知道是雷、位置点错, -# 踩雷吃伤且该雷奖励报废);期望踩雷增量 ≈ 每板已证雷数 × NORMAL_MINE_SLIP_P(目标完美+2/板) +# 普通档 v3 失误注入:三类(封印受理即揭示改版换代——①标雷误挖退役,等价补偿注入=错触直挖, +# 用户 2026-11-07 裁③)—— +# ①错触直挖:把「封印已证雷」动作按概率转成「挖该格」(真人错触原型:判雷正确、手指落点成挖; +# 目标格当时未封未揭——新规则下挖未封格合法可执行,踩雷吃伤吃挖掘惩罚);期望踩雷增量 ≈ +# 每板已证雷数 × NORMAL_MISDIG_P(初值承旧注入 0.10——标定目标=改前锚普通档踩雷读数量级) # ②安全挖跳过:把「挖已证安全格」动作转成本轮停手(少挖几个正确的雷——信息与推进双损失) # ③卡死赌挖:完美档无已证动作时刷新/停手拖轮次吃敌方垫刀(实证=完美档 41% 冒险成功;全败于慢玩 # 垫刀非踩雷)——真人会按概率赌一个边界格(用户实证口径「有些地方因为我看不到数字,也是盲挖 @@ -516,8 +519,8 @@ static func _apply_normal_slips(act: Dictionary, settlement, st: Dictionary) -> if prng == null: return act var kind := String(act.get("kind", "stop")) - if kind == "seal" and prng.randf() < NORMAL_MINE_SLIP_P: - st.mine_slips = int(st.get("mine_slips", 0)) + 1 + if kind == "seal" and prng.randf() < NORMAL_MISDIG_P: + st.mine_slips = int(st.get("mine_slips", 0)) + 1 # 计数字段沿用 mine_slips(锚对比列对齐) return {"kind": "dig", "cell": act.get("cell")} if kind == "dig": var roll := prng.randf() diff --git a/game/tests/golden/windows/board_L1_dungeon.png b/game/tests/golden/windows/board_L1_dungeon.png index e5a587efefa6204ee5e55a15d547691dade93c86..a4764d436718bc2d10d5ce9f38a50585fe08b041 100644 GIT binary patch literal 110257 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 literal 108511 zcmeEu`8%D$Ec&7LL z`v;!a_i^mS_C59jt~k&0Q;YbdEQ^it3IhcN1zYZ;)MpfwXCWvkPp{CQBA=8sgH2JM zprFV}NvL~e?n7Q?(s>$O8hL7HA>N5@4;#+XDWJc>WtUb}m3V*h+N=*+o*pFdZ=ef*@n`N>yGx)ECiU9Pw4a({4GQ6+oQKvrw=5pnBR;;%N&(>%NH zSRlN5%TSTu(A;!0t-+_4eNCBNaW`lsrbdGvM2&ofyZnsaRD1dFJ$g{rTM69f$QPIL zTW#ZlECenq2~JE!~ZSF{|>|dF2dh4@W0CNzpD7Zj_|*W@c%I$jPzWN zb_u-3T$K~4bgSD-O`tS43ZhQXfA)ZnM*JCnb%xFX;l~yR#m_pLp)z*ysO;) zCsCreo;9^8w|84m!X@+W(8yOl;g=oNC0hcWsG=~Bnme7`o{xVGbjsJXT#chDj-R(~ z{l&DQSeQV4^E2PPNll}KU+HEV^83^a?zWIo1X#OBE`e9gy;29adx+A9Q_IE8po-07 zIg3p7LLK6CrG9@f17KTXTRJ=m#gZNX+eIDg^)3G?(w8GwL+9z$Ile4;V z>E(g8;eaaMecQB*Gk8(AW}tvAmmpvN&Va3~VP>wNbXTs6@u|2uqjbWr@tcR2B4UZ& zqRZz&h3O2E`cmA1Ds)a{fem~*K!~A9eb&M{e^DbzLu1|W^JTRS_LWlib-8JMB z&SMi6b@*K{WICLdKIPg2{H^tRX6sefq~Zm>kvz%-j#`9CzkUrJ!Hy~SZrnZ0W?FW) zHAtX?#SveTq|oiIh>U9_(3QKiTUqb9r@(rA$?Vt!NUJ4BtpPZL$=#0MK6R2~D}DRX za&h{umtz`}j^UUtF^km$7kK{%a|Wy^8h^fjoIDuAt|hGx`rycKP=8jZ`FL!awfL3D zI}a|IAfFIoQM<4*Ct0H?LZNeTai1`xtX4sF9A~y8B&=Bry+o+@01<7QpSO6{ednCz(eKQwiHL}?O_F0a``y+SFugb8)E_|rWL;rc87eLdk&>oJN%M_BmV8&yT-L^jz>kKYWj~$W`ITBVnDriI|iS`xR!K z+UGfQ5au-yQ8(2j=WyNuTq@B^PBc!zKh=j7yW`Q+OjK^2f*YU%ZS^t z=l?dzdxH(nWk{*|ccz7PxEoHGq&O)~5GT5+`0G$rLg>Cg31>8~Qn^sFjWw#80QOMd zH+6%D979g2rtGAGmFdcTU6|OmL>uKhOq2fVAlYixdDJ}E8Dn=)PVufXyQ}E)s@uQ2 z5_fGoI&#nEIn<8Z*Xl@`Z0}dsNtpVP5Mz(NCXv24zR;}U;t+*dV!;$bUCHY)peUX@ zbO>E+cOI=D%d&^)D9-`^q#@WbBwe;wnEKhUI*W9xn!%p85EfN@PlF?>2Ly{Sl;#J~UUEfdrfp0DX~`pH0`SNyw7 zaF@KTdPP^YzT{ERYNXKs=V5E1BISsI_2j&YuNiOQ^tXzr4KO<#c))@ zlIk))!3d}ocZC(8L-!-qgH;FnJJp)hG6A1MYEG=WMRGU&qx(nKfs6Z(32ygl6)eKZ zId=5(%yR`6*6iZ6ijgN3eVz^1Iv;U1x;2|p(I$aXI&AWP#%qO^iIy9pwW3gIXEo<( z_gr9KM4xl9e~iZO3VsO#kh5J5%6OK~3TM0^^4;e#>I}9Lzn%k5lHm+Ynzr}9GDSC~ z0dLp)oGRMo9r&-+G-Ugjy}`&vY}ggD46ApmT6AwDRw%B>PYEowYAXAhO$S-!jtM^9kl0$Jw zVgAeWeM? z??x8HuCJ5cxCVDKD0mEUW7VE6)GQDRS78x9sm3ZEqz$JK5Cv&KXF7T23~_0y3|&~C zOBKpn;?jo`$|ux%G7L>)##U5U=2{fF58-i*>cy4O2*>@l!R-kJQ{OdC?U^waPR*fL zuqzT-_3vZ>aLKZ2*Ll*W&puXUqMt)u#tyMHGZx274=w|2w@21zuQ=O4e^-=6Imgf? z5|ubfG4JcOiX_RzED28^e73lPW%2ci;=@}!mk~pD>ZYtS1As*IOZ>d9!yJ}`jI_3i z0gu*U`%Z+k0*Add%A6OQf%M)8W)OAsck@~-o8orvxu(ol<9|jAx~Y6jLY{A~{fKF< z$SK{qumB4j(t*+TGb&D1I+SRKMKW?_1`M2<15V;$n}FSU$0oe_)+^5?0oU5)ixP6@ zjO#{$h0K&+0wM^mGsJ12sG5)p**4SrCsxl@v4+%_Qwl=Q-uolxnC=hQYc`F$G!ZR= zS*_;jwhdHklk+Nk#9jyOL{S^nAz&0wuJDskXnB|nUW5dRqhjy{so$7p)ml;3Yt-Rxh$brOE1wD_L`{fAWiI9!J+ z?m7Wm^ea&yL|1}Ymt2rm-doLY>0(X{4x;;oVl{-gHs^1b7Kr?7Z#z(w6Q(lQ#i~** z&Q`UknI$=FMW3IbAiF;`Ll$+kra%)kSzzg`iX)OS;Aj&T*go#(I{8q|=hP%U}PM%Vc=xFXvWWseafdcAJ-b1T;*0q4eiV%tJiS!z9gs zR$Cr3>BER{QWZnhlUBc|bbIfdX%++6p?JIkm z+uTF4uekZWZYvhTlWB1px>P*S-Fscfwz1_9>Fb1858(6U>(zj^$up`}LA`RV*Oug< zH$sDyXslV0{H%$Sl%{UNFEbXUg;2N!W*|i5lC^HcHI|(! z9b&6KPs$f{SVY9<223-DADwnEu%yD|<~+r<+;v61#k}yA zO8_}fu8|z-H|?R=sm_V4wBxc}kQ*!mB)jz21zmzUodj+7gcOf-!dk`t70_+GF2tQ@ z_8@pW!*N4tZ_Kv7qvnax=i0@V0}X-7uk>*@ZOA3RSuGUxcjg8I0WJK#i&bkUnW z*y0H-%&SFXWV=v4_pQSQxK_|WrrngZfG030rz)E16Ft037fq;`cXQ%59Jthp?*4s5 zv67uz9hH1gCI3mG%yel=nT|h3my4sD=x7=a7vtCnLjI=5Q2gtoZ(l;ZA{E2FcoWS4PEc*%R`!YcVQhHW57V_DQ!~dnx_Ed!~{cmd+5-yuPte;r}f9 zodyx(V8P1OY3L_^C!a|~u65N;s<%q+!5?n%fcRGA(!YO%TqYX%FY!=1z0yqpXIYiL z**a~W0Y<3I0Z&B{cc^!7vdu(aI>m|41G^p)=_EY-Yufyw$kvkja}Lk+^0=dD^QP!s zlA2lYfCjWIWhNlj;J$qs7M^`f<@t@XM?~t z;B%|9C8yxnN0Ypp-Z>|yAl|j9y^Zk@kI1Dqe*3^VTSs4gmLadM zS%23+K)&E@1;5yTxV^{#L%#&vo^XH+9qOA8XPcNDA(x6Z0@fEVn!tk^nT?8=7;+oh zGD{oWSZ0`Z->w##7W&vk5Y>h6)Mc<1TVma9 z_>S3JQo z3QkZ>xvWUXqsnw9rXD~-}R>zs@M?-b2&F#t`FrxRIR7i?>`BfO}Q-Fs9xW*Jk&UcY>j!PFw6Bg;D(YCIeTGN0aV_kQQFDZU1=}r1$YIGeDAsARQj5c_ zbPP_eu;O%R^e8Mxg-?EtB5b9JyWh1`cnm;Fy{eJl`4S_VM?(M$|Ew_Z3Gabd{n=!0 zu4LvUFxi&kA*tCfAk?aqty6|yJeJ_s)rrURG$ejfRgIJ%nYb!m`{6BZPztZ}vMDHf zYoYqtP`aP;ccPas!x=Evl;7|z1f*31zb+tG8YgugxD-_8&l^rN8@=fMxxq!B@rF(@ zcFAKr#@frsrWSCR=3#FJ*>ya6A6dvSi4>#eFdQ-MGg#vvSR>HAu|k z1pWjp!0YB97(G27oB`v$+4RNz@^n#x+OolZdn@3&KMG_p!t36={1c8^1jGu(3w`0f zfP!W;1886U*g{V#6ImjGti(#U0(n zYudfLJ`(0dr#4FrpKGzze`+ceGubR-R@$?FRv_{9b$;HZKQdALqwSI=4rXo$`*Ris zXVbd!#K=#QN0cTg(l1gZkyd)~J{6^-z^jKVR*E>#C(R=Dv9?q05%xwdI!o9J6 zUB;N0y5>22tFQ9IAZ)jb0onpX)+g{^EP6-l z(jj`&!W@tPRI?kwo1E`h?}7zrU3>a0VCY{oN881#EVrN&Z5hg`&LZp z{%grFx8E*J1p53+UTI#6f zV*$q(ITNxH@IXhf+~^E2=xuvt{R#$5$2qMq}#T zwkek?JtgI5RiWTNx_eJ!<8}f_aDE^W#}WI5hsi&XB^}>sGRV-f-Sg_&zmop8rLo>i zVNNK_dgLU?#D7C5_u-HlSLH9>X**v@bXV$|^(~kd7jqe#qHWqv8^8y6gSLUgWu6?y zqP@e}Ff9I{89pSWYL@Mr%3;cO_Id(aXde4uKq2HDFGGlG`vF*jkzo}s!EH^v<+nw53>0ae4U#R@U(lt@?y?c*~ib*X9jitvR;`A;6Xi+PR5RJP4J`zdH~ z1l)Ow+;1DIJ#GVh*I@ofrc=*yS2<%tOKDhv5c zTo^(28)ufPc&Et^n-Aq+ew$7KCuRYUMgg}_Md@9B#}G_Ju9?jcrEpGNt~U&yT%YN6 z{BxS2MK?6ulvWZi5mYkEo_BWTtsmEFUVU<;`w6ekF?B77-DoZ%u&^1LLdlc5oQSgT zV3hqWk;M8eIOR%t#tKz6s0%XFiTawVXpA~CN8a6_m^qG@!BqxzEI7ib~vWWgYL*S1PUg}UBrLiii>fdj|VJJ z3BK^3S&uI<$eX^rKgK8gzIg3KMfPIX0hH?Nu?xiMV4t3CmVqK(NbHz{stH;tgQ)-Q ze%_*N<=Ik_W?m;yi5T8J%Z+)4B$gz{@oF03>a>^#>W-qx7aypN0=$do_HjN?QlEFA zOQid1g~3tLabCuq0Q*`zzkU0`x|P%$OcuO~TCu(8bW?r+AFY-NjM4|J__c~{^=^Yi zqnK7^LEFnX0OtIlRGAoUSKIRJb;;~jgqG2H?Lmz;r*@GhuR)w=RB3;)z9lZU0GPzh ztFqFN>2BLcd%wmUj^4oQ<6mywG1tS*Yo09ak1Np(OgnfNOAyTz-2>OHiBu4p()4DYF`Xf4*P$ zd|Ny22f0IAH}O~Mp63SNx=7#7Hl^;KerrxX*;s|R^B#z;9zVrcOeQZr=|_J4MWaLO zj4x@)Ho-!3FtbLc5g#svPt~xRFGC_=8GmV1MiOT@hH&#H9PjU$(cb`uay17;wdF#0 zo?amu9@p>Z#LzqN$oJ)ozrK_l0>wq2rPX6TnQ#fNHhV8pUVl>@ZKr^%NUtaRCJ&AZ zCfV09m+hQLis!CN!uG7UohP2}Gbo%|)#i1AAB%q&7Rrk3>rO6)lg|#yJ)tw3KPW>P~Hw_EqYI zZn@|T^4ySucxm3B44CtOViTZs!%X}B4QsKACYjoUj2prj-bWKlVA4^Y5uz$JY1T#0 z7?HS2X8=pAN1k+~OJbk7tR~QG=glks6!L@MGmBB3#_0=~`e{{ivoarLRrYqF zm*URqZK^v>uCO=B7w(6OJjOG?)z+qU<~f1I(}1m#;qMAhC6nU7 zUe^+N;pm{X;1`x9{DZRJzWI|fWMm)er?0PH$6J)#TJ_Tq0=fS7mu;zpK^MB9b-_}h z*}WSv8@R*@!HL2<@|85Y2-bn{=;5g-D@=nP?kG^?5H3MdgXL-iR9W`2-r+AN`Y9bW zqv5=4>-K`CZkpoPGw9jD8Dn*yBrTz0-7*Eu8Ina25?HV-A@o$5NYJbaAz_|L{*AFp zH4#KKL9egk;BkSsjM$%lfEzs?0+zkxraHwYs%*D2qs~xFUZsN_uF>9*$`mgY6NWJ2 z+0tApr*v>CXLMw6AO+jOFRr9gr`c>M}TTNTq zi(<{5Ldl_MV3HL{yV$yZ>0$N0kk=u$&x^<=E!2f86E)D!6UJ3NDJA|b1uYz8#a2Jrlm5p!uX55W;UmXg-$~1A zwnxe{JWb(PN8RmK%a3c4z^%jw(dlgr_oyAZRXIh5zhm!u|2JFywoysK?G;}#)Srv( zxOgde%~C(=k}zI5X4B*b7YCDy_a26m+cW-t(s^rBWvH8J%7JPU4r3`K(m0fm9{ z;FG#MZZpm#k{bSIJU6Vde3zBrK%5 z{nlq`-I1BVy$i`{Oyfy91{AWATzI6RGw5Nw;-a}cz;A#fTi?)N(?nYPH^-SIaJm@b z_SGjIn;S)1O_s@gB+i6Rz1n>v5B1v8<2e&cEMKQj)7egSq_1C{`J2z-+#`3Ne4Ils zJ75~KHc+0oj6+Vl*LWBzEV1;KvrhV5CwK)PTZ-JA*T(*Vcnh7qEn7LGGqvRme_Cjn z))%>r*U*$#^BD`>fDbeSr7gs!j!m`n`_S=`HMI7T-zj(eYL`fU?*)^Crwg-?rP%Si zYS5k0s3}J!W{>idX+lrj@Ei5_4jNr_?`?plm*J*ce2Fk33@hk$$s&@nmv%8Nhs>EU zOQaC}DBj!~3r(01udmj5frfJ?%$_i4njC#R@!T`Z_Vtn;%u~!@2FS{$)3P@@cj6Q0 zix~J_XHO#4LOlte1n7Z}le-`a6Bu(=xQ{3;7h=A+d;>gy~C6r$FJeI+eS(`;F-)SePSVvn^j6S3}q zb|~61Iz-;Icbop5SfY<8d~Q733&AMnb4$#V7ZeX;E!5&_L-9O+*JLDe*-Yh-o;Q7F z4z{AJVt)W0B8+`t0M{=m!M!`&SK(6Hpf!G@~F z;WQ}<;I)7E>iH=wPvSX+J8}n(}trfGiR==kK^$v|lLmEK2G%jmmAR|VAg5z}r z{0GLXSFFTv=~RE7^P6wwR<On=)cK>P~&m|*~$hx)l3%4*~bqszR&jDWw3pdTMGX{pOXUJEMrI9(hv zhtut5P>lfN!EefB_Ha`-DGP#wm!>pGW6wS_?XzbJsMuhx>XH|oBj3j|PDD7CnCB(w zb}ICXUPu=3;Op$7b+QVStXsb8E-0z=M4C7b!aCYsxS>f34zo@vD8w8}gTv%9O?M}c z?o);g%o}Tj#m`PMmT%BV8Yv%U%L0q{wQ1C{>9}u6b(RLp+8?FO;hyr3sH@+Jsy6Y@ zpJa;x-pu#%zIHvgfX*%PA-xosi{ty)$HucqZ<6-4({l=DH}p~I8YXKMU^fSsYnmm! ztUM9(@NMzyoM!P80n>i^(}CFhH|>ys`e?nnoZ?z>wfEQDYl0F25cX0w zF(~?!GN)O3@ti}-!Ivi8KR+3ik{yModRpkEn4Q!f<@e-&)kDc(7Q1}YJie@xX zhDr#{Fd@hKU?V`+@h@QhCtmkE1V}hti*n}*tcT<$q8c<%nDb&C87Yq3U*&S9% z@gUZ_>#M;oQoM3+ZK~@?(2!Y+nSB5~bd^T&-+p>sb&hKu6<9YeRUX#RQez|g20MBifXq2RO%ja}G@C;@ty^U~6g*SS|69~eF6qddl!qkWuHH-nE zzsjW`AsM{~z{L6OT?0o(=})SlZ`jo-3&uP|;X_glQV>%PKHwT;X6ta1xcZt#HiB)` zPJb#SVR6wIdM4%C??0i%x5R(V&h6bPe;GC^ z9B^99Inkvcoy??lda#i|x9EDr+(XDGWLR#U8?oJGiw1aQ0H6>zHH`Q2sh|qS@<}1b z3^AF@Mf!?zPm0#GQw~i0cACmU`R5DGcAU$rvF?veA%jU0%b2*h(q^qFv)2O`m6Sfd z%`xn8R}9<=BijX&Mt@FTdR?UrnU@fDofMzk7~gsSn`y12HZhXL)L0_xb4&ZS39Xa(q;^r&#BuxeobEu@YQYIqGo7|OohXs_+AplS zMJ9@)53{ERj2Whs_#^J96++2X+NK=k-Zs)tJ|Da#!fp(jaBu7?#fhz-OU{Y>0eKT* z+(C&&P#i6DOI?;+Cahex4HZnXKdbik$ZR%rK6k@Z!MINsXnmPzoe&2*)Q1((Sl8aV zJ7R0r+tZz>l-0pJL_711#%rJX{8nwHyYC=h<`79Lup7R1^QaIoFwf4ZJ!YA58lNqTMF^5?Vy0I0tVJIPnNDlE;n<#lxBz07!hi(}O37p;w>c*|6IQrqFqoFH5 zC{%b24qBeJ*hC1VU>0CBcWK=l6XejckiWQkUr{JbN;66s%4MWsRJN@lKEpac)eHRk z`#`%uOpgV!GpllU2Jj;Wo+Guc)aB2@+iZ!GX|WRtu8_11{PVwZb7)C==o5OOYGDH{ zPF(I-zu$x|kFI>hlMRb32rWJw!<`Wt?!| zpX_Ipw(jWs{dbT&zrgZ!l>lV_-6!>N{q}9T=|)rc>zLyuBd_(_lR=o+<^094lG4fN zIba>S9o;x@YfEPRIFa`!U(;#Yo{=*&ZmGTQim*qs1jEh(o76iOf6?t3a*2H$bsl+K z0HGdjU37-yPRqW|kkWF#OX_Y8%hYi-;}4mun~t*hplRm zpg@wTiA()yOQASUfZryS|M6N}>L-8khx_FgC$J{lEMVzxHDvu;4dV`t-@Z=Q^rB-z zmpp$Q);dUr)1HtpaLu`vrlGn)^xrG#6&~$2ectl6g^mD*3&|8g_CLHnizWZ^H@w>< z`MOr0q^VNvX(pO5vHpgB(;aq{_hAJgP=kHbevJI!WCSA~i2?T_kGxSINS{adh^`o*UL;u8zhNq2d4RG3KtG>IIFVi z0zEU_#a=z^A^Dy1b-_lfV!qFkvxhj}T{H==lYO+};|v{t9c(MWvvfxX(FF0Nq+B+b zk=}=8X2nO8TZHE#to;i~c7204O7u8-6g!GVDzHI5JLo z>zRF5?W~D!DfwGHEFA7=;olT;R}KG`3o$V73^>1SwK-DEHz${{Ol1xV8zl3Gn=*Ka zt}%X}xB8{FuX^*Yno{bstmU|qkxHu$rOPMP*qU|Z-PHegH-U{Pj2%o+DVL1O2ptiBM(Z0YyQn0$ z>pPxP4+H({&+IWw`}lLXJ2@qm6Tl=>LhLfZ^$YKNWwj;PhV3a~tt7@&i>+~1Gh$hPy=-VVzzbfRDp0+g`wfU>&l{pwjfkmHr@GLm zqE)148s&5Mh@^mQi{85&txofNh$u5peD^ww?@5+9yEL9>|6s$P$E(YLGm9uhiP@$> zq-#pRDYdSOzfWaa)^a`NGGK;h)+yr}v66PZo6y@4*K+w9{w91etn2N`_osNW$Nio) z;@6eel4L0=FkH|6*MS>Lg?gxvo+}=g1=gh*-k#9TFutKYOV%xMw`5-6|`vE*HJ=O zJD+IVMQz1}nu?;By)!{1eEb|DmLQd0p2TY4vkMTvKG!9;T->gw_B%O>CQdbcoPb{p zs$1IT%U6x`hi*>TDL+w7b9j=#8I9-8!%Nh&KcJ)~H9S%rjFLf081mJqfr^Is_rgx2 z#P5Jmrrqw(*V<9i2uJbBug$_YUX@hPk#3yv#TRe57t1iMELHrwTEd+O?ui1?}wh7o-`r z2lX#>!)@ifPM)WW46(yHvrK=UUbt{fkbH@Cvaf4lBT z;Y<8ZMZmOz0OGA!Rv)UTz!dG?o{(Yh^b`r)ds-nWrB$+6tG&3 zfpw2$tv+?UwdmXy6?f(H@Re7?X&T6BF!raDXB^eV`EKVwVZjqg)2WuIo?Ez^m@{E3evEjJvVV-;8W>pF&YkJzqB!@2o zLh9!6Lv8jd?hroXXUTNCbCRs8!{=)NCFNq@GGtQC6X; z2W`zRP?{x4*<5{$x%!ClAc8dWtRwOG$@ewnz+&XL-gv&l{$(7S!o)K&iCSiWN}&Ss zICPR+4BO3rD__t*tPtQ;Z~!!zz6}ew?~f%ndi(*GkF`kC4JF<)g3(W9+XfsKiwY9IEkvo;0x<^TNh%FVrDe37 zaB)~4E}%bed)m)}uEM7(Y1 zCc2SlvK>2wM4Qvf5c|mi%?C(bZp6b0XY?prY>P-iCvDR#Ahdx}uCoBi1jnm7Pd*`5 zGrxV^6P~17U`ux608Kt-zVMi@;vRrTIo;r%p2t#qqGU-~WaDtBUQigomIbX}T zB)qNWbrmHKo!WS_$`-A?x7O%jW5>GEUIzlf3n7oQq?pjLs(a2@fn}Px4Npb4%;o>< zyZ|oc%6Y&yGyX$!Wn`23MWBymAYDH?a?TXyFa-$x?j}Jx#d5*wlpZRI%`eG*T0kze zAi=aol(x_BJ&v6va3?v0dF%Cp$aSz=W_c3Pa=N(HY`E9C`^fuojn;VmOMtB!AOy9x05DQLuU)Sk_B#$eNmx>d~HBGGp^n z_b`_J>{bV#krrd73hQmoYzdpQhD%*}NIfYLhwMVAjVl4(a4|VTy_h`K+ zqslB_KBE=SILw2~{~@ZUEQBs2LT9j!Ow(bAW5DE^Vj9`-7duAYQLWdQ5nke0N(QoX zeoeaXR|`_-y=}{}8+EFqkqAcemu+=Oib8z^{~hvERPr@mv)8H@ERt4XYxEFl_(%5N zLo`VRtv4D-ZUu5(T>_k42#n9JINwXK7#I<0#oGFjEi6x4jm%;!@<-LD(UocQ#U`$D zUUcSISVz*pOM)=Tnu9_K5I?*x>2qLX9q_yS;cV~k;IPLZR<|1%+>xdx8^4&j3HQ3o z{!?Gqa)MJY`hsIueUmH>EGRSQHpOn@5kE7;^x`lWClr3u=_C_LYZ6U`A^R<->9Wp} zOBbVrqDVDsDR(o7NGFzHtMvzSA=iI2FRvY>!(&Et23^7tS~P(1l)pY_m5dJiggRP> zlfiHB)*HeZ#MF=jkMW>VrRRv2dd5+S9m8jJoSMv@p?|?8rG?fZZIUa{A*Ubr^D{Gb zNP!hut)LwLoS*p&w!ye}qEf;@$@X`llIB2aC5y1(im}7`u&u1}W~XkR9#F zb#vtIRzNb`N02y(<`;8NMN`>Y!iYN=wqn8X*!>#1;>uqc_nk7nNyF^r2dqDe6@T_W zhj47!Tds3_(&*;a4#eo!s+@Hj3MBVk#_XmflwPv$>I0i=_iuC9iAer8z41o;EDiR0 zK8)aB@|xksFFF7E-pKy~P3*>L-UzZe<4yL4psQOlY2g2I*gttit9)KhX^o)f!nxBG zBI^UCN_Nh=ORe9(>zo%m9X$C#|1TiKP@||@M8x$LUyWv!EW#!Jx|N`|ai!hH@9{Z! zdy3;;pp^c;>S&5kXD}+xdstN>4?iF?e==XtDm=#5;x%KgK>h6D^!GF+I=cP!w->>^ zykq-&r$X?8{w-W?Majp!wp-pWv%U)rl^pn>uCrvYX{^gIb&&jH7IRhobEZqEahIZdA?;4~0)6tA(jg5T$OTzQCR=oqt zwtM9L&V0*{wv}2Z*K;OrLSwjd-RurCapWj6TC_ z{v->8u7|j9Pz!Ug+rRTs2;T+VHMy77`u{=rih#8+U#bWK!c>8{Zjd-kIkkt~Qq~90 z^9#LzhaSe$R}rIq4L{q%o}!b$cGDBVLhu*CXCjf$HwLdh@aD;KaiFZgDSEhGMF7EZ zr_U_TWHpe{tHZ7`XikTgDgIwlma^p{cG1u0ZxV@ZYJxych2^+FeoH20S!Co(*XDZANZDmGBg_nktPGb&B-mM>_5pioY+Wns}*>syJZvFMb4;MPaey?YOnc zDDTNuhSsjM4&+;DK6D>R`s2=i8zLuiJoxbSMq&dk2Zs9HW=E~XX0D1ir{0-|AUr}W ztCdk6fXY(7MAKHP;gHuyfg**M^F7q@&s>vT%flpMX6H-MYkM**Nl)B7VZG>MxmLZl~}lF?=;0cPDxUERGl2gQ;iv z<9-O98sJyYV=ql*%7>Q;qcMUF>xD%h%$Y=^8OaaqE_kZuJ%YgknZpHgt1Pv*PtFhT z)bX;1GpStHB3VY=aGO{MKB!ek@z}k*yyi3BV|Lq!t@(Dx$$gFB)Nt|5HZU$IPKsh! znkNtOA_~|HqY>SQv|ED7s$rKwCYd-?{cw{aq4omp;jOkPqw7=AUDZtf%DmFWjkZN> z9;@KpblNDxtMl=Mh`#{_Or+)JIz%+ncGj*@ znm{kta%7O&=H5m1KDIFyBl7jL9*}`87Sk8BG~*xf_42BUeQz+2V5OwqkjNW*4n{lPDTt*u3;6zm`ygm|O#R0@lsLAHcmaX{d={be>?cIkMg=slD+3EpF2JQprHW3%#HHt<4(f%aL5NPJKB> zE~_e`CoqG_pz>Wn=Dcb|VB)>8_0El{r~$uec4^j7-~LS5pro)N?gspc)T_~dNwUM{ zrGv1YeaG5cbf|6k%QVa($wxlI$fj0_gCj%&NoE z&`Nsx*m{|{ROv0V#61b|6)fBiOE#gsngetQD_18!UYGDdvBfkrdK6Si6=v;+Wx~pR z>@r2~rI7yA!bG;0#TQA~BvmslEPHo95+?!bj>7HiNi3J@EV{3ViB66PSjxMFgh}WX z^mIMPVf}t);?d`2-c)j5M9{;yOuZv}L^iH@R5_YKNJ&}7g^;oO2WO(U2A7+I@eZn5 zT<#3-Y}UYP%r)~R%?{w{b2lZm&S&xMo;qc~0j7_?%+Y+VS(V@Fi%Wm|%F5CK>|iIY zyk#TCqCBw>Y{V@X;LznDrGX3+H@eFg7QIiMK{8N>|ICfdv8WZUGw0MN$QYktcQBZw z%mvehBi#A60U4=!`!7;8ft%;zC|u9L5TTMZm^<`2GNwK%i&emfv=-^XA$(O`W+xZ{ ze?m?%4H)w&Onqa>Mv{s~(B{y^#d5!Y0f~k43EzX^_xCzIflGg&ftrz;vsL~48JHM0 zQ7Z%!IUh&efuJivP9wHgH(Om47XiU<5_T6kky$+3un0hWILU+p1H%o{n8%e;f|r^ta}DF+;IswcoQE6v>z`4##(SKF%)t*wO}g zC@P8b!kDe&%4)|DSp@Ma)9SNlVHEzN4LkRBB{rBm9rLKl%~@cFS9p6Y`?G7c3%jHY&NCox-{*nYXdN1 zU5v+mPl3Nz{u?xN)-EQ-)C50^qYg)7`sa1tBlYpZj3Np77_Ipl z^GSJe0-01qB>^-VDgxEgiJan|Xxa)-CEiLfayNeAQb8S!)EcjB%O|1A%H?%w>%3cQH7LIgh7}!bj8bVa$+KrfIf8P0Lc{ z{M35Nnv1Mqlx&M?rVBl{lCpv?wB!e3x+~;aPlWyogj4dU8_T0OfWphKVa@#d0WOh~ z&$M6gxRQ8#yGhhlGi8-ADfrq+rg*&!OidO$rj4(VUGg3qCRxi0=gTcFGTyZoG>acq zJogbf8pPxbMSmap(=vdqWorcs|Axk~snGDl14WDydN}1uginZB{H0S9Wk=PS#iM*6p!cAc4OT7reK6-#jMMbT4?O?s>(8k zoRATRidK{bw8TouX217X7xki1$7o_p*z;q2TmqaxUO@KlySOQV=ZPr?$=8Kg3u_y7 z?#I9#p?)U;8zd{n^>37pt?*b$RjbBQT_QOaK9QMjz{ZBao~lic_AVfv#-Ho!!hfP( zA+yB2V4(j*|6QoA<5$JQx-iQePB#dKw~HIS1`!rSED-)=()A4ohU%t{o1(}3A@;+? zy3ruVZrtM~qNu~Sk9_i)O3E(|;1t2-ux0^sw`;sjxH4>hW%i6plnNEoiuN8^|b~?b5#}T~|Z2+d?CIVULP)wCxGhbP2Zh1KZth zhq-Att&~tpiNLFsI$)qa@My;BG|cbIz$cvo5pr~}B~dA@gb2FQuiH**o};)0zj9Ny za`%cEo^Ld0zEb0eW7}Eoj2C((HrDtlzYqMsrjOzaWcH5(KFs5uwP*`bs;t$@m@I4& z{9;Y4n+({bEEq+V)ztkso<~m=M*_DX{h(t>G^L!2^|K96UfS~Dc>(jcn2Vq7*fq~P z--9qcTWW8lnRd3ksZ6PS#2m;dGB`w`0-QC@=De3NR0RidmlJ4&A z?$~TabaFm9%Z%IQxQ~O^0J)c9_#IliLEldP8JhsL-{N zHpbd4Cd=`B7O&g)-nQkij}IC3Uf?&iDWbzoTTZ-Gz&_cb2j6A>zRx;(tKQdPO-HN( zb&lFrYf0x}u>Kn^K!A{=xBcB;B852jzGur0Mn-KVx^cat_TgF?&r5+GeoWuxso;$Z z?e@Fod03%@cNnB~e-zgcZE(Xfzo2oN?^~wy3;^4wX-O^ArCRCLQ`oodyw|HE-$-ZK zZ6FiH21w zAZny&Ub~C)2&h-Bp65!T*<<%b#A6}F;${K5+=qP3$GgoI>j+yz#8G?qgG+;K0sN*G zN&GwPaBC@RAKSRg2G|nN7QHQe|wTuV9Ujc{04+5`qijJpNQy$sr zghh=H<`02~4m#n55pWe+$lN}!eSXPd;j^5_CU~)0iuD_+%}{Wk@=Hvqo25ffQVZjF z2LJEzo;1f*84RqwCuPN$!&C!bWY=UJu9dyt)+3IxhfREzD)VI-el|zy!g0iZ-FLAN zWMZ$p4?|RpM>m~N{RlBC7u$F=->EnSNm-skJh!CW$%zub>?d z_0iR9J95x*WUp~U$oTx!9);~7H`I}-x0IC+hukt zJ6w9|lpMy~l-u;En>)%AukC^1t;a5t+GG@*aV)S9G9$iq2l3Xqbgc=m7E_96QmYTU z$ydo|Jj{}musmg8(el!%?&|kLwZww-w`g)ul4H_=BV16Oy>akJW4QPBEknRso5{5w|b8s2X)Q{dpjvD)V&!fCF_hK{2?MjYzug954BvH6r@ zzHm|zaofCEY;rNUSi$J_{cT;)WKH{G)nf8kM~MoRI0eh{LJi4qwRyD&5)UEv)FQj^ zxcnF`l_l*Kx5V4XMV4tc)68r@gL7d-_qqVIGXnYFF{xk3F~*Tq(^vUlCQPs0Z>73y zI|9f=$s`_He4ZWhPC>*3;s6P&gHq1U<@11?-Ko3&Ts*m6N{{pF#GUtMUj+}}_V`@s zoq#moKWELbJfe=0>F@W&P+>9ll3AKrt|!$eoAvC?SeD_+*vQE3cT^g!`1XEpYmAlN z<;F3vofUmGCSWsnZc~{bR()6f4ZB0C3Kl@sDWGQj8#PIBNynLEVfgC+E9XvV)!5dk z!`O?T>=F_E5!T~uvByB9ASdjT6fr=9PHJbAjHRZHOl9TO95ReMR4*)l&kMJC=mklf ztXCmiHfE(?)Z#M*>5$$ICwbRqdiOI!npH8)bH<9<0c-nkWA@~K#Npn37pwcz-X9vO z-kHa+i#CX#842Ej6WEyc?b-dNIe}i#hZh1qn4j|yh;;Imf?VP}onF0S&1ok^hgteU zSvmDxT5|#Y^^7GB`9XoJ)!Qm*A!QMP!i$n~Sp9ja=yduTZRbZm!FuQqb?(iDF*#0R zt*`^)A)srqcE-*tXTYIU$GIe8d3&5Z#A`%l~(0^^FAX52DVmYz_Jr zXm?tnQM!0Xm_DbNTm$_!l@xzKDw*pzlXByQ(r0*QXC0JJ#hz)&_ce0}&(U^u32BnI zZLeMm9Ag!lH^7v|Q zy`l*Cpwd5qshr-jb(F&ISa3R~oMBQk$>UYJj4bkukv52bXVCZEm2t-}c=v&9Et^%B zPEaJlx`ZiqKKep$D6@`LH=FRa#V6{ktE}~Yv;17^+>9CKMJd4);(UU@Dje7)r?x<< zh;kX;Ea5aAW#b*lB8yf;mQ`&DOo3LJAG@}Z*elVTn1}-oKa;@syV?d`BC`a~2mRbu zYqT_^l-zx)=RBajyS7}Mn=~kkTg5&Fg^EV5AO^E*!O<6P!ayb^bJ@qu;tR;AGOTyw zn$vnZW`>@V{M^s@Nc^}liMXEBazVMca;i{Lp_GqnkD&~0fa`=+Mrg3y{`5pvls3Fg z`QCUchIiG`i>X^hoNHulM3X9qiE_Q2o!D>sgG5wlQP#fR-}$WNeW-$8qfbixwW96a z^b<>e`&0JIZDEJAd9-1}c^O-aDGg>DX^7qwsD?w4&IUUVJ4mOp;~3kA;|2HyzVsJ9 z@6;t5?e~!N*Jc)WY(?Ii?(tn0L7v7KbeH4~o7ajPv((jYrmp{zSy;c0ts8Xch$m!G zdi>w~`-%g+1YTH!@;6axLB+?_7ZVC@Z|FnN5Qf!LsJ9~fRk?HG*9N*sGkMN}a|VK4 z+Fn_I+V%7Ob*jDKBo@Tk6Vd@3qdT zcl&(iH%|f=tk4f0<2q#--c1ajyW*1TI%7pu5El8EM1BV4W~Y6Ec6jfS&HFq$l{FrQ zwX>B((b6q#GC5NbLeZi-TyihH#=Vnr4=HT!rGxQ?EsG7(o0qk?Zx(Djwxe2F!SNT( z{kH%Kt{P55=Q2T1)j{7?q9)QQoq4T(Gn3VGT&Ph!;hO+E2o=B~&JBH4SZUD}ksE14 zXnvDgtX++`H`*ic7X9j~71Ck(`zUtW>Rqe#fimBn4#u4*Y7MlDnUwyz7zVyOri+oY zmtv^}x^dM;n`MEQwoh>&jaC5BN7KIkb*{n&JxG3eJ1HZisw{%kJZkH;1VKzQZTH4= zOysYg60B$|AAU^r!X_LtzCnd;gUq})$bUS-oJ3_4MCpyZHBob#?&F2ND426G8+)Ta zD+agni_+Zd*LG?yUU}Y4H}JiDimuRZkHJOSxtdXL=Z<8n-Xr*0bl;g|Rj(%z@zE$;khPU{v`pL`jU-?!3PlPzD?!2>%?*&2K~AuEX<4XKo@k4Iqb+(w1y) zbI52XBVywBaK#nojz#zKYrKu{TTx`F{t)?ja}O935ym#T^|LXBKcH0@AOn6&inasQ zC!Kx6ihG69!Xq3yj>f0U_2-*xkI`hlOJo|cv!)dAt5lCybuIoifg+2MG%a3om#-6D zyemzRLX_-}5;ue4G zC=3~8lYx-;1?zY%B4qKb9uOb$D>}vm@A{?C85SGl0Dr+)!eII9+qbg0r5UV>f9i9# z8=XPV(>hnUF1#HN_jd{2C_(xT;0DiqNXJc`?$h0RcI$D}lbwQcY(dyz1#ftPzb>Xp zF;ZVxR>D%3sS-0gMVJJ{nYSi){3cC0U#(r8uR)#5PQ0>pt;us;n(k3%5V@bkYc#ocrhFzMpI!9w4f* z{WML!7~2js^Z@}6{~4D;9y_&PE+=!c!y;g#d9~QHH~nsWl|XsC2dg z1CYb&rClPLuY6%MXb-YI{=A+%A0mc&P3dfJgr~5yX$#6#?^&&}Xg<>0@n%0CH&mLT zM2m%iLw<~kl*9H&Y&~v1-haO5DecVak3A}re8=U;u_pm)ZzRbXaLjX84mhr>;-4Vd?SD#ZO-jxM);NU^Dz6c$}Og{4{f zxh_9jmjr)3>6!jC>hlEZk<>Sienp*xibR5njtRt1oZPsxW?HLM-iYaT2C-Y;yh$0U z`DV`5`vF^H3%2`o{u-LUNbto=w*rgtSC&ZB_!ZvFEl^|0H<{rydsc)8Yw8fY9`6@PkmvqkuEQjgUam;~$vREerQQks#(E@LS~ z+BJ=|Cr^i|U)&ZA0K73o?H}H#8b~$%7jN{4QSJR-ym2lz;4WVSx!@u-HE|rK0yaS5 zGXh78R;*~ptBn<>=YZ~<^wn*#zp!WOO<>DLB|ZL{rkLUrIugUr7^kLKTnK=sh#@7j zEm7Df&qr%4sueIMX>5HlS{wjebEz#e2ZDFR=g2UgPQ(@2I_qNd^M|6?_n-zsR(C!P zqfMfB3jCnQNjB0U%PAAvNcq(M@mi5O%C)Fr^8wnnlvg5~hn}+n70}peJQ7~hV&WoN zfe!UvZbj#d&|NCWf}?NqLHd5xuS*f{y>5mfLVLFByS>$Q2Ac@cvMn$@}_q*h0x0{qPrSsC=$+bqnPnNbFKJ$(!NQIUn$_m1f<~nQE8a)8EX$D}M zmq{*J0{xY_sGZ56@4GL4K8W=(AH)XQTP-pG)T*cP%e04I3hmZc)P|>3Bb?q3%F(FF zX{51TrB}`zAM!%VP5s;|zX3cJ9LO)0OT$qB37|+!-SJ7gS&F-pD%B>YTN%H@pb(qjIkFqoCTU5eW1q{Eh9!efs*E zCSRCb>jwA-X{Lu&E0R3|udoo*AY7d79RXpM(K;y!Bb%y~g9c?_l3lyqx=h z#X9>W0;E*gL6r>PJMhN+$%Tl11ZjIn*R4O%)J^FyAGQE{gp>3!J$ip=c~MaL9!cKM zgOm{LA$1Qz2H#lJ(2O$daV+WxW2`cabfWiEwxb~1XyvFg>*bIzfI|^D;rpv&8x|XF zxkR<_iT4i<9A$w}9iN(Yeju1PoRgRy!4PGsTY{I%-Sz4-d>9;eHn{`LUgdtRFiPKI zV%J+-ld8>X*K%8MeX2lj@Z6h=ehSPT00#f ztoNrgCZ>d!+T-n~9nawN=ZnaBf>K8zkEE91xsUE|n$yTA6^NR9lu2HGs_@nvWRD#0 zOP6q{(naA+cAvE$g5EL+pFK}xQH3ZNT{NjH|7f}f((JeyH9Iu}MBFjR+&p)jG!{R6 ze7a*LLzaQ8dcSHK>Er&ig1nvpPqb{Z5eVPPwTMVZ3+UtJxTj%XT)|X|)T7Vl#XF@P4B4MA5+@ z!Mt-)*U=?ZZ=f~vXm)b(=AL@cNVAgpU*%%EnLz**66&6Pc=YOcUooqB1i3N_3p@5iVHoG-`^|-woj+gdD!qZA+d@b4#MBWtCs_{N zq70&^Z~)g zqjRcd4W%nqc`nGp+vC<4LZ<`C$i8hZi*DZq&bCG5Zpw%%^aes8HwydUHi>*VVOl_4 z1fBgmNu|9$cNCn*4}}z6G$AMMP-{pU z1VN^!&KyQb7Qv;LNM$}9`vw)Jet@L$FPx$M)2G;+FvAb&q`vee0}a4`60sxY_AoLT ztf?E81Mqx7)UXOjDeF_$Bp664pQT2K*Be8?I57Jyx>vXz%iiO*Pp$j6^qZg`xs>iL z+2cMJ&ijs59fzD9fcpgMm1lf3GzX{R%T0DUP9I@nq2U`#7vy$hFKn=7JsDAO`Qm853;vwLahTNN4wA4+iGk*1muR}x)S_qclQ8XB?_f&S{ z8C9~DR=RpZi9aTjXf_zf5X{L%f3Zhi-o9!J{b`kwX#H_LUu0SUiMMQHXE&?9oa9u8 zK25w%ll*ZG)agDY*S>UK2YiFQT!Hdtk=gT#FFYQOVwImTkHwse#2>_%q#%ahc`RJS zK7S(L2VrHXpWC>~{AEoiQugn@AMw4Pn4=sxo6dNLT|0$N*JJStL7g8Cem ztg|`bK)(pLiYa4a#GfwsUPyIZo}G?Ue6YkDdaz=*6%58Ywsqg<*C+rYo@6EBZg$Q= z)J{Po{Ng)Xf$005vo=oe5599%&FP#nDi;n*rt~Bw(dvNBPVd^p+8>O?XANo6jSDsy zRcjebF>2Cc60ldCi|ySQmiayN$S)o~bhGuI^8e3a{D4{vZu8YRT~1KpPNQo1`T4JN-AVLMAW}0V4n^r zU&>ipJV$8Es#xII4(|5%D2Tc=?%3j3r(5OV)|%jdDe(z{EvB~A+@EuB)scvpj3YIF zd73$Y%0^D%;>PXuQ&{x?58M*R(miX?;@nHS9%Yf*B5`dct5jOM9D3H50n#Vn@8b5zM!et)AA!+>h#p!>801Y&oj?3N(+}b@70x`70qAG@sprOpUr~` zu#iD*w@aZUxp;eV75(6#s$U0-q}}6Q-~(q>{Do>Q^+4pqiwq=rDD7+uiBMKw+wRy* z7EhQlLxjI)Qd$F+GjodrD_*FX8H%VXy%LkJIS{M0db8RYgP(2lICANMd|oyWnF}oB z4WFueSdeJb8rX9E-VZOfRRBOz?+bcCs09ze?lN^AStAPMr5jDX(jfU^gQ&`o3=3+TuNA9illvSlD1Ym9&*7E_Ps0 z4RTj~87`^){qjkI$C&q?(2B51=YC{%f)?kDF>AJAnhR#`z$@x}-U;JI4v(D%ZKYS! zSV)Gf+vk~7o!g;-nu)dG_EqG{)C8_~mE<6+arS}TNaIf(`@dATP1_xeZa{qe0gy9B z*{4!d`e@pcEszR^vNGEOX_HRR)*sG0Mpr;`(tH?zdwkMqcsk9fe|7d{f$xAa%E0N1 zG5U_{e>&5@mp`Q(i@osc6{zQ{>;z)jutiDwQC2zjA8FG9iw13%`P6bOMl-Sa{N<=R zCI&Hu9UPF9YMKp5>ZTjT)hu?fj1%T$aR$tYFxAP^2~!??+D`?YYT+kuRSmK)y~G)5 z%ZBdkufLdL*AUpn!52|RW%}(pkolUPG3>w47wVNYXtA-_4zV!D)F_Fg|N0-o*KVH2 z^(*zV6-$j82<-79i^NSb!9fM4E?jnj>E+M{a`@^j?F!tjVhpj*_S**<_ERn`|&h$NE zVuP`%Zhy3S9Ud267B3^G6rtC+T#=T~I?MP@7iw2u%6VY)Rl?Odn+zIRLtzQqa|#r_ z`z&9`Rcm6gTvzT>qhIDn&-MC^aMnhTUn7mGa)4g&Ub+Ml0X%rI~^q z@V~}#j3}1;o3ARx9nSy!%h>GRVr&%qK1X9!<8qLi?Xu6P#*kN6D!zg#<-hUa?+c5p zu2Q;Hz~2<&Wxki>*A*@tYaDB;W$Ro}V!paYX4IA#M5-*Zu%Y#^O)?QFuis8OyL|~mq|HKz!uyhAgx{uEfPKX5qYtOhc><)sT zmWOirxs=9(XN}OOcy0sDH2I`uh@;I=lr=6FSMJ>w2MK-GH>JB}U3OK04j=%>VA7^C z)xrmgxbEjh-5h&_`3MB*w_-1^w56>~R7F#y?lC%ndO84zn=O=yU% zLXAMK8{G#4e~xv8IZTV$1?#7k@gjlP(K%>MSIu%bOMXe=cNT>aH4XEoEs_WCg?;k} znpAVo`BYPwB49wQc!!oCyJA?KPHDJOj)kAEXvoqK7-maU&tf>)#*Wnm^h|3 zkd?|>5O(rS1h`UbX6t!NewJBP&KeM7TfBABS#Pa9+iD|0oqlZ1vX(kFZF||@=qlgG z2Lg5{P^Gt-;FDj@8XV^|pEPiKLsKMBYbeP*9({Wsen4t8gX-6uTqD%4uu7cvm&r3_ zR)8bc2->Dux1PhGKri7%NzHnIb{(!~TRS%Gxii`EEUSAk2%;F9$>CMZl>tQe zbWL0^)b3Ay6FJR+X~*fp5)Wh<@C<}mJ*S>n$tKb+&v0w0VL0Iv$mwH{=ysSk2bkVU zC#OA?gs8YGPWNKSpVSyuih4+2A;gO(co@`F8+E;=mg9#bqOs+!av_T-dD=0`qpKwk z;<@ieVgGJPhy6a^vsm%|sbarQWxVQ)+kyZ|u~UOe<21{)p0R`0)}rp_Hz*IUMSb0C zl8FgQX-mtm?O5-cMsmr!#UD+P^E8por|mcuHgbrTQRB&fa5=RzJMuBIM98=cP~r`P zdMKIR2T3f!cXiQi?(qkPi0pPwTpU{DkUd~KguKGpGOB2=qM$#VU;o@~cqKg?D2j?m zX~q1jefe15@iW=s?)cJ{{Qa@d_RjqFH4H3KxW;CECTVCvvCtVxZEJh1ik(S_Cbys> z$(MI^B$TV$@8v)^h?5Zi^5ico5ehK+8WZM+)B#bIE|UCy!R-4i$HYRas67~1zrw*= z25s+b3uIk-gu{WY32jw;SG&k!y%Q%CYe8bM9wn{rW|DILty6ncmQCo~?;oRt2H`i| z7km|j{p?8`3+gTV$9Mq1F)1@V!^@A+Cyo1J0bE%LpL264c>)>P5D~8h;gk3VM7eV} zKk&-snqZ7;IoiE{&ZLb1C4K!_PQ~K6f2}y;j-l|~*ZN@Mr(hwlX@OkoQd}5&k&VC# z;AyK+P-}_nZyKdCTgc%rFSH{0j~=Tl@;WJQg4hvPfz&gd_1{On_di*ud*$$W59o_O@NX4Hj_Vw=;M6)8EbY*V*HQ&F#J6ZwDZ6# z!@^ls>E}irx~}3u)<^~h4hoC^VRC_CJ{XC??Yhz^-RFj7^4NB*RNZqM-tT5DCA4F8 z2m3_{Gj$i$zB~WO>yIeaQ1wKf08Z4wB)pzt=+OwKR_yM{2TC4xB7xRaOVC%kYv04YVsf+8_NmYLJ_)PCv#Bu*U&9*tb~ujlj5XB+&En>I;ts5iaLnn|A^r#0)QA^D@iqWZPWS#3!s@9-9B8W-d^l^HGU-;LUE^CAG04Ux$6d)&+q6n;^Q~LnFa9Y;FY6LXRsEaV#`!U* zJX|o)u`*Bb@Q++{XlF4_$`mg|R@jSlD^Rduh&C!kj}=vtPT%{TF?WQ4Fuj;bC&~IL zh{)lXWb`nEJFLL%GH)Q`h{E}Q2IQ80?L~~1IBP+&0DZr9bZv%GXRQbqt0vz@X!nq* zy$Q?b1;}>}X(9#$<*4Ap$d7I04Fu|5kYPaTR|KyzBzr^Nvh7&J2FO4T6I}FpfuEz@ zc?7bIVzrECGpWeJhv;pjtK-+EElkI0?|Hd4IFMJo#_h2Q6>{(IMVku%QS26HYGCbX z_e}<0;b-*TysjYgz{p61&4ZpA;Ern2`C&16Ukt57KUt{uo1|qbqefFI`ZN8j7qmn^ zd+4F_dmn5wILA@1Qgb>6W^ri8G97C4Zuauod0?7R5?h;=Q9R9!nuhAIWdWm33iT$_+Ca25?rL`Vl8h&WR)VnCT-kDP z>LvJ?bxj|_BpO) zM!SWZufK+)X#);d0$!az%wcYr_SN0t;FcuZ5JPijbe~p@+Q@OtnpVOC@XsL3zf9Sp z0V#nm-rjtCG%1k<8``!4hRC#pasED%q=ZE_h{fT&48%D4Pwu{J3$x5Qs);a8aRFRIkQq$!BTjK zp5*O^@;e7rFMaen{K4)=EIv>@(l&AF@awuMheEfnik=?}`ryksA7k+JfA|33OeBZV z8EapA#ArS!X{%c{v+($~d{wl#Qoo>~bM4_ak0IaZNN+ylTNQLtlulabR^;l+TO26d zo`qh|evi#82vZU7pM&kbFWPGJx}|ec=k4le4vosM0A7z9%$k7*op#rcr}9zOUn+}- zEwXhT3?3cxF5Y|}W(Cyp`J<4Dks2sjB6eu8bjZ-w(P|dWK(L7;+gk~nFWp$eeSdb< z&w03mP{j5QqKvvX&7xOx<)l)WWd1(>e>grSQzGi%M3|wBJzX5f35K!HU*Po|p=6T= zAYO(3BVPZ2BAdj<{{~J~C7%{;b;@wmu0L(6w+{y4U~?+g#kR3IL!Epea{%3Wx(@wz zx+J8AtU1LwR|Cxo(=>m^8rC>rqXS@x@VGUK=02NciLN2aD)`Iq7`EOq9C9`}6p{4ov3YcI)DuC-EDa(_+b`j?EVi-hq$bd!C?EcsG>J4e`~#oL z0;oDRX(X&|RLTxaaF{c`V;deA+d7Y}y#R{)ZNJZ|?zjZzq^Lj^AFhDb`J<{wg7F z-j)&S-o)%zXJsLx4GU=R|NM3VuTXMMdbAS(g!*jd%$s2|yuu1TLGo->O?dY+k%0Zq z&F;J?au`y*?oO+y!@9_zCv|Ktp32s0DuM$2f-#pvLZrEdf~EAiwpHnjXAr436Uuf& zozMHd73b&VDTA!zwUi=OB2Im|&p6(51*yb(_sheeTtfZ+XoJ|pz3y}}hPH{v{7h|w z$#q)7{Y&*7K}Uh>Nh^R!J|<@PVD4R*oiE#vM>iTC9T!oDuyG|tod(;t-eXNBwHv;j zkYy{qs%L%p_1A*%kGxmQpvv=MKPl|SqlpR>E+z~rC?~Pz(x&?fqdB6@Q#Ti+MXBD0 zPccWt%*x3YL$yf0^!xm46}?85?&W6_8Yqx8L`LOy`WRNx9!u7bN}NfZD%R4{M!*3V zSoIsnIJ6@Sto6z~?J8pxkA#CFq3G0Y8BZYM_~ce-Qyf`f4`XCkl#6I^LfPmVQ6}4= zaaM`3$7=iw!ZD^t5+ULOzdp;(!(->fl(P6Np#0mmmlo^n8Ag9p!h+29+qH{E_1#|Y z!U{z&b4?$)r!dSSPmtT<0n=)sB0?@)#T>OtlC@mNhSH$U+JR`(6x`ZmcJZyiK-`^> zj@j`&Y5^}8iqc|ijJYUHZpE+YEN?_hO47UmLy4JL#C6xRdomkXyp4SCyIWU-gQZbD z3gtmvKe*WpSVs=Z%!)o~wfkWKd8dXTA0z-f@(>VLZbSdq!~qFXLnzW-R?)sd|S zNy>45!l{;kH+_+ih%>6m&m=se3=6c6D;|&!Sioe>hnqukWPjc=MXcE4H~wElcl zc!JIc)4)J5Nf-tBQ$3ABrPfeGs54Rl{YnNqF`$!bs?XFLXyW?wZR(k)TTijSt zrRJT}99y8BRmwr69ojf{4f)3Uy!`C<*%2`sefw;$(VJso{gs{0y=rS|nL@FO#oLLj zbJ%WrS99am0J;=GI zCU<9V_G%Tucnchy*&U7_nw}X$QLZwwsoC8s>-7%9r=#2$rfx8oE6;~@tz793uV0g2 zcfq!w2jUET5RO3M%d7!Ut`jILS0NzA_EO6JLvgvi{-L-kbTO8C<6g}?oqzZ9|1X1! z?BIPk$`Rhb?rk=0e#{?bWLz9~1Iy5%KR++B!U5%bWZQ=L+%FQ|9duaxfRha4uQcCX z#spI*|JR}%QYG*=O!Dh5+U{ZPWMwyWn_6CkdV)_wKzI-GgD6fAmn@0v;N(pmQxMa9H+ zj#jIjw1$p3rKaAN$?zm!i5~#NKK5my+f~z^)`~sCPz_TBUrN!KWf<4+PG%fl)qT1- z-+aL*Z#vqfJnhf6;xPed&tnX&Vh5Dc^5zV7vl}8~m~P@)SzV`V+B2iLlh?qHJXBAV z76~W>6Y1x-{@bQ0+k3uEAJKMoP`pM>>Ew~8$G%*yLY~Mu?s%%^imqKhr7hX}TQZmq zn`ra3&g;x4DxV2zIF?F=ilCfx)vX;h`E?8TI$lO*(7EQGa~#&+MvC5bAMfXfznYZq5gTva=8{&D zC%va27$kV7Pb(U-iwHXrXN;TH72jtdd&n5|s1q`JMd#}M$E6ExMx9V8P8|28k}?$f zV^$U+PyFPiqQiwO9qlRq#e}?v!L2wYhEvcV*&c;HYnqK>G<#oKXI0<_X=8@W3g+m6 z!U*~q&nLbJLsm4f7U7{Y6A87%ujti2`kB0j^@nQ?zF4nI`||#rXR`n3T}9gUx=RL{z1#p`TJ8>m@tH3OOhW_A$|F&PZaJO9%Hj2k$B#jy1lc<0 zxeqnx!M`_7+`Kub1OI^EJ|HvKVWLE(j+pv6ctk3#I!rzb&M&r+WJ<&$-Oj^nfxNya>HoO z{9`aKSG=`839+T?x}aRdK4bCCFK@Ll((X^+RHmx?C}o`@M-jHYbq>KSa9zx<0GD~m zC@Iauz|z*6E&bCKxUUPNzw)LQYyb zy-uUCA`G4n=INOUF*)%y|J8>8uQ36!bO_q0YWVZ2PoGKwiClSp-0$zTo;HWQkFyw0 z7QY4^vV-%b>ce7=zUVoyY_R{@6>N^LlXcTef~HMEw)Epd_Pw4T^b?*Y z8WgB-0r=@(tmeUZ@9#?<0}J+N4DCMyzss!}L$r7EB(D`^lWfaYT>QwaD^?WC0FnUx zAc(JOs>|&xF2D0_hF22svnawUBZ`jvls1Q7nQSD&e4jA_ohEZdAxP1;ov9`@X(4Rn z`KVSUBP_rwV&gn@c49H8VN*G<>#REFvG`Mj6F&O}R{u|){AiXdSit5BKOC%Q;4~&T z{yR>f3!+?uryD&vi%>u7F~TZ2fRHTviBdN1_6~6WHF>4x+J((}52*`iT z$|BSVirlc|hdci|xRrLTY#N34v$!}SSs2n>o*xT@*2ZvQ7u>+JnUekqMc}Tl;KcI# zNvr5n9olFKqJY)F$x1@gtf# zF7-A!P8d7&&jZS`{AuY}#Y);-?=-%mt|>T{=hSU-g`u9?Yw+x3maA4}X(7`FDj844 zw@3*H6RZTOZs(^yh#qdS&33(0Lo#XE&z$9c`lPJd69XxVgGqERnC0#*5oFTx4%KXj z&oRNpwGh3=5=UzY1Gc;ZeV$E+TfU6m7Iypv%W~GSmteH(P5t78l9JKuUgZMgua8Y` z&=dSZc@b*b@>e(X7T=pZmHzcXrX(e?o2b3cC6(YmfP%GOz|Zj9x<1c}(U{pGHQUJD z6)W9+TAcN<{JJUQJwd1!x&+=A(W1(wIYmJQXX$fu%Wor!m-w?k4!O+pPag^RV>x;G zzl^ac*XIaye?@X%YCcjME~97XZdz+{@O78{6oi23;mPI|glvZ_R~oXOW9M1hHl6>y zbKe*#-3{eIFzk{aT}8CAXpr3*PiJ%wk4&q1bJlIjkN+OIC{D+0g3ZF&Foj;RVzW4SE4`%yYry^Uq`#WA52 zWPWDkVbv9J99b>Y9JnP&tMHyy4u{ja@1D3`tat=+2TE?M8ZxYE3*96kGaA^N*$$Ih zNaXgssw1k}5m(0`4>x&5jv1`;=fmrt=7D0p!mpH7F>4II#UAo$-&AkL z9s*(cnhq=-KurGNh03w2$UvkN+DHCQn8^cuQ*8&DULI_B;yKGXrrQj%ZQH*#oHd~` zT#L?S=dz+W(>TBZwS6Cel}D5jL7AzFAl5xiW#=}CWaqX7lD-AknVe=+6Hd~MalRG< zU534~wEkuN%)gj*U4mOCYRD5yUA>zr<*-XyJln7SDBqY8bnhvHHtp(FVt$Q+5PJCF zVZ7E^xy|16h%K7a9l*K2pR`+d`UK7cOz*A?H4FFchgWsMDUm<0k^IeY-dXVumz@zk zC+(^KY)_yI6@p7b&^NkEktX zsylKA#6=qdVOLciAxv{*HWTrMgaP$LLGzVPL|LWDi~f`mOpsn?^>p^QAU_fsIwq$U z!T`5cHHL1z0p^m*k7(vY&!Uu=`{Z`KLFJh4(Dn9D?CYO@CN417c6&@k7>!nq*;)Q7 z$CkbPz@=)$Afx=T%{xR@u4;?3eo5?ehG>x)8bvt=Pj_SnftQ_2T{rtOx1x>1CCH)8 z!z>CPw*TXW7y0R32&vm5yTuA_(Rj0-ou`tDL=56a-+-HocmqA2Ao}4m0@iK}jj znv|vX=MfXvAJJyb1Uht@CewQGhGpwoTkjPRWYpIi{Qc2(sJOY|*+PbQ3&Kes4amEs z6;E%4T0xIReS(pp&oo#i6NL5|rFAPFN$Du<^5xfxNYa?VX&f_Z3UYev&+fl}IOtd> zVsAViBXdDyx2hw$E-FvWsfZ7jrPrqbZDaEH0v2L|3 z!v!fGCg?1QIqxeor}y%D)0iG82$yc-O6KDj+#qn+qFEKV_AyJ5ac2Z|i!bJX8C%15 zt@2i0HjV6~a?_w`kuz?77IVkOR@&`Z%B7V-=)e6rG9#%da7(vW-3|LZ5Eg*;!}ySU zUhd*6B#3VZCcv)VM>JY6gQyIYPgNAU(6yIV5{X~DK;_bNHc4p043c&NDi!cjyZoJ` z`UPjzH)KXnAZ}}L2(Xe9$Wwfw!w_I$=3+c1hdJq;Lyd-8GB4X4&C{b13OI-WOf+Mm z_xwI9yEIcv=&N;s$-NL3`vFL((U7bDHTQ_@xUJj{sEf9+v_I^a$$mpkBc!LiyhY&m zwF|nCvLsSCsf@Y#x3eA#c!_vMWv(3QW?Mx*^raWt}u1o7MRd8?14Ocib1VG-7r6YuI4t zqjSZF5nZ6A3}8ZgM(b3r)~}Jru<9P(IpnT%WqDDr40?h&v2}=_qV9ML9x3lqtiKW}U<<_Criqyh(Bb zO7p;RFfw_R)#HI0t|%(-=7n@&?-1w&t6ip|kZDuD@QM*+a7|-%#}C!NMtA1Nv3a+G z`P)clpSjly17s3(uYjZ5jX54WU3OS}YA@yMi!C^FmP(%^r>iCwn)Lw0l#QtZ9hdPy z$K^_o9o65C%l(qS9hc4P-t9lB#Kz`%*lIi2_(3C{b83d(fB^y`-EfdB2R9!7Y$12NsOm^ zgZy$^=d~#>NeZrUC3G9xcID9}L3q+1hkss=JtILLmA&Q~JB$kj|JlaxK$!W=;+zup z_VReh__{Q1v-~Mt08nX4 zo?7KiZEN&;8pKf>Ehw}i;NC+Hqef7O$Hgjd(l{^zSX3_~x1v030BD)&Y5M&UD%Nw8 z#kzEgu)9Ef_Q7=40C)v-{wbj6RyKK$+KSiQN19w9AdeKT8;3lh)FHON4>$~O#}iPi zSY}wYuo3dOvKIpGzvU93a$^tmF;Cy7h4ShW9}OZ1G$CkPHnaOwPC1C&q1R=>=?m^A zFxR#9B@*Yx{r~yc0Ki8N6*M+~c86Q?=`^@| zb9S9VVv2tqv;(Vi|6U?a=b@GG;kjSi_sgLUf&P4XP&kgVP8CwCofNmdE?<8x~9g%xj{>|Cf2ybsm|sY)L)vHw9{Ze+UMS{NJ3h z0pOYh_HSoa{p={qj7rKFa3A?ky-{4;L*TZ@nhK+%QB?W$=2%kV`S^E3E*5) zF0nb~$)$EUM0(@|tj#)+K3kh!b(&||z45?5N;Nq7^qP~0L=unU^zKV-5G(;Q`q%}} zS6l50xOESp^wW(tk}XHK59<)XPx;2yu1SWKAQuLUI_vA*G+4qjin~P?BQ6&8ymvd; zi%v8;7&+89*7=r4)%>CRQg-#%U~IzsIN%!%e=1QkLARL3=b6aLQA3<5dFzHyv zby%~ycc*_S+Ux&rK?g-!H1r@=B|l}Z@u(vZ?BNCY-?5^cNj&w9D2cQgb;ImoWJi&R zc5LuDjXr;BoxhGpr=e5m3|d~3o)xI)_-MG2FFbcewQ`j-^5moN52AUi{0JF&kbw8PqGs|)5f=v22g$PQ@{zg z|0y%CnPTt}u;PZYwiOQzoY$B>h4bnf(ElDd(S5o{8{TDWK^`!0!PNHG?!Ww7IHAs(hY1DY0 znWopWM@XKE)5S1QZ*6{{Ve@G++O^S7%M$#582js}sM_}r8#V})Zlnf~mhK)wLRwl{ zO1e8oxTnKg) zycZ2N9s@Qki>L7lZ5R1cyuO>s0o#vzT53m)7v0CrvMJAir5on272$7@UZ_y#Bx&-=debzS+V>weNVK%YrJiM)6B@+IN$OyJhd>oxPvI00G8 zT;nb((ZDj@O4R^F@Q(^{>>D7au4TTF`8czDu6esr{~Sxb=`XTK3&@nBtrt+VqKbAs zK=9I{uKQk9)dv54EI&6{<(AE*2|BV0o{T0`m^^`;aR=)Xv!Q8G(Jpe?9e!!r?M1!r zce<~0bX`}0ZQOG&#isqYv7SabwRy&Cgnat`#WV|gUIzIA-TFAs<@G21U&|6N3XgYl zs5Ti9CrMIUrv6AYDV2#R%PNwTuPUjw+A$rJ5PH_Qt3ThJajbiN(^+ir2%{F%d!eHS zOdKy;H?8`h?Sw0JkjsYU^Ump0!h-YJtLBUlMO6^G_EgOIdYj>(bPSb(*9K)BVrd^Wk|^JmrQwCM~%7_O?9bIz`?r0*guHF(esswci+5MdNDQDdesQ0mO7!Reb*(2lS zeRd5j>O7_o#jfCC6F%P?`gXDbkX}+x$tix#v;^IGD8hQYouBg>%d|V;)V%XIx3#n+ zF;u%Sz51*8WjLMM{MVE|*NUxM$)$u(yXv2rYT>c1j$2(2M(P0$$Qj;U!K?;d?bOTs zSfio1^5)0a*`5Z*T~1XM+4BimJ$BfE12=kL1&;xXe>hcd;Y%RSja9bnG2!_BF|qYB z4D@st>#}GEDbEBVpXqh@40Ji(AW!<^k=f!Uu{?e4SXKFzb*lZ@@lVD+^fZhWBow$F zvmYQd4Mpi-;`mX?v!S(q>T3UA0b2{;Y*xXuWC;7g_)?$e9TiCv9ct?(1Z;^nln7oG z$b0=2SdH1C(+r>7?>{|8)6Hl;lL4~+p8>b}^gC+$Jcimexzk70X-(#{hMQUq!QW`4 zV>O&VJ54r#oXJ5e4j2H8I4?8u4aNROl!2V%S-u*TU}^tAgwLDYl5|lm-*V^z@>F^C_kkIe0^76W5w&>b23Zm!ZEcpFlY!%Fi&2-h+bl2>6jXozdYLcW0AEH+ zA+=;Ij_J(K^e8Y0NZ=$yp*mntD0RUqGlbO8oL+MWY9yCEo*?Aa4IRp(F)dA4O!hrp?$IX>l?HjZ&*iIFOUJe)lTWb%H_1P z^2lUksPPp)py_P%Il}tVMJ4FeS3GU=&_boyWznzJr&;UZT+}D zZS&;TXZ9v2IyfZb>0&)-j2y+|m{9wV-%QpkYWBoHar_vNYbzmUn~*xQEn~~}?aY9) zi#waNE+=8S2b-bB-y`bAHzA83RjJ~s54i7gOp4Hzoc`qok^S{!7J9pKt#sE!l80;EnZGb$c~5IGXQA+@>D(q zR?NbqSA}5C6ukV_pPf;I<0sWXO!G=wz8~mk`QISt@bc9xi9cN|?T&xam>CQd(5kTt zJKQK!-nV^~Qs;DywwjPBpH&Tf=jXTHW8cES0E4Ut9EE&KJd`t9tq|Iiv;j8;M)f|U zB3Ic0x|$W4LhEwuypw)Y-*jLG6u?!HTP}g7=M@+t0i;!%#kOTdDV?RG0XluL?69b} zWaqE&ORr_S&O1$=5uH2|XR4)p>Lj!6%He|Gk!@&wZnMwXCK^b0@jj$|uS$cNsKC^6 zY6XF&6_h1Gfjw3~yTwke>@4rRrcPTg+H3>hL<# zp`c%+zPP}MLOdMOAv-emvcu^ zH)yMva?3~EN++nr6#ROeXAPU{C@>!TlwE1l$uJE4Y(TN(d`{7x`nZ zm&UY}ZNjd5+ct`hBd{+m zUD~}V#F9-au`M+E3kMD_{tE{##shHR7lPG-#oe3w?Fxn00G^5~j-I`vR7wk&E}MVh z`XghSWB$i5`HlcYS99p%N>LvKLiO~70d#CZ-SSF81`<I$+; zj(ZqFqEWtLF}H`8t=p`I_s3oj$DS*B%U#TYx>3n%aQET+o4LrM!IUCg#s}Z>%(?r8 z8U?SBil-as{NrgkKq@~pdUJA()r=v0ZIx!9O*ocldWg)4nMxIk<_ww`qMh|9gW~BU zm1seo9cf(utC)|M^a8!PIuf%E-(R9}36lqV3yxiMbEx<{5E*Cz2u%8y4QzkTU~@-_ zNo}#2{aPzorZVFVhVm+nUE!3WDZ|lZ7;H1oiCexG{w|LAD3fWw@rB*H5>H?KxIMxl zIwN1C2j-H&6C<4CmdmpStz+Zp-|l%o>DZ^H{v*fq0_2#X=Il{W?HXQo6(l8W0RmtW z{}*?h98s~_=?9uUPbax0-lyvx8<3dR7FJ37M~0E@?a)3}H?NBvbkAvrnTHR`%CLdK8 z({h35KAz&AvlWa5N~fXOs~y_XC9i#*Oo-v*G%9c`7xUNng0b3F2`sG&^YDC{?}w(G za#sh%aSC~cWM6)wJg*!>5p&^|>9>DM1UlY^k##;>(ZqaL{4)+|c2w{Q@NnIo!jS;x zh^Q=f6vt|LsH$s!0VR_u=w|n=yI80li{movk zKKJkKm=eipru=DYuYBVzbEDE*j1OABMl8=l!4jFxqya#+Pd3uN*QP%%e4Y?BO(y^o2!? z-xyy{X?lGT5LaaH!YJIa67|3#t7}{m5)6S1cf7@oH&_o7)Z04> z@VLY6`y9(Wrydgyw=D#`2}9h6fn5fpTuRf~+}5rkt@RxQIL8TV_LdbQOm63l>BomK z;fH(X3kV4Vh67x%UWe&wrMT2V z*+7oTq++}es99VOGriLSbe^^|A@HaB3@WL%v$aI8ik`SAo%BizSS6L!xgY3eDo7^g z93%7TcD=0W;JN0!gC2aO{rG7=)jMmEFOgVK1QUbpZ%tdWV?0{f@Ga+&nhw*K(&u3& z6GOE?4z@URe_coDYv!jgx|rNa1w8}Q z-!rMkMXoV#W8j`3!AV;9_0P>;(^oxo`7f&&FK0=wjfWT=Ag&!5yW@Z%n_9~Ky47rB zs(8U*_cF)gRpCg#*&po3%i65tWM+yZUS$VN*-2GIGzDEu3Yt06>lnL=?e|aPdHj05 zWjqU~o?ff?+(IjM>ck7tsZ$NSY+StI_t5SlP)v|8!yjxhV(RL7(og+M3tVt`^3c4Sb|P*UFTc z`(KE#2k%UVPWm}H@n)BXJNu-Bg#QcSGdnF5|Njp0F@6a4>ZF`FM4p*XZ1pB8Z+!Tk z%+F>)t5BqOeKUxmP^A7wT)9t=<?FFn%l@VO>KYxbT)el|pPb+VN5>bjmhXc%gtnAA3(_U*UKn$Ob>=kg zPidJx4yij>xArI2HrA}gs+zAw41DWzZ=Dkvx_>LC>;1nrg+>|`p=OgQ+2(2$C8;^$ zK24z|xYC7?rflEOGf3I!suVgIC6ijiOYREwl z5uEv_+5;RvfIbS-RaSPer>cn*o2Fv#O=$8QiU+&0_~xUs%a~|Qj~NN+Fp_H#^e{g3 ziKMkP+^)R%|78U#GGE2VAlg3Qn#6peHzD{Iq$a9vTKWik}e zzXOwx`1S8o=R8hkLR0fm>(&d}RumRIIi2Zv)^LkR>bYK<1{XX-A0pCnHO?_k2ZI_v z=I3bJ6k)Wnob{*Ubx^zo<1SYiLDl#xkA_b_wK2eUS^T!q{VQ!jkdcaMZRJ;@ zWbFsnZ{psKN`jVF$r7o|7zy)Fn_n;vy<+9OEKg+n#j_4N^>_{On5U-&}Sd`O67}@yuQ8cE+SUo!mo$i{l}weXc<|` zDH)0-VEx0r6dD&6qr2L&K}Tm~Z=Mxc@d0=}UD7SdRu*Sp=%}9*8NLmpz8p_Ulx|!E z3xDd&IJ_?T2LPm6|8D>gr2`QA)DO4Py#E3PNRq9a5x8m=Whx{;p5c38jB%=a5U9?# ztZSV<++brLNM=0wld-E53!0M>(DRLkJD z$;}LoOgob~+p0}Z5X^Yo`h9JpO4)R(2>64}sE{++bqR-w!#IVYLy6e_U4&?7;EUms zK-H6sa_zfj$>kKtR?E}zoaB*)JoawamGx{}(sxxySy}KP@sPrF+F|ye}99oB$vbGoiOsO3y26<_>U zgoC9aM{c*?m{Sk?4B9(Dr1_$PU2Niq9A9A3f|I!rCA8O*ESRqnq1aE@TbN zF?J^?MgUuEZ6wj8;0Vycl`1AxSg1VEW68hw{3A$ zyM@c{*JmH$p_EsCpW}_i6XpZU8A5sW1hCO_9?4mqCM9IlV!oQ^4LAx3yby9BFG=jC zBcHPGc2bS`jV7k}?hO(G(l|# z`N-wH52dkj1*5cSI{+5`Q%*)ZW{nQ zN7O`n`dho*FXyJ6YP}AUhM1}QP4vGt-DqOqbH(^B_n zd4>bQJjz`DD;J!n&@yR_#N=CWcCi&Co^(*C)7ZurS3fR&Cr8pZAS6>7ozmm%@*TB2 zyT5K>C~!)<;7t=Iu>>hX-RlLWm=rLIr>J`9l>td6SDL*m?{ zrc+;MZ(0c&{k|i9u7cOxh3D=90lKS_R#LFzSJG5iEVyS0vyU>bMXTs){BN)vPgp}K zApb)Me(1Kta>1256%FPnxGfD!PWva}>u+$8;-5VfyC{EV4GVXfh_S6ei2@AzcU1CA zQ75%H7IYU)K-PE9SDwdr?@PHd{Jl1^G=Syy)5jWhL4gS2$A!#((bUIokUz&HE9tsQ z$?=H0it{p{j(a==flhi*z1J|vPiCx;X7ww`&dEeJfAZwb!fn7k5>I@Ay3VM$(qzoj z-6Z`@@|8B4<+$j_hGicJ#X@eyD|m)jfo4Y1DRiEH$dW>%K{_xXATCZmifri5GBQg z!>H^AbF5JOjGSjm>~Gcs3bD!7BMzEQFhmJ(1(O`9c4?12Uo$E%t$Ge%Tkt7u$S*^V z>a_7`84ru48Na>l9&3F+6BWYn{(WgiAI9A#e3HKJmPSLkW{GdgYOwM?*pH);hBl^T z@GN>W0@(N<6twq#7I{W}pBQAC6d+g-7VKF0!3qiVq9=pXNp%9!uFp_PvNH8GLai+W zt;T(On~Zra$MskMd}Zs|z2G=7@lH-rEG+8h_AOyyW6u%;UlG$w#ISvmAzL(7aXVlKOSrhF5S}unsd6i9ff<5Yl61ib*Or)g=O(=2oP0{ zLIb3Qg)+Wpz;U(%RA?zwAw{C$_NtxKAvDE-`KS%|Y>x4&&V!X@c@gJ=dCXl{a8FDk z+Grz{;LyRjC34vZ7CtwrL2DW9?swZGWDXU0=s8FbASj?QsW$^7vh_v}BSH{90u}Nk z>_e(sp?+l$^Uvb#w~;6j!5BN6nftNqE^roiqg@AD`4_m;$;K=F5m|vA2v_d$xU*EN zXD*h!PQo914hPy3Vsf8WCCB^e46-4oGK}VDz<<-W`Y`E>w^g?sa3Og627gTn51&A+ zDaw%8=3#cji6^mauHdpO`l377{%uMq`GP%6Twcww_ve)w>Xyj&(s>Ll4=wBS1@Z-O zS8Jz1p=U`?WY=KS03%jq-8+mt`G zrD31mkr;#oSd0j(ND!`oz_8v=x4>Zn`stYT3sv>0lp|DyB;Z|7@tnGm9wN0<27SVD z2RamZ^(q-X{Jzc_7C0|k=4nsFh_S1@7t(vQJ$Ag=F{=&FwgzM~l~h4?xpr*seWy;& zLPG*Tq1wNT?oSc8=fLUDNAv32?4v5(MMn51RkIlGz>i*UzPTCuX3{HSy*+Gr9BR9J z1=RrEw5LZMHHz(iAEhPrRhviS#l(|3I0CW*Y9 zvFcu*y!m8RnB`8D~M&y21R&y&e8q^iWO37Haxd)ifXi! zP&9J=!tEjKT>qKHAX}kodmXk<9j3~7w063h>=*$8<$qT^u79|m2^8)@k&RA)5(k%6 zYey?UIkMl~iMW2PU4v6_{vYVDQ}Qm@`(984*UH-+f(=c?M+;<7Zb@VrVJYW2f_pM; ziEXfcYcwLHh4uJ$5zvoJ`|L6Vo-SS83|{B)z^9rao}uR-&g%3UE(=<3)OHk4d;~yG zFV(%Ugf2|pfm=--7qu_5&e)+_mxP80`iX^&!x|Fr=#NWv?xkYfeYYf$e%3qu*Y@gk zR4guHYd)#BG7xN;anq0MDsNMHANVE%{# zfrp=Li5Ah&4BS^9LBzxF^A~}TYg0;U${2>rDF?4^te)lz|AH;O$3>Us?f286!@{;e z&G4W??;dzYBt_e_7qGQ}Hi1=6K^dk&EkcUsvYq2YkqGZ+Wr{q*G3 z);_S>Gu-ul+tgr!bHmB6l2Hp;V=MZNJ^Ybgm(cG0AY$nI&~YDPHLFpX$?fCM@dI$( zf-jM~$P*KV0%zXWTAiS~3;r)sBQd@w0?DT<&7YiIB$wQW9xtB?gBV_T8eu7sDA)+P zxu!?jwjGPyRgS&&Wv!B15Q*@G6PaiMUAwqDG6h3SFt_DZD zZxiaImmEN?4NfPsy5()xLTyY!q4-*Rh7gx#j71g&-MMxM?|93@lBwb%&R-P{VPDZAC{n%>ZUdo-u=>xm_T=cF2q~>1S{WvfI|wNPU?(Q=xE9LWZuAk zvPM!rQ1z|{z*c!baK~a*uSVUQd#xzWk7eHL?fiJ`fyRZdSICh@_bCmpDPerg;jrYV zsUGl5YbcuEL8+x?k-)5ecpka zRrJpvF*@JrbrYd8bBJ zUj=P`*pLnrd6&|inSZVf4jwxkK%pc_Fl9I%@IQpkUAWiZ&BMkLG18`ig5z=iaSWMT z;(74->>4Ca*yQBuY22ZI4ANx?3FUI5V(@}_zR#yL(%^O)HkqDa-)2C?@8sQk{)6S6 zLD;%KF>PUJcra#=sO-SLK*2qMDn)m9K~L4!;s5!nGr`wB7`!pK%}*ayIJ!Uhr5-;Z zrXusiRL}I>b)P(9FxgF^WhfU2koiDm1TWVV1R^3!4d7n(U7IiSr!*AR zaKXJ~lm@B+L*r<*5Y7E}%t3qo48|&^NHj3%*j0bPMboPIP${_^)kuJ@Zc2PRnZA8F zuTXaQsq$RAfGO{MLbk}kU|H+KhZSK8UqzqTj}>}+yj6&G@2XRpo0UGA^dI$iF$;!U z#LEDZ7JU0YMWT0u+GcSSzv+^VT8!ad(U+x~{FN;;Gy*B!_~$rIq^kJouW@N5*7Gs;e=!j19VV`z(J;Gr*LW#2HMw6$#h& z4Ed2_NExE1!9A*7ty3o;+bgevXthsYQIs*c&vn?m3tMigy5vfY=ZTQn&NAU=vNgE= zb#(WI8J%LcLO03by@Np%CRb#Y@}C(Y>p^-D%dpgV++Dkew|`*TjY#F;D(v;CH&#(m z5`PI|F0WLDMzM8QI#9OpMi7rSF@f$%eOVwdG%Vp0SjWQTW$L$q0N(q6cw5SzVY5@YCTf-UT-6LI4{%+d%#6N(4`0-G=Bb{ z%SYMo6AUGdg!#Py<{xa00G`#=b{6j1t)tl!n66pe*uG$*AuRkbVo{iTsD!`j(9FAN z_e*{>b^02W%rp}07c8e>N5RwkULj}#^^9wd%>HKv=rgEK+r@WcZxju1oVKohj{Q*3 zsr5r|UT`PU^GjTv1vfX!dM-~s%8+U*W)FLnQC(k5bBo>YvA4{wN=rtQw#8$lmS)&B zy|PxFbeBIZzv^8EkQNQQpKHesxYCjLNUdN0&{!>*U}PS7T`*Rv!C{tGts1aNj23(<6<`fX{i|2jN6^wO|BwlcC@ntIR^i$&YhZVt(knDl!KA|WPDj6 zx7NoU_n!v4+LqN*_M@4wi_UqEiPf_;d%O^Pa5xyR8oKfTr<)BZ3&V8#Q>|?*)A!bH z@|ma+@9Oce0zu2inZuw9r>1IHPM2lW0uKU^ZQcCBlw zGew)wuvOn81_E}cf!#~5k05~G3&GtAax zof2D2OkSbjuPQ5I&z-m_7?uhbqMLN802W`MQlr8ZgKTH{b@b`g6iUHxC?c)%nh~Vq z*b!Ml`zHj3Y|VRCP})3?rf#zC)jUqOelT&G+7hk}o{-egvOO@^M?mxx5V{g=dXY*7 z4pxVoGaZe^?&fe^47``2>)kuo!5wfy#^FTk(|02eBXyD!H?_YQWbahgr0<{04N}al zvLDFWh9B}d->o}who|Iq&3sa;db^SpMJyqvw#WF{+3WSZR%0Mjm)V9qHn`5o^0zBb z#5%?Ml8M)B$%g0;wC{g&MwC>H<_f@~e_AWW;(eTEW**ZNSJ4$Mjtn^T!=iawt?8u- z9UbiFR5_2#ypA5}Rjv)MAlSjzSrR79x`m-os@S4G{EX>4HGw~}?et{NhqsJk?3NHw z#eWiRiL~Q2pfz|7>KrDsK%dz4h#Gemsg60e#U-Z-Ko*YJTR7P>X6W>|?S1S=AqkW3 zoI#o0rNcCpP}KZJ-Fz6@vM6K-S8jKCOmADO(EO5*56xNfM7yZa%v0`gJ~z<^p+xhy z*yWfzT=4jUm)Pi}lroo?Hmo1Tn!84!_p4-6vK!rrlTG83n-#;VgD zPwqDLZ_V@RbZ-S&2=9pP`t#!B^ad)Y|F~$r;;)B3td`*La~HFk_hEFc>GQQ1n0HT8 ziSDRGHPaako*%WpB(=cC!=>-DFKzC_PV~mi$@I{wB{@j+pJK9O@eM zwY7SgR)ja3{n}0npv|jsL{Z)g7;|u;!)Q^eN=%+?C>p#DE}n+YJygXnbCe_sE#?c@ z@(4KkM;fDQKV{+N+b8CdN=Qu|V!xV@oKAK3R_00*zpVSV&*Ng2)oDmDZ^*K6FuJ** z`TZ!&2TglX$?9R>AiQP|A%C|1jcWqrCgetMBpDJ2wSo0i%K zzSJ5Cr7`G}kcM1~lJMLa+)z1|7PAN2P)G1ZbxHwq!HoxoQ%^%q=F+Y@d`95rYa2YMciT2iJmY}wZ>l1xzz1tVTrYx-M z;^mpcoc&7)li;t`1w3JUpF3xaABCaTBP~;@=og9umc1w+;>`BAiMBn@8{|}?DL-s{ zXbwwJ`SNpJ+nd#g3o2b&68n{zAze0F79<{R82vy2Cmh5%4e)u}C2Eb!vb<#KYwHvA z+nX?j2u-R=8P#-!Jw*qU%k<4Q4KS~utI#Zi@ zNN^OlbRo?HMWSQc-eDSR@b>;uu8HuG0IuOG*C!P~O}6}+D3!tQ(Y4=qs3?7SvL8dB zWMT%xP&UQv*Qbk4)i+st=DMRde@fBE&tIty;gc%4tgMj>w49o!Q_o7h4k+TZ0Hv4S z(3@{>HecF3Z#Gn0LH1@Pb$=X1Lpn0rxdq*yC`;BQQthVOc#Z3C&fyLHynu?uyUkM& ztqlm0dLJA)cEa^Sszx!JU>}@orx_!=3*4B~#3SsdimG$h7pyy?L#I1Qvw2K6CAom*7`M?CisTbJf*7{4J0fz7orb~ne(rsHm(p6l z@z~aJ)CKs=$llx6gmHd0CnI&jvt@}Ec*Owk!Et-@oymL!5?)?Jm5gGvC3s?%0@3s= zvo&#V${=k#Z(IhZxlN(Q;Avm;euE&*MdCP^Yu-Mn9*?f0VO z<;j`!A&YP=Iwez*g!hN1t)*RbG64mb1{f*lmr%DVju#Kg^uz+;L$3GQ4u3QoKKaQC z7!aDfd}?5>!?DWy+C0@gx#h(blB56Pb7Qt4BoWc&sR8*!d!0yC9w*Y} zwOjcpQ1=A=y1|}Oz^VBHi;kM=kHSSC|Enn#3ekx zT>B>q?f9WXhJs!a78RTime#vpiyR5kjSua5|0|OGVn~ZL?!_NSn!qs`IS&X%AqK-x16W)!5f)55g}U zp4sphyx?aRZ~g9TO+QcKNuwprhruswFsA2UXz^A?Q;E(kvBS)Ddi%lr>Yrje|1sRF!@%fS>lf4LINi( zd;9jf+JH!C5qj2es?iLwKE_zB-$>$T!9dg4@Zx>LsN?6H;rFPiFM5r|l=DXvUOIvq zb6K32_#^$wuRin6?P3u#{+T+9Nj{qY1ZKw4!f>{d^FAkZ<^EZpMD`e`Fkv_b(h;)o zy-Cl-F$81ySRwX&-h0OnrK$P2X*nRkyyy2 ztR9inRqL^LBG2om*{BD}dw2olA_uZx?ycCYq-V~{f5$~lPJY6N{Leh0W^rk5UFh2G zzhTRX(9HUR+F?_>OaJX=yu@3^pGBWA_neRF%ZF-6qtb2sOxBwHK)LAxq@x^%jc;X> zEf+F7t;T8{XWpatJ@0>B7EBwmb{iK~DaRyAsY|;~?yD`Oj_3GNa!NNQSF1^Alyx}t z^;%W%zLpnNO_uKq9dp9H27Ekhs{@RRrK#5w=W$*})tbv_UtcsTy?>W?#4aL)-qdrg zKIjq8X>HfG;@viXrDl$Q-os4YwWAnnW4cA$J~10hFa1I~MsrXiRVQq*6*=E3h31;F zR8uXvuTTy~4q(MeyY6G^*s?`=v2U8*Y$p^yL}N%Wr}QpJonH!*`sKyOr$qSq+o2*W zZycF9^A=qFvhCvwyNW6_an5*0FSz%q90w688^#G+WSKq?en(F60~qq0WH7P!$d_fa+I&iM*0ME)>m7>$!=3^O&M-hTA&;+@s#94wi@Q zD8u2lo6GV#cD5ga#@Zg4vpdXR4ev%rdh~&g*>~(yLox=?xdd;!D1gAi|Wx00+r;W_9BsNx7*yPhwT6$_paw-VOu(W=#eM1qK z1}pA41jAfsvW#x)v&g=!I>_Z%<9Q06Pzzn2*vtRKpWaw2Pvj?g?xT(l%qhHlmd+Bc zHb4Lgwr)^lAw}QzX%SCCI%m?_JPXy#XQaBNO0b<5sK=aSp#kxDB%qVGnWo|y%;rt4 zL5r%$tTwK(P;6&mE9_&{TZbGDF_K-*1Ad1*7I(ocd0aN?l5|Ja4y5-HjO06!_xXm* zlkD$Z&w2JDJc5?`6kZm4=k=wSveZEfY~my3uk-ow>da_>Vg1>pR%Ar_!o2k`C^Wr;!Don{$&? z#X~H_GH0iaR=<%@D`;n{pY%GnsaCBxbDq9KsIg!|o;9&1?cusGIeauzt3naF6upKD zMlcxb7mMdpxHjeb?58=L$ zt;qh#2eZ(Fds)3q55ZworUh!uH1W^?D^59`-yM3q?IoQT{e9I)`f7IMz?O1&D~wfT z<P={{Ws2Wy*&g*6(3QPQVaAJUcz06%8R}G(P8Fu9@7;oMe@VJ6r!MjU ziV|^Tg9FWRCNS_{X8ZT+s9|c?nIvc}v=y34^54aI$;nJJwuC1+6@x1hcMbv+eOrG% zo8#4JM5>bqhkq8bBnph{+c$yVyhxc;8m1RntDPr3CPDRntOEx|d9Q$4TfiwZ35r8D z6qe469D|}yJv+P6GDF}8ujTvFr#mPhhL{I=U23%*4I8rjVnv(1wa@R)&RR@g$iF!H zVLZ#a<0WwVQoFv%>J^%DN3+?~P_SaVL!eY?qgQ*z3v(2giG_3B^?_TC9y?DPX0G>0 zLLwBCh`w&rQma(o4>JBkHm-J^L0UqzBpS@hT}vl<7ZM z?HQd@ow2Yk>{wDdPuEg8Np6;d1>bF@koKCd7f9HW>{`c9Fs-%4z zk;v6kutJQt0o-RVJh7DPehe$b;L>{^ppzY~DIwzJ{X!TH&n$8dP$jvP^v;YYf`=+e z$5l%GL^;w(%Ot7H{}d_}n9){|xVgUkl;I*DJ7LWIB1&6xtLz&8t}^yrPjty1e-mC8 zxu7&|>#@+W=amQeyXZErRB4QS)rKUY_(aqQ;oyrxGs0W{_-HCAeg~I9()4RAC3^8K z(v;g-yO~}NoL?kGF?PR@g^Ou_0w4_XZAk$yGu&{NVX#5h;;;^(AKJ zm=X?6z&e8ApXFmcjC4Yp^NdwSGYrv)mA(5tn)|C}<~wpBcW}|DEm7Bv{Z8PI5L*wL zPt4cqAB-BbYxS zW6D8)^w$Hk7h5IYG2W_!QL(fey@N+JRH-yLQVBqdGfP|xUY-Hb1RX^oE+LMz&yOoO zQ)D&1i#R-B!ZHk;5`P z=NAx>eIo8060d*W5?Ts5yGiw^)APK6zr!2v^=1{?X<{`Te8{M5NVzZ>>?-@l+{KTN z*np`Z3O(t-0AD;^TiDn$`fUzj?JsgY|5UXHk2WPM8lN=eNy6LPI3;)Y!7oiGS78{u z!=L-{jWpHrrH+K&8&@h#RMi5Qs~QKtR&siPmVjN>xM+ClTiptAcRD$p9d-tC+t9z2 zqHUyut+T}DJ3VWmtB~cVf#ZacXAFmvZKo{Wo>y});-|g&JdW@77MrEZkL5hV7bZ^^ zUQcV)eUv8+2wjzJdzp`)?S{`Jy@3+yq>Io@Rk&aqY$()k`6}ZN+j+;D*YX4Nmmki^ z)_yfFfxYXswhvIfl1HzJ3HipP80VW~-*Pg@HyEVRxP?sb%4j`En#ZR4)pTP)?|P_6 zuH~nysv@3rFS#FT=W(w!Nb{@c2Fk=yFc;gn&*{=-C8*l# z4;4j^Dw7ef4Pk+p=XhKwDUbE<5#0A=RbO8oqSKnLci$+A#>H#8)hQ&`veb`moHNWM z#62xL`8+VRT`!fB%A?l)mtW zep>eIxOq-Esm(FQJAw7fY|edckQi1ugz$z!UXy^YDBe)Wz82LPmD(WQ7c#4*G#r=ync%x5max8i_G%U zmhr3*ErkLC%PIZ>U$X`|6|1af6zsY^|D~M$k^0-N%%g5^;9%$rM4>QK8H!?Iv0hMc zOo?dqG17iX9582f`cg@aZbi{3BjoVZVkjP&5&8E8yAgwYf8hdcVg6>nUOh78k9}Q5 zr(_V@X#C3==X>4Nj*6)N-V`9c8_>1gTMGy*APfxoILI};28m$i+Ze)t3V;L&6!_p9YXJo+$0W%>>&m;pm3 z&2g0ux&JoZeD4feLe;jh8pShYy6LE1>(8jN+wSa}0=Rj%g7w1&= zIOjyU?aJa?gZ-wQ9&`HhZpHIX&|{-HeeN!G6`D*~3g_hyQ{L-@C;$9K~=!%59D{q3e3EmGq>&2cmS50ygnvbV zdE6=_)E}V>{zzvzx@`LB{^#PGTZn4gA%>35kf%hsm9xWM_3b&+VD95A#uG^IY>TD& zKA(j}aao$lKnW2XD&mW;s$2&0_1q+Tl%Pz4#UJXr38s=t&?K%r zzX}8yW}FAT86?l`J)#@*3cTV2gRVnBg8blm*)h(ow4H}x4Aux7aIp8qm02(3x%Mvv z8+rNJQ)jtM#4VSbQAy#8nV!u?!wLy_RTO^G2;%pljR~5(vT6DrV3EA^`_c3$qlj{b9kgESUJFS4+=r3t=!tD~eR zBOu5l{68K{2b zM5FS9vX@b%mru;a-nh18h>J&59#u^@loi#@rW7fQ23GK(|A<~Du78CYWc{VW2_f;$ ziv(xuMqWnPdT8SUc!V`F)9nDR(bw zq_`_I7uBCo$|Hx?U;{_?9WmnHwn;+X*6K)d!}bXphDTn@ z%=6aVN9GRUl@-R)j5PFU9K_h>I(-nr8Zx=iHq5z)XbtkDwW(Ec3-1$u1B^dkA*SfZ z7>5K4ILh8iCyoLqSHynxgZigB!U+y}JaTbn$K(O{5^+*RbVj2@ZXb^NvT>8smAF?= z)1}Y&Uw(-RD`iOUgR~ps7K=~SlFI`zHa>u1VQJ8~&MTK%%ES~duI32%%Cf4YrzC&CrxJ;Kp2+SAwPMnttGw04MNYX%EP&2 zN`v2yU3Zp)Eu_j|4@LAgnG$F*P!#&on|U`$LyNg&pyAk9$1%h`H2FkSRY$hl0T1GT zevJ0Z@B0$DHIhmp>9$ZYKP8c|1E=@*M2p)%(J%}N)yA~3{nj3D9bbC9OE-Cgb*!t? z5_Z8O(UD}2KtzHfUk%-z{TxSW9x=m&n^8ukQ2;IevA6s4%Gt&>4)deS5?-zQB0C#h zqi<-!oQ;zJ;s<0**AUcfZbBK;73(wVgl)_gzwuluM>KLk)&rU`4!&Wf>CO1uP}smL z7zQ^TrE=6o z-?_!vdl7Za#pDteRYG}>v=Y;bw1H`JTF5~#@NAU)YlG8W{#LG=3F$M5<%q2RjY3`X z9NptS|9Z&4&zRPCTy6r9KZ~btp{gAms2`bFoSY4zg(qOo47K~2@0i(hXFnkB-G>?p0~pBb!-(CBm#(|#+GPSM$gJX44GwBjoyuLBRlRa?WLRYn?N$sdIN5yg{oa*0 zEM}rU^@_0NeT2MI?#ng#rv`PYSoH50{GgD2r4BghdLYm9yx^V`$pgV~Lyj@NrJDKQ zB{q7-4{y%OKdP_*H*M{tWQ#bx?f7bnIh*inuF!WBG1$+Wp2T?G;q0t<#l&V&KZc;J zZ8@D~dRsg}Dhu4XOgV%-K(F_wGO@5A<4{#fmqli8R(I9x;e$aQz9X;ep^Iq- zMfP7B^wi;zwJst2H!jcALMlr$9uS{+>okWSB_8x87^;-z-*Kl)cbb3s8<%fALv6t` z!d-GV*4~uTa9fDHN6ZKFLEBxRiX+QqHxWk^d2A<>T3Ga-!$V!oU$zLnMW&B0ZXKKk+S*&7<;M^&6omfH zz-B+H+vMS-J4v*_E|#RNJoLkOtv^!s#Q2T;`HKC_?wwSR#g&BWiD%pjGTB@lSw_z8 zqjPqrX06nAGd(h26*MehI4Z%t9ht zvlvKm8B0iRQmX@e{xQ(66MDyhY*?6pg)cyl9oS4F`?27oQf(>Pa)~JoJU;&u|` z2}!Qmhj=nw-pXPOx`OEUiR$n=b8m0v<`*;|cXMwDOuf11Xf0}X+*l-heOZkd=kFjL z4)<;i-bD{C1|G~KU@l>d;$KB+y^RqZ9EGQ+YS1?{NhcJGQJIKP_(6u$sGd^>sh5R~ zPX>uaAYE?tFGKv-Qr|6!LC(AbaWtd6;F!x#&E;P=d~GiE(+*OK%72wBd~n`#)}}*8&?=w zVzY5!A()v98#_w7%Im*8kd^qRQVI@P=Wi+KFoAm}%0$WUxC{FoZ0OWFjZZ|{zDkFh zpPL1E@0E&2if-h96wyX?1(r6r;_tk>lV>pQl275vGvlhM$*1FVHkpJ#UOir8mJzna zX;up!Xa3QzI|Opa>5#+`gu<2tH*Ou}9?8oZa!2uoJOH0CQ0W)r0)8#f7x;G&VM!w>M zzQb#etNP2Ypq#tvK-<^%V{*P~s3CkN9dh1#JgGSyg&Ga@tLKqJKkzL^2Y)~PCVW`$ zVtuPBB}V7Rc8GR86Yk`DEh>chc(RhM@L=J)IM6JK#@*3v-pnmuz6;|EQJIP%)n;i- zh@CIF@Ta%ldi+(z>xDi3AZVVhNyfhyeK4v*GfsB15Ir*q3-4AW0uTOi0P4_q8%mM= z-0jdI0~g1%j34a*fm+108n9|$T>EFe172ZljV7fl_F9MTX+g&#vHmmnXytbGfjaL| zXu=3|t-yILHZ^Xn)u#)rfLOXl=Sn!kAjc@9Fjn?Q(7+-v;3;B%#2U+Nvc zxqY)b;)346h9hI{Pc-6_Y-M5zIW&@ytEi~bWS#=!{6J8dwaF<`OFGXkxEi$cGSEI2 zex|{oJ8uyPSx$j6u3u{o-BE@GEVFjjMzqLyv%c%=eHLs;V z?AiC1JWU#ZKc*3WRY`JPd3oz41DQLu=bt?~3%6L4?v>Wfn=Z?b3RAV-rg=A)smm-R z3ej$@*AjuhPe8P!!>Hh=oSk^xkybN>bY830o-ZcuF_pKqKP5fm7d%!Yii>_^AJJYo z%H>n{j(9onnz!~;3q37FhY(6~a>M@LF66pOc>B4J06Nqvuo(Ui!r$=>HJD=Ap~_xx zSe{{qbO#yGaBO;i-Utk)NKyz!$CzGW-73+hJ;Uy(rK3j-(0FP&eV_aAKwv_$m8!{8 z7C9DK4BOMSxA>XYoC?3tcxv4r(~yN)$z3Uq;dcq{auEmd#Ze?l(IQ3ZRzzb@Bdx%v zmBGk+EfeZ%AP^@ZFnoIA)L3+AKix1d&NC!uBQv|_cVGXe$vT2+udmC6iz9kYTER90 zuWhcDSIkhJ{)JwtdYB#7&1do0i&MN_ap<1eVqXltwM=P>NMF+~*{p|n@FFP|FADVi zk70A8aEw4Y1p0I-qkvy@L-OTv*2i7?Ss`0|?rbwVMMP?b$VJCKhpx5NsX@)*_j1eC zOGHXxdOxw`y5Sn7*wto&mE|#h0 z_aOtCwC4xt90H!F6RXU1X~vmt_%~@1;?iWNx#8cj`Iq6GIP~U)AM?7;)qbx_^RGwk zes^naw+~LB5H*X$cLECAYc@*X-go>cg5#9|h8JCZRZBHHgucm^B!Xm&RS-(zzL<2L zz&UA`t4~**G;S-m-C_z<{yhK1An-E3_9*oy=VhPpY3;SI7A9aa*v39*G7i(hk4m34 zt!vT(bYNZkB@1u<4wpR6xMoO7EPJzLc=5*NB%oyZp>4h*CHE*{5xU*z4_O!D6x*mxg$60^DF&&jsUw7xz&CwC1+#c#_DR>9L2 zBNI{~C^S>;!^|;Cv^5fnh{4=n>eli5y#88Rzw1Z8YNUDN`=vdB3$54VkFPg7BZwV_ z{l9h-SI_4t1@3s{^1>676im&w@2$qizf9LsVMB~bq97c__-EaMJ;52eEUtl~y_#Bv zKgI;9RtEDGw|COE@vF)eg~Ms-0ZuQmiq)k`U5EQIR%Z6a8xr8&dZQ1d1@$Uz>7hc! zhcL7Z!7+-oIy!#!Lyk;;%y)SLwvCOx=shBjKEM6Q#@jmk8z59xjE6~II`u?{iM$kh0?@M=57F3a#qLsE`xeds;{;4a(8n%x5)m7Z@Xjg$)m5D}{6FX=UZ7bin zLrf(qEbDV1GO`qktHRQLiz?;LLy3hRxmIWk-Ehg8b7znT_|zBXMPYF3`xgi``++-t zXz`mt^y?0=9FdwTV~eB-55kvdyDK-0hNNP?kDDFHpEd_Wpx7x<##D3AMoL{iAq7zd z-Qx|63H%aeyCITC6su%Xr|F(gaI0vKxxbIIdr;g53zi8LB_e8taDjcs$MKrX%}3Km z2Pc6=OK!&?XgVc5vj!?HuV;*m8#^tA0{)j?5ZR?vL6>YvfaaN*%Ew>q0VW;;O;qE7|+pQ&Y75WSa} z^J>)4$ze!W*9jOemCh7k*!~x$oIVid6ms!MTu^LG3M@!f^42CUouf@2$J9PcR#;;N zpH9#7>QYkK!mDGceHjH!#VbE(*||TM3A_aL87~5!#3WxZ_UU&2WmJvd!=8WxTXaH8 zR7grVJ8jW*A6^Tr2C%Q#TUB5vpoxjibZDOCN8O)Qx+Q7404j{{^odGS&O-7c6Zr0< zG<+hxBV<#!S%N03l0d5FjwlxtnKF-~O;J-`*J}vF5K2LZHfId!d2D9uqMGXGRZEj- zc6s}t0Wo1OJxuiNhJ*q6Lre*kY;2956_4?|_F=1+q15(@mOQO@Cg@6-pgvW?SDB5b4+N-N_jO}i&plLQ9fC(FNg zl>HlofQxz7VGp$w+)OCmFE^WL3~aORJAsJPu2l&WR1SMykyC1Z&(JKnrx9c4{XFe` zkI8?|eFc|plU%IyyV(5hB0M@oEpM>yDXON#;C$^x=wYoTiZZe;KsKQihOV&z^_`^? z`5(opFgTP1t=MXgVXzGJs`NKiB#lI>C<>*JI=8DVj4?l+bB+0VU$9?U3yQ{iPB>{*7N`@Gfl}m487;}U zaG#DDyo2p-l>DwVA42X5`vMV=NM1K{^vH3ZPv1V(al+@7VcIH3Bqqo~AGuOsPy(%d zXX-)mI-~6{s{L$UEM*q~B1;#C6&13W@+-?5xOUzKrW5^UEVqiY(^ zBm8`?#obcXF#KK__(B+eHC_PM2t;3Zpi%UsG2D_zzPu5IebK~x%}iw*E>SH(5v=iP z!*X4V26djP^ZtDh6?)(LB6riT_@yM4-?ZTzz3h`Y=-9gUp%?UW zcQ&T2mv($IU~mm(GW=a7w%mB$Zap~7tF_EOxuteVOvlL7C{f9|G|$_h1<~`=yI!;5 zn(haFQEpB}vaPvuAB_oVIt7(Co&pE0=N#4SdbBXS8Lcxk4W-#gPLY*(qL?nbf6#zF zts2;5HG6e9q01mK*CSr=>|2;jo$Qyo-!RjO;o$meDK6|7Z$8DFRy$NPQ6^Zc(FfOC zx-rC9GU^g6bP?OxA&1PD(VC|&J>X;6JEy9<{B6RD72{>i@JJ@nnZa(weuy_M)Lv9` zKQ-R~jy5?IWJQ3QHl#i*obdCXw+d+A79iAsvANmNSvFTu!4} z3sjdeOe9X5w*l(ypHnn3X?&Co(8irIyra~8s@Nljs(`!slia>!U@31q)iCo*+c2|? zT`in!&0yk}l~x{dl1aV0%Xz}tG5Uf*IlTS+keE{<1%kWwS5(8w}0ft$~- zqJ=6L{FyHZ7@gBOoA)*?2xJ}thy#_Z;9y{y3?JjU_2eSn(ljXrzz>F?mQU!Mzq-5! ziJIUfY7e&vb0_;#v4kt`C&N&?1b@*Cyjh72iTN3zX*XUSu@|y`KiI9Llayd_lY}Vt z-Vn%-^^bq8Rujz&Tzsg^>;IL-!YQ!eBMz@?YKWa*CWXMgNFpHF;^TYU@>3AQmf-y@ z$%;Ng^XelD;Vz-iYzCp<)5TCxL$Pn=B%jSS>n*MG5tR9$*2s@Dar@+~62vF%Ix-lc zW{UBY?q2G#EMWuWAB9f}TZ+|xxetj&oUZzGhPBNW?gKue#gZ}E4fp6|P8q98X)?o( zcdeAE{bw9I>_|CYAuh}}qcWU!=;K8`RbC6my5RMY*V?3Ro>b{<#yHq7;*XPVaD(H=hEWfd1tEB!e= zk4bOPz=^}n&TXt8@DXzTdJwKXT3!Zc$DUQ8VW+Ka=L;~cL-AV?mUF1M<3Q&YTPc)v zEtTsIPi5XQKAt5JeK?5qWzlq=+Je=8Of~=GxTx9pV-D_*_N6kEm%til{46jn1vc{# zO*o3weEMg;^*MvNoG=^i9WGBi!pJq-H5*25R1NpixbU^xuojM_4XC?6w@~I1enyXH z%vM!Bc_>BGPD^wK&8x1SmGk$uYdU98>D#|BFkwMISD?N6c}jAucsQ`UBE6aTK|d9p zhMYCaHL0zJ31ro9b};!K=tC=4^=(2LN%j&rZr0AuQ0gkx#@L8%Yw7WOh~rdZkUPA+ zRt>Y^H-IZh$n+xpGq~2`0LOE5+V=Wh+EL+&H7UDYMq{J@%kPcz?GV;)(Q?q$uT(8& z)iy4jftJkI;WQLO2H#zv_Qbf85hF7aTTI#9_uP- zM5_%CTU(!mRG+-yOqq6rg>jyZ{WX(Sun*gHB= zeNjm7zG2FKX(CkmU65I$QEH-hhlaaM56v*ly5i^8O!eL$`i<-HCfMX@+w5a_x(64r zyi1I7^nUx`QX=T6JA6{Y<8KmG+&YtB&+}!KPh`65-!?d-rcd;@vF;l)O-;l!S2B98iI#dC?v~ zYHc$(9Kj?rg&4?v=SN3$yD?K(uBm$&v(?$ppVlqRX+D{4_|zK`>wP-SgZwo_?wF17 zd-cGSJoU+(HfrG}xmriJ487{x0!-a8v8^o0r{$zxAbR{KulzFcAQ3z8qhOLx%nWfO%D z|2_x8rN#Ewlx$I~p%5~rDMtfd3I#y}_6m&n0|y}&aUwQ)ovk{z?eh#3Dar*cXm85O zZ^R0V+#`)l{Uo`(5s>dzHXzcTlQgkIt_!ft2$4yUhh`hBFcKw%*>a;foDsVAcps@9 zm{83X3iEu*CrWsLA#R;N9x1?=02tnf_W^_os{e!vVbjYF|{Gm(K06JBPvFJDJ@y>%T$O zyh?5WeX^vn>47{a18lkfnM15 zy3KK9j09j@gjQa{iVuZxqbZ>#RhQ701*ExH+rBTxY~Ary(iHbP^wrt)L}v3^+Q#T5 zrHz|^0oBO_9G6HiFZ~$ajw!;3k@6iDn|k;wIXy#)2mUl|k$E4vOP|lG(s?71_i_3t zW}&urm+yfqEZ)VR<=xx0;rjvB;V(_CJ1fg0ZxtS2-^X!zAl4`0nTKx3*4GH)>2mg~! zn4bXB36R%@Gw0`6pWV-59~pvr1?vqrej4CO(XngUsg-W<*1HCTwpnI~_dqKcBL)2O zs!$E+eSf;tw17>t>@5A<6!j6JEIkvOge&TFes5NM@Qz>T~4*EGEt7V`LO9;%FziAWr}hO4?wVEm&R#Kz3; zPghk`X+iUzW3oPlqNq!$&Aasm6Jv-!jxoC=4{PHXNCP4PBLo*~T** zmj}9l6vZSPQkcd#)U}Xllo_7`x|opP`^M5_c`~a2v) zM49Vevf+>@GVIg)1VQs=!ppQ30W)jg?=R+x))y9gAVllo@A%JTp+DctG>$uYwW2|M zuc1FBhi67t1`}5>3SyJnEk(qHL;D}_Q4;Y92nEW2cS=4(_`xOmW|Z)75zH+7TdDHL zL3BLk4jD}(8#d`ejKC~s&#=~Eca=LTA%7D0wV+ex6tj<%HeNDq)7r?|bRVL+XgbyF zY201uCZ=}_9ww7}`%nAxaS0#Pf6Nj73Bh}lL@#1(V6g8F$II}fTu!q~K0O#hcND2; z_@9~L?Vl2;xMECBu4V5V_x|LB{%Uhq&$Pz`iqcFY!W8-wC7OINU6Q z1nN2$8GK*`DDCiHtBzmCK~(10Dt|`HzeQD4+YmU5y>wU1kQVFI*J@xXHuuXX<7t7*kGk=>%}?iItWt*c#4;&2*rUJ`JFotZN{^f|sS;DPuPm}t-Tq6a`Ri%oY%-Fjy9f2P2@MQp zQ!Bg>gY;l}rB|TJP1)uT4tWTLcXTN0LLC0cc2sIb^J`VDhK}?pKl;J?t~f8B=ZOq+mj#i! zIf{ZdxLQX$pTtTzK!_*i&C}489x{)UKqX{FJ}vJtnlm<}GMvnG^I;`_cnO+RxxiB} zD10i9Q2CeuU9BtD+VWt zfz><7s%osEkW{eC{NDp|8~m@Ky%n~GE5Asc{ik;7TRJUXQddd07?TrwEDQb>kd8q88XJ`oqFNI(XpQQ(TM(gkhgi5b;shxH0 zH}NFSYnLqykGxY+G4bx1y)v`$UGJ25ZE;65p`-BT(_z>ycQx*CL)5X45}9)?GT6I6 zKV-pW9ef$ktSTQ}3>K7W2P#J`9{n@x7UQ#Evtv((LKK^qCQh+?IgV`DjW&zAN@Lag zI_o57&ah;u=DwkK;WA@?uci_nHqZ`yTM8MR4|pF?6(aWl%MOwK#as9aOHv~%xvAXg zRU}_CgZmK5+@Fv;(tN5sOz}ZUV7zHMDe35XBthD#KgERX+(Ki?ajp-l(KVuY_Y@&5 zI%EgB-UN>=OZ0r=GDMdVOGdQ%)qjnvE$oJ8^~SiDy~4H3&j=3vUG+ zXc}L?9=Pg^_hi0_qCIxG{)VD{1mfX{ZWh)LulK9PMekh~*Y~wr=U5}FO8#g^jnHj3-piTbbR3)F;M+K9SMZ)`?oj+f_V7Mh9L6U(xcku zR$scQ!YOiic^Pa}lyBA@(vN6( zm>9?GQr3mlL+r%1_oPvK;5|szsz&)|{pJ!XTaXiSqhEr#29?jDEDC~YZ(}a~bEzbZ z$=9EGm{j|G+i_mih@N&urfd8Om)%NxKm8a;B8>okPTTQpH}iK<;Kirn$(3R-9C zE#Cdcub~7#{=@#`D$BbOMqVEVKB_K2t>XirL6V~>!{?XH5k>1? z63(i7iNz?NrwC=EVMV9WpzVI*aO%hJ?Z*0V6PM8q)-$3N<=@@@k&iMM7BnfLfgn=Ec#Ye6hH54ezW_*)iqs-`8}-9f>(KJkTFZC*YlAswIN z79_h@xpVLL-;@ECICeXfB8JU|2QH>j+mH%$lVQv*Nv6e@P|M~9a^L>kGm+X0K5&Mc zc^Gd8fK{9-SUlaMZXOS!C^$vNug@)dSv{L`X1RI*X_&i~YX~+C`o@pAqDxa1R{WTx zQ8=B@0tlZ-K!b1y@XPIur-0|ij^y+Qa`JozI+jqHD8ig<>!%K$$ij;Y>{i{|57(dp zL%D3xn1rBt`z=KO{t*t%BWC<7?d{D7z68_J9TV&vpa?>g1K9(F(z58l5kXQH#_D|x zDbQ*G<-Ar2?9jfB{_z8;xWli0JoOsqF_zdRK4^bzi1D3P12IKU7X=q2Y{4l0i_`qo znEq2RL=$f^o}rCg=9V4M_<~JAHExK}GBJhEh~Q|JLUA=-HB)EJv%_64SF^I{bv5NE z8nN5o`7ZU8vzJu@y)RGt3C7pW=C{eac#m)X2J^e zIsTkx?ToHUhpbLlGAS0+X2|^c`=D2MLw}bpOBu_;&9-Tg@LnILz+xne+U`_oFyenO zzL@lOfW>d_5?mf1ImfZhr^>mb+05?(`h=ZK#2?FB-@PkImk<_IMmy_*N!&|vLI_zI zr;TFXmMJF@gjs9aYCB<0It2LnzxV8!ms~Y_&=z~L&{t+Hwoppk3Z#B;97;=52726h z&`3yG4dCmvIQU3?rS@?wFv-ww1@>#@>`QWbezvFakj$lM;5iba;wn+Y%w}fFe#{{R zX!%cXx1z%GBO>8bs&pV7ni2sY9Grxf^zjm*^dY)^vSs??{6q@X^sZBTYQfiaIsQUG$k+~Pgb zKfg?=K;l-i)_n&gnHkYd%EOgo1)&r+Eu=ZL)5s&|tgLjt;VP)!|6uuZWja2$PpJgK ztgIHCrnCa^`DsT#>Ab@Vw!@@;J)Qq!l@~XTa%T2A7b$5S{~_BRrstA9q2c zRTn$@St3nD=uYkhca}XoTV`QZnjpqRy?*rBf=XSNh(}<0evd%zlDy*5Prb)I+T9ZX zRpH*wNkDE<4qCC`gqKC$Z}>UcCj?17^vh)benVbZ0QO_Vmir)F8kG(j73yxqNy3LJ z7;v*zrGJX(k27KrFH8h5e1LuSKElqJ73qW%(ozrKl!;+`p4|31_2_R|liHfh0X`ic z@O&GW?EZl{QC%jr8fUhz1LDXWfNhM(#vQm^#Fp;chnd3`r~ZnMcW?pBS3g`KKjl}O zUKwykWkiOEwv*@*h6P@V53@2i$sxmVmUfb5Y{-r`{Oz(`+i}LRgcc0T+n+EP(*`hg z0{~OUr~)wc#_v)~0Hz*b&wBE;2OjSqroLCAz^34RKZyIducXN=p&C6Xv<6QX9huK6 zPeK4#L0db;eT0)&km-RdSI1i5oV3SDPTO3-we5KjH&NH;$eYLTq?Pv_y{kS><{;R` zZlKN@>#7x1;A>3Le*tr9Ozzr1<954Cwl~7O4YJ{y+tQY%`VxX!{i>lv;vknVUz zkYv2R#n2|7V1%tguij?68TUUm#1LHd|GdKh#)02{MgY?oiNWYr=Q5TwvRoW0?s8?e z)v?7n)s_oYg9ecpW!kNKHpoV;%$&1Cxhb09L?N&?#>rtiHU9^{Y6Xqe6^ih*v=Rdd zm{0u_ZM~J|oBHAe zkqi+S8X#svAV*v?b~@9XK|?+>&y4)W%LM3o0>YO~zDPFpH~YRw8NtnSh2%j-4C+QI zshJ{5X=~`7kk?TB-t)uB{@o}l7WKo7lVp#Wy>tqlMZ^S%& zXoApV(HrK?ZT$sBvpLHyw#DphMd|-i-s@EkWH$LU*dagzeb03eTFKgpp|74%07&H_ z|E2Oo#+lz<=KRrMv0V#@xca}iU0^WmC0jickM?fmfNj#flaeaC&4zA7T-!9+>nY^o zgV1=Jxp#WskuiMCwbS4#x^@D^_3ME5V%6Z6TgKW4M++}FY-_g#^*);J0|8?otBOeIMV#?Hs{cf7A!*3=ev<}23(QDQX;9Ch(A?q% z{R&-6Qa9Ru4T7WuC)hpHZRIqideZX{3~s*edh*!|e)pG7B|N1`=EkPUzcAp{4bZ}4 zkv&O!DnkV|)};zMij6u;ED~H;JYQsgV{VR7e)&~fLs$qz#k$1djDG;^D=Ve|LcwAK zygGiZsC;|@&W;4Lj?KCBP7QVnmb7?W?&#GN_LLQM$E|~ z(V*{We9e>-o~s>X=Qn~A`fsjc_!cj}>vczQO{+0BrFej&k_IqnH(&y0CJPworJo&6 z79`Dp{vqjgZTA#GxCXkp>T7?vfp%B-ANRsaepY)uK*XHaegrfDz+iv&G;SQw)T{W9 zqD6ivK|$UZ2_ZPG8QXkz2>SWFa#V3FB2l^76r{6qC_iN5RHOF=n@G4Rj8DrjTV~{U znAzTWm_;m(l^MgZq98?Q)ae0nmj&-lKoh%^G`4@Qp+G8~o1dKEY*)#|QOc*TtUUg^ zjgm1xCy;I}hV_|80a3Snjwcg~5H#k1V~av@>!kACx6Tpq*@0flcJ&JRbhs;G^+D;z z?&x4YS7_9qKFiY~S*!(!n9AGI^Cm)*%&#u{J+k>QpRlVb{=5i^Zv4!lq&#e=d%CN&NTm{o$Cd6X?xu=#~_doLHV>sF}RkWai?2P+`_Bex>AGgPFrOv%b>WpEs z8pW{#zNEJqR@WM;^f;78yMEJ$C`k2oPfFG^TTOO%;40_$lBdHijIh9%iiXCjW|$b~ zBfDU`-VeWYzV^v!F{B73Bnf?{7?5E=hG)p0HC`0J4ig0gV@NE<) zoWQkLyJ<45+UnH~qM`YR8WQgdH$NAgksYcx&!#NFKW6lor3u+4xkkElZ0Crh$OM7E zRbEtLEUtiK5RFXZ-f<%T*1c)+eCrNh`$k#@hf&}ZD}LmYM)V6z%RP!90^+4LzuSCH zS^DmIMf>ZO6`^JtMg!$1`?ksygn2Vd2bBdnV;bT{hiCf%?u@ORyglCwwbz=VpSC@&$fKy^?j21J zhFiX`6lw|R*>NF@K4Waj*G$lMa1seh%%TZj&2Vf^LSb247kOSx&2}RWR$iahBLZIz zq5?e^+~qHoAeb+zF;55-ZRONvW!FSrKvW6+0Y#`k^RWGgJaL+I?*`%sZh>H$$4B$2 zBOI9P_vr5aWdUfvg}W&wf%%rb>xb*xXQUS(+%rj#g`b>B@dHK2XNmmdcvYTjl)~LM zp?eGah5kQ|cg2g*kQaE*VBX58jPBz}O`lxS3wgura3BI6lqJ!BEO2$ z14^FTpkbR>W04rSFa(K>G7Evf;C|UX6L94of%QMS3R0w^`4@BQ9O=9;Kro`3bQl2sUJ zRIJZiX{+@KtrzIHcX*z-?uKR)C?_dn6%?4R2TaSRxl@dbY`6|uXhq@?M%A%vA-by( zrR{vK9!K7|QRx#JXwR8MnPU54X!o9cIo$wo?5GGBB%}~8JlPh0HNMbQgWAC=(hcKu zV0iU`pBc@&EMXwtNAjjK?JbYEh}W+%6GnvIL3zDY$ss^Fr+@69<~?;4zI8E<;()a# zh(}^VUs>7eKLqU|aVh{=esto4pyeuncx=Kd(q^{w&_!>%f_`RlmfDhtrQL^DCQ+ln zuQ2k2buC#}?h@xp%4L*Lx?0@bzgigy=1XyL6MF%t(R1~zPs}07*f0}cI?e{?Qc6sP z7BQcTeECJ2c^C+T4{N?OQ$Xe6X%(aB=K7miLUCYFA~)cZ6+p=zx|BdjNXDsst5=FO z{s*{jwhdr0V|^vjll~vzYDqN;6~=cdo$IV)x87a(Yv17hVh_5UG__fv^q%@~r)i0| zvClkRTer+18Z}2Vs6%%KzMz|lPZ^Kgp5})uf%C!11{UoztPh-bG6ql|=%N_w^4vhP z@GP%GBpkW6tk$`s^?L?yPQ2bhulc#}iT;S|x%B~Y4*m8wi#j}<)XPr(HSiyrm9ITa zT0^=Gn^VDqAKovKM~8PYP5{x6_cj~I6%#`K)sOqbgMKoj&UZue$VgSno-8}sB;3ye zuY(7RT{u}B+V6{^SLz*KKFEn>kf7{_puYc>HWHrf7Tt1Law8?OB?<7&q>^NgYb@_b z2%VR2_WesYjagqzv-}D(2;MXZvAsL$ZAb&=ET=8!nwoK-N zbIq+kKVD^n<(^=g)`zVSAUFnKrcphJA5wv#FDHkxaGgdG54;lfw%RNe#Si4k&L+IKJu4FIF8i$A?a@bF5-%T3WW6ODH}lG@;w6tE;g2X z-h4?&m%v7{03LMOxl-au-Nf7*fV=r$0N3XYz|Cy*d$GqO>MJsX1^(2By$@DxM}Ezh zVKGnlc28?h@hi92n^dYcraLn~N-!KBjkL(|ugv3U6%S$fA|!5Vaeu%hZBTIN@F9&pk{6v3W2Lkpyvq{O7{EQl)Q!)M z-dQzRyLOtV{5r4P!wjw(ntN~aXA7EXh>(F!1x5kM+QBN%9>>ffsVwE<9sC2X=CylC zh)<2KhVO&O&<$G!xk%i`ml^zrzw_56Fum4Fd&mSowP_hxn*_~2&cbp#on9nLRp+EaHRl>HejdW>l6`_+{M ztJiHquf#Y$PC#T`+$W2qp^=Y}QxvgnjbIDZRV+hs9pAm!(rz zTVA)tZe)M}brEEITNDvSXwUK(IkrBjp3eNy`(@mVAk-lzJU#%s$lAOu8*Cp#A9S$` zhCmZ3w$V3!&}+M(T)UL@CFB2H5W-E<{2F%Z4UO?o0P8MkuP`7ExPeCV&}-Ljz7h7A z$~N^JNPkr;Bj+hx9##(L^yG5q0gyrzR-s=ri5@t~mXHmfmuh&BtqOv3MP z{dQ0^x1TKM>74h^14HMfcw6V*HS{H|*m;kp4@dV&@SpU*IPOAQd2S7U%p^Q%`DOce zAkPdvvvPTw1OmM%sm@=y#lm=*xaN@;FGO2L4t0Oz^dNzwZdWl?PC4bG&@XesS%5Z5 zMZbv<)Cx9H-)X-Y_Y;Tfd%b>s?ZW?@-8kbbKObRqs_#70TV{$L zNO0`&>I(U+#_oB>O zST~ziB>=%8=y>&OqJINMf7?~%TCEbA9${9P6@?VbaP+R9*ZuH~$8SxzS5v7D=hUg}-f7$sui_3^d~ zCFv9?|BPQWluMp4Z4@@+no8F86di|$nFs<~#=MhcB>0V!q#p!0$uI?#wA-VN{VP6o zo?eGVQ$2sH45H#rN55@7Gl>mA!mCgi8l|`U^tD2n4#)TYk_8WX83GOaeq|$7Y+C`x zsJgX#z)%6e`@=;00e%#!QXBnQz&}Zp3*0d?a-|~Ezv-ZpY0O{n92PSwzVICnE(8ej zO%iFrF(8AVPF|M_B?L#;Gy#-z_X5M@pj3}>->X3u4k}kr*Z5h>6-;G(_D_wLKSps_ zG4{?VoJw!$+jnE6s(4g)%0S0K#>-NXuj{|gZeEX{;{@&}+8;t-Q7_;D6UI#kd~6} z?(RnE&PhslgS7NN(6!dPzW4u*j}3Qp%gG$$dG7l*^sd43k~=N13T7`Ll{hfm~9I---jVkNz z{ddI5#2Bt)M_HtK2$Jt@i*9YL%u6QSoyeGxC6pI5a1N2pJfA24vci;0g5|$WR5hb>gcc8he)E5F)qMx9xI#JEKXL zh}^?=XC)FZ7Q`{a937Mf7eIox zLb7%*gF>iLc^%~_uQaUpTMcbqL5f=o_O+u;*y0deB-iOAdBS{WrVNQG(gBQBJecNm zg89IvB61fW58ICkTfs7iTx}*uc)B)d05=$ZS*c*Vt~`TSD1}=4@-%nrepI2-O{rRw zjsWHn=$8{^e<7b9XSk|BdxcaBUu(p={rLSRnigu{6G2wmuMX*9^3SN34pb@RSx9-~ zhz!eKZn@6fK-$zfkeK<|O3>NfY`jCOwESlIUY&7w-M@QGlSt5D@9O7Pn=(JPj5&O-e!@F$$1*Esc-X| zy*G@ZmuOV7FY-)GpwVm~2f$*B0DS;D$K3H&IY)Z24>Uq!GM;D+H7C>T8i|{<&>D*t z8$*B^@D}ILB(Wu=6e)q1JY3BD-!v7d`t63wk=s^)%4STgD2ADkt?a&hlJg!Afuh^X zN1(5+f7>+M6?lqTOtht;aOwPAVLjE{n#4@*nz{|=}g^15#RGO+j;+eZ>BN|Q%6s44KB>+C4IXF2OeVGop5hX;?k8q;nlW%7t!-c zocTVOWMOXjrYpnGEYm4EWkgnX>omDwzhr(Z_5yp_a~{R(r`OOr!W*Sp(lDW|(W|bA zF?Tz3F-gC1mv2|`l@)a=rSUR|VQ)T#%EXq0uw>MU)wtVMHxJzPGnY>CdDRcg-r62s zVuw%!+9bGrtEV>(&UnCj5zelyUYad8?w>nQ%hwtz%Qzw&LNhE}*!Rr;_ z@%h`onBAc6FsXzz+-*zE)E}u<-MFv1)8k;R>L@19IFgLOG#J$t zR@~0_?pSlMJ*hShf(Y!eJ`^@*8b8-&m-|TsFnK?+qfG%OZvo>slc)Hb$vgech2^Q#S38)rC94gqBHV19wF^K zClQztVc)ueFcrVZX)&B$^&%fOHM5pk=E-?JccDPi5jepfL?X7ZBWdU$kOaeT4@D3n zA_2o2P?q^<1a5rMj=`?b0*ht|oU?kw#+S+V64TP>uqH8KfQHjO{+Dqvof8P}6^Zi! znZXEG^-q?Ni8sL^lx8ks`(llVvdnKQH}dZRyNA_-_kqG1xB zFJRw_gW;u)yQi?Y)^6=l-gS;4)h(37MqRyrb-&IhAcz~MkG7teobEAH2fVi4On!L@ zKcrYWJf(I47R(rC)owkf@WOu{eJecbdRcaxztg`=It7pXSX zLd(3k(`T}k!#gaIL7?yj(_lV`VpNuO7j^@?49&cbbYmtunty;Oa~BJWq@Zg9x4dxC zD#iJ&#$YJn4<~|_#jc3y`4Q~m{Du7plw%_??utbso-d@#S`sE5K0RBKs#Qml&|II% z)0EP_)U^PyqD51avl!)s0v0a-NV_@v1Eh76d>VZv9CrxC?2ez!#pAl6 z?a^M3%j)=?4xmG(8zR!mMNu*24C7;obw}9}_!e1wtL?m<963T|$|9;J8OssRJAZxH z$TYDl-OPXm<6n<1?ERb&O%e!S-_*oIL+59B{`sq2ObI6;gP|nv^?{h8aJygdhSYL3 zr;weMcATuAl0y*i<=Zj z^}uB55vsXeJs%=bq(HuP%D^z2Yb!SppNuQ&UJkpfOflZx9j$5n1|^I-!EtS?*1+A} z7!6{`a*cB{(9=zIs7aIjSNiMYcXG!pMy`~z!P@eB`tsXap^Uqy|4^VQpZRl+OQ$c} zWWDEM@=SbDsU}|L*N?w{-aN@txOslH1CyPc>g_LyRc(`@CELEs7bRX!C)w9NBSA_M zw6rgC)j|l)H3(eZvST+Ho@FP(^3-eV*{G>$O)Vb%eCPAH`~IyvLx>9KXL!9}UO|j#4Hdz47`J6~@GoK9`&6wS)CGu=%)l znL#|+^^Z+b&hxP^1}G^ll0TFbZ?Tw~?Q077GWDB{uzN247MRPsfkxO3MIfo9PF1zX z;u~%2GhK$WV!TGf`>vP2wc5t2CVQeovRBC&@%pp>0YBlP-E2bTfOtfmCorMyeL9T) zaYh1%@#%!g)}XTzTz2C&nXzvadq%n5)toZS8hXk15O(;kUoFy8q(%LjyM)S=AI{ay zLsBx#Bb~Ebrpp}N*HIouXmr=Oyn5%;tY%Wxrix-^aGzN#+$3JUT+iXl_{8cNgo>`y zDiT&)ha7-@QJ3}8Z+2=2an^iRF`i<{_Zp2k^>Yp3o3iT*lv*tDfP52M!j+H3!>qio zE_$AiEIG<*3inslBdJvcso0LcajZW+y|Y3?vBzQue@Lga6M3#%sQ-XY znWOTUxdjTw6n%9hFs3K&&%2$aLnEFcih>a|yR1BFR7ElpB@?Tq&-^jZT68p%Oo(&4 z2dprYLrxZ~pN>n2Pl2Ka99f-W9+P3t_`S`uc<^oXc~q!O zxN%a`fCkB5fp5d7!2slQyho_C622JAL@2GHu^@%NoAyKm^^LJaUW_c#$TguiYUVt~ z6`m@ln?x@0C)Eiq^*9HwMm0LT+^^vBo~FDPa5nZa)uK8Fsn7QX%Ff}^;~KEE%I~a_icet5Fm^KlV-h_m)Wt6PJG-= z^dG(Iz?l=ER~@f#_^ns1{g+;qBq9sO;shucobWGzotzFRv&(+g_RQ{;8K<_eP*4<~ z4Yx_NO?Ey{KIDdiWO;<$ggObZdwRKr;7wS~7NrkgyV;!q?a@hnoJekq87=G6!f|u? zzE|2CTmESE$T}I6*&w0@gDF@qEw2Y;)fWQCPOcbkMN#j&pZx)VQUZpCFBv zf4V;}B9FI*R%i!1c>Ih3;2Yh6_sKBx3eiS&i1Ga-^bI_Kkc_JxgbcfN{m(r8={_1_ zZ8B9;r#;AcWQykuQAG2@7ZbEsB#_NQk3KaVZJ$U;%Bo)%+JbwkysiwmD;BLV_#!nnIPOq6!^w;Atj)f zu8M<`Q9EK`_(MP4uBbH&l6(f%p}%uFiHXQ?geEsZ12KIF%j#zM5udC;>G#=xIaS+O zbKHNvwjAvp8@I(nx?++frZnsC-XHlq(Okd2DTn8*X?nx!CNST8^sAmb~7PW4Mjz z46tL^efq{!F#wBj{N?|D~;u0{yqGWj+iGk*;IsD$;PeRo& z+|k9S?Q0D{umF87_*D$WRV8$?M6r2^vbshae?qB(9>3w4=fdcV0flQH;A@&WE3{V+0rJzMJ<>`*ep*un$WQm4u@(Q7#{Kxj=;5z~#j ztKSE^W3BBM7nJ2c$EE8-z=T?us{LC=0W8Q@+|Fr+BRpqj?gwn|;7MyKbIKuHIiIrBGBV^Bt8bCv0 zS}H_0%_7n)S?6B8$YC}oBw;P?i%sh8e!a@xR4XIEog6z9)uvG?E0+w){TwF!PQpGq6cNM5-Op}z@wW%|&1Jt#Ta z*M>Yjb2x!azpDOZJ{>2{4>zu{$n_H>(khOV!*}_Se}&TIE@6g_0q?0^C z$WjabP1004JlENBY1a_~P#TZ1m(+OxN~5G}lIVVUZcNgRAk$ENoj{H7S}ii-R1cSShH_7EBm;(C0t8Q%nGmLh~!QW5c$F%&vCLfFrM z=Jd2Hb2}Ty6Rr9Fgx6z#hJi>zgq2T*1=FE3s82feg>M3*?GeCx3AROI(of1-#U1zd|-ISBtw_FsuXDrKIjkMaNntP89@9 zI`$>2W=L9P9?K)Srwmi^3L}f$WE1)BFzL`A?fsZZ_nJV81o4`8QBSA8r5XeGH3kjA zCD2sdHAYRoP?0h1Tk1m;0s1&hlKd_p92|AXH z_&PRpO8&?$57@lYB>BaZokv&D;&6zEL=1R46#p3o=Is7?PCw-=kbwKI>&5$NV%lT& zf})oS_|jidrb>(YIMMxIX!c5qwB($r4nfCG2zdhKPt`i7MhPhn{5y{7UH^zfg^Jg4{y11Eh*@em%j=^9vpsB5NA@YK-`t!M8-y~yXxh}4NOWjk7J5O^ zmxvIHouk+FHm254jv|Di2#KAA@_p`0`-BVI43(&_rP8REAyp*N zvE92SB^V(jkV`bt`qn6eNJHE_OYE^~63DbY;nu_)wEby6nU{!;Lbw|7xq$ab^vELF z!qw!3NZE~Kk=NDO3m09ZsCW3zy2oHI6F=-Q{wDz}9^=3@5R89tkM?!}ke%z%se3|N zjwEjKA0z2VM>h!d`j^393E&6Sq^{JzjoC}hsN*4MpIjSgJ4gRo#Z+KoOinz;cdtQA z`uCFR9S5r=uExj%JI-3?`$ZbP;Fn+?X2)t7UWJqVb5f1ZpA{v3`c|@y zFv=auqn*0i@v{np_@AA>9KDmn3$O~4##~}=SxpFHy}DVKQ^N`|+0+_(p9)6~%y>*{ z%y=lr39D+9==UiTLZxYxDIt>J4Rs@*K7OxLF@8x1OF$zYHgnBk7&W|}EBt<7X5n}w zJ74!lSf%WK$3@m^zahA6fb#KOOkHBw6GyO$zeW;h=D`WzAlgHWnVZD<2!c#nv+LgM zI3yR4i$BxhCqnl1*(>_W1)Kc+N1;Ws-(4Smvm-3hbaivCg(+Y7T}7w#yZhHY;_OIR zg{BSEWGXtth)n5?Q^HBanHF+I*Qa=8s-n?fs+v!y$vIC=6f+Dg2sql& zmZw-|oS%JIv2_Xz5@t*#T>xaQT^R<1%G;i5Snm0J-%WsLao8 zInja3ery9Bl{=*VbZ(Zk^*=`_;Klp*Pd;q>mzOQ>&o%XJR3Dg?XI@_4;DwY7$?i4x zRS}{Y{e%psT1G`aTh_3`*JVXGuI-b%y>EGLh$=5^W~T(%7Xu1VDKbahAhmhW7N{N6 zs6ab0JTJD}W7@u7xK80*J{4BpRhtspzN2k)5LdF?((SX3t9g z(Lst&OQYZNG=80lCXUc8ikoV95XNoq3%foMKoT;(!g&`guWI>n^ac*a>g4sMM-fzX zl!bkNHu~a4enplg5PiH`mS8Z|9sUl#;#r=*nPky_1GWTVJIo z^#w=V$<@DApQc`xR8Oi;ljQYF!CW0V9cv5DZL##W%7_DgSIBE=$E=SJ2j>EWM%8T3 zTAO}=>gj)C!?%Aqo#Z(<358#ut#f=GPuSvCXuX@k?`Q7lmK(5t(cw%ocMTL>e)~1c zdsL~9pJ~tyJXb5v9OL;Gh5ce<01ICO0ll#yP0PNQw+e&u7$epxMk6Rv$Zq{w()M{Z zT%9XtK}N_tQFIl~lWpD$IN83@58#%MJXTgUZq(=rEh>1{Ltu9RTgrQLE-N5Zb-Ex> z7m@hEHSTeM?zyfKHq@$2_e9jMOJ7jj4lq5+O`K_Y&ZQX%Q8f23(y%(2hc?2X^00aP8mgo--h#hCeY^?RX4H1_!NFmL$N*iTe z5hvx(je{x%gb4s?Cv|zDb{S<*0BEK2M{S(n&53&g=#VQ&YC?Xw6_5+Ag!Vb*8rTwz zeYXQ7gPiF-*$3b1uL3`4+smfL2L>F(e_sVvI3oRUL&m>nCA;fGaU1VeGliGBof?$s z8@Ux;7`?B)u?dp?SRBuW@l3=5UcvUr1WenkGW>qtJrM8nU+9qR6FSsTVi%J!8f~tq zaZghQNk~`+rYq*|Z%-?q{Hdq|fIroF&G^}p0c9*(L}{~#T7ywqe(*Y_u#7t~g?q^? z^ym-a(e7%EgH?7*XXe3Q?BS+x*9@dR0M1y1YVQ8$)(%uqD*FNZE8W%=d5@II^G;e7 zN%c-7M4S|~UYlo^xmJ6ILJL9(bG}d&i+OO@R)o3v=Dr7>#U^C5qkju7`*|+xQcRT? z0jP%7=?_%%Jqv(p#B7ftlvV#gHNOp)oSgZP0>uESFE=*NFvfrm4qB&pguTi+>~$Pk zly?&i-S@t?_cqH~g&JnhkCp7hiN#GlX}&w2$TA8hW>IEP7E*B{=$K3d`+dA#4{`kp z`ruvrKXsqcf9pOm8QJNngGR~AY%f?26@@=BalE?F4jt*}c|hH_PJJV%u$?lVk(V~- z7M}C7fTC3%6E{d6BJ1)^yZZLa$Iov7XDF9I-2=_2t$;I&@{8xX-2Pn;A24CSFe4mN zO7W`iKXiiqP!pDv{RNw;i#a?v>KO#|Mg0xUyl4Mnf^!OtxzESda7M>RHg+zIZ&)r3+_laCQQ z7>Mv(>mau^bR-uWt1B%I#3K=ayishPwvRmAoCdSW355RkWX@wec{1(L!6rW(mS}?E znBvOF=&WZ0iiSd@-Ec#`v;h4axMi>VAEg;(PHc(XxvO+oKcI4bah?sD*20S6kpNG# z(WdP24V`D~CIGL$wYT{OGl}$GC93}|wAxlx#>U;kV<d5=pljO=Ti$)c6LWx-clYwz|*!{UO4S4o; zFPm+CrtqG9WH(`pP8OG0Uy^Rn4y9OopbQp)Q@V41g_AF6a=IFKa`IyPNU%Cji_}(h-nDOEj>30^!*qky=5~$Jw_iMl|$AQr_@r7?<8Z8Q5 zBedCNSQboPX3a#5UE*KBQ854ORvdsQ?v46`fmqrg}kxojmhLY_wl}(QLwv*6gfzJ^NuI$q z_4^ST$GWvxy2aiu-5Pi%aBaBVktKmI{LGTk;$DOG49iY`6Fd~F< z3e4s01T}r#HUeKYP7wj@`jTS>EDVjF4Xa09^QZdE?cn4EvL%IDeOokA zA(%qWaLlfDg}xz5D!wK?3aZT=dlEMk-$te1xrx(KN#hwv;ixAGhA0*60uJ~1!eTn+ zoel2`UEDBSsxO!4xMUz_=A3EyUrbL1&s@~SKL*duCxhoYmGo@&Tqr;x-2)Vo@`~?z z&X{-M8w>mZK?7q-sjnjosUfhKv!c>C)!6=fN!dqM|5zqHUw3m}0by5HO+ZbL4vel{ zFQDY$qnHnERJxX$C=yf@Su?@(5&%%?jy4(77yXZOU87(oy1 z{dA=;ARqtVo<<3VT}za2oMA2f53ne*QCVTxpX;Fy8y_tEBnlSRgY$P)RVBRB%M6yw z-zNsKW{Qebxwi7qgT!EGQAAAiQ)0N#Och3eFv5;{U+s%G3_t0}yWqJ$~)Z0*lOB2c3MMdg;4u$zg`P5?Z8 zd@(1W0yHlpv8P%xi^+cg(A7{m79mvh=kTa*O^wGBKhdV;!;MM3Mw1yA7mkFwq^W)3 zw@QXu2NhS>RBGiWFK!G00w#n*20_dv;8uEGwVk zOJu_1WparOh2X}#SWC;YDEI2bnWIv}p17i`d+6V`JzDgR!U3AZGsC>@Nf&1i&t8H* zHy$R19e5H_1xX`9zQMbnjY?*@nI&wY$a|-6lTibHNFSEd9uw^)xUTEq>TtQbc9IVO z(V7gTlrj8(Aq$KkiK3S7{nqj0`8W!801*(0oh&J?@0v>l1ct z>~+#%lA*{a6_~Hp(IBX71m9>a4u886^a=Mnxgt4pc~whJ;x3^!t&fw(RF|2OrcNRg2RF@S z#*bZe&~NXA8SEyJRr!Jx3($>ow3Uv zXV%h)wY@oPR##?Pghshp+ahb2I2)#WCx+F&Gyml_hf64%-;Xq9aAfp|DlWcn<`_#B z@(Z#Z2w9^Dp8U**a4l`Ly^WH#xN$AblGgq30YEFBDsx-h+w}tNA0D(U;>OQkfVTt) zO(PW+_QL@N+S3?{H5yiF5Z^{X^pQF7wkC4wg^d+S)&j7~i$FW8Ixe7dq_}gbl`@j1P9dX0OQI(&ZW(OBfX2rz6%!(is0agD?MDc8D z(2j&?%U=IOs@U?0M)PCV96BAj{^e(Q`&tc&yfn#N;6g!1 zB~}|JIu{2>L98B2qDq~w7RU6iOCwm_YBY|RhIQmx& zY|IOwq_*iL9JKESUpYpu(C3>clVUcPLEYD8VV=D39+?Bub8UkZaywuiUXTR3Vn@>W zx}$q378ng;q#<$xQPw*8+9CJ0|6^FZ9p?7MkpRaCK6L9na6E3@KAzV&Ci`Wd)R9%Iq&L@-a;R-(e0jdAw*Urf$=0PlzeH(8RN3YHoUNLPxSn{^}Gh> z?q7ST|KxA-uKAh56k}%?xTYLn{LcvO>5P*;4~P*V-yZk7oSA&a#8X4IdENNjsBCVTOnc#BZ_K6@EUbwd1>#66#>kW`KUDZp#;tF8+XI*{U4Sn z!nnq5OD7sDF6zqX%GBpzqO-j5PF%07kD)&edPuLEoz&c3y2lKCM^<^1NY)@t!J~Hh zV8~MzFM5W^m6T6!;m{>eCA4~pfms!#P$%T*#CV3+S~oXb2-$ zKn8zohQfbrh8IsZ!{7$FER)4FYPQ4|DZ=~4ofnCKs+SY7h8;$#j071^qtEy_T>Q=B zd5>_b)j2XNm|yIiUk_mdCoNm*YgQOWJ~M zbwUKT@#&M-5a!)WdJois25aEr#RCqH67o+K%x%>`d)rTG>zcr6%}W?)_Dd{yq9hc; zVq}W8!WxRw*X`s!FMIcqt3)WNdAmZ6)ft*_V>S>|feVNK-w0HTdnTRzW!9Q)+x1Ag ztK10h_X@^YA5(gxqRdhJ)?c!u3q|vhh2(+UZ2M`w;}Jc&iY7dBfJ5}!eFo8k0)LZT zJ&Giwm~Kxpy>(7_4GSso8L=@S3;1aPJ_zSF9}wvT`ul!5=9-9F0(GpYra~`!$y-b( z(zX34+Rk?xsl`rg-5s&~bNCjAa-NKY8y^bC1m&8bo8~O42Ou~1{99XxqRFx79SfyL z@Sm7RZ_Bv`x#on5( z=n25=7CvDTUltA4mbCLL>Cy=)b*)jFf}p4L7; zV#)^Kr~lpVN0FHG)fkoVvyY~tFjx~4-DAMKmbUc=!LQf!jPBu3|F>H3+X~cRJ*)gl zZOIJJEF=rj9JiZb@q~9!nu`e9J~za8jg-Fjbk);eH2>Iy^P=&fmG4w<)asEeF7PtQ z%p!VpgG`e`~E|pn)kp@V5(TFm&4QlEV?G z9%m8V0tA}X|JyKVW%)0|Ac4p~hQW>T^6LJi>^e*AA<0I6Z_M24>S{-KF!N|L%}2bj zynbMNxy^l2DE>BM=q>0)(AylcraGBx9>R zU|&i>Qv<*)!!DpYHyV!=V-0;rH8r)Z@ab<2A=n|9KN_8B{FXABz{J$(>JEJ5cw%-| z_Uk==`ai){)C2>y!X9#o%ZKPojfINH#r5m9dq1=iqi~bv5LQ(U&GV*wseU)eZtDZk zo2~mgD{#?k^n%9w^TPdREvzrt=x5?J_}9jsIQE^mE~){J4FYj5ZJe!@X{_&?U@BFQ zuPEd9eTZmBW0&&o*|^&Os05uFJc$=KBC?DMmdrwi9;RgEOw1IrmAZNgs7g1LLtc)T zde%us3zlSX1Nu9EzbW)9E0N)y#yE_BISiLbi{9^xDPQM<7&ilf*1pbt4x`KcI-XNS zg%X4I3(*vy*7ug-tqnJ9hp<@KwXtzjaY-4+pjp)GQ&FQ?N!^br%_I`)kX;YxnTCd# z7rktfG|q2eQlHiD10r%}LugILkBdl+nB(P~C)uiM#7&(=_+!Qy;A!yDE}VJnA{jLE z`Hds)FPeJ``oVY0mlyR92j2wGk{{D>(lmL^tF`YC=e=ZTWQ&;5-UH9*t5K40=&puy zhO>6FN((lDuRehb-m4?R$-&TD(f+1LnWiT!gw4;>#$Fw)deMH0#RYEm8czpT-PX4d z%+-~W&F&AzdMpziScdRByyO5ANmBl{_N6T|GH0pB|FzvX>mnA=UR z$zu^-?gZUFhe`fSg1lhBu05t{4zOCz833zQ4|2I&^%4usp|w4IVznyFwxgyrmzF2s zWZcbjeWAvH>V64__Haz&Y(OaII)JC_cp>JYfNw`U;Ya%2{|e#`(J+1f0au(mUU}ks zi&DVXZZcq*SEp&KT8C^VdjK$JqJNmPFZTPnPt2LAF!Kv9^jzEH^NM4jWKrSU+qp55 z+8ofSwBLxe%Z{PmOgcGmk4TmL4m6c&mvz0%!mR;OL{si&#`1!c8X}RkNx+4McrE%d z!~FZqSX3?YD$%ARa@(^;(^mJF-aW~u5_0+y!cU-C?N)sAU!WPi1_c0`3H-Xgp!xRT zb18Yh{OjZxsaJqGWDV2~^!9Y6{DIC!@Qq^u=#25>r7GR7zlD{1V8mHE+!Z#K@F>g> zK0r^vkJFqV-4FeA#0iyVlgh#!)%mklumG+Xz(xO%G|%e+$+oaeyWz6;+qbK=>U;r0 zU;_FM2apB+-0NltOEVqYb|2pEcW=(|Q>>KcRj3ucv}E19s1!q%jK5|fa@uYS+=PT3 zJ{V6oFQBYj#|7BTl$a+GZd}iiMXNZ-owLgkI?HC!DQFLXMgjg#l1eDZRVWiECd?3N zM1Kq`*Kn8{=cXmt9C}Y{D_Ju&?5e0m!&_}S5lB3m&qsx%nh6{_ZV$qtJe$Vx*o(2h zq?_$iNK^wJjlMqMy$1AMnl4{;#1vK+-eY9HdzY;0(h>54{*psNV4tqGByiFzad-Gh zRyh7CtflWllwE2KDAiRJ9tJ%OhDg&8d{O({eUD7A0W9}R+PxA-+?>N+`6`W%$-FV= z!xnB!%LbXiNomv$bDqI~eEaB5FF1N(AYWL=-Ya|PM;K4VTRJA4(bF?p?ZUCVR4A_N z_n0FYxn(LP;I!Y-ctJydRRb^lqg9DB(t-=GSwZ?z>tX2%cKzY_zRQKk@m81HP<8d{ zyq`d$nts8yfN4|e5wI+I0Y5& z3v~@CiV5#vEo&{5@s^w-P^L?W$xr)9e%Y^9nJ^#3wDE(wFS%lY)B}}r0x3PW4C>ond_0)q0cyc;o9rs3bc({p zc8sC#uV9Z}sI^N4b=>lk}V0rMEEhY#q~L&8AoxXqOGT>_VjIlNY_93f>;*830=)#SfXw#WBC zl0abG+L!uIjJTd4_h4O8+L>EMD7k z*G8&uKQhFhzuywL-R-qe(8U!cDHvr{s*-l^kZ`l@C1)XC-J$%D_Y{MA`cBb4^jzJm z;JSXh?Of*67oz#yVesU=M$O=%-*MKe5xRX(R+~&884msG80Q`FluC@XpO&njel(>q zGawm#-akHz=t`d#Dib3{DCZkuuCi4OHLW?~;DVgsqJ#)VEe@9T}vUZ*qqDdcFO__NCl(bpJ)ig^9RvJYy0y>N=n&`01MESPaypwWtBk}q-UljI~<;W?FCi_58-U)u(Ygv?t8(Sxe^ z2Q{JorJu|A|MYX_{e^cIKKC+366u>gxxHH7jL(%HPf0PVU>GXBeFObn_k=0%ot-uy!^RULrL zk_L_<=NC$;%siT^khy?={C9?R7F6sO6GppF zRD^S+lp!4@l^BQ;!Fk_zA@&S+=0N8Ub|!Xaob1*eiRZ5XeCN$_@5fQBS1#50tJe{C z(>}M~zvUVxNHAC2g#A$x>euj{yFPygC<*sR7Oz##m~w|i$>skoygQs#ii<(A_GyFS zpg)zbPWNA63KN>VW7&3sde86jG-ZSM{+_bclMPDu_cKIes?zhQzGuRgdkMdA{}457 zuZE@h*<=VS2QUc1x7h#LElG_G|Mbt=O3hZSAMa|>pcma9oWZOuD9U0ucNh?^PuZG? z@Jnm%*qO@i8tcxb%V&&|C6R-|U4;JGw0&UGYyut_cJVoxZ^IY4U2L=5h2f3;?T=HQ z&hDK6`pEKsCI|?gU#w^VV!}5a*TRHD1pn68ncH%u9{dq)BEz^l0oU3GIZADl-G zZ*x4GMb~r+1m{sC9r#V(T zPQZ7R5l45tinO2lZNEc?N+y!#xuSW9@Px#R=%Gks(dBy1x@XJ6VbicLDlqSV=aRwC z(ckIw|M4tq+)aN(>c6^($Na^Am7!d{hBjD4d5eTDh-|b+l=cONFZdJz`sJ`|X(h6~dPK*-{I1tw* zhapw~r;zG>o3^hoDcw9jz2YlB)wUg~ERCG%bniF4$Yz)&QZ~%<6xg5NE#(??4jw_t zQhzq*nV+-!nN()!AJg1CV4CYrqSyxH8dY?oAAfLy{fdT<=#r;o=r81#t*fOPYUi~; z#6(R7TVcy(F;q&%x-g(;xvRe{h^$k9uV&fe?uqx?Ie*fZg0*s9ibuQ?o%?nPv%6E{jR$y|N6f@i+GAI6CPL5=848#W-) z_IltYuUr=S*y^fYFGdoQuen4Jk1v4+O@S%R@HC*zKo_lbVgs z8b{~7QKv4@h&GBX1P-5|B+BR7DG85g#llvzO-0)C{Gijk#VC~03F%IWS8z%g{yD1o zpL=9b%4Y~eVHFfw8gpJo8&`CunoLtfR^JZ4G>@Fj zqt=F|HHjyg8^HUxus=BZc;<6$S5x<}2?<>#SOe85p9-}9E*M1R=6KR{P9X}xlkKMd zdY-SPxL|_Ii<5ZT1;W`Yt4SeG{V1ZOJX0Z)WKwGfV)P$yalR92^Ul;9WLL?VB&d9G z1exgPRF28E$Mnw>W&Z4Z`(eY6D{LK;5+o?%lgB~b77&WzIvq?>TA#|O#@sMNLb8+? zYo%oE?Xpqf=|0D*Kg^aS+b9ZQ;&Z|k|1V8ji+1LJG;MLMwNCctRP_p`2U?g^Uqo{| zSMaW-Q2n4j9}&;_1lu`)V_uQpaD+Og_cfwOU^rUkFZ?W+F)Cdp5t2hSsVA_6atq1U}Cqqj|friYGu=d zEds6aG=-fY;WJ7l%Bpf13Yid zZH1ryPpmGZ^S9>>_K)Wc!0N78coD%x?E)d#yzh39Rc!S1CG4Wt)0hQc6vkw!q62<4 zPMF{;cKPo)Oy_x$4~rKR8#m7%Qhc}9$-N%Tj7vc;{m}kt9(fJi{9gFj_V<>uzao;R zP-n%`d8_<@!!L){GIE$)-l!FUvBL(0E8SPxXUBoz_4a*4*kn;S4212O*jqh-s3PTvirp(jRWDW?@4l z8<8MP)&zL%6PCwg>?_PwpQ& z@8&n1m+_m<69MSF7J$yn>ao-9_Fz2L+*OCo0-AO*wa9ZO@tVw#ez=Gd3wFG;Xcb6? z8$}sEiw?|hqN9NvpaWNqu8eTw??232b%e`&HeRTUMwmm20UsMyA>d=9;Cu41%{~<8Rr2F;zhjoN>4sEHJDSNw6!QvHP6N=5OnsTxmpo+iu62_#g7!#>K9$Mwb?}vO`Y@642q-O0_ zq`=~GT|1If*8hkSNL`cjt;Rkc=W zx=t{qjD3LF{k)8#%H6Nlcr7GXVQJQ_8ew|m_A`&h5${~iA zi4htaT-4_6Bq4_U2vMmdkjL|moi!y6eS=Dp zE)bTEHMbcP&@x5PsETT#1f(5Zot>#wx7%dIr9AL^7yi@MX2I=WpP7Y<(Hd;?Lh2v^K4#g-b(36E!u zzh;Cc)iCkWvRmywLYHw4?tBNnhuj_z7IXhy&vy!xkm9;I{mR7~%Mv0d-el_t-+lkUBQpcpRkQAh@Fas(;N$qacqvKuU)&2&zxIyVtnJvQ z`}W0AG=;d|;q{Regi^y%D#rNeAeCbz4Nm(l5PQn_05leXqJu2n5ZUe|MOEi}K7UU= zmi6}bM&*;di`5e_cUHEOA#_VYGC&OIvc&%AvJ8LgvR*_NWV}vRMeIN4&g7+xOo}VB zo8vqEHC&V%eei3A&w%J<@Wix1&lC^#^GywgXFJF=eFx=}1KcGf-Q2f9sKJUy6@QSw z1_1f9tr^GjU8#{<-WcV)_LA#ZN6{O&ZStMW4qN7&V%t5g&R);-Q{%lbDSSWN$7V8nuRZ6Hb=9q(XE8!zRodeQ~MmS zdE^uXU{rS32!>PlIMiPQpBGkq#mq=`GZtM+HH84_)cK*8owG zULqwRB|)Tw5FnTkAOXVf#^X89^SO27K~iY=q+((TC3gFvtR8n7ov0d#y`cHQ+EOPjBm&(m8H?t?-U1u zxF03QhlVEF%>#FyeZLeun*N>mE5fJ4@0D^F?{jT`0Ej zi;fWFP`pb{M~0Cu_bsWWZm;GCBx>=i+~$Waar@aHI#)fK%`XKq6nXt-JXtgsjNI5eetTgq| ze64J4BKn^B`S<&0M)jFEV$TW{>54tcQbhM=a+Hn*H-_`!Scd$2?V!Y zr2cyQ-zo?2{_H&1h3gOOkmLwpIXwT1ZJy`{!!sT&uNLbd&G@cdyBhHJxQFncpFcyc z4puxUE4Lu-?59U&0<7{k?k22}P7qs%{G?RnXpmQPGFHp4G+y?VZGW==clX`f;Qyoh zZY7A1XCCOjtLU&BttS*c)=``E%=nY`n zg!p2lt0>AYJUi9dPVI|i{{YQj&J&nXgKaK(1xm4!bPZzl3dQ+)V~;S!CRwbm_p|l) z4+3RCXW>eum)RpK55vA4W0xBYpts|zlLCi7ht(Yn<||B!l!r-r9xv~mFf|%oOm3zD zxE0qCc)lG&8^{jU=~&;0Ly)0iCoxmL-IF~ZAN6s4kqlNN+N%}`lgP&Len>3M#=HyOyHiz zPrqB=w0duwb8&mlVOkkx=)d12DYj=APkGVgYbsQg>R6dR`ejj!dt`}X*8FD39I^b0 z&mWlM@}VC{gq_oI=CF5HJMAZam-qRV%{)}qwAIbKJuXlAP_L=wUY$$0_8?#Zm?8D! zt9DjJ2tgaP_4P~{D{IR_Uv3lLUCkmpCcwQ=uV=bc2`WEz&1IDoa=-*M@{x~V9WrqV z?C>l5EC~=VJ7ou>r;dIgqM;6ab7(W*D}5S6%Z(?2_WI$9O13^{&Y7I6dG`GcU%J^j zd5Q_PhUa`L$8?d~?L51I({`3Mib@6Su}@zN-Y7)O6g;kuNN3&@a73@$l1s{}?z4&9 z6BhZhcWCuh@LqjgS*E23v#HEH%{vGG99V2WD(Db}>zIGYpFi(qFO)j{#^q71ke=-c zao-;-%Bixj#ik`lzwh-}1I(s`%0v5lh$g)!vkE7neBS@*FY;FEoBiUG%3a_9CJj~I#a*KbMowYxqsC^|^i9eFcS2=3 zzBi%7Fnr6}>LMzQtzH!Fv&ao8BH1V)n4_-S-(J>x*d4fC$6?qBFH!-grV_X(_OS-I z;_ju0;h0b29VAk5%0k_n4;APJ?5T;j!g5qpR4z&mbSCuLUQ0ngp!(7hN|wXLy29AJ!{IT5m6TwOF6YrvlUK7Q{c^e|*xKr|9V%GTJ~g7qjW~E%obhJc zz!+~Khz$S-oMZmeh!BqoebonzV+M7L|tKA(WtU*?voWngouy&udK% z#vw9Wj+|a55y@ZmeV$>sA#Jhsa=Id>h%=+DaB7w1ej>g>EIaCbVgb2V)ZQAl{Fr}m z)Mr0Vg%)zD1|*s2TY(cD{((TW%Y&kD(L)ar?`b@6CGDJ#F*O81BEwz6|Vg)`}YJL zi@-BaqDGn+y$72%v}c(yC+Lt(vttBSJKoN~Ox+`u$i&j*{lQZK@7dSCNM4*I^kGlQ zhMvyvR1l^ZDC>=eCNSa z;mp#0bkNjdWrtGW%3pv;X09bLMprA>j3>c?*^Bs?5`6vo7k_MYoVu#ryd*MrYk|y7rf$Ic#SRKlyEL0w1id zUw~HGVNmT*57bwXk@5hjQY_n8gs`OLY|@iy%u#Rp&5J|CF};iHb?kkfjsWREaJiu0 zmIo~C4g!sCCLiH7X7#OOi<7vY0@;k<2tm1WEAJP$t+BR&1tdx;b$h{V3R-S#CqeL0 z*}bANb`k~>O}#?avBG+6&*+Dx`3I0*bG0#IY;Jm3>&vNhmY+ptwzXU2zW$l44Z|x$ zto>XqrBqeT49;c%wnp757yLs$ALR77|M3MZ_LboIQ4Kjkh`obsXO^iM5p^nsa~HXi zN1vXx`ocpYeyx2;D@kol`m$QsCR6m1mOG9~J%~6{Se5l$ItrNX?z=FtmozM#(ph-W znpi#FESyBm{Pg-qE|U9wc;Zt9t+u=}xVe6vquj&8bHF|)4CzPmP{VH^*Xgh4n57aU zUoc*`Kp|-g`#L)y3QK{*i=&TO4tq8_UNG`X?tS&Q2BV6dn|!Wz27;_lT1Q$m3!DM@ z8{P5tL93RLcv%pz4BOsd@*QHCo-n3m#gp5}JynMK#afSR;((M~XYou=*rFEw_)U*_ z8KH=RxWvdg6iY?_C$@R);Oaet6&ATH6HBqSK4%k~2Nr7bed~)MH+zcgJEhswW|l&W zc?wC~YKi@tQG1;)kkbYcH8TG4dup7@%&W62?Ijx;%#rSv#XQJumomeas3~*@wTiG; zDH@n+=p<~gFxj=(ve;ArLg^lvjmB*C>fJk0=n4$SIMPuFds0Twla=9Kab$iIxqf|`ka>1r}Pfic|?&*pCf&n4gHy#QYGlQU22v#mQ0;9%S{b_mP}D&LtICnMLC zm_&=QEWUf{aj_{16xPVfw0gQyw9h=12uW)?>Tcd_-?l)B867AVjXgiwl8oh|?Qbn| zzOk0WFXB1j!*naCT6!BTy{v64`mHaWOx+!(n9mqsIX}GK+FGz8OLoyh3G~D&_Z!~+ zuzs(@EL0vVHAOrjFM4c@zoRUY+}?Y;IzLk%cXQmFRJZC zs%!G(XU{n(<<$7`(4_Cg<}1QsV{opf!N5nsy$P7Pv}aSv7!Mqi#vB0&w@&aZLpK*F z%a*NQSa0Fi0p+RqlMJ+)^xQqp!hWrsnqGHO?Vh`&Vg22N$0l_y{sVAD2kB^j>^)7A z+N{2YUzYN>r@$;IZpSm}K8c#oro7C(O9jqY)$6(QirJJHE^Ro7s3%r-wgs6Vwto#n zFQ}rVoPzP3Ho~nkrrlT(6Znx5jY{NDE{@bhH(m@OD>&Dt)fmkz6;4scfrpbT!r?A! z?H+n1Z*Onk7g_K3a-AOIV^Cz-AXT|O@yqTJHP~%%)nL72RMI1zk`okKeULameYt&Y zsOSLECTHb7*muzStu%nZH&`HTy)(rilC#oWF+y!s;kZDi61#iz%+u}{9>_Gh72+_; zh}mT6Q1eNjNj4R)UfQM0MlxD{0)&;3(U`#(i8g+jfk9%Bk+Uy4rQrSRtSJ%_2_?AY z4c(qXKUnEvbv5kp;Rui0e(anr=G$&~Y!YV@pSz~!7W={k;I=fE8j2(IH<{kx54=PZ z6jfn_p5?ThjsrhTV&D#*J=5q^#oBqL#FqD*BGcb6l9waDS5=&;!-+Trzrw20-EIlI zvl*EtRpeDe1(K&yp=4I~n`gQ+yQPGA&Mc znRilF01NGpCFeL|4olsv#Q zgp&0!d1##?5jD>Y#^ByjWn=pks}TQ1L^DfYHY2jhaA!H2;}!32dSywH8Yl9nVsDB? z_N;5h<@XLO``i#FEM0}v?m+u5z;4;ol1Fw7Cuy`!&CF0TH`Wsgfc z&#fsJYAR^l?-evk%*a8<63>xEhX*j)-H*8l_@RLUynq~Wd4H8FO)2lfuyT$P5=n!$ z(&sA*8j{0GEqYLIiC&97S$;42`ZRrprlWVsm|nVS=DS;PcG|ol4feYBHkM1plL)jm zzOH{*0>(kZ{5JAUit*H`zztMF8Bqh8DCIPfOyL@bOuM>ZLP5etT;ba9`zC?0jS1WLpT$vOKG z3kc$~urQCKLlA(3Zz1foiI;k7rED<)vWOEO%82G|tWM?gzyvA35Qs>d%aqFP$Tz3o z6&-|LE!)ylmLW>#B;%HA3YF{aY1}PlhaBIND<^+_rhMMVk*o}gBrB;qvu@w!5NURX zRnJBn-cO~-?*x-Bs_5Ob7GW+JVWxH|DI=gD_`Cg*6)`lA#u8=bTjmYqA)M-%Y5;KjzwqvbHC%9qbPiPofk zg)np`?3WIBM`r?hy%r&_>wy1c-6HmwWHnY6wWyGDCKrT^j-g4%EHDV<{? zT0{xSHLdBl)sTgqKk6EOI1Kj?XB-Z<&j@BeLE7m!h2a1(?T6on70?)Yt0ba>u{%or zXXIr}B!G))jr>ZVYsj=`wHd12NNWxwte|j5b8!-8Bg4k9paSaF=8TwF^qYMd_|Ydv z7-?AIBhp+LYn6kOjHv|gqFxOggs$~`Dljf&F56g6A{gy7)JIJfFE(l7+IfmJa0xhZ z=3a4;^xOPI6?KPcNAPxU20wbzBgAM8l^^g^G_&h4`^7u~+SRceisYl$;T%KJanvtz zC(u~Ffa-70OI=uYGxyJV=a;Sgz)XDnpo`^gc z5SpbDsNAn3e%o~&)c^2M$lqSSXhtAVHZdlVc`88}mv7VV$FtS;;%J8T5Iz+2Q8H=a zarOLMLQLYy){sM2+r;o--K^Ce*5FpwzL0YB$q$fx=T?_Ehw8$YmW(`* zGV!4eWnCTIA1yM#4hTmv zw-`7$ojaAb??g9KmraHM=Fr_Fm7{~yyI6WUzuZ4`r>iz=>6VIGfyQ@yt9MW_&(CtX zJZV*brv2T6ues3?D%Rvu1-|ZG@DG+Z{TCJXrdjuG6^KV*5^gSdUu&=~=aw(xd~OEh zEP`Mu6>#jjoim1ndFBSS4cHLD%5HLs-1Yj?n~>=k((^!;n`-$WlEl5OaGMY@7-d;m zA3{a1oMdy;_|$l-2qcQZ(44p|j+NRVQ~3esPoQat)6#5k`8{>jt+c?qs+}r`Ur-ss1(&3F3W=mMFGwqC5V!0_XdVWMTeJea*0@N z?`+my>M({G=|I@%(Voe3jCrv4TQl5r6(K^1uIE<9G>h(#W7 zg%KPLn~bcL2u2CC3;ctLXNw$t%`-2xNnC{Pdpbo?Kz?HLK3Sa<<D` zA~mH5Q(PDnu9F z3j@4A)h}+%$&_h zuV7?ELCf^C{a493Qv!j&-*Py2hNf_-pvF~BBG#_# zUXy7?%!IBlF%dvpeAL(a`yt*|38LW|PANkZ!c7wRhkN={F}^K};+eQ%>k_Np2acSF z?jR0EciONKmb-15$h*Y6&;c&Q)mU#&8tqG8B8G3U!?b+cYD&-ZDqW@yjAd)%J9N~ zKT)D?M(W9(`!-HuQDO^%SW^IWwFzyr0C8C3U6BhFQQ5DBSPiTjI&jP?^8_z3mGM!M z9!AdFY*l;8rgbiXK|y=9m15(cl2r%dO`3kq9{+Tx)bX_U2*VGoVWkotr$Ct(QC_wJ4@+s;F)LB{}K zAu+uMVtsmH;C?`8cs{@=gs;6T_np&#B9yb;!)Xj~XLFVWjjTJe1as}1+%z1v z2l9f=Tm%}8Zj8%nd4Jpqp{LjZO*_by;-B?7DpssNFl;~&@kBU#dErNpc^RQD#lU4V zNi9QSRDw~szJL9}<$SwuMhfZX!{LDDb|0?Ivb^o*YTDPIo|ytl|Df?;dO0 zwLKc&Z_B~{!5>jBOj=c#jW`fd;3VXFSSfbEzlR%`5Sg&+nH+s(!o1(Zp60o5=JM+p z&S^R3Ha`n=U6oka{^9Fb?CMkBL9Y<0qQ0RBh1)&XyGnI<24L42Hko6zFb4q^ISm4F zYu8Q$z5;*lNx7d(9))*M!j7zuu)wcSvh69kZ&rv+4&H3LHT=%|zv|YncI4-a9x775 zZp4@D(znZ}1?9YXeO+wj{Y0UEue-d+s6nU*S$X`ftAincaJEtyxo<~Y30|^g`Qav4ECFH@c&2=*x1pCQ=dWjlok}Y z``2aM+ZT%Vdn3(YD5w3bJLsj6lF)^U3(bgR6Ng}*jghLT+K&O8vq~NoraoEWr}G`Q z^?{xDD#kUvr!pib8A@+WcDC<~3tEJ3@TXj6u4rbw9E?r8khv3kFVO9#7Kh>Gkg3O? z!Y{QlsgOFA&!?~>KulU3Li#e-xQ5pVe(i5B{b% zmGnTZhpU?Sp1{x6p9pq+;fB+F@(A#hcA^YD2?I@|R#3lqG7L9QT8v>oz{4riAe3G( z-+XH>E3Wk3NW_{J`zN_?fh`+~9_BjkTAZ|`3M(iF#5hGSr{X73ZG5QVK19Y|#L2pN zEGEvQl&6?c(Yz?0C46+J9!|+o*iNFR0l^OH!zNkK8&8e>-eha)*XuOcrzK@pVYht% zA~-l6tu?Hug%~Q4HZI+Gs=a3zwq*0*{@QxcJ&faZFN@BvS+xcDij;aKhQ9Nf2(3c= zqe-6`;)%5{IeJv{q;~DCF&sI8_(B3jCWZxJo2{yYrSA7`_*(CMhPzuG?U}4oM{XVEk>bP9;4L$92ir z^>hntkiPm(M?2YdM@-wnzPZKTR2X@P^-w6`yvBOPsArI_(Xo`*5nEY%d3w=lazY?B zuB|=|t$1q6ix|MU>twfv0gw<#wp@HBTo3=N9IGv}XL*Fm1-C%=31N5zCry>u@%Ya= zYbCsgj%`p7H$7=XamwrVD=Wlj?tb6hw%bPqOw(& zeo2?!&s85z3Frpm@~Ar)5TGT@41|&?-z9dO>Qw`X(*7~+{gL3 zq%W))H?Fa3Tjd^M6i8hWDuGtFsB+~0(tGBomTg(AYUGjR+iM)EiLUy{e!kcKHZDWJ zrh0cq|6Q8H!Ou`Uc#E2vEl^_q#Xz>pGiX)Bz@-q(mxSB3W#_PSCa?|GXrt$@HIrWJ zMOiWKsxvxF(S}9-;s*KeGo+C+kfJeH@S(Sk!_89P=WHJQ3QQb$(fhbWW38X~5aQ|V zQn_=B`Fal^){cK^iHkyp>7H5i)? zy-sNFe^zO^BvF~~R2MI?(P%#QsX=aaKsU4l4-gr--ownenQ*exl(TB7Wu+EqSi_H! z9lSrbQ&k1u@(Di;<#u7E0-Q4XwJ*9I{bhR_p^&slDnr*3_G4>M2zZPMMN8$GzaZHA+jwE2T0N^aP;@zKxB z`MIO7V)Pt+vU;U3YOsbl)m%#*r-&BvsX-ZGSsC%yxJw`VpmsIek->w^0^yVOizNw4 zl!K#}j~AWCodXnc^LsvFUG61M!0QI{1Qj4gfD*{nhcokJ96-6=YYLDi?d+FX?~^Ji zT{ibVPohTq=vrb-Yh@-)B;)I+-1`kVq0^d0v{M7Gah07HiYKMloUNL7bB_d%NXM6}xjjEm$M_4f>P143dheLa@^`8tzN{Q^5#JrWRO)#cNlTw zt$^F0v?iEfr6+B@V$5pGAwk0`yLO&;ba$=NJDxI0fLHt=k_J3BQsEuMRSu-IJh_?G zgJY1noM}m7QxI~U7yF=&Pa!}p{5y7}vY`}TJy^a)zH6WAP?oK&Vf56fduk?aGN7{H? z+3QUSiNBJvk@`B;=@Eh;b#~rEd?uq}r;=|yS5o~?$y;lcRWwnDljQ0i3yut8)*tqP zUU*DFMXq={AvK>b$>1vRuW!x;Hj=4*c|pEWXi@${AL+pf+9A#w*G}fI>tpq9GJ|!~ ze3`*!saiz2;QAu-{wtgagLw5p2CPB0Vc zLJ%x;=2^C(!qNkTxoRX*;=Nv2qzU|h7`SvKaDr7FuzN=7O3m3%mB3rM2axrK+iRmF zZjqcJd~2jzF=EKT5P?o#icoW(ZrW&=pyeDl^kz5DLD%{5=j%Cu7}AsN_boeU>>$W3$8(>u!zyeE{7y|&An^)1Lc!C#g5_) zk_c!9AZH2%a;C@HR@*quyyo@6G}XR|d`%|v1`m9=%C2l(y~*%$$tWmDd%S^7?Yz;- zR9{J6$LrCDaf{RAr$RNs8dfi&C=mN{?=X8N&OZ{m)MXNzRk=dedS><%jbI3>x_PxX zvaR@g46i|!LpQtLt!wsWLl>(Nzcv&1P2p_SG+W!pRO=TyWs$*D=8xW#V$`yDKbpq{ z5pQ@X=Dti2;~F&Dx9nqH%!b1vdT4W8qnd|G-M&^S|I zH)ZEp?=lA@hTp%!lx{n-rDXZG+AO2a+$r9yWMuGhaNsONe(2Msh%&x#A|DLcvpp_8 zsvlkY$obZr#P3b^vvsr$0|(GSfeZbl*1Q$vyZ6&Uq;+ey+*aZ4qTHH(LO5_%|T-~f*XlqB^aNzOqv|4 zcFDAU8~w#b&LWo(5=Qmo!SQx|Y@;&R<8ZF^ymA+}LR@ej+>SwUwgZ-# zTPV;-2@pU#|7jf9K<4qL`IljO`cAZ_9J8Cr+uOQb z{J0#EtX!D4A<%#jjK0)f7Uz|5!;N_HHRE8e;uGcj9=X+DFIGfgeR6O#RI*ooADYUK z8rpb^9a@y(f{r$erSu+v_w>yyud6Njs1cAQ$DgL);#BL0h6-7q&`QPE2P7R>+PRlp z3M+9DXY8C!)I{?QFF9v2zS0~7K0vtQ6C>H3X!kXghhagQ%z0+&;apDuZ8D83|Sg@&R?JufC* z_Vz%b8AOY(Si)QQQM^k}_0X%b8JU|;i=*7#PY24uZr;0_v{lIMfmQF=)EQvSC~W&t z^&UuXr1TWo+|+1=>Cs{9hsa~tvQBtVs%7p=3P;7szx1dE4~vgB&2}cyAC9YJqbjR5gGzj5An7ZBV(%o@A z_Bi0Vn=r$0g-Tbv?J-@SCyiZ8%m}}b!-BwAEp4Zw9N{I@{XOUs%?lS4f98{u|GG_gObFg2aP}N2N@aBar}*7&ug%9X3B46hG>YbNHP#IOYjFqn=BcN)O(? zPHni8w!!-3dgG;Dujb0wB~u*v`s(8+myMCFsS)x;+>*PLCjKWj0EgN-Q!T&O0}U)q zBU(&g^HEZ9UW4Db!ipQD4N9WfmPem2L$0LY^WA5w4s5;*nC>{hoCB{`fwgL_&TRT2Z;K-zE`TjvLV<1EV-XJADDvyO%F_{X4z+3%v=-*X)5RE8W#`apH zTQMLUY_GOFFrzYn)%2yMsAGN3d%sYYN~gSp2kSID;qNsrw^!jDcIGVfeON*pS6mrv zRr2k4V|4u!tSaSmiCI`O73*z4*^8z3sZ)k_f61x*l_G+ABF^c)V>IODDTy*kQhyYI31irGbw3T=U)$1| zcjLe1J`j|%4ZIQWPV~vYtCLRfrLA@K`Ki19#9Vn%sQMVPfGz@=yD3lbh^FwCv(NU_ zN?+xUGIDINH=RwJT8wN{$#Esu+20;r5K4p#D}jep{U?2DtK!__b7h`(W=w3$8qaKv zi{3Amp+_FBFbm&L8mQZz5Ip!Wa98)O0~`Fq=4OPCpp9Id7eHxVjXr6j{U~1QN%Eaa ze*Icv*2)(Rccen{ycKLlK~lfblC-g7@Astu*{2gdwEd!R28tpQlwR{;V>?x}&+|qN z@?LuWTbT;V)(8ns*UHME5jISF-QSDueNC=^Se~C;yRr`aJDgN#sBD{?c}mlbl_Dldf9kREqh&G}wPxwu2(QwlZ$cQ!2JtR{7Yw$M)Jrw>k~LPgJKlmmuMB2Z zXC7A3`SZ`-j#D9bwl{Hg@Qry^URfDcOHFca@H6_vABzrLvKLVC%w(GwK6;1&yG;6g zsDk%vqEGhQXG|2?n*yN74(}w!1J#8}oSeTEUfbT^?@U^83LfA38pIL^$b5_cwC7nL zd4h<0lx*a){+YKW3Ux*sc3B{(J5q0=Vb~cz~*fi7`xzPqQg?G2fbI$RpOd9hU zeg}L#=0-3y+LuAzc+%E5jLq?lfMxm{Qv`SFZ;`g?76D%Jp<5rYkpfX%VDOl&)Z2p} z+#dOxO&#FT?t4BXAe!(oY7wU1Co2Ah5?_4V_%_~4W#7u}4-%LpK4^QzMbbdT38Dub z*DN_ig6zM^Z5$ey+v^OEvvaw?jUhTK+6?m>U-72@M7byU9K&;S+eJJkQ(Ko!CwCA> zi59RKSS30akRHO_IicvO(mZKTfqXBN?kcu5Z>qOsQ+-H#Vt!my#*`;DKhu9VqNqvW zgJa{W!X;bg4+0~(LF|*KDvmAApxS8z`tXF)z|GC>`&Pv7%ID9rk8@J*WEC*#RVXhj z_Qz-Mus+nznYe3sORqNPy?5wPm9E%@h65)e-X>XA+aO_EBvMkq`uT{7{(H!gl2QL} zO7M@+*aitE2bn{RAlzXKKV|r%cn$omD6%i z1l;zV6cc`1_&$~t+bUmF;|`v6gCYikS(ay(KWhZhy5Qfnkltv|YB>&~6YFw%Ve+30 zlp+6QK%PnYtOo?D2Xbf?;=cJ=l;0)J$;d>^8t?gV!tf~t}V zWvAQ6ZW(~x#diTd^g~tL2b#3BxTZoaFu2i(iyD&)5N}*GR_czWzK`j-W&}S6jdcDU zFFtGK&gplS_E(y66vM#eC8Nk|t9=ec-(1IL@^zaEkkRl|UB&D!%`yq`S!tT@{;u#- z-dLOM8QD z6ABnzRwHVphx=(R8E9cnrx1b4GX2sgu?^z+g`PqtPZ_UYXQ>Qyf z+k!RE;TUBQvQ`#!vt2i(0;_l%GoaMGHv)gz8uu<9d?PeXC2yz8nif{bs(5?E6d`xy zB3ZPZO=>l1w60Bl=d|Grl+T`Jtj)Oy3iZ8Oaq{beq^ab8$H}8wDe>DC7M4V{mB#Cl zYjPD;#U3;`(Mb=#Y7*m{8q0Amli*znR&LJBh=MNS93lbt`v@?_0zd#Fi2Ny z`asQ4`7wl-@a4tu=BuRr%YRt9e@m24@G*27@a$WymEXqB<>ekQ{p#kM`4WQ1xBOaD zBEa}*J=#t|M|DeU)@ZN9_EeznS+Ne*DUTMA#WheJvi$1VCB8cM~Q+s!0{S|yE=JP%Ut+VSv z+gU}p=CUV_zahmsb>$Trv*;k-o4hiL|wNd)dFq}Hy@ zQ2{jNzXAZ3sgiUfXH!#I2#H*ftC<_s+3w*m(tod#muXg-gxE0`jzqru8JWdmm~H;s z@F%Pkxc?aTC2uTw2KT>S@lnpa+#hG*fF0jQ-m zv6JPHFoXa<5bmh>PPQ_5ejDzrZc^Vlnd7N+ZKGoj-eMfA(L;b`hZx?abNZsX1 z_8zf)t>U14TZ)+oR$amDknT5VT>GLB37GNYLOd#Mj>`fr2X^3Ii|bFkpG9=3wwc@x zd`)~l_9Q2@&}Z=*$HL@JsDZkGnGL=O_m;HrTZ*@WJb+hfYcK?(g zyR%XK^cFJJ4)5U1sWUrw&d!X&oskZ55?!ymR;-#fP;7j3>2EjE4JIw8z1a5zo*`*e zbz}1oBM9DP2qPJ5%ahljjyT@4@?hN#jDdMhzgaLxKML5?`oIEt|C0*yXYQ95mA-tFR4;M{2Wa~BW-5E5qshX=W?FOxMpl~X36y9FTdYY_RILF$6d~3ix?5Y7g7wKWA0@XR? z6Bal146_Q|!3|hz5wU`jgIm@;C-6>Q;5cc6zNY0-_t}(lViiEHU?Vck-!ApbJWZNEw#U;%7Z$kv%F|(b1V#B`fpXGrH2dD1d3mBC|D4tU(?wFJPMZ<3=2oGiz9? z;09z073+fo4j_vD4WRb4^+ezGrT?N1b~y_+lGtkN%$)Y|Q5z<$ATr75tOM2!1hz;NKs)p2e+Mxd9{(N0Wd9Cga$0ydr{~W3?;;jrI%my<=aP?C%sO82 zIIsC9D!gbb9##<|#sgSxlen)s;}uz(hMK;@xOh{Dp>`oxTL|mnlJ_~o57T`My{^J}E5w_&)-O?0b*nj{}Ing3-qvHImGRLk^{LeLAieWTotXFJExH z{FDDE$rtW5T;QgG*!$IF$G>4epH}(*MEyU7-*Np${Z%8d*4y9_Kvw7j3e{D>mo#Lix~A}ZUvI@6%IH$sHLTb5TAw)peX?$@qEBxROcv9sak|I zTTEjss!dAb$?o^Z_;=bq3P#NHozBx2YAlB(h&)2my{dR~?HFhOO>o}%kL$1yLVij* zNUDUU6jY*`-1?)fZu#nH$Q3pXLs8L-L@C< zSDKMc=9TT}@vL?H4-We9o`3R+7*~>o{_*k7>s0up!t@_v;-WIEKy{r~s=Y>LyK}jM zjXbkokWZwcp$djKV)NoX0>b z*EYxSigF?7&j(iw8womA=_$N?(P5bV4EDyuebo@Us|sX(Tq#oXD|v)46J;7J=H!i2aB0~4K`L* z3C!7Vgzo=MkkU|nhQa^wV*;1z=e6-VoILjB?S`Bx$i7LrTSaXAL*u5rkcqeTm_qPv zW!h4rps0)n%b+MGbEzyN>$j==3YfiPMfrTGOL7bOmJB_wIk?uIK_zCK7q|ErX`nfs zz$07#{CYw3yTp%c{hte^QI_5c$3iCn^7yX<^dO3}TPwwi_eyRqn?df<1>yH6>dl$&kbN6=Vu1Q}?$qq4ECM=sUou`Z9{vgZf z_~DJ&Z?tlc|H>Wve~#V1T{Tn;;i6oAr#yKanAE+JcpQx*d#TkaJ2);REnwrADBYiS`SYPB_@pKKx zqm<^vn^Wr&*=rl2q!;h^j94nc7yc;v!z~@rf32tZHfo6en4`X9n4Xn16xuGlD$w3O z?Yif#A#7AHnpEuOep;A6j81DvM)bD-w3B`TbZNZ2)#RV&sj&v2zyT)})n4Dt80A#^ z!)*qI-S@DA`&_J{L`xC1%X^-Be@Ey4i>3Z;Py*46)u9Un1v}GJsT1CxQJ-t1mwkQM z`gR$<+uyju#HGK~NE|tV#3d?-Y7oOu{|5>*v5H3h^hhk_|1b-I&;_F=LUa) zo&QAr<{2GTPW+n>Udfu{2cFq$u@57KWALlld`Y2i>biBs88ULPrWq1W8dETId0aYB zKLjjVGhFc!fC8JYzadsl#(zxR4-4V@=E7iD-yo#4#6RKVf3d>{V}G;5=XrS$y6DFM zg}6)sG6`AFT^!7T=(Sy*>gnar+*Gn3xCeG$ryh3`4vwu|$`y`HR(Vgz6=vq`&qp@h zzvfb6JHB?&J}(HI2G#-_D4#L_tN?L3bqeX62)Y4$7a z2A~zkb%s=|u^(S4_tYqSHxSt>Z+kUGL=NR-YPgI@R8MAYJYRPL0ME4nfw6J~x<1Fp zlJ$45%}cJvtE+}VYs6D{4X~rcR+&g9UgF!vytldXisK+kVNkeKKJAd$eJQ`yvivuS ze8vGVU!SPq$4w~Eo4tB`j(piWk1;l7mppiHXK!aNMRxqm8IE}dvSxM%%p*samMJ{R z3RvwqoEv!3&|zG{cMTQ6M7r=b%{k|*~sUoCl5 zpMcf{?RK@M0Xg9oKq$0;P(p+ZjY8$G^FK23+ZBpF1-m(G_$J-^hLc}Ik|=K}!;RwC zQPX@WjDP6Ex*V=f;ESjKHT!^2KT>kg@<#Ou+JQY@!p7NxLt_nQlQ3AYD~s@DO+DdC z7B#`wQD3~CZziu14l>IZNEPUWDe6xyK+g0f7rPr?ODsvPNVu>LDN@f!=-!tVN>ug$ z+QqtrI;B@J^C^sK_9qQ*YK7ZaT-HR7*zsEFx*>iCB2?v(|Jp5J3mz5uyjl|0av86y zKsQkf2Tm}Vgw^?bobD94WE+^2G>#u0-6>j#B+B9e?a(^l2Nt*cGVE;^+WiQq6gE$A zubrX~m11(bOO^6ho#kOn)-~zkb9Njq-17MeUHcFxWqY0_475rp?c<*lECSO|d3#Q=-oDPZ&9XD4HTH(Af` z+u@3`XI;Jd8s;KlYgs$;aUpBS|2JT%Tkeqet;YZA>&F(7eOHg$-Z;%1FT3{K)g9nr zg9EF8YpEL4uUwV3YJZ&aP@<~#@U#U5<@Ugi+p~7wxl>oKwmZ2eOeyg6CY$qLzr1za zuf2G&&H2B#?$%!WYynF2kM4KFd{g0+W)E5~5Og`L@~lrEa1-Htqa2T@J(bQ(}wjJbpWUjZ}Mc`u4dmif_^^L|#`uf!WD<@|mA8SBc@Pi-{}Vu&mXZ zuYX+2b3vp_;M1Fq+^Ww`{rxndB{H*+K@+M6DZOxd76+MsNVED|R`?+9Mv{S;i~gXXI?%mU9#zcYQX_>uk} z_y1{ky%`wJ{A`W?_34uKr&qhviX=ZgR5I>b{#^eLe|>VP-uLFa&QsUiirF5<3~YaV z`1|mExNcm+hX!WIIm^IJf~y{nc(CzkIoV z<;8o^gL1y>`0vaAtNXa${(#m3pZ?|P|KCXiwe1ivTemmjyU>R~X!m^~P_Df`otdG5 zH3hO|5m>B%I*dU7gX%coniXJo7nqblgD9g?gEcfFN`L-mWckY7@KxlTCNSa{JYD@< J);T3K0RZT?yU73m diff --git a/game/tests/golden/windows/board_L2_underdark.png b/game/tests/golden/windows/board_L2_underdark.png index 2e5b892acf379c9270f74530f6ca29b87fb2c721..4fdf2454cb6c8ace14628e6710929442a26976f3 100644 GIT binary patch literal 128581 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%0DLUu@#*8u6I5)a~wcWd@gq)T+<;!oLbf2Bnc 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 z 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 DL<=_j diff --git a/game/tests/smoke/critical-paths.md b/game/tests/smoke/critical-paths.md index b9c919fd..f9659da3 100644 --- a/game/tests/smoke/critical-paths.md +++ b/game/tests/smoke/critical-paths.md @@ -13,10 +13,10 @@ ## Core Mechanic 3. 挖掘:单格 1 AP、数字亮起与 8 邻雷数一致、连锁免费撕开一片 -4. 封印/撤封印/挪封印:AP 价目正确、连锁止于封印(封印挡链)属正常 +4. 封印:AP 价目正确、连锁止于封印(封印挡链)属正常;封印受理即揭示(落定当场见格下身份)、已封印格零动作(不可再挖开) 5. 移动:已开格瞬移、**已引爆危险格可通行可读**(工程债呈现半边) 6. 停手:RAP 1:1 转存、下轮 AP 硬重置同图继续 -7. 轮末结算:明细逐行呈现、来源标注可读(P2——"这一行是我哪步扫雷带来的"可答) +7. 轮末结算:FX 链逐拍兑现(弹道/飘字/站桩反馈)可读(P2——"这一战果是我哪步扫雷带来的"可答;明细带逐行文字已退役) 8. 清图:清图奖励兑付 + 完美封印高光(零误标时双份)+ 换新图;未刷新的停手轮不换图 9. 轮内刷新(方案 A):Active 当场换图、AP 保留、RAP 扣减、每轮 ≤2 次、跨图事实结算完整 diff --git a/game/tests/unit/battle_settlement/seal_polarity_test.gd b/game/tests/unit/battle_settlement/seal_polarity_test.gd index 7a5a171d..539b7562 100644 --- a/game/tests/unit/battle_settlement/seal_polarity_test.gd +++ b/game/tests/unit/battle_settlement/seal_polarity_test.gd @@ -48,6 +48,7 @@ func _init() -> void: # ---- 末点 AP 封印轮末结算(playtest 缺陷②回归:末点 AP 花在封印必须终结轮次进入下一轮)---- func _smoke_seal_ap_exhausted() -> void: +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:139 封印判定批与溢价兑付链照常(保留组——封印受理即揭示改版零改动)〔封印改 V5〕 # 判据出处: design/gdd/systems/排雷循环/行动经济.md:260 (末点 AP 耗尽即收轮组) print("--- 排雷玩法·封印动作耗尽末点 AP 回归 ---") var rng = load("res://core/rng_service.gd").new() @@ -111,11 +112,11 @@ func _find_seal_target(minesweeper, want_mine: bool) -> Dictionary: # ---- 封印不可逆四情况冒烟(禁撤封印 + 挖封印格兑付改判)---- -# 四情况:① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 只受挖雷一层惩罚(mine_hit 照常)标中不发; -# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 零惩罚零奖励(正向兑付作废、标空不判)。 +# 四情况(封印受理即揭示改版改判〔封印改 V2〕):① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 挖封印格被拒(零动作零惩罚); +# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 挖封印格被拒(零动作——标空判定照发)。 # 拒绝面:seal_pull 出目录(out_of_catalog);重复封印仍 seal_present 拒绝。 -# 场景 A(④ + 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 直接挖开 → 收轮。 -# 场景 B(②):标危险格 → 直接挖开 → 收轮。 +# 场景 A(④ 改判〔封印改 V2〕+ 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 挖封印格被拒 → 收轮(标空判定照发)。 +# 场景 B(② 改判〔封印改 V2〕):标危险格 → 挖封印格被拒 → 收轮(标中判定照发)。 # 场景 C(①③):标安全格 + 标危险格 → 不挖收轮 → 标空/标中判定照常。 @@ -440,6 +441,7 @@ func _smoke_refresh_provenance_guard() -> void: func _smoke_polarity_routing() -> void: +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:139 封印判定批与溢价兑付链照常(保留组——封印受理即揭示改版零改动)〔封印改 V5〕 # 判据出处: design/gdd/systems/战斗循环/战斗结算.md:366 (极性路由:正向只兑正向、负向只兑负向组) # 判据出处: design/gdd/systems/战斗循环/战斗结算.md:366 (极性路由:正向只兑正向、负向只兑负向组) print("--- 极性路由(挖安全格正向 / 挖危险格负向 / 标中正向 / 标空负向)---") @@ -572,11 +574,11 @@ func _smoke_polarity_routing() -> void: # ---- 封印不可逆四情况冒烟(禁撤封印 + 挖封印格兑付改判)---- -# 四情况:① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 只受挖雷一层惩罚(mine_hit 照常)标中不发; -# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 零惩罚零奖励(正向兑付作废、标空不判)。 +# 四情况(封印受理即揭示改版改判〔封印改 V2〕):① 插危险格不动 = 标中奖励照常;② 插危险格再挖开 = 挖封印格被拒(零动作零惩罚); +# ③ 插安全格不动 = 标空惩罚照常;④ 插安全格再挖开 = 挖封印格被拒(零动作——标空判定照发)。 # 拒绝面:seal_pull 出目录(out_of_catalog);重复封印仍 seal_present 拒绝。 -# 场景 A(④ + 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 直接挖开 → 收轮。 -# 场景 B(②):标危险格 → 直接挖开 → 收轮。 +# 场景 A(④ 改判〔封印改 V2〕+ 拒绝面):标安全格 → seal_pull 拒绝 → 重复封印拒绝 → 挖封印格被拒 → 收轮(标空判定照发)。 +# 场景 B(② 改判〔封印改 V2〕):标危险格 → 挖封印格被拒 → 收轮(标中判定照发)。 # 场景 C(①③):标安全格 + 标危险格 → 不挖收轮 → 标空/标中判定照常。 func _smoke_seal_irreversible_quadrants() -> void: # 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:231 (封印不可逆四情况组) @@ -600,9 +602,10 @@ func _smoke_seal_irreversible_quadrants() -> void: Kit.check("四情况 A:seal_pull 出目录拒绝(撤封印退役)", not pull_out.is_empty() and not bool(pull_out[0].get("accepted", true)) and String(pull_out[0].get("sub_reason", "")) == "out_of_catalog") var dup_place: Array = ms_a.settle_batch([{"action": "seal_place", "cell": t_a.seal_cell}]) Kit.check("四情况 A:重复封印仍被拒(seal_present)", not dup_place.is_empty() and not bool(dup_place[0].get("accepted", true)) and String(dup_place[0].get("sub_reason", "")) == "seal_present") + # 改判〔封印改 V2〕——「挖封印格直挖受理/隐式退役」随封印受理即揭示退役:挖已封印格被拒 var dig_a: Array = ms_a.settle_batch([{"action": "dig", "cell": t_a.seal_cell}]) - Kit.check("四情况 A:封印格直接挖开被受理(不再须先撤封印)", not dig_a.is_empty() and bool(dig_a[0].get("accepted", false))) - Kit.check("四情况 A:封印随挖掘隐式退役(has_seal = false)", not ms_a.has_seal(t_a.seal_cell)) + Kit.check("四情况 A:挖已封印格被拒且原因可辨(target_sealed)", not dig_a.is_empty() and not bool(dig_a[0].get("accepted", true)) and String(dig_a[0].get("sub_reason", "")) == "target_sealed") + Kit.check("四情况 A:封印不随挖掘退役(has_seal 保持——不可再挖开)", ms_a.has_seal(t_a.seal_cell) and not ms_a.is_revealed(t_a.seal_cell)) ms_a.settle_batch([{"action": "stop"}]) var target_a: Array = [t_a.seal_cell.x, t_a.seal_cell.y] var miss_a := 0 @@ -617,9 +620,11 @@ func _smoke_seal_irreversible_quadrants() -> void: grant_a += 1 if row.get("type", "") == "reward_ineffective": void_a += 1 - Kit.check("四情况 A:标空判定零兑付(×%d——封印已擦除不入轮末基线)" % miss_a, miss_a == 0) - Kit.check("四情况 A:安全格正向兑付作废(×%d——零奖励)" % grant_a, grant_a == 0) - Kit.check("四情况 A:兑付作废归因行恰一次(×%d——零惩罚零奖励留痕)" % void_a, void_a == 1) + # 改判〔封印改 V2〕——封印在场入轮末基线:标空判定照发(受理即揭示不改判定批); + # miss_a 口径=seal_miss 型行或来源行(判定行+标空负向兑付行同源) + Kit.check("四情况 A:标空判定照发(×%d——封印在轮末基线;判定行+负向兑付行同源)" % miss_a, miss_a >= 1) + Kit.check("四情况 A:安全格正向兑付为零(×%d——封印不兑付格面资源)" % grant_a, grant_a == 0) + Kit.check("四情况 A:零兑付作废归因行(×%d——改判路径退役无作废行)" % void_a, void_a == 0) # 场景 B:危险格直挖(情况②) var rng_b = load("res://core/rng_service.gd").new() rng_b.set_master_seed(20260919) @@ -634,9 +639,10 @@ func _smoke_seal_irreversible_quadrants() -> void: if t_b.hero_cell != ms_b.hero_pos(): ms_b.settle_batch([{"action": "move", "cell": t_b.hero_cell}]) Kit.check("四情况 B:封印受理", ms_b.settle_batch([{"action": "seal_place", "cell": t_b.seal_cell}])[0].accepted) + # 改判〔封印改 V2〕——挖危险封印格同被拒(封印格拒绝挖掘不分极性) var dig_b: Array = ms_b.settle_batch([{"action": "dig", "cell": t_b.seal_cell}]) - Kit.check("四情况 B:封印危险格直接挖开被受理", not dig_b.is_empty() and bool(dig_b[0].get("accepted", false))) - Kit.check("四情况 B:危险格已揭示(挖雷本体照常)", ms_b.is_revealed(t_b.seal_cell) and ms_b.current_board().is_mine(t_b.seal_cell)) + Kit.check("四情况 B:挖已封印危险格被拒(target_sealed)", not dig_b.is_empty() and not bool(dig_b[0].get("accepted", true)) and String(dig_b[0].get("sub_reason", "")) == "target_sealed") + Kit.check("四情况 B:危险格未揭示(封印格零动作)", not ms_b.is_revealed(t_b.seal_cell) and ms_b.current_board().is_mine(t_b.seal_cell)) ms_b.settle_batch([{"action": "stop"}]) var target_b: Array = [t_b.seal_cell.x, t_b.seal_cell.y] var mine_hit_b := 0 @@ -648,8 +654,9 @@ func _smoke_seal_irreversible_quadrants() -> void: mine_hit_b += 1 if row.get("type", "") == "seal_hit" or String(row.get("source_class", "")) == "seal_hit": hit_b += 1 - Kit.check("四情况 B:挖雷惩罚照常兑付(×%d——只受挖雷一层惩罚)" % mine_hit_b, mine_hit_b >= 1) - Kit.check("四情况 B:标中不发(×%d——封印已擦除不判)" % hit_b, hit_b == 0) + # 改判〔封印改 V2〕——封印在场入轮末基线:标中判定照发(含溢价兑付链) + Kit.check("四情况 B:挖雷惩罚零发生(×%d——封印格未挖)" % mine_hit_b, mine_hit_b == 0) + Kit.check("四情况 B:标中判定照发(×%d——封印在轮末基线)" % hit_b, hit_b >= 1) # 场景 C:不挖收轮(①③判定照常) var rng_c = load("res://core/rng_service.gd").new() rng_c.set_master_seed(20260919) diff --git a/game/tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd b/game/tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd index b9d81c91..e75704bc 100644 --- a/game/tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd +++ b/game/tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd @@ -420,6 +420,8 @@ var _db func _init() -> void: # 判据出处: design/gdd/systems/战斗循环/战斗结算.md:362 (结算接线同种子逐项 golden 对拍组) +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:134 受理零兑付、改判路径死——流水零「奖励作废(封印格直接挖开)」行、 +# 同种子驱动序 golden 实测零漂移零重录(挖封印格被拒——驱动序不含该路径)〔封印改 V6〕 _db = ConfigDBScript.new() var load_ok: bool = _db.load_tables("res://data/tables", true) Kit.check("前置:表加载零 error", load_ok and _db.diagnostics_count("error") == 0) diff --git a/game/tests/unit/core/adventure_feats_test.gd b/game/tests/unit/core/adventure_feats_test.gd index bdc02871..2e8bafba 100644 --- a/game/tests/unit/core/adventure_feats_test.gd +++ b/game/tests/unit/core/adventure_feats_test.gd @@ -147,9 +147,11 @@ func _smoke_adventure() -> void: Kit.check("生成图每个战斗/Boss 节点经解析链命中敌行集与棋盘行(扫描 %d 节点,缺失 %d)〔fv24〕" % [cov_scan, cov_miss], cov_scan > 0 and cov_miss == 0) # ② 满配冒险成功 + ④ 三层奖励兑付(三选一恰 2 次 · 回血封顶 · 钥石逐杀 · 候选零重复) - var st: Dictionary = autoplay.run_adventure(_db, 42, 900, 400) + # 种子换代〔退役改 V7 波及面——test-conventions §5.5 同生死〕:feats.tres 删破封一击行使 + # RNG 流消费序列变,42 路线漂移为 timeout(43 实跑 completed——钉值随表行集换代) + var st: Dictionary = autoplay.run_adventure(_db, 43, 900, 400) var sum: Dictionary = st["summary"] - Kit.check("满配冒险成功(42 / atk+900 / hp+400——cleared=true;v2 怪阶梯后旧 200/100 档不再满配)", String(st["result"]) == "completed" and bool(sum.get("cleared", false))) + Kit.check("满配冒险成功(43 / atk+900 / hp+400——cleared=true;v2 怪阶梯后旧 200/100 档不再满配)", String(st["result"]) == "completed" and bool(sum.get("cleared", false))) Kit.check("完成几关 = 3(levels_cleared)", int(sum.get("levels_cleared", -1)) == 3) var ks_exp := 0 for li in range(1, int(_db.run.level.rows.size()) + 1): @@ -157,7 +159,7 @@ func _smoke_adventure() -> void: Kit.check("钥石合计 = ΣBoss 首杀行值(%d——逐杀掉落新口径;断点未注入恒首杀)" % int(sum.get("keystone_total", -1)), int(sum.get("keystone_total", -1)) == ks_exp) var drops: Array = sum.get("keystone_drops", []) as Array Kit.check("逐杀掉落明细恰 3 笔(L1/L2/L3——additive 摘要键 keystone_drops)", drops.size() == 3) - Kit.check("摘要携带主种子(42)", int(sum.get("master_seed", -1)) == 42) + Kit.check("摘要携带主种子(43)", int(sum.get("master_seed", -1)) == 43) var picks: Array = [] var resolves: Array = [] var node_picks := 0 @@ -274,7 +276,7 @@ func _smoke_adventure() -> void: seq_ok = false Kit.check("各战上限入参 ∈ [基础, 基础+3×件值+购血余量](覆盖值通道——双渠道共享上限 3;模拟档贪心购血合法叠加〔数值修复批 v3.4〕;首战=基础 %d)" % exp_base, seq_ok) # ③ 种子域可复现(同种子两局:summary + 上限序列 + 行进序列 + 三选一停点载荷逐位一致) - var st2: Dictionary = autoplay.run_adventure(_db, 42, 900, 400) + var st2: Dictionary = autoplay.run_adventure(_db, 43, 900, 400) Kit.check("同种子两局逐位可复现(summary/上限序列/行进序列/三选一载荷——reward_pick 封闭流)", st2["summary"] == sum and st2["encounter_max_hp_seq"] == seq and st2["visited_ids"] == st["visited_ids"] and st2["reward_events"] == st["reward_events"]) @@ -465,8 +467,8 @@ func _smoke_adventure() -> void: func _smoke_feats() -> void: # 判据出处: design/gdd/systems/冒险循环/奇物.md:465 (奇物授予与凭证保底组) print("--- 专长重设计实装(feat_table 四级 · 专长带池接线 · 订阅面逐件)---") - # ① 现行表牌库构成:37 件全量入池——102 数值令牌+37 relic 令牌(四级 rarity 直映射) - Kit.check("feat_table 已加载(37 件=基础 27+迁入 2+完美保险 1+迭代 46 换图系七件——换代)", _db.crossrun.feats != null and (_db.crossrun.feats.rows as Array).size() == 37) + # ① 现行表牌库构成:36 件全量入池(破封一击随封印受理即揭示退役〔退役改 V7〕)——102 数值令牌+36 relic 令牌(四级 rarity 直映射) + Kit.check("feat_table 已加载(36 件=基础 27+迁入 2+完美保险 1+迭代 46 换图系七件−破封一击退役〔退役改 V7〕——换代)", _db.crossrun.feats != null and (_db.crossrun.feats.rows as Array).size() == 36) Kit.check("feat_table.validate 零违例(四级 rarity/cap 域/trigger 词表/行键白名单全过)", _db.crossrun.feats.validate().is_empty()) var a_r0 = load("res://core/adventure_runner.gd").new(_db, _fresh_rng(71)) Kit.check("专长带场景:冒险启动(seed 71)", a_r0.start_adventure(71)) @@ -477,7 +479,7 @@ func _smoke_feats() -> void: feat_tokens += 1 var tk := String((t as Dictionary).get("tier", "")) tier_counts[tk] = int(tier_counts.get(tk, 0)) + 1 - Kit.check("专长带入池:37 件四级直映射(普通 14/优秀 13/稀有 10/传说 0)——牌库 102+37=139〔专长批 V2+迭代 46 换图系七件换代〕", feat_tokens == 37 and int(tier_counts.get("common", 0)) == 14 and int(tier_counts.get("excellent", 0)) == 13 and int(tier_counts.get("rare", 0)) == 10 and a_r0.deck().deck.size() == 139) + Kit.check("专长带入池:36 件四级直映射(普通 14/优秀 12/稀有 10/传说 0)——牌库 102+36=138〔专长批 V2+迭代 46 换图系七件换代−破封一击退役〕", feat_tokens == 36 and int(tier_counts.get("common", 0)) == 14 and int(tier_counts.get("excellent", 0)) == 12 and int(tier_counts.get("rare", 0)) == 10 and a_r0.deck().deck.size() == 138) # ② 旧 27 件零残留钉面(V2——arcane_ember 系旧件表首行;全仓 grep 零残留归静态核查) Kit.check("旧 27 件已退役:arcane_ember/magma_body 表内零残留〔专长批 V2〕", _db.crossrun.feats.row_by_id("arcane_ember").is_empty() and _db.crossrun.feats.row_by_id("magma_body").is_empty()) Kit.check("迁出收尾:treasure_items 无 venom_edge/seal_burst 行(同调目录自然收窄)〔专长批 V13〕", _db.crossrun.treasure_items.row_by_id("venom_edge").is_empty() and _db.crossrun.treasure_items.row_by_id("seal_burst").is_empty()) @@ -717,11 +719,7 @@ func _smoke_feats() -> void: Kit.check("背水:生命≤50% 减伤·过半血反例零减伤〔专长批 V3〕", _hits_kind(fx.dispatch(orch.fx_host().counters_ctx, "damage_taken", {"kind": "enemy_skill", "amount": 5, "source": "s", "round": 1, "hp_ratio": 40}), "damage_reduce").size() == 1 and _hits_kind(fx.dispatch(orch.fx_host().counters_ctx, "damage_taken", {"kind": "enemy_skill", "amount": 5, "source": "s", "round": 2, "hp_ratio": 80}), "damage_reduce").is_empty()) - # 跨族桥 - fx.rebuild(["breaker_strike"], [], {}) - Kit.check("破封一击:挖开带封印危险格 +1 层·无封印反例零触发〔专长批 V3〕", - _hits_kind(fx.dispatch(orch.fx_host().counters_ctx, "mine_hit", {"dug_under_seal": true}), "counter_add").size() == 1 - and _hits_kind(fx.dispatch(orch.fx_host().counters_ctx, "mine_hit", {"dug_under_seal": false}), "counter_add").is_empty()) + # 跨族桥(破封一击随封印受理即揭示改版退役——dug_under_seal 事实词除名,改判路径不存在〔封印改 V7〕) # 节奏系 fx.rebuild(["map_exchange"], [], {}) var me_hits: Array = fx.dispatch(orch.fx_host().counters_ctx, "dig_stop", {"ap_left": 4}) diff --git a/game/tests/unit/core/effect_words_t1_test.gd b/game/tests/unit/core/effect_words_t1_test.gd index a485f74a..e736c362 100644 --- a/game/tests/unit/core/effect_words_t1_test.gd +++ b/game/tests/unit/core/effect_words_t1_test.gd @@ -21,10 +21,12 @@ func _init() -> void: Kit.check_quiet(EffectEngineScript.EFFECT_KINDS.has("grant_reserve_ap") and EffectEngineScript.EFFECT_KINDS.has("apply_discount"), "换图系新效果在册:grant_reserve_ap/apply_discount〔换图系批 V1〕") Kit.check_quiet(EffectEngineScript.FACTS.has("hp_ratio") and EffectEngineScript.FACTS.has("is_edge_cell") - and EffectEngineScript.FACTS.has("new_resource_type") and EffectEngineScript.FACTS.has("dug_under_seal") + and EffectEngineScript.FACTS.has("new_resource_type") and EffectEngineScript.FACTS.has("ap_exhausted_last") and EffectEngineScript.FACTS.has("ap_left") and EffectEngineScript.FACTS.has("is_blank_zero") and EffectEngineScript.FACTS.has("amount"), - "新事实在册:hp_ratio/is_edge_cell/new_resource_type/dug_under_seal/ap_exhausted_last/ap_left/is_blank_zero/amount〔专长批 V1〕") + "新事实在册:hp_ratio/is_edge_cell/new_resource_type/ap_exhausted_last/ap_left/is_blank_zero/amount〔专长批 V1——dug_under_seal 随破封一击退役除名,退役改 V7〕") + Kit.check_quiet(not EffectEngineScript.FACTS.has("dug_under_seal"), + "退役事实词出册:dug_under_seal(改判路径退役——词表除名防回潮)〔退役改 V7〕") Kit.check_quiet(EffectEngineScript.EFFECT_KINDS.has("heal") and EffectEngineScript.EFFECT_KINDS.has("ac_bonus") and EffectEngineScript.EFFECT_KINDS.has("damage_reduce") and EffectEngineScript.EFFECT_KINDS.has("bonus_delta") and EffectEngineScript.EFFECT_KINDS.has("blast_scaled") and EffectEngineScript.EFFECT_KINDS.has("preview_area") diff --git a/game/tests/unit/core/minesweeper_rules_test.gd b/game/tests/unit/core/minesweeper_rules_test.gd index 96f9c563..55f9a740 100644 --- a/game/tests/unit/core/minesweeper_rules_test.gd +++ b/game/tests/unit/core/minesweeper_rules_test.gd @@ -42,6 +42,10 @@ func _init() -> void: _test_seal_place() _test_reject_out_of_catalog() _test_preview_reveal_readonly() + _test_seal_reveal_identity() + _test_dig_sealed_rejected() + _test_clear_by_seal() + _test_classify_seal_clears() quit(Kit.finish("minesweeper_rules_test")) @@ -133,12 +137,15 @@ func _test_preview_reveal_readonly() -> void: Kit.check("V14 形态A:preview 返回集(真板形态——%d 格)" % prev_a.size(), prev_a.size() >= 0) Kit.check("V14 形态A:调用前后零状态写入(revealed/seal 计数零变化)〔架构整改 V14〕", _rules.revealed_cells().size() == before_revealed and _rules.seal_count() == before_seals) - # 形态 B:挖封印格——本格封印隐式退役只入模拟集,真实封印计数不动 + # 形态 B(改判〔封印改 V14B〕——挖封印格隐式退役前提随「封印受理即揭示」退役): + # preview(封印格) 连锁不越封印——封印格自身零外扩返回空集,真实封印计数不动 var seal_c := _unrevealed_safe() _rules.settle_batch([{"action": "seal_place", "cell": seal_c}]) var sealed_before := _rules.seal_count() var prev_b: Array = _rules.preview_reveal(seal_c) - Kit.check("V14 形态B:preview(封印格) 零状态写入(seal_count 不变——隐式退役只入模拟集)〔架构整改 V14〕", + Kit.check("V14 形态B:preview(封印格) 零外扩(连锁不越封印——返回空集 %d 格)〔封印改 V14B〕" % prev_b.size(), + prev_b.is_empty()) + Kit.check("V14 形态B:preview(封印格) 零状态写入(seal_count 不变)〔封印改 V14B〕", _rules.seal_count() == sealed_before) # 同口径对照:preview(c) = settle_batch(dig c) 后 revealed 差集 ∖ {c}(F2——不含首格与已开格) var dig_c := _unrevealed_safe() @@ -159,3 +166,163 @@ func _test_preview_reveal_readonly() -> void: var _pc: Array = _rules.preview_reveal(_unrevealed_safe()) Kit.check("V14 零事件:preview 全程 cell_revealed 零发射(前后增量 0——实测 %d→%d)〔架构整改 V14〕" % [events_before_previews, events], events == events_before_previews) + +# 未完成安全格集(清图口径=已挖∪已封印——未揭且未封;V3 阶段c/V4 夹具扫描口) +func _incomplete_cells() -> Array: + var out: Array = [] + for c in _board.safe_cells(): + if not _rules.is_revealed(c) and not _rules.has_seal(c): + out.append(c) + return out + + +# 新板重装夹具(V3 阶段c/V4 干净局面——IDLE 装板→round_start 进 ACTIVE;封印/揭示随装板重置) +func _fresh_board(seed_v: int) -> void: + _ae._phase = 0 # Phase.IDLE——夹具直置(前置相位可能处 ACTIVE:fx_reveal 不经行动经济不收轮;notify_combat_end 相位守卫拒 ACTIVE) + var rng := RngServiceScript.new() + rng.set_master_seed(seed_v) + rng.new_adventure(seed_v) + _board = BoardGeneratorScript.new().generate(1, 0, rng.open_stream("board_gen"), _db) + _rules.install_board(_board) + _ae.notify_round_start() + + +# ---- 封印受理即揭示改版(迭代 56 封印动作改版批 V1–V4——身份可查/挖封印格被拒/清图口径/批次语义序)---- + +# 未揭示且未封印的安全格(V1-V4 夹具对象选择口——排除已封印格) +func _unrevealed_unsealed_safe() -> Vector2i: + for c in _board.safe_cells(): + if not _rules.is_revealed(c) and not _rules.has_seal(c): + return c as Vector2i + return Vector2i(-1, -1) + + +# V1 封印受理即揭示:身份当场可查(sealed_identity 与板事实逐位一致)、受理零事件零兑付 +func _test_seal_reveal_identity() -> void: +# 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:52 封印受理那一刻身份当场可见、受理当场零兑付零事件 + _ae.grant_ap(20) + _rules.seal_range_free = true + var safe_c := _unrevealed_unsealed_safe() + var events := 0 + _rules.cell_revealed.connect(func(_evt): events += 1) # 受理零事件哨兵 + var events_before := events + _rules.settle_batch([{"action": "seal_place", "cell": safe_c}]) + Kit.check("V1 前提:安全格封印受理", _rules.has_seal(safe_c)) + # 身份揭示拼装(用户裁 2026-11-08 上限保持 20——sealed_identity 撤出 rules, + # 身份事实=BoardData.cell_identity、封印态=has_seal,两段各归其主) + Kit.check("V1 安全格封印身份 kind=safe 且 digit=板数字逐位一致(%s vs %d)〔封印改 V1〕" % [str(_board.cell_identity(safe_c).get("kind", "")), _board.digit_of(safe_c)], + _rules.has_seal(safe_c) and String(_board.cell_identity(safe_c).get("kind", "")) == "safe" + and int(_board.cell_identity(safe_c).get("digit", -9)) == _board.digit_of(safe_c)) + Kit.check("V1 受理零事件:cell_revealed 零发射(%d→%d)〔封印改 V1〕" % [events_before, events], + events == events_before) + # 危险格封印身份:找未开危险格封印 → kind=mine + var mine_c := Vector2i(-1, -1) + for c in _board.all_cells(): + if _board.is_mine(c) and not _rules.is_revealed(c) and not _rules.has_seal(c): + mine_c = c + break + if mine_c != Vector2i(-1, -1): + _rules.settle_batch([{"action": "seal_place", "cell": mine_c}]) + Kit.check("V1 危险格封印身份 kind=mine〔封印改 V1〕", + _rules.has_seal(mine_c) and String(_board.cell_identity(mine_c).get("kind", "")) == "mine") + Kit.check("V1 身份事实与揭示态独立:未封印格 has_seal=false 但身份可查(板事实恒在)〔封印改 V1〕", + not _rules.has_seal(_unrevealed_unsealed_safe()) + and not _board.cell_identity(_unrevealed_unsealed_safe()).is_empty()) + + +# V2 挖已封印格被拒:原因可辨 target_sealed、封印/揭示/AP 三态零变化 +func _test_dig_sealed_rejected() -> void: +# 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:56 动作合法性表——挖的拒绝情形含已封印 + var sealed_c := Vector2i(-1, -1) + for c in _board.all_cells(): + if _rules.has_seal(c) and not _rules.is_revealed(c): + sealed_c = c + break + Kit.check("V2 前提:已封印未开格在板", _rules.has_seal(sealed_c) and not _rules.is_revealed(sealed_c)) + _rules.dig_range_bonus = 99 # 夹具免邻接(公开属性直置——seal_range_free 先例同款;挖掘射程非判据面) + _ae.grant_ap(20) + var ap_before: int = _ae._ap + var out: Array = _rules.settle_batch([{"action": "dig", "cell": sealed_c}]) + var o: Dictionary = (out[0] as Dictionary) if not out.is_empty() else {} + Kit.check("V2 挖封印格被拒且原因可辨(sub_reason=target_sealed——实测 %s)〔封印改 V2〕" % String(o.get("sub_reason", "")), + String(o.get("outcome", "")) == "rejected" and String(o.get("sub_reason", "")) == "target_sealed") + Kit.check("V2 拒绝零副作用:封印态/揭示态/AP 三态零变化〔封印改 V2〕", + _rules.has_seal(sealed_c) and not _rules.is_revealed(sealed_c) and _ae._ap == ap_before) + _rules.dig_range_bonus = 0 # 还原射程(后续夹具不吃豁免) + + +# V3 清图口径换代:封印可完成清图(封掉最后安全格→cleared 收束);非末封印不清图 +func _test_clear_by_seal() -> void: +# 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:139 清图=全部安全格完成,完成=挖开或封印 + _ae.grant_ap(20) + _rules.seal_range_free = true + # 阶段 a:封一张非末安全格 → clear_map_cleared 仍 false(封印计入完成但未清完) + var seal_c := _unrevealed_unsealed_safe() + _rules.settle_batch([{"action": "seal_place", "cell": seal_c}]) + Kit.check("V3 阶段a 前提:封印受理", _rules.has_seal(seal_c)) + Kit.check("V3 阶段a:非末封印后清图未达成(clear_map_cleared=false)〔封印改 V3〕", + not _rules.clear_map_cleared()) + # 阶段 b:fx_reveal 除 seal_c 外全部未完成安全格 → 唯一未完成格=已封印的 seal_c → 封印计入完成 + for c in _board.safe_cells(): + if c != seal_c and not _rules.is_revealed(c) and not _rules.has_seal(c): + _rules.fx_reveal(c) + Kit.check("V3 阶段b:唯一未完成格=已封印格 → clear_map_cleared=true〔封印改 V3〕", + _rules.clear_map_cleared()) + # 阶段 c:另起干净新板——逐格封至清图(每封一批次真实入口):非末封零 round_end、 + # 末封恰发一条 path_tag=cleared 的轮末事件(封印后清图判定触发——轮末事件 carry 清图) + _fresh_board(81003) + _ae.grant_ap(60) + _rules.seal_range_free = true + var end_seen: Array = [] + _rules.round_end_board.connect(func(p): end_seen.append(String(p.get("path_tag", "")))) + var guard := 0 + while not _rules.clear_map_cleared() and guard < 200: + guard += 1 + var t: Vector2i = _incomplete_cells()[0] if not _incomplete_cells().is_empty() else Vector2i(-1, -1) + if t == Vector2i(-1, -1): + break + _rules.settle_batch([{"action": "seal_place", "cell": t}]) + Kit.check("V3 阶段c:逐格封至清图达成(%d 封——封印可完成清图)〔封印改 V3〕" % guard, + _rules.clear_map_cleared()) + Kit.check("V3 阶段c:清图收束恰一次且 path_tag=cleared(round_end 序列=%s)〔封印改 V3〕" % str(end_seen), + end_seen.size() == 1 and String(end_seen[0]) == "cleared") + + +# V4 批次语义序:同批「停手 + 能清图的封」提交 → 赢家=清图收束而非停手 +func _test_classify_seal_clears() -> void: +# 判据出处: design/gdd/systems/排雷循环/排雷玩法.md:167 最先=能清图的挖或封——防耗尽优先把清图高光结算成最差结局 + # 收敛未完成格到恰 1 格(封它即清图;fx_reveal 连锁不可控——逐格揭至剩 1,连锁越格则换种子重试) + var left: Array = [] + var last_c := Vector2i(-1, -1) + for seed_i in range(3): + _fresh_board(81004 + seed_i) + _ae.grant_ap(60) + _rules.seal_range_free = true + left = _incomplete_cells() + var guard2 := 0 + while left.size() > 1 and guard2 < 400: + _rules.fx_reveal(left[0]) + left = _incomplete_cells() + guard2 += 1 + if left.size() == 1: + last_c = left[0] + break + Kit.check("V4 前提:未完成格收敛到恰 1 格(实测 %d——封它即清图)" % left.size(), + left.size() == 1) + if left.size() != 1: + quit(Kit.finish("minesweeper_rules_test")) + return + var intents: Array = [{"action": "stop"}, {"action": "seal_place", "cell": last_c}] + # 同批「停手+能清图的封」:末格封 cls 0 最先执行→cleared 收轮;stop cls 1 voided + var end_seen: Array = [] + _rules.round_end_board.connect(func(p): end_seen.append(String(p.get("path_tag", "")))) # append 捕获引用(lambda 内重绑定不回写) + var outcomes: Array = _rules.settle_batch(intents) + Kit.check("V4 赢家=清图封:round_end path_tag=cleared 而非 stopped(round_end 序列=%s)〔封印改 V4〕" % str(end_seen), + end_seen.size() == 1 and String(end_seen[0]) == "cleared") + Kit.check("V4 清图封印受理(末格 %s 在封印态)〔封印改 V4〕" % str(last_c), _rules.has_seal(last_c)) + # outcomes 按执行序承载(cls 升序)——赢家=cls 0 的清图封居首;stop 与非末封在其后 voided + var o_winner: Dictionary = (outcomes[0] as Dictionary) if not outcomes.is_empty() else {} + Kit.check("V4 末格封意图受理(batch 赢家=清图封居执行序首——实测 %s)〔封印改 V4〕" % String(o_winner.get("outcome", "")), + String(o_winner.get("outcome", "")) == "executed") + Kit.check("V4 其余意图 voided(清图收轮后批次余项作废)〔封印改 V4〕", + outcomes.size() >= 2 and String((outcomes[outcomes.size() - 1] as Dictionary).get("outcome", "")) == "voided") diff --git a/game/tests/unit/presentation/battle_log_zero_text_test.gd b/game/tests/unit/presentation/battle_log_zero_text_test.gd index 84ffb32d..789c66cc 100644 --- a/game/tests/unit/presentation/battle_log_zero_text_test.gd +++ b/game/tests/unit/presentation/battle_log_zero_text_test.gd @@ -18,6 +18,11 @@ func check(cond: bool, msg: String) -> void: func _init() -> void: +# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) + _smoke_settle_zero_rows() + + +func _smoke_settle_zero_rows() -> void: # 判据出处: design/gdd/08-Alpha版本标准.md:154 战斗演出链(弹道 / 受击 / 血条 / 灰化)在役; # 逐行结算排播行已随 v1.29 退役——结算期 B 区零逐行文字、FX 排播链保持 var main: Node = load("res://presentation/main.tscn").instantiate() diff --git a/game/tests/unit/presentation/hud_presenter_test.gd b/game/tests/unit/presentation/hud_presenter_test.gd index 6c779854..289bd451 100644 --- a/game/tests/unit/presentation/hud_presenter_test.gd +++ b/game/tests/unit/presentation/hud_presenter_test.gd @@ -27,7 +27,8 @@ func _test_reject_text_by_reason() -> void: var cases := { "not_adjacent": "不能执行:目标与小人不相邻", "target_revealed": "不能执行:目标已开", - "seal_present": "不能封印:此格已有封印印记(封印为一次性承诺——相邻时左键直接挖开)", + "seal_present": "不能封印:此格已有封印印记(封印受理即揭示——印记随图存续)", + "target_sealed": "不能挖:此格已封印(封印受理即揭示——不可再挖开)", } var bad: Array[String] = [] for sub in cases: diff --git a/game/tests/unit/presentation/player_copy_sweep_test.gd b/game/tests/unit/presentation/player_copy_sweep_test.gd index c4e78de3..1bc51d19 100644 --- a/game/tests/unit/presentation/player_copy_sweep_test.gd +++ b/game/tests/unit/presentation/player_copy_sweep_test.gd @@ -76,7 +76,10 @@ func _sweep_legend() -> void: seal_row = e break Kit.check("图例封印行含「标空」(u4——与「标中」成对)〔wa5〕", String(seal_row[2] if seal_row.size() > 2 else "").contains("标空")) - Kit.check("图例封印行含「受挖掘惩罚」(u4 雷字清零换代)〔wa5〕", String(seal_row[2] if seal_row.size() > 2 else "").contains("受挖掘惩罚")) + # 文案换代〔封印改 V10〕——图例封印行新口径:受理即揭示、已封印格零动作(旧「受挖掘惩罚」句随改判路径退役) + Kit.check("图例封印行含「受理即揭示」且零雷字(u4 清零换代〔封印改 V10〕)〔wa5〕", + String(seal_row[2] if seal_row.size() > 2 else "").contains("受理即揭示") + and not String(seal_row[2] if seal_row.size() > 2 else "").contains("雷")) for w in ["插错", "挖雷"]: Kit.check("图例封印行零「%s」〔wa5〕" % w, not String(seal_row[2] if seal_row.size() > 2 else "").contains(w)) diff --git a/game/tests/unit/presentation/seal_mark_params_test.gd b/game/tests/unit/presentation/seal_mark_params_test.gd index 8000c9c4..e7653a63 100644 --- a/game/tests/unit/presentation/seal_mark_params_test.gd +++ b/game/tests/unit/presentation/seal_mark_params_test.gd @@ -14,6 +14,7 @@ func _init() -> void: _test_param_values() _test_shader_uniforms() _test_fog_gate() + _test_seal_on_revealed_visible() quit(Kit.finish("seal_mark_params_test")) @@ -54,3 +55,16 @@ func _test_fog_gate() -> void: u.seal_on = false Kit.check("撤 seal_on 即撤子件〔seal批 V4〕", u._seal_layer == null) u.free() + + +# R8 新组合态:seal_on 与已揭示同真时印记子件仍可见(封印受理即揭示改版——印记可见性不依赖 +# 揭示态;内部字段直查=受控例外同 _test_fog_gate——子件可见性无公开可观测面,对照表随行申报) +func _test_seal_on_revealed_visible() -> void: +# 判据出处: design/ux/battle.md「封印格呈现预览」受理即揭示——印记承载面换代(已揭示格承载合法) + var u: Node2D = CELL_UNIT.new() + u.seal_on = true + Kit.check("R8 前提:seal_on 挂封印子件〔封印改 V8〕", u._seal_layer != null) + u.fog_state = 0 + Kit.check("R8 新组合态:seal_on 与揭示同真印记仍可见(非雾态——承载面不因揭示态撤印)〔封印改 V8〕", + u._seal_layer != null and u._seal_layer.visible == true) + u.free() diff --git a/reports/iter56-代拍板追认单-2026-11-08.md b/reports/iter56-代拍板追认单-2026-11-08.md new file mode 100644 index 00000000..68455e71 --- /dev/null +++ b/reports/iter56-代拍板追认单-2026-11-08.md @@ -0,0 +1,46 @@ +# 迭代 56 代拍板追认单 + +> 2026-11-08 汇总(实现批代拍板随 commit 留痕,本单逐条呈用户追认——超白名单事项另见「实现决定记录」)。 + +## 卡1 白名单内代拍板(需求卡片-结算期文字列表退役批 §12) + +| # | 白名单项 | 实际裁决 | 落点 | +|---|---|---|---| +| 1 | 新增测试函数命名与落点 | `battle_log_zero_text_test.gd`(presentation/)、`playtest_logger_step_fields_test.gd`(presentation/)、`reward_ineffective_reason_test.gd`(battle_settlement/)、`tools/analyze_parity_check.py`——全落卡内 §7 指定目录 | f0390714/T2/T3 提交 | +| 2 | battle_log_view 去留二选一 | **选「只留摘要位」**:视图壳/摘要位/append_bb 叙述行/set_mode 保留;逐行流与行格式化域(_fmt_*/AGG 聚合/_round_rows)删净。整体退役分支否决原因=五处冒险叙述行无处可迁(迁置=改呈现面超卡) | f0390714 | +| 3 | reason 四枚举键写法 | 照现役 _emit_row extra 模式**字面量直写**六发射点(零新 helper 零新常量);取值 full_layers/full_hp/no_enemy_alive/hero_down | T2 提交 | + +## 卡2 白名单内代拍板(需求卡片-封印动作改版批 §11) + +| # | 白名单项 | 实际裁决 | 落点 | +|---|---|---|---| +| 1 | 拒绝原因英文串定名 | `target_sealed`(保持卡串,零拼写微调) | 2d8a4d07 | +| 2 | 拒绝/悬停 toast 与图例最终措辞 | seal_present 句「不能封印:此格已有封印印记(封印受理即揭示——印记随图存续)」;target_sealed 新句「不能挖:此格已封印(封印受理即揭示——不可再挖开)」;图例封印行「封印印记(受理即揭示——落定当场可见格下身份,随图存续不能拔)——轮末自动判定标中/标空;已封印格零动作(不可再挖开)」;提示条「左键 挖掘 / 移动 · 右键 封印(受理即揭示·不可逆)」 | T3 提交 | +| 3 | 测试函数命名与断言组织 | 对照表点名函数名全数照用(_test_seal_reveal_identity/_test_dig_sealed_rejected/_test_clear_by_seal/_test_classify_seal_clears/_test_seal_on_revealed_visible);V14 形态 B 改判与 V9 case④c 为申报内改判的组织细节 | 2d8a4d07/T4 提交 | +| 4 | 色牌/装饰渲染细节 | 取现行 ui_kit/art-bible 现行值(COL_FLOOR/COL_BRICK/SealMarkLayer 参数化),零新常量 | T3 提交 | +| 5 | sim 补偿注入形态与常量初值 | 形态=「错触直挖」(封印已证雷意图按概率转同格挖——目标未封未揭,新规则下合法路径);初值 NORMAL_MISDIG_P=0.10(承旧注入 0.10——同构期望);计数字段沿用 mine_slips(锚对比列对齐)。**偏差读数已回填**:改前代码现跑踩雷 6.48/局 → 新锚 5.40/局(-1.08——含策略对齐合成效应非纯注入贡献;注入触发单局实测 slips=5) | T6 提交+实现报告 §四 | +| 6 | mac golden 缺件处理 | mac 三件缺件记遗留(渲染闸 SKIP 不判红——T7 预案兑现) | T7 提交 | + +## 实现决定记录(白名单外,凭规约条款自判——逐条列备案) + +| # | 事项 | 判据与依据 | 落点 | +|---|---|---|---| +| 1 | **sealed_identity 落位重设计**(撤出 minesweeper_rules、BoardData 新增 cell_identity) | 用户裁决 2026-11-08「上限保持 20」覆盖卡2 §12 宿主指定;预检失实根因=写卡段「远低于 20」凭印象未实跑(基线恰 20 贴线);停机呈报后用户裁「你自己重新设计」 | T1b 提交 | +| 2 | **S13 三条新违规拆 helper 修净**(_classify_seal/_seal_face_reject 私有 helper) | 卡2 §14「预期只降不升」+gdstyle「新码须修到基线口径内」——非阈值修订非基线新增,合规修复 | T1a 提交 | +| 3 | **feat_vouchers_test A12 断言退役改写**(_format_row 不在位防回潮断言) | 申报外波及面;test-conventions §5.5 换代同生死(旧文案呈现路径摘除=断言对象退役);替代断言=退役态防回潮 | T1 提交 | +| 4 | **pacing_queue_test 断言②改判**(「末行原文在明细带」→FX 链承接 _assert_fx_chain) | 卡1 §10 申报面(:108-120 文字呈现部分)——改写为退役后正向断言,FX 计数从行集独立推导(不镜像实现) | T1 提交 | +| 5 | **theme_projection_test 行协议闸改写**(9 类逐型 FX 落拍闸) | 同 §5.5——格式化域摘除后盲区检测法(解析文本增长)等价迁移为落拍计数增长;原防「格式化炸结算段」的闸价值保留 | T1 提交 | +| 6 | **ui_click_probe wr1-b 反转+开场行判定面换代**(最新行本体判定) | T1 波及(clear 移除破坏「全文本计数」判定前提+摘要功能退役使 wr1-b 语义反转)——断言意图保留、判定面换代 | f0390714 | +| 7 | **adventure_feats_test 满配种子 42→43+表行数 37→36 判值换代** | feats 删行使 RNG 流消费序列变,42 路线漂移为 timeout(主区基线 42 绿对照坐实非行为回归);§5.5 同生死——种子钉值绑旧表行集 | T2+T5 提交 | +| 8 | **ui_click_probe 行为②随机撤封印段摘除** | 卡2 T4 点名「行为②撤封印死路段清理」——申报内 | T4 提交 | +| 9 | **R6 golden 实测零漂移零重录** | settlement_wiring_snapshot 内嵌 golden 在「挖+封+停」驱动序下与改前逐位一致(驱动序不含挖封印格——T1 后该路径被拒)——重录义务免除,读数绿在案 | T2 验收 | +| 10 | **卡1 R4 判读等价基线快照重出**(改前分析器经 git show 提取补丁件跑出完整快照) | T0 落盘的历史锚快照被 head 管道 SIGPIPE 截断(60 行截断)——R4 读数①②需完整改前基线;改前分析器(master 字节)跑出 3394/149 行快照替换,sim-data 留盘 | T3 提交 | +| 11 | **ui_probe:133-135 与 ui_click_probe:423/:473/:616/:798-844 零改动** | 卡1 §10 申报清单列名面实况核查:不依赖退役面(:133-135 读 pending_rows 与尺寸;:423/:473 savesel 段无 battle_log 引用;:616 全文本判首个冒险无残留仍安全)——无文字断言可改写=零改动 | 实现报告对照表登记 | + +## 体验验证清单登记项(真人目检——登记不阻塞,实机目检后由用户销项) + +1. 结算期 B 区零逐行文字(FX 排播链仍逐拍演出)——卡1 R1 体验面 +2. 伤害飘字/弹道/站桩反馈在新排播形态下的观感——卡1 R2 体验面 +3. 封印受理瞬间揭示的观感(地板+身份字形+法阵叠加)——卡2 R8 体验面 +4. 封印格悬停禁字与图例新句——卡2 R9/R10 体验面 +5. 清图高光在封印完成清图时触发——卡2 R3 体验面 diff --git a/reports/iter56-反哺点-2026-11-08.md b/reports/iter56-反哺点-2026-11-08.md new file mode 100644 index 00000000..fa8b0565 --- /dev/null +++ b/reports/iter56-反哺点-2026-11-08.md @@ -0,0 +1,28 @@ +# 迭代 56 反哺点清单 + +> 2026-11-08 采集(实现批产出——设计权威文档实现批禁写,逐条经用户裁决后由文档批落文)。 +> 卡2 预期零反哺点(设计面前置闭合)兑现:封印改版的设计条款无差异发现;下列各条全部来自卡1(逐行文字退役)与开工检查发现。 + +## 卡1 反哺点(结算期文字列表退役批) + +| # | 文档与位置 | 现行句的问题 | 建议改写方向 | 依据 | +|---|---|---|---|---| +| 1 | design/ux/battle.md:200(B 区组件表「结算明细带」行) | 「结算期逐行流水(9 类行协议);挖掘期收起为上轮摘要 1 行」——逐行流水已退役,现行句描述已不存在的呈现 | 明细带行改写为退役后形态:挖掘期摘要位+叙述行承载;逐行流水行删除或标注已退役(对照 08-Alpha v1.29 删「逐行结算排播」行的口径) | 卡1 §6 同步面(原卡锚 :199 漂移至此);用户裁定 2026-11-07 撤逐行滚动文字列表 | +| 2 | design/ux/battle.md:364(交互矩阵「结算阶段」行) | 「明细带按结算期档展开(高读 log_band_h_settle)逐行滚动」——逐行滚动已退役 | 改写为:明细带 settle 展开保留(空带+叙述行),删除「逐行滚动」表述 | 同上;实现实况=set_mode 保留双态、settle 态零逐行内容 | +| 3 | design/ux/battle.md:439(减动效选项行动效列) | 「动效:结算逐行兑现为信息载体不可整体跳过,可加倍」——「逐行兑现为信息载体」的文字承载面已退役 | 保留「演出不可整体跳过」语义,删除「为信息载体」措辞(FX 排播链仍是兑现呈现,非文字信息载体) | 卡1 R2 判据锚实际指向此行;FX 链退役文字后仍是演出载体 | +| 4 | design/gdd/systems/表现与支撑/HUD框架.md:272 | 「结算逐行实时滚出且每行带来源标注;未生效类行聚合计数并带形状冗余;零值行不被吞」——逐行滚出与聚合计数均已随明细带退役 | 改写为:结算演出链逐行兑现(FX 载体);明细带行删除;「零值行不被吞」语义迁日志面(step 行零删减) | 卡1 R1 退役面;theme_projection 行协议闸改写后的实际形态 | +| 5 | design/gdd/systems/战斗循环/战斗结算.md:87 | 「显示名等玩家可见文案是数据面字段:文案值登记在数据表行,代码按来源类别与效果身份读表拼行」——行协议保留 display_name(呈现面消费),但日志消费端已零文案 | 补一句消费端边界:日志落盘零文案(text/display_name 不落盘),文案仅呈现面消费 | 卡1 T2 落地实况;卡1 §6 已列此文档 | +| 6 | design/gdd/systems/战斗循环/战斗结算.md:80 附近 | 「奖励未生效行」行型的产生面变化:封印作废行(封印格直接挖开)随改判路径退役——未生效行只剩四类(满层/满血/无存活敌人/主角已倒下),且带结构化 reason 键 | 未生效行清单换代(四类+reason 结构化说明);封印作废行除名 | 卡1 T2+卡2 T2(grant_segment:103 作废行块删除) | +| 7 | design/gdd/systems/战斗循环/战斗表现.md:53/:99/:149 | 「结算逐行兑现是信息载体」「能说出这一行来自哪步操作」等句——文字行退役后兑现载体=FX 链 | 三处「逐行兑现」措辞按 FX 载体口径改写 | 卡1 §6 已列 | +| 8 | design/gdd/08-Alpha版本标准.md:42 | 「战斗表现……Alpha 判据=受击闪白/死亡不瞬间消失/高光行/逐行排播四条可读」——「逐行排播」残留(v1.29 只删了「逐行结算排播」独立行,战斗表现条目的判据句漏改) | 判据句删「逐行排播」或改「演出链兑现可读」 | 开工检查发现(v1.29→v1.30 版本漂移核查);与本批裁定直接冲突的残留句 | +| 9 | 体验验证清单.md(:86/:206/:220/:314/:315/:326/:442/:519 八处) | 逐行结算、明细带来源/行序/文案可读性、减半标签等目检项——呈现面已换代 | 逐条按退役后形态改写;新增两条目检项:结算期 B 区零逐行文字、封印受理瞬间揭示观感 | 卡1 §6 已列;卡2 §8 体验面四项(封印受理瞬间揭示、悬停禁字、图例新句、清图高光) | + +## 卡2 反哺点 + +无(设计面前置闭合;实现与排雷玩法.md v2.0 等事实源零冲突)。 + +## 过程发现登记(非文档反哺,供流水线改进参考) + +1. **判据出处行锚漂移**:卡1 复核轮 2 钉死的 ux/battle.md 锚(:199/:272/:347)被 2026-11-07「顶栏搬两侧」文档批修订冲漂(真锚 :200/:364/:439)——写卡段锚钉死后同日文档批仍会冲漂;建议:判据锚钉节锚形态(test-conventions §8.3 已有节锚两档——2026-11-07 架构收窄批立的防漂移机制,写卡段对易漂移文档改用节锚)。 +2. **卡2 §14 预检读数失实**:「两宿主现行公开方法数远低于 20 上限」系凭印象未实跑(minesweeper_rules 恰 20 贴线,+1 即越)——iter-plan 第 3 步预检的 S13 键读数义务应显式包含「新增公开方法的宿主余量实跑核对」。 +3. **流水线闸 ANCHOR_RE 不含中文路径**:待办清单在册条目(2026-11-05 登记),本批卡1 锚全为 ASCII 路径未触雷——非本批引入,留待办。 diff --git a/reports/iter56-实现报告-2026-11-08.md b/reports/iter56-实现报告-2026-11-08.md new file mode 100644 index 00000000..5b0800af --- /dev/null +++ b/reports/iter56-实现报告-2026-11-08.md @@ -0,0 +1,105 @@ +# 迭代 56 实现报告(结算期文字列表退役批+封印动作改版批) + +> 2026-11-08。工作区 `../g-plan2-iter56`(分支 iter56,基线 a0ea828f)。两卡按 roadmap 卡序串行:卡1(结算期文字列表退役)→卡2(封印动作改版)。批性质=代码实现批;`design/`、根规则文件、`game/tests/README.md` 零写入。 + +## 一、各卡状态 + +| 卡 | 状态 | 提交序列 | +|---|---|---| +| 卡1 结算期文字列表退役批 | **完成**(T0-T3 落地;T4 随批末) | f0390714(T1 撤逐行文字)→T2(日志零文案+reason)→T3(分析工具+对拍载体) | +| 卡2 封印动作改版批 | **完成**(T0-T7 落地) | 2d8a4d07(T1 规则核心)→T1a(S13 收敛)→T1b(落位重设计·用户裁)→T2+T5(结算退役+内容退役)→T3(呈现层)→T4(测试探针)→T6(sim 域)→T7(golden) | + +## 二、实际改动—验收对照表(逐行结果读数) + +### 卡1(R1-R5;对照表出处=需求卡片 §10) + +| 需求点 | 验收测试(文件:函数) | 真实入口 | 判据绑定面 | 结果读数 | +|---|---|---|---|---| +| R1 结算期零逐行文字(ux/battle.md:200——原卡锚 :199 漂移,随批维护) | battle_log_zero_text_test.gd:_smoke_settle_zero_rows(新增) | main.tscn 组合根→真实停手→轮末结算→B 区场景树 | 三时点 parsed_text 冻结于进节点叙述基线(step_row 消费零追加——「不绑终屏态」口径) | **绿**(PASS,读数见 f0390714) | +| R2 FX 与 toast 链不断(ux/battle.md:439——原卡锚 :347 漂移) | pacing_queue_test.gd:_assert_fx_chain(新增断言函数) | 真实行集驱动独立 RowPacer | on_step_row_fx 每行一拍+弹道/标出/色环/highlight 三路计数与行型分布逐位一致(期望独立推导);FX 链三函数零 diff=改前逐位一致凭证 | **绿**(PASS) | +| R3 日志零文案、字段不缺(战斗结算.md:87) | playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload(新增) | LevelAutoplay.run_level 挂 logger→真实结算→落盘 JSONL 读回 | 零 text/display_name+公共七字段与平铺原件逐行在位+damage payload 并集抽样 | **绿**(PASS) | +| R4 分析判读等价(test-conventions.md:133) | tools/analyze_parity_check.py(新增) | 三读数对拍 | ①历史锚改后分析器复跑 vs 改前分析器基线 3394 行逐位一致 ②改前种子日志双版本一致 ③改前 vs 改后同种子(71000)新日志逐位一致 | **绿**(三读数全一致,读数见 T3 提交) | +| R5 未生效原因结构化(战斗结算.md:80) | reward_ineffective_reason_test.gd:_assert_four_reasons(新增) | 真实板身份快照→grant_routed 路由→轮末结账 | 四类 reason 逐一命中(full_hp/hero_down/full_layers=no_guard 堆层/no_enemy_alive=敌 hp=1+blast 双单 defer);两处受控例外直改(hero hp=0、敌 hp=1——无公开 setter,随行申报) | **绿**(PASS,四类全命中) | + +**卡1 测试削弱申报兑现**:§10 点名的改写面全部落地——theme_projection(行协议闸→FX 链逐型闸)、player_copy_sweep(u6 消费半→退役防回潮)、ui_probe:133-135 与 ui_click_probe:423/:473/:616/:798-844(实况核查不依赖退役面——**零改动**,见追认单 #11)、pacing_queue:108-120(断言②改判 FX 承接)。**申报外波及面**(§5.5 同生死):feat_vouchers A12、wr1-b 反转、开场行判定面、ui_input_probe case④b 注记——均改写为退役后正向断言,无删除断言。 + +### 卡2(R1-R12;对照表出处=需求卡片 §8) + +| # | 需求点 | 验收测试 | 真实入口 | 结果读数 | +|---|---|---|---|---| +| R1 | 封印受理即揭示(排雷玩法.md:52) | minesweeper_rules_test:_test_seal_reveal_identity〔封印改 V1〕 | MinesweeperRules.settle_batch() | **绿**(身份逐位+受理零事件+身份与揭示态独立断言) | +| R2 | 挖封印格被拒(排雷玩法.md:56) | _test_dig_sealed_rejected〔V2〕+seal_polarity 四情况组改判〔V2〕 | settle_batch() | **绿**(target_sealed+三态零变化;四情况组标中/标空判定照发) | +| R3 | 清图口径换代(排雷玩法.md:139) | _test_clear_by_seal〔V3〕 | settle_batch() | **绿**(非末封 false/封印计入完成 true/逐格封至清图 round_end 恰一条 cleared) | +| R4 | 能清图的封最优先(排雷玩法.md:167) | _test_classify_seal_clears〔V4〕 | settle_batch() 同批 stop+清图封 | **绿**(赢家=清图封居执行序首、stop voided、round_end cleared) | +| R5 | 判定批与溢价零改动(战斗结算.md:139) | seal_polarity 保留组原样+V5 注记行 | BattleOrchestrator 全轮驱动 | **绿**(76 pass——末点 AP/标中溢价/标空/完美封印双份原样) | +| R6 | 受理零兑付、改判路径死(战斗结算.md:134) | settlement_wiring_snapshot 内嵌 golden〔V6〕 | BattleOrchestrator 真实驱动序 | **绿**——golden 实测零漂移零重录(驱动序不含挖封印格;流水零作废行) | +| R7 | 破封一击退役、词除名(奇物.md:72) | adventure_feats/effect_words_t1 换代〔V7〕+grep | feats.tres 装载路径 | **绿**(grep dug_under_seal/breaker_strike 非测试面=0;词表出册防回潮断言;表 36 件装载绿) | +| R8 | 封印格呈现三件套(ux/battle.md:170) | seal_mark_params:_test_seal_on_revealed_visible〔V8〕+board_shot 选择器+ui_input_probe case④b | 真实场景+push_input | **绿**(新组合态印记可见——受控例外随行申报;探针印记落位绿) | +| R9 | 已封印格零动作(ux/battle.md:299) | ui_input_probe case④c〔V9〕 | push_input 左/右键 | **绿**(零发射+FORBIDDEN+禁入框+图例说明在册) | +| R10 | 文案四件(ux/battle.md:284) | hud_presenter/player_copy_sweep 换代+click 图例〔V10〕 | 文案装配+真实场景 | **绿**(逐字断言换代+雷字清零守恒) | +| R11 | sim 策略对齐+MC 同批重锚(排雷玩法.md:52) | MC 配对读数(测量面) | sim 采集链 master_seed 配对 | 代码面绿(试车 5 局健康);**新锚采集后台进行中,读数回填 §四** | +| R12 | 渲染基线换代(ux/battle.md:170) | 渲染闸+golden 三图重制〔V12〕 | 真实渲染截图 | **绿**(board_shot 双帧取证 PASS+golden 三屏对比全绿;用户预览图人审 2026-11-07 在案;mac 三件缺件记遗留) | + +**卡2 测试削弱申报兑现**:四处点名改判全落地(①四情况组②preview 形态 B③文案逐字④wiring golden——实测零漂移未重录)。**申报外波及面**:adventure_feats 满配种子 42→43+行数 37→36(feats 删行 RNG 流漂移——§5.5 同生死,主区基线对照坐实非行为回归);ui_click_probe 行为②摘除。其余旧断言零删除。 + +## 三、能力行名实核对(game/tests/README.md 批末核对——实现批零写入) + +- :88 封印与极性路由(_smoke_seal_ap_exhausted/_smoke_seal_irreversible_quadrants/_smoke_polarity_routing)——**名实一致**(函数在位) +- :117 挖/封印合法性与可辨拒绝(_test_dig_sealed_rejected/_test_classify_seal_clears 计划锚定)——**落地一致** +- :119 封印受理即揭示(_test_seal_reveal_identity)——**落地一致** +- :120 清图口径换代(_test_clear_by_seal)——**落地一致** +- :121 棋盘封印印记呈现(_test_seal_on_revealed_visible 计划锚定)——**落地一致** +- :137 结算期零逐行文字(_smoke_settle_zero_rows/_assert_fx_chain/standee_fx_sweep_test:_init)——**落地一致** +- :138 日志 step 行零文案(_assert_no_text_and_full_payload/_assert_four_reasons)——**落地一致** +- 改名面:无(零回表) + +## 四、MC 同批重锚读数(R11——已落盘) + +- **规模口径**:50/档=100 局(2026-11-08 用户批准——发起时呈报三档规模供裁,首采 800 局超一档硬闸被停采作废,重采按批准规模执行) +- **新锚**:`runsum_iter56reanchor_81000_n50both_20261108.jsonl`(纯 RUNSUM 100 行、policy+seed 升序;全量明细 jsonl 不留盘) +- **对照读数**(三方对照:改前锚 2026-10-03/改前代码 2026-11-08 现跑 50 局/改后新锚 50 局,同 seed0=81000): + +| 指标 | 改前锚(旧代码读数) | 改前代码现跑 | 改后新锚 | 本批效应 | +|---|---|---|---|---| +| normal 通关率 | 0% | 0% | 0% | 无变化 | +| normal 踩雷均值/局 | 6.72 | 6.48 | 5.40 | -1.08(错触注入替代旧滑失+策略对齐合成) | +| normal 标中/标空/封印数 | 无字段 | 21.34/6.74/52.2 | 19.60/7.86/49.9 | 小幅漂移(标空剔除约束增强+清图口径) | +| perfect 通关率 | 59% | **0%** | **4%** | **改前锚失实早有声明**(sim-data/README:10 代表性注记——两月代码演进使模拟行为漂移;改前代码现跑 0% 对照坐实与本批无关);本批效应方向=升(封印计入清图利好完美策略) | +| perfect 踩雷均值 | 0 | 0 | 0 | 无变化 | +| perfect 标中/封印数 | 无字段 | 45.96/91.1 | 48.28/96.1 | 小幅升(同上方向) | + +- **结构性恶化判定**:无(normal 踩雷降、perfect 通关升——两方向均为改版利好或中性;标中/标空经济小幅漂移在策略对齐预期内) +- **补偿注入验证**:单局实测 st.mine_slips=5 触发(RUNSUM 无 mine_slips 字段——解析口径注记已写入 sim-data/README);注入形态=错触直挖、初值 0.10——**踩雷读数 6.48→5.40 偏差 -1.08/局**——偏差来源含策略对齐合成效应,非纯注入贡献;偏差已记本节与追认单 #5(白名单 5 授权自判) +- sim-data/README.md 现行锚指针已换代+改前锚迁历史锚节(随批合回) + +## 五、实机目检总清单(登记不阻塞——真人目检后销项) + +1. 结算期 B 区零逐行文字(FX 排播链仍逐拍演出) +2. 伤害飘字/弹道/站桩反馈在排播新形态下的观感 +3. 封印受理瞬间揭示的观感(地板+身份字形+法阵叠加——「太忙/太糊」判定归待办「封印格观感细化」条) +4. 封印格悬停禁字与图例新句 +5. 清图高光在封印完成清图时触发 + +## 六、遗留读数义务与遗留面 + +1. MC 新锚采集(后台)→R11 读数回填本报告+sim-data/README 指针换代+新锚 jsonl 携回主区(数据件不入 git——合并后手工拷贝) +2. mac golden 三件缺件(渲染闸 SKIP 不判红)——Mac 环境随批补采或留待含代码面合回的远端 CI +3. 独立验收审计(合并前必做——由未参与实现的子代理执行) + +## 七、实现决定记录 + +见 `reports/iter56-代拍板追认单-2026-11-08.md`(白名单 9 项+实现决定 11 条+目检登记 5 项)。 + +## 八、反哺点 + +见 `reports/iter56-反哺点-2026-11-08.md`(卡1 九条+过程发现三条;卡2 零条)。 + + +## 九、独立验收审计结论与审计后勘误 + +**审计结论:通过**(reports/iter56-验收审计-2026-11-08.md——17 行对照表全量核对,14 干净通过、2 记账级缺漏,无申报外削弱、无同义反复判据;复跑 3 件全绿)。 + +审计两项缺漏的闭环(审计后勘误笔,同批提交): +1. 卡1 R1 函数名:battle_log_zero_text_test.gd 断言体由 _init 内联拆出为 **_smoke_settle_zero_rows**(能力行 :137 点名函数——名实一致补齐;拆分后回归绿)。本报告 §三 R1 行「落地一致」记载在拆分前失实,本段勘误。 +2. 卡2 R6 尾缀载体:〔封印改 V6〕grep 载体缺失(golden 实测零漂移未重录、卡 F9 漏补载体豁免)——settlement_wiring_snapshot_test.gd 宿主 _init 补判据出处注记行(零行为改动,回归绿)。 +3. 观察项随手修:smoke/critical-paths.md 第 7 条「明细逐行呈现」残留旧口径改写;sim-data/README「历史锚」节标题重复去重;T4 提交说明「V5 三函数」实落 2 处(_smoke_seal_irreversible_quadrants 属改判组带 V2 尾缀,不在保留组——措辞勘误)。 \ No newline at end of file diff --git a/sim-data/README.md b/sim-data/README.md index 4569f08b..667a96a1 100644 --- a/sim-data/README.md +++ b/sim-data/README.md @@ -4,10 +4,15 @@ ## 现行锚(分析取数唯一入口) -- 锚:`runsum_m3iter9exit_81000_n400_20261003.jsonl`(N=400/档=普通 v3.4+perfect;种子 81000 起逐局独立;route=min;taken=hero_dmg+mine_dmg,口径对齐真人分析端) -- 读数:`读数_m3iter9exit81000_20261003.md`(k=0.60、完美战役全通 59.0%、结构位移存档) -- 换代义务:M-4 数值批投值时本锚随批作废,批内自取改前/改后锚 -- 代表性注记:0 格连锁算子补齐改变模拟玩家行为(推理面增强),perfect/adv 档通关率预期上调——本锚读数对现行代码代表性下降,带值结论须注明「旧行为基线」口径;重跑归一档(用户发起),发起时批内自取改前/改后锚 +- 锚:`runsum_iter56reanchor_81000_n50both_20261108.jsonl`(N=50/档=普通+perfect;种子 81000 起逐局独立;route=min;taken=hero_dmg+mine_dmg,口径对齐真人分析端) +- 规模口径:**50/档(2026-11-08 用户批准)**——95% CI 约 ±14pp(p≈0.5 处),结构级位移(≥25pp)可判;更细精度需下一次合法触发(如数值标定窗口)时由用户加采 +- 换代缘由:封印受理即揭示改版(迭代 56——挖封印格被拒/清图口径=挖开∪封印/sim 策略对齐)改变玩法行为,改前锚失效 +- 改前改后对照读数(迭代 56 R11——改前代码 2026-11-08 现跑 50 局 vs 新锚 50 局,同 seed0):normal 通关 0%→0%、踩雷均值 6.48→5.40、标中 21.34→19.60、标空 6.74→7.86、封印数 52.2→49.9;perfect 通关 0%→4%(封印计入清图的利好方向)、标中 45.96→48.28、封印数 91.1→96.1——无结构性恶化;错触直挖注入单局实测触发(st.mine_slips=5;RUNSUM 无此字段,解析口径注记) + +## 历史锚(只读不判) + +- `runsum_m3iter9exit_81000_n400_20261003.jsonl`(迭代 56 前任现行锚,N=400/档)——**其 perfect 通关 59% 系 2026-10-03 旧代码读数**:0 格连锁算子补齐等两月演进已使模拟行为漂移,改前代码 2026-11-08 现跑 50 局 perfect 通关 0%——带值引用须注明「旧行为基线」口径 +- 其余 23 份 `runsum_*.jsonl`,文件名=批+锚名+日期可辨。出度≤2 重建后旧锚结构已失义,仅留换代对照;处置挂中间产物死亡清单随批处理。 ## 历史锚(只读不判) From cedc2e0b5daab4d65d55933d1641d028dfdafd5d Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 03:47:33 +0800 Subject: [PATCH 10/16] =?UTF-8?q?iter56-=E6=94=B6=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- design/art/art-assets-checklist.md | 10 +- design/art/art-bible.md | 139 ++--- design/art/asset-path-map.md | 2 +- design/art/camp-scene-prompts.md | 3 +- design/engineering/process-conventions.md | 2 +- design/gdd/08-Alpha版本标准.md | 2 +- design/gdd/systems/表现与支撑/HUD框架.md | 8 +- design/gdd/术语表.md | 11 +- design/ux/battle.md | 174 +++++-- game/tests/README.md | 14 +- game/tests/golden/README.md | 8 +- reports/iter56-验收审计-2026-11-08.md | 89 ++++ .../需求卡片-二三关棋盘观感批-2026-10-16.md | 292 ----------- ...‚卡片-棋盘瓦片与立体表现重做批-2026-11-07.md | 484 ++++++++++++++++++ .../需求卡片-营地场景重排接线-2026-11-07.md | 271 +++++++--- roadmap.md | 3 +- sim-data/README.md | 3 +- tools/gate_platform.sh | 30 +- tools/hooks/pre-merge-commit | 4 +- 待办清单.md | 43 +- 21 files changed, 1065 insertions(+), 529 deletions(-) create mode 100644 reports/iter56-验收审计-2026-11-08.md delete mode 100644 reports/需求卡片-二三关棋盘观感批-2026-10-16.md create mode 100644 reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md diff --git a/AGENTS.md b/AGENTS.md index cd6a56a3..456dfc54 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ ## 运行与验证(工作目录 = 含 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 commit 续合,或 git merge --abort 放弃),快进合并不触发钩子,`--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-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` 自举 - 单件直跑(=改完即测的最窄确认,其读数就是那一步的凭据;跨改动面的漏网由合回后远端全量档兜):冒烟测试 `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`(奖励期望);关卡完成率/难度类测量一律走全冒险 - 数值验证:`python tools/balance_verifier.py`(采集端 `res://sim/verifier_batch.gd`,报告与原始数据落 `sim-data/`) diff --git a/design/art/art-assets-checklist.md b/design/art/art-assets-checklist.md index 589c39eb..a6a724f1 100644 --- a/design/art/art-assets-checklist.md +++ b/design/art/art-assets-checklist.md @@ -26,8 +26,8 @@ | 条款 | 对出图的具体要求 | |---|---| | 一句话视觉规则 | 明快的地牢,轻快的扫荡,仔细的推理——**明亮像素幻想,全年龄,非暗黑**,角色 2~3 头身 | -| 原则一「预告上格」 | 格内绘制优先级 **数字(含色牌)> 小人 > 封印印记 > 变异纹带 > 装饰变体 > 底色**;任何元素禁止遮挡数字字形区;类型微光为底效泛光层,不入遮挡栈 | -| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;数字亮墨直画已开格底(对比过 WCAG AA,art-bible §4.1);色牌为复杂格底后备;未开格底亮度地板与饱和上限同 §4.1(门值定值面=互辨抽测件) | +| 原则一「预告上格」 | 格内绘制优先级 **浮空数字与引导线(最顶)> 小人 > 封印印记 > 交互反馈 > 变异纹带 > 装饰变体 > 底色**;北侧贴花低于小人、南侧随岩体在前;任何元素禁止遮挡浮空数字与引导线;类型微光为底效泛光层,不入遮挡栈 | +| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;浮空数字暖白芯+2px 深墨描边(art-bible §3.2/§4.1);普通数字色牌退役(封印格身份字形色牌保留);未开格底亮度地板与饱和上限同 §4.1(门值定值面=互辨抽测件) | | 原则三「一砖一世界」 | 变体优先换色板不加新资产;危险状态必须**形状+颜色双通道**(色弱灰度可辨) | | 类型预读单通道(§4.6.3) | 未开格 = **类型常显微光**(五组色带 §4.2:芥末黄/黄绿/青/紫罗兰/绯红,色相+明度双码,避 300°–345° 禁入带,样张冻结);不呈现极性、不泄危险格与安全格(角嵌形状通道已不存在——微光格只留微光) | | 剪影哲学(§5.1) | **所有角色自带轮廓通道:亮色描边+落影底盘**,识别不依赖背景;四类原型见各条目 | @@ -43,7 +43,7 @@ ### 1.1 格子样张(砖面形态定稿闸)⚙ - **要什么**:一张按 art-bible §1.4 参数画成的格子风格试验图。**内容清单与验收四项以 art-bible §1.4 为唯一定义处**(含类型微光呈现组),本条只登记生产视角差异:图类型色板变体组至少两套、样张含至少一处砖缘/岛缘厚度与一格装饰立牌示例(§3.2 呈现基准)。 -- **风格/规格**:色板 token 直接取 ui_kit 常量组(语义岗清单见 art-bible §4.1:掩尘、裸土、数字墨三档、封印黑、危险红、奖励金、小人蓝、数字色牌)。 +- **风格/规格**:棋盘三关八色取 art-bible §4.1「三关棋盘环境八色」;语义岗 token 取 ui_kit 常量组(封印黑、危险红、奖励金、小人蓝;普通数字色牌退役,封印格身份字形色牌保留)。 - **验收**:art-bible §1.4 四项按序判定(数字可读性 WCAG ≥4.5:1 硬指标 → 格态三形与微光互辨灰度可辨 → 焦点预算 → 图类型换皮抽测)。**通过 = 砖面形态与色板冻结**。 - **来源**:⚙ 脚本管线自产——样张是验收闸本身,必须按圣经参数画,无复用意义。 - **现状**:验收标准已成文,**测试未跑**。 @@ -204,7 +204,7 @@ | 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 单套,不再接入) | | OGA Pixel UI 750(Kenney 作) / PixUI(CamTatz) / Handpainted stone | CC0 | 无 | ui-reuse 待审 | | DENZI public domain art | CC0 | 无 | 否决 | -| beast-cave(OGA) | CC0 | 无 | **已退役**(源包归档;地砖现行 = terrain_ 自产全套) | +| beast-cave(OGA) | CC0 | 无 | **已退役**(源包归档;地砖随 2026-11-07 棋盘地形重做退役——棋盘改程序化材质) | | JaggedStone / Screaming Brain / ExileGL / Corey Archer(OGA) | CC0 | 无 | 否决 | | Calciumtrice / Buch / bart cobblestone(OGA) | CC-BY 3.0 | **需署名** | 否决 | | LD rogue / Evert cave / poikilos underworld(OGA) | OGA-BY 3.0 | **需署名** | 否决 | @@ -212,7 +212,7 @@ | Fusion Pixel 缝合像素字体 | SIL OFL 1.1 | 保留许可证 | **已接入终稿**(全局 UI 字体;用户裁现状即终稿——单套单字重,拉丁沿用自带字形) | | DCSS dngn / Lost Garden / Cavernlock / Aftertile / Voirol / oga-zelda-like(armm1998) | CC0 | 无 | 评估否决(架构/风格不适配;zelda-like 留作干净度基准) | | Golden UI 系列 | CC-BY-SA | — | **闸④不过,未下载** | -| Gemini 生图(用户自跑) | 自产 | 无 | **terrain_ 高墙瓦片材质源(现行定稿)** | +| Gemini 生图(用户自跑) | 自产 | 无 | **已退役**(2026-11-07 棋盘地形重做;旧 terrain_ 瓦片全删) | ### 复用四闸(现行) 色板量化 / 禁入带吸色 / 灰度可辨 / 授权干净(SA 不可、来路不明不可)。 diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 0451f660..2e2ee732 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -1,10 +1,10 @@ # 美术圣经(Art Bible)— Dungeon Sweeper -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.48,历次修订明细见 git 提交史 +> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.51,历次修订明细见 git 提交史 > > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。 -> 参考池(用户审阅选定,三者相融):**Into the Breach**(网格信息分层;雷图棋盘呈现基准 = 其战棋地块质感 × 正俯视角,见 §3.2)× **Moonlighter**(明亮像素地牢质感)× **Peglin**(明快全年龄地牢色彩);参考截图存于 `design/art/references/`(三款 × 2 张,与点名池一一对应);Enter the Gungeon 不作参考,反面条款见 §9.2。 +> 参考池(用户审阅选定,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。 > 约束:本圣经是**纯表现层文档**——明亮轻快是美术风格,不是玩法成分。圣经禁止引入、暗示或预设任何玩法语义,不改变任何 GDD 已锁机制;凡表现层需要玩法钩子才能表达之处(如完美封印检测、Boss 预警),一律标注「待 GDD 定夺」,圣经只规定"若有,则如何呈现"。GDD 机制与圣经冲突时,机制语义以 GDD 为准,呈现方案以本圣经为准。 > **条款验收标注纪律(全文书写规范)**:条款尾部按三档标注验收方式——**`验收:机检〈判据>`**(可量化,脚本能断言)/**`验收:目检〈判据>`**(机器测不了,但看什么、怎么算有明确判据)/**`验收:方向性`**(气质与方向原则,不承担验收);推导源尾注「←」继续表达推导来源,与验收标注同句并存时,验收标注放句末;数值类条款推荐「**待定现用**」态(现行即执法、修订走登记,释义见 §4.1) @@ -22,7 +22,7 @@ **原则一|预告上格**(取自 Into the Breach;锚定 P1 推理的掌控感、P2 规划的延迟兑现) -继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格内绘制优先级固定:**数字(含色牌) > 小人标记 > 封印印记 > 变异纹带 > 装饰变体 > 底色**,任何元素禁止遮挡数字。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡数字〉 +继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格上绘制优先级固定:**浮空数字与引导线(最顶层,永不被遮挡) > 小人标记 > 封印印记/类型微光 > 交互反馈(悬停/路径/可挖域微光) > 变异纹带 > 装饰变体 > 岩体顶面/地面底色**,任何元素禁止遮挡浮空数字与引导线。屏幕层序按脚底行分档:顶面贴花与交互反馈随所属格件 z——北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;封印印记与封印格身份色牌固定低于小人(不参与南侧前推);信息优先级不变(北侧重叠时小人压过贴花)。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡浮空数字与引导线〉 *范围注:本原则约束"已存在的信息往哪里画",不新增信息种类;预告类信息以战斗侧 GDD 实际定义的为准(如 P2 已锁的结算来源标注),GDD 未定义的预告不因本条而存在。* @@ -30,38 +30,38 @@ **原则二|明亮为皮,明度分档为骨**(取自 Moonlighter、Peglin;锚定 P1 可读性前提、P4 探险氛围) -取 Moonlighter 的暖质地砖与亲和冒险者气质、Peglin 的明快全年龄洞穴色彩:全局暖倾向、无压抑。可读性由**格底明度分档**承载——已开格(数字所在格)明度走世界底层档(§2 明度分层;格态语义见《排雷玩法》;美术侧据此未开格走受光墙顶档、已开格走挖出空间沉暗档,与 §8.5 图底分离同轴),亮族数字墨直接画在格底上,直画对比 ≥4.5:1 恒成立。**数字色牌为后备手段**——仅复杂格底(物件纹样/变异纹带/微光叠加致格底对比不足)时垫牌后备(画法 §3.3、色值 §4.1)。格子本体美术放开:纹理、材质、装饰变体、类型纹样皆可入画;格底参数域见 §4.1 硬指标(分档明度域、饱和上限),仍避 Boss 禁入色相带。与参考之别:ITB 以半透明压暗板承载信息;本作格底功能分档(信息可读性服务)。验收:机检〈1–8 全档数字对所在已开格底对比 ≥4.5:1〉 +取 Moonlighter 的暖质地砖与亲和冒险者气质、Peglin 的明快全年龄洞穴色彩:全局暖倾向、无压抑。可读性由**岩顶/地面明度分档 + 浮空描边字**承载——已开格地面走世界底层档、未开格岩顶走世界中层(§2 明度分层;格态语义见《排雷玩法》;美术侧据此未开格走受光岩顶档、已开格走挖出空间沉暗档,与 §8.5 图底分离同轴);数字以浮空描边字画在格上方(字芯暖白 + 2px 深墨描边,§3.2/§4.1),不使用数字底牌。格子本体美术放开:纹理、材质、装饰变体、类型纹样皆可入画;岩顶/地面参数域见 §4.1 硬指标(分档明度域、饱和上限),仍避 Boss 禁入色相带。与参考之别:ITB 以半透明压暗板承载信息;本作岩顶/地面功能分档 + 浮空数字(信息可读性服务)。验收:机检〈四类底复合对比 ≥4.5(判据 §4.1)〉 -*设计测试:当格子美术与数字可读性冲突时,先调格底明度档,复杂格底垫色牌后备,不动格子画。* +*设计测试:当格子美术与数字可读性冲突时,先调岩顶/地面明度档,禁止使用数字底牌,不动浮空数字画法。* **原则三|一砖一世界**(融合 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 格子样张测试(验收标准) -> 立意:扫雷数字可读性与暗色氛围相冲突,由一次格子样张测试定风格,具体形态由样张测试定稿。**样张** = 一张按本圣经参数画成的格子风格试验图,是砖面形态的定稿闸——样张通过前,§3.2/§4.1 的一切参数只是候选,通过后冻结为制作标准。 +> 立意:扫雷数字可读性与暗色氛围相冲突,由一次格子样张测试定风格,具体形态由样张测试定稿。**样张** = 一张按本圣经参数画成的格子风格试验图,是棋盘地形形态(岩体+地面+浮空数字)的定稿闸——样张通过前,§3.2/§4.1 的一切参数只是候选,通过后冻结为制作标准。 -**样张内容清单**(一图齐备,缺项即无效):未开格(覆尘完整砖,含至少两种装饰变体)、已开格(碎裂裸露,含 0 格与 1–8 全档数字)、危险格(被惊动的巢穴)、封印印记、小人两态(独立占格 + 与数字同格——后者须验"边框高亮不覆盖文本")、图类型色板变体组(§4.3 四槽换色,至少两套)、数字呈现组(已开格底亮墨直画组 + 复杂格底色牌后备组——素底/装饰变体底/变异纹带底至少三种格底上各一组数字)、已开格结果表达组(纯安全格 + 至少两类型物件纹样)、**类型微光呈现组**(至少三个类型的微光在纯砖格上呈现——样张为静态定格测试图,非运行时行为承诺,实际可见时机见《HUD框架》「未开格类型微光」节;含两两相邻格微光并列;微光格内零角嵌/箭头/加号类附加图形)。验收:目检〈样张图含清单全部组项〉 +**样张内容清单**(一图齐备,缺项即无效):未开格(合并岩体:岩顶大板+南/东崖面,含至少两种装饰变体)、已开格(连续地面,含 0 格与 1–8 全档浮空数字)、危险格(地面上的巢穴纹)、封印印记(画在已揭示地面+受光棱封印石上)、小人两态(独立占格 + 与数字同格——后者须验"数字与引导线完整可见")、图类型色板变体组(§4.3 四槽换色,至少两套)、数字呈现组(浮空数字+引导线:地面格/岩顶格/顶行越出棋盘三种背景各一组,含 1–8 全档)、已开格结果表达组(纯安全格 + 至少两类型物件纹样)、**遮挡组**(小人站在南邻岩体的北侧,脚底被岩体自然遮住;小人与数字同格时数字仍完整可见)、**类型微光呈现组**(至少三个类型的微光在纯岩顶格上呈现——样张为静态定格测试图,非运行时行为承诺,实际可见时机见《HUD框架》「未开格类型微光」节;含两两相邻格微光并列;微光格内零角嵌/箭头/加号类附加图形)。验收:目检〈样张图含清单全部组项〉 **验收项按序判定,第一项不过 = 整张否决(数字可读性定风格,风格服从可读)**: -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 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉 -3. **焦点预算成立(§3.4)**:任意一格至多一个完整凸形;数字所在格无第二焦点。验收:目检〈任一格至多一个完整凸形,数字所在格无第二焦点〉 -4. **图类型换皮抽测(§4.3)**:变体组中数字墨亮族三档、封印黑、危险红、奖励金、小人蓝、数字色牌(后备件)、类型微光五组恒定不动;变体格底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体格底仍过第 1、2 项〉 +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〉 +2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;合并岩体不改变三态分类——未开 = 抬升岩体,已开 = 连续地面,雷 = 地面上的巢穴纹;明度差(岩顶亮/地面暗)与巢穴形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下封印印记、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入浮空数字占位区,明度梯度禁止压破岩顶/地面明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉 +3. **焦点预算成立(§3.4)**:任意一格至多一个信息完整凸形(浮空数字/小人/封印印记);岩体为连续地形,不作单格凸形计;数字所在格无第二信息焦点。验收:目检〈任一格至多一个信息完整凸形,数字所在格无第二焦点〉 +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:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉 +**整屏样张闸**:格子样张验"格",整屏样张验"屏"——战斗屏/关卡屏/菜单屏/营地屏各出一张整屏样张,验收四项:①全部文字(含菜单/说明/tooltip/按钮)对其直接背景 ≥4.5:1(WCAG AA),大字(≥18px 或加粗档)底线 3:1、目标 4.5:1;②明度分层三档带成立(信息面层 > 世界中层 > 世界底层,层间灰度可分);③整屏焦点预算(§3.4:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。**浮空数字为描边字,按 §1.4 第一验收项的复合对比判据,不套本条文字直画 4.5:1 口径。** 验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉 **战斗一屏样张**:整屏样张闸已过——整屏四项机检全绿,方向稿目检已通过(用户实机目检核销,沿革查 git 提交史) -**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 亮墨三档直画 + 色牌后备(值见 §4.1);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉 +**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 浮空描边字(暖白字芯 + 2px 深墨描边 + 双色引导线,值见 §4.1/§3.2);普通数字色牌退役(封印格身份字形色牌保留,见 §3.2 封印印记条);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉 --- @@ -159,29 +159,31 @@ ### 3.2 环境几何 -- **雷图棋盘呈现基准**:战棋地块质感 × 正俯视角——取 ITB 参考图(`references/itb_1.jpg`)的地表质感骨架:地块纹理多样、起伏体块感、岛缘/砖缘厚度、格上装饰小立牌;但相机一律正上方垂直向下,格线屏轴对齐,**禁等距/斜视角与菱形格**;形状语言仍守总纲圆角方形。砖缘厚度与岛缘立体面属形体塑造(顶面格底仍守 §4.1 参数域)。装饰小立牌属 ITB 参考的观感元素,本作不采用;装饰变体走氛围层纪律(纹理级/物件级形状家族,见下方装饰变体条),零信息纪律以原则三为准。验收:目检〈棋盘正俯视、格线屏轴对齐、无菱形格〉 ←原二;原三;§2 -- **地砖**:一切环境体由同一圆角方形衍生:未开 = 完整凸砖,已开 = 同形缺角碎裂,雷 = 碎裂加巢穴纹(危险格玩家说法见《排雷玩法》);只以"完整度"叙事,不为状态新造形。验收:目检〈三格态仅以完整度区分,无新造状态形〉 ←原三;P4 -- **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三 -- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且砖心留白;巢穴纹更凶一档〉 ←原三;P3 -- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §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 数字 > 印记)垫色牌叠于法阵之上,印记与数字同格合法。格内栈位见 §1.2;层序纪律——印记层低于小人,且迷雾态(区外全黑/记忆态)隐藏(§6.5「封印随格隐没」)。封印特效两件:常显形态即本件,施印瞬间未实装。战末金蜡封徽记仍取贴图 `seal_mark.png`(与棋盘侧参数化绘制并存,两处互不依赖)。验收:目检〈环径占格宽 82%±1px;光圈只在环外且不出格;纯黑无色相〉 ←原一;P2 -- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边〉 ←§2.1;§4.2;P1 -- **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈墙体无尖刺装饰〉 ←原三 -- **高墙瓦片体系|术语与定义**:未挖格 = **一整块 32×32 自含凸起岩体**;素材语义名——未开格素材 = **墙瓦片**,已开格素材 = **地面瓦片**。瓦片以自含岩体为单位,Tiny Dungeon 拼块套不进自含岩体定义,不作瓦片参考。验收:目检〈未开格为整块凸起岩体,无拼块接缝感〉 ←原三 -- **高墙瓦片体系|边界墨线纪律**:墙瓦片与相邻格分界一律 1px 深墨线、直线贴格边、零锯齿;墨线职责 = 分隔,不追求与地面融合。验收:目检〈分界为 1px 深墨直线贴格边、零锯齿〉 -- **高墙瓦片体系|光照纪律(单一北受光)**:北缘 = 墨线内侧 1px 微亮棱(就地取色提亮,禁宽亮带);西/东缘 = 墨线后直进纹理、不加修饰;南缘 = 墨线 + 立面窄暗条(约 1/3 格高,横层理叠石、禁竖条纹栅栏感)。验收:目检〈北缘亮棱、南缘窄暗条;无宽亮带、无竖条纹栅栏感〉 -- **高墙瓦片体系|凹角收头**:角点单像素落线;南立面侧凹角加 1px 立面收头——带身与转角竖线同列收尾,禁悬空、禁突出。验收:目检〈凹角收头与转角竖线同列,无悬空突出〉 -- **高墙瓦片体系|现行定稿**:`game/assets/art/board/terrain_*`(16 唯一墙瓦片 + 5 地面瓦片变体;词表与查表逻辑落码于 `board_world.gd`)。验收:机检〈terrain_* 素材 16 墙瓦片 + 5 地面变体在库,查表逻辑与词表一致〉 -- **高墙瓦片体系|高墙感 D 投影档与整板悬崖**:南临空墙格 = 立面口沿高光 2px `#C9AF83`(201,175,131——代码色 `BRICK`,与掩尘枚同源单点) + 双段暗带(0.16/0.25 格边,黑罩 α0.60/0.82);北邻墙地面格 = 三段渐隐投影(顶带 0.22 格边,α0.28 起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 列分隔竖缝 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影(游戏 `board_world.gd` 同款结构件,样张脚本与游戏渲染常量同源)。验收:目检〈南临空墙格呈口沿高光+双段暗带;北邻墙地面格呈三段渐隐投影;整板悬崖结构件齐备〉 -- **变异格形状通道**(双通道之"形",与色无关):底砖圆角外轮廓不变,砖面内缘绘一圈定宽专属几何纹带(纹带形全作不与他类共用),砖心留白予数字与封印印记;验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入数字字形占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于数字/小人/封印印记);原三 +- **雷图棋盘呈现基准**:战棋地块质感 × 正俯视角——取 ITB 参考图(`references/itb_1.jpg`)的地表质感骨架:地块纹理多样、起伏体块感、岛缘/砖缘厚度;但相机一律正上方垂直向下,格线屏轴对齐,**禁等距/斜视角与菱形格**;形状语言仍守总纲圆角方形。**立体表现取抬升合并岩体+南/东崖面**(2026-11-07 用户裁,采 Link's Awakening 原版/DX 2D 的台面抬升与崖面观感,2019 重制 3D 立体模型版不作参考);砖缘厚度与岛缘立体面属形体塑造(岩顶/地面仍守 §4.1 参数域)。装饰小立牌属 ITB 参考的观感元素,本作不采用;装饰变体走氛围层纪律(纹理级/物件级形状家族,见下方装饰变体条),零信息纪律以原则三为准。验收:目检〈棋盘正俯视、格线屏轴对齐、无菱形格;未开格呈抬升合并岩体+南/东崖面〉 ←原二;原三;§2 +- **地形**:一切环境体由同一圆角方形衍生:未开 = 抬升岩体(完整),已开 = 连续地面(挖出空间),雷 = 地面上的巢穴纹(危险格玩家说法见《排雷玩法》);只以“完整/挖开”叙事,不为状态新造形。验收:目检〈三格态仅以完整/挖开与巢穴纹区分,无新造状态形〉 ←原三;P4 +- **装饰变体(未开格氛围层)**:抬升岩体的顶面之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三 +- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于格面边缘,格心留白(数字已迁浮空层,格面纹样不再需要给字形让位;封印格身份字形走色牌例外,见封印印记条,仍禁止升到浮空层);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且格心留白;巢穴纹更凶一档〉 ←原三;P3 +- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。微光画在抬升后的岩顶面内,锚点随岩顶偏移(−ESHIFT/−LIFT),禁止越出本格岩顶。验收:目检〈微光格内零角嵌/箭头/加号类附加形;微光不越本格岩顶〉 ←原一;原三 +- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../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 +- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间/地面)一侧、不进岩体(岩体抬升不改变接触带的逻辑格边;光画在地面侧,不贴岩顶;与装饰变体零冲突);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边;光不进岩体〉 ←§2.1;§4.2;P1 +- **岩体**:圆角岩体堆叠/合并,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈岩体无尖刺装饰〉 ←原三 +- **棋盘地形体系|术语与定义**:未开格 = **抬升岩体**——连通的未开格(四邻:上下左右;斜角不连)合并为一块岩体,共享一块岩顶与连续崖面;已开格 = **连续地面**。素材语义名——岩顶材质 = **大岩板**,南/东崖面材质 = **崖面**,已开地面 = **地面**;**不做逐格自含瓦片**,Tiny Dungeon 拼块套与逐格 16+5 墙/地瓦片套均退役(2026-11-07 用户裁)。验收:目检〈连通未开格共享一块岩顶与连续崖面,无逐格拼缝〉 ←原三 +- **棋盘地形体系|投影与搭接**:整块岩顶向北偏西抬升——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;崖面不越格〉 +- **棋盘地形体系|受光与崖面**:光照 = **北/西受光**(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 深墨。验收:目检〈北/西亮棱、南/东内阴影与崖面层理;南崖不越下一行、东崖不越下一列;无竖条纹〉 +- **棋盘地形体系|材质与装饰**:岩顶 = **大岩板**(低频率斑驳 + 稀疏大板块缝 + 板缘浮雕倒角,单块材质覆盖整块岩体;禁逐格小砖纹与逐格边框);地面 = 连续暖褐土(低对比石屑、碎石斑;无缝,禁逐格砖缝);装饰变体 = 岩顶材质内的低对比裂纹/麻点/碎石贴花,走原则三零信息纪律,不新增逐格资产。验收:目检〈岩顶为单块大岩板、无逐格拼缝;地面连续无缝;装饰不构成逻辑线索〉 +- **棋盘地形体系|投影与整板悬崖**:南/东临空岩体在地面投 4 段 ×4px 渐隐影(黑 α 0.44/0.30/0.16/0.07,自崖面外缘起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影,色取棋盘环境子板(§4.1)。验收:目检〈南/东投影四段渐隐;整板悬崖结构件齐备〉 +- **棋盘地形体系|绘制序与遮挡**:层序 = 地面(封印格地面铺本关受光棱色封印石)→ 投影 → 数字所属格的**地面阴影圆**(开启格地面,位于小人之下,小人站该格时遮住圆)→ **按脚底 y 排序的深度对象**(岩体 = 其最南格格底;小人 = 所在格格底;升序绘制,南侧岩体自然遮住小人脚底)→ 顶面贴花(类型微光/变异纹带,随岩顶锚点偏移 −ESHIFT/−LIFT;只在未开格岩顶)与交互反馈(悬停/路径/可挖域微光)随所属格件同序——北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;封印印记与封印格身份色牌在已揭示地面、固定低于小人(不参与南侧前推)→ **浮空数字+引导线(最顶)**。验收:机检〈深度对象按脚底升序绘制;格件贴花/交互随脚底行分档;浮空层 z 最高〉+目检〈南侧岩体遮住小人脚底;顶行数字越出棋盘仍完整〉 +- **棋盘地形体系|浮空数字(信息层)**:数字与格面字形(危/?)脱离格面,浮在格上方——**封印格除外**,其身份字形按封印印记条垫色牌叠于法阵之上、不进浮空层;字高 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〉+目检〈顶行数字与引导线完整;阴影圆指向正确格〉 +- **棋盘地形体系|旧资产处理**:旧 `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) -**方向指导**:半拟物——容器穿戏服、数据素面;圆角 = 可触摸的物件,直角 = 须精确的信息(总纲「圆角为世,直线为信」的 UI 侧落法)。画法细则(面板/按钮/蜡封/数字色牌/参考分界)成文于 **§7.1**。验收:方向性 ←原二;§2.4 +**方向指导**:半拟物——容器穿戏服、数据素面;圆角 = 可触摸的物件,直角 = 须精确的信息(总纲「圆角为世,直线为信」的 UI 侧落法)。画法细则(面板/按钮/蜡封/参考分界)成文于 **§7.1**。验收:方向性 ←原二;§2.4 ### 3.4 主角形状与对比预算 -显著度 = 完整度:**每格至多一个"完整凸形"**(数字/小人/封印印记,依 1.2 优先级让位;装饰变体贴砖缘分布、不构成第二完整凸形——§4.6;数字色牌随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算),底砖与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3 +显著度 = 完整度:**每格至多一个信息完整凸形**(浮空数字/小人/封印印记,依 1.2 优先级让位)。岩体为连续地形,不作单格凸形计;装饰变体贴岩顶分布、不构成第二完整凸形(§4.6);浮空数字的引导线与阴影圆随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算。岩体与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个信息完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3 --- @@ -193,17 +195,24 @@ ### 4.1 主色板 -- **掩尘 `#C9AF83`**|未开格底色,覆尘完整砖:全作的"未知",画面最大沉默面。验收:机检〈未开格底色 = #C9AF83〉 ←原二;§2.1 -- **裸土 `#B39A78`**|已开格底色,碎裂裸露:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格墙体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(更高明度底实测达不到 4.5:1,故取本带;样张已冻结,§1.4)。验收:机检〈已开格底 L 落在 0.08–0.14,对亮墨数字 ≥4.5:1〉 ←原三 -- **数字墨双色制**: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 渲染帧目视复核〉 -- **垫牌与 UI 数据墨 = 深墨族 `#33261B` 系**(L≤0.027,§7.2)。验收:机检〈垫牌与 UI 数据墨取深墨族,L≤0.027〉 +- **掩尘 `#9C8462`**|未开格**岩体顶面基色**(覆尘完整岩体):全作的"未知",画面最大沉默面;原 `#C9AF83` 收缩为受光棱/口沿高光专用(代码 `BRICK` 保留为高光锚色,不再作未开格基色)。验收:机检〈未开格岩顶基色 = #9C8462;#C9AF83 只作受光棱/口沿高光〉 ←原二;§2.1 +- **裸土 `#695038`**|已开格**连续地面基色**:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格岩体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(样张实测 L≈0.09)。验收:机检〈已开格地面基色 = #695038,L 落 0.08–0.14〉 ←原三 +- **棋盘环境子板(分层②,不占 48 token 额度)**|现行基座档八色:岩顶 `#9C8462`、地面 `#695038`、崖面 `#403325`、板块缝 `#64523A`、倒角亮 `#CCB288`、倒角暗 `#766248`、临空墨线 `#261E15`、受光棱 `#C9AF83`;单张像素域 ≤32,三关按 §4.3 换色不新增 token。验收:机检〈八色在册、单张像素域 ≤32〉 + + **三关棋盘环境八色(2026-11-07 用户看样张通过,冻结)**:槽位顺序 = 岩顶/地面/崖面/板块缝/倒角亮/倒角暗/临空墨线/受光棱。 + - 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° 禁入带与全部微光色带;裸土底(`#B39A78`,印记现行承载面——封印格已揭示,见 §3.2 封印印记条)明度对纯黑对比 ≈7.8:1、未开格墙顶明度 ≈113 对纯黑对比 ≥4.4:1,纯黑实心剪影单靠明度差即成立,不依赖任何浅色细件。封印紫不再用于棋盘(色史归 git 提交史);红族棋盘侧只剩危险红;主角随身背包件为朱红矩形件(人设侧见 character-design),与棋盘封印色脱钩。验收:机检〈封印宣告色 = #000000,裸土底对其对比 ≥4.5:1〉 ←原一;P2 +- **封印黑 `#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 - **危险红 `#A8321F`**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉。验收:机检〈危险语义色 = #A8321F〉 ←原三;P2 - **奖励金 `#F0A828`**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金。验收:机检〈收益语义色 = #F0A828〉 ←P2;§2.3/2.4 - **小人蓝 `#2E86DE`**|小人主色:棋盘唯一"己方",与光标准线同族。验收:机检〈己方语义色 = #2E86DE〉 ←P1;§2.1 -- **数字色牌 `#F5EAD3`**|数字底具,**后备手段**:素色暖纸白直角小牌,仅复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)垫于数字正下方;素面无纹理、不随图类型/装饰变体变。验收:机检〈色牌 L≥0.70,仅复杂格底垫用〉 ←原二 +- **数字色牌 `#F5EAD3`**|**普通数字棋盘侧退役**(2026-11-07 浮空数字定案;普通数字不再使用底牌);**封印格身份字形色牌保留**(`UiKit.DIGIT_PLATE`+`DIGIT_PLATE_EDGE`,叠于法阵之上,见 §3.2 封印印记条,2026-11-07 封印改版定案)。token 若被 UI 其他面复用按 UI 侧登记,不属棋盘数字呈现;棋盘普通数字绘制路径零色牌调用,封印格色牌为唯一例外。验收:机检〈普通数字绘制路径零色牌调用;封印格色牌在位〉 ←原二 - **收益金亮档 `#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〉 - **图标槽柔和档 `#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〉 @@ -215,7 +224,7 @@ - **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#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`)。程序化回退绘制与已落合并值的贴图保持一致。验收:机检〈①②两枚源常量全仓零引用,绘制点全部改指合并目标色〉 -**对比硬指标(可测)**:数字可读性由**格底明度分档**承载——棋盘数字亮墨 **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)。未开格底槽(含全部图类型)与类型微光、已开格底之间存在**相对亮度与相对饱和关系**——禁止底槽吞没微光环、禁止底槽与已开格底同档;本节只定这层关系,阈值与准入判定由图类型色板互辨抽测的执行件承载(用法登记见 [art-pipeline-tools](art-pipeline-tools.md))。已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),封印印记、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底对微光环与对已开格底的相对亮度关系经互辨抽测准入;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9 +**对比硬指标(可测)**:数字可读性由**浮空描边字**承载——棋盘数字字芯暖白 `#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 **色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限 **48 色**(防色板无限膨胀的封口条款;**额度已用尽、余量 0**,后续余量以色板检查器实报为准);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部 <8/255**——即三通道里至少一通道 ≥8/255 即过门,「三通道差全部 <8」才算不过门(条文原写的「三通道差 ≥8/255」有「逐通道全过」与「禁止全灭」两种互斥读法,前者下现行色板 247 对不达标、与本节自认的「现行即执法」合规状态不能同真,故取后者;用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。反例实证:#3A2E22 ↔ #362B20 三通道差均 <5,肉眼不可辨,同板共存只增噪。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(色板检查器按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数 ≤48;新色入板过两道门〉 @@ -235,8 +244,8 @@ - **紫赤只说 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° 禁入带)。验收:机检〈类型微光五组色值与本表一致〉 -- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压格底明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉 -- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破格底明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破格底明度档与三态分类〉 ←§4.6.3 +- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压岩顶/地面明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉 +- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破岩顶/地面明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破岩顶/地面明度档与三态分类〉 ←§4.6.3 - **金/红兼作极性色相槽(§4.6)**:极性(概念定义与符号矩阵见《地图战斗资源》极性提案)的视觉取色只在这两族间——有利兑付 = 金族,有害兑付 = 红族,不新增语义色。验收:目检〈极性视觉取色仅金/红两族〉 ←§4.6;原二 ### 4.3 图类型色板换皮规则(board_type) @@ -248,7 +257,7 @@ - `wall_ambient` 墙雾氛围 tint:可带主题色相,L≥0.30。验收:机检〈wall_ambient tint L≥0.30〉 - `variant_tint` 变异纹带染槽:只改色相不改纹形(纹带形按轴两分,见 §3.2 变异格形状通道;种类 = 地形变异六类型已定稿)。验收:目检〈同纹带形跨图类型仅色相不同〉 -**不变槽**:棋盘数字墨亮族三档、数字色牌(后备件)、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,格底两档明度关系(墙亮/空间暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9 +**不变槽**:棋盘浮空数字字芯/描边、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,岩顶/地面两档明度关系(岩顶亮/地面暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9 ### 4.4 UI 色板(方向指导,细则迁 §7.2) @@ -260,7 +269,7 @@ 1. 已开 vs 未开:§3.2 完整/碎裂形承载,无需另加。验收:目检〈色弱模拟下两态以完整度可辨〉 2. 已开 vs 变异格:纹带形状通道,灰度截图可辨,无需另加。验收:目检〈灰度截图下变异格可辨〉 -3. 封印印记 vs 巢穴(危险格):印记形物件对砖面巢穴纹,无需另加。验收:目检〈色弱模拟下印记与巢穴纹可辨〉 +3. 封印印记 vs 巢穴(危险格):印记形物件对格面巢穴纹,无需另加。验收:目检〈色弱模拟下印记与巢穴纹可辨〉 4. 奖励金 vs 危险红(色弱下皆偏褐):§3.1 道具点两类剪影 + §3.4 满圆对刺缺 + 金粒运动,无需另加。验收:目检〈色弱模拟下奖励金与危险红可辨〉 5. Boss 紫赤 vs 其他敌:§5.1 形状独占,无需另加。验收:目检〈色弱模拟下 Boss 可辨〉 6. 小人蓝 vs 青墨数字:明度悬殊 + 小人轮廓与底盘,无需另加。验收:目检〈色弱模拟下小人与数字可辨〉 @@ -403,10 +412,10 @@ ### 6.3 三关图类型色板候选(board_type 换挡方向) -- **模板与不变槽**:换皮只换 §4.3 四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`),信息与语义层全图类型恒定——本节的三关两槽终值**已冻结**。**冻结口径(本节不抄色值字面量)**:各关 `tile_closed` 终值=该关在役墙瓦片三块底型件(素砖/裂纹/碎石斑)顶面受光档的实测最亮值,`wall_ambient` 取同关同槽值(两槽同值;同属 §4.1 分层②场景环境子板,零新增色值、不占 48 额度);实测值与准入判定只在执行件里算,执行件用法登记见 [art-pipeline-tools](art-pipeline-tools.md)。**冻结凭据**=「三关色相 × 五组类型微光」互辨抽测闭合(机检 17 项 0 红+目检四条全过;抽测样图与 2026-11-05 出图件同哈希,目检面未重跑)+ §1.4 格子样张重跑机检 30/31 绿(唯一红灯=改前/改后对拍一件,因在途素材区无改前基线件、属素材区环境坑不属色板回归,沿革查 git 提交史)——砖面形态与色板维持冻结。验收:机检〈三关行两槽终值与互辨抽测执行件的实测读数同值(该件三行铺底代表值判定全过),且本节三关行不含色值字面量〉 +- **模板与不变槽**:换皮只换 §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 提交史)。验收:机检〈三关行两槽终值与互辨抽测执行件的实测读数同值(该件三行铺底代表值判定全过),且本节三关行不含色值字面量〉 - **三关背景变体**:§6.1 的三张背景取本节三关方向作为岩体形态、剪影语言与色族差异(dungeon 暖石棕+地精巢穴支洞/木栈道/木桩围栏;underdark 冷蓝灰+卓尔巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;deep_underdark 灰黑+灰矮人石笋城郭/棱角石厅/矿道口/烟囱塔);背景不复用 `wall_ambient` tint(该槽作用于棋盘/世界),背景色值归战斗屏场景环境子板。验收:目检〈三关背景可辨为不同洞窟,非同一图换色〉 - **深度轴叙事**(§2.7 下探过渡):色相层进预告「更深更险」,明度档不动—— - - **dungeon 地精洞窟**(第一关):现行掩尘系暖石棕(`#C9AF83` 基)即基准档,`wall_ambient` 暖棕; + - **dungeon 地精洞窟**(第一关):现行岩体系暖石棕(岩顶 `#9C8462` 基)即基准档,`wall_ambient` 暖棕; - **underdark 幽暗地域**(第二关;方向:**冷调幽暗**):主调**灰白蓝**候选(低饱和蓝灰域,`tile_closed`),少量紫黑倾向点缀——紫系取紫罗兰域(≈256°)候选,禁入带 300°–345° 不变;`wall_ambient` 冷蓝灰; - **deep_underdark 灰矮人矿城**(第三关;方向:**灰黑主调 + 矿脉金属色点缀**候选,守 §4.1 明度地板 L≥0.30):矿脉点缀走金属质感族(冷银/铜灰候选)——「金属色」以材质感承载,奖励金亮金仍禁上格底(§4.2),不占用收益语义金;`wall_ambient` 铁灰。 - **共同纪律**:三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险);避 300°–345° 禁入带;L≥0.30、饱和 ≤0.55(§4.1 硬指标)。 @@ -422,9 +431,9 @@ - **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ 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 -- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地板纹理原样 + 灰罩压顶**——纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动(原「程序化素色记忆板平涂」已弃用);格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。**封印印记不在记忆态面**:印记只落在未开格,区外未开格全黑——印记随格隐没、灯光区移回复显(纯呈现,封印数据零影响,现行事实源的显式推论)。←HUD框架 可访问性基线;§4.1;§3.2 -- **记忆态可读性判据**:数字对合成底**归一后(真实渲染面)三关 ≥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 +- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地面材质原样 + 灰罩压顶**——地面直画后 `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 +- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与棋盘地形体系(§3.2)的整格表达、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2 - **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加规则 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉 --- @@ -435,7 +444,7 @@ ### 7.1 形状语法细则(自 §3.3 迁入) -**半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**数字色牌 = 直角小素牌**(后备件)——宽随数字位、无纹理无装饰,仅复杂格底兜底时垫于数字正下方一层(色值 §4.1),属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。验收:目检〈面板圆角/按钮凸圆角/数据直角三态可辨〉 +**半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**棋盘数字已改浮空描边字(§3.2),UI 不再有数字色牌形态**;其余数据件属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。验收:目检〈面板圆角/按钮凸圆角/数据直角三态可辨〉 - **极性强调冗余**(§4.5⑦):UI 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认禁止同位(位置通道)。验收:目检〈红/金强调位有图标+文案,破坏性确认独立位〉 - **圆角率单点注记**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT = 5`(ui_kit 单点;面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持 0 直角;**例外三件保留**=标题屏底座椭圆 17/结算金印 200(圆形蜡封)/状态脉冲环 100(圆形)。验收:机检〈ui_kit 圆角取值仅 RADIUS_OBJECT 与例外三件〉 @@ -461,9 +470,9 @@ ### 7.4 字体与字号 - **字体**:全局一套像素字,单套即终稿——缝合像素字体 Fusion Pixel(OFL,已接入 `game/assets/fonts/ui_font_fusion_pixel_zh_hans.ttf`),拉丁字符与数字沿用其自带拉丁字形,不另设拉丁专件(现状即终稿;旧拉丁候选 Kenney Fonts 已弃;生产工单=清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。验收:机检〈主题字体指向 Fusion Pixel 件〉 -- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(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;静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式 `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,且②在册面不含该两位〉 +- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座):棋盘浮空数字字高 **21px 固定**(7px 像素字 ×3,不随格边缩放;见 §3.2 浮空数字)、**正文/明细 ≥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_*〉 +- **小字号豁免条款(合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤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,且②在册面不含该两位〉 - **字重纪律(字重两档不启用)**:层级手段为两件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅**;全局单字重,不上第二个字重(**重开钩子已注销**——整屏样张复核确认:屏内各级文字全部能归进本节六档字号,顺位徽标与站桩名字行两处按本节纪律提档即可,屏内实测对比全部达标(暖白对舞台底 9.49:1、GOLD_BRIGHT 6.47:1、血数 14.3:1),**未实证标题层级不足**,维持单字重,不另立条目);数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。验收:机检〈主题仅注册单字重〉/目检〈屏内标题与正文层级仅靠字号档差与墨色深浅两件即可分辨,无一处需要第二字重才读得清〉 ### 7.5 营地界面 @@ -510,12 +519,12 @@ ### 8.1 分辨率档位与格边长 - **两档定案**:1280×800(基座)+ 1920×1080,窗口不可调;后续调整走修订。验收:机检〈工程分辨率配置与两档一致〉 -- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**瓦片整格铺满**(32×32 源随格边长缩放,允许非整数倍——瓦片不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈瓦片显示尺寸随格边长、小人占位 ≤0.75×〉 +- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**棋盘地形不铺逐格瓦片**(岩顶/地面/崖面材质按整板矩形与格边程序化绘制,允许连续缩放——地形材质不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈地形材质随格边/整板绘制、小人占位 ≤0.75×〉 ### 8.2 像素基准与画布 - **缩放纪律(硬规则,按资产两类分级;不做个案豁免)**: - - **甲类·文本与语义件**(数字、图标、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。封印印记不属本类(参数化绘制件,见本条末「封印印记参数表」)。砖面 tile 亦不属本类,随格边长整格铺满(见 §8.1)。验收:机检〈甲类件显示尺寸为源整数倍〉 + - **甲类·文本与语义件**(数字、图标、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。封印印记不属本类(参数化绘制件,见本条末「封印印记参数表」)。棋盘地形材质亦不属本类,按整板连续绘制(见 §8.1)。验收:机检〈甲类件显示尺寸为源整数倍〉 - **全局纹理过滤与平滑渐变件例外**:`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,归甲类整数倍纪律)。验收:机检〈显示档与登记表一致〉 - **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉 @@ -523,10 +532,10 @@ - **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× 基准,暂定;与站姿降采样可读性验证一致); - - **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../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;圆心 = 格心。色 = 封印黑单色(光圈只改 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、光圈不越格边〉 + - **棋盘小人 = 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,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销; + - **封印印记参数表(绘制件,非贴图件)**:形与画法见 §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、圆心落格心、光圈不越格边〉 - **站桩立绘显示档 = 三档绝对高**:小型 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 级:食人魔酋长/蛛化卓尔/灰矮人石君王)**允许向上溢出盒顶 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〉 ### 8.3 导出格式与命名规范 @@ -547,14 +556,14 @@ - **结构件完整性**:格面立体感(高墙顶面/坡缘/角件/周界轮廓)只能来自**素材本体绘制的结构件拼装**(样例=Necesse 式缘件:专属底色+手绘细节+暗轮廓线的独立贴图);禁止以调色、渐变、明暗滤镜、跨格投影等生成手段伪造素材中不存在的结构。样稿暴露缺件时,正确动作=停下报告缺口与「换素材/自产缺件」选项,由用户裁决后执行。验收:目检〈立体感逐件来自素材本体,无滤镜伪造〉 - **参考核验**:宣称「参考 X 游戏」前,必须取得并实际查看 X 的截图证据(像素级放大核验其实现方式),证据存 `artwork/mockups/` 或 `design/art/references/`;仅凭文字资料、记忆或宏观印象作出「X 是这样做」的断言无效。验收:目检〈参考结论有截图证据在库〉 -- **图底分离**:已开地面的明度须低于未开格墙体,由素材选型承载(选更暗的地板砖),不靠渲染压暗实现。验收:机检〈已开格底明度低于墙顶面〉 +- **图底分离**:已开地面的明度须低于未开格岩体,由材质选型承载(地面基色 `#695038` 低于岩顶 `#9C8462`),不靠渲染压暗实现。验收:机检〈已开地面明度低于岩顶面〉 - **生产分工**:格面地形类素材=**材质归模型、结构归程序**——AI 生图模型只出无缝填充纹理(无边框/无亮边/均匀光照/方形);一切结构件(缘件/轮廓/立面/角件/收头)一律程序化绘制或手修,因为 autotile 任意拼接的边界像素约束超出 2D 生图模型能力(实证:生图 5×5 瓦片表每枚砖自带啃咬边框与宽亮带,提示词无法根除)。**镜像规则**:东西对称结构件只许水平翻转(flip_h)复用、**禁旋转**——北受光下东西侧缘光照对称,镜像无损真;旋转会把北受光转到东边。验收:目检〈瓦片表无自带边框/亮带;对称件仅 flip_h〉 --- ## 9. 参考与反参考(References & Anti-References) -> **白话**:正面参考 = 向谁抄什么;反面参考 = 避什么。两者同等效力——方案违反反面条款时,禁止以「参考了某游戏」辩护。参考图库存于 `design/art/references/`(点名池三款×2 张,与头注点名池一一对应)。 +> **白话**:正面参考 = 向谁抄什么;反面参考 = 避什么。两者同等效力——方案违反反面条款时,禁止以「参考了某游戏」辩护。参考图库存于 `design/art/references/`(原三款×2 张在库;2026-11-07 新增参考图证待补,不阻塞画法条款)。 ### 9.1 正面参考(点名池,用户审阅选定) @@ -563,6 +572,10 @@ | **Into the Breach** | 格内信息分层、攻击预告上格范式、战棋地块质感骨架(§1.2 原则一;§3.2) | 冷暗军事色调、压暗信息板、斜切 HUD(原则二;§3.3) | | **Moonlighter** | 暖质地砖与砖缝质感、亲和冒险者气质、木石暖色道具(原则二/原则三);**光照层次与明度纵深**(亮地板/暗深渊/发光体三档,§2 明度分层) | 全拟物倾向(§3.3 半拟物边界);Darkest 式压暗(§9.2 反面基准) | | **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);反面参考**图证**待本作素材生成后增补。验收:方向性 @@ -571,9 +584,9 @@ | 反面参考 | 违反条款 | 立法理由 | |---|---|---| | **Darkest Dungeon** 式压暗 | §9.2 反面基准(风格取向记录,非禁令——压暗属普通设计决策,逐案走样张与目检) | 失败重开,世界无光暗记忆——明亮基调下不以整屏变暗作常态表达 | -| **传统扫雷白牌/贴纸式数字承载** | §1.2 原则二(明度分档为骨) | 数字由格底明度分档承载、直画入世界;色牌仅复杂格底后备——满屏白牌=电子表格观感,非游戏画面 | +| **传统扫雷白牌/贴纸式数字承载** | §1.2 原则二(明度分档为骨);§3.2 浮空数字 | 数字由浮空描边字承载、画在世界之上;不使用数字底牌——满屏白牌=电子表格观感,非游戏画面 | | **Enter the Gungeon** 式粒子与色相爆炸 | §3.4 焦点预算;§4.2 色相纪律 | 信息层禁止被特效与杂色吞没,特效入画先过焦点预算 | | **Hades** 式特效密度 | §2.2 兑现爽感的上限 | 爽感靠逐行因果归因,不靠满屏特效;承载元素以 §2.2 清单为界 | -| **传统扫雷 1–8 八色分色** | §4.1 数字墨三档 | 八色必撞红/金/蓝/紫赤语义色段;数字只走墨族三档色温,字形为唯一数值载体 | +| **传统扫雷 1–8 八色分色** | §4.1 数字墨单色制 | 八色必撞红/金/蓝/紫赤语义色段;数字只走单色浮空字芯,字形为唯一数值载体 | --- diff --git a/design/art/asset-path-map.md b/design/art/asset-path-map.md index 381edd1f..79366e99 100644 --- a/design/art/asset-path-map.md +++ b/design/art/asset-path-map.md @@ -28,7 +28,7 @@ | `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 | | `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_*` 十键消费;用户游戏内终审如有置换,按本行键名同径替换) | -| `board/` | 砖面(三关换皮);seal_mark.png 现役用途=战末金蜡封徽记专用(战末弹层消费——棋盘侧贴图绘制路径已退役) | terrain_floor__.png(三关地面系)、seal_mark.png(战末蜡封专用) | +| `board/` | 棋盘地形材质(2026-11-07 重做后改程序化绘制,无入包地形 PNG);seal_mark.png 现役用途=战末金蜡封徽记专用(战末弹层消费——棋盘侧贴图绘制路径已退役) | seal_mark.png(战末蜡封专用);旧 `terrain_*` 63 件(16 墙瓦片+5 地面变体×三关)随重做退役删除 | ## 4. 坐标/朝向等工程侧约定备查 diff --git a/design/art/camp-scene-prompts.md b/design/art/camp-scene-prompts.md index 9510c8aa..d4369803 100644 --- a/design/art/camp-scene-prompts.md +++ b/design/art/camp-scene-prompts.md @@ -1,4 +1,4 @@ -# 营地场景 · 分层生图提示词卡 v1.9 +# 营地场景 · 分层生图提示词卡 v1.10 > **性质**:营地场景图(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 为准。 @@ -248,3 +248,4 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm 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`。 diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md index 7404aed4..b105ab1e 100644 --- a/design/engineering/process-conventions.md +++ b/design/engineering/process-conventions.md @@ -12,7 +12,7 @@ 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 反而带不进去,改动只对本机生效) 2. **收口顺序(固定)**:**冻结 → 件核 → 并 master → 重塑 → 主区合回 → 删区**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先在 worktree 内 `git merge master` 解冲突(必须在合回之前,合回后才并=CI 验的是中间态);**重塑**=迭代分支(iter 形)合回前执行 `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 形免重塑免数卡)修复提交再合,落地复验追绿后删修复区**。批内的验证义务按 §4 改完即测铁规履行——改完即测自己改过的那部分,不请示、不等点名;收口顺序本身不设跑批关口。**卡片复核前置判据(2026-11-05 用户裁)**:需求卡片的 grilling 复核先于卡片提交、卡片提交先于合回——复核未跑完、缺陷清单未裁完,禁把卡片落 commit(落了也不算成立),`master` 永不落未成立卡;本条与 §2 段三出口铁律、doc-conventions §12.1「已写卡」凭据同判。 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 形免重塑免数卡),修复合回落地即再推再验追绿(追绿同链)。导入缓存刷新(.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/轮询循环。 -4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;合并收尾提交凭 MERGE_HEAD 豁免)、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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 commit 续合或 git merge --abort 放弃;快进合并不触发;--no-verify 可跳过且仅属用户)+post-merge(远端 CI 触发,只推送,不挂等待);合回链之外 git 层不设车道钩子——用户手工改动不受限;ZCode 层只约束 agent(子代理不经守卫层) +4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;主区一切非 merge 的 git commit 均拦(含 MERGE_HEAD 态续合;冲突/红态一律 git merge --abort → 回 worktree → 重新 git merge --no-ff))、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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(子代理不经守卫层) 5. **会话单区(2026-11-04 用户裁)**:建区粒度=回合——同一时刻每会话至多一个 worktree 在役;合入删区之前,会话内用户追加的事项一律并入在役区推进,禁为追加事项另开新区。区内全部事项完成后只做一次合入(一次 `git merge --no-ff`、post-merge 一次推送、远端 CI 只跑一次),追加事项在合入提交信息里分列;无改动需求的事项不建区。合回删区后用户再发令的事项=新回合,另开新区(区名取该回合主任务名)。CI 红的 `fix-<任务名>` 修复区属同一回合的追绿延续,不另算新区。迭代实现批(iter 形分支)独占回合——其他类事项不得并入迭代区(合回守卫数卡校验本就拦未归卡提交),待其合回后按新回合另开。 ## 2. 五段流水线 diff --git a/design/gdd/08-Alpha版本标准.md b/design/gdd/08-Alpha版本标准.md index 3e335e3c..b6f0dfcd 100644 --- a/design/gdd/08-Alpha版本标准.md +++ b/design/gdd/08-Alpha版本标准.md @@ -146,7 +146,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战 | 像素美术风格与色板 | [美术圣经](../art/art-bible.md) | 在役 | | 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 | | 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史;观感复核已随战斗一屏样张过闸完成——用户实机目检核销,沿革查 git 提交史) | -| 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) | +| 棋盘瓦片与立体表现重做 | [待办清单](../../待办清单.md) | 已写卡(待编排)——设计闭合=C 方向+D 布局+三关八色冻结(art-bible v3.51/battle.md 2026-11-07/HUD框架 2026-11-07);卡片=[需求卡片](../../reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md)(卡内 §16 复核通过);出口=用户实机目检棋盘立体感与素材观感达标 | | 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 在役(原稿分辨率入包禁降采样、显示按三档绝对高缩放、现有形象即终稿;定值单点=art-bible §8.2(档值定值面=站桩守门测试);实机目检清晰度与同屏体量顺序登记体验验证清单 ㊻) | | 敌人立绘(全敌种) | [角色设计](../art/character-design.md) | 在役 | | 主角立绘三态 | [角色设计](../art/character-design.md) | 在役 | diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md index 00d0f550..b05323c7 100644 --- a/design/gdd/systems/表现与支撑/HUD框架.md +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -59,7 +59,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 |---|---|---| | B 战斗画面 | 全宽,高读布局表 `stage_h`(背景三关变体+连续地面层高另读 `ground_h`) | 三关舞台背景+连续地面层、主角站桩立绘、敌人站桩立绘 ×1–3(**全站桩形态,2026-09-20 用户拍板:无框立绘+底座、状态小图标挂血条下,英雄卡/敌人卡退役**)、轮次阶段指示、结算明细带 | | C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 | -| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区 | 行动点条与按钮组、棋盘本体、toast 槽 | +| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区(2026-11-07 顶栏搬两侧:D 区全高归棋盘) | 左/右行动资源侧栏、棋盘本体、toast 槽(棋盘底常驻操作提示条退役) | 分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`(经 `ConfigDb.presentation.battle_layout` 读取);分区尺寸与组件落位的像素级裁决归 [battle.md](../../../ux/battle.md),两份文档只写结构关系、不复写数值。三区结构与双舞台常驻是结构冻结项,修订走文档修订而非调参。节点链进度不在战斗屏呈现——它由关卡画面(选路覆盖层常驻形态)的节点态承载,见[关卡节点地图](../冒险循环/关卡节点地图.md)。 @@ -74,7 +74,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 | 变量 | 含义 | 现行值 | |---|---|---| | N | 棋盘边长格数 | 读[棋盘生成](../排雷循环/棋盘生成.md)(现行四档;事实源 board_gen.tres) | -| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 由 D 区尺寸扣行动点条高(读 `ap_bar_h`)得出,本表不复制现算值 | +| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 高 = D 区全高(不再扣 AP 条);宽按 battle.md 格尺寸公式扣 `side_rail_w` 侧栏,本表不复制现算值 | 装板可行性由上面的不等式保证;格边长的可读下限见 [battle.md](../../../ux/battle.md),算例由样张渲染脚本按布局表现算、不入文档。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。 @@ -179,7 +179,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 |---|---| | 对比度 | 全部数字对格底 ≥4.5:1 | | 色弱安全 | 无信息仅靠色相承载;格态在灰度截图下可逐格分类 | -| 字号下限 | 棋盘数字 ≥18px、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) | +| 字号下限 | 棋盘浮空数字字高 21px 固定、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) | | 闪烁 | 无每秒超过三次的闪烁 | | 减动效 | 提供全部动画时长减半或跳终态的开关;结算逐行兑现是信息载体——可加速、不可整体跳过 | | 输入 | 全部操作纯鼠标可完成 | @@ -244,7 +244,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 ## 调参表 -本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / B 区连续地面层高 / C 区宽 / AP 条高 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。 +本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / B 区连续地面层高 / C 区宽 / D 区侧栏宽 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。 | 参数 | 域 | 现行值(文档自持,无表承载) | 说明 | |---|---|---|---| diff --git a/design/gdd/术语表.md b/design/gdd/术语表.md index f75da6f5..010ff0c7 100644 --- a/design/gdd/术语表.md +++ b/design/gdd/术语表.md @@ -103,12 +103,13 @@ | 术语 | 定义 | |---|---| -| 样张 | 按美术圣经参数画成的风格试验图,是砖面形态等视觉定稿的验收闸(规格见[美术圣经](../art/art-bible.md) §1.4) | +| 样张 | 按美术圣经参数画成的风格试验图,是棋盘地形形态(岩体+地面+浮空数字)等视觉定稿的验收闸(规格见[美术圣经](../art/art-bible.md) §1.4) | | 整屏样张 | 整屏级样张——战斗/关卡/菜单/营地屏各出一张,验屏级文字对比度、明度分层与焦点预算 | -| 掩尘 | 未开格底色的专色名——覆尘完整砖的「未知」面色 | -| 裸土 | 已开格底色的专色名——碎裂裸露空间的沉暗面色 | -| 色牌 | 垫在数字正下方的素色直角小牌,复杂格底时保数字可读的后备手段 | -| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地砖换色板) | +| 掩尘 | 未开格岩体顶面基色的专色名——覆尘完整岩体的「未知」面色(现行值 `#9C8462`,见美术圣经 §4.1) | +| 裸土 | 已开格连续地面基色的专色名——挖出空间的沉暗面色(现行值 `#695038`,见美术圣经 §4.1) | +| 色牌 | 棋盘数字底具——普通数字已退役(2026-11-07 浮空数字定案,棋盘普通数字不再使用底牌);封印格身份字形色牌保留(2026-11-07 封印改版,叠于法阵之上);沿革查美术圣经 §4.1 | +| 浮空数字 | 棋盘数字的现行呈现——数字与格面字形浮在格上方,暖白字芯+2px 深墨描边+双色引导线;字高 21px、字底距格顶 15px(规格见[美术圣经](../art/art-bible.md) §3.2) | +| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地形材质换色板) | | 方向稿 | 冻结前的方向性候选稿,供气质目检;过目检后才进机检冻结 | | 站桩 | 战斗画面区(B 区)里角色直立立绘的显示形态(配血条与状态行) | | 显示档 | 站桩立绘的显示尺寸规则——源用原稿分辨率入包(禁降采样),显示按三档绝对高缩放、宽随源比例;定值单点见[美术圣经](../art/art-bible.md) §8.2 站桩立绘显示档条(档值定值面=站桩呈现守门测试) | diff --git a/design/ux/battle.md b/design/ux/battle.md index f35ad071..8e62519a 100644 --- a/design/ux/battle.md +++ b/design/ux/battle.md @@ -81,7 +81,7 @@ 本屏必须传达的全部信息,按注视优先级分五层: 1. **扫雷图本体**(第一注视点,挖掘期占视觉预算大头):两格态(已开格 / 未开格——排雷玩法×6② 一眼可辨)、数字、封印印记、小人、可挖域(8 向相邻常驻指示)、变异纹理 -2. **本轮行动资源**:AP 余量(决定还能挖几格)、RAP 池(弃图刷新货币)、停手/弃图刷新按钮——紧贴棋盘上缘(动作发生地) +2. **本轮行动资源**:AP 余量(决定还能挖几格)、RAP 池(弃图刷新货币)、停手/弃图刷新按钮——紧贴棋盘左右两侧(动作发生地;2026-11-07 顶栏搬两侧后由侧栏承载) 3. **战果兑现面**(结算期为第一注视点):敌人血条变化、逐行结算明细、高光(完美封印/封印标中) 4. **规划面**(边缘注视,常读):攻击值与修正来源(C 区数据框)、敌人意图徽标与顺位(B 区站桩);HP 与状态效果由单位本体(B 区站桩)唯一承载——数据框不重复展示 5. **进度语境**:轮次/阶段指示、图例入口(关卡节点进度常驻关卡画面,战斗屏不承载——见 Navigation Position) @@ -106,22 +106,22 @@ - 护甲 AC(2026-09-26 二轮拍板补入——我方 AC 的唯一展示面;掷点判定轴,受击侧可读性) - 秘宝槽(四槽壳在役、空槽占位——局内两步使用与关卡域库存随秘宝过渡形态退役;现行秘宝 = 营地同调装配件,本区展示内容归装配面重接) - 奇物列表(**已实装**——现行标题「特性」;锻造/大奖励/关卡奖励节点获得的属性提升,逐件行「件名 ×N」呈现、零内部分类字样上屏;与战斗内状态效果分区呈现,防「战斗结束被清」误读) -- **D 区扫雷图 · AP 条** - - AP 点阵 + 停手按钮(现行) - - **RAP 读数(点阵+数字)**——置于弃图刷新按钮旁(2026-09-26 拍板:RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮) +- **D 区扫雷图 · 行动资源侧栏(原 AP 条,2026-11-07 顶栏搬两侧)** + - 左栏:AP 点阵 + 停手按钮 + - 右栏:**RAP 读数(点阵+数字)** + 图例按钮 + 弃图刷新按钮——RAP 贴弃图刷新(2026-09-26 拍板:RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮) - **战斗屏不承载(2026-09-26 二轮拍板)** - GP(中循环资源——商店房消费):**关卡画面常驻总量** + **战斗总结结算(总量+增量)**(呈现 spec:[settlement-summary.md](settlement-summary.md)) - 钥石(大循环永久资源):**战斗总结结算(Boss/精英击杀增量行)+ 冒险总结结算(收束明细)+ 营地**(呈现 spec:[settlement-summary.md](settlement-summary.md)) ### Layout Zones -采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `ground_h`(B 区连续地面层高)/ `info_panel_w` / `ap_bar_h` / `log_band_h_dig` / `log_band_h_settle`)。本节只写结构关系与内容职责,不复写数值;任何文档与代码不另立第二份布局值。 +采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `ground_h`(B 区连续地面层高)/ `info_panel_w` / `side_rail_w`(D 区行动资源侧栏宽,2026-11-07 顶栏搬两侧后新增)/ `log_band_h_dig` / `log_band_h_settle`;游戏视图不再读 `ap_bar_h`;布局表字段暂留供样张渲染工具,删除归工具批)。本节只写结构关系与内容职责,不复写数值;任何文档与代码不另立第二份布局值。 | 区 | 位置与几何 | 内容 | |---|---|---| | **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 点阵+数字〔贴弃图刷新按钮,2026-09-26 拍板〕;右——图例按钮 + 弃图刷新按钮〔雷图右上角,2026-09-12 拍板〕);棋盘主体(居中,格边长见下方「棋盘格尺寸公式」);toast 槽(上缘内侧) | +| **C 角色信息** | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 攻击值(含修正显示)、护甲 AC;秘宝槽、奇物列表(现行标题「特性」)——HP 条/RAP 池/状态效果槽/立绘占位/钱包行退役(2026-09-26 信息归属拍板:HP 与状态唯一展示面 = B 区站桩;RAP 迁 D 区右栏;GP/钥石迁出战斗屏) | +| **D 扫雷图** | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区(2026-11-07 顶栏搬两侧:**D 区全高归棋盘**,不再让出 AP 条高度;棋盘不缩,格边按公式现算) | 左栏(宽读 `side_rail_w`,贴棋盘左缘):AP 点阵 + 停手按钮;右栏(同宽,贴棋盘右缘):RAP 点阵+数字 + 图例按钮 + 弃图刷新按钮(RAP 贴唯一消费口,2026-09-26 拍板);棋盘主体居中(格边长见下方「棋盘格尺寸公式」;上方留 44px 给浮空数字越出棋盘,下方 12px+悬崖 8px);toast 槽(D 区上缘内侧左栏顶部,不覆盖棋盘与浮空数字);棋盘底常驻操作提示条退役(2026-11-07 用户裁,不占棋盘高度) | > 布局为 B/C/D 三区——关卡进度条不在战斗屏(节点链进度常驻关卡画面,见 Navigation Position;字母不重编沿用 B/C/D)。 @@ -129,7 +129,7 @@ ### 封印格呈现预览(2026-11-07 用户裁「封印受理即揭示」的呈现规格;2026-11-07 用户人审通过——按此先落实现,观感细化后置,不阻塞基线冻结) -封印受理后格子进入**已揭示+封印**态:墙瓦片换地板瓦片(裸土),封印法阵(环+十字)叠在其上,格下身份字形(危险格「危」朱字/安全格数字)按既有绘制优先级(数字 > 小人 > 封印印记)叠于法阵之上、垫既有色牌机制保可读。轮末判定后印记不撤,随图存续。 +封印受理后格子进入**已揭示+封印**态:墙格换已揭示连续地面,封印法阵(环+十字)叠在其上,格下身份字形(危险格「危」朱字/安全格数字)按既有绘制优先级(数字 > 小人 > 封印印记)叠于法阵之上、垫既有色牌机制保可读。棋盘重做批后承载面取本关受光棱色封印石(新连续地面 `#695038` 系对封印黑仅 2.35–2.98:1,不达 ≥4.5:1;受光棱系 6.45–9.94:1,零新增色,见 art-bible §3.2/§4.1)。轮末判定后印记不撤,随图存续。 @@ -167,7 +167,7 @@ -像素级判据句(实现批验收锚):①印记参数沿用现行五常量单点(环外径 0.82 格边、环壁 0.11 环径、十字臂宽 0.156 环径、光圈 alpha 0.50/γ1.6),零新增美术件、零参数改动;②封印格承载 = 地板瓦片(裸土),印记居格心、环外留 9% 格宽光圈、光圈不外溢邻格;③身份字形(危/数字)垫既有色牌件叠于法阵之上——色牌取现行色板素色小牌件,墨字对色牌对比 ≥4.5:1;④封印黑对裸土底对比 ≈7.8:1(≥4.5:1);⑤未开格与已开普通格观感与现行逐像素一致(对照列)。 +像素级判据句(实现批验收锚):①印记参数沿用现行五常量单点(环外径 0.82 格边、环壁 0.11 环径、十字臂宽 0.156 环径、光圈 alpha 0.50/γ1.6),零新增美术件、零参数改动;②封印格承载 = 已揭示地面(棋盘重做批后为本关受光棱色封印石),印记居格心、环外留 9% 格宽光圈、光圈不外溢邻格;③身份字形(危/数字)垫既有色牌件叠于法阵之上——色牌取现行色板素色小牌件,墨字对色牌对比 ≥4.5:1;④封印黑对承载面对比:旧裸土 ≈7.8:1,棋盘重做批后受光棱 6.45–9.94:1(均 ≥4.5:1);⑤未开格与已开普通格观感按棋盘重做批新地形规格(对照列)。 > 可挖域微光画法定稿(2026-09-25 用户拍板):**接触带·空间侧 + 蓝族**——光画英雄格周界接触面(正交邻墙=整边,斜向邻墙=角点+两半边),详见 art-bible §3.2;现行墙格整框绿相呼吸为待退役占位,切换待表现侧实现(含探针断言)。 @@ -179,13 +179,14 @@ **棋盘格尺寸公式**(本节是格边长口径的唯一出处;其他文档只写规则与指针,不复制算例): ``` -格边长 = clampi( floor((min(棋盘区宽 − 12 − 悬崖厚度, 棋盘区高 − 24 − 悬崖厚度) − (N−1) × 格间距) / N), 26, 46 ) +格边长 = clampi( floor((min(棋盘区宽 − 2 × 侧栏宽 − 12 − 悬崖厚度, 棋盘区高 − 44 − 12 − 悬崖厚度) − (N−1) × 格间距) / N), 26, 46 ) ``` -- N = 棋盘长宽两边的较大者;格间距 2px;垂直预留 24px(上 12 / 下 12);悬崖厚度 8px;结构钳制区间 [26, 46]px。 -- 格边长可读性以用户验收的现行画面为锚点(2026-11-01 用户裁——现行渲染值即基准,基座档 14×14=28px 达标);全域不设人造的格边长可读阈值。结构钳制 [26, 46] 只管算式结果不越界;格边长接线守卫=生产写入值与上式单点算式的返回值严格相等,最大板型的推定读数仅留痕观察、不作判红依据。 +- **棋盘区** = D 区矩形(宽 = 基准屏宽 − C 区宽 − 列间距,高 = 基准屏高 − B 区高);2026-11-07 顶栏搬两侧后,D 区全高归棋盘,AP 条高度不再参与算式。 +- N = 棋盘长宽两边的较大者;格间距 2px;侧栏宽读布局表 `side_rail_w`(基座档 200);水平预留 12px(左右各 6);垂直预留 56px(**上 44 / 下 12**——上方 44px 给浮空数字越出棋盘上缘,推导 = 字高 21+字底距格顶 15+描边 2+余量 6);悬崖厚度 8px;结构钳制区间 [26, 46]px。 +- 格边长可读性以用户验收的现行画面为锚点(2026-11-01 用户裁——现行渲染值即基准;2026-11-07 顶栏搬两侧后基座档 12×12=38px、14×14=32px);全域不设人造的格边长可读阈值。结构钳制 [26, 46] 只管算式结果不越界;格边长接线守卫=生产写入值与上式单点算式的返回值严格相等,最大板型的推定读数仅留痕观察、不作判红依据。 - N 的取值与每关板型的对应关系读[棋盘生成](../gdd/systems/排雷循环/棋盘生成.md),现行值的事实源是 `data/tables/board_gen.tres`。 -- 数字字号 = max(18, ceil(格边长 × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰)。 +- 浮空数字字高 = 21px(7px 像素字 ×3,固定,不随格边缩放)+2px 深墨描边;引导线 2px、字底距格顶 15px;旧「数字字号 = max(18, ceil(格边长 × 0.5))」随格内数字退役。 算例不入文档:棋盘区可用面积随布局表与板型变化,不是契约值——现算并绘在整屏样张上,本文件不复写。 @@ -198,11 +199,13 @@ | B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 | | B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 无明细回看——带保留单行摘要,冒险中回看归「生涯」 | 改造 | | B | 结算明细回看(已退役) | —— | 冒险中回看归「生涯」;回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 | -| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;HP 与状态归 B 区站桩、RAP 归 D 区 AP 条,不在本组件) | 只读 | HUD 视图拆分 | +| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;HP 与状态归 B 区站桩、RAP 归 D 区右栏,不在本组件) | 只读 | HUD 视图拆分 | | C | 秘宝槽 | 图标槽 ×4 | 四槽壳在役、空槽占位(标题「秘宝」,悬停「秘宝槽(空)」);局内两步使用与关卡域库存随秘宝过渡形态退役——现行秘宝 = 营地同调装配件(秘宝.md),本区展示重接归装配面 | 悬停 tooltip | 已实装 | | C | 奇物列表(现行标题「特性」) | 列表/图标行 | 已实装——逐件行「件名 ×N」呈现、零内部分类字样;锻造/大奖励/关卡奖励节点获得的属性提升——中循环数据,因改变战斗数学且无其他展示面准入战斗屏;与战斗内状态效果(B 区站桩)分区,防「战斗结束被清」误读 | 只读 | 已实装 | -| D | AP 条 | 点阵 + 按钮组 | 本轮 AP 点阵、停手按钮(左)、**RAP 点阵+数字(RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮——2026-09-26 拍板;RAP 清零可见反馈〔行动经济〕)**、弃图刷新按钮(右端·雷图右上角;RAP−8 · 本轮剩 N 次,上限 2 次为行动经济口径) | 点击提交意图 | HUD 视图拆分 | -| D | 棋盘视图 | 网格 | 棋盘全部格态 + 小人 + 封印印记 + 变异纹带 + 奖励身份 icon(已开格;绘制优先级 数字>小人>封印印记>奖励徽章>变异纹带>底色——徽章不进数字区,样张验收项) | 左/右键意图提交 | ✅ 已实装 | +| D | 行动资源侧栏(原 AP 条) | 两侧点阵 + 按钮组 | 左栏:本轮 AP 点阵、停手按钮;右栏:**RAP 点阵+数字(RAP 唯一消费口 = 弃图刷新,资源数字贴消费按钮——2026-09-26 拍板;RAP 清零可见反馈〔行动经济〕)**、图例按钮、弃图刷新按钮(RAP−8 · 本轮剩 N 次,上限 2 次为行动经济口径)。2026-11-07 顶栏搬两侧——原顶部整条 AP 条退役,数据按左/右栏分置,D 区全高归棋盘 | 点击提交意图 | HUD 视图拆分改造 | +| D | 棋盘地形层 | 合并岩体/连续地面 | 地面连续无缝;连通未开格(四邻)合并为抬升岩体(岩顶大板+南/东崖面+四段投影+整板悬崖);岩顶向北偏西抬升(LIFT/ESHIFT 比例见 art-bible §3.2);三关八色见 art-bible §4.1「三关棋盘环境八色」;不铺逐格瓦片;深度对象按脚底 y 排序,南侧岩体可遮住小人脚底(2026-11-07 用户裁) | 只读 | 新建(替换 cell_base_layer/tile_palette) | +| D | 棋盘浮空数字层 | 最顶层文字层 | 数字与格面字形(危/?)浮在格上方:字高 21px、2px 深墨描边、1px 浮空投影、暖白字芯、2px 双色引导线;字底阴影圆 10×6 画在开启格地面(格顶+7,位于小人之下,小人站该格时遮住圆);顶行数字越出棋盘上缘(D 区上方预留 44px);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;封印格身份字形走色牌、不进浮空层;普通数字色牌退役 | 只读 | 新建 | +| D | 棋盘视图 | 网格 | 棋盘全部格态 + 小人 + 封印印记 + 变异纹带 + 奖励身份 icon(已开格;信息层叠放序 浮空数字>小人>封印印记>奖励徽章/类型微光>交互反馈>变异纹带>地形底色——浮空数字永不被遮,徽章不进数字区;屏幕层序按脚底行分档:北侧贴花低于小人、南侧随岩体在前;封印印记与封印格身份色牌固定低于小人,样张验收项) | 左/右键意图提交 | 改造 | | D | 悬停预承诺光标 | 光标态 | 移动/挖/封印三语义光标 + 目标格边框高亮 | 自动 | 新建(排雷玩法×6③) | | D | 可挖域指示 | 常驻微高亮 | 小人 8 向相邻可操作格 | 自动 | 新建(排雷玩法×6③) | | D | 移动路径预览 | 路径高亮 | 悬停已开格显示 BFS 路径(合法性指示) | 自动 | 新建(排雷玩法×6⑤,裁决见下) | @@ -216,7 +219,7 @@ **布局决策 3 — 移动路径预览 = 合法性指示**(排雷玩法×6⑤ 悬案裁决):悬停已开格时高亮 BFS 路径(小人蓝细线点迹),移动执行为 ≤150ms 短滑。 - 备选(不采纳):穿行动画轨道——移动免费高频,动画时间税违反 P4 点击摩擦护栏(每轮输入动作:AP ≤2 的观测假设);正式版若 playtest 反馈"移动太瞬"再议 -**布局决策 4 — 弃图刷新 = 挖掘期当场换图(2026-09-12 用户拍板)**:按钮置 AP 条右端(雷图右上角)。点击即当轮就地换新图继续挖——AP 不重置、剩余 AP 保留,RAP−8,本轮上限 2 次。 +**布局决策 4 — 弃图刷新 = 挖掘期当场换图(2026-09-12 用户拍板;2026-11-07 按钮位随顶栏搬两侧改到 D 区右栏)**:按钮置 D 区右栏(贴棋盘右缘)。点击即当轮就地换新图继续挖——AP 不重置、剩余 AP 保留,RAP−8,本轮上限 2 次。 - **上游修订(OQ11)**:① 行动经济 Active 相位受理刷新意图 + 每轮上限 2 次(Waiting 代理退役)② 排雷玩法装板受理域增 Active·仅刷新路径 ③ 编排 owner = **战斗结算的挖掘期刷新编排**(行动经济扣费 → 排雷玩法退役旧板 → 棋盘生成出新图 → 排雷玩法装板 → 地图战斗资源摇奖励恰一次;无结算段、无轮次结束——战斗结算编排唯一性原则保持)④ 旧板封印印记随旧板**作废**(零兑付、封印 AP 不返还——排雷玩法 EC11 全量重置承载;确认微交互须显式提示)。**经济预警**:当场刷新无结算发生,原「敌方时间税」自惩失效——行动经济 OQ3 弃图率/刷新率预警阈值联动复核。 - 备选(已否决):结算期决策提示(Waiting 内联)——结算期不做刷新决策(用户拍板);挖掘期预承诺 stop+reroll 复合——决策即终轮,不符「换图继续挖」语义。 @@ -247,20 +250,109 @@ │ ├─ 结算明细带 ────────────────────────────────────────────────────────────┤ │ │ │ ▸上轮: 主角攻击3→蛆虫-3 | 攻击+50%(1结算) | 警觉+1×2 … │ │ │ └────────────────────────────────────────────────────────────────────────┘ │ -├─[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 ▓▓ │ │ -│ │ (空态=隐藏) │ │ │ ( █=可挖域微光 👫=小人) │ │ -│ └──────────────────┘ │ └─────────────────────────────────────────────────┘ │ +├─[C] 角色信息 ─────────┬─[D] 扫雷图(顶栏已搬两侧) ───────────────────────────┤ +│ ┌──────────────────┐ │ ┌──────┐ ┌───────────────────────────┐ ┌──────┐ │ +│ │ 攻击 6 (+50%) │ │ │ AP │ │ (上方 44px 留白) │ │ RAP │ │ +│ │ 护甲 AC 12 │ │ │ ●●●● │ │ 1 2 ░ 3 ... │ │ ▓▓▓░ │ │ +│ ├──────────────────┤ │ │ ●○○○ │ │ ╱│ ╱│ ... │ │ 3/8 │ │ +│ │ 秘宝槽 │ │ │ 5/8 │ │ ┌───────────────────────┐ │ │[?图例]│ │ +│ │ ◇ ◇ ◇ ◇ │ │ │ │ │ │ 岩体顶面(合并岩体) │ │ │[↻刷新]│ │ +│ ├──────────────────┤ │ │[⏹停手]│ │ │ 南/东崖面+四段投影 │ │ │ 8|剩2 │ │ +│ │ 特性(奇物) │ │ │ │ │ │ 1 2 👫 1 1 ░ 2 │ │ └──────┘ │ +│ │ 锻造+2攻 │ │ │ │ │ │ ▓▓ 1 1 ░ ░ 2 ▓▓ │ │ │ +│ │ (空态=隐藏) │ │ └──────┘ └───────────────────────────┘ │ │ +│ └──────────────────┘ │ 左栏 AP 棋盘居中·浮空数字最顶 右栏 RAP │ └───────────────────────┴──────────────────────────────────────────────────────┘ ``` +> **D 区结构注记(2026-11-07 用户裁)**:原顶部 AP 条整条退役,AP 在左栏、RAP/图例/弃图刷新在右栏;棋盘占 D 区全高,上方 44px 留白给顶行浮空数字越出棋盘;棋盘地形为合并岩体+南/东崖面,浮空数字+引导线为最顶层。 + +### D 区布局与棋盘画法预览(2026-11-07 用户人审通过,内嵌备查) + +> 预览依据 = art-bible §3.2/§4.1(v3.51)+本节布局表与格边公式。效果图是目标画面;像素判据以 1280×800 基座档钉死,实现批按此冻结基线(test-conventions §8.2)。 + + + D 区布局——顶栏搬两侧、棋盘全高、上方 44px 浮空数字预留 + D 区 1036×548:左栏 200px 放 AP 与停手,右栏 200px 放 RAP、图例、弃图刷新;棋盘 12×12 格 38px 居中,上方留白 44px,下方 12px+悬崖 8px。 + + + + 左栏 · AP + 右栏 · RAP + + + + + + 停手 + + 3 + 图例 + 弃图刷新 + RAP−8 · 剩 2 次 + + + + 上方 44px · 浮空数字越出棋盘 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 22 + 22 + 22 + 22 + + 2 + + 棋盘 478×478(12×12 · 格 38 · 间距 2) + 悬崖 8 · 下方 12 + + +**像素判据(1280×800 基座档;实现批按此冻结基线)** + +| 判据 | 读数 | +|---|---| +| D 区 | x 244–1280、y 252–800,1036×548 | +| 侧栏 | 左栏 x 244–444、右栏 x 1080–1280,各宽 200(布局表 `side_rail_w`) | +| 棋盘 12×12 | 格边 38、格间距 2、外框 478×478;原点 x=523、y=296;棋盘底 774、悬崖到 782、屏底余 18 | +| 棋盘 14×14 | 格边 32、外框 474×474;原点 x=525、y=296;棋盘底 770、悬崖到 778、屏底余 22 | +| 上方预留 | y 252–296 共 44;顶行字视觉顶 y=258(含 2px 描边),距 D 区上缘 6 | +| 浮空字 | 字高 21、字底距格顶 15、视觉顶距格顶 38;2px 深墨描边+1px 浮空投影;引导线 2px(左深右浅),自格顶−12 到格顶+4;字底阴影圆 10×6、圆心格顶+7,画在开启格地面、位于小人之下 | +| 岩体投影 | LIFT=round(38×0.435)=17;ESHIFT=round(38×0.109)=4;相邻岩顶搭接 2;板边岩顶外延 ESHIFT;南崖高 17、宽 42(38+4)、顶缘 2px 口沿高光取本关受光棱(dungeon #C9AF83)+1px 深墨线;东崖宽 4、高 55(38+17);北/西临空缘 2px 主亮棱+2px 次亮棱+外 2px 深墨边;南/东临空缘 2px 深墨内缘+3 段×2px 内阴影(自缘内 0.217×格边起,α0.27/0.16/0.08);南/东投影 4 段×4px 渐隐(α0.44/0.30/0.16/0.07);整板悬崖 8 | +| 深度遮挡 | 深度键 = 脚底格底 y;岩体取最南格格底;升序绘制;南侧岩体(键更大)画在小人之后、遮住小人脚底 | +| 层序 | 地面(封印格地面铺受光棱色封印石)→投影→开启格地面阴影圆(小人之下)→深度对象(岩体+小人;格件顶面贴花〔微光/变异〕与交互反馈随脚底行同序——北侧低于小人、南侧随岩体在前;封印印记与封印格身份色牌固定低于小人)→浮空数字+引导线(z 最高) | +| 顶面/视觉 rect | 墙格顶面 rect = 格矩形左上偏移 (−ESHIFT,−LIFT)、边长=格边;整格视觉 rect = 顶面向右补 ESHIFT、向下补 LIFT;微光/变异锚顶面 rect;封印锚逻辑格心;迷雾黑罩覆盖顶面+南面+东面三块 | +| 悬停/路径 rect | 墙格悬停金框按顶面 rect;已开地面格悬停/路径点迹按逻辑 rect(不偏移) | +| 禁裁切 | 顶行数字、引导线、阴影圆全部落在 D 区内;任何地形/小人/特效不遮浮空数字与引导线 | --- @@ -268,7 +360,7 @@ | State / Variant | Trigger | What Changes | |---|---|---| -| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 Active 相位 | B 区敌人待机(意图徽标全程可见——敌人系统 Rule 8⑤),D 区棋盘可交互,AP 条点亮;能量 2/10,唯悬停呼吸微光在动(§2.1) | +| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 Active 相位 | B 区敌人待机(意图徽标全程可见——敌人系统 Rule 8⑤),D 区棋盘可交互,左右行动资源侧栏点亮;能量 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 落点) | @@ -295,10 +387,10 @@ |---|---|---|---|---| | 未开相邻格 | 挖掘 | 左键 | 格碎裂 + 连锁展开(免费)+ 奖励身份揭显 | 意图入当帧批次 → 排雷玩法的意图批次提交 | | 已开格 | 移动 | 左键 | 悬停时路径预览高亮(布局决策 3);执行 ≤150ms 短滑 | 意图入批(BFS 移动,免费) | -| 未开格 | 封印 | 右键 | **受理即揭示**:墙瓦片换地板 + 封印印记落下(封印黑)+ 格下身份揭显(危/数字) | 意图入批(1 AP / 免费;受理当场零兑付——兑付在轮末判定批) | +| 未开格 | 封印 | 右键 | **受理即揭示**:墙格换已揭示地面 + 封印印记落下(封印黑)+ 格下身份揭显(危/数字,垫色牌) | 意图入批(1 AP / 免费;受理当场零兑付——兑付在轮末判定批) | | 已封印格(已揭示) | 无 | 左键/右键 | 禁止光标 + 悬停说明(封印格无可用动作) | 零意图(不入批——封印格拒绝挖掘、不可通行、不可再封印;封印印记无移除手段,封印不可逆) | | 停手按钮 | 主动结束轮次 | 左键 | 按钮下压 + AP→RAP 飞行数字 | 停手随当帧意图批次提交(**经排雷玩法批次,不直调行动经济**——单意图帧批次契约) | -| 弃图刷新按钮(雷图右上角) | 当轮就地换图继续挖 | 左键 | 确认微交互(RAP−8 代价显式 + 旧板弃置提示);RAP<8 → 资源面拒绝可见(行动经济 EC13) | 刷新意图提交(**Active 相位当场换图继续挖**——AP 不重置、本轮剩 N 次扣减;受理口径见布局决策 4/OQ11) | +| 弃图刷新按钮(D 区右栏) | 当轮就地换图继续挖 | 左键 | 确认微交互(RAP−8 代价显式 + 旧板弃置提示);RAP<8 → 资源面拒绝可见(行动经济 EC13) | 刷新意图提交(**Active 相位当场换图继续挖**——AP 不重置、本轮剩 N 次扣减;受理口径见布局决策 4/OQ11) | | 图例按钮 | 开图例 | 左键 | 模态 overlay | 恒可开(图例条目恒在) | | 状态小图标(B 区站桩) | 悬停 | hover | 状态 tooltip(来源+语义+剩余结算次数) | 只读 | | 胜利 overlay | 下一节点 | 左键 | → 关卡画面(选路枢纽)/ 关卡结算(末节点) | 关卡推进方推进 | @@ -339,7 +431,7 @@ | 挖掘→结算 | 明细带自底展开(150ms)+ 棋盘去饱和 + 金橙色相偏移 + 阶段指示翻转 | §2.2 色彩转金橙主导、饱和拉高、明度不变(状态区分经饱和/色相——art-bible §2) | | 结算逐行兑现 | 光带自棋盘行起点横扫 → 开格化箭雨/印记化暴击弹道飞向敌人立绘 → 受击闪白 + 血条直角递减 | §2.2 承载元素;因果全程可见可归因(P2) | | 清图换新图 | 金粒喷泉 3–5s → 旧图碎裂淡出 → 新图 install 淡入 | §2.3 短促丰收不拖节奏 | -| RAP 清零(战斗结束) | RAP 数字滚动归零(D 区 AP 条)+ 「随战斗结束消散」微文案 | 行动经济可见反馈义务 | +| RAP 清零(战斗结束) | RAP 数字滚动归零(D 区右栏)+ 「随战斗结束消散」微文案 | 行动经济可见反馈义务 | | 敌人死亡 | 血条直角递减至零 → 卡体灰化 + 碎裂退场(禁瞬消) | 敌人系统资产下限(同等 blocking);动画密度归战斗表现 | | 状态图标行全清(战斗结束) | 状态逐枚化光收回(B 区站桩图标行)+ 「状态随战斗结束消散」微文案 | 增益状态×4④;RAP 清零同款先例 | | 胜利 | 蜡封自上落下弹跳定格 → 碎砖拼纹章 → overlay 暖金渐显 | §2.4 克制不狂欢 | @@ -377,11 +469,11 @@ 无障碍基线权威 = [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)「可访问性基线」节;不再另立专项文档(2026-09-27 拍板,见 OQ2)。本 spec 内建基线承诺(呈现侧落地): -- **对比**:全部格底/面板底对数字墨 ≥4.5:1(WCAG AA)——art-bible §4.1 硬指标已可测(#33261B/#C9AF83 = 6.9:1 实测);UI 数据一律墨族素面 +- **对比**:浮空数字按 art-bible §1.4 第一验收项的复合判据过门(四类底上 max(字芯对底,描边对底) ≥4.5 且字芯对描边 ≥4.5;最亮底岩顶实测描边对底 5.1:1);UI 数据一律墨族素面对面板底 ≥4.5:1 - **色弱冗余**:无任何信息仅靠色相承载——格态靠完整/碎裂形;奖励金 vs 危险红靠剪影+运动;UI 红/金强调对加图标+文案冗余;Boss 靠形状独占(art-bible §4.5 清单逐项成立) - **灰度可辨**:变异格纹带、格态在灰度截图下可分类(art-bible §3.2 验收标准) - **非色彩破坏性确认**:弃图刷新(消耗 RAP 8 点)的确认交互与常规确认**不同位**(位置通道,色弱清单 #7) -- **字号下限**:棋盘数字 ≥18px、明细带正文 ≥14px、tooltip ≥13px(1280×800 基座) +- **字号下限**:浮空数字字高 21px(固定,含描边视觉 25px)、明细带正文 ≥14px、tooltip ≥13px(1280×800 基座) - **运动**:无闪烁 >3次/秒;结算光带为方向性扫动非频闪;提供减动效选项(§Transitions) - **键盘/Gamepad**:MVP 纯鼠标可完成全部操作(technical-preferences 平台注记);**MVP 纯键盘导航/焦点序不做**(2026-09-12 拍板——回合制点击驱动,平台仅承诺纯鼠标);gamepad 导航序延后(Open Questions) @@ -401,12 +493,16 @@ **布局与可读** -- [ ] 1280×800 与 16:9 全屏(canvas_items/expand)下三区(B/C/D)无遮挡、无重叠、无内容裁切(棋盘 12×12 全部格子 + 数字完整可见) +- [ ] 1280×800 与 16:9 全屏(canvas_items/expand)下三区(B/C/D)无遮挡、无重叠、无内容裁切(棋盘 12×12 全部格子 + 浮空数字与引导线完整可见) +- [ ] D 区基座档读数落预览判据:左/右栏各 200、棋盘 12×12 格 38(原点 x=523、y=296)、14×14 格 32;上方 44px 预留内顶行字完整、无裁切 +- [ ] 棋盘地形为合并岩体+连续地面:连通未开格共享岩顶/崖面无逐格拼缝;北/西受光棱、南/东崖面与四段投影在位;旧 16+5 瓦片路径零引用、零在库 +- [ ] 浮空数字+引导线 z 最高:任何地形/小人/特效不遮数字与引导线;格顶阴影圆标出数字所属格 +- [ ] 深度排序:南侧岩体画在小人之后并自然遮住小人脚底;小人所在格数字仍完整可见 - [ ] 进入战斗屏 ≤500ms 内可交互(棋盘 install 淡入完成后首格可点);同屏 draw calls < 200(technical-preferences 预算) - [ ] 两种格态(已开格 / 未开格)灰度截图下一眼可辨(排雷玩法×6②) - [ ] 悬停光标区分移动/挖/封印三语义;可挖域(8 向相邻)常驻指示;非相邻格悬停显禁止反馈(排雷玩法×6③) - [ ] 已引爆危险格呈"可通行可读"(排雷玩法×6④) -- [ ] 全部数字对所在格底对比 ≥4.5:1;明度分层规则无违例(art-bible §2/§4.1——格底功能分档合法,格态语义由形与色相承载) +- [ ] 浮空数字按 art-bible §1.4 第一验收项的复合对比判据过门(四类底上 max(字芯对底,描边对底) ≥4.5 且字芯对描边 ≥4.5);明度分层规则无违例(art-bible §2/§4.1——岩顶/地面功能分档合法,格态语义由形与色相承载);棋盘普通数字绘制路径零色牌调用(封印格身份字形色牌为唯一例外) **交互与反馈** @@ -426,7 +522,7 @@ - [ ] 零合法板(棋盘生成 EC5 降级)出现时玩家侧诚实提示(toast,非静默) - [ ] 效果行数值为单次贡献值,禁止与池合成值相加呈现;零值伤害行可见不被吞;衰减行按聚合计数呈现(战斗结算 呈现细则) - [ ] 未生效类行(奖励未生效)携带形状冗余(icon/划线),非色相独载 -- [ ] 奖励徽章绘制优先级:封印印记之下、变异纹带之上、不进数字区;拾取瞬间 tier 档位可读(地图战斗资源 H1) +- [ ] 奖励徽章绘制优先级:封印印记之下、变异纹带之上、不遮浮空数字与引导线;拾取瞬间 tier 档位可读(地图战斗资源 H1) **场景级测试**(缺项即 blocking) @@ -469,7 +565,7 @@ | 排雷玩法×6 | ④ 引爆危险格可通行可读 | §AC | | 排雷玩法×6 | ⑤ 路径预览裁决 | 布局决策 3 | | 排雷玩法×6 | ⑥ 单意图帧+voided+拒绝可感知 | §Interaction Map + §States 拒绝子态 + AC | -| 行动经济 | AP/RAP 常显+刷新入口+清零反馈+双源 | §Layout D 区 AP 条(RAP 贴弃图刷新按钮——2026-09-26 信息归属拍板)+ §Transitions + AC | +| 行动经济 | AP/RAP 常显+刷新入口+清零反馈+双源 | §Layout D 区行动资源侧栏(RAP 贴弃图刷新按钮——2026-09-26 信息归属拍板;2026-11-07 顶栏搬两侧)+ §Transitions + AC | | 战斗结算×3 | ①高光行强调呈现(封印标中金框行/清图 H2 金框行)②完美封印呈现形态 ③棋盘生成 EC5 零合法板提示/补偿/回退形态(toast 提示;补偿/回退不提供——2026-09-12 选型) | §States 高光/清图 + §States 拒绝子态 + §AC;注:结算明细屏 = 战斗结算 UX Flag 事项,由本 spec 承载 | | 敌人系统×4 | 意图映射/恒定/顺位/敌方池 | §Component Inventory 敌人站桩立绘 + **意图线索映射目录(敌人系统×4① 成文占位,资产定稿归战斗表现)** + AC | | 增益状态×4 | 常显+空态/来源标注/溢出/去留 | §States 空态 + §AC | diff --git a/game/tests/README.md b/game/tests/README.md index c6d8f259..b5eb8dee 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -138,17 +138,23 @@ tests/ | 日志 step 行零文案与结构化判读等价 | 表现与支撑 | `PlaytestLogger._on_step_row()`→`PlaytestLogger._append()`(真实结算→落盘 JSONL 读回) | `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`;`reward_ineffective_reason_test.gd:_assert_four_reasons` | | 模态覆盖层编排与输入锁 | HUD框架 | `ModalFlow.locks_input()`/`ModalFlow.open_after_playback()` | `modal_flow_test.gd:_init`;`reward_overlay_test.gd:_run` | | 模态句柄分域寻址面 | HUD框架 | 局内/菜单/营地三子容器句柄经注册面合同寻址(`UiRegistry.node()` 逐键取层)+模态编排口开合(`ModalFlow.open()`/`ModalFlow.close()`) | `ui_struct_probe.gd:_modal_registry_contract`(registry 合同序段+分域句柄段) | -| 未开格类型微光(8 邻作用集/五组色相/零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` | +| 未开格类型微光(8 邻作用集、五组色相、零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` | | 棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | HUD框架 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()`;读面 `BoardView.hover_probe()` | `ui_input_probe.gd:_ready`(case①到达②禁入③路径预览三语义) | | UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks`;`palette_token_pairwise_test.gd:_test_pairwise`(色板近色纪律存量面) | | 中文字体随包与字形覆盖 | HUD框架 | `UiKit.load_font()` | `ui_font_asset_test.gd:_init`;`theme_projection_test.gd:_smoke_global_theme` | -| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes` | +| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes`(旧行保留,删行归写卡段后续,实现批禁写) | +| 棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | 美术圣经 | `BoardTerrainLayer.setup()`/`BoardTerrainLayer.terrain_metrics()` | `board_terrain_test.gd:_test_merged_mass_geometry`;`board_terrain_test.gd:_test_projection_ratios`;`board_terrain_test.gd:_test_depth_order` | +| 棋盘浮空数字与引导线(最顶层、顶部预留) | 美术圣经 | `BoardFloatLayer.set_entries()`/`BoardFloatLayer.label_metrics()`/`BoardLabelShadowLayer.setup()` | `board_float_label_test.gd:_test_label_geometry`;`board_float_label_test.gd:_test_topmost_layer`;`board_float_label_test.gd:_test_contrast` | +| 棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | 美术圣经 | `BoardView.refresh()`/`BoardView._visual_rect_for()`/`CellUnit.fog_state` | `board_terrain_test.gd:_test_top_face_anchor`;`board_terrain_test.gd:_test_fog_rect` | +| D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | HUD框架 | `ApBarView.set_ap()`/`ApBarView.set_rap()`/`BoardZoneView._on_board_area_resized()` | `board_side_rail_test.gd:_test_side_rail_layout`;`board_side_rail_test.gd:_test_signals`;`stage_background_test.gd:_test_side_rail_width_from_table` | +| 棋盘点击命中与格边公式(逻辑格矩形) | HUD框架 | `BoardView.set_cell_area()`/`BoardView.cell_center_local()` | `board_terrain_test.gd:_test_cell_formula_base`;`board_terrain_test.gd:_test_hit_test_logical_rect`;`layout_probe.gd:_ready` | +| 旧瓦片退役与普通数字零底牌 | 美术圣经 | `BoardView.rebuild()`/`BoardView.refresh()`(资产装载与绘制路径) | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path` | | 站桩敌人呈现与结算演出落点 | 战斗表现 | `BattleStageView.enemy_standee_center()`/`BattleEndOverlay.open_victory()` | `standee_fx_sweep_test.gd:_init`;`pacing_queue_test.gd:_init` | | 站桩呈现定值与素材绑定 | 战斗表现 | `UiKit.load_tex()`/`StandeeBody.name_line_probe()` | `standee_present_values_test.gd:_init` | | 站桩显示档与素材分辨率绑定 | 战斗表现 | `StandeeBody.portrait_probe()`/`StandeeMotion.PORTRAIT_DISPLAY_H` | `standee_present_values_test.gd:_check_display_tier` | | B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) | HUD框架 | `BattleStageView.set_board_type()` | `stage_background_test.gd:_test_background_selection`;`stage_background_test.gd:_test_ground_layer_geometry`;`stage_background_test.gd:_test_beams_retired` | | 动画帧数规格(待机/攻击/受击;现役单帧形制锚定) | 战斗表现 | `UiKit.load_tex()`(`TEX_HERO_*` 四态件装载链——棋盘站立/行走与舞台三态同源) | `animation_frame_spec_test.gd:_test_spec_table`;`animation_frame_spec_test.gd:_test_current_form` | -| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula`;`stage_background_test.gd:_test_ap_bar_height_from_table`/`_test_log_band_settle_height`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | +| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula`;`stage_background_test.gd:_test_side_rail_width_from_table`/`_test_log_band_settle_height`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | | 调参测速批量模拟(逐帧步进与统计读数) | 调参测量 | `TuneSimController.run()`(调试浮窗批量模拟入口) | `tune_sim_batch_parity_test.gd:_init`(配对对拍套件) | | sim 驱动循环单点(缺省零变化与策略/日志回调形态) | 调参测量 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | `battle_driver_drive_test.gd:_smoke_drive_round_contract` | | 模拟玩家 0 格连锁算子(经真实闭包,零盲挖语义保持) | 调参测量×排雷玩法 | `AutoPlayer._deduce()`(经 `perfect_action()` 装配链) | `auto_player_deduce_test.gd:_smoke_zero_chain_rule` | @@ -218,7 +224,7 @@ tests/ | 排雷循环 | 排雷玩法.md | 装板与开局免费展开(封锁格无资源、计入清图);挖/封印合法性与可辨拒绝(拒绝零副作用、挖封印格被拒);封印受理即揭示(身份可查、受理零事件);清图口径换代(挖开∪封印、封印可完成清图) | 已覆盖 | — | | 排雷循环 | 棋盘生成.md | 棋盘按参数行出图、数字恒真;同参数同种子逐位复现、异种子不退化;可推理率与清图可达(合法性先于质量分)、重试有界、降级诚实 | 已覆盖 | — | | 排雷循环 | 行动经济.md | AP 扣费、末点耗尽即收轮与战斗收束清零;停手转存储备与轮内刷新(上限/AP 不重置/刷新图零清图奖励);下轮行动点修正排队与兑现 | 已覆盖 | — | -| 表现与支撑 | HUD框架.md | 拒绝反馈分面可辨与未知兜底文案;结算期零逐行文字与 FX 排播链保持;模态覆盖层编排与输入锁;未开格类型微光(8 邻作用集/五组色相/零玩法写入);UI 全局主题与按钮五态(含对比度锚);中文字体随包与字形覆盖;地形瓦片套与格面数字可读;战斗叙述与终局文案(数值带入/胜负互异);玩家面文案与危险格格面字形;战斗屏三区几何与棋盘格边长(分辨率两档×四档板型);B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役);模态句柄分域寻址面 | 已覆盖 | — | +| 表现与支撑 | HUD框架.md | 拒绝反馈分面可辨与未知兜底文案;结算期零逐行文字与 FX 排播链保持;模态覆盖层编排与输入锁;未开格类型微光(8 邻作用集、五组色相、零玩法写入);UI 全局主题与按钮五态(含对比度锚);中文字体随包与字形覆盖;地形瓦片套与格面数字可读(旧行保留,删行归写卡段后续,实现批禁写);棋盘合并岩体与连续地面(深度遮挡、投影、崖面);棋盘浮空数字与引导线(最顶层、顶部预留);D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘);棋盘点击命中与格边公式(逻辑格矩形);旧瓦片退役与普通数字零底牌;棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心);战斗叙述与终局文案(数值带入/胜负互异);玩家面文案与危险格格面字形;战斗屏三区几何与棋盘格边长(分辨率两档×四档板型);B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役);模态句柄分域寻址面 | 已覆盖 | — | | 表现与支撑 | 存档序列化.md | 存档写盘⇄读回往返保真;三槽位隔离与激活失败回滚;槽位摘要窥视与坏槽三态;启动态无激活不写盘;旧档迁移链与断点续玩零跳号;存档⇄RNG 快照往返保真 | 已覆盖 | — | | 表现与支撑 | 教学引导.md | — | 未覆盖 | 教学形态与首遇时机待设计;见待办清单「教学形态未定」条 | | 表现与支撑 | 数据配置.md | 全表装载、就绪态与表清单目录对账;进度坐标查行:精确命中/向上取整/封顶/警告去重;运行期越域致命与进程非 0 退出;加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域;表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 已覆盖 | — | diff --git a/game/tests/golden/README.md b/game/tests/golden/README.md index 69a090e0..5921d948 100644 --- a/game/tests/golden/README.md +++ b/game/tests/golden/README.md @@ -4,7 +4,8 @@ `windows/` 与 `mac/` 子目录各持一套,平台内部照常严格比对,跨平台不互比; 平台选择实现单点 = `tools/gate_platform.sh` 的 `gate_platform_id`,比较器 `tools/golden_compare.py` 自动拼平台子目录)。本目录现持:`windows/`(棋盘三图 `board_L1_dungeon` / `board_L2_underdark` / -`board_L3_deep_underdark`,裁剪区 900×760 + 启动态菜单 `menu_boot`,全屏 + 关卡视口两 Shot +`board_L3_deep_underdark`,裁剪区 1036×548(D 区基座档全幅;2026-11-07 棋盘地形换代后由探针视图全幅裁剪, +原 900×760 口径退役)+ 启动态菜单 `menu_boot`,全屏 + 关卡视口两 Shot `lmap_entry` / `lmap_boss`——2026-11-05 用户裁两 Shot 面:只对拍关卡最开始(入口停点)与 关卡 Boss 节点(末列锚定),中间过程不对拍)、 `level_map`(关卡画面全屏,历史基线留根——现行闸件未对拍它,由两 Shot 面接替)、 @@ -24,6 +25,9 @@ - **判有效**(changed 远低于 2% 阈值):基线**留在位**,不得顺手重制; - **判失效**(changed 超阈值或换代面落在裁剪区外):**显式重制 + 呈报 + 复闸**, 禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。 -- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(900×760)一律按**判失效** +- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(1036×548)一律按**判失效** 处理——占比远低于 2% 阈值也不判有效,显式呈报后由用户定是否重制。该口径只收紧棋盘三图的判读, 不改写 2% 容差本身的语义(`golden_compare.py` 判据不动);启动态菜单不适用本口径。 +- **越格口径(2026-11-07 棋盘地形换代)**:棋盘地形允许越格绘制——岩顶抬升、南/东崖面、四段投影、 + 浮空数字与引导线均按 art-bible §3.2 越出逻辑格边界;**「禁越圈」只约束类型微光层**(按该格抬升后 + 岩顶面 rect 判,不按逻辑格 rect),不约束地形/小人/浮空层。棋盘金标仍按上一条加严口径整幅严格比对。 diff --git a/reports/iter56-验收审计-2026-11-08.md b/reports/iter56-验收审计-2026-11-08.md new file mode 100644 index 00000000..f258fce1 --- /dev/null +++ b/reports/iter56-验收审计-2026-11-08.md @@ -0,0 +1,89 @@ +# 迭代 56 独立验收审计(结算期文字列表退役批+封印动作改版批) + +> 2026-11-08。审计人=未参与实现的独立子代理;仓库 `D:\code\g-plan2-iter56`(分支 iter56,HEAD=043c24c0,工作区干净);diff 范围 a0ea828f..HEAD(13 个提交,48 文件,+1301/−485)。审计依据=test-conventions §8.7;卡1 验收档=中、卡2 验收档=高(两卡头部申报在案)。全部 grep、diff 与复跑为审计人独立执行,不采信实现报告自述。 + +## 一、执行深度声明 + +| 审计动作 | 卡1(中档) | 卡2(高档) | +|---|---|---| +| 对照表逐行核对 | 全量 5 行(R1-R5) | 全量 12 行(R1-R12) | +| 判据绑定面抽查 | 3 行(R1/R3/R5,超 ≥2 下限) | 6 行(V1/V2/V3/V4/V9/V10,超 ≥5 下限) | +| 测试削弱检查 | 逐处(diff 全部删除行/改判行逐一对申报清单) | 逐处(同左) | +| 直查例外核对 | 逐条 | 逐条 | +| 最窄测试复跑 | 档位规定省略;实际超额跑 2 件(R1/R5,退出码 0×2) | 跑 1 件(minesweeper_rules_test,含 V1-V4,退出码 0) | +| 判据出处抽查 | 3 行(R1/R3/R5 锚句实读) | 6 行(V1/V2/V3/V4/V5/V10 锚句实读对照) | + +## 二、卡1 对照表逐行核对(R1-R5) + +| 行 | 判定 | 依据 | +|---|---|---| +| R1 结算期零逐行文字 | **缺漏(记账级)——测试实质通过** | 测试在位:`game/tests/unit/presentation/battle_log_zero_text_test.gd`(新增)。真实入口实证=main.tscn 实例→`_start_adventure_from_menu`→选节点→真实战斗→`ms.settle_batch` 挖掘/停手→断言 `main.ui.battle.log_view` 组合根链,未绕过改动点(停手经规则批次入口,与生产停手同路径;行流经真实 step_row→row_pacer 信号链)。尾缀〔退役改 V-退役卡 R1〕grep 命中断言 3 处(:77/:81/:85)+run_all 注册行。绑定面=三时点 parsed_text 冻结于进节点叙述基线(非终屏态),复跑 exit 0。**缺漏本体**:卡 §10 与 game/tests/README.md:137 点名函数 `_smoke_settle_zero_rows` 全仓不存在(断言内联在 `_init`)——白名单 1 授权命名自判,但 §8.9「改名则回表」未履行(能力清单仍载旧名),且实现报告 §三 记「落地一致」失实 | +| R2 FX 与 toast 链不断 | 通过(附注记) | `pacing_queue_test.gd:_assert_fx_chain`(:190)在位,尾缀〔退役改 V-退役卡 R2〕命中 8 处断言;真实行集=main.tscn 真实结算采样 step_row,重放独立 RowPacer(生产类),弹道/标出/色环/横幅/toast 计数从行型分布独立推导(防同义反复形态);`standee_fx_sweep_test.gd:_init` 在位未改。附注:卡绑定面写「与改前逐位一致」,落地改为「期望独立推导逐位一致」+「FX 链三函数零 diff」(f0390714 可证)——防镜像性更强,判等价兑现 | +| R3 日志零文案、字段不缺 | 通过 | `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`(:37)在位;真实入口=LevelAutoplay.run_level 挂 logger→落盘 JSONL 读回(:41-48),非直调 logger。尾缀 R3 命中断言 4 处。改动面核对:playtest_logger.gd 删 text 键+平铺跳 display_name,其余字段与 payload 一行未减(diff 实证) | +| R4 分析判读等价 | 通过(读数为提交记载,未独立复采) | `tools/analyze_parity_check.py` 在位(剥名逐位 diff+exit 语义完整);analyze_playtest.py 三处 text 判读改结构化 reason 优先+text 子串兜底双分支(diff 实证,effect_id_of 既有双分支未动)。T0 两份基线快照在盘:`sim-data/改前判读基线_历史锚71000_20261107.md`(3394 行)、`改前判读基线_同种子71000_20261107.md`(149 行),与报告读数行数吻合;三读数一致记载于提交 82725501。改后同种子日志未留盘,审计未复采(复采属读数类采集,不在审计义务内)——以工具+基线+提交读数为凭 | +| R5 未生效原因结构化 | 通过 | `reward_ineffective_reason_test.gd:_assert_four_reasons`(:63)在位;真实入口=begin_battle→grant_routed→轮末结账,四类 reason 逐一命中,复跑 exit 0(12 checks)。六发射点 reason 键全部落地(damage_controller/reward_grant×3/combat_segment/grant_segment,diff 实证)。尾缀 R5 的 grep 载体=run_all.gd:216 注册行;套件内断言消息未带尾缀(卡1 各套件落点不统一,注记不判缺) | + +**卡1 削弱检查(逐处)**:diff 全部删除/改判行共 8 处,逐一对申报——①pacing_queue「末信号行原文在明细带」→卡 §10 申报面(:108-120)改判 FX 承接 ✓;②theme_projection 9 类格式化闸→卡 §10 申报(_smoke_battle_log_view)改写 FX 落拍闸 ✓;③player_copy_sweep u6→卡 §10 申报(_sweep_source_names)改防回潮 ✓;④feat_vouchers A12→申报外,§5.5 同生死登记(追认单 #3)✓;⑤ui_click_probe wr1-b 反转+开场行判定面→追认单 #6 ✓;⑥theme/player_copy/ui_probe:133-135 零改动→git diff 实证 ui_probe.gd 空 diff,追认单 #11 属实 ✓;⑦run_all.gd 只增不删 ✓。**未发现申报外削弱**。 + +**卡1 直查例外(逐条)**:①reward_ineffective_reason_test hero hp=0/敌 hp=1 直改——测试头注 :7 随行申报「无公开 setter」,报告 R5 行同记 ✓;②该件 `settlement._reward_economy`/`_enemy_system` 私有域直查——旧版 seal_polarity_test 已有 4 处同款(git show a0ea828f 实证),头注注记「seal_polarity 负向直验同款形态」,按既有先例豁免;③pacing_queue/theme_projection 的 FakeStage/FakeFx/FakeBoardZone 为测试替身记参件,非产品内字段直查,不属例外。 + +## 三、卡2 对照表逐行核对(R1-R12) + +| 行 | 判定 | 依据 | +|---|---|---| +| R1 封印受理即揭示 | 通过 | `minesweeper_rules_test.gd:_test_seal_reveal_identity`(:201)在位;**真实入口=settle_batch**(:209/:225 提交 seal_place,未直调 `_do_seal_place`);身份断言=has_seal+`BoardData.cell_identity` 组合(T1b 落位重设计后形态,公开面);受理零 cell_revealed 哨兵在位;尾缀 V1 命中 4 断言。复跑 exit 0 | +| R2 挖封印格被拒 | 通过 | `_test_dig_sealed_rejected`(:234)在位:sub_reason=="target_sealed"+封印/揭示/AP 三态零变化,经 settle_batch;seal_polarity 四情况组 ②④改判为拒绝断言(diff 实证,见削弱①);V2 尾缀命中 minesweeper_rules_test 2 处+seal_polarity 8 处 | +| R3 清图口径换代 | 通过 | `_test_clear_by_seal`(:255)在位:非末封 false→唯一未完成格=已封印 true→干净板逐格封至清图、round_end 恰一条 path_tag=cleared;全部经 settle_batch。V3 尾缀命中 5 断言 | +| R4 能清图的封最优先 | 通过 | `_test_classify_seal_clears`(:292)在位:同批 stop+清图封,赢家=清图封居执行序首、stop voided、round_end=cleared;经 settle_batch。V4 尾缀命中 4 断言 | +| R5 判定批与溢价零改动 | 通过 | seal_polarity 保留组(末点 AP/标中溢价/标空负向/完美封印双份)断言原样未改(diff 实证删改仅限四情况 ②④改判面);V5 判据出处注记 grep 命中 2 处(:51/:444)——T4 提交说明称「三函数」,实落 2 处(注记级出入,两保留组函数均有载体,不判缺) | +| R6 受理零兑付、改判路径死 | **缺漏(载体级)——实质通过** | 实质面:settlement_wiring_snapshot_test.gd 零改动(git diff 空),内嵌 golden 在「挖+封+停」驱动序下绿(提交 92086027 四套件绿含 wiring_snapshot)——golden 未漂移=改判路径零触发实证;grant_segment :102-104 作废行块删净+流水零作废行(代码 diff 实证)。**缺漏本体**:〔封印改 V6〕尾缀全仓(game/+tools/)grep 零命中——卡原定载体=golden 重录,实测零漂移未重录后载体消失;卡 F9 只为 V11/V12 补了「报告+提交说明」载体豁免,V6 漏补同类豁免 | +| R7 破封一击退役、词除名 | 通过 | feats.tres 删行(diff 实证,feat_id=breaker_strike 整块);effect_engine 词表删 dug_under_seal(diff 实证);effect_words_t1 新增出册防回潮断言+adventure_feats V7 注记(:722);grep dug_under_seal/breaker_strike 非测试面=0(审计独立 grep 实证)。注记:effect_words_t1 断言尾缀用卡1 家族「退役改 V7」而非「封印改 V7」——V7 载体在 adventure_feats 在位,家族混用不判缺 | +| R8 封印格呈现三件套 | 通过(附注记) | `seal_mark_params_test.gd:_test_seal_on_revealed_visible`(:62)在位:seal_on 与揭示同真印记仍可见(新组合态);board_shot_probe 选择器换代(:145);ui_input_probe case④b 印记落位断言在位。**附注**:卡探针半句「身份字形可查」在 case④b 无显式断言载体——身份字形可观测面由 golden 三图(含字形像素,R12)+V1 身份查询断言+board_view 读 cell_identity 代码(diff 实证)合围,无旧断言被删,不算削弱。直查例外:`u._seal_layer` 直读随行申报(测试注记+卡 §8 R8 行+复核 F12)✓ | +| R9 已封印格零动作 | 通过 | ui_input_probe case④c(:288-312 新增):真输入左/右键已封印格 action_requested 零发射+CURSOR_FORBIDDEN+封印禁入框+图例说明在册含「受理即揭示」;V9 尾缀命中 5 断言;判据出处 ux/battle.md 已封印格行(Interaction Map)实读吻合 | +| R10 文案四件 | 通过 | hud_presenter_test 文案逐字换代(seal_present 新句+target_sealed 新句,diff 实测与 hud_presenter.gd 逐字一致);player_copy_sweep u4 图例断言换代(含零雷字守恒);ui_click_probe 图例行断言换代(:1218,V10 尾缀在位)。措辞按白名单 2 授权 | +| R11 sim 策略对齐+MC 同批重锚 | 通过(载体=报告+提交,卡 F9 豁免在案) | auto_player._constraints 封印身份增强(标中计已知雷/标空剔除,读 board.cell_identity 公开面);level_autoplay 标雷误挖退役→错触直挖 NORMAL_MISDIG_P=0.10(白名单 5+用户裁③);新锚 `sim-data/runsum_iter56reanchor_81000_n50both_20261108.jsonl` 在盘 100 行(审计实证);sim-data/README 现行锚指针换代+改前锚迁历史节+59% 失实注记(diff 实证);三方对照读数与偏差 -1.08 记报告 §四+追认单 #5+提交 043c24c0;规模 50/档=2026-11-08 用户批准在案 | +| R12 渲染基线换代 | 通过(载体=报告+提交,卡 F9 豁免在案) | golden 三图 windows 三件换代(diff stat 二进制变更实证);提交 91882776 记 board_shot 双帧取证 PASS+渲染闸三屏绿;用户预览图人审 2026-11-07 在案;mac 三件缺件记遗留(卡 T7 预案:渲染闸 SKIP 不判红)。渲染闸未由审计复跑(昂贵件,以提交读数+基线字节换代为凭) | + +**卡2 削弱检查(逐处)**:diff 删除/改判行共 11 处——①seal_polarity 四情况「直挖受理/隐式退役/零兑付作废」→卡 §8 削弱① ✓(改判后正向断言钉新语义:target_sealed+判定照发);②minesweeper_rules preview 形态 B→卡 §8 削弱② ✓(改判「preview 封印格零外扩」);③hud_presenter/player_copy_sweep 文案逐字→卡 §8 削弱③ ✓;④settlement_wiring golden→卡 §8 削弱④,实测零漂移未重录(追认单 #9),零削弱 ✓;⑤adventure_feats 破封一击断言删→卡 §8 R7 行明示 ✓;⑥种子 42→43+表行 37→36/优秀 13→12 判值换代→申报外 §5.5 同生死(追认单 #7,主区基线 42 绿对照坐实)✓;⑦effect_words 词表断言换代→卡 §8 R7 ✓;⑧board_shot 选择器放宽(has_seal 单条件)→取证选择器非断言放宽,卡 §8 R8 申报 ✓;⑨ui_click_probe 行为②摘除+恢复现场死调用删+簿记调整→卡 §7/§8 R9+追认单 #8 ✓;⑩ui_input_probe case④b 判据出处注记换代、断言体保留 ✓;⑪smoke/critical-paths.md 第 4 条改写→卡 §5/T4 申报 ✓。**未发现申报外削弱**。 + +**卡2 直查例外(逐条)**:①seal_mark_params `u._seal_layer` 直读——随行申报 ✓(见 R8 行);②minesweeper_rules_test `_ae._phase=1` 直置与 `_ae._ap` 直读——测试 :34-35 注记「与既有单测直读 action_economy._ap 先例同款」在案;`_ae._ap` 有公开读数(ap)可用,直读属非必要但注记在案、只读断言面,不判缺;③`_rules._safe_remaining()` 私有读——旧版同款既有面;④`_rules.dig_range_bonus=99`/`seal_range_free=true`——公开属性,注记在案;⑤`_board.cell_identity`——公开方法(T1b 后),非例外;⑥cells_probe()/legend ENTRIES——探针公开取证面。 + +## 四、判据出处抽查(卡2 6 行+卡1 3 行,规格句实读对照) + +| 行 | 锚 | 独立可写性判定 | +|---|---|---| +| V1 | 排雷玩法.md:52 | 锚句「封印被受理的那一刻……格下身份当场可见……受理当场零兑付、零事件」——kind/digit 断言与零 cell_revealed 均可独立写出 ✓ | +| V2 | 排雷玩法.md:56 | 合法性表「挖|8 向相邻、未开、无封印|……已封印」+「拒绝原因独立可辨」——target_sealed+三态零变化可独立写出 ✓ | +| V3 | 排雷玩法.md:139 | 「清图 = 全部安全格完成,完成 = 挖开或封印——封印可以完成清图」——两阶段断言可独立写出 ✓ | +| V4 | 排雷玩法.md:167 | 批次语义序表「最先|能清图的挖或封——防止耗尽优先把清图高光结算成最差结局」——赢家断言可独立写出 ✓ | +| V5 | 战斗结算.md:139 | 判定批兑付表「标中则兑正向……标空则记归因行+负向」——保留组预期可独立写出 ✓ | +| V10 | ux/battle.md:284 | 拒绝细分与 toast 要求实读吻合;字句按白名单 2 授权润色,语义四件(受理即揭示/不可再挖开/随图存续/零动作)全部溯至排雷玩法 :52/:56 ✓ | +| 卡1 R1/R3/R5 | 08-Alpha:154/战斗结算:87/:80 | 零逐行文字、日志零文案全字段、四类合法例外 reason——预期值均可自锚句独立写出,非实现镜像 ✓ | + +抽查结论:未发现「预期值只在实现里有的」同义反复断言。R2 的期望计数从行型分布独立推导(非抄实现),形态更优。 + +## 五、最窄测试复跑读数(审计独立执行) + +| 测试 | 覆盖 | 结果 | +|---|---|---| +| `res://tests/unit/core/minesweeper_rules_test.gd` | 卡2 V1-V4(经 settle_batch) | **exit 0**(all green,36 checks;V1-V4 断言全 PASS) | +| `res://tests/unit/battle_settlement/reward_ineffective_reason_test.gd` | 卡1 R5 | **exit 0**(all green,12 checks;四类 reason 全命中) | +| `res://tests/unit/presentation/battle_log_zero_text_test.gd` | 卡1 R1 | **exit 0**(该测试 _problems 非空才 quit(1),exit 0 即全绿) | + +环境:Godot_v4.7.2-stable_win64_console.exe --headless,工作目录 `D:\code\g-plan2-iter56\game`。只跑单件,未跑全套。 + +## 六、缺漏汇总与整改义务 + +| # | 缺漏 | 级别 | 整改义务与去向 | +|---|---|---|---| +| 1 | 卡1 R1 点名函数 `_smoke_settle_zero_rows` 未落(断言内联 `_init`);game/tests/README.md:137 仍载旧名;实现报告 §三「落地一致」记载失实;改名未回表 | 记账级(测试实质完整:真实入口/尾缀/绑定面/复跑全过) | 回表改 capability 行函数名=写卡段通道(实现批禁写 README,无法合并前自行修);实现报告 §三 勘误=实现会话合并前可改(reports/ 面合法) | +| 2 | 卡2 R6〔封印改 V6〕尾缀全仓无 grep 载体(golden 零漂移未重录,原定载体消失;F9 豁免只补了 V11/V12) | 载体级(实质由未改动绿 golden+grant_segment 删净承接) | 补一处载体注记(settlement_wiring_snapshot_test 或实现报告 R6 行明示载体改报告+提交说明)——随追认单或文档批处理 | +| 3 | 观察项(不判缺漏):T4 提交说明称 V5「三函数」实落 2 处;effect_words_t1 尾缀家族用「退役改 V7」;ui_click_probe `_play_one_action` 残留一处不可达 return(:1390 附近,死代码,解析无碍——探针 exit 0 实证可跑);reward_ineffective_reason_test 断言消息未带 R5 尾缀(载体在 run_all 注册行);smoke/critical-paths.md 第 7 条「明细逐行呈现」残留旧口径(卡1 未申报面,建议列反哺点);sim-data/README.md「历史锚(只读不判)」节标题重复两处(:12/:17,编辑残留) | 轻微 | 随下批顺手清或文档批收口 | + +## 七、结论 + +**通过**(附上表 2 项记账级缺漏——均不触验收实质:无申报外削弱、无同义反复判据、无真实入口绕过、无直查例外未申报;缺漏 1 的回表通道归写卡段、缺漏 2 归载体注记补登,均不构成合并阻断)。 + +依据:17 行对照表全量核对,14 行干净通过、2 行缺漏(R1卡1/R6卡2,实质面均由独立证据承接)、1 行附注(R8 探针半句由 golden+V1 合围);削弱检查逐处零申报外删改;直查例外逐条有申报或既有先例;判据出处 9 行抽查全部可独立写出;最窄测试 3 件复跑全绿(exit 0×3)。卡1 中档四件全做+复跑超额执行;卡2 高档五件全做。 + +审计人注:本报告为合并前独立审计(test-conventions §8.7);卡1 中档的远端 CI 现查读数代证义务在合回后由 `tools/ci_check.sh <合并提交>` 兑现,本报告复跑读数已超额覆盖该档复跑面。 diff --git a/reports/需求卡片-二三关棋盘观感批-2026-10-16.md b/reports/需求卡片-二三关棋盘观感批-2026-10-16.md deleted file mode 100644 index 584a91a7..00000000 --- a/reports/需求卡片-二三关棋盘观感批-2026-10-16.md +++ /dev/null @@ -1,292 +0,0 @@ -# 需求卡片:第二 / 三关棋盘观感——亮度与对比度批(T1 定性人闸 · T2 按轴修法 · 验收三件套 · 文档面全走反哺点) - -- 版本:**v1.4(2026-10-17 开工前预授权 U1〔用户于开工前一次性决断,防开发中反复打断〕——①Q2 甲/乙由「延裁·T1 出口现场裁」改**判据自动裁**:甲案候选样张读数达标即直接走甲不停机,仅当读数证伪「纹理太碎」假说时才呈报裁乙;②V2 定向目标带数值授权批内按 T1 实测读数自定并随定性报告呈报,T1 出口人闸只确认轴归因与修法方向;③详见 §10 Q2 条与开工门 U1 预授权条);v1.3(2026-10-17 文档同步闸 v3 口径修订,纯文档批〔分支 carddoc-20261017〕按用户六条裁定执行——①本批(代码实现批)禁写 `design/` 整目录与根规则文件,§5 同步面的同步义务一律执行为「列进 `reports/iter30-反哺点-<完成日>.md`(哪个文件哪一节、改成什么、依据),用户会话裁决后归文档批落文」;②产出物落位换代:实现报告/代拍板追认单/反哺点清单三份落 `reports/`,不再 `design/qa/`;③T5 末卡改「产出物落位卡」(三份 reports/ 文件写齐才算收口);④闸口径按域选档:重闸 = `tools/run_all_gates.sh` 按改动域选档(本批 → `--code`),卡内不再写死闸件名单与「全量档」类字样;⑤实机目检项写进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单,「登记 07」转反哺点;§10 裁决留痕原文不动);v1.2(2026-10-16 裁决留痕版:三卡待裁项按用户令定案——Q3 已裁甲·同批、Q2 延裁留痕并将裁点挂至 T1 出口呈报硬流程步骤、排期栏定实「已编入迭代 30」与三卡串行序位、§4B 跨卡依赖按已裁事实改实、全卡零悬空待裁点;v1.1 同日 grilling 审查修订见 §11;v1.0 同日成文)** -- **指路订正(2026-10-20)**:徽章卡(迭代 30 卡①)已按 doc-conventions §11「吸收即死」退役,本卡对其三处指路句改为结论内联+提交号 `7ffd1dc0`,裁决内容零变更。 -- 来源:[06-待办清单](../design/gdd/06-待办清单.md)「第二 / 三关棋盘观感——亮度与对比度」小节(2026-10-13 用户裁定条)+ [playnote](../playnote.md) 用户试玩原始记录:「UI优化,第二第三关的棋盘看着太累了;不知道是因为亮度还是对比度的原因,看着非常费劲,非常不舒服」 -- 归属:**表现层美术修批**(06 在册条目直接写卡;两轴归属 = [HUD框架](../design/gdd/systems/表现与支撑/HUD框架.md)(UI 轴)+ [美术圣经](../design/art/art-bible.md)(素材轴),定性前两方共裁——沿用 06 条裁决) -- 排期:**已编入迭代 30(2026-10-16 用户令编入,roadmap 行已在案;批内状态刷新列反哺点)**。同迭代三卡串行序位第 3:未开格类型徽章批卡(迭代 30 卡①,已入库合并 7ffd1dc0,卡片已退役)→[战斗一屏样张批卡](需求卡片-战斗一屏样张批-2026-10-16.md)→本卡(徽章→样张→观感)。**并行例外**:本卡 T1/T1b 采样与定性读数允许与前两卡并行穿插——依据=采样是只读动作(出帧/读数/样张均不触碰 golden 三张、样张主板、§5 同步面文档等汇聚文件),落码修改(T2 起)仍按上述序位串行。开工门 = U0,须用户 `/iter` 发令;且 T1 出口定性人闸未过之前禁止动码——该闸 = [06 本条](../design/gdd/06-待办清单.md)既有裁决硬步骤(「开工前先过『素材轴 / UI 轴』定性人闸」,2026-10-13 用户裁定;[08 git 提交史](../design/gdd/08-Alpha版本标准.md) v0.3 同款注),**不是待裁点**(v1.1 撤销原 Q1,见 §10)。 -- **立场前提(用户原话,本卡设计的第一约束)**:此条立项原因就是用户实机觉得现在的画面累眼、且对「纯程序化重产现状」明确不满——「如果还是用原有方式弄出来的东西,有没有可能还是我不满意的?」。本卡对此的正面回应 = ①第一步定性用**可量化的读数归因**(明度直方图 / 相邻格对比 / 高频能量 / WCAG 对),禁止凭感觉猜轴;②两条修法各自的产出物写清**相对现状新增什么**(§6 T2 两案效果上限表);③**诚实的效果声明**:观感是主观项,机检只能证伪(读数红 = 必有问题)不能证真(读数绿 ≠ 用户满意),**阻塞性人闸全部前置**(T1 定性闸 + 契约 4 方向闸),入库后实机目检按 2026-10-12 用户令口径**登记不阻塞**——目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单(「入册 07」列反哺点;[AGENTS.md](../AGENTS.md) 红线「真人检测只登记不阻塞——禁以等目检为停工理由」口径不变),用户复判否决走 §7 V4 回补机制(行回待做 + 06 立残留条,落文按 v3 口径归文档批)。防「改一轮还是不满意」的机制 = **先出改前/改后并排对比读数样张给用户定性确认方向,方向过了人闸才落码**(🔴 契约 4)——方向若被否决,返工停在样张层,不烧落码与基线。 - ---- - -### 0. 前置依赖与既有裁决 - -| # | 前置 | 内容 | -|---|---|---| -| P1 | **定性人闸(06 条既有裁决——流程硬步骤,非待裁点)** | 06 原文(445 节内):「开工前须先定性(沿用既有裁决)……两轴修法完全不同,定性错了等于白改一轮」+ 状态行「开工前先过『素材轴 / UI 轴』定性人闸」(2026-10-13 用户裁定条;该要求最早载于 06「奇物呈现优化探讨备忘两孤儿点」(e),本条承接转正)。本卡 T1 即该闸承载,结论过用户确认才进 T2——v1.0 曾把此闸再列 Q1 待裁,v1.1 撤销(禁再问已裁项) | -| P2 | **与「呈现层残余 <4.5:1 文字位」条的分工(06 条既有注记)** | 06:451 分工句原文:「本条管**棋盘区域整体的观感**(亮度/对比度/费劲感),是体感问题;『呈现层残余 <4.5:1 文字位』管**具体文字位的对比度读数不达标**(B 区站桩名行/敌顺位徽标/RAP 反馈行三处),是机检可判的硬指标。两条不同面,不互相替代,各自保留」;该文字位条已随迭代 26 T3 完成(06:443)。本卡管棋盘区域整体观感(体感问题),**禁吞并该条**(🔴 契约 2);T1 读数若发现新的文字位红点,另行登记,不并入本卡 | -| P3 | **08 标准覆盖行** | [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md)「五 · 表现」表「棋盘观感(第二/三关亮度与对比度)」行(08:145)现为**待做**(事实源指向本 06 条);Alpha 完成判据 = 全部条目在役 ⇒ 本卡完成时该行 待做→在役 改写列反哺点(§6 T5;时机=本批入库,落文归文档批,目检复判否决的回补机制见 V4) | -| P4 | **08 未决项关联(按名指路;v1.1 按实查改写)** | 08「七 · 未决项」现行表含「**素材升档重产进不进 Alpha**」行(2026-10-16 实查为该表第 6 行,另有「**立绘清晰度回退评估**」行——未决项表 2026-10-16 v1.6 重编号过,**行号不作指路依据,一律按名找**);「素材升档重产」在「五 · 表现」表现为**待裁**(08:154)。06「资产升档重产批」条现行状态注记 = 2026-10-04 用户令「暂不做、先忽略,重启=用户点名」+ 2026-10-06「优先级再降」+ 2026-10-06 方案二注记(原升档路线已被八敌逐键定档实质走完、剩余挂起项=提灯点亮解禁候选)。划界:该批面向**立绘/小人帧尺寸升档**,本卡素材轴乙案 = **L2/L3 棋盘瓦片色板/纹理方案重做**——对象、管线、闸面均不同面,**裁本卡乙案 ≠ 放开升档重产**,呈报时须带此划界(§6 T2 乙案行) | -| P5 | **渲染闸与基线现状** | 棋盘三关 golden 基线冻结于 2026-09-30(`tools/golden_compare.py:11`),改瓦片/改常量**必然**破 Δ≤16/changed≤2% 容差 ⇒ 基线换代是本卡的确定义务而非例外处理(§7 V3) | - ---- - -## 1. 目标与完成定义 - -**目标**:把 L2/L3 棋盘「看着太累」的观感问题**归因到轴**(素材轴 / UI 轴 / 两轴共因),按轴修复,并经用户实机复核确认体感改善。 - -**完成定义**(五件齐才算完成,缺一即该条在 06 保持待办): -1. T1 定性报告交付:逐关三测面(棋盘瓦片区 / 舞台底与屏根 / 叠加层)读数表 + 归因结论(轴判定,引用具体数值);**T1 出口定性人闸过**(06 已裁硬步骤,P1); -2. T2 修法按裁定轴别落码/落素材,既有样张口径闸全部保持绿(A6 梯度均值 ≥4.70、F6 立面双明度带 Δ≥18、格底明度档 §4.1、图底分离——见 §2.4;**注**:该组断言现行落点=样张主板(dungeon 拼板,`render_sample_sheet_v3.py:130-131`),L2/L3 分关实测属本批新建读数件(T1b),见 §11 攻击面 2); -3. 验收三件套走完:机检读数达标 + 渲染闸 golden 基线显式重制并呈报换代面 + 用户实机目检轮**登记**(目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单,「入册 07」列反哺点;2026-10-12 用户令=登记不阻塞入库,否决走 V4 回补); -4. 08「五 · 表现」棋盘观感行 待做→在役 改写列反哺点(含 07 目检登记注;落文归文档批); -5. §5 同步面每条在 `reports/iter30-反哺点-<完成日>.md` 有落点(06 对应条目状态更新条在内);权威文档与根规则文件零直改。 - -**效果不确定性的诚实声明**:观感是主观项。机检读数能证伪(超带 = 必有问题)不能证真(达标 ≠ 满意)。证真面由**前置人闸**承担(T1 定性闸 + 契约 4 方向样张闸——方向不过不落码);入库后的实机目检轮按 2026-10-12 用户令「真人检测只登记不阻塞」执行,用户复判若仍不满意 = V4 回补机制触发(08 行回待做 + 06 记残留、下批重开),不算本批未入库。 - ---- - -## 2. 现状事实(2026-10-16 实查;开工日自行复核行号) - -### 2.1 关级与瓦片(素材轴现状) - -| # | 事实 | 出处 | -|---|---|---| -| F1 | 三关板型与图类型:L2 12×12 underdark / L3 13×13 deep_underdark;**L1 行群主体 10×10 dungeon、但含 12×12 dungeon 行**(2026-10-16 逐行实查 `board_gen.tres`——level_index 1 段内有一行 12×12),故 T1 的 L1 参照位读数面须覆盖两种板型(词表 v1.1) | `game/data/tables/board_gen.tres` 各行;`game/data/schemas/board_gen_table.gd:13` | -| F2 | 每关瓦片 = **墙 16 件 + 地面 5 变体,合计 21 件**(v1.0 误写「墙类 21 件」,v1.1 订正:16 唯一墙名单单点在 `TILE_WALL_NAMES` 常量数组,件名数=16;21 为总数)按 `terrain_%s_%s.png` / `terrain_floor_%s_%d.png` 格式装载;源 dungeon 套为 v9.3 定稿,underdark/deep_underdark 套由程序换色产出;另有**不参与换色的板面相关件**:`flag_seal.png`(封印旗,三关共用独立可选件) | `game/presentation/views/board_view.gd:80-89`;`tools/recolor_terrain_tiles.py` 头注;素材实盘 `game/assets/art/board/`(underdark/deep_underdark 各 21 件与 dungeon 套同构;素材不入 git,用户裁定) | -| F3 | 换色方法 = 槽位家族重映射(wall/facade/floor/crater 四族),**亮度秩序逐像素保持**、确定性零随机、唯一色数与源一致;目标色表在脚本 `PALETTES` 内 | `tools/recolor_terrain_tiles.py:10-12`(方法注)+ `:40-60`(色表) | -| F4 | 现行换色色表读值:underdark 地面 `G_BASE (62,66,80)`、crater 最深 `P_DEEP (9,10,15)`;deep_underdark 地面 `G_BASE (46,48,64)`、crater 最深 `P_DEEP (5,5,9)`——**冷蓝紫、低明度、crater 近纯黑**;对照 dungeon 源 `G_BASE (88,66,50)` 暖中明度 | 同上 `PALETTES` | -| F5 | 色相域方向(机检在案):underdark ≈180°–260° 灰白蓝紫 / deep_underdark ≈200°–280° 蓝黑紫黑;断言「deep 墙顶明度恒暗于 underdark」 | `game/tests/unit/presentation/terrain_tile_sets_test.gd:61-64, :82`;方向权威 = art-bible §4.3 | -| F6 | 图类型换皮四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`)与恒定不变槽(信息语义色全图型恒定、格底两档明度关系恒定);格底硬指标:未开墙顶 L≥0.30、已开底走世界底层档候选 L 0.08–0.14、饱和 ≤0.55、避 300°–345° 禁入带 | [art-bible](../design/art/art-bible.md) §4.3 / §4.1「对比硬指标」/ §4.2 紫赤条 | - -### 2.2 UI 轴现状(舞台底与叠加层常量位点) - -| # | 事实 | 出处 | -|---|---|---| -| F7 | 舞台底 `STAGE_BG #3E342A`(62,52,42)= B 区舞台面板暗底;屏根 `BG_ROOT #3A2E22`;暖亮档 `BG_BRIGHT #453723`(提暖提亮禁近黑配色总纲在册) | `game/presentation/views/ui_kit.gd:111-113, :121`;`battle_stage_view.gd:44-47` | -| F8 | 视野迷雾叠加层:灯光区半径 `FOG_RADIUS 8`(基准值改动 = 非白名单须用户);**区外未开格 = 全黑不渲染(不透明纯黑盖全部叠层)**;区外已开格 = 记忆态灰显;雾轮廓 `UiKit.FOG_OUTLINE` | `board_view.gd:137, :817-822`;`board_cell_unit.gd:111-117, :252-256`;规格 = art-bible §6.5 + HUD框架「视野迷雾」节 | -| F9 | 数字墨三态管线(v3.4 定案):双峰纹理板(underdark/deep_underdark 系)= 色牌垫底 `DIGIT_PLATE + 深墨 #33261B`;亮族判据 p90 ≥4.5:1 / 均值 ≥2.5:1 | `board_view.gd:987-989`;art-bible §4.1 数字墨条 | -| F10 | 类型微光 v2 呈现**规格** = 内缘带状泛光 α170 / 带宽 cell÷8,亮度不压格底明度档(§2 微光例外);五组色带样张 v2 定稿。**v1.1 注**:类型微光游戏内**尚无独立实装**(呈现层仅接触带微光在跑;实施归同迭代 30 的未开格徽章批,见 §4A)——本卡 T1 的微光测面读数源=样张 v2 静态定稿图,实机渲染帧里没有该层 | art-bible §4.2「类型微光色带」条;HUD框架「未开格类型微光」节实装状态行(:130-142) | - -### 2.3 L2/L3 差异面(同批与否的判据) - -- 板型不同(12×12 vs 13×13)、色板不同(F4/F5 两套槽值,deep 系整体再暗一档)、格边长换算随板型变(06 在册「格边长三方取值不一致」条为已知偏差,本卡不动);数字墨模式两关同属双峰板色牌态(F9)。⇒ L2、L3 观感读数**必须分开设点**,修法同批——Q3 已裁甲·同批(2026-10-16 用户令,§10),两关槽值差异由 T1 分关读数(T1b)承载。 - -### 2.4 既有量化口径(样张 v3 与机检链,验收判据引用面) - -| # | 口径 | 定值 | 出处 | -|---|---|---|---| -| C1 | **A6 观感密度:明度梯度均值**(相邻像素相对亮度差均值——高频细节能量;低频双峰由 A3 承载) | ≥4.70(v1 同口径实测 4.09 上调 15%) | `tools/render_sample_sheet_v3.py:26, :338, :1007-1022`(历史脚本注释含 v1 实测值)。**v1.1 核注**:该组断言(A3/A6/F6)现行作用面 = 样张主板(`terrain_*_dungeon` 拼板,脚本 `:130-131`)——L2/L3 瓦片改动**既不会触动这组闸、也测不到它们**;「分关实测」属本批新建读数件(T1b),非现成能力 | -| C2 | **F6 立面双明度带** | Δ≥18(现行执法定值 `FACADE_MIN`) | 同上 `:339`、`:996` 消费点与 v3.5 冻结口径注(`:1154`) | -| C3 | **A3 图底分离**(墙/地) | **现行执法 = v3.5 冻结定值 A3b Δ≥30**(方向稿实测 38);旧 Δ≥55 系色牌制地板 L0.036 时代校定,与格底分档带数学冲突已退役 | 同上 `:975-979`(退役注+现行 check)、`:1154`;`:23, :340` 之 55 为历史注释残迹 | -| C4 | 格底明度档 | §4.1:世界底层档候选 L 0.08–0.14 / 墙顶 L≥0.30 / 饱和 ≤0.55(48 色上限与 RGB 三通道差 ≥8/255 双门在 §4.1 增量纪律在案;「待定现用」态释义同节) | art-bible §4.1 | -| C5 | 渲染闸现行链 | `tools/render_gate.sh` 四段:shot_probe 七屏→`shot_checker.py` A–D+F 语义断言(B 文字对比 ≥4.5:1 / C 明度三档带 / D 文字禁压纹理 / F 文字在判据〔2026-10-15 补〕;E 焦点预算归人闸)→ fx/board 取证 → 棋盘三张 golden(差 ≤16、changed ≤2%)→ 菜单 golden;基线重制工具 `tools/golden_baseline_refresh.sh`(缺省模式=棋盘三张;`--menu`=菜单全屏;素材缺位拒跑;呈现批 agent 自行换代+提交说明强制写明触发原因——权限口径在其头注) | `render_gate.sh:8-25, :109-155`;`shot_checker.py:8-19`;`golden_baseline_refresh.sh:2-14` | -| C6 | 三关棋盘抓帧承载(读数采样源) | `board_shot_probe` targets = L1_dungeon / L2_underdark / L3_deep_underdark,随 render_gate 周期跑;同关驱动确定性=种子 420000+关号 + novice 18 步 + 1.2s 动画完结等待(可复现)。**v1.1 边界注**:帧面 = 空视口上裸挂 BoardView(900×900)——棋盘瓦片区与迷雾遮罩层**在帧内**,**舞台底/屏根像素不在帧内**(battle_stage_view/BG_ROOT 未实例化);「舞台底/叠加层只在渲染帧里存在」系 v1.0 不准确表述,舞台底为常量平铺(UiKit 可读值)。且 render_gate 过程帧落 mktemp 即弃禁入 git——T1 用帧须自行留档于库外目录 | `game/smoke/board_shot_probe.gd:34, :38-66`;`render_gate.sh:22`(过程产物纪律) | - ---- - -## 3. 设计契约(红线,违反 = L3 停机呈报) - -🔴 **契约 1 · 零玩法逻辑变更**:只动呈现(瓦片素材/色表、舞台底与叠加层常量、样张脚本判据)。板生成、数字真值、迷雾判定逻辑、`FOG_RADIUS` 基准值(改动须用户,`board_view.gd:137` 注)零触碰。 - -🔴 **契约 2 · 禁吞并文字位条**:「呈现层残余 <4.5:1 文字位」是另一面(该条已随迭代 26 完成,本卡不复活、不并账);本卡发现的任何文字位新红点 = 新登记条目,另批处理。 - -🔴 **契约 3 · 色板纪律不破**:任何换色/重产色板须过 art-bible §4.1 增量纪律双门(48 色上限、与既有任一色 RGB 三通道差 ≥8/255)+ §4.2 语义检查与信息面禁入带 300°–345°;素材轴甲案并须保持 recolor 脚本的亮度秩序逐像素保持方法学(改了方法 = 换案,须重述本契约)。 - -🔴 **契约 4 · 样张先行、方向人闸后落码**:T2 任一修法落码前,必先出**改前/改后并排对比样张 + 读数表**给用户定性;用户未确认方向 = 停在样张层,禁先行改素材改常量。此条是「防改一轮还是不满意」的机制本体。**v1.2 注**:素材轴甲/乙裁决呈报件(§6 T1 呈报硬步骤)与本闸是同批产物——用户呈报现场裁甲后,裁甲案时本闸即已过关、不重复呈报;裁乙案时乙方向样张另走本闸。 - -🔴 **契约 5 · 机检 ≠ 观感,前置人闸承担方向证真**:读数达标只构成必要条件,机检不能证明满意——「证真」面由**前置**人闸承担(T1 定性闸〔06 已裁〕+ 契约 4 方向样张闸)。入库后的实机目检轮按 2026-10-12 用户令口径执行(AGENTS.md 红线「真人检测只登记不阻塞」):目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单即完成义务、不卡入库(「入册 07」列反哺点);**禁把「机检全绿」写成「用户满意」的等价表述**——用户复判否决时按 V4 回补(08 行回待做 + 06 记残留、下批重开,落文按 v3 口径归文档批)。(v1.1 改写注:v1.0 本条「完成判定必须含用户实机目检轮、目检未过禁宣布在役」与 2026-10-12 用户令冲突,已对齐。) - -🔴 **契约 6 · golden 基线换代显式化**:改图必破基线——重制走 `tools/golden_baseline_refresh.sh` 显式流程(缺省模式重制棋盘三张:board_shot_probe 抓帧→`golden_board_crop.py` 按 meta 坐标裁剪→覆盖 `game/tests/golden/` 三张;触及菜单态加跑 `--menu`),并逐屏呈报换代面(新旧基线并排,沿 render_gate S2 停机点口径);权限与义务=呈现批 agent 自行换代、**提交说明强制写明触发原因**(refresh 脚本头注 Q6 在册);前置=素材齐盘(脚本逐项守卫,缺位拒跑)。**禁先刷基线后改图**(基线是判据不是障碍物)。 - ---- - -## 4. 范围边界 - -**做**:L2/L3 棋盘区域观感的定性归因(T1)、按轴修复落码(T2)、同批策略(T3)、验收三件套与基线换代(T4)、产出物落位(T5)。 - -**不做**(明示去向): -- 不动 L1 dungeon 套外观——除非 T1 读数显示问题为系统性共因(如迷雾档/舞台底全关同因,则 UI 轴修法天然全关生效,素材轴仍只动 L2/L3 色表); -- 不动数字墨三态管线本身(`_digit_ink_mode` 选模逻辑维持),只动其消费的板面;改后三模式断言 `terrain_tile_sets_test` 必仍绿; -- 不做「格边长三方取值不一致」条的处置(06 在册待扩板定档,另批); -- 不做「立绘清晰度回退评估」/「素材升档重产」两未决项的代裁(本卡甲/乙裁点仅覆盖棋盘瓦片重产路线,且已挂至 T1 出口呈报硬流程步骤——裁决留痕见 §10,未决项不代裁、禁重开); -- 不动未开格类型微光的呈现规格(§4.2 单通道纪律维持;**该层引擎尚未实装,实施归未开格徽章批——§4B**;T1 会把微光层列为读数额外测面〔证据级别=样张 v2 静态图,F10〕,T2 无「动参数」可言——若归因指向它,处置为联裁或走 art-bible §4.2 修订登记)。 - ---- - -## 4B. 跨卡依赖(同迭代 30 的两张同板面批——v1.1 新增;v1.2 按 2026-10-16 三卡已裁定案改实) - -本卡与**未开格类型徽章批**(迭代 30 卡①,已入库合并 7ffd1dc0,卡片已退役)、**战斗一屏样张批**(`需求卡片-战斗一屏样张批-2026-10-16.md`)共用 L2/L3 板面,事实与已裁结果如下(只列事实与裁决留痕,他批未裁项仍不代裁): - -| # | 交叠面 | 事实 | 本卡处置 | -|---|---|---|---| -| X1 | **徽章批微光层 × 本卡格底/墙顶瓦片改色,同一张未开格面** | 徽章批把五组类型微光实装进未开格(其 T0-② 五组明度档以 art-bible §4.1「未开格底 L≥0.30 不被压破」为约束基线);本卡素材轴改的正是 `tile_closed`(墙顶/未开底)明度——**两批改同一板面、先后互为约束**:本卡若抬/压墙顶档,徽章批五组明度档取值基线随之移动。art-bible §4.3 共同纪律已册:「三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险)」(:379) | 色板/微光互辨复测两批并档一次跑;本卡新色表呈报件须含「对五组微光色带吞没风险」逐项比对;**v1.2 定实(2026-10-16 用户令)**:三卡串行序位徽章→样张→观感(排期栏),golden 棋盘三张换代次数=先落者(徽章批)刷一次、本卡作为后落者再刷一次,不再挂呈报定序;徽章批微光**明度档 provisional 值**(其 Q2 已裁甲=本批定档)与本卡**格底明度档同基线**(art-bible §4.1 格底档 L 0.08–0.14、墙顶/未开格底 L≥0.30)——两卡改格底/叠光时须逐位比对 golden 防互踩,该约束已同步写入 §6 T2 修法约束 | -| X2 | **战斗一屏样张批 Q1(素材输入级别)/Q3(渲染手段)与本卡乙案(瓦片重产)** | 样张批 Q1 丙案语义 =「样张反向给素材重产提规格」;样张批明示「本批不重产任何正式素材」——**重产的产出义务全在本卡(若裁乙)**,样张的规格输入义务也在本卡上游对齐;若样张批先以占位板面冻结,本卡乙案重产后整屏样张的板面内容过期 | **v1.2 定实(2026-10-16 用户令)**:样张批已裁 **Q1 丙**(样张反提素材规格)/**Q3 乙**(引擎实拍+shader)——本卡乙案(远程生图重产)**若**在 T1 出口呈报后被裁,瓦片规格**必须与样张卡已冻结的目标规格清单对齐,先后次序=样张规格先行、本卡乙案在后**;甲案 recolor 换色不触样张主板(dungeon 拼板,C1 核注),对样张批零连带、不受该次序约束 | -| X3 | **徽章批「不动格底明度档、棋盘瓦片素材、图类型换皮四槽」红线(其 §4 不做条)** | 徽章批单向避撞本卡面;反向不成立——本卡改瓦片会动其微光绘制基面(其 F5:微光画在 CellUnit `_draw` 瓦片层上) | 本卡任何改图产物过 V5 时须同时跑徽章批既有断言面(若其已入库);串行序位已定实(徽章→样张→观感,排期栏)——徽章批先落,本卡 T1 报告按该序位复核 X1/X3 承接项,不再挂定序呈报 | - -**结论笔**:两依赖均为**次序与规格联动**问题,不是范围冲突;2026-10-16 用户令已定案——串行序位徽章→样张→观感(排期栏)、Q3 已裁甲(同批)、Q2 甲/乙裁点挂 T1 出口呈报硬流程步骤(§6 T1/§10);本卡无悬空待裁点。 - ---- - -## 5. 关联文档同步面 - -> **v1.3 执行口径(2026-10-17 文档同步闸 v3)**:本批(代码实现批)**禁写 `design/` 整目录与根规则文件**,唯一可写目录 = `reports/`(`active.md` 唯一例外)。下表「同步义务」列一律执行为「列进 `reports/iter30-反哺点-<完成日>.md`:哪个文件哪一节、改成什么、依据,用户会话裁决后归文档批落文」——下表保留原关联点事实供写反哺点条目时对表。 - -| 文档 | 关联点 | 同步义务(v1.3 全部=反哺点列清单,另注者除外) | -|---|---|---| -| [06-待办清单](../design/gdd/06-待办清单.md) 本条 | 状态行改写(定性报告交付/完成注记);T1 发现的新红点若立新条则同批登记 | 反哺点 · 列清单待裁 | -| [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md) 「五 · 表现」棋盘观感行 | 待做→在役(完成定义第 4 件;批入库时改写并顺带 07 目检登记注;用户复判否决走 V4 回补——行回待做+06 记残留) | 反哺点 · 完成时列清单 | -| [art-bible](../design/art/art-bible.md) §4.1/§4.3(素材轴改色表值)或 §6.5/§7(UI 轴改常量方向) | 数值定值单点纪律:改值 = 走该节修订并登记(「待定现用」态),禁只改代码不改文档 | 反哺点 · 列清单待裁(条目写明改值与修订登记要求) | -| [HUD框架](../design/gdd/systems/表现与支撑/HUD框架.md) 视野迷雾节 | 仅当 T2 裁到迷雾灰显档参数时 | 反哺点 · 条件列清单 | -| [07-体验验证清单](../design/gdd/07-体验验证清单.md) | T4 登记实机目检条目(L1/L2/L3 并排看后问卷式回报) | 反哺点 · 列清单待裁(目检项另进 reports/ 实现报告目检总清单) | -| [roadmap](../roadmap.md) | 迭代 30 行已编入(2026-10-16 用户令,行已在案);余留义务=估时刷新(T5) | 反哺点 · 列清单待裁 | -| `active.md` 状态记录 | 本批条目进度刷新 | **本批更新(唯一例外 · 会话状态源)** | -| `tools/recolor_terrain_tiles.py` / `game/tests/golden/` | 甲案色表修订 = 脚本内定值换代;golden 基线三张重制 | 工程面 · 随修法落地(可写) | -| [playnote](../playnote.md) | 历史试玩记录不回改(沿革留档),本卡即其正式承接 | 无义务 | - ---- - -## 6. 任务卡 - -> 估时按工作日口径;每卡出口自跑轻闸;批末重闸 = `tools/run_all_gates.sh` 按改动域选档(本批 → `--code`)全绿才合入(脚本即唯一闸清单,卡内不另列名单)。 - -### T1 定性步骤(人闸前置;含 T1b 新建采样件合计 ≈2–2.5d,**必先做,产出物 = 定性报告 + 对比样张**) - -逐关(L1 参照位·注意含 10×10 与 12×12 两板型〔F1〕 / L2 / L3)三测面采样。**采样源按测面分治(v1.1 修正)**: -- 测面一(棋盘瓦片区)与测面三(迷雾遮罩部分)= `board_shot_probe` 实机渲染帧(确定性可复现,C6;过程帧 render_gate 即弃——本批帧自行留档于库外目录,读数表进 `reports/iter30-实现报告-<完成日>.md`);**禁拿素材文件代替渲染帧**(迷雾遮罩/揭示态只在渲染帧里存在); -- 测面二(舞台底与屏根)= **现有探针拿不到**(board_shot_probe 帧内无舞台底/屏根像素;shot_probe 战斗屏只到 L1 首战)⇒ 由 **T1b 新建采样件**补齐,见下;退而求其次可用 UiKit 常量×帧内实测值合成 WCAG 对(可算,但板缘对比带需几何语境,合成判据只能佐证不能实证); -- 测面三中的类型微光贡献 = 读数源仅样张 v2 静态定稿图(引擎未实装,F10),T1 报告如实标注该测面的证据级别。 - -输出读数表: - -| 测面 | 指标(全部数值化,禁裸形容词) | -|---|---| -| 棋盘瓦片区 | 整板明度直方图 p10/p50/p90;A6 同口径**明度梯度均值**(相邻格/相邻像素亮度差——高频能量);唯一色数与色域跨度 | -| 舞台底与屏根 | `STAGE_BG`/`BG_ROOT` 对棋盘墙顶、米白装饰族的两两 **WCAG 对比对**;三档带序(shot_checker C 断言口径的层带思想,按帧实测复算——其现行取样面是 L1 战斗屏,不直接复用)实测值——**取样依赖 T1b 全框帧** | -| 叠加层 | 迷雾**全黑档面积占比**(区外未开格 = 不透明纯黑)与记忆档灰显值;色牌占板面像素占比;微光带宽与泛光 α 的观感贡献(**证据级别=样张 v2 静态图,引擎未实装——F10**;若徽章批同迭代先行实装则可升级为帧内实测,见 §4B) | - -**T1b 新建采样件(批内任务,≈0.5–1d;v1.1 补——v1.0 默认现成件够用,实查不成立)**:给测面二供帧、并承载 **L2/L3 分关读数**(直方图/A6 同口径梯度按关出值——样张 v3 断言现只跑主板,C1 核注)。落点取一(白名单 1 域内):① 扩 `board_shot_probe` 加全框模式(BoardView 挂进 battle_stage_view/屏根底之上出 L2/L3 全框帧,与既有三张 golden 取样帧互不污染);② 新建 L2/L3 战斗整屏取证探针(shot_probe 真实路径口径只达 L1 首战,扩关需确定性到达方案)。出口判据:帧面含棋盘+舞台底+屏根三层且逐跑可复现。 - -**归因判据(写死在报告模板里)**: -- 素材轴信号 = L2/L3 板区读数与 L1 参照位在 明度带(对照 §4.1 档)/ 梯度均值 / 色域 上的偏离为主因(例:crater `P_DEEP (5,5,9)` 近纯黑叠加迷雾纯黑 ⇒ 大面积死黑;亮部墙顶跨度过大 ⇒ 闪烁感;「纹理太碎」假说在案最强证据 = 2026-10-14 美术审计结论条「第二 / 三关地面是近黑斑加亮筋的双峰纹理——数字无论亮墨还是垫牌,盯久了都会累。这不是再叠一层界面能救的」〔`reports/美术审计-cursor会话存档-2026-10-14.md` 结论区〕); -- UI 轴信号 = 舞台底/叠加层贡献为主因(例:全黑面积占比 × 边缘对比产生的频闪感;`STAGE_BG` 对板缘对比带过宽); -- 两轴共因 = 两类偏离同时显著(报告须给出各自量级占比,修法按主次分配工作量)。 - -出口 = 定性报告 + **改前基准样张**提交用户,过 **T1 出口定性人闸**——06 已裁硬步骤(P1:「开工前先过『素材轴 / UI 轴』定性人闸」),闸上同时冻结轴归因结论与 §7 V2 定向目标带数值;v1.0 曾误把该闸本身列为待裁点 Q1,v1.1 撤销(禁再问已裁项)。 - -**T1 出口素材轴甲/乙裁决呈报点(v1.2 新增硬流程步骤——Q2 延裁所挂裁点的具名呈报动作,裁决留痕见 §10)**: -- **触发条件**:T1 归因结论产出即触发,随定性报告一并呈报(无论归因指向哪条轴,呈报不可省略); -- **动作**:开工默认先做**甲案(recolor 换色)候选样张**——按甲案试算槽值出改前/改后并排样张,用 T1b 分关读数证伪「纹理太碎」假说(甲样张读数达标而用户方向仍否决 = 指向乙); -- **产物与落点**:改前/改后并排样张 + 分关读数表(含甲案试算槽值清单)随定性报告呈报用户。**v1.4 预授权(2026-10-17 用户裁)**:甲案样张读数达标即按 §10 Q2 判据**自动走甲**、不停机等现场裁;仅当读数证伪「纹理太碎」假说时才呈报裁乙(呈报内容照旧:改前/改后并排样张+分关读数表)。结论按 §10 格式补记留痕后即成 T2 执行依据——裁点由该具名动作承载,全卡不留悬空待裁点。 - -### T2 修法(按轴分支;≈1.5–2.5d,落码前须过契约 4 对比样张人闸) - -**素材轴——甲/乙裁点已由 2026-10-16 用户令定为「延至 T1 定性读数出具后再裁;开工默认先做甲案候选样张以证伪纹理说」(裁决留痕 §10;呈报硬流程步骤见 §6 T1 末)**: - -| 案 | 产出物**相对现状新增什么** | 效果上限 | 成本与风险 | -|---|---|---|---| -| **甲 · recolor 程序换色重校** | 新色表(`PALETTES` 两族槽值修订:抬地面明度地板、压 crater 近黑与墙顶亮端跨度、家族间 Δ 重排)+ 改前/改后并排样张 + 基线换代。输入面(v1.1 实查):脚本只重映射 wall/facade/floor/crater 四族颜色的 `terrain_*_dungeon.png`→underdark/deep_underdark 两套,**L2/L3 板面瓦片 2×21 件全在其输入面内**;不在输入面的板面相关件=`flag_seal.png`(三关共用,若归因触它另行呈报) | 确定性、可复现、逐项可机检比对;**明度水平与色相可调,纹理高频结构逐像素保持**——若 T1 归因指向「亮度秩序/对比带」,本案直达;若指向「纹理本身太碎/太 busy」,本案调不动(方法学上限——脚本头注定死「亮度秩序逐像素保持」,高频结构不改;在案佐证=2026-10-14 美术审计「双峰纹理…不是再叠一层界面能救的」) | 低;零新素材;不破 §4.3 三关方向需在修订登记中说明偏转幅度 | -| **乙 · 瓦片重产(远程生图管线)** | 按新规格重出 L2/L3 瓦片([remote-gen-prompts](../design/art/remote-gen-prompts.md) 对话操作单 + [art-prompts](../design/art/art-prompts.md) 词库),纹理本体可重设计 | 上限高——高频细节/材质/装饰密度均可换;代价 = 非确定性、过闸周期长、需重锁色板与重跑 `terrain_tile_sets_test`+样张全套 | 高;与 08「五 · 表现」**待裁**行「素材升档重产」及 06「资产升档重产批」条(按名指路,08 未决项表行号以实查为准)方向相邻不同面——该批=立绘/小人帧尺寸升档(2026-10-04 用户令暂不做、重启=用户点名),本卡=棋盘瓦片色板/纹理方案重做,**裁本案不等于放开升档**,呈报须带划界;样张批 Q1 已裁丙案(样张反提素材规格,2026-10-16 用户令)——本案规格以其已冻结目标规格清单为上游,次序=样张规格先行(§4B X2) | - -**T2 修法约束(v1.2 新增,承载 §4B X1/X2 已裁事实)**:①本卡改格底明度档与徽章批叠微光同基线(art-bible §4.1 格底档 L 0.08–0.14)——落码后两卡逐位比对 golden 棋盘三张防互踩;②串行序位徽章→样张→观感(排期栏),本卡落码在两批落码之后,基线换代走契约 6 显式流程;③若 T1 出口裁乙,瓦片规格与样张卡已冻结目标规格清单对齐,次序=样张规格先行(§4B X2);裁甲则对样张批零连带。 - -**UI 轴——参数重校(现读常量与候选方向,全部走样张人闸后定值)**: -- 迷雾全黑档:现值 = 不透明纯黑盖全部叠层(HUD框架/art-bible §6.5 三档信息阶梯的既有裁决,改它 = 改概念定义,须回 HUD框架 修订);候选方向 = 保持三档结构下调不透明度或对纯黑加主题 tint——**列为 T2 内二级裁点,报告须呈报不动定义的纯参数位有哪些先穷尽**; -- 舞台底:`STAGE_BG #3E342A` 对板缘对比带宽——候选 = 向 `BG_BRIGHT #453723` 方向提一档或收窄棋盘外缘留白; -- 色牌/微光占用:色牌垫底是 v3.4 定案(改板纹理高频结构才谈撤牌);**类型微光引擎未实装(F10),本卡对该层无可动参数——读数若显示微光规格(α170/带宽 cell÷8)贡献显著,处置=与未开格徽章批联裁实施参数或走 art-bible §4.2 修订登记,呈报为 L3 停机点(触既定裁决面),不在本卡单方改动**。 - -### T3 L2/L3 同批与否(≈0.25d 结论笔) - -事实:两关色板两套槽值、板型 12×12 vs 13×13、数字墨同模式(§2.3)。两案成本对照(v1.1 中立化留档;v1.2 已裁,见下):**同批** = 一次基线换代、一轮目检登记,色表两套槽值各改各的、互不连带;**分两批** = golden 链换代两次、目检登记两轮,单批体量更小、L3 可在 L2 复判后单独叫停。**Q3 已裁(2026-10-16 用户令,§10):甲·同批**——理由=基线换代与目检各只走一轮;两关槽值差异由 T1 分关读数(T1b)承载,不需以拆批消化。 - -### T4 验收三件套与换代(≈1–1.5d) - -1. 机检读数达标:见 §7 V2 判据表; -2. **渲染闸基线换代**:跑 `tools/golden_baseline_refresh.sh`(缺省模式=棋盘三张;触及菜单态加 `--menu`)显式重制基线,呈报换代面与新旧读数差、提交说明写明触发原因(契约 6 实操步骤); -3. 用户实机目检轮:目检项(玩法:L1/L2/L3 各开一局,并排回报「费劲感」相对改善)登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单——登记即完成本批义务、不阻塞入库(2026-10-12 用户令;「入册 07」列反哺点);用户复判否决走 V4 回补。方向级否决(样张层)已在契约 4 前置拦截,本步只剩终验。 - -### T5 产出物落位卡(≈0.5d,末卡——三份 reports/ 文件写齐才算收口) - -轻闸全绿后、合并前,把本批三份 `reports/` 产出物写齐(权威文档与根规则文件零直改;`active.md` 状态记录照常更新): - -1. `reports/iter30-实现报告-<完成日>.md`——各卡状态+**实机目检总清单**(T4-3 目检条目)+遗留读数义务+T1 定性报告读数表归档指引+变异验证记录表(新建断言/读数件的注入实验记录); -2. `reports/iter30-代拍板追认单-<完成日>.md`——§9 白名单内代拍板逐项留痕(含 Q2 甲/乙现场裁决的留痕补记); -3. `reports/iter30-反哺点-<完成日>.md`——§5 同步面每条一落点(哪个文件哪一节、改成什么、依据):06 本条状态行、08「五 · 表现」棋盘观感行(含 07 目检登记注与 V4 回补条款)、art-bible §4.1/§4.3 或 §6.5/§7 修订登记条(色值/常量若动)、HUD框架迷雾节(迷雾参数若动)、07 入册条、roadmap 估时刷新。 - -**原 §5 机械面直改义务零执行(v3 口径),落文归文档批。** - -**估时合计 ≈ 5–7d**(v1.1 上调:T1 新增 T1b 采样件 0.5–1d;v1.0 为 4–6d——彼时漏了采样件,批内各卡加总实为 4.25–6.25d);**v1.2 估时不动**:Q2 延裁的甲案候选样张与契约 4/T2 样张同源产出,仅时点前移至 T1 出口呈报点,批内不新增总量;T1b 职责不变(全框帧+分关读数与甲/乙裁决无涉),不因本批裁决再调;天然切分点:**T1 末**(定性报告+甲/乙裁决呈报即交付物,人闸天然停点)、**T2+T3 末**(修法落地)。 - ---- - -## 7. 验证闸(逐需求点验收清单) - -| # | 需求点 | 测什么 | 判据 | -|---|---|---|---| -| V1 | T1 定性报告 | 读数表覆盖 3 关 × 3 测面 × 各指标(§6 T1 表全列,测面二经 T1b 全框帧);L1 参照位在场(含两板型,F1);归因结论引用数值;**v1.2 增**:甲/乙裁决呈报件(甲案候选样张+分关读数表)随报告同出、用户当场裁决记录在案(§6 T1 呈报硬步骤) | 报告模板齐件 + 用户过闸记录在案(**T1 出口定性人闸=06 已裁硬步骤,P1**;**v1.4 预授权:人闸只确认轴归因与修法方向,V2 定向目标带数值由批内按 T1 实测读数自定并随定性报告呈报,禁拍脑袋现编**)+ 裁决留痕补记 §10 | -| V2 | 修法后机检达标 | **既有口径不破坏**:样张主板断言 A6 ≥4.70 / F6 Δ≥18 / A3b Δ≥30 / 格底明度档(已开 L 0.08–0.14 / 墙顶 ≥0.30 / 饱和 ≤0.55)保持绿(v1.1 注:该组现行只跑 dungeon 拼板主板,对 L2/L3 属「不动即可」约束而非覆盖,C1 核注);**L2/L3 分关实测 = T1b 新建读数件出值**;shot_checker A–D+F 零新增红;`terrain_tile_sets_test`/`ui_contrast_probe` 全绿。**定向判据**(针对「累眼」的归因侧):若 T1 判「死黑面积」→ 全黑档面积占比与明度直方图 p10 改善入目标带;若判「对比带过宽」→ 墙顶/地面 Δ 与板/舞台底对值入 T1 定标带——目标带数值由 T1 报告给出、**T1 出口定性人闸冻结**,禁拍脑袋现编。**目标带自设的合法性注(v1.1)**:art-bible §4.1「待定现用」态只管圣经在册数值(现行即执法、调整=修订登记,:207 释义);本卡自设目标带**首先只是批次验收判据**,过闸即合法生效于本批;若某带值要长期执法,须写入 art-bible 相应节修订登记转「待定现用」态,禁以批次判据身份直接成为执法值 | 读数表(改前/改后并排)进 `reports/iter30-实现报告-<完成日>.md`;**v1.4 预授权:目标带数值由批内按 T1 实测读数自定、随定性报告呈报即生效**(原「人闸冻结目标带」改为「人闸确认方向与量级」,数值仍禁拍脑袋现编) | -| V3 | 渲染闸换代 | 先跑 `render_gate.sh` 见棋盘 golden 段红(确认破的是预期面)→ 跑 `golden_baseline_refresh.sh`(缺省=棋盘三张,菜单态触及加 `--menu`;素材齐盘前置)→ 复跑 `render_gate.sh` 全绿;三张新旧基线并排呈报,changed 面 = 预期面,零超预期漂移 | 闸日志 + 呈报件;提交说明含触发原因(契约 6) | -| V4 | 用户实机目检 | 目检项登记(实现报告目检总清单;「入册 07」列反哺点)+ 用户回报「费劲感」相对改善且 L1 无退化——**登记不阻塞入库(2026-10-12 用户令)**;用户复判否决 = 回补机制触发:08 行回待做、06 本条记残留重开(落文按 v3 口径经反哺点归文档批)、返工起点=T1/T2 重议(不回滚已入库码面,按新条处置) | 主观判据的唯一权威=用户回报;入库前方向由契约 4 样张闸把关 | -| V5 | 邻接零回归 | 冒烟全套 + 单元 + 探针链零新增红(呈现面触碰加跑 ui_contrast);同迭代徽章批断言面零回归(§4B X3) | 重闸 = `tools/run_all_gates.sh --code`(脚本即唯一闸清单) | -| V6 | 反哺点清单 | §5 所列各条(08 行改写要求+目检登记注、06 状态刷新、art-bible 修订登记〔色值若动〕、HUD框架〔迷雾参数若动〕、07 入册、roadmap 估时)在 `reports/iter30-反哺点-<完成日>.md` 逐条有落点(文件/节/改成什么/依据) | 件核:§5 反哺点行数=清单条数 | - -**闸口径**:机检(V2/V3/V5)自动判;V1 = 人闸停点(T1 出口定性闸,06 已裁);V4 = 登记后回补机制(非停点,2026-10-12 用户令);契约 5——机检绿 ≠ 用户满意,禁作等价表述写入 06/08。 - ---- - -## 8. 异常分级 - -- **L1(自救)**:采样脚本参数笔误、读数表排版缺件、文档行号漂移——立红即修。 -- **L2(记录继续)**:色表具体槽值、候选样张的构图取舍、07 目检条目的问法措辞——批内消化并登记。 -- **L3(停机呈报)**:①T1 读数显示 L1 同病(范围外溢,重划批次);②归因指向三态墨管线/迷雾概念定义本体(触既有裁决面);③用户否决对比样张方向两次以上(说明读数口径与体感脱节,须重议 T1 指标本身);④golden 重制后 changed 面超出预期(隐性回归);⑤色板增量纪律双门过不了且无合并方案;⑥跨卡同板面次序破裂——与徽章批/样张批的 §4B 联动被裁决成互相破坏已冻结断言面的顺序(§4B 呈报件被否即停,禁单方推进)。 - ---- - -## 9. 代拍板白名单(超清单必呈报) - -1. 采样读数脚本的实现落点(新工具件 vs 扩 `shot_checker.py`,禁动其现有 A–D+F 断言语义)。**v1.1 注**:T1b 全框帧件(扩 board_shot_probe 或新建 L2/L3 整屏探针)即落在本条授权域内。 -2. 明度直方图/梯度均值在「整板」与「灯光区内」两口径的取舍(以 T1 报告说明为准)。 -3. 甲案色表的具体槽值设计(参数域内自由,出域即 L3)。 -4. 对比样张的排版形式(并排同屏 vs 逐关两帧)。 -5. 目检轮的注册话术与回报表格式(07 口径内)。 -6. 基线重制的执行时机(T2 出口 vs T4 出口,取一)。 -7. 提交切分与 worktree 分支命名(走既有纪律)。 - ---- - -## 10. 裁决留痕(v1.2 换代:原 Q1 撤销结论保留——已裁项禁再问;Q3 已裁甲·同批;Q2 延裁留痕;全卡零悬空待裁点) - -**统一来源(逐条留痕均引此令)**:「2026-10-16 用户令:三卡全部待裁项按推荐方案裁决(用户将裁权授出,由主线会话代拍板留痕)」。以下 Q2/Q3 各行引该令留痕;两案选项原文照录,供后续复看。 - -**已裁移除项(原 Q1「定性报告要不要用户过目才进 T2」)——撤销结论不动(2026-10-16 用户令未触及,维持 grilling 结论)**:06 本条条内已明文裁决——「开工前须先定性(沿用既有裁决)……**开工前先过『素材轴 / UI 轴』定性人闸**」(06:449/:453,2026-10-13 用户裁定条;08 的 git 提交史同款注「P2 棋盘观感标『Alpha 阶段需完成 · 开工前过素材轴/UI 轴定性人闸』」)。「要不要过闸」不成立为问句,本卡处置 = 落为 T1 出口**流程硬步骤**(P1/V1),闸上同时冻结轴归因与 V2 目标带数值——**既裁人闸,不占裁点**。 - -### Q2 · 素材轴修法走哪案:程序换色重校(甲)还是瓦片重产(乙)?——**延裁留痕** - -- **裁决(2026-10-16 用户令,来源句见本节顶)**:「待 T1 定性读数出来后再裁甲/乙;开工默认先做甲案(recolor 换色)候选样张以证伪纹理说」。 -- **v1.4 预授权(2026-10-17 用户裁):延裁改判据自动裁,不再停机等现场裁**——甲案候选样张读数达标(进入 §7 V2 定向目标带)→ **直接走甲**;仅当读数**证伪**「纹理太碎」假说(甲样张读数不达标、方向仍不成立)时才呈报裁乙。乙案分支的代价与划界(P4/§6 乙案行:本卡重产 ≠ 放开升档、规格与样张卡已冻结目标规格清单对齐)全部不变。 -- **延裁≠回避**:裁点挂到 T1 出口的**具名呈报动作**——硬流程步骤(触发条件/动作/产物)已成文于 §6 T1「素材轴甲/乙裁决呈报点」:产物=改前/改后并排样张+分关读数表,呈报后**用户当场裁**。本节不留悬空 Q。 -- **判据(原文照录)**:判据 = T1 归因指向:亮度秩序/对比带问题 → 甲可直达;纹理本身太碎太 busy → 甲调不动(recolor 头注定死「亮度秩序逐像素保持」,方法学上限;碎纹理假说在案证据 = 2026-10-14 美术审计双峰纹理结论条),须乙。乙与 08/06「素材升档重产」的关系已划界(P4/§6 乙案行):本卡重产 ≠ 放开升档,裁乙不重开该未决项。 -- **选项原文(保留)**:甲=recolor 换色重校(确定性、可复现、逐项可机检比对、零新素材;效果上限 = 参数域内明度/色相重排);乙=远程生图重产(可重设计纹理与高频细节,上限高;周期长、非确定性、全套闸重跑;若裁,规格与样张卡已冻结目标规格清单对齐、样张规格先行——§4B X2)。 -- **换向处置**:呈报点甲样张被当场否决→裁乙,属裁决规则本身(即「证伪纹理说」动作的出口分岔),不计入 §8 L3③「否决两次以上重议 T1 指标」计数;裁乙即为批次正式进入 T2 乙案行执行。 - -### Q3 · L2 与 L3 同批修还是分两批?——**已裁·甲(同批)** - -- **裁决(2026-10-16 用户令,来源句见本节顶)**:**甲·同批**。理由 = 基线换代与目检登记各只走一轮;两关槽值差异(两套色板槽值、12×12 vs 13×13)由 T1 分关读数(§2.3 分关设点 / T1b)承载,无需拆批消化。 -- **事实(原文保留)**:两关色板两套槽值、板型 12×12 vs 13×13、数字墨同属双峰板色牌态;06 以单条覆盖两关。 -- **选项原文(保留)**:甲=同批(一次基线换代、一轮目检登记,色表各改各的);乙=分两批先 L2 后 L3(单批更小、L3 可在 L2 复判后单独叫停;基线换代两次、目检登记两轮)。 - -**开工门(v1.2 定实)**:Q3 已裁甲·同批;Q2 裁点由 T1 出口呈报硬流程步骤承载(§6 T1)——开工门 = U0,用户 `/iter` 发令即开(已编入迭代 30,2026-10-16 用户令,排期栏);原「Q2/Q3 裁决落」前置表述不再成立。本卡全卡无悬空待裁点(§10 之外各处 Q 指涉均已改为裁决留痕/流程步骤引用)。 - -**U1 预授权(2026-10-17 用户于开工前一次性决断,防开发中反复打断)**: -1. **Q2 判据自动裁**——甲案候选样张读数达标即走甲,不停机等现场裁;仅读数证伪「纹理太碎」才呈报裁乙(§10 Q2、§6 T1 出口呈报点)。 -2. **V2 定向目标带授权批内自定**——按 T1 实测读数定并随定性报告呈报;T1 出口定性人闸(06 已裁硬步骤,不可跳过)只确认轴归因与修法方向。 -3. 其余 L3 停机点维持不变:触既有裁决面类(L1 同病外溢/迷雾概念定义本体/方向被否决两次以上/golden changed 超预期/色板双门/跨卡次序破裂)一律停机呈报。三卡串行序位不变(徽章→样张→观感),本卡位第 3。 - ---- - -## 11. grilling 审查记录(v1.0→v1.1,2026-10-16 对抗性审查;逐攻击面:结论/证据/处置) - -| # | 攻击面 | 结论 | 证据(2026-10-16 实查) | v1.1 处置 | -|---|---|---|---|---| -| 1 | 工具实存性 | `board_shot_probe` **实存非臆名**(三关 targets 名/行号 :34 全对,且自带确定性驱动可复现);render_gate/golden_compare/shot_checker 能力与 C5 描述相符。**翻案**:board_shot_probe 帧 = 空视口裸挂 BoardView,**不含舞台底/屏根像素**(探针只实例化 BoardView,battle_stage_view/BG_ROOT 未挂载);shot_probe 战斗屏真实路径只达 **L1 首战**(其头注商店房不纳屏段自证)⇒ T1「舞台底与屏根」测面与「L2/L3 分关实测」均**无现成采样件**,v1.0「采样源=board_shot_probe 渲染帧」对该测面不成立 | `game/smoke/board_shot_probe.gd:34, :55-61`;`game/smoke/shot_probe.gd:12-14, :159-164`;`tools/render_gate.sh:9, :55-68, :95-107` | 新增 **T1b 新建采样件任务**(≈0.5–1d,白名单 1 域内);T1 估时上调、合计 4–6d→**5–7d**;C6 加帧面边界注 + 过程帧即弃纪律注 | -| 2 | 量化判据出处 | A6 ≥4.70(`:26/:338/:1021-1022`,v1 4.09×1.15)、F6 Δ≥18(`:339/:996`)、格底档 L 0.08–0.14/墙顶 ≥0.30/饱和 ≤0.55(art-bible :194/:205/:225-227)、48 色+三通道差 ≥8/255(art-bible :207)**全部实值相符**。**翻案两件**:①A3 现行执法 = **v3.5 冻结定值 Δ≥30**(实测 38),Δ≥55 已数学冲突退役(`:975-979`),v1.0 C3「开工时以当期为准复核」含糊化——已写死;②样张 v3 断言(A3/A6/F6)只跑 **dungeon 拼板主板**(`:130-131`),S3 underdark 仅为 HSV 示意不参断言——「分关实测」非现成能力。自设目标带合法性:「待定现用」态释义(:207)只覆盖**圣经在册数值**的执法态,不自动覆盖批次自设判据——二者不冲突但须写明边界 | 如上各行号 | C1–C3 加核注重写;V2 增「批次判据身份≠执法值,转执法须 art-bible 修订登记」条款;T1b 承载分关读数 | -| 3 | 「重产≠放开升档」划界 | 划界**成立但引据须换代**:08 未决项表 2026-10-16 v1.6 已重编号(八项减七项)——行号指路不可靠,按名「素材升档重产进不进 Alpha」「立绘清晰度回退评估」现行确在第 6/7 行(实查);06「资产升档重产批」现行状态 = 2026-10-04 令暂不做 + 2026-10-06 优先级再降 + **2026-10-06 方案二注记:原 64/96/128 升档路线已被八敌逐键定档实质走完,剩余挂起=提灯点亮解禁候选**——v1.0 P4「该条方向=帧尺寸升档」表述滞后 | 08:154, :209-210, v1.6 行(:226);06 升档批条状态行全文 | P4 重写(按名指路+行号注明以实查为准+方案二注记现状);T2 乙案行同改 | -| 4 | recolor 能力边界 | 头注方法=仅对 `terrain_*_dungeon.png` 按 wall/facade/floor/crater 四族槽重映射、输出 underdark/deep_underdark 两套;实盘 board/ 目录两套各 21 件(**墙 16+地 5**)与脚本输入面完全对齐,`flag_seal.png` 不在输入面。v1.0 F2「墙类 21 件」**件数错**(21 为总数,16 唯一墙名单单点 `TILE_WALL_NAMES`)。「纹理太碎调不动」有实证:recolor 头注定死亮度秩序逐像素保持(方法学上限)+ 2026-10-14 美术审计结论区「第二/三关地面=近黑斑加亮筋双峰纹理,盯久了累,不是再叠一层界面能救的」(该审计 md 在盘;同日另存 2026-10-06 旧审计 HTML,其棋盘相关结论未涉 L2L3 瓦片碎度) | `tools/recolor_terrain_tiles.py:1-12`;`game/presentation/views/board_view.gd:81-88`(16 件名数组+头注「16 唯一墙瓦片名单」);`reports/美术审计-cursor会话存档-2026-10-14.md` 结论区;Glob `game/assets/art/board/` 两套件名清点 | F2 订正件数+flag_seal 例外注;甲案行写明输入面全覆盖;T1 归因判据与 Q2 引审计实证 | -| 5 | 文字位条分工句 | 06:451 原文在册:「两条不同面,不互相替代,各自保留」;三处文字位=站桩名行/敌顺位徽标/RAP 反馈行,06:443 已随迭代 26 T3 完成——v1.0 P2 语义与原文一致 | 06:451, :437-443 | P2 补原文引述 | -| 6 | V 条判具 | V2=样张 v3(主板)+T1b 分关读数+shot_checker A–D**+F**(v1.0 漏 F 判据,2026-10-15 已入闸)+`terrain_tile_sets_test`/`ui_contrast_probe`(两探针实存);V3=`golden_baseline_refresh.sh` **实存**且用法查明:缺省模式=棋盘三张(probe 抓帧→crop→覆盖 `game/tests/golden/`),`--menu`=菜单全屏,素材缺位拒跑,呈现批 agent 自换代+提交说明强制写触发原因(其头注 Q5/Q6/S3 在册) | `tools/golden_baseline_refresh.sh:2-14, :52-76`;`tools/shot_checker.py:8-19` | C5/契约 6/T4/V2/V3 补齐实操步骤与 F 断言 | -| 7 | Q1/Q3 已裁检索 | **Q1 属已裁项**:06:449 条内明文「开工前须先定性(沿用既有裁决)」+ 状态行「开工前先过定性人闸」(2026-10-13 用户裁定)+ 08 的 git 提交史同款注——v1.0 一边在 P1 引该裁决、一边把同一闸列为 Q1 待裁,自相矛盾,触用户红线。Q3(同批与否)与 Q2(甲/乙)全库检索**无既裁**(06 单条覆盖两关但未裁批次数;playnote 无;git log 无)——保留为待裁 | 06:445-453;08:220(v0.3);playnote.md:5;git log 2026-10 检索 | Q1 从 §10 删除、改 P1/T1 出口/V1 流程硬步骤引用(§10 载明移除理由);Q2/Q3 保留 | -| 8 | 中立性 | v1.0 四处「推荐」:Q1(已裁项附裁决,撤销后消失)、T1 出口句(撤销)、T3「推荐=同批」与 §10 Q3「推荐 甲」(**无既裁依据→中立化**)、Q2 立场句「开工默认先做甲案候选样张」(改写为白名单内样张层探针动作,非路线裁决) | 全文 grep 推荐=0 残留(仅剩「已删字样」自述与列名注) | 列头改「卡片立场(不代裁)」;§10/§6 T3 中立化 | -| 9 | 跨卡依赖 | 两卡同抢 L2/L3 板面:徽章批(类型微光实装者,其 T0-② 五组明度档以未开格底 L≥0.30 为基线——本卡改的正是该基线;art-bible :379 已册「格底与微光同在未开格面,邻近色相有吞没风险」互辨复测义务;其 §4「不动格底/瓦片/四槽」系单向避撞);样张批(Q1 丙案语义=样张反提素材规格、Q3 路线选型——本卡乙案重产与其冻结次序互锁) | `徽章卡(迭代 30 卡①,合并 7ffd1dc0,卡片已退役):13/82/109`;`需求卡片-战斗一屏样张批:33/59/70-71/168/170`;art-bible:379 | 新增 **§4B 跨卡依赖**(X1/X2/X3 三行+结论笔:次序与规格联动问题,不新增裁点,随 Q2/Q3 呈报交用户定序);§8 L3 增⑥跨卡次序破裂停机型 | -| 10 | 外加翻案(非清单内,敌意自查所得) | **契约 5/完成定义 3/V4/T5「目检未过禁宣布完成/在役」与 2026-10-12 用户令红线冲突**:AGENTS.md「真人检测只登记不阻塞——禁以等目检为停工理由」(入库先例:迭代 25/26/28 均入库翻行、07 目检留残,git 提交 d337c9e5 立规)。另:F1「L1 10×10」不全——`board_gen.tres` level_index 1 段含一行 **12×12 dungeon**;F10/C6:类型微光引擎未实装(徽章批 F2 引 HUD框架实装状态行佐证),v1.0 把它当实机可测层不成立 | AGENTS.md:68;git log d337c9e5;roadmap 迭代 25/28 行「残留人闸=目检」先例;`game/data/tables/board_gen.tres` 行段实查 | 契约 5 重写(阻塞闸全前置:T1 定性闸+契约 4;V4 改登记不阻塞+回补机制:否决→08 行回待做+06 记残留重开);F1 补两板型注;F10/T1 微光测面降为样张 v2 证据级别并注升级路径 | - -**词面合规自查**:v1.1 全部新增/改写文本已按仓库现行用语规范禁词表逐词 grep 复扫,命中 0(他文档引文原貌除外);本次修订同时把卡片里 v1.0 残留的两处旧措辞换代为规范词。**v1.2 增补**:本次裁决留痕新增/改写文本同口径 grep 复扫,禁词命中 0。**v1.2 留档注**:下表 §11 中「Q2/Q3 保留待裁」「随 Q2/Q3 呈报交用户定序」「无既裁→中立化」均为 v1.1 时点的审查动作实录,不作现行状态读——2026-10-16 用户令已定案(Q3=甲·同批;Q2=延裁挂 T1 出口呈报硬步骤),现行裁决状态一律以 §10 为准。 diff --git a/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md b/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md new file mode 100644 index 00000000..0b75ad18 --- /dev/null +++ b/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md @@ -0,0 +1,484 @@ +# 需求卡片:棋盘瓦片与立体表现重做批 + +> 来源:`待办清单.md`「棋盘瓦片与立体表现重做」(2026-11-07 登记)。 +> **设计事实源(唯一事实源)**:`design/art/art-bible.md` v3.51 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.2+`design/ux/battle.md`(Last Updated 2026-11-07)「Layout Zones」D 区行/「D 区布局与棋盘画法预览」/「封印格呈现预览」+`design/gdd/systems/表现与支撑/HUD框架.md`(2026-11-07)D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。 +> **验收档:中**(呈现与交互几何改动,后果玩家可见但不损持久状态;用户 U0 可改判)。 +> **预计**:9.5 个工作日(区间 9–10;T0 0.5/T1 1.5/T2 0.5/T3 2.0/T4 1.5/T5 1.5/T6 0.5/T7 1.0/T8 0.5)。 +> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条、第六轮(合并整合)6 条均已处置,第六轮定向复核通过。 + +--- + +## 1. 目标与完成定义 + +把棋盘从「逐格 32×32 墙/地瓦片+格内立面」换成**合并岩体+连续地面**的 2.5D 画法:连通未开格(四邻)共享一块抬升岩顶与连续南/东崖面,北/西受光,南/东投影;数字脱离格面,变成**浮空数字+双色引导线+格面小阴影圆**,数字与引导线永远最顶、阴影圆在小人之下;封印按迭代56已闭合的「受理即揭示」呈现——印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、不参与浮空层,承载面取本关受光棱色封印石以保 ≥4.5:1 对比;D 区顶部 AP 条整条撤掉,AP 放左栏、RAP/图例/弃图刷新放右栏,棋盘占 D 区全高并在上方预留 44px 给顶行浮空数字越出棋盘;棋盘底常驻操作提示条退役;小人与南侧岩体按脚底 y 排序遮挡;旧 `terrain_*` 63 件与普通数字底牌路径退役(封印格身份色牌保留);三关色板按已过审样张冻结。 + +**完成定义**(全部满足才算完): + +1. 1280×800 基座档:12×12 格边 38px、14×14 格边 32px;D 区 1036×548;左/右栏各 200px;棋盘 12×12 外框 478×478、**屏幕坐标**原点 (523,296)、board_area 局部原点 (279,44);14×14 外框 474×474、屏幕原点 (525,296)、局部原点 (281,44)。 +2. 顶行浮空数字视觉顶 y=258(含 2px 描边+1px 浮空投影),距 D 区上缘 6px;数字、引导线、阴影圆全部在 D 区内,无裁切。 +3. 岩体投影:LIFT=round(格边×0.435)、ESHIFT=round(格边×0.109);四邻连通合并;相邻岩顶搭接 2px;南崖高 LIFT、宽 格边+ESHIFT、顶缘 2px 口沿高光取本关受光棱(§4.1);东崖宽 ESHIFT、高 格边+LIFT;北/西 2px 主亮棱+2px 次亮棱+外 2px 深墨边;南/东 2px 深墨内缘+3×2px 内阴影(自缘内 0.217×格边起,α0.27/0.16/0.08);四段投影 4×4px(α0.44/0.30/0.16/0.07);整板悬崖 8px。 +4. 深度排序:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体画在小人之后并遮住小人脚底;小人所在格数字仍完整可见。格件顶面贴花/交互反馈随所属格件参与同一深度排序——北侧(脚底≤小人)低于小人(`z=0`),南侧(脚底>小人)随岩体在前(`z=3`);浮空数字仍最顶。 +5. 浮空数字:字高 21px、2px 深墨描边+1px 浮空投影、暖白字芯、字底距格顶 15px、2px 双色引导线、10×6 阴影圆(圆心格顶+7,画在开启格地面、位于小人之下);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;小人可遮阴影圆。 +6. D 区:左栏 AP 点阵+停手,右栏 RAP 点阵+数字+图例+弃图刷新;`side_rail_w=200` 入布局表;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张渲染工具,删除归工具批);棋盘底常驻操作提示条退役;toast 槽在左栏顶部且不覆盖棋盘与浮空数字。 +7. 旧 `terrain_*` 63 件与 `tile_palette.gd`/`cell_base_layer.gd` 删除;`seal_mark.png` 保留;**普通数字**棋盘绘制路径零 `DIGIT_PLATE`/`plate` 调用;封印格身份字形色牌保留(迭代56封印改版,唯一例外)。 +8. 封印呈现按迭代56「受理即揭示」口径:印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、印记与色牌固定低于小人、该格不生成浮空 entries;封印格地面铺本关受光棱色封印石(零新增色,对封印黑对比 6.45–9.94:1),普通已开格地面仍为连续新地面。 +9. 三关(dungeon/underdark/deep_underdark)都走新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 golden 基线重制并在渲染闸通过。 +10. 命中仍按逻辑格矩形:点在抬升岩顶/崖面/浮空数字上不改变格坐标映射;16×16 等非当前板型由同一公式求值。 + +**不做**:真 3D、HD-2D、A/B 方案对照、旧瓦片回退、逐格新 PNG 瓦片、B/C 区改版、核心规则/数值/RNG 改动。 + +--- + +## 2. 设计事实源 + +- **画法与配色**:`design/art/art-bible.md` v3.51 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)+封印印记条、§4.1「棋盘环境子板/三关棋盘环境八色/封印黑/数字色牌」、§6.3「三关 tile_closed/tile_open 终值」、§8.2「封印印记参数表」、§1.4 第一验收项。 +- **封印呈现前置**:迭代56「封印动作改版批」已闭合 `design/gdd/systems/排雷循环/排雷玩法.md` v2.0「封印受理即揭示」与 `design/ux/battle.md`「封印格呈现预览」——封印格 = 已揭示地面+法阵+身份字形色牌;本卡承接其地形换代(承载面改受光棱封印石、圆心仍格心、色牌与法阵层序不变),不重写揭牌逻辑。 +- **布局与像素判据**:`design/ux/battle.md`(2026-11-07)D 区行、棋盘格尺寸公式、「D 区布局与棋盘画法预览」像素判据表(含顶面/视觉 rect、悬停/路径 rect、层序)、Component Inventory 三行(行动资源侧栏/棋盘地形层/棋盘浮空数字层)。 +- **HUD 契约**:`design/gdd/systems/表现与支撑/HUD框架.md` D 区行(侧栏/全高棋盘/提示条退役)、布局表高度口径、字号下限(浮空数字 21px 固定)。 +- **验收面**:`game/tests/golden/README.md`「加严口径(棋盘三图)」「越格口径(2026-11-07 棋盘地形换代)」。 +- **上游已裁**:C 方向(合并岩体+越格画法+新大岩板材质)2026-11-07 用户看样张通过;顶栏搬两侧(D)2026-11-07 用户看三方案预览后选定;北/西受光、按样张调深、脚底行排序三项同会话裁定;underdark/deep 两关色板 2026-11-07 用户看方向样张后选定「按目标八色冻结」;棋盘底操作提示条退役同会话选定。 + +--- + +## 3. 现状事实(代码级,开工自行复核) + +| 现状 | 证据 | +|---|---| +| D 区当前是「AP 条 44px+棋盘区+底部提示条」的 VBox 结构;board_area 实际高度需扣 VBox 间距与提示条(T0 实读,禁预设 504) | `game/presentation/views/board_zone_view.gd:23-37`(VBox+`ApBarView`+board_area+hint);`ap_bar_view.gd:35`(`custom_minimum_size.y = layout.ap_bar_h`);`board_zone_view.gd:74-79`(hint 条) | +| 布局表只有 `ap_bar_h`,没有 `side_rail_w` | `game/data/schemas/battle_layout_table.gd:10,21-22`;`game/data/tables/battle_layout.tres` | +| 格边公式预留为「上 12+下 12+悬崖 8」,无顶栏/侧栏项 | `game/presentation/views/board_view.gd:205-232`(`_cell_for`:`reserve := 24.0 + d`、`avail.x - 12.0 - d`) | +| 棋盘原点由 CenterContainer 居中;`cell_origin` 读 `_svp_container.position` | `board_view.gd:403-404`;`_wrap`/`_svp_container` 建于 `board_view.gd:90-110` | +| 棋盘逐格 16 墙瓦片+5 地面变体,按 `board_type` 装 PNG | `game/presentation/views/tile_palette.gd:17-20,66-94`;`board_view.gd:118,264-267` | +| 数字有「亮直/深直/落牌」三态与色牌垫底;封印格身份字形同走色牌 | `tile_palette.gd:50,88-94,166`;`board_view.gd:517-518,586-591`;`cell_mark_overlay.gd:74-104` | +| 封印当前代码仍是「未开格+`seal_on = seal and not revealed`」;迭代56封印改版已编未开工(本卡排其后,按其实装后的「已揭示地面+身份色牌」口径承接) | `board_view.gd:536-545`;`board_cell_unit.gd:31,39,51-77`;`seal_mark_layer.gd:12-20`;`reports/需求卡片-封印动作改版批-2026-11-07.md` §7 | +| 封印取证选择器仍 `has_seal and not is_revealed`、取证 rect 按逻辑格(圆心格心) | `game/probe/board_shot_probe.gd:264-281`;迭代56卡片 §7 换代选择器 | +| 格内立面/北投影/东立面全在本格内画;接触带也在基座层 | `game/presentation/views/cell_base_layer.gd:60,82-91,109-115,168,183,196` | +| 小人 z=1、落影相对 z=-1(全局 0);无脚底排序;格件默认 z=0 | `game/presentation/views/board_world.gd:39,48`;`board_cell_unit.gd`(全文无 `z_index` 赋值) | +| 旧 `terrain_*` 63 件(16+5,三关各一套)在库 | `game/assets/art/board/`(63 PNG+63 `.import`+`seal_mark.png`+其 `.import`) | +| 棋盘取证探针视图 900×900,微光「禁越圈」按逻辑格;封印取证也按逻辑 rect | `game/probe/board_shot_probe.gd:179,261,318,369` | +| 微光取证探针同用逻辑 rect | `game/probe/type_glow_shot_probe.gd:126,161` | +| 变格边长探针恢复时调 `set_cell_area(bv.size)`(无侧栏参) | `game/probe/ui_input_probe.gd:360-366` | +| 布局探针等价断言 `_cell_for(n, bv.size)`(无侧栏参) | `game/probe/layout_probe.gd:108-120` | +| 对比度探针的迷雾派生段依赖 TilePalette | `game/probe/ui_contrast_probe.gd:119-147,164-190` | +| 能力清单旧行「地形瓦片套与格面数字可读」仍引用 terrain 套件 | `game/tests/README.md`(旧行保留;删除归写卡段后续) | +| 普通已开危险格「危」当前垫色牌;落牌断言在玩家复制回归件(本卡后普通「危」改浮空、plate=false;封印格「危」仍垫牌) | `game/tests/unit/presentation/player_copy_sweep_test.gd:142-147`(`u.plate == true`) | +| 单元测试入口登记 terrain 套件 | `game/tests/run_all.gd:225` | +| 布局表字段被样张渲染工具读取(本批不改工具) | `tools/layout_config.py:12`;`tools/render_sample_sheet.py:51,956`;`tools/render_sample_sheet_v3.py:862,936` | +| 档期现状:待办清单已「已写卡」、roadmap 待编池「棋盘瓦片与立体表现重做(已写卡,待编排)」、08 已写卡 | `待办清单.md:265-268`;`roadmap.md:9`;`design/gdd/08-Alpha版本标准.md:149` | + +--- + +## 4. 设计契约(🔴 触碰=L3 停机呈报) + +1. 🔴 **只改呈现层与必要接线**:禁止改 `game/core/` 的排雷规则、棋盘数据、AP/RAP、战斗结算、RNG;棋盘数据只读。新增/修改只落 `game/presentation/`(含 `main.gd`/`main_debug_flow.gd` 的重建接线)、`game/probe/`、`game/tests/`、`game/data/schemas/`、`game/data/tables/` 与 `reports/`。 +2. 🔴 **不做逐格瓦片**:禁止保留或新增 16+5 逐格瓦片路径、`terrain_*` 回退、`TilePalette` 装图链;岩体/地面/崖面必须按整板矩形与格边程序化绘制,连通按四邻。 +3. 🔴 **普通数字零底牌**:普通数字(含普通已开格的「危」/「?」)只走浮空描边字;禁止 `_digit_ink_mode` 三态、`plate_digit` 在普通数字路径复活。**封印格身份字形色牌为唯一例外**(迭代56封印改版:`plate=true`、`_draw_digit_plate` 保留、字形叠于法阵之上),禁把例外扩回普通数字。 +4. 🔴 **浮空分层**:数字+引导线必须比地形/小人/封印/微光/交互反馈都高,任何元素不得遮数字与引导线;**阴影圆相反——画在开启格地面、位于小人之下**,小人站该格时遮住圆;顶行数字必须在 D 区内完整可见。**顶面贴花/交互反馈不得一律置顶**——随所属格件脚底行分档:北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;禁恢复“格件一律 z=3”。**封印格例外**:该格不生成浮空 entries/阴影圆,印记与身份色牌固定低于小人(整格 z=0,不参与南侧前推)。 +5. 🔴 **命中按逻辑格**:`_cell_at` 仍用逻辑格矩形与 `SEP` 步长;抬升岩顶、崖面、浮空数字不是命中区;顶面左上角点按逻辑公式归属北/西邻格,不做“归本格”特判。 +6. 🔴 **脚底排序**:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体必须能遮住小人脚底;格件贴花/交互反馈按同一格底 y 分档(北侧 z=0 低于小人、南侧 z=3 随岩体在前;**封印格恒 0**);禁止退回“全部岩体先画、小人最后画”。 +7. 🔴 **顶预留 44px**:`TOP_RESERVE=44`、`BOTTOM_RESERVE=12`、`DEPTH_PX=8`;公式与预览判据一致;禁止用 AP 条高度重新挤压棋盘;board_area 高 = D 区全高 548。 +8. 🔴 **侧栏宽表单源**:`side_rail_w` 只从 `BattleLayoutTable` 读,视图内禁止硬编码 200;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张工具,删除归工具批)。 +9. 🔴 **旧资产先验后删**:T0 采样三关当前画面读数入报告;新路径三关 golden 绿后,才允许删除 63 件 PNG 与 `.import`;`seal_mark.png` 禁删。 +10. 🔴 **文档不直改**:实现批禁写 `design/`、`game/tests/README.md`(能力清单由写卡段本批入表)、`roadmap.md`、`08-Alpha版本标准.md`、`待办清单.md`;发现条款偏差一律列 `reports/iter-反哺点-<日期>.md`。 +11. 🔴 **不删断言换绿**:不得删除或放宽 `board_shot_probe` 的加严口径、渲染闸 2% 判据、`ui_contrast_probe` 对比断言;只允许按本卡 §12「测试削弱申报」列出的旧断言删除/替换。 +12. 🔴 **拆分边界**:判据权威=`design/engineering/code-conventions.md` §1.1;每个拆出单元必须有职责语句与单一变化原因(§10);禁止为过阈值凑数拆件;拆不出内聚单元=停卡呈报。 +13. 🔴 **RNG 单点**:程序化材质/装饰噪声禁止 `randomize()`、自建 `RandomNumberGenerator`、消耗 `RngService` 共享流;一律用格坐标确定性哈希(同板同参逐位复现)。 +14. 🔴 **色字面量落点**:三关八色只落 `board_terrain_palette.gd`;用 `Color("#RRGGBB")` 常量,禁 `Color8` 散落;其它绘制点只读 palette,禁第二份色值表。 +15. 🔴 **BoardView 公开面不增**:`board_view.gd` 公开方法保持 27、类成员 ≤31(S13 基线;删 `_palette` 后 30);新增地形/浮空/阴影圆层一律落为**固定名字子节点**(`_world` 下 `TerrainBack`/`TerrainFront`/`LabelShadow`,壳层下 `FloatLayer`),三层在 `_init` 创建一次常驻、`rebuild` 只重跑 `setup` 不重建节点,经 `get_node_or_null` 取用,不新增类成员;只允许 `set_cell_area`/`rebuild` 增加可选参数与私有 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals`,禁新增公开方法或成员。 +16. 🔴 **封印呈现对齐迭代56**:封印印记居已揭示地面格心(不随岩顶 −ESHIFT/−LIFT 偏移);身份字形垫色牌叠于法阵之上(`seal_mark_layer` 子件 `show_behind_parent=true` 或等价实装)、不参与浮空层、不生成阴影圆;印记与色牌固定低于小人(封印格整格 z=0);封印格地面铺本关受光棱色封印石(零新增色,`palette.light_edge`);法阵参数(环径/环壁/十字/光圈)与揭牌逻辑沿迭代56,禁在本卡重写。 + +--- + +## 5. 范围边界 + +**收件**: + +- D 区布局(左右侧栏、全高棋盘、44px 顶预留、toast 槽移位、底部提示条退役)。 +- 棋盘地形深度层(连续地面、合并岩顶、南/东崖面、内阴影、四段投影、整板悬崖)。 +- 浮空数字层(阴影圆、引导线、描边字、1px 浮空投影、数字/线最顶、顶行越界)。 +- 小人与岩体的脚底排序;阴影圆在小人之下。 +- 封印印记/身份色牌的承载面与层序(已揭示地面格心+受光棱封印石+色牌叠于法阵之上且低于小人);类型微光/变异纹带/奖励徽章/悬停/路径/可挖域微光的锚点迁移(顶面 rect)。 +- 迷雾黑罩/记忆态与抬升岩顶的几何对齐。 +- 布局表 schema/tres、AP 条→侧栏的视图改造、命中测试。 +- 旧瓦片与普通数字色牌路径退役(封印格身份色牌保留)、三关色板、三关 golden 基线重制、测试与能力行落地。 +- 棋盘底常驻操作提示条退役(`board_zone_view` 的 hint 条删除)。 + +**不收件**: + +- B 区舞台/站桩、C 区数据框、AP/RAP 数值与规则、战斗结算、RNG、存档——一律不动。 +- 新增地形 PNG 素材:本批按已过审样张做程序化材质;若后续要换成 PNG 材质,另立登记条目走 asset-ingest。 +- 真 3D/HD-2D、A/B 方案对照、用户试玩结论——试玩只登记不阻塞。 +- 三关之外的板型专属美术(16×16 等)——同一公式与材质覆盖,不另出资产。 +- 样张渲染工具(`tools/layout_config.py`、`render_sample_sheet*`)的 `ap_bar_h` 字段清理——布局表字段本批保留,工具换代登记待办清单后续直改。 +- 三关互辨抽测工具 `tools/glow_discrimination_sheet.py` 的换代(读已删旧 `terrain_*`)——本批不跑;三关互辨由用户过审样张+`board_terrain_test._test_palette_three_boards` 逐值承担,工具换代登记待办清单后续工具批。 + +**不收件去向**:B/C 区改版→待办清单新条目;PNG 材质替换→asset-ingest 登记;样张/互辨工具换代→待办清单(tools 批);条款偏差→反哺点清单。 + +--- + +## 6. 关联文档同步面 + +| 文档 | 关联点(实现会改变它的哪条陈述) | 同步义务 | +|---|---|---| +| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.2 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役;封印印记改已揭示地面格心+受光棱封印石+身份色牌层序(v3.51) | 设计段已按本卡写入 v3.51;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 | +| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役;封印格承载面改受光棱封印石、圆心格心、色牌叠法阵 | 设计段已同步(2026-11-07);实现偏差→反哺点 | +| `design/gdd/systems/表现与支撑/HUD框架.md` D 区/字号 | D 区侧栏、全高棋盘、`ap_bar_h` 不再参与、浮空数字 21px、提示条退役 | 设计段已同步(2026-11-07);实现偏差→反哺点 | +| `game/tests/golden/README.md` | 棋盘裁剪 1036×548、越格口径、类型微光禁越圈范围 | 设计段已同步;实现批禁直改,基线重制按该文件口径执行(重制前用户确认) | +| `design/gdd/术语表.md` 掩尘/裸土/浮空数字/色牌 | 基色值、浮空数字定义、普通数字色牌退役+封印格色牌例外 | 设计段已同步;实现批禁直改 | +| `design/art/asset-path-map.md`/`art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、普通数字色牌退役+封印格色牌例外、程序化材质无入包 PNG | 设计段已同步;实现删除资产后按反哺点核对 | +| `design/engineering/architecture/architecture.md:178` | 单格两绘制域件行把 `cell_base_layer` 记为在役组件;本批删除该件、新增地形/浮空/阴影层 | 架构文档写权限=用户专属(2026-11-07 裁):实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 | +| `game/tests/README.md` 能力表 | 新增 6 条能力;旧「地形瓦片套与格面数字可读」保留(删除归写卡段后续;实现批禁写);「战斗屏三区几何」代表用例改名 | 写卡段本批入表(本卡同 commit);实现批只核对名字与实际落地一致 | +| `roadmap.md`/`design/gdd/08-Alpha版本标准.md`/`待办清单.md` | 本卡已写/待编排状态 | 编排段与收尾段推进;实现批禁直改 | + +--- + +## 7. 文件结构图 + +| 文件 | 行为改动/非行为 | 职责 | 验收行 | +|---|---|---|---| +| `game/presentation/views/board_terrain_palette.gd`(新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)`;dungeon/underdark/deep 取 art-bible v3.51 §4.1 冻结值;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;封印石读 `light_edge`(零新增色);只读 | §12-14 | +| `game/presentation/views/board_terrain_layer.gd`(新增) | 行为 | 地面、合并岩顶、南/东崖面、内阴影、四段投影、封印格受光棱封印石贴片;`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`/`set_hero_foot_y()`/`set_pass()`/`mass_rects()`/`terrain_metrics()`;静态 `lift_for()`/`eshift_for()`;back/front 两实例(`_world` 下固定名字 `TerrainBack`/`TerrainFront`,不占 BoardView 成员) | §12-3/4/5/8 | +| `game/presentation/views/board_float_layer.gd`(新增,Control) | 行为 | 外壳层浮空字:2px 描边、1px 浮空投影、双色引导线;`setup()`/`set_entries()`/`set_font()`/`label_rects()`/`label_metrics()`;不画阴影圆;**封印格不生成 entries**;壳层固定名字子节点 `FloatLayer`,不占 BoardView 成员 | §12-6/7 | +| `game/presentation/views/board_label_shadow_layer.gd`(新增,Node2D) | 行为 | 开启格地面 10×6 四层阴影圆;`setup(cell, cells)`/`circle_rects()`(世界局部/格坐标);**封印格不生成圆**;`_world` 下固定名字 `LabelShadow`,不占 BoardView 成员;z=0,位于小人之下 | §12-6/7 | +| `game/presentation/views/ap_bar_view.gd`(修改,保留类名/字段名) | 行为 | 根改为全幅 Control(IGNORE)+左右两个 PanelContainer(`_init` 局部变量,不新增成员);左 AP+停手,右 RAP+图例+弃图刷新;信号/setter 名不变;`side_rail_w` 从布局表读 | §12-1/12 | +| `game/presentation/views/board_view.gd`(修改) | 行为 | 新格边公式、顶预留 44、棋盘原点、地形/浮空/阴影圆固定名字子节点装配(不新增成员)、`rebuild` 清场跳过三层、`_resort_cell_decals` 按脚底行分档、命中测试、refresh 清理(删 `_paint_cell_base`/`_paint_cell_facade` 与 `u.base.*`)、迷雾 rect、rebuild/set_cell_area 侧栏参 | §12-2~9 | +| `game/presentation/views/board_zone_view.gd`(修改) | 行为 | 去掉 VBox/AP 条/hint;board_area 全幅;侧栏叠层;toast 左栏顶部;`_side_rail_w` 存 layout 值 | §12-1 | +| `game/presentation/views/board_world.gd`(修改) | 行为 | 悬崖保留 z=0、材质色接新 palette;小人 z=1、落影相对 z=-1;格子 z 对齐 | §12-5 | +| `game/presentation/views/board_cell_unit.gd`(修改) | 行为 | 去基座层(删 `base` 成员);新增 `top_face_offset`/`visual_rect`;**保留 `plate`**(封印格身份色牌);`z_index` 按脚底行分档(北侧 0/南侧 3;**封印格恒 0**,由 `_resort_cell_decals` 重算);`glyph` 只写封印格(色牌字形),普通数字不写格面;封印子件 `show_behind_parent=true`(法阵在色牌下);迷雾三块;记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下),不整矩形压南邻岩顶;`draw_removed_dim` 墙格改顶面 rect;接触带迁入固定名字低层子件 `ContactGlow`(同全局 -1);文件头注删 `cell_base_layer` 引用 | §12-8/9/13 | +| `game/presentation/views/cell_mark_overlay.gd`(修改) | 行为 | 删普通数字字形/色牌路径;**保留封印格字形+`_draw_digit_plate` 色牌+徽章**;保留变异/路径/高亮/退色;顶面 rect 参数 | §12-8/11 | +| `game/presentation/views/cell_base_layer.gd`(删除) | 非行为(清理) | 逐格基座/立面/投影/接触带职责移交 | §12-3/13 | +| `game/presentation/views/tile_palette.gd`(删除) | 非行为(清理) | 16+5 装图/三态墨色职责退役 | §12-11 | +| `game/data/schemas/battle_layout_table.gd`(修改) | 非行为(数据契约) | 增 `side_rail_w`;`ap_bar_h` 保留字段(游戏视图零读) | §12-1 | +| `game/data/tables/battle_layout.tres`(修改) | 非行为(数据) | `side_rail_w = 200`;`ap_bar_h` 字段保留 | §12-1 | +| `game/presentation/main.gd`/`main_debug_flow.gd`(修改) | 非行为(接线) | `BoardView.rebuild(..., side_rail_w)` 传布局表值 | §12-2 | +| `game/probe/board_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、侧栏 200、顶面 rect 微光圈;**封印取证保持逻辑格 rect(圆心格心)**,选择器按迭代56后 `has_seal` 口径;三关截图 | §12-15 | +| `game/probe/type_glow_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、`rebuild(..., 200)`、微光允许区改顶面 rect | §12-15 | +| `game/probe/layout_probe.gd`(修改) | 非行为(取证) | `_cell_for` 带侧栏;D 区/原点/顶预留读数(含 1920 档) | §12-2/15 | +| `game/probe/ui_input_probe.gd`(修改) | 非行为(取证) | `set_cell_area` 恢复时带侧栏参 | §12-2/15 | +| `game/probe/ui_contrast_probe.gd`(修改) | 非行为(取证) | 去旧瓦片均值段;加浮空字四类底复合对比;迷雾派生段改读新 palette | §12-6/9 | +| `game/tests/unit/presentation/board_terrain_test.gd`(新增) | 非行为(测试) | 格边/合并/投影/深度/锚点/命中/迷雾/接触/色板/旧资产/封印承载与色牌 | §12-2~5,8,9,11,13,14 | +| `game/tests/unit/presentation/board_float_label_test.gd`(新增) | 非行为(测试) | 字高/间距/顶预留/最顶/阴影视小/复合对比/普通数字零底牌(封印格跳过) | §12-6/7/11 | +| `game/tests/unit/presentation/board_side_rail_test.gd`(新增) | 非行为(测试) | 侧栏几何、信号、setter、提示条退役 | §12-1/12 | +| `game/tests/unit/presentation/terrain_tile_sets_test.gd`(删除) | 非行为(测试) | 旧瓦片套断言整体退役 | §12-11 | +| `game/tests/unit/presentation/stage_background_test.gd`(修改) | 非行为(测试) | 新增 `_test_side_rail_width_from_table`(现无 AP 条高度测试) | §12-1 | +| `game/tests/unit/presentation/player_copy_sweep_test.gd`(修改) | 非行为(测试) | 普通已开危险格:`u.plate==true` 改 `u.plate==false`+浮空 entries 含该格;封印格色牌断言归 `board_terrain_test` | §12-6/11 | +| `game/tests/unit/presentation/standee_present_values_test.gd`(修改) | 非行为(测试) | V11 口沿高光源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱);`body_src` 段保留 | §12-3/11 | +| `game/tests/run_all.gd`(修改) | 非行为(测试入口) | 注册三个新套件、移除 terrain 套件 | §12-16 | +| `game/tests/README.md`(写卡段本批改) | 非行为(能力清单) | 新增 6 条能力;旧地形行保留(删除归写卡段后续);代表用例改名 | §12 全表 | + +--- + +## 8. 落位与可复用性预检 + +| 新增件 | 复用面(为什么不能复用既有) | 唯一面 | 分层与交互 | +|---|---|---|---| +| `board_terrain_palette.gd` | 现有 `TilePalette` 只装 PNG/算墨色,不含三关程序化八色;改它会保留装图职责,职责混杂,故新件只放色表 | 三关八色只在此文件定义;视图只读 `palette_for()` | 纯数据件,不引用 UI/节点;`board_terrain_layer` 消费 | +| `board_terrain_layer.gd` | `cell_base_layer.gd` 是逐格基座,无法表达合并岩体/脚底排序;扩它会变成两个职责,故新件承接地形 | 地面/岩体/崖面/投影只在此件绘制;`cell_base_layer` 删除;LIFT/ESHIFT 只在此件静态函数 | 由 `BoardView` 创建两个实例(back/front),读 `wall_at` Callable 与 palette;不反向调用 BoardView | +| `board_float_layer.gd` | `cell_mark_overlay` 是逐格绘制域件,无法做跨格最高层与引导线;且 SubViewport 尺寸只到棋盘+悬崖,顶行浮空字会被裁,故必须做 BoardView 外壳 Control 覆盖层 | 数字/引导线只在此件绘制;`cell_mark_overlay` 删数字路径;不画阴影圆 | 由 `BoardView` 创建为全幅 Control;读 entries(cell/glyph);不写核心 | +| `board_label_shadow_layer.gd` | 浮空层在外壳、会盖小人;阴影圆必须在小人之下且在地面之上,无法复用浮空层或格件(格件 z=3 会盖小人) | 阴影圆只在此件绘制;开启格局部圆心格顶+7 | 由 `BoardView` 创建于 `_world`,z=0;读 entries 的 cell 列表;不反向调用 BoardView | +| `ap_bar_view.gd`(改造不换名) | 现有 `ApBarView` 已含 AP/RAP/确认/图例/刷新全部逻辑与信号,且被组合根/探针以字段名 `ap_bar` 引用;改名会波及 7 个接线文件,收益低风险高,故保留类名/字段名,只改布局职责 | 侧栏只此一件;`BoardZoneView` 只持有它 | 由 `BoardZoneView` 创建;信号经原有组合根路径上抛 | +| 三个测试件 | 现有 `terrain_tile_sets_test` 只测旧瓦片套;新职责无法复用;按职责拆三件(地形/浮空/侧栏) | 每个测试件只测对应域 | 经真实 `BoardView`/`BoardZoneView` 入口实例化;不直调核心写 | + +**唯一面核查**:`LIFT`/`ESHIFT`/`TOP_RESERVE`/`side_rail_w` 各只有一个定义点;普通数字路径 `DIGIT_PLATE`/`plate` 零引用(封印格身份色牌为唯一例外,`cell_mark_overlay`/`CellUnit.plate`);`terrain_*` 零引用;三关八色只在 palette 件;封印格承载色只读 `palette.light_edge`;层节点名 `_world/TerrainBack`/`_world/TerrainFront`/`_world/LabelShadow`/壳层 `FloatLayer` 各只有一个创建点,`rebuild` 只清格件与英雄、不误清三层。 + +**分层与交互**:Core 零 UI、数据只经 ConfigDB、RNG 零触碰、命中只读——全部保持;新增件不互相反向持宿主引用。 + +--- + +## 9. 实现规范预算 + +| 新文件 | 公开方法预算 | 成员变量预算 | 说明 | +|---|---|---|---| +| `board_terrain_palette.gd` | 1(`palette_for`) | 8 个常量 | 纯数据;不新增类状态 | +| `board_terrain_layer.gd` | ≤7(`setup`/`set_hero_foot_y`/`set_pass`/`mass_rects`/`terrain_metrics`/`lift_for`/`eshift_for`) | ≤13(新增 `_sealed_at` 一个成员——封印石贴片输入;其余同前) | 两个实例共享一个类;`pass_mode` 区分 back/front | +| `board_float_layer.gd` | ≤5(`setup`/`set_entries`/`set_font`/`label_rects`/`label_metrics`) | ≤8 | 一个 Control;所有数字在一个 `_draw` | +| `board_label_shadow_layer.gd` | ≤2(`setup`/`circle_rects`) | ≤6 | 一个 Node2D;所有圆在一个 `_draw`;坐标=世界局部/格坐标 | +| `ap_bar_view.gd`(改造) | 既有 10 个公开函数不减 | 既有 14 个成员不增(左右栏容器为 `_init` 局部变量) | 不新增公开面/成员;只改 `_init`/`_build_*` | +| 三个测试件 | 每件 ≤20 个 `func _test_*` | 夹具变量 ≤15 | 不计生产接口;测试件无消费面 | + +**存量触面**:`board_view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette`);本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`);S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w`,默认阈值内)。`board_cell_unit.gd` 12→13 成员(删 `base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset`/`visual_rect`,保留 `plate` 封印色牌;净 +1;`ContactGlow`/`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 普通数字路径只减面,封印格色牌/字形面保留。迁移函数对账:`cell_base_layer.gd` 的 `draw_base`/`_draw_south_facade`/`_draw_north_projection`/`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles`/`digit_ink_mode`/`normalize_floor_luma` 不迁移(职责退役)。 + +**指标例外申报**:无。若实现期发现 `board_terrain_layer.gd` 超过 7/13,按职责拆 `board_terrain_face_layer.gd`(崖面/投影)——先停卡呈报,不在实现段自行扩面。 + +--- + +## 10. 拆分边界纪律 + +判据权威 = `design/engineering/code-conventions.md` §1.1;本卡不复制定义,只写条款: + +- 每个拆出单元(地形层/浮空层/阴影圆层/侧栏)必须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载)。 +- 拆出单元必须有集体身份,命不出名字的「剩下的成员」打包=凑计数袋,禁止。 +- 过阈值只作发现信号,作拆分或收拢动机即违规。 +- 按职责拆不出内聚单元→停卡呈报走豁免/还债通道,禁硬拆凑绿。 + +职责语句:`board_terrain_layer`=「把棋盘格态画成连续地面/合并岩体/崖面/投影」;`board_float_layer`=「把开启格字形画成高于一切的浮空标注」;`board_label_shadow_layer`=「把浮空标注的所属格画成小人脚下的地面阴影圆」;`ap_bar_view`=「承载 D 区左/右行动资源读数与按钮」。 + +--- + +## 11. 任务卡 T0..T8 + +### T0 读数与基线(0.5 日) + +**取用**:无(首卡)。 +**产出**:`reports/iter-实现报告-<日期>.md` 的 T0 读数段;当前棋盘 golden 三图 hash;三关当前画面读数。 + +- [ ] 实读 `battle_layout.tres`:`stage_h=252`/`info_panel_w=240`/`ap_bar_h=44`/`log_band_h_dig=24`/`log_band_h_settle=84`,写入报告。 +- [ ] 实读当前 `board_area.size` 与 `BoardView.cell_size`(含 VBox 间距/hint 扣减;禁预设 504/37);写入报告。 +- [ ] 跑 `board_shot_probe` 存三关当前帧与 `board_meta.json`,记下 hash;不重制基线(T7 才换代)。 +- [ ] 确认 `game/assets/art/board/` 63 PNG+63 `.import`+`seal_mark.png` 在库;报告列清单。 +- [ ] 跑 `python tools/gdstyle_gate.py` 记录 `board_view.gd` 当前 27/31 基线读数;跑 `python tools/capability_audit.py` 记录当前红项(T8 复跑)。 +- [ ] 录三关 `board_type` 字符串与 art-bible v3.51 §4.1 三关八色;不采样旧瓦片均值。 + +### T1 布局表与 D 区侧栏(1.5 日) + +**取用**:T0 读数。 +**产出**:`BattleLayoutTable.side_rail_w`(200);`ApBarView` 双侧栏改造;`BoardZoneView` 全高 board_area+toast 左栏+hint 删除;`stage_background_test` 改名断言。 + +- [ ] `battle_layout_table.gd` 增 `@export var side_rail_w: int = 200`;`validate()` 增域 [160,260];`ap_bar_h` 保留字段与校验(游戏视图零读)。 +- [ ] `battle_layout.tres` 写 `side_rail_w = 200`;`ap_bar_h` 保留。 +- [ ] `ap_bar_view.gd`:根改全幅 `Control`(`mouse_filter=IGNORE`),内部左右两个 `PanelContainer`(各宽 `layout.side_rail_w`,贴 D 区左右缘;两个容器用 `_init` 局部变量创建并 `add_child`,不新增成员);左栏 `_build_ap_face`(含停手按钮);右栏 `_build_rap_face`+`_build_legend_refresh`+`_build_refresh_confirm`;保留 `class_name ApBarView`、`stop_pressed`/`refresh_confirmed`/`legend_toggled` 与 `set_ap`/`set_rap`/`set_refresh_cost`/`set_refresh_state`/`set_stop_enabled` 签名;删除 `custom_minimum_size = layout.ap_bar_h`。 +- [ ] `BoardZoneView` 删 VBox;`ap_bar` 字段保留、改为全幅叠层子件(不再挂 VBox);删 hint 条(`board_zone_view.gd:74-79`);根 PanelContainer 清空 panel style(或改 Control 根),`board_area` 占满 D 区(1036×548);toast 挂 `ap_bar` 左上、宽 `side_rail_w`;`_init(layout)` 存 `_side_rail_w = layout.side_rail_w`;`_on_board_area_resized` 调 `board_view.set_cell_area(_board_area.size, float(_side_rail_w))`。 +- [ ] `stage_background_test.gd`:新增 `_test_side_rail_width_from_table`(该件现无 AP 条高度测试;读 `layout.side_rail_w==200`,并断言 `ApBarView` 无 `custom_minimum_size.y==ap_bar_h` 路径)。 +- [ ] `board_side_rail_test.gd` 新建:`_test_side_rail_layout`(左/右栏 x 宽、board_area 高 548、toast 不压棋盘、hint 节点不存在)+`_test_signals`(三个信号与 setter)。 +- [ ] `run_all.gd` 注册 `board_side_rail_test.gd`。 +- [ ] 跑 `board_side_rail_test` 与 `stage_background_test`;报告写读数。 + +### T2 格边公式、顶预留与命中(0.5 日) + +**取用**:T1 的 `side_rail_w`;`BoardZoneView._side_rail_w`。 +**产出**:`board_view.gd` 的 `TOP_RESERVE=44`/`BOTTOM_RESERVE=12`、`_cell_for(n, avail, side_rail_w := 0.0)`、棋盘原点、命中不变;`layout_probe`/`ui_input_probe` 带侧栏参。 + +- [ ] `board_view.gd` 加 `const TOP_RESERVE := 44.0`、`const BOTTOM_RESERVE := 12.0`;`set_cell_area(avail: Vector2, side_rail_w: float = 0.0)`、`rebuild(board, minesweeper, side_rail_w: float = 0.0)`(公开方法数保持 27;`rebuild` 内调 `set_cell_area(size, side_rail_w)`)。 +- [ ] `_cell_for(n: int, avail: Vector2, side_rail_w: float = 0.0)`:`floor((min(avail.x - 2*side_rail_w - 12 - DEPTH_PX, avail.y - TOP_RESERVE - BOTTOM_RESERVE - DEPTH_PX) - (n-1)*SEP)/n)`,`clampi [26,46]` 不变。 +- [ ] `_wrap` 由 `CenterContainer` 改为全幅 `Control`(`mouse_filter=IGNORE`);`board_px` = 棋盘外框(`cols*stride - SEP`,12×12=478;**不含悬崖 8**);`_svp_container.position = Vector2((avail.x - board_px.x)*0.5, TOP_RESERVE)`;容器尺寸 = `board_px + Vector2(DEPTH_PX, DEPTH_PX)`(`_update_world_size` 现有 `px` 含悬崖,仅用于容器尺寸);`_update_world_size`/`set_cell_area` 同一处写入;`cell_origin`/`_cell_at` 继续读该 position;`set_cell_area` 同拍重跑 `TerrainBack/Front.setup(...)`、`FloatLayer.setup(cell, origin, entries, font)`、`LabelShadow.setup(cell, cells)`(格边/原点变更)。 +- [ ] `main.gd:470` 与 `main_debug_flow.gd:104` 的 `rebuild` 调用传布局表值(main 用 `db.presentation.battle_layout.side_rail_w`;debug flow 用 `root.db.presentation.battle_layout.side_rail_w`);`ApBarView` 不新增公开 `side_rail_w` 成员。 +- [ ] `board_terrain_test.gd:_test_cell_formula_base`:`_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`;`cell_origin(Vector2i(0,0))==Vector2(279,44)`(board_area 局部;屏幕 523,296);14×14 局部 (281,44)。 +- [ ] `board_terrain_test.gd:_test_hit_test_logical_rect`:`_cell_at(cell_center_local(c))==c` 对 12×12 全格;顶面左上角点按逻辑公式归属北/西邻格(不做归本格特判);板外返回 `(-9,-9)`。 +- [ ] `layout_probe.gd` 的 `_cell_for` 调用带 `main.db.presentation.battle_layout.side_rail_w`;加 D 区/棋盘原点/顶预留读数;1920 档按全局等比 1.35 断言构图一致。 +- [ ] `ui_input_probe.gd:360-366` 的 `set_cell_area` 恢复调用带 `main.db.presentation.battle_layout.side_rail_w`;`board_gen_reward_test` 的 2 参调用保持(测试独立口径)。 +- [ ] 跑 `board_terrain_test` 与 `layout_probe`;报告写读数。 + +### T3 地形深度层(2.0 日) + +**取用**:T2 的格边/原点;art-bible v3.51 §4.1 三关八色。 +**产出**:`board_terrain_palette.gd`、`board_terrain_layer.gd` 两个实例(back/front);`BoardView` 装配;`cell_base_layer.gd` 删除;接触带迁入 CellUnit。 + +- [ ] `board_terrain_palette.gd`:八色常量(`Color("#...")`)按 art-bible v3.51 §4.1 三关表;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;`palette_for(board_type)` 返回 Dictionary;未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。 +- [ ] `board_terrain_layer.gd`:`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`(`sealed_at` = 封印格查询 Callable);`set_pass("back"/"front")`;`set_hero_foot_y(y)`;`_draw()` 中**地面/投影/封印石/背岩体只在 back 画**(整板悬崖仍由 `BoardWorld._draw` 承担,不重复绘制),岩体按 pass 过滤(back=脚底≤hero,front=>hero),每个 setter 调 `queue_redraw()`;静态 `lift_for(cell)`/`eshift_for(cell)`。 +- [ ] 封印石贴片(back):`sealed_at(c)` 为真的格,在连续地面之上铺本格逻辑 rect 的 `palette.light_edge` 实色(可带 1px `palette.seam` 收边),不越格、不加新色;封印黑对受光棱对比 6.45–9.94:1(art-bible v3.51 §3.2/§4.1)。 +- [ ] 岩顶公式:`LIFT=round(cell*0.435)`、`ESHIFT=round(cell*0.109)`;四邻连通合并;相邻墙顶搭接 2;板边外延 ESHIFT;南崖高 LIFT、宽 cell+ESHIFT;东崖宽 ESHIFT、高 cell+LIFT;禁竖条纹。 +- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `_world/TerrainBack`(z=-1)与 `_world/TerrainFront`(z=2),不新增类成员;两层设 `use_parent_material = true`(随 `_world.material` 去饱和);back 画地面/投影/封印石/背岩体;front 画南侧岩体;`hero z=1` 不变;格件 z 按脚底行分档(北侧 0、南侧 3;**封印格恒 0**),由 `_resort_cell_decals` 重算(顶面贴花/交互/迷雾同格件 z);`board_world` 悬崖保留 z=0、`mat` 取新 palette 岩顶色(`_refresh_slab` 不再写 `COL_BRICK`);`rebuild` 清 `_world` 子件时跳过 `TerrainBack`/`TerrainFront`/`LabelShadow`(只清格件与英雄),再对各层重跑 `setup`(不重建节点);`setup` 传入 `_minesweeper.has_seal` 作 `sealed_at`。 +- [ ] `BoardView._resort_cell_decals()`(私有):遍历 `_cells`,`u.z_index = 0 if u.seal_on else (3 if c.y > hero.y else 0)`;`ContactGlow`/`MemoryGround` 子件 `z_as_relative=false`、`z_index=-1`(全局 -1:地面之上、阴影圆 0 之下);`refresh` 与 `_update_hero` 末尾调用;hero 缺位时全部按 0 档。 +- [ ] `board_view.gd` 删 `_paint_cell_base`/`_paint_cell_facade`(及 `_paint_cell`/`refresh` 调用)、`_floor_tile_for`/`_wall_tile_for`、`_build_cell_unit` 的 `u.base.bevel`;`_paint_cell_ink` 删 `bg` 计算/返回(`COL_FLOOR`/`COL_BRICK` 随之删)但保留 glyph 计算:**封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`(色牌字形),普通已开格只把 glyph 交给浮空 entries、`u.glyph` 留空**;`_apply_contact_bands`/`_process`/`_reset_breath` 的 `u.base.contact_*` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`(不再经 `u.base`);`COL_DIGIT` 无引用即删;英雄贴图缺位字形「人」回退随基座退役(T4 登记)。 +- [ ] 删除 `cell_base_layer.gd`;`board_cell_unit.gd` 去 `_BASE_LAYER` 预载、`base` 成员与 `base.draw_base`,文件头注删 `cell_base_layer` 引用;英雄蓝框随基座退役;接触带绘制迁入固定名字低层子件 `ContactGlow`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下;只画英雄格地面侧,正交整边/斜向角点+两半边,逻辑格边,不进岩体);记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(同全局 -1);BoardView 计算 `ground_visible_rect`(本格逻辑 rect 扣除南/东邻未开格岩顶越入,南邻约 LIFT−SEP、东邻约 ESHIFT−SEP)并下发 `MemoryGround.setup(...)`/`ContactGlow.set_bands(..., ground_visible_rect)`,子件不读棋盘、CellUnit 不增成员;两个低层子件只绘地面可见区,禁整矩形覆盖 back 岩顶/崖面;设 `use_parent_material = true`(随世界去饱和);`draw_removed_dim` 墙格改顶面 rect。 +- [ ] `standee_present_values_test.gd:79-86`:`cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱绘制点),删 `FACADE_HIGHLIGHT_PX), UiKit.BRICK, true` 断言;`body_src` 段保留;跑该件至 0。 +- [ ] `board_terrain_test.gd:_test_merged_mass_geometry`:四邻合并、相邻墙顶 rect 相交/搭接 2、无墙顶内框、地面无缝;`_test_projection_ratios`:38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外 2 墨边、南/东内阴影 3×2。 +- [ ] `board_terrain_test.gd:_test_depth_order`:三行夹具,断言 back 含北岩体、front 含南岩体、hero 在两者之间;北侧格件 `z_index=0`、南侧格件 `z_index=3`、**封印格(含南侧)`z_index=0`**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素(探针)。 +- [ ] `run_all.gd` 注册 `board_terrain_test.gd`。 +- [ ] 跑三关 golden 采集(先不重制基线)看差异落点;报告写地形层 draw calls。 + +### T4 浮空数字层与阴影圆(1.5 日) + +**取用**:T2 的原点/格边;T3 的深度分层。 +**产出**:`board_float_layer.gd`(Control 外壳)、`board_label_shadow_layer.gd`(Node2D 世界层);`BoardView` 装配;`cell_mark_overlay` 删数字路径。 + +- [ ] `board_float_layer.gd`:`setup(cell, origin, entries, font)`(origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4)→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()`/`label_metrics()`(壳层局部坐标);全幅 Control(`mouse_filter=IGNORE`)、z 最高;每个 setter 调 `queue_redraw()`;**不画阴影圆;封印格不进 entries**。 +- [ ] `board_label_shadow_layer.gd`:`setup(cell, cells)`(世界局部/格坐标系,不传 shell 原点;`cells` = 浮空 entries 的格集,**不含封印格**);`_draw()` 画 10×6 四层同心椭圆(外→内 α40/70/105/140,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle`);圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()`(世界局部);setter 调 `queue_redraw()`。 +- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `FloatLayer`(BoardView 子 Control,全幅,z 最高)与 `_world/LabelShadow`(Node2D,z=0),不新增类成员;`LabelShadow` 设 `use_parent_material = true`,`FloatLayer` 不在 `_world` 材质链,`set_desaturated` 同拍给 `FloatLayer.material = _desat_mat`/`null`(结算期浮空数字同样灰化,禁成彩色例外);`rebuild` 清 `_world` 子件时跳过 `LabelShadow`(T3 同款跳过表);entries 由 `refresh` 的已开记录生成(`1–8`/`危`/`?`),**封印格跳过**(其字形走色牌),记忆态不生成 entries。 +- [ ] `BoardView.set_world_font(f)` 同时 `FloatLayer.set_font(f)`;`cell_mark_overlay.gd` 删普通数字字形/色牌路径,**保留封印格字形+`_draw_digit_plate` 色牌**;`BoardCellUnit.plate` 保留(封印格 `true`、普通格 `false`);`board_view.gd` 删 `_digit_ink`/`_palette.digit_*`;`refresh` 字形段删 `_digit_ink` 三档与 `plate_digit` 普通路径(:586-591),封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`,普通已开格只交 entries(记忆墨仍用 `FOG_MEMORY_INK`;浮空字固定暖白芯);英雄贴图缺位字形「人」回退随基座退役(资产在包,正常路径不可达),实现报告「实现决定记录」登记。 +- [ ] `run_all.gd` 注册 `board_float_label_test.gd`。 +- [ ] `board_float_label_test.gd:_test_label_geometry`:字高 21、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;`_test_topmost_layer`:`FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle`:圆 10×6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆、封印格无圆;`_test_desaturation`:`set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast`:四类底复合对比 ≥4.5。 +- [ ] `board_float_label_test.gd:_test_no_ordinary_plate_path` 与 `board_terrain_test.gd:_test_seal_substrate` 扫描/断言:普通数字路径(`board_view.gd`/`board_float_layer.gd` 与 `cell_mark_overlay` 的非封印分支)零 `plate_digit`/`_digit_ink_mode`;`DIGIT_PLATE`/`_draw_digit_plate` 只在封印格分支命中。 +- [ ] 跑 `board_float_label_test`;三关截图看顶行数字越界与小人遮圆;报告写读数。 + +### T5 交互/封印/微光/迷雾锚点(1.5 日) + +**取用**:T3 的地形顶面;T4 的浮空层/阴影圆。 +**产出**:`cell_mark_overlay`/`cell_unit`/`seal_mark_layer`/`cell_type_glow_layer`/`board_view` 锚点与 fog rect;`board_terrain_test` 锚点/迷雾断言。 + +- [ ] `BoardView._top_face_rect(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell, cell)`、地面格逻辑 rect;`BoardView._visual_rect_for(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell+ESHIFT, cell+LIFT)`、地面格逻辑 rect;两者不新增公开方法。 +- [ ] `CellUnit` 增 `top_face_offset`(墙格 `(-ESHIFT,-LIFT)`、地面 `(0,0)`)与 `visual_rect`;`_draw` 用 `Rect2(top_face_offset, edge, edge)` 传给 face;`_sync_seal_layer` 调 `setup(edge, visible)`(**不传 top_face_offset**——封印居逻辑格心,见下条);`cell_type_glow_layer.setup(edge, group, top_face_offset)`;`cell_mark_overlay` 的变异/徽章/悬停/退色/路径按该 rect(墙格顶面、地面逻辑;路径点迹只地面逻辑)。 +- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible)` 不变(子件本地全幅 draw_rect,圆心 = CellUnit 本地 `(edge/2, edge/2)` = 逻辑格心);**不随岩顶 −ESHIFT/−LIFT 偏移**(art-bible v3.51 §3.2/§8.2);环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。封印子件设 `show_behind_parent = true`,保证身份色牌叠于法阵之上;封印格地面受光棱石由 `board_terrain_layer` back 画(T3)。 +- [ ] 类型微光:绘制 rect 改顶面 rect;`board_shot_probe`/`type_glow_shot_probe` 的「禁越圈」允许区改顶面 rect;微光不越出本格岩顶。 +- [ ] 迷雾:`CellUnit._draw_fog_layer` 墙格画三块黑罩(顶面 rect+南面 `Rect2(x-ESHIFT,y-LIFT+cell,cell+ESHIFT,LIFT)`+东面 `Rect2(x-ESHIFT+cell,y-LIFT,ESHIFT,cell+LIFT)`;只在未开格);记忆态由固定名字低层子件 `MemoryGround` 画新地面色(palette floor)+灰罩+记忆墨数字,不读 `base.tex_base`,不生成浮空 entries;只绘地面可见区(扣南/东邻岩顶越入),不覆盖北/西邻格地面;封印格在记忆态同样随格隐没(印记与色牌不显)。 +- [ ] 接触带:绘制迁入固定名字低层子件 `ContactGlow`(全局 z=-1:地面之上、阴影圆 0 之下);`board_view._apply_contact_bands`/`_process`/`_reset_breath` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`,不再经 `u.base.contact_*`;只画英雄格地面侧,正交整边/斜向角点+两半边;只绘地面可见区(扣南/东邻岩顶越入);`_contact_unit` rect 不改;光不进岩体。 +- [ ] `board_terrain_test.gd:_test_top_face_anchor`:**封印圆心 = 逻辑格心(不偏移)**、变异纹带/微光 rect 按 `-ESHIFT/-LIFT`;`_test_seal_substrate`:封印格地面像素 = 本关 `palette.light_edge`、普通已开格 = `palette.ground`;封印格 `plate=true`、`glyph` 为危/数字、无浮空 entries/无阴影圆;封印格 `z_index=0`;`_test_fog_rect`:墙格三块黑罩覆盖顶面+南+东、地面格不越格;采样北邻格左上 (x_n+2,y_n+2) 与西邻格左上 (x_w+2,y_w+2) 的非岩顶地面像素 = 原地面色、零黑罩(岩顶投影可越入邻格屏幕区);`_test_memory_cover`:记忆态格与南邻墙体重叠区采样,`MemoryGround` 只绘地面可见区,记忆地面/灰罩/记忆墨与 `removed_dim` 不覆盖南邻岩顶(重叠区像素来自南邻墙体);`_test_contact_glow`:接触带只绘地面可见区、在英雄格地面侧且全局 z=-1。 +- [ ] 跑 `seal_mark_params_test`/`type_glow_test`/`board_terrain_test`;报告写读数。 + +### T6 旧瓦片与旧路径退役(0.5 日) + +**取用**:T3/T4/T5 绿。 +**产出**:63 PNG+63 `.import` 删除;`tile_palette.gd`/`terrain_tile_sets_test.gd` 删除;`player_copy_sweep_test` 落牌断言替换;`ui_contrast_probe` 迷雾派生段替换。 + +- [ ] 删除 `game/assets/art/board/terrain_*` 63 PNG 与同名 `.import`;保留 `seal_mark.png`+`.import`。 +- [ ] 删除 `tile_palette.gd`、`terrain_tile_sets_test.gd`;`run_all.gd` 移除该套件;`board_view.gd`/`board_world.gd`/`ui_contrast_probe.gd` 的 `TilePalette` 引用全清。 +- [ ] `player_copy_sweep_test.gd:142-147`:普通已开危险格 `u.plate==true` 改 `u.plate==false`,并断言浮空 entries 含该格(或 `label_metrics()` 有该格);封印格色牌断言归 `board_terrain_test._test_seal_substrate`;`ui_contrast_probe._fog_derived_check` 改读 `board_terrain_palette` 的新地面/岩顶色或渲染帧取样,三行行值按新地面色重算(±2/255),删除旧瓦片均值段。 +- [ ] `board_terrain_test.gd:_test_legacy_assets_absent`:目录无 `terrain_*`、`seal_mark.png` 在库;源码 grep 零 `terrain_`/`TilePalette`/`CellBaseLayer`/`u.base`。 +- [ ] 跑 `repo_structure_audit.py`、`capability_audit.py` 与 `board_terrain_test`;报告写清单;旧地形行**保留**(实现批禁写 `game/tests/README.md`;删除归写卡段后续,T8 audit 经卡内豁免通道绿)。 + +### T7 验收面换代与三关 golden(1.0 日) + +**取用**:T3–T6 全绿。 +**产出**:`board_shot_probe` 视图 1036×548、侧栏 200、顶面 rect 微光圈/封印 rect;三关 golden 重制;渲染闸绿;`type_glow_shot_probe`/`layout_probe`/`ui_input_probe`/`ui_contrast_probe` 换代;三关色板逐值/互辨。 + +- [ ] `board_shot_probe.gd`:`view.size=Vector2(1036,548)`、`view.position=Vector2.ZERO`;`view.rebuild(..., 200)`;`_meta` 写全幅 rect;`_crop_cell` 用 `_visual_rect_for` 的屏幕换算;`_check_dual_frames` 的允许区改顶面 rect(用 `lift_for/eshift_for` 换算);**`_seal_evidence` 保持逻辑格 rect(封印居格心),选择器按迭代56后的 `has_seal` 口径**;注释与 `game/tests/golden/README.md` 口径一致。 +- [ ] `type_glow_shot_probe.gd:64-78` 视图改 1036×548、`rebuild(..., 200)`(与生产同格边 38),允许区/取样改顶面 rect;`layout_probe.gd` 的 `_cell_for` 带侧栏;`ui_input_probe.gd` 的恢复调用带侧栏;`ui_contrast_probe` 浮空四类底段与迷雾段换代。 +- [ ] 跑一次渲染闸看差异(预判棋盘三图全幅 changed>0,属换代);**显式呈报用户,按 `game/tests/golden/README.md` 现行口径获用户确认后**再按 `tools/golden_baseline_refresh.sh` 重制三关基线;复闸绿。 +- [ ] 三关色板逐值核对:`board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.51 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结);`glow_discrimination_sheet.py` 读已删旧 `terrain_*`,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过。 +- [ ] 跑 `bash tools/run_all_gates.sh --code`;报告写 smoke/unit/probe/render 读数。 + +### T8 产出物落位(0.5 日) + +**取用**:T7 全绿。 +**产出**:`reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录);`reports/iter-反哺点-<日期>.md`(§6 每条同步面的落点);本卡验收对照表逐行勾选。 + +- [ ] 实现报告写 T0–T7 状态、三关实机目检清单、draw calls/格边/原点/锚点读数、旧资产删除清单、三关色板读数。 +- [ ] 反哺点清单逐条列 §6 各行的落点:已同步的写“无新增”,实现偏差写“待文档批裁决”,架构表 `cell_base_layer` 行写“待用户发令修订”。 +- [ ] 验收对照表 §12 每行勾选;未过行标红并停卡,不合并。 +- [ ] 独立验收审计(未参与实现的会话/子代理)按 `test-conventions §8.7` 跑;报告落 `reports/iter-验收审计-<日期>.md`;未过不合并。 +- [ ] 复跑 `capability_audit.py`(红项 0)与 `pipeline_gate.py`(卡片自身零红);能力表名实一致(旧地形行为保留行,不参与核对;删除归写卡段后续)。 + +--- + +## 12. 验证闸(改动—验收对照表) + +> 层级:单元/接口/集成/探针;真实入口列写实际驱动面;判据绑定面写被测改动特有的可观测面;能力行名称与 `game/tests/README.md` 同批入表。 + +| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+通过判据) | 层级 | 真实入口 | 判据绑定面 | 能力行 | +|---|---|---|---|---|---|---| +| 1. D 区侧栏+提示条退役(判据:`design/ux/battle.md:124`、`design/gdd/systems/表现与支撑/HUD框架.md:62`) | `battle_layout_table.gd`、`battle_layout.tres`、`ap_bar_view.gd`、`board_zone_view.gd:23-37,74-79,91-92` | `board_side_rail_test.gd:_test_side_rail_layout`+`_test_signals`;`stage_background_test.gd:_test_side_rail_width_from_table`;`layout_probe.gd:_ready` | 单元+探针 | `BoardZoneView.new(layout)`→`ap_bar`/`_board_area`(测试读私有) | 左/右栏各宽 200、board_area 高 548、`side_rail_w==200`、hint 节点不存在、toast 不压棋盘 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | +| 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md:140,144`) | `board_view.gd:205-232,403-404,428-439`、`main.gd:470`、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base`+`_test_hit_test_logical_rect`;`layout_probe.gd:_ready`;`ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)`/`rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) | +| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md:170,173`) | `board_terrain_layer.gd`(新增)、`board_view.gd`、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry`;`standee_present_values_test.gd:_init`(V11 源码锚改指 `board_terrain_layer.gd`);三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()`→`_world/TerrainBack`、`_world/TerrainFront` 的 `mass_rects()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 4. 投影/崖面/受光(判据:`design/art/art-bible.md:171,172,174`) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios`;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外2、南/东内阴影 3×2 自 0.217 起、投影 4×4 α0.44/0.30/0.16/0.07 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 5. 脚底排序遮挡(判据:`design/art/art-bible.md:175`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md:176`、`design/ux/battle.md:307`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21、间距 15、视觉顶 38、线 2、1px 投影;圆 10×6、圆心格顶+7、z=0 低于 hero;**封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | +| 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md:165,307,313`) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer`+`_test_desaturation`;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack`/`TerrainFront`/`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | +| 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md:167,175`、`design/ux/battle.md:311-312`) | `board_view.gd`、`cell_mark_overlay.gd`、`seal_mark_layer`、`cell_type_glow_layer`、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor`+`_test_seal_substrate`;`seal_mark_params_test.gd`;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.visual_rect`/`CellUnit.z_index`/封印格 `plate` | **封印圆心=逻辑格心(不偏移)**、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true`、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | +| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md:427-429`) | `board_cell_unit.gd:_draw_fog_layer`/`MemoryGround`、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect`+`_test_memory_cover`;`ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.fog_state`/`MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | +| 10. 命中逻辑格(判据:`design/ux/battle.md:140`) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()`/`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c`;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) | +| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md:177,215`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 在库、普通数字零 `plate_digit`/`_digit_ink_mode`(封印格 `plate`/`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 | +| 12. 侧栏信号/setter(判据:`design/ux/battle.md:163`) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed`/setter | `stop_pressed`/`refresh_confirmed`/`legend_toggled` 逐信号;`set_ap`/`set_rap`/`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | +| 13. 接触带延续(判据:`design/art/art-bible.md:168`) | `board_cell_unit.gd`、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow`;`type_glow_test.gd` | 单元 | `BoardView.refresh()`→`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) | +| 14. 三关色板/互辨(判据:`design/art/art-bible.md:202,415`) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` | 三关八色与 art-bible v3.51 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge` | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 15. 取证面换代(判据:`game/tests/golden/README.md:28,31`) | `board_shot_probe.gd`、`type_glow_shot_probe.gd`、`layout_probe.gd`、`ui_input_probe.gd`、`ui_contrast_probe.gd` | 三关 `board_shot_probe`+渲染闸;`type_glow_shot_probe`;`layout_probe.gd:_ready`;`ui_input_probe.gd`;`ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn`;`tools/render_gate.sh` | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈、**封印取证保持逻辑格 rect(圆心格心)**、三关 golden 重制后 0 差异 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | +| 16. 测试入口/能力审计(判据:`design/engineering/test-conventions.md:196`) | `run_all.gd:225`、新增测试件、`game/tests/README.md` | `bash tools/run_all_gates.sh --code`;`capability_audit.py` | 集成 | 单元测试全套件 | 三新套件在册、terrain 套件移除、能力审计红项 0、全绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 17. 产出物/独立审计(判据:`design/engineering/test-conventions.md:147`) | `reports/` | 末卡产出物落位;`reports/iter-验收审计-<日期>.md` | 集成 | 实现报告/反哺点清单/审计报告 | 三件齐、逐行勾选、审计未过不合并 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | + +**测试削弱申报**(允许删除/替换的旧断言): + +- `terrain_tile_sets_test.gd` 整件删除(旧瓦片套/三态墨色已退役);其“格套完整性/色相域/墨模式”覆盖由 `board_terrain_test`/`board_float_label_test` 接班。 +- `ui_contrast_probe.gd` 旧瓦片均值段与 `_fog_derived_check` 的 TilePalette 依赖删除;改为读新 palette/渲染帧,浮空字四类底段新增。 +- `stage_background_test.gd` 新增 `_test_side_rail_width_from_table`(该件无旧 AP 条高度测试可改名),等价断言 `side_rail_w==200`;`player_copy_sweep_test.gd:142-147` 的普通已开危险格 `u.plate==true` 改 `u.plate==false`+浮空 entries 含该格(封印格色牌保留,归 `_test_seal_substrate`)。 +- `board_view.gd` 的 `_paint_cell_base`/`_paint_cell_facade` 段随基座退役(其立面/投影/蓝框覆盖由 `board_terrain_test` 的岩体/崖面/接触带断言接班);`u.base.*` 无残留。 +- `standee_present_values_test.gd:79-86` 的 `cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(旧口沿高光绘制点随基座退役,等价断言改新落点);`body_src` 的 V11 断言保留。 +- `board_shot_probe.gd` 的 900×900 视图与逻辑格“禁越圈”允许区替换为 1036×548 与顶面 rect;加严口径本身不删、不放宽。 +- 其它旧断言禁止删除/放宽;未申报的删除由独立验收审计判红。 + +**判据绑定面口径**:所有行为行都绑被测改动特有的可观测面(绘制 rect/z 序/常量/信号/读数);`board_terrain_test` 的地形断言读 `mass_rects()`/`terrain_metrics()`,不读私有 `_draw` 内部;浮空断言读 `label_rects()`/`label_metrics()`/`circle_rects()`;侧栏读公开 setter/信号;golden 绑渲染帧。 + +--- + +## 13. 异常分级 + +- **L1 自救**:测试环境缺 `user://`、字体、导入缓存——按 `game/tests/README.md` 现行坑册处置。 +- **L2 记录继续**:三关色板派生读数偏差在 ±1 通道内、draw calls 波动 <10%——记入实现报告继续。 +- **L3 停机呈报**: + - 新路径与 art-bible 条款冲突(比例/顶预留/圆心/层序/三关色板/封印承载任一不符)——停卡,列反哺点,禁自行改条款。 + - 封印呈现与迭代56「受理即揭示」或 art-bible v3.51 封印条冲突(印记落未开格、圆心随岩顶偏移、身份字形进浮空层、色牌层序颠倒、封印石对比 <4.5)——停卡呈报,禁把封印改回旧假设。 + - `board_terrain_layer` 超 7 公开方法/12 成员且按职责拆不出内聚单元——停卡走豁免/还债通道,禁凑数拆绿。 + - 机检键与卡片契约互斥(如测试要求保留 `plate` 字段)——停卡呈报,禁为机检保留无效成员。 + - 三关色板逐值/互辨不过——停卡呈报,禁调色绕过或改判据。 + - 三关 golden 重制后仍有非预期差异——停卡,先判有效/失效,禁“重制一下就绿”。 + - 迷雾黑罩覆盖北/西邻格地面——停卡,按三块形状修正,禁扩大/缩小判据掩盖。 + - 固定名字层子件(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`)在 `rebuild`/换板后出现重名、丢失或被清场误删——停卡,按固定名字表修正,禁改成 BoardView 成员绕过 S13。 + +--- + +## 14. 代拍板白名单 + +允许实现期自行拍板(超清单记入实现报告「实现决定记录」): + +1. `board_terrain_layer` 内 back/front 两实例的精确 z 值(只要满足 back 批名:营地场景重排接线 · 日期:2026-11-07 · 验收档:中(布局呈现数据面,无存档/结算传播) -> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交) -> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.9 §2.3/§3/§5 第 12 条(2026-11-05 与 2026-11-07 用户裁)+[art-bible](../design/art/art-bible.md) v3.48 §6.2(围墙显示矩形与墙脚入土线)+[camp](../design/ux/camp.md) 第 29 行(围墙带 y220–420)+2026-11-07 用户裁原话(墙高 200、顶 y220、门/板跟随、墙脚入土;预览过审 `artwork/2026-11-07-营地接线预览/camp_new_layout_preview_c.png`) +> **接管必读**:本卡对应工作已有部分实现落库且未做完。已完成项/未完成项见 §2「写卡时实查基线」;接管人必须先按 §1.3 做 T0 扫描,逐项复核当前 commit 的真实状态,禁按「未做」整批重写,也禁按「已有」跳过核对。 +> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交;**已补回**,状态「已写卡」,见 `待办清单.md`)。 +> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.10 §2.3/§3/§5 第 12 条+第 13 条+[art-bible](../design/art/art-bible.md) v3.48 §6.2+[camp](../design/ux/camp.md) 第 29 行+2026-11-07 用户讨论定稿(土线覆盖围墙底与门扇底;最终墙件预览过目;渲染闸与独立审计入场)+2026-11-05 用户裁定的六件落位值。**设计已补录**:六件逐值矩形(dummy/forge/tent/chest/notebook/campfire)已补入 `camp-scene-prompts.md` v1.10 §5 第 13 条(2026-11-08);art-bible §6.2 门扇底同口径仍列反哺点(不阻塞本卡成立)。 +> 本版任务边界:**只出需求卡片与两条上游缺口补录**(设计文档六件逐值、待办条目);不实现游戏代码、不提交、不合并。实现与提交须用户另行发令。 ## 1. 目标与完成定义 -把营地十层的运行数据换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;新围墙件(1280×164,补尖+墙脚入土缺口)入包;布局表几何红线单测与冒烟全绿;游戏内营地图层按新矩形铺底、墙脚无贯通直线。 +### 1.1 目标 -完成定义:`camp_scene_layout_test.gd` V14 全绿(含新值钉断言)+冒烟测试 exit 0+`palette_check` 围墙对八件零新增色+`path_check` 0 问题;游戏内目检归用户(登记不阻塞)。 +把营地十层换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;围墙最终件(1280×164,补尖+底边入土缺口)入包;**土线同时覆盖围墙底与门扇底**,实机读作插在土里;十层结构不变(不新增图层);最终墙件重新出预览并经用户过目;布局/土线/渲染/独立审计全部有读数;营地屏按 `test-conventions.md:100` 纳入渲染闸 golden 机器面。 -## 2. 现状事实(开工自行复核) +### 1.2 完成定义 -- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):wall `texture_rect=(0,261,1280,49)`、gate `(520,250,240,211)`、board `(845,268,130,121)`、tent `(982,520,251,170)`、forge `(40,467,240,193)`、dummy `(340,520,120,180)`、chest `(1097,700,106,90)`、notebook `(818,704,100,66)`、campfire `(560,571,160,149)`;`wall_band=(0,240,1280,70)`;`gate_gap=(520,760)`。 -- 视图按表建层、`TextureRect.STRETCH_SCALE` 拉伸到矩形尺寸:[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136);子节点序=表序=z 序(同文件头注)。 -- schema 加载期 fail-fast:validate 入口 [camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);贴图矩形不出画布、命中区不出画布/不侵 y<48/两两不相交、`wall_band` 必须包含 wall 贴图矩形([camp_scene_layout_table.gd:67](../game/data/schemas/camp_scene_layout_table.gd#L67))。 -- 单测读表动态取值、以关系谓词为主:[camp_scene_layout_test.gd:82](../game/tests/unit/presentation/camp_scene_layout_test.gd#L82)(门扇命中对齐 gate_gap)、`:87`(布告板命中顶落围墙带)、`:77`(篝火命中贴贴图底)。 -- 包内围墙件仍是旧 1280×49(`game/assets/art/scene/scene_camp_wall.png`);门扇件 240×211 由运行时压扁到矩形高(STRETCH_SCALE,2026-11-07 用户裁「不动美术素材」),无需换件。 +本批算完成,必须同时满足: + +1. 最终墙件预览已用 `scene_camp_wall_final.png` 重新生成,并经用户过目(U0)。 +2. 十层 `.tres` 值与 §3 逐字一致;schema 默认值、视图层构建一致;层数仍为 10,bg/wall 仍占 z0/z1。 +3. 土线(围墙底+门扇底)与过审预览读感一致;底边界不是贯通全宽的直线;门扇底不再单独露直边,也不出现独立灰影;门扇 NORMAL/HOVER/DISABLED 切换后土线仍在。 +4. 营地单测 V14+新钉值+门扇状态土线保留单测全绿;结构探针 PASS;营地截图的土线机检 PASS;营地屏 camp golden 已冻结并经用户确认;渲染闸全绿。 +5. 独立验收审计(未参与实现的会话或子代理)通过,报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`(日期取审计当日)。 +6. 游戏内终审已登记(用户自排,登记不阻塞);art-status-checklist 的营地行补录事实已列反哺点。 +7. 代码域闸全绿,远端 CI 对合并提交为绿(跑闸步真跑过);静态扫描零新增红(S11「雷格」已在当前基线修复)。 +8. 实现报告与反哺点清单写齐;实现报告内含**完成进度扫描记录**(见 1.3)。 +9. 上游缺口已闭合:设计文档六件逐值已补录(`camp-scene-prompts.md` v1.10 §5 第 13 条);待办清单条目已在册(状态「已写卡」)。编入迭代/开工/提交/合并仍须用户发令。 + +### 1.3 完成需求时的完成进度扫描(收口前置,必做) + +**任何卡或批次在宣称完成、写实现报告、请求合并之前,必须先扫描当前仓库的完成进度。未扫描不得宣称完成。** + +- 扫描时以实查为准:已存在的实现也要逐项对照本卡,不因“看起来已有”而跳过;不假设“应该没做”或“应该已经做了”。 +- 发现缺失、值不一致、素材与卡不符、测试缺读数、文档未同步,一律记为未完成;逐条列缺口,不得用一句“已完成”带过。 +- 扫描记录写进实现报告,至少含:检查时间、当前 commit、每一项的实查值/实际状态、与卡的差异、结论。 +- 扫描时点:**T0 开工扫描一次(基线)**;**T4 收口再扫描一次(最终)**。两次都留读数。 + +扫描面(逐项勾): + +| 面 | 要读什么 | 完成判据 | +|---|---|---| +| 布局表 | `game/data/tables/camp_scene_layout.tres` 十层 texture_rect/hotspot、wall_band、gate_gap | 与 §3 表逐字一致;层序不变 | +| schema | `game/data/schemas/camp_scene_layout_table.gd` 默认值/注释 | wall_band=(0,220,1280,200);validate 通过 | +| 视图 | `game/presentation/views/camp_scene_view.gd` 层构建、`expand_mode`、土线材质、门扇状态材质 | 门扇 138 高生效;土线覆盖墙+门扇底;NORMAL/HOVER/DISABLED 不丢土线;10 层 | +| 素材 | `scene_camp_wall.png` 尺寸/色数/柱尖/底边;`scene_camp_gate.png`;`scene_camp_bg.png`;源/包 md5 | 墙 1280×164、不透明 12 色、柱尖完整、底边有缺口、源包 md5 一致;门扇 240×211;背景 1280×800 | +| 导入缓存 | `game/.godot/imported/*.ctex` 的 mtime 与 `source_md5` | 与盘上源文件 md5 一致;改素材后已强制重导入 | +| 单测 | `camp_scene_layout_test.gd` V14+钉值+门扇状态土线保留 | 全 PASS,exit 0 | +| 结构探针 | `ui_struct_probe` camp 段 | PASS | +| 渲染/土线/golden | `shot_probe` 营地截图+`check_soil_line`+camp golden+`render_gate.sh` | 土线断言 PASS;camp golden 在位且经用户确认;渲染闸全绿 | +| 设计文档 | `design/art/camp-scene-prompts.md` §5 第 6 条/第 13 条、`design/art/art-bible.md` §6.2 | 六件逐值在册(本卡前置);门扇底同口径/240×147 与 138 口径统一属文档批反哺点,不阻塞本卡 | +| 审计 | 独立验收审计报告 | 报告在位、发现已闭合 | +| 文档/记录 | art-status-checklist、实现报告、反哺点清单、终审登记 | 各自落位;反哺点有去向 | +| 仓库红账 | 当前 master 静态扫描/CI | 本卡改动面零新增红;静态扫描 S11 零命中;外部红有处置结论 | + +## 2. 现状事实(开工复核基线,本卡不预写完成结论) + +- 当前分支**已经包含**本卡的部分实现(历史合并所致),且**未做完**。开工先按 §1.3 扫描,按实查值决定“已对/需改/缺件”,禁按“未做”整批重写,也禁按“已有”跳过核对。 +- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):以 §3 为目标值逐层核对;当前值以实查为准。 +- 视图 [camp_scene_view.gd:130](../game/presentation/views/camp_scene_view.gd#L130) 按表建层,[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136) 有 `EXPAND_IGNORE_SIZE`;土线材质是本案新增面。 +- schema 加载期 fail-fast:[camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);`wall_band` 包络校验在 [:59–:62](../game/data/schemas/camp_scene_layout_table.gd#L59-L62)。 +- 单测 [camp_scene_layout_test.gd:26](../game/tests/unit/presentation/camp_scene_layout_test.gd#L26) 读表动态取值;[:88](../game/tests/unit/presentation/camp_scene_layout_test.gd#L88) 起为 2026-11-07 钉值断言。 +- 素材:包内 [scene_camp_wall.png](../game/assets/art/scene/scene_camp_wall.png)、[scene_camp_bg.png](../game/assets/art/scene/scene_camp_bg.png)、[scene_camp_gate.png](../game/assets/art/scene/scene_camp_gate.png);尺寸与色数以 T0 实查为准。 +- **素材源路径**:最终墙件 `scene_camp_wall_final.png` 在主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/`(artwork 不入 git,worktree 无副本);T0 从主区取源,核 md5 与包内一致。 +- **写卡时实查基线(2026-11-08,worktree 基线 89f4fc78,供 T0 对照,不作完成结论)**: + - **已完成(实查)**:`.tres` 十层与 §3 逐字一致;schema 默认 `wall_band=(0,220,1280,200)`;view 有 `EXPAND_IGNORE_SIZE`/`STRETCH_SCALE`;V14 钉值断言在位;包内墙件 1280×164、全色 16(含透明/边缘 alpha)、不透明 12 色,与主区源件 md5 一致;门扇 240×211;背景 1280×800;`bash tests/static_scan.sh` S11 ok。 + - **未完成(实查)**:土线裁切材质(wall/gate);门扇 NORMAL/HOVER/DISABLED 保土线;土线机检 `check_soil_line`;门扇状态单测 `_test_gate_state_keeps_soil_cut`;camp golden+`render_gate.sh` camp 段+`golden_baseline_refresh.sh --camp`;最终墙件预览 U0;游戏内终审登记;实现报告/反哺点。 + - **接手动作**:上述均为写卡时点读数,接管人必须按 §1.3 做 T0 扫描复核当前 commit 的真实状态;已存在项逐项对照,不因「看起来已有」跳过;未完成项逐条补,不以一句「已完成」带过。 +- **导入缓存坑(本会话实证)**:主区曾出现 `.ctex` 停在 11-06、源文件已是 11-07 的旧缓存;旧缓存会让渲染闸拿到旧背景/旧围墙,绿读数无效。改素材后必须 `--editor --quit` 强制重导入,并核对 `source_md5`。 +- **S11 现状**:worktree 基线 89f4fc78 的 `game/probe/board_shot_probe.gd:34,35` 已是「危险格」;`bash tests/static_scan.sh` 实跑 S11 ok(扫描面 317 个文件)。历史日志里的「雷格」为旧读数,不构成本卡开工门;T3 复跑静态扫描,零新增红。 +- 待办清单条目已补回(状态「已写卡」);设计文档六件逐值已补录 `camp-scene-prompts.md` v1.10 §5 第 13 条;见头部。 ## 3. 设计契约(违反即返工) -🔴 逐层锁定值(写进 .tres,值逐字照此): +🔴 逐层锁定值(写进 `.tres`,值逐字照此): | 层键 | texture_rect | hotspot | hotspot_key | |---|---|---|---| @@ -35,103 +86,193 @@ | notebook | (870,515,100,66) | (870,501,100,80) | notebook | | campfire | (560,525,160,149) | (560,594,160,80) | campfire | -表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire)。 +表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire),**总层数仍为 10**。 -🔴 围墙件:1280×164、RGBA、≤32 色(实测 12 色)、顶行仅柱尖若干列不透明(柱尖补全)、底行全透明(入土缺口 1–7px 低频起伏);源文件=主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png`。 +🔴 围墙最终件:1280×164、RGBA、≤32 色(全色 16 含透明/边缘 alpha;**不透明色实测 12**)、柱尖完整、奶油描边(与既有物件同色)、底边 1–7px 低频起伏透明缺口(按 200 高拉伸后约 1.2–8.5px);显示矩形 (0,220,1280,200),运行时按 200 高拉伸;源文件主区 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 与包内文件 md5 必须一致(写卡时实查 md5 `328b83fa3a79a97ae3d0c02f5abf4604`)。 -🔴 门扇 hotspot 高 147=贴图 138+底部 9px 余量(沿用旧表「命中比贴图高 9」口径,属实现微决策,见 §9 代拍板)。门扇件不换件:现 240×211 由运行时压扁到矩形(用户 2026-11-07 裁「不动美术素材」;设计文档中「随门洞压扁重画」旧句已在本批改为运行时压扁口径)。 +🔴 门扇:沿用 240×211,不换件;运行时压扁到矩形 240×138,底压 y420;hotspot 240×147(贴图 138+9px 余量);门扇件底行中心区不透明(写卡时实查:底行局部 x99–143、全局 619–663 不透明,两侧为透明拱边),土线作用于底边中心可见区,两侧透明像素本就透出背景。 -🔴 其余六件的 hotspot 由旧表相对关系同偏移得出(dummy 同贴图;forge y−46/高+46;chest y−46/x−12/宽+24;notebook y−14/高+14;campfire y−46/高 80;board 同贴图 y/高+19)——值已列上表,禁止再自拟。 +🔴 **土线/入土线(围墙底+门扇底,2026-11-07 用户讨论定稿)**: + +- 目标读感:围墙底与门扇底都不与地面形成直边,边界按低频起伏裁切,裁切处透出背景层同列地面像素;门扇底不能单独露直边加灰影。 +- 实现形态:在 `CampSceneView` 内新增一个**土线裁切材质**(shader 字符串常量+一个私有应用函数),同时挂到 wall 层与 gate 层;不改 10 层结构、不新增图层、不新增运行时图片素材、不重画门扇件。 +- 裁切参数:底边基线 y420;起伏带**名义 9px**(基准顶线 411,即基线往上 9px);逐列顶线 `top = 411 + round(2 + 1.5*sin(gx/11.0) + 1.0*sin(gx/29.0+1.3))`,公式摆动后**实际顶线 410–416(裁切深度 4–10px)**;`round` 半值方向按引擎实现,机检容差 ±1;`y ≥ top` 的像素裁掉(透出背景);紧邻裁切口的**最后可见行 `y = top−1` 压暗 0.85**(1px 暗边;`top` 行已被裁掉,压暗它无意义)。 +- 全局坐标:`gx = UV.x * u_width + u_x_offset`(wall:offset 0、width 1280;gate:offset 520、width 240);`gy = u_y_offset + UV.y * u_height`(wall:220/200;gate:282/138)。不用 `FRAGCOORD`,避免视口缩放/黑边影响。gate 局部 x 经 offset 520 还原成画布全局 x,保证墙与门扇接缝处同一条边界。 +- 材质与状态:土线材质直接挂 wall/gate 节点的 `material`。gate 的 NORMAL/HOVER **不得把 `material` 置 null**;DISABLED **不得替换成 `_desat_mat`**——土线 shader 内含 `desat` 强度 uniform(默认 0),gate DISABLED 时置 1、NORMAL/HOVER 时置 0;forge/chest 仍走既有 `_desat_mat`。`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void` 以区分 gate;`_apply_state`/`_apply_hover` 的 `node.material = null` 对 gate 改为保留土线材质。wall 无状态切换,材质常驻。 +- 层序:视图子节点序=表序(bg 0、wall 1、board 2、gate 3、dummy 4、forge 5、tent 6、chest 7、notebook 8、campfire 9);设计 z 层为 wall z1、gate z3、其余物件 z4–z6(同 z 内按表序)。土线是 wall/gate 自身的材质,不新增节点/图层,**10 层不变**;其余物件绘制在 wall/gate 之后,土线不遮物件。 +- 悬停浮动:gate 既有 1–4px 整像素浮动沿用;土线裁切按节点基准矩形的 UV 计算,浮动时随节点整体移动(读作门扇抬起离土),验收截图取 NORMAL 态;浮动期 1–4px 离土读感不在本卡土线判据内。 +- 验收:营地截图在墙底与门扇底都能看到同一条起伏边界;边界不是贯通全宽的直线;裁切边界以下首行像素与背景层同列地面像素颜色距离 ≤ 容差,且与墙件不透明色集合的最小距离 > 容差(排除灰影/墙色);接缝 x519/521 的顶线差 ≤1px;门扇底无单独直边/灰影。 +- 素材与材质关系:围墙件底边 1–7px 缺口保留为素材属性(拉伸后约 1.2–8.5px);运行时土线材质按 4–10px 裁切;最终可见边界取两者**较深者(并集)**,两者都是低频起伏、方向一致,不冲突。 + +🔴 **最终墙件预览**:过审预览 `camp_new_layout_preview_c.png` 用的是候选墙 `wall_tipped_preview.png`;实现前必须用最终墙件(主区 artwork `scene_camp_wall_final.png`)重新生成预览(含土线裁切效果,裁切参数与 §3 同源),用户过目后才可开工。预览未过目=U0 未过,停。 + +🔴 背景:`scene_camp_bg.png` 1280×800(远景片+地面片拼接),接缝在围墙后;改素材后强制重导入。 ## 4. 范围边界 -做:上表十层数据、围墙件入包、单测新值钉断言(追加,不删旧断言)。 -不做:门扇/布告板/其余七件素材重出;背景层;土线改为独立代码层(入土效果落在围墙件缺口,零新代码);camp.md/art-bible/camp-scene-prompts 的进一步改写(归文档批)。 -不收件去向:art-status-checklist 营地行状态更新归文档批(反哺点);游戏内终审归用户(登记不阻塞)。 +做:§3 十层数据与视图、土线裁切材质与门扇状态材质保留、最终墙件预览、单测/结构探针/土线机检/camp golden/渲染闸、独立审计、实现报告与反哺点。 + +不做:重画背景;重画门扇/布告板/其余七件素材;新增第 11 层;新增运行时图片素材(golden 测试基线除外);把土线做成独立图层;直接改 `design/`、根规则文件、`待办清单.md`、`体验验证清单.md`、`game/tests/README.md`(实现批禁写;一律列反哺点);不改 `board_shot_probe.gd`(S11 已在当前基线修复,非本卡面)。 + +不收件去向:art-status-checklist 营地行 → 文档批反哺点;门扇底口径/240×147 与 138 口径 → doc-design(六件逐值已补录);待办条目状态 → 登记段(已补回);编入迭代 → 编排段;游戏内终审 → 用户(登记不阻塞);README 能力行代表用例 → 反哺点。 ## 5. 关联文档同步面 | 文档 | 关联点 | 同步义务 | |---|---|---| -| design/art/art-bible.md §6.2 | 围墙显示矩形与墙脚入土线(已随设计批改到 v3.48) | 实现批不直改;若实现取此卡值时偏差则列反哺点 | -| design/art/camp-scene-prompts.md §2.3/§3/§5 | 坐标表(已随设计批改到 v1.9) | 同上 | -| design/ux/camp.md 第 29 行 | 围墙带 y220–420(已随设计批改) | 同上 | -| design/art/art-status-checklist.md 营地行 | 需补「围墙件 2026-11-07 换代」事实 | 反哺点,归文档批落文 | +| design/art/art-bible.md §6.2 :405 | 入土线条款只写围墙底;§3 要求门扇底同口径 | 实现批不直改;反哺点,文档批补一句“门扇底同口径” | +| design/art/camp-scene-prompts.md §5 第 12 条 :250 | 现写墙脚 1–7px;门扇底与最终墙件口径需补 | 反哺点,归文档批 | +| design/art/camp-scene-prompts.md §5 第 3 条 :241 vs §2.3 :114 | :241 写“显示矩形 240×147”,:114 写“门扇可见 y282–420(高 138)”;本卡口径=显示矩形 240×138、命中 240×147 | 反哺点,文档批统一口径 | +| design/art/camp-scene-prompts.md §5 第 6 条 :244+第 13 条 | 第 6 条只载“宝箱离底、其余上移 46px”关系句;六件逐值已由第 13 条补录 | 已闭合(2026-11-08 补录);实现批不直改设计文档 | +| design/ux/camp.md 第 29 行 | 现写围墙带/墙脚入土;门扇底土线需补 | 反哺点,归文档批 | +| design/art/art-status-checklist.md 营地行 | 需补“围墙件最终件 2026-11-07 换代+土线”事实 | 反哺点,归文档批 | +| game/tests/README.md:165 能力表 | 营地能力行代表用例需补 `check_soil_line`、`_test_gate_state_keeps_soil_cut`、camp golden | 实现批禁写;反哺点 | +| roadmap.md / 待办清单.md | 本卡编入迭代与状态推进 | 待办条目已补回(状态「已写卡」);编入迭代归编排段 | +| 体验验证清单.md | 游戏内终审登记项 | 归文档批/实现报告登记,实现批不直改 | + +## 5.5 文件结构图(T 卡分解依据) + +| 文件 | 职责 | 改动性质 | 验收对照表行 | 复用/新增 | +|---|---|---|---|---| +| `game/data/tables/camp_scene_layout.tres` | 十层 texture_rect/hotspot/表级值唯一数据源 | 行为改动(数据);T0/T1 核对,若已一致则零改动 | 1–3 | 复用既有 | +| `game/data/schemas/camp_scene_layout_table.gd` | 默认值/加载期校验 | 非行为(仅核对;默认值已一致) | 1(schema 前置) | 复用既有 | +| `game/presentation/views/camp_scene_view.gd` | 十层建层、`EXPAND_IGNORE_SIZE`、土线裁切材质、门扇状态材质保留 | 行为改动 | 4、6、7 | 复用既有(新增 1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整;不新增类变量) | +| `game/tests/unit/presentation/camp_scene_layout_test.gd` | V14 钉值+门扇状态土线保留单测 | 非行为(测试) | 1–3、7 | 复用既有(新增 1 个测试函数) | +| `tools/shot_checker.py` | 土线机检 `check_soil_line` | 非行为(闸机检) | 6 | 复用既有(新增 1 个函数) | +| `tools/render_gate.sh` | camp 全屏 golden 段 | 非行为(闸机检) | 8 | 复用既有(新增 1 段) | +| `tools/golden_baseline_refresh.sh` | `--camp` 冻结模式 | 非行为(闸机检) | 8 | 复用既有(新增 1 模式) | +| `game/tests/golden//camp.png` | camp 全屏逐像素基线 | 非行为(测试资产) | 8 | **新增**(测试基线;test-conventions:100 在册例外;运行时零新增图片) | +| `game/assets/art/scene/scene_camp_wall.png` | 围墙最终件 | 资产改动(运行时) | 5 | 复用既有(覆盖同名件) | +| `reports/实现报告-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 | +| `reports/反哺点-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 | +| `reports/验收审计-营地场景重排接线-<实现日期>.md` | 独立审计报告 | 非行为(报告) | — | 新增产出物 | +| `artwork/2026-11-07-营地接线预览/compose_preview.py` | 最终预览生成 | 非行为(工作区,不入 git) | —(U0 人审) | 复用既有(改墙源/土线) | ## 6. 任务卡 -### T0 围墙件入包(≈0.25 工作日) +### T0 最终墙件预览+导入基线+开工扫描(≈0.25 天) -- 取用:无。产出:`game/assets/art/scene/scene_camp_wall.png`(覆盖)。 -- [ ] 从主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 拷入 → 核对尺寸 1280×164、模式 RGBA -- [ ] 建隔离基线目录并跑色板闸:`mkdir -p /tmp/wall_base /tmp/wall_only && cp game/assets/art/scene/scene_camp_{board,gate,dummy,forge,tent,chest,notebook,campfire}.png /tmp/wall_base/ && cp game/assets/art/scene/scene_camp_wall.png /tmp/wall_only/ && python tools/palette_check.py /tmp/wall_only --baseline /tmp/wall_base` → 围墙零新增色(八件基线) -- [ ] 跑 `python tools/path_check.py` → 0 问题(worktree 缺 `artwork/mockups` 时该项 SKIP/FAIL 属环境坑:以主检出 `--repo` 口径复核) +- 取用:无。产出:用户过目的最终预览、导入缓存基线、开工扫描记录。 +- [ ] 从主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/` 取 `scene_camp_wall_final.png`;把 `compose_preview.py` 的墙源改为该件;把“土线贴条”改为与 §3 同参数的裁切(wall+gate、`gx` 全局坐标、顶线公式、`top−1` 暗边),生成 `camp_new_layout_preview_final.png`。 +- [ ] 用户过目最终预览(U0);未过目停。 +- [ ] 跑 `Godot_console.exe --headless --path game --editor --quit` 强制重导入;核对 `scene_camp_bg/wall/gate` 的 `.ctex` mtime 与 `source_md5` 和源文件一致,记录读数。 +- [ ] 按 §1.3 做 T0 扫描:读 `.tres`、schema、view、素材、单测、设计文档、golden、静态扫描,逐项记录实查值与差异;扫描记录进实现报告草稿。 +- [ ] 跑 `python tools/palette_check.py game/assets/art --baseline game/tests/golden/palette_baseline` 与 `python tools/path_check.py --repo D:/code/g-plan2`(artwork 在主区,worktree 无副本),核源/包 md5 一致;记录读数;预览文件不入 git(artwork 工作区)。 -### T1 布局表换代(≈0.25 工作日) +### T1 十层布局与视图(≈0.25 天) -- 取用:T0 的素材。产出:`game/data/tables/camp_scene_layout.tres`(十层+表级值)。 -- [ ] 按 §3 表逐字改十层 texture_rect/hotspot 与 wall_band → 跑 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(加载期 validate+钉值+关系谓词全绿,exit 0) -- [ ] `_build_layer_node` 的 TextureRect 加 `expand_mode = EXPAND_IGNORE_SIZE`(否则门扇节点被贴图最小高 211 夹住、矩形 138 不生效)→ 场景探针 ui_struct_probe camp V1 转绿 +- 取用:T0 的扫描基线。产出:与 §3 逐字一致的 `.tres`/schema/视图。 +- [ ] 按 §3 表逐层核对 `camp_scene_layout.tres` 的 texture_rect/hotspot/hotspot_key、`wall_band`、`gate_gap`;不一致的按表改,已一致的保留并记录“已对”。 +- [ ] 核对 `camp_scene_layout_table.gd:9` 默认 `wall_band=(0,220,1280,200)` 与注释。 +- [ ] 核对 `camp_scene_view.gd:136` 的 `TextureRect.EXPAND_IGNORE_SIZE`+`STRETCH_SCALE`;确认门扇节点高 138。 +- [ ] 跑 `Godot_console.exe --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑 `Godot_console.exe --headless --path game res://probe/ui_struct_probe.tscn` → PASS。 +- 产出:布局/视图一致;两条读数。 -### T2 新值钉断言+收口(≈0.25 工作日) +### T2 土线(围墙底+门扇底)+机检+camp golden(≈0.5 天) -- 取用:T1 的表。产出:`game/tests/unit/presentation/camp_scene_layout_test.gd`(追加断言);`reports/iter-实现报告-2026-11-07.md`;`reports/iter-反哺点-2026-11-07.md`。 -- [ ] 在 `_test_layout_hotspot_geometry` 追加:wall/gate/board/wall_band 四条钉值(已在本批落笔);六件落位钉值一条(逐层 Rect2 比对) -- [ ] 跑 `python tools/run_smoke.py` → exit 0;跑营地套件 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑场景探针 `…console.exe --headless --path . res://probe/shot_probe.tscn` + `python tools/shot_checker.py <截图目录>` → A 段 PASS -- [ ] 写实现报告(各卡状态+目检清单+决定记录)与反哺点清单(§5 四条逐条落点) +- 取用:T1 的 view。产出:土线材质+土线机检+camp golden+营地截图读数。 +- [ ] 在 `camp_scene_view.gd` 新增 `_SOIL_CUT_SHADER_SRC`(字符串常量)与 `_apply_soil_cut(node: TextureRect, x_offset: float, rect_w: float, y_offset: float, rect_h: float) -> void`;按 §3 的参数裁 wall/gate 底边;`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void`,gate 走 `desat` uniform、NORMAL/HOVER 保留土线材质;不新增文件、不新增图层、不新增运行时素材、不新增类变量。 +- [ ] 在 `camp_scene_layout_test.gd` 新增 `_test_gate_state_keeps_soil_cut` 并接入 `_run_all`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化;跑单测 → exit 0。 +- [ ] 在 `tools/shot_checker.py` 新增 `check_soil_line(img: Image.Image, failures: list) -> None`,在 `main()` 处理 `shot_camp.png` 时调用;对墙底与门扇底取样:按截图宽高与设计基准 1280×800 的比例换算坐标(禁写死 1280/420);墙底取可见段(避开帐篷/门扇覆盖),门扇底取底行不透明中心区(写卡时实查全局 x619–663);断言顶线 410–416、≥3 个不同顶线值、接缝 x519/521 差 ≤1px、边界下首行对 `scene_camp_bg.png` 同列颜色距离 ≤ 容差且非墙色、`top−1` 暗边、gate 底无直边/灰影;失败写入 failures。 +- [ ] 窗口化跑 `Godot_console.exe --path game --quit-after 3000 res://probe/shot_probe.tscn -- <截图目录>` 产出营地截图;跑 `python tools/shot_checker.py <截图目录> shot_camp.png` → PASS。 +- [ ] 在 `tools/golden_baseline_refresh.sh` 增 `--camp` 模式(`shot_probe` 截图 → `game/tests/golden//camp.png`);用户对照最终预览确认 `shot_camp.png` 后跑 `bash tools/golden_baseline_refresh.sh --camp` 冻结;未确认不得冻结。 +- [ ] 在 `tools/render_gate.sh` 菜单 golden 段后增加 camp 全屏 golden 段(比对 `camp.png`,容差沿用脚本头注释口径);跑 `bash tools/render_gate.sh game` → 全绿。 +- [ ] 记录营地截图的 std/colors/eff 与土线断言读数。 + +### T3 全量验证与独立审计(≈0.5 天) + +- 取用:T2 的土线+机检+camp golden。产出:代码域全绿、独立审计报告、CI 读数。 +- [ ] 改素材后再次强制重导入;跑 `bash tools/run_all_gates.sh --code` → 冒烟/系统/单元 4 分片/探针/渲染/色板/静态扫描全绿;静态扫描零新增红(S11 已在基线修复)。 +- [ ] 独立验收审计:未参与实现的会话或子代理按本卡 §7 逐行核;发现按四类分流处置;报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。 +- [ ] 游戏内终审登记到实现报告实机目检总清单(用户自排,不阻塞)。 +- [ ] 合并后按需 `tools/ci_check.sh <合并提交>` 现查;绿必须坐实“跑闸”步真跑过;clone 失败不算绿。 + +### T4 收口产出物+最终完成进度扫描(≈0.25 天) + +- 取用:T0–T3 全部读数。产出:实现报告、反哺点清单、最终扫描记录。 +- [ ] 写 `reports/实现报告-营地场景重排接线-<实现日期>.md`:各卡状态、实机目检总清单、遗留读数义务、实现决定记录;**内含 §1.3 的 T4 完成进度扫描记录**。 +- [ ] 写 `reports/反哺点-营地场景重排接线-<实现日期>.md`:§5 每条同步面都有落点;art-status-checklist、README 能力行、体验验证清单按实况列。 +- [ ] 按 §1.3 做 T4 扫描:逐项实查;缺项/偏差列清单;未闭合不得宣称完成。 +- [ ] 提交与合并前向用户请示;未获指令不得 commit/merge。 ## 7. 验证闸(改动—验收对照表) | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| -| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | camp_scene_layout.tres wall | V14 围墙矩形钉值(camp_scene_layout_test.gd `_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | .tres gate/board | V14 门板矩形钉值 | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244) | .tres 六件 | V14 六件落位钉值+七命中区几何红线(validate+不相交+不越界) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | camp_scene_view.gd `_build_layer_node` 加 `EXPAND_IGNORE_SIZE` | 场景探针 ui_struct_probe camp V1「层贴图矩形≠layout 表」 | 探针 | `res://probe/ui_struct_probe.tscn`(camp 段) | 节点 position/size 逐值 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 围墙件换代(判据出处 design/art/art-bible.md:212) | scene_camp_wall.png | T0 `palette_check`/`path_check` | 资产 | 文件读数 | 色数 12、零新增色 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 墙脚入土(判据出处 design/art/art-bible.md:396) | 围墙件底行 | 目检(游戏内终审,登记式) | 目检 | 营地屏 | 墙底无贯通直线 | 既有:营地场景图十层铺底与门洞留空呈现 | -| 营地屏铺底不回归(判据出处 design/ux/camp.md:29) | 十层矩形整体 | 场景探针 `shot_probe` camp 截图+`shot_checker` A 段(角色/面板骨架不回归) | 探针 | `--headless --path . res://probe/shot_probe.tscn` | 截图色彩数/骨架 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | `camp_scene_layout.tres` wall | V14 围墙矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | `.tres` gate/board | V14 门扇/告示板矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244+§5 第 13 条) | `.tres` 六件 | V14 六件落位钉值+几何红线(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | `camp_scene_view.gd` `EXPAND_IGNORE_SIZE` | `ui_struct_probe` camp V1 层贴图矩形(`ui_struct_probe.gd:_ready` camp 段) | 探针 | `res://probe/ui_struct_probe.tscn` | 节点 position/size | 既有:营地场景图十层铺底与门洞留空呈现 | +| 围墙最终件(判据出处 design/art/art-bible.md:404) | `scene_camp_wall.png` | T0 `palette_check`/`path_check`+最终墙预览过目 | 资产 | 文件读数+用户过目 | 尺寸 1280×164、不透明 12 色、柱尖/奶油描边/底缺口、源包 md5 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 土线覆盖围墙底+门扇底(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` 土线裁切材质挂 wall/gate | `shot_checker.py:check_soil_line(img, failures)`+`shot_camp.png`:顶线 410–416、≥3 个不同顶线值、接缝差≤1px、边界下首行对背景同列颜色距离≤容差且非墙色、`top−1` 暗边、gate 底无直边/灰影 | 探针 | `shot_probe` 营地窗口化截图 | 截图像素:边界行/颜色距离/暗边亮度 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 门扇状态切换保留土线(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` `_apply_state`/`_apply_hover`/`_apply_disabled` | `camp_scene_layout_test.gd:_test_gate_state_keeps_soil_cut`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化 | 单元 | `camp_scene_view.gd` 真实类+`camp_scene_layout.tres` | `gate.material` 引用+shader uniform 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 营地屏渲染不回归+golden(判据出处 design/engineering/test-conventions.md:100) | 十层+土线整体;`tools/render_gate.sh` camp 段;`game/tests/golden//camp.png` | `render_gate.sh` 七屏+A-D+土线机检+camp golden 逐像素 | 探针 | `bash tools/render_gate.sh game` | 截图色彩/骨架/土线/camp.png 逐像素 | 既有:营地场景图十层铺底与门洞留空呈现 | -注:未删改任何旧断言;新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位),测试削弱申报:无。 +注:未删改 V14 旧断言;新增钉值、门扇状态土线保留单测、土线机检与 camp golden 属追加。测试削弱申报:无。 -**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/iter-验收审计-2026-11-07.md`;未过不得合并。 +**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。 ## 8. 异常分级 -L1 自救:格式/导入缓存类异常自行重跑。L2 记录继续:非本卡面的既有红记录进报告。L3 停机:表值触 schema fail-fast 或与 §3 冲突=停卡呈报(上游缺陷退写卡段);素材缺位=停卡(不得用旧 49px 墙凑合)。 +- L1 自救:导入缓存/格式类异常自行重跑重导入。 +- L2 记录继续:非本卡面的存量红记录归属;若挡住代码域全绿,停在该红上,不修别批文件。当前基线 S11 已清零;若 T3 复跑出现新红,按红账不清不开新批处置。 +- L3 停机呈报:表值与 §3 冲突、schema fail-fast、最终墙预览未过目、土线机检失败、camp golden 未获用户确认即冻结、独立审计未过、CI 红、gdstyle/预算互斥——停卡写报告等用户;机检预算互斥=上游缺陷,退回写卡段。 ## 9. 代拍板白名单 -门扇 hotspot 高 147(贴图 138+9 余量);七件 hotspot 的平移口径(§3 已列值);T2 钉值断言的命名与位置(同套件内追加)。超出=记实现报告「实现决定记录」。 +- 门扇 hotspot 高 147、六件 hotspot 平移口径(§3 已定值)。 +- 土线 shader 的内部结构、uniform/material 命名;土线机检的取样窗口、颜色距离容差、暗边阈值;camp golden 的比对容差沿用 `render_gate.sh` 现行口径(但起伏带名义 9px/顶线 410–416、`top−1` 0.85 暗边、顶部函数为锁定值)。 +- 新测试函数命名与所在行:`check_soil_line(img: Image.Image, failures: list) -> None`、`_test_gate_state_keeps_soil_cut`(以本卡 §7 为准,实现照单落名)。 +- 超出=记实现报告“实现决定记录”。 ## 10. 待裁点 -零待裁点(用户已裁:墙 220/200、门板跟随、入土线;2026-11-07)。开工门=U0。 +零待裁点。上游缺口已闭合(设计文档六件逐值补录于 `camp-scene-prompts.md` v1.10 §5 第 13 条;待办清单条目已补回,状态「已写卡」)。开工门=U0:最终墙件预览用户过目;提交/合并须用户发令。 ## 11. 落位与可复用性预检 -本批零新增代码文件、零新增函数:改既有 `camp_scene_layout.tres`(数据行唯一落点)、既有单测追加断言、覆盖既有 `scene_camp_wall.png`(消费名不变,`UiKit.TEX_CAMP_WALL`);另产出两份 `reports/` 过程件(实现报告、反哺点清单)。复用面:视图/装载/校验链现成(camp_scene_view.gd、schema.validate、camp_scene_layout_test.gd),不新增渲染件。唯一面:坐标只落表一处,视图/探针/单测均读表。 +- 土线裁切:新增 1 个 shader 字符串常量+1 个私有应用函数+`_apply_disabled` 签名调整;落 `camp_scene_view.gd`;盘上无同类土线 shader(`_DESAT_SHADER_SRC` 是禁用态去饱和,职责不同,不能复用);wall/gate 共用同一 wave 函数,唯一落点在该文件;不新增文件、不新增图层、不新增运行时素材;土线材质挂节点 `material`,不新增类变量。 +- 土线机检:在 `tools/shot_checker.py` 新增 1 个函数,复用现有 PIL 读图与 `main()` 循环;不新增脚本文件;对 `shot_camp.png` 调用。 +- camp golden:新增 1 张测试基线 `game/tests/golden//camp.png`(test-conventions:100 在册例外);`tools/golden_baseline_refresh.sh` 增 `--camp` 模式、`tools/render_gate.sh` 增 camp 段,均不新增脚本。 +- 预览:只改 `artwork/` 工作区 `compose_preview.py`(不入 git),不改游戏素材;最终预览是用户过目件,不是运行时资产。 +- 数据/素材:无新增运行时数据件、无新增运行时图片;十层结构不变;墙件覆盖同名件。 ## 12. 实现规范预算 -零新增文件、零新增方法 → gdstyle 阈值面无新增;存量触面:camp_scene_layout_test.gd 追加一段断言(方法数不变、成员数不变)。 +- `camp_scene_view.gd` 存量触面:`tools/gdstyle_baseline.txt` 无本文件登记键(实查零命中);按默认阈值 20/15 自查:公开方法 4/20、类变量 13/15;新增面=1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整,**不新增类变量**;改后 4/20、13/15;超预算=停卡。 +- `tools/shot_checker.py` 新增 1 个函数,不新增文件;无 gdstyle 约束。 +- `tools/render_gate.sh`/`tools/golden_baseline_refresh.sh` 各增 1 段/1 模式,不新增文件;无 gdstyle 约束。 +- 零新增 `.gd` 文件、零新增 `.tscn`、零新增运行时资源;shader 以字符串常量存在,不新增 `.gdshader`;唯一新增入库件=`game/tests/golden//camp.png`(测试基线,test-conventions:100 在册例外)。 ## 13. 复核记录 +> 第 1 轮=写卡人自审(非独立);第 2 轮=独立只读子代理复核(未参与本卡撰写,2026-11-08,17 条发现、零待裁);第 3 轮=复核处置中自审。17 条已全部处置:15 条就地改卡,2 条退回上游后经用户 2026-11-08 授权闭合(设计文档六件逐值补录、待办条目补回)。复核证据(文件/行锚/实跑命令)已并入 §2、§5、§7 与本节各条;复核报告文件按用户 2026-11-08 裁清理,不提交、不合回。**卡片达到成立判据;编入迭代/开工/提交/合并仍须用户发令。** + | 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 | |---|---|---|---|---| -| 1 | 前台只读复核子代理(未参与撰写) | 七件/六件计数不一(§1/§3/§7) | 补写 | 统一为六件(dummy/forge/tent/chest/notebook/campfire) | -| 1 | 同上 | 六件新值未钉,V14 只证互斥/边界 | 补写 | T2 增六件落位钉值断言,本批已落(PASS 实测) | -| 1 | 同上 | T2 单元套件无真实入口命令 | 补写 | 改为 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` | -| 1 | 同上 | T1 `python -c` 不能读 .tres;`db.load_tables` 无命令入口 | 补写 | T1 改为直跑该单测(加载期 validate+钉值) | -| 1 | 同上 | T0 基线写占位目录;扫全 scene 会带 stage 件红 | 补写 | 写入临时隔离基线命令(八件拷贝)与限定扫描面;path_check 环境坑注明 | -| 1 | 同上 | prompts §5 第 9 条布告板旧值 (845,224) | 退回上游 | 文档区已修:(845,241,130,121),底 362 落在墙内 | -| 1 | 同上 | art-bible §6.2 门扇旧句「贴图 240×138 随门洞压扁重画、y283–367」 | 退回上游 | 文档区已修:运行时压扁、底压 y420 | -| 1 | 同上 | prompts §2.3 门洞 y282–420 与在包墙件全高缺口不相符 | 退回上游 | 文档区已修:墙件缺口全高 220–420、门扇可见 282–420 | -| 1 | 同上 | art-bible:395 不含色数判据 | 补写 | 锚改 art-bible.md:212(营地子板色数行) | -| 1 | 同上 | §13 复核报告文件行违反 2026-11-06 裁(凭据=本节) | 自判 | 删除该行 | -| 1 | 同上 | 门扇「重画 138」vs 运行时压扁,§10 零待裁是否成立 | 自判 | 用户 2026-11-07 明裁「不需要动任何美术素材」,运行时压扁即终稿;§10 零待裁成立 | -| 2 | 后台只读复核子代理(未参与撰写) | schema 默认 `wall_band=(0,240,1280,70)` 与注释仍旧值 | 补写 | schema 默认改 (0,220,1280,200)+注释同步 | -| 2 | 同上 | §7「未新增/删除任何断言」措辞与 +5 条钉值矛盾 | 补写 | 改为「未删改旧断言,新增 5 条钉值断言」 | -| 2 | 同上 | test.gd 头注「禁坐标字面量」与新钉值冲突 | 补写 | 头注改为「关系谓词为主+重排钉值」,钉值前加 `# oracle:` 行锚 | - +| 1 | 写卡人自审(非独立) | 旧方案把土线限定为“围墙件缺口、零新代码”,会丢掉门扇底土线 | 补写 | 本卡 §3 改为 wall+gate 共用土线裁切材质;10 层不变;不新增素材 | +| 1 | 同上 | 过审预览用候选墙,最终墙件未单独过目 | 补写 | 本卡 §3/T0 增加最终墙预览用户过目(U0) | +| 1 | 同上 | 渲染闸 A-D 不覆盖土线像素,旧完成定义只写单测/冒烟 | 补写 | 本卡 §1.2/§7/T2 增加土线机检与渲染闸 | +| 1 | 同上 | 旧导入缓存会让渲染闸拿旧素材,绿读数无效 | 补写 | 本卡 §2/§6 T0/T3 增加强制重导入与 source_md5 核对 | +| 1 | 同上 | 独立审计、游戏内终审、art-status-checklist 未进完成定义 | 补写 | 本卡 §1.2/§5/§6 T3/T4 补齐 | +| 1 | 同上 | 待办清单已无本条目,卡片来源悬空 | 退回上游 | 头部记登记缺口;§10 开工门;编入迭代前由登记段补回 | +| 1 | 同上 | 写卡时曾见外部 S11 红(board_shot_probe「雷格」),会挡住代码域全绿 | 自判 | 实查当前基线 89f4fc78 已修复为「危险格」,`static_scan.sh` S11 ok;本卡去除该开工门,T3 复跑确认零新增红 | +| 1 | 同上 | 10 层结构不能新增图层,土线必须挂在既有 wall/gate 层 | 自判 | 本卡 §3/§11 采用裁切材质挂 wall/gate,不新增第 11 层 | +| 2 | 独立只读子代理(未参与本卡撰写) | §7 art-bible 锚 `:395/:396` 实为 `:404/:405` | 自判 | 已改 §7 行 5/6 锚为 `:404/:405` | +| 2 | 同上 | 六件逐值未载于设计文档(`prompts:244` 仅关系句;`grep design/` 零命中) | 退回上游(已闭合) | 用户 2026-11-08 授权补录:`camp-scene-prompts.md` v1.10 §5 第 13 条载六件逐值;头部/§5/§7/§10 同步 | +| 2 | 同上 | 顶部公式实际 410–416(裁 4–10px),与“9px 带”表述矛盾 | 自判 | §3 改为“名义 9px(基准顶线 411)+实际 410–416”;§9 同步 | +| 2 | 同上 | “y≥top 裁掉”与“top 行压暗”互斥(被裁行不可见) | 自判 | §3 改为“最后可见行 `top−1` 压暗 0.85” | +| 2 | 同上 | “其余物件 z4–z6”与视图子节点 0–9 混淆 | 自判 | §3 写明视图子节点序 0–9+设计 z 层 wall1/gate3/其余 z4–z6 | +| 2 | 同上 | 单一材质无法处理 gate 局部 x 的 +520 偏移 | 补写 | §3 钉 `gx=UV.x*u_width+u_x_offset`(wall 0/1280;gate 520/240) | +| 2 | 同上 | gate NORMAL 置 null、DISABLED 换 `_desat_mat` 会抹掉土线 | 补写 | §3 钉土线材质常驻+`desat` uniform;§7 增行 7;新增单测 `_test_gate_state_keeps_soil_cut` | +| 2 | 同上 | 缺 camp golden(`test-conventions.md:100`) | 补写 | §1.2/§6 T2/T3/§7 行 8/§11/§12 增 camp golden;`render_gate.sh`+`golden_baseline_refresh.sh --camp` | +| 2 | 同上 | 土线机检写死 1280 且“同源”判据循环 | 补写 | §6 T2 改为按截图宽高比例取样;对 `scene_camp_bg.png` 同列颜色距离+非墙色;容差归白名单 | +| 2 | 同上 | 缺文件结构图 | 补写 | 增 §5.5 文件结构图 | +| 2 | 同上 | 测试函数名未钉(“或等价函数”、§9 循环) | 补写 | 钉 `check_soil_line(img: Image.Image, failures: list) -> None`+`_test_gate_state_keeps_soil_cut`;§7/§9 同步 | +| 2 | 同上 | §2 行锚错:schema `:67`→`:59–:62`、view `:133`→`:130`、test `:82`→`:26` | 自判 | 已改 | +| 2 | 同上 | §12 写 S13 键,但 `camp_scene_view.gd` 无登记键 | 自判 | §12 改为“无登记键;默认 20/15;现状公开方法 4、类变量 13;不新增类变量” | +| 2 | 同上 | 外部 S11 已不成立(`board_shot_probe` 现为「危险格」) | 自判 | §1.2/§2/§4/§8/§10/§13 去除 S11 红;T3 静态扫描零新增红 | +| 2 | 同上 | `prompts` §5 第 3 条 `:241` 240×147 与 §2.3 `:114` 138 矛盾未列同步面 | 补写 | §5 增行;本卡口径=显示 240×138、命中 240×147 | +| 2 | 同上 | §13 无独立复核记录 | 补写 | 本节增 17 行+复核报告路径 | +| 2 | 同上 | 待办清单无本条目 | 退回上游(已闭合) | 用户 2026-11-08 授权补回:`待办清单.md` 条目状态「已写卡」;头部/§5/§10 同步 | +| 3 | 写卡人自审(复核处置中,非独立) | 原文写“门扇件底行 alpha 全 255”,实查底行仅局部 x99–143 不透明、两侧 195px 透明,表述失真 | 自判 | §3 改为“底行中心区不透明+两侧透明拱边”;T2 门扇取样窗口钉全局 x619–663 | diff --git a/roadmap.md b/roadmap.md index 64af57a7..72e347da 100644 --- a/roadmap.md +++ b/roadmap.md @@ -6,7 +6,7 @@ - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 - **迭代位**:迭代 1–55 已完成。迭代 56 已编待开工(结算期文字列表退役+封印动作改版两卡)。各迭代收口与批后收尾沿革查 git 提交信息与 `reports/`。 -- **下一步**:发令开工 56(≈12.25 日,两卡:结算期文字退役先行+封印改版);待编池:效果通道与事件词零现役普查(唯一遗留待裁=秘宝表 schema 旧词面 9 词收尾)、结算明细文案入表(待文档设计)、二三关棋盘观感(待设计+待美术)、测试面真输入化批发现四项待裁(待执行);EC8 热重载实装待用户另立条目。 +- **下一步**:发令开工 56(≈12.25 日,两卡:结算期文字退役先行+封印改版);待编池:效果通道与事件词零现役普查(唯一遗留待裁=秘宝表 schema 旧词面 9 词收尾)、结算明细文案入表(待文档设计)、棋盘瓦片与立体表现重做(已写卡,待编排)、测试面真输入化批发现四项待裁(待执行);EC8 热重载实装待用户另立条目。 ## 里程碑时间线 @@ -90,6 +90,7 @@ | 迭代 54 | 已完成(2026-11-07) | 已退役(git 历史可考) | 2026-11-07 | ≈8.625 个工作日 | 已退役(git 历史可考) | | 迭代 55 | 已完成(2026-11-07) | 已退役(git 历史可考) | 2026-11-07 | ≈8.75 个工作日 | 已退役(git 历史可考) | | 迭代 56 | 待开工 | reports/需求卡片-结算期文字列表退役批-2026-11-07.md
reports/需求卡片-封印动作改版批-2026-11-07.md | 2026-11-07 | ≈12.25 个工作日〔用户特批 2026-11-07 超 10 个工作日〕 | — | +| 迭代 57 | 待开工 | reports/需求卡片-营地场景重排接线-2026-11-07.md
reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md | 2026-11-08 | ≈11.25 个工作日〔用户特批 2026-11-08 超 10 个工作日〕 | — | - 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。 - 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。 diff --git a/sim-data/README.md b/sim-data/README.md index 667a96a1..1d2a89ac 100644 --- a/sim-data/README.md +++ b/sim-data/README.md @@ -14,7 +14,6 @@ - `runsum_m3iter9exit_81000_n400_20261003.jsonl`(迭代 56 前任现行锚,N=400/档)——**其 perfect 通关 59% 系 2026-10-03 旧代码读数**:0 格连锁算子补齐等两月演进已使模拟行为漂移,改前代码 2026-11-08 现跑 50 局 perfect 通关 0%——带值引用须注明「旧行为基线」口径 - 其余 23 份 `runsum_*.jsonl`,文件名=批+锚名+日期可辨。出度≤2 重建后旧锚结构已失义,仅留换代对照;处置挂中间产物死亡清单随批处理。 -## 历史锚(只读不判) 其余 23 份 `runsum_*.jsonl`,文件名=批+锚名+日期可辨。出度≤2 重建后旧锚结构已失义,仅留换代对照;处置挂中间产物死亡清单随批处理。 @@ -24,7 +23,7 @@ | 档 | 用途(唯一触发面) | 局数上限 | 单次耗时 | 判读力(能下什么结论) | |---|---|---|---|---| -| 一档·调研 | 调研/数值分析 | 总量 >40(100+ 为常用锚量级);N 按分析方案:60/档=结构回归(80% 功效 ≥25pp)/ 100=95% CI ±9.8pp / 170=±7.5pp(15pp 带半宽)/ 400 满档=±4.9pp 贴边裁决(normal 独立满档 ~8 分钟同属一档) | 16–65 分钟 | 带值判定/CI 结论仅本档可下;≥60 局须 N=5 pilot 前置 | +| 一档·调研 | 调研/数值分析 | 总量 >40(100 为常用锚量级);N 按分析方案两选一:50=95% CI ±13.9pp / 100=95% CI ±9.8pp | 8–16 分钟 | 带值判定/CI 结论仅本档可下;≥60 局须 N=5 pilot 前置 | | 二档·验证 | 数值修改后回归验证 | 总量 ≤40(每档 ≤20) | ~3.2 分钟 | 结构性大位移可判(≥~40pp;改前/改后同种子配对下 ~30pp)——带值判读不在本档 | | 三档·小调 | 小调整后快检 | 总量 ≤20(每档 ≤10) | ~1.6 分钟 | 只测不判——仅灾难级破坏(通关率腰斩级)可判 | | 四档·微量 | 微调后确认没大问题 | 总量 ≤5 | <1 分钟 | 零统计判读——通过判据=不崩+RUNSUM 字段完整+方向不反直觉 | diff --git a/tools/gate_platform.sh b/tools/gate_platform.sh index 8847cae3..15ae5f70 100644 --- a/tools/gate_platform.sh +++ b/tools/gate_platform.sh @@ -20,6 +20,8 @@ gate_game_path() { # 杀整棵进程树()——递归杀子进程后杀本进程。macOS/Linux 走 pgrep -P; # Windows 侧 MSYS kill 对其可见进程有效,带 wrapper 树的场景仍由调用方原 taskkill /T 逻辑负责。 +# 注意:Windows Git Bash 实测无 pgrep/pkill(2026-11-08 修复批)——本函数在 Windows 退化成只杀 +# 顶格进程,引擎子进程残留由调用方段末 kill_orphans 清场兜底(probe_gate/render_gate 均有段后清点)。 gate_kill_tree() { local p c kill -9 "$1" 2>/dev/null @@ -29,26 +31,36 @@ gate_kill_tree() { # 带超时执行(coreutils timeout 的纯 bash 替代,双平台同语义): # gate_run_timeout <秒> <日志路径> <命令...> # 命令输出重定向到日志;退出码=命令退出码,超时=124(与 coreutils 语义一致,判据与既有闸一致)。 -# 实现=后台启动+守卫落标志文件(probe_gate run_suite 同款手法:taskkill 强杀后 wait 报 0 的 -# 假绿以标志文件纠偏);超时先杀整树再回 124。 +# 实现=后台启动+守卫轮询(守卫每 0.2 秒醒一次,看两样:停止文件在不在/到点没; +# 命令先完时父流程放停止文件,守卫看见即自己退场——没有嵌套长 sleep,从机制上无孤儿可留; +# 2026-11-08 修复批:旧版 mktemp 建标志文件「建时即真」致退出码恒 124+守卫被杀留孤儿 sleep +# 占输出管道至满档);到点未见停止文件=真超时:落标志文件+杀整树+回 124。 gate_run_timeout() { local t="$1" log="$2"; shift 2 - local kf - kf="$(mktemp "${TMPDIR:-/tmp}/gatetime_XXXXXX")" + local kf stop + kf="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.kf" # 只赋路径、不建文件——建时即真=旧缺陷病根(probe_gate run_suite 同款) + stop="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.stop" + rm -f "$kf" "$stop" "$@" >"$log" 2>&1 & local pid=$! - ( sleep "$t" 2>/dev/null - touch "$kf" - gate_kill_tree "$pid" + ( end=$((SECONDS+t)) + until [ -f "$stop" ] || [ "$SECONDS" -ge "$end" ]; do + sleep 0.2 2>/dev/null || sleep 1 + done + if [ ! -f "$stop" ]; then + touch "$kf" + gate_kill_tree "$pid" + fi true ) & local guard=$! wait "$pid"; local st=$? - kill "$guard" 2>/dev/null; wait "$guard" 2>/dev/null + touch "$stop" # 放停止文件=通知守卫收工,0.2 秒内自退,无需 kill + wait "$guard" 2>/dev/null if [ -f "$kf" ]; then gate_kill_tree "$pid" st=124 fi - rm -f "$kf" + rm -f "$kf" "$stop" return "$st" } diff --git a/tools/hooks/pre-merge-commit b/tools/hooks/pre-merge-commit index 95289288..cafbaa5c 100755 --- a/tools/hooks/pre-merge-commit +++ b/tools/hooks/pre-merge-commit @@ -2,7 +2,7 @@ # 合回前置检查钩子(git pre-merge-commit,2026-11-06 用户裁)——主工作区 git merge 落合并提交前 # 跑最小验证面:tools/run_all_gates.sh --premerge(冒烟测试+单元与集成全套件 4 分片,热导入缓存约 2 分钟)。 # 语义(git 2.45.2.windows.1 本机实测):本钩子拦的是「合并提交」不是「合并动作」——exit≠0 时合并结果 -# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置二选一:修红后 git commit 续合,或 git merge --abort 放弃。 +# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:该路径 pre-merge-commit/post-merge 两钩子零触发)。 # 快进合并不触发本钩子(git 语义)——本仓合回铁规恒 --no-ff,漏写时远端 CI 兜底仍在。 # --no-verify 可整体跳过(实测)——仅属用户,agent 禁用(worktree-guard 在案)。 # 仅主工作区触发(worktree 内合并不触发,与 post-merge 同款 git-dir 判别)。 @@ -18,7 +18,7 @@ RC=$? if [ "$RC" -ne 0 ]; then echo "" >&2 echo "[pre-merge-commit] ✗ 前置检查红(读数如上)——合并提交未落,仓库停 MERGE_HEAD 待提交态。" >&2 - echo " 处置二选一:① 修红后 git commit 续合本合并;② 放弃整次合并=git merge --abort。" >&2 + echo " 处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:两合回钩子零触发)。" >&2 exit 1 fi echo "[pre-merge-commit] ✓ 前置检查绿——合并提交继续。" diff --git a/待办清单.md b/待办清单.md index f7a32307..f0a3b229 100644 --- a/待办清单.md +++ b/待办清单.md @@ -90,24 +90,6 @@ **改动面**:文档+游戏代码 **状态**:待写卡 -#### 流水线闸认锚式不含中文名文档——判据出处行锚对半数现行文档失效(2026-11-05 登记,来源=批次移交) - -**实况**:判据出处行锚的机检式 `ANCHOR_RE`(`tools/pipeline_gate.py:68`)字符类=`[A-Za-z0-9_\-.\\/]`,不含中文段——凡验收判据句落在中文名现行文档(本库 GDD 多为此形态:`HUD框架.md`/`关卡节点地图.md`/`待办清单.md`),机检一律认不到锚、判「判据出处行锚缺失」红。 -- 批次实证=营地交互修复批需求卡片(2026-11-05,已退役 git 历史可考):R2/R3/R4/R8 四行的真出处是中文名文档,只能另挂一个 ASCII 路径文档当替身锚才过闸 -- 发现与依据=该卡独立复核第 22 条(`tools/pipeline_gate.py:68`,已退役 git 历史可考) - -**改动面**:工具代码 - -**状态**:待执行 - -#### 合回链两钩子冲突路径绕过(2026-11-07 登记,来源=批次移交) - -**实况**:合并遇冲突时 pre-merge-commit 不触发(合并策略失败未到提交点),续提交 `git commit` 收束 MERGE_HEAD 时两钩子(pre-merge-commit/post-merge)均不触发——前置检查由 agent 手动补跑、推送由 agent 手动补做。证据=合并提交 2a17260c 冲突续提交流(git 历史可考)+主区 .gates 前置检查补跑读数(冒烟绿/单元绿)。修法方向=续提交路径补钩子触发(pre-commit 侧判 MERGE_HEAD 分流到 premerge 语义,post-merge 侧同理),细则归工程改动。 - -**改动面**:工具代码 - -**状态**:待执行 - #### 层序落位单口检查的扫描面不含子目录——视图层插位不在该闸视野(2026-11-05 登记,来源=会话提及) **实况**:契约件 `game/tests/unit/contracts/source_guard_test.gd` 的「V1d 层序落位单口」用平铺列目录(`:86-99`,只收 `.gd` 文件名、不递归),注释 `:85` 仍写「presentation 无子目录」;而 `game/presentation/` 现实有 `views/` 与 `scenes/` 两目录,视图层全部文件不在该闸视野内。 @@ -262,16 +244,23 @@ **状态**:待文档设计 -#### 第二 / 三关棋盘观感——亮度与对比度(2026-10-13 登记,来源=playnote) +#### 棋盘瓦片与立体表现重做(2026-11-07 登记,来源=会话提及) -**实况**:来源=playnote 试玩记录「第二第三关棋盘看着费劲」;用户裁定要做,[08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「五 · 表现」已立行标待做。旧卡 reports/需求卡片-二三关棋盘观感批-2026-10-16.md(v1.4)在册但非已写卡状态,重启须重新立卡。分工:本条管棋盘区域整体观感(亮度/对比度/费劲感,体感问题),与已注销的「呈现层残余 <4.5:1 文字位」条(机检硬指标)不同面不互代。Alpha 出口=用户实机目检不再判「看着费劲」。 +**实况**:用户裁定(2026-11-07 会话)棋盘难看根因=瓦片素材与立体画法,非亮度/对比度;原「第二 / 三关棋盘观感——亮度与对比度」条误诊退役、旧卡已删除。真 3D 与 HD-2D 排除(风格不合)。证据:art-bible §3.2「未挖格=一整块 32×32 自含凸起岩体」冻结条款锁死立体表现;cell_base_layer.gd 南立面/北投影全在本格内、board_view.gd 无 y-sort;tile_palette.gd digit_plate 落牌=亮度修补已失败(违 §9.2 满屏白牌反参考)。设计已闭合(C 方向+D 布局+三关八色冻结;art-bible v3.51/battle.md 2026-11-07/HUD框架 2026-11-07)。 +- 相关文档:[美术圣经](design/art/art-bible.md) §3.2/§4.1/§6.3(画法解冻+三关八色)+ [battle.md](design/ux/battle.md)(D 区布局与像素判据)+ [需求卡片](reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md)(已写卡,卡内 §16 复核通过) -**缺口**:还差「素材轴 / UI 轴」定性设计讨论与甲(recolor 现瓦片)/乙(远程生图重产)素材裁点裁决——定性是既有条款的开工前置;素材轴若走重产,依赖战斗一屏样张批目标规格清单(已随 art-bible v3.22 落定)。 -- 相关文档:[HUD框架](design/gdd/systems/表现与支撑/HUD框架.md)(UI 轴:舞台底与叠加层)+ [美术圣经](design/art/art-bible.md)(素材轴:瓦片与格面图标的明度色相)——定性前两方共裁 +**改动面**:文档+美术素材+游戏代码 + +**状态**:已写卡+已编迭代 57 + +#### 营地场景重排接线——十层新矩形与游戏内终审(2026-11-07 登记,来源=批次移交) + +**实况**:用户 2026-11-05/2026-11-07 裁定营地十层重排——围墙显示矩形 `(0,220,1280,200)`、大门/告示板跟随、其余六件按裁定落位;围墙最终件 1280×164 入包;土线同时覆盖围墙底与门扇底(门扇运行时压扁 240×138);最终墙件预览过目(U0)与游戏内终审归实现批。设计已闭合(`camp-scene-prompts.md` v1.10 §5 第 13 条六件逐值;`art-bible.md` v3.48 §6.2 :404–405;`camp.md:29`)。需求卡片:[需求卡片-营地场景重排接线-2026-11-07.md](reports/需求卡片-营地场景重排接线-2026-11-07.md)(独立复核 17 条已处置,复核记录在卡内 §13);实现待编排。 +- 相关文档:[营地场景提示词卡](design/art/camp-scene-prompts.md) §5 第 6/12/13 条+[美术圣经](design/art/art-bible.md) §6.2+[营地 UX](design/ux/camp.md) 第 29 行;复核记录见[需求卡片](reports/需求卡片-营地场景重排接线-2026-11-07.md) §13 **改动面**:美术素材+游戏代码 -**状态**:待文档设计+待美术设计 +**状态**:文档设计已闭合+美术设计已闭合+已写卡+已编迭代 57 #### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现) @@ -384,14 +373,6 @@ **状态**:待执行 -#### 闸机超时守卫缺陷修复——gate_run_timeout 标志文件恒真(2026-11-06 登记,来源=批次移交) - -**实况**:tools/gate_platform.sh 的 gate_run_timeout 用 mktemp 预建超时标志文件,判据 `[ -f ]` 建时即真、超时态无法与正常完成区分(Windows Git Bash 实测直接调用 4 秒返回 124;远端各闸以工件锚定未受影响)。连带 tools/golden_baseline_refresh.sh 的 guard 子Shell sleep 420 未被 kill 短路(重采集等待 7 分钟症状)。修法=kf 先赋路径+rm -f 后置守卫(probe_gate.sh:97 run_suite 同款正确写法)。证据=tools/gate_platform.sh:37/:48+迭代53实现报告遗留呈报 1(git 历史可考)。 - -**改动面**:工具代码 - -**状态**:待执行 - #### 关卡视口两 Shot 基线 mac 侧冻结(2026-11-06 登记,来源=批次移交) **实况**:golden/windows/ 已锚 lmap_entry/lmap_boss(提交 6394abf7);mac 子目录无该两 Shot——渲染闸对 mac 缺基线记 SKIP 不判红,两平台同盯缺一。义务=Mac 侧跑 tools/golden_baseline_refresh.sh --lmap 冻结 mac 基线并呈报确定性读数。证据=game/tests/golden/README.md 现持清单行与时效判定纪律行+迭代53实现报告遗留 2(git 历史可考)。 From 2fac0c8dce291032f66ab8927a2bb855af148063 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 04:11:06 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(CI=E7=BA=A2=C2=B7?= =?UTF-8?q?=E8=BF=AD=E4=BB=A356=E8=BF=BD=E7=BB=BF):=20=E4=B8=A4=E7=BA=A2?= =?UTF-8?q?=E6=A0=B9=E5=9B=A0=E4=B8=8E=E4=BF=AE=E6=B3=95=E2=80=94=E2=80=94?= =?UTF-8?q?=E2=91=A0golden/mac=E4=B8=89=E4=BB=B6board=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E5=9C=A8=E5=BA=93=E6=9C=AA=E9=9A=8F=E6=94=B9=E7=89=88=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3(run134=E4=B8=89=E5=9B=BE2.2-2.4%>2%=E5=AE=B9=E5=B7=AE?= =?UTF-8?q?=E2=80=94=E2=80=94T7=E5=8F=AA=E9=87=8D=E5=88=B6windows=E4=BE=A7?= =?UTF-8?q?=C2=B7'=E7=BC=BA=E5=88=99=E8=AE=B0=E9=81=97=E7=95=99'=E9=A2=84?= =?UTF-8?q?=E6=A1=88=E9=94=99=E5=88=A4=E5=AE=9E=E5=86=B5mac=E4=B8=89?= =?UTF-8?q?=E4=BB=B6=E5=AE=9E=E9=99=85=E5=9C=A8=E5=BA=93=E5=BF=85=E6=AF=94?= =?UTF-8?q?)=E2=80=94=E2=80=94=E5=88=A0=E9=99=A4=E4=B8=89=E4=BB=B6?= =?UTF-8?q?=E5=BE=85mac=E7=8E=AF=E5=A2=83=E8=A1=A5=E9=87=87(=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E9=97=B8:185=E6=9C=AC=E5=B9=B3=E5=8F=B0=E7=BC=BA?= =?UTF-8?q?=E5=9F=BA=E7=BA=BF=3D=E6=9C=AA=E5=86=BB=E7=BB=93=E6=80=81SKIP?= =?UTF-8?q?=E4=B8=8D=E5=88=A4=E7=BA=A2;=20menu=5Fboot=E6=94=B9=E7=89=88?= =?UTF-8?q?=E9=9B=B6=E8=A7=A6=E7=A2=B0=E5=9F=BA=E7=BA=BF=E4=BB=8D=E6=9C=89?= =?UTF-8?q?=E6=95=88=E4=BF=9D=E7=95=99)=E2=91=A1runner=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=83=A8=E5=88=86=E5=A4=B1=E6=95=88(?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=AD=A50.4=E7=A7=92=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E9=87=8D=E5=AF=BC=C2=B7ctex=E7=BC=BA=C2=B7=E5=AD=97=E4=BD=93/U?= =?UTF-8?q?I=E7=B4=A0=E6=9D=90=E6=88=90=E7=89=87ERROR=E6=B1=A1=E6=9F=93sys?= =?UTF-8?q?tem=5Ftest=E9=80=80=E5=87=BA=E7=A0=81=E2=80=94=E2=80=94run134?= =?UTF-8?q?=2040=E5=A4=84vs=20run125=E7=BB=BF=E6=89=B913=E5=A4=84)?= =?UTF-8?q?=E2=80=94=E2=80=94ci.yml=E5=AF=BC=E5=85=A5=E6=AD=A5=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E6=B8=85imported=E5=85=A8=E9=87=8F=E9=87=8D=E5=AF=BC(?= =?UTF-8?q?=E5=B9=82=E7=AD=89,=20+1-2=E5=88=86=E9=92=9F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 4 ++++ game/tests/golden/mac/board_L1_dungeon.png | Bin 103803 -> 0 bytes game/tests/golden/mac/board_L2_underdark.png | Bin 120017 -> 0 bytes .../golden/mac/board_L3_deep_underdark.png | Bin 112965 -> 0 bytes 4 files changed, 4 insertions(+) delete mode 100644 game/tests/golden/mac/board_L1_dungeon.png delete mode 100644 game/tests/golden/mac/board_L2_underdark.png delete mode 100644 game/tests/golden/mac/board_L3_deep_underdark.png diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 8cb5d85e..5f245aa1 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -42,6 +42,10 @@ jobs: 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: 跑闸 diff --git a/game/tests/golden/mac/board_L1_dungeon.png b/game/tests/golden/mac/board_L1_dungeon.png deleted file mode 100644 index 887eeed2c377324e5c01d893e0b1d0fd62634278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103803 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%0A;Z!RT>=EyN_BCQ{$m_T?SOdRr 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 D5X3&) diff --git a/game/tests/golden/mac/board_L3_deep_underdark.png b/game/tests/golden/mac/board_L3_deep_underdark.png deleted file mode 100644 index 7e1f377a7b02b645040ebf414ec0d82d12b31532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112965 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

%JpXYw2f69_ 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 Date: Sun, 8 Nov 2026 05:34:10 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(CI=E7=BA=A2=C2=B7?= =?UTF-8?q?=E8=BF=AD=E4=BB=A356=E8=BF=BD=E7=BB=BF=E4=BA=8C):=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=B5=8B=E8=AF=9538=E8=A1=8C=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=A0=B9=E5=9B=A0=3D=E5=8D=A11=E9=80=80?= =?UTF-8?q?=E5=BD=B9row=5Fpacer.log=5Fview=E5=8F=A5=E6=9F=84=E4=BD=86?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=AE=BF=E4=B8=BB=E5=8F=A5=E6=9F=84=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=9C=AA=E9=9A=8F=E4=BB=A3=E2=80=94=E2=80=94=5Fface?= =?UTF-8?q?=5Fsnapshot:340=20rp.log=5Fview=E6=AF=8F=E9=98=B6=E6=AE=B5?= =?UTF-8?q?=E6=96=AD=E8=A8=80=E7=82=B9=E7=82=B8(19=E9=98=B6=E6=AE=B5),?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E6=B1=82=E5=80=BC=E4=B8=AD=E6=96=AD=E8=87=B4?= =?UTF-8?q?=5Fstage=5Ffaces:355=E5=AF=B9=E6=AE=8B=E7=BC=BA=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E5=8F=96bonus=5Fmeta=E5=86=8D=E7=82=B8=E4=B8=94?= =?UTF-8?q?=E8=AF=A5=E5=87=BD=E6=95=B0=E5=89=A9=E4=BD=99=E5=AD=98=E6=B4=BB?= =?UTF-8?q?=E9=9D=A2=E6=96=AD=E8=A8=80=E8=A2=AB=E9=9D=99=E9=BB=98=E8=B7=B3?= =?UTF-8?q?=E8=BF=87;=20Mac=20SSH=E5=A4=8D=E7=8E=B0+Windows=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E5=90=8C=E7=BA=A2=E5=A4=8D=E7=8E=B0=E5=8F=8C=E6=BA=90?= =?UTF-8?q?=E7=A1=AE=E8=AF=81(godot=E9=80=80=E5=87=BA=E7=A0=81=E5=AE=9E?= =?UTF-8?q?=E4=B8=BA0=E8=BF=9B=E7=A8=8B=E6=97=A0=E5=B4=A9=E6=BA=83,?= =?UTF-8?q?=E7=BA=A2=E7=9A=84=E6=98=AF=E8=84=9A=E6=9C=AC=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E9=97=B8=E2=80=94=E2=80=94=E6=AD=A4=E5=89=8D?= =?UTF-8?q?Mac=E9=80=80=E5=87=BA=E6=AE=B5=E5=B4=A9=E6=BA=83=E5=81=87?= =?UTF-8?q?=E8=AE=BE=E4=BD=9C=E5=BA=9F;Windows=E9=80=80=E5=87=BA0=E7=B3=BB?= =?UTF-8?q?=E8=BF=87=E6=97=B6=E8=AF=81=E6=8D=AE,=E8=BF=AD=E4=BB=A356?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9C=AC=E5=9C=B0=E4=BB=8E=E6=9C=AA=E5=AE=9E?= =?UTF-8?q?=E8=B7=91=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=95);=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D:=20rp=5Flog=E5=8F=A5=E6=9F=84=E4=B8=8E=E5=AD=98?= =?UTF-8?q?=E6=B4=BB=E9=94=AE=E9=9A=8F=E4=BB=A3=E6=91=98=E9=99=A4(?= =?UTF-8?q?=E6=8D=A2=E4=BB=A3=E5=90=8C=E7=94=9F=E6=AD=BB)=E2=80=94?= =?UTF-8?q?=E2=80=9419=E4=B8=AA=E9=98=B6=E6=AE=B5=E6=96=AD=E8=A8=80?= =?UTF-8?q?=E9=9D=A2=E5=A4=8D=E6=B4=BB,=E6=91=98=E8=A6=8157=E2=86=9276?= =?UTF-8?q?=E9=A1=B9(+19=E4=B8=8E=E6=AD=BB=E4=BA=A1=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E7=82=B9=E6=95=B0=E4=B8=A5=E4=B8=9D=E5=90=88=E7=BC=9D);=20?= =?UTF-8?q?=E9=9A=8F=E6=89=B9=E9=97=B8=E6=9C=BAgate()=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E5=9B=9E=E6=98=BE=E8=BF=87=E6=BB=A4=E5=99=A8=E8=A1=A5=E3=80=8C?= =?UTF-8?q?^=20=20-=20=E3=80=8D=E6=B8=85=E5=8D=95=E8=A1=8C+=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=8E=9F=E6=96=87=E5=B0=BE=E9=83=A812=E8=A1=8C(run135?= =?UTF-8?q?=E5=AE=9E=E6=8D=AE:run=5F*=E5=8C=85=E8=A3=85=E5=99=A8=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=8E=9F=E5=9B=A0bullet=E6=95=B4=E7=BB=84=E8=A2=AB?= =?UTF-8?q?=E5=90=9E,=E7=BA=A2=E5=9B=A0=E6=BB=9E=E7=95=99runner=E4=BE=A7?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E8=AF=8A=E6=96=AD);=20=E8=AF=BB=E6=95=B0:=20?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B5=8B=E8=AF=9576=E9=A1=B90=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5+=E9=9B=B6=E8=84=9A=E6=9C=AC=E9=94=99=E8=AF=AF+exit0?= =?UTF-8?q?=E4=B8=89=E9=97=B8=E5=85=A8=E8=BF=87(Windows=E6=9C=AC=E5=9C=B0)?= =?UTF-8?q?,=E9=97=B8=E5=A3=B3bash=20-n=E8=BF=87,=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E9=9D=A2=E5=8A=9F=E8=83=BD=E6=8A=BD=E6=A3=80=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/system_test.gd | 4 ++-- tools/run_all_gates.sh | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/game/tests/system_test.gd b/game/tests/system_test.gd index 2ca2e06c..2727ce49 100644 --- a/game/tests/system_test.gd +++ b/game/tests/system_test.gd @@ -337,7 +337,7 @@ func _face_snapshot(main: Node) -> Dictionary: "mf_inter": mf.inter_visible_get.call(), "mf_settlement": mf.settlement_get.call(), "mf_rows_empty": mf.rows_empty_get.call(), - "rp_log": rp.log_view, "rp_stage": rp.stage, "rp_board_zone": rp.board_zone, + "rp_stage": rp.stage, "rp_board_zone": rp.board_zone, "rp_fx": rp.settlement_fx, "rp_board": rp.board_view, "rp_refresh": rp.refresh_request, "rp_pump": rp.pump_ended, "rs_adventure": main.run_scope.adventure, "rs_runner": main.run_scope.runner, @@ -351,7 +351,7 @@ func _stage_faces(main: Node, tag: String, adv: String, run: String, set: String # 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组) var snap := _face_snapshot(main) var bad := "" - for k in ["bonus_meta", "bonus_save", "camp_meta", "camp_save", "rp_log", "rp_stage", "rp_board_zone", "rp_fx", "rp_board"]: + for k in ["bonus_meta", "bonus_save", "camp_meta", "camp_save", "rp_stage", "rp_board_zone", "rp_fx", "rp_board"]: if not is_instance_valid(snap[k]): bad += " %s=失效" % k for k in ["rp_refresh", "rp_pump"]: diff --git a/tools/run_all_gates.sh b/tools/run_all_gates.sh index 60dc692f..a19f18d5 100755 --- a/tools/run_all_gates.sh +++ b/tools/run_all_gates.sh @@ -335,9 +335,13 @@ gate() { # gate <名称> <日志名> <命令...> "$@" >"$STAMP_DIR/$log" 2>&1 local rc=$? # 失败时把关键行回显到终端(红必须看得见——明细行形态 [Rx]/[Sxx]/违规/存量 同回显, - # 远端 runner 只回传终端日志,折叠过窄=红因滞留 runner 侧不可诊断) + # 远端 runner 只回传终端日志,折叠过窄=红因滞留 runner 侧不可诊断)。 + # run_* 包装器的失败原因清单行(「 - 退出码 = …」「 - 脚本错误标记命中…」)不含下列 + # 关键字,会整组被吞——清单行一并入过滤面,另附日志原文尾部兜底。 if [ $rc -ne 0 ]; then - grep -E "FAIL|红|Error|error|违规|存量|^\[|\] FAIL" "$STAMP_DIR/$log" | tail -60 | sed 's/^/ | /' + grep -E "FAIL|红|Error|error|违规|存量|^\[|^ - |\] FAIL" "$STAMP_DIR/$log" | tail -60 | sed 's/^/ | /' + echo " | ── 日志原文尾部 $STAMP_DIR/$log ──" + tail -12 "$STAMP_DIR/$log" | sed 's/^/ | /' fi NAMES+=("$name"); EXITS+=("$rc"); LOGS+=("$log") return 0 From db7719ca478d240b004ca23af7795e69260a18de Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 06:29:55 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(CI=E7=BA=A2=C2=B7?= =?UTF-8?q?=E8=BF=AD=E4=BB=A356=E8=BF=BD=E7=BB=BF=E4=B8=89):=20run136?= =?UTF-8?q?=E4=B8=A4=E7=BA=A2=E6=A0=B9=E5=9B=A0=E4=B8=8E=E4=BF=AE=E6=B3=95?= =?UTF-8?q?=E2=80=94=E2=80=94=E2=91=A0=E8=83=BD=E5=8A=9B=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?:=E5=8D=A11=E6=96=B0=E5=BB=BA=E9=AA=8C=E8=AF=81=E5=87=BD?= =?UTF-8?q?=E6=95=B0=5Fassert=5Ffx=5Fchain=E6=BC=8F=E6=8C=82=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E5=87=BA=E5=A4=84=E6=B3=A8=E8=AE=B0(=E6=9C=BA?= =?UTF-8?q?=E6=A3=80=E7=BA=A2=E9=A1=B91=C2=B7Windows=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=90=8C=E7=BA=A2=E5=A4=8D=E7=8E=B0=E5=B9=B3=E5=8F=B0=E6=97=A0?= =?UTF-8?q?=E5=85=B3)=E2=80=94=E2=80=94=E6=B3=A8=E8=AE=B0=E8=A1=A5?= =?UTF-8?q?=E6=8C=82=E5=87=BD=E6=95=B0=E4=BD=93=E5=86=85=E9=A6=96=E8=A1=8C?= =?UTF-8?q?(=E6=9C=BA=E6=A3=80=E6=89=AB=E6=8F=8F=E5=8C=BA=E9=97=B4=3D?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=A1=8C=E8=B5=B7,=E5=86=99func=E4=B8=8A?= =?UTF-8?q?=E6=96=B9=E8=AE=A1=E5=85=A5=E4=B8=8A=E4=B8=80=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=90=8D=E4=B8=8B,=E5=90=8C=E6=96=87=E4=BB=B6check/=5Finit?= =?UTF-8?q?=E8=BF=87=E6=A3=80=E5=BD=A2=E6=80=81=E5=90=8C=E6=AC=BE),?= =?UTF-8?q?=E9=94=9AHUD=E6=A1=86=E6=9E=B6.md:272=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E9=80=90=E8=A1=8C=E5=AE=9E=E6=97=B6=E6=BB=9A=E5=87=BA;=20?= =?UTF-8?q?=E2=91=A1=E9=9D=99=E6=80=81=E6=89=AB=E6=8F=8FS9:=E5=8D=A12?= =?UTF-8?q?=E6=96=B0=E5=A2=9Eboard=5Fview.gd:585=E6=98=BE=E5=BC=8F?= =?UTF-8?q?=E9=9D=9E=E5=8F=82=E6=95=B0=E5=8C=96Dictionary=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=3DR1=E6=97=A0=E7=B1=BB=E5=9E=8B=E5=AE=B9=E5=99=A8(Win?= =?UTF-8?q?dows=E6=9C=AC=E5=9C=B0=E5=90=8C=E7=BA=A2=E5=A4=8D=E7=8E=B0)?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=94=B9:=3D=E6=8E=A8=E6=96=AD=E5=BD=A2?= =?UTF-8?q?=E6=80=81(=E8=A7=84=E7=BA=A6=C2=A776=E5=90=88=E6=B3=95=E9=9D=A2?= =?UTF-8?q?=C2=B7=E7=B1=BB=E5=9E=8B=E5=8D=95=E7=82=B9=3Dcell=5Fidentity?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=A3=B0=E6=98=8E;=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=8C=96Dictionary[String,Variant]=E6=B3=A8=E8=A7=A3=E5=AE=9E?= =?UTF-8?q?=E6=B5=8B=E6=8B=92=E6=94=B6=E5=87=BD=E6=95=B0=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=9A=84=E8=A3=B8Dictionary=E2=80=94=E2=80=94=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6Variant=E7=BA=A6=E6=9D=9F=E6=8C=89Nil?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C,10=E8=A1=8CSCRIPT=20ERROR=E5=AE=9E=E8=AF=81,?= =?UTF-8?q?=E8=AF=A5=E5=BD=A2=E6=80=81=E4=B8=8D=E5=8F=AF=E7=94=A8);=20?= =?UTF-8?q?=E8=AF=BB=E6=95=B0:=20=E8=83=BD=E5=8A=9B=E5=AE=A1=E8=AE=A1--str?= =?UTF-8?q?ict=E7=BB=BF(455=E5=87=BD=E6=95=B0=E7=BA=A2=E9=A1=B90)+?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=B8=E5=BD=92=E9=9B=B6+=E5=89=8D?= =?UTF-8?q?=E7=BD=AE=E6=A3=80=E6=9F=A5=E7=BB=BF(=E5=86=92=E7=83=9F+?= =?UTF-8?q?=E5=8D=95=E5=85=834=E5=88=86=E7=89=87)+=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=B5=8B=E8=AF=9576=E9=A1=B90=E5=A4=B1=E8=B4=A5=E4=B8=89?= =?UTF-8?q?=E9=97=B8=E5=85=A8=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/board_view.gd | 2 +- game/tests/unit/presentation/pacing_queue_test.gd | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index 9ad8f01c..7db729d0 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -582,7 +582,7 @@ func _paint_cell_ink(c: Vector2i, u: Node2D, revealed: bool, seal: bool) -> Colo # 封印受理即揭示:身份字形按板事实当场可见(cell_identity 单点——不用等轮末判定; # 数字遮蔽不适用——遮蔽打脸受理即揭示)。 bg = COL_FLOOR - var ident: Dictionary = _board.cell_identity(c) + var ident := _board.cell_identity(c) # 推断形态(规约§76 合法面)——参数化注解拒收函数返回的裸 Dictionary if String(ident.get("kind", "")) == "mine": glyph = "危" digit_col = UiKit.RED_MINE diff --git a/game/tests/unit/presentation/pacing_queue_test.gd b/game/tests/unit/presentation/pacing_queue_test.gd index 30f7e13e..def26380 100644 --- a/game/tests/unit/presentation/pacing_queue_test.gd +++ b/game/tests/unit/presentation/pacing_queue_test.gd @@ -188,6 +188,7 @@ class FakeBoardZone extends BoardZoneView: func _assert_fx_chain(main: Node, rows_seen: Array) -> void: + # 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:272 (结算逐行实时滚出——行→FX 排播链计数逐位一致) var rp = RowPacerScript.new() var fstage := FakeStage.new(null, root.get_node("/root/ConfigDB").presentation.battle_layout) var ffx := FakeFx.new() From e0103d82efec57af3cca3ec245fabe8784871a6a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 06:36:09 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E9=BB=84=E9=87=91?= =?UTF-8?q?=E5=9B=BE=E8=87=AA=E6=84=88=E8=A1=A5=E9=87=87=C2=B7CI=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=AD=A5):=20=E7=94=A8=E6=88=B7=E8=A3=81=E8=A1=A5?= =?UTF-8?q?=E9=87=87=E8=87=AA=E5=8A=A8=E5=8C=96=E2=80=94=E2=80=94=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E8=83=BD=E5=8A=9B=E5=9C=A8runner=E4=BC=9A=E8=AF=9D,?= =?UTF-8?q?=E4=BA=BA=E6=89=8B=E4=B8=8D=E5=81=9A=E4=BA=8C=E8=BF=9B=E5=88=B6?= =?UTF-8?q?=E6=90=AC=E8=BF=90;=20=E6=96=B0=E5=A2=9Etools/ci/golden=5Fselfh?= =?UTF-8?q?eal.sh+ci.yml=E9=87=87=E9=9B=86=E6=AD=A5(full=E6=89=B9=C2=B7?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=90=8E=E8=B7=91=E9=97=B8=E5=89=8D):=20?= =?UTF-8?q?=E7=BC=BA=E6=A3=8B=E7=9B=98=E4=B8=89=E4=BB=B6=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E2=86=92golden=5Fbaseline=5Frefresh=E6=A3=8B=E7=9B=98=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=B8=B2=E6=9F=93=E2=86=92=E6=8F=90=E4=BA=A4=E5=9B=9E?= =?UTF-8?q?master=E6=8E=A8=E9=80=81=E2=86=92=E4=B8=8B=E4=B8=80=E8=BD=AEful?= =?UTF-8?q?l=E6=89=B9=E6=8B=89=E5=8F=96=E5=90=8E=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E9=97=B8=E7=BB=BF;=20=E6=8A=A4=E6=A0=8F=E4=B8=89=E9=81=93:=20G?= =?UTF-8?q?ITHUB=5FWORKSPACE=E5=BF=85=E5=9C=A8(=E6=9C=AC=E5=9C=B0=E8=AF=AF?= =?UTF-8?q?=E8=B7=91=E5=8D=B3=E6=8B=92=C2=B7=E5=AE=9E=E6=B5=8Bguard=5Fexit?= =?UTF-8?q?=3D1)/=E4=B8=89=E4=BB=B6=E9=BD=90=E7=9B=98=E9=9B=B6=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C(=E5=B9=82=E7=AD=89=E6=97=A0=E5=BE=AA=E7=8E=AF)/?= =?UTF-8?q?=E5=9B=9B=E5=A4=B1=E8=B4=A5=E7=82=B9=E5=85=A8=E7=BD=AE=E7=BA=A2?= =?UTF-8?q?=E4=B8=8D=E9=9D=99=E9=BB=98;=20=E8=AF=BB=E6=95=B0:=20bash=20-n?= =?UTF-8?q?=E8=BF=87+guard=E5=AE=9E=E6=B5=8B=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 8 +++++++ tools/ci/golden_selfheal.sh | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 tools/ci/golden_selfheal.sh diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5f245aa1..d166db11 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -48,6 +48,14 @@ jobs: rm -rf game/.godot/imported /usr/local/bin/godot --headless --path game --editor --quit + - name: 棋盘黄金图自愈补采(full 批——缺基准时 runner 会话渲染→提交回 master→下一轮拉取生效) + if: steps.route.outputs.mode == 'full' + env: + GODOT_BIN: /usr/local/bin/godot + run: | + cd "$GITHUB_WORKSPACE/repo" + bash tools/ci/golden_selfheal.sh + - name: 跑闸 if: steps.route.outputs.mode != 'skip' env: diff --git a/tools/ci/golden_selfheal.sh b/tools/ci/golden_selfheal.sh new file mode 100644 index 00000000..7d7a0193 --- /dev/null +++ b/tools/ci/golden_selfheal.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# 棋盘黄金图 CI 自愈补采(2026-11-08 用户裁:补采自动化——渲染能力在 runner 会话里,人手不做二进制搬运)。 +# 背景:golden 基线按平台分目录(render_gate.sh:37 gate_platform_id),改版批只能重制本平台侧; +# 他平台基线缺失=渲染闸红(基准未建),而补采必须在他平台真实渲染——只有 runner 会话做得到。 +# 本件挂 CI full 批(ci.yml 导入步之后、跑闸步之前):缺棋盘三件基线时跑 golden_baseline_refresh +# 棋盘模式,产物提交回 master 并推送,下一轮 full 批拉取后渲染闸绿。 +# 护栏: +# - 只认 CI 跑批环境(GITHUB_WORKSPACE 必在)——本地误跑立即拒(防人手把本平台基线提交出去)。 +# - 三件基线齐盘即零动作退出(幂等——不会每轮提交,无循环)。 +# - 只 add 三件 PNG;刷新红/落盘缺/提交败/push 败一律置红不静默,下一轮 full 批自动重试。 +set -u +: "${GITHUB_WORKSPACE:?本件只属 CI 跑批环境(GITHUB_WORKSPACE 必在)——人手补采走 tools/golden_baseline_refresh.sh}" +REPO="$(cd "$(dirname "$0")/../.." && pwd)" +cd "$REPO" +. "$REPO/tools/gate_platform.sh" +PLAT="$(gate_platform_id)" +GOLDEN_DIR="game/tests/golden/$PLAT" +BOARD_FILES="board_L1_dungeon.png board_L2_underdark.png board_L3_deep_underdark.png" + +_miss=0 +for b in $BOARD_FILES; do + [ -s "$GOLDEN_DIR/$b" ] || { _miss=1; echo "[selfheal] 缺基准: $GOLDEN_DIR/$b"; } +done +if [ "$_miss" -eq 0 ]; then + echo "[selfheal] $PLAT 棋盘三件基线在库——零动作(幂等护栏)" + exit 0 +fi + +GODOT_BIN="${GODOT_BIN:?GODOT_BIN 必注(runner 自举件安装位)}" \ + bash "$REPO/tools/golden_baseline_refresh.sh" game || { + echo "[selfheal] FAIL — 补采刷新脚本红(探针自检/裁剪失败见上)"; exit 1 +} +for b in $BOARD_FILES; do + [ -s "$GOLDEN_DIR/$b" ] || { echo "[selfheal] FAIL — 刷新后仍缺: $b"; exit 1; } +done +for b in $BOARD_FILES; do + git add "$GOLDEN_DIR/$b" +done +git -c user.name="gitea-actions" -c user.email="actions@noreply.git.kuaimeo.com" \ + commit -m "黄金图自愈补采($PLAT·棋盘三件): 渲染闸缺基准——golden_baseline_refresh棋盘模式在runner会话渲染产出,本提交由CI采集步自动落库,下一轮full批拉取后渲染闸绿;触发源提交见父提交" \ + || { echo "[selfheal] FAIL — git commit 失败(无差异或工作区异常)"; exit 1; } +git push origin HEAD:master || { echo "[selfheal] FAIL — push 失败(令牌权限/分支保护;修复前每轮 full 批会重试)"; exit 1; } +echo "[selfheal] 完成 — 基线已落库,下一轮 CI 拉取生效" From ddd342c0c2a810132f320dc30d66eb87035a3032 Mon Sep 17 00:00:00 2001 From: gitea-actions Date: Sun, 8 Nov 2026 06:39:40 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E9=BB=84=E9=87=91=E5=9B=BE=E8=87=AA?= =?UTF-8?q?=E6=84=88=E8=A1=A5=E9=87=87(mac=C2=B7=E6=A3=8B=E7=9B=98?= =?UTF-8?q?=E4=B8=89=E4=BB=B6):=20=E6=B8=B2=E6=9F=93=E9=97=B8=E7=BC=BA?= =?UTF-8?q?=E5=9F=BA=E5=87=86=E2=80=94=E2=80=94golden=5Fbaseline=5Frefresh?= =?UTF-8?q?=E6=A3=8B=E7=9B=98=E6=A8=A1=E5=BC=8F=E5=9C=A8runner=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=B8=B2=E6=9F=93=E4=BA=A7=E5=87=BA,=E6=9C=AC?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=94=B1CI=E9=87=87=E9=9B=86=E6=AD=A5?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=90=BD=E5=BA=93,=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E8=BD=AEfull=E6=89=B9=E6=8B=89=E5=8F=96=E5=90=8E=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E9=97=B8=E7=BB=BF;=E8=A7=A6=E5=8F=91=E6=BA=90?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=A7=81=E7=88=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/golden/mac/board_L1_dungeon.png | Bin 0 -> 111833 bytes game/tests/golden/mac/board_L2_underdark.png | Bin 0 -> 130258 bytes .../golden/mac/board_L3_deep_underdark.png | Bin 0 -> 127850 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 game/tests/golden/mac/board_L1_dungeon.png create mode 100644 game/tests/golden/mac/board_L2_underdark.png create mode 100644 game/tests/golden/mac/board_L3_deep_underdark.png diff --git a/game/tests/golden/mac/board_L1_dungeon.png b/game/tests/golden/mac/board_L1_dungeon.png new file mode 100644 index 0000000000000000000000000000000000000000..93920d116272647a561ed3ee8b37c5b7811a13b0 GIT binary patch literal 111833 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 Uq4OU)pb_9_gR{3}TKJy&8}QK|asU7T literal 0 HcmV?d00001 diff --git a/game/tests/golden/mac/board_L2_underdark.png b/game/tests/golden/mac/board_L2_underdark.png new file mode 100644 index 0000000000000000000000000000000000000000..af6118c0f6337398ab65340269cfd958b2b8ca48 GIT binary patch literal 130258 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�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

*k?o#(1lbV4cINCk%SHghtU<;aDp~N~i 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%0A$4=S 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 literal 0 HcmV?d00001 diff --git a/game/tests/golden/mac/board_L3_deep_underdark.png b/game/tests/golden/mac/board_L3_deep_underdark.png new file mode 100644 index 0000000000000000000000000000000000000000..3231bd4c878ee8d51b3437ed36936477de9b29e7 GIT binary patch literal 127850 zcmeGEWl)^U+6D?gg9ZqM1a}W^L4yZ(cXyZI!AS_g-GjRm+%34fYZBbu1DuDfwf9>4 ztNQ9xo!@U2KVSxCdb;nv`?4lTURDel5f>2v0AvYqVMPFd{tN(6*UzB9M@pK?3;_rL zNC>}E{*bbt>h?j&EIKfcmcD5Hc_Uqk`DD=eKU`#Bi{XL#sh0q5Zw zJ54ZN_RKp0e~2)whyvZ6?o51T96PT7ay!%W&Zn=H_TEJ(>@No3SK_129Ja|{-#5eIW&iaHp|ko%u}@E9 ze>uUm4t?|2qq=@!3V;3xyT_`WdEl=X`+&?Yiu2c_-@f-y{dxW8Yi$4bqW?Fi;0*j< zN&VlBdg>GZ*HHdn`e{K6y{|<;D6be{^4V)ZB6{KAc)VE+qE26P&OCu?6BrB^`NleD zyUI}FD_;>F(2`ljeDw_2g>F|?{m?swvtjZYz?<;NurG;UNUVne&|a@dE~A*3s-hnm z@|JA5=9xXF-3LK`0pyDpeE`CKzGv;WR#_2{kBR~rFvN;>s9vEBy--l(0OaGx%|_f^ z(I(to`U?9Nyxl!WY&`nH0Xr_eI2IgnqsMdS;-aF7JwNp8yK=%AM-une$A>!?li!#7 zT6Zf0(|d~+91Gqa%+kH(%ti9s6^28@i;)k|05z4c-8S9jgi?0%eonEYe4r{KRAj0% z6CX29d(U|dK(~nt{1Q;oAmJ6OR%G&>t0x2^4{=#0P-S>skCyn1=bizo#Yq?CX{)(} zZ-j=OopUMtfho&2-*$nDgp#2zGb7$pZH>Fi=IWfj6Te6S7jBK>GHASAdSln3XF;pYHcpDHoCP0guaAjaHs)IuC`cfo@tj5pg1=k zuEA?}Xurgde$5YMsh&OgY2d|#RSgW{SikZpS?TZ%0D1Mut*<*%=KC((zOt!J_3VvK zHU-}p>E9wet;gYAutN+s<<^`5;L;SfbYEfbRa7k7&;$R&;kM2m>t92k@9ZfMoR4e` zXYVSN4NnZ)Y3pkmcYH^8U!hKS?n}iH7b-!(h>0+cX4W0eYOmjeGJC!L38FtVjIotv z7Wsj^f^g=Hds0bLQ5vsv$a(zq0CT$TBD$6$>>)*VvH4j zO-}^-?(S|^L!W8fHvyG}qfU4AQU7g&L`VN8c<_*a!eI)LhX7pM_L%us%N!%jbJj)=RJo`NeESDD4-k$D;R2^^8nND|a zIrlE|-1Z&jSjk)mu2djJHXvdk;I_ci6W}Bm9v)_xoLsTK;;bf6E}DV8b#iH1X2`mU zyZpPFu{X61jLzSXnaqj5gnIkh`FGZm5Kvk5rYk$Mx#T(h$C#)u<^VX9(^Bd5w_2f9 zrWcaI{$Q2l^^Sd28GJ4MwF8`u$2>x2Git$2$U6Qo6zUI35!a)4^z;bHvVyQRqR<(c zD}t@px?aD!%|&2u(7B0lF=Y?$bca>-Rvo=pXtw?oWyb~6(9RF@e--7n2|_6s(Hm=+ zT!N8N-fAkFvSvS3#55-RB6e}8aw;2!jii_W(O_eTX!3E7a`hGliC1s6+4H`|{Z@am zcauITq#zmP4xL-bF{?6;UMNs{5^^}>XDaF#ZmOWG=tkAjr&*+0Onp!gn53&@E3v=;NFF-)H|4OL7b>iNxALgt6V z)W!bAN^n3odU>NMG9DLSMrL+to>s=ky>E&9ISPC!jEIypFHXpM6nw_awf`59#vSHl zt?aeJf>#6^?A{^`LE67ZQoM$TU5pMZz=^W>#xvYH;Y|d-27~a6&JfA+ToQ2cJ7PO%3a^ixZ8Och zuwn|O)e@N=4x>MLJw%4=0`4mn20c28NgW4{V}!?Rjsqa~o)7#Z?LfjW7FfD0|3$iK zI4V>NKp^LgPiZc(6UtMfo};hY(6g zne`(7N=MB|3JU+P>Kt-r1G=8)PX0vonzF26zJdXoS|my@q4nz)%|9s}F4avSUT>~y<#9-jJ7r3MisJzb|%gUME-I&1csQH~NjSete zyB#;o@RTZL=19QpCNt`e)~Qx7pvjrC?|A%msjg9FiDNU?DPkNA?R!l8G@2`SPh%_5 z{#UT5IY^l%8JCTDjg4HE=&$oC22|_{GgqP=>F|7M<@?EkEDYWe`l{#qEuCA25vkz( zdyd|c?dO^O2kwr7C32c?Uh_`17^fX9g*B}r?Pqo&Df=bQ`<7TwhX{Vb&RQ1cs?CX5 zIMyg0A1IkYsaKH8G|xu+D;AB=fl>hQdF=BX)Bj}~2Ckbz35Fd{g(81jBj%M6C@6uN$mv?0i(kpS)E435augv@D)OxU@Uu{~06#9`1?)l-MZDsVf1NYS z=YJ8>(AghJ3L@EYpLV>I?Y4QIKmvFQgFUkAw;LmLV2~85RNr#B`Vc9mqA+)D>rQ-X z4)aDpY_g=Uv73~qp+iqRyItd7i(0_u4S_@#W$MDJeB(O-K#&mS-Wery2Z7n?Sl?LN zm^*N3Dh+xqFXH66H)QSyYa=xZ{l25nl3N@^96yv#|2w*>fG`CSva1Gp3;hQEZo{$@ z&-%z-;V$v44FxD-{;SC2&8{wrKq1X$`hHHdzuvn~EnJbcW$DqjjstSoL*+InBF(EQ zEeC8i()_%CG2tI1)W>$Dq~s~eD|z?doqzcUUr}6K7P5$RvzM|zYyUbeC7h0^l-Z1) zjIWt4D^HCAAWd!teZ?_S>>afFUgL2Ywqr%n#!mnAu6*ZXIi}Xy>AOWrMQ|8^UJabU z&wd_zWucZ_nH^ai^wD+P0o(kr6r=gF2E{PFdPDE|2$n@IzS444}@FJG^_h1SO!^^F9JOV(-9>V5(t*8MxjZXR^vFDmzYG)#$oVV`F3TYHF^s?w+2W1mT-5 zvzY@5|Dc?z&;MI}EL_eGB5u?`DY~#hggHXYej*BHGBnuIhN~ib4pZ?g+&nxD@AxF2 zx~-XeR$~_{`_$c3T#<3q1-j}gGXV@GglUry%|8JKMXYLa$GV{I^N0Oc{~WqQ^PMc& zh$6JGR=Gbw>;t}y9A>b83ZJ7((|uJHim4fab=_|`poLHJTg0vXMFMNdv|@5<11%qO zQnVAcqhnY@gJF__pyDf=C1z(ha8I{M@q+tLa}5g@4cFXhFaHIe|IvMvIhLJb z>e!eLjrZTavIqoO3tij_cj0F^UvVKPPs8A8OWP}fQg(Bt+qx+k^a=3v>`OnrPMJ+$ z)S@2>V=Jc|W{x48rS{Ri;l3B;m%PYb=;%M+W*p702TI=T*H4x5)5`+o=21!;}@mMoui+?pWex0q= zL@%pVtp;~5?t`97yZ1dI;Fc2Z>J&j~P+ouG502MbyN%te`W+7U*zG_KP1w>_@0Szy4P^n;d1lPAN zRIF$QrN*LJ^aP@=ArQsEKQs%sNNu&t*B1adqYdn8w+gCHjnLr9sgD1iSx{q3fyZyp zkvA`mDELS+fGG8jgt?++2Z5B3_18S58FSxe<}W1ft1#IXzHplxR>T zqGw7xBc2A7PN<0|$rh8+DoaE}RLMPU$uEH=jhW9R?Jwcph@&J(jta64yMnsNmc2@0 zNP)6tO`hJWaW%S)V)3*<%Nw76Kv%QreU6MRLSDn-$^NQOx7|R{G50r@6`gxoYI~KmYdcArPh)Q;vAD= zg?H1Z%wvjbQYfxXnnE$zBnDCFPD*Lz=`lE5^t`k?? zdbUebOV*NbQZfMYLkP&>D0%MgUzN!h>&U5b%@E_I?~jA@6H#Ar|6eD6baTna!sROUDRA$)D+6?NAReix)l-6s0z`y zzP&?M@qg%{yYb;Az+70Ioy{AWk08V0jQ-iTB9dL`sr_P6yyd&CUFG6p*Bb4AvHl-M z>@OJN+|?;quldX!b!>p}ZC2Z~^*gDky6Z0E3KI7L9r{z31(CN~Aa|!ud0Ns;Ld_-W zO1dDn?6L?xK45>?g@ac%|NRy>gp&YemyTUnE}-)#`_~L`0^dq*To(K83&MI(OxU-bW%uQ@?5V@5kLHd|9?s*Kbbw+`=Hgspavk_V07dyg zPmyr-fwf(H^sKl~fUy}tjx!HBpG1g9*T=j{!A3i+tk)iZK%>==xDe~b64>BG#0HS? ztJ1B~1z&U}wmJ(r3&l|2q)t9^y+d(t zds2>AmwT}KK{Ed_O`a(M;mKgi)-KqN>Kxy9;sPia;w241I_V7$p2y~)J!ok=A!}$c zAC3F+zJbeArER46EjOu@xo~Z8Z~zoI;GXzz6oqUW;^A5K3jl2XtbHJ@Y*hJ(2Qq=4 zn)#BgQ1{S=`SZ#{)nOa~Y3tEY0)Df7=>!f!c8nF5Ejj=*gu-Zx9XJW129Nq~5B{*3 z7BSCvy6naebb_I^+f^J8VcaYcW`RPjNT`eFL|#@swbKB8cwWIs3j{{;yIMrDwAcnd zzaZY4U5Y54OVjYo)Y#ONyu+Kt!}px2BZR!}w>LLCf}|>Ztr)otDslcaaRZ}_+ij~} z$UpW>l0PC?wQ9k%%Vqa-*TRE%jK%Z36fB!Vu_jzxI-PTyV0!BHTTrP46$wP%c8NbT zMiYy?vu7@}q`7`g3}4`TC{!`kV^|Rg>j^fuI(JQaOn^4NnoEMkrM`!<3F6Dlp_USI z=yviPKk+#fIUDZIK^`fVHXo^QHeGBYB!ww$YHP9bH}ja zptc09(wO$Pz*Zm*>f(HNIU;oY2dbBn5rOZ*Zso;ZD{KZ*kT{M52Em~dm(RVM|MJTE z7S`C5^6Hebp5p!h_Tz9RyGadNbnoqrRoGkj2fGOyzE(>jqE)R&JIt`>8MS%%0(FFH z){Eun?X}3yP{yH;qhyL`cK`mwioBtx22bMo(d5*Wepzwl*J3<8`fmRK?nBS*A8-rL zRNiG@Ua8!%v9W181cCi;DEA}Sm49hKsS~zIgSsJWx5?13jJRYLA3ajLRF?;N?mIpL zLri)Q6&&oJvQ(y_oP!O~U+@#C@`0!TF3HCeY>pUt9b39L;(VK@xgjhrzn^FLOaxwk zrUfE}ETwlp?CQTsBGwvVT!2U?exOB|k^BzU&Zz-fbToU}z4S+S^H=BsHZl$A=`h5c ztVKnYFun}rhNm`Uw6p_ANT+QY74%2Kq8^XW@^f#MUjn7g8H2nziHGAIR=sJy_MoUXJW(70-u5sh$eSO*QBojrLqOS*d&SNUub2K z~sY_7#`G9*>$GW?&ZA%vhGn z;J**c3E_0ocN_@BgZysZY*Un{@`X^Z%{-pt_!71RK*?;Qwx(%-(&g%SCl&mY$$Ww$ zn{V{qI>^WCEM&D#GYh`1H1bM<(5-1v;fT+bz(#t$R&a#`eD_iQ3jxE&Ouf>#8^tr) zg3C`;A>to4KKM#=gBNTTl4r^39_9)Q+HUZr=sX6$lx-qm^uZs4g`)yUgV$}M$%E$1 z#syi-z@uF9P^3Xaj@!NKc^2P*KzKe|vD$<-nOjsrTOwm-{cT#`80J zzx{;@KlWGA(Nx*_OVArZbF>paG%^w0+6P-$Fh5@Sc>gNfnT1ksK2Bg;^%@`3UrBd6 zkE`Qzc4kRciQY|XxgFr2P>3c$Xb<`Jc$d_BwA{Ak+tyaw%o@O@&2PVZn+^~kU6;v5 zsih24KlFYxdm@!Y?zV)S>m@MEh`vu~q^`J~{&mzV19=3*F^86%Oj|PSFv>0k<=BoY zOBCN_?z$LPBk-f1x`O(3@+Am+OQ%&zwye)l2NURsXD2=f)kQ}qq`5_Ejs$iazMM&B zLhDwf8GTTdI@m!>p^}lSBSdIzwFG?J=Ga1R+WlhoEM+&g2;4VHue9^IxuwplEoG97 zBU(>q@-s7ae&5&li7xSM?&3l42e>j6Z-8e=b}~(+)q5as2i>Fb3*QD$eWUYJqrUQ& zPEw3|jfoE1)gh{Q!W{YP6O@>HW5nlK)SALQ>EPM);dOu!FTwVF;=^F#l+}|p_F^QB zZ1rM^mdGpZ@?-hLk|`#2VgB4k!+A_b=g!>coE+}F5ulvOCe1w47C}M+FT|Bv{)KN* zFe#Akb-KoTwG8P0a;~$?%_zl-A6r4H7VaiCj!;#@5_8^l>=u|!uNw$9TqxHZ@_h(h zJH8ltQuf0MMM>dr1JtIcdZ{H2*?D-;(;SWL%gYhA8e5(UN~5~bjugisKX z0>6;u9u%o0UYQWo{aY#)dyVw&t3CK{6HP?V^kHsVqOA@s1baAk9 zho>dKE7y2}hS>?B1WHt`pISv))i~J`4h29@gFfAl+|bZN$zt=fh-cZ5B-)NCy ztW%r)NdXj2H27QGmd|kuZq8I#&D zXjzEC!Lxh-p6H}lq78+gS;gtCeAVUP-NB07pb!G+^eP3WdP=AmbHl*a#-R60S5CY> ze!V*khLmsFumbxz+!J70{Qy;IRz@x{uW@Rk7(5v>!Dv5|Z3mU;X*Do7+E5uUn|ktf z>-y7HnimB*`G<=agDVen%h>ln?`nKJ*1w~K-|xo|J>Fb?_2FTMw13fSySeN=YSl@C z=$|6H?h5I6p*#PL5&a375?(w(#4|jDvSPN`hEa;T!O}Vz#OKfIk69MJ;tn}C`-U1| zi;frAHtxK(v(jGzxkDEVie|XhFai)U>PFBG9^$<@;ra0xQWFJQO%k(jTuQQA(&oQF zjLi(})Do(y z>saHqL&JZ>trTq#q_3;x3h>Gl5wfYgZcln+eI8)PFPv)e-P~<+))pgfDPtpK!!sL;m&&*6EJ?90U6R;JQdD6zZ{^t{?MWhqeIb67pqTGenqO3FP zel!!s2(H&zY$@)xk@f&>lP~Aa!1TI;NO%x4# z)+}-$U#2`S>%T;1&COD@;yo*GCsP}&EN99{c*hpwv|FkyC4Sqz+f#F_`V4-aFjd67 zEB=lg-k|fT+ZQg^;sf0B3)Uv zX{-hytHF3%y)zr80uN3{ z4|rXNklc|{*@^R{s(vHB*B6=&A+$21dFgEc=n6(h2kg(EEbn}26c%;~Uaq_`)6=`i zY}tW^zl=Om?7INzBM6g_&zU5@JRtx^|2nx;YMPw!rRl#d0fWT}v(hp5_gQSqMhiSq z^=2T1bvvkW8EySb@EVbPK_bCbxwuprEH8+5!$YAEnXnA9LYrR7JnXEjckEe(sDwxy zB9~~l*cO3#iR789EHMRw=b^2K5ePxh`?YycYX-kJL-C!xuI3&r!}NrWu@Ln?{fF9$ z%sQU6ljQGpQaxn_HwBZN{SZ;VT_13zodQe89c+igu5xzs1GogsZ^W(EG@@OF^kyaW z9;AcZpT$K)XlB3d&18VG4C|qH4*~;;3h1BO-t>uWSbP{NL9t9$4U5OVdVT5_mpqigR?=9sS8oG}{>@~dGPu1Tg$CUiccIWWpC8S$W{~Z9yUzvfwYxyf%L`mp`Im*ID4Yb&mgk1K7`pZNsUTyxQU*}M;CPbS6} z^JMicC#UjyympWyruoyl94(0t_H$FUbb@#A;B#!Q}*>NIbLAQJ+$ zJwxVpRVKrG7Y4{DCgj@T$$X3a3mBf^Z5zZse?m~D=p}KVKwed?h`QX5?g1{rzRR7N z8Ntv9*PLww65#F?t4nmTw##UtUYyI$?WpEy_=cjJX>$|T(XqQS?KAl-O$&$u^?A** zdo!_P3n`Db%f8Ym$;4UgwG#ZiExUgurqr}??!2q^SZ@8$dnDa#AG}p|N0j(;o@y)Y z&Nd?~;gRiV`GwvjUL)3~3C5;L5Rbq7++UO2kmHWM(fMS4v=MlFf7I-c>*m^PAI;yx zeD$hia>vrrlGha$4$j3BQNg@gO#9ojmY<$+Phr}&mqp38js1(b*sgCb@iSAxLAiQ| zH$qYs2xJuoH(emt4_nYePo8MYwat3(->oh55YoHV+zJwMH>oDjK&+S47Iu#LU8FvW zb74K-*jttC6ZCv-y-B(3V*rkN?#|?d->||HOGAr*pB+H&WRSP|ZIPY1@|>8M=@}M=oRKnuyURZ3 zhl4JSDMbwh>pG6%+re0FTL+W32Xpm2YDUWEaya&bYI;6pldy8>m+!%T!&Q^c@?xOr zKOK8?mgpe}WPGqF`ifN5wW3ogs3xAd8Id4Rb?Obq(^{Iy_gEtr9tm+!lJGB#Ov7@b zgpMTN`9AMxo~&pm9$js^;qgR^n9MqtuF@J^rak~ZKG!FYO?!op4BiC3#^Sqktvnu| zDQ=HO6IxFu@HoO-P})z`&Dyhsu#9e<0s}I#v0&PtbcX#Tj>S)<c97H1OztbU<9Xne@F*3 zcZ7*EwNCU5J95~myZ-I$jQ!*6y!GIP3VSV(jeu%v3kqZ|k7%hIM6h5rgw(7nAh>%f zqxkrwwzZ8|+RH?)6D-G7Tr7r`u5J>o79*jwogMZ*{BF16kZsk&clbRwvexUOs*L_2 zd`2Tb>rqpy@p3Pn^YUnv=elds2W9MwN-9kum&&hfhbd)@X=M!h>#MrszmdjaU<(%vSd20`YcFb{wmNuut*)r}!*OP+T$;I*)B)Uq7f0acI^U zVpHVYds{^q{6Mn4m@jm0Vd=DSajs&;Mc7s9hewmnZWkvxspMSrdEldBFa-dD2h87h zCIBBz09q?a=B+OvfrZa!J||q9yD2`C$71=~@E05$%x+oR$qPNt%Tqs=bU?sLaf4Oe z3JorIVt#L+PBHr*;0X;9LbE5Ki0=Wi0Q$G)>RaMM(oS_BQW+GZmxd+ZZI#_Oc9Z*@ zP4h^g$c3FhZ|hjA{E?qv zW#Vj`d$4OIz%CsuSd-a!6##6;5uv*%KVtjE@c?$a-#g};ssJ*w^SgI1Q38arPiA*I z2xQHS{4V^e(#44810 zChrIg+Y@uGfB(rmSHD8n>?Ru45a0fBQn!Kj^MzAJK6F#5QOx1~+k7ReccT$W8@2~W zrPrA4jAWb81%))Ey-#OGDJDz9K3+*pSeP@wC3Zz==V73$>g82B8ASVK`Fx`4(XxO8 zn#RYcpP%?y`_Fp@yN8UdS?{?7jLg%LFw@19>W9{(A6q$m+4naMuD0;o7D8z z<_FK*CjsV2Xml8Q8R;E!u)miU7!oz+p;!1`d9bC4CX%aI=;<{L&K6Bvgk&z)*~>S4 zI%j)3F37D9DU)4K$8G}DQ-Uv+^*X$e#XQc{ZN47?&CYo-BtF=(T32fXG+jXfSkx{! zE7T6Gj7ntCI77Fq0QsHzHoZ0>YwK^FcyJ;j4?tit z3)n4n2Ad}E`LlEG9NAO$x!c`V2SCV?8@WjA0pErr zUbdSr+}x^Jk$donO@9>6)E$G^h`&={pbx^|Hyaclj)cCL?6B8;xg@q=Y;m(p3!VXW zUH@yOeb~e&8?t-ewDaE!IkxT;(G^>LMvf~m#58FQCt#+WL~D$|B9L8J1X>)2UGZF_ zf;=n**Imd=6Oi=+5(f}L&oH}r2u5G%_62MBv?3l_0w8d$^jDT#F(a*yL8vgES(E3@ zO+$crO_M4jVX}KR-vFQwmdmLU@Ki!O34>rG40=2JqSX=a;^oF>wc@c~)mHVL2}GSP z{z|U_Ucg~M9MA{|sacQ*zGp@~Jm3OiRV+g_7+F47gwW>M#7BVFbCfU`rh_tmg}d3o z)}^X7%H6yO%L@jR!)2HZxsE_uxIFp6pZm~tGB?nm23}&P<_XuXtwquk5i$-nS8Xv% z@A`nzevS8qhw0uH;L`bU1T!1`m>uA9-A?_;ZS1@zffvX6B`P3Uk>9<>PiKm)M}al)eAv6uw;Ev%+9t$KQ?P1x;f zA^fY=5Bcy9x17G$U0vT2yby@_kC^70mOY+lRL!c!^>#l8GXCXGB7)u$00XltD5yiR z@c-GJR8^}#Rj^|H_)+tX5VAt*XBmq+HVh1mi7(5h*=fdNP{f0Z;mf8nif-{51Bwc z-ObaMe&F$*@|m&Cv>AP?a6~$L*1b|6_$)z(kIB5Rv4uZS=i>q~aG_c?tq3nbyVJ8{ zm!qQ^QY;>)Ix*2xMBuC$^d@;G=s{D$%%7M`I*GP z3Es&N|6X zP#aSxfbpU8O&iv<_sKZZ=1_ydjz9_xV-}`Pd9k~E%k=(Qc3woSs1=EGUqD+M4Dnt2 zC0Z{^usu}GE8pY5J{%Sz7^cVjA3i*M(CtDIEzIxV2XCvYDG6o!e{qE{-CQ>D-~XTh zTs+X6vH5OiLT!p6ocJ;dsUFbJVn2N&Q#CN4o!}VEXtc|VBXRPOf3RS){wecn{R zZ?s>tLnrFKY^>qecAHL|BoJXQV3L4HH(toz*4rM?yy55#ONYtGYQ}GWXjudm0H8WL zoSlX?n2fY(N{b%(!t^T++otKHafH@|4ZvK%3wnU5Zz2B0Mn z4L&%8H*UV{(S@~cBDDE}qRTvl&jU>$heQ+IF18W2--Bk|`zh)8`y8PB{seD}T{!-KYPWkk-D&+Vop^wJK()#p8EWkRWg}X-&M8oBp zTIw(3(?LN4Zg`O!~_PqQ4c-H+w9g4DN_ z`#x-BlyMHW8Aw4XgI3$27SI?O7)zoSWF(Sp&O93rQ9oPGYL6$%%v|Ae*iQxC)RsPU z+A!Q*%seJfPelh6{;v;x?J^&LD1^XvXNA@t-)O)E>x{PK-b5SmSGE4 zfe4u!|55!JL){2?-vM*cc2Jr`Dm*)47fyMcA$R%cDH#w*D0=fpbHz%>nMFyrKX`9f ztpCJJpg))@XMTuZitFusr6~VQCJ79MQa3IcR#ejgj4zL(VqLDC0yUE6>N)GG21g61 zcn#IxS!*xlowEltk@ysgN)_ZSYBdF(y_f3Pzm(Z2Ah6jKRnSxheyjwfIdU@&$AwF_ z$aup1*gD#BngdwbHO&VcSJOg$1=?ugP+*V0FUqa39N+@kigq4XtF!=}_?yl|k`hwsYS)r|e_XGZ@ghS-sg@Z~#~>5EERz-}thv z(q~C11xyB1ei$&?LW2*7d*AuFKLpbgCZo2oWJOa(H(do7~6Wuu6-f(057Q&t#7(ibp^-O%C^y|Kkcf#Dh zAZpFUlc$9Rm7=}?Fxs$Cf620-I(0t+0%X`-gIF*Noq$8#DLU}jLpQ(+L(EMpv=qEy zVq%V<9Lg#TUBHA9&1iHxG;f#!y4i@7Y|EEcs`O{tl`ak2;1!W1b!W;qKl-e^$Iyl? z3n`FQrEI`_*hF4La8|FXiz=KmroyFpvdy~FdMc-)!zq*Rk4X3>mwD?8O`E>$3bgHP zG;g5R?%Hn4_8wAjpYxcL3&Cb_SpuKpbKkN6G7ZWKzS`im_Ak`o2q+n?)grIL1PDVt z3kmhU%;f;~m-yTsJVv396+TwdZ4jXv)d0?VJ0CF1g3sR!-QG?z zOE_0W*uHl}cRfq{xcx)#Ao#o5;cAuh&M&#;1zND@BU1w4Jihzr&W>cK?<8|;Mahyrp~znf*oqT?Nb;aEiAF<iK9HG2YRXlRNR?^B$gwfZ_IUVSnc<2soRiN#zaLzOU zhGf1pe74p+;{!52^2uUzAp#G41KCE5~XtrMTJDo-Pb^cl3bQ+GG}x!Mj`&zc;rCUsbGs{+~;2 zBJ6!aFGWt-C8CAtO3gEq!269>6#NvsFR2AL(8Qh4Wl(}XJC?4AIg=TjUs|(ifx(tj zPz_#geYTT8F5$h8b37a{*TA^wzCy zq2#rc#yNh{+(^)GTJpCM13uShXs$ACnC-v(+kRKOBOJ7ByQ2`yJ#SZb2-Pf0=XAc8 z10r2L)$;pjmu?@oVthb8^=3&?ZKF^uS23!)Q1KlF?y^fze7uoLzZNNBpvy3tvR){_IcS%G(%&XuKavDiLt@*XAWF`Ef+(R^PeGKQhy+q#>M4%W z;YA*$;n6%L!XuH-LwVYu2*{uVQsRh3A%6^HQIZZDXEKV8j92Ix8+sB#%c4xUa)H@> z1_v7cuunI*`uVhC*%N*ffSe<*1tf}A&R`G>ly|U*iPZ&J(r`&!vH3ql}uG; zLPY94G_RM%-TMQdS5M8)e!qnAdFVto#zGibpzZ^dr<-|b9#g>{z;D;KNq2)`qV9YWg7)7iwA(`gl>b|6&wI(tTSkafQg5d z`Kq&ueFDJJiiTj=hUXfAHvsB`M^9W`^BI|M%~`tV&x=vWb)grYjSKMTxm)(rwGH@j z(bR*Xq6t~zYMy0N(}vB^in;%O=m+ssE{7M89bpC@9zNEv5y+5g(L2Y*F)-fbXdT7g z%>^uD@0(n08rDXdM!fIu%4xria+O23hszYRKQuoV5LR~86mX+fzf{5X z-S@-WHu5~3`})-Zh%$cH=GijctCwHaF-;5Yqi*!Q^jfIJ?mx9A3CST8BE4zboogY#sMEpr)p z<+71cV{gycWtY|ij6OK$F*vv{GvW1}abn#i=^8C_?}WK47>zi5X~mkh7^eN}qsMKf zAN?l+H0Wz=Ma&}%3(-R_Ng*854d{pSG+1q`aHm65^&iCYMm53_c8LEfg0jzs{EikcC!$AT>&BlC7Ri0`7~x1MU7 zj8_M#PQwQO-MSdC`cNOs7jNe6HGTm~w~)E&pJHF}!vgmws#c!?px?uJw!qspM*aHe zn()NlyrV#4EgJZ3CNy&@BLrb(=Qa%wf=9(D(rLbU=1a!%SfE-As2_~{AZ&pcC!{If zTm$dxf9>15&W^|iOzt=_FfbrY!BM^-oc(C6`TgxqJhwJcsVeYMvoLFEgSUi=BZ|o9 zM+QlhJFgd;oBiv$i40ANI-5cFYU4pHkGo5`V;)AJsTAQEjDE!wy?JoL8!=S-6RRbFIB-rI!)Yt`7daL%uoZaWHjGwb%czw_RLtAm5~YWFbH zrPH>~%(S*J4GR}{B3n$lR}6w`%HXyIo)VRkb#_)^qzO(2r$V3G9zt1JS@HQi>8Qka zmz%bdJfH!%uzH*~9A1LIfYYf6LXXby3!(;RJ|}%{UqmJE@{;|S?1qNce#no!j}?@( zdmxpFXyZ8@2mr$4rmgRfB>+&!oU{m#ycm7aHWjb{!Dkd|X~7Y|!OwM81>7ZyFIC>A zjuj}UHl`W86EqPyVOu*wC5kXMgDxncBjPlF7AL=pbu_R@!}y?~KLk&_bOj)uhG~{g zO;pL^3w|kV9zV#I#S$$121c2-@FKEp+{mLwBxZhby$9t9<*h0oMQ%1z_Pobeg-61R zY2h9r-GZ`;_E$JrSr+RgojvPBcKk0P{66ZVCWQe{DZW^PX1{L3)ce`CL9M4ylN2NW z8a=PDg#FHb+k@AS_I0)l{;@)s1wV61zL{-(~a-QkT_ZrF{ds4mRjx1g=Y=abYHYv z+N8X(Aoq=w_nJMlNvX26R&Sd(tqNaXM$ zH%qomm?`j`Vs3p~)I zTg5a&9bbK9sYC;^<#s-MwLyKzxXTcL$48+|kp=Q5euu|d)hLR%!TNskB#Vnqcx+33 zhz>tpjG5IHcz0zu;JCa%1S%3SH)4wfIa<}QZrzIjCVq&kQ^xYSNr*cr$MWy=Z zCiRT^Q|_jht6E(rTZt0-_&MI_$dbqmwpUJ*4$-s>U3LzlD5hiBR3)6af_vARG}DZ>@P3=!#~o79ad9HM{bG#59k zRT>7A;kfeFfP1$4c$@$yc9i!{Qe6Camngm;4@}klUaI=GY;bl*+`dJ}!#oI%Iu3 z4K9NAL&Qx1FSB}12cR8!;0s(mqb_KCC7>ilyxE3ynb!B#eH!@%=Tcu3o*F#s>sA6kI6%#rO;3(67?D zzKp(}YxZvaH~<*jMXliiyQzhd^lr^yLVX(>!fa0ST(m&fpw|CG*IPhE*|qK87oZ>@ zAWBFh4HD8hfFdBBg0zZsN;A|LfCvcE-JQ~1A|N2$-QC^r?eV_f=Z*FMX1QDoUASas zUwfbXJdfjduo8W0f*RizEs`mTAM@*kq;2Lst3V@k{Cf}Zgg5GnBIlm^v%?b%x6yC8 z=tz=XUh-5-^MQ7V(^NIi^e}3;Y{GE@(21PEkf4!d{uYI`ZEm8mXyINi3Yx@Gw||Z4 ztn+q2a$|qsac4f%$9VIVG)Gv1y|1ZXe|Xz5ivnKR7tJ@El3ycEmIrVoNk2zoAgM0| z0yo3CO8KwOIeD>s>o4W{BDbQZbn4OW-OtJVoNB+VWL=@tW}iq=V!xpT(WF$*2yd7{ ziQQgo;M0Vz*@mrtCJheFu!d3D^?2|@{7KEG=Z%ex$WL9rU{5!&PeKdBG&Lm;5?2k1 z3jR?5`Fx8}*Q_7PFX=KyyLWGv-)mY7n&cXPi96Us457C;9AV?!?tRRj;pm#xj3R#9 zBr$;#Y*pDmy^NJ^_nH>Oh99FLKEQ;h+?RNv`ib+$z|(pc@~`SJ&Ru`ynx=0M>{UMY zZfSF-BwUssKdkGzyJlOjETovoVJvn|)SCo9In#CcduoCHZhI`w5no_y5X%$4q*Dx& zo<{~}6NRErxg$A?^549o$z|7m7LRLUE!G)!ivB4%owbW&kVZzx(3%gD>ttq)5K?(6 zZT7b}Oq}AYB8sGPe78)W67I0#P1C@d4z9;7?ti{W{{4s_Eh*%g>E7Gln)>%?WL4;v ze`uIIR#pN>s5w5xqTo}2H`uqw>-+KZnWHc*lsop8CxQBV8ejiCHjS`^?bxqW$r{VT zq@4Ta?6fHeB9zpnCo>Z!L5RaCxIBpCX5W&5@^P%1lgTCuj4ff2=nDZ0F zSP<-N&v(axx@O7|+gjgkoar||CCvR!F`YuF_0^}{SvSyV>*o+nc)N?e9~kz?K(QjK zzIyg;Y*#qpBR=+Nb*Y!)4e1frGPJ)Z!x(LHo)C)ittdc1=+*A5WzCXoZNei1M)pr6 z%)V#sdTNA4hRg}Sna?L1@stYuT0H|y3W8#=giJ6gXRQ05APmxc0{I;;aAjgK1w)l% zFzEl2c*2E9y?KS|N%aumV*p$EJa#{N-FG)*(i_JqrNwxRd-y}~ ze3SjNiQhUp)clF7xcV*1J|K0s2{1PY_upz9e|#;8j??yTRjnG^}y+=%_ zd}sT~E_D6j5io0g3m{$ms(4RO+BwhJc>u%w6N)KMOwEp&$v3{@o6}LTs|VseUaT&~ zZZL##7E@VhYuifK14T&m+`7on=GG6xvFv3ZICKNIZ?PJ|!GHu%{&;T6KqSJ>(>IaQ zLct34jhz;xE7C+7W# zlx;xl?YY{mpK9dOK%m-R0EQ>6-45&IiMEoRKZx)eS+e>5dSxaq02K_T`N;cm_?sD^$XX+HV^`v!-1k{M0 zoQfhZQrPv{Xs=sKF-@{-!5+Fal56U=Iixw|d=tP;`K)Y>R$HW`s_i)VwusTVd`@HO z+6sqhqzJx;zpJ?;)%M4={yGjse+n%(r3+Cbkkwd^@6sY9+y*dkH&JG7I`#HuMIYbD zzWk26t+i5a%#+e10M)~Mc=(6VR^28%Ist{mwIR1`31|4V3F_OYdQ;h4re96>4o+!@? z+8#ddR<Mw z%$)Px=Bd{6;Rl_O?|OMffMgGdk>a|ZsRE7bmX$eJuZvAoq40d$fr?Aij=#?jfY}6u z0G(xWaFso+%NTrss#*PYBD|JchCIF&LkpH+q{LJg12Q6N@QXBY1)b5HH~O zCNaUlJkm+m@RQ{Lp%G)tDNh$BqNC@YP2D-cWM^C1Gb1r5?XKMI*JUwleSqjxYoeG{ zIgN&*9zj@p)hai5|6bCDcyi-CqkDeaot=*p+>XQFG^<+Inq89M)f!J8@d%QRnAld7 z%jHQKoJjXXt6*`*@XX(J^y^0J;67h%E})NkU=yuK24r@Vs8QrjkC(3VDuz2AKhe`g zMZJV9r;6u(^}#4k^72?ubbFb9Xy?5PP)%1BB+PhQ#YvhKPTk2}ZNAk1eu1&C{FTUh zyWfH|GeU+M=y7SMiu;wHk)PEv|JCFA=E|$Pzr`YK=^EYR*6X)s$o`!mK}Czx7nY|! z8MJ?y`k$?cAJ4LlqlxJOP}{b~z6jAstDpJddEj#t+uYnNB)aG+?+(t zcQ?QrXK5r^WH6DCQJj*jSxxlhp-@ZXrzoEgYH1QgoV&?~s(t_#;U&!+KoMUcHs$C> zv6Vb(DkQ4CMJ=8if1POpU9L<7ifvh5NhhbL987zD`neu`Aob|K=lM^N^ZayL@(1$^ zKp(#3eF2eo{7HL@cq^FN{?5FDMh+w3zt|>sH7hCM^WaMt#ZNoqMG|33gR)Hwp_sq` z8Y# zk3B+&Lu|+HL{o#H;bPpqBK7A_;d2s>&ub@Qc&~wq<>1>kYH+Z??9>P))C>9#6|Q%GqqMEvyXfw{V|g*vtLKIY=?y9A^+r zJ^(2sjgh+7v47V#GTL_Yg+?$t0b-QiG^>Jvv9*eqW$W+I6fgn5daDU@1`wYPOyP+f z&bBC>xt?*+ykGqC>pMwJ{qfP>-qD_`t9$1BZSD@D?#s@5S03wVC)s!e?zR_+DY7>N zFURkiN;H=x&plP?%gj>%zeWu3`8|IRE%@qgZE-Y#PE#D-e@U-Twekt*LP)Ay<0jHS zwM;>vls;h91>y@SZAJF4Zyy^3fqtL|P)rKE=_lxUqvV`4WPTj>t}F)D;187OBj=-) zo?&i+sxvYI+kRiNwn34MBmUw`eFiYsf(!3@N6J7vg*Z}uy(ohH`Nh*@=+~)QMpxSG z)i0FhuA>4`AgH`M`|JB%m9NZ`_uM=)h2>~yY9I*|%kf>q9#2|`VA*I5qdYOgd}WzW z#vA>JLbTG02caNVP=p3uKiPN`KCYRr3cH!5%UqBGeT$xr#9EBm>fFqN8#4-oqMk4r zjU!Y)ZZ|qpQRZYiy$6F(%bEzPyo5~Gzb`YBk>(|^*L8dy?mddh;S0?J(imeUfLto~ z>34b?zWO{x41l=Kcz7$X%Vhln5~KlH3)CmtE5U>2Vm;Pl(QYuZE;gCeTl;G2iCnIf z{m){fRsMS{+Ky~<|Au72oUCr(Zex_&=j~Fhl0>T$3mXaUr#Ks(Z^DALS(n#)zZ7JWJ!k|s)uEvw zh1#M(6qv)S4)EpKnVFElJ#izg4?3V9$aWLu>_8lypmS^;E4uXt0>&b_DH3zT;o;${ zH|wyjE?g)&dhCHsoZV8^oD%HHv`xC{r3FDMMnk1p4=xlWdU*~EBBnY!9YglxW$&oB zCu>9Qe}m5x+@QrNg7!gXsHhMHu8EvQ?6h_7Z&l^d@YGf(>WSe&mkb*xOf#p_>&L?6 zxEw5I#FBr<%b<8_gfa4@zCv=HIe^rSm)9zxmM?azHdBs+Jad5gaCGZ9CPq8AtbRd) zy;bH-$=FNVZZCHRgkMm@*ro#%6$SUli-S}%V7*rl0>yj#yA^O`r{|C0F$SKXvj1S#A9U4BA!}wondUWL{`>@DbD;t#r6==%P zO*p=Lg^F@I-z~1oxWW3=1roblNNC9Kxjk#SSDi_B(j#Cyx|McT!-x9n>{RbuzX)m- z+aJ~xyVOkWGv!$iyQM}EqCssuh*Jpp*890f%m3k)IeDZYbrb~K6 zQ!hx#S~rj=)b`P6MM{h!yP}`!mCSX#R%Iqf)O`w`HLA2z?WXVf)qHDAM9rU6cA$mq z=tMb#5_hbZMdR|(z^)L!>n%17tlz}u->4WqT0^?KDJ=&PLV2>ZMfpx zC{gmPeg1PEZouhv`IFf|U-+ah6Ou1vV#wv8`vaLI)S8GR3{FO;q2sOd^n#3^YYu!9 zzDS1K6#IE)m!*?HAG4E?l~avJXI;) zSJr=|V*e~`FZ|;(&}JK;V7JzMFPFF-79*gXzq= zI!*|(R`vu7{fR0#anL1z3N;KM4DvH~nV2|&{nK6^gKq{yq2M)rcT;brN`a$DQngxAVOEpfC*S#$ z0yndH?$z0bY;2e4o6E3bV<5$+ff_MuYu?ZvQ9Z;B$AT=oemp~a{nNsq$n&ZyQR<+* zxF?oxrjR0b8L%)EYfap{M>OlKHd>o8Ky7$xaWOOR@F4M;21D)2tZ>@Nc}P9_^VTZK zG@T6{ZNH|6PfL^j^Z%X)^fw^_Qjo1?b^`w@pSw+B-KU+$Y_aU;r*?8--Kewvx2cww z$Zzeg4&0odUTK5cczTDa+|O>NRk5?Si$U80|0 zIiGRw+W47##6n$vs&{8++&Jbv(2@1|{;uyBA(PNDPYmS}NMzML<`H{-KAZ^eHa+k{~Y z#ESs;V<$GB6k$iqP{Abs;WeW^)<5_xb@OMe@xbAcoGu6&dP)2$731}b4S-Nd?<_yV z>FBcxX|>|mS*51`tU*1BlFtBhaBpb*A>hFRS~NJLK1DDA_5C6b@rMXNwc5~%odyS; zq6ZVV8o^P-$7f)@Ox0&URJbHbZZjZ=7t(Qlv0+i;}1B;|J=K{*xe@!Cb3E5>UgnyM^q9|W?x|vx;O_6qY;6sPFwvxXeK=Pj zfDkOy&d*44?fL$)_{MF1XQxo(!hF#DC@P58oVUD3J<}6k=W>5$UR{*s&o`^J3X|UH zrmaOWb8|~>HkM`PrL6=hMn~a;w2Yt~5}`QapX!bmtM(|F_GF>T|Foc8*VmX*F;iKQ zw*#Qg7xZ7c#y$&F;J3Hbjnk>W>)%ogdMp4WFs;4BIlOX}m z`1sE{m1Y?6UZB{{yJWl)f%6UZ_q;gy=tbag15SgK3o*^S3e?m616Mcw@@o--0X zGEcElF5kBrfcKLMLK&Zp$)SNdMVM9mFmqWVW<-D;CW%?<KK01I$1V1FR4&kY}I1P(V{rez`f zPANzA6-DUR$3C5mhGSo`F5LbqjF>MHqGv#2>7&RQYLlqQHdFBGg|FC2hcr-4pf`Th z@j|tovQlcI;6)gCo)5G2m|}=rkGF!BMl($f>S}+T&HE-5DDa5ArfOXs)2LIdl;7jf z(JO6jD1bJ<3Y7`Vys5!py4aZv>$=Fi#%Zo?8~bICU*7}DuROn2pV7oCu3#6|Uo_S7 zgQ-$t1AM|K9I8Hg0pF)86pB|A*c)S{I>R{4Ml7O8aN%vMWUDg<`X+d70aJx&DvPzs zMRvyYj&@-yJyJ5y&hdA^G3ztU+^ImHK=15(m+U)0td2kCUDUXYjCx|$ky2V^?eWXP z2$X(Clz?LJ3ykD@`KYDL;HJ~>f%mv2jlmK0Ulm1{m=zaYogVqAGNC2i43NOMxjP$* zbp!?@6MJZ3V0KegcomB|L@XcT_^aB^)OJqjb?5q7eDyI}a6gBNbr9;E!F7fi+m&%&ThKZOkRfZcK78?w zRJ%>j?2HkK;ov7DpB>&e^^ICvWyq3}#xNnWv-@;))MNq`0+(e&NgDISrou#A;s(~# zb9wzEY~BmRQ+2yp%$b-e3UHU_58w9n-Kfb$%!jryp_r?sE)ASf<*4U0wt3bUTe_>I zk^njmy_GIj3~Bz`Y4tx2Uva9G8pf<2z_O>h7Iqv2)J3<{4TnupAs+sT7z*6D=^I5i z-WY_FiH?T{FVAm5&jyV!r@teNM}HldSeHm=?i!cyGKAdD{K4d;ZNgMZK>8_xKCew7m1 z@hIM0lfJ$+Tjng9cydezwd(UbE^x>l#m_@gvU)E;=b-ER9|efZ>02EaQP|7FSVC;G z#y6T%SZQhtuC#eVZ)D4B`u3iwnn%WF;!1O?vlPh>cYTGWvh+!_+5qn4Kh~=RiQKx4>Mi-xS^)+6RSRZl#uqb@^#(vYd;evWe%^Dj zvQFdvA&oGDqkC&aI@Ta9)y#oyj~;08_21do0~rVRs`grnfL`$vD@p>{pg4 zPqL-x)zc03GNU6V@87n)F-Sz&ZTW~dMdZ9pDJD)91iOkcWo2WgkGyK~h;1KHlAhvS zKv{py7mH#!Q*1V#pCp-1D;1bQw2o|JXx}CMe|oj7PQQQs&CfUdU8kX_h@G{T8~Cnj z*V@w6N3MV2E5EotG{aMqSG@}KmByo_w1yCW%~?~)6|oN}54z68V|Sx$9D<&cHWa5s z#T~x9(8SPl6hkymWf}<6&;Kq^09%uSkt8JKxJ8kL6Y){ENhu`lHquta<+SZ^wJ(VA z7JgWmn+x6%blp4_6x;KKp0}7mI*pDWiLq#^9f zixX@3LeEms$aff=`C)ub#;2gI{h#s4D<0KOB`L_u@d^f6DwcN$Iw%j(^Y_^~gayG+ z%G#}OUitVgSsXa6KqA4af{MB}04J)I&+Qk7&a-J?Vc}!fd3Szljcn*-Q44xeB460; zPc+QBX~zFce>=(9zk|4Q3;4mB+1Bb_v0&kGm+IxJQwk{ETKg#C zhPCh#3+vH{$h-Pe@bj1&{>thrB_I?(Dfj@hST*&=D=0tOa3RB=hIr*HI$-c4V!PhGHIuEXr+8UMFA4h3*8+9zugeA4Zb zK$)@L8q+NuIYL^%q~dLM2=llsO%UspY%|MsR*%0WR8}+6=U%ROAQzaQ-8XT6Qf2vH znce^N)B(jwl>et8^V_?}p`n@u`a4z5iF;g+#r7J+g=O@S(p2P@RRQoqvUD4^MH*yS z0OZy`V}Lem>f}>Z{>))@x;gx1=KsG>P2=5vd}`J6&u~qsDy=%G0Kd`5qh_8PS{}#Z z^wbR?5`Qn4!=i}#kaxM&Ds}`o7nn;XwjiKCE*moPQ7njB%3^;H!B4guthZz#&i7Zq z9D^j`W(}=d!$KhSmvL#<3JT@53m4F#!o%?z=NmRMucW6^fmQg8)_0c&B zs8uOSiVaE;I{715jV*5bil9s&cI!aYb0zhp0bN;7>pp28Nn>9go3@?+q^JBUzUnLd zc#8y`+OX$)$+>e~*r}ir$_qsj%*I!vpb3U?@6DHC^DC6i$#XSFqwlNai6Rkv#dy|9 zLHHn3qo;mV+h+Hej3Zy~h{SP&XhMy=a&N^5@(HLui+Mky)_H8TLFKkD2qfJ$o+n+5 z;C&$S+iP~kWKzYohD= zLMO#zws)h#>XZZV-SCFP!axX^4fYc}d=do8vBi5t3tZ@hXx|jr-yXuH9K`OZX$Z@Z z{%|t#kAG6U`mcWy+t%;@f=KlNh%|pa`TqqXO_vn?+2GE^U6SHLyipZ!SnB2^6^-mj z<_()8y^n!`e2}7VeDNg^V#dVe9r81CvG`nn1@<{oC30x@sF>rT4G&V**SJqYsHW`@ zcibPPb>ZpZxcwF~V7qo7I8UTJ-B^I;A3SK#Kc+`q);1rW6uJeWI2@1X>{mviK(bi& zZ|Bb|zMEv@;0B_;t{8G&@4rwt!bfCCSs=X(Z9!DHcXlz9HR9yhaBu=kjC%w<7w;e> ze3kXJZzYwUy7VU%A=e;Y^dq^Tc#IiSm;*H> z;*Lb=(DNZrksYVj=%*y9ibq z**aOf?Vnh&jOKE7W)k5Me!P9@4N2)c4o%pA0S=fJ6+174w)Kxa?!-dJ+rCX*Zep;2 z2{EyYXxrpJ)sfo^ZOPrKv7iB^J<45j_*K207)r0{<$a6{)Q5a_zdW23=t2n^SBn-P zcfOk;@6HjlD9^T`B_r3;+{#_k;O=m^u)uSrmG%2m#Nzh$7NqKuQwFjFsiha#Y{r5A z!`}H-yeO>qf7(0mFuTVR5r0M6J88tw|K=&pc0By>UzAujsz~BjCa_4qe*vu5-L^vH zT|n|VXX=Cm@vEhy&fZejf3WBv5N|6)!Kb5UU!s@3zu$51>nA6HnAq4Y#Y{Bi_wRU` zby-iZ-~NN6@H6H4VALWADTdeR=2pKRx%>2g+4r2yc|Is+F3ct<_;Nc7#pA*+FLFH8 zS;DpRs}JzFQPDmTd9hzD?2$l}@Xf#vpL7QJhld7xO_S&JAkZP)RuXf;L;%7&1#okG z#Zm;12F{NtC6wOV(xWk?&@FQb`SdCYDMjdB;*;R>n_?#;wbZUT2M7PPmm1oO4ni?o zh2N6*2)h5$x)D$0jzySY_?l0;P}MrGwx-B%)r~X_fZIlS9r9$ zkW_&1kF*dN%>WI7X*MC|>;z#VBVO%&aTOJduJhUlz9@&QV?wF!wuu%Y%mtB;*)CP0 z-EJDE6%^Q1hL(j!!c11!r%V@edklgC@zlB-q$l#C5*z)Te2iS@Foh&s@(V8> zOsrY(0L*pA=@iJNapG-H(Xdqa|Mo*uGs6*g)uOCg`{Xc(5bIvK{`enjr}hTJEpvKk z4*xs1vFM%G*B4DI&R)z4LH*ktANpK=a(lqR-8&e-QFDxV>=|T)a$D}c2C_HxCU*d2 z*e@;)T+2lP(Lm4WI)Y86Per!SkkLFiG+3zq54V5-$5J=83(ijaAB^tz=_~ZZZGNb6 zJ70{KPaAsfxIL6@;S6D%SUU+>I+neJF0bgBnMUVKtu0M$bK-EN?Hykht(Y!lTu#?5 zJZq*&t#K5JV?H}Q^#r8^7=Aw9iodz8F`~B$QNtyV+wc4M5~7Ub^wZ9H?4NZfIKO>e zL*hlghTPNSF^me7-=dXW$nH%SpH8aw*2w0Mo$=$kTKnM-4p8)kXY{^r!z~QoLfzv; zD;=*P)5{x&9#&WW{p0=^b>LJW<>COJ>d{vUT9l@Le*5sd$4@BBUzyu~+fLHMn@OBr4j3Xd51gr{Y8W)V1QzxnF|VD5-1-!~ zpzEcj$pyDH0(_Mz6!&tM>BS9evz0^zpQ-{Wn^l@}N#W?^r`7jdQyIbUP&lCxeM>%` zn%IpvAgw#|m&}H(BkH1X(&I#|T+`u!=yS@8U&5ON-K2_?T1yf7h2gPC?V=#v)gI{rS@#S zQ|XUug#1upz2n#+RUNnVtD?qGs@el|gcX^l-&3h?S7N`3a?pKOKN!b#UP)@aRx=Fs zO1hO)G~NHo1|^t>iPx~EQ(!venwP|@S^Aq0+!PyOU-xfi06=`DkK}ReZrRA+NKOZC z-Y+`reOna#0np${fTEUFmChgJt_@ccB8|17*bo09F`Qt(!K-9Yl9@9~4}F5Becs@9jFy(AL_NtYN+A z4=3iP%Ts&(T3M^Tz4ym&M5BMSTXEHxF<&BAEC40vdEfTs#=9JUx)PF-T8cka*WiWV z6XQ^_dGg{ZF+j&h%{*}T;=F5*kJR3T5fMU_C&??5<7V4*M!#JAt1=48xrFWI+@uqU zxO5gmrLIbsV=rq_#k{r>C}uJPqV7-|UaYHRSD?5oHf8fn^|SFMeEX_Isihl+m&9~) z&vh|VKK^=Jha=gjf3P<_GC#Y%x_C9fIE&0x&<%RW$Y?ziM>$j$lxXmJyXbC=I}Xmy ze)oob7TMW@T&1dI5AKu8$ub=;sH*KG#G!vK^u;c7EX*|D7g>m|C31Kw9(*Bqiwde-MecZ>RA%XE zeN8tOenxCA{<>MPhtf+5F19fSi6L5j&c|capkH(wYrAnK^do0LE9Y#HS=GN6x{XhT za*A>2`amNP7BsTDe?KcT~zEyNMr_e-u$h8lT;h!pfGX;tUu=r8MQ}Rt5Fjnpu05p| zP=IXR)|6Kv^n-dU75uf6&42ztoqkI{2R{B0eIbWX(zIa&+E$;7vDfib-URU1tSTG*?qTkofmFA%64&F z-EPvgzI%S)&{A^?7JOPywcRE5=#xdq0dp{fWDu1`*QKutgVqw_4J6{ z5uf(E>+0s>LL6w&NXWc!Y?6lNBDO^))RMjbu^uxOT3p&xTAjgc49?xYI^N)cmRekS z5_7QqSvb1U?oqGtc%pzzjn+861__|*&z`8)+m^%gHE@+n1r{eOP0PZj4(105mWGFKeEL;Ys?M04@=w<(v`?bB+~Y=T98)*a zuI~F#3YKCc*ahP9hV0ae9!3XEG`-T=dolB3-O7r)Rbjr=i-et%C;({PeeZhN;5o~Tu z3;jA&m(l@J`bVGKDh{{B!t$iXIEWNK>_Werag(OCB?1Ya;?089m+>;W?g9_y=|X&V z)o>>0&pNnd;33;KtYh(eEhu78kz&%Iu))?w9I5;%OAe$S`R1irvMlN<6sS}W7htNA|qzxWolAn zmjKLLb!VgdIx%(B49DGqOenft_l`8=4guwEU$mXp##wm%g1)C>A~_{x_AHa~#pX-aZpyFs@GR!8YW|sub6uY>_)U{q^BC64LO!S!IGw zYcgxmp$FsBTA8W)wL?tucryk-7Dof76EsxmY{U~vFd=O5YriYxu~D^lEv9$Up;NH- zz<(_-|c5i@Evv*{iX(gz;gx%>0C_I8!K_ zouei87er9AR6tH{_77g(%^neW-_fK)=i!&%-Cpso{@VHI%9=WktBvRoXucip+?t&z z9QXrVn*s852VGToC{ZGF1(3|hpt=|HVcehGURfY6s>)g+#=ah^(0quPjAI4%Z4hRr z#zNZ&!SD7C6U$u?xSmOkD1jOy zor91OXV6FaZC@MJId|Fb{Qz8G-i`1&Vt$7y4N6V|1tt7*fvzh_D#kqbqm+$g@*-dY zcBuY$UB=^og_9tIHeo$Iu;*&lsQ(KR-(k;;*G1IMN-vY*Du5581u>iM$noN3w-oM% z%GZQg40ydUHx`J7q2FH-n-uqA^a)Df+1l0ui4n^c25xCpO`Zi_n2NqFVKQEL`mP%T z!aH!?kdGc7L;vx@PQ0tu5VQh8iwFs=3n0)#MS@9{4JHOn>j>cJcPWV}$69)Nf;8m8 zP=#9W7G`QUfW$@P)!&&NNz_31{S18xSk->%SzJ_qth(yAPC)$dq5IaVOi_^^#L7!} za=BzAB&-Y}JozDT@U`lWxR&5rI*{47UgbZ~q>)dE+i7|w=UdT+aurpm1Ut8zjzZ`Po4AjJ>nl`JJ z`2}xbk>CGeMYDVd4zEPV*BA(jSPhjgGPadZmr`?{R29$Z&KjU{-noLksy@xH-%ACF zBw%9NSN;+A=ueNZCCg*fCl=+M&7SkGGP;IsbLdl6=hp>)nCMwfHm>K`^*_kMDK8Df zpab*&NRG2R;x4Z;m6mU?lB#ohr57|KBHfq|!@`%H{Jtd~XKDdnoe-jLWGdX%Rt$tB zczD32q18TazYGy?3e4GKvmmHg$z4NY`VkwABY5b1y#^CMhS!9QmMZ za43O=zpQ=YU)_3Z9^+^~6K!iW;E^12HAZZR6uGz%t4N*L(@*RqVml%_}L zpsGd5Ds)aSbvTRXU?C_t?7mDdO*!-v>4=C`{oVKGk<`L@g;J1s!dz<%pk4{>Tv|OlQh2HNYISja1(JG>XQhtmkmFux4azmY zG?e=0aqVXh8)>q7%#;Q!;DH-3CS@{RH8n+hI;FZNH<3d&Xsdm0w(0G6UiX>UFw)@_ z+B_LB@0QDH8_|sCVFKN1-f*HtiWv#6EF}-UGEpup#E|NogAh2R%q?=*%MvOD#LA>V zQbXn1N(+YKCdQMbmA8$&_6s{ycaqu~AGaR~zB?^z@opUmBq6`gAp5wF&QxEKL0cm% z#i|kp#k0FKwQ;O}Y(`nd(PI(;6Qb)5&Ic$_8|J@87$*y;AR>ES!H*obTO`|1z}0&m z_%3E$uRz~|68>w+A%p9%O-GYj_cFSVed_+|bM?}-?^@3F++NI9&z+Bb_dTh=voU*R z1n7j~e_Yxb+v#Mq>m4|O`$!543+44+TXKoOj7wYup%lofNzEFg4Z*?$@jru!%M-eR zbFYyP2Q}$mj+E@XgK7?@I)li9Is;F`>87iRo8!h`+>}GgdTP~Txpl|mh~95;Ezhm2 zw2X|3%A3ZOZ892ECn~CbM#%YplY9CGq;==~xzYjQ;IdzX^x?1!xJ5pQsVK;JJNmK$ z_0FALd!9w;iNluQUik%3H!nnjbf`=gIjjH-@GfUk#@AU6;YmmbT(%7)e&6ZuEo1Dx zl_clDYUB{Ia{%{8B?wQc_$hQ6d7mqwT2!%X74Q#t&TGfK#_(!xz=>4%a;$ zqJa4T3#lFnyqEXbM8QD!$a#9H{FiPeW%`ss z0y1k@;~rKg`d{~PK$J~3?{c*U!JSZ}mir?YN&q0Ms)=<|7^_ucJj69ly&&}tM851E zKR7C(^ajRBs!@ePhaAQ5#6QmIpT2Fqm&AZ|;*x8FWxZ8aaX|d++r#qgK9+U0#Ba;S zv0ckt)YXnkl>~4h$88BRP$jFWd9=l|ISz#{6|{tBjap_JS}a*r*Cc*PLs z)xk1nq_)m@@?!SNIjE4yd5Au9@(6GO>V}T=-4=Tz^pEieGHzaiP~#trhGby+n>&TEO;N;Kzd2eTB!P86t@q-+qQ!1~rDxu7D|4t6>K)7> zH+>Q7QOojt9j7SyB?{+*&r<9x0?+H0|I5I;I_1Tr;JrOvwf3vX1FCkA8!ew}fEX(G zP4(qr1O3)kDiA58&+TR=-=C{@j29Z-Q{+p$IuQYuJ zn2+Mr-S}#&vC6xRhIlZ-`{qo{Jg7*(-w0JF(M`?cw$MZ`i)qIm(&V2V1m9fvKieB@ zZcUaE8$BY-yD_3)qEa9c?Y8pBsr1YWzK`hIs0SFfyVgdzW!F_E25Xf{H4gvUbN5+o z^iRBhbIXqOfG#f^Fxv~CqtSqJ9Xen4_7uuJmK@;(H>Y6m{RWQI$k!uu*u6TD$+N16?B@hsNm%- zYgpaAzh-7`Zd!gLD%TFg;MR3ks#XeH)sAGf`L{u8m)(X{C@NZaL+_y0&l6&R5XS+t z`iGe%MNKhfUKAcFw?5l%JLgZ8kMM80_k<&=%YQt#bhC5s5~_%x)C>x_;T)|hE8{xN z?nu%1kXGIz_Zl;($=Bh7x&gBBPvXi~yC|_8D#)7TYF%>Vf!P-naqd*Yr89%;mHglz zipUK=tjPl+Zy(PY@RJE^~KTO|IedQvv~wm30f7D^Tg9kPDVpdW>x^lVy@Zo8NH07U8-h|vDNo28e;${NFnH@MQtkM(HOVQijpZ}Q(y3Th%cZ6oW z#lQjf+_I;BfWZKh`USBfcPhBTrb7&ZvZo&15=y{AOq>M_v&7oZ()iOm(b7>sUN(j{ zjpkzg6i|!fz6P)@KsZ$E1W*C%`qxk0`+EZ@HcUTuabE}_z|=hW%wMa=DDxku?RVsa zsCUxRpyd2<-z!zSTU+4?VzhYhym|PKlW>Z|hP7ogK}IZ4R&t$GZ7Ldee^BhZipO24 zE}Qvkolf88Nd~+A5CU{l+3KVUv8cnqVEp}C6g=B6?k_c&`ThSw>%(R zJ^#QeT3wV3UIl1xh@X8*Cu*EYaQP%UExfU2FmiQETvx0JcA+Z8D7b&`!e7qz3ng1O z{QPvxedO_jsx^?M%A|mo90w*$KHfvB69wLnG;sR$^9gDnc~C%L&Pk6(V^WmYK!VV) zV{>IJWFLwPqfIH7Orf!G#)iF2}r*&V8Y%UC((=ak{9Vk|^ zbb$Knqr^|BGCh^?`DBR5uxGzjiJd(Nl+_?0Bwp_Q@%_ADKh-qV=H?xQE$aDQRO-1D zFW=xu`}%zE(ZV>{UmtCb!Se+88_{Ch5s3^2FnlRbhGO!y?N93b!o=zKh9g-BxErGZjX5|6ru}Ia4+|` zfnY-2pKBf8by$t@{n=9Tbxg)P6o00MxmIQ0GA)s!5#tVWw zJTrI~3VLAmJ#(h)Y$C@KiFIkaE}5%9+*prv_k3jqO2ht?1<)r@8<}R*&OyC4j>}=f z#oozNJ)^t(@TtrWK#e6UW~P=`AMz8SQ5#NF_^^9Skupz(GNYHBdTN@BhOvVHPX(1@RqZHd0+a0O+tK7Ix6=@55@ zg1|_j>#=hF!Iy|<%t+I#Bz-}m5>a7Bddg36R*p{Y5xty-2M!T{_cspkdjsd{MNh=d z8hX4pm^lh{&yI46Gz}bQuDIEC@xq+F@a+;g!Wkkj>;Z{KX~9RNoJNX_E#ofYa#G@F zEct_xm>0P%6K>-}&3P+aL(NPiKxHkfyYm6;x5X(74OiJU4jThvW>JMU8)a`+3BW9! z95L`dTb95{{IjS~`3giuWzc7Lwb%eUa$U%APbq4HV}zxbm)@r;?eu*=KN$!MQV%2c zt6Ksht(chg_IHD8A04Y-k6TxWXGIBFndgYvnes!11x%yy1F4$#!7X8)D~+YY-}KtC z^{PixBMQnphl>sogg+Q@qegTTf2^2s@zX{{bs%1tNQ|&()l&+!dhdbmY*Djlu~NSE z4tLzLV1p5Ca49jslMQ;p3Gl_C5rax%aoaET)7ogrwjFn>^5~BJBe;CVKHl^V9V_c$ zdSqfBS@)abDm3IZueZ2k_ise}i+>~He|-SahUMwhI?1OGKgyz@yo%ye8r($AD)jyP zan{R`i7+D>-bYNje=%VNc&R)tU0HT2+3wI#^o8Ex!TD*2$9(=4yG%nBWq43d-OST; z)w0}!{tXq^r5W!xB1KVbWWzRm%S%CZ=Q*E0`;!zk{XMTpfYU>dV6MyJ2pgd#b&Y`R6Q_5%^PlWWeLZv(<%<MZEWktj}a#gA54(lD`}7Rr0IJ1RMHP48~e9 zu@g#3ZgcL%F1!eS1CJ_`#AHA?>rhcsWK72e+e)`mP>W^s!J&Who8*J(8%^cl!S^fn z{Xh{QC!X$1jopTx6#jAPftlSj{D}EX8f%OQm_bhg5wFh)Rq4lDnV45QFWC0ew)0ks zLEx;`LuBCW{dQP6MpU+H_9a@WpJqU+dMd#?Xwt4Al~;YlX>tzm+6X3^np8lG$;1Fo z*a&_ki9mHv%*L>6HL7?=H>-TiM&R^Jd(k3jCk5*f>5GxzRHZtYp*PTXo1%l5n|->x zE;u03=$nm#E(0{>Z1=nI@Mu|k=+`m1OMz^+D#$q^_TT#PqX4L5udnYT42sLA9Q_{~ zeosv7L{Aq<1yDBiz_s7WbqU8=UgEC}C160bqgLuroW_)CKcXK-)S;^>QGZb|1<$`3 z3!lhE{@E#}c*AKE4_Ddh$L5wX%xX{5*a&oEs!8QFyNiT_BYUaU^XvjvnjX6sU#`c9 z4L)q1Gjnv(^4Cc%XwLMb#y#p@u1!A5KF^{oH6GM;mW@jO-0zuqFkon7JzcT$T32_o z@xw~F_I3cAz{LymbE<}W9B5SUF5U;s2*ZW>Ue(_ii1v3}%gYI&n;?|Pd1vxYkT}V( zz1GGX0&Gw^GEj?eP$hxVF?4KyVN)ywThLddoRRRf_mFvYm2f zh0JGp{@n4#;o1UnsNPj0q#p$33LR@6Z(k5-8w(Xe;-*2{6hTg{xT?yg!`F#s6C;{1 zqwzX|Kd}O@E32%`v&Hil2kwumYumBXr46L_hB~|Bg&Uyu)=9rL%HAM6Tfm!14qTEG zHP5O*1)nObWBB0dK}^uJiw%XcN8iz_{2@ZZvr?-PUZC=ud|QD24pb( zT+TbE-rbV89-yII@!R436)-7Vn0KIjmU751VEvi?6btJ%b!#G*)$&?FBG7dKi5DJH zT(f+&u_u=%E&oOK>3sxypNEA-$D`cFw9=Usk;BDhQi*3D-F~&`VM$`Q_vOKfc~ND(k3e8~xp+fPhGeq=clTNQXgp zqoj0q=dGxyba#n#cZYO$cXxO5ZJzh}-m}j6B=CN8F-5L0oQX+%u4Kuyr1^3ikwJm2FAwJR1p6|@KVZ{NV#tl*qEL#M`Q6J_m z7lIGG(0t1CEd@eA4=I6P)s;V?oTcR~dHUS&%nlSB6C-fgMh~VS-Hi+fIeFk2j0ZLD zUTsbq(-|URjQrq#$lLfTEQR!6-@0zU7!J$ThQ569LOqWh7S$(BuAK+-s7FR)Xy>?F zOK#KS@*BLzl2|@q<2iY!wD!jZhnKo%5W(5bAAKYPT};#Yw(rOMZLX{Tw?$V(-)Su$ z3>^Q9*!h+TOIlpAYa#|~0jzTXdw2a$HAUUvVTq}1UEfkSBLYR2$)9b+l67=f4Uiq!%J{KdK_U7bFs{D|nai=sSA6xf4P{%~J6wu8_8(7wQHEDWLA0|GfX*eSh#_x@ot`1d1! zhTU@>Y_QB=h3S-T_wMP#xPy0srCrF4pxtH(S1DK3zDB=|Hr+y!1xdF@fD--kVP*Tp zvc0wr;6%&7oN}mtqECAmuzRGaX|D#30(ah4B?@D_$fePY-w-&vHB!`a5? zT<>+rU!%O>em#vV?3@s0c9bdcC7Fq_UV)cSeG9ety5>B+Dq5H%SW*X(O zA?x0GpVbRcWV3tU!;pRuMTbno;RsKEe~tc1k?F!^IWAQdds#9w#8e&gF=w>;qg9%D zx>KsOd7a1T2)pC)@858WN7_&DM6A&15Fa7-u)?F}$@_b@fBufznXa5azA18F1DjX- zeb3`f1-+R2m7F{K=3v75`pvz4CX17}B#+VeT%`y+XHM>*0W(HrOK+A-ncpaBpbES>c8hmP8N!eYY^PP#d zxbt*$bj2kls9+-<(d51a^fBge@pA(7dStX?)e^={uNBq0i+r%nlJm~}aW`-EwR3UC ze6j@W%NOg0Gd!rw8G0`!E2(c7cR&S`XUN)A_4*4B8~UF6$H@uH02^PMz6UQFik4z5 zQZ5DK4_!A-j1aBRBD!wZB>$lzDsl6kUg}s-@uFuULwLZ;PI|Gwog@>mH44vJNlc6tAI+MHJ{z2#_t-KO$Ur!r^{r z1F4uWE1OBqj0i#-laM?e9*dlJRQq2_MLN7`?>o)n^%upc9hQb~(Fl;Uj7}Ee2?;)V zdD0FAj8za*Rm-F=&>Kd&yC{?mFACNL12Ji z4k6qY80Kxo@qg}-BtjU_>^@yoP5(|qS(r)!(JR0MO|e7Cj&6^wdMdv|k+OjyM* ztB$^i*(C9&4{G`3G#~4(mGOFGWmZ%WdE8z?IP=*Vd!I#irR?!Y&bd6~i@jUKfl{ zufK#;5qw(jSx@8-VdmNnA~`>?*F)%e_LJeYs9oKi4;gM4jXN2ZyBFiF|F?Sq@xDwN zN=`%Xh;*dJi(g6~<;o2fnKbKW+S;xLtrF&wZii5h8@_A`ZG5DU`=s;ge#i7U=#Mx? z<8_G+`sUG3tIGmaRnu5=t!-|IfaapmP^Wz{njV{@8!Isc`o$4%%CG$t!;+ z?w}e@cqe-{&`Zj{6jR5ix-8m0o}u-O$=aK#mrUx~3vI)(Y%#>gMqhAzW-!HmdAvv; z zr{TzgZk_h_%8HS>v3DnRYO&+;*XcZ`gU0)ltt+85D(3t-IUzo!-NiiRDzlt2>X5-P zWd}@Bs8MCNd2eb+PhUgNNVKc!4?kokr}KuDlXHy27fXF{YBgQdr)H{PFge3Q04g3M z@4h%Sa-U0@4b8f4Ra<}aMtio-Qy^a}KYQRc*Jf`&gGxT?S?>CmpbQ}h=K~H7UYWD- zZW;!}tP;_=n*DWHY-9_HnK{%9329=bIyF9QcxA)ku7}#NmryPG>T*j9yWh#P*_V|Y zNw}Z@Ho$0RU~7wIEvab5=Z>n#7vodZGeG9KWyVrwVq^wtF^6GcLupw>FnDU1UyZM` zk`fgd`|j7XR?%^RF*EaFUhi+jxpDJYxPs67$3J+X?DDtR9qB-_-N

x2B3e!2L8oBnl`QR43nvT}U;tNmm0CxsUmQq{X!3gG zSi84ZCbCK>(kLj+vjLD|NnE{IsPZXQHYG@|1s!yDkmaX}+SV)ry^WUT)V8=`#IlYv zCrmUNT=#;G%z$k#h@#^MwL2NFJGHtXweiSPg*5sUN~wkyVOX@*ixk5p%VHwVJ9yeQ zFOR3na%3%MZF{$lR@bJcj%qYNW}TP}x0O3LD3IRpb{e2VySE5a*T~SoHu1-Tmjl)v ze{(Q-z!9W3)k*_*OPQEGs(N|l4AY$z?Nb^DLCR^@jIW@txAzB_t6x)^kynyoN$jq{ zHyXUye1rH7vY0Ck#SlGnFP58!k)$k7&&>4Xki<`2T|K|{7U{P9&`<!*7w&WR1J1W+)p}bVx7TUQIqTO4&{X(z1xwqIKTTrXC*{y1g$V%n( zRqcAA_?QRk>RXp~G2(?65bo=Xd6@LqpYYX9p|(GM_D&67SOGMEm4+)Jg&-RdhHusP%!?F z`k1PgAOyKBAWQq$Ht~-}YR))=^gMrOqHhzKxQhz~PbxNJZf@?bA-aYJDlu`5Va}PF zs%B<3lg>$}zlLmNH}H9Hg3g|My<872D+>r4ib&i*ENk!T$`0uH*EuFzzEJmF=hfwc zojq=qzSR%Ktn%{mqLQe|iPEC-a$EcJP{zH;@&o420GOy%I4f3HRsp#u|DW-3%{n)g zkvFBnE+ZzWsI)%y^(UJ7Wsbx#KB;+@-7jANSn}w9JQ2UJ`t4=E_g$)G@W9ha9vXu? zeRizIo2sIo${51nf6DLAda;GJ9UXbK613HfO$IpMaOU4F@Mo=%)3kmDO6pl#$ zX)7tW-{_a-iY{iXohjb|)2wkj?HUDZb~VYkcRG9g--GY6vgr^8OiYT4%d3ZGHg@Lz zwWZ6nw*J{4Z$<17m-3O&{k3zYH$Vb_(N21Ux?u)=FX|J#q4oAxIxuyD3TLoK40^BM zhJq}%zV;V-gdS*=Smb$~{HF<5tw6ip?ezDjUH8*1{0P7H%`jhZPv9%>;ma~NZ~EfW z8P_bcH9g!=#TAE#Q2&QOv*ET`&hsrZh?~0%^TZiJ-tCZ`cAnjc-ff-F@t5xVr*Ht4 zV9)N>?`hLX1;d5ExRW7v2ztR!EB7^bLo%=MkW?kkAGfX<)UUXNT5D>P8Q(q z?cMR!3af2m&Eo(ksD$0gHa=>8`#LN>zLTWd$A>gE&NXA`;}Tl3s>UMWlO}yp(T~LF z$tfxHMvYG(5N9~_Xf?B$PzM;@xCuK2tNUl0lQ_C1WlKEoR*A^NPPBCw+mDZ=1q_sR zi%V~dUO#~5h>#d!jthzCQ>6+DDPs$Z(WCx}n%j%aL;o}w9Rn-7%v?`_c1jh+qoHPZ zY&MQT&~e!M)Jz6-c`Pd9D|qElz5{y)k^M z`}t$)zvP?(*uju}o9f>F{kl*mDi*Lw{PA4qW;E&oh550dsTcJZ#GWvOO5am5? zkH>&dC)#BOhpSTH3W?nA&?G73P5;n~R7+r9YHZRo4w|RY-WW}AKto|( z#b){z1coA7@3k-&T5v)cT`w=nT*85O>yqpn%CIoA(2es@3JZCvqa3TM8vcg!%|U8Z zkdC~KoUFbGJ%D#5)XmoGw~r?GcXvozKGqO$W}RQ$@pB#82HqDsxl1ZOl}=y-;R11E zOg}kQGGPAT?lIY+w8EWfH0NNA`^9uO32bCs%kKQZcq$>_3{u}lOCFT(&mQR5$ozA& z^N%VK1ZVb_Y%daXsw!O}x~_hLSI1zmuUH5zY;dU5;Te6FqVHps1cNZ|4ayaZ!I0YAIRE`uyMt0VedI zSbXti#s5wXV8W@k^nd_N@WKwL#O{T|z>9-{)6^k)gPu*^C{&3FOu7w>QX7h=GYbk7mt_&U8fD6HS~6Jb5Q zf*p{YmLtlJ;HS;)22`K*?AvE;|2_-AtW@Asj;CbWz1_qoYHq345nlg+ zqJI%~dEWBP1r?PK%MJ;yxVpEvYHelnNzzO>;}J6@LJ|ml9}vTIgpE;j1Zr<$!qu{8 zZV~8Er(y`1Z(I_~MD~KxCiP9{S)#>9+68V&YP1=;`h^6KcuNYB)oHO;do4$Tf}S^c zZlj3y{YJOr>6O`ie|Gx&=$JA)!$$d68(|2-+SOW-05F1XGPFqSEFJ@!Uf~y$9o3ivr(VQt?u>ZM@Uwd`OCkyr`N+gzPYx&9$Z^ifAAdb z?5b9|Q*7)k**D_ih#~$VnytLaA}F%;)@5a&04S60!U}Z6Alg7S&>O2;G@*D~V zvWHVb@Q{+5o=i8xm_8jW=I1eT2fU7H`7%okoow;B9Rx3uNXSeI*^hxy!_+jdK5}D# zVHR2HNwZ77ScY|neOypF*w5TMPY5rOsyPtU=cW~K%_$qjGz=V#VlH)|>|@@w;*rga zufx2W0)u5BfmG1~&1)V|0ZeKz)*ykWQ0e=;uSOJ?p7`vX_oNXy0JA0+kZr}G!%(dU zZ;AYierYMyEIV?pLu5$m{#4bEPxgK~L$6k>#b!%Q1l#5JyIkeZ_%xWcEt=Vq%0b^w zJ&+>LJ^Q=FVFy$0jNcFpFg)r`^rJZ|E3-UD$ONG#s?^qane9l9PLSNT|9I91OQvTb z0t^HG>T?L~+G~~9O)Jm3T^FKkh__$*VEB<2?%y*Lv(Jn~F$vnm?v9i0XNLTRppv$m zK?3ngjR*E&>0Rf?`9Q56v6Jdgh8oyVR2(sX9Rhvr$VjHMlQ}j8%YL}D5q5HIE}RPG zz5dRL^Rb;hY-J^RNsk`xXXrZXh6O!&Hi2vu_}n_hPCgqYOI(N-{c_`J zA2voiN#d0)M@h0O)mwbTs-NAClw>Gw{&2f+s8_ZnbBwBt4eP=ePAKn^eTh2ImofZ3 zl!IT;ox$;AJOpzR_GrnMG_D=Q^3p*NSN#`Ryd4iXi6!&kLDobO|V-`dB z?HrrCJFP91{ROfEa~CRz?!%aFudGh+qVncM(I5q}X)3*o!IK2Y!gBYW+hc?$M5LU% zF(D2TpR?<=aL(CipqD|!;!hFh-iiXu931`Z0OqGygJL1``G3aLrqC9^4R8? z#Mw+A8QRl5{7?=C;DCRbkLSZG0U9qeSNmd4{V#;#?Sp&1+ZVPIeTBnd95iHq30YVe zR9{I!@!|QsGAIz1UBsH++k%aDm;>hCzstiK?<$YW=kUg4v2IB}SgEOgh0R=C%IEhm zX}^TS^NI}Uz;vFzR_!qh8XD#CP}zHoOE=*muINDR+Wi{qa{ zMzE2mL&YL$E-^m#f87^!Yf6dDtYc+m#ST8t953X0xit#T=JFbKVservYbH0>l7WRl zSuH~S<45p=yUJBsNXSwgfo#6s5Fg^xm~P?#W45(R_DGMZ;bI6rE?v3powxUQDhVQryxNE13clkF5! z1X7Z6Dx=0nC^~t0Q-&lr-}@PjCaA&gpIO)Jw>sl#C5&*uJNjt^OL49?s{Te8F=I@8 zMo{ePT)vrd0vn*x<3`LBK;fsMdqh{@Mm6WDr~YWXhc`6$b%5P!Fqw}!qP&83$LqS( zFbrMn?(2FCJp9%9p6_#<)Oe4O3msAral0Ov{; zD#t46-??8#LBI<$A4O$kl*^~=;1fCOj!SeV)>Mdn{Z`|<;{S=#EL#$+0-X7~{zW+M zjU`^7rJPY3v~Z75>2X=?qlreravptY;HKcW-f-Rjoe}EsTyISk8-np4k7vEIY8SZ} zoSTajQcG*)3A#8%Sy)=L&no_A{Qg}tEMCy{gMVcu(QrD(dfj+>z$S8O9H^MTIt}%FNxJt*bq%I{Rb+6dD*Au}SIKxU`(J z@sYN-*?{=mT?Z$Z<-phw%VChauXSeVRk2I+%$(f?rBmmk28ZhQRD6p2nhjVaNlU;Z z9t$^)je#&L5L=H5-9HTE;NUDp8YXzla-2ZqtyScN4Uc*$Bx{$y$zeQO7!XUz+!Vwf zLu%T9e$4L4-wgZauunQv$Ms;115_t_PkM&>OMUnXv`i_(LZsKI?atZ1KZUnv;oLI$beLWfa;y$R-Rf?MwhZ=QxKLNKD=T+AuKW! z{UM{C^K!=08ZB!eS-B}7Y+$Ta*By)UBZS0x3RRfiePmL|%vP>KRMT~xcc%QT!{4Jx z{xThVXIfv-*DI9n`^ct)Lo~x{!YgbyX*`)B#OcyKHwBrt6c;j98qDO(WZ@Y2*QXaLsHxgzpLX(mMB_IxN1lFj_QrDO8Dr>w zJ@qwUo+5wdrwsPIj3QWPUFN^r?35C`eUhF`L6a>4FU<2J)K{<~tJj{ZhXAkH6pp`( zf9v9;N&snj%BZf9K^NO2t;h3@$2*TG?oU1!bu3-(55dcswIMU+h{NRxwBd4VEll0B zYd`Hc&`RVNhmA;0&UE3n+qF9HZElfUUJ`|9QxxUbuv)`%4-;NnD0NE9`x#Pu+@=F_ z*dC0s4fj78Iry15OdA9NMl;fn8zDoM8c`iseb2q_OL+So|6b28omV#A&ybMibMgvH zlpy)?)6D#8s8M2-*T}*_#ZaWPYN7OiBKmiA0wIAc-xa(5QQ2Gceg8MxejF`G5c&9jz()*BSt0Da~JUQPi zzB%oeHBM=0@PG2{!N!t`p}^A`rB{{Evhm$dWYQCR_dBn@p1*YJ5)Uh^4Hpd@yC5>c(_RW3K(KBYQ}>Z;O7|KV%TU+sUS|_$K~szbuv* z3MVmfDQ=>t51JJ8hJkvB>;0ZExR2)PsvaK>ZUVm*1zdZu znTSh9`ezUk>o>}r@^UB54`_uLX1gq?#x1fCtJM-l=iz+g1NNvw=aC-dv!^3bF%V;6 zpnJ487GN)p$xHYlKIrvMg^y;60eql9zn!4sO@ls$KDE1*s~7+pWKTEiXx`25n6i{0 zAIxB|`2BOWH$tdXwq<^8K_T`WvzI7q8ser;i22}T&-LbA{e9>7yho98d|8Pz66<1& zn)^3j7@A^D(9<{Hha^IGRR@fp z`-=;rATU0YE?KERx2JCHj4?hwAv~YIUfnGc6%(_Jeb#2CZodcfYcKKZWE3 z_-;2A!-tNmCfltiDDUBqpfOdo~=ixOY8Qp9lZnYu)c*=B^*#x{M@2 zfQVA$E=OJ<9I(9a!-sAVsrYAOq1P!s(nhEYt!hR;yT5ZxQR&f%J^t~MH%c;sF>J>S z+dA>e;IJWz`4dH-op&N&#~l9f3{UOU7=T z_a`)@x03TYpHav3NN{I0rK||iI-GLOx;;h`UQ2I1HjdWG$;)E3?p!a52$=nmN6(t- z^wbc7u1+>#$$vyclH$;XS9eGUo$=sbYxPg~lH5&YWzTHKtQ-A1GvDg8ueSz)#4eZw zU0AOPD`YYwE+;3)%3|QkIS>j4fLJ4*yErN4HtE-R`KTgG^`+QjmiQdchGw6S4NE)+OlVCPV*YZmw!XmCbkm`H(R?RH>#eXYV z!>yFl6}LTe2l+2j9J*J~)6_puP`L^`q;gT|{dH-;^%hc_Wu(>!Mv3o}6NrZl`ab4+ zb93DGWw9d0#jW$Y+1l~!H9Yxqpd5CMm(xa=yH%`H#YAoB3b)Vx>L2O5`HX$cH#PDk z26Gw*2cqgDpf2mg*|Y!EvpE9$&i=NYkI^vfGJasAp|sMhQ|QN`u1D9)W3um$%h-KE$Xfvqnpca`U7PIVHZZ(x4(Q%C)P>&!`piNo-H|ekOUj z;6elEWcgJVH>U~r74=4hXPkVDHP#PoFZ0{4-|n#<($GKe?EAE4Vd+mu;T@Uvr)8pg zTW~R6p+@)BB!Sx-DR0z+sS(<#Qd7j_{BquP7ldb+TT4LS`u3xm2J*tbbwg9m1r9W@ z|7H5PJ3Rtoj!ZP9mRMZL&B;L-7|_ivs3^T1937vSOe-n3xr zMw)xI0J^Y!k^1f?hSDQk;iP)RtL-_u zP#@gHanXQd{|4&lmvP)DMQ?nYuctJnQ6SjQW5l0|gMH&_sd-J>^GJ*|L32W;AInpH z?))}Tmrxdz7KaK630GK==qS{Hj`Ff}MggV^nEQ?z(>Vs_4o-Y@1$qSz(^K z^UU894EhlZ0eXmg0l>hc9P?gFi(P2NfSfNT;?V-A+jaM1HVp6D6$ilzOG=CnlOiG_ zQo|S_Mn-)ZjifL7F2Rn}Jf+4uP(fdGs{#4J0)|<}iMDi1xSBSXD4UL(t8~JdqV4BCv83nre$Jb}=CF8s(XLX-J+HK;%eBwWjuI78 zud#1%;qg1mrQcTlL5B3EILg@Q?*Pk)CXq1G(O@!m`0(Mtdhj6b<%GP%HgFYO%0bh(nYt{oc| zU5E&hc=`m;-bR zsX?5ke~9R<)6@HXi$P)Vv|Vgzg;HRf19?O|I}%k*hq_I?iMIiXnd;x}Ok`wYe2p{2 z+@E>Ne)y8At%hCMd~`-z+<&mM>ilx^E_Akxgjqx3jXf|QQklpwGKtxyPEDDSh`F0u;G+yp z&q@QeLlhjU-sJ1ZV5VriV|K=C4J2V>Ne3BPt8nr&Tczv5S>xqua;um7;X75-<;9Szbf^rVy|j{@7toNY^-Z5)sFT4Yyq+sfXl&)sdD2E6<9YhZMo)fQX$ zV3Y;0tUt;`y@=2UlDMmr6s7-q|H-e@v|?#Wv#6GnkYwoK>-y`V+Q!UC%m=Z@D7DLe zhDxW<+ddfg2TYe(;;`WLo3|E|0>o03NZ#(xy*AJDRiUTl8!3;Nzv2unx*t!B-5Ize zkg`)HsXtoqwO&IzbW<8B;e*Whw3vEn$Px5u`qTlMHz}a5tF3 zY6U9XinH~R#=T+Vts<^W_6|zdKi{UjpcW5A0{m%w|3#ARz-l!c1i+qg5E9xsdM7w> zO{QM`(S-c^*gxD6v3d`Zx*TSmdXJ?ROfw71>Fk?Z&wUrZY+SU%HeO2_M+!ssnw%dc ztXoLW|B*jdf)RbndI5r2rj5Fjpzmc3TK_X5(b_50<)e?__@F0l`~fIhr)hqG{=FlO z;v6wyA?vOmb;--kJ6by==;)R8-w>FP*d!qtN)VI>xuNfwcfj>5`SL9052cJgZe9ii zM8rKK!96|i(4}$tnBi_d8;Kc7sQKz5^q0g-dp$EUxc2;p+0_dJ(R#J{L3_cAM~xQ> zgHUD#b>X!xTfr=GLy2|{&T><)p_8_n&iex8k?5u!SDf)}#vW>6eH8xzRdZ-%Jzen= zJq2C->R)j3f_E>P*k19iBPGAppq-cZE}UC&d1`tUmo$Fs+2EhCf9pDX z`0zSr{K4zUHNi_HfEohdG6gb?jS}GF*~nMQ$Bhx)Zc56aWxW;=to|NX251nnfyt*m zvCzWOPmQ<58IBK6g^Jqvqyd#T!RyN0n}eK)wQ%0|crI+`a=tX9UYqeZ0?UY24)@{k zu2Cd;|K#afyhecW^;wYBDnYYoeYyKIA(YL~tvOR`fQ5a8y6|qYb+h0$Pb_F4P3LAC z#>}|r{54I0MGEAqNNCu|4^HjHHydpa!#1ffa$lmui{0Qtp{%MZ*TzP#HJ`mbE41sd zTF=@~L5lJTk6ykyGS28(5p$Aw5as+E0HLMjhC>YIQid)2Ago%RZg5#REA;%=Cb~zc zyW_SttB>+nB2WmUdpaq?T*z3gdvz`Ss(MSu`!aGljJE!6lkc`S%4}@A8;jgLb5Prv ztHhf0+7y{_+-t6H69a0vJK7ylL+I*aW`}bb#H6HAeraWgL{3_zVKS);xFLyY5?NBcZ->!-K3{iZjkS=;`gnf4#Bu(11FT8p|Le-QObpk@lp1_ z6(9`ReLrH6lS3{vowdVR*KfLNYt8xo|9Pkm2N;hrf__MFq6$Y1+<9JMnXHC-_gspn zDOz1S`dsQZ-Tejs+~_Pyor^v^+GWPe9KtI*Py=bnP#dYt{N-7VJ!AnOOm`L1i>3X~ z*p3(x49*1kAm@Br(D4jnToT+P*+2kycaR)B!9|Gh?AYL<)|+H$G9&4FWlh9kH3E&C z>BQspN>RT*LePcTD5>=<0%PRv#rmIJ@1#p^__w+^@5!Ros3Z=^pNQ>W-76cNYeW#W zF52UR_C}w5QGJMQHj(a%;%E;f{~Q|(I=O0V?$nsTV+rFa!l_@7HoE`34C{$M#qQH7 zU1$c_uVSwkg*7*b1w#UPTM0=0{_*g-bl9XXWAqsmKc%4e3Rob*#BfJ4>NoEy#c2|w zHl>r+rhlM7vstttUF-dp=fhS4sJ{!HLCO;v(X}FZB(Q2gPMAX^jdk^_Ne`>d^Q=6` z`w?8nDR=#+i}v~9ZIiW&w)2hG$5;U*zJIr%eiPrrlNb_-K*4|HhLvJ2o>{Mry0G%= zJ(EH1NVoyXZ(sTd5)PBcP__9Qw=1PqK@L6^Q5~Ce(Aihbl6UrBQ0S!BewI6QCTdJk zy=|&{XD50ub+9s_fK_}=sOq|K(O?S3zF2zB=IJA<#l{|$w{PcU!!{Um?7XY;%oH{k zQ!z(5*QmY(VHXwEa3(m|ho#i-Sylbh@J&eA4bvAJH8Wpc#wF|c`qWEJed@UQHE=1x z2T$IDdH^0?pX(A!*mC3@DO}p9-G^3BuzvNX=GX2lmK9j-UVXK-wq^#|O5HP0=`=O- z!VZqu()+t4Wrf(7kO1jGbCOG5Dew){tAFWVK{gI{pZ`)9N_{giDa^b@+v72rUW;ff z!!Tr{6uX~XFM<7x9qh*ZQQ9A%C|yQF*mBt0F-TBGhPb3*2gkhQL&tjv5%q;KTG$fJ|TajUD|oP z(71=`|AQTVHPez>>(sW>`YLj^(5dQ|EIFu$f~m3_2k&GHuKKBT2n+v-U8<;W&-BPr1axaMExIj zl3*o`d}i+5=o*X?C}-e+ruDoY)q{2#P=p=DATL-#=Yby9apW{AMp_qX`UKApluq1`v{zJxC5{4h>Noz%YzH-^|*~I=$Dh5L#L=*r#N)(T#+0LaymZ8 zHYgciC9CXrbOc^wxuv#*OgA9UnD`?)BX-KLvC$W2k^cu?K9Q!GA6mvy@#hEq z7r1Awh&E~!R6ICg<3`8ZFnJY>bS4f?*4`J@9muw!^=p4G1O6Aj{5sM8`VG~`ywYuV zs!V919tbI$NAGX1C4>LNwqheG8jL($+#LQM&k#n>RY@Q<5SqpYar0KOCfbTAt7v_y>*}EM ziaJ|KlJKS1MgYRE7kho;oz{~{*M;kW*SLeu$~NNXYw2xU*~ML5e`?s4zbt)9s&BT~ z-GPxzc|XBkx~-y}vGwk`UY&f24gV~gSFX1`XMwZ4G8yA zrUK1rv?Wiu#bexm2sxf|T39?)m^c=>lpY2`R1}lXZrZQz(7Oi0FvGPZfq@rodTn&5 z_n~2J_TAKXeVk=GP#C5x(!&`eMF>WFg6@c|8QwKcQ{DwN_RYoZcu1#8)7^3QBcrU*KyvoV#*pFySo`yC7VwZsFlhq|B4#$ z!)+|**N4Ubd(zEMo4cdpYQCR!@t3X!VhE~Nx?a)H?v@vshS?kF1d-jjJlXFTSPZ=8 zaOpVsTAK=GclF;EI`P5RUkdh_OZnL=hK8!|RdIP4i=WRy#X;mtNM1+_tEB2SFT+~o z+&q^-!3{ECr(IiG?@Ocx!AV7jxgx_qY@wfpJ4}My`KBdHS$FBUDd5A&2@`;bidrAL zX6kg|dMMsQhk+A>^^$fasSjyklT;jAl;Ral zgb;Rbuc#$4YL%n|&&;Crp*)7(a6Gup_=hb~T zgSuBK1o5JrLGmhIR)b%$Wz=|Jz*`r7-nHWm1X8eQe(^rk#+TI4@w(Aa>gecr;hgg5 znASHTxd4xczxy1D7J#-b6PN){rn?F`!^)P5r6ePl zn0?1H05B(Q1s#U8E1Kg6Fk!ix&4l4YV$1Q>tNDWKM$!hINF(f&@zJ~0&8&C-6q%io z3O%QJ*-{jh^q6H#vCg)igug^6w7XPHc`*XYlWSAauNqBJ&vq3jW?3mG?fD+Cx|(?3 zhBvXpY4x{T2?4ineJ;llLQ@2we`)2bnc!z{#il!I!l?P2u(co{6`raN$TD2_#|QJ9pkS|A0EW{DU_1rA_8YEX`nAb$heUf+pKDPMd`Hb`Huj zx4Y_F6%K<4g9N=EIdBszL! z?SgUZmnI#(&YeQ;ZaX@J2pxQ3Z8#cyF=b_#@a!&jl$T7F-bnjH3on{u-uo7P#WhTG zB}H^E{8Or*!J0mW%vJx$!;A3z*G4+(0Vt_JSTxT|)*lxaSD$>JaGt15iY*obs!_0h zmyiDZqq12bO;T-3sk>fNAP`_cNJt`^TiKvYLIx+VkIBem=1eL8zA9Hacp4GpW|^6# zdXrcT*Cw>FE8t7b=i94c^e~`v=iPct4EQb1j!1*B9Xt zCUIy)=e^?N>RFYj0!<#b*E#xP4P*j)d9h*}CnKheFea^1xS0Sb^xOJr!yYQ$r3ra? zT8ND}3!wY^9CIwE%Kf6`M{fO|qF++l^>os88|isQcCke#tt|v3%=fR?L=*$&q){BA zSVv~Qw0Ir)?IR{5gw;%q&&_?_yitc>ZxxhJib`+kxx>(&NeIV;2*pIm8|v9+4~4Vt zda*OU7-fNk&ko;%!-Uh=GOpL%lS$9Yei$EsDH}ca9@x-4+v59FnU_U>-O2GuNkx)Y zCC$#54=?KLSS_>7jBE24$Mt|6c7JP1Vz864s31jRLbz{VGpri`liz!$XfIktd4jsf{c7_ zpaPB?JA<@QCV($g;M@Q(49;ksM7J#ebdo$f-|iLKjdD3vglt{vv_1S_P~mWO+;5Nn z)EoJp?+oZP_;_b|H|LcLrrB<_zSm4|;7d(+>{#>oKC9EChuWRCYN}EL0`ltWZUm(x z{->JCgao>oY$#rBu8+~;;o)T|OWp^1ofo-$)_w`0R)tp0`q5;-VNl0stH4i|A}8<+ z=%FX{M8|q|F!7odC4FxSG%ccwAww)lePvVVGk-hu0&8ZHu1nUf&U{}n8Ox<5aYy!r z)N+`HcqTo?&DW|@RC2)**0{&Yo8Jq>)kXJ1Fxe+};}!^kRfRTLoRd{x(a+j?dtm^# zmrq6-{a!6=rc-u)Y_ujl8xLM#T?iz6Q-=r)90V^?CJYSqGi)p{gmdzA3vNL%XT?QQ zW|GC_v;+jB*ZJ7GAjJIPYN-EL$&{q#W%VOi&rabQHb7|Pyvr6 zsan3nOO(xEv_IHLu}w|FME}*7@)>YZ?J1 z7x|yk`38Gl{crT!yaAoy`eIy}C#MPlRliA4yobLfB%bP8_pEkr`TG0(LG9kfEy(5` zRlOsc$(vp*b%R8Zt4_Y@W%O62m5A(1{!P(noSj8%479wbVqlU>6u<8tR&srTJGRuc zU^NTcnPJa>G7{A(?@8N1xIzD`hg;MJw|FlA^kdno?tb^hub(}>ziwlFJlT}EwzhVS zB`3&q25Lkd_@ZMQJIgg+OdAZ#(%rOD%L&x1pQt~5mwHD^ZtK{PV{tdT08}h`-hd~} z9Ua>`#mv*8T*UtN{}4?$4_I(8xq!x5-(=#+(T6M4AC3nY7OSBxE0GCJ=MH?)^uNST zT;oYuDeF~K?LM`<0)t^(quG=z5F#X9y;XY?uR$SfgAUz*QDqNk!yZH*FZUNbclxc1 z0M1_ibB6nwRm-z?b*-BrB16?(A-B+O0QZbxb;UETH|lhkT)=gHEoyZ3(~Q+>GVNYl zc5-mE<2~+u(mhGgeLt7<_1bzm!X99WiGa3h&V@X>tkYV(=Egu30nQ+U_I)jY18Da% zvl!CqYb95;RlEW-0Ep35x(Tg}pyca6Fq`_9pgs2m)yW!K*mX}xh}*oowAb&9e304- zUQ9omxu}hnW})wSIVkWp-#z+I9B}KGRawxS%R2F!DGqa(k~X$E3OQh+jc;#TSJ{mRAGCPV zK!5=LUKpIO-Q7L!=6u(7n!}@*MgOtvrbL6e*mJsnDH%B^-9T>p3`q3P|0B`APr((B zI^I?D+k8(VGvBOgn7qGl%Ljq(3%t$46D%fPcM^Dp9N}Gsht#UOxAM8 z;aHoxS1P$4QVHy*h~QYAF!L2I;_3QT6_(5@x2_ z3+nfRxYhTUCVRO*d}B6<78n)8pEpO1sm87@{^0AjxQ@J&D}o9V`GzaS;`_HVfU^ze zCM3bk+W!Ih*YqJHKU@~PhDCx0QT&my)njT8bxn+_E}@K!>wJA5UyFC;=Lo^oMX2h2 z&HD=WJ|DhZZ0|A5te9FC)6=VirLF&Ee*;D@zS|x|)uXyz3+bjN$Hi_Uh)-#ZoWsPj z4d0g^N)9|^sa!w#j&-ZXzT$eF=OU_}q8tS;8XR<`a8jA0lMn7n5c-7cHq2QhWN@M5 z*-L=NKP5hztSWW%G-Jmb-O+}I4=0{okQ-qL73lEFVi%PrNCWX#MEDGaO~2;d*{i)v49}jA zF@0>;{_rCVB;iPV7gmA-t8U!U)gYPI$qKBWj}JDSf5~0q+dE;u@ix!fEG@fZjH$o2_M~PGZ(vU6@e8x+bZZX2QSIzf25usa3T9mo`cv|8AV z5uNGjur#Wxr%qf`8a()9C_I_j9i9U1RUIA&x^~#opvIGXG$khfuY&topZ(&YbYRA}3%&t+`bT_R z0$~_KfhrxseaR43^p0s2S?6>JT@g+Gr%yAlk=n`<+ry8{T;ZZMu#Ww=J;A*6)d&0w z1K}(f()roxf&za0$}e1#=dRDv(e~6w7^lK6VzxF5hs(nD1i83-eZYCTN7}pa`ybuM zCE=$-?qNASYMJj!!?!*z$CP9Z0-xG2vUIU_vz~w(H_X&M_ffJbiHLpRk2<0liJ-T! zNwv>SN0HU9d>h+LD+XuSIdR&*Z-A60BBh@(p||^mG;z)AU1NuO|JJuqi*x)6aJ)G@ zUhpIPqLlf~Ph^iqOT~?{4b$2bSpzC<{4HU}J!eDPSCk>?9r*8S0pv4>QsqBWw;wB& zpnjQ+_mZI^8W)KdACOdwaxEtL=sC>5z@|@$LpwAvzg`poEF?#s`gr%#sT_HpH`Yo@ z2S=+z)EOv+B2D!i!liyn*oP~FEEB;Ca!FM;3W$8d&v6D#Co`^0a-WaRDWBy1^dy#!>y6~FND_Q9Y#r@KqRVA(>Ne@Y1wt259MVJvq} ztiPnob7=_#Z+9AT^g)ZuplNPwh_C+#$?tPdwph^3x&FeYUOtu}e|aAUhdQ_M!{VAy zV;{G{K>-Iuk*1uXDE_eG>+Ejyl95p6T3Vh(%q-cdG#&%45uD z^qZbD(_=!CZ7csICJz^dJ5tu4cZvBM-hqr@wJC55qv*A-|EqMVcWiWxH1LFPp6_1b z&Z_{1OC8W&XvJDwY?Tudu_zbNQS@JQ=nYo5_7#3QP`r$fJUh5U1p;`;_?Qvt7uS&R!Gqgj&g>rjKOZ3`wQ{Q#blOfL z_+tILu_xPP@mIGdJQjmbE%irK-PT?5hRx=?w`m1^)-sdswmjLZ(<>S+CkMRp(|r-Pk%j~&41ZsmtL9#X-uA@o*Q9#V2sWv& z&0E|iUfwL15E-W7Fz5raOZ$gs`1CAhdzq)=D8GJ{!duQ|`!&pFB-}d6Ty=AES0Zo+ zys4+3X}V}ObLMw;&=^$0<|}kDcr{T%?L1#cH{~f^L{<(v{ zym`1aD|);e^jZAYJtLzyzjsISNQT-K16Mr^m(KDxm!3qIq|ng9Nh5gi?JyJNJvr3r ze$^MnSKrQLX_VoMNok&!#S$=*ru3cxmh>T?qrE+gg9Z2q1UO;jiH($K%|||ZVkd&m zu|3S9Lce&C8i~4%fHPFf%XhZvpJ>E#=Ek*|z+J+b#H;nnWq}r_fe6zlvS+QH`p~sC z2^u$tDusOO+)hiB5;xv}?c%4wftKVCo-)c)iQCk>wMLQAh6oi=p_9{khI-D88$AL7 zCE68ESse+-_Pd|tDW4cVdZg@h6cAHdQTRH`UrW$(;Rd3XeJI3|$v6Gu9zniVTHD)JzgUBjf*Y84{e z-+aGRo{RYBHf5-uO)o8Z2;~5~m%2qwz0kn(vA5fF%0$^)M3m1v!avP6rwznXaEi*S zNfDq&Zl}IFTBev<3h2(#JUZvzNJn=)E>9TKcM26ptyJ7{5I_CdcjtmZCD}!aGile} z^kO$OG`~J~z|_3g!tCC>gmEjtZmRCki9ar1qPTWS+CSRnLfC5kt-D=X3_=yyyZ4S4 z!=j!Q#OhC|s_V4`Ez*WGF5Vg1=-T7A-_s}x(W}Vxa{4ZdSxI{4@sfynS8fmHP;AuX zu9|tjKWQRT`(+A;<&i5nI(9N$=Vlo;6`18D9&~Y8etf*MS`;CG^&zKh3LGbRX{c>b zx!Z(dN$=xS4FJTK-0k<47Q#+YHoP7W!#H8(b{&ud*Npk){Qw!*U#_dDZivbyomb}7z7+__&OXJ zn|;8~TwEd_8dRC|1A&COGG zl9KCRH2(|5AF8bvIQlxUG*!fRV>0L!UVB!(m~{AgF>^cOs8z60`NQ8^$A_TUG5Eco z+rRMpkbM_jAb}=ax%EbQEH>LKgRajlG#?YVW$*mmznrdMNP<2w>VdT)sVj&NH^~2s z4!78>mUyF?t)L`HiZs!k9FJeibp063_)oy0zUKRP0$>$0vmPaDm;XkEe~F&Jv@{=t zJzRsMLZI=)OHe6+eEtKLewN+eNb@BW+A-XS3ZBUUykQ)i5VG16=UY(CociF~=}A|g+(jOo{l2OxiCmpd(N^QJfQ~PJw$9H|GCGd;SEBLVxnV8X*8i^LZd;9RZxpA+8&b+i z?(Wu0i9ur>?{nSs=Skg(8nya&k$f zYi7v5AC?MWf`5SRUn@^_bMSM`dZ@ra?cvifim*R3Q;a;oR~++2t`of86~C0SP@JZR zXUnjlVJ%01P8c&o1if~#(Eb^{Vd?=m1D7kKvFQ^>`@VwgU+8#(CJ=#tXgj7ubtLANZH@bfgf{z81i8RWteR%@IbeuCpR*K%8U)4eL4 zgDpx?)Q9xa_MSpobXR|){UxBY0$U%azDRCGwIb2&PX#vfNDcUGG*9MRyZIzJq@+g1 zCLw*-oAoc%(0zZ7aEuuBB|J8c0cSP$V8JpJFLJHm2%<;PWOG(?SsM8nDam-k07RAb# zIzJY?F=tDR+;?q+_cVjG7r6sWYj4Mbg@+&>_UYZ_Skg=EO`RwsqnXwx&KD8Fyn6f6 z-YBy|8h0+sX1YgDpO*nArO5ymEnr%N)gCspGQ8{HpAQa1`?xPq!Tp5-A&-f~+&blj zB=OHwkGvC=-lWzFiy+otUA;8ljEgJnkg6vZ^q$*r!Q%BBA;%+zz1R1LD$a}PJPHSA z9_Jm$M>bEl`vwIShXnx%_BogNRheIaF#5umk6)$C5ox8ORnx&L2MH*bt8ufXIM#oD zSNgdI%8A)olht2$e!k_?+rd%@b`BtaS{@=0ecsWDm;f30NGQ!i{Fy(-!zjnsnI0*- zal^+47m+iiE(@B^#o~{)%XPRjy58A^xIN!_@6bO|blKFcfY4<&%k|10j+kiy{B)7g z9mP9mNjr6Sgcjbcb$L@f=c=by)6}%SJ!?&^bAv^B2kpvy7p@p|zXEZuS})ALluJu% z2E&@hgg9l`V@S@XJ9E;UnN;4`WZtjH@uDoHgzIs6vi~F+>deF^2+GTnt`u`Kr9{)F@9fv`*yXF5EM4Qu3>m<*abPz4itzb^OGWGCy zL+7fLinh1gN2dvV5ehM> zEqWur&9LyW8(L)SY%MP5^N8@*oj=5KBf4gMs7I1Ozw+|dJb~DF-&^+R8#g}3E+*R>4wijsulT{3^X*tRE5Hew&apBu@$qQTh`|ZzlRrZ^*@1z2XT`iGDQmO(PO!_YRlw_ z2*;xzNWTeBRm`U8G(2sIzm{06>NXfP(mPQ;3X|c#PAx_Sl`tB*|Mv#6;asIbOvmbxK__@`15-HyeBRKp_Z`iej{-@y7M+Fb7S?#eXSgfCc> zH0Z^}4csEnS2z0cROeF5vXvc7$X8cEn#Xa5`)l08bY@xI1YNzZ%N9)Ni3yrgXXJ-2 z?fk*XMVW*7^p2dDK}{3eSgV8qeZ|X`$e^cY-P)ry(Ntq<(mDCpo<2t@x_U|5#A6J@ z*cS?o+<}ALs2}W4(J}OgxDu3=xA=NRA7#Dv`Kx1bS)7^A+kwMCeS$Mgxft>*ZTNH&mu&WPWvsXJf5`^0ZS) z2?L3Z02lE-qja0n@M3MR|0ucc6|RM*Z-huPO&>eO`+#6p71fVJPcI`dtt6fwp{@om zlesf)&L>RfP2nx+&E^epz02Zow!}T^*2(IGjO%k2D6l%Y$>w>=rrdIY;AWDyFHsur zkD>n1$Q*pGmBXF8ZPSr9>W)>OQ?qo}`#u;NnXlxhRESE{RJuf#7|4df8&dy-ZSPSc zuX0*f$J2~;sqPt*k5UK7%PMI)vt{UaAdgPbjRH7 zPt%GixV)&68^Fp`c>dB%rb9l-r|I&K(3$qH0wVa^14#tFk01Ir!w5R>c z!3&ue-Ewtm5TA>Adw44&0!xFYD9-OO^yGLFAQ;=8p1>s(z45{~U10vI1DV&#K?x^f z8=O(8ZFR{YF|_^^4#szFGS%Wzqpv$ z%xw11VRxgq$OYlZ}4a^Opg5eG%Ce-~o;1g?8SIMtk70gpp{ zm5T(}bbRXqeEih>^tDPmQ)rdP2PeFqa5!}|T&xo+em{S$`Q_Uebpf`YQ(6hUAiAv6x>!rojCKv-1U{}6$RX-H)(O5?9yN_0)ZT zwXdwGc7mR7KOw1eI)yDC!NHRp=odf~*mdM-<&pNDZw|BDLP(5rrq_N8XIj-}+**$1 z%+bNL*&Z>%c|Yp9$)d_gB1FOly*z{T9MSA-$LL|5AYN9pUnWCy8>U^5+apGQX_tr} zgIRRZlOm*)5;Nmo4L_+=ibKVygmB@ zg1&I(_PpzpN-OVG^@e#yF0W<6XLd47JyELh+szHtSI=yo$E5+L@5FIWMjMYFiT+Ap zx397jmPU!4Xv`d?r;v^0P(6ZGCXxAaKhpKMr7VB`y*23Q^EWWp9Rr{(6zT7tTM4ts zJ<1cnyZugfMuL+RabF6Z=!Jz1cJ8OVq}DDFPbDSdUyT#RHrYxo`2Phffzbnel ze)@D4N!G!~`TG%@e1aF8y9$otpF}v1ZXawO22kVoEw>*?R8>VuMWf8xYL5?7=(`^9 zlru?1$IqEA>g~?*mFzrf%UKXDw$pEa#B$+ib6C9SraP6`KGnh{gY0-(C)<6GLB{d% zXPZZ$cpKjVQ*=!RFoup!j)A*%m%*9^4Rw6fM?8hFh(_%D=9N@Tg9mkw^+L6d_HAZ` zk0)ZmbPcPoY{RswIuI%K5n9<%{73q_*PM8vI7wJwa$JOG_ zb$|Dl6r$LfsJ||Hkg>toittkUv&qMYysdj1BI1D$;xAY;8KfPPR)_iBe)Q-O>W4)} z!=sUeoRk|C-rAA|9Ywkxaq3YU0d+)FHE(ynn)@x5#UB;PpIf)${gF@I_^oA9DMbec zi!(*7g5j+c`{r!{nK@;(k(Qcw*}t{pj(-5Ax@^AxJ;|7FVQ)n|pTQ*vzG8jI^@DqA ze)ysbECP{_yv$ZMufRK3>Q`ofPKBYAou}C^L!(y8wI6>d**roED4f8{0J)K=)2dzd zIrZ6Q%0y~bc^k;#;X|J^o|VJ?kX>hlf2oaLW0xMEsa4=X_e-p73Z z4EpCiN|n|T?OITkPVQToue8yA$xZ;wDcOhfY6A!ics5P~u(B2+-$YA}sBs(z2qny9 zEj(LP2E4z3E-4UA)la zn{A~TgY%XjZEn<^#ca_Z{&wE^X_28JHb1f07=5oI`^`Wk%!PR1=@IeCxf);as0_Is zxA(Iv3e$#Ni#|d0g6&iB73&<<`egYBVG&0^=G33Bn040?SHtrkXTa3h`-))QDfcv+ z!i+?gc;c0@;IDjPliKHCK7d6<-u)(KwaB~k`m=}9WUKR!x6tkj`y1|K;2`-w0=elK zRpWg2aB3%0LiGrJ3T}IQJ5wvc5sSFAMMmibk|g)@easBG_i#LVD!}BZlKJPevtf1w zz_dA~e6w3<g^#ncn70Cq_4>+Ru8m6m5a;X-!?X1XVP^qP{YWN%R#J#JhE1)$UQzQD;wtj+y{-C z^2lyU-Dyp+;E*BH=9eeA3a^@HTn})=!;$RhNbZ>fl~`sX~+lGVHQW zXDzp_pf06c)*PmTp~hLi9L>C!43oEh?e8G!PQjONgW9=W`^wCTlW2s$K{cn9Ydx07 zvoVqx4GK&i0|%^|TL_Gg`S|!yX0Sxt@qklN`Jg-&)zR-zWhj|`r$w+qwc}8FI-dKQ zk82^x% z{#6JnxZ?-V2%f6m89l#C>HRFpXNpC3NxaJdU;2fFe-O>X=wBJ~rj_eG3~CM(l(X#~ zPa6q&d37k_;&t`Ddczl)NYrVW=U@DCKoDIX2jX|x*y~sfRj$%hME`(mk)s0t0u$Ri zpdbSWZacH%-eUhl*WB&XS&MDoI)&7R=YM82epF6pQ~Rh5mmm#LQht0r=9km4*+Tnu zuE+W)`gWbT`O@(+3JRpY43AuH=bT<89+{UM9u>cIIzuX<7o23N430eAmcKDefn^J> zxAIEfy8Ax^9ymJC(kw={a0l=xlYaNTrd% zo5tA4Xv~8yji$jhnR4Hvy&splmXwH6u#wT<`C_131~f;78e^SLOw(d{cI6A*^bg$M zmPSn-PPRk8T>#mSpur1MBRD}|Dv(}L5gO$6(pI*qRRCqy-g{D@eJkVbqRa>`JxgYh z*X)UcJxt~0zynN7UX7BACvtETFHa+1LtRTn-|89J)#22~bza9%dfi!KTc6|@s$9}~ z{oT~@2&d~3Qp`W0_NVTeqfeP`Q+cFw?7yW@3k*YZSdSE==m|rofV9BVHq34 zC|&&2XB3Iw&atW3ambkJH|aws*I1@d8v?(g=p%~AyFRdxD7#Uj{qs!~Y#k?-yOEKj zdV-nn^-(oZdbKT6-(hYg-@8p=*7m(HKHu;w4P5HPV_nYH_pS^K4L#x74VF^2D?3^A z6@L6ROcXab)FT%4@pmJswmo|=KKS<3P?7Kyx0$im^V3Cs4H^it!7L*ouF~qC)9hlt zJ_#W@>Vo@%IEu@I7ufy2CQBYIl6}rRSC$NN2*1-68?veHg(M~`A>P`mx@xTaku)@m z$deM6r>C_hd^Tn)a~YQ1_=L-%!69%BEMq(tx@Q|hIp1vExM5#~Zk_Q5t>GIQFA6a& z^_2z@h^pUu9borypw!*@1YY|Hr#|#rb>f&t|2)`}*LEjild!UmW~|IXa!cZ_-??4L zALz5>j2IOB_+zn9G`8HwuD#PiAoJ85pV6DSmke;MHnqMpksz&xd*)6z4w^s~154qK zNG|cM`+@zItDk9qb#1v28l+Kg8^g!NFCyou7tXHyuD)-BgOYtolCB=fn62hVg^OqV zZ5?28iGFZ?IQD@I4*gcC<_juyj$_$u1q@n(+{n_pIuR(FFk0+V$c2ZV?gP}|D=}tO z_G=HX%a@QK(CDIxq_Kd*P*}Usg;+W2X6*{|Ja2iU3cNAfpEuq|P5m72RZzz!6(-G_ z$Pl=OFMt_fs=0rjeagBgr0#OQF2L2Du;7vqE7Nw155~gvqNlRVr#^zsy%#|6eAp5w z!m&BC(?19x`){WKMlgV|wej!SneD0?4J1D}S^{PDAD9?VOokd`n7cDCn6PEMGI$~J zuJVr>J#MP#JKiq59LFMp)=9iy#%1 zYqskYH@-C)$yq%IsH)$q&jsNzJ@nq7#BP!oIm?9rx(TVI&qrt^5yHy z=X@s~-hEV0bRHYMoFpI@cc*v3!pHm0O8an91^s?zyLJMKK)J%tEVSq}rormFi22a< zp8kPyPo29q7IdTbMB{~%$M=Ir=wMDX#P@qZ#J5lH?N1&)Eo%Xbk38i;&ID=2BgHy; zPStSOa$vP<3(@tp2K8PO6|uils;7^W5&(r4mE-dVU-!e*XSgGs(?4dK*2W`N{>LA8 zlCZ&vONT9)$;}TG{bO<7&qv;@t(!BV&zKd)jC}br{`wpzB?Z~H`b!0$_xZ$gpQ*o% z#|BbBeO07KmBz}$OY;k~YU;)ByTL7EJoeJjH394SQ4}C!LM{w5llay_F$0w7?8?%T zlJjCiomKwZ5v#d!;O!eQzYZp;OnJ`18IccdtgQ*=&wMGKujTfjBHdbDr+lx>aP6jr zB+UmA5-Jk1z>5cW8kr4XUM#z}kLzec83vsWV-n~n`>Kup6ZgG#PJZkE4ekr&F?_Kw zYG+>7#ipNa5HT4cmur1y;aHPz^YWeq(PPl^A*EY14R2ZKj)Q^I=$t0NQyx0C@@rndWf?ZwEO?#&LPHWh+&)gY$cC%HyI3Jb7u$!zTe%c7Ss3M3L6X_g}i z4J&U*`}(8PS^zUQ&c$Fv=PN6}+)DcJ;d^9|gWVRxlBk z*I;x!WkQET?+{#cCn@G@_tzlnuJ*`0$K;RS{pU1yabNf?Klc9wf@(&3RvNJ(QyZSD z-I;}ruFxW^zH<@{zV8Z7#tW_vx1Ng$=x&**CdHpx;-VEXX?BpvCd{b ztcqk?07g}_Wl@$wNqI1CtRVbn`%U@xrwP{s&l5dP#0$H1Uxfmf%X2~{D}8&ctXQ6? zR1>i&uRt?$)>ht@Nh6hh?QApcLA>l*(R`al{gY<_z}Fl1-w^yaL7WbDRtgV11AWrq zkz-a%vX4ePu}M|K{}UX3a5i-QH#q!_AT^Wkx&VN~1Gpifzro@E{p9x6l$O80L*GRs zvvwZWmLMzSrn)-g`Mz`1Wk#>mlxE)rYzC;+1Z-_c^yKA;yql+_!qbr83l!{j2_htY1e&n*} z_|VWEwtF%(FiMaNUB|B9jLHYeT1v&Q??lK-#XIM`O}woJ7^X9Pl>_{kwS`x--~9); zur{uOwot}R58PHx$s(!8OUiZPdhfXXOFSdVBuZ40-d_;={xpk;j(nll;&ScqxpUW7 zBAl;R+#qs*C>5<86Mw2pZB9gs;%*(1gdzukv49W2`D@`=!A(o&u3~n{;@^jO4$?Dn z9vX(etcm0NZW>()n4g%x+Nf!z`J&QyflopAcWz79*~>x2II{!G4CvXSDg4O&UtVPe zKQ67shjpG_WjpeTa7O7K_d(+7>xggyQI`Nj(7Og0JEB{nWNri>u!GZx87U` zX;|OT?mBow(1JULSJ?)}Z|55MBp5haFoSko@JI7`=J`Tj9LtvJu$RIVrSR^+@=-JlgI2{9Qt_RG7|eG+bq~&o5a8z}mItSAgP*@o(yf9%2k?bTb1${py3ykS z8iAJh{hGy+x&ehRbG5kXgA!n#r8rOt;^kPCR?4A$SXcm}K#=h9V2H%B2;0SaVp2#| zGdA>1Sgm~7`Xhgma}DZa*f^&IRh(w%53@KjWqp{cRWMm$e75xN$6w zm*b;Mb??shS5-Bu~VfW>81eR_91tF%jRDbWeUJTTM_0QHD z%?{uiz31+Q)9f%2X3f{;yzsM-PtdE`%>RN@q_!~d3<3;;%Y)n++6LcW_)f_Escv0< zLt*2Fx=k%IV8z~I`XdYOCJo#4-riqPD(lVj9H&mXA@;6Xp@PMCGJAx_6u(Pi={FI2 zu-J1v+BffiZ+J4c&b@K^(YblpYT~uRKo3swVHz2On2rx0s>}Mv-LYJyMxP8*8J$h! z&$iaJ`UM55CkX)b|4lx>+Xssa{4ss|TSxPnS$0;MW{TbEdic94@wZ(` zI_{Bq!6MvOo`)xpPx~b5lT~k4c@WS;&PK=&-3||T$+}#wf(`{6P6r$=_quwhToKG^ zck6yY0M;B;AGVn4ZV7xhyocm+h_>)eD~+<)Ktl+xVP!vZ|(U`Vn}T;pEdH^J^@Z`%&BZpebLAaV~xF|6#42cC97eB_(l1S zJn;}|?o3b(HztxT_ylJmP?Fc8bN~>;#95y42sk;XB^7hw#6PHK6Z~rWl;6}d2O+yq z`9b3vFQXIIWC9ohC@#w=x*N<_jbL#d+Qeh#u4mqcMz?8$%A6vu$KrBA*4TXk@ztx4 zUKuOkNOhTCQ7syiG;;Ya*t!~i)UloPuby?bi+^eDh6KHi#u`&d6Vr}F0CWJGzWTisTYnyNmg%QP2dh$;%d1WH2-Dx~B0$&EE zK*Ol(a+6jJ4t0ugTpUToywvc+U18h$!}m{!|5gitoojHW?9saLuk&i}yOh(iaB_i9 z|G4#BTB?r24Huj|FLrH0n{WyVka&NDS(${rYl}J~h(bf|7ijUY!69}&nYe|MQze=} zEKQi_P2l`u$tZV>7e7bd`}Yt5QWFHpCobS-ZR+u{%vUt$`s{NCf>t9esj~_uQ}QOv zDp4A-Fb0<`i*LSrXNwSGFb;z6P7~|P41IT9slrz-BJH^Dh=fPg(ed7l05d2GYe?eu zTo33`3Gb9qO&{tf{+81Ib6;C2a%pkq{$XZFG+*#a7R6i zyk7*lzII&8DKC7vBre_QMXn=pHCvae_9o%Z=Bt32$Uwjw@7*BP= zMsU1hB#8LLrt>E;cO+MmQIzlYo!;UPhszcYE0l0bis7KaQjUlp;H$EoRq2d<>>on5 z_asJ@F7J0?!KPKzmInvCzft@R;mu3BR|Ig05HVs02XK5(#23P)hw!S@fepD7|KBa% zch1<^1OaYR#F^w63d3>=u;0Ca0Mx+5Qi~1iR*4lMS>gSy#}Qb zJ1P5Oky>%C80L(`Tx1llD6oRyu2Op_^`e=(?HI%ncw!)lB%OdIzEooiJS=+$B}{%0 zrj5V-ll;2UsvC^mPKdDF%E`HSJGeRfR9K=z&yOQ3nQc%B&B{Ms4ETwl=QqL~Ub;*ZI*jo0a~R^8P(lE(;z8mPPN{=GzFIk)Ev~9$b^SR>oef zbd^~`^B#j=Ut1V^O}ssNSG6z!u)FD5sn5^$Kl@(3O!F>E=e5@P_^1#Ak&6k+5=T*v zkoQ2IajQ#7ssFxwBeTiuBdaO+ATiMl+_M+j*=jfwc+k2b+Q=VBOAk`yzm_X7*&9TN_2ln!?J75GU|=P+W5b#u!vRAT|=Cq{MSxcpLJWq#Cq}g1MGH zTrbkD)c%odw0?Mge7V?ZDO%0)fMjpFDWY&dv!e3-);%WoBX|>pwEu3_F(>cE6M_#3 zylLA+>yF~sa+(Lrx+1R)!d^0DV5R`%uy+JbCa`iU8GM5tQJRXjSbE!ipV`*D$k1~L2eGvV3zZ0e>cv9J^^>Qzz)n-5hv;7lsH zfBwdu6$KW~#Yx?VyMr50=3J0^Xt#f84)(NV+`LvNTp6Gqz4>eS>C>&srT0%t6wU_C zZSV`~OFYTQoGN&!tn@Z zT0VHapze^Yr2NTZH_MOzv(5eknu4*dg5OKlTlLk_D9HLb7aA9CtnvWJe!G^rJHyscu-YbR_QxOHz7%|Q7J!B> zU;gMy->mOqqxjYkXHSYrELKjg?-I<#q(jAt=={=ROAa!?BYGH9t~7l#A2EvUVxaMo zzItbM-A26Ik)OlvFXwpJfV^iFrLG1gmGO-#RA0Fubu}0ka|&sWSEZ(Cx4rEwB!|t+ z|DSBNvs=6*;}h|bJc!jnvBt(mrDB|ptZrphI=(jz%VQ@?wW>VrgmwDDuQ@-)eU!`N zx#psxKPAx9fC7(Zg(mX5CIv8Hb6i1y;f1Msp@ueOtj9yfy6FF$v2HW@hopXMg}GOM z7eyTk>R*u#^<^6l1HzC5rFBB0(Eh^y(05p4=^avTWF6}@ z$Hw&cmuM5Ve>R-dmRO>#R*1J{h6eL#n@GHH!HOYbP~#Sgp5H;I*Jbmal)hB;OC;mY z{&v7}XFs`fA6*r`HOBJ@wB3-Yfy?D|Yw;twRBu)KT2DvxC~;jLSS)cBtNtULz1j4F z+&v@lOUMfjKRZ%Avpmr9V&9Ym^Gv+l)k#m5gEi5CYCD{NHMe2hV~S| zfYn1gvNQpXY*Z183E9QAqpx-Ttm$abmC!kY4q#ImlqH+g227gJ2cA1eF5V8?NDR51 zqdGl%XPg%tuRe7OAp_9_E5r=iAFo$+w5)7|nKP@W!a zs_B|n&v}4tyD=wLp#TX7Kkpj$hMBq8Ki(*XuPZxbBq+v8aaLdf#`nFl~_gRkR#1#0uqG7YOB7Rm5x{%+=?NknBUxt%hs(;L`yn@&({J`{JAGXU0Tqz`@FfItu*82#SRY_A zDGvG}DOiB+NiA6waQEe2U{03Fx75cb3nnocM}A5Bz;%;AxX>-9OR8Fo@hb51EmdhK zXk~M`RG=HNSpm0eTO&zxuphw_cYQV9iKb`VYU32_;c3;>d0?@UU}4pc1p%5c_MqHI zbK1a&J4n80%G41`p6<{Y&MsyR>Xf)rh|_+ZNvK$h525ZotZpzS*8Oe{KzT-eYER7 zwm{x}`RZ3TNK6%F={VvU>-TZ|zD$2BZvS31q%_|dNymZdK5lLDDB6Vx0)HX{bu#sd$T z4Z(f~E&)_^dL}kRGN6I^eSquoC+=NryTc>)K}Oc;v+r(kHP%VVnYV*3-gle#Ez=u< zSLJfRT&H&JlP%9@@R)>R1q{rEB)87kUVy6R10~NZYFlVHncjL#d`% zBPhgLJ4A;&M(=!{$DjtjFif;dBPMVQ;98*9(QKv!35!GKRohO00>d#g`)VBlSgs%4 z`9q_PhBYXIcMFzxGcEUyb1_B`)D0zURL_wMM{J0+Mx%4IuFHr{-(%2)PbN_{Y{I17c0`+?s zXgh4KfFVT&ZS24&sa&nOB%v*sfk--mQz173!hFx;C7~Ci+e}9iH&W81s@}wSoK7v3 zy?ImauKM`UX-u_O=>P+iKYCaRv~uzcWLR$Sbr1af*dQA1T~&tlPdK{38UshS-Tw=Y zzA5!SlU2XH7jK8Awyal`rl9%|wxz6j8Y$eZng7ak*ELJzM}oa>l2*?)-N<#{3;lMS zTGsA0_Z-{3rz@&GjJm4_^1{s$DKi5J6SrV zyVv>n^0G!a6C4bOWiZt|JJ%NVHNW*ZWYHMm@>FpI^|H{y2PK~P%C+95;*!en{gTiX}tDzjQPc?(g9db~C(~11v*}xA3L%^GH45fMo4p5mRgh>SwJncsuZZ zD@4h!6RX;xfb6T-tMTHzoIf--y|;A zh)%QReNj(FP_j!~FZa@zukqU(WkkX${9-l)sbB6{M!`3X7b-^F-|;O$0JMgEr{4V| zM!eq!=XZ>_KGSJqBb9c$YrVlv|QjMiy?XT;~`_uoNRY#3$n;TtA`E&j{;2j`@|G3p+HLn9YC zHjUiKHTP`AE4sl;e+R*1p5)SDBc!jkyEmwG*o-`rjm!J0+9Yadvp<H|L^x>R9wpH!x0y$fVtlQ!+kZXi8e42kD8qpEvs-() zMWB)F)-9z^{la9xHemTXx7*>igUM~3`(|dKftdX<&yHV03Q|Xk@p*B|tDNJJ z*WIhSNw#ttE(ITUlXxCN_I2E$QA@n6$)%U>4f77!tSdi_4>4Hh2Y+k`2WYxsnk`%8 zovw;Nu2W=z2cYYLnVNYY?g75MEvMtZF8?*tPnSOghGQTv=cj6Cd$zb^l!cG60%?}7 zIyeH5>OZh_bl7vc`EL}{rv7hTofcwl7j$xJRXpnO4MiE5#68}cL+F#;ZT5UP%4I0t z+&E7JseH)eNaP^bNpN>5Jw@W|zO^vktMdxi#`B5v7j!2VYOi$xk*C4*bBQ_=0^jx9 zyI=SSWBqx`?|JqhVHfB6n=)zljb{F`CVxWvxdS#D)rl+bN+2^Fq-r&G$$x#j$EndJ>p>T3W<(~J>J%J@TmI3dNzNEKGJZ%QokD-t9Wwf6x)5y|5PIWs5bHg z6bgn2pPu2cm$(LN(b0qEWpG4J97Kl-L&nWtaXyQ zk&fbU7mK=TJ8UXKo;+gi_COLQzVp{?m z6@sR|5DQCSOo+sOY|DFT}%`qNGd& zd!9$_y;x?5L`?obS41A`rEqEiXPlAWQRDV?*^yDWP^!Fj80u3$1I4C_mCID7O_e4Q zW+2B`$cb(faUB-rA`<%(HI7mI8Vti(d)u4azVX1_;8wY}H!Z#oSH+*KZxdqJPC++l zd*>6WNxU34uKbI{tN|H{#N`ng8OGq%Vj*xJ9Q< zLVUqEbATO|#@QnKq4=7pg&eR4o$80lH#KbQZZ^kJU&&aB;Oqz>WTx-l=Gx$7s?)RJuxI#fbWgi_g;JdgHMmAG zC4=wU7e6wAUcMj?`&#=ydf+fH`1tdb4|X7C8(V|dG9WC~O9LZz`|Wazp)?O326t}0 zefgbT$H9RS(b96i!3;(*i^c>9d=Is}T3Y+twBW7ZDBNSrh zZ;u(GZEfx7Xg{trWq?yHcsAnx=GfApI~FUuc_Kq1xM*tof$=**w?t$kQ(W`iG3oz@ zvbT=Px_kQtzc+|TiAaZlA}QV7NH@}@bW3+gh_py|Np~sT-Q5UCH%Rwve&?NY-kCEq zYt3Jeu~?7mX0!KoebU^uauKg36M^JluFiK{qF#b%rV%Ds+LVQejz1I$3Uh$62p%+y zkAXoQnox-eKAZJi@P9sV9G3E;9t6b1JKoR`rMzS7Tod)rPZ2)-_{2HlQ*J;`!^G6o zFKJV62!xE-Cbo`5$Ka!rW)81{#5{pw4r8_1z;f`_WAusk^hzaZ&U zMi6C1c+fTMzx(O^H)&sg+v13oy#tG`I2QIL!YSvE`*#B>@})Y~QvGtT@e6W_e8k|k zB?T1Wr#fd(l+MJ4P93Z&TJCDo%Rj0`DXr_O+7bA~$(!Ij{nq53Y9ulV+~Wa+On?Ck zJ|@O!SAOaBcip?5qI=i7tazD&uk^i;jQ;Lr?%aM zt|XtX6@wbQ!NWhkhS4WB|0(umnu;3wZUaWswY#)qO%4 zdfRJ!2$aq2@vEcigAg_=^?DCbITIhWVE9-H}fEWt538(=-3V_-z}87LVHDl%YvCzsuhtbaI^Ms^*R?XnHX*Rfhuju(w`op#}sY_s$gVf%=5co!kcl}Hzny+8Sxkp%CT(dgtJQv+E@{M zI^+Hd%en?_fv%0|Q4;7Je;Sk-eco89QgJFxLK%?;LibjXD+B)fU+>L-G24kKoqyFA zhj4*VbgwU_AEM{rAm%Nrl=n7J`ls+u7qZgf#TRsRG#e(R@;U19;-FhNTmF)wt*oU( z{l2!Mpg3{1{k>nfnHvUEfTXxqo*9amO~zlebkHG$2_QBIM1F#JSY=vaUEA7))SwC1 zM{P2+F{FpNcvx5czq^&Yag`aY#r_ZYf?qH;EMX0H0 zo`5JTCE&Q|+Y8n6=;HtHc6U~#3rw;=-cId@s+m@wNO)%Ew{r~Xh>vz=X81>rm~%>U zTM7xX2la=0i{+X!6wYRkx}lZQNmX7ZTEi1-g8`fWo5fpTUFQGI;yp-XxCiS%O^U8@ zNAm##^-e#SvLqeQNh#+gR;b@UL6*-|re!s5`IcdUW00-E-H-s38DKVzB5x z@k^Of-DiG&54XI-whKtvN5|?W^{A|k+4-~oR7qnmfhy@5xj#sP8K1{?cVMR^tkKAa zcZhtdin?Cmz90cUwrlKTTa5)>$m!cz zNx2Y8dR;|y#lQcmhql4+`y{HRgRBp9o5BvdrG=Emo_`P6JlzQ%Y|j>??Q582vXjA_ zS2Vg%IjH{E%*sf69JHamJnw8DU^Bei`r_$6usITem7U3*68_vMU_%%fCxbGT-13s9 z=x}k3iGnv_%I6?F7rCQxs}dPk^|2a@NGVbGe+1`%8>NlpDK)cs&=%gvnf5V06!BGz zsoa`DnUR!$c$VRCAb%mMYbGL0mhiZ_BR{zvvb3~38B!04HwDiRL~orMnqoS*08QRsxCBT=gLMIr+q0*$S))Obs=cD z1oz4ymA#4lC#N$&rn28B!t_CN0^nEAyAGdx2WI2MVBkBh*#mYm)CkAN8W7lj{MPGR z|I=?RE15_Km-pzmJ_dg4eEWE>&pZr>0DpMm#5`$UIQGNqsZT=XpM+zzU)(8u+@v_J zCS7`0CKVdN9?Jl%0@DXmU@92R>5e|Ei|wV8@NWQu;uM4&!0Gew`n0yE8B!`Aif_K+ zj)nBszURIVPXVqyMxW_V5s@v;R1Z|vaKIA|JnZL>9(E5t;9HIux38 zDQtJk!PtrWpO$6{ViOJRRW;{VW{Wnf3vmF~mAaH~V9-}v{Jx^YN;rA$=H1dzuo8aJ~O8DRI!@I)s0|gd^ z??7ef78`O^c{L`rV}`uvx|BVkmOHeUj`-c3Ssbfya$4uppJw@ol~aY`wEoR%wGvhq z0PmSo;+zbEPT+uia2$aB#Xssb5geckpog?Z=ZKJsfu(MS=kV>QEb#EC&!|W<@m!t= zDFprdUR|hRZFFzGSV3FCT=}cLq~6NwS9|V25gWVKt^sJDo#|a<6(du4@#G&A{Du<2 ze}$8gWq^^$%UhepnGEOL%rWVfcbcS;_+ZoPU^8_S|L^{do8I)i;T|5xHUZ@DN8_SR zYSRMk)!@(%bK-he7tc#E;^ZRNCt)c1b5)X%8>2A&1>EPQe}_0&ty@2T&JvZYyWs&M z3ifu^vGpVG*=^l}M)SFt?Nt9fZi`J^$)^-kMWNO&ce9k?Uhw)#W0vnrl71av{7$D- zS?~RHKIBxr$zm`>_IB#*EXIxm0jhSw+vW6B@rtg4{}v`qE-PTO!c4%GU)?V1x+Q{d zfe>V~y}j;H@!$~pmrk@fZ<|FkZld)VbDugNmV&D{t>xCJRjlelc+M z3BYgU#&70!fH%$g41Ji5hrV`h`!W_KN9XQV3p>ss;w9+wTo*!quY*BM%uEnMOkJLv zlkEB4vF?S`hSvP)#9~BviuwmvB0)VphDnJ(f9wh;Gtp3Ob*E+~-v@ar3R#yH2Y$-= z6+2aFLbGDXxkG)DnV5>~2_0JADbfCu=z0k`cs%($c>WMf%(n5;>%4EA^2E*_=23G- zvStoWTU8ns$0Wy8g(tgmJd`6Vf5=<~ZLwCR=I1YK)Gma0)Jb9Xpwy$%{k`lMwV6mf zsj4gGeJG0%MiZong6Y?tHm$#-F4wDbVejTaD?aTyWOuG`K7TQc=+imY8Ld0>twsxX z2|oRUp7@oV)D9b#8wuUDx%r&O5J{TLtCSUGBI^A{jrwpL&(707EDR0KqnjtAH#Q?r zSgnRqN=-`O7}GFQL|44-TTS6tsGVhy>I`H8BGgZA7N0C&TBPUV3J->SlqTlM1>_f6_=nNgrjP= zH$v?Lk@fgAWNO2cdyKyN2FIQsWQk>xM#SW$BV|7BbVw2m#n)9a+Tow0J=pSx@81L!aoI#TsXhG!p zX@ziEA*&ef)?qcJW^l+qJlq{Z3-_Y;5I?eGVbj+y+ZKcZ9`^8`o4PS~MIVkX;Zwe< zYV!21>n00^6Sv$+TbIpRUhtMlEg<;FP+<0Xnx7zib>Sa!l5Qu<+7=XLPJDrSR)?z^ zF5fWZI(y5@)7mj3jisu4dIi}B00@d5b?Oh!?wz^ z0(&P;Xb}NG%rLOn)IItI>G|+&KIVA-_@O0F_lVPBiM$UB{iTOe>96i;a8pI3@xE&D zd$&Z9;FU+ZsUY;6{2c1ZZ7x4BdtaD#KyMV5|9e5LqxA9oYtQ^a-$Y9{NaOb zJR<60-Jp*1;)4lP%J2Q4b5T0f`v)n#F*{Xge=VA@Hx;FjBG&zRBT3|HgMZDI*R%J@ z9i*~+VaYSXNIt^(P3GD!hs0%NvulE7W0EZdJO2hE|LYxUzKKxlnP#XpK^T6z{WXDS z?qNUT9Z2;${DKu)_vUod+>C)H%JugSA#{4?HSH~b$$`Y9BoCmh*p>WJsolacX5-1U zLhL&7a|H64u3ok5Y;Cho!pIN4UAoxa`YNQZa|>f+h%lmoE8mx(NeV+suetwd6t>)6 z{NSSutt1DM!Rf)=?LkxVkB zUf0JP%}u9IiSCj`@2GHbBl9AJWx1kTUJM7y`gpK$L&lXck~~l4p?@b$_d6l7pHf6_ z1Q3_$;_SUF#__w%>(M7ln6%J0JX*yx&m2Vr(n^L@RjthLL`;Vb*{jRcHgnJlAdf zQ0KgflcDuVPr=tJ`BN8#Vo4RfJ>fek5^py)KSdKp()lV|%JwFNX$As(77U+yt>($O z&QnT@cd)W_OhJdDMN8AxvykQQ$oO+-1I+Kca~R7Eu8bw`H-U*=^i?hu#Fi8)I5KjR zkoGU-_dzzC786=y+G|E~u7KCu;`6`Cy2mbrGmfx3(}`^9*;9Tbw~6NCAx#7*KR+A2 zIn*|_1|gRI(kQ)ilK*QYAAU;BvJ-rC^u05bxZhxd0bzIAVwX#MAz$SRb`X3rKu(Tj@nCi$bW05hPsFfd!ivQkX8`ad}n7l!j6Q^MwIyBv+aF{KNj&5gaTOn zpz0_=AR|7HM1$^g)(JJ}d;bSAaY~30FEL@`*Hr2cIz30|{7a++!g_~-r6+9mUo=2>P^{kc-s6QSS z^tQlR`?@pOV`j8+NeWBW4Sz-a)~s)6{BUCJ zhSb92tw)yF$x{)E36;eu8F+GeZU^-6kupZ(tA;f{ho2NV%)Od%(l)=1zk@*k3NF6X z=Fc3Z{9Ds`9Ec)IXuA-m&+hoIh^10bOSzSKL{O&&4~s9>A1T_0o-_F*futJUoMB}% z7OZg2-+dL;{Ow8Po_<4p2XuMFaW{GU3!Z6Vd{Ls6*}=-7IrU+sy*-g|*v*9o#AK)P zDH_8q)2S&%O-!4F;Pb_PED6lzne~u%ro6hwz{qlCc$yE{RsJzB=^QDGS7YITk7uD1 zc5omfzzJFJ2vTlp>Wh!xBDp#iix+m9G~Clyd2RlLaQB^hwHfoT%6z4erdacz?!=ds zRCiVCO(=1_J(RNbUrthPe1C0O;H!pz3tg!$qFVPA52?&Ee>o@s2ARy6swF$OtxdAH zLJ2;2#-w6cxPZT5a;{9X?U~*^^77PGJ~SgQp?~p36PVvE;zo~jRyxGeBIs$|{0YSWlPS$rf^{QY^{6cm;Zc-98-LVw$E`R$j~@7^S#7RZP*v08&Tr%+I<99nVt&VR z(0tQ%C9uQL?G0@b5UBB<-ZVF!ZwxnL02E2vNuv4iaS}%Q&YV^9OfN>&bW<{?-*aMu z*wv+{2q)@D|KE`VqJr&C$HX=Z-@;;hyDt+XlwMjIH^J*eMjoKTb~fkcGBRz#qogE} z<{>myU+YTc@qu?^5e(7=+jnqnKXL~V^x3r%vc@hE0>Zu#UMtU7{(`?j-#Hr;k*|ND zU3)KsU%QB3dGI0_N0?Qq&gQD`CT;G%RvsbDm$%DDv^}{*&nIsb@j7kzsAmhzwDFtpj7HaC5O|tktz<4OU$>QWmg0Z7 zg}u1=ZksB=lB#JJ&^E7@l@)tCazC7~N%;5bnW|^{bSfDUhgYToS&-S^%WRW4)#SpJ z9_e9vgmi_=AhSJdba!!bXyiJuqbqx3?+@Jav4GVZXYUZQ#%s3?nv$Z@QdA_o1K(jv zW6K{SLs2s5uZYF>BO`>zClu&-<2^hYpj)fOkj&Ya3?3^9?i@y5xjDH7y)%`HAu#lluoM_*ad-cT6$SoruMdVh-cNs3BEA^3R){=#Ad2 ze{d1YPU?4rpLykWOeAN(Un()jR|-jEYr6k{i0C#sC) zvR&us%0sJW_c&J#{?c?;3q%%t&0%o;d%$~iW$TFiMQY7^O7tZ|r z5bWq&wLHguVa>w-oR`v_a!_a;ne8sMPb%WuByG62^DFS^>2JJ?2o&#xzqH(B52vm1 zQv6OrUzbMGCV&69Ej^=ICnL*(5i#&6seDHyW#alEQ$yp`Fl!3;`F2JK$L-hFZt!#C zR-x)#oq7mr*DxUxP&H+D4EBi`HCH(L{E>gINT3^yDmzgToG0|RiT8a%dU_A{@K>GW zf!+sUGb`)l^{y+o8kJ+^ZZ~*dQ5MnFcY~?d82b6 zuX0GlC$yl8;al?d_{E)m2o?!Rnz$;zg3gDin3%if>q`VgC)l%R#I`nF%Fv%akJLu{ zhIKopz@c=GJ7dX>YXRUnZgde;_^#qwQ6r|;Pm=ILr+f!#XI zHecsun@O})vP_p#Qt>N6@P)`%Dxcc6GSVWn^Ks^z+=hyUpAPxiIC=M2l3@Bf)7{5T zmw4DMrW*+?T%!l-+;*nPyKciMc#^adB`U0JkX*_t%}j2qP!6F#izc4%?y?|0khnDTP0g^ z?jhX1@8Bx3D495OL&a)1WA!WbQc`jtiC&j6jB9jxgesDo{D-nKyOHnWChX?R7)Po= z#rn%~msZw$VzKuT8OVKV*+#~!#+EM;WNf2KvG2n6BAjQ>TF#)C2CL&63z3yKe2@|O zO;5wS5BF{64x=_C7;)c-c78eQAuwA1V~b`D5bvD+5H~iY%=r~gzy8Wr5u>fUs_?31 z}v1pK?vVK4c;9!UIZ z+`kldkz>Ca_#}KP{M!Q>lr>rDIDF*VeuzBcKFE650E%QZB*ORn@L}DybuP-=WSt7C zjhIv0M{Jof+NwS~q9w|ai?wE1+^Zkdu|7E9Ej&hNC9H?OA0v`RxrVqY$0(uXHiZaB zSXQeiyKic1s>`H6#ICnu_b%X^SoYfQY27SZ$dMo+k)SM(M{q<%GVmUe!*}3#TBXzb zwyuLITnR%@M{yuk<};QX`;?kt$pe|ld6HM9sDDOBd%yMF{@924-$rmF9FyatW}O9; zTj*kPB;h3)c>k_KiBc3C3)D-hcnl-;p0-4SyE7lLwBT~;)AmcYa7)pSp#;cU$0MS( z^;L7s)h!sM1Vu%Yw-Qvw%{T3#*sk{uK-M;!}vf7i$_CP9g9q ze0ouQ80xbu@wK*c9EbVH%BtWa6%l@vAX{T0Us}%=)6b!l*6+4vUE@j2X_y%%pG~nK z)o{3HuZX)>WAH-&c4N4?!suwu?Hp@;j^;>d#LSTTO2E}kc3l!OyoKel3Hkn|l-1MF z#d?+WjPxX?yEg*BI4A)(&Cm;uE6s9|TH(R#QE&kK>M&cW`xYw6lpovI!L8-&Q8zm= z`8+*)8x=(!+*Z}+LFLB{^(`-Mt{hHiw9T~+P(1am#IX^Gm=SPmUeQt#CtMrgHI$~X?cRpK8NN=~Yy5C~q zu1~6_K`-(`mh}~dVC(1JE)ALGO>M62;4$;dxC&{^eiPVTNoGJX%5T3PGTan%#S2B1 z`^hCkSjaXx@DU_~8>I6!ER812PTHqe&%7Fb{R#~xm;Rk#$nE`;bX!I(@Wlj6-0VhA zYQ-V%tA7c60Z}O10O;XpXrN)HfVHG1@5>bJv}M*x%q8=nuOEJ1-?XnXY}TJa0`uhl z#7Wd#mZYS;+1I5771{Bdua!nvj4<`%o45o-PcT%kU9W7B_GJSU(5JzsDg7!>y?K0u z_F!nhbnNuX_89Xs|IF9agCrH|n3%n+9?$az)S;k|G(moy)lx!ymeF#Fuj-o)xUlD1-p|5!6M#d`PQ2m6b`g&Dr7f`SRrprcq#5m+Z=V+h`Cj4}mlylvV!HvCD(LmF+B3|I>&Ks3PLEG5uYzl*$_Wt0j)hzi& zioN6MQcsMQs_kvw7qK_Cm`bK@0v#v$rF8xMgGOAde~NUDF>~Ok`0T!8UXuBM%@6!f zS=pJBiWzvLV1o2&krrMXy*z7n*x6gi0T*Iv=tQmApN-%Ylr9-;Y1dBnD7;_m4r{aV zSbdZYxU(HhawPP5r9n~_cW1@n1-BeKzpwhV=mmC^v*)>+;OCzw=HN+Tx1Rma$2KTC zdF!kr=M+1p_V~G}Soq?lS}#=iIi@iuOrs1h+^n&j&nc{cR0*qaRg>i2sq>Vt#uz{C zn(}&$C8>r$8X9K}Se)jyc6wt_y2+V0p!2;R!=~urj*% z7E(HZd&!KIO*(oGLwAVwZqZfS|JQ3_MOQ3b(t&}Fj{iY6_CRhkK_&JX?il>iUT|pe zQ$|KcQsnor(D0OJf~7WVBxVL8_%3|lxc61`$_=A?DJv>797AuwY3E896zb`xh-F#NIyB#4~Aw>g;c6-`B(< z-;SIhJtIC|net|2G@qPq#dvMY4+UF74M#FeWbEJ~IEyA|20R}o`+I?ns{x%O1y>DX z$kUU&@+X)QI^h&5Ystn&J11ttC&sLvf^CSaZM^zZHPR^N>>o^sTq@Ld`>x91rpqs| zk}K>&iRw1qHSF6r_@SER6Y8FRTs!jcODa|sHnwCwh9weSOU`6%37bUBVX2Xg9CJlR zWc|)Vy{F%!QaWXJq9?W=kz73UYP`nvCMZ?=Y5^P!6v1Momtl$V__9g%-2n*_eQp53 z&19h@vf>(lnKQOZ&CMQQoAf&(M^>+W^~de-?6~R4)btizADpso8-FH5>^YOliY=Q8 z2PZ;}NAOADMETR_e4(__*XJVfvMJ5Acf_MB${9xpN9*Aio&GqUDfYW^CJMu%WsaCW zgAeKqZnQd{`;J46B8Xqcn`SR!#&!d99>>rn-~Uxl1Ac4b_c)C{W8&G{mUQWlfrt0> z%W>_GId$RIP9Ekp)zhU;Dy(+H50_G^GsY_Zilz>)&<{HBxz7ez#~!% zyNQd%WRM&Y*&X4J5$rG~?ZR<8(hp)yB-PBRqOg*C{U@0@@-zWSrp8lRePqU7<0Q28X3lL`ZLF{3`qHkks1) z22|5K5#ymo{1yNTYv|MLrLFNJ1IiPs%qOuZVj2Zc*>W~N^=5;$HtbgQK`r&YPj zoezO;K1{SbC%$fO>FS06I=uA^%V_-L+LT|IQmgb)7QJPp!~`)*me9GvzEOCakd1NfeWUj+XxT(ariRP0xwpk|bdlZnRCWhFAYk2?_y=vw5hlKkj`87e%K{3*x( z?B%&1B!U`SCZ~tyYgZp&pXF+h|Fai+(ultucLz%h$>UP|u{vI2yuP+RYnUId_N7m$ zl*RS|uXZxJ;6WC>fbLU$(GFA1KutOddHMP!1yG3OC}FUg!>C|tHGXk+4sUA34`_k8 zL2;u$Me<;e$&a)<_kU9$hYjz9Db8Hb9bx=?&g?pg{;E5dI6JF4Rp{$`Oi`}>M1hAd zn4*TYpC&OwskJ{Gtpa#ST*;SfmU+!YaGSogoS!Rx_M z(f9RhKXl7#T^#9V4rAVBOqF^@E~dVWiej0j?-ol%2Vlz27%(XeMT9<8a9c}%kNISI za$xXQVaU9!uq(InWTY5zuXQ|nnaEKJRUPjQtYKIca%7#lR;x*Vs_BTyL_T1(i{n@DRPBimaw7$HsGUYX4d6gCvjGr@_%zTqcLeEwx=)b$3+XkXQJvqtj~b1q4D zG&NGLo>PSC_J&+hWzsx0=qj!Pk?jD50IeB$zu@BzGMP*yoyvWRAbzZAB2RULX=>(j zcGYV16cvBBKpJ?{X9TFNhF+Z`){{jM;&#^uHQ2b>91Xn}!-SodzFbEL-9LST-nl?szM(|uP7v=S&^`1GV`E`5e z)kF$j{ha@?vP~(PPkp^Rz*(l@6bf#kC#H^Wo@5X@dct5vN}x#PlEv=v>FJZ@ECt0R zhKVKshV^_gXBBe5y+C=kYsweF)ZnjheGPlDyHs~coKei~}FT5zC1=m3GTV z&Ty07<=gpLKZ%xft&-$Qvwwjk;R|H(6Su$n9Mhj8!4hH~11&hM+L^e5KIpcHgo&Q` zCpiYWaxxJ?O0~-;7+b8YxgaNLI#yD89()XJ4jyIxa{&^=xK&7OkK`ia?z^C7+2i*Cu^^u zlBDKS@Dy#^tLSMtWkj^5Z^8#I{$M2fKy|B*ok-N2=)o7sz9|Q-8@aySdOSFEf)TIy zv~^>1&(L8nFfh9H9i;krS6DQ)v?y*fo>kWRh0ED7$mhWmwetbuIa8eSLn;mUsTe7v zsUl@aGj{`M5YORC#`oR^2>f96)QU&Q1&0#D>r2_q5$>iMbL6Z|V0EQKO>|Xi&yOx} zfpficL|L?ipI=v8I?+{sAI=9{0H|l@accmW%g`DADv2M_q@wD!7Bjt99Z^(3+xw9G z({<&Z!89-$kB~tvuXpiq_M^$n=3kP#%Z05i-I;A$f7J7z^{Itxz`vDU>uR8+! z9)PqiuaP`$KQ7eRiXq%U3wAd;OCHtRnIz(mq8OMGquYAR;9%I50CaG0(9|SlQ<^p& zWT>y-qF?ra-uV0XwEh-rk~e8NHQ+4uIDalVKWa@4C0g^|WzH{<|BJR1v8mLM>>#Y4 z6Lo)UQ>#R;_Rq&}SMPzuN+0q8mlGf*WhLh|H4|QB}+9;YtQT#HYpuQtS- zz=7l@;vVuw6lHm;^I~rhIWTJA3eeb`Uaan0@)@If_UDJ!NF;i1+a;!(j%1!L4yo}S z=QiJZ!2owcIi9wPX*_BYogk-6{xUPDw|9cr5nq!w_8CMYn=XaTCG$%&vtrhK9kd@1(T=<8JZ!lv-BiG7yMT(~XMVv`4lFbavEU&Om) zGPiEPtLE!zd|kHOQUdlPfWti_rTxp}d_dyH-zJFl-1~+sCNQ5vv(97ikIwmzuZ{Km z7%DuuulkmRLKJ{prqivvnyLLBL4Vq$G%gM>2GeT6X9laeliU+x%1V1^O9{GG7B&up zU;=YiTBDx*s#~^$O^FJSlQ_GW>y4N;{0` zOaCj4gthUZxA_ovF+vbLUX~4_nC=k3sfRus2N_o$yQ?+P@H3g{z48J0$*4=OA?wk< z?o_XpEGsR}vCLBU3z8)pEHF~bcYIj`EskwQzK<81=q_0by+5;S!hn0*+FJ;*X_g%I zsByhdNL9Aj>YAlG7m|^Y;L=XEVJ3i7lDVbWNj&47&a@$MDP+3vZ%&urOuI_0=$6D7 z{SqUQ^X+y*@mc9O@Dka)Ht$ku{Pm+!8y2+ZAlLqN2cBk&W3U8p3r@tc!0V7I&R zPUqYBqU)xU`Cq=||5bkQB)N|dLG!el)#i=490{!Kb7Z4uCZG%0<-p~o(Lj2&GaHgz zDk~wgKKs24PZ#ecf9#>zw@qco0!{{wxE$f)Yi`9Mi961w;nx-bS5cz7ABb}1J!x}? z&W-o`2HoV#hH*XlKSu|1tGT`m6*X&A(b8gfZWV#-oNO{=bl20T`=!xEyWTqdO7Rn6 zv+@3f-3bsG0g@O!QBfk3t}c1_qt;DAiN7{3t}*m`yiu-d?);f}+~AEf`e!aX((mm~ z*dlBHHvs1K*>r-mFh>M|YyMXeVi~>tJUBOOG1<@`^$XV7TkGZV#cYV!{m2?)H2AWb z^pJ-=A)^?mo|?9fdZ~^oQ?i9A82pbuU$4Qh~p+K-rv*=gkOr^HGUenk8rxaAMYNAvE)liLoE48{0{cM+n3meIp+RjUuP zAIdZ0{zZYUyA?)_=V(^-YdfDDuBD2c$wTxsJ;9RuuyCx;a{}s%h?A9(z@XdSM^X`Z zby9>AA}NstXz#hi^Eo%XRk&qY_mnz<=f3uRJ3stzc)?0#l~)SsZ<#(Pd_AV~6haEh zmoL73@StyZT{qFt_yu>p-gT`1zjKL8=}fz0cBK{*cK2{(b7=)kmciZnZx<) z&oj@uY>(#Z8q97171fbqp4rJyl;;LjZu;KrQCXANohtmV=!T?Z@a`H(gm}{mHy7MK z;%LyTF?H2B9`l8^KeAd({niTxfDpaHlxzaJnz;TCp~IRHWLY&B1m=nTXTwU-ze z=T*tNOA;H3D}~4-a}P$|HJsj-KsH)z<@TK0S?3K%LYI*I2vnY?WrxtN^7iQyQt~qb zioB`YD|8iBFdL_;=@r!QrV)2H-4O_am*aq!K%kyP;nqLDYw9Hgpg9?HxNk|{+u)Tp z!8LO+m}*7DWqV3UEF+aDtJ$2Fz8tej(sjj_6PZQvxw>O*?UCNr-@7af;9Xi&e$75* zW*X4`0$FgZitw5)mucP$Hi}W1(fi#K6-Pu!$j8w5V)V)9&tt5LI+j(K78jzP7hi z@=Q7euPlDQxduGr1{*;78a-L3tl@o<7Z0<^JvMIHS@c|!?`22JgMM}f&J5p1-1|zS zQHTc4ptsJ+ZZL=`u}E+fftH}+AL`dg%LSJmHMXme$LT%Kz|ZG9vhw$Lm*v7AQ_%rV zdH51@c@1w85RZO^rHuz;o~DoI2@za5VtCwpiUy^FG@1^~yfM8EiwnFn1XTt9YPtlz zvzU=*9o-F07=zvYecBt|FrceRRlo_!2TpP((^9fOlV~BN(}&b2IDSH3%%Lk+z27^# z&;r=5x?rVEryYW6DIKM}p8v+YJi1=Md-7${#zY^e=|#&Xu_Flzf1+_c|C`Bc9>jm= zV(*?rEV!R)^`-7vLG=Cg7-6Q(=3j(fDD%_HUtY$ClvQ5)Au2*alc}0l_02Z-FIxar zw0Nxn^GvTpr9(V7f#(DVa4HFB&8y9BjD-z*<+Zhl07;nMcgBXIQaTY)qGS)&lsmRf znULj8G(wEu-1aO!S1hZu$9Cp(w_3{k@6b=r@VFBLz4)ut;T|`1oCsvXoZm~@4lo(5@GecJ z%5VR^;rwG}ibKaO*8Ub99YM>_y3fPTcI%e1e=d57hi|F^fQ$PN zlDqL#I_gp;sJzsV; z*xaH>gPdOUlLf5rp`_bf=1XffB(S5QrRlxd2ka1j*Vhop-Ra6=uyVinz}Y7f_y?W7 z{qRQYf()p!C@AzoPOh9cTcTS{*LouTZd1V%mEn6^__zB+ypGfJsx#1cc38b!Gr#I# zUVo%osP1E^cr$#uNPcbuBYJhB58!dwGA?#VWh(;I524rOE!ARUP(2r^(fYXy%Pq-(x=Kwdq6VZ9wABl zY=qjhJT@4tP6A@fjfj^q=B!;(-V_y6$<2sCgfo|g-oYjkeU83U0Ws(sNowZkx-wI# zRlszENy#Z{IzX(ykr!s^;)=Zq#w2X}Ja@Za%2!X8GeWDY%&(VE(6Cs5lj75=lHRa3 zg8oj21BKqo3wBw_1o28r9d%aOL!JGrXJnMs6yKvaS?VI*`L8>8<7ZqGjd=ISe)|Lh- zva~avDtK0u%|&{vPi zxDCSHei*bIVS45E>cs=o)FjtvC@8%^90Y)~cm*sQQm%Qxy zD5EUw+|!9Ui(7bnXE0C!EL!9Pbn0SmVP<3sfJXu=Rdji0s5hKH81dpTJ9|RVTfpcH z5av9L)jJ@ezyv%;GpQIpzlk90lr(NT2e{#DbB8q%f$QlwT(3-^Csf`@PBL;%#wgSQ z@);&87sJz|9@9r*@mT;Ii}B*<(jc>6>Q3+{sQ8*7b%(X;y=WLv0O#j9NwmRKQfZ$) z4rKXF-d>9jj0+8J=b1L=mIjPc+k8-hOc(QbrtfLTn&I*=1nx=}T)@7u@GyE_9~(by zVowUgt(!Z+Xp;W?ql$7+{TZpr1rA9Ji3N9eSXz%V&_ps2 ztFRL#hfB)ZjjAvrl-OXO`+2T^W_sJ|UrI&_d*@x;+iDiP-$>vbm^nt$$(lew$VH32 zSo!b{N00t`pA5*>1@?Kxaur}9wJg^EsvF$ZPGGnT=qn3yW(sem?o(pYhhCfvzQ-i8 zN)U~vR(DU9ALNNR!D?5C8cpXNz7>2t7N|e|yFYOF>2JM<>uG@t;pWd}9vwun;? z2CNC{=khqA`P& z>XP^eC7Of*Go?B(z!Vl8J2{#kxkl}So7zh%vZKw2EIvr3)1A_qJhjt&8`CWwviItf z%N5`o+JrWU=N_)2hG&v2P%0f#0ZnyPhzbP<%NrG4GC+scn$pEez}Vp0_q{B>>l!(` zlyC9Pb=FH1TqA`rQ8ka&Ar`SYb-i-4U1DfR_h!`O#T8`_&4+W#CqtAjfVP;# zqY2j1HPDFldQeUak1$SCHx`kUoj!)w>roYv*%4hp@32OS@q<(B+f}hFo8dVStn?by zb8AueUMOC5isow{UF|LD$vj`|?hct91SsPKAq)VI;_v6tL=*6_nXf>A>)bMBZcfpF z`oz@O6Md;2ZF;5aeSU&)IMX~H$*WuVcWGJMjV;o{#rd2cH>+pA0KZl5(BUeDo`|DI zdKQvKQq%jwkYwlamz*6kP|+0q*p{jVuIKwf3Ijz~>YE-l;IOiL4b3&2Rag1vTXN{B zc@i5uC*`Hl9XKV(b85XKqU!?&nJGTu2mYRg)Y<{(hhyaGbB=-Lm|A&=?ZY~6%?Nt4 zhPNEv94Me(Z@_wugOLk7R`5q4e-zNUS z&LG73$nMlCDSAk!=H}u82h=fu=K8rPMutD-2Di1lyY6A7@6&5Kf))b3NT1w33xnLO zreHQ)P}C^t+Y^&vm5SadpQ9)#K%+DB6m|;RC*L-dUOA^k`a>wNVw{lP8Q5}3C&%a8 zlw!THv<3Q{)HG!Mg`XCWhJ>?fBL`*yEoBYIg3FM`+e$;{BWgfmJEMnuTdlxRHW6;4 zf?j`Q3dQoScZgwZq?A|~2S=gt08r)x0#-}0lDL%4@?zelSHGpzU_F580EY-#+!*5E zC|V5w%OH+4dh(|c_?t?}>k}HtNc>-SIFeoKCfS_h)KqNHy=3M1A82IOi5^@C|Mr02 z$&krZcK!F;ek1lV3eWK*B`M|-WtzOqQuf%}gH#=y?0S=^mM#GNnbU*A8E%3g`!g--`- z0JBhE@sjuQuQZL82fFLaK3SzB1DT$E_&Nn>8Eo3 zNMHE>@ASpHH-d#^)7F;GuHS=K<#}+|DRaW_@7x%GQg5Q6!^H@a2SSl& z@mNhX6nc&8QqTJg|2$7p!e*cq(9KbT+q^(D2{(UHZ(gkqd6fT-cG$_dOFMbFkq0#- z)?UTxk^d;Pnw(}ba-6($KvsbB73aN@$*EBtDXL<^{ee4Ls*U@y)ej8TPHAcuaCL(z zP#x?w7#u_ys$ z0MdjQ(OH_}2Q5QknO>t})JWp1+~{E|LkR zRRM3lnqua!UNQh_x?$Q9+*Wd~#mr5QHAG&~RAWZynQ?Jm$nq$$YG*d2PELd~;3cW< ztIM)JL_5V+WJ(R}y;fVoO)97s6A{FhQs||#8}|_>W8gJ`N%`HFU>I`522?}0AAS~^ z_RrRyrR4!DHy>F`evK5BD4*G>$W*s@D&pQy85^&%fv!%bX&JML@?OH4&J|5TlFqv7Hard4dvY% zRamyp-=9i6L!q?hKYwGVSMG+#*UbGw0Z0aFoJdI`Dk|JC^1u|AYTko!)%pOz56yVI zqz#f!mI553t4~)gYAzyB_9`zeEv=c^;G8`x)TV#_zVqx28X_iMVyUAcdjCW#!RrIg z_FJckG5B4BeRa_ZeEAbs?x1)a92}fV5Y-%9R9sFz@@r;=-!A;oD_zGglu}X#E;^RD zfI7_)!ja0tq_*4&r#^ie)0rSz_+kDkqEM=~Iz^IHoTfZ`jqumCu-!q9IJ!(NWWMf{ z-8@`O9#D=5Wi7m~KIYti=oW;Nq|0`R_q|9)84;T%-$Lx-6TYFr4Q*VrkD_(v)C!&5 zlN^X#@6)??6-TSvJ9fBq!%1EdOZC1`u%UGIrilbc_!5k%j!JKhaC zM}NX|DLp#Q?#jVq3GnGb8H*Do&i&%HE#!c+3m>g`#`n6b_Cr2Tpf4WpEWN}lU({dD zorR!e)70*tcv*Fw!+O5H?S1%A?mEPT+*PW1`&MP>Z>mpns!wV(5BgMyr(rU5n6 zikOGG!<{ngUwsnY2`Rid{tVQYEe7`DO-qdnAJBc--re5ME*c$ugzURn!^{D_Q$nqx zLWVFK5z4x`A273|11$%~%>31mF`mJ)MXzrl@+<$$OO1=IIxekLhp`_pTKr<-o{O}< zNRkGANK1MI3=KNuJ?(nB{Z^o_$E~d5yod-=R5CcnV}Re~kjHhAXT;bF_pBI4TwU5j zhNfuwH2s}w+^V2gH%{Nd#c6==LfoE=k1{;OM}s@(*}0Cw)`c5IpOXr|TLk*con72} zw_boiQgePo6DFy$ip=~!IZ#5Mn3m@>!Tp)Owd~A|Lq7Hw4aKe9gEyH4r@8qCPI$$P zi%3>w9SnK~v_F6Dr2}CG)MDhFyDOup8?ExUq|-tOHiO#}=qo_wi=C}U*WI$xWjDQZ zMrY&&S(`K^x9VqJ*IOgk zekbyueoG(LXFGeN4`7GAX&$1a!C-S`hz$zRM{f(}L4I)lZLE6jCwX9row zVCcht;i-C;q?eYGp&Pl;a;nJhgIzp4UtC&o6RU|jD@0zuxa@Y$nJx=lBu>P&-hvnR z(?dnJUQ_#NOqLPi;h|}$kdoz@k&KVdXj4d5#hqWa+6Z@bE&F+*)i9EwzCa_!aiMmI zKSP+)vC-LWab(%U?x;J}2elYbU^<|e)bV4ges%4Bb zf>AvY+Se)>I00TzX#VL`j#j3aKk)eB8*KPYLl6P?e!-$245x74yrI9&C5JU|DFd!y zB>>WO*uJRymxTQh6YAy5Z)LMy$Q$Z-t6yyNFC!vnerFyIhB6}d+9BOxf4nuaYc+M| zMJ+6|?O)#Nu6z!RMvoc^2uld?xly2phxynyVA8-7pRP`LDplh$$RffON6@+4#<-<+2xydfu}SR0hZGY9@|!VY0x4jE*AeB8_Pbr=86bfk3hCbJS>0pX@fth z2SJi|tvLK3WO9;aJzUkaV)$UV!aiWH3B%QXFiR4%?o1y8F0Ye?RrT*m8K|i68<9kP zatozI&5}Q(6M{3a4lse>h-GcjJLPtVA1oi>c8zFqDheX*xLT3>e|D|=zs63CK2o2H zpF22k^TijRSe=DezO+;j^~)QDA;Y-4xuFbBEfodP)pj@F%W3qY0G?lTV+j?=$nVs( zQg+H4vu?Y#RQ#Oa*Yj$`;Zg|45oOrHzSS^V6)~}AX;4D!nDhx!aTW%YTU#9$DZRfC zp?kF5ciPO6Gmcsp5nsCI@T)9hSMdqD$3o=aHQi)hEW^ZdIwZ@{`Awhy^_I}b2s0ss9ms_w;A+3wWF3!>_$WqZOY z@Is`(>LfRLu$M_GFW=o+cPX^rH!vx**`%;UZ~#>sRUk`7qq^8P)XhOH>^3;IA8N>U ztG%?OFGPCn2CR(G>>?ux;HCR%@*x9By1*#4{>hd-`g662#L^c_WZGoz^($z&sZJ+- z$ZSwxCN$u4)ZH6uUV|v&O8dUNzcO)k!j-U46SC02ky4Kt@KFK_j7Die28TnH<`xCG zDNSx0pGJdSYSRwU?$o<|O+F*J_~Pz4@79UP<7eUh-qr5m0elFMN%}dJ~|CQKF7%z@J^!IASPYu+d9~BoE+G2 zqb)z{aHoD(#*12cbdjm${`I|kNrXWjEO61;Q&RmVeC0P5tPnZGpBgK;I&Ay|n z|5|AMkPaH?d};8zE*jTf$oyPB8N0843=$&ka3{*3hf+%S5YK=J`&_hqV59S<@z7V` zPZ%qCB93;9{(1K!A-*i{r7zD~gKBc!H`3;oQyh0V&V(NL&z;o66S=Ntc3je-Fnt?) zexup4?4xhCH+RS@Bz{Xz=ZmJHQNz`|Wqq`al}3=K4?Nb6Kh{+I+Qm8#w8j3&mIDKw zQFbFQUy^k4iQz*$m8WcZt_>93mPYdz=W4W={q3Q3tVpFj6PYsKG-+jeO|1Yv7Qxv6ag1z4u0Kw2=UTCeX+S za`BD6ov$bU$d)f&Fy>TE7u5_XS|)%u?js16onAU+uQ5wtwr&)uN%8T4d;MRW7sh<+ zL)EX>F&J{&;vsNw*2gd{eW$s~r~W3jkkwepdb*X&%Esg^wN8F$clD;2~~Lg&r~|k@LjK%=)Czg4up= z_-=Iu+!q8@E#qGH?W4Q7jDP?_gZsoUkdDY;WY6!ffzL(+xeIUwULbAhMJjeGrikV3#+$GpSu& z_c0K9omKCUNHt$5WQ~^8d?!761TNpU@Qi-L5A<^9X-9rc3S4u{+wx*prc^hqfdaBI zPjFV3WOGw;c%M4%w5+Gr!yj9!$-x1h-dw+Tf2aJjc!Z?<*IIPElZ}n#V_mc2sOE3( zE-kmS=BK~*0fgrnKv7Qe;L5Qod|kyK_g6{4hfC*lAYMQhJ6Olv?{Fr@laCCZ}F;)BMEBK64S_+sx&3TnHjnv{gNP zpzo;^U!4o)|9c~uH3O?1k95Po*DOIzSC^(|2eKsUU9<6Du1eO$=p4wI!AnVS@j`3y z@uhg{Ie0Fr@0|9RxcTYl>aW4>hSOMUTP254IxF!s{3+QWD(wo1%-7!PR*sKSj(0Tu zDg3I$-Psc-4ke|)jHHNZ{*6Cj!QxNQSp3No_J80{l09?jNNt)QEx_5P}%k zn^0iWd@GQ;H?h_^gILPF-ut(bP_a=tAnkl@X7`lPH*K7u&?-l4G{^$z$A@*tvN z@hQb&a1~-Kp!KIt{+t+=$uu*0nPPiAT#fWvm*vvqTN#mUdbq;_0}XodS{VwmLH?%u z_S2azjY;K0zo}+kqg+}lqek(3CYl`XB|N2=Ne+Cb)L2qEVo2T!+oN&c_*eS}%>Q+n z?KNMtNFO^VdU)~Ne!3gdMvilKH8>JiSNArB1hK#j2M)Zcq4lDkHb0WS-(U)Cl!3|r zcQ%SBKCn?Vim_~zHKRcF|I9||P{*=SXb)<5oZ*ycW_mdIVtTbsGw&4}9&;HOHs_ z?@$)cJAXr2o?oh#jKr0kJ-C8Zh0cR5@mg)G!t7ec>N8rpe=YbtRKJM-2TKr9A}^rD zGW0?3M$qnhI6j_lZ*jr}arCFI$2U7-AKbflyge3=$$?J|S>0n6`u4mcR#ZGeJ-w5Q zz3H(Iv*d|E!RJJ89wg`6a$g8O=+ffA^MZ)W&PyeIZ%GBQ_thx{tCW(M-MqW;A%6%YOycZii$yGmr&0TezCNMBfTX3+C3fcLcP3#l(aJoPvavgZXz!?H zg5e$q&iQk&38WIaQ*zEOj*{}TuAgx7xYik~R zaPM>Q)c0&l;pmm++#g&vHvN^cdN|lA_nX=6ppSES$nr`bgrE`+!IP{j_+L;GIJAGW z_JOH8-SQ~*{0~2t+9{}Md-BI*lUMnQc! z?!6Nj>A9l|v66~Tv>LUz8wCO)q{)*fYo?EX-t7S)8(v0+j(g(Z!W??Kd<>UCWTEV-#Xn?rdoIxp|OCY9XiO{ujEaA3yFj8?z(CY25iwWY}ny z&1_P#+$x(0lq6m1`ZBuZIl4#(f$kln&+3s2gJz^AB1~7}&}K3e;`!}FF7rug)A+1ril z5ATKB)j|G{##4V%-xI>gd>`>Xv2B%iO+0g29kVj%yxMKG0G(fN5cVRk29ufa&;zl9 zdj5XI$0s#YZc*?&qwa6K23;m5?$5u^n6?5R>x(`98kL9`X_e&S!B*A$%8Izta@p3K z#6)IxcEkA`yjRD6PWhHsl!1D}Z-RpSgMz-;9=6{c7tvBXNE{C?jpVpy?mv|wjL0jr zmR6rMdwa2T2n}?VO(u`4#N6;YS~@w}T73z{Hzap^4fvt~cH%x4g0VCatC%H|9Pq*} z>mvEvh~D)Y?iqYCo>-?7ZvW zTl^?~1sNF`@zC;m)zPuHH@KMXKO5mB?2VkGu zor4BqPr}$c-m-A0CqH^ZjFyrz>d5iweV6&J2i}XA|5i&-%InAQ7F>g4OkdUD9Vuxc z%jVjcov-{%#e50AR)6u@VdsJER8KP64^>c{?fs$|p#Y(xj`B@t2i$SPgJro2Q$qN%gV;bTy>s49V2A&IQ{w&rJCcHzJ}g&Sk-aH4j+&p?3QGBFC-yiVIpE> zj*E2;LJEUvKP#qv)cfJl0Mj;3HCgU{%&m>IZ#`2pp$C3%-WVwYDXFc#Yc_(}ZndcU z5_jiC3gzTEICs7WN#OlbJtpmb!E#aPb43m=X$6yE@2h?wk)omhkfz~_BTPB9t+*{W zNOw4ap$dJ@$_&k#TxlAdgPI}PdS$v4foW@AHTsR&)=9kU6jA$vY*=Bf6sWqriF zx!*qdh9p>Pz>Wt({VCf|m{S^OAdfnfX2nb>+;P3A3%1nlEb zg3%Q1!(8X5jt*oN>i5IR6w|u9s<)6sNm*HVp7OUFn0wx*d+Y38_B&9D?tJUlZP>Kd z+3J0GoOcF(f7);FR88qKiIACi#~)<$dshK#1i&BbRodh}xb-CIZgR)1U5PvyslYOuxT&yiog{vnZc$D3;~g?i0qcj0Ng<0dA_2v+dx4+dYS`GQc-xSn;hTtl zhYvf`qLrlsUcWw#?zc#8)6d$>_^g+O;g1%HI=52bq*3&^AWGk3;@a4f_RV8@si#h{ zJ=#kPY*QB@;6?E(_ySeuv?XL!+m-_{FF)p26Z~S^x}40-mx|0UyTHqVMN}X_C?&j^ zCcZ1(S@-?>T*!MeP3`_en-`KL6QI9Y!;0SMr4!a^Za<<_P&#MQ2&0y*o|<27W(0o3 z69;3=hnN9v zP*HiG3Zmxc)0Gtolhg@6=>&HPep9NBIEugnUovAEqm-eQ2jB-_7EYK1XryT8v=;sQ zZ?T4%Ns18Z(Vf*Cq!A>L(De1py)TRE<$s-FA=E&y{+hr5|FaV5kJ_D_4qlJZ+`6Sc z(>zJ-$?0wUmjm!NG9ynQ=rlQ;8TAsvBzVf{yOdKTiQNI!`CYc6kH%D;Lz#CZh|kag z&4tBFonk9JfJV_s`G(L9`47r|kkC+yHrREo^-97N(|q~#H!CId7$8rXKAT$R(R9G# zy^ZQUI}S9RuJX?0WK{xqIRDf`E`Nj${3+bu7 z^Snk2RDTmhI#gNvQcOdehud#)+b|9H@ z_dC`juG7t$tcljv4p{K=Qd0Xb$Mnhqv;t=jem%yTBxD}0k7-gAe1S@V-23R}b1X4! zJTbpN?{h%@=FOXP;$apS;VkDCC&t{>K1T`_3RmHO`jS-k$vNjRljEG;4E_hI)V19VR~k3MhN zMu`Z-iz?hafXNu>qMbpBVpZvzR}sErxDqbj+6YUh*{fdb%q{CHoBx+QilOlfpKcx< zjbKU8WuUn5)xcq{W7O8-?C`K1X^>gZ&>8>vg^=Zqf9|B=!UiN{nmqd`OEh*!LEnnM z?3^7WafC?}j8$UZT4kCiytoxA8+73uB_$8n)3&In34~+x&P`{sp2_O!#g2|0o9dx) z>xERE>im|Ps$Adfi#FwYjSLF@9;T)V`3{^E8aeJ zOWZzMJZRZmNvpTg)t+N?G|_wGiR#^p6|e3D6VG}`%gW09e#|VvW7Lky!$)!#Yamlt)%Am~eMMwK*@UNSemaUohKRd+ArEkd+ zhjutPV*fa`N#Vl(9eHF-jX9EqR~~v3^N}LA5@7hI(Sair zoKNhm8rq`Qc5LlxG9IwSiOG_Ac_Px)+}S~U`tO-P6;w0S_7~Eqt!rwkO37)ImiNjg zlXl724ZV&WCBEpUh@-EBiF!GiQVGpJg5yXIg)*ogB(LJvwaojK#U-=EV_@iIvIj=y z8&x(!I(Ja#(11LScI_h6mbjJ26hxY$+X6QEChWK@*neB}O#9?&TOjGi(eIGVoSc)r z)J`g5EP`si%FDhZN!R?%zn=>hy!;n1TIN+V#0bNR(nmT50XJQDoz~>ZR0K*IN!hUd z2oujY%A(KewIqvXlk27DIob z^7_zk4#X*}<}8t)kwz$mf;_4B-o)#gFB=0OjUX^t;bCuY&Bf*M_{yqm;>-F#8<|_Y ze!rg`+xI5gtF<{72`!}v#7NQsyzi93FvbCXJO(@uH#nV(k7~(viM5%LYrZEG-~W>6 zeEN%Ka=T3n-swMtV($J2n#dEMkL&0DizdQB^zHW@Odv;T)qw?!rpw(Y5E%ld+60E^ zWzib&ebWwKarJv+*(x8re*eA%IpmZOvya>v^IqRGVzD|G>-C|V=IWHMJoM?VALqbw zSn>>zEjyWoEEKP+3`-g%as8D>L}~iqp#@)wWaY;wNeO^S*E61^tXYEL>NJxKdJqsc z+2Sms3Q%28xRXLM;x_7E`_A%zc40+yT@eS z-qrd_lBe3+a}%vjE+56vwXRkyrG#yR#8!bE2O3NK-1x?A@5slb1OGW0EzGNU)$76yBoys?tjoEwj=(En z-UnXEGsjp_Z{zQ&iOBH&1uTK&DwaT^{AJc_mdhoxl7kFgT^;%$uUW3f5S2MJLcTEn z*Mb#``GO#>D(m5eiG_y+!!Xsf>O6&}IM>LE@ft4hoT_UWifeRdqx5R4gfIch6#39z zK2_gl_F#b=418SOY?MKQ$kbR{a+Av73!1iYZcr55VWZLp`T+Uc!Qn! z60fi@?{8^rm=vWa`t^YQzY$G1?Gxz!{}4?WCJ*e@=C|9u-91xlYQ_sKkI#M}`Lc&! zD^nwh_0&yX!cWzvf2i|Qp|$1hqm|VJCk^T1HG@a3-V_oNn{r{yef>8X#qTkP#$&(w z@?*Z3&ov$KH_Q)PWTB>X$L^QqCcv_bppwj}uS%_AyV%8b-K1o*ulZbKp3{%ulG5T& zw<;@MzpfGN(oVzqHI;hmbdO`vO)AE=>e-ka7DZYnYI@?N(gBkK2mUI0K{53ag=EZ= ztof`k77wjs7C!+_8On*uOA2+$7n@dx8wFQzqaV1q2ABOdf zx8E+$o9UOX3gq<9UJG+K!*Pk=Tt0AfZ*Bq{oF1Pm%xe*lV;91>m%)V(b_%RUCyu`G zhkCO4hkA0;b~wqZ_ZptU5fCcWng*LoiOYt)fJwBiN&uVCDEY}m>{r`4j<$ zuN!I2!%VfQhQz|Fp*6>FDx-NS)D`|z&QTM-Y?#YEJb4#wZ$t3OyupGxiuiz~Jov9% z27+2Eiw*Vo(yjj`S>)*-vWRTj|D7yCklpp#MIVmE`@nD7PEC;xDt&1NeJK;TPcR92Xg0u&PrkEgea;5pkjMF`k4fn0p~XW`bfT&bT2?H-2HQwc)@WE z6Yi(UUG9vu&dF1)a`C2ECm?l#6Mf8MvsoqK$8Xj;&+^bIsYq_qNP5?7=bx13=iALU zckFHaJuAt=Qibt;a-;rfm+?BTgX;wAivbM|6j#*kpbM!#_E2Y!;}H?jpO)FmJ!jc@ zq(ns;_1-K@Opu=y3S>XnDT#o_DvT-EJF7Qs{Ej+=ND;^u&d*k%DQ|5FR=tf>op zvr2P|;qsD5T|+&HB;Oj9P^xNPgAENNXqcmLmnvtew#5q+Cg1W})Wipd1)aI`oS_VH z`&1ml;n9|npuqhNAt|-KN>k%JzygLDq%F>U3&5_Ppo1XTf1N%cmD-*7OjkRgb+zP&fV^A`R~Vha`XvG|+qxLw0N>x)~_FC_4#8=;jrspZ*G zk&m^1eN@j7-N*Con~E)|v>#}5^5H=8jRGeaNs2Luy6xVJFF}wNj8DGL`JXPKBNFXp^c?wlr`_(bA z*>b(D#(IZ&H*ad;szFkPSs;#6C%WL2)ckrGI5Th!y5p~#F+3d7%yptfb5+Ij%QZU-w*K7h7(I}7~Bl|P2g`O{7w@Z-51>{lP{%r}LEgfYKma+|%V zi}_ohXH@6eSMUuE?zCCEKiL1oW4CHWP-ktoW2k&9Cob*?^}InuBu3}qLm8Wm6Xc$l zM}Gfsp-H>FWYJBmor`yG)Mjm0ZO_VUcTG=E54vBh4%hmEGVqwMYuHLfQT?ZJag=ew z)90w;5=P7J!586GyaYg%{a?d_Geb>b5-c;9f%6Fy#hm?%c{?7GyNI>QHNiDPkF4688g_2=Gy)G z(jn#U;GEhI`oLu*gicPV2B9BZC{!M9q+uK`JKyoGqi#xejXP``uSBvct|u_ zDmRDgObq5oPRAXpSZx}&Hv?l)eQ^?yvy8LL`|A(`PhI8ocMoro zGwoRmrKr0Ki89$$led#qdx44G=dj8_82>gJ!NZpYYOf0?dLG_6igL=W%^f(v&N#Iq zb|JF&(oTedXhBrT2KhQyp{5vH&Ub)-5 z2Ug$p5Dw&SOiTwZxPm`#WvB=gyba?g5SYfSzw3T)-kGPqx&4ysDg~0ZOYGY@Tzn#q zMnOM(o|YDU9-*XS7}`0$hkyZWf*)3u5PP$x3WtAK%OH4QyFJBHKZw?Q4tv4+yDN)>$ zCO5GsWN@90*e5jA9SO$>Hi{kB&fW=#E4fLU)f1l` zMSxz~`NoVKB``QOdXFh7xLg|O+gmEbA?&3%4%P5@cLiD>q)Pxtx;h`&$maKujHXSj zqnKPJh*3&YvHndHZOqN>`)@y@(h^xOgnCdTR>NOj6G~U+&v(nc&mcyD&T>{CdUNxGap$6RAZA(N^$w>&O@iCdE?lhl4Xys^6G+WTrMaYM7I z$pva$<@DZ0mbMg|Yy75>=8~G7Z#rhdC~iQiGX3-AbJh#y8UF?(aguj~1uJ;{9p?%GXthteG zvmK8g^CFnH0^!Z>BJ7c&K(BkHDC-+j$zmE_Rg z6B#cWrT+BmrUJ@iXM;JcdtHNZZg<-t%3yX;L?1WJ+ zZ~E^NTe7s?T8u(&f@m#riiqiYHXYZ;&8xJ2Jt7$;C01}_A=Ara ze??cmD|;Ww2!7LfD^bGN76}()^Hul2WDGcSA$~zGdNeHKkfQL03L55_9XE41I%yar z==i)!3N@Riea}{BPufCQ6$xke?!m;4AClBOU$LHJ&KS)3Yrw2bKZWgap1IJyx5T6R_R_d^`@)q=6GrEklxwp_G?HZWmquFA!JZSB4`d7P zyY1Z(v>q)4)TMq{?b$VjA_?#t%0yQ_JcrpFAA;5os3!8yh`E&^ zQZN&Cc!tw8K0spNVQ4Y45EguLY>vQT0);U=2qWg?BEr1IS!s?_>AUd(5=xDvf_n7! z{l*3wA;F9^1KT#-5XjU`Q){#;bLI>?I7q9VPAzsV^(BGUsDfeQo#16=EqU z*ytqUq=M3q36uhZLVy+3e3u`5y#05T^P`w4U5W>l|dF1ystr4CGEC*EH_n@;1MMQBt zaJGAb!I?8ZTTDyKb@B7qYEVVQ__F~!q(3A0UZRAE`)WQsCSe6rlJCOb|Gnrp&*g5k zn)YpXoq(Q!;P3R3?r!KlS9sX=@3_~@c96PLd;{NWk(Z9nQuEX`p_)d`g{ANPMZ>_- zx`06J=~Ab&{lThetvr%0gL*To;^`>}Qa;ik8BI#C0FSw#Ro4_r8GrSFOm-u)x`5!}x06ZX;|%CMzQc}6 zknhAUQn^2<+d(N7qVC2xN!QHWKme?!vK;Y~$>pG309G@J+>dtN^~{lkJT=AA{wsEc zPFJo^Q1^bM>mSgzBSoAZ+TGD{H&T+}?alE~^JF#R9P$?OKLHjJ5fLqE?N1#UdC%ra zf>{Yj!2{<*m!qj(RoWehWW-oovwsh4Ayo9)r0fOTx?kmDVf@c1Q)`>7-JS0H6=#5` zR1+Do9=-JxO9=5&#}YyopxOTajAPlVuvsRn$_JzC)fSnDngE`S*#%(r^d!w_xsR#+ z=fXiTHa@qu@aY?*d2RPG)BH9lA6*F= zD74v0UoF7(ew8@`#md&A5G_&hft3v1Zenfz1Hvk1v!8R@9XVKFL6tm{K2m?9rK|h# z&1;T>JX+d}Al7F}zx2#{B=c3s4$iZgC$AA!t>eoCZyBi+by%N^SL_h;tHF~1pbmCQ zi|%k=7fjZP*Vc9o&S2qE;uOnOoXn3x%$wowGgKx+>j$5_oMOT~45>SUhrDy>ND%$< ztLA12c*dr?V95a>OOE+g=4y|v5HLhH?0@qaQMsSslAeB9?CTkX(+rb$>;+>2+moTZZMJ%tJ=h&R2Vb$HOIIJ|%A>h}y{{=0x7Cc9lpK~C<> z>iv4l14ca(i9QyI5JOuM0!cUG{qh#sY2336?pG}D$X@dfh4I5%-2=_X ztp6LTN$tCFCf!$S{571?9{;LQt{raH&YwjW+>BR}egU!0H()>-wes>peGVc!; zx$@jFoiSD>mozR;h(PLxwm#YCQ=oP?v}InhZ^^9A(H%{XWGEo0m71USMpyeR)}CDpW7$`3re`OBcx$0#xL)6j_?TOhz( zR?}2n559SflhoU_$T83C!d=X4P`}5D$Ob1+dH;$YqUhNx`9Tme1NSKwXA+ks(fqr9 zVBzk}#M@|hIz_An?4Bs_3*a9K#HPWrz5#x1RFnvBeCgS!ieHyZN;DVI@6e10i;BS3 z!D%Vw&Eb_wJ5v8>WE$Y-wF#RDfxwKR!v0Rgeu|ywLYo!V90pZ}g zA@?~o0~t?c@G)L~?Oy)tV7R8nMO8Kps3=^TWxWWK6yQ*HjD5mbkD<&;u6%@~f9Od2 z-utD^nua(^zGn2hj@a)u9Zf!7BjQ?*KoxBKnkL6N-N*VnG7nw=10befKvy>gAirc1^w1GQhgI5S9D)3n3+@%bJ zz_s}{qb-2SgkDlIAscGzL60x~VCsbn(hHmPg78;rg@)eKXOIC55>X>ahh*@rI=BO0 zZKs1&S@CvmW19;Hb^~#WfFb$KI z^MH>t8ZuP7FDx*o5VbLCgCl*=q;(ToTvG@Hye@i>aZ(@;v8*0A`m~Ftx zFIGG;qvi8fT-}ux%d4=dDSx$)CocSRVbuYaB|?&~R*j{l_OCQjT1rJI-|O9aLBj4B zJz|d=bW-2KCh|Th_d$2IzR*ES`D)+t{{)G=_!me-Mkb?cZ7k^DNFpBkwu_6+`h~!^ zIA6Mqe1bw6ghjXn!4?)#V1;?>c#v7lB)~oa%8hLiQj9+_M~uI^&ae~X&iRE08a#VD1n`Hy$1#G;^YHiEDQf-xcP$Ej@ECx z5#wc-wfHm0Z7)D>eQ5gN->-NFH!Oaixnjd&s+^xW_4$H&2sOU#iL}b;;pWK1N`imn z$LniQe(BCKal-CT`{th^7TL<7(xnd-+cfs~GQsRACcd&D2l?PR5~z(*=$m^+iKISl z0bt+R8FXvHt{*>$WnWy|JTUB{Te0SpXF|-(`85{ve&D5d+(j-5?Jj!~_AN>YrfTQl zHfLOiyHduFO{+Y3?H{-hSP4;C!*w;Z73hO6JI(HXVnP=Q@7x=(sXo^Jyp@9Vl|RH( zISYO&+p2zjd~uea_NZ6C#!|iCB`?JHgU`~OR!)Lj!nwdZSI~z?9ePBU#vXy{-3ClmPK$O?+3;xHKuH; z?#h_~fmGngk10xl;iQ5^?ia+N|)P*m>!8C=j06@ie2R2wx zV9EJ6eEjUjo1>%RMRh95N)Mt7GIP_2YQy`=bw9vmd*cFr7kF+qe-qx5knMGU4uZGF zvwA(6I#R{Foug+A!vp@+Q11YV)w-P)tA?6 zg$-?f-i;?PSSo-u9ZiK`{k(tLg3s~Y*R^G<$KlP@@_oZ32P|{uDbF%rzgDE7AOc1} zM|*d&gDQS@&ZVmyuR^}VmT(H@MLa(Pw~U5l@zB;Pv#Uj(I?RurkBCzpRn3lbJ;J{T zP88U;h&aTG0+%v~hWTpxLk@9Ue{<61PG-Nh93-5fnMsuSl=6xQcqVS2d>AsfL7;t) zEOaMv?Sa(T=cs&G3KjYZFv)=wgW7%%-5;M!iz%g%CLuD(>#1>RJkAxdQ{#7)sa~>U zeNY~h?66~VJXJg_xhmnSC(uEMjITbi;dS1$x_kelZ4HaQr0`7RP;dT{ptG=~&Ye8O zM5RVKC&0MU5`x4(HMG7x?%AjJj-PLyj#;yu-3D}J!ppEXfVFMWStY3*?5C!@ATtaQ zS}dz}3(S(Ai*5)Dq@{m$fUm^?B{2eaK=c=ZW8Q*Y!PodWHP@y9fHCiSY(_pCtrRNg zuK#Nm!9GDl1W4%T4^%EiI5+x?b3AV89ei@(L%xlev)<38CuGM&%Aeih5=E$lyPut7 z#uak<@Ury$&Bu0f#|sKOA^!kQoP_<^saZOrObTOA9x8xF?rskw7!=S@i+1>;clZ37 zJFY`eXnA&4t|g&O0?~i}qw8_!i+xL6xf#o1qi8OuXQn>01V^e485BpM5yZ|nKT?rY zYIW*5t!vPr8%KS6!l)=w`rUZC9c5{fbD7Zh6DK^>Sr(V+UzB>A$fOh4;_30N?AON7 z#c<2|EKN$9m&xPj-}7B{e3jp_TOWPdMQh*UZu^waT}r7I%#DZ?99r^OTqyvWFa-o` z4z}y&63q)bCX~y|SX0&q66w zF%U|HEPn%>CKkfQ_VK+D;0G3CXH*`N$6E5c$fSyp z6+ve;^85|5)SXjcpLc}-B03_Se|i!>mPy30Z8kSQ#DuOhgGsP@y=ESE?Kl!=; z)Sl+&^Dn~(F`;pH48{4}6rD@OkK~TQc+m>%r57o@RS(Zy4d1?fOV10KC|s8*58-&>)+!R4xKhwIY;s#rdyx* z!x-l8k3+_g!b=dyB-iU5``+ZG2TglDe5h0(k(ffw9*uSKZbbP#6Jt>a zEb=fMQ90i;>_IIh)nzOFno%mh9XuFzZ1*^7yHBCds%K9$NFx{nJmDdr&0;VAxV|BI z{S&YligTb;k3)eoGpac9l9JsBWDVH28v(X@7NK^-1!3&+2ABeZK^9hk*@eKjBUq|P zwso91-;mztl;IBNoIX_P$T0$54>FQ!s@l9xJ;J0jryjwYH`7o%rI>V!c)BDZi7$VNbMy}NL{Uj!!Rt?viepBF zw#>1*Wy2@lAC3;s>RL;>7}j-G;SxzwtMjl=L=yVu`|lq=wb#~9JToWj59~Xz`%hrL zcfzaH{o_<^`{<*o4BVtMr&-yXp4=sd9SbN`Emtw&ZF&UXRbS^q;{o_fCbm>!IUy-( zy;m#6^c^by?@B_QTp7JxEjV?IIlS!5w=#33!37BmG*V4fLC3tn8{Gyf)w`A@+=IGf zDL?{S8Fm~mTs~W{CVbWB=_0wB5uF}bXpLN&%!G>X_W|02uk-&vdw86_kNOAN!)iwe z91W+rjHc9u`T5*>mWzBfr5n^HB5xQy?pWnSz$&{Cp7&?{XooO?G(Q@7R5oOV&(k%K zxwf~zsJ-bRRpy|F)g3ol)(xpu~q@ts`=A1iMkdx zh)e*F-9-S1pnY`wu%L(o4ZFwb*7O7<;+<`*MZ(_kwBV0N=B#9ZytG#N&C2*%DL?4j z7?E{b=bH`=wOMps31*}7=wFW~PIJL|*P+RN^m&)z>`96d5B*u%Je!ZG zuImS@t6d4Ex!15MFe(Zq?pxURANCFUXP*wXMm&zwz}jLVNxXYxL9y1I>DFvN5}~JtMlLeiRS< zR>|u+nAq4H?41d_hCL!4#T(}PTUwgqt9n&(>|_hQ%GSu}oIZqw)DVG6n(QM2jtN1* zT{szqsIo(g3A?iMAD3=0=7bR9@I@=;679jj0y&1DxrtFQ(*)ja9(fmwnYF>DIY_^B ziJ5)N-Wq<#r$-*&4kWi>3N3BQ*RQYQ+>N!*nD=hT?6X=;s#3PLjxKyo`a_#&3uDh_&rUiE!IQAT+b9!TGL z`S{A@{rv~F1_M(1!O5v~Xx%)Dkt*FR0s~&hhp^ExU9pDu=8|~cPCrd7ZD2>7z^+-h zHj?1FNeWqcEGHVcsBvovB1Vlg?h2^3L^^K9B!wz&aI|t=RmUhy)u5F=?&7*G@sMamw>~=d&&3fmr~tk7`<%<`fISX1pl-*Vq{F1toiB(SrkZ~P-TqB zC>LE^vxIdFXJ?fF#|AKd#j4nfin2KN%&cBhMy?J*9*^4&rCH>)A3hAdxOxTRpuZvZ zi@vfT6J{TRko3vCdwGT^fR3CFH)*{#vhurTrJyfa{i`a zNXEV6p!2DNzQ-#FmV+V9jpbl?U^y6=f9GKIPGLD1%{TrB2P5bZ%fS%)!@+RA<;A2t z+W3cq;a1C~e#!B8nm_slmuVj6%Ws8m!ARxI=JRSsKseB7B*4yjV&9wJ6g$OS35R|! z&2k^j>&qZ;l3D3JT^;-Q=+ACp-X&5-+aaB~48AHXzSQ6!x07|&mDkXSOys}sH%#&I zx{vke2woA#N6(+W0M0h~^pE*LonKbz5pcu)ZEVA3Wm`0OaXRe(Y41Iwnryo;(I6@c z2r3FH2r3<<_l}@Qs7ja6RC<@*!2(DTBsA$Fy-V)|1wm@0OG2nZ2oNH@!`#t#zW1A% zwdTh;KhIf97Zw(Io?WlK?|WanVD2k{de0xSLf>m~#x!uo55zH}7yvQPBcxL~q*xdd zPnT=xHRs^3 z!Pq^OsYTYS0XrAkM{^Gxvq?n`A4U~ZGjQ5#%2?zu)r}Se*4eE5i_xqYCKnyHCrP_&bjJf;0pHEW<>X0en@- zDR7^@20Fd31(TZqOWf?;I~6qYj7WdZ09F)b-PV~buCMaAvAF!yp%tKyp&t} zbqTKYc1f^p@&6I~$0sJ(Qsil+TF?+GTn~-DHsWAk_xmL=<#dB9Nh zqnJK;Ezaka9ko=3LMSy|5uEtON>?hsz1W?N0T^|f+{N>d#k%7(-KZEU2)NvEa)gPA zs??~18BMJn*U<>z*x%d+2#;4?Ta(@Wm9jKAwG-i}qMsb_Jcuk3{L?V z-lh5|RmL@W%Gp@?*ROT~2oVBg*Ml=BGTO?=l!HgdfP7=Kp{!Jz@v47(2a;NTs9rLs zj1TfIBjd*dkzrkd5!9GfRx)Ey9bI5C_^!({BbjSs1(*(=$TdST)&88X^k zl@NpQ!l7WWY=Q*r&?>%;Cy2Nzym-ubQo2lUcP7!N>#UH65S4fadMP|+>%8;X){+hF>vS6GDS<_41&C0FeTy>>_ML@2 zE<0Bf4VdKORsXAy87~5BEZXNTL@6qq?)4|l%PTeNfRK z9A3=8%kxy>a?3?!1w*x42G>v~i?skM0m$?h=^oV^q9OomCdjoA|K_9F;y?5F>8q2o zciXf<)e0g`Z=sw%x0~t;h05o5v1KZ%^@HtiuIxv4m|X2N)A?Al|E8q?5Q=F)-W<%$ zL+I#Y-hc~l5)tzHR@@YlfSaP2L?p%VXVHdBYu^wBk+Wj*_c|8@oUvpx6y~m@2LwnU z@Vq`A8JCN#UsCxv9+RJA%-q~+R6E#nUY47_5+vzqHv6`Sm=ZOCot{ZE5%j%aZE8yG z>#mo^dlUFG4hgQ+Tz|b_iPeu|B95Fr^Po8w!aVfEy8#*(D%c@%9lh=n@!;mzYWxEyDZxOo%I^G^ zHbq*np*K1SVcvgPzN`f6{31_lo(wGIl=(45ZPxz#_d`bS--`nkWeAD;;TefSwR^Q}yMif*$Yd5DeB}Wy!6?BBdw|h#9}I5c@tzdA=US!OQ=Mu@eoW`iNYM0>c4M zW(ziTBi!GF$v~OFa5ovBP6l5nv0#)6&p9sc}EBaAR-((xohKzOx088_V1V?pA^|L%Mkn zOp8WOQyy`Gt6R}GrBQx?jzP*6A-j$BeVY#7#qZOj^bhPRj0~5tNKa+%n?=FCSO^^k(h>KL}AOPLz zWtDOg^Z+v|$b;m$(rqFdb_sT}-c^Q-#BXnbDrDf)6{>oz&HQO_`WeoI!C+`;I)#U8 zN%N&#B?0YdgHW~lzGY>-_Tg7leBja1oy%9bS^?`{jRhB{WETo@wty%z1ccbX4m=|u zkfqli+2AZ~6*v$WAOyDAY=nmf5TxM&eUVmUhci~=kyT7Kawlv}&E}lYud#MiL4$+q zC4|6r*FOOtaSIIjy)k73)JvIZ>`A;kkF|Y&&D^duRQviGni&@z9<@}SYzwY2{*uw- z4l3>U@T5lm{`{l0H7I#$NJnG~<>LkBH>9+*lr#M9jW*VMbNJ~>FJM5%D8xNrP6d2B zO<)@qaSWM{khv~7Zi+?O*MM<&aq6>Y&VYGWdRoRCG&C~p)tD#~k(CF>=p2uTM}^s7 zDC9gGQ z_NbX|+R96Y-!3xU2Oh3Z`8RFeba+>;|BXc4Hy2JE5FQ21z$xBb{J2lRCba&h4 z%2Cr{0e9r7YkzjWuT9-G;(xAGn1gmqB<^$O@Ujx)SO-lQF>ZBkjkH@YOm)5e4BpbV zzWx3I9CkzgYy5ha`Os#|ROH51RG|N&G?*`6&Com90wcamPxe|LFewzZSUzfcR=)YW z%>VxV32@!~%tiXdCcw}H>Elta^7h$_o+2b46ILG52{N=2=^K4X#I^k|13F0(O0xIT z4!kh#zElgR#Q2o0$>FNZQ@Mdwa&636BsytamaOssN`18wzWwxy5y8J66>x>z-Fy5t z1kg=VD3<6^yi52w7~3TMS{cH~Sn(!|2FzY~5Dt<<)a{3b1B@n|2u(a^>T=9=k#qqZQyBQicU#T2BJ#V9069#qEQ zf8-B2MH(6$ydNAA0(l$Js6v17Tx%Pq&9sR0k)g+uixUCJ!vEKLkAET)HL)R&LjL$W z5540`Pyk9p==@{*S3DX31J*o$d1A~{rbWWe)(}WaSUlc+xo_-+p_!SynHdDa(r#LZ zsqa?_D7N4|f^daiG|3*IxIO9eB!ETD5v@_pV!x{ecHPdGX! z$L6`Ecnj1q)tmjVivN&7Mp8sDSh* zzRP~K&Uqb>PLuxFJu~3Ei96^pT|c_Q@bk>ATVCy8K`x0G_lEbj$+}1Qq|p*lACeb% z4jn2CdGsRA2LXaji)JmHm7qI6JL)+;x4Zk90Aly6s?p*9ZTcE*Dn;4)@BH# z8-0JHjstwPIv*CC`e9>D26*>Q{n#Z-erF7!#BZBvux*sOUEXl}vW9Iz1m={wc={Vmw8pW-;rxU=OZ}^ z$mujZ$4-I!m#R-)+#d+2Ggt^FUF4*GH#%CwLvWlcSD4xO-c9x?D=VbM9E_ZUd+JvJ z10`#aoV3Y+L7>Tw@|Wnb(S-6BO*v?337o#1rQCgE8VlP^R$gth7iX#|1_b%qQg+}AHe0aaNsJ}^Rl!BpmP{ntY=S|gP z3`WF8*OA^jYOi=%PPKwTuuQw-(~=j`z!c@HPTW|pfyb0F-O=v*@QTKB$5;xQn? zhP3V!;m9)U>$hU@rib5;J}Xpp3dKA4+O|kg#*q{Zrp)9+^>@LaWXl$%Vl&vaai zVjLcbynIQ5Izcr1Mn^446J(A_ZIs%KScES#cTJoYJxhAl^v(Gi8Y2e2{MVHecgL3N z*x$`{IK;*-)H$FUpqfJ?ZuRw5{e`i@{WegHIR19$!jIvLWMfok(E=UkQi^)j6=;9L z&tkBzgyGYNYszJ0B$v--^JEjS)MYZh+mjoS77sMjcl!Nas=Y`9;fsd-X@t*l}3?M7MaH0;SO+lkRU#)fNQBiv;5tQUW) z?vL2P3aMA)bR^xQEcp8ieGzVEC(H0zf-Wq6GZ!ZN!fdLHmnGfnuzd%yqZu3=i#Qew z6kru?XM--hGlsG7wCtZfC^mCm@4BCoog_r3?C#OGA|a+?>sai22s0&|(8fFs@0{3M z)74{0^T+p%u5{JMWsE&&7y5;?tNNxb>aOwdVQhB4+u*S_Ut|Iph=eZT@gCX|mFSr5 z?M>zGt~ESrPf5R_+TPZCC@cg@GDSFE#ZG!-KdSS@o2$m%?Ud2;ygzu*X(!vVKE~pJ z+I{7(rxArrXP{i5Xx)_;3}4GBDDWOzZ8lCTXp*<~sL&sL73@le*7yAotZ;9v!LO&M z%+Y&q#Co{LoxZ@_7W{S6YwnZW{v4mrwGc(=*Ypl+ZXO%tt^Ug=D{a#X0ISH9EZfEYO7RCi1;p*#Iq4{i^F!VO+M( zr;(+PtQJG|HP)p_LdTG+i(jU5OLkFiU(MPMPfDN#fl>A|H{#>Zv)pWSv}GsJSeC8r z&7W`mIJ6db&Zu2f|>tzGwwVa%kZaiq#A)#b~KQ{6<+DHTxK83Y} z$WynWGs;yP=AET!XqGc<^GqcL39H{JPW!hsr5ZJ|vX3Q>4PkWak4A77d#vRx{aMFN z@`}=vXjc`jjj-o4%EK%YFnr?Q{N9=NwqprkXxwmn{VNHk0#@}K3HXMxg z7X|hOXnL}ViRlk!o3)QBSP)u;TetPcs2RQ0)xnyV2c<}HAFsS@=odeFw1fC@lv^mv z@>5>ic(vT3bW+XpvA4&Xh;3%57W&p&Z?bW~rL{VDRgXuqSWE8CfL|d}3%%jWTwFySNDiMQ{xplGaJpKnSPK!ap-MqB&~Sd zqy&=&G2-VdmMuQfr6si|B2~>LCH6}UcBXPxlNV}|L6fN^+gyb!KH(QKCHt6n2b|)> znJ=HP%%4%H(Sr^ym#y}ir1NpIcUoyXD#R#oceZSP?a5({<(s8ARX6({gc_Qt`wrv2 z8c|M@hiBl1$;l3{k}rH@%11F#YQXhuU$LpB{v1lfEvdPugT0tnBHOzyX&*cfrN)<^ z-5r>{({qpYsNagf$H}?3KgLvvD28JuS-UDspc3^oXjtQlyd*2Gi~Tt9$k>w%ZE7rM z^P{?zKHymGPD~w^#%d+ht!FU&f?Qw+fvN6NKV=}dl{|EDmUe4Kkzeg)Y372DW-6w6 zNC|)KGg@6WT@SR$yccrXhb9cfrq#H{6OPvJ1ehdV{u_Cs_t8A{Az2ahXLJ2U zO`M+P%)`MC}Y5_p=~Qv zu(=tt-IF5p;*($2rwIzP_Vx)EM6npj~`Mh&XQHPo~p)fl;*Mnb5f~j z$t0S3Y5y>F;BIu6`Ff1pp-=`N-^Fu4(;ycqhEDm<`kpkbjE0w;jAW#3efO;}-2^#r z+XKDmck5zu0R9eiVD?itzD#9(Z{0qqrMa5Z;6}V~3ICARMpL#;aK&p0ZBo4}4EOKd zJLWEPXn0#DSMno$qHYE!S4r)UShCvI!>t6vhmR9@sKVQg^e_Qqvrpj17JXA08-PMQ zEG!t!$|-#>Zz_J+dlo}I$!*9{u-smjORF+?aB$)@h0EkJ1%e+|=;`p&%FE7>UVHC9 z5pz=$jmU`D^)^=d$J|R_=Ixn zoA=IqE8*E%oy<7FDnYjhH&+)q;)atn8n9TpD|tiyobFYNTvDI!MXJ?`J&_HHc__--5eS1K36=MjgD6<2ew_&FR3EdxWV9J5x+ct9K zrnwuST3q8MTB6#6#zlJQy%VqPsk^UlGtSn>c@3YKdTrm;e4dnFZK9GV)t%cPbHypY z+G2f`t`ZPET;W{lcPk7WX)2%JmXK&M%9!#&c~*(d(_K+**vb+^-#VTlZ9Mhm_h)}! zNYZR4%99kcQUd-MsT8-P> zFY-TVZ(vo~*5vj(`)USYh2bH_%jZJyV%&*IS*>*f1Iv&g?(~D@V_ay9fwq5s?*5O@ z0TX#l`?KKpr|hhU+YB-l*izjh?XDV~ioW1`((SICYmnA+Swv+nD-*gu$(ovYo+R(| z$KG@&Fv5kOFH~7?qO23{_ek^Rs?uno9z<}hI44d^3^c~AVCzMsZ#yB;PqtVQE zpQn%uc?%2c%dZ9UYirSx!s;0>`UZ}lk`!t8H~1WvH!zESp7a(R_g&K2em5$hu4N@@ zGp1aTmQZ2QAf+9q$6eNNX|I-x8nuYnXOHfnx4n9^eiQ+bZa397@~9wd21i! z<>bklPQE!WQ6pll?yh_9>6GbxyE9iQA5JJ*_BM@HXeOrj*KaqF>K?GVd*pJ}B5WnB zH3M7dxl?SOAJx2!O-t2E<-(IKh`V}-S~PPyUpF+)~H zu4X4x&`jmbo_l32x$P(g2|maD96L5tk_PH!kLT+zezjqAK`&mJU#ZjC9y8Vw9MIF! zn6?MZ35_@PT_NLh^fA%enrVLB zd&}>|5c2Hi0LvdIfSA2eH)!^$9uqM8_>Nx8=cWSF0rELO@G#$Ahv;9DgVY8yrNyT- zv0YIhwOe*NKK64}ZOSRQr&U!a9B&=#*4Eck{8(rERPJ_7oqxMKMZ!-NwxSOzlKxA> zo46eKq=bQ!d-0>X)|&>^oKolC#`jm%`)F*+gEHy3pI3W8}xc^x|}NG zgs>euoMiGVsVa7QI!cY$DIsBc{9;2ISiEW^c6Y4~CT)(;bF}fxUCu6o18YtVqhZZ~ z-}GpP4c6LjbuTf$)4S+jwEnT$_K%Z3%T@EV3J6#O$d@Y;@Qm zst|Q~nrRglTVI^pJLGDL6)8H{;^q72y>+Q6@3Jsw4)dPzDZM- zhuex7wG{Tt-yF)CXC0q-9CTJ7FH)}=sYut$BI5ZsD8dN_FH%^<7FsM^wF3fPfb!GW zW)3&r$nm6k$S@R@f27K{dGze;>pjP?X4t3Uk)(HYGNhDK?2`l_1AE%W(1iBD>3w~z2EczpRX$UHy}#rC<`pRDgP zI=vqr!njNF-QtY5_f%bo9??a!X+|xx>w?;l(A*e!x`mG)KH-sua|=bw+4L+h!yAOs zfcEIE_&!LFv%SvMau9txH85cQqyS%JZihEM$Xn@g@efed1;tnSpbNB5y^~#SaXDSo z>?~K1Kr{#gl>6xUD%hnS9*=$xfrmx(bW5+^_}BsyKX~T9-LkDQET%u zm%$ic3v_T2<22rBjMxPyyf=wCaMKH7#zL%ewXeJzU-aW=z~OP+fvAOyH7`Yt)%#Mo z8q%%3^$9KZp}}E>sQdWarN2RT#+=GE6Myz?tV#a6#=f8Tk%J1e$K1=pqnP(`A|sks zIhU}#Tz7N6(?-2PwhXc|WjepSP_k64rZ8B6mb278&)WAvGR*5O_VV2M(`^B!@>*tE zKSTOAHX`t9p1DI8s?n=y9V*!}nCrE%Ru6q+uRii^5UQCjs4sBR95_6jebp7~5HZl2 z{aK2jr#{YskfCYylDA`rK=?hfhistHaz1<|X{A?I)Ttp52$Ek-?#8?H+%H)rVFGKE z{j&uV-mS~>`vx@bvl2`ZR#itkiqhD>&49%L-{vR?UAXy`Yj%vgy-aNI^H4F2U!^+h zO82Ha%3oFfe=y6k%nto!o^@|we1l$t&!#nWs@QCD;WW1mhb5{lyxq%%YT9MZ} zI`EhAnXp(6*hd!0u1&4%9Zc z%(=>oT#B+`2^b5jbl6E*%|;!P>GSKAIo8@zx1A8h7!u7&>h94r+{EE5lEqlaQ(($#%?9^<@r(Y6q>i~0MIpa<`^;K#}q$}kRDFo6gq@(n*oQ)y; z4Rb7OwXm2DzNj~#D5w73;B2@Q3%+#X89SD*7%=W7xb;nZOHxZ@;of4UDItDZ-ApbT zx$}gyI{=&)FZmLZZkZ9TFip z5(s4aI#*V!!E*~~sBGYLNcgS$RJ%e@POFpDh z8B9T&qzdgQL0g)dm_xTM{YM{fX=e2vyCu3@LcRy+$V*9(JW`}f=Z@i(*x^B)sow!< z*>($ezqhoC^a#&9YF{sOr9D?kC=5Kw&o=*5A~p2HK!*#rJ&$OynKMk2Ko82w3?WJ` ztx+-(HPL(h%ztbKGw`~`L@LRe;vqRcy9i%zxl+=1LCVDG{jUu&`|({7S2`=YlPHD> z2kP=fR*U&0wY+R+a~Ht@kArp7+KquvT2P+83wjojw23SJ4| zNJaMKCm+o6~ zF1?{|po2n9m|;*y$4w;ME`{5=qN8IfM5Dk`8+_3`Qb&y-UUeSZ_|gH}tE(2lf)A|0 zT>=<2&$4Wzza>t$a-tj~evX^T($q4;#B&q!Ump10;xSwy=5S@>0%4@#-cmyr+1<55 zl>QSPBQ~&zoA!BCT{~vhuw_}=c#14lE%)*^ZoFt9%!=p`($7CIf=5Wt{9`lsVO4c% zPqyTs?hmKRNi*b}dny`N>TIW|pg_?zym?YXHr(y8VIE?|E8PJB87GRtF#jL zW#Fy3QbRbcqLtVsQ|WXy78X|RFnY%ZV=Yy?q1A34IC+GMapIl4)x|Hs|5VlwHhB4i zNO15GyLO%Qzlp)!U$9 zCHl?YCJKFV`!M)wf*E+hl>nu7AwQzywf>i_O^7ZIe4Pc)ev_#P50hi$3D3EF6MlFs zO>gR0T$W}6oHAr5T93&O249%WKfY~QyD1fmtN5Bp|9Uiu+kFCRmjs+w?x+y5MtPm+ zh%6w$3=QfyH6Hx*Do?B0ng%*L|B&3z+Z(py#!xZ{lQ(X;d#ST))97EeC5Z`ag z_{V0H-J6Nasn(ARvOD$-m!}+o;^Ia8j3ld@+-&Q!G4U|)F|~IOs#n9Zz91dJ0w=yeNA` zcJYMA)$Rlgw``Jf6NryeH8%w@qxWZ&@3r|>!|m^(s{-MNQ%YPfS@t3pArq31Sw;#$)+KDF)r zw(r`7%!$esu)6XeqtDUqA?poG71+3u(qwHRw=91p>PoNa=B36~HkBGtF(U`{h&z`o zMh=UQ8o5`-lM+f>qMdI}<69j}btJ0~-Sm0>)z7s!wW{$iL1AGtkFs;ByYM`}44!AL zs^zh&b=`j^pPN&h&E>klmc;AM49aK_K!pA)cW8TV%8Ls=8N~MlV$!NQ6#Y~3cBnZr zj7v8T4&lI1kpVq;w4>7#iXC7!Y*L1-4vQ0{j0|r7 zUkzcU2!-gm*?8Gl)pbG?>RII7&zWS+#LwcuBXo2u4HcVkYjpQS27HfE9Q^1n{MV6< zZi6KIQJsEF#jtvxWLY;(<`n}EZzV$yf!ZKM$7iHiZ464x1fuQI&pSrk-A6p0RMqvq zlY+g92TAev3cwOIgMJ;w%PVS_0nfV`mHv@$u?n+9oBB6io*jRcVt!{P!ON;L*+|v( zH4hhGv#k;c58I=W*Y%4KX^qASE7m+|hUxykRiDKf!s;>|eBYv12Td*`L&JgaE6*3{ zmu*X)1=+2KIZZ>==WxJx%*ktS#dE3@&$#xM|MWlF3Bf(g`lmwWPNhNaT|`dbP47-4 zYdIW2#9ko}?)M(2PTz%r^N-NxyHV;9@oKR;<(qn*eGS!ixp8WV!mN6FFjslFF*E0+ z*P$4b*W&%>MuQ1`a<$lO?VCbYeDB?MWHKsxwh0*Y=5fjm|C4~XSiiSc&h0{P9ul@B zPZ@E*A4A&u2Y;ZFvtXhpMp_(3{H%Hllht=O?$4FCM6{jx^2k7Iq(x?fju&3#zCi&8 zRTgx$!)xwEkJRf-Kj?g=6?AZ+#fr8wcRXII#tBy8mXz%#DX}s|1Nl88p!Nr`KDvH} zU%}R{sK*LP@9c8?^}!%G%#quP)Rk1sRF;g7tMdD1T%e;exPFyeQ&`jy({yhTp3_r2 z$Z6BL?XW6w(y(vxH-tnQjBPi+`oYKA?-r$kv*4 z2PT$LF4s68<5+0T6<_gY{eDxxUU-v+oNSMaUgFnN z5T&dCaTiEP8n>3D9;O%6XTsm2RSQcBo;V+Ed8nV9%JtDFJ6cO-KfCwQjAM#CAG|yD z?q;RjB?$iw(3kzK_H7V`f$z<8>&Y5dngXe*B&wua+v}Vt9L)X{hN`d4iPD}-w?)@s zr4dh?OVTnB&M`S9KoGr{jHbXh2r9_*9sd7FY+3-8Q)P}5w9`Iu>^sgI^J71FWyW!` z>dSa8L=m2DvT<`+HMu!%QiSP3u!5eLdr_J~=KBjjoG^z9-{nqCodx0t4|UBW!BLWQ zbQs3Wj#hwb@yE%X?8DAVXV%o9Fcv9X7Dy6zg@$S;)IIIPy6PM5b6cc?Kd>3T9aML(yQe*5<-Ea|>vS4YXZ;`0PeLh0A4q++ z4d+tc8W3!EaQRyC~kcvtiq6?B|L zZ6zWDiIil?0yY9;Gc^gQ&MpLzyB5J)@C;Y7nhYL4Czcbc>pS&1EFEY&-l-}3ICDF? zq)s26Q#oF^-IAo?UiW6CVuX`*$arIbX3Zz!b~^wT*Zlu2pRRf6;ruK%)=02L+bx;L z@k-;**8hiJj+RYQtQzdRPJkayj82yvIf6;AGw-Pc3gtT?8-vSbU=XQ zUzwmy!}gxT+|~3IyVgBbvBwGp8XaxwI=fR@s;NRAvY*g_=4irSO71JE@O+mu=%Aap zOiu#grTf3r7yL)l}F;nt$3A&>J3NtL$dgR zj_2FGD=>}r{B;qoEC~M+(Ex9cKi{m0_uJm}K*Vcp* zMprzuPC$@yuHB68=erDfPZU>Yqx83;S~u;Rq~MaN{Wo}<71~2 z>4O}ea?gaaIxHRiv9T4cQJTBmSlwQMM@a4tgkKT>fol?uW|(Hb-!l&B}6N%+*&|!L8PUJqqqY+%Ji;48-Tz_`Xiokx>R`dOmQb z;Bk=Qx0QlC-emX46BnakgmxG0Fe9DNNEnfj=z{H?B z^jo>jd?ofm-8bU|4E2Sg$5D_~5gT{lNV%Z!Gj|Q)b;7$9Us<&f`-A*%ez)% zvKH~fB)&uFU0)!&%0zVIw{<--_nTS3RPkmYEwpVPK_GOX_0)O}nkUJXQ2HZjjxZip zz?wx2?$)x&Dmg%LmT4(0n4Q)(czWRKb+L+*;D^V8SIEcLf_%Y;-etlx?46({C$i62}6NHE&p&U%mQ(^LNd%!HBZvMB;J_Okx(d`=ul6n{JWscv0?Jx95g>hVen1Z&Z&d9z#;JLITM;{jZO- z^(RlBERa%s)QYYLiato^TVrkAT&IrNb<7K@AaHOyyNOD`0r zgKis4oDi~t-y_viCxIx1{l9=$f3T1E>~)4U%9($fW8ECUWuz4a$-x&Sh*-q#5Qy=_ za;5A4|F8c;8bVLEmPSlEfqb03|LIN=_Al^d9Ic|OG0cpYLgfFNUe}f+B(<&M9ep!Z zX7ttmuzzspU)e`_h5TM@HhCCC@!;=wgS18L1p#X#cDz8$A@(l*2DAUK|5uVx8EI>N zf-*}J)eL33(Ek+R*@u7bdrgxo{FPwRXP+(GvgfVxQ@dHdO;jY{{PU;KNjWYRODsBO zl=)eR)rOPbj!l{3u6$F0u~u;%v2P4&j{kBBN1bo3Tbm!oZci)x1KtkazVDww_cA7)Q$Gynhq literal 0 HcmV?d00001 From 9af7b8ea0c94d157a764d586f24b7811a211d07a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 06:56:12 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=90=88=E5=9B=9E?= =?UTF-8?q?=E9=93=BE=E4=BF=AE=E5=A4=8D=C2=B7=E5=90=8C=E7=B1=BB=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=E6=94=B6=E5=8F=A3):=20=E4=B8=89=E5=A4=84=E6=96=87?= =?UTF-8?q?=E6=A1=88/=E6=AD=BB=E4=BB=A3=E7=A0=81=E4=B8=8D=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AGENTS.md:108「拦主区 Edit/Write 与非 merge 提交」→「与一切 git commit」,与守卫实现对齐 - process-conventions.md:15 ①去掉重复嵌套(同一判断说两遍、括号套两层),改写为主区一切 git commit 一律拦(含 MERGE_HEAD 态续合与链式命令) - .zcode/hooks/rule-delivery.sh:42(本机件 gitignored,主区直改、无独立提交)「验收断言须有撤销证明」→「验收断言从真实入口进入,禁变异类测试与撤销类取证」,对齐 AGENTS.md:117 与 test-conventions.md:133 读数(改完即测铁规): bash tools/run_all_gates.sh --docs exit=0【验收通过】无新增红;两个 hooks bash -n PASS;守卫 if has_commit 计数 1 / has_merge 残留 0、stdin 八态 8/8 PASS;rule-delivery 投递实跑 rc=0、新口径命中、旧口径已清除、输出 JSON 合法,临时 ledger 已删 --- AGENTS.md | 2 +- design/engineering/process-conventions.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 456dfc54..beba83ec 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -105,7 +105,7 @@ ## 硬性红线(勿违反;操作细则在 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 与非 merge 提交;豁免面仅 `.zcode/`、`.qoder/`(不入 git,主区直改);commit 点零钩子检查(pre-commit 直改闸已退役);合回 merge 点另有前置检查钩子(pre-merge-commit,2026-11-06 用户裁,见「运行与验证」首条);全量验证归合回后远端 CI(post-merge 钩子推送触发,见「运行与验证」首条);`--no-verify` 仅属用户,agent 禁用(细则见 process-conventions §1) +- 车道铁律(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) - **仓库根禁止设会话状态文件**(`active.md` 已废除)——现状看 roadmap「当前位」,待办看待办清单,过程看 git 提交信息,产出物看 `reports/`;任何文档禁止另设「当前状态快照」节,两处记同一件事必然漂移(细则见 doc-conventions 第 10 节) - **改完即测铁规(2026-11-05 用户裁,取代原「测试执行两入口铁规」)**——任何会话里的任何改动,落笔之后立刻跑一遍覆盖该改动面的验证并跑绿、读数写进这一步的提交信息,这一步才算完成;验证载体一律按 `tools/run_all_gates.sh` 的域划分与该件自身的直跑方式,不扩出改动面、不请示、不等点名,未改动的面不测,合回后远端 CI 的全量跑批不替代本条。读数类采集(MC/verifier)不在该域划分内,不属本条义务 - **红账不清不开新批**——上一批远端跑批有真红未闭合不开新批;假红(导入缓存、user 目录未隔离那类在册环境坑)走异常分级处置,不算未闭合 diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md index b105ab1e..0a268de9 100644 --- a/design/engineering/process-conventions.md +++ b/design/engineering/process-conventions.md @@ -12,7 +12,7 @@ 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 反而带不进去,改动只对本机生效) 2. **收口顺序(固定)**:**冻结 → 件核 → 并 master → 重塑 → 主区合回 → 删区**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先在 worktree 内 `git merge master` 解冲突(必须在合回之前,合回后才并=CI 验的是中间态);**重塑**=迭代分支(iter 形)合回前执行 `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 形免重塑免数卡)修复提交再合,落地复验追绿后删修复区**。批内的验证义务按 §4 改完即测铁规履行——改完即测自己改过的那部分,不请示、不等点名;收口顺序本身不设跑批关口。**卡片复核前置判据(2026-11-05 用户裁)**:需求卡片的 grilling 复核先于卡片提交、卡片提交先于合回——复核未跑完、缺陷清单未裁完,禁把卡片落 commit(落了也不算成立),`master` 永不落未成立卡;本条与 §2 段三出口铁律、doc-conventions §12.1「已写卡」凭据同判。 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 形免重塑免数卡),修复合回落地即再推再验追绿(追绿同链)。导入缓存刷新(.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/轮询循环。 -4. **执法分层(全机械,零自觉依赖)**:①`.zcode/hooks/worktree-guard.sh`(PreToolUse,本机件不入 git)——agent 侧:主工作区 Edit/Write 与主区非 merge `git commit` 拦截(豁免 `.zcode/`、`.qoder/`;worktree 内目标快速放行;主区一切非 merge 的 git commit 均拦(含 MERGE_HEAD 态续合;冲突/红态一律 git merge --abort → 回 worktree → 重新 git merge --no-ff))、`git commit --no-verify` 拦截(该旗标仅属用户)、iter 分支合回的一卡一提交数卡校验、规则闸(写 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. **执法分层(全机械,零自觉依赖)**:①`.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 分支合回的一卡一提交数卡校验、规则闸(写 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(子代理不经守卫层) 5. **会话单区(2026-11-04 用户裁)**:建区粒度=回合——同一时刻每会话至多一个 worktree 在役;合入删区之前,会话内用户追加的事项一律并入在役区推进,禁为追加事项另开新区。区内全部事项完成后只做一次合入(一次 `git merge --no-ff`、post-merge 一次推送、远端 CI 只跑一次),追加事项在合入提交信息里分列;无改动需求的事项不建区。合回删区后用户再发令的事项=新回合,另开新区(区名取该回合主任务名)。CI 红的 `fix-<任务名>` 修复区属同一回合的追绿延续,不另算新区。迭代实现批(iter 形分支)独占回合——其他类事项不得并入迭代区(合回守卫数卡校验本就拦未归卡提交),待其合回后按新回合另开。 ## 2. 五段流水线

tAh7GwYNGNYW9VAw|-6H%lM-y^Mrr2 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 z�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 WeNEdBQN+Im{*!|!Nfk>x_xWFGnl?57 literal 126929 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%0DrV|Q@Xb1&)H??9 z^6_bun@0q@k-Km7mo#3acW$oEb&afNQ&zTKYAPwQ8*k`rCBtCk(@Wk!8oIhH7CpH) zOKfl@2d1QEmGN4t$Q6syeS;-BGY<496_u1eJG8?tJkz31Yo8|zKH8xCakqctH#Nx@ zd-FmbmOy5)U;Gy@h)!OXPbj75T5Js=HDNB5h+;Jt`fZW8-mib#eQiBIMGdeSszd;7 zHYENoh3B-(T(#9Zl%eaBNID9vu4wBo!@fXnOQ7m}AWd|1^av;teg2HMbpaZw3AI$j z1;&oL7^-3SwhN+RD_iVQ_(sRQiKJPh)uLBR00wKHOqE*Fz*De^T51Psd|E`O4jZ7& zIwD^*h9Rq`Z=x$~*EXpUrCFj|s$Agk1zSQHKg&!$ye(&tC-noK^ufu_M>PuO#|-5R zRG7OXMP~B*>_LQl0qMR+_iDHMy6-Wfn>Jix6^*U7-*;%idlh)@v^ITx|9k*pSof;2 zKu*NY8}|Ovn1OS~dg=!j3XD_Kf7%7GiFBd@WCAD;Io6NQf`!aW`aI7my7trMiP4x{}{lvlAJhZk0($+VGf8YF#6euU@*K!@pD0R#o-M>x+a!2Nq~U^jx&{{#OM z$qsv3I`Y;>3fwe!c`4#JwQ#o1#mgt`0wzj5Sw6?Xi40eWifWaHCw*3g+xXYbQ5G}m zUTO@Z^u7})plfQ;7UZ>Y8`&c*)QE3lvVsJBbe7)`vsTZfx2o^qaGfA4z+3_?3VRs@ zpH71=MIpNB|bqJCqd zr`OWVWjKc@(du)kX6KlE4V!Jyxv)gKicHE#TLxi~>eB5iiF8Ngd;&@?W-^ec8=ecd8t--_HX&f!%h-9@W zi3CsnCl2&LyfV}Z$WW2q2iw>P$L=^zqLPJn<| z_;8X0qsi-I>y{|KZt^L{ihbMG?o`G4qF21^i3^@c0(rn39=tG*T_6njolcwJ0{?yo zj4=WN1Ruzcz|F(nEKe9eE|%no?ZCY7iKez{8=ixGSt!}m`B1r4tC=2 zj&%P(MG;SPbl-ydOHY9;3Noygotx`A$<6esXwd)b%MX}qsaB%=$18XuL;|#zX&=NS zxmQ=7q6>Qv-_T-~e|2>Q3|uus+^L^eM*uZL9x>!USTFQP6g*TMjaHv9u1v&kL~Qontj};d7Km( zwzeJDetrTVmV;f(eg?9XA9`nJXPqiQZR6~!R^)Y|#NO?#J{-#+0&!oWkFXwiUpRyfM;(OJn z<1+UigK?33$_86(B;3*8zuI%W$?FL=X<>GwX&7Y!-~g~*f3eQX`OZj>{ zmF{M#+S%{$!mnjIa(bDo!@Oyv|} z)A#KvJS0TZkc8?%nOEIh#LexzsVc9i*tffANPVm$L{QhNE_1+3Sa=Z-L!atDZ#)+d zt!vgQXK6P7<S~Ymkc1+>&|1(HuV2h%56LV4A2XMH-nY#wF~})#bXh9F`2bExcn_jnbw2 zp2_O&-sQkXN}6Ea9qZ+_ibn4wfEOlRpVD`&Ufd4umyb1%^P9FpE~ShK@I+n_gAC*X z$JTK~(&EI*uF*R1e6+WBbn0Ch<)bbpkR43r$oI$URXpB@H(PXWA}F!Akn_>6R{lO^ z#!;Gg$MW)Sm@GX{joP(*r;xG8C&H*D*wzu!{H+IwigZiyJ+O^u@Qo&0fHVJ2%!@KO zSL+wlEQh|QhWB>l8?Bxfb$2<=b##xrOxcN2b@-SntxdAOexJ z;Pr*3me3`Ov4${?7O$`5Mo)ba?%+9)}q!%qOgW@!|!RhL^qT~*Z@r}x8W zWX@L5TlaPTBClmbTxH{5&&Q>6>U&gvujuC^W@i#ln|#|}&&-o>UiS6AfZ{J&yvydD zY5|-geJ!-X{-855pRA#gjvCrmcM(rs^Er=ncubwfecSf>_Cfekx6;u5_^5j8Lft&) znq@|yuC(+SS2iFeJc$CNgi&Q#AB>doW82Yw8Q^a)NvQHyfq2&$sLaf!?x*@U)b*r3 z<;=9&CiR!Bhal5Iplz~2J-vJgDs+t5sxHAJt7xrK>Tyn_tgWq9O`7CS7RvBRMEsdW zfs|g2n7EvHUTsi5sdRve`X^BKej=KcK0HJ_7*0pfIq%(F;=x%|Fiqgir(O_?AI zMOjjkJ`fWCmUxk!{bnX=jqvV1CS7WeQ!z0yIhl9Sa2CG4ed!&fVPZDE)#W2tyt9!B zDL*-sccG)B8)N!HgDAln!g4atDwZs*_!v)@HY>{{RNx@iVZ9HX07fl!GSBTjki0lN zUw*G-9Ffu#2pZuh13Xsmq=w6Ws)BWwUOu9!Y3ISAI7xq0QuJX~jOah_x`>sl|fAn%1k_ zmvh{xZybc5>p!V!K)#SpuQ^SgRD*al9;aZ>(soUgBa;)8Gj~yS^_yUHGEXk?U z2W`|+a)KY*WE6!BH-}0{HCffAZByxJY4eFlIDVM<@YtLlsALORgU$(|VZECAtS@%r z`!U9CJbU@a< z23nTn6t`Vk9FmYLWj*cG8T~t8#!GoaRjwCuc-9lkC=E)VQ=b^MEqOcsq?BzhZx-BI z3k0e)HU~{+M+)rw+Fv{-2?$9ZL*sYf{=o^r9^)h__|z~`P+LTQr2;`Ih2Ct_Bt_r5 zs-T)=+#j|s7@!lpm!!H)XJTk9-&~VB%bz>c@j@O)*6>AeEGW3x;cyhjUMA_f4;3cg zC6w@a6ktEYZxC%gNtOspD4e-})VfyA@AYwFqG~@UNU2$)z@gSy%K`p^Zr(qz_$S$= zD$~X-XGKIr47sfow33EstU8R)Rt!PG93bSI8u#@-8ZyiKY%{;=9=+TY>h(YY<)D^C zRLU_4chT#;Rw5-uxvWg>HC;>lEAS`y-w;5gCQe>9H|T*byN05+f}*x9T+Fo%Td_cx}b`iU!5(dYNOG#b=X&gu97?w*Cm~!CUk$>YJI7p@5uOal8 zsQ{mz#~F|=7KEQ%4&M8wRH-xND9mBLqM+QRK*_19O2Pzb-3MJ* zgS!0r>7v?d3Fzz#o?D1wN?B3Ap2l1p>J47I+R#zKF3&!$MSj5Ajoj@7DC2~m{Uy2B zJ|dm1+iJ?nV1jG&^6_5({5t%LPcJ0zol(&g~$PWOgR3``N;LluFgZ2 zjN&|ruu@%hnx`cg}^zg-e!C=$uD6iYnVO499;zt_CzU@{V~nv zW=^cnp^Z}v{l>6fZpQpmTLtUl4WA5#u1aQ+PtrjDeHWR+!!5xm`8w%5t(94X7uCuw zOXFA0M-r8g*US6(#v^s~S+K1ynml&sM{Irk299kR?#uq@4eefO@@0 zAjO{O2VA?_xq1&e3bvE?OYqZp2=_lmAWyTlNbO)YDP43IMl7C68_M|NFGO;$m9PjM zywhTH>GKDvYUtt3{QfCu}O^#l)H=Drk|)!5JB%v+P;>`3{F-<`u=XZ|*ZG zLJ1%iR+hbO`?lW2>!-K3$BKZyd(fk-o}iJZM&w~1GFb%1&{g9T08$nRk17^(PRiW5 zk)gK_x2&)(Q;_o8DQ(yq+XFWh3~4?bP!ec4yB{o0IeXl8Uz%^$@)NfJy!wt(N^)=b zIy^1c{t!1=PB6Y;0tuV>#>*UDOiZ0Exh8a9FxUi@{zU2M^#eJ3W%Em$zDKM?y|n;% zqY0&KRvG22;8E6L)(lmSQey}h>MB+V-pndUES@RP$*uvy#Lyi(Cq_obR*Q)YhJa)p zrdn0QEVc0wLs4kdyf;&eAHUUpGh(RV6-{yDPrmSr_TL{2M0LfRpZxiXM?tuTO!!1Z zB|4vHR*=2QccG#dll`Saj{?}Xya(5`piw?PrC>-1kMQ>gWTk0yxb{fT-_O4}c})tMe!=w~&KM{ZxpTmyfTuQhT^NjV|HP!?+FBlO za7k$pVX+)9p@p3CFf&xW)C^E~Uv6Us$Tlwnw_oZceF2$kw^U?`3WW~YB`P?97R|p; z;J2fjrhSVga2ozasZKz3=R^^omYdIL57v#jYHG$1z_v4oOaPgzv0!$_M4@m!SdqFb z-VYOCYH5=#E{rgQYL|J8mx%gd+HB|&S~L3|M@EL&f-sxy?u|m3370@@QRQ(vFdpBn zH?VF#!$&-zI~*CEl}QfxkPMvO)(GmpQe2uQ(fY+(5pCo3pYED$B+}gnWy8$Q>Av&I zusurrWR?VcGOYD=cNm2TiUrNR;lGPVl$Cd8l5+hU>6fnD3*zjKLf*J&L~(br*YgWx zo*dPh1QI}q`K~_Ze;y4;PZID@g;nyLMVi4ph^?93k^>Po%9-S%Ab(^9f4;8Yb4+v5 z=ko2Nv*>NYqF;H!3@(F(yytDc&QfKJ%v~uo-*(f~tm(L`p!Q;UcL-_qcewlGfcY2c zGcdngo>h%vT6HzaOi{$oQezFjWDGYZK%4eG>Tj4SR2c?uoyOyQDlx)c=RC-3Ua)=LK*NX!c%oqJtOiE^OnPE-ndpG6o(>TwN+ zz#ZVpp(qMvFkCmjQp6;yl#O1gULwXX6(1Ex5g9r7jG3xnuaW78{X{+1?hH9o#;I`A z?87QN!+?}4XS)6-;ddMPp?V%1Zkn}p)QnGcGjAoF?LK@w-6!7-H{e4+_x;}v2oI0> zj;wBfL^>b|W`4;l($m*<<{jD5`eJPbEiHHHFD{QVQt1BTV(Tj^6A;#oMnCMsm-a=; z+PQ6tGo54#>`CnL!4Z$=uduW1f7rxL-k`5=$De0yW$n_LP96$`rW0S~JIc3Q5<-p; znvuIgWU(0_3KhEH55&|6Oj6&+DSHc3o;|k*wo2!AW2^rJnE6hiSzX@2*&nIlp%7w; zdZ1ITnK!$!kjnTp+4<*=MildSG!X{c?xQdJZA`aL^3OPC1U5G)AvoiI_@$eC58R6} zZZqMT=DPcwCu%{wyStG3OwEEE z>F*GU@b3evpcsWEpK~MulHJF4LR>o!$RuX3u`6Bn&Iq9=B2N$uFA>D4Naof@e6=g8N@7~L#G3naf^KvIT*i2i7wXj zoc4o*10A~pct++Vc$1OEv4f%k@H${>Wd>Mf@Q_nP5w4l;VFXh14&Q;gwDO&u$`yC zU-WR=)5Fc()h(f5ITCldbg-?~DzEAFmT8OpuwsbQcVg2iN#0K`wdo9A$oFC>l{Kb3 zfidvZ8wZW1<3e_Qr#ZRl@rL;SyJGeZY=fGe3R9|WqEJ?!$99cTa_ z5WA-Tojn5SBMw}@&42g_()6++^V0VA5&^1%fiK9wjz<>>rSk-5YX$8l z4%pfbEPT**K6uQ+;yZiV>u@%gXk^z`(O7}2W|gdGX= zaX7qc+>Ats-^SZZE~}-(i8}rcjm=5WnwllzZocrU|&DHg{8-Ty6 z-}8(5Ot~ch7kt*3irtn)f+D1%qWbkA11sy7Phz9u?>LBFb67nCR*i8J=brw@cSuQK zRo8d`LgLxgQ^ICmhT_=U!|vLdMUe5tNP77(0UD2xWo(+RVZ{iLK`)+^{c!z0Lq6T6 zjkp2csWM@36JfG8ue^R?L{4L(UGx#3YC1lf^E}?j?eA7H$=jxn{1D>4v67 z$O?RY80tf%TMx)MT<+D$K%+p&>W8n@_5Z;O*OKwODp;$jlIX~iHYRt9;@K+mar!o7 zPEZ+RNp*}BX)y(`8E@F;#&!orY4d+a;|>4IqT#?y-wA9Gtwf+vAftF66Ui&GwM=@8 zbfifb0sSFJKB5^V6B3i(U|Z(MB?CY3aoE!n!C0FBsb%uBnTfy89!w{k_kn-%f0hxOLGlqRYb5io4`F(fCA2 z&e(jkx-fF!iP%O$0y~^TTsy&cC&0xf!rBH5k2VH_dBfpHe8tazBj82o4V$37szw5j z&64NDNBM8yqQRLE8!6W-g;xkX3(sI{oI;)S4nk++A`mDC$+^3H;$aiA$da<2Z!EYr zU)>f4ZDOFp?*M@64}ffCIs>@If~$K#`T`jQTE;d^MNLmc`0=3)z^o%Fm4jv;VDY|A zXE18xe?1K9u3+NP+htI*oR~WN2H&S}ZWgD@hhN~WS4xaK>>TV&+~67lftG7>>*)=? zM*iB>gFm%?r)aEqvQr9Ql|o<+P(vY5LolLjhyLBC^c7OTKhamSkk!0>`$}+&53~@M zdw%_TXJC*PkRBBs?Z6+L1W%tr{$;6Q1!1t5LC}~COuiWe;{YE7!>e;M2qvo*41#Iv zl7>L3#6uV!qv)IfVKXSWzbtmXQBc6~rg0$#s6wgY0<8;f4Ch^fzD zO#N`j#0rpxA|%G=KXoR;vP0XNgrQL>%ihowBtFIL0FuAqrIeA<25H_vwza`dDX2QM zT6H}nxMx`7K=+eI7HaoCP|pC?@$6s8wg`zB?;_0)>-<5>UI7^ZMuiWvaQthSMJoKB zi-uPOpx+3bsmYD4v!gC6u0UHAR0YTY4GiUU_Mf0UrnBh1Sz6hw-?+TY^jq4ma&jIL z!i!`pPT)j@PW`Z+t^N86TuN8LXe}OCb~0GaQj@=}2ZW#w&bN=U08*sm6UDP~7l0f) zM%7F{&xoXZ$&tQh0sg!ZkuS5E^((in3DA}qdfLhFrc$bQ?Q37dLy;9c*S9BdP%?xn zVNueTE4yjmnZ~EM~F> zza4%%^zZ$bJN4y|1argE8HNyYoGmRmes;$Oj!DB+uakePUhe`YoyeK^g7X-tUi(So zFx;qKQ!QREyLykqFPjeVq%yPgMuS;NGyRE5IKSlpkqNA?SjbFDWR2$KLnIT^`VH{nl|jRIDdg4RFnQR2oP#bP>iX`k+I zzy$U;zS8vL{DqOAVKdFnc@+TdNi+5utoj%(g4|`?m;Z-IErzOk!R_yS())v;GIV^O z2UgGrH*<-9nStaxN%@@CtK?~)h=v|F2Z)jTlk;zG3V;jp?2ZR;7gjj6u>c;}ksY^Z z7hYp|T2@j2*mcRZnD;N+w7^ymK=KOj`K3(#ncq%%d#lo`7BFbNE+5YME;QVQob<`b zZ85OB`{swM{8Uum`qA*>FAMnBs@W3&blxvk@Grr+g{o5AG@X6a@UuYIxh%8oj?w!; zfHK%N)GfSSFRV1W8(AVOnZ}~!J*|M z9V*WYXq-;@FA^-ZZ!~HEU={VmUVgo%d$obpH+l za7w!Pli#D+L794Pa;a)373(Wp7vzKwts z6a7*5(1{qli%2JkMrHdEO$zrgE_tubX(s)23!KnVQ9sU>3tQPqN0w8DGKM9HfiY9y{DU|O z`bI;F_>hd!l&dkV2|vduaii-^q4~0=eg4V(x|*FVM9ykM`N6GYl|6^SI@!t?s9gRI2-RqRih6WgenW3lea`2Dz7NePeI$7GFe(wSfS^&p zQFV13Pw!ocW|X#9wt9ebrEk-ERX*9)&Q7&w8|ZOu&9@BSCq($Y&Ay(e=rkx&5`}Uc z3GAEXJ7d#KQ`5}mb)QMY2njiLwDE4Y}WhK|FbvHlfc@xw=0R2b3njV7CO7>#{Q-Zt*)JW(tSZ`QMdr+R(7NPdN+?=ASn& zjFJ@w;1MeBmH4fJ&+bB)!Wqg|Hj`7X){QzB9$<`lw(eY||9{ zep>$fub`VEsn67!>&}kv)J3(!dO<;dS1fqq-u%@OQ9;nnQNGD;-g>rYW{PD#1I&^F z>SaPxr5*XiRVa;MF{lxu5jcIH!Xu39i5uCPF%euH%F^rJmOQ^FF`8xxD);sE3{EA* zf*!jwZV)Jt76US>jNb zDjmfFCnd8Nx-Tj?8b>T=lVpjLK;k9=qwSgw_hg)pi;hRC#Z&qIuLLqzSB*OraC_`8 z|Nanga}P5Wch?lxsXm9NMVHm?Do^>7Su}Ox^QJCgX)YP)o-G|X?-A3sz10!J_;>`YN;kK4z$rPYW-=cam}J)J(PSD;_ZXZ#x;H>0^0$w?u>sPpO7jmc zO2MF&n4AEdu`TBBX=kZny*4+~&T?;mzhK_gJqZCprWlUd4KtN@b&Y!*AA0}U5+D)> zr0>ku$|OX*M{F+Z0kq*a{54dR|I7?e|I7?&&pJS9vRe4x3nhe-tB3}=HZLv#xd3Et ziYck1)k3@$W#ZJ9Fp#diWy!0F(hUd&AN`OopxJXr_%*p<7I>Kiw40YPwU&Ntxkb6+ zODO$BVDCOh%M#iRUf(=Fv+s8Fcxb4Q|HcLI>Hg!5fJH)fe0 zoKgd@S-{nc?${EM&@6X5XXm$ejID{rWsEF$B=TnPua_ta>ZM2tvW4WL{ll?UcY{r8Qd%c3O$*f z@Lb!X`2Uy)8p3=3e(zsp}OT(V)kH6!nK!-wjMyNMQ9D=o2&V01T>L(kO7sL%zQ)%{bmu zU%>+c#l;KVox}^pd~rY)erADRdJfVyk#sW2%Yh1akG)9$liZL0AGu!->EQ_uK;xqPvsj2?VG5TThl34oq{apR zB{kj|{-@M9M!ot2R)GxvX06{+<38m#QsY)t20mnzzBBeWtHnN|kqA_`LK;c$wK@eu z#U{90Gdms%zL1ANL&&C>GOh*OvBGTLU|1S_1WM-?_V6q_0mIf(5G?=XB2a$&#R*tJ zny|=t*pR}u+z9*aj8ZgGIB4ysdcgf>BC~uW2fNvrFG_{1tZRh)LDKbS;rkd6FR+Jt z{%1KK7Gw{VGSlM5;=DV))_9(R>zgqEXV9nIGhb&VW&OwngV4t3eD)p>ZVP%qLG&fd z+5ivujO@2Va(|QoK_dh#-Jd$LFBl?YO^)F@vQqvX<5qR}a2;6%fEcN3fP$l*M*&at zdXb9y0ErXeT~>Bh?#kd-9J0!KWX&CdEYEvqW8aU&wbEjFG&^`4;DV|Oh4sok)+>R_ zc-{v@+*H>#A1eoWip^}1O&NdVC5-5~ksNj|W-pGFxo`VkcNZuel5)B*LVc^XrYG8pgXNgf&n_FbIow)CU3vBH+JfZn~yE?55jExa3`AciCk|#@QDy$t}vNt;^X{YBX z>h)KB2vq;$qX00e_6ANN$}62wdVQ3#CII)h6l=g#;HMi71*XiLe0a#Y*cc@ztEblp znE2(=B3tx8Li0`|pyd3>)I7?TxbOmi^(}i3jmKC*xynIZfK?(6!UFepKS&X^06G-7 zZ$Du@e7imKz+bgfPu@Qz8R(lA@fuYH8p#WB|`L_qZ`A$l9YEE`)0>QzuGJ9fPHH1-mM`a+;Hx1IuOxya>va;RN zXBB=_e8C3}Bpg_m>XQV?r8@D#&Qa1OS4@u%4PlUTFYlE(4Hi*h8E|o()VtY4I zDvW=nRoYmy1OG~^a@gT%l>`ZpQn`SqRmULRFiwlOH@Un^sGKkj}Fz;%%8vo732^7SmQ*EKCceX!vNFi&o+>F;9!P?*52+)8{7Hn z`LkBA^a(fxW7hdDJ|g11vJ~jmQcqr7OPK!5nP=b<^-dFp;s{4Z{>F#LIWP} k9}EUn{a;~ghRjz&+@3vqi5r_Ix4?f=5IM185&gIS3rQ_w$p8QV diff --git a/game/tests/golden/windows/board_L3_deep_underdark.png b/game/tests/golden/windows/board_L3_deep_underdark.png index 7380c11972aa5fb7fc0a7b68dae7654a80cef181..76d6a2b49ad090733f806954fd3fd087a3aaeb6e 100644 GIT binary patch literal 126520 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 LMz~Z^*XREN{(#=- literal 116834 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