Fiche U4-T3 — Niveau N3 — Modèle prévu opus xhigh | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat # U4-T3 — Addon en UE 5.8, rebranchement dans le jeu 5.8, 8 C4996 corrigés **Date :** 2026-10-08. **Résultat :** réussi pour les points a à f de la fiche, **non compilé** (la compilation revient à la fiche BUILD). Aucun commit, add, checkout ni tag. Aucun fichier supprimé. Aucun éditeur lancé. ## 1. Porte d'entrée - Addon 5.8 : `git -C D:/Game/LifePlay-Sandbox-5.8 rev-parse --abbrev-ref HEAD` → `ue5.8`, `--short HEAD` → `f9033a1`, `status --porcelain` vide. Établi. - Jeu 5.8 : branche `ue5.8`, HEAD `8e21f6b`, `status --porcelain` vide. Établi. ## 2. Fichiers modifiés ### 2.1 Addon `D:\Game\LifePlay-Sandbox-5.8` (branche ue5.8) — `git -C D:/Game/LifePlay-Sandbox-5.8 diff --stat` ``` Config/DefaultEngine.ini | 7 +++++- Config/LPSandbox.ini | 2 +- LPSandbox.uproject | 6 ++--- README.md | 33 +++++++++++++++------------- Source/LPSandbox.Target.cs | 4 ++-- Source/LPSandboxEditor.Target.cs | 4 ++-- Tools/BuildMod.ps1 | 4 +++- Tools/EditMod.ps1 | 4 +++- Tools/HairPipeline.ps1 | 4 +++- Tools/anim/AnimPipeline.ps1 | 4 +++- Tools/anim/DeliverAnims.ps1 | 4 +++- Tools/anim/RapportControles.py | 2 +- Tools/debug/LifePlay_interaction_sandbox.bat | 5 +++-- Tools/debug/LifePlay_measure_sandbox.bat | 5 +++-- Tools/debug/LifePlay_pair_sandbox.bat | 5 +++-- 15 files changed, 57 insertions(+), 36 deletions(-) ``` Plus la jonction `Content` (hors suivi git, § 4.4). Détail : - **A** `LPSandbox.uproject` : `EngineAssociation` `"5.8"` (l. 3), description `UE 5.8` (l. 5), `AdditionalPluginDirectories` → `../LifePlay-master 5.8/Plugins/LPAnimCore` (l. 20). - **A** `Source/LPSandbox.Target.cs`, `Source/LPSandboxEditor.Target.cs` (l. 12-13) : `BuildSettingsVersion.V7`, `EngineIncludeOrderVersion.Unreal5_8`, identiques au jeu 5.8 (`D:\Game\LifePlay-master 5.8\Source\LifePlay.Target.cs:11-12`, `LifePlayEditor.Target.cs:11-12`). Valeurs connues de UBT 5.8 : `TargetRules.cs:170` (V7), `:177` (`Latest = V7`), `:235` (Unreal5_8), `:242` (`Latest = Unreal5_8`), fichier `UE_5.8/Engine/Source/Programs/UnrealBuildTool/Configuration/Rules/TargetRules.cs`. - **A (compilateur)** `Config/DefaultEngine.ini` : le jeu 5.8 épingle MSVC dans `Config/DefaultEngine.ini:126,133` (`[/Script/WindowsTargetPlatform.WindowsTargetSettings]`, `CompilerVersion=14.50.35717`). Réglage reproduit dans l'ini équivalent de l'addon (nouvelle section en fin de fichier, 2 lignes de commentaire + `CompilerVersion=14.50.35717`). UBT le lit dans la hiérarchie Engine du projet compilé : `UnrealBuildTool/Platform/Windows/UEBuildWindows.cs:389`. Il ne sert donc que si `LPSandbox.uproject` est compilé seul ; compilé avec le jeu, c'est l'ini du jeu qui compte (estimé, même mécanisme). Rien ajouté dans les Target.cs. - **B** `Config/LPSandbox.ini:46` : `GameRoot=..\LifePlay-master 5.8` (CRLF conservé). - **B** 5 scripts `.ps1` : le chemin `UE_5.5` en dur est remplacé par 1 ligne de commentaire + `. (Join-Path $Root 'Tools\Engine.ps1')` + chemin construit depuis `$LPEngineRoot`, au niveau script, juste après `Resolve-LPRoots` (et après `ModSource.ps1` quand il était chargé avant) : - `Tools/BuildMod.ps1:53-55` : `$UE = $LPEngineRoot` (dossier Engine, comme avant) ; - `Tools/EditMod.ps1:23-25` : `$Editor = Join-Path $LPEngineRoot 'Binaries\Win64\UnrealEditor.exe'` ; - `Tools/HairPipeline.ps1:53-55` : `$UE = Join-Path $LPEngineRoot 'Binaries\Win64\UnrealEditor-Cmd.exe'` ; - `Tools/anim/AnimPipeline.ps1:47-49` et `Tools/anim/DeliverAnims.ps1:49-51` : `$Editor = Join-Path $LPEngineRoot 'Binaries\Win64\UnrealEditor-Cmd.exe'`. - **B** 3 `.bat` de `Tools/debug/` : `GAME` par défaut `..\..\..\LifePlay-master 5.8` ; ligne `UE` remplacée par la forme imposée (`if defined LP_ENGINE_ROOT (...) else (... UE_5.8 ...)`), précédée d'une ligne `rem Lot U4`. CRLF conservé. - **B** `Tools/anim/RapportControles.py:10` : `LifePlay-master 5.8` (ligne de docstring, voir § 7). - **C** `Config/DefaultEngine.ini:3` : commentaire de jonction → `../LifePlay-master 5.8/Content`. - **C** `README.md` : lignes 3, 19-20, 25, 48, 52, 56, 83, 88, 92, 101, 107, 118-121 (nouvelle puce « Moteur (lot U4) »), 127-128 ; reste du texte inchangé (voir écart E2). ### 2.2 Jeu `D:\Game\LifePlay-master 5.8` (branche ue5.8) — `git -C "D:/Game/LifePlay-master 5.8" diff --stat` ``` LifePlay.uproject | 3 ++ .../StreetMapComponentDetails.cpp | 37 ++++++++++++++++++++-- .../StreetMapRuntime/StreetMapSceneProxy.cpp | 7 ++++ .../LifePlayEditorTools/LPDumpAssetsCommandlet.cpp | 6 ++++ 4 files changed, 50 insertions(+), 3 deletions(-) ``` - `LifePlay.uproject:212-214` : `"AdditionalPluginDirectories": ["../LifePlay-Sandbox-5.8/Plugins"]`, entre la fin de `Plugins` et `TargetPlatforms`, comme `D:\Game\LifePlay-master 5.5\LifePlay.uproject:211-213`. `diff` des deux .uproject (CR retirés) : seules différences = `EngineAssociation` (l. 3), plugin désactivé l. 51 (P7, U3) et le chemin de l'addon (l. 213). CRLF et absence de saut de ligne final conservés. ## 3. Les 8 C4996 (tous sous `#if UE_VERSION_OLDER_THAN(5, 8, 0)` / `#else` / `#endif`, branche 5.5 identique au code d'origine) Garde : `Misc/EngineVersionComparison.h` ajouté dans les 3 .cpp (macro présente en 5.5 l. 18 et en 5.8 l. 24, qui inclut `Runtime/Launch/Resources/Version.h` l. 5). Garde à 5.8.0 partout : aucune des API de remplacement n'existe en 5.5.4 (sauf W3, voir), et 5.6/5.7 ne sont pas installés pour situer leur apparition. | # | Site (après édition) | Ancienne API → nouvelle | En-tête 5.8 qui le justifie | En 5.5 | Effet sémantique | |---|---|---|---|---|---| | 1-2 | `Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.cpp:53-58` et `:73-77` (ex-36, 51) | `DetailBuilder.GetDetailsView()->…` → `DetailBuilder.GetDetailsViewSharedPtr()->…` | `Editor/PropertyEditor/Public/DetailLayoutBuilder.h:74-78` (`UE_DEPRECATED(5.5, "Use GetDetailsViewSharedPtr() instead.")`, corps `return GetDetailsViewSharedPtr().Get();`), remplaçant non const l. 72 | absent : seul `GetDetailsView()` virtuel pur, `DetailLayoutBuilder.h:61,66` ; `GetDetailsViewSharedPtr` 0 occurrence (malgré l'étiquette « 5.5 ») | identique (l'ancienne fonction appelait la nouvelle) ; le `TSharedPtr` temporaire garde la vue vivante pendant l'appel | | 3-5 | `StreetMapComponentDetails.cpp:21-35` (fonction `StreetMapComponentDetailsCompat::CounterFont()`), appelée l. 183, 191, 199 (ex-157, 165, 173) | `FSlateFontInfo("Verdana", 8)` → `FSlateFontInfo(MakeShared(NAME_None, TEXT("Verdana"), EFontHinting::Default, EFontLoadingPolicy::LazyLoad), 8)` | `Runtime/SlateCore/Public/Fonts/SlateFontInfo.h:265-266` (`UE_DEPRECATED(5.6, "Use constructor with FCompositeFont instead.")`) ; constructeur FCompositeFont l. 227 ; `FStandaloneCompositeFont` `Fonts/CompositeFont.h:494-510` | constructeur FCompositeFont présent (`SlateFontInfo.h:227`), `FStandaloneCompositeFont` présent (`CompositeFont.h:496`) : la forme 5.8 compilerait aussi, garde gardée pour le critère et pour laisser 5.5 identique | **identique** : l'ancien constructeur (`SlateFontInfo.cpp:144-162`) appelait `UpgradeLegacyFontInfo` (l. 227-235) → `FLegacySlateFontInfoCache::GetCompositeFont` (`Private/Fonts/LegacySlateFontInfoCache.cpp:54-91`) qui, faute de fichier `Verdana` (absent du dossier courant, de `LifePlay-master 5.8/Content` et de `UE_5.8/Engine/Content`, vérifié), crée `MakeShared(NAME_None, "Verdana", Hinting, LazyLoad)` (l. 89). Même `FontFallback FF_Max` dans les deux constructeurs (`SlateFontInfo.cpp:60` et `:150`). Seule différence : plus de mutualisation par le cache (une police composite par appel, 3 par personnalisation du panneau) ; champs éditeur `FontName_DEPRECATED` non renseignés (lus seulement à la désérialisation d'anciens assets, `SlateFontInfo.cpp:211-217`) | | 6 | `StreetMapComponentDetails.cpp:325-330` (ex-299) | `StaticMesh->ImportVersion = LastVersion` → `StaticMesh->SetImportVersion(EImportStaticMeshVersion::LastVersion)` | `Runtime/Engine/Classes/Engine/StaticMesh.h:711-713` (`UE_DEPRECATED(5.7, "… use UStaticMesh::GetImportVersion() or UStaticMesh::SetImportVersion().")`) ; `SetImportVersion(int32)` l. 805-808, public (l. 758), même bloc `WITH_EDITORONLY_DATA` (l. 650-882) que le membre | absent (`SetImportVersion` 0 occurrence dans `StaticMesh.h` 5.5 ; membre public l. 678) | **identique** : `SetImportVersion` fait `ImportVersion = Version;` (l. 807) ; enum non scopé converti en `int32` comme avant | | 7 | `Plugins/StreetMap/Source/StreetMapRuntime/StreetMapSceneProxy.cpp:22-28` (ex-21) | `GetMaterialRelevance(GetScene().GetFeatureLevel())` → `GetMaterialRelevance(GetScene().GetShaderPlatform())` | `Runtime/Engine/Classes/Components/MeshComponent.h:127-129` (`UE_DEPRECATED(5.7, "Please use GetMaterialRelevance with EShaderPlatform argument …")`) ; `FSceneInterface::GetShaderPlatform()` `Runtime/Engine/Public/SceneInterface.h:732` ; même forme chez Epic : `Runtime/Engine/Private/StaticMeshSceneProxy.cpp:238`, `Runtime/GeometryFramework/Private/Components/BaseDynamicMeshSceneProxy.cpp:62` | absent (seule la surcharge niveau de fonctionnalité, `MeshComponent.h:98`) | **identique dans l'usage normal** : l'ancienne surcharge fait `GetMaterialRelevance(GetFeatureLevelShaderPlatform_Checked(InFeatureLevel))` (`Private/Components/MeshComponent.cpp:154-157`) = `GShaderPlatformForFeatureLevel[FeatureLevel]` lu à l'appel (`Runtime/RHI/Public/RHIGlobals.h:1015-1025`, alias l. 970) ; la scène stocke la même valeur à sa création (`Private/SceneInterface.cpp:22-26`, `Renderer/Private/RendererScene.cpp:1196-1197`) et ne la modifie plus (aucune autre affectation dans `RendererScene.cpp`). Écarts possibles : (a) si la table globale change pendant la vie d'une scène, la nouvelle forme suit la plateforme de la scène (estimé : plus juste) ; (b) l'ancienne avait un `checkf(!IsRunningCookCommandlet())` (`RHIGlobals.h:1023`), la nouvelle non | | 8 | `Source/LifePlayEditorTools/LPDumpAssetsCommandlet.cpp:111-116` (ex-110) | `GetObjectsWithPackage(Pkg, Objects, true)` → `GetObjectsWithPackage(Pkg, Objects, EGetObjectsFlags::IncludeNestedObjects)` | `Runtime/CoreUObject/Public/UObject/UObjectHash.h:193` (surcharge enum), `:195-199` (surcharge booléenne `UE_INCLUDENESTEDOBJECTS_BOOL_DEPRECATED`, `true → IncludeNestedObjects`) ; macro `UObject/FindObjectFlags.h:30` (`UE_DEPRECATED(5.8, …)`), enum l. 18-27 | absent (`EGetObjectsFlags` 0 occurrence dans `CoreUObject/Public` 5.5 ; signature booléenne `UObjectHash.h:155`) | **identique** : l'ancienne surcharge appelait la nouvelle avec ce drapeau (l. 198) | Non traité (hors des 8 de la fiche) : 9e C4996 connu, addon `Plugins/LPSandbox/Source/LPModTools/LPHairFromStaticMeshCommandlet.cpp:430` (W6, `lp-ue-compat` ruptures.md § 3) : il réapparaîtra au build U4 maintenant que l'addon est branché. ## 4. Contrôles faits 1. **JSON** (pwsh 7.6.6, `Get-Content -Raw | ConvertFrom-Json -ErrorAction Stop`) : `LPSandbox.uproject` OK (`EngineAssociation=5.8`, `AdditionalPluginDirectories=../LifePlay-master 5.8/Plugins/LPAnimCore`, 1 plugin) ; `LifePlay.uproject` 5.8 OK (`EngineAssociation=5.8`, `AdditionalPluginDirectories=../LifePlay-Sandbox-5.8/Plugins`, 27 plugins). Les deux chemins relatifs mènent à un `.uplugin` réel (`LPAnimCore.uplugin`, `LPSandbox.uplugin`, `ls`). Établi. 2. **Fins de ligne / encodage** (script Python qui compte `\r\n` et `\n`, octets > 127, BOM) : chaque fichier garde sa convention d'origine. LF pur : DefaultEngine.ini, uproject addon, Target.cs, les 5 .ps1, RapportControles.py, README.md, les 3 .cpp. CRLF pur : LPSandbox.ini (46/46), les 3 .bat (10/10, 12/12, 10/10), `LifePlay.uproject` (217/217, toujours sans saut de ligne final). Aucun BOM ajouté ; commentaires ajoutés en ASCII dans les fichiers ASCII ; README reste UTF-8 (142 → 146 octets non ASCII : « épinglé »). Établi. 3. **Syntaxe** : `[System.Management.Automation.Language.Parser]::ParseFile` sur les 5 .ps1 → 0 erreur chacun ; `ast.parse` de RapportControles.py OK. Établi. 4. **Jonction** : `cmd /c mklink /J "D:\Game\LifePlay-Sandbox-5.8\Content" "D:\Game\LifePlay-master 5.8\Content"` → « Jonction créée … », code 0 ; `Get-Item` → `LinkType Junction`, `Target D:\Game\LifePlay-master 5.8\Content` (même forme que l'addon 5.5 : `Junction` → `LifePlay-master 5.5\Content`) ; `git check-ignore -v Content` → `.gitignore:31:/Content/` ; absente de `git status`. Établi. 5. **Portée du dot-sourcing d'Engine.ps1** (script témoin `test_scope.ps1` dans le scratchpad, mêmes lignes que les scripts, rien lancé) : `Root=D:\Game\LifePlay-master 5.8` (donc `[Workshop] GameRoot` lu), `LPEngineVersion=5.8`, `$Editor`/`$UE` = `UE_5.8\…\UnrealEditor(.exe|-Cmd.exe)` existants, valeurs visibles depuis une fonction (lecture par portée dynamique, comme `Invoke-UE` ou `Invoke-AnimToGenesis`), `$PSScriptRoot` de l'appelant inchangé, `$NoCheck`/`$lpCheck` non laissés dans la portée ; avec `LP_ENGINE_ROOT=…\UE_5.5\Engine` le chemin suit la surcharge ; avec `-GameRoot 'D:\Game\LifePlay-master 5.5'` (pas d'`Engine.ps1`) arrêt immédiat, code 1, « Le terme …\Tools\Engine.ps1 n'est pas reconnu » (les 5 scripts ont `$ErrorActionPreference = 'Stop'` avant). Aucun nom de variable des scripts ne collide avec ceux d'Engine.ps1 (`grep` de `LPProjectRoot|LPProject|LPEngine*|LPBuildRoot|NoCheck|lpCheck|lpOverride` dans les 5 scripts, ModSource.ps1 et Roots.ps1 : 0). Établi. 6. **.bat** : copie de `LifePlay_pair_sandbox.bat` dans le scratchpad avec `start` remplacé par `echo` : sans `LP_ENGINE_ROOT` → `UE=D:\Game\Launcher\Engine\UE_5.8\Engine\Binaries\Win64\UnrealEditor.exe` ; avec `LP_ENGINE_ROOT='C:\Program Files (x86)\Fake Engine'` → `…\Fake Engine\Binaries\Win64\UnrealEditor.exe` (parenthèses et espaces tolérés). `GAME` depuis `Tools\debug\` = `D:\Game\LifePlay-master 5.8` par calcul de chemin (estimé, non exécuté depuis le vrai dossier). 7. **git status** (`--short`) : addon 5.8 = les 15 fichiers listés, rien d'autre ; jeu 5.8 = les 4 fichiers listés ; jeu 5.5 `D:\Game\LifePlay-master 5.5` = vide (ce livrable est sous `Docs/Migration/etat/`, ignoré : `.gitignore:74`) ; addon 5.5 `D:\Game\LifePlay-Sandbox` = vide (branche `lot/DC3-atelier`, non touché). Établi. ## 5. Recomptage des occurrences (critère § 8) - `git -C D:/Game/LifePlay-Sandbox-5.8 grep -n -E 'UE_5\.5|LifePlay-master 5\.5|Unreal5_5|"5\.5"' -- ':!Docs' ':!Tools/claude' ':!Tools/mods/*.json' ':!Tools/hairs/*.json'` → **0 ligne**. Témoin : même motif sur tout le dépôt → 31 lignes (Docs 7, Tools/claude 24, JSON 0, README 0), donc le motif fonctionne. README n'a plus aucune ligne du motif. Établi. - Occurrences A (6) et B (13) de T1 : relues par `git grep -n -I -E ''` sur les 12 fichiers A/B → toutes en 5.8 ; `git grep -n -E '5\.5|5_5'` sur ces fichiers → 1 seule ligne, `Tools/BuildMod.ps1:30` (exemple d'aide `LifePlay_Build_5.5_H3d`, classé **C** par T1, hors liste de la fiche) → **0 occurrence A/B restante**. Établi. - Le motif large de T1 compte maintenant 194 lignes (192 avant) : il attrape aussi les chaînes 5.8 (`LifePlay-master`, `UE_5`, `EngineAssociation` des nouveaux commentaires, `CompilerVersion`) ; ce n'est pas une mesure de reste. ## 6. Écarts à la fiche et à la SPEC - **E1 (W3, police)** : remplacement par le constructeur FCompositeFont avec la **même** police composite que construisait l'ancien constructeur (fichier « Verdana »), et non `FCoreStyle::GetDefaultFontStyle("Regular", 8)` proposé par `lp-ue-compat` ruptures.md § 3 (W3), qui changerait la police affichée (Roboto au lieu du repli actuel). Raison : correction de dépréciation sans changement de comportement ; l'autre choix revient à l'orchestrateur. Les 3 sites passent par une fonction unique (`StreetMapComponentDetailsCompat::CounterFont`, espace de noms nommé pour la compilation unitaire) qui porte la garde, au lieu de 3 gardes identiques. - **E2 (README)** : en plus des chemins `5.5 → 5.8`, le nom du dossier addon `LifePlay-Sandbox` → `LifePlay-Sandbox-5.8` dans la disposition (l. 20), l'exemple `AdditionalPluginDirectories` (l. 48, 52) et les commandes (l. 88, 92, 101, 107) : sinon la commande de compilation `LPSandboxEditor` (l. 101) aurait visé l'addon 5.5 avec le moteur 5.8. Ajout d'une puce « Moteur (lot U4) » (l. 119-120) et de VS 2026 / MSVC 14.50.35717 dans les prérequis. Section « Pin » (branche `main`, pin `f73e017`) **non modifiée** : à mettre à jour par le lot DOC après commit de la branche ue5.8. - **E3** : une ligne de commentaire ajoutée avant chaque modification (`# Lot U4 …` dans les .ps1, `rem Lot U4 …` dans les .bat, commentaires ASCII dans les .cpp citant les en-têtes). Non demandé, sans effet. - **E4** : include explicite `Fonts/CompositeFont.h` dans `StreetMapComponentDetails.cpp:16` (déjà inclus par `SlateFontInfo.h:8` en 5.5 et en 5.8). - Aucun autre écart. Pas d'escalade : aucune API de remplacement manquante, aucune restructuration de script nécessaire (3 lignes par script). ## 7. Signalements hors périmètre (non corrigés) - `Tools/anim/RapportControles.py` : la docstring (l. 10) annonce le dossier du jeu, mais le défaut réel du code (l. 23-24, `DOSSIER_DEFAUT`) est `\Saved\AnimPipeline\quaternius` (3 `dirname` depuis `Tools/anim/`), incohérence antérieure (depuis le déplacement DC3). - Restes catégorie C non listés par la fiche : `Tools/BuildMod.ps1:30` (exemple `LifePlay_Build_5.5_H3d`), `Config/DefaultGame.ini:3` (« clé NON supportée par UE 5.5 » : vrai aussi en 5.8, `AdditionalAssetDirectories` absent de `UE_5.8/Engine/{Source,Config,Plugins}`, recherche témoin `AdditionalPluginDirectories` positive), commentaires `LPHairFromStaticMesh*.h/.cpp:1`, `LPAuditBlueprintCallsCommandlet.cpp:673`, `Docs/Modding/Creating_Asset_Mods.md`. - `StreetMapComponentDetails.cpp:73-77` (ex-51) : `SelectedActors` est calculé mais la boucle suivante parcourt `SelectedObjects` (bogue d'origine du plugin, variable inutilisée) ; seule l'API dépréciée a été remplacée. - Avant la compilation U4 : déplacer (pas supprimer) le `Makefile.bin` du jeu 5.8 construit sans addon (`lp-build` § 8), prévu par la fiche BUILD. - Les scripts de l'addon 5.8 ne peuvent plus viser la copie 5.5 par `-GameRoot` (pas d'`Engine.ps1` dans le jeu 5.5) : arrêt explicite, voir § 4.5. ## 8. Preuves - **Établi** : contenu des diffs (`git diff`), lignes d'en-têtes 5.8 et 5.5 citées (lues par `sed`/`grep` dans `D:\Game\Launcher\Engine\UE_5.8\Engine\Source` et `UE_5.5`), JSON valides, fins de ligne, jonction, critère `git grep` = 0, A/B restantes = 0, comportement du dot-sourcing et des .bat par scripts témoins. - **Estimé** : la compilation 5.8 passe sans les 8 C4996 et la 5.5 reste inchangée (branches 5.5 identiques à l'octet près au code d'origine ; formes 5.8 vérifiées contre les signatures) ; équivalence de `GetMaterialRelevance` hors usage normal ; rendu de la police inchangé (même police composite, repli `FF_LastResortFallback` dans `SlateFontRenderer.cpp:390-403` dans les deux cas) ; `CompilerVersion` de l'addon lu seulement en compilation autonome. - **Incertain** : compilation réelle 5.8 et 5.5 (essai : fiche BUILD, `Tools\Build.ps1` 5.8 puis build 5.5 de contrôle, comparer les C4996 restants au seul W6) ; `CompilerVersion` de l'addon effectivement retenu (essai : ligne `Using Visual Studio … 14.50.35717` d'un build `LPSandboxEditor` de `LPSandbox.uproject`) ; exécution réelle des 5 scripts (essai : `AnimPipeline.ps1 -Pack quaternius -DryRun` depuis le worktree 5.8 doit afficher `UE_5.8\…\UnrealEditor-Cmd.exe`). ## 9. Résumé 1. Addon `LifePlay-Sandbox-5.8` passé en 5.8 : uproject (5.8, LPAnimCore du jeu 5.8), Target.cs V7 / Unreal5_8, MSVC 14.50.35717 épinglé comme le jeu. 2. Atelier : `GameRoot=..\LifePlay-master 5.8` ; 5 .ps1 lisent le moteur par `\Tools\Engine.ps1` (portée vérifiée) ; 3 .bat : `LP_ENGINE_ROOT` sinon UE 5.8. 3. Jonction `Content` → `LifePlay-master 5.8\Content` créée, ignorée par git. 4. Jeu 5.8 : `AdditionalPluginDirectories` `../LifePlay-Sandbox-5.8/Plugins` rétabli au même endroit qu'en 5.5. 5. 8 C4996 corrigés sous garde `UE_VERSION_OLDER_THAN(5, 8, 0)`, branche 5.5 intacte ; sémantique identique (GetMaterialRelevance : identique en usage normal). 6. Critère `git grep` hors Docs/skills/JSON = 0 ; A/B restantes = 0 ; 2 .uproject valides ; fins de ligne conservées. 7. Écarts : police W3 gardée identique (pas Roboto) ; README aussi passé au dossier `LifePlay-Sandbox-5.8`. 8. Non compilé ; W6 (addon, 9e C4996) hors fiche, attendu au build. 9. Suite : lp-builder doit déplacer `Makefile.bin` du jeu 5.8 puis lancer `Tools\Build.ps1 -Lot U4`, état : modifications en place, non commitées, dans les deux dépôts ue5.8.