From fff25fe648c9519d7ee46b007616446a9af5d01a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 8 Oct 2026 16:41:34 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E5=8D=A1=E2=91=A3T1?= =?UTF-8?q?=E2=80=94=E2=80=94treasure=5Fitems.tres=20=E8=A1=A8=E5=B0=BE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20fog=5Flantern=20=E9=AD=94=E6=B3=95?= =?UTF-8?q?=E6=8F=90=E7=81=AF=E8=A1=8C=EF=BC=88=E6=8F=90=E7=81=AF=E8=BD=BD?= =?UTF-8?q?=E4=BD=93=E9=81=93=E5=85=B7=E6=89=B9=EF=BC=9B=E8=A1=8C=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=3D=E7=94=A8=E6=88=B7=E3=80=8C=E6=8C=89=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E3=80=8D=E5=85=A8=E6=94=B6=202026-10-08=EF=BC=9Adispl?= =?UTF-8?q?ay=5Fname=3D=E9=AD=94=E6=B3=95=E6=8F=90=E7=81=AF/desc=3D?= =?UTF-8?q?=E7=81=AF=E5=85=89=E5=8C=BA=E5=8D=8A=E5=BE=84+2/id=3Dfog=5Flant?= =?UTF-8?q?ern/slot=5Fcost=3D1/=E7=A8=80=E6=9C=89=E5=BA=A6=E4=B8=8D?= =?UTF-8?q?=E8=AE=BE=E5=AD=97=E6=AE=B5/=E9=97=A8=E6=A7=9B=E4=BD=8D=20unloc?= =?UTF-8?q?k=5Frequires=20=E9=94=AE=E7=9C=81=E7=95=A5=3D=E5=B7=B2=E8=A7=A3?= =?UTF-8?q?=E9=94=81=EF=BC=9B=E6=9C=BA=E6=A2=B0=E5=AD=97=E6=AE=B5=20form?= =?UTF-8?q?=3Dpassive+triggers=20=E6=98=BE=E5=BC=8F=E7=A9=BA=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E3=80=94=E6=B4=BB=E8=A1=8C=E7=A9=BA=20effect=5Fkinds?= =?UTF-8?q?=20=E8=B1=81=E5=85=8D=E4=BB=A5=20row.has(triggers)=20=E4=B8=BA?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E2=80=94=E2=80=94treasure=5Fitem=5Ftable.gd:?= =?UTF-8?q?111=EF=BC=8C=E6=BC=8F=E5=86=99=3D=E5=8A=A0=E8=BD=BD=E7=BA=A2?= =?UTF-8?q?=E3=80=95+effect=5Fkinds=3D[]/target=3Dnone/magnitude=3D0/use?= =?UTF-8?q?=5Fphase=3Dactive=5Fdig/dimension=5Ftags=3D[info]=EF=BC=9B?= =?UTF-8?q?=E8=A1=A8=E5=B0=BE=E8=BF=BD=E5=8A=A0=E4=BF=9D=20MC=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=A1=A3=E8=A3=85=E9=85=8D=E7=94=BB=E5=83=8F=E9=80=90?= =?UTF-8?q?=E4=BD=8D=E4=B8=8D=E5=8F=98=E3=80=94adventure=5Fmonte=5Fcarlo?= =?UTF-8?q?=20=E6=8C=89=E8=A1=A8=E5=BA=8F=E5=8F=96=E5=89=8D=20slots-1=20?= =?UTF-8?q?=E8=A2=AB=E5=8A=A8+=E9=A6=96=E4=B8=AA=E4=B8=BB=E5=8A=A8?= =?UTF-8?q?=E3=80=95=EF=BC=9B=E5=86=92=E7=83=9F=20840/0=20=E4=B8=89?= =?UTF-8?q?=E9=97=B8=E8=BF=87=3D=E5=8A=A0=E8=BD=BD=E9=9B=B6=E7=BA=A2?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/data/tables/treasure_items.tres | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/game/data/tables/treasure_items.tres b/game/data/tables/treasure_items.tres index 4aaf2ec3..650f4270 100644 --- a/game/data/tables/treasure_items.tres +++ b/game/data/tables/treasure_items.tres @@ -4,6 +4,8 @@ [resource] script = ExtResource("1") +; 迭代 19 卡④(2026-10-08):表尾追加 fog_lantern 魔法提灯(提灯载体道具批——视野外扩 +2 纯呈现载体行; +; 空效果行 live 形态=triggers 显式空数组,与显影尘 deferred 形态的形态差=「激活 vs 封存」);行字段值=用户「按推荐」全收 2026-10-08。 ; 迭代 11 第①批 T1(2026-10-03):追加七件同调行(form 非空——永不入过渡渠道);值全 provisional 归 难度曲线与Boss。 ; nest_pendulum 已换装 active_charged(迭代 11 第①批);blast_kit 已换装 cell_removal+active_charged(迭代 13 T8/D6——中立移除雷格启用);sapper_order/显影尘/地穴全图卷/罗盘 T7 逐件销账。 rows = [{ @@ -220,4 +222,16 @@ rows = [{ "use_phase": "active_dig", "form": "passive", "slot_cost": 1 +}, { +"item_id": "fog_lantern", +"display_name": "魔法提灯", +"dimension_tags": ["info"], +"desc": "灯光区半径+2", +"effect_kinds": [], +"target": "none", +"magnitude": 0, +"use_phase": "active_dig", +"form": "passive", +"slot_cost": 1, +"triggers": [] }] From fd6c208b2e9315e8906b77f6f78751d495fcdb4a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 8 Oct 2026 16:44:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E5=8D=A1=E2=91=A3T2?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=8F=90=E7=81=AF=E8=A7=86=E9=87=8E=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E6=A1=A5=E6=8E=A5=E7=BA=BF=EF=BC=88=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E8=B4=AF=E9=80=9A=3D=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=BA=A6=200=E2=86=921=EF=BC=89=EF=BC=9A=E2=91=A0battle=5Forch?= =?UTF-8?q?estrator.gd=20=E8=A3=85=E9=85=8D=E9=9B=86=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=8F=AA=E8=AF=BB=E8=AE=BF=E9=97=AE=E5=99=A8=20attune=5Fhas(it?= =?UTF-8?q?em=5Fid)=EF=BC=88=5Fattune=5Fhas=20=E5=A5=91=E7=BA=A6=E5=8C=96?= =?UTF-8?q?=E5=87=BA=E5=8F=A3=EF=BC=8Csave=20v6=20=E5=8F=AA=E8=AF=BB?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E5=99=A8=E5=85=88=E4=BE=8B=EF=BC=9Bprivate?= =?UTF-8?q?=20=E9=9D=A2=E9=9B=B6=E6=94=B9=E5=8A=A8=EF=BC=89=E2=91=A1main.g?= =?UTF-8?q?d=20=E5=91=88=E7=8E=B0=E6=A1=A5=20=5Fsync=5Ffog=5Flantern?= =?UTF-8?q?=E2=80=94=E2=80=94settlement.attune=5Fhas(fog=5Flantern)=20?= =?UTF-8?q?=E7=9C=9F=E5=80=BC=E6=98=BE=E5=BC=8F=E5=86=99=E7=BB=99=20board?= =?UTF-8?q?=5Fview.set=5Ffog=5Flantern=EF=BC=88=E5=86=99=E5=85=A5=E5=8D=B3?= =?UTF-8?q?=20refresh=20=E5=85=A8=E6=9D=BF=E9=87=8D=E7=AE=97=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E6=8C=82=E7=82=B9=3D=5Fon=5Fround=5Fstarted=20ri=3D?= =?UTF-8?q?=3D1=20=E6=AF=8F=E6=88=98=E9=A6=96=E8=BD=AE=E8=A3=85=E9=85=8D?= =?UTF-8?q?=E9=93=BE=E6=98=BE=E5=BC=8F=E9=87=8D=E7=AE=97=E5=90=AB=E5=90=A6?= =?UTF-8?q?=E3=80=94=F0=9F=94=B4=20=E5=A5=91=E7=BA=A6=207=20Q8.1=20?= =?UTF-8?q?=E5=A4=8D=E5=8E=9F=E8=AF=AD=E4=B9=89=3D=E7=A6=81=E6=88=98?= =?UTF-8?q?=E6=96=97=E7=BB=93=E6=9D=9F=E9=9A=90=E5=BC=8F=E5=A4=8D=E5=8E=9F?= =?UTF-8?q?=EF=BC=9B=E6=97=B6=E5=BA=8F=E4=BE=9D=E6=8D=AE=EF=BC=9Around=5Fs?= =?UTF-8?q?tarted=20=E9=A6=96=E8=BD=AE=E5=8F=91=E5=B0=84=E4=BD=8D=E5=9C=A8?= =?UTF-8?q?=20begin=5Fbattle=20=E5=B0=BE=20attunement=20=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E5=90=8E=E2=80=94=E2=80=94board=5Fchanged=20=E5=9C=A8=20=5Fins?= =?UTF-8?q?tall=5Fnew=5Fboard=20=E5=86=85=E5=85=88=E5=8F=91=E8=A3=85?= =?UTF-8?q?=E9=85=8D=E9=9B=86=E5=90=8E=E6=B3=A8=E5=85=A5=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E5=B8=A7=E7=9B=B4=E6=8C=82=20=5Fon=5Fboard=5Fchanged=20?= =?UTF-8?q?=E4=BC=9A=E8=AF=BB=E5=88=B0=E4=B8=8A=E4=B8=80=E6=88=98=E6=97=A7?= =?UTF-8?q?=E9=9B=86=EF=BC=8C=E6=95=85=E4=B8=8D=E6=8C=82=E3=80=95=EF=BC=9B?= =?UTF-8?q?=E6=9C=AA=E8=A3=85=E9=85=8D=3Dfalse=20=E5=86=99=200=3D=E7=BC=BA?= =?UTF-8?q?=E7=9C=81=E9=9B=B6=E6=89=B0=E5=8A=A8=E5=9F=BA=E7=BA=BF=E9=80=90?= =?UTF-8?q?=E4=BD=8D=E4=B8=8D=E5=8F=98=EF=BC=9B=E5=86=92=E7=83=9F=20840/0?= =?UTF-8?q?=20=E5=9B=9E=E5=BD=92=E9=9B=B6=E7=A0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/battle_orchestrator.gd | 7 +++++++ game/presentation/main.gd | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index 775a6f38..8ce25a29 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -125,6 +125,13 @@ func _attune_has(item_id: String) -> bool: return attunement.has(item_id) +# 装配集只读出口(迭代 19 卡④——呈现桥消费面:组合根每战装配链判「装配集含 fog_lantern」→ +# board_view.set_fog_lantern。_attune_has 契约化出口,save v6 只读访问器先例;private 面内部调用 +# 零改动。只读零副作用——呈现侧判定专用,非结算写入口) +func attune_has(item_id: String) -> bool: + return _attune_has(item_id) + + # 装备件表值读取(charge_n 等——TreasureItemTable 行;未装配不读表。magnitude 读数面随 T4 # 秘宝订阅迁移退役——行值经 value_from 在 rebuild 定影,零运行期按件取值) func _attune_row(item_id: String) -> Dictionary: diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 58b96d35..ba62edc7 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -849,6 +849,14 @@ func _on_round_started(ri: int) -> void: else: _row_pacer.enqueue({"__round_line": ri}) settlement_fx.play_round_banner(ri) + # 提灯视野同步(迭代 19 卡④——呈现桥:每战首轮按装配集显式重算 set_fog_lantern 含否〔🔴 契约 7 + # Q8.1 复原语义:禁依赖战斗结束隐式复原——下一战装配链重算即含「未装配→写 0」复原〕)。挂点时序 + # 依据:round_started 首轮发射位在 begin_battle 尾(attunement 注入之后)——board_changed 在 + # _install_new_board 内先发、装配集后注入,同帧直挂会读到上一战的旧集,故挂此处不挂 _on_board_changed。 + # settlement 空防御照 :854 既有形态(接手先于本信号:冒险路径 board_changed 内 runner 同步、debug + # 路径 battle_created 先于 begin_battle)。未装配=false→写 0=缺省零扰动基线逐位不变。 + if ri == 1: + _sync_fog_lantern() # 开战横幅——板级地形变异预告(全局作用域变异首发批 2026-10-04):首轮快照 board_variants # 非空才发射(Boss 图恒带一型=替换制;普通图空快照零发射);轮横幅下方叠行,view 内判减动效。 if ri == 1 and settlement != null: @@ -872,6 +880,16 @@ func _on_board_changed() -> void: _refresh_presentations() +# 提灯视野呈现桥(迭代 19 卡④——装配集只读出口消费面:settlement.attune_has("fog_lantern") 真值 +# 显式写给 board_view.set_fog_lantern(true=半径 8+2 / false=复原 0),写入即 setter 内 refresh 全板 +# 重算雾态。调用点=每战首轮装配链(_on_round_started ri==1)——纯呈现边界 🔴 契约 2:只写呈现态布尔, +# minesweeper 结算零触碰;off 态(未装配)写 0=与既有基线逐位一致。 +func _sync_fog_lantern() -> void: + if settlement == null or board_view == null: + return + board_view.set_fog_lantern(settlement.attune_has("fog_lantern")) + + # ---- 一次性非模态提示(每 run 一次——pattern 10)与诚实提示 ---- func _check_board_hints() -> void: From 510cdab506b3f5740e1f5a5dd64bedc0bdfab240 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 8 Oct 2026 16:50:34 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E5=8D=A1=E2=91=A3T3?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=B5=8B=E8=AF=95=E4=B8=89=E5=BD=A2=E6=80=81?= =?UTF-8?q?=E8=90=BD=E4=BD=8D=EF=BC=88=E5=A5=91=E7=BA=A6=209=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E2=91=A0probe=3Dui=5Finput=5Fprobe=20case=E2=91=AE=20?= =?UTF-8?q?=E5=86=85=E8=BD=BD=E4=BD=93=E7=BA=A7=E6=AE=B5=E4=B8=8D=E5=BC=80?= =?UTF-8?q?=E6=96=B0=20case=E2=80=94=E2=80=94=E8=A3=85=E9=85=8D=20fog=5Fla?= =?UTF-8?q?ntern=E2=86=92=E5=BC=80=E5=B1=80=E5=8F=82=E6=95=B0=E9=9D=A2?= =?UTF-8?q?=EF=BC=88build=5Fadventure=5Fparams=3D=E5=8D=A1=E2=93=AA?= =?UTF-8?q?=E2=91=A0=E4=BF=AE=E5=A4=8D=E9=9D=A2=E5=9B=9E=E5=BD=92=EF=BC=89?= =?UTF-8?q?+settlement.attunement=20=E6=B3=A8=E5=85=A5=E2=86=92=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E6=A1=A5=20=5Fsync=5Ffog=5Flantern=E2=86=92lantern=3D?= =?UTF-8?q?2=20=E4=B8=94=20dist=3D=3DR+1=20=E6=A0=BC=E8=BD=AC=E5=8F=AF?= =?UTF-8?q?=E8=A7=81+=E5=8D=B8=E8=A3=85=E6=98=BE=E5=BC=8F=E9=87=8D?= =?UTF-8?q?=E7=AE=97=E5=A4=8D=E5=8E=9F=200=EF=BC=9Bcase=E2=91=AE=20?= =?UTF-8?q?=E6=97=A2=E6=9C=89=E6=96=AD=E8=A8=80=E9=9B=B6=E5=88=A0=E5=87=8F?= =?UTF-8?q?=EF=BC=88=E5=AE=9E=E6=9F=A5=2017=20=E6=96=AD=E8=A8=80=E9=9D=A2?= =?UTF-8?q?=E5=8E=9F=E6=A0=B7=EF=BC=89=E2=91=A1smoke=3D=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E5=A5=97=E4=BB=B6=20=5Fsmoke=5Fadventure=5Ftable=20=E5=8A=A0?= =?UTF-8?q?=E6=96=AD=E8=A8=80=E4=B8=8D=E6=96=B0=E5=BC=80=E5=A5=97=E4=BB=B6?= =?UTF-8?q?=E2=80=94=E2=80=94=E8=A1=8C=E5=AD=97=E6=AE=B5=E9=80=90=E9=94=AE?= =?UTF-8?q?=E8=A3=81=E5=80=BC+=E5=90=8C=E8=B0=83=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8A=95=E5=BD=B1=20display=5Fname=EF=BC=88=E4=B9=9D=E4=BB=B6?= =?UTF-8?q?=E2=86=92=E5=8D=81=E4=BB=B6=EF=BC=89+=E8=A3=85=E9=85=8D?= =?UTF-8?q?=E2=86=92=E6=88=98=E6=96=97=E8=B4=AF=E9=80=9A=20enc=20=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E2=86=92attune=5Fhas=3Dtrue+=E7=A9=BA=E8=A3=85?= =?UTF-8?q?=E9=85=8D=E5=9F=BA=E7=BA=BF=20false=E2=91=A2=E5=AD=98=E6=A1=A3?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=3Dbreakpoint=5Fresume=5Ftest=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Part=206=E2=80=94=E2=80=94=E8=A3=85=E9=85=8D(params?= =?UTF-8?q?.attunement)=E2=86=92=E5=81=9C=E7=82=B9=E2=86=92=E7=BB=AD?= =?UTF-8?q?=E7=8E=A9=E5=8F=97=E7=90=86=E2=86=92=E5=9B=9E=E5=B1=80=E9=A6=96?= =?UTF-8?q?=E6=88=98=20attune=5Fhas=20=E4=BB=8D=20true=E2=91=A3=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E6=A1=A5=E5=88=A4=E5=AE=9A=20stub=20=E5=8D=95?= =?UTF-8?q?=E6=B5=8B+=E8=A1=8C=E5=8A=A0=E8=BD=BD=E5=8D=95=E6=B5=8B=3D?= =?UTF-8?q?=E6=96=B0=E4=BB=B6=20fog=5Flantern=5Fwiring=5Ftest.gd=EF=BC=88r?= =?UTF-8?q?un=5Fall=20manifest=2017=E2=86=9218=20=E5=A5=97=EF=BC=89?= =?UTF-8?q?=E3=80=82=E9=97=B8=EF=BC=9A=E5=86=92=E7=83=9F=20840=E2=86=92844?= =?UTF-8?q?/0+ui=5Finput=5Fprobe=20PASS+breakpoint=20PASS+=E6=96=B0?= =?UTF-8?q?=E5=A5=97=E4=BB=B6=20PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/smoke/smoke_all.gd | 28 +++++++++ game/smoke/ui_input_probe.gd | 21 +++++++ game/tests/run_all.gd | 1 + .../tests/unit/core/breakpoint_resume_test.gd | 21 ++++++- .../unit/core/fog_lantern_wiring_test.gd | 60 +++++++++++++++++++ .../unit/core/fog_lantern_wiring_test.gd.uid | 1 + 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 game/tests/unit/core/fog_lantern_wiring_test.gd create mode 100644 game/tests/unit/core/fog_lantern_wiring_test.gd.uid diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 64d3fece..9173fba1 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -230,6 +230,34 @@ func _smoke_adventure_table() -> void: check(_db.attunement_growth != null and int(_db.attunement_slot_cap()) == 3 and Attunement.slots(_db, null) == 0, "同调位读数源=attunement_growth 谓词表(slot_cap 3;未注入档求值 0——transitional_sync_slots 过渡键已退役,迭代 11 第①批 T7)") + # 迭代 19 卡④——提灯载体行(fog_lantern):新行加载/schema/同调目录投影+装配→战斗贯通(核心层半边; + # 呈现半边归 ui_input_probe case⑮ 载体级段——测试三形态契约 9) + var lantern_row: Dictionary = _db.treasure_items.row_by_id("fog_lantern") + check(not lantern_row.is_empty() and String(lantern_row.get("display_name", "")) == "魔法提灯" + and String(lantern_row.get("desc", "")) == "灯光区半径+2" + and String(lantern_row.get("form", "")) == "passive" and int(lantern_row.get("slot_cost", -1)) == 1 + and (lantern_row.get("dimension_tags", []) as Array) == ["info"] + and (lantern_row.get("effect_kinds", []) as Array).is_empty() + and lantern_row.has("triggers") and (lantern_row.get("triggers", []) as Array).is_empty() + and String(lantern_row.get("target", "")) == "none" and int(lantern_row.get("magnitude", -1)) == 0 + and String(lantern_row.get("use_phase", "")) == "active_dig" + and not lantern_row.has("unlock_requires") + and not bool(lantern_row.get("retired", false)) and not bool(lantern_row.get("deferred", false)), + "提灯载体行 fog_lantern:行字段逐键=裁值(魔法提灯/灯光区半径+2/passive/slot_cost 1/[info]/空效果/显式 triggers 空数组/none/0/active_dig/unlock 键省略=已解锁/活行非封存)") + var att_lantern := {} + for r in _db.treasure_attunement_rows(): + if String(r.get("item_id", "")) == "fog_lantern": + att_lantern = r + check(not att_lantern.is_empty() and String(att_lantern.get("display_name", "")) == "魔法提灯", + "同调目录投影:fog_lantern 在装配词表且 display_name=魔法提灯(营地工坊目录九件→十件)") + var orch_l = load("res://core/battle_orchestrator.gd").new(_db, _fresh_rng(191)) + check(orch_l.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(_db.hero.max_hp), "attunement": ["fog_lantern"]}) + and orch_l.attune_has("fog_lantern"), + "装配→战斗贯通:enc.attunement=[fog_lantern] 起战 attune_has=true(注入面+只读出口)") + var orch_e = load("res://core/battle_orchestrator.gd").new(_db, _fresh_rng(192)) + check(orch_e.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(_db.hero.max_hp)}) + and not orch_e.attune_has("fog_lantern"), + "空装配基线:不带 attunement 起战 attune_has=false(off 态零扰动)") # ② 冒险结构 API 闸(状态机受理面——重复开始拒绝 / 入口停点 / 放弃两态) diff --git a/game/smoke/ui_input_probe.gd b/game/smoke/ui_input_probe.gd index a3291bd5..14caae64 100644 --- a/game/smoke/ui_input_probe.gd +++ b/game/smoke/ui_input_probe.gd @@ -416,6 +416,27 @@ func _ready() -> void: _problems.append("case⑮ 提灯关闭后雾参数未复原(lantern 应=0)") if int(bv.cells_probe()[ring_cell].fog_state) == 0: _problems.append("case⑮ 提灯关闭后 dist==R+1 格未复原遮蔽") + # 载体级断言(迭代 19 卡④——fog_lantern 装配链贯通:①装配→开局参数面〔build_adventure_params + # 统一构造=卡⓪①缺陷修复面回归〕②装配集→呈现桥〔_sync_fog_lantern 消费 attune_has 只读出口 + # →set_fog_lantern〕→视野 +2 生效与卸装复原。settlement.attunement 手动注入=模拟 begin_battle + # enc 注入后的运行态〔注入面本体归冒烟+单测覆盖〕;不重启冒险——case⑯ 起既有板面继续用) + main.save_manager.set_attunement_equipped(["fog_lantern"]) + var p_lantern: Dictionary = main.build_adventure_params(main.save_manager, main.meta) + if not (p_lantern.get("attunement", []) as Array).has("fog_lantern"): + _problems.append("case⑮ 载体装配未进开局参数面(attunement=%s 应含 fog_lantern)" % str(p_lantern.get("attunement", []))) + main.settlement.attunement = ["fog_lantern"] + main._sync_fog_lantern() + if int(bv.fog_params_probe()["lantern"]) != 2: + _problems.append("case⑮ 载体装配后视野未扩(lantern 应=2——呈现桥未生效)") + if int(bv.cells_probe()[ring_cell].fog_state) != 0: + _problems.append("case⑮ 载体装配后 dist==R+1 格仍被遮(应转可见)") + main.settlement.attunement = [] + main._sync_fog_lantern() + if int(bv.fog_params_probe()["lantern"]) != 0: + _problems.append("case⑮ 载体卸装后视野未复原(lantern 应=0——契约 7 显式重算含否)") + if int(bv.cells_probe()[ring_cell].fog_state) == 0: + _problems.append("case⑮ 载体卸装后 dist==R+1 格未复原遮蔽") + main.save_manager.set_attunement_equipped([]) # ---- case⑯ 暂停层输入锁语义(迭代 17 卡③ R3——开层锁棋盘、关层恢复无残留;真实 push_input # 路径:入口角标本体 press+release 真点击 → 暂停层开;锁期挖掘点击零穿透;「继续」关层后 # 同格挖掘重新到达——锁语义与既有模态同款,无状态残留。置于全 case 之尾:取格若需前沿移位 diff --git a/game/tests/run_all.gd b/game/tests/run_all.gd index d3d9f022..3056ff35 100644 --- a/game/tests/run_all.gd +++ b/game/tests/run_all.gd @@ -43,6 +43,7 @@ func _suites() -> Array: {"path": "res://tests/unit/contracts/system_contracts_test.gd", "expect": 0}, {"path": "res://tests/unit/presentation/ui_font_asset_test.gd", "expect": 0}, {"path": "res://tests/unit/presentation/terrain_tile_sets_test.gd", "expect": 0}, + {"path": "res://tests/unit/core/fog_lantern_wiring_test.gd", "expect": 0}, # 迭代 19 卡④——提灯载体装配链(行加载/schema/只读出口双态/enc 注入面) ] diff --git a/game/tests/unit/core/breakpoint_resume_test.gd b/game/tests/unit/core/breakpoint_resume_test.gd index c0d351a5..fba5cce5 100644 --- a/game/tests/unit/core/breakpoint_resume_test.gd +++ b/game/tests/unit/core/breakpoint_resume_test.gd @@ -128,8 +128,27 @@ func _init() -> void: Kit.check_quiet(String(got_result["r"].get("picked", "")) == picked_e, "P5 已兑付不重付(resolved 重发同件)") Kit.check_quiet(adr_g.continue_to_next_level(), "P5 已兑付续玩后推进受理(下一关开始)") + # ---- Part 6:装配存档回归(迭代 19 卡④——装配→停点→回局载体态一致:params.attunement 随续玩 + # 受理面重建再注入战斗〔begin_battle enc 携带〕;呈现态每战重算归呈现桥(main._sync_fog_lantern), + # 本断言钉核心层装载往返——回局后 attune_has 只读出口读数一致)---- + var rng_h = load("res://core/rng_service.gd").new() + var sm_h = SaveManagerScript.new(_bp_path) + var adr_h = AdventureRunnerScript.new(db, rng_h) + adr_h.set_save_manager(sm_h) + var params_h := {"hero_override": {}, "treasure_unlocked": {}, "attunement": ["fog_lantern"]} + Kit.check_quiet(adr_h.start_adventure(5678, params_h), "P6 装配冒险启动(seed 5678——params 带 fog_lantern)") + Kit.check_quiet(adr_h.runner().pick_next_node(int(adr_h.runner().next_candidate_ids()[0])), "P6 选路进首战") + Kit.check_quiet(adr_h.runner().current_battle().attune_has("fog_lantern"), "P6 首战装配集含 fog_lantern(attune_has 只读出口)") + var sm_i = SaveManagerScript.new(_bp_path) + Kit.check_quiet(sm_i.load_from_disk() and sm_i.has_breakpoint(), "P6 断点在档(停点可中断)") + var adr_i = AdventureRunnerScript.new(db, load("res://core/rng_service.gd").new()) + adr_i.set_save_manager(sm_i) + Kit.check_quiet(adr_i.resume_adventure(sm_i.breakpoint_snapshot(), params_h), "P6 续玩受理(装配集随 params 再注入)") + Kit.check_quiet(adr_i.runner().pick_next_node(int(adr_i.runner().next_candidate_ids()[0])), "P6 续玩选路进首战") + Kit.check_quiet(adr_i.runner().current_battle().attune_has("fog_lantern"), "P6 回局首战装配集仍含 fog_lantern(停点往返载体态一致)") + _clear_disk() - quit(Kit.finish("breakpoint_resume_test", "PASS — 断点往返/续玩确定性/幂等/退出清断点 全绿")) + quit(Kit.finish("breakpoint_resume_test", "PASS — 断点往返/续玩确定性/幂等/退出清断点/装配存档回归 全绿")) func _board_fingerprint(b) -> String: diff --git a/game/tests/unit/core/fog_lantern_wiring_test.gd b/game/tests/unit/core/fog_lantern_wiring_test.gd new file mode 100644 index 00000000..55bcb19f --- /dev/null +++ b/game/tests/unit/core/fog_lantern_wiring_test.gd @@ -0,0 +1,60 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# 提灯载体 fog_lantern 装配链单测(迭代 19 卡④ T3——测试三形态之「呈现桥判定=注入装配集 stub 的 +# 单测 + 行加载单测」(任务书契约 9);probe=case⑮ 载体级段 / smoke=现有套件加断言,另两形态不在本件)。 +# 覆盖:真实表行加载+schema 校验零违例 / 行字段裁值逐键 / 同调目录词表收录 / attune_has 只读出口 +# 双态(组合根 _sync_fog_lantern 消费面)/ begin_battle enc 注入面。 +# 运行:godot --headless --path game --script res://tests/unit/core/fog_lantern_wiring_test.gd(expect 0) +extends SceneTree + +const Kit := preload("res://tests/unit/test_kit.gd") # check/汇总退出样板单点(静默收集通道) + + +func _init() -> void: + # ① 行加载+schema 校验(真实 treasure_items.tres——活行空 effect_kinds 豁免以 row.has("triggers") + # 为条件(treasure_item_table.gd:111),triggers 键漏写=加载红——本断言钉住该易错点) + var tbl = load("res://data/tables/treasure_items.tres") + Kit.check_quiet(tbl != null and tbl.validate().is_empty(), + "fog_lantern 入表后 TreasureItemTable.validate 零违例(KEY_WHITELIST/活行校验全过)") + var row: Dictionary = tbl.row_by_id("fog_lantern") if tbl != null else {} + Kit.check_quiet(not row.is_empty() and String(row.get("display_name", "")) == "魔法提灯" + and String(row.get("desc", "")) == "灯光区半径+2" + and String(row.get("form", "")) == "passive" and int(row.get("slot_cost", -1)) == 1 + and row.has("triggers") and (row.get("triggers", []) as Array).is_empty() + and (row.get("effect_kinds", []) as Array).is_empty() + and String(row.get("target", "")) == "none" and int(row.get("magnitude", -1)) == 0 + and String(row.get("use_phase", "")) == "active_dig" + and (row.get("dimension_tags", []) as Array) == ["info"] + and not row.has("unlock_requires") + and not bool(row.get("retired", false)) and not bool(row.get("deferred", false)), + "行字段逐键=用户「按推荐」裁值(魔法提灯/灯光区半径+2/passive/slot_cost 1/显式 triggers 空/none/0/active_dig/[info]/unlock 键省略=已解锁/活行)") + var in_att := false + for r in (tbl.attunement_rows() as Array): + if String(r.get("item_id", "")) == "fog_lantern": + in_att = true + Kit.check_quiet(in_att, "同调目录词表收录 fog_lantern(attunement_rows=form 非空活行口径)") + + # ② 数据表宿主(②③需 db) + var db = load("res://core/config_db.gd").new() + if not db.load_tables("res://data/tables", false): + print("[fog_lantern_wiring_test] FAIL — 数值表加载失败") + quit(1) + return + + # ③ 呈现桥判定 stub:装配集直注→只读出口双态(组合根 _sync_fog_lantern 消费面——不经完整战斗) + var rng_a = load("res://core/rng_service.gd").new() + rng_a.set_master_seed(191) # 播种(EC7 未播种取数致命——begin_battle 板生成取号前提) + var orch = load("res://core/battle_orchestrator.gd").new(db, rng_a) + orch.attunement = ["fog_lantern"] + Kit.check_quiet(orch.attune_has("fog_lantern"), "attune_has(fog_lantern)=true(装配集在册)") + Kit.check_quiet(not orch.attune_has("luck_coin"), "attune_has(luck_coin)=false(他件不误判)") + orch.attunement = [] + Kit.check_quiet(not orch.attune_has("fog_lantern"), "attune_has(fog_lantern)=false(空集=复原语义读数源)") + + # ④ begin_battle enc 注入面(runner→enc.attunement→orchestrator 运行态) + var rng_b = load("res://core/rng_service.gd").new() + rng_b.set_master_seed(192) + var orch2 = load("res://core/battle_orchestrator.gd").new(db, rng_b) + Kit.check_quiet(orch2.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp), "attunement": ["fog_lantern"]}) + and orch2.attune_has("fog_lantern"), "begin_battle enc.attunement 注入→attune_has=true(每战装配链装载)") + + quit(Kit.finish("fog_lantern_wiring_test", "PASS — 行加载/schema 校验/同调词表收录/只读出口双态/enc 注入面 全绿")) diff --git a/game/tests/unit/core/fog_lantern_wiring_test.gd.uid b/game/tests/unit/core/fog_lantern_wiring_test.gd.uid new file mode 100644 index 00000000..77ccd6c8 --- /dev/null +++ b/game/tests/unit/core/fog_lantern_wiring_test.gd.uid @@ -0,0 +1 @@ +uid://jlkj801c81qd From 8374c9caf16c6fef81609dcd29dafda15ca1a8fe Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 8 Oct 2026 16:54:59 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E5=8D=A1=E2=91=A3T4?= =?UTF-8?q?=E2=80=94=E2=80=94=E8=B4=A6=E5=8A=A1=E8=90=BD=E6=96=87=EF=BC=9A?= =?UTF-8?q?=E6=94=B9=E9=81=93=E6=8C=87=E8=B7=AF=E5=8F=A5=E5=AE=9E=E6=9F=A5?= =?UTF-8?q?=206=20=E5=A4=84=E5=85=A8=E6=8D=A2=E4=BB=A3=E9=9B=B6=E6=97=A7?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E6=AE=8B=E7=95=99=EF=BC=88=E2=91=A0board=5Fv?= =?UTF-8?q?iew.gd:139=20=E5=B8=B8=E9=87=8F=E6=B3=A8=E9=87=8A=E2=91=A1:145?= =?UTF-8?q?=20setter=20=E6=B3=A8=E9=87=8A=3D=E8=BD=BD=E4=BD=93=20fog=5Flan?= =?UTF-8?q?tern=20=E8=90=BD=E7=B1=8D+=E5=91=88=E7=8E=B0=E6=A1=A5=E5=AE=9E?= =?UTF-8?q?=E5=90=8D=E6=8C=87=E8=B7=AF=E2=91=A2art-bible.md:387=20?= =?UTF-8?q?=E9=A2=84=E7=95=99=E4=B8=8D=E6=8E=A5=E2=86=92=E5=B7=B2=E6=8E=A5?= =?UTF-8?q?=E8=90=BD=E7=B1=8D+=E5=B8=B8=E9=87=8F=E6=8B=9F=E5=90=8D=20LIGHT?= =?UTF-8?q?=5FRADIUS=5FLANTERN=5FBONUS=20=E9=A1=BA=E6=89=8B=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E8=90=BD=E7=A0=81=E5=AE=9E=E5=90=8D=20FOG=5FLANTERN?= =?UTF-8?q?=5FBONUS=E2=91=A3HUD=E6=A1=86=E6=9E=B6.md:168=20=E9=85=8D?= =?UTF-8?q?=E5=A5=97=E6=8B=8D=E6=9D=BF=E6=AE=B5=E6=94=B9=E9=81=93=E6=B3=A8?= =?UTF-8?q?=E8=AE=B0=E2=91=A4:170=20=E5=AE=9E=E6=96=BD=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=AE=B5=202=20=E5=A4=84=E6=95=B4=E6=AE=B5=E6=8D=A2=E4=BB=A3+?= =?UTF-8?q?=E5=8D=A1=E2=91=A3=E8=90=BD=E7=B1=8D=E6=B3=A8=E8=AE=B0+LIGHT=5F?= =?UTF-8?q?RADIUS=5FLANTERN=5FBONUS=20=E5=90=8C=E5=8F=A3=E5=BE=84=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=EF=BC=9B=E6=AE=8B=E7=95=99=20Alpha=20=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E4=BB=B6=E5=AD=97=E6=A0=B7=E4=B8=89=E5=A4=84=E5=9D=87?= =?UTF-8?q?=3D=E9=94=80=E8=B4=A6=E5=A3=B0=E6=98=8E/=E6=94=B9=E9=81=93?= =?UTF-8?q?=E7=95=99=E7=97=95=E5=8F=99=E4=BA=8B=E9=9D=9E=E6=B4=BB=E6=80=A7?= =?UTF-8?q?=E6=8C=87=E8=B7=AF=EF=BC=8Cqa=20=E5=8E=86=E5=8F=B2=E6=88=90?= =?UTF-8?q?=E6=96=87=E9=9B=B6=E8=A7=A6=E7=A2=B0=EF=BC=89=EF=BC=9B06-?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95=20=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=BC=80=E5=B1=80=E5=90=8C=E8=B0=83=E4=BC=A0=E5=8F=82=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=E6=9D=A1=E5=9B=9E=E5=86=99=E8=90=BD=E7=B1=8D=E6=80=81?= =?UTF-8?q?=EF=BC=88=E5=8D=A1=E2=93=AA=20merge=209160942+build=5Fadventure?= =?UTF-8?q?=5Fparams=20=E4=BF=AE=E5=A4=8D=E9=9D=A2+resume=20tree=5Frules?= =?UTF-8?q?=20=E5=8F=97=E7=90=86=E7=BC=BA=E5=8F=A3=E6=8A=AB=E9=9C=B2?= =?UTF-8?q?=EF=BC=89=EF=BC=9B=E7=A7=98=E5=AE=9D.md=20=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E4=B9=9D=E4=BB=B6=E2=86=92=E5=8D=81=E4=BB=B6=EF=BC=88=E9=AD=94?= =?UTF-8?q?=E6=B3=95=E6=8F=90=E7=81=AF=E5=85=A5=E5=86=8C+=E8=A2=AB?= =?UTF-8?q?=E5=8A=A8=E5=85=AD=E2=86=92=E4=B8=83=EF=BC=89+=E9=80=9F?= =?UTF-8?q?=E8=A7=88=E5=AE=9E=E7=8E=B0=E9=9D=A2=E6=96=87=E4=BB=B6=E5=90=8D?= =?UTF-8?q?=E9=A1=BA=E6=89=8B=E8=AE=A2=E6=AD=A3=20aux=5Fitems.tres?= =?UTF-8?q?=E2=86=92treasure=5Fitems.tres+=E6=8A=95=E6=94=BE=E6=80=81?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0=E5=8D=81=E4=BB=B6=E5=8F=A3=E5=BE=84+v1.1=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=A1=8C=EF=BC=9Broadmap=20=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=2019=20=E8=A1=8C=E5=8D=A1=E2=91=A3=E6=AE=B5=E8=90=BD?= =?UTF-8?q?=E7=B1=8D=E7=99=BB=E8=AE=B0=EF=BC=88T1-T5=20=E5=85=A8=E8=AE=B0?= =?UTF-8?q?=E5=BD=95+=E5=87=BA=E5=8F=A3=E6=8A=A5=E5=91=8A=E6=8C=87?= =?UTF-8?q?=E8=B7=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 2 +- design/gdd/06-待办清单.md | 4 ++-- design/gdd/systems/排雷循环/秘宝.md | 7 ++++--- design/gdd/systems/表现与支撑/HUD框架.md | 4 ++-- game/presentation/views/board_view.gd | 7 ++++--- roadmap.md | 3 ++- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/design/art/art-bible.md b/design/art/art-bible.md index eb2e69d8..d5257b4c 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -384,7 +384,7 @@ > **白话**:战斗棋盘不再整板可见——只有以角色为中心的菱形灯光区看得清,区外没开过的格子沉入全黑,开过的格子留下灰阶的「记忆」。像在洞穴里举灯探索。机制口径(可见性/生命周期/纯呈现纪律)的正主 =《HUD框架》「视野迷雾:菱形灯光区与黑暗边界」节(全项目唯一正主,引用只指路),该节点名「黑暗区域渲染规格(暗淡态明度、迷雾过渡)归 art-bible」,本节即其承载——只管"怎么画",不复述机制。纯呈现层:格态、数字真值、清图判定零影响;零素材新增(全部程序化遮罩/调制);类型微光语义零改动。 -- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——正主「灯光区起步半径=微光环 8 格」的落码口径(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,正主《HUD框架》「未开格类型微光」节),**不随灯光区扩**(正主配套拍板④)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:LIGHT_RADIUS_LANTERN_BONUS = **+2**(flat 整数档,正主配套拍板),**预留不接效果**(接线归 Alpha 信息件批)。边界随角色格位逐格重算,无半径插值动画。←正主;§2 光照氛围允许域 +- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——正主「灯光区起步半径=微光环 8 格」的落码口径(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,正主《HUD框架》「未开格类型微光」节),**不随灯光区扩**(正主配套拍板④)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:FOG_LANTERN_BONUS = **+2**(flat 整数档,正主配套拍板;落码常量名 `board_view.gd FOG_LANTERN_BONUS`——本条旧记 LIGHT_RADIUS_LANTERN_BONUS 系文档侧拟名,随迭代 19 卡④落籍对齐实名),**已接效果落籍**(2026-10-08 迭代 19 卡④:载体=秘宝·同调位 fog_lantern「魔法提灯」行,组合根每战装配链显式重算接线;呈现画法零改动——本节只管"怎么画",机制正主仍归《HUD框架》)。边界随角色格位逐格重算,无半径插值动画。←正主;§2 光照氛围允许域 - **区外未开格:全黑不渲染(不透明档,照抄正主)**:正主原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③正主验收线「区外未开格不可见」须二值态才能逐格断言。←正主;§4.2 - **区外已开格:暗淡记忆态(灰显可读档,2026-10-06 UI 设计对齐批 P10 乙换装)**:画法 = **地板纹理原样 + 灰罩压顶**(demo 口径换装——原「程序化素色记忆板平涂」退役;纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动)+ 格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**;数字对合成底实测 **≈6.7:1 ≥4.5:1**(WCAG 硬指标;地板纹理均值 #453020 与灰罩合成后 #3E3731 复算,迭代 16 T0)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);格底明度差为辅助通道;③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,正主口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2 - **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②正主验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←正主;§1.2 原则一;§3.2 diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 0981f2e6..3615c96b 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -24,9 +24,9 @@ **现状**:`main.gd:475` `_start_adventure` 参数面只传 `hero_override`/`first_script`/`treasure_unlocked`/`shop_mode` 四键,未传 `attunement`/`attune_refresh_y`/`tree_rules`;runner 受理面存在(`adventure_runner.gd:128-137`,缺省空数组=白板开局);营地装配持久化于 `save.attunement_equipped`(`meta_progression.gd:354-366`)但呈现层开局无传参调用——**主菜单开新局时,营地装配的同调件与局外天赋树规则键疑似不生效**。冒烟未拦系 smoke_all 直呼 runner 参数面(`smoke_all.gd:4304` 有传参)跳过了呈现层。2026-10-06 数据驱动架构调研顺带发现,本人已复核传参面代码,未实机复验。 -**归属**:缺陷修复 mini-loop(复验+修复待用户令) +**归属**:~~缺陷修复 mini-loop(复验+修复待用户令)~~ 迭代 19 卡⓪①号项(2026-10-08 用户令并入迭代 19、执行序第一) -**状态**:**缺陷确认成立(2026-10-07 本会话静态考证)**——传参面 main.gd:510(开局)/:470(继续上局)均 4 键,接收面 adventure_runner.gd:129-138/215-217 缺省空集,全仓无补偿路径(runner 不读 save/呈现层无二次装配/营地钩子仅刷新投影七条候选逐一排除),真实局同调/X/Y 恒空、仅冒烟夹具 level_autoplay.gd:160-169 喂值,冒烟零覆盖。**已编入迭代 19 卡⓪**(原迭代 20 头卡:2026-10-07 立为迭代 20 头卡,同日曾短暂编入迭代 19 又随其清空撤出,2026-10-08 用户令终并入迭代 19 为卡⓪、执行序第一;含开场行生效值+传参断言+重复行清理)。 +**状态**:**✅ 已修复落籍(2026-10-08 迭代 19 卡⓪,merge 9160942)**——缺陷确认成立(2026-10-07 本会话静态考证):传参面 main.gd:510(开局)/:470(继续上局)均 4 键,接收面 adventure_runner.gd:129-138/215-217 缺省空集,全仓无补偿路径,真实局同调/X/Y 恒空、仅冒烟夹具喂值,冒烟零覆盖。修复=①②`main.build_adventure_params` static 统一构造(开新/续玩两入口共用,attunement/attune_refresh_y/tree_rules 三键随开局下传,取值与营地投影同源)+开场行改传生效值(卡⓪②号项同批);③冒烟补两入口传参断言(+6);④删三行重复赋值。重闸三件全绿(冒烟 840/0)。**遗留披露**:resume 侧 tree_rules 受理缺口在册(runner resume_adventure 现收 attunement/attune_refresh_y 两键、tree_rules 暂不消费——传参先行,归用户裁)。原「疑似缺陷待复验」态就此销账。 #### 关卡开场行攻血显示初始表值——缺陷确认(2026-10-07 本会话考证登记) diff --git a/design/gdd/systems/排雷循环/秘宝.md b/design/gdd/systems/排雷循环/秘宝.md index 0923ccfc..e41db81c 100644 --- a/design/gdd/systems/排雷循环/秘宝.md +++ b/design/gdd/systems/排雷循环/秘宝.md @@ -12,10 +12,10 @@ - ~~**过渡形态**(2026-09-29 迭代 7 落籍)~~ **已退役**:掉落投放(2026-10-01 已随「挖格不掉道具」退役)/奖励节点三选一道具卡(2026-10-03 T7 出池)/关卡域库存/挖掘期两步使用——本文以下正文章节「掉落池获取」「关卡域库存」「什么时候怎么用」诸节随之整体退役,保留为历史口径(本节横幅为准)。 - **终局形态(现行)= 局外同调件**:开局前在营地装配(营地·道具工坊柜台「同调装配」段)、占同调位(0 起步、硬上限 3,slot_cost 恒 1)、被动件整局生效/主动件每冒险充能(冒险开始重置)。设计权威底稿 = 原提案(git 57da58c 已退役——2026-09-22 用户八条拍板)+ 任务书 v1.1(P1-P8 全裁,已退役)。 -**现行形态速览**(实现面 = `game/data/tables/attunement_growth.tres` + `aux_items.tres` + `game/core/attunement.gd`): +**现行形态速览**(实现面 = `game/data/tables/attunement_growth.tres` + `treasure_items.tres`〔旧记 aux_items.tres 系过时文件名,2026-10-08 迭代 19 卡④顺手订正〕 + `game/core/attunement.gd`): - **同调位增长**:通关次数 + Boss 击杀数(含重复,收束入账 save v4)经 `attunement_growth.tres` 里程碑谓词表实时求值(Σ达成 grant clamp slot_cap)——试玩调平衡=改表不动码(迭代 10 欠账③已清偿:过渡键 transitional_sync_slots 退役)。 -- **目录九件**(值全 provisional 归难度曲线与Boss):被动六件=淬毒刃纹(克制面穿刺/魔法直伤 +N)/标中殉爆(每标中一旗全体存活敌吃 N 群伤)/惊巢反制(挖雷惩罚减半+反弹 N)/工兵晨令(前 effective_rounds 轮每轮 +1 AP,P4 甲表值化)/偏运硬币(装板摇号稀有正向 kinds 权重 +N,池结构零触碰)/三选一刷新件(X 次/每碰三选一);主动三件=掘进蓄能(每开够 N 安全格积 1 点发起临时 AP,charges 2/冒险)/探巢摆钟(3×3 真视窄域,charges 2/冒险)/爆破工兵包(3×3 真视 + 4 AP + **中立移除雷格**,active_charged 装配件 charges 2/冒险——迭代 13 实装,见下「中立移除」注)。 +- **目录十件**(值全 provisional 归难度曲线与Boss):被动七件=淬毒刃纹(克制面穿刺/魔法直伤 +N)/标中殉爆(每标中一旗全体存活敌吃 N 群伤)/惊巢反制(挖雷惩罚减半+反弹 N)/工兵晨令(前 effective_rounds 轮每轮 +1 AP,P4 甲表值化)/偏运硬币(装板摇号稀有正向 kinds 权重 +N,池结构零触碰)/三选一刷新件(X 次/每碰三选一)/**魔法提灯**(灯光区半径 +2——视野迷雾外扩纯呈现载体件,2026-10-08 迭代 19 卡④落籍,triggers 显式空=不订阅结算事件不走效果引擎,接线=组合根每战装配链显式重算,正主=HUD框架「视野迷雾」节);主动三件=掘进蓄能(每开够 N 安全格积 1 点发起临时 AP,charges 2/冒险)/探巢摆钟(3×3 真视窄域,charges 2/冒险)/爆破工兵包(3×3 真视 + 4 AP + **中立移除雷格**,active_charged 装配件 charges 2/冒险——迭代 13 实装,见下「中立移除」注)。 > **中立移除(迭代 13 T7/T8 实装口径;裁决事实源=任务书-工程债与测试基建批-2026-10-04.md P1/P2 甲,随批吸收本节为正主)**:使用时对 3×3 区域做**中立移除**——只移除「未揭示、无旗、是雷」的格:不引爆、不揭示、不进连锁;被移除格退色降档呈现(暗淡记忆态同族)、不可挖掘不可插旗(拒绝零消耗);**周边邻接数字=原始雷数冻结不重算(P1 甲)**,移除格自身无数字可保留(未揭示雷格本无数字,P2 甲空集真)。清图判定零涉(分母只数安全格,雷格不入);旗判定基线零回溯(有旗格跳过移除)。获得渠道=营地同调位装配(不入掉落投放池——form 非空行永不入过渡渠道,模拟/自动档零涉,MC 读数零扰动)。 - **三选一刷新双源**(P1 甲):X=刷新件每碰三选一重给(优先消耗、不结转)+ Y=营地刷新升级行(每冒险开局注入冒险周期池、用完即无;meta.tres attune_refresh_upgrade 行族);重抽消费 reward_pick 既有洗牌流,池规则全保留;autoplay 默认不刷(钓鱼归玩家)。**GP 付费档(2026-10-06 用户令——三选一刷新对齐商店独立刷新)**:免费双源用尽后可 GP 付费刷新,价=ceil(20×1.8^本次停点已付费刷) provisional(与商店货架刷新读同两个调参旋钮 shop_refresh_*,单点调参);付费刷计数每停点清零(与商店进店清零同构);钱包=冒险 GP 同一账本(LevelRunner.spend_gp 单口);余额不足=钮禁用(不隐藏,对齐商店)。店内门票专长三选一暂不挂刷新面(维持现状,扩面须先裁门票保底计数交互)。**两账语义**(框架见[核心循环](../../01-核心循环.md)「生命周期轴」节):Y=存量账(冒险级计数器,开局注入基值;道具可一次性加仓、加完该道具消尽;跨呈现持续、用完即无);X=当次临时账(每次三选一呈现重置为基线;消耗顺序=先扣临时、后扣存量;未用临时不结转)。**「三选一呈现」是比节点更细的事件**——奖励节点、Boss 通关奖励、商店(门票)三处都触发;X 挂呈现、不挂节点。奇物「刷新次数+1」类资源件的语义=存量账一次性加仓。 @@ -170,7 +170,7 @@ |---|---|---|---|---|---|---| | 探宝罗盘 / 工兵令 / 探巢摆钟 / 爆破工兵包 / 显影尘 / 地穴全图卷(六行,行结构如左列序) | — | — | — | — | 六行登记值(w / t / mag 等)以 registry `aux_items` mvp_content 为准 | — | -投放态注记(2026-10-04 迭代 13 随批校正):迭代 11 同调批起道具件获渠=**营地同调位装配**(form 非空行——现役九件全数同调行,含探巢摆钟/掘进蓄能/爆破工兵包两代工兵系);掉落投放池过渡渠道现行**零行**(工兵令 sapper_order 已 retired 由工兵晨令 dawn_order 接位、探宝罗盘 retired 词表兼容留痕、显影尘/地穴全图卷 deferred 能力封存呈现);奖励三选一的道具件令牌随池空集休眠(aux_item 词表位保留)。 +投放态注记(2026-10-04 迭代 13 随批校正;2026-10-08 迭代 19 卡④随十件口径顺笔):迭代 11 同调批起道具件获渠=**营地同调位装配**(form 非空行——现役十件全数同调行,含探巢摆钟/掘进蓄能/爆破工兵包两代工兵系+魔法提灯视野件);掉落投放池过渡渠道现行**零行**(工兵令 sapper_order 已 retired 由工兵晨令 dawn_order 接位、探宝罗盘 retired 词表兼容留痕、显影尘/地穴全图卷 deferred 能力封存呈现);奖励三选一的道具件令牌随池空集休眠(aux_item 词表位保留)。 两件稀有道具的定位读数:双维组合加数值跳档。爆破工兵包的加量锚定“半轮预算”(锚定比例见[行动经济](行动经济.md),ap_per_round 现值见 action_economy.tres;两者调参联动复核);稀有件供给读数由掉落权重推导(registry `aux_items`),本文不登记读数。 @@ -216,6 +216,7 @@ playtest 预警(预注册,归难度曲线与Boss): | v0.6 | 2026-09-30 | **拍板点 1 收口批(2026-09-30 用户裁决甲:同调=终局方向)**:①新增「定位与形态沿革」节——现行正文定性=切片期过渡形态、终局=局外同调件(设计权威底稿=原提案八拍板,git 57da58c 已退役),两态关系=形态替换、衔接纪律与事故留痕入节;②正文口径回写四处:五维度表信息/规划/反制三行改现行态(罗盘退役/显影件封存/豁免面入正文)、覆盖检查改投放维度覆盖口径、掉落池获取节补解锁门控(2026-09-29 拍板③甲)、板级叠加层预读集改「机制在案无投放来源」;③验收两条(护栏/覆盖检查)与调参表投放态注记、地形变异依赖行同步;④实施批登记见 06「秘宝同调实施批」条。审计冲突 C19/C29 随批收口(全录见审计报告 git 提交 c095916,报告已退役) | | v0.7 | 2026-10-01 | **奖励节点渠道改写注记(迭代 10 追加批——用户拍板「奖励节点与通关三选一共享同池」)**:①「奖励节点三选一构筑点」形态(v0.5 ④)退役——奖励节点改提升三选一共享池(秘宝件为池中 1/6 权重选项,同调位满位替换交互随 BonusPickOverlay 共用面生效,spec:node-reward.md v2.0);②道具件经节点渠道入本关库存(来源归因 reward_node,与掉落/三选一渠道同受 transitional_sync_slots 过渡上限约束);③战斗掉落渠道零改动;④本批过渡约束形态与切换义务注记见 registry aux_items 条同日批注;同调实施批的全渠道统一收口义务不变 | | v0.8 | 2026-10-03 | **反制契约作废批(2026-10-03 用户终裁——层级错配失败设计)**:①五维度「反制」行与豁免面 {plan, info, counter} 的 counter 注记改终裁态(原框架契约「每变异≥1反制道具」作废,终裁理由见地形变异.md v0.6/本文件 v0.8 版本行(原 06 条目已收口移除));②上游地形变异依赖行、P2 后置行同步改「迭代 12 调研前置重定」;③地形变异.md v0.6 同批落义务作废注记;④迭代 11 范围裁定(同调→商店→迷雾三批)见 roadmap 迭代 11+ 行——反制批移迭代 12 | +| v1.1 | 2026-10-08 | **提灯载体行入目录(迭代 19 卡④)**:目录九件→十件(被动七件——新增魔法提灯 fog_lantern「灯光区半径+2」,视野迷雾外扩纯呈现载体件,triggers 显式空=不订阅结算事件不走效果引擎,接线=组合根每战装配链显式重算,效果语义正主=HUD框架「视野迷雾」节);速览实现面文件名订正 aux_items.tres→treasure_items.tres(过时残留);投放态注记随十件口径顺笔。行值=用户「按推荐」全收(provisional 出口追认随卡④出口报告) | | v1.0 | 2026-10-06 | **效果声明换代(内容数据驱动扩展批)**:被动六件(淬毒刃纹/偏运硬币/工兵晨令/惊巢反制/标中殉爆)改订阅行+掘进蓄能受理闸数据化(使用事件订阅+积点计数器)——按件 id 硬编码清零;结构冻结六条零触碰,行为与迁移前逐位一致(MC 同种子 40 局对拍实证)。 | v0.9 | 2026-10-05 | **消歧更名批(用户拍板 2026-10-05):系统更名「魔法道具」→「秘宝」**。**更名理由**:「魔法」一词在本作已被征用为敌方侧伤害/护甲语汇(`magic_bolt 魔法矢` / `magic_recoil 魔法反噬` / `magic 魔法族` 格面微光 / `ward 魔法护甲`),「魔法道具」易被读成"魔法属性的道具";「秘宝」取"神秘·强大·稀有"义,与九件内容气质(工兵/工程/手艺向)契合,且与局内道具(奇物)不冲突。**同调位机制名保留不变**(attunement 仍为 DND 词,机制血统不受更名影响)。**本批仅改文档称谓,代码不动**——代码标识符仍为 `aux_*` / `AUXILIARY_ITEMS`(auxiliary 词根为过渡形态遗留,与中文名不同步属已知欠债,另批处理);退役路径残留玩家可见文案(`battle_narrator.gd:117-118`、`bonus_interact_controller.gd:76`)亦留另批。历史定稿文档(research/ 提案与任务书、qa/ 检查单、archive/ 归档)按换名先例原样保留不改。 | | v1.2 | 2026-10-07 | **三层职责分界批(用户裁——框架正主=[核心循环](../../01-核心循环.md)「道具三层职责与分界」节同批落文)**:头部一句话由「扫雷侧同调机制件·机制轴唯一来源」换代为「营地装配的角色机能件」(操作包络加强,不出裸属性值、不改战斗结算机制);现行目录机制向三件(淬毒刃纹/标中殉爆/惊巢反制)经用户点名与本约束不符,归留本层重设计批处置,冻结期内维持现状;正文与承重契约零改动(正文「机制轴」表述刷新归本层重设计批) | diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md index f08567c1..feea3584 100644 --- a/design/gdd/systems/表现与支撑/HUD框架.md +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -165,9 +165,9 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 | 关联与边界 | 与「未开格类型微光」同边界——灯光区起步半径=微光环 8 格(同圈起步,实测后可调);格态数据归[排雷玩法](../排雷循环/排雷玩法.md);黑暗区域渲染规格(暗淡态明度、迷雾过渡)归 [art-bible](../../../art/art-bible.md) 修订随实施批;初始展开收窄不在本案(后置与 Alpha 差异化批窗口合并再议) | | 实装状态 | **已实装**(2026-10-03 迭代 11 第④批落籍;四裁决逐条对账与验收线转正见本节末「实施状态」注记;渲染规格 = [art-bible](../../../art/art-bible.md) §6.5) | -配套拍板(同日):魔法提灯=灯甲形态(光照圈外扩 +2 格,flat 整数档)随迷雾立项;**类型微光不随视野扩大**(类型先读仍只贴身 8 格,微光锚=可挖域);提灯载体归 aux_items 新行,随 Alpha 信息件重定批一并登记,呈现面挂「资产升档重产批」。 +配套拍板(同日):魔法提灯=灯甲形态(光照圈外扩 +2 格,flat 整数档)随迷雾立项;**类型微光不随视野扩大**(类型先读仍只贴身 8 格,微光锚=可挖域);提灯载体归 aux_items 新行(登记原文——2026-10-07 用户令改道为独立卡,2026-10-08 裁案A=秘宝·同调位新行落位,见下方实施状态注记),呈现面挂「资产升档重产批」(挂账不动)。 -**实施状态(2026-10-03 迭代 11 第④批落籍)**:迷雾遮蔽+菱形灯光区跟随+暗淡记忆态上线,探针断言随批扩(ui_input_probe case⑮)。四裁决逐条对账——①案甲视野迷雾立项(纯呈现层):迷雾开关分层验证可用(呈现态布尔,off 态=无迷雾基线),同板同动作序列与 MC 对拍逐位一致;②暗淡记忆态:区外已开格灰显+数字可读,明度按 [art-bible](../../../art/art-bible.md) §6.5 落文值(记忆板 #3A3A3A/记忆墨 #C4C4C4,provisional);③灯光半径=微光环 8 格同圈:LIGHT_RADIUS=8 参数化(曼哈顿菱形,常量);④提灯 +2、微光不扩:LIGHT_RADIUS_LANTERN_BONUS=+2 预留未接效果(接线归 Alpha 信息件批),类型微光仍贴身 8 邻格零改动。**〔2026-10-05 迭代14⑤接线注记〕公共接线面已就位**——`board_view.set_fog_lantern(enabled)`(true=半径 8+2、false=复原 0;写入即 refresh 重算雾态),半径算式消费 `_fog_lantern` 迷雾批已在位;提灯载体〔aux_items 新行〕仍归 Alpha 信息件重定批,到位后由组合根/库存挂接调用 setter;ui_input_probe case⑮ 增接线断言(开=dist 9 格转可见+lantern=2/关=复原)。验收线(本篇「验收标准」视野迷雾行)逐条转正式验收:区内完整渲染/区外已开格灰显可读/区外未开格不可见/灯光区随移动跟随/两态结算逐位一致;实机目检人闸(迷雾观感/记忆态可读性/移动跟随流畅度)随出口闸。黑暗区域渲染规格承载 = art-bible §6.5(v3.5)。 +**实施状态(2026-10-03 迭代 11 第④批落籍)**:迷雾遮蔽+菱形灯光区跟随+暗淡记忆态上线,探针断言随批扩(ui_input_probe case⑮)。四裁决逐条对账——①案甲视野迷雾立项(纯呈现层):迷雾开关分层验证可用(呈现态布尔,off 态=无迷雾基线),同板同动作序列与 MC 对拍逐位一致;②暗淡记忆态:区外已开格灰显+数字可读,明度按 [art-bible](../../../art/art-bible.md) §6.5 落文值(记忆板 #3A3A3A/记忆墨 #C4C4C4,provisional);③灯光半径=微光环 8 格同圈:LIGHT_RADIUS=8 参数化(曼哈顿菱形,常量);④提灯 +2、微光不扩:FOG_LANTERN_BONUS=+2(落码常量实名——本条旧记 LIGHT_RADIUS_LANTERN_BONUS 系文档侧拟名,随卡④落籍对齐),类型微光仍贴身 8 邻格零改动。**〔2026-10-05 迭代14⑤接线注记〕公共接线面已就位**——`board_view.set_fog_lantern(enabled)`(true=半径 8+2、false=复原 0;写入即 refresh 重算雾态),半径算式消费 `_fog_lantern` 迷雾批已在位;ui_input_probe case⑮ 增接线断言(开=dist 9 格转可见+lantern=2/关=复原)。**〔2026-10-08 迭代 19 卡④落籍注记〕载体到位+接线闭环=功能可达**——载体=秘宝·同调位新行 `fog_lantern`「魔法提灯」(treasure_items.tres 表尾追加,desc「灯光区半径+2」,slot_cost 1、营地道具工坊同调装配获渠,行字段=用户「按推荐」全收);生产路径=runner set_attunement→enc.attunement→begin_battle 注入 orchestrator 装配集→公共只读出口 `attune_has`→组合根呈现桥 `main._sync_fog_lantern` 每战首轮装配链**显式重算含否**(🔴 复原语义=禁战斗结束隐式复原——卸装/未装配写 0,断点续玩/跨关天然正确);未装配=false 写 0=缺省零扰动基线逐位不变。测试随批:case⑮ 载体级段(装配→lantern=2+dist R+1 转可见+卸装复原)+smoke 行字段/同调目录投影(九件→十件)/装配贯通断言+存档回归 Part 6+单测 fog_lantern_wiring(run_all 17→18 套)。原「提灯载体归 aux_items 新行随 Alpha 信息件重定批」登记去向就此销账(改道留痕=任务书-提灯载体道具批-2026-10-07 §一)。验收线(本篇「验收标准」视野迷雾行)逐条转正式验收:区内完整渲染/区外已开格灰显可读/区外未开格不可见/灯光区随移动跟随/两态结算逐位一致;实机目检人闸(迷雾观感/记忆态可读性/移动跟随流畅度)随出口闸。黑暗区域渲染规格承载 = art-bible §6.5(v3.5)。 ### 可访问性基线:看得清、不闪、纯鼠标玩得通 diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index da2e1393..c6f58168 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -136,13 +136,14 @@ var _digit_plate := false # 数字色牌垫底模式(双峰纹理 # ---- 视野迷雾(迭代 11 第④批 T2/T4——纯呈现层;正主=HUD框架「视野迷雾」节 v0.13,渲染规格=art-bible §6.5 v3.5)---- const FOG_RADIUS := 8 # 菱形灯光区基准半径(曼哈顿距离 ≤R——与微光环「周围 8 格」同圈起步;半径基准值改动=非白名单须用户) -const FOG_LANTERN_BONUS := 2 # 提灯视野外扩插值位(+2 预留不接效果——效果载体归 Alpha 信息件批;接线时写 _fog_lantern) +const FOG_LANTERN_BONUS := 2 # 提灯视野外扩插值位(+2=2026-09-30 拍板值;载体=迭代 19 卡④ fog_lantern 秘宝行落籍 2026-10-08——原「归 Alpha 信息件批」指路句随批换代) var _fog_enabled := true # 迷雾开关(呈现态布尔——真实游戏恒 on;探针/夹具可 off=无迷雾基线,两态结算逐位一致断言面) -var _fog_lantern := 0 # 提灯加成现值(缺省 0=未接效果——预留插值位,半径算式已接入位) +var _fog_lantern := 0 # 提灯加成现值(缺省 0=无提灯基线零扰动;生产写入面=组合根每战装配链显式重算——main._sync_fog_lantern) # 提灯视野外扩接线(迭代14⑤——2026-09-30 拍板④:灯甲视野外扩 +2、类型微光不随视野扩〔微光锚=可挖域 # 贴身 8 邻零改动〕。FOG_LANTERN_BONUS 常量与半径算式迷雾批已在位,本 setter=公共接线面:载体道具 -# 〔aux_items 提灯新行——归 Alpha 信息件重定批〕到位后由组合根/库存挂接调用;缺省 0=无提灯基线零扰动。 +# 〔fog_lantern 魔法提灯——迭代 19 卡④落籍 2026-10-08,treasure_items.tres 秘宝·同调位新行〕已到位, +# 组合根 main._sync_fog_lantern 每战首轮装配链显式重算调用;缺省 0=无提灯基线零扰动。 func set_fog_lantern(enabled: bool) -> void: _fog_lantern = FOG_LANTERN_BONUS if enabled else 0 refresh() # 灯光区半径变了——全板重算雾态(refresh/notify_hero_move 既有重绘驱动复用) diff --git a/roadmap.md b/roadmap.md index ed665ac8..7a8d986e 100644 --- a/roadmap.md +++ b/roadmap.md @@ -72,7 +72,8 @@ | 迭代 18 | **④生涯界面实装批(2026-10-06 用户令入迭代 18)**:按迭代 17 卡④设计提纲(design/gdd/systems/跨局循环/生涯.md v0.1,master 44328b1)实装「生涯」界面——跨局汇总/历史冒险回看/图鉴承接;提纲在册要点=recent_summaries 现役 cap10 扩容+用时埋点/总局数与通关局数(涉存档 schema)/营地最近冒险清单去留(P6 必答项随评审定);分期建议随提纲。任务书=`design/research/任务书-生涯界面实装批-2026-10-07.md`(v1.0——范围=提纲期一〔汇总页+主菜单入口+终身计数域存档 v6〕,期二/期三零触碰;裁点 P1 通关局数口径/P2 汇总条目集/P3 模态登记序待裁;提纲评审若改期一范围则任务书升版) | **✅ 已落地(2026-10-07 worktree iter18-career:提纲期一追认+裁点全裁〔2026-10-07 用户令代解/全甲;P6 随期二〕后 T0-T5 全落——生涯页六类九项+主菜单入口+终身计数域存档 v6;批末重闸全绿=冒烟 834/0〔基线 814/0,+20〕+run_all 17 套+四探针+ui_contrast 15 对+doc 三闸/熵增闸零新增;MC 零跑;实机人闸挂账待用户〔⑲目检条目随 07〕;出口报告=[iter18-career-exit-report](design/qa/iter18-career-exit-report-2026-10-07.md))** | T0-T5≈2.5d | | 迭代 18 | **⑤混编遭遇首批投放批(2026-10-06 用户令入迭代 18;纯内容批——机制前置=迭代 17 卡①敌人表行集多行批)**:07「后续内容批义务」落地——首个混编遭遇行+Boss 多行内容投放(敌种候选与坐标=本批裁点);首遇教学位纪律与 expect_pools 断言面逐项复核(巨蜘蛛首遇位「固定 2 不加骰」等表注释为准);难度带读数义务随批登记 07,MC 取证跑批**顺延 Alpha 收官 M4 数值批统一执行**〔未排期,届时另令——2026-10-06 用户令:数值统一调整殿后;投放本身不阻塞〕。任务书=`design/research/任务书-混编遭遇首批投放批-2026-10-07.md`(v1.0——纯内容批零代码,机制面全由卡①承载,机制缺口=L3 停机;裁点 P1 首批投放方案〔荐甲=L2 单点试水〕/P2 Boss 多行不入首批/P3 教学界保护待裁) | 迭代 17 卡①落籍(✅ 已满足 9cc4b8b)+**✅ 裁点全裁(P1-P4 甲,2026-10-07)**——开工=U0 | T0-T5≈1.75d(MC 取证顺延另计)——**✅ 已全批落表(2026-10-07,worktree g-plan2-iter18-mixenc 分支 iter18-mixenc 基点 adadf56,批内提交 ad36e35(T1 设计稿)/6272fc8(T3 落表)/43b1306(T4 断言)/⑤T5 收口批;出口报告=[iter18-mixenc-exit-report](design/qa/iter18-mixenc-exit-report-2026-10-07.md))**:(2,5) 双行混编落表〔重击手+巨蜘蛛巢群(行值复制 (2,6),P4 甲零数值新增),R6 行序=重击手在前〕;d5/d7 候选与行值来源全案留痕(d5 案选定);断言面随迁(expect_pools 三元键新池模板+行集构成/行序/Σ≤4 断言);首遇教学位 (2,4)/(3,0)/(3,1) 零触碰;07 ⑱ 目检与读数义务登记+:174 逐行骰措辞订正;闸=冒烟 814/0(基线 811/0,+3)+run_all+doc 三闸/熵增零新增(批末重闸数字见出口报告);实机目检三项归用户(同场两敌种/行序/总数 ≤4);MC 零跑(顺延 Alpha 收官 M4 数值批在案) | | 迭代 18 | **⑦新冒险种子随机化+调试浮窗升级(2026-10-07 用户令入迭代 18,同日两裁点全裁+浮窗目标态已定)**:**(a) 种子随机化**——现状考证 main.gd:1210 `_seed_value()` 调试种子框为空时硬编码返回 42=每次新冒险同一种子全程可复现;改法=玩家界面入口(主菜单开新冒险)默认分支随机生成;**✅ 裁点全裁(2026-10-07 用户令):①首次冒险维持固定种子(教学态可复现)/②测试脚本与调试接口维持显式指定种子(冒烟·MC·探针全链显式传种子零影响,锚零作废)/③种子不进玩家 UI**;断点续玩零影响(存档已载 master_seed 回填,main.gd:447 现役);与⑥收官批零耦合、排序自由。**(b) 调试浮窗升级**(承载「调试浮窗可查当局数据」裁点=种子的唯一查看位;**本项修订迭代 15 卡① P3 甲「仅开始菜单可开·对局不可达」裁决**)——目标态三件:独立于整体界面的**最高层浮窗**(对局中也可开)/DS_DEBUG=1 调试态下**默认打开**/新增**当局数据只读区块**(当前局种子/关卡/节点/HP/GP/钥石等——玩家 UI 不展示、调试浮窗可查)。考证在册(2026-10-07 实查):现行=开始覆盖层角标入口〔main.gd:292-293,DS_DEBUG=1 点亮〕+main.gd:1189 门禁「仅开始菜单可开」+Dialog 形态走 ModalStack 模态栈登记〔非最高层〕+visible=false 初始非默认开+五区块(胜利演出/种子输入/数值滑条/批量模拟/两层调试)无当局数据面。任务书待裁点:最高层与模态栈登记制的关系〔置顶/登记序末+move_child 或独立层〕/输入吞噬边界〔浮窗矩形外透传游戏输入〕/对局发起「随开随收」逻辑改向/ui_tune_probe 断言面换代/入口形态(角标宿主迁移或热键)。任务书=`design/research/任务书-种子随机化与调试浮窗升级批-2026-10-07.md`(v1.0——实装级裁点 P1 遮挡语义〔荐甲=维持登记制〕/P2 入口形态〔荐甲=角标迁宿主〕/P3 默认打开范围〔荐甲=启动即开〕/P4 当局数据字段集〔荐甲=六项〕/P5 首局种子值〔荐甲=沿用 42〕待裁;估时勘误 1d→2.0d 含探针换代与收口) | **✅ 已落地(2026-10-07 worktree iter18-seed:C1 种子三分+浮窗升级 P1-P6 甲全落;批末重闸全绿=冒烟 811/0+四探针+run_all 17 套+doc 三闸/熵增闸零新增;MC 零跑;实机人闸挂账待用户〔不阻塞落籍与后续卡④〕)** | T0-T5≈2.0d | -| 迭代 19 | **卡⓪主菜单开局缺陷修复批(原迭代 20 头卡A;2026-10-08 用户令并入本迭代、执行序第一)**:①**主菜单开新冒险+继续上局两入口补传同调三键**(attunement/attune_refresh_y/tree_rules——main.gd:510/:470,接收面 adventure_runner.gd:129-138/215-217 现成;静态考证缺陷成立:全仓无补偿路径、真实入口同调/X/Y 恒空、仅冒烟夹具喂值);②**关卡开场行攻血改传当前生效值**(main.gd:519-521 现传初始表值,与战斗面板不一致=用户确认缺陷;「含面板加成」后缀判断同步改为认局外加成);③冒烟补主菜单入口传参断言;④顺手删 adventure_runner.gd:129-134 三行重复赋值(零行为变化)。范围外=被动同调件呈现(用户令不动)、Fork 规则归因行(呈现层)、X/Y 刷新双源语义倒置(实现与用户口径镜像互换——X=刷新件源每节点重置不结转/Y=营地源整局持久/先扣 X,见 adventure_runner.gd:658-659/:706-709;用户口径=X 持久·Y 每节点重置·先扣 Y;真实局因①此前恒 0 未暴露——待用户裁定甲改实现/乙认现状,裁定落 GDD)。**卡①自动化验收补齐批(2026-10-07 用户令立项——全迭代两阶段验收盘点〔功能性+展示性,均自动化口径,不含人工目检〕的落地批)**:三件主内容——①**渲染闸自动化**:新增 `tools/render_gate.sh` 窗口化自动闸(shot_probe 四屏→shot_checker.py A-D 语义断言自动判定+fx_shot/board_shot 抓帧取证),棋盘 L1-L3 golden 逐像素基线入库 `game/tests/golden/`(测试资产入库先例,.gitignore 已核只挡 artwork/);**probe_gate 头注释「渲染闸归真人目检」纪律句删除改写**(用户 2026-10-07 明示授权=历史偷懒标记),迭代 15③ 屏蔽挂账的机器补跑半随批核销〔07⑮ 目检半仍归用户不销号〕;②**探针收编**:ui_probe/ui_tune_probe/t17_defer_probe/fx_probe 四件游离探针(实测 17.4s/49.6s/63.0s/21.9s 全绿)收进 probe_gate `--full` 段挂重闸,轻闸默认段零改;damage_probe 出闸留盘标注诊断件、config_fatal_probe 删除(与 run_all 致命类单测重复)、零断言三件标注分析工具+ui_layout 补 1280/1920 最小断言;③**账务修正**:tests/README 套件数/断言数漂移(十五→17、752+→双口径说明)+integration 空目录处置(代拍板)。〔2026-10-07 范围改道:原「明示不收」的 B4/B5/B6 三缺口经用户令各立任务书并入本迭代,本卡改称卡①,新增卡②③④见后〕。任务书=`design/research/任务书-自动化验收补齐批-2026-10-07.md`(v1.1——**待裁点 0 项**,P1-P5+拷打轮一 Q1-Q8 全裁 2026-10-07〔重闸定义正式扩容 CLAUDE.md/过程截图即弃/shot_probe 扩屏三新屏/1280 单档/素材缺位 SKIP 而基线禁锚回退态/基线换代权限呈现批 agent/取证失败=闸红/integration 删空壳〕;🔴 契约 6 条含运行时代码零 diff/轻闸零删减/在飞避让;停机点 S1 首跑存量 FAIL 全量呈报登记 06+S3 基线生成素材缺位停机;代拍板白名单四项)。**卡②旧界面呈现断言回补批(B5,2026-10-07 用户令立项)**:迭代 16 前落地旧屏追溯补 ui_contrast 测点对+ui_struct 契约——普查结论=对比度测点对旧屏 0 对(15 对现役全属 HUD/锚点/徽章/生涯)、专项契约仅 pause/career、legend/node 两屏从未过结构族;优先级=战斗结算框>商店>营地柜台+天赋树>设置面>三选一>迷雾锚定对;红线=只加断言零改旧屏、违例登记呈报不修(处置权归用户);任务书=`design/research/任务书-旧界面呈现断言回补批-2026-10-07.md`(v1.1 grilling 三轮全裁——待裁点 0 项,WL 豁免边界/迷雾合成对最坏判据/时长闸 ≤2s/出口报告/06 遗留件登记全钉死;停机点 2〔对比度首跑存量违例/legend-node 结构首跑〕,T0-T4≈1.0d,worktree iter19-uibackfill)〔2026-10-08 施工落籍·**S1 停机态**——T1+T2 测点对 15→38 对(+23:battle_end 3/shop 5/camp 9/settings 2/curio 2/迷雾合成对 1,全 UiKit 常量实时求值);**新对首跑暴露存量对比度违例 7 项**(结算 GP 账行 2.67:1/商店 legacy 行卡名 1.12:1/货架价签 1.46:1/营地铭牌副题 3.59:1/行价格 4.02:1/树分组头 2.67:1/工坊状态 3.00:1)——全量登记清单+修复建议案〔全现役常量换墨可落〕随出口报告呈用户裁,处置权归用户、批内零修(红线);违例对在册=闸红登记存量形态,修复批落后自然转绿;T3 struct 13→15 根(legend/node 全真路径开合)首跑全绿 S2 未命中、WL 零新增;冒烟 840/0+run_all 17 套件持平;出口报告=`design/qa/iter19-uibackfill-exit-report-2026-10-08.md`;settlement_review 遗留件已在 06 登记落位〕。**卡③CI 预接线批(B6,2026-10-07 用户令立项)**:tests.yml 场景探针段解封——轻 CI 段=input/struct/contrast 三探针(示例引用的 ui_probe/ui_click 归 --full 重闸不进轻 CI)、Linux 独立命令形态(probe_gate.sh 系 Windows 专用)、窗口化四件禁入 headless CI;本地无远端端到端验证不可能=验收全静态核验,「首次 push 后人工盯首跑」入移交清单;远端仓库计划两文档零登记=待裁呈报项;任务书=`design/research/任务书-CI预接线批-2026-10-07.md`(v1.2——**触发分支死角已并入修正范围=tests.yml push/pull_request 两处 [main]→[master]**〔实查:实际分支 master、main 不存在,不修则远端建好后 CI 仍永不触发〕+冷检出导入步前置 smoke 步骤之前;裁点①远端仓库=✅ 2026-10-08 裁暂不建维持待命〔预接线待命=终态〕/裁点② ui_layout 入 CI 候卡①后裁;T0-T3≈0.25d,worktree iter19-ciwire)。**✅ 卡③落籍(2026-10-08,B6 闭环——出处=自动化验收补齐批 §一明示不收件,随本批销账)**:注释探针段解封=正式轻闸三探针段(input/struct/contrast,timeout 120s 外壳+退出码 124/137 超时判+PASS 串判定=probe_gate 判定逻辑 Linux 独立镜像,三探针全跑不短路汇总定红绿)+冷检出 `--import` 导入步 300s 前置冒烟之前(job 级基础设施步同覆盖冒烟与探针 .godot 依赖)+触发分支两处 [main]→[master] 修死角+头注释追加「远端仓库建好后无需改本文件即自动生效」;探针日志落 logs/probe_ci/ 顺现有 upload-artifact 段零改并入;验收全静态过(pyyaml 解析/CI 段 res:// 引用逐一实存/timeout 外壳清单齐/轻闸术语与 probe_gate 口径对齐/diff 面=tests.yml 单文件+roadmap 本行);**⚠ S1 呈报项(该段冻结未代修,处置待用户裁)=tests.yml setup-godot 步 `nikeee/godot-actions/setup-godot@v2` 指向不存在仓库**(2026-10-08 实查:GitHub API 404+nikeee 全部 159 公共仓 grep godot 零命中+marketplace 同名件=Vitorgus/Setup-Godot v1 系 Godot3 旧件;现存活跃替代=chickensoft-games/setup-godot v2.4.3)——远端建好首跑前必须先裁此段,否则 smoke job 必红;首跑盯梢清单随任务书 §七 待远端立项之日激活。**卡④提灯载体道具批(B4,2026-10-07 用户令立项;原登记去向「Alpha 信息件重定批」就此改道入本迭代)**:board_view.set_fog_lantern 死接口(迭代 14⑤ 接线+case⑮ 断言在位,载体始终未造=完成度 0)补载体道具;备选案五件全列(案 A 秘宝同调位新行=原登记指向·推荐/案 B 专长新行·撞重设计冻结不推荐/案 C 商店货架·分类判据需新裁/案 D 显影尘行激活合并·与改道相逆/案 E 元进度树·破坏读数归因不推荐)+淘汰案六件各附依据,设计权全归用户;任务书=`design/research/任务书-提灯载体道具批-2026-10-07.md`(v1.2——**✅ 裁点全裁:2026-10-08 载体=案A秘宝同调位新行**〔行字段推荐值=执行中一次秒答,「按推荐」即全收〕;缺陷处置=卡⓪随同 goal 先行落籍=本卡 T1 前置门〔缺陷实查定案影响全部开局入口;原记迭代 20 缺陷批,2026-10-08 并入本迭代为卡⓪〕;呈现桥=只读访问器/复原语义=begin_battle 显式重算/MC=静态论证/测试三形态等工程面全钉死,T0-T5≈2.5d,worktree iter19-lantern) | 迭代 18 出口(✅ 已解——2026-10-07 四卡总收口落籍)——**开工=goal 一次跑完(2026-10-08 裁:卡⓪缺陷卡先行+卡①-④打包,全绿前禁停;subagent 并发 ≤3;唯一预期交互=卡④行字段推荐值秒答;卡⓪原迭代 20 头卡A 同日用户令并入本迭代)** | 卡⓪≈1.0-1.5d(随计划书定稿)+卡①T0-T6≈4.25d(超软盒预挂;天然切分点 T2 末——段一 T0-T2 渲染闸≈2.25d / 段二 T3-T6 收编退役账务≈2d,两段同属一迭代一次合并)+卡②T0-T4≈1.0d+卡③T0-T3≈0.25d+卡④T0-T5≈2.5-3.0d(切分点 S0:考证呈报 0.25d/实装收口 2.25-2.75d)——五卡合计≈9.0-10.0d | +<<<<<<< HEAD +| 迭代 19 | **卡⓪主菜单开局缺陷修复批(原迭代 20 头卡A;2026-10-08 用户令并入本迭代、执行序第一)**:①**主菜单开新冒险+继续上局两入口补传同调三键**(attunement/attune_refresh_y/tree_rules——main.gd:510/:470,接收面 adventure_runner.gd:129-138/215-217 现成;静态考证缺陷成立:全仓无补偿路径、真实入口同调/X/Y 恒空、仅冒烟夹具喂值);②**关卡开场行攻血改传当前生效值**(main.gd:519-521 现传初始表值,与战斗面板不一致=用户确认缺陷;「含面板加成」后缀判断同步改为认局外加成);③冒烟补主菜单入口传参断言;④顺手删 adventure_runner.gd:129-134 三行重复赋值(零行为变化)。范围外=被动同调件呈现(用户令不动)、Fork 规则归因行(呈现层)、X/Y 刷新双源语义倒置(实现与用户口径镜像互换——X=刷新件源每节点重置不结转/Y=营地源整局持久/先扣 X,见 adventure_runner.gd:658-659/:706-709;用户口径=X 持久·Y 每节点重置·先扣 Y;真实局因①此前恒 0 未暴露——待用户裁定甲改实现/乙认现状,裁定落 GDD)。**卡①自动化验收补齐批(2026-10-07 用户令立项——全迭代两阶段验收盘点〔功能性+展示性,均自动化口径,不含人工目检〕的落地批)**:三件主内容——①**渲染闸自动化**:新增 `tools/render_gate.sh` 窗口化自动闸(shot_probe 四屏→shot_checker.py A-D 语义断言自动判定+fx_shot/board_shot 抓帧取证),棋盘 L1-L3 golden 逐像素基线入库 `game/tests/golden/`(测试资产入库先例,.gitignore 已核只挡 artwork/);**probe_gate 头注释「渲染闸归真人目检」纪律句删除改写**(用户 2026-10-07 明示授权=历史偷懒标记),迭代 15③ 屏蔽挂账的机器补跑半随批核销〔07⑮ 目检半仍归用户不销号〕;②**探针收编**:ui_probe/ui_tune_probe/t17_defer_probe/fx_probe 四件游离探针(实测 17.4s/49.6s/63.0s/21.9s 全绿)收进 probe_gate `--full` 段挂重闸,轻闸默认段零改;damage_probe 出闸留盘标注诊断件、config_fatal_probe 删除(与 run_all 致命类单测重复)、零断言三件标注分析工具+ui_layout 补 1280/1920 最小断言;③**账务修正**:tests/README 套件数/断言数漂移(十五→17、752+→双口径说明)+integration 空目录处置(代拍板)。〔2026-10-07 范围改道:原「明示不收」的 B4/B5/B6 三缺口经用户令各立任务书并入本迭代,本卡改称卡①,新增卡②③④见后〕。任务书=`design/research/任务书-自动化验收补齐批-2026-10-07.md`(v1.1——**待裁点 0 项**,P1-P5+拷打轮一 Q1-Q8 全裁 2026-10-07〔重闸定义正式扩容 CLAUDE.md/过程截图即弃/shot_probe 扩屏三新屏/1280 单档/素材缺位 SKIP 而基线禁锚回退态/基线换代权限呈现批 agent/取证失败=闸红/integration 删空壳〕;🔴 契约 6 条含运行时代码零 diff/轻闸零删减/在飞避让;停机点 S1 首跑存量 FAIL 全量呈报登记 06+S3 基线生成素材缺位停机;代拍板白名单四项)。**卡②旧界面呈现断言回补批(B5,2026-10-07 用户令立项)**:迭代 16 前落地旧屏追溯补 ui_contrast 测点对+ui_struct 契约——普查结论=对比度测点对旧屏 0 对(15 对现役全属 HUD/锚点/徽章/生涯)、专项契约仅 pause/career、legend/node 两屏从未过结构族;优先级=战斗结算框>商店>营地柜台+天赋树>设置面>三选一>迷雾锚定对;红线=只加断言零改旧屏、违例登记呈报不修(处置权归用户);任务书=`design/research/任务书-旧界面呈现断言回补批-2026-10-07.md`(v1.1 grilling 三轮全裁——待裁点 0 项,WL 豁免边界/迷雾合成对最坏判据/时长闸 ≤2s/出口报告/06 遗留件登记全钉死;停机点 2〔对比度首跑存量违例/legend-node 结构首跑〕,T0-T4≈1.0d,worktree iter19-uibackfill)〔2026-10-08 施工落籍·**S1 停机态**——T1+T2 测点对 15→38 对(+23:battle_end 3/shop 5/camp 9/settings 2/curio 2/迷雾合成对 1,全 UiKit 常量实时求值);**新对首跑暴露存量对比度违例 7 项**(结算 GP 账行 2.67:1/商店 legacy 行卡名 1.12:1/货架价签 1.46:1/营地铭牌副题 3.59:1/行价格 4.02:1/树分组头 2.67:1/工坊状态 3.00:1)——全量登记清单+修复建议案〔全现役常量换墨可落〕随出口报告呈用户裁,处置权归用户、批内零修(红线);违例对在册=闸红登记存量形态,修复批落后自然转绿;T3 struct 13→15 根(legend/node 全真路径开合)首跑全绿 S2 未命中、WL 零新增;冒烟 840/0+run_all 17 套件持平;出口报告=`design/qa/iter19-uibackfill-exit-report-2026-10-08.md`;settlement_review 遗留件已在 06 登记落位〕。**卡③CI 预接线批(B6,2026-10-07 用户令立项)**:tests.yml 场景探针段解封——轻 CI 段=input/struct/contrast 三探针(示例引用的 ui_probe/ui_click 归 --full 重闸不进轻 CI)、Linux 独立命令形态(probe_gate.sh 系 Windows 专用)、窗口化四件禁入 headless CI;本地无远端端到端验证不可能=验收全静态核验,「首次 push 后人工盯首跑」入移交清单;远端仓库计划两文档零登记=待裁呈报项;任务书=`design/research/任务书-CI预接线批-2026-10-07.md`(v1.2——**触发分支死角已并入修正范围=tests.yml push/pull_request 两处 [main]→[master]**〔实查:实际分支 master、main 不存在,不修则远端建好后 CI 仍永不触发〕+冷检出导入步前置 smoke 步骤之前;裁点①远端仓库=✅ 2026-10-08 裁暂不建维持待命〔预接线待命=终态〕/裁点② ui_layout 入 CI 候卡①后裁;T0-T3≈0.25d,worktree iter19-ciwire)。**✅ 卡③落籍(2026-10-08,B6 闭环——出处=自动化验收补齐批 §一明示不收件,随本批销账)**:注释探针段解封=正式轻闸三探针段(input/struct/contrast,timeout 120s 外壳+退出码 124/137 超时判+PASS 串判定=probe_gate 判定逻辑 Linux 独立镜像,三探针全跑不短路汇总定红绿)+冷检出 `--import` 导入步 300s 前置冒烟之前(job 级基础设施步同覆盖冒烟与探针 .godot 依赖)+触发分支两处 [main]→[master] 修死角+头注释追加「远端仓库建好后无需改本文件即自动生效」;探针日志落 logs/probe_ci/ 顺现有 upload-artifact 段零改并入;验收全静态过(pyyaml 解析/CI 段 res:// 引用逐一实存/timeout 外壳清单齐/轻闸术语与 probe_gate 口径对齐/diff 面=tests.yml 单文件+roadmap 本行);**⚠ S1 呈报项(该段冻结未代修,处置待用户裁)=tests.yml setup-godot 步 `nikeee/godot-actions/setup-godot@v2` 指向不存在仓库**(2026-10-08 实查:GitHub API 404+nikeee 全部 159 公共仓 grep godot 零命中+marketplace 同名件=Vitorgus/Setup-Godot v1 系 Godot3 旧件;现存活跃替代=chickensoft-games/setup-godot v2.4.3)——远端建好首跑前必须先裁此段,否则 smoke job 必红;首跑盯梢清单随任务书 §七 待远端立项之日激活。**卡④提灯载体道具批(B4,2026-10-07 用户令立项;原登记去向「Alpha 信息件重定批」就此改道入本迭代)**:board_view.set_fog_lantern 死接口(迭代 14⑤ 接线+case⑮ 断言在位,载体始终未造=完成度 0)补载体道具;备选案五件全列(案 A 秘宝同调位新行=原登记指向·推荐/案 B 专长新行·撞重设计冻结不推荐/案 C 商店货架·分类判据需新裁/案 D 显影尘行激活合并·与改道相逆/案 E 元进度树·破坏读数归因不推荐)+淘汰案六件各附依据,设计权全归用户;任务书=`design/research/任务书-提灯载体道具批-2026-10-07.md`(v1.2——**✅ 裁点全裁:2026-10-08 载体=案A秘宝同调位新行**〔行字段推荐值=执行中一次秒答,「按推荐」即全收〕;缺陷处置=卡⓪随同 goal 先行落籍=本卡 T1 前置门〔缺陷实查定案影响全部开局入口;原记迭代 20 缺陷批,2026-10-08 并入本迭代为卡⓪〕;呈现桥=只读访问器/复原语义=begin_battle 显式重算/MC=静态论证/测试三形态等工程面全钉死,T0-T5≈2.5d,worktree iter19-lantern)。**✅ 卡④落籍(2026-10-08)**:T1=treasure_items.tres 表尾追加 fog_lantern「魔法提灯」行(行字段=用户「按推荐」全收——display_name 魔法提灯/desc 灯光区半径+2/id fog_lantern/slot_cost 1/稀有度不设字段/unlock_requires 键省略=已解锁;form=passive+triggers 显式空数组〔活行空 effect_kinds 豁免以 row.has(triggers) 为条件〕+effect_kinds=[]/target=none/magnitude=0/use_phase=active_dig/dimension_tags=[info];表尾追加保 MC 自动档装配画像逐位不变=零漂移);T2=接线生产路径贯通——orchestrator 装配集公共只读出口 attune_has(_attune_has 契约化)+组合根呈现桥 main._sync_fog_lantern 挂每战首轮装配链显式重算含否(round_started 首轮发射位在 begin_battle 尾 attunement 注入后=时序安全;board_changed 先发后注入故不挂);T3=测试三形态(case⑮ 内载体级段不开新 case+smoke 现有套件加断言〔冒烟 840→844〕+存档回归 breakpoint Part 6+新单测 fog_lantern_wiring〔run_all 17→18 套〕,case⑮ 既有断言零删减);T4=改道指路句实查六处全换代(board_view.gd :139/:145+art-bible.md:387〔顺手对齐常量实名 FOG_LANTERN_BONUS〕+HUD框架.md :168/:170〔:170 同句 2 处整段换代〕;qa 历史成文零触碰)+06 缺陷条落籍回写+秘宝.md 目录九件→十件(v1.1 行);T5=重闸三件全绿(冒烟 844/0+probe_gate 含 --click 全绿+run_all 18 套,残留 Godot=0);MC=静态论证零实跑(纯呈现层 off 态零生产路径变化)。出口报告=design/qa/iter19-lantern-exit-report-2026-10-08.md | 迭代 18 出口(✅ 已解——2026-10-07 四卡总收口落籍)——**开工=goal 一次跑完(2026-10-08 裁:卡⓪缺陷卡先行+卡①-④打包,全绿前禁停;subagent 并发 ≤3;唯一预期交互=卡④行字段推荐值秒答;卡⓪原迭代 20 头卡A 同日用户令并入本迭代)** | 卡⓪≈1.0-1.5d(随计划书定稿)+卡①T0-T6≈4.25d(超软盒预挂;天然切分点 T2 末——段一 T0-T2 渲染闸≈2.25d / 段二 T3-T6 收编退役账务≈2d,两段同属一迭代一次合并)+卡②T0-T4≈1.0d+卡③T0-T3≈0.25d+卡④T0-T5≈2.5-3.0d(切分点 S0:考证呈报 0.25d/实装收口 2.25-2.75d)——五卡合计≈9.0-10.0d | | 迭代 20 | (**空位待编**——原头卡A 主菜单开局缺陷修复批已并入迭代 19 卡⓪〔2026-10-08 用户令:其为迭代 19 卡④的 T1 前置门且随同 goal 执行,归属随执行落位〕;候选 B-F 留档〔奇物改名/商店刷新收尾/C 三件/D 敌系/E 生涯/F 典检〕编入待用户点名) | —— | —— | | 迭代 21+ | **M4 数值批(**Alpha 收官位·未排期**——2026-10-05 用户令编入迭代 17 卡②;2026-10-06 用户令移出独立成批并定序「Alpha 阶段最后——内容补全先行、统一数值调整殿后」〔当日曾被编入迭代 18 为收官卡,2026-10-07 用户令撤回〕;**2026-10-07 用户令二次后移:后续新迭代(迭代 20 起)一律不先做 M4,除非用户明确要求启动 M4 批次**)**:四件数值欠账合一批——①削弱档位终值(weaken 现值 −65/duration 2/refresh 考证在册;叠层改续时语义已定案,差 duration 终值+当量锚复算)②调参批数值点评(06 条目现行登记五条——任务口径「八条」与条目五条不符,任务书 §2.2 已呈报差异以条目为准)③迭代 10 奖励重构联动欠账①②(钥石产出重标 boss_keystone 首杀 3/3/3·复杀 2/2/3 provisional + 通关率带重扫〔通关回血 20%+AP 件首轮 +1〕)④元进度定价剩余面(forge base 20/比 150 考证在册——06 条目文本「base 10」滞后于 2026-09-22 对齿批已呈报;Boss 两档终值)。读数义务随批=迭代 14 两件后置复算(T6 MC 四带复算+T7 技能池节奏重测,均挂 07);顺路修复 damage_probe A1 改前既有红灯(判式换代批出口报告 §四.7 在册)。**硬约束:一切 MC/verifier 跑批发起前须用户批准;调参联动禁独立调参网络(β 带 [1.2,2.5] 逐 u 检算)**。任务书=`design/research/任务书-M4数值批-2026-10-05.md`(**v1.2 2026-10-06 案C 增补+联审修订**:v1.1 三事实与第五推算件照旧;联审=P3 转正顺延至重扫读数后/检算工具 WEAKEN_PCT 入同步面/F11 两句死文本全刷/T3·T5 四带复算并账一次跑批双认账/R5 改前锚=本批新立案C 锚/估时段一勘误 4.25d;案C 增补内容照旧=§2.6 三事实〔行为换代/锚全作废/难度预判〕+T0 推算稿第五件=对拍锚按新序重推导+T6 四带复算按案C 新行为首采;T0-T8≈6.25d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**✅ 裁点全裁(2026-10-06 用户令:P1甲=维持 2 场·magnitude [60,85] 带内当量锚复算、具体值随出口 provisional 追认/P2甲 不对称有意/P3甲 3-3-3·2-2-3 维持、转正顺延至重扫读数到账且带内(Q4 二裁)/P4甲 不立直购价);开工=U0**) | 迭代 18 全部内容卡(③④⑤⑦)出口+全部内容批行为变更落定+**用户发令(未排期)**——重锚窗口须收尽全部内容批行为变更 | T0-T8≈6.25d(超软盒预挂,段一 T0-T4≈4.25d〔v1.2 勘误,原 4.5 系加总错误〕/段二 T5-T8≈2.0d) | From 1b26234ed05e0f7b5b63dcee173064198cc39b8a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 8 Oct 2026 16:59:18 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E5=8D=A1=E2=91=A3T5?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=94=B6=E5=8F=A3=E8=90=BD=E7=B1=8D=EF=BC=88?= =?UTF-8?q?=E6=89=B9=E6=9C=AB=E9=87=8D=E9=97=B8=E4=B8=89=E4=BB=B6=E5=85=A8?= =?UTF-8?q?=E7=BB=BF=3D=E5=86=92=E7=83=9F=20844/0=20=E4=B8=89=E9=97=B8?= =?UTF-8?q?=E8=BF=87+probe=5Fgate=20=E5=90=AB=20click=20=E5=85=A8=E7=BB=BF?= =?UTF-8?q?+run=5Fall=2018=20=E5=A5=97=E4=BB=B6=E5=85=A8=E7=BB=BF+?= =?UTF-8?q?=E6=AE=8B=E7=95=99=20Godot=3D0=20=E5=8F=8C=E7=82=B9=EF=BC=89+?= =?UTF-8?q?=E5=87=BA=E5=8F=A3=E6=8A=A5=E5=91=8A=E8=90=BD=E7=9B=98=EF=BC=88?= =?UTF-8?q?=E8=A1=8C=E5=AD=97=E6=AE=B5=E7=A7=92=E7=AD=94=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=B8=8E=20provisional=20=E8=BF=BD=E8=AE=A4=E5=8D=95/=E9=80=90?= =?UTF-8?q?=E4=BB=B6=E6=94=B9=E5=8A=A8=E5=AF=B9=E7=85=A7/MC=20=E9=9D=99?= =?UTF-8?q?=E6=80=81=E8=AE=BA=E8=AF=81=E4=BA=94=E7=82=B9/=E9=97=B8?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E6=94=B9=E5=89=8D=E6=94=B9=E5=90=8E/?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E6=B8=85=E5=8D=95=E5=85=AD=E6=9D=A1=E5=AF=B9?= =?UTF-8?q?=E8=B4=A6/=E9=81=97=E7=95=99=E7=A7=BB=E4=BA=A4=EF=BC=89+?= =?UTF-8?q?=E5=8F=B0=E8=B4=A6=E8=AE=B0=E8=B4=A6=20403=EF=BC=88master=200ba?= =?UTF-8?q?3ddf=20=E6=9F=A5=E6=92=9E=20398-402=20=E5=B7=B2=E5=8D=A0?= =?UTF-8?q?=E3=80=81403=20=E9=A2=84=E9=85=8D=E5=8F=B7=E7=A9=BA=E9=97=B2?= =?UTF-8?q?=E6=9C=AA=E9=A1=BA=E5=BB=B6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- active.md | 1 + .../iter19-lantern-exit-report-2026-10-08.md | 120 ++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 design/qa/iter19-lantern-exit-report-2026-10-08.md diff --git a/active.md b/active.md index a55616f3..cb8dd756 100644 --- a/active.md +++ b/active.md @@ -905,6 +905,7 @@ 397. **迭代 19 五卡 goal T0 开工(2026-10-08,用户令五卡打包一次跑完——卡⓪主菜单开局缺陷修复批先行+卡①②③并发≤3+卡④收尾,全绿前禁停;本 goal 即 U0)**:定义面落籍单独一笔提交(roadmap 迭代19/20 行+06-待办清单+四任务书〔卡①自动化验收 v1.1/卡②旧界面断言回补 v1.1/卡③CI预接线 v1.2/卡④提灯载体 v1.2〕六文件入库;主区其余脏文件全属在飞遗产禁碰零触碰);基线复读三闸全绿=冒烟 834/0 三闸过+run_all 17 套件全绿+probe_gate 含 click 全绿(残留 Godot=0);台账预配号分配=卡⓪398/卡①399-400/卡②401/卡③402/卡④403/总收口404起(各卡记账前逐笔查撞,撞号顺延+出口报告披露)。 398. **迭代 19 卡⓪主菜单开局缺陷修复批(2026-10-08,裁决依据=roadmap 卡⓪任务面+06-待办清单两缺陷条〔2026-10-07 用户确认成立〕;worktree g-plan2-iter19-card0 分支 iter19-card0-20261008 基点 b0a73df)**:四件全落——①主菜单开新/续玩两入口补传同调三键(main.gd 新增 static build_adventure_params :496-513 两入口共用构造,:471/:530 接线;取值与营地投影同源零新读取逻辑=装配集 save.attunement_equipped/Y 刷新池 meta.attune_refresh_charges/树 rule 键集 meta.tree_rule_keys;runner 侧受理零改动);②关卡开场行改传当前生效值(main.gd:539-549——int(db.hero.atk/max_hp) 表值→runner.effective_atk/effective_max_hp 与战斗面板同源,「含面板加成」后缀判断追加认 meta.hero_override atk/max_hp 局外 flat,白板局不带);③冒烟补两入口传参断言 +6 项(smoke_all.gd:4661-4687 直呼 build_adventure_params 单测统一构造面,开新/续玩×三键与来源一致+extra 并入,夹具 smoke_meta_tree 档 luck_coin+Y2 档+fg_posture a 侧,834→840);④删 adventure_runner.gd 三行重复赋值(原 :132-134 与 :129-131 逐字重复+中间零语句+_seed_attune_charges 纯重置幂等=零行为变化,删后 run_all 直呼参数面套件零漂移佐证)。重闸三件全绿=冒烟 840 项 0 失败三闸过(+6 全系新增断言)+probe_gate 含 click 全绿(click 走查真跑主菜单开局一场冒险问题=0)+run_all 17 套件全绿+残留 Godot=0;MC 零跑静态论证在案(MC 取数面直呼 runner 不经主菜单入口零触及);范围外三件(X/Y 双源倒置/被动同调呈现/Fork 归因行)零触碰。**披露/移交**——runner 侧 resume_adventure 受理面无 tree_rules 键(:215-217 仅两键,任务书「接收面现成」对 tree_rules 不成立):两入口三键均已传出、续玩局 tree_rules 暂不被消费与修复前同态无回归,补一行受理即可闭环归用户裁定随后续批落。出口报告=design/qa/iter19-card0-exit-report-2026-10-08.md;提交四笔 1d2894b(①②)/fb845b7(③)/8a654cc(④+出口报告)/本笔(台账记账)。 402. **迭代 19 卡③CI 预接线批(2026-10-08,裁决依据=任务书 v1.2 全裁〔裁点①远端仓库=暂不建维持待命/裁点② ui_layout 入 CI 候卡①后裁〕;worktree g-plan2-iter19-ciwire 分支 iter19-ciwire-20261008 基点 9160942;B6 出处=自动化验收补齐批 §一明示不收件,随本批闭环销账)**:T0-T3 全履行——tests.yml 单文件改写四件:①原 :41-45 整块注释探针段(示例 ui_probe/ui_click_probe 选型滞后)解封=正式轻闸三探针段(input/struct/contrast=probe_gate 默认段同款;每探针 timeout 120s 外壳+退出码 124/137 超时判+grep PASS 串判定〔T0 本机实跑三探针取 PASS 行样本钉死判据〕,三探针全跑不短路汇总定红绿,probe_gate 判定逻辑 Linux 独立镜像——probe_gate.sh 本体系 Windows 专用〔PowerShell+taskkill〕CI 禁调);②冷检出导入步 `--import` 300s 前置冒烟之前(job 级基础设施步同覆盖冒烟与探针 .godot 依赖,Q9 甲);③触发分支 push/pull_request 两处 [main]→[master] 修死角(实际分支 master、main 不存在);④头注释保留「尚无远端」句+追加「远端仓库建好后无需改本文件即自动生效」;探针日志落 logs/probe_ci/ 顺现有 upload-artifact 段零改并入。验收全静态(本地无远端端到端不可验=红线边界)五判据全过:pyyaml 解析 OK+CI 段 res:// 引用逐一实存+timeout 外壳清单齐(300s 导入/120s 冒烟/120s×3 探针)+头注释自动生效句在位+diff 面仅 tests.yml+roadmap 账务行(游戏代码/探针件/probe_gate.sh/CLAUDE.md 零 diff=契约 1);轻段选型锁死三件、窗口化四件与重闸五件零入(契约 2);MC/verifier 零跑。**S1 呈报项(该段冻结未代修,处置待用户裁)=tests.yml setup-godot 步 `nikeee/godot-actions/setup-godot@v2` 指向不存在仓库**(GitHub API 404+nikeee 159 公共仓 grep godot 零命中+marketplace 同名=Vitorgus v1 Godot3 旧件+对照 actions/checkout 查询正常=API 可信;候选替代 chickensoft-games/setup-godot v2.4.3 待裁甲换 action/乙手动下载/丙挂起)——远端建好首跑前必须先裁否则 smoke job 必红;S2 未触发(兄弟卡未先行合并,master 停 9160942);roadmap 卡③行内登记按 Q13 由主控合并时串行重放。**移交**——首次 push 后人工盯首跑清单(任务书 §七 三条+本批增补 setup-godot 前置门一条)随远端立项之日激活。出口报告=design/qa/iter19-ciwire-exit-report-2026-10-08.md;提交三笔 3799e0c(T1 tests.yml)/7397603(T3 roadmap)/本笔(出口报告+台账记账)。 +403. **迭代 19 卡④提灯载体道具批(2026-10-08,裁决依据=任务书 v1.2 全裁〔裁点①载体=案A 秘宝·同调位新行/裁点②缺陷另卡先行=卡⓪已落籍=本卡 T1 前置门 S1 天然满足〔基点 568101b 链上含卡⓪ merge 9160942〕/裁点③随案C 落选消解;行字段=用户 2026-10-08「按推荐」一次秒答全收〕;worktree g-plan2-iter19-lantern 分支 iter19-lantern-20261008 基点 568101b;B4 出处=自动化验收补齐批 §一明示不收件,随本批闭环销账)**:T1-T5 全履行——T1=treasure_items.tres 表尾追加 fog_lantern「魔法提灯」行(行字段裁值:display_name 魔法提灯/desc 灯光区半径+2/id fog_lantern/slot_cost 1/稀有度不设字段〔KEY_WHITELIST 封闭十七键〕/unlock_requires 键省略=已解锁;机械字段 form=passive+**triggers 显式空数组**〔活行空 effect_kinds 校验豁免以 row.has("triggers") 为条件——treasure_item_table.gd:111,漏写=加载红,本批头号易错点已钉〕+effect_kinds=[]/target=none/magnitude=0/use_phase=active_dig/dimension_tags=[info];表尾追加保 MC 自动档装配画像逐位不变);T2=接线生产路径贯通(完成度 0→1):battle_orchestrator.gd:128-134 装配集公共只读出口 attune_has(_attune_has 契约化出口,save v6 先例)+main.gd:852-860/:875-886 呈现桥 _sync_fog_lantern 挂 _on_round_started ri==1 每战首轮装配链**显式重算含否**(🔴 契约 7 Q8.1 复原语义=禁战斗结束隐式复原;时序依据=round_started 首轮发射位在 begin_battle 尾 attunement 注入后——board_changed 在 _install_new_board 内先发装配集后注入,同帧直挂 _on_board_changed 会读上一战旧集故不挂);T3=测试三形态(契约 9):case⑮ 内载体级段不开新 case(装配→build_adventure_params 参数面+settlement.attunement 注入→呈现桥→lantern=2 且 dist==R+1 转可见+卸装显式重算复原;case⑮ 既有 17 断言面零删减)+smoke 现有套件 _smoke_adventure_table 加断言 +4(行字段逐键/同调目录投影 display_name 九件→十件/装配贯通 attune_has=true/空装配基线 false)+存档回归 breakpoint_resume_test Part 6(装配→停点→续玩受理→回局首战 attune_has 仍 true)+新单测 fog_lantern_wiring_test.gd(run_all manifest 17→18 套);T4=改道指路句实查 6 处全换代(board_view.gd :139/:145+art-bible.md:387〔常量拟名 LIGHT_RADIUS_LANTERN_BONUS 顺手对齐落码实名 FOG_LANTERN_BONUS〕+HUD框架.md :168/:170 同段 2 处整段换代+落籍注记;残留「Alpha 信息件」字样三处均=销账声明/改道留痕叙事非活性指路;qa 历史成文零触碰)+06-待办清单 菜单开局同调传参缺陷条回写落籍态(卡⓪ merge 9160942+resume tree_rules 受理缺口披露归用户裁)+秘宝.md 目录九件→十件+v1.1 行(速览 aux_items.tres→treasure_items.tres 过时文件名顺手订正)+roadmap 迭代 19 行卡④段落籍登记;T5=批末重闸三件全绿=冒烟 840→**844 项 0 失败**三闸过(+4 全系新增断言)+probe_gate 含 click 全绿(input PASS/struct PASS/contrast 15 对 PASS〔本分支基点为卡②合并前旧态,主控合并时按 master 38 对现役重放〕+click 段退出码 0)+run_all **18 套件**全绿+残留 Godot=0 双点(probe_gate 批末闸+批后 powershell 复点);MC 零跑静态论证在案(纯呈现层:行 triggers 空=效果引擎零订阅结算流逐位不受扰+装配画像表尾不可达 slots≤3+off 态 _fog_lantern 写 0 数值恒等——2026-10-07 用户裁 Q3 静态替代)。**消歧**——greedy_lantern(feats.tres:291 贪婪矿灯 dig_reveal yield_mult)零关联零触碰,行文全称「魔法提灯」。**移交**——提灯点亮视觉挂账不动(资产升档重产批+06 挂起项,S2 未触发);全局变异案E 解封条件「提灯接线落位」随本批推进、解封重议归全局变异批 Own;显影尘/地穴全图卷封存重定仍留 Alpha 信息件重定批零触碰;roadmap 行冲突重放归主控。出口报告=design/qa/iter19-lantern-exit-report-2026-10-08.md;提交五笔 90a39f1(T1)/eef343c(T2)/f0f2009(T3)/0b5834d(T4)/本笔(T5 重闸+出口报告+台账记账)。 401. **迭代 19 卡②旧界面呈现断言回补批(2026-10-08,任务书=design/research/任务书-旧界面呈现断言回补批-2026-10-07.md v1.1 待裁点 0 项;worktree g-plan2-iter19-uibackfill 分支 iter19-uibackfill-20261008 基点 9160942)**:三件全落——①T1+T2 ui_contrast 测点对 15→38 对(+23:battle_end 3/shop 5/camp 9/settings 2/curio 2/迷雾记忆墨合成对 1,全 UiKit 常量实时求值+行尾注理由,石皮纹面板按缺素材回退牌色 PANEL_DATA 计);②T3 ui_struct 补采样 legend+node 两根(13→15 根全真路径开合——legend=board_zone.legend_toggled 信号开→closed 信号关,node=_open_modal 登记册+show_rest 合成喂入→continue_pressed 信号关;既有 13 根/五族断言/pause-career 契约族/resume 专项零删减);③T4 文档面三件(出口报告+06 settlement_review 遗留件退役处置登记落位〔随生涯实装批 P5 甲复活承接或正式删除二选一归用户裁〕+roadmap 卡②段换代)。**🔴 停机点 S1 命中:新对首跑暴露存量对比度违例 7 项**——结算 GP 账行 GOLD_DEEP/结算板 2.67:1、商店 legacy 行卡名 INK_LABEL/暗底行卡 1.12:1(重度不可读档)、货架价签 GOLD/货架板 1.46:1、营地铭牌副题 STONE/铭牌板 3.59:1、行价格 STONE/行板 4.02:1、树分组头 GOLD_DEEP/柜台板 2.67:1、工坊状态 GOLD_DEEP/行板 3.00:1(V1-V7 全量清单+修复建议案〔全现役常量换墨可落〕在出口报告 §3);按任务书 §十 S1 停机呈报,处置权归用户(甲=另立修复批〔违例对在册=闸红登记存量形态,修后自然转绿〕/乙=回拔 7 对留纸面登记),批内零修(红线:旧屏呈现层代码零 diff,git diff 可核=仅两探针+文档面)。S2 未命中:legend/node 结构首跑全绿、WL 零新增(仍空表)。闸数字改前/改后——冒烟 840 项 0 失败持平+run_all 17 套件持平+残留 Godot=0;ui_contrast FAIL 7 项越带(S1 呈报物非实现回归,存量红零新增);ui_struct PASS 15 根。**时长闸披露**——probe_gate 默认段整闸基线窗口 186.7s→改后窗口 306.3s 系兄弟卡①③并发噪声主导(同窗口交错 A/B 三轮:同一探针本体波动 5.1→20.6s,改前 B2 亦跑出 15.7s);本体同窗口配对差中位 contrast +0.52s/struct -1.64s 无系统性增量、技术下限毫秒级(23 对静态求值+两屏采样≈0.5s)——按本体配对口径验收闸 5(≤2s)通过,整闸空窗复测归主控合并窗口。白名单行使披露——三不收位(bcard 描述/脚注/✓章/primary 钮字四处内联 Color8 无常量形态+page_shell 顶条板同;TG_* 五族带=非文字装饰件不适用 4.5 文字判据);对数 38 超预期带 25-32 系违例位全量入表(登记存量须哨兵在册)。迷雾对注——floor avg #453020 系素材侧值无常量形态取 art-bible §389 迭代 16 T0 在册复算值(合成底 #3E3731 与在册一致、6.7:1 逐位吻合手算);三关逐关 avg 无在册记录且素材不入 git 不可实查〔主区只读约束〕,最坏情况判据扩对归移交。**移交六件**——①S1 七项处置(最高优先);②迷雾三关扩对(素材入库/授权后脚本算 avg);③字面量墨收测前置=ui_kit 立常量;④TG 装饰带非文字判据另立探针段;⑤settlement_review 去向二选一;⑥probe_gate 整闸空窗复测。出口报告=design/qa/iter19-uibackfill-exit-report-2026-10-08.md;提交四笔 92c0598(T1+T2)/74d2f73(T3)/6339b63(T4 文档面)/本笔(台账记账)。 diff --git a/design/qa/iter19-lantern-exit-report-2026-10-08.md b/design/qa/iter19-lantern-exit-report-2026-10-08.md new file mode 100644 index 00000000..4db63d7b --- /dev/null +++ b/design/qa/iter19-lantern-exit-report-2026-10-08.md @@ -0,0 +1,120 @@ +# 出口报告——迭代 19 卡④ 提灯载体道具批(2026-10-08) + +> 任务书=`design/research/任务书-提灯载体道具批-2026-10-07.md`(v1.2);worktree=`D:\code\g-plan2-iter19-lantern`(分支 iter19-lantern-20261008,基点 568101b=master 卡③落籍态,含卡⓪①缺陷修复=本卡 T1 前置门 S1 天然满足);T0-T5 全履行,S0 行字段秒答已收(「按推荐」全收 2026-10-08),S2 未触发。**停机点:零**。 + +## 一、行字段秒答记录与 provisional 追认单(S0) + +| 字段 | 呈报推荐值 | 用户裁决(2026-10-08) | 追认状态 | +|---|---|---|---| +| display_name | 魔法提灯 | 按推荐(全收) | ✅ 已按推荐落表——本报告即出口追认单,转正 | +| desc | 灯光区半径+2 | 按推荐(全收) | ✅ 转正 | +| 行 id | fog_lantern | 按推荐(全收) | ✅ 转正 | +| slot_cost | 1(与九件同规,schema 强制恒 1) | 按推荐(全收) | ✅ 转正 | +| 稀有度 | 不设字段(KEY_WHITELIST 封闭十七键无此键) | 按推荐(全收) | ✅ 转正 | +| 门槛位 | unlock_requires 键省略(=已解锁合法态,底稿 §2.2) | 按推荐(全收) | ✅ 转正 | +| 机械字段(schema 钉死非裁量) | form="passive"/triggers=[](键显式存在)/effect_kinds=[]/target="none"/magnitude=0/use_phase="active_dig"/dimension_tags=["info"]/行位置=表尾追加 | ——(工程面,任务书 §五.2 案A+主控已裁) | ✅ 落表(treasure_items.tres 表尾) | + +**行位置=表尾追加的承重理由**:MC 自动档装配画像(game/smoke/adventure_monte_carlo.gd:70-90)按表序取「前 slots-1 个 passive+首个 active」——fog_lantern 追加表尾后 passives 序=[淬毒刃纹,标中殉爆,惊巢反制,工兵晨令,偏运硬币,三选一刷新件,魔法提灯],slots=3 时取前 2 passive(淬毒刃纹/标中殉爆)+首 active(掘进蓄能)**逐位不变**;slots 现役硬上限 3(attunement_growth.tres slot_cap),表尾位在 slots≤3 下**不可达**=装配画像零漂移(MC 静态论证详见 §四)。 + +**与 greedy_lantern 零关联消歧**:feats.tres:291 贪婪矿灯=dig_reveal yield_mult 专长(开格产出放大),与视野无关,本批零触碰;行文全称「魔法提灯」不单称「提灯」。 + +## 二、逐件改动对照(T1-T4,file:line 为改后行号) + +### T1——数据行落表(commit 90a39f1) + +| # | 位置 | 改动 | +|---|---|---| +| 1 | game/data/tables/treasure_items.tres :7-8 | 头注释追加两行批注(迭代 19 卡④ 出处分批+行字段裁决出处+「激活 vs 封存」形态差注记——fog_lantern 活行空效果形态=triggers 显式空数组,与显影尘 deferred 封存形态对照) | +| 2 | 同 :224-236 | 表尾(pick_refresh 行后)追加 fog_lantern 行十四键:item_id/display_name/dimension_tags=["info"]/desc/effect_kinds=[]/target/magnitude/use_phase/form="passive"/slot_cost=1/triggers=[](**键显式存在——treasure_item_table.gd:111 活行空 effect_kinds 校验豁免以 row.has("triggers") 为条件,漏写=加载红**);unlock_requires 键省略=已解锁 | + +**schema 校验面核对(加载零红)**:冒烟「全部表加载+校验通过」闸过(TreasureItemTable.validate 零违例);KEY_WHITELIST 十七键内零新键;真视窄域/board_wide 护栏不涉(无 mine_reveal);magnitude=0 非 N 值 kind 合法;passive 行 charges 缺省 0 合法;attunement_rows() 收录(form 非空活行)=同调目录十件。 + +### T2——接线生产路径贯通(commit eef343c) + +| # | 位置 | 改动 | +|---|---|---| +| 1 | game/core/battle_orchestrator.gd :128-134 | 新增**装配集公共只读出口** `attune_has(item_id) -> bool`(委托既有 private `_attune_has` :124——契约化出口,save v6 只读访问器先例;private 面内部调用零改动;只读零副作用) | +| 2 | game/presentation/main.gd :852-860 | `_on_round_started` 内新增 `if ri == 1: _sync_fog_lantern()` 挂点+时序依据注释:**round_started 首轮发射位在 begin_battle 尾(attunement 注入 :227 之后)**;board_changed 在 `_install_new_board` 内先发(:309)、装配集后注入——同帧直挂 `_on_board_changed` 会读到上一战旧集,故不挂 | +| 3 | game/presentation/main.gd :875-886 | 新增**呈现桥** `_sync_fog_lantern()`——`board_view.set_fog_lantern(settlement.attune_has("fog_lantern"))`,真值显式写给 setter(写入即 refresh 全板重算);settlement/board_view 空防御 | + +**复原语义(🔴 契约 7 / Q8.1)**:每战首轮装配链**显式重算含否**——装配=true 写 2、未装配/卸装=false 写 0;禁依赖战斗结束隐式复原(断点续玩/跨关/换装天然正确)。未装配=false 写 0=与既有基线**逐位一致**(缺省零扰动)。off 态生产路径变化=零(`attune_has` 只读、`_sync_fog_lantern` 只写呈现态布尔)。 + +**ADR-0001 合规**:信号连接与装配判定归组合根(main.gd),board_view 纯呈现零核心依赖;board_zone_view 装配链经由组合根持有别名(main.gd:89 `board_view = battle_ui.board_view`)零改。 + +### T3——测试三形态(commit f0f2009,契约 9 全守) + +| # | 形态 | 位置 | 内容 | +|---|---|---|---| +| 1 | probe=case⑮ 内载体级段(不开新 case) | game/smoke/ui_input_probe.gd :419-441 | ①装配→开局参数面:save_manager.set_attunement_equipped(["fog_lantern"])→`build_adventure_params` 返回含 fog_lantern(卡⓪①缺陷修复面回归断言);②装配集→呈现桥→生效:settlement.attunement 手动注入(模拟 begin_battle enc 注入后运行态)→`main._sync_fog_lantern()`→lantern==2+dist==R+1 格转可见;③卸装显式重算复原:attunement=[]→sync→lantern==0+ring 复原遮蔽+存档装配集复位。**case⑮ 既有断言零删减(实查::331 基线+:395-418 接线段原样在位,ui_input_probe PASS 全绿实证)** | +| 2 | smoke=现有套件加断言(不新开套件文件) | game/smoke/smoke_all.gd :233-263(_smoke_adventure_table 内) | +4 断言:行字段逐键裁值/同调目录投影 display_name=魔法提灯(九件→十件)/装配→战斗贯通(enc.attunement 注入→attune_has=true)/空装配基线(attune_has=false)。冒烟 840→844 | +| 3 | 存档回归 | game/tests/unit/core/breakpoint_resume_test.gd Part 6 | 装配(params.attunement=["fog_lantern"])→选路进首战 attune_has=true→断点→新对象 resume_adventure 受理→回局首战 attune_has 仍 true(停点往返载体态一致;呈现态每战重算归呈现桥,本断言钉核心层装载往返) | +| 4 | 呈现桥判定 stub 单测+行加载单测(game/tests/ 惯例位) | game/tests/unit/core/fog_lantern_wiring_test.gd(新件)+game/tests/run_all.gd manifest 17→18 套 | 真实表 validate 零违例/行字段逐键/attunement_rows 收录/attune_has 双态(["fog_lantern"]→true、luck_coin→false、[]→false)/begin_battle enc 注入面 | + +### T4——账务落文(commit 0b5834d) + +改道指路句**实查 6 处全部换代**(任务书 §七.5「四处」口径矛盾以实查计数为准): + +| # | 位置 | 改前 | 改后 | +|---|---|---|---| +| 1 | board_view.gd :139(常量注释) | 「+2 预留不接效果——效果载体归 Alpha 信息件批;接线时写 _fog_lantern」 | 「+2=拍板值;载体=迭代 19 卡④ fog_lantern 秘宝行落籍 2026-10-08——原指路句随批换代」 | +| 2 | board_view.gd :143-145(setter 注释) | 「〔aux_items 提灯新行——归 Alpha 信息件重定批〕到位后由组合根/库存挂接调用」 | 「〔fog_lantern 魔法提灯——迭代 19 卡④落籍〕已到位,组合根 main._sync_fog_lantern 每战首轮装配链显式重算调用」 | +| 3 | art-bible.md :387 | 「LIGHT_RADIUS_LANTERN_BONUS=+2 预留不接效果(接线归 Alpha 信息件批)」 | 「FOG_LANTERN_BONUS=+2(**常量拟名顺手对齐落码实名**)已接效果落籍(载体=fog_lantern 行+每战装配链接线;呈现画法零改动——本节只管怎么画)」 | +| 4 | HUD框架.md :168(配套拍板段) | 「提灯载体归 aux_items 新行,随 Alpha 信息件重定批一并登记」 | 「登记原文+改道注记(2026-10-07 改道独立卡、2026-10-08 裁案A 落位)」 | +| 5-6 | HUD框架.md :170(实施状态段,同段 2 处) | 「LIGHT_RADIUS_LANTERN_BONUS=+2 预留未接效果(接线归 Alpha 信息件批)」+「提灯载体〔aux_items 新行〕仍归 Alpha 信息件重定批」 | 常量实名对齐+「仍归」句删除,整段追加**〔2026-10-08 迭代 19 卡④落籍注记〕**(载体行/生产路径链/复原语义/测试随批/原登记去向销账声明) | + +- **残留核查**:全仓「Alpha 信息件」字样改后余三处——board_view.gd:139(换代声明句)、HUD框架.md:170(销账声明句)、roadmap.md(迭代 14 历史行+迭代 19 卡④改道留痕叙事)——均非活性指路,零旧口径残留。**qa 历史成文零触碰**(m4iter14 出口报告等原样)。 +- **06-待办清单.md :27-29**:菜单开局同调传参缺陷条回写落籍态(✅ 卡⓪ merge 9160942 修复面+冒烟 +6+resume tree_rules 受理缺口披露归属用户裁)。 +- **秘宝.md**:速览实现面文件名过时残留顺手订正(aux_items.tres→treasure_items.tres)+目录九件→十件(魔法提灯入册、被动六→七)+投放态注记十件口径+版本行 v1.1。 +- **roadmap.md :75**:迭代 19 行卡④段落籍登记(T1-T5 全记录+出口报告指路)——落籍顺序串行重放归主控合并时处理。 + +## 三、MC 对拍——静态论证(任务书 T5/裁 Q3:零实跑) + +提灯=**纯呈现层载体件**,静态推演五点: + +1. **结算域零入**:fog_lantern 行 effect_kinds=[]+triggers=[]——效果引擎 rebuild 订阅空(`_fx.rebuild` 第三参取 treasure 行 triggers,空数组零订阅)→ 16 发射点零命中 → 结算步骤流/事件流逐位不受扰(🔴 契约 2 同板同动作序列两态逐位一致,case⑮ 既有断言面持续守护)。 +2. **装配画像逐位不变**:MC 自动档装配(adventure_monte_carlo.gd:70-90)按表序取前 slots-1 passive+首 active;fog_lantern 表尾追加在 slots≤3(slot_cap 硬上限)下**不可达**——off/formed 两档 equipped 数组逐位不变。 +3. **取数面零变化**:本批零触碰 rng_service/board_generator/encounter——流计数器与派生序零 diff。 +4. **呈现写入面收敛**:生产写入面唯 `main._sync_fog_lantern`(每战首轮一次)+ui_input_probe 既有 case⑮ 接线断言(探针域非生产);set_fog_lantern 本体零改动(写 `_fog_lantern`+refresh——迭代 14⑤ 已在位)。 +5. **off 态逐位一致基线**:未装配 fog_lantern 时 `_sync_fog_lantern` 写 0=既有基线值——`fog_state` 计算式 `fdist > FOG_RADIUS + _fog_lantern` 数值恒等。 + +结论:MC 两档读数**零漂移**,无需实跑(实跑须走跑批批准制——2026-10-07 用户裁 Q3 静态论证替代,本批遵守)。 + +## 四、闸数字(改前/改后全列) + +| 闸 | 改前(基点 568101b) | 改后(本批头 0b5834d,批末重闸实测 2026-10-08) | 变化 | +|---|---|---|---| +| 冒烟 run_smoke | 840 项 0 失败三闸过 | **844 项 0 失败三闸过** | +4(smoke 集成断言) | +| probe_gate 默认段 | 全绿(input 十七断言/struct/contrast 15 对——本分支基点为卡②合并前旧态 15 对,主控合并时以 master 现役 38 对重放) | 默认段全绿(input PASS/struct PASS/contrast 15 对 PASS) | 零红 | +| probe_gate --click | (基线未单跑——click 走查主菜单开局冒风险问题=0 口径沿卡⓪批) | 全绿(click 段退出码 0 判过+残留 Godot=0+全局 Godot=0) | 零红 | +| run_all | 17 套件全绿 | **18 套件全绿**(+fog_lantern_wiring_test PASS 在列) | +1 套 | +| 残留 Godot | 0 | 0(批末双点:probe_gate 批末闸+批后 powershell 复点) | 持平 | + +(改后数字=批末重闸实测逐项在案,无勘误。) + +## 五、验收断言清单对账(任务书 §九) + +1. ✅ 裁决案数据行在表且加载校验通过(schema 白名单零违例——冒烟表加载闸+新单测 validate 断言)。 +2. ✅ 生产路径贯通:载体在位→fog_params_probe()["lantern"]==2、dist==R+1 环带转可见(case⑮ 载体级段);载体缺位→lantern==0 现行为逐位不变(case⑮ 基线+smoke 空装配断言)。 +3. ✅ ui_input_probe 载体级断言全绿且 case⑮ 既有零删减(实查计数:基线 1+接线 4+载体级 5 断言组原位共存);smoke 集成与存档回归全绿(844/0+Part 6)。 +4. ✅ 重闸全绿+MC 零扰动(静态论证 §三)。 +5. ✅ 活性指路句实查 6 处全部换代、零旧口径残留(§二 T4 逐处清单;历史成文除外)。 +6. ✅ 出口报告落 design/qa/(本件,含 provisional 追认单+行字段秒答记录);roadmap 迭代 19 行换代。 + +## 六、遗留与移交 + +- **在飞避让(Q13)**:本分支基点落后 master(卡①②在飞或已落)——照常施工未 rebase 未追;roadmap 迭代 19 行与 ui_contrast 38 对口径由主控合并时串行重放(probe_gate 改后默认段在本分支以 15 对旧态全绿为验收口径,已在 §四披露)。 +- **resume 侧 tree_rules 受理缺口**:卡⓪批已披露(runner resume_adventure 现收 attunement/attune_refresh_y 两键),本批断点 Part 6 走 params 注入不受其影响——缺口处置仍归用户裁,非本批新增。 +- **提灯点亮视觉**:挂账不动(「资产升档重产批」+「提灯点亮解禁候选」——S2 未触发)。 +- **全局变异案E 解封条件**:「提灯接线落位」随本批落地推进——解封重议归全局变异批 Own,本批不代行。 +- **显影尘/地穴全图卷能力封存重定**:仍留 Alpha 信息件重定批,本批零触碰(改道留痕=任务书 §一)。 +- **台账记账**:403 号(master 0ba3ddf 查撞:398-402 已占、403 空闲=预配号一致未顺延)。 + +## 七、提交清单 + +| commit | 内容 | +|---|---| +| 90a39f1 | T1——treasure_items.tres 表尾追加 fog_lantern 行 | +| eef343c | T2——attune_has 只读出口+呈现桥 _sync_fog_lantern(每战首轮显式重算) | +| f0f2009 | T3——测试三形态(case⑮ 载体级段/smoke +4/存档回归 Part 6/新单测 run_all 18 套) | +| 0b5834d | T4——指路句 6 处换代+06 回写+秘宝十件+roadmap 卡④段 | +| (本笔) | T5——批末重闸+出口报告+台账记账 403 |