FROM TARGET 查询变换与角色结果选择

本批接通原版 FROM TARGET 的查询矩阵/局部坐标计算,并组合到 SimProcQueryWorld。保留实际场景的完整性保护,不声称 Stormclaw 已在正式地图自动施放

原版控制流

  • 53C7E0582380 先取原攻击者 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.asm00582380.asm005fc670.asm00683590.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