LifePlay-Revival/Docs/Migration/etat/U58/U4/U4-T3-IMPL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

21 KiB

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.