LifePlay-Revival/Docs/Migration/etat/U58/U4/U4-T3-IMPL.md

115 lines
21 KiB
Markdown
Raw Normal View History

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<FStandaloneCompositeFont>(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<FStandaloneCompositeFont>(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 '<motif T1>'` 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 `<racine de l'addon>\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 `<jeu>\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.