- 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>
Les decalages de la source posent le contour EXTERIEUR de l'image : le
filet interieur du metal tombait a 6 px dans la fenetre, et ces 6 px de
fond restaient visibles sous lui -- ce qui se lit comme un encadrement
qui n'atteint pas le bas.
Mesure sur l'art, pas sur une capture (une capture a sa propre echelle) :
uiframemetal2xc60 est en double densite, filet interieur a 18,5 px
d'affichage a gauche, 8,5 a droite, 14 en bas. Le haut ne se recalcule
pas, ses 41,5 sont la barre de titre, interieure par conception.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camelot/NineSliceLayoutOverrides.lua repasse sur TOUTES les mises en
page apres les avoir definies, parce que son art ne fait pas la taille
de l'art standard : coin haut droit x += -2, coins du bas y = -8.
Nous prenions les valeurs non corrigees, d'ou deux coins du bas 5 px
trop haut -- l'encadrement n'allait pas jusqu'en bas de la fenetre -- et
deux coins de droite 2 px trop a droite.
SetPanelArt prend une option coins ; la feuille s'en sert, plus 1 px de
montee juge a l'ecran. La fenetre des sacs, qui est validee, n'est pas
touchee bien que la meme correction s'y applique.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SetUnit("player") lance un chargement asynchrone : le reglage pose juste
apres s'applique a un modele qui n'est pas encore la, et la fin du
chargement remet la transformation a zero. D'ou le symptome -- la meme
commande tapee a la main tient, parce que le modele est deja charge.
Le reglage se repose a chaque image pendant 1,5 s apres chaque passage,
sans condition : rien ne garantit que GetPosition rende ce que le moteur
dessine. Meme rattrapage que pour la hauteur des sacs.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
C'est la position qui cadre, pas l'echelle : SetPosition(-5.5, 0, 0)
recule le personnage devant la camera sans deplacer son cadrage.
MODELE_ECHELLE repasse a nil -- on ne touche plus a l'echelle du client.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Releve dans Wow.exe : ce client ne porte que SetModelScale et
SetPosition. Ni SetCameraDistance, ni SetCameraPosition, ni
SetCameraTarget, ni SetCustomCamera, ni SetPortraitZoom.
SetModelScale reduit le modele autour de son origine, camera fixe : il
parait donc aussi glisser vers le bas. SetPosition l'eloigne devant la
camera, ce qui le rapetisse sans changer son cadrage.
Aucune des deux valeurs ne se releve dans la source -- camelot cadre par
une scene que 3.3.5 n'a pas -- d'ou /fui modele pour les juger a l'oeil
sans recharger l'interface.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Valeur d'essai demandee pour juger a l'ecran, pas une decision. A
remplacer par la valeur retenue.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La source ne donne qu'un ecart, 6, pour les deux sens. A la demande, les
deux colonnes passent a 4 ; la rangee des armes garde le 6 de la source
et l'ecart des munitions ne bouge pas.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ce client n'a ni SetCamDistanceScale ni SetPortraitZoom -- verifie dans
Wow.exe, seul SetModelScale y figure. Le personnage passe donc a 0,9,
repose a chaque passage parce que le client refait son modele quand
l'apparence change (UNIT_MODEL_CHANGED est ecoute pour cela).
Le separateur des volets etait pose au niveau du volet, donc SOUS le
cadre fils qui porte l'habillage (NIVEAU_ART) : il se perdait sous le
metal. Il prend un cran de plus, calcule depuis la constante puisque
l'habillage n'existe pas encore quand les volets se montent.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>