merge: 文件头零工作日志红线+全仓头注清偿(2026-10-15 用户令)

This commit is contained in:
DKChan committed 2026-10-15 04:09:02 +08:00
commit 58432701df
94 files changed
+386 -458

No files matched your search

+1
View File
@@ -121,6 +121,7 @@
- **呈报六问铁规(2026-10-07 用户立规)**:向用户呈报一切事物——bug、需求、概念设计、提案——一律按六问结构顺序展开,确认后才动手实现:①**What 现状与差异**——现在是什么样(引用文件、行为等事实)+ 要做什么/改什么;②**Why 期望与动机**——目标态是什么样、为什么值得改,含「不做的代价」;③**How 怎么改**——修改路径,有备选案全部列出不私藏;④**Where 影响面**——改动波及哪些系统、文件、流程、既有裁决;⑤**怎么算改对了**——可判定的验收标准,不写模糊话;⑥**不确定的地方**——没把握、需要用户裁决的点,单列收尾不埋正文。**Who/When 不进呈报正文**——谁来执行、什么时候做由用户决定,由 roadmap 与需求卡片承接,呈报里最多一句话带过。**适用范围(2026-10-08 用户补立)**——六问结构只用于**首次描述需求、bug 缺陷或相关方案**的呈报;同一方案的后续对答(追问、讨论、细化、执行汇报)不再套用六问结构,除非用户显式要求
- **真人检测不阻塞(2026-10-12 用户立规)**:一切需要真人检测/实机目检/人工验收的事项一律「只登记、不等待」——登记进 07-体验验证清单(或当批实现报告目检总清单)即完成 agent 侧义务;自动化闸全绿即可合并收口,后续迭代照常开工,验收时间由用户自行安排。禁止把等真人检测当作任务阻塞点、停工理由或收口必要条件,也禁止因往期遗留真人检测项而拦截新迭代开工
- **文件头零工作日志(2026-10-15 用户立规)**:代码文件(.gd 等)文件头注释只承载现在时——文件职责、接口契约、设计权威(GDD)锚;禁止写任何形式的变更日志/工作日志:带日期条目、批次号叙事段(「XX批/T几/迭代N 做了什么」)、迁移与退役经过叙述一律不得进文件头。变更叙事唯一归宿 = commit message 与迭代实现报告;「注释描述现在、历史归版本控制」是工程基线,不依赖本仓规范另行授权——规范未提及不构成许可。存量 17 文件已随本令同批清偿(2026-10-15)
- **数值单一事实源**:玩法数值只存 `data/tables/`(.tres),经 `ConfigDB` autoload 类型化单点读取;禁止数值字面量与自建 `load()` 表路径
- **RNG 单点**:禁止 `randomize()` / 自建 RandomNumberGenerator——随机只经 `RngService` 统一流(单盐单计数器+用途标签+全事件日志,ADR-0007 裁丙 2026-09-27)
- **Core 层零 UI 依赖**:完整战斗必须可 `--headless --script` 跑通
+9
View File
@@ -40,6 +40,15 @@
> **反面案例(2026-09-11,用户:"是没有代码规范吗")**:ID 前缀是跟随 GDD 文档名的事实约定,
> 从未成文;同目录 `config_db`/`rng_service` 无前缀与 A/B/C 系列并存——两套命名即规范缺失的铁证。
### 1.4.1 文件头零工作日志(2026-10-15 用户立规)
文件头注释只描述现在——职责、契约、GDD 锚。禁止任何变更叙事进文件头:
带日期条目、批次叙事段(「XX批」「T几」「迭代N」开头的"本批做了什么")、迁移/退役经过注记一律禁止;
改动历史查 `git log`/`git blame`,变更背景读对应迭代实现报告。
> **反面案例(2026-10-15,用户令全仓清偿)**:main.gd 文件头曾累积 42 行——11+ 笔提交各自往头注
> 追加一段「本批做了什么」,全部闸静默放行;save_manager.gd 曾达 49 行。同批 17 文件存量已清;
> 红线正文见 CLAUDE.md 硬性红线。
### 1.5 禁止事实约定
任何"大家默认这么做"的惯例必须成文进本文件(或 CLAUDE.md)才算存在。
写代码时发现未成文但必须遵守的约定 → 当场补条文,不许靠惯性延续。
+10 -12
View File
@@ -13,27 +13,25 @@
# 封顶的执行归本类);
# ④ 关卡结束 = _on_level_finished(LevelRunner.level_finished 到达——结果 + 生命终值 + 节点位置)。
#
# 接口漂移清偿登记(06 清单①②③⑥⑦——LevelRunner 侧同批登记):①种子域归本类
# (start_adventure 调 rng.new_adventure 全冒险恰一次;LevelRunner 冒险模式不重播种);
# ②生命账本归本类(共享 _ledger);③恢复兑付执行归本类(_rest_handler);⑥收束先清库后宣布——
# 现行无关卡域库存(格面资源批 2026-09-15 后为空集),战斗结束 retire_mapping + despawn_all 先于
# battle_finished 即事实清库,不另设空接口;⑦失败结算归本类(LevelRunner 只上报结果)。
# 职责切分:主种子注入恰一次归本类(start_adventure 调 rng.new_adventure 全冒险恰一次;
# LevelRunner 冒险模式不重播种);生命账本归本类(共享 _ledger);恢复兑付执行归本类(_rest_handler);
# 收束先清库后宣布——战斗结束 retire_mapping + despawn_all 先于 battle_finished 即事实清库,
# 不另设空接口;失败结算归本类(LevelRunner 只上报结果)。
#
# 收束次序登记(大奖励兑付时点——冒险结构.md「关卡大奖励」):关卡节点地图先清库、后宣布关卡
# 结束(次序不可换);大奖励在宣布之后、下一关开始之前兑付——本类 _on_level_finished 兑付、
# continue_to_next_level 开始下一关,两步间为呈现层大奖励屏(冒烟/自动路径立即确认)。
# 结算受理只算一次(契约):state != "running" 的关卡结束宣布与放弃请求一律拒绝并留诊断,
# 账本与摘要零变化。
# 停点前移批(2026-09-23,用户拍板「关卡开始即出节点图选路、选节点才进战斗」):每关开始 =
# 入口选路停点——_start_current_level 以 defer_entry 起关,level_started 之后才 present_entry_choice
# (信号顺序契约:呈现层先重取 runner 实例,选路口才不会被空防御丢弃);pick 入口候选走同一
# _enter_node(entry)、呈现零 RNG 消耗——与旧「start 直进首战」逐位等价,测量面零漂移。
# 关卡切换(continue_to_next_level)后新 LevelRunner 实例重新走 defer 流程;abandon 在入口停点
# 天然非战斗期(current_battle 为空)——受理语义与选路停点一致。
# 入口选路停点:每关开始 = 选路停点——_start_current_level 以 defer_entry 起关,level_started 之后才
# present_entry_choice(信号顺序契约:呈现层先重取 runner 实例,选路口才不会被空防御丢弃);
# pick 入口候选走同一 _enter_node(entry),呈现零 RNG 消耗;关卡切换(continue_to_next_level)后
# 新 LevelRunner 实例重新走 defer 流程;abandon 在入口停点天然非战斗期(current_battle 为空)
# ——受理语义与选路停点一致。
# 纪律:ADR-0001 S6——连 runner 信号一律 _forward_* 方法 Callable(禁 lambda 捕获 self 成环);
# Core 层禁 UI 引用;数值零字面量——level_clear_hp_bonus / keystone_per_level 只读 db.adventure,
# 基础上限只读 db.hero。
# 断点续玩(迭代 8 卡①):save_manager 经 set_save_manager 注入(缺省 null = 不写断点——模拟/
# 断点续玩:save_manager 经 set_save_manager 注入(缺省 null = 不写断点——模拟/
# 冒烟零触达零扰动);停点快照挂 choices_presented 转发点(选路停点=唯一可恢复停点形态,战斗中
# 不存);三结局 _settle 清断点;resume_adventure 经 rng.restore_adventure 回填「主种子+计数器」
# ——续玩从断点号位精确续接原随机时间线。
+2 -3
View File
@@ -1,7 +1,6 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 同调位求值服务(迭代 21 天赋树实装批 T4 换代——槽位收编 Q2 裁甲:槽位数量=树上同调位节点点亮数,
# 旧「按击杀 Boss 次数/通关次数自动涨」谓词表判定链随批删除〔attunement_growth.tres 与表访问器
# 随 T5 清退;boss_kill_count/clear_count 计数域保留——各有非槽位硬消费,见卡片 T0⑥〕)。
# 同调位求值服务(槽位数量=树上同调位节点点亮数;无谓词表判定链——
# attunement_growth.tres 与表访问器不存在;boss_kill_count/clear_count 计数域保留——各有非槽位硬消费)。
# 纯函数零副作用;attune=off 纪律:零 await、零 RNG、零写副作用。
class_name Attunement
extends RefCounted
+14 -15
View File
@@ -1,27 +1,26 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-10
# 战斗结算编排中枢:轮次生命周期唯一 owner · 五段结算(授予→增益/减益→战斗→衰减→判定——2026-09-15
# 格面资源批,道具窗口/道具段随可选类删除下线)· 授予段极性路由(「动作 × 格型」矩阵:开安全格/标中旗
# 战斗结算编排中枢:轮次生命周期唯一 owner · 五段结算(授予→增益/减益→战斗→衰减→判定)·
# 授予段极性路由(「动作 × 格型」矩阵:开安全格/标中旗
# = 正向,开雷格/标错旗 = 负向;结算队列 + 抵消过滤——标旗后被撤旗以轮末在场旗为基线不判)·
# 10 类行协议可回放步骤流(零 await;随机消费三处皆封闭流——开战遭遇骰〔初始化随机〕+ 技能摇号
# behavior_roll〔回合内、开轮时点、步骤流之外——敌人技能池批 2026-09-16〕+ 护甲等级掷点〔回合内、
# behavior_roll〔回合内、开轮时点、步骤流之外〕+ 护甲等级掷点〔回合内、
# 步骤流之内〕;同种子同输入逐位复现)· 高光双落(完美排雷 ×2 / 标中旗 highlight)·
# Waiting 相位结算触发(不依赖事件到达序)。
# GP+商店房实施批(2026-09-21):授予段极性路由增 GP 型兑付(effect_id gp_gain/gp_loss → 战斗内缓冲
# escrow 记账,不入钱包不入增益容器);战斗结束分支掷 gp_drop 封闭流(每战斗末恰一 scope)出
# GP 型兑付:授予段极性路由含 GP(effect_id gp_gain/gp_loss → 战斗内缓冲 escrow 记账,不入钱包
# 不入增益容器);战斗结束分支掷 gp_drop 封闭流(每战斗末恰一 scope)出
# gp_dropped = 掷定 + level_gp_bonus + escrow 随 battle_finished 上抛——战斗域零 GP 状态持久。
# 伤害管线单据化批(2026-09-24 用户三裁决,06 台账 148):伤害兑付全部收口 伤害控制器(DamageController
# 单点管线)——本类六调用点(主角先手/敌方伤害技/棋盘克制直伤/群伤/反噬/地形变异)退化为开单点
# (流程决定何时开单给谁开单;单据怎么算归控制器)。结账时机开关在控制器 policy:IMMEDIATE(A=开单
# 即结,逐位等价迁移前行为——回切位)/ SEGMENT(B=攒批到段界 flush:战斗段尾统一兑现)。
# 地图伤害账殿后批(案C 2026-10-06 用户裁——「主角先手」歧义质询触发):授予段不再当场兑付任何伤害——
# 全部伤害形态单据经 _submit 暂存闸入 _deferred_board(保授予段事件序),战斗段「主角先手→逐敌还手」后
# 补提交统一结账;主角死于敌方还手 → 暂存单整体不兑,逐单留「未生效(主角已倒下)」行(forfeit=hero_down)。
# 伤害管线:伤害兑付全部收口 DamageController 单点管线——本类六调用点(主角先手/敌方伤害技/
# 棋盘克制直伤/群伤/反噬/地形变异)为开单点(流程决定何时开单给谁开单;单据怎么算归控制器)。
# 结账时机开关在控制器 policy:IMMEDIATE(开单即结)/ SEGMENT(攒批到段界 flush:战斗段尾统一兑现)。
# 地图伤害殿后:授予段不当场兑付任何伤害——全部伤害形态单据经 _submit 暂存闸入 _deferred_board
# (保授予段事件序),战斗段「主角先手→逐敌还手」后补提交统一结账;主角死于敌方还手 → 暂存单
# 整体不兑,逐单留「未生效(主角已倒下)」行(forfeit=hero_down);
# 死亡事件 = 单位容器 unit_died(单位自行宣布)→ 控制器作废该敌未结单据〔死亡即不动手〕/ 主角死终止兑付。
# 切片登记:① 事件总线载体 = 直连信号(实现期 ADR 项,provisional)② Waiting 相位刷新通道 2026-09-15 用户拍板整体
# 拆除(仅 Active 挖掘期受理)③ 效果行协议 = 授予段逐 grant 行 + 增益/减益段续存实例组合行。
# 实现 GDD:design/gdd/systems/战斗循环/战斗结算.md(v0.7 格面资源批——registry 追溯锚)
# 切片登记:① 事件总线载体 = 直连信号(实现期 ADR 项,provisional)② Waiting 相位无刷新通道
# (仅 Active 挖掘期受理)③ 效果行协议 = 授予段逐 grant 行 + 增益/减益段续存实例组合行。
# 实现 GDD:design/gdd/systems/战斗循环/战斗结算.md(registry 追溯锚)
class_name BattleOrchestrator
extends RefCounted
+2 -2
View File
@@ -1,9 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-10-02(code-quality 修复批 T5——ConfigDb 拆分:跨表校验协作类,自 config_db.gd 迁出)
# Date: 2026-10-02(ConfigDb 拆分——跨表校验协作类,自 config_db.gd 迁出)
# 职责单一化(Rule 6 校验双通道的跨表一侧):_cross_validate 全域(悬空引用/池护栏/节点精确行/
# 技能池构成)+ validate_skill_pool_links(冒烟直验独立入口)。ConfigDb autoload 门面保持——
# load_tables 调用点与冒烟直验经门面同名方法,公有签名零变化。
# 诊断通道注入:跨表校验的行级错误经 push_diag: Callable 外发(门面传方法引用 push_diag——迭代 27 T6 Callable 换装)——
# 诊断通道注入:跨表校验的行级错误经 push_diag: Callable 外发(门面传方法引用 push_diag)——
# 本类零 ConfigDb 依赖(无状态纯校验器,装载序上先于成员赋值执行的前提保持)。
# 迁移注记:validate_skill_pool_links 的 status_table 显式入参纪律照抄(装载通道传 loaded 表,
# 冒烟直验传门面 status_effects;null 时 side 守卫跳过)——返回错误列表不进诊断通道,消费面归调用方。
+7 -8
View File
@@ -1,13 +1,12 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-24
# 伤害控制器:伤害单据唯一兑付管线——伤害管线单据化批(2026-09-24 用户三裁决,06 台账 148)。
# 背景:伤害此前无对象抽象——五族来源(主角攻击/敌方行动/棋盘克制直伤/棋盘群伤/反噬地形)在
# 战斗编排器内各自内联组装管线;类型轴(attack_type)与算术层(DamageMath)早已收口,缺的是
# 「一次伤害」这个对象与单点管线。本类补上:五调用点退化为开单点(流程决定何时开单、给谁开单),
# 本类决定一张单经过哪几步(掷点 → 折扣 → 暴击 → 克制点数 → 池乘区 → 落地下限 → 交付)。
# 用户三裁决落位:
# ① 兑现时机双模式(结账时机开关):POLICY_IMMEDIATE(A——开单即结,逐位等价 2026-09-24 前现状
# 行为,回切位)/ POLICY_SEGMENT(B——开单攒批、段界统一结账;流程在授予段尾与战斗段尾调 flush)。
# 伤害控制器:伤害单据唯一兑付管线。
# 分工:五族伤害来源(主角攻击/敌方行动/棋盘克制直伤/棋盘群伤/反噬地形)的调用点只决定
# 何时开单、给谁开单;本类决定一张单经过哪几步(掷点 → 折扣 → 暴击 → 克制点数 → 池乘区 →
# 落地下限 → 交付)。
# 设计要点:
# ① 兑现时机双模式(结账时机开关):POLICY_IMMEDIATE(A——开单即结,回切位)/ POLICY_SEGMENT
# (B——开单攒批、段界统一结账;流程在授予段尾与战斗段尾调 flush)。
# 切换=改 policy 一个值,管线/单据/数据表零改动。
# ② 目标 = 结账时刻照 target_rule 看现场解析(front_alive_enemy = 行主序最前存活敌 / hero /
# all_alive_enemies)——开单时只写规则不冻结对象。
+3 -3
View File
@@ -1,9 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# 实现 GDD:design/gdd/systems/战斗循环/战斗结算.md(系统 ID B1·战斗结算——registry 追溯锚,命名规范见 CLAUDE.md)
# 战斗结算·战斗段伤害公式族(零状态纯算术宿主——规范 1.2「工具性纯函数挂明确宿主类」;
# 自 battle_orchestrator 拆出 2026-09-13,封装审查 O3)。池读取与表值读取仍归 战斗结算,本类只做算术。
# 护甲等级掷点批(2026-09-16):掷点查档与吃掷点分量算术收编本类(判定式参数化——表值零字面量纪律不变)。
# 战斗结算·战斗段伤害公式族(零状态纯算术宿主——规范 1.2「工具性纯函数挂明确宿主类」)。
# 池读取与表值读取仍归 战斗结算,本类只做算术;掷点查档与吃掷点分量算术在本类
# (判定式参数化——表值零字面量纪律不变)。
class_name DamageMath
extends RefCounted
+3 -4
View File
@@ -1,9 +1,8 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-10-06(迭代 17 卡⓪ 内容数据驱动扩展批 T1——效果引擎框架)
# 内容数据驱动扩展(需求卡片 design/research/需求卡片-内容数据驱动扩展批-2026-10-06.md;设计权威
# design/research/研究-内容数据驱动扩展架构-2026-10-06.md):把「内容的效果行为」从散布在结算
# Date: 2026-10-06(效果引擎框架)
# 内容数据驱动:把「内容的效果行为」从散布在结算
# 代码里的硬编码分支搬进内容数据行三个字段——订阅哪个事件(on)/ 什么条件(when)/ 什么效果(do)
# ——由本解释器统一执行。完成后加一件「已有效果类型」的新专长/新秘宝=只改 .tres 数据行,零代码。
# ——由本解释器统一执行。加一件「已有效果类型」的新专长/新秘宝=只改 .tres 数据行,零代码。
# 架构模型(R1 裁决):发布订阅——结算管线同步 emit 事件(无队列无异步,确定性优先)→ 本引擎遍历
# 持有订阅集匹配 → 返回按声明序排列的效果命中(do 列表),由发射点按组合规则施加。
# 多订阅与冲突(R3 裁决):一事件多订阅=常态;冲突在效果类型层用组合规则封死(§3.4 六族);遍历序
+18 -23
View File
@@ -4,31 +4,26 @@
# 关卡节点地图(v1.0 图版落地——节点+连线,连线只朝前进方向,唯一入口,Boss 恒唯一终点):
# 关卡域生命周期唯一编排者——HP 跨战斗携带、恢复点节点兑付、关卡末收束。
# 行进纪律(零自动推进):到达即兑付;兑付后确认才出现选路口——战斗胜利与奖励/恢复确认一律经
# choices_presented 进入选路态,玩家 pick_next_node 显式选下一跳(接口漂移清偿:战斗胜利不再自动推进、
# continue_after_node 泛化为兑付确认——选路确认归 pick_next_node)。
# 2026-09-15 格面资源批:可选类道具与库存整体删除——奖励点节点内容随功能道具渠道(P1,渠道未定)悬置为
# 直通节点(零兑付);战斗各自持有 地图战斗资源 容器(映射随战斗退役,无跨战斗状态可延续)。
# choices_presented 进入选路态,玩家 pick_next_node 显式选下一跳。
# 奖励点节点内容悬置为直通节点(零兑付——内容渠道未定);战斗各自持有 地图战斗资源 容器
# (无跨战斗状态可延续)。
# Core 层零 UI 依赖(headless 可跑完整关卡——数据配置 Rule 7)。
# 测试专用:hero_atk_pct/hero_hp_pct 数值覆盖(调整板模拟天赋树——正式侧归元进度,切片不落盘)。
# E4 收口(2026-09-13):覆盖值经 encounter 显式传入战斗(不再写 db.hero 表——表值运行期不可变,
# 双基线同步/双写叠加 6→18→54 整类隐患随表写一并移除)。
# 测试专用:hero_atk_pct/hero_hp_pct 数值覆盖(调整板模拟天赋树——正式侧归元进度,切片不落盘),
# 覆盖值经 encounter 显式传入战斗——零表写,db.hero 运行期只读。
# 对应 GDD:关卡节点地图 v1.0(图版结构——本文件为 P1 批实现位;命名规范见 CLAUDE.md)
# GP+商店房实施批(2026-09-21):GP 冒险钱包(战斗完成入账 clamp ≥0 · 冒险收束清零)+ 统一冒险
# 加算区 bonus{atk,max_hp,armor_class}(商店购买与关卡大奖励共用账本——战斗开始参数 = 基础表值 +
# 加算区,调试浮窗百分比在加算之后乘)+ 商店房节点兑付(开覆盖层/购买出账/离开回选路确认——
# 复用 continue_after_node 兑付确认纪律,零自动推进)。
# 冒险结构实现批(2026-09-21)——接口漂移清偿登记(06 清单「切片行进代码与定稿的接口漂移」①②③⑥⑦):
# ① 种子域归冒险结构:start_level 旧路径(单关测试模式)保留自调 rng.new_adventure;新路径
# start_level_external(冒险模式)不重播种——主种子注入恰一次归 AdventureRunner.start_adventure。
# ② 生命账本归冒险结构:hero_hp/gp 改属性落 _ledger 字典——冒险模式经 start_level_external 注入
# AdventureRunner 共享账本(Dictionary 引用共享),单关模式 = 本实例私有账本;战斗结果上报语义 =
# runner 经共享账本属性直写(接口②——战后生命终值已在本类 _on_battle_finished 回写账本)。
# ③ 恢复数学抽成单一路径 rest_heal_amount——冒险模式经 _rest_handler 回调(AdventureRunner.apply_rest,
# 接口③治疗封顶回报执行体归冒险结构);单关模式默认内置。公式逐位一致,零行为变更。
# ⑥ 收束先清库后宣布——现行无关卡域库存(格面资源批 2026-09-15 可选类删除后为空集),战斗结束
# retire_mapping + despawn_all 先于 battle_finished 发出即事实清库,不另设空接口(假契约)。
# ⑦ 倒下的失败结算归冒险结构:本类只发 level_finished(每战结果上报语义),失败结算由
# AdventureRunner._on_level_finished 执行;GP 冒险收束清零同步归冒险结构(本类冒险模式不关钱包)。
# GP 冒险钱包:战斗完成入账(clamp ≥0)、冒险收束清零。统一冒险加算区 bonus{atk,max_hp,armor_class}:
# 商店购买与关卡大奖励共用账本——战斗开始参数 = 基础表值 + 加算区(调试浮窗百分比在加算之后乘)。
# 商店房节点兑付:开覆盖层/购买出账/离开回选路确认(复用 continue_after_node 兑付确认纪律,零自动推进)。
# 种子域:单关模式 start_level 自调 rng.new_adventure;冒险模式 start_level_external 不重播种
# (主种子注入恰一次归 AdventureRunner.start_adventure)。
# 生命账本:hero_hp/gp 属性落 _ledger 字典——冒险模式经 start_level_external 注入 AdventureRunner
# 共享账本(Dictionary 引用共享),单关模式 = 本实例私有账本;战斗结果上报 = runner 经共享账本属性
# 直写(战后生命终值在本类 _on_battle_finished 回写账本)。
# 恢复数学单一路径 rest_heal_amount——冒险模式经 _rest_handler 回调(AdventureRunner.apply_rest),
# 单关模式默认内置。
# 收束:战斗结束 retire_mapping + despawn_all 先于 battle_finished 即事实清库(关卡域库存现行空集)。
# 失败结算:本类只发 level_finished(每战结果上报语义),失败结算由 AdventureRunner._on_level_finished
# 执行;GP 冒险收束清零同步归冒险结构(本类冒险模式不关钱包)。
class_name LevelRunner
extends RefCounted
+3 -3
View File
@@ -5,11 +5,11 @@
# 元进度账本服务(Core 层零 UI、纯被动服务——同 StatusContainer 先例:零信号零外发,读存档算账)。
# 职责三件:① 属性锻造定价与购买(几何递增——tier 级价格 = 迭代 floor(p × ratio/100),tier 0 =
# base_price,floor 单一取整对齐 round_direction 纪律);② 道具工坊解锁(渠道由 meta.tres channel
# 字段声明、判定量换算单点 _workshop_progress——2026-09-21 用户拍板可替换轴;首版 = 总通关次数,
# 钥石直购价随定价批后补最终双渠道;六件局内效果归 Alpha 秘宝重设计批,本类只有解锁状态);
# 字段声明、判定量换算单点 _workshop_progress——可替换轴;现行 = 总通关次数,
# 钥石直购价后补最终双渠道;六件局内效果不入本类(只承载解锁状态);
# ③ 冒险收束入账(Boss 两档 = 表值 first_kill/repeat_kill,首杀标记读存档判first;调 SaveManager
# apply_adventure_summary 入账并附 boss_drops 副本——复盘可归因,验收 5)。
# 注入面:hero_override() = 树生命/命中淬炼 flat + 锻造路线加值(当前选中武器/甲——迭代 23 T4 换代,
# 注入面:hero_override() = 树生命/命中淬炼 flat + 锻造路线加值(当前选中武器/甲——
# 全零 = 白板合法态;override 不写表——表运行期只读,消费方 AdventureRunner/LevelRunner 经冒险开始
# 参数面显式传参)。
# 纪律:数值零字面量——价格/档位/阈值/两档金额只读 db.meta_* 访问器;存档只经 SaveManager 访问器,
+2 -2
View File
@@ -3,8 +3,8 @@
# Date: 2026-09-10
# 排雷玩法规则引擎:零随机/零表读取/零 UI——输入 = 棋盘生成 产物 + 意图序列,输出 = 三事件流。
# 核心契约:install 四不变式 · 初始展开 = R₀ 恰等 · 连锁不越旗 · 批次语义序仲裁(cleared > stop > 其余)。
# 旗语义(插旗不可逆批 2026-09-19 用户拍板全套落地):旗 = 一次性承诺——挖旗格放行(本格旗事务内
# 隐式退役、轮末不判),拔旗动作退役(flag_pull 出目录)。
# 旗语义:旗 = 一次性承诺——挖旗格放行(本格旗事务内
# 隐式退役、轮末不判);无拔旗动作(flag_pull 已出目录)。
# 实现 GDD:design/gdd/systems/排雷循环/排雷玩法.md(系统 ID A2·排雷玩法——registry 追溯锚,命名规范见 CLAUDE.md)
class_name MinesweeperRules
extends RefCounted
+2 -2
View File
@@ -7,8 +7,8 @@
# 极性不在资源内:「动作 × 格型」矩阵的字典定义归 GDD、路由执行归 战斗结算 授予段
# (本类只提供 polarity_row 的(类型, 极性)→ 字典行查询面)。
# 切片登记:取号约定 = randi_range(0, W-1)(实现期 ADR 事实,切片内恒定);
# 区间行 power roll 在身份批内追加取号(伤害量值区间批——快照 power = roll 值,授予期零随机不变)。
# 实现 GDD:design/gdd/systems/战斗循环/地图战斗资源.md(v0.4 格面资源批——registry 追溯锚)
# 区间行 power roll 取号语义:快照 power = roll 值,授予期零随机不变。
# 实现 GDD:design/gdd/systems/战斗循环/地图战斗资源.md(registry 追溯锚)
class_name RewardEconomy
extends RefCounted
+4 -4
View File
@@ -1,15 +1,15 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-10
# RngService autoload(数据配置)——统一随机流单点(Rule 5;ADR-0007 裁丙 2026-09-27:七流并一+全事件日志)。
# RngService autoload(数据配置)——统一随机流单点(Rule 5;ADR-0007 裁丙:七流并一+全事件日志)。
# 玩法代码禁止 randomize()/自建 RandomNumberGenerator。
# 实现 GDD:design/gdd/systems/表现与支撑/数据配置.md(系统 ID D2·数据配置——registry 追溯锚,命名规范见 CLAUDE.md)
# 统一流口径:唯一主种子 + 唯一派生(单盐)+ 唯一全局取数计数器;open_stream 参数降格为「用途标签」——
# 不参与派生,只进事件日志(并流前七条流名全部保留为合法标签)。号位语义(ADR-0007 后果,用户裁决承接):
# 全局 scope 只回答「全局第 N 次取数」,不再回答「第 N 次某类事件」——路线依赖为已知代价,单点定位能力由事件日志承载。
# 派生公式(R3 2026-09-19 + 统一流 2026-09-27):derive = mix64(SINGLE_SALT XOR wrap64(master + scope×GOLDEN))——
# splitmix64 finalizer 变体终末混淆,见 _mix64 注记;并流前分盐黄金向量随批作废,新向量按单盐重登记(scope 0-3 与
# 旧 board_gen 向量逐位连续——单盐沿用原 board_gen 盐)。
# 派生公式(R3 + 统一流):derive = mix64(SINGLE_SALT XOR wrap64(master + scope×GOLDEN))——
# splitmix64 finalizer 变体终末混淆,见 _mix64 注记;scope 0-3 与旧 board_gen 向量逐位连续
# (单盐沿用原 board_gen 盐)。
# 取号语义:全新冒险首个 open_stream = 全局 scope 0;事件日志逐次落盘 user://logs/rng_log_<master_seed>.jsonl。
class_name RngServiceCore
extends Node
+8 -12
View File
@@ -10,31 +10,27 @@
# 域清单与 owner 分工(内容 owner 定口径,本类照单承载、不替任何人定义进度):
# keystone_balance / item_unlocks / level_clear_counts / boss_first_kill
# —— 内容 owner = 元进度.md(钥石余额/道具工坊/通关次数/首杀标记;属性锻造柜台已退役
# 〔迭代 21 攻防所有权切分——forge_levels 域随批清退,生命唯一入口=树脊柱、攻/AC 唯一入口
# =锻造工坊路线,见 meta_progression.gd 注入面〕)
# ——生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线,见 meta_progression.gd 注入面)
# boss_kill_count / attunement_equipped / attune_refresh_level
# —— 内容 owner = 秘宝.md(同调位账本,M-4 迭代 11 第①批 T2):Boss 击杀总数〔含重复〕=
# 生涯页终身计数与迭代 22 解锁条件消费面〔原 attunement_growth 谓词表计数源职责随迭代 21
# T4 槽位收编退役——槽位数量=树同调位节点点亮数〕;装配关系 = 局外进度事实(元进度域同族
# —— 内容 owner = 秘宝.md(同调位账本):Boss 击杀总数〔含重复〕=
# 生涯页终身计数与迭代 22 解锁条件消费面〔槽位数量=树同调位节点点亮数〕;装配关系 = 局外进度事实(元进度域同族
# ——非契约 2 反面清单的「局内道具库存」,后者=冒险进行中瞬态);attune_refresh_level = Y 刷新
# 升级购买等级
# tree_nodes / fork_sides / tree_struct —— 内容 owner = 天赋树.md(迭代 12 T9 建域、迭代 21 T5
# 换代承载:tree_nodes=node_id→已购等级;fork_sides=fork_group→激活态;tree_struct=树结构
# tree_nodes / fork_sides / tree_struct —— 内容 owner = 天赋树.md(tree_nodes=node_id→已购等级;fork_sides=fork_group→激活态;tree_struct=树结构
# 版本标记〔缺失=换代前结构→加载时树域破坏性废弃重置——开发阶段无迁移,Q3 用户裁〕)
# forge_routes —— 内容 owner = 锻造工坊.md(迭代 23 T5:levels 六路线等级+unlocked 直购解锁清单
# forge_routes —— 内容 owner = 锻造工坊.md(levels 六路线等级+unlocked 直购解锁清单
# +weapon/armor 当前选中标记;**无特效域**(裁 6——满级特效本期不做);解锁态派生不落档:
# 初始持有〔表 initial_owned〕∨ 直购〔unlocked〕∨ 练满前一档〔levels[prereq]≥cap〕——派生单点
# 在 MetaProgression.forge_route_unlocked;旧档缺键补齐=初始持有态,开发阶段禁迁移禁折算)
# breakpoint.attunement_charges(主动件充能余量)——每冒险重置语义的断点瞬态附随件,内容装配归
# AdventureRunner(随 T6 接线入断点),本类照单承载;契约 2 域界注记同断点域豁免先例
# AdventureRunner(断点域接线),本类照单承载;契约 2 域界注记同断点域豁免先例
# recent_summaries(冒险摘要五件事副本)—— 内容 owner = 冒险结构.md(摘要五件事口径)
# adventure_total / adventure_cleared(生涯终身计数域)—— 内容 owner = 生涯.md(跨局汇总页
# 数据源:总局数开局即计〔三结局同经收束恰计一次,含放弃与失败〕/通关局数三关全通才计 1
# ——判定字段 summary.cleared;写入唯一经 apply_adventure_summary,迭代 18 卡④)
# ——判定字段 summary.cleared;写入唯一经 apply_adventure_summary)
# breakpoint(冒险断点快照——停点粒度续玩域)—— 内容 owner = 冒险结构.md(七字段拍板面
# +恢复必需附随件:主种子/取数计数器/钥石累计/已到节点序/道具库存);契约 2 域界反面清单
# 只约束 meta 永久进度域——断点域=冒险进行中瞬态快照,生命/GP/道具库存按拍板面入域
# (M-3 迭代 8 卡①,存档序列化.md 契约 2 随批修订)
# 只约束 meta 永久进度域——断点域=冒险进行中瞬态快照,生命/GP/道具库存按拍板面入域。
# 承载 owner = 存档序列化.md(格式/时机/迁移/损坏/域登记)
#
# 契约登记(存档序列化.md 核心规则——违反即返工):
+9 -10
View File
@@ -1,17 +1,16 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-16
# 敌人系统·战斗单位容器:hero/enemy 统一受伤死亡接口 · 实例池状态机(敌人技能池批——2026-09-16 用户拍板,
# 设计权威 proposal-skill-pool.md〔提案已吸收退役 git a6833b6a——现行事实源=敌人系统.md 技能池节〕 v1.0)· 行值快照抗热重载 · 编排被动零事件。
# 实例池三层对象(proposal §2.2):定义层技能行(SkillTable)· 定义层池模板(EnemyTable.pool)·
# 敌人系统·战斗单位容器:hero/enemy 统一受伤死亡接口 · 实例池状态机(设计权威=敌人系统.md 技能池节)
# · 行值快照抗热重载 · 编排被动零事件。
# 实例池三层对象:定义层技能行(SkillTable)· 定义层池模板(EnemyTable.pool)·
# 本类持实例层——spawn 把模板快照为各实例池(冷却全零),此后冷却递减/待发动作/保底计数各自独立。
# 零随机零事件纪律(proposal 约束二):随机消费只在 战斗结算换算层抽签器(SkillLottery + behavior_roll 子流);
# 本类只收确定结果(set_pending_action)并管理确定性状态(冷却递减、执行上报)。旧行为环
# (pattern 环数组 + steps 指针 + heavy_multiplier)随技能池整体退役——拍结构保留(每结算每存活敌恰行动一次、
# 行序、先作用后推进),"轮到什么"改由开轮摇号决定(死亡即不动手:摇定后兑现前死亡 → 本拍作废、不 commit)。
# 切片登记接口漂移:heal() 为切片新增(战斗结算 治疗 clamp 需要写入口);spawn 签名 +3 参数(E4/区间批/
# 遭遇骰——正式侧 GDD/registry 修订随对应批);迭代 23 T2 +2 参数(hero_attack_type/hero_armor_type——
# 两根类型轴注入面:hero.tres 静态表两轴删除〔契约 2 所有权移交〕,空串=锻造工坊配置默认值回退)。
# 零随机零事件纪律:随机消费只在 战斗结算换算层抽签器(SkillLottery + behavior_roll 子流);
# 本类只收确定结果(set_pending_action)并管理确定性状态(冷却递减、执行上报)。
# 拍结构:每结算每存活敌恰行动一次、行序、先作用后推进;"轮到什么"由开轮摇号决定
# (死亡即不动手:摇定后兑现前死亡 → 本拍作废、不 commit)。
# 接口:heal() = 治疗写入口(战斗结算 治疗 clamp 用);spawn 签名含 hero_attack_type/hero_armor_type
# 两根类型轴注入面(hero.tres 静态表不持两轴——契约 2 所有权归锻造工坊,空串=锻造工坊配置默认值回退)。
# 实现 GDD:design/gdd/systems/战斗循环/敌人系统.md(registry 追溯锚,命名规范见 CLAUDE.md)
class_name UnitContainer
extends RefCounted
+6 -7
View File
@@ -1,15 +1,14 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 三关连探冒险(地精洞窟 → 幽暗地域 → 灰矮人矿城)能否以一条命走完,通关兑付的
# 部分回血与提升三选一、Boss 逐杀钥石掉落在冒险摘要里成立(P0)
# Date: 2026-09-21(冒险结构实现批建表;2026-10-01 迭代 10 奖励重构批扩列;2026-10-03 TP0 令牌池换代)
# Date: 2026-09-21(冒险结构 关卡大奖励表)
# 数据配置 AdventureTable schema(冒险结构 关卡大奖励行值;单行全局,Rule 4 豁免——HeroTable/SettlementTable 先例)。
# 迭代 10 重构(2026-09-30 用户拍板案丙):大奖励「固定三件套」退役——改三层奖励框架。
# TP0 令牌池换代(2026-10-03 用户全裁 b——node-reward v2.2):三选一池改固定配额令牌池——普通 70/稀有 25/
# 罕见 5=100 张;洗牌不放回抽 3、选中踢池未选回池、池耗即枯竭;种类次数上限退役(池消耗即上限)。
# 大奖励 = 三层奖励框架;三选一池 = 固定配额令牌池——普通 70/稀有 25/
# 罕见 5=100 张;洗牌不放回抽 3、选中踢池未选回池、池耗即枯竭(池消耗即上限)。
# 档位构成:普通〔小GP 18/小增伤 18/小护甲 17/小生命 17〕+稀有〔大GP/大增伤/大护甲/大生命/恢复 各 5〕
# +罕见〔AP 3〕——罕见档原列「道具件 2」随 treasure_item 池种退役(迭代 11 第①批 T7)不投放,配额缺省收窄。
# 恢复件=新入池种类(当即回血)。旧权重/次数上限字段整代退役。
# 全部 knob provisional-pending-曲线调参批(数值所有权归 难度曲线与Boss,上调须重扫通关率带)。
# +罕见〔AP 3〕——罕见档「道具件」不投放(池种已退役),配额缺省收窄。
# 恢复件=池内种类(当即回血)。
# 全部 knob provisional(数值所有权归 难度曲线与Boss,上调须重扫通关率带)。
class_name AdventureTable
extends Resource
+2 -2
View File
@@ -5,8 +5,8 @@
# (行集构成纪律 = 敌人系统 v0.15:行集内 enemy_id 唯一〔dup_key 拦〕/ 同坐标多行文件内相邻〔行序即契约,本表
# validate 兜底〕/ 行集实例总数 ≤4 守卫在 单位容器 spawn〔骰后值,加载期不可判〕);
# HeroTable 单行全局(Rule 4 豁免)。依据 design/gdd/systems/战斗循环/敌人系统.md Schema 节。
# 敌人技能池批(2026-09-16 用户拍板,设计权威 proposal-skill-pool.md〔提案已吸收退役 git a6833b6a——现行事实源=敌人系统.md 技能池节〕 v1.0):pattern 行为环数组与
# heavy_multiplier 退役,改池模板 pool = [{skill_id, weight}](定义层——实例池快照与冷却状态在 单位容器)。
# 敌人技能池:行模板 pool = [{skill_id, weight}](定义层——实例池快照与冷却状态在 单位容器;
# 设计权威=敌人系统.md 技能池节)。无 pattern 行为环数组与 heavy_multiplier 字段。
# 池构成纪律(每池恰一行普攻、增益 ≤1、skill_id 悬空致命)需跨表视野,校验在 ConfigDB 跨表通道。
class_name EnemyTable
extends Resource
+7 -11
View File
@@ -1,15 +1,12 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 专长 27 件订阅行能否经效果引擎统一解释执行、逐件行为与声明一致(P0——
# 迭代 20 专长实装批 T3;前史:迭代 12 双层 BD 实施批 T1 建表/迭代 17 内容数据驱动扩展批 T3 行换代)
# Date: 2026-10-11(迭代 20 专长实装批 T3——重设计换代:流派标签/档位激活机制退役〔奇物.md v1
# 设计原则「不设流派标签、不设档位机制」〕;rarity 四级〔跨层框架〕;cap 已拿上限字段〔池结构案D
# 概率与上限解耦——每件标注两个独立属性:概率位=档+rarity、上限=cap(拿了才计、刷出不计)〕)
# Validation Question: 专长订阅行能否经效果引擎统一解释执行、逐件行为与声明一致(P0)
# Date: 2026-10-11(设计权威 design/gdd/systems/冒险循环/奇物.md——不设流派标签、不设档位机制;
# rarity 四级;概率位=档+rarity 与上限=cap 两独立属性解耦——cap 拿了才计、刷出不计)
# 概念指路:本表的专长,与 adventure.tres 的属性值提升、资源,同属一个对象——
# 「奇物」(一次冒险内各渠道给予玩家的增益总称)。定义见 design/gdd/systems/冒险循环/奇物.md。
# 它们是它分类轴上的枚举(专长 / 属性值提升 / 资源),不是三套系统;本表承载「专长」(专长 Feat)的逐项定义。
# (2026-10-05 命名统一 + 分类重构:旧称「流派件」→「规则改写型特性」→ 现定名「专长」;
# 表名与 feat_id 沿用历史命名,与统一词族对齐归后续批次——见 06-待办清单「命名统一」条目。
# 目标渠道:专长走关底 Boss 击败后专属三选一(不新增节点类型),见奇物文档 2.1 节。)
# 它们是它分类轴上的枚举(专长 / 属性值提升 / 资源),不是三套系统;本表承载「专长」(专长 Feat)的逐项定义
# (表名与 feat_id 沿用历史命名)。目标渠道:专长走关底 Boss 击败后专属三选一(不新增节点类型),
# 见奇物文档 2.1 节。
# 数据配置 FeatTable schema(奇物·专长定义表;行 = Dictionary 键 feat_id,Rule 4 豁免
# 定义表——TreasureItemTable 先例)。
# 行字段:feat_id 主键 / display_name / rarity ∈ {common, excellent, rare, legendary}(四级稀有度,
@@ -19,8 +16,7 @@
# EffectEngine 统一解释执行;四词表封闭校验=EffectEngine.validate_trigger_row 单一事实源)。
# 🔴 层级纪律(需求卡片红线 2):专长只走局内随机渠道(Boss 三选一/凭证开启)——本表行永不入同调位
# (treasure_items 表)/局外树(T8 节点表)。
# 退役注记(V14 旧实现摘除):ARCHETYPES 流派标签/档位激活(FeatsEngine 档位质变)随重设计退役——
# 事件族(开格/插旗/踩雷/节奏/战斗系)仅系设计侧分组工具不上数据行不上卡面(命名铁律)。
# 注记:事件族(开格/插旗/踩雷/节奏/战斗系)仅系设计侧分组工具——不上数据行、不上卡面(命名铁律)。
class_name FeatTable
extends Resource
+5 -5
View File
@@ -1,11 +1,11 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-10
# 数据配置 HeroTable schema(敌人系统 接口漂移新增;单行全局,Rule 4 豁免)。
# atk = 基础攻击恒存在(2026-09-11 用户裁决):域 [1,999]、0 = 加载拒绝——零基线死锁 schema 层杜绝。
# 〔2026-10-12 迭代 23 锻造工坊实装批 T2:armor_type/attack_type 两根类型轴字段删除——契约 2
# 所有权移交,默认值归锻造工坊配置(forge.tres)常驻持有、选中态写存档经参数面注入;本表只剩
# 三数值轴 max_hp/atk/armor_class(armor_class=甲路线缺失时兜底基准,甲型基础 AC 归 forge.tres 行)。〕
# 数据配置 HeroTable schema(单行全局,Rule 4 豁免)。
# atk = 基础攻击恒存在:域 [1,999]、0 = 加载拒绝——零基线死锁 schema 层杜绝。
# 类型轴 armor_type/attack_type 不在本表——契约 2 所有权归锻造工坊:默认值归 forge.tres 常驻持有、
# 选中态写存档经参数面注入;本表只有
# 三数值轴 max_hp/atk/armor_class(armor_class=甲路线缺失时兜底基准,甲型基础 AC 归 forge.tres 行)。
class_name HeroTable
extends Resource
+2 -2
View File
@@ -1,9 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 线性第一关(战×2→道具→战×2→恢复→Boss)能否承载"数值提升→通关期望改善"的元进度验证
# Date: 2026-09-11(2026-09-17 分支节点图批:nodes 升级图结构——单链=出边恰一的退化形态)
# Date: 2026-09-11(关卡节点地图 v1.0 图结构;单链=出边恰一的退化形态)
# 数据配置 LevelTable schema(关卡节点地图 v1.0 承载面)。
# 节点类型 closed enum:battle(战斗,须带 node_depth)/ reward(直通占位点)/ rest(血量恢复点)/ boss(关底 Boss,须带 node_depth)
# / shop(商店房——GP+商店房实施批 2026-09-21 五类落地:同 reward/rest 无战斗行、无 node_depth 要求,
# / shop(商店房:同 reward/rest 无战斗行、无 node_depth 要求,
# 图形态仍须编号化;零新增图合法性检查,必经位由冒烟断言承载非加载校验)。
# 图形态(行集内任一节点带 "next" 出边表即整行按图校验):节点编号 = node_depth(关卡内唯一定位地址,
# 全节点须带,reward/rest 亦然);next = [出边节点编号...](连线只朝前进方向:目标编号严格大于自身)。
+8 -10
View File
@@ -1,21 +1,19 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否在营地用钥石换永久强化、且强化在下一局开局生效——存档变厚成为玩家可感的现实
#(元进度 GDD 验收标准,本批 = 其实现批)
# Date: 2026-09-21(元进度实现批——设计权威 design/gdd/systems/冒险循环/元进度.md 定稿 v1.2)
#(元进度 GDD 验收标准)
# Date: 2026-09-21(设计权威 design/gdd/systems/冒险循环/元进度.md)
# 数据配置 MetaTable schema(元进度行族)。
# 行族三轴(数据契约对齐 ConfigDB.meta_* 访问器——消费面一律走访问器,禁直读行集):
# boss_keystone = Boss 钥石两档行(level_index 连续从 1;first_kill ≥ repeat_kill——首杀全量、
# 重复杀固定小额恒定不递减,两档数值归元进度设计批配读数)。
# 重复杀固定小额恒定不递减,两档数值归 元进度.md)。
# conversion = 区间平移换算率行(attr 与三属性轴词表一致恰三;per_level_shift_pct ∈ [0,100]——
# registry 键 meta_progression_conversion_table;护甲行强条目:验收读数必须按解锁后参数重测)。
# attune_refresh_upgrade = Y 刷新升级行族(迭代 11 第①批 T4——P1 甲:每冒险开局给 Y 次、冒险周期池、
# attune_refresh_upgrade = Y 刷新升级行族(每冒险开局给 Y 次、冒险周期池、
# 用完即无;level 连续从 1,等级 L → refresh_charges=Y 表值,钥石直购 keystone_cost;数值全 provisional)。
# 〔forge_products 属性锻造行族已退役——迭代 21 T5 攻防所有权切分:生命唯一入口=树脊柱、攻/AC
# 唯一入口=锻造工坊路线;行族、访问器与购买面随批删除,历史投值记载归 git 考古。〕
# 〔workshop_items 道具工坊行族已退役——迭代 22 T2 秘宝实装批:解锁换代混合制(钥石购买价
# unlock_keystone_cost + 条件谓词 unlock_requires 全挂 treasure_items.tres 行内,单一事实源),
# 旧「总通关次数达阈值」渠道行族、WORKSHOP_ITEM_IDS/WORKSHOP_CHANNELS 词表与校验段随批删除。〕
# 行值全部 provisional 归 元进度设计批配读数(用户拍板骨架先行,先例 = GP+商店房批)。
# 〔无 forge_products 属性锻造行族——生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线。〕
# 〔无 workshop_items 道具工坊行族——解锁=混合制:钥石购买价
# unlock_keystone_cost + 条件谓词 unlock_requires 全挂 treasure_items.tres 行内(单一事实源)。〕
# 行值全部 provisional(读数归 元进度.md)。
class_name MetaTable
extends Resource
+9 -12
View File
@@ -1,29 +1,26 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 数据配置 MetaTreeTable schema(迭代 21 天赋树实装批 T1 换代——设计权威
# design/gdd/systems/跨局循环/天赋树.md v0.8,2026-10-11 三轮换代终态)。
# 结构:12 节点 = 脊柱 2(生命淬炼/命中淬炼——一线一节点 cap4,2026-10-11 用户裁:一个内容一个
# 数据配置 MetaTreeTable schema(设计权威
# design/gdd/systems/跨局循环/天赋树.md v0.8)。
# 结构:12 节点 = 脊柱 2(生命淬炼/命中淬炼——一线一节点 cap4:一个内容一个
# 节点、等级在节点内)+ 锻造脉 2(锻造工坊钥匙 free 无前置 + 彩蛋地脉共鸣——彩蛋含在此 2 内)
# + 钥石脉 2(秘宝匣/刷新升级)+ 同调脉 6(同调位 1/2/3 + Fork 3 双态节点)。
# 行字段:node_id / display_name / vein ∈ VEINS(spine=主干脊柱;forge=锻造脉;keystone=钥石脉内容
# 解锁;attune=同调脉)/ kind ∈ KINDS(stat=数值线/rule=全局规则/unlock=内容解锁/socket=同调位/
# fork=一节点双态开关/easter=彩蛋觉醒)/ currency ∈ {keystone, free}(树全钥石单币——2026-10-07
# 用户裁甲;free=工作间钥匙与彩蛋)/ price [0,9999] / cap [1,9](等级上限;unlock/socket/fork/
# fork=一节点双态开关/easter=彩蛋觉醒)/ currency ∈ {keystone, free}(树全钥石单币;free=工作间钥匙与彩蛋)/ price [0,9999] / cap [1,9](等级上限;unlock/socket/fork/
# easter 恒 1)/ requires Array[node_id](点亮前置——前置节点 tree_level>=1 即满足)/
# requires_level Dictionary{node_id: n}(等级阈值前置——R1 机制位:2026-10-12 卡片 v1.7 默认按
# 裁撤案执行后,2026-10-13 用户推翻补机制位随批重立;前置节点等级 ≥ n 才可购;现役 12 行
# requires_level Dictionary{node_id: n}(等级阈值前置机制位:前置节点等级 ≥ n 才可购;现役 12 行
# 零配置=机制位空转零行为影响,配置归表行随需填;键悬空/阈值 <1 加载即拒)/
# effects Dictionary(stat 线 flat:max_hp/hit;rule 键封闭 RULE_KEYS)。
# Fork 一节点双态(2026-10-11 用户裁,原 A/B 双行结构收编):fork_group ∈ FORK_GROUPS 每组恰一节点;
# Fork 一节点双态:fork_group ∈ FORK_GROUPS 每组恰一节点;
# 行持 effects_a/effects_b 双效果键(A/B 只放规则面——键 ⊆ RULE_KEYS)+ name_a/name_b 双态呈现名;
# 购买解锁默认 A 态、营地零币切换(tree_toggle_fork),效果按激活态(save.fork_sides)取值。
# 行门槛(一线一节点换代):脊柱节点第 N 级可购需全树已购总等级 ≥ SPINE_ROW_GATE×(N−1)(总等级口径
# =tree_nodes 全部节点等级之和,免费点亮与 Fork 解锁计入——2026-10-11 歧义扫描裁甲);
# row 字段随层行退役。
# 行门槛:脊柱节点第 N 级可购需全树已购总等级 ≥ SPINE_ROW_GATE×(N−1)(总等级口径
# =tree_nodes 全部节点等级之和,免费点亮与 Fork 解锁计入)。
# 🔴 层级纪律(需求卡片红线 2):局外树只放全局规则件——effects 禁流派标签(archetype 键出域=加载
# 致命);规则改写型特性只走局内随机渠道,永不入树。
# 彩蛋 ≤3(schema 校验);觉醒判定=MetaProgression._check_easter_egg 特化(生命/命中两线拉满+同调位
# 全解锁),不依赖 requires 点亮形态。
# 数值全 provisional 归 M4 数值批(契约 7);两侧「不同强非强弱」MC 验差 <~3pp(V19)。
# 数值全 provisional(契约 7);两侧「不同强非强弱」MC 验差 <~3pp(V19)。
class_name MetaTreeTable
extends Resource
+2 -2
View File
@@ -1,11 +1,11 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-10(2026-09-15 格面资源批结构性重写:category/use_timing/库存/供给轴下线,五型 × 极性字典取代)
# Date: 2026-09-10(地图战斗资源 五型 × 极性字典)
# 数据配置 RewardTable schema(地图战斗资源 回填值)。
# 行 = Dictionary,键 reward_id(Rule 4 豁免:定义表);跨字段校验族 + 池护栏。
# 九型封闭枚举(attack/defense/heal/blast/weaken/pierce/magic/action/gp)× 极性(positive/negative):
# 正向行 = 摇号池(权重 = 类型频次);负向行 = 纯兑付字典(不消费权重)。
# 九型批(2026-09-20 词表 v1.1 注记——用户拍板 GP 进第九型):gp 型正负两行入池,
# gp 型正负两行入池,
# effect_id gp_gain/gp_loss = 战斗内缓冲通道(战斗结算 escrow 记账,不入增益容器)。
class_name RewardTable
extends Resource
+5 -5
View File
@@ -1,20 +1,20 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否在 Boss 前商店房用战斗掉落 GP 购买三属性锻造档,兑现「数值提升→后续战斗改善」的局内成长闭环(P1)
# Date: 2026-09-21(GP+商店房实施批——2026-09-20 用户拍板,设计权威 design/research/proposal-gp-shop-room-2026-09-20.md 裁决记录)
# Date: 2026-09-21(GP 冒险钱包 × 商店房)
# 数据配置 ShopTable schema(GP 冒险钱包 × 商店房 行族四轴)。
# 行族四轴(数据契约对齐 ConfigDB.shop_* 访问器——消费面一律走访问器,禁直读行集):
# gp_drops = 战斗掉落掷定行(键 tier:normal/elite/boss 封闭词表;掷定 = roll_min..roll_max 均匀整数,
# mean = 期望锚——roll_min ≤ mean ≤ roll_max,行动经济 条款①期望当量锚同款纪律);elite 为预留行
#(当前无消费方,随精英节点内容批启用)。level_gp_bonus = 关级掉落加值行(level_index 连续从 1 递增)。
# products = 商品行(键 product_id;三件全陈列无刷新无摇号——2026-09-20 拍板);
# products = 商品行(键 product_id;三件全陈列无刷新无摇号);
# 现价公式 = base_price + price_level_bonus(关卡) + price_increment × 该商品已购档数(已购档数在 冒险结构)。
# price_level_bonus = 关级定价加值行(level_index 连续从 1 递增)。
# pool_shelf = 共享池货架行(M-4 迭代 11 第②批 T1——需求卡片 v1.3 P1 共享池/P4 ceil):键 kind_id 词表
# pool_shelf = 共享池货架行:键 kind_id 词表
# 封闭 = 四切边后种(SHELF_KINDS:attack/max_hp/armor/ap——GP 袋负交易切边、规则改写型特性三轴 doctrine 切边);
# 库存=上限即库存(账本在 冒险结构 _curio_taken 单点共享,行族不记库存);price_a/price_b = 乘法价格
# 因子(公式 ceil(base × b^(关序−1) × A^(本次进店已购次数)),provisional 投值——P5 甲研究拍板后置追认)。
# products 行族 + 加法定价随 legacy 模式(shop=off 对照承载)保留,退役归 off 锚换代批。
# 行值全部 provisional 归 难度曲线与Boss(用户拍板骨架先行、数值整体后置)。
# products 行族 + 加法定价 = legacy 模式承载(shop=off 对照)。
# 行值全部 provisional(数值归 难度曲线与Boss)。
class_name ShopTable
extends Resource
+2 -2
View File
@@ -1,8 +1,8 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-16
# 数据配置 SkillTable schema(敌人技能池批——定义层"技能行",敌人系统 回填值;行 = Dictionary,键 skill_id;Rule 4 豁免)。
# 设计权威:proposal-skill-pool.md〔提案已吸收退役 git a6833b6a——现行事实源=敌人系统.md 技能池节〕 v1.0 §2.2 字段词汇表。
# 数据配置 SkillTable schema(定义层"技能行",敌人系统 回填值;行 = Dictionary,键 skill_id;Rule 4 豁免)。
# 设计权威:敌人系统.md 技能池节 §2.2 字段词汇表。
# 三层对象:技能行(本表,多敌种共享)· 池模板(EnemyTable.pool:{skill_id, weight})· 实例池(单位容器 spawn 快照)。
# 池构成纪律的加载校验在 ConfigDB 跨表通道(每池恰一行普攻、增益 ≤1、skill_id 悬空致命——本表无池视野)。
class_name SkillTable
+8 -12
View File
@@ -1,28 +1,24 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 挖掘期撞上推理断头时,玩家能否从掉落池捡到秘宝、在关键时刻花掉买回情报或行动点(P0)
# Date: 2026-09-29(迭代 7 T1 数据面——秘宝内容批;设计权威 design/gdd/systems/排雷循环/秘宝.md v0.4+
# + registry 秘宝条目六行 mvp_content;2026-09-29 用户拍板:①乙 探宝罗盘退役留痕 ④甲 显影尘/地穴全图卷失义件
# 六行全建零投放「已解锁·能力封存中」)
# Date: 2026-09-29(秘宝内容批数据面;设计权威 design/gdd/systems/排雷循环/秘宝.md
# + registry 秘宝条目)
# 数据配置 TreasureItemTable schema(秘宝 回填 owner)。
# 行 = Dictionary,键 item_id(Rule 4 豁免:定义表——registry 秘宝条目 Rule 4 豁免先例)。
# 七字段(registry fields 全量):item_id 主键 / display_name / dimension_tags ⊆ 五维 非空 /
# effect_kinds ⊆ {mine_reveal, reward_preview, ap_grant}(活性校验见下)/ target ∈ {none, area_3x3, board_wide} /
# magnitude [0,999](仅 ap_grant 行消费,加载校验 ≥1)/ use_phase ∈ {active_dig}。
# additive 两标记(迭代 7 T1——拍板①④的表内表达,非 registry fields 预登记字段的扩列随批登记):
# retired = 退役留痕行(历史形态——迭代 11-19 期载体;新目录 12 行零 retired 行〔迭代 22 T1 全量
# 换代〕,机制面保留=deferred/retired 双标记的加载豁免通道仍在役)
# deferred = 效果失义待重定行(历史形态——显影尘/地穴全图卷 2026-09-20 拍板;新目录零 deferred 行,
# 机制面保留同上;免 effect_kinds 非空校验、不入投放与 F2)
# additive 两标记:
# retired = 退役留痕行(现行目录零 retired 行;deferred/retired 双标记的加载豁免通道仍在役)
# deferred = 效果失义待重定行(现行目录零 deferred 行;免 effect_kinds 非空校验、不入投放与 F2)
# 承重护栏(秘宝 GDD §结构冻结,schema 校验强制不靠运行时拦截):
# 真视窄域——effect_kinds 含 mine_reveal 的活行 target 必须 area_3x3(真视一次最多 3×3,禁全图看雷);
# board_wide 仅恢复推理原料类——target=board_wide 的活行 effect_kinds 不得含 mine_reveal(现行无此类活行,
# 显影载体待 Alpha 重定后落位)。
# 同调实施批扩列(迭代 11 第①批 T1,2026-10-03——需求卡片 v1.1;设计权威 proposal-magic-item-attunement-2026-09-22):
# form ∈ {"", "passive", "active_charged"}(空 = 切片期过渡形态行——掉落/停点渠道现行承载,T7 退役;
# 同调扩列字段:
# form ∈ {"", "passive", "active_charged"}(空 = 过渡形态,现行表零空行;
# passive = 装配整局生效;active_charged = 每冒险充能、挖掘期发起);
# charges_per_adventure(active_charged ≥1 / passive 恒 0);slot_cost(同调行恒 1——底稿裁决 5,schema 强制);
# unlock_requires 谓词行 [{key ∈ 计数键封闭枚举〔原 AttunementGrowthTable.COUNTER_KEYS,随迭代 21
# T5 谓词表退役就地内联为 UNLOCK_COUNTER_KEYS〕, threshold ∈ [1,999]}](空 = 已解锁——
# unlock_requires 谓词行 [{key ∈ 计数键封闭枚举〔UNLOCK_COUNTER_KEYS〕, threshold ∈ [1,999]}](空 = 已解锁——
# 首批全解锁合法态,底稿 §2.2 用户裁;正式解锁渠道归 元进度 道具工坊柜台);
# effective_rounds(前 N 轮限时件轮数——P4 甲表值化;仅 ap_rounds_front 行消费);
# charge_n(充能进度阈值 N——仅 ap_charge_safe 行消费)。
+5 -5
View File
@@ -1,12 +1,12 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2)
# Date: 2026-09-10
# 数据配置 VariationTable schema(地形变异 首批类型定稿批 2026-09-19;行 = Dictionary,键 variant_id)。
# 字段集(2026-09-19 用户裁定:枚举抽象,不写死类型):effect/effect_value/trigger/placement 四字段
# 数据配置 VariationTable schema(地形变异;行 = Dictionary,键 variant_id)。
# 字段集(枚举抽象,不写死类型):effect/effect_value/trigger/placement 四字段
# 把"变异是什么、在哪出现、何时起作用"全部数据化——新增类型 = 清单加行 + 必要时扩充枚举词表,不改读取方。
# biome_tags 更名 board_types(用户裁定:门控匹配对象即 board_type 词表,biome 系旧观念残留不沿用);
# counter_items 字段位保留(反制道具绑定,归 Alpha 反制批回填,切片期恒空)。
# info_mask/cell_constraint 两旧字段随枚举化退役(hide_number 并入 effect 词表,safe_nonzero 由
# 门控匹配对象 = board_type 词表(无 biome_tags 字段);
# counter_items 字段位保留(反制道具绑定,暂恒空、反制件回填)。
# 无 info_mask/cell_constraint 字段(hide_number 在 effect 词表;safe_nonzero 由
# 布置域结构保障——初始展开区天然排除,见 battle_orchestrator._place_variants)。
class_name VariationTable
extends Resource
+3 -3
View File
@@ -1,6 +1,6 @@
# 武装确认计时器(迭代 13 T3/D3——P4 乙裁决:只统一计时+脉冲机制,视觉三处各自保留)。
# 收口债:三处二次确认计时机制异构(AP 条弃图刷新=tween 秒表 / 选路放弃钮=_process 帧驱动
# 倒计时 / 战斗总结结算框=纯载荷暂存裸布尔)——本件消掉「计时机制三种实现」漂移源。
# 武装确认计时器(只统一计时+脉冲机制,视觉三处各自保留)。
# 背景:三处二次确认计时机制异构(AP 条弃图刷新=tween 秒表 / 选路放弃钮=_process 帧驱动
# 倒计时 / 战斗总结结算框=纯载荷暂存裸布尔)——本类为单一计时实现。
# 保缝纪律:AP 条三探针缝(press_refresh_for_probe/confirm_visible/press_confirm_for_probe)
# 语义等价零动;放弃钮真实二击路径零改;结算框挂起态经组合根属性继续可读写(探针接缝)。
# 减动效档:档判据单点 motion_still()——脉冲相位由视觉层取 elapsed 自算(1Hz 连续呼吸
+1 -1
View File
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 营地/商店投影控制器(迭代 13 T4/D4——二期家族③ 自 main.gd 迁出;规范 1.1 单一职责):
# 营地/商店投影控制器(规范 1.1 单一职责拆件):
# 营地面开合/快照投影/锻造·同调·天赋树·Fork 购买与切换 + 商店房购买/离开(pool 与 product 双面)。
# 装配纪律(ADR-0001,仿 treasure_interact_controller 先例):信号连接不在此发生——campbtn/
# camp_overlay 四信号/shop_overlay 两信号由组合根接至本类 on_* 入口;模态栈/呈现刷新/续玩按钮
@@ -1,11 +1,11 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 提升三选一与替换子交互控制器(迭代 13 T4/D4——二期家族① 自 main.gd 迁出;规范 1.1 单一职责):
# 三选一交互控制器(规范 1.1 单一职责拆件):
# 三选一停点编排(presented→pick→confirm/refresh→resolved→continue)+ 同调位替换子态
#(presented→chosen)+ TP0 令牌池卡片文案装配("kind|tier|feat_id" 复合键)+ 工坊显示名投影。
# 装配纪律(ADR-0001,仿 treasure_interact_controller 先例):信号连接不在此发生——curio_overlay
# 四信号与 adventure 两信号由组合根接至本类 on_* 入口;模态栈/演播后排窗/呈现刷新/终局面/
# 推进失败 fatal 经组合根回调注入;adventure/runner 随局更替——现值回调注入;兑付写调用唯一
# 经 adventure.pick_curio/apply_node_curio(core 侧单口,本类零直写;替换子交互随迭代 22 T5 拆除——装配不可变契约 1,冒险中零更换途径)。
# 经 adventure.pick_curio/apply_node_curio(core 侧单口,本类零直写;无替换子交互——装配不可变契约 1,冒险中零更换途径)。
extends RefCounted
const Narrator := preload("res://presentation/battle_narrator.gd")
+5 -6
View File
@@ -1,14 +1,13 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-13(封装审查 O1/O2 修复批——自 main.gd 拆出,规范 1.1 审视线 / 单一实现纪律)
# Date: 2026-09-13(自 main.gd 拆出——规范 1.1 审视线 / 调试语义单一实现纪律)
# 调试模式编排控制器:单场遭遇(第 1/2 层)与连续两层(HP 关内延续)的模式状态机与战斗生命周期。
# 职责边界:层序/携带 HP + 战斗结算 生命周期编排(创建 / begin_battle)。
# 2026-09-15 格面资源批:库存与共享 地图战斗资源 随可选类道具删除下线——层间延续只剩 HP
# ("库存与 HP 关内延续"语义收窄为"HP 关内延续",O2 单一实现点随之收窄)。
# 授权先例:与 tune_sim_controller 同款(code-review 2026-09-12 批)——控制器承接模式编排,
# 层间延续 = HP 关内延续(库存与共享 地图战斗资源 已下线)。
# 授权边界:与 tune_sim_controller 同款——控制器承接模式编排,
# 组合根仍持有全部信号接线(battle_created 先于 begin_battle 发出,ADR-0001 接线唯一归组合根)
# 与终局 UI 决策;玩家意图写调用(settle_batch / 刷新)不经本类。
# E4 收口(2026-09-13):加成生效值经注入 Callable 供给(组合根从面板百分比现算)→ encounter
# 显式传入战斗——零表写,"双写叠加/双基线同步"整类隐患随表写移除。
# 加成生效值经注入 Callable 供给(组合根从面板百分比现算)→ encounter
# 显式传入战斗——零表写。
extends RefCounted
signal battle_created(settlement, level: int, carry_hp: int) # begin_battle 前——组合根完成信号接线(ADR-0001)
+4 -4
View File
@@ -3,13 +3,13 @@
# 组装文案/投影 → 驱动各视图 setter。
# 高内聚边界:"核心状态 → 呈现文案"的全部翻译集中于此;视图保持零核心依赖;
# 静态无状态——呈现不持久化任何核心句柄。
# E1 封装收口(2026-09-13):核心状态读取统一经 战斗结算.presentation_snapshot() 成文快照面——
# 禁再链式穿透 settlement.enemy_system.hero / settlement.enemy_system.enemies / settlement.status_effects.query_active 一类路径(战斗结算 协作对象已私有化,
# 敌人含死亡残位的投影由快照 enemies[] 承载,含 alive/pending_*/effects 字段——2026-09-16 敌人技能池批批 2 定稿)。
# 核心状态读取统一经 战斗结算.presentation_snapshot() 成文快照面——
# 禁链式穿透 settlement.enemy_system.hero / settlement.enemy_system.enemies / settlement.status_effects.query_active 一类路径(战斗结算 协作对象已私有化,
# 敌人含死亡残位的投影由快照 enemies[] 承载,含 alive/pending_*/effects 字段)。
# 更新触发注记(battle.md Data Requirements):旗/拔/移动成功反馈零事件外发(排雷玩法 发射面封闭)——
# 经 ActionOutcome 返回值命令式驱动;AP/RAP 无推送信号——组合根每次调用返回后重查;
# 增益状态 纯被动容器零信号——状态栏刷新绑 战斗结算 结算编排完成时点。
# Date: 2026-09-12(战斗屏改造批;基础 = 2026-09-11 HUD 装配器;2026-09-13 快照面改造)
# Date: 2026-09-12(战斗屏改造批;基础 = 2026-09-11 HUD 装配器)
class_name HudPresenter
extends RefCounted
+19 -30
View File
@@ -1,45 +1,34 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 线性第一关(战×2→道具→战×2→恢复→Boss)能否承载"数值提升→通关期望改善"的元进度验证
# 实现 GDD:design/ux/battle.md(战斗屏 A/B/C/D 四区 + 全屏 States + 遥测;E 区随可选类删除下线 2026-09-15)。
# Date: 2026-09-12(battle.md 战斗屏改造批;基础 = 2026-09-11 HUD框架-lite 组合根;code-review 修复批重构)
# 2026-09-13(封装审查修复批):核心状态读取收口至 战斗结算/runner 成文只读面(presentation_snapshot /
# current_board / current_battle 等——禁链式穿透 settlement.enemy_system.hero 一类路径);调试模式编排抽离
# debug_session.gd(规范 1.1 审视线 + 调试语义单一实现)。
# 实现 GDD:design/ux/battle.md(战斗屏 A/B/C/D 四区 + 全屏 States + 遥测;E 区已随可选类删除下线)。
# Date: 2026-09-12(battle.md 战斗屏改造批;基础 = 2026-09-11 HUD框架-lite 组合根)
# 组合根(composition root):唯一的模式流转与 core↔view 接线处。
# 职责边界:① 构建三屏场景并接线信号(屏壳场景 menu_screen/camp_screen/adventure_screen——迭代 27 T1
# 场景拆分波,视图构建仍归 ui_assembler.gd——规范 1.1,本类只接线;模态层仍归本类程序化装配)
# 职责边界:① 构建三屏场景并接线信号(屏壳场景 menu_screen/camp_screen/adventure_screen,视图构建仍归
# ui_assembler.gd——规范 1.1,本类只接线;模态层仍归本类程序化装配)
# ② 模式管理(正式冒险 AdventureRunner——唯一试玩入口;调试两层编排归 debug_session.gd;单场原语仅探针使用)
# ③ 核心写调用只在此处发生(minesweeper.settle_batch / 刷新编排入口 / runner 推进;
# E4 收口:加成值零表写——面板百分比经 runner.set_hero_override / debug_session 生效值 Callable
# 加成值零表写——面板百分比经 runner.set_hero_override / debug_session 生效值 Callable
# 以 encounter 参数入战斗,db.hero 运行期只读)
# ④ 全屏 States 状态机(挖掘/结算/终局)与一次性提示去重。
# 2026-09-15 格面资源批:道具窗口与库存面板随可选类道具删除下线——E 区移除,窗口接线/选择序列删除。
# GP+商店房实施批(2026-09-21):商店覆盖层挂接与信号接线(装配器零信号连接纪律——句柄返回、
# 本类连接)+ runner.wallet_changed 转发试玩日志(wallet 行族)+ A 区顶栏金币余额。
# 场景结构:三屏 .tscn 屏壳 + 全部模态程序化装配于本类;树序 = [菜单屏, 冒险屏, 模态层...]——屏内两容器
# 无同时可见态,全部模态在屏壳之上。
# 局生命周期:run_scope.gd 节点持全部局态(adventure/runner/settlement/局态旗/账本)——_begin_session
# 创建,会话更替/终局整节点 queue_free()。
# autoload:SaveManager/MetaProgression/RngService/ConfigDB 为 autoload(类名加 Core 后缀、autoload 占
# 净名),存档读盘挂 autoload _ready。
# 核心状态读取只经成文只读面(presentation_snapshot / current_board / current_battle 等)——禁
# settlement.enemy_system.hero 一类链式穿透。
# 渲染与文案归 views/,核心状态→文案装配归 hud_presenter.gd 与 battle_narrator.gd,节点构建归
# ui_assembler.gd,模态层级归 modal_stack.gd,批量模拟编排归 tune_sim_controller.gd,调试模式编排归
# debug_session.gd——本类不拼呈现字符串。
# T3 拆件批(2026-10-02,规范 1.1 单一职责):结算行排播泵迁 row_pacer.gd(本类只入队/排空/读队列,
# 探针/测试委托面 _row_queue/pace_delay_for/_flush_row_queue 原位保留);秘宝两步交互迁
# treasure_interact_controller.gd(本类只接线与转发意图,无目标使用显式化——哨兵坐标不出控制器);
# (GP 影子账已随迭代 27 T3 退役——summary gp_final 键取代)。模态开合全量走
# _open_modal/_close_modal 单口,输入锁=modal_stack.has_open_excluding(debug_overlay) 排除式
# 开态查询+三例外(迭代 18 卡⑦——浮窗开态不计入锁);battle 收尾反馈与
# 结算视觉 setter 收敛 hud_presenter 单通道(时序敏感演出触发留本类并注释);settlement 相位读取改经
# presentation_snapshot 成文面、变异表读取直读本根 db(settlement.db 即同一实例)——禁
# settlement.action_economy / settlement.db 链式穿透。
# 结算行排播归 row_pacer.gd(本类保留探针/测试委托面 _row_queue/pace_delay_for/_flush_row_queue);
# 秘宝两步交互归 treasure_interact_controller.gd(本类只接线与转发意图——哨兵坐标不出控制器)。
# 模态开合全量走 _open_modal/_close_modal 单口,输入锁 = modal_stack.has_open_excluding(debug_overlay)
# 排除式开态查询+三例外(浮窗开态不计入锁);battle 收尾反馈与结算视觉 setter 走 hud_presenter 单通道
# (时序敏感演出触发留本类并注释);settlement 相位读取经 presentation_snapshot 成文面、变异表读取直读
# 本根 db(settlement.db 即同一实例)——禁 settlement.action_economy / settlement.db 链式穿透。
# ADR-0001 纪律:呈现层永不直接订阅 排雷玩法/行动经济——只订 战斗结算/runner 转发信号;相位读取仅用于
# 驱动视图状态;信号连接只在组合根(row_pacer/treasure_interact_controller 零连接,只收注入)。
# 迭代 27 T1(场景拆分+局生命周期物化波——审计 P0-1/P0-2):
# · 三屏场景化——menu_screen/camp_screen/adventure_screen .tscn 屏壳(视图代码原样构建,
# 装配器/视图类零 .tscn 化),本类保留全部接线句柄(ADR-0001 组合根职责),_build_ui 解体为
# 「三屏实例化 + 模态装配 + 接线」;树序 = [菜单屏, 冒险屏, 模态层...]——屏内两容器无同时可见态,
# 全部模态仍在屏壳之上(视觉共存对逐对验算零漂移——实现报告留痕)。
# · 会话物化——run_scope.gd 节点持全部局态(adventure/runner/settlement/局态旗/账本),
# _begin_session 创建、会话更替/终局整节点 queue_free(),旧手工复位清单
# (_reset_run_scope 三项 + _on_battle_end_continue 置空四件)消亡。
# · SaveManager/MetaProgression 升格 autoload(裁点①甲——RngService 先例:类名加 Core 后缀、
# autoload 占净名),存档读盘挂 autoload _ready(时序与旧 main._ready 读盘等价)。
extends Control
# autoload 节点路径单点(迭代 27 T6 P2-2 降格实现:审计处方「编译期全局名」与本仓 --script
+2 -2
View File
@@ -1,13 +1,13 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(§Events Fired 遥测义务——ux 行族)。
# Date: 2026-09-12(战斗屏改造批增 ux 遥测;基础 = 2026-09-12 日志器首版)
# Date: 2026-09-12(战斗屏 ux 遥测)
# 试玩日志器(呈现层组件——订阅核心信号持久化 JSONL,供数值分析;卡死诊断转储)。
# 职责边界:核心层只发 settlement_snapshot 信号(战斗结算)/既有信号(battle_finished/node_entered/
# level_finished/step_row);本组件负责订阅、缓冲与写文件——核心零日志感知(零 UI 依赖不变)。
# 文件 = user://logs/playtest_<seed>_<时间戳>.jsonl(每行一次结算/终局/节点的全量状态 JSON)。
# ux 行族(呈现层观测,不改 core):ux_round_input_ratio(原始输入动作数∶AP 消耗)、
# ux_round_exit{path_tag}(快照 round_facts.path——呈现层只订 战斗结算 的 ADR 纪律下唯一合法来源)、
# ux_refresh_attempt / ux_reject / ux_hint_shown(组合根显式上报;ux_window_choice 随道具窗口删除下线 2026-09-15)。
# ux_refresh_attempt / ux_reject / ux_hint_shown(组合根显式上报;无 ux_window_choice——道具窗口已下线)。
# 诊断转储 = 全量核心状态 + 最近结算/操作环形缓冲 → user://logs/diag_<时间戳>.json(卡死时点按钮)。
class_name PlaytestLogger
extends RefCounted
+2 -3
View File
@@ -1,11 +1,10 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 结算行排播泵(迭代 8 卡⑦;T3 拆件批 2026-10-02 自 main.gd 整体迁出——规范 1.1 单一职责):
# 结算行排播泵(规范 1.1 单一职责拆件):
# 演出层排播:逻辑先行零回压,行按段分组阶梯延迟进明细带。
# 硬契约:核心层零 await 不破——本队列只做信号的"后置消费",结算顺序/结果/时序逻辑零改动(§3 契约 1);
# 减动效开=延迟归零走同帧直落快路(行呈现不跳过——§3 契约 5);模态开启前强制排空(明细回看/停点
# 覆盖层所见明细带恒完整——排空入口在组合根 _open_modal)。
# 装配纪律:视图句柄与呈现刷新回调由组合根注入(ADR-0001——本类零信号连接,仅做信号后置消费);
# 行消费与卡⑦前逐位一致(_consume_row 原文迁入,语义零改动)。
# 装配纪律:视图句柄与呈现刷新回调由组合根注入(ADR-0001——本类零信号连接,仅做信号后置消费)。
extends Node
const PACE_SEGMENT_GAP := 0.3 # 段间阶梯延迟(代拍板:白名单 0.2–0.4s 内取值,追认清单呈报)
+2 -2
View File
@@ -1,6 +1,6 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-29(迭代 8 卡④ 最小设置面——设置与本地化.md P1 两项兑现:音量入口+减动效开关)
# 系统级设置独立存储(设置与本地化.md——2026-09-19 用户拍板:一安装一份、删游戏才消失,
# Date: 2026-09-29(最小设置面:音量入口+减动效开关——设置与本地化.md P1)
# 系统级设置独立存储(设置与本地化.md:一安装一份、删游戏才消失,
# 不进存档与生涯数据两分)。三件最小面:音量(master bus)/全屏/减动效。
# 生效侧分工:入口与持久化归本类;音量对声音的生效口径归 音频.md(master bus 单点);
# 减动效对动画的分档兑现归 battle.md §Transitions(UiKit.motion_scale 既有承载,结算逐行
@@ -1,13 +1,13 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 秘宝两步交互控制器(迭代 7 T4;T3 拆件批 2026-10-02 自 main.gd 迁出——规范 1.1 单一职责):
# 秘宝两步交互控制器(规范 1.1 单一职责拆件):
# C 区槽位选中/取消(toggle)→ 棋盘点格使用目标拾取的两步交互状态机 + 库存/叠加层只读投影装配。
# 数据源 = runner 级库存只读面(query_inventory/query_overlays)+ 表行投影(display_name/target/effect_kinds);
# 写调用唯一经 战斗结算.use_treasure(core 侧四步编排——拒绝零消耗 toast 可辨认)。
# 装配纪律:settlement/runner 随关卡逐关更替——经组合根现值回调注入(仿 identity_resolver 只读回调
# 先例);呈现句柄(信息面板/toast/棋盘叠加层)由组合根注入;ADR-0001——信号连接不在此发生,
# info_panel.treasure_slot_clicked 由组合根接至 on_slot_clicked。
# 无目标使用显式化(T3 收口):AP 类(target=none)本无坐标可给——原调用面伪造 Vector2i(-9,-9)
# 哨兵坐标;现调用面一律 attempt_use(handle)(cell 缺省=null=显式「无目标」),core 契约的
# 无目标使用显式化:AP 类(target=none)无坐标可给——
# 调用面一律 attempt_use(handle)(cell 缺省=null=显式「无目标」),core 契约的
# Vector2i 形参收口于本类常量(treasure_items.validate_use 对 ap 行忽略目标值,哨兵不出本类)。
extends RefCounted
+3 -3
View File
@@ -1,12 +1,12 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-12(code-review 修复批——自 main.gd 拆出,规范 1.1/1.2 模拟编排独立成类)
# Date: 2026-09-12(自 main.gd 拆出——规范 1.1/1.2 模拟编排独立成类)
# 调整板批量模拟控制器:逐次驱动 关卡自动策略(与 headless 扫描同口径)+ 进度/报告 setter 注入面板。
# 职责边界:零核心写——表基线复位由组合根在移交前完成(_apply_hero_override(0,0)),
# 加成施加 = 自动策略内部 runner.set_hero_override 单路径;报告文案装配归 HudPresenter。
# 组合根只转发 simulate_requested 信号。await 依赖面板所在场景树(进度逐帧刷新)。
# 反向依赖解除(2026-10-02 修复批 T6):presentation → smoke 的 preload 编译期依赖拆除——
# 依赖方向:presentation 不 preload smoke——
# 驱动实例由调用方构造注入(_driver,须供 run_level(...) 与 smoke/level_autoplay 同款签名);
# 构造参数缺省 null = 内部自建旧行为(运行时 load 兜底,同种子同口径零漂移)——main 侧接线归主控后续卡。
# 构造参数缺省 null = 内部运行时 load 兜底(同种子同口径零漂移)。
extends RefCounted
const SEED_BASE := 4200 # 模拟种子基(与历史实现同源——同种子可回放)
+2 -2
View File
@@ -2,8 +2,8 @@
# 实现 GDD:design/ux/battle.md(D 区 AP 条 44px——点阵+数字〔pattern 5 点阵资源显示〕、
# 停手按钮居左、图例+弃图刷新按钮居右〔雷图右上角〕;弃图刷新确认微交互与常规确认不同位
# 〔pattern 7 破坏性确认异位:RAP 扣费 · 旧板旗作废显式代价〕)。
# 2026-09-26 信息归属批:RAP 读数(点阵+数字)自 C 区迁入本条、置弃图刷新按钮左邻
# (RAP 唯一消费口 = 弃图刷新——就近原则;RAP 清零反馈/资源拒绝脉冲载体随迁)。
# RAP 读数(点阵+数字)在本条、置弃图刷新按钮左邻
# (RAP 唯一消费口 = 弃图刷新——就近原则;RAP 清零反馈/资源拒绝脉冲载体同处)。
# Date: 2026-09-12
# 高内聚边界:纯视图——意图经信号外发(stop_pressed/refresh_confirmed/legend_toggled),
# 状态由组合根经 setter 注入;刷新可用性预判 = RAP≥8 读数(行动经济 无推送信号——每次调用返回后重查)。
+2 -7
View File
@@ -3,13 +3,8 @@
# 实时流 / 点击展开回看 overlay〔pattern 6 模态纪律〕;行模板「{行为} {值} → {目标}(来源)」、
# 聚合计数行、零值行可见、效果行 value≠pool_value 禁相加、未生效四类行 icon/划线形状冗余、
# highlight 金框〔flag_hit/clear_reward_h2/perfect_broken〕、击杀标记)。
# Date: 2026-09-12(基础 = 2026-09-11 13 类行协议格式化版;2026-09-15 格面资源批 15→10 类:
# 删 item / consumed_ineffective / use_rejected / window_open / window_skip 五类——可选类道具与窗口下线,
# 战斗结算 行协议清单同步;2026-09-16 护甲等级掷点批:伤害行补掷点读数/档位随行标注 + nat20 金框高亮;
# 同日 敌人技能池批:施放行 = 蓄力行 charge 改型〔增益技 0 伤害施放、具名技能〕;
# 2026-09-20 八型批呈现层漏网修复(真人试玩卡断):伏击退役拆除伤害行 attach 字段后,
# 基线+伏击与普通+穿刺+魔法三分量两拆行分支未同步拆除——敌方行(带 baseline 无 attach)
# 格式化即 Invalid access,结算段中途夭折、界面卡死;两分支随批拆除,行上归因只剩掷点随行)
# Date: 2026-09-12(行协议格式化版;现行 10 类;伤害行带掷点读数/档位随行标注 + nat20 金框高亮;
# 施放行 = 蓄力行 charge 改型〔增益技 0 伤害施放、具名技能〕)
# 高内聚边界:战斗结算 步骤流 → 玩家文案的全部格式化规则内聚于此;来源文案映射来自 SettlementTable。
class_name BattleLogView
extends PanelContainer
+12 -14
View File
@@ -1,20 +1,18 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(B 区战斗画面 252px 全宽——主角站桩(左)+ 兑现演出区(中)+
# 敌方站桩 ×1–3(右)〔2026-09-20 全站桩拍板——卡片式退役〕;顶部中央轮次·阶段指示;
# 敌方站桩 ×1–3(右);顶部中央轮次·阶段指示;
# 底部结算明细带(布局决策 D1 常驻双舞台分屏))。
# Date: 2026-09-12(2026-09-20 站桩改造批:HeroCardView/EnemyCardView 退役,StandeeView 换装;
# setter 面契约保持——set_enemies/clear_enemies/on_step_row_fx/gray_all_enemies 签名不变)
# 战斗舞台 Node2D 迁移批 Phase B 2026-09-26(循环 1 T2 壳 + T3 站桩迁入;ADR-0006 /
# board-node2d-migration-plan §3):根壳 PanelContainer → Control(类名/尺寸 252px/树内位置
# 不变),内部两半区——「Node2D 舞台半区 = SubViewportContainer + SubViewport + StageWorld
# (站桩本体 StandeeBody 世界精灵)」+「Control 文本半区 = round_label / stage_center /
# log_view 三件原样保留(C1 永久 Control)」。SubViewport 逻辑分辨率 = 壳层像素 1:1(stretch,
# 禁任何缩放系数——C2/C5);字体显式注入挂点 set_world_font(C6,Phase A BoardView 同款)。
# T3 批内代拍板默认(待追认):①enemy_box 语义改写「站桩壳层伴随件容器」(HBoxContainer →
# Control,子件 = 各站桩的 StatusSlotRow 伴随件,手动定位随世界同步——探针 :97 计数面不变);
# ②hero_standee/enemy 站桩 = StandeeBody(Node2D 世界本体,行为面契约逐项保持 C3),其
# slot_row 成员 = 壳层伴随件引用;③定位同步 = 世界→壳层换算单点 world_to_shell,重建/重排
# 挂点调用(零每帧成本,C4)。旧 StandeeView(Control)随迁退役删除。
# Date: 2026-09-12(setter 面契约:set_enemies/clear_enemies/on_step_row_fx/gray_all_enemies
# 签名稳定——探针与组合根零改造面)
# 结构(ADR-0006 / board-node2d-migration-plan §3——B 区战斗舞台归 Node2D):根壳 Control(类名/
# 尺寸 252px/树内位置不变),内部两半区——「Node2D 舞台半区 = SubViewportContainer + SubViewport +
# StageWorld(站桩本体 StandeeBody 世界精灵)」+「Control 文本半区 = round_label / stage_center /
# log_view 三件」。SubViewport 逻辑分辨率 = 壳层像素 1:1(stretch,禁任何缩放系数——C2/C5);
# 字体显式注入挂点 set_world_font(C6,与 BoardView 同款)。
# enemy_box = 站桩壳层伴随件容器(Control,子件 = 各站桩的 StatusSlotRow 伴随件,手动定位随世界
# 同步——探针计数面不变);hero/enemy 站桩 = StandeeBody(Node2D 世界本体,行为面契约逐项保持 C3),
# 其 slot_row 成员 = 壳层伴随件引用;定位同步 = 世界→壳层换算单点 world_to_shell,重建/重排挂点
# 调用(零每帧成本,C4)。
# 高内聚边界:容器+组合视图——站桩槽位管理、轮次指示、结算行演出分发改由 setter 面承接;
# 结算流水格式化归 BattleLogView,核心状态→文案装配归 hud_presenter.gd。
class_name BattleStageView
+5 -5
View File
@@ -1,10 +1,10 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 棋盘 Node2D 迁移批 Phase A 2026-09-23:CellUnit——BoardView SubViewport 世界内逐格渲染件(Node2D)。
# 固定叠层序(ADR-0006 Decision 4):砖面底 < 变异纹带 < 数字/徽章 < 旗 < 焦点高亮——本批全部程序化
# _draw 等价平移现行占位视觉;每层留 texture 槽位(art-bible §8.2 格面 32×32 暂定档——终稿 1:1 换入,
# 本批不实现纹理加载)。无 class_name(类名缓存面纪律——BoardView 经 preload 使用)。
# CellUnit——BoardView SubViewport 世界内逐格渲染件(Node2D)。
# 固定叠层序(ADR-0006 Decision 4):砖面底 < 变异纹带 < 数字/徽章 < 旗 < 焦点高亮——全部程序化
# _draw 占位视觉;每层留 texture 槽位(art-bible §8.2 格面 32×32 暂定档——终稿 1:1 换入,
# 纹理加载未实现)。无 class_name(类名缓存面纪律——BoardView 经 preload 使用)。
# 字体:font 槽位缺省 = ThemeDB.fallback_font(与旧 Button 缺省主题字体同源);注入挂点归
# BoardView.set_world_font(SubViewport 内主题不自动继承主场景,Phase B 复用面)。
# BoardView.set_world_font(SubViewport 内主题不自动继承主场景,两舞台复用面)。
# 行为等价(缺陷①回归约束):格件常驻定长、逐格重绘由 BoardView 驱动,本类零游戏状态——渲染数据
# 全部由 BoardView 每次 paint 写入(bg_sb/glyph/badge),呼吸微光由 BoardView 就地改 bg_sb 边框。
extends Node2D
+7 -8
View File
@@ -2,19 +2,18 @@
# 实现 GDD:design/ux/battle.md(战斗屏 D 区 BoardView——格态/悬停预承诺光标/可挖域呼吸微光/
# BFS 路径预览/奖励徽章/结算期去饱和锁输入)。
# Date: 2026-09-12(battle.md 战斗屏改造批;基础 = 2026-09-11 HUD框架-lite 版)
# 棋盘 Node2D 迁移批 Phase A 2026-09-23:渲染本体由「GridContainer + 逐格 Button」平移为
# 「Control 壳 + SubViewportContainer + SubViewport + BoardWorld(Node2D) + CellUnit(Node2D)」
# (ADR-0006 / docs/architecture/board-node2d-migration-plan.md §2)。对外契约逐项保持:
# 棋盘渲染本体 = Control 壳 + SubViewportContainer + SubViewport + BoardWorld(Node2D) +
# CellUnit(Node2D)(ADR-0006 / docs/architecture/board-node2d-migration-plan.md §2)。对外契约:
# 类名/extends/三信号/click_cell/_cells 键面(Vector2i→格单元,值 Button→CellUnit)/
# board()/set_desaturated()/set_identity_resolver()/set_variant_mask_resolver()/set_cell_area()/
# rebuild()/refresh()/set_dig_glow_enabled()——探针与组合根零改造。
# 命中 = 壳层 _gui_input + 板级公式单点换算(ADR-0006 Decision 3,_cell_at 为唯一公式函数;
# SubViewportContainer 逻辑分辨率恒等于板像素尺寸(stretch 1:1,无缩放比),换算只需减居中偏移)。
# 程序化占位视觉等价平移(数字三档/旗/徽章/危险红/变异遮蔽 "?"/呼吸微光/悬停/路径预览/R₀ 豁免);
# CellUnit 叠层 texture 槽位留好(本批不接纹理资产)。新增只读属性 cell_size(旧私有名 _cell 契约化出口)。
# 棋盘小人贴图批 2026-09-25:英雄=BoardWorld 独立 Sprite2D(移动实体不进格面语义——计划书 §3.A;
# refresh diff last_hero_pos 驱动位移 Tween+站/走两帧+flip_h 朝向;素材缺位回退格内字形「人」);
# 挖掘=挥铲三帧特效(BoardFxView)+角色弹跳 Tween;格面五 texture 槽零改动。
# 程序化占位视觉:数字三档/旗/徽章/危险红/变异遮蔽 "?"/呼吸微光/悬停/路径预览/R₀ 豁免;
# CellUnit 叠层 texture 槽位留好(纹理资产接 CellUnit)。只读属性 cell_size 为格尺寸契约出口。
# 英雄 = BoardWorld 独立 Sprite2D(移动实体不进格面语义——计划书 §3.A;refresh diff last_hero_pos
# 驱动位移 Tween+站/走两帧+flip_h 朝向;素材缺位回退格内字形「人」);挖掘 = 挥铲三帧特效
# (BoardFxView)+角色弹跳 Tween;格面五 texture 槽位固定。
# 高内聚边界:只读 排雷玩法 查询面(+地图战斗资源 身份解析回调)做渲染与意图识别,动作经信号外发——不调用核心写接口
# (settle_batch 归组合根编排),不持久持有战斗态(minesweeper 引用随 refresh 更新,仅作只读查询)。
# 行为等价:格件常驻、逐格重绘在 refresh 内完成,无布局回流(缺陷①回归约束——CellUnit 定长不增删,
+3 -3
View File
@@ -1,10 +1,10 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 棋盘 Node2D 迁移批 Phase A 2026-09-23:BoardWorld——棋盘 Node2D 世界根(SubViewport 内
# BoardWorld——棋盘 Node2D 世界根(SubViewport 内
# CellUnit 容器)。职责单点:世界级材质挂点(set_desaturated 去饱和挂此处,CellUnit
# use_parent_material 链下随世界灰化)+ 主题/字体显式注入槽位(SubViewport 不自动继承主场景
# Control 主题——ADR-0006 Negative 项;Phase B 两舞台共用骨架,ADR-0006 Decision 5)。
# Control 主题——ADR-0006 Negative 项;两舞台共用骨架,ADR-0006 Decision 5)。
# 无 class_name(类名缓存面纪律——BoardView 经 preload 使用)。
# 立体原型批 2026-09-24(用户拍板「三档厚度实机对比」):板块伪立体绘制——正俯视纸雕风,
# 板块伪立体绘制(正俯视纸雕风):
# 顶面方格不变(数字可读性硬指标不受伤),厚度全部画在网格矩形外的正面/右侧悬崖带:
# 正面(背光暗)+右侧(微受光)+列分隔缝(ITB 悬崖列感)+岩层横纹+底部悬浮影(厚档)+
# 顶面接触 AO。零布局/命中改动(悬崖向网格外延展,世界尺寸由 BoardView._update_world_size 加 D)。
+1 -2
View File
@@ -1,6 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(D 区扫雷图 ~760×548 容器〔底行 520→548——停点前移批 2026-09-23,
# 原 A 区顶栏空间并入〕——顶部 AP 条 44px〔左:点阵+停手;
# 实现 GDD:design/ux/battle.md(D 区扫雷图 ~760×548 容器〔底行 548——原 A 区顶栏空间并入〕——顶部 AP 条 44px〔左:点阵+停手;
# 右:图例+弃图刷新〕、棋盘主体居中、toast 槽上缘内侧、演出层)。
# Date: 2026-09-12
# 高内聚边界:容器组合 + 信号转发——动作意图全部信号外发到组合根,零核心写调用。
+7 -8
View File
@@ -1,15 +1,14 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-21(元进度实现批——营地覆盖层呈现;2026-10-12 迭代 21 T6 营地统一重排——
# 四柜台并排〔2026-10-11 锻造工坊裁决会话 A② 裁〕:树淬炼柜台=树脊柱界面形态=主界面 /
# 锻造工坊柜台〔钥匙门:forge_workshop 点亮前锁定态,点亮=工作间两区六路线行板——迭代 23 T6 实装〕/
# Date: 2026-09-21(营地覆盖层呈现;营地统一重排——四柜台并排:树淬炼柜台=树脊柱界面形态=主界面 /
# 锻造工坊柜台〔钥匙门:forge_workshop 点亮前锁定态,点亮=工作间两区六路线行板〕/
# 秘宝匣柜台〔钥匙门:ks_workshop 点亮前锁定态,点亮=现工坊内容整体迁入——六行+同调装配段+Y 升级行〕/
# 奖励格图鉴柜台常开独立位;宽度不足横向滚动条。旧属性锻造柜台退役〔攻防所有权切分——
# 生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线〕)。
# 锁定态零副作用纪律(2026-10-11 用户令,延续):锻造工坊工作间锁定态(钥匙未点亮)开/关零副作用
# ——零写档、零报错、面板内无任何可交互购买路径(锁定行纯文案;点亮后交互面归 T6 行板意图信号)。
# 奖励格图鉴柜台常开独立位;宽度不足横向滚动条;无属性锻造柜台
# 〔生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线〕)。
# 锁定态零副作用纪律:锻造工坊工作间锁定态(钥匙未点亮)开/关零副作用
# ——零写档、零报错、面板内无任何可交互购买路径(锁定行纯文案;点亮后交互面归行板意图信号)。
# 信号面/投影契约:buy_requested(attr)〔现仅 Y 刷新升级行消费——装配段双入口之一 Q1 裁乙〕/closed、
# attune_toggled/tree_buy_requested/tree_fork_toggled、forge_buy_requested/forge_unlock_requested/
# forge_select_requested(迭代 23 T6——锻造三意图;写口唯一归 MetaProgression 锻造写口族)、
# forge_select_requested(锻造三意图;写口唯一归 MetaProgression 锻造写口族)、
# open_camp(data)/refresh_camp(data)。
# 挂接方式:开合与开始层互斥仿设置面先例(开始覆盖层非模态且树序在后——打开本层前由组合根
# 隐藏开始层,规范 2.3 遮挡纪律)。
+5 -7
View File
@@ -1,13 +1,11 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 生涯覆盖层·只读全屏页(迭代 18 卡④ 生涯界面实装批·期一 2026-10-07——需求卡片 v1.2 裁点全甲;
# 设计权威 design/gdd/systems/跨局循环/生涯.md v0.1 期一范围)。
# 裁决落形:P1/P2 甲=汇总段两类六项(冒险总局数/通关局数/各关通关次数/Boss 首杀/Boss 总击杀/
# 钥石余额——逐行只读;原「三柜台解锁完成度概览」三投影〔属性锻造/道具工坊/天赋树〕整行删
# ——2026-10-12 用户裁:生涯页不统计天赋树与账号成长态,只统计终身计数);P3 甲=登记 modal_stack
# 营地同档(设置层旁、确认弹窗之前——登记序=树序=z 序,组合根 addChild 同位);P4 甲=零跳转
# 生涯覆盖层·只读全屏页(期一;设计权威 design/gdd/systems/跨局循环/生涯.md 期一范围)。
# 呈现口径:汇总段两类六项(冒险总局数/通关局数/各关通关次数/Boss 首杀/Boss 总击杀/
# 钥石余额——逐行只读;不统计天赋树与账号成长态,只统计终身计数);登记 modal_stack
# 营地同档(设置层旁、确认弹窗之前——登记序=树序=z 序,组合根 addChild 同位);零跳转
# (页内零「前往他处」入口,仅只读展示+关闭)+局内不放生涯入口(开始覆盖层「营地与系统」组唯一入口)。
# 期二/期三内容(历史回看/图鉴/单局明细)零触碰——页内无任何期二占位件。
# 只读契约(需求卡片契约 3/4):数据快照由组合根 open_career 喂入(每次开层实时读 SaveManager
# 只读契约:数据快照由组合根 open_career 喂入(每次开层实时读 SaveManager
# 计数访问器 + MetaProgression 访问器重建——状态面板 R4 同构,快照仅单次开层生命周期,跨开层
# 零持有);本类零核心访问、零写通路——唯一信号 closed(关闭意图,组合根经模态栈单口收口)。
# 零动效(状态面板 P4 甲先例同款):直开直关,无 tween 无 AnimationPlayer。
@@ -1,10 +1,10 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-10-01(迭代 10 奖励重构批——level-clear.md v2 三选一选择面承载)
# Date: 2026-10-01(三选一选择面承载)
# 提升三选一覆盖层(模态):非末关通关的选择停点呈现——部分回血反馈 + 三卡点选 + 确认兑付。
# 高内聚边界:文案拼装归 Narrator(组合根喂入),选择意图经信号外发;视图零核心引用。
# 交互范式 = node_overlay choice_box 按钮族 + 选路两段式(点选→确认)复用,零新原语。
# 状态机:pick(三卡点选→确认)→ result(兑付反馈→继续)。〔replace 满位替换子态随迭代 22 T5
# 拆除——装配不可变契约 1(冒险中零更换途径),core 写口与组合根接线同批摘除。〕
# 状态机:pick(三卡点选→确认)→ result(兑付反馈→继续)。无 replace 子态——
# 装配不可变契约 1(冒险中零更换途径)。
class_name CurioPickOverlay
extends Control
+5 -6
View File
@@ -1,14 +1,13 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-10-04(迭代 14.5 调试整合批——主菜单三散件(随机种子/角色数值调整板/两层调试入口)收一张调试浮窗,
# 原 views/tune_panel.gd 整体吸收退役)
# 开发调试浮窗:全局可开(迭代 18 卡⑦——DS_DEBUG=1 会话启动即开〔组合根 _ready〕+战斗屏 HUD/关卡地图屏
# 两枚角标再开〔P2 甲,17卡③状态角标同形制〕;遮挡语义=ModalStack 登记制:他模态开时暂隐、关后自动恢复;
# 旧「仅开始菜单可开」门随入口迁宿主退役)。当局数据只读区块=本局种子唯一查看位(T3,P4 甲六项)。
# Date: 2026-10-04(主菜单调试三散件(随机种子/角色数值调整板/两层调试入口)收一张调试浮窗)
# 开发调试浮窗:全局可开(DS_DEBUG=1 会话启动即开〔组合根 _ready〕+战斗屏 HUD/关卡地图屏
# 两枚角标再开;遮挡语义=ModalStack 登记制:他模态开时暂隐、关后自动恢复)。
# 当局数据只读区块=本局种子唯一查看位(六项)。
# 列表页形态可扩展:后续调试项按区块往下追加,超高滚动。
# 纯视图边界(规范 1.3):数值应用/批量模拟/对局启动全部经信号外发由组合根承接
#(apply_requested / simulate_requested / debug_levels_requested / closed);
# 当局数据经 update_run_data setter 喂入(只读投影零回读);模拟进度与报告经 setter 注入——
# 零核心写、不拼报告文案(装配归 HudPresenter)。零动效(零 tween/AnimationPlayer——17卡③契约)。
# 零核心写、不拼报告文案(装配归 HudPresenter)。零动效(零 tween/AnimationPlayer)。
# 探针接缝(ADR-0004"合成输入走真实翻译出口"口径):press_apply_for_probe 等三键 = 按钮真实信号路径。
class_name DebugOverlay
extends Control
@@ -1,10 +1,10 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(C 区角色信息 240×548——2026-09-26 信息归属拍板精简:
# 实现 GDD:design/ux/battle.md(C 区角色信息 240×548:
# 攻击(+修正来源角标)/护甲 AC 数据框 + 秘宝槽(预留)+ 特性列表(预留)。
# HP 条/立绘占位/状态效果槽/RAP 池/GP/钥石退役——HP 与状态唯一展示面 = B 区站桩(同一数据
# hud_presenter 双投喂 B/C 两区的重复展示);RAP 迁 D 区 AP 条(贴弃图刷新消费口);
# GP(中循环)/钥石(大循环)迁出战斗屏)。
# Date: 2026-09-12(2026-09-26 C 区精简批重写)
# Date: 2026-09-12
# 高内聚边界:纯视图 setter 面——装配(含修正文案/AC 投喂)归 hud_presenter.gd;定长槽 + clip_contents
# (缺陷①回归约束)。
class_name HeroInfoPanelView
+9 -13
View File
@@ -1,21 +1,17 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-17(分支节点图批——关卡节点地图 v1.0 图版选路呈现)
# 2026-09-28 关卡画面实装批(M-1 迭代 1 T4——level-map.md 三拍板落地):
# ① 三停点标题定稿(布局决策 1——清偿台账 143:「继续前进(战斗房)」入口措辞矛盾退役)
# ② 图上点击选路唯一通道(布局决策 2)——候选按钮整列退役;候选节点亮金描边 = 可点目标,
# 悬停预承诺(描边加粗+指针)后点击提交;press_candidate 探针入口改走图上命中同路径
# ③ 放弃冒险二次确认(布局决策 3)——首击转确认态(文案+危险红脉冲约 3 秒超时回落),二击提交
# ④ 顶栏语境:关卡名(level_row.display_name)+ GP 常驻徽章(2026-09-26 二轮拍板去向落地面)
# ⑤ 底部状态栏(布局决策 4):生命/属性/特性三组常读(零加成隐藏),放弃按钮右端异位
# 关卡画面(独立屏,Level Map Screen——2026-09-28 形态升格批 M-2 迭代 3 T2:原 RouteOverlay 模态
# 覆盖层升格独立屏,spec level-map.md 形态章节同批改写):全屏不透明独占呈现——激活期战斗屏宿主
# Date: 2026-09-17(关卡节点地图 v1.0 图版选路呈现)
# 布局决策(level-map.md):① 三停点标题定稿 ② 图上点击选路唯一通道——候选节点亮金描边 = 可点目标,
# 悬停预承诺(描边加粗+指针)后点击提交;press_candidate 探针入口走图上命中同路径
# ③ 放弃冒险二次确认——首击转确认态(文案+危险红脉冲约 3 秒超时回落),二击提交
# ④ 顶栏语境:关卡名(level_row.display_name)+ GP 常驻徽章
# ⑤ 底部状态栏:生命/属性/特性三组常读(零加成隐藏),放弃按钮右端异位
# 关卡画面 = 独立屏(Level Map Screen):全屏不透明独占呈现——激活期战斗屏宿主
# 由组合根整体隐藏(非暗幕半透、零透出)。零自动推进的玩家停点语义不变:唯一前进通道 =
# 图上点候选节点 → route_chosen(node_id) → 组合根转 runner.pick_next_node。
# 高内聚边界:只读 runner 成文出口(nodes()/visited_ids()/node_index/next_candidate_ids()/level_row/
# hero_hp/gp/effective_*/bonus)做渲染,无任何写面;图形为程序化占位质量(占位纪律)。
# 放弃入口(2026-09-21 用户拍板「放弃接口也要有」——台账 119):选路停点 = 天然非战斗期(接口契约:
# 战斗中放弃一律拒绝),按钮常驻底栏右端;可见性归组合根(只在冒险模式开——放弃的语义对象是
# "整局冒险";调试两层无节点图天然不可达)。
# 放弃入口:选路停点 = 天然非战斗期(接口契约:战斗中放弃一律拒绝),按钮常驻底栏右端;
# 可见性归组合根(只在冒险模式开——放弃的语义对象是"整局冒险";调试两层无节点图天然不可达)。
class_name LevelMapScreen
extends Control
+2 -2
View File
@@ -1,8 +1,8 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-29(迭代 8 卡④ 最小设置面)
# Date: 2026-09-29(最小设置面)
# 设置覆盖层(纯视图边界规范 1.3 同款):音量滑杆/全屏/减动效三件+返回(退出游戏已提级开始菜单)。
# 生效与持久化全经 SettingsStore 单点(实时应用+即改即存);本类零核心触碰。
# 减动效转正承载(测试调整板旧开关退役——设置面唯一入口,卡④ AC③)。
# 减动效开关 = 设置面唯一入口(旧测试调整板开关已移除)。
# 探针接缝:retarget(store) = 隔离存档换注口(同 camp 换注先例);控件引用公有只读供断言。
class_name SettingsOverlay
extends Control
+4 -4
View File
@@ -1,11 +1,11 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 战斗舞台 Node2D 迁移批 Phase B 2026-09-26(循环 1 T2/T3):StageWorld——B 区战斗舞台 Node2D
# StageWorld——B 区战斗舞台 Node2D
# 世界根(SubViewport 内站桩本体容器)。ADR-0006 分工:Node2D = D 区棋盘 + B 区战斗舞台;
# 与 BoardWorld(Phase A)同构。职责单点:主题/字体显式注入槽位(SubViewport 不自动继承主场景
# 与 BoardWorld 同构。职责单点:主题/字体显式注入槽位(SubViewport 不自动继承主场景
# Control 主题——ADR-0003 Decision 4;set_world_font 同款挂点,null = ThemeDB.fallback_font 与
# 旧 Label 缺省主题同源)+ 站桩本体装载面(T3 迁入)。无 class_name(类名缓存面纪律——
# 旧 Label 缺省主题同源)+ 站桩本体装载面。无 class_name(类名缓存面纪律——
# BattleStageView 经 preload 使用)。
# 坐标空间钉死(台账 160 纪律延伸):世界内 = 局部排布坐标(SubViewport 逻辑分辨率 =
# 坐标空间钉死:世界内 = 局部排布坐标(SubViewport 逻辑分辨率 =
# 壳层像素 1:1,无缩放系数——C2/C5);壳层/fx 层 = 全局含容器偏移,换算单点在
# BattleStageView.world_to_shell()。
extends Node2D
+6 -7
View File
@@ -1,15 +1,14 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(B 区全站桩形态——2026-09-20 用户看对照样张拍板,台账 99:
# 主角与敌人均为无框立绘+底座,英雄卡/敌人卡卡片式整体退役禁再提)。
# 战斗舞台 Node2D 迁移批 Phase B 2026-09-26(循环 1 T3):站桩本体自 Control(旧 StandeeView,
# 退役删除)平移为 Node2D 世界精灵(ADR-0006:B 区战斗舞台归 Node2D)。行为面契约逐项保持:
# 实现 GDD:design/ux/battle.md(B 区全站桩形态——主角与敌人均为无框立绘+底座,
# 英雄卡/敌人卡卡片式整体退役禁再提)。
# 站桩本体 = Node2D 世界精灵(ADR-0006:B 区战斗舞台归 Node2D)。行为面契约逐项保持:
# set_data/set_hero/_set_hp/set_idle/set_effects/set_effects_cleared_feedback/set_order/set_pending/
# _play_intent_motion/set_portrait_texture(tex,flip)/mark_dead/is_dead/flash_hit/_revive/
# _update_name_line/_refresh_portrait_glyph(调用点 hud_presenter/main/探针零改造目标——C3)。
# 等价平移基线 = 旧 Control 占位表现(C9):立绘贴图(flip/NEAREST/整数 2× 档)+ 底座 + 血条
# 表现基线(C9):立绘贴图(flip/NEAREST/整数 2× 档)+ 底座 + 血条
# (直角递减 tween)+ 顺位徽标 + 意图徽标(弹入+立绘前倾一次性动画)+ 名字行(纯名+护甲类型
# 图标——2026-09-26 终裁 AC 不展示)+ 受击闪白 + 死亡灰化摇摆塌陷(禁瞬消)+ 复活 + 字形占位
# 回退(人/▂/▆/█/✕/敌)。批内代拍板默认(待追认):①状态图标行(slot_row)与悬停 tooltip 保留
# 图标——AC 不展示)+ 受击闪白 + 死亡灰化摇摆塌陷(禁瞬消)+ 复活 + 字形占位
# 回退(人/▂/▆/█/✕/敌)。代拍板默认:①状态图标行(slot_row)与悬停 tooltip 保留
# Control 载体挂壳层(tooltip 机制零返工)——本体的 slot_row 成员 = 壳层伴随件引用;
# ②状态行隐藏时序 = 随 mark_dead 同拍隐藏;③清空反馈微文案挂伴随件父层(壳层)。
# 文字全部经 draw_string + 世界字体(world.world_font 或 ThemeDB.fallback_font——C6 挂点链)。
+5 -7
View File
@@ -1,11 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 局内状态面板·只读(迭代 17 卡③ 状态面板只读入口批 2026-10-06——需求卡片 v1.1;事实源=06-待办清单
# 「解锁界面与钥石呈现的交互形态(残余:状态面板只读入口)」)。
# 裁决落形:P1 丁=入口为战斗屏 HUD / 关卡地图屏常驻角标(入口装配在 ui_assembler/两屏,本类不含入口);
# P2 甲=登记 modal_stack 设置层同档(确认弹窗之前)带 dim 遮罩;P3 甲=展示钥石余额+进度概览
# (道具工坊六件解锁态 / 天赋树已购概览——层内行序与分组复用营地屏同序;属性锻造三行段随
# 迭代 21 柜台退役连带删除——数据源 forge_levels 域已清退);P4 甲=进出零动效直开直关
# (无 tween 无 AnimationPlayer——R5)。
# 局内状态面板·只读。
# 呈现口径:入口为战斗屏 HUD / 关卡地图屏常驻角标(入口装配在 ui_assembler/两屏,本类不含入口);
# 登记 modal_stack 设置层同档(确认弹窗之前)带 dim 遮罩;展示钥石余额+进度概览
# (道具工坊六件解锁态 / 天赋树已购概览——层内行序与分组复用营地屏同序;无属性锻造段);
# 进出零动效直开直关(无 tween 无 AnimationPlayer——R5)。
# 只读契约:R4 数据只读同源——账面快照由组合根 open_status 喂入(每次开层实时读 MetaProgression
# 访问器重建,快照仅用单次开层生命周期,跨开层零持有);本类零核心访问、零写通路——唯一信号
# closed(关闭意图,组合根经模态栈单口收口)。R1 公共件单点:全部构成件经 UiKit 工厂产出
+2 -2
View File
@@ -2,8 +2,8 @@
# 实现 GDD:design/ux/battle.md(C 区状态效果槽 ×4〔增益状态 D1×①〕——effect_id→定稿 PNG 纹理图标、
# 层数角标、剩余结算次数点、悬停 tooltip(来源+语义+剩余);空态 = 槽隐藏(数据框上移补位,
# EC12 空态裁决);极性映射 = 战斗结算 SettlementTable 效果语义而非 magnitude 符号〔增益状态 D1×③〕)。
# 2026-09-24 状态图标接入批:程序化占位字形(▲◇▼◎⚔✕☾⇧▣)+ 按极性染色退役——定稿九枚 PNG
# (白剑/白盾/白眼+绿↑红↓箭头语言,用户逐键验收,圣经 §4.6.1 v2.2 纹样系统)自带极性,裸图标呈现。
# 图标 = 定稿九枚 PNG
# (白剑/白盾/白眼+绿↑红↓箭头语言,圣经 §4.6.1 纹样系统)自带极性,裸图标呈现;无程序化占位字形。
# Date: 2026-09-12
# 高内聚边界:纯视图——效果投影装配归 hud_presenter.gd;增益状态 纯被动容器零信号——刷新绑 战斗结算
# 结算编排完成时点(battle.md 更新触发注记)。
+3 -3
View File
@@ -1,10 +1,10 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-13(O4/W-3 收口——自动玩家策略四份复制单一实现)
# Date: 2026-09-13(自动玩家策略单一实现)
# 自动玩家策略集(headless 冒烟/扫描/转储共用的理性玩家近似):
# choose_dig = 挖最近可挖格(先移到邻接已开格)。
# 2026-09-15 格面资源批:window_selection(道具窗口确定性选择)随道具窗口删除下线。
# 无 window_selection(道具窗口确定性选择——道具窗口已下线)。
# 读取面:战斗结算.presentation_snapshot() / 排雷玩法 查询面(E1/E2 收口后的成文 API——禁直读核心状态)。
# 等价性证明:smoke_all 同种子回放断言(步骤流逐行相同)在重构后保持全绿。
# 回归护栏:smoke_all 同种子回放断言(步骤流逐行相同)。
extends RefCounted
+2 -2
View File
@@ -1,9 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 战斗驱动循环单点(T6 样板收口批 2026-10-02)——smoke 族探针共用的「挖掘至停手」整轮驱动。
# 战斗驱动循环单点——smoke 族探针共用的「挖掘至停手」整轮驱动。
# 策略 = AutoPlayer.choose_dig(O4 单一实现):挖最近可挖格(异格先移位)/ 无可挖或相位离 Active 停手。
# 语义锚(monte_carlo 原型逐位保持):guard 400 步防挂死;移位后相位/轮次离场即 break;
# 轮末仍 Active 且未换轮 → settle_batch stop。smoke_all._run_battle/_auto_play_round 为冒烟本体
# 不经本面(含回归断言——2026-10-02 修复批加,禁并入);fx_shot_probe 为带墙钟抓帧的异步变体亦不在列。
# 不经本面(含回归断言,禁并入);fx_shot_probe 为带墙钟抓帧的异步变体亦不在列。
extends RefCounted
const AutoPlayer := preload("res://smoke/auto_player.gd")
+4 -4
View File
@@ -1,12 +1,12 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 棋盘渲染帧取证探针(2026-10-01——数字墨族按板自适应修复的目视验证面:机检≠看得清)。
# 棋盘渲染帧取证探针(目视验证面:机检≠看得清)。
# 必须**窗口化**运行(headless 无渲染面):
# Godot_console.exe --path . res://smoke/board_shot_probe.tscn -- <输出目录>
# 流程:L1/L2/L3 各起一板(真实 LevelRunner+settle_batch 驱动 ~18 步 novice——自然揭示数字/旗),
# BoardView 真渲染,frame_post_draw 同步后抓视口 PNG。零存档触碰(无 save_manager 引用)。
# 迭代 19 卡① T1/T2(2026-10-08):①headless fail-fast 护栏(shot_probe 同款);
# ②空纹理取证 fail(Q7——取证段失败=闸红,零字节/空纹理不允许静默落盘);
# ③board_meta.json 取样坐标落盘(棋盘视图全局矩形——golden 前置裁剪坐标源,禁硬编码像素)。
# 护栏:headless fail-fast(shot_probe 同款);空纹理取证 fail——取证段失败=闸红,
# 零字节/空纹理不允许静默落盘;board_meta.json 取样坐标落盘(棋盘视图全局矩形——
# golden 前置裁剪坐标源,禁硬编码像素)。
extends Node
const AutoPlayer := preload("res://smoke/auto_player.gd")
+2 -2
View File
@@ -1,7 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 定位:分析工具·非验收件(2026-10-08 迭代 19 卡① T3 收编排标注)——零断言取数工具,不出入任何闸。
# 定位:分析工具·非验收件——零断言取数工具,不出入任何闸。
# Date: 2026-09-19
# 棋盘板形统计探针(清图支配性对账重跑批取数工具——判式"实测板形"口径的数据源):
# 棋盘板形统计探针(判式"实测板形"口径的数据源):
# 对 board_gen.tres 每行 (L, D) 生成 N 张板,统计幸存雷数 |M| 与安全格数 |S|
# 的均值 / 最小 / 最大("先布后删"后的落地值——名义值 density×(W×H−9) 不含删除段)。
# 只读诊断,零游戏代码改动;装载面与冒险扫描工具同源(config_db.load_tables)。
+3 -6
View File
@@ -1,11 +1,8 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 定位:诊断工具·非验收件(2026-10-08 迭代 19 卡① T3 收编排标注)——A1 红灯=改前既有诊断面
# (design/qa/m4iter14-mineq-exit-report §四.7),不出入任何闸(probe_gate/render_gate/run_smoke 全不涉);
# roadmap M4 数值批引用其修复义务不受本标注影响。
# 定位:诊断工具·非验收件——不出入任何闸(probe_gate/render_gate/run_smoke 全不涉)。
# Date: 2026-09-13(playtest-2026-09-12 报告 Top1——零承伤根因分割探针)
# 2026-09-16 改掷点口径(护甲等级掷点批):defense_up 墙已随 AC 换装退役——
# H1 旧 defense_up 叠满墙失义(hero_defense 池现仅 off_guard 正向行,×0 墙结构面消失)
# H2 Boss/敌攻击链健康:fresh 池下非蓄力拍 d_tick = max(下限, 池乘区(掷点档位基线))(伏击附加随八型批 2026-09-20 退役)
# 检查面:H1 hero_defense 池仅 off_guard 正向行(×0 墙结构面不存在);
# H2 Boss/敌攻击链健康——fresh 池下非蓄力拍 d_tick = max(下限, 池乘区(掷点档位基线))。
# 快照盲区说明:settlement_snapshot 取在衰减段之后,时效 1 的 ac_up 当轮授予当轮衰减——
# 真人局 JSONL buffs[] 恒空 ≠ 状态为空,本探针改从结算行(授予/续存 effect 行的 pool_value)重建战斗段时点池值。
# 观测面:全部读战斗结算步骤行 / 表值 / 呈现快照(零核心穿透);池归属/档位/下限全读表(数据配置 Rule 1——零数值字面量)。
+2 -3
View File
@@ -1,8 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-13(playtest-2026-09-12 Q1 复核——"安全格减伤是否过量导致满血打完 Boss")
# 2026-09-16 改 AC 口径(护甲等级掷点批):defense_up 百分比减伤行已整体退役换装 ac_up
# (+1 护甲等级/层 ×2 层),本探针改逐结算轮统计 ac_up 授予层数(AC10→11→12)与该轮敌方实伤,
# 分割"高 AC 轮"(叠满 = AC12,期望减免 28.75%)与基线轮(AC10,期望减免 21.25%)的承伤读数。
# 口径:逐结算轮统计 ac_up 授予层数(AC10→11→12)与该轮敌方实伤,
# 分割"高 AC 轮"(叠满 = AC12,期望减免 28.75%)与基线轮(AC10,期望减免 21.25%)的承伤读数。
# 运行:Godot_console.exe --headless --path . --script res://smoke/defense_scan.gd -- [N] [seed0]
extends SceneTree
+1 -1
View File
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 演出渲染证据探针(渲染层测试解冻批 2026-10-01——fx_shot_probe:真实渲染设备抓战斗演出瞬间帧)。
# 演出渲染证据探针(真实渲染设备抓战斗演出瞬间帧)。
# 必须**窗口化**运行(真渲染设备——headless 无渲染面):Godot_console.exe --path . res://smoke/fx_shot_probe.tscn -- <输出目录>
# 流程 = shot_probe 同款隔离面(存档/设置/元进度换注隔离档,禁碰真实档)+ 真实按钮路径开冒险进首战;
# 自动玩家挖格驱动行结算,在 行到达/弹道飞行/结算排播 三时刻抓帧——演出链「逻辑在(fx_probe PASS)×
+16 -21
View File
@@ -1,28 +1,23 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-11(2026-09-12 增完整遥测接线——用户要求:任何模拟运行与真人试玩同日志合规:
# 操作记录 / 轮次状态 / 战斗结束 / 通关结束 全量 JSONL。logger=null 时自建会话(每局一文件),
# 批量调用方传共享 logger(log_run 局次标记切分)。
# Date: 2026-09-11
# 日志合规:任何模拟运行与真人试玩同日志——操作记录 / 轮次状态 / 战斗结束 / 通关结束 全量 JSONL。
# logger=null 时自建会话(每局一文件),批量调用方传共享 logger(log_run 局次标记切分)。
# 关卡自动通关策略(理性玩家近似)——呈现层数值调整板的批量模拟与 headless 扫描
# 共用同一实现,保证"面板模拟读数"与"扫描表读数"同口径。策略与 smoke_all 战斗自动玩家同族:
# 挖最近可挖格 / 无可挖停手 / 奖励恢复点立即确认。
# 2026-09-23 单关直入口口径退役(用户拍板):run_level 降格为机制夹具/单战锚点专用
# (smoke_all 机制断言、rhythm/defense/damage 单战扫描)——通关率/难度类测量禁用本入口
# (满血零上下文进关,与真实冒险条件通关率脱节),一律走 run_adventure。
# 2026-09-15 格面资源批:道具窗口选择与可选类获取计数随可选类道具删除下线。
# 2026-09-14 增完美策略档(policy="perfect",默认 "normal" 零行为变更——既有调用方签名兼容):
# 零盲挖/全标旗/卡死刷新——上界测量仪,求解器与动作语义见 auto_player.gd 完美策略档节。
# 2026-09-17 分支节点图批:选路适配(零自动推进)——兑付确认/战斗胜利后 runner 进选路态,
# 驱动循环按 route 策略显式 pick_next_node;route = "min"/"max"(候选节点编号最小/最大——
# 确定性路径轴,零随机流自开;默认 "min" 既有调用方签名兼容)。
# 2026-09-21 冒险结构实现批:run_adventure 三关连探驱动(AdventureRunner——主种子恰一次、
# 通关兑付停点确认、adventure_finished 置 result/summary;外层每关重取 runner 实例经 _drive_level
# 复用单关驱动)。run_level 驱动段抽成 _drive_level——签名与返回结构零变化,行为逐位不变。
# 2026-10-01 迭代 10 奖励重构批:大奖励立即确认改三选一停点驱动(候选取首件/替换放弃新件)。
# 2026-10-01 模拟档位重构(master 数值修复批——普通档 v2 被真人实证推翻,尺子比真人弱 20 倍):
# ①普通档 v3 = 完美策略 + 受控失误注入(失误流走独立策略 RNG——种子派生自局种子,
# 逐局确定性/可回放保持,核心七流零消费零扰动);novice_action 留库不删(历史读数对账面)。
# ②完美档修上界:选路目标价值评分(rest 伤重优先/shop 有钱优先/boss 缓冲)+ 商店贪心买齐。
# ③route 轴保持:评分同分 tie-break 仍按 min/max 编号方向——verifier 双窗轴不塌。
# run_level = 机制夹具/单战锚点专用(smoke_all 机制断言、rhythm/defense/damage 单战扫描)——
# 通关率/难度类测量禁用本入口(满血零上下文进关,与真实冒险条件通关率脱节),一律走 run_adventure。
# 策略档 policy:"normal"(默认)/ "perfect"(零盲挖/全标旗/卡死刷新——上界测量仪,求解器与
# 动作语义见 auto_player.gd 完美策略档节)。
# 选路驱动(零自动推进):兑付确认/战斗胜利后 runner 进选路态,驱动循环按 route 策略显式
# pick_next_node;route = "min"/"max"(候选节点编号最小/最大——确定性路径轴,零随机流自开;默认 "min")。
# run_adventure 三关连探驱动(AdventureRunner——主种子恰一次、通关兑付停点确认、adventure_finished
# 置 result/summary;外层每关重取 runner 实例经 _drive_level 复用单关驱动)。
# 大奖励停点 = 三选一驱动(候选取首件/替换放弃新件)。
# 普通档 v3 = 完美策略 + 受控失误注入(失误流走独立策略 RNG——种子派生自局种子,逐局确定性/
# 可回放保持,核心七流零消费零扰动;novice_action 留库不删——历史读数对账面)。
# 完美档上界:选路目标价值评分(rest 伤重优先/shop 有钱优先/boss 缓冲)+ 商店贪心买齐。
# route 轴:评分同分 tie-break 仍按 min/max 编号方向——verifier 双窗轴不塌。
# 运行前提:db 已 load_tables;run_level/run_adventure 均须全新 RngService(同种子 ⇒ 全程逐步可回放)。
# 实现注:信号处理体全部为静态方法 + bind 传状态——GDScript 多行 lambda 内嵌 match/控制流的解析不可靠。
extends RefCounted
+1 -1
View File
@@ -1,7 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-11
# 战斗期望蒙特卡洛:当前参数下"胜轮数 / 每轮承伤 / 清图次数 / 开格数"的分布实测。
# 政策 = 理性玩家近似:挖最近可挖格(AutoPlayer 单一实现——O4 收口;道具有效期政策随可选类删除退役 2026-09-15)。
# 政策 = 理性玩家近似:挖最近可挖格(AutoPlayer 单一实现)。
# 运行:Godot_console.exe --headless --path . --script res://smoke/monte_carlo.gd
extends SceneTree
+3 -3
View File
@@ -1,7 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 探针共用面:树寻址助手 + 存档/设置/元进度隔离样板单点(T6 样板收口批 2026-10-02)。
# 收口范围:ui_probe / ui_click_probe / shot_probe / fx_shot_probe 四探针的 7 处树寻址样板
# 与 7 处隔离样板(各探针隔离文件名后缀 tag 保持不变)。
# 探针共用面:树寻址助手 + 存档/设置/元进度隔离样板单点。
# 覆盖:ui_probe / ui_click_probe / shot_probe / fx_shot_probe 四探针的树寻址样板
# 与隔离样板(各探针隔离文件名后缀 tag 保持不变)。
# 用法:探针侧 `const ProbeUiUtil := preload("res://smoke/probe_ui_util.gd")` 后静态调用
#(探针载体含 --script 场景两种,均无全局标识符——禁 class_name 裸引用)。
extends RefCounted
+5 -5
View File
@@ -1,6 +1,6 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 整屏截图探针(迭代 9 卡⑰a 2026-09-30——呈现层测试分级 B 档基建:视口截图程序化产出;
# 迭代 19 卡① T1 2026-10-08 扩屏四屏→七屏——新纳 设置面/生涯页/状态面板,正主=tools/render_gate.sh)。
# 整屏截图探针(呈现层测试分级 B 档基建:视口截图程序化产出;七屏——
# 菜单/设置面/生涯页/营地/关卡画面/战斗/状态面板,正主=tools/render_gate.sh)。
# 必须**窗口化**运行(真渲染设备——headless 无渲染面,get_image 得到空纹理):
# Godot_console.exe --path . res://smoke/shot_probe.tscn -- <输出目录>
# 流程 = 真实按钮信号路径驱动(ui_click_probe 同款;存档/设置/元进度三面换注隔离档——禁碰真实档,
@@ -9,9 +9,9 @@
# 战斗(level_screen.press_candidate(0) 真实选路提交)→ 状态面板(地图屏状态角标真实信号路径)。
# 每屏双帧 + frame_post_draw 同步后抓 get_viewport().get_texture(),PNG 落输出目录;
# 最小自检 = 七件存在且非零字节(像素方差断言归 tools/shot_checker.py——B 档骨架分工)。
# 商店房注记(迭代 19 卡① T1 考证结论,代拍板白名单授权):真实路径必经 L1 打穿→L2 商店节点
# 选路(ui_click_probe 实证商店层在 L2 Boss 前必经位)——探针现行驱动只进首战节点,低代价确定性
# 到达不成立;合成投喂(ui_struct_probe 同款)破坏本探针真实路径口径 → 不纳屏,注记留 B 批。
# 商店房不纳屏(真实路径口径):真实路径必经 L1 打穿→L2 商店节点
# 选路(商店层在 L2 Boss 前必经位)——探针现行驱动只进首战节点,低代价确定性
# 到达不成立;合成投喂(ui_struct_probe 同款)破坏本探针真实路径口径 → 不纳屏。
extends Node
const ProbeUiUtil := preload("res://smoke/probe_ui_util.gd") # T6 收口:树寻址/隔离样板单点
+1 -1
View File
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 定位:分析工具·非验收件(2026-10-08 迭代 19 卡① T3 收编排标注)——零断言取数工具,不出入任何闸。
# 定位:分析工具·非验收件——零断言取数工具,不出入任何闸。
# Date: 2026-09-19
# 技能池节奏探针:地精一伙 (1,1) 750 出招零突刺异常的定位——
# ① 表侧:resolve_enemy_rowset(1,1) 的池快照内容;
+1 -1
View File
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 全屏 UI 审计截图探针(2026-10-06 用户令——实机每一屏 vs demo v2.1 逐屏对比;shot_probe 十二屏扩展形)。
# 全屏 UI 审计截图探针(实机每一屏 vs demo 逐屏对比;shot_probe 扩展形)。
# 必须**窗口化**运行(真渲染面;headless 守卫同 shot_probe):
# Godot_console.exe --path . res://smoke/ui_audit_probe.tscn -- <输出目录>
# 覆盖 = demo 八映射屏(start/camp/settings/map/battle/bonus/shop/end 胜败两态)+ demo 无映射三屏
+2 -2
View File
@@ -1,9 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(§AC 场景级测试 + §Interaction Map——UI 行为随机化探针 v3)。
# Date: 2026-09-12(战斗屏改造批扩展;基础 = 2026-09-11 问题3 复现器 v2——既有断言全保留)
# Date: 2026-09-12
# 合成鼠标事件走真实呈现层路径(BoardView.click_cell / 按钮信号 → 组合根动作通道),
# 随机混合玩家行为——插旗/拔旗、提前停手、弃图刷新确认链、图例模态、明细回看模态、
# tooltip 悬停、无效点击——扫描结算停滞(缺陷②回归载体;缺陷④窗口契约随道具窗口删除退役 2026-09-15)
# tooltip 悬停、无效点击——扫描结算停滞(缺陷②回归载体)
# + 模态遮挡断言(缺陷⑤回归:图例/回看/终局 overlay 打开时上方遮挡层隐藏、输入锁定)
# + 性能 AC:场景实例化到首格可点 ≤500ms 探针计时。
# 行为序列由 PROBE_SEED 决定(shell 传参);程序玩法数值不受影响(随机只用于探针策略)。
+2 -2
View File
@@ -1,7 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# UI 文字对比度机检(UI 设计对齐批 T2 2026-10-06——需求卡片 §7 新增机检段①,probe_gate 默认必跑)
# UI 文字对比度机检(probe_gate 默认必跑)
# 断言面 = 文字墨对直背景 ≥4.5:1(art-bible §7.2 无区域例外;文字禁直压纹理底——垫牌后按牌色计)。
# 测点表随批维护:血数垫牌 / 意图徽标四墨(PANEL_DATA 垫牌)/ C区槽位两态墨 / RAP 标签 + 全站锚点组。
# 测点表:血数垫牌 / 意图徽标四墨(PANEL_DATA 垫牌)/ C区槽位两态墨 / RAP 标签 + 全站锚点组。
# 测点对一律取 UiKit 常量实时求值——代码侧换色即本闸红,禁只改注释不动值;α<1 墨先对背景混成再算。
# 运行:Godot_console.exe --headless --path . res://smoke/ui_contrast_probe.tscn
extends Node
+2 -2
View File
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 棋盘 Node2D 迁移批 Phase A 2026-09-23:push_input 端到端输入探针(ADR-0003 登记项转义务、
# push_input 端到端输入探针(ADR-0003 登记项转义务、
# ADR-0006 Risks 缓解面)。现役探针全走 BoardView.click_cell 直调(合成鼠标事件零命中已实证)——
# 本探针是真实输入路径的唯一自动化覆盖:鼠标事件 → 壳层 _gui_input → 板级公式换算(_cell_at)→
# 悬停/点选/chord 既有出口 → 组合根信号。四 case:①悬停可挖域(金框+十字光标)②悬停禁入
@@ -7,7 +7,7 @@
# 到达组合根+核心旗态)⑤双击 chord(禁入格双左击,核心拒挖零副作用)⑥左键挖(dig 到达组合根+核心揭格)
# ⑦英雄精灵世界落位(棋盘小人贴图批回归闸——SubViewport 世界坐标判据,素材缺位树跳过)
# ⑧影子构成与贴脚 ⑨右移朝向+到位回站帧+缩放档 ⑩变格边长即时重排 ⑪贴图缺位回退字形
#(⑧–⑪=呈现层状态断言批 2026-09-26——Node2D 展示几何/状态面单元化,A 档方案)。
#(⑧–⑪=Node2D 展示几何/状态面单元化断言)。
# 事件路径:Viewport.push_input(ev, in_local_coords=true)——落点用 BoardView.cell_center_local
# (与 _cell_at 同一公式族)换算画布坐标,SubViewportContainer mouse_filter=IGNORE 不拦截。
# 运行:Godot_console.exe --headless --path . res://smoke/ui_input_probe.tscn
+4 -4
View File
@@ -1,11 +1,11 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-13(四区布局诊断探针——"内容未满幅/棋盘底裁切"回归定位:打印窗口/视口/四区实际矩形
# 与最小尺寸、展开旗标,对照 battle.md §Layout 1280×800 基座规格)
# 迭代 19 卡① T5(2026-10-08):零断言诊断件补最小布局断言转断言件——1280/1920 两档:
# 断言件(1280/1920 两档):
# ①基座 1280×800(battle.md §Layout)②顶层三区(B=stage/C=info_panel/D=board_zone)互不重叠不越视口
# ③board_view(=board_zone 子节点别名)不越视口且含于 D 区 ④1920 档钉分辨率案甲契约(迭代 9 案甲——
# stretch=canvas_items/aspect=keep 下逻辑视口与四区矩形恒定=构图与基准档一致);退出码/PASS-FAIL 语义
# 具备闸可接形态(闸归属归卡③裁点②候裁,本批不入闸)。原诊断打印面全保留。
# ③board_view(=board_zone 子节点别名)不越视口且含于 D 区 ④1920 档钉分辨率契约
# (stretch=canvas_items/aspect=keep 下逻辑视口与四区矩形恒定=构图与基准档一致);退出码/PASS-FAIL 语义
# 具备闸可接形态。原诊断打印面全保留。
# 运行:Godot_console.exe --headless --path . res://smoke/ui_layout_probe.tscn
extends Node
+3 -3
View File
@@ -1,9 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 实现 GDD:design/ux/battle.md(场景级 headless 探针——四区布局实例化断言;entry 17②③)。
# Date: 2026-09-12(战斗屏改造批扩展;基础 = 2026-09-11 首战棋盘探针——既有断言全保留)
# Date: 2026-09-12
# 项目运行模式(autoload 在位)实例化 main.tscn,直接驱动 _start_adventure_from_menu()(完整冒险——唯一试玩入口),
# 断言真实构建(棋盘/主角站桩/敌方站桩/AP 点阵/明细带/数据框;A 区进度条断言随 停点前移批 2026-09-23 退役;
# E 区道具面板已删除;2026-09-20 全站桩拍板——英雄卡/敌人卡断言随站桩改造批换装)。
# 断言真实构建(棋盘/主角站桩/敌方站桩/AP 点阵/明细带/数据框;无 A 区进度条断言与 E 区道具面板;
# 英雄/敌人 = 站桩断言)。
# 运行:Godot_console.exe --headless --path . res://smoke/ui_probe.tscn
extends Node
+3 -4
View File
@@ -1,13 +1,12 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# UI 结构探针(ui-struct-probe mini-loop 2026-10-05——计划书 .zcode/plans/ui-struct-probe-miniloop-plan-2026-10-05.md T0/T1)
# 全 UI 屏结构断言一次跑完:逐屏实例化(菜单簇真驱动 + 冒险簇真流推进 + 兑付屏真实 open 面合成喂入),
# UI 结构探针:全 UI 屏结构断言一次跑完:逐屏实例化(菜单簇真驱动 + 冒险簇真流推进 + 兑付屏真实 open 面合成喂入),
# 断言族:
# ①overlap 同屏内可见未禁用按钮两两 global_rect 不相交(互压=红;层间模态盖底层系设计内——各屏采样以屏根为界天然排除)
# ②equal_width 同一直接父容器内 ≥2 可见按钮宽度差 >1px=红(容器纪律:组内等宽;钮高族
# equal_height 2026-10-06 增——同容器高度差 >1px=红,纪律=ui_kit BUTTON_MIN_H)
# equal_height——同容器高度差 >1px=红,纪律=ui_kit BUTTON_MIN_H)
# ③offscreen 可见件 global_rect 完全落在视口外=红
# ④zero_size 可见件宽或高 ≤0=红
# ⑤start 专项 标题屏左列(start_box)与右列(start_right)矩形不相交(M2 双列契约——叠放缺陷回归闸)
# ⑤start 专项 标题屏左列(start_box)与右列(start_right)矩形不相交(双列契约——叠放缺陷回归闸)
# 豁免:WL 常量表按「屏名/规则名/件名」登记合法例外(登记须注理由于行尾注释)。
# 运行:Godot_console.exe --headless --path . res://smoke/ui_struct_probe.tscn
extends Node
+5 -6
View File
@@ -1,14 +1,13 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-11(2026-09-12 code-review 修复批重写——加成应用契约改为组合根单一应用路径)
# 调试浮窗场景探针(2026-10-04 迭代 14.5 调试整合批随批改接——原数值调整板整体收进 debug_overlay;
# 2026-10-07 迭代 18 卡⑦ T4 断言面换代——P2 甲角标迁宿主 / P3 甲启动即开 / T3 当局数据只读区块 /
# T2 输入锁防护落码配套):
# Date: 2026-09-11(加成应用契约 = 组合根单一应用路径)
# 调试浮窗场景探针(原数值调整板收进 debug_overlay;
# 角标挂宿主 / 启动即开 / 当局数据只读区块 / 输入锁防护配套):
# 驱动真实 UI 路径——①启动即开(DS_DEBUG=1 默认打开,探针自设环境变量)+悬浮菜单之上+登记册末位树序
# ②滑条联动 ③应用 ④重置 ⑤批量模拟 N=10 ⑥关闭 ⑦hero 表运行期不可变
# ⑧单次加成生效(经 _start_adventure_from_menu 真实路径+显式种子钉死)+开冒险路径显式关浮窗
# ⑨对局中可开(战斗屏角标真实信号路径)+棋盘输入不锁+状态角标不置灰(T2 防护=S1+ 停机点回归闸)
# ⑨对局中可开(战斗屏角标真实信号路径)+棋盘输入不锁+状态角标不置灰(停机点回归闸)
# +对局中两钮禁用+当局数据六项值对(与只读访问器逐项一致)+只读巡检(白名单外零连接)+零动效契约
# ⑩种子三分单点断言(显式输入优先/首局恒 42/非首局空框连抽 4 次不全等 42——C1/P5 甲/P6 甲载体)
# ⑩种子三分单点断言(显式输入优先/首局恒 42/非首局空框连抽 4 次不全等 42)
# 运行:Godot_console.exe --headless --path . res://smoke/ui_tune_probe.tscn
extends Node
+3 -8
View File
@@ -1,11 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-22(数值验证工具批——判定端 tools/balance_verifier.py 的数据源,本文件零判定逻辑)
# 2026-09-23 单关直入口口径退役(用户拍板):原 level 段(直入口单关基线——满血零上下文进关,
# 与真实冒险的条件通关率脱节,曾误导曲线调参)整段移除;逐关难度读数由 adventure 段行内
# levels_cleared/stopped_at 派生(判定端 analyze_adventure_levels),零补采。
# 2026-09-23 换算率标定批:① adventure 段增 inject 注入档(永久强化 flat OFAT——标定换算率表的
# 边际读数:每档与白板同种子流配对,逐关条件通关率差 = 该档的带平移量实测);
# ② campaign 段增 armor_first 花费序 + 行带 spend 标签(多轨迹合并采集按序分组)。
# Date: 2026-09-22(判定端 tools/balance_verifier.py 的数据源,本文件零判定逻辑)
# 两段一次采集,stdout 以「VJSON 」前缀行出机器读 JSON(其余行为人读进度/摘要):
# adventure 段 全冒险连探基线(run_adventure 零永久强化)× 双画像 × na——止步分布、败退节点
# (摘要 defeat 明细 + 末场战斗敌方名)与逐关条件通关率派生源;inject 档行带
@@ -16,7 +10,8 @@
# 运行:Godot_console.exe --headless --path . --script res://smoke/verifier_batch.gd -- [k=v ...]
# na=40(基线冒险局数) k=40(战役局数) seed0=8000
# only=adventure,campaign(缺省全段) spend=hp_first|atk_first|armor_first(锻造花费优先序)
# inject=max_hp:3,atk:1(冒险段 flat 注入档——三键 {max_hp, atk, armor_class},缺省全零白板)
# inject=max_hp:3,atk:1(冒险段 flat 注入档——三键 {max_hp, atk, armor_class},缺省全零白板;
# 换算率标定用:每档与白板同种子流配对,逐关条件通关率差 = 该档的带平移量实测)
# 种子纪律:unique 逐局独立(掷点测量修复批 A 案——seed0 + 全局游标,每掷点恰消费一次)。
# 同 seed0 跨档复用 = 配对读数(同序种子流——分析侧按种子配对消方差)。
# 日志合规:全段共享 playtest_logger 会话(与真人试玩同日志),分析工具可直接消费。
+1 -1
View File
@@ -1,7 +1,7 @@
# tests/run_all.gd — 单元测试统一入口(ADR-0004 双载体的逻辑测试调用点,套件 manifest 协议 D2 AC-2b)
# 用法:godot --headless --path game --script res://tests/run_all.gd (CI 侧包装外部超时:timeout 120s …)
# 协议:套件清单逐条"套件 → 期望退出码";致命类独立进程(expect=1)。
# 执行形态(单元测试与契约层批 2026-09-28):逐套件起独立 Godot 子进程实跑
# 执行形态:逐套件起独立 Godot 子进程实跑
#(OS.get_executable_path() 解析本引擎二进制——--script 模式无 autoload/全局标识符,
# 每个测试文件自带显式实例化夹具,见 tests/README 协议要点)。
# 场景探针(.tscn 载体)由 CI/轻闸单独步骤调用,不经本入口。
@@ -2,7 +2,7 @@
# 运行:godot --headless --path game --script res://tests/unit/battle_settlement/damage_controller_test.gd
# 覆盖:hero_attack / enemy_skill / board_typed / board_blast / board_flat_hero 五配方 +
# 结账时机双模式(A 即结 / B 攒批 flush)+ 死亡作废(来源敌死/主角倒下 halt)+ requires 前置门 +
# 池乘区收口(clamped_pool:池内加算→clamp;ac 型不入池)+ AC 合流(override/表值兜底/状态叠层)+
# 池乘区 clamped_pool(池内加算→clamp;ac 型不入池)+ AC 合流(override/表值兜底/状态叠层)+
# 行协议公共字段(architecture.md API Boundaries B1→D1)+ 同种子逐位复现。
# 红线:期望值由表读值推导(零玩法数值字面量);零自建 RNG(RngService 统一流,夹具种子仅求复现)。
# 断言口径:归因等式在「无敌人死亡」时严格成立;有死亡时降为下界(超额伤害溢出属合法语义)。
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 冒险断点续玩类单测(迭代 8 卡①/T9——断点写读往返、续玩确定性、续玩幂等、退出清断点)。
# 冒险断点续玩类单测(断点写读往返、续玩确定性、续玩幂等、退出清断点)。
# 核心断言 = 续玩确定性:断点快照(主种子+取数计数器)回填后,同种子续玩所开棋盘与中断前
# 时间线逐位一致(rng.restore_adventure 契约的端到端证明);模拟/冒烟不注入 save_manager,
# 断点面整体静默(MC 对拍零扰动的结构面)。
+4 -4
View File
@@ -1,8 +1,8 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 凭证件五件+留任二件单测(迭代 20 T4——需求卡片 V9/V10 验收条目 + F-1 刷新写错账修复钉面)。
# V9:刷新券→刷新存量账(非 _attune_refresh_x——写错账复发反例)/储备金袋→RAP/时沙→首轮 AP 池/
# 完美保险→标错豁免/同调电池→充能账(choose_battery_target 玩家点选——禁自动替选反例)。
# V10:留任 2 件路由与值不变(GP 钱包/当即回血)+行动点上限归属性轴(bonus.ap 落点)。
# 凭证件五件+留任二件单测(刷新券/储备金袋/时沙/完美保险/同调电池 五件 + 留任二件——刷新写错账修复钉面)。
# 覆盖:刷新券→刷新存量账(非 _attune_refresh_x——写错账复发反例)/储备金袋→RAP/时沙→首轮 AP 池/
# 完美保险→标错豁免/同调电池→充能账(choose_battery_target 玩家点选——禁自动替选反例);
# 留任 2 件路由与值不变(GP 钱包/当即回血)+行动点上限归属性轴(bonus.ap 落点)。
# 运行:godot --headless --path game --script res://tests/unit/core/feat_vouchers_test.gd(expect 0)
extends SceneTree
+3 -3
View File
@@ -1,7 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 池结构案D 行为单测(迭代 20 T2——需求卡片 V6/V7/V8 验收条目)。
# V6 令牌三态(拿了消耗/没拿回池/只刷出不计);V7 曝光槽 2+1+子池空回退+凭证不进子池;
# V8 概率与上限解耦(改 cap 不动概率位/改概率位不动 cap/cap 满提前退役只影响候选视图)。
# 池结构行为单测。
# 覆盖:令牌三态(拿了消耗/没拿回池/只刷出不计);曝光槽 2+1+子池空回退+凭证不进子池;
# 概率与上限解耦(改 cap 不动概率位/改概率位不动 cap/cap 满提前退役只影响候选视图)。
# 运行:godot --headless --path game --script res://tests/unit/core/pool_case_d_test.gd(expect 0)
extends SceneTree
+2 -2
View File
@@ -1,6 +1,6 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 结算五段 Segment 单测(迭代 27 T2——需求卡片 V4 验收条目:Segment 类直接 new() + 编排器段序
# 接线 + 真实一轮结算走段序出裁定/行)。段体逐位一致性由 parity_anchor 三变体对拍承载(V1 核心),
# 结算五段 Segment 单测(Segment 类直接 new() + 编排器段序
# 接线 + 真实一轮结算走段序出裁定/行)。段体逐位一致性由 parity_anchor 三变体对拍承载,
# 本测兜段类可独立实例化与编排器装配面。
# 运行:godot --headless --path game --script res://tests/unit/core/settle_segments_test.gd(expect 0)
extends SceneTree
+1 -1
View File
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 秘宝 TreasureItems 类单测(迭代 7 T7——结构冻结断言面;设计权威 秘宝.md + registry treasure_items)。
# 秘宝 TreasureItems 类单测(结构冻结断言面;设计权威 秘宝.md + registry treasure_items)。
# 覆盖:授予归因 / Used 不可逆 / 真视恒可用 / 预读点击级零信息拒绝 / 3×3 边缘窗口∩板 /
# 叠加层三清(retire_overlays 不动库存)/ 关卡末 reset / 零随机(同操作序列重放两遍投影逐位)。
# 运行:godot --headless --path game --script res://tests/unit/core/treasure_items_test.gd(expect 0)
@@ -1,9 +1,7 @@
# tests/unit/core/tree_requires_level_test.gd — R1 机制位:requires_level 等级阈值前置
# (2026-10-13 用户推翻迭代 21 追认单 #1 裁撤案随批重立——卡片 v1.7 留任案形态落地:
# schema requires_level Dictionary{node_id: n} + validate 悬空/阈值 <1/类型错即拒 +
# (schema requires_level Dictionary{node_id: n} + validate 悬空/阈值 <1/类型错即拒 +
# tree_can_buy 等级阈值判定 + 行板 gate_text 门槛文案投影。
# 现役 meta_tree.tres 12 行零配置=机制位空转,判定面经本夹具直构行承载——
# 承接卡片 V2 括注「若 R1 留任阈值形态→恢复『指定节点累计等级达标前不可购』断言」。)
# 现役 meta_tree.tres 12 行零配置=机制位空转,判定面经本夹具直构行承载。)
# 载体:run_all 单元套件(显式实例化夹具——--script 模式无 autoload)。
extends SceneTree
@@ -1,5 +1,5 @@
# tests/unit/data_config/config_db_fatal_oob_test.gd — 致命类用例(独立进程,期望退出码 1)
# 进度坐标低于合法域(关卡序号 <1)触发 ConfigDB fail-fast(运行期数据致命——2026-09-18 用户拍板)。
# 进度坐标低于合法域(关卡序号 <1)触发 ConfigDB fail-fast(运行期数据致命)。
# 运行:godot --headless --path game --script res://tests/unit/data_config/config_db_fatal_oob_test.gd
# 退出码协议:1 = fatal 通道正确触发(预期);2 = fatal 未触发(回归信号,与 1 区分便于诊断)。
# 时序注:_fatal 的 quit 通道依赖 Engine.get_main_loop() 已注册主循环——--script 的 _init 期未注册,
@@ -1,6 +1,6 @@
# tests/unit/data_config/forge_table_test.gd — 锻造工坊配置表单测(迭代 23 T1)
# 覆盖(需求卡片 §7.2):V1 六路线 schema 零违例(id 唯一/类型轴枚举/值域——出域行逐类构造各一行全部被拒)
# + V11 满级特效留空(行字段闭集=无特效参数位 + 效果类型闭集 24 种零新增)+ 几何价格梯 20/30/45/67/101。
# tests/unit/data_config/forge_table_test.gd — 锻造工坊配置表单测
# 覆盖:六路线 schema 零违例(id 唯一/类型轴枚举/值域——出域行逐类构造各一行全部被拒)
# + 满级特效留空(行字段闭集=无特效参数位 + 效果类型闭集 24 种零新增)+ 几何价格梯 20/30/45/67/101。
# 运行:godot --headless --path game --script res://tests/unit/data_config/forge_table_test.gd(expect 0)
# 协议(ADR-0004 + tests/README):extends SceneTree + quit(code);负向用例资源直构不碰生产表(enemy_table 先例)。
extends SceneTree
@@ -1,6 +1,6 @@
# 致命类用例(独立进程,期望退出码 1)
# reward_dangling_treasure——RewardTable aux 投放行双表校验(迭代 7 T1):aux 行 effect_id 引用 retired
# 道具(loot_compass——2026-09-29 拍板①乙退役)时,config_db 跨表校验必须报 reward_dangling_treasure、
# reward_dangling_treasure——RewardTable aux 投放行双表校验:aux 行 effect_id 引用 retired
# 道具(夹具用 loot_compass)时,config_db 跨表校验必须报 reward_dangling_treasure、
# load_tables 整体拒绝(退役件/失义件不得出现在掉落投放面)。
# 运行:godot --headless --path game --script res://tests/unit/data_config/reward_dangling_treasure_test.gd
# 退出码协议:1 = 校验正确拒绝(预期);2 = 违规表被放行(回归信号)。
@@ -1,8 +1,7 @@
# 致命类用例(独立进程,期望退出码 1)
# treasure_target_violation——真视窄域护栏(秘宝 GDD 结构冻结,迭代 7 T1):真视类行 target
# treasure_target_violation——真视窄域护栏(秘宝 GDD 结构冻结):真视类行 target
# 越域至 board_wide 时,TreasureItemTable.validate 必须报 load_bearing 错、load_tables 整体拒绝。
# 迭代 22 T1:注入主语换代 sky_eye(新目录真视行 reveal_tiles——旧 nest_pendulum 行随 12 行换代退役;
# 护栏本体扩面=mine_reveal/reveal_tiles 两 kind 同守 REVEAL_KINDS)。
# 注入主语 = sky_eye(真视行 reveal_tiles);护栏本体 = mine_reveal/reveal_tiles 两 kind 同守 REVEAL_KINDS。
# 运行:godot --headless --path game --script res://tests/unit/data_config/treasure_target_violation_test.gd
# 退出码协议:1 = 校验正确拒绝(预期);2 = 违规表被放行(回归信号)。
# 时序注:纯加载期校验——不触运行期 fatal 通道,断言 load_tables 返回 false + 诊断在案即 quit(1)。
@@ -1,7 +1,7 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 模态编排纯逻辑类单测(迭代 27 T4——需求卡片 V6 验收条目:ModalFlow 直接 new() 进 run_all;
# 互斥域谓词/三例外输入锁/演播后排窗挂起/演播完边沿派发/遮挡记账——原组合根注释纪律面的
# 结构化单测缝首次落地)。载体零场景零树——纯 RefCounted + 哑 Control。
# 模态编排纯逻辑类单测(ModalFlow 直接 new() 进 run_all;
# 互斥域谓词/三例外输入锁/演播后排窗挂起/演播完边沿派发/遮挡记账)。
# 载体零场景零树——纯 RefCounted + 哑 Control。
# 运行:godot --headless --path game --script res://tests/unit/presentation/modal_flow_test.gd(expect 0)
extends SceneTree
@@ -1,5 +1,5 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# 轮间结算节奏化断言批(迭代 8 卡⑦ AC⑤/T9——逻辑先行断言面):
# 轮间结算节奏化断言(逻辑先行断言面):
# ① 演出队列排空前后核心逻辑状态逐位一致(演出关停不产生分叉——排播队列零核心触碰的结构证明);
# ② 零丢行:step_row 信号总数 = 明细带实收行数(排播/排空两路都不吞行);
# ③ 段间延迟取数面双态(常态 >0 / 减动效 =0 归零不跳过——pace_delay_for 直读)。
@@ -1,6 +1,6 @@
# tests/unit/presentation/ui_font_asset_test.gd — CJK 随包字体资产契约测试(T3 字体卡)
# tests/unit/presentation/ui_font_asset_test.gd — CJK 随包字体资产契约测试
# 运行:godot --headless --path game --script res://tests/unit/presentation/ui_font_asset_test.gd
# 契约源:2026-09-27 用户拍板 Fusion Pixel OFL(CJK 覆盖+授权干净)+ battle.md C6 headless 判据
# 契约源:Fusion Pixel OFL(CJK 覆盖+授权干净)+ battle.md C6 headless 判据
#(注入字体非空 + 中文字形 has_char + 采样文本宽度 > 0——实际光栅观感归真人目检)。
# 路径常量从 UiKit 单点读取(字体路径改动 = 断言随动,禁测试侧复制字面量路径)。
# 前置:fresh checkout 需先 --editor --quit 刷导入缓存(.ttf 经导入管线成 FontFile——全素材同纪律)。
+3 -3
View File
@@ -1,6 +1,6 @@
# tests/unit/test_kit.gd — 单元测试协议样板单点(T6 样板收口批 2026-10-02)
# 收口范围:11 份套件的 _check/_problems 样板(计数器 + PASS/FAIL 行 + 汇总退出)+
# reward_dangling_treasure/treasure_target_violation 两致命类用例各自复制的 BAD 表目录夹具。
# tests/unit/test_kit.gd — 单元测试协议样板单点
# 覆盖:各套件 _check/_problems 样板(计数器 + PASS/FAIL 行 + 汇总退出)+
# 致命类用例 BAD 表目录夹具。
# 用法(--script 模式无 autoload/全局标识符——禁 class_name 裸引用,使用方 preload):
# const Kit := preload("res://tests/unit/test_kit.gd")
# Kit.check("断言描述", cond) # 计数 + 即时 PASS/FAIL 行