LifePlay-Revival/Docs/Migration/Journal_Modifications.md
edujiro5972 db8678ee05 U0 : cloture de la preparation (P1, P6, P7 verrouillees, copie 5.8 sur ue5.8, config VS 2026) (CHG-250)
- plan 27 : P1 (reference DC4 + V1.5), P6 (4.27 archive apres V2.0), P7 (McpAutomationBridge desactive) verrouillees
- plan 27 / synthese 28 : resultat U0 (tag ue5.5-final, copie D:\Game\LifePlay-master 5.8, VAL PASS)
- Tools/VS2026/LifePlay-UE58.vsconfig : composants VS Installer de VS 2026

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:31:13 +02:00

410 KiB
Raw Blame History

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 [""].
  1. GeneratePerson teste Length(Presets) > 0 : en 5.5, il prend le chemin « presets » au lieu du chemin aléatoire.
  2. 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/*).
  3. 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.

CHG Date Lot Fichiers Raison Retour arrière
CHG-047 2026-10-01 L7g — (validation) partie utilisateur sur LifePlay_Build_5.5_Shipping (nouvelle partie, scènes, sauvegarde et rechargement) : « pas de soucis constaté » —

Lot L7g clos. La build Shipping est la version distribuable de référence.

Publication V1.1 (2026-10-01)

Tag annoté v1.1 (0d6dc55, signataire edujiro5972), branche ue5.5-v1.1, README anglais mis à jour. Archive D:\Game\LifePlay_Publication\LifePlay_Revival_V1.1_UE5.5_Full_Source_Code.7z (script make_archive_v1_1.cmd, mêmes exclusions que V1) : 4,94 Go, 25 644 fichiers, 8,74 Go décompressés, test 7-Zip OK, SHA-256 6dbfb18e55e51558708239856b54f757b6044307d2d1cf261e88c94baaf617ae. Les deux fichiers Config modifiés par L7c pendant l'archivage ont été vérifiés dans l'archive : identiques à v1.1. Lien Mega à ajouter au README après dépôt.

L7c — configuration, 2026-10-01

CHG Date Lot Fichiers Raison Retour arrière
CHG-049 2026-10-01 L7c Config/DefaultEngine.ini : r.DynamicGlobalIlluminationMethod=0, r.ReflectionMethod=2, r.Shadow.Virtual.Enable=0, DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 ; Config/DefaultGame.ini : 5 clés de nativisation retirées rendre explicites les valeurs jouées et validées (valeurs par défaut du code moteur 5.5 : IndirectLightRendering.cpp, VirtualShadowMapArray.cpp ; RHI D3D12 relevé dans les journaux) ; nativisation supprimée depuis UE 5.0 (UE_DEPRECATED(5.0)) git checkout L7c-avant -- Config

PhysXTreeRebuildRate est conservé : propriété toujours valide de UPhysicsSettings en 5.5.

L7d — visuel, 2026-10-01

CHG Date Lot Fichiers Raison Retour arrière
CHG-050 2026-10-01 L7d Source/LifePlayEditorTools/LPConvertAtmosphericFogCommandlet (nouveau) ; Content/Scenes/CentralLondon.umap AAtmosphericFog déprécié depuis 4.26 : remplacé par un ASkyAtmosphere équivalent Tools\Restore.ps1 -Lot L7d

Constats : en 5.5, UAtmosphericFogComponent dérive de USkyAtmosphereComponent et se convertit au chargement (SetPositionToMatchDeprecatedAtmosphericFog : planète posée à Z = −100 000, mode PlanetTopAtComponentTransform) ; le rendu passait donc déjà par SkyAtmosphere. Éclairage précalculé : CentralLondon_BuiltData 40 Ko (4.27) / 43 Ko (5.5), aucun message de reconstruction : rien à reconstruire (la ville est éclairée dynamiquement).

Contrôle Résultat Preuve
Simulation 1 acteur, 26 propriétés SkyAtmosphere relevées (valeurs effectives) etat/L7d_LPConvertAtmosphericFog_20261001-215150.txt
1er essai écart de transformation détecté (transformation monde non recalculée hors monde enregistré) : carte non sauvegardée ; corrigé (UpdateComponentToWorld) etat/L7d_LPConvertAtmosphericFog_20261001-215247.txt
Application 26/26 propriétés et transformations relative et monde identiques ; carte sauvegardée etat/L7d_LPConvertAtmosphericFog_20261001-215445.txt
Diff LPDumpAssets de la carte 387 objets avant et après ; seuls changements : AtmosphericFog_1 (+3 composants) → SkyAtmosphere_0 (+3 composants), même étiquette, RelativeLocation Z = −100 000 et TransformMode explicités (valeurs effectives de l'ancien composant) Saved/Logs/portage/L7d_map_{avant,apres}.txt

L7e, L7f — évaluation, 2026-10-01

CHG Date Lot Fichiers Raison Retour arrière
CHG-051 2026-10-01 L7e, L7f — évaluation —
  • L7e : 4 systèmes Cascade (Heavy/New3/Particles : ParticleBurst, ParticleGravity, ParticleLiquid, ParticleSquirt), toujours pris en charge par UE 5.5 ; une conversion vers Niagara changerait l'aspect des effets par rapport à 4.27 : reportée au jour où le moteur retirera Cascade. Aucun actif ne contient de vêtement physique (ClothingAssetCommon absent en 4.27 comme en 5.5) : rien à migrer de NvCloth vers Chaos.
  • L7f : DefaultPlayerInputClass=EnhancedPlayerInput et DefaultInputComponentClass=EnhancedInputComponent sont déjà actifs ; ils exécutent les 34 actions et axes hérités de DefaultInput.ini. Une migration complète (Input Actions, Mapping Contexts, réécriture des événements d'entrée des Blueprints) n'apporterait rien au joueur et demanderait un test manuel des 34 commandes : reportée.

L7j — image du contact pendant un appel (ERR-031, amélioration), 2026-10-01

CHG Date Lot Fichiers Raison Retour arrière
CHG-052 2026-10-01 L7j Source/LifePlayEditorTools/LPFixSceneCaptureCommandlet (nouveau) ; Content/Scenes/CentralLondon.umap ERR-031 (présent en 4.27) : la caméra SecondScreen filme le ciel Tools\Restore.ps1 -Lot L7j

Chaîne (L6f et L7j) : GI::secondScreen marque le contact (Person.secondScreen) ; GI::Show le place sur la position de son emplacement de scène (ActorTransforms[i]) décalée de −10 000 000 en Y, sur la copie de studio SecondScreenFloor (−3 131 543 ; −24 967 212, soit le studio des scènes − 10 000 000 Y) ; l'encadré affiche Render/SecondScreen, rendu par la caméra SecondScreen. Aucun Blueprint ne déplace cette caméra ; dans la carte (4.27 comme 5.5) elle n'a pas de racine (RootComponent = None) et ses composants sont à l'origine.

Correctif : racine = son SceneComponent existant, capture rattachée, position = CameraScene (cadrage des scènes du studio : −3 131 132 ; −14 967 241 ; 50, lacet 180°) − 10 000 000 Y. Contrôle intégré (racine, rattachement, position monde = cible) puis diff LPDumpAssets de la carte : 3 lignes modifiées, toutes sur SecondScreen (Saved/Logs/portage/L7d_map_apres.txt → L7j_map_apres.txt). Le cadrage (scène entière plutôt que portrait) est à ajuster d'après le test en jeu si nécessaire (-From=CameraPortrait).

L7l — personnages enfoncés dans le sol en extérieur (ERR-036, amélioration), 2026-10-01 : diagnostic

CHG Date Lot Fichiers Raison Retour arrière
CHG-053 2026-10-01 L7l Source/LifePlayEditorTools/LPCheckMeshesCommandlet (colonnes MinZ, MaxZ) diagnostic —

Le lieu Modules/vin_Base/World/forest___vin01.lpworld (donnée de module, identique en 4.27) pose comme sol le meuble fnt_new208 (dalle 230 × 99 × 0,6) en Z = −31,2 avec une échelle (0,713 ; 1,481 ; 100) ; ailleurs (bathroom, shower, sports_centre) le même meuble est un petit objet (Z = 60, échelle 5). Les meubles sont rattachés à un point d'ancrage en Z = 60 (Room::addObject). La hauteur exacte de la surface de neige par rapport au sol de marche dépend de la chaîne de composants du meuble : une mesure en jeu est nécessaire avant de corriger le fichier (ou d'ajuster la dalle avec l'éditeur de lieu intégré au jeu, « Edit building »).

Test utilisateur (build LifePlay_Build_5.5_L7cdj) : le contact apparaît désormais dans l'encadré d'appel (en pied, avec le sol de SecondScreenFloor) ; demande : cadrer le visage.

CHG Date Lot Fichiers Raison Retour arrière
CHG-054 2026-10-01 L7j Source/LifePlay/LPSecondScreenSubsystem.h/.cpp (nouveau sous-système d'instance de jeu) cadrer le visage du contact quel que soit son emplacement de scène : à chaque image, la caméra SecondScreen est placée à 80 cm devant la tête de GI.SecondScreenPerson (os head, sinon haut de la capsule), dans l'axe du personnage, champ 30° ; composant rendu mobile au premier usage. Aucun asset ni Blueprint modifié git checkout L7j2-avant -- Source

Compilation LifePlayEditor Development et LifePlay Shipping : 0 erreur. La position fixe posée par CHG-052 reste la position de repli (avant tout appel).

Suite L7l (2026-10-01) : inspection en direct dans l'éditeur (serveur MCP, lecture seule) : la racine de l'acteur Room porte l'échelle de la première ligne du .lpworld (studio : 8 ; 8 ; 0,2 ; forêt : 6 ; 16 ; 0,01) ; positions et échelles des meubles sont donc multipliées par 0,01 en hauteur : la dalle fnt_new208 affleure le sol (≈ +0,3 cm contre ≈ +0,5 cm). La dalle n'est pas surélevée : l'écart vient de la hauteur à laquelle les personnages sont posés. Mesure en jeu préparée :

CHG Date Lot Fichiers Raison Retour arrière
CHG-055 2026-10-01 L7l Source/LifePlay/LPSessionLogSubsystem.cpp : option -LPDumpDelay (délai du relevé sur motif) relever, 4 s après chaque changement de lieu (test0706 amenity), le sol du lieu (Room), la capsule du joueur et du personnage en interaction ; script LifePlay_releve_L7l.bat du build LifePlay_Build_5.5_L7cdj git checkout L7j2-apres -- Source

Mesures L7l (2026-10-01, L7l_releve2_20261001.log) : tous les lieux sont construits dans le studio (acteur unique Room_C_0 en −3 131 543 ; −14 967 213 ; −115), la ville étant masquée (StreetMapStatic.bHidden). Au centre sportif (échelle Z 0,2) : sol à −105, pieds du joueur à −100 (capsule −12, demi-hauteur 88) : correct. Échelles verticales déclarées : 81 lieux à 0,2, 5 à 0,3, 1 à 0,4 et les 7 lieux extérieurs à 0,01 (beach, forest, mountain, park, pool, river, street). Hypothèse : le plafond WallT (cube blanc, Z relatif 2 040, sans collision) suit l'échelle : 4,08 m en intérieur mais 20 cm au-dessus du sol en extérieur, où il masque tout ce qui est plus bas (pieds, pieds des meubles) et apparaît comme le « sol » blanc ; les personnages marchent sur le vrai sol, dessous.

CHG Date Lot Fichiers Raison Retour arrière
CHG-056 2026-10-01 L7l Source/LifePlay/LPSessionLogSubsystem.h/.cpp : option -LPDumpEvery=N (relevé périodique) confirmer l'hypothèse du plafond par une mesure en extérieur (LifePlay_releve_L7l.bat) git checkout L7j2-apres -- Source

Mesure L7l (2026-10-01, L7l_releve3_20261001.log, relevé toutes les 5 s) : lieu extérieur « rue » (échelle racine 3,5 ; 18 ; 0,01) : sol à −114,5, pieds du joueur à −112 (capsule −24,2, demi-hauteur 88) : posés ; WallT visible, Z relatif 2 040 → −94,6 en monde, 18 cm au-dessus des pieds : hypothèse confirmée. En intérieur (café, police, échelle 0,2) : WallT à +293, pieds à −100 : correct (capture utilisateur sans défaut).

CHG Date Lot Fichiers Raison Retour arrière
CHG-057 2026-10-01 L7l Source/LifePlay/LPOutdoorRoomSubsystem.h/.cpp (nouveau sous-système) masquer le plafond WallT de GI.Room tant que l'échelle Z de sa racine est < 0,05 (lieux extérieurs), le rendre visible quand la pièce redevient intérieure (seulement s'il l'a masqué) ; aucun Blueprint ni asset modifié ; build LifePlay_Build_5.5_L7cdj supprimer les 2 fichiers (git checkout fa3d98e -- Source)

Validation en jeu (2026-10-01, build LifePlay_Build_5.5_L7cdj) : en forêt, pieds des personnages et sol texturé visibles (ERR-036 corrigé) ; pendant un appel, visage du contact cadré (ERR-031 corrigé) ; ciel de jour correct (L7c/L7d), nuit non vérifiée. Tags L7j-valide, L7l-valide.

Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (soleil fixe) en 4.27, en L7i_B12 et en L7cdj : comportement d'origine. Le grand disque blanc à l'horizon est présent en L7i_B12 comme en L7cdj : il ne vient pas de L7d (déjà présent en V1, origine non étudiée). Un retour arrière de L7d, lancé à tort avant cette comparaison, a été annulé avant tout commit ou build (Tools\Restore.ps1 -Lot L7d-retour, empreinte de la carte revenue à 8BD9C4A9…). Tags L7c-valide, L7d-valide.

CHG Date Lot Fichiers Raison Retour arrière
CHG-058 2026-10-02 Doc nouveaux 07_Architecture_5.5.md, 08_Guide_Developpeur.md, 09_Commandes_Utiles.md, 10_Protocole_Operations.md ; mis à jour README.md (migration et racine), 01, 03, 04 (bilan §5), 05 (CX-C14 à C18, statuts), 06 (résultat V1), registre (ERR-020) finalisation de la documentation de migration : architecture finale, guide développeur, commandes, protocole et leçons git revert du commit
CHG-059 2026-10-02 O0 nouveaux Tools/AuditAssets.py, Docs/Migration/11_Audit_Optimisation.md ; lanceur LifePlay_profil_O0.bat (build L7cdj, hors dépôt) audit d'optimisation en lecture seule : inventaire des assets, build livré, leviers et lots proposés ; aucune modification du projet git revert du commit
CHG-060 2026-10-02 O0 Docs/Migration/11_Audit_Optimisation.md §9-10 ; lanceur LifePlay_profil_O0.bat corrigé (capture par -ExecCmds) résultats de la mesure en jeu (60 images/s tenues, à-coups du thread de jeu dus aux minuteries Blueprint, 463 Mo de physique) ; produits utiles de la bibliothèque Fab ; lots révisés git revert du commit
CHG-061 2026-10-02 O1 LifePlay.uproject (20 plugins limités à l'éditeur), Config/DefaultGame.ini (16 DirectoriesToNeverCook), nouveau Tools/AuditScriptDeps.py ; README.md : lien Mega de la V1.1 build Shipping allégé de 387 Mo sans changement de contenu ; build LifePlay_Build_5.5_O1 Tools\Restore.ps1 -Lot O1 ou git checkout O1-avant -- LifePlay.uproject Config
CHG-062 2026-10-02 O9 nouvelle commandlet LPSetComponentCollision ; Content/BPs/MapMarkers.uasset : composants Tree et Car en NoCollision (diff avant/après : 2 lignes) chargement de partie de 71 s (identique en 4.27) dû aux ≈ 160 000 corps physiques des arbres et voitures décoratifs de la carte (décision utilisateur : option 1) ; build LifePlay_Build_5.5_O9 Tools\Restore.ps1 -Lot O9
CHG-063 2026-10-02 O9b LPSetComponentCollision (modèles des nœuds « Add Component ») ; Content/BPs/MapMarkers.uasset : modèles NODE_AddHISM-0 et -1 (HISM_C, marqueurs de bâtiments) en NoCollision (diff : 2 lignes) les clics se font sur les icônes, pas sur les bâtiments (utilisateur) ; ≈ 49 500 corps physiques restants au chargement ; build LifePlay_Build_5.5_O9b Tools\Restore.ps1 -Lot O9b
CHG-064 2026-10-02 O2 Config/DefaultGame.ini : UsePakFile=True, bUseIoStore=True, bCompressed=True (réglages par défaut du moteur : Oodle Kraken) ; Modules reste en fichiers nus build Development 3 367 → 2 002 Mo (−40 %), 23 928 → 2 104 fichiers ; build LifePlay_Build_5.5_O2 ; validé en jeu le 2026-10-02 (7 contrôles) Tools\Restore.ps1 -Lot O2 ou git checkout O2-avant -- Config
CHG-065 2026-10-02 O4 nouveau Tools/FixTextureMips.py ; 29 textures (Clothes4 27, route, trottoir) : MipGenSettings = groupe de texture, NeverStream = faux (diff : ces 2 propriétés + LightingGuid régénéré) textures de couleur 3D sans mipmaps : scintillement à distance, pleine résolution toujours en mémoire ; exclus : cheveux et masques de transparence (29), interface et textures sans matériau (44), dimensions non puissance de 2 (733) ; build LifePlay_Build_5.5_O4 Tools\Restore.ps1 -Lot O4
CHG-066 2026-10-02 O build Shipping de distribution LifePlay_Build_5.5_Shipping_V1.2 (O1, O2, O4, O9, O9b) 3 246 → 1 494 Mo (−54 %), 24 249 → 2 084 fichiers ; premier essai sans ville (corrigé par CHG-067), reconstruit et validé en jeu le 2026-10-02 — (build seulement)
CHG-067 2026-10-02 O2b Plugins/ModdingExtra : GetAllFilesFromFolder reconstruit la liste des .uasset/.umap depuis le registre d'assets quand le disque n'en renvoie aucun (contenu compressé IoStore) ; dépendance AssetRegistry régression d'O2 constatée sur le build Shipping : aucune ville proposée (UI/CityMenu liste les fichiers Heavy/StreetMap/*.uasset du disque, UI/City vérifie chaque ville par suffixe /<nom>.uasset) ; seul appel concerné, les autres lisent des fichiers texte de Modules ; build LifePlay_Build_5.5_Shipping_V1.2 reconstruit git checkout O2b-avant -- Plugins/ModdingExtra
CHG-068 2026-10-02 V1.2 README.md (section V1.2, branche ue5.5-v1.2) ; tag annoté v1.2 ; archive D:\Game\LifePlay_Publication\LifePlay_Revival_V1.2_UE5.5_Full_Source_Code.7z (4 937 914 101 octets, 25 681 fichiers, SHA-256 fb298583743497799dd274cc62b8cf80fbef3445766be5898201924c64674f1a, script make_archive_v1_2.cmd) publication de la V1.2 (optimisation) ; contrôles : test 7-Zip, aucun .mcp.json/.claude/McpAutomationBridge/Saved/Intermediate, Config, .uproject et ModdingExtra identiques au tag lien Mega à ajouter après envoi
CHG-069 2026-10-02 Réconciliation fusion -s ours de vinfamy/master dans main (commit 82a64d9, arbre inchangé) ; Docs/Migration/12_Reconciliation_Vinfamy.md historique de l'auteur rattaché ; aucun fichier récupérable ; les 33 scènes corruption vides de vin_Base existent dans vin_Corruption (non restaurées : doublons) git reset --hard reconcil-avant (avant toute autre publication)
CHG-070 2026-10-02 ERR-038 nouveau Source/LifePlay/LPRoomTransitionSubsystem.h/.cpp relevé (ERR038_releve_20261002.log) : la nouvelle pièce est construite ≈ 2 s avant que destroyDummy rende les personnages de l'ancienne à la réserve ; le sous-système cache aussitôt, au changement de pièce, les personnages actifs juste avant (hors compagnon et scène en cours), cesse de les suivre dès que le jeu les rend ou les réaffiche, et les réaffiche après 10 s par sécurité ; aucun Blueprint modifié ; build LifePlay_Build_5.5_ERR038 ; test en jeu en attente supprimer les 2 fichiers (git checkout ERR038-avant -- Source)
CHG-071 2026-10-02 Ménage README.md : V1.2 en téléchargement principal (lien Mega), V1.1 et V1 en versions précédentes ; suppression de 13 builds 5.5 obsolètes (V1rc, L7a, L7b, L7i, L7i_B12, L7cdj, O1, O1_essai1, O2, O4, O9, O9b, Shipping_V1.2_essai1, ≈ 43 Go) après copie vérifiée de Saved, Content\Saves et des lanceurs dans D:\Game\LifePlay_Backup_5.5\builds_supprimees\ ; 08_Guide_Developpeur.md §4 lien V1.2 reçu ; place disque builds : reconstruction depuis les tags git
CHG-072 2026-10-02 ERR-038 LPRoomTransitionSubsystem : détection par la seule échelle de la racine de Room, délai de réaffichage 10 s → 3 s premier test en jeu concluant (anciens personnages cachés, compagnon présent, nouveaux personnages apparus), mais 2 faux positifs au relevé : nom de lieu vidé un instant sans changement de pièce ; arrivée au restaurant peuplée 3 s avant la construction de la pièce (personnages apparus 10 s en retard) ; build LifePlay_Build_5.5_ERR038 reconstruit git checkout ERR038-apres -- Source/LifePlay/LPRoomTransitionSubsystem.*
CHG-073 2026-10-02 ERR-038 Source/LifePlay/LPRoomTransitionSubsystem.h/.cpp supprimés (copie dans D:\Game\LifePlay_Backup_5.5\ERR038_retrait) ; build LifePlay_Build_5.5_ERR038 reconstruit sans le sous-système (vérifié dans l'exécutable) second test « plus problématique » : relevé ERR038_apres2_20261002 = 2 déclenchements, tous deux à tort (clients du lieu d'arrivée cachés 3 s) ; le critère temporel ne distingue pas les personnages créés pendant le trajet puis retirés de ceux qui sont conservés ; retrait proposé et accepté par l'utilisateur ; ERR-038 reste ouvert git checkout ERR038-apres -- Source/LifePlay
CHG-074 2026-10-02 O7 O7a : Content/Saves (14 125 fichiers, parties de test) → D:\Game\LifePlay_Backup_5.5\O7\Content_Saves (vérifié), Content/Developers et Content/Collections (dossiers vides) retirés, 3 captures de la racine rangées ; O7b : 08_Guide_Developpeur.md §2.1 (carte de Content/Heavy, dossiers à ne pas déplacer) ménage sans risque et documentation, à la place d'un renommage des dossiers jugé trop risqué (préfixes de chemins en dur, contrat de modding) déplacer en retour le contenu de O7\Content_Saves
CHG-075 2026-10-02 DATA1 Plugins/ModdingExtra/.../ModdingExtraBPLibrary.cpp : statistiques de LoadTxt par type de fichier (bilan à la fermeture, commande ModdingExtra.LoadTxtStats) ; 11_Audit_Optimisation.md §17 (stratégie de couche de données) étape 1 de la couche de données : mesurer avant de construire ; PopulateRaws = 12,6 s par chargement de partie (trace O2) ; build LifePlay_Build_5.5_DATA1 git checkout DATA1-avant -- Plugins/ModdingExtra
CHG-076 2026-10-02 DATA23 nouveaux Plugins/ModdingExtra/.../LPDataCache.h/.cpp ; ModdingExtra.cpp (démarrage en arrière-plan), ModdingExtraBPLibrary.cpp (LoadTxt depuis la mémoire, SaveTxt, vérification, statistiques cache/disque), ModdingExtra.Build.cs (Json) couche de données étapes 2 et 3 : Modules chargé une fois en arrière-plan, cache compilé JSON par type avec champs et calque ; 2 031 fichiers en 0,14 s depuis le cache ; build LifePlay_Build_5.5_DATA23 ; validation en jeu en attente git checkout DATA23-avant -- Plugins/ModdingExtra ; ou option -LPNoDataCache
CHG-077 2026-10-02 O1b / DATA23 Config/DefaultGame.ini : +DirectoriesToNeverCook=(Path="/HairStrands") retiré ; validation de la couche de données (CHG-076) : 2 658 textes servis par le cache, 0 écart, lecture 0,074 s pour la session ERR-039 : erreurs GroomComponent au démarrage depuis O1 (module conservé par dépendance, contenu non cuit) ; vérifié : 0 erreur après reconstruction remettre la ligne dans DefaultGame.ini
CHG-078 2026-10-02 DATA4b nouveaux Source/LifePlay/LPDataCompat.h/.cpp (WhatWhereToArray en C++, vérification -LPVerifyWhatWhere contre la fonction Blueprint d'origine) et Source/LifePlayEditorTools/LPFixWhatWhereCommandlet.h/.cpp ; Content/BPs/GI.uasset : 2 appels de l'EventGraph rebranchés (diff : 22 lignes, uniquement les 2 nœuds et les liaisons de leurs voisins) WhatWhereToArray = 94 % de PopulateScenes (3,4 s par passage) ; premier essai refusé par le contrôle intégré (broche Target non exclue), rien sauvegardé, commandlet corrigée ; build LifePlay_Build_5.5_DATA4b ; validé en jeu le 2026-10-02 : plus de 3 000 appels vérifiés, 0 écart ; PopulateRaws 12,6 s → 1,26 s Tools\Restore.ps1 -Lot DATA4b
CHG-079 2026-10-02 V1.3 README.md (section V1.3, branche ue5.5-v1.3) ; tag annoté v1.3 ; build LifePlay_Build_5.5_Shipping_V1.3 validé en jeu ; archive LifePlay_Revival_V1.3_UE5.5_Full_Source_Code.7z (4 945 770 158 octets, 11 583 fichiers, SHA-256 24e7d58f759ca8998fe0d7ddc8c6a4c30262978806903e6d3deb68b37c46512a, contrôles : test 7-Zip, aucun secret ni outil local, 14 fichiers identiques au tag) publication de la V1.3 (couche de données, WhatWhereToArray en C++, ERR-039) —
CHG-080 2026-10-02 V1.3 README.md : V1.3 en téléchargement principal (lien Mega), V1.2 et V1.1 en versions précédentes ; lien de la V1 retiré (archive supprimée de Mega faute d'espace, état git conservé par le tag v1.0) lien V1.3 reçu —
CHG-081 2026-10-02 O7d nouveau Tools/BuildCollections.py ; 13 collections statiques Content/Collections/LifePlay*.collection (hors dépôt, régénérables) ; 11_Audit_Optimisation.md §16.5, 08_Guide_Developpeur.md §2.1, 09_Commandes_Utiles.md §3 suite d'O7 (choix utilisateur) : regrouper les 8 561 assets par thème dans l'éditeur sans renommer de dossier ; collection transversale LifePlay_Chemins_Fixes (4 984 assets à ne pas déplacer) ; 13 545 chemins, 0 inconnu, chargées par l'éditeur ; aucun asset modifié, pas de build supprimer Content/Collections/LifePlay*.collection (git checkout O7d-avant pour le reste)
CHG-082 2026-10-02 O7d Tools/BuildCollections.py : collections écrites dans Saved/Collections (locales) au lieu de Content/Collections (partagées) ; 13 fichiers déplacés vers D:\Game\LifePlay_Backup_5.5\O7d\Content_Collections puis régénérés (identiques) ; 11_Audit_Optimisation.md §16.5, 08_Guide_Developpeur.md §2.1 avertissement à l'ouverture de l'éditeur (utilisateur) : une collection partagée exige un fournisseur de contrôle de révision, désactivé dans ce projet ; une collection locale n'en utilise pas ; validé par l'utilisateur le 2026-10-02 (plus d'avertissement) git checkout O7d-apres -- Tools/BuildCollections.py et remettre les fichiers sauvegardés
CHG-083 2026-10-02 O7e 11_Audit_Optimisation.md §16.6 étude en lecture seule de l'intégration d'une coiffure Fab (demande utilisateur) : liste des coiffures = valeur par défaut GI.HairstyleTable (126 entrées, 35 absentes déjà en 4.27), suivi par noms d'os Genesis 8, morphs de forme facultatifs, sauvegardes par nom ; 34 coiffures Fab, ≈ 12 maillages utilisables — (documentation)
CHG-084 2026-10-02 H1 nouveaux Source/LifePlay/LPHairstyleSubsystem.h/.cpp, module Content/Modules/lp_Revival (lp_Revival.lpmod, Hairstyles/h1_testhair.lphair) ; asset de test Content/Heavy/New5/Hairs/H1_TestHair (copie de FloraHair_New, hors dépôt) ; 11_Audit_Optimisation.md §16.7 liste des coiffures ouverte aux mods (demande utilisateur) : fichiers .lphair ajoutés en fin de GI.HairstyleTable sans modifier de Blueprint ; vérifié au journal : doublons refusés, 1 coiffure ajoutée (table 126 → 127) ; build LifePlay_Build_5.5_H1 ; validé en jeu le 2026-10-02 (nouvelle partie et liste des villes, coiffure ajoutée en fin de liste, suivi des animations, module désactivé puis réactivé, Continue) supprimer le module lp_Revival (ou le désactiver) ; git checkout H1-avant -- Source
CHG-085 2026-10-02 O7e nouvelle commandlet Source/LifePlayEditorTools/LPHairFromStaticMeshCommandlet.h/.cpp (+ SkeletalMeshUtilitiesCommon, StaticMeshDescription dans LifePlayEditorTools.Build.cs) ; assets Content/Heavy/New5/Hairs/Pocolov17* (hors dépôt) ; Content/Modules/lp_Revival/Hairstyles/pocolov17.lphair (remplace h1_testhair.lphair, H1_TestHair retiré) ; Licenses/Free_3D_Models_Credits.txt ; 11_Audit_Optimisation.md §16.8 première coiffure Fab (Pocolov Hair 17, CC BY 4.0, téléchargée avec l'accord de l'utilisateur) : maillage statique rattaché au squelette Genesis 8, ajusté à la tête de Bridget, matériaux DazHair ; build LifePlay_Build_5.5_O7e : coiffure ajoutée (index 126) ; test en jeu en attente retirer pocolov17.lphair ; sauvegardes dans D:\Game\LifePlay_Backup_5.5\O7e ; git checkout O7e-avant -- Source Content/Modules Licenses
CHG-086 2026-10-02 O7e LPHairFromStaticMeshCommandlet : ajustement sur le haut du crâne (-Cranium, -Margin) ; Pocolov17 et _Skeleton régénérés (premier essai dans O7e\essai1), Pocolov17_Strands : Thicken 10 → 1 ; 11_Audit_Optimisation.md §16.8 premier essai en jeu (capture utilisateur) : coiffure trop étroite enfoncée dans le crâne, mèches opaques ; échelle 0,74 → 1,19 en largeur ; build LifePlay_Build_5.5_O7e reconstruit ; test en jeu en attente Tools/assets : remettre O7e\essai1 ; git checkout O7e-apres -- Source/LifePlayEditorTools
CHG-087 2026-10-02 O7e Pocolov17_Cap (hors dépôt) : MapOpacity = texture blanche du moteur ; 11_Audit_Optimisation.md §16.8 second essai en jeu correct (crâne couvert, couleur appliquée, profil bien placé) ; trous au-dessus de l'oreille dus à la lisière découpée de la calotte ; retouche choisie par l'utilisateur ; build LifePlay_Build_5.5_O7e reconstruit remettre Pocolov17_CapOpacity dans MapOpacity
CHG-088 2026-10-02 O7e — O7e validé en jeu par l'utilisateur (profil sans trou, mouvement suivi) ; défaut mineur accepté : bas de la calotte visible sous le lobe de l'oreille —
CHG-089 2026-10-02 H2 Source/LifePlay/LPHairstyleSubsystem.h/.cpp (mode base, plusieurs coiffures par fichier, NONE, MORPHABLE, vérification -LPVerifyHairstyles) ; nouveau Content/Modules/vin_Base/Hairstyles/vin_Base.lphair (126 coiffures, 89 morphs) ; 11_Audit_Optimisation.md §16.9 liste de base des coiffures sortie du Blueprint (demande utilisateur) ; vérifié : table et morphs reconstruits identiques au Blueprint ; build LifePlay_Build_5.5_H2 ; validé en jeu le 2026-10-02 (nouvelle partie, liste du menu inchangée avec Pocolov17 en dernier, personnages générés, Continue) supprimer vin_Base.lphair (retour à la table du Blueprint) ; git checkout H2-avant -- Source/LifePlay
CHG-090 2026-10-02 H2b Source/LifePlay/LPHairstyleSubsystem.h/.cpp (clés FACIAL_HAIR, BODY_HAIR_M, BODY_HAIR_F) ; Content/Modules/vin_Base/Hairstyles/vin_Base.lphair (+ 44 noms) ; 11_Audit_Optimisation.md §16.10 pilosité sortie du Blueprint (demande utilisateur) : listes GI.FHairstyles, BHairstyles_M, BHairstyles ; GI.OtherTable laissée (maillages absents depuis 4.27) ; vérifié : 3 listes identiques au Blueprint ; build LifePlay_Build_5.5_H2 ; validé en jeu le 2026-10-02 (28 barbes + sans barbe dans le menu de création) retirer les lignes *_HAIR de vin_Base.lphair ; git checkout H2b-avant -- Source/LifePlay
CHG-091 2026-10-02 Doc nouveaux Docs/Migration/13_Protocole_Coiffure.md, Tools/HairImportFbx.py, Tools/HairMaterials.py ; README.md (migration), 08_Guide_Developpeur.md, 09_Commandes_Utiles.md protocole de conversion d'une coiffure (demande utilisateur) ; scripts ponctuels d'O7e rendus paramétrables ; protocole rejoué de bout en bout sur Pocolov 17 sous le nom Pocolov17P : bornes identiques au millimètre, dépendances OK ; essai retiré du projet (D:\Game\LifePlay_Backup_5.5\O7e\proto_essai) git revert du commit
CHG-092 2026-10-02 HAIRS1 nouveaux Tools/HairPipeline.ps1, Tools/FbxMaterialMap.py, Tools/hairs/HAIRS1.json ; Tools/HairImportFbx.py (rapport JSON), Tools/HairMaterials.py (calotte seulement si utilisée, contrôle des dépendances) ; assets Content/Heavy/New5/Hairs/Pocolov03/06/11/15/16* (hors dépôt) ; Content/Modules/lp_Revival/Hairstyles/pocolov03/06/11/15/16.lphair ; Licenses/Free_3D_Models_Credits.txt ; 13_Protocole_Coiffure.md §7 industrialisation de la conversion (demande utilisateur) et test sur 5 coiffures Pocolov (CC BY 4.0, téléchargées avec l'accord de l'utilisateur) ; 5 cas d'archives différents intégrés aux règles ; build LifePlay_Build_5.5_HAIRS1 : 6 coiffures ajoutées (index 126 à 131) ; contrôle visuel en jeu en attente retirer les .lphair ; assets et sources dans D:\Game\LifePlay_Backup_5.5\HAIRS1 ; git checkout HAIRS1-avant -- Tools Licenses Content/Modules
CHG-093 2026-10-02 SKIN LPHairFromStaticMeshCommandlet : liaison par transfert de poids depuis le corps (-Skin=transfer par défaut, 6 voisins, bras et jambes exclus) et sortie de la peau (-Gap 0,3 cm) ; LifePlayEditorTools.Build.cs (SkeletalMeshDescription, AnimationCore) ; HairPipeline.ps1 (-Rebuild, options skin, gap) ; 6 coiffures Pocolov reconstruites (versions précédentes dans HAIRS1\<nom>\precedente_*), Pocolov 17 ajoutée au lot ; .lphair et crédits : description des modifications corrigée ; 13_Protocole_Coiffure.md vidéo utilisateur : mèches longues liées à la seule tête, qui traversent épaules et poitrine quand la tête tourne ; poids obtenus : tête 47 à 62 %, cou, clavicules, poitrine ; 254 à 950 sommets sortis de la peau par coiffure ; build LifePlay_Build_5.5_SKIN ; validé en jeu le 2026-10-02 (les mèches ne traversent plus la peau quand la tête tourne) -Skin=rigid ; git checkout SKIN-avant -- Source Tools et remettre les versions précédentes
CHG-094 2026-10-02 UI14 nouveaux Source/LifePlay/LPVersionSubsystem.h/.cpp, Source/LifePlayEditorTools/LPEditWidgetCommandlet.h/.cpp (+ Json dans le .Build.cs), Tools/ui/MainMenu_V1.4.json, Docs/Migration/14_Interface_V1.4.md ; Content/UI/MainMenu.uasset (6 modifications, diff conforme) ; Content/Modules/donors.txt (→ Vinfamy) ; Config/DefaultGame.ini (ProjectVersion=2026.10.4) demande utilisateur avant la V1.4 : version année.mois.publication, crédits vidés avec Vinfamy auteur original, Donate → Patreon edujiro5972, Discord → discord.gg/q4689pNSy, Commission masqué ; build LifePlay_Build_5.5_UI14 : « LifePlay 2026.10.4 » ; validé en jeu le 2026-10-02 (version, crédits, bouton Commission masqué, liens Donate et Discord) Tools\Restore.ps1 -Lot UI14 ; git checkout UI14-avant -- Config Source Content/Modules/donors.txt
CHG-095 2026-10-02 MODS14 nouveaux Tools/SplitModules.ps1, Tools/modules/V1.4.json, Docs/Migration/15_Modules_Optionnels.md ; build LifePlay_Build_5.5_Shipping_V1.4 (dossier neuf, contrôlé : pas de fichier périmé) ; archive D:\Game\LifePlay_Publication\LifePlay_Revival_V1.4_Optional_Modules.zip (875 812 octets, 626 fichiers, SHA-256 cd8b4ffa9f676d3703fce9d2b42a0f61682c6c04bda30d033630c8f1be8fd236) demande utilisateur : build Shipping réduite à l'essentiel (vin_Base, lp_Revival, vin_VanillaRealistic), 14 modules optionnels à part ; vérifié dans les Blueprints : aucun fichier de module optionnel lu en dur, GI.removeDeletedMods retire les modules absents ; build allégé démarré sans plantage ; validé en jeu le 2026-10-02 (build sans les modules optionnels, puis avec l'archive extraite) ; modules de test retirés du build vers LifePlay_Build_5.5_Shipping_V1.4_test_extraction remettre les dossiers de LifePlay_Build_5.5_Shipping_V1.4_modules_optionnels dans le build
CHG-096 2026-10-02 V1.4 README.md (section V1.4, branche ue5.5-v1.4) ; Donate.url (racine) → Patreon edujiro5972, comme le bouton Donate ; tag annoté v1.4 publication de la V1.4 (LifePlay 2026.10.4) : coiffures en fichiers .lphair, 6 coiffures Pocolov, chaîne d'import, menu principal, modules optionnels séparés —
CHG-097 2026-10-02 V1.4 archives de publication (D:\Game\LifePlay_Publication) : sources LifePlay_Revival_V1.4_UE5.5_Full_Source_Code.7z (4 942 392 569 octets, 12 766 entrées, SHA-256 bda44e52e8f45775e09fdea51b613bb64fc5e0c7fd0ec76108804e0bb39b3426, script make_archive_v1_4.cmd) ; jeu LifePlay_Revival_V1.4_Windows_Game.7z (1 301 813 923 octets, racine LifePlay_Revival_V1.4, SHA-256 d4a36542550ae2bcc7f3f634255125fc6c7520f5cf29df4b74ae3bbc0ac55a9f, script make_game_v1_4.cmd) ; modules optionnels LifePlay_Revival_V1.4_Optional_Modules.zip (875 812 octets, SHA-256 cd8b4ffa9f676d3703fce9d2b42a0f61682c6c04bda30d033630c8f1be8fd236) contrôles : tests 7-Zip ; sources : aucun .mcp.json/.claude/McpAutomationBridge/Saved/Intermediate/jeton, 17 modules, 10 fichiers identiques au tag v1.4, .git = a83ea56 ; jeu : 3 modules (vin_Base, lp_Revival, vin_VanillaRealistic), ni Saved ni .pdb liens Mega à ajouter après envoi
CHG-098 2026-10-02 V1.4 README.md : archive des sources V1.4 en téléchargement principal (lien Mega), V1.3 ajoutée aux versions précédentes lien Mega de l'archive développeur reçu ; liens du jeu et des modules optionnels à venir —
CHG-099 2026-10-02 V1.4 README.md : section V1.4, point des modules optionnels reformulé (plus de nom d'archive ni de mode d'installation) décision utilisateur : les archives du jeu et des modules optionnels ne sont pas annoncées sur GitHub (la documentation technique garde les détails de l'outil) git revert du commit
CHG-100 2026-10-03 H3 nouveau Docs/Migration/16_H3_Mods_Paquets.md préparation de H3 (demande utilisateur) : étude en lecture seule du moteur 5.5 (dossier Mods/ lu par le gestionnaire de plugins en jeu empaqueté, plugins Mod activés par défaut, paquets de plugins montés au démarrage, registre AssetRegistry.bin des plugins chargé) et de la configuration (paquets non signés, shaders intégrés aux matériaux, IoStore) ; architecture, risques, lots H3a à H3c — (documentation)
CHG-101 2026-10-03 H3a Releases/2026.10.4 (non versionné, 1,3 Go) ; ModSources/LPHairSample/ (LPHairSample.uplugin, Module/LPHairSample.lpmod, Module/Hairstyles/pocolov05.lphair, Module/CREDITS.txt ; assets Content/Hairs/Pocolov05* non versionnés) ; Tools/mods/LPHairSample.json ; Tools/HairPipeline.ps1 (chemins de plugin, credits) ; Tools/HairMaterials.py (contrôle des dépendances par chemin de paquet) ; .gitignore (/Releases/, /Mods/, produits et assets de ModSources) ; builds LifePlay_Build_5.5_Ref_2026.10.4, LifePlay_Build_5.5_H3a prototype H3a : version de référence (paquets identiques au V1.4 publié), mod d'essai Pocolov 05 (Fab, CC BY 4.0, téléchargement accordé) cuit en DLC contre 2026.10.4 (6 paquets, 0 erreur) et installé dans une copie du V1.4 ; version 2026 mal nommée (argument coupé par PowerShell) déplacée vers LifePlay_Backup_5.5\H3a ; validé en jeu le 2026-10-03 (16_H3_Mods_Paquets.md §5) supprimer ModSources/LPHairSample, Tools/mods, Releases/2026.10.4 ; git revert du commit
CHG-102 2026-10-03 H3a Source/LifePlay/LPHairstyleSubsystem.h/.cpp ; Content/Modules/lp_Revival/lp_Revival.lpmod (MODULE_DEFAULT_ENABLED: true) retour utilisateur : coiffure du mod présente alors que le mod est décoché. Le sous-système (H1) tenait pour actif un module absent de GI.ModEnableds, alors que le jeu le tient pour inactif (défaut présent en V1.4 : lp_Revival affiché décoché mais actif). Même règle que le jeu ; un module à clé MODULE_DEFAULT_ENABLED: true absent de la liste y est ajouté coché (au démarrage et après LoadSettings). Validé en jeu le 2026-10-03 git revert du commit, recompiler
CHG-103 2026-10-03 UI15 Content/UI/MainMenu.uasset, Content/UI/ModManager.uasset (snapshot LifePlay_Backup_5.5\UI15) ; nouveaux Source/LifePlayEditorTools/LPTitleModManagerCommandlet.h/.cpp, Source/LifePlay/LPModSettingsLibrary.h/.cpp, Docs/Migration/17_Mods_Ecran_Titre.md ; build LifePlay_Build_5.5_UI15b demande utilisateur : gestionnaire de mods dès l'écran titre, puis choix entre nouvelle partie et partie sauvegardée. Entrée dédiée sur l'écran titre (copie de « Load »), fermeture vers le menu titre avec relecture des données et enregistrement du choix (SaveModSelection, sans toucher à la dernière sauvegarde) ; entrée d'origine inchangée en partie. Première version (entrée d'origine rendue visible) remplacée après retour (alignement). Validé en jeu le 2026-10-03 .\Tools\Restore.ps1 -Lot UI15 ; git revert du commit
CHG-104 2026-10-03 H3b nouveaux Tools/BuildMod.ps1, Tools/ModSource.ps1 ; Tools/HairPipeline.ps1 (mode mod : montage temporaire, .lphair et crédits dans ModSources/<Nom>/Module, -Rebuild déplace aussi les textures) ; Tools/HairMaterials.py (analyse synchrone du dossier, réutilisation des textures) ; Tools/mods/LPHairSample.json (mod) ; Source/LifePlay/LPHairstyleSubsystem.cpp (repli DoesPackageExist) ; Pocolov 05 reconstruite (précédente dans LifePlay_Backup_5.5\H3a\Pocolov05\precedente_*) ; build LifePlay_Build_5.5_H3b ; archive D:\Game\LifePlay_Publication\Mods\LPHairSample-for-LifePlay-2026.10.4.zip (334 473 octets, SHA-256 8F6A45ED…CBC8) lot H3b : un mod d'assets en une commande ; plantage de HairMaterials.py dans un plugin expliqué (registre de la commandlet sans les assets du plugin) et corrigé ; build de base sans rien du mod par construction. Validé en jeu le 2026-10-03 (16_H3_Mods_Paquets.md §6) git revert du commit, recompiler
CHG-105 2026-10-03 H3c nouveaux Docs/Modding/FullGuides/Creating_Asset_Mods.md, Docs/Modding/ShortGuides/explanation.lphair, Tools/NewMod.ps1, Tools/EditMod.ps1 ; Docs/Modding/ShortGuides/explanation.lpmod (MODULE_DEFAULT_ENABLED) ; Docs/Migration/10_Protocole_Operations.md §6, 09_Commandes_Utiles.md §7 (liste de contrôle de publication), 16_H3_Mods_Paquets.md §7 lot H3c : guide des moddeurs en anglais, outils de création et d'édition d'un mod, version de référence intégrée à la procédure de publication (livrée dans l'archive des sources ; Mods/ vide au build) git revert du commit
CHG-106 2026-10-03 H3d nouveaux Source/LifePlay/LPModInfoSubsystem.h/.cpp ; Source/LifePlay/LifePlay.Build.cs (Slate, SlateCore) ; Tools/NewMod.ps1 (métadonnées), Tools/BuildMod.ps1 (ordre des lignes 1 à 3, MODULE_PACKAGED, MODULE_GAME_VERSION, .uplugin livré, contrôle prix et licences, nom d'archive) ; Docs/Modding/FullGuides/Creating_Asset_Mods.md §4b, explanation.lpmod demande utilisateur : métadonnées extensibles (dates, licence, lien de l'auteur, prix) et avertissement en jeu quand un mod a été construit pour une autre version. Le jeu ne lit que les 3 premières lignes d'un .lpmod, par position ; fenêtre Slate C++, sans Blueprint. Validé en jeu le 2026-10-03 git revert du commit, recompiler
CHG-107 2026-10-03 H3d nouveau mod ModSources/lpr_hair_pocolov (.uplugin, Module/ : .lpmod, 12 .lphair, CREDITS.txt ; assets non versionnés), Tools/mods/lpr_hair_pocolov.json ; retirés : Content/Modules/lp_Revival (6 .lphair, .lpmod), assets Content/Heavy/New5/Hairs/Pocolov* (non versionnés), ModSources/LPHairSample, Tools/mods/LPHairSample.json (tous vers LifePlay_Backup_5.5\H3d\retires) ; Licenses/Free_3D_Models_Credits.txt (lignes Pocolov remplacées par un renvoi ; snapshot H3d) ; nouveau Tools/modules/next.json ; builds LifePlay_Build_5.5_H3d ; archive D:\Game\LifePlay_Publication\Mods\lpr_hair_pocolov-1.0-for-LifePlay-2026.10.4.zip (3 807 460 octets, SHA-256 4E9420E5…2B8F) demande utilisateur : module lpr_hair_pocolov regroupant les assets Pocolov ; choix utilisateur : les 12 coiffures CC BY, les 6 du jeu de base déplacées dans le paquet, mod d'essai retiré ; 5 archives téléchargées (accord). Validé en jeu le 2026-10-03 remettre les dossiers de LifePlay_Backup_5.5\H3d\retires ; .\Tools\Restore.ps1 -Lot H3d ; git revert du commit
CHG-108 2026-10-03 H3c Docs/Modding/FullGuides/Creating_Asset_Mods.md §5 essai utilisateur de Tools/EditMod.ps1 : mod monté et chargé (« Mounting Mod plugin lpr_hair_pocolov »), 12 coiffures visibles une fois « Afficher le contenu des plugins » coché dans le navigateur de contenu (masqué par défaut ; la recherche porte sur les noms d'assets) : précision ajoutée au guide. H3c validé le 2026-10-03 git revert du commit
CHG-109 2026-10-03 PUB Tools/SplitModules.ps1 (mode per_module : une archive par module, notice tirée du .lpmod, INDEX.txt ; refus d'un build contenant un mod d'assets installé) ; Tools/modules/next.json ; Docs/Migration/15_Modules_Optionnels.md §5, 09_Commandes_Utiles.md §7 décision utilisateur pour la prochaine publication : chaque mod livré dans un zip indépendant, sauf les modules de base (texte) gardés dans le build Shipping ; diffusion des modules sur Discord dans un premier temps. Essai sur une copie (15 archives, 640 fichiers, garde-fou vérifié) git revert du commit
CHG-110 2026-10-03 H3c sources texte de ModSources/lpr_hair_pocolov (.uplugin, .lpmod, 12 .lphair, CREDITS.txt) incident : le commit 54f6604 (tag H3c-valide) a été fait pendant que le mod était monté dans Mods/ par EditMod.ps1 (éditeur ouvert) ; git add -A a enregistré la suppression de ses sources. Aucune perte sur disque (mod remis dans ModSources/ à la fermeture de l'éditeur, 70 assets présents) ; sources réenregistrées par bf9bb58. Règle ajoutée (10_Protocole_Operations.md §6) : ne jamais commiter ni lancer un build tant que Mods/ n'est pas vide. Le tag H3c-valide reste sur 54f6604 (déplacement non fait sans accord) —
CHG-111 2026-10-03 V1.5 Config/DefaultGame.ini (ProjectVersion=2026.10.1.5), format de version (14_Interface_V1.4.md, LPVersionSubsystem.h), README.md (section V1.5, branche), Tools/modules/next.json (groupe vin_*), Tools/SplitModules.ps1 (groupes), Tools/BuildMod.ps1 (INDEX.txt), 15_Modules_Optionnels.md ; build LifePlay_Build_5.5_Shipping_V1.5 (version de référence Releases/2026.10.1.5, paquets identiques ; 2 modules de base) ; Releases/2026.10.4 déplacé vers LifePlay_Backup_5.5\Releases ; modules D:\Game\LifePlay_Publication\Modules_2026.10.1.5 (vin_Modules, lpr_hair_pocolov-1.0, INDEX.txt) publication V1.5 (décisions utilisateur : version année.mois.majeur.mineur ; modules vin_* en un seul zip, autres mods chacun le leur ; diffusion des modules sur Discord, rien sur GitHub). Validé en jeu le 2026-10-03 ; les mods extraits dans le build pour le test et les fichiers de session ont été déplacés vers LifePlay_Build_5.5_Shipping_V1.5_test_extraction (build contrôlé contre le manifeste UAT : 0 fichier en trop, 1 459 fichiers) git revert des commits V1.5
CHG-112 2026-10-03 V1.5 archives D:\Game\LifePlay_Publication : LifePlay_Revival_V1.5_UE5.5_Full_Source_Code.7z (6 195 829 571 octets, SHA-256 a71e77ca98c9a86399e4e8685f2b7ea74d6e9358694094968648f98acf7bc9d3 ; avec Releases/2026.10.1.5 et ModSources/, .git du clone propre sur v1.5) ; LifePlay_Revival_V1.5_Windows_Game.7z (1 300 541 638 octets, SHA-256 f5e34ecaf8de90659853a9ae2393b2571ae45894808f4f2b59ba1b4e857a7fe1, racine LifePlay_Revival_V1.5) ; scripts make_archive_v1_5.cmd, make_game_v1_5.cmd archives de publication V1.5 : tests 7-Zip OK ; sources sans .mcp.json, .claude, Saved, Mods, Intermediate, McpAutomationBridge, produits de cuisson des mods, ni SecurityToken dans Config ; jeu sans aucun mod. Clone propre mis à jour depuis le dépôt local (récupération GitHub bloquée, arrêtée) —
CHG-113 2026-10-03 V1.5 README.md (téléchargement : archive des sources V1.5 en principal, lien Mega, SHA-256, raison de la taille ; V1.4 dans les versions précédentes) lien Mega de l'archive des sources V1.5 fourni par l'utilisateur ; le jeu et les modules (Discord) ne sont pas mentionnés sur GitHub git revert du commit
CHG-114 2026-10-04 Dbg nouveaux Tools/BuildDebug.ps1, Tools/CollectDebugArtifacts.ps1, Tools/SummarizeDebugCsv.ps1, Tools/debug/*.bat, Source/LifePlay/LPDebugSubsystem.h/.cpp, Docs/Migration/18_Build_Debug.md ; événements nommés LoadTxt / LPDataCache ; LPModInfoSubsystem (ModInfoCheckInterval) et LPModSettingsLibrary (SettingsModEnabledsName) pour le build unifié ; 08, 09, README migration, skill lifeplay-debug-build mesure reproductible (Insights, mémoire, CSV) sans coût Shipping : #if !UE_BUILD_SHIPPING, IncludeDebugFiles inchangé, pas de -nodebuginfo git revert du commit
CHG-115 2026-10-04 G6a Source/LifePlay/LPDataCompat.h/.cpp (FindCenterOfPolygon) ; nouveaux Source/LifePlayEditorTools/LPFixFindCenterCommandlet.h/.cpp ; Content/BPs/GI.uasset (4 appels rebranchés : 3 dans l'EventGraph, 1 dans MoveTo ; fonction Blueprint d'origine laissée en place) ; snapshot LifePlay_Backup_5.5\G6a feuille CPU de l'image Continuer, trace Development G6Dev.utrace (464 Mo, canaux cpu,frame,bookmark,loadtime, sans memory) : FindCenterOfPolygon 0,350 s exclusif / 0,742 s inclus, 49 425 appels. Centre de boîte englobante, coordonnées ramenées en float, aire ` dx
CHG-116 2026-10-04 G6b ULPDataCompat::PreloadCityPackages ; appel dans LPModInfoSubsystem::Initialize lot I/O séparé de CHG-115. Le canal loadtime de G6Dev.utrace nomme les paquets lus pendant l'image longue : /Game/Heavy/StreetMap/Static/CentralLondon (maillage, vrac cuit de l'ordre des 164 Mo du CSV I6) et /Game/Heavy/StreetMap/CentralLondon (données StreetMap). Lecture async prioritaire dès l'instance de jeu, pas dans l'image du clic Continuer. Disque chaud : l'attente synchrone de cette trace était 0,325 s (GetAsset × 2) ; l'image I6 à froid faisait 6,2 s. Partie du 2026-10-04 : Preload ville : demande envoyee à 14:31:06, image Continuer à 14:31:15 retirer l'appel dans LPModInfoSubsystem::Initialize
CHG-117 2026-10-04 Dbg LPDebugSubsystem (-LPCollisionLog) ; LifePlay.Build.cs (Chaos) ; lanceurs LifePlay_debug_sessionB_mem.bat et LifePlay_debug_collision.bat ; 09, 18 §10, skill lifeplay-debug-build le dump du ExecCmds de démarrage (I5, 23 primitives, 1 trimesh) ne nomme pas l'acteur des 93 Mo de trimesh. Le switch échantillonne toutes les 2 s et écrit le porteur des triangles. Rapport : les capsules PNJ sont les 0,11 Mo de convexes, pas le trimesh git revert du commit
CHG-118 2026-10-04 Dbg Tools/debug/LifePlay_debug_ui.bat et .ps1 ; BuildDebug.ps1 copie aussi le .ps1 ; 18 §3 choisir les options de mesure dans une fenêtre, au lieu de lancer LifePlay.exe sans switch. Le canal memory est décoché par défaut. -csvCaptureFrames n'est pas proposé. Copié dans l'archive Development déjà cuite supprimer les deux fichiers
CHG-119 2026-10-04 PairCap nouveaux Source/LifePlay/LPPairCapsuleSubsystem.h/.cpp (snapshot LifePlay_Backup_5.5\PairCap : sources absentes, journal sauvegardé) essai demandé : après la coupure des capsules d'une scène à deux (GI.SexPersons, sinon AP1 et AP2, les deux en NoCollision et à moins de 4 m), une capsule unique orientée de l'un vers l'autre, canal Pawn, rayon du corps, longueur qui les couvre. Les capsules d'origine restent coupées. Les meubles qui ignorent Pawn et le sol ne l'arrêtent pas. Si le balayage touche un mur, le couple est repoussé ensemble. Journal : Capsule couple : posee / retiree .\Tools\Restore.ps1 -Lot PairCap
CHG-120 2026-10-04 PairCap2 LPPairCapsuleSubsystem.h/.cpp (snapshot LifePlay_Backup_5.5\PairCap2) retour de la partie 16:25 : capsule posée rayon 20, barrière sur le lit, murs toujours traversés, capsule du joueur absente à la fin. Inversion : la capsule du couple est posée après la coupure, droite, calée sur les deux maillages, canal WorldDynamic (les meubles ignorent seulement Pawn). Le lit et le sol ne repoussent pas. À la fin de la scène elle est détruite, les capsules du couple reviennent en QueryAndPhysics, gravité du joueur à 1 si GI::Show l'avait mise à 0 .\Tools\Restore.ps1 -Lot PairCap2
CHG-121 2026-10-04 PairCap retrait de Source/LifePlay/LPPairCapsuleSubsystem.h/.cpp (Restore.ps1 -Lot PairCap -Only ces deux fichiers ; copies dans LifePlay_Backup_5.5\PairCap\_retires\20261004-170801) demande utilisateur : annuler toutes les modifications de capsules (CHG-119 et CHG-120). La scène à deux était devenue injouable. Aucun Blueprint touché. Cuisson Development ensuite pour retirer le sous-système de l'exécutable joué remettre les deux fichiers de _retires\20261004-170801
CHG-122 2026-10-04 PairCol nouvelle commandlet éditeur Source/LifePlayEditorTools/LPPairCollisionTestCommandlet.h/.cpp essai hors partie (demande utilisateur) : work___vin01 reconstruit dans une scène d'éditeur (54 meubles, échelle monde ~1, aucun Blueprint modifié, pas de cuisson). Capsules copiées du CDO Person (rayon 20, demi-hauteur 88, profil Custom : Pawn Ignore, WorldStatic Ignore, WorldDynamic Block). Le balayage est celui de la marche, l'animation n'est pas jouée. Résultat (Saved/Logs/portage/LPPairCollisionTest.txt, code 0) : meuble qui ignore Pawn traversé (371 cm) ; meuble qui bloque Pawn arrête une capsule active à 50 cm (fnt_new183) et laisse passer une capsule NoCollision ; deux capsules au profil Person se traversent déjà ; avec le profil Pawn du moteur, IgnoreActorWhenMoving les laisse se traverser (80 cm) pendant que le meuble les arrête encore supprimer les deux fichiers de la commandlet
CHG-123 2026-10-04 PairCol nouveaux Source/LifePlay/LPPairSandbox.h/.cpp, Tools/debug/LifePlay_pair_sandbox.bat fenêtre jouable à part de la partie (demande utilisateur) pour voir les deux réglages. Chambre work___vin01 (54 meubles), capsules du CDO Person dessinées (verte joueur, cyan autre, rouge si coupée). Touche 1 : meubles bloquent Pawn. Touche 2 : capsules QueryAndPhysics ou NoCollision. L'instance de jeu Blueprint n'est pas chargée. Ouverture vérifiée : mode LPPairSandboxGameMode, 54 meubles, 0 absent, capsule 20 / 88, départ (−700, −700, 108) supprimer les trois fichiers
CHG-124 2026-10-04 PairCol LPPairSandbox : soleil, contre-jour, ciel, lampe au-dessus du couple ; maillages bridget_gp (joueur) et michael (l'autre) sur les capsules la fenêtre montrait les capsules sans corps et restait sombre. La collision reste celle de la capsule : le maillage ne bloque pas retirer les lumières et les SetSkinnedAssetAndUpdate
CHG-125 2026-10-04 PairCol LPPairSandbox : soleil, contre-jour, ciel et correction d'exposition retirés ; un spot au plafond (cône vers le bas, au-dessus du couple) et deux lampes latérales la fenêtre aveuglait. L'éclairage de la pièce est celui d'un bureau : plafonnier et deux lampes sur les côtés remettre le soleil
CHG-126 2026-10-04 PairCol LPPairSandbox : plafonnier et lampes créés mobiles avant l'enregistrement ; exposition manuelle, r.EyeAdaptationQuality à 0 la lumière brillait une seconde puis s'éteignait : lampes stationnaires sans précalcul, et l'œil automatique assombrissait la pièce remettre les lumières stationnaires
CHG-127 2026-10-04 PairCol LPPairSandbox : plafonnier 80 000, lampes latérales 25 000, cône plus large, chute non quadratique, exposition manuelle +6, ombres des lampes coupées avec l'exposition du projet (calée sur un soleil), 5 000 candelas restaient noires. Les trois lampes éclairent le couple sans soleil revenir aux intensités de CHG-126
CHG-128 2026-10-04 PairCol LPPairSandbox : plafonnier, lampes latérales et exposition forcée retirés. Éclairage copié de CentralLondon : FullBodyLight intensité 1,5 (canal 0), Sun intensité 5 température 10 000 K (canal 1 seulement), SkyLight cubemap urban_street_03_1k intensité 0,6, SkyAtmosphere à Z −100 000, BP_Sky_Sphere branché sur le soleil. Les trois lumières sont mobiles la pièce restait noire. Le jeu n'éclaire pas le bureau avec un plafonnier : le relevé de la carte donne ces intensités, et SkylightHours va de 0,2 (nuit) à 0,7 (midi). 0,6 est l'heure 9 et l'heure 15. L'exposition redevient celle du projet remettre le plafonnier de CHG-127
CHG-129 2026-10-04 PairCol LPPairSandbox : sol en BlockAllDynamic (la capsule Person ignore WorldStatic), départ cherché sur le canal Pawn, apparition au point libre, vitesse remise à zéro, physique du maillage Daz coupée. Si le corps passe sous le sol, retour au point de départ Bridget traversait la pièce puis tombait sans fin : le cube BlockAll ne porte pas cette capsule, et un départ dans un meuble l'éjecte remettre le sol BlockAll
CHG-130 2026-10-04 PairCol LPPairSandbox : quatre murs, sol et plafond de Room (cubes FntWall, positions du Blueprint, enfants de la racine à l'échelle du .lpworld). Les murs bloquent en WorldDynamic. Plafond sans collision, comme WallT la pièce n'avait pas d'enveloppe : Bridget sortait. Les meubles bloquent et les deux capsules se traversent, c'est le réglage déjà mesuré retirer les six cubes
CHG-131 2026-10-04 PairCol LPPairSandbox : touches 1 et 2 lues par front montant (IsInputKeyDown, aussi pavé numérique). Scène AgMakeout (AgMakeout_F sur Bridget, AgMakeout_M sur Michael), les deux au même point, en boucle 1 et 2 ne changeaient rien : WasInputKeyJustPressed est déjà effacé quand le personnage est mis à jour. La scène est une paire Daz du show retirer PlayAnimation
CHG-132 2026-10-04 PairCol LPPairSandbox : menu déroulant des paires Daz (F sur Bridget, M sur Michael). Départ à 1 m des murs ouest et sud. Caméra à 2,5 m, bras sans collision, réinitialisée à chaque animation. Clic droit pour tourner le couple était à ~60 cm du coin et la caméra à 3,8 m. Le menu liste les scènes du show retirer le menu et remettre le bras à 380
CHG-133 2026-10-04 PairCol LPPairSandbox : départ décalé de 1 m vers le centre (X=-508,7 Y=-499,3) pour sortir de la plante fnt_new155 du coin sud-ouest le couple était posé dans le pot revenir à +100 cm des murs
CHG-134 2026-10-04 PairCol LPPairSandbox : le partenaire est soudé au joueur (même position, même rotation, marche coupée, capsule sans collision). Seule la capsule du joueur déplace le couple en jeu les deux corps d'une scène partagent le point et se déplacent ensemble ; ici Michael restait sur place retirer Weld
CHG-135 2026-10-04 PairCol LPPairSandbox : la capsule du couple est recalculée sur les os des deux animations (6 instants), rayon et hauteur, bas maintenu au sol la capsule Person (rayon 20, demi-hauteur 88) ne couvre pas les deux corps retirer FitCoupleCapsule
CHG-136 2026-10-04 PairCol LPPairSandbox : capsule recalculée à chaque animation, sur la pose des deux clips, et recentrée sur le couple. Les corps restent en place la mesure précédente lisait la pose de repos et déplaçait la capsule revenir à la capsule Person
CHG-137 2026-10-04 PairCol LPPairSandbox : la capsule du couple est remplacée par une boîte recalculée sur les os à chaque animation. Le déplacement balaie cette boîte essai demandé : une boîte épouse mieux une pose allongée qu'une capsule verticale revenir à FitCoupleCapsule
CHG-138 2026-10-04 PairCol LPPairSandbox : la boîte suit les os affichés de la pose en cours, marge 4 cm. Plus de boîte sur toute la durée du clip, plus de décalage pour garder le bas au-dessus du sol la boîte était trop basse et trop grande par rapport aux corps revenir à la mesure sur 8 instants
CHG-139 2026-10-04 PairCol LPPairSandbox : retour à la boîte mesurée sur l'animation (8 instants). La mise à jour sur les os affichés est retirée la boîte suivait la pose affichée en traversant le bureau, décalée des corps —
CHG-140 2026-10-04 ShowCouple nouveau LPShowCoupleSubsystem : pendant un show à deux (SexPersons, sinon AP1 et AP2, capsules coupées, moins de 4 m), le partenaire suit le joueur, une boîte mesurée sur l'animation arrête le couple, les meubles de Room bloquent Pawn le temps de la scène. lp.ShowCouple 0 rend la main au Blueprint. L'ancien chemin n'est pas modifié essai du show réel à partir de la boîte de la sandbox, réversible retirer les deux fichiers
CHG-141 2026-10-04 ShowCouple LPShowCoupleSubsystem : après le tick des acteurs, le partenaire est soudé au joueur (même point, maillages yaw −90 et Z = −demi-hauteur, comme la sandbox). La boîte des clips _F et _M est recalculée à chaque changement d'animation, pas une seule fois à l'entrée la boîte restait sur la première mesure et les deux corps ne partageaient pas le point revenir au FitBox de CHG-140
CHG-142 2026-10-04 ShowCouple LPShowCoupleSubsystem : la boîte est mesurée sur les séquences de GI.LastAnimation et sur tous les maillages du couple, pas seulement un clip _F/_M du maillage principal. Même changement d'animation, même soudure partie 21:16 : branche sans aucune ligne boite, la boîte verte absente revenir au filtre _F/_M de CHG-141
CHG-143 2026-10-04 ShowCouple LPShowCoupleSubsystem : les primitifs de Room, de ses acteurs attachés et de ses références proches qui ignorent Pawn passent en Block tant que le show dure (pas seulement les composants directs). La boîte ignore les clips idle et prend la paire voisine (_0/_1 ou _F/_M) dans le même dossier partie 21:31 : boîte idle_Daz+SF_ft07_1 (centre X=-54, étendue 99×46×93), seulement 12 composants. Le repos debout gonflait la boîte, et SF_ft07_0 n'était pas chargé retirer BlockRoomPawn et le filtre idle
CHG-144 2026-10-04 PawnGlobal Room::addObject : SetCollisionResponseToChannel(Pawn) passe de ECR_Ignore à ECR_Block. Snapshot LifePlay_Backup_5.5\PawnGlobal. Commandlet LPFixPawnResponse le canal Pawn est le même pour toutes les chambres ; essai demandé : Block dès la pose du meuble, plus seulement pendant le show .\Tools\Restore.ps1 -Lot PawnGlobal
CHG-145 2026-10-04 PawnDyn Room::addObject enchaîne SetCollisionObjectType(WorldDynamic) après le Pawn Block. Murs Wall1–Wall4 en WorldDynamic et Pawn Block. KeepTogether balaie comme la sandbox : le sol ne masque plus le mur. Snapshot LifePlay_Backup_5.5\PawnDyn options 1 et 2 de la sandbox sur Oui : la capsule Person ignore WorldStatic, donc Pawn Block seul la laisse traverser ; la boîte du show s'arrêtait au lit .\Tools\Restore.ps1 -Lot PawnDyn
CHG-146 2026-10-04 ShowCouple LPShowCoupleSubsystem : un meuble qui a une action sit, lie, use ou work dans Heavy/New2/Daily ne bloque plus Pawn. Pendant cette animation, la capsule ignore WorldDynamic, puis la réponse d'origine revient les PNJ ne pouvaient plus s'asseoir ni se coucher : la capsule était repoussée hors de la chaise et du lit retirer OpenUseFurniture et LetSittersPass
CHG-147 2026-10-04 ShowCouple Pendant le show, les meubles utilisables rebloquent Pawn (restaurés à la sortie). La boîte a la collision de la sandbox et son balayage s'arrête sur un objet qui bloque, sans accepter le déplacement s'il est déjà dedans. Le sol ne compte pas la boîte traversait le lit, les murs et les meubles : le lit était forcé en Ignore, et un contact déjà engagé laissait passer tout le mouvement revenir au KeepTogether de CHG-145
CHG-148 2026-10-04 ShowCouple KeepTogether : un contact déjà engagé (la boîte repose dans le lit) ne fige plus le déplacement. Un obstacle rencontré devant arrête et laisse glisser, y compris en hauteur les contrôles ne déplaçaient plus la boîte : chaque mouvement commençait dedans et était refusé revenir au refus de CHG-147
CHG-149 2026-10-04 ShowCouple KeepTogether : le sol arrête la boîte comme un mur. Un volume déjà traversé (mur ou sol) repousse la boîte dehors au lieu d'accepter le déplacement la boîte passait dans le mur et dans le sol : ces contacts étaient ignorés revenir au filtre de CHG-148
CHG-150 2026-10-04 ShowCouple KeepTogether ignore toutes les capsules de personnages. Le balayage ne s'arrête plus que sur les murs, le sol et les meubles des capsules vides, le corps étant posé à côté, bloquaient le déplacement de la boîte retirer la boucle AddIgnoredActor
CHG-151 2026-10-05 ShowCouple FitToBodies : la boîte suit les os affichés des deux corps, marge 4 cm. La mesure sur toute l'animation reste le repli si les os ne sont pas prêts la boîte couvrait tout le clip plus 12 cm et entrait dans les objets autour du couple retirer FitToBodies et rappeler FitBox à chaque clip
CHG-152 2026-10-05 ShowCouple La boîte ignore mains, pieds et os annexes. Seul le contact latéral le plus profond annule la direction qui y entre ; le sol et le lit ne coupent plus le déplacement horizontal la boîte faisait 2,18 m et un contact sur le côté bloquait la gauche revenir au FitToBodies et au balayage de CHG-151
CHG-153 2026-10-05 ShowCouple Un contact de profondeur 0 ne bloque plus. Le flanc d'un lit ne repousse plus la boîte : elle peut y revenir, et un recouvrement la soulève vers le matelas Wall1, Wall4 et Wall coupaient la gauche sans pénétration, et quitter le lit empêchait d'y retourner retirer IsBedMesh et le seuil de profondeur
CHG-154 2026-10-05 ShowCouple La boîte ignore l'acteur Wall de CentralLondon. Le lit ne la pousse plus vers le plafond ; seul le dessus du matelas la porte la coque Wall coupait la gauche dans le vide, et la poussée du lit collait le couple au plafond retirer l'ignorance de Wall et la sortie du flanc de lit
CHG-155 2026-10-05 ShowCouple Un lit est reconnu par son nom. Il ne bloque un déplacement que vers le bas, pour se poser ; le retour horizontal n'est plus arrêté et le contact ne renvoie plus la boîte après avoir quitté le lit, la boîte ne pouvait plus y revenir revenir au test DoesPackageExist et au filtre du flanc seul
CHG-156 2026-10-05 Clavier LPKeyboardSubsystem : bouton « Clavier » ajouté à l'exécution dans MainMenu.SettingsScrollBox ; panneau pour changer, ajouter ou retirer une touche (actions et axes clavier). Écrit dans Saved/Config/Windows, pas dans GameSettings.sav pouvoir réaffecter les touches, dont Q, sans modifier les Blueprints retirer LPKeyboardSubsystem.h/.cpp et la dépendance UMG
CHG-158 2026-10-05 Réglages LPSettingsSubsystem : onglets Audio, Video, Lewd, General, Keyboard, Misc au-dessus de SettingsScrollBox. Les lignes du Blueprint restent en place et sont montrées selon leur texte ; le reste va dans Misc. Keyboard affiche la liste des touches la liste unique ne montrait pas le clavier retirer LPSettingsSubsystem.h/.cpp
CHG-250 2026-10-08 U0 Docs/Migration/27_Plan_Migration_UE58.md, Docs/Migration/28_Synthese_Migration_UE58.md, Tools/VS2026/LifePlay-UE58.vsconfig (nouveau) ; hors dépôt : tag local ue5.5-final, copie D:\Game\LifePlay-master 5.8 (branche ue5.8) clôture de U0 : P1, P6, P7 verrouillées (G-U D5, D6, D4/D7) ; copie de travail 5.8 (17 087 fichiers, .mcp.json utilisateur conservé, jonction des skills) ; configuration VS Installer de VS 2026 suivie ; fiches T2, T2b, T3, T4, DOC1 et VAL déléguées (N0 haiku, N1 sonnet), VAL PASS git revert du commit ; copie 5.8 : dossier à supprimer par l'utilisateur ; tag : git tag -d ue5.5-final
CHG-249 2026-10-08 U0-entrée .gitignore, Config/DefaultEngine.ini, Docs/Migration/27_Plan_Migration_UE58.md, Docs/Migration/28_Synthese_Migration_UE58.md (nouveau), index Docs/Migration/README.md, Docs/Migration/etat/ (92 fichiers retirés du suivi) fiches de travail etat/ hors dépôt (décision utilisateur : un doc de synthèse suffit ; copie D:\Game\LifePlay_Backup_5.5\etat\), .cursor/ ignoré ; doc 28 = synthèse autonome UA + G-U + SK ; U0-T2/T2b : VS 2026 en coexistence, projet 5.5 épinglé CompilerVersion=14.38.33130 (compilation de contrôle code 0, toolset 14.38.33130 au journal UBT), toolset 5.8 14.50.35717 non banni (version cl.exe 14.50.35739) git revert du commit ; les fichiers etat/ restent sur le disque ; ini : Tools\Restore.ps1 -Lot U0 -Only Config\DefaultEngine.ini
CHG-248 2026-10-08 U-PLAN-2 Docs/Migration/27_Plan_Migration_UE58.md lot UA (audit jeu, plugins, mods, moteur, essai de compilation 5.8, effort et risques) et porte G-U avant tout portage ; orchestration révisée : Opus high orchestre, délègue jusqu'à Fable (niveaux N0–N5, grille de complexité a–f, fiche à 9 rubriques) ; agents opus-xhigh, opus-max, fable-top dans ~/.claude/agents/ document seul : git revert du commit
CHG-247 2026-10-08 U-PLAN Docs/Migration/27_Plan_Migration_UE58.md (nouveau), index Docs/Migration/README.md plan de migration UE 5.5 → 5.8 (lots U0–U9) ; décisions utilisateur : 4.27 abandonné, gestion des mods figée, correctifs UE4 gardés avec voie UE5 préparée (U9), commandlets du portage 4.27 retirés (U2), dossier séparé LifePlay-master 5.8, V2.0 (2026.10.2.0) document seul : git revert du commit
CHG-246 2026-10-08 DOCNUM Docs/Migration/23_Video_Quality.md → 25_Video_Quality.md, 24_Eval_Agents_VideoQuality.md → 26_Eval_Agents_VideoQuality.md (git mv, titres « 25 — », « 26 — »), références mises à jour (journal CHG-237 à 240, etat/VQ/VQ5/VQ5-VAL.md, docs 25/26), index Docs/Migration/README.md complété (20, 21, 22, 24, 25, 26), report « numéros en double » de 21_Sandbox_Addon.md coché numéros de docs en double (23, 24) ; renumérotation par ordre de création .\Tools\Restore.ps1 -Lot DOCNUM
CHG-245 2026-10-07 DC4 LifePlay.uproject (plugin McpAutomationBridge "Optional": true), Source/LifePlay/LifePlay.Build.cs (dépendance Json retirée), docs (09_Commandes_Utiles.md, 18_Build_Debug.md, 21_Sandbox_Addon.md, 24_Plan_Decouplage_Sandbox.md, etat/sandbox/DC4/*) (commit code fbbcee1) preuve « jeu seul » : clone strictement propre sans addon compile (éditeur + Development, code 0), build Development empaqueté sans addon (BUILD SUCCESSFUL), test en jeu utilisateur (nouvelle partie, sauvegarde, Continuer) ; défaut trouvé : McpAutomationBridge (ignoré par git) bloquait un clone propre ; piège UBT Makefile.bin documenté dans 09/18. Motif : prouver que le jeu public compile et tourne sans l'addon LifePlay-Sandbox pin inchangé 79f0205
CHG-244 2026-10-08 PROP / ERR-043 Docs/Migration/etat/PROP/PROP-BUG.md, PROP-CART.md ; dumps etat/PROP/PROP_LPDumpFunction_20261008-*.txt ; Source/LifePlay/LPPersonPropGuardSubsystem.h/.cpp (nouveaux) « seul le verre reste apparent » : destroyDummy sans clearProps + mesh vide. Garde runtime : si Person caché ou Mesh sans SkeletalMesh → clearProps + purge tableau Props + enfants SMC NODE_AddStaticMeshComponent* seulement (pas les vetements *SM) ; si visible → retire props orphelines (parent ≠ Mesh ou socket None/invalide). Fiche bug complète (symptôme, repro, cause, non-causes, acceptation). Compile LifePlayEditor PASS ; PIE à valider — → créés
CHG-243 2026-10-08 ERR-008 Source/LifePlay/LPMapMarkersGuardSubsystem.h/.cpp (nouveaux) garde runtime : si MapMarkers.WidgetComponents est vide, clear Vector2Ds, reconstitue depuis les UWidgetComponent existants ou ajoute un slot de focus invisible — évite le spam Array_Get / Set Input Mode Game And UI (FocusOnMapMarkers sans Length). Corrélé à l'approche PNJ (updateAllPersonButtons → SpawnMapMarkers). Live Coding PASS (nouvelle classe) — → créés
CHG-242 2026-10-08 VQ-fix Source/LifePlay/LPSettingsSubsystem.cpp, LPSettingsSubsystem.h contraste UI Settings : HardenSettingsControls force un style Slate sombre/lisible sur toutes les cases et SpinBox (valeurs pâles sur fond flou) ; ticker Settings à 0 pour que ApplyRows gagne face au BP. Compile LifePlayEditor PASS — → modifiés
CHG-241 2026-10-08 VQ-fix Source/LifePlay/LPSettingsSubsystem.cpp, Source/LifePlay/LPVideoQualitySubsystem.cpp correctifs post-VQ : (1) CategoryOf ignore les infobulles (faux positifs screen/quality → Sex Description, Map Marker, NewAnimationsOnly hors Video) + classements par nom UMG (ShowFPS, etc.) ; (2) MainMenu.GI rattaché sur l'écran titre (spinbox DoF / cases) ; (3) RepairShowFPS (style + enabled) ; (4) ApplyRows à chaque tick ouvert ; (5) ApplyToScalability n'écrit plus que les 4 sg.* en SetByConsole (fin du spam SetByScalability ignored sur ScreenPercentage/PoolSize/SSS). Live Coding PASS — → modifiés
CHG-240 2026-10-07 VQ5 Docs/Migration/26_Eval_Agents_VideoQuality.md (nouveau), Docs/Migration/etat/VQ/VQ5/VQ5-VAL.md (nouveau) clôture VQ5 : évaluation des agents du chantier VQ (lots VQ0–VQ4 tenus/coupés/rollback, qualité des consignes, modèle ↔ complexité dont Fable bloqué → repli Sonnet en VQ2-T2, sync PASS en code et BLOCKED-UI en jeu). Décision GO conditionnel avec 3 recommandations. Annexe VQ5-VAL : chemins Overall / Custom / Recommended PASS (code), smoke -nullrhi de VQ4 relu (pas de nouveau run : aucun code changé, chemins non atteignables par console). Constat : DefaultScalability.ini s'écarte de BaseScalability.ini au niveau Epic (cascades 10 → 4, RadiusThreshold, DetailMode, RefractionQuality 2 → 3) ; VQ1-VAL jamais produit ; VQ1 et VQ2 sans CHG. Documentation seule, aucun code — → créés
CHG-239 2026-10-07 VQ4 Docs/Migration/25_Video_Quality.md (§ 8 Acceptation V1), Docs/Migration/etat/VQ/VQ4/VQ4-VAL.md (nouveau) clôture V1 du chantier VQ : validation finale PASS (SetLevels sync, Recommended VRAM, CategoryOf LPVideo* + TabHidden, LPColor* toujours Video, DefaultScalability.ini sans cvar L7c : grep 0 hit, DefaultEngine.ini inchangé, DLL à jour, démarrage -nullrhi exit 0). Critères d'acceptation cochés dans le doc 23 ; test manuel Settings resté BLOCKED-UI. Documentation seule, aucun code - créés / modifiés
CHG-238 2026-10-07 VQ3 Source/LifePlay/LPVideoQualitySubsystem.cpp, Source/LifePlay/LifePlay.Build.cs (module RHI), Docs/Migration/25_Video_Quality.md (§ 2 Sync), Docs/Migration/etat/VQ/VQ3/VQ3-IMPL-H.md, VQ3-VAL.md (nouveaux) lot VQ3 : le bouton LPVideoRecommended n'applique plus un niveau fixe mais lit la VRAM dédiée (RHIGetTextureMemoryStats, DedicatedVideoMemory) : < 4 Go Low, < 6 Med, < 10 High, sinon Epic ; VRAM inconnue (0 / -1 / -nullrhi) = High. Application par SetLevels(FromOverall(niveau), true) (alignement des 4 curseurs, Save, RefreshWidgets). Compile LifePlayEditor OK, démarrage -nullrhi OK ; test manuel Settings BLOCKED-UI — → modifiés
CHG-237 2026-10-07 VQ0 Docs/Migration/25_Video_Quality.md (nouveau, ébauche), Docs/Migration/etat/VQ/VQ0/VQ0-VAL.md (nouveau) lot VQ0 : validation A-VAL de la cartographie Video (VQ0-CART, PASS) ; ébauche de référence qualité vidéo (périmètre V1, sync GameUserSettings/Scalability, ancrage L7c, injection LPVideo* avant LPColor*, conflits BP Shadow/PP/AA). Documentation seule, aucun code — → créés
CHG-236 2026-10-07 DC3 jeu : retrait (57 fichiers suivis) de Tools/BuildMod.ps1, NewMod.ps1, EditMod.ps1, ModSource.ps1, HairPipeline.ps1, HairImportFbx.py, HairMaterials.py, FbxMaterialMap.py, ImportQuaternius.py, DiagnosePose.py, Tools/anim/, Tools/hairs/, Tools/mods/, ModSources/, AnimSources/, Config/LPSandbox.ini, Tools/debug/*_sandbox.bat, Docs/Modding/FullGuides/Creating_Asset_Mods.md, Docs/Modding/ShortGuides/explanation.lphair (contenu disque déplacé, non supprimé, vers D:\Game\LifePlay_Backup_5.5\DC3\deplaces_du_jeu) ; références SplitModules.ps1, LPModInfoSubsystem.h, BuildDebug.ps1, explanation.lpmod, README.md, .gitignore ; docs (21_Sandbox_Addon.md, 09_Commandes_Utiles.md, 13_Protocole_Coiffure.md, 16_H3_Mods_Paquets.md, 10_Protocole_Operations.md, 23_Cycle_De_Vie_Mod.md, 20_Chaine_Animations.md, README.md, etat/sandbox/S3/S3-INT.md, etat/sandbox/DC3/*) ; addon D:\Game\LifePlay-Sandbox : atelier de mods (Tools/*, Tools/Roots.ps1 nouveau, ModSources, AnimSources, lanceurs, Docs/Modding, Config/LPSandbox.ini section [Workshop], .gitignore), LPAnimCatalogCommandlet.cpp (-Livraison= obligatoire), LPAnimMeasurePaths.cpp/.h et LPSandboxConfig.cpp (replis vers le jeu retirés) (commits 1f4ec1f et 79f0205b7281152dde7cd088086d8c813e0b20f5, branche lot/DC3-atelier, tag lot-DC3-valide) lot DC3 : l'atelier de mods vit dans l'addon ; cuisson de lpr_anim_freeanims depuis l'addon identique au mod publié (29 fichiers, SHA-256) ; tournée freeanims identique à SB2-REF (DC3-VAL PASS) ; piège UBT Makefile.bin (cache généré sans addon) traité. Motif : le jeu public ne doit plus embarquer l'outillage ni les sources de mods du dépôt privé LifePlay-Sandbox pin 97c0d13 → 79f0205 (hash complet 79f0205b7281152dde7cd088086d8c813e0b20f5)
CHG-235 2026-10-07 DC2 jeu : Source/LifePlayEditorTools/ (13 sources retirées : LPAnimEvalCommandlet, LPAnimTwistCommandlet, LPAnimCatalogCommandlet, LPAnimIdentifyCommandlet, LPAnimChecks, LPHairFromStaticMeshCommandlet en .h/.cpp, LPAnimMethodSelect.h), LifePlayEditorTools.Build.cs, docs (21_Sandbox_Addon.md, 20_Chaine_Animations.md, 09_Commandes_Utiles.md, 08_Guide_Developpeur.md, etat/sandbox/S3/S3-INT.md, etat/sandbox/DC2/*) ; addon D:\Game\LifePlay-Sandbox : module LPModTools (nouveau), LPAnimMeasurePaths.h/.cpp (nouveau), LPSkeletonProfile.cpp, LPPoseMeasure.cpp, LPAnimMeasure.Build.cs, LPSandboxConfig.cpp, LPSandbox.uplugin (commit 97c0d134cd1388c3735add79d77ea98817e89fbe, branche lot/DC2-modtools, tag lot-DC2-valide) lot DC2 : les commandlets de mods (LPAnimEval, LPAnimTwist, LPAnimCatalog, LPAnimIdentify, LPHairFromStaticMesh) passent dans le module éditeur LPModTools de l'addon ; le jeu compile sans l'addon (DC2-BUILD) et démarre sans lui (DC2-VAL E5) ; résultats identiques à SB2-REF (DC2-VAL PASS). Motif : le jeu public ne doit plus dépendre du dépôt privé LifePlay-Sandbox pour son outillage éditeur pin 3e9c32f → 97c0d13 (hash complet 97c0d134cd1388c3735add79d77ea98817e89fbe)
CHG-234 2026-10-07 DC1 jeu : Plugins/LPAnimCore/* (nouveau plugin : LPAnimRedirect.*, LPCoupleSim.h, LPCoupleSimCore.cpp), LifePlay.uproject, Source/LifePlay/LifePlay.Build.cs, docs (21_Sandbox_Addon.md, 20_Chaine_Animations.md, 07_Architecture_5.5.md, etat/sandbox/S3/S3-INT.md, etat/sandbox/DC1/*) ; addon D:\Game\LifePlay-Sandbox : LPSandbox.uproject, LPSandbox.uplugin, LPAnimMeasure.Build.cs, LPAnimMeasure.h, LPSandbox.Build.cs, suppression de LPAnimRedirect.*, LPCoupleSim.h, LPCoupleSimCore.cpp (commit 3e9c32f1f27b1abdaf7731dc90496c27ee061718, branche lot/DC1-animcore, tag lot-DC1-valide) lot DC1 : LPAnimRedirect et LPCoupleSim rapatriés dans le plugin LPAnimCore du jeu, LPAnimMeasure réduit à la mesure ; compilation PASS, DC1-VAL PASS, contrôle visuel utilisateur 2026-10-07 ; report DC0 SetUALRoot traité. Motif : le jeu public doit compiler sans le dépôt privé LifePlay-Sandbox (premier pas du découplage) pin 16905c6 → 3e9c32f (hash complet 3e9c32f1f27b1abdaf7731dc90496c27ee061718)
CHG-233 2026-10-07 DC0 Docs/Migration/24_Plan_Decouplage_Sandbox.md (nouveau), Docs/Migration/etat/sandbox/DC0/DC0-CART.md, DC0-SPEC.md, DC0-VAL.md (nouveaux) lot DC0 : plan du découplage jeu / sandbox (lots DC0 à DC4), cartographie et SPEC approuvées par l'utilisateur le 2026-10-07 (plugin LPAnimCore dans le jeu, module éditeur LPModTools et tout l'outillage de mods dans l'addon, dépôt Sandbox privé) ; documentation seule, aucun code. Motif : le jeu public doit compiler sans le dépôt privé LifePlay-Sandbox (LifePlay et LifePlayEditorTools dépendent de LPAnimMeasure) aucun pin (documentation seule)
CHG-232 2026-10-07 SB4 addon D:\Game\LifePlay-Sandbox : Plugins/LPSandbox/Source/LPSandbox/LPPairSandbox.cpp, LPSandboxModRegistry.cpp, LPSandboxModRegistry.h (SB4-T0 : ouverture par déclencheur éphémère non mémorisée, sandbox_mode.txt du pilote), README.md (commits 16905c68070992f5139dab907b41b461fb765957 code + pin, tag lot-SB4-valide, branche lot/SB4-final, tag d'entrée lot-SB4-avant = 30e8c18) ; jeu : Docs/Migration/etat/sandbox/SB4/SB4-BUILD.md, SB4-VAL.md, SB4-EVAL.md, Docs/Migration/23_Cycle_De_Vie_Mod.md (§ 7), Docs/Migration/21_Sandbox_Addon.md, Docs/Migration/etat/sandbox/S3/S3-INT.md lot SB4 (dernier lot de la sandbox modulaire) : SB4-T0 correctif (ouverture par déclencheur éphémère, Open=lps_couple intact), compilation PASS, validation finale F1 à F4 PASS (démarrage, tournées Quaternius et FreeAnimationsPack identiques à SB2-REF, LPAnimEval identique), doc 23 § 7, évaluation SB4-EVAL.md : décision GO pour transposer au jeu par petits lots pin 3d85852 → 16905c6 (hash complet 16905c68070992f5139dab907b41b461fb765957)
CHG-231 2026-10-07 SB2-O1 addon D:\Game\LifePlay-Sandbox : Plugins/LPSandbox/Source/LPSandbox/LPSandboxScene.cpp (ALPSandboxScene::ShowRoom : SetHiddenInGame(false) puis SetVisibility(true, true) sur meubles et murs), README.md (commits 3d858527fccfdddd8711c7c7448fa001442e0b8a code + 30e8c18 pin, tag lot-SB2-O1-valide, branche lot/SB2-O1, tag d'entrée lot-SB2-O1-avant = b4ca206) ; jeu : Docs/Migration/etat/sandbox/SB2/SB2-O1-BUILD.md, Docs/Migration/etat/sandbox/S3/S3-INT.md, Docs/Migration/21_Sandbox_Addon.md (pin, reports SB2, porte G-SB3) mini-lot SB2-O1 : correction du défaut O1 (meubles et murs invisibles au retour de Mesure, ShowRoom rendu symétrique de HideRoom) ; compilation PASS ; tournée freeanims identique à SB2-REF (73/73 fichiers, JSON/CSV/TXT identiques) ; contrôle visuel utilisateur « c'est bon » (meubles et murs visibles en revenant de Mesure vers Couple et Interaction). Porte G-SB3 (décision utilisateur 2026-10-07) : SB3 abandonné (plugins physiques séparés non faits) ; les mods du jeu sont du contenu (.lpmod + pak), leurs dépendances sont vérifiées par le registre (prouvé en SB1/SB2), coût ≈ 1 à 1,5 lot, LPAnimMeasure utilisé par le jeu en Shipping ; on passe à SB4 ; E3 non traité pin fece7e9 → 3d85852 (hash complet 3d858527fccfdddd8711c7c7448fa001442e0b8a)
CHG-230 2026-10-07 SB2 addon D:\Game\LifePlay-Sandbox : Plugins/LPSandbox/Source/LPSandbox/* (nouveaux LPSandboxScene.h/.cpp ex-LPSandboxRoomBuilder.cpp, LPSandboxActors.h/.cpp, LPSandboxCamera.h/.cpp, LPSandboxCoupleMod.h/.cpp ex-LPCoupleSim.cpp, LPSandboxInteractionMod.h, LPSandboxMeasureMod.h ; registre, enveloppes, LPPairSandbox*, LPSandboxInteraction/Measure/MeasureTour adaptés), Plugins/LPSandbox/Modules/Mods/lps_asset_integration/lps_asset_integration.lpmod, README.md (commits fece7e9a0e63b3058b5d24d96d669a3c9c0e9add code + b4ca206 pin, tag lot-SB2-valide, branche lot/SB2-bibliotheques) ; jeu : Docs/Migration/etat/sandbox/SB2/SB2-VAL.md, Docs/Migration/etat/sandbox/S3/S3-INT.md, Docs/Migration/21_Sandbox_Addon.md (pin, SB2, reports) lot SB2 : scène (pièce, meubles), personnages et caméra extraits du socle en bibliothèques lps_lib_scene / lps_lib_actors et caméra du socle ; état de chaque mode sorti vers trois mods UObject (lps_couple, lps_interaction, lps_asset_integration) ; contexte filtré par prérequis ; décisions D1 à D7 (voir etat/sandbox/SB2/SB2-CART.md) ; validation E1 à E5 PASS + contrôle visuel utilisateur (« tout est conforme » : 3 mods, enchaînement, scène neutre D3, panneau sous MC/PNJ D5, images freeanims) ; O1 (murs et meubles invisibles au retour de Mesure) confirmé par l'utilisateur, préexistant, non corrigé (hors périmètre) pin 82dae58 → fece7e9 (hash complet fece7e9a0e63b3058b5d24d96d669a3c9c0e9add)
CHG-229 2026-10-07 SB1 addon D:\Game\LifePlay-Sandbox : Plugins/LPSandbox/Source/LPSandbox/* (registre FLPSandboxModRegistry, journal LogLPSandboxMods, Saved/sandbox_mods.ini, barre latérale, enveloppes), Plugins/LPSandbox/Modules/ (7 descripteurs .lpmod), README.md (commits 82dae58380b76c45f60541fd7cb5a0a409700e10 code + commit pin, tag lot-SB1-valide, branche lot/SB1-registre) ; jeu : Docs/Migration/etat/sandbox/SB1/SB1-VAL.md, Docs/Migration/etat/sandbox/S3/S3-INT.md, Docs/Migration/21_Sandbox_Addon.md (pin, SB1, reports) lot SB1 : registre de mods, barre latérale, 7 descripteurs ; modes Pair / Interaction / Mesure enveloppés en lps_couple / lps_interaction / lps_asset_integration ; validation E1 à E5 PASS + contrôle visuel utilisateur (a, b, c, barre latérale, images E5 : pas de défauts constatés) pin 3b21fd1 → 82dae58 (hash complet 82dae58380b76c45f60541fd7cb5a0a409700e10)
CHG-228 2026-10-07 SB0 addon D:\Game\LifePlay-Sandbox : Docs/SB0-conception.md, Docs/SB-plan.md, README.md (commits C1 3b21fd1, C2 12d6198, tags lot-SB0-avant / lot-SB0-valide, branche lot/SB0-conception) ; jeu : Docs/Migration/etat/sandbox/S3/S3-INT.md, Docs/Migration/21_Sandbox_Addon.md (pin) conception de la sandbox modulaire demandée par l'utilisateur (modes Pair/Interaction/Mesure → mods lps_couple / lps_interaction / lps_asset_integration, modules système et bibliothèques lps_*, .lpmod étendu rétrocompatible, interface ILPSandboxMod, registre, barre latérale ; plan SB0–SB4 au format du cahier S0–S8) pin a3b1b89 → 3b21fd1 (hash complet 3b21fd180c04f0fa49a1b5c9ef1b517ade1cb362)
CHG-227 2026-10-07 DOC-MOD-3 Docs/Migration/23_Cycle_De_Vie_Mod.md (§ 2.6 nouveau, 7 schémas Mermaid) schémas du cycle de vie d'un module demandés par l'utilisateur : états (installé, monté, listé, inscrit, actif / inactif, retiré, déchargé), séquence de démarrage (moteur, registre, GI, sous-systèmes C++), arbres logiques de GI.LoadSettings(LoadLastSave), GI.PopulateRaws(), du gestionnaire (CreateModManagerWidget(GameStart), ToggleMod(Mod, IsEnabled), SortLoadOrder(ForUp, ModuleIndex), CloseModManager(GameStart)), appel d'une animation de mod, désactivation et déchargement ; graphes reconstitués depuis le relevé LPDumpFunction -BP=GI -Fn=EventGraph -Pins -Exec et l'ordre d'initialisation de UGameInstance (moteur) ; 7 schémas rendus sans erreur par Mermaid 11 aucun changement de code ni de configuration
CHG-226 2026-10-07 DOC-MOD-2 Docs/Migration/23_Cycle_De_Vie_Mod.md (§ 2.4, 3.1, 3.2, 3.3 et 3.4 nouveaux, 5, 6) ; Docs/Migration/Journal_Modifications.md complément de la documentation du cycle de vie d'un mod, constats vérifiés dans les Blueprints (GI, UI/ModuleTick, relevés LPDumpFunction) et le moteur UE 5.5 : l'ordre de chargement existe (GI.SortLoadOrder, PopulateRaws : le premier fichier lu par nom gagne, le module le plus bas l'emporte, fichiers texte seulement) ; vin_Base verrouillé en dur dans UI/ModuleTick ; dépendance .uplugin obligatoire absente = le jeu ne démarre pas, donc aucune dépendance entre mods dans le .uplugin ; doublons entre .uplugin, .lpmod et pack.json, divergences dues à New-IfMissing de DeliverAnims.ps1 ; évolutions E12 corrigée, E13 à E15 ajoutées aucun changement de code ni de configuration
CHG-225 2026-10-07 DOC-MOD Docs/Migration/23_Cycle_De_Vie_Mod.md (nouveau) ; Docs/Migration/README.md (ligne d'index) documentation demandée par l'utilisateur : cycle de vie d'un mod, propriétés réellement lues par le moteur (.uplugin) et par le jeu (.lpmod), classes, architecture, capacités, évolutions possibles. Constat consigné : LPModDailies ne consulte pas la case du gestionnaire de mods (un pack d'animations décoché fournit encore ses clés, évolution E1) ; MODULE_REQUIREMENTS n'est pas vérifié aucun changement de code ni de configuration
CHG-224 2026-10-07 AP7 Cuisson DLC et essai en jeu empaqueté. Config/DefaultGame.ini : ProjectVersion=2026.10.1.6 (version de référence d'essai, non publiée) ; +DirectoriesToNeverCook pour /Game/Quaternius, /Game/FreeAnimationsPack, /Game/AnimPacks, /Game/Retarget_ue5 (sources de travail, jamais dans le jeu). Tools/anim/DeliverAnims.py : à la copie dans le mod, les réglages de compression qui pointent sur /Engine/ sont remis à vide (les clips d'un pack UE5 référençaient /Engine/Animation/DefaultAnim*CompressionSettings : cuisson DLC refusée) ; la compression par défaut du projet s'applique, comme pour Quaternius lot AP7, étape 7. Empaquetage Shipping 2026.10.1.6 (D:\Game\LifePlay_Build_5.5_Shipping_AP7\Windows, Releases/2026.10.1.6) ; mods cuits contre cette version : lpr_anim_quaternius (84 paquets, zip 15 798 332 o), lpr_anim_freeanims (20 paquets, 0 référence moteur, zip 4 416 299 o) dans D:\Game\LifePlay_Publication\Mods\ ; module d'essai lpr_anim_essai copié dans le seul jeu d'essai (hors du projet : LifePlay_Backup_5.5/AP7/hors_build). Essai utilisateur en jeu empaqueté : animations jouées (qua_*, fap_*, témoin dance) .\Tools\Restore.ps1 -Lot AP7 ; supprimer D:\Game\LifePlay_Build_5.5_Shipping_AP7 et Releases/2026.10.1.6 ; rien n'est commité dans le dépôt du jeu
CHG-223 2026-10-07 AP7 Pilote. Tools/anim/AnimPipeline.ps1 (étapes 0 inventaire, 1 import, 2 identification, 3 calque, 4 conversion + torsion, 5 évaluation + rapport HTML + vignettes et planches par la sandbox, 6 livraison dans le mod + fiches + catalogue, 7 cuisson DLC ; rapport JSON par étape dans Saved/AnimPipeline/<pack>/etapes, etat.json, arrêt au premier contrôle en échec, reprise -From, ancien contenu déplacé dans precedent_<date>, -DryRun, -SansCuisson) ; BuildMod.ps1 -Anim <pack> ; pack.json étendu (bloc chaine : méthode, profil attendu, source glb uasset, sorties, corps et gabarits Daz Idle_F_Daz / idle_Daz, mod, dossier de travail, sortie sandbox) ; AnimSources/freeanims/pack.json (licence CC BY 4.0, auteur SoerGame, page Fab, page de l'auteur url_auteur, 10 animations déclarées) ; outils de livraison et de catalogue génériques (DeliverAnims -Pipeline -Pack -Vignettes -Planches, textes du mod et lien d'auteur tirés de pack.json, adresse de la source dans CREDITS.txt). Défauts corrigés pendant les passages réels : console start /wait restée ouverte (lancement par cmd /c), lancement de la sandbox par un tuyau qui attendait sa fermeture lot AP7. Quaternius de bout en bout (reprises à l'étape 4 puis 5 après corrections) : mesures, verdicts, fiches et catalogue identiques au passage précédent (42 fiches, 42 vignettes, 42 planches) ; FreeAnimationsPack de bout en bout en 10 min, code 0 : mod lpr_anim_freeanims (10 clips × 2, .lpmod CC BY 4.0, crédits), catalogue de 10 fiches. Étape 7 (cuisson DLC) non faite : la version de référence Releases/2026.10.1.5 (V1.5) ne contient ni le correctif de Person ni LPModDailies ; nouvel empaquetage à décider avec l'utilisateur
CHG-222 2026-10-07 AP7 Conversion et sandbox. Tools/RetargetQuaternius.py déplacé en Tools/anim/RetargetPack.py, piloté par Saved/anim_retarget.json (méthode, maillage source, dossiers, corps, exclusions, dossier des poses ; défauts = Quaternius, noms d'assets inchangés ; rigs suffixés pour les autres méthodes) ; jeton de cuisson (BuildMod ne retient que les lignes RETARGET … jeton <j>). BuildMod.ps1 : chemins entre guillemets au lancement de l'éditeur (le dossier contient une espace ; l'éditeur se fermait sans journal), lecture complète des journaux modifiés depuis le lancement (l'ancienne lecture à partir de la taille du précédent LifePlay.log sautait la ligne de résultat), attente de fermeture de l'éditeur portée à 10 min, -RetargetConfig, -Anim. Addon LifePlay-Sandbox (commits a3b1b89 puis 159afbf, pin mis à jour dans etat/sandbox/S3/S3-INT.md, 21_Sandbox_Addon.md et README de l'addon) : [Sandbox.Pack] + surcharge Saved/sandbox_pack.ini (mode Mesure seulement), LPAnimRedirect::BodyClipPath, clip initial du pack, tournée vignettes planches quitter (enchaînement et fermeture). Piège rencontré : des DLL périmées du plugin dans LifePlay-Sandbox/Plugins/LPSandbox/Binaries (même BuildId) étaient chargées à la place des neuves ; dossier déplacé (non supprimé) dans LifePlay_Backup_5.5/AP7-addon/Binaries_perimes_2036 lot AP7 : FreeAnimationsPack (10 clips) converti en ue5 : 0 rejeté, 0 à revoir, écart 0,0006 %, torsion 0,015° ; validé visuellement par l'utilisateur dans la sandbox .\Tools\Restore.ps1 -Lot AP7 (jeu) et .\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu
CHG-221 2026-10-07 AP7 Méthodes de transformation et identification du squelette. Profil Tools/anim/profiles/ue5_mannequin.json (SK_Mannequin UE5, colonne 5 os, cou 2, réglages A→T optionnels) ; méthodes Tools/anim/methodes/ue4.json (pose T, ex-« Quaternius »), ue5.json (pose A : calques = repos du mannequin UE5 et de Genesis, ajusté à la morphologie), genesis_direct.json (copie Daz, déclarée factice). Principe (demande de l'utilisateur) : 1) la pose du mannequin, A ou T, est le calque d'origine ; 2) Bridget et Michael sont placés dans la même pose, calque ajusté à leur morphologie ; 3) le convertisseur choisit le profil de transformation ; 4) application. Addon LPAnimMeasure : SetMethod, MethodForProfile, calque par méthode (MakeTPose), cache d'ajustement par méthode, identification à égalité → profil le plus complet (le mannequin UE5 contient tous les noms UE4 : il était pris pour UE4 à 100 %). Commandlets du jeu : LPAnimIdentify (nouveau : scores par profil, os manquants, squelette, méthode ; contrôle croisé avec le module de mesure), `-Methode=<id auto>surLPAnimEvaletLPAnimTwist (Source/LifePlayEditorTools/LPAnimMethodSelect.h), -BodyClipDir, -Templates, -PoseOnly, borne des réglages séparée pour les doigts -SeuilReglageDoigts=45` (corps : 30 ; la main du mannequin UE5 est au repos légèrement fermée : ajustement des doigts ≈ 31°) lot AP7 de 20_Chaine_Animations.md. Non-régression : Quaternius en auto → ue4, toutes valeurs et verdicts identiques à AP4 (écart de torsion 4e-5°)
CHG-220 2026-10-06 S8 Docs/Migration/22_Eval_Agents_Sandbox.md (nouveau) ; Docs/Migration/etat/sandbox/S8/S8-VAL.md (nouveau) ; Docs/Migration/21_Sandbox_Addon.md (§ Acceptation : S8 coché, push addon coché, deux cases ouvertes ajoutées BuildMod -Target et commit côté jeu ; ligne S8 du tableau des lots) ; Saved/Logs/S8-VAL-runtime-game.log (copie locale, non versionnée) lot S8-T1/T2 : bilan du mode multi-agents + multi-modèles sur S0–S7 (lots tenus / coupés, consignes et reprises, adéquation modèle ↔ fiche : 11 fiches sur 27 tracent le modèle réel, S3-T3 sous-classé, S2-T2 sur-classé ; erreurs de rôle ; friction git : submodule abandonné, jeu jamais commité, trois identités git) ; décision GO conditionnel et 3 recommandations (politique modèles tracée, clôture git par lot, séparation VAL / DOC + registre des reports) ; validation S8-VAL PASS : Tools/debug/LifePlay_pair_sandbox.bat lancé tel quel, plugin monté, LPPairSandboxGameMode, 16 lignes LogLPSandbox, boîte AgMakeout identique à S5 / S7-VAL, 0 crash ; constat : origin/main addon = dae6206 (pin f09c42e poussé) aucun changement de code C++ ni de configuration
CHG-219 2026-10-06 S7 LifePlay.uproject (plugin LPSandbox : Optional: true) ; repo addon LifePlay-Sandbox Plugins/LPSandbox/LPSandbox.uplugin (SupportedTargetPlatforms: ["Win64"], module LPSandbox : TargetConfigurationDenyList: ["Shipping"], description ; commit local f09c42e, non poussé) ; Docs/Migration/21_Sandbox_Addon.md (§ Acceptation, ligne S7, pin), Docs/Migration/etat/sandbox/S3/S3-INT.md (pin) ; Docs/Migration/etat/sandbox/S7/S7-SPEC.md, S7-IMPL-L.md, S7-CART.md, S7-VAL.md (nouveaux) ; Saved/Logs/S7-VAL-*.log (copies locales, non versionnées) lot S7-T1..T4 : contrat d'isolation du plugin (aucun include / LIFEPLAY_API / module LifePlay : 0 résultat ; Person en lecture de CDO seule, aucun GI / Room ; chemins par config) ; LPSandbox exclu du Shipping (TargetAllowList: ["Editor"] rejeté : le sandbox tourne en -game), LPAnimMeasure conservé car requis par LifePlay.Build.cs ; validation S7-VAL PASS : build LifePlayEditor Development à jour, plan UBT Game Development (6 occurrences LPSandbox) / Shipping (0), smoke Pair ~1 min 45 s (boîte AgMakeout identique à S5-VAL, 0 crash) ; limites : pas de compilation Shipping complète, commit addon non poussé, Optional n'évite pas l'échec du build sans clone sibling aucun changement de code C++
CHG-218 2026-10-06 S6 Docs/Migration/20_Chaine_Animations.md, Docs/Migration/09_Commandes_Utiles.md, Docs/Migration/21_Sandbox_Addon.md (lot S6), Docs/Migration/etat/sandbox/S6/S6-VAL.md (nouveau) ; Saved/AnimPipeline/S6-VAL/, Saved/Logs/S6-VAL-LPAnimEval.log (copies locales, non versionnées) lot S6-T1…T3 : confirmation que LifePlayEditorTools.Build.cs dépend déjà de LPAnimMeasure (module addon, aucun include cassé, 0 fichier Source/LPAnimMeasure/) ; build LifePlayEditor Win64 Development à jour ; doc chaîne animations et commandes alignées (plugin LPSandbox, bats Tools/debug, sorties Saved/Measurement, commandlets LPAnimEval / LPAnimTwist / LPAnimCatalog) ; validation S6-VAL PASS : -run=LPAnimEval -Clips=Idle_Loop -Instants=1 (~1,3 s, code 0, rapport.json valide, LogLPAnimMeasure actif) ; bat Mesure non rejoué (déjà PASS en S2-VAL) aucun changement de code C++
CHG-217 2026-10-06 S5 repo addon LifePlay-Sandbox (Plugins/LPSandbox/Source/LPAnimMeasure/LPCoupleSim.h nouveau 215 l., LPCoupleSimCore.cpp nouveau 474 l., LPSandbox/LPCoupleSim.cpp 477 → 384 l., commit c1fdd29 ; README.md : table du pin, commit bed7901, doc seule, le pin reste c1fdd29) ; Source/LifePlay/LPShowCoupleSubsystem.h/.cpp (1048 → 805 l., FSavedMove imbriquée supprimée, fichiers non suivis par git) ; Docs/Migration/etat/sandbox/S5/S5-CART.md, S5-IMPL-H.md, S5-VAL.md (nouveaux) ; Docs/Migration/21_Sandbox_Addon.md (section « CoupleBox », lot S5, pin) ; Docs/Migration/etat/sandbox/S3/S3-INT.md (pin) ; Saved/Logs/S5-VAL-runtime-game.log, S5-VAL-build.log (copies locales, non versionnées) lot S5-T1…T4 : fin de la dérive de fork entre la sandbox Pair et LPShowCoupleSubsystem ; une seule source de vérité namespace LPCoupleSim dans le module LPAnimMeasure (niveau pur, lecture d'assets, effets de bord, ResolveCoupleMove avec FSweepOptions::Show() / Sandbox()), −336 lignes dupliquées ; écarts conservés par options (plancher −90 / −88, 2 / 3 itérations) ; builds LPSandboxEditor (non-unity) et LifePlayEditor (unity) 0 erreur / 0 avertissement. Validation S5-VAL : PASS : bat Pair depuis le jeu (~90 s) : plugin monté, LPPairSandboxGameMode, 16 lignes d'initialisation LogLPSandbox, ligne Sandbox boite AgMakeout (fond −90,000 cm), 0 erreur de module, aucun crash ; ShowCouple : PASS-STATIC (compilation, 34 références LPCoupleSim, copies locales supprimées), parcours show en jeu non exercé ; pin addon c1fdd29e2c1036c7d6365ba6389eff5d2f8c8c96 LifePlay-Sandbox au pin f8102647ccdebad37e4977ccbf2c51e583823a80 (LPCoupleSim absent du module partagé) ; LPShowCoupleSubsystem et LPCoupleSim.cpp (sandbox) avec leurs copies locales de la géométrie
CHG-216 2026-10-06 S4 repo addon LifePlay-Sandbox (LPInteractionSandbox.h/.cpp supprimés, LPSandbox.Build.cs, README.md, Docs/S3-move.md, commit f810264) ; Docs/Migration/etat/sandbox/S4/S4-VAL.md (nouveau) ; Docs/Migration/21_Sandbox_Addon.md (lot S4/S6, pin addon) ; Docs/Migration/etat/sandbox/S3/S3-INT.md (pin) ; Saved/Logs/S4-VAL-runtime-game.log (copie locale, non versionnée) lot S4-T3/T4a : retrait du GameMode Interaction legacy dans l'addon (~543 LOC, doublon chat/vues) ; grep addon sans LPInteractionSandbox / ALPInteractionGameMode ; mode Interaction via menu LPPairSandbox ; build LifePlayEditor Win64 Development OK ; essai Pair ~45 s depuis le jeu : plugin monté, LPPairSandboxGameMode, 16 lignes LogLPSandbox, 0 erreur module ; pin addon mis à jour f8102647ccdebad37e4977ccbf2c51e583823a80 addon : restaurer LPInteractionSandbox.* depuis commit 32ad09c ; jeu : retirer S4-VAL.md, entrée journal, rétablir pin 4de1f0b dans doc 21 / S3-INT.md
CHG-215 2026-10-06 S3 LifePlay.uproject (AdditionalPluginDirectories, plugin LPSandbox) ; Source/ (retrait de LPAnimMeasure/, LPPairSandbox*, LPInteractionSandbox*, LPSandboxConfig*) ; Config/LPSandbox.ini (copie dans l'addon) ; Source/LifePlay/LifePlay.Build.cs, Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs ; Docs/Migration/21_Sandbox_Addon.md (section stratégie git, lot S3) ; Docs/Migration/etat/sandbox/S3/S3-INT-scaffold.md, S3-IMPL-L.md, S3-IMPL-H.md, S3-INT.md, S3-VAL.md (nouveaux) ; repo addon LifePlay-Sandbox (nouveau : README.md, Docs/S3-move.md, plugin LPSandbox) lot S3 sandbox→addon : code sandbox (LPSandbox + LPAnimMeasure) transféré vers le dépôt séparé LifePlay-Sandbox (https://github.com/edujiro5972/LifePlay-Sandbox.git, main) ; stratégie git : deux clones siblings (D:\Game\LifePlay-master 5.5, D:\Game\LifePlay-Sandbox) + AdditionalPluginDirectories = ["../LifePlay-Sandbox/Plugins"], pas de submodule (plugin imbriqué Plugins/LPSandbox/Plugins/LPSandbox ou doublon External/) ; pin manuel 4de1f0b6764ed3bc575bb687630d3f070e1be221 (S3-T4 : FLPSandboxModule::StartupModule injecte QuaterniusUALRoot dans LPAnimRedirect::SetUALRoot) ; Content monté dans l'addon par junction NTFS (AdditionalAssetDirectories absent d'UE 5.5) ; build LifePlayEditor Win64 Development OK (S3-INT). Validation S3-VAL : PASS : bat Pair depuis le jeu (~85 s) : plugin monté, Game class is 'LPPairSandboxGameMode', 16 lignes LogLPSandbox, 0 erreur de module ; addon mince LPSandbox.uproject -game : GameMode et sandbox OK, réserve : 2 458 erreurs de Blueprints du jeu (StreetMapBuilding, plugin StreetMap non activé dans l'addon), sans effet sur le sandbox ; avertissement hors lot : /Game/Quaternius/UAL/M_Joints absent LifePlay : code sandbox et LPAnimMeasure dans Source/ ; aucun AdditionalPluginDirectories ni plugin LPSandbox dans LifePlay.uproject
CHG-214 2026-10-06 S2 Source/LPAnimMeasure/ (nouveau : LPAnimMeasure.Build.cs, LPAnimMeasure.h/.cpp) ; LPPoseMeasure.h/.cpp, LPSkeletonProfile.h/.cpp, LPPoseOrchestrator.h/.cpp, LPAnimRedirect.h/.cpp (déplacés de Source/LifePlay/) ; LifePlay.uproject, Source/LifePlay.Target.cs, Source/LifePlayEditor.Target.cs, Source/LifePlay/LifePlay.Build.cs, Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs, Source/LifePlay/LifePlay.cpp, Source/LifePlay/LPInteractionSandbox.cpp, Tools/LogStats.ps1 (modifiés) ; Docs/Migration/21_Sandbox_Addon.md (section module + graphe de dépendances) ; Docs/Migration/etat/sandbox/S2/S2-CART.md, S2-IMPL-H.md, S2-VAL.md (nouveaux) lot S2 sandboxaddon : chaîne de mesure de poses extraite de LifePlay vers le module Runtime LPAnimMeasure (8 fichiers déplacés, LPANIMMEASURE_API, catégorie LogLPAnimMeasure, 6 exports ajoutés pour LPPairSandbox.cpp) ; couplage à LPSandboxConfig rompu par LPAnimRedirect::SetUALRoot appelé depuis FLifePlayModule::StartupModule ; module acyclique (aucune dépendance vers LifePlay) ; #include "Engine/TextureCube.h" ajouté à LPInteractionSandbox.cpp (défaut IWYU révélé par la recomposition unity) ; compteur LogLPAnimMeasure dans LogStats.ps1. Validation S2-VAL : PASS (11 fichiers dans le module, 0 reliquat dans LifePlay, .uproject et deux Build.cs conformes, DLL UnrealEditor-LPAnimMeasure du 18:34 postérieure aux sources, bat Mesure lancé : 269 lignes LogLPAnimMeasure, profils chargés, mesure et orchestrateur en marche, 0 erreur de module ou de lien). Reste : S1-CART.md à mettre à jour, commandlets anim non relancés, contrôle visuel non fait LifePlay : les 8 fichiers étaient dans Source/LifePlay/ (LPANIMMEASURE_API -> LIFEPLAY_API, LogLPAnimMeasure -> LogLifePlay, LifePlay.h inclus) ; LifePlay.cpp en FDefaultGameModuleImpl ; aucun module LPAnimMeasure
CHG-213 2026-10-06 S1 Config/LPSandbox.ini (nouveau) ; Source/LifePlay/LPSandboxConfig.h/.cpp (nouveaux) ; Source/LifePlay/LPPairSandbox.cpp, LPAnimRedirect.cpp (modifiés) ; Docs/Migration/21_Sandbox_Addon.md (§ Contrat) ; Docs/Migration/etat/sandbox/S1/S1-SPEC.md, S1-IMPL.md, S1-CART.md, S1-VAL.md (nouveaux) lot S1 sandbox→addon : chemins du sandbox Pair externalisés dans Config/LPSandbox.ini (19 clés, 6 sections) lu par FLPSandboxConfig::Get() ; defaults = anciens littéraux, donc comportement inchangé sans ini ; 0 littéral /Game/... restant dans LPPairSandbox.cpp / LPAnimRedirect.cpp (S1-CART : 0 OUBLI) ; contrat résumé dans doc 21 ; validation S1-VAL : PASS statique, compilation UBT et runtime non exécutés (DLL UnrealEditor-LifePlay plus ancienne que les sources), test override WorldFile à faire à la main LPPairSandbox.cpp et LPAnimRedirect.cpp : littéraux remplacés par FLPSandboxConfig::Get().<clé> ; Mode lu si Saved/sandbox_mode.txt absent
CHG-212 2026-10-06 S0 .gitignore ; Docs/Migration/21_Sandbox_Addon.md (nouveau) ; Docs/Migration/etat/sandbox/S0/S0-CART.md, S0-VAL.md (nouveaux) lot S0 sandbox→addon : motif .gitignore Debug → /Debug/ pour que Tools/debug/*.bat ne soient plus ignorés sous Windows (core.ignorecase) ; ébauche doc 21 et inventaire gelé du périmètre (~7,5 k LOC, commandlets, lanceurs) ; validation S0-T2 (S0-VAL PASS : git check-ignore vide sur les 3 bats, sources témoin présentes) ligne 5 : Debug → /Debug/
CHG-211 2026-10-06 AP6 Planches d'images animées du catalogue des animations (mouvement visible au survol de la vignette). Demande de l'utilisateur après validation du catalogue ; un GIF a été écarté (256 couleurs, lourd, aucun encodeur dans Unreal ni dans le Python standard) au profit d'une planche d'images JPEG animée par la page. Modifications : (1) Sandbox (Source/LifePlay/LPPairSandbox.h/.cpp, hors dépôt) : mode « planches » de la tournée (Saved/sandbox_tour.txt contenant planches) : par clip, 12 images par seconde de clip (de 4 à 24), à intervalles réguliers (fraction i/N), profil droit, sans calque ni repères ; un même carré pour toutes les images du clip (union des os projetés, marge 15 %), réduit à 256 px ; images collées côte à côte, JPEG qualité 85 (IImageWrapper), Saved/Measurement/planches/<Clip>.jpg + <Clip>.json (images, duree_s, taille). Résultat : 43 planches, 4,3 Mo au total (ex. Walk_Loop 16 images, 101 Ko), tournée de 16 min 33 s, sans erreur (compilation : etat/AP6_Build_20261006-160922.txt). (2) Tools/anim/Catalogue.py : option --planches ; contrôle bloquant (planche .jpg et .json présents, images >= 2, taille 256 ; refus vérifiés pour planche absente et images = 1) ; bloc planche dans chaque fiche (fichier, images, taille, ips = images / durée) ; copie dans Module/Animations/planches/<clé>.jpg. Page : vignette fixe ; au survol (souris) la planche défile à la cadence du clip et la vignette revient à la sortie ; au toucher, lance / arrête ; la planche n'est chargée qu'au premier survol ; avec la préférence système « réduire les animations », seulement au clic. Correction après essai dans le navigateur : l'image et l'animation masquées restaient affichées (règle CSS display plus forte que l'attribut hidden), corrigé par .card img[hidden], .card .anim[hidden] { display: none }. Résultat : catalogue régénéré dans ModSources/lpr_anim_quaternius/Module/Animations/ (42 fiches, 42 vignettes, 42 planches), CATALOGUE OK. Vérifié dans le navigateur : la planche se charge, l'animation remplace la vignette et avance à la cadence attendue (3 images en 250 ms pour 12,3 i/s) lot AP6 de 20_Chaine_Animations.md : planches du catalogue, animation au survol vérifiée dans le navigateur .\Tools\Restore.ps1 -Lot AP6 (même instantané qu'AP6 : sandbox, Catalogue.py) ; rien n'est commité
CHG-210 2026-10-06 AP6 Catalogue des animations (fiches calculées, pack.json, vignettes, catalogue.json et catalogue.html). Modifications : (1) AnimSources/quaternius/pack.json (nouveau) : déclaration du pack (source Quaternius Universal Animation Library Standard, CC0 1.0, fichier .glb, crédit, préfixe qua, exclusion A_TPose) et, pour les 42 clés, nom FR/EN, catégorie (les 8 du § 5 plus chute, magie, nage, conduite), accessoire, style, usage FR/EN ; champ facultatif posture qui remplace la posture calculée ("dans l'eau" pour les deux clips de nage). (2) Source/LifePlayEditorTools/LPAnimCatalogCommandlet.h/.cpp (nouveau), -run=LPAnimCatalog : pour chaque clé de livraison.json, mesure le clip féminin source image par image et contrôle que F et M ont même durée et même nombre d'images ; écrit Saved/AnimPipeline/quaternius/fiches_calculees.json. Mesures : durée, images, cadence ; boucle (dernière image comparée à la première, extrémités relatives à la hanche, en % de la taille ; boucle si ≤ 1 %) ; déplacement horizontal de la hanche (cm, cm/s, sens avant / arrière / côté, sur place sous 5 cm) ; posture par image (allongé : tronc > 60° ; à genoux : genou < 12 cm et hanche < 72 % ; assis : hanche < 72 % et plus de 20 cm en arrière des chevilles ; accroupi : hanche < 72 % ; debout sinon), posture du clip si ≥ 60 % des images, sinon « variable », posture de début et de fin ; hauteur d'assise (articulation de hanche, médiane des images assises) ; part des images pied au sol (< 3 cm de la hauteur de repos) ; mains au repos / en mouvement / levées. Deux corrections après la première relecture des fiches : axe avant du corps inversé (Roll sortait « arrière », Sitting_Enter « avant », la position assise sortait « accroupi ») et seuil debout abaissé de 80 % à 72 % (gardes de combat et poussée classées accroupi / assis). Résultat : 42 fiches, 0 échec (etat/AP6_LPAnimCatalog_20261006-155043.txt, puis le passage final du même jour). (3) Sandbox (Source/LifePlay/LPPairSandbox.h/.cpp, hors dépôt) : mode « vignettes » de la tournée (Saved/sandbox_tour.txt contenant le mot vignettes) : une vue par clip, profil droit à 1/3 de la durée, sans calque, squelettes ni repères de caméra ; image recadrée en carré autour des os du corps de Bridget projetés à l'écran (marge 15 %), réduite à 512 px et écrite par le délégué UGameViewportClient::OnScreenshotCaptured dans Saved/Measurement/vignettes/<Clip>.png ; le tour.csv de la tournée complète n'est pas remplacé. 43 vignettes. La tournée complète (387 captures) a aussi été refaite après les corrections de torsion d'AP4. (4) Tools/anim/Catalogue.py (nouveau) : assemble catalogue.json, catalogue.html (page autonome hors ligne, filtres catégorie / posture / durée, recherche, clé copiable, thème clair et sombre, lisible sur téléphone) et vignettes/<clé>.png dans ModSources/<mod>/Module/Animations/. Champs du § 5 ; taille_ko = taille des .uasset non cuits (taille_cuite: false, la taille cuite viendra en AP7) ; qualité = « accepté » ou « à revoir » avec motifs (rapport AP4), pire écart brut et pire torsion des deux corps ; empreinte SHA-256 des deux clips. Contrôles bloquants (rien n'est écrit si un échoue) : rapport AP4 valide ; fiches_calculees.json sans échec et plus récent que livraison.json ; fiche calculée et entrée pack.json pour chaque clé ; clés uniques ; aucune collision avec les 17 clés du jeu, les clés ANIMATION: / animate() des modules texte (hors module d'essai) et les autres catalogues de ModSources ; champs obligatoires ; vignette présente. Essais : un succès (42 fiches), trois refus (vignette manquante, collision avec dance, fiches plus anciennes que la livraison). Corrections après relecture : hauteur d'assise affichée seulement pour une posture assise ; écart de boucle arrondi ; cartes filtrées réellement masquées ; cadre des vignettes carré. (5) Tools/anim/DeliverAnims.ps1 : commutateurs -Catalogue (après la livraison) et -CatalogueOnly (régénère sans relancer Unreal, après le contrôle du rapport AP4). Résultat : ModSources/lpr_anim_quaternius/Module/Animations/ : catalogue.json, catalogue.html, 42 vignettes ; Saved/AnimPipeline/quaternius/catalogue_rapport.json (ok: true, 42 fiches). Relecture des 5 témoins (marche, assis, pistolet, danse, chute) : conforme après corrections (marche sur place, boucle, pieds au sol 68 % ; assis, assise 45 cm ; chute variable, debout puis allongé, 53 cm en arrière, pas de boucle). Compilations etat/AP6_Build_20261006-*.txt, 0 erreur. Reste ouvert : taille cuite (AP7) ; validation visuelle de la page par l'utilisateur lot AP6 de 20_Chaine_Animations.md : une fiche par clip, champs calculés relus sur 5 clips témoins (marche, assis, pistolet, danse, chute) .\Tools\Restore.ps1 -Lot AP6 (retire le commandlet, pack.json et Catalogue.py ; remet DeliverAnims.ps1, la sandbox et les documents) ; le catalogue généré dans ModSources et les vignettes dans Saved ne sont pas dans l'instantané (sorties régénérables) ; rien n'est commité
CHG-209 2026-10-06 AP5 Livraison en mod et appel par animate(). Mécanisme du jeu relevé (exports etat/L6f_dump_Person.txt, etat/AP5_LPDumpFunction_20261006-140513.txt, journal Saved/Logs/portage/AP5_LPDumpFunction_20261006-140513.log, AP5_Room_Dailies_CDO.txt) : .lpaction ANIMATION: (GI::EventGraph) et .lpscene Actor.animate(<clé>) (GI::CallFunction, aiguillage SwitchString_22, cas animate : AnimateForced vrai, Person::PlayDaily(Parameters[0]), AnimateForced faux) appellent Person::PlayDaily(<clé>). PlayDaily : aiguillage SwitchString_7 de clés écrites en dur (martialart, sneak, dance, na_sleep, write…), sortie Default vide (une clé inconnue ne faisait rien) ; chemin générique (cas martialart, sneak, dance, fightlost, knockedout) : debout puis PlayDailyAnim(<clé>). PlayDailyAnim parcourt Room.Dailies (tableau fixe de 34 clips, 17 clés × F/M, /Game/Heavy/New3/Anims/Daily/, valeur par défaut de Room, aucun graphe de Room ne le modifie), coupe le nom au premier _, compare la partie gauche à la clé, prend _M si IsMale, sinon un suffixe ≠ M ; le clip trouvé va dans currentDaily, joué par les Anim Blueprints Daily (michael_Skeleton) et Daily_F (bridget_gp_Skeleton). Aucun chemin construit, aucun registre d'assets : la ligne 14 de 16_H3_Mods_Paquets.md (animations trouvées par GetAssetsByClass) ne vaut donc pas pour ces animations. Squelettes des clips convertis B_* / M_* : bridget_gp_Skeleton / michael_Skeleton, identiques à ceux de Daily_F / Daily. Modifications : (1) Source/LifePlay/LPModDailies.h/.cpp (nouveaux) : ULPModDailiesSubsystem (GameInstance) relève au démarrage les UAnimSequence des plugins de type Mod sous /<Mod>/Anims nommés <clé>_F / <clé>_M (en éditeur, exploration synchrone du dossier, le registre étant asynchrone) ; dès que GI.Room existe (et à chaque nouvel acteur Room) les ajoute à la fin de Room.Dailies (une clé du jeu reste servie par le clip du jeu ; un clip de mod dont la clé existe déjà dans le jeu est ignoré avec avertissement) ; ULPModDailiesLibrary::IsModDaily(<clé>) (BlueprintPure) ; journalise PlayDaily(<clé>) -> cle de mod ou cle inconnue. LifePlay.Build.cs : dépendance Projects. (2) Source/LifePlayEditorTools/LPPatchDailiesCommandlet.h/.cpp (nouveau), -run=LPPatchDailies [-DryRun], appliqué à Content/BPs/Person.uasset : (a) sortie Default de SwitchString_7 vers un Branch sur IsModDaily(clé) puis le chemin générique (Knot_13) ; une clé inconnue du jeu et des mods ne fait toujours rien ; (b) le Split _ de PlayDailyAnim cherche depuis la fin (SearchDir FromEnd) : une clé peut contenir _, sans effet sur les 17 clés du jeu. Contrôles intégrés (nœuds trouvés une seule fois, Default libre, relecture des liaisons, compilation sans erreur, sinon rien n'est sauvegardé) ; rejouable. Résultats : essai à blanc etat/AP5_LPPatchDailies_20261006-143052.txt, application …-143149.txt, contrôle …-143248.txt (« deja fait »). (3) Tools/anim/DeliverAnims.ps1 et Tools/anim/DeliverAnims.py (nouveaux) : contrôle bloquant de Saved/AnimPipeline/quaternius/rapport.json (valide), affichage des « à revoir » ; crée ModSources/lpr_anim_quaternius (uplugin, .lpmod CC0, CREDITS) s'il manque ; monte le mod, copie (sans toucher aux sources) les 42 paires B_<Clip> / M_<Clip> (hors A_TPose) vers /lpr_anim_quaternius/Anims/Female/qua_<clip>_F et /Male/qua_<clip>_M, contrôle squelette, nombre d'images et durée, écrit Saved/AnimPipeline/quaternius/livraison.json, démonte. Contrôle de sortie LIVRAISON copies 84 erreurs 0 ; -DryRun. Deux corrections pendant le lot : -FullStdOutLogOutput (les messages Python de niveau Log n'apparaissaient pas dans la sortie console) et exploration du dossier du mod avant copie (sinon une deuxième passe échouait : copies existantes invisibles du registre). Journal final etat/AP5_DeliverAnims_20261006-143739.txt. (4) ModSources/lpr_anim_quaternius/ (nouveau) : mod d'assets, 42 clés × 2 clips. (5) Content/Modules/lpr_anim_essai/ (nouveau, module d'essai, jamais livré) : action « Essai animations AP5 » (maison) lançant une scène : femme puis homme temporaires, animate(qua_dance_loop), animate(qua_sitting_idle_loop), animate(qua_pistol_idle_loop), témoin dance, clé inexistante qua_cle_inexistante. Essai (jeu lancé en éditeur -game, mod monté dans Mods/, journal Saved/Logs/LifePlay.log du 2026-10-06 13:14–13:20) : 84 clip(s) ajoute(s) a Room_C_0.Dailies (118 au total) ; les trois clés -> cle de mod sur la femme et l'homme (scène jouée deux fois) ; qua_cle_inexistante -> cle inconnue. Contrôle visuel par l'utilisateur, validé sur 5 points : bons clips sur la femme puis l'homme, corps bien posés, deux places distinctes, témoin dance normal, enchaînement des trois animations visible. Compilations : etat/AP5_Build_20261006-143013.txt, …-143912.txt, …-150926.txt (0 erreur) ; une première compilation avait échoué (collision de nom dans la compilation unitaire, corrigée par un espace de noms nommé). Reste à faire (hors AP5) : essai en jeu empaqueté avec le mod cuit en DLC (BuildMod -Name lpr_anim_quaternius), qui exige une nouvelle version de référence du jeu (Person et le C++ ont changé), à faire avec la prochaine publication ou en AP7 ; catalogue (AP6) ; retirer le module d'essai avant toute publication lot AP5 de 20_Chaine_Animations.md : livraison en mod, clés appelables depuis un scénario .\Tools\Restore.ps1 -Lot AP5 (remet Person, LifePlay.Build.cs et les documents ; retire les fichiers et dossiers créés : sources C++, outils, ModSources/lpr_anim_quaternius, Content/Modules/lpr_anim_essai) ; rien n'est commité
CHG-208 2026-10-06 AP4 Contrôles indépendants de la formule : nouveau module LifePlayEditorTools/LPAnimChecks, calculé à chaque image du clip converti et comparé au mouvement source mis à l'échelle (hauteur de hanche). Six contrôles : sol (pied ou orteil plus bas que la source, cm), glissement (pied qui bouge quand le pied source est posé, cm par image), genou (hyperextension derrière la ligne hanche-cheville au-delà de la source, cm), flexion (écart de flexion coude / genou avec la source, °), saut (rotation d'un os d'une image à l'autre au-delà de 1,5 × la source + 2°), pénétration (main ou coude dans les capsules du tronc, cm). Pas d'actif physique sur bridget_gp ni michael (recherche par sous-agent) : capsules du tronc construites depuis la peau du maillage (sommets dont l'os dominant est du tronc, une capsule par segment de colonne, rayon au 30e centile des distances à l'axe) ; Bridget : abdomenLower 10,1 cm, abdomenUpper 10,2, chestLower 11,7, chestUpper 6,0 ; Michael : 12,0 / 12,7 / 14,1 / 8,1 ; auto-test (articulation de l'os porteur à une profondeur égale au rayon) : écart 0,0000 cm. LPAnimEval : contrôles branchés (controles_<Corps>.csv, verdict accepte / a revoir / rejete ; a_revoir dans rapport.json), seuils étalonnés sur les 43 clips : sol 3 cm, glissement 3 cm/image, genou 1 cm, flexion 5°, saut 10°, pénétration 1 cm ; « rejeté » au-delà de 3 × le seuil (-RejetFacteur), seul le rejet bloque ; options -Meshes, -SansControles, -Seuil*. Correction : -Clips, -Bodies et -Meshes s'arrêtaient à la première virgule (FParse::Value sans bShouldStopOnSeparator=false), aussi dans LPAnimTwist. Défaut trouvé par le contrôle de saut et corrigé : la décomposition flexion / torsion d'AP3, faite dans le repère du corps autour de l'axe en pose T, devenait instable quand le segment s'écartait d'environ 180° de cet axe (PickUp_Table 147,7° sur lForearmBend, Roll 44,9° sur rThighBend, Sword_Attack 26°, Pistol_Reload 26°, Punch_Jab 14°). Décomposition désormais dans le repère du parent, dans la formule (LPPoseMeasure::TransferPose) et dans LPAnimTwist (qui reprend la rotation complète portée par l'os Twist : relançable sur des clips déjà traités). Clips retraités (43 + 43) : clip converti 0,51 % → 0,19 % au pire, torsion 0,97° → 0,49° ; sauts : seul Jump_Start reste à 23,1° (lForearmBend). Relevé final sur 86 clips : 0 rejeté, 8 à revoir (4 par corps : Death01, Fixing_Kneeling, Roll pour le sol, entre 4,4 et 5,6 cm — poses au sol, hauteur de cheville différente entre squelettes ; Jump_Start pour le saut). Essai de refus (-Clips=Jump_Start -SeuilSaut=5) : code 1. Rapport HTML : Tools/anim/RapportControles.py (écrit par un sous-agent, libellé d'unité de la pose T corrigé) produit <dossier>/rapport.html ; vérifié : 43 lignes de contrôles et 129 lignes d'écarts par corps, HTML bien formé, rendu contrôlé lot AP4 de 20_Chaine_Animations.md : contrôles indépendants et rapport .\Tools\Restore.ps1 -Lot AP4 (remet aussi la formule, LPAnimTwist et les clips d'avant AP4 ; Tools/anim/RapportControles.py, créé après l'instantané, est à retirer à la main)
CHG-207 2026-10-06 AP3 Commandlet LPAnimTwist : répartition de la torsion sur les clips convertis. Pour chaque clé et chaque paire Bend / Twist du profil (épaule, avant-bras, cuisse, gauche et droite), la rotation de l'os Bend depuis la pose T ajustée est décomposée autour de l'axe du segment : Bend garde la flexion, l'enfant Twist reçoit la rotation complète ; les autres os gardent leur transformation (contrôle à chaque clé, tolérance 0,01° et 0,01 cm, sinon le clip n'est pas sauvé). -DryRun, rapport rapport_torsion.json. LPAnimEval mesure désormais la torsion (écart de rotation des os Bend et Twist avec la formule, colonnes torsion_deg, torsion_os, seuil bloquant -SeuilTorsion facultatif) ; TPoses exporté. Résultat : 43 + 43 clips traités et sauvés, conservation 0,00000° / 0,00000 cm, torsion déplacée jusqu'à 179,9° ; écart de torsion avec la formule 178,9° → 0,97° ; directions : 0,00 % aux instants sur une clé, 0,51 % au pire entre deux clés (Roll à 1/3, interpolation séparée de Bend et Twist), 108 instants sur 129 à 0,00 % ; seconde passe : 0,001° encore déplaçable (idempotent). Une recuisson (RetargetQuaternius.py) défait ce traitement : à relancer après chaque recuisson jusqu'au pilote AP7 lot AP3 de 20_Chaine_Animations.md .\Tools\Restore.ps1 -Lot AP3 (remet les clips d'avant)
CHG-206 2026-10-06 AP2 Commandlet LPAnimEval (LifePlayEditorTools, dépendance Json) : étapes 3 et 5 de la chaîne sans fenêtre. Pose T de chaque corps (écrit retarget_pose_<Corps>.txt), contrôles : segments ajustés ≤ SeuilPoseT (1 %), symétrie gauche / droite ≤ SeuilSymetrie (0,5°), réglages ≤ SeuilReglage (30°) ; évaluation de la formule et du clip converti sur chaque clip à Instants instants, ≤ SeuilEval (1 %). Rapports Saved/AnimPipeline/<run>/rapport.json, rapport_poseT_<Corps>.json, eval_<Corps>.csv ; code de sortie 0 / 1. LPPoseMeasure : relevé structuré de l'ajustement (FLPTFitResult, TFitResult) et fonctions exportées (LIFEPLAY_API), LPSkeletonProfile exporté. Contrôle : 22 s pour 43 clips × 3 instants × 2 corps (tournée de la sandbox : ~7 min, Bridget seule) ; fichiers de pose identiques à l'octet ; eval_Bridget.csv identique ligne à ligne à la tournée ; Michael mesuré pour la première fois : 129 instants, 0,00 % (pire réel 0,0026 %) ; symétrie 0,000°. Essai de refus (seuils impossibles) : code 1, 24 causes listées lot AP2 de 20_Chaine_Animations.md .\Tools\Restore.ps1 -Lot AP2 (retire le commandlet)
CHG-205 2026-10-06 AP1 Profils de squelettes : Tools/anim/profiles/ue4_mannequin.json et genesis8.json (rôle de chaque os, réglages de pose T Daz). LPSkeletonProfile (nouveau, dépendance Json dans LifePlay.Build.cs) les lit et identifie un squelette (≥ 95 % des os du profil). LPPoseMeasure : toutes les tables en dur (segments, segments de pose T, paumes, correspondances, chaînes colonne et cou, contrôles du tronc, repère, réglages A → T) sont dérivées des rôles pour tout couple de profils ; journaux propres à Genesis retirés (attaches, tronc en pose T). Sandbox : points clés, tête et bassin par rôle. RetargetQuaternius.py : chaînes et racine dérivées des mêmes profils, identification des maillages. Contrôle : 3 squelettes identifiés à 100 % (C++ et Python) ; 19 segments, 39 segments de pose T, 47 os transférés, 26 chaînes par rig (inchangés) ; retarget_pose_Bridget.txt et _Michael.txt identiques à l'octet ; tournée complète identique ligne à ligne (129 instants, 0,00 %) ; recuisson 43 + 43 clips, tournée courte sur 5 clips à 0,00 %. Incident : une première version du script de refonte a coupé le mauvais bloc (nom de structure présent deux fois) ; fichier remis depuis l'instantané AP1 avant de recommencer lot AP1 de 20_Chaine_Animations.md : une seule table de correspondance .\Tools\Restore.ps1 -Lot AP1 (retire Tools/anim, LPSkeletonProfile.* à retirer à la main : créés après l'instantané)
CHG-204 2026-10-06 PoseMeasure Phase C : Tools/RetargetQuaternius.py réécrit. La pose de retarget de RTG_Bridget et RTG_Michael est la pose T ajustée, lue dans Saved/Measurement/retarget_pose_<Corps>.txt (écrit par la sandbox à l'entrée du mode Mesure, LPPoseMeasure::WriteRetargetPose, 34 os : épaule 45,6°, cuisse 8,3°, avant-bras 14,2°… ; Michael calculé sur son propre squelette) ; plus d'alignement par le maillage, de réglages Daz séparés ni d'essais pole / roll180. Chaîne colonne abdomenLower → chestUpper (le pelvis Genesis n'est pas son parent) et cou en Interpolated ; 10 chaînes de doigts, chaînes d'orteils. Recuisson : 43 clips B_ et 43 M_. Tournée complète : clip recuit 0,00 % sur les 129 instants (ancien clip : médiane 29,2 %, pire 58,7 %), même résultat que la formule. Non mesuré : répartition de la torsion entre os Bend et Twist (le retargeter met toute la rotation dans l'os Bend), et Michael (sandbox sur Bridget seule). BuildMod.ps1 -Retarget échoue depuis l'environnement de l'agent (l'éditeur lancé par Start-Process s'arrête aussitôt sans journal) : éditeur lancé par cmd /c start avec les mêmes arguments phase C du plan .\Tools\Restore.ps1 -Lot PoseRetarget
CHG-203 2026-10-06 PoseMeasure Calque de pose : le calque orange n'est plus le squelette du mannequin mis à l'échelle (proportions et clavicule du mannequin), mais le squelette de Bridget posé par la formule (directions du mannequin, longueurs de Bridget), calé sur le bassin affiché, sans les os du visage, dessiné au premier plan. En vue pose T, c'est la pose T ajustée. Le contrôle caméra (MESURE vues) compare Bridget à ce calque (CalqueKeys) : 20 % auparavant (écart de proportions), 0,00 % en vue formule. Les traits depuis l'os racine (sol → hanche) ne sont plus dessinés le calque mélangeait pose et proportions (question de l'utilisateur) .\Tools\Restore.ps1 -Lot PoseCalque
CHG-202 2026-10-06 PoseMeasure La formule devient la vue par défaut du mode Mesure (la boucle de l'orchestrateur ne démarre plus seule, bouton Auto conservé). Navigation : N / P change de clip parmi les 43 clips Quaternius qui ont une copie B_, PgUp / PgDn change d'instant (LPPoseOrchestrator::SampleAt). Bouton Tournée, ou fichier Saved/sandbox_tour.txt posé avant le lancement (noms de clips facultatifs) : chaque clip à 0, 1/3 et 2/3 de sa durée, vues face, profil droit et dos, captures Saved/Measurement/tour/*.png (387 images, ~540 Mo) et relevé tour.csv. Contrôle du tronc par rotation depuis la pose T (bassin, poitrine, tête) au lieu des segments de colonne. Colonne de la formule : spine_01 ↔ abdomenLower et spine_03 ↔ chestUpper exacts, os intermédiaires interpolés (la poitrine s'écartait de 1 à 6,6 %). Relevé sur 129 instants : formule 0,00 % partout (contrôle de cohérence, pas une validation) ; clip converti médiane 29 %, pire 58,7 % (Pistol_Aim_Down, main gauche). Planche visuelle : épée, course, genou à terre, visée cohérents avec le mannequin étapes 1 et 2 du plan après validation de la formule .\Tools\Restore.ps1 -Lot PoseTour
CHG-201 2026-10-06 PoseMeasure Phase B : LPPoseMeasure::TransferPose, pose de Bridget calculée directement depuis le mannequin (rotation de chaque os depuis la pose T ajustée, portée par le changement de repère M). Correspondance : bassin → hip, clavicules, bras, avant-bras, mains, cuisses, tibias, pieds, orteils, 30 phalanges ; décomposition flexion / torsion (ToSwingTwist) entre os Bend et Twist (épaule, avant-bras, cuisse) ; colonne (3 → 4 os) et cou (2 → 3) interpolés à la même fraction de hauteur ; déplacement du bassin mis à l'échelle par la hauteur de hanche ; os non associés en rotation locale de pose T. Touche F ; contrôle Bridget-formule à chaque passage ; capture formule_NNNN_<vue>.png à l'arrêt de la boucle. Relevé : membres, mains, doigts et clavicules ≤ 1 % ; colonne en Idle abdomenUpper 6,5 %, chestUpper 1,8 % (interpolation de chaîne contre mesure os par os). Capture : poings fermés comme le mannequin, épaules symétriques méthode : équation de transformation avant l'ajustement fin .\Tools\Restore.ps1 -Lot PoseTransfer
CHG-200 2026-10-06 PoseMeasure Journal POSET tronc : position des articulations du tronc en pose T (avant / côté / haut depuis la hanche gauche, en % de la taille) pour les deux squelettes. Constat : le pelvis Genesis est au même point qu'abdomenLower (segment de longueur nulle, d'où les 60 %) ; la colonne n'a pas les mêmes jonctions (3 os mannequin, 4 Genesis avec chestLower) ; la clavicule du mannequin part de l'arrière du tronc (4,8 % derrière la hanche), celle de Genesis du sternum (2,9 % devant) question de l'utilisateur sur les écarts non ajustés .\Tools\Restore.ps1 -Lot PoseTFit
CHG-199 2026-10-06 PoseMeasure Phase A (équivalence en pose T) : FittedBodyT ajuste la pose T Daz de Bridget sur la pose T du mannequin (jambes, bras, mains, paumes, 28 phalanges), une fois par session ; tout l'étalonnage passe sur cette pose T ajustée. Touche T : les deux poses T côte à côte et le relevé dans le panneau. Journal POSET : écarts avant → après (pouce 17 % → 0, pied 9,4 % → 0, avant-bras 8,2 % → 0, tous les segments ajustés à 0,0 %) et rotations locales à reporter dans RTG_Bridget (POSET reglage, symétriques gauche/droite : pied 15°, avant-bras 14,2°, main 10,4°, pouce 24 et 22°, autres doigts 0,5 à 8,6°, cuisse, bras 2,3°). Bassin, colonne, cou et clavicules relevés sans ajustement (définition des os). Modèles metric links4. En Idle, la main reste tournée d'environ 180° : à confirmer visuellement méthode : établir l'équivalence des deux poses T avant toute transformation .\Tools\Restore.ps1 -Lot PoseTFit
CHG-198 2026-10-06 PoseMeasure LPPoseMeasure : tous les segments sont étalonnés sur une pose T commune (FLPPose.TPose) : le repos du mannequin ; pour Genesis, le repos plus les réglages Daz A → T de RetargetQuaternius.py (DazToT, pose de retarget de RTG_Bridget). On compare la rotation de chaque os depuis sa pose T. L'épaule redevient le segment clavicule ; paume mesurée par index → auriculaire (avec le pouce, 70° d'écart dès la pose T). Le clip brut est contrôlé à chaque passage (MESURE Bridget-brut). Touche M : maillage du mannequin. Relevés : écart entre poses T faible (épaule 1,3 %, cuisse 1,3 %, main 3 %, paume 2,4 %) sauf avant-bras 8,2 %, pied 9,4 %, clavicule 19 %, pelvis 60 % ; clip brut hors seuil (avant-bras 24 à 27 %, main 25 %, pied 12 %, tibia 7,7 %, haut du dos et cou 13 % en Idle) ; corrigé 0,01 %. La main reste tournée de 177° : non validé. LPPairSandbox.h (bShowMannequin) est hors instantané PoseT les comparaisons mélangeaient pose, morphologie et définition des os .\Tools\Restore.ps1 -Lot PoseT
CHG-197 2026-10-06 PoseMeasure LPPoseMeasure : l'épaule n'est plus mesurée par la clavicule étalonnée, mais par la direction base du cou → articulation de l'épaule (neck_01→upperarm / neckLower→ShldrBend), visée en tournant la clavicule (point de la sphère du mobile sur la demi-droite visée). Champs Mover et Label (lShoulder, rShoulder) ajoutés à FLink. Modèles metric links2. Rotation des clavicules : 24 à 26° (4° avant), bras 17 à 24° ; contrôle 0,29 % au pire, round 854, seuil atteint contrôle visuel (R) : en brut les épaules sont rejetées en arrière et les bras traversent le corps ; l'étalonnage au repos recopiait l'erreur du retargeting (repos mannequin en T, Genesis en A) .\Tools\Restore.ps1 -Lot PoseShoulder
CHG-196 2026-10-06 PoseMeasure Touche R du mode Mesure : Bridget brute (clip B_ au même instant, sans correction) ou corrigée, au même cadrage, sans lancer de passage (FLPOrchestratorRound.BridgetRaw). Le contrôle porte sur la pose affichée. Les passages automatiques repassent en vue corrigée. Corrections relevées dans les modèles : clavicules ~4°, bras ~5°, avant-bras ~48°, mains 106 à 117° l'utilisateur voit un défaut d'épaule ; il faut savoir s'il vient du clip converti ou de la correction avant d'agir .\Tools\Restore.ps1 -Lot PoseRaw
CHG-195 2026-10-06 PoseMeasure Caméra libre du mode Mesure (LPPairSandbox) : touche 0, départ au cadrage de la caméra fixe en cours, ZQSD/WASD, E/Espace et C/Ctrl pour monter et descendre, Maj ×3, clic droit + souris pour orienter ; 1 à 9 reviennent aux caméras fixes. Elle survit aux passages automatiques (vue nommée « Libre » dans les captures) et est détruite à la sortie du mode. Aide ajoutée au panneau. Démarrage vérifié (round 840, seuil atteint) ; déplacement non testé contrôle visuel par l'utilisateur .\Tools\Restore.ps1 -Lot PoseFreeCam
CHG-194 2026-10-06 PoseMeasure LPPoseMeasure : score, correction et contrôle sur la même table Links (19 segments : colonne, cou, pieds, mains, clavicules), au lieu des 10 segments visés. Pelvis et clavicules étalonnés sur la pose de repos (FLPPose.Rest) : la rotation de l'os depuis son repos porte la direction de repos du mannequin. Écarts au repos relevés (ETALON) : pelvis 60 %, clavicules 19,1 % (= l'écart mesuré en jeu, donc différence de définition), bras 24 à 27 % (pose A contre T, non étalonnés). Modèles metric links1, colonne links, anciens modèles et best_Face.png retirés. Résultat (rounds 829 à 832) : contrôle 0,29 % au pire (lFoot), aucun os au-dessus de 1 %, boucle arrêtée sur « seuil atteint ». Le contrôle n'est plus indépendant de la correction : l'image shots/ sert de vérification. Le texte du panneau (LPPairSandbox.cpp) a aussi changé, hors instantané PoseLinks le contrôle signalait pelvis 50 % et clavicules 19 % alors que le score de l'orchestrateur valait 0 .\Tools\Restore.ps1 -Lot PoseLinks
CHG-193 2026-10-06 PoseMeasure Boucle automatique du mode Mesure (LPPairSandbox, LPPoseOrchestrator) : démarre à l'entrée du mode, un passage toutes les 2 s, capture sans interface 0,6 s après chaque passage (Saved/Measurement/shots/round_NNNN_<vue>.png), référence best_<vue>.png à la première capture ou quand le modèle est remplacé. Arrêt au seuil, sur plateau (5 passages identiques) ou après 200 passages ; bouton Auto / Arrêter ; journal AUTO. FLPOrchestratorRound.bKept ajouté. Vérifié : rounds 804 à 828, arrêt sur plateau, images nettes l'utilisateur n'apporte rien en lançant chaque passage .\Tools\Restore.ps1 -Lot PoseAuto
CHG-192 2026-10-06 PoseMeasure Sandbox Mesure : la sphère de la caméra active n'est plus dessinée (bande jaune), figures à ±90 cm, caméras décalées de 55 cm hors du panneau ; contrôle indépendant LPPoseMeasure::Compare sur Bridget après chaque clip (ligne controle du panneau, MESURE os au journal). Premier relevé : pelvis 49,5 % / 51,7 %, lCollar et rCollar 19,1 %, abdomenLower 9 à 11 % Bridget était sous le panneau ; le score de l'orchestrateur vaut 0 par construction .\Tools\Restore.ps1 -Lot PoseView
CHG-191 2026-10-06 PoseMeasure LPPoseMeasure.cpp : score et visée en direction des segments (angle en % de 180°, repère du corps), plus en positions mises à l'échelle. Modèles marqués metric direction1, colonne metric = direction ; anciens best_*.txt retirés (copies dans l'instantané). Manches 697 à 712 : 10,76 → 0 (Idle_Loop) et 6,13 → 0 (A_TPose) dès la première manche, puis 0 stable. Ce zéro est attendu par construction (le score mesure ce que la visée règle). Contrôle caméra (positions, calque) : pire vue 20,5 % (rFoot) contre 16,5 % avant. Validation visuelle en attente le score en positions butait sur les proportions (tronc 7,6 %, jambes 8 %) .\Tools\Restore.ps1 -Lot PoseMeasure3
CHG-190 2026-10-06 PoseMeasure LPPoseOrchestrator.cpp : rotation locale = Parent⁻¹ * Monde (LocalRot l. 138, ApplyDeltas l. 166), au lieu de Monde * Parent⁻¹. Les best_*.txt calculés avec l'ancien ordre sont retirés (copies dans l'instantané). Deux passes (manches 675 à 696) : chaque « avant » égale l'« après » retenu au tour précédent et le score enregistré (Idle_Loop 6,8047, A_TPose 7,9827). Plateau dès la manche 680 : tronc 7,7 %, jambes 8,2 %, bras 2,5 % (Idle_Loop) la boucle restait bloquée (passes identiques, kept=0) : le modèle relu donnait 11,66 % au lieu des 6,85 % enregistrés .\Tools\Restore.ps1 -Lot PoseMeasure2
CHG-189 2026-10-05 PoseMeasure LPPoseMeasure, LPPoseOrchestrator, panneau Mesure : score pondéré (tronc 50 %, jambes 30 %, bras 20 %) et la liste de chaque os. Le tronc est verrouillé avant les membres. Un passage qui améliore un genou mais empire le tronc ne remplace pas le modèle. Les anciens best_*.txt sans metric weighted3 ne sont plus rechargés un seul os (le genou) donnait l'impression que la pose était corrigée retirer FLPPoseScore et revenir au libellé du pire os
CHG-188 2026-10-05 PoseMeasure Orchestrateur : 8 échantillons sur la durée, synchro sur le calque du mannequin, archive Saved/Measurement/history.csv et round_XXXX_*.csv. Le calque jaune est le squelette du mannequin posé sur le bassin. Round 1 : Bridget et Michael restent à 60 % (os pelvis), avant = après comparer les écarts d’un passage à l’autre, et sur toute la durée du clip .\Tools\Restore.ps1 -Lot PoseMeasure
CHG-187 2026-10-05 PoseMeasure Chambre measurement dans la sandbox (menu Mesure, LifePlay_measure_sandbox.bat). Neuf caméras autour des trois corps, squelettes dessinés, écart de chaque vue en pourcentage de la taille. Pire vue mesurée : Droite 14,5 % (pied gauche de Michael) une seule vue de face ne voyait pas le bras derrière le dos .\Tools\Restore.ps1 -Lot PoseMeasure
CHG-186 2026-10-05 AnimToGenesis Pose pole : demi-tour des épaules seulement (lShldrBend, rShldrBend). L'avant-bras et la main gardent l'alignement de ~10°. Idle mesuré : Bridget 2,1 / 6,4 cm devant le buste, Michael −0,8 / 4,0 (mannequin −1,4 / 3,5). 43 clips B_ et 43 M_ la main passait derrière le dos ; un demi-tour de l'avant-bras ne déplace pas le poignet retirer le mode pole dans Tools/RetargetQuaternius.py
CHG-185 2026-10-05 AnimToGenesis LPAnimRedirect lit Saved/Config/Windows/LPAnimTarget.ini. BuildMod.ps1 -Target sandbox -Open ouvre la sandbox ; -Target game -Open ouvre la partie (carte par défaut, sans forcer la sandbox). game fait jouer B_Walk_Loop / M_Walk_Loop par la marche du jeu. sandbox laisse cette marche au Blueprint. La sandbox ne subit pas la marche du jeu choisir la cible des clips convertis sans les déplacer .\Tools\Restore.ps1 -Lot AnimToGenesis
CHG-184 2026-10-05 AnimToGenesis BuildMod.ps1 -Retarget bake lance RetargetQuaternius.py dans UnrealEditor avant la cuisson : les clips Quaternius sont recopiés sur Bridget et Michael. -Retarget rigs ne refait que les rigs. -RetargetOnly ne cuit pas. Sans -Retarget, un mod se cuit comme avant. Les copies effacées sont seulement B_ / M_ des clips source la conversion vers les deux corps du jeu fait partie du build de mod .\Tools\Restore.ps1 -Lot AnimToGenesis
CHG-183 2026-10-05 Sandbox Pose Genesis : épaule 43,5°, clavicule 2,5°, cuisse 6°, sens mesuré vers le T l'alignement par le maillage mettait ~40° sur la clavicule et ~11° sur l'épaule retirer apply_daz_adjustments
CHG-182 2026-10-05 Sandbox Cou et tête Genesis exclus de l'alignement par le maillage le centre du crâne basculait la tête en arrière réinclure la chaîne Neck dans auto_align_bones
CHG-181 2026-10-05 Sandbox Pose de retarget Genesis 8 alignée par le maillage (MeshToMesh), pas par la chaîne ChainToChain ignore un os isolé, donc l'avant-bras et la main restaient en pose A revenir à auto_align_all_bones
CHG-180 2026-10-05 Sandbox Recopie Genesis 8 : une chaîne par segment, jamais à travers un os Twist (col+épaule, avant-bras, main, cuisse, tibia, pied) la chaîne clavicule→main faisait passer la rotation de l'avant-bras dans l'os de torsion revenir aux chaînes LeftArm / LeftLeg de CHG-179
CHG-179 2026-10-05 Sandbox Recopie Bridget/Michael : os de torsion ignorés, pose cible alignée sur le T du mannequin, rotation un pour un, pas de translation les bras Daz se repliaient dans le bassin ; le mannequin, lui, était correct relancer l'ancienne copie sans auto_align_all_bones
CHG-178 2026-10-05 Sandbox En Interaction, MC et PNJ jouent le même clip Quaternius. Bridget et Michael reçoivent la copie retargetée (B_ / M_) seul le mannequin jouait ces clips retirer Tools/RetargetQuaternius.py, Content/Quaternius/Retarget et les clips B_ / M_
CHG-177 2026-10-05 Sandbox Menu toujours visible : MC et PNJ choisissent Mannequin, Bridget ou Michael. Le mannequin joue les clips Quaternius ; Bridget et Michael gardent l'idle Daz ou la paire _F / _M le mode Interaction forçait le mannequin sur le MC retirer SelectBody et les listes MC / PNJ
CHG-176 2026-10-05 Sandbox Mode Interaction : le MC devient le mannequin Quaternius (Content/Quaternius/UAL, CC0, sans root motion). Le menu Marche liste ses 43 clips. Une touche de direction joue le clip choisi, l'arrêt revient à Idle_Loop. Pair garde Bridget les cycles Daz ne pliaient que le pied retirer Content/Quaternius, LoadQuaternius et UseBody
CHG-175 2026-10-05 Sandbox La touche reste collée à la tête du PNJ, du côté de la caméra, et reste dans l'image la lettre E flottait au milieu de la pièce remettre le décalage de 42 cm
CHG-174 2026-10-05 Sandbox À moins de 1,5 m, la touche Interact lue dans Saved/Config/Windows/LPKeyboard.ini s'affiche à côté du PNJ. Cette touche ouvre la liste la lettre était fixe sur E retirer la pastille et relire E
CHG-173 2026-10-05 Sandbox La marche ne joue qu'avec une touche de direction, le repos revient à l'arrêt. En vue Yeux, 5 s sans marche repasse en vue Interaction ; reprendre la marche rend la vue Yeux le cycle tournait aussi à l'arrêt retirer le minuteur et rejouer le cycle en continu
CHG-172 2026-10-05 Sandbox Le menu Interaction est un panneau opaque, sans texte moteur par-dessus. WHO1 et WHO2 ont une race (Human, Elf, Orc, Vampire) et des cases : temporaire, créature, mariage, relation, collègue, employé, parent, fréquentation, compagnon les listes étaient couvertes, et le filtre WHO ignorait race et relation retirer les cases et le panneau
CHG-171 2026-10-05 Sandbox Mode Interaction : menu Marche (Repos, walk_F, walk_M, HighHeelsWalk, HighHeels) joué sur Bridget. Les .lpaction de vin_Base sont filtrés par WHO1, WHO2, WHERE et WHEN. E, près du PNJ, affiche cette liste essayer les cycles de marche et voir quelles actions restent pour Bridget et Michael retirer les menus et CollectActions
CHG-170 2026-10-05 Sandbox Vue Dessus : bras 2 m, pitch −80°, champ 95°. L'ancienne distance de 8 m passait au-dessus du plafond, vers 4 m la vue de dessus montrait l'extérieur de la chambre remettre le bras à 8 m
CHG-169 2026-10-05 Sandbox La chambre work___vin01 sert aux deux essais. Menu en haut à gauche : Pair (collision, animations) ou Interaction (marche, vues, E ne charge que chat.lpaction). Les deux .bat ouvrent cette chambre la vue Interaction séparée restait vide retirer le menu de mode et BeginInteraction
CHG-168 2026-10-05 Sandbox LPInteractionSandbox et Tools/debug/LifePlay_interaction_sandbox.bat : MC (Bridget, idle Daz) et un PNJ (Michael), sol, trois vues (1 Interaction, 2 Dessus, 3 Yeux, C enchaine). E à moins de 150 cm n'ouvre que chat.lpaction. Le cycle walk_F et la caméra suiveuse ne sont plus appliqués dans la partie : le clip ne pliait que le pied et la vue ne suivait pas garder la partie intacte pendant l'essai des mouvements et des caméras supprimer les deux fichiers, le .bat, et rappeler WalkAnim / FollowCamera
CHG-167 2026-10-05 Proximité Marche : walk_F ou walk_M selon IsMale, rythme selon la vitesse, l'animation d'origine revient à l'arrêt. Caméra troisième personne derrière le personnage (bras 3,4 m, pitch entre −55° et −12°) tant que la vue active est Birdview ; C rend la main au jeu le MC glissait sans cycle, et la vue de dessus ne le suivait pas retirer FollowCamera, WalkAnim et RestoreAnim
CHG-166 2026-10-05 Proximité La liste E reste cachée tant que E n'est pas pressé ; un second E ou un clic lance la ligne. Les boutons ne prennent pas le clavier. PlayerCharacter n'est pas possédé : bRunPhysicsWithNoController pour que AddMovementInput le déplace. Les touches digitales sont lues avec IsPressed en ville la liste s'ouvrait seule et le MC ne bougeait pas : aucune ligne Marche dans le journal de 13:07, le mouvement sans contrôleur est ignoré retirer bPromptOpen et bRunPhysicsWithNoController
CHG-165 2026-10-05 Clavier Les touches sont dans Saved/Config/Windows/LPKeyboard.ini. Input.ini est le cache généré du moteur : à la sortie il l'efface quand le texte à écrire est vide partie 12:44 : 55 actions écrites dans Input.ini, fichier absent après la fermeture de 12:58 revenir au chemin Input.ini de CHG-164
CHG-164 2026-10-05 Clavier LPKeyboardSubsystem écrit et relit Saved/Config/Windows/Input.ini (+ActionMappings / +AxisMappings). Le fichier est créé au lancement. SaveKeyMappings ne l'écrit pas : UInputSettings est defaultconfig le jeu packagé n'avait pas de Input.ini, donc les touches n'étaient pas restaurées retirer LoadSaved / SaveSaved et revenir à SaveKeyMappings
CHG-163 2026-10-05 Réglages Curseurs couleur et page Keyboard : même police à contour que les réglages existants, curseur copié sur SettingSlider. Couleur relue et écrite dans Saved/Config/Windows/LPColorGrade.ini. Les touches restent dans Saved/Config/Windows/Input.ini les derniers réglages et le clavier n'avaient pas le style du menu, et la relecture devait être explicite retirer le style partagé et revenir à GConfig pour la couleur
CHG-162 2026-10-05 Réglages Page Keyboard : sections Movement, Camera, Interaction, Menus, Favorites, Time, World, Save, Scene, Other. Le texte d'aide passe à la ligne la liste alphabétique mélangeait favoris, déplacement et menus retirer GroupFor et le tri par section dans LPKeyboardSubsystem.cppzzzzzzzzzzzzzzzzzzzzzzzzzzz
CHG-161 2026-10-05 Réglages LPColorGradeSubsystem : dans Video, Brightness (compensation d'exposition), Saturation, Contrast, White Balance et Tint. Volume de post-traitement non borné, valeurs neutres du moteur au départ. Fichier Saved/Config/Windows/LPColorGrade.ini l'image trop blanche se règle par l'exposition et le Color Grading d'Unreal, pas par un nouveau pipeline couleur retirer LPColorGradeSubsystem.h/.cpp et le cas LPColor dans CategoryOf
CHG-160 2026-10-05 Réglages Onglets à la largeur du nom, ordre General, Audio, Video, Keyboard, Lewd, Misc. Page clavier en anglais. Volume - Sex affiché Volume - Dialogue, Volume - Sex Moans affiché Volume - SFX les onglets se chevauchaient, le clavier était en français, et les deux volumes gardaient l'ancien libellé retirer le renommage et les libellés anglais dans LPSettingsSubsystem.cpp et LPKeyboardSubsystem.cpp
CHG-159 2026-10-05 Réglages LPSettingsSubsystem : entrée LPSettingsTitleButton sur l'écran titre, juste après ModManagerTitleButton (donc avant Donate). Le SettingsButton d'origine reste masqué par ColapsedForTitleScreen ; le clic de la nouvelle entrée rejoue son OnClicked. La liste est reconstruite : InsertChildAt laissait le bouton en dernier dans la boîte affichée, sous Exit, et le contenu centré le décalait vers la droite Settings absent du menu principal, puis affiché sous Exit retirer l'entrée titre dans PlaceSettingsButton
CHG-157 2026-10-05 Proximité LPDirectControlSubsystem : marche ZQSD et WASD sur MoveForward / MoveRight (les flèches gardent la vue de dessus), journal seulement sur J, action Interact sur E. Index des .lpaction dont WHERE contient interaction, et des .lpnear (MESH / PROMPT / ACTION). L'invite Slate suit la personne ou le meuble le plus proche (150 cm) ; E appelle TakeModActionWithBuilding avec l'ActionDetail déjà chargé. Content/Modules/vin_Base/Proximity/furniture.lpnear déplacer le personnage et lancer une action de module sans modifier les Blueprints retirer LPDirectControlSubsystem.h/.cpp, furniture.lpnear, et les lignes MoveForward, MoveRight, Interact de DefaultInput.ini ; remettre Journal sur Q et WASD sur LeftRight / DownUp