Decisions D-01/D-02 : correctifs anterieurs non suivis retires.
Content/{BPs,UI,Structs,Scenes,Render,Characters} = 4.27 (385 fichiers,
MD5 verifies). Correctifs isoles : Docs/Migration/05_Correctifs_Isoles.md,
patchs de code 4.27->5.5 dans Docs/Migration/correctifs/.
Releve de base 5.5 : CompileAllBlueprints 6 erreurs (StatMenu, CharGen),
0 echec de chargement ; LPCheckMeshAssignment 5 broches AssetRegistry
orphelines dans GI (GetAssetsByClass). Tools/RunCommandlet.ps1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 KiB
01 — Architecture initiale de LifePlay (référence 4.27, écarts 5.5)
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) etDocs/Architecture/Rapport_Session_2026-09-28.md(bug ouvert).
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 |
|---|---|---|
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 |
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 |
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 |
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)
- Appelants de
ReadOutfits,populateClothes4,PopulateCharGenPage,MakeDummyPersons(probablementPC,MainMenuou une minuterie). - Format exact de
ModLauncher.config(déduit, jamais observé sur disque). - Types de valeur de
PerksUnlocked,VoiceTypes,ActionCount(Map<string,?>). - Fin de
GeneratePersonaprèsfertility_npc(conditions de branche versChooseNPCBodyShape). - Fichiers sans chargeur confirmé :
step4_morphs.txt,test_output.txt,FAQ.txt,AllMorphTags.txt. - Contenu binaire de
Default.sav(unBodyShapeDistributionpé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.