本机首次具备引擎自验证能力后的首跑修复。四条命令 + 主场景 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 待文策渊裁定)
41 lines
1.7 KiB
GDScript
41 lines
1.7 KiB
GDScript
class_name BigNumber
|
||
extends RefCounted
|
||
|
||
# ============================================================================
|
||
# BigNumber —— 大数红线工具(架构 §4.2)
|
||
#
|
||
# 口径:double 全程(MVP 终局 ≤1e14 已锁定,技术评估 §3.1 预留的大数系统路径
|
||
# 不启用)。本类只做两件事:
|
||
# ① 红线断言:sim 门 #10 与 CI 用;超出 = push_error + 返回 false
|
||
# ② 科学计数辅助:日志/报告用
|
||
#
|
||
# 纪律:core 层无 Node 依赖;零热路径分配(仅静态函数)。
|
||
# 知识缺口:4.7.x 超出训练数据——本文件只用 4.x 稳定 API。
|
||
# ============================================================================
|
||
|
||
## 终局红线([B§10] 门 #10:终局 ≤1e14)
|
||
const RED_LINE := 1e14
|
||
|
||
|
||
## 断言 value 未超红线;超了返回 false 并 push_error(带上下文)。
|
||
static func assert_within(value: float, context: String = "") -> bool:
|
||
if value > RED_LINE:
|
||
# 注意:Godot 的 String % 不支持 C 风格 %g(首跑实证:%.3g 直接
|
||
# "String formatting error: unsupported format character")→ 走 NumberFormat.short
|
||
push_error("BigNumber 超红线:%s > 1e14(上下文:%s)" % [NumberFormat.short(value, 3), context])
|
||
return false
|
||
return true
|
||
|
||
|
||
## 科学计数串(报告/日志用;游戏内显示走 NumberFormat.short)
|
||
static func sci(value: float, digits: int = 3) -> String:
|
||
if value == 0.0:
|
||
return "0"
|
||
var sign := "" if value > 0.0 else "-"
|
||
var v := absf(value)
|
||
var exp := int(floor(log(v) / log(10.0)))
|
||
# pow() 返回 Variant(4.x 数学校验函数家族)→ 显式标注;
|
||
# %.*f 为 C 风格动态精度,Godot 不支持 → String.num
|
||
var mant: float = v / pow(10.0, exp)
|
||
return "%s%s e%d" % [sign, String.num(mant, digits), exp]
|