From bd54d1f46deb5b8b8251847089c211ff8e8005f4 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 2 Nov 2026 00:24:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E5=B0=BE(=E8=BF=AD=E4=BB=A347?= =?UTF-8?q?=E6=89=B9=E5=90=8E=E6=94=B6=E5=B0=BE):=20=E5=8F=8D=E5=93=BA?= =?UTF-8?q?=E7=82=B9=E5=8D=81=E4=BA=8C=E6=9D=A1=E5=A4=84=E7=BD=AE=E9=97=AD?= =?UTF-8?q?=E5=90=88=E2=80=94=E2=80=94=E2=91=A0=E8=90=BD=E6=96=87=E5=85=AB?= =?UTF-8?q?=E5=A4=84:=20architecture=20v1.28(=E8=90=A5=E5=9C=B0=E5=9F=9F?= =?UTF-8?q?=E5=85=AD=E4=BB=B6=E5=BD=92=E5=B1=9E=E8=A1=8C=E5=A2=9E=E8=A1=A5?= =?UTF-8?q?=E2=80=94=E2=80=94UiCampModals/CampSceneView/=E8=90=A5=E5=9C=B0?= =?UTF-8?q?=E5=9B=9B=E5=AD=90=E7=95=8C=E9=9D=A2=E8=A7=86=E5=9B=BE=E6=97=8F?= =?UTF-8?q?/camp=5Fesc=5Foverlay+MainEscFlow/CampHudBand/CampRefreshBus;D1?= =?UTF-8?q?=E8=A1=8C=E8=90=A5=E5=9C=B0=E9=9D=A2=E7=8E=B0=E7=8A=B6=E5=8C=96?= =?UTF-8?q?=E5=9B=9B=E6=9F=9C=E5=8F=B0=E9=80=80=E5=BD=B9;ui=5Fregistry?= =?UTF-8?q?=E8=A1=8C=E5=AD=90=E5=AE=B9=E5=99=A8=E4=B8=8E=E5=B1=82=E5=BA=8F?= =?UTF-8?q?=E5=90=88=E5=90=8C=E6=A7=BD=E6=8D=A2=E4=BB=A3camp=5Foverlay?= =?UTF-8?q?=E9=80=80=E5=BD=B9=E6=8D=A2camp=5Fscene+=E5=9B=9B=E5=AD=90?= =?UTF-8?q?=E7=95=8C=E9=9D=A2+camp=5Fesc=5Foverlay;=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E7=A0=81=E9=A6=96=E4=B8=AA=E9=94=AE=E7=9B=98=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E5=85=A5=E5=8F=A3main.=5Funhandled=5Finput=E5=A5=91=E7=BA=A69?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0)+camp.md=20v2.4(=E9=A1=B6=E6=A0=8F=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E5=8D=95=E5=8F=A3=E5=AE=9E=E8=A3=85=E5=9B=9E=E5=A1=AB?= =?UTF-8?q?=E2=80=94=E2=80=94=E8=BF=9B=E6=A1=A3=E4=B8=8E=E5=86=99=E5=8F=A3?= =?UTF-8?q?=E5=B0=BE=E8=A7=A6=E5=8F=91=E7=8E=B0=E5=BC=80=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E4=B8=8EHUD=E5=90=8C=E6=AD=A5=E5=8F=96=E7=8E=B0=E5=80=BC;?= =?UTF-8?q?=E5=8F=A0=E5=B1=82=E8=8A=82=E5=8D=A1=E2=91=A3=E2=91=A4=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E9=9A=8F=E6=89=8B=E6=B8=85)+art-bible=20v3.35(=C2=A76?= =?UTF-8?q?.2=E5=9B=B4=E5=A2=99=E7=BB=86=E6=9D=A1=E5=8F=A5=E5=AE=9E?= =?UTF-8?q?=E8=A3=85=E8=90=BD=E7=9B=98=E5=80=BC(0,261,1280,49)=E5=BA=95?= =?UTF-8?q?=E9=94=9Ay310=C2=B7=E6=A1=A9=E8=BA=AB43=E9=94=81=E5=AE=9A=C2=B7?= =?UTF-8?q?=E5=A4=87=E9=80=89A'=E5=AD=98=E6=A1=A3=E5=9C=A8=E6=A1=88;=C2=A7?= =?UTF-8?q?4.1=E8=90=A5=E5=9C=B0=E5=9C=BA=E6=99=AF=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=AD=90=E6=9D=BF32=E8=89=B2=E8=A1=8C=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=B9=B6=E9=9B=86272=E6=94=B6=E6=95=9B32=E8=BF=9D=E4=BE=8B?= =?UTF-8?q?=E5=AF=B90,=E8=89=B2=E5=80=BC=E4=BA=8B=E5=AE=9E=E6=BA=90=3D?= =?UTF-8?q?=E5=85=A5=E5=8C=85=E9=87=8F=E5=8C=96=E4=BA=A7=E7=89=A9,?= =?UTF-8?q?=E6=8D=A2=E7=AE=97=E5=BC=8F=E7=99=BB=E8=AE=B0=E6=97=A0=E9=80=90?= =?UTF-8?q?=E8=89=B2=E5=80=BC=E5=B7=AE=E5=BC=82=E5=91=88=E6=8A=A5)+camp-sc?= =?UTF-8?q?ene-prompts=20v1.4(=E5=85=AB=E7=89=A9=E4=BB=B6=E8=90=BD?= =?UTF-8?q?=E4=BD=8D=E5=AE=9E=E6=B5=8Bcontain=E8=A1=A8=E2=80=94=E2=80=94bo?= =?UTF-8?q?ard130x121/gate240x211/dummy120x180/forge240x193/tent251x170/ch?= =?UTF-8?q?est106x90/notebook100x66/campfire160x149,=E9=94=9A=E5=AE=9A?= =?UTF-8?q?=E5=BA=95=E4=B8=AD=E5=BF=83+=E9=A1=B6=E9=94=9A;=E9=87=8F?= =?UTF-8?q?=E5=8C=96=E7=BC=A9=E6=94=BE=E5=AE=9E=E5=86=B5=E6=B3=A8=E8=AE=B0?= =?UTF-8?q?=E2=80=94=E2=80=9432=E8=89=B2=E9=87=8D=E9=87=8F=E5=8C=96+?= =?UTF-8?q?=E9=9D=9E=E6=95=B4=E6=95=B0=E5=80=8Dcontain=E6=8D=A2=E7=AE=97?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E5=8F=A3=E5=BE=84)+=E7=94=9F=E6=B6=AF.md=20v?= =?UTF-8?q?1.4(=E8=90=A5=E5=9C=B0=E8=A1=8C=E6=9D=A1=E5=B8=A6=E6=92=A4?= =?UTF-8?q?=E4=B8=8B=E7=8E=B0=E7=8A=B6=E5=8C=96+P6=E7=94=B2=E8=90=BD?= =?UTF-8?q?=E5=9C=B0=E8=8A=82=E6=8D=A2=E4=BB=A3+=E6=9C=9F=E4=BA=8C?= =?UTF-8?q?=E6=9D=A1=E5=B8=A6=E5=A4=84=E7=BD=AE=E4=B9=89=E5=8A=A1=E6=B8=85?= =?UTF-8?q?=E7=A9=BA)+08-Alpha=20v1.23(=E9=94=AE=E7=9B=98=E6=89=8B?= =?UTF-8?q?=E6=9F=84=E8=A1=8CEsc=E4=BE=8B=E5=A4=96=E6=B3=A8=E8=AE=B0+?= =?UTF-8?q?=E8=90=A5=E5=9C=B0=E4=B8=A4=E8=A1=8C=E5=9C=A8=E5=BD=B9=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3+=E9=9C=80=E6=B1=82=E6=BE=84=E6=B8=85=E6=AD=BB?= =?UTF-8?q?=E9=93=BE=E6=94=B9git=E6=B2=BF=E9=9D=A9)+asset-path-map?= =?UTF-8?q?=E4=B8=8E=E7=BE=8E=E6=9C=AF=E6=B8=85=E5=8D=95=C2=A73.5(?= =?UTF-8?q?=E8=90=A5=E5=9C=B0=E5=8D=81=E4=BB=B6=E5=AE=9E=E8=A3=85=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E7=A1=AE=E8=AE=A4scene=5Fcamp=5F*=E5=8D=81=E4=BB=B6?= =?UTF-8?q?=E5=9C=A8=E5=BD=B9TEX=5FCAMP=5F*=E5=8D=81=E9=94=AE=E6=B6=88?= =?UTF-8?q?=E8=B4=B9+=E7=BB=88=E5=AE=A1=E7=BD=AE=E6=8D=A2=E5=90=8C?= =?UTF-8?q?=E5=BE=84=E6=B3=A8=E8=AE=B0);=E2=91=A1=E5=8F=8D=E5=93=BA#10=20s?= =?UTF-8?q?hot=5Fchecker=E8=89=B2=E6=95=B0=E5=88=A4=E6=8D=AE=E4=BA=92?= =?UTF-8?q?=E6=96=A5=E5=B7=B2=E9=9A=8F82b2cbea/8e294de9=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A3=81=E5=86=B3=E8=90=BD=E5=9C=B0(=E9=98=88=E5=80=BC40/camp?= =?UTF-8?q?=E7=89=B9=E5=88=A4=E5=88=A0=E9=99=A4/=E8=89=B2=E6=95=B0?= =?UTF-8?q?=E6=94=B6=E6=95=9B=E5=BE=85=E5=8A=9E=E6=96=B0=E6=9D=A191f91744)?= =?UTF-8?q?=E9=9B=B6=E8=90=BD=E6=96=87=E9=9D=A2;=E2=91=A2=E5=8F=8D?= =?UTF-8?q?=E5=93=BA#12=20CAMP=5FHEADER=5FBAND=E4=BB=A4=E7=89=8C=E9=80=80?= =?UTF-8?q?=E5=BD=B9=E8=AF=84=E4=BC=B0=E8=BF=81=E5=BE=85=E5=8A=9E=E6=96=B0?= =?UTF-8?q?=E6=9D=A1(=E9=9A=8F=E4=BB=A4=E7=89=8C=E6=89=B9=E5=A4=84?= =?UTF-8?q?=E7=BD=AE=E9=9D=9E=E7=8B=AC=E7=AB=8B=E5=BC=BA=E5=88=A0)+palette?= =?UTF-8?q?=5Fcheck=E5=9F=BA=E7=BA=BF=E5=BB=BA=E6=A1=A3=E4=B8=8E=E5=8F=8C?= =?UTF-8?q?=E9=97=A8=E6=9C=BA=E6=A3=80=E5=8C=96=E8=BF=81=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E6=96=B0=E6=9D=A1(=E5=AE=9E=E7=8E=B0=E6=8A=A5=E5=91=8A=C2=A77.?= =?UTF-8?q?2=E6=9C=AA=E5=86=B3=E5=85=88=E8=BF=81);=E2=91=A3=E7=9B=AE?= =?UTF-8?q?=E6=A3=80=E4=BA=94=E9=A1=B9=E7=99=BB=E8=AE=B0=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=B8=85=E5=8D=95=E3=8A=BA(=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E8=A7=82=E6=84=9F=E5=90=AB=E5=8D=81=E4=BB=B6=E7=B4=A0?= =?UTF-8?q?=E6=9D=90=E7=BB=88=E5=AE=A1=E8=A7=82=E6=B5=8B/=E4=B8=83?= =?UTF-8?q?=E7=89=A9=E4=BB=B6=E7=82=B9=E9=80=89=E5=8F=8D=E9=A6=88/?= =?UTF-8?q?=E5=A4=A7=E9=97=A8=E7=AF=9D=E7=81=AB=E5=8A=A8=E7=BA=BF/Esc?= =?UTF-8?q?=E4=B8=89=E5=8A=A8=E7=BA=BF=E4=B8=8EHUD/=E5=9B=9B=E5=AD=90?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E8=A7=86=E8=A7=89);=E2=91=A4=E4=BA=A7?= =?UTF-8?q?=E5=87=BA=E7=89=A9=E9=80=80=E5=BD=B9=E4=B9=9D=E4=BB=B6(?= =?UTF-8?q?=E5=90=B8=E6=94=B6=E5=8D=B3=E6=AD=BB+=E8=AF=81=E6=8D=AE?= =?UTF-8?q?=E5=8F=AA=E7=95=99=E6=9C=80=E6=96=B0):=20iter47=E5=8F=8D?= =?UTF-8?q?=E5=93=BA=E7=82=B9+=E5=AE=9E=E7=8E=B0=E6=8A=A5=E5=91=8A+?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E5=AE=A1=E8=AE=A1+=E4=B8=89=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E5=8D=A1=E7=89=87(=E5=90=88=E5=9B=9E3443890d)+?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E6=BE=84=E6=B8=85(08-Alpha=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E6=94=B9git=E6=B2=BF=E9=9D=A9)+=E8=90=A5=E5=9C=B0=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E5=9B=BE=E7=BE=8E=E6=9C=AF=E7=94=9F=E6=88=90=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E6=8F=90=E6=A1=88(camp.md:31=E7=95=99=E7=97=95?= =?UTF-8?q?=E5=8F=A5=E6=94=B9git=E6=B2=BF=E9=9D=A9)+=E5=8D=A1=E2=91=A3?= =?UTF-8?q?=E2=91=A4=E5=8F=8C=E5=AE=A1=E5=A4=8D=E6=A0=B8(=E9=81=97?= =?UTF-8?q?=E7=95=99=E8=8A=82=E9=9B=B6=E6=9C=AA=E5=86=B3);=E6=8F=90?= =?UTF-8?q?=E6=A1=88-=E8=90=A5=E5=9C=B0=E8=89=B2=E5=BD=A9=E4=B8=8E?= =?UTF-8?q?=E6=B0=9B=E5=9B=B4=E8=84=9A=E6=9C=AC=E6=8C=89art-bible=C2=A76.2?= =?UTF-8?q?/camp-scene-prompts=E4=BE=9D=E6=8D=AE=E8=A1=8C=E6=B4=BB?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E4=BF=9D=E7=95=99;=E2=91=A5=E8=B4=A6?= =?UTF-8?q?=E9=9D=A2:=20=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95=E8=90=A5?= =?UTF-8?q?=E5=9C=B0=E4=BA=A4=E4=BA=92=E9=87=8D=E5=81=9A=E6=9D=A1=E6=95=B4?= =?UTF-8?q?=E6=9D=A1=E5=88=A0=E9=99=A4(=E4=BA=94=E5=8D=A1=E5=85=A8?= =?UTF-8?q?=E8=90=BD=E5=9C=B0=E7=8A=B6=E6=80=81=E6=9C=BA=E5=87=BA=E5=8F=A3?= =?UTF-8?q?)+UI=E8=B4=B4=E5=9B=BE=E9=87=8D=E6=9E=84=E6=9D=A1=E4=B8=8E?= =?UTF-8?q?=E5=9B=BE=E9=89=B4=E6=9D=A1=E8=90=BD=E5=9C=B0=E6=B3=A8=E8=AE=B0?= =?UTF-8?q?+=E4=B8=A4=E6=9D=A1=E6=96=B0=E7=99=BB=E8=AE=B0,roadmap=E8=BF=AD?= =?UTF-8?q?=E4=BB=A347=E8=A1=8C=E5=B7=B2=E5=AE=8C=E6=88=90(2026-11-01)+?= =?UTF-8?q?=E4=B8=A4=E5=88=97=E9=80=80=E5=BD=B9=E4=BF=9D=E7=95=99=E5=AD=97?= =?UTF-8?q?+=E5=BD=93=E5=89=8D=E4=BD=8D=E6=8D=A2=E4=BB=A3(=E8=BF=AD?= =?UTF-8?q?=E4=BB=A31-47=E5=85=A8=E5=AE=8C=E6=88=90,=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E6=AD=A5=3D=E8=BF=AD=E4=BB=A348=E5=BE=85/iter=E5=8F=91?= =?UTF-8?q?=E4=BB=A4);=E2=91=A6=E9=97=B8=E7=BA=A2=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=89=E5=A4=84:=20gdd=5Flint=20R3=E4=B8=A4=E5=A4=84(08-Alph?= =?UTF-8?q?a=E5=90=88=E5=9B=9E+=E6=97=A5=E6=9C=9F=E5=8F=A5=E5=BC=8F?= =?UTF-8?q?=E5=8E=BB=E4=BF=AE=E8=AE=A2=E6=B3=A8=E8=AE=B0=E5=BD=A2=E6=80=81?= =?UTF-8?q?)+capability=5Faudit=E5=9B=9B=E7=BA=A2(=E6=94=B6=E5=B0=BE?= =?UTF-8?q?=E6=A0=B8=E5=AF=B9=E6=94=B9=E5=90=8D=E5=9B=9E=E8=A1=A8=E4=B9=89?= =?UTF-8?q?=E5=8A=A1=E2=80=94=E2=80=94README:144/148=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E5=85=A5=E5=8F=A3object=5Fpressed=E4=BF=A1=E5=8F=B7=E6=94=B9?= =?UTF-8?q?=E9=94=9ACampSceneView.=5Fgui=5Finput()/README:145=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=90=8D=5Fon=5Fconfirm=5Fnew=5Fadventure=E6=94=B9?= =?UTF-8?q?=E8=90=BD=E5=9C=B0=E5=90=8D=5Fon=5Fconfirm=5Faccepted=E4=B8=8Em?= =?UTF-8?q?ain.=5Fresume=5Ffrom=5Fmenu/README:146=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=5Ftest=5Fforge=5Frows=E6=94=B9=E8=90=BD?= =?UTF-8?q?=E5=9C=B0=E5=90=8D=5Frun)=E3=80=94=E7=BA=AF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E7=BB=B4=E6=8A=A4=E3=80=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-assets-checklist.md | 6 +- design/art/art-bible.md | 5 +- design/art/asset-path-map.md | 2 +- design/art/camp-scene-prompts.md | 6 +- .../engineering/architecture/architecture.md | 14 +- design/gdd/08-Alpha版本标准.md | 8 +- design/gdd/systems/跨局循环/生涯.md | 9 +- design/gdd/ux/camp.md | 8 +- game/tests/README.md | 8 +- reports/iter47-反哺点-2026-11-01.md | 19 - reports/iter47-实现报告-2026-11-01.md | 126 ----- reports/iter47-验收审计-2026-11-01.md | 128 ----- ...rilling与godot-master-迭代47双卡-2026-11-01.md | 60 -- .../提案-营地场景图美术生成方案-2026-10-22.md | 522 ------------------ ...需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md | 320 ----------- .../需求卡片-营地场景图新建批-2026-10-18.md | 459 --------------- ...œ€求卡片-营地模态句柄子容器批-2026-11-01.md | 144 ----- reports/需求澄清-营地交互重做-2026-10-18.md | 94 ---- roadmap.md | 6 +- 体验验证清单.md | 15 + 待办清单.md | 34 +- 21 files changed, 75 insertions(+), 1918 deletions(-) delete mode 100644 reports/iter47-反哺点-2026-11-01.md delete mode 100644 reports/iter47-实现报告-2026-11-01.md delete mode 100644 reports/iter47-验收审计-2026-11-01.md delete mode 100644 reports/复核-双审-grilling与godot-master-迭代47双卡-2026-11-01.md delete mode 100644 reports/提案-营地场景图美术生成方案-2026-10-22.md delete mode 100644 reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md delete mode 100644 reports/需求卡片-营地场景图新建批-2026-10-18.md delete mode 100644 reports/需求卡片-营地模态句柄子容器批-2026-11-01.md delete mode 100644 reports/需求澄清-营地交互重做-2026-10-18.md diff --git a/design/art/art-assets-checklist.md b/design/art/art-assets-checklist.md index d87ef9a5..3be5fab6 100644 --- a/design/art/art-assets-checklist.md +++ b/design/art/art-assets-checklist.md @@ -132,8 +132,8 @@ - **要什么**:营地场景图 10 张——`scene_camp_bg`(背景层,不透明全幅=天空+远山+整片地面+门洞内一条通向远处的小路)+ `scene_camp_wall`(围墙层,透明底=横贯全宽密排木桩墙+两根门柱,门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件)。钥石顶栏图标沿用现役 `icon_keystone`。 - **来源/规格**:**✦ 插画级**(作者自跑远程生图管线);烛光黄 `#F6C667` + 木色 `#8A5A34`(art-bible §6.2);2× 源档出图、最近邻降采样到 1280×800;后处理=抠底/降采样/色板量化/描边统一。**出图登记照 [remote-gen-prompts](remote-gen-prompts.md) 头注轻量口径执行:用途+生成时间必注,其余参数有则记。** -- **排期**:营地交互重做**美术自立批**(不占迭代位;UI 贴图重构批已搁置)。终稿落 `game/assets/art/scene/`,消费常量 `UiKit.TEX_CAMP_*`。 -- **现状**:全占位。 +- **排期**:已执行(随迭代 47 卡④,2026-11-01 合回)。终稿落 `game/assets/art/scene/`,消费常量 `UiKit.TEX_CAMP_*`。 +- **现状**:已入包(2026-11-01 迭代 47 卡④——十件按锁定矩形 contain 落位、营地主色板 32 色重量化;用户游戏内终审如有置换意见,按同径替换)。 ### 3.6 字体(全局 UI 像素字,已定稿单套) @@ -187,7 +187,7 @@ └─> 敌种呈现形态裁决 ✅已完成(全站桩,卡片式已弃) 徽章(3.1)/节点图(3.2)/效果图标(3.4) —— 独立线,可随时插队 ♻ 复用件(3.2/3.4/3.5/3.6/演出粒子) —— 不依赖样张,可随时插队(入包闸 = §0 复用四道) -字体(3.6)接入归表现批;营地场景图(3.5)归营地交互重做美术自立批 +字体(3.6)接入归表现批;营地场景图(3.5)已随迭代 47 卡④ 入包(2026-11-01) 分辨率档位 ✅已定案(1280×800 + 1920×1080,2026-09-22 用户确认);art-bible §8 资产规范 ✅已成文(2026-09-23)——像素基准/画布/命名/帧数候选值就位,终值归样张批冻结 ``` diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 4bd9310a..f44d5bcf 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -1,6 +1,6 @@ # 美术圣经(Art Bible)— Dungeon Sweeper -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.34,历次修订明细见 git 提交史 +> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.35,历次修订明细见 git 提交史 > > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。 @@ -209,6 +209,7 @@ - **图标槽柔和档 `#806A4E`(SLOT_BACKDROP_SOFT)**|BCard 图标槽底:对米色卡面 PANEL_DATA 3.69:1(深档 SLOT_BACKDROP #3E362C 8.53:1 过强、像硬贴补丁,故槽底另立柔和档),槽内白图标 5.14:1,满足 ≥3:1 图形参考线硬约束;仅 BCard 图标槽换档,B 区状态槽仍用深档 SLOT_BACKDROP。验收:机检〈槽内白图标对槽底 ≥3:1〉 - **群伤微光暗档 `#A61D37`(TG_GLOW_AOE)**|类型微光群伤组的**明度档**(UI token 板,占 1 枚额度,**余量 3→2**):色相 349° 与亮档 `#FF2D55` 零移动,明度落 V=0.65 档——即 §4.2「微光 = 色相+明度双码」里明度侧的落法;与 §4.2「红只说危险」不相撞(微光组色相刻意错开语义红,见 §4.2「类型微光色带」条)。已在役(`ui_kit.gd` 常量与 `type_glow_test.gd` 守门断言),本节为登记转正。验收:机检〈ui_kit.gd TG_GLOW_AOE 与 type_glow_test 断言的 H/S 逐位一致、V 落 0.65 档〉 - **站桩石板地台板身 `#968264`(STAND_STONE)**|战斗屏场景环境子板(分层②,不占 48 token 额度):B 区站桩地台板身与顶缘的材质色,跨三关恒定、不吃 §4.3 `wall_ambient` tint(地台是 §6.1 定死的世界中层承载面,随关卡变会破 §2 明度分层的层间关系)。转正前即在役。验收:机检〈战斗屏场景环境子板色数 ≤32 且本值在册〉 +- **营地场景环境子板(分层②,不占 48 token 额度)**:营地场景十层环境色按子板制落地——各层独立量化并集 272 色经最近对合并收敛至 **32 色、违例对 0**,十层按终版色板重量化回写(2026-11-01 迭代 47 卡④)。色值不另立逐值清单,事实源=入包素材 `scene_camp_*` 十件的量化产物;换算与合并过程登记于 artwork 工作区换算式登记(git 提交 3443890d 一线可考)。验收:机检〈营地屏唯一色数判据(shot_checker 闸件承载,2026-11-01 用户裁口径)〉 - **重甲冷灰金属材质色 `#868C9A`(ARMOR_PLATE_COLD,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 2→1**;用户裁):重甲档甲材质色;character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王岩石板甲**同引本枚、不另计额度**;材质色跨屏恒定,落分层①不落分层②(环境色才随场景走)。过门情况:第二道门按宽松口径(禁止三通道全 <8)与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 222°,不占红/金/蓝/紫赤/绿语义段、不在 300°–345° 禁入带;材质色不进信息层与语义物件岗)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1(图形 ≥3:1 门槛);相对亮度 L≈0.261 落 §2 世界中层 0.22–0.45 带。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉 - **卓尔浅紫灰皮 `#A79CB8`(DRIDER_SKIN,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 1→0,额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,L≈0.355 落 §2 世界中层带)。过门情况:第二道门同上行口径,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 264°,避开 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`;不占本节五语义段)。对比实测:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——**两处均过图形 ≥3:1 门槛**(本轮新算)。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉 - **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#A8AEB8`)→ 并入 `FOG_MEMORY_INK #C4C4C4`,**部件取值 = `#C4C4C4`**;② 主角提灯铜色(原拟 `#C08A3A`)→ 并入 `GOLD_DEEP #B07A14`,**部件取值 = `#B07A14`**;③ 食人魔酋长暖褐皮(原拟 `#B08050` / `#A97C4E`)→ 并入 `暖石 #B8A582`,**部件取值 = `#B8A582`**;④ 石君王灰皮(原拟 `#9A968C` / `#949089`,按**次级皮**口径——板甲视同体块主色、灰皮属次级皮故不受 L 0.22–0.45 约束)→ 并入 `STONE #786E62`,**部件取值 = `#786E62`**;⑤ 轻甲护甲图标木色 `#8A5A34`(深素底下 2.72:1 不过门;原拟新增木色亮档 `#C49A5E`)→ 并入 `WARM_FAINT #CDB88C`,**部件取值 = `#CDB88C`**(8.08:1)。**一色两岗代价已随裁定接受**:① 的 `#C4C4C4` 语义岗 = 迷雾记忆墨(§6.5)、② 的 `#B07A14` 属金族(§4.2 金只说收益与兑现)——两者均作角色随身件材质色用,不进信息层与语义物件岗;③④⑤ 无语义岗冲突。验收:机检〈五处部件取值点全部改指合并目标色,四枚原拟新增候选值零入板〉 @@ -390,7 +391,7 @@ - **情绪与色域**:承载 §2.8——全作最暖:烛光黄 `#F6C667` × 木色 `#8A5A34`(§7.2),中等饱和,无棋盘式高对比。 - **场景构成**:一张可点击的营地场景图(1280×800,与工程档同幅面)。远景=天空与远山;中景=**独立成层的木围墙**(密排竖木桩、桩顶削尖、不透缝无横木)与**半开的营地大门**;近景=中央篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板。**中景带自底部往上约 2/3 处起**;**近景物件可覆盖围墙,唯一例外=中间门洞必须留空、不被任何物件遮挡**。七个可点物件的功能绑定归 `camp.md`,本节只定画法。 - **图层拆分(10 张)**:场景按「远景/中景/近景要素各自成层」拆——`scene_camp_bg` 背景层(z0,不透明全幅)=天空+远山+整片地面+门洞内一条通向远处的小路;`scene_camp_wall` 围墙层(z1,透明底)=横贯全宽密排木桩墙(左右两段)+两根略高的门柱,**门洞处留透明缺口**透出背景层的小路;`scene_camp_board` 布告板(z2)、`scene_camp_gate` 门扇(z3)、`scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷(z4)、`scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本(z5)、`scene_camp_campfire` 篝火(z6,最前)=八个物件层,各透明底单件一张。**帐篷**为承载件、不可点。围墙独立成层的好处:桩高可单独锁死、门洞做透明缺口、背景层不混入暖木色。提示词与坐标 = `camp-scene-prompts.md`,消费常量 = `asset-path-map`。 -- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条 `(0, 240, 1280, 70)` 裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB)。 +- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB);**实装落盘矩形 `(0, 261, 1280, 49)`、底锚 y310**(Y 压缩按桩身 43px 终稿锁定值精确,落带内〔规划带 (0,240,1280,70)〕;备选 A′〔带高 70/桩身 62〕存档 artwork 同目录——2026-11-01 迭代 47 卡④ 实装)。 - **色彩与氛围依据**:营地场景的冷暖分工(冷的大面积后退、暖的小面积前进)、空气透视三档与大面积用色规则 = `reports/提案-营地色彩与氛围脚本-2026-10-23.md`。本节不复述色值;新增环境色按 §4.1 场景环境子板条款登记(每屏一套、≤32 色、过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门)。 - **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。 - **钥石余额**:常驻画面顶部的一行小 HUD 栏(高 48px,**浮层覆盖,不挤压画面**)。 diff --git a/design/art/asset-path-map.md b/design/art/asset-path-map.md index 8c075663..ebeee0ac 100644 --- a/design/art/asset-path-map.md +++ b/design/art/asset-path-map.md @@ -27,7 +27,7 @@ |---|---|---| | `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 | | `fx/` | 特效帧 | shovel_swing_f0/f1/f2(挥铲三帧,握把锚 (18,12)) | -| `scene/` | **场景图**(背景层 + 地面层 + 围墙层 + 可点物件层;营地场景图首批) | 营地 10 张:`scene_camp_bg`(背景层,不透明全幅=天空+远山+地面+门洞小路)+ `scene_camp_wall`(围墙层,透明底、门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件,不可点)+ `scene_stage_bg_dungeon` / `scene_stage_bg_underdark` / `scene_stage_bg_deep_underdark`(B 区战斗舞台背景层三关变体,✦ 插画级,顶部空区+远景天然洞壁,不画近景地面,按 board_type 选图)+ `scene_stage_ground`(B 区连续近景地面层,✦ 插画级,泥土/砂砾/碎石+顶缘分隔带,跨关恒定)+ `scene_stage_plaza`(B 区角色脚下小石台,48×12 九宫格件)——B 区战斗舞台背景与连续地面 2026-10-31 已入包;登记超前:营地场景图批落地前盘上未建 | +| `scene/` | **场景图**(背景层 + 地面层 + 围墙层 + 可点物件层;营地场景图首批) | 营地 10 张:`scene_camp_bg`(背景层,不透明全幅=天空+远山+地面+门洞小路)+ `scene_camp_wall`(围墙层,透明底、门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件,不可点)+ `scene_stage_bg_dungeon` / `scene_stage_bg_underdark` / `scene_stage_bg_deep_underdark`(B 区战斗舞台背景层三关变体,✦ 插画级,顶部空区+远景天然洞壁,不画近景地面,按 board_type 选图)+ `scene_stage_ground`(B 区连续近景地面层,✦ 插画级,泥土/砂砾/碎石+顶缘分隔带,跨关恒定)+ `scene_stage_plaza`(B 区角色脚下小石台,48×12 九宫格件)——B 区战斗舞台背景与连续地面 2026-10-31 已入包;营地 10 张 2026-11-01 随迭代 47 卡④ 入包(`scene_camp_*` 十件在役、`TEX_CAMP_*` 十键消费;用户游戏内终审如有置换,按本行键名同径替换) | | `board/` | 砖面/封印印记(三关换皮 + 封印印记件) | terrain_floor__.png(三关地面系)、seal_mark.png | ## 4. 坐标/朝向等工程侧约定备查 diff --git a/design/art/camp-scene-prompts.md b/design/art/camp-scene-prompts.md index cd5abd50..413129c0 100644 --- a/design/art/camp-scene-prompts.md +++ b/design/art/camp-scene-prompts.md @@ -1,4 +1,4 @@ -# 营地场景 · 分层生图提示词卡 v1.3 +# 营地场景 · 分层生图提示词卡 v1.4 > **性质**:营地场景图(1280×800,一张可点击场景图 + 十张分层:背景层 1 + 围墙层 1 + 八个物件层)的出图执行侧文件。**场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖**。 > **依据**:色彩与氛围 = `reports/提案-营地色彩与氛围脚本-2026-10-23.md`(本卡不复述色值);坐标与层序 = `artwork/2026-10-23-营地场景/布局草案-1280x800.html`;物件命名与消费链 = [asset-path-map](asset-path-map.md);画法与交付形态 = [art-bible](art-bible.md) §6.2。冲突时色彩以色彩脚本为准,画法以 art-bible 为准。 @@ -105,6 +105,8 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain | 笔记本 | 5 | 100×80 | 200×160 | §3.7 | | 篝火 | 6 | 160×160 | 320×320 | §3.8 | +**落位实测(2026-11-01 迭代 47 卡④,锁定矩形 contain 呈报备案追认值)**:布告板 130×121/门扇 240×211/木桩 120×180/锻炉 240×193/帐篷 251×170/宝箱 106×90/笔记本 100×66/篝火 160×149——贴图锚定=底中心(帐篷/锻炉/宝箱/篝火/笔记本)+顶锚(门扇悬挂/布告板挂墙);命中矩形按锁定值。换算式登记(源 2× 档→落位尺寸)存 artwork 工作区,git 提交 3443890d 一线可考。 + **3.1 布告板(→ 图鉴)** ``` A wooden notice board hung on a wall, with two or three blank pinned papers, no writing on them, one corner of a paper slightly curled; wood brown #8A5A34 frame, warm tan stone #C9AF83 papers. @@ -162,6 +164,8 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm - 目检:密排竖木桩、桩顶削尖、不透缝、无横木;门洞 x1040–1520 **完全透明**(透出 bg 小路)、无门扇 - 单张色数 ≤32(量化后)、缩放为整数倍无拉伸痕迹 +> **量化与缩放实况注记(2026-11-01 迭代 47 卡④ 落地)**:围墙层与八件已按营地主色板 **32 色重量化回写**(art-bible §4.1 子板行——违例对 0);落位缩放实况=源 2× 档经后处理换算为锁定矩形 contain(×0.1934–0.4404 非整数倍),「整数倍无拉伸痕迹」判据的机检面以落位实测尺寸与目检兜底执行。 + **八件** - 单件居中、四周留边、整件完整不出画 - 底色均匀 `#F2F2F2`、奶油描边闭合(去底脚本要能识别到屏障) diff --git a/design/engineering/architecture/architecture.md b/design/engineering/architecture/architecture.md index 3dabf56a..86c7df01 100644 --- a/design/engineering/architecture/architecture.md +++ b/design/engineering/architecture/architecture.md @@ -2,8 +2,8 @@ ## 文档状态 -- 版本:1.27 -- 最近更新:2026-11-01(迭代 46 反哺点落文——BattleRefreshFlow 行增补+damage_controller/action_economy/GrantSegment 三处现状化:全局受伤唯一发射口与消费族、换图刷新流程件、dig_paid 命中单点与折后价入参;沿革查 git) +- 版本:1.28 +- 最近更新:2026-11-02(迭代 47 反哺点落文——营地域六件归属行增补〔UiCampModals/CampSceneView/营地四子界面视图族/camp_esc_overlay+MainEscFlow/CampHudBand/CampRefreshBus〕+D1 营地面现状化+ui_registry 行子容器与合同槽换代;沿革查 git) - 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定) - 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调) - 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准) @@ -163,9 +163,15 @@ | 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API | |---|---|---|---|---| -| **D1 HUD**(呈现面拆分持续换代:组合根 main.gd + 三屏壳(MenuScreen/CampScreen/AdventureScreen)+ views/ 视图单元(现行承载面见「呈现层装配与会话生命周期」节;早期 9 单元清单与 LevelStripView 已随场景换代退役);营地覆盖层=四柜台并排〔树淬炼主界面/锻造工坊·秘宝匣钥匙门/图鉴常开——迭代 21 T6 程序占位重排〕) | 全部 Control/CanvasLayer(例外:BoardView 棋盘本体与 BattleStageView 站桩本体 = Control 壳 + SubViewportContainer + SubViewport + Node2D 世界〔BoardWorld/CellUnit;StageWorld/StandeeBody——B 区 slot_row 伴随件留壳层〕,探针契约面不变——棋盘 Node2D 迁移批 Phase A 2026-09-23 / 战斗舞台 Phase B 2026-09-26)、输入→意图翻译(**唯一提交路径 = settle_batch,不直调 A3**)、呈现义务状态记录(A2×6 / B2×4 / B3×4 / B4×5 / B1×3) | 视图单元接口(信号外发、setter 只读注入) | A2 compute_move_path / ActionOutcome;A3 ap/rap;B1 步骤流行协议(数据源);ConfigDB display_name | **MEDIUM**:Control / CanvasLayer / draw_* / InputEvent / RichTextLabel——对照 breaking-changes.md 4.5–4.7 条目(CanvasItem 线条无抗锯齿羽化、设备 ID 常量、RichTextLabel 图片参数两轮变化) | +| **D1 HUD**(呈现面拆分持续换代:组合根 main.gd + 三屏壳(MenuScreen/CampScreen/AdventureScreen)+ views/ 视图单元(现行承载面见「呈现层装配与会话生命周期」节;早期 9 单元清单与 LevelStripView 已随场景换代退役);营地面=场景根+四子界面功能窗口+Esc 浮窗+顶栏 HUD 栏〔迭代 21 四柜台覆盖层已随迭代 47 卡④⑤ 退役〕) | 全部 Control/CanvasLayer(例外:BoardView 棋盘本体与 BattleStageView 站桩本体 = Control 壳 + SubViewportContainer + SubViewport + Node2D 世界〔BoardWorld/CellUnit;StageWorld/StandeeBody——B 区 slot_row 伴随件留壳层〕,探针契约面不变——棋盘 Node2D 迁移批 Phase A 2026-09-23 / 战斗舞台 Phase B 2026-09-26)、输入→意图翻译(**唯一提交路径 = settle_batch,不直调 A3**)、呈现义务状态记录(A2×6 / B2×4 / B3×4 / B4×5 / B1×3) | 视图单元接口(信号外发、setter 只读注入) | A2 compute_move_path / ActionOutcome;A3 ap/rap;B1 步骤流行协议(数据源);ConfigDB display_name | **MEDIUM**:Control / CanvasLayer / draw_* / InputEvent / RichTextLabel——对照 breaking-changes.md 4.5–4.7 条目(CanvasItem 线条无抗锯齿羽化、设备 ID 常量、RichTextLabel 图片参数两轮变化) | | **组合根拆件**(呈现侧写口子件:curio_interact_controller / camp_shop_presenter / treasure_interact_controller) | 代组合根执行核心写调用(冒险节点后续推进/营地购买与刷新/道具使用——依赖与回调由 main 构造注入) | 各拆件的写入口(仅组合根装配面可达;视图零直连) | 构造注入的核心写引用(推进/商店/道具各域——详见各拆件头注) | 无 | -| **ui_registry**(`presentation/ui_registry.gd`,界面注册面,已建件——迭代 44) | 呈现层接口面唯一承载:层序合同(LAYER_CONTRACT)迁驻与合同寻址、三域句柄容器 ui_screens(9 屏壳与覆盖层句柄)/ui_battle(5 战区句柄)/ui_modals(13 模态句柄+ModalFlow);组合根经其一级寻址接线,探针挂载假设迁移为 `main.ui.<域容器>.<句柄>`;七个探针别名/转发成员随批消灭 | 三容器属性+合同寻址口(RefCounted 门面,不挂树、零会话期引用);四件(UiRegistry/UiScreens/UiBattle/UiModals)类变量 3/9/5/14,ModalFlow 随 UiModals 容器构造即建 | 构造注入:三屏壳、覆盖层、战区句柄、ModalFlow(main_ui_build 交付随之改型) | 无(RefCounted) | +| **ui_registry**(`presentation/ui_registry.gd`,界面注册面,已建件——迭代 44) | 呈现层接口面唯一承载:层序合同(LAYER_CONTRACT)迁驻与合同寻址、三域句柄容器 ui_screens(9 屏壳与覆盖层句柄)/ui_battle(5 战区句柄)/ui_modals(平铺模态句柄+营地域 UiCampModals 子容器〔六句柄、两段式寻址 `modals.camp.*`——迭代 47 卡⑥〕+ModalFlow;层序合同营地槽换代=camp_overlay 退役、换 camp_scene+四子界面+camp_esc_overlay——迭代 47 卡④⑤);组合根经其一级寻址接线,探针挂载假设迁移为 `main.ui.<域容器>.<句柄>`;七个探针别名/转发成员随批消灭 | 三容器属性+合同寻址口(RefCounted 门面,不挂树、零会话期引用);四件(UiRegistry/UiScreens/UiBattle/UiModals)类变量 3/9/5/14,ModalFlow 随 UiModals 容器构造即建;UiCampModals 营地域子容器随卡⑥(ui_modals 类变量 14→14——删六平铺增一子容器引用) | 构造注入:三屏壳、覆盖层、战区句柄、ModalFlow(main_ui_build 交付随之改型) | 无(RefCounted) | +| **UiCampModals**(`presentation/ui_camp_modals.gd`,营地域句柄子容器,已建件——迭代 47 卡⑥) | ui_modals 营地域六句柄唯一容器(场景根/四子界面/Esc 浮窗/HUD 栏),句柄寻址两段式 `modals.camp.*`;ui_modals 平铺面收窄 | 子容器属性+六句柄只读投影;main_ui_build 装配交付 | 构造注入(六视图句柄);ui_modals(父容器挂载) | 无(RefCounted) | +| **CampSceneView**(`views/camp_scene_view.gd`,营地场景根视图,已建件——迭代 47 卡④) | 营地场景图唯一呈现件:十层贴图铺底(层序按 layout 表 z 序;`camp_scene_layout.tres` fail-fast 校验+七命中区几何红线——camp_scene_layout_test 承载)、七物件命中区命中即发 object_pressed(组合根路由大门/篝火/笔记本/四界面)、反参照纪律(场景根零文字按钮)、登记模态初始隐(boot 态不盖菜单) | 构造注入(贴图经 `UiKit.TEX_CAMP_*`、layout 表经 ConfigDB 表现域容器);object_pressed 信号外发;open/close 经营地域子容器寻址 | camp_screen(宿主挂载);ConfigDB;组合根(路由消费) | Control+TextureRect 树 | +| **营地四子界面视图**(`views/camp_sub_view_base.gd`+forge_view/tree_view/treasure_view/codex_view,功能窗口公共壳+四件,已建件——迭代 47 卡④) | 营地五功能窗口的四个承载视图(锻造工坊/天赋树/秘宝匣/图鉴)+公共壳(窗口壳/行板/关闭钮;生涯页挂笔记本路由不经此族);模态栈单口 open/close、五窗互斥单开;presenter 承接面零回表(树购买/锻造三意图经既有写口族) | 各 view open/close+意图信号外发;关闭钮 pressed | camp_shop_presenter/MetaProgression 写口(经组合根);CampRefreshBus(刷新广播消费) | Control | +| **camp_esc_overlay+MainEscFlow**(`views/camp_esc_overlay.gd`+`presentation/main_esc_flow.gd`,Esc 浮窗视图+四态路由件,已建件——迭代 47 卡⑤) | Esc 浮窗三钮视图(返回主菜单/设置/退出)+Esc 四态路由静态件(根态唤起/再按关窗/功能窗开着先关最上层窗〔camp.md v2.3 定稿覆盖卡面 Q1 甲〕/设置开态不误关;菜单语境不唤起);**main._unhandled_input=产品码首个键盘输入入口**(契约 9——事件驱动、禁 Input 轮询、不挂 ui_cancel、pressed 非 echo) | flow.open/close 路由口;三钮 pressed 意图信号(经组合根接线) | 组合根(_unhandled_input 前置与意图消费);模态栈(关窗单口);screen_flow(设置/返回动线) | Control+静态件 | +| **CampHudBand**(`views/camp_hud_band.gd`,营地顶栏 HUD 件,已建件——迭代 47 卡⑤) | 顶栏 48px 全宽窄条:钥石余额 badge 唯一呈现(单口取现值、显式刷新才变);set_hud_band 预留位落座 | badge 文本投影;refresh 时取现值 | CampRefreshBus(挂册广播);MetaProgression 钥石读 | Control | +| **CampRefreshBus**(`views/camp_refresh_bus.gd`,营地刷新单口件,已建件——迭代 47 卡④⑤) | 营地刷新单口唯一承载:进档尾与营地写口尾触发 refresh 广播(八写口尾改路由),现开界面与 HUD 同步取现值 | 挂册/refresh 广播 | 组合根(触发点接线);四子界面与 CampHudBand(消费) | 无(RefCounted 信号件) | | **board_hover**(`views/board_hover.gd`,悬停预承诺呈现域件,已建件——迭代 45) | 悬停反馈域唯一承载(自 board_view 收编 11 函数族+_hover/_last_click 两成员):三语义光标、目标格边框、BFS 路径预览、chord 双击首遇锚;_r0 出生展开区成员留宿主 | 构造=引用束注入实为 7 项(cells/minesweeper/diggable 引用+格命中换算/光标写入/hover_forbidden/chord_attempted 四 Callable——卡片预估 5 项,11 函数逐字迁移的最小必需面);三入站口留宿主委托;hover_probe 读面留宿主 | board_view(宿主);输入事件经宿主入站口 | 无(RefCounted) | | **cell_base_layer/cell_mark_overlay**(`views/`,单格两绘制域件,已建件——迭代 45) | 单格绘制域拆分(自 board_cell_unit 状态件 `_CellPaintState` 收编,入参与该层绘制命令同件):基座层(底面/描边/立面/投影/接触带/倒角,12 成员)与标识叠加层(标记/字形/徽章/封印/点迹/高亮/退色,13 成员);宿主 _draw 退为六步时序器,类变量 30→10 | 构造注入;绘制命令由宿主 _draw 按层序调用 | board_cell_unit(宿主);gdstyle 键各文件独立计数(12/13 均 ≤15) | 无(RefCounted) | | **standee_vitals/standee_motion**(`views/`,站桩两状态件,已建件——迭代 45) | 站桩状态域拆分(自 `_StandeeState` 真实 25 成员收编):身份命值(hp/atk/状态值族,12 成员)与资产演出(动作/姿态/位移演出族,11 成员);三个演出探针计数器留宿主,宿主类变量 19→10 | 构造注入;st(沿用)/mo 两实例由宿主持有 | standee_body(宿主);battle_stage_view 写入面逐字保持 | 无(RefCounted) | diff --git a/design/gdd/08-Alpha版本标准.md b/design/gdd/08-Alpha版本标准.md index a3dc8fc1..f98e470e 100644 --- a/design/gdd/08-Alpha版本标准.md +++ b/design/gdd/08-Alpha版本标准.md @@ -2,7 +2,7 @@ > **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。 > **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。 -> **状态**:**已定稿(v1.22)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。 +> **状态**:**已定稿(v1.23)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。 > **成文**:2026-10-13。 ## 本文怎么用 @@ -103,8 +103,8 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战 | 主菜单 | —— | 在役(迭代 33 卡②三入口化:进入存档/设置/退出游戏——入口拓扑=进入存档→选档界面→进档/新档→营地覆盖层→〔营地交互重做卡④〕营地场景图与生涯笔记本;2026-10-22 用户裁换代〔反哺 #13〕) | | 开始覆盖层 | —— | 在役 | | 选档界面(3 存档位) | —— | 在役(迭代 33 卡③——空槽新档/有档进档/删档二次确认+摘要三项;2026-10-22 用户裁增行〔反哺 #8〕) | -| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](ux/camp.md) | 在役(场景图与七物件点选随营地交互重做列入 Alpha,见下行) | -| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](ux/camp.md)+[需求澄清](../../reports/需求澄清-营地交互重做-2026-10-18.md) | 部分在役(卡①②③ 已随迭代 33 实装合回,2026-10-22;卡④营地场景图美术设计已闭合(样张过审 2026-10-31)、v3.0 现行有效卡重立,与卡⑤ Esc 浮窗同编迭代 47(待开工)。2026-10-21 用户裁:五卡整体列入 Alpha。出口=五卡各自验收标准通过+营地屏用户目检通过) | +| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](ux/camp.md) | 在役(迭代 47 卡④⑤ 落地——场景图+七物件点选+Esc 浮窗与顶栏,2026-11-01 合回) | +| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](ux/camp.md) | 在役(五卡全部落地——卡①②③ 迭代 33 批合回、卡④⑤ 迭代 47 批合回,卡⑥ 句柄子容器为同批前置基建卡。设计过程件已按吸收即死退役,沿革查 git 提交史。2026-10-21 用户裁:五卡整体列入 Alpha。出口=五卡各自验收标准通过+营地屏用户目检〔登记体验验证清单 ㊺〕) | | 生涯页 | [生涯](systems/跨局循环/生涯.md) | 在役(期一) | | 关卡地图屏 | [level-map](ux/level-map.md) | 在役 | | 战斗屏 | [battle](ux/battle.md) | 在役 | @@ -190,7 +190,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战 | 遗物式构筑协同 | [05-不做清单](05-不做清单.md) | | 战后自动回复 | [05-不做清单](05-不做清单.md) | | 反雪球机制 | [05-不做清单](05-不做清单.md) | -| 键盘 / 手柄输入 | [待办清单](../../待办清单.md)(排期归 Beta) | +| 键盘 / 手柄输入 | [待办清单](../../待办清单.md)(排期归 Beta。例外:营地语境 Esc 浮窗已落地〔迭代 47 卡⑤,用户明示裁决〕;键盘面其余仍排 Beta) | | 数值统一标定(M4 数值批) | 2026-10-09 里程碑立规:M4 = Beta 阶段、M3 未由用户明令关闭前不排期(用户 2026-10-07 令移出迭代 18;2026-10-16 确认此裁长期有效)——待办清单各条「已编入 Alpha 收官 M4」措辞系旧口径残留 | | 连刷 / 换图资金跨战斗携带 | [05-不做清单](05-不做清单.md) | | 战斗节点地图类型差异化(更多地图主题) | 排 Beta 版本([playnote](../../playnote.md),2026-10-13 裁) | diff --git a/design/gdd/systems/跨局循环/生涯.md b/design/gdd/systems/跨局循环/生涯.md index e4e39b6d..b8810734 100644 --- a/design/gdd/systems/跨局循环/生涯.md +++ b/design/gdd/systems/跨局循环/生涯.md @@ -1,7 +1,7 @@ # 生涯 > **一句话定位**:营地里与三柜台平级的**局外只读界面**——营地管「花」(花钥石买永久强化),生涯管「看」(看自己跨局攒下的一切:累计战绩、历史冒险、图鉴收集)。冒险进行中不给任何数据回看(2026-10-04 用户裁决 P-C7 的延续),生涯是历史数据唯一的家。 -> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已随迭代 33 卡② 三入口化换代、营地里经笔记本接入归迭代 34 卡④(信息架构节 v1.1,2026-10-22 反哺写入)。现行为 v1.3。 +> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已随迭代 33 卡② 三入口化换代、营地里经笔记本接入归迭代 34 卡④(信息架构节 v1.1,2026-10-22 反哺写入)。现行为 v1.4。 > **来源**:[待办清单「『生涯』界面——冒险中数据回看的唯一承接处」条](../../../../待办清单.md)(2026-10-04 用户裁决 P-C7——冒险中不给数据回看,历史战报与结算明细的查看去向 = 新「生涯」界面)。 ## 一、信息架构 @@ -69,7 +69,7 @@ | 界面 | 管什么(现状指证) | 与生涯的边界 | |---|---|---| -| 营地([camp UX spec](../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树)+ 底栏「最近冒险」条带——营地底栏把摘要逐局拼行(行模板「完成/放弃/失败 · 通关 N 关 · 钥石 +N · 种子 N」)、无截断上限,数据源与生涯历史回看同属一份最近摘要 | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带的去留是本提纲必答项——见 §五 P6 | +| 营地([camp UX spec](../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树——2026-11-01 迭代 47 卡④ 起为营地场景图+五功能窗口形态);原底栏「最近冒险」条带已随同批撤下(P6 甲提前落地),逐局历史回看唯一归生涯 | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带已撤(P6 甲——随迭代 47 卡④ 执行) | | 状态面板(迭代 17 卡③,并行批开发中) | **局内**只读查看这一局进行中的钥石与本局冒险进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) | | 结算屏([settlement-summary UX spec](../../ux/settlement-summary.md)) | 冒险收束当下的入账明细——冒险收束时由结算屏呈现入账明细与钥石明细(复用终局面账行的呈现形态) | 收束当下的呈现保留不动;生涯承接的是收束之后的任意时刻回看 | | 帮助手册(Beta 批,未实装——教学内容归 Beta 帮助手册) | 讲「怎么玩」 | 生涯讲「我玩过什么」。图鉴条目文案与手册是否共用内容源,接口登记归 Beta 批一并裁 | @@ -82,7 +82,7 @@ | 期 | 内容 | 前置 | 建议窗口(候选) | |---|---|---|---| | 期一 | 跨局汇总页 + 主菜单生涯入口落位。总局数/通关局数两个终身计数域随该批做存档 schema 迁移——**✅ 已实装(2026-10-07 迭代 18 卡④)**:汇总段六类九项+营地与系统组生涯钮+存档 v6 两终身计数域〔v5 升 v6 幂等迁移〕;闸读数与代拍板追认单原记于该批出口报告,该件已按「吸收即死」删除,读数以本行与该批提交信息为准 | 提纲评审通过。实装批前置义务 = 对齐迭代 16 UI 批后的现行基线:字号六档 / 语义色 / 按钮最小高 40 点等现行界面基线 / 色板单源 / 页面壳的模态栈纪律——与卡③需求卡片同款红线,本文只登记、不展开 | Alpha 后最近一个 UI 窗口 | -| 期二 | 历史冒险回看整段:N 扩容 + 用时埋点 + 旧档摘要迁移 + 逐局列表 + 单局明细(遗留明细界面复活承接)+ 营地条带处置(P6 裁案落地) | 期一。实装批开工前须向用户呈报两件:N 终值读数(20 / 50 / 维持 10 三选一)与「用时」埋点口径(计时起点、暂停是否计入——字段级细节本文不做) | 期一落地后独立批 | +| 期二 | 历史冒险回看整段:N 扩容 + 用时埋点 + 旧档摘要迁移 + 逐局列表 + 单局明细(遗留明细界面复活承接)——营地条带处置已随 P6 甲提前落地(2026-11-01 迭代 47 卡④ 撤下),期二无残留条带义务 | 期一。实装批开工前须向用户呈报两件:N 终值读数(20 / 50 / 维持 10 三选一)与「用时」埋点口径(计时起点、暂停是否计入——字段级细节本文不做) | 期一落地后独立批 | | 期三 | 图鉴承接(敌人优先,范围与顺序随 P3 甲);「见过」记账面 schema 义务随该批执行 | 期二或独立评估 | Beta 窗口候选(与教学引导同段评估——图鉴的「认得」轴与教学相关;待办清单教学引导节各条 2026-10-04 起已整体标 Beta 阶段) | 本地化文案权:生涯界面本体按钮、页签、空态文案归[设置与本地化](../表现与支撑/设置与本地化.md)线(全仓无多语言实装;文案权先例 = 教学文案定稿权登记于待办清单),实装批承接。 @@ -91,9 +91,10 @@ P0-P5 六点已于 2026-10-06 用户全裁(案甲 × 6,备选案与淘汰依据在需求卡片 §8),结论已写入上文对应节,不重复列。本批新发现的待裁点一项: -### P6 · 营地底栏「最近冒险」条带去留(期二必答项) +### P6 · 营地底栏「最近冒险」条带去留(已裁甲案并落地——2026-11-01 迭代 47 卡④) **现状与问题**:营地底栏「最近冒险」条带把摘要逐行全部拼进同一个标签(行模板「完成/放弃/失败 · 通关 N 关 · 钥石 +N · 种子 N」,无截断上限),数据源与生涯历史回看同属一份最近摘要。生涯期二把上限扩到 N 后,条带按现行逻辑会把 N 行全拼进底栏——这是本批复核发现的实际耦合点,期二落地时必须给条带一个去处。 +**裁决与执行**:用户裁甲案(2026-11-01,随迭代 47 卡④ 四柜台拆解执行)——条带已撤下、逐局历史回看唯一归生涯;期二生涯历史回看批的条带处置义务随之清空。 | 案 | 内容 | 淘汰/保留依据 | |---|---|---| diff --git a/design/gdd/ux/camp.md b/design/gdd/ux/camp.md index 72170a73..4a0995b8 100644 --- a/design/gdd/ux/camp.md +++ b/design/gdd/ux/camp.md @@ -1,6 +1,6 @@ # 营地场景 UX spec(camp) -> 状态:v2.3(现行) +> 状态:v2.4(现行) > 事实源:本 spec(呈现)+ [元进度](../systems/跨局循环/元进度.md)(机制) > 美术画法:[art-bible](../../art/art-bible.md) §6.2/§7.5;素材命名与路径:[asset-path-map](../../art/asset-path-map.md) > 相邻:[level-map.md](level-map.md)(主菜单语境) @@ -28,7 +28,7 @@ **中景带自画面底部往上约 2/3 处起**;近景物件允许压住围墙(围墙不可点,z 序在近景物件之下),**唯一例外=中间门洞必须留空、不被任何物件遮挡**。围墙形态、门扇比例与帐篷尺寸的现行口径归 [art-bible](../../art/art-bible.md) §6.2,本 spec 不再复述。 -坐标草案与分层验收判据见 [camp-scene-prompts](../../art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源);2026-10-22 美术方案讨论留痕见 [提案](../../../reports/提案-营地场景图美术生成方案-2026-10-22.md)。 +坐标草案与分层验收判据见 [camp-scene-prompts](../../art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源);2026-10-22 美术方案讨论沿革查 git 提交史。 ## 点选反馈(根态) @@ -38,11 +38,11 @@ ## 顶栏 -钥石余额常驻画面顶部一行小 HUD 栏(高 48px、全宽窄条、**浮层覆盖在场景图上层,不挤压画面**)。刷新入口=营地刷新单口(卡⑤同口挂接)。 +钥石余额常驻画面顶部一行小 HUD 栏(高 48px、全宽窄条、**浮层覆盖在场景图上层,不挤压画面**)。刷新入口已实装=营地刷新单口(2026-11-01 迭代 47 卡④⑤:进档与营地内写口尾触发,现开界面与顶栏余额同步取现值)。 ## 叠层与开合 -各界面开合走模态栈单口,层序按模态栈契约登记。**承载形态已定稿(2026-11-01 用户裁)**:五个功能界面(锻造工坊/秘宝匣/天赋树/奖励格图鉴/生涯记录)各以**功能窗口**打开——场景根留底可见,窗口之下垫半透明压暗遮罩(交互聚焦用,复用既有模态遮罩件,现值锚黑色 0.6;观感随样张目检校准,属普通设计决策)。**五窗互斥单开**(模态栈深恒 1,不开窗叠窗);各窗自带关闭钮(卡④ v1.1 承诺面)。ESC 优先序:有功能窗口开着 → 先关最上层窗;无窗 → 才进卡⑤ ESC 浮窗(返回主菜单/设置/退出游戏)。 +各界面开合走模态栈单口,层序按模态栈契约登记。**承载形态已定稿(2026-11-01 用户裁)**:五个功能界面(锻造工坊/秘宝匣/天赋树/奖励格图鉴/生涯记录)各以**功能窗口**打开——场景根留底可见,窗口之下垫半透明压暗遮罩(交互聚焦用,复用既有模态遮罩件,现值锚黑色 0.6;观感随样张目检校准,属普通设计决策)。**五窗互斥单开**(模态栈深恒 1,不开窗叠窗);各窗自带关闭钮。ESC 优先序:有功能窗口开着 → 先关最上层窗;无窗 → 才进 ESC 浮窗(返回主菜单/设置/退出游戏)。 ## 口径 diff --git a/game/tests/README.md b/game/tests/README.md index a6e8689a..6fef180b 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -141,11 +141,11 @@ tests/ | 战斗叙述与终局文案(数值带入/胜负互异) | HUD框架 | `BattleNarrator.battle_end_text()`/`BattleNarrator.boss_name()` | `battle_narrator_test.gd:_test_numeric_lines_carry_values`;`battle_narrator_test.gd:_test_end_text_differs_by_result`;`battle_narrator_test.gd:_test_boss_name_uses_boss_rowset` | | 玩家面文案与危险格格面字形 | HUD框架 | `BoardView.rebuild()`/`StatusSlotRow.set_effects()` | `player_copy_sweep_test.gd:_sweep_board_glyph`;`player_copy_sweep_test.gd:_sweep_legend`;`player_copy_sweep_test.gd:_sweep_hero_panel` | | 营地场景图十层铺底与门洞留空呈现 | 营地场景视图 | 进入存档→选档→进档→营地场景屏(`CampSceneView.setup_layers()` 驱动);单元测试载入 `camp_scene_layout.tres` | `shot_probe.gd:_ready`(camp 截图段)〔营地图批 V1〕;`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`〔营地图批 V14〕 | -| 营地七物件命中区点选与分界面可达 | 营地场景视图 | 七物件命中区 `_gui_input()` → `CampSceneView.object_pressed()` → 组合根开界面 | `ui_click_probe.gd:_ready`(七物件合成点击段)〔营地图批 V2〕 | -| 营地大门两分支确认与断点续玩接线 | 营地交互流 | 大门命中区 → ConfirmDialog(三出口)→ `main._on_confirm_new_adventure()`/`_resume_from_menu()` | `ui_click_probe.gd:_ready`(大门两分支段/断点确认段 :500-528)〔营地图批 V3〕 | -| 四柜台拆解后五界面入口改挂与写口零回归 | 营地五界面 | 五界面意图信号 → `CampShopPresenter` → `MetaProgression.tree_buy()` 写口 | `forge_workbench_test.gd:_test_forge_rows`〔营地图批 V4〕;`ui_click_probe.gd:_ready`(写口链段) | +| 营地七物件命中区点选与分界面可达 | 营地场景视图 | 七物件命中区 → `CampSceneView._gui_input()`(命中发 `object_pressed` 信号) → 组合根开界面 | `ui_click_probe.gd:_ready`(七物件合成点击段)〔营地图批 V2〕 | +| 营地大门两分支确认与断点续玩接线 | 营地交互流 | 大门命中区 → ConfirmDialog(三出口)→ `main._on_confirm_accepted()`(新冒险确认)/`main._resume_from_menu()`(断点续玩) | `ui_click_probe.gd:_ready`(大门两分支段/断点确认段 :500-528)〔营地图批 V3〕 | +| 四柜台拆解后五界面入口改挂与写口零回归 | 营地五界面 | 五界面意图信号 → `CampShopPresenter` → `MetaProgression.tree_buy()` 写口 | `forge_workbench_test.gd:_run`(承载类同迁断言十二项)〔营地图批 V4〕;`ui_click_probe.gd:_ready`(写口链段) | | 营地篝火回主菜单与笔记本改挂动线 | 营地交互流 | 笔记本命中区 → `CareerOverlay.open()`;篝火命中区 → ConfirmDialog 二次确认 → 主菜单 | `ui_struct_probe.gd:_ready`(career 段)〔营地图批 V5〕;`screen_flow_probe.gd:_ready`(篝火/开合段)〔营地图批 V7〕 | -| 营地图鉴占位挂起态与反参照结构纪律 | 营地场景视图 | 布告板命中区 → `CampSceneView.object_pressed()` → 图鉴占位视图;营地根态场景树审计 | `ui_struct_probe.gd:_ready`(占位禁词/禁行段)〔营地图批 V6〕;`ui_struct_probe.gd:_ready`(结构禁词段)〔营地图批 V9〕 | +| 营地图鉴占位挂起态与反参照结构纪律 | 营地场景视图 | 布告板命中区 → `CampSceneView._gui_input()`(object_pressed 信号) → 图鉴占位视图;营地根态场景树审计 | `ui_struct_probe.gd:_ready`(占位禁词/禁行段)〔营地图批 V6〕;`ui_struct_probe.gd:_ready`(结构禁词段)〔营地图批 V9〕 | | 营地刷新单口与场景根 HUD 同步 | 营地刷新总线 | 写口尾 → `CampRefreshBus.refresh()` → 现开界面刷新+场景根 HUD 刷新 | `ui_struct_probe.gd:_ready`(顶栏位段)〔营地图批 V8〕;`ui_click_probe.gd:_ready`(写口尾刷新段) | | Esc 浮窗唤起与三出口动线 | 营地 Esc 流 | 营地场景根态合成 Esc 键事件→ `main_esc_flow.on_esc_input()` → `ui.modals.flow.open/close`;浮窗三钮 `pressed` → 三出口 | `screen_flow_probe.gd:_ready`(Esc 唤起/子界面开态不唤起/再按关窗/非营地不唤起段)〔ESC批 V1〕;`screen_flow_probe.gd:_ready`(返回动线/设置双路径段)〔ESC批 V3/V4〕 | | 营地顶栏 HUD 钥石读数与刷新单口同步 | 营地 HUD 栏 | 隔离存档实例 `meta_state._add_keystone()`→ 显式触发 `CampRefreshBus.refresh(camp_data)` → `camp_hud_band.refresh()` → `keystone_badge` 读数 | `screen_flow_probe.gd:_ready`(HUD 余额读数/刷新段)〔ESC批 V6〕;`ui_struct_probe.gd:_ready`(顶栏位结构段) | diff --git a/reports/iter47-反哺点-2026-11-01.md b/reports/iter47-反哺点-2026-11-01.md deleted file mode 100644 index c2152102..00000000 --- a/reports/iter47-反哺点-2026-11-01.md +++ /dev/null @@ -1,19 +0,0 @@ -# 迭代 47 反哺点清单(实现批未写 design/ 与根规则文件——逐条待用户裁决后由文档批落文) - -- 接收方:待办清单「营地交互重做·五张需求卡片」条目(裁决后逐条清掉)+各 owner 文档 -- 依据:卡⑥/卡④/卡⑤ §5 关联文档同步面全表义务格=反哺点·列清单 - -| # | 文档 | 位置 | 原句/现状 | 拟改 | 依据 | -|---|---|---|---|---|---| -| 1 | architecture.md | 呈现层模块清单/测试与质量域 | 无 UiCampModals/四子界面/CampRefreshBus/MainEscFlow/CampHudBand/CampSceneView 六新件行 | 增六件归属行(呈现层/组合根拆件)+LAYER_CONTRACT 槽变化(camp_overlay→camp_scene+四子界面+camp_esc_overlay)+产品码首个键盘输入入口(main._unhandled_input 契约 9 接线)注记 | 卡⑥/④/⑤ 落地实况 | -| 2 | camp.md | §顶栏 :39-41 / §叠层与开合 :43-45 | 「刷新入口=营地刷新单口(卡⑤同口挂接)」未记实装;承载形态「归卡④ §9 代拍板域,本 spec 不预设值」 | 回填实装状态(单口=CampRefreshBus 已挂/时机清单三条)+承载形态=单一内页切换(场景根留底)拍板值落文 | 卡④ T2/T3+卡⑤ 实装 | -| 3 | art-bible.md | §6.2 :393 围墙细条句 / §4.1 场景环境子板 | 「围墙层落盘按细条 (0,240,1280,70) 裁」;环境子板色值待登记 | 细条句补实装值 (0,261,1280,49)(Y 压缩桩身 43 锁定值精确,备选 A′ 在档);登记营地 32 色主色板(色值清单=artwork/2026-11-01-营地终稿后处理/换算式登记.txt,两道门合规零违例对) | 卡④ T1 实测+§0.3-3⑤ | -| 4 | camp-scene-prompts.md | §2.3 坐标表 / §4 验收 | 贴图矩形=规划值(130×140 等);单张 ≤32 量化后 | 八物件 contain 实测尺寸表(board 130×121 等——呈报备案追认值)+量化实况注记 | 卡④ T1 换算式登记 | -| 5 | 生涯.md | :72 营地行(P6 条带去向) | 「营地条带的去留是本提纲必答项——见 §五 P6」 | P6 注销(Q4=甲:条带随四柜台拆解撤下,逐局历史回看归生涯——本批已撤) | 卡④ Q4 裁定落地 | -| 6 | 08-Alpha版本标准.md | :193 「键盘 / 手柄输入(排 Beta)」 | Beta 行未注记 Esc 已落地 | 行内加注「例外:营地语境 Esc 浮窗已落地(用户明示裁决,澄清⑤裁决 9;键盘面仍排 Beta——本批只落 Esc 一项)」 | 卡⑤ 契约 2/9 | -| 7 | 待办清单.md | 营地交互重做条+UI 贴图重构条+图鉴挂起 | 条目状态「已编迭代 47」;贴图重构条对象注记;图鉴挂起 | 状态推进(完成即整条删除)+实况换代(三卡收口凭据);贴图重构条「四柜台对象变化」注记更新(柜台形态已退役);图鉴挂起条入口改挂注记 | 三卡实装 | -| 8 | 体验验证清单.md | 新增目检条 | — | 登记 §实现报告 §6 五条(场景观感/点选反馈/大门篝火/Esc HUD/四子界面)——登记不阻塞 | 卡④ V11+卡⑤ V9 | -| 9 | roadmap.md | 迭代 47 行+当前位 | 状态「待开工」 | 行换代(三卡实现报告列+状态)+当前位三行换代 | 迭代收口 | -| 10 | shot_checker 色数判据 | tools/shot_checker.py A 段 | camp 屏唯一色数 ≥64 | L3 呈报在案(读法 A/B 待裁)——裁决后判据修正随批+待办清单登记条 | 停机呈报 2026-11-01 | -| 11 | asset-path-map.md §3 / art-assets-checklist.md §3.5 | 营地 10 张路径行 | 登记超前注记 | 实装入库确认(scene_camp_* 十件在役+TEX_CAMP_* 十键消费)+终稿置换待用户游戏内终审注记 | 卡④ T1 | -| 12 | ui_kit CAMP_HEADER_BAND 令牌 | ui_kit.gd :178 邻域+ui_contrast 表 | 令牌在役(营地域柜台头带消费随形态退役) | 令牌退役评估(消费面仅剩 keystone_badge 工厂与关卡屏/商店——营地域测点对已注销;随令牌批处置,非本批强删;审计记档 2 订正) | 卡④ T5 核签+审计记档 | diff --git a/reports/iter47-实现报告-2026-11-01.md b/reports/iter47-实现报告-2026-11-01.md deleted file mode 100644 index 57aa6e59..00000000 --- a/reports/iter47-实现报告-2026-11-01.md +++ /dev/null @@ -1,126 +0,0 @@ -# 迭代 47 实现报告(卡⑥ 营地模态句柄子容器批+卡④ 营地场景图新建批+卡⑤ Esc 浮窗与营地顶栏批) - -- 接收方:roadmap.md 迭代 47 行(实现报告列)+待办清单「营地交互重做·五张需求卡片」条目 -- 性质:代码实现批产出物(实现批唯一可写目录=reports/;design/ 与根规则文件零写入——反哺点清单另立) -- 分支:iter47(worktree g-plan2-iter47)· 基线 5ad72f44 · 收口提交史见 §9 - -## 1. 各卡状态 - -| 卡 | 状态 | 提交 | 出口验证 | -|---|---|---|---| -| 卡⑥ 句柄子容器批 | 收口 | 3a9c6ff4 | --code 全套闸 all_green;V1/V2/V3 留痕齐 | -| 卡④ 营地场景图批 | 施工完成(T6 出口闸等 shot_checker 裁决重跑) | aa4aa1dd/4b5e3f27/98470adc/5a0e7069/1243ffe6/52296872 | 七探针+system_test 全绿;V14 11 项绿;--code 闸 01-04/09/10 绿、05 渲染闸红=L3 呈报在案 | -| 卡⑤ Esc 浮窗与顶栏批 | 施工完成(T4 出口闸同上) | 4e4232d8 | 冒烟 PASS+system_test 69/0+七探针全绿 | - -## 2. 卡⑥ 实际改动—验收对照表(尾缀〔句柄子容器批 Vn〕) - -| 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 结果 | -|---|---|---|---|---|---|---| -| V1 句柄迁移零行为漂移 | ui_camp_modals.gd 新件;ui_modals 持 camp 删平铺;main_ui_build 装配 10 处;改指面 8 文件 43 处 | 五探针营地段+system_test V1c:94-106+句柄同一性链 :108 | 探针+系统 | 现役营地断言逐件复跑(断言零改寻址新) | 全段绿=零漂移;全仓 grep 零 modals.camp.overlay 残留 | 绿(V1 尾缀 34 处 grep 在位) | -| V2 层序合同零漂移 | ui_registry node() 返回链改写(key 平铺不改名) | system_test V1c 合同树序链 | 系统 | LAYER_CONTRACT 单一事实源 | 树序链绿=合同落位零漂移 | 绿(V2 尾缀 :106 在位) | -| V3 S13 读数 | ui_modals 类变量 14→14 | gdstyle gate+grep -c '^var ' 计数 | 静态 | static_scan.sh | gate 绿零 NEW+计数=14 留痕(观测面局限:闸对 14/15 同零命中,人工计数承载) | 绿(143 件零 NEW;计数 14) | - -## 3. 卡④ 实际改动—验收对照表(尾缀〔营地图批 Vn/Bn〕) - -| 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 结果 | -|---|---|---|---|---|---|---| -| V1 场景图形态 | camp_scene_view 10 层铺底+layout.tres+camp_screen 改挂 | shot_probe camp 段(截图=场景图)+ui_struct 场景层序段+shot_checker 结构段 | 探针 | 进存档→选档→进档→营地场景屏 | 截图实拍=场景图形态(十层合成/门洞透路/七物件就位);子节点序=表 z 序逐层;贴图矩形逐值 | 绿(截图目检+层序段 11 层断言) | -| V2 七物件可达+叠层退避 | 七命中区+object_pressed+组合根路由 | ui_probe/ui_click/ui_struct 场景点选段 | 探针 | 命中区→_gui_input→object_pressed→路由 | 锻炉/宝箱/木桩/布告板/笔记本/篝火/大门逐一 object_pressed 驱动可见性 | 绿(七件路由断言分散六探针全绿) | -| V3 大门两分支+开局收闭 | confirm_dialog 三钮化+消费方编排扩展+main_overlay_flow 路由 | ui_click 大门两分支段 | 探针 | 场景点选 gate→确认弹窗→分派 | 点大门不直接进冒险(is_adventure 翻转只在 confirmed 后);cancelled 写口零调用+营地根 visible;开局后营地隐藏 | 绿(无断点两出口+有断点三出口 set_breakpoint 注入全过) | -| V4 五界面功能+写口零回归 | 四 view 抽出+presenter 承接面+bus 单口 | forge_workbench_test(承载类同迁断言零改)+ui_click 购买链 | 单元+探针 | 意图信号→presenter→MetaProgression 写口 | 树购买出账+持久(reload 后级=1)/Fork 持久/锻造三意图——全链复跑绿 | 绿(12 项+点击链 0 问题) | -| V5 生涯只读契约 | career 入口改挂笔记本(本体零改) | ui_struct career 段(笔记本真实路由) | 探针 | 笔记本命中→object_pressed→_open_career | 生涯页可达+三契约不破+营地语境关生涯不回开始层 | 绿 | -| V6 图鉴挂起态 | codex_view 占位壳 | ui_click 灰字段(锚=结构位预留) | 探针 | 布告板命中→codex 开 | 占位锁文锚定+零激活禁行+非禁用态 | 绿 | -| V7 篝火动线 | 路由 campfire→二次确认→on_camp_closed | screen_flow 回退段+ui_click? | 探针 | 篝火命中(只下半)→确认→主菜单 | 二次确认 confirmed 先于关层;确认后营地+选档同收+菜单显 | 绿(screen_flow ③步+T4 孤检) | -| V8 顶栏位+刷新单口 | set_hud_band 预留位+camp_refresh_bus 新件 | ui_struct 顶栏位段+卡⑤ HUD 段 | 探针 | 写口尾→bus.refresh→现开界面+HUD | 顶栏位 48px 在座;写口尾一闸刷新(八尾改路由) | 绿 | -| V9 反参照纪律 | 场景根态零按钮 | ui_struct 反参照段 | 探针 | 场景根子树 Button 计数 | 根态零文字按钮(禁文字按钮列表形态) | 绿 | -| V10 美术约束 | shot_checker camp 骨架段+素材二器 | ui_contrast 令牌表+palette_check 读数 | 机检 | camp 截图+素材文件 | 见 §7 遗留读数义务(A 段色数判据=L3 呈报在案) | 部分(令牌 36 对绿;A 段红待裁) | -| V11 目检登记 | 实机目检总清单 | 件核对(§6) | 目检 | 用户实机 | 登记即义务了结(不阻塞) | 已登记(§6) | -| V12 探针迁移留痕 | F8 全量位点 | 件核对(本表+§8 迁移留痕) | 件核对 | 探针 diff 对账 | 逐点改前→改后 | 绿(§8) | -| V13 反哺点清单 | §5 同步面 | 件核对 | 件核对 | 反哺点文档逐条 | 每条有落点 | 绿(反哺点文档) | -| V14 layout 数据件校验 | schema validate+fail-fast 钩子 | camp_scene_layout_test.gd:_test_layout_hotspot_geometry(manifest 登记) | 单元 | 单测载入 .tres+ConfigDB 装载链 | 校验通过+七命中区几何红线+关系谓词零坐标字面量 | 绿(11 项) | -| B1 组合根接线总改造 | main.gd 路由/三钮编排/篝火/收闭+bus | ui_click 大门段+screen_flow 篝火段 | 集成 | 确认分派/_resume/_start/bus.refresh | 三钮消费方编排 open 前设后分派;cancelled 零写口;篝火确认离场 | 绿 | -| B2 CampOverlay 退役+四界面抽出 | overlay 删除+四 view+五句柄子容器 | forge_workbench_test+全仓件核 | 集成 | 五界面 open/close→模态栈单口 | 旧件零残留(件核一);承载类同迁断言零改 | 绿 | - -## 4. 卡⑤ 实际改动—验收对照表(尾缀〔ESC批 Vn/Bn〕) - -| 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 结果 | -|---|---|---|---|---|---|---| -| V1 Esc 唤起四态 | camp_esc_overlay+main_esc_flow+main._unhandled_input | screen_flow Esc 步 | 探针 | push_input 合成 Esc(真实键盘路径) | 根态唤起/再按关窗/echo 零响应/子界面无反馈/设置开态不误关/菜单语境不唤起 | 绿(10 项) | -| V2 浮窗三项 | setup_buttons 三钮 | ui_struct 浮窗段 | 探针 | 浮窗视图实例化 | 三钮在位且仅三(_buttons 递归计数) | 绿 | -| V3 返回主菜单 | _on_return_to_menu(首步 close 浮窗) | screen_flow 返回动线段 | 探针 | return_requested→动线 | 浮窗自收+营地隐+选档收+菜单显(四可见性) | 绿 | -| V4 设置双路径 | _on_settings+语境分支 | screen_flow 设置段 | 探针 | settings_requested→open→closed | 设置开浮窗恒 visible(树序遮挡非属性隐藏);关后回浮窗不回主菜单 | 绿 | -| V5 退出项 | _on_quit→_quit_game 复用 | 连接链断言(main_ui_build 接线在位) | 静态 | quit_requested→_on_esc_quit→_quit_game | headless 不可真退=静态判据+观测面局限申报(本表) | 绿(接线段随装配绿证) | -| V6 HUD 余额 | camp_hud_band+bus 挂册+进档尾刷新 | screen_flow HUD 段 | 探针 | 隔离档直写 _add_keystone(9999)→显式触发 bus.refresh | badge 文本=「钥石 9999」(单口现值,显式触发才变) | 绿 | -| V7 零动效 | 直开直关 | ui_struct 浮窗段 | 探针 | 双件源码+子树扫描 | 零动效令牌+AnimPlayer=0(扫描面>0 非空前置) | 绿 | -| V8 层序与遮挡 | contract 第六槽+node() | system_test V1c 复跑+ui_struct badge 段 | 系统+探针 | 合同表单一事实源 | 树序链含新槽逐对保序;badge 零波及 | 绿 | -| V9 目检登记 | 实机目检总清单 | 件核对(§6) | 目检 | 用户实机 | 登记即义务了结 | 已登记(§6) | -| V10 反哺点清单 | §5 同步面 | 件核对 | 件核对 | 反哺点文档 | 每条有落点 | 绿 | -| B1 Esc 接线与浮窗 | 输入入口/薄委托/视图/新槽 | screen_flow+ui_struct | 集成 | 合成 Esc→路由→flow.open/close | 四态路由绑现开集合与调用记录(ui_struct 大门段 confirm_dialog._secondary_btn 直查申报:三钮化即被测改动本体、两/三出口形态唯一直观观测面、无公开访问器——审计 ⚠️ 项补注) | 绿 | -| B2 HUD 落位与刷新 | band 新建/set_hud_band/bus 挂册 | screen_flow HUD 段+ui_struct 顶栏段 | 集成 | bus.refresh→band.refresh_camp→badge | badge=单口取值;顶栏位结构在座 | 绿 | -| B3 设置语境分支与三出口 | _on_settings_closed 分支+三出口动线 | screen_flow 设置段+返回段 | 集成 | 三钮 pressed→MainEscFlow | 关设置回浮窗禁弹主菜单(反向断言);退出连接链 | 绿 | - -## 5. 实现决定记录(代拍板追认单——随 commit 留痕汇总) - -1. **承载形态=单一内页切换(场景根留底)**(卡④ §9-2 域内):模态栈 open 只隐上方登记层(modal_stack.gd:27 实测),四子界面登记于场景根之上且实底遮挡——双开互斥靠遮挡天然成立;V2 断言按留底派生(子界面开=场景根 visible 保持)。 -2. **围墙层处理路线 A″**(用户裁 A 后处理实现):去底(边界泛洪+奶油描边屏障 BG_TOL=50)→门洞手术(门柱内移+克隆桩列,缺口 675→480 源=240 终稿精确)→Y 轴压缩(桩身 609→86 源=43 终稿锁定值精确,整带 692→98 落盘 (0,261,1280,49) 底锚 y310);备选 A′(带高 70/桩身 62)存档 artwork 同目录。竖向克隆接缝 3× 放大可辨、1× 游戏尺度不可辨(申报)。 -3. **八物件 contain 落位尺寸**(呈报备案追认):board 130×121/gate 240×211/dummy 120×180/forge 240×193/tent 251×170/chest 106×90/notebook 100×66/campfire 160×149(锁定矩形 contain,命中矩形按锁定值);贴图锚定=底中心(帐篷/锻炉/宝箱/篝火/笔记本)+顶锚(门扇悬挂/布告板挂墙)。 -4. **营地主色板 32 色**(§4.1 场景环境子板两道门合规):各层独立量化→并集 272→最近对合并 120 轮→32 色零违例对;十层按终版色板重量化回写。色值清单=换算式登记.txt,登记 art-bible §4.1 走反哺点。 -5. **codex 锁文称谓订正**(L2):「柜台结构位预留」→「结构位预留」(零新文案——『柜台』随形态退役)。 -6. **set_close_path 未落独立方法**(L2 API 面):Q2 关闭路径=组合根 Esc 路由直呼 flow.close(浮窗),视图无自关通路——卡面「关闭由组合根路由」直译;bind_signals 承载三钮意图外发。 -7. **契约 9 分支序实证修正**:①先于②(设置开在浮窗之上态先命中无反馈)——首装②先被 screen_flow Esc 段实机场景证伪(2 红),按卡面编号归位后全绿。 -8. **CampSceneView 初始隐**:_init visible=false(登记模态初始隐——boot 态场景根盖菜单三红同源修复)。 -9. **ui_modals 头注/迁移面**:卡⑥ 头注换代(十二平铺+营地域子容器)✓;ui_struct 层序注释换代(camp_scene 代言)✓。 -10. **卡④ T0 预算预案兑现**:main.gd 15/15 恰贴上限——T3/T4/T5 实现零新增成员(路由走 MainOverlayFlow 静态件+薄委托)✓。 -11. **camp.md v2.3 定稿换代吸收**(2026-11-01 用户裁,后于卡面):①承载形态=五功能窗口·场景根留底+半透明压暗遮罩 0.6(实现初版实底屏——按定稿换装,四子界面壳+生涯页基底同批换);②Esc 有功能窗开着→先关最上层窗(覆盖卡⑤ 契约 9① 的 Q1 甲「子界面开态无反馈」——MainEscFlow ①分支改写,_other_modal_open 退役);③五窗互斥单开(遮罩 STOP 挡场景点击自然成立,零代码)。设置开在浮窗之上仍无反馈(契约 3 保留)。 - -## 6. 实机目检总清单(登记不阻塞——体验验证清单入册条目由文档批落) - -1. 营地场景观感:十层构图/围墙门洞/纵深(V11——纵深稿「中景 2/3」可辨性)。 -2. 七物件辨识与点选反馈:悬停轮廓+浮动+名牌/按下位移/锻炉宝箱禁用态(未解锁档)。 -3. 大门两分支弹窗(三出口文案与位次)+篝火二次确认动线。 -4. Esc 浮窗三动线+HUD 余额观感+浮窗视觉面(卡⑤ V9)。 -5. 四子界面视觉(米板身壳/行板/返回钮位次)。 - -## 7. 遗留读数义务 - -1. **shot_checker A 段色数判据互斥**=L3 呈报在案(reports/停机呈报-shotchecker色数判据互斥-2026-11-01.md)——读法 A/B 待裁;裁决后判据修正随批+闸重跑追绿。 -2. palette_check 读数(V10 素材级):15 张 0 红灯 0 新增色(只读模式)——48 令牌 baseline 目录在库缺位,双门机检化=工程批事项(反哺点登记)。 -3. 用户在游戏内终审十层素材(2026-10-31 裁定预留)——终稿置换(若有)走反哺点。 - -## 8. 探针迁移留痕表(V12——F8 全量位点改前→改后) - -| 位点 | 改前 | 改后 | -|---|---|---| -| screen_flow :54 营地旗标 | modals.camp.overlay | modals.camp.scene | -| screen_flow 回退段 :119-125 | overlay.closed.emit()+手动关选档 | 篝火动线(object_pressed campfire+confirmed) | -| screen_flow Esc 段(新增) | —(选档语境零响应段保留) | 十断言步 _step_camp_esc_and_hud | -| ui_probe 营地段 :26-57 | overlay 余额/树钮/秘宝行 | 场景点选路由→tree/treasure 视图成员 | -| ui_click 营地段 :60-250 | overlay 树链/灰字六源位 | 树链 tree view+灰字分扫 treasure/codex(锚去『柜台』)+savesel 三处场景根 | -| ui_click 断点段(卡② 移交) | lvbtn 驱动(已随卡② 撤) | 大门两分支断言段(V3 落位——无断点/有断点 set_breakpoint 注入) | -| ui_struct :45 audit | audit("camp",[overlay]) | audit("camp",[camp.scene]) | -| ui_struct 源扫描 :48-50 | camp_overlay_view.gd 单件 | 营地域六件合计(场景根+四子界面+公共壳) | -| ui_struct 生涯段 :54-69 | 函数直调 _open_career | 笔记本真实路由(open_camp 重入+object_pressed notebook+营地语境分支断言) | -| ui_struct 场景段(新增) | — | 层序/矩形逐值+锻炉可达+顶栏位+反参照+Esc 浮窗段 | -| ui_contrast 令牌表 :48-55 | 头带两行+铭牌副题+最近冒险 | 四行随形态注销(CAMP_HEADER_BAND 零消费随退);ROW_PLATE/PANEL_DATA 行保留 | -| shot_probe :120-135 | 关闭营地钮收闭 | 截图=场景图+篝火动线收闭 | -| system_test V2/:108/:121 | camp_overlay 成员/句柄 | camp_scene 三处机械随迁(T3) | -| system_test V3g camp 分支 | overlay 开合 | 场景根开合自适配(on_camp_closed 关层收闭) | -| forge_workbench_test :33 | 直载 camp_overlay_view+._forge._X | 直载 forge_view+扁平成员(断言零改 12 项绿) | -| theme_projection :711-716/:801-810 | 等高源码断言+最近冒险投影 | 注销(卡面削弱申报授权——旧形态断言失去对象/条带 Q4 甲撤下) | - -## 9. 提交史与闸况 - -3a9c6ff4 卡⑥T1 → aa4aa1dd 卡④T1 进度 → 4b5e3f27 卡④T2 → 98470adc 卡④T3 → 5a0e7069 卡④T4 → 1243ffe6 卡④T5 → 52296872 卡④T5 补 → 4e4232d8 卡⑤T1-T3。 -闸况:卡⑥ 出口 --code all_green(3a9c6ff4 对齐);卡④ T6 出口闸 01-04/09/10 绿、05 渲染闸红=shot_checker 判据互斥(L3 呈报在案——合回前重跑)。 - -## 10. 独立验收审计结论 - -独立审计报告=reports/iter47-验收审计-2026-11-01.md(未参与实现子代理执行;六条自跑抽查全绿:system_test 69/0、V14 11 项、forge_workbench 12 项、screen_flow 含 Esc 段、static_scan S13 零新增、ui_contrast 36 对)。 - -- 审计算术:对照表 42 行全查(✅33/⚠️8/❌1);判据绑定面重点四项全过;测试削弱=授权 6 件在案、未授权零;直查例外 5 处全有据(1 处补注记)。 -- 缺漏处置回执(实现方,审计处方最窄单元): - 1. 卡⑤ V5 退出项断言缺位→ui_struct Esc 段补静态接线断言(quit_requested 连接表目标=_on_esc_quit+调用链 _on_esc_quit→_on_quit→_quit_game 源扫描)+〔ESC批 V5〕尾缀——孤跑复验绿。 - 2. 尾缀覆盖缺口→V4(购买出账/持久两行)/V6(图鉴锁文两行)补〔营地图批 V4/V6〕;V7 补显式二次确认断言(screen_flow 回退段)+〔营地图批 V7〕;B1/B3 补〔ESC批 B1/B3〕、B2 补〔ESC批 B2〕;卡④ B1/B2 各补一行。V4 的 forge_workbench 部分按审计处方记豁免(断言零改申报约束——补尾缀即违零改)。 - 3. 记档项处置:V7 长度非空守卫已补一行;反哺点 #12 订正(CAMP_HEADER_BAND 消费面仅剩 keystone_badge 工厂等);V9 扫面注记(直接子层非递归——本段更正);confirm_dialog._secondary_btn 直查补申报(三钮化即被测改动本体、两/三出口形态唯一直观观测面、无公开访问器)。 -- 处置后结论:**通过**(缺漏 1 补齐+轻微尾缀补齐+记档 4 项处置;孤跑复验回执见下)。 -- 孤跑复验:ui_struct_probe 退出码 0(含 V5 新断言与 V7 守卫);screen_flow_probe 退出码 0(含 V7 显式断言与 B 尾缀段)。 diff --git a/reports/iter47-验收审计-2026-11-01.md b/reports/iter47-验收审计-2026-11-01.md deleted file mode 100644 index a6257beb..00000000 --- a/reports/iter47-验收审计-2026-11-01.md +++ /dev/null @@ -1,128 +0,0 @@ -# 迭代 47 独立验收审计(卡⑥ 营地模态句柄子容器批+卡④ 营地场景图新建批+卡⑤ Esc 浮窗与营地顶栏批) - -- 接收方:`reports/iter47-实现报告-2026-11-01.md` §10(独立验收审计结论回填行) -- 审计身份:未参与实现的独立审计方——只读三张需求卡、实际对照表、diff、测试件与实现报告,自跑最窄测试抽查,不采信报告「已全绿」 -- 审计对象:worktree `D:\code\g-plan2-iter47`(分支 iter47);diff 范围=基线 5ad72f44..HEAD(65b2a574),重塑后提交=469d856f 卡⑥/2ce70ac7 卡④/399ed3ad 卡⑤/65b2a574 文档收尾(原史在 backup/iter47-20261101-185917,审计只对 master..iter47 净 diff 负责) -- 审计口径:test-conventions §8.7 四件事+卡④ §7/卡⑤ §7「独立验收审计」条;对照表逐行核对(三表全行,非抽样下限)、判据绑定面重点四项、削弱逐处核对、直查例外逐行核对 -- 本审计唯一写入件=本报告(reports/);产品码/测试码零改动 - -## 1. 对照表逐行抽查(实现报告 §2/§3/§4——三表全行) - -判定标记:✅=通过(测试在役+尾缀可 grep+真实入口未绕改动点)/⚠️=通过但附注记/❌=缺漏。 - -### 1.1 卡⑥ §2(3 行全查) - -| 行 | 判定 | 依据 | -|---|---|---| -| V1 句柄迁移零行为漂移 | ✅ | 尾缀〔句柄子容器批 V1〕grep 34 处(六文件逐处);改指面实测 8 文件 43 处 `modals.camp_overlay` 删除位逐一有 `modals.camp.*` 替换行(main_ui_build 10/ui_click 16/ui_probe 8/screen_flow 3/shot_probe 2/system_test 2/ui_struct 1/ui_registry 1——与 F4 清单全等);全仓 grep `camp.overlay` 零命中(探针残留清零核实);句柄同一性链 system_test :109(camp.scene==camp_screen.camp_scene)在役且当轮跑过;ui_camp_modals 六枚实件零空占位(契约 4);camp_overlay_view.gd 整件删除零悬挂 | -| V2 层序合同零漂移 | ✅ | system_test :106 V1c 合同树序链带〔句柄子容器批 V2〕尾缀;ui_registry LAYER_CONTRACT key 平铺(camp_scene/forge_view/…/camp_esc_overlay)+node() 全部经 `modals.camp.*` 二层返回、`camp_overlay` 分支已删;ui_struct `_modal_registry_contract` 登记册逐点名含新槽 | -| V3 S13 读数 | ✅ | `grep -c '^var '` ui_modals.gd=14(审计人工复核与报告留痕一致);ui_camp_modals.gd=6;static_scan gdstyle 闸绿(基线外新违规 0)——卡面「观测面局限申报」(闸对 14/15 同零命中)如实 | - -### 1.2 卡④ §3(16 行全查) - -| 行 | 判定 | 依据 | -|---|---|---| -| V1 场景图形态 | ✅ | ui_struct :58-70 层序段(子节点序==layout 表 z 序逐层+各层贴图矩形逐值)带〔营地图批 V1〕;shot_probe camp 段截图改场景图+收闭改篝火动线(真实入口=进存档→选档→进档) | -| V2 七物件可达+叠层退避 | ⚠️ | 七件逐一驱动核实:forge(ui_struct :71-74)/dummy→tree(ui_probe)/chest→treasure(ui_probe)/notebook(ui_struct :95-98)/board→codex(ui_click :174)/gate(ui_click :688)/campfire(screen_flow :124)——驱动形态全为 `object_pressed.emit()` 信号发射(卡面 V2 判据绑定面明文「绑 object_pressed 信号发射面」,信号即视图公开提交面,合规);注记:`_gui_input` 命中判定段(topmost/press-release 同区/禁用过滤)无合成鼠标点击断言面——新件内部路径无旧断言被绕,判据按卡面钉信号面成立 | -| V3 大门两分支+开局收闭 | ✅ | ui_click :679-722 大门两分支段七断言全带〔营地图批 V3〕——真实路由(object_pressed gate→组合根分派→ConfirmDialog);无断点两出口(次钮隐藏);cancelled 恒无变更(余额读数恒等+营地根 visible+is_adventure 恒假=写口零调用);confirmed 后 is_adventure 翻转+营地隐;有断点三出口(次钮现形)+secondary_confirmed 出口 | -| V4 五界面功能+写口零回归 | ⚠️ | forge_workbench_test 承载类同迁(diff 逐 hunk 核实:仅 load 目标 camp_overlay_view→forge_view+`_forge.` 前缀扁平化,断言判据零改)实跑 12 项绿;ui_click 树购买链(出账/持久/Fork 切态持久)在役;注记:无〔营地图批 V4〕尾缀(见 §6 缺漏 2)——tree/fork 链断言带〔句柄子容器批 V1〕尾缀(卡⑥ 波先行改指所留) | -| V5 生涯只读契约 | ✅ | ui_struct :89-106 笔记本真实路由(object_pressed notebook→_open_career)+三契约(只读巡检/零动效/零跳转)复跑+营地语境关生涯不回开始层双向断言;〔营地图批 V5〕尾缀两处在位 | -| V6 图鉴挂起态 | ⚠️ | ui_click :174-183 布告板→codex 开+锁文「结构位预留」锚定+STONE_DEEP 取色——在役实跑;注记:无〔营地图批 V6〕尾缀(尾缀=〔句柄子容器批 V1〕);「零激活禁行+非禁用态」判据中非禁用态由 codex 可开承载、零激活无独立断言面(占位壳本无内容可钉——新断言绑不上属卡面「静态判据+注记申报」情形,报告未单列注记) | -| V7 篝火动线 | ⚠️ | screen_flow :117-127 回退段(object_pressed campfire→confirmed→屏级互斥复归菜单)+shot_probe 收闭改接同动线——在役实跑;注记:无〔营地图批 V7〕尾缀(=〔句柄子容器批 V1〕,同 V4 成因) | -| V8 顶栏位+刷新单口 | ✅ | ui_struct :75-77 HudBandSlot 结构断言(48px)带〔营地图批 V8〕;camp_refresh_bus 新件+presenter 八写口尾全改路由(diff 逐处核实 8 处 refresh_bus.refresh);on_camp_attune_toggle 口尾保持只刷不调 _refresh_presentations(契约 4「禁顺手统一」核实);bus 目标册=四子界面+HUD 栏(main_ui_build 装配) | -| V9 反参照纪律 | ⚠️ | ui_struct :78-83 场景根零 Button 断言带〔营地图批 V9〕;注记:扫面=get_children 直接子层非递归(报告称「子树」)——HudBandSlot 在扫面内,嵌套 Button 不计(新断言范围注记,见 §6 记档 4) | -| V10 美术约束 | ✅(如实「部分」) | ui_contrast 令牌段审计自跑绿(36 对测点全绿,与报告读数一致);A 段色数判据互斥红=L3 呈报在案(§6 记档 1)——报告「部分」判定诚实 | -| V11 目检登记 | ✅ | 实现报告 §6 五条目检清单在案(登记不阻塞) | -| V12 探针迁移留痕 | ✅ | 报告 §8 迁移表与 diff 逐位点对上(审计抽样七个位点全核实) | -| V13 反哺点清单 | ✅ | reports/iter47-反哺点-2026-11-01.md 12 条逐条有落点(注:#12 事实性偏差见 §6 记档 2) | -| V14 layout 数据件校验 | ✅ | camp_scene_layout_test.gd 11 断言实跑全绿(详见 §2);manifest 已登记 run_all.gd(+1 行) | -| B1 组合根接线总改造 | ⚠️ | main.gd/main_overlay_flow/confirm_dialog 三钮编排与篝火动线 diff 全核实(gate/gate_new/campfire_leave 三消费方+cancelled 零写口);判据承载=V3 断言+screen_flow 回退段;注记:无〔营地图批 B1〕尾缀 | -| B2 CampOverlay 退役+四界面抽出 | ✅ | camp_overlay_view.gd 整件删除(655 行)+四 view+camp_sub_view_base 抽出、全仓零残留(S12 旧件零残留闸绿+grep 核实);承载迁移断言零改实跑绿 | - -### 1.3 卡⑤ §4(13 行全查) - -| 行 | 判定 | 依据 | -|---|---|---| -| V1 Esc 唤起四态 | ✅ | screen_flow `_step_camp_esc_and_hud` 十断言全带〔ESC批 V1〕——push_input 真实键盘合成路径(非直呼 on_esc_input)、根态唤起/再按关窗/echo 零响应/子界面开态无反馈/设置开态不误关/关设置回浮窗/boot 菜单不唤起;ui_struct Esc 结构段另证唤起与再按关窗 | -| V2 浮窗三项 | ✅ | ui_struct :124-126 `_buttons` 递归计数恰三带〔ESC批 V2〕;camp_esc_overlay 三钮+danger_button 源码核实 | -| V3 返回主菜单 | ✅ | screen_flow :284-287 return_requested 真实信号→四可见性断言(浮窗自收/营地隐/选档收/菜单显)带〔ESC批 V3〕 | -| V4 设置双路径 | ✅ | screen_flow :270-283 设置开→浮窗恒 visible(遮挡非属性隐藏)+关→回浮窗+start_overlay 恒假反向断言带〔ESC批 V4〕;语境分支谓词=camp_esc_overlay.visible(main_overlay_flow diff 核实,与契约 3 一致) | -| V5 退出项 | ❌ | **缺漏 1(详见 §6)**——卡面验收测试=「ui_struct_probe 退出钮接线结构断言〔ESC批 V5〕」,全仓 grep 零该断言;报告改称「连接链断言(main_ui_build 接线在位)/静态判据」但静态断言未落码 | -| V6 HUD 余额 | ✅ | screen_flow :263-267 隔离档直写 _add_keystone(9999)→显式触发 refresh_bus.refresh→badge 文本「钥石 9999」带〔ESC批 V6〕——单口取值+显式触发才变(契约 5 时机③) | -| V7 零动效 | ⚠️ | ui_struct :127-132 双件源码令牌扫描+子树 AnimationPlayer 计数带〔ESC批 V7〕;注记:源码扫描无长度非空守卫(报告称「扫描面>0 非空前置」名实差——见 §6 记档 3) | -| V8 层序与遮挡 | ✅ | 登记册逐点名(_modal_registry_contract)+system_test V1c 树序链含 camp_esc_overlay 新槽+badge 零波及断言带〔ESC批 V8〕;LAYER_CONTRACT 槽位=codex_view 与 settings_overlay 之间(契约 3 栈语义正解核实) | -| V9 目检登记 | ✅ | 实现报告 §6 第 4 条在案 | -| V10 反哺点清单 | ✅ | 反哺点清单 #6/#8/#1 在案有落点 | -| B1 Esc 接线与浮窗 | ⚠️ | main._unhandled_input(KEY_ESCAPE+physical+pressed 非 echo)→MainEscFlow 四态路由 diff 全核实、判据单点=登记册现开集合;判据承载=V1/V2/V7/V8 断言;注记:无〔ESC批 B1〕尾缀 | -| B2 HUD 落位与刷新 | ⚠️ | camp_hud_band 新件/set_hud_band 填值/bus 挂册 diff 全核实;判据承载=V6 断言;注记:无〔ESC批 B2〕尾缀 | -| B3 设置语境分支与三出口 | ⚠️ | main_esc_flow 三出口+main_overlay_flow 语境分支 diff 全核实;判据承载=V3/V4 断言;注记:无〔ESC批 B3〕尾缀 | - -## 2. 判据绑定面抽查(重点四项+一般项) - -| 抽查项 | 判定 | 核实内容 | -|---|---|---| -| 卡④ V14(11 断言) | ✅ | 实跑 11 项全 PASS;断言全部为表内关系谓词——两两不相交(Rect2.intersects)、不越画面/不侵顶栏(y≥hud_band_h 表字段)、篝火只取下半(命中贴贴图底且严格小于贴图)、门扇对齐 gate_gap 表字段、布告板挂围墙带(与 wall 贴图带关系谓词)、层数=10+bg/wall 占 z0/z1、ConfigDB 装载链(load_tables fail-fast 钩子+is_ready);**零坐标字面量**核实(唯一常量=七键名与层数 10,非坐标;(520,760) 等值全部取自表字段输出) | -| 卡④ V3(大门两分支段) | ✅ | 七断言从真实路由进入(object_pressed gate 信号=卡面钉定发射面);cancelled 写口零调用以「余额读数恒等+营地根 visible+is_adventure 恒假」三重可观测面钉死;confirmed 后 is_adventure 翻转+营地隐;三出口经 set_breakpoint 注入(同开场行③先例,非伪造红——注入的是前置数据非破坏断言) | -| 卡⑤ V1(Esc 步) | ✅ | push_input(ev, true) 真实键盘合成路径(不更新 Input 单例动作态——与契约 9 禁轮询互证);echo=true 合成零响应;设置开态再按 Esc 浮窗不误关(契约 9① 先于②的分支序);关设置回浮窗+禁弹主菜单反向断言;boot 菜单语境不唤起(契约 9④) | -| 卡⑥ V3(计数=14) | ✅ | 审计人工 grep 计数=14 与报告留痕一致;闸面(gdstyle 零 NEW)自跑绿;卡面观测面局限申报如实 | -| 一般:V2 七物件分布 | ✅ | 六探针分散驱动逐一核实(§1.2 V2 行) | -| 一般:卡⑤ V2/V7/V8 | ✅/⚠️ | 三钮恰三/零动效/登记序——V7 非空前置注记(§6 记档 3) | -| 加跑:ui_contrast 探针 | ✅ | 审计自跑 PASS「36 对测点全绿」——与报告 V10「令牌 36 对绿」读数一致 | - -## 3. 测试削弱核对(diff 全量删改断言逐处对卡) - -**授权项清单(卡面在案,核对通过)**: - -| # | 削弱处 | 授权依据 | 核实 | -|---|---|---|---| -| 1 | theme_projection_test 等高源码断言 3 条注销(min 高 336/SIZE_FILL×4/SHRINK_CENTER≥3) | 卡④ §7 削弱申报表行 1+F8 位点(:710-717,CampOverlay 四柜台形态退役断言失去对象) | ✅ | -| 2 | theme_projection_test `_camp_recent_projection` 最近冒险投影段注销 | 卡④ §10 Q4=甲(2026-10-18 用户裁:最近冒险条带随四柜台拆解撤下)+F13——申报表未单列成行,报告 §8 迁移表已归并申报(「卡面削弱申报授权」句);授权链=卡面用户裁定,认 | ✅(注记:申报落点在 Q4+§8,非削弱表独立行) | -| 3 | ui_contrast 四行注销(头带两行/铭牌副题/最近冒险行,43→39 对) | 卡④ §7 削弱申报表行 2「核签后段留或随注销」——核签事实:CAMP_HEADER_BAND 新营地域界面零消费(grep 核实,新界面只消费 ROW_PLATE/PANEL_DATA)、最近冒险行随 Q4 撤 | ✅ | -| 4 | ui_click 断点确认段改走大门(卡② 移交接收) | 申报表行 3 | ✅(V3 落位) | -| 5 | ui_probe 深员改指/screen_flow 营地键与回退段改指/shot_probe 收闭段改篝火/生涯段驱动改接 | 申报表行 4/5/6/7 | ✅(diff 逐处核实为改指非删除) | -| 6 | forge_workbench_test 承载类同迁 | 申报表行 8「断言零改只换承载类」 | ✅(12 项判据逐字未动,仅 `_forge.` 前缀与 load 目标) | - -**未授权项清单:零。** 全 diff 删除断言行 31 处逐条核对均有同判据替换行(探针断言计数 56 增:31 删;shot_probe 21=21、system_test 51=51、ui_contrast 结构断言 7=7、forge_workbench 12=12);无放宽阈值、无缩小在役扫描面、无真实入口换下层直调(object_pressed 信号发射面=卡面 V2 明文钉定,不属直调削弱)。卡⑤「零削弱申报」成立。 - -## 4. 内部字段直查受控例外核对 - -| 直查行 | 依据 | 判定 | -|---|---|---| -| ui_probe camp.tree._balance_label/_tree_buy_btns、camp.treasure._workshop_rows;ui_click treasure._workshop_holder | 卡④ §7 削弱申报表行 4(深员改指新界面成员——历史既有口径) | ✅ | -| screen_flow band._badge.value_label.text | 卡⑤ §7 V6 判据绑定面明文钉 value_label.text(badge 工厂约定单点) | ✅ | -| ui_click :694/:717 confirm_dialog._secondary_btn.visible | 本批新增成员(三钮化即被测改动本体)、两/三出口形态唯一直观观测面、无公开访问器 | ⚠️(对照表未注明直查理由——建议随缺漏补差补一句申报,不构成判红项) | -| main_esc_flow :31 读 flow.stack._list(产品码跨类私有读) | 卡⑤ 契约 9 判据单点=ModalStack 登记册现开集合 sanctioned 读法(ModalStack 无公开现开集合访问器;代码注记自陈) | ✅ | -| screen_flow HUD 段 main._camp_pres.views.refresh_bus 直呼 | 卡⑤ 契约 5 时机③「夹具直写后探针显式触发」授权 | ✅ | - -## 5. 自跑抽查回执(worktree 内实跑;六条全绿) - -| # | 命令 | 退出码 | 关键行 | -|---|---|---|---| -| 1 | `python tools/run_system_test.py` | 0 | 「69 项检查,0 项失败」「PASS(退出码/摘要失败数/脚本错误扫描 三闸全过)」 | -| 2 | `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(V14) | 0 | 11 条 [PASS] 逐条在案+「all green (11 checks)」 | -| 3 | `godot --headless --path game --script res://tests/unit/presentation/forge_workbench_test.gd`(承载类迁移) | 0 | 12 条 [PASS]+「all green (12 checks)」——断言零改实证 | -| 4 | `godot --headless --path game res://probe/screen_flow_probe.tscn`(含 Esc 段) | 0 | 「PASS — 六步主流程+回退路径全绿」(_ready 序含 `_step_camp_esc_and_hud`,Esc 段红即 FAIL) | -| 5 | `bash game/tests/static_scan.sh`(S13 基线) | 0 | 「S13 ok」「基线外新违规 0 条,较登记值恶化 0 条」 | -| 6(加跑) | `godot --headless --path game res://probe/ui_contrast_probe.tscn` | 0 | 「PASS — 对比度 36 对测点全绿」(与报告 V10 读数一致) | - -render_gate 按审计范围禁跑(05 红=L3 呈报在案,见 §6 记档 1);MC 零跑(零数值零行为,符合卡面闸口径)。 - -## 6. 总结论 - -**不通过(限项)——缺漏 1 项+轻微缺漏 1 项+记档核对 4 项;缺漏 1 补齐并复核后可转通过。** 除下列缺漏外,三卡对照表、判据绑定面、削弱申报、直查例外、自跑抽查全部通过;无未授权测试削弱。 - -### 缺漏清单 - -1. **卡⑤ V5 退出项验收断言缺位**(对照表 ❌ 行)。卡面 §7 V5 验收测试=「ui_struct_probe.gd:_ready(退出钮接线结构断言)〔ESC批 V5〕」,判据绑定面=「钮 pressed 连接目标=_on_quit→_quit_game(绑信号连接与调用链)」;实际全仓 grep 零该断言(quit_requested/_on_esc_quit 连接链无任何落码检查),〔ESC批 V5〕尾缀零命中。报告对照表该行改称「连接链断言(main_ui_build 接线在位)」——接线代码在位属实(main_ui_build :242),但「静态判据」并未落码,「绿」的实质=装配期 connect 不报错的间接承载,不满足卡面「绑信号连接」的断言要求,对照表该行名不副实。卡面已申报 headless 不可真退的观测面局限并给出可行静态形态。**补法(最窄单元)**:ui_struct Esc 结构段加一条静态断言(如 quit_requested 连接表非空且连接目标=_on_esc_quit)+〔ESC批 V5〕尾缀,孤立验证后并套件复跑。 -2. **(轻微)尾缀覆盖缺口**。卡④ V4/V6/V7/B1/B2 与卡⑤ B1/B2/B3 无卡面 §7 规定的〔营地图批 Vn/Bn〕〔ESC批 Bn〕尾缀(grep 零命中);对应验证本体全部在役且当轮实跑(V4=forge_workbench 12 项+ui_click 购买链;V6=ui_click 灰字段;V7=screen_flow 回退段;B 行=对应 V 行断言承载),缺的是卡面「断言尾缀与卡片清单互相 grep」的对账形式。成因=卡⑥ 波先行改指保留〔句柄子容器批 V1〕尾缀+V4 受「断言零改」申报约束(补尾缀即违反零改,可申报豁免)。**补法**:V6/V7/B 行断言消息文本可在后续批补尾缀;V4 记录豁免依据即可。 - -### 记档核对项(在案事项复核,不算缺漏) - -1. **05 渲染闸红(shot_checker A 段色数判据互斥)**=L3 呈报文件在盘(reports/停机呈报-shotchecker色数判据互斥-2026-11-01.md),但该文件 git **未跟踪**(?? 状态)——合回合并不携带至 master,归档链注意;合回前须用户裁决读法 A/B+闸重跑(实现报告 §7/反哺点 #10 已登记)。 -2. **反哺点 #12 事实性偏差**:称 CAMP_HEADER_BAND「现役消费面=ui_contrast 表注销四行后零消费」——实测 keystone_badge 工厂(ui_kit.gd :629-631)在役消费、新 CampHudBand 经该工厂消费、level_map_screen/shop_overlay_view 亦有消费;令牌退役评估前提失实,文档批裁决前须订正(ui_contrast 删行授权不受影响——删的是营地域头带/铭牌/条带测点对,非令牌本身)。 -3. **卡⑤ V7 名实差**:报告称源码扫描「扫描面>0 非空前置」——ui_struct :127-129 实现无长度非空守卫(FileAccess 读失败=空串静默通过);子树扫描面在浮窗实例在座前提下非空成立。建议后续批补一行长度守卫。 -4. **卡④ V9 扫面注记**:反参照断言扫面=场景根直接子层(get_children 非递归),报告称「场景根子树」;HudBandSlot 在扫面内,嵌套 Button 不计。新立断言无削弱对象,范围注记即可。 - -### 审计范围声明 - -本审计执行上列六条最窄抽查与静态读数+全量 diff/卡面/报告逐行核对;未跑 render_gate(在案红待裁)、未跑 MC、未跑 ui_probe/ui_click/ui_struct/shot_probe 单件直跑(其营地段断言经 system_test+screen_flow_probe+ui_contrast 实跑间接覆盖,且逐行静态核实);审计过程零产品码/测试码改动。 diff --git a/reports/复核-双审-grilling与godot-master-迭代47双卡-2026-11-01.md b/reports/复核-双审-grilling与godot-master-迭代47双卡-2026-11-01.md deleted file mode 100644 index 4b95c12d..00000000 --- a/reports/复核-双审-grilling与godot-master-迭代47双卡-2026-11-01.md +++ /dev/null @@ -1,60 +0,0 @@ -# 复核报告:迭代 47 双卡 grilling+godot-master 双审(2026-11-01) - -- **接收方**:`reports/需求卡片-营地场景图新建批-2026-10-18.md`(卡④,v3.0→v3.1)+ `reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md`(卡⑤,v1.3→v1.4)。本报告是双审过程稿,裁断与订正已全部吸收进两卡,批末收尾按吸收即死退役。 -- **审查构成**:四个独立子代理——卡④ grilling/卡⑤ grilling/卡④ godot-master/卡⑤ godot-master(全程只读、未落盘、未跑测试)。 -- **发起**:用户令(开工前审查:零待裁点、零阻塞点、零灰色地带、符合 Godot 设计规范)。 -- **裁决**:用户 2026-11-01 裁「都可以按照推荐来」——五裁点照推荐采纳、P3/P5 销号口径采纳、卡⑤ v1.4 补句、卡④ 漂移就地订正+Godot 风险项落卡。 - -## 一、双审结论 - -| 卡 | grilling | godot-master | -|---|---|---| -| 卡④ | 有条件可开工——卡内设计待裁点确为零、重立凭据属实、与卡⑤ 接口名实闭合;但 §0.3 四道开工门实证全部未销号(会卡 T1/T2/T5),另有成片现状事实漂移 | 基本符合有风险项——分层/信号/单点纪律全对齐、零硬违反;风险=1024×1024 源档降采样算式断裂+核心视觉不变量机器验收零覆盖 | -| 卡⑤ | 有条件可开工——零真待裁点(Q1/Q2/Q3 留痕完整);但三处现行文本会指导出错实现(浮窗残留缺陷级/V4 判据与契约 3 矛盾/Esc 第四态未定义) | 基本符合有风险项——浮窗选型/层序/拆件与现役先例同构、零硬违反;风险=文件表漏列 ui_modals/main_ui_build 两必改件+Esc 第四态连带语境分支谓词二义 | - -## 二、裁断与销号落点(2026-11-01 用户裁) - -| 项 | 裁断 | 卡内落点 | -|---|---|---| -| camp-scene-prompts §5 五裁点 | ①帐篷 300×170 追认现值②门扇 240×220 追认③布告板 (845,268,130,140) 挂围墙带④描边奶油色追认⑤环境子板色值不前置(T1 量化后按 art-bible §4.1 两道门登记;T5 色计数改条件步) | 卡④ §0.3-3/§9-4/§10;反哺点(§5 落文归文档批) | -| P3 点选反馈设计稿 | 销号口径=camp.md v2.2:35-37 四态规格即设计稿;名牌文案与可点区域视觉归 T2 域内 | 卡④ §0.2/§0.3-1 | -| P5 GDD/art-bible 落文 | 销号口径=形态落文完成;实装回填归 T6 反哺点义务,非停机条件 | 卡④ §0.2/§0.3-2 | -| T1 素材后处理发令 | /iter 开工令即含授权,不再两次发令 | 卡④ §0.3-4/T1 | -| 1024×1024 档降采样 | 逐张登记换算式;1024 档非整数缩放显式特批登记(L2+实现报告申报局限),不回炉(追认已过审终稿优先) | 卡④ T1 | -| Esc 第四态与接线 | 契约 9 四态优先序(判据单点=ModalStack 现开集合)+接线定稿=事件驱动 `_unhandled_input`+KEY_ESCAPE、禁 Input 单例轮询、不挂 ui_cancel、pressed 且非 echo | 卡⑤ 契约 9/T0/T1/§9-1 | -| 设置语境分支谓词 | =`camp_esc_overlay.visible`(谁开的设置谁收),与 Esc 守卫谓词分立 | 卡⑤ 契约 3 | -| 返回主菜单浮窗残留 | 动线首步 close 浮窗;V3 断言补浮窗 closed | 卡⑤ 契约 4/T3/V3 | -| camp 截图排序约束死信 | 废止原句;按迭代 47 执行序=卡④ 整卡先、卡⑤ 后,卡⑤ T2 限 HUD 区显式更新兜底 | 卡⑤ §0/卡④ T0 | - -## 三、双审独立发现、交叉确证的灰色地带(全部落卡) - -1. Esc 第四态(设置开在浮窗之上再按 Esc)——两审独立发现 → 契约 9①。 -2. 返回主菜单后浮窗残留(缺陷级)——grilling 发现、godot-master 同域印证 → 契约 4。 -3. V4 判据与契约 3 自相矛盾(浮窗恒 visible 由栈语义保证,非属性隐藏)→ V4 改述。 -4. V6 badge 文本格式字面不等(带「钥石 」前缀)→ V6 改格式串比较。 -5. CampRefreshBus「Bus」命名 vs 全局事件总线否决史(architecture.md:353)→ 卡④ T3 头注自陈+卡⑤ 措辞「挂接/接收推送」。 -6. 文件表漏列 `ui_modals.gd`/`main_ui_build.gd`(S13 触面失察;ui_modals 类变量 14→15 恰贴上限)→ 两卡文件表与存量触面一查补列。 -7. 「卡④ T5 晚于卡⑤ T2」排序约束单侧声明且按执行序天然不可满足 → 死信改述(见 §二)。 -8. V7 零动效扫描面漏开合编排件 → 扫描面扩两新件;V5 补「禁对退出钮 pressed.emit」;V1 补冒险语境段与 echo 断言;「进档重读」触发主体钉组合根动线尾。 - -## 四、卡④ 成片事实漂移订正(T0 级,v3.1 就地订正) - -`game/smoke/` 已退役(git 16c6f136)→ 探针全在 `game/probe/`;smoke_all.gd 已退役(git 957391e1)→ system_test.gd(V2 :67-68/V3g :520-541)+theme_projection_test.gd:710-717;`main.camp_overlay` 句柄已退役 → `main.ui.modals.camp_overlay`(ui_modals.gd:14);F3/F7 行号簇换 2026-11-01 实测;F6「断点弹窗现居主菜单」失实(main.gd:118-120 注释)——T4 承接;`_on_confirm_new_adventure` 已随卡②摘除;`UiKit.TEX_CAMP_*` 尚不存在(本批 ui_kit.gd 新增十键);`tools/gdstyle.sh` 不存在(→ static_scan.sh/gdstyle_gate.py);presenters/core 子目录路径订正;`design/gdd/06-待办清单.md` 已迁仓库根;契约 4 行号换实数(八处 :82/90/102/114/126/139/151/165=七口+on_camp_buy 双尾);终局落点 main.gd:703 → main_adventure_flow.gd:123-143。 - -## 五、卡⑤ F1–F10 抽验 - -10 条全抽:F1/F2/F3/F5/F6/F7/F8/F9/F10 属实;F4 消费点全对、行号三处系统性 ±1(keystone_badge :633→:632、modal_shell :487→:486、danger_button :700→:699)——已订正。卡外小漂:screen_flow_probe 营地旗标在 :54(:53 是菜单行)、待办清单五卡总条 :447 起——已订正。 - -## 六、Godot 规范审查补立(卡④) - -- 节点选型钉死:Control 根+TextureRect 层+子节点序即 z 序;禁 CanvasLayer/z_index/Sprite2D 根(LAYER_CONTRACT 树序落位兼容)。 -- V1 扩判据:camp_scene_view 子节点序=layout 表 z 序逐层相等、纹理矩形与表逐值一致;新增 V14 layout 数据件校验(fail-fast 命中区几何)——核心视觉不变量机器验收面补齐。 -- T2 实现约束:浮动经 Tween 禁 `_process`;名牌 Label mouse_filter=IGNORE;禁用态去饱和经 ShaderMaterial;名牌画面内钳制;HUD 载体循 page_shell `PRESET_TOP_WIDE` 先例。 -- layout.tres 接 ConfigDB schema 类(先例 battle_layout.tres)+加载期 fail-fast 校验。 - -## 七、遗留与开工判定 - -- **零待裁点、零阻塞点**:卡④ §0.3 四道开工门全部裁断销号;卡⑤ 零真待裁点、开工按序随卡④ 代码波(迭代内排序,非跨迭代阻塞)。 -- 反哺点落文已完成(2026-11-01 本会话文档批,同批合回):camp-scene-prompts.md v1.3 §5 改已裁+art-bible.md v3.31 §6.2 待裁行改已裁;camp.md/art-bible 实装状态回填归迭代实现批 T6 义务。 -- 机检预算互斥裁决(2026-11-01 用户裁,停机呈报=iter47 worktree):实现段实测两卡平铺合计 ui_modals.gd 类变量 19>S13 上限 15——裁**最小改动**=营地六句柄落 `ui_camp_modals.gd` 子容器(新立卡⑥ 前置基建,迭代 47 执行序第一位;卡④ v3.2/卡⑤ v1.5 随批改口径,卡⑤ v1.4「14→15 恰贴」算术缺陷一并订正);全量分域句柄分家登记待办清单另立批。双审预算审为单卡口径、未做跨卡同文件累加核对,已在裁决中注记。 -- **判定:迭代 47 可开工**(卡⑥ → 卡④ → 卡⑤ 按序,`/iter` 发令即起 T0)。 diff --git a/reports/提案-营地场景图美术生成方案-2026-10-22.md b/reports/提案-营地场景图美术生成方案-2026-10-22.md deleted file mode 100644 index 0f2a84a5..00000000 --- a/reports/提案-营地场景图美术生成方案-2026-10-22.md +++ /dev/null @@ -1,522 +0,0 @@ -# 提案:营地场景图美术生成方案(渠道 · 分层 · 工作流 · 样张验收判据) - -> 性质:设计讨论段过程稿(2026-10-22 美术方案讨论产出)。**只讨论生成方案,不出图、不写需求卡片、不改 `game/`、不编迭代**——美术线是用户自立批(铁律 2),方向稿与「过/不过」的目检结论由作者出。 -> **现行口径指针(2026-10-30 作者裁定)**:分层张数与围墙归属已有新裁定——营地场景图 **10 张** = 背景层 `scene_camp_bg`(z0,不透明全幅:天空+远山+整片地面+门洞小路)+ 围墙层 `scene_camp_wall`(z1,透明底:横贯密排木桩墙+两根门柱,门洞留透明缺口)+ 八个物件层(布告板 z2/门扇 z3/木桩·锻炉·帐篷 z4/宝箱·笔记本 z5/篝火 z6)。**围墙已从背景层拆出、独立成层**;门洞小路画在背景层、由围墙门洞透明缺口透出。**现行坐标、提示词、验收与消费名的单一事实源 = `design/art/camp-scene-prompts.md` §2/§4、`art-bible.md` §6.2、`asset-path-map.md` §3、`art-assets-checklist.md` §3.5、`camp.md`**;本稿 §2.2 层表、§2.5 坐标草案、§4 消费常量表、§5 验收、§12 分层元素表所记的「8 张/背景层含围墙/门柱门洞画在背景层」为 2026-10-22 讨论当时口径,其推理留痕保留不改,执行以上列五份现行文档为准。 -> 输入事实源:`reports/需求卡片-营地场景图新建批-2026-10-18.md`(卡④ v2.3,已退回美术设计段)、`reports/需求澄清-营地交互重做-2026-10-18.md`(目标体验原话/纵深稿/10 条交互裁决)、`design/art/art-bible.md` §6.2/§7.5/§4.1/§4.2/§8.3、`design/art/asset-path-map.md`、`design/art/art-prompts.md` §0/§4bis、`design/art/remote-gen-prompts.md`。 -> 待作者带的输入:①参照物(作者原话「后续找一下」)②渠道一句话裁定 ③每轮方向稿「过/不过」的目检结论。 - ---- - -## 0. 四问速览(只读这一段也能定) - -| 问 | 答 | -|---|---| -| **① 现状差在哪** | 营地场景图**一张都不存在**(现役是四柜台覆盖层,程序化占位)。卡④ 已因美术轨凭据缺(P1–P5 未销号)退回美术设计段,卡⑤ 排在它后面,营地五卡是 Alpha 例外项——**没有图,卡④⑤ 一行代码都开不了**。 | -| **② 建议做什么** | 走**项目既有远程生图管线(主角/八敌同条路)出图 + 既有后处理管线收口**,交付形态定为 **「1 张背景层 + 7 张物件层 + 1 份坐标表」**(不是一张整图叠七个矩形热区)。出图顺序:先 2–3 张低分辨率**方向稿**让作者选划方向,判完方向才分层精制。 | -| **③ 为什么选它** | 七物件要**悬停/按下/禁用/已解锁四态**:整图 + 矩形热区做不出「贴合物件形状的高亮」和「单个物件灰掉」,要补就得给每个物件抠一张透明遮罩——那其实还是分层,只是遮罩不公开成素材。渠道 **B(插画级新产,✦ 渠道作者自跑远程生图管线)** 的**返工成本最低**(换提示词=换一张,八敌已量产验证);♻ CC0 凑不齐七件同套素材,且多来源像素密度不齐。**不是三选一**:A/B 是「产出什么」,远程生图管线是「怎么产出」。 | -| **④ 怎么验证** | 机检三件:色板(`tools/palette_check.py --baseline`)、像素件(`tools/standee_asset_check.py`)、几何(七命中矩形两两不重叠 + 中心点落在物件不透明像素上,实现批写成探针断言)。风格一致、构图好看、七件一眼找得到——这三项机检判不了,**归作者目检**。 | - ---- - -## 1. 议题 1 · 生成渠道怎么选 - -### 1.1 三条路摆开 - -> **口径更正(2026-10-22,Agent 自纠)**:草案曾把 B 误标为「人工/外包」——**错**。项目原文(卡④ `:282`)定义 **B = 插画级新产 = 按纵深稿从零新画一张**;执行方仍是**作者自跑远程生图管线**(`art-assets-checklist.md:14` 图例:✦ = 用户自跑,产出「角色、插画级素材」)。 -> 因此真实结构是:**A vs B =「产出什么」的二选一**(改现有 vs 从零画),**远程生图管线是「怎么产出」的执行通道**,不是与之并列的第三条路。下表保留三行以便对照,但裁定实质是 A / B 二选一(详见 1.3)。 - -| 案 | 怎么干活(逐天的真实动作) | 构图控制力 | 成本/周期 | 贴合已定色域的代价 | 返工风险 | -|---|---|---|---|---|---| -| **A · CC0 素材改色复用**(♻ 渠道) | 去 Kenney / OpenGameArt / itch.io 免费包找现成像素场景件(营火、砧台、宝箱、床、木牌、栅栏门等);选中后过「复用四道闸」(`art-assets-checklist.md:22`):① 色板量化到 §4.1 的 48 色 token、不保留原包杂色 ② 吸色检查无 HSV 300°–345° ③ 去色相仍可辨、不与语义件混 ④ 授权干净(CC0 优先,CC-BY 须署名,授权不明不用);过闸后按 v3 坐标拼上画面 | **最弱**——要凑齐八个指定物件的同一套素材几乎不可能,落点是东拼西凑 | 找素材耗时不可控(看似零绘成本,实际耗在筛选与授权核对) | **高**——多来源拼的图,像素密度、描边粗细、光照方向各不相同,改色+统一描边的工作量接近重画 | **中偏高**:发现风格不齐或构图不贴纵深稿,只能换源重找,前功尽弃 | -| **B · 插画级新产**(✦ 渠道 · 卡④ 原案) | 以已接受的布局稿 + 纵深稿作参考锚,开远程生图对话 → 出构图候选 → 选一张 → 分层出图 → 抠底 / 降采样 / 色板量化 / 描边统一 → 合成校验 → 样张呈裁。**全链路=本提案 §3 的 S0–S7**,执行人始终是作者自己 | **最强**——七件位置与纵深完全由布局稿+提示词控制 | 重出一张很便宜(换提示词=换一张);拖周期的是反复横评,不是绘制本身 | **低**——提示词锁主色(烛光黄 `#F6C667` / 木色 `#8A5A34`)+后处理色板量化收口 | **最低**——候选多、迭代便宜 | -| **C · 方向稿先行的混合时序**(B 的低风险写法) | 与 B 同一条管线,只是分两段:**先出 2–3 张低分辨率方向稿**给作者选划 → 判完方向才分层精制。**C 不是与 B 并列的第三条路,它就是 B 的执行时序** | 同 B | 同 B(因先用便宜稿定方向,总额外轮次更少) | 同 B | 最低 | - -### 1.2 我的推荐:选 B(插画级新产),用 C 的时序去走(不替作者拍板,只摊代价) - -> 原推荐写作「C 为主 + 混合收口」,口径更正后重新表述:**产出方式的裁定是 A / B 二选一,推荐 B;C 只是 B 的执行时序(先出可被否决的便宜方向稿),不构成第三选项。** - -**推荐 B**,三条理由按权重排: - -1. **它和本项目的具体缺口对得上**:缺口是「七个可点击物件的独立透明件 + 一张背景」,不是「一张漂亮插画」。远程生图一次出一张、想要几张出几张,天然适配分层交付;♻ 渠道卡在「找不齐一套八件的同一套 CC0 素材」。 -2. **返工风险最低是硬道理**:重出一张很便宜(换提示词=换一张),所以「先用过渡规格跑通交互、画质后升」这个口径才成立。 -3. **后处理管线已齐**:抠底→最近邻降采样→色板量化→描边,这条链在八敌批跑通过(art-prompts §0 五步第 4 步);换渠道等于这条链作废重搭。 - -**混合怎么混**(= C 时序,B 的内部工序):AI 出构图候选 → 作者选划方向 → 按定稿构图出「背景 1 张 + 物件拼表 1–2 张」→ 脚本后处理(抠底/降采样/量化/描边统一)→ 按坐标表合成校验 → 样张呈裁。**人工只出现在两处:作者选方向、作者判样张**。 - -**⚠ 选 B 时要连带处理的一件事(卡④ Q6 甲原文冲突,须作者确认)**:Q6 甲的裁定原文是「**Q1 裁 A 时**用过渡尺寸档=现役 1280 工程档+烛光黄 `#F6C667`/木色 `#8A5A34`」;**若 Q1 裁 B,按该裁定原文「过渡口径不成立」**——须走乙案「等样张批规格清单产出才开 T1」,或由作者**另行裁定一次过渡规格**。而本次讨论的输入条件里把「过渡规格=1280 工程档」列为已定硬约束,两者口径冲突,**属呈报项,不自行取一侧**:请作者确认过渡规格是否无条件适用。 - -**一句话裁定**:`A` 还是 `B`(推荐 **B · 插画级新产**,并按 C 的「方向稿先行」时序执行)。裁完即可进 §3 的 S1(S0 已销号)。 -**同时请顺便确认**:① 过渡规格是否无条件适用(见上方 ⚠ Q6 甲冲突);② 参照物是否阻塞 S1(等参照 vs 先用布局稿当锚)。 - ---- - -## 2. 议题 2 · 要不要分层、怎么分(核心) - -### 2.1 先判「一张整图 + 七个矩形热区」够不够 - -结论:**不够**,四态里有三态做不出来。 - -| 四态 | 整图 + 矩形热区能做到吗 | 说明 | -|---|---|---| -| 悬停高亮 | ❌ 只能整体提亮整图,或画一个**矩形框**——矩形框正是作者点名拒绝的「各种框框」形态;若要贴合物件形状提亮,必须有一张**该物件的透明遮罩** | 「要遮罩」就等于分层,只是遮罩不公开成素材,反而更难维护 | -| 按下 | ❌ 同上(位移/压暗也要遮罩,否则整图一起动) | | -| 禁用 / 未解锁 | ❌ 灰掉单个物件 → 同样要遮罩 | | -| 已解锁 | ✅ 不需要额外素材 | | - -**不分层还会发生什么**(逐条摊开): - -1. **改构图 = 整图重出**:七件的相对位置被一张图锁死。分层后调位置只改坐标表(背景空档由背景层自己承担)。 -2. **物件没法复用**:图鉴提示里想放宝箱小图标、顶栏想放钥石徽 → 得另出一套小件。分层后同一张 PNG 直接缩着用。 -3. **命中区与剪影对不齐**:矩形热区必然误吞(点大门旁边的空地也进冒险),只能逐个手工调矩形,且物件形状越不规则误差越大。 -4. **遮挡关系写死在像素里**:现在篝火压在近景是画出来的,将来要在它后面加东西、或者把火焰做成动效,都得整图重出。 -5. **四态演示无法提前给作者看**:分层后可以在出图阶段就合成「常态/悬停/按下/禁用」四联图给作者判;整图方案要等代码写完才看得见反馈。 - -### 2.2 结论:分层,共 8 张 + 1 份坐标表 - -**交付形态 = 1 张背景层 + 7 张物件层 + 1 份坐标表**(8 张 PNG)。 - -| 层 | 文件名(草案) | 内容 | z 序 | 是否透明底 | -|---|---|---|---|---| -| L0 | `scene_camp_bg.png` | 远景天空 + 地面 + 中景围栏(**含门柱与门洞**,门洞内画通往远处的路)+ 远景植被/山;**不含七个可点物件的本体** | 0 | 否(全幅不透明) | -| L1 | `scene_camp_board.png` | 布告板/悬赏板(挂在中景围栏上)→ 图鉴 | 1 | 是 | -| L2 | `scene_camp_gate.png` | 大门门扇(叠在 L0 门洞上)→ 冒险 | 2 | 是 | -| L3 | `scene_camp_dummy.png` | 木桩 → 天赋树 | 3 | 是 | -| L4 | `scene_camp_forge.png` | 锻炉·铁砧 → 锻造工坊 | 3 | 是 | -| L5 | `scene_camp_tent.png` | 帐篷 →(承载笔记本,本体不可点) | 3 | 是 | -| L6 | `scene_camp_chest.png` | 宝箱 → 秘宝匣 | 4 | 是 | -| L7 | `scene_camp_notebook.png` | 帐篷旁笔记本 → 生涯记录 | 4 | 是 | -| L8 | `scene_camp_campfire.png` | 篝火 → 离开营地/回主菜单 | 5(最前) | 是 | - -> **七个可点物件 = L1/L2/L3/L4/L6/L7/L8 七张**(帐篷 L5 是承载件,不可点;笔记本挂它旁边)。 -> **四态不落素材**(2026-10-22 作者裁后改写):**悬停 = 给轮廓加亮边(描边发光)+ 浮动**,**不是整体提亮**——亮边由物件层 alpha 外扩 1px 派生,零手绘;按下 = 位移 1px(平移不是缩放,不触甲类整数倍缩放规则);**禁用/未解锁 = 变暗并调成灰度**(见 §9 ⑨,**作者特许破除 §2 明度禁令**,须登反哺点);已解锁 = 常态。 -> **若作者要「描边发光」式高亮**:不需要新出图——由物件层的透明通道自动外扩 1px 派生一张描边图(脚本生成,零生成成本)。这条正好回答「不分层就做不了描边」。 - -### 2.3 篝火与大门要不要区别对待 - -**要,两件各有各的特殊处,但都不是「不分离」的理由**: - -- **篝火**(近景居中、可能遮挡):它是**最该分离**的一件——① 它是 z 序最前的近景件,分离后遮挡由代码 z 序管,背景不会被它烧进去;② 它绑「离开营地」这个高代价动作,命中区要单独定(建议与躯干等宽、不含火焰上部飘动区,防误点);③ 火焰是将来唯一可能带动效的件,分离后加帧只动它一张。 - - 过渡规格先出**静态一张**;若作者要火焰动效,后补 2–4 帧(同方向稿续写锁定形态),属后续画质档,本次非目标。 -- **大门**(中景、与围栏连体):**背景层画全门柱与门洞**,大门物件层只画**门扇**叠在门洞上。这样分层边界天然(门柱内框 = 对位锚),且不会出现「背景缺个洞」的空洞问题。 - - **已裁(2026-10-22):门扇=半开**,门洞内**画一条通向远处的小路**(暗示「出去即冒险」)。两扇门同属一张 `scene_camp_gate.png`,接缝一起落在同一命中矩形内。 - -### 2.4 分了层,AI 能不能保证七个物件与背景风格一致 - -**单靠「同一对话续写」不行**——项目实证:同对话续写 = 对上一张图的**编辑模式**(会被当成增量修图),变体必须各开新对话。所以续写恰恰是风格漂移的来源,不是解法。 - -**靠三道,按硬度排序**: - -1. **硬办法 · 拼表制(首选)**:**一张图里画完全部物件**,出完按网格裁开。同一张图内不可能出现两种像素密度、两种描边——风格一致性由「同源」保证,不靠模型自觉。这是本项目瓦片批已验证的制式(2×2 拼表一张出全族)。 - - 适配到本件:七件尺寸差异大,用**不等分网格 + 每件一个标注框**的排版(提示词写明「七个独立物件,各自占据一个矩形区域,区域之间留统一浅灰间隔,物件的任何像素不得越出自己的区域,不得画任何边框/标签/文字」)。 - - 兜底:若拼表连续失败(模型坚持画框/串位),退回**一张一跑**,改靠第 2、3 道收口。 -2. **软办法 · 风格参考图**:出图时贴**已定稿的项目素材**(主角立绘/已定档敌人/瓦片纹理任择)并带既有句式「只是风格参考,只对齐像素密度、平涂、亮暖白描边与暖色限制调色板,不许抄服装道具配件」。目标是把**像素密度与描边**锚到既有世界观上。 -3. **兜底 · 后处理统一**:抠底 → 最近邻降采样到统一像素密度 → 色板量化到同一套板 → 描边统一(缺描边的件由脚本按 alpha 外扩补一圈亮暖白描边)。三道做完,风格差异被压到只剩造型差异(造型差异是好事,七个物件本来就该长得不一样)。 - -### 2.5 分层的代价:位置谁定、对位怎么保证 - -| 代价项 | 谁定 | 怎么保证 | -|---|---|---| -| **七件摆哪儿** | **作者定方向**(纵深稿已给:中景围栏+大门、近景中间篝火、左锻炉铁砧、右床铺与宝箱),Agent 出**灰块布局稿**(1280×800,七个编号矩形 + z 序标注)供作者调 | 布局稿 = 唯一坐标事实源,后续所有出图都贴它作参考锚 | -| **对位精度** | 出图后由**脚本按坐标表合成** | 合成图与方向稿并排,逐件锚点误差 **≤2px**;物件层边缘**无 1px 半透明毛边**(硬边/无抗锯齿纪律) | -| **坐标表格式** | 实现批定(建议走代码常量单点,与 `UiKit.TEX_*` 同处;或 `.tres` 落 `data/tables/`,按数值单一事实源口径) | 表必须含四列:**物件键 / 贴图锚点 (x,y) / 命中矩形 (x,y,w,h) / z 序** | -| **背景空档** | 背景层自己承担 | 背景层画全(含门洞、地面、围栏完整),物件层只是叠上去,移走任何一件背景都不露洞 | - -**坐标草案 v3(2026-10-22 · 作者已接受)** - -口径(用户 2026-10-22 亲自定):**只有最左、最右两件往边上推;不靠边的那些不许贴边**——它们按「离画面中心的距离」成比例往外挪一点点(最外挪 ~80,第二圈 ~40,中轴 0)。**物件尺寸一律不变**,拉开的是它们之间的**间隔**。 - -做法:**以中心线 x=640 为原点等比外扩,k=1.20**,只改 x、不动 y 与尺寸。v2「所有物件一律贴边」的做法已被否决作废(把非边缘件也拽到边上,无故且无意义)。 - -| 物件 | 层 | v1 基线 x | **v3 命中矩形 (x, y, w, h)** | 外移量 | z 序 | 可点 | -|---|---|---|---|---|---|---| -| 锻炉·铁砧(最左) | L4 | 120 | **`(40, 420, 240, 240)`** | −80 | 3 | 是 → 锻造工坊 | -| 木桩 | L3 | 380 | **`(340, 520, 120, 180)`** | −40 | 3 | 是 → 天赋树 | -| 篝火 | L8 | 560 | **`(560, 560, 160, 160)`** | 0 | 5 | 是 → 离开营地 | -| 大门(门扇) | L2 | 520 | **`(520, 250, 240, 220)`** | 0 | 2 | 是 → 冒险 | -| 布告板 | L1 | 800 | **`(845, 330, 130, 140)`** | +45 | 1 | 是 → 图鉴 | -| 笔记本 | L7 | 770 | **`(818, 690, 100, 80)`** | +48 | 4 | 是 → 生涯记录 | -| 帐篷 | L5 | 880 | **`(958, 520, 300, 170)`**(待重定) | +78 | 3 | **否**(承载件) | -| 宝箱 | L6 | 1000 | **`(1085, 700, 130, 90)`** | +85 | 4 | 是 → 秘宝匣 | - -配套约束(2026-10-22 更新):顶栏 HUD 保留带 = **`y ≤ 48`**(§9 ⑤⑦:一行量、浮层覆盖),八矩形全部落在其下方;中景围栏横贯约 `y ≈ 500`(画在背景层);**八个命中矩形两两不相交**(已逐对校验;y 方向分离的有:大门/篝火、布告板/帐篷、帐篷/宝箱);间隙最小的两处 = 笔记本右缘↔帐篷左缘 40px、锻炉右缘↔木桩左缘 60px。 - -**⚠ 唯一例外件(2026-10-22 作者裁)**:**篝火的「贴图矩形 ≠ 命中矩形」**——整张 `scene_camp_campfire.png` 仍画火堆+火焰,**命中矩形只取下半(火堆),上半=火焰只作特效展示、不可点**(防误点「离开营地」)。这是八个件里唯一两栏不一致的,**实现批坐标表必须用两列表达**(贴图矩形 / 命中矩形),其余七件两栏相同。具体分界数值**等成图后按实际画面切**(现在定死无意义)。火焰动效本次不做(作者令),过渡档=静态一张;将来要动效只需给这一层补帧(分层的收益)。 - -### 2.6 分层后,探针与断言怎么验「物件在正确的位置上」 - -分三层验,**前两层是机检主力,第三层是兜底**: - -1. **几何断言(零渲染,最便宜)**——七件命中矩形两两不相交;每个矩形不越出 1280×800;不侵入顶栏 HUD 保留带(`y ≤ 48`,§9 ⑤⑦);最小命中尺寸 ≥ 64×64(小件笔记本允许 ≥48×48,并允许命中区大于贴图本身,外扩补齐);**篝火用命中矩形(火堆)判定,不用贴图矩形**。 -2. **alpha 采样断言(这一条是「位置正确」的可机检近似)**——取每个命中矩形的中心点,断言该点在**对应物件层**上是不透明像素、在**其它六个物件层**上是透明像素。物件贴图摆错位置、坐标表抄错行、z 序写反,这条都会红。 -3. **可达性断言(功能主力)**——七件逐一合成点击,断言进入对应界面(契约 2,卡④ V2);这一条验的是「点得到」,前两条验的是「图摆对了」。 - -**变异验证**(新增断言必须验证过它会红):把某个物件的坐标表改错一行 → 第 2 条断言红;把某物件的命中区删掉 → 第 3 条红。注入 → 见红 → 精确还原 → 记录。 - -### 2.7 一句话结论 - -**分层,8 张(1 背景 + 7 可点物件 + 床铺承载件共 8 张图),配一份四列坐标表;四态全部走程序化(提亮/位移/幽灵化),零四态素材;风格一致靠拼表制硬压 + 风格参考图 + 后处理统一三道。** - ---- - -## 3. 议题 3 · 生成工作流(从空白到样张过审) - -> 「谁做」列:作者 = 用户本人;Agent = 我(脚本/文档);管线 = 远程对话式生图(作者自跑)。 - -| 步 | 做什么 | 谁做 | 产出物 | 完成判据 | -|---|---|---|---|---| -| **S0 布局稿** ✅**已销号 2026-10-22** | 按纵深稿把七件摆到 1280×800 上 | Agent 出稿 → **作者已裁** | 坐标表=本文 **§2.5 坐标草案 v3** | v3 经作者目检通过;改动须显式提出 | -| **S1 方向稿**(下一步) | 开 **3 个独立对话**,贴项目自家定稿素材作风格锚,出**整图构图候选**(背景+七件全画,不分层) | 作者出图 | `artwork/2026-10-23-营地场景/direction/v1.png v2.png v3.png` | 每张登记**模型名 + 分辨率 + seed + 对话/日期**(缺登记不入遴选);分辨率取平台**最大 16:10**(不小于 1024×640);提示词=**§13** | -| **S2 选划方向** | 作者目检三张,选一张并点名要改什么 | **作者** | 选划记录(选了哪张 / 改什么 / 淘汰另两张的理由) | 作者一句裁定 | -| **S3 分层出图** | 按定稿构图出:① 背景 1 张(1280×800 幅面)② 物件拼表 1–2 张(七件同图,浅灰 `#F2F2F2` 均匀底,便于抠图);每件 2–3 版候选 | 作者出图 | `.../layers/bg_v1-3.png`、`.../layers/props_v1-3.png` | 同 S1 登记义务;拼表图物件的任何像素不越出自己的区域、无边框无文字;**提示词待 S2 后另起** | -| **S4 后处理** | 抠底转透明 → 最近邻降采样到统一像素密度 → 色板量化到既有板 → 描边统一 → 按布局尺寸裁成 8 张 | Agent(脚本管线) | `.../layers/out/*.png`(8 张透明 PNG)+ 机检读数 | `palette_check.py <目录> --baseline <基线目录>` 无新增色红灯;`standee_asset_check.py` 单张 32 色、无非整数缩放痕迹、描边亮度达标 | -| **S5 合成校验** | 按坐标表把 8 张合到 1280×800,与 S2 选中的方向稿并排;另出**四态演示图**(常态/悬停/按下/禁用四联) | Agent | `.../composite_check.png` + `.../states_preview.png` | 逐件锚点误差 ≤2px;七命中矩形两两不重叠(脚本先跑一遍);四态四联一眼可辨 | -| **S6 样张过审** | 作者目检合成图与四态演示 | **作者** | 一句「过/不过 + 改什么」 | 过 = 进 S7;不过 = 回 S3(改提示词重出)或回 S1(方向错了) | -| **S7 落盘与挂链** | 终稿拷入 `game/assets/art/scene/`;代码侧先加 `UiKit.TEX_CAMP_*` 常量再接线(终稿文件名 = 代码消费名) | 实现批(**本次不做**) | 8 张终稿 + 常量 + 坐标表落码 | 反哺点中的**文档部分已于 2026-10-23 执行完毕**(见 §11:art-bible §6.2/§7.5/§2.8/§2/§4.1 改版、camp.md 整体改版、asset-path-map §3 增 `scene/`);剩余为代码侧常量与落码 | - -**出图分辨率纪律(像素硬规则)**:源档按**终稿的整数倍**出(建议 2×:背景 2560×1600 → 降采样到 1280×800;物件件按布局尺寸 ×2 出),降采样走最近邻(放大缩小不做平滑插值,保硬像素边)。**禁止非整数倍降采样**——甲类(语义件/环境结构件)严格整数倍。 - -**参考物到位后的处置**:作者找到参照物 → 与纵深稿对表;结构性冲突(比如参照的营地根本没有围栏/大门)→ **呈报订正构图,不在批内私改**(卡④ L3 条)。 - ---- - -## 4. 命名与消费链(先定消费名,防断链) - -命名按 art-bible §8.3:`<域>_<对象键>_<状态|变体>.png`,全小写 snake_case。新增语义子目录 `scene/`(现有仅 board/character/fx/ui)。 - -| 消费常量(草案,实现批落 `UiKit`) | 资源路径 | 可点 | -|---|---|---| -| `TEX_CAMP_BG` | `res://assets/art/scene/scene_camp_bg.png` | 否 | -| `TEX_CAMP_GATE` | `res://assets/art/scene/scene_camp_gate.png` | 是 → 冒险 | -| `TEX_CAMP_FORGE` | `res://assets/art/scene/scene_camp_forge.png` | 是 → 锻造工坊 | -| `TEX_CAMP_CHEST` | `res://assets/art/scene/scene_camp_chest.png` | 是 → 秘宝匣 | -| `TEX_CAMP_NOTEBOOK` | `res://assets/art/scene/scene_camp_notebook.png` | 是 → 生涯记录 | -| `TEX_CAMP_DUMMY` | `res://assets/art/scene/scene_camp_dummy.png` | 是 → 天赋树 | -| `TEX_CAMP_BOARD` | `res://assets/art/scene/scene_camp_board.png` | 是 → 图鉴(占位态) | -| `TEX_CAMP_CAMPFIRE` | `res://assets/art/scene/scene_camp_campfire.png` | 是 → 离开营地 | -| `TEX_CAMP_BED` | `res://assets/art/scene/scene_camp_bed.png` | 否(承载件) | - -装载一律 `UiKit.load_tex`(素材不入 git,缺位要有回退),**禁 preload**(asset-path-map §2)。 - -> **状态(2026-10-23)**:本节命名与 `game/assets/art/scene/` 子目录**已随文档批写入 `asset-path-map` §3**(commit `47907625`),本节与该文件互为一致;常量 `TEX_CAMP_*` 仍待实现批落码。 - ---- - -## 5. 样张验收判据(QA 回头照这张表判) - -| # | 判据 | 怎么判 | -|---|---|---| -| **Y1 色数** | ①**单张 PNG ≤32 色**(像素域硬闸,不变);②色板按 **§9⑥ 乙口径**:语义/UI token 48 不动,**每屏一套环境子板 ≤32 色、允许跨屏不共享** | `palette_check.py <目录> --baseline <基线目录>` + `standee_asset_check.py`;超了走「换色合并」,**禁加色绕行** | -| **Y2 色域** | 吸色全扫 **无 HSV 300°–345°**(禁紫/洋红);主色域 = 烛光黄 `#F6C667` × 木色 `#8A5A34` 暖色相,中等饱和(饱和 ≤0.55) | 脚本吸色统计;建议暖色相像素占比判据由作者定一档 | -| **Y3 新色双门** | 新增色仍过两门:① 不占语义色段(红只说危险/金只说收益/蓝只说己方)② 与既有任一色 RGB 三通道差 ≥8/255。**注**:按乙口径,新增的**环境色**归所属屏的环境子板,**不再挤占 48 token 额度** | `palette_check.py` | -| **Y4 明度档** | 三档带成立:信息面层(顶栏 HUD/提示名牌)> 世界中层(七物件)> 世界底层(地面/远景),层间灰度可分;**明度序在渲染合成空间(伽马)排档**——按 CIE L* 线性排会把序排反(本项目实测教训) | 截图转灰度抽测 + 作者目检 | -| **Y5 像素纪律** | 纹理过滤 Nearest;像素网格对齐、**硬边、无渐变、无抗锯齿**(放大 4× 目检无中间过渡色);无 1px 半透明毛边 | `standee_asset_check.py` + 放大目检 | -| **Y6 物件可辨性** | 转灰度后七件剪影**两两可辨**(不混);每件在 1280×800 上最小外接矩形 ≥64×64(笔记本可 ≥40×40,命中区外扩补到 ≥48×48);七件均带亮暖白描边(§5.1 轮廓通道,禁黑描边) | 灰度图目检 + 脚本量外接矩形 | -| **Y7 可点区域** | 七命中矩形**两两不相交**;不越出画面;**不侵入顶栏保留带(y ≤ 48)**;最小 64×64;中心点落在对应物件的不透明像素上且**不落在其它六件上**;**篝火按「命中矩形(火堆)」而非贴图矩形判定** | 脚本几何断言(实现批落探针) | -| **Y8 对位** | 合成图与 S2 选中方向稿逐件锚点误差 **≤2px**;移走任一物件背景不露洞 | 并排对比 + 脚本差分 | -| **Y9 风格一致** | 八张图 1× 像素密度一致(放大后色块大小相同)、描边同色同粗、色域同源 | 八件并排目检(机检不判气质) | -| **Y10 文字与结构** | 顶栏/HUD/提示名牌文字对直接底 **≥4.5:1**(大字 ≥3:1);围栏/门柱/石板等结构**必须是画出来的结构件**,禁以渐变/滤镜伪造(§8.5) | 对比度实测 + 放大目检 | - -**不机检、归作者目检的三项**:构图气质(纵深稿味道对不对)、七件一眼找得到(可辨性终审)、四态反馈手感。 - ---- - -## 6. 待裁清单状态(2026-10-22 更新) - -**已销号**: - -1. ✅ **渠道** = B 插画级新产(§1.2)|卡④ P1 销号 -2. ✅ **规格口径** = 沿用 `art-bible` §8.1/§8.2 既有裁决,营地不单开例外(§1.2 ⚠ 条) -3. ✅ **参照物** = 讨论阶段不需要,S1 开工前由我提醒(§9 ⑧) -4. ✅ **门扇形态** = 半开(§9 ①) -5. ✅ **篝火命中区** = 只含火堆不含火焰;火焰动效本次不谈(§9 ②) -6. ✅ **顶栏** = 一行量、高 48px、浮层覆盖、素材仍 1280×800(§9 ⑤⑦) -7. ✅ **S0 布局坐标** = v3 已目检接受(§2.5)——后续改动须显式提出,会连带改对位/命中区断言 -8. ✅ **色板口径** = 乙 · 分层(§9 ⑥) - -**仍待裁 / 待补**: - -1. ~~顶栏形态~~ ✅ 已定=全宽窄条 48px(§9 ⑦) -2. ~~名牌文案七条~~ ✅ 已定(§9 ③) -3. ~~门洞远景画不画小路~~ ✅ 已定=画(§9 ①) -4. ~~色板加不加新色~~ ✅ 已定=允许加;额度不足时呈报作者压缩(§9 ⑩) -5. ~~禁用态给不给~~ ✅ 已定=给,仅锻炉与宝箱,表现=变暗+灰度(§9 ⑨) -6. **篝火「命中矩形」的具体数值** —— 规则已定(只取下半=火堆,上半=火焰只展示),**数值归实现批按成图裁切定** -7. ✅ **P5 落文的文档部分已于 2026-10-23 执行完毕**(§11,commit `47907625`):camp.md 整份重写、art-bible §2/§2.8/§4.1/§6.2/§7.5/§7.6 改版。**剩余=代码侧**(`UiKit.TEX_CAMP_*` 常量与落码) -8. ✅ ~~**§8 提示词草稿**~~ → **已由 §13 取代**:旧稿被删(与已定裁定冲突),**新提示词 v2 已按全部定稿裁定重新起草**。 -9. **下一步=S1 出方向稿**(作者跑生图)→ S2 作者选划 → 反馈改词 → 再出。当前等作者的预览图。 - ---- - -## 9. 讨论裁定记录(2026-10-22) - -> **性质**:讨论段决定,尚未落实任何素材与代码。**作者 2026-10-22 令=先写进本文档、暂不提交**,待本轮议题全部结束后统一处置(会话内容不留存,只认文件)。 -> 已并入上文的:渠道=B(§1)、规格=沿用既有口径(§1.2)、坐标=v3(§2.5)、篝火贴图/命中两分(§2.5 末)。 - -| # | 裁定 | 连带影响 / 待办 | -|---|---|---| -| ① | **门扇=半开** | 与既有结构一致(背景画门柱+门洞、门扇叠在洞上)。**已定(2026-10-22)**:门洞=营地大门的门洞(半开门扇透出处),**画一条通向远处的小路**,暗示「出去即冒险」 | -| ② | **篝火命中区只含火堆、不含火焰** | 篝火=唯一「贴图矩形 ≠ 命中矩形」的件,坐标表须两列表表达;**火焰动效本次不谈**(作者令),过渡档=静态一张 | -| ③ | **悬停反馈=轮廓亮边 + 浮动 + 名牌**(2026-10-22 作者更正:**不是整体提亮**,是给轮廓加亮边) | 亮边=按物件层 alpha 外扩 1px 派生(零手绘、零新素材);**浮动⚠必须整像素吸附**(每帧 `round()`,否则 Nearest 下边缘抖/糊,须写成验收项),幅度 **±2px、周期约 0.5s**(作者认可);**名牌**=物件**下方 8px 水平居中**(作者认可),字号走 §7.4 tooltip 档 14px、对比 ≥4.5:1、不压物件本体;**文案七条**:开始冒险/锻造工坊/秘宝匣/生涯记录/天赋树/奖励格图鉴/离开营地(取自现役界面名) | -| ⑨ | **禁用态=变暗 + 调灰度**(2026-10-22 作者裁) | ⚠ **作者特许破除 `art-bible` §2 明度禁令**(原「不动明度」、§6.2「亮起只走饱和/色相」)与 §7.6 按钮禁用态(α0.45 幽灵化)——**本项须登记为反哺点,由文档批改条款,不私下改规矩**。适用范围:**只有锻炉(锻造工坊)与宝箱(秘宝匣)两件**会进入禁用态(依据 `camp_overlay_view.gd:111`「🔒 锻造工坊未开放」、`:25-31` 两柜台锁定态行);**其余五件恒可点**;布告板(图鉴)是内容冻结未激活,**不是锁定**,不做禁用态 | -| ⑩ | **色板:允许新增颜色**(2026-10-22 作者裁) | 过渡档**不再一律压回既有色板**;按 §9⑥ 乙口径加**环境色**(归每屏环境子板)。**额度不够时呈报作者**,由作者决定如何压缩既有色 | -| ④ | **篝火「离开营地」必须二次确认** | ⚠ **改判**:推翻卡④ §9-4 既有代拍板(原「默认直回」),须登记为反哺点;实现复用**删档二次确认**的既有形态(澄清⑤裁决 3),零新控件 | - -| ⑤ | **顶部信息只保留「一行的量」;顶栏高度=48px**(2026-10-22 作者裁,重要) | 内容 = 钥石图标 32px(64 源 ×0.5 显示档,asset-path-map §2)+ 余额文字一行(FS_BODY 16);**不加第二行、不放大按钮**。48 = 32 + 上下各 8,8/16 整数倍、图标在条内居中(备选 44=与现役 AP 条同高,未采用)。作废的 64/96/80/72 见本节末留痕 | -| ⑥ | **色板=乙 · 分层口径**(2026-10-22 作者裁) | 语义/UI token 48 不动;**新增「每屏环境子板」:每屏一套 ≤32 色、允许跨屏不共享**;单张 PNG ≤32 色这条不变。落实需走文档批改 `art-bible` §4.1 措辞(反哺点) | -| ⑦ | **顶栏=浮层覆盖在画面上层,形态=全宽窄条,高 48px,素材仍 1280×800,不挤压、不缩放、不变形**(2026-10-22 作者裁) | v3 坐标零影响(最高物件大门 y=250)。禁区判定:全宽 `y ≤ 48` | -| ⑧ | **参照物=讨论阶段不需要**(2026-10-22 作者裁) | 由 Agent 在「开始生成美术素材(S1)」**之前**提醒作者;不是本讨论阶段的阻塞项 | - -**待办**:~~§8 提示词草稿~~ **已整段删除**(2026-10-22 作者令:草稿与已定裁定冲突,后续专门讨论生成时重新起草)。 - -**已作废的推导(留痕)**:曾按「占屏高百分比」比照 SNES《超级马里奥世界》(40/224=17.9%)与 Deltarune 幻想主机(16/144=11.1%),推出顶栏 96px——**作者否决**:取样太古老、像素尺度不同、无参考价值。改用近代像素 Roguelike/幸存者 like 后作废该结论(详见上表 ⑤)。 - -## 11. 既有条款修订清单(2026-10-22 核定,**2026-10-23 已执行**) - -> **执行结果**:worktree `D:/code/g-plan2-camp-art-doc`(分支 `camp-art-doc-20261023`)→ commit `569db112` → **`git merge --no-ff` 合回 master = `47907625`**;**文档域闸 `tools/run_all_gates.sh --docs` 全绿**(闸况与基线一致、无新增红;过程中修掉 1 处死链:`HUD框架` 指路 camp.md 应为 `../../ux/camp.md`)。主工作区 status CLEAN。 -> -> 本轮讨论的裁定与 `design/` 既有条款冲突者共 **10 项**(另加 GDD 侧「柜台」用词 9 处,以及补扫出的 `元进度.md` 5 处、`HUD框架.md` 2 处)。作者令:**逐条定改法 → 随本会话文档一并修改并提交**(走 worktree,不碰主区)。下表为**改法记录**,条文已按此改完。 - -| # | 条款 | 改法(作者 2026-10-22 裁) | 状态 | -|---|---|---|---| -| 1 | `art-bible` §2 头注明度禁令 | **缩窄范围**:删去「状态表达」这个禁止项,只保留「情绪表达」;**不设例外条款** | ✅ 措辞已定,见下 | -| 2 | `art-bible` §2.8 菜单与元进度 | **删旧写新**:「营地三柜台一字排开」整句换成七物件可点场景图 | ✅ 措辞已定,见下 | -| 3 | `art-bible` §4.1 色板 | **新增一款**(原文不动):色板分层=语义/UI token 48 + 每屏环境子板 ≤32 | ✅ 措辞已定,见下 | -| 4 | `art-bible` §6.2 营地场景 | **整条重写**:七物件场景图 + 分层 + 四态 + 顶栏 | ✅ 措辞已定,见下 | -| 5 | `art-bible` §7.5 营地界面 | **整条重写** | ✅ 措辞已定,见下 | -| 6 | `art-bible` §7.6(一)禁用态 | **加一句注**:本条管 UI 按钮,场景物件另按 §6.2 | ✅ 措辞已定,见下 | -| 7 | `camp.md` | **整份重写**(场景图 + 七物件点选 + 顶栏 + 叠层) | ✅ 措辞已定,见下 | -| 8 | `asset-path-map` §3 | **加一行**:新增 `scene/` 子目录 | ✅ 措辞已定,见下 | -| 9 | `art-assets-checklist` §3.5(含 :175) | **整条重写**为营地场景图 | ✅ 措辞已定,见下 | -| 10 | `art-status-checklist`:32 | 条目名改「营地场景图」,依据改指 §6.2 | ✅ 措辞已定,见下 | -| 附 | GDD 侧「柜台」用词 9 处 | **直接更正为新的营地说法**(作者令:不必逐条裁) | ✅ 措辞已定,见下 | - -### 第 1 条 · `art-bible` §2 头注 - -**现行**:「`禁令保留`:明度变化仍禁止用于**状态表达与情绪表达**——状态区分只允许**色相、饱和、运动、元素**四手段;roguelike 失败重开,世界无光暗记忆;Darkest Dungeon 式压暗仍在 §9.2 反面清单。」 - -**改为**:「`禁令保留(2026-10-22 缩窄至情绪域)`:明度变化禁止用于**情绪表达**——画面不得靠压暗/渐晕阴沉下来;roguelike 失败重开,世界无光暗记忆;Darkest Dungeon 式压暗仍在 §9.2 反面清单。**状态表达不受本禁令约束**:状态可用明度、色相、饱和、运动、元素任一手段承载。」 - -(同段其余不动:明度三档带分层、空间纵深/光照氛围/形体塑造允许域、§4.2 类型微光明度梯度一句,全部原样保留。) - -**影响核查**:现有冒烟断言里编码「禁用态 α0.45」的只有 UI 按钮(`smoke_all.gd:6526/6551/6563`,归 §7.6),**没有**任何断言编码「明度禁用于状态」→ 本条改动不牵动现役断言。 - -### 第 2 条 · `art-bible` §2.8 菜单与元进度(目标措辞) - -**现行(最后一行)**:`承载元素`:营地三柜台(属性锻造/秘宝匣/奖励格图鉴)在烛光下一字排开——场景构成、柜台亮光与钥石呈现位连同系统语义边界一并见 §6.2 - -**改为**:`承载元素`:**一张可点击的营地场景图**——远景天空与远山,中景围栏与半开的营地大门,近景中央的篝火,左侧锻炉铁砧,右侧床铺与宝箱、床边的笔记本,另有木桩与挂在围栏上的布告板;点画面里的物件进入对应界面(冒险/锻造工坊/秘宝匣/生涯记录/天赋树/图鉴/离开营地)。钥石余额常驻画面顶部的一行小 HUD 栏。场景构成、七物件绑定与呈现位见 §6.2 - -(本条其余四行——主情绪「可靠的营地感」、色彩性格「全作最暖烛光黄与木色」、氛围形容词、能量 3/10——**全部保留不动**。) - -### 第 3 条 · `art-bible` §4.1 色板(新增一款,原文不动) - -在 §4.1「色板增量纪律」之后**新增**一款(原文全部保留): - -> **色板分层(2026-10-22 作者裁)**:色板分两层管理——① **语义/UI token 板**:全作共享,硬上限 **48 色**,管 UI 语义色、墨色、材质色,跨屏恒定;② **场景环境子板**:**每屏一套,≤32 色,允许跨屏不共享**(环境色=天空、地面、植被、石材、火焰等随场景走的颜色)。新增环境色仍须过两道门(§4.2 语义检查 + 与既有任一色 RGB 三通道差 ≥8/255),但**不占用 48 token 额度**;不过门照旧走「换色合并」,**禁加色绕行**。单张 PNG 的像素域色数上限 **≤32 色**另由 `standee_asset_check` 执法(像素域口径,与本表 token 口径互不干扰)。额度不足时呈报作者,由作者决定压缩或合并既有色。 - -### 第 4 条 · `art-bible` §6.2 营地场景(整条重写) - -**现行**:三柜台一字排开 + 柜台=石板圆角容器 + 「亮起只走饱和/色相,不动明度」+ 事实源边界。 - -**改为**: - -> ### 6.2 营地场景 -> - **情绪与色域**:承载 §2.8——全作最暖:烛光黄 `#F6C667` × 木色 `#8A5A34`(§7.2),中等饱和,无棋盘式高对比。 -> - **场景构成**:一张可点击的营地场景图(1280×800,与工程档同幅面)。远景=天空与远山;中景=木围栏与**半开的营地大门**(门洞内一条通向远处的小路);近景=中央篝火、左侧锻炉铁砧、右侧床铺与宝箱、床边的笔记本,另有木桩与挂在围栏上的布告板。七个可点物件的功能绑定归 `camp.md`,本节只定画法。 -> - **交付形态**:**背景 1 层 + 七个物件各 1 层**(床铺为承载件、不可点),共 8 张透明 PNG + 一份坐标表(贴图矩形/命中矩形/z 序)。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。 -> - **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。 -> - **钥石余额**:常驻画面顶部的一行小 HUD 栏(高 48px,**浮层覆盖,不挤压画面**)。 -> - **事实源边界**:解锁条件/价格/存档写入归元进度 GDD 与 `MetaProgression`;素材命名与路径归 `asset-path-map`;清单登记归 `art-assets-checklist` §3.5。 - -### 第 5 条 · `art-bible` §7.5 营地界面(整条重写) - -> - 营地界面=**一张可点击的场景图 + 七物件点选**:点画面里的物件进入对应界面(冒险/锻造工坊/秘宝匣/生涯记录/天赋树/图鉴/离开营地)。场景图的画法、分层与四态见 §6.2;色域走 §7.2 最暖一档;钥石余额常驻顶部一行小 HUD 栏。界面视觉终稿以表现层样张过审为前置(§1.4 整屏样张闸)。 - -### 第 6 条 · `art-bible` §7.6(一)按钮禁用态(加一句注,原文不动) - -在「禁用 = 本族底 + α0.45 幽灵化(甲案)」条目末**追加**: - -> (注:本条管 **UI 按钮**;营地场景图里的**物件**禁用态另按 §6.2——降明度 + 去饱和,不走 α 幽灵化。) - -### GDD 侧「柜台」用词清理(一并改,共 9 处) - -| 文件:行 | 现行 | 改为 | -|---|---|---| -| `术语表.md:43` | 秘宝匣|营地**柜台之一**:… | 秘宝匣|营地**功能界面之一**(场景图里点**宝箱**进入):… | -| `术语表.md:56` | 锻造工坊|营地**四柜台之一**:… | 锻造工坊|营地**功能界面之一**(场景图里点**锻炉·铁砧**进入):…(顺带消除 43/56 条"三柜台 vs 四柜台"自相矛盾) | -| `02-系统清单.md:82` | camp.md|营地覆盖层 UX spec:**三柜台呈现**、钥石余额… | camp.md|营地 UX spec:**可点击场景图与七物件点选**、钥石余额、各功能界面入口… | -| `08-Alpha版本标准.md:106` | 营地(天赋树/锻造工坊/秘宝匣/图鉴)…锻造**柜台**占位面板注已解除;**柜台贴图**占位… | 营地(**场景图** + 天赋树/锻造工坊/秘宝匣/图鉴/生涯)…**场景图与七物件点选**随营地交互重做列入 Alpha… | -| `08-Alpha版本标准.md:200` | …**营地柜台贴图**已随营地交互重做列入 Alpha | …**营地场景图**已随营地交互重做列入 Alpha | -| `05-不做清单.md:22` | …首批已落地(营地**三柜台**/钥石/跨局注入) | …首批已落地(**营地**/钥石/跨局注入) | -| `01-核心循环.md:156` | …`unlock_requires` 字段 + **工坊柜台** + 里程碑分档发槽 | …`unlock_requires` 字段 + **锻造工坊界面** + 里程碑分档发槽 | -| `03-内容规模.md:59` | 扩**柜台**或改定价结构走… | 扩**锻造路线**或改定价结构走… | -| `ux/level-clear.md:64` | …**营地柜台全量** | …**营地界面全量**(禁入语义不变) | - -(`architecture/code-architecture.json:122` 与 `.html:5273-5284` 的「商品卡·三柜台」是**脚本生成的架构图节点副标签**,随实现批代码变更重生成,不在本次文档批改。) - -### 第 7 条 · `camp.md`(整份重写) - -**现行**:通篇是「四柜台覆盖层 + 石纹全屏底 + 三柜台列 + 底栏关闭钮 + 秘宝匣柜台呈现细则」。整体作废,替换为: - -```markdown -# 营地场景 UX spec(camp) - -> 状态:v2.0(2026-10-22 营地交互重做美术设计段;取代旧「四柜台覆盖层」形态) -> 事实源:本 spec(呈现)+ [元进度](../systems/跨局循环/元进度.md)(机制) -> 美术画法:[art-bible](../art/art-bible.md) §6.2/§7.5;素材命名与路径:[asset-path-map](../art/asset-path-map.md) -> 相邻:[level-map.md](level-map.md)(主菜单语境) - -## 定位 -营地=存档内的局外枢纽(存档语境可达,冒险进行中不可达)。形态=**一张可点击的营地场景图**:画面里有篝火、锻炉、床铺等物件,点物件进对应界面。**不是按钮列表式 UI。** - -## 场景构成与七物件绑定 -| 物件 | 进入 | 备注 | -|---|---|---| -| 大门(半开,门洞内一条通向远处的小路) | 冒险 | 点大门永远先出确认:有未完冒险=三出口(继续上一段/开始新冒险/取消);无=是否开始新冒险 | -| 锻炉·铁砧 | 锻造工坊 | **未解锁=禁用态**(降明度+去饱和) | -| 宝箱 | 秘宝匣 | **未解锁=禁用态**(同上) | -| 床铺旁笔记本 | 生涯记录 | 生涯页返回钮文案**禁含「营地」字样**(`ui_struct_probe.gd` nojump 禁词表) | -| 木桩 | 天赋树 | | -| 布告板 | 奖励格图鉴 | 内容冻结未激活,点进看占位——**不是禁用态** | -| 篝火 | 离开营地回主菜单 | **必须二次确认**;命中区只含火堆、不含火焰 | -| 床铺 | — | 承载件,**不可点** | - -纵深=远景天空与远山/中景围栏与大门/近景篝火与左右物件(作者纵深稿)。 - -## 点选反馈(根态) -悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附)+物件**名牌**(物件下方 8px 居中,FS_HINT 14,对比 ≥4.5:1);按下=位移 1px;禁用=降明度+去饱和;已解锁=常态。**四态零新素材**(全部程序化)。 -命中区:七件两两不相交、不越出画面、**不侵入顶栏禁区(y ≤ 48)**。 - -## 顶栏 -钥石余额常驻画面顶部一行小 HUD 栏(高 48px、全宽窄条、**浮层覆盖在场景图上层,不挤压画面**)。刷新入口=营地刷新单口(卡⑤同口挂接)。 - -## 叠层与开合 -各界面开合走模态栈单口,层序入 `LAYER_CONTRACT`。**承载形态(独立全屏页 vs 单一内页切换)与叠层规则归卡④ §9 代拍板域,本 spec 不预设值**;派生规则:独立全屏页=场景根隐藏/单一内页切换=场景根留底(「缩放虚化」为第三形态,禁批内自选)。ESC 浮窗(返回主菜单/设置/退出游戏)归卡⑤。 - -## 口径 -- 呈现数据源=MetaProgression 只读投影经组合根喂入;本层不持有系统资源、不算价。 -- 「最近冒险」条带已撤下(卡④ Q4=甲),逐局历史回看归生涯。 -- 旧「秘宝匣柜台呈现细则」随形态作废;秘宝匣界面内部呈现(解锁面+同调装配段)保留原条款,迁本文件附录暂管,待该界面立独立 spec 后迁出。 -``` - -### 第 8 条 · `asset-path-map` §3(加一行) - -| 子目录 | 内容 | 现役 | -|---|---|---| -| `scene/` | **场景图**(背景层 + 可点物件层;2026-10-22 新增,营地场景图首批) | `scene_camp_bg`/`_gate`/`_forge`/`_chest`/`_notebook`/`_dummy`/`_board`/`_campfire`/`_bed`(九张,床铺=承载件不可点) | - -### 第 9 条 · `art-assets-checklist` §3.5(整条重写,含 :175 子句) - -> ### 3.5 营地场景图(2026-10-22 重写;原「营地与元进度件·三柜台」条目作废) -> - **要什么**:营地场景图 9 张——`scene_camp_bg`(背景)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_bed`(承载件)。钥石顶栏图标沿用现役 `icon_keystone`。 -> - **来源/规格**:**✦ 插画级**(作者自跑远程生图管线);烛光黄 `#F6C667` + 木色 `#8A5A34`(art-bible §6.2);2× 源档出图、最近邻降采样到 1280×800;后处理=抠底/降采样/色板量化/描边统一。**每张出图须登记模型名+分辨率+seed+对话/日期**。 -> - **排期**:营地交互重做**美术自立批**(不占迭代位;UI 贴图重构批已搁置)。终稿落 `game/assets/art/scene/`,消费常量 `UiKit.TEX_CAMP_*`。 - -(`:175` 原句「营地件(3.5)归 UI 贴图重构批」→ 改为「营地场景图(3.5)归营地交互重做美术自立批」。) - -### 第 10 条 · `art-status-checklist`:32 - -`| 营地与元进度件 | ◐ | art-bible §4.4 |` → `| 营地场景图 | ◐ | art-bible §6.2 |` - ---- - -## 12. 营地场景 · 分层元素描述表(2026-10-23) - -> 用途:跳过外部参照物后的**替代输入**——先把"脑里的画面"落成文字,既是给作者确认,也是写提示词的直接依据。远景/中景/近景三层齐全。 - -**时间**:**白天(晴朗)**——推导依据:① 美术基调「明亮轻快」;② §2 明度禁令缩窄后**情绪/氛围仍禁压暗**,夜间必然压暗即违规;③ 篝火作营地炊火,白天点着成立,不冲突「全作最暖」。 -**天空元素**:**不画太阳**(§3.4 焦点预算:首焦唯一,背景禁构成完整凸形、禁抢焦);允许 **1–2 朵极简扁平云**,低对比,只为天空留层次。 - -### A. 背景层(1 张,1280×800,不透明全幅) - -**层次分带**:远景=画面上部;**中景自底部往上约 2/3 处起**(≈ y 267);再往下全部是近景。 -**近景覆盖中景(2026-10-23 作者口径)**:中景围墙**大部分只是背景板**(与远景同为填空),**允许近景物件放大后压住、遮住围墙**;**唯一例外=中间门洞必须留空可见、不被任何物件遮挡**(门是可点件)。 - -| 层次 | 元素 | 形态描述 | 画面位置 | -|---|---|---|---| -| 远景 | 天空 | 平涂,**冷调灰白、微带蓝灰**,禁米黄/奶黄倾向;**顶部约 48px 保持空旷**(顶栏覆盖);无太阳,可有 1–2 朵极简扁平云 | y 0–200 | -| 远景 | 远山 | 2–3 层低矮起伏**剪影**,越远越淡(明度走**世界底层档**);**不画远树**——树形并入山轮廓 | y 180–260 | -| **中景** | **木围墙** | 横贯全宽的**密排竖木桩墙**:木桩一根挨一根无缝、**桩顶削尖**、完全挡住外面;无横木、不透缝;**中段留缺口**给大门 | y ≈ 267–310;缺口 x 520–760 | -| **中景** | **大门(门柱 + 门洞)** | 缺口两侧各一根粗木柱,柱顶略高出围栏;门洞内透出远景,一条向远处收缩的土路(暗示"出去即冒险") | 门柱 x ≈ 500–520 / 760–780;门洞 y 267–310(原 300–500 随分带作废)| -| 近景 | 地面 | **干实裸土**;硬边色块,无渐变;**近景内不画任何草** | y 310–800 | - -### B. 物件层(8 张,透明 PNG) - -| 层次 | 物件 | 形态描述(识别特征) | 位置/大小(v3 坐标) | 可点 | -|---|---|---|---|---| -| **中景** | 大门**门扇** | **两扇半开**的木门,向外敞开一条缝;厚木板 + 横撑 + 深色铁件(门柱与门洞在背景层) | `(520,250,240,220)` | 是 → 冒险 | -| **中景** | 布告板 | 挂**在围栏上**的木板,钉 2–3 张**空白**纸,纸角微翘 | `(845,330,130,140)` | 是 → 图鉴 | -| 近景 | 锻炉·铁砧 | 石砌炉体 + 短烟囱,炉口透橙光;炉前一具深色铁砧(矮墩 + 平顶 + 一角外伸);**两件纵向紧邻、可互相遮挡,读起来是一个物件**(2026-10-24 作者口径);**主体落在近景地面**,顶部略高于中景分带线 | `(40,420,240,240)` | 是 → 锻造工坊(**可能禁用态**) | -| 近景 | 木桩 | 单根木柱立在地面,中段缠草绳/布垫,顶端略圆 | `(340,520,120,180)` | 是 → 天赋树 | -| 近景 | 篝火 | 灰石围成一圈,中间交叉架柴;上方橙黄火焰(**上半=火焰只展示,不可点**) | `(560,560,160,160)` | 是(**仅下半火堆**)→ 离开营地 | -| 近景 | 帐篷 | 帆布帐篷 + 矮木架 + 一侧掀起的门帘(2026-10-24 作者裁:床铺换代);**体量大于原床铺,尺寸待重定** | `(958,520,300,170)`(待重定) | **否**(承载件) | -| 近景 | 宝箱 | 闭合的木箱,深色铁箍包边,正面一个小锁扣 | `(1085,700,130,90)` | 是 → 秘宝匣(**可能禁用态**) | -| 近景 | 笔记本 | 摊开的小册子,平放在靠床头的位置,露出纸页 | `(818,690,100,80)` | 是 → 生涯记录 | - -> **中景只有两样东西:木围栏(背景层)+ 营地大门(门柱门洞在背景层,门扇是物件层)**,另加挂在围栏上的布告板(物件层)。其余全部属于近景。 -> -> **待裁(2026-10-23)**:中景带按 2/3 分带收窄到约 43px 后,门扇 `(520,250,240,220)`(220px 高)远高于围墙带,门与墙的高宽关系需作者重定(门洞须留空、不可被近景物件遮挡)。 - -### C. 全画面通用约束 - -- **视角**:正侧平视(orthographic),所有物件同一侧角,**无透视变形** -- **光照**:均匀,无长投影;每个物件正下方**只一个小的深色接地影**(不是情绪压暗) -- **色域骨架**:**指路**——营地色彩与氛围的唯一依据 = `reports/提案-营地色彩与氛围脚本-2026-10-23.md`(本节**不复述色值**,避免双处漂移);物件本色沿用 §4.1 既有三色:烛光黄 `#F6C667`/木色 `#8A5A34`/掩尘 `#C9AF83` -- **禁用**:无文字/字母/数字/水印;无边框;无角色与生物;无紫或洋红;无渐变、无抗锯齿;无暗角渐晕 - ---- - -## 13. S1 方向稿 · 生图提示词 v7(2026-10-24 定稿,取代 v6) - -> 依据=§12 分层元素描述表(已确认)。**整段可贴,不需拼装、不需读其他文件。** - -``` -Pixel art style. True pixel art game scene drawn with chunky square pixels, strict pixel grid alignment, hard edges, no anti-aliasing, no gradients, flat colors only, a limited palette of about 24 colors, retro 16-bit look, Aseprite style, bright cheerful daytime fantasy, all ages, flat side view, orthographic, no perspective distortion, every object drawn from the same side angle. Wide horizontal composition, 16:10 aspect ratio, showing a small adventurer camp on open dry bare ground in clear daylight, dry and settled and open in feeling. COLOR SCRIPT — cool recedes, warm advances: the large areas of the picture, meaning the sky, the distant hills and the ground, are COOL, pale, desaturated and low in contrast so that they sit back; warm color appears only on the small foreground objects, meaning the fire, the woodwork and the stone; the campfire flame is the single most saturated thing in the picture; the picture must never look golden, amber or yellow overall. ATMOSPHERIC DEPTH: every plane that is farther away is lighter, closer to the value of the sky, cooler, lower in contrast and simpler in detail, while the nearest plane is the darkest, the warmest and the highest in contrast. SKY (top of frame): the lightest thing in the picture, flat pale cool off-white with a faint blue-grey tint, no yellow or cream tone, no sun anywhere; the very top strip of the frame stays calm and empty with nothing in it, and it is only a shallow strip about one sixteenth of the frame height; at most one or two extremely simple flat low-contrast clouds. FAR DISTANCE: two or three layers of low rolling hill silhouettes in pale cool blue-grey, each farther layer lighter, cooler and lower in contrast than the one in front, fading towards the value of the sky, no trees, no individual foliage; the foot of the hills is cut off and hidden behind the wall, so there is no visible horizon line and no distant ground band, no distant grass or earth strip below the hills — between the hills and the wall there is nothing but the wall. MIDDLE GROUND: the base line where the logs meet the ground sits at two thirds of the frame height measured from the bottom edge, so the lower two thirds of the frame is foreground ground and only the upper third holds the hills, the sky and the clouds; at that height runs a wooden palisade wall across the whole width of the frame, built from closely spaced vertical logs standing side by side with no gaps between them, every log cut to a sharp point at the top, a solid barrier that completely blocks the view of the outside — no horizontal rails, no see-through gaps, no ranch-style post-and-rail fence; the wall is painted in a muted, greyed wood brown that is cooler and less saturated than the foreground woodwork, so that it sits back; in the middle of the wall one wide gap holds two thick gate posts slightly taller than the wall, and between them an opening showing a dirt path running away into the distance; in that opening hang two wooden gate leaves, half open, tilted outward, each made of thick planks with a cross brace and dark iron fittings; the gate opening stays completely clear, with nothing drawn in front of it. FOREGROUND GROUND: the darkest area of the picture, dry packed bare earth in a neutral desaturated grey-brown, never golden, amber or warm yellow, hard flat color blocks, hard edges, no gradient, no grass, no grass tufts, no weeds and no plants of any kind anywhere in the foreground. Seven separate objects stand on this ground, and each one is drawn LARGE — the foreground objects are big enough to overlap and cover long stretches of the palisade wall behind them, because the wall is only a backdrop and most of it is meant to be hidden, except the gate opening in the middle which must stay fully visible and unobstructed; the seven objects never overlap, touch or hide one another, except that the anvil may overlap the forge because the two are one single object: on the left side, one single forge object made of two tightly joined parts standing close together with only a small vertical offset: a stone forge with a short chimney and a warm orange glow in its mouth, and directly in front of it a dark iron anvil on a low block, the anvil standing close against the foot of the forge so the two read as one object rather than two separate things, the anvil allowed to overlap and be partly hidden behind the forge; this forge-and-anvil object is the largest object on the left, its left edge close to the left border; to its right and slightly lower, a single wooden training post wrapped with a straw rope pad around its middle; at the bottom center, a campfire made of a ring of grey stones around crossed stacked logs with a warm orange-yellow flame above them; on the right side, a canvas tent with a low wooden frame and a fabric flap tied back to one side, the largest object on the right, its right edge close to the right border; below and slightly in front of the tent, a small closed wooden treasure chest with dark iron bands and a small lock plate; to the left of the chest, beside the tent, a small open journal lying flat on the ground, the smallest object in the scene; hung on the wall on the right, a wooden notice board with two or three blank pinned papers, no writing on them. The objects are the only warm things in the picture: candlelight yellow #F6C667 for the campfire flame and its highlights, and this flame is the single most saturated area of the whole picture; wood brown #8A5A34 for every wooden object; warm tan stone #C9AF83 for the forge and the stones; medium saturation, even daylight, no long shadows, and only one small dark oval contact shadow directly beneath each object. Every object has a thin warm cream outline separating it from what is behind it. Do not add any of the following: realistic, photorealistic or 3D rendering; painterly brushwork, smooth anti-aliased lines, gradient or dithered shading, glossy highlights; black or heavy dark outlines; blur or compression artifacts; a vignette, dark corners, or any mood darkening; night, dusk, moon, stars, sunset or sunrise light; a sun or any light source drawn in the sky; a visible horizon line, a distant ground band or any distant grass strip below the hills; trees, forests or foliage in the distance; grass, grass tufts, weeds or plants in the foreground; a ranch-style post-and-rail fence, a see-through fence, flat-topped fence posts or horizontal rails; any warm, golden, amber or yellow cast on the sky, on the hills or on the ground; any purple or magenta anywhere; any text, letters, numbers, watermark, signature or logo on any surface or paper; any frame, border, panel, arrow or UI element; any characters, people, creatures or animals; any object not listed above. -``` - -### 出图设置(平台侧,不在提示词里) - -| 项 | 设什么 | -|---|---| -| 张数 | **3 张,各开一个独立对话**(同对话续写=修图,不是变体) | -| 分辨率 | 平台能选的**最大 16:10**(理想 1536×960 或 1280×800;不小于 1024×640) | -| seed | 可取则取 | -| 参考图 | 贴**项目自己的定稿素材**(主角立绘/瓦片纹理)作风格锚 —— 见下方追加句 | -| 登记 | 每张记 **模型名 + 分辨率 + seed + 对话/日期**,随图存 `artwork/2026-10-23-营地场景/direction/`;缺登记不入遴选 | - -### 贴参考图时的追加句 - -``` -Style reference: the attached image is this game's own finished pixel art — match only its rendering style, the same pixel density, flat shading, thin warm cream outline and warm limited palette. It is a style reference only: do not copy its character, gear or props, and do not put any character into the scene. -``` - ---- - -## 14. 本轮确立的协作纪律(2026-10-22~23,作者逐条立) - -> 这些是**本轮会话里立下的工作方式**,此前只存在于会话与记忆中,现固化于此,供后续批与后续会话照做。 - -1. **会话不留存**:每次新会话只读得到文件。**一切决定必须落文档**,不能"说过了就算"。 -2. **无证据的推荐值不采纳**:给任何推荐值前先自检是否有项目文档/代码出处。**证据在会话里举给作者判断即可,不写进文档**(作者原话:「证据是用来干什么的?是给我判断用的…你写到文档里面给谁看」)。 -3. **布局口径(作者原话)**:说「两边太空、往两边移」=**只把最左、最右那两个组件推向边缘**;**不靠边的绝不允许贴边**,它们按离中心的距离成比例外移(最外移 80、第二圈 40、中轴 0),**组件尺寸不变**,拉开的是间隔。 -4. **作者说了算**:改既有规矩时,Agent 的义务=**指出该裁定破了哪条既有规矩 + 登记反哺点**,由文档批改条款;**不反对、也不私下改规矩**。 -5. **焦点纪律**:本次会话的目标=营地场景图「**美术素材怎么生成**」。凡**不影响出图、不影响分层、不影响提示词**的实现侧事项(如五界面承载形态、叠层规则、屏壳改造),**在文档里引用该域、不预设值**,绝不端到作者面前当"待定项"。 -6. **能推导的直接定**:能从已定设计推出来的,**直接定值、报作者同意**;只有上下文里确实没定过的才问。不要把所有未决事项一股脑端上去。 -7. **陈旧概念一律删净**:重新设计就是要替换掉旧的;凡与新设计冲突的旧说法(如「三柜台/柜台」),**全部删干净、用新设计取代**,不逐条问"删还是改"。 -8. **方向稿先行**(卡④ Q8=甲):2~3 张低成本方向稿供选划,判完方向才精制。**外部参照物非必需**——风格锚用**项目自己的定稿素材**(比任何外部图都准),构图用纵深稿 + 坐标表。 - ---- - -## 7. 本次做了什么 / 没做什么(边界留痕 · 2026-10-23 更新) - -**做了**: -- 出图提示词 v2(§13)与分层元素描述表(§12) -- **文档批已执行并合回 master**:15 个文件,commit `47907625`;文档域闸 `--docs` 全绿(§11) -- 待办清单登记「营地五界面窗口化批」(优先级=绝对) -- 参照物(首轮 6 张)已判定不合格并整目录删除 - -**没做**: -- 未出图、未跑生图管线(等作者跑 S1) -- 未改 `game/` 任何文件、未写需求卡片、未编迭代号 -- 未做代码侧:`UiKit.TEX_CAMP_*` 常量与落码(归实现批) -- 旧条「每购得一件永久强化,对应柜台亮起一格暖光」随形态失效,**已随 §6.2 重写一并删除**(不再是候选事项) diff --git a/reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md b/reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md deleted file mode 100644 index 747483f8..00000000 --- a/reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md +++ /dev/null @@ -1,320 +0,0 @@ -# 需求卡片:Esc 浮窗与营地顶栏批(营地顶部小 HUD 栏 · Esc 三钮浮窗)· 营地交互重做卡⑤ - -- 版本:**v1.5(现行有效卡)**。留痕:Q1/Q2/Q3 均于 2026-10-18 裁定(甲/甲/甲,见 §10,已裁非待裁);卡④ 2026-10-31 重立、2026-11-01 修订为 v3.1,本卡随卡④ 代码波同行;2026-11-01 grilling+godot-master 双审后用户令修订(v1.4)——契约 9 新立、契约 3 谓词钉死、契约 4 浮窗自收、V4/V6 订正、死信约束改述、文件表补两件;2026-11-01 用户裁机检预算互斥停机呈报(v1.5)——浮窗句柄改落 `ui_camp_modals.gd` 子容器(卡⑥ 前置建件,本卡 T1 落第六枚),`ui_modals.gd` 类变量 14 不升(原「14→15 恰贴」句作废),契约 7 补寻址形态。 -- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:⑤裁决 9/10、④结构树语境、⑦切批原则⑤) -- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做五卡之五 -- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁) -- 开工门:U0(用户 `/iter` 发令)+ 零待裁点(Q1/Q2/Q3 已裁,见 §10;2026-11-01 双审零新增真待裁点)+ grilling 复核门过+ **卡④ 代码波落地后**(卡④ v3.1 现行有效卡、设计线闭合、开工门已裁断销号;本卡浮窗与 HUD 落在卡④ 新建的场景屏上,排期随卡④ 代码波之后,卡片本身有效) - -## 0. 前置依赖与并行性 - -- 前置卡④(营地场景图,v3.1 现行有效卡——2026-11-01 双审修订、开工门已裁断销号):Esc 浮窗的「返回主菜单」与顶栏 HUD 都落在卡④ 新建的营地场景屏上;卡④ 设计线已闭合(样张过审 2026-10-31+art-bible v3.31 §6.2)——本卡不可先于卡④ 代码波落地,排期随④ 之后;本卡自身零美术依赖(零新素材、裁决 9/10 已给全),设计前置检查通过,卡片有效。 -- **跨卡接口(保持既有名,不改名)**:①场景屏顶栏位(卡④ T2 预留;卡④ v3.1 挂接签名=`camp_scene_view.gd set_hud_band()`,「卡⑤ 填值」);②**营地刷新单口**(卡④ T3 定义;卡④ v3.1 定名 `camp_refresh_bus.gd` 的 `CampRefreshBus.refresh(camp_data: Dictionary) -> void`)——本卡 HUD 刷新挂该单口,**非已退役的 `refresh_camp`**;③子界面返回钮承诺(卡④ T3——Q1 甲案前提:五界面各带返回/关闭钮);④卡④终局落点不变量(T0 互证:现役=终局 continue 回主菜单,`main_adventure_flow.gd:123-143` 终局出口 `_begin_session(false)`,行号 T0 复核;若后续改落点为营地则本卡「返回主菜单」动线须补会话收束)。卡④ v3.1 已原样承接上述四项,接口名无改动;场景根句柄名与 `LAYER_CONTRACT` 槽名由卡④ T0 定稿(显式验收点),本卡只消费不改名。 -- 卡②的退出游戏钮、现役设置面——本批只复用不重做(契约 3)。 -- 与卡④同批或随后(两卡触碰同一新屏)。**探针入口路径依赖卡②③链**:营地交互重做后营地只能经「菜单三钮→进入存档→选档→进档」到达——本卡 V1/V3 探针段隐含依赖该全链在位;卡②③ 工程波已随迭代 33 合回(待办清单 2026-10-18 条实况),探针段全链在位,无挂起前提。 -- **多卡共改文件分界(`screen_flow_probe.gd`)**:卡④ T5 改该文件营地旗标语义(:54→新场景根句柄;:53 是菜单行——v1.4 订正)与回退段(:119-125);本卡 T3 扩展该文件 Esc 合成段(现 :153-165 已有「选档语境 Esc 零响应」断言)为营地语境 Esc 浮窗断言段。两段按行域分界,各自改各自段,禁互相覆盖;**分界锚=断言段语义/段名,不锚行号**(一侧插删行会平移另一侧行号,2026-11-01 双审补立);T0 与卡④ 对齐。 -- **camp 截图/golden 联动(v1.4 改述,原排序约束句废止)**:HUD 栏落营地场景屏会改 camp 截图内容。按迭代 47 执行序(roadmap 迭代总表格内排列顺序=执行顺序——卡④ 整卡先行、卡⑤ 后),卡④ T5 的 camp 断言基线建立在**无 HUD 场景屏**上;本卡 T2 HUD 落位后核漂移热区→限 HUD 区显式更新+呈报(T2 已列该条)。原 v1.3「卡④ T5 迁移时点须晚于本卡 T2 HUD 落位」句在上述执行序下天然不可满足(死信),2026-11-01 用户裁改述如上;现无 camp 逐像素 golden(卡④ 契约 10)。 - -## 1. 目标与完成定义 - -**目标(澄清⑤裁决 9/10 照录)**: -- 裁决 9「**Esc 键**唤起浮窗:返回主菜单 / 设置 / 退出游戏 三项」(用户原话「ESC键可以唤起一个浮窗,里面有返回主菜单,设置,退出游戏三项」); -- 裁决 10「钥石余额:场景**顶部小 HUD 栏**」(用户原话「先按顶部小HUD栏设计」——provisional 措辞留痕)。 - -**相对现状,新增了什么**: -1. Esc 浮窗(产品码现无任何键盘快捷键处理——从零新建); -2. 营地场景顶部小 HUD 栏(钥石余额常驻——现营地钥石徽在 CampOverlay 顶栏 `camp_overlay_view.gd:125`,随卡④拆解后由新 HUD 栏承接,落卡④ T2 顶栏预留位)。 - -**完成定义**: -1. 营地语境按 Esc 唤起浮窗,浮窗有且仅有返回主菜单/设置/退出游戏三项;浮窗的关闭/取消路径按 Q2 裁定落地; -2. 「返回主菜单」回主菜单(营地场景屏隐藏+选档层同收+主菜单可见);「设置」开现役设置面(语境分支见契约 3);「退出游戏」接现役退出路径; -3. 营地场景顶部小 HUD 栏在位,钥石余额读数=存档单口现值,刷新时机=购买后(挂卡④ `CampRefreshBus.refresh()` 单口)/进档或回营地进入时重读/夹具直写后探针显式触发; -4. 浮窗零动效直开直关(生涯页同款契约);新层入 `LAYER_CONTRACT`; -5. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T4)。 - -## 2. 现状事实(2026-10-18 实查;2026-10-31 复核行号;2026-11-01 双审全量复核——F4 行号 ±1 漂移订正、F9 补全路径,开工日 T0 再核) - -| # | 事实 | 出处 | -|---|---|---| -| F1 | **产品码零键盘快捷键处理**:`KEY_ESCAPE`/`ui_cancel`/`ui_accept` 在 `game/core/`+`game/presentation/` grep 零命中——Esc 浮窗产品码从零新建,无旧路径可迁。**但探针侧已有键盘合成先例**:`screen_flow_probe.gd:156-160` 用 `InputEventKey`(keycode=`KEY_ESCAPE`)经 `Viewport.push_input(ev, true)` 合成,断言「选档语境 Esc 零响应」(:153-165,卡⑤ 范围外的零实现断言)——键盘事件合成机制已实证,T0 由「从零 spike」改为「复核该先例并迁移到营地语境」。鼠标 `push_input` 先例=`ui_input_probe.gd:84-116`(`InputEventMouseMotion`/`InputEventMouseButton`;原 `game/smoke/` 目录已不存在,全部探针在 `game/probe/`) | `game/probe/screen_flow_probe.gd:153-165`;`game/probe/ui_input_probe.gd:84-116` | -| F2 | 设置面在役:开=`_open_settings()`(`main.gd:444` 薄委托→`main_overlay_flow.gd:7-9`:`start_overlay.visible=false`+`ui.modals.flow.open(settings_overlay)`);关=`_on_settings_closed()`(`main.gd:448`→`main_overlay_flow.gd:11-13`:`ui.modals.flow.close`+**`start_overlay.visible = true` 硬副作用**——营地语境照抄会在关设置后弹主菜单,须语境分支,契约 3)。开合走组合根模态编排口 `ui.modals.flow.open/close`;静态承接件是 main 同名函数逐字搬运、main 侧留薄委托,探针 `main.X` 路径零改动。`_open_settings`/`_quit_game` 菜单钮调用点见装配段(T0 复核行号) | `main.gd:444`/:448;`game/presentation/main_overlay_flow.gd:7-13` | -| F3 | 退出游戏在役:`_quit_game()`(`settings_store.save_settings()` 后 `get_tree().quit()`;无语义副作用,可原样复用) | `main.gd:143-146` | -| F4 | 钥石徽工厂件在役:`UiKit.keystone_badge` 定义 `ui_kit.gd:632`;消费点四处产品码——营地顶栏 `camp_overlay_view.gd:125`/生涯页 `career_overlay.gd:54`/状态面板 `status_panel.gd:32`/选档界面 `save_select_overlay.gd:86`(卡③ 新增),+ `theme_projection_test.gd:853-854` 单测投影断言。HUD 栏复用该件,零新素材 | `game/presentation/views/ui_kit.gd:632`;`camp_overlay_view.gd:125`;`career_overlay.gd:54`;`status_panel.gd:32`;`save_select_overlay.gd:86` | -| F5 | art-bible **v3.31** §6.2 现载「钥石余额:常驻画面顶部的一行小 HUD 栏(高 48px,浮层覆盖,不挤压画面)」(:396);camp.md v2.2 §顶栏(:39-41)同述+「刷新入口=营地刷新单口(卡⑤同口挂接)」——与裁决 10 同向,本批把呈现位从 CampOverlay 顶栏迁场景屏 HUD | `design/art/art-bible.md:396`;`design/gdd/ux/camp.md:39-41` | -| F6 | 层序唯一事实源=`ui_registry.gd:15-35 LAYER_CONTRACT`(`UiRegistry`;`main.gd:5` 头注自陈界面句柄与层清单归 ui 注册面);全仓唯一落位口=`ui_registry.gd:76 apply_layer_contract(root)`(唯一 `move_child` 点);模态登记册序/树序断言=`system_test.gd:94-106`(V1c 合同树序链)。浮窗新槽入该合同表,禁散落 `move_child` | `game/presentation/ui_registry.gd:15-35`/:76;`game/tests/system_test.gd:94-106` | -| F7 | 零动效契约先例:生涯页/状态面板「直开直关」——`ui_struct_probe.gd:379-391 _career_zero_motion_contract`(子树 AnimationPlayer 零命中+视图源码 `create_tween`/`UiKit.motion` 令牌扫描)、:334-341 `_status_zero_motion_contract` 同形 | `game/probe/ui_struct_probe.gd:334-341`/:379-391 | -| F8 | 08「六 · Alpha 不含」载「键盘 / 手柄输入(排 Beta)」行(**:193**——:192 是反雪球机制行)——Esc 属用户明示裁决(澄清⑤裁决 9),与该行的关系须同步注记(反哺点),本批不自扩其余键盘面 | `design/gdd/08-Alpha版本标准.md:193` | -| F9 | **刷新链路实况**:营地侧刷新腿=`camp_overlay.refresh_camp(camp_data())`(`camp_shop_presenter.gd:82/90/102/114/126/139/151/165` 各写口尾,与 `_refresh_presentations.call()` 成对,实数 T0 复核)——`refresh_camp` 是 CampOverlay 方法,**随卡④拆解退役**;`_refresh_presentations`(`main.gd:628-633`)刷 `HudPresenter.refresh(ui.battle.*)`+`_treasure_ui.refresh_slots()`+`_sync_settlement_visuals()`,仍战斗侧、不刷营地视图(营地购买口尾成对调用它属既有行为,卡④ 契约 4 明令「禁顺手统一」);`camp_shop_presenter.gd:50-53 on_camp_closed()` 关营地亦 `_refresh_presentations.call()`;钥石读数单点=`camp_shop_presenter.gd:62 camp_data()` 的 `meta.meta_state.keystone_balance()`;钥石入账在冒险收束、不在营地(`存档序列化.md`)——营地语境无现行入账触发源 | `game/presentation/camp_shop_presenter.gd:50-53`/:62/:82-83;`main.gd:628-633`;`存档序列化.md` | -| F10 | 调试角标:`ui_registry.gd:33-34` 载 `debug_badge` 为 `LAYER_CONTRACT` 末位 `float` 类、不注册 ModalStack;`modal_stack.gd:21-41 open()` 只遍历登记层 `_list` 隐藏上方可见层、不触及 float 类 ⇒ 浮窗开不波及角标节点(结构语义)。**但角标发布态恒隐**:`main.gd:98` `ui.screens.debug_badge.visible = _debug_entry`(缺省 false,迭代 38 卡⑦ 发布态换代),`ui_click_probe.gd:330-333` 断言「设置面开中调试角标不可见(发布态恒隐)」——v1.2「角标恒压浮窗且保持可点/可见」是换代前旧结论,已失实;本批删该运行期断言面(契约 7/T3/V8 同步订正),改以「浮窗登记序+open 只动登记层」结构断言承载;开发期临时启用角标(本地改 `_debug_entry`、不提交)后的浮窗不遮角标观感归用户目检 | `game/presentation/ui_registry.gd:33-34`;`game/presentation/modal_stack.gd:21-41`;`main.gd:98`;`game/probe/ui_click_probe.gd:330-333` | - -## 3. 设计契约(红线,违反 = L3 停机呈报) - -🔴 **契约 1 · 浮窗三项且仅三项**:返回主菜单/设置/退出游戏(裁决 9)。禁加项(禁「继续冒险」类——营地无冒险可继续)、禁减项。浮窗的关闭路径=Q2 裁定项(再按 Esc 关),不属「加项」争议。 - -🔴 **契约 2 · Esc 范围=营地语境(Q3 已确认,2026-10-18)**:浮窗只在营地场景图语境唤起(含其子界面开态——行为按 Q1 裁定的甲案:只根态响应)。**禁扩展到战斗/地图/其他屏**(用户 2026-10-18 确认「只在营地语境」;08:193 键盘面仍排 Beta,本批只落 Esc 一项)。 - -🔴 **契约 3 · 设置与退出本体零重做、接线允许语境分支**:设置面本体与退出行为零改(F2/F3);**开合接线允许按语境分支**——现役 `main_overlay_flow.gd:11-13 _on_settings_closed` 带「回开始层」硬副作用(`start_overlay.visible = true`),营地语境须分支为「关设置回浮窗不回主菜单」。栈语义正解(F6/modal_stack.gd:21-41):浮窗登记于设置层**之下**(合同表槽位在营地层与 `settings_overlay` 之间,T0 与卡④ 对齐最终槽名),`ui.modals.flow.open(settings_overlay)` 时设置层绘制在浮窗之上遮挡之(open 只隐藏登记序在设置层**之上**的层,浮窗在下不被隐藏),`close` 后遮挡解除、浮窗自然重现——「关设置回浮窗」由栈语义保证;**语境分支点=`_on_settings_closed` 的 `start_overlay.visible = true` 硬副作用**(菜单路径保留、营地浮窗路径跳过),落 `main_overlay_flow.gd._on_settings_closed`(改)。**语境分支谓词(2026-11-01 双审钉死)=`camp_esc_overlay.visible`**(谁开的设置谁收:浮窗开态下关设置必回浮窗;菜单路径浮窗必未开);与 Esc 守卫谓词(契约 9①②,按 ModalStack 现开集合判)**分立**——禁复用同一谓词。`_quit_game`(`main.gd:143`)无语义副作用,原样复用。 - -🔴 **契约 4 · 返回主菜单动线**:**动线首步=close 浮窗**(`ui.modals.flow.close(camp_esc_overlay)`——浮窗是模态层,与屏壳可见性无关,缺此步浮窗残留主菜单上方;v1.4 补,V3 断言含浮窗 closed);营地场景屏隐藏+**选档层同收**(卡④ T3 口径)+开始层恢复;营地语境⇔闲时会话(无冒险会话——卡④ 契约 6「冒险进行中不开营地」+现役终局回菜单并 `_begin_session(false)` 收束推得),故动线本身不含会话收束;**回主菜单后菜单=卡②三钮、断点在档不在菜单露面**(禁实现者自作主张加「继续冒险」钮——那正是契约 1 在浮窗侧禁的);营地每笔消费即时写盘(`design/gdd/systems/表现与支撑/存档序列化.md`,行号 T0 复核),回主菜单不写档也无损。 - -🔴 **契约 5 · 顶栏 HUD 单口读数+刷新挂卡④单口**:钥石余额只经 MetaProgression/SaveManager 访问器单口读(`camp_shop_presenter.gd:62 camp_data()` 的 `keystone_balance()`;禁第二账本、禁视图自算);**刷新挂卡④定义的营地刷新单口**(卡④ v3.1 定名 `CampRefreshBus.refresh(camp_data: Dictionary) -> void`,非已退役 `refresh_camp`——F9);刷新时机清单=购买后(挂单口)/进档或回营地进入时重读/夹具直写后探针显式触发(T2 落定)。**「进档/回营地进入时重读」的触发主体(v1.4 钉死)=组合根进档动线尾(营地开层同口)显式调 `CampRefreshBus.refresh(camp_data())` 一闸**——禁 band `_ready` 自刷或自持第二入口(保 V6「显式触发才变」单口调用记录锚)。 - -🔴 **契约 6 · 零动效**:浮窗直开直关,子树零 AnimationPlayer、源码禁 `create_tween`/`UiKit.motion` 令牌(生涯页同款契约,F7);减动效设置项不新增(在役项沿用)。 - -🔴 **契约 7 · 层序纪律+遮挡结论(订正)**:浮窗入 `ui_registry.gd LAYER_CONTRACT`(改层序只改合同表;唯一落位口 `apply_layer_contract()`——F6);禁散落 `move_child`。**与调试角标遮挡的结论**:`debug_badge` 是末位 `float` 类、不注册 ModalStack,`ModalStack.open` 只隐藏登记层 ⇒ 浮窗开不波及角标节点(结构语义);但角标**发布态恒隐**(F10,`main.gd:98` `_debug_entry` 缺省 false),故「角标恒压浮窗且保持可点/可见」不是本批可跑断言面——删该运行期断言,以「浮窗登记序+open 只动登记层」结构断言承载,开发期临时启用角标后的浮窗不遮角标观感归用户目检。另写明一条栈语义防误触 L3:浮窗开会隐藏登记序在其上的已开层(如 debug_overlay),关闭恢复——属既有栈语义非新决策。**浮窗句柄寻址(v1.5 钉死)=`ui.modals.camp.esc_overlay` 二层**(营地子容器,卡⑥ 建件;`ui.modals.flow.open/close` 调用形态不变——flow 是全局调度器、非句柄册成员)。 - -🔴 **契约 8 · provisional 口径留痕**:裁决 10「先按顶部小HUD栏设计」的「先」字留痕——HUD 栏形态按最小集落地(只承载钥石余额),扩项=新裁点。 - -🔴 **契约 9 · Esc 输入语义四态与接线定稿(v1.4 新立,2026-11-01 用户裁采纳双审推荐)**:Esc 路由按**四级优先序**,判据单点=ModalStack 登记册现开集合(禁手枚名单——设置面/ConfirmDialog/五子界面自然全被覆盖): -①**除浮窗外任一登记模态开态 → 无反馈**(「设置开在浮窗之上」态被本条覆盖=无反馈,关设置后浮窗自然重现——契约 3 栈语义;旧三态表「隔设置层误关不可见浮窗」歧义就此消解); -②**浮窗开态 → `close(camp_esc_overlay)`**(同键唤起/关闭单义切换,Q2 甲); -③**营地语境(`is_camp_context()`:营地场景屏 visible)→ `open(camp_esc_overlay)`**; -④**非营地语境 → 无反馈**(现役「选档语境 Esc 零响应」语义保持,契约 2)。 -**接线定稿(同日裁,出 §9 白名单)**:事件驱动 `_unhandled_input`,键值判定 `KEY_ESCAPE`(配 physical_keycode 桌面惯例);**禁 Input 单例轮询**(`Viewport.push_input` 合成链不更新 `Input.is_action_pressed` 动作态——合成探针必然测不到轮询路径);**不挂 ui_cancel**(Beta 手柄面往 ui_cancel 挂键会致语义漂移;用户裁决原话「ESC键」;08:193 键盘面只加 KEY_ESCAPE 键值判定、不新增 InputMap action)。**触发沿=pressed 且非 echo**、忽略释放沿(真实键盘长按 echo 连发禁翻转浮窗;V1 补合成 echo 断言零响应)。 - -**拆分边界纪律适用性判定(req-card 第 15 节/code-conventions §1.1)**:本卡=**新增功能批**——新增 Esc 浮窗视图、营地顶栏 HUD 栏、Esc 键盘输入接线三类件,其余为存量文件接线改造;无「拆分存量单元/收敛/重构」动作,`camp_overlay_view.gd` 四柜台拆解退役属卡④ 职责(本卡不改该文件)。按 code-conventions §1.1 拆分判据五条,本卡不触发拆分/收敛/重构类,故不在设计契约区写拆分红线条款,仅在此写明判定理由。同理 req-card 第 13 节「禁为机检文本保留无效成员」(重构类卡必填)不适用;新增件类的「机检预算互斥=上游缺陷停卡退回写卡段」(第 9/14 节)已写入 §8 L3 与「实现规范预算」节。 - -## 4. 范围边界 - -**做**:Esc 输入接线+浮窗视图(三项钮+Q2 关闭路径)+层序登记;营地场景屏顶栏小 HUD 栏(钥石余额);断言批(探针合成键盘事件+零动效契约+HUD 读数一致性);反哺点清单。 - -**不做**(明示去向): -- 营地场景图本体 → 卡④(本批只在其顶栏位落 HUD+挂刷新单口); -- 选档界面/主菜单/数据层 → 卡③/卡②/卡①(工程波已随迭代 33 合回); -- 其余键盘快捷键(任意键关闭浮窗/手柄/战斗内 Esc) → 用户未裁,禁自扩(契约 2); -- 设置面/退出路径本体改动 → 无(契约 3); -- HUD 栏扩项(冒险天数/种子等) → 契约 8,扩项另裁; -- 不新建 camp golden(卡④ 契约 10:现无 camp 逐像素 golden,camp 验收=shot_probe 出图+shot_checker 语义断言)。 - -## 5. 关联文档同步面 - -> **现行口径**:实现批禁写 `design/` 整目录与根规则文件、两份根流程清单与 `game/tests/README.md`,唯一可写目录=`reports/`(+`game/` 实施本体);下表一律执行为列进 `reports/iter-反哺点-<日期>.md` 反哺点清单(义务格全为「反哺点 · 列清单」类,禁旧「随批」措辞)。待办清单与体验验证清单已迁仓库根(原 `design/gdd/06-*`、`07-*` 路径已不存在)。 - -| 文档 | 关联点 | 同步义务 | -|---|---|---| -| `design/gdd/08-Alpha版本标准.md`(v1.13) | :193「键盘 / 手柄输入(排 Beta)」行——Esc 营地浮窗已落地(用户明示裁决,澄清⑤裁决 9),须加注防「Beta 行=本批违例」误读 | 反哺点 · 列清单(行内加注) | -| `design/art/art-bible.md`(v3.31) | §6.2「钥石余额:常驻画面顶部的一行小 HUD 栏」(:396)呈现位从 CampOverlay 顶栏迁场景屏 HUD | 反哺点 · 列清单(权威面零直改,过用户裁决后归文档批) | -| `design/gdd/ux/camp.md`(v2.2) | §顶栏(:39-41)「钥石余额常驻顶部小 HUD 栏、刷新入口=营地刷新单口(卡⑤同口挂接)」实装状态回填 | 反哺点 · 列清单 | -| `待办清单.md`(仓库根) | 本卡登记条(五卡总条,:447 起——原引 438-449 行号漂移,v1.4 订正)状态推进 | 反哺点 · 列清单(实现批禁写待办清单) | -| `体验验证清单.md`(仓库根) | 新增目检条(Esc 浮窗三动线/HUD 余额观感/浮窗视觉面)——登记不阻塞 | 反哺点 · 列清单(实现批禁写体验验证清单,入册条目由文档批落) | -| `roadmap.md`(仓库根) | 迭代行编入/状态刷新 | 反哺点 · 列清单(实现批禁写 roadmap) | -| `game/tests/README.md` | 能力行入表(§7 对照表「能力行」列定名) | **已入表**(旅程段六,本卡两条新增能力行在役)——实现批只核对名实一致,禁写 | -| `game/presentation/*`(浮窗视图/HUD 栏/接线/注册面)、`game/probe/*` | 实现与断言本体 | 实施本体(可写) | - -## 卡前·文件结构与职责(T0 前) - -定义 T 卡前先列全本批新建/修改文件,一文件一职责。**每个文件行标「行为改动/非行为改动」并指向 §7 对照表行号;「落位」列与「落位与可复用性预检」节互指**(标「新建」的必须能在预检节指到不能复用的理由与唯一落点核查)。行号为开工日 T0 复核对象。 - -| 文件 | 职责 | 改动类型 | 落位 | 对照表行 | -|---|---|---|---|---| -| `game/presentation/views/camp_esc_overlay.gd` | Esc 浮窗视图:`UiKit.modal_shell` 模态壳+三钮(返回主菜单/设置/退出游戏,退出用 `UiKit.danger_button`)+Q2 再按 Esc 关窗;零新素材 | 行为改动 | 新建 | V1/V2/V5/B1 | -| `game/presentation/views/camp_hud_band.gd` | 营地顶栏小 HUD 栏:承载 `UiKit.keystone_badge`(钥石余额单口读数);挂接卡④ `CampRefreshBus.refresh()` 刷新 | 行为改动 | 新建 | V6/B2 | -| `game/presentation/main_esc_flow.gd` | 组合根 Esc 流程承接件:键盘输入路由+营地语境判据+Q2 再按关窗+三出口动线(返回主菜单/设置/退出);静态承接件,main 侧留同名薄委托 | 行为改动 | 新建 | V1/V3/B1/B3 | -| `game/presentation/main.gd` | 组合根:Esc 输入入口+`main_esc_flow.gd` 同名薄委托+返回主菜单动线接线 | 行为改动 | 复用既有(改) | V1/V3/B3 | -| `game/presentation/ui_registry.gd` | `LAYER_CONTRACT` 加 `camp_esc_overlay` 槽(登记于营地层与 `settings_overlay` 之间,契约 3 正解)+`node()` 寻址(`camp.*` 二层解析由卡⑥ 建件承担,本卡只消费) | 行为改动 | 复用既有(改) | V8/B1 | -| `game/presentation/main_overlay_flow.gd` | `_on_settings_closed` 语境分支:营地浮窗路径关设置回浮窗、不回主菜单(契约 3;谓词=camp_esc_overlay.visible) | 行为改动 | 复用既有(改) | V4/B3 | -| `game/presentation/ui_modals.gd` | 本卡零句柄新增(浮窗句柄落 `ui_camp_modals.gd` 子容器——卡⑥ 前置建件,2026-11-01 用户裁);类变量 14 预期不升(S13 触面消除,见「实现规范预算·存量触面一查」) | 非行为改动(卡⑤ 段零改) | 复用既有 | V8/B1 | -| `game/presentation/ui_camp_modals.gd`(卡⑥ 新建) | 营地域句柄子容器:本卡 T1 落第六枚句柄 `esc_overlay`(寻址 `ui.modals.camp.esc_overlay` 二层;卡④ T3 已落五枚) | 行为改动 | 卡⑥ 新建(跨卡共改) | V8/B1 | -| `game/presentation/main_ui_build.gd` | 浮窗实例化装配点:`.new()`+装配尾 `apply_layer_contract(root)`(先例 :105/:121/:242;S13 触面) | 行为改动 | 复用既有(改) | V8/B1 | -| `game/presentation/views/camp_scene_view.gd`(卡④ 新建) | 顶栏预留位 `set_hud_band()` 填 `CampHudBand` 实例(卡④ T2 跨卡接口①「卡⑤ 填值」);本卡只填值、不改场景图铺底/命中区逻辑 | 行为改动 | 卡④ 新建(跨卡共改,仅顶栏填值) | V6/B2 | -| `game/probe/screen_flow_probe.gd` | 探针宿主:扩展现 :153-165 Esc 合成段为营地语境浮窗断言+三动线+Q2 关窗+HUD 余额读数;与卡④ T5 营地键段按行域分界(§0) | 非行为改动(测试面) | 复用既有(改) | V1/V3/V4/V6 | -| `game/probe/ui_struct_probe.gd` | 浮窗三钮结构断言+零动效契约段(仿 career :379-391)+顶栏位/登记序结构断言 | 非行为改动(测试面) | 复用既有(改) | V2/V7/V8 | -| `game/tests/README.md` | 能力行入表(四列:能力|系统|真实入口|代表用例) | 非行为改动(文档,写卡段) | 主 Agent 统一收口 | 全表能力行 | -| `reports/iter-实现报告-<日期>.md`/`reports/iter-反哺点-<日期>.md`/`reports/iter-验收审计-<日期>.md` | T4 三份产出物 | 非行为改动(过程件) | 新建 | T4 | - -## 落位与可复用性预检 - -定义 T 卡前,对本批每个**新增文件/新增函数/新增数据件**过三问(复用面/唯一面/分层与交互面),与「卡前·文件结构与职责」互指。生效=2026-10-21 用户立规;本卡虽文件名日期 2026-10-18,经 2026-10-31 用户明令补充为现行有效卡,按现行规则补齐。 - -### 新增件三问 - -| 新件 | 复用面(grep 同职责实现) | 唯一面(grep 同名同义标识符) | 分层与交互面(调用路径+跨层出口) | -|---|---|---|---| -| `camp_esc_overlay.gd` | 盘上视图件=`camp_overlay_view.gd`(CampOverlay 四柜台,随卡④ 形态退役、反参照禁复用)、`settings_overlay.gd`/`career_overlay.gd`(各有专职、无三钮 Esc 浮窗同职责实现)、`ui_kit.gd modal_shell`(工厂只产 dim+center+panel+VBox、不产完整浮窗)。grep `camp_esc`/`esc_overlay` 盘上无同职责实现 → 不能复用,须新建视图件;模态壳/按钮复用 `UiKit.modal_shell`(`ui_kit.gd:486`)/`UiKit.danger_button`(:699),零新素材零新色值 | grep `camp_esc_overlay`/`EscOverlay` 盘上无第二处;三钮文案「返回主菜单/设置/退出游戏」只此一处定义,禁在探针/T 卡各写一份 | 呈现层视图,零 Core 写调用;三钮 `pressed` → 组合根 `main_esc_flow.gd` → 现役动线(`_quit_game`/`ui.modals.flow.open(settings_overlay)`/返回主菜单);Q2 再按 Esc 关窗由组合根路由,视图只发 `closed` 信号 | -| `camp_hud_band.gd` | 盘上钥石徽消费面四处(F4),但**无「顶栏 HUD 栏」独立视图件**——现钥石徽直接挂 CampOverlay 顶栏(`camp_overlay_view.gd:125`),随卡④ 拆解退役;新 HUD 栏须独立承载读数+挂接刷新单口(接收推送,非信号订阅),职责不同 → 不能复用,须新建 | grep `camp_hud_band`/`CampHudBand`/`hud_band` 盘上无第二处;余额读数只经 `camp_data()` 单口(F9),禁视图自算 | 呈现层视图;`UiKit.keystone_badge`(`ui_kit.gd:632`)承载显示;挂接卡④ `CampRefreshBus.refresh(camp_data)` 单口刷新(跨卡接口②);经卡④ `camp_scene_view.gd set_hud_band()` 顶栏预留位挂入(跨卡接口①);零 Core 写调用 | -| `main_esc_flow.gd` | 盘上组合根承接件=`main_overlay_flow.gd`(设置/状态/生涯/选档/图例/钱包六类覆盖层开合与数据投喂)、`main_adventure_flow.gd`、`main_debug_flow.gd`。**无「键盘输入路由+Esc 三出口动线」同职责实现**;并入 `main_overlay_flow.gd` 会使其承载第二变化原因(开合数据投喂 vs 键盘输入交互),且该文件已 6 类开合 → 不能复用,须新建单一职责承接件;`main.gd` 留同名薄委托(与现行拆件模式一致,探针 `main.X` 路径零改动) | grep `main_esc_flow`/`_on_esc`/`EscFlow` 盘上无第二处;营地语境判据只此一处定义(营地场景屏 visible 且无营地子模态开态),禁散落 | 组合根拆件(静态、零成员态,仿 `main_overlay_flow.gd`);键盘输入 → 营地语境判据 → 浮窗 `ui.modals.flow.open/close`(模态栈单口);三出口 → 现役动线;返回主菜单 → 营地隐+选档层同收+开始层恢复(卡④ T3 同口径);Core 零 UI 不破 | - -### 非新增件说明 - -- `main.gd`/`ui_registry.gd`/`main_overlay_flow.gd`/`camp_scene_view.gd`(卡④ 新建):存量或邻卡文件改造,不新增本卡文件;公开方法/成员预算见「实现规范预算」存量触面一查。 -- `game/probe/screen_flow_probe.gd`/`ui_struct_probe.gd`:复用既有探针宿主(`screen_flow_probe` 已在 `tools/probe_gate.sh:142-146` 登记、零登记成本;本卡 T3 不另起新文件),只加断言段。 -- **数据件/RNG/Core**:本卡纯呈现层+输入接线,零玩法数值、无新增 `data/tables/` 表(钥石余额读数经既有 `camp_data()` 单口);数值单一事实源 `data/tables/` 不被触碰;RNG 零新增(RNG 单点 RngService 不被触碰);Core 零 UI 依赖不因新增浮窗/输入接线绕过。 -- **浮窗新槽落点唯一**:`camp_esc_overlay` 只在 `ui_registry.gd LAYER_CONTRACT` 登记一次、`node()` 寻址一次;禁在探针/T 卡另写层序字面量。 - -## 实现规范预算 - -定义接口块/文件结构图前,对本批每个**新增文件**对照 gdstyle 默认阈值做预算,与接口块及「卡前·文件结构与职责」互指。**生效说明**:规范写「生效=文件名日期 ≥2026-10-27,此前卡片属历史留档不回头改」——本卡经 2026-10-31 用户明令补充为现行有效卡,按现行规则补齐,不援引「不回头改」跳过。gdstyle v0.4.0 默认阈值:**公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6**(阈值取工具默认,改阈值=基线口径变须在本批重生成)。 - -### 新件三查 - -| 触面 | ①公开方法数 | ②成员变量数 | ③迁移函数对账 | 结论 | -|---|---|---|---|---| -| `camp_esc_overlay.gd` | 预期 ≤6:`setup_buttons()`/`set_close_path()`/`bind_signals()`/`_on_pressed(key: String)` 等,远低 ≤20 | 预期 ≤8:三钮句柄+modal_shell 句柄+`closed` 信号,低 ≤15 | 无自存量文件迁入函数 | 三查通过;T0 实测实数回填,超阈值即拆件或砍面(砍面=退设计段裁职责) | -| `camp_hud_band.gd` | 预期 ≤4:`bind_refresh_bus()`/`set_balance()`/`refresh()`,远低 ≤20 | 预期 ≤4:`keystone_badge` 句柄+刷新单口句柄,低 ≤15 | 无迁入函数 | 三查通过;T0 实测实数回填 | -| `main_esc_flow.gd` | 预期 ≤7:`on_esc_input()`/`is_camp_context()`/`open_overlay()`/`close_overlay()`/`_on_return_to_menu()`/`_on_settings()`/`_on_quit()`,远低 ≤20 | 预期 0(静态承接件、零成员态,仿 `main_overlay_flow.gd`) | 无迁入函数(新写,不搬存量函数) | 三查通过;T0 实测实数回填 | - -### 存量触面一查 - -本卡触碰存量文件:`main.gd`/`ui_registry.gd`/`ui_modals.gd`/`main_ui_build.gd`/`main_overlay_flow.gd`/`camp_scene_view.gd`(卡④ 新建)/`screen_flow_probe.gd`/`ui_struct_probe.gd`。**T0 读数步骤写明「S13 键较 `tools/gdstyle_baseline.txt` 登记值只降不升」的预期与达成手段**:`main.gd` 组合根新增 Esc 输入入口与薄委托(不引入重复 load/循环内 await/循环内分配等 S13 违规类型,键只降不升);`ui_registry.gd` 合同表加一槽、`node()` 加一寻址分支(不新增公开方法面);`ui_modals.gd` 零句柄新增(浮窗句柄落 `ui_camp_modals.gd` 子容器,类变量 14 预期——v1.4「14→15 恰贴」句作废:该算术只算本卡 +1、未算卡④ 同批净+4,两卡合计 19>15,2026-11-01 停机呈报裁决改子容器);`ui_camp_modals.gd`(卡⑥ 建件)本卡落第六枚句柄(类变量 5→6);`main_ui_build.gd` 加浮窗实例化与装配(方法面微增,T0 实测对账);`main_overlay_flow.gd` `_on_settings_closed` 加语境分支(单函数分支数仍 ≤8、返回 ≤6);`camp_scene_view.gd` 只填 `set_hud_band()` 顶栏位;探针改接=加断言段、不新增扫描面键。任何 S13 键被迫上升=§8 L3 停卡。**`main.gd` 为组合根架构先例,其公开方法基数不在本卡新件三查面内**(第 14 节三查只对新增文件)。 - -### 指标例外通道 - -现预算内,无需例外。若三新件实测超默认阈值,或组合根薄委托致 S13 键上升,设「指标例外申报」节——键名+理由+用户特批落基线;未申报的超预算面进实现段=停卡退回写卡段(写进 §8 L3)。 - -## 6. 任务卡 - -> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。步骤用 `- [ ]` 复选框记步,一步=一个动作+一个可核查结果;每卡声明「取用/产出」接口块,后卡引用的名字与早卡定义逐字一致;禁占位待定句式(不决定任何事的行不留)。 - -### T0 事实坐实与跨卡对齐(≈0.5–1d) - -- 取用:待办清单五卡总条实况(卡④ v3.1 现行、卡②③ 迭代 33 合回)、§0 跨卡接口、卡④ v3.1 §0.5/T2/T3、`game/tests/README.md` 能力表。 -- [ ] 复核 §2 F1–F10 全部 `file:line` 行号;漂移就地订正、订正不了的写明「开工日 T0 复核」,不硬编旧行号。 -- [ ] 与卡④ 对齐三项接口:①顶栏预留位 `camp_scene_view.gd set_hud_band()` 填值签名;②营地刷新单口 `CampRefreshBus.refresh(camp_data: Dictionary) -> void`;③终局落点不变量(现役=终局 continue 回主菜单,若改落点为营地则本卡返回动线补 `_begin_session(false)`)——接口名保持既有,不改名;与卡④ 确认 `screen_flow_probe.gd` 行域分界(§0)。 -- [ ] **Esc 输入合成先例复核**:读 `game/probe/screen_flow_probe.gd:153-165`(`InputEventKey`+`Viewport.push_input` 合成 Esc、断言选档语境零响应),确认该机制可迁移到营地语境;接线方式已定稿(契约 9——事件驱动 `_unhandled_input`+`KEY_ESCAPE`,2026-11-01 裁),T0 复核合成链可达 unhandled 段(push_input 不更新 Input 单例动作态——禁轮询路线的实据)并回写文件结构图接线落点。 -- [ ] Q1/Q2/Q3 裁定执行确认(甲/甲/甲,见 §10);开工门核:U0 发令、grilling 复核门过、卡④ 代码波状态。 -- [ ] 跑 `bash tools/static_scan.sh` 开发期局部读数(gdstyle 键=S13,闸件 `tools/gdstyle_gate.py`——原 `tools/gdstyle.sh` 不存在,v1.4 订正),记录三新件预算实数与存量触面 S13 基线键(预期只降不升);本步最窄确认,不构成验收。 -- 产出:基线 commit、三新件接口块定稿(签名/取值)、S13 读数、跨卡接口核对表、Esc 合成先例复核结论;后续卡只按本卡契约施工。 - -### T1 Esc 浮窗视图与键盘接线(≈1–1.5d) - -- 取用:T0 三新件接口块、Esc 合成先例复核结论、`ui_kit.gd:486 modal_shell`/:699 `danger_button`/:632 `keystone_badge`、`ui_registry.gd:15-35 LAYER_CONTRACT`。 -- [ ] 在 `camp_esc_overlay.gd` 实现 `setup_buttons()`:`UiKit.modal_shell`(`ui_kit.gd:486`,只产 dim+center+panel+VBox、无内置关闭件)+三钮(返回主菜单/设置/退出游戏,退出用 `UiKit.danger_button` :699);零新素材零新色值。 -- [ ] 在 `camp_esc_overlay.gd` 实现 `set_close_path()`/`bind_signals()`:Q2 裁甲=再按 Esc 关窗(同键唤起/关闭单义切换),关闭由组合根路由、视图只发 `closed` 信号;三钮 `pressed` 外发不内含动线。 -- [ ] 在 `main_esc_flow.gd` 实现 `is_camp_context() -> bool`:判据=营地场景屏 visible(子界面是模态叠加非熄屏;复用 `screen_flow_probe.gd:54` 营地旗标先例——:53 是菜单行、:54 才是营地旗标,v1.4 订正);「子界面开态不唤浮窗」(Q1 甲)由契约 9① 现开集合判据承载,不并入本谓词;调试浮窗开态不影响判据(全局浮层、营地屏仍可见)。 -- [ ] 在 `main_esc_flow.gd` 实现 `on_esc_input(ev: InputEvent) -> void`/`open_overlay() -> void`/`close_overlay() -> void`:按**契约 9 四态优先序**路由(①除浮窗外任一登记模态开→无反馈②浮窗开→close③营地语境→open④非营地语境→无反馈),判据单点=ModalStack 登记册现开集合、禁手枚名单;接线定稿=事件驱动 `_unhandled_input`+`KEY_ESCAPE`(physical_keycode)、禁 Input 单例轮询、不挂 ui_cancel、pressed 且非 echo(契约 9 接线定稿 2026-11-01 已裁,不再 T0 选型)。 -- [ ] 在 `ui_registry.gd` `LAYER_CONTRACT` 加 `camp_esc_overlay` 槽(位于营地层与 `settings_overlay` 之间,契约 3 登记序正解)+`node()` 寻址;句柄落 `ui_camp_modals.gd` 子容器第六枚 `esc_overlay`(卡⑥ 前置建件,寻址 `ui.modals.camp.esc_overlay` 二层)——禁平铺回 `ui_modals.gd`(S13 上限,2026-11-01 用户裁);禁散落 `move_child`(F6)。 -- [ ] 在 `main.gd` 加 Esc 输入入口(`_unhandled_input`)与 `main_esc_flow.gd` 同名薄委托(探针 `main.X` 路径零改动);`main.gd` 的 `_unhandled_input` 将是产品码首个键盘入口——`main_esc_flow.gd` 头注自陈此身份(2026-11-01 双审注)。 -- [ ] 零动效(契约 6):浮窗子树零 AnimationPlayer、源码禁 `create_tween`/`UiKit.motion` 令牌(仿 `ui_struct_probe.gd:379-391`)。 -- 产出:`CampEscOverlay.setup_buttons()`/`set_close_path()`/`bind_signals()`、`closed` 信号;`MainEscFlow.on_esc_input()`/`is_camp_context()`/`open_overlay()`/`close_overlay()`;`LAYER_CONTRACT` 新槽键 `camp_esc_overlay`;T2 按接口块接线。 - -### T2 营地顶栏小 HUD 栏(≈0.5–1d) - -- 取用:T1 `MainEscFlow`、`camp_hud_band.gd` 接口块、卡④ `CampRefreshBus.refresh(camp_data)` 单口、`camp_scene_view.gd set_hud_band()` 顶栏预留位、`camp_shop_presenter.gd:62 camp_data()` 读数单点。 -- [ ] 在 `camp_hud_band.gd` 实现 `set_balance(v: int) -> void`/`bind_refresh_bus(bus: Object) -> void`/`refresh(camp_data: Dictionary) -> void`:`UiKit.keystone_badge`(`ui_kit.gd:632`)承载,读数只经 `camp_data()` 单口(F9/契约 5,禁第二账本、禁视图自算);挂接卡④ `CampRefreshBus.refresh(camp_data)`;载体循 UiKit `page_shell` 的 `PRESET_TOP_WIDE`+`custom_minimum_size` 先例(ui_kit.gd:523-525),禁手动 rect。 -- [ ] 在卡④ `camp_scene_view.gd` 的 `set_hud_band()` 顶栏预留位填 `CampHudBand` 实例(高 48px 浮层覆盖、不挤压画面;卡④ T2 跨卡接口①);`camp_scene_view.gd` 场景图铺底/命中区逻辑零改(卡④ 职责)。 -- [ ] 刷新时机清单落定(契约 5):①购买后(挂单口)②进档/回营地进入时重读③夹具直写后探针显式触发——断言前须显式触发,禁依赖「自动重读」假设;②的触发主体=组合根进档动线尾(营地开层同口)显式调 `CampRefreshBus.refresh(camp_data())` 一闸(契约 5 v1.4 补钉),禁 band `_ready` 自刷或自持第二入口。 -- [ ] HUD 栏形态按最小集(契约 8):只承载钥石余额;扩项=新裁点。 -- [ ] camp 截图/golden 联动:HUD 落位后核 camp 截图漂移热区→限 HUD 区显式更新+呈报;现无 camp 逐像素 golden(卡④ 契约 10),camp 验收=shot_probe 出图+shot_checker 语义断言。 -- 产出:`CampHudBand.set_balance()`/`bind_refresh_bus()`/`refresh()`、顶栏填值、刷新时机清单;T3 按接口块验收。 - -### T3 三出口动线、设置语境分支与断言批(≈1–1.5d) - -- 取用:T1/T2 产物、`main_overlay_flow.gd:11-13 _on_settings_closed`、`main.gd:143 _quit_game`、`camp_shop_presenter.gd:50-53 on_camp_closed`、`screen_flow_probe.gd:153-165` Esc 合成段、`ui_struct_probe.gd:379-391` 零动效段。 -- [ ] 在 `main_esc_flow.gd` 实现 `_on_return_to_menu() -> void`:**首步 close 浮窗**(`ui.modals.flow.close(camp_esc_overlay)`——浮窗是模态层,屏壳可见性收不了它,缺此步浮窗残留主菜单上方;契约 4 v1.4 补)→ 营地场景屏隐藏+选档层同收+开始层恢复(卡④ T3 动线同口);营地语境⇔闲时会话(契约 4 前提),动线不含会话收束;回主菜单后菜单=卡②三钮、禁加「继续冒险」钮。 -- [ ] 在 `main_esc_flow.gd` 实现 `_on_settings() -> void`/`_on_quit() -> void`:设置→`ui.modals.flow.open(settings_overlay)`(浮窗登记于其下、关后遮挡解除重现);退出→`_quit_game`(`main.gd:143`,原样复用)。 -- [ ] 在 `main_overlay_flow.gd` `_on_settings_closed` 加语境分支:营地浮窗路径关设置回浮窗、不回主菜单(契约 3;现役 :13 `start_overlay.visible = true` 硬副作用仅菜单路径保留)。 -- [ ] 探针(宿主 `screen_flow_probe.gd`,已在 `tools/probe_gate.sh:142-146` 登记、零登记成本;不另起新文件):扩展 :153-165 Esc 合成段——营地根态合成 Esc→浮窗可见+三项在位;营地子界面开态合成 Esc→无反馈(Q1 甲,契约 9①);**设置开在浮窗之上合成 Esc→无反馈且浮窗不误关**(契约 9①——浮窗不隔层关闭,关设置后浮窗重现);再按 Esc 关窗(契约 9②);非营地语境(boot 菜单)不唤起(契约 9④);**冒险语境合成 Esc→浮窗不现**(契约 2 全局接线回归面,screen_flow_probe 冒险步内);**echo 事件合成→零响应**(触发沿 pressed 且非 echo,契约 9);返回主菜单动线(**浮窗自收**+营地隐+选档层收+菜单显);设置项开合(含营地浮窗→设置→关闭回浮窗高危路径+「关闭设置后禁弹主菜单」反向断言);退出项接线断言(headless 不可真退)。 -- [ ] HUD 余额断言:读数=存档单口(夹具经**隔离存档实例直写** `meta_state._add_keystone(9999)` 先例 `game/probe/ui_click_probe.gd:74`;**不经 DebugOverlay 界面——其钥石项是只读投影** `debug_overlay.gd:194-205`);直写后显式触发刷新断言。 -- [ ] 结构断言(`ui_struct_probe.gd`):浮窗三钮在位且仅三;零动效(仿 career :379-391);`LAYER_CONTRACT` 登记序(浮窗入合同表、`system_test.gd:94-106` V1c 树序链复跑);**浮窗开不波及 `debug_badge` 节点**(F10:发布态恒隐,改结构断言替代 v1.2 `visible==true` 断言)。 -- [ ] 正向验收断言(v1.2 计划的人工制造红取证条目整条已删,替换为 §7 上表正向断言):每条从真实入口进入、判据绑被测改动特有的可观测提交面(信号/入参/状态源取值/可见性/树序),在当轮真实跑批执行并通过;**禁把生产码改成错值看断言抓不抓得到、禁回退 hunk 看断言红不红**(人为制造红属伪造证据);判据绑不上=静态判据+评审注记申报观测面局限,证明做不出=停卡呈报。 -- 产出:三出口动线接线、设置语境分支、探针断言段(V1–V8 落点)、能力行名实核对表;T4 收口。 - -### T4 产出物落位卡(≈0.5d,末卡) - -- 取用:T0–T3 全部产物。 -- [ ] 里程碑步(T 段)出口跑一次代码域全套闸:`bash tools/run_all_gates.sh --code`;回执 `all_green=true`;任何新增红停卡,不得带红合回。波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。 -- [ ] 独立验收审计由未参与实现的会话/子代理执行,产出 `reports/iter-验收审计-<日期>.md`;未过禁合并(审计入口见 §7)。 -- [ ] 轻闸全绿、合并前写齐三份 `reports/`: - - [ ] `reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录/代拍板追认单); - - [ ] `reports/iter-反哺点-<日期>.md`(§5 每条有落点:文件/节/原句/拟改句/依据,明确「实现批未写 design/」); - - [ ] `reports/iter-验收审计-<日期>.md`(独立审计逐行「通过/缺漏/例外及依据」)。 -- [ ] 用户目检项登记 `体验验证清单.md`(仓库根,反哺点列清单:Esc 三动线+HUD 余额观感+浮窗视觉面),登记完成即卡内义务了结,不阻塞批末收尾/合并/下一迭代开工。 -- 产出:三份 `reports/` 齐全+代码域闸全绿+验收审计通过,方算收口;合回后由本地 CI 跑不带参数的 `tools/run_all_gates.sh`(两域全量)复验。 - -**估时合计 ≈3–4.5d**。切分预案:T1/T2 后可切(浮窗先落、HUD 后落)——切分价值低,建议与卡④同批单跑。 - -## 7. 验证闸:改动—验收对照表 - -七格表:需求点|改动(文件:行/行为)|验收测试(名称+落点+尾缀)|层级(单元/接口/集成/探针)|真实入口|判据绑定面|能力行。**每个需求点至少一行;每个行为改动至少一行(V1–V10 需求点行+B1–B3 行为改动专行);每行必须有真实入口和判据绑定面——缺任一项=该需求点未验收,卡片不成立。** 断言尾缀〔ESC批 Vn〕/〔ESC批 Bn〕,与卡片清单互相 grep。能力行格式 `既有:<能力名>;新增:<能力名>`(中文分号分隔,对齐机检与卡④ v3.1 先例),两形态名称都须在 `game/tests/README.md` 能力表在场(既有=现役在场名,新增=本卡定名、由主 Agent 统一收口入表;本卡只写卡内能力行文字,README 由主 Agent 收口)。 - -| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | -|---|---|---|---|---|---|---| -| V1 Esc 唤起(根态/子界面/关窗/非营地) | `camp_esc_overlay.gd` 浮窗视图;`main_esc_flow.gd on_esc_input()`/`is_camp_context()`/`open_overlay()`/`close_overlay()`;`main.gd` 输入入口 | `screen_flow_probe.gd:_ready`(Esc 唤起/子界面开态不唤起/再按关窗/非营地不唤起段)〔ESC批 V1〕 | 探针 | 营地场景根态合成 Esc 键事件(`InputEventKey`+`Viewport.push_input`,先例 :156-160)→ `main_esc_flow.on_esc_input()` → `ui.modals.flow.open/close` | 根态 Esc→浮窗 `visible=true`;再按→`visible=false`(绑 open/close 调用记录+浮窗可见性);子界面开态/设置开在浮窗之上合成 Esc→无反馈且浮窗不误关(契约 9①,浮窗不隔层关闭);boot 菜单与冒险语境合成 Esc→浮窗不现(契约 9④/契约 2,绑语境判据返回值);echo 合成→零响应(触发沿 pressed 且非 echo,契约 9) | 新增:Esc 浮窗唤起与三出口动线 | -| V2 浮窗三项 | `camp_esc_overlay.gd setup_buttons()` 三钮(modal_shell+danger_button) | `ui_struct_probe.gd:_ready`(浮窗三钮结构段)〔ESC批 V2〕 | 探针 | 浮窗视图实例化 → 三钮节点树 | 三钮节点存在且仅三(绑按钮名与数量;禁第四钮) | 既有:UI 全局主题与按钮五态(含对比度锚);新增:Esc 浮窗唤起与三出口动线 | -| V3 返回主菜单 | `main_esc_flow.gd _on_return_to_menu()`(营地隐+选档层同收+开始层恢复) | `screen_flow_probe.gd:_ready`(返回动线段)〔ESC批 V3〕 | 探针 | 浮窗「返回主菜单」钮 `pressed` → `main_esc_flow._on_return_to_menu()` → 屏显编排 | **浮窗 closed(动线首步自收,契约 4 v1.4)**+营地场景屏 `visible=false`+选档层 `visible=false`+`start_overlay.visible=true`(绑四处可见性/open-close 调用记录;`_screen_seals()` :51-57 互斥复跑) | 新增:Esc 浮窗唤起与三出口动线 | -| V4 设置项(双路径) | `main_esc_flow.gd _on_settings()`;`main_overlay_flow.gd _on_settings_closed` 语境分支 | `screen_flow_probe.gd:_ready`(营地浮窗→设置→关闭回浮窗段)〔ESC批 V4〕+菜单路径冒烟 V3g settings 段复跑 | 探针(+冒烟复跑) | 浮窗「设置」钮 → `ui.modals.flow.open(settings_overlay)` → 关闭 → `_on_settings_closed` 语境分支 | 设置开→浮窗 `visible` 恒 true(open 只隐登记序上方层——modal_stack.gd:27-31,浮窗登记在下、由树序遮挡非属性隐藏);关闭→浮窗重现+`start_overlay.visible=false`(绑语境分支谓词=camp_esc_overlay.visible;反向断言「关闭设置后禁弹主菜单」) | 既有:模态覆盖层编排与输入锁;新增:Esc 浮窗唤起与三出口动线 | -| V5 退出项 | `main_esc_flow.gd _on_quit()` → `main.gd:143 _quit_game()`(原样复用) | `ui_struct_probe.gd:_ready`(退出钮接线结构断言)〔ESC批 V5〕 | 探针(源码/结构,headless 不可真退) | 浮窗「退出游戏」钮 `pressed` → `_on_quit()` → `_quit_game()`(`settings_store.save_settings()`+`get_tree().quit()`) | 钮 `pressed` 连接目标=`_on_quit`→`_quit_game`(绑信号连接与调用链;headless 不真退=静态判据+评审注记申报观测面局限);**禁对退出钮 `pressed.emit()`**(防 `get_tree().quit()` 中止探针进程——quit(0) 仅靠 probe_gate 签名兜底不假绿,2026-11-01 双审补立) | 新增:Esc 浮窗唤起与三出口动线 | -| V6 HUD 余额 | `camp_hud_band.gd set_balance()`/`bind_refresh_bus()`/`refresh()`;`camp_scene_view.gd set_hud_band()` 填值;挂接卡④ `CampRefreshBus.refresh()` | `screen_flow_probe.gd:_ready`(HUD 余额读数/刷新段)〔ESC批 V6〕+`ui_struct_probe.gd:_ready`(顶栏位结构段) | 探针(跨卡联验:购买后刷新挂卡④单口) | 隔离存档实例 `meta_state._add_keystone(9999)`(`ui_click_probe.gd:74` 先例)→ 显式触发 `CampRefreshBus.refresh(camp_data)` → `camp_hud_band.refresh()` → `keystone_badge` 读数 | `value_label.text`=`"钥石 %d" % camp_data()["balance"]` 格式串比较(badge 文本带「钥石 」前缀——`ui_kit.gd:632` 工厂约定单点,禁实现期自造第二格式串;`keystone_balance()` 单口取值,2026-11-01 双审订正);直写后显式触发刷新才变(绑单口调用记录+badge 文本状态源) | 既有:元进度入账与锻造两轴;新增:营地顶栏 HUD 钥石读数与刷新单口同步 | -| V7 零动效 | `camp_esc_overlay.gd` 直开直关(零 AnimationPlayer、源码禁 `create_tween`/`UiKit.motion`) | `ui_struct_probe.gd:_ready`(浮窗零动效契约段,仿 career :379-391)〔ESC批 V7〕 | 探针(结构/源码扫描) | 浮窗视图子树+`camp_esc_overlay.gd` 源码 | 两新件源码(camp_esc_overlay.gd+main_esc_flow.gd)+浮窗子树零 AnimationPlayer+源码零 `create_tween`/`UiKit.motion` 令牌(扫描面 >0 非空前置;扫描面扩两新件——2026-11-01 双审补立,开合编排件不脱扫) | 既有:模态覆盖层编排与输入锁;新增:Esc 浮窗唤起与三出口动线 | -| V8 层序与遮挡 | `ui_registry.gd` `LAYER_CONTRACT` 加 `camp_esc_overlay` 槽(营地层与 `settings_overlay` 之间)+`node()` 寻址 | `ui_struct_probe.gd:_ready`(浮窗登记序/遮挡段)〔ESC批 V8〕+`system_test.gd:_ready`(V1c 合同树序链 :94-106 复跑) | 探针(+系统测试复跑) | `main.ui.LAYER_CONTRACT` 单一事实源;`ui.modals.flow.open()` 遮挡记账 | 登记册序=合同模态序、直接子层树序=合同序逐对相等;`debug_badge` 末位 float 类不注册(open 只动登记层,绑登记册成员性;F10 发布态恒隐,不绑 `visible==true`) | 既有:模态覆盖层编排与输入锁;新增:Esc 浮窗唤起与三出口动线 | -| V9 目检项登记 | `reports/iter-实现报告-<日期>.md` 实机目检总清单 | 件核对(`体验验证清单.md` 登记,登记不阻塞)〔ESC批 V9〕 | 用户目检(非自动化) | 用户实机(生命周期末步统一进行,不阻塞迭代) | Esc 三动线+HUD 余额观感+浮窗视觉面(文字 WCAG 若入 shot_checker 取样,否则显式登记归目检并写明理由)入 `体验验证清单.md`=登记即义务了结 | 既有:模态覆盖层编排与输入锁 | -| V10 反哺点清单 | §5 每条有落点 | 件核对表〔ESC批 V10〕 | 件核对(非自动化) | §5 同步面逐条对账 | §5 每条有 `reports/iter-反哺点-<日期>.md` 落点 | 既有:模态覆盖层编排与输入锁 | -| B1 Esc 输入接线与浮窗视图(行为改动专行) | `main.gd` 输入入口/薄委托;`main_esc_flow.gd on_esc_input()`/`is_camp_context()`/`open_overlay()`/`close_overlay()`;`camp_esc_overlay.gd` 新建;`ui_registry.gd` 新槽 | `screen_flow_probe.gd:_ready`(Esc 唤起/关窗/非营地段)+`ui_struct_probe.gd:_ready`(三钮/零动效/登记序段)〔ESC批 B1〕 | 集成 | 营地场景根态合成 Esc 键 → `main_esc_flow` → `ui.modals.flow.open/close(camp_esc_overlay)` | Esc 输入→浮窗 visible 两态(绑 open/close 调用记录);契约 9 四态路由(绑现开集合判据与 open/close 调用记录,含「设置开在浮窗之上」无反馈态);浮窗三钮数量+登记序(绑节点树与合同表) | 既有:模态覆盖层编排与输入锁;新增:Esc 浮窗唤起与三出口动线 | -| B2 HUD 栏落位与刷新挂单口(行为改动专行) | `camp_hud_band.gd` 新建;`camp_scene_view.gd set_hud_band()` 填值;挂接卡④ `CampRefreshBus.refresh()` | `screen_flow_probe.gd:_ready`(HUD 读数/刷新段)+`ui_struct_probe.gd:_ready`(顶栏位结构段)〔ESC批 B2〕 | 集成 | `CampRefreshBus.refresh(camp_data)` → `camp_hud_band.refresh()` → `keystone_badge` | badge 文本=`camp_data()["balance"]` 单口取值;顶栏位存在(结构断言,高 48px 浮层);刷新单口调用记录(跨卡联验) | 既有:元进度入账与锻造两轴;新增:营地顶栏 HUD 钥石读数与刷新单口同步 | -| B3 设置语境分支与返回主动线接线(行为改动专行) | `main_esc_flow.gd _on_return_to_menu()`/`_on_settings()`/`_on_quit()`;`main_overlay_flow.gd _on_settings_closed` 语境分支 | `screen_flow_probe.gd:_ready`(返回动线/设置双路径段)+`ui_struct_probe.gd:_ready`(退出钮接线断言)〔ESC批 B3〕 | 集成 | 浮窗三钮 `pressed` → `main_esc_flow` 三出口 → 现役动线/`_quit_game`;设置关闭 → `_on_settings_closed` 语境分支 | 返回动线三处可见性(绑屏显编排);设置关闭后浮窗 `visible=true`+`start_overlay.visible=false`(绑语境分支);退出钮连接链(绑信号连接) | 既有:模态覆盖层编排与输入锁;新增:Esc 浮窗唤起与三出口动线 | - -**落点集中**:V1/B1 → T1/T3;V2/V7/V8 → T1/T3;V3/V4/V5/B3 → T3;V6/B2 → T2/T3;V9/V10 → T4。全表名实核对归 T4。 - -**测试方式两分法**:V1–V8、B1–B3 机检自动化(能力验证经隔离存档实例直写钥石 `meta_state._add_keystone()`,`ui_click_probe.gd:74` 先例;不经 DebugOverlay 界面——其钥石项只读投影 `debug_overlay.gd:194-205`);V9 归用户目检(生命周期末步统一进行,不阻塞迭代,澄清⑥口径);V10 为件核对表。**用户目检一律「登记不阻塞」**:登记完成即卡内义务了结,不得作为批末收尾、合并或下一迭代开工的前置条件。 - -**判据绑定面口径**:每个需求点与每个行为改动的验收=一条从真实入口进入的断言,可 grep 定位、在当轮真实跑批中执行并通过,判据绑被测改动特有的可观测提交面(信号/事件/入参/状态源取值/绘制记录/可见性/树序)(2026-10-24/10-28 用户两裁)。**禁把生产码改成错值看断言抓不抓得到、禁回退 hunk 看断言红不红——人为制造红属伪造证据,一律禁止**;v1.2 计划的人工制造红取证条目整条已删,替换为上表正向验收断言。判据绑不上(纯防御分支、headless 不可真退)=静态判据+评审注记申报观测面局限,证明做不出=停卡呈报。配判据按强弱分层配齐:运行期断言(可见性/树序/状态源取值)抓状态类缺陷,golden 逐像素抓内容观感类缺陷(本卡无 camp golden,用 shot_checker 语义断言段+目检),占比/统计类判据只兜「整框空白/整框糊」、是补充不是主力(细则=test-conventions §8.4)。 - -**测试削弱申报(零削弱)**:**本卡零削弱申报**——本批只新增断言,不删除/放宽任何在役旧断言、不缩小扫描面、不把真实入口换成下层直调。v1.2 计划断言「浮窗开态 `debug_badge.visible==true`」因调试角标发布态恒隐换代(迭代 38 卡⑦,`main.gd:98`)与现行事实冲突,属**计划期订正**(该断言从未落地、非在役旧断言),改写为「浮窗登记序+open 不波及 float 类 `debug_badge` 节点」结构断言(V8),不计削弱。除此外实现期不得删除断言、放宽阈值、缩小扫描面、换下层直调;未申报的削弱由独立验收审计判红。 - -**独立验收审计**:合并前由未参与实现的会话/子代理执行,入口=审计只读本卡、实际对照表、diff、测试文件与实现报告,自跑最窄测试抽查、不采信报告「已全绿」;至少四件事——①逐行核对照表(测试存在、真的执行、尾缀能 grep 到、真实入口没有绕过改动点)②抽查判据绑定面(绑被测改动特有可观测提交面、当轮真实跑批执行过)③检查测试削弱(删除断言/放宽阈值/缩小扫描面/换下层直调逐处要本卡申报或用户批准)④核内部字段直查的受控例外(该行为无公开可观测面可钉时已在对照表注明理由)。报告落 **`reports/iter-验收审计-<日期>.md`**,逐行「通过/缺漏/例外及依据」,未通过不得合并。测试执行两入口铁规不变:审计在迭代 loop 内启动的子代理算 loop,另开会话须用户点名。 - -**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码/断言面 → `--code`)全绿才合并;MC 零跑(零数值零行为)。**卡内不写死闸件名单与域划分**,唯一出处在 `tools/run_all_gates.sh`。合回验证=主区直改+直提后由本地 CI 跑不带参数的 `tools/run_all_gates.sh`(两域全量)复验,代码面全量验证归合回后本地 CI,主区小批直提不重复跑全量。回归措辞按模板:里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套。 - -## 8. 异常分级 - -- **L1(自救一次)**:断言写法、探针合成键事件写法、命名、编译错误、签名拼写、测试套件 manifest 登记遗漏。 -- **L2(记录继续;同一红连续三次升 L3)**:浮窗壳尺寸/位次(UiKit 现行件域内)、HUD 栏位微调(顶栏域内)、行数较 T0 预期漂移但 S13 键不升。 -- **L3(立即停卡写报告等用户)**: - - 卡④ 代码波未到位又需合并; - - Q1/Q2/Q3 裁定被执行期擅自改值(已裁=甲/甲/甲,见 §10); - - 发现需扩展到非营地语境才能成立(触契约 2=用户裁面); - - Esc 键盘合成先例(`screen_flow_probe.gd:153-165`)复核失败且无替代真实入口验收手段(真实路径纪律不让直呼处理函数代偿); - - 浮窗开会隐藏其上登记层的栈语义被误判为缺陷(契约 7 已写明,勿误停机); - - 任何验收行无法从真实入口绑定特有可观测提交面(证明做不出=停卡呈报); - - **机检预算互斥=上游缺陷停卡退回写卡段**:实现规范预算三新件超默认未走指标例外申报、或存量触面 S13 键较登记值上升、或机检键/计数与卡片契约互斥——一律停该卡呈报退回写卡段,禁为凑绿保留无效成员、造第三条路或内联求裁(req-card 第 9/14 节合流)。 - -## 9. 代拍板白名单(超清单必呈报) - -1. **(v1.4 已定稿,移出白名单)Esc 接线=事件驱动 `_unhandled_input`+`KEY_ESCAPE`(physical_keycode)、禁 Input 单例轮询、不挂 ui_cancel、pressed 且非 echo**——契约 9 接线定稿(2026-11-01 用户裁);白名单保留此条作裁定留痕,实现期无选型自由。 -2. 浮窗模态壳尺寸与位次(UiKit `modal_shell` 现行件域内,`ui_kit.gd:486`)。 -3. HUD 栏在顶栏的左右位次与间距(卡④场景屏顶栏域内)。 -4. 「返回主菜单」复用卡④篝火同一处理函数(建议复用——动线同口;实现期定)。 -5. 浮窗视觉面是否入 shot_checker 取样(T3 定:入=补截图段;不入=显式登记归目检并写明理由)。 -6. 提交切分与 worktree 分支命名(车道铁律:主区直改+直提;大批按约定 worktree 非强制)。 - -超出必须呈报:任何数值、事件名、接口名、文件职责、T 卡验收落点、三钮文案、Q1/Q2/Q3 裁定值。 - -## 10. 待裁点:零待裁点,开工门=U0 - -**本卡设计待裁点清零,开工门=U0。** Q1/Q2/Q3 均于 2026-10-18 裁定(下列为现行裁定留痕,非待裁点,实现期禁自行改值): - -### Q1 · Esc 在子界面开态下的行为(已裁定 甲) - -**背景**:营地语境含「场景根态」与「子界面开态」(锻造/秘宝/生涯/天赋树/图鉴开着时)。澄清⑤裁决 9 未覆盖此分支。两案并列,**无推荐(用户令:不代裁)**: - -| 案 | 内容 | 代价 | -|---|---|---| -| 甲 | 只营地根态响应 Esc;子界面开着时 Esc 不唤浮窗(前提=各子界面自带返回钮闭环——待卡④ T3 承诺) | 语义最简;子界面里按 Esc 无反馈 | -| 乙 | 营地语境任意态响应 Esc:子界面开着时先关子界面回根态,再按才唤浮窗(单义化) | 多一层输入编排;与既有「子界面返回钮」形成双关闭路径 | - -连带:判据形态随案(T1 已列);V1 按案分拆断言;契约 2 措辞裁后回写。 - -**裁定(2026-10-18)**:**甲**——只营地根态响应 Esc;子界面开着时 Esc 不唤浮窗。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=语义最简;前提=卡④ T3 承诺各子界面自带返回钮闭环,卡④ v3.1 已在内;追认单可 veto)。T1 判据=营地场景屏 visible;「无营地子模态开态」由契约 9① 现开集合判据承载(v1.4,判据单点化)。裁定落 T0 执行+实现报告留痕。 - -### Q2 · 浮窗的关闭/取消路径(已裁定 甲) - -**背景**:`UiKit.modal_shell`(`ui_kit.gd:486`)只产 dim+center+panel+VBox、**无内置关闭件**;契约 1 禁加项⇒浮窗只有三钮,无一「关闭」。而 §4 不做清单把「任意键关闭浮窗」划为用户未裁禁自扩——Esc 自身再按的行为恰好落在被 punt 的缝隙里:Q1 两案都不覆盖「浮窗已开时按 Esc」。若不裁且无关闭钮,玩家误开浮窗后离开营地只有「回主菜单/开设置/退游戏」三条路——体感陷阱,且与卡④子界面(生涯有返回钮)的可用性水准倒挂。 - -| 案 | 内容 | 代价 | -|---|---|---| -| 甲(推荐) | 再按 Esc 关浮窗(同键唤起/关闭单义切换) | 与 Q1 裁甲并存时 Esc 语义三态分枝(关浮窗/唤浮窗/子界面无反馈),探针断言须分拆(V1 已按案分拆) | -| 乙 | 浮窗加关闭钮 | 触契约 1「禁加项」——须重新解释「三项」仅指功能项 | -| 丙 | 维持无关闭(三钮即全部出口,「返回主菜单」充当默认离开) | 误开浮窗后成本高;与子界面可用性水准倒挂 | - -**裁定(2026-10-18)**:**甲**——再按 Esc 关浮窗(同键唤起/关闭单义切换)。推荐案,用户令按推荐执行。T1 接线含「浮窗已开时再按 Esc=关浮窗」;V1 断言按「根态唤起/再按关闭」两态分拆。裁定落 T1 视图与接线+V 表。 - -### Q3 · Esc 范围确认(已裁定 甲) - -**背景**:契约 2「Esc 只在营地语境」是卡的从严收窄(澄清文档只裁「Esc 唤浮窗三项」、未裁范围——S1)。收窄方向保守且已自标「用户未裁」,但若用户本意是全局 Esc 菜单,范围锁死即返工。 - -| 案 | 内容 | 代价 | -|---|---|---| -| 甲(推荐) | 确认「Esc 浮窗只在营地语境」——契约 2 现文成立 | 无(一句话确认) | -| 乙 | 用户本意为全局(或更宽范围) | 本卡范围重开=契约 2/T1/V1 大改,且触 08:193 Beta 行口径 | - -**裁定(2026-10-18)**:**甲**——确认「Esc 浮窗只在营地语境」(推荐案,用户令按推荐执行)。契约 2 从「卡的从严收窄」升格为已确认口径;S1 保留意见关闭。 diff --git a/reports/需求卡片-营地场景图新建批-2026-10-18.md b/reports/需求卡片-营地场景图新建批-2026-10-18.md deleted file mode 100644 index 3cf20102..00000000 --- a/reports/需求卡片-营地场景图新建批-2026-10-18.md +++ /dev/null @@ -1,459 +0,0 @@ -# 需求卡片:营地场景图新建批(交互式营地 · 七物件绑定 · 四柜台拆解)· 营地交互重做卡④ - -- 版本:**v3.2(现行有效卡)**。留痕:2026-10-21 用户令退回美术设计段待闭合;2026-10-31 用户令重立——美术设计已闭合(样张过审+art-bible 条款版本),据 req-card 第〇步重立为现行有效卡,零设计待裁点;2026-11-01 grilling+godot-master 双审后用户令修订(v3.1)——§0.3 四道代码段开工门裁断销号、§2 换新盘面、Godot 风险项落卡;2026-11-01 用户裁机检预算互斥停机呈报(v3.2)——营地六句柄改落 `ui_camp_modals.gd` 子容器(卡⑥ 前置建件),`ui_modals.gd` 类变量 14→14 零基线,存量触面一查补列 ui_modals/ui_registry/main_ui_build 三件,全量分域分家登记待办清单另立批。 -- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(目标体验原话/目标结构树+纵深稿/裁决 5·6·7·8·10/验收方式/切批原则④)+ 样张过审(2026-10-31 用户裁定,清单 [artwork/candidates/_终稿裁定-2026-10-31.txt](../artwork/candidates/_终稿裁定-2026-10-31.txt):各素材第一张样本稿为终稿、保留全部待选稿)+ [art-bible.md](../design/art/art-bible.md) v3.31 §6.2(营地场景 10 层口径)(**唯一事实源**:样张过审 2026-10-31 + art-bible.md v3.31 §6.2;配套 [camp.md](../design/gdd/ux/camp.md) v2.2/[camp-scene-prompts.md](../design/art/camp-scene-prompts.md) v1.2/[asset-path-map.md](../design/art/asset-path-map.md)/[art-assets-checklist.md](../design/art/art-assets-checklist.md) §3.5 同步;需求澄清为目标体验事实源) -- 归属:呈现层+美术线(`game/presentation/` + 场景素材)——营地交互重做五卡之四,**最大件** -- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁) -- 开工门:**零设计待裁点,开工门=U0**;编入迭代由 iter-plan 段发令,代码段按 `/iter` 开工,代码段开工门见 §0(不阻塞本卡作为有效卡与编迭代) - -## 🔧 状态:现行有效卡(v3.1,2026-11-01 双审修订) - -本卡设计线已闭合,凭据见 §0「重立凭据」:样张过审(2026-10-31)+ art-bible v3.31 §6.2 条款版本齐备。2026-11-01 grilling+godot-master 双审通过、§0.3 四道代码段开工门全部裁断销号(用户照双审推荐采纳),设计待裁点与开工门清零;已编入迭代 47(roadmap.md 迭代总表,与卡⑤ 同波,卡⑤ 随本卡代码波之后)。属呈现层+美术线,五卡之四。 - -**归属纪律**:本卡只登记代码段开工门与已裁断。前置由谁解决、何时解决、设计稿与素材由谁产出由用户定——美术/设计线=用户自立批(铁律 2),Agent 不代跑、不代产、不自行开工设计稿。素材终稿落 `game/assets/art/` 属实现段 T1/`asset-ingest` 第 3 步,不属写卡门(用户 2026-10-31 令:只生成素材、不做后处理;2026-11-01 用户裁:后处理授权随 /iter 开工令一并生效,见 §0.3-4)。 - -**批内批次次序(铁律 2:美术素材走自立批、不占迭代位;先产图后改代码)**:美术设计已闭合(样张过审)→ 场景素材后处理与入库(自立批,产物 `artwork/`→`game/assets/art/scene/`)→ 本卡代码段 `/iter`(与卡⑤ 同波)。工程面 ①②③ 代码已随迭代 33 合回(卡①②③ 已按吸收即死退役);④⑤ 未编排,编入哪一迭代由用户经迭代编排段发令。 - -## 0. 前置依赖与代码段开工门 - -### 0.1 重立凭据(已齐,非待裁点) - -req-card 第〇步+卡头 2026-10-21 退回令口径=美术设计闭合(样张过审+art-bible 条款版本)。两样已齐: - -- **样张过审**=用户 2026-10-31 裁定「保留全部待选稿、各素材第一张样本稿为终稿、每个都还可以接受」(清单 `artwork/candidates/_终稿裁定-2026-10-31.txt`),用户准备在游戏内做最终审核。 -- **art-bible 条款版本**=`art-bible.md v3.31 §6.2`(营地场景 10 层口径;camp.md v2.2/camp-scene-prompts.md v1.2/asset-path-map.md/art-assets-checklist.md §3.5/评估报告同步)。 - -两样齐 ⇒ 重立卡判据齐,本卡为现行有效卡。P3/P5 等未销号项属**代码段开工门**,不阻塞重立卡。 - -### 0.2 P1–P5 前置现状(已裁/已补项写进卡,不再当待裁点) - -| # | 前置条件 | 归属 | 现状 | 落点 | -| -- | ------- | ---- | ---- | ---- | -| P1 | Q1 美术渠道裁定(A/B) | 用户 | **已裁=B·插画级新产**(2026-10-22);✦ 渠道作者自跑远程生图管线,规格沿用 art-bible §6.2/§8.1/§8.2 既有裁决 | art-assets-checklist.md §3.5 | -| P2 | 像素规格 | 用户线 | **Q6 甲过渡口径已裁**:现役 1280 工程档(1280×800)+烛光黄 #F6C667/木色 #8A5A34;2× 源档出图、最近邻降采样;终档归样张批冻结清单后置换(反哺点登记),执行归用户线 | 契约 8 | -| P3 | 点选反馈设计稿(悬停高亮/提示文案/可点区域判定) | 用户线 | **已销号(2026-11-01 用户裁)**:销号口径=camp.md v2.2:35-37 四态规格即点选反馈设计稿(四态参数已钉死);剩余实质=七物件名牌文案与可点区域视觉,归 T2 域内(名牌文案按 §1 绑定表界面名逐字落、可点区域判定归 §9 白名单 3) | §0.3 | -| P4 | 参照物 | 用户 | **已补**(2026-10-23)=`artwork/2026-10-23-营地场景/Gemini_Generated_Image_ykrc0nykrc0nykrc.jpg`,已进 camp-scene-prompts.md §1 登记为「作者提供的参照物」,与纵深稿对过表、围墙结构冲突已呈报;参照物只是参考图,保留 `artwork/`、不入 git、不入游戏目录 | camp-scene-prompts.md §1 | -| P5 | GDD/art-bible 营地条款落文 | 文档批(用户发令) | **已销号(2026-11-01 用户裁)**:销号口径=形态落文完成(camp.md v2.2/art-bible v3.31 §6.2 已在盘);实装状态回填与 §7.5/§2.8 同步归 T6 反哺点义务(§5),非停机条件,实现批禁写 `design/` | §5 反哺点 | - -### 0.3 代码段 `/iter` 开工门(不是设计待裁点,不阻塞重立卡与编迭代) - -下列项属代码段开工门;未销号即需开工对应任务段=§8 L3 停机呈报,禁批内自补、禁 T0 现场发挥: - -1. **P3 点选反馈设计稿——已销号(2026-11-01 用户裁)**:销号口径=camp.md v2.2:35-37 四态规格即点选反馈设计稿(悬停/按下/禁用/常态参数已钉死);剩余实质=七物件名牌文案与可点区域视觉,归 T2 域内(名牌文案按 §1 绑定表界面名逐字落,可点区域判定归 §9 白名单 3)。 -2. **P5 GDD/art-bible 条款落文——已销号(2026-11-01 用户裁)**:销号口径=形态落文完成(camp.md v2.2/art-bible v3.31 §6.2 已在盘);实装状态回填与 §7.5/§2.8 同步归 T6 反哺点义务(§5),非停机条件。 -3. **camp-scene-prompts.md §5 五裁点——已裁断(2026-11-01 用户裁,照双审推荐采纳)**:①帐篷 300×170 追认现值 ②门扇 240×220 追认现值、坐标按门洞 x520–760 对齐锚点 ③布告板 (845,268,130,140) 挂围墙带(y330 悬空案弃)④描边颜色=奶油色追认(去底技术前提随现值锁定,改深灰褐须换去底方案全批重出、禁)⑤营地环境子板色值**不前置**——T1 量化实际用色后按 art-bible §4.1 两道门(语义检查+RGB 三通道差)登记;未登记前 T5「截屏级 48 色计数是否新建」(§9-4)为条件步:色值已登记→拍板,未登记→该子步显式跳过+T6 登记遗留(不阻塞批末闸,素材级二器 palette_check/standee_asset_check 已覆盖素材级执法)。camp-scene-prompts.md §5 节改已裁+art-bible :398 对应三处值落文归文档批(§5 反哺点表已列)。 -4. **十张终稿后处理与入库——发令形态已裁(2026-11-01 用户裁)**:**/iter 开工令即含 T1 后处理授权**(去底转透明〔bg 不去底、全幅不透明〕/擦通道水印/降采样/裁围墙细条/色板量化),不再两次发令;逐张画布档→目标矩形换算式登记见 §6 T1(1024×1024 档无整数倍降采样,禁现场默认)。 - -### 0.4 10 层拆分(现行口径,覆盖旧 8/9 张) - -| z | 层 | 内容 | 可点 | -| -- | -- | ---- | ---- | -| z0 | `scene_camp_bg` | 不透明全幅=天空+远山+整片地面+门洞内一条通向远处的小路 | 否 | -| z1 | `scene_camp_wall` | 透明底,横贯全宽密排竖木桩墙(左右两段)+两根略高门柱;门洞 x520–760 留透明缺口透出 bg 小路;落盘按细条 (0,240,1280,70) 裁、不做全幅 | 否 | -| z2 | `scene_camp_board` 布告板 | 挂围墙带,点进图鉴占位 | 是 | -| z3 | `scene_camp_gate` 门扇 | 半开双扇,叠在门洞上(240×220 追认现值、2026-11-01 裁;坐标按门洞 x520–760 对齐) | 是 | -| z4 | `scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷 | 木桩、锻炉可点;帐篷承载件不可点 | 部分 | -| z5 | `scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本 | 宝箱、帐篷旁笔记本 | 是 | -| z6 | `scene_camp_campfire` 篝火 | 最前;命中矩形只取下半(火堆),上半火焰只展示 | 是 | - -围墙从背景层独立成层(z1),门洞小路画在 bg 层(z0)。**中景带自画面底部往上约 2/3 处起**;近景物件可压住围墙,**唯一例外=中间门洞必须留空、不被任何物件遮挡**。坐标草案与分层验收判据见 [camp-scene-prompts.md](../design/art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源)与 [布局草案-1280x800.html](../artwork/2026-10-23-营地场景/布局草案-1280x800.html)。 - -### 0.5 跨卡接口与并行性(批内视角,非排期承诺) - -- 卡③(选档界面)Q3 已裁乙:随 ①②③ 工程波先行时进档/新档暂行接现役 CampOverlay——**本卡代码波落地后,营地入口从现役 CampOverlay 改挂场景图,现役 CampOverlay 随之拆解退役**(卡③ 暂行接线与本次改挂的二次验证面在卡③ T2/实现报告登记)。 -- 卡⑤(ESC 浮窗与营地顶栏)落在本批新建的场景屏顶栏位——两卡触碰同一新屏,建议同批或卡⑤ 随后。**跨卡接口**:①场景屏顶栏位(T2 预留);②**营地刷新单口**(T3 定义:各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成)——卡⑤ HUD 刷新挂该单口,非已退役的 `refresh_camp`;③ConfirmDialog 三钮化与消费方编排(T4,卡③ 契约 3 同款互指);④子界面返回钮承诺(T3);⑤篝火二次确认走 ConfirmDialog 先例(camp.md v2.2 已裁必须)。 -- 样张线关系:营地屏整屏样张是 art-bible §1.4 四屏之一,现列 06「待设计」排队行——本卡不跑整屏样张闸、不替代样张批,只按既有约束(契约 7/9)生产与自检;营地屏样张义务留原排队行(反哺点注记)。文档既定序列(排队行措辞「终稿后再出样」)本就终稿先于营地样张,故 T1 终稿落盘不构成违背 art-bible §7.5「前置」条(§5 反哺点已注)。 - -## 1. 目标与完成定义 - -**目标(澄清①一句提炼照录)**:营地首页从「文字按钮菜单 + 列表式覆盖层」改为「**一张可点击的营地场景图**」——点场景中的具体物件进入对应功能界面。用户原话照录:「我是希望有一个营地地图的游戏画面;或者是一张营地的图片,跟 UI 的交互是点击图片中的某一处地方,然后再进入界面。不是完全普通的那种 UI 设计,不是各种框框的……我点击某些具体的东西之后,就可以进入对应的操作界面。」(称呼订正:「它就是一个营地的画面;并不是一张地图。」) - -**七物件绑定(camp.md v2.2 §场景构成与七物件绑定,逐一落地)**: - -| 物件 | 进入 | 备注(现状定性+现行约束) | -| ---- | ---- | ------------------------ | -| 大门(半开门扇,门洞内一条通向远处的小路) | 冒险(选路屏/战斗屏已实现不动;断点弹窗移位) | 入口新建+动线迁移;点大门永远先出确认(有断点=三出口,无=是否开始新冒险) | -| 锻炉·铁砧 | 锻造工坊 | 界面已实现·入口改挂;未解锁=禁用态(降明度+去饱和) | -| 宝箱 | 秘宝匣 | 界面已实现·入口改挂;未解锁=禁用态 | -| 帐篷旁笔记本 | 生涯记录 | 界面已实现·入口改挂;生涯页返回钮文案禁含「营地」字样 | -| 木桩 | 树淬炼天赋树 | 界面已实现·入口改挂 | -| 布告板/悬赏板 | 奖励格图鉴 | 界面已实现·入口改挂;内容冻结未激活,点进看占位(**不是禁用态**) | -| 篝火 | 离开营地/回主菜单 | 新建小动线;**必须二次确认**;命中区只含火堆、不含火焰 | -| 帐篷 | — | 承载件不可点;落地尺寸与占位范围待作者重定(代码段开工门,camp-scene-prompts §5) | - -**纵深稿(用户原话照录)**:「远景是天空;中景是一个围栏,还有营地大门;近景中间是一个篝火;左边是锻炉铁砧;右边是我们的床铺,宝箱等。」(承载件落地为帐篷,见 §0.4 z4。) - -**大门两分支(裁决 5 照录,Q5 已裁=甲)**:有未完冒险 → ConfirmDialog 三出口「继续上一段冒险/开始新冒险/取消」;无未完冒险 → 「是否开始新冒险:是/否」。**点大门永远先出确认,不直接进冒险**;cancelled 恒=无变更退回营地。 - -**钥石余额(裁决 10 照录)**:场景**顶部小 HUD 栏**(高 48px 全宽窄条、浮层覆盖不挤压画面;承载落卡⑤)。 - -**相对现状,新增了什么**: - -1. 交互式营地场景图(10 层场景素材+场景屏+七物件命中区与点选交互)——从零新建; -2. 现四柜台覆盖层(CampOverlay)拆解:锻造工坊/秘宝匣/天赋树/奖励格图鉴四界面抽为独立可开界面,入口改挂场景物件;生涯页入口自主菜单改挂帐篷旁笔记本; -3. 大门动线(开始冒险/继续上局两分支+断点确认弹窗从主菜单移位); -4. 篝火回主菜单小动线(带二次确认);场景屏顶栏预留位(卡⑤ HUD); -5. camp 截图断言段与六探针营地段的迁移(**现无 camp 逐像素 golden 基线**——见契约 10)。 - -**完成定义**: - -1. 营地首页=可点击场景图(10 层按 §0.4 铺底、门洞留空);七物件绑定逐一在役,点各物件进对应界面; -2. 四柜台拆解完毕:CampOverlay 覆盖层形态退役,五界面(锻造/秘宝/生涯/天赋树/图鉴)经新入口可达且**功能与写口链路零回归**(presenter 改造=承载面迁移的一部分——见契约 4); -3. 大门两分支确认弹窗在役;点大门不直接进冒险;cancelled 无变更退回; -4. 篝火经二次确认可回主菜单;场景屏顶栏预留位就绪(卡⑤ 联验); -5. camp 截图=场景图形态(迭代内验收=截图对比,澄清⑥);探针断言迁移完毕; -6. 美术约束(48 色板/禁入带/语义色/WCAG)入闸或登记缺口;**用户目检项登记 07**(生命周期末步,不阻塞); -7. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T6)。 - -## 2. 现状事实(2026-11-01 双审全量复核换新盘面;开工日 T0 仍按「漂移即停卡核对」抽核) - -| # | 事实 | 出处 | -| --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| F1 | 营地场景图完全不存在(澄清④判定「完全没有 · 新建」);现营地=CampOverlay 四柜台覆盖层(树淬炼/锻造工坊/秘宝匣/奖励格图鉴并排,迭代 21 T6 程序占位重排)——原引注释「视觉终稿归 HUD 营地视觉批」已随后续重构删除(2026-11-01 复核,引文退役、事实不变) | `需求澄清-营地交互重做-2026-10-18.md` §④;`game/presentation/views/camp_overlay_view.gd` | -| F2 | 营地屏壳(CampScreen)持 CampOverlay 成员;组合根句柄=`main.ui.modals.camp_overlay`(ui_modals.gd:14;ui_registry.gd:25 LAYER_CONTRACT 模态槽)——`main.camp_overlay` 旧寻址已退役,探针挂载随句柄迁移(F8) | `game/presentation/scenes/camp_screen.gd:8-14`;`game/presentation/ui_modals.gd:14`;`game/presentation/ui_registry.gd:25` | -| F3 | CampOverlay 结构(结构在、行号以 2026-11-01 复核为基准):顶栏铭牌+钥石徽(:125);四柜台并排横滚(树淬炼/锻造工坊/秘宝匣/图鉴——图鉴锁文现 :207);底栏关闭钮+最近冒险条带(:214 起,`_rebuild_recent` :634);钥匙门判据读树投影 | `camp_overlay_view.gd` 各处 | -| F4 | 五目标界面现状:锻造工坊=CampOverlay 内工作间(`_forge_workbench` 两区六路线);秘宝匣=`_ws_scroll`/`_workshop_holder`(12 件+同调装配段+Y 升级行);天赋树=`_tree_holder`(脉分组行板+Fork 双态钮);图鉴=占位;生涯=**已独立全屏页**(CareerOverlay,入口现经组合根函数直调——卡②已撤主菜单生涯钮、改函数直调中间态,shot_probe.gd:103/ui_struct_probe.gd:59「careerbtn 已撤」注;终态=本批改挂帐篷旁笔记本,自带返回钮) | `camp_overlay_view.gd` 四柜台各处;`views/career_overlay.gd` | -| F5 | 营地购买写口链路:视图只发意图信号(`buy_requested`/`tree_buy_requested`/`forge_*` 等),组合根经 CampShopPresenter 转 MetaProgression 写口;投影数据=`camp_shop_presenter.gd:62-72` `camp_data()` 单点 | `camp_overlay_view.gd:8-15`;`camp_shop_presenter.gd:62-72` | -| F6 | 断点确认链已随卡②摘除(main.gd:118-120 注释「弹窗本体与两分支逻辑归卡④大门承接」);main.gd:475-497 现为选档委托(旧「断点弹窗现居主菜单」引文失实,2026-11-01 复核)——断点确认弹窗本卡 T4 承接(卡②移交) | `main.gd:118-120` | -| F7 | 冒险屏已实现不动:选路屏(LevelMapScreen,`route_chosen` 前进唯一通道)与战斗屏宿住 AdventureScreen;组合根侧(2026-11-01 复核行号):`_start_adventure_from_menu` :116/`_resume_from_menu` :150/`build_adventure_params` :183/`_start_adventure` :198——`_on_confirm_new_adventure` 已随卡②摘除(T4 重立消费方编排) | `views/level_map_screen.gd:7`;`scenes/adventure_screen.gd:36-37`;`main.gd` 各处 | -| F8 | 探针面营地段(全部随本批迁移;宿主=`game/probe/`+`game/tests/`——`game/smoke/` 目录已于 2026-10-24 退役(git 16c6f136)、smoke_all.gd 已整体退役(git 957391e1),v3.0 的 `game/smoke/*`+smoke_all 旧盘面写法作废):ui_probe(营地入口+余额+秘宝匣 12 行断言,深员 `_balance_label`/`_tree_buy_btns`/`_workshop_rows`)、ui_click_probe(营地购买全链;**断点确认段**〔经 lvbtn 驱动 ConfirmDialog——被卡②撤钮+本批弹窗移位双杀〕)、screen_flow_probe(营地旗标 :54 直读主菜单句柄——:53 是菜单行,v3.1 订正;营地开合 :119-125 回退段;菜单→冒险 lvbtn 步)、shot_probe(camp 截图+「关闭营地」钮收闭;生涯段函数直调驱动 :103)、ui_struct_probe(camp 结构审计;同槽特例断言)、system_test.gd(V2 营地屏壳实例化 :67-68;V3g 营地模态开合 :520-541)、theme_projection_test.gd:710-717(四柜台等高源码断言段 `_smoke_element_details`——`Vector2(0,336)`×3/`SIZE_FILL`×4/`SIZE_SHRINK_CENTER`≥3,随形态退役)、ui_contrast_probe(营地令牌段〔UiKit 令牌恒等式,不随拆解红;新界面若不再消费 `CAMP_HEADER_BAND`/`CAMP_ROW_PLATE` 则段标签虚挂,须核签〕)、**forge_workbench_test.gd 单测**(:33 直载 camp_overlay_view.gd 并消费 `_forge_rows`/`_forge_workbench`/`open_camp`/`refresh_camp`/三 forge 信号——CampOverlay 一删即红) | `game/probe/` 各处+`game/tests/system_test.gd:67-68`/:520-541+`game/tests/unit/presentation/theme_projection_test.gd:710-717`+`game/tests/unit/presentation/forge_workbench_test.gd:33` | -| F9 | camp UX spec 现行 **camp.md v2.2** 已落文可点击场景图形态(定位/场景构成与七物件绑定/10 层拆分/点选反馈四态/顶栏 48px/叠层与开合);本批实现=**对齐** v2.2,旧三柜台形态已由 v2.2 取代,本批只需回填实装状态与目检结论 | `design/gdd/ux/camp.md:10-51` | -| F10 | art-bible 现行 **v3.31 §6.2** 已落文营地场景 10 层口径(z0 bg 不透明全幅/z1 wall 透明细条门洞缺口/八物件层/篝火命中只下半/围墙落盘 (0,240,1280,70));§7.5 营地界面已改为「可点击场景图+七物件点选」画法;§2.8 承载元素同述;本批实现=对齐现行条款 | `design/art/art-bible.md` §6.2/§7.5/§2.8 | -| F11 | 图鉴内容在册挂起:奖励格图鉴柜台已随配比预设批整体挂起冻结(2026-10-05 用户令,06 在册),重启须用户另行发令——本批只改入口不激活内容 | `design/gdd/systems/跨局循环/生涯.md:63` | -| F12 | 贴图重构批搁置未废:营地与元进度件终稿置换(待办清单.md 在册条)等交互重做定形后再议(澄清③1/§⑧5)——本批不清偿该债;四柜台拆解后原「柜台场景贴图」债对象变化,随该批重新评估(原 `design/gdd/06-待办清单.md` 路径已迁仓库根) | `待办清单.md`(仓库根);`需求澄清-营地交互重做-2026-10-18.md` §③1/§⑧5 | -| F13 | 营地底栏「最近冒险」条带与生涯历史回看同源(同一份 `recent_summaries`),其去留=生涯.md P6 待裁点(期二必答)——CampOverlay 拆解后该条带无处挂,**Q4 已裁=甲**(随四柜台拆解撤下,逐局历史回看归生涯,生涯.md P6 同批注销) | `camp_overlay_view.gd`(底栏 :214 起/`_rebuild_recent` :634);`生涯.md:69` | -| F14 | 素材线纪律:`artwork/` 不入 git(`.gitignore:54` 忽略行)——批次 worktree 内无该目录、主工作区 D:/code/g-plan2 实体存在(在途工作区);涉素材脚本须传主区绝对路径否则静默 0 张;素材替换前先归档旧档;终稿归 `game/assets/art/scene/`;**消费常量 `UiKit.TEX_CAMP_*` 尚不存在**(全仓 grep 零命中,仅 art-assets-checklist.md:135 文字提及)——本批在 `ui_kit.gd` 新增十键(T1 先定常量、素材名跟常量走,防断链;2026-11-01 裁) | `AGENTS.md:32`;`.gitignore:54`;art-bible §8.3 归档纪律;art-assets-checklist.md §3.5 | -| F15 | 美术硬约束继续有效(澄清③4):明亮轻快像素风、**48 色板、HSV 300°–345° 禁入带、语义色纪律、WCAG ≥4.5:1**——全局约束,不在本讨论范围翻案 | `需求澄清-营地交互重做-2026-10-18.md` §③4 | -| F16 | 像素级规格已定(Q6 甲过渡口径+渠道 B):1280×800 工程档、烛光黄 #F6C667/木色 #8A5A34、2× 源档出图最近邻降采样(art-assets-checklist.md §3.5);终档归样张批冻结清单后置换(反哺点);卡内禁自定像素规格数值 | `design/art/art-assets-checklist.md` §3.5;`design/art/art-bible.md` §6.2 | -| F17 | 机检工具面:**截屏级 48 色计数不在役**;在役=`tools/palette_check.py`(art-bible §8.3①挂点——48 设计色板令牌+新增色双门)+`tools/standee_asset_check.py`(像素画单张 32 色冻结执法);`tools/render_gate.sh`(shot_probe 七屏→shot_checker 语义断言;golden 段=棋盘三张+menu_boot 四张,**无 camp golden**——shot_checker.py:143 明载「camp/level 走骨架+目检清单」);shot_checker 段=屏级骨架/文字 WCAG/明度三档带/文字禁压纹理/文字在判据 | `tools/palette_check.py`;`tools/standee_asset_check.py`;`tools/render_gate.sh`;`tools/shot_checker.py:143` | -| F18 | 参照物已补(2026-10-23)=`artwork/2026-10-23-营地场景/Gemini_Generated_Image_ykrc0nykrc0nykrc.jpg`,已进 camp-scene-prompts.md §1 风格参考图表登记为「作者提供的参照物」,与纵深稿对过表、围墙结构冲突已呈报;参照物只是参考图,保留 `artwork/`、不入 git、不入游戏目录 | `design/art/camp-scene-prompts.md` §1;`artwork/2026-10-23-营地场景/` | -| F19 | 10 层拆分现行口径(覆盖旧 8/9 张):art-bible v3.31 §6.2/camp.md v2.2/camp-scene-prompts.md v1.2/asset-path-map.md §3/art-assets-checklist.md §3.5 同步;围墙从背景层独立成 z1、门洞小路画在 z0 bg 层;围墙落盘细条 (0,240,1280,70) 不做全幅 | `design/art/art-bible.md` §6.2;`design/gdd/ux/camp.md:27-31` | -| F20 | 样张过审与终稿裁定(2026-10-31 用户裁定):保留全部待选稿、各素材第一张样本稿为终稿、「目前我看每个都还可以接受」,用户准备在游戏内做最终审核;终稿此刻=原始候选图本身,未做去底/擦水印/降采样/裁细条等任何后处理(用户 2026-10-31 令只生成素材不做后续工序);清单=`artwork/candidates/_终稿裁定-2026-10-31.txt` | `artwork/candidates/_终稿裁定-2026-10-31.txt` | - -## 3. 设计契约(红线,违反 = L3 停机呈报) - -🔴 **契约 1 · 交互式场景图形态**:营地首页=一张可点击的营地场景图,点物件进界面(澄清①)。**禁退回文字按钮列表+面板覆盖层形态**(澄清②反参照:「完全普通的那种 UI 设计」「各种框框」——用户判现状「交互流程完全错误」)。 - -🔴 **契约 2 · 七物件绑定逐一落地**:大门/锻炉铁砧/宝箱/帐篷旁笔记本/木桩/布告板/篝火七个绑定(§1 表)缺一不可;禁合并、禁以「其他入口」替代(如顶栏文字钮)。帐篷为承载件、不可点。 - -🔴 **契约 3 · 大门两分支**(裁决 5,Q5 已裁=甲):有未完冒险→ConfirmDialog 三出口「继续上一段冒险/开始新冒险/取消」;无→「是否开始新冒险:是/否」弹窗。**点大门永远先出确认,不直接进冒险**;cancelled 恒=无变更退回营地;弹窗类=ConfirmDialog(三钮化+消费方编排=T4,卡③ 契约 3 同款互指)。 - -🔴 **契约 4 · 已实现界面只改挂不重做+presenter 承接面**:锻造工坊/秘宝匣/天赋树/图鉴/生涯五界面「界面已实现 · 入口改挂」——功能、行板、写口链路零重设计(拆解=承载面迁移)。**presenter 改造=承载面迁移的一部分**:`camp_shop_presenter.gd` 持 `camp_overlay` 句柄(:10)、写口尾刷新调用八处(七口+`on_camp_buy` 双尾)全部 `camp_overlay.refresh_camp(camp_data())`(:82/90/102/114/126/139/151/165,2026-11-01 复核实数)、`CampFlowContext` 持类型化字段(camp_flow_context.gd:10/22/29)、open/close 编排(:41-56)——**写口语义零改≠presenter 文件零改**:投影目标改线(五界面/场景根)、写口尾刷新改路由、open/close 编排随入口从 campbtn 迁位到卡③ 进档动作、ctx 字段语义订正、探针缝保位(组合根薄委托缝,T0 复核现役行号——原引 main.gd:1163-1171 超出文件实长、系旧盘面残留)。改造纪律:`on_camp_attune_toggle` 口尾(:102)只 refresh_camp、不调 `_refresh_presentations`(与其余口不一致)——**保持原样,禁「顺手统一」防行为漂移**。 - -🔴 **契约 5 · 图鉴内容保持挂起**:只改入口(布告板),不激活图鉴内容(F11:2026-10-05 用户令冻结,重启须用户发令);布告板点开的图鉴=现行占位态(T3 定义占位壳),不是禁用态(camp.md v2.2)。 - -🔴 **契约 6 · 冒险进行中不开营地**(澄清③6):营地是存档语境(局外)枢纽,现状口径延续;局内只读面=状态面板(在役,本批零改动——其「营地三柜台进度」文案若因拆解失义,列反哺点归文档批订正)。 - -🔴 **契约 7 · 美术硬约束+10 层红线**:48 色板、HSV 300°–345° 禁入带、语义色纪律、WCAG ≥4.5:1(F15);场景素材全局纹理过滤=Nearest(project.godot 现行默认,像素纪律)。**10 层拆分按 §0.4**:z0 bg 不透明全幅(含门洞小路)、z1 wall 透明细条 (0,240,1280,70) 门洞 x520–760 留透明缺口、z2–z6 八物件层;围墙禁并回背景层、门洞禁填死、门洞禁被任何物件遮挡。点选反馈四态(悬停=轮廓亮边+浮动〔整像素吸附〕+名牌〔物件下方 8px 居中、字号 14、对比 ≥4.5:1〕/按下=位移 1px/禁用=降明度+去饱和〔仅锻炉、宝箱〕/已解锁=常态)零新素材、全程序化;命中区两两不相交、不越画面、不侵入顶栏禁区 y≤48。篝火命中矩形只取下半(火堆),火焰只展示。 - -🔴 **契约 8 · 像素规格不硬定**:尺寸档/色板/明度档只写指针(Q6 甲过渡口径=1280 工程档+烛光黄/木色,落 art-bible §6.2/art-assets-checklist §3.5,F16);卡内禁自定像素规格数值;终档置换归反哺点,执行归用户线;禁批内自补、禁 T0 现场发挥。 - -🔴 **契约 9 · 迭代内验收=截图对比+终稿落盘口径**(澄清⑥):camp 截图须为场景图形态;用户实机目检=生命周期最后一步、统一进行、**不阻塞迭代**——目检项登记 07 清单即完成义务。**T1 终稿落 `game/assets/art/scene/` 的「验收」口径=迭代内验收**(截图对比+shot_checker 机检+样张过审留痕)——营地屏整屏样张按既定排队行延后(§0.5),不构成对 art-bible §7.5「前置」条的违背(§5 反哺点注)。 - -🔴 **契约 10 · 探针断言迁移契约**(属仓库既有测试纪律的卡内成文,非用户裁决):F8 全量位点逐点显式迁移并留痕;**现无 camp 逐像素 golden 基线**(F17:golden 现役仅棋盘三张+menu_boot)——本批不建 camp golden(「把不存在的东西列进迁移清单」禁),camp 截图验收=shot_probe 出图+shot_checker 语义断言段;若要新建 camp golden 须另裁登记(L3)。 - -🔴 **契约 11 · 拆分边界纪律**(结构类卡必填,判据权威=`design/engineering/code-conventions.md` §1.1,本卡写条款、不复制定文):本卡含「四柜台拆解」,拆分沿**职责轴**不沿阈值轴——每个拆出单元(锻造/秘宝/天赋树/图鉴四界面 view)须有可陈述的职责语句与单一变化原因、须有集体身份(命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁);「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿(写进 §8 L3)。实现报告逐件一行承载职责语句。 - -🔴 **契约 12 · 禁为机检文本保留无效成员**(重构类卡必填条款,与 code-conventions §1.1 同款):禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。 - -## 4. 范围边界 - -**做**:场景屏+10 层场景素材铺底+七物件命中区与点选交互(四态规格按 camp.md v2.2——§0.3 P3 已销号=camp.md v2.2 四态规格即设计稿);四柜台拆解与五界面入口改挂(含 presenter 承接面改造);大门动线两分支+断点弹窗移位;篝火回主菜单小动线(带二次确认);场景屏顶栏预留位;断言/探针迁移;反哺点清单。 - -**不做**(明示去向): -- **不做贴图重构批**(澄清③1):柜台场景贴图/钥石顶栏图标/永久强化条目图标的达标化置换——搁置未废,待交互重做完形后重新评估立项(F12); -- 不激活图鉴内容(契约 5); -- 不改五界面功能与写口链路(契约 4); -- 不改冒险屏/选路屏/战斗屏本体(F7 已实现不动); -- 不做整屏样张闸、不替代样张批、不新建 camp golden(§0.5/契约 10); -- 局内状态面板零改动(契约 6); -- 素材后处理与入库属实现段 T1/`asset-ingest` 第 3 步(§0.3-4 授权形态:/iter 开工令即含授权),不属写卡门; -- ESC 浮窗与顶栏 HUD 实现 → 卡⑤(本卡只留顶栏位+定义刷新单口); -- 选档界面/主菜单/数据层 → 卡③/卡②/卡①。 - -## 5. 关联文档同步面 - -> **现行口径**:实现批禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`(+`game/` 实施本体);设计权威文档(GDD/art-bible)与机械面文档(roadmap/体验验证清单/README)对代码实现批一律不直改,逐条列进 `reports/iter-反哺点-<日期>.md`,用户裁决后归文档批落文;本卡全表义务格一律为「反哺点 · 列清单」。camp.md v2.2/art-bible v3.31 §6.2 已先行落文 10 层新形态,本批实现=对齐现行条款,反哺义务为**实装状态回填+目检结论**,非形态改版。美术素材产物按素材线纪律落 `artwork/`(在途)→ `game/assets/art/scene/`(终稿),不随 git 合并(F14)。 - -| 文档 | 关联点 | 同步义务 | -|---|---|---| -| `design/gdd/ux/camp.md` v2.2 | §定位/§场景构成与七物件绑定/§点选反馈/§顶栏/§叠层与开合:新形态已落文,本批实现后回填实装状态、样张过审留痕、实机目检结论 | 反哺点 · 列清单(实现批禁写 `design/`) | -| `design/art/art-bible.md` v3.31 | §6.2 营地场景 10 层口径已落文;§7.5 营地界面画法、§2.8 承载元素、§1.4 营地屏整屏样张排队行注记(本批不跑样张闸) | 反哺点 · 列清单(权威面零直改,过用户裁决后归文档批) | -| `design/art/camp-scene-prompts.md` v1.3 | §5「待裁」节五点已裁断(2026-11-01 用户裁:①帐篷追认现值②门扇追认现值③布告板 (845,268,130,140)④描边奶油色追认⑤环境子板色值不前置、T1 量化后按 §4.1 登记)——**已落文(2026-11-01 本会话文档批):camp-scene-prompts.md v1.3 §5 改已裁+art-bible.md v3.31 §6.2 待裁行改已裁,义务了结** | 已落文 · 义务了结 | -| `design/gdd/systems/跨局循环/生涯.md` | :69 与营地边界表(条带 `_rebuild_recent` 随 CampOverlay 拆解去向=Q4 已裁甲);:63 图鉴挂起条(入口改挂注记) | 反哺点 · 列清单 | -| `design/gdd/08-Alpha版本标准.md` | 「三 · 界面」营地行(:104)形态注记改写——状态列可改;注记改写列反哺点;增删行须用户裁(三卡统一口径) | 反哺点 · 列清单 | -| `design/gdd/06-待办清单.md` | 本卡登记条;UI 贴图重构批条(:21-27)注记「四柜台对象变化、重评待交互重做完形」;图鉴挂起条注记 | 反哺点 · 列清单(实现批禁写待办清单) | -| `design/gdd/07-体验验证清单.md` | 新增实机目检条(场景观感/七物件辨识与点选反馈/大门两分支/篝火动线)——登记不阻塞 | 反哺点 · 列清单(实现批禁写体验验证清单,入册条目由文档批落) | -| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单(实现批禁写 roadmap) | -| `game/tests/README.md` | 能力行入表(§7 对照表「能力行」列定名) | **已入表**(旅程段六,本卡七条新增能力行在役;v3.1 V14 用例锚随批补)——实现批只核对名实一致,禁写 | -| `game/presentation/*`、`game/probe/*`、`game/tests/**`(含 forge_workbench_test 迁移面)、`game/tests/golden/*`(仅棋盘/menu 既有基线复跑)、`game/assets/art/scene/*`(10 层终稿) | 实现/断言/终稿素材本体 | 实施本体(可写) | -| `tools/shot_checker.py` | camp 取样面语义断言段(文字 WCAG/明度三档带/文字禁压纹理/文字在判据扩 camp) | 实施本体(可写,属工具/测试面) | - -## 卡前·文件结构与职责(T0 前) - -定义 T 卡前先列全本批新建/修改文件,一文件一职责。**每个文件行标「行为改动/非行为改动」并指向 §7 对照表行号;「落位」列与「落位与可复用性预检」节互指**(标「新建」的必须能在预检节指到不能复用的理由与唯一落点核查)。行号为开工日 T0 复核对象。 - -| 文件 | 职责 | 改动类型 | 落位 | 对照表行 | -|---|---|---|---|---| -| `game/presentation/views/camp_scene_view.gd` | 交互式营地场景图视图:10 层纹理铺底(z0–z6)+七物件命中区+点选反馈四态+名牌(节点选型=Control 根+TextureRect 层+子节点序即 z 序,T2) | 行为改动 | 新建 | V1/V2/V9/V10 | -| `game/data/tables/camp_scene_layout.tres` | 10 层贴图矩形/命中矩形/z 序/门洞缺口坐标(数值单一事实源 `data/tables/`;schema 类+表现域容器类型化成员,先例 battle_layout.tres=`core/config_db.gd`/`core/config_domain_presentation.gd`;加载期 fail-fast 校验命中区几何,T2) | 行为改动 | 新建 | V1/V2/V9/V14 | -| `game/presentation/views/camp_refresh_bus.gd` | 营地刷新单口:各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成(卡⑤ 同口挂接;头注自陈「非 autoload、非信号广播——组合根单点推送」) | 行为改动 | 新建 | V8/B1 | -| `game/presentation/views/forge_view.gd` | 锻造工坊独立可开界面(自 CampOverlay `_forge_workbench` 抽出,界面逻辑复用) | 行为改动 | 新建(抽出) | V4/B2 | -| `game/presentation/views/treasure_view.gd` | 秘宝匣独立可开界面(自 `_ws_scroll`/`_workshop_holder` 抽出) | 行为改动 | 新建(抽出) | V4/B2 | -| `game/presentation/views/tree_view.gd` | 天赋树独立可开界面(自 `_tree_holder` 抽出) | 行为改动 | 新建(抽出) | V4/B2 | -| `game/presentation/views/codex_view.gd` | 奖励格图鉴独立可开界面占位壳(内容保持挂起,契约 5) | 行为改动 | 新建(抽出) | V4/V6/B2 | -| `game/presentation/scenes/camp_screen.gd` | 屏壳改造:持 camp_scene_view 取代 CampOverlay 成员+顶栏 HUD 预留位+模态栈单口 | 行为改动 | 复用既有(改造) | V1/V8 | -| `game/presentation/views/camp_overlay_view.gd` | 四柜台覆盖层拆解后退役(无消费面即删,吸收即死) | 行为改动 | 退役 | V4/V9/B2 | -| `game/presentation/views/career_overlay.gd` | 生涯页入口自主菜单改挂帐篷旁笔记本(本体零改,返回钮文案禁含「营地」) | 行为改动 | 复用既有(改入口) | V5 | -| `game/presentation/views/confirm_dialog.gd` | 三钮化(继续上一段冒险/开始新冒险/取消) | 行为改动 | 复用既有(改) | V3/B1 | -| `game/presentation/camp_shop_presenter.gd` | 投影目标改线+写口尾刷新改路由+open/close 编排迁位(契约 4;路径订正——v3.0 写 `presenters/` 子目录不存在) | 行为改动 | 复用既有(改) | V4/V8/B1 | -| `game/presentation/camp_flow_context.gd` | 类型化字段语义订正(路径订正——v3.0 写 `core/` 子目录不存在) | 行为改动 | 复用既有(改) | V4/B1 | -| `game/presentation/ui_camp_modals.gd` | 营地域模态句柄子容器(卡⑥ 前置建件;本卡 T3 落场景根+四子界面五枚句柄,卡⑤ T1 落浮窗句柄;寻址 `ui.modals.camp.X` 二层) | 行为改动 | 新建(卡⑥) | V1/V8 | -| `game/presentation/ui_modals.gd` | 本卡零句柄新增(营地域句柄落 ui_camp_modals.gd 子容器,2026-11-01 用户裁);类变量 14 不升(S13 预期,见「实现规范预算·存量触面一查」) | 非行为改动(卡④ 段零改) | 复用既有 | V1/V8 | -| `game/presentation/main_ui_build.gd` | 新层实例化装配点:各 `.new()`+装配尾 `apply_layer_contract(root)`(先例 :105/:121/:242);五句柄赋值经 `modals.camp.X` 子容器 | 行为改动 | 复用既有(改) | V1/V8 | -| `main.gd`(组合根) | 断点弹窗移位+ConfirmDialog 三钮消费方编排+营地入口改挂+篝火动线+开层互斥/关层收闭 | 行为改动 | 复用既有(改) | V3/V4/V7/B1 | -| `game/assets/art/scene/scene_camp_*.png`(10 张) | 10 层场景素材终稿(asset-ingest 第 3 步拷入,命名对齐 `UiKit.TEX_CAMP_*`——常量十键本批在 `ui_kit.gd` 新增) | 非行为改动(美术资源) | asset-ingest | V1/V10 | -| `game/probe/shot_probe.gd` | camp 截图路径改场景图+收闭改接篝火动线 | 非行为改动(测试面) | 复用既有(改) | V1 | -| `game/probe/ui_click_probe.gd` | 七物件可达+大门两分支+断点确认段改走大门+写口链迁移+深员改指 | 非行为改动(测试面) | 复用既有(改) | V2/V3/V4 | -| `game/probe/ui_probe.gd` | 营地入口/余额/秘宝匣深员改指新界面 | 非行为改动(测试面) | 复用既有(改) | V4 | -| `game/probe/screen_flow_probe.gd` | 营地旗标新语义+回退段改新场景根 closed/篝火动线 | 非行为改动(测试面) | 复用既有(改) | V7 | -| `game/probe/ui_struct_probe.gd` | 反参照结构禁词+生涯段驱动改接+图鉴占位锚定+camp 场景层序段(V1 补立) | 非行为改动(测试面) | 复用既有(改) | V1/V5/V6/V9 | -| `game/probe/ui_contrast_probe.gd` | 营地令牌段核签(CAMP_HEADER_BAND/CAMP_ROW_PLATE 消费判定) | 非行为改动(测试面) | 复用既有(改) | V10 | -| `game/tests/system_test.gd`+`game/tests/unit/presentation/theme_projection_test.gd` | V2 实例化/V3g 模态开合改指(system_test :67-68/:520-541)+四柜台等高源码断言段重写或注销(theme_projection_test :710-717)——`game/smoke/smoke_all.gd` 已退役,v3.0 旧位点作废 | 非行为改动(测试面) | 复用既有(改) | V4/B2 | -| `game/tests/unit/presentation/forge_workbench_test.gd` | 随锻造视图抽出同迁(断言零改、只换承载类) | 非行为改动(测试面) | 复用既有(改) | V4/B2 | -| `tools/shot_checker.py` | camp 取样面语义断言段 | 非行为改动(工具/测试) | 复用既有(改) | V10 | -| `game/tests/README.md` | 能力行入表(四列:能力|系统|真实入口|代表用例) | 非行为改动(文档,写卡段) | 主 Agent 统一收口 | 全表能力行 | -| `reports/iter-实现报告-<日期>.md`/`reports/iter-反哺点-<日期>.md`/`reports/iter-验收审计-<日期>.md` | T6 三份产出物 | 非行为改动(过程件) | 新建 | T6 | - -## 落位与可复用性预检 - -定义 T 卡前,对本批每个**新增文件/新增函数/新增数据件**过三问(复用面/唯一面/分层与交互面),与「卡前·文件结构与职责」互指。生效=2026-10-21 用户立规;本卡虽文件名日期 2026-10-18,经 2026-10-31 用户明令重立为现行有效卡,按现行规则补齐。 - -### 新增件三问 - -| 新件 | 复用面(grep 同职责实现) | 唯一面(grep 同名同义标识符) | 分层与交互面(调用路径+跨层出口) | -|---|---|---|---| -| `camp_scene_view.gd` | 盘上视图件=CampOverlay(四柜台覆盖层,形态本批退役、与场景图形态正交,反参照禁复用)、CareerOverlay(生涯全屏页,职责不同)、camp_screen.gd(屏壳)。**无**「场景图铺底+七物件命中区+点选反馈」同职责实现 → 不能复用,须新建视图件;屏壳复用既有 `camp_screen.gd` 改造,不新建屏壳 | grep `camp_scene`/`scene_camp` 视图标识符盘上无第二处;素材消费常量 `UiKit.TEX_CAMP_*` 单点(asset-path-map.md §3),不另立路径常量 | 呈现层视图,零 Core 写调用;命中区 `_gui_input()` → `object_pressed(key: String)` 信号 → 组合根 → 开界面/写口;10 层装载经 `UiKit.load_tex()`(exists 守卫、禁 preload);不直连 MetaProgression | -| `camp_scene_layout.tres` | grep `game/data/tables/` 无营地坐标表;坐标草案在 artwork HTML(不入 git)与 camp-scene-prompts §2.3(设计文档,非运行时数据源)。数值单一事实源要求落 `data/tables/` → 新建 | 坐标事实只此一处;禁在 `camp_scene_view.gd`/探针/T 卡各写一份坐标字面量(契约 8 禁自定规格、数值单点) | 视图启动时经 ConfigDB 单点读取(schema 类+表现域容器类型化成员,先例 battle_layout.tres);坐标值按 §0.3-3 五裁点裁断(2026-11-01)由 T2 定值落入 | -| `camp_refresh_bus.gd` | grep 现役 `refresh_camp` 绑定 CampOverlay 句柄(F5),随四柜台形态**退役**(卡⑤/§0.5 明确「非已退役的 refresh_camp」);新单口须同时刷新现开界面与场景根 HUD、职责不同 → 不能复用,须新建 | grep `camp_refresh`/刷新单口类标识符盘上无第二处;卡⑤ HUD 刷新挂此单口,不另立第二口 | 组合根拆件:七写口尾 → `CampRefreshBus.refresh(camp_data: Dictionary) -> void` → 现开界面刷新+场景根 HUD 刷新;一次性刷新,不新增写口语义(契约 4) | -| `ui_camp_modals.gd`(卡⑥ 建件,本卡落五枚) | grep 句柄分域容器无先例;`UiModals` 本体=按技术角色平铺的注册面容器(职责不同)、`ModalFlow`=调度器非句柄册 → 不能复用,须新建(卡⑥ 已立卡) | grep `UiCampModals`/`ui_camp_modals` 无第二处;营地句柄寻址唯一落点 | RefCounted 不挂树;`main_ui_build` 构造注入 `ui_modals.camp`;`register_layer`/LAYER_CONTRACT/树序零触碰(句柄册结构≠树结构) | -| `forge_view.gd`/`treasure_view.gd`/`tree_view.gd`/`codex_view.gd` | 界面逻辑**已实现**于 CampOverlay 内(F4:`_forge_workbench`/`_ws_scroll`/`_tree_holder`/图鉴占位);本批是抽出承载壳、**复用既有界面逻辑**(行板/写口链路零重设计,契约 4),非从零新写 → 新建壳、迁移逻辑 | grep `forge_view`/`treasure_view`/`tree_view`/`codex_view`/`_forge_rows`/`_forge_workbench` 盘上无第二处定义;`forge_workbench_test.gd:33` 消费 `_forge_rows`/`_forge_workbench`,抽出后同迁,断言零改只换承载类 | 各视图发意图信号(`buy_requested`/`tree_buy_requested`/`forge_*`)→ 组合根 → CampShopPresenter → MetaProgression 写口(Core 零 UI 不破);五界面各带返回/关闭钮;开合走模态栈单口、层序入 `LAYER_CONTRACT` | - -### 非新增件说明 - -- `camp_screen.gd`/`camp_shop_presenter.gd`/`camp_flow_context.gd`/`confirm_dialog.gd`/`career_overlay.gd`/`main.gd`:存量文件改造,不新增文件;公开方法/成员预算见「实现规范预算」存量触面一查。 -- `camp_overlay_view.gd`:四柜台拆解后无消费面即删(吸收即死),禁留死代码;`main.camp_overlay` 探针句柄迁移留痕(F2/F8)。 -- `game/tests/golden/*`:棋盘三张+menu_boot 既有基线复跑,不新建 camp golden(契约 10)。 -- **数据件**:本卡纯呈现层,零玩法数值、无新增 `data/tables/` 玩法表(`camp_scene_layout.tres` 为呈现坐标件,非玩法数值);数值单一事实源 `data/tables/` 不被玩法值触碰;RNG 零新增(RNG 单点 RngService 不被触碰);Core 零 UI 依赖不因新增场景屏绕过。 - -## 实现规范预算 - -定义接口块/文件结构图前,对本批每个**新增文件**对照 gdstyle 默认阈值做预算,与接口块及「卡前·文件结构与职责」互指。**生效说明**:规范写「生效=文件名日期 ≥2026-10-27,此前卡片属历史留档不回头改」——本卡经 2026-10-31 用户明令重立为现行有效卡,按现行规则补齐,不援引「不回头改」跳过。gdstyle v0.4.0 默认阈值:**公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6**(阈值取工具默认,改阈值=基线口径变须在本批重生成)。 - -### 新件三查 - -| 触面 | ①公开方法数 | ②成员变量数 | ③迁移函数对账 | 结论 | -|---|---|---|---|---| -| `camp_scene_view.gd` | 预期 ≤8:`setup_layers()`/`bind_hotspots()`/`set_feedback_state()`/`get_hotspot_rect()`/`set_hud_band()`/`_on_hotspot_input()` 等,远低 ≤20 | 预期 ≤12:10 层纹理句柄+命中区表+反馈态+名牌节点;收编进内聚结构,低 ≤15 | 无自存量文件迁入函数 | 三查通过;T0 实测实数回填,超阈值即拆件或砍面(砍面=退设计段裁职责) | -| `camp_refresh_bus.gd` | 预期 ≤3:`refresh()`/`bind_targets()`/`_dispatch()`,远低 ≤20 | 预期 ≤4:现开界面句柄+场景根 HUD 句柄+投影数据,低 ≤15 | 自 `camp_shop_presenter.gd` 迁入刷新路由;先查 `tools/gdstyle_baseline.txt` 源函数键,branches/returns/函数长超默认登记值的迁移即拆函数(拆分不改语义,不算迎合机检) | 三查通过;迁入后补跑 S13,不凭旧读数放行 | -| `ui_camp_modals.gd`(卡⑥ 建件) | 预期 ≤1(`_init`) | 预期 5(本卡 T3 落五枚;卡⑤ 落满 6),低 ≤15 | 无迁入函数 | 三查通过(卡⑥ 卡面已立预算) | -| 四界面 view(各) | 各预期 ≤6:`open()`/`close()`/`bind_rows()`/`_on_action()` 等,远低 ≤20 | 各预期 ≤10:复用既有行板成员(`_forge_workbench`/`_ws_scroll`/`_tree_holder`),低 ≤15 | 自 `camp_overlay_view.gd` 迁入对应界面函数;逐个对 `tools/gdstyle_baseline.txt` 源键,超登记值即拆函数 | 三查通过;抽出后实测实数回填 | -| `camp_scene_layout.tres` | 不适用(数据件,无方法) | 不适用(结构键,非类变量) | 不适用(无迁入函数) | 结构键唯一,坐标值按 §0.3-3 五裁点裁断(2026-11-01)由 T2 定值落入 | - -### 存量触面一查 - -本卡触碰存量文件:`camp_screen.gd`/`camp_shop_presenter.gd`/`camp_flow_context.gd`/`confirm_dialog.gd`/`career_overlay.gd`/`camp_overlay_view.gd`(退役)/`main.gd`/`ui_modals.gd`/`ui_registry.gd`/`main_ui_build.gd`/探针七件/`forge_workbench_test.gd`。**T0 读数步骤写明「S13 键较 `tools/gdstyle_baseline.txt` 登记值只降不升」的预期与达成手段**:`ui_modals.gd` 类变量 14→14(−平铺 `camp_overlay`+camp 容器成员由卡⑥ 建件承担——营地域句柄一律落 `ui_camp_modals.gd` 子容器,2026-11-01 用户裁,禁平铺);`ui_registry.gd` +camp 二层解析分支(分支数 ≤8);`main_ui_build.gd` 装配行改指(方法面微增,T0 实测对账);CampOverlay 拆解=删四柜台代码(键只降);`camp_shop_presenter.gd` 改造=投影目标改线、不新增公开方法/成员;`main.gd` 组合根=断点弹窗移位+消费方编排(新增私有状态量一枚,S13 类级键只降不升);探针改接=替换断言段、不新增扫描面键。任何 S13 键被迫上升=§8 L3 停卡。 - -### 指标例外通道 - -现预算内,无需例外。若场景视图十层句柄+七命中区+反馈态实测超 15 类变量,或组合根成员超基线,设「指标例外申报」节——键名+理由+用户特批落基线;未申报的超预算面进实现段=停卡退回写卡段(写进 §8 L3)。 - -## 6. 任务卡 - -> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。步骤用 `- [ ]` 复选框记步,一步=一个动作+一个可核查结果;每卡声明「取用/产出」接口块,后卡引用的名字与早卡定义逐字一致;禁占位待定句式(不决定任何事的行不留)。**天然切分点=T1 出口**(场景素材归档齐)——美术线与代码线可分批交付(用户批次归属裁);若单批跑超迭代盒,T3 末(四柜台拆解完)为次切分点。 - -### T0 事实坐实与设计输入齐备检查(≈0.5d) - -- 取用:待办清单条目状态(文档设计已闭合+美术设计已闭合+已写卡)、§0 重立凭据、art-bible v3.31 §6.2、camp.md v2.2、camp-scene-prompts.md v1.2、`_终稿裁定-2026-10-31.txt`、布局草案-1280x800.html。 -- [ ] 复核 §2 F1–F20 全部 `file:line` 行号;四柜台界面清单与探针面清单(F8)逐点过——漂移即停卡核对,不猜行号。 -- [ ] 设计输入齐备检查:Q1(美术渠道=B 已裁)/Q2(参照物已补)/Q4(条带=甲)/Q5(三钮=甲)/Q6(过渡口径=甲)/Q8(出稿方式=甲)状态逐项核为已裁;**代码段开工门**(§0.3 四项)状态逐项核为已裁断销号(2026-11-01)——若发现裁断实况反转=L3 停机呈报,禁批内自补。 -- [ ] **新场景根句柄名+四子界面(forge/treasure/tree/codex view)+场景层 `LAYER_CONTRACT` 槽名定稿**(显式验收点,2026-11-01 双审补立——卡⑤ 只消费不改名);句柄落 `ui_camp_modals.gd` 子容器(卡⑥ 前置建件,寻址 `ui.modals.camp.X` 二层)+`main_ui_build.gd` 装配点(卡⑤ v1.5 文件表同步列)。 -- [ ] **跨卡排序登记**:camp 断言基线建立在无 HUD 场景屏(本卡 T5);卡⑤ T2 落 HUD 后由卡⑤ 限 HUD 区显式更新+呈报(卡⑤ v1.4 §0 已对齐)。 -- [ ] 规格清单依赖核检:样张批规格清单产出时点 vs 本批排期——按 Q6 甲过渡口径执行(1280 工程档+烛光黄/木色,终档置换归反哺点),禁 T0 现场发挥。 -- [ ] 跑 `bash tools/static_scan.sh` 开发期局部读数(gdstyle 键=S13,闸件 `tools/gdstyle_gate.py`——原 `tools/gdstyle.sh` 不存在,v3.1 订正),记录 `camp_screen.gd`/`camp_shop_presenter.gd`/`main.gd` 当前行数、类变量、公开方法数;登记 S13 基线键(预期只降不升)。本步为最窄确认,不构成验收。 -- [ ] 与卡③ 对齐 ConfirmDialog 消费方编排机制(T4 互指)、与卡⑤ 对齐顶栏位与营地刷新单口(§0.5 跨卡接口)。 -- 产出:基线 commit、S13 实数、设计凭据核对表、代码段开工门未销号清单;后续卡只按本卡契约施工。 - -### T1 场景素材终稿录入(asset-ingest 第 3 步,≈1–1.5d;后处理授权随 /iter 开工令,§0.3-4) - -- 取用:P1=B 渠道已裁(2026-10-22)、P4 参照物已补(2026-10-23)、Q6 甲过渡口径已裁(1280×800+烛光黄/木色、2× 源档最近邻降采样)、`_终稿裁定-2026-10-31.txt`(各素材第一张样本稿为终稿、保留全部待选稿)、camp-scene-prompts.md §2–§4。 -- [ ] 按终稿裁定清单核对十层指定文件(z0 bg/z1 wall/z2–z6 八物件层),确认各取第一张样本稿为终稿、其余候选保留不删。 -- [ ] 后处理(**授权形态已裁 2026-11-01:/iter 开工令即含本步授权**,不再两次发令):去底转透明(bg 不去底、全幅不透明)/擦通道水印/降采样/围墙层裁细条 (0,240,1280,70) 不做全幅/色板量化/四联底测试条——工具清单见 `design/art/art-pipeline-tools.md`。**降采样逐张登记换算式**(2026-11-01 双审补立):2560×1600 档=÷2 最近邻;**1024×1024 档无整数倍降采样(1024<1280)**——按非整数缩放显式特批登记(L2 记录+实现报告申报像素纪律局限),不回炉重出(追认 2026-10-31 已过审终稿优先、免美术线重开),禁现场默认。 -- [ ] 产物落盘:`artwork/`(在途,主区绝对路径)→ 验收后终稿 `game/assets/art/scene/`;替换先归档旧档;命名 `scene_camp_<键>.png` 对齐消费常量 `UiKit.TEX_CAMP_*`(常量十键本批在 `ui_kit.gd` 新增——先定资源路径常量、素材名跟它走,防断链;asset-path-map.md §3/art-assets-checklist.md §3.5);texture 导入口径=mipmaps 关、filter 跟项目默认(Nearest,project.godot 现行)。 -- [ ] 美术硬约束入产线(契约 7):48 色板/HSV 300°–345° 禁入带/语义色/WCAG/Nearest;**色板机检二器复用**(`palette_check.py` 48 令牌+新增色双门/`standee_asset_check.py` 像素 32 色冻结)。 -- [ ] 方向稿选划留痕:用户 2026-10-31 已裁「第一张样本稿为终稿、保留全部待选稿、每个都还可以接受」,选划三段表进开工单;本批不再重跑方向稿工序。 -- [ ] 终稿落盘「验收」口径=契约 9(迭代内验收:截图对比+shot_checker 机检+样张过审留痕)。 -- 产出:十层终稿入 `game/assets/art/scene/`(`UiKit.TEX_CAMP_*` 常量对齐)+素材线在途/归档清单;T2 可挂接。 - -### T2 场景视图与点选交互(≈1.5–2d) - -- 取用:T1 十层终稿 `UiKit.TEX_CAMP_*`、`camp_scene_layout.tres` 坐标结构键、camp.md v2.2 点选反馈四态规格、§0.3 P3 已销号(camp.md v2.2 四态规格即设计稿)。 -- [ ] 节点选型(2026-11-01 godot-master 审查定案):**Control 根+TextureRect 层+子节点序即 z 序**;禁 CanvasLayer(绕开 LAYER_CONTRACT 树序落位)、禁 z_index、禁 Sprite2D 根(项目视图全 extends Control;全屏 UI canvas_items 拉伸需 Control 锚点;ui_registry.gd:76 落位口按子节点序 move_child)。命中区=TextureRect 分区+`_gui_input()`(§9-3 域内确认 TextureRect 分区)。 -- [ ] 在 `game/presentation/views/camp_scene_view.gd` 实现 `setup_layers()`:按 §0.4 z0–z6 铺 10 层(bg 不透明全幅/wall 透明细条 (0,240,1280,70)/门洞 x520-760 留透明缺口透出 bg 小路/八物件层);围墙不并回背景层、门洞不填死、门洞不被任何物件遮挡。 -- [ ] 实现七物件命中区 `bind_hotspots()` 与 `get_hotspot_rect()`:读 `camp_scene_layout.tres` 坐标键;七件两两不相交、不越画面、不侵入顶栏禁区 y≤48;篝火命中矩形只取下半(火堆),火焰只展示。 -- [ ] `camp_scene_layout.tres` 加载期 fail-fast 校验(2026-11-01 双审补立):七命中区两两不相交/不越画面/不侵 y≤48,违则致命中止(fail-fast 红线;契约 7 几何红线机检化)。 -- [ ] 实现点选反馈四态 `set_feedback_state()`(零新素材、全程序化):悬停=轮廓亮边+浮动(整像素吸附)+名牌(下方 8px 居中、字号 14、对比 ≥4.5:1)/按下=位移 1px/禁用=降明度+去饱和(仅锻炉、宝箱)/已解锁=常态。实现约束(2026-11-01 双审补立):悬停浮动位移经 Tween(禁 `_process` 逐帧移 UI);名牌 Label `mouse_filter = IGNORE`(防挡命中区,UiKit 惯例 ui_kit.gd:312/333);名牌位置加画面内钳制(贴底物件防出画);禁用态去饱和经 ShaderMaterial(modulate 只能调明度,去饱和需 shader——零新素材、代码件)。 -- [ ] 场景屏顶栏预留位 `set_hud_band()`(高 48px 浮层覆盖、不挤压画面,卡⑤ 填值;载体循 UiKit `page_shell` 的 `PRESET_TOP_WIDE`+`custom_minimum_size` 先例 ui_kit.gd:523-525,禁手动 rect);刷新入口=本卡 T3 定义的营地刷新单口(卡⑤ 同口挂接)。 -- [ ] 叠层规则显式派生并写入 V2 断言:随 §9 第 2 条承载形态裁定派生——独立全屏页=场景根隐藏(生涯先例)/单一内页切换=场景根留底;「缩放虚化」是两选项之外的第三形态(涉新演出面+素材),禁批内自选(若设计稿/用户想要,升格裁点)。 -- [ ] 键盘焦点/手柄不涉(08:191-192 排 Beta;ESC 属卡⑤ 用户明示裁决面)。 -- 产出:`CampSceneView.setup_layers()`/`bind_hotspots()`/`set_feedback_state()`/`get_hotspot_rect()`/`set_hud_band()`,`object_pressed(key: String)` 信号;T3 按接口块接线。 - -### T3 四柜台拆解与入口改挂(≈2–2.5d) - -- 取用:T2 的 `CampSceneView`(`object_pressed(key: String)`)、F4 五界面实态、F5 写口链、§0.5 跨卡接口。 -- [ ] 锻造工坊/秘宝匣/天赋树/图鉴四界面自 CampOverlay 抽出为独立可开界面(`forge_view.gd`/`treasure_view.gd`/`tree_view.gd`/`codex_view.gd`,承载形态=§9 拍板;约束=写口链路零改、零新素材、界面逻辑复用);**五界面各带返回/关闭钮**(现四者共用 CampOverlay 底栏关闭钮随拆解消失,卡⑤ Q1 甲案前提即此)。 -- [ ] 按契约 11 拆分边界纪律落四界面:每界面写职责语句与单一变化原因(实现报告逐件一行)、有集体身份;禁凑计数袋、禁沿阈值轴硬拆;拆不出内聚单元=停卡呈报走豁免。 -- [ ] 生涯页入口自主菜单生涯钮改挂帐篷旁笔记本(CareerOverlay 本体零改);**生涯页返回钮文案禁含「营地」字样**(ui_struct_probe.gd:382 nojump 禁词表含「营地」——career_overlay.gd:27 现「返回」安全,改文案时避坑)。 -- [ ] 入口改挂后各界面开合走模态栈单口;层序入 `LAYER_CONTRACT`;五枚句柄(场景根+四子界面)落 `ui_camp_modals.gd` 子容器(卡⑥ 前置建件,寻址 `ui.modals.camp.X` 二层)——禁平铺回 `ui_modals.gd`(S13 上限,2026-11-01 用户裁)。 -- [ ] **CampShopPresenter 承接面改造(契约 4)**:投影目标改线(五界面/场景根)、七写口尾刷新改路由(经营地刷新单口——**各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成**)、open/close 编排从 campbtn 迁位到卡③ 进档动作、CampFlowContext 字段语义订正、探针缝保位(组合根薄委托缝,T0 复核现役行号——原引 main.gd:1163-1171 超出文件实长);`on_camp_attune_toggle` 口尾(:102)只 refresh_camp、不调 `_refresh_presentations` 保持原样。 -- [ ] 新建 `camp_refresh_bus.gd` 实现 `CampRefreshBus.refresh(camp_data: Dictionary) -> void`(T0 接口块);卡⑤ HUD 刷新挂此单口,非已退役的 `refresh_camp`;头注自陈「非 autoload、非信号广播——组合根单点推送」(防被读成已否决的全局事件总线形态,2026-11-01 双审注)。 -- [ ] **图鉴占位态(契约 5)**:独立界面壳=§9 第 2 条承载形态;文案照录 camp_overlay_view.gd:168 现行锁文,「柜台结构位预留」中『柜台』称谓随形态订正(L2 记录,零新文案);V6 断言锚定新视图占位标签。 -- [ ] **开层互斥与关层收闭**:营地开层时选档层被模态栈遮挡隐藏(卡③ T2 同口径);篝火/ESC 回主菜单=营地层与选档层同收+开始层恢复(现役 on_camp_closed 模式只视野开始层,选档层不在其视野——须显式)。 -- [ ] CampOverlay 类退役处理(拆解后无消费面即删——吸收即死);`main.camp_overlay` 探针句柄迁移留痕。 -- [ ] 最近冒险条带去向按 Q4=甲执行(随四柜台拆解一并撤下,逐局历史回看归生涯,生涯.md P6 同批注销——反哺点)。 -- 产出:五界面独立可开(各带返回/关闭钮)+`CampRefreshBus.refresh()` 单口+CampOverlay 退役;T4 按接口块消费。 - -### T4 大门动线(≈1–1.5d) - -- 取用:T2 的 `object_pressed(key: String)`、T3 的 `CampRefreshBus`、F6/F7 断点弹窗与冒险编排、Q5 已裁=甲三钮化、卡③ ConfirmDialog 契约 3。 -- [ ] 大门点击→两分支确认弹窗(裁决 5):有断点=ConfirmDialog 三出口「继续上一段冒险/开始新冒险/取消」;无断点=「是否开始新冒险:是/否」;点大门永远先出确认、不直接进冒险。 -- [ ] **三出口弹窗形态(Q5 已裁=甲)**:ConfirmDialog 三钮化+**消费方编排**(组合根单实例+待确认消费方状态量:open 前设、confirmed/cancelled 后分派;cancelled 恒=无变更退回营地;禁每次 connect/disconnect 漂移、禁双常驻静态接线——卡③ 契约 3 同款互指)。 -- [ ] 断点弹窗移位:弹窗本体与两分支逻辑自组合根摘除位迁来(卡②已摘除原调用,main.gd:118-120 注释明载归本卡大门承接;main.gd:475-497 现为选档委托、非断点弹窗——旧引文失实,v3.1 订正)。 -- [ ] 「继续上一段冒险」接现役续玩编排(`_resume_from_menu` 同源);「开始新冒险」接现役开局编排(`_start_adventure` 同源)——冒险屏/选路屏/战斗屏零改(F7)。 -- [ ] 冒险发起后营地场景屏隐藏;**终局落点不变量**:现役口径=终局 continue 回主菜单(`main_adventure_flow.gd:123-143` 终局出口 `_begin_session(false)`——原引 main.gd:703 失实,v3.1 订正)——若后续改落点为营地,营地语境可能出现未收束会话,卡⑤「返回主菜单」动线须补 `_begin_session(false)`,两卡 T0 互证。 -- [ ] 篝火回主菜单动线:命中区只含火堆(不含火焰),**必须二次确认**(camp.md v2.2 已裁,走 ConfirmDialog 先例);确认后营地层与选档层同收+开始层恢复(T3 开层互斥/关层收闭同口径)。 -- [ ] `_refresh_resume_button` **不复用**(大门两分支直读 `has_breakpoint`,无钮可刷——函数随卡②删,防两卡互以为对方在处理)。 -- 产出:大门两分支+三钮消费方编排+篝火二次确认动线;T5 按接口块验收。 - -### T5 断言、探针与截图迁移批(≈2–2.5d) - -- 取用:T2/T3/T4 全部产物、F8 全量探针位点、F17 机检工具面、契约 10。 -- [ ] shot_probe:camp 截图路径改(进入存档→选档→进档→营地场景图);截图自检存在且非空;**camp 段收闭改接**:现经「关闭营地」钮收闭(:133)——营地根态无关闭钮(出口=篝火/ESC),改篝火动线或调试直改 visible。 -- [ ] **无 camp golden**(契约 10):camp 验收=shot_probe 出图+shot_checker 语义断言段(文字 WCAG/明度三档带/文字禁压纹理/文字在判据扩 camp 取样面);棋盘/menu 既有 golden 复跑。 -- [ ] F8 全量位点逐点迁移: - - [ ] 探针深员改指表:ui_probe `_balance_label`/`_tree_buy_btns`/`_workshop_rows`(:39-52)、ui_click_probe `_tree_buy_btns`/`_tree_fork_btns`+三处 `main.camp_overlay.refresh_camp(main._camp_data())` 直呼(:72/99/110)、ui_struct_probe audit 根(:45)——「改挂新入口」不够,这些是成员级耦合;七命中区与笔记本命中区的探针寻址名随 T2 命名稳定化一并定。 - - [ ] theme_projection_test.gd:710-717 四柜台等高源码断言段(`_smoke_element_details`)+system_test.gd V2 实例化(:67-68)/V3g 模态开合(:520-541):四柜台等高三条锁按新形态重写或注销(四栏等高纪律是否迁入新界面=§9 第 2 条裁后定)——`game/smoke/smoke_all.gd` 已退役,v3.0 旧位点作废。 - - [ ] ui_click_probe:500-528 断点确认段:改走大门路径断言(与 V3 合并或互指;卡② T2 明列移交、本卡 T5 接收)。 - - [ ] ui_contrast_probe:48-55 营地令牌段:核签(新界面仍消费 `CAMP_HEADER_BAND`/`CAMP_ROW_PLATE`=段留;不再消费=段随注销)。 - - [ ] forge_workbench_test.gd 单测:随锻造视图抽出同迁(断言零改、只换承载类);V4 复跑清单补该单测。 - - [ ] 生涯段驱动改接:ui_struct_probe:54-69 与 shot_probe:103-124 现经 `_start_overlay`「生涯」钮驱动——改挂后须合成点击场景笔记本命中区;命中区若为 TextureRect/Area2D 而非 Button,`ProbeUiUtil.find_button` 失效,寻址面随 T2 扩展。 - - [ ] screen_flow_probe 营地旗标新语义::54 改指新场景根句柄(:53 是菜单行,v3.1 订正);子界面开态时键真值按 T2 叠层规则派生;:119-125 回退段改新场景根 closed 信号或篝火动线。 - - [ ] 多卡共改文件分界:screen_flow_probe(入口路径段归卡②、键语义/开合/篝火段归本卡)、ui_click_probe(入口路径归卡②、槽操作路径归卡③、营地段+断点确认段归本卡)——每条探针注分界;分界锚=断言段语义/段名,不锚行号(一侧插删行会平移另一侧行号,2026-11-01 双审补立)。 -- [ ] 新增断言段(**正向验收断言,从真实入口进入、判据绑被测改动特有的可观测提交面**):七物件逐一可达对应界面;大门两分支;点大门不直接进冒险(绑 `confirmed` 信号与 `route_chosen` 未发);点大门→开局后营地场景屏隐藏;图鉴=占位挂起态;场景根态无文字按钮列表/无四柜台面板(反参照纪律断言);presenter 七写口尾→现开界面刷新+场景根 HUD 刷新一闸(绑刷新单口调用记录与 HUD 状态源取值);三钮弹窗 cancelled 恒=无变更退回营地(绑写口零调用+营地根 visible)。**判据绑不上=静态判据+评审注记申报观测面局限,证明做不出=停卡呈报;断言只在当轮真实跑批执行并通过,不做注入破坏。** -- [ ] 美术约束机检:shot_checker 现役段扩 camp 取样;截屏级 48 色计数是否新建=§9 第 4 条拍板(**条件步**:§0.3-3⑤环境子板色值已按 T1 量化登记→拍板;未登记→本子步显式跳过+T6 登记遗留,不阻塞批末闸)。 -- [ ] **新增两条 headless 断言(2026-11-01 godot-master 审查补立)**:①`ui_struct_probe` camp 场景层序段——camp_scene_view 子节点序=layout 表 z 序逐层相等、各层纹理矩形与表逐值一致(本批核心视觉不变量的机器验收面);②`camp_scene_layout.tres` 加载期校验断言——载入数据件断言校验通过+七命中区几何(两两不相交/不越画面/不侵 y≤48),落 `game/tests/unit/presentation/camp_scene_layout_test.gd:_test_layout_hotspot_geometry`(新建单测件,随套件 manifest 登记)。 -- 产出:探针/断言迁移留痕表(F8 全量位点逐点「改前→改后」)+新增断言段;T6 收口。 - -### T6 产出物落位卡(≈0.5d,末卡) - -- 取用:T0–T5 全部产物。 -- [ ] 里程碑步(波/T 段)出口跑一次代码域全套闸:`bash tools/run_all_gates.sh --code`;回执 `all_green=true`;任何新增红停卡,不得带红合回。波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套。 -- [ ] 独立验收审计由未参与实现的会话/子代理执行,产出 `reports/iter-验收审计-<日期>.md`;未过禁合并(审计入口见 §7)。 -- [ ] 轻闸全绿、合并前写齐三份 `reports/`: - - [ ] `reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录/代拍板追认单+探针迁移留痕表+方向稿选划留痕〔已由 2026-10-31 裁定〕); - - [ ] `reports/iter-反哺点-<日期>.md`(§5 每条有落点:文件/节/原句/拟改句/依据,明确「实现批未写 design/」); - - [ ] `reports/iter-验收审计-<日期>.md`(独立审计逐行「通过/缺漏/例外及依据」)。 -- [ ] 用户目检项登记 07 清单(场景观感/七物件辨识与点选反馈/大门两分支/篝火动线),登记完成即卡内义务了结,不阻塞批末收尾/合并/下一迭代开工。 -- 产出:三份 `reports/` 齐全+代码域闸全绿+验收审计通过,方算收口;合回后由本地 CI 全量域闸复验。 - -**估时合计 ≈9–12d**(presenter 承接面+三钮弹窗+探针深员面增量;T1 为素材录入、美术创作主体归美术自立批已完成)。 - -## 7. 验证闸:改动—验收对照表 - -七格表:需求点|改动(文件:行/行为)|验收测试(名称+落点+尾缀)|层级(单元/接口/集成/探针)|真实入口|判据绑定面|能力行。**每个需求点至少一行;每个行为改动至少一行(V1–V13 需求点行+B1–B2 行为改动专行);每行必须有真实入口和判据绑定面——缺任一项=该需求点未验收,卡片不成立。** 断言尾缀〔营地图批 Vn〕/〔营地图批 Bn〕,与卡片清单互相 grep。能力行格式 `既有:<能力名>`/`新增:<能力名>`,两形态名称都须在 `game/tests/README.md` 能力表在场(既有=现役在场名,新增=本卡定名、由主 Agent 统一收口入表;本卡只写卡内能力行文字,README 由主 Agent 收口)。 - -| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | -|---|---|---|---|---|---|---| -| V1 场景图形态(机检半) | `camp_scene_view.gd` 10 层铺底(z0 不透明全幅含门洞小路/z1 透明细条 (0,240,1280,70) 门洞缺口/z2–z6);`camp_screen.gd` 改挂;`shot_probe.gd` camp 段 | `shot_probe.gd:_ready`(camp 截图段)〔营地图批 V1〕+`ui_struct_probe.gd:_ready`(camp 场景层序段)〔营地图批 V1〕+`shot_checker.py` 结构禁词段 | 探针 | 进入存档→选档→进档→营地场景屏(shot_probe 驱动) | camp 截图出图非空+shot_checker 结构禁词命中(无四柜台覆盖层/无文字按钮列表);camp_scene_view 子节点序=layout 表 z 序逐层相等、各层纹理矩形与表逐值一致(2026-11-01 双审补立——核心视觉不变量机器验收面);「七要素可辨(构图)」归 V11 目检 | 新增:营地场景图十层铺底与门洞留空呈现 | -| V2 七物件可达性+叠层退避 | `camp_scene_view.gd` 七命中区+`object_pressed` 信号;`camp_scene_layout.tres` 坐标键;组合根开界面 | `ui_click_probe.gd:_ready`(七物件合成点击段)〔营地图批 V2〕 | 探针 | 命中区 `_gui_input()` → `object_pressed(key)` → 组合根开界面 | 七物件各自对应界面 visible 断言+场景根按 T2 叠层规则退避(树序/可见性);绑 `object_pressed` 信号发射面 | 既有:模态覆盖层编排与输入锁;新增:营地七物件命中区点选与分界面可达 | -| V3 大门两分支+开局收闭 | `main.gd:475-497` 断点弹窗移位;`confirm_dialog.gd` 三钮化;消费方编排 | `ui_click_probe.gd:_ready`(大门两分支段/断点确认段 :500-528)〔营地图批 V3〕 | 探针 | 大门命中区 → ConfirmDialog(三出口)→ `main._on_confirm_new_adventure()`/`_resume_from_menu()` | 有断点三出口/无断点两出口;点大门不直接进冒险(绑 `confirmed` 信号与 `route_chosen` 未发);cancelled 绑写口零调用+营地根 visible;开局后营地场景屏隐藏 | 既有:断点片段往返与续玩幂等;新增:营地大门两分支确认与断点续玩接线 | -| V4 五界面功能+写口链零回归 | 四界面 view 抽出;`camp_shop_presenter.gd` 承接面;`camp_flow_context.gd` 字段;`forge_workbench_test.gd` 迁移 | `forge_workbench_test.gd:_test_forge_rows`〔营地图批 V4〕+`ui_click_probe.gd:_ready`(写口链段)+`smoke_all.gd:_face_snapshot` 段 | 单元+探针 | 五界面意图信号(`buy_requested`/`tree_buy_requested`/`forge_*`)→ CampShopPresenter → MetaProgression 写口 | 树购买/Fork 切换/锻造三意图/秘宝购买/同调装配既有断言全链复跑绿;presenter 各写口尾 MetaProgression 原语调用序列不变(绑调用序列,不绑终态兜底) | 既有:元进度入账与锻造两轴;新增:四柜台拆解后五界面入口改挂与写口零回归 | -| V5 生涯只读契约保持 | `career_overlay.gd` 入口改挂笔记本;`ui_struct_probe.gd`/`shot_probe.gd` 生涯段驱动改接 | `ui_struct_probe.gd:_ready`(career 段)〔营地图批 V5〕 | 探针 | 笔记本命中区 → `CareerOverlay.open()` | 生涯页经笔记本可达+页内零跳转零动效契约三断言不破(三契约只约束页子树、不依赖入口位置);返回钮文案禁含「营地」 | 新增:营地篝火回主菜单与笔记本改挂动线 | -| V6 图鉴挂起态 | `codex_view.gd` 占位壳;布告板命中区 | `ui_struct_probe.gd:_ready`(占位禁词/禁行段)〔营地图批 V6〕 | 探针 | 布告板命中区 → 图鉴占位视图 | 锚定新视图占位标签(现行锁文「柜台结构位预留」称谓随形态订正)+内容零激活禁行断言;不是禁用态 | 新增:营地图鉴占位挂起态与反参照结构纪律 | -| V7 篝火动线(二次确认) | `main.gd` 篝火回主菜单+开层互斥/关层收闭;`screen_flow_probe.gd` 段 | `screen_flow_probe.gd:_ready`(篝火/开合段)〔营地图批 V7〕 | 探针 | 篝火命中区(只下半火堆)→ ConfirmDialog 二次确认 → 主菜单 | 二次确认弹窗 `confirmed` 信号先于关层;确认后营地隐藏+选档层同收+主菜单可见(绑可见性/层序);命中区只含火堆不含火焰 | 新增:营地篝火回主菜单与笔记本改挂动线 | -| V8 顶栏预留位+刷新单口 | `camp_scene_view.gd` 顶栏 HUD 位;`camp_refresh_bus.gd` 新建;presenter 七写口尾改路由 | `ui_struct_probe.gd:_ready`(顶栏位段)〔营地图批 V8〕+`ui_click_probe.gd:_ready`(写口尾刷新段) | 探针 | 写口尾 → `CampRefreshBus.refresh(camp_data)` → 现开界面刷新+场景根 HUD 刷新 | 场景屏顶栏 HUD 位存在(结构断言,高 48px 浮层);各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成(绑刷新单口调用记录与 HUD 状态源取值);卡⑤ 联验填值 | 新增:营地刷新单口与场景根 HUD 同步 | -| V9 反参照纪律 | `camp_scene_view.gd` 根态;`camp_overlay_view.gd` 退役;`smoke_all.gd:6469-6475` 源码断言段 | `ui_struct_probe.gd:_ready`(结构禁词段)〔营地图批 V9〕 | 探针 | 营地根态场景树审计 | 营地根态无文字按钮列表、无四柜台面板(结构禁词断言);四柜台等高源码断言按新形态重写或注销(迁移留痕) | 新增:营地图鉴占位挂起态与反参照结构纪律 | -| V10 美术约束 | `tools/shot_checker.py` camp 取样面;`ui_contrast_probe.gd` 令牌核签;素材色板二器 | `ui_contrast_probe.gd:_ready`(营地令牌段)〔营地图批 V10〕+`shot_checker.py` WCAG/明度三档带段 | 探针(机检) | camp 截图+素材文件(`palette_check.py`/`standee_asset_check.py`) | 文字 WCAG ≥4.5:1/明度三档带/文字禁压纹理底/文字在判据;素材色板(48 令牌+新增色双门/像素 32 色冻结);§9 第 4 条拍板截屏计数面(条件步,§0.3-3⑤) | 既有:UI 全局主题与按钮五态(含对比度锚);新增:营地场景图十层铺底与门洞留空呈现 | -| V11 目检项登记 | `reports/iter-实现报告-<日期>.md` 实机目检总清单 | 件核对(07 清单登记,登记不阻塞)〔营地图批 V11〕 | 用户目检(非自动化) | 用户实机(生命周期末步统一进行,不阻塞迭代) | 场景观感/七物件辨识(纵深稿构图可辨)/点选反馈/大门两分支/篝火动线入 07 清单=登记即义务了结 | 新增:营地场景图十层铺底与门洞留空呈现 | -| V12 探针迁移留痕核验 | F8 全量位点逐点迁移 | 件核对表(T6 追认单)〔营地图批 V12〕 | 件核对(非自动化) | 探针脚本 diff 对账 | F8 全量位点逐点有「改前→改后」记录(契约 10 留痕义务) | 既有:模态覆盖层编排与输入锁;新增:营地七物件命中区点选与分界面可达 | -| V13 反哺点清单 | §5 每条有落点 | 件核对表〔营地图批 V13〕 | 件核对(非自动化) | §5 同步面逐条对账 | §5 每条有 `reports/iter-反哺点-<日期>.md` 落点 | 既有:模态覆盖层编排与输入锁 | -| V14 layout 数据件校验(2026-11-01 新增) | `camp_scene_layout.tres` 加载期 fail-fast 校验(schema 类+表现域容器类型化成员,先例 battle_layout.tres) | `camp_scene_layout_test.gd:_test_layout_hotspot_geometry`(新建单测件 `game/tests/unit/presentation/`,随套件 manifest 登记)〔营地图批 V14〕 | 单元 | 单元测试载入 `camp_scene_layout.tres` | 校验函数通过+七命中区两两不相交/不越画面/不侵 y≤48(契约 7 几何红线机检化) | 既有:模态覆盖层编排与输入锁;新增:营地场景图十层铺底与门洞留空呈现 | -| B1 组合根接线总改造(行为改动专行) | `main.gd`(断点弹窗移位+三钮消费方编排+营地入口改挂+篝火动线+开层互斥);`confirm_dialog.gd` 三钮;`camp_shop_presenter.gd` 写口尾路由;`camp_flow_context.gd` 字段;`camp_refresh_bus.gd` 单口 | `ui_click_probe.gd:_ready`(断点确认段)+`screen_flow_probe.gd:_ready`(篝火段)〔营地图批 B1〕 | 集成 | `_on_confirm_new_adventure()`/`_resume_from_menu()`/`_start_adventure()`/`CampRefreshBus.refresh()` | 三钮消费方编排:open 前设消费方、confirmed/cancelled 后分派;cancelled 绑写口零调用;写口尾绑 `CampRefreshBus.refresh()` 调用记录+现开界面+场景根 HUD 同刷;`on_camp_attune_toggle` 尾只 refresh_camp 保持原样 | 既有:断点片段往返与续玩幂等;新增:营地刷新单口与场景根 HUD 同步 | -| B2 CampOverlay 退役+五界面抽出(行为改动专行) | `camp_overlay_view.gd` 退役;四界面 view 抽出;`career_overlay.gd` 入口改挂;`smoke_all.gd:6469-6475` 源码断言段 | `smoke_all.gd:_ready`(源码断言段重写)+`forge_workbench_test.gd:_test_forge_rows`(承载类换)〔营地图批 B2〕 | 集成 | 五界面 `open()`/`close()` → 模态栈单口 | CampOverlay 无消费面即删(吸收即死,绑 `main.camp_overlay` 句柄迁移留痕);四界面各带返回/关闭钮;拆分沿职责轴(契约 11:职责语句/单一变化原因/集体身份,禁凑计数袋) | 既有:元进度入账与锻造两轴;新增:四柜台拆解后五界面入口改挂与写口零回归 | - -**落点集中**:V1/V9/V11/V12 → T5/T6;V2/V8 → T2/T3;V3/V7 → T4;V4/V5/V6 → T3;V10 → T5;V13 → T6;V14 → T2/T5;B1 → T3/T4;B2 → T3/T5。全表名实核对归 T6。 - -**测试方式两分法**:V1–V10、B1–B2 机检自动化(能力验证经调试接口直改断点/钥石/解锁状态,沿用 DebugOverlay/DS_DEBUG 门控,不走正常资源积累流程);V11 归用户目检(生命周期末步统一进行,不阻塞迭代);V12/V13 为件核对表(非自动化,T6 追认单)。**用户目检一律「登记不阻塞」**:登记完成即卡内义务了结,验收时间由用户自行安排,不得作为批末收尾、合并或下一迭代开工的前置条件。 - -**判据绑定面口径**:每个行为改动的验收断言从真实入口进入、判据绑被测改动特有的可观测提交面(信号/事件/入参/状态源取值/绘制记录/可见性/树序),在当轮真实跑批中执行并通过(2026-10-24/2026-10-28 用户两裁:断言从真实入口进、判据钉可观测提交面,人为制造红属伪造证据)。判据绑不上(纯防御分支、release 独有位)=静态判据+评审注记申报观测面局限,**证明做不出=停卡呈报**。配判据按强弱分层配齐:运行期断言(可见性/树序/状态源取值)抓状态类缺陷,golden 逐像素抓内容观感类缺陷(本卡无 camp golden,用 shot_checker 语义断言段+目检),占比/统计类判据只兜「整框空白/整框糊」、是补充不是主力(细则=test-conventions §8.4)。 - -**测试削弱申报**(实现期未申报的削弱由独立验收审计判红):允许改/删的旧断言逐条列—— - -| 旧断言 | 允许处置 | 理由 | -|---|---|---| -| `smoke_all.gd:6469-6475` 三条锁四柜台等高形态源码断言(`Vector2(0,336)`×3/`SIZE_FILL`×4/`SIZE_SHRINK_CENTER`≥3) | 按新形态重写或注销 | CampOverlay 四柜台形态退役,旧形态断言失去对象(吸收即死,不保留无效断言) | -| `ui_contrast_probe.gd:48-55` 营地令牌段 | 核签后段留或随注销 | 新界面若不再消费 `CAMP_HEADER_BAND`/`CAMP_ROW_PLATE` 则段标签虚挂;仍消费则保留 | -| `ui_click_probe.gd:500-528` 断点确认段(经 lvbtn 驱动) | 改走大门路径断言 | 卡②撤钮+本批弹窗移位双杀,改挂大门命中区(与 V3 合并或互指) | -| `ui_probe.gd:39-52` 深员(`_balance_label`/`_tree_buy_btns`/`_workshop_rows`) | 改指新界面/场景根成员 | 成员级耦合随四柜台拆解迁移,寻址名随 T2 稳定化 | -| `screen_flow_probe.gd:53`/:109-125 营地键/回退段直呼 `main.camp_overlay` | 改指新场景根句柄/closed 信号 | 句柄迁移到新场景根(F2/F8) | -| `shot_probe.gd:126-133` camp 收闭段经「关闭营地」钮 | 改篝火动线或调试直改 visible | 营地根态无关闭钮(出口=篝火/ESC) | -| `ui_struct_probe.gd:54-69`/`shot_probe.gd:103-124` 生涯段经 `_start_overlay`「生涯」钮 | 合成点击笔记本命中区 | 入口改挂帐篷旁笔记本,驱动改接 | -| `forge_workbench_test.gd:33` 直载 `camp_overlay_view.gd` | 随锻造视图抽出同迁,断言零改只换承载类 | 承载类迁移,行板/写口逻辑复用(契约 4) | - -**禁止削弱声明**:除上列外,实现期不得删除断言、放宽阈值、缩小扫描面、把真实入口换成下层直调。五界面写口链(V4)、生涯只读契约(V5)、图鉴挂起态(V6)、美术约束(V10)的既有断言全链复跑绿,禁削弱;棋盘三张+menu_boot 既有 golden 逐像素复跑、不放宽容差;不新建 camp golden(契约 10,若新建须另裁 L3)。 - -**独立验收审计**:合并前由未参与实现的会话/子代理执行,入口为审计只读本卡、实际对照表、diff、测试文件与实现报告,自跑最窄测试抽查、不采信报告「已全绿」;至少四件事——①逐行核对照表(测试存在、真的执行、尾缀能 grep 到、真实入口没有绕过改动点)②抽查判据绑定面(绑被测改动特有可观测提交面、当轮真实跑批执行过)③检查测试削弱(删除断言/放宽阈值/缩小扫描面/换下层直调逐处要本卡申报或用户批准)④核内部字段直查的受控例外(该行为无公开可观测面可钉时已在对照表注明理由)。报告落 **`reports/iter-验收审计-<日期>.md`**,逐行「通过/缺漏/例外及依据」,未通过不得合并。测试执行两入口铁规不变:审计在迭代 loop 内启动的子代理算 loop,另开会话须用户点名。 - -**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码/断言/终稿素材 → `--code`)全绿才合并;MC 零跑(零数值零行为——纯呈现+承载迁移)。卡内不写死闸件名单,域划分唯一出处在 `tools/run_all_gates.sh`。回归措辞按模板:里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套。 - -## 8. 异常分级 - -- **L1(自救一次)**:断言写法、探针路径、命中区微调、命名、编译错误、签名拼写、测试套件 manifest 登记遗漏。 -- **L2(记录继续;同一红连续三次升 L3)**:场景屏承载形态选择(§9 域内)、点选反馈参数(§0.3 P3 设计稿域内)、四界面承载形态(§9 域内)、图鉴占位文案称谓订正、行数较 T0 预期漂移但 S13 键不升。 -- **L3(立即停卡写报告等用户)**: - - §0.3 代码段开工门裁断实况反转(四项 2026-11-01 已裁断销号;开工时发现未销号实况=停机呈报); - - 规格清单(样张批)终档置换未按反哺点登记; - - golden 漂移越出预期面(若涉及既有棋盘/menu 基线); - - 发现五界面任一功能/写口链路被意外触碰(契约 4 破); - - 参照物与纵深稿结构性冲突再现(P4 已补、冲突已呈报,禁批内自行改构图); - - 美术渠道 B 执行中撞墙(插画级新产达不到七物件可辨性); - - 提议新建 camp golden(契约 10——须另裁); - - 任何验收行无法从真实入口绑定特有可观测提交面(证明做不出=停卡呈报); - - **机检预算互斥=上游缺陷停卡退回写卡段**:实现规范预算超默认未走指标例外申报、或 S13 键较登记值上升、或机检键/计数与卡片契约互斥——一律停该卡呈报退回写卡段,禁为凑绿保留无效成员、造第三条路或内联求裁(契约 12/第 13 节合流); - - **拆分边界**:按契约 11 拆不出内聚单元(只能凑计数袋/沿阈值轴硬拆)=停卡呈报走豁免/还债通道,禁硬拆凑绿。 - -## 9. 代拍板白名单(超清单必呈报) - -> 篝火二次确认已由 camp.md v2.2 裁定为**必须**(走 ConfirmDialog 先例),不属代拍板域。 - -1. 场景屏承载形态(camp_screen 屏壳改造 vs 新屏壳)——约束:`LAYER_CONTRACT` 更新+探针挂载面迁移留痕。 -2. 五界面拆出后的承载形态(独立全屏页 vs 单一内页切换)+**叠层规则派生**(独立全屏页=场景根隐藏/单一内页切换=场景根留底;写入 V2 断言;「缩放虚化」禁自选)。 -3. 七物件命中区实现(TextureRect 分区 vs 其他)与点选反馈参数(§0.3 P3 设计稿域内)。 -4. 截屏级 48 色计数工具是否新建及落点(现役=素材级二器 F17;**条件步**——§0.3-3⑤环境子板色值已按 T1 量化登记则拍板,未登记则本子步显式跳过+T6 登记遗留)。 -5. CampOverlay 类退役范围(整类删 vs 留片段)——约束:吸收即死,禁留死代码。 -6. 提交切分与 worktree 分支命名。 - -超出必须呈报:任何数值、像素规格、事件名、命中区绑定目标、文件职责、T 卡验收落点、五界面写口链路、拆分单元职责。 - -## 10. 待裁点:零待裁点,开工门=U0 - -**本卡设计待裁点清零,开工门=U0。** Q1/Q2/Q4/Q5/Q6/Q8 均已裁(下列为现行裁定留痕,非待裁点,实现期禁自行改值): - -- **Q1 美术渠道=B·插画级新产**(2026-10-22 用户裁):✦ 渠道作者自跑远程生图管线;规格沿用 art-bible §6.2/§8.1/§8.2 既有裁决(art-assets-checklist.md §3.5)。 -- **Q2 参照物=已补**(2026-10-23):`artwork/2026-10-23-营地场景/Gemini_Generated_Image_ykrc0nykrc0nykrc.jpg`,已进 camp-scene-prompts.md §1 登记为「作者提供的参照物」,与纵深稿对过表、围墙结构冲突已呈报;参照物只是参考图,保留 `artwork/`、不入 git、不入游戏目录。 -- **Q4 营地底栏「最近冒险」条带去留=甲**(2026-10-18):随四柜台拆解一并撤下,逐局历史回看整体归生涯(期二承接);生涯.md P6 同批注销(反哺点)。 -- **Q5 大门「有断点」分支三出口弹窗=甲**(2026-10-18):ConfirmDialog 扩第三钮(继续上一段冒险/开始新冒险/取消,cancelled 恒=无变更退回营地);卡③ 契约 3 已按三钮化落定(删档确认只用取消/确认)。 -- **Q6 Q1 与规格清单缺口连带裁=甲**(2026-10-18):过渡尺寸档=现役 1280 工程档(1280×800)+烛光黄 #F6C667/木色 #8A5A34;渠道 B 已裁(2026-10-22),规格落 art-bible v3.31 §6.2/art-assets-checklist.md §3.5(2× 源档出图、最近邻降采样到 1280×800);终档归样张批冻结清单后置换(反哺点登记),执行归用户线。 -- **Q8 设计稿产出方式=甲**(2026-10-18):批内出稿呈裁(方向稿先行纪律照旧——方向稿选划已由 2026-10-31 样张过审裁定完成,各素材第一张样本稿为终稿、保留全部待选稿)。 - -**代码段 `/iter` 开工门已全部裁断销号(2026-11-01 用户裁,照 grilling+godot-master 双审推荐采纳)**:P3 销号口径=camp.md v2.2 四态规格即设计稿;P5 销号口径=形态落文完成、实装回填归反哺点;camp-scene-prompts §5 五裁点=①帐篷 300×170 追认②门扇 240×220 追认③布告板 (845,268,130,140)④描边奶油色追认⑤环境子板色值不前置(T1 量化后按 art-bible §4.1 登记);十张终稿后处理=/iter 开工令即含授权。**本卡零待裁点、开工门清零——迭代 47 可开工。** diff --git a/reports/需求卡片-营地模态句柄子容器批-2026-11-01.md b/reports/需求卡片-营地模态句柄子容器批-2026-11-01.md deleted file mode 100644 index ccde2367..00000000 --- a/reports/需求卡片-营地模态句柄子容器批-2026-11-01.md +++ /dev/null @@ -1,144 +0,0 @@ -# 需求卡片:营地模态句柄子容器批(UiCampModals 分域句柄容器 · camp_overlay 句柄迁移)· 营地交互重做卡⑥(前置基建) - -- 版本:**v1.1(现行有效卡)**。留痕:2026-11-01 用户裁(迭代 47 机检预算互斥停机呈报裁决=最小改动先走:营地域六句柄落子容器,全量分域分家登记待办清单另立批);2026-11-01 grilling+godot-master 双审后写卡段修订(v1.1,执行级四缺口+措辞订正,设计面零改动)——T0 命令路径订正 game/tests/static_scan.sh、T1 补类名缓存刷新步+ui_modals 头注同步+断言尾缀落点+复跑面扩改指面 8 文件、V3 判据改计数留痕+观测面局限申报、迁移面实测 8 文件入 F4、契约 2/4 计数与退役删除句、node() 改写分支措辞。 -- 来源:2026-11-01 用户裁决(**唯一事实源**:本卡 §2 现状实测+`design/engineering/code-conventions.md` §1.1 拆分判据;需求性工程条目证据指认=迭代 47 机检预算互斥停机呈报〔ui_modals.gd 类变量 14,卡④⑤ 平铺合计 19>S13 上限 15〕+用户裁决留痕,属重构基建、无设计线前置) -- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做卡⑥,**迭代 47 执行序第一位**(卡④ T3 落五句柄、卡⑤ T1 落浮窗句柄的本批前提) -- 开工门:U0(随迭代 47 `/iter` 发令,无独立开工令)+零待裁点 - -## 1. 目标与完成定义 - -**目标**:给营地域模态句柄立独立子容器,使迭代 47 营地域六句柄(场景根+四子界面+Esc 浮窗)不再平铺进 `ui_modals.gd`——该文件类变量终值 14(不超 S13 上限 15),零基线登记;调度器/层序合同/登记口三件全局职责零改动。 - -**完成定义**: -1. `ui_camp_modals.gd`(类名 UiCampModals,RefCounted)新件在役;`ui_modals.gd` 持 `camp` 成员一枚,`camp_overlay` 平铺成员删除——类变量 14→14; -2. `camp_overlay` 句柄寻址迁移 `ui.modals.camp.overlay`,全仓引用(组合根+探针)改指完毕,现役营地探针段复跑绿(行为零变化的证明); -3. `ui_registry.gd node()` 的 `camp_overlay` 分支返回属性链改经子容器(`modals.camp.overlay`;**LAYER_CONTRACT key 平铺不改名**,camp.* 新增解析分支随卡④⑤); -4. `main_ui_build.gd` 装配赋值改经子容器;S13 读数 `ui_modals.gd`=14 不升; -5. 批末按改动域选档全绿;三份 `reports/` 产出物写齐(T2)。 - -## 2. 现状事实(2026-11-01 实测;开工日 T0 复核) - -| # | 事实 | 出处 | -|---|---|---| -| F1 | `ui_modals.gd` 类变量 14 枚=flow+13 模态句柄;gdstyle 直跑零命中(14≤15) | `game/presentation/ui_modals.gd:7-20` | -| F2 | S13 类变量上限=15(gdstyle v0.4.0 默认 `quality/max-class-variables`,超即 NEW 键红);15 枚文件直跑零命中、20 枚合成文件实测 warn | `tools/gdstyle_gate.py`;停机呈报实测凭据 | -| F3 | 卡④⑤ 原平铺写法合计 19>15(卡④ 净+4=场景根+四子界面−`camp_overlay` 退役;卡⑤ +1 浮窗)——迭代 47 机检预算互斥成因;2026-11-01 用户裁=子容器方案,禁基线特批 | 停机呈报-迭代47机检预算互斥-2026-11-01.md(iter47 worktree 在档,裁决已吸收本卡与卡④⑤) | -| F4 | `camp_overlay` 句柄现役消费面实测 **8 文件 40 余处**(2026-11-01 双审实查;T0 逐处列清单):`main_ui_build.gd`(约 10 处)/`ui_registry.gd:61`/`screen_flow_probe.gd`(3)/`ui_click_probe.gd`(16–20)/`ui_probe.gd`(8–9)/`shot_probe.gd`(2)/`ui_struct_probe.gd`(1)/`system_test.gd`(2——:108 句柄同一性链、:121 候选层清单,含 `game/tests/` 域) | `main.ui.modals.camp_overlay` 全仓引用位 | -| F5 | `ui_registry.gd node()` 现经 `modals.X` 一层寻址;LAYER_CONTRACT 与 `apply_layer_contract` 与本批正交(句柄册结构≠场景树结构——子容器不挂树、零树序影响) | `game/presentation/ui_registry.gd`(node() 寻址段,T0 复核) | - -## 3. 设计契约(红线,违反=L3 停机呈报) - -🔴 **契约 1 · 行为零变化**:纯句柄搬家+容器新立;LAYER_CONTRACT/登记序/树序/`register_layer`/ModalFlow 零改动;现有探针断言**零改判据**(只改寻址)。 - -🔴 **契约 2 · 寻址唯一形态**:营地域全部句柄(过渡期含本卡迁入的 `camp.overlay`;**终态六枚=场景根+四子界面+Esc 浮窗**)寻址一律 `ui.modals.camp.X` 二层;禁平铺回 `ui_modals.gd`(卡④ T3 落五句柄、卡⑤ T1 落 esc 时同规——卡⑤ 契约 7 已载、卡④ T3 步与文件表已载)。 - -🔴 **契约 3 · UiModals 只减不增**:本卡后类变量 14(flow+12 平铺句柄+camp 容器成员),卡④⑤ 阶段终值保持 14;任何新句柄平铺回顶层=S13 NEW 红=L3。S13 红线实际兜 **+2 起**(14→15 闸零命中)——+1 漂移由 V3 计数留痕与独立验收审计兜,契约分工在此写明。 - -🔴 **契约 4 · 禁无效成员**:子容器内不预占句柄——本卡只迁 `camp_overlay` 一枚实件;五枚新句柄随卡④ T3 创建视图时落、esc 随卡⑤ T1 落;禁空占位凑结构(code-conventions §1.1 第⑤条同款)。**`camp.overlay` 枚随卡④ T3 CampOverlay 类退役一并删除**(禁悬挂——类删后类型悬挂即 parse error,删除义务显式归卡④ T3)。 - -🔴 **契约 5 · 拆分边界纪律**(判据权威=code-conventions §1.1,本卡写条款不复制定文):本卡新建分域容器沿**职责轴**——UiCampModals=可命名领域概念「营地交互域模态组」(营地场景图+其子界面+其浮窗)、单一变化原因=营地交互重做;非凑计数袋;实现报告逐件一行承载职责语句。 - -## 4. 范围边界 - -**做**:UiCampModals 新件+`ui_modals.gd` 持 camp 成员+`camp_overlay` 句柄迁移+`node()` camp 二层寻址+装配与全仓引用改指。 - -**不做**(明示去向): -- 其余 12 枚存量句柄分域分家、flow 自 UiModals 升格独立持有 → 待办清单「模态句柄册分域重构」条(2026-11-01 登记,另立批); -- 卡④ 的五枚新句柄实装 → 卡④ T3;esc 句柄 → 卡⑤ T1; -- LAYER_CONTRACT/模态栈语义任何改动 → 无(契约 1)。 - -## 5. 关联文档同步面 - -| 文档 | 关联点 | 同步义务 | -|---|---|---| -| `design/engineering/architecture/architecture.md` | 呈现层模块清单(UiCampModals 新件归属) | 反哺点 · 列清单(实现批禁写 `design/`) | -| `待办清单.md`(仓库根) | 营地交互重做条实况补卡⑥路径;本卡来源裁决 | 已同步(2026-11-01 写卡段登记维护)——实现批禁写 | -| `roadmap.md`(仓库根) | 迭代 47 行需求卡片列(卡⑥ 排第一)+预计周期 | 已换代(2026-11-01 编排入表,写卡/编排段动作)——实现批禁写 | -| `game/tests/README.md` | 能力行:**零新增能力**(V1–V3 全落既有「模态覆盖层编排与输入锁」) | 已核:零增行;实现批禁写 | -| `game/presentation/*`、`game/probe/*`、`game/tests/**` | 实施/断言本体 | 实施本体(可写) | - -## 卡前·文件结构与职责(T0 前) - -| 文件 | 职责 | 改动类型 | 落位 | 对照表行 | -|---|---|---|---|---| -| `game/presentation/ui_camp_modals.gd` | 营地域模态句柄子容器(RefCounted;本卡 1 枚 `overlay`,卡④⑤ 落满 6 枚;头注自陈禁平铺回 ui_modals) | 行为改动 | 新建 | V1 | -| `game/presentation/ui_modals.gd` | 持 `camp` 成员(_init 构造);删除平铺 `camp_overlay` 成员 | 行为改动 | 复用既有(改) | V1 | -| `game/presentation/main_ui_build.gd` | 装配赋值改经子容器(`modals.camp.overlay = …`) | 行为改动 | 复用既有(改) | V1 | -| `game/presentation/ui_registry.gd` | `node()` 的 `camp_overlay` 分支返回属性链改经子容器(key 平铺不改名);camp.* 新增解析分支随卡④⑤ | 行为改动 | 复用既有(改) | V2 | -| 全仓 `camp_overlay` 句柄引用位(组合根+探针,T0 grep 列清单) | 寻址改指 `ui.modals.camp.overlay`(断言零改) | 非行为改动(寻址改指) | 复用既有(改) | V1 | - -## 落位与可复用性预检 - -| 新件 | 复用面(grep 同职责实现) | 唯一面(grep 同名同义标识符) | 分层与交互面 | -|---|---|---|---| -| `ui_camp_modals.gd` | grep 句柄分域容器/分组容器无先例;`UiModals` 本体=按技术角色平铺的注册面容器(职责不同);`ModalFlow`=调度器非句柄册 → 不能复用,须新建 | grep `UiCampModals`/`ui_camp_modals`/`camp_modals` 无第二处;营地句柄寻址唯一落点 | RefCounted 不挂树;`ui_modals._init` 构造 camp(与 flow 同拍,先例 ui_modals.gd:24)、`main_ui_build` 只向 camp 赋句柄;`register_layer`/LAYER_CONTRACT/树序零触碰 | - -**非新增件说明**:`ui_modals.gd`/`main_ui_build.gd`/`ui_registry.gd`/探针=存量改造;**数据件/RNG/Core 零触碰**(纯呈现层簿记);Core 零 UI 依赖不因新件绕过。 - -## 实现规范预算 - -gdstyle v0.4.0 默认阈值:公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6。 - -| 触面 | ①公开方法数 | ②成员变量数 | ③迁移函数对账 | 结论 | -|---|---|---|---|---| -| `ui_camp_modals.gd` | 预期 ≤1(`_init`) | 预期 1(本卡)→6(卡④⑤ 落满) | 无迁入函数 | 三查通过 | -| `ui_modals.gd`(存量) | 不适用 | 14→14(−平铺 `camp_overlay`+`camp` 容器成员) | 无 | S13 只降不升 | -| `ui_registry.gd`(存量) | 不适用 | 不适用 | 无 | node() +1 解析分支,分支数 ≤8 | -| `main_ui_build.gd`(存量) | 不适用 | 不适用 | 无 | 装配行改指 | - -## 6. 任务卡 - -### T0 事实坐实(≈0.25d) - -- 取用:§2 F1–F5、营地交互重做条(已编迭代 47)、卡⑤ v1.5 契约 7+卡④ v3.2 T3 步与文件表(寻址规则落点)。 -- [ ] 复核 §2 全部 `file:line`;grep 全仓 `modals.camp_overlay` 引用位列清单(改指面:组合根+探针逐处)。 -- [ ] 实读 `ui_registry.gd node()` 寻址形态,定 `camp.*` 二层解析的顺延写法(循 `modals.X` 先例,禁另造第三种寻址)。 -- [ ] 跑 `bash game/tests/static_scan.sh`(tools/ 下无此件——v1.0 路径失实订正)记录 S13 读数(**禁手改 `tools/gdstyle_baseline.txt`**——基线是欠账簿,重生成人工专用;`ui_modals.gd` 类变量 14)。 -- 产出:引用位清单、寻址形态结论、S13 读数留痕。 - -### T1 实装与验证(≈0.25d) - -- [ ] 新建 `ui_camp_modals.gd`(RefCounted;`var overlay: CampOverlay`;头注自陈「营地交互域句柄子容器,终态六枚,新营地句柄禁平铺回 ui_modals」)。 -- [ ] **类名缓存刷新**(code-conventions 语言纪律 5——新 class_name 必步):新件落盘后、任何 headless 验证前先跑一次编辑器扫描(`--editor --quit`;新 worktree 无 `.godot` 缓存,缺此步 `--script` 模式 parse 假红)。 -- [ ] `ui_modals.gd`:持 `camp: UiCampModals`(`_init` 构造,与 flow 同拍——ui_modals.gd:24 先例);删除平铺 `camp_overlay` 成员;**头注同步**(「十三个模态覆盖层句柄」→「十二个平铺句柄+营地域子容器」——§1.4.1 头注如实义务)。 -- [ ] `main_ui_build.gd` 装配改指;全仓引用位按 T0 清单(8 文件)改指 `ui.modals.camp.overlay`(逐处留痕)。 -- [ ] `ui_registry.gd` `node()` 的 `camp_overlay` 分支返回属性链改经子容器(**key 平铺不改名**);camp.* 新增解析分支随卡④⑤。 -- [ ] 现役营地断言消息文本追加〔句柄子容器批 V1/V2〕尾缀(**判据零改、仅消息文本**——独立验收审计「尾缀能 grep 到」义务的落点步)。 -- [ ] 验证:改指面 8 文件逐件复跑绿(探针五件营地段+`system_test.gd`——screen_flow_probe/ui_click_probe/ui_probe/shot_probe/ui_struct_probe;断言零改只换寻址);`system_test.gd` V1c 合同树序链(:94-106)+句柄同一性链(:108)复跑绿;S13 读数=gate 绿(≤15 零 NEW)+`grep -c '^var '` 计数=14 留痕。 -- 产出:子容器在位+迁移绿证+引用位改指留痕表;卡④ T3/卡⑤ T1 按契约 2 落新句柄。 - -### T2 产出物落位卡(≈0.25d,末卡) - -- [ ] 里程碑步出口跑一次改动域全套闸:`bash tools/run_all_gates.sh --code`;回执 `all_green=true`;波内修复只做出红最小单元最窄确认。 -- [ ] 独立验收审计(未参与实现的会话/子代理),产出 `reports/iter-验收审计-<日期>.md`;未过禁合并。 -- [ ] 合并前写齐三份 `reports/`:实现报告/反哺点清单(§5 每条有落点)/验收审计。 -- 产出:三份 `reports/` 齐全+闸全绿+审计通过;合回后本地 CI 全量复验。 - -**估时合计 ≈0.75d**(T0 0.25+T1 0.25+T2 0.25)。**切分预案**:T2 偏紧(闸+审计+三报告挤 0.25d)——三份 `reports/` 先行成稿、独立验收审计走并行子代理,不串行等。 - -## 7. 验证闸:改动—验收对照表 - -| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | -|---|---|---|---|---|---|---| -| V1 句柄迁移零行为漂移 | `ui_camp_modals.gd` 新件;`ui_modals.gd` 持 camp/删平铺成员;`main_ui_build.gd` 装配改指;全仓引用改指 | 改指面探针五件营地段+`system_test.gd`(V1c :94-106+句柄同一性链 :108)〔句柄子容器批 V1〕 | 探针(+系统测试复跑) | 现役营地断言逐件复跑(断言零改、寻址新——改指面 8 文件全覆盖) | 全段绿=行为零变化证明;改指后全仓 grep 零 `modals.camp_overlay` 平铺寻址残留(静态判据);句柄同一性链绿=同一实例零漂移 | 既有:模态覆盖层编排与输入锁 | -| V2 层序合同零漂移 | `ui_registry.gd` node() 分支返回属性链改写 | `system_test.gd:_ready`(V1c 合同树序链 :94-106 复跑)〔句柄子容器批 V2〕 | 系统测试 | LAYER_CONTRACT 单一事实源 | 树序链绿=合同与落位零漂移(子容器不挂树、零树序影响;key 平铺不改名) | 既有:模态覆盖层编排与输入锁 | -| V3 S13 读数 | `ui_modals.gd` 类变量 14 | gdstyle S13 gate+`grep -c '^var '` 计数(T1 验证步留痕)〔句柄子容器批 V3〕 | 静态读数 | `bash game/tests/static_scan.sh` | gate 绿(≤15 零 NEW)+计数=14 留痕——**观测面局限申报**:S13 闸对 14/15 同样零命中,「=14」由人工计数承载(test-conventions §8.4 静态判据出口) | 既有:模态覆盖层编排与输入锁 | - -**测试方式两分法**:V1/V2 机检自动化;V3 静态读数留痕(gdstyle 基线机制域内)。**测试削弱申报:零削弱**(断言零改判据,只换寻址)。**独立验收审计**:合并前由未参与实现的会话/子代理执行(四件事口径同 test-conventions §8.7),报告落 `reports/iter-验收审计-<日期>.md`,未过禁合并。**闸口径**:轻闸每卡出口自跑;批末 `--code` 关联档全绿才合并;MC 零跑(零数值零行为)。回归措辞按模板:里程碑步出口一次全套闸,波内修复只跑红件。 - -## 8. 异常分级 - -- **L1(自救一次)**:改指拼写、探针寻址写法、node() 分支写法、类名缓存失配 parse 失败(重跑 `--editor --quit` 即清)、manifest 登记遗漏。 -- **L2(记录继续;同一红连续三次升 L3)**:行数较 T0 预期漂移但 S13 键不升。 -- **L3(立即停卡写报告等用户)**:迁移后任一现役营地断言红且非寻址成因(=行为被意外触碰);机检预算互斥(`ui_modals.gd` 类变量被迫>14、或子容器被塞入非营地句柄=拆分边界破)——停卡退回写卡段,禁造第三条路。 - -## 9. 代拍板白名单(超清单必呈报) - -1. `node()` 解析形态=match 平铺(现役唯一形态,ui_registry.gd:50-69;字典形态弃用、禁另造第三种寻址)。 -2. 子容器头注措辞(契约 4 自陈内容域内)。 - -超出必须呈报:寻址形态、文件落位、契约数字、句柄归属。 - -## 10. 待裁点:零待裁点,开工门=U0(随迭代 47 发令) - -**零待裁点。** 2026-11-01 用户裁留痕:最小改动=本卡+卡④ v3.2/卡⑤ v1.5 落子容器;全量分域句柄分家=待办清单「模态句柄册分域重构」条(另立批,不属迭代 47)。 diff --git a/reports/需求澄清-营地交互重做-2026-10-18.md b/reports/需求澄清-营地交互重做-2026-10-18.md deleted file mode 100644 index 9fe40369..00000000 --- a/reports/需求澄清-营地交互重做-2026-10-18.md +++ /dev/null @@ -1,94 +0,0 @@ -# 营地交互重做 · 需求澄清结论 - -> 2026-10-17~18 需求讨论澄清会话产出。讨论性质:**只澄清「我要什么」,不出设计稿、不钉像素规格**。 -> 本文供主项目会话建需求卡片使用;讨论会话不直接写卡。 -> 缘起:原议题「UI 贴图重构批」讨论中发现病根在交互层——用户裁「贴图重构批搁置,先重做交互方式」,故本文替代原《贴图重构批·需求澄清结论》。 -> 版本:**v1.0**(2026-10-18 澄清会话定稿;2026-10-18 文档批入库时补标版本行,供 06 条目「文档设计已闭合」凭据引用) - ---- - -## ① 目标体验(用户原话 + 一句提炼) - -**用户原话(2026-10-17,照录不美化)**: - -> 「我是希望有一个营地地图的游戏画面;或者是一张营地的图片,跟 UI 的交互是点击图片中的某一处地方,然后再进入界面。不是完全普通的那种 UI 设计,不是各种框框的;比如一张图片里面有篝火,有锻造的工坊,还有一些床铺之类的东西。我点击某些具体的东西之后,就可以进入对应的操作界面。」 - -**称呼订正(用户原话)**:「营地地图,这个称呼不太对,它就是一个营地的画面;并不是一张地图。」 -**性质注记(用户原话)**:「可以备注好原话,写到文档里面去,但它不算是一个最终的设计。」方向确认:「没错的,就是要把它改成一个交互式的场景图。」 - -**一句提炼**:营地首页从「文字按钮菜单 + 列表式覆盖层」改为「一张可点击的营地场景图」——点场景中的具体物件进入对应功能界面。 - -## ② 参照与反参照 - -- **参照物**:目前没有。用户原话「目前还没有一个参照,我可以后续找一下」——**遗留待补**。 -- **反参照(用户明示拒绝的方向)**:「完全普通的那种 UI 设计」「各种框框」——即文字按钮列表 + 面板覆盖层的传统菜单形态。现状主菜单/营地覆盖层正是此形态,被判「交互流程完全错误」(用户原话)。 - -## ③ 非目标清单 - -1. **不做贴图重构批**(本讨论前已搁置):柜台场景贴图、钥石顶栏图标、永久强化条目图标的达标化置换,等交互重做定形后再议。 -2. **篝火不绑休息/恢复**:用户原话「我们是在一段冒险前,不存在休息恢复之类的概念」。 -3. **档槽不显示「有无未完冒险」**:摘要只要三项(见⑤)。 -4. **美术定档不翻案**:明亮轻快像素风、48 色板、HSV 300°–345° 禁入带、语义色纪律、WCAG ≥4.5:1——全局硬约束继续有效,不在本讨论范围。 -5. **像素级规格不在本讨论硬定**:尺寸档/色板/明度档归「战斗一屏样张批」冻结的规格清单(排期关系已定)。 -6. **冒险进行中不开营地**:营地是存档语境(局外)枢纽,现状口径延续。 - -## ④ 目标结构(节点树 + 现状差距三分类) - -``` -主菜单(需改动:6 钮 → 3 钮) -├─ 进入存档(完全没有 · 新建) -│ └─ 选档界面(完全没有 · 新建):3 存档位,新档/进档/删档 -│ └─ 营地场景图 · 交互式(完全没有 · 新建;现四柜台覆盖层拆解) -│ ├─ 营地大门 → 冒险〔选路屏/战斗屏已实现,不动;断点弹窗保留移位〕 -│ ├─ 锻炉·铁砧 → 锻造工坊(界面已实现 · 入口改挂) -│ ├─ 宝箱 → 秘宝匣(界面已实现 · 入口改挂) -│ ├─ 床铺旁笔记本 → 生涯记录(界面已实现 · 入口改挂) -│ ├─ 木桩 → 树淬炼天赋树(界面已实现 · 入口改挂) -│ ├─ 布告板/悬赏板 → 奖励格图鉴(界面已实现 · 入口改挂) -│ └─ 篝火 → 离开营地/回主菜单(新建小动线) -├─ 设置(已实现 · 不动) -└─ 退出游戏(已实现 · 不动) -``` - -**场景纵深稿(用户原话)**:「远景是天空;中景是一个围栏,还有营地大门;近景中间是一个篝火;左边是锻炉铁砧;右边是我们的床铺,宝箱等。」 - -**现状文档依据核查**:入口拓扑有 spec(`design/gdd/ux/camp.md`、`跨局循环/生涯.md`),但形态无设计——`生涯.md` 明示「不画布局稿」,现四柜台并排为迭代 21 T6 程序占位(代码注释原文「视觉终稿归 HUD 营地视觉批」)。**「从哪进」有文档,「进去后什么形态」从未被设计过。** - -**病根诊断(用户原话)**:「主菜单界面应该只有 3 个入口:①进入一个存档 ②游戏的设置 ③退出游戏。开始冒险,和营地相关的都应该是一个存档内的东西;现在似乎没有存档这个概念;我感觉是之前做垂直切片的时候,进行扩充时没有做好这方面的考虑。」 -事实补钉:存档在数据层存在(`save_manager.gd`,已到存档 v7),但是**隐式单档**——交互层无存档概念、无档槽、无选档界面。 - -## ⑤ 关键交互裁决(全部为用户拍板,照录) - -| # | 裁决 | 用户原话/依据 | -|---|---|---| -| 1 | 主菜单只留 3 入口:进入存档 / 设置 / 退出游戏 | 见④病根诊断引文 | -| 2 | 多存档制,**3 个存档位** | 「多存档可以让它有三个存档位」 | -| 3 | 删档:**要**,且必须**二次确认** | 「需要有删档,也确实是需要有二次确认的」 | -| 4 | 档槽摘要=**钥石余额、通关次数、冒险次数(总局数)**三项,不含未完冒险进度 | 「摘要信息直接是钥匙余额和通关次数,冒险次数……」「不需要显示有无未完成的冒险;只要我提到的那三个就够了」 | -| 5 | 大门点击:**有未完冒险** → 弹「继续上一段冒险 / 开始新冒险」;**无未完冒险** → 弹「是否开始新冒险:是/否」。点大门永远先出确认,不直接进冒险 | 「断点续玩也是开始冒险的两个分支之一……它算是开始冒险的一个子节点」+ 两分支原文 | -| 6 | 天赋树 → **木桩** | 「天赋树是自身的加强,可以搞一个木桩这样的东西」 | -| 7 | 图鉴 → **布告板/悬赏板** | 「布告板/悬赏板;就这个吧,挺不错的」 | -| 8 | 篝火 → **离开营地/回主菜单** | 用户明示选② | -| 9 | **ESC 键**唤起浮窗:返回主菜单 / 设置 / 退出游戏 三项 | 「ESC键可以唤起一个浮窗,里面有返回主菜单,设置,退出游戏三项」 | -| 10 | 钥石余额:场景**顶部小 HUD 栏** | 「先按顶部小HUD栏设计」 | - -## ⑥ 验收方式(用户原话 + 提炼) - -> 「迭代过程中,只要有截图对比;后续我目检是统一来进行的;我目检是作为我们整个开发生命周期中最后一个步骤……这是不会阻塞迭代过程的。」 - -- **迭代内验收=截图对比**(不阻塞合入); -- **用户实机目检=整个开发生命周期最后一步,统一进行,不阻塞迭代**;目检后用户开启新一轮需求循环。 - -## ⑦ 切批原则(用户原话) - -> 「可以拆成多个需求卡片,但不一定需要放到多个迭代批次中;迭代批次是根据工作量大小来的,而需求卡片是根据它的工作内容来进行划分的。」 - -**工作内容维度的天然分卡线索**(供建卡参考,不预占):①存档制数据层改造(隐式单档 → 3 档槽,save_manager + 存档格式);②主菜单三入口化;③选档界面;④营地场景图(含美术产出 + 物件点选 + 入口改挂);⑤ESC 浮窗 + 顶部 HUD 栏。 - -## ⑧ 遗留与待裁 - -1. **参照物**:用户后续找(②),找到后补充进卡。 -2. **美术渠道 A/B 未裁**:CC0 改色 vs 插画级新产——原贴图批的渠道问题对营地场景图同样成立,本讨论未裁决,归建卡时或样张批规格语境下裁。 -3. **物件点选反馈细节**(悬停高亮/提示文案/可点区域判定)未谈,归设计稿阶段。 -4. **现营地覆盖层四柜台的拆解方式**(各界面保留、入口改挂)是方向级结论,具体拆解归实现卡。 -5. **贴图重构批**:搁置状态,未废——待交互重做完形后重新评估立项。 diff --git a/roadmap.md b/roadmap.md index 7e197380..a8e3c0b5 100644 --- a/roadmap.md +++ b/roadmap.md @@ -5,8 +5,8 @@ ## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照) - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 -- **迭代位**:迭代 1–46 全部已完成——迭代 46(换图系双基座七件批+站桩名字行提档与地台色合并批+棋盘格边长口径收口批 v2.0 三卡)分两段合回(卡A/B 合并提交 34bb62a5=2026-10-31、卡C 合并提交 ab5a45af=2026-11-01,独立验收审计均通过,行为面读数全机检承载),批后收尾闭合(2026-11-01):反哺点九条处置闭合(奇物 v1.4 七件已实装+行动经济 v1.4 两基座在册与折价取整同源细则+战斗结算 v1.5 全局受伤四路径统一经唯一发射口消费族与刷新事实统一挂点+地图战斗资源 v1.4 清图奖励只在清图批兑付+architecture v1.27 BattleRefreshFlow 行增补与 damage_controller/action_economy/GrantSegment 三处现状化+art-bible v3.34 换色合并①②实况化与口沿高光换值 #C9AF83+battle.md 可读下限 30px 句退役换锚点判据句;术语表零新增;10-31 清单第 8 条算例表改数不执行——算例表已随布局几何单点化批退役、无落点)、目检四项登记体验验证清单 ㊹(卡C 一项已随锚点裁定由用户实机背书免登记)、art-bible v3.33 入库合并冲突标记顺手修复(两侧同文取一)、产出物退役十一件(三需求卡片+两反哺点清单+两实现报告+两验收审计+停机呈报+卡B grilling 复核)+refresh_feats_test 补登记进 run_all.gd 套件清单(原经卡片申报走 02 关联档选跑、卡片退役后 02 全套件无此件——补登记由全量 CI 承接,能力行代码面锚定随之成立)。迭代 45 收尾记录见 git 提交 457e0739,迭代 44 见 9eedf896。 -- **下一步**:迭代 47(营地模态句柄子容器批卡⑥→营地场景图新建批卡④→ESC浮窗与营地顶栏批卡⑤,≈15 个工作日〔用户特批 2026-11-01 超 10 个工作日〕)已编排待 `/iter` 发令开工;迭代 48(状态合并累加制+立绘显示档+战斗区背景替换三卡,≈6.1 个工作日)已编排队后。待编池:冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。 +- **迭代位**:迭代 1–47 全部已完成——迭代 47(营地模态句柄子容器批卡⑥+营地场景图新建批卡④+Esc浮窗与营地顶栏批卡⑤)2026-11-01 合回(合并提交 3443890d,独立验收审计处置后通过),批后收尾闭合(2026-11-02):反哺点十二条处置闭合(architecture v1.28 营地域六件归属行增补+D1 营地面与 ui_registry 行现状化+层序合同槽换代与产品码首个键盘输入入口注记/camp.md v2.4 顶栏刷新单口实装回填/art-bible v3.35 围墙细条实装落盘值与营地场景环境子板 32 色行/camp-scene-prompts v1.4 八物件落位实测表与量化缩放实况注记/生涯.md v1.4 P6 甲落地条带撤下/08-Alpha v1.23 键盘行 Esc 例外注记与营地两行在役换代/asset-path-map 与美术清单 §3.5 营地十件实装入库确认;反哺 #10 shot_checker 色数判据互斥已随 82b2cbea/8e294de9 用户裁决落地〔阈值 40、camp 特判删除、色数收敛登记待办新条〕——零落文面)、目检五项登记体验验证清单 ㊺、产出物退役九件(三需求卡片+反哺点+实现报告+验收审计+需求澄清+美术生成方案提案+卡④⑤双审复核)、待办清单营地交互重做条整条删除(五卡全落地,状态机出口)+UI 贴图重构条与图鉴条落地注记+palette_check 双门机检化与 CAMP_HEADER_BAND 令牌退役评估两条新登记(未决先迁);提案-营地色彩与氛围脚本按 art-bible §6.2/camp-scene-prompts 依据行活引用保留。迭代 46 收尾记录见 git 提交 73fc11eb,迭代 45 见 457e0739。 +- **下一步**:迭代 48(状态合并累加制+立绘显示档+战斗区背景替换三卡,≈6.1 个工作日)已编排待 `/iter` 发令开工。待编池:冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。 ## 里程碑时间线 @@ -80,7 +80,7 @@ | 迭代 44 | 已完成(2026-10-30) | 已退役(git 历史可考) | 2026-10-29 | ≈7.875 个工作日 | 已退役(git 历史可考) | | 迭代 45 | 已完成(2026-10-31) | 已退役(git 历史可考) | 2026-10-29 | ≈7 个工作日 | 已退役(git 历史可考) | | 迭代 46 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈8.625 个工作日 | 已退役(git 历史可考) | -| 迭代 47 | 待开工 | reports/需求卡片-营地模态句柄子容器批-2026-11-01.md
reports/需求卡片-营地场景图新建批-2026-10-18.md
reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md | 2026-11-01 | ≈15 个工作日〔用户特批 2026-11-01 超 10 个工作日〕 | — | +| 迭代 47 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈15 个工作日〔用户特批 2026-11-01 超 10 个工作日〕 | 已退役(git 历史可考) | | 迭代 48 | 待开工 | reports/需求卡片-状态合并累加制批-2026-11-01.md
reports/需求卡片-立绘显示档批-2026-11-01.md
reports/需求卡片-战斗区背景替换-B区舞台插画与地面层-2026-10-31.md | 2026-11-01 | ≈6.1 个工作日 | — | - 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。 diff --git a/体验验证清单.md b/体验验证清单.md index 5e96ec61..ebfc0af3 100644 --- a/体验验证清单.md +++ b/体验验证清单.md @@ -531,3 +531,18 @@ - **红灯信号**:名字行截字或不可读、口沿高光或回退描边观感异常、刷新动机体验异常即报缺陷。 - **结论回流**:呈现缺陷归待办清单登记新条目。 + +## ㊺ 迭代 47——营地三卡实机目检(2026-11-02 随批后收尾登记) + +> 三卡合回(2026-11-01,合并提交 3443890d):卡⑥ 营地模态句柄子容器批+卡④ 营地场景图新建批(十层场景图+五功能窗口化,四柜台覆盖层退役)+卡⑤ Esc 浮窗与营地顶栏批。独立验收审计处置后通过;机检读数与论证详见实现报告(git 提交 3443890d 一线可考)。营地场景十件素材的用户游戏内终审(2026-10-31 裁定预留)随第 1 项一并观测——终稿置换归独立美术批。登记不阻塞(2026-10-12 真人检测立规)。 + +| # | 目检项 | 判据 | +|---|---|---| +| 1 | 营地场景观感:十层构图/围墙门洞/纵深(中景自底部往上约 2/3 处起可辨) | 构图与纵深符合设计;素材终审意见归独立美术批,不当场改 | +| 2 | 七物件辨识与点选反馈:悬停轮廓+浮动+名牌/按下位移/锻炉宝箱禁用态(未解锁档) | 悬停与按下反馈可感知,禁用态可辨 | +| 3 | 大门两分支弹窗(三出口文案与位次)+篝火二次确认动线 | 有/无断点两出口正确;篝火确认后离场动线正确 | +| 4 | Esc 浮窗三动线+HUD 余额观感+浮窗视觉面 | 返回主菜单/设置(开合与语境分支)/退出三动线正确;余额随刷新单口更新 | +| 5 | 四子界面视觉(窗口壳/行板/关闭钮位次) | 窗口壳与内容呈现正常、五窗互斥单开、关闭钮可用 | + +- **红灯信号**:场景图层错位、物件不可点或误路由、动线死路、窗口遮挡关系错误即报缺陷。 +- **结论回流**:呈现缺陷归待办清单登记新条目。 diff --git a/待办清单.md b/待办清单.md index 56dddc35..3dcaa763 100644 --- a/待办清单.md +++ b/待办清单.md @@ -12,6 +12,22 @@ **状态**:待文档设计 +#### palette_check 基线建档与双门机检化(2026-11-02 登记,来源=批次移交) + +**实况**:证据=迭代 47 实现报告 §7.2(已按吸收即死退役,git 提交 3443890d 可考)——卡④ V10 素材级读数:15 张素材 palette_check 只读模式 0 红灯 0 新增色;但 48 令牌 baseline 目录在库缺位(机检无对照基线),§4.1 两道门(语义检查+RGB 三通道差)的双门机检化缺承载。归工程改动批:建 baseline 目录+闸件双门判据落地。 + +**改动面**:工具代码 + +**状态**:待执行 + +#### ui_kit CAMP_HEADER_BAND 令牌退役评估(2026-11-02 登记,来源=批次移交) + +**实况**:证据=迭代 47 审计记档 2 订正在案(git 提交 3443890d 可考)——营地域柜台头带消费面已随迭代 47 四柜台覆盖层退役注销(ui_contrast 令牌表四行随形态注销),现役消费面仅剩 keystone_badge 工厂与关卡屏/商店两处非营地域用途。处置口径(实现批备案):退役归 ui_kit 令牌批顺带处置、非独立强删;届时逐点核消费面后删令牌或改名。 + +**改动面**:游戏代码 + +**状态**:待执行 + #### hobgoblin 内容三件套补齐(2026-11-01 登记,来源=审计发现) **实况**:敌人表 hobgoblin 行(寻址键 (1, battle, 3))数值完整在役、战斗正常运行,但内容三件套未交付——立绘、敌种语义模板、敌人系统.md 敌种表行均缺,呈现面因语义模板未成文无定义可依。登记凭据=[敌人系统](design/gdd/systems/战斗循环/敌人系统.md) v1.1「hobgoblin 缺口登记」节(2026-10-13 迭代 24 反哺④)。 @@ -152,7 +168,7 @@ #### UI 贴图重构批——元进度件仍是程序化占位(2026-10-13 登记,来源=审计发现) -**实况**:营地的柜台场景贴图与元进度图标目前都是程序化画出来的临时形态,没有上贴图。这条债原先只写在美术侧的资产清单里([美术资产清单](design/art/art-assets-checklist.md) 第 134 行与第 175 行,原文注明"营地现为程序化占位,状态记录 121⑧ 口径,排期归 UI 贴图重构批"),2026-10-13 由 UI 美化三层诊断转立本清单专条。规格其实已经定了——烛光黄 `#F6C667` 配木色 `#8A5A34`(见 [美术圣经](design/art/art-bible.md) §4.4),素材来源允许走"通用图标改色复用"这条低成本渠道。2026-10-21 用户裁营地交互重做五卡整体列入 Alpha:营地柜台贴图随之转入卡④营地场景图新建批(新场景取代现四柜台覆盖层),本条只余元进度件贴图终稿,排 Beta。 +**实况**:营地的柜台场景贴图与元进度图标目前都是程序化画出来的临时形态,没有上贴图。这条债原先只写在美术侧的资产清单里([美术资产清单](design/art/art-assets-checklist.md) 第 134 行与第 175 行,原文注明"营地现为程序化占位,状态记录 121⑧ 口径,排期归 UI 贴图重构批"),2026-10-13 由 UI 美化三层诊断转立本清单专条。规格其实已经定了——烛光黄 `#F6C667` 配木色 `#8A5A34`(见 [美术圣经](design/art/art-bible.md) §4.4),素材来源允许走"通用图标改色复用"这条低成本渠道。2026-10-21 用户裁营地交互重做五卡整体列入 Alpha:营地柜台贴图随之转入卡④营地场景图新建批(新场景取代现四柜台覆盖层),本条只余元进度件贴图终稿,排 Beta。**2026-11-01 迭代 47 卡④ 落地注记**:四柜台覆盖层已退役(场景图五功能窗口形态,camp.md v2.4),卡④ 侧义务终结;本条余元进度件贴图终稿与九宫格切片核对,排 Beta。 **缺口**:还差一次「自己画 vs 找 CC0 素材改色」的美术裁决(见 [美术资产清单](design/art/art-assets-checklist.md) §0 的复用渠道闸),裁决后才能定素材工单写卡。 @@ -218,7 +234,7 @@ #### 敌方技能图鉴 / 学习呈现(2026-10-18 登记,来源=会话提及) -**实况**:池与权重不公开(D4/D5)口径下的进阶信息面——玩家侧技能知识系统(见过 → 认得 → 记谱);首发三池学习成本低,后置(P2)。(原条目无登记日期,按本批格式整改补登 2026-10-18。) +**实况**:池与权重不公开(D4/D5)口径下的进阶信息面——玩家侧技能知识系统(见过 → 认得 → 记谱);首发三池学习成本低,后置(P2)。(原条目无登记日期,按本批格式整改补登 2026-10-18。)**2026-11-01 迭代 47 卡④ 落地注记**:营地侧入口已落=场景图布告板命中(codex 占位壳挂起态——占位锁文锚定、零激活禁行);本条呈现设计义务不变。 **缺口**:还差玩家侧技能知识系统的呈现设计讨论(HUD 承载形态与记谱口径),P2 后置面。 - 相关文档:[HUD 框架](design/gdd/systems/表现与支撑/HUD框架.md) 与[敌人系统](design/gdd/systems/战斗循环/敌人系统.md)(P2) @@ -421,20 +437,6 @@ **状态**:待美术设计 -#### 营地交互重做·五张需求卡片(2026-10-18 登记,来源=会话提及) - -**实况**:2026-10-17~18 需求讨论澄清会话产出结论文档,用户令按工作内容维度拆卡、卡片不预占迭代号。五卡已写(顺序=执行顺序):①存档制数据层改造批 ②主菜单三入口化批 ③选档界面新建批 ④营地场景图新建批 ⑤Esc 浮窗与营地顶栏批(各卡估时与内容见卡片自身)。三道复核:grilling 子 Agent 对抗审查(五卡各一)→v1.1;用户裁定「事项按推荐的来」→v1.2;用户两次订正(**卡④留在批内不踢出**;前置归用户自立批,Agent 不代跑不代产——曾越权起草的点选反馈设计稿 v0.1 已撤回删除)→卡④ v2.2;**卡④ 2026-10-21 用户令退回美术设计段、2026-10-31 用户令据 req-card 第〇步重立为 v3.0 现行有效卡(美术设计已闭合=样张过审+art-bible 条款版本 v3.24 §6.2)**。①②③⑤ 零待裁点可编工程波次:②③ 硬耦合同波(「进入存档」钮落点=选档界面),① 是 ③ 前置;⑤ 随 ④ 代码波同行。Alpha 出口裁决(2026-10-21 用户裁):五卡整体列入 Alpha——08「三 · 界面」已开条目,Alpha 出口依赖五卡完工与卡④三个用户侧前置销号。**工程波次一已落地(2026-10-22)**:卡①②③ 随迭代 33 实现批合回 master(合并提交 ebf40947/5c2a7bcf/508f190b,总收口 6e8f72b2),三卡需求卡片与批次产出物已按「吸收即死」退役(设计口径已吸收进 存档序列化.md/生涯.md/camp.md/08-Alpha版本标准.md v1.13/art-bible.md v3.18,反哺落文凭据=文档批 git 提交 1864f157+9f7b3e8a);卡④(营地场景图)退回美术设计段待重立卡、卡⑤(Esc 浮窗)随卡④ 代码波同行,两卡未编排——编入哪一迭代由用户经迭代编排段发令。关联文档: -- 设计澄清定稿:reports/需求澄清-营地交互重做-2026-10-18.md(v1.0:目标体验原话/目标结构树+纵深稿/10 条交互裁决/验收口径/切批原则/遗留待裁) -- 卡④:reports/需求卡片-营地场景图新建批-2026-10-18.md(**v3.2 现行有效卡**,2026-10-31 重立 v3.0、2026-11-01 双审修订 v3.1、同日机检预算裁决修订 v3.2=营地六句柄落 ui_camp_modals.gd 子容器;样张过审+art-bible v3.31 §6.2,开工门已全部销号) -- 卡⑤:reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md(**v1.5 现行有效卡**,2026-11-01 双审修订 v1.4、同日机检预算裁决修订 v1.5) -- 卡⑥(前置基建):reports/需求卡片-营地模态句柄子容器批-2026-11-01.md(**v1.0**,2026-11-01 用户令立——营地模态句柄子容器 UiCampModals+camp_overlay 句柄迁移,迭代 47 执行序第一位) - -**代码段开工门(/iter 闸门)**:卡④ 已重立为 v3.0 现行有效卡(美术设计已闭合=样张过审 2026-10-31+art-bible 条款版本 v3.24 §6.2,据 req-card 第〇步);原「美术设计闭合后重立卡,再谈编迭代」判据已满足,可编迭代;**重立卡判据=卡头 v2.3 用户令「美术设计闭合(样张过审+art-bible 条款版本)后重立卡,再谈编迭代」**。前置登记(P1–P5 属代码段开工门,非重立卡前置):P1 美术渠道(**2026-10-22 已裁=B 插画级新产**,✦ 渠道作者自跑远程生图管线;规格沿用 art-bible §8.1/§8.2 既有裁决);P2 像素规格(Q6 甲过渡口径已裁,执行归用户线);P3 点选反馈设计稿(用户线,未受命开工;Agent 曾越权起草 v0.1,已按用户令撤回删除;**代码段开工门**);P4 参照物(**2026-10-23 已补**=artwork/2026-10-23-营地场景/Gemini_Generated_Image_ykrc0nykrc0nykrc.jpg,已进 camp-scene-prompts.md §1 风格参考图表、与纵深稿对表、围墙结构冲突已呈报;参照物是参考图,保留 artwork/ 不入游戏目录);P5 GDD/art-bible 落文(文档批,用户发令;**代码段开工门**)。**2026-10-31 用户裁定:保留全部待选稿、各素材第一张样本稿为终稿、「目前我看每个都还可以接受」=样张过审完成;art-bible 条款版本已落 v3.24 §6.2(camp.md v2.2/camp-scene-prompts v1.2/asset-path-map/art-assets-checklist/评估报告同步)——卡④ 重立判据两样已齐。** 终稿指定清单= artwork/candidates/_终稿裁定-2026-10-31.txt(用户准备在游戏内做最终审核)。重立卡已完成(v3.0 现行有效卡)。**2026-11-01 用户令修订换代**:卡④ v3.1→v3.2、卡⑤ v1.4→v1.5(双审修订+机检预算裁决——营地六句柄落 ui_camp_modals.gd 子容器,卡⑥ 前置建件);**代码段 `/iter` 开工门已全部裁断销号**——P3 销号口径=camp.md v2.2 四态规格即设计稿;P5 销号口径=形态落文完成、实装回填归反哺点(camp-scene-prompts v1.3 §5 已改已裁+art-bible v3.31 §6.2 同步,本会话文档批落文);十张终稿后处理授权随 `/iter` 开工令一并生效(不再两次发令)。**开工门清零,迭代 47 可开工,执行序=卡⑥ 句柄子容器 → 卡④ → 卡⑤。** - -**改动面**:文档+游戏代码+美术素材 - -**状态**:文档设计已闭合+美术设计已闭合+已写卡+已编迭代 47 - #### 模态句柄册分域重构(2026-11-01 登记,来源=会话提及) **实况**:重构证据=`game/presentation/ui_modals.gd:7-20`(类变量 14 实测)+停机呈报-迭代47机检预算互斥-2026-11-01.md(卡④⑤ 平铺合计 19>S13 上限 15)——按技术角色平铺 13 模态句柄+flow,迭代 47 营地域新增六句柄顶格 S13 类变量上限 15(2026-11-01 用户裁:最小改动先走——营地六句柄落 `ui_camp_modals.gd` 子容器,随迭代 47 卡⑥/卡④/卡⑤ 落地,本条只登记**全量分家**)。目标形态=存量句柄按域分组抽容器(局内 run 六件/菜单与跨语境归组)+ModalFlow 自 UiModals 升格独立持有;行为零变化、纯句柄搬家;返工面=全仓探针深员寻址+`ui_registry.gd node()` 寻址+`main_ui_build.gd` 装配。拆分判据权威=code-conventions §1.1(沿职责轴;营地子容器先例=`ui_camp_modals.gd`,随迭代 47 落地后为准)。