- ForeverUIGlueRealmList.lua : la liste du client garde ses places, ses
tailles et sa logique ; en-tete DialogHeader, onglets uiframe-tab /
uiframe-activetab, croix 128-RedButton-Exit, Annuler / OK 128-RedButton,
barre de defilement minimale, polices de camelot (GlueFont*, Realm*)
- l'art herite que la liste moderne garde (HelpFrame, WhoFrame-ColumnTabs,
UI-SortArrow, UI-QuestLogTitleHighlight) reste : identique chez camelot
- croix de fermeture decoupee de 128redbuttonc60 (et sa lueur de
128redbutton) ; table d'atlas des ecrans d'accueil completee
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- GlueXML ForeverUI (data/glue) : cadre 2:1, polices, atlas, gabarits ;
connexion, menu, selection des personnages, dialogues, creation en deux
etapes (races et classes ; personnalisation numerotee, listes ouvrantes,
echantillons de couleur, apercu differe, nom en bas de l'ecran)
- choix valides calcules sur CharSections aux regles du moteur
(tools/choix_personnalisation.py) ; couleurs des echantillons lues dans
les textures du client (tools/couleurs_personnalisation.py), peau teintee
par la lumiere du decor
- decors de la creation et de la selection reduits a 0,912 pour compenser
le cadre 2:1 (tools/decors_accueil.py) ; deployer.py suit aussi
Interface\Glues\Models
- patcheur optionnel de Wow.exe (tools/patcheur, source et executable) :
CycleCharCustomization rend l'indice du reglage
- art des ecrans d'accueil (data/art), outils de decoupe, d'atlas et de
donnees
- barre du bas : boutons JcJ et Aide retires, bandeau a la largeur de ses
boutons
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- Mode agrandi (etape 4) : le plein ecran de WotLK habille a la camelot,
carte seule. Cadre aux dimensions de UpdateMaximizedSize, pose en haut au
centre dans l'unite de l'interface ; bordure sans portrait ; titre
WORLD_MAP ; fil d'Ariane, filtres, etages, coordonnees, boutons rouges.
La carte remplit le canevas par les constantes QUESTLIST / FULLMAP que
WotLK lit pour la fleche et les reperes ; bordure, menus et liste des
quetes du plein ecran de WotLK etouffes.
- Petite fenetre et mode agrandi partagent le meme ancrage.
- Selecteur d'etages : fond decoupe en trois (16 / 19), variante c60 ; nom
elide ; la liste ne descend pas sous la largeur du selecteur.
- Banc d'essai : plein ecran de WotLK et ses deux vues, essais du mode
agrandi et du selecteur.
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>
Un objet de police porte la SIENNE. GameFontNormalLeft est a gauche ;
GameFontHighlight, NumberFontNormal et NumberFontNormalSmallGray n ont
aucun justifyH -- donc CENTRE, releve dans le FontStyles.xml du client.
Un SetJustifyH pose a la creation, ou avant SetFontObject, ne survit
donc pas.
Dans la reputation, le nom se retrouvait centre dans une boite dont la
largeur change d un gabarit a l autre : il se deplacait horizontalement
au fil du defilement, selon le role que la ligne reprenait. Meme faute
dans les competences et les monnaies, ou le compte d une monnaie a zero
passait de RIGHT a CENTER avec GameFontDisable.
Et sur les boutons d action, ou le raccourci et la quantite sont cales
a droite dans le code mais etaient centres a l ecran. C est du code
VALIDE : le geste ne change pas l intention, il la retablit.
camelot le fait exactement ainsi, et c est ce qui le trahit :
<FontString inherits="GameFontHighlight" justifyH="LEFT">
Le faux du harnais ne touchait pas a justify : il est desormais fidele,
et c est lui qui a trouve la faute des boutons d action.
Co-Authored-By: Claude Opus 5 (1M context) <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>
Le reste -- ecarts, pieges, outillage, ce que 3.3.5 ne sait pas faire --
passe dans docs/NOTES.md, ou rien n a ete demande et ou tout m est
seulement utile.
AMELIORATIONS ne garde donc que les deux points demandes : l icone de
l onglet du familier, et le volet droit du PvP.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le nom d un rang se lit a l indice "numero + 4". A numero = 0 cela
donnait l indice 4 -- PVP_RANK_4, "Dishonored" -- et l ecran annoncait
donc deshonore tout joueur de moins de cinquante victoires. Or les
indices 1 a 4, Pariah, Outlaw, Exiled et Dishonored, sont les rangs
NEGATIFS, ceux qu on obtient en tuant des civils.
Trois cas desormais, et non deux : un vrai rang se nomme a numero + 4,
un indice de 1 a 4 se nomme par son indice tel quel, et le reste est un
civil.
Ecart assume : "Civilian" n est pas une chaine du client. Cherchee dans
GlobalStrings -- les quarante chaines de rang vont de PVP_RANK_0 a
PVP_RANK_19 -- et dans le binaire : absente des deux. Elle est donc
ecrite en clair, et ne se traduira pas.
AMELIORATIONS gagne une section 5 : l icone qui manque a l onglet du
familier, et le volet droit du PvP, a reprendre sur
CharacterFrameSidePaneTemplate comme les autres.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Un faux plus aimable que le client ne prouve rien. Six l etaient, et
chacun couvrait une faute que le jeu a montree :
IsTitleKnown rendait un booleen au lieu de 0 ou 1 -- et zero est VRAI
en Lua ; idem IsEnabled, qu un bouton desactive rend a 0.
FACTION_AT_WAR_COLOR etait inventee, alors qu elle n existe pas.
GetRegions oubliait les FontString.
UpdatePaperdollStats ne faisait rien, alors que le vrai remontre ses
lignes a chaque passage.
Les onglets CharacterFrameTab n avaient aucun OnClick : tout le chemin
de ToggleCharacter -- qui FERME la fenetre -- n etait jamais joue.
Les fleches de rotation faisaient 16 de large au lieu de 35, et leur
ecart se calcule sur leur largeur.
S y ajoutent les faux des nouveaux ecrans : titres, monnaies, familier,
monnaies suivies du sac, et le systeme de panneaux qui replace tout ce
qui est inscrit dans UIPanelWindows.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A la demande, donc une modification accordee d un ecran valide.
UpdateCurrencyFrames de camelot : le segment prend le bas de la fenetre
et c est la BOURSE QUI MONTE, son bas sur le haut du segment.
CalculateExtraHeight ajoute alors sa hauteur, et la fenetre grandit.
L encadre est ContainerFrameCurrencyBorderTemplate, deux bouts et un
milieu tendu, la planche commoncurrencybox entrant dans patch-Z. Les
jetons s enchainent vers la gauche, jusqu a MAX_WATCHED_TOKENS.
ManageBackpackTokenFrame reparente son propre segment dans le sac ET
lui pose BACKPACK_HEIGHT + 22, ce qui defaisait la hauteur calculee : on
masque le sien et on repasse derriere elle. Cocher "Show on Backpack"
passe par SetCurrencyBackpack et par rien d autre.
Les chiffres du segment sont d un cran au-dessus de ceux de camelot, a
la demande ; celui de la bourse ne bouge pas.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SetSwipeTexture est absent de 3.3.5 et la texture de balayage du Cooldown
est cablee dans le moteur : la remplacer changerait tous les temps de
recharge du jeu. Le cadran est donc coupe en quatre quarts ; un quart
depasse montre le quart de l anneau, le quart ou la jauge s arrete montre
un DEMI anneau tourne par SetTexCoord a huit arguments.
La cuisson recale le centre du cercle sur le centre du canevas -- une
texture qu on fait tourner decrirait sinon une boucle -- et interpole la
couleur ponderee par l alpha, sans quoi le blanc des texels vides bordait
l anneau d un lisere clair.
Verifie par la geometrie et non par l oeil : le harnais relit les
coordonnees posees et interroge l image sur 72 angles, pour sept
fractions.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
/fui micro a montre deux boutons, et eux seuls, ancres ailleurs que sur
notre bandeau : CharacterMicroButton a BOTTOMLEFT (552, 2) et
SocialsMicroButton sur le BOTTOMRIGHT de QuestLogMicroButton. C'est
exactement ce que fait VehicleMenuBar_MoveMicroButtons, appelee par
MainMenuBar_ToPlayerArt ET MainMenuBar_ToVehicleArt -- donc a chaque entree
ou sortie de vehicule. On repose apres elle, et a chaque passage general.
MainMenuBar avalait les clics a son tour : declaree enableMouse="true" et
couvrant tout le bas de l'ecran, son art remplace par le notre mais sa
souris intacte. Meme remede que pour BonusActionBarFrame.
La lecon se generalise : tout contenant du client qu'on vide garde sa
souris, et il faut la lui retirer.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
/fui micro a nomme le coupable : les dix boutons sont exactement a leur
place, un seul ancrage chacun, et GetMouseFocus rend BonusActionBarFrame.
Elle est declaree 505 x 43, strate HIGH, toplevel, avec enableMouse="true".
Effacer son art la rend invisible mais PAS inoffensive : elle reste une
dalle au-dessus du bas de l'ecran et avale les clics de tout ce qu'on y a
pose -- le bouton du personnage ne repondait plus.
C'est le meme piege que CharacterModelFrame sur les emplacements
d'equipement, et le meme remede : un cadre qui ne sert que de contenant n'a
pas a recevoir de clic. Ses douze boutons gardent le leur, etant des cadres
fils.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
/fui pvp a tranche : UnitPVPRank rend 0 sur ce serveur et GetPVPRankInfo ne
repond rien. Le "1" du haut n'etait pas un rang mais la SAISON d'arene,
ecrite sans intitule juste au-dessus. Trois corrections.
LE DECALAGE, enfin etabli. UnitPVPRank rend un INDICE, et je n'avais aucun
usage de reference pour en deduire le numero -- WotLK ne s'en sert plus.
L'ordre des quarante chaines le tranche : PVP_RANK_1..4 sont les rangs
NEGATIFS (Pariah, Outlaw, Exiled, Dishonored), PVP_RANK_5 est Scout /
Private donc le rang 1, PVP_RANK_10 est Stone Guard / Knight donc le rang 6.
L'indice est la cle telle quelle, et le numero vaut l'indice moins quatre.
Le nom se lit donc dans ces chaines, comme GetPVPRankText le fait chez
camelot.
LA SAISON porte son intitule : ARENA, ce que le client a de plus proche
d'EXPANSION_SEASON_NAME, absent.
SANS RANG, PAS D'ANNEAU : un cercle dore vide se lit comme un defaut. Le
cadran garde sa lueur, son fond de faction et l'embleme.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A LA DEMANDE, et non d'apres la source : camelot ecrit les deux en haut --
PVP_RANK_NUMBER_AND_TITLE donne "Rang N : Nom" dans le CurrentRankField --
puis repete le numero dans l'anneau de recompense, par LevelLabel.
Ici le titre reste seul en haut, et le numero n'est qu'a un endroit : dans
le cercle dore.
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>
A la demande, l'onglet valide recoit le traitement des competences : toutes
les regions ET tous les cadres fils du ReputationFrame du client sont
masques a chaque passage, sans enumeration a tenir a jour. Sa liste a
ascenseur, ses intitules de colonne et ses traits d'arborescence partent
avec.
Deux consequences : les deux traits de liste ont migre sur NOTRE panneau,
hors d'atteinte du balayage, et le balayage de construction devient inutile
-- celui de chaque passage le fait deja, des le premier.
Le cadre de detail echappe au balayage : il a change de parent et vit dans
le volet droit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Il ne s'agissait pas que de ses lignes. SkillFrame declare aussi un bouton
de tri, un "tout replier", son cadre de depliage et ses trois tuiles, deux
boutons accepter / annuler, sa liste a ascenseur, et tout un cadre de detail
-- ScrollFrame, ScrollChildFrame, StatusBar. Les enumerer serait une liste a
tenir a jour et a oublier.
On masque donc TOUT ce que ce cadre porte et qui n'est pas a nous :
GetRegions ne rend que les textures, GetChildren que les cadres fils -- il
faut les deux, et a chaque passage, SkillFrame_UpdateSkills remontrant les
siennes.
Consequence : nos deux traits de liste sont crees sur NOTRE panneau et non
sur le cadre du client, sinon le balayage les emporterait.
Le faux client ne connaissait pas les cadres fils -- il rendait GetRegions
mais pas GetChildren, et l'essai ne pouvait pas s'ecrire. Chaque cadre tient
desormais la liste des siens, que SetParent met a jour.
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>
Le OnClick du client appelle SetFactionInactive(GetSelectedFaction()), qui
DEPLACE la faction dans le bloc des inactives : tout se renumerote, et
l'indice retenu designait alors une autre ligne.
Le detail suit donc le NOM -- comme la marque de la liste depuis le repli --
et retrouve l'indice a chaque passage, qu'il repose au client pour que ses
trois cases agissent sur la bonne faction. Si la faction quitte la liste, le
volet garde ce qu'il montrait plutot que de se vider.
Et sans faction choisie, le volet droit est VIDE : c'est l'etat de depart.
La source de verite est notre nom retenu, pas GetSelectedFaction, que le
client peut laisser pointer n'importe ou.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Les trois cases partagent le meme fond, checkbox-minimal, mais pas la meme
coche. AtWarCheckbox porte Interface/Buttons/UI-CheckBox-SwordCheck -- deux
epees croisees, en 32 posees a (3, -5) -- tandis que MakeInactiveCheckbox et
WatchFactionCheckbox prennent checkmark-minimal, centre.
Les epees avaient ete donnees aux trois.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deux corrections d'un meme geste.
LA COULEUR. camelot declare fontName = GameFontNormal sur son
ScrollingFontTemplate, mais cet objet de police est DORE en 3.3.5 -- c'est
celui des titres. Le blanc y est GameFontHighlight, et c'est ce que montre
la reference.
LE REPLI. Un texte n'a de quoi revenir a la ligne que s'il a une BOITE.
Ancree par son seul haut et ses deux cotes, la description n'avait pas de
bas : un peu longue, elle n'avait nulle part ou aller et disparaissait. Elle
a maintenant ses quatre bords -- du bas de la jauge au haut des trois
cases -- et se replie dedans.
Le faux client retient desormais SetWordWrap et SetJustifyV, pour que le
banc puisse le verifier.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ReputationDetailFrame porte un fond de fenetre declare en <Backdrop> --
UI-DialogBox-Background et UI-DialogBox-Border, avec ses marges et sa taille
de tuile. Un fond de ce type ne figure PAS dans GetRegions : le balayage des
textures ne l'atteignait pas, et son cadre gris restait a l'ecran.
SetBackdrop(nil) l'enleve, comme pour les listes de menu. A verifier sur
tout cadre du client que l'on reprend : les deux facons de poser un fond
demandent deux gestes differents.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CharacterFrameSidePaneTemplate donne la surface -- TOPLEFT (16, -14) et
BOTTOMRIGHT (-12, 14) sur l'hote droit -- puis le titre large de 195 et
centre, le sous-titre, un UI-Character-Info-ScrollLine et la description.
ReputationDetailFrame y ajoute une StandingBar de 180 x 29 et trois cases de
26 empilees depuis le pied : la premiere a x = -4, les suivantes a (0, -2),
fond checkbox-minimal, coche UI-CheckBox-SwordCheck en 32 posee a (3, -5),
intitule large de 158 a +2, celui d'At War en rouge.
C'est le CLIENT qui remplit : ReputationFrame_Update ecrit le nom, la
description et l'etat des trois cases pour la faction que
SetSelectedFaction designe, et seulement si son cadre de detail est visible.
Cliquer une ligne le lui dit donc, puis relit ce qu'il a pose. Les trois
cases restent les siennes -- elles portent la declaration de guerre, le
rangement parmi les inactives et le suivi sur la barre du bas.
Deux ecarts assumes : GameFontNormalMed3 n'existe pas en 3.3.5, et la
description de camelot defile la ou la notre est simplement bornee.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Releve par /fui reput : le client annonce NEUF factions et repond encore a
la DIXIEME -- l'en-tete "Inactive", hors du compte. Sa propre boucle le sait
et teste factionIndex <= numFactions ; la notre lisait tant que
GetFactionInfo repondait, et posait une ligne de plus.
C'est ce qui rendait le repli incomprehensible : la liste raccourcit, mais
nous continuions a lire au-dela du compte, la ou le client rend des entrees
d'un autre bloc. Un sous-en-tete paraissait alors hors de sa categorie, et
vide.
Le faux client reproduit desormais ce piege -- il repond a l'indice qui suit
son propre compte -- sinon l'essai ne prouverait rien.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Replier RACCOURCIT la liste, il ne masque pas : CollapseFactionHeader retire
les enfants de la numerotation du client, GetNumFactions diminue et tout ce
qui suit remonte d'un cran. C'est ainsi que 3.3.5 et camelot fonctionnent
tous les deux.
Ce qui n'allait pas venait d'ailleurs, et de deux endroits.
Le defilement etait borne APRES la pose : replier en bas de liste laissait
un passage entier pose depuis un decalage devenu trop grand -- des lignes
vides, ou les mauvaises factions, jusqu'au passage suivant. On borne
maintenant, et on repose si cela a bouge.
La selection se retenait par un INDICE, qui ne survit pas a un repli : les
factions se renumerotent et la marque changeait de ligne. Elle se retient
par le nom, seule cle stable, GetFactionInfo ne rendant pas de factionID en
3.3.5.
Le faux client se contentait d'un drapeau : il renumerote desormais comme le
vrai, et le banc verifie les deux sens ainsi que la marque apres un
aller-retour.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SetElementFactory choisit selon deux drapeaux : ni en-tete ->
ReputationEntryTemplate, 30 ; en-tete et pas un enfant ->
ReputationHeaderTemplate, 28 ; en-tete ET enfant ->
ReputationSubHeaderTemplate, 22. SetElementIndentCalculator donne le
retrait : 0 pour un en-tete de premier niveau, 46 pour un enfant qui n'est
pas un en-tete, 2 pour tout le reste. SetPadding ajoute 10 de marge sur les
quatre bords et 3 entre deux lignes.
3.3.5 rend les trois drapeaux qu'il faut : isHeader en neuvieme position,
hasRep en onzieme, isChild en treizieme. Les hauteurs variant, la liste ne
se divise plus : elle s'empile jusqu'a la marge du bas.
Deux corrections venues de la meme lecture : le nom d'une entree est a 15 et
non 25 -- Initialize le decale de -10 quand l'AccountWideIcon est masquee,
ce qu'elle est toujours ici -- et un sous-en-tete ancre son nom a +4 de son
bouton, pose a x = 28, en ne montrant sa barre que s'il porte de la
reputation.
ENFIN : le client remontre ses propres lignes a chaque passage --
ReputationFrame_Update finit par factionRow:Show() sur chacune des quinze.
Les masquer a la construction ne suffisait pas, elles revenaient avec tout
leur art d'epoque. C'est pourquoi certaines reputations echappaient au
theme.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le remplissage cuit sortait en 320 x 30 : en jeu, la barre devenait un bloc
uni que la teinte de la faction coloriait -- d'ou des jauges entierement
vertes. Tout l'art d'interface du client d'origine est en puissance de deux
-- verifie : 256 x 256, 256 x 64, 16 x 16 -- et il ne sait visiblement pas
echantillonner autre chose.
La cuisson sort desormais en 512 x 32, largement le double de la taille
affichee (160 x 15), et la lecture reste en 0..1. cuire_masque.py REFUSE
maintenant d'ecrire une autre taille : le defaut est muet a l'ecriture et ne
se voit qu'en jeu.
Le temoin /fui reput a servi a ecarter : fractions proportionnelles, teinte
conforme a FACTION_BAR_COLORS, en-tetes sans barre. La logique etait juste.
Le fond neuf-tranches a ete rendu hors du jeu pour l'ecarter a son tour.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camelot le decoupe par common-stat-bar-Mask, une MaskTexture ancree LEFT et
RIGHT sur la barre -- donc tendue sur toute sa largeur -- a sa hauteur
d'atlas, 29. Sans elle, le remplissage avait des bouts carres qui ne
suivaient pas le contour du fond.
tools/cuire_masque.py multiplie donc l'alpha du masque dans le sien, une
fois pour toutes. Et il le DECOUPE comme notre fond : celui de camelot
s'etire avec la barre, le notre garde ses bouts a 10 px et n'etire que le
milieu -- un masque tendu ne coinciderait plus avec lui.
Le resultat est un fichier a lui seul, calcule pour une barre de 160, qu'on
rogne a la fraction voulue comme le fait SetFillPercent.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
common-stat-bar-bg mesure 68 x 30 et la barre en fait 160 : etire, ses bouts
arrondis s'allongeaient. La mesure se prend sur l'art -- la premiere colonne
dont le profil vertical rejoint celui du milieu, c'est-a-dire ou le bord est
fini : elle tombe a 10. La hauteur ne changeant pas, seules les tranches
horizontales du milieu s'etirent.
Le remplissage, lui, reste une seule texture : c'est une jauge, que
SetFillPercent rogne a la fraction voulue, et la decouper en ferait un
cadre. La compression horizontale de sa feuille -- 240 pour une barre de
160 -- est celle de la source.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ReputationHeaderTemplate la pose sans ancrage, donc etiree sur toute la
ligne : a 64 x 29 pour une ligne de plus de trois cents, ses coins arrondis
s'etalaient en ellipses.
Mesure prise sur l'art -- l'alpha de la colonne de gauche -- l'arrondi court
sur une dizaine de pixels. Un coin de 12 le couvre et reste sous la moitie
de la hauteur, au-dela de quoi les tranches se chevaucheraient. La plaque
passe donc par CreateNineSlice, et le banc compte ses neuf tranches.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Trois tentatives pour reposer et rhabiller les quinze ReputationBar<i> de
3.3.5, trois echecs de la meme nature : ReputationFrame_Update ne remplit
pas, il REPOSE son art a chaque passage -- SetNormalTexture sur les boutons,
les AtWarHighlight additifs, les traits d'arborescence, la texture de la
StatusBar -- et le clic en declenche un. Chaque correction tenait jusqu'au
passage suivant.
Les lignes sont donc les NOTRES, baties d'apres les gabarits lus en entier
et remplies depuis GetFactionInfo, la seule chose que 3.3.5 apporte ici :
en-tete 28 plaque common-button-list-collapseExpand etiree, nom en or a
LEFT x = 10, fleche plus/moins a RIGHT (-8, -1)
entree 30 barre 160 x 29 a RIGHT x = -3 -- fond common-stat-bar-bg,
remplissage common-stat-bar-white haut de 15 teinte par
FACTION_BAR_COLORS, texte centre -- et nom en blanc de x = 25,
le bord droit de l'AccountWideIcon, au LEFT de la barre moins 10
survol trois tranches, cotes de 6, aux alphas de
RefreshBackgroundHighlightOpacity : 0 / 0,10 / 0,20, et
0,50 / 0,65 / 0,85 en guerre
A l'attitude maximale la barre est pleine et sans texte de progression,
comme InitializeBarForStandardReputation le veut ; au survol elle montre la
progression au lieu de l'attitude.
Lecon : quand un ecran du client se repose lui-meme, on ne le rhabille pas,
on le remplace.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Trois erreurs, une seule cause : lire un bout du XML de camelot et le plaquer
sur les cadres de 3.3.5, au lieu de lire le gabarit en entier avant d'ecrire.
ReputationEntryTemplate donne tout : barre ancree RIGHT x = -3, nom en
GameFontHighlight de hauteur 15 allant de x = 25 -- le RIGHT de
l'AccountWideIcon, large de 23 et posee a LEFT x = 2 -- jusqu'au LEFT de la
barre moins 10, et intitule d'attitude centre sur la barre par un LEFT plus
un RIGHT. Tout cela est desormais pose tel quel.
Et l'art du client revient a CHAQUE mise a jour : ReputationFrame_Update
rappelle SetNormalTexture sur les boutons et remontre la texture de la
StatusBar, les deux AtWarHighlight additifs et les traits d'arborescence.
L'etouffer une fois a la construction ne suffisait pas -- l'image reprenait
sa taille declaree, 16 x 16 ancree a LEFT +3 pour une ligne de 20, et se
superposait a la notre. C'est ce qui deformait les plus et les moins et
faisait sortir les barres de leur cadre. On repasse apres lui a chaque fois.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le troisieme argument de SetAtlas veut dire "ne touche pas a la taille" : il
ne vaut que si on la pose soi-meme juste apres -- un SetAllPoints, un
SetWidth, un second ancrage. Pose sur une texture sans dimension ni second
point, il la laisse s'etaler sur tout son parent.
Les deux traits de liste de la reputation etaient dans ce cas : une immense
bande doree par-dessus l'ecran. La fleche plus/moins aussi, en plus discret.
Les deux reprennent leur taille d'atlas -- 384 x 8 et 13 de large -- et le
banc les verifie.
Les appels du reste de l'addon sont tous suivis d'un dimensionnement :
c'etait bien l'usage, mal repris.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
common-button-list-collapseExpand n'est PAS une fleche : c'est le fond d'une
ligne d'en-tete, une plaque arrondie de 64 x 28 que ReputationHeaderTemplate
pose sans ancrage, donc etiree sur toute la ligne. Posee a sa taille d'atlas
sur un bouton de 20, elle se repetait sur chaque ligne et recouvrait les
noms.
La vraie fleche est le StateIcon du meme gabarit, que ReputationHeaderMixin
remplit avec common-button-list-plus ou -minus, ancre RIGHT en (-8, -1) --
a droite de la ligne, et pas a gauche.
Un en-tete porte donc sa plaque, son nom a LEFT x = 10 et sa fleche, mais
aucune barre : celle-ci appartient aux entrees. GetFactionInfo rend isHeader
en neuvieme position, et c'est lui qui decide.
Lecon notee : un nom d'atlas ne dit pas ce que l'art contient. Le recadrage
d'un sprite depuis sa feuille prend dix lignes et evite cette erreur.
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>
A LA DEMANDE, et non d'apres la source : camelot y met le portrait du
joueur -- CHARACTER_MODE_TAB_ICONS laisse la premiere entree a nil et
UpdateCharacterModeTabPortrait appelle SetPortraitTexture.
Une icone de classe demande un fichier par classe : les dix de 3.3.5 sont
versees depuis Interface/ICONS/ClassIcon_<classe> et cuites au masque comme
les autres, meme echelle et meme contour. Le jeton vient du second retour de
UnitClass et nomme le fichier ; la casse est sans importance, une archive
adresse ses fichiers par un condense insensible a la casse.
Le bouton Character Info du volet droit garde le portrait : il n'etait pas
concerne.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Un onglet est plus large que ce qu'on en voit : son art porte une langue a
gauche, qui vient se glisser sous la fenetre. Le fond de l'onglet y est
sombre et passait inapercu, mais le survol et le marqueur d'actif sont des
CONTOURS qui tracent toute la forme, langue comprise -- ils s'affichaient
donc par-dessus le metal du volet droit.
Aucun niveau n'etait fixe sur ces cadres : rien ne garantissait l'ordre. La
barre prend le niveau du cadre et les onglets un cran au-dessus, assez pour
couvrir le fond du panneau et pas assez pour atteindre l'habillage, qui vit
a NIVEAU_ART. Le banc verifie l'encadrement des trois niveaux.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
reprennent leur taille
DEUX CONSTANTES PORTAIENT LE MEME NOM. ONGLET_ICONE valait 28 pour les deux
onglets du volet droit -- Character Info et Equipment Manager. En portant
l'icone des onglets LATERAUX a 50, une seconde declaration du meme nom a ete
posee plus bas : en Lua elle masque la premiere pour tout ce qui suit, et
creerOngletVolet vient apres. Les deux boutons du volet s'etaient donc
agrandis sans qu'on l'ait demande.
Les noms sont maintenant distincts -- ONGLET_VOLET_ICONE et
ONGLET_LATERAL_ICONE -- et le banc verifie les deux tailles separement.
La colonne d'onglets se decale d'un pixel vers la droite, a la demande.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le masque est BINAIRE -- releve sur l'art, sa ligne du milieu passe de 0 a
255 d'un texel a l'autre. Le client l'applique a la resolution de l'ecran,
ou cette marche est fine ; cuite a 64 px elle devenait un escalier que
l'agrandissement de l'interface etalait sur deux ou trois pixels reels.
Le masque est donc INTERPOLE au lieu d'etre lu au texel le plus proche, et
pris dans sa version 2x. La cuisson sort a 128 x 128, pour que le contour
ait de quoi s'adoucir.
Premiere tentative ecartee : seize echantillons par texel tombaient tous
dans le MEME texel du masque -- a cette echelle, la fenetre est plus fine
qu'un texel de masque. C'est le masque qui porte la marche.
Le contenu de l'icone ne peut pas s'ameliorer : 64 x 64 est tout ce que le
client possede -- les quatorze fichiers voisins sont tous de cette taille --
et camelot affiche exactement les memes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camelot decoupe l'icone d'un onglet par une MaskTexture -- common-sidetab-
mask -- et 3.3.5 n'en a pas : les angles restaient carres. Ce que le client
ne sait pas faire a l'ecran, tools/cuire_masque.py le fait avant.
La geometrie vient de la source et non d'une estimation : onglet 55 x 55,
masque 55 x 60 ancre au centre, icone 50 x 50 en (-3, 0) rognee a 0,03125 ;
hors du masque, CLAMPTOBLACKADDITIVE donne zero.
Deux dossiers : icons/ garde l'export brut -- provenance et entree de la
cuisson -- TabIcons/ porte les versions cuites, et c'est celles-la qu'on
affiche. Relancer l'outil refait les secondes a partir des premieres, sans
wow.export.
L'outil ecrit aussi l'apercu PNG que l'atelier exige a cote de chaque .blp :
ceux qui viennent du client sortent de wow.export, une image que NOUS
fabriquons n'a personne pour la produire.
Le portrait du personnage garde ses angles vifs : son icone n'est pas un
fichier, SetPortraitTexture la repose a chaque changement d'apparence.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>