- Chat : cadre, barre et bouton de retour, colonne, bouton d'amis de camelot ;
au repos fond, onglets, colonne et saisie s'effacent, allumage au survol
- Barres d'ameliorations et d'affaiblissements (Buffs.lua) : grille, bordures
par type, clignotement, repli, regroupement, enchantements d'arme
- Souillure : StaticPopupDialogs n'est plus reaffectee (BindEnchant bloque) ;
menus deroulants, suivi des objectifs, choix d'icone, ajout de canal et
carte du monde n'ecrivent plus les globales du client ; menus d'unite :
lignes protegees servies par des boutons securises hors combat, grisees en
combat ; seule MAP_QUEST_DIFFICULTY reste, par decision
- Gestionnaire d'ensembles : plus d'appel GetEquipmentSetIconInfo(nil)
- Banc : garde des globales ecrites (bytecode Lua 5.1), faux client durci
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Carte du monde : un clic sur le portail d'un donjon ou d'un raid (icones de
WDM, livre dans patch-enus-n.mpq) ouvre sa carte par SetMapByID
(WorldMapInstances.lua, genere des DBC du client par
tools/cartes_instances.py)
- "World" mene a la vue cosmique (Azeroth / Outreterre), reste actif en donjon
- premiere ouverture en plein ecran habillee camelot d'emblee
- les listes des menus de la carte s'ouvrent vers le bas, calees dans l'ecran
- Feuille de personnage : icone de l'onglet Pet selon la classe ; le
personnage et le familier tournent a la souris (reglages de camelot)
- /fui souris : le cadre sous la souris a chaque clic (diagnostic)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Talents : trois arbres cote a cote facon camelot sur PlayerTalentFrame,
noeuds carres/ronds (TalentsData.lua genere des DBC), fleches, portes,
changements en attente (Apply / Undo), onglets lateraux des specialisations,
Activate, talents du familier en fenetre reduite, recherche (marques sur les
noeuds, apercu, options, absents des barres), confirmation a la fermeture,
glisser un sort de talent appris vers une barre
- Glyphes : page refaite sur l'art fourni (tools/cuire_glyphes.py), lueurs,
etincelles, cercles concentriques tournants ; le GlyphFrame de WotLK reste
sous PlayerTalentFrame (le reparenter plantait le client a la deconnexion)
- Cadre du familier facon camelot (PetFrame.lua)
- Superposition.lua : feuille, grimoire et talents passent entierement l'un
devant l'autre, grimoire et talents deplacables
- Grimoire : la recherche "Missing from action bar" suit les barres
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Recherche du grimoire (SpellBookSearch.lua) : champ, apercu de 5
resultats, resultats en sections (exact, apparente, nom, description),
"Missing from action bar" ; suit Hide Passives et Show all spell ranks,
ne groupe jamais ; resultats feuilletables en combat.
- README : minimap, carte et journal, suivi de quetes, grimoire.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Livre de camelot dans SpellBookFrame : deux pages ou une, categories en
onglets-icones, grille condensee, en-tete repete, portrait cuit rond.
- Menus volants : groupes de SpellFlyout.db2, completes des sorts de BC et
WotLK, un groupe par onglet et par faction ; Seals et Judgements en plus.
- Combat : controleur securise ; onglets, pages, roulette, groupes,
agrandir/reduire et les trois reglages passent par des blocs securises,
les huit jeux de reglages publies hors combat.
- Banc : modele de securite de 3.3.5, OnShow/OnHide propages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Carte du monde (WorldMap.lua) : fenetre reduite camelot 702 x 534 posee
sur l'ossature de WotLK, fil d'Ariane, filtres, etages, coordonnees,
deplacable par la barre du titre.
- Journal de quetes (QuestLog.lua) : volet liste de camelot a droite de la
carte (recherche, compteur, reperes, suivi, menus), L ouvre carte + volet ;
page d'une quete (texte, objectifs, recompenses, Abandon / Share / Track)
avec bouton Retour qui rend la carte d'avant.
- Suivi de quetes (ObjectiveTracker.lua) : modules camelot Quests et
Achievements a la place des gestionnaires d'affichage de WotLK, API des
gestionnaires conservee ; tri et filtres de WotLK dans le bouton filtre ;
deplacable par /fui, position par defaut de camelot.
- Menus : les menus contextuels et sous-menus prennent la largeur de leur
contenu, mesuree dans la police affichee.
- Art : feuilles questmaplogatlas, questtracker, cadres et fonds ; outils
tranches_atlas.py ; banc d'essai etendu (WatchFrame, journal, menus).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Minimap.lua : cadre c60, barre du nom de zone, suivi, courrier, zoom,
cycle jour/nuit, calendrier (GameTimeFrame), horloge dans la barre
(TimeManagerClockButton) et coordonnees sous la carte, releves dans
blizzard_minimap, blizzard_timemanager et GameTime.xml de camelot.
- Les etats de bouton absents en 3.3.5 sont crees par chemin puis atlas
(MiniMapTrackingButton n'a qu'une HighlightTexture).
- La carte garde sa taille de 3.3.5 a l'echelle 198 / 140 : le moteur pose
les fleches du bord a un rayon fixe en unites de la carte. Leurs images
sont reduites d'autant, en 64 x 64 avec mipmaps (tools/reduire_fleches.py).
La fleche de groupe, sans methode, remplace le fichier d'origine dans
patch-Z (exception accordee a la regle du prefixe).
- Constantes regroupees en tables : le Lua 5.1 du client refuse plus de
60 upvalues par fonction.
- Banc : compilation Lua 5.1 de chaque fichier, et faux client qui ne donne
a un bouton que les etats que son gabarit 3.3.5 declare.
- blp.encoder accepte des mipmaps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ScrollBar.lua refait MinimalScrollBar -- 3.3.5 n a ni ce gabarit ni le
ScrollBox qui le pilote. La barre ne connait pas la liste : on lui donne
combien de lignes existent, combien tiennent et ou l on en est, et elle
rend le nouveau decalage. Elle s efface quand tout tient.
Ancrages de camelot : TOPLEFT sur le TOPRIGHT du ScrollBox (5, -2),
BOTTOMLEFT sur son BOTTOMRIGHT (5, 4).
LES TRANCHES SONT MESUREES, PAS DEDUITES DE LEUR NOM. Celle que la
source appelle thumb-bottom fait 8 x 36 et n est PAS un embout : son
alpha monte de 1 a 255, donc son haut est transparent, et posee au bas
du curseur elle le faisait fondre dans le noir de la glissiere. Les deux
bouts du curseur sont donc le MEME morceau, thumb-top, le second
retourne : le curseur est plein jusqu a ses extremites.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A la demande : camelot n a pas cet onglet -- son PAPERDOLL_SIDEBARS vaut
{STATS, EQUIPMENTMANAGER, PET} -- et l icone vient de mainline. La
disposition a trois, elle, vient de camelot : c est le DEUXIEME onglet
qui porte l ancre, le troisieme colle a sa droite et le premier a sa
gauche.
La liste prend toute la largeur du volet moins la marge des
statistiques, et le meme fond alterne qu elles. Le menu deroulant de
titre du client se tait a chaque passage : PlayerTitleFrame_UpdateTitles
le remontre des qu un titre change.
Le nom de la feuille suit le titre a UNIT_NAME_UPDATE, et non au clic :
SetCurrentTitle part au serveur, et UnitPVPName ne rend le nouveau nom
qu a la reponse.
Le TitleManagerPane de camelot est reste sur une ancre morte, sous la
bande de pierre : on prend celle de l EquipmentManagerPane.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PVPRankFrame.xml et pvprankframe.lua lus en entier. camelot tire tout de
C_MajorFactions -- le renom -- qui n'existe pas ici. Mais les trois
fonctions de l'epoque des rangs sont TOUJOURS dans le binaire, verifie dans
Wow.exe : UnitPVPRank, GetPVPRankInfo et GetPVPRankProgress. WotLK a
simplement cesse de s'en servir dans son FrameXML.
Heureuse coincidence : la planche c60 de camelot porte QUATORZE icones de
rang, exactement les quatorze rangs classiques. Son art est celui de
l'epoque.
Tout cet art vit sur une feuille que le listfile ne nomme pas :
ajouter_feuilles.py accepte desormais "fdid:<n>.blp => interface/...", et
retrouve ses entrees d'atlas par ce meme identifiant.
Trois ecarts assumes. La jauge circulaire n'est pas portable -- camelot la
fait avec un Cooldown dont il remplace la texture de balayage,
SetSwipeTexture, ABSENT du binaire ; l'anneau, la lueur, le fond de faction
et le badge sont poses, la progression s'ecrit en toutes lettres.
GameFontNormalMed2 n'existe pas. Le compte a rebours de saison demande un
C_SeasonInfo absent.
Le volet droit porte ce que WotLK sait vraiment donner : l'honneur.
Temoin : /fui pvp, qui dit ce que les trois fonctions rendent sur ce
serveur.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SkillsFrame.xml et skillsframe.lua lus en entier. Tout est commun avec la
reputation -- liste (10, -40) / (-25, 15), deux traits, retraits 0 / 2 / 46,
marges 10, ecart 3, survol a 0 / 0,10 / 0,20 -- sauf quatre choses :
* l'en-tete fait 26 et non 28 ;
* le nom d'une entree est a x = 2 et non 15, faute d'AccountWideIcon ;
* la description du volet droit est a -8 sous la jauge et non -6 ;
* LA BARRE EST BLEUE PAR SON SPRITE -- SetFillTextureByColorType(Blue)
suivi d'UpdateBarColor(WHITE_FONT_COLOR), donc aucune teinte. Le
remplissage bleu est cuit au masque comme le blanc.
Le texte de la barre est TOUJOURS la progression : rang / maximum, ou
rang (+bonus) / maximum avec le bonus en vert -- TryShowBarProgressText est
appele des l'initialisation. Et a l'ouverture, la premiere competence qui
n'est pas un en-tete est choisie, comme SelectFirstSkillIfNoneSelected le
veut.
Trois ecarts assumes : 3.3.5 n'a pas de sous-en-tete -- sa hierarchie n'a
qu'un niveau -- les lignes d'armes ne sont pas detaillees, faute des chaines
WEAPON_SKILL_DETAIL_*, et la description ne defile pas.
Temoin : /fui skills.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ReputationFrame.xml donne la liste -- TOPLEFT (10, -40) et BOTTOMRIGHT
(-25, 15) sur le volet gauche, deux traits UI-Character-Info-ScrollLine-Long
centres sur son haut et son bas -- et les gabarits : entree de 30, barre de
160 x 29 heritee de ColoredProgressBarTemplate, fond common-stat-bar-bg,
remplissage common-stat-bar-white teinte et haut de 15.
3.3.5 a les memes pieces sous d'autres noms : quinze ReputationBar<i>
ancrees une fois dans le XML, que ReputationFrame_Update ne fait que
remplir. On les repose une fois pour toutes et on se greffe apres lui pour
teindre, FACTION_BAR_COLORS donnant la couleur de chaque attitude.
Trois ecarts assumes, ecrits dans le fichier : pas de MaskTexture, donc les
bouts du remplissage restent carres ; un seul pas de ligne, la pagination du
client en exigeant un ; le nombre de lignes recalcule pour le volet, la
constante du client etant calee sur l'ancienne fenetre.
Un contenu peut se batir avant que la fenetre soit posee : la hauteur du
volet est prise par construction, la mesure ne servant que credible.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Elle se decidait a cinq : l'habillage, les deux onglets du volet, le repli
et la fonction des statistiques. Et l'habillage reposait TOUTE la geometrie
a chaque evenement. D'ou deux fautes que rien ne pouvait prevenir -- le
panneau du gestionnaire survivait a un changement d'onglet lateral, parce
qu'il appartient a NOTRE volet et non au PaperDollFrame du client ; les
barres de reputation traversaient ce volet, ReputationFrame gardant la
taille de la fenetre d'origine sans que personne ne le borne.
Panes.lua pose le modele de camelot : des HOTES, des GROUPES -- ce qu'un
onglet ouvre, un ecran entier -- et des PAGES, deux contenus qui se
partagent une surface. Un contenu se batit UNE fois, a sa premiere
ouverture, et ne fait ensuite que paraitre.
Les cadres du client ne sont pas reparentes : cela reinitialiserait niveau
et strate, et des reglages deja valides avec. Un contenu declare la liste
de ceux qu'il possede.
CharacterFrame_ShowSubFrame est le commutateur : le nom de l'ecran sert de
nom de groupe. La largeur de la fenetre devient une consequence -- l'hote
droit a-t-il quelque chose a montrer -- et le bouton de repli disparait la
ou il n'y a rien a replier.
Aucune mesure ne bouge : le banc le verifie sur vingt allers-retours, et
tous les essais de geometrie deja valides passent inchanges. /fui perso
rapporte desormais l'etat des hotes en tete.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fenetre de 525 x 495 sur IconSelectorPopupFrameTemplate : champ de nom
en haut, zone du choix courant a droite, grille en dessous. La grille
prend les valeurs de ScrollBoxSelectorMixin -- dix par rangee, boutons
de 36, ecarts de 10, marges de 5.
Tout le remplissage du client passe par quatre globales
(NUM_GEARSET_ICONS_PER_ROW, NUM_GEARSET_ICON_ROWS,
NUM_GEARSET_ICONS_SHOWN, GEARSET_ICON_ROW_HEIGHT) : les porter suffit,
rien du parcours des icones ni du defilement n'est reecrit. Le client ne
creant que quinze boutons, les soixante-cinq manquants sont crees sur son
propre gabarit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sur le releve de PaperDollFrame.EquipmentManagerPane et de
GearSetButtonTemplate : panneau sous la bande de pierre, bordure
common-insideframe, cartes de 169 x 44 en colonne avec leur fond
OutfitCard, leur icone cerclee, leur intitule et la coche des ensembles
portes, puis Equip, Save et New Set au bas.
Rien n'est recree : GearManagerDialog passe dans le volet, son art de
fenetre est efface, ses cartes se reposent et se rhabillent. Le client
garde la liste, la selection et les infobulles.
Ecarts documentes : New Set passe par le Save du client, Delete est
garde (3.3.5 n'a pas le menu de carte de camelot), la coche se calcule
depuis GetEquipmentSetLocations, et la liste defile a la molette faute
de MinimalScrollBar.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Un seul cadre pour tout le jeu : DropDownList1 et 2. camelot fait pareil
-- GetDefaultMenuMixin et GetDefaultContextMenuMixin rendent le meme
MenuStyle1Mixin -- donc l'habillage vaut pour tous les menus.
Saveur tranchee par l'art : les atlas common-dropdown-classic-* que cite
classic/ n'existent nulle part dans ce client, tandis que les
common-dropdown-* de mainline/ ont tous leur variante c60.
Fond common-dropdown-bg-c60 a (-10, 3) / (10, -3), alpha 0,925, a la
place des deux Backdrop d'epoque -- retires par SetBackdrop(nil), car
ToggleDropDownMenu relevera un cadre masque. Lignes de 20, police
GameFontHighlightLeft, case common-dropdown-ticksquare avec la coche
jaune par-dessus. Surbrillance et fleche de sous-menu etaient deja
identiques.
Deux feuilles versees : commondropdownc60 et commondropdown (la case et
la coche n'ont pas de variante c60).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le cadre, ses deux volets et les emplacements d'equipement. Le volet droit
(statistiques, onglets lateraux) et les autres onglets -- reputation,
competences, PvP, devises -- viendront ensuite.
Releve de camelot/ pour les trois fichiers, qui existent tous dans cette
saveur :
fenetre 631 x 484, PortraitFrameBaseTemplate comme les sacs
volet gauche 398, TOPLEFT (0, -20) au BOTTOMLEFT, fond -General-BG
volet droit 233 accroche a sa droite, fonds -Stat-BG et -Stat-StoneBG,
separateur common-framedivider de 11 pose a -6
emplacement 40 x 40, cadre UI-Character-Info-GearSlot a sa taille
colonne gauche TOPLEFT (24, -60), colonne droite TOPRIGHT (-20, -60),
ecart 6
armes au BOTTOM (-60, 30) du volet gauche ; distance et munitions en
27 avec -GearSlotSmall, munitions a +19
le modele occupe tout le volet gauche, comme la ModelScene de la source
Ecart assume : la source pose l'arme a (-40, 30) et masque la distance
quand celle-ci n'est pas montree ; 3.3.5 la montre toujours -- arc, arme de
jet ou relique selon la classe -- donc seule la variante a -60 sert.
Rien n'est recree : les emplacements sont des boutons du client, ils
portent le glisser-deposer de l'equipement.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
J'ai enfreint la regle de lecture des sources : AutoCastTemplates n'existe
que dans mainline/, et seuls camelot/ et shared/ font foi. L'anneau que
j'en avais tire -- coins fixes et fourmis tournantes -- est retire, avec
ses deux petites feuilles, sa table d'atlas et l'outil qui les produisait.
camelot garde ici le comportement de 3.3.5 : sa bordure scintillante et ses
quatre etincelles.
La regle est desormais ecrite en tete d'AMELIORATIONS : un fichier qui
n'existe que dans mainline/ n'est pas une source, c'est un point a trancher.
L'echelle, pas la taille : redimensionner le cadre des etincelles ne suffit
pas, le client les pose a une taille fixe et AutoCastShine_OnUpdate les
deplace sans les retailler -- d'ou des etincelles trop grosses sur un cercle
trop petit. SetScale(30/36) sur le cadre fait suivre tailles et orbite. La
bordure, elle, passe de 58 a 48,3.
Le piege de SetRotation reste note : il efface le rectangle d'atlas. Plus
aucun element ne tourne aujourd'hui, mais la note servira.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Il sortait en bruit. Le fichier n'y est pour rien : relu avec le decodeur
de l'atelier, uiactionbarfx.blp est identique a son apercu PNG. Ce qui le
distingue, c'est sa taille -- 2048 x 1024, alors que TOUTES les feuilles
que l'addon affiche correctement font 1024 au plus. C'etait la premiere de
2048 qu'on tentait d'afficher.
blp.py sait desormais aussi ECRIRE, dans la seule forme qu'ont les feuilles
deja versees : BLP2 non compresse en BGRA, sans mipmap. tools/petite_feuille.py
s'en sert pour redecouper des elements d'une trop grande feuille dans une
petite en puissance de deux, ecrire le .blp et son apercu, et generer
UIAtlas_07_petites_feuilles.lua -- charge en dernier, il redefinit ces noms,
UIAtlas.data etant une table plate.
Les fourmis et les coins de l'anneau tiennent dans 128 x 128. Le harnais
verifie leur provenance, pour que la grande feuille ne revienne pas.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Meme petit bouton que les postures -- 30 x 30, ecart 2, cadre 35 centre,
etats a 31,6 x 30,9 -- plus ce qui lui est propre :
anneau d'autolancement de 31 x 31 centre a (0,5 ; -0,5)
coins UI-HUD-ActionBar-PetAutoCast-Corners des que l'autolancement est
POSSIBLE
fourmis UI-HUD-ActionBar-PetAutoCast-Ants, debordant de 5 px, tournant de
-360 degres en 4 s, visibles seulement quand il est ACTIF
action active cochee ; l'attaque clignote et son coche tombe a 0,5 --
"a pleine alpha on croirait une capacite de plus selectionnee"
action inutilisable grisee a 0,4 ; sans texture, icone masquee
barre visible si PetHasActionBar() et UnitIsVisible("pet")
LE PIEGE DES SIGNATURES, DEUXIEME FOIS. GetPetActionInfo rend (nom, texture,
isToken, ...) chez le moderne et (nom, SOUS-TEXTE, texture, isToken, ...) en
3.3.5 : un champ de plus au deuxieme rang. Recopier la source au mot pres
prendrait "Rang 5" pour la texture. Le harnais le verifie sur une action qui
a un sous-texte, et sur un isToken dont la cle globale doit etre resolue.
La rotation des fourmis est rendue sans groupe d'animation : Texture
SetRotation existe dans ce client, l'angle se deroule dans un OnUpdate a la
meme vitesse. Le masque de l'anneau, lui, n'est pas reproductible.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Relevee de mainline/StanceBar.xml, shared/StanceBar.lua et du petit bouton
d'action (SmallActionButtonTemplate, SmallActionButtonMixin) :
bouton 30 x 30, ecart 2, pas de 32, une rangee, 10 au plus, vers la droite
cadre normal et enfonce en 35 x 35, OVERLAY, TOPLEFT
survol, coche, bordure et eclat en 31,6 x 30,9 ; le coche est le survol
en melange ADD
emplacement vide = -IconFrame-Background + -IconFrame-Slot
raccourci TOPRIGHT (-3, -4), quantite BOTTOMRIGHT (-3, 1)
recharge en retrait de l'icone : (1,7 ; -1,7) et (-1 ; 1)
forme active = bouton coche ; forme non lancable = icone a 0,4
barre masquee tant que GetNumShapeshiftForms() vaut 0
LE PIEGE : GetShapeshiftFormInfo ne rend pas la meme chose dans les deux
clients. Le moderne donne (texture, isActive, isCastable, spellID), 3.3.5
donne (texture, NOM, isActive, isCastable). Recopier la source au mot pres
prendrait le nom pour l'etat actif -- toutes les formes paraitraient
actives et aucune lancable. Le faux client suit la signature de 3.3.5 et le
harnais verifie l'un et l'autre, pour que l'inversion ne revienne pas.
Les boutons sont securises : rhabilles, jamais recrees, et rien n'est
redimensionne ni deplace en combat. La position s'enregistre dans
ForeverUI.Layout sous "postures", alignee par defaut sur le bord gauche de
la barre d'action, au-dessus de l'experience et de la reputation.
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>