re: the seven chatter fields, read off sub_82213980
The one function referencing all seven field-name strings is the rule table's loader. Interval / IntervalFluctuation / EffectiveTime are SECONDS, emitted as *60 frame counts; Probability is a percentage and zero skips the record; Pattern is a 4-arm enum of which only Sound and Window ship; the Yes/No pair element is a u32 bitmask, which is why MessageCount is clamped to 32 (max on disc is 26). 40-byte object layout recorded. 13 dead records characterised. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
@@ -4142,3 +4142,60 @@ smaller claim than the one it replaces.
|
||||
|
||||
❔ Still open from the entry above: what the seven numeric fields mean, the
|
||||
`Yes`/`No` pair element, and which speakers are wingmen.
|
||||
|
||||
---
|
||||
|
||||
## ✅ 2026-08-27 — the seven chatter fields, read off the engine's loader
|
||||
|
||||
Continues the two entries above. `sub_82213980` is the **only** function in the
|
||||
executable that references any of the seven field-name strings — they sit
|
||||
contiguously at `0x820A5794`…`0x820A5800`, and all seven xrefs land in it. It is
|
||||
the rule table's loader: it walks records with `sub_82448AA0` /`sub_824482D0` /
|
||||
`sub_82448BC8` and builds a **40-byte** object per event.
|
||||
|
||||
**Docs checked:** `preset-message-rules.md` (mine), `movie-subtitles.md` (its
|
||||
"Pattern" is a *filename*-pattern table heading — unrelated),
|
||||
`mission-phase-deployment.md` (owns the radio **delivery category**
|
||||
`None`/`Emergency`/`Killed`/`Noise` in `ScriptMessage_S02_msg.tbl` — a different
|
||||
table on a different axis; `Killed` sits at `0x820A5784`, immediately before this
|
||||
string block, which is precisely the adjacency that invites conflating them).
|
||||
|
||||
✅ **The three time fields are SECONDS at 60 Hz.** The loader emits
|
||||
`mulli rN, rN, 60` for `Interval`, `IntervalFluctuation` and `EffectiveTime`, and
|
||||
for nothing else. Disc values are all small ints (`{0,3,5,10}`, `{0,3,4,5,30,120}`,
|
||||
`{0,2}`), so seconds is the only reading that survives — `120` s = two minutes.
|
||||
|
||||
✅ **`Pattern` is a delivery channel with two dead arms.** `strcmp` against
|
||||
`"Log"` → 2, `"Window"` → 3, `"Demo"` → 4, default **1**. The disc says only
|
||||
`Sound` (8 395, → default 1) and `Window` (821, → 3): **`Log` and `Demo` exist in
|
||||
code and in no data**.
|
||||
|
||||
✅ **The `Yes`/`No` element is a 32-bit mask — and that explains the clamp.** Two
|
||||
passes over the positional payload: `sub_82448BC8(rec, 2·i)` takes the even slots
|
||||
(message ids), `sub_82448BC8(rec, 2·i+1)` the odd, `strcmp`s each against `"Yes"`
|
||||
(`0x820A57A4`) and sets `1 << i` in a `u32` at `[obj+32]`. The loader clamps
|
||||
`MessageCount` to **32** — the same constant as the mask width. **The data
|
||||
agrees:** max `MessageCount` on disc is **26**, nothing exceeds the clamp, and no
|
||||
record's `Yes` count exceeds its own `MessageCount`. This re-derives the pair
|
||||
layout from the *executable* side, independently of the
|
||||
`MessageCount · 2 == positional count` identity it was first inferred from.
|
||||
|
||||
✅ **`Probability` is a gate, not just a weight.** Read as a sign-extended byte;
|
||||
**zero skips the record before the object is allocated**. Values are percentages
|
||||
(`1,2,3,5,10,20,25,30,40,50,60,100`).
|
||||
|
||||
Object layout: `+16` Probability u8, `+17` Priority u8, `+18` Pattern u8,
|
||||
`+20` Interval·60, `+24` IntervalFluctuation·60, `+28` EffectiveTime·60,
|
||||
`+32` the Yes mask, `+36` zero.
|
||||
|
||||
**Residual, characterised.** Cross-tab of `MessageCount == 0` against
|
||||
`Probability == 0` over all 9 216 records: 6 786 zero on both, 2 417 set on both,
|
||||
**11** with a `Probability` but no lines, **2** with lines and `Probability 0` —
|
||||
those two ship dialogue the loader can never reach. Thirteen dead records.
|
||||
|
||||
❔ **Not settled: the policy.** The loader gives units and storage, not
|
||||
behaviour. `Priority`'s comparison rule, whether `Interval` is a cooldown per
|
||||
event or per speaker, and what `IntervalFluctuation` randomises against all live
|
||||
in the *consumer* of the 40-byte object, which this iteration did not read.
|
||||
`Pattern`'s `Window` is named, not measured. Also still open from the earlier
|
||||
entries: which of the 49 speakers are wingmen.
|
||||
|
||||
Reference in New Issue
Block a user