L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
# 01 — Architecture initiale de LifePlay (référence 4.27, écarts 5.5)
2026-10-19 20:57:42 +00:00
> **Historique 4.27** — Ce document décrit le portage UE 4.27 → 5.5 (V1). Il n'est plus mis à jour : moteur et outils actuels dans `27_Plan_Migration_UE58.md` et `Tools/Engine.ps1`.
L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
> Document de référence de la reprise de migration (2026-09-29).
> Source : étude en lecture seule de `D:\Game\LifePlay-master 4.27` (tables de noms, d'imports et
> d'exports des `.uasset`, graphes Blueprint, code C++, journal d'exécution 4.27 Development).
> Complément : `Docs/Architecture/VictoryPlugin_Architecture.md` (C++ et plugins) et
> `Docs/Architecture/Rapport_Session_2026-09-28.md` (bug ouvert).
2026-10-01 22:25:11 +00:00
> **Suite : `07_Architecture_5.5.md`** décrit l'état final (couche de compatibilité C++, sous-systèmes,
> différences de comportement du moteur, studio et pièces mesurés en jeu).
L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
---
## 1. Vue d'ensemble
LifePlay est un **moteur de script piloté par des données texte** , écrit presque entièrement en
Blueprint. Il n'y a **ni DataTable, ni JSON, ni XML, ni clé de gameplay dans les `.ini`** .
```
Content/Modules/** (fichiers texte : .lpmod .lpstat .lpaction .lpscene .lpai .lpquest
│ .lptalk .lpdesc .lpcharacter .lpworld, tables *.txt)
│ lus à l'exécution, sur disque, hors paquet
▼
Plugins/ModdingExtra (C++) LoadTxt · SaveTxt · GetAllFilesFromFolder
│ FFileHelper / IFileManager sur FPaths::ProjectContentDir()
▼
Content/BPs/GI.uasset (GameInstance, 606 fonctions, 618 variables, 50 Mo)
│ analyse, tableaux Raws_*, structures, interpréteur du DSL
├──► ÉVÉNEMENTS CheckForScenes → PlayScene → ReadSceneLine → CallFunction (219 commandes)
├──► PERSONNAGES GeneratePerson → LoadPreset / Person.RandomizeAll
└──► SAUVEGARDE Save_C, GameSettings_C, CityExpansion_C (USaveGame) + .lpcharacter
▼
Content/BPs/Person.uasset (386 fonctions : morphs, peau, cheveux, stats) UI/* (≈100 widgets)
Plugins/StreetMap (280 villes) Source/LifePlay (helpers AssetRegistry, compat Victory)
```
Contrainte de packaging **vitale** : `Config/DefaultGame.ini`
`+DirectoriesToAlwaysStageAsNonUFS=(Path="Modules")` . `Modules` doit rester en fichiers nus à côté
de l'exécutable : il est lu par `FFileHelper` , pas par le système de paquets. Les mods de la
communauté reposent sur ce point.
## 2. Configuration de démarrage
| Fichier | Clé | Valeur |
|---|---|---|
| `DefaultEngine.ini` | `GameInstanceClass` | `/Game/BPs/GI.GI_C` |
| `DefaultEngine.ini` | `GlobalDefaultGameMode` | `/Game/BPs/GM.GM_C` |
| `DefaultEngine.ini` | `GameDefaultMap` | `/Game/Scenes/CentralLondon.CentralLondon` |
| `DefaultGame.ini` | `DirectoriesToAlwaysStageAsNonUFS` | `Modules` |
| `DefaultGame.ini` | `UsePakFile` | `False` |
| `DefaultInput.ini` | 55 `ActionMappings` (34 actions), 13 `AxisMappings` (6 axes) | consommés par `BPs/PC` uniquement |
Aucun `GConfig` dans le C++. Les réglages joueur sont dans `Saved/SaveGames/GameSettings.sav` .
## 3. Couches logicielles
### 3.1 C++ du projet
| Module | Type | Contenu utile |
|---|---|---|
| `Source/LifePlay` | Runtime | `ULPAssetRegistryHelpers::GetAssetByObjectPath` (nœud pur, utilisé par `GI` , `Person` , `Room` , `UI/VisualMorph` ) ; en 5.5 aussi `LPVictoryCompat` , `LPNavigationHelpers` |
| `Source/LifePlayEditorTools` | Editor | commandlets d'analyse et de correction de graphes (`LPDumpFunction`, `LPCheckMeshAssignment` , `LPFix*` , `LPCheckStreetMap` ) |
`ALifePlayGameModeBase` est vide : le vrai mode de jeu est `/Game/BPs/GM` .
### 3.2 Plugins
| Plugin | Rôle | Fonctions consommées par le contenu |
|---|---|---|
2026-09-28 23:12:38 +00:00
| `ModdingExtra` (Vinfamy, Runtime, `PreLoadingScreen` ) | **toute l'entrée/sortie de données** | `LoadTxt` : `BPs/GI` , `Room` ; `UI/CharGen` , `Contact` , `ContactMenu` , `Inventory` , `MainMenu` , `ModManager` , `StatMenu` . `GetAllFilesFromFolder` : `BPs/GI` , `Room` ; `UI/Builder` , `CharGen` , `CityMenu` , `StatMenu` . `SaveTxt` : `BPs/GI` , `Room` ; `UI/BodyShapeMenu` , `Inventory` |
L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
| `StreetMap` (fork Vinfamy) | villes OSM : routes, bâtiments, `SearchByBuildingName` | 292 assets |
| `VictoryBPLibrary` (4.27 seulement) | 2 nœuds : `Victory_LoadTexture2D_FromFile` , `Victory_SaveStringToOSClipboard` | remplacé en 5.5 par `LPVictoryCompat` + `[CoreRedirects]` |
## 4. Formats de données
| Motif | Format | Champs | Consommateur (`GI`) |
|---|---|---|---|
| `Modules/<id>/<id>.lpmod` | `CLÉ: valeur` | `MODULE_UNIQUEID/NAME/AUTHOR/LINK/DESCRIPTION/REQUIREMENTS` | `removeDeletedMods` , `UI/ModManager` |
| `Modules/ModLauncher.config` | ligne 1 `UseConfigIgnoreAppData:true/false` , puis `UniqueID:IsEnabled` (déduit) | — | `ReadModLauncher` → `ParseConfig` → `ModEnableds` . **Absent du disque dans les deux versions** |
| `*.lpstat` | `CLÉ: valeur` | `STAT_ID, STAT_NAME, PLAYER_ONLY, NPC_ONLY, HIGHER_BETTER, STAT_MIN, STAT_MAX, DAILY_CHANGE, DEFAULT_VALUE` | `PopulateStats` → `StatValue[]` |
| `*.lpaction` | `CLÉ: valeur` | `ACTION_UNIQUEID/NAME, WHERE, WHEN, MINUTES, TIMEOUT_MINUTES, ALSO_TIMEOUT, EFFECTS, CONDITIONS, MOVE_FIRST, SCENE_ALWAYS, ANIMATION` | `PopulateActions` → `ActionDetail[]` , `AmenityAction[]` |
| `*.lpscene` | en-tête `WHAT/WHERE/WHEN/WHO/OTHER` , puis corps DSL | — | `PopulateScenes` → `Scene[]` ; corps relu par `PlayScene` |
| `*.lpai` | corps DSL (5 premières lignes ignorées) | — | `LPAI` , `AI_High/Med` , `UpdateAI` |
| `*.lpquest` | `CLÉ: valeur` | `ID, NAME, DESC, ONCE, CONDITIONS, START` | `PopulateQuests` → `Quest[]` |
| `*.lptalk` , `*.lpdesc` | condition + textes, séparateur `##` , préfixes `*START*` /`*END*` | — | `PopulateTalksAndDescs` |
| `*.lpcharacter` | `CATÉGORIE Param: p% v1, p% v2…` ; plage `lo=>hi` | catégories `INFO, HAIR, SKIN, MORPH, STAT, SCALE, PENIS` | `LoadPreset` → `ReadLine` → `ChanceMinMax` → `GenerateAndApply{Floats,Strings,Bools}` |
| `*.lpworld` | taille de pièce, blocs `*****` (maillage `///` matériaux `///` transformation) | — | `PopulateWorldPresets` , `Room` |
| `Modules/names_{F,M}.txt` | un prénom par ligne | — | `FillNamePool` |
| `Modules/outfits_{M,F}[_work/_sports/_swim].txt` | `;` entre tenues, `,` entre pièces | — | `ReadOutfits` |
| `Modules/uniforms.txt` | lieux, puis listes F et M | — | `readUniforms` |
| `Modules/Clothes4.txt` , `SimplifyMorphs.txt` , `donors.txt` | `Nom: Daz?: Slots: Tag,Nombre` | — | `populateClothes4` , `SimplifyMorphs` |
| `Modules/MorphTags/*.txt` | un morph par ligne, `: tag` optionnel | — | `PopulateAllMorphTags` |
| `Modules/beauty_standards_default.txt` | `tag: poidsA: poidsB` | — | `PopulateBeautyStandardsDefault` , `getRandomEthnicity` , `getRandomAge` |
| `Modules/Pregnancy_Morphs.txt` | `Morph:valeur` | — | `FillPregnancyMorphs` |
| `Saved/SaveGames/GameSettings.sav` | `GameSettings_C` (63 variables) | `PercentMale/Female/IntSame/IntOpp/IntTrans` , `Fantasy*` , `BodyShapeDistribution` , `BeautyStandards_Custom` , `ModEnableds` , volumes… | `LoadSettings` / `SaveSettings` |
| `Saved/SaveGames/<slot>.sav` | `Save_C` (137 variables) | jour, heure, `GeneratedIndex` , relations, `ActorVars` , `GlobalVariables` , grossesses, IA… | `SaveGame` / `LoadGame` / `NewGame` |
| `Content/Saves/<slot>/Characters/N.lpcharacter` | format `.lpcharacter` | personnages générés | `SavePreset` , `DuplicateCharacters` |
Volumétrie 5.5 (identique à 4.27, 2 051 fichiers) : `vin_Base` 1 394 fichiers dont 752 `.lpscene` ,
286 `.lpaction` , 128 `.lpcharacter` , 110 `.lpworld` , 69 `.lpstat` ; 15 autres modules `vin_*` .
36 fichiers de données sont **vides en amont** (34 `.lpscene` de `vin_base/scenes/corruption` ,
`strt_white_m.lpcharacter` , `boss_asks_impregnate)cms.lpscene` ) : ce n'est pas un défaut du portage.
Structures Blueprint utilisées par les pipelines (`Content/Structs`, 57 au total) : `Variable` ,
`ActorVars` , `ChanceMinMax` , `SMBool` , `ActionDetail` , `Scene` , `Quest` , `StatValue` , `ModEnabled` ,
`StringArray` , `FloatArray` , `IntArray` , `PersonData` , `MorphSlider` , `NameFloat` , `Cloth` , `Inventory` .
## 5. Pipelines
### 5.1 Démarrage et injection des données
```
GI.ReceiveInit → UpdateFullScreenMode, AssetReg, minuterie 2 s → DelayedStart
DelayedStart → PC.BeginPlay, StreetMap_Static.BeginPlay, LoadSettings, Make10k
LoadSettings : GameSettings.sav → ~60 variables de GI
→ ReadModLauncher (LoadTxt ModLauncher.config) → ParseConfig → ModEnableds
→ removeDeletedMods (GetAllFilesFromFolder "Modules" *.lpmod)
→ DefaultDistributionIfNeeded (presets male/female → BodyShapeDistribution)
→ PopulateRaws
PopulateRaws (pour chaque module activé)
FillNamePool, readUniforms, PopulateAllMorphTags, PopulateBeautyStandardsDefault, FillPregnancyMorphs
GetAllFilesFromFolder("Modules/< id > ", *.lpstat|lpaction|lpscene|lptalk|lpdesc|lpquest|lpai)
→ LoadTxt → Raws_* (tableaux de chaînes)
→ PopulateStats → PopulateActions → PopulateScenes → PopulateQuests → PopulateTalksAndDescs
→ PopulateWorldPresets → RemoveNPCOnly → CleanRaws
```
Également au démarrage, appelant non identifié (voir §7) : `donors` , `Clothes4` , `SimplifyMorphs` ,
`outfits_*` .
### 5.2 Événements (scènes)
```
Action du joueur : TakeActionWithBuilding / TakeModActionWithBuilding → CheckForScenes
→ LoopCheckForScenes → UpdateCheckForScenes (pour chaque Scene) :
CheckSceneForTimeout → CheckConditionsWhen → CheckConditionsWho → CheckConditionsOther → PlayScene
Autres déclencheurs : UpdateAI (.lpai), actions SCENE_ALWAYS, quêtes (StartQuest → TestScene)
PlayScene : LoadTxt(fichier) → GetValidLines → boucle ReadSceneLine
If/Elseif/Else/Endif/While/Random/Sex( traités en ligne ; variables : GI.Variables (Array< Variable > )
ReadSceneLine → CallFunction (219 commandes) / CallFunctionReturnBool (84 conditions)
fin : DefaultDistribution, destroyAllDummies, clearScenePersons, SceneEnd, Timeout
```
### 5.3 Personnages
```
DSL generatePerson(p1..pn) → GI.GeneratePerson(Presets, Temporary, Relative, MatchRace, VariableToClear) → Person_C
SpawnDummy (réserve de Person_C pré-instanciés, MakeDummyPersons) → BackupCbe → PopulateEachPerson → RandomizeStats
A) presets fournis : pour chaque .lpcharacter dont le nom se termine par le preset → LoadPreset
B) aucun preset : determinePersonVars (Percent*, Fantasy*, MajorityRace, getRandomEthnicity/Age)
→ IsMale, Race, Genital, UpdatePlayerMesh, randomizeName, Person.RandomizeAll
→ ChooseNPCBodyShape(BodyShapeDistribution) → LoadPreset(corps) → MorphRace
→ SavePreset → SaveTxt("Saves/_session/Characters/< GeneratedIndex > .lpcharacter") → AddVariable
LoadPreset : LoadTxt → ReadLine → tirage → GenerateAndApplyFloats (morphs, matériaux)
/ GenerateAndApplyStrings (maillages, cheveux, textures via GetAssetByObjectPath + GetAsset)
/ GenerateAndApplyBools → ResolveConflictingMorphs, Unfat, ShowAppropriateGenital, UpdateProxyMorphs
```
Tout le hasard passe par `KismetMathLibrary` (`RandomFloat`, `RandomBool` , `RandomInteger` …,
`Array_Shuffle` ) : pas de graine, pas de `RandomStream` .
### 5.4 Sauvegarde
`SaveGame(Name, Index)` : `SaveSettings` + `CreateSaveGameObject(Save_C)` + ~100 variables +
`SaveGameToSlot` . Personnages : `DuplicateCharacters` copie `Saves/_session/Characters` ↔
`Saves/<slot>/Characters` (`LoadTxt`/`SaveTxt`).
## 6. Dépendances moteur des pipelines (points sensibles au portage)
| Dépendance | Où | Risque 5.5 |
|---|---|---|
| Structures utilisateur avec tableaux (`Variable`) | conteneur de variables du DSL | `Variable.uasset` porte un `DoubleProperty` en 5.5 (conversion LWC) — piste principale du bug ouvert |
| `TMap` dans les `USaveGame` | `Save_C` , `GameSettings_C` | compatibilité des `.sav` existants |
| `GetAssetByObjectPath` + `GetAsset` | chargement de maillages et textures par chemin | API passée à `FSoftObjectPath` ; broches orphelines au portage |
2026-09-28 23:12:38 +00:00
| `AssetRegistry.GetAssetsByClass("SkeletalMesh" / "StaticMesh" / "StreetMap")` | `GI::EventGraph` : énumération des corps, vêtements, coiffures, meubles, villes | **5.1 a remplacé le paramètre `FName ClassName` par `FTopLevelAssetPath`** : à la montée de version, la valeur de classe est perdue (broche orpheline), la requête ne renvoie plus rien, sans erreur de compilation. Mesuré sur la base 4.27 chargée en 5.5 (L1). Correctif CX-B01 |
L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
| `SetSkeletalMesh` , `SetMasterPoseComponent` , propriété `SkeletalMesh` | `Person` , `GI` , UI | renommés/dépréciés en 5.1 |
| Composants proxy ajoutés à l'exécution (`AddComponent`) | `Person::NewProxy` , `MorphProxy` | type réel `USkinnedMeshComponent` ≠ `USkeletalMeshComponent` (cause de l'échec de R-03) |
| `FFileHelper` , `IFileManager` sur `ProjectContentDir` | `ModdingExtra` | stable ; exige `Modules` hors paquet |
| `GameplayStatics` SaveGame | `GI` | stable |
## 7. Inconnues à lever (lot L5)
2026-09-28 23:35:00 +00:00
1. Appelants de `ReadOutfits` , `PopulateCharGenPage` , `MakeDummyPersons` (probablement `PC` , `MainMenu` ou une minuterie). `populateClothes4` : **appelée par `Person.ReceiveBeginPlay`** (pile d'appel du journal L3).
L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
2. Format exact de `ModLauncher.config` (déduit, jamais observé sur disque).
3. Types de valeur de `PerksUnlocked` , `VoiceTypes` , `ActionCount` (`Map< string ,? > `).
4. Fin de `GeneratePerson` après `fertility_npc` (conditions de branche vers `ChooseNPCBodyShape` ).
5. Fichiers sans chargeur confirmé : `step4_morphs.txt` , `test_output.txt` , `FAQ.txt` , `AllMorphTags.txt` .
6. Contenu binaire de `Default.sav` (un `BodyShapeDistribution` périmé est possible).
## 8. Écarts 5.5 déjà en place (hérités de la campagne du 2026-09-08)
VictoryPlugin retiré et remplacé par `LPVictoryCompat` (+ `[CoreRedirects]` ) ; `StreetMap` porté
(LWC, R-01, R-02) ; `ModdingExtra` porté ; `Target.cs` en `BuildSettingsVersion.V5` /
`Unreal5_5` ; 8 562 packages resauvegardés en UE5 ; commandlets de correction R-03 à R-06.
État détaillé et défauts : `02_Audit_Logiciel.md` .