docs: CT-B3 dropped by user direction — no chat word filtering

"I do not want any censoring." Recording it as a KNOWING divergence (register
row CT-2) rather than leaving it as an implicit gap, because retail does filter
and someone reading the code later would otherwise read our silence as an
oversight.

The option itself stays: FilterLanguage still stores and ships its bit to the
server exactly as retail does, so anything the SERVER gates on it behaves
normally. What acdream does not do is substitute words in the transcript.

The attempt before the decision is kept in the plan, since it establishes two
things that would otherwise be rediscovered:

  - The taboo table's dat id is not readable from the decomp —
    TabooTableAdaptor::CheckCensorsW @0x00682A30 reaches it through
    DBObj::GetByEnum with the arguments elided by Binary Ninja. Measured the
    portal master enum map (0x25000000) instead: 22 categories, with category 3
    (0x0E010001 / 0x0E010002) and single-entry categories 8 and 11 as the
    plausible candidates.
  - Chorizite.DatReaderWriter declares a TabooTable DBObj type but does not
    decode it: only DBObjType and HeaderFlags. The format would need decoding
    here first.

Also sharpened CT-B4's status to research-blocked — the chat log file's path
and rotation are not in the decomp either.

Group B therefore ships B1 and B2 and is complete as scoped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-21 08:14:02 +02:00
parent e62aaebda0
commit 2f97052e4f
2 changed files with 27 additions and 5 deletions

View file

@ -95,12 +95,33 @@ Nothing is user-visible until A4.
input to `@tell {LastTeller}, ` on the space keypress
(`HandleTextReplacements @0x004F50D0`). The commands already work; the
visible expansion does not exist.
- **CT-B3** `FilterLanguage`: retail runs chat text through a taboo table and
substitutes (`PlayerModule::FilterLanguage` + `TabooTableAdaptor::
CheckCensorsW` inside `AddTextToScroll`). We store the option, ship the bit,
show it in Options — and never filter. A decorative toggle.
- **CT-B3** ~~`FilterLanguage` word filtering~~ — **DROPPED by user direction
(2026-08-21): "I do not want any censoring."** acdream keeps the option
itself, which still stores and ships its bit to the server exactly as retail
does, but performs no client-side substitution. Registered as CT-2 rather
than left as an implicit gap, since it IS a knowing departure from retail
(`PlayerModule::FilterLanguage` + `TabooTableAdaptor::CheckCensorsW
@0x00682A30` inside `AddTextToScroll`).
Worth keeping on record, because the attempt established two things that
would otherwise be rediscovered if this is ever revisited:
1. The table's dat id is not readable from the decomp — `CheckCensorsW`
reaches it through `DBObj::GetByEnum` with the arguments elided by Binary
Ninja. The portal master enum map (`0x25000000`) has 22 categories, with
category 3 (`0x0E010001`, `0x0E010002`) and the single-entry categories 8
and 11 the plausible candidates.
2. Chorizite.DatReaderWriter declares a `TabooTable` type but does NOT decode
it — only `DBObjType` and `HeaderFlags`. The format would have to be
decoded here first.
And the matching is an algorithm, not a word list:
`TabooTable::CreateCheckString @0x00681570` normalises a candidate before
`StringMatchesFilter @0x00681600` compares it, which is how retail catches
obfuscated spellings.
- **CT-B4** The plain-text session chat log (`ClientSystem::s_pLogFile`). We
write none. Path and rotation are UNKNOWN — needs research or a live check.
write none. **Research-blocked**: path and rotation are UNKNOWN and are not
in the decomp — needs a live check or a dat/filesystem probe.
### Group C — chat GUI