diff --git a/docs/research/2026-08-09-chat-retail-color-table.md b/docs/research/2026-08-09-chat-retail-color-table.md index d5aa8673..fd8f6297 100644 --- a/docs/research/2026-08-09-chat-retail-color-table.md +++ b/docs/research/2026-08-09-chat-retail-color-table.md @@ -326,8 +326,16 @@ There is nothing for acdream to make configurable for retail parity. when the option changes. `ChatInterface::TypeIsActive @0x004F2F10` tests `(1ULL << type) & m_llTextTypeFilter`. Two consequences: -- `UpdateFromPlayerModule` early-returns when `m_eWindowID == 0`, so the - **main window has no user filter** — it keeps the `PostInit` default. +- ~~`UpdateFromPlayerModule` early-returns when `m_eWindowID == 0`, so the + main window has no user filter~~ **CORRECTED 2026-08-10 (CH6a/b review, + `docs/research/2026-08-10-ch6ab-review-findings.md`):** the main chat + window is `m_eWindowID == 8` and the floaties are 2–5; + `m_eWindowID == 0` is the UNAUTHORED constructor default, which is what + that early-return guards. The main window's filter IS user-settable — + `gmChatOptionsUI::InitOptions @0x0049FC60` builds its filter block at + `SetUserData` id 8 (default `0x00000000_FBFFFFFF` @0x0049FDC9, with a + dedicated high-dword Society child @0x0049FEFB, so 0x20 Society is + opt-in on main). - `RecvNotice_DisplayFinalStringInfo` displays when `windowId == m_eWindowID` (explicitly addressed — e.g. command output uses `m_idCurrentCommandSource`) **or** `windowId == 0 && TypeIsActive(type)`