diff --git a/Docs/Migration/01_Architecture_Initiale.md b/Docs/Migration/01_Architecture_Initiale.md index ccbca60..dadee50 100644 --- a/Docs/Migration/01_Architecture_Initiale.md +++ b/Docs/Migration/01_Architecture_Initiale.md @@ -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). --- diff --git a/Docs/Migration/03_Plan_Migration_Tests.md b/Docs/Migration/03_Plan_Migration_Tests.md index 9c89ba9..b68f0b8 100644 --- a/Docs/Migration/03_Plan_Migration_Tests.md +++ b/Docs/Migration/03_Plan_Migration_Tests.md @@ -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_ -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) | ✅ | diff --git a/Docs/Migration/04_Cahier_Des_Charges.md b/Docs/Migration/04_Cahier_Des_Charges.md index e21f7d0..625728b 100644 --- a/Docs/Migration/04_Cahier_Des_Charges.md +++ b/Docs/Migration/04_Cahier_Des_Charges.md @@ -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. \ No newline at end of file diff --git a/Docs/Migration/05_Correctifs_Isoles.md b/Docs/Migration/05_Correctifs_Isoles.md index 51a1e9a..c6a101f 100644 --- a/Docs/Migration/05_Correctifs_Isoles.md +++ b/Docs/Migration/05_Correctifs_Isoles.md @@ -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(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é diff --git a/Docs/Migration/06_Protocole_Validation_V1.md b/Docs/Migration/06_Protocole_Validation_V1.md index 274cb7a..032357c 100644 --- a/Docs/Migration/06_Protocole_Validation_V1.md +++ b/Docs/Migration/06_Protocole_Validation_V1.md @@ -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 diff --git a/Docs/Migration/07_Architecture_5.5.md b/Docs/Migration/07_Architecture_5.5.md new file mode 100644 index 0000000..1e89973 --- /dev/null +++ b/Docs/Migration/07_Architecture_5.5.md @@ -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(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`. diff --git a/Docs/Migration/08_Guide_Developpeur.md b/Docs/Migration/08_Guide_Developpeur.md new file mode 100644 index 0000000..6064365 --- /dev/null +++ b/Docs/Migration/08_Guide_Developpeur.md @@ -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\\` (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_ -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 `\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 "" -run= -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= [-Fn=] [-Pins] [-Exec]` | graphe d'une fonction Blueprint ; identique sur 4.27 et 5.5 pour comparer | +| `LPDumpAssets` | `-List=` ou `-Dirs=/Game/A,/Game/B` ; `-Out=` | photographie complète de paquets (propriétés non par défaut, broches et liaisons) pour diff avant/après | +| `LPDumpComponents` | `-BP=` ou `-Map= -Filter=` ; `[-All]` | composants et propriétés modifiées ; révèle les changements de valeurs par défaut | +| `LPDumpWidgetTree` | `-BP=` ou `-BP=*` | arbre UMG et propriétés de slot | +| `LPDumpCDO` | `-Class=/Game/BPs/GI.GI_C -Out= -Props=A,B` | valeurs par défaut d'une classe (tableaux et maps) | +| `LPDumpSave` | `-File=<.sav> -Out= [-Props=A,B]` | contenu d'une sauvegarde | +| `LPCheckMeshAssignment` | — | nœuds d'affectation de maillage et broches orphelines (T-LOAD-02) | +| `LPCheckStreetMap` | `[-CSV=] [-Path=/Game/…] [-Verbose]` | contenu des 280 villes | +| `LPCheckMeshes` | `-Path=/Game/… -CSV=` | 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= [-DryRun]` | `AtmosphericFog` → `SkyAtmosphere` (L7d) | +| `LPFixSceneCapture` | `-Map -Actor -From "-Offset=x,y,z" [-DryRun]` | racine et position d'une `SceneCapture2D` (L7j) | +| `LPResavePackages` | `-List= [-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 ` (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`. +- 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 `-valide` par lot validé en jeu. diff --git a/Docs/Migration/09_Commandes_Utiles.md b/Docs/Migration/09_Commandes_Utiles.md new file mode 100644 index 0000000..738999e --- /dev/null +++ b/Docs/Migration/09_Commandes_Utiles.md @@ -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_ -unattended -utf8output -nop4 + +(Get-ChildItem D:\Game\LifePlay_Build_5.5_\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 -Commandlet CompileAllBlueprints +.\Tools\RunCommandlet.ps1 -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= -Out= -unattended -nopause +& $Cmd $Proj -run=LPDumpComponents -Map=/Game/Scenes/CentralLondon -Filter=SecondScreen -unattended -nopause +& $Cmd $Proj -run=LPDumpSave "-File=Saved\SaveGames\1.sav" -Out= -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 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" `. 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=` | à chaque exception de script dont le message contient `` : 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=` | relevé quand une ligne du journal contient `` (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 # compteurs, signatures les plus fréquentes +.\Tools\LogStats.ps1 -Compare , # A/B normalisé par personnage +Select-String -Pattern '===== LifePlay' # résumé de démarrage et bilan +Copy-Item \Windows\LifePlay\Saved\Logs\LifePlay.log Saved\Logs\portage\__.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 -avant +.\Tools\Snapshot.ps1 -Lot -Path Content\BPs\GI.uasset, Content\Scenes\CentralLondon.umap +.\Tools\Snapshot.ps1 -Lot -Path Content\UI -Recurse + +.\Tools\Restore.ps1 -Lot -WhatIf # simuler +.\Tools\Restore.ps1 -Lot # restaurer (les versions remplacées sont conservées) +.\Tools\Restore.ps1 -Lot -Only Content\BPs\GI.uasset # un seul fichier +git checkout -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 +Get-FileHash -Algorithm SHA256 # empreinte à publier dans le README +``` diff --git a/Docs/Migration/10_Protocole_Operations.md b/Docs/Migration/10_Protocole_Operations.md new file mode 100644 index 0000000..426e855 --- /dev/null +++ b/Docs/Migration/10_Protocole_Operations.md @@ -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 -avant` | tag | +| 3 | `Tools\Snapshot.ps1 -Lot -Path ` | manifeste MD5 dans `D:\Game\LifePlay_Backup_5.5\` | +| 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_` | +| 10 | **Test en jeu par l'utilisateur** (§4) | retour, captures, journal archivé | +| 11 | Vert : `CHG` au journal, registre, cahier des charges, commit, tag `-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 -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_\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/__.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 `-avant`, `-apres`, `-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. diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index c098b53..a05b1de 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -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 | diff --git a/Docs/Migration/README.md b/Docs/Migration/README.md index ad54eff..d2f2e23 100644 --- a/Docs/Migration/README.md +++ b/Docs/Migration/README.md @@ -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. diff --git a/Docs/Migration/Registre_Erreurs.md b/Docs/Migration/Registre_Erreurs.md index 4d74a66..8378c70 100644 --- a/Docs/Migration/Registre_Erreurs.md +++ b/Docs/Migration/Registre_Erreurs.md @@ -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) | diff --git a/README.md b/README.md index ee01ff7..80e7296 100644 --- a/README.md +++ b/README.md @@ -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 `-avant` / `-apres` (before / after) tags. The change log [`Docs/Migration/Journal_Modifications.md`](Docs/Migration/Journal_Modifications.md) records every change with its rollback procedure.