LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-H3i-DIAG.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

107 lines
16 KiB
Markdown

Fiche STE-H3i — Niveau N2 — Modèle prévu (modèle de l'agent lp-diag) | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-diag — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths
# STE-H3i-DIAG : famille « Accessed None … (real) property chargen in /Game/BPs/GI.GI_C » (pile `VisualMorph`) du journal COMMUN-3 session 1 (2026-10-13)
Abréviations : **S1** = `D:\Game\LifePlay_Backup_5.5\COMMUN-3\essais\LifePlay_commun3_session1_definitif_BOSS.log` (MD5 `27e654cc941d3309637ba1403dac98a0`, conforme à la fiche : `md5sum` rejoué) ;
**C2** = `D:\Game\LifePlay_Backup_5.5\COMMUN-2\essais\LifePlay_commun2_definitif_BOSS.log` ; **P2** = `etat\ST\STE\dumps\GI__EventGraph_P2.txt` (5.8) ;
**O2** = `D:\Game\LifePlay-master 5.5\Saved\Logs\portage\O2_dump_GI.log` (dump GI 5.5) ; **V1rc** = `D:\Game\LifePlay-master 5.5\Saved\Logs\portage\V1rc_partie_20260930.log` (partie 5.5.4) ;
**L7i** = `D:\Game\LifePlay-master 5.5\Saved\Logs\portage\L7i_partie1_20260930.log` (partie 5.5.4).
Note : la variable de GI s'appelle `CharGen` dans les dumps ; le moteur l'écrit `chargen` dans l'avertissement (même FName, casse de la première inscription).
Outils : Grep / Read ; lectures en tube (`grep`, `sed -n`) sur les journaux et le dump `.txt` (Grep de l'outil sur `etat\…\dumps\` rend 0 : fichiers `.txt` ignorés par git, voir Constats).
## 1. Symptôme et reproduction
- **Compte réel : 378 occurrences, pas 756.** Grep `LogScript: Warning: .*property chargen in` sur S1 → 378 ; Grep `LogScript: Warning: Accessed None\r?$` (avertissement nu qui suit chaque en-tête) → 378. Le 756 de la fiche est le compte de la ligne `Script call stack` de la synthèse de fin : S1:41923 `756 [LogScript Warning] Script call stack: | Function /Game/UI/VisualMorph.VisualMorph_C:ExecuteUbergraph_VisualMorph`. Détail de la synthèse : S1:41924-41927 → 245 (`VisualMorphMale`) + 133 (`VisualMorphFemale`) pour l'en-tête `chargen`, autant pour l'`Accessed None` nu.
- **Première / dernière** : S1:33273 (`18.46.15:383`, image `[627]`) ; S1:40437 / 40446 (`18.46.15:819`, image `[627]`). Toutes dans **la même image 627** (`grep -oE '\]\[[ 0-9]+\]LogScript'` sur S1:33273-40454 → une seule valeur `][627]`).
- **Pile complète** (S1:33273-33289) :
`LogScript: Warning: Accessed None trying to read (real) property chargen in /Game/BPs/GI.GI_C` /
`VisualMorph_C /Engine/Transient.GameEngine_…:GI_C_….BodyShapeMenu_C_2147451331.WidgetTree_….VisualMorphPair_C_2147450551.WidgetTree_….VisualMorphMale` /
`Function /Game/UI/VisualMorph.VisualMorph_C:ExecuteUbergraph_VisualMorph:64X` / `Script call stack: Function …VisualMorph_C:ExecuteUbergraph_VisualMorph`,
puis S1:33282 `LogScript: Warning: Accessed None` (même objet, même offset `64X`, même pile). Aucune fonction de GI dans la pile : GI n'est que le propriétaire de la variable lue.
- **Combien d'itérations** : 378 `VisualMorphPair_C_<n>` distincts, chacun exactement 2 lignes d'objet (en-tête + nu) : `sort | uniq -c` → `378 2`. Donc **une occurrence par widget `VisualMorph` construit** (un seul enfant par paire, Male ou Female), et non une boucle Tick ou une minuterie : la « boucle » est la construction de la liste de 378 paires de `BodyShapeMenu` dans une seule image.
- **Contexte avant** (S1:33150-33272) : S1:33186 et 33220 `menus=[MainMenu_C]` (menu principal en jeu, monde `CentralLondon`) ; S1:33226 `LogPlayerController: Error: InputMode:UIOnly - Attempting to focus Non-Focusable widget` (18:46:14.837, image 625) ; S1:33236-33250 `LISIB : SpinBox lisible BodyShapeMenu.PercentMale` … `TattooF` (construction de `BodyShapeMenu`) ; S1:33272 premier `GetAssetByObjectPath ECHEC … /Game/Heavy/New3/UI/true/OOF_Zora` (icônes des morphs, 49 lignes `ECHEC.*OOF_` dans S1). Aucun `CharGen_C`, `LoadPreset`, `PlayerChangeRace` dans ce contexte.
- **Après** : rien après S1:40454 jusqu'au relevé S1:40487 `menus=[BodyShapeMenu_C]` (18:46:18) ; retour S1:40554 `menus=[MainMenu_C]` (18:46:23). Aucun autre avertissement `chargen` à la fermeture ni en déplaçant des curseurs.
- **CharGen jamais ouvert dans S1** : `grep -cE 'OpenCharGen|CharGen_C|chargenroom'` sur S1 → `0`. Le marqueur est valable en 5.8 : C2:32509 `chargenroom.lpworld LOAD ROOM` puis C2:32522-32526 `CharGen_C … CharGen_C:Construct`.
- Reproduction : non rejouée (rubrique 6) ; scénario déduit : charger une partie sans passer par CharGen, Échap → menu principal → répartition des silhouettes (`BodyShapeMenu`).
## 2. Hypothèse testée (une seule)
H : la famille est un **défaut d'origine** : `VisualMorph` lit `GI.CharGen` sans garde ; `GI.CharGen` n'est écrit que par la création du widget CharGen et n'est jamais remis à None ; ouvrir `BodyShapeMenu` dans une session où CharGen n'a pas été ouvert le trouve à None. Ni G16, ni STG B7-a, ni Person, ni Room n'interviennent.
Réfutée si : un graphe modifié par STE / STG / CAM est sur le chemin, ou si un journal antérieur ouvre `BodyShapeMenu` **sans** CharGen préalable sans produire l'avertissement.
## 3. Essai et résultat brut
### 3.1 Qui écrit `GI.CharGen`, qui le vide
- P2 (5.8) : `grep -c -E "VariableSet_[0-9]+ +variable 'CharGen'$"` → **1** ; `VariableGet … 'CharGen'` → 7.
- Seule écriture : P2:852 `K2Node_VariableSet_796 variable 'CharGen'` ← P2:846-850 `K2Node_CreateWidget_59.ReturnValue`, exécuté par P2:830 `CustomEvent_1096 'CreateCharGenWidget'`, appelé par P2:837 `CallFunction_6008 CreateCharGenWidget()` depuis P2:713 `CustomEvent_80 'OpenCharGen'`.
- Remise à None : **aucune**. P2:834 `ClearCharGenWidget` → `VariableGet_153 CharGen` → `Widget::RemoveFromParent()` (P2:863-869) : retire le widget de l'écran, la variable garde la référence.
- Même structure en 5.5 : O2:51512-51532 (`CreateCharGenWidget`, `CreateWidget_59` → `VariableSet_796 CharGen`, `ClearCharGenWidget` → `RemoveFromParent`). Inchangé entre 5.5 et 5.8.
- Conséquence (établie par le graphe) : `GI.CharGen` vaut None tant que CharGen n'a pas été ouvert dans la session ; après une ouverture, il reste valide (widget hors écran) jusqu'à la fin de la session.
### 3.2 Qui crée `VisualMorph`, depuis quel écran
- P2:16100-16131 : `CustomEvent_4625 'OpenBodyShapeDistribution'` → `HideUI()` → `CreateWidget_406` → `VariableSet_3846 BodyShapeMenu` → `AddToViewport` → `SetInputMode_UIOnlyEx` (cause de l'erreur de focus S1:33226). Appelant de `OpenBodyShapeDistribution` : non relu (menu principal, d'après `menus=[MainMenu_C]` juste avant : estimé).
- `BodyShapeMenu` contient des `VisualMorphPair` qui contiennent `VisualMorphMale` / `VisualMorphFemale` (chemin d'objet S1:33274). Création des paires : dans `BodyShapeMenu` (non dumpé).
- Lecteur : paquet `Content\UI\VisualMorph.uasset` : `grep -a -o -i -E 'chargen[A-Za-z_]*'` → `2 CharGen`, `1 CharGen_C` ; même recherche sur `VisualMorphPair.uasset` et `BodyShapeMenu.uasset` → 0. Noms présents dans `VisualMorph.uasset` : `Construct` (3), `OnInitialized` (4), `GetMorphTarget`, `SetMorphTarget`, `MorphTargetName`, `BndEvt__MorphValueSlider_…_OnFloatValueChangedEvent`. Le lecteur est donc dans l'EventGraph de `VisualMorph` ; nœud exact **non établi** (pas de dump `VisualMorph`, offset `64X` inutilisable en 5.8). Estimé : à la construction, `GI.CharGen.<membre>` puis `GetMorphTarget(MorphTargetName)` pour initialiser le curseur ; le premier accès donne l'en-tête `property chargen`, le second (contexte dérivé de None) l'`Accessed None` nu.
### 3.3 Le chemin de S1 diffère-t-il de CharGen de C2 ?
- Oui. C2 passe par `CharGen` (C2:32509-32526, `CharGen_C:Construct`, changement de sexe 16:55:58) et **n'ouvre jamais** `BodyShapeMenu` : Grep `property chargen|BodyShapeMenu|ExecuteUbergraph_VisualMorph` sur C2 → 0. S1 ouvre `BodyShapeMenu` et **jamais** CharGen. Les deux chemins sont disjoints ; l'absence en C2 n'est pas une absence du défaut, mais du chemin.
- COMMUN-3 session 2 et les autres journaux du dossier : Grep du même motif sur `D:\Game\LifePlay_Backup_5.5\COMMUN-3\essais` → S1 seul (3423 lignes) ; session 2 : 0 (chemin non exercé).
### 3.4 Antériorité
| Journal | `BodyShapeMenu` ouvert | CharGen avant ? | `property chargen` | Source |
|---|---|---|---|---|
| S1 (5.8, COMMUN-3) | oui, 18:46:14 | **non** (0 marqueur) | **378** | § 1 |
| C2, S2 (5.8) | non | C2 : oui | 0 | § 3.3 |
| HJ, J6, archives `LifePlay_Build_5.8_*`, `LifePlay_Build_5.5_*`, `builds_supprimees\*\Logs` | non (Grep `BodyShapeMenu|property chargen|ExecuteUbergraph_VisualMorph` : seul le journal du build COMMUN-3 répond, `LifePlay-backup-2026.10.13-18.48.09.log`, 3423) | — | 0 | boucle `grep -c` sur `D:\Game\LifePlay_Build_*\Windows\LifePlay\Saved\Logs\*.log` et `builds_supprimees\*\Logs\*.log` |
| V1rc (5.5.4) | oui, 10:34:05 (49 `ECHEC.*OOF_`, même nombre que S1) | **oui** : V1rc:33991 `chargenroom … LOAD ROOM` (10:25:02), V1rc:34011 `GI_C:OpenCharGen` | **0** | `grep -c` |
| L7i (5.5.4) | oui (L7i:15352 premier `OOF_`, 19:37:49) | **oui** : L7i:7402 `chargenroom` (19:32:17) | **0** | `grep -c` |
| 4.27 (`REF427_*`, `ref427_*`, `AB427`, ARCH427 `LifePlay-backup-2026.09.28-14.17.59.log`) | non exercé (ARCH427 : lignes `LogLPDump` seulement, l. 63376-63406) | — | 0 | Grep sur `*427*.log` → 0 ; `grep -c` ARCH427 → 0 |
Lecture : le même écran a été ouvert deux fois en 5.5 sans avertissement, **chaque fois après CharGen** ; il a été ouvert une fois en 5.8 **sans CharGen** et donne 378 avertissements. Le seul paramètre qui change est l'état de `GI.CharGen`, conformément au § 3.1. Aucun journal ne montre `BodyShapeMenu` ouvert sans CharGen avant S1 (ni en 5.5 ni en 4.27).
### 3.5 Lien avec les changements récents
- `git log --oneline -6 -- Content/UI/VisualMorph.uasset Content/UI/BodyShapeMenu.uasset Content/UI/VisualMorphPair.uasset` → derniers commits `809102a` (U5, resave), `8015f18` (L7i), `a61fc3f` (L4-CX-B07), `7aaeb06` (L6e), `9b7e971` (L1), `1122e17` (L0) ; `git status --porcelain -- Content/UI/` → vide. Aucun lot STE / STG / CAM ne touche ces widgets ; le build COMMUN-3 ne modifie que GI, Person, Room (état git de la session).
- G16 : `EventGraph` de GI, événement `UpdateDefaultHair` (`STE-H3g-SPEC.md:33-34, 71, 85`) ; nœuds listés (`CustomEvent_5`, `IfThenElse_104`, …) sans `CreateWidget_59` ni `VariableSet_796`. Grep `chargen|VisualMorph|BodyShape` sur `STE-H3g-SPEC.md` → 0.
- STG B7-a : graphe `Show` de GI seul (`STG\STG-B7a-IMPL.md:49`, `refPath = /Game/BPs/GI.GI:Show.<nom>`) ; Grep `chargen|VisualMorph|BodyShape` sur `STG-B7a*.md` → 0.
- Person (STG), Room (CAM) : absents de la pile et du chemin d'objet (S1:33274 : `GI_C > BodyShapeMenu_C > VisualMorphPair_C > VisualMorph`).
## 4. Verdict : confirmée
| Point | Constat | Niveau |
|---|---|---|
| Famille | 378 occurrences (et non 756 : synthèse S1:41923 compte les lignes `Script call stack`, 2 par occurrence), une image (627), 18:46:15.383-.819 | **établi** |
| Pile | `VisualMorph_C:ExecuteUbergraph_VisualMorph:64X`, objet `BodyShapeMenu_C > VisualMorphPair_C > VisualMorph(Male|Female)` | **établi** |
| Nœud lecteur | `VariableGet CharGen` sur GI dans l'EventGraph de `VisualMorph` (référence `CharGen` / `CharGen_C` dans le paquet), probablement à la construction, suivi d'un second accès sur le résultat (`GetMorphTarget`) | graphe **établi**, nœud exact **estimé** (dump à faire, § 5) |
| « Boucle » | construction des 378 `VisualMorphPair` de `BodyShapeMenu` (un `VisualMorph` actif par paire), pas de Tick ni de minuterie | **établi** (comptes) ; boucle de création dans `BodyShapeMenu` **estimée** (non dumpée) |
| Chemin | menu principal en jeu → `GI.OpenBodyShapeDistribution` → `CreateWidget BodyShapeMenu` (P2:16100-16131) dans une session où CharGen n'a jamais été ouvert (`GI.CharGen` = None, seul `Set` : P2:852) | **établi** (S1 0 marqueur, P2) |
| Origine | **défaut d'origine** (graphe `CharGen` identique 5.5 / 5.8, widgets inchangés depuis U5, aucun lot récent sur le chemin) ; révélé par un parcours nouveau (écran ouvert sans CharGen) | **estimé fort** : défaut présent au moins en 5.5 (même graphe, même lecteur) ; jamais observé avant faute de parcours ; 4.27 non exercé |
| Lien G16 / B7-a / Person / Room | aucun | **établi** (§ 3.5) |
Effet en jeu (estimé) : à l'ouverture sans CharGen, les curseurs de `VisualMorph` reçoivent la valeur par défaut d'une lecture None (0) au lieu d'une valeur lue sur le personnage de CharGen. Quand CharGen a été ouvert, ils lisent le widget CharGen hors écran (comportement d'origine, peut-être fortuit). Aucun effet sur la sauvegarde mesuré.
## 5. Hypothèse suivante proposée, et à quel niveau
Suites proposées (aucune lancée ; décisions à l'utilisateur) :
- (a) **défaut d'origine accepté** (comme F-A / F-B de H3h) : 378 avertissements par ouverture de l'écran sans CharGen, sans effet mesuré.
- (b) **garde `IsValid(GI.CharGen)`** dans l'EventGraph de `VisualMorph`, avant le premier `VariableGet CharGen` du chemin de construction ; branche `Is Not Valid` : sauter la lecture (le curseur garde sa valeur par défaut, 0). Comportement : identique en valeur (une lecture None rend déjà 0), journal sans les 378 + 378 lignes → pas de changement de comportement attendu (estimé ; à confirmer par le dump). Si le même graphe écrit aussi par `SetMorphTarget` sur `CharGen` quand on bouge un curseur (`BndEvt__MorphValueSlider_…`), la même garde s'y applique (chemin non exercé dans S1). Niveau : SPEC N2 après dump, IMPL MCP (`lp-mcp`) sur `VisualMorph`, pas sur GI.
- (c) DIAG N2 préalable : dump `VisualMorph` pour fixer le nœud lecteur et l'événement (Construct / OnInitialized), puis décider (a) / (b). Recommandation : **(c) puis (b)** si l'utilisateur veut un journal propre ; sinon (a).
- Dumps à faire lancer (éditeur fermé, `lp-commandlets`, non lancés) :
`.\Tools\RunCommandlet.ps1 -Lot STE-H3i -Commandlet LPDumpFunction -Args '-BP=/Game/UI/VisualMorph -Fn=EventGraph -Pins -Exec' -EtatDir 'D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE'`
`.\Tools\RunCommandlet.ps1 -Lot STE-H3i -Commandlet LPDumpFunction -Args '-BP=/Game/UI/BodyShapeMenu -Fn=EventGraph -Pins -Exec' -EtatDir 'D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE'` (boucle de création des paires, appelant de `OpenBodyShapeDistribution` côté menu à relire dans `MainMenu` si besoin)
Questions pour l'utilisateur :
- **Q1** (H3i) : accepter le défaut d'origine (a), ou faire le dump `VisualMorph` puis poser une garde `IsValid(GI.CharGen)` dans `VisualMorph` (b, sans changement de valeur attendu) ?
Tours : 26 / 40
## Constats
- Écart à la fiche : le compte 756 (fiche, `etat\BOSS\COMMUN-3-BILAN.md:43`) est celui des lignes `Script call stack` de la synthèse ; les avertissements `chargen` sont 378 (245 Male + 133 Female), plus 378 `Accessed None` nus jumeaux.
- Écart à la fiche : pas de boucle Tick / minuterie / ForEach sur `chargen` dans GI ; 378 constructions de widget dans une image.
- Piège outil : Grep (outil) sur `etat\ST\STE\dumps\` rend 0 pour `CharGen` alors que `grep -c -i -a chargen GI__EventGraph_P2.txt` rend 74 : les `.txt` d'`etat/` sont ignorés par git et ripgrep les saute même avec le dossier en `path` ; nommer le fichier.
- Non mesuré : nœud exact et événement dans `VisualMorph` (pas de dump) ; appelant de `OpenBodyShapeDistribution` ; effet visuel en jeu ; comportement 4.27 de l'écran (jamais ouvert dans les journaux 4.27 relus) ; chemin `SetMorphTarget` en déplaçant un curseur.
- Lecture seule respectée ; un seul fichier écrit (ce livrable). Aucun nom d'utilisateur ni chemin de profil cité.
Fichiers à commiter : A `Docs/Migration/etat/ST/STE/STE-H3i-DIAG.md` (dépôt jeu, branche `ue5.8`), par le gardien sur ticket.
## Décision de l'utilisateur (2026-10-13, session STE)
- Q1 : **dump de `VisualMorph` puis SPEC d'une garde `IsValid(GI.CharGen)` après l'alpha** (hors COMMUN-3, hors chemin critique) ; défaut d'origine non bloquant d'ici là ; dump à demander à Big Boss (jeton UE) quand la file le permettra.