iter51-卡4:卡④(迭代51·L1深度3混编)+批收口: (1,3)大地精行退役改地精+熊地精混编(行序熊地精在前/行值整行复用(1,2)/(1,0)/静态骰和3)+表注四处+七测试文件换锚与补断言(v1-v6/逐行求和口径/池模板两键/白盒抬GP)+全仓hobgoblin零残留+产出物两报告+独立验收审计报告(终判通过)+审计缺漏订正(level_shop:1484 bp_store私取迁移补落)+master并入(封印印记素材批零冲突,冒烟绿)+S13基线正规通道--refresh记键收口; 受影响七套件全绿(table_guard 83/round_flow 136/level_shop 195/damage_controller 50等)

This commit is contained in:
DKChan committed 2026-11-04 05:08:32 +08:00
1 parent f9f2cb2d27
commit 7f512aa8b6
26 files changed
+468 -84

No files matched your search

+3 -1
View File
@@ -117,6 +117,8 @@
### 3.3 雷 / 封印印记 / 数字格面像素化 ⚙
- **封印印记已换代**:形 = 环+十字法阵、纯黑 32×32,形与定值见 art-bible §3.2 与 §8.2「封印印记源档」;本节余下面 = 雷格纹样与数字格面。
- **要什么**:格子样张通过后按冻结参数出全套砖面资产(含图类型换色板组)。
- **来源**:⚙ 脚本管线自产——未开/已开/危险格/变异纹带是扫雷专属语义(角嵌纹样已不存在),素材站没有对的;砖面**纹理底噪**可 ♻ 用 CC0 无缝石/土纹理作脚本管线的纹理输入,量化到色板(混合路线)。
- **前置**:§1.1 格子样张通过(**未跑**)。
@@ -162,7 +164,7 @@
| 站桩石板地台件 `scene_stage_plaza.png` | 近景地台独立件(art-bible §6.1/§8.2) | 源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定,不吃 `wall_ambient` tint;连续地面层在其下方,先保留 | ⚙/✦ 自产 |
| 特殊技动画终稿 | 并入 §2.3 三档意图动画,不另起体系 | 攻/防两型旧口径由三档替代 | ✦/⚙ 自产(同 §2.3) |
| 连锁坍塌显形演出 | 连锁展开触发时的连锁演出 | 与音频方向同批配对登记;「坍塌显形」=连锁展开的玩家可见名 | ♻ 粒子/碎块改色 + ⚙ 坍塌结构自产 |
| 封印特效 | 该动作的呈现名 = **封印**(art-bible §3.2):**施印瞬间特效 + 印记常显形态**两件 | 印记旗面走封印黑 `#000000`(现行封印色,色史归 art-bible §4.1);特效走运动+色相(现行取法——明度分层不动);现行占位 = 封印黑「旗」字形;印记常显形态可与 §3.3 旗面像素化合并出 | ✦/⚙ 自产(精灵+粒子,烟尘光点可 ♻ 改色) |
| 封印特效 | 该动作的呈现名 = **封印**(art-bible §3.2):**施印瞬间特效 + 印记常显形态**两件 | 印记常显形态**已落位**——`seal_mark.png`(32×32 纯黑,环+十字法阵;形与定值见 art-bible §3.2/§8.2);施印瞬间特效**未实装**,仍缺(走运动+色相,明度分层不动) | ✦/⚙ 自产(精灵+粒子,烟尘光点可 ♻ 改色) |
| 弹道/退场等动画密度 | 战斗表现输入清单,方案未定 | 样张锁动画方案后启动 | ♻ 通用弹道/光点/消散粒子改色为主 |
**现状**:三关舞台背景层与连续地面层已交付(2026-10-31 入包 `game/assets/art/scene/`:dungeon v10c / underdark v10c / deep_underdark v10c,均 1280×252;共用地面 v12b,1280×100,按作者裁保留原亮度 L≈0.132);小石台件已在役。
+15 -14
View File
@@ -1,6 +1,6 @@
# 美术圣经(Art Bible)— Dungeon Sweeper
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.37,历次修订明细见 git 提交史
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.40,历次修订明细见 git 提交史
>
> **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。
> 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。
@@ -22,7 +22,7 @@
**原则一|预告上格**(取自 Into the Breach;锚定 P1 推理的掌控感、P2 规划的延迟兑现)
继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格内绘制优先级固定:**数字(含色牌) > 小人标记 > 旗 > 变异纹带 > 装饰变体 > 底色**,任何元素禁止遮挡数字。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡数字〉
继承其格内信息分层与"攻击预告画在目标格上"的范式:一切威胁、伤害与结算预告必须直接绘制在雷图格本体上,禁止只进侧栏或悬浮提示;格内绘制优先级固定:**数字(含色牌) > 小人标记 > 封印印记 > 变异纹带 > 装饰变体 > 底色**,任何元素禁止遮挡数字。格面类型预读 = 类型微光单通道,色相+明度双码(色带见 §4.2、键契约见 §4.6;徽章小图标族保留给库存与结算明细;类型微光为底效泛光层,不入遮挡栈、不遮任何元素)。与 ITB 之别:只取其信息骨架,弃其冷暗军事色调。验收:目检〈预告画在雷图格本体上,任何元素不遮挡数字〉
*范围注:本原则约束"已存在的信息往哪里画",不新增信息种类;预告类信息以战斗侧 GDD 实际定义的为准(如 P2 已锁的结算来源标注),GDD 未定义的预告不因本条而存在。*
@@ -38,7 +38,7 @@
格子即地牢地砖:未开 = 覆尘完整砖,已开 = 碎裂裸露,雷 = 被惊动的巢穴(格态定义与玩家说法见《排雷玩法》),图类型(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框架》「未开格类型微光」节)。验收:目检〈物件级装饰与逻辑元素形状隔离;装饰不构成完整凸形〉
*设计测试:当新图类型或新变异格需要新视觉时,先换色板加形状,再谈新资产;当格子多样化与"好看/有雷"之辨冲突时,砍装饰,不动逻辑通道。*
@@ -46,12 +46,12 @@
> 立意:扫雷数字可读性与暗色氛围相冲突,由一次格子样张测试定风格,具体形态由样张测试定稿。**样张** = 一张按本圣经参数画成的格子风格试验图,是砖面形态的定稿闸——样张通过前,§3.2/§4.1 的一切参数只是候选,通过后冻结为制作标准。
**样张内容清单**(一图齐备,缺项即无效):未开格(覆尘完整砖,含至少两种装饰变体)、已开格(碎裂裸露,含 0 格与 1–8 全档数字)、危险格(被惊动的巢穴)、旗、小人两态(独立占格 + 与数字同格——后者须验"边框高亮不覆盖文本")、图类型色板变体组(§4.3 四槽换色,至少两套)、数字呈现组(已开格底亮墨直画组 + 复杂格底色牌后备组——素底/装饰变体底/变异纹带底至少三种格底上各一组数字)、已开格结果表达组(纯安全格 + 至少两类型物件纹样)、**类型微光呈现组**(至少三个类型的微光在纯砖格上呈现——样张为静态定格测试图,非运行时行为承诺,实际可见时机见《HUD框架》「未开格类型微光」节;含两两相邻格微光并列;微光格内零角嵌/箭头/加号类附加图形)。验收:目检〈样张图含清单全部组项〉
**样张内容清单**(一图齐备,缺项即无效):未开格(覆尘完整砖,含至少两种装饰变体)、已开格(碎裂裸露,含 0 格与 1–8 全档数字)、危险格(被惊动的巢穴)、封印印记、小人两态(独立占格 + 与数字同格——后者须验"边框高亮不覆盖文本")、图类型色板变体组(§4.3 四槽换色,至少两套)、数字呈现组(已开格底亮墨直画组 + 复杂格底色牌后备组——素底/装饰变体底/变异纹带底至少三种格底上各一组数字)、已开格结果表达组(纯安全格 + 至少两类型物件纹样)、**类型微光呈现组**(至少三个类型的微光在纯砖格上呈现——样张为静态定格测试图,非运行时行为承诺,实际可见时机见《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 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下旗、巢穴纹不与裂纹混淆〉
2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;明度差(墙亮/空间暗)与碎裂形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下封印印记、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉
3. **焦点预算成立(§3.4)**:任意一格至多一个完整凸形;数字所在格无第二焦点。验收:目检〈任一格至多一个完整凸形,数字所在格无第二焦点〉
4. **图类型换皮抽测(§4.3)**:变体组中数字墨亮族三档、封印黑、危险红、奖励金、小人蓝、数字色牌(后备件)、类型微光五组恒定不动;变体格底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体格底仍过第 1、2 项〉
@@ -59,7 +59,7 @@
**整屏样张闸**:格子样张验"格",整屏样张验"屏"——战斗屏/关卡屏/菜单屏/营地屏各出一张整屏样张,验收四项:①全部文字(含菜单/说明/tooltip/按钮)对其直接背景 ≥4.5:1(WCAG AA),大字(≥18px 或加粗档)底线 3:1、目标 4.5:1;②明度分层三档带成立(信息面层 > 世界中层 > 世界底层,层间灰度可分);③整屏焦点预算(§3.4:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉
**战斗一屏样张登记(合并提交 3b66d1a6)**:战斗一屏样张批整屏四项机检全绿——抽样读数:文字对比最弱 5.34:1;舞台底 L0.036/已开格底 L0.089 落两子带、间隔 0.053;首焦=数字区高对比能量占比 59%;名字行素底牌平底零地台色。样张整体过闸待方向稿目检先行(真人检测,登记于体验验证清单 ㊶)
**战斗一屏样张登记(合并提交 3b66d1a6)**:战斗一屏样张批整屏四项机检全绿——抽样读数:文字对比最弱 5.34:1;舞台底 L0.036/已开格底 L0.089 落两子带、间隔 0.053;首焦=数字区高对比能量占比 59%;名字行素底牌平底零地台色。样张整体过闸(方向稿目检已通过,凭据=体验验证清单 ㊶)
**样张现状**:格子样张已冻结,冻结凭据 = git 提交 7a847c7(机检报告)与 §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 亮墨三档直画 + 色牌后备(值见 §4.1);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉
@@ -164,7 +164,7 @@
- **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三
- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且砖心留白;巢穴纹更凶一档〉 ←原三;P3
- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。验收:目检〈微光格内零角嵌/箭头/加号类附加形〉 ←原一;原三
- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记;封印色见 §4.1(现行封印黑),格内优先级栈位见 §1.2。封印特效(施印瞬间 + 印记常显形态)资产归清单 §4 演出类;封印印记纹理已落位(现行件 = `seal_mark.png`,32×32 可选件),数字字形占位已不存在。验收:目检〈封印印记呈现与封印黑一致,不侵入数字字形占位区〉 ←原一;P2
- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记。**形 = 法阵**:一圈外环+环内一个十字,十字四端顶到环内沿、与环连成一体——两层构成取法阵通用骨架(外环=圈定范围,环内图形=力量图形,非指特定作品):环=封印圈定,十字=钉住此格。**画法纪律**:纯黑实心剪影,禁细线描边、禁符文字形——32px 下细线会断成碎点,阵纹一律做成实心块面。**尺寸**见 §8.2「封印印记源档」条(本处不复述数值)。**色** = 封印黑 `#000000`(§4.1),无发光、无描边、无渐变。**占位**:印记居格心,最外沿不越格缘空带(见 §8.2);封印印记只出现在未开格,不与数字同格。格内栈位见 §1.2。封印特效(施印瞬间 + 印记常显形态)资产归清单 §4 演出类——常显形态即本件,施印瞬间特效未实装。封印印记纹理已落位(现行件 = `seal_mark.png`)。验收:目检〈印记为环+十字、四端与环相接;无发光与描边;最外沿不越格缘空带〉 ←原一;P2
- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边〉 ←§2.1;§4.2;P1
- **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈墙体无尖刺装饰〉 ←原三
- **高墙瓦片体系|术语与定义**:未挖格 = **一整块 32×32 自含凸起岩体**;素材语义名——未开格素材 = **墙瓦片**,已开格素材 = **地面瓦片**。瓦片以自含岩体为单位,Tiny Dungeon 拼块套不进自含岩体定义,不作瓦片参考。验收:目检〈未开格为整块凸起岩体,无拼块接缝感〉 ←原三
@@ -173,7 +173,7 @@
- **高墙瓦片体系|凹角收头**:角点单像素落线;南立面侧凹角加 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,让位于数字/小人/旗);原三
- **变异格形状通道**(双通道之"形",与色无关):底砖圆角外轮廓不变,砖面内缘绘一圈定宽专属几何纹带(纹带形全作不与他类共用),砖心留白予数字与封印印记;验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入数字字形占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于数字/小人/封印印记);原三
### 3.3 UI 形状语法(方向指导,细则见 §7.1)
@@ -181,7 +181,7 @@
### 3.4 主角形状与对比预算
显著度 = 完整度:**每格至多一个"完整凸形"**(数字/小人/旗,依 1.2 优先级让位;装饰变体贴砖缘分布、不构成第二完整凸形——§4.6;数字色牌随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算),底砖与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3
显著度 = 完整度:**每格至多一个"完整凸形"**(数字/小人/封印印记,依 1.2 优先级让位;装饰变体贴砖缘分布、不构成第二完整凸形——§4.6;数字色牌随数字一体,不作独立焦点;类型微光为底效泛光,不作焦点、不抢完整凸形预算),底砖与装饰一律残缺、内凹、低对比而自然后退;危险用刺与缺(排斥形),收益用满与圆(吸引形),同表预算、此消彼长。焦点分配双机制:**完整度**(形状,本条上文)+ **明度带**(§2 明度分层——信息面层恒亮于世界层,焦点天然落信息面);明暗只做层间分离,层内禁明暗竞争(不靠明暗抢焦)。验收:目检〈任一格至多一个完整凸形;信息面层恒亮于世界层〉 ←原二;P1;P3
---
@@ -199,7 +199,7 @@
- **棋盘数字呈现 = 按板自适应三态**:暗纹理板(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° 禁入带与全部微光色带;未开格墙顶明度 ≈113 对纯黑对比 ≥4.4:1,旗杆米白保可读。旗朱与封印紫已不用于棋盘封印旗,红族棋盘侧只剩危险红;人设背包旗 = 旗朱红矩形旗,与棋盘封印色脱钩(人设侧见 character-design 背包旗条)。验收:机检〈封印宣告色 = #000000,未开格墙顶对其对比 ≥4.4:1〉 ←原一;P2
- **封印黑 `#000000`**|封印宣告色,无色相:玩家的宣告"此格封印"。封印现行 = 无色相黑——紫色与微光蓝族(魔法微光 256° 等)色相冲突,黑色无色相天然避开 300°–345° 禁入带与全部微光色带;未开格墙顶明度 ≈113 对纯黑对比 ≥4.4:1,纯黑实心剪影单靠明度差即成立,不依赖任何浅色细件。封印紫已被封印黑取代、不再用于棋盘(色史归 git 提交史);红族棋盘侧只剩危险红;主角随身背包件为朱红矩形件(人设侧见 character-design),与棋盘封印色脱钩。验收:机检〈封印宣告色 = #000000,未开格墙顶对其对比 ≥4.4:1〉 ←原一;P2
- **危险红 `#A8321F`**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉。验收:机检〈危险语义色 = #A8321F〉 ←原三;P2
- **奖励金 `#F0A828`**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金。验收:机检〈收益语义色 = #F0A828〉 ←P2;§2.3/2.4
- **小人蓝 `#2E86DE`**|小人主色:棋盘唯一"己方",与光标准线同族。验收:机检〈己方语义色 = #2E86DE〉 ←P1;§2.1
@@ -215,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`(状态槽底)——已随 §6.1 舞台背景插画批处置完毕(2026-11-02 迭代 48):源常量已删除(常量表零键),背景资产接管该绘制面,程序化平色缺图回退改指 `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)。未开格底槽(含全部图类型)相对亮度 **L≥0.30**(墙顶面受光档)、HSV 饱和 **≤0.55**、避 Boss 禁入色相带;已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),旗面、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底 L≥0.30、饱和 ≤0.55;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9
**对比硬指标(可测)**:数字可读性由**格底明度分档**承载——棋盘数字亮墨 **L≥0.75** 对**已开格底 L 0.08–0.14** ⇒ 直画对比 **≥4.5:1 恒成立**(WCAG AA,样张逐组合抽测冻结);**色牌后备**:色牌素色恒定 **L≥0.70**、牌上数字深墨 **L≤0.027** ⇒ 任意牌墨组合 ≥4.5:1(实测样例:#33261B/#F5EAD3 = 12.3:1)。未开格底槽(含全部图类型)相对亮度 **L≥0.30**(墙顶面受光档)、HSV 饱和 **≤0.55**、避 Boss 禁入色相带;已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),封印印记、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底 L≥0.30、饱和 ≤0.55;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9
**色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限 **48 色**(防色板无限膨胀的封口条款;**额度已用尽、余量 0**,后续余量以色板检查器实报为准);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部 <8/255**——即三通道里至少一通道 ≥8/255 即过门,「三通道差全部 <8」才算不过门(条文原写的「三通道差 ≥8/255」有「逐通道全过」与「禁止全灭」两种互斥读法,前者下现行色板 247 对不达标、与本节自认的「现行即执法」合规状态不能同真,故取后者;用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。反例实证:#3A2E22 ↔ #362B20 三通道差均 <5,肉眼不可辨,同板共存只增噪。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(色板检查器按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数 ≤48;新色入板过两道门〉
@@ -420,7 +420,7 @@
- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ 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
- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地板纹理原样 + 灰罩压顶**——纹理直画后 `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,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉
@@ -513,7 +513,7 @@
### 8.2 像素基准与画布
- **缩放纪律(硬规则,按资产两类分级;不做个案豁免)**:
- **甲类·文本与语义件**(数字、图标、旗、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。砖面 tile 不属本类,随格边长整格铺满(见 §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 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉
@@ -522,6 +522,7 @@
- **画布基准(暂定值)**:
- **主角人设原图 = 48×72**(1× 基准,暂定;与站姿降采样可读性验证一致);
- **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」),32px 源档的去留已定终值 = **保留 32×32 源档**(沿「独立小源档」路线;N=12 板下显示占位上限 27px = 0.84 倍,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销;
- **封印印记源档 = 32×32、显示 1×**(甲类整数倍纪律):形 = 外环+十字(形与画法见 §3.2)。定值——**外环外径 23px(半径 11.6px)、环壁厚 2.6px;十字两臂各宽 3.2px、四端止于环内沿半径 9px(与环相接);圆心=格心;最外沿距格边 ≥4px**(该 4px 空带归变异纹带,§3.2 变异格形状通道)。纯黑实心剪影,单图像素域色数 = 1(底色透明)。改形须本节与 §3.2 同批修订。验收:目检〈件为 32×32 单色;外沿距格边 ≥4px;十字四端与环相接〉
- **站桩立绘显示档 = 三档绝对高**:小型 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 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉
- **站桩石板地台件**:`scene_stage_plaza.png`,源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉
@@ -536,7 +537,7 @@
### 8.4 帧数规格(样张冻结)
- **帧数规格(样张冻结)**:待机循环 4 帧;攻击/技能准备 6 帧单次;受击 2 帧;死亡 = 灰化+碎裂退场(§4.6.4 语义硬规则),序列帧归 ✦ 缺料清单;帧时长与结算节拍对齐(预告时序见 §4.6.4)。验收:机检〈序列帧数与档位一致〉
- **方向集**:棋盘小人=**4 向**(下/上/侧,侧向左右镜像共用一份画稿);斜向移动/挖掘按**主导轴吸附最近正交向**呈现,不出 45° 斜向帧(斜向信息由位移轨迹与目标格预告承载,ITB 实态同款)。镜像与「旗面恒画右」纪律(character-design.md 冒险背包条)的相容归属:棋盘小人默认镜像豁免、旗右纪律限立绘侧——代拟口径已追认(棋盘小人朝左时旗面朝左,与立绘侧「旗面恒画右」并存;画稿维持一份 + 镜像,零新增资产)。验收:目检〈四向帧齐、侧向镜像无破绽〉
- **方向集**:棋盘小人=**一份画稿+左右镜像**(现行资产=朝左帧两态 idle/walk,右向 = `flip_h`;下/上向无独立帧);斜向移动/挖掘按**主导轴吸附最近正交向**呈现,不出 45° 斜向帧(斜向信息由位移轨迹与目标格预告承载,ITB 实态同款)。镜像与「旗面恒画右」纪律(character-design.md 冒险背包条)的相容归属:棋盘小人默认镜像豁免、旗右纪律限立绘侧——代拟口径已追认(棋盘小人朝左时旗面朝左,与立绘侧「旗面恒画右」并存;画稿维持一份 + 镜像,零新增资产)。验收:目检〈侧向镜像无破绽〉
### 8.5 结构件完整性与参考核验
+2 -2
View File
@@ -27,7 +27,7 @@
|---|---|---|
| 格面资源徽章 19 枚 | ◐ | [art-bible](art-bible.md) §4.6 |
| 关卡节点图图标组 | ◐ | [art-assets-checklist](art-assets-checklist.md) §3.2(正式 UI 设计未成文) |
| 雷/封印印记/数字砖面全套 | ◐ | [art-bible](art-bible.md) §1.4/§3.2(前置:格子样张) |
| 雷/封印印记/数字砖面全套 | ◐ 封印印记已换代(环+十字法阵);雷与数字砖面仍待格子样张前置 | [art-bible](art-bible.md) §1.4/§3.2 |
| 增益状态效果图标 9 枚 | ✅ 已接入(2026-09-24) | [art-bible](art-bible.md) §4.6.1(候选原稿:状态图标批 2026-09-23 远程出图,归 candidates 档——路径描述性引用,归档纪律见 art-bible §8.3) |
| 营地场景图 | ◐ | [art-bible](art-bible.md) §6.2 |
| 字体(全局 UI 像素字,Fusion Pixel 单套单字重) | ✅ 已定稿在役(2026-09-27 接入;2026-10-24 用户裁现状即终稿——不另接拉丁专件、不上第二字重) | [art-bible](art-bible.md) §7.4 |
@@ -38,7 +38,7 @@
|---|---|---|
| 受击反馈 / 死亡表现 / 顺位标记 | ◐ 程序化演出在役(受击闪白+打击火花、灰化+碎裂退场〔禁瞬消〕、顺位徽标 ①②③ 程序绘制;帧级素材未产,§8.4 帧数规格候选) | [战斗表现](../gdd/systems/战斗循环/战斗表现.md) |
| 连锁坍塌显形演出 | ⬜ | [art-assets-checklist](art-assets-checklist.md) §4 |
| 封印特效(动作=封印,两件:施印特效+印记常显) | ⬜ | [art-bible](art-bible.md) §3.2 + [art-assets-checklist](art-assets-checklist.md) §4 |
| 封印特效(动作=封印,两件:施印特效+印记常显) | ◐ 印记常显已落位(`seal_mark.png` 环+十字);施印瞬间特效缺 | [art-bible](art-bible.md) §3.2 + [art-assets-checklist](art-assets-checklist.md) §4 |
| 弹道 / 退场等动画密度 | ◐ 程序化弹道在役(play_projectile 0.16s+0.19s 到达拍调度;密度终稿归战斗表现) | [art-assets-checklist](art-assets-checklist.md) §4(战斗表现输入清单) |
| B 区舞台背景三关变体+共用连续地面层(场景件) | ✅ 已交付(2026-10-31 入包 `game/assets/art/scene/`:三张背景 1280×252、共用地面 1280×100;地面按作者裁保留候选 v12b 原亮度 L≈0.132) | [art-bible](art-bible.md) §6.1 · [battle-stage-prompts](battle-stage-prompts.md) §2 |
+1 -1
View File
@@ -15,7 +15,7 @@
| `术语表.md` | 全库专用术语的唯一对照表——危险格/安全格/同调位/RAP/GP/真视等定义+退役词对照(2026-10-11 建立,v1.23) |
| `待办清单.md`(仓库根,不属本树) | 全项目待办事项的唯一登记处;各系统文档的「待办」节只留指路存根 |
| `体验验证清单.md`(仓库根,不属本树) | 需要真人试玩观测的验证项登记处(与待办清单分工:待办清单是"要拍板的事",本篇是"要玩过才知道的事");每条注明结论回流路径 |
| `08-Alpha版本标准.md` | Alpha 版本包含哪些东西的清单——里程碑 M3 的完成标准;只列条目不写内容,定义一律指路各权威文档(**已定稿 v1.26**,2026-10-13) |
| `08-Alpha版本标准.md` | Alpha 版本包含哪些东西的清单——里程碑 M3 的完成标准;只列条目不写内容,定义一律指路各权威文档(**已定稿 v1.27**,2026-10-13) |
## systems/ 五个循环
+3 -3
View File
@@ -2,7 +2,7 @@
> **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。
> **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。
> **状态**:**已定稿(v1.26)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
> **状态**:**已定稿(v1.27)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
> **成文**:2026-10-13。
## 本文怎么用
@@ -145,7 +145,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|---|---|---|
| 像素美术风格与色板 | [美术圣经](../art/art-bible.md) | 在役 |
| 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 |
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史,复核转正归战斗一屏样张) |
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史;观感复核随战斗一屏样张过闸完成,凭据=体验验证清单 ㊶) |
| 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) |
| 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 在役(九件已按档落位+机检全绿——原稿分辨率入包禁降采样、显示按三档绝对高 96/144/188 缩放、现有形象即终稿;定值单点=art-bible §8.2;实机目检清晰度与同屏体量顺序登记体验验证清单 ㊻) |
| 敌人立绘(全敌种) | [角色设计](../art/character-design.md) | 在役 |
@@ -156,7 +156,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
| 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
| 全局纹理过滤设为邻近采样 | [待办清单](../../待办清单.md) | 在役(迭代 26 · 2026-10-14 入库:default_texture_filter=0+平滑渐变件三处显式 LINEAR 白名单,翻转面全枚举闭合) |
| UI 字体(全局像素字,Fusion Pixel 单套单字重) | [美术圣经](../art/art-bible.md) §7.4 | 在役(2026-10-24 用户裁现状即终稿——拉丁沿用自带字形不另接专件、不上第二字重;信息层级手段=字号档差+墨色深浅) |
| 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 部分在役(规格半已闭合=目标规格清单已落 art-bible 五张规格表〔2026-10-30 合回〕,五项实装定值与样张机检随迭代 43 入库;未结半=出口未达——方向稿用户目检(体验验证清单㊶)先行,样张整体过闸随其后。主角+三 Boss 重产依赖照旧;站桩帧动画已改排 Beta,见「六 · Alpha 不含」) |
| 战斗一屏样张(界面美术的终稿闸) | [美术圣经](../art/art-bible.md) §1.4 | 在役(规格半=目标规格清单已落 art-bible 五张规格表〔2026-10-30 合回〕,五项实装定值与样张机检随迭代 43 入库;出口半=方向稿用户目检已通过,样张整体过闸,凭据=体验验证清单 ㊶。主角+三 Boss 重产依赖照旧;站桩帧动画已改排 Beta,见「六 · Alpha 不含」) |
| UI 氛围层与九宫格切片观感修 | [待办清单](../../待办清单.md) | 部分在役(光柱硬边已修=连续 alpha 渐变;未结半=九宫格切片错位——Alpha 内做最小修复:核对素材尺寸,必要时重出九宫格素材,全套素材重出排 Beta;出口=结算屏与图例屏错位消失,渲染闸+用户目检通过) |
| UI 元素细节修(滑轨填充 / 图标垫块 / 留白 / 开发件外泄) | [待办清单](../../待办清单.md) | 在役(迭代 26 · 2026-10-14 入库:①滑轨填充随迭代 25 注销;余②图标垫块明度差降档/③商店+营地布局修/④诊断钮迁调试浮窗 全落地) |
@@ -1,7 +1,7 @@
# 战斗表现
> 一句话:战斗动画与演出(旧体系未单独成文)
> 状态:范围草案(待设计);现行为 v1.2
> 状态:范围草案(待设计);现行为 v1.3
## 设计目的
@@ -70,7 +70,7 @@
### 前置美术测试是硬前置
正式设计本文之前,必须先做一次"战斗表现美术测试":用一屏样张(一张按候选方案画成的试验图)锁定角色剪影、动画方案、战斗空间三件事。这是旧体系评审登记的排期硬前置,不是建议;battle.md 也登记了该测试须按双舞台布局出样。样张未过,不启动任何终稿资产与动画设计。
正式设计本文之前,必须先做一次"战斗表现美术测试":用一屏样张(一张按候选方案画成的试验图)锁定角色剪影、动画方案、战斗空间三件事。这是旧体系评审登记的排期硬前置,不是建议;battle.md 也登记了该测试须按双舞台布局出样。样张未过,不启动任何终稿资产与动画设计。**该硬前置已解除**:一屏样张整体过闸(凭据=体验验证清单 ㊶)。
附着在同一次样张上的还有一项已登记的裁决(登记出处 = 敌人系统的呈现契约):敌人层绘制优先级的插入位置——白话就是敌人的姿态精灵画在绘制顺序的哪一层,会不会、以及如何与棋盘上的数字、封印印记、小人发生遮挡。它随美术测试一并裁决,不在本文提前定。
+1 -1
View File
@@ -125,7 +125,7 @@
> 布局为 B/C/D 三区——关卡进度条不在战斗屏(节点链进度常驻关卡画面,见 Navigation Position;字母不重编沿用 B/C/D)。
> 呈现术语注记(2026-09-25):封印 = 正式动作名(全库统一;登记册术语与术语表 v1.13;印记 = 封印印记,art-bible §3.2)——机制与键名不变;封印特效未实装,占位 = 封印黑「封」字形(棋盘视图程序化占位,现行代码仍为旧「旗」字形、随代码术语批换代,贴图在位=字形退役;旗朱→封印紫 2026-09-26→封印黑 2026-09-28 用户拍板)。
> 呈现术语注记(2026-09-25):封印 = 正式动作名(全库统一;登记册术语与术语表 v1.13;印记 = 封印印记,art-bible §3.2)——机制与键名不变;印记贴图已落位(`seal_mark.png`,环+十字法阵,形与定值见 art-bible §3.2/§8.2),缺图时回落封印黑「封」字形(棋盘视图程序化回退);封印特效的施印瞬间一件未实装。封印色史=朱红 → 封印紫 → 封印黑(现行)。
> 可挖域微光画法定稿(2026-09-25 用户拍板):**接触带·空间侧 + 蓝族**——光画英雄格周界接触面(正交邻墙=整边,斜向邻墙=角点+两半边),详见 art-bible §3.2;现行墙格整框绿相呼吸为待退役占位,实现切换归表现批(探针断言顺带)。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 223 B

+31 -12
View File
@@ -82,11 +82,10 @@ rows = [{
"level_index": 1,
"row_kind": "battle",
"depth_band": 3,
"enemy_id": "hobgoblin",
"display_name": "大地精",
"unit_count": 2,
"unit_count_max": 3,
"hp": 14,
"enemy_id": "bugbear",
"display_name": "熊地精",
"unit_count": 1,
"hp": 22,
"atk": 1,
"atk_min": 0,
"atk_max": 2,
@@ -106,6 +105,31 @@ rows = [{
}, {
"level_index": 1,
"row_kind": "battle",
"depth_band": 3,
"enemy_id": "goblin",
"display_name": "地精",
"unit_count": 1,
"unit_count_max": 2,
"hp": 8,
"atk": 1,
"atk_min": 0,
"atk_max": 2,
"pool": [{
"skill_id": "attack",
"weight": 9
}, {
"skill_id": "lunge",
"weight": 1
}, {
"skill_id": "desperate_guard",
"weight": 1
}],
"attack_type": "normal",
"armor_type": "light",
"armor_class": 0
}, {
"level_index": 1,
"row_kind": "battle",
"depth_band": 6,
"enemy_id": "bugbear",
"display_name": "熊地精",
@@ -883,12 +907,6 @@ rows = [{
; (设计文档 §6,快照后恢复基线)。验证出带微调旋钮序:L2 d1/d6/d7 血 22→20 → d4 24→22 → d9 112→108。
; provisional 未提交。
;
; 实体名修正批(2026-09-24——用户裁决,DND 阶梯对齐):(1,3) 熊地精双雄 → 大地精
; (enemy_id bugbear→hobgoblin,仅本行;L2 bugbear 三行熊地精系不动)。依据:①DND 阶梯
; 地精(goblin)→大地精(hobgoblin)→熊地精(bugbear) 与实测每只血量 4-8→14→50 严格同构——
; 单只熊地精 50 血在前、三只 14 血在后,同族每只血量倒挂的观感由阶名归位化解;
; ②「双雄」名硬编码数量、数量却是 [2,3] 变量骰——摇出 3 只即成「三个双雄」自相矛盾
; (用户截图实证),集体名(猎群/巢群/小队/大地精)为正解。hp/atk/池/数量区间零改动。
; M-3 迭代 5 判读锁值批(2026-09-28):(2,9) 卓尔 hp 130→100(杠杆扫描 C3 组合——Boss 杠杆对普通档 +4pp;
; r_boss 锚漂移加重 100/389≈0.26 低于域 [0.5,1.1] 下限,收锚裁决挂迭代 5 出口人闸;读数见
; design/qa/m3-iter5-lever-scan-2026-09-28.md)。
@@ -916,6 +934,7 @@ rows = [{
; 读数预期:(2,5) 场敌人 3-4 只(3=重击手 1+蜘蛛 2,4=蜘蛛掷 3);L2 难度带位移读数随 Alpha 收官 M4 数值批
; 统一执行(07 在册义务——MC 取证跑批届时另报批,本批零跑)。禁区排查:巨蜘蛛首遇位 (2,4)「固定 2 不加骰」
; 零触碰、Boss d9 零触碰、跨关混编禁令过(两敌种首遇关均 ≤L2)、既有 19 行现值零变更。
; 2026-11-04 追加第二行:(1,3) 地精+熊地精(行序熊地精在前)
; 敌人表内容修批 N1(2026-10-13 用户令「按推荐方式」,迭代 24 卡①):(1,2) 熊地精降档 hp 50>>22、armor_class 3>>2——
; 2026-09-24 阶名化解方案((1,3) 改名大地精以阶名归位化解同族血量倒挂观感)实机验证未达预期,按体验反馈重裁:
; 第一关总量曲线 12/10/50/35/72 的 5 倍墙消除(22 后曲线 12/10/22/35/72 相邻比最大 2.2);敌种 bugbear/池/数量/atk 区间零改动。
@@ -926,4 +945,4 @@ rows = [{
;
; 行键 = (level_index, row_kind, depth_band, enemy_id);row_kind ∈ {battle, boss}——battle=战斗节点配池,boss=终点行集;
; depth_band=节点深度所在的带键,请求落带取首个 ≥ 深度的键(偏难一侧);越顶带由 resolver clamp、跨表校验判为调参事故。
; hobgoblin 行为缺口行:无立绘、不在敌种表——留任在役,补齐三件套(立绘+语义模板+敌种表行)归敌种内容批。
; (1,3) 大地精行 2026-11-04 用户裁退役,改地精+熊地精混编(行序熊地精在前、行值整行复用 (1,2)/(1,0)、静态骰和 3);沿革见 git 提交史
+1 -2
View File
@@ -141,7 +141,7 @@ fi
# 豁免单新增三处(2026-10-26 令牌配额口径清扫批 B4b 用户裁定保留):adventure_table.gd:26 档名映射对照注
# +adventure_table.gd:93 与 curio_deck.gd:130 四口径契约④原名引述——合法载体非残留,改写即断链
# 豁免单再增 13 处(2026-10-26 口径换代批用户裁「带日期历史读数注释保留原文」):
# hero.tres:21/:36、enemy.tres:751/:891、action_economy.tres:15/:16/:26/:27、status_effects.tres:91、
# hero.tres:21/:36、enemy.tres:751、action_economy.tres:15/:16/:26/:27、status_effects.tres:91、
# meta.tres:48/:56/:62(.tres 十二处历史读数/带日期批记录)+level_autoplay.gd:560(完美档 41% 历史实证)——
# 历史读数原文锚定当时实测口径,改写即失真;现行口径描述不豁免(已随批换代)
@@ -219,7 +219,6 @@ else
if(FILENAME~"hero.tres"&&FNR==21)next
if(FILENAME~"hero.tres"&&FNR==36)next
if(FILENAME~"enemy.tres"&&FNR==751)next
if(FILENAME~"enemy.tres"&&FNR==891)next
if(FILENAME~"action_economy.tres"&&FNR==15)next
if(FILENAME~"action_economy.tres"&&FNR==16)next
if(FILENAME~"action_economy.tres"&&FNR==26)next
@@ -13,6 +13,7 @@ const RngServiceScript := preload("res://core/rng_service.gd")
const UnitContainerScript := preload("res://core/unit_container.gd")
const StatusContainerScript := preload("res://core/status_container.gd")
const DamageControllerScript := preload("res://core/damage_controller.gd")
const BattleFactsScript := preload("res://core/battle_facts.gd")
const TEST_SEED := 20260928 # 夹具种子(基建值非玩法数值——回放确定性契约的输入)
@@ -52,7 +53,7 @@ func _harness(db, depth: int = 0):
rng.set_master_seed(TEST_SEED)
var units = UnitContainerScript.new(db)
var effects = StatusContainerScript.new(db)
var ctrl = DamageControllerScript.new(db, rng, units, effects)
var ctrl = DamageControllerScript.new(db, rng, units, effects, BattleFactsScript.new()) # facts 构造注入(5.1 封装修复——hero_atk 派生读消费面;夹具空 encounter=表值缺省)
ctrl.emit_row_cb = Callable(self, "_on_row")
effects.notify_battle_start()
var spawn_ok: bool = units.spawn({"level_index": 1, "node_depth": depth, "hero_hp": int(db.combat.hero.max_hp)})
@@ -410,7 +411,7 @@ func _test_pool_clamp(db) -> void:
# ---- 个体池读数 / 个体 AC 合流(增益状态 v1.5——敌方状态个体化批)----
func _test_pool_consumption_per_unit(db) -> void:
var h = _harness(db, 3) # depth 3 = hobgoblin 行集(unit_count 2-3——个体对照面需 ≥2 敌)
var h = _harness(db, 3) # depth 3 = 混编行集(熊地精 1 + 地精 1–2,最少 2 只——个体对照面需 ≥2 敌)
if not h.spawn_ok:
return
var enemies: Array = h.units.all_enemies()
@@ -309,12 +309,15 @@ func _smoke_encounter_roll() -> void:
scan_bad += 1
continue
var n: int = settlement_scan.presentation_snapshot().enemies.size()
var erow2: Dictionary = _db.combat.enemy.resolve_rowset(1, int(depth_v), "battle")[0] # 行集首行(扫描面 = 战斗节点)
var lo2: int = int(erow2.get("unit_count", 1))
var hi2: int = int(erow2.get("unit_count_max", lo2))
var erowset2: Array[Dictionary] = _db.combat.enemy.resolve_rowset(1, int(depth_v), "battle") # 扫描面 = 战斗节点
var lo2 := 0
var hi2 := 0
for er in erowset2: # 逐行求和(同带多行各掷各的——与 unit_container spawn 守卫同口径,非首行单行口径)
lo2 += int(er.get("unit_count", 1))
hi2 += int(er.get("unit_count_max", int(er.get("unit_count", 1))))
if n < 1 or n < lo2 or n > hi2:
scan_bad += 1
Kit.check("全深度 × 12 种子 spawn 全域内(%d 场,∈[unit_count, unit_count_max] 且 ≥1)——空遭遇不可达(Bug#1 回归)" % scan_total, scan_bad == 0)
Kit.check("全深度 × 12 种子 spawn 全域内(%d 场,∈[Σunit_count, Σunit_count_max] 逐行求和且 ≥1)——空遭遇不可达(Bug#1 回归;混编行集口径)" % scan_total, scan_bad == 0)
# 节点类型 → 敌人表 row_kind(非 Boss 战斗位恒 battle——深度带批寻址第三维)
@@ -569,7 +572,8 @@ func _smoke_skill_pool_data() -> void:
"1_battle_0_goblin": {"attack": 9, "lunge": 1, "desperate_guard": 1},
"1_battle_1_goblin": {"attack": 9, "lunge": 1, "desperate_guard": 1},
"1_battle_2_bugbear": {"attack": 6, "charge": 2, "heavy": 2},
"1_battle_3_hobgoblin": {"attack": 6, "charge": 2, "heavy": 2},
"1_battle_3_bugbear": {"attack": 6, "charge": 2, "heavy": 2},
"1_battle_3_goblin": {"attack": 9, "lunge": 1, "desperate_guard": 1},
"1_boss_4_ogre_chief": {"attack": 6, "heavy": 2, "harden": 2, "quake_smash": 2},
"2_battle_0_bugbear": {"attack": 6, "lunge": 1, "heavy": 2},
"2_battle_1_bugbear": {"attack": 6, "lunge": 1, "heavy": 2},
@@ -608,7 +612,7 @@ func _smoke_skill_pool_data() -> void:
got[String(entry.skill_id)] = int(entry.weight)
if got != expect_pools[rk]:
pools_ok = false
Kit.check("二十八行九种池模板 = 建议池行值((L,row_kind,depth_band,enemy_id) 四元键逐行精确比对;L1 地精 9/1/1〔触发条件批+孤注守势 w1〕 · 熊地精 6/2/2 · 酋长 6/2/2;L2 熊地精 6/1/2 · 蜘蛛 6/2/1+毒吐2〔首遇带不投——迭代 24 N2〕 · 重击手 5/2/2 · 蛛化卓尔精灵 6/2/2/2〔Boss〕;L3 灰矮人 6/2/2+盾击2 · 钩爪恐魔 6/2/1/2〔触发条件批+趁隙偷袭 w2〕 · 重装手 5/2/2+盾击2 · 石君王 6/2/2〔earth_pulse〕——全部 provisional;三 Boss 池尾 +1 门控条目〔quake_smash/venom_curb/rockslide 权重 2——半血解锁收编技能行 trigger 闩型——迭代14④ T5/触发条件批迁移〕;混编行集同带多行各一池合法——首批投放 (2,battle,5) 双行〔迭代 18 卡⑤:重击手+巢群〕;迭代 35 覆盖批八行为顶档池克隆,逐行同检)", pools_ok)
Kit.check("二十九行十种池模板 = 建议池行值((L,row_kind,depth_band,enemy_id) 四元键逐行精确比对;L1 地精 9/1/1〔触发条件批+孤注守势 w1〕 · 熊地精 6/2/2 · 酋长 6/2/2;L2 熊地精 6/1/2 · 蜘蛛 6/2/1+毒吐2〔首遇带不投——迭代 24 N2〕 · 重击手 5/2/2 · 蛛化卓尔精灵 6/2/2/2〔Boss〕;L3 灰矮人 6/2/2+盾击2 · 钩爪恐魔 6/2/1/2〔触发条件批+趁隙偷袭 w2〕 · 重装手 5/2/2+盾击2 · 石君王 6/2/2〔earth_pulse〕——全部 provisional;三 Boss 池尾 +1 门控条目〔quake_smash/venom_curb/rockslide 权重 2——半血解锁收编技能行 trigger 闩型——迭代14④ T5/触发条件批迁移〕;混编行集同带多行各一池合法——首批投放 (2,battle,5) 双行〔迭代 18 卡⑤:重击手+巢群〕;迭代 35 覆盖批八行为顶档池克隆,逐行同检)", pools_ok)
var basic_count_ok := true
for row in _db.combat.enemy.rows:
var n := 0
@@ -688,7 +692,7 @@ func _smoke_skill_pool_data() -> void:
and String(_db.combat.settlement.core.effect_pool_map.get("fortify", "")) == "enemy_defense")
# ② 同种子回放逐位复现(D3 大地精,多实例同种)
# ② 同种子回放逐位复现(depth 3 = 混编行集〔熊地精 1 + 地精 1–2〕)
# 单敌轨迹不独立复放——轨迹取数与其它流交错,无法脱离全序重建;
# 同种子全战斗逐位复现由 ② 全对拍承载,单点定位归事件日志。
@@ -708,7 +712,7 @@ func _fresh_rng(seed_val: int):
# ---- ① GP 冒险钱包·到账 ----
# ② 同种子回放逐位复现(D3 大地精,多实例同种)
# ② 同种子回放逐位复现(depth 3 = 混编行集〔熊地精 1 + 地精 1–2〕)
# 单敌轨迹不独立复放——轨迹取数与其它流交错,无法脱离全序重建;
# 同种子全战斗逐位复现由 ② 全对拍承载,单点定位归事件日志。
func _smoke_skill_pool_replay_independence() -> void:
@@ -718,8 +722,8 @@ func _smoke_skill_pool_replay_independence() -> void:
if not seqs.is_empty() and int(seqs.count) >= 2:
seed_val = s
break
Kit.check("多实例种子可达(seed=%d——D3 遭遇 ≥2 实例)" % seed_val, seed_val > 0)
# 敌 hp 低(表值 6)时 hero_atk=1 十轮内必然击杀(实例错位、轨迹断裂)——
Kit.check("多实例种子可达(seed=%d——depth 3 混编遭遇 ≥2 实例)" % seed_val, seed_val > 0)
# 敌 hp 低(混编带地精 hp 8)时 hero_atk=1 十轮内必然击杀(实例错位、轨迹断裂)——
# 观测窗取 5 轮(5 拍 ×1 伤 < 6 HP 全员存活;仍覆盖保底 M=4 的触发窗)。
var rounds := 5
var run1 := _record_pool_trajectories(seed_val, rounds)
@@ -1105,7 +1109,7 @@ func _smoke_enemy_buff_targets_self() -> void:
var settlement = load("res://core/battle_orchestrator.gd").new(_db, rg)
var rows: Array = []
settlement.step_row.connect(func(row): rows.append(row))
# L1 depth 3(hobgoblin 行集 2-3 只——depth 0 单 goblin 常被主角先手一击秒杀,死亡即不动手、cast 不发生)
# L1 depth 3(混编行集 熊地精 1 + 地精 1–2——depth 0 单 goblin 常被主角先手一击秒杀,死亡即不动手、cast 不发生)
if not settlement.begin_battle({"level_index": 1, "node_depth": 3, "hero_hp": int(_db.combat.hero.max_hp)}):
continue
for turn in range(4):
+1 -1
View File
@@ -788,7 +788,7 @@ func _adv_drive_to_shop(a, st: Dictionary, autoplay) -> bool:
autoplay._drive_level(a.runner(), st, null, "normal", "min")
if String(st["result"]) != "":
return false
if a._bp_store._pending_next_level:
if a._bp_store.pending_next_level():
# 三选一停点确认(确定性选件后推进,与 run_adventure 自动策略同口径;TP0 令牌化)
if not a.stop()._pending.is_empty():
var bcands: Array = a.stop()._pending["candidates"]
@@ -41,7 +41,7 @@ func _enemy_rows() -> Array:
return [
{"level_index": 1, "row_kind": "battle", "depth_band": 0, "enemy_id": "goblin"},
{"level_index": 1, "row_kind": "battle", "depth_band": 0, "enemy_id": "bugbear"},
{"level_index": 1, "row_kind": "battle", "depth_band": 5, "enemy_id": "hobgoblin"},
{"level_index": 1, "row_kind": "battle", "depth_band": 5, "enemy_id": "giant_spider"},
{"level_index": 1, "row_kind": "boss", "depth_band": 9, "enemy_id": "ogre_chief"},
]
@@ -56,10 +56,10 @@ func _difficulty_table():
func _test_band_hit() -> void:
var hit: Array = _resolver.resolve_enemy_rowset(1, 4, "battle")
Kit.check("带命中取偏难一侧:请求深度 4 命中带 5(逐字不回带 0)〔fv1〕",
hit.size() == 1 and String((hit[0] as Dictionary).get("enemy_id", "")) == "hobgoblin")
hit.size() == 1 and String((hit[0] as Dictionary).get("enemy_id", "")) == "giant_spider")
var exact: Array = _resolver.resolve_enemy_rowset(1, 5, "battle")
Kit.check("精确落带:请求深度 5 命中带 5〔fv1〕",
exact.size() == 1 and String((exact[0] as Dictionary).get("enemy_id", "")) == "hobgoblin")
exact.size() == 1 and String((exact[0] as Dictionary).get("enemy_id", "")) == "giant_spider")
func _test_rowset_order_preserved() -> void:
@@ -75,7 +75,7 @@ func _test_top_band_clamp() -> void:
_diags.clear()
var rows: Array = _resolver.resolve_enemy_rowset(1, 99, "battle")
Kit.check("越顶带 clamp 取顶带行集(battle 顶带 5)〔fv3〕",
rows.size() == 1 and String((rows[0] as Dictionary).get("enemy_id", "")) == "hobgoblin")
rows.size() == 1 and String((rows[0] as Dictionary).get("enemy_id", "")) == "giant_spider")
var clamp_hit := false
for d in _diags:
if d.contains("warning/resolve_depth_clamp"):
+1 -1
View File
@@ -78,7 +78,7 @@ func _init() -> void:
# 账本保留(契约 1):主动件充能与每冒险种行入口零改动(单源化后=差额种行幂等——不吞装配)
a._attunement = ["incense_stick"]
a._loadout.set_attunement(["incense_stick"])
a._bp_store._loadout_seeded = false # 模拟首关 bind 时点(分派走 seed_for_adventure 分支——成员随断点件收编改址)
a._bp_store.set_loadout_seeded(false) # 模拟首关 bind 时点(分派走 seed_for_adventure 分支——成员随断点件收编改址)
a._loadout_on_level_inventory() # 种行(首关 bind 时点语义)
var incense_left := 0
for r in a.runner().treasure_inventory.snapshot_inventory():
@@ -724,7 +724,7 @@ func _smoke_level_graph() -> void:
_db.combat.enemy.rows.remove_at(_db.combat.enemy.rows.size() - 1)
_db.combat.enemy.rows.remove_at(_db.combat.enemy.rows.size() - 1)
_db.combat.enemy.rows.remove_at(_db.combat.enemy.rows.size() - 1)
Kit.check("混编断言段注入行全量还原(表回 28 行——迭代 35 生成图深度扩面覆盖批后的基线行数;首批混编投放基线 20 行+覆盖 8 行)", int(_db.combat.enemy.rows.size()) == 28)
Kit.check("混编断言段注入行全量还原(表回 29 行——L1 混编批后的基线行数;首批混编投放基线 21 行+覆盖 8 行)", int(_db.combat.enemy.rows.size()) == 29)
# ⑬ 真图类型可见性(信息迷雾 v2.1):L2 入口停点纯核心面读数——候选 ⊆ 可见集 /
# 终点恒可见 / 入口 BFS 层距 > N 的非豁免节点入雾。N 取数据表(代码零硬编码)。
@@ -1314,12 +1314,15 @@ func _smoke_shop_pool() -> void:
expect_p = int(ceil(float(int(prow.get("base_price", 0))) * pow(_db.run.shop.price_b, float(l2 - 1)) * 1.0))
Kit.check("首购现价 = ceil(基价×b^(关序−1))(%s: %d = %d 推导)" % [ckind, int(c.get("price", -1)), expect_p], int(c.get("price", -1)) == expect_p)
# ③ 买 1 全重抽:出账+加算区+账本三落点 + 现价 A 链递增(买后 visit 计数=1;TP0——消费在架令牌本体)
# 白盒抬 GP 保证首购场景确定构造(直改测试基建——非生产行为,A 链段同款先例;(1,3) 混编后战斗流
# 消费序变化使 gp 分布漂移,种子扫描不再隐式保证首购空间——买链判据本身零变化)
r8.gp = int(r8.gp) + 128
var buy_c: Dictionary = {}
for c in r8.shop.shop_shelf():
if int(c.get("price", 1 << 30)) <= int(r8.gp):
buy_c = c
break
Kit.check("可购卡在架(GP %d——种子扫描保证首购空间)" % int(r8.gp), not buy_c.is_empty())
Kit.check("可购卡在架(GP %d——白盒抬 GP 保证首购空间)" % int(r8.gp), not buy_c.is_empty())
if not buy_c.is_empty():
var kind := String(buy_c.get("kind_id", ""))
var tier := String(buy_c.get("tier", ""))
@@ -1478,7 +1481,7 @@ func _adv_drive_to_shop(a, st: Dictionary, autoplay) -> bool:
autoplay._drive_level(a.runner(), st, null, "normal", "min")
if String(st["result"]) != "":
return false
if a._bp_store._pending_next_level:
if a._bp_store.pending_next_level():
# 三选一停点确认(确定性选件后推进,与 run_adventure 自动策略同口径;TP0 令牌化)
if not a.stop()._pending.is_empty():
var bcands: Array = a.stop()._pending["candidates"]
@@ -219,7 +219,7 @@ func _test_rowset_discipline() -> void:
Kit.check("Boss 带混编行集加载通过(P4 乙——Boss 多行合法,无硬闸)", errs.is_empty())
# 负向:同行集行不相邻 = rowset_rule 且报错定位到带键(R6 行序纪律 + R3 错误类别可定位)
var t_gap = EnemyTableScript.new()
t_gap.rows.assign([mk_row.call(1, "battle", 5, "goblin"), mk_row.call(1, "battle", 9, "hobgoblin"),
t_gap.rows.assign([mk_row.call(1, "battle", 5, "goblin"), mk_row.call(1, "battle", 9, "giant_spider"),
mk_row.call(1, "battle", 5, "bugbear"), mk_row.call(1, "battle", 0, "goblin"),
mk_row.call(1, "boss", 9, "ogre_chief")])
errs = t_gap.validate()
@@ -1,7 +1,7 @@
# tests/unit/data_config/table_structure_guard_test.gd — 表结构守卫单元测试宿主
# 断言面 = data/tables 各表的结构锚与守卫,七套:
# adventure 冒险表(档位配额/件值对/同调目录 12 件/装配→战斗贯通)
# enemy 敌人表(20 行带键行序/hobgoblin 留任/三 Boss 行)
# enemy 敌人表(29 行带键行序/混编行集/三 Boss 行)
# AC 单轨与掷点参数(status_effect/reward/settlement 三处无双轨/免伤墙护栏/敌 AC 带宽)
# variation 地形变异(行数/候选池门控/跨字段互锁负样本)
# difficulty 难度表(空表零行为/修饰套乘/越域 clamp)
@@ -206,15 +206,15 @@ func _smoke_adventure_table() -> void:
v18_ok and locked_n == 12)
# ---- 敌人表深度带键结构(迭代 34 建·迭代 35 覆盖批换代:28 行键序=覆盖表序·hobgoblin 留任·Boss 行集带键清单)----
# ---- 敌人表深度带键结构(迭代 34 建·L1 混编批换代:29 行键序=覆盖表序·(1,3) 混编行集·Boss 行集带键清单)----
func _smoke_enemy_bands() -> void:
print("--- 敌人表深度带键结构(28 行键序 · hobgoblin 留任 · Boss 带键覆盖表)---")
# ① 28 行计数 + 键序 = 覆盖表序(文件行序不变——行序即契约)
print("--- 敌人表深度带键结构(29 行键序 · (1,3) 混编 · Boss 带键覆盖表)---")
# ① 29 行计数 + 键序 = 覆盖表序(文件行序不变——行序即契约;(1,3) 两行相邻、熊地精在前)
# 迭代 35 生成图深度扩面覆盖批随动:战斗带顶扩到各关最大生成深度(L1→6/L2→9/L3→13)、
# Boss 行按终点深度分带(L1 6/L2 8·9/L3 11·12·13),模板时代带键 4/9/9 全部在册不动
var expect_keys: Array[String] = [
"1|battle|0|goblin", "1|battle|1|goblin", "1|battle|2|bugbear", "1|battle|3|hobgoblin",
"1|battle|0|goblin", "1|battle|1|goblin", "1|battle|2|bugbear", "1|battle|3|bugbear", "1|battle|3|goblin",
"1|battle|6|bugbear",
"1|boss|4|ogre_chief", "1|boss|6|ogre_chief",
"2|battle|0|bugbear", "2|battle|1|bugbear", "2|battle|4|giant_spider",
@@ -229,16 +229,45 @@ func _smoke_enemy_bands() -> void:
for row in _db.combat.enemy.rows:
got_keys.append("%d|%s|%d|%s" % [int(row.get("level_index", -1)), String(row.get("row_kind", "")),
int(row.get("depth_band", -1)), String(row.get("enemy_id", ""))])
Kit.check("敌人表 28 行且键序 = 覆盖表序((L,row_kind,depth_band,enemy_id) 逐行比对——文件行序不变)〔fv11〕",
_db.combat.enemy.rows.size() == 28 and got_keys == expect_keys)
# ② hobgoblin 缺口行留任随迁(不删行不补立绘——补齐归敌种内容批)
var hob := {}
Kit.check("敌人表 29 行且键序 = 覆盖表序((1,3) 两行相邻、熊地精在前)〔L1混编 v1〕",
_db.combat.enemy.rows.size() == 29 and got_keys == expect_keys)
# ② (1,3) 混编构成与行序+静态最坏骰和+行值整行复用(R1-R4)
var rowset13: Array[Dictionary] = _db.combat.enemy.resolve_rowset(1, 3, "battle")
var ids13: Array[String] = []
var dice_sum := 0
for r in rowset13:
ids13.append(String(r.get("enemy_id", "")))
dice_sum += int(r.get("unit_count_max", int(r.get("unit_count", 1))))
var expect_ids13: Array[String] = ["bugbear", "goblin"]
Kit.check("(1,3) 行集恰两行、enemy_id 序列 == [bugbear, goblin](行序=文件序=生成序——默认目标取首行)〔L1混编 v2〕",
rowset13.size() == 2 and ids13 == expect_ids13)
Kit.check("(1,3) 静态最坏骰和 Σ(unit_count_max,固定行缺省) == 3〔L1混编 v3〕", dice_sum == 3)
var row12 := {}
var row10 := {}
for row in _db.combat.enemy.rows:
if String(row.get("enemy_id", "")) == "hobgoblin":
hob = row
Kit.check("hobgoblin 行在 (1,battle,3) 留任随迁(缺口行不删不补——补齐归敌种内容批)〔fv12〕",
int(hob.get("level_index", -1)) == 1 and String(hob.get("row_kind", "")) == "battle" \
and int(hob.get("depth_band", -1)) == 3)
if int(row.get("level_index", -1)) == 1 and String(row.get("row_kind", "")) == "battle" \
and int(row.get("depth_band", -1)) == 2:
row12 = row
if int(row.get("level_index", -1)) == 1 and String(row.get("row_kind", "")) == "battle" \
and int(row.get("depth_band", -1)) == 0:
row10 = row
var mix_ok := rowset13.size() == 2
if mix_ok:
for fld in ["hp", "atk", "atk_min", "atk_max", "pool", "attack_type", "armor_type", "armor_class", "unit_count", "unit_count_max"]:
mix_ok = mix_ok and rowset13[0].get(fld) == row12.get(fld) and rowset13[1].get(fld) == row10.get(fld)
Kit.check("(1,3) 两行逐字段 == (1,2)/(1,0) 行(hp/atk 区间/pool/ac/类型轴——零数值新增,不写字面量)〔L1混编 v4〕", mix_ok)
# ②b 表内 enemy_id 集合不含 hobgoblin(退役键零残留)
var id_set := {}
for row in _db.combat.enemy.rows:
id_set[String(row.get("enemy_id", ""))] = true
Kit.check("表内 enemy_id 集合不含 hobgoblin〔L1混编 v5〕", not id_set.has("hobgoblin"))
# ②c 深度 4/5 落带不变(band 6 单行 bugbear——本批零触碰护栏)
var rowset14: Array[Dictionary] = _db.combat.enemy.resolve_rowset(1, 4, "battle")
var rowset15: Array[Dictionary] = _db.combat.enemy.resolve_rowset(1, 5, "battle")
var deep_ok: bool = rowset14.size() == 1 and rowset15.size() == 1 \
and String(rowset14[0].get("enemy_id", "")) == "bugbear" and String(rowset15[0].get("enemy_id", "")) == "bugbear" \
and int(rowset14[0].get("depth_band", -1)) == 6 and int(rowset15[0].get("depth_band", -1)) == 6
Kit.check("(1,4)/(1,5) battle 行集 == 单行 bugbear(band 6)〔L1混编 v6〕", deep_ok)
# ③ Boss 行集带键 = 覆盖表(旧判据「各恰一行=图 Boss 节点深度」属单终点模板时代;
# 生成图多终点要求每终点深度解析到互异带键 ⇒ 每关 Boss 行必然多于一行——
# 迭代 35 覆盖批随动改写为带键清单,「带键互异」的运行时把关在 level_shop_economy_test〔v11〕)
@@ -335,7 +364,8 @@ func _smoke_ac_swap_guard() -> void:
# ③c 熊地精首遇带降档锚定 + 第一关总量曲线护栏
# 首遇带行 = 数据驱动定位(契约 8:该 (1,battle,bugbear) 的最低 depth_band)锚定值 hp 22 / ac 2;
# 敌种 bugbear 与池 attack6/charge2/heavy2 钉死不动(防顺手改多);
# 曲线护栏 = 深度带升序相邻带「hp × 中位数量」总量比 ≤ 2.5(12/10/22/35/72 现行全绿;不用单调不回撤——会红在首带→次带)
# 曲线护栏 = 深度带升序相邻带「hp × 中位数量」逐带累加总量比 ≤ 2.5(12/10/22/34/72 现行全绿;不用单调不回撤——会红在首带→次带;
# 同带多行按行累加——(1,3) 混编两行同带,单行覆盖口径在双行行集下失真,与 R6 spawn 守卫逐行求和同口径非放宽)
var l12_band := _first_encounter_band(1, "bugbear")
var l12_row: Dictionary = {}
for row in _db.combat.enemy.rows:
@@ -356,7 +386,8 @@ func _smoke_ac_swap_guard() -> void:
continue
var cnt_lo: int = int(row.get("unit_count", 1))
var cnt_hi: int = int(row.get("unit_count_max", cnt_lo))
l1_totals[int(row.get("depth_band", -1))] = int(row.get("hp", 0)) * (cnt_lo + cnt_hi) / 2.0
var bkey: int = int(row.get("depth_band", -1))
l1_totals[bkey] = float(l1_totals.get(bkey, 0.0)) + int(row.get("hp", 0)) * (cnt_lo + cnt_hi) / 2.0
var curve_ok := true
var curve_detail := ""
var depths_sorted := l1_totals.keys()
@@ -368,7 +399,7 @@ func _smoke_ac_swap_guard() -> void:
if ratio > 2.5:
curve_ok = false
curve_detail += " (%d→%d):%.2f" % [depths_sorted[i - 1], depths_sorted[i], ratio]
Kit.check("第一关相邻深度带总量比 ≤ 2.5(12/10/22/35/72——迭代 24 N1 曲线护栏,带键升序;越带%s)" % [
Kit.check("第一关相邻深度带总量比 ≤ 2.5(12/10/22/34/72——迭代 24 N1 曲线护栏,带键升序逐带累加;越带%s)" % [
curve_detail if curve_detail != "" else "无"], curve_ok)
# ④ 掷点参数域(加载校验已过——此处钉形状语义)
var bounds: Array = _db.combat.settlement.damage_roll.roll_tier_bounds
@@ -111,7 +111,7 @@ func _test_snapshot_effects_per_unit() -> void:
var rng = load("res://core/rng_service.gd").new()
rng.set_master_seed(20261103)
var settlement = load("res://core/battle_orchestrator.gd").new(db, rng)
# depth 3 = hobgoblin 行集 2-3 只——两卡对照面
# depth 3 = 混编行集(熊地精 1 + 地精 1–2,最少 2 只)——两卡对照面
var open_ok: bool = settlement.begin_battle({"level_index": 1, "node_depth": 3, "hero_hp": int(db.combat.hero.max_hp)})
Kit.check("V8 前置:开局(L1 depth3 双敌行集)", open_ok)
if not open_ok:
+29
View File
@@ -0,0 +1,29 @@
# 迭代 51 反哺点清单(2026-11-04)
> 实现批禁写 `design/`——以下各条由用户裁决后归文档批落文。裁决一条落一条,落完把该条清掉。
## 一、design/engineering/architecture/architecture.md(十处)
1. **:124(BattleFxHost 行)**:「A3 action_economy(queue_ap_delta/charge_layers 读)」依赖句删 charge_layers 读——蓄力层账本已退役(卡①),A3 对 action_economy 依赖余 queue_ap_delta 通道。
2. **:146(轴戊 EffectPort 句)**:「闭面五键」改「闭面四键」;「facts 取值束 dig_streak/charge_layers/rider_tier_*」删 charge_layers——biz_fact 闭面收窄为 dig_streak/hp_ratio/rider_tier_bonus/rider_tier_crit(卡①,键退役后宿主应答 null)。
3. **:125(RoundCycle 行)**:「三参直构(host/fx_host_ref/reward_grant_ref——五段构造透传不落成员)」→「引用束注入(编排器 20 键封闭束,解包自用七键后原束分发五段;持有 BattleRefreshFlow);公开方法 3→4(refresh_flow() 读出口);类变量 8→15(贴顶禁再增)」(卡②)。
4. **:123(BattleRefreshFlow 行)**:「static 两入口收 oc」→「实例束注入 8 键(facts/db/action_economy/fx_host/reward_economy/minesweeper/install_cb/grant_seg);宿主 can_refresh/player_request_refresh 单行转发形态不变,经 RoundCycle.refresh_flow() 取件;grant_seg 段间引用直接交接(编排器 _rounds._grant_seg 跨两层链式取段消灭);类变量 0→8」(卡②)。
5. **:127(settlement/ 五段段类行)**:构造形态句 →「引用束注入(各段断言各自必需键);段类对编排器零引用(\boc\b 零命中——跨件单向接线,注入 Callable 亦属接线面)」(卡②)。
6. **:122(damage_controller 行)**:类变量 12→13(+facts 构造注入);公开面净增 hero_atk()/static hits_of()/emit_hero_damage_taken 公开化(_emit 去下划线非并存)(卡②)。
7. **:121(RewardGrant 行)**:+feat_yield_adjust(_feat_yield_adjust 自编排器归位)(卡②)。
8. **:120(BattleFxHost 行)**:+mark_new_resource_type/+add_bonus_delta 两公开累积方法(类变量 15 不变,方法-only)(卡②)。
9. **核心层表 A2 minesweeper_rules 行**:公开面 19→21(贴顶超 1——**随卡② S13 停卡呈报待用户裁**:特批准记基线则登记 21 贴顶超阈值态并立还债条目;harmful_variants/harmful_adjacent 自编排器归位)(卡②)。
10. **核心层表 breakpoint_store 行+save_manager/slot_store 行**:breakpoint_store 公开方法面 5→18(13 新面+bp_read 公开化);save_manager 公开面 7→14(+set_read_only/read_only/reset_to_default/data_snapshot/restore_data+peek_summary_at/rename_overwrite 两更名公开化);slot_store「双向公开面」(+active_path;migrate_legacy_save 公开化;反向私取 21 处清零)(卡②)。
11. **:119(B1 battle_orchestrator 行)**:「NODE_TYPES 词表双份」表述删句、改「词表单点归 LevelTable(生成器 class_name 直引——S3 豁免面在案形态)」(卡③)。
## 二、GDD 确认行
- design/gdd/systems/战斗循环/战斗结算.md:**零反哺**(明细流水词表、五段段序、段边界零触碰——零行为变更批,golden 逐位对拍在案)。
- design/gdd/systems/表现与支撑/数据配置.md:**零反哺**(热重载规格保留原状——P2 卡不收件面)。
- 术语表:**零新增术语**(引用束注入/读投影/公开方法面均仓库现行词)。
- 卡④:难度曲线与Boss.md/敌人系统.md/08-Alpha版本标准.md **零动作**(文档批已随写卡段落文,本批零新增反哺)。
## 三、待办清单(实现批不碰,归收尾段/用户)
- 卡② S13 一键(minesweeper_rules 公开方法 21>20):待用户按实现报告 §六裁决;若特批准记基线,建议同批立「minesweeper_rules 公开面还债」条目归后续批。
- EffectEngine.has_effect_on 零消费方(卡① 备案):是否立死码处置条目,归用户裁。
+102
View File
@@ -0,0 +1,102 @@
# 迭代 51 实现报告(2026-11-04)
> 四卡:①EffectPort 蓄力层删键批 ②架构审查 5.1 封装修复批 ③架构审查 P2 代码面批 ④L1 深度 3 混编。
> 工作区=g-plan2-iter51(分支 iter51,基点 63fe2da0);提交序列见 git log(卡① 一笔/卡② 四笔 T1+T2、T3+T4、T5、——/卡③ 一笔/卡④ 一笔)。
> **卡② 停卡呈报在案(S13 一键待裁)**——见「六、停卡呈报」,合并等用户裁决。
## 一、各卡状态
| 卡 | 状态 | 提交 | 卡内验证读数 |
|---|---|---|---|
| ① EffectPort 蓄力层删键 | 完成 | ace15701 | effect_port_test 16 checks(含新 V4)/treasure_effects PASS/refresh_feats 85 checks;零残留 grep 达成(例外见决定记录 2);S13 零新违规 |
| ② 5.1 封装修复 | **施工完成·S13 停卡呈报待裁** | 568c474d/d43de922/0e1763bd | golden 主证改前固化改后逐位同(seed 4242,3 checks)/settle_segments 18 checks/adventure_feats 138 checks/battle_settlement 七套件绿/存档五套件绿(17+97+22+13+29)/sweep 38 checks/冒烟绿;**S13 新违规 1 条**(minesweeper_rules 公开方法 21>20 贴顶——§六) |
| ③ P2 NODE_TYPES 单点化 | 完成 | 52bb63d7 | encapsulation_p2_sweep 6 checks/node_map_determinism 21 checks(同种子逐位——零行为变更主证)/冒烟绿;S13 键零变化 |
| ④ L1 深度 3 混编 | 完成 | afaab6a7 | table_structure_guard 83 checks(v1–v6)/round_flow 136 checks(含 _smoke_enemy_buff_targets_self 种子搜索命中)/level_shop 195 checks/damage_controller 50/battle_narrator 22/config_db_test 29/config_db_resolver 13;全仓 hobgoblin 零残留(例外见决定记录 7);Alpha 零读数(静态论证) |
## 二、实际改动—验收对照表
### 卡①(对照表 3 行全绿)
| # | 需求点 | 改动 | 验收测试(落点+尾缀) | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|
| 1 | 事实应答面收窄 | battle_fx_host.gd biz_fact/_fx_fact 两分支删 | effect_port_test.gd:131「V4 闭面收窄」 | begin_battle 真实装配链取宿主 biz_fact | 键在→返 0、键退役→null | 绿(16 checks 内) |
| 2 | 账本与转蓄分支退役、签名简化 | action_economy.gd finish_round_stop 纯 RAP 转存+grant_segment 调用简化 | treasure_effects_test.gd ⑥ 三断言(132/138/144 调用单参化,期望值零变) | request_stop→round_end→finish_round_stop 真实停手路径 | RAP 转存读数 4/5/3 逐位零漂移 | 绿(PASS) |
| 3 | 事件/事实两词表位退役 | effect_engine.gd EVENTS/FACTS 删位 | 静态判据+零残留 grep+S13+--code 域(合回 CI) | —(词表常量面) | 静态判据+评审注记(申报观测面局限在卡) | 绿(grep 零命中) |
### 卡②(对照表 R1–R6 全绿,全部「非行为改动」行)
| # | 需求点 | 改动 | 验收测试 | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|
| R1 | 七段解耦+束交付 | 七文件重写+编排器 20 键束+三调用点 | settlement_wiring_snapshot_test〔封装5.1 V1〕+settle_segments_test 束构造/同一性断言+round_flow/seal_polarity/refresh_feats 既有全套 | begin_battle→settle_batch→player_request_refresh 全公开入口 | 同种子行流逐位同 golden+束引用同一性+\boc\b 七文件零命中 | 绿 |
| R2 | 搬家五方法归位 | damage_controller +hero_atk/hits_of/emit 公开化+facts;reward_grant +feat_yield_adjust;minesweeper +harmful_variants/harmful_adjacent;编排器五方法删 | golden V1(五方法消费路径全在行流内)+roll_multiplier_test 既有+sweep V3 | begin_battle/授予段真实结算链 | 行流逐位同+五方法宿主定义唯一 | 绿 |
| R3 | grant→BattleFxHost 累积方法 | battle_fx_host +mark_new_resource_type/+add_bonus_delta;grant 四处改址 | seal_polarity/round_flow 既有回归+sweep V6 | 授予段真实结算链 | bonus_delta 轴累积与首见判定逐位同+grant 源零私键 | 绿 |
| R4 | adventure_runner→BreakpointStore | breakpoint_store +13 公开方法(bp_read 公开化);adventure_runner 37 处改址 | save_rng_roundtrip_test 两断言既有+sweep V4 | resume_adventure/start_adventure→write_to_disk/load_from_disk | 断点续玩逐位同+源零私取 | 绿 |
| R5 | save_manager↔SlotStore 双向 | slot_store +active_path/migrate 公开化+21 处改址;save_manager +5 公开方法/2 更名+九行改址 | save_manager_domain_test+save_slot_isolation_test+sweep V5 | write_to_disk/load_from_disk/_ready 迁移口/activate_slot/peek_slot_summary | 写盘读回迁移激活窥视逐位同+双向源零私取 | 绿 |
| R6 | config_db→三表挂载 | 三 schema +bind_resolver;config_db 三行改址 | config_db_resolver_test 既有全套+sweep V7 | ConfigDB.load_tables→resolve_* | 行集解析与难度 clamp 逐位同+源零直写 | 绿 |
**零行为变更证明**:T1 golden 改前基线固化(seed 4242 未改树转储 7444 字符 JSON 填入常量)、改后全程绿=行流/快照/终局载荷/presentation 逐位同;既有套件零转红;sweep 恒零。
### 卡③(对照表 R1 全绿)
| # | 需求点 | 改动 | 验收测试 | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|
| R1 | NODE_TYPES 单点化 | node_map_generator :10 删+:135 改 LevelTable.NODE_TYPES.has | encapsulation_p2_sweep_test〔架构P2 V1/V2〕+node_map_determinism_test 既有全套 | LevelRunner 关卡推进→节点图生成;LevelTable 表行加载校验 | 词表定义唯一落点(正锚计数=1)+生成链同种子逐位同 | 绿 |
### 卡④(对照表 R1–R10 全绿)
| # | 需求点 | 改动 | 验收测试(尾缀〔L1混编 vN〕) | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|
| R1 | 行数与键序 | enemy.tres (1,3) 一行换两行 | table_structure_guard「敌人表 29 行且键序=覆盖表序((1,3) 两行相邻、熊地精在前)」 | ConfigDb.load_tables→EnemyTable.rows | 遍历 rows 拼四段串逐行比对 | 绿(83 checks 内) |
| R2 | 混编构成与行序 | 同上 | 同文件「(1,3) 行集恰两行、enemy_id 序列==[bugbear,goblin]」 | resolve_rowset(1,3,"battle") | 返回长度与 enemy_id 序列 | 绿 |
| R3 | 静态最坏骰和 | 同上 | 同文件「Σ(unit_count_max,固定行缺省)==3」 | 同上 | 求和值==3 | 绿 |
| R4 | 行值整行复用 | 同上 | 同文件「(1,3) 两行逐字段==(1,2)/(1,0) 行」 | EnemyTable.rows | 字段逐项比对零字面量 | 绿 |
| R5 | 零残留 | 表+七文件 | 同文件「表内 enemy_id 集合不含 hobgoblin」+T2 回读命令 | rows 遍历+grep | 集合不含+grep 空 | 绿 |
| R6 | 混编下 spawn 数全域内 | round_flow :312-317 口径逐行求和 | _smoke_encounter_roll 全深度×12 种子扫描 | begin_battle→presentation_snapshot().enemies.size() | 逐场数量∈[Σunit_count,Σunit_count_max] 且 ≥1 | 绿(136 checks 内) |
| R7 | 双池各自独立 | 表两行 | _smoke_skill_pool_data「(1,3) 两行池模板」 | 表读取 | 键与权重逐项 | 绿 |
| R8 | 注入段还原行数 | level_shop :727 | _smoke_level_graph「表回 29 行」 | 同套件注入/还原流程 | rows.size()==29 | 绿 |
| R9 | 深度 4/5 落带不变 | 表(零触碰) | table_guard「(1,4)/(1,5) battle 行集==单行 bugbear(band 6)」 | resolve_rowset(1,4/5) | 长度与 enemy_id、band 归属 | 绿 |
| R10 | 深度 3 最少 2 敌(回归护栏) | 两处夹具注释 | damage_controller_test _test_pool_consumption_per_unit+battle_narrator_test _test_snapshot_effects_per_unit 在混编行集下仍绿 | UnitContainer.spawn(1,3) | all_enemies().size()≥2 | 绿 |
## 三、S13 对账
- 改前基线:gdstyle_gate 5 键基线内、基线外 0(T1 现场读数;adventure_runner 类变量 23 照登)。
- 改后:**基线外新违规 1 条=game/core/minesweeper_rules.gd|quality/max-public-methods(21>20 贴顶)**——卡② 停卡呈报项(§六)。其余全部触件 S13 键只降不升:action_economy 删 2 成员、七段束解包全在预算内(grant 12/combat 10/verdict 5/aura 1/decay 2/round_cycle 15 贴顶/battle_refresh_flow 8)、breakpoint_store 类变量 15 贴顶方法-only、编排器 15 不变。
## 四、实机目检总清单(真人检测只登记不阻塞)
- 卡①②③:无实机目检项(死码删除/封装收口/词表单点化——零玩家可观测提交面;卡② 零行为变更由 golden 逐位对拍承载)。
- 卡④(抄体验验证清单 ⑱ L1 节点 3 三项):① 混编遭遇实机目检(L1 节点 3 遇敌=熊地精 1+地精 1–2,默认目标=熊地精);② 开战叙述首行=熊地精;③ 战斗结算面两种数量语义并存目检。读数义务:Alpha 零读数(2026-11-04 用户裁),带位移读数归数值统一修正批。
## 五、能力清单核对
game/tests/README.md:本批零编辑(四卡对照表能力行全部「既有」;测试函数名零改名——settle_segments/round_flow/level_shop/damage_controller/battle_narrator 代表用例名在册不变;卡② 新增两测试件按「经宿主链覆盖」申报=snapshot 测试挂 R1 行 begin_battle 全结算链、sweep 挂各 R 行源扫描)。名实核对一致,无回表项。
## 六、停卡呈报(卡② S13 一键——实现段零裁断,缺陷移交)
**分歧点**:minesweeper_rules.gd 公开方法数。写卡 §14 申报「18→20 贴顶(+2)」;master 基点实数 **19**(`git show master:game/core/minesweeper_rules.gd` 逐 func 清点),本批 +2 搬家方法(harmful_variants/harmful_adjacent)后 **21>20**(S13 默认阈值)——gdstyle_gate 基线外新违规 1 条。
**两种读法**:
- 读法 A(写卡考证误差 1,预算按实况校准为 19→21):+2 是卡② 五方法归位裁决的直接后果(grant_segment :87/:339 两消费方直调,两方法都必须公开,少任何一件破坏搬家合同);21 超阈值需用户特批准记基线(迭代 38 先例 c4c69701——S13 恶化经用户特批准记入基线存量红)。但 static_scan S13 头注「登记值只准随还债下降,禁抬高到现状」——特批是唯一合法通道,闸件纪律不因批内需要自动放行。
- 读法 B(卡面预算准、实现走形):不存在第三形态——拆函数降计数=实现段自行拆件(L3 ③禁);改闸件豁免=禁(卡② §13;先例迭代 38 卡② 停卡);把方法挪去 BoardData 或他件=职责面重设计(上游裁决)。
**建议案**:读法 A——用户特批准记基线 1 键(minesweeper_rules 公开方法 21),理由:+2 归位是 2026-11-03 会话裁决的机械承载、消费面决定两方法必须公开、基点考证误差 1 属写卡段缺陷(非实现超预算)、特批有迭代 38 先例。批后可开「minesweeper_rules 公开面还债」条目(归后续批:如 settle_batch/fx_reveal 族收敛)随还债降键。
**该红不阻塞的实证**:卡② 全部验收断言绿、golden 零漂移、sweep 恒零——S13 是结构预算闸不是行为闸;红项单键、修复路径已指认(特批记基线或后续还债批)。用户裁决后本迭代即可走独立验收审计→合并;若用户裁读法 B(拆面),开修复 worktree `fix-iter51-s13` 处置后重审计。
## 七、实现决定记录(代拍板白名单外备案)
1. **卡① has_effect_on 零消费方保留**:删 grant_segment 调用后 `EffectEngine.has_effect_on` 全仓零调用。卡面 :203 处置=注释改写、函数保留(T0 步骤明写「:203 句改……」未列函数删除),未代裁扩大删除面。后续可另立待办处置(纯框架 API 死码)。
2. **卡① 零残留 grep 唯一例外**:effect_port_test.gd:131 V4 断言文案与 `biz_fact("charge_layers")` 参数引证退役键名——卡面 T0 定死的断言文案(证明「键退役→null」必须引用键名),断言优先于 grep 字面。
3. **卡① 三处 swap 域描述词换代**:run_all.gd:213 manifest 注释、effect_port_test :67/:83 的「蓄力层」简称改「蓄力周转」(swap_charge_layers 在役域,词面清旧称;断言判据零变——:83 属断言文案措辞,判据 `v_c - v_0 >= 1` 不动)。
4. **卡② oc._ 计数 102 vs 卡面 105**:迭代 50 甲案删 attack_segments 分支所致(卡面预告的漂移,grep 符号锚定位,禁改判据)。
5. **卡④ 曲线护栏逐带累加**:table_structure_guard_test 第一关总量比断言原单行覆盖口径在 (1,3) 双行同带下失真(后行覆盖前行→band3 总量 12→72 比值 6.00 假红);改同带逐行累加(band3=22×1+8×1.5=34,比值 2.12)——与卡④ R6 已裁「逐行求和与 spawn 守卫同口径」同构,阈值 2.5 零变化,非放宽。期望序列文案 12/10/22/35/72→12/10/22/34/72(34=混编实况)。
6. **卡④ level_shop 白盒抬 GP**:(1,3) 混编改战斗流随机消费序→_smoke_shop_pool 种子扫描选中的场景 gp 分布漂移(进店刷新扣费后 gp=1<全架最低价)→「可购卡在架」假红。修法=③ 买段前白盒 `r8.gp += 128`(A 银段 :1345 同款先例「直改测试基建——非生产行为」),买链判据零变化;MC-1 刷新段保持原位(进店未买态语义),未动段落序。
7. **卡④ R5 零残留 grep 唯一例外**:table_structure_guard_test 新增 v5 断言文案与 `id_set.has("hobgoblin")` 引证退役键名(卡面 §八 R5 定死验收文案)。
8. **卡② 测试连带三处迁移**(写卡 §3.2 漏盘点):adventure_feats_test :791 与 level_shop_economy_test :1484 `a._bp_store._pending_next_level` → `pending_next_level()`;feat_vouchers_test :81 `_loadout_seeded = false` → `set_loadout_seeded(false)`(断点公开面在用,引用形态迁移非削弱);damage_controller_test :55 直构夹具补 BattleFacts 第五参(facts 构造注入——hero_atk 消费面,夹具空 encounter=表值缺省)。**审计订正**:level_shop 一处曾随回滚实验丢失(卡④ 提交后由独立验收审计查出,:1484 补迁移复跑 195 checks 绿——动态访问失效成员使停点分支恒假、依赖种子被扫描跳过掩盖红,属申报落实的漏项非削弱)。
9. **卡② snapshot 测试对拍形态**:GOLDEN 三引号 raw string 首尾各带换行(多行字符串语法载体),比较两侧 strip_edges 后逐位等——判据零变(内容逐位),语法载体适配。
## 八、遗留读数义务与反哺点
- 遗留读数:卡④ Alpha 零读数(归数值统一修正批);卡② S13 一键(§六待裁)。
- 反哺点:见 `reports/iter51-反哺点-2026-11-04.md`(architecture.md 十处+GDD/术语确认行)。
- 待办清单条目状态推进与 roadmap「当前位」换代:归文档批(本批禁写)。
+190
View File
@@ -0,0 +1,190 @@
# 迭代 51 独立验收审计(2026-11-04)
> 审计身份:独立会话审计员,未参与本批实现(实现由另一会话完成)。
> 工作区:D:\code\g-plan2-iter51(分支 iter51,基点 master=63fe2da0,diff 范围 63fe2da0..HEAD,HEAD=ef3cd8db,工作树 clean)。
> 审计范围:四张需求卡片(①EffectPort 蓄力层删键批 ②架构审查 5.1 封装修复批 ③架构审查 P2 代码面批 ④L1 深度 3 混编)+实现报告 §一–§八+全量 diff 逐文件核对(48 件,+1594/−474)。
> **验收档:四卡均未申报验收档——按高档全量执行**(对照表逐行核对+判据绑定面抽查+最窄测试复跑抽查+逐处削弱检查+直查例外核对+S13 对账复核)。
> 纪律:只读生产码与测试;禁变异类测试、禁撤销类取证;本报告为本审计唯一写入文件。
## 一、最窄测试复跑读数
环境:Godot 4.7.2 console 版(D:\code\godot\Godot_v4.7.2-stable_win64_console.exe)headless,工作目录 game/,`--script` 单件直跑;跑前确认 `game/.godot/global_script_class_cache.cfg` 在位(直接跑)。退出码 0=绿。
| 套件 | 归属 | 退出码 | 读数 |
|---|---|---|---|
| effect_port_test | 卡① V4(五件套) | 0 | all green(16 checks,V4 断言在列全 PASS) |
| settlement_wiring_snapshot_test | 卡② R1 golden 主证(五件套) | 0 | all green(3 checks,golden 逐位同) |
| encapsulation_sweep_test | 卡② V2–V7(五件套) | 0 | all green(38 checks) |
| encapsulation_p2_sweep_test | 卡③ V1/V2(五件套) | 0 | all green(6 checks) |
| table_structure_guard_test | 卡④ v1–v6(五件套) | 0 | all green(83 checks,v1–v6 六条全 PASS) |
| round_flow_skill_pool_test | 审计自选(卡④ R6/R7/R10) | 0 | all green(136 checks,含 buff_targets_self 种子搜索命中 seed=1) |
| save_rng_roundtrip_test | 审计自选(卡② R4) | 0 | all green(17 checks) |
| treasure_effects_test | 卡① 行 2 | 0 | PASS |
| settle_segments_test | 卡② R1 | 0 | all green(18 checks) |
| adventure_feats_test | 卡② R2 | 0 | all green(138 checks) |
| seal_polarity_test | 卡② R3 | 0 | all green(70 checks) |
| refresh_feats_test | 卡① 契约 2/卡② R1 | 0 | all green(85 checks) |
| roll_multiplier_test | 卡② R2 | 0 | all green(42 checks) |
| config_db_resolver_test | 卡② R6/卡④ | 0 | all green(13 checks) |
| config_db_test | 卡④ | 0 | all green(29 checks) |
| save_manager_domain_test | 卡② R5 | 0 | all green(97 checks) |
| save_slot_isolation_test | 卡② R5 | 0 | all green(22 checks) |
| feat_vouchers_test | 卡② 连带迁移 | 0 | all green(49 checks) |
| damage_controller_test | 卡④ R10 | 0 | all green(50 checks) |
| battle_narrator_test | 卡④ R10 | 0 | all green(22 checks) |
| level_shop_economy_test | 卡④ R8 | 0 | all green(195 checks) |
| node_map_determinism_test | 卡③ 零行为主证 | 0 | all green(21 checks) |
## 二、卡① EffectPort 蓄力层删键批
### 对照表逐行核对(3 行)
| 行 | 验收测试存在性 | 尾缀 grep | 真实入口判定 | 结果 |
|---|---|---|---|---|
| 1 | effect_port_test.gd:131 断言在(V3 组 `_test_biz_fact_face_closed` 末尾) | 「V4 闭面收窄:charge_layers 键退役——宿主事实应答 null」grep 命中 :131 | begin_battle 真实装配链(:102 `orch.begin_battle(_enc([]))` 受理后 :131 取 `orch.fx_host().biz_fact("charge_layers")`——fx_host() 公开访问器+biz_fact 公开方法,未绕过装配链直调下层) | 通过 |
| 2 | treasure_effects_test 三断言在,期望值 rap==4/5/3 逐字未动(diff 仅调用实参行) | 无新增尾缀(既有断言回归锚,卡面即如此定) | request_stop→finish_round_stop 真实停手路径;直构 ActionEconomy 夹具=卡面 §8 测试方式两分法明示的调试接口验证形态,且卡面 §7 T0 逐字定死该三行改单参——非绕过 | 通过 |
| 3 | 静态判据:effect_engine.gd EVENTS `charge_full` 位、FACTS `charge_layers` 位删除(diff 证实 :14/:59 两处删位) | —(词表常量面,卡面明示无独立运行期提交面) | —(静态判据+评审注记,卡面申报观测面局限在案) | 通过 |
零残留复核:`grep -rn "charge_layers|charge_full|CHARGE_LAYER|蓄力层|转蓄力|厚积薄发|铁壁|整备军备" game/ --include=*.gd --include=*.tres` 全部命中仅在 swap_charge_layers 在役域(feats.tres :1018-1056 六行、refresh_feats_test `test_charge_layers_consumed_same_round` 函数名与其断言、effect_port_test :16 注释)+V4 断言键名引证(effect_port_test :131)——前者=卡面 §1 完成定义明写豁免域,后者=报告决定记录 2 申报的唯一例外(证明「键退役→null」必须引用键名)。达卡面 T1 零残留判据。
### 削弱检查(逐处)
| diff 处 | 申报出处 | 结论 |
|---|---|---|
| treasure_effects_test 三处 finish_round_stop(false,N)→(N)(:132/:138/:144) | 卡① §8 测试削弱申报 | 通过——断言期望值与检查语义逐字零变化 |
| effect_port_test :57 注释+:83 断言文案「蓄力层→蓄力周转」 | 卡① §8 申报(V1 两处文案) | 通过——判据 `v_c - v_0 >= 1` 不动 |
| effect_port_test :16/:103 误标注释改写 | 卡① §7 T1 申报(三处注释) | 通过——注释级 |
| run_all.gd:213 manifest 注释「蓄力层→蓄力周转」 | 报告决定记录 3 | 通过——注释级,判据零变 |
| has_effect_on 函数保留(grant_segment 调用删后全仓零调用方) | 报告决定记录 1(卡面 T0 :203 只列注释改写、未列函数删除) | 通过——未代裁扩大删除面,与卡面一致 |
无未申报删改。
### 直查例外核对
对照表三行均未声明「内部字段直查=受控例外」:行 1 走公开面(fx_host()/biz_fact);行 2 直构夹具=卡面 §8 两分法明示形态;行 3 静态面。无需例外注记,判定=通过。
## 三、卡② 架构审查 5.1 封装修复批
### 对照表逐行核对(R1–R6)
| 行 | 验收测试存在性 | 尾缀 grep | 真实入口判定 | 结果 |
|---|---|---|---|---|
| R1 | settlement_wiring_snapshot_test.gd:456 主对拍在(GOLDEN 常量 :22-416 固化,seed 4242;dump 通道 :443-448);settle_segments_test :30-34 束构造 5 条+:38-44 同一性 6 条在 | 「封装5.1 V1」:4/:456 命中 | begin_battle→minesweeper.settle_batch→player_request_refresh 全公开入口;段类消费全经真实编排器接线(settle_segments 直构束=卡面 §8 申报 1 的适配形态) | 通过 |
| R2 | golden V1 覆盖五方法消费路径(主角攻击 base_value/奖励乘区/terrain_kind 事实/hero_atk override 行均在 golden 行流内);roll_multiplier_test 既有回归绿;sweep V3 编排器五方法定义零命中 | sweep :69-70 五方法名零命中断言(〔封装5.1〕尾缀 :36/:42 模板命中 38 处) | begin_battle spawn 经 `_damage.hero_atk()`(battle_orchestrator.gd diff :285 证实改指),未绕过 | 通过 |
| R3 | seal_polarity_test 70 checks/round_flow 136 checks 绿+sweep V6(grant 两私键零命中+mark_new_resource_type 正锚 :100-101) | 〔封装5.1〕尾缀在案 | 授予段真实结算链(两套件全走 begin_battle) | 通过 |
| R4 | save_rng_roundtrip_test diff 零改动(未触碰)、17 checks 绿;sweep V4(adventure_runner `_bp_store\._` 零命中+`_bp_store\.bp_read\(` 正锚 :78-79) | 〔封装5.1〕尾缀在案 | AdventureRunner.resume_adventure/start_adventure→write_to_disk/load_from_disk(integration 件真实入口) | 通过 |
| R5 | save_manager_domain_test 97/save_slot_isolation_test 22 绿;sweep V5(save_manager `slots\._` 零命中+active_path 正锚;slot_store `_save\._` 零命中+七公开面正锚 :84-92) | 〔封装5.1〕尾缀在案 | write_to_disk/load_from_disk/_ready 迁移口/activate_slot/peek_slot_summary(两套件承载) | 通过 |
| R6 | config_db_resolver_test 13 checks 绿(rowset 保序/行类路由/难度 clamp);sweep V7(config_db `\._resolver\s*=` 零命中+`bind_resolver\(_resolver\)` 正锚 :109-110) | 〔封装5.1〕尾缀在案 | ConfigDB.load_tables→resolve_*(三 schema bind_resolver 类型环当轮真实跑通——T4 义务承载) | 通过 |
零行为变更主证复核:golden 对拍断言绿(本审计复跑);段类对编排器引用归零由 sweep V2 七文件 `\boc\b` 零命中承载;束 20 键组装与五方法删除、RoundCycle/BattleRefreshFlow 形态换代在 diff 逐文件证实。
### 削弱检查(逐处)
| diff 处 | 申报出处 | 结论 |
|---|---|---|
| settle_segments_test :20-24 五段直构断言改束构造成功(:30-34) | 卡② §8 申报 1 | 通过——段类可独立实例化断言意图保持 |
| settle_segments_test :28-34 宿主回指 6 条改注入同一性(:38-44——round_cycle.facts/grant.facts/aura 回调对象 get_object()==oc/combat.fx_host/decay.status_effects/verdict.units) | 卡② §8 申报 2 | 通过——6 条全数对上,强度对应回指 |
| adventure_feats_test :671/:691/:727 三处 orch._hits_of→DamageController.hits_of | 卡② §8 申报 3 | 通过——断言内容(attack_bonus 命中过滤)零改动 |
| adventure_feats_test :791 `a._bp_store._pending_next_level`→`pending_next_level()` | 报告 §七 8 | 落地证实(grep 现值为公开方法调用) |
| feat_vouchers_test :81 `_loadout_seeded = false`→`set_loadout_seeded(false)` | 报告 §七 8 | 落地证实 |
| damage_controller_test :56 直构夹具补 BattleFacts 第五参 | 报告 §七 8 | 通过——夹具空 encounter=表值缺省,断言零改动 |
| snapshot 测试 strip_edges 对拍(:449-451) | 报告 §七 9 | 通过——内容逐位判据零变,三引号语法载体适配 |
| **level_shop_economy_test :1484 `a._bp_store._pending_next_level`——报告 §七 8 与卡④ commit信息均申报为已迁移,实际未改** | —— | **申报失实,见第六节;非削弱(该行零改动=零删改)** |
无未申报删改、无阈值放宽、无扫描面缩小。
### 直查例外核对
settle_segments_test 直查 `oc._facts`/`oc._rounds._grant_seg.*` 等编排器内部(同一性断言)=卡② §5 明示受控例外(「sim/probe/tests 的测量面直构惯例与测试受控例外——零清扫:orch._facts/orch._rounds/orch._emit_row 等测试直连维持现状」)。报告 §七 8 三处测试直连迁移=附加申报(其中一处未落地,见第六节,且该处属同一受控例外面、运行态零差异)。例外均有注记,判定=通过。
## 四、卡③ 架构审查 P2 代码面批
### 对照表逐行核对(R1)
| 行 | 验收测试存在性 | 尾缀 grep | 真实入口判定 | 结果 |
|---|---|---|---|---|
| R1 | encapsulation_p2_sweep_test V1(:40-41 生成器 `^const NODE_TYPES` 零命中+`LevelTable\.NODE_TYPES\.has\(` 正锚)/V2(:56-58 生产三目录 `NODE_TYPES` 定义恰 1 处且落 data/schemas/level_table.gd);node_map_determinism_test 既有全套 21 checks 绿 | 「〔架构P2〕」尾缀 :27/:32/:56/:58 命中 | 源扫描(静态)+LevelRunner 关卡推进生成链(determinism 同种子逐位——零行为变更主证) | 通过 |
生产面独立复核:`grep -rnE "NODE_TYPES\s*:?\s*=" core data presentation` 唯一命中 data/schemas/level_table.gd:11;node_map_generator.gd 本地 const 删、:135 改 `LevelTable.NODE_TYPES.has(...)`(diff 证实);S3 schema class_name 直引豁免面形态(卡面 §3 在案)。
### 削弱检查
卡面 §8 申报零条;diff 中本卡测试改动仅新增 sweep 件+run_all manifest +1 行——零删改既有断言。通过。
### 直查例外核对
纯源扫描与既有套件回归,无内部字段直查。通过。
## 五、卡④ L1 深度 3 混编
### 对照表逐行核对(R1–R10)
| 行 | 验收测试存在性 | 尾缀 grep | 真实入口判定 | 结果 |
|---|---|---|---|---|
| R1 | table_structure_guard_test :232 v1(29 行键序=(1,3) 两行相邻、熊地精在前) | 〔L1混编 v1〕:232 命中 | ConfigDb.load_tables→EnemyTable.rows 遍历拼四段串逐行比对 | 通过 |
| R2 | :242 v2(行集恰两行、enemy_id 序列==[bugbear,goblin]) | 〔L1混编 v2〕:242 命中 | `resolve_rowset(1,3,"battle")` 返回序列——判据绑返回长度与 enemy_id 序列(被测数据改动特有提交面) | 通过 |
| R3 | :244 v3(Σ(unit_count_max,固定行缺省)==3) | 〔L1混编 v3〕:244 命中 | 同上求和值==3 | 通过 |
| R4 | :258 v4(两行逐字段==(1,2)/(1,0) 行,零字面量) | 〔L1混编 v4〕:258 命中 | EnemyTable.rows 字段逐项比对 | 通过 |
| R5 | :263 v5(表内 enemy_id 集合不含 hobgoblin)+T2 回读命令 | 〔L1混编 v5〕:263 命中 | rows 遍历+grep | 通过 |
| R6 | round_flow :320 全域扫描逐行求和(72 场全绿) | 断言文案「逐行求和」:320 命中 | begin_battle→presentation_snapshot().enemies.size() | 通过 |
| R7 | round_flow :575-576 池模板两键(bugbear 6/2/2+goblin 9/1/1,顺序按表行序) | :575-576 两键在案 | 表读取逐键逐权重比对 | 通过 |
| R8 | level_shop :727「表回 29 行」 | :727 断言在案 | 同套件既有注入/还原流程(rows.size()==29) | 通过 |
| R9 | :270 v6((1,4)/(1,5) battle 行集==单行 bugbear(band 6)) | 〔L1混编 v6〕:270 命中 | resolve_rowset(1,4/5,"battle") | 通过 |
| R10 | damage_controller_test _test_pool_consumption_per_unit/battle_narrator_test :114-115 _test_snapshot_effects_per_unit 混编行集下绿(50/22 checks) | —(回归护栏行,卡面即不设新尾缀) | UnitContainer.spawn(1,3)→all_enemies().size()≥2 | 通过 |
行值整行复用独立复核:enemy.tres (1,3) bugbear 行(:82-104)与 (1,2) 行(:58-80)逐字段一致(hp22/atk1/atk 0-2/池 attack6-charge2-heavy2/normal/light/ac2/unit_count 1 无 unit_count_max);(1,3) goblin 行(:106-129)与 (1,0) 行(:8-31)逐字段一致(hp8/池 attack9-lunge1-desperate_guard1/normal/light/ac0/unit_count 1-2)。行序 bugbear 在前、两行相邻。表注四处处置(实体名修正段删/首批投放段尾追加/N1 括注保留/缺口句换新注)diff 逐处证实。零残留复核:全仓 `hobgoblin` grep(data/core/presentation/probe/sim/tests/tools)唯一命中=v5 断言自身键名引证(table_structure_guard_test :259 注释+:263 断言)=报告决定记录 7 申报的唯一例外。
### 削弱检查(逐处)
| diff 处 | 申报出处 | 结论 |
|---|---|---|
| table_guard :234-241 hobgoblin 留任断言删(原〔fv12〕) | 卡④ §十二 申报① | 通过——钉已退役事实;原位换 v2–v6 五条新断言,覆盖强度净增 |
| round_flow :312-317 首行区间改逐行求和 | 卡④ §十二 申报② | 通过——与 unit_container spawn 守卫同口径,72 场全绿,双行行集下非放宽(旧口径必红) |
| round_flow :615 文案二十八行九种→二十九行十种 | 卡④ §十二 申报③ | 通过——只改文案不改判据 |
| static_scan.sh 删 FNR==891 豁免(:145 头注+:222 执行点) | 卡④ §十二 申报④ | 通过——对象行已随表注段删除,留置会误放别行 |
| 曲线护栏单行覆盖口径改逐带累加(期望序列 12/10/22/35/72→12/10/22/34/72,阈值 2.5 不动) | 报告 §七 5 | 通过——(1,3) 双行同带下旧「后行覆盖前行」口径失真(band3 总量 12→72 比值假红),新口径=同带逐行累加、与 R6 逐行求和同构;阈值零变化 |
| level_shop :1314-1324 白盒抬 GP 128+文案改 | 报告 §七 6 | 通过——测试基建直改(A 银段 :1345 同款先例在案),买链判据零变化 |
| config_db_resolver_test 合成行 hobgoblin→giant_spider(:44,三条期望串同步) | 卡④ §七 T2 明写(并明写不换 bugbear 的理由) | 通过——夹具级,断言结构零变 |
| config_db_test :222 「不相邻」样本换 giant_spider | 卡④ §七 T2 明写 | 通过——同上 |
| damage_controller_test :414/battle_narrator_test :114 两处夹具注释改述 | 卡④ §七 T2 明写(断言零改动) | 通过 |
| doc_term_audit.py :144 注释敌种枚举去 hobgoblin | 卡④ §七 T2 明写 | 通过——注释级 |
无未申报删改、无阈值放宽、无未申报扫描面缩小。
### 直查例外核对
卡④ 判据全部绑公开面(rows/resolve_rowset 返回序列/presentation_snapshot/UnitContainer.spawn)——无需例外注记。通过。
## 六、申报失实项(非验收缺漏,需订正)
**实现报告 §七 第 8 条与卡④ commit afaab6a7 提交信息均申报「卡②断点公开面三处测试直连迁移(pending_next_level×2/loadout_seeded)」,实际落地两处:**
- adventure_feats_test :791 `a._bp_store.pending_next_level()`——已落地;
- feat_vouchers_test :81 `a._bp_store.set_loadout_seeded(false)`——已落地;
- level_shop_economy_test :1484 `if a._bp_store._pending_next_level:`——**未改**(该文件 diff 全量核对仅 :724-727 与 :1314-1324 两处触碰)。
定性与影响:非验收缺漏——该行零改动=无断言删改、无削弱;测试侧 `_bp_store._` 直查属卡② §5 明示受控例外面;BreakpointStore `_pending_next_level` 成员保留(breakpoint_store.gd:60),运行态与改前逐位同,套件全绿(level_shop 195 checks)。但实现报告与提交信息的该条申报与实况不符,构成产出物事实错误——建议订正实现报告 §七 第 8 条(改为「两处落地、level_shop 一处未迁」);commit 信息不可改,以本节记录在案。
## 七、S13 对账复核
实测 `python tools/gdstyle_gate.py`(工作目录 game/,退出码 1):
```
[gdstyle_gate] 扫描面 158 个 .gd;命中 6 条,基线内 5 条,基线外新违规 1 条,较登记值恶化 0 条
FAIL 新增 game/core/minesweeper_rules.gd|quality/max-public-methods
[gdstyle_gate] FAIL — 基线外新违规 1 条/恶化 0 条——新码须修到基线口径内,恶化须还债或经用户批准随批重生成基线
```
与实现报告 §六 逐字一致。独立考证:基点 63fe2da0 的 minesweeper_rules.gd 公开方法实数 19(`git show 63fe2da0:game/core/minesweeper_rules.gd` 逐 func 清点);HEAD 21(含新增 harmful_variants/harmful_adjacent 两搬家方法,diff :58/:70 证实)→ 21>20(S13 默认阈值)。其余触件只降不升(action_economy 类变量 14→12 实测;gdstyle 无第二键恶化)。
该项为实现报告 §六已停卡呈报待用户裁的结构闸项(写卡考证 18 失实、基点实数 19、+2 搬家方法),**不属于验收闭合缺陷**——本审计如实记录其状态与呈报位置,不计入审计终判。**合并前置条件=用户对该键的裁决**(特批准记基线随还债降键,或裁实现报告 §六读法 B 开 fix-iter51-s13 修复批后重审计)。
## 八、终判
**通过**——四卡对照表全部行(卡① 3 行/卡② R1–R6/卡③ R1/卡④ R1–R10)验收断言真实存在、尾缀可 grep 定位、真实入口未绕过被测改动点、判据绑被测改动特有的可观测提交面;最窄复跑五件套+审计自选两件+对照表引用全部其余套件绿(22 件全 0 退出码);测试削弱全部落在四卡申报清单与实现报告决定记录内,零未申报删改;直查例外均有注记;卡① 蓄力层族与卡④ hobgoblin 零残留 grep 达成且例外均为申报例外。
记录在案三项(均不改变终判):
1. **S13 一键**(minesweeper_rules 公开方法 21>20)——停卡呈报在案(实现报告 §六)。**合并前置条件=用户对该键的裁决**;裁决后按既定通道走。
2. **申报失实一项**——实现报告 §七 第 8 条「三处测试直连迁移」实际落地两处(level_shop_economy_test :1484 未迁),建议订正报告;非验收缺漏、非测试削弱。
3. 卡② golden 改前固化读数以 GOLDEN 常量在案(settlement_wiring_snapshot_test.gd:22-416,seed 4242),改后对拍绿——对拍读数在案义务已履行。
+1 -1
View File
@@ -141,7 +141,7 @@ TERM_CONTEXT_EXEMPT = {
"雾格": re.compile(r"不做清单|战争迷雾类机制"),
# heavy_multiplier 字段与 ambusher 敌人行同于 2026-09-20 八型批整体退役(enemy_table.gd
# 与 enemy.tres 均零命中);battle.md「敌人意图线索映射目录」是 2026-09-12 成文占位表,
# 现行敌人为 goblin/hobgoblin/bugbear/giant_spider/drider/duergar 系,占位行里的退役
# 现行敌人为 goblin/bugbear/giant_spider/drider/duergar 系,占位行里的退役
# 敌人 id 只能读作历史留档(真正的现行规格在 敌人系统.md「目标顺位与意图线索」节)。
"伏击": re.compile(r"ambusher|成文占位"),
"heavy_multiplier|重击倍率": re.compile(r"ambusher|heavy_multiplier|成文占位"),
+1
View File
@@ -8,5 +8,6 @@
game/core/adventure_runner.gd|quality/max-class-variables = 23
game/core/level_runner.gd|quality/max-class-variables = 30
game/core/level_runner.gd|quality/max-public-methods = 33
game/core/minesweeper_rules.gd|quality/max-public-methods = 21
game/presentation/views/board_view.gd|quality/max-class-variables = 31
game/presentation/views/board_view.gd|quality/max-public-methods = 27
+2
View File
@@ -482,6 +482,8 @@
## ㊶ 迭代 43——战斗一屏样张批方向稿目检(2026-10-30 随批后收尾登记)
> **✅ 已核销(2026-11-04)**:用户会话裁定三项按通过处理(未逐项呈报读数)——样张整体过闸成立,本批无缺陷呈报;连带 ㉘ 第 5 项群伤暗档 provisional 观感复核一并了结。回流落点见 art-bible §1.4 样张登记句与 08-Alpha版本标准「五 · 表现」两行。
> 单卡合回(2026-10-30,git 提交 3b66d1a6):战斗一屏样张批——五项实装定值(血条危险红/条底收常量/顺位徽标提档/护甲三枚 24×24 PNG/名字行素底牌不压地台+地台件九宫格接装)+样张脚本扩展(两版画布出口、整屏四项与战斗表现五项机检 30/30 全绿、单元套件 18 checks 全绿)。**方向稿目检先行**(art-bible §1.4 闸形)——机检已全绿,气质终审通过才算样张整体过闸;通过前终稿资产与动画设计不启动。登记不阻塞(2026-10-12 真人检测立规);读数与论证详见实现报告(git 提交 3b66d1a6 一线可考)。
| # | 目检项 | 判据 | 材料 |
+4 -4
View File
@@ -170,7 +170,7 @@
#### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现)
**实况**:审计报告 P0-3——定稿立绘零帧动画;现行动画全部程序化(死亡碎裂/受击闪白/意图徽标弹入=程序 tween,非帧资产)。用户裁定**动画是较往后的优化,Alpha 版本定版时间点之前完成即可**——当前 Alpha 开发期达成「看上去可游玩」即可。路线未拍板,审计报告三路线供重启时裁决:①**拆件驱动**(报告推荐:定稿立绘切部件〔头/躯干/臂/腿/武器〕+ 节点层级 tween 驱动——零身份漂移、帧数无限、内存小;项目已有先例=shovel_swing 三帧 + 程序化死亡碎裂)②AI 关键姿势 + 人工修 + 程序补帧 ③全 AI 逐帧(不推荐:身份漂移/像素抖动)。前置依赖=「立绘→派生形态」管线(等比整数缩放 + 降色 ≤32 + 脚底基线对齐 + 命名合规)。**2026-11-04 用户裁改排 Beta**:本条移出 Alpha 定版前置清单,Alpha 定版不再以它为闸,路线三案与上述前置管线依赖原样留到 Beta 立项再裁(取代 2026-10-06 登记与 2026-10-13 补裁的「定版前完成最小版/未完成则顺延 Beta」口径;标题「Alpha 定版闸前完成」系登记时点原文,按登记元数据禁改条款保留)。
**实况**:审计报告 P0-3——定稿立绘零帧动画;现行动画全部程序化(死亡碎裂/受击闪白/意图徽标弹入=程序 tween,非帧资产)。用户裁定**动画是较往后的优化,Alpha 版本定版时间点之前完成即可**——当前 Alpha 开发期达成「看上去可游玩」即可。路线未拍板,审计报告三路线供重启时裁决:①**拆件驱动**(报告推荐:定稿立绘切部件〔头/躯干/臂/腿/武器〕+ 节点层级 tween 驱动——零身份漂移、帧数无限、内存小;项目已有先例=shovel_swing 三帧 + 程序化死亡碎裂)②AI 关键姿势 + 人工修 + 程序补帧 ③全 AI 逐帧(不推荐:身份漂移/像素抖动)。前置依赖=「立绘→派生形态」管线(原稿像素化后入包、禁再降采样 + 降色 ≤32 + 脚底基线对齐 + 命名合规;显示缩放走 art-bible §8.2 乙类口径=档高÷源高、NEAREST、允许非整数倍)。**2026-11-04 用户裁改排 Beta**:本条移出 Alpha 定版前置清单,Alpha 定版不再以它为闸,路线三案与上述前置管线依赖原样留到 Beta 立项再裁(取代 2026-10-06 登记与 2026-10-13 补裁的「定版前完成最小版/未完成则顺延 Beta」口径;标题「Alpha 定版闸前完成」系登记时点原文,按登记元数据禁改条款保留)。
**缺口**:还差 Beta 立项批的路线正式拍板(预选拆件驱动)——拍板后立帧数规格与资产工单。
- 相关文档:[art-bible](design/art/art-bible.md) §8.4 帧数规格 · 战斗表现批
@@ -192,13 +192,13 @@
#### 棋盘封印印记图形换代——现件仍是扫雷旗形,改法阵或锁链待设计(2026-10-30 登记,来源=会话提及)
**实况**:用户口径=封印图标现为扫雷旗形,改法阵或锁链待设计,形未定先做讨论。现件 `game/assets/art/board/seal_mark.png`(32×32 旗形剪影);消费面两处——棋盘封印槽绘制(`tile_palette.gd:19` → `board_view.gd:616`)与战末金蜡封徽记(`battle_end_overlay.gd:65-69` 复用同图);「旗」概念已全库退役(2026-10-18),文档口径仍以旗为形待换代:[美术圣经](design/art/art-bible.md) v3.23 §3.2/§4.1、[美术资源依赖清单](design/art/art-assets-checklist.md) §3.3/§4、[战斗屏 UX](design/gdd/ux/battle.md) :128/:270、[体验验证清单](体验验证清单.md) 第 4 条。
**实况**:2026-11-04 讨论定案——形=**环+十字法阵**(外环=圈定,环内十字=钉住此格,四端顶到环内沿连成一体);色=封印黑 `#000000` 纯黑无光效(封印紫在封印黑批已退役、不并存);画法=纯黑实心块面、禁细线(32px 下细线断成碎点)。尺寸定值落 [美术圣经](design/art/art-bible.md) v3.38 §8.2「封印印记源档」(外径 23px/环壁 2.6px/十字臂 3.2px/外沿距格边 ≥4px),形与画法落 §3.2。终稿已同名替换 `game/assets/art/board/seal_mark.png`(32×32)。连带件=战末金蜡封徽记沿用同图(零代码改动);特效两件只做常显。消费面 `tile_palette.gd:19`、`board_view.gd:539`/`:582`、`battle_end_overlay.gd:84`。同批清圣经四处「旗」与 §4.1 旧形前提,[美术资源依赖清单](design/art/art-assets-checklist.md) §3.3/§4 与 [美术素材状态清单](design/art/art-status-checklist.md) 同步;圣经 :370/:540 两处「背包旗」属 character-design 命名,未动。
**缺口**:还差封印印记图形设计讨论(法阵/锁链两案并列,禁代裁),须一并裁五点:①形(与危险格巢穴纹、奖励徽章剪影语言 art-bible §3.1 互辨);②色(法阵带发光/色相与 §4.1 封印黑不变槽冲突,须重登记判据);③尺寸遮挡(32×32 内「数字 > 小人 > 封印印记」栈位不侵入数字字形区);④金蜡封徽记与悬停「封印(印记形)」光标是否同步换;⑤与封印特效两件(施印瞬间/常显形态)合并或分立。裁决写入 art-bible §3.2/§4.1 与两份美术清单后方可出样张(终稿名沿用 `seal_mark.png`)。
**缺口**:还差两件:①实机目检(三关封印印记形状可读、与巢穴纹/变异纹带不同格混淆、战末蜡封观感);②施印瞬间特效未实装(清单 §4 两件中的第一件)。
**改动面**:文档+美术素材
**状态**:待美术设计
**状态**:美术设计中
### 教学引导