本机首次具备引擎自验证能力后的首跑修复。四条命令 + 主场景 180 帧全绿: - --import exit=0(漂移门 git diff data/build 空) - --validate-only exit=0 RESULT: PASS - test_runner exit=0 PASS(584 检查,8/8 用例) - sim_main exit=0(报告落 tests/sim_reports/report-2026-10-20.json) - 主场景 --quit-after 180 exit=0 零 ERROR/WARNING(F5 可玩) 预定位错误(team-lead 清单): - R1 economy_state.gd:596 enthone_ready -> enthrone_ready(单点故障连锁) - R2 hud_root.gd:142,160 HorizontalAlignment.LEFT -> HORIZONTAL_ALIGNMENT_LEFT - R3 boss_arena.gd 补 var _pending_hall_index := -1 - R4 hall_band_world.gd:95 删 "_ = ext"(非法语句;--check-only 定位) - R5 sheet_importer._type_ok 补 object->Dictionary / array->Array(9 条假违规) - R6 game_state.gd econ==null 防护(防 autoload 崩每帧刷错打满管道挂死) 引擎新暴露错误: - R7 prestige_model floor() Variant 推断(4.7.2 按错误)连锁编译失败 - R8 gates.gd var pass 保留字;R9 %g/%.*f 格式符 ×6 处 - R10 greedy.gd Dictionary.get() 推断;R11 probe_p1 条件表达式推断 - R12 测试用例 data 参数统一标 BalanceData(无类型参数成员调用返 Variant) - R13 boss_battle 用例 Dictionary 下标运算显式 float 化 - R14 band_world_root.compute_ranges 返回 Array[Vector2](类型化数组不隐式转换) 测试侧数值修正(根因已核实,实现符合设计): - gen3 可购断言 merit 1000->2000(800 文书 + 1200 首购) - 开场伤害断言改"循环至 ACTIVE 即停"(INTRO 结束 tick 不计军列伤) - 容量断言预算 30->34s(战斗真实给 intro 3s + active 30s) 工程加固: - EconomyState 红线守卫首次越线才报(sim 长跑日志 6.5MB->1KB) - stage_world.gd stretch=false(SubViewport 手动尺寸驱动生效) 知识缺口登记:docs/engineering/2026-10-20-f-engine-first-run-notes.md sim 首轮数据:主口径 11/14 过(#2/#3/#12/#13/#14 FAIL 待文策渊裁定)
46 lines
2.7 KiB
GDScript
46 lines
2.7 KiB
GDScript
extends RefCounted
|
||
|
||
# 用例:BalanceData 载入 + 跨表引用 + CSV/Bible 关键值(数据门)
|
||
|
||
func run(a, data: BalanceData) -> void:
|
||
a.true_(data.load_errors.is_empty(), "load_errors 为空(%s)" % str(data.load_errors))
|
||
a.eq(data.generators.size(), 12, "12 班底")
|
||
a.eq(data.upgrades.size(), 108, "108 升级")
|
||
a.eq(data.meta_upgrades.size(), 12, "12 宿慧商品")
|
||
a.eq(data.halls.size(), 10, "10 殿")
|
||
a.eq(data.palettes.size(), 10, "10 色板")
|
||
a.eq(data.bosses.size(), 10, "10 殿王战")
|
||
a.eq(data.events.size(), 4, "4 事件")
|
||
# 关键数值(Balance Bible v1.0 逐值一致)
|
||
a.near(data.generators[11].base_rate, 1073741824.0, 0.5, "gen12 rate = 8^10")
|
||
a.near(data.generators[1].payback_seconds(), 120.0, 0.5, "gen2 回本 120s")
|
||
a.near(data.generators[5].payback_seconds(), 293.0, 0.5, "gen6 回本 293s")
|
||
a.near(data.generators[11].payback_seconds(), 1118.0, 0.5, "gen12 回本 1118s")
|
||
a.near(data.hall_by_no(1).gate_merit, 2000.0, 0.5, "H1 门 2K")
|
||
a.near(data.hall_by_no(10).gate_merit, 1.5e9, 0.5, "H10 门 1.5B")
|
||
a.true_(data.hall_by_no(10).is_prestige_gate, "H10 = prestige 门")
|
||
a.near(data.boss_for_hall("hall_01_qinguang").boss_army_seconds, 23.0, 1e-9,
|
||
"H1 殿王军列单推秒数 S_1 = 23(方案 B;旧 HP 系数 15 已废止)")
|
||
a.near(data.boss_for_hall("hall_10_zhuanlun").boss_army_seconds, 28.0, 1e-9,
|
||
"H10 殿王军列单推秒数 S_10 = 28")
|
||
a.eq(data.boss_for_hall("hall_01_qinguang").souls_par, 0, "H1 超度基准 0(无开场加成)")
|
||
a.eq(data.boss_for_hall("hall_10_zhuanlun").souls_par, 90000, "H10 超度基准 90000")
|
||
# 敕封诏书(P-12:requires = enthrone_ready)
|
||
var edict := data.upgrade("up_gate_tianzi")
|
||
a.true_(edict != null, "敕封诏书存在")
|
||
a.eq(edict.requires, "enthrone_ready", "诏书 requires = enthrone_ready")
|
||
a.eq(edict.cost, 800000000000, "诏书成本 800B")
|
||
# 调参数(balance_tuning)
|
||
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.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")
|
||
# 跨表引用完整性(schema 管单表;这里查跨表)
|
||
a.true_(data.check_references().is_empty(), "跨表引用无悬挂(%s)" % str(data.check_references()))
|
||
# 每殿恰一场殿王战 + 色板
|
||
for h in data.halls:
|
||
a.true_(data.boss_for_hall(h.id) != null, "%s 有 boss 行" % h.id)
|
||
a.true_(data.palette_for_hall(h.id) != null, "%s 有色板行" % h.id)
|