diff --git a/game/core/action_economy.gd b/game/core/action_economy.gd index a9ca8e0f..eef01f4e 100644 --- a/game/core/action_economy.gd +++ b/game/core/action_economy.gd @@ -1,9 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 行动经济:被动账本(AP 硬重置 / 统一价目 / 三路径结束仲裁 cleared > stopped > ap_exhausted / -# RAP 池战斗域 / 双发射源之 stopped 直发)。相位域 = {Idle, Active, Waiting}。 -# 实现 GDD:design/gdd/systems/排雷循环/行动经济.md(系统 ID A3·行动经济——registry 追溯锚,命名规范见 CLAUDE.md) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 行动经济被动账本:AP 统一价目扣费、轮末三路径仲裁(cleared > stopped > ap_exhausted)与战斗域 RAP 池(垂直切片验证:一场完整战斗逐行归因)。 +## 相位/AP/RAP 只读经 getter,写入只经 request_*/notify_*/try_spend 通道——相位守卫拒绝零副作用。 +## 相位词表 "Idle"/"Active"/"Waiting" 是 presentation_snapshot 外部契约,禁改拼写。 +## round_end 双发射源:stopped 路径由本类 round_end_stopped 直发,棋盘路径由编排器组包 round_end_board——订阅方两源并听。 class_name ActionEconomy extends RefCounted diff --git a/game/core/adventure_runner.gd b/game/core/adventure_runner.gd index 6c50a878..63df85d1 100644 --- a/game/core/adventure_runner.gd +++ b/game/core/adventure_runner.gd @@ -1,40 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 三关连探冒险(地精洞窟 → 幽暗地域 → 灰矮人矿城)能否以一条命走完—— -# 主种子恰一次注入、生命/GP/加算区跨关同账、大奖励非末关恰兑付一次、三结局摘要五件事成立(P0) -# Date: 2026-09-21(冒险结构实现批——设计权威 design/gdd/systems/冒险循环/冒险结构.md) -# 冒险结构编排器(Core 层零 UI 依赖——headless 可跑完整冒险):一局的关卡序列、生命账本、GP 冒险 -# 账本、统一冒险加算区、关卡大奖励、三结局结算与主种子接线的唯一所有者。 -# -# 接口契约四件套落点(冒险结构.md「与关卡节点地图的边界」——本类是正式侧承载): -# ① 开始关卡 = start_level_external(载荷 = 关卡序号 + 当前生命 + 生效上限——生命经共享账本交接); -# ② 战斗结果上报 = runner 经共享账本属性直写(LevelRunner._on_battle_finished 回写 hero_hp 到 -# _ledger——零直调战斗域,战后生命终值随账本回流本类); -# ③ 治疗封顶回报 = apply_rest(恢复点节点兑付时 LevelRunner 经 _rest_handler 回调——按比例回血并 -# 封顶的执行归本类); -# ④ 关卡结束 = _on_level_finished(LevelRunner.level_finished 到达——结果 + 生命终值 + 节点位置)。 -# -# 职责切分:主种子注入恰一次归本类(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" 的关卡结束宣布与放弃请求一律拒绝并留诊断, -# 账本与摘要零变化。 -# 入口选路停点:每关开始 = 选路停点——_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 为空) -# ——受理语义与选路停点一致。 -# 纪律:S6——连 runner 信号一律 _forward_* 方法 Callable(禁 lambda 捕获 self 成环); -# Core 层禁 UI 引用;数值零字面量——level_clear_hp_bonus / keystone_per_level 只读 db.adventure, -# 基础上限只读 db.hero。 -# 断点续玩:save_manager 经 set_save_manager 注入(缺省 null = 不写断点——模拟/ -# 冒烟零触达零扰动);停点快照挂 choices_presented 转发点(选路停点=唯一可恢复停点形态,战斗中 -# 不存);三结局 _settle 清断点;resume_adventure 经 rng.restore_adventure 回填「主种子+计数器」 -# ——续玩从断点号位精确续接原随机时间线。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 冒险结构编排器:三关序列、生命/GP 账本、三选一停点与三结局结算唯一所有者,headless 可跑完整冒险(垂直切片验证:一条命走完三关)。 +## Core 层禁 UI 引用;数值零字面量只读 db;core↔core 连信号一律方法 Callable,禁 lambda 捕获 self(RefCounted 成环)。 +## 主种子恰一次注入归本类(LevelRunner 不重播种);set_save_manager 缺省 null = 断点面整体静默(模拟/冒烟零扰动)。 +## 呈现层须在 level_started 后重取 runner()(每关新建实例)——先重取再开选路口,否则被空防御丢弃。 class_name AdventureRunner extends RefCounted diff --git a/game/core/attunement.gd b/game/core/attunement.gd index f4aed4d2..b282c727 100644 --- a/game/core/attunement.gd +++ b/game/core/attunement.gd @@ -1,7 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 同调位求值服务(槽位数量=树上同调位节点点亮数;无谓词表判定链—— -# attunement_growth.tres 与表访问器不存在;boss_kill_count/clear_count 计数域保留——各有非槽位硬消费)。 -# 纯函数零副作用;attune=off 纪律:零 await、零 RNG、零写副作用。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 同调位求值服务:槽位数与装配参数的纯函数读数面(垂直切片验证:营地装配同调件在战斗内生效)。 +## 零 await、零 RNG、零写副作用——静态纯函数同输入恒同输出,呈现期可安全重复求值。 class_name Attunement extends RefCounted diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index 747b33e4..3a4397a6 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -1,26 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 战斗结算编排中枢:轮次生命周期唯一 owner · 五段结算(授予→增益/减益→战斗→衰减→判定)· -# 授予段极性路由(「动作 × 格型」矩阵:开安全格/标中旗 -# = 正向,开雷格/标错旗 = 负向;结算队列 + 抵消过滤——标旗后被撤旗以轮末在场旗为基线不判)· -# 10 类行协议可回放步骤流(零 await;随机消费三处皆封闭流——开战遭遇骰〔初始化随机〕+ 技能摇号 -# behavior_roll〔回合内、开轮时点、步骤流之外〕+ 护甲等级掷点〔回合内、 -# 步骤流之内〕;同种子同输入逐位复现)· 高光双落(完美排雷 ×2 / 标中旗 highlight)· -# Waiting 相位结算触发(不依赖事件到达序)。 -# GP 型兑付:授予段极性路由含 GP(effect_id gp_gain/gp_loss → 战斗内缓冲 escrow 记账,不入钱包 -# 不入增益容器);战斗结束分支掷 gp_drop 封闭流(每战斗末恰一 scope)出 -# gp_dropped = 掷定 + level_gp_bonus + escrow 随 battle_finished 上抛——战斗域零 GP 状态持久。 -# 伤害管线:伤害兑付全部收口 DamageController 单点管线——本类六调用点(主角先手/敌方伤害技/ -# 棋盘克制直伤/群伤/反噬/地形变异)为开单点(流程决定何时开单给谁开单;单据怎么算归控制器)。 -# 结账时机开关在控制器 policy:IMMEDIATE(开单即结)/ SEGMENT(攒批到段界 flush:战斗段尾统一兑现)。 -# 地图伤害殿后:授予段不当场兑付任何伤害——全部伤害形态单据经 _submit 暂存闸入 _deferred_board -# (保授予段事件序),战斗段「主角先手→逐敌还手」后补提交统一结账;主角死于敌方还手 → 暂存单 -# 整体不兑,逐单留「未生效(主角已倒下)」行(forfeit=hero_down); -# 死亡事件 = 单位容器 unit_died(单位自行宣布)→ 控制器作废该敌未结单据〔死亡即不动手〕/ 主角死终止兑付。 -# 切片登记:① 事件总线载体 = 直连信号(已定)② Waiting 相位无刷新通道 -# (仅 Active 挖掘期受理)③ 效果行协议 = 授予段逐 grant 行 + 增益/减益段续存实例组合行。 -# 实现 GDD:design/gdd/systems/战斗循环/战斗结算.md(registry 追溯锚) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗结算编排中枢:轮次生命周期唯一 owner,五段结算(授予→增益/减益→战斗→衰减→判定)与明细行协议发射(垂直切片验证:一场完整战斗逐行归因)。 +## 零 await;随机只经 rng 封闭流(encounter/behavior_roll/armor_roll/gp_drop)——同种子同输入逐位复现。 +## 呈现层读取唯一出口 = presentation_snapshot()/diagnostic_snapshot(),禁链式穿透内部协作对象。 +## 伤害只向 DamageController 开单(何时开单归编排、怎么算归控制器);刷新唯一通道 player_request_refresh,禁 RAP 满自动刷。 class_name BattleOrchestrator extends RefCounted diff --git a/game/core/board_data.gd b/game/core/board_data.gd index 7ca6da01..2cf0f1b4 100644 --- a/game/core/board_data.gd +++ b/game/core/board_data.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 棋盘产物数据契约(排雷玩法消费;生成后不可变——排雷玩法持快照即持活引用,生成器不再触碰)。 -# 实现 GDD:design/gdd/systems/排雷循环/棋盘生成.md(系统 ID A1·棋盘生成——registry 追溯锚,命名规范见 CLAUDE.md) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 棋盘产物数据契约:生成器产出、排雷玩法消费的格子事实集(垂直切片验证:战斗内棋盘事实逐行归因)。 +## 生成后不可变——消费方持引用只读,禁原地改写;跨类「棋盘事实不可变」约定由本不可变性承载。 class_name BoardData extends RefCounted diff --git a/game/core/board_generator.gd b/game/core/board_generator.gd index 4fb150aa..229fca04 100644 --- a/game/core/board_generator.gd +++ b/game/core/board_generator.gd @@ -1,10 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 确定性棋盘生成器:五阶段管线(参数→布雷→变异布置→生成-验证→产出)+ F1 可推理率度量 -# (single_subset 求解器)+ F5 验收算子(达标即出/接受最优/接受最不坏)。 -# 切片裁剪登记:黄金向量回归套件与 F4 批量工具不做(难度曲线与Boss 调参期工具域)。 -# 实现 GDD:design/gdd/systems/排雷循环/棋盘生成.md(系统 ID A1·棋盘生成——registry 追溯锚,命名规范见 CLAUDE.md) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 确定性棋盘生成器:生成-验证循环出图,不达标走接受最优/最不坏诚实降级(垂直切片验证:每张图可推理可归因)。 +## 只消费传入的单条 rng 流(重试共用,attempt 边界非 scope 事件)——同流同参逐位复现。 +## generate/legality 的 db 参数鸭子型(不标类型)——冒烟测量面注入桩表依赖此形态,勿收紧签名。 class_name BoardGenerator extends RefCounted diff --git a/game/core/config_db.gd b/game/core/config_db.gd index d80d672f..5cffb1b3 100644 --- a/game/core/config_db.gd +++ b/game/core/config_db.gd @@ -1,9 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# ConfigDB autoload(数据配置)——数值表单点访问入口(Rule 2)+ 校验双通道(Rule 6)+ R1 行解析。 -# 实现 GDD:design/gdd/systems/表现与支撑/数据配置.md(系统 ID D2·数据配置——registry 追溯锚,命名规范见 CLAUDE.md) -# 切片注:headless --script 模式下由冒烟脚本显式实例化(数据配置 AC 前言);玩法代码禁止绕过本单点自建 load()。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 数值表单点访问入口:全部 .tres 表的加载、校验诊断与类型化访问器(垂直切片验证:改表即改玩法,数值零硬编码)。 +## 玩法代码禁止绕过本单点自建 load();消费面一律走访问器,禁直读行集。 +## headless --script 模式无 autoload——冒烟脚本显式实例化本类;加载失败 is_ready=false 加 fatal 旗,调用方须查。 class_name ConfigDb extends Node diff --git a/game/core/config_db_cross_validator.gd b/game/core/config_db_cross_validator.gd index f4c9ff25..5401e880 100644 --- a/game/core/config_db_cross_validator.gd +++ b/game/core/config_db_cross_validator.gd @@ -1,13 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 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)—— -# 本类零 ConfigDb 依赖(无状态纯校验器,装载序上先于成员赋值执行的前提保持)。 -# 迁移注记:validate_skill_pool_links 的 status_table 显式入参纪律照抄(装载通道传 loaded 表, -# 冒烟直验传门面 status_effects;null 时 side 守卫跳过)——返回错误列表不进诊断通道,消费面归调用方。 -# 实现 GDD:design/gdd/systems/表现与支撑/数据配置.md(系统 ID D2·数据配置——registry 追溯锚) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 跨表校验器:悬空引用/池护栏/节点精确行/技能池构成——行级错误经注入的 push_diag Callable 外发(垂直切片验证:坏表加载期即拦)。 +## 无状态零 ConfigDb 依赖,传入 loaded 表集即可独立运行;返回错误列表不进诊断通道,消费归调用方。 class_name ConfigDbCrossValidator extends RefCounted diff --git a/game/core/config_db_resolver.gd b/game/core/config_db_resolver.gd index b1c9911f..14ec829b 100644 --- a/game/core/config_db_resolver.gd +++ b/game/core/config_db_resolver.gd @@ -1,13 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-10-02(code-quality 修复批 T5——ConfigDb 拆分:R1 难度行解析协作类,自 config_db.gd 迁出) -# 职责单一化(R1 解析域):resolve_board_gen / resolve_enemy_rowset / resolve_difficulty_modifiers -# 及其私有算术(_resolve_progress / _ceil_key)与 R1 专属的告警去重注册表。ConfigDb autoload 门面 -# 保持——全部消费方(战斗结算/敌人系统/棋盘生成/呈现层/冒烟)经门面同名方法取数,公有签名零变化。 -# 诊断通道归门面:push_diag / _fatal 经 _db 引用回呼(协作类同仓内部通道——不另设公共出口, -# 行为与拆分前逐位一致,含越域 Fatal 退出语义)。 -# 迁移注记:_warn_dedup 去重注册表随解析逻辑同迁(唯一消费方 = _resolve_progress)—— -# 门面 load_tables / reset_diagnostics 经 reset_warn_dedup() 同步清空,清空时点零变化。 -# 实现 GDD:design/gdd/systems/表现与支撑/数据配置.md(系统 ID D2·数据配置——registry 追溯锚) +## VERTICAL SLICE - NOT FOR PRODUCTION +## R1 难度行解析协作类:进度坐标 ceil 取行、越域 Fatal、告警去重,由 ConfigDb 门面持有(垂直切片验证:数值缺行不静默)。 +## 非直调面——全部消费方经 ConfigDb 同名方法取数;数据面与诊断通道均经构造注入 Callable(类型环断根)。 class_name ConfigDbResolver extends RefCounted diff --git a/game/core/damage_controller.gd b/game/core/damage_controller.gd index fa45c2c1..aa686682 100644 --- a/game/core/damage_controller.gd +++ b/game/core/damage_controller.gd @@ -1,27 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-24 -# 伤害控制器:伤害单据唯一兑付管线。 -# 分工:五族伤害来源(主角攻击/敌方行动/棋盘克制直伤/棋盘群伤/反噬地形)的调用点只决定 -# 何时开单、给谁开单;本类决定一张单经过哪几步(掷点 → 折扣 → 暴击 → 克制点数 → 池乘区 → -# 落地下限 → 交付)。 -# 设计要点: -# ① 兑现时机双模式(结账时机开关):POLICY_IMMEDIATE(A——开单即结,回切位)/ POLICY_SEGMENT -# (B——开单攒批、段界统一结账;流程在授予段尾与战斗段尾调 flush)。 -# 切换=改 policy 一个值,管线/单据/数据表零改动。 -# ② 目标 = 结账时刻照 target_rule 看现场解析(front_alive_enemy = 行主序最前存活敌 / hero / -# all_alive_enemies)——开单时只写规则不冻结对象。 -# ③ 死亡事件由单位自行宣布(UnitContainer.apply_damage 归零 → unit_died 信号):怪死 = 队列中 -# 该敌为来源的未结单据作废(死亡即不动手——静默零行零 commit,同现行"不在存活序"口径); -# 主角死 = _halted 终止(flush 余单作废;Game Over 仍归战斗编排器判定段既有 hp 读数路径)。 -# 单据栏目(九栏):kind(兑付配方,唯一分派键)/ source_class+origin_cell+round_index(行协议归因三件)/ -# display(行文本基名)/ channel(战斗段|棋盘兑付——声明栏,管线步序由 kind 承载)/ -# attack_type(normal|pierce|magic|""=无类型——""恒不查克制矩阵)/ base_value(威力或攻击基线)/ -# target_rule / rider(必中附加,后置于下限不进乘区)/ context(kind 专用上下文)。 -# 可选:requires(前置单据 id——前置单 redeemed 才兑付,否则静默作废;清图完美第二份用)。 -# 行协议归属战斗编排器(emit_row 以 Callable 注入——9 类行协议与来源断言不外泄本类)。 -# RNG 纪律:掷点只在结账时刻消费 armor_roll 封闭流——A 模式提交即结=消费时点与迁移前逐位一致, -# B 模式消费次序=开单次序(同种子同操作仍逐位复现;结果数值与 A 模式可不同——兑现时机语义差异)。 -# 实现 GDD:design/gdd/systems/战斗循环/战斗结算.md(registry 追溯锚) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 伤害控制器:全部伤害的唯一兑付管线——调用点只开单,掷点/折扣/暴击/克制/池乘区/下限/交付全在本类(垂直切片验证:每笔伤害可归因)。 +## 结账时机 policy 双模式:immediate=开单即结 / segment=攒批段界 flush——切换只改 policy 值,管线与表零改动。 +## 掷点只在结账时刻消费 armor_roll 封闭流——segment 模式消费次序=开单次序,同种子同操作逐位复现。 +## 目标在结账时刻按 target_rule 现场解析,开单不冻结对象;死亡由单位自行宣布(unit_died)触发作废/终止。 class_name DamageController extends RefCounted diff --git a/game/core/damage_math.gd b/game/core/damage_math.gd index 98900283..532cd86d 100644 --- a/game/core/damage_math.gd +++ b/game/core/damage_math.gd @@ -1,9 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# 实现 GDD:design/gdd/systems/战斗循环/战斗结算.md(系统 ID B1·战斗结算——registry 追溯锚,命名规范见 CLAUDE.md) -# 战斗结算·战斗段伤害公式族(零状态纯算术宿主——规范 1.2「工具性纯函数挂明确宿主类」)。 -# 池读取与表值读取仍归 战斗结算,本类只做算术;掷点查档与吃掷点分量算术在本类 -# (判定式参数化——表值零字面量纪律不变)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗伤害公式族:零状态纯算术 static 函数(垂直切片验证:伤害公式单点可验算)。 +## 只做算术不读任何状态——池值/表值/阈值全由调用方传入(池值须先 clamp);公式内零字面量调参。 class_name DamageMath extends RefCounted diff --git a/game/core/effect_engine.gd b/game/core/effect_engine.gd index c6167374..22b0a38d 100644 --- a/game/core/effect_engine.gd +++ b/game/core/effect_engine.gd @@ -1,17 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-10-06(效果引擎框架) -# 内容数据驱动:把「内容的效果行为」从散布在结算 -# 代码里的硬编码分支搬进内容数据行三个字段——订阅哪个事件(on)/ 什么条件(when)/ 什么效果(do) -# ——由本解释器统一执行。加一件「已有效果类型」的新专长/新秘宝=只改 .tres 数据行,零代码。 -# 架构模型(R1 裁决):发布订阅——结算管线同步 emit 事件(无队列无异步,确定性优先)→ 本引擎遍历 -# 持有订阅集匹配 → 返回按声明序排列的效果命中(do 列表),由发射点按组合规则施加。 -# 多订阅与冲突(R3 裁决):一事件多订阅=常态;冲突在效果类型层用组合规则封死(§3.4 六族);遍历序 -# =数据表声明序(feats 表序→treasure 表序→树规则合成行,装载时定死),写死保种子复放。 -# 重建时机(v1.1 补):每战 begin_battle 从持有集/装备集重建 trigger 列表——冒险中途获得/换取的 -# 专长下一战生效,同战内不热载,确定性优先。计数器账本随重建清零(battle 域)。 -# 确定性契约:全同步调用、零 RNG、零 signal 时序依赖;同输入同命中序。 -# 护栏保留:事件/效果/事实/算子四词表封闭(本文件常量),行内出域=加载期校验致命(schema 侧), -# 运行期 dispatch 对未知事件/效果类型 fail-fast(push_error+断言)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 效果引擎:内容行 on/when/do 的发布订阅解释器——加一件「已有效果类型」的专长/秘宝只写 .tres 数据行零代码(垂直切片验证:内容数据驱动可复现)。 +## 全同步调用、零 RNG、零信号时序依赖;命中序=装载声明序(feats→treasure→树规则)写死保种子复放。 +## 事件/效果/事实/算子四词表封闭在本文件常量——新词先登记,行内出域=加载期校验致命、dispatch 未知词 fail-fast。 class_name EffectEngine extends RefCounted diff --git a/game/core/level_runner.gd b/game/core/level_runner.gd index e4c8b7de..1f3471e8 100644 --- a/game/core/level_runner.gd +++ b/game/core/level_runner.gd @@ -1,29 +1,9 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 线性第一关(战×2→道具→战×2→恢复→Boss)能否承载"数值提升→通关期望改善"的元进度验证 -# Date: 2026-09-11(2026-09-17 分支节点图批:行进器升级图版推进——单链 = 出边恰一的退化形态) -# 关卡节点地图(v1.0 图版落地——节点+连线,连线只朝前进方向,唯一入口,Boss 恒唯一终点): -# 关卡域生命周期唯一编排者——HP 跨战斗携带、恢复点节点兑付、关卡末收束。 -# 行进纪律(零自动推进):到达即兑付;兑付后确认才出现选路口——战斗胜利与奖励/恢复确认一律经 -# choices_presented 进入选路态,玩家 pick_next_node 显式选下一跳。 -# 奖励点节点内容悬置为直通节点(零兑付——内容渠道未定);战斗各自持有 地图战斗资源 容器 -# (无跨战斗状态可延续)。 -# Core 层零 UI 依赖(headless 可跑完整关卡——数据配置 Rule 7)。 -# 测试专用:hero_atk_pct/hero_hp_pct 数值覆盖(调整板模拟天赋树——正式侧归元进度,切片不落盘), -# 覆盖值经 encounter 显式传入战斗——零表写,db.hero 运行期只读。 -# 对应 GDD:关卡节点地图 v1.0(图版结构——本文件为 P1 批实现位;命名规范见 CLAUDE.md) -# 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 冒险收束清零同步归冒险结构(本类冒险模式不关钱包)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 关卡域生命周期编排者:节点图行进、HP 跨战斗携带、商店房与恢复点兑付、关卡末收束(垂直切片验证:一关内数值提升可感知)。 +## Core 层零 UI 依赖(headless 可跑完整关卡);零自动推进——兑付确认后经 choices_presented,推进只走 pick_next_node。 +## 种子域:单关模式 start_level 自播种;冒险模式 start_level_external 不重播种(主种子恰一次归 AdventureRunner)。 +## hero_atk_pct/hero_hp_pct 为测试专用覆盖——经 encounter 显式传入战斗,零表写,db.hero 运行期只读。 +## 信号顺序契约:呈现层须在 level_started 回调重取 runner 实例,choices_presented 才不会被空防御丢弃。 class_name LevelRunner extends RefCounted diff --git a/game/core/meta_progression.gd b/game/core/meta_progression.gd index 8c576c01..4911f4ff 100644 --- a/game/core/meta_progression.gd +++ b/game/core/meta_progression.gd @@ -1,19 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 钥石能否在营地换成永久强化并在下一局开局生效——冒险收束入账(大奖励 + Boss -# 首杀/重复杀两档)、营地消费、注入计算的跨局账本能否在零 UI 下独立成立(元进度 GDD 验收标准) -# Date: 2026-09-21(元进度实现批——设计权威 design/gdd/systems/冒险循环/元进度.md 定稿 v1.2) -# 元进度账本服务(Core 层零 UI、纯被动服务——同 StatusContainer 先例:零信号零外发,读存档算账)。 -# 职责三件:① 属性锻造定价与购买(几何递增——tier 级价格 = 迭代 floor(p × ratio/100),tier 0 = -# base_price,floor 单一取整对齐 round_direction 纪律);② 道具工坊解锁(渠道由 meta.tres channel -# 字段声明、判定量换算单点 _workshop_progress——可替换轴;现行 = 总通关次数, -# 钥石直购价后补最终双渠道;六件局内效果不入本类(只承载解锁状态); -# ③ 冒险收束入账(Boss 两档 = 表值 first_kill/repeat_kill,首杀标记读存档判first;调 SaveManager -# apply_adventure_summary 入账并附 boss_drops 副本——复盘可归因,验收 5)。 -# 注入面:hero_override() = 树生命/命中淬炼 flat + 锻造路线加值(当前选中武器/甲—— -# 全零 = 白板合法态;override 不写表——表运行期只读,消费方 AdventureRunner/LevelRunner 经冒险开始 -# 参数面显式传参)。 -# 纪律:数值零字面量——价格/档位/阈值/两档金额只读 db.meta_* 访问器;存档只经 SaveManager 访问器, -# 禁读内部结构;行集解析禁自扫表(一律走 ConfigDB 访问器)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 元进度账本服务:钥石收束入账、营地消费定价与秘宝解锁判定的纯被动服务,零信号零外发(垂直切片验证:钥石跨局换成永久强化)。 +## 数值零字面量——价格/档位/阈值只读 db 访问器;存档只经 SaveManager 访问器禁读内部结构;行集禁自扫表。 +## hero_override() 现算不写表(全零=白板合法态)——生效注入只走冒险开始参数面显式传参。 class_name MetaProgressionCore extends Node diff --git a/game/core/minesweeper_rules.gd b/game/core/minesweeper_rules.gd index 60cca37d..234b0b6a 100644 --- a/game/core/minesweeper_rules.gd +++ b/game/core/minesweeper_rules.gd @@ -1,11 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 排雷玩法规则引擎:零随机/零表读取/零 UI——输入 = 棋盘生成 产物 + 意图序列,输出 = 三事件流。 -# 核心契约:install 四不变式 · 初始展开 = R₀ 恰等 · 连锁不越旗 · 批次语义序仲裁(cleared > stop > 其余)。 -# 旗语义:旗 = 一次性承诺——挖旗格放行(本格旗事务内 -# 隐式退役、轮末不判);无拔旗动作(flag_pull 已出目录)。 -# 实现 GDD:design/gdd/systems/排雷循环/排雷玩法.md(系统 ID A2·排雷玩法——registry 追溯锚,命名规范见 CLAUDE.md) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 排雷规则引擎:棋盘产物+玩家意图批次 → 揭示/旗判定/轮末事件流,install 四不变式守门(垂直切片验证:挖掘逐行归因)。 +## 零随机、零表读取、零 UI——判定只依赖棋盘事实与动作序列。 +## 板态对外只经 current_board()/reveal_record() 等查询面,禁跨模块直读写内部字典;轮末双发射源之棋盘路径由 round_end_board 外发。 class_name MinesweeperRules extends RefCounted diff --git a/game/core/reward_economy.gd b/game/core/reward_economy.gd index 5e9c0865..253294ff 100644 --- a/game/core/reward_economy.gd +++ b/game/core/reward_economy.gd @@ -1,14 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 每个非封锁格是否都携带可兑的格面资源身份,且同种子同操作逐位回放 -# Date: 2026-09-10(2026-09-15 格面资源批结构性重写:库存/供给轴下线,格面资源身份面纯化) -# 地图战斗资源:格面资源的身份层——install 期身份预分配(roll_board 恰一次、消费 reward_roll 封闭流 -# 恰一 scope 批:格批 + 清图批尾)· 授予期零随机 · Ready 后只读、无重掷 · 换图映射消亡。 -# 安全格与雷格一视同仁(同一类型池、同一权重分布——雷安同池);封锁格不入摇号清单。 -# 极性不在资源内:「动作 × 格型」矩阵的字典定义归 GDD、路由执行归 战斗结算 授予段 -# (本类只提供 polarity_row 的(类型, 极性)→ 字典行查询面)。 -# 切片登记:取号约定 = randi_range(0, W-1)(切片内恒定); -# 区间行 power roll 取号语义:快照 power = roll 值,授予期零随机不变。 -# 实现 GDD:design/gdd/systems/战斗循环/地图战斗资源.md(registry 追溯锚) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 格面资源身份层:install 期一次性预分配每格资源身份,授予期零随机、Ready 后只读无重掷(垂直切片验证:格面资源同种子逐位回放)。 +## roll_board 每板恰一次(Ready 相位再调 = double-roll 拒绝;换图 = 合法新批);禁在本类引入授予期随机或重掷。 +## 极性路由归战斗结算授予段——本类只提供 polarity_row 的(类型, 极性)→ 字典行查询面。 class_name RewardEconomy extends RefCounted diff --git a/game/core/rng_service.gd b/game/core/rng_service.gd index c2a07d52..a0090a94 100644 --- a/game/core/rng_service.gd +++ b/game/core/rng_service.gd @@ -1,16 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# RngService autoload(数据配置)——统一随机流单点(Rule 5;2026-09-27 七流并一+全事件日志)。 -# 玩法代码禁止 randomize()/自建 RandomNumberGenerator。 -# 实现 GDD:design/gdd/systems/表现与支撑/数据配置.md(系统 ID D2·数据配置——registry 追溯锚,命名规范见 CLAUDE.md) -# 统一流口径:唯一主种子 + 唯一派生(单盐)+ 唯一全局取数计数器;open_stream 参数降格为「用途标签」—— -# 不参与派生,只进事件日志(并流前七条流名全部保留为合法标签)。号位语义(并流后果,用户裁决承接): -# 全局 scope 只回答「全局第 N 次取数」,不再回答「第 N 次某类事件」——路线依赖为已知代价,单点定位能力由事件日志承载。 -# 派生公式(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_.jsonl。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 统一随机流单点:唯一主种子+派生+全局取数计数器,全玩法取数必经 open_stream(垂直切片验证:同种子全程逐位复现)。 +## 玩法代码禁止 randomize()/自建 RandomNumberGenerator;重播种仅许全局计数器归零时(冒险中途重播种击穿同冒险无碰撞前提)。 +## open_stream 用途标签封闭词表 PURPOSE_TAGS——新用途=改代码扩签;断点续玩快照契约=主种子+counter()。 class_name RngServiceCore extends Node diff --git a/game/core/save_manager.gd b/game/core/save_manager.gd index bd8a176d..c7569f3a 100644 --- a/game/core/save_manager.gd +++ b/game/core/save_manager.gd @@ -1,48 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 关掉游戏之后玩家的东西还在吗——单档 JSON 存档的写入、读回、版本迁移与损坏 -# 兜底能否在零玩法依赖下独立成立,元进度四件(钥石余额/永久强化等级表/每关通关次数表/Boss 首杀标记位) -# 与最近冒险摘要(cap 10)能否跨进程存活(P0) -# Date: 2026-09-21(存档序列化批——设计权威 design/gdd/systems/表现与支撑/存档序列化.md) -# -# 存档技术契约承载方(Core 层零 UI、零玩法依赖——禁 preload/import 任何玩法脚本、禁碰 ConfigDB/ -# RngService,可独立实例化独立验证〔存档序列化.md 验收标准〕)。 -# -# 域清单与 owner 分工(内容 owner 定口径,本类照单承载、不替任何人定义进度): -# keystone_balance / item_unlocks / level_clear_counts / boss_first_kill -# —— 内容 owner = 元进度.md(钥石余额/道具工坊/通关次数/首杀标记;属性锻造柜台已退役 -# ——生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线,见 meta_progression.gd 注入面) -# boss_kill_count / attunement_equipped / attune_refresh_level -# —— 内容 owner = 秘宝.md(同调位账本):Boss 击杀总数〔含重复〕= -# 生涯页终身计数与迭代 22 解锁条件消费面〔槽位数量=树同调位节点点亮数〕;装配关系 = 局外进度事实(元进度域同族 -# ——非契约 2 反面清单的「局内道具库存」,后者=冒险进行中瞬态);attune_refresh_level = Y 刷新 -# 升级购买等级 -# tree_nodes / fork_sides / tree_struct —— 内容 owner = 天赋树.md(tree_nodes=node_id→已购等级;fork_sides=fork_group→激活态;tree_struct=树结构 -# 版本标记〔缺失=换代前结构→加载时树域破坏性废弃重置——开发阶段无迁移,Q3 用户裁〕) -# forge_routes —— 内容 owner = 锻造工坊.md(levels 六路线等级+unlocked 直购解锁清单 -# +weapon/armor 当前选中标记;**无特效域**(裁 6——满级特效本期不做);解锁态派生不落档: -# 初始持有〔表 initial_owned〕∨ 直购〔unlocked〕∨ 练满前一档〔levels[prereq]≥cap〕——派生单点 -# 在 MetaProgression.forge_route_unlocked;旧档缺键补齐=初始持有态,开发阶段禁迁移禁折算) -# breakpoint.attunement_charges(主动件充能余量)——每冒险重置语义的断点瞬态附随件,内容装配归 -# AdventureRunner(断点域接线),本类照单承载;契约 2 域界注记同断点域豁免先例 -# recent_summaries(冒险摘要五件事副本)—— 内容 owner = 冒险结构.md(摘要五件事口径) -# adventure_total / adventure_cleared(生涯终身计数域)—— 内容 owner = 生涯.md(跨局汇总页 -# 数据源:总局数开局即计〔三结局同经收束恰计一次,含放弃与失败〕/通关局数三关全通才计 1 -# ——判定字段 summary.cleared;写入唯一经 apply_adventure_summary) -# breakpoint(冒险断点快照——停点粒度续玩域)—— 内容 owner = 冒险结构.md(七字段拍板面 -# +恢复必需附随件:主种子/取数计数器/钥石累计/已到节点序/道具库存);契约 2 域界反面清单 -# 只约束 meta 永久进度域——断点域=冒险进行中瞬态快照,生命/GP/道具库存按拍板面入域。 -# 承载 owner = 存档序列化.md(格式/时机/迁移/损坏/域登记) -# -# 契约登记(存档序列化.md 核心规则——违反即返工): -# 契约 1 表与档分家:存档只记进度事实,禁止把数值配方写进存档(数值改版后旧档按加载时的表解释); -# 契约 2 域界干净:行动点/RAP/道具库存/生命账本/GP 不出现在存档内容里(反面清单,冒烟有断言); -# 契约 3 钥石不丢:写入/读回/迁移不得破坏元进度「钥石只增不减(消费除外)」判据—— -# tmp+rename 原子写(写一半断电不留烂档)+ 损坏兜底坏档备份; -# 契约 4 高版本拒读:version > SAVE_FORMAT_VERSION → 不加载且禁写盘(保护未来版本的档不被覆写), -# 内存以默认新档运行。 -# -# JSON 键纪律:字典键一律 String——JSON 键非字符串的坑,int 键(关卡序号)读写两侧都要 str() 换算, -# 混用必出静默 miss。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 存档唯一实现:JSON 单档写入/读回/版本迁移/损坏兜底,Core 层零 UI 零玩法依赖(垂直切片验证:进度跨进程存活)。 +## 禁 preload/import 任何玩法脚本、禁碰 ConfigDB/RngService——须可独立实例化独立验证。 +## 新增存档键先在序列化函数登记并升版本号;键域内容口径归各 GDD 文档,本类照单承载。 +## 存档键清单的事实源=本类序列化/读回代码,不在任何文档维护第二份键清单。 class_name SaveManagerCore extends Node diff --git a/game/core/skill_lottery.gd b/game/core/skill_lottery.gd index 4264fc62..5abc38af 100644 --- a/game/core/skill_lottery.gd +++ b/game/core/skill_lottery.gd @@ -1,11 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-16 -# 敌人系统·技能摇号器(proposal-skill-pool D9 封装纪律):独立服务类——输入 实例池可摇条目 + 随机子流, -# 输出 skill_id。权重份额归一:中签率 = 该技能权重 ÷ 可摇权重合计(排除谁,谁的份额按比例摊给其余技能)。 -# 不碰血量、不碰表、不碰容器——过滤与冷却状态由调用方(战斗结算换算层)注入确定值。 -# 零随机纪律:随机消费只在子流参数(behavior_roll 派生流),本类无自建随机源。 -# 实现 GDD:design/gdd/systems/战斗循环/敌人系统.md(registry 追溯锚,命名规范见 CLAUDE.md) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 敌人技能摇号器:可摇条目+随机子流 → skill_id,权重份额归一(垂直切片验证:敌方行动可归因)。 +## 不碰血量/表/容器——过滤与冷却由调用方注入确定值;随机只消费传入子流,本类零自建随机源。 class_name SkillLottery extends RefCounted diff --git a/game/core/status_container.gd b/game/core/status_container.gd index 685a50c4..5e9b8d4f 100644 --- a/game/core/status_container.gd +++ b/game/core/status_container.gd @@ -1,10 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 增益状态·统一状态容器:三向效果同构实例 · 单一时限量纲 remaining_settlements(先兑付后衰减)· -# 按行叠层(stack 授予不触碰 R)· 授予时数值快照抗热重载 · 零随机零信号。 -# 注:MVP 单敌假设经 敌人系统 回验不成立(定多敌)——enemy 侧 side-wide 语义按 registry 改写执行。 -# 实现 GDD:design/gdd/systems/战斗循环/增益状态.md(系统 ID B3·增益状态——registry 追溯锚,命名规范见 CLAUDE.md) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 增益状态统一容器:三方效果同构实例、单一时限量纲(先兑付后衰减)、按行叠层与授予时快照抗热重载(垂直切片验证:增益减益逐行归因)。 +## 零随机零信号——纯被动服务;授予唯一入口 apply_effect,满层拒绝零写入(拒收记未生效行归调用方)。 class_name StatusContainer extends RefCounted diff --git a/game/core/treasure_items.gd b/game/core/treasure_items.gd index dc619f90..cc02857c 100644 --- a/game/core/treasure_items.gd +++ b/game/core/treasure_items.gd @@ -1,19 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 道具从掉落到使用的全程零随机零特判——同操作序列重放两遍,库存与叠加层投影逐位相同(P0) -# Date: 2026-09-29(迭代 7 T2 core 骨架——秘宝内容批;设计权威 design/gdd/systems/排雷循环/秘宝.md -# + registry 秘宝条目(键 aux_items 沿用)api 8 入口/load_bearing_rules/use_orchestration) -# 秘宝 关卡域库存 + 板级叠加层(自持派生信息层)。 -# 结构冻结照抄(违反即返工): -# 零随机(零 RNG 流消费——信息只来自 排雷玩法 恒真数字/地图战斗资源 Ready 映射/行动经济 账本三既有事实源); -# 库存关卡域(跨轮跨图跨战斗延续、关卡末清空——清空编排归 战斗结算/关卡层,本类只供 clear/reset); -# 叠加层随图消亡(换图/弃图刷新/战斗结束三清——编排归 战斗结算 retire_overlays); -# Used 不可逆(consume 后保留只读——枚举序=受理序); -# 真视恒可用(零雷窗口=「这 9 格没雷」信息非空);点击级零信息不消耗(拒绝零消耗——预读窗口全已开); -# 零特判(排雷玩法 代码零本系统分支——本类不写任何其他系统状态)。 -# 负空间:无自动使用入口/无重掷/无事件订阅/无 RNG 直连/无 排雷玩法/地图战斗资源 写入口; -# 相位检查归 战斗结算 use_treasure 编排第一步(本类不管相位——validate_use 是纯谓词+投影)。 -# 呈现取数面:query_inventory(C 区槽位)/query_overlays(棋盘叠加层标记)——只读投影,零数据复制 -# (预读徽章数据源=战斗结算 query_reward_identity 既有读面,本类只记「哪些格要额外显示」)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 秘宝关卡域库存+板级叠加层:全程零随机零特判,同操作序列重放库存与叠加层投影逐位相同(垂直切片验证:道具全程确定性)。 +## Used 不可逆——consume 后保留只读,枚举序=受理序;库存关卡域跨战斗延续、关卡末清空,叠加层随图消亡(清空编排归调用方,本类只供 clear/reset/retire_overlays)。 +## 零特判纪律:本类不写任何其他系统状态,排雷玩法代码零本系统分支;相位检查归战斗编排 use_treasure——validate_use 是纯谓词零消耗。 class_name TreasureItems extends RefCounted diff --git a/game/core/unit_container.gd b/game/core/unit_container.gd index a33b4dbe..6ab6bf7e 100644 --- a/game/core/unit_container.gd +++ b/game/core/unit_container.gd @@ -1,17 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-16 -# 敌人系统·战斗单位容器:hero/enemy 统一受伤死亡接口 · 实例池状态机(设计权威=敌人系统.md 技能池节) -# · 行值快照抗热重载 · 编排被动零事件。 -# 实例池三层对象:定义层技能行(SkillTable)· 定义层池模板(EnemyTable.pool)· -# 本类持实例层——spawn 把模板快照为各实例池(冷却全零),此后冷却递减/待发动作/保底计数各自独立。 -# 零随机零事件纪律:随机消费只在 战斗结算换算层抽签器(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) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗单位容器:hero/enemy 统一受伤死亡接口与实例池状态机,行值快照抗热重载(垂直切片验证:敌方行动可归因)。 +## 零随机零事件——随机只在调用方换算层抽签消费,本类只收确定值;死亡由单位自行宣布 unit_died。 +## 英雄加成只经 spawn 显式入参(-1=表值兜底),禁直改表值再由本类读表;单位读写只经投影面与命名写口,原始数组不外露。 class_name UnitContainer extends RefCounted diff --git a/game/data/schemas/action_economy_table.gd b/game/data/schemas/action_economy_table.gd index aecf9bed..a52df7fb 100644 --- a/game/data/schemas/action_economy_table.gd +++ b/game/data/schemas/action_economy_table.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 ActionEconomyTable schema(行动经济 回填值,单行全局;Rule 4 豁免)。 -# 数值域与跨字段校验依据 design/gdd/systems/排雷循环/行动经济.md "ActionEconomyTable Schema 定稿"。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 行动经济表 schema:行动点预算旋钮单行全局类型化读取(垂直切片验证:完整战斗逐行归因)。 +## validate() 违例加载期致命(fail-fast);表运行期只读,调参只走 data/tables 表值。 class_name ActionEconomyTable extends Resource diff --git a/game/data/schemas/adventure_table.gd b/game/data/schemas/adventure_table.gd index dd930cfa..001b2f5f 100644 --- a/game/data/schemas/adventure_table.gd +++ b/game/data/schemas/adventure_table.gd @@ -1,14 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 三关连探冒险(地精洞窟 → 幽暗地域 → 灰矮人矿城)能否以一条命走完,通关兑付的 -# 部分回血与提升三选一、Boss 逐杀钥石掉落在冒险摘要里成立(P0) -# Date: 2026-09-21(冒险结构 关卡大奖励表) -# 数据配置 AdventureTable schema(冒险结构 关卡大奖励行值;单行全局,Rule 4 豁免——HeroTable/SettlementTable 先例)。 -# 大奖励 = 三层奖励框架;三选一池 = 固定配额令牌池——普通 70/稀有 25/ -# 罕见 5=100 张;洗牌不放回抽 3、选中踢池未选回池、池耗即枯竭(池消耗即上限)。 -# 档位构成:普通〔小GP 18/小增伤 18/小护甲 17/小生命 17〕+稀有〔大GP/大增伤/大护甲/大生命/恢复 各 5〕 -# +罕见〔AP 3〕——罕见档「道具件」不投放(池种已退役),配额缺省收窄。 -# 恢复件=池内种类(当即回血)。 -# 全部 knob provisional(数值所有权归 难度曲线与Boss,上调须重扫通关率带)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 冒险大奖励表(奇物三选一令牌池)schema:档位配额/件值/已拿上限的类型化读取(单行全局;垂直切片验证:三关连探一条命走完)。 +## kind/tier 词表封闭——断点附随件与牌库剔除态依赖,扩件走本表+registry 修订,禁调用侧私扩。 +## 档位配额总量是结构锚(validate 硬断言):改投放总量=重裁非调参;全部 knob provisional,上调须重扫通关率带。 class_name AdventureTable extends Resource diff --git a/game/data/schemas/board_gen_table.gd b/game/data/schemas/board_gen_table.gd index 1422adf7..fe9c0d07 100644 --- a/game/data/schemas/board_gen_table.gd +++ b/game/data/schemas/board_gen_table.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 BoardGenTable schema(棋盘生成 回填值;键 (level_index, node_depth)——首个进度键表)。 -# 依据 design/gdd/systems/排雷循环/棋盘生成.md "BoardGenTable Schema 定稿" + F2/F2b/F2c 谓词。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 棋盘生成表 schema:逐 (level_index, node_depth) 行生成参数的类型化读取(垂直切片验证:完整战斗逐行归因)。 +## validate() 违例加载期致命(fail-fast);solver_rules 结构冻结 single_subset——可解性/成本护栏随行校验强制。 class_name BoardGenTable extends Resource diff --git a/game/data/schemas/difficulty_table.gd b/game/data/schemas/difficulty_table.gd index d7055443..964eabdd 100644 --- a/game/data/schemas/difficulty_table.gd +++ b/game/data/schemas/difficulty_table.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-12 -# 数据配置 DifficultyTable schema(难度曲线与Boss GDD Core Rule 1 兑现——敌人系统 Rule 10 "接口未定 provisional" 的建表兑现,走 数据配置 接口漂移规则)。 -# 全局修饰结构位:按 (L,D) 精确匹配施加乘数于 EnemyTable 行值(敌人系统.spawn 实例化时、行值快照前)。 -# MVP 空表(零行为——AC-10);首个使用场景 = 精英节点(关卡节点地图 定稿联动,难度曲线与Boss OQ5);Boss 走 Dmax 直填行不走本表。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 难度修饰表 schema:按 (level_index, node_depth) 精确匹配施加乘数的类型化读取(空表=零行为合法态)。 +## Boss 数值走行值直填不经本表;乘数越域仅告警、使用时 clamp(组合事故不作配置事故拒载)。 class_name DifficultyTable extends Resource diff --git a/game/data/schemas/enemy_table.gd b/game/data/schemas/enemy_table.gd index 2b958bd4..9284de2b 100644 --- a/game/data/schemas/enemy_table.gd +++ b/game/data/schemas/enemy_table.gd @@ -1,13 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 EnemyTable / HeroTable schema(敌人系统 回填值)。EnemyTable 键 (L,D,enemy_id),行集可多行混编 -# (行集构成纪律 = 敌人系统 v0.15:行集内 enemy_id 唯一〔dup_key 拦〕/ 同坐标多行文件内相邻〔行序即契约,本表 -# validate 兜底〕/ 行集实例总数 ≤4 守卫在 单位容器 spawn〔骰后值,加载期不可判〕); -# HeroTable 单行全局(Rule 4 豁免)。依据 design/gdd/systems/战斗循环/敌人系统.md Schema 节。 -# 敌人技能池:行模板 pool = [{skill_id, weight}](定义层——实例池快照与冷却状态在 单位容器; -# 设计权威=敌人系统.md 技能池节)。无 pattern 行为环数组与 heavy_multiplier 字段。 -# 池构成纪律(每池恰一行普攻、增益 ≤1、skill_id 悬空致命)需跨表视野,校验在 ConfigDB 跨表通道。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 敌人表 schema:逐 (level_index, node_depth, enemy_id) 行集的类型化读取(行集可多行混编;垂直切片验证:完整战斗逐行归因)。 +## 行序即契约:同坐标多行必须文件内相邻——resolver 返回序/生成序/叙述取首行全依赖文件行序。 +## 行集实例总数 ≤4 是开战骰后守卫(加载期不可判,闸在单位容器 spawn);技能池构成纪律需跨表视野,校验在 ConfigDB 跨表通道。 class_name EnemyTable extends Resource diff --git a/game/data/schemas/feat_table.gd b/game/data/schemas/feat_table.gd index f328dcfb..4aa81b2e 100644 --- a/game/data/schemas/feat_table.gd +++ b/game/data/schemas/feat_table.gd @@ -1,22 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 专长订阅行能否经效果引擎统一解释执行、逐件行为与声明一致(P0) -# Date: 2026-10-11(设计权威 design/gdd/systems/冒险循环/奇物.md——不设流派标签、不设档位机制; -# rarity 四级;概率位=档+rarity 与上限=cap 两独立属性解耦——cap 拿了才计、刷出不计) -# 概念指路:本表的专长,与 adventure.tres 的属性值提升、资源,同属一个对象—— -# 「奇物」(一次冒险内各渠道给予玩家的增益总称)。定义见 design/gdd/systems/冒险循环/奇物.md。 -# 它们是它分类轴上的枚举(专长 / 属性值提升 / 资源),不是三套系统;本表承载「专长」(专长 Feat)的逐项定义 -# (表名与 feat_id 沿用历史命名)。目标渠道:专长走关底 Boss 击败后专属三选一(不新增节点类型), -# 见奇物文档 2.1 节。 -# 数据配置 FeatTable schema(奇物·专长定义表;行 = Dictionary 键 feat_id,Rule 4 豁免 -# 定义表——TreasureItemTable 先例)。 -# 行字段:feat_id 主键 / display_name / rarity ∈ {common, excellent, rare, legendary}(四级稀有度, -# 与令牌池档位词表同名词族——令牌档 = rarity 直映射)/ cap 已拿上限(正整数,缺省 1——「同一件 -# 最多拿 N 次」;概率位与上限解耦见奇物.md 池结构节)/ desc 效果说明(文案表值化——呈现层读行, -# 零硬编码)/ triggers 订阅行数组(订阅哪个事件 on / 什么条件 when / 什么效果 do——效果引擎 -# EffectEngine 统一解释执行;四词表封闭校验=EffectEngine.validate_trigger_row 单一事实源)。 -# 🔴 层级纪律(需求卡片红线 2):专长只走局内随机渠道(Boss 三选一/凭证开启)——本表行永不入同调位 -# (treasure_items 表)/局外树(T8 节点表)。 -# 注记:事件族(开格/插旗/踩雷/节奏/战斗系)仅系设计侧分组工具——不上数据行、不上卡面(命名铁律)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 专长(奇物·Feat)定义表 schema:逐 feat_id 行订阅式效果声明的类型化读取(空表合法态;垂直切片验证:订阅行经效果引擎统一解释执行)。 +## 🔴 层级纪律:专长只走局内随机渠道(Boss 三选一/凭证开启)——本表行永不入同调位表/局外树。 +## triggers 订阅行四词表封闭校验单点在 EffectEngine.validate_trigger_row——本表不自建第二套校验。 +## 事件族命名仅系设计侧分组工具:不上数据行、不上卡面。 class_name FeatTable extends Resource diff --git a/game/data/schemas/forge_table.gd b/game/data/schemas/forge_table.gd index 04624214..ca378780 100644 --- a/game/data/schemas/forge_table.gd +++ b/game/data/schemas/forge_table.gd @@ -1,12 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-10-12(迭代 23 锻造工坊实装批 T1——设计权威 design/gdd/systems/跨局循环/锻造工坊.md v0.6) -# 锻造工坊配置表(ForgeTable):两根类型轴默认值(常驻持有——契约 2)+ 六条锻造路线行族(三武器+三甲)。 -# 所有权切分(契约 1 红线):攻击唯一入口=武器路线、AC 唯一入口=甲路线——树零攻防来源,本表是攻防 -# 数值成长的唯一数据面。等级语义(Q1 用户裁):未解锁/未锻造=0 加值(裸体态,类型=默认轴值); -# 解锁并锻造第一级=「获得装备」=1 级=首个 +1;逐级递进(2 级=+2 量级)。 -# 数值全 provisional(需求卡片 T1 锚表投值——终值归 M4 数值批):cap 5/每级增量统一 +1(v1.2 用户裁)/ -# 基础价 20/公比 150%(各级价格 20/30/45/67/101)/一次性解锁价 200/甲型基础 AC 10-12-9(现役结构值)。 -# 表运行期只读(铁律):永久强化只写存档(forge_routes 域),本表零写面。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 锻造工坊表 schema:两根类型轴默认值 + 六条锻造路线行族的类型化读取(数值 provisional)。 +## 所有权切分(红线):攻击唯一入口=武器路线、AC 唯一入口=甲路线——树零攻防来源,本表是攻防数值成长唯一数据面。 +## 表运行期只读(铁律):永久强化只写存档 forge_routes 域,本表零写面。 class_name ForgeTable extends Resource diff --git a/game/data/schemas/hero_table.gd b/game/data/schemas/hero_table.gd index ae260992..c6f2ed3f 100644 --- a/game/data/schemas/hero_table.gd +++ b/game/data/schemas/hero_table.gd @@ -1,11 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 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 行)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 英雄基线表 schema:max_hp/atk/armor_class 三数值轴单行全局类型化读取(垂直切片验证:完整战斗逐行归因)。 +## 类型轴不归本表(所有权在锻造工坊):默认值住 forge 表常驻持有、选中态写存档经参数面注入。 +## atk 无零基线:0 = 加载拒绝(零基线死锁在 schema 层杜绝)。 class_name HeroTable extends Resource diff --git a/game/data/schemas/level_table.gd b/game/data/schemas/level_table.gd index 557296d1..2c8568dc 100644 --- a/game/data/schemas/level_table.gd +++ b/game/data/schemas/level_table.gd @@ -1,17 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 线性第一关(战×2→道具→战×2→恢复→Boss)能否承载"数值提升→通关期望改善"的元进度验证 -# Date: 2026-09-11(关卡节点地图 v1.0 图结构;单链=出边恰一的退化形态) -# 数据配置 LevelTable schema(关卡节点地图 v1.0 承载面)。 -# 节点类型 closed enum:battle(战斗,须带 node_depth)/ reward(直通占位点)/ rest(血量恢复点)/ boss(关底 Boss,须带 node_depth) -# / shop(商店房:同 reward/rest 无战斗行、无 node_depth 要求, -# 图形态仍须编号化;零新增图合法性检查,必经位由冒烟断言承载非加载校验)。 -# 图形态(行集内任一节点带 "next" 出边表即整行按图校验):节点编号 = node_depth(关卡内唯一定位地址, -# 全节点须带,reward/rest 亦然);next = [出边节点编号...](连线只朝前进方向:目标编号严格大于自身)。 -# 单链形态(零 "next" 键——第一关现状零迁移):隐式出边 = 数组顺序下一项,节点编号 = 数组下标 -# (仅校验期内部使用;node_depth 仍只对 battle/boss 必填)——单链经同一套图合法性算法。 -# 图合法性(违规加载致命,validate 报错由 ConfigDB 收敛为 fail-fast): -# 编号唯一 · 入口唯一(无入边节点恰一)· Boss 恒唯一终点(无出边且编号最大)· 连线只朝前进方向(⇒无环) -# · 从入口可达全部节点 · 全部节点沿连线可达 Boss。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 关卡节点表 schema:逐关节点链(单链/节点图两形态)的类型化读取(垂直切片验证:线性第一关承载元进度循环)。 +## 两形态同跑一套图合法性算法,违例加载期致命(validate 报错由 ConfigDB 收敛为 fail-fast)。 class_name LevelTable extends Resource diff --git a/game/data/schemas/meta_table.gd b/game/data/schemas/meta_table.gd index c5802918..6f637717 100644 --- a/game/data/schemas/meta_table.gd +++ b/game/data/schemas/meta_table.gd @@ -1,19 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否在营地用钥石换永久强化、且强化在下一局开局生效——存档变厚成为玩家可感的现实 -#(元进度 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 刷新升级行族(每冒险开局给 Y 次、冒险周期池、 -# 用完即无;level 连续从 1,等级 L → refresh_charges=Y 表值,钥石直购 keystone_cost;数值全 provisional)。 -# 〔无 forge_products 属性锻造行族——生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线。〕 -# 〔无 workshop_items 道具工坊行族——解锁=混合制:钥石购买价 -# unlock_keystone_cost + 条件谓词 unlock_requires 全挂 treasure_items.tres 行内(单一事实源)。〕 -# 行值全部 provisional(读数归 元进度.md)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 元进度表 schema:Boss 钥石两档/属性换算/Y 刷新升级三行族的类型化读取(行值 provisional;垂直切片验证:钥石换永久强化下局生效)。 +## 消费面一律走 ConfigDB.meta_* 访问器,禁直读行集。 +## 道具解锁条件不在本表:单一事实源住 treasure_items 行内(unlock_keystone_cost + unlock_requires)。 class_name MetaTable extends Resource diff --git a/game/data/schemas/meta_tree_table.gd b/game/data/schemas/meta_tree_table.gd index 6be2583c..1997ad00 100644 --- a/game/data/schemas/meta_tree_table.gd +++ b/game/data/schemas/meta_tree_table.gd @@ -1,26 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 数据配置 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}(树全钥石单币;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}(等级阈值前置机制位:前置节点等级 ≥ n 才可购;现役 12 行 -# 零配置=机制位空转零行为影响,配置归表行随需填;键悬空/阈值 <1 加载即拒)/ -# effects Dictionary(stat 线 flat:max_hp/hit;rule 键封闭 RULE_KEYS)。 -# 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 解锁计入)。 -# 🔴 层级纪律(需求卡片红线 2):局外树只放全局规则件——effects 禁流派标签(archetype 键出域=加载 -# 致命);规则改写型特性只走局内随机渠道,永不入树。 -# 彩蛋 ≤3(schema 校验);觉醒判定=MetaProgression._check_easter_egg 特化(生命/命中两线拉满+同调位 -# 全解锁),不依赖 requires 点亮形态。 -# 数值全 provisional(契约 7);两侧「不同强非强弱」MC 验差 <~3pp(V19)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 天赋树表 schema:逐 node_id 行(脊柱/锻造/钥石/同调四脉)的类型化读取(空表合法态;数值 provisional)。 +## 🔴 层级纪律:局外树只放全局规则件——effects 禁流派标签(archetype 键出域=加载致命); +## 规则改写型特性只走局内随机渠道,永不入树。 class_name MetaTreeTable extends Resource diff --git a/game/data/schemas/reward_table.gd b/game/data/schemas/reward_table.gd index 34445fa7..b1c4f5d2 100644 --- a/game/data/schemas/reward_table.gd +++ b/game/data/schemas/reward_table.gd @@ -1,12 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10(地图战斗资源 五型 × 极性字典) -# 数据配置 RewardTable schema(地图战斗资源 回填值)。 -# 行 = Dictionary,键 reward_id(Rule 4 豁免:定义表);跨字段校验族 + 池护栏。 -# 九型封闭枚举(attack/defense/heal/blast/weaken/pierce/magic/action/gp)× 极性(positive/negative): -# 正向行 = 摇号池(权重 = 类型频次);负向行 = 纯兑付字典(不消费权重)。 -# gp 型正负两行入池, -# effect_id gp_gain/gp_loss = 战斗内缓冲通道(战斗结算 escrow 记账,不入增益容器)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 格面资源表 schema:逐 reward_id 行(类型×极性字典 + 摇号池 + aux 投放行)的类型化读取(垂直切片验证:完整战斗逐行归因)。 +## (类型, 极性) 字典齐备与 cell 池非空是加载前提——缺行/池空即致命(fail-fast)。 class_name RewardTable extends Resource diff --git a/game/data/schemas/settlement_table.gd b/game/data/schemas/settlement_table.gd index 4a9f23b2..3881d003 100644 --- a/game/data/schemas/settlement_table.gd +++ b/game/data/schemas/settlement_table.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 SettlementTable schema(战斗结算 回填值;单行全局,Rule 4 豁免)——八字段口径 + 克制/充能批 + 护甲等级掷点批。 -# 三行致命 manifest:segorder_violation / poolmap_dangling / pperfect_oob。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗结算表 schema:结算全局旋钮(段序/克制矩阵/掷点档位)单行全局类型化读取(垂直切片验证:完整战斗逐行归因)。 +## 结构冻结位(段序/取整/pool clamp/效果池映射)违例加载期致命(fail-fast)。 class_name SettlementTable extends Resource diff --git a/game/data/schemas/shop_table.gd b/game/data/schemas/shop_table.gd index 79d2593c..c01ed1ae 100644 --- a/game/data/schemas/shop_table.gd +++ b/game/data/schemas/shop_table.gd @@ -1,20 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否在 Boss 前商店房用战斗掉落 GP 购买三属性锻造档,兑现「数值提升→后续战斗改善」的局内成长闭环(P1) -# 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;三件全陈列无刷新无摇号); -# 现价公式 = base_price + price_level_bonus(关卡) + price_increment × 该商品已购档数(已购档数在 冒险结构)。 -# price_level_bonus = 关级定价加值行(level_index 连续从 1 递增)。 -# 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 对照)。 -# 行值全部 provisional(数值归 难度曲线与Boss)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 商店表 schema:GP 掉落/关级加值/商品/共享池货架行族 + 爬价因子的类型化读取(行值 provisional;垂直切片验证:商店房 GP 购买兑现局内成长)。 +## 消费面一律走 ConfigDB.shop_* 访问器,禁直读行集。 +## 行族不记库存:货架=上限即库存,账本单点在冒险侧;products+加法定价=legacy 面(shop=off 对照),现役走 pool_shelf。 class_name ShopTable extends Resource diff --git a/game/data/schemas/skill_table.gd b/game/data/schemas/skill_table.gd index c0dacb4b..303ecd7d 100644 --- a/game/data/schemas/skill_table.gd +++ b/game/data/schemas/skill_table.gd @@ -1,10 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-16 -# 数据配置 SkillTable schema(定义层"技能行",敌人系统 回填值;行 = Dictionary,键 skill_id;Rule 4 豁免)。 -# 设计权威:敌人系统.md 技能池节 §2.2 字段词汇表。 -# 三层对象:技能行(本表,多敌种共享)· 池模板(EnemyTable.pool:{skill_id, weight})· 实例池(单位容器 spawn 快照)。 -# 池构成纪律的加载校验在 ConfigDB 跨表通道(每池恰一行普攻、增益 ≤1、skill_id 悬空致命——本表无池视野)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 技能表 schema:逐 skill_id 行的类型化读取(多敌种共享的定义层;垂直切片验证:完整战斗逐行归因)。 +## 本表无池视野:池构成纪律(每池恰一行普攻、增益 ≤1、skill_id 悬空致命)校验在 ConfigDB 跨表通道。 +## 普攻行结构锁死(倍率恒 1、冷却恒 0)——「池恒非空」的结构前提,禁配伤害/冷却参数。 class_name SkillTable extends Resource diff --git a/game/data/schemas/status_effect_table.gd b/game/data/schemas/status_effect_table.gd index 8e807ba8..89891d5a 100644 --- a/game/data/schemas/status_effect_table.gd +++ b/game/data/schemas/status_effect_table.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 StatusEffectTable schema(增益状态 回填值;行 = Dictionary,键 effect_id;Rule 4 豁免)。 -# 依据 design/gdd/systems/战斗循环/增益状态.md "StatusEffectTable Schema 定稿"。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 增益状态表 schema:逐 effect_id 行的类型化读取(垂直切片验证:完整战斗逐行归因)。 +## validate() 违例加载期致命(fail-fast);表运行期只读,调参只走 data/tables 表值。 class_name StatusEffectTable extends Resource diff --git a/game/data/schemas/treasure_item_table.gd b/game/data/schemas/treasure_item_table.gd index 605c84f7..e2fe4ed3 100644 --- a/game/data/schemas/treasure_item_table.gd +++ b/game/data/schemas/treasure_item_table.gd @@ -1,30 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 挖掘期撞上推理断头时,玩家能否从掉落池捡到秘宝、在关键时刻花掉买回情报或行动点(P0) -# 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 两标记: -# 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 重定后落位)。 -# 同调扩列字段: -# form ∈ {"", "passive", "active_charged"}(空 = 过渡形态,现行表零空行; -# passive = 装配整局生效;active_charged = 每冒险充能、挖掘期发起); -# charges_per_adventure(active_charged ≥1 / passive 恒 0);slot_cost(同调行恒 1——底稿裁决 5,schema 强制); -# unlock_requires 谓词行 [{key ∈ 计数键封闭枚举〔UNLOCK_COUNTER_KEYS〕, threshold ∈ [1,999]}](空 = 已解锁—— -# 首批全解锁合法态,底稿 §2.2 用户裁;正式解锁渠道归 元进度 道具工坊柜台); -# effective_rounds(前 N 轮限时件轮数——P4 甲表值化;仅 ap_rounds_front 行消费); -# charge_n(充能进度阈值 N——仅 ap_charge_safe 行消费)。 -# 🔴 零裸 flat 结构护栏(需求卡片 §三 1——机制轴禁无条件属性加项):行键白名单封闭(KEY_WHITELIST 外键 = -# 加载致命)+ effect_kinds 封闭枚举只收条件触发/机制修正类 kind——任何「无条件属性加项」类效果不得以 -# 新 kind 或新键入表(返工红线)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 秘宝表 schema:逐 item_id 行(掉落件+同调件)的类型化读取(空表合法态;垂直切片验证:断头时捡到秘宝买回情报/行动点)。 +## 🔴 零裸 flat 护栏(返工红线):行键白名单封闭 + effect_kinds 封闭枚举只收条件触发/机制修正类——无条件属性加项禁入表。 +## 承重护栏(schema 强制不靠运行时拦截):真视窄域——真视类活行 target ≤3×3,禁全图看雷。 +## retired/deferred 标记行免活行校验、不入投放。 class_name TreasureItemTable extends Resource diff --git a/game/data/schemas/variation_table.gd b/game/data/schemas/variation_table.gd index 9e014e79..eb4ff940 100644 --- a/game/data/schemas/variation_table.gd +++ b/game/data/schemas/variation_table.gd @@ -1,13 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 玩家能否无指导在一场完整战斗中经历「开战→挖掘规划→轮末结算逐行兑现→胜/负」并逐行归因(P2) -# Date: 2026-09-10 -# 数据配置 VariationTable schema(地形变异;行 = Dictionary,键 variant_id)。 -# 字段集(枚举抽象,不写死类型):effect/effect_value/trigger/placement 四字段 -# 把"变异是什么、在哪出现、何时起作用"全部数据化——新增类型 = 清单加行 + 必要时扩充枚举词表,不改读取方。 -# 门控匹配对象 = board_type 词表(无 biome_tags 字段); -# counter_items 字段位保留(反制道具绑定,暂恒空、反制件回填)。 -# 无 info_mask/cell_constraint 字段(hide_number 在 effect 词表;safe_nonzero 由 -# 布置域结构保障——初始展开区天然排除,见 battle_orchestrator._place_variants)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 地形变异表 schema:逐 variant_id 行的类型化读取(空清单=零变异合法态;垂直切片验证:完整战斗逐行归因)。 +## 数据驱动扩展契约:新增类型=表加行+必要时扩枚举词表,不改读取方。 +## 跨字段互锁(效果↔触发↔布置↔作用域)违例加载期致命(fail-fast)。 class_name VariationTable extends Resource diff --git a/game/presentation/armed_timer.gd b/game/presentation/armed_timer.gd index 7db66a96..1d0f305e 100644 --- a/game/presentation/armed_timer.gd +++ b/game/presentation/armed_timer.gd @@ -1,10 +1,6 @@ -# 武装确认计时器(只统一计时+脉冲机制,视觉三处各自保留)。 -# 背景:三处二次确认计时机制异构(AP 条弃图刷新=tween 秒表 / 选路放弃钮=_process 帧驱动 -# 倒计时 / 战斗总结结算框=纯载荷暂存裸布尔)——本类为单一计时实现。 -# 保缝纪律:AP 条三探针缝(press_refresh_for_probe/confirm_visible/press_confirm_for_probe) -# 语义等价零动;放弃钮真实二击路径零改;结算框挂起态经组合根属性继续可读写(探针接缝)。 -# 减动效档:档判据单点 motion_still()——脉冲相位由视觉层取 elapsed 自算(1Hz 连续呼吸 -# 视觉零变化),减动效档视觉层走静态呈现(放弃钮静态半透先例)。 +## 武装确认计时器:三处二次确认(AP 条弃图刷新/选路放弃钮/战斗总结结算框)共用的计时+脉冲机制,视觉各自保留。 +## 探针接缝禁动:AP 条 press_refresh_for_probe/confirm_visible/press_confirm_for_probe 三缝与结算框挂起态的组合根读写面。 +## 减动效档判据单点 motion_still()——视觉层共用此处取相位/静态化,禁各自内联 motion_scale 判断。 class_name ArmedTimer extends RefCounted diff --git a/game/presentation/battle_narrator.gd b/game/presentation/battle_narrator.gd index b43ea54b..3704c7ca 100644 --- a/game/presentation/battle_narrator.gd +++ b/game/presentation/battle_narrator.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-12(code-review 修复批——自 main.gd 拆出,规范 1.1/1.3 文案拼装独立成装配器) -# 战斗流程叙事文案装配器:组合根在模式流转点的玩家可见文案(棋盘日志横幅 / 节点行 / 终局文案 / -# 相位指示)在此统一拼装——main.gd 头注"本类不拼呈现字符串"由本类兑现。静态无状态。 -# 数值口径注记:胜利文案携带的 HP/道具数 = 关卡载荷快照值(每关口径)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗流程叙事文案装配器:模式流转点的玩家可见文案(棋盘日志横幅/节点行/终局文案/相位指示)统一在此拼装,静态无状态。 +## 文案内数值 = 载荷快照值(每关口径),非实时现值——日志断言与排障按此口径读。 extends RefCounted diff --git a/game/presentation/camp_shop_presenter.gd b/game/presentation/camp_shop_presenter.gd index c6a19d31..b1b2c533 100644 --- a/game/presentation/camp_shop_presenter.gd +++ b/game/presentation/camp_shop_presenter.gd @@ -1,10 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 营地/商店投影控制器(规范 1.1 单一职责拆件): -# 营地面开合/快照投影/锻造·同调·天赋树·Fork 购买与切换 + 商店房购买/离开(pool 与 product 双面)。 -# 装配纪律(仿 treasure_interact_controller 先例):信号连接不在此发生——campbtn/ -# camp_overlay 四信号/shop_overlay 两信号由组合根接至本类 on_* 入口;模态栈/呈现刷新/续玩按钮 -# 刷新经组合根回调注入;runner 随局更替——现值回调注入;写调用唯一经 MetaProgression 购买原语 -# 与 LevelRunner.buy_*(core 侧单口,本类零直写——拒绝可见 pattern 1 兜底 toast 保留原地)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 营地/商店投影控制器:营地开合/快照投影/锻造·同调·天赋树·Fork 购买切换 + 商店房购买/离开(pool 与 product 双面)。 +## 信号连接只归组合根(campbtn/camp_overlay/shop_overlay 信号接至本类 on_* 入口);模态栈/呈现刷新/续玩刷新与 runner 现值经组合根回调注入。 +## 写调用唯一经 MetaProgression 购买原语与 LevelRunner.buy_*——本类零直写,拒绝兜底 toast 保留原地。 extends RefCounted var db diff --git a/game/presentation/curio_interact_controller.gd b/game/presentation/curio_interact_controller.gd index 099fd73b..604958fe 100644 --- a/game/presentation/curio_interact_controller.gd +++ b/game/presentation/curio_interact_controller.gd @@ -1,11 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 三选一交互控制器(规范 1.1 单一职责拆件): -# 三选一停点编排(presented→pick→confirm/refresh→resolved→continue)+ 同调位替换子态 -#(presented→chosen)+ TP0 令牌池卡片文案装配("kind|tier|feat_id" 复合键)+ 工坊显示名投影。 -# 装配纪律(仿 treasure_interact_controller 先例):信号连接不在此发生——curio_overlay -# 四信号与 adventure 两信号由组合根接至本类 on_* 入口;模态栈/演播后排窗/呈现刷新/终局面/ -# 推进失败 fatal 经组合根回调注入;adventure/runner 随局更替——现值回调注入;兑付写调用唯一 -# 经 adventure.pick_curio/apply_node_curio(core 侧单口,本类零直写;无替换子交互——装配不可变契约 1,冒险中零更换途径)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 三选一交互控制器:三选一停点编排(presented→pick→confirm/refresh→resolved→continue)+ TP0 令牌池卡片文案装配 + 秘宝显示名投影。 +## 信号连接只归组合根(curio_overlay/adventure 信号接至本类 on_* 入口);模态栈/演播后排窗/呈现刷新/fatal 经组合根回调注入,adventure/runner 现值注入。 +## 兑付写调用唯一经 adventure.pick_curio/apply_node_curio——本类零直写。 +## 同调装配不可变(冒险中零更换途径)——无替换子交互。 extends RefCounted const Narrator := preload("res://presentation/battle_narrator.gd") diff --git a/game/presentation/debug_session.gd b/game/presentation/debug_session.gd index 463a16f6..d4deeb0d 100644 --- a/game/presentation/debug_session.gd +++ b/game/presentation/debug_session.gd @@ -1,13 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-13(自 main.gd 拆出——规范 1.1 审视线 / 调试语义单一实现纪律) -# 调试模式编排控制器:单场遭遇(第 1/2 层)与连续两层(HP 关内延续)的模式状态机与战斗生命周期。 -# 职责边界:层序/携带 HP + 战斗结算 生命周期编排(创建 / begin_battle)。 -# 层间延续 = HP 关内延续(库存与共享 地图战斗资源 已下线)。 -# 授权边界:与 tune_sim_controller 同款——控制器承接模式编排, -# 组合根仍持有全部信号接线(battle_created 先于 begin_battle 发出,接线唯一归组合根) -# 与终局 UI 决策;玩家意图写调用(settle_batch / 刷新)不经本类。 -# 加成生效值经注入 Callable 供给(组合根从面板百分比现算)→ encounter -# 显式传入战斗——零表写。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 调试模式编排控制器:单场遭遇与连续两层(HP 关内延续)的模式状态机与战斗生命周期。 +## 信号接线唯一归组合根——battle_created 必须先于 begin_battle 完成接线;玩家意图写调用(settle_batch/刷新)不经本类。 +## 加成生效值经注入 Callable 现算、随 encounter 显式传参——零表写。 extends RefCounted signal battle_created(settlement, level: int, carry_hp: int) # begin_battle 前——组合根完成信号接线 diff --git a/game/presentation/hud_presenter.gd b/game/presentation/hud_presenter.gd index 4aa07005..79686b2c 100644 --- a/game/presentation/hud_presenter.gd +++ b/game/presentation/hud_presenter.gd @@ -1,15 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(四区呈现装配器)——读核心只读面(战斗结算 呈现快照 / runner)→ -# 组装文案/投影 → 驱动各视图 setter。 -# 高内聚边界:"核心状态 → 呈现文案"的全部翻译集中于此;视图保持零核心依赖; -# 静态无状态——呈现不持久化任何核心句柄。 -# 核心状态读取统一经 战斗结算.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 装配器) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 呈现装配器:核心状态 → 呈现文案的全部翻译集中于此(战斗屏 B/C/D 区文案与投影),静态无状态。 +## 核心读取只走 settlement.presentation_snapshot() 成文快照面——禁链式穿透 settlement.enemy_system.* / status_effects 一类内部路径。 +## 旗/拔/移动反馈与 AP/RAP 无推送信号——组合根每次动作/结算返回后必须重查 refresh,漏调即陈旧呈现。 class_name HudPresenter extends RefCounted diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 3e3e74d5..389c0caf 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -1,34 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Validation Question: 线性第一关(战×2→道具→战×2→恢复→Boss)能否承载"数值提升→通关期望改善"的元进度验证 -# 实现 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,视图构建仍归 -# ui_assembler.gd——规范 1.1,本类只接线;模态层仍归本类程序化装配) -# ② 模式管理(正式冒险 AdventureRunner——唯一试玩入口;调试两层编排归 debug_session.gd;单场原语仅探针使用) -# ③ 核心写调用只在此处发生(minesweeper.settle_batch / 刷新编排入口 / runner 推进; -# 加成值零表写——面板百分比经 runner.set_hero_override / debug_session 生效值 Callable -# 以 encounter 参数入战斗,db.hero 运行期只读) -# ④ 全屏 States 状态机(挖掘/结算/终局)与一次性提示去重。 -# 场景结构:三屏 .tscn 屏壳 + 全部模态程序化装配于本类;树序/登记序唯一事实源=LAYER_CONTRACT -# (见下——屏内两容器无同时可见态,全部模态在屏壳之上)。 -# 局生命周期: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——本类不拼呈现字符串。 -# 结算行排播归 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 链式穿透。 -# 接线纪律:呈现层永不直接订阅 排雷玩法/行动经济——只订 战斗结算/runner 转发信号;相位读取仅用于 -# 驱动视图状态;信号连接只在组合根(row_pacer/treasure_interact_controller 零连接,只收注入)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 组合根:唯一的模式流转与 core↔view 接线处(垂直切片验证:线性第一关承载元进度循环)。 +## db.hero 运行期只读,加成经 runner.set_hero_override / debug_session 生效值入战斗。 +## 禁链式穿透 settlement.*(相位读取只走 presentation_snapshot);模态开合只走 _open_modal/_close_modal。 +## 局态全在 run_scope.gd 节点,禁在屏/视图侧持有局态引用;autoload 节点路径常量单点在 AUTOLOAD_PATH_*。 extends Control # autoload 节点路径单点(迭代 27 T6 P2-2 降格实现:审计处方「编译期全局名」与本仓 --script diff --git a/game/presentation/modal_stack.gd b/game/presentation/modal_stack.gd index 12f2225c..284ff71b 100644 --- a/game/presentation/modal_stack.gd +++ b/game/presentation/modal_stack.gd @@ -1,9 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/interaction-patterns.md(pattern 6 模态 overlay 层级纪律)。 -# Date: 2026-09-12(code-review 修复批——自 main.gd 拆出,规范 1.1 状态装配独立成类) -# 模态层级状态机:登记序 = 树序 = z 遮挡序;打开时显式隐藏树序在其上方的可见层、关闭恢复 -# (缺陷⑤纪律载体:功能存在 ≠ 功能可达——遮挡关系不得靠树序巧合)。 -# 纯逻辑零节点构建——组合根持有本类并喂入 Control;不持久化核心状态。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 模态层级状态机:登记序 = 树序 = z 遮挡序,打开显式隐藏其上方可见层、关闭恢复。 +## 层必须先 register 方可 open/close;遮挡由本类显式记账,不得靠树序巧合。 +## 纯逻辑类——Control 层由组合根喂入 register。 extends RefCounted var _list: Array[Control] = [] # 登记序 = z 遮挡序(低 → 高) diff --git a/game/presentation/playtest_logger.gd b/game/presentation/playtest_logger.gd index 9d84ba17..2a3be2d3 100644 --- a/game/presentation/playtest_logger.gd +++ b/game/presentation/playtest_logger.gd @@ -1,14 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(§Events Fired 遥测义务——ux 行族)。 -# Date: 2026-09-12(战斗屏 ux 遥测) -# 试玩日志器(呈现层组件——订阅核心信号持久化 JSONL,供数值分析;卡死诊断转储)。 -# 职责边界:核心层只发 settlement_snapshot 信号(战斗结算)/既有信号(battle_finished/node_entered/ -# level_finished/step_row);本组件负责订阅、缓冲与写文件——核心零日志感知(零 UI 依赖不变)。 -# 文件 = user://logs/playtest__<时间戳>.jsonl(每行一次结算/终局/节点的全量状态 JSON)。 -# ux 行族(呈现层观测,不改 core):ux_round_input_ratio(原始输入动作数∶AP 消耗)、 -# ux_round_exit{path_tag}(快照 round_facts.path——呈现层只订 战斗结算 的接线纪律下唯一合法来源)、 -# ux_refresh_attempt / ux_reject / ux_hint_shown(组合根显式上报;无 ux_window_choice——道具窗口已下线)。 -# 诊断转储 = 全量核心状态 + 最近结算/操作环形缓冲 → user://logs/diag_<时间戳>.json(卡死时点按钮)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 试玩日志器:订阅核心信号逐行落 JSONL(user://logs/playtest__<时间戳>.jsonl)供数值分析,卡死诊断转储 diag_*.json。 +## ux_reject/ux_refresh_attempt/ux_hint_shown 无信号源——依赖组合根显式上报,漏调即缺行。 +## ap_per_round 须由组合根注入——ux_round_input_ratio 的 AP 消耗口径分母。 class_name PlaytestLogger extends RefCounted diff --git a/game/presentation/row_pacer.gd b/game/presentation/row_pacer.gd index c8828d40..8a1ba50b 100644 --- a/game/presentation/row_pacer.gd +++ b/game/presentation/row_pacer.gd @@ -1,10 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 结算行排播泵(规范 1.1 单一职责拆件): -# 演出层排播:逻辑先行零回压,行按段分组阶梯延迟进明细带。 -# 硬契约:核心层零 await 不破——本队列只做信号的"后置消费",结算顺序/结果/时序逻辑零改动(§3 契约 1); -# 减动效开=延迟归零走同帧直落快路(行呈现不跳过——§3 契约 5);模态开启前强制排空(明细回看/停点 -# 覆盖层所见明细带恒完整——排空入口在组合根 _open_modal)。 -# 装配纪律:视图句柄与呈现刷新回调由组合根注入(本类零信号连接,仅做信号后置消费)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 结算行排播泵:逻辑先行零回压,行按段分组阶梯延迟进明细带。 +## 硬契约:只做信号的后置消费——结算顺序/结果/时序逻辑零改动;减动效开=延迟归零同帧直落,行呈现不跳过。 +## 开模态前必须 flush()——明细回看/停点/终局面所见明细带恒完整。 +## 视图句柄与 refresh_request/pump_ended 回调由组合根注入——本类零信号连接。 extends Node const PACE_SEGMENT_GAP := 0.3 # 段间阶梯延迟(代拍板:白名单 0.2–0.4s 内取值,追认清单呈报) diff --git a/game/presentation/settings_store.gd b/game/presentation/settings_store.gd index 9b4bfe08..58248104 100644 --- a/game/presentation/settings_store.gd +++ b/game/presentation/settings_store.gd @@ -1,11 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-29(最小设置面:音量入口+减动效开关——设置与本地化.md P1) -# 系统级设置独立存储(设置与本地化.md:一安装一份、删游戏才消失, -# 不进存档与生涯数据两分)。三件最小面:音量(master bus)/全屏/减动效。 -# 生效侧分工:入口与持久化归本类;音量对声音的生效口径归 音频.md(master bus 单点); -# 减动效对动画的分档兑现归 battle.md §Transitions(UiKit.motion_scale 既有承载,结算逐行 -# 兑现=信息载体只降速不跳过)。 -# 探针隔离:path 可注入(冒烟/探针禁碰真实 user://settings.cfg——同存档隔离纪律)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 系统级设置独立存储(一安装一份、不进存档与生涯数据):音量(master bus)/全屏/减动效三件最小面,入口与持久化在此。 +## 探针/冒烟必须经 path 注入隔离——禁碰真实 user://settings.cfg。 class_name SettingsStore extends RefCounted diff --git a/game/presentation/treasure_interact_controller.gd b/game/presentation/treasure_interact_controller.gd index 09198aec..06c1ec16 100644 --- a/game/presentation/treasure_interact_controller.gd +++ b/game/presentation/treasure_interact_controller.gd @@ -1,14 +1,8 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 秘宝两步交互控制器(规范 1.1 单一职责拆件): -# C 区槽位选中/取消(toggle)→ 棋盘点格使用目标拾取的两步交互状态机 + 库存/叠加层只读投影装配。 -# 数据源 = runner 级库存只读面(query_inventory/query_overlays)+ 表行投影(display_name/target/effect_kinds); -# 写调用唯一经 战斗结算.use_treasure(core 侧四步编排——拒绝零消耗 toast 可辨认)。 -# 装配纪律:settlement/runner 随关卡逐关更替——经组合根现值回调注入(仿 identity_resolver 只读回调 -# 先例);呈现句柄(信息面板/toast/棋盘叠加层)由组合根注入;信号连接不在此发生, -# info_panel.treasure_slot_clicked 由组合根接至 on_slot_clicked。 -# 无目标使用显式化:AP 类(target=none)无坐标可给—— -# 调用面一律 attempt_use(handle)(cell 缺省=null=显式「无目标」),core 契约的 -# Vector2i 形参收口于本类常量(treasure_items.validate_use 对 ap 行忽略目标值,哨兵不出本类)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 秘宝两步交互控制器:C 区槽位选中/取消(toggle)→ 棋盘点格使用目标拾取的状态机 + 库存/叠加层只读投影装配。 +## 写调用唯一经 settlement.use_treasure;信号连接只归组合根(info_panel.treasure_slot_clicked 接至 on_slot_clicked)。 +## settlement/runner 随关卡逐关更替——经组合根现值回调注入。 +## AP 类(target=none)调用面一律 attempt_use(handle)(cell 缺省=null=显式无目标)——哨兵坐标收口本类,不出控制器。 extends RefCounted const NO_TARGET := Vector2i(-9, -9) # core use_treasure 形参占位(仅 target=none 行到达——validate_use 忽略该值) diff --git a/game/presentation/tune_sim_controller.gd b/game/presentation/tune_sim_controller.gd index 2e913e31..d0c41728 100644 --- a/game/presentation/tune_sim_controller.gd +++ b/game/presentation/tune_sim_controller.gd @@ -1,12 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 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 依赖面板所在场景树(进度逐帧刷新)。 -# 依赖方向:presentation 不 preload smoke—— -# 驱动实例由调用方构造注入(_driver,须供 run_level(...) 与 smoke/level_autoplay 同款签名); -# 构造参数缺省 null = 内部运行时 load 兜底(同种子同口径零漂移)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 调整板批量模拟控制器:逐次驱动关卡自动策略(与 headless 扫描同口径),进度/报告经面板 setter 注入。 +## 零核心写——表基线复位由组合根在移交前完成,加成施加只走自动策略内部 runner.set_hero_override 单路径。 +## presentation 不 preload smoke:驱动实例由调用方注入(须供与 level_autoplay 同款 run_level 签名),缺省 null=运行时 load 兜底。 extends RefCounted const SEED_BASE := 4200 # 模拟种子基(与历史实现同源——同种子可回放) diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index 418a9f29..3d361655 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -1,9 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(四区装配器——组合根的 UI 构建拆分载体)。 -# Date: 2026-09-12(code-review 修复批:main.gd 回涨 761 行触规范 1.1 审视线——构建拆出) -# 高内聚边界(规范 1.1/1.3):视图构建装配器——只做 new / add_child / 布局, -# 零信号连接、零核心写调用;返回句柄供组合根接线(接线拓扑唯一归组合根)。 -# 静态无状态。z 序契约:调用方必须按 build 返回序 addChild(登记序 = 模态遮挡序——缺陷⑤纪律)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 视图构建装配器:只做 new/add_child/布局,静态无状态,返回句柄供组合根接线。 +## 接线拓扑唯一归组合根——本类零信号连接。 +## z 序契约:调用方必须按 build 返回序 addChild(登记序 = 模态遮挡序)。 extends RefCounted diff --git a/game/presentation/views/ap_bar_view.gd b/game/presentation/views/ap_bar_view.gd index 0c1dcd85..7cf1625a 100644 --- a/game/presentation/views/ap_bar_view.gd +++ b/game/presentation/views/ap_bar_view.gd @@ -1,12 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(D 区 AP 条 44px——点阵+数字〔pattern 5 点阵资源显示〕、 -# 停手按钮居左、图例+弃图刷新按钮居右〔雷图右上角〕;弃图刷新确认微交互与常规确认不同位 -# 〔pattern 7 破坏性确认异位:RAP 扣费 · 旧板旗作废显式代价〕)。 -# RAP 读数(点阵+数字)在本条、置弃图刷新按钮左邻 -# (RAP 唯一消费口 = 弃图刷新——就近原则;RAP 清零反馈/资源拒绝脉冲载体同处)。 -# Date: 2026-09-12 -# 高内聚边界:纯视图——意图经信号外发(stop_pressed/refresh_confirmed/legend_toggled), -# 状态由组合根经 setter 注入;刷新可用性预判 = RAP≥8 读数(行动经济 无推送信号——每次调用返回后重查)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## D 区 AP 条:AP/RAP 点阵读数与停手、图例、弃图刷新入口(弃图刷新为二段确认——RAP 扣费·旧板旗作废显式代价)。 +## RAP 读数贴弃图刷新消费口(RAP 唯一消费口=弃图刷新);无推送信号——组合根每次核心调用返回后经 setter 重查注入。 class_name ApBarView extends PanelContainer diff --git a/game/presentation/views/battle_end_overlay.gd b/game/presentation/views/battle_end_overlay.gd index 0f54298e..902160c5 100644 --- a/game/presentation/views/battle_end_overlay.gd +++ b/game/presentation/views/battle_end_overlay.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(胜利/失败终局 overlay——金蜡封占位落于扫雷图区中央 + 判定行 + -# 明细回看入口 + 继续/返回;失败 = 暮蓝 #5A6C8C 氛围(明度不变)+ 旗化光点收回占位; -# pattern 6 模态 overlay 层级纪律——遮挡物隐藏/输入锁定断言归场景探针)。 -# Date: 2026-09-12(扩展自 node_overlay 的战斗终局职责分离) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗/冒险终局 overlay(模态):判定行+三行账+明细回看入口+继续/返回,失败侧暮蓝氛围。 +## 摘要文本经 open_victory/open_defeat 由组合根装配喂入——本类零文案装配。 class_name BattleEndOverlay extends Control diff --git a/game/presentation/views/battle_log_view.gd b/game/presentation/views/battle_log_view.gd index 62dd945a..1c340da7 100644 --- a/game/presentation/views/battle_log_view.gd +++ b/game/presentation/views/battle_log_view.gd @@ -1,11 +1,5 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(B 区结算明细带改造——挖掘期收起 1 行上轮摘要 / 结算期 84px -# 实时流 / 点击展开回看 overlay〔pattern 6 模态纪律〕;行模板「{行为} {值} → {目标}(来源)」、 -# 聚合计数行、零值行可见、效果行 value≠pool_value 禁相加、未生效四类行 icon/划线形状冗余、 -# highlight 金框〔flag_hit/clear_reward_h2/perfect_broken〕、击杀标记)。 -# Date: 2026-09-12(行协议格式化版;现行 10 类;伤害行带掷点读数/档位随行标注 + nat20 金框高亮; -# 施放行 = 蓄力行 charge 改型〔增益技 0 伤害施放、具名技能〕) -# 高内聚边界:战斗结算 步骤流 → 玩家文案的全部格式化规则内聚于此;来源文案映射来自 SettlementTable。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## B 区结算明细带——战斗结算步骤流到玩家文案的全部行格式化规则内聚于此(挖掘期收起 1 行上轮摘要、结算期实时流)。 class_name BattleLogView extends PanelContainer diff --git a/game/presentation/views/battle_stage_view.gd b/game/presentation/views/battle_stage_view.gd index 563ccd0a..f42a2c08 100644 --- a/game/presentation/views/battle_stage_view.gd +++ b/game/presentation/views/battle_stage_view.gd @@ -1,20 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(B 区战斗画面 252px 全宽——主角站桩(左)+ 兑现演出区(中)+ -# 敌方站桩 ×1–3(右);顶部中央轮次·阶段指示; -# 底部结算明细带(布局决策 D1 常驻双舞台分屏))。 -# Date: 2026-09-12(setter 面契约:set_enemies/clear_enemies/on_step_row_fx/gray_all_enemies -# 签名稳定——探针与组合根零改造面) -# 结构(Node2D 迁移批——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。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## B 区战斗画面:主角/敌方站桩舞台(SubViewport 世界)+ 轮次·阶段指示 + 结算明细带宿主。 +## 本类零文案装配:结算流水格式化归 BattleLogView、核心状态→文案装配归 HudPresenter——禁在此拼文案字符串。 class_name BattleStageView extends Control diff --git a/game/presentation/views/board_cell_unit.gd b/game/presentation/views/board_cell_unit.gd index 3ef08e50..fb60509c 100644 --- a/game/presentation/views/board_cell_unit.gd +++ b/game/presentation/views/board_cell_unit.gd @@ -1,12 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# CellUnit——BoardView SubViewport 世界内逐格渲染件(Node2D)。 -# 固定叠层序(Node2D 迁移批 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 内主题不自动继承主场景,两舞台复用面)。 -# 行为等价(缺陷①回归约束):格件常驻定长、逐格重绘由 BoardView 驱动,本类零游戏状态——渲染数据 -# 全部由 BoardView 每次 paint 写入(bg_sb/glyph/badge),呼吸微光由 BoardView 就地改 bg_sb 边框。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## CellUnit——BoardView SubViewport 世界内逐格渲染件(Node2D),全部程序化 _draw 占位视觉(纹理槽位已留未装载)。 +## 无 class_name(类名缓存面纪律)——使用方经 preload 引用。 extends Node2D var cell := Vector2i.ZERO # 板坐标(诊断观测面) diff --git a/game/presentation/views/board_fx_view.gd b/game/presentation/views/board_fx_view.gd index 418d2d46..eb255f21 100644 --- a/game/presentation/views/board_fx_view.gd +++ b/game/presentation/views/board_fx_view.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(D 区演出层——清图金粒喷泉+彩纸 3–5s 占位、Boss 紫赤影子爬棋盘 -# 一次性占位、完美排雷金光带+横幅占位、标中旗加重弹道占位;全部程序化色板原语,真实美术归 战斗表现)。 -# Date: 2026-09-12 -# 高内聚边界:纯演出——组合根按核心信号调用 play_*;本类零核心依赖、不自持游戏状态。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## D 区演出层:清图喷泉/Boss 影子/完美排雷光带/标中旗弹道/挥铲三帧等一次性占位演出。 +## 组合根按核心信号直调 play_*;素材缺位静默回退(演出层不设断言面)。 class_name BoardFxView extends Control diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index 224b1a84..aa555326 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -1,23 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(战斗屏 D 区 BoardView——格态/悬停预承诺光标/可挖域呼吸微光/ -# BFS 路径预览/奖励徽章/结算期去饱和锁输入)。 -# Date: 2026-09-12(battle.md 战斗屏改造批;基础 = 2026-09-11 HUD框架-lite 版) -# 棋盘渲染本体 = Control 壳 + SubViewportContainer + SubViewport + BoardWorld(Node2D) + -# CellUnit(Node2D)(Node2D 迁移批)。对外契约: -# 类名/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 + 板级公式单点换算(Node2D 迁移批 Decision 3,_cell_at 为唯一公式函数; -# SubViewportContainer 逻辑分辨率恒等于板像素尺寸(stretch 1:1,无缩放比),换算只需减居中偏移)。 -# 程序化占位视觉:数字三档/旗/徽章/危险红/变异遮蔽 "?"/呼吸微光/悬停/路径预览/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 定长不增删, -# 重建仅在换板时发生)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 战斗屏 D 区棋盘视图:格态渲染、悬停预承诺光标与路径预览、奖励徽章与玩家意图识别(意图经信号外发)。 +## 素材禁 preload——一律 UiKit.load_tex 装载(素材不入 git),任一缺位静默回退程序化平色/字形,不刷错误。 class_name BoardView extends Control diff --git a/game/presentation/views/board_world.gd b/game/presentation/views/board_world.gd index 20636d00..b5ebc7e3 100644 --- a/game/presentation/views/board_world.gd +++ b/game/presentation/views/board_world.gd @@ -1,13 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# BoardWorld——棋盘 Node2D 世界根(SubViewport 内 -# CellUnit 容器)。职责单点:世界级材质挂点(set_desaturated 去饱和挂此处,CellUnit -# use_parent_material 链下随世界灰化)+ 主题/字体显式注入槽位(SubViewport 不自动继承主场景 -# Control 主题(Node2D 迁移批 Negative 项);两舞台共用骨架(Decision 5)。 -# 无 class_name(类名缓存面纪律——BoardView 经 preload 使用)。 -# 板块伪立体绘制(正俯视纸雕风): -# 顶面方格不变(数字可读性硬指标不受伤),厚度全部画在网格矩形外的正面/右侧悬崖带: -# 正面(背光暗)+右侧(微受光)+列分隔缝(ITB 悬崖列感)+岩层横纹+底部悬浮影(厚档)+ -# 顶面接触 AO。零布局/命中改动(悬崖向网格外延展,世界尺寸由 BoardView._update_world_size 加 D)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## BoardWorld——棋盘 Node2D 世界根(SubViewport 内 CellUnit 容器):世界级去饱和材质与字体注入挂点。 +## 无 class_name——使用方经 preload 引用。 extends Node2D var board_font: Font = null # 字体注入槽位(null = ThemeDB.fallback_font——与旧 Button 缺省主题字体同源) diff --git a/game/presentation/views/board_zone_view.gd b/game/presentation/views/board_zone_view.gd index 01385140..9ce7e344 100644 --- a/game/presentation/views/board_zone_view.gd +++ b/game/presentation/views/board_zone_view.gd @@ -1,8 +1,5 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(D 区扫雷图 ~760×548 容器〔底行 548——原 A 区顶栏空间并入〕——顶部 AP 条 44px〔左:点阵+停手; -# 右:图例+弃图刷新〕、棋盘主体居中、toast 槽上缘内侧、演出层)。 -# Date: 2026-09-12 -# 高内聚边界:容器组合 + 信号转发——动作意图全部信号外发到组合根,零核心写调用。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## D 区容器:AP 条+棋盘+toast+演出层+两枚角标的组合壳,子件信号原样转发组合根(组合根只接线一处)。 class_name BoardZoneView extends PanelContainer diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index d11a805f..41798e45 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -1,19 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-21(营地覆盖层呈现;营地统一重排——四柜台并排:树淬炼柜台=树脊柱界面形态=主界面 / -# 锻造工坊柜台〔钥匙门:forge_workshop 点亮前锁定态,点亮=工作间两区六路线行板〕/ -# 秘宝匣柜台〔钥匙门:ks_workshop 点亮前锁定态,点亮=现工坊内容整体迁入——六行+同调装配段+Y 升级行〕/ -# 奖励格图鉴柜台常开独立位;宽度不足横向滚动条;无属性锻造柜台 -# 〔生命唯一入口=树脊柱、攻/AC 唯一入口=锻造工坊路线〕)。 -# 锁定态零副作用纪律:锻造工坊工作间锁定态(钥匙未点亮)开/关零副作用 -# ——零写档、零报错、面板内无任何可交互购买路径(锁定行纯文案;点亮后交互面归行板意图信号)。 -# 信号面/投影契约:buy_requested(attr)〔现仅 Y 刷新升级行消费——装配段双入口之一 Q1 裁乙〕/closed、 -# attune_toggled/tree_buy_requested/tree_fork_toggled、forge_buy_requested/forge_unlock_requested/ -# forge_select_requested(锻造三意图;写口唯一归 MetaProgression 锻造写口族)、 -# open_camp(data)/refresh_camp(data)。 -# 挂接方式:开合与开始层互斥仿设置面先例(开始覆盖层非模态且树序在后——打开本层前由组合根 -# 隐藏开始层,规范 2.3 遮挡纪律)。 -# 高内聚边界:纯视图 setter 面——账本快照经组合根喂入(MetaProgression 只读投影),购买/关闭 -# 意图经信号外发——零核心写调用、零 MetaProgression 持有。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 营地覆盖层:树淬炼/锻造工坊/秘宝匣/奖励格图鉴四柜台只读投影,购买与切换意图经信号外发。 +## 柜台锁定态(钥匙未点亮)开/关零副作用——零写档零报错、锁定行纯文案无可交互购买路径。 +## 开合与开始层互斥归组合根承接(打开前隐藏开始层)。 class_name CampOverlay extends Control diff --git a/game/presentation/views/career_overlay.gd b/game/presentation/views/career_overlay.gd index fb6e845e..16ec0211 100644 --- a/game/presentation/views/career_overlay.gd +++ b/game/presentation/views/career_overlay.gd @@ -1,16 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 生涯覆盖层·只读全屏页(期一;设计权威 design/gdd/systems/跨局循环/生涯.md 期一范围)。 -# 呈现口径:汇总段两类六项(冒险总局数/通关局数/各关通关次数/Boss 首杀/Boss 总击杀/ -# 钥石余额——逐行只读;不统计天赋树与账号成长态,只统计终身计数);登记 modal_stack -# 营地同档(设置层旁、确认弹窗之前——登记序=树序=z 序,组合根 addChild 同位);零跳转 -# (页内零「前往他处」入口,仅只读展示+关闭)+局内不放生涯入口(开始覆盖层「营地与系统」组唯一入口)。 -# 期二/期三内容(历史回看/图鉴/单局明细)零触碰——页内无任何期二占位件。 -# 只读契约:数据快照由组合根 open_career 喂入(每次开层实时读 SaveManager -# 计数访问器 + MetaProgression 访问器重建——状态面板 R4 同构,快照仅单次开层生命周期,跨开层 -# 零持有);本类零核心访问、零写通路——唯一信号 closed(关闭意图,组合根经模态栈单口收口)。 -# 零动效(状态面板 P4 甲先例同款):直开直关,无 tween 无 AnimationPlayer。 -# R1 公共件单点:全部构成件经 UiKit 工厂产出(page_shell/label/button/keystone_badge), -# 零新素材零新色值零新字体零自建样式。页壳=page_shell 暖亮底(商店同壳——主菜单页族形态)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 生涯页·只读全屏页:跨局终身计数汇总(不统计天赋树与账号成长态)。 +## 入口唯一在开始覆盖层「营地与系统」组、局内不放;页内零跳转零动效(直开直关)。 +## 构成件全部经 UiKit 工厂产出——禁新素材/新色值/自建样式。 class_name CareerOverlay extends Control diff --git a/game/presentation/views/confirm_dialog.gd b/game/presentation/views/confirm_dialog.gd index 343e1325..a45435ae 100644 --- a/game/presentation/views/confirm_dialog.gd +++ b/game/presentation/views/confirm_dialog.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-29(迭代 8 二轮修改批 A——新冒险互斥确认弹窗化,用户目检裁决: -# 按钮文字换面 → 实底确认弹窗「开新冒险 + 取消」) -# 通用确认弹窗(实底石板皮面板,与营地/设置/图例同族视觉):open(text, confirm_label, cancel_label) -# 双钮外发 confirmed/cancelled——语义装配归调用方,本类零业务触碰(纯视图边界规范 1.3)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 通用确认弹窗:open(text, confirm_label, cancel_label) 双钮外发 confirmed/cancelled。 +## 文案与按钮语义装配归调用方——本类零业务触碰。 class_name ConfirmDialog extends Control diff --git a/game/presentation/views/curio_pick_overlay.gd b/game/presentation/views/curio_pick_overlay.gd index ec5a323e..2a27ee9e 100644 --- a/game/presentation/views/curio_pick_overlay.gd +++ b/game/presentation/views/curio_pick_overlay.gd @@ -1,10 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-10-01(三选一选择面承载) -# 提升三选一覆盖层(模态):非末关通关的选择停点呈现——部分回血反馈 + 三卡点选 + 确认兑付。 -# 高内聚边界:文案拼装归 Narrator(组合根喂入),选择意图经信号外发;视图零核心引用。 -# 交互范式 = node_overlay choice_box 按钮族 + 选路两段式(点选→确认)复用,零新原语。 -# 状态机:pick(三卡点选→确认)→ result(兑付反馈→继续)。无 replace 子态—— -# 装配不可变契约 1(冒险中零更换途径)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 提升三选一覆盖层(模态):通关停点的三卡点选→确认→兑付反馈两态呈现。 +## 文案拼装归 Narrator 经组合根喂入——本类零文案装配。 class_name CurioPickOverlay extends Control diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index ab7a54e9..58e037eb 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -1,14 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-10-04(主菜单调试三散件(随机种子/角色数值调整板/两层调试入口)收一张调试浮窗) -# 开发调试浮窗:全局可开(调试会话恒开,启动即开〔组合根 _ready〕+战斗屏 HUD/关卡地图屏 -# 两枚角标再开;遮挡语义=ModalStack 登记制:他模态开时暂隐、关后自动恢复)。 -# 当局数据只读区块=本局种子唯一查看位(六项)。 -# 列表页形态可扩展:后续调试项按区块往下追加,超高滚动。 -# 纯视图边界(规范 1.3):数值应用/批量模拟/对局启动全部经信号外发由组合根承接 -#(apply_requested / simulate_requested / debug_levels_requested / closed); -# 当局数据经 update_run_data setter 喂入(只读投影零回读);模拟进度与报告经 setter 注入—— -# 零核心写、不拼报告文案(装配归 HudPresenter)。零动效(零 tween/AnimationPlayer)。 -# 探针接缝(合成输入走真实翻译出口口径):press_apply_for_probe 等三键 = 按钮真实信号路径。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 开发调试浮窗:全局可开(组合根启动即开+两屏角标再开),当局数据只读区块为本局种子唯一查看位。 +## 扩展调试项按区块往下追加(超高滚动);模拟报告文案装配归 HudPresenter——本类零动效零文案装配。 class_name DebugOverlay extends Control diff --git a/game/presentation/views/hero_info_panel_view.gd b/game/presentation/views/hero_info_panel_view.gd index 402022ae..8d3c4bad 100644 --- a/game/presentation/views/hero_info_panel_view.gd +++ b/game/presentation/views/hero_info_panel_view.gd @@ -1,12 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 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 -# 高内聚边界:纯视图 setter 面——装配(含修正文案/AC 投喂)归 hud_presenter.gd;定长槽 + clip_contents -# (缺陷①回归约束)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## C 区角色信息面板:攻击/AC 数据框+秘宝槽+特性持有段(空态隐藏)。 +## 装配与文案(修正来源角标/AC 投喂)归 HudPresenter——本类零文案装配。 class_name HeroInfoPanelView extends PanelContainer diff --git a/game/presentation/views/legend_overlay.gd b/game/presentation/views/legend_overlay.gd index d0b02333..bef302d1 100644 --- a/game/presentation/views/legend_overlay.gd +++ b/game/presentation/views/legend_overlay.gd @@ -1,9 +1,5 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(D 区图例按钮 + 模态 overlay——格态语义图例; -# 状态槽空态说明成文载入〔增益状态 D1×①〕)。 -# Date: 2026-09-12 -# pattern 6 模态 overlay 层级纪律:打开时由组合根隐藏上方遮挡层 + 锁棋盘输入; -# 本类自持开关(open/close),探针断言"打开后自身 visible"——遮挡物断言归场景探针。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 格态语义图例模态(自持 open/close 开关)。 class_name LegendOverlay extends Control diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 900dcf9f..43fcd160 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -1,17 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 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)做渲染,无任何写面;图形为程序化占位质量(占位纪律)。 -# 放弃入口:选路停点 = 天然非战斗期(接口契约:战斗中放弃一律拒绝),按钮常驻底栏右端; -# 可见性归组合根(只在冒险模式开——放弃的语义对象是"整局冒险";调试两层无节点图天然不可达)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 关卡画面·独立屏:全屏不透明独占呈现(激活期战斗屏宿主由组合根整体隐藏),节点图选路呈现。 +## 前进唯一通道=图上点候选节点(route_chosen 外发)——零自动推进;放弃入口可见性归组合根(仅冒险模式开)。 class_name LevelMapScreen extends Control diff --git a/game/presentation/views/node_overlay.gd b/game/presentation/views/node_overlay.gd index 59554438..e82f854c 100644 --- a/game/presentation/views/node_overlay.gd +++ b/game/presentation/views/node_overlay.gd @@ -1,7 +1,5 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-11 -# 关卡节点覆盖层(模态):奖励点/恢复点兑付结果的确认呈现。 -# 高内聚边界:节点文案的玩家可读化(谁获得什么/回复多少)内聚于此;"继续"意图经信号外发。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 关卡节点覆盖层(模态):奖励点/恢复点兑付结果的确认呈现;节点文案的玩家可读化内聚于此。 class_name NodeOverlay extends Control diff --git a/game/presentation/views/settings_overlay.gd b/game/presentation/views/settings_overlay.gd index 6130b5c0..20bf369b 100644 --- a/game/presentation/views/settings_overlay.gd +++ b/game/presentation/views/settings_overlay.gd @@ -1,9 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-29(最小设置面) -# 设置覆盖层(纯视图边界规范 1.3 同款):音量滑杆/全屏/减动效三件+返回(退出游戏已提级开始菜单)。 -# 生效与持久化全经 SettingsStore 单点(实时应用+即改即存);本类零核心触碰。 -# 减动效开关 = 设置面唯一入口(旧测试调整板开关已移除)。 -# 探针接缝:retarget(store) = 隔离存档换注口(同 camp 换注先例);控件引用公有只读供断言。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 设置覆盖层:音量/全屏/减动效三件+返回;生效与持久化全经构造注入的 SettingsStore——本类零落盘。 +## 减动效开关唯一入口在设置面;探针/冒烟经 retarget(store) 换注隔离存档,禁碰真实 user://settings.cfg。 class_name SettingsOverlay extends Control diff --git a/game/presentation/views/settlement_fx_view.gd b/game/presentation/views/settlement_fx_view.gd index f7d47588..31a6fef8 100644 --- a/game/presentation/views/settlement_fx_view.gd +++ b/game/presentation/views/settlement_fx_view.gd @@ -1,12 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(§Transitions 结算逐行兑现——B 区因果演出链骨架: -# 结算轮光带自棋盘区横扫 → 伤害/治疗弹道自棋盘飞向敌我站桩 → 受击闪白与血条递减由站桩侧承接)。 -# 位置语义:全屏覆盖层(A–D 区之上、模态之下),只做跨区飞行的演出载体——棋盘区内演出 -# (清图金粒/完美排雷横幅/标中旗弹道/Boss 影子)仍归 board_fx_view。 -# 高内聚边界:纯演出——组合根按结算信号调用 play_*,传全局坐标(组合根持有棋盘与站桩两域句柄); -# 本类零核心依赖、不自持游戏状态、mouse_filter 全忽略(不劫持输入)。 -# 动画密度/缓动曲线归战斗表现样张批终稿——本批落"因果全程可见"骨架(规划兑现 P2 义务)。 -# Date: 2026-09-20(结算演出链批) +## VERTICAL SLICE - NOT FOR PRODUCTION +## 结算演出层:跨区弹道/光带等结算兑现演出载体(A–D 区之上、模态之下);棋盘区内演出归 BoardFxView。 +## 组合根按结算信号调 play_* 传全局坐标;mouse_filter 全忽略不劫持输入。 class_name SettlementFxView extends Control diff --git a/game/presentation/views/settlement_review_overlay.gd b/game/presentation/views/settlement_review_overlay.gd index 8f74bcc2..7cb886f5 100644 --- a/game/presentation/views/settlement_review_overlay.gd +++ b/game/presentation/views/settlement_review_overlay.gd @@ -1,7 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(B 区结算明细回看——模态 overlay:完整流水逐行、只读、关闭恢复; -# pattern 6 模态 overlay 层级纪律——打开时组合根隐藏上方遮挡层 + 锁棋盘输入,场景级断言承载)。 -# Date: 2026-09-12 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 结算明细回看模态:完整流水逐行只读呈现。 +## 流水 BB 文本经 open() 整段喂入——本类零格式化,格式化规则归 BattleLogView。 class_name SettlementReviewOverlay extends Control diff --git a/game/presentation/views/shop_overlay_view.gd b/game/presentation/views/shop_overlay_view.gd index 1b4b4c41..3e71ea77 100644 --- a/game/presentation/views/shop_overlay_view.gd +++ b/game/presentation/views/shop_overlay_view.gd @@ -1,13 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-21(GP+商店房实施批——商店房覆盖层呈现) -# 商店覆盖层(模态):标题「商店」/ 金币余额 / 商品卡陈列 / 购买按钮(余额不足禁用置灰)/ 离开按钮。 -# 模态挂接方式仿既有覆盖层(legend_overlay 现成参照——dim + CenterContainer + box,组合根 -# _register_modal 收口层级)。 -# 双面承载(M-4 迭代 11 第②批 T4):legacy 面 = 三商品卡全陈列(open_shop/refresh_state——shop=off -# 对照承载原样保留);pool 面 = 共享池货架三选一同构卡(open_shelf——进店抽 3 + 买 1 全重抽反馈 + -# 库存余量就近呈现,买后组合根重投喂货架整架重建)。高内聚边界:纯视图 setter 面——商品/货架快照 -# 与余额经组合根喂入(runner 投影现算现价,视图零复算定价公式),购买/离开意图经信号外发—— -# 零核心写调用、零 runner 持有。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 商店覆盖层(模态):legacy 固定三件面与 pool 共享池货架面双承载,购买/离开/刷新意图经信号外发。 +## 商品/货架快照与余额经组合根投喂(现价=runner 投影)——本类零定价复算。 class_name ShopOverlay extends Control diff --git a/game/presentation/views/stage_world.gd b/game/presentation/views/stage_world.gd index 206d13d4..4ba4cb5e 100644 --- a/game/presentation/views/stage_world.gd +++ b/game/presentation/views/stage_world.gd @@ -1,13 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# StageWorld——B 区战斗舞台 Node2D -# 世界根(SubViewport 内站桩本体容器)。分工:Node2D = D 区棋盘 + B 区战斗舞台; -# 与 BoardWorld 同构。职责单点:主题/字体显式注入槽位(SubViewport 不自动继承主场景 -# Control 主题(2026-09-12 场景结构裁决);set_world_font 同款挂点,null = ThemeDB.fallback_font 与 -# 旧 Label 缺省主题同源)+ 站桩本体装载面。无 class_name(类名缓存面纪律—— -# BattleStageView 经 preload 使用)。 -# 坐标空间钉死:世界内 = 局部排布坐标(SubViewport 逻辑分辨率 = -# 壳层像素 1:1,无缩放系数——C2/C5);壳层/fx 层 = 全局含容器偏移,换算单点在 -# BattleStageView.world_to_shell()。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## StageWorld——B 区战斗舞台 Node2D 世界根(SubViewport 内站桩本体容器,与 BoardWorld 同构)。 +## 无 class_name——经 preload 引用;世界内坐标=局部排布,壳层/fx 坐标换算单点在 BattleStageView.world_to_shell()。 extends Node2D var world_font: Font = null # 字体注入槽位(null = ThemeDB.fallback_font——BattleStageView.set_world_font 注入) diff --git a/game/presentation/views/standee_body.gd b/game/presentation/views/standee_body.gd index a9e368d7..7c1367b0 100644 --- a/game/presentation/views/standee_body.gd +++ b/game/presentation/views/standee_body.gd @@ -1,20 +1,7 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(B 区全站桩形态——主角与敌人均为无框立绘+底座, -# 英雄卡/敌人卡卡片式整体退役禁再提)。 -# 站桩本体 = Node2D 世界精灵(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)。 -# 表现基线(C9):立绘贴图(flip/NEAREST/整数 2× 档)+ 底座 + 血条 -# (直角递减 tween)+ 顺位徽标 + 意图徽标(弹入+立绘前倾一次性动画)+ 名字行(纯名+护甲类型 -# 图标——AC 不展示)+ 受击闪白 + 死亡灰化摇摆塌陷(禁瞬消)+ 复活 + 字形占位 -# 回退(人/▂/▆/█/✕/敌)。代拍板默认:①状态图标行(slot_row)与悬停 tooltip 保留 -# Control 载体挂壳层(tooltip 机制零返工)——本体的 slot_row 成员 = 壳层伴随件引用; -# ②状态行隐藏时序 = 随 mark_dead 同拍隐藏;③清空反馈微文案挂伴随件父层(壳层)。 -# 文字全部经 draw_string + 世界字体(world.world_font 或 ThemeDB.fallback_font——C6 挂点链)。 -# 坐标空间:本节点 position/box = SubViewport 世界内局部排布;壳层换算归 -# BattleStageView.world_to_shell 单点(C4)。 -# 无 class_name(类名缓存面纪律——BattleStageView 经 preload 使用)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 站桩本体:B 区主角/敌人无框立绘+底座+血条+顺位/意图徽标的世界精灵(Node2D)。 +## 站桩形态为定案——禁回卡片式;立绘素材缺位回退字形占位;击杀呈现禁瞬消(灰化塌陷)。 +## 无 class_name——经 preload 引用;壳层坐标换算单点在 BattleStageView.world_to_shell()。 extends Node2D const CHARGE_SKILL_IDS := ["heavy"] diff --git a/game/presentation/views/status_panel.gd b/game/presentation/views/status_panel.gd index 3cc6cc6d..c1f1885f 100644 --- a/game/presentation/views/status_panel.gd +++ b/game/presentation/views/status_panel.gd @@ -1,13 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 局内状态面板·只读。 -# 呈现口径:入口为战斗屏 HUD / 关卡地图屏常驻角标(入口装配在 ui_assembler/两屏,本类不含入口); -# 登记 modal_stack 设置层同档(确认弹窗之前)带 dim 遮罩;展示钥石余额+进度概览 -# (道具工坊六件解锁态 / 天赋树已购概览——层内行序与分组复用营地屏同序;无属性锻造段); -# 进出零动效直开直关(无 tween 无 AnimationPlayer——R5)。 -# 只读契约:R4 数据只读同源——账面快照由组合根 open_status 喂入(每次开层实时读 MetaProgression -# 访问器重建,快照仅用单次开层生命周期,跨开层零持有);本类零核心访问、零写通路——唯一信号 -# closed(关闭意图,组合根经模态栈单口收口)。R1 公共件单点:全部构成件经 UiKit 工厂产出 -#(modal_shell/panel_skinned/label/button/keystone_badge),零裸色值零自建样式。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 局内状态面板·只读:钥石余额与进度概览(入口=两屏角标,本类不含入口)。 +## 账面快照由组合根 open_status 喂入;进出零动效直开直关;构成件全部经 UiKit 工厂产出——禁裸色值自建样式。 class_name StatusPanel extends Control diff --git a/game/presentation/views/status_slot_row.gd b/game/presentation/views/status_slot_row.gd index cba41883..6c9cc994 100644 --- a/game/presentation/views/status_slot_row.gd +++ b/game/presentation/views/status_slot_row.gd @@ -1,12 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(C 区状态效果槽 ×4〔增益状态 D1×①〕——effect_id→定稿 PNG 纹理图标、 -# 层数角标、剩余结算次数点、悬停 tooltip(来源+语义+剩余);空态 = 槽隐藏(数据框上移补位, -# EC12 空态裁决);极性映射 = 战斗结算 SettlementTable 效果语义而非 magnitude 符号〔增益状态 D1×③〕)。 -# 图标 = 定稿九枚 PNG -# (白剑/白盾/白眼+绿↑红↓箭头语言,圣经 §4.6.1 纹样系统)自带极性,裸图标呈现;无程序化占位字形。 -# Date: 2026-09-12 -# 高内聚边界:纯视图——效果投影装配归 hud_presenter.gd;增益状态 纯被动容器零信号——刷新绑 战斗结算 -# 结算编排完成时点(battle.md 更新触发注记)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 状态效果槽行:效果图标+层数角标+剩余点+悬停 tooltip;空态整行隐藏不占位。 +## 极性映射=战斗结算效果语义(非 magnitude 符号);效果投影装配归 HudPresenter,本类纯被动零信号。 class_name StatusSlotRow extends HBoxContainer diff --git a/game/presentation/views/toast_stack.gd b/game/presentation/views/toast_stack.gd index 0bc4e2ed..0f8e9fd3 100644 --- a/game/presentation/views/toast_stack.gd +++ b/game/presentation/views/toast_stack.gd @@ -1,8 +1,6 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# 实现 GDD:design/ux/battle.md(D 区 toast 槽——非模态提示:拒绝原因双源/voided/chord/ -# 零合法板;自动消退 2.5s;pattern 1/10 呈现通道)。 -# Date: 2026-09-12 -# 高内聚边界:纯呈现——组合根决定何时弹什么文案;本类只管槽位堆叠与消退动画。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 非模态 toast 槽:三槽堆叠自动消退(2.5s),info/warn/gold 三调性。 +## 弹什么文案归组合根决定——本类只管槽位堆叠与消退,不做提示内容决策。 class_name ToastStack extends Control diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index c980577f..38f50d32 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -1,7 +1,5 @@ -# VERTICAL SLICE - NOT FOR PRODUCTION -# Date: 2026-09-11(2026-09-20 样式收敛批:全站色板与 StyleBox 工厂单点化) -# 呈现层共享小部件工厂 + 全站取色/描边唯一出口——各视图禁再内联 Color8/StyleBoxFlat -# 字面量;美术批换皮只改本文件(值 = 收敛时各视图现值快照,本批零视觉变化)。 +## VERTICAL SLICE - NOT FOR PRODUCTION +## 呈现层共享小部件工厂+全站取色/描边唯一出口——各视图禁内联 Color8/StyleBoxFlat 字面量,换皮只改本文件。 class_name UiKit extends RefCounted diff --git a/tools/verify_comment_only_change.py b/tools/verify_comment_only_change.py new file mode 100644 index 00000000..216bdea1 --- /dev/null +++ b/tools/verify_comment_only_change.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""verify_comment_only_change.py — 纯注释批次零行为变更机器证明。 + +对 git 工作区相对 HEAD 的每个改动 .gd(game/core、game/data、game/presentation): +剥离文件头注释区(首个非注释代码行前的全部空行/注释行)后,新旧剩余内容必须逐行一致—— +证明改动只发生在文件头注释区,代码行为零变更。头注清偿/载体换代一类纯注释批的交付验收 +配套(code-conventions §1.4.1)。 +退出码:0=全部通过,1=存在头注区外的改动。用法:python tools/verify_comment_only_change.py +""" +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent + + +def strip_header(lines): + """剥掉头注区(首个非注释非空行前的全部空行/注释行),返回剩余行列表。""" + i = 0 + while i < len(lines): + s = lines[i].strip() + if s == "" or s.startswith("#"): + i += 1 + else: + break + return lines[i:] + + +def main(): + out = subprocess.run( + ["git", "diff", "--name-only", "HEAD", "--", "game/core", "game/data", "game/presentation"], + cwd=ROOT, capture_output=True, text=True, check=True).stdout.split() + if not out: + print("[verify_comment_only] 无改动文件") + return 0 + bad = [] + for rel in out: + rel = rel.replace("\\", "/") + old = subprocess.run(["git", "show", "HEAD:" + rel], + cwd=ROOT, capture_output=True, text=True, check=True).stdout + new = (ROOT / rel).read_text(encoding="utf-8") + if strip_header(old.splitlines()) != strip_header(new.splitlines()): + bad.append(rel) + if bad: + for rel in bad: + print("[verify_comment_only] FAIL 头注区外内容被改动: " + rel) + return 1 + print("[verify_comment_only] ok: %d 个改动文件头注区外逐行一致(零行为变更)" % len(out)) + return 0 + + +if __name__ == "__main__": + sys.exit(main())