Les trois blocs commencent 2 px sous la pierre (au lieu de 10) et
chaque bloc est resserré : ses lignes partent 3 px sous le menu
déroulant, dans l'ombre de son fond, au lieu de 11. Écart entre blocs
inchangé (12) ; les lignes gardent leurs 13 px et leurs rayures.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Un troisième sélecteur de catégorie, identique aux deux du client (même
menu déroulant, mêmes six lignes StatFrameTemplate remplies par
UpdatePaperdollStats), dans les 25 px gagnés sur la pierre. Son choix
est gardé dans ForeverUIDB.statThirdCategory ; par défaut, une catégorie
que les deux autres n'affichent pas (sorts pour les lanceurs de sorts,
distance pour le chasseur). Il suit les mises à jour du client.
L'écart entre deux groupes passe de 16 à 12 pour que les trois tiennent.
- La pierre de 60 devient un cadre de 233 x 60 portant ses deux morceaux :
le gestionnaire d'équipement et la page des titres, ancrés sous elle,
s'arrêtaient à 30 px du haut et prennent maintenant toute la hauteur
libérée.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Camelot 1.60.1.70450 :
- La ligne de niveau et de classe quitte le volet droit pour un bandeau
rocheux de 36 en haut du volet gauche (TopBackgroundStripHost :
UI-Background-Rock, liseré _UI-Frame-InnerTopTile), centrée à (0, -2),
police contourée de 14 (GameFontNormalMed2Outline), « Niveau 80 » puis
la classe dans sa couleur (PLAYER_LEVEL_NO_SPEC). Le bandeau est un
mobilier du personnage ; le modèle commence dessous, ses flèches de
rotation passent à TOP (0, -40).
- La pierre du volet droit passe de 85 à 60 (StoneBG3), tirée du haut et
du bas de StoneBG, sans art nouveau ; statistiques et titres gagnent
25 px.
Les deux sélecteurs de catégorie de statistiques deviennent le menu
déroulant de camelot (WowStyle1DropdownTemplate par Tpl.MenuStyle1 :
fond common-dropdown-textholder, flèche à états, texte à gauche) au lieu
de l'en-tête UI-Character-Info-Title ; le menu et ses catégories restent
ceux du client.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Listes de réputation, compétences et statistiques : une ligne qui ne tenait
plus était cachée, mais la boucle continuait, et une ligne plus courte plus
loin (un en-tête après une entrée) prenait sa place, hors d'ordre. Rien
n'est plus placé après la première ligne qui ne tient pas.
Statistiques : la page possédait les douze lignes et les réaffichait toutes
après chaque mise à jour, y compris la sixième que le client cache pour la
catégorie Distance (les chasseurs par défaut), avec le contenu de la
catégorie d'avant. Elle possède désormais leur parent, CharacterAttributesFrame.
Ensembles : le panneau était créé visible, et GearManagerDialog_Update
(ensemble porté depuis une barre, /equipset) pouvait le construire avant
la première ouverture de sa page, par-dessus les statistiques. Il naît
caché, et sa page le connaît même ouverte en combat.
L'ordre d'affichage et le dernier ensemble porté étaient au compte, alors
que les ensembles sont à un personnage : ouvrir la page sur un autre
personnage élaguait l'ordre du premier. Ils sont rangés par personnage, et
le premier usage reprend les anciennes valeurs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KxRZNHkq453dyUMcWsyUf1
Ensembles d'équipement : le crochet qui abandonne une modification sur
Annuler ou Échap visait la globale GearManagerDialogPopup_OnHide, que le
XML lie directement (function=) : il ne se déclenchait jamais. La session
restée ouverte faisait de la sauvegarde suivante une modification : l'ancien
ensemble était rééquipé, enregistré sous le nom tapé, puis supprimé. Le
script du cadre est désormais greffé (comme Taxi.lua).
Réputation : la description et les trois cases venaient de la liste du
client, qui ne les remplit que pour ses 15 lignes visibles ; cachée et
jamais défilée, elle laissait à partir de la 16e faction celles de la
précédente, et un clic agissait sur la nouvelle à contresens (en guerre,
barre suivie). Elles sont lues sur la faction elle-même.
Combat : PetPaperDollFrame, et donc CharacterFrame, sont protégés par les
boutons de compagnon sécurisés. Les masquer, les déplacer ou retailler la
feuille depuis l'addon en combat était bloqué : à chaque rafraîchissement
du familier (PET_BAR_UPDATE...), à chaque ouverture de la feuille, à chaque
onglet. Ces appels attendent la fin du combat ; Panes n'appelle plus Show
ou Hide sans changement, que le client refuse aussi.
Performance : les événements d'unité de la feuille (inventaire, portrait,
modèle) ne relancent plus toute la mise en page pour les autres unités ni
feuille fermée ; l'onglet du familier ne réagit plus qu'à son familier ;
l'onglet des statistiques relit l'arbre au plus deux fois par seconde.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KxRZNHkq453dyUMcWsyUf1
Traduction
- Identifiants en anglais dans tout le module : addon, ecrans d'accueil,
outils Python, banc d'essai et patcheur C#.
- Fichiers au nom francais renommes (Gabarits.lua -> Templates.lua,
Textes_*.lua -> Texts_*.lua, deployer.py -> deploy.py,
tools/patcheur -> tools/patcher, etc.).
- Commandes /fui et options de deploy.py en anglais (--check, --server,
--remove-dbc).
- Cles des variables sauvegardees et de data/dbc/statistics.json
traduites, sans reprise des anciennes cles.
- API de la micro-barre : ForeverUI.AddMicroButton(def) avec les champs
name, atlasSet, after, tooltip, onClick, ready, et
ForeverUI.UpdateMicro(name, isOpen).
- Commentaires reecrits en anglais, courts, sans dates ni historique ;
les fonctions au nom peu parlant et leurs parametres sont expliques.
Code mort
- Exports, fonctions et variables jamais lus retires.
- Retires a la demande des modules : ForeverUI.PvPJauge, les exports
FondEntete / TuilerEntete / Polices de TradeSkill, l'art legacy-up-c60,
honorfill(half)blue et inv_misc_book_09, leurs entrees d'atlas et les
parties d'outils correspondantes.
Verifications : liaisons des noms comparees avant et apres, banc vert,
chemins de textures inchanges, generateurs reproduisant les fichiers,
patcheur identique octet pour octet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Onglet Statistics (StatisticsTab.lua, nouveau)
- Le StatisticsFrame de camelot sur les statistiques de hauts faits du
client (GetStatisticsCategoryList, GetCategoryInfo, GetStatistic) :
categories repliables, sous-categories au bouton campaign_headericon,
survol, barre de camelot masquee si inutile, mise a jour sur
CRITERIA_UPDATE ; l'etat replie survit aux mises a jour.
- Valeurs telles que le client les rend (noms des statistiques
« ... most », montants d'or avec leurs pieces), « -- » sans valeur ;
colonne de la valeur elargie a ce qu'elle porte.
Statistiques de camelot ajoutees aux hauts faits (data/dbc/statistiques.json)
- 14 boss de donjons classiques et 4 statistiques de raids a 20 / 40
joueurs (entrees ; morts, en somme des morts sur les cartes de cette
taille), suivies par le coeur.
- deployer.py, etape dbc (--dbc, --retirer-dbc, --serveur) : lignes
ajoutees au DBC du client dans patch-Z, DBC du serveur recopie du client,
lignes d'achievement_criteria_data (une creature tuee n'est comptee que
si son critere y a une ligne) ; --verifier les controle.
- tools/foreverui/dbc.py : ajout et retrait de ses seules lignes DBC.
Micro-menu et exports pour les autres addons (session Progression)
- BottomBar.lua : ForeverUI.AjouterMicroBouton(def) et
ForeverUI.MajMicro(nom, ouvert) ; ForeverUI ne connait plus aucun
addon qui y ajoute un bouton.
- ForeverUI.PvPJauge (jauge circulaire, textures au choix),
ForeverUI.StatusBarsPoser, exports de TradeSkill.lua.
- Art : legacy-up-c60 (et son masque), honorfill(half)blue,
inv_misc_book_09 ; cuire_masque.py, cuire_portrait.py,
decouper_elements.py.
Banc : essais de l'onglet Statistics et d'un micro-bouton d'un autre addon.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- hauts faits (Achievements.lua) : camelot n'en a pas, la fenetre du
client se deplace par son en-tete, place gardee et reposee apres
UpdateUIPanelPositions
- tutoriel (Tutorial.lua) : fenetre, bouton d'alerte et compteur masques
- horloge (TimeManager.lua) : ButtonFrameTemplate 220 x 240, globe en
portrait, encart, menus d'alarme en style 1 (Gb.MenuStyle1), case
d'alarme
- carte de zone (ZoneMap.lua) : cadre battlefieldminimap-border, croix
rouge, alpha suivant l'opacite (image retiree : le client la repose)
- cabine d'essayage (DressUp.lua) : ButtonFrameTemplate 450 x 545, fond de
race, fleches et rotation a la souris
- inspection (Inspect.lua) : 338 x 424, deplacable, portrait 48, onglets
lateraux, page du personnage a la camelot (cadre Char-Paperdoll), page
JcJ en cartes avec en tete le nom du rang et l'embleme de la faction
sous son insigne, Civilian sans rang ni donnees ; bouton Talents
- talents de l'inspecte (Talents.lua) : notre fenetre en lecture seule,
compacte (colonnes de 260, sans portes ni bande du bas), sans recherche
ni points ; elle ne suit pas l'inspection
- JcJ (PvPTab.lua) : seuils de rang lus du serveur (canal d'addon
PVPTITLES de mod-pvp-titles-ext : RANKS, REQ), sans serveur les seules
victoires ; etat Deshonore (DISHONOR) : rang et temps restant, blason
brise de la faction a la place de l'embleme
- debuff Deshonore dessine par ForeverUI en tete des affaiblissements
(Buffs.lua), aucun sort ni DBC requis
- art : blasons brises honor-dishonored-alliance / -horde (cuits par
tools/cuire_deshonneur.py), battlefieldminimap, char-paperdoll-*
- /fui croix : temoin de la croix de la feuille de personnage
- banc : inspection, talents compacts, tete JcJ, canal du serveur, blason
brise, debuff dessine, temoin de la croix
- README : lignes JcJ, fenetres secondaires, ameliorations et affaiblissements
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- socle : Textes.lua (ForeverUI.L) et ForeverUIGlueTextes.lua (G.L) ; les
textes dans Textes_enUS / Textes_frFR (325 cles en jeu) et
ForeverUIGlueTextes_enUS / _frFR (41 cles aux ecrans d'accueil) ; une cle
absente prend l'anglais, une langue sans fichier lit l'anglais ; ajouter
une langue = un fichier de plus
- les textes que le client 3.3.5 connait se lisent dans ses globales
(GlobalStrings, GlueStrings en glue) ; les textes de secours sont retires
- tous les fichiers repris : libelles, infobulles, mode edition, messages et
aide de /fui, erreurs internes ; .toc : Notes + Notes-frFR
- selection des personnages : race et classe traduites ramenees a leur jeton
par les tables de langue (GetAvailableRaces / GetAvailableClasses font
planter le client hors de la creation)
- tools/cartes_instances.py : noms des instances dans toutes les langues de
la LibBabble-Zone de WDM (portails de la carte sur tout client)
- banc : toute cle employee existe en anglais et en francais, memes cles dans
les deux, bascule frFR / deDE essayee ; chaines 3.3.5 ajoutees au faux client
- README : etat des sections mis a jour, langues, glue, deploiement --glue
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>
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>
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>
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>
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>
LargeSideTabButtonTemplate empile quatre choses : common-sidetab en fond,
l'icone, common-sidetab-SELECTED en OVERLAY pour l'onglet actif, et
common-sidetab-hover en HIGHLIGHT pour le survol seul. Le marqueur d'actif
n'etait pas pose -- son atlas etait declare et jamais utilise, et rien a
l'ecran ne disait quel onglet etait ouvert. Une seule chose le decide : le
groupe ouvert, donc rien a retenir et aucun clic a intercepter.
L'icone passe de 32 a 50 : fillToInterior est vrai pour ces onglets, et
UpdateIconInterior pose SetSize(interiorExtent, interiorExtent) -- 50 par
defaut -- avec SetTexCoord(0.03125, 0.96875). L'onglet faisant 55 de large,
l'icone prend tout l'interieur moins le bord. Un tiers de la surface etait
perdu.
Reste un ecart assume : la source masque l'icone par common-sidetab-mask,
une MaskTexture que 3.3.5 n'a pas. Ses angles restent carres.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CHARACTERFRAME_SUBFRAMES en compte cinq, camelot six. Les deux manquants
sont crees avec leurs icones -- celle du PvP suit la faction, comme
SetupModeTabs le fait pour son quatrieme onglet. L'ordre de la colonne suit
camelot : PvP entre competences et monnaie, statistiques en dernier ; le
familier garde la deuxieme place que 3.3.5 lui donne.
LE PvP CESSE D'ETRE UNE FENETRE. PVPParentFrame -- 384 x 512, toplevel, fils
d'UIParent -- est reparente dans le volet gauche et son toplevel retire,
sans quoi il resterait au-dessus de tout. Reparenter est sans danger ici :
ce cadre ne porte aucun de nos reglages de niveau. TogglePVPFrame, donc la
touche et le bouton du micro-menu, ouvre desormais la feuille sur cet
onglet. Sa mise en page reste a faire.
L'onglet des statistiques est vide, et c'est voulu : 3.3.5 met les siennes
dans AchievementFrameStats, une fenetre a part, et ce qu'il faut y mettre
n'est pas decide.
Un ecran qui n'est pas au client ne passe pas par CharacterFrame_ShowSubFrame
-- elle ne connait que ses cinq cadres et laisserait la feuille sans groupe.
Les deux gestes se font separement.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CHARACTER_MODE_TAB_ICONS porte aussi INV_SideTab_Stats_c60, que le premier
releve avait omis. Son identifiant -- 8197104 -- rejoint ceux du PvP dans le
code et dans tools/fichiers_simples.txt.
Aucun des trois n'est verse : la feuille de 3.3.5 n'a ni onglet PvP ni
onglet des statistiques. CHARACTERFRAME_SUBFRAMES en compte cinq, et les
statistiques du jeu vivent dans AchievementFrameStats, une fenetre a part
que Blizzard_AchievementUI charge a la demande.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le listfile communautaire ne nomme pas les INV_SideTab_*_c60 : elles
n'existent que par leur FileDataID. ajouter_feuilles.py accepte donc une
ligne "source => nom voulu" -- on exporte par l'identifiant et on range sous
le nom que camelot donne, pour que l'atelier reste lisible et que
l'identifiant demeure note.
Reputation 8197103, monnaie 8197078 : verifiees a l'apercu -- une poignee de
main, une pile de pieces -- puis posees sur les onglets 3 et 5. Avec celle
des competences, les trois onglets que camelot decrit portent leur icone.
Les deux icones PvP ne sont pas versees : la feuille de 3.3.5 n'a pas cet
onglet. Leurs identifiants sont notes pour le jour ou elle en aura un.
L'onglet du familier garde son texte : camelot n'en a pas, donc aucune
source.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CHARACTER_MODE_TAB_ICONS nomme trois icones. Celle des competences --
Ability_Racial_JackofAllTrades -- est versee et remplace le mot.
Les deux autres, INV_SideTab_Reputation2_c60 et INV_SideTab_Currency_c60,
sont introuvables : le client charge dans wow.export EST celui de camelot,
wow_classic_beta 1.60.1.69913, et son code les nomme, mais le listfile
communautaire ne leur donne aucun nom -- /resolve rend null, /search n'en
connait aucune. Reputation et monnaie gardent donc le texte du client
plutot qu'une icone inventee. L'onglet du familier, lui, n'existe pas chez
camelot : aucune source, donc pas d'icone non plus.
UpdateTabLayout corrige au passage l'ecart entre deux onglets : (0, -2) et
non (0, 0). Le chevauchement de 2 px etait perdu. La meme fonction confirme
la regle du precedent VISIBLE, posee la veille.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
3.3.5 efface l'onglet du familier quand le personnage n'en a pas --
PetPaperDollFrame_UpdateIsAvailable fait CharacterFrameTab2:Hide(), puis
rattache le suivant sur le LEFT du masque, sa reparation a lui, pensee pour
une rangee horizontale.
En colonne, l'onglet masque restait ancre et reservait sa hauteur :
reputation, competences et monnaie flottaient sous le personnage au lieu de
le suivre. La pile ne chaine plus que sur le precedent VISIBLE, et se refait
a chaque appel de cette fonction -- la seule qui decide de cet etat.
Le faux client sait desormais masquer cet onglet comme le vrai, avec son
rattachement horizontal, et le banc verifie les deux sens.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La source le dit : UpdateRightPaneHeader ne masque que le StoneBg -- "the
stone header backs the PaperDoll sidebar tabs, so it should not render on
tabs that have none" -- et RightPaneHost demeure. Chaque onglet aura ses
propres informations a y mettre ; le volet leur est reserve des maintenant,
vide en attendant.
Ce qui s'en va d'un onglet a l'autre n'est donc pas le volet mais le
MOBILIER du groupe : bande de pierre, onglets de page et ligne de niveau
pour le personnage -- les trois choses exactes que la source masque.
Le mobilier est un troisieme niveau dans Panes.lua, parce que deux ne
suffisaient pas : la pierre et les onglets de page appartiennent au groupe
et non a l'une de ses deux pages, ou passer de l'une a l'autre les aurait
emportes.
Le repli, lui, traverse les onglets : replie sur le personnage, il l'est
encore sur les competences, et se defait depuis n'importe lequel.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ForeverUI.Panes valait nil en jeu : le client dresse la liste des fichiers
d'un addon a l'ouverture, et /reload rejoue ceux qu'il connait sans en
decouvrir de nouveau. Panes.lua etait sur le disque et inscrit au .toc, et
pourtant absent -- la feuille s'arretait sur une erreur au chargement.
Elle le dit maintenant au joueur et se tait : le reste de l'interface tient.
Le banc rejoue le cas dans un client neuf, sans ce fichier.
A retenir, et ecrit dans le README : tout nouveau fichier demande de fermer
et rouvrir le jeu.
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>
Bouton de 28 au coin haut droit du volet gauche, releve de camelot :
fleches de page, PrevPage depliee, NextPage repliee, survol UI-Common-
MouseHilight. Replie, la fenetre passe a 398 -- exactement la largeur du
volet gauche : le volet droit ne retrecit pas, il s'en va.
Ce qui part avec lui : les douze lignes de statistiques, leurs selecteurs
et le panneau du gestionnaire, qui sont des cadres DU CLIENT seulement
ancres dans notre volet -- les masquer un par un est necessaire.
Ce qui reste : tout le volet gauche, et les onglets lateraux, ancres au
bord droit de la fenetre et non au volet. La source ne les masque pas non
plus.
Quatre pieges regles : la largeur se decide en fin d'habillage, sinon le
passage suivant rouvrait le volet ; l'onglet ouvert se retient, sinon le
depli revenait toujours aux statistiques ; le bouton prend deux crans de
plus que le modele, qui recouvre son coin ; reposerLaPlace est declaree en
amont.
Le faux client retient desormais le proprietaire et le texte de
l'infobulle, et repond a GetOwner comme le jeu.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La recette du bouton tertiaire et ses mesures passent dans
ForeverUI.SkinTertiaryButton (AtlasUtil), employee par les selecteurs de
statistiques et par ce bouton. Son option auto fait suivre l'etat presse
au bouton de la souris ; sans elle l'appelant commande, ce que font les
selecteurs dont l'etat tient tant que leur liste est ouverte.
L'intitule est ecrit en dur : PAPERDOLL_NEWEQUIPMENTSET n'existe pas ici
et ce client ne porte aucune chaine equivalente.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Les boutons du panneau sont ses cadres fils, pas ceux de la fenetre du
client : masquer GearManagerDialog ne les emportait pas, et le bouton
restait visible sous les statistiques. Le panneau entier se montre et se
cache avec l'onglet.
Son intitule venait de NEW_COMPACT_UNIT_FRAME_PROFILE, absente de ce
client -- d'ou "New Profile", une chaine d'un tout autre panneau.
PAPERDOLL_NEWEQUIPMENTSET, que camelot ecrit, n'existe pas ici non plus :
NEW est la plus proche, et elle va avec Equip et Save.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sans ancrage donne, ToggleDropDownMenu accroche la liste a "<nom>Left" --
la piece doree du menu deroulant, que nous avons justement masquee --
d'ou le decalage. UIDropDownMenu_SetAnchor est l'entree prevue par le
client : TOPLEFT de la liste sur le BOTTOMLEFT du bouton, sans ecart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UIDropDownMenu_InitializeHelper finit par
frame:SetHeight(UIDROPDOWNMENU_BUTTON_HEIGHT * 2). Cette constante, nous
l'avons portee a 20 pour les lignes de menu de camelot : le selecteur
reprenait donc 40 des qu'on cliquait dessus.
La taille voulue est retenue sur le cadre et reposee par un greffon sur
UIDropDownMenu_Initialize, qui passe apres le securecall de l'aide.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
C'est la hauteur propre de l'art de bouton
(common-button-tertiary-normal, 46 x 34) : a cette taille la bande
centrale du decoupage ne s'etire plus du tout en hauteur. Les lignes de
statistiques remontent d'autant.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
habillerSelecteur la greffe sur la liste, et elle n'etait ecrite que plus
bas : son nom s'y resolvait en globale, donc nil, et HookScript refusait
le greffon. Declaration anticipee.
Le banc ne l'a pas vu parce que son HookScript acceptait nil. Il refuse
desormais tout greffon qui n'est pas une fonction, comme le vrai.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A la demande : l'en-tete UI-Character-Info-Title laisse la place a l'art
commonbuttontertiaryc60, normal et pressed, et la fleche du client s'en
va -- toute la barre ouvre deja le menu.
Decoupe et non etire : a partir de x = 11 le profil d'une colonne ne
change plus, donc coin de 11 sur les deux axes. Tendue de 46 a 203,
l'image ecraserait ses angles.
L'etat presse tient tant que la liste est ouverte. Elle se ferme de deux
facons -- ToggleDropDownMenu et CloseDropDownMenus -- donc l'etat se
releve sur le OnShow et le OnHide de la liste elle-meme.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UI-GearManager-Button fait 64 x 64 mais son contenu opaque n'occupe que
x 6..58 sur toute la hauteur : c'est un bouton de 52 x 64, qui paraissait
rectangulaire dans un onglet carre. On en prend le carre central, la meme
plage sur les deux axes, comme l'onglet des statistiques rogne son
portrait.
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>
GearManagerDialog_OnShow appelle UpdateUIPanelPositions(CharacterFrame)
et _OnHide appelle UpdateUIPanelPositions() : le systeme replace la
feuille a SA position et la place retenue par le joueur est perdue.
Le greffon est pose sur UpdateUIPanelPositions elle-meme, pas sur le
seul gestionnaire : toute autre ouverture qui la declenche pose le meme
probleme.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camelot donne 42 a son Icon, soit tout le bouton, mais ses icones
portent leur propre marge transparente ; un portrait remplit sa texture
et ressortait des angles arrondis. Mesure sur UI-Character-Info-StatTab :
metal en 3..6 et 35..38, ouverture de 7 a 34, soit 28.
Les deux se comportent en onglets : le gestionnaire ouvre son panneau et
masque les statistiques, les statistiques le ferment et reviennent. Au
retour on laisse PaperDollFrame_UpdateStats refaire le travail -- lui
seul sait cacher la sixieme ligne des categories a cinq statistiques --
et poserStatistiques lit l'etat de l'onglet au lieu de tout rallumer a
chaque evenement.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PLAYER_LEVEL vaut ici "Level %s %s %s" -- niveau, RACE, classe. camelot
emploie PLAYER_LEVEL_NO_SPEC, absent de ce client : la ligne est
recomposee depuis UNIT_LEVEL_TEMPLATE et le nom de classe, pour ne pas
ecrire un format en dur.
Deux onglets de 42 x 42 au-dessus, sur le gabarit de
PaperDollSidebarTabs : cadre UI-Character-Info-StatTab, marque
...-Selected, paire centree et collee. L'onglet des statistiques prend le
portrait du joueur avec le rognage de la source ; celui du gestionnaire
prend UI-GearManager-Button, PaperDollSidebarTabs.blp n'existant pas
ici. Il ouvre le GearManagerDialog du client, dont le bouton d'origine
est masque.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Profil de l'anneau mesure sur l'art, rayon en pixels d'affichage :
transparent jusqu'a 12, degrade 13 a 25, opaque 26 a 29, retombee
jusqu'a 32.
A 44 le carre s'arretait a 22 sur ses axes, dans un degrade a moitie
transparent -- les 2 px manquants de chaque cote. A 48 il atteint 24,
la ou le metal est deja opaque a 86 %. En contrepartie ses angles
tombent a 33,9, au-dela de l'anneau ; 46 reste le compromis si leurs
pointes se voient.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
L'anneau est porte par le coin haut gauche de l'encadrement : le passage
au calcul sur le filet interieur a deplace le coin de (-13, 16) a
(-18,5 ; 17), et le portrait, pose en absolu, s'est retrouve a cote.
Sa place se calcule desormais depuis le coin, plus 38 / -38,5 -- le
centre du trou, mesure sur l'art (plages 13..39 et 113..138 en double
densite) et deja confirme par la place validee en jeu. Le banc verifie
l'ecart au coin, pas la position absolue.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Decalages relatifs au voisin de gauche, qui s'additionnent le long de la
chaine : main gauche -2, distance -2 de plus, soit -4 a l'ecran, et les
munitions -4 heritees sans reglage propre.
La fleche des munitions est une region de l'emplacement -- texture
OVERLAY de 23 x 41 centree a (-22, 0) sur CharacterAmmoSlot -- elle le
suit donc.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camelot pose l'emplacement de distance en 27 avec GearSlotSmall, comme
les munitions. Il porte pourtant, selon la classe, une arme a distance
ou une relique -- des objets de meme rang que les deux armes de melee.
Ecart assume, sur demande : les quatre font 40. Les munitions gardent le
petit emplacement de la source.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>