Instantane de reference de la reprise de migration (2026-09-29). Contient GI.uasset tel que trouve (copie UE4 identique a 4.27, MD5 F4550DA5DC05FC005400CDCA2FC123C9). Ajouts de ce commit : .gitattributes (aucune conversion de fin de ligne), regles .gitignore CHG-001, Tools/ (Snapshot, Restore, AssetHeaders), empreintes L0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 KiB
LifePlay 5.5 — Rapport de session du 2026-09-28
Diagnostic en cours, non résolu. Ce document sert la reprise du projet. Complément de
VictoryPlugin_Architecture.md(architecture et campagne R-01 à R-11).
1. Le défaut à résoudre
Pendant un événement de jeu (.lpscene) :
- l'homme s'appelle toujours Tyrone, la femme girl, girl girl ou Meihui ;
- ces personnages sont nus — corps et coiffure semblent aléatoires, les vêtements manquent ;
- ils sont invisibles pendant le dialogue ; « girl » n'apparaît que pendant le mini-jeu ;
- un crash a été observé une fois, sans trace exploitable ;
- un scintillement (apparition/disparition) a été observé.
Tyrone et Meihui ne sont pas des valeurs par défaut : ce sont les personnages de quête
vin_Base/Quests/bggw/Characters/bggw_tyrone.lpcharacter et
vin_Base/Quests/tam/characters/tam_meihui.lpcharacter, avec INFO First_Name: 100% forcé.
girl est un alias de variable de scène du DSL.
Le DSL distingue deux cas (Docs/Modding/Command_Functions/generatePerson.txt) :
generatePerson() → acteur complètement aléatoire
generatePerson(preset1, …, presetN) → mélange des presets nommés
Le premier cas échoue, le second fonctionne — d'où des personnages de quête corrects et des personnages aléatoires cassés.
2. Mesures de référence
Trois builds packagées Development (cuites, AssetRegistry figé, journalisées), toutes
disponibles sur disque. Compteurs ramenés au nombre de personnages générés (index SPAWN) :
| Build | personnages | Accessed None sur maillage |
/perso | No SkeletalMesh |
/perso |
|---|---|---|---|---|---|
| 4.27 — fonctionne | 15 | 4 | 0,3 | 1 204 | 80 |
| 5.5 avec R-03 | 30 | 1 050 | 35,0 | 6 411 | 214 |
| 5.5 sans R-03 | 13 | 216 | 16,6 | 984 | 76 |
Le seul indicateur discriminant est Accessed None sur un maillage : 0,3 en 4.27 contre
16,6 en 5.5, soit un facteur 55. No SkeletalMesh est à écarter : une fois R-03 annulé,
la 5.5 (76) rejoint la 4.27 (80) — cet avertissement existe dans la version qui fonctionne.
Reproduire la mesure :
grep -c 'index SPAWN' <log>
grep 'Accessed None' <log> | grep -ci mesh
3. État du projet à la reprise
3.1 Ce qui est en place
| Élément | État |
|---|---|
| Campagne R-01 à R-11 | close (voir VictoryPlugin_Architecture.md §10) |
| Correctif AssetRegistry (5 broches orphelines) | appliqué et vérifié — 0 broche restante |
R-03 (56 nœuds SkeletalMesh) |
ANNULÉ — voir §5.1 |
| R-04 (6 nœuds navigation) | annulé avec R-03 (mêmes assets) |
| R-05, R-06 | toujours appliqués |
| Compilation Blueprints | 0 erreur ; ~75 avertissements (nœuds dépréciés revenus avec R-03) |
3.2 Instrumentation temporaire à retirer
| Fichier | Ajout |
|---|---|
Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp |
LogLPModdingTrace sur LoadTxt et GetAllFilesFromFolder |
idem dans LifePlay-master 4.27 |
même instrumentation, pour l'A/B |
3.3 Sauvegardes
| Dossier | Contenu |
|---|---|
Saved/Backups/etat-avec-tous-correctifs/ |
GI.uasset, Person.uasset avec R-03 |
Saved/Backups/avant-R03-R06/ |
13 assets avant la campagne du 2026-09-08 |
Saved/Backups/avant-fix-assetregistry/ |
GI.uasset avant le correctif AssetRegistry |
3.4 Builds
| Chemin | Version | Config | État |
|---|---|---|---|
D:\Game\LifePlay_Build_2026.9 |
4.27 | Shipping | fonctionne, sans journal |
D:\Game\LifePlay_Build_427_Dev |
4.27 | Development | fonctionne, journalisé — la référence |
D:\Game\LifePlay_Build_5.5 |
5.5 | Shipping | avant correctifs |
D:\Game\LifePlay_Build_5.5_Dev |
5.5 | Development | tous correctifs, cassé |
D:\Game\LifePlay_Build_5.5_NoR03 |
5.5 | Development | R-03 annulé, toujours cassé |
4. Ce qui est éliminé, avec preuve
Ne pas refaire ces vérifications.
| Hypothèse | Verdict | Preuve |
|---|---|---|
| Contenu DSL incomplet | écarté | 2 051 / 2 051 fichiers identiques 4.27 ↔ 5.5 |
| Assets manquants | écarté | 8 563 / 8 569 ; les 6 absents sont des matériaux Substance dans Heavy/New/fBlah, dossier jamais cuit |
| Câblage du Victory Plugin | écarté | en 4.27 le contenu n'appelait que 2 fonctions, toutes deux conservées |
FaceCapture / SceneCapture ShowOnly ignoré |
écarté | avertissement identique en 4.27 |
populateClothes4 lit un 4ᵉ champ absent |
écarté | 16 occurrences en 4.27 comme en 5.5 |
GetAssetByObjectPath cassé |
écarté | 2 720 résolutions réussies sur 2 776 ; les 56 échecs sont tous Daz/Michael/hairs/other/Pubes05-06, chemin faux en 4.27 aussi |
Liaisons perdues sur SetSkinnedAssetAndUpdate |
écarté | 8 broches non connectées en 5.5 et les mêmes 8 en 4.27 — ce sont des effacements volontaires |
Renommage SetMasterPoseComponent → SetLeaderPoseComponent |
écarté | NewLeaderBoneComponent correctement connecté |
| Graphes Blueprint altérés | écarté | GI 377 graphes, Person 134, mêmes nombres de nœuds ; seuls écarts : renommages LWC, 2 macros devenues fonctions (Person::QueryStat, GI::FindCenterOfPolygon) |
getRandomEthnicity / getRandomAge modifiés |
écarté | identiques aux renommages LWC près |
beauty_standards_default.txt corrompu |
écarté | identique à l'octet |
ParseIntoArray changé |
écarté | implémentation identique dans les deux moteurs |
Conv_StringToFloat changé |
écarté | identique (FCString::Atof) |
| Chargement des données texte | écarté | 18 tables identiques au caractère près entre les deux builds packagées |
| Énumération des presets cassée | écarté | 5.5 énumère 141 .lpcharacter, 27 féminins, 17 masculins, et en charge 282 |
| R-03 comme cause | écarté | symptôme identique après annulation |
5. Pièges de méthode — à lire avant de reprendre
Quatre bases de comparaison se sont révélées fausses au cours de la session, coûtant plusieurs heures. Elles sont listées ici pour ne pas être retrouvées à la dure.
5.1 Le mode éditeur -game n'est pas représentatif
UnrealEditor.exe <projet> -game casse l'affichage des personnages dans les deux
versions, y compris en 4.27 dont la build packagée fonctionne. Toute mesure d'exécution
prise par ce biais est sans valeur.
Ne comparer que des builds packagées, même configuration.
5.2 Shipping ne journalise pas
Unreal compile la journalisation à zéro en Shipping. Pour tracer, il faut
-clientconfig=Development. C'est pour cela que la build 4.27 qui fonctionnait
(LifePlay_Build_2026.9, Shipping) a dû être repackagée en Development.
5.3 Les journaux doivent atteindre le même point du jeu
Plusieurs comparaisons ont porté sur des sessions dont l'une n'avait jamais généré de
personnage (index SPAWN = 0). Vérifier systématiquement ce compteur avant de conclure,
et normaliser par le nombre de personnages.
5.4 La build qui fonctionne ≠ le projet dont elle est issue
Le projet 4.27 produit une build packagée qui marche et une session éditeur cassée. Ne pas confondre les deux.
5.5 Erreur de motif de recherche
Un comptage annoncé « 0 habillage de PNJ en 5.5 contre 52 en 4.27 » était faux (motif
grep -oE mal formé) ; le vrai chiffre est 12. Toujours recouper un écart catégorique par
un second comptage formulé autrement.
6. Outillage construit (réutilisable)
Dans Source/LifePlayEditorTools/, toutes sur le même patron (-DryRun, rapport, correction,
recompilation, resauvegarde) :
| Commandlet | Rôle |
|---|---|
LPCheckMeshAssignment |
balaye toutes les broches marquées bOrphanedPin — c'est l'outil qui a trouvé le défaut AssetRegistry ; à relancer après toute montée de version |
LPDumpFunction |
vide un graphe Blueprint (-BP=GI -Fn=getRandomEthnicity -Pins, ou -Fn=* pour tout) — compilé aussi dans le projet 4.27, permet le diff de graphes entre versions |
LPFixAssetRegistryPins |
recâble les 5 broches AssetRegistry perdues |
LPFixDeprecatedNodes |
R-03 / R-04 — à ne pas relancer tel quel, voir §7.1 |
LPFixOrphanBoundEvents |
R-05 |
LPFixZeroScaleActors |
R-06 |
LPCheckStreetMap |
valide les 280 villes |
Helpers C++ dans Source/LifePlay/ : LPAssetRegistryHelpers (dont
GetAssetsByClassName, GetAssetObjectPath), LPNavigationHelpers, LPVictoryCompat.
7. Pistes ouvertes, par ordre de valeur
7.1 Refaire R-03 correctement (dette, pas la cause)
R-03 remplaçait la propriété dépréciée SkeletalMesh par GetSkeletalMeshAsset(). Les deux
ont le même corps, mais pas la même classe propriétaire :
| classe | |
|---|---|
SkeletalMesh (propriété dépréciée) |
USkinnedMeshComponent |
GetSkeletalMeshAsset() |
USkeletalMeshComponent |
LifePlay crée des composants proxy à l'exécution (Person::NewProxy via AddComponent,
puis MorphProxy, UpdateProxyMorphs, PickPenisMesh). Sur un proxy qui n'est pas un
USkeletalMeshComponent, l'appel renvoie null. Mesuré : R-03 faisait passer les
déréférencements nuls de 16,6 à 35,0 par personnage.
Refaire en testant le type réel du composant, ou en ajoutant à ULPVictoryCompat un
GetSkeletalMeshFromSkinned(USkinnedMeshComponent*) qui accepte la classe de base.
7.2 Le variant DSL au tableau vide — piste principale
Divergence mesurée entre builds packagées comparables : 2 occurrences en 5.5, 0 en 4.27.
GI::ReturnStatIfNeeded
GetVariable(Name) → Variable
Break Variable → Class = "Float" (le variant annonce un flottant)
→ Float[0] ← TABLEAU VIDE
Attempted to access index 0 from array Float_15_A281… of length 0!
GI::CallFunction:3A9C ← ReadSceneLine ← PlayScene ← UpdateCheckForScenes
Le graphe est identique entre les deux versions ; c'est la création de ces variables qui
diffère. Indice structurel : Content/Structs/Variable.uasset porte un DoubleProperty en
5.5 et aucun en 4.27 — conversion LWC du conteneur de variables du DSL.
Prochaine étape : instrumenter l'écriture de ces variables (pas leur lecture), et comparer avec la référence 4.27 désormais disponible.
7.3 Les 16,6 déréférencements nuls par personnage
Répartition en 5.5 sans R-03 : à établir (avec R-03 ils étaient dominés par les nœuds R-03, qui masquaient le reste). Relancer :
grep 'Accessed None' <log> | grep -i mesh | grep -oE 'property [A-Za-z_0-9]+' | sort | uniq -c | sort -rn
7.4 Points mineurs identifiés, non traités
Daz/Michael/hairs/other/Pubes05-06: chemin faux, assets réellement dansDaz/Bridget/Hairs/Pubic/. Présent en 4.27 aussi. 56 échecs de résolution par session.- Matériau
FntMatdu mobilier :bUsedWithStaticLightingmanquant → matériau par défaut. Modules/ModLauncher.config: échec de chargement dans les deux versions.- R-07 (Enhanced Input) : non traité, voir
VictoryPlugin_Architecture.md§10.5.
8. Protocole de mesure recommandé
- Packager les deux versions en Development (
-clientconfig=Development -CookAll). - Lancer chacune, atteindre un événement avec des personnages.
- Vérifier
index SPAWN > 0dans les deux journaux avant toute comparaison. - Normaliser tout compteur par le nombre de personnages générés.
- Ne conclure qu'après un A/B sur deux builds de même configuration.
Journaux :
D:\Game\LifePlay_Build_427_Dev\WindowsNoEditor\LifePlay\Saved\Logs\LifePlay.log
D:\Game\LifePlay_Build_5.5_Dev\Windows\LifePlay\Saved\Logs\LifePlay.log