Stormclaw 原粒子与通用线发射器端点显示
本批从真实 Stormclaw DAT/LAYOUT 入手,补齐“已解析世界端点 → Godot 光束”的显示消费者。实际 ECHO PASS 已验证两份实例、目标端点移动、旋转/负缩放/非均匀缩放、回收和模拟状态隔离。尚未接通自动武器 proc、原版射线裁剪和完整事件体执行,不将本批称为 Stormclaw 实战闭环。
原始数据与伤害入口
源:MEDIA/SKILLS/ARBITER/WANDCHAOS/WC_STORMCLAWPROC.DAT。
- 首个 EVENT_START:
BERSERKER/STORMCLAW/LIGHTNING.LAYOUT,40% 武器伤害/40% soak、电伤,APPLYEFFECTS=true,NOSTRIKEEFFECTS=true,CENTER → CENTER,启用线发射器与碰撞。 - 首布局包含 Sound、0.3 秒 Timeline、一个 Layout Link Particle;该粒子源有两套 Line/RibbonTrail 技术。
- 第二个 EVENT_START:
LIGHTNINGHIT.LAYOUT。该源布局确实为 COUNT=0,没有粒子,不额外生成假命中特效;它也没有第二次武器伤害比例。 - 原 6CEE60 把 APPLYEFFECTS 写入事件 +283;6CC710 的目标分支随后调用 fireAtUnit、原武器 strike 入口和 6CA640 的后续事件处理。不能用“视觉线段碰到了目标”代替这一套,也不能因第二个 EVENT_START 存在就扣两次血。
LINE_EMITTER_COLLIDES的端点射线裁剪仍是独立语义;新显示模块不执行 Godot 物理查询来冒充原版查询。
导出工具 tools/build_proc_line_visuals.py 保留两个 EVENT_START、原属性、原 orchestration 和源哈希。产物为 torchlight-2-poc/vanilla/proc_line_visuals.json 及 vanilla/effects/PROC_LINE_STORMCLAW_0.tscn。没有重建全部粒子场景或改变默认武器准入。
修复的具体缺口
原 gen_beam_ribbon_shader 把 END POSITION 编译成固定常量;即使运行时知道目标位置,光束也无法改变长度。原 PlayerVisualPresenter 的 line_emitter 分支仅发出 deferred 通知,没有端点显示消费者。
现在:
- 光束 shader 提供
line_enduniform,默认仍为原 authored end,因此未绑定的静态效果保留原几何。 - 导出 emitter ID、宽度、Sine Force 偏移边界,ID 保持字符串,避免 64 位布局 ID 被 Godot JSON 浮点化。
tl2_line_emitter_view.gd接收每个 emitter 的已解析世界 source/target,把差向量转入该光束局部空间;不猜目标、CENTER 骨骼或原版碰撞。- 每个实例复制自己的 ShaderMaterial,防止移动一份效果时带动所有实例;shader 资源仍可共享。
- 动态 AABB 包含实际两端、波动和世界宽度,避免拉长后被旧包围盒裁掉;支持旋转、负缩放及非均匀缩放,奇异矩阵显式拒绝。
- 零长度和端点缺失时用 shader 显示门隐藏,不覆盖 Timeline 对
visible的所有权。多 emitter 的新帧先完整校验再发布,不应用半帧。 PlayerVisualContext.line_endpoint_resolver是可选的已解析端点来源;提供时由 Presenter 驱动绑定,缺失时仍保留显式 deferred 状态。没有把碰撞未实现悄悄降级成直线命中。- 绑定使用弱节点引用,效果销毁后移除;空布局不登记永久逐帧工作。
按 godot-master 保持显示与模拟分离。当前几何测试使用明确的世界坐标夹具,不声称这些坐标已经来自原版骨骼/碰撞规则。
验证与画面
tools/run_proc_line_probe.py 在真实 ECHO PASS 主场景中运行,默认存档不读写。检查端点还原误差 <0.001、材质独占、多实例隔离、动态包围盒、错误帧原子性、零长度门、空布局、释放,以及前后 CoreSim 快照完全一致。
画面:build/proc_line_visual/line_pair.webp、line_moved.webp,短边 512。两份蓝色闪电清晰分开;移动上方端点后,下方实例保持原位置;没有黑色背景块。保留原夜间/雨幕,没有为了测试调亮地图。
局部视觉评分:COMP-SIL-ACTION=2、LIGHT-PART-READ=2、LIGHT-PART-OVER=2、LIGHT-BLOOM-ABUSE=2、MOT-TRAIL-SOUP=2、LIGHT-KEY-FILL=1。11/12(91.7%),无 0 分项。夜景偏暗是本图既有条件;此分数仅评绑定画面的清晰度,不是原版像素/粒子采样/数量/寿命对拍。
仍沿用已有 RibbonTrail 近似:此批没有重做原粒子随机采样、完整 NO EXPIRATION 寿命、波形逐帧细节或原粒子 quota。没有把截图当成这些方面已完成的证据。
最终验证:84 项相关回归通过;真实 ECHO PASS Vulkan 探针通过,错误列表为空,默认存档前后哈希一致。乘色光束的隐藏输出使用中性白而不是黑色,另有生成检查。记录见 build/proc_line_regression.log、build/proc_line_visual/result.json。本批未修改战斗数值核心,不将上一批核心断言数量冒充本批新增验证。
下一步
继续将 Stormclaw 的事件启动、目标已有效果的零 delta 更新、原射线端点、proc 命中/冷却与持久化接入正式战斗事务,再由这些真实输出供给本批端点显示模块。当前仍不开放 TYPE201/其他尚未完成的武器分支。
武器构造覆盖保持 1099 / 1419(273 阻塞、47 数据/等级缺口);这不是实战完成率。
main 原地,未提交;默认存档 SHA256 未变: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。