Retail colors chat lines by the 34-value wire LogTextType (ACE's ChatMessageType), NOT by acdream's synthetic 9-value ChatKind. The old ChatWindowController.RetailChatColor(ChatKind) collapsed distinct retail colors onto one bucket per ChatKind — e.g. every Channel line rendered colorLightBlue (Magic's slot) when retail's actual palette spans five different colors across the Turbine rooms and legacy allegiance family. Ports ChatInterface::BuildChatColorLookupTable @0x004F31C0 verbatim (RetailChatColorTable, all 34 RGBA floats read from the PDB-paired binary's .data section) and threads a new ChatEntry.LogTextType field through every ingestion site to the correct retail wire value: HearSpeech/Tell pass the wire chatType through verbatim; Emote/SoulEmote hard-code 0x0C; the Tell self-echo hard-codes 0x04; legacy ChatChannel broadcasts derive their type from the channel bit via the new LegacyChannelChatType helper (ported from the decompiled Handle_Communication__ChannelBroadcast dispatch, hear vs. own-send); TurbineChat rooms map through TurbineChatDisplayNames.LogTextType; CombatChatTranslator's hit/miss/evade lines map to ACE's CombatSelf/ CombatEnemy per Player_Combat.cs; kill/death lines use retail's decompiled 0x00 Default (not a combat color). ChatWindowController's transcript now folds LogTextType through RetailChatColorTable with retail's exact "out-of-range keeps the previous line's color" carry rule; ChatPanel's combat highlighting sources the same table. Corrects HearSpeech.cs's doc-comment ChatType legend (4 of 6 entries were wrong). Adds register row AP-175 for the pre-existing (unchanged) Popup-renders-in-chat divergence and updates AP-39's stale per-ChatKind description. Narrows ISSUES #139 — its chat-colors half is done. Retail renders no chat timestamp prefix path exists in acdream today, so the "timestamp is always colorGrey 0x0C" rule has nothing to attach to; noted here per the research doc rather than left silent. Research: docs/research/2026-08-09-chat-retail-color-table.md Full Release suite: 11,833 passed / 4 skipped / 0 failed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
106 lines
5.2 KiB
Markdown
106 lines
5.2 KiB
Markdown
# Campaign CH — chat & interface-text retail parity
|
||
|
||
**Status:** ACTIVE 2026-08-09 — research lanes running; slices finalize when
|
||
they land.
|
||
|
||
**Why now:** first track of the alpha-release program (chat is the most
|
||
visible daily surface for the friend-alpha). User-directed 2026-08-09.
|
||
|
||
## Scope
|
||
|
||
Four deliverables, one campaign:
|
||
|
||
1. **Exact chat colors.** The 2026-06-16 cdb session pinned the retail
|
||
`RGBAColor` constants (0x81c4a8+), but only 4 of ~13 kinds were mapped
|
||
with confidence; the type→color lookup table
|
||
(`ChatInterface::BuildChatColorLookupTable @ 0x4f31c0`) was never
|
||
decompiled. This campaign pins the COMPLETE table and conforms
|
||
`ChatWindowController.RetailChatColor` to it.
|
||
2. **Working side channels vs local ACE.** Turbine rooms (General / Trade /
|
||
LFG / Roleplay / Society) and the legacy family (/f /a /m /p /v /cv),
|
||
inbound and outbound. The 26-day-old "ACE doesn't run a TurbineChat
|
||
server" claim is under verification — the research lane reads current
|
||
ACE source rather than trusting it.
|
||
3. **Retail's on-screen interface text.** The transient yellow
|
||
top-of-viewport messages (jump-while-airborne being the canonical
|
||
example) that retail does NOT put in the chat window. Routing table
|
||
(on-screen vs chat vs both), presentation (color/duration/fade as far
|
||
as acclient-side data allows — the draw itself lives in keystone.dll),
|
||
and the client-raised local errors.
|
||
4. **Complete `/` and `@` command registry.** Every command the retail
|
||
client parses, audited against `RetailClientCommandCatalog` (the
|
||
2026-07-13 family port is the baseline, not a restart). Missing
|
||
commands implemented; non-retail verbs remain ACE server-passthrough
|
||
per the command ownership rule (2026-07-13).
|
||
|
||
**Out of scope:** retail's secondary/floating chat windows and per-window
|
||
filter masks (post-alpha polish unless a slice lands it for free); chat
|
||
color user-configurability (we ship retail defaults); TurbineChat server
|
||
emulation (ACE-side).
|
||
|
||
## Method
|
||
|
||
Per CLAUDE.md: grep `docs/research/named-retail/` first; cdb only where
|
||
static decomp is insufficient; cross-check ACE + holtburger; conformance
|
||
tests pin every table (colors, routing, command catalog); divergence
|
||
register rows land in the same commits; build + full Release suite green
|
||
per commit.
|
||
|
||
**Model split (user-directed 2026-08-09):** research on Opus; planning by
|
||
the main loop (Fable); implementation slices on Sonnet; every slice gets a
|
||
dual-lens Opus review — retail faithfulness AND architecture — before its
|
||
gate.
|
||
|
||
## Research lanes (all Opus, parallel, read-only)
|
||
|
||
| Lane | Output doc | Question |
|
||
|---|---|---|
|
||
| R1 command registry | `docs/research/2026-08-09-chat-retail-command-registry.md` | Complete retail verb/alias/handler table + acdream audit |
|
||
| R2 interface text | `docs/research/2026-08-09-chat-retail-interface-text.md` | What draws the yellow text, the routing table, client-raised errors |
|
||
| R3 color table | `docs/research/2026-08-09-chat-retail-color-table.md` | Full BuildChatColorLookupTable decompile + wire→type→color trace |
|
||
| R4 side channels | `docs/research/2026-08-09-chat-side-channels-vs-ace.md` | Per-family defect diagnosis vs current ACE source |
|
||
|
||
## Slices (provisional — finalized when research lands)
|
||
|
||
Ordering rationale: colors first (small, immediately visible, zero wire
|
||
risk), then interface text (new presentation subsystem), then side
|
||
channels (wire work, needs the connected gate), then command breadth,
|
||
then closeout. Slices touching shared chat files run serially — one
|
||
implementer per slice against a pinned contract (per
|
||
`feedback_dont_parallelize_coupled_plan_slices`).
|
||
|
||
- **CH1 — exact color table.** Conformance test pins every enum entry to
|
||
its retail RGBA; `RetailChatColor` corrected; register rows for any kind
|
||
we cannot yet receive on the wire.
|
||
- **CH2 — on-screen interface text.** New presentation owner (App layer,
|
||
retained-UI or TextRenderer HUD path per research recommendation);
|
||
routing per retail's table; client-raised local errors ported at their
|
||
retail raise sites; keystone-owned presentation unknowns get register
|
||
rows.
|
||
- **CH3 — side channels.** Fix list from R4; connected two-way gate
|
||
against local ACE (send + receive per family); self-echo semantics per
|
||
`ChatChannelInfo.IsSelfEchoChannel`.
|
||
- **CH4 — command registry completion.** Catalog conformance test pins
|
||
acdream's table against the retail registry enumeration; missing
|
||
commands implemented family-by-family.
|
||
- **CH5 — closeout.** Register sweep, ledger flip, ISSUES updates,
|
||
in-client test script for the user gate.
|
||
|
||
## Gates
|
||
|
||
- Per slice: `dotnet build` green, full Release suite green, conformance
|
||
tests, register rows same-commit, Opus dual review resolved.
|
||
- Campaign: user in-client gate — colors side-by-side vs the retail
|
||
client, each side channel spoken + heard, on-screen text provoked live
|
||
(jump in air), command spot-checks. Test script delivered at CH5.
|
||
|
||
## Ledger
|
||
|
||
| Slice | Commit | Suite | Review | User gate |
|
||
|---|---|---|---|---|
|
||
| R1–R4 research | — | — | — | — |
|
||
| CH1 colors | `06f448fc` | 11,833 passed / 4 skipped / 0 failed | — | pending |
|
||
| CH2 interface text | — | — | — | — |
|
||
| CH3 side channels | — | — | — | — |
|
||
| CH4 commands | — | — | — | — |
|
||
| CH5 closeout | — | — | — | — |
|