Fiche LISIB-SPEC — Niveau N2 — Modèle prévu Opus 5.5 (orchestrateur) | utilisé claude-opus-5-5 — Agent orchestrateur (session LISIB) — Skills lp-lot, sk-protocol, lp-ue-compat # LISIB-SPEC : rendre lisibles les textes de l'interface hors Settings (2026-10-10) **Statut : approuvée par l'utilisateur le 2026-10-10 (§ 8).** Écriture de code après le tag `LISIB-avant` et l'instantané ; compilation sur `BUILD-GO` de Big Boss. Base : `LISIB-T1-CART.md` et son annexe `LISIB-T1-inventaire.md` (identifiants A1-A56, B1-B20, C1-C50). ## 1. Cause La SpinBox du moteur 5.8, quand l'asset ne fixe rien, écrit en **gris clair #B7B7B7, taille 12**, sur un pinceau **gris clair #E6E6E6** : le contraste est d'environ 1,6:1 (`LISIB-T1-CART.md` § 2). C'est le défaut vu par l'utilisateur dans CharGen. Une EditableTextBox sans couleur fixée hérite d'un texte clair, posé sur un fond blanc à 80 % : c'est la cause C1 de `STD-TXT-DIAG.md`, corrigée pour le seul FilenameEntry de CharGen par STE-TXT. Le comportement est identique en 5.5 : c'est un défaut d'origine, pas une régression (STE-TXT, décision de l'utilisateur). ## 2. Périmètre proposé (Q1) - **Retenu (recommandé)** : - les **56 SpinBox du groupe A** ; - les **16 EditableTextBox du groupe B sans couleur de texte**. Ce sont tous les cas où le moteur impose un texte clair sur un fond clair, ainsi que les 3 SpinBox à texte noir 70 % (A41 et A52 : lignes de morphes de CharGen ; A47). Ensemble, ils couvrent le « comme dans de nombreux cas » : CharGen (morphes, AntiDeform, randomisation, X/Y/Z), BodyShapeMenu, Builder, CityMenu, ColorSlot, Scene, SexLight, StatAdjust, StatMenu, et les champs de recherche. - **Hors périmètre par défaut : les 50 TextBlock du groupe C.** - Leur taille et leur couleur sont des choix de l'auteur, dans l'asset. Par exemple : les donateurs en 8, la version à 70 %, les textes rouges d'alerte. - Plusieurs sont recolorés en jeu par le graphe (`LISIB-T1-CART.md` § 3). - Proposition : pendant le PIE, l'utilisateur désigne ceux qui gênent. Ils seront traités dans une fiche complémentaire, LISIB-T2, par MCP, widget par widget. ## 3. Méthode proposée (Q2) : C++ seul, aucun asset modifié - Nouveau sous-système `ULPReadableTextSubsystem` (GameInstanceSubsystem), dans `Source\LifePlay\LPReadableTextSubsystem.h/.cpp`. - **`LPSettingsSubsystem` n'est pas modifié** : le panneau Settings garde son rendu actuel, et le retour arrière reste séparé. Le sous-système reprend les mêmes valeurs de style (§ 4), recopiées et commentées « comme Settings ». - Fonctionnement : un ticker (`FTSTicker`), toutes les 0,25 s, parcourt les `USpinBox` et `UEditableTextBox` vivants. - **Un widget est retenu si** : - il n'est ni objet par défaut ni archétype ; - son `UUserWidget` propriétaire appartient à la GameInstance ; - il n'est pas sous `SettingsScrollBox` (déjà traité) ; - il n'a pas encore été traité (ensemble de pointeurs faibles). - **Le style est posé une fois par widget**, puis la Slate le garde dans les membres UMG : il survit à `RebuildWidget`. - **ERR-088** : - EditableTextBox : le style passe **uniquement** par `ULPWidgetStyleLibrary::SetEditableTextBoxStyle`, jamais par `UEditableTextBox::SetWidgetStyle` avec une valeur temporaire. - SpinBox : `USpinBox::SetWidgetStyle` recopie dans le membre, puis la Slate pointe sur `&WidgetStyle` (`SpinBox.cpp:111`, `:149-154`). Aucun risque, c'est déjà l'usage de Settings. - **Survie au graphe** : - aucun nœud ne repose le style d'une SpinBox ; - le flash rouge de FilenameEntry (CharGen, StatMenu) recopie le `TextStyle` courant, donc la couleur posée survit. - **Avantages** : - aucune écriture dans CharGen, MainMenu, StatMenu ou GI, donc **aucun conflit** avec STF-T5b ni STE ; - un seul fichier à relire ; - retour arrière par un seul revert ; - couvre d'office une SpinBox ajoutée plus tard. - **Limite** : le style n'est pas visible dans le designer UMG, seulement en PIE et en jeu. - **Autre méthode** : - par MCP, asset par asset : 72 widgets, 20 assets, dont CharGen et StatMenu, qui sont en file d'attente ; - ou les deux méthodes. ## 4. Valeurs cibles proposées (Q3, Q4) ### SpinBox (groupe A) | Élément | Valeur proposée | Source | |---|---|---| | Fond | (0,06 ; 0,06 ; 0,06 ; 0,95), survol 0,12 / 0,98, actif 0,16 / 1 | comme Settings (`LPSettingsSubsystem.cpp:337-342`) | | Remplissage actif (glissé) | bleu (0,2 ; 0,45 ; 0,9 ; 0,85) | comme Settings (`:343`) | | Remplissage au repos et au survol | bleu sombre (0,1 ; 0,22 ; 0,45 ; 0,9) | **nouveau**. Settings le laisse gris clair (`SSpinBox.cpp:240-241`), mais les lignes de morphes (plage 0-1) en montrent beaucoup | | Texte | blanc opaque, contour noir 2 px (0,95) | comme Settings (`:344`, `:391-395`) | | Taille | **minimum 16** (les 32 SpinBox en 12 passent à 16 ; celles en 16 ou 20 ne bougent pas) | Settings impose 18 ; 16 est proposé pour tenir dans les lignes étroites de Builder et CharGen | | Opacité de rendu | 1 pour les SpinBox (A41, A52 : 0,7 aujourd'hui) | comme Settings (`:389`) | | Activé / désactivé | **inchangé** (Settings force `SetIsEnabled(true)` ; ici, non) | — | ### EditableTextBox sans couleur (groupe B) | Élément | Valeur proposée | Source | |---|---|---| | Couleur du texte | noir opaque (0,0,0,1) dans `TextStyle.ColorAndOpacity`, seulement si elle n'est pas fixée | comme STE-TXT, approuvé en PIE (J2bis) | | Fond | inchangé (blanc à 80 %) | — | | Taille | **minimum 14** (B9, B10, B13 : 9 aujourd'hui ; B20 caché : 10) | — | | HintText | inchangé (gris voulu) | STE-TXT, fiche § 5 | Les widgets déjà corrigés par STE-TXT (A40 `CharGen.VarianceSpinBox` et B6 `CharGen.FilenameEntry`) : - B6 n'est **pas** touché, car sa couleur est fixée ; - A40 **prend le style SpinBox** (fond sombre, texte blanc), comme A56 dans StatMenu, pour un rendu homogène. Si l'utilisateur préfère garder le noir de STE-TXT, A40 sera exclu par son nom. ## 5. Fichiers, essais et retour arrière - Écrits : - `Source\LifePlay\LPReadableTextSubsystem.h` et `.cpp` (neufs) ; - aucun `.uasset` ; - aucun autre fichier source (le module charge seul le nouveau sous-système). - Entrée du lot : - `git status --short -- Source/LifePlay` vide ; - ticket TAG `LISIB-avant` ; - instantané `.\Tools\Snapshot.ps1 -Lot LISIB -Path Source\LifePlay`. - BUILD : `Tools\Build.ps1` (éditeur), 0 erreur et 0 avertissement nouveau (`lp-build`), sur `BUILD-GO`. - VAL (lp-validator) : - relecture du diff ; - fins de ligne ; - `LPTestStringCompat` ; - recherche d'un appel direct à `UEditableTextBox::SetWidgetStyle` dans le nouveau code (0 attendu) ; - journal en jeu : compte des widgets traités par classe, à comparer à l'inventaire (56 / 16, moins les widgets non ouverts). - PIE avec l'utilisateur (LISIB-J1), écran par écran : - CharGen : morphes, AntiDeform, randomisation, X/Y/Z, Save Preset, avec flash rouge ; - BodyShapeMenu ; - CityMenu ; - Builder et ColorSlot ; - StatMenu (Save Preset) ; - Scene (TimeoutHours), SexLight, StatAdjust ; - champs de recherche : Cursor, TopRight, ContactMenu, CityMenu, Inventory, Journal, LoadExtImg ; - Settings : contrôle de non-régression. Critère : le texte de chaque widget visité est lu sans effort, et aucune mise en page n'est cassée. - Retour arrière : revert du commit, ou `Restore.ps1 -Lot LISIB`, **proposé, jamais lancé sans accord**. Aucun asset n'est en jeu. - Report en 5.5 (`main`) : hors périmètre. À proposer après la validation, si l'utilisateur le veut. ## 6. Coût et risques - Complexité de l'IMPL : a1 b1 c1 d1 e1 f1 = 6 → N2 (lp-impl). - Charge : le parcours des objets toutes les 0,25 s porte sur moins de 200 widgets. Coût négligeable, à mesurer dans le journal à la VAL. - Risque de mise en page : le passage de 12 à 16 peut élargir une ligne (Builder). Le PIE le montre ; la taille minimale se règle par une seule constante. ## 7. Questions à l'utilisateur - **Q1 Périmètre** : - (a) A + B, soit 56 SpinBox et 16 champs **[recommandé]** ; - (b) (a) + des TextBlock désignés pendant le PIE (fiche LISIB-T2) ; - (c) A + B + les 50 TextBlock du groupe C. - **Q2 Méthode** : - (a) C++ seul, nouveau sous-système **[recommandé]** ; - (b) assets par MCP ; - (c) les deux. - **Q3 Aspect des SpinBox** : - (a) fond sombre et texte blanc, comme Settings, avec le remplissage au repos en bleu sombre **[recommandé]** ; - (b) fond clair gardé, texte noir opaque, comme STE-TXT. - **Q4 Taille minimale des SpinBox** : - (a) 16 **[recommandé]** ; - (b) 18, comme Settings ; - (c) inchangée, couleur seulement. - **Q5 A40 (CharGen.VarianceSpinBox, noir par STE-TXT)** : - (a) style commun **[recommandé]** ; - (b) exclu. Réponses : à reporter ici (§ 8) avec la date, puis la fiche LISIB-IMPL est rédigée et `BUILD-DEMANDE` envoyée à Big Boss. ## 8. Décisions de l'utilisateur 2026-10-10, réponses aux questions de la session LISIB : - Q1 : « SpinBox + champs (Recommandé) » → (a) ; - Q2 : « C++ seul (Recommandé) » → (a) ; - Q3 : « Comme Settings (Recommandé) » → (a), avec le remplissage au repos en bleu sombre. L'option approuvée inclut A40 au style commun, donc **Q5 = (a)** ; - Q4 : « 16 (Recommandé) » → (a). Les champs de saisie en 9 passent à 14. **SPEC approuvée.** Suite : fiche LISIB-IMPL, ticket TAG `LISIB-avant`, instantané, puis `BUILD-DEMANDE`.