LifePlay-Revival/Docs/Migration/Journal_Modifications.md
2026-10-01 20:36:44 +02:00

770 lines
64 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Journal des modifications — migration 5.5
> Une entrée par modification. Format : identifiant, date, lot, fichiers, raison, empreintes,
> retour arrière. Les empreintes complètes sont dans `D:\Game\LifePlay_Backup_5.5\<lot>\manifest.csv`
> et dans l'historique git.
| ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière |
|---|---|---|---|---|---|---|
| CHG-001 | 2026-09-29 | L0 | `.gitignore` | ignorer les fichiers générés (`Build/*/FileOpenOrder`, `Content/Collections`, `Content/Developers`, `.claude/settings.local.json`) | 31 → 38 lignes | retirer le bloc « CHG-001 » |
| CHG-002 | 2026-09-29 | L0 | `.gitattributes` (nouveau) | aucune conversion de fin de ligne : restauration git identique à l'octet | — → créé | supprimer le fichier |
| CHG-003 | 2026-09-29 | L0 | `.git/` (nouveau) | dépôt local, identité locale, `core.autocrlf=false`, `core.longpaths=true` ; commit `de64933`, tag `lot-L0-base` | — → créé | supprimer `.git/` |
| CHG-004 | 2026-09-29 | L0 | `Tools/Snapshot.ps1`, `Restore.ps1`, `AssetHeaders.ps1`, `CheckIntegrity.ps1`, `LogStats.ps1` (nouveaux) | outillage de traçabilité et de test | — → créés | `git rm` |
| CHG-005 | 2026-09-29 | L0 | `Docs/Migration/**` (nouveau) | documentation 01 à 04, journal, registre, empreintes `etat/L0_*` | — → créés | `git rm` |
| CHG-006 | 2026-09-29 | L0 | `D:\Game\LifePlay_Backup_5.5\L0\` (hors projet) | sauvegarde de `.claude`, `.mcp.json`, `LifePlay.uproject`, `Config`, `Saved/Backups`, `Saved/SaveGames`, `Content/BPs` (53 fichiers) | — → créé | sans objet |
## Vérifications du lot L0
| Test | Résultat |
|---|---|
| Aller-retour `Snapshot` → modification → `Restore` (`Config/DefaultEditorSettings.ini` + fichier créé) | ✅ MD5 `85D82E7F…` retrouvé ; fichier créé retiré vers `_retires/` |
| T-STAT-01 | ⚠️ 1 package UE4 (`Content/BPs/GI.uasset`) : défaut connu, traité en L1 |
| T-STAT-02 Modules = 4.27 | ✅ 2 051 fichiers |
| T-STAT-03 environnement = L0 | ✅ 20 fichiers |
| T-STAT-04 arbre 4.27 inchangé | ✅ 144 fichiers (empreinte créée : `etat/L0_ref427.csv`) |
Aucun fichier du projet n'a été modifié en L0 en dehors de `.gitignore` et des ajouts ci-dessus.
---
## Lot L1 — Base saine (2026-09-29)
Décisions utilisateur D-01 et D-02 : `04_Cahier_Des_Charges.md` §4. Tag d'entrée `lot-L1-avant`.
Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L1\` (387 fichiers).
| ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière |
|---|---|---|---|---|---|---|
| CHG-007 | 2026-09-29 | L1 | `Content/{BPs,UI,Structs,Scenes,Render,Characters}` (385 fichiers, 293 packages) | retour à la base 4.27 : retire tous les correctifs de contenu non suivis (dont R-03, R-04) | contenu 5.5 (empreintes `etat/L0_md5_*.csv`) → identique à 4.27 (MD5 vérifiés, 0 écart) | `Tools\Restore.ps1 -Lot L1` ou `git checkout lot-L1-avant -- Content` |
| CHG-008 | 2026-09-29 | L1 | `Tools/RunCommandlet.ps1` (nouveau) | lancement de commandlet avec journal archivé et résumé dédoublonné | — → créé | `git rm` |
| CHG-009 | 2026-09-29 | L1 | `Docs/Migration/05_Correctifs_Isoles.md`, `correctifs/P01…P06.patch` (nouveaux) | isolement des correctifs : catalogue, protocole de réimport, patchs de code 4.27 → 5.5 | — → créés | `git rm` |
| CHG-010 | 2026-09-29 | L1 | `Config/DefaultEngine.ini` | essai de retrait des sections `AndroidFileServer`/`CookerSettings` **annulé** : l'éditeur recrée la section à chaque lancement (nouveau `SecurityToken`) | inchangé (restauré depuis `lot-L1-avant`) | sans objet ; traité en L2 |
### Relevé de base : moteur 5.5 sur le contenu 4.27, sans aucun correctif
| Commandlet | Résultat | Résumé |
|---|---|---|
| `LPCheckMeshAssignment` | 5 nœuds à broches orphelines dans `GI` : 3 `GetAssetsByClass` (classe perdue : `SkeletalMesh`, `StaticMesh`, `StreetMap`), 2 `Break AssetData` (`ObjectPath`) ; 6 nœuds `EditableTextBoxStyle` (`StatMenu`, `CharGen`) | `etat/L1_LPCheckMeshAssignment_20260929-010821.txt` |
| `CompileAllBlueprints` | **6 erreurs, 100 avertissements, 0 Blueprint en échec de chargement** ; échecs : `UI/StatMenu` (3), `UI/CharGen` (3) — broche `Font` d'`EditableTextBoxStyle` | `etat/L1_CompileAllBlueprints_20260929-010931.txt` |
Les commandlets de contrôle n'ont rien écrit : contenu toujours identique à 4.27 après passage (385/385).
### Vérifications de sortie L1
| Test | Résultat |
|---|---|
| Contenu de gameplay = 4.27 | ✅ 385/385 MD5 |
| T-STAT-01 | ⏳ 293 packages UE4 (attendu : base 4.27) — resave contrôlé en `L4-CX-B07` |
| T-STAT-02, 03, 04 | ✅ |
| T-LOAD-01 | ❌ attendu : 6 erreurs (`CX-B02`), à corriger en L4 |
| T-LOAD-02 | ❌ attendu : 5 broches (`CX-B01`), à corriger en L4 |
---
## Lot L2 — Compilation propre (2026-09-29)
Tag d'entrée `lot-L2-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L2\` (`.uproject`,
`DefaultEngine.ini`) ; dossiers mis de côté dans `L2\_purge\` (manifeste `L2\purge_manifest.csv`).
| ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière |
|---|---|---|---|---|---|---|
| CHG-011 | 2026-09-29 | L2 | `LifePlay.uproject` | `TargetPlatforms` `WindowsNoEditor` → `Windows` ; section `Plugins` explicite : `ModdingExtra`, `StreetMap`, `EnhancedInput` activés ; `McpAutomationBridge` limité à la cible `Editor` (`TargetAllowList`) ; `AndroidFileServer` désactivé | MD5 `DA10325E…` → nouveau | `Tools\Restore.ps1 -Lot L2 -Only LifePlay.uproject` |
| CHG-012 | 2026-09-29 | L2 | `Config/DefaultEngine.ini` | retrait de la section `AndroidFileServerRuntimeSettings` (et de son `SecurityToken`) ; le plugin étant désactivé, l'éditeur ne la recrée plus (vérifié après un lancement) | 14 lignes retirées | `Tools\Restore.ps1 -Lot L2 -Only Config\DefaultEngine.ini` |
| CHG-013 | 2026-09-29 | L2 | `Binaries`, `Intermediate`, `Saved/Cooked`, `Saved/StagedBuilds`, `Plugins/*/Binaries`, `Plugins/*/Intermediate`, `Build/WindowsNoEditor`, `Build/LinuxNoEditor` (≈ 13,9 Go) | reconstruction à partir de zéro ; **déplacés**, pas supprimés | → `D:\Game\LifePlay_Backup_5.5\L2\_purge\` | `Move-Item` inverse (voir `purge_manifest.csv`) ; suppression définitive sur décision utilisateur |
### Vérifications de sortie L2
| Test | Résultat |
|---|---|
| T-BUILD-01 `LifePlayEditor Win64 Development` | ✅ code 0, 233 s, **0 erreur, 0 avertissement** dans le code du projet et de ses plugins (2 messages de configuration UBT propres à `McpAutomationBridge`) — `Saved/Logs/portage/L2_Build_LifePlayEditor_20260929-011800.log` |
| T-BUILD-02 `LifePlay Win64 Development` | ✅ code 0, 97 s, 0 erreur, 0 avertissement ; exécutable 300 Mo (328 Mo avant : `McpAutomationBridge` exclu du jeu) |
| T-LOAD-04 démarrage éditeur | ✅ 0 `LogClass: Error`, 0 échec de chargement de package ou de plugin |
| Non-régression `LPCheckMeshAssignment` | ✅ relevé identique à L1 (10 erreurs, 285 avertissements, mêmes signatures) |
| ERR-023 (`AndroidFileServer`) | ✅ `DefaultEngine.ini` non réécrit après lancement |
| T-STAT-02, 03, 04 | ✅ |
---
## Lot L3 — Journalisation efficace (2026-09-29)
Tag d'entrée `lot-L3-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L3\` (6 entrées, dont 2 fichiers
créés que `Restore.ps1` retirerait).
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-014 | 2026-09-29 | L3 | `Source/LifePlay/LifePlay.h`, `LifePlay.cpp` | catégorie `LogLifePlay` | `Tools\Restore.ps1 -Lot L3` |
| CHG-015 | 2026-09-29 | L3 | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` (nouveaux), `LifePlay.Build.cs` (+ `EngineSettings`) | sous-système de `GameInstance`, **sans modification de Blueprint** : résumé de démarrage (versions, modules, fichiers par type) ; bilan de session à la fermeture ou via la commande console `LifePlay.LogSummary` (messages par catégorie, 25 signatures d'avertissement/erreur les plus fréquentes, chiffres normalisés en `#`, pile d'appel Blueprint incluse, plafond de 4 000 signatures). Les messages du moteur ne sont **pas** modifiés (comparabilité A/B avec 4.27) | idem |
| CHG-016 | 2026-09-29 | L3 | `Plugins/ModdingExtra/.../ModdingExtraBPLibrary.cpp` | instrumentation `LogLPModdingTrace` (Warning) → `LogModdingExtra` (Verbose, même format de ligne) ; échec de `LoadTxt` signalé une seule fois par fichier ; échec de `SaveTxt` désormais signalé (il était silencieux) | idem |
| CHG-017 | 2026-09-29 | L3 | `Tools/LogStats.ps1`, `Docs/Migration/03_Plan_Migration_Tests.md` | prise en compte de `LogModdingExtra` ; procédure A/B (`-LogCmds="LogModdingExtra Verbose"`) | `git revert` |
### Vérifications de sortie L3
Sessions `UnrealEditor -game` (valables pour le journal, pas pour l'affichage des personnages —
règle §2 du document 03) : `Saved/Logs/portage/L3_game_20260929-012748.log` (niveau par défaut) et
`L3_game_verbose_20260929-013032.log` (trace détaillée).
| Test | Résultat |
|---|---|
| T-BUILD-01, T-BUILD-02 | ✅ 0 erreur, 0 avertissement |
| T-LOG-01 résumé de démarrage | ✅ 20 lignes `LogLifePlay` ; 16 modules ; comptes par type identiques à l'inventaire 4.27 (`vin_Base` : 752 `.lpscene`, 286 `.lpaction`…) |
| T-LOG-01 bilan de session | ✅ écrit à la fermeture ; signatures dédoublonnées avec leur pile d'appel |
| Bruit d'instrumentation | ✅ `LogLPModdingTrace` : 0 ligne au niveau par défaut (1 300 à 5 400 avant) ; 58 lignes `LogLifePlay` pour toute la session |
| Trace détaillée | ✅ 1 284 lignes `LogModdingExtra` avec `-LogCmds` ; `ModLauncher.config` absent signalé **une** fois |
| A/B de format avec la build 4.27 | ✅ `LogStats -Compare` lit les deux journaux ; toutes les énumérations communes aux deux sessions sont identiques (écarts limités aux dossiers que seule l'une des sessions a atteints) |
| T-STAT-02, 03, 04 | ✅ |
Découverte au passage : les erreurs `ParseIntoArray` (ERR-004) viennent de `GI.populateClothes4`,
appelée par `Person.ReceiveBeginPlay`.
---
## Lot L4 — Réimport contrôlé des correctifs (2026-09-29)
### Sous-lot L4-CX-B01 — broches AssetRegistry de `GI` (ERR-020)
Tag d'entrée `L4-CX-B01-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B01\` (`GI.uasset`, MD5 `F4550DA5…`).
| Étape du protocole | Résultat | Preuve (`Docs/Migration/etat/`) |
|---|---|---|
| 2. Photographie avant | `GI::EventGraph` : 6 199 nœuds, 23 662 lignes | `L4-CX-B01_dump_avant.txt` |
| 3. Simulation `-DryRun` | 3 `[enum]` (`StreetMap`, `StaticMesh`, `SkeletalMesh`), 2 `[path]` (1 consommateur chacun), 0 non traité — **conforme à l'attendu** | `L4-CX-B01_dryrun.txt` |
| 4. Application | 3 énumérations, 2 chemins, 1 Blueprint enregistré, 0 cas non traité, 0 échec | `L4-CX-B01_application.txt` |
| 5. Photographie après + diff | 6 201 nœuds ; **35 lignes différentes, toutes attendues** : 3 nœuds `AssetRegistry::GetAssetsByClass` → `LPAssetRegistryHelpers::GetAssetsByClassName` avec leur classe d'origine ; 2 nœuds `GetAssetObjectPath` insérés, reprenant les consommateurs des sorties `ObjectPath` orphelines. Aucune autre ligne du graphe ne change | `L4-CX-B01_dump_apres.txt`, `L4-CX-B01_diff.txt` |
| 6. `LPCheckMeshAssignment` | 0 broche orpheline dans `GI` (restent les 6 nœuds de CX-B02) | `L4-CX-B01_LPCheckMeshAssignment_*.txt` |
| 6. `CompileAllBlueprints` | identique au relevé de base : 6 erreurs (CX-B02), 100 avertissements, 0 échec de chargement ; **aucune erreur nouvelle** | `L4-CX-B01_CompileAllBlueprints_*.txt` |
| 7. A/B d'exécution | **en attente** : la cuisson exige CX-B02 ; sera faite sur la build Development qui suit CX-B02 | — |
| ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière |
|---|---|---|---|---|---|---|
| CHG-018 | 2026-09-29 | L4-CX-B01 | `Content/BPs/GI.uasset` | réimport de CX-B01 (`LPFixAssetRegistryPins`) | MD5 `F4550DA5…` (UE4) → `0AA14EDB…` (UE5, réenregistré par la commandlet) | `Tools\Restore.ps1 -Lot L4-CX-B01` ou `git checkout L4-CX-B01-avant -- Content/BPs/GI.uasset` |
### Sous-lot L4-CX-B02 — `EditableTextBoxStyle` (ERR-021) : essai 1 **rejeté**
Tag d'entrée `L4-CX-B02-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B02\`.
Preuves : `Docs/Migration/etat/L4-CX-B02_essai1_rejete/`.
| Étape | Résultat |
|---|---|
| Simulation | 6 nœuds sur 6 attendus |
| Application | « 6 traités, 0 liaison non gérée, 0 échec » |
| Compilation | 0 erreur (6 avant), 98 avertissements, 0 broche orpheline |
| **Relecture du diff** | ❌ `CharGen::Make_64` a perdu sa liaison `Font` **sans** recevoir la liaison `TextStyle` : sa police retombe sur la valeur par défaut (aucune police, couleur magenta). Défaut **silencieux** : compilation et rapport de la commandlet au vert |
Cause : `LPFixEditableTextBoxFont` coupait la broche `Font` de chaque nœud au fil du parcours. Dans
`CharGen`, `Break_62` est parcouru avant `Make_64` : la coupure effaçait aussi la liaison vue depuis
`Make_64`, qui n'était plus rebranché. Dépend de l'ordre des nœuds (sans effet dans `StatMenu`). La
campagne du 2026-09-07 avait utilisé cette commandlet : le défaut y était très probablement présent.
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-019 | 2026-09-29 | L4-CX-B02 | `Content/UI/StatMenu.uasset`, `CharGen.uasset` | essai 1 appliqué puis **annulé** par `Tools\Restore.ps1 -Lot L4-CX-B02` (MD5 `34807BE0…`, `63CA2A78…` retrouvés) | sans objet |
| CHG-020 | 2026-09-29 | L4-CX-B02 | `Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.cpp` | les broches `Font` ne sont coupées qu'après le relevé complet de la topologie | `git revert` |
| CHG-021 | 2026-09-29 | L4 | `Tools/ReimportCorrectif.ps1` (nouveau) | automatisation des étapes 1 à 6 du protocole | `git rm` |
Enseignement pour le protocole : l'étape 5 (relecture du diff nœud par nœud) est indispensable ; ni la
compilation ni le rapport de la commandlet n'ont détecté ce défaut.
### Sous-lot L4-CX-B02b — `EditableTextBoxStyle` (ERR-021) : essai 2 **validé**
Tag d'entrée `L4-CX-B02b-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B02b\`. Exécuté avec
`Tools\ReimportCorrectif.ps1` et la commandlet corrigée (CHG-020).
| Étape | Résultat | Preuve (`etat/`) |
|---|---|---|
| 3. Simulation | 6 nœuds sur 6 attendus | `L4-CX-B02b_dryrun.txt` |
| 4. Application | 6 traités, 2 Blueprints, 0 liaison non gérée, 0 échec ; **4 rebranchements `TextStyle`** (2 par Blueprint) | `L4-CX-B02b_application.txt` |
| 5. Diff | `StatMenu` 425 → 422 lignes, `CharGen` 4 458 → 4 455 ; 9 lignes chacun, symétriques ; les 4 `Make` ont `TextStyle ← Break_62.TextStyle` ; plus aucune broche `Font` orpheline | `L4-CX-B02b_diff_*.txt`, `L4-CX-B02b_dump_*` |
| 6. `LPCheckMeshAssignment` | **0 broche orpheline dans tout le projet** | `L4-CX-B02b_LPCheckMeshAssignment_*.txt` |
| 6. `CompileAllBlueprints` | **0 erreur** (6 avant), 98 avertissements (100 avant : les 2 « Font obsolète » disparaissent), 0 échec de chargement | `L4-CX-B02b_CompileAllBlueprints_*.txt` |
| ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière |
|---|---|---|---|---|---|---|
| CHG-022 | 2026-09-29 | L4-CX-B02b | `Content/UI/StatMenu.uasset`, `Content/UI/CharGen.uasset` | réimport de CX-B02 | `34807BE0…` → `131E4B96…` ; `63CA2A78…` → `8D4E4200…` | `Tools\Restore.ps1 -Lot L4-CX-B02b` ou `git checkout L4-CX-B02b-avant -- Content/UI` |
**Effet sur les tests** : T-LOAD-01 (0 erreur de compilation) et T-LOAD-02 (0 broche orpheline) passent
pour la première fois depuis le retour à la base saine.
### Sous-lot L4-CX-B03 — mur à échelle nulle dans `CentralLondon` (validé)
Tag d'entrée `L4-CX-B03-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B03\` (`CentralLondon.umap`
MD5 `C063EE72…` = 4.27, `CentralLondon_BuiltData.uasset`). Correctif sur une propriété d'acteur : le
contrôle se fait par rapport de la commandlet avant/après (pas de graphe).
| Étape | Résultat | Preuve (`etat/`) |
|---|---|---|
| Rapport avant | 1 composant : `Wall.StaticMeshComponent0`, échelle X=0 Y=12,56 Z=5,75, cube moteur visible, `BlockAll` | `L4-CX-B03_rapport_avant.txt` |
| Application `-Fix -Scale=0.1` | X 0 → 0,1 (panneau de 10 cm : corps physique valide, aspect de mur plat conservé) ; 1 carte enregistrée, 0 échec | `L4-CX-B03_application.txt` |
| Rapport après | 0 composant à échelle nulle | `L4-CX-B03_rapport_apres.txt` |
| Non-régression | `LPCheckMeshAssignment` 0 broche orpheline ; `CompileAllBlueprints` 0 erreur, 0 échec de chargement ; seule la carte a changé (`_BuiltData` inchangé) | résumés `L4-CX-B03_*` |
| ID | Date | Lot | Fichiers | Avant → après | Retour arrière |
|---|---|---|---|---|---|
| CHG-023 | 2026-09-29 | L4-CX-B03 | `Content/Scenes/CentralLondon.umap` | `C063EE72…` → `21912547…` | `Tools\Restore.ps1 -Lot L4-CX-B03` ou `git checkout L4-CX-B03-avant -- Content/Scenes` |
### Sous-lot L4-CX-B04 — événements `On Clicked` orphelins (validé)
Tag d'entrée `L4-CX-B04-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B04\`. `Tools\ReimportCorrectif.ps1`.
| Étape | Résultat | Preuve (`etat/`) |
|---|---|---|
| Simulation | 3 sur 3 attendus | `L4-CX-B04_dryrun.txt` |
| Application | `TopRight` : `StatButtonL` (1 nœud en aval) ; `CharGen` : `ButtonEyelashColor` (5), `ButtonPreviewErect` (1) ; 3 retirés, 0 échec | `L4-CX-B04_application.txt` |
| Diff | `TopRight` 907 → 906 nœuds, `CharGen` 1 320 → 1 318 : **seuls les 3 événements disparaissent**. Les nœuds en aval sont conservés (déjà inatteignables ; la photographie n'inclut pas les broches d'exécution) | `L4-CX-B04_diff_*.txt` |
| Contrôles | 0 broche orpheline ; `CompileAllBlueprints` 0 erreur, **95** avertissements (98 avant), 0 échec de chargement | résumés `L4-CX-B04_*` |
| ID | Date | Lot | Fichiers | Avant → après | Retour arrière |
|---|---|---|---|---|---|
| CHG-024 | 2026-09-29 | L4-CX-B04 | `Content/UI/TopRight.uasset`, `Content/UI/CharGen.uasset` | `C34F7BB0…` → `B3B0ED10…` ; `8D4E4200…` → `A7C718C6…` | `Tools\Restore.ps1 -Lot L4-CX-B04` ou `git checkout L4-CX-B04-avant -- Content/UI` |
### Build Development empaquetée `D:\Game\LifePlay_Build_5.5_L4` (2026-09-29)
État du code : `L4-CX-B04-apres`. Commande : `RunUAT BuildCookRun -platform=Win64 -clientconfig=Development
-build -cook -stage -archive` (journal `Saved/Logs/portage/L4_BuildCookRun_20260929-030445.log`).
| Test | Résultat |
|---|---|
| T-LOAD-05 cuisson | ✅ `Success - 0 error(s), 94 warning(s)` ; `BUILD SUCCESSFUL`, `ExitCode=0` |
| Données livrées en fichiers nus | ✅ `Windows/LifePlay/Content/Modules` présent ; résumé de démarrage : 16 modules, comptes identiques à 4.27 |
| Test de fumée (lancement automatisé) | ✅ 185 s sans plantage, fermeture propre, bilan de session écrit ; menu principal atteint (journal `Saved/Logs/portage/L4_build_smoke_20260929.log`) |
| T-RUN-02 à T-RUN-05 (génération de personnages, scène, sauvegarde, 30 min) | ⏳ **nécessite une partie jouée** : scénario `03_Plan_Migration_Tests.md` §4, sur cette build **et** sur la référence 4.27 |
Note : le `LifePlay.exe` à la racine de la build est un lanceur ; le processus du jeu est
`Windows/LifePlay/Binaries/Win64/LifePlay.exe`.
### Correction de l'empaquetage — ERR-026 (2026-09-29)
**Retour utilisateur sur `LifePlay_Build_5.5_L4`** : « le jeu ne fonctionne pas, la plupart des assets ne sont
pas intégrés ». Confirmé : **3 257 packages cuits au lieu de 8 561**. LifePlay charge maillages, vêtements,
coiffures et textures par chemin à l'exécution (`GetAssetsByClass`, `GetAssetByObjectPath`) ; le cuiseur,
qui ne suit que les références statiques, ne les voit pas. Les builds du 28/09 utilisaient `-CookAll` ; ce
paramètre n'avait pas été repris. **Erreur de ma part, non détectée faute de test du volume cuit** : le
test T-PKG-01 est ajouté au plan de tests.
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-025 | 2026-09-29 | L4 | `Config/DefaultGame.ini` | `+DirectoriesToAlwaysCook=(Path="/Game")` (exclusion `fBlah` conservée) : tout le contenu est cuit quelle que soit la méthode d'empaquetage, y compris le bouton « Package » de l'éditeur | `Tools\Restore.ps1 -Lot L4-cook` |
| CHG-026 | 2026-09-29 | L4 | `Docs/Migration/03_Plan_Migration_Tests.md`, `Registre_Erreurs.md` | test T-PKG-01 ; ERR-026 | `git revert` |
Build `D:\Game\LifePlay_Build_5.5_L4b` (`BuildCookRun` Development, journal `L4b_BuildCookRun_20260929-081054.log`) :
| Test | Résultat |
|---|---|
| T-LOAD-05 cuisson | ✅ `Success - 0 error(s), 95 warning(s)` |
| T-PKG-01 contenu cuit | ✅ **8 561** `.uasset`, 2,6 Go (= référence 4.27) |
| Test de fumée (150 s, sans intervention) | ✅ aucun plantage, fermeture propre ; une partie a démarré et 4 personnages ont été générés |
| Premier A/B (`LogStats -Compare`, échantillon faible) | `Accessed None` maillage/perso **0,50** (4.27 : 0,27 ; 5.5 du 28/09 : 16,6) ; **4 acteurs distincts sur 4** (5.5 du 28/09 : tous `Person_C_0`) → CX-B01 corrige très probablement ERR-002 ; **à confirmer visuellement** (T-RUN-02 à 04) |
`LifePlay_Build_5.5_L4` (incomplète) est conservée comme preuve et peut être supprimée.
---
## Lot L5 — Données et personnages (2026-09-29)
### Diagnostic d'ERR-027 (personnages de quête invisibles ou dévêtus)
Partie jouée par l'utilisateur sur `LifePlay_Build_5.5_L4b` (journal archivé
`Saved/Logs/portage/L4b_partie_utilisateur_20260929.log`) : PNJ aléatoires corrects ; personnages
créés par preset invisibles en dialogue, dévêtus dans le mini-jeu.
| Étape | Constat | Preuve |
|---|---|---|
| Indicateur | `Accessed None` maillage : 26,5 / personnage (1 219 / 46) contre 0,27 en 4.27 (4 / 15) | `Tools\LogStats.ps1` |
| Pile d'appel | `GeneratePerson → LoadPreset → GenerateAndApplyStrings/Bools` lit `MeshSexRace.Mesh` et `SMBool.SkeletalMesh` vides ; 0 occurrence en 4.27 | journal utilisateur |
| Pistes écartées (identiques en 4.27) | `clearVariable` (ERR-028, 211 contre ≈ même nombre en 4.27) ; `populateClothes4` / `ParseIntoArray` (631 contre 630) | `Grep` sur les deux journaux |
| Structures | `Mesh_2…` ∈ `Structs/MeshSexRace` ; `SkeletalMesh_2…` ∈ `Structs/SMBool` | recherche binaire |
| Diff de graphes 4.27 / 5.5 (`LPDumpFunction`) | `GenerateAndApplyStrings`, `GenerateAndApplyBools`, `LoadMeshIfNeeded`, `getSkeletalMeshFromPath`, `SMBoolToSkeletalMesh` : **logique identique** (seuls écarts : `SetSkeletalMesh` → `SetSkinnedAssetAndUpdate`, redirection moteur ; broche `Key` du `PrintString` UE5) | `etat/L5-diag_dump427_*`, `etat/L5-diag_dump55_*` |
| Mécanisme | `MeshSexRace` est chargé à la demande : `LoadMeshIfNeeded(Index)` → `getSkeletalMeshFromPath(AssetPath)` → `LPAssetRegistryHelpers::GetAssetByObjectPath(…, OnlyOnDisk=true)` → `GetAsset` → `Cast<SkeletalMesh>` | dumps |
| Réglages | `LegacyPercentage` absent des deux `GameSettings.sav` : valeur par défaut identique | lecture binaire |
Conclusion provisoire : code et réglages identiques ; le seul maillon qui change de moteur est la
résolution chemin → asset (`GetAssetByObjectPath`, porté de `FName` vers `FSoftObjectPath`).
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-027 | 2026-09-29 | L5 | `Source/LifePlay/LPAssetRegistryHelpers.cpp` | instrumentation permanente : tout chemin non résolu est signalé une fois (`LogLifePlay` Warning, chemin reçu et chemin interprété), réussites en `Verbose` | `Tools\Restore.ps1 -Lot L5-instr` |
Build `D:\Game\LifePlay_Build_5.5_L5a` (instrumentée) : éditeur et jeu compilés sans erreur ; cuisson `0 error(s), 0 warning(s)` ; T-PKG-01 : 8 561 packages ; test de fumée 180 s sans plantage (aucune partie démarrée : pas de sauvegarde dans cette build). En attente d'une scène de quête jouée.
### Relevé `MeshSexRace` pendant une partie (build L5b, `-LPDumpVars`, 2026-09-29)
| Constat | Preuve |
|---|---|
| Fin de partie : `MeshSexRace[3]` = `bridget_gp`, `MeshSexRace[4]` = `michael` **chargés** ; les 22 autres corps vides (non utilisés ; 6 corps legacy jamais chargés car `LegacyPercentage = 0`) | `[dump fin]`, `Saved/Logs/portage/L5b_partie_utilisateur_20260929.log` |
| 4 PNJ aléatoires : 0 erreur. Chaque personnage de quête : ≈ 38 lectures de `Mesh` vide | chronologie du journal |
| Pile : `LoadPreset → GenerateAndApplyStrings → PlayerChangeRace → UpdatePlayerMeshWithMorphs → UpdatePlayerMesh` (boucle sur `MeshSexRace`, lecture de `Mesh.Materials`) | idem |
| Hypothèse « résolution de chemin » : **écartée** (seuls `Pubes05/06`, faux en 4.27 aussi) | instrumentation CHG-027 |
| **Base de comparaison invalide** : la session 4.27 de référence n'a chargé **aucun** preset de quête (`GenerateAndApplyStrings` ×2). Le « 0 occurrence en 4.27 » ne prouve rien (piège §5.3 du rapport du 28/09). Journal archivé : `Saved/Logs/portage/REF427_session_20260928_sans_quete.log` | `Grep` |
Suite : session 4.27 jouant les mêmes scènes de quête, puis comparaison normalisée.
Note de traçabilité : la sauvegarde `L5-instr` de `LPSessionLogSubsystem.*` a été prise après modification ; la version antérieure est dans git (`0baf4cf`).
| CHG-028 | 2026-09-29 | L5 | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` | capteur d'exceptions de script (-LPTraceScriptEx, -LPTraceLocals, -LPTraceMax) : relève les variables locales du cadre Blueprint au moment de l'erreur ; actif seulement avec l'option (le moteur supprime sa pile d'appel quand un écouteur est branché : elle est réécrite). Validé en -game. | `Tools\Restore.ps1 -Lot L5-trace` |
### ERR-027 — cause racine identifiée (2026-09-29)
Chaîne causale, établie par le capteur L5c et le code source des deux moteurs :
1. La scène `vin_Pregnancy/Scenes/pregnant_trap.lpscene` appelle `generatePersonTemporary()` **sans argument**
(personnage aléatoire).
2. Les arguments `()` sont découpés par `ParseIntoArray` (non culling). Sur une **chaîne vide** :
- UE 4.27 (`String.cpp:947`, garde `*Start != '\0'`) → **0 élément** ;
- UE 5.5 (`String.cpp.inl:1306`, réécrit sur `UE::String::ParseTokens`, qui visite toujours le dernier
jeton) → **1 élément vide `[""]`**.
3. `GeneratePerson` teste `Length(Presets) > 0` : en 5.5, il prend le chemin « presets » au lieu du chemin aléatoire.
4. Il charge chaque `.lpcharacter` dont le nom se termine par `"" + ".lpcharacter"` : **les 141 presets**,
appliqués successivement (journal L5c : stéréotypes, fantasy, âges, silhouettes… puis `phenotypes/*`).
5. Un preset de phénotype impose `INFO Race: African/Asian/Caucasian` → `PlayerChangeRace` → corps legacy
`MeshSexRace[0..2|5..7]`, jamais chargé (`LegacyPercentage = 0`) → **corps vide : invisible ; vêtements
Daz sans support : dévêtu**.
Le rapport du 2026-09-28 (§4) avait écarté `ParseIntoArray` (« implémentation identique ») : c'est exact pour
une chaîne non vide, **faux pour la chaîne vide**. Toutes les fonctions Blueprint de la chaîne sont identiques
entre 4.27 et 5.5 ; la divergence est dans le moteur.
Preuves : `Saved/Logs/portage/L5c_partie_utilisateur2_20260929.log`, `etat/L5-diag_dump55exec_GI_GeneratePerson.txt`,
`etat/L5-diag_dump55exec_GI_GenerateAndApplyStrings.txt`.
### Sous-lot L4-CX-B08 — `ParseIntoArray` au comportement UE 4.27 (ERR-027) — validé statiquement
Tag d'entrée `L4-CX-B08-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B08\` (17 Blueprints ; 4 fichiers
source créés, retirés par `Restore.ps1` en cas de retour).
| Étape | Résultat | Preuve (`etat/`) |
|---|---|---|
| Fonction de remplacement | `ULPStringCompat::ParseIntoArray` : transcription de l'algorithme 4.27 (chaîne vide → `[]` ; séparateur sensible à la casse), même signature que `UKismetStringLibrary::ParseIntoArray` | `Source/LifePlay/LPStringCompat.*` |
| Simulation | 114 nœuds, 17 Blueprints (GI 73, Person 10, Room 7, StreetMap_Static 4, 13 widgets) ; rien écrit | `L4-CX-B08_dryrun.txt` |
| Application | 114 rebranchés, 0 écart de liaison (contrôle intégré : liaisons et valeurs par défaut de chaque broche identiques avant/après), 0 échec | `L4-CX-B08_application.txt` |
| Contrôles | 0 broche orpheline ; `CompileAllBlueprints` 0 erreur, 95 avertissements (inchangé), 0 échec de chargement | résumés `L4-CX-B08_*` |
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-029 | 2026-09-29 | L4-CX-B08 | `Source/LifePlay/LPStringCompat.h/.cpp`, `Source/LifePlayEditorTools/LPFixParseIntoArrayCommandlet.h/.cpp` (nouveaux) ; 17 Blueprints | `ParseIntoArray` UE5 renvoie `[""]` pour une chaîne vide (UE4 : `[]`) : `generatePerson()` sans argument chargeait les 141 presets | `Tools\Restore.ps1 -Lot L4-CX-B08` ou `git checkout L4-CX-B08-avant -- Content Source` |
| CHG-030 | 2026-09-29 | L5 | `Source/LifePlayEditorTools/LPDumpFunctionCommandlet.cpp` | option `-Exec` (broches d'exécution) | `Tools\Restore.ps1 -Lot L5-dumpexec` |
### Validation d'exécution de CX-B08 — build `LifePlay_Build_5.5_L5d` (2026-09-30)
Partie jouée par l'utilisateur : **personnages de quête et personnages aléatoires visibles et habillés**.
Journal : `Saved/Logs/portage/L5d_partie_utilisateur_20260930.log`.
| Mesure | 5.5 avant (L5b/L5c) | 5.5 L5d | 4.27 (quête jouée) |
|---|---:|---:|---:|
| Personnages générés | 16 | 40 | 16 |
| Presets de phénotype/stéréotype chargés à tort | tous | **0** | 0 |
| Lectures `Mesh_2` / `SkeletalMesh_2` vides | 378+ | **0** | 0 |
| `Accessed None` maillage / personnage | 43,7 | **0,38** | 0,06 |
| Plantages | 0 | 0 | 0 |
Résidu : 15 lectures `GetSkeletalMesh_DEPRECATED` vides (composants proxy ; dette R-03, lot L7a) ; `ModLauncher.config`
(ERR-014) et `OldPlayer.lpcharacter` absents (build sans sauvegarde antérieure). Cuisson L5d : 0 erreur,
95 avertissements (à examiner : la cuisson L5c en comptait 0).
---
## Lot L6 — Validation V1 (2026-09-30)
Partie utilisateur sur `LifePlay_Build_5.5_L5d` : **42 min, 271 personnages, aucun plantage ; sauvegarde (`1.sav`,
le jeu numérote les emplacements) et rechargement fonctionnels**. Journaux : `Saved/Logs/portage/V1_partie_20260930*.log`.
Anomalies signalées : ERR-030 à ERR-034 (registre).
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-031 | 2026-09-30 | L6a | `Config/DefaultEngine.ini` | `r.DefaultFeature.AntiAliasing=2` (clé UE4, ignorée par UE5 : « dummy variable ») → `r.AntiAliasingMethod=2` (TAA, comme en 4.27) ; le jeu tournait en TSR (défaut UE5). Autres réglages vérifiés identiques à 4.27 : GI dynamique 0, reflets SSR, ombres virtuelles 0 | `Tools\Restore.ps1 -Lot L6a` |
Validation L6a (build `LifePlay_Build_5.5_L6a`, partie utilisateur 2026-09-30) : **scintillement disparu** (ERR-032 clos).
Capteur « read property Person » : relevé dans `GI::ReturnStatIfNeeded` (variable de scène `Player`, classe `Person`,
tableau `Person` vide). Comparaison par personnage : `Dress` 0 sur cette partie (situationnel) ; variables `Person` vides
3,3/perso en 4.27 contre 15 à 20 en 5.5 (ERR-003/ERR-030). Journal : `Saved/Logs/portage/L6a_LifePlay.log`.
### Lot L6e — ERR-034, marges des boutons (2026-09-30)
Captures utilisateur 4.27 / 5.5 : la rangée `<< < ❚❚ > >>` de `UI/TopRight` est plus espacée en 5.5 et déborde à droite.
Photographie de l'arbre (`LPDumpWidgetTree`) : chaque bouton est un `UButton` (style transparent) autour d'un cercle de 30 px ;
aucune marge n'est stockée dans l'asset. Source moteur : défaut 4.27 `FCoreStyle "Button"` NormalPadding (2,2,2,2),
PressedPadding (2,3,2,1) ; défaut 5.5 `FUMGCoreStyle "Button"` (12,1.5,12,1.5) pour les deux. `FMargin` est sérialisé
champ par champ par rapport au défaut : les assets 4.27 prennent donc la marge UE5 au chargement (+20 px par bouton).
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-032 | 2026-09-30 | L6e | `Source/LifePlayEditorTools/LPDumpWidgetTreeCommandlet.h/.cpp`, `LPFixButtonPaddingCommandlet.h/.cpp` (nouveaux) | outils : photographie des arbres UMG (`-BP=<nom>` ou `*`), correctif des marges | `git checkout L6e-avant -- Source` |
| CHG-033 | 2026-09-30 | L6e-CX-B09 | 46 Widget Blueprints de `Content/UI` (liste : `etat/L6e-CX-B09_assets.txt`) | 429 boutons (passe 1, marges égales au défaut UE5) + 1 bouton (passe 2, `TopRight::Button_8` Pressed (12,2,12,2) : marge 4.27 partielle, Left/Right hérités d'UE5) remis au défaut UE4 ; 3 boutons à marge 0 choisie par l'auteur conservés | `Tools\Restore.ps1 -Lot L6e-CX-B09` |
| Contrôle | Résultat | Preuve |
|---|---|---|
| Simulation | 432 boutons vus, 429 à corriger, 46 paquets | `etat/L6e-CX-B09_dryrun.txt` |
| Diff des 73 arbres UMG avant/après | hors lignes `WidgetStyle` : identiques ; dans `WidgetStyle`, seules `NormalPadding`/`PressedPadding` changent | `etat/L6e-CX-B09_widgets_{avant,apres,diff}.txt` |
| Idempotence | 3e simulation après passe 2 : 432 boutons vus, 0 à corriger | `etat/L6e-CX-B09c_LPFixButtonPadding_*.txt` |
| `CompileAllBlueprints` | 0 erreur, 190 avertissements (identique à L4-CX-B08) | `etat/L6e-CX-B09_CompileAllBlueprints_*.txt` |
| Build empaquetée `LifePlay_Build_5.5_L6e` | cuisson 0 erreur, 95 avertissements (inchangé) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L6e_BuildCookRun.log` |
### Lot L6f — ERR-031, portrait vide lors d'un appel (2026-09-30) : diagnostic, sans correctif
Capture utilisateur 5.5 : l'encadré d'appel montre un dégradé de ciel. Chaîne établie : `GI::secondScreen` (contact lu dans
la variable DSL, `Person.secondScreen = true`, `Scene.FaceRender` visible) → `Render/SecondScreenMat` ← `SceneCapture2D`
`SecondScreen` de `CentralLondon` (rend seulement `Wall` et `PlayerCharacter`). La carte 4.27 d'origine (copie MD5 identique,
chargée temporairement sous `/Game/_Diag`, déplacée ensuite dans `D:\Game\LifePlay_Backup_5.5\L6f\_diag`) contient les
mêmes données : caméra sans racine, en position nulle. **L'utilisateur confirme le même défaut en 4.27** : ERR-031 est
préexistant, hors périmètre de la migration ; aucun asset modifié.
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-034 | 2026-09-30 | L6f | `Source/LifePlayEditorTools/LPDumpComponentsCommandlet.h/.cpp` (nouveau) | outil de diagnostic : composants d'un Blueprint (`-BP=`) ou acteurs d'une carte (`-Map= -Filter=`), propriétés différentes du défaut | `git checkout L6f-avant -- Source` |
Note d'outillage : `L6f_dump_GI.txt` a d'abord été écrasé par le vidage de `Person` (le script prenait le journal le plus
récent) ; il a été régénéré depuis `Saved/Logs/portage/L6f_LPDumpFunction_20260930-102202.log` (378 graphes).
Validation L6e (build `LifePlay_Build_5.5_L6e`, partie utilisateur 2026-09-30) : **barre de temps conforme à la 4.27**
(ERR-034 clos, CX-B09 validé en jeu).
ERR-033 (double clic) : **non reproduit** depuis le build L6e (constat utilisateur, 2026-09-30). Aucun correctif ciblé ;
laissé sous surveillance.
### Lot L4-CX-B07 — réenregistrement UE5 des derniers paquets UE4 (2026-09-30)
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-035 | 2026-09-30 | L4-CX-B07 | `Source/LifePlayEditorTools/LPAssetListUtils`, `LPDumpAssetsCommandlet`, `LPResavePackagesCommandlet` (nouveaux) ; `LifePlayEditorTools.Build.cs` (`bUseUnity = false` : les fonctions utilitaires de chaque commandlet sont dans un espace de noms anonyme, la compilation unity les faisait entrer en collision) ; 239 paquets (liste : `etat/L4-CX-B07_assets.txt`) | EX-03 : derniers paquets au format UE4 (ERR-022) | `Tools\Restore.ps1 -Lot L4-CX-B07` ; `git checkout L4-CX-B07-avant -- Source` |
| Contrôle | Résultat | Preuve |
|---|---|---|
| Photographie `LPDumpAssets` (292 paquets : les 239 + `BPs`, `UI`, `Structs`, `Render`, y compris GI et Person) | 1,28 million de lignes, 0 échec de chargement | `Saved/Logs/portage/L4-CX-B07_assets_{avant,avant2,apres}.txt` |
| Déterminisme | 2 photographies sans modification : seuls `NodeGuid`/`GraphGuid` diffèrent (régénérés au chargement des nœuds UE4) ; exclus du diff → 0 écart | idem |
| Simulation puis application | 239/239 sauvegardés, 0 échec | `etat/L4-CX-B07_dryrun.txt`, `etat/L4-CX-B07_application.txt` |
| T-STAT-01 (en-têtes) | **8563/8563 paquets UE5** | `etat/L4-CX-B07_headers_apres.csv` |
| Diff avant/après (409 lignes) | toutes neutres, voir ci-dessous | `etat/L4-CX-B07_diff_filtre.txt` |
Familles d'écarts du diff : (1) textures : stockage de la source PNG → `UEDELTA` (mêmes dimensions, format et mips ; données
éditeur, la cuisson en dérive) ; (2) 31 structures : `DefaultValue`/`CurrentDefaultValue` explicités avec les valeurs zéro
du type (identiques au défaut implicite) ; (3) 5 matériaux : copie UE4 dépréciée d'`EmissiveColor`/`Opacity` retirée de
`UMaterial`, les entrées restent identiques dans `MaterialEditorOnlyData` ; (4) 8 broches `Transform` : `-0` → `0` ;
(5) 5 signatures de délégué héritées (`SignatureClass/Name`) effacées sur des nœuds d'entrée ; (6) 2 avertissements de
dépréciation enregistrés sur des nœuds (`AI` R-04, `CharGenSlider` R-03, dette connue) ; (7) `PC` : broche
`TransformScaleMethod` du `SpawnActor` de `TestBall` (acteur de test) `SelectDefaultAtRuntime` → `MultiplyWithRoot`,
valeur déjà portée par les nœuds UE5 de `GI` ; (8) objets `PLACEHOLDER-CLASS` du chargeur (ordre de chargement).
| `CompileAllBlueprints` | 0 erreur, 190 avertissements (identique à L6e) | `etat/L4-CX-B07_CompileAllBlueprints_*.txt` |
| Build empaquetée `LifePlay_Build_5.5_V1rc` | cuisson 0 erreur, 95 avertissements (inchangé) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L4-CX-B07_BuildCookRun.log` |
---
## V1 — validation finale (2026-09-30), étiquette `v1.0`
Partie utilisateur sur `LifePlay_Build_5.5_V1rc` (contenu = `L4-CX-B07-apres`) : environ 2 h, 339 personnages, sauvegardes
`1.sav` et `2.sav`, sortie normale, aucun dossier `Crashes` ; retour utilisateur : « pas de souci majeur constaté ».
Journaux : `Saved/Logs/portage/V1rc_partie_20260930*.log`.
| Exigence | Résultat |
|---|---|
| EX-01 compilation | `LifePlayEditor` compile sans erreur (L2, recompilé à chaque lot) |
| EX-02 Blueprints | `CompileAllBlueprints` 0 erreur (190 avertissements de dépréciation, dette R-03/R-04) |
| EX-03 format UE5 | 8563/8563 paquets (CX-B07) |
| EX-04 `Modules` | chargés comme en 4.27 (L3, T-STAT-02) |
| EX-05 build jouée | personnages distincts, visibles et habillés, scènes, sauvegarde et rechargement |
| EX-06 sans plantage | 42 min (L5d), environ 2 h (V1rc) : 0 plantage |
| EX-07 journalisation | `LogLifePlay`, résumé de démarrage et de session, traces de portage en `Verbose` |
| EX-08 traçabilité | CHG-001 à CHG-035, tags avant/après par lot, `Restore.ps1` testé (L0) |
| EX-09 environnement | `.claude/`, `.mcp.json`, `Saved/Backups/`, arbre 4.27 non modifiés |
Comparaison par personnage V1 (L5d) → V1rc des `Accessed None … Person` par fonction : `getActorVar` 4,6 → 4,0,
`ReturnStatIfNeeded` 3,6 → 3,8, `setActorVar` 0,8 → 0,8 ; seul `GI::Dress` varie (74,5 → 283,6), par rafales liées aux
lieux (ERR-030, lot L7i). Anomalies ouvertes après V1 : voir `Registre_Erreurs.md` et lots L7 de `04_Cahier_Des_Charges.md`.
## Publication GitHub (2026-09-30)
Dépôt : https://github.com/edujiro5972/LifePlay-Revival (fork de `vinfamy/LifePlay`, AGPL-3.0), compte `edujiro5972`.
Préparation dans `D:\Game\LifePlay_Publication` (copies ; ni ce dépôt ni l'arbre 4.27 modifiés).
| Branche | Commit | Contenu |
|---|---|---|
| `archive/original` | 42dc72b | `master` d'origine (V3.6) |
| `archive/ue4.27` | 9e61ec5 | arbre 4.27 filtré selon le `.gitignore` d'origine (sans `Content/Heavy`, `Content/Saves`, binaires, `*.png`, `*.7z`, `*.mp4`), 2 773 fichiers |
| `ue5.5-v1` = `main` (branche par défaut) | a55a43f | V1 ; 34 commits et 40 tags, dont `v1.0` |
Historique V1 réécrit pour la publication (`git filter-branch`, script `D:\Game\LifePlay_Publication\scrub.sh`) :
auteur, committer et signataire de `v1.0` = `edujiro5972 <336072401+edujiro5972@users.noreply.github.com>` ; valeurs
`SecurityToken` remplacées par `<retire-pour-publication>` (`Config/DefaultEngine.ini`, `correctifs/P05_Config.patch`) ;
`Plugins/McpAutomationBridge` retiré (outil de l'environnement de développement, MIT, hors jeu). Arbre final identique à
ce dépôt, hors ces deux retraits. Les identifiants de commit publiés diffèrent donc de ceux de ce dépôt local.
Rattachement du dépôt local à l'historique publié (2026-09-30) : `.git` sauvegardé dans
`D:\Game\LifePlay_Backup_5.5\git_avant_rattachement` (HEAD 41d5e1e, 40 tags) ; `git reset --mixed origin/main`
(ni fichier modifié ni fichier supprimé sur disque) ; tags remplacés par ceux publiés ; identité locale
`edujiro5972` (adresse noreply). `Plugins/McpAutomationBridge/` ajouté au `.gitignore` (reste sur disque) ;
`README.md` ajouté à la racine. Retour arrière : restaurer le `.git` sauvegardé.
## Archive « Full Source Code » V1 (2026-09-30)
`LifePlay_Revival_V1_UE5.5_Full_Source_Code.7z` (4 851 560 856 octets, SHA-256
`38ee16640f960317348a044195a23b55ac8eda34aec085e661034dc9c26cc594`), déposée par l'utilisateur sur Mega :
<https://mega.nz/file/zloFkL7T#3P5GDfcfF5U352T0s472vCtyNh131RLgNWn__PSNL2I>. Principe de l'archive de l'auteur
(`LifePlay_5_9_UE4_Full_Source_Code.7z`) : dossier projet à la racine, 7z `LZMA2:24 BCJ` solide. Contenu : `Content` complet
(24 912 fichiers, dont `Heavy` 8 350, au format UE5), `Binaries`, plugins `StreetMap` et `ModdingExtra`, `.git` d'un clone
propre du dépôt publié. Exclus : `Saved` (comme l'auteur), `Intermediate`, `McpAutomationBridge`, `.mcp.json`, `.claude`,
captures d'écran, `.git` local. Test d'intégrité 7-Zip réussi. Script : `D:\Game\LifePlay_Publication\make_archive.cmd`.
`README.md` réécrit en anglais avec le lien de l'archive.
---
## Lot L7a — R-03 refait : nœuds `Get SkeletalMesh` dépréciés (2026-09-30)
Analyse (source UE 5.5) : la lecture de `USkinnedMeshComponent::SkeletalMesh` passe par `GetSkeletalMesh_DEPRECATED()`,
qui renvoie `Cast<USkeletalMesh>(GetSkinnedAsset())`. CX-B05 avait pris `USkeletalMeshComponent::GetSkeletalMeshAsset()`,
qui n'existe pas sur les proxies (`USkinnedMeshComponent`) : d'où ERR-002 aggravé. Remplacement exact retenu :
`ULPMeshCompat::GetSkeletalMesh(Component)`, même calcul, pour tout `USkinnedMeshComponent`. Inventaire structurel
(instantané CX-B07) : 56 nœuds sources (les appels `GetSkeletalMesh_DEPRECATED` relevés ne sont que les copies compilées ;
la variable `SkeletalMesh` de `GenitalSlider` est une variable Blueprint, non concernée).
| ID | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-036 | 2026-09-30 | L7a (CX-B10) | `Source/LifePlay/LPMeshCompat.h/.cpp`, `Source/LifePlayEditorTools/LPFixSkeletalMeshGetCommandlet.h/.cpp` (nouveaux), `Tools/DiffRemplacementNoeuds.py` ; 8 Blueprints (`etat/L7a_assets.txt`) | ERR-012 / R-03 : 56 nœuds dépréciés | `Tools\Restore.ps1 -Lot L7a` ; `git checkout L7a-avant -- Source Tools` |
| Contrôle | Résultat | Preuve |
|---|---|---|
| Simulation | 56 nœuds, 0 cas non pris en charge (cible `self`, nœud impur) | `etat/L7a_dryrun.txt` |
| Application (contrôle intégré des liaisons) | 56/56 remplacés, 8 Blueprints sauvegardés, 0 écart | `etat/L7a_application.txt` |
| Diff indépendant `LPDumpAssets` avant/après (`Tools/DiffRemplacementNoeuds.py`) | 56 paires (même graphe, même position) ; liaisons `self`→`Component` et `SkeletalMesh`→`ReturnValue` identiques pour 56/56 ; **0 autre objet modifié** (hors copies compilées, graphes anonymes régénérés, GUID, positions des graphes-souches, messages de compilation) | `Saved/Logs/portage/L7a_assets_{avant,apres}.txt` |
| Chargement des 8 Blueprints | avertissements 112 → 6 | journaux `L7a_LPDumpAssets_*` |
Effet de mesure : le nœud d'origine émettait `Accessed None … SkeletalMesh` sur un composant None ; la nouvelle fonction
renvoie None sans message (trace `LogLifePlay` en `Verbose`). Les compteurs `AccessedNoneMaillage` de `LogStats.ps1`
baissent donc mécaniquement : comparer les sessions sur les autres signatures.
| `CompileAllBlueprints` | 0 erreur, **6 avertissements** (190 avant) : restent seulement les 6 nœuds R-04 `GetRandomPointInNavigableRadius` (`AI`, `Person`, `Room`) | `etat/L7a_CompileAllBlueprints_*.txt` |
| Build empaquetée `LifePlay_Build_5.5_L7a` | cuisson 0 erreur, **3 avertissements** (95 avant) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7a_BuildCookRun.log` |
### Nettoyage des builds UE5 obsolètes (2026-09-30, demande utilisateur)
Supprimés (environ 37 Go, binaires régénérables depuis les tags git) : `LifePlay_Build_5.5`, `_5.5_Dev`, `_5.5_NoR03`
(premier portage) et `_5.5_L4`, `L4b`, `L5a`, `L5b`, `L5c`, `L5d`, `L6a`, `L6e`. Au préalable, leurs `Saved/Logs`,
`Saved/SaveGames`, `Saved/Crashes` et scripts `.bat` ont été copiés dans `D:\Game\LifePlay_Backup_5.5\builds_supprimees`.
Conservés : `LifePlay_Build_5.5_V1rc` (build validée `v1.0`), `LifePlay_Build_5.5_L7a` (test en cours),
`LifePlay_Build_427_Dev` et `LifePlay_Build_2026.9` (UE4).
Validation L7a (build `LifePlay_Build_5.5_L7a`, partie utilisateur 2026-09-30, environ 1 h) : 294 personnages, 0 plantage,
sortie normale, sauvegardes `1.sav`/`2.sav` ; tests utilisateur effectués sans anomalie signalée. Journal :
`Saved/Logs/portage/L7a_partie_20260930.log`. `Accessed None` par personnage : 334 (V1rc) → 127, surtout `GI::Dress`
(situationnel, ERR-030). Messages moteur `GetSocketInfoByName … No SkeletalMesh for Component(CharacterMesh0)` : même
signature et mêmes 5 sockets qu'en V1rc, volume lié aux scènes jouées (ERR-011, existe en 4.27) : non imputable à L7a.
Fonctions de variables DSL (`getActorVar`, `clearVariable`, `CallFunction`) non touchées par L7a, en hausse par personnage
sur cette partie : famille ERR-003, à suivre en L7i.
### L7b — R-04 : derniers nœuds dépréciés (2026-09-30)
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-037 | 2026-09-30 | L7b (CX-B11) | `Source/LifePlayEditorTools/LPFixNavRandomPointCommandlet.h/.cpp` (nouveau) ; `Tools/DiffRemplacementNoeuds.py` (profils par lot : `L7a`, `L7b`) ; `Content/BPs/AI`, `Person`, `Room` (`etat/L7b_assets.txt`) | ERR-035 / R-04 : 6 nœuds `GetRandomPointInNavigableRadius` dépréciés | `Tools\Restore.ps1 -Lot L7b` ; `git checkout L7b-avant -- Source Tools` |
Choix : le remplaçant proposé par le moteur (`K2_GetRandomLocationInNavigableRadius`) est `BlueprintCallable`, alors que
l'ancien nœud est pur ; le brancher imposerait de recâbler le flux d'exécution. On réutilise `LPNavigationHelpers`
(enrobage pur déjà présent, CX-C09) : mêmes broches, et même corps que la fonction dépréciée en 4.27 comme en 5.5
(simple appel de `K2_GetRandomLocationInNavigableRadius`). `LPFixDeprecatedNodes` (CX-B06) n'est pas réutilisée : elle
ne contrôle rien et embarque aussi la variante R-03 rejetée.
| Contrôle | Résultat | Preuve |
|---|---|---|
| Simulation | 6 nœuds (`Room::moveToBedIfPossible`, `Room::getStandSpots`, `Person::standIdle` ×2, `Person::jumpOffFnt`, `AI::EventGraph`), 0 cas non pris en charge | `etat/L7b_LPFixNavRandomPoint_20260930-183406.txt` |
| Application (contrôle intégré : liaisons et valeurs par défaut de chaque broche) | 6/6 remplacés, 3 Blueprints sauvegardés, 0 écart | `etat/L7b_LPFixNavRandomPoint_20260930-183707.txt` |
| Diff indépendant `LPDumpAssets` (`DiffRemplacementNoeuds.py … L7b`) | 6 paires ; 7 broches identiques (liaisons et défauts, ex. `Radius` 100 / 200 / 1000 / 2000 / 100000) ; **0 autre objet modifié** ; le profil `L7a` rejoué sur les données L7a donne toujours 56/56 et 0 écart | `Saved/Logs/portage/L7b_assets_{avant,apres}.txt` |
| `CompileAllBlueprints` | 0 erreur, **0 avertissement** (6 avant) | `etat/L7b_CompileAllBlueprints_20260930-183909.txt` |
| Build empaquetée `LifePlay_Build_5.5_L7b` | cuisson 0 erreur, **0 avertissement** (3 avant) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7b_BuildCookRun.log` |
Validation en jeu en attente (déplacements des personnages : `standIdle`, `jumpOffFnt`, `moveToBedIfPossible`, IA).
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-038 | 2026-09-30 | L7b | `Content/BPs/AI`, `Person`, `Room` restaurés (`Tools\Restore.ps1 -Lot L7b`, MD5 = `L7b-avant`) ; versions L7b conservées dans `LifePlay_Backup_5.5\L7b\_avant-restauration‚60930-193820` | test en jeu du build L7b (utilisateur) : les personnages se téléportent dans la pièce au lieu de marcher, pieds parfois masqués par un objet ; « la build précédente était meilleure » | réappliquer : `Restore.ps1` depuis `_avant-restauration`, ou relancer `LPFixNavRandomPoint` |
Analyse : aucune cause trouvée dans le code. Ancienne et nouvelle fonction exécutent le même appel moteur
(`K2_GetRandomLocationInNavigableRadius`), mêmes broches et valeurs par défaut (diff 6/6), et le compilateur remplit la
broche cachée `WorldContextObject` de la même façon pour les deux (`FKCHandler_CallFunction::RegisterNets`, métadonnée
`WorldContext`). Le journal de la partie ne contient aucun message de navigation. Prochaine étape : A/B au même endroit
avec le build L7a (identique au contenu actuel), et vérifier le comportement en 4.27, avant toute nouvelle tentative.
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-039 | 2026-09-30 | L7b | `Content/BPs/AI`, `Person`, `Room` remis à `L7b-apres` (`git checkout L7b-apres`, MD5 identiques aux versions conservées dans `_avant-restauration‚60930-193820`) | retour utilisateur : la téléportation venait de l'accélération du temps (en vitesse normale les personnages marchent) ; les personnages enfoncés dans le sol en extérieur existent aussi en 4.27 et en L7a/V1 (ERR-036, hors périmètre). Le retrait CHG-038 n'était donc pas justifié | `Tools\Restore.ps1 -Lot L7b` |
L7b validé en jeu : le build testé `LifePlay_Build_5.5_L7b` contient exactement ces 3 paquets. Leçon : avant de retirer
un lot sur un symptôme visuel, vérifier la vitesse de jeu et demander si le défaut existe en 4.27 et dans le build précédent.
### L7i — variables DSL `Person` vides (ERR-003 / ERR-030), 2026-09-30
Mesure (journaux `L7a_partie`, `L7b_partie`, 4.27 `LifePlay_Build_427_Dev\...\LifePlay.log`, par minute) :
| Signature | 4.27 (23 min) | L7a (62 min) | L7b (45 min) |
|---|---|---|---|
| `Accessed None … Person` dans `GI::Dress` | 376 | 326 | 641 |
| `index 0 … array 'Person'` (variable DSL vide) | 9 | 179 | 56 |
| `index … array 'Floats'` | 2,4 | 31 | 64 |
| `Accessed None … Person` dans `getActorVar` | 0 | 45 | 7,6 |
| `Accessed None … Person` dans `ReturnStatIfNeeded` | 0,35 | 33 | 5,6 |
Conclusion : **ERR-030 (`Dress`) existe en 4.27** (même signature `Dress:0E35`, même ordre de grandeur) : préexistant,
hors périmètre. L'écart propre à 5.5 porte sur les variables DSL vides (ERR-003). Lecture du graphe
(`GI::GetVariable`) : la variable `Player` est construite avec `Person = [Special]`, `Special = GI.PlayerCharacter`
(`SwitchString_55`, branche `Player`) ; le capteur L6a montre `Special = None`. Les erreurs surviennent tout au long de
la partie, pas seulement au chargement.
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-040 | 2026-09-30 | L7i | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` : options `-LPTraceFunctions`, `-LPTraceDepth` (variables locales des cadres appelants), `-LPTraceGIVars` (variables de l'instance de jeu) ; inactives sans `-LPTraceScriptEx` | capteur ciblé ERR-003 : quelle scène et quelle variable restent vides | `git checkout L7i-avant -- Source` |
Build de diagnostic `LifePlay_Build_5.5_L7i` (contenu identique à L7b, 8561 `.uasset`), lancement par
`LifePlay_diagnostic_L7i.bat` (300 relevés, 4 cadres appelants, `-ScriptStackOnWarnings`).
Session capteur n° 1 (`L7i_partie2_20261001.log`, 53 min, 300 relevés) : les variables vides viennent surtout des
scripts d'IA des PNJ (`.lpai` : `meal`, `church`, `grocery`, `entertainment`…), via `UpdateAI → PlayScene →
ReadSceneLine → CallFunction → getActorVar/setActorVar`. La variable vide est **`AI`**, alimentée par `GI.AIDummy`
(personnage factice du pool `DummyPersons`, attribué par `SpawnDummy`). `GI.PlayerCharacter` n'est pas None. Dans
`GetVariable`, toutes les variables spéciales (`Player`, `Ptr`, `Interacting`, `CurrentCompanion`, `A1`…`A5`)
passent par le même `MakeStruct` dont le nom est figé à « Player » : l'étiquette relevée en L6a était trompeuse.
Nouveau défaut signalé (utilisateur, 2026-10-01) : **Quick dress laisse souvent le personnage principal nu ; correct
en 4.27** → ERR-037, régression UE5. Chemin : `Action` (bouton « Quick dress ») → `GI::Dress(PersonVariable="Player",
ClothVariables=[], QuickDress=true)` → pour chaque emplacement obligatoire (`Top`, `Bottom`, `Foot`), filtre de
l'inventaire du joueur (sexe, emplacement, `Overlaps`, `Daz == (Race == "Daz")`, exclusion `Wedding/Nurse/Doctor`).
Inventaire de la sauvegarde `1.sav` cohérent (80 vêtements, `Daz=True`).
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-041 | 2026-10-01 | L7i | `Source/LifePlayEditorTools/LPDumpSaveCommandlet.h/.cpp` (nouveau : contenu d'un `.sav` en texte, lecture seule) ; `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` : relevé déclenché par un motif du journal (`-LPDumpOnLog`, `-LPDumpPaths`, `-LPDumpMax`), inactif sans l'option | ERR-037 : relever l'état du joueur au moment du Quick dress ; ERR-003 : état d'`AIDummy` | `git checkout L7i-capteur -- Source` |
Build `LifePlay_Build_5.5_L7i` reconstruite (contenu identique), lancement `LifePlay_diagnostic_L7i_2.bat`.
Session capteur n° 2 (`L7i_partie3_20261001.log`, 5 min, 8 relevés Quick dress, 60 relevés IA) :
- **Quick dress (ERR-037)** : à la maison, 4 essais sur 4 corrects (haut, bas, chaussures, accessoires). Au travail,
3 essais sur 3 ne mettent que `Trench-Coat-Outfit-Top`. État relevé : `Race = "Daz"`, `IsMale = False`,
inventaire de 80 vêtements. Au travail (`CurrentAmenity = work`), `GI::Dress` n'accepte que les vêtements
`Bool3` (étiquette « Formal ») ; l'inventaire n'en contient que 2 (`HC-Business-Jacket` en `Outerwear`,
`Trench-Coat-Outfit-Top` en `Top`), aucun bas ni chaussure formels. Quand aucun vêtement ne convient à un
emplacement, la sortie `Completed` de la boucle n'est pas câblée : l'emplacement reste vide. Graphe identique à
4.27 → comportement d'origine, à confirmer par un essai 4.27 au travail.
- **Variable `AI` vide** : `GI.AIDummy` est valide au moment de l'erreur ; les erreurs portent toujours sur les
emplacements de PNJ `CheckingAiIndex` 5 et 8. `UpdateAI` charge le PNJ dans `AIDummy` (`LoadPreset`,
`StatOnly`) puis `AddVariable("AI", [AIDummy])` ; à l'erreur, `GetVariable("AI")` renvoie une variable vide
(non trouvée). Piste suivante : ce qui retire ou masque `AI` pour ces deux PNJ.
Suite L7i (2026-10-01) :
- ERR-037 (Quick dress) **préexistant** : même comportement en 4.27 au travail (essai utilisateur). Journal 4.27 de
l'essai archivé : `Saved/Logs/portage/ref427_quickdress_20261001.log` ; la session 4.27 de référence (23 min) est
archivée sous `ref427_partie_20260930.log` (le `LifePlay.log` 4.27 avait été remplacé par l'essai).
- Variable `AI` introuvable : au moment de l'erreur, la boucle de vérification des scènes du joueur (`CHECKING:`)
s'exécute entre les lignes du script d'IA ; les deux boucles avancent par `Delay(0)` (macro `GI:Async`) et
partagent la table des variables DSL. Moteur : `FDelayAction`, `UKismetSystemLibrary::Delay` et
`FLatentActionManager::ProcessLatentActions` équivalents 4.27/5.5 ; images par seconde équivalentes (≈ 55).
Écart mesuré : par cycle de vérification, ≈ 140 scènes en 4.27 contre ≈ 430 en 5.5 dont 100 vérifiées 2 à 3 fois
(redémarrages : `CheckingSceneIndex` remis à -1 et liste remélangée à chaque changement de `CurrentAmenity`).
Les sessions comparées n'ont pas suivi le même parcours (déplacements, accélération du temps) : une comparaison
A/B sur un parcours identique est nécessaire avant de conclure à une régression.
A/B à parcours identique (2026-10-01, nouvelle partie, vitesse normale, maison puis travail ; 4.27 47 min,
`AB427_20261001.log` ; 5.5 33 min, `AB55_20261001.log`) :
| Par minute | 4.27 | 5.5 |
|---|---|---|
| Vérifications de scènes | 626 | 614 |
| `AI` introuvable (`getActorVar`…) | 0 | 0 |
| Variables `Person` vides | 124 | 123 |
| `getBeautyValue` (`Floats` vide) | 1,3 | 52 |
Les erreurs `AI` dépendaient du rythme de jeu (accélération du temps) : absentes à parcours égal, classées comme
préexistantes (même mécanisme en 4.27). Seul écart réel : `getBeautyValue`.
Cause (ERR-005) : `BeautyStandards` est indexé par forme (`round`, `oval`…, fichier
`Modules/beauty_standards_default.txt` identique dans les deux versions) ; la première recherche par nom de morph
échoue normalement (62 avertissements en 4.27 aussi). L'écart vient du nombre d'appels : `filterMorphList` est
appelé sans étiquette et teste `Contains(tags, "")`. Moteur : `FString::Find` 4.27 → `FCString::Stristr`, qui
cherche le caractère nul et ne trouve rien ; 5.5 → `TCString::Strnistr`, qui renvoie le début de la chaîne. Les
autres modes (sensible à la casse, depuis la fin) et `StartsWith`, `EndsWith`, `Replace` sont identiques.
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-042 | 2026-10-01 | L7i (CX-B12) | `Source/LifePlay/LPStringCompat.h/.cpp` (`FindUE4`, `Contains`, `FindSubstring`, `Split`) ; `Source/LifePlayEditorTools/LPFixStringSearchCommandlet`, `LPTestStringCompatCommandlet`, `LPDumpCDOCommandlet` (nouveaux) ; `Tools/DiffRemplacementNoeuds.py` (profil `CX-B12`, broches absentes des deux côtés) ; 28 Blueprints (`etat/L7i_CX-B12_assets.txt`) | ERR-005 : recherche de texte avec motif vide | `Tools\Restore.ps1 -Lot L7i-CX-B12` ; `git checkout L7i-CX-B12-avant -- Source Tools` |
| Contrôle | Résultat | Preuve |
|---|---|---|
| Test `LPTestStringCompat` : transcription littérale de `FString::Find` 4.27 contre `LPStringCompat` et contre le moteur 5.5 | 3 120 cas : compat = 4.27 dans 100 % des cas ; moteur 5.5 ≠ 4.27 dans 60 cas, tous « sous-chaîne vide, insensible à la casse, depuis le début » | `Saved/Logs/portage/L7i_LPTestStringCompat_*.log` |
| Simulation | 385 nœuds (`Contains` 160, `Split` 222, `FindSubstring` 3), 28 Blueprints, 0 cas non pris en charge | `etat/L7i_LPFixStringSearch_20261001-191027.txt` |
| Application (contrôle intégré) | 385/385 remplacés, 28 Blueprints sauvegardés, 0 écart | `etat/L7i_LPFixStringSearch_20261001-191311.txt` |
| Diff indépendant (`DiffRemplacementNoeuds.py … CX-B12`) | 385 paires, liaisons et valeurs par défaut identiques ; 0 autre objet modifié ; profils L7a (56/56) et L7b (6/6) inchangés | `Saved/Logs/portage/L7i_CX-B12_assets_{avant,apres}.txt` |
| `CompileAllBlueprints` | 0 erreur, 0 avertissement | `etat/L7i_CompileAllBlueprints_20261001-191653.txt` |
| Build empaquetée `LifePlay_Build_5.5_L7i_B12` | cuisson 0 erreur, 0 avertissement (164 paquets recuits) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7i_CX-B12_BuildCookRun.log` |
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-043 | 2026-10-01 | L7i (CX-B12) | — (validation) | partie utilisateur de 46 min sur `LifePlay_Build_5.5_L7i_B12`, même parcours que l'A/B : « pas de soucis en vue » | — |
| Par personnage (`LogStats.ps1`) | 4.27 (`AB427`) | 5.5 avant (`AB55`) | 5.5 + CX-B12 (`B12_validation_20261001.log`) |
|---|---|---|---|
| Personnages | 788 | 562 | 1 044 |
| `Accessed None` | 16,5 | 17,8 | 18,3 |
| Index hors bornes | 8,7 | 12,4 | 9,7 |
| Erreurs (session) | 6 | 30 | 7 |
| `getBeautyValue` (par minute) | 1,3 | 52 | 2,3 |
| Plantage | 0 | 0 | 0 |
**Lot L7i clos.** Leçon : comparer 4.27 et 5.5 sur un parcours identique (nouvelle partie, vitesse normale) ;
les sessions libres (accélération du temps, lieux différents) faussent les taux et ont conduit à deux fausses pistes
(variable `AI`, Quick dress).
### L7h — vérification StreetMap (ERR-018), 2026-10-01
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-044 | 2026-10-01 | L7h | `Source/LifePlayEditorTools/LPCheckStreetMapCommandlet` (option `-Path`), `LPCheckMeshesCommandlet` (nouveau), `LifePlayEditorTools.Build.cs` (module `MeshDescription`) | ERR-018 : tailles de fichiers StreetMap divisées par 3 à 15 | `git checkout L7h-avant -- Source` |
Méthode : copie temporaire de `Heavy/StreetMap` 4.27 (560 fichiers, 276 Mo, lecture seule de la source) sous
`Content/_Temp427`, mesurée par l'éditeur 5.5 avec les mêmes commandlets que les assets 5.5, puis supprimée.
| Contrôle | 4.27 | 5.5 | Preuve |
|---|---|---|---|
| 280 villes `UStreetMap` : routes, nœuds, bâtiments, eaux, parcs, bâtiments nommés, aménités | — | **0 ligne différente** (ex. `CentralLondon` : 18 460 routes, 49 425 bâtiments, 5 191 aménités) | `etat/L7h_streetmap_{427,55}.csv` |
| 280 maillages `Static` : LOD, sommets et triangles sources et de rendu, sections, matériaux, dimensions | — | **0 ligne différente** (ex. `CentralLondon` : 1 084 265 triangles) | `etat/L7h_meshes_{427,55}.csv` |
Conclusion : aucune perte de données. La réduction de taille vient du format UE5, qui ne stocke plus les données de
rendu construites dans le fichier de l'éditeur (reconstruites depuis les données sources et mises en cache). Le
niveau `Scenes/CentralLondon.umap` (1,0 → 0,4 Mo) est joué dans toutes les sessions de validation sans défaut de
carte signalé.
### L7k — erreurs d'exécution fréquentes, 2026-10-01
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-045 | 2026-10-01 | L7k | — (analyse des journaux `AB427`, `AB55`, `B12_validation`) | ERR-006, ERR-007 et signatures résiduelles | — |
| Par personnage | 4.27 | 5.5 avant CX-B12 | 5.5 + CX-B12 |
|---|---|---|---|
| `ContactMenu` dans `Person::UpdateDailyPose` (ERR-007) | 0,12 | 0,62 | 0,20 |
| `Near` dans `Person::standIdle` (ERR-006) | 0,05 | 0,38 | 0,09 |
| `currentMatchRace` dans `GI::determinePersonVars` | 0,04 | 0,33 | 0,09 |
| `OccupyingFnt`, `HeadtrackStatic` (`Person`) | 0,03 ; 0,04 | 0,22 ; 0,21 | 0,07 ; 0,07 |
| `clearVariable` (vérifications « qui » des scènes) | 7,2 | 6,7 | 15,3 |
| … rapporté aux vérifications de scènes | 0,37 | 0,36 | 0,39 |
ERR-006 et ERR-007 étaient des effets secondaires de la recherche de texte vide (ERR-005) : ils reviennent au niveau
4.27 sans autre correctif. `clearVariable` suit le volume de vérifications de scènes (même chaîne d'appel et mêmes
proportions `GetSpecific` / `getRelative` / `getPerson` dans les trois sessions) : la session de validation a
vérifié davantage de scènes par personnage (843/min contre 626). **Lot L7k clos sans modification.**
### L7g — build Shipping, 2026-10-01
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-046 | 2026-10-01 | L7g | `Source/LifePlay/LPSessionLogSubsystem.cpp` : comparaison au nom `LogLifePlay` (`FName`) au lieu de `LogLifePlay.GetCategoryName()` | la configuration Shipping ne compilait pas : `NO_LOGGING` y remplace les catégories de journal par des objets vides (`FNoLoggingCategory`, sans `GetCategoryName`) | `git checkout L7g-avant -- Source` |
Choix de structure : la version publiée par l'auteur (`LifePlay_Build_2026.9`, UE4) est une build Shipping **en
fichiers séparés** (pas de `.pak`), conforme à `UsePakFile=False` du projet : conservé tel quel (modding). Commande :
`RunUAT BuildCookRun -platform=Win64 -clientconfig=Shipping -build -cook -iterate -stage -archive
-archivedirectory=D:\Game\LifePlay_Build_5.5_Shipping`. `McpAutomationBridge` est déjà exclu des builds de jeu
(`TargetAllowList: Editor` dans le `.uproject`).
| Contrôle | Auteur (UE4) | 5.5 Shipping | Preuve |
|---|---|---|---|
| Compilation `LifePlay Win64 Shipping` et `LifePlayEditor Win64 Development` | — | 0 erreur | `Build.bat` |
| Paquets `.uasset` | 8 561 | 8 561 | comptage |
| Fichiers `Content/Modules` (hors paquets) | 2 051 | 2 051 | comptage |
| Taille totale | 5,2 Go | 3,3 Go | format UE5 (voir L7h) |
| Cuisson | — | réussie, sans avertissement | `Saved/Logs/portage/L7g_BuildCookRun_Shipping.log` |
En Shipping, le jeu n'écrit pas de journal (comme la version de l'auteur) : la validation se fait par une partie.