docs: settings-track handoff — retail four-tab Options panel campaign (fresh session)
Transcribes the user's four retail screenshots, inventories the existing plumbing (CH3 option wire, CH6 UI machinery, the F11 surface), the research questions, and the binding process lessons from Campaign CH. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
5f2a7d7898
commit
6b45dd8ffc
1 changed files with 180 additions and 0 deletions
180
docs/research/2026-08-10-settings-track-handoff.md
Normal file
180
docs/research/2026-08-10-settings-track-handoff.md
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
# Settings track handoff — retail Options panel campaign (fresh session)
|
||||
|
||||
Written 2026-08-10 at the close of Campaign CH (chat parity, CLOSED
|
||||
USER-ACCEPTED the same day). The user pivoted the alpha program's settings
|
||||
track: the target is **retail's four-tab Options panel**, not merely a
|
||||
status-bar button over the existing F11 panel. The user supplied four
|
||||
retail screenshots (transcribed below — the fresh session cannot see
|
||||
them). Deep research REQUIRED before implementation, campaign-style.
|
||||
|
||||
## What the user showed (retail screenshots, transcribed)
|
||||
|
||||
The options button opens a tall panel with four tabs:
|
||||
**Gameplay Options | Character | Chat | Config**, with Apply / Reset /
|
||||
Defaults buttons at the bottom of (at least) the Character tab. Options
|
||||
render as LED-style dots (lit green = on) beside labels, grouped under
|
||||
gold section headers, with a scrollbar.
|
||||
|
||||
### Tab 1 — "Gameplay Options" (button list, no LEDs)
|
||||
- Exit to Character Selection
|
||||
- Exit Game
|
||||
- Configure Keyboard
|
||||
- Use Mouse Turning Settings
|
||||
- In-Game Help Files
|
||||
- Urgent Assistance
|
||||
- Report Abuse
|
||||
|
||||
### Tab 2 — "Character" (scrolling LED option list; three screenshots)
|
||||
**User Interface Behavior:** Keep Combat Targets in View · Salvage
|
||||
Multiple Materials at Once · Use Main Pack as Default for Picking Up
|
||||
Items.
|
||||
**User Interface Display:** Vivid Targeting Indicator · Display 3D
|
||||
Tooltips · Show Coordinates By the Radar · Side By Side Vitals · Display
|
||||
Spell Durations · Disable Most Weather Effects · Disable Distance Fog ·
|
||||
Always Daylight Outdoors · Disable House Restriction Effects · Use
|
||||
Crafting Chance of Success Dialog · Confirm Use of Rare Gems · Display
|
||||
Timestamps · Filter Language · Show Your Helm or Head Gear · Show Your
|
||||
Cloak.
|
||||
**Grouping:** Ignore Allegiance Requests · Ignore Fellowship Requests ·
|
||||
Show Allegiance Logons · Share Fellowship Experience and Luminance ·
|
||||
Share Fellowship Loot · Automatically Accept Fellowship Requests.
|
||||
**Other Players:** Accept Corpse Looting Permissions · Attempt to
|
||||
Deceive Other Players · Let Other Players Give You Items · Ignore All
|
||||
Trade Requests · Drag Item to Player Opens Trade · Allow Others to See
|
||||
Your Date of Birth · ...Your Age · ...Your Chess Rank · ...Your Fishing
|
||||
Skill · ...Your Number of Deaths · ...Your Number of Titles.
|
||||
**Character Behavior:** Run as Default Movement · Advanced Combat
|
||||
Interface · Auto Target · Automatically Repeat Attacks · Use Charge
|
||||
Attack · Lead Missile Targets · Use Fast Missiles.
|
||||
**Chat:** Stay in Chat Mode After Sending a Message · Listen to
|
||||
Allegiance Chat · Listen to General Chat · Listen to Trade Chat · Listen
|
||||
to LFG Chat · Listen to Roleplay Chat · Listen to Society Chat · Listen
|
||||
to PK death messages.
|
||||
|
||||
### Tabs 3+4 — "Chat" and "Config"
|
||||
Not screenshotted. Research must derive their contents (Chat tab is
|
||||
plausibly the per-window text-type filter blocks + opacity the CH
|
||||
research already located in `gmChatOptionsUI`; Config is unknown —
|
||||
plausibly video/audio/mouse).
|
||||
|
||||
## What already exists (do NOT re-derive)
|
||||
|
||||
- **The chat digest** (`claude-memory/project_chat_digest.md`) — START
|
||||
THERE. Campaign CH built most of the plumbing this campaign needs.
|
||||
- **Wire, already working:** `SetSingleCharacterOption (0x0005)` codec +
|
||||
the six Hear-chat toggles (CH3); `RuntimeCharacterOptionsState`
|
||||
(Options1/Options2 words, `SetOptionBit`, seeded from every
|
||||
PlayerDescription); the membership-gate consumption of those bits.
|
||||
ACE's `CharacterOption.cs` maps option id → bit; `CharacterOptions1.Default
|
||||
= 0x50C4A54A` (verified; the register once carried a phantom mismatch —
|
||||
see `docs/research/2026-08-09-chat-side-channels-vs-ace.md` corrections).
|
||||
- **Wire, known-missing:** the full-blob `SetCharacterOptions (0x01A1)`
|
||||
builder was DELETED at CH3 (the old one was malformed:
|
||||
`CharacterOptionDataFlag.CharacterOptions2 = 0x40` collides with
|
||||
`CharacterOptions1.AllowGive`; ACE's real layout is in
|
||||
`GameActionSetCharacterOptions.cs`). Retail's Apply button presumably
|
||||
sends the blob — the REAL builder must be ported. The per-window
|
||||
GameplayOptions blob (`0x1000008C`, elements `0x1000008B`) is stored by
|
||||
ACE as an opaque byte[] it never parses — acdream owns that format
|
||||
(research: `2026-08-09-chat-retail-window-shell.md` §4).
|
||||
- **Decomp beachheads:** `gmChatOptionsUI::InitOptions @0x0049FC60` (the
|
||||
five per-window filter blocks, SetUserData ids 8/2/3/4/5, defaults);
|
||||
opacity options `0x10000080/0x10000081` (`ChatInterface::SetOpacity
|
||||
@0x004F3120` family — implemented in CH6c); `PlayerModule` option
|
||||
accessors (`InqChatWindowOption 0x1000007F`, `SetHearGeneralChat
|
||||
@0x005D35C0` writes options2 locally THEN notifies — the local-write
|
||||
pattern CH3/CH4 ported). The options panel class family
|
||||
(gmOptionsUI? gmGameplayOptionsUI? the tab host) is UNEXPLORED.
|
||||
- **UI machinery, fully proven by CH6:** LayoutDesc import (incl.
|
||||
Resizebar grips, buttons, scrollbars, outline properties 0x21/0x22),
|
||||
`RetailWindowManager`/`UiRoot`, fixture generation
|
||||
(`RetailLayoutFixtureGenerator` — add layouts, commit fixtures, pin
|
||||
conformance), the retained-controller pattern
|
||||
(`ChatWindowController`/`FloatingChatWindowController` are the
|
||||
templates), the settings persistence seams
|
||||
(`RuntimeSettingsController`/`RuntimeSettingsTargets`, J4.4
|
||||
generation-gated command path).
|
||||
- **The F11 panel** (`SettingsPanel`, UI.Abstractions) — the NON-retail
|
||||
developer/client surface: audio sliders, quality presets, keybind
|
||||
rebinding (modal capture), chat opacity sliders (CH6c), Hear-chat
|
||||
toggles (CH3). The user's original ask ("client settings, different
|
||||
from retail") coexists with the retail panel — how they split (retail
|
||||
panel = retail options; Config tab or F11 = acdream client settings?)
|
||||
is a DESIGN DECISION for the plan, made by Claude, reactable at the
|
||||
gate.
|
||||
- **Keybinds:** `KeyBindings.RetailDefaults()` (the ONLY production
|
||||
table — `AcdreamCurrentDefaults()` is dead; #358's lesson),
|
||||
`InputDispatcher` modal capture, the F11 rebind UX. Retail's
|
||||
"Configure Keyboard" screen is unexplored decomp territory.
|
||||
- **Status bar:** the retail toolbar exists (`RetailUiRuntime` mounts
|
||||
it); the options BUTTON on it (which authored element, what it opens)
|
||||
is unexplored.
|
||||
|
||||
## Research questions for the campaign's Opus lanes
|
||||
|
||||
1. **Panel structure:** which LayoutDesc(s) author the Options panel
|
||||
(tab host + four tab pages)? The class family in the decomp
|
||||
(grep gmOptionsUI / gmGameplayOptionsUI / gmCharacterOptionsUI /
|
||||
gmConfigOptionsUI / the tab control); how Apply/Reset/Defaults work
|
||||
(what each sends/restores, per tab or global); how the panel opens
|
||||
(the status-bar button element + any keybind).
|
||||
2. **The Character tab's complete option map:** every row transcribed
|
||||
above → its storage (CharacterOptions1 bit / CharacterOptions2 bit /
|
||||
PlayerModule property id) → its wire (0x0005 single vs 0x01A1 blob) →
|
||||
ACE's handling (which bits ACE honors server-side vs stores-only) →
|
||||
acdream's current state (exists/ignored/missing). acclient.h +
|
||||
`PlayerModule`/`CharacterOptionsMapper` decomp + ACE enums.
|
||||
3. **The Chat tab and Config tab contents** (no screenshots): derive
|
||||
from the decomp/LayoutDescs what retail shows there.
|
||||
4. **The real 0x01A1 blob:** exact layout from ACE's reader + retail's
|
||||
builder; when retail sends blob vs single-option.
|
||||
5. **Configure Keyboard:** retail's keymap UI + storage (the keymap
|
||||
file/wire?) — and the design call on reusing acdream's existing
|
||||
rebind UX vs porting retail's screen.
|
||||
6. **Gameplay Options tab actions:** Exit to Character Selection (ties
|
||||
into the FUTURE pre-world flow — probably lands as Exit Game
|
||||
initially with a register row), Urgent Assistance / Report Abuse
|
||||
(server messages?), In-Game Help Files, Use Mouse Turning Settings.
|
||||
7. **Which options have live acdream consumers today** (timestamps →
|
||||
chat; hear-chat → CH3 gate; run-as-default → movement; weather/fog/
|
||||
daylight → sky pipeline; helm/cloak → appearance) vs options whose
|
||||
subsystems don't exist yet (chess rank...) — the implement-vs-store
|
||||
split per row.
|
||||
|
||||
## Process (binding, from Campaign CH's five gate rounds)
|
||||
|
||||
- Model split: Opus research lanes → Fable (main loop) plans →
|
||||
Sonnet implements → dual-lens Opus review per slice, fixes applied;
|
||||
REJECT verdicts get focused re-reviews.
|
||||
- Max 3-4 agents in parallel INCLUDING children; every agent prompt
|
||||
carries an explicit no-subagent clause; ONE implementer at a time on
|
||||
shared files; agents never launch the graphical client; the user runs
|
||||
connected gates.
|
||||
- Ledger discipline: never blanket-replace "(this commit)" placeholders
|
||||
(anchor every replacement); post-amend SHAs recorded by the
|
||||
coordinator, not chased in the same commit.
|
||||
- User gates are AXIOMS; screenshots must be transcribed into docs
|
||||
immediately (they don't survive sessions); honesty markers NEVER
|
||||
appear in user-visible text; decomp claims byte-verified (BN pooled
|
||||
strings, `sbb` idioms, and ~33-char previews are known artifact
|
||||
classes — sweep push-imm32 literals from the PDB-paired binary at
|
||||
`C:\Users\erikn\Downloads\acclient.exe`, `check_exe_pdb.py` MATCH
|
||||
first).
|
||||
- `dotnet build` + FULL Release suite green per commit (baseline at
|
||||
handoff: 12,610/4/0 at `bcc34ee3`; plus the in-flight polish commit
|
||||
below). Register rows same-commit. CLAUDE.md campaign paragraph
|
||||
updated at close (see `feedback_claude_md_staleness`).
|
||||
|
||||
## In-flight at handoff
|
||||
|
||||
A post-gate polish agent (round-5 review S1-S3: per-block outline pass,
|
||||
non-UiText outline plumbing, citation fix) was running when this handoff
|
||||
was written — check `git log` for `fix(ui): round-5 review polish` and
|
||||
collect/verify its landing first if absent.
|
||||
|
||||
## Carried tail (do not lose)
|
||||
|
||||
#360/#361 (command families), #366 (unseen-text indicator), #368
|
||||
(headless thread affinity — separate session exists), #369 (floaty send
|
||||
channel), AP-177 (SpewBox line lifetime), AP-190 (opacity ease),
|
||||
AP-191 (transcript tag colors).
|
||||
Loading…
Add table
Add a link
Reference in a new issue