场景目标标志、原版激活判定与 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 +404 | ALWAYSACTIVE,DAT 缺省 false |
| 56D380 +392 | TARGETABLE,DAT 缺省 true |
| 56D380 +2004 | LEVELLIGHTING;555500 先初始化 false |
| 56D380 +2102 | BOSS_CHAMPION,缺省 false |
| 56D380 +1860 | BRAVERY,缺省1.0,供退却保护使用 |
| 540140 | 根据距离、强制条件、技能与玩家集合更新 +406 等活动标志 |
| 604D20 +3623 | RULES 的 UNIT_LIGHT_FADE,构造缺省true |
| 604D20 +260 | ACTIVERANGEMOD,缺省0 |
需区分多继承 vtable:CCharacter/CMonster 的主 CBaseUnit 表是带 _1 后缀的那一张。另一张表的同偏移可能是 iMissile 等接口,不能按符号第一个命中取函数。 540140 开头旧名“hasChargeBar”的调用实际指向 6A4650 literal false,不能凭旧函数名给激活条件加一个职业分支。
激活范围由什么选择
原版不是根据“城镇/野外”地图名字选择,而是:
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.log:1127 条核心断言通过,含激活边界、字段未知值、目标资格、无敌 policy 与 v28 重放。build/native_scene_python.log:65 项相关来源/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;全武器目标未完成。