LifePlay-Revival/Docs/Architecture/Rapport_Session_2026-09-28.md

255 lines
12 KiB
Markdown
Raw Normal View History

# 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' <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 :
```bash
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
```