16 KiB
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 insur S1 → 378 ; GrepLogScript: Warning: Accessed None\r?$(avertissement nu qui suit chaque en-tête) → 378. Le 756 de la fiche est le compte de la ligneScript call stackde la synthèse de fin : S1:41923756 [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êtechargen, autant pour l'Accessed Nonenu. - 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:33282LogScript: Warning: Accessed None(même objet, même offset64X, 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 widgetVisualMorphconstruit (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 deBodyShapeMenudans une seule image. - Contexte avant (S1:33150-33272) : S1:33186 et 33220
menus=[MainMenu_C](menu principal en jeu, mondeCentralLondon) ; S1:33226LogPlayerController: Error: InputMode:UIOnly - Attempting to focus Non-Focusable widget(18:46:14.837, image 625) ; S1:33236-33250LISIB : SpinBox lisible BodyShapeMenu.PercentMale…TattooF(construction deBodyShapeMenu) ; S1:33272 premierGetAssetByObjectPath ECHEC … /Game/Heavy/New3/UI/true/OOF_Zora(icônes des morphs, 49 lignesECHEC.*OOF_dans S1). AucunCharGen_C,LoadPreset,PlayerChangeRacedans ce contexte. - Après : rien après S1:40454 jusqu'au relevé S1:40487
menus=[BodyShapeMenu_C](18:46:18) ; retour S1:40554menus=[MainMenu_C](18:46:23). Aucun autre avertissementchargenà 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:32509chargenroom.lpworld LOAD ROOMpuis C2:32522-32526CharGen_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-850K2Node_CreateWidget_59.ReturnValue, exécuté par P2:830CustomEvent_1096 'CreateCharGenWidget', appelé par P2:837CallFunction_6008 CreateCharGenWidget()depuis P2:713CustomEvent_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.CharGenvaut 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 deOpenBodyShapeDistribution: non relu (menu principal, d'aprèsmenus=[MainMenu_C]juste avant : estimé). BodyShapeMenucontient desVisualMorphPairqui contiennentVisualMorphMale/VisualMorphFemale(chemin d'objet S1:33274). Création des paires : dansBodyShapeMenu(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 surVisualMorphPair.uassetetBodyShapeMenu.uasset→ 0. Noms présents dansVisualMorph.uasset:Construct(3),OnInitialized(4),GetMorphTarget,SetMorphTarget,MorphTargetName,BndEvt__MorphValueSlider_…_OnFloatValueChangedEvent. Le lecteur est donc dans l'EventGraph deVisualMorph; nœud exact non établi (pas de dumpVisualMorph, offset64Xinutilisable en 5.8). Estimé : à la construction,GI.CharGen.<membre>puisGetMorphTarget(MorphTargetName)pour initialiser le curseur ; le premier accès donne l'en-têteproperty chargen, le second (contexte dérivé de None) l'Accessed Nonenu.
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 jamaisBodyShapeMenu: Grepproperty chargen|BodyShapeMenu|ExecuteUbergraph_VisualMorphsur C2 → 0. S1 ouvreBodyShapeMenuet 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) |
— |
| 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 commits809102a(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 :
EventGraphde GI, événementUpdateDefaultHair(STE-H3g-SPEC.md:33-34, 71, 85) ; nœuds listés (CustomEvent_5,IfThenElse_104, …) sansCreateWidget_59niVariableSet_796. Grepchargen|VisualMorph|BodyShapesurSTE-H3g-SPEC.md→ 0. - STG B7-a : graphe
Showde GI seul (STG\STG-B7a-IMPL.md:49,refPath = /Game/BPs/GI.GI:Show.<nom>) ; Grepchargen|VisualMorph|BodyShapesurSTG-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)` |
| 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 deVisualMorph, avant le premierVariableGet CharGendu chemin de construction ; brancheIs 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 parSetMorphTargetsurCharGenquand 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) surVisualMorph, pas sur GI. - (c) DIAG N2 préalable : dump
VisualMorphpour 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 deOpenBodyShapeDistributioncôté menu à relire dansMainMenusi besoin)
Questions pour l'utilisateur :
- Q1 (H3i) : accepter le défaut d'origine (a), ou faire le dump
VisualMorphpuis poser une gardeIsValid(GI.CharGen)dansVisualMorph(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 lignesScript call stackde la synthèse ; les avertissementschargensont 378 (245 Male + 133 Female), plus 378Accessed Nonenus jumeaux. - Écart à la fiche : pas de boucle Tick / minuterie / ForEach sur
chargendans GI ; 378 constructions de widget dans une image. - Piège outil : Grep (outil) sur
etat\ST\STE\dumps\rend 0 pourCharGenalors quegrep -c -i -a chargen GI__EventGraph_P2.txtrend 74 : les.txtd'etat/sont ignorés par git et ripgrep les saute même avec le dossier enpath; nommer le fichier. - Non mesuré : nœud exact et événement dans
VisualMorph(pas de dump) ; appelant deOpenBodyShapeDistribution; effet visuel en jeu ; comportement 4.27 de l'écran (jamais ouvert dans les journaux 4.27 relus) ; cheminSetMorphTargeten 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
VisualMorphpuis SPEC d'une gardeIsValid(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.