From 42aff596f7401ddf5d05085306ea1530cfd146f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=9F=BA=E5=B2=A9=EF=BC=88engineering-lead?= =?UTF-8?q?=EF=BC=89?= Date: Wed, 21 Oct 2026 18:48:19 +0800 Subject: [PATCH] =?UTF-8?q?W5=20=E6=94=B6=E5=B0=BE=EF=BC=9A=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=90=8C=E6=AD=A5+W6=20=E5=A4=87=E5=BF=98=20=E2=80=94?= =?UTF-8?q?=20#13=20=E6=96=B9=E6=A1=88=20A=20=E4=BB=A3=E7=A0=81=E4=BE=A7?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=EF=BC=88RESTART=5FTARGETS/tune=5Frestart=5Fc?= =?UTF-8?q?urve/gates=20=E6=B3=A8=E9=87=8A/=E6=B5=8B=E8=AF=95=E6=96=AD?= =?UTF-8?q?=E8=A8=80=E6=94=B9=201:0.48:0.42:0.40=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E9=97=A8=20#13=20restart.pass=3Dtrue=20R1-R4=20=E5=85=A8?= =?UTF-8?q?=E5=85=A5=E5=B8=A6=EF=BC=9B=E6=9E=B6=E6=9E=84=E6=96=87=E6=A1=A3?= =?UTF-8?q?=20=C2=A74.2=20=E5=AE=BF=E6=85=A7=E5=85=AC=E5=BC=8F=E6=B3=A8?= =?UTF-8?q?=E9=87=8A+=E7=9B=AE=E5=BD=95=E6=A0=91=E8=A1=A5=20meta=5Fupgrade?= =?UTF-8?q?s=EF=BC=9BCLAUDE.md=20=E6=96=B0=E5=A2=9E=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=90=BD=E7=82=B9=E8=A7=84=E5=88=99=20=C2=A79.7=EF=BC=9Btest?= =?UTF-8?q?=5Frunner=20752=20=E6=A3=80=E6=9F=A5=208/8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 9 +++++ data/build/balance_tuning.json | 4 +- data/sheets/balance_tuning.csv | 2 +- data/sheets/balance_tuning.desc.translation | Bin 4549 -> 4677 bytes data/sheets/balance_tuning.text.translation | Bin 505 -> 509 bytes .../2026-10-20-f-sim-round2-comparison.md | 36 +++++++++++++++--- src/core/economy/prestige_model.gd | 11 +++++- src/core/sim/gates.gd | 7 +++- src/tools/gen_balance_sheets.py | 4 +- tests/sim_reports/report-2026-10-21.json | 4 +- tests/unit/cases/test_balance_data.gd | 2 +- tests/unit/cases/test_economy_formulas.gd | 4 +- 12 files changed, 65 insertions(+), 18 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f3f524d..047a946 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -99,6 +99,15 @@ godot --headless --path . -s res://src/tools/import_main.gd -- --validate-only **验证手册**:`docs/engineering/2026-10-19-w3-verification-manual.md`(文档区,不入库)。 W3 的 GDScript 从未被引擎执行过(本机无 Godot)——**跑通第 1 节 headless 单测才算 W3 验过**。 +## 文档落点规则(架构 §9.7,W5 起) + +**判据一句话**:记录"这个仓库已发生了什么"的工程事实 → 跟项目仓走(`docs/engineering/`); +规定"这个项目应该怎样"的设计规范 → 留 workspace 设计区(C 盘 `design/` + `docs/architecture/`)。 +自检:"换一台电脑 clone 仓库后,这份文档还找得到、还需要吗?" +- 工程周报/验证报告/sim 对比/look-dev 冻结记录 → 本项目仓 `docs/engineering/<日期>-<名称>.md`; +- 设计母本(GDD / Balance Bible / 架构文档 / 裁定报告)→ workspace 设计区,多轮迭代母本,不随单次 commit 失效; +- W1-W4 工程报告仍留 C 盘原处(交叉引用不断链,不迁移);W5 起新工程报告一律按本规则落项目仓。 + ## 纪律提醒 - 写代码前**先写测试**(GUT W3 起);每个 Story 留测试证据路径; diff --git a/data/build/balance_tuning.json b/data/build/balance_tuning.json index a2df155..a9695b1 100644 --- a/data/build/balance_tuning.json +++ b/data/build/balance_tuning.json @@ -174,8 +174,8 @@ "id": "tune_restart_curve", "kind": "text", "num": 0, - "text": "1:0.6:0.4:0.3", - "desc_cn": "[B§4.3] 重开曲线目标(第 5 轮触底 ≥0.25×);模拟器门 #13 断言" + "text": "1:0.48:0.42:0.40", + "desc_cn": "[B§4.3] 重开曲线目标(第 5 轮触底 ≥0.25×);模拟器门 #13 断言。[v1.0→v1.1] 用户拍板方案 A:二轮 sim 实测校准值(旧 1:0.6:0.4:0.3 为一轮解析预估,未计阻尼)" }, { "id": "tune_event_timeout_default", diff --git a/data/sheets/balance_tuning.csv b/data/sheets/balance_tuning.csv index fb6dfe9..a6ffc99 100644 --- a/data/sheets/balance_tuning.csv +++ b/data/sheets/balance_tuning.csv @@ -22,7 +22,7 @@ tune_skip_gens,number,3,,[B§4.2] 跳过机制覆盖前 3 档班底 tune_skip_levels,number,25,,[B§4.2] 跳过机制每档 +25 级 tune_skip_level_cap_per_gen,number,50,,"[B§4.2] W5 裁定 P-27(F-2):跳过每档获赠 = min(floor(宿慧/5)×25, 本值)(原无封顶 → R2 开盘白送 2850 级)" tune_enthrone_rebirths,number,2,,[B§4.4] 阴司敕封触发:转世 ≥2(约第 2-3 轮,累计 8-12h 为其 pacing 后果) -tune_restart_curve,text,0,1:0.6:0.4:0.3,[B§4.3] 重开曲线目标(第 5 轮触底 ≥0.25×);模拟器门 #13 断言 +tune_restart_curve,text,0,1:0.48:0.42:0.40,[B§4.3] 重开曲线目标(第 5 轮触底 ≥0.25×);模拟器门 #13 断言。[v1.0→v1.1] 用户拍板方案 A:二轮 sim 实测校准值(旧 1:0.6:0.4:0.3 为一轮解析预估,未计阻尼) tune_event_timeout_default,text,0,opt_a,[B§7] 冤魂申诉超时默认 = 超度(opt_a) tune_souls_div,number,10000,,"[B§6] 超度亡魂 = floor(本轮累计阴德 ÷ 10,000)(叙事计数器,不设闸门;P-14)" tune_enthrone_suihui_req,number,60,,[G§3.4] 阴司敕封解锁条件:宿慧 ≥60([B§4.4] 仅给 8-12h 体感,采信 GDD 数值) diff --git a/data/sheets/balance_tuning.desc.translation b/data/sheets/balance_tuning.desc.translation index ea8a673a9cb4528499b54f7a6c8336a5ab05e21b..4ddd735959d5ac23a4aaf61bf7addf3dbf038486 100644 GIT binary patch delta 392 zcmX@Ad{kvaC6iPi2LppA0|YYyX%N1&+*CiCZSrI$J0=~@$(Nb*n1Z+`Gc(%>UI!`; z1u6jH;>xQBr%VoF)|WJAV_+}=ihwZ8h^2R9o0m`ck(UfcE$^nlUU3d-%p;! z5-#VGR6GMlqc=4Q1EW#VCAm;#gnVJ4`Oy0gu*yn&WG1Nk7le)HVm zZY~Cf6d)UfVaBwxNmr(@GB8{Qih(fDCI)#Rp0;@&>u%Qi#|=%)8IRyZ71L{m-WDe73Md!SVf`Sx*UEyc1-IyCSPXKW4gjMnVH#6FcPRZ z6sQ1%iz}}l6q_8xtS`Bfm4U$oC<4MTBbMHcZPu7Pi`kyBe)28mcE+H|Ni61!g_CEo zgiEEfGccq9)q*fg{cmMM=ACSlxmoQ(Teuk*rU0ctmMd=fE5Z)WRSS#1fn5vF>Kwe4RUijR)ulu==3jAZGwlYB3Z5 diff --git a/data/sheets/balance_tuning.text.translation b/data/sheets/balance_tuning.text.translation index aaf1a3d20e464d463d4e315cd30da2f3b3636a34..de9e21118816064e86de3d5e4b53b594f2006605 100644 GIT binary patch delta 88 zcmey#{FiydTE+lD1_lNYW`yD$H#$Co_-s(j4y5IQSR9BAtqk-`EI@=2h%jKtFDQvm QWMJR`%7OF;1qV3;0F$N-w*UYD delta 84 zcmey%{F8aZT1Fo}1_lNYW`yD$H#$Co_-s(j4y5IQSOka-tqk Dictionary: var rebirths: Array = report.get("rebirths", []) if rebirths.size() < 2: diff --git a/src/tools/gen_balance_sheets.py b/src/tools/gen_balance_sheets.py index 32ece28..9081233 100644 --- a/src/tools/gen_balance_sheets.py +++ b/src/tools/gen_balance_sheets.py @@ -278,7 +278,7 @@ TUNING = [ ("tune_skip_levels", "number", 25, "", "[B§4.2] 跳过机制每档 +25 级"), ("tune_skip_level_cap_per_gen","number", 50, "", "[B§4.2] W5 裁定 P-27(F-2):跳过每档获赠 = min(floor(宿慧/5)×25, 本值)(原无封顶 → R2 开盘白送 2850 级)"), ("tune_enthrone_rebirths", "number", 2, "", "[B§4.4] 阴司敕封触发:转世 ≥2(约第 2-3 轮,累计 8-12h 为其 pacing 后果)"), - ("tune_restart_curve", "text", 0, "1:0.6:0.4:0.3", "[B§4.3] 重开曲线目标(第 5 轮触底 ≥0.25×);模拟器门 #13 断言"), + ("tune_restart_curve", "text", 0, "1:0.48:0.42:0.40", "[B§4.3] 重开曲线目标(第 5 轮触底 ≥0.25×);模拟器门 #13 断言。[v1.0→v1.1] 用户拍板方案 A:二轮 sim 实测校准值(旧 1:0.6:0.4:0.3 为一轮解析预估,未计阻尼)"), ("tune_event_timeout_default","text", 0, "opt_a", "[B§7] 冤魂申诉超时默认 = 超度(opt_a)"), ("tune_souls_div", "number", 10000, "", "[B§6] 超度亡魂 = floor(本轮累计阴德 ÷ 10,000)(叙事计数器,不设闸门;P-14)"), ("tune_enthrone_suihui_req","number", 60, "", "[G§3.4] 阴司敕封解锁条件:宿慧 ≥60([B§4.4] 仅给 8-12h 体感,采信 GDD 数值)"), @@ -664,7 +664,7 @@ def self_check(sheets) -> None: assert tune["tune_click_zone_cap"]["num"] == 16 assert tune["tune_gen_zone_cap"]["num"] == 8 assert tune["tune_global_zone_cap"]["num"] == 64 - assert tune["tune_restart_curve"]["text"] == "1:0.6:0.4:0.3" + assert tune["tune_restart_curve"]["text"] == "1:0.48:0.42:0.40" assert tune["tune_event_timeout_default"]["text"] == "opt_a" # W4 方案 B 调参 4 行(systems-spec §1.2;用户 2026-10-20 拍板) assert tune["tune_boss_kappa_base"]["num"] == 0.01 diff --git a/tests/sim_reports/report-2026-10-21.json b/tests/sim_reports/report-2026-10-21.json index 0123acb..3401044 100644 --- a/tests/sim_reports/report-2026-10-21.json +++ b/tests/sim_reports/report-2026-10-21.json @@ -260,8 +260,8 @@ } }, "restart": { - "detail": "R1=1.00(目标 1.00);R2=0.48(目标 0.60);R3=0.42(目标 0.40);R4=0.40(目标 0.30)", - "pass": false + "detail": "R1=1.00(目标 1.00);R2=0.48(目标 0.48);R3=0.42(目标 0.42);R4=0.40(目标 0.40)", + "pass": true }, "runs": [ { diff --git a/tests/unit/cases/test_balance_data.gd b/tests/unit/cases/test_balance_data.gd index cd01050..40ee093 100644 --- a/tests/unit/cases/test_balance_data.gd +++ b/tests/unit/cases/test_balance_data.gd @@ -34,7 +34,7 @@ func run(a, data: BalanceData) -> void: a.near(data.tune_num("tune_souls_div", 0.0), 10000.0, 1e-9, "超度除数 10000") a.near(data.tune_num("tune_enthrone_suihui_req", 0.0), 60.0, 1e-9, "敕封宿慧门槛 60") a.near(data.tune_num("tune_enthrone_rebirths", 0.0), 2.0, 1e-9, "敕封转世门槛 2") - a.eq(data.tune_text("tune_restart_curve", ""), "1:0.6:0.4:0.3", "重开曲线文本") + a.eq(data.tune_text("tune_restart_curve", ""), "1:0.48:0.42:0.40", "重开曲线文本(v1.1 校准值)") a.near(data.tune_num("tune_wrath_layers", 0.0), 22.0, 1e-9, "冤煞 22 层") a.near(data.tune_num("tune_click_base", 0.0), 1.0, 1e-9, "点击基础值 1") # W5 裁定调参(sim 一轮裁定 §2.3/§2.4):宿慧渐近 + 跳过封顶 + 削减速加深 diff --git a/tests/unit/cases/test_economy_formulas.gd b/tests/unit/cases/test_economy_formulas.gd index 03f5c90..7bf290c 100644 --- a/tests/unit/cases/test_economy_formulas.gd +++ b/tests/unit/cases/test_economy_formulas.gd @@ -37,7 +37,9 @@ func run(a, _data: BalanceData) -> void: a.eq(PrestigeModel.skip_count(23, 5), 4, "skip 23/5 = 4") a.eq(PrestigeModel.skip_count(23, 4), 5, "skip 23/4 = 5(m04)") a.near(PrestigeModel.restart_target(0), 1.0, 1e-9, "重开曲线 R1") - a.near(PrestigeModel.restart_target(3), 0.3, 1e-9, "重开曲线 R4") + a.near(PrestigeModel.restart_target(1), 0.48, 1e-9, "重开曲线 R2(v1.1 校准值)") + a.near(PrestigeModel.restart_target(2), 0.42, 1e-9, "重开曲线 R3(v1.1 校准值)") + a.near(PrestigeModel.restart_target(3), 0.40, 1e-9, "重开曲线 R4(v1.1 校准值)") a.near(PrestigeModel.restart_target(4), 0.25, 1e-9, "重开曲线 R5 触底") a.true_(PrestigeModel.enthrone_available(2, 2), "敕封:转世 2 可") a.true_(not PrestigeModel.enthrone_available(1, 2), "敕封:转世 1 不可")