LifePlay-Revival/Docs/Architecture/Rapport_Session_2026-09-28.md
edujiro5972 1122e17fa6 L0 : etat initial du projet 5.5 avant toute correction
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>
2026-09-29 00:56:10 +02:00

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 dans Daz/Bridget/Hairs/Pubic/. Présent en 4.27 aussi. 56 échecs de résolution par session.
  • Matériau FntMat du mobilier : bUsedWithStaticLighting manquant → 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é

  1. Packager les deux versions en Development (-clientconfig=Development -CookAll).
  2. Lancer chacune, atteindre un événement avec des personnages.
  3. Vérifier index SPAWN > 0 dans les deux journaux avant toute comparaison.
  4. Normaliser tout compteur par le nombre de personnages générés.
  5. 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