Files
benilla-octo/crates/benilla-app/assets/ui/benilla.toc
T
gromandClaude Opus 5 f4960efc53 The realm update lands clean, and three of the "269 known red" were real
His 2026-10-28 20:18 update rewrote `Data/patch-4.mpq` (1.37 GB) and
`patch-5.mpq`
(230 MB). Verified rather than assumed, and nothing of ours broke: the realm's
`FrameXML.toc` went 146 → 151 rows and patch-5 holds the richest copy, so
`chain::demote_stale_snapshots` fires and it wins the manifest; the five new
rows
are realm modules (`OctoChallengesSession`, `OctoHardcoreBGMenu`, `OctoReplay`,
`OctoReplayBar`, `OctoReport`) that `unnamed_chain_rows` picks up by design and
that load with **0 load errors and 0 session errors**, every global they name
resolving; DBC field counts are unchanged everywhere, so no parser is at risk,
while record counts moved (Spell 27992 → 28026, CreatureDisplayInfo 13423 →
13451), which is the proof the new data is live; a `WOW_CAPTURE=vista` at
Ironforge prints **0 ERROR lines**; and both golden baselines held exactly, 269
with an identical failing name set and 80, `goldshire_cell` still at 1874.

Two examples answer "did it land", because "the file is in the archive" never
does. The reference mounts `patch-?.MPQ` by case-folded name, so every
`patch-A..Z` outranks `patch-4`/`patch-5`, and the toc-subset demotion cannot
see
an archive that carries no toc at all. `chain_report` prints the `FrameXML.toc`
copies in priority order and, with `--toc`, the winner of every row of the
realm's manifest with a tally — 68 to patch-4, 43 to patch-5, 32 to `patch.MPQ`,
7 to `interface.MPQ`, 1 to patch-3, and **none to a stale letter patch**.
`chain_shadow` answers from the archive's side: patch-4 carries 20326 paths of
which 10220 are shadowed, patch-5's 1494 are not shadowed at all.

Then, grouping the red bucket by panic *site* rather than trusting its label:
252 of the 269 are shipped-UI tests and **136 share one site**. Three of the
rest
were real, and are fixed here.

Six `OptionsFrame_*` enable/disable helpers were missing outright. `benilla.toc`
is the only thing that loads two of the reference's settings windows — the
realm's own toc lists neither `SoundOptionsFrame.xml` nor `UIOptionsFrame.xml` —
stock 1.12 keeps those six beside them in its own `OptionsFrame.lua`, and the
realm replaced that file with Turtle's rewrite, which drops them. Checked
against
all 151 interface rows, Lua and XML: nothing defines one. So those windows held
controls that could not grey out, with the first raise waiting on the click that
reached one. `assets/ui/OptionsFrameAdapters.lua` carries the reference's own
bodies, read out of `patch.MPQ` rather than from memory.

`CHARACTERFRAME_SUBFRAMES` was asserted to hold exactly five. The realm's
`CharacterFrame.lua` carries a sixth, `ArenaFrame` — which this client already
stubs (`CharacterFrameAdapters.xml`), so the count was the only thing wrong. It
now checks the reference's five by membership and order, which is what the test
is for; a realm may append.

And the kit's stand-ins were anonymous. `CreateFrame("Frame")` with no name
answers `GetName()` nil and `GetID()` 0, the publish is `setglobal` either way,
so naming them costs nothing and the absence cost two of the 136's three errors:
`FCF_SetWindowName` concatenating a nil name and `SetChatWindowDocked` refusing
window 0. `ChatFrame1`/`ChatFrame2` are no longer seated at all — every row of
`UIPARENT_MANAGED_FRAME_POSITIONS` is read through `frame = _G[index]; if
( frame )`, so a missing one is skipped, and seating them only shadowed the real
windows for good. The pass runs at load, from `ShapeshiftBar_OnLoad`, twelve toc
rows before the chat files, which is why the stand-ins were always first.

That leaves 136 on one cause, and the two tests added to `loader/tests.rs` are
what ruled out the first hypothesis: a template's `parent="UIParent"` does reach
the frame that inherits it, one level and two, which is how `ChatFrame1` is
built. The next suspects are written down in the gates memory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
2026-10-28 21:15:41 -06:00

354 lines
22 KiB
TeX

# The built-in interface, in load order: a bare filename is ours, from `assets/ui`; a path is
# the reference's own file, off the player's patch chain. Entry 0, Fonts.xml, loads alone into
# every boot VM, from Startup on; the rest loads on entering the world, then third-party addons.
# The font objects thus exist before the login screen; the reference loads Fonts.xml with the
# rest of FrameXML.
# `inherits=`, `parent=` and a named `relativeTo=` resolve only against names declared above; a
# missing one only warns (the template is skipped, the parent falls back to the enclosing frame).
# A later Lua global or template replaces an earlier one; a named frame publishes its global
# only while the name is free.
# A stock `.xml` that does not `<Script file=>` its own `.lua` needs both rows, `.lua` first.
# LoadOnDemand addons have no row, as in the reference; they load off the chain on first use.
## Interface: 11200
## Title: benilla
Interface\FrameXML\Fonts.xml
# Second, not first as in the reference, because entry 0 must be Fonts.xml.
Interface\FrameXML\GlobalStrings.lua
# OctoWoW's own seven rows between GlobalStrings and Globals (its `FrameXML.toc` 4-10). Each
# `OctoLocale_*` file is one `if GetLocale() == "xxXX"` block of GlobalStrings overrides and is
# inert on an enUS chain, but they load as the reference loads them, so a client started in
# another locale reads the realm's own strings rather than ours. `OctoToolReqData.lua` is the
# realm's 40 KB recipe -> required-tool-item table and `OctoToolReqTip.lua` wraps
# `GetTradeSkillTools` over it: a recipe whose tool OctoWoW changed (the jeweler's kits, the
# Whittle) reads its real tool in the trade-skill window, and the universal knife (item 50006)
# satisfies any of them. The wrap is engine-level (`GetTradeSkillTools` is a binding, not
# FrameXML), so its place this early is the reference's and costs nothing.
Interface\FrameXML\OctoLocale\OctoLocale_deDE.lua
Interface\FrameXML\OctoLocale\OctoLocale_esES.lua
Interface\FrameXML\OctoLocale\OctoLocale_ptBR.lua
Interface\FrameXML\OctoLocale\OctoLocale_ruRU.lua
Interface\FrameXML\OctoLocale\OctoLocale_zhCN.lua
Interface\FrameXML\OctoToolReqTip\OctoToolReqData.lua
Interface\FrameXML\OctoToolReqTip\OctoToolReqTip.lua
# TurtleWoW's own two rows after GlobalStrings (its `FrameXML.toc` 11-12), both the client half of
# server-side systems. `Globals.lua` publishes `print`, `TURTLE_WOW_VERSION`, `TW_CLASS_TOKEN`,
# `Turtle_AvailableChallenges`, `GAME_YELLOW` and the three `ADDON_MSG_*_DELIMITER`s that every
# `CHAT_MSG_ADDON` protocol on this realm splits on; it also re-declares `sizeof`/`explode`/`wipe`/
# `trim`, which our UI stdlib seeds for a chain that lacks the file, and the chain's own copy wins
# here, as in the reference. `Overrides.lua` is Turtle's two-continent map: `CONTINENTS_LENGTH = 2`
# and a `GetMapContinents` wrapper that returns exactly Kalimdor and Azeroth, dropping any further
# row the chain's `WorldMapContinent.dbc` carries.
Interface\FrameXML\Globals.lua
Interface\FrameXML\Overrides.lua
# The chain's row 14, immediately after its own Fonts.xml (our entry 0): it repoints the ~50
# FrameXML font objects at `Fonts\FZLBJW.TTF` for ruRU and zhCN only, so on an enUS client every
# `GetFont`/`SetFont` pair it runs is a no-op. Faithful and inert, and the one row that makes a
# Cyrillic or CJK login legible.
Interface\FrameXML\OctoLocale\OctoLocale_Fonts.lua
# `Localize()` runs at load and overwrites GlobalStrings keys, so this follows them.
Interface\FrameXML\Localization.xml
# `GetText` is a Lua global, not an engine binding: the client's `0x703bf0` calls it.
Interface\FrameXML\LocaleProperties.lua
Interface\FrameXML\BasicControls.xml
# Before UIParent.xml, whose `LowHealthFrame` has `parent="WorldFrame"`.
Interface\FrameXML\WorldFrame.xml
# Above every file that names `parent="UIParent"` or adds a `UIPanelWindows` row at load.
Interface\FrameXML\UIParent.xml
Interface\FrameXML\ItemButtonTemplate.xml
# Before GameTooltip.xml and StaticPopup.xml, whose money rows inherit `SmallMoneyFrameTemplate`.
Interface\FrameXML\MoneyFrame.lua
Interface\FrameXML\MoneyFrame.xml
Interface\FrameXML\MoneyInputFrame.lua
Interface\FrameXML\MoneyInputFrame.xml
Interface\FrameXML\GameTooltip.xml
Interface\FrameXML\UIDropDownMenu.xml
Interface\FrameXML\UIMenu.xml
# Before the unit frames, whose dropdowns' OnLoad reaches `UnitPopup_ShowMenu`.
Interface\FrameXML\UnitPopup.xml
Interface\FrameXML\ItemRef.xml
# The `TextStatusBar` template and verbs, which the unit bars and `MainMenuExpBar` inherit.
Interface\FrameXML\TextStatusBar.lua
Interface\FrameXML\TextStatusBar.xml
# Before PartyFrame.xml, whose rows reach `RefreshBuffs` from their OnLoad.
Interface\FrameXML\BuffFrame.xml
# Function-only kits the unit windows below call from their OnLoad.
Interface\FrameXML\UnitFrame.xml
Interface\FrameXML\CombatFeedback.xml
Interface\FrameXML\PlayerFrame.xml
Interface\FrameXML\PartyFrame.xml
Interface\FrameXML\TargetFrame.xml
Interface\FrameXML\PetFrame.xml
# Anchors `relativeTo="TargetFrame"`.
Interface\FrameXML\ComboFrame.xml
# Ours: the scroll parts of our options window and script log.
ScrollTemplates.xml
Interface\FrameXML\UIPanelTemplates.lua
Interface\FrameXML\UIPanelTemplates.xml
# The reference's three options windows, loaded hidden so addons find their frames by name.
# Deviation: the player opens our own options window, `OptionsFrame.xml` below, because 1.12's
# settings screens are much worse to use; the stock one holds `OptionsFrame`.
Interface\FrameXML\OptionsFrame.xml
# Ours: the six `OptionsFrame_*` enable/disable helpers stock 1.12 keeps in its own
# `OptionsFrame.lua`, which the realm's rewrite of that file dropped. The two stock windows below
# are the callers, and this client is the only thing that loads them.
OptionsFrameAdapters.lua
Interface\FrameXML\SoundOptionsFrame.xml
# Inherits `OptionsCheckButtonTemplate`, and declares `UIOptionsFrameCheckButtons`, which
# MultiActionBars.lua writes at load.
Interface\FrameXML\UIOptionsFrame.xml
# StaticPopup.lua starts `StaticPopupDialogs` empty: a file that adds a dialog at load follows it.
Interface\FrameXML\StaticPopup.xml
Interface\FrameXML\CoinPickupFrame.xml
# Ours: the Keybindings page's templates and script, which OptionsFrame.xml uses at load.
KeyBindingsPage.xml
# Ours: `BenillaOptionsFrame`; its rows read the option globals the stock windows above set.
OptionsFrame.xml
# `MainMenuBar`, `MainMenuBarArtFrame` and `MainMenuExpBar`, which later files read at load.
Interface\FrameXML\MainMenuBar.xml
Interface\FrameXML\Cooldown.xml
# `ActionButtonTemplate`, which ActionBarFrame.xml's `ActionBarButtonTemplate` inherits.
Interface\FrameXML\ActionButtonTemplate.xml
Interface\FrameXML\ActionBarFrame.xml
# The four optional bars, action slots 25-72.
Interface\FrameXML\MultiActionBars.xml
Interface\FrameXML\PetActionBarFrame.xml
# `UpdateMicroButtons` reads CharacterFrame, SpellBookFrame, QuestLogFrame, GameMenuFrame, the
# three stock options windows, FriendsFrame, WorldMapFrame, HelpFrame and KeyRingButton
# unguarded, so each must be on this list.
Interface\FrameXML\MainMenuBarMicroButtons.xml
# Before Minimap.xml, whose queue dropdown's OnLoad calls `MiniMapBattlefieldDropDown_OnLoad`.
Interface\FrameXML\BattlefieldFrame.xml
# GameTime.xml, DurabilityFrame.xml and QuestTimerFrame.xml name `MinimapCluster` at load.
Interface\FrameXML\Minimap.xml
Interface\FrameXML\GameTime.xml
# Before ZoneText.xml, whose frames call `FadingFrame_OnLoad` in their OnLoad.
Interface\FrameXML\FadingFrame.xml
Interface\FrameXML\ZoneText.xml
Interface\FrameXML\ColorPickerFrame.xml
Interface\FrameXML\WorldMapFrame.xml
Interface\FrameXML\CastingBarFrame.xml
Interface\FrameXML\MirrorTimer.xml
Interface\FrameXML\DurabilityFrame.xml
Interface\FrameXML\UIErrorsFrame.xml
# Anchors `relativeTo="UIErrorsFrame"`.
Interface\FrameXML\RaidWarning.xml
Interface\FrameXML\ContainerFrame.xml
# `CharacterFrameTabButtonTemplate`, which `CharacterFrame.xml`'s own tabs (and TurtleWoW's LFT
# group finder) inherit; the reference's toc lists it apart, so bring it in ahead of its users.
Interface\FrameXML\CharacterFrameTemplates.xml
# `CharacterFrame` parents every tab page below, and its OnLoad reads `PlayerFrameHealthBar`,
# `PlayerFrameManaBar` and `MainMenuExpBar`; PaperDollFrame.xml declares templates the pet page
# and the bag bar inherit.
Interface\FrameXML\CharacterFrame.xml
Interface\FrameXML\PaperDollFrame.xml
Interface\FrameXML\PetPaperDollFrame.xml
Interface\FrameXML\MainMenuBarBagButtons.xml
Interface\FrameXML\StackSplitFrame.xml
# Ours: wraps the stock bag verbs; the keyring is a container (id -2).
ContainerFrameAdapters.xml
Interface\FrameXML\ReputationFrame.xml
Interface\FrameXML\SkillFrame.xml
# Brings HonorFrameTemplates.xml, whose row templates `Blizzard_InspectUI` inherits.
Interface\FrameXML\HonorFrame.xml
# Ours: the sixth tab page TurtleWoW's `CharacterFrame.lua` lists and 1.12 never shipped.
CharacterFrameAdapters.xml
Interface\FrameXML\DressUpFrame.xml
# Deliberately absent, the chain's `StatsFrame.xml` would sit here (its `FrameXML.toc` 60): the
# debug-build frame-stat overlay, `hidden="true"` with an OnUpdate that is the only reader of
# `GetDebugStats()` — a binding 5875 has and benilla does not, and whose readout is a debug
# build's own, not something a player sees. Loading the row would publish a `ToggleStats` that
# raises twice a second once pressed; leaving it out leaves `ToggleStats` nil, which is what an
# unbound key already does. Build `GetDebugStats` and this row costs nothing.
Interface\FrameXML\SpellBookFrame.xml
# Ours: the pet page's autocast widgets in the pet action button's proportions.
SpellBookAdapters.xml
# RaidFrame.xml names `parent="FriendsFrame"` and MailFrame.xml inherits `FriendsFrameTabTemplate`.
Interface\FrameXML\FriendsFrame.xml
Interface\FrameXML\RaidFrame.xml
Interface\FrameXML\GossipFrame.xml
Interface\FrameXML\MerchantFrame.xml
Interface\FrameXML\MailFrame.xml
Interface\FrameXML\TradeFrame.xml
Interface\FrameXML\ItemTextFrame.xml
Interface\FrameXML\BankFrame.xml
Interface\FrameXML\TaxiFrame.xml
Interface\FrameXML\PetStable.xml
Interface\FrameXML\LootFrame.xml
# Brings QuestFrameTemplates.xml, whose templates the guild registrar and quest log inherit; the
# quest log's OnLoad also calls `QuestMoneyFrame_OnLoad` from QuestFrame.lua.
Interface\FrameXML\QuestFrame.xml
Interface\FrameXML\GuildRegistrarFrame.xml
Interface\FrameXML\PetitionFrame.xml
Interface\FrameXML\QuestLogFrame.xml
Interface\FrameXML\QuestTimerFrame.xml
# ChatFrame.lua starts `SlashCmdList` empty: a file that registers slash commands at load follows.
Interface\FrameXML\ChatFrame.xml
Interface\FrameXML\FloatingChatFrame.xml
# `ShapeshiftBar_OnLoad` can reach `UIParent_ManageFramePositions`, which reads the frames above
# unguarded.
Interface\FrameXML\BonusActionBarFrame.xml
# `WorldStateAlwaysUpFrame`'s OnLoad runs the same pass, which also reads
# `ShapeshiftBarLeft/Middle/Right`, so this follows BonusActionBarFrame.xml.
Interface\FrameXML\WorldStateFrame.xml
# `ClassTrainerListScrollFrameTemplate`, which on-demand addons inherit.
Interface\FrameXML\ClassTrainerFrameTemplates.xml
# TurtleWoW's Looking-For-Turtle group finder (`/lft`, and the minimap eye): the reference's own
# toc lists LFT_Data.lua, LFT.lua, LFTTemplates.xml and LFT.xml in that order, and OctoWoW's
# blink-pause overlay rides last. `json.lua` is the codec the group payloads decode through.
Interface\FrameXML\json.lua
Interface\FrameXML\LFT\LFT_Data.lua
Interface\FrameXML\LFT\LFT.lua
Interface\FrameXML\LFT\LFTTemplates.xml
Interface\FrameXML\LFT\LFT.xml
# `OctoTurtleBridge` is Turtle_General's addon-message dispatcher, baked into FrameXML: it answers
# the realm's `TW_CHAT_MSG_WHISPER` inspect replies and `RESPONSE_PLAYER_CHALLENGES`, loading
# `Blizzard_InspectUI` and `Blizzard_TalentUI` on demand and seeding `Turtle_ChallengesCache`.
Interface\FrameXML\OctoTurtleBridge\OctoTurtleBridge.lua
# TurtleWoW's compact group/raid frames (`GroupClusterFrame1..8` + `GroupPetsClusterFrame`); the
# one row pulls `Turtle_GroupUI.lua` and `Turtle_GroupUITemplates.xml` through its own
# `<Script>`/`<Include>`. `OctoGroupUIFix` must stay immediately after it, as the chain's toc has
# it: it patches that module in place (saved position, a frame left stuck to the cursor, and the
# `PLAYER_ENTERING_WORLD` setup appending its lists on every loading screen).
Interface\FrameXML\Turtle_GroupUI\Turtle_GroupUI.xml
Interface\FrameXML\OctoGroupUIFix\OctoGroupUIFix.lua
# OctoWoW's seven baked single-file extensions (its `FrameXML.toc` 143-149), all Lua over verbs
# that already exist, and baked into the chain rather than shipped as AddOns precisely so a player
# cannot switch them off. In the reference's order, which puts the first of them above
# OctoLFTBlinkPause.
# `OctoWowWarModeConfirm` wraps `SlashCmdList["PVP"]`: on the War Mode challenge (spell named
# "War Mode" in the spellbook) /pvp raises a confirm popup first, because the server reads a
# /pvp from such a character as a permanent, persisted opt-out.
Interface\FrameXML\OctoWowWarModeConfirm\OctoWowWarModeConfirm.lua
Interface\FrameXML\OctoLFTBlinkPause\OctoLFTBlinkPause.lua
# `OctoRestedTooltip` wraps `GetRestState` so the exhaustion tooltip reads the realm's 175% rather
# than 1.12's baked 150%, and adds `/rested`; the multiplier is display-only in 1.12, the XP bar
# itself reads the state id.
Interface\FrameXML\OctoRestedTooltip\OctoRestedTooltip.lua
# `OctoChallengeTip` appends entries 11 and 12 to `Turtle_AvailableChallenges` (Globals.lua above),
# which is what `TargetFrame_UpdateChallenges` walks bit by bit — so the realm's own two
# challenges, Samurai and Together Forever, stop being dropped from a player's hover.
Interface\FrameXML\OctoChallengeTip\OctoChallengeTip.lua
# `OctoWarModeOffer` renders the one-shot War Mode offer the server sends as a `TW_WARMODE`
# `S2C_OFFER` addon message on arrival from the hardcore realm, and answers C2S_ACCEPT/C2S_DECLINE.
Interface\FrameXML\OctoWarModeOffer\OctoWarModeOffer.lua
# `OctoXpBoost` is `/xpboost`, the bonus-experience opt-out. Slash commands never reach the server,
# so it sends the server's `.xpboost` as a SAY, which the server runs as a command and never
# broadcasts. Nothing in it is ours; without the row the command is simply undefined, which is what
# grom's 2026-10-23 report was.
Interface\FrameXML\OctoXpBoost\OctoXpBoost.lua
# `RestoreBugCommand` rebuilds `/bug` and `/suggest`: Turtle's FrameXML dropped the BugReport frame
# altogether, so this builds its own dialog and sends the report as chunked `.bug` SAY commands.
Interface\FrameXML\RestoreBugCommand\RestoreBugCommand.lua
# TurtleWoW's own three loose rows (its `FrameXML.toc` 103-105), all Lua over verbs that already
# exist. `Hooks.lua` is the realm's tooltip layer: the guild line under a player's name (gated on
# its own `TOOLTIP_GUILD_NAMES` CVar), the shift-click hint while a trade, auction or mail window
# is up, and `FixSetInspect`, which recolours an inspected or transmogrified item's set lines by
# what the unit actually wears — the reason a set bonus reads gray on this realm without it.
# `ChronoboonTimers.lua` adds the Chronoboon Displacer's stored-buff lines to its bag tooltip;
# `SpellChatLinks.lua` answers the realm's `TW_CHAT_MSG_WHISPER` spell/talent link protocol, so a
# linked spell in chat opens a tooltip instead of nothing.
Interface\FrameXML\Hooks.lua
Interface\FrameXML\ChronoboonTimers.lua
Interface\FrameXML\SpellChatLinks.lua
# Turtle's `# Arena` block (its `FrameXML.toc` 108-112), in its own order. `Turtle_ArenaUI.lua`
# is the whole client half of the realm's arena: the `TW_ARENA` addon-message protocol, the team
# roster and the queue. `Turtle_ArenaUITemplates.xml` carries `ArenaTeamTemplate`, which
# `Blizzard_InspectUI`'s own `InspectArenaFrame.xml` inherits for its three team buttons before
# reading `$parentText`, `$parentDetails` and nine `$parentDetails*` children by name — without
# that row the inspect window raised four times per inspect, three OnLoads and
# `InspectArenaFrame_OnShow`.
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaUI.lua
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaUITemplates.xml
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaFrame.xml
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaQueueFrame.xml
Interface\FrameXML\Turtle_ArenaUI\Turtle_ArenaRegistrarFrame.xml
# Turtle's barbershop, one row that scripts its own `Turtle_Barbershop.lua`: the window opens on a
# `TW_BARBERSHOP` addon message (no gossip hook — it watches CHAT_MSG_ADDON, PLAYER_MONEY and
# UNIT_MODEL_CHANGED) and drives a live 3-D preview, zooming the world camera out two yards at the
# open (`Turtle_Barbershop.lua:211`). `CameraZoomOut` was the one verb these three windows call
# that we did not have; it is built now, with `CameraZoomIn`.
Interface\FrameXML\Turtle_BarbershopUI\Turtle_Barbershop.xml
# TurtleWoW's own FrameXML additions, in the reference `FrameXML.toc` order (patch-3.mpq). These
# are the client half of Turtle's custom systems: `Turtle_TransmogUI` hooks `GOSSIP_SHOW`, hides
# the stock gossip frame for its NPCs and drives the transmog window over `TW_TRANSMOG` addon
# messages; `Turtle_ShopUI` (prefix `TW_SHOP`) is the custom merchant/shop. Without these rows the
# server's trigger gossip text (`TRANSMOG_TRIGGER`, `CUSTOM_MERCHANT_TRIGGER`) is what the stock
# gossip window shows, and neither custom window exists.
Interface\FrameXML\Turtle_TransmogUI\Turtle_TransmogSets.lua
# The slot buttons in Turtle_TransmogUI.xml inherit TransmogPlayerSlotTemplate, and the look grid
# and new-transmog alert inherit TransmogFrameLookTemplate/TransmogWonItemTemplate; without this
# file they materialize bare and the UI's `_G[slot.."BorderSelected"]`-style reads raise on nil.
Interface\FrameXML\Turtle_TransmogUI\Turtle_TransmogUITemplates.xml
Interface\FrameXML\Turtle_TransmogUI\Turtle_TransmogUI.xml
Interface\FrameXML\Turtle_ShopUI\Turtle_ShopUITemplates.xml
Interface\FrameXML\Turtle_ShopUI\Turtle_ShopUI.xml
# Turtle's guild bank (its `FrameXML.toc` 126-127): the templates first, then the window, which
# scripts its own 60 KB `Turtle_GuildBankUI.lua` — a `GOSSIP_SHOW` hook for the banker NPCs over
# `TW_GUILDBANK` messages, with the tab rights read off `GuildControlGetNumRanks`/`GetRankName`
# and so a `GUILD_ROSTER_UPDATE`/`PLAYER_GUILD_UPDATE` listener too.
Interface\FrameXML\Turtle_GuildBankUI\Turtle_GuildBankUITemplates.xml
Interface\FrameXML\Turtle_GuildBankUI\Turtle_GuildBankUI.xml
# Turtle's honour/arena merchant (Stormwind armoury PvP gear, the Custom_Merchant NPCs): it hooks
# `GOSSIP_SHOW`, hides the gossip frame for an NPC whose greeting is `CUSTOM_MERCHANT_TRIGGER` and
# fills over `TW_Merchant` addon messages. Without it that trigger text is what the stock gossip
# window shows. The `.xml` scripts its own `.lua`, and it inherits SmallAlterateCurrencyFrameTemplate
# (MoneyFrame.xml) and uses `json` (json.lua above), both already on the chain.
Interface\FrameXML\Custom_Merchant\CustomMerchantFrame.xml
# The realm's in-game radio, two baked files in the chain's own order (its FrameXML.toc 129 then
# 146). `EverlookBroadcastingCo` builds the `EBC_Minimap` boombox button; `OctoRadioPlaceholder`
# hangs the station menu off it and bails at its first line without it
# (`if not EBC_Minimap then return end`), so the order is load-bearing, not cosmetic.
#
# A station click sends `.radio <n>` as a SAY chat command; the server answers with
# `SMSG_PLAY_MUSIC` naming a `SoundEntries.dbc` row whose file is a live HTTP stream URL.
Interface\FrameXML\EverlookBroadcastingCo\EverlookBroadcastingCo.xml
Interface\FrameXML\OctoRadioPlaceholder\OctoRadioPlaceholder.lua
# `OctoGhostGate`, last of the realm's six baked extensions: it post-hooks
# `GameTooltip:SetUnitDebuff` and, when the hovered debuff is titled exactly "Ghost", rewrites
# line 2 with the hardcore afterlife line — gated at PLAYER_LOGIN on `GetRealmName() == "C'Thun"`,
# because Spell.dbc loads before a realm is chosen and the realm wants the line on C'Thun only.
Interface\FrameXML\OctoGhostGate\OctoGhostGate.lua
# AIO, the realm's client<->server transport (its FrameXML.toc bakes it so no AddOn is needed).
# Before OctoCalendar, which feeds from it: the calendar registers an AIO handler at load and
# queues its guild-permission request until AIO is up (`OctoCalendar.lua:919-920`).
Interface\FrameXML\AIO\Dep_LibWindow-1.1\LibStub.lua
Interface\FrameXML\AIO\Dep_LibWindow-1.1\LibWindow-1.1\LibWindow-1.1.lua
Interface\FrameXML\AIO\Dep_Smallfolk\smallfolk.lua
Interface\FrameXML\AIO\lualzw-zeros\lualzw.lua
Interface\FrameXML\AIO\queue.lua
Interface\FrameXML\AIO\AIO.lua
# `OctoTurtleStore` keeps `TransmogOutfits` and `LFTPresets` on the realm through AIO's
# `OctoUIStore` handler, FrameXML having no SavedVariables of its own. After AIO, which it needs at
# load: it returns early without `AIO.Handle`, `AIO.AddHandlers` and `Smallfolk`.
Interface\FrameXML\OctoTurtleStore\OctoTurtleStore.lua
# The realm's event calendar: `/cal`, `/calendar`, `/octocal` (`OctoCalendar.lua:925-928`).
Interface\FrameXML\OctoCalendar\OctoCalendar_Holidays.lua
Interface\FrameXML\OctoCalendar\OctoCalendar.lua
Interface\FrameXML\OctoCalendar\OctoCalendar.xml
Interface\FrameXML\OctoCalendar\OctoCalendar_Create.lua
Interface\FrameXML\OctoCalendar\OctoCalendar_Create.xml
Interface\FrameXML\OctoCalendar\OctoCalendar_Mail.lua
Interface\FrameXML\OctoCalendar\OctoCalendar_GuildPerms.lua
# Ours: a no-op for each AIO block this client has no feature for. After AIO, which defines the
# registration verb, and after the Octo files, so a real handler always wins the name.
AIOHandlers.lua
# Ours: the `/errors` script error log and our slash commands.
ScriptLogFrame.xml
Interface\FrameXML\HelpFrame.xml
Interface\FrameXML\CinematicFrame.xml
Interface\FrameXML\TabardFrame.xml
Interface\FrameXML\TutorialFrame.xml
# Ours: the ESC game menu. Last: it wraps `ToggleGameMenu`, `IsOptionFrameOpen` and
# `UpdateMicroButtons` to count `BenillaOptionsFrame`.
GameMenuFrame.xml