Documentation de migration finalisee : architecture 5.5, guide developpeur, commandes utiles, protocole des operations, bilan

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
edujiro5972 2026-10-02 00:25:11 +02:00
parent 669d186350
commit 77adfd9007
13 changed files with 714 additions and 23 deletions

View file

@ -5,6 +5,8 @@
> 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).
> **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).
---

View file

@ -66,7 +66,8 @@ $Proj = 'D:\Game\LifePlay-master 5.5\LifePlay.uproject'
### 3.4 Niveau exécution (build empaquetée Development)
Construction : `RunUAT BuildCookRun -project="$Proj" -platform=Win64 -clientconfig=Development
-build -cook -stage -pak:false -archive -archivedirectory=D:\Game\LifePlay_Build_5.5_V1`.
-build -cook -iterate -stage -archive -archivedirectory=D:\Game\LifePlay_Build_5.5_<lot> -unattended -utf8output -nop4`
(sans `-pak` : fichiers nus, comme la version de l'auteur ; voir `09_Commandes_Utiles.md` §2).
| ID | Vérifie | Mesure (`Tools\LogStats.ps1`) | Critère |
|---|---|---|---|
@ -139,4 +140,8 @@ Après retour arrière : relancer T-STAT-01 à T-STAT-04 et T-BUILD-01. Consigne
| `Tools/AssetHeaders.ps1` | format UE4/UE5 des packages | ✅ |
| `Tools/CheckIntegrity.ps1` | T-STAT-02 à T-STAT-04 | ✅ (L0) |
| `Tools/LogStats.ps1` | compteurs de journal, comparaison A/B | ✅ (L0) |
| Commandlets `LifePlayEditorTools` | `LPCheckMeshAssignment`, `LPCheckStreetMap`, `LPDumpFunction`, `LPFix*` (option `-DryRun`) | existants |
| `Tools/RunCommandlet.ps1` | lancement d'une commandlet, journal archivé par lot | ✅ |
| `Tools/ReimportCorrectif.ps1` | réimport scripté d'un correctif (photo, simulation comptée, application, diff, compilation) | ✅ (L4) |
| `Tools/DiffRemplacementNoeuds.py` | diff indépendant d'un rebranchement de nœuds (profils `L7a`, `L7b`, `CX-B12`) | ✅ (L7a) |
| Commandlets `LifePlayEditorTools` | 24 commandlets d'analyse et de correction (catalogue : `08_Guide_Developpeur.md` §5) | ✅ |
| Options de diagnostic du jeu | `-LPDumpVars`, `-LPTrace*`, `-LPDump*` (`09_Commandes_Utiles.md` §4) | ✅ |

View file

@ -136,8 +136,9 @@ Traitement du `Registre_Erreurs.md` **par ordre de fréquence × gravité**, un
session de 30 min ; tri du registre ; étiquette `v1.0`.
- **Sortie** : tous les tests V1.
### L7+ — Lots post-V1 (un par famille)
Ordre indicatif, à réviser selon le registre :
### L7+ — Lots post-V1 (un par famille) ✅ (2026-10-02)
> Tous les lots ouverts sont clos : appliqués et validés en jeu, ou évalués non nécessaires (L7e, L7f).
> V1.1 publiée le 2026-10-01 (tag `v1.1`, branche `ue5.5-v1.1`).
| Lot | Famille | Périmètre |
|---|---|---|
@ -162,3 +163,24 @@ Ordre indicatif, à réviser selon le registre :
| D-02 | R-03/R-04 présents sur `AI`, `Room` et 7 widgets, annulés sur `Person` et `GI` | **Décidé (utilisateur)** : tout annuler maintenant — réalisé par le retour à la base 4.27 | acquis (L1) |
| D-03 | Mesure d'exécution | builds empaquetées Development uniquement (règle §2 du document 03) | acquis |
| D-04 | Suivi de version | dépôt git local, Blueprints de gameplay inclus, `Content/Heavy` exclu (sauvegardes par lot) | acquis (L0) |
## 5. Bilan de la migration (2026-10-02)
| Indicateur | Valeur |
|---|---|
| Versions publiées | `v1.0` (2026-09-30), `v1.1` (2026-10-01) |
| Modifications tracées | `CHG-001` à `CHG-057` |
| Signatures d'erreurs enregistrées | 37 (`ERR-001` à `ERR-037`) |
| Correctifs de contenu réimportés | CX-B01 à B04, B07 à B12 (CX-B05 rejeté, CX-B06 remplacé par B11) |
| Paquets au format UE5 | 8 563 / 8 563 |
| Compilation Blueprints, cuisson | 0 erreur, 0 avertissement |
| Données `Modules` | 2 051 fichiers, identiques à 4.27 |
| Villes StreetMap | 280 / 280 identiques à 4.27 |
| Builds validées en jeu | V1rc (V1), L7a, L7b, L7i_B12, Shipping (V1.1), L7cdj (L7c, L7d, L7j, L7l) |
Restent ouverts au registre, sans effet constaté en jeu : ERR-004, ERR-008, ERR-009, ERR-013,
ERR-015, ERR-016, ERR-019, ERR-024. Défauts d'origine 4.27 conservés : ERR-030 (habillage), ERR-037
(Quick dress), nuit claire (le soleil ne suit pas l'heure), grand disque blanc à l'horizon.
Pistes pour la suite, une par lot selon `10_Protocole_Operations.md` : conversion Cascade → Niagara,
migration complète des entrées vers Enhanced Input, cycle jour/nuit, erreurs ouvertes par fréquence.

View file

@ -22,11 +22,16 @@ exporté dans `Docs/Migration/correctifs/` pour relecture.
| CX-C06 | `P01`, `P05` | `LPVictoryCompat` (2 fonctions) + 3 `[CoreRedirects]` Victory → LifePlay | chargement de `GI`, `ExtImg`, `FaceTexture`, `MainMenu`, `Inventory` | conservé ; à contrôler en L4 (T-LOAD-01) |
| CX-C07 | `P01` | `LPAssetRegistryHelpers::GetAssetByObjectPath` : conversion `FSoftObjectPath` | compilation | conservé |
| CX-C08 | `P01` | `LPAssetRegistryHelpers::GetAssetsByClassName`, `GetAssetObjectPath` (nouvelles fonctions) | réimport de CX-B01 | conservé, **inutilisé** tant que CX-B01 n'est pas réimporté |
| CX-C09 | `P01` | `LPNavigationHelpers` (enrobage pur de `K2_GetRandomLocationInNavigableRadius`) | R-04 | conservé, inutilisé (R-04 annulé) |
| CX-C09 | `P01` | `LPNavigationHelpers` (enrobage pur de `K2_GetRandomLocationInNavigableRadius`) | R-04 | conservé ; **utilisé par CX-B11** (L7b) |
| CX-C10 | `P01` | `LifePlay.Build.cs` : `PublicIncludePaths`, `NavigationSystem`, `ImageWrapper`, `ApplicationCore` | compilation | conservé |
| CX-C11 | `P05` | `Config` : `[CoreRedirects]`, 4 clés PhysX retirées, classes Enhanced Input par défaut, description, `StagingDirectory`, section `McpAutomationBridgeSettings` | — | conservé ; relu en L2 |
| CX-C12 | `P03` (hors patch : ajouté le 2026-09-28) | instrumentation `LogLPModdingTrace` | diagnostic | **à retirer** en L3 |
| CX-C12 | `P03` (hors patch : ajouté le 2026-09-28) | instrumentation `LogLPModdingTrace` | diagnostic | **retiré** en L3 (CHG-016 : `LogModdingExtra` en `Verbose`) |
| CX-C13 | `P02` | commandlets `LifePlayEditorTools` (1 777 lignes) | outillage éditeur | conservé ; ne touche pas au jeu |
| CX-C14 | — | `LPSessionLogSubsystem` : résumé de démarrage, bilan de session, options de diagnostic `-LPDump*`/`-LPTrace*` | EX-07, diagnostic | ajouté (L3, L5, L7i, L7l) |
| CX-C15 | — | `LPStringCompat`, `LPMeshCompat` : fonctions au comportement 4.27, cibles de CX-B08, B10, B12 | parité 4.27 | ajouté |
| CX-C16 | — | `LPSecondScreenSubsystem` : cadrage du visage du contact pendant un appel | ERR-031 (amélioration) | ajouté (L7j, CHG-054), validé en jeu |
| CX-C17 | — | `LPOutdoorRoomSubsystem` : plafond `WallT` masqué dans les lieux extérieurs | ERR-036 (amélioration) | ajouté (L7l, CHG-057), validé en jeu |
| CX-C18 | — | `Config` : rendu explicite (L7c), clés de nativisation retirées, `DirectoriesToAlwaysCook=/Game` | parité, cuisson complète | ajouté (CHG-025, CHG-049) |
## 2. Correctifs de contenu (retirés en L1, à réimporter un par un)
@ -44,7 +49,7 @@ exporté dans `Docs/Migration/correctifs/` pour relecture.
| CX-B10 | `LPFixSkeletalMeshGet` (nouveau) | 56 nœuds `Get SkeletalMesh`, 8 Blueprints (`Person` 28, `GI` 17, `CharGen` 3, `Inventory` 3, `Hairstyle` 2, `CharGenSlider`, `Cursor`, `Inventory_Cloth` 1) | remplacés par `LPMeshCompat::GetSkeletalMesh(Component)` = `Cast<USkeletalMesh>(GetSkinnedAsset())`, la sémantique exacte du getter déprécié, valable pour tout `USkinnedMeshComponent` | R-03 refait (L7a) ; remplace CX-B05 rejeté | 1 | **réimporté** (CHG-036), validé en jeu |
| CX-B11 | `LPFixNavRandomPoint` (nouveau) | 6 nœuds `GetRandomPointInNavigableRadius` (`Person` 3, `Room` 2, `AI` 1) | remplacés par `LPNavigationHelpers::GetRandomLocationInNavigableRadius` : nœud pur, mêmes broches, même corps que la fonction dépréciée (appel de `K2_GetRandomLocationInNavigableRadius`, identique en 4.27 et 5.5) ; liaisons et valeurs par défaut reportées broche par broche | R-04 (L7b) : 6 derniers avertissements de compilation ; le remplaçant moteur est impur (broches d'exécution), d'où l'enrobage pur | 1 | **réimporté** (CHG-037), retiré à tort (CHG-038) puis réappliqué (CHG-039) ; validé en jeu |
| CX-B12 | `LPFixStringSearch` (nouveau) | 385 nœuds `Contains` (160), `Split` (222), `FindSubstring` (3), 28 Blueprints (`GI` 240, `Person` 35, `Room` 16, `CharGen` 14…) | rebranchés sur `LPStringCompat::Contains/Split/FindSubstring` : mêmes broches ; sous-chaîne vide en mode insensible à la casse depuis le début → « non trouvé » comme en 4.27 (UE5 : trouvé en position 0) | ERR-005 (`getBeautyValue` ×38 : `filterMorphList` sans étiquette laissait passer tous les morphs) et toute recherche de texte avec un motif vide | 1 | **réimporté** (CHG-042), validé en jeu (CHG-043) |
| CX-B07 | `LPResavePackages` (nouveau) | 239 paquets UE4 restants (`UI` 147, `Structs` 57, `BPs` 22, `Render` 11, `Characters` 1, `Scenes` 1) | format UE5, contenu inchangé | EX-03 ; T-STAT-01 | 6 | **réimporté** (CHG-035), diff avant/après neutre ; validation en jeu en attente |
| CX-B07 | `LPResavePackages` (nouveau) | 239 paquets UE4 restants (`UI` 147, `Structs` 57, `BPs` 22, `Render` 11, `Characters` 1, `Scenes` 1) | format UE5, contenu inchangé | EX-03 ; T-STAT-01 | 6 | **réimporté** (CHG-035), diff avant/après neutre ; validé en jeu (build V1rc, V1) |
## 3. Protocole de réimport sous contrôle renforcé

View file

@ -1,6 +1,10 @@
# 06 — Protocole de validation de la V1 (lot L6)
> Build candidate : `D:\Game\LifePlay_Build_5.5_L5d\Windows` (code : tag `L5-valide`).
> **Résultat : V1 validée le 2026-09-30, tag `v1.0`.** Build finale `D:\Game\LifePlay_Build_5.5_V1rc`
> (= L4-CX-B07) : partie utilisateur d'environ 2 h, 339 personnages générés, 0 plantage, sortie normale,
> sauvegardes `1.sav` et `2.sav` rechargées. Détail : `Journal_Modifications.md`, section V1.
>
> Build candidate initiale : `D:\Game\LifePlay_Build_5.5_L5d\Windows` (code : tag `L5-valide`).
> Référence des exigences : `04_Cahier_Des_Charges.md` §1.1 (EX-01 à EX-09).
## 1. Ce qui est déjà acquis

View file

@ -0,0 +1,185 @@
# 07 — Architecture de LifePlay en UE 5.5 (état final de la migration)
> Complète `01_Architecture_Initiale.md`, qui décrit le fonctionnement hérité de 4.27 (données texte,
> `ModdingExtra`, interpréteur du DSL dans `GI`). Ce document décrit ce que la migration a ajouté ou
> appris : la couche de compatibilité C++, les sous-systèmes, les différences de comportement du
> moteur et le fonctionnement de la scène (studio, pièces, écran d'appel), mesurés en jeu.
> État au 2026-10-02 : V1.1 publiée, lots L7a à L7l validés.
---
## 1. Vue d'ensemble
```
Content/Modules/** (texte, hors paquet) inchangé depuis 4.27 (2 051 fichiers, MD5 identiques)
│
Plugins/ModdingExtra LoadTxt / SaveTxt / GetAllFilesFromFolder (porté UE5, trace en Verbose)
│
Content/BPs/GI ── interpréteur du DSL, événements, personnages, sauvegarde (Blueprints 4.27,
│ Person, Room, AI, UI/* resauvegardés UE5)
│
│ appels Blueprint redirigés vers la couche de compatibilité (nœuds rebranchés par commandlet)
▼
Source/LifePlay ── bibliothèques de compatibilité (comportement 4.27 garanti)
│ LPStringCompat · LPMeshCompat · LPNavigationHelpers
│ LPAssetRegistryHelpers · LPVictoryCompat
│
└── sous-systèmes d'instance de jeu (aucun Blueprint modifié)
LPSessionLog (journal, diagnostic) · LPSecondScreen (caméra d'appel)
LPOutdoorRoom (plafond des lieux extérieurs)
Source/LifePlayEditorTools ── commandlets d'analyse et de correction (éditeur uniquement)
Plugins/StreetMap (280 villes, porté LWC) Plugins/McpAutomationBridge (éditeur uniquement)
```
Principe directeur : **les Blueprints de gameplay restent ceux de 4.27**. Chaque écart de comportement
du moteur est corrigé soit en rebranchant des nœuds vers une fonction C++ qui reproduit le comportement
4.27 (corrections « CX-B »), soit par un sous-système C++ qui agit à l'exécution sans toucher aux
assets.
## 2. Modules C++
### 2.1 `Source/LifePlay` (runtime, livré avec le jeu)
| Classe | Type | Rôle | Introduit par |
|---|---|---|---|
| `ULPAssetRegistryHelpers` | bibliothèque Blueprint | `GetAssetByObjectPath` en nœud **pur** (le moteur l'a rendu impur) ; `GetAssetsByClassName`, `GetAssetObjectPath` (paramètre `FName` → `FTopLevelAssetPath`) | portage 4.27 ; CX-B01 |
| `ULPVictoryCompat` | bibliothèque Blueprint | les 2 nœuds du Victory Plugin réellement utilisés (`LoadTexture2D_FromFile`, `SaveStringToOSClipboard`) ; `[CoreRedirects]` dans `DefaultEngine.ini` | CX-C06 |
| `ULPStringCompat` | bibliothèque Blueprint | `ParseIntoArray`, `Contains`, `Split`, `FindSubstring`, `FindUE4` avec la sémantique **UE 4.27** (§4) | CX-B08, CX-B12 |
| `ULPMeshCompat` | bibliothèque Blueprint | `GetSkeletalMesh(Component)` = `Cast<USkeletalMesh>(GetSkinnedAsset())`, valable pour tout `USkinnedMeshComponent` (les proxys de `Person` n'en sont pas des `USkeletalMeshComponent`) | CX-B10 |
| `ULPNavigationHelpers` | bibliothèque Blueprint | `GetRandomLocationInNavigableRadius` en nœud **pur** (le remplaçant moteur est impur) | CX-B11 |
| `ULPSessionLogSubsystem` | `UGameInstanceSubsystem` | résumé de démarrage, bilan de session dédoublonné, outils de diagnostic sur option de ligne de commande (§5) | L3, L5, L7i, L7l |
| `ULPSecondScreenSubsystem` | `UGameInstanceSubsystem` | à chaque image, cadre la caméra `SecondScreen` sur le visage du contact affiché (`GI.SecondScreenPerson`) | L7j (ERR-031) |
| `ULPOutdoorRoomSubsystem` | `UGameInstanceSubsystem` | masque le plafond `WallT` de la pièce quand l'échelle Z de sa racine est < 0,05 (lieux extérieurs) | L7l (ERR-036) |
| `ALifePlayGameModeBase` | — | vide ; le vrai mode de jeu est `/Game/BPs/GM` | 4.27 |
Dépendances (`LifePlay.Build.cs`) : publiques `Core`, `CoreUObject`, `Engine`, `InputCore`,
`AssetRegistry`, `NavigationSystem` ; privées `ImageWrapper`, `ApplicationCore`, `EngineSettings`.
Structure plate (pas de sous-dossier `Public/`) : `PublicIncludePaths.Add(ModuleDirectory)`.
### 2.2 `Source/LifePlayEditorTools` (éditeur uniquement)
24 commandlets, en trois familles (catalogue et usages : `08_Guide_Developpeur.md` §5) :
- **analyse en lecture seule** : `LPDumpFunction`, `LPDumpAssets`, `LPDumpComponents`,
`LPDumpWidgetTree`, `LPDumpCDO`, `LPDumpSave`, `LPCheckMeshAssignment`, `LPCheckStreetMap`,
`LPCheckMeshes`, `LPTestStringCompat` ;
- **correction de graphes** (rebranchement de nœuds, contrôle broche par broche intégré, `-DryRun`) :
`LPFixAssetRegistryNodes`, `LPFixAssetRegistryPins`, `LPFixEditableTextBoxFont`,
`LPFixOrphanBoundEvents`, `LPFixParseIntoArray`, `LPFixButtonPadding`, `LPFixSkeletalMeshGet`,
`LPFixNavRandomPoint`, `LPFixStringSearch` ;
- **correction de cartes ou de paquets** : `LPFixZeroScaleActors`, `LPConvertAtmosphericFog`,
`LPFixSceneCapture`, `LPResavePackages`.
`LPFixDeprecatedNodes` (R-03/R-04 d'origine) est conservé pour l'historique mais **ne doit plus
être utilisé** : sa variante R-03 aggrave ERR-002 (CX-B05 rejeté), sa variante R-04 est remplacée par
`LPFixNavRandomPoint`.
### 2.3 Plugins
| Plugin | Cible | Remarque |
|---|---|---|
| `ModdingExtra` | runtime | entrée/sortie des données ; trace d'appel en catégorie `LogModdingExtra` (`Verbose`) |
| `StreetMap` | runtime | porté LWC ; 280 villes vérifiées identiques à 4.27 (L7h) |
| `EnhancedInput` | runtime | système d'entrée actif ; exécute les 34 actions héritées de `DefaultInput.ini` |
| `McpAutomationBridge` | **éditeur uniquement** (`TargetAllowList: Editor`) | pilotage de l'éditeur par serveur MCP ; jamais publié (contient un jeton) |
| `AndroidFileServer` | désactivé | réécrivait un `SecurityToken` dans `DefaultEngine.ini` (ERR-023) |
## 3. Configuration (écarts à 4.27)
| Fichier | Clé | Valeur | Raison |
|---|---|---|---|
| `DefaultGame.ini` | `+DirectoriesToAlwaysCook=(Path="/Game")` | — | assets chargés par chemin texte : sans cela, 3 257 paquets cuits au lieu de 8 561 (ERR-026) |
| `DefaultGame.ini` | `DirectoriesToAlwaysStageAsNonUFS=Modules`, `UsePakFile=False` | inchangés | `Modules` en fichiers nus, comme la version de l'auteur |
| `DefaultGame.ini` | clés de nativisation | retirées | inexistantes en UE5 (L7c) |
| `DefaultEngine.ini` | `r.DynamicGlobalIlluminationMethod=0`, `r.ReflectionMethod=2`, `r.Shadow.Virtual.Enable=0` | explicites | rendu identique à celui validé, indépendant des valeurs par défaut du moteur (L7c) |
| `DefaultEngine.ini` | `DefaultGraphicsRHI_DX12` | explicite | idem |
| `DefaultEngine.ini` | `r.AntiAliasingMethod=2` (TAA) | explicite (`r.DefaultFeature.AntiAliasing` est ignorée par UE5) | supprime le scintillement à l'approche des personnages (ERR-032, L6a) |
| `DefaultEngine.ini` | `[CoreRedirects]` Victory → `LPVictoryCompat` | — | chargement de `GI`, `MainMenu`, `Inventory`… |
| `DefaultEngine.ini` | 4 clés PhysX | retirées | PhysX n'existe plus (Chaos) |
| `LifePlay.uproject` | `TargetPlatforms: ["Windows"]`, plugins explicites | — | L2 |
## 4. Différences de comportement du moteur découvertes (UE 4.27 → 5.5)
Aucune n'est signalée par le compilateur : un graphe identique donne un résultat différent. Elles
expliquent l'essentiel des défauts de la migration.
| # | API | UE 4.27 | UE 5.5 | Effet dans LifePlay | Correction |
|---|---|---|---|---|---|
| 1 | `IAssetRegistry::GetAssetsByClass` | paramètre `FName ClassName` | `FTopLevelAssetPath` ; la valeur est **perdue** à la montée de version | aucun corps, vêtement, coiffure énumérable : personnages identiques (ERR-002) | CX-B01 |
| 2 | `FString::ParseIntoArray("")` | `[]` | `[""]` ; séparateur insensible à la casse | `generatePerson()` charge les 141 presets : personnages invisibles (ERR-027) | CX-B08 |
| 3 | `FString::Find("", IgnoreCase, FromStart)` | `INDEX_NONE` | `0` | `Contains(x, "")` vrai : filtres de morphs sans effet (ERR-005), erreurs en cascade (ERR-006/007) | CX-B12 |
| 4 | style par défaut de `UButton` | marge 2,2,2,2 (`FCoreStyle`) | 12,1.5,12,1.5 (`FUMGCoreStyle`) | les assets 4.27 ne stockent pas la valeur par défaut : barre de temps décalée (ERR-034) | CX-B09 |
| 5 | `USkinnedMeshComponent::SkeletalMesh` | propriété | dépréciée ; `GetSkeletalMeshAsset()` n'existe que sur `USkeletalMeshComponent` | un remplacement naïf renvoie `None` sur les proxys (CX-B05 rejeté) | CX-B10 |
| 6 | `GetAssetByObjectPath`, `K2_GetRandomLocationInNavigableRadius` | purs | impurs | un rebranchement naïf ajoute des broches d'exécution non reliées : nœud élagué | helpers purs |
| 7 | `FEditableTextBoxStyle::Font` | champ | `TextStyle.Font` | broche orpheline : cuisson en échec (ERR-021) | CX-B02 |
| 8 | `AAtmosphericFog` | classe active | dépréciée, convertie en `SkyAtmosphere` au chargement | aucun changement visible | L7d (remplacement explicite) |
| 9 | Shipping (`NO_LOGGING`) | — | les catégories de journal deviennent `FNoLoggingCategory` sans `GetCategoryName` | compilation Shipping en échec | `FName` constant (L7g) |
Leçon générale : **une propriété sérialisée en delta prend silencieusement la nouvelle valeur par
défaut du moteur** (#4), et **une fonction de chaîne peut changer de sémantique sur les cas limites**
(#2, #3). Comparer les sources du moteur 4.27 et 5.5 sur ces cas avant de conclure.
## 5. Journalisation et diagnostic (`ULPSessionLogSubsystem`)
Le sous-système n'altère aucun message existant (les comparaisons A/B avec 4.27 en dépendent). Il
ajoute :
- au démarrage : `===== LifePlay : demarrage =====` (versions, modules, fichiers par type, échecs
`LoadTxt`) ;
- à la fermeture ou par la commande console `LifePlay.LogSummary` : `===== LifePlay : bilan de
session` (volume par catégorie, signatures d'erreurs dédoublonnées) ;
- des outils activés par la ligne de commande, tous inactifs par défaut (liste dans
`09_Commandes_Utiles.md` §4) : variables de `GI` au démarrage et à la fin (`-LPDumpVars`),
trace des exceptions de script avec variables locales et cadres appelants (`-LPTraceScriptEx`…),
relevé de chemins d'objets sur un motif du journal (`-LPDumpOnLog`) ou périodique
(`-LPDumpEvery`).
Un chemin de relevé part de l'instance de jeu et suit les propriétés objet ou structure :
`Room.WallT.RelativeLocation`, `PlayerCharacter.CapsuleComponent.CapsuleHalfHeight`… C'est ce qui a
permis de mesurer la cause réelle d'ERR-036 (le plafond), là où l'analyse statique des données
désignait à tort une dalle de neige.
## 6. Scène, pièces et écran d'appel (mesurés en jeu)
### 6.1 Studio unique
Tous les lieux (bâtiments, extérieurs) sont construits par **un seul acteur `Room_C_0`** placé dans un
studio, en (−3 131 543 ; −14 967 213 ; −115) de `CentralLondon`. Pendant une visite, la ville
(`StreetMapStatic`) est masquée.
### 6.2 Pièce et échelle `.lpworld`
- La racine de `Room` (cube, matériau `FntWall`) prend l'**échelle de la première ligne du `.lpworld`**.
- Les meubles sont positionnés et dimensionnés relativement à cette racine : leurs hauteurs sont donc
multipliées par l'échelle Z.
- Échelles Z déclarées : 81 lieux à 0,2, 5 à 0,3, 1 à 0,4, et **0,01 pour les 7 lieux extérieurs**
(`beach`, `forest`, `mountain`, `park`, `pool`, `river`, `street`).
- Le plafond `WallT` (Z relatif 2 040, sans collision) suit l'échelle : 4,08 m en intérieur, mais
18 à 20 cm au-dessus du sol en extérieur, où il masquait pieds et pieds de meubles (ERR-036,
défaut d'origine 4.27). `ULPOutdoorRoomSubsystem` le masque en extérieur et le rend en intérieur.
### 6.3 Écran d'appel (second écran)
- `GI::Show` place le contact sur son emplacement de scène décalé de −10 000 000 en Y, sur la copie
de scène `SecondScreenFloor`.
- La caméra `SceneCapture2D` `SecondScreen` rend vers `Render/SecondScreen`, affiché par
`UI/Scene::FaceRender`.
- Dans la carte 4.27 d'origine, cette caméra n'avait pas de racine et filmait le ciel (ERR-031,
défaut d'origine). L7j lui a donné une racine (`LPFixSceneCapture`), et
`ULPSecondScreenSubsystem` la cadre à chaque image : 80 cm devant l'os `head` du contact, champ de
30°.
### 6.4 Ciel
`BP_Sky_Sphere` (matériau `M_Sky_Panning_Clouds2`), lumière directionnelle `Sun`, `SkyLight` à
cubemap, `SkyAtmosphere` (ex-`AtmosphericFog`, Z −100 000, `PlanetTopAtComponentTransform`). Le soleil
ne suit pas l'heure : la nuit reste claire en extérieur, **comme en 4.27**. Un grand disque blanc à
l'horizon existe déjà avant L7d (origine non étudiée).
### 6.5 Variables du DSL
`GI::GetVariable` traite à part les noms spéciaux (`Player`, `Ptr`, `Interacting`, `CurrentCompanion`,
`A1` à `A5`) par un `SwitchString`. La variable `AI` est un `AIDummy`. Les variables `Person` vides
signalées en jeu (ERR-003) existent au même taux en 4.27.
## 7. Ce qui reste hérité tel quel
Effets Cascade (4 systèmes, pris en charge par UE 5.5), entrées héritées exécutées par Enhanced Input,
éclairage dynamique sans précalcul. Défauts d'origine 4.27 conservés : ERR-030 (habillage), ERR-037
(Quick dress), nuit claire, disque blanc. Voir `Registre_Erreurs.md`.

View file

@ -0,0 +1,193 @@
# 08 — Guide du développeur (LifePlay UE 5.5)
> Pour reprendre le projet : installer, compiler, empaqueter, diagnostiquer et corriger sans casser
> la parité avec 4.27. Architecture : `07_Architecture_5.5.md`. Commandes prêtes à copier :
> `09_Commandes_Utiles.md`. Méthode de travail obligatoire : `10_Protocole_Operations.md`.
---
## 1. Environnement
| Élément | Valeur |
|---|---|
| Moteur | Unreal Engine **5.5.4** (Launcher) : `D:\Game\Launcher\Engine\UE_5.5` |
| Compilateur | Visual Studio 2022 (`D:\Game\VS2022`), MSVC 14.38, SDK Windows 10.0.22621 |
| Projet | `D:\Game\LifePlay-master 5.5\LifePlay.uproject` |
| Référence (lecture seule, jamais modifiée) | `D:\Game\LifePlay-master 4.27` + build `D:\Game\LifePlay_Build_427_Dev` |
| Sauvegardes de lots | `D:\Game\LifePlay_Backup_5.5\<lot>\` (hors dépôt) |
| Cache de données dérivées | `D:\DDC` (à conserver : évite des heures de recompilation de shaders) |
| Dépôt public | `github.com/edujiro5972/LifePlay-Revival` (branche `main` ; `ue5.5-v1.1` = V1.1) |
Python 3 est utile pour `Tools/DiffRemplacementNoeuds.py`. PowerShell 7 pour les scripts `Tools/*.ps1`.
## 2. Arborescence
| Chemin | Contenu | Versionné |
|---|---|---|
| `Source/LifePlay` | runtime : compatibilité 4.27, sous-systèmes | oui |
| `Source/LifePlayEditorTools` | commandlets (éditeur) | oui |
| `Plugins/ModdingExtra`, `Plugins/StreetMap` | plugins du jeu (sources) | oui |
| `Plugins/McpAutomationBridge` | pilotage MCP de l'éditeur | **non** (outil local, jeton) |
| `Config/` | `.ini` du projet | oui |
| `Content/BPs`, `UI`, `Structs`, `Scenes`, `Render`, `Characters` | Blueprints et cartes de gameplay | oui |
| `Content/Heavy` | maillages, textures, villes (plusieurs Go) | **non** (archive 7z de publication) |
| `Content/Modules` | données texte du jeu (DSL, presets) | oui |
| `Docs/Migration` | cette documentation, journal, registre, relevés `etat/` | oui |
| `Tools/` | scripts de lot, de mesure et de diff | oui |
| `Saved/Logs/portage` | journaux de parties et de commandlets archivés | non |
| `.mcp.json`, `.claude/` | configuration locale d'agent (jeton) | **jamais** |
## 3. Compiler
```powershell
$UE = 'D:\Game\Launcher\Engine\UE_5.5\Engine'
$Proj = 'D:\Game\LifePlay-master 5.5\LifePlay.uproject'
& "$UE\Build\BatchFiles\Build.bat" LifePlayEditor Win64 Development -Project="$Proj" -WaitMutex
```
- **Fermer l'éditeur avant** : avec Live Coding actif, UBT refuse de compiler
(« Unable to build while Live Coding is active »).
- Le module d'outils est compilé avec `bUseUnity=false` (des fichiers concaténés entreraient en
collision) : une inclusion manquante se voit immédiatement.
- Critère : 0 erreur, aucun nouvel avertissement.
## 4. Empaqueter
```powershell
& "$UE\Build\BatchFiles\RunUAT.bat" BuildCookRun -project="$Proj" -platform=Win64 `
-clientconfig=Development -build -cook -iterate -stage -archive `
-archivedirectory=D:\Game\LifePlay_Build_5.5_<nom> -unattended -utf8output -nop4
```
- **Pas de `-pak`** : comme la version de l'auteur (`UsePakFile=False`), le jeu est livré en fichiers
nus ; `Modules` doit rester modifiable par les joueurs et les mods.
- `-clientconfig=Shipping` pour une version distribuable (ne journalise pas) ; `Development` pour
toute mesure.
- Contrôle T-PKG-01 : ≥ 8 555 `.uasset` sous `Windows/LifePlay/Content` (8 561 attendus).
- Le résultat est dans `<archivedirectory>\Windows\LifePlay.exe`.
Builds de référence conservées : `LifePlay_Build_427_Dev` (4.27 journalisée), `LifePlay_Build_5.5_V1rc`
(V1.0), `LifePlay_Build_5.5_L7i_B12` (avant L7c/L7d), `LifePlay_Build_5.5_Shipping` (V1.1
distribuable), `LifePlay_Build_5.5_L7cdj` (dernier état validé).
## 5. Commandlets (`Source/LifePlayEditorTools`)
Lancement commun : `UnrealEditor-Cmd.exe "<projet>" -run=<Nom> <options> -unattended -nopause -nosplash`
(ou `Tools\RunCommandlet.ps1`, qui archive le journal). L'éditeur graphique doit être **fermé** pour
une commandlet qui écrit des assets.
### 5.1 Analyse (lecture seule)
| Commandlet | Options | Usage |
|---|---|---|
| `LPDumpFunction` | `-BP=<nom> [-Fn=<fonction>] [-Pins] [-Exec]` | graphe d'une fonction Blueprint ; identique sur 4.27 et 5.5 pour comparer |
| `LPDumpAssets` | `-List=<fichier>` ou `-Dirs=/Game/A,/Game/B` ; `-Out=<fichier>` | photographie complète de paquets (propriétés non par défaut, broches et liaisons) pour diff avant/après |
| `LPDumpComponents` | `-BP=<nom>` ou `-Map=<carte> -Filter=<texte>` ; `[-All]` | composants et propriétés modifiées ; révèle les changements de valeurs par défaut |
| `LPDumpWidgetTree` | `-BP=<widget>` ou `-BP=*` | arbre UMG et propriétés de slot |
| `LPDumpCDO` | `-Class=/Game/BPs/GI.GI_C -Out=<f> -Props=A,B` | valeurs par défaut d'une classe (tableaux et maps) |
| `LPDumpSave` | `-File=<.sav> -Out=<f> [-Props=A,B]` | contenu d'une sauvegarde |
| `LPCheckMeshAssignment` | — | nœuds d'affectation de maillage et broches orphelines (T-LOAD-02) |
| `LPCheckStreetMap` | `[-CSV=<f>] [-Path=/Game/…] [-Verbose]` | contenu des 280 villes |
| `LPCheckMeshes` | `-Path=/Game/… -CSV=<f>` | LOD, sommets, triangles, dimensions des maillages statiques |
| `LPTestStringCompat` | — | compare `LPStringCompat` à une transcription de `FString::Find` 4.27 |
### 5.2 Correction de graphes (toujours `-DryRun` d'abord)
| Commandlet | Correctif | Cible |
|---|---|---|
| `LPFixAssetRegistryNodes` | CX-B00 | `GetAssetByObjectPath` → version pure |
| `LPFixAssetRegistryPins` | CX-B01 | `GetAssetsByClass` : classe perdue |
| `LPFixEditableTextBoxFont` | CX-B02 | broche `Font` → `TextStyle.Font` |
| `LPFixOrphanBoundEvents` | CX-B04 | événements `On Clicked` sans widget |
| `LPFixParseIntoArray` | CX-B08 | `ParseIntoArray` → `LPStringCompat` |
| `LPFixButtonPadding` | CX-B09 | marges `UButton` → valeurs UE4 |
| `LPFixSkeletalMeshGet` | CX-B10 | `Get SkeletalMesh` → `LPMeshCompat` |
| `LPFixNavRandomPoint` | CX-B11 | `GetRandomPointInNavigableRadius` → helper pur |
| `LPFixStringSearch` | CX-B12 | `Contains`/`Split`/`FindSubstring` → `LPStringCompat` |
| `LPFixDeprecatedNodes` | (R-03/R-04 d'origine) | **ne plus utiliser** |
Toutes réappliquées à l'état actuel, elles ne trouvent plus rien (idempotentes).
### 5.3 Cartes et paquets
| Commandlet | Options | Usage |
|---|---|---|
| `LPFixZeroScaleActors` | `[-Fix "-Scale=0.1"]` | composantes d'échelle nulles (CX-B03) ; **guillemets obligatoires** sous PowerShell |
| `LPConvertAtmosphericFog` | `-Map=<carte> [-DryRun]` | `AtmosphericFog` → `SkyAtmosphere` (L7d) |
| `LPFixSceneCapture` | `-Map -Actor -From "-Offset=x,y,z" [-DryRun]` | racine et position d'une `SceneCapture2D` (L7j) |
| `LPResavePackages` | `-List=<fichier> [-DryRun]` | réenregistrement UE5 sans modification (CX-B07) |
## 6. Écrire un correctif
### 6.1 Choisir la forme
| Situation | Forme | Exemple |
|---|---|---|
| Une fonction moteur appelée par des Blueprints a changé de comportement | fonction C++ de compatibilité (mêmes broches) **+** commandlet de rebranchement | `LPStringCompat` + `LPFixStringSearch` |
| Une fonction moteur est devenue impure | enrobage pur | `LPNavigationHelpers` |
| Un défaut visible, sans changement de Blueprint souhaité | `UGameInstanceSubsystem` + `FTSTicker`, lecture des propriétés de `GI` par réflexion | `LPOutdoorRoomSubsystem`, `LPSecondScreenSubsystem` |
| Une valeur par défaut du moteur a changé | commandlet qui réécrit **uniquement** les composantes égales au nouveau défaut | `LPFixButtonPadding` |
| Une carte mal construite | commandlet `-Map=` avec vérification et sauvegarde conditionnelle | `LPFixSceneCapture` |
Préférer le sous-système quand c'est possible : aucun asset modifié, retour arrière = retirer deux
fichiers.
### 6.2 Commandlet de rebranchement : exigences
Modèle : `LPFixNavRandomPointCommandlet.cpp` (puis `LPFixStringSearch`, sa généralisation).
1. Trouver les nœuds par classe et fonction exactes ; compter (le `-DryRun` doit donner le nombre
attendu).
2. Relever avant modification, pour chaque broche : liaisons et valeur par défaut.
3. Créer le nouveau nœud au même emplacement, reporter **broche par broche, par nom**.
4. Comparer après : tout écart, broche sans équivalent, cible `self` reliée ou nœud impur → nœud
laissé en l'état, **Blueprint non sauvegardé**.
5. Recompiler puis sauvegarder les seuls Blueprints entièrement corrects.
Contrôle indépendant : `LPDumpAssets` avant/après puis
`python Tools/DiffRemplacementNoeuds.py avant.txt apres.txt <profil>` (profils `L7a`, `L7b`,
`CX-B12` ; ajouter un profil pour un nouveau correctif). Le diff ne doit montrer **que** les nœuds
remplacés.
### 6.3 Sous-système : modèle
```cpp
void UMonSubsystem::Initialize(FSubsystemCollectionBase& C)
{ Super::Initialize(C); TickHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &UMonSubsystem::Tick)); }
void UMonSubsystem::Deinitialize() { FTSTicker::GetCoreTicker().RemoveTicker(TickHandle); Super::Deinitialize(); }
```
- Lire une variable Blueprint de `GI` : `FindPropertyByName` + `CastField<FObjectPropertyBase>`.
- Rechercher un acteur de carte par `GetFName()` : les étiquettes d'acteur n'existent pas en Shipping.
- Ne jamais défaire un état que le sous-système n'a pas lui-même posé (voir `HiddenCeiling`).
- Ne pas utiliser `LogLifePlay.GetCategoryName()` : en Shipping la catégorie est un
`FNoLoggingCategory`.
## 7. Diagnostiquer
1. **Le défaut existe-t-il en 4.27 ? dans le build précédent ?** Demander avant toute analyse
(`10_Protocole_Operations.md` §3).
2. Mesurer sur une build **Development empaquetée**, jamais avec `UnrealEditor.exe -game`.
3. Comparer 4.27 et 5.5 sur un **parcours identique** (nouvelle partie, vitesse normale, mêmes lieux)
avec `Tools\LogStats.ps1 -Compare`.
4. Pour un état d'exécution (positions, variables), utiliser les options `-LPDump*` et `-LPTrace*`
(`09_Commandes_Utiles.md` §4) dans un fichier `.bat` placé à côté de l'exécutable, que
l'utilisateur lance à la place de `LifePlay.exe`.
5. Pour un graphe : `LPDumpFunction` sur les deux arbres, puis diff.
6. Pour un écart de comportement du moteur : lire les sources moteur 4.27 et 5.5 sur les cas limites ;
en faire un test (`LPTestStringCompat`).
Inspection en direct : avec l'éditeur ouvert et le serveur MCP lancé (`McpAutomationBridge`, port 3000),
l'agent peut lire acteurs et propriétés de la carte. Usage en lecture seule recommandé ; toute
modification passe par une commandlet versionnée.
## 8. Publier
- Compte GitHub `edujiro5972` (vérifier `gh auth status` : un autre compte est aussi connecté).
- Identité de commit : `edujiro5972 <336072401+edujiro5972@users.noreply.github.com>`.
- **Jamais publiés** : adresse e-mail personnelle, `.mcp.json`, `.claude/`, `Plugins/McpAutomationBridge`,
tout `SecurityToken`, `Content/Heavy`, binaires, `*.png`, `*.7z`, `*.mp4` (règles du `.gitignore`
d'origine ; pas de LFS).
- Version complète : archive 7z des sources et du contenu (`D:\Game\LifePlay_Publication`), avec
empreinte SHA-256 publiée dans le README.
- Tags : `v1.0`, `v1.1` ; un tag `<lot>-valide` par lot validé en jeu.

View file

@ -0,0 +1,126 @@
# 09 — Commandes utiles
> Toutes les commandes se lancent depuis `D:\Game\LifePlay-master 5.5`, sous PowerShell 7. Explications :
> `08_Guide_Developpeur.md`. Méthode : `10_Protocole_Operations.md`.
```powershell
$UE = 'D:\Game\Launcher\Engine\UE_5.5\Engine'
$Cmd = "$UE\Binaries\Win64\UnrealEditor-Cmd.exe"
$Proj = 'D:\Game\LifePlay-master 5.5\LifePlay.uproject'
```
**Piège PowerShell** : un argument contenant une virgule ou un point après `=` doit être placé entre
guillemets (`"-Offset=0,-10000000,0"`, `"-Scale=0.1"`), sinon il est découpé et la commandlet reçoit une
valeur fausse.
## 1. État et intégrité
```powershell
git status; git log --oneline -5; git tag --list '*-valide' # où en est-on
.\Tools\CheckIntegrity.ps1 -Modules -Env -Ref427 # données, environnement, référence 4.27 intacts
.\Tools\AssetHeaders.ps1 # 0 paquet UE4 attendu (8563/8563 UE5)
```
## 2. Compilation et build
```powershell
& "$UE\Build\BatchFiles\Build.bat" LifePlayEditor Win64 Development -Project="$Proj" -WaitMutex
& "$UE\Build\BatchFiles\Build.bat" LifePlay Win64 Shipping -Project="$Proj" -WaitMutex
& "$UE\Build\BatchFiles\RunUAT.bat" BuildCookRun -project="$Proj" -platform=Win64 -clientconfig=Development `
-build -cook -iterate -stage -archive -archivedirectory=D:\Game\LifePlay_Build_5.5_<nom> -unattended -utf8output -nop4
(Get-ChildItem D:\Game\LifePlay_Build_5.5_<nom>\Windows\LifePlay\Content -Recurse -Filter *.uasset).Count # T-PKG-01 ≥ 8555
```
## 3. Commandlets
```powershell
# Générique, journal archivé par lot
.\Tools\RunCommandlet.ps1 -Lot <lot> -Commandlet CompileAllBlueprints
.\Tools\RunCommandlet.ps1 -Lot <lot> -Commandlet LPFixStringSearch -Args '-DryRun'
# Directement
& $Cmd $Proj -run=CompileAllBlueprints -unattended -nopause # T-LOAD-01
& $Cmd $Proj -run=LPCheckMeshAssignment -unattended -nopause # T-LOAD-02
& $Cmd $Proj -run=LPDumpFunction -BP=GI -Fn=GeneratePerson -Pins -unattended -nopause
& $Cmd $Proj -run=LPDumpAssets -List=<liste.txt> -Out=<photo.txt> -unattended -nopause
& $Cmd $Proj -run=LPDumpComponents -Map=/Game/Scenes/CentralLondon -Filter=SecondScreen -unattended -nopause
& $Cmd $Proj -run=LPDumpSave "-File=Saved\SaveGames\1.sav" -Out=<f.txt> -unattended -nopause
& $Cmd $Proj -run=LPCheckStreetMap -CSV=Docs/Migration/etat/streetmap.csv -unattended -nopause
& $Cmd $Proj -run=Cook -TargetPlatform=Windows -unattended # T-LOAD-05
# Diff indépendant d'un rebranchement de nœuds
python Tools\DiffRemplacementNoeuds.py <avant.txt> <apres.txt> CX-B12
```
Réimport scripté d'un correctif (photo, simulation comptée, application, diff, compilation) :
```powershell
.\Tools\ReimportCorrectif.ps1 -Id L4-CX-B02 -Commandlet LPFixEditableTextBoxFont `
-Assets Content\UI\StatMenu.uasset,Content\UI\CharGen.uasset `
-Graphs StatMenu:EventGraph,CharGen:EventGraph -ExpectPattern 'LogLPFixFont: Warning: \w+ ::' -ExpectCount 6
```
## 4. Options de diagnostic du jeu (build Development)
À passer à `LifePlay.exe`, de préférence dans un `.bat` à côté de l'exécutable :
`start "" "%~dp0LifePlay.exe" <options>`. Toutes inactives par défaut. Résultats dans
`Windows\LifePlay\Saved\Logs\LifePlay.log`, catégorie `LogLifePlay`.
| Option | Effet |
|---|---|
| `-LogCmds="LogModdingExtra Verbose"` | trace de chaque `LoadTxt`/`SaveTxt`/`GetAllFilesFromFolder` (comparaison A/B avec 4.27) |
| `-LPDumpVars=A,B` | valeur des variables `A`, `B` de `GI` au démarrage et à la fin (tableaux : un élément par ligne) |
| `-LPTraceScriptEx=<texte>` | à chaque exception de script dont le message contient `<texte>` : fonction, offset, variables locales |
| `-LPTraceLocals=x,y` | ne relever que les variables locales dont le nom contient `x` ou `y` |
| `-LPTraceFunctions=F1,F2` | ne relever que les exceptions levées dans ces fonctions |
| `-LPTraceDepth=N` | relever aussi les N cadres appelants |
| `-LPTraceGIVars=A,B` | relever aussi ces variables de `GI` |
| `-LPTraceMax=N` | nombre maximal de relevés (3 par défaut) |
| `-LPDumpPaths=a.b.c,…` | chemins à relever, depuis `GI` (ex. `Room.WallT.RelativeLocation`) |
| `-LPDumpOnLog=<texte>` | relevé quand une ligne du journal contient `<texte>` (au plus une fois toutes les 5 s) |
| `-LPDumpDelay=S` | délai avant ce relevé (1,5 s par défaut ; le lieu se charge en arrière-plan) |
| `-LPDumpMax=N` | nombre maximal de relevés sur motif (20 par défaut) |
| `-LPDumpEvery=S` | relevé périodique toutes les S secondes |
Commande console : `LifePlay.LogSummary` (bilan de session à la demande).
Exemple (mesure L7l, `LifePlay_releve_L7l.bat`) :
```bat
start "" "%~dp0LifePlay.exe" -LPDumpEvery=5 -LPDumpPaths=CurrentAmenity,Room.RootComponent.RelativeScale3D,Room.WallT.RelativeLocation,PlayerCharacter.CapsuleComponent.RelativeLocation
```
## 5. Journaux
```powershell
.\Tools\LogStats.ps1 <journal> # compteurs, signatures les plus fréquentes
.\Tools\LogStats.ps1 -Compare <journal 4.27>, <journal 5.5> # A/B normalisé par personnage
Select-String <journal> -Pattern '===== LifePlay' # résumé de démarrage et bilan
Copy-Item <build>\Windows\LifePlay\Saved\Logs\LifePlay.log Saved\Logs\portage\<lot>_<objet>_<date>.log # archiver
```
Journal de la référence 4.27 : `D:\Game\LifePlay_Build_427_Dev\WindowsNoEditor\LifePlay\Saved\Logs\LifePlay.log`.
## 6. Sauvegarde et retour arrière
```powershell
git tag <lot>-avant
.\Tools\Snapshot.ps1 -Lot <lot> -Path Content\BPs\GI.uasset, Content\Scenes\CentralLondon.umap
.\Tools\Snapshot.ps1 -Lot <lot> -Path Content\UI -Recurse
.\Tools\Restore.ps1 -Lot <lot> -WhatIf # simuler
.\Tools\Restore.ps1 -Lot <lot> # restaurer (les versions remplacées sont conservées)
.\Tools\Restore.ps1 -Lot <lot> -Only Content\BPs\GI.uasset # un seul fichier
git checkout <lot>-avant -- Source Config # code et configuration
```
## 7. Publication
```powershell
gh auth status # compte actif : edujiro5972
git config user.name; git config user.email # edujiro5972 / 336072401+edujiro5972@users.noreply.github.com
git push origin main <tag>
Get-FileHash <archive.7z> -Algorithm SHA256 # empreinte à publier dans le README
```

View file

@ -0,0 +1,116 @@
# 10 — Protocole suivi pendant les opérations
> Règles appliquées du 2026-09-29 au 2026-10-02 pour toute modification du projet, et leçons tirées des
> erreurs commises. Elles valent pour toute reprise du projet, par un développeur comme par un agent.
> Détail des tests : `03_Plan_Migration_Tests.md` ; correctifs de contenu : `05_Correctifs_Isoles.md`.
---
## 1. Principes
1. **Documentation d'abord** : comprendre et écrire avant de modifier (documents 01 à 03 avant le
premier lot).
2. **Lots bornés** : un lot = un objectif mesurable, une famille de corrections, une session de
travail. Un lot qui déborde est coupé : le validé est commité, le reste devient un autre lot.
3. **Un correctif = un sous-lot = un commit**. Jamais de regroupement.
4. **Tout est tracé** : entrée `CHG-NNN` au journal (date, lot, fichiers, raison, retour arrière),
défaut au registre (`ERR-NNN`).
5. **Tout est réversible** : tag git avant, copie des fichiers hors git (`Snapshot.ps1`), aucune
suppression sans copie préalable.
6. **La référence 4.27 fait foi** : `D:\Game\LifePlay-master 4.27` n'est jamais modifié ; un
comportement 5.5 est correct s'il est identique à 4.27 sur le même parcours.
7. **Environnement préservé** : `.claude/`, `.mcp.json` (jeton : jamais versionné ni affiché),
`.editorconfig`, `Saved/Backups/`, `Saved/SaveGames/`, `Saved/Config/WindowsEditor`,
`Saved/Logs/portage/`, `D:\DDC`.
## 2. Déroulé d'un lot
| # | Étape | Preuve |
|---|---|---|
| 1 | Entrée : lot précédent validé, `git status` propre | — |
| 2 | `git tag <lot>-avant` | tag |
| 3 | `Tools\Snapshot.ps1 -Lot <lot> -Path <fichiers visés>` | manifeste MD5 dans `D:\Game\LifePlay_Backup_5.5\<lot>` |
| 4 | Photographie avant (`LPDumpAssets` ou `LPDumpFunction`) | fichier `etat/` ou `Saved/Logs/portage` |
| 5 | Simulation (`-DryRun`) : le nombre d'éléments trouvés doit égaler le nombre attendu | journal de la commandlet ; tout écart arrête le lot |
| 6 | Application, avec le contrôle intégré de la commandlet | journal |
| 7 | Photographie après + **diff indépendant** (`DiffRemplacementNoeuds.py`) : seuls les éléments attendus diffèrent | diff |
| 8 | `CompileAllBlueprints`, compilation C++ : aucune erreur ni avertissement nouveau | résumé |
| 9 | Build Development empaquetée | `D:\Game\LifePlay_Build_5.5_<lot>` |
| 10 | **Test en jeu par l'utilisateur** (§4) | retour, captures, journal archivé |
| 11 | Vert : `CHG` au journal, registre, cahier des charges, commit, tag `<lot>-valide`, push | commit |
| 12 | Rouge : **proposer** le retour arrière (§3.4), l'exécuter après accord, `CHG` d'annulation | journal |
## 3. Règles de diagnostic (leçons de la campagne)
### 3.1 Le défaut existe-t-il déjà ?
Avant toute analyse approfondie ou tout retour arrière, demander à l'utilisateur :
**le défaut existe-t-il en 4.27 ? dans le build 5.5 précédent ?**
Pendant la campagne, la plupart des défauts visuels signalés en jeu étaient d'origine (ERR-003, ERR-030,
ERR-031, ERR-036, ERR-037, nuit claire, disque blanc).
### 3.2 Vérifier les conditions de jeu
Un symptôme visuel peut venir des conditions de jeu. Exemple : les « téléportations » de L7b
n'étaient que l'accélération du temps. Vérifier la vitesse du jeu et le moment de la journée avant
d'agir.
### 3.3 Comparer à l'identique
- Mêmes builds de même configuration (Development), jamais l'éditeur en `-game`.
- **Même parcours** : nouvelle partie, vitesse normale, mêmes lieux dans le même ordre.
- Compteurs normalisés par personnage généré ; deux journaux qui atteignent le même point.
- Pour une capture : **même lieu, même cadrage, même heure**. Deux captures prises sous des angles
différents ne prouvent rien.
### 3.4 Retour arrière : proposer, jamais improviser
Deux retours arrière ont été lancés à tort pendant la campagne : L7b (CHG-038, réappliqué en CHG-039)
et L7d (2026-10-02, annulé avant commit). Les deux reposaient sur une comparaison mal faite. Règle :
- présenter le retour arrière comme une **proposition**, avec la preuve de régression ;
- **attendre l'accord** de l'utilisateur avant de l'exécuter ;
- prendre d'abord un instantané de l'état courant (`Snapshot.ps1 -Lot <lot>-retour`), pour pouvoir
défaire le retour lui-même.
### 3.5 Mesurer l'exécution plutôt que déduire
Ne pas corriger à partir de la seule lecture des données ou des graphes.
- Exemple : pour ERR-036, l'analyse statique désignait une dalle de neige. Le relevé en jeu
(`-LPDumpEvery`) a montré la vraie cause : le plafond.
- Instrumenter (§4 de `09_Commandes_Utiles.md`), faire jouer, puis conclure.
### 3.6 Lire les sources du moteur
Un graphe identique peut donner un autre résultat (`07_Architecture_5.5.md` §4). Quand un écart
reste inexpliqué, comparer le code moteur 4.27 et 5.5 de la fonction appelée, sur ses cas limites.
Cela a permis de trouver CX-B08 (`ParseIntoArray`) et CX-B12 (`FString::Find`).
### 3.7 Toujours lire les diffs
Une commandlet peut perdre une liaison sans erreur ; un diff non relu ne prouve rien. Exemple : la
perte de police de CX-B02 (ERR-025), dépendante de l'ordre de traitement, n'a été trouvée qu'en lisant
le diff.
## 4. Tests en jeu avec l'utilisateur
1. Fournir une build complète dans `D:\Game\LifePlay_Build_5.5_<lot>\Windows` et, si une mesure est
nécessaire, un `.bat` de lancement avec les options de diagnostic. Préciser de lancer le `.bat`
et non `LifePlay.exe`.
2. Dire précisément quoi faire : lieu, durée, actions, ce qu'il faut regarder, captures attendues.
3. Après la partie, archiver le journal :
`Saved/Logs/portage/<lot>_<objet>_<date>.log`.
4. Analyser le journal avant de conclure ; demander une capture quand le défaut est visuel.
5. Une question de comparaison (4.27, build précédent) se pose **avant** d'interpréter le résultat.
## 5. Traçabilité
| Support | Contenu | Règle |
|---|---|---|
| `Journal_Modifications.md` | `CHG-001` à `CHG-057` | une entrée par modification, avec la commande de retour arrière |
| `Registre_Erreurs.md` | `ERR-001` à `ERR-037` | statut : ouvert, corrigé (CHG), accepté, préexistant en 4.27 |
| `04_Cahier_Des_Charges.md` | lots et statut | mis à jour à chaque validation |
| `05_Correctifs_Isoles.md` | correctifs CX-C (code) et CX-B (contenu) | un correctif par ligne, statut |
| git | commits et tags `<lot>-avant`, `<lot>-apres`, `<lot>-valide`, `v1.0`, `v1.1` | message en français, une ligne par lot |
| `D:\Game\LifePlay_Backup_5.5` | copies par lot, manifestes MD5 | jamais supprimé |
| `Saved/Logs/portage` | journaux de parties et de commandlets | jamais supprimé |
## 6. Publication
- Vérifier le compte actif (`gh auth status`) et l'identité de commit avant tout push.
- Relire ce qui part : ni jeton, ni adresse e-mail, ni outil local (`McpAutomationBridge`), ni contenu
lourd ou binaire (`.gitignore` d'origine).
- Une version publiée est figée : tag (`v1.0`, `v1.1`), branche (`ue5.5-v1.1`), archive 7z dont
l'empreinte SHA-256 est publiée.

View file

@ -899,3 +899,7 @@ Mesure L7l (2026-10-01, `L7l_releve3_20261001.log`, relevé toutes les 5 s) : li
Validation en jeu (2026-10-01, build `LifePlay_Build_5.5_L7cdj`) : en forêt, pieds des personnages et sol texturé visibles (ERR-036 corrigé) ; pendant un appel, visage du contact cadré (ERR-031 corrigé) ; ciel de jour correct (L7c/L7d), nuit non vérifiée. Tags `L7j-valide`, `L7l-valide`.
Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (soleil fixe) **en 4.27, en L7i_B12 et en L7cdj** : comportement d'origine. Le grand disque blanc à l'horizon est présent **en L7i_B12 comme en L7cdj** : il ne vient pas de L7d (déjà présent en V1, origine non étudiée). Un retour arrière de L7d, lancé à tort avant cette comparaison, a été annulé avant tout commit ou build (`Tools\Restore.ps1 -Lot L7d-retour`, empreinte de la carte revenue à `8BD9C4A9…`). Tags `L7c-valide`, `L7d-valide`.
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-058 | 2026-10-02 | Doc | nouveaux `07_Architecture_5.5.md`, `08_Guide_Developpeur.md`, `09_Commandes_Utiles.md`, `10_Protocole_Operations.md` ; mis à jour `README.md` (migration et racine), `01`, `03`, `04` (bilan §5), `05` (CX-C14 à C18, statuts), `06` (résultat V1), registre (ERR-020) | finalisation de la documentation de migration : architecture finale, guide développeur, commandes, protocole et leçons | `git revert` du commit |

View file

@ -1,27 +1,48 @@
# Migration LifePlay 4.27 → 5.5 — point d'entrée
Reprise de la migration commencée le 2026-09-29, après l'échec du premier portage.
La migration a été reprise le 2026-09-29, après l'échec d'un premier portage.
| Document | Contenu |
|---|---|
| [01_Architecture_Initiale.md](01_Architecture_Initiale.md) | fonctionnement de LifePlay : données texte → `ModdingExtra` → interpréteur `GI` → événements et personnages |
| [02_Audit_Logiciel.md](02_Audit_Logiciel.md) | état réel de la cible 5.5, corruption, obsolescence, erreurs mesurées |
| [03_Plan_Migration_Tests.md](03_Plan_Migration_Tests.md) | catalogue des tests, règles de mesure, retour arrière |
| [04_Cahier_Des_Charges.md](04_Cahier_Des_Charges.md) | exigences V1, lots L0 à L7, décisions |
| [Journal_Modifications.md](Journal_Modifications.md) | chaque modification, avec son retour arrière |
| [Registre_Erreurs.md](Registre_Erreurs.md) | erreurs mesurées, priorité, lot cible |
| `etat/` | empreintes et relevés datés par lot |
**État au 2026-10-02** :
- V1 publiée (`v1.0`, 2026-09-30), puis V1.1 (`v1.1`, 2026-10-01) ;
- lots post-V1 L7a à L7l clos (appliqués et validés en jeu, ou évalués non nécessaires) ;
- 8 563 paquets UE5, 0 erreur de compilation ni de cuisson, données et villes identiques à 4.27.
## Documents
| Document | Pour qui | Contenu |
|---|---|---|
| [01_Architecture_Initiale.md](01_Architecture_Initiale.md) | tous | fonctionnement hérité de 4.27 : données texte → `ModdingExtra` → interpréteur `GI` → événements, personnages, sauvegarde |
| [07_Architecture_5.5.md](07_Architecture_5.5.md) | tous | état final : couche de compatibilité C++, sous-systèmes, différences de comportement du moteur, studio et pièces mesurés en jeu |
| [02_Audit_Logiciel.md](02_Audit_Logiciel.md) | historique | état de la cible 5.5 au début de la reprise |
| [04_Cahier_Des_Charges.md](04_Cahier_Des_Charges.md) | pilotage | exigences V1, lots L0 à L7 et leur statut, décisions, **bilan final** (§5) |
| [03_Plan_Migration_Tests.md](03_Plan_Migration_Tests.md) | développeurs | catalogue des tests (statique, compilation, chargement, exécution, A/B) |
| [05_Correctifs_Isoles.md](05_Correctifs_Isoles.md) | développeurs | correctifs de code (CX-C) et de contenu (CX-B), protocole de réimport |
| [06_Protocole_Validation_V1.md](06_Protocole_Validation_V1.md) | historique | validation de la V1 en jeu |
| [08_Guide_Developpeur.md](08_Guide_Developpeur.md) | développeurs | environnement, compilation, packaging, commandlets, écrire un correctif, diagnostiquer, publier |
| [09_Commandes_Utiles.md](09_Commandes_Utiles.md) | développeurs | commandes prêtes à copier, options de diagnostic du jeu |
| [10_Protocole_Operations.md](10_Protocole_Operations.md) | **obligatoire avant toute modification** | déroulé d'un lot, règles de diagnostic, leçons de la campagne, tests avec l'utilisateur |
| [Journal_Modifications.md](Journal_Modifications.md) | traçabilité | `CHG-001` à `CHG-057`, chacune avec son retour arrière |
| [Registre_Erreurs.md](Registre_Erreurs.md) | traçabilité | `ERR-001` à `ERR-037`, statut et lot |
| `correctifs/` | relecture | écarts de code 4.27 → 5.5 en patchs (`P01` à `P06`) |
| `etat/` | preuves | empreintes et relevés datés par lot |
Documents antérieurs, toujours valables : `Docs/Architecture/VictoryPlugin_Architecture.md`,
`Docs/Architecture/Rapport_Session_2026-09-28.md`.
## Ordre de lecture conseillé
1. Comprendre le jeu : 01 puis 07.
2. Travailler sur le projet : 10 (règles), 08 (guide), 09 (commandes).
3. Retrouver pourquoi une chose est ainsi : journal, registre, 05.
## Démarrer une session de travail
```powershell
Set-Location 'D:\Game\LifePlay-master 5.5'
git status; git tag --list 'lot-*' # où en est-on
.\Tools\CheckIntegrity.ps1 -Modules -Env -Ref427 # rien n'a bougé à notre insu
.\Tools\AssetHeaders.ps1 # format des packages
git status; git log --oneline -5; git tag --list '*-valide' # où en est-on
.\Tools\CheckIntegrity.ps1 -Modules -Env -Ref427 # rien n'a bougé à notre insu
.\Tools\AssetHeaders.ps1 # format des paquets
```
Puis suivre le lot suivant de `04_Cahier_Des_Charges.md` §3, en respectant les règles du §2.
Ensuite, choisir un lot dans `04_Cahier_Des_Charges.md` §5 (pistes) ou dans le registre, et suivre
`10_Protocole_Operations.md` §2.

View file

@ -6,7 +6,7 @@
| ID | Signature | Source | Fréquence | Gravité | Lot cible | Statut |
|---|---|---|---:|---|---|---|
| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | clos (CHG-007) : remplacé par la base saine 4.27 complète ; format UE5 → ERR-022 |
| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | corrigé statiquement (CHG-018) ; A/B d'exécution en attente |
| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | **corrigé (CHG-018)**, validé en jeu avec ERR-002 (personnages aléatoires distincts, V1) |
| ERR-021 | broche `Font` d'`EditableTextBoxStyle` : échec de compilation `UI/StatMenu`, `UI/CharGen` | `CompileAllBlueprints` L1 | 6 erreurs | **bloquante** (cuisson) | L4-CX-B02 | corrigé (CHG-022) |
| ERR-022 | 293 packages de gameplay au format UE4 (base 4.27) | `Tools\AssetHeaders.ps1` | 293 | faible (converti au chargement) | L4-CX-B07 | **corrigé (CHG-035, CX-B07)** : 239 paquets réenregistrés (le nombre avait baissé de 293 à 239 grâce aux lots CX-B01 à B09) ; 8563/8563 paquets au format UE5 |
| ERR-023 | `AndroidFileServer` réécrit sa section et son `SecurityToken` dans `DefaultEngine.ini` à chaque lancement | L1 | chaque lancement | faible (bruit git) | L2 | clos (CHG-011, CHG-012) |

View file

@ -60,6 +60,14 @@ Changes since V1, each validated in game against UE 4.27 on an identical play pa
| `archive/ue4.27` | the project as it ran on UE 4.27, before the migration (archive) |
| `archive/original` | Vinfamy's original repository, V3.6 (archive) |
## Developer documentation (French)
Start with [`Docs/Migration/README.md`](Docs/Migration/README.md). Main documents:
[architecture after the migration](Docs/Migration/07_Architecture_5.5.md),
[developer guide](Docs/Migration/08_Guide_Developpeur.md) (build, packaging, commandlets, writing a fix),
[useful commands](Docs/Migration/09_Commandes_Utiles.md) (including in-game diagnostic options) and the
[operating protocol](Docs/Migration/10_Protocole_Operations.md) followed for every change.
Each migration step has `<step>-avant` / `<step>-apres` (before / after) tags. The change log
[`Docs/Migration/Journal_Modifications.md`](Docs/Migration/Journal_Modifications.md) records every change with its
rollback procedure.