255 lines
12 KiB
Markdown
255 lines
12 KiB
Markdown
|
|
# 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
|
||
|
|
```
|