diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 6bc64d3c..46441180 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -1208,6 +1208,15 @@ func _on_tune_simulate(n: int) -> void: # ==================== 工具 ==================== func _seed_value() -> int: + # 种子三分判定单点(迭代 18 卡⑦ C1——全工程唯一种子框读取处,禁第二处读框): + # ①显式合法整数全场景优先(含首局——测试/调试接口显式指定;第五路 DebugSession Callable + # 经本函数=调试对局与玩家同口径,P6 甲); + # ②首局固定 42(P5 甲——存档现役布尔 is_first_adventure_done:新档显式 false=教学局, + # 老档缺省 true=有游玩史;教学重放模板 0 即在此种子下标定); + # ③非首局空/非法框=引擎全局熵 randi()(Godot 4 启动自播种子,headless 同;不走 rng_service + # 封闭流、禁 randomize()/自建 RNG——组合根建种子属 ADR-0007 豁免面,不进玩法 RNG 消费) if _seed_edit.text.is_valid_int(): return int(_seed_edit.text) + if save_manager != null and not save_manager.is_first_adventure_done(): + return randi() return 42 diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index a98143ec..77eb69f3 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -158,12 +158,14 @@ func _build() -> void: fx_btn.text = "纹章拼合" if UiKit.victory_fx_style == "crest" else "尘金粒子") fx_row.add_child(fx_btn) - # 区块①随机种子(原开始覆盖层种子行迁入——非法定值回退 42 的口径归组合根 _seed_value) + # 区块①随机种子(原开始覆盖层种子行迁入——种子三分判定归组合根 _seed_value 单点): + # 默认空框(迭代 18 卡⑦ C1——空=随全局规则:首局恒 42/非首局随机;显式填入全场景优先) var seed_row := HBoxContainer.new() list.add_child(seed_row) seed_row.add_child(UiKit.label("随机种子",UiKit.FS_BODY, false)) seed_edit = LineEdit.new() - seed_edit.text = "42" + seed_edit.text = "" + seed_edit.placeholder_text = "留空=随机 · 首局恒 42" seed_edit.custom_minimum_size = Vector2(120, 0) seed_row.add_child(seed_edit) list.add_child(HSeparator.new()) diff --git a/game/smoke/ui_click_probe.gd b/game/smoke/ui_click_probe.gd index 99b315c9..8e6e03a8 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -131,10 +131,12 @@ func _ready() -> void: _problems.append("音量滑杆未实时生效(master bus db %f ≠ %f)" % [AudioServer.get_bus_volume_db(master_idx), expect_db]) if absf(iso_s.volume_linear - 0.3) > 0.001: _problems.append("音量未入 store(%f ≠ 0.3)" % iso_s.volume_linear) - # 调试入口默认隐藏门控(卡④ AC④——探针环境 DS_DEBUG 未设) - var dbg_btn: Button = ProbeUiUtil.find_button(main._start_overlay, "调试", "prefix") - if dbg_btn != null and dbg_btn.visible: - _problems.append("调试入口未隐藏(DS_DEBUG 门控失守——卡④ AC④)") + # 调试入口断言改向(迭代 18 卡⑦ P2 甲——开始层角标退役迁宿主两屏;探针环境 DS_DEBUG 未设 + # =浮窗不默认开〔P3 门控〕、DS_DEBUG 门控由开始层角标移两屏角标) + if ProbeUiUtil.find_button(main._start_overlay, "调试", "prefix") != null: + _problems.append("开始层调试角标未退役(迭代 18 卡⑦ P2 甲迁宿主失守)") + if main.debug_overlay.visible: + _problems.append("DS_DEBUG 未设时浮窗默认开(P3 启动门控失守)") var settings_close: Button = ProbeUiUtil.find_button(main.settings_overlay, "返回", "prefix") if settings_close == null: _problems.append("设置面返回按钮缺失") @@ -160,6 +162,7 @@ func _ready() -> void: elif resume_btn0.visible: _problems.append("无断点态继续上局按钮未隐藏(卡② AC①——新档合法空态)") main.debug_overlay.set_sliders(400, 200) # 高加成保 L1 可通关——L2 岔路选路段只能经冒险推进到达(单关直入口退役) + main.debug_overlay.seed_edit.text = "42" # 种子钉死(迭代 18 卡⑦审计🔴——种子框默认改空后空框=非首局随机,行为走查确定性禁依赖默认分支) var t1 := Time.get_ticks_msec() main._start_adventure_from_menu() await get_tree().process_frame diff --git a/game/smoke/ui_input_probe.gd b/game/smoke/ui_input_probe.gd index f4cba8e5..a3291bd5 100644 --- a/game/smoke/ui_input_probe.gd +++ b/game/smoke/ui_input_probe.gd @@ -31,6 +31,7 @@ func _ready() -> void: # 同 ui_click_probe 隔离纪律。首次冒险布尔位置位=对齐真实档游玩史口径,模板抽签路径不变; # isolate_save 先删后建——上次运行的残留断点会触发互斥确认早退) ProbeUiUtil.isolate_save(main, "smoke_input_probe_save", true, false, true) + main.debug_overlay.seed_edit.text = "42" # 种子钉死(迭代 18 卡⑦审计🔴——种子框默认改空后空框=非首局随机,探针确定性禁依赖默认分支) main._start_adventure_from_menu() await get_tree().process_frame # ---- ⑫ 图上命中真实输入(关卡画面实装批 2026-09-28 回归闸):入口停点候选节点中心 diff --git a/game/smoke/ui_layout_probe.gd b/game/smoke/ui_layout_probe.gd index cbdc2538..582f4d6d 100644 --- a/game/smoke/ui_layout_probe.gd +++ b/game/smoke/ui_layout_probe.gd @@ -15,6 +15,7 @@ func _ready() -> void: # 存档隔离(迭代 8 卡①②——停点断点写盘随 main.save_manager;探针禁碰真实档,同族探针隔离纪律; # isolate_save 先删后建——上次运行的残留断点会触发互斥确认早退) ProbeUiUtil.isolate_save(main, "smoke_layout_probe_save", true, false, true) + main.debug_overlay.seed_edit.text = "42" # 种子钉死(迭代 18 卡⑦审计🔴——种子框默认改空后空框=非首局随机,探针确定性禁依赖默认分支) main._start_adventure_from_menu() for i in range(3): await get_tree().process_frame diff --git a/game/smoke/ui_probe.gd b/game/smoke/ui_probe.gd index eed02c8a..43f43e61 100644 --- a/game/smoke/ui_probe.gd +++ b/game/smoke/ui_probe.gd @@ -54,6 +54,7 @@ func _ready() -> void: problems.append("营地关闭后未恢复开始层(开合往返失守)") # 换回全新零档(营地段购买态不泄入后续冒险段——确定性;先删后建防陈旧档泄入) ProbeUiUtil.isolate_save(main, "smoke_ui_probe_camp", true, false, true) + main.debug_overlay.seed_edit.text = "42" # 种子钉死(迭代 18 卡⑦——种子框默认改空后空框=非首局随机;本探针 start_single 第五路同吃此框,确定性禁依赖默认分支) main._start_adventure_from_menu() await get_tree().process_frame await get_tree().process_frame diff --git a/game/smoke/ui_struct_probe.gd b/game/smoke/ui_struct_probe.gd index 370068a3..925e2e61 100644 --- a/game/smoke/ui_struct_probe.gd +++ b/game/smoke/ui_struct_probe.gd @@ -62,6 +62,7 @@ func _ready() -> void: # ---- 冒险簇(真流推进:开冒险→地图选路态→选战斗节点→战斗 HUD)---- ProbeUiUtil.isolate_save(main, "smoke_ui_struct_probe_adv", true, false, true) + main.debug_overlay.seed_edit.text = "42" # 种子钉死(迭代 18 卡⑦——种子框默认改空后空框=非首局随机,结构采样确定性禁依赖默认分支) main._start_adventure_from_menu() _settle(4) await _audit("level_map", [main.level_screen])