L0 : documentation de migration et outillage de test
Docs/Migration : architecture initiale (pipeline donnees -> GI ->
evenements/personnages), audit logiciel 5.5, plan de tests, cahier des
charges par lots bornes, journal des modifications, registre des erreurs.
Tools : CheckIntegrity (T-STAT-02..04), LogStats (compteurs normalises,
A/B 4.27/5.5). Empreinte de reference de l'arbre 4.27.
Tests : aller-retour Snapshot/Restore verifie par MD5 ; T-STAT-02, 03,
04 au vert ; T-STAT-01 : 1 package UE4 (GI.uasset), traite en L1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 23:01:52 +00:00
# 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.
2026-09-28 23:12:38 +00:00
---
## 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 |
2026-09-28 23:25:53 +00:00
---
## 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 | ✅ |
2026-09-28 23:35:00 +00:00
---
## 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` ,
2026-09-30 07:01:09 +00:00
appelée par `Person.ReceiveBeginPlay` .
2026-09-29 00:09:04 +00:00
---
## 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 |
|---|---|---|---|---|---|---|
2026-09-30 07:01:09 +00:00
| 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` |
2026-09-29 00:25:12 +00:00
### 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
2026-09-30 07:01:09 +00:00
compilation ni le rapport de la commandlet n'ont détecté ce défaut.
2026-09-29 00:41:07 +00:00
### 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
2026-09-30 07:01:09 +00:00
pour la première fois depuis le retour à la base saine.
2026-09-29 00:48:36 +00:00
### 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 |
|---|---|---|---|---|---|
2026-09-30 07:01:09 +00:00
| 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` |
2026-09-29 01:04:29 +00:00
### 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 |
|---|---|---|---|---|---|
2026-09-30 07:01:09 +00:00
| 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` |
2026-09-29 01:12:37 +00:00
### 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
2026-09-30 07:01:09 +00:00
`Windows/LifePlay/Binaries/Win64/LifePlay.exe` .
2026-09-29 06:18:52 +00:00
### 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) |
2026-09-30 07:01:09 +00:00
`LifePlay_Build_5.5_L4` (incomplète) est conservée comme preuve et peut être supprimée.
2026-09-29 06:59:24 +00:00
---
## 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 |
|---|---|---|---|---|---|
2026-09-30 07:01:09 +00:00
| 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` |
2026-09-29 06:59:24 +00:00
2026-09-30 07:01:09 +00:00
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.
2026-09-29 09:52:14 +00:00
### 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.
2026-09-30 07:01:09 +00:00
Note de traçabilité : la sauvegarde `L5-instr` de `LPSessionLogSubsystem.*` a été prise après modification ; la version antérieure est dans git (`0baf4cf`).
2026-09-29 15:04:53 +00:00
2026-09-30 07:01:09 +00:00
| 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` |
2026-09-29 21:47:12 +00:00
### 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` .
2026-09-29 21:56:16 +00:00
### 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` |
2026-09-29 22:08:37 +00:00
### 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).
2026-09-29 23:03:39 +00:00
---
## 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` |
2026-09-29 23:26:13 +00:00
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` .
2026-09-30 07:01:09 +00:00
### 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` |
2026-09-30 09:33:05 +00:00
### 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).
2026-09-30 09:42:21 +00:00
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).
2026-09-30 09:44:03 +00:00
ERR-033 (double clic) : **non reproduit** depuis le build L6e (constat utilisateur, 2026-09-30). Aucun correctif ciblé ;
laissé sous surveillance.
2026-09-30 10:10:40 +00:00
### 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` |
2026-09-30 12:17:17 +00:00
---
## 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` .
2026-09-30 13:09:17 +00:00
## 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é.
2026-09-30 14:32:46 +00:00
## 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.
2026-09-30 15:05:46 +00:00
---
## 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` |
2026-09-30 15:28:18 +00:00
### 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).
2026-09-30 16:28:23 +00:00
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
2026-09-30 16:45:41 +00:00
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).
2026-09-30 17:38:41 +00:00
| 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.
2026-09-30 18:24:09 +00:00
| 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.
2026-09-30 18:38:09 +00:00
### 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` ).
2026-10-01 13:51:35 +00:00
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` .
2026-10-01 14:14:32 +00:00
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.
2026-10-01 14:28:31 +00:00
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.
2026-10-01 17:24:20 +00:00
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` |
2026-10-01 18:15:59 +00:00
| 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).