Update 2.37
6/7/2026
Monster AI Editor: a PROVEN "If HP below X%" condition (IDA+corpus) + 222 named property fields (end of "campo 0xNN"). Halyson said to use IDA and guessed "it must be a config file where the line = a number" — both spot on. RE in `FFX_recon.i64`: the ATEL native dispatch = `handler = (FuncspaceTables[funcId>>12] + 16(funcId&0xFFF))` (slot +0 CALLPOPA / +12 CALL); `readChrProperty` (0x700F) = `0x7A4D70` → a `field→property` switch (`sub_7B2DD0`). Cross-referenced with FFXDataParser/ScriptConstants.putBattleActorProperty (the "config" the owner intuited) + the corpus: field 0x00 = HP (stat_hp, the corpus' most-read property — 306×), 0x02 = maxHP (137×), 0x119 = NearDeath (= IDA case 281 `current<max/2`). Arithmetic opcodes proven (` 0x16` etc.). #11 REAL shipped: a guarded snippet "If HP below X% → force command" = the `HP100 < maxHPX` idiom (corpus-proven fields 0/2) — the real boss-enrage, no longer a guess (the earlier v2.35.0 version was generic because the HP field wasn't proven; now it is). Naming: new `FfxLib/Ai/AiChrPropertyNames.cs` (222 named fields, same public provenance as the codec's func-name table) wired into the buff/stat detector → status actions now show "Haste/Protect/StatusPoison/HP/maxHP…" instead of "campo 0xNN". Gate `--ai2`: HP%-enrage 346/346 + conditional 346/346; `--ai3` PASS. Docs: `docs/reverse/FFX_AI_NATIVE_DISPATCH_AND_CHRPROPERTY_FIELDMAP_2026-06-07.md` (+ rename-queue for the `.i64`). Honest: structure proven offline, in-game effect = RT2; the 0xDA/218=HP%×256 gauge exists in IDA but the corpus doesn't use it (I used the path the AI actually uses, 0/2). Editor build red due to the Sphere Grid lane's WIP (unrelated); all my files are FfxLib, gate-validated.
Read notes