@@ -173,7 +173,7 @@ func _smoke_boot_chain() -> void:
# ④-1 boot 路径:启动态钉死(卡① sv2)——boot 无激活态、断点在档恒否,续玩钮恒隐
#(原「按钮态==真实档断点态」关系判据随启动态换代改写:test-conventions §9.5 申报在案,卡② mn8 再承接)
check ( not sm . has_breakpoint ( ) ,
" V2d 续玩钮族退役· boot 无断点在档(启动态不隐式激活——卡① sv2 钉死;恒隐判据随钮退役由本断言+V2d 三钮在位承接 )〔装配生命批 V2·卡② mn8 改写〕 " )
" V2d boot 无断点在档(启动态不隐式激活——卡① sv2 钉死)〔装配生命批 V2·卡② mn8 改写〕 " )
# ④-1b 启动态三断言+旧单档迁移不变式(卡① sv2/sv12——真实 autoload boot 链)
check ( sm . active_slot ( ) == 0 and not sm . has_write_target ( ) ,
" V2-s1 boot 后无激活态(active_slot=0、写盘目标空)〔卡① sv2〕 " )
@@ -182,7 +182,7 @@ func _smoke_boot_chain() -> void:
check ( not sm . write_to_disk ( ) ,
" V2-s3 boot 无激活写盘拒绝(write_to_disk=false 生产入口)〔卡① sv3〕 " )
check ( not ( FileAccess . file_exists ( " user://save.json " ) and not FileAccess . file_exists ( sm . slot_path ( 1 ) ) ) ,
" V2-s4 旧单档迁移不变式(旧档在则槽 1 必在——Q1 甲一次性迁移已发生)〔卡① sv12〕 " )
" V2-s4 旧单档迁移不变式(旧档在则槽 1 必在——Q1 甲一次性迁移已发生;旧档在盘面罕见,迁移逻辑本体由 save_manager_domain v0 迁移链断言覆盖 )〔卡① sv12·核代码增补注 〕 " )
# ④-2 三钮承接(卡② mn8——V2d 续玩钮族随钮退役废止:钮可见性联动面由卡① V2-s 启动态断言与
# sv11 attach 语义段承接;attach 原地重置语义保持——绝不碰真实档 user://save.json)
for p in [ " user://smoke_boot_chain.json " , " user://smoke_boot_chain.json.tmp " ] :
@@ -213,10 +213,6 @@ func _smoke_boot_chain() -> void:
DirAccess . remove_absolute ( p )
# ---- 生命周期存活性矩阵(九阶段×五引用面;驱动复用 V3 debug seed 开局路径+
# _auto_play_round 活战斗模式+ui_struct resume 夹具模式,不另起点击链)----
# 阶段映射说明:计划书十阶段中「开局停点」与「地图选路」在本现行流程同为关卡画面停点态
#( level_started→choices_presented 同步到达,无可观测中间态)——合并为 V3b 一处断言。
func _smoke_run_lifecycle ( ) - > void :
print ( " --- 迭代27 T1 会话物化(V3:两连局复位+脏状态不残留)--- " )
var main : Node = load ( " res://presentation/main.tscn " ) . instantiate ( )
@@ -259,7 +255,7 @@ func _smoke_run_lifecycle() -> void:
" V3 局态封印/账本全复位(queue_free 物化——注入脏状态零残留) " )
check ( main . _start_overlay . visible , " V3 回开始菜单(终局出口路径) " )
# ---- 第二局:放弃终局无断点残留→直进开局→全新会话 ----
check ( not sm . has_breakpoint ( ) , " V3 放弃终局清断点(无残留断点——续玩按钮态联动 ) " )
check ( not sm . has_breakpoint ( ) , " V3 放弃终局清断点(无残留断点) " )
main . debug_overlay . seed_edit . text = " 43 "
main . _start_adventure_from_menu ( )
await process_frame
@@ -362,6 +358,8 @@ func _stage_faces(main: Node, tag: String, adv: String, run: String, set: String
func _face_liveness ( name : String , v , want : String ) - > String :
if want == " null " :
return " " if v == null else " %s 应缺位(实测非空) " % name
if want == " alive " and v == null :
return " %s 应在座(实测 null) " % name
if v != null and not is_instance_valid ( v ) :
return " %s 悬挂(失效对象) " % name
return " "
@@ -519,7 +517,7 @@ func _smoke_lifecycle_matrix() -> void:
for i in range ( 6 ) :
await process_frame
check ( main . run_scope . adventure != null and main . run_scope . adventure != first_adv ,
" V3h 两连局第二会话全新对象(与第一局不复用 )〔装配生命批 V3〕 " )
" V3h 两连局第二会话在座(开局停点——新冒险会话非空 )〔装配生命批 V3〕 " )
await _stage_faces ( main , " V3h 两连局·开局停点 " , " alive " , " alive " , " null " , { " mf_start " : false , " level_vis " : true } )
check ( main . run_scope . adventure . abandon ( ) , " V3h 放弃受理(第二局)〔装配生命批 V3〕 " )
for i in range ( 12 ) :
@@ -558,7 +556,4 @@ func _smoke_lifecycle_matrix() -> void:
for p in [ " user://smoke_lifecycle.json " , " user://smoke_lifecycle.json.tmp " ,
" user://smoke_lifecycle_resume.json " , " user://smoke_lifecycle_resume.json.tmp " ] :
if FileAccess . file_exists ( p ) :
DirAccess . remove_absolute ( p )
# 引用面快照(五承载物的会话相关面+恒活面——逐个调用现值回调,与 run_scope 成员并采)
DirAccess . remove_absolute ( p )