原版碰撞平面数值核:9063次机器码对照
本批继续在 main,未创建 worktree、未提交、未 attach 或改写运行中的原版游戏。按 godot-master 的数据/表现分离,新增的是 CoreSim 数值核与独立验证工具,没有新增假定命中的攻击特效。
本批完成的部分
NativeRayMath移植原版683800的三态平面分类、6838C0的线段/平面交点。- 显式支持 x87 PC=24/53/64 位有效精度,不用一个未经验证的全局默认值替代。
- 保留 x87 的宽指数范围、逐运算舍入、float写回/重载、正负零及必要写回溢出的 Inf/NaN。
- 接上前批的单面穿越门:起终点分类必须不同,且起点不能是分类1。
- 在独立32位进程里执行发行EXE的未修改原始函数机器码,作为独立对照,而不是用另一份重写公式生成预期值。
构造覆盖不变:1053/1419(14成长),319个host/NG+待补、47个基础等级缺口。完整LOS与攻击型proc尚未开放,全武器目标未完成。
独立机器码对照如何运行
源EXE:E:/Torchlight 2/Torchlight2.exe,SHA256: 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。
tools/native_ray_oracle.c 使用已有 i686-w64-mingw32 GCC 编译为32位命令行工具。它仅在自己的进程内:
- 映射原版0x683000代码页、0x2186000常量页及所需临时存储地址。
- 将代码页改为只读可执行、常量页改为只读。
- 每个输入使用 FNINIT/FLDCW 设置指定精度,直接调用683800/6838C0。
- 输出分类、是否相交及三个坐标的原始32位位模式。
没有加载整个游戏、没有注入/attach、没有改游戏文件或默认存档。固定地址映射失败会报错,不偷偷修改被测试机器码。 构建入口:
python -m tools.build_native_ray_oracle
dotnet run --project core_sim.tests原始输入、机器码页hash和原生输出位于 build/native_ray_oracle/;测试直接与发行PE字节核对,避免预期值只来自自身实现。
为什么不能直接用普通 float 或 double
最终共有 3021组输入 × 3种控制字 = 9063次对照,其中 1075组会随精度模式产生不同结果。
测试包含普通空间值、近平面阈值两侧、严格端点、平行段、正负零、极小值、大指数点积,以及有限端点在float临时写回中溢出的情况。 PC=24只控制有效位,不把x87寄存器的指数范围缩成IEEE float;因此每步直接用C# float并不等价。
当前使用有限二进制数的显式尾数/指数和 ties-to-even 舍入表达这些运算。必要内部float溢出可以产生原版的无穷值或masked-invalid indefinite NaN;公开入口拒绝本身非有限的输入。 此处“零差异”是对已执行语料的结果,不扩大为对任意未测试运算/整个Ogre数学库的证明。
原版683800/6838C0的关键顺序
683800按原版运算顺序计算:
d = (plane.z - point.z) * normal.z
+ (plane.y - point.y) * normal.y
+ (plane.x - point.x) * normal.x
d < -eps → 0
d > +eps → 1
否则 → 2eps取自发行EXE的float常量,实值 9.999999747378752e-6,不是无限精度十进制1e-5。
6838C0先求 end-start、法线点积,绝对分母小于eps就不相交;比例t必须在闭区间[0,1]。 最容易漏掉的差异在输出:
- X保留寄存器内的dx和t。
- Y/Z重新读取先前FST到32位内存的t及dy/dz。
- FST不是FSTP:写内存不意味着后续寄存器值已经变成32位。
代码保留了这个不对称。单面调用先检查原版分类门,不把背面或两个近平面分类相同的点自动视为有效命中。
实际线程精度仍不能猜
发行EXE的 _setdefaultprecision(84B38A)调用 _controlfp_s(0,0x10000,0x30000),给出了CRT启动阶段的53位设置。 这不足以证明渲染器初始化后、所有游戏线程仍保持同一控制字;渲染插件也包含浮点模式配置。
所以数值核要求显式 NativeX87Precision 参数。本批没有把“CRT初值”或者渲染配置字符串冒充已经捕获的战斗线程状态;完整运行时接线仍需确认其实际控制字。
验证结果
build/native_ray_oracle_build.log:3021组输入,1075组精度相关。build/native_ray_core.log:9063次原生输出逐位比较,0差异;累计 1147条核心断言通过。- 同机一次对照循环约140ms,包含输入转换与结果比较,不含原生样本生成和首次文件载入;这不是完整场景射线性能承诺。
build/native_ray_python.log:73项原始字节/数据/既有相关检查通过。- Godot C#零warning/error,coresimlint通过。
- 本批没有新世界渲染行为;不复用旧截图宣称闪电链或完整隔墙判定已经实现。
- 默认存档SHA256仍为
9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。
剩余:466E90三角形内部判断、包围盒/候选构造、场景网格和动态物件数据、完整线程精度约束、Line Emitter伤害及技能内部随机。平面核是完整碰撞链的一环,不是全武器完成声明。