FROM TARGET 查询变换与角色结果选择
本批接通原版 FROM TARGET 的查询矩阵/局部坐标计算,并组合到 SimProcQueryWorld。保留实际场景的完整性保护,不声称 Stormclaw 已在正式地图自动施放。
原版控制流
53C7E0/582380先取原攻击者 Matrix4,调用683590构造随机 Y 旋转矩阵,做 R × casterMatrix。- 随后
setTrans到 other(原目标)的位置;不是在攻击者位置旋转,也不是 casterMatrix × R。 5FC670对整个查询矩阵求逆,把候选世界坐标变到局部空间,之后清零局部 Y,再计算距离和角度。- 角度由 FPATAN 得到并乘 float 常量
57.295826f。不能提前用 double 结果替代原扩展精度中间值。 - FROM TARGET 向查询传的最小距离是 0,不是技能 RANGEMIN。
- 原查询填充角色/对象两张结果表;
53D109..53D121只从第一张角色表选取随机目标,第二张表不混入抽签。 - 原目标的 targetable 被临时抑制;适配器用查询上下文表达该排除,不直接改实时角色字段。
证据:build/research_weapon_families/0053c7e0.asm、00582380.asm、005fc670.asm、00683590.asm。原 EXE SHA256 为 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e;OgreMain.dll 为 974c1dc77ea2818276cc7eb94a8b95b2ccf8595e28fa3f14b2cd6d516fdb67a1。
实现与精度
NativeProcConeGeometry.cs 复用既有 Ogre 运算顺序的乘法、逆矩阵和向量变换。输入保留完整 Matrix4,输出独立数组,不将矩阵分解后重建,也不把 Room Piece 的“先减 origin 再逆线性部分”直接套到这里。
最初使用 Math.Atan2 时,192 例中有 50 例与原结果末位不同(最大差约 2.84e-14 度)。现用 384-bit 定点反正切与象限处理,在原 FPATAN 的扩展精度边界舍入,再按选定 x87 精度乘原 float 系数。未通过放宽误差阈值消除差异。
原 FCOS/FSIN 的矩阵写入先落 float;目前采用对应的 sin/cos float 结果,在本批原代码对照中一致。验证覆盖目标二进制和测试宿主,不是对全部浮点输入或所有 CPU 的数学证明。
完整矩阵/坐标与导出标量覆盖 PC24、PC53、PC64。实际查询接口传输 double,不能保留 PC64 的全部角度位,所以 NativeProcConeSpace 对 PC64 的谓词调用仍显式拒绝;正常 FROM TARGET 适配路径用 PC53。
查询接线
NativeProcConeSpace负责局部几何,原空间提供者仍负责实际位置、完整对象表、标志及原 LOS 结果。SimProcQueryWorld.FromTargetCharacters组合矩阵、原目标位置、原攻击者排除、原目标抑制、阵营与技能过滤,然后仅返回角色结果。- 它仍执行完整两表查询;没有通过跳过对象处理或把 ObjectsComplete 设为 true 来绕过缺口。
- 缺少原角色完整性、对象完整性、激活状态或 LOS 时仍拒绝。现有正式场景没有被擅自标成 UniverseComplete。
- resolvedSkillOwner 仍要求调用者提供已解析的 6BFD40 结果,不从文件名或当前目标猜测。
遵循 godot-master 的模拟/显示分离:查询几何没有 RNG、墙钟、Godot 物理近似或可视节点副作用。
验证
独立执行原 683590、Ogre 矩阵/向量运算、Vector3 length 和 FPATAN 序列。203 组输入 × 3 种精度,共 609 例,对照矩阵、逆矩阵、局部点及导出距离/角度位模式。包含非均匀/负缩放、倾斜基、轴线、极小/极大坐标。
组合夹具验证:角色与可破坏物同时命中时仅角色可被选取;对象查询仍执行;原目标 targetable 不变;RANGEMIN 不错误扩大查询;完整性保护和 PC64 边界仍生效。夹具的完整列表是明确输入,不是实际地图的完整性证明。
Godot 边界检查接收 Vector3、验证完整逆变换后的局部坐标,并确认游戏快照和 RNG 不变。最终验证:2133 条核心断言、459 项相关 Python 回归、Godot 54 项检查通过;C# 构建零警告/零错误,199 个核心/IO 文件静态检查无硬错。旧元素正式场景与四元素 GPU 探针在刷新缓存后重新运行通过。结果见 build/proc_cone_*.log。
首次旧场景回归因 UID 缓存未解析主场景而未启动,不能计作通过。检查确认主场景文件存在后执行了 headless editor 导入刷新;项目设置文件哈希未变。现有 honoredpath/echopass 重复 UID 警告未在本批擅自修改,刷新后重新运行场景探针。
原版运行时检查情况
按 tl2-runtime-console/computer-use 流程,只读检查了进程和窗口。检查时原版进程处于加载标题,未取得可操作 HUD;之后发现两个新的原版进程,但没有擅自选择会话。没有 attach、重启、终止、发按键或执行游戏 Console 命令,也没有读取不确定会话的内存。此分支暂停不影响静态代码工作,不将加载标题诊断为游戏故障。
仍需完成
实际地图完整角色/对象/碰撞上下文的生产与绑定、正式 proc 实例与事件体、真实端点输出、整帧多接触事务及逐武器验收仍未完成。
构造覆盖保持 1099 / 1419(273 阻塞、47 数据/等级缺口、0 构造异常);不是实战完成率。main 原地、未提交。默认存档 SHA256 未变: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。