# 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 : ```bash grep -c 'index SPAWN' grep 'Accessed None' | 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 -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 : ```bash grep 'Accessed None' | 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 ```