卡④T5(迭代47·营地场景图批): 断言探针截图迁移批——F8全量位点逐点改指四子界面/场景根+大门两分支断言段落位+场景层序段+camp截图换场景图形态

- 全仓旧句柄引用清零(modals.camp.overlay/camp_overlay_view 残留=0): screen_flow(旗标+回退段改篝火动线)/ui_probe(余额徽+树钮改指tree/秘宝行treasure/场景点选路由)/ui_click(树链treasure+灰字按视图分扫treasure/codex锚订正去『柜台』+savesel三处场景根+大门两分支断言段V3落位:无断点两出口cancel确认/有断点三出口set_breakpoint注入次确认开局)/ui_struct(audit根场景图+源扫描改六件+场景层序段V1①子节点序与贴图矩形逐值+锻炉可达V2+顶栏位V8+根态反参照V9+生涯段改笔记本真实路由营地语境分支)/ui_contrast(令牌表核签:头带两行+铭牌副题+最近冒险四行随形态注销——CAMP_HEADER_BAND零消费随退/ROW_PLATE行仍消费保留;四子界面内容回包PANEL_DATA米板身)/shot_probe(camp截图=场景图形态V1载体+收闭改篝火动线)
- CampSceneView补_init visible=false(登记模态初始隐——boot态场景根盖菜单三红同源修复:V1a/V2/V3g career+screen_flow boot互斥)
- 旧形态断言注销(test-conventions §5.5+卡面削弱申报授权):已在T3同批(theme_projection两段);system_test V3g camp分支换代自适配(开=场景根/合=on_camp_closed关层收闭)
- 验证: system_test 69项0失败+六探针全绿(screen_flow六步/ui_probe/ui_struct含新增段/ui_contrast/ui_click问题=0全链含大门两分支与树购买持久/shot 问题=0)+camp截图实拍=场景图形态(门洞透路七物件就位)
This commit is contained in:
DKChan committed 2026-11-01 18:25:41 +08:00
1 parent 5a0e7069c1
commit 1243ffe632
7 files changed
+181 -83

No files matched your search

+90 -37
View File
@@ -65,17 +65,19 @@ func _ready() -> void:
_problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
else:
await get_tree().process_frame
if not main.ui.modals.camp.overlay.visible:
_problems.append("营地层未打开(进档开层新路径)〔句柄子容器批 V1〕")
elif main.ui.modals.camp.overlay._tree_buy_btns.is_empty():
_problems.append("树淬炼柜台购买钮缺失(点击路径——四柜台重排后树=主界面)〔句柄子容器批 V1〕")
if not main.ui.modals.camp.scene.visible:
_problems.append("营地场景根未打开(进档开层新路径)〔句柄子容器批 V1〕")
main.ui.modals.camp.scene.object_pressed.emit(&"dummy") # 场景点选真实路由(木桩→天赋树子界面——卡④ T5)
await get_tree().process_frame
if main.ui.modals.camp.tree._tree_buy_btns.is_empty():
_problems.append("树淬炼购买钮缺失(四柜台拆解后树=独立子界面)〔句柄子容器批 V1〕")
else:
# 树钮句柄用后即取(refresh_camp 随刷重建树行板——旧钮 queue_free,跨刷新句柄必失效)
iso_c.meta_state._add_keystone(9999)
main.ui.modals.camp.overlay.refresh_camp(main._camp_data())
main.ui.modals.camp.tree.refresh_camp(main._camp_data())
await get_tree().process_frame
var buy_btn: Button = null
for card in main.ui.modals.camp.overlay._tree_buy_btns:
for card in main.ui.modals.camp.tree._tree_buy_btns:
if String(card.node_id) == "sp_hp":
buy_btn = card.btn
if buy_btn == null:
@@ -93,16 +95,16 @@ func _ready() -> void:
_problems.append("营地树购买未持久(reload 后级 != 1)〔句柄子容器批 V1〕")
# Fork 双态切换点击路径(V20——购=解锁默认 A,钮切 B;前置=同调位 1,先点亮)
var socket_btn: Button = null
for card in main.ui.modals.camp.overlay._tree_buy_btns:
for card in main.ui.modals.camp.tree._tree_buy_btns:
if String(card.node_id) == "att_socket1":
socket_btn = card.btn
if socket_btn != null:
socket_btn.pressed.emit()
await get_tree().process_frame
main.ui.modals.camp.overlay.refresh_camp(main._camp_data())
main.ui.modals.camp.tree.refresh_camp(main._camp_data())
await get_tree().process_frame
var fork_btn: Button = null
for card in main.ui.modals.camp.overlay._tree_buy_btns:
for card in main.ui.modals.camp.tree._tree_buy_btns:
if String(card.node_id) == "fork_posture":
fork_btn = card.btn
if fork_btn == null:
@@ -110,10 +112,10 @@ func _ready() -> void:
else:
fork_btn.pressed.emit()
await get_tree().process_frame
main.ui.modals.camp.overlay.refresh_camp(main._camp_data())
main.ui.modals.camp.tree.refresh_camp(main._camp_data())
await get_tree().process_frame
var side_b: Button = null
for fk in main.ui.modals.camp.overlay._tree_fork_btns:
for fk in main.ui.modals.camp.tree._tree_fork_btns:
if String(fk.group) == "fg_posture" and String(fk.side) == "b":
side_b = fk.btn
if side_b == null:
@@ -125,29 +127,23 @@ func _ready() -> void:
iso_fk.load_from_disk()
if String(iso_fk.meta_state.tree_state().fork_sides.get("fg_posture", "")) != "b":
_problems.append("Fork 切态未持久(reload 后激活态 != b)〔句柄子容器批 V1〕")
# ---- 营地六处灰字取色断言(迭代36 wc4——真实入口开营地后按文本锚取 label,
# font_color 逐处 == STONE_DEEP;六源位 :167 图鉴锁文/:417+:476 行状态字/:509 同调形态/:513 档位标签/:525 刷新行)----
var camp_labels: Array = []
_collect_labels_by_text(main.ui.modals.camp.overlay, camp_labels)
var atlas_locks := _labels_with_text(camp_labels, "柜台结构位预留")
if atlas_locks.is_empty():
_problems.append("营地灰字:图鉴柜台锁文 label 未找到(wc4 定位锚失守)〔句柄子容器批 V1〕")
for l in atlas_locks:
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
_problems.append("营地灰字:图鉴锁文未用 STONE_DEEP(wc4 :167)〔句柄子容器批 V1〕")
# 「未解锁」锚收窄到秘宝匣行容器子树(树行/锻造行也有「未解锁」态字样——非 wc4 目标位)
var locked_status: Array = []
if main.ui.modals.camp.overlay.get("_workshop_holder") != null:
var ws_labels: Array = []
_collect_labels_by_text(main.ui.modals.camp.overlay._workshop_holder, ws_labels)
locked_status = _labels_with_text(ws_labels, "未解锁")
# ---- 营地灰字取色断言(迭代36 wc4——四子界面拆分后按视图分扫;卡④ T5 迁移):
# 图鉴锁文→codex 视图(锚随形态订正去『柜台』);秘宝行未解锁/同调形态/档位/刷新行→treasure 视图
# _workshop_holder 子树。font_color 逐处 == STONE_DEEP;树链段已闭树界面。
main.ui.modals.camp.tree.closed.emit() # 树界面返回(关层归 presenter 单口)
await get_tree().process_frame
main.ui.modals.camp.scene.object_pressed.emit(&"chest") # 宝箱→秘宝匣(灰字四源位宿主)
await get_tree().process_frame
var ws_labels: Array = []
_collect_labels_by_text(main.ui.modals.camp.treasure._workshop_holder, ws_labels)
var locked_status: Array = _labels_with_text(ws_labels, "未解锁")
if locked_status.is_empty():
_problems.append("营地灰字:秘宝匣行「未解锁」态 label 未找到(wc4 夹具前提失守——新档应有锁定秘宝行)〔句柄子容器批 V1〕")
for l in locked_status:
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
_problems.append("营地灰字:秘宝行「未解锁」态未用 STONE_DEEP(wc4 :417/:476)〔句柄子容器批 V1〕")
var form_found := false
for l in camp_labels:
for l in ws_labels:
if l.text == "被动" or l.text == "主动·充能":
form_found = true
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
@@ -158,7 +154,7 @@ func _ready() -> void:
for v in UiKit.TREASURE_TIER_LABELS.values():
tier_vals[String(v)] = true
var tier_found := false
for l in camp_labels:
for l in ws_labels:
if tier_vals.has(l.text):
tier_found = true
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
@@ -166,18 +162,30 @@ func _ready() -> void:
if not tier_found:
_problems.append("营地灰字:同调档位标签未找到(wc4 定位锚失守)〔句柄子容器批 V1〕")
var refresh_inked := false
for l in camp_labels:
for l in ws_labels:
if String(l.text).contains("三选一刷新"):
refresh_inked = true
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
_problems.append("营地灰字:刷新行未用 STONE_DEEP(wc4 :525)〔句柄子容器批 V1〕")
if not refresh_inked:
_problems.append("营地灰字:刷新行 label 未找到(wc4 定位锚失守)〔句柄子容器批 V1〕")
main._on_camp_closed()
main.ui.modals.camp.treasure.closed.emit()
await get_tree().process_frame
main.ui.modals.camp.scene.object_pressed.emit(&"board") # 布告板→图鉴占位(锁文宿主)
await get_tree().process_frame
var codex_labels: Array = []
_collect_labels_by_text(main.ui.modals.camp.codex, codex_labels)
var atlas_locks := _labels_with_text(codex_labels, "结构位预留")
if atlas_locks.is_empty():
_problems.append("营地灰字:图鉴锁文 label 未找到(wc4 定位锚失守——锚随形态订正去『柜台』)〔句柄子容器批 V1〕")
for l in atlas_locks:
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
_problems.append("营地灰字:图鉴锁文未用 STONE_DEEP(wc4 :167)〔句柄子容器批 V1〕")
main.ui.modals.camp.codex.closed.emit()
await get_tree().process_frame
main._on_camp_closed() # 关层收闭(营地与选档层同收+开始层恢复——卡④ T3)
await get_tree().process_frame
main._on_save_select_closed() # 关闭被栈还原的选档层(动线序中间态——卡④ 换代点)
await get_tree().process_frame
if main.ui.modals.camp.overlay.visible or not main.ui.screens.start_overlay.visible:
if main.ui.modals.camp.scene.visible or not main.ui.screens.start_overlay.visible:
_problems.append("营地关闭后未恢复开始层〔句柄子容器批 V1〕")
# ---- 选档界面行为走查(迭代 33 卡③):sl5 空槽新档链/sl6 有档槽进档链/sl7 删档二次确认双路径
# /sl8 消费方分派单口/sl12 动线序不回闪。开层=函数直调(「进入存档」钮归卡② mn3——中间态在案);
@@ -208,7 +216,7 @@ func _ready() -> void:
new_btn.pressed.emit() # 真实按钮信号路径 → _on_save_select_new → create_slot+open_camp
for fi in 3:
await get_tree().process_frame
samples.append([main.ui.modals.save_select_overlay.visible, main.ui.modals.camp.overlay.visible, main.ui.screens.start_overlay.visible])
samples.append([main.ui.modals.save_select_overlay.visible, main.ui.modals.camp.scene.visible, main.ui.screens.start_overlay.visible])
if samples[0][0]:
_problems.append("[savesel] sl12 新档后选档层仍可见(落点开层未发生)")
elif not samples[0][1]:
@@ -217,7 +225,7 @@ func _ready() -> void:
_problems.append("[savesel] sl12 动线序违约:开始层在落点帧恢复(回闪一帧)")
if main.save_manager.slots.active_slot() != 1 or not FileAccess.file_exists(csel_tpl % 1):
_problems.append("[savesel] sl5 新档链失守(active=%d 应=1 且槽1 白板应落盘)" % main.save_manager.slots.active_slot())
var occluded: Array = main.ui.modals.flow.stack._occluded.get(main.ui.modals.camp.overlay, [])
var occluded: Array = main.ui.modals.flow.stack._occluded.get(main.ui.modals.camp.scene, [])
if not occluded.has(main.ui.modals.save_select_overlay):
_problems.append("[savesel] sl12 选档层被关闭而非栈记账挂起(先关后开形态——遮挡挂起中间态钉死)")
if int((JSON.parse_string(FileAccess.get_file_as_string(csel_tpl % 1)) as Dictionary).get("meta", {}).get("keystone_balance", -1)) != 0:
@@ -235,7 +243,7 @@ func _ready() -> void:
await get_tree().process_frame
if main.save_manager.slots.active_slot() != 2:
_problems.append("[savesel] sl6 进档链失守(active=%d 应=2——激活该槽)" % main.save_manager.slots.active_slot())
if not main.ui.modals.camp.overlay.visible or main.ui.modals.save_select_overlay.visible:
if not main.ui.modals.camp.scene.visible or main.ui.modals.save_select_overlay.visible:
_problems.append("[savesel] sl6 落点未开营地层或选档未隐藏")
main._on_camp_closed()
await get_tree().process_frame
@@ -668,6 +676,51 @@ func _ready() -> void:
# 卡④大门 T5 接收,两头登记禁静默删除;续玩钮已退役,主菜单确认链已摘 mn6)。
# ① 战斗收口断点写盘断言保留(上方——冒险流直调中间态 mn10)。
# ---- 大门两分支断言段(卡④ T5 接收——卡② 移交落点;V3 断言面)----
# 驱动=营地场景根点选信号(真实路由)→组合根 _on_camp_object_pressed→确认弹窗。
# 无断点=两出口(是/否);有断点=三出口(set_breakpoint 注入选路停点形——同下方开场行③先例)。
# 判据绑可观测提交面:点大门不直接进冒险(is_adventure 翻转只在 confirmed 后);cancelled 恒=
# 无变更退回营地(写口零调用——余额读数不变+营地根 visible);开局后营地场景屏隐藏。
ProbeUiUtil.isolate_save(main, "smoke_click_probe_gate", true, false, true)
main._camp_pres.open_camp()
await get_tree().process_frame
var bal_gate: int = main._camp_data()["balance"]
main.ui.modals.camp.scene.object_pressed.emit(&"gate")
await get_tree().process_frame
if not main.ui.modals.confirm_dialog.is_open():
_problems.append("大门无断点:确认弹窗未开(点大门应先出确认不直接进冒险)〔营地图批 V3〕")
if main.run_scope.is_adventure:
_problems.append("大门无断点:未确认即进冒险〔营地图批 V3〕")
if main.ui.modals.confirm_dialog._secondary_btn.visible:
_problems.append("大门无断点:次钮应隐藏(两出口形态)〔营地图批 V3〕")
main.ui.modals.confirm_dialog.cancelled.emit()
await get_tree().process_frame
if not main.ui.modals.camp.scene.visible or main.run_scope.is_adventure or main._camp_data()["balance"] != bal_gate:
_problems.append("大门取消:未无变更退回营地(写口零调用/营地根 visible 失守)〔营地图批 V3〕")
main.ui.modals.camp.scene.object_pressed.emit(&"gate")
await get_tree().process_frame
main.ui.modals.confirm_dialog.confirmed.emit() # 「是」→开始新冒险
await get_tree().process_frame
if not main.run_scope.is_adventure or main.ui.modals.camp.scene.visible:
_problems.append("大门确认:冒险未发起或营地场景屏未隐藏〔营地图批 V3〕")
# 有断点三出口(选路停点形注入——同开场行③ set_breakpoint 先例)
main.save_manager.set_breakpoint({
"master_seed": 42, "rng_counter": 0, "hero_hp": 30, "gp": 10, "keystone": 0,
"level_index": 1, "bonus": {"atk": 0, "max_hp": 0, "armor_class": 0, "ap": 0},
"shop_purchased": {}, "relics": [], "keystone_drops": [], "bonus_taken": {},
"node_id": -1, "visited_ids": [], "graph_gen_v2": 1,
})
main._camp_pres.open_camp()
await get_tree().process_frame
main.ui.modals.camp.scene.object_pressed.emit(&"gate")
await get_tree().process_frame
if not main.ui.modals.confirm_dialog.is_open() or not main.ui.modals.confirm_dialog._secondary_btn.visible:
_problems.append("大门有断点:三出口形态失守(次钮应现形)〔营地图批 V3〕")
main.ui.modals.confirm_dialog.secondary_confirmed.emit() # 「开始新冒险」出口
await get_tree().process_frame
if not main.run_scope.is_adventure or main.ui.modals.camp.scene.visible:
_problems.append("大门有断点次确认:冒险未发起或营地未隐藏〔营地图批 V3〕")
# ---- 开场行三路径段(迭代36 wc1/wc2——真实入口驱动;隔离新档)----
# 驱动设计(0/0 白板局生存性不成立的实证处置——L2 记录进实现报告):
# ① 菜单开新局·白板反向=独立短局:0/0 滑条开局断言 L1 开场行零后缀(不开驱动——