Comparing my own bag with camelot's, side by side and pixel by pixel, named
what was wrong.
The panel let the world through. Camelot's interior is (16,14,12) and opaque:
the gaps between slots went blue on mine. The colour is now the measured one,
at full opacity.
The title and the bag icon were missing. The metal nine-slice sat in OVERLAY,
where the modern client can afford it because its portrait and title live in
child frames at high level; 3.3.5 keeps them as plain regions of the frame,
in BACKGROUND and ARTWORK, so the metal covered both. The nine-slice moves to
BORDER.
Every slot in camelot wears a frame, full or empty, dark grey: edges between
25 and 49, corners near 100, which is WhiteIconFrame at a tint of 0.39. Mine
showed it white and only on full slots. It is now on every slot at that tint,
and the quality colour takes over only from uncommon up -- the common items
of the capture keep the grey.
Both captures are kept in docs/reference/.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nothing about the bags had ever appeared in game, and the reason was three
lines at the end of Bags.lua: the sort button was given texture objects, the
way a modern client allows. 3.3.5 takes a file path there and nothing else,
so those lines raised, and an error at the top level of a file abandons
everything after it -- including the call that skins the frames, which came
later in the file. The window stayed the client's own, which is why every
report since has described an untouched bag.
The three now set the sheet's path and then apply the atlas to the texture
the button just made, and the mock client raises on a texture object exactly
as the game does, so this class of mistake cannot pass again.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A screenshot of camelot's own backpack settled it. At the 4/3 scale of that
capture the grid is 217 pixels for camelot's 163 units, a slot 49 for 37, the
pitch 56 for 42, the search box 100 wide for the 96 of an edit box whose art
runs 5 past its left, and the whole window 411 for the 305 the formula gives
on five rows. The numbers in the code were right.
So the thirty pixels added by hand go away: the window is again what
CalculateHeight says it is. The capture is kept in docs/reference/ beside the
one of the bottom row, and the measurements are written where they were taken.
The close button becomes the red X of the modern panels, 24 by 24 at (1, 0)
of the top right corner, as UIPanelCloseButtonNoScripts and its default
anchors have it. One more sheet came into the workspace for it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three scripts assembled the art in Python so a window could be looked at
before it was tried in game. They are gone, and so is the helper that read
the atlas tables for them.
Such a picture only proves the arithmetic. It knows nothing of the real draw
order, of what the client lays over the result, of the scale the frame ends
up at -- and it showed as correct windows that the game showed wrong, twice
in a row on the bags.
What is left is the honest pair: the mock client checks numbers, and the game
itself decides what a thing looks like, against the screenshots kept in
docs/reference/.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four things the game showed and the code did not.
The window is now measured from what it holds -- header, grid, money frame,
margin -- instead of from the old background pieces that the reskin removed,
so it is tall enough and the money frame sits inside it. The grid is centred
instead of being flush right: 3.3.5 anchors it at -12 from the right edge and
lets the left margin fall where it may.
Item slots get an outline. The reference only gives the background of an empty
slot, which an item hides as soon as one is there; the frame of the bags bar
is laid over each slot, the same the bag buttons of the bottom row wear.
docs/reference/ keeps the screenshot of the real client that arrived with the
report. It confirms the bottom row point by point -- keybind at the top right,
page block over the gryphon, dividers, gryphon feet on the bar, reputation
above experience, both as long as the row -- and it is written down in
AMELIORATIONS what it says about the micro menu and the bags bar.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The bag windows take the modern panel: the flat background and the metal
nine-slice border of HeldBagLayout, the portrait in the ring of the top left
corner, the title centred in the bar, and item slots on bags-item-slot64.
ForeverUI.SetPanelArt builds that panel and is written to serve every panel
still to come.
The search box and the sort button sit where the reference puts them, on the
backpack alone: the box 96 x 18 at (42, -37), the button 28 x 26 at (-9, -34).
Neither of the two things they call exists in 3.3.5, so both are written here:
- the search compares the typed text with the name, the type and the subtype
of each item, and veils what does not match with the same black 80% overlay
the reference uses;
- the sort merges partial stacks, then orders the items by the game's own
category order (GetAuctionItemClasses), quality, name and stack size, one
move every tenth of a second because each swap must be confirmed before the
next.
tools/ajouter_feuilles.py brings a sheet into the workspace with its preview
and regenerates the atlas table; seven sheets came in this way. Previews are
now exported with the alpha channel, without which they cannot be judged.
docs/AMELIORATIONS.md lists what departs from the reference here, the sort
order first: it is decided inside the client and cannot be read.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The addon and the art it needs, read from a modern client and served to
3.3.5 through texture coordinates, since that client has no atlas.
What is in place: player frame with its states, death knight runes, target
frame and its classification rings, cast bar, action bar with its page block
and end caps, micro menu, bags bar, experience and reputation bars. Every
piece registers itself as a movable system.
This folder is the workspace. The addon in a client and the art in patch-Z
are copies tools/deployer.py makes, and what sits under Interface\ForeverUI
in the patch is exactly what data/art holds -- the deployer removes from the
archive anything this folder no longer carries. Each .blp comes with the .png
that shows what it holds.
docs/AMELIORATIONS.md lists what is known to be improvable: where the
reproduction departs from the reference and why, what the 2010 client cannot
do, and the debts left in the tooling.
The repository README also gains the row for mod-limit-break, which was
written earlier and had not been committed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>