架构收窄批第4步(oracle重锚): 32处 architecture.md 行号锚改节锚形态+2处代码头注变更叙事尾巴删除。锚映射: :10×3→test-conventions「测试层三元组」(判据owner); :89×4→「模块归属·基础层」effect_engine 行; :90×6→RngService 行; :103→minesweeper_rules 行; :107×8→CurioDeck 行; :144×8→「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort); :168×4→「模块归属·呈现层」D1 行(screen_flow_probe 两处→「呈现层装配与会话生命周期」节); smoke_boot 组名旧口径「四级」改「三元组」。头注: battle_orchestrator _fx_host/_reward_grant 删「拆件定稿轴件一/二」尾巴, attune_loadout 头注删「冒险域拆分姊妹批迁移」尾巴。凭据: 冒烟 PASS(15检查0失败三闸全过)+单元选跑 13套件 all green(纯注释改动, 受影响面覆盖)

This commit is contained in:
DKChan committed 2026-11-07 07:58:57 +08:00
1 parent 74e981a5a3
commit 79c077eb9d
18 files changed
+35 -35

No files matched your search

+1 -1
View File
@@ -1,4 +1,4 @@
## 同调配装件:装备中的秘宝件对象集唯一所有者(每件内含充能单位与重置周期——冒险域拆分姊妹批自共享充能账字典轨迁移)。
## 同调配装件:装备中的秘宝件对象集唯一所有者(每件内含充能单位与重置周期)。
## 同调充能单源化:物化行(treasure_inventory 内 source_class="attunement" 行)为使用面唯一事实源——
## 剩余次数由行的未用数派生(唯一读法,无影子账);字典轨与三处事后差额对账退役,改「写时种行/补行」。
## 种行/补行写时同步:冒险开始全量种行(不筛周期——battle/level 周期件开局即有行,C 区投影行数不变);
+2 -2
View File
@@ -49,8 +49,8 @@ var _enemy_system: UnitContainer
var _status_effects: StatusContainer
var _reward_economy: RewardEconomy
var _damage: DamageController # 伤害控制器(单据唯一兑付管线)
var _fx_host: BattleFxHost # 效果引擎宿主件(fx 族持有与兑付——拆件定稿轴件一)
var _reward_grant: RewardGrant # 奖励授予件(授予管线与秘宝使用——拆件定稿轴件二)
var _fx_host: BattleFxHost # 效果引擎宿主件(fx 族持有与兑付)
var _reward_grant: RewardGrant # 奖励授予件(授予管线与秘宝使用)
var round_index := 0
var battle_result := "" # "" / "victory" / "defeat" / "fatal_error"
+2 -2
View File
@@ -76,14 +76,14 @@ func _seals_text(f: Dictionary) -> String:
# ---- 流程状态位(与可见性是两回事,逐步单独判)----
func _expect_adventure_seal(step: String, expect: bool) -> void:
# oracle: design/engineering/architecture/architecture.md:168 (状态位判据组)
# oracle: design/engineering/architecture/architecture.md「呈现层装配与会话生命周期」 (状态位判据组)
var got: bool = main.run_scope != null and main.run_scope.is_adventure
if got != expect:
_problems.append("%s:流程状态位 is_adventure 应为 %s,实测 %s" % [step, str(expect), str(got)])
func _expect_exclusive(step: String, expect: String) -> void:
# oracle: design/engineering/architecture/architecture.md:168 (屏级互斥组)
# oracle: design/engineering/architecture/architecture.md「呈现层装配与会话生命周期」 (屏级互斥组)
var f: Dictionary = _screen_seals()
var pairs := [["菜单", "营地"], ["菜单", "冒险"], ["营地", "冒险"], ["终局", "营地"], ["终局", "菜单"]]
for pair in pairs:
+1 -1
View File
@@ -743,7 +743,7 @@ func _in_scroll(c: Control) -> bool:
func _audit(screen: String, roots: Array) -> void:
# oracle: design/engineering/architecture/architecture.md:168 组合根交接面与呈现装配——屏结构审计宿主面(结构审计组)
# oracle: design/engineering/architecture/architecture.md「模块归属·呈现层」D1 行(组合根交接面) 组合根交接面与呈现装配——屏结构审计宿主面(结构审计组)
for r in roots:
if r != null and is_instance_valid(r):
_force_layout(r)
+1 -1
View File
@@ -199,7 +199,7 @@ func _ready() -> void:
_overlay_zero_motion_contract(main, problems)
# ⑩ 种子三分单点断言(18卡⑦ C1——判定只落 _seed_value() 单点;对局态不影响本判定面):
# 显式合法整数全场景优先(含首局)→ 首局(存档布尔 false)恒 42 → 非首局空框引擎熵连抽不全等 42
# oracle: design/engineering/architecture/architecture.md:168 seed_value=组合根公开服务面(⑩种子三分判定单点组)
# oracle: design/engineering/architecture/architecture.md「模块归属·呈现层」D1 行(组合根交接面) seed_value=组合根公开服务面(⑩种子三分判定单点组)
main.ui.modals.menu.debug_overlay.seed_edit.text = "777"
if main.seed_value() != 777:
problems.append("显式种子输入未优先(_seed_value != 777——C1 ①失守)")
+3 -3
View File
@@ -16,7 +16,7 @@ var _checks: int = 0
func check(cond: bool, label: String) -> void:
# oracle: design/engineering/architecture/architecture.md:10 (测试层级四级——冒烟存活检查组)
# oracle: design/engineering/test-conventions.md「测试层三元组」冒烟测试行 (测试层三元组——冒烟存活检查组)
_checks += 1
if cond:
print(" [PASS] " + label)
@@ -35,7 +35,7 @@ func _ready() -> void:
# 开机前置面:autoload 注册与资源可加载(挂主屏之前先查,失败时主屏断言整段跳过)
func _check_autoloads() -> void:
# oracle: design/engineering/architecture/architecture.md:10 (测试层级四级——冒烟存活检查组)
# oracle: design/engineering/test-conventions.md「测试层三元组」冒烟测试行 (测试层三元组——冒烟存活检查组)
for autoload_name in ["ConfigDB", "RngService", "SaveManager", "MetaProgression"]:
var node: Node = get_node_or_null(NodePath("/root/" + autoload_name))
check(node != null, "autoload %s 在位" % autoload_name)
@@ -64,7 +64,7 @@ func _boot_main_scene() -> Node:
# 主屏存活面:组合根装配句柄在位(main.X 一级句柄契约,探针挂载假设的启动侧证明)
func _check_main_scene(main: Node) -> void:
# oracle: design/engineering/architecture/architecture.md:10 (测试层级四级——冒烟存活检查组)
# oracle: design/engineering/test-conventions.md「测试层三元组」冒烟测试行 (测试层三元组——冒烟存活检查组)
check(main != null and main.is_inside_tree(), "主屏场景已实例化并在树")
if main == null:
return
@@ -19,7 +19,7 @@ var _db
func _init() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (效果端口宿主——装载组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (效果端口宿主——装载组)
_db = ConfigDBScript.new()
var load_ok: bool = _db.load_tables("res://data/tables", true)
Kit.check("前置:表加载零 error", load_ok and _db.diagnostics_count("error") == 0)
@@ -54,7 +54,7 @@ func _hero_attack_value(rows: Array) -> int:
# ---- V1 端口单实例与真实发射路由 ----
func _smoke_effect_port_wiring() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (端口单实例与六 Callable 路由组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (端口单实例与六 Callable 路由组)
print("--- 效果端口:装配链单实例+真实发射路由 ---")
# 充能跑(蓄力周转 charge_rotation 在册——attack_commit 订阅行 attack_bonus per 蓄力周转计数器)
var orch_c = _orch(TEST_SEED)
@@ -88,7 +88,7 @@ func _smoke_effect_port_wiring() -> void:
# ---- V2 业务类零引擎直连(源码契约锚——theme_projection_test 源码锚惯例)----
func _test_business_classes_engine_free() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (业务类零引擎直连组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (业务类零引擎直连组)
print("--- 效果端口:业务类零引擎直连源码锚 ---")
for path in ["res://core/damage_controller.gd", "res://core/action_economy.gd"]:
var src := FileAccess.get_file_as_string(path)
@@ -100,7 +100,7 @@ func _test_business_classes_engine_free() -> void:
# ---- V3 伤害域事实面闭集(合成行两对照——damage_taken 真实单据流)----
func _test_biz_fact_face_closed() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (闭面四键 biz_fact 组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (闭面四键 biz_fact 组)
print("--- 效果端口:业务发射事实面闭集 ---")
var orch = _orch(TEST_SEED)
Kit.check("V3 begin_battle 受理", orch.begin_battle(_enc([])))
@@ -41,8 +41,8 @@ func _init() -> void:
# ---- B1 兑付配方词表:五配方/三目标规则/双结账政策——常量非空且互异(封闭枚举负空间) ----
func _test_damage_controller_vocabularies() -> void:
# oracle: design/engineering/architecture/architecture.md:89 (事件/事实/效果类型/算子四词表封闭——契约词表组)
# oracle: design/engineering/architecture/architecture.md:89 (事件/事实/效果类型/算子四词表封闭——契约词表组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 (事件/事实/效果类型/算子四词表封闭——契约词表组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 (事件/事实/效果类型/算子四词表封闭——契约词表组)
var kinds: Array = [
DamageControllerScript.KIND_HERO_ATTACK, DamageControllerScript.KIND_ENEMY_SKILL,
DamageControllerScript.KIND_BOARD_TYPED, DamageControllerScript.KIND_BOARD_BLAST,
@@ -72,8 +72,8 @@ func _test_damage_controller_vocabularies() -> void:
# ---- D2↔B1:掷点用途标签 ∈ RngService 封闭词表(EC12——跨系统字面量契约的成员性断言) ----
func _test_rng_tag_closure(db) -> void:
# oracle: design/engineering/architecture/architecture.md:90 (流 scope 封闭词表组)
# oracle: design/engineering/architecture/architecture.md:90 (流 scope 封闭词表组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 (流 scope 封闭词表组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 (流 scope 封闭词表组)
var stream_label: String = String(db.combat.settlement.damage_roll.armor_roll_stream)
Kit.check("settlement.armor_roll_stream ∈ RngService 封闭标签词表(EC12)",
RngServiceScript.PURPOSE_TAGS.has(stream_label))
@@ -55,7 +55,7 @@ func _init() -> void:
# ① 缺省两参(真编排器):同种子两跑整轮驱动逐位(确定性自证——动作序列快照经 cell_revealed 事件流)
func _smoke_drive_round_contract() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (效果端口件:收事件交结算取回命中批——驱动循环契约组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (效果端口件:收事件交结算取回命中批——驱动循环契约组)
var db = load("res://core/config_db.gd").new()
var load_ok: bool = db.load_tables("res://data/tables", true) and db.diagnostics_count("error") == 0
Kit.check("前置:表加载零 error", load_ok)
@@ -81,7 +81,7 @@ func _smoke_drive_round_contract() -> void:
# ② provider 形态:策略回调产出 dig/seal_place/refresh 各一——提交与日志回调四元组在案
func _provider_shapes() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (端口应答束形状组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (端口应答束形状组)
var st := _StubSettlement.new()
var script := [ {"kind": "dig", "cell": Vector2i(1, 1)}, {"kind": "seal", "cell": Vector2i(2, 2)}, {"kind": "refresh"}, {"kind": "stop"} ]
var logs: Array = []
@@ -102,7 +102,7 @@ func _provider_shapes() -> void:
# ③ max_rejects:策略恒返被拒动作——第 3 拒后停手出环(循环次数=3)
func _max_rejects() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (拒绝通道组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (拒绝通道组)
var st := _StubSettlement.new()
st.minesweeper.accept = false
st.minesweeper.reject_cells = {Vector2i(9, 9): true}
@@ -122,7 +122,7 @@ func _max_rejects() -> void:
# ④ 合步 next:move 后相位变更即断弃 dig(桩 on_submit 钩子把 phase 推离 Active)
func _combined_step_next() -> void:
# oracle: design/engineering/architecture/architecture.md:144 (合并步进组)
# oracle: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (合并步进组)
var st := _StubSettlement.new()
st.minesweeper.on_submit = func(action: String) -> void:
if action == "move":
@@ -8,7 +8,7 @@ const Kit := preload("res://tests/unit/test_kit.gd")
func _init() -> void:
# oracle: design/engineering/architecture/architecture.md:107 (CurioDeck:三选一/商店共享池、抽签、cap 库存——刷新付费组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (CurioDeck:三选一/商店共享池、抽签、cap 库存——刷新付费组)
var db = load("res://core/config_db.gd").new()
if not db.load_tables("res://data/tables", false):
print("[curio_refresh_paid_test] FAIL — 数值表加载失败")
+1 -1
View File
@@ -11,7 +11,7 @@ const EffectEngineScript = preload("res://core/effect_engine.gd")
func _init() -> void:
# oracle: design/engineering/architecture/architecture.md:89 (效果词表封闭——扩签封闭性组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 (效果词表封闭——扩签封闭性组)
# ① 词表在册断言(扩签面:2 事件+8 事实+7 效果类型+1 算子)
Kit.check_quiet(EffectEngineScript.EVENTS.has("dig_stop") and EffectEngineScript.EVENTS.has("battle_won"),
"新事件在册:dig_stop/battle_won〔专长批 V1〕")
@@ -1254,7 +1254,7 @@ func _paths_all_one_shop(nodes: Array) -> bool:
# ---- ⑤ 商店共享池(三选一同构/乘法价/跨渠道共账/切边/断点扩键)----
func _smoke_shop_pool() -> void:
# oracle: design/engineering/architecture/architecture.md:107 (商店共享池组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (商店共享池组)
print("--- 商店共享池(抽3买1全重抽 · 乘法定价 ceil · 池空硬闸 · 切边零入店)---")
var autoplay = load("res://sim/level_autoplay.gd")
var shelf_kinds: Array = []
@@ -122,7 +122,7 @@ func _test_reject_out_of_catalog() -> void:
# ---- V14 棋盘揭示预览只读口(架构整改——preview_reveal 与实挖揭示集同口径、零状态写入零事件)----
func _test_preview_reveal_readonly() -> void:
# oracle: design/engineering/architecture/architecture.md:103 (preview_reveal 只读预览口——零写入零事件组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」minesweeper_rules 行 (preview_reveal 只读预览口——零写入零事件组)
var events := 0
_rules.cell_revealed.connect(func(_evt): events += 1) # 零发射哨兵(preview 全程不触发揭示事件)
# 形态 A:封印在场——preview(未开格) 不越封印且零状态写入
+5 -5
View File
@@ -9,7 +9,7 @@ const Kit := preload("res://tests/unit/test_kit.gd")
func _init() -> void:
# oracle: design/engineering/architecture/architecture.md:107 (池结构案 D:候选抽取与池纪律组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池结构案 D:候选抽取与池纪律组)
var db = load("res://core/config_db.gd").new()
if not db.load_tables("res://data/tables", false):
print("[pool_case_d_test] FAIL — 数值表加载失败")
@@ -66,7 +66,7 @@ func _tiers_of(cands: Array) -> Array:
func check_v7(a, db) -> void:
# oracle: design/engineering/architecture/architecture.md:107 (池案 D V7 组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V7 组)
if not a.start_adventure(201):
Kit.check_quiet(false, "V7 前置:冒险启动")
return
@@ -112,7 +112,7 @@ func check_v7(a, db) -> void:
func check_v6(b, db) -> void:
# oracle: design/engineering/architecture/architecture.md:107 (池案 D V6 组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V6 组)
if not b.start_adventure(202):
Kit.check_quiet(false, "V6 前置:冒险启动")
return
@@ -142,7 +142,7 @@ func check_v6(b, db) -> void:
func check_v12(m, db) -> void:
# oracle: design/engineering/architecture/architecture.md:107 (池案 D V12 组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V12 组)
if not m.start_adventure(401):
Kit.check_quiet(false, "V12 前置:冒险启动")
return
@@ -161,7 +161,7 @@ func check_v12(m, db) -> void:
func check_v8(c, db) -> void:
# oracle: design/engineering/architecture/architecture.md:107 (池案 D V8 组)
# oracle: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V8 组)
if not c.start_adventure(203):
Kit.check_quiet(false, "V8 前置:冒险启动")
return
+1 -1
View File
@@ -47,7 +47,7 @@ func _fresh_rng(seed_val: int):
# ---- ① RNG 事件日志会话落盘(源 `_initialize` :70,主会话裁决一改判跨系统闭环承载——
# 驱动沿源 :60–70 取号序列自持:master 种子 42 → 前置取号 → new_adventure 开日志会话 → 会话内取号)----
func _rng_event_log_session() -> void:
# oracle: design/engineering/architecture/architecture.md:90 (事件日志落盘会话组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 (事件日志落盘会话组)
var rng = load("res://core/rng_service.gd").new()
rng.set_master_seed(42)
rng.open_stream("board_gen")
@@ -219,7 +219,7 @@ func _test_negative_cases() -> void:
# 32→31:改写族清退批摘 spike(CI run 87 追绿——词表合法收窄的断言随动)。
func _test_effect_kinds_closed() -> void:
# oracle: design/engineering/architecture/architecture.md:89 事件/事实/效果类型/算子四词表封闭(特效闭集组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 事件/事实/效果类型/算子四词表封闭(特效闭集组)
Kit.check("效果引擎效果类型闭集 31 种(甲案词表退役 overflow/attack_segments+改写族清退摘 spike)〔锻造工坊批 V11〕",
EffectEngineScript.EFFECT_KINDS.size() == 31)
Kit.check("效果引擎事件词表在册 21 种(charge_full 位摘名——蓄力层删键批)〔锻造工坊批 V11〕",
@@ -77,7 +77,7 @@ func _test_stream_draw_determinism() -> void:
# 负输入 abs 归一化(警告通道)——|−s| 与 s 同派生
func _test_negative_seed_normalization() -> void:
# oracle: design/engineering/architecture/architecture.md:90 RngService:master_seed 与各流 scope 计数器单点(种子规约组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 RngService:master_seed 与各流 scope 计数器单点(种子规约组)
var pos = _fresh_service()
var neg = RngServiceScript.new()
neg.set_master_seed(-TEST_SEED)
@@ -22,7 +22,7 @@ func _init() -> void:
# 单元宿主改由 `_init` 显式调用,断言逐字未动;源 :70 事件日志落盘条经主会话裁决一
# 改判跨系统闭环套件——不随本宿主,见迁移账本转办清单)----
func _smoke_initialize() -> void:
# oracle: design/engineering/architecture/architecture.md:90 RngService autoload:open_stream 有状态门面与启动初始化(启动流组)
# oracle: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 RngService autoload:open_stream 有状态门面与启动初始化(启动流组)
print("=== Dungeon Sweeper 垂直切片冒烟 ===")
var db = ConfigDBScript.new()
var load_ok: bool = db.load_tables("res://data/tables", true)