场景目标标志、原版激活判定与 v28

继续在 main,未创建 worktree、未提交、未 attach 原版游戏。按 godot-master 的状态/表现分离原则,场景报告标志,CoreSim 保存并作判断;不把 Godot 节点直接当作原版 CCharacter 状态。

本批落地

  • 原版怪物 F2 数据增加 TARGETABLE、ALWAYSACTIVE、LEVELLIGHTING、BOSS_CHAMPION、BRAVERY;1142 个定义的普通/冠军两形态共 2284 条全部重建,逐字段保留出处。
  • Godot 已绑定战斗单位的 visible、逻辑 enabled、targetable、INVINCIBLE 覆盖及已核实的 AI 状态进入 CoreSim。
  • 隐藏、禁用与不可选单位不再漏进普通攻击、武器技能/弹丸的候选集合。
  • 移除“所有 invincible 单位都不许选中”的错误简化;场景明确的无敌覆盖同步到核心 HP policy,避免画面标志与扣血规则分家。
  • v28 新增可保存的 SceneQuery。未完整计算的 Active 仍为 null;未知脚本状态也保留 null,不能假装为 idle/active。
  • NativeUnitActivation.Evaluate 实现原版 active/near/AI LOD 数值核;另导出各地图真正使用的范围选择标志和修正值。完整实时激活生产方仍待补齐。

本批没有开放新的攻击型 proc。构造统计保持 1053/1419(14 成长),319 个 host/NG+ 待补、47 个基础等级缺口。目标查询的完整单位列表、遮挡和技能执行尚未完成。

原版证据

只读库 E:/Torchlight 2/Torchlight2.exe.i64;EXE SHA256: 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。 新 C/ASM 及字段引用保存在 build/research_weapon_families/

地址/字段确认内容
624FA0 +105/+106基对象构造时 visible/enabled 均为0,不是“所有对象天然true”
464D20查询用的 vtable+52 读取 +106
514160 +406基单位构造时激活标志为0
515F90 +404ALWAYSACTIVE,DAT 缺省 false
56D380 +392TARGETABLE,DAT 缺省 true
56D380 +2004LEVELLIGHTING;555500 先初始化 false
56D380 +2102BOSS_CHAMPION,缺省 false
56D380 +1860BRAVERY,缺省1.0,供退却保护使用
540140根据距离、强制条件、技能与玩家集合更新 +406 等活动标志
604D20 +3623RULES 的 UNIT_LIGHT_FADE,构造缺省true
604D20 +260ACTIVERANGEMOD,缺省0

需区分多继承 vtable:CCharacter/CMonster 的主 CBaseUnit 表是带 _1 后缀的那一张。另一张表的同偏移可能是 iMissile 等接口,不能按符号第一个命中取函数。 540140 开头旧名“hasChargeBar”的调用实际指向 6A4650 literal false,不能凭旧函数名给激活条件加一个职业分支。

激活范围由什么选择

原版不是根据“城镇/野外”地图名字选择,而是:

text
UNIT_LIGHT_FADE=true  → INDOOR_UNIT_ACTIVE_RANGE
UNIT_LIGHT_FADE=false → OUTDOOR_UNIT_ACTIVE_RANGE
LEVELLIGHTING=true    → TRIGGER_NEAR_RANGE - 8
有效范围 = f32((1 + (SIGHT_BONUS + ACTIVERANGEMOD) × f32(0.01)) × 基础范围)

实际原版 GLOBALS:UNIT_NEAR_RANGE=28、TRIGGER_NEAR_RANGE=48、INDOOR_UNIT_ACTIVE_RANGE=16、OUTDOOR_UNIT_ACTIVE_RANGE=20。 641160 的 getter 缺省分别为24、40、16、24,缺省值和当前 DAT 实值不能混用。 状态6不取 SIGHT_BONUS/关卡修正;状态5也不叠加关卡修正,但其普通强制激活分支通常已成立。 ACTIVERANGEMOD 不是 EASY/HARD_MONSTER_ATTENTION_BONUS,不要拿难度仇恨加成顶替它。

tools/build_native_scene_inputs.py 从现有环境目标注册表逐图读取原版 RULES,生成 vanilla/native_scene_inputs.json,保存规则和 GLOBALS 的 SHA256。 ECHO PASS、ACT1 TOWN 的 UNIT_LIGHT_FADE=false;CLOCKWORK boss 房为 true。该文件是冻结输入,不等于所有运行时激活依赖已经接完。

激活数值核的其余边界

  • Player、ALWAYSACTIVE、BOSS_CHAMPION、Boss 类型268、活跃 master、特定 native state 可强制 active,通常排除状态6。
  • 活动技能/技能管理器活动成员还能强制 active;最终 ALWAYSACTIVE 的 OR 不能丢。
  • Monster Turret 类型244仅将初始主观察距离减半;额外玩家逐个参与最近距离比较。
  • active 与 near 不是同一标志;near 通常用28,LEVELLIGHTING 的主观察阶段用48。
  • 数值核保留“跳过主观察阶段”的分支和 master 为玩家时 AI LOD=0 的覆盖;渲染、网络 ownership handoff、地面 bucket 副作用没有伪装为已实现。
  • AI LOD 阈值为10/15/20/25;有 attention 时按原版 distance/(attention×0.01) 计算,不改成看起来更合理的 1+attention。

场景标志的真实接线

tl2_monster_combat.gd 的目标枚举调用共享同步入口。AI tick 只在标志变化时同步,避免每帧反复跨语言取全部单位状态;真正选目标时仍刷新 HP 相关资格,避免“flags没变就永远可选”。

观察的是现有 Godot 场景与 LAYOUT 运行时元数据,不以构造默认值生成最终 visible/enabled。 显式 invincible 元数据才覆盖核心 policy;没有场景覆盖时保留已有核心值。

已核实的状态映射:AIIdle=2、AIHunt=4、AIAttack=3、AICastSkill=13、死亡阶段5/6;脚本跳跃为16(5B1E40 case16 → 5B1330,后者包含 JUMP_LAND)。 其他动画控制器状态不按 idle 猜测,返回未知;完整脚本状态机仍在剩余清单内。

高 HP 的 invincible 单位仍可选;floor(HP)≤1 的 invincible 单位被普通候选门排除。后者来自原版退却/保护判断,不是把无敌等同不可选。 Flee 状态还需要 AI flag3 等输入;当前 Godot AI 未完整提供,不能无条件批准。

SceneQuery 保存 enabled、visible、targetable、可选 native state、可选 active;INVINCIBLE 在已有 ResourcePolicy 中保存。 旧版缺 SceneQuery 时保持未知。恢复拒绝无效 native state;有观测记录的致命伤会进入状态5。 本批观察器只覆盖已绑定的战斗单位,不声称已经重建原版完整字符/物件列表或全部节点生命周期。

闪电链的伤害落点调查

6CC710 收集 Line Emitter 包装器;6CD980 更新其端点与碰撞相关状态。 6CAFE0/6CB1B0 等回调进入事件效果与 6C9CC0 的伤害路径。原版粒子布局包含 Line/RibbonTrail 与发射参数,骨骼端点、回调时间和技能随机流都参与后续接线。

因此不能用“一次播放光束 + 立刻攻击选中目标一次”来冒充原版闪电链。本批未启用这一简化,也未宣称其完整执行已经完成。

验证

  • build/native_scene_core.log1127 条核心断言通过,含激活边界、字段未知值、目标资格、无敌 policy 与 v28 重放。
  • build/native_scene_python.log65 项相关来源/F2/既有回归通过。
  • Godot C# 零 warning/error;coresimlint 通过。
  • build/scene_query_world/result.json:真实 ECHO PASS 单位的场景隐藏/禁用/targetable、无敌高低 HP、解除无敌、跳跃状态和存档重放通过;直接伤害确认无敌时HP保底1,离场观察清理也通过。
  • 该世界探针使用与 LAYOUT 消费者相同的元数据键隔离测试,不冒称它重新覆盖了全部 LAYOUT 输入图。
  • 击杀回血 recovery_proc 与多武器近战 melee 主场景回归均通过,见对应 build/*_world/result.json
  • 查看了 scene_flags 的512短边 WebP:角色及 HUD 正常出图,未新增全屏遮挡;画面不能证明所有原版像素/动画完全等价。
  • 默认存档 SHA256 仍为 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f

剩余:完整激活条件的实时生产方、原版列表顺序/注册生命周期、遮挡/骨骼空间、Line Emitter 伤害回调和技能内部随机。继续这些后才能开放攻击型 proc;全武器目标未完成