140 lines
12 KiB
Markdown
140 lines
12 KiB
Markdown
|
|
Fiche STE-P1 — Niveau N3 — Modèle prévu (modèle de l'agent lp-impl) | utilisé claude-opus-5-5 — Agent lp-impl (A-IMPL-H) — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat, lp-mcp, lp-doc (gabarits)
|
||
|
|
# STE-P1-IMPL : partie C++, bibliothèque `ULPWidgetStyleLibrary` (2026-10-10)
|
||
|
|
|
||
|
|
Ce livrable couvre la partie C++. La partie graphe (4 substitutions par MCP) revient à l'orchestrateur, sous BUILD-GO,
|
||
|
|
après le build ; elle s'ajoutera ici en section « Graphe ». Spécification : `STE-P1-SPEC.md`, corps (D).
|
||
|
|
Je n'ai lancé ni compilation, ni `Build.ps1`, ni commandlet, ni éditeur.
|
||
|
|
|
||
|
|
## 1. Fichiers modifiés (chemins, lignes)
|
||
|
|
| Fichier | État | Lignes | Contenu |
|
||
|
|
|---|---|---|---|
|
||
|
|
| `D:\Game\LifePlay-master 5.8\Source\LifePlay\LPWidgetStyleLibrary.h` | nouveau, 34 lignes, ASCII, LF, MD5 `bd13433c36bf222b2feab3d6c23c0976` | `:1-14` | En-tête en commentaire : le défaut (`EditableTextBox.cpp:397`, `SEditableTextBox.cpp:113-132`, plantage `FontCacheCompositeFont.cpp:93`), le correctif, le renvoi à la SPEC, et le statut « contournement du moteur, à garder ». |
|
||
|
|
| | | `:18-21` | Includes : `CoreMinimal.h`, `Kismet/BlueprintFunctionLibrary.h`, `Styling/SlateTypes.h` (type complet de `FEditableTextBoxStyle`, requis par le code généré), `.generated.h`. |
|
||
|
|
| | | `:23` | Prédéclaration `class UEditableTextBox;`. |
|
||
|
|
| | | `:25-34` | `UCLASS() class LIFEPLAY_API ULPWidgetStyleLibrary : public UBlueprintFunctionLibrary`. Elle contient `UFUNCTION(BlueprintCallable, Category = "LifePlay|UI", meta = (DisplayName = "Set Widget Style (Text Box, LP)")) static void SetEditableTextBoxStyle(UEditableTextBox* TextBox, const FEditableTextBoxStyle& Style);` (`:32-33`). |
|
||
|
|
| `D:\Game\LifePlay-master 5.8\Source\LifePlay\LPWidgetStyleLibrary.cpp` | nouveau, 30 lignes, ASCII, LF, MD5 `af691516002c8f97e341cb0b3b29d002` | `:3-7` | Includes : l'en-tête propre d'abord, puis `Components/EditableTextBox.h`, `Misc/EngineVersionComparison.h`, et `LifePlay.h` pour `LogLifePlay` (`LifePlay.h:9`). |
|
||
|
|
| | | `:11-16` | Cible None : trace `Verbose`, puis retour. Même convention que `LPMeshCompat.cpp:11-16`. |
|
||
|
|
| | | `:20` | `TextBox->WidgetStyle = Style;` : copie dans le membre. Le membre est public et non déprécié (`EditableTextBox.h:50-52`). |
|
||
|
|
| | | `:22-27` | Sous `#if !UE_VERSION_OLDER_THAN(5, 8, 0)` : `TextBox->SetWidgetStyle(TextBox->GetWidgetStyle());`. C'est une auto-affectation sûre (SPEC § 6.2), suivie de `SetStyle(&WidgetStyle)`. |
|
||
|
|
| | | `:28-29` | Commentaire de la branche 5.5 : le membre seul, comme le nœud Set de 5.5. |
|
||
|
|
|
||
|
|
Raisons : voir SPEC § 2.1. En bref :
|
||
|
|
- (D) reproduit le setter 5.8 sans son défaut : le pointeur gardé par Slate vise le membre, jamais le paramètre ;
|
||
|
|
- (A) est écarté, car `SynchronizeProperties` réapplique le texte avec une relecture forcée, les liaisons et
|
||
|
|
l'infobulle.
|
||
|
|
|
||
|
|
Style : modèle de `LPMeshCompat.h/.cpp` (tête de commentaire, `UCLASS()`, `LIFEPLAY_API`, trace Verbose).
|
||
|
|
Commentaires en français sans accents, comme les fichiers voisins (`file` : « ASCII text »).
|
||
|
|
`LifePlay.Build.cs` ne change pas : `Slate`, `SlateCore` et `UMG` y sont déjà en privé (`:38`).
|
||
|
|
|
||
|
|
## 2. Écarts à la SPEC (obligatoire)
|
||
|
|
- **Code : aucun écart.** Signature, corps, garde, includes et emplacement sont ceux de la SPEC § 2.3.
|
||
|
|
- **Correction de la SPEC pendant l'IMPL** (`STE-P1-SPEC.md`, R3) :
|
||
|
|
- la première rédaction disait « 0 occurrence d'`UEditableTextBox` dans `Source` ». Le Grep d'appui était tronqué à
|
||
|
|
20 lignes (`head_limit`) ;
|
||
|
|
- recompté sans limite : 5 lignes `SetWidgetStyle`, toutes sur `USlider`, `UCheckBox` ou `USpinBox`, dont les
|
||
|
|
setters 5.8 sont sûrs (`Slider.cpp:215`, `CheckBox.cpp:244`, `SpinBox.cpp:154`). Aucun `UEditableTextBox` ;
|
||
|
|
- R3 est corrigé dans la SPEC. La conclusion ne change pas.
|
||
|
|
- **Écart à la fiche, proposé et non appliqué** (SPEC Q2 et R8) : prendre aussi un instantané de CharGen sous STE-P1
|
||
|
|
(`.\Tools\Snapshot.ps1 -Lot STE-P1 -Path Content\UI\CharGen.uasset`) avant l'écriture MCP.
|
||
|
|
- Aujourd'hui, seul l'instantané STE-TXT existe, et c'est l'état HEAD, d'avant STE-TXT.
|
||
|
|
- Sans ce nouvel instantané, défaire STE-P1 sur CharGen défait aussi STE-TXT.
|
||
|
|
- La décision revient à l'orchestrateur.
|
||
|
|
|
||
|
|
## 3. Instantané (lot, manifeste)
|
||
|
|
- Commande, lancée avant toute écriture dans `Source` :
|
||
|
|
`pwsh -NoProfile -Command '& "D:\Game\LifePlay-master 5.8\Tools\Snapshot.ps1" -Lot STE-P1 -Path "Source\LifePlay\LPWidgetStyleLibrary.h","Source\LifePlay\LPWidgetStyleLibrary.cpp"; exit $LASTEXITCODE'`.
|
||
|
|
Code 0.
|
||
|
|
- Manifeste `D:\Game\LifePlay_Backup_5.5\STE-P1\manifest.csv` :
|
||
|
|
- `"Source\LifePlay\LPWidgetStyleLibrary.h","False","0","","2026-10-10T14:03:58"` ;
|
||
|
|
- `"Source\LifePlay\LPWidgetStyleLibrary.cpp","False","0","","2026-10-10T14:03:58"`.
|
||
|
|
- Un premier essai de la commande a échoué dans le shell (« unexpected EOF », guillemets mal fermés dans bash). Le
|
||
|
|
shell a refusé la commande avant de la lancer, donc rien n'a été écrit. Le second essai est celui ci-dessus.
|
||
|
|
- Pour l'orchestrateur : `Snapshot.ps1` **ajoute** au manifeste (`Tools\Snapshot.ps1:31`, `:62`). L'instantané de
|
||
|
|
StatMenu sous le même lot STE-P1 reste possible.
|
||
|
|
|
||
|
|
## 4. Ce qui n'a pas été fait
|
||
|
|
- Compilation (BUILD, lp-builder, sous BUILD-GO). Le code est **proposé, non compilé** : en 5.8 jusqu'au BUILD, en 5.5
|
||
|
|
sans essai prévu (SPEC R4).
|
||
|
|
- Partie graphe : 4 substitutions dans CharGen et StatMenu (orchestrateur, MCP), procédure en SPEC § 2.4. Aucun asset
|
||
|
|
n'a été touché.
|
||
|
|
- Pas de dump `LPDumpFunction` : le relevé U5 vaut pour l'état courant (SPEC § 2.4).
|
||
|
|
- Pas d'entrée ERR-088, de CHG ni de ticket : ces livrables relèvent de la fiche (rubrique 7) et de lp-writer ou de
|
||
|
|
l'orchestrateur.
|
||
|
|
- `Content\Modules` (mods) n'a pas été cherché (SPEC R3, Constats).
|
||
|
|
|
||
|
|
## 5. Points à confirmer en VAL
|
||
|
|
- VAL-1 : `.\Tools\Build.ps1 -Lot STE-P1` → code 0, ligne `Using Visual Studio 14.50.35739 toolchain (…\MSVC\14.50.35717)`.
|
||
|
|
- VAL-2 : unités `LPWidgetStyleLibrary.cpp` et `LPWidgetStyleLibrary.gen.cpp` (ou leur unité unity) compilées ; `UnrealEditor-LifePlay.dll` liée.
|
||
|
|
- VAL-3 : 0 `error` ; 0 `warning C4996`, en particulier pas de C4996 sur `WidgetStyle` ni sur `Font_DEPRECATED` (SPEC § 6.1-6.2) ; « autres lignes » = 20 (HyperAIStudio).
|
||
|
|
- VAL-4 : aucune `LNK2019` ni `LNK2001` sur `Z_Construct_UClass_UEditableTextBox_NoRegister`, `UEditableTextBox::SetWidgetStyle` ou `GetWidgetStyle` (SPEC R9, `MinimalAPI`).
|
||
|
|
- VAL-5 : `git status --short -- Source` → exactement `?? Source/LifePlay/LPWidgetStyleLibrary.h` et `.cpp` ; `file` → ASCII, LF ; MD5 identiques au § 1 (aucune retouche après l'IMPL).
|
||
|
|
- VAL-6 : en éditeur, `find_node_types` trouve `SetEditableTextBoxStyle` (catégorie `LifePlay|UI`), avec les broches `TextBox` et `Style` et une broche `self` cachée.
|
||
|
|
- VAL-7 : graphe, par l'orchestrateur : 4 nœuds Set remplacés, liens conformes à SPEC § 2.4, 0 nœud Set `WidgetStyle` restant dans les EventGraph de CharGen et StatMenu.
|
||
|
|
- VAL-8 : `compile_blueprint` CharGen et StatMenu → 0 avertissement ; `hyper_blueprint_debug_inspect` → 0 diagnostic (voir R5 : `ErrorType = 1` sur les anciens nœuds de StatMenu).
|
||
|
|
- VAL-9 : `CompileAllBlueprints` → 0 erreur, 0 avertissement.
|
||
|
|
- VAL-10 : PIE avec l'utilisateur, CharGen : 10 refus de nom de suite sans plantage.
|
||
|
|
- VAL-11 : flash rouge visible, puis retour au blanc après le Delay.
|
||
|
|
- VAL-12 : texte noir lisible avant, pendant et après le flash, avec et sans focus (reprend STE-J2).
|
||
|
|
- VAL-13 : texte tapé pendant le Delay conservé, curseur non déplacé (non-régression de SPEC § 6.3).
|
||
|
|
- VAL-14 : même essai dans StatMenu si un refus y est accessible ; sinon `reporté` avec motif.
|
||
|
|
- VAL-15 : aucun nouveau rapport `FCachedTypefaceData` dans `Saved\Crashes` après les essais.
|
||
|
|
- VAL-16 : branche 5.5 (`UE_VERSION_OLDER_THAN`) non compilée dans ce lot → `reporté` (SPEC R4, Q1).
|
||
|
|
|
||
|
|
## 6. Fichiers à commiter
|
||
|
|
Dépôt du jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`, par le gardien, dans le ticket commun STE-TXT + STE-P1 :
|
||
|
|
- `A Source/LifePlay/LPWidgetStyleLibrary.h`
|
||
|
|
- `A Source/LifePlay/LPWidgetStyleLibrary.cpp`
|
||
|
|
- `A Docs/Migration/etat/ST/STE/STE-P1-SPEC.md`
|
||
|
|
- `A Docs/Migration/etat/ST/STE/STE-P1-IMPL.md`
|
||
|
|
|
||
|
|
Non écrits par moi, à ajouter par l'orchestrateur après la partie graphe : `M Content/UI/CharGen.uasset` (déjà
|
||
|
|
modifié par STE-TXT) et `M Content/UI/StatMenu.uasset`.
|
||
|
|
|
||
|
|
Tours : 20 / 60 (SPEC et IMPL C++ ensemble)
|
||
|
|
|
||
|
|
## Constats
|
||
|
|
- **Le défaut ne touche que `UEditableTextBox` parmi les setters relus.**
|
||
|
|
- `UCheckBox::SetWidgetStyle` (`CheckBox.cpp:238-245`) et `USlider::SetWidgetStyle` (`Slider.cpp:210-217`)
|
||
|
|
passent `&WidgetStyle` ; `USpinBox::SetWidgetStyle` invalide le style (`SpinBox.cpp:149-156`).
|
||
|
|
- Seul `UEditableTextBox` passe `&InStyle` (`EditableTextBox.cpp:397`).
|
||
|
|
- Les appels C++ existants du jeu (`LPSettingsSubsystem.cpp:371`, `:390`, `:415`, `LPColorGradeSubsystem.cpp:201`,
|
||
|
|
`LPVideoQualitySubsystem.cpp:395`) sont donc sûrs.
|
||
|
|
- Ce constat renforce la piste P3 (signalement à Epic).
|
||
|
|
- Les autres classes UMG qui ont un setter natif ne sont pas couvertes ici. Je n'ai pas relu `UMultiLineEditableTextBox`
|
||
|
|
ni `UEditableText`. Aucune n'est posée par un nœud Set dans le relevé (`STE-TXT-DIAG.md:121-123`).
|
||
|
|
- Les mods (`Content\Modules`) n'ont pas été cherchés. Un mod qui pose `WidgetStyle` sur une Text Box par un nœud Set
|
||
|
|
garderait le risque de plantage. Grep sur des `.uasset` binaires n'est pas fiable : il faudrait un relevé
|
||
|
|
`LPDumpFunction` des mods.
|
||
|
|
|
||
|
|
## Partie graphe (orchestrateur LOT STE, MCP, 2026-10-10)
|
||
|
|
|
||
|
|
BUILD-GO de Big Boss (un seul passage : compilation puis MCP). Compilation : `STE-P1-BUILD.md` (code 0, DLL reliée
|
||
|
|
14:08:07, 0 avertissement compilateur). Éditeur headless de 14:09:18 à 14:12:45 (heures relevées), journal
|
||
|
|
`Saved\Logs\portage\STE-P1_editeur_20261010-140918.log`.
|
||
|
|
Instantané pris avant, sur décision de l'orchestrateur (Q2 de la SPEC) : `D:\Game\LifePlay_Backup_5.5\STE-P1\manifest.csv`,
|
||
|
|
CharGen 9669B103… (état STE-TXT) et StatMenu 4FA5D803… (HEAD). Défaire STE-P1 ne défait donc pas STE-TXT.
|
||
|
|
|
||
|
|
`type_id` du nouveau nœud : `LifePlay|UI|SetWidgetStyle(TextBox,LP)` (`find_node_types` filtre `LifePlay` ; les
|
||
|
|
filtres `SetEditableTextBoxStyle` et `Text Box, LP` ne rendaient rien). Broches : execute 0, `TextBox` 1, `Style` 2, then 0.
|
||
|
|
|
||
|
|
| Asset | Ancien nœud supprimé | Nouveau nœud | execute ← | then → | TextBox ← | Style ← |
|
||
|
|
|---|---|---|---|---|---|---|
|
||
|
|
| CharGen | `VariableSet_1147` | `CallFunction_51` (-2400, 13024) | `IfThenElse_366.else` | `CallFunction_5310` (Delay) | `VariableGet_2400` | `MakeStruct_62` |
|
||
|
|
| CharGen | `VariableSet_1146` | `CallFunction_52` (-1808, 13024) | `CallFunction_5310.then` | — | `VariableGet_2400` | `MakeStruct_64` |
|
||
|
|
| StatMenu | `VariableSet_1147` | `CallFunction_6` (496, 2592) | `IfThenElse_366.else` | `CallFunction_5310` | `VariableGet_204` | `MakeStruct_62` |
|
||
|
|
| StatMenu | `VariableSet_1146` | `CallFunction_10` (1088, 2592) | `CallFunction_5310.then` | — | `VariableGet_204` | `MakeStruct_64` |
|
||
|
|
|
||
|
|
Les liens des anciens nœuds ont été relus avant écriture : conformes à SPEC § 2.4. Les 4 nouveaux nœuds ont été relus
|
||
|
|
après écriture : 4 liens pour la copie de `_1147`, 3 pour celle de `_1146`. `find_nodes` « Set Widget Style » sur
|
||
|
|
l'EventGraph de CharGen ne rend que les 2 nouveaux nœuds. `compile_blueprint` warnings_as_errors : OK sur CharGen et
|
||
|
|
sur StatMenu ; journal : « Compiling Blueprint » sans ligne LogBlueprint d'erreur ni d'avertissement.
|
||
|
|
`save_assets` sur `/Game/UI/CharGen` et `/Game/UI/StatMenu` seuls.
|
||
|
|
Les appels MCP ont été faits un par un. `hyper_blueprint_debug_inspect` est absent du serveur (écart déjà noté dans STE-GI).
|
||
|
|
|
||
|
|
Sortie : CharGen 9669B103… → A0DE37AC… (5 046 138 o) ; StatMenu 4FA5D803… → 9030531C… (561 213 o) ; GI 606EB437… et
|
||
|
|
MainMenu 7292C6BE… inchangés ; `git status --short -- Content Config Source` = `M CharGen`, `M StatMenu`, `??` les
|
||
|
|
2 fichiers Source ; UeState à 0.
|
||
|
|
|
||
|
|
Fichiers à commiter (ticket commun STE-TXT + STE-P1) : `M Content/UI/CharGen.uasset`, `M Content/UI/StatMenu.uasset`,
|
||
|
|
`A Source/LifePlay/LPWidgetStyleLibrary.h`, `A Source/LifePlay/LPWidgetStyleLibrary.cpp`, les livrables STE-P1.
|