re: the kind-0 trigger condition is a point-to-segment proximity test

sub_8226DAF8 past the route-name lookup: it resolves the name through sub_823012D8,
requires the unit record's rec+100 != 0, pulls TWO three-double vectors out of that
record -- rec+32/+40/+48 and rec+64/+72/+80 -- and then makes a virtual call:

    8226DC1C  lwz  r11, 0(r30)     ; the ScriptPhase vptr
    8226DC28  lwz  r11, 60(r11)    ; vtable slot 60
    8226DC30  bcctrl               ; test(phase, A, B, P = the route, f1 = node+16)

Slot 60 resolves to sub_82268068, which no built-in uses, so it is engine-internal.
Its arithmetic leaves no room for interpretation: per-axis fsub, fmul plus two fmadd,
fsqrt, giving |B - A|; reject if that is under 0.1 (the constant is literally 0.1, a
degenerate-segment guard); reject if |P - A| > f1 or |P - B| > f1; then compute
t = (P-A).(B-A) / |B-A|^2 and reject if t < 0.

That is a point-to-segment distance test, and it makes the node's double -- built-in
19's local[24] -- a RADIUS.  So a kind-0 trigger fires when a route point lies within
that radius of the segment between two vectors from the unit's record.

Recorded as unproven: WHAT A and B are.  A previous/current position pair would make
this the standard frame-rate-robust waypoint test, and it would be easy to write that
down -- which is exactly why it is not written down.  rec+64/72/80 and rec+32/40/48
are two positions and nothing here says which.

All artefacts regenerate byte-identical; documentation only.

Still unread: sub_8226DC80, the kind-1 condition, entirely; and slot 60 past the
t < 0 rejection, where a second constant at 0x820B0000+25192 is loaded.
This commit is contained in:
Sylpheed RE agent
2026-08-27 08:08:01 +00:00
parent 5670716566
commit 950db19f1b
2 changed files with 62 additions and 3 deletions

View File

@@ -188,6 +188,22 @@ unknown, what evidence exists, and what the first step would be. Move an item in
`payload+8` (a computed value passed to both testers — waypoint-index shaped,
which is why it is not being called one).
***(2026-08-27) THE KIND-0 TRIGGER CONDITION IS A POINT-TO-SEGMENT PROXIMITY
TEST. [structures/isl-trigger-node](structures/isl-trigger-node.md).**
`sub_8226DAF8` resolves the route name (`sub_823012D8`), requires the unit record's
`rec+100 != 0`, extracts **two 3-double vectors**`rec+32/+40/+48` and
`rec+64/+72/+80` — and makes a VIRTUAL call to **ScriptPhase vtable slot 60 =
`sub_82268068`** (used by no built-in, so engine-internal) with those two vectors,
the route point, and the node's double. Slot 60's arithmetic is unambiguous:
per-axis `fsub`, `fmul` + two `fmadd`, `fsqrt``|BA|`; **reject if `|BA| < 0.1`**
(degenerate); **reject if `|PA| > f1` or `|PB| > f1`**; then
**`t = (PA)·(BA) / |BA|²`, reject if `t < 0`**. So it is a point-to-segment
distance test and **the node's double (`local[24]`) is a RADIUS**. 🟡 **What A and
B are is NOT established** — a previous/current position pair would make this the
standard frame-rate-robust waypoint test, which is exactly the tidy reading this
corpus insists on proving. 🟡 Still unread: `sub_8226DC80` (kind 1) entirely, and
slot 60 past the `t < 0` rejection.
## ✅✅ SOLVED — the mission freeze was a modal sign-in dialog (2026-08-26)
`XamShowSigninUI` opens a modal dialog and `xeXamDispatchDialog` blocks the