Proc 的当前武器要求:纠正 source-skill 参数误读
本批核实并修正 proc 身上路径的过滤语义,同时修复后续命中事务无法接受投射物暂存随机流的问题。没有开放尚未完成的攻击型武器,也没有把“过滤通过”计作完整施法。
原版证据
EXE SHA256:186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。
557F10的 +0x5D4(1492)参与装备栏左右手物品比较、攻击描述(装备 +728/+732)选择和CEquipment::get_SOAKSCALEPCT,因此是当前攻击武器,不是 CSkill 指针。548850尾部将该字段传给53D3C0,再到53C7E0的 a7。53CBE0的 ECX 是刚查到的 待触发 proc 技能;EDI 是 a7。依次调用6BE5D0(skill, weapon, true/false)。6BE5D0读取该技能的有效 CSkillProperty,再以武器 +0x1AC 的 UNITTYPE 匹配 REQUIREMENT_RIGHT/LEFT。不是一组全局的“来源技能允许左右手”布尔值。6DBB60/6DBBB0通过 HIE 类型闭包匹配,不能用名称相等替代。
CAN_PROC_FROM_SKILL 是另一道门:读取待触发技能 +0x4C,仅在 skill-strike 标志和相应类型条件下检查。装备 582380 不走身上路径的这两道过滤,保留这种差别。
数据与规则
- 根属性无要求时左右手分别为
[0];LEVEL 属性先继承,再由本级标量/块覆盖。 - 优先读取同名 REQUIREMENT 子块。非空块替换向量;空块保持继承,不能再读同名标量。没有块时才考虑非空标量。
- 单个
[0]是特殊无约束门,直接通过。较长的[0,8]不走这个特判,而要查类型表。 6BE5D0接收空武器指针时使用 NoneTypeId=22;但外层 proc 的空来源指针会直接跳过要求检查,两种情况不能混淆。- 当前 16 个可达原版武器 proc:根和 LEVEL1 均没有标量或块形式的左右手要求,因此两边确实都是
[0]。这一条件对所有可能的来源武器都成立,可在来源尚未观测时证明通过。 - 有约束且来源事实未知时仍报缺失;不以 None、技能 ID 或当前伤害类型补造 UNITTYPE。
实现
NativeProcWeaponRequirements/NativeProcWeaponFilter:向量、单 ANY、None 与 HIE 规则。WeaponProcCatalog.WeaponRequirements:读取原冻结数据、根/LEVEL1 继承和标量/块。当前仍拒绝未验证的 BASEFILE、多等级结构或无法恢复的混合重复属性顺序。ProcEventContext改为SourceWeaponPresent/SourceWeaponUnitType;删除错误的 SourceSkillAllows 字段。ProcAvailability.SourceWeaponRequirementQuery随每个已查到的 proc 定义提供,按原顺序延迟到概率和查找之后、冷却/范围之前。不同 proc 不再共享一个过滤结果。- 装备分支不调用这个 body-only 查询;尚未提供的身上过滤不会被当成默认允许。
暂存随机流接线修复
AdvanceWeaponMissiles 会先推进运动随机数,再把暂存 Mwc 传给 Attack。上一批入口只接受与 SimState.VolatileRng 引用相同的对象,因而会拒绝这条合法调用。
现在单次命中从传入暂存状态继续,成功后提交回该调用者流,不提前改写全局 Volatile。外层仍负责一次性提交包含运动和命中的流。失败保持已暂存的运动部分及实时世界不变;明确传错为全局 Synced 的调用仍拒绝。
这是单次命中的可组合事务修复,不等于整帧多投射物/多接触已成为一笔原子事务。后续跨接触失败/重试及完整技能事件帧仍需组合验证。
按 godot-master 保持数值/状态与显示分离;不读取墙钟,也不让粒子决定 proc 是否触发。
验证
独立执行原 6BE5D0、6DBB60、6DBBB0,125 组输入匹配结果、类型查询次数与空指针映射。HIE 访问在此使用明确的合成层级;另用真实 unittypes.json 检查继承匹配,不冒称该 oracle 执行了完整原 HIE。
回归覆盖不同 proc 的不同要求、门的调用顺序、装备不查询、未知事实拒绝、16 个原版无约束定义,以及暂存随机流的成功/失败/外层提交。Godot 检查同样验证原数据和暂存流入口。
最终验证:2124 条核心断言、457 项相关 Python 回归、Godot 52 项检查通过;C# 构建零警告/零错误,198 个核心/IO 文件静态检查无硬错。旧元素正式场景与四元素 GPU 探针重新运行通过。记录在 build/proc_weapon_requirements_*.log。
仍未完成
真实目标/射线查询、完整 proc 实例启动和事件体、实际光束端点生产者及逐武器实战验收仍待接通。本批只是移除了错误理解导致的前置缺口,没有降低武器准入要求。
构造覆盖仍为 1099 / 1419(273 阻塞、47 数据/等级缺口、0 构造异常);全部武器目标未完成。
main 原地,未提交。默认存档 SHA256 保持: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。