fix: 首跑错误批次(Godot 4.7.2 引擎实证修复 R1-R14)
本机首次具备引擎自验证能力后的首跑修复。四条命令 + 主场景 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 待文策渊裁定)
This commit is contained in:
1 parent
cdec918a5b
commit
c534e95458
146 files changed
+37229
-75
No files matched your search
@@ -4,7 +4,7 @@ extends RefCounted
|
||||
# 说明:EventDirector 是 RefCounted,不依赖场景树 → 无头可跑。
|
||||
# 断言口径:效果必经 EconomyState(瞬时区/惩罚/双货币),UI 只读 view()。
|
||||
|
||||
func run(a, data) -> void:
|
||||
func run(a, data: BalanceData) -> void:
|
||||
_test_gate(a, data)
|
||||
_test_output_mult(a, data)
|
||||
_test_click_output_mult(a, data)
|
||||
@@ -13,7 +13,7 @@ func run(a, data) -> void:
|
||||
_test_timeout_default(a, data)
|
||||
|
||||
|
||||
func _new_econ(data) -> EconomyState:
|
||||
func _new_econ(data: BalanceData) -> EconomyState:
|
||||
var e := EconomyState.new(data)
|
||||
e.bought["up_gate_events"] = true # 事件系统路引(过 H2 后出现)
|
||||
e.gen_levels[0] = 10 # 游魂 10 级 → 产出 1.0/s(gen1 rate 0.1)
|
||||
@@ -21,7 +21,7 @@ func _new_econ(data) -> EconomyState:
|
||||
|
||||
|
||||
# ---- 出现前提 ----
|
||||
func _test_gate(a, data) -> void:
|
||||
func _test_gate(a, data: BalanceData) -> void:
|
||||
var d := EventDirector.new(data, 7)
|
||||
var e := EconomyState.new(data)
|
||||
e.gen_levels[0] = 10
|
||||
@@ -33,7 +33,7 @@ func _test_gate(a, data) -> void:
|
||||
|
||||
|
||||
# ---- 百鬼夜行:全产出 ×5,60s 后清零 ----
|
||||
func _test_output_mult(a, data) -> void:
|
||||
func _test_output_mult(a, data: BalanceData) -> void:
|
||||
var d := EventDirector.new(data, 11)
|
||||
var e := _new_econ(data)
|
||||
var base := e.output_per_sec()
|
||||
@@ -55,7 +55,7 @@ func _test_output_mult(a, data) -> void:
|
||||
|
||||
|
||||
# ---- 天狗食月:点击 ×10 + 全产出 ×2 ----
|
||||
func _test_click_output_mult(a, data) -> void:
|
||||
func _test_click_output_mult(a, data: BalanceData) -> void:
|
||||
var d := EventDirector.new(data, 13)
|
||||
var e := _new_econ(data)
|
||||
var base_out := e.output_per_sec()
|
||||
@@ -77,7 +77,7 @@ func _test_click_output_mult(a, data) -> void:
|
||||
|
||||
|
||||
# ---- 阴兵闹饷:窗口内点击不足 → 随机班底产出 -50% × 60s ----
|
||||
func _test_challenge_fail(a, data) -> void:
|
||||
func _test_challenge_fail(a, data: BalanceData) -> void:
|
||||
var d := EventDirector.new(data, 17)
|
||||
var e := _new_econ(data)
|
||||
var ev := data.event("ev_02_naoxiang")
|
||||
@@ -105,7 +105,7 @@ func _test_challenge_fail(a, data) -> void:
|
||||
|
||||
|
||||
# ---- 冤魂申诉:二选一(超度 = 阴德爆发 30s 量 / 吞噬 = 冤气) ----
|
||||
func _test_choice(a, data) -> void:
|
||||
func _test_choice(a, data: BalanceData) -> void:
|
||||
var ev := data.event("ev_03_shensu")
|
||||
# opt_a:超度
|
||||
var d1 := EventDirector.new(data, 19)
|
||||
@@ -128,7 +128,9 @@ func _test_choice(a, data) -> void:
|
||||
d2.force_start(e2, "ev_03_shensu")
|
||||
var r2 := d2.choose(e2, 1)
|
||||
a.true_(bool(r2.get("ok", false)), "选 opt_b(吞噬)")
|
||||
var want := lerp(float(ev.p_clicks), float(ev.p_window_sec),
|
||||
# lerp() 在 Godot 4.x 返回 Variant(同 floor 家族);`:=` 推断会触发
|
||||
# INFERENCE_ON_VARIANT(4.7.2 默认按错误处理)→ 显式标注 float
|
||||
var want: float = lerp(float(ev.p_clicks), float(ev.p_window_sec),
|
||||
clampf(float(e2.halls_passed) / float(data.halls.size()), 0.0, 1.0))
|
||||
a.near(float(r2.get("wrath", 0.0)), want, 1e-6, "吞噬冤气 = lerp(p_clicks, p_window_sec, 殿序进度)")
|
||||
a.near(e2.wrath, want, 1e-6, "冤气入账")
|
||||
@@ -136,7 +138,7 @@ func _test_choice(a, data) -> void:
|
||||
|
||||
|
||||
# ---- 超时默认 = tune_event_timeout_default(opt_a 超度) ----
|
||||
func _test_timeout_default(a, data) -> void:
|
||||
func _test_timeout_default(a, data: BalanceData) -> void:
|
||||
var d := EventDirector.new(data, 29)
|
||||
var e := _new_econ(data)
|
||||
var default_opt := data.tune_text("tune_event_timeout_default", "opt_a")
|
||||
|
||||
Reference in new issue
Block a user