CHARACTER_LIST_UPDATE can fire with numChars == 0 in a transient state
when returning to the glue screen after /logout, before the server's
SMSG_CHAR_ENUM re-populates the character list. Without this guard,
CharacterOrder_Save writes an empty string to the vault, wiping the
saved order. The real CHARACTER_LIST_UPDATE that follows then reads
that empty string in Apply, returns early, and leaves the table at
server-default identity order — sort order silently reset.
Fix: skip the write when numChars is 0. The only legitimate zero case
is a brand-new account with no characters, where there's nothing to
persist anyway.
Three features layered onto the Turtle WoW baseline:
- Account manager (AccountLogin.lua / .xml): saved-account list backed
by Windows Credential Manager via ClassicAPI. Pass-through to
LoginWithSavedAccount; per-account 'last used' timestamp; password
field hides itself when the typed name matches a saved entry and a
'Change password' button reveals it on demand.
- Character reordering (CharacterSelect.lua / .xml): drag-to-reorder
the character list, persisted via ClassicAPI's
GetSavedCharacterOrder / SetSavedCharacterOrder.
- Glue Lua console (GlueConsole.lua / .xml, new files): in-glue RunScript
console reachable from the title and char-select screens.
Currently no key opens the console — the backtick binding was removed
pending a ClassicAPI EditBox arrow/key script handler (see TODO.md section 96).
Pristine baseline for the four Glue files we customize:
- AccountLogin.lua / .xml
- CharacterSelect.lua / .xml
Source: c:/WoW/Octo/BlizzardInterfaceCode/GlueXML (Turtle WoW / Octo
upstream). Refreshed 2026-07-17. The prior baseline (13d77d7) pre-dates
upstream's simplification of the login side-button stack in
AccountLogin.xml (removed Credits, Reddit, Discord, Armory; inlined
LaunchURL calls to octowow.st URLs).
Other files in BlizzardInterfaceCode/GlueXML are not tracked here since
we don't override them on top of the MPQ-provided copies.