LifePlay-Revival/Docs/Migration/etat/OB/OBA/OBA-T23-CODE-CART.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

34 KiB

Fiche OBA-T23-CODE — Niveau N3 — Modèle prévu modèle de l'agent lp-cart (non précisé par la fiche) | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-cart — Skills sk-protocol, lp-ue-compat (préchargés aussi : ue-cpp-build, lp-commandlets, lp-paths)

OBA-T23-CODE-CART : dépendances Build.cs, API dépréciées 5.8 et correctifs UE4 des modules C++ du jeu (2026-10-09)

1. Objet et périmètre

  • Domaine : le code C++ des deux modules du jeu, LifePlay (Runtime) et LifePlayEditorTools (Editor), dans la copie D:\Game\LifePlay-master 5.8 (branche ue5.8, HEAD 657ce7f, git status --porcelain : 0 ligne, en lecture seule). Moteur : D:\Game\Launcher\Engine\UE_5.8\Engine (sources présentes : en-têtes et Programs/UnrealBuildTool lus). Plugins présents : Plugins/LPAnimCore, Plugins/StreetMap (Glob) ; addon D:\Game\LifePlay-Sandbox-5.8\Plugins\LPSandbox (Glob).
  • Trois questions : (a) les 30 dépendances Build.cs de OBA-T1-modules.csv, utilisée ou non, avec preuve ; (b) les API dépréciées en 5.8 que touche ce code ; (c) les correctifs UE4 LPStringCompat, LPMeshCompat et LPNavigationHelpers : leur rôle, leurs appelants, l'équivalent natif en 5.8, l'effort (lien U9).
  • Hors périmètre : les plugins LPAnimCore, ModdingExtra, StreetMap (seulement cités comme dépendances), les voisins LPDataCompat et LPVictoryCompat, les Blueprints (pas d'éditeur ni de commandlet : interdit, fiche § 6). Aucun build, aucun UE lancé, aucun fichier modifié hors de ce livrable.

2. Commandes et lectures (exactes) avec compte brut

# Commande ou lecture Compte brut
C1 Read Source/LifePlay/LifePlay.Build.cs, Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs, OBA-T1-modules.csv, OBA-T1-INV.md 16 + 14 = 30 dépendances (CSV : 30 lignes de données)
C2 Grep ^\s*#include (content) sur Source\LifePlay, puis sur Source\LifePlayEditorTools ; Grep count sur Source 429 lignes + 211 lignes ; count : 640 occurrences dans 88 fichiers
C3 Glob sur UE_5.8\Engine\Source\Runtime : 25 en-têtes inclus par le jeu (InputCoreTypes.h, IAssetRegistry.h, GeneralProjectSettings.h, …) 25 trouvés sur 25 cherchés
C4 Glob sur UE_5.8\Engine\Source : 29 en-têtes éditeur (EdGraphSchema_K2.h, K2Node_*.h, KismetEditorUtilities.h, WidgetBlueprint.h, Commandlet.h, MeshDescription.h, Json…, KismetCompiler.h, KismetCompilerModule.h) 29 trouvés
C5 Glob Plugins/{LPAnimCore/…/LPAnimRedirect.h, LPCoupleSim.h, StreetMapRuntime/…/StreetMap.h} (copie 5.8) 3 trouvés + LPAnimCore.Build.cs
C6 Grep KismetCompiler|FKismetCompilerContext|IKismetCompilerInterface|FKismetCompilerOptions|FCompilerResultsLog|KismetCompilerModule sur Source 1 (LifePlayEditorTools.Build.cs:29)
C7 Grep public UK2Node|FKismetCompilerContext|FNodeHandlingFunctor|FBPTerminal|FKismetCompilerUtilities sur Source (count) 0
C8 Grep "KismetCompiler" dans {BlueprintGraph,UMGEditor,UnrealEd,Kismet}/*.Build.cs du moteur ; Grep ModuleNames|KismetCompiler dans UnrealEd.Build.cs ; Read BlueprintGraph.Build.cs 7 lignes ; UnrealEd : PublicIncludePathModuleNames à la l. 323, "KismetCompiler" à la l. 330
C9 Grep #include .*(Kismet|Compiler) sur les en-têtes BlueprintGraph / UMGEditor / UnrealEd inclus par le jeu ; Glob **/KismetCompilerMisc.h 38 lignes ; 1 fichier (Editor/KismetCompiler/Public/KismetCompilerMisc.h)
C10 Read Programs/UnrealBuildTool/Configuration/UEBuildModule.cs:592-669 propagation des PublicIncludePathModules
C11 Grep combiné de symboles (IPluginManager::Get, RHIGetTextureMemoryStats, GetDefault<UGeneralProjectSettings>, FKey, …) -o sur Source\LifePlay\*.cpp ; Grep idem éditeur (FMeshDescription, FJsonObject, UStreetMap, FWidgetBlueprintEditorUtils::, FKismetEditorUtilities::, …) 99 lignes (LifePlay) ; 33 lignes (éditeur)
C12 Grep LoadModule\w*(<\w+>)?\( sur Source 13 lignes
C13 Grep UE_VERSION_OLDER_THAN|UE_VERSION_NEWER_THAN|ENGINE_MINOR_VERSION|ENGINE_MAJOR_VERSION|ENGINE_PATCH_VERSION|PRAGMA_DISABLE_DEPRECATION|UE_DEPRECATED sur Source 2 occurrences, 2 fichiers
C14 Grep count warning C4996 sur Saved\Logs\portage (copie 5.8) 5, toutes dans STM_Build_20261009-144519.log
C15 Read etat\ST\STM\STM_Build_20261009-144519.txt, etat\U58\U8\U8_Build_20261009-175553.txt, …-181732.txt, etat\U58\U4\U4_Build_20261008-181959.txt ; Grep C4996|LPDumpAssetsCommandlet|Unites compilees|code de sortie sur etat\*_Build_*.txt ; Glob *Build*.log sur Saved\Logs\portage 22 journaux de build 5.8 ; C4996 du code du jeu : 0
C16 Glob U58/U3/*Build* sur D:\Game\LifePlay-master 5.5\Docs\Migration\etat ; Read U3-T2_Build_20261008-165632.txt (journal UBT complet, 109 lignes) 1 fichier ; 1 C4996 dans le code du jeu
C17 Grep Compile \[x64\] (LP\w+Commandlet|LPAssetListUtils|LifePlayEditorTools)\.cpp sur Saved\Logs\portage 10 lignes
C18 Read LPStringCompat.h/.cpp, LPMeshCompat.h/.cpp, LPNavigationHelpers.h/.cpp, LifePlayEditorTools.cpp, LPDumpAssetsCommandlet.cpp:106-119 —
C19 Grep ULPStringCompat::|ULPMeshCompat::|ULPNavigationHelpers::|LPStringCompat\.h|LPMeshCompat\.h|LPNavigationHelpers\.h sur {Source,Plugins}/**/*.{h,cpp} (copie 5.8) ; même famille de motifs sur D:\Game\LifePlay-Sandbox-5.8\Plugins 28 lignes (appels C++ : 8) ; addon : 0
C20 Grep moteur 5.8 : K2_GetRandom… dans NavigationSystem.h ; GetSkinnedAsset()|GetSkeletalMesh_DEPRECATED|GetSkeletalMeshAsset() dans SkinnedMeshComponent.h / SkeletalMeshComponent.h ; ::ParseIntoArray(…) dans Core/Private/Containers ; Read UObjectHash.h:186-199 ; Grep DEPRECATED|GetAssetsByClass\( dans IAssetRegistry.h 3 ; 12 ; 1 (String.cpp.inl:1356) ; — ; 4
C21 Grep 3120 sur le skill lp-validate ; Read etat\OUT1\OUT1_LPTestStringCompat_20261009-161745.txt 3 lignes ; 95 lignes
C22 Grep des noms des correctifs sur Docs (count) ; Grep sur etat\U58\UA\UA-JEU.md et 05_Correctifs_Isoles.md ; Read 05_Correctifs_Isoles.md:50-53, 27_Plan_Migration_UE58.md:368-377 ; Grep O3|O5|U9 sur 30_Projet_Audit_Obsolescence.md 430 occurrences, 41 fichiers ; lignes citées en § 3
C23 WebSearch (3 requêtes, standard) : nœud de navigation pur ou impur, ParseIntoArray et ParseTokens, GetSkinnedAsset et GetSkeletalMesh sources en fin de § 3.4
C24 git log --oneline -1 ; git status --porcelain | wc -l (copie 5.8) 657ce7f ; 0

3. Constats fichier:ligne

3.1 Les 30 dépendances Build.cs

Abréviations : LP.B = Source/LifePlay/LifePlay.Build.cs ; ET.B = Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs ; R/ = UE_5.8/Engine/Source/Runtime/, E/ = UE_5.8/Engine/Source/Editor/. Les chemins d'en-têtes moteur viennent de C3, C4 et C5.

# Module Dépendance (ligne) Type Verdict Preuve par inclusion (jeu → en-tête 5.8) Preuve par symbole
1 LifePlay Core (LP.B:17) Public utilisé LifePlay.h:5 CoreMinimal.h → R/Core/Public/CoreMinimal.h ; LPHairstyleSubsystem.h:40 → R/Core/Public/Containers/Ticker.h LPStringCompat.cpp:13 FCString::Strstr
2 LifePlay CoreUObject (LP.B:17) Public utilisé LPDataCompat.cpp:10 → R/CoreUObject/Public/UObject/UnrealType.h ; LPAssetRegistryHelpers.h:15 → R/CoreUObject/Public/AssetRegistry/AssetData.h UCLASS et UHT de tous les .h
3 LifePlay Engine (LP.B:17) Public utilisé LPStringCompat.h:29 → R/Engine/Classes/Kismet/BlueprintFunctionLibrary.h LPStringCompat.h:33 : public UBlueprintFunctionLibrary
4 LifePlay InputCore (LP.B:17) Public utilisé LPKeyboardSubsystem.h:14 → R/InputCore/Classes/InputCoreTypes.h LPKeyboardSubsystem.cpp:60, 75, 200 FKey
5 LifePlay AssetRegistry (LP.B:17) Public utilisé LPHairstyleSubsystem.cpp:5, LPModGuard.cpp:11, LPAssetRegistryHelpers.cpp:7 → R/AssetRegistry/Public/AssetRegistry/IAssetRegistry.h ; LPModDailies.cpp:6, LPAssetRegistryHelpers.cpp:6 → …/AssetRegistryModule.h LPModGuard.cpp:194, 452 IAssetRegistry::Get ; LPHairstyleSubsystem.cpp:533, 617 ; LPModDailies.cpp:50 ; LPAssetRegistryHelpers.cpp:13, 63
6 LifePlay NavigationSystem (LP.B:28) Public utilisé (et requis par UHT) LPNavigationHelpers.cpp:5 → R/NavigationSystem/Public/NavigationSystem.h LPNavigationHelpers.cpp:16 UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius ; types ANavigationData, UNavigationQueryFilter dans la signature UFUNCTION (LPNavigationHelpers.h:46-47)
7 LifePlay LPAnimCore (LP.B:45) Public utilisé LPShowCoupleSubsystem.h:10 → Plugins/LPAnimCore/Source/LPAnimCore/LPCoupleSim.h ; LPDirectControlSubsystem.cpp:10 → …/LPAnimRedirect.h LPDirectControlSubsystem.cpp:880 LPAnimRedirect::IsGameTarget, :960 LPAnimRedirect::ClipPath ; LPShowCoupleSubsystem.h:53-54
8 LifePlay ImageWrapper (LP.B:20) Private utilisé LPVictoryCompat.cpp:7-8 → R/ImageWrapper/Public/IImageWrapper.h, IImageWrapperModule.h LPVictoryCompat.cpp:34 LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"))
9 LifePlay ApplicationCore (LP.B:20) Private utilisé LPVictoryCompat.cpp:6 → R/ApplicationCore/Public/HAL/PlatformApplicationMisc.h LPVictoryCompat.cpp:79 FPlatformApplicationMisc::ClipboardCopy
10 LifePlay RHI (LP.B:23) Private utilisé LPVideoQualitySubsystem.cpp:22-24 → R/RHI/Public/DynamicRHI.h, RHI.h, RHIStats.h LPVideoQualitySubsystem.cpp:43 RHIGetTextureMemoryStats
11 LifePlay EngineSettings (LP.B:31) Private utilisé LPModInfoSubsystem.cpp:15, LPSessionLogSubsystem.cpp:6, LPVersionSubsystem.cpp:6 → R/EngineSettings/Classes/GeneralProjectSettings.h LPSessionLogSubsystem.cpp:492, LPModInfoSubsystem.cpp:124, LPVersionSubsystem.cpp:15 GetDefault<UGeneralProjectSettings>
12 LifePlay Projects (LP.B:34) Private utilisé LPModDailies.cpp:9, LPModGuard.cpp:17 → R/Projects/Public/Interfaces/IPluginManager.h LPModDailies.cpp:51, LPModGuard.cpp:247 IPluginManager::Get
13 LifePlay Slate (LP.B:38) Private utilisé LPKeyboardSubsystem.cpp:12-13, 23-26 → R/Slate/Public/Framework/Application/…, Widgets/Input/SButton.h, Widgets/Layout/… LPKeyboardSubsystem.cpp:618, 637, 649 FSlateApplication::Get ; :284 SNew(SButton)
14 LifePlay SlateCore (LP.B:38) Private utilisé LPColorGradeSubsystem.h:13 → R/SlateCore/Public/Styling/SlateTypes.h ; LPKeyboardSubsystem.h:16 → …/Widgets/SWidget.h LPSettingsSubsystem.cpp:294, 311 FCoreStyle::Get
15 LifePlay UMG (LP.B:38) Private utilisé LPDirectControlSubsystem.cpp:14 → R/UMG/Public/Blueprint/UserWidget.h ; LPMapMarkersGuardSubsystem.cpp:5 → …/Components/WidgetComponent.h ; LPSettingsSubsystem.cpp:6 → …/Components/Button.h LPSettingsSubsystem.cpp:81 UUserWidget ; LPMapMarkersGuardSubsystem.cpp:106 UWidgetComponent
16 LifePlay Chaos (LP.B:41) Private utilisé LPDebugSubsystem.cpp:9 → R/Experimental/Chaos/Public/Chaos/TriangleMeshImplicitObject.h LPDebugSubsystem.cpp:136 FTriangleMeshImplicitObject
17 LifePlayEditorTools Core (ET.B:17) Public utilisé LifePlayEditorTools.h:5-6 → CoreMinimal.h, Modules/ModuleManager.h LifePlayEditorTools.cpp:6 IMPLEMENT_MODULE
18 LifePlayEditorTools CoreUObject (ET.B:18) Public utilisé LPEditWidgetCommandlet.cpp:17-18 → R/CoreUObject/Public/UObject/Package.h, SavePackage.h LPDumpAssetsCommandlet.cpp:115 GetObjectsWithPackage (déclaré UObjectHash.h:193)
19 LifePlayEditorTools Engine (ET.B:19) Public utilisé 16 en-têtes de commandlet incluent Commandlets/Commandlet.h (ex. LPDumpAssetsCommandlet.h:14) → R/Engine/Classes/Commandlets/Commandlet.h 16 classes dérivées de UCommandlet (UHT)
20 LifePlayEditorTools LifePlay (ET.B:20) Public utilisé LPPatchDailiesCommandlet.cpp:16 LPModDailies.h ; LPTestStringCompatCommandlet.cpp:6 LPStringCompat.h ; LPTitleModManagerCommandlet.cpp:21 LPModSettingsLibrary.h LPPatchDailiesCommandlet.cpp:89, 93 ULPModDailiesLibrary ; LPTestStringCompatCommandlet.cpp:115, 135, 136, 142 ; LPTitleModManagerCommandlet.cpp:356
21 LifePlayEditorTools UnrealEd (ET.B:27) Private utilisé LPEditWidgetCommandlet.cpp:12, LPPatchDailiesCommandlet.cpp:14-15, LPSetComponentCollisionCommandlet.cpp:9, LPTitleModManagerCommandlet.cpp:24-25 → E/UnrealEd/Public/Kismet2/KismetEditorUtilities.h, BlueprintEditorUtils.h FKismetEditorUtilities::CompileBlueprint : LPSetComponentCollisionCommandlet.cpp:98, LPEditWidgetCommandlet.cpp:221, LPPatchDailiesCommandlet.cpp:214, LPTitleModManagerCommandlet.cpp:193, 275, 380, 381
22 LifePlayEditorTools BlueprintGraph (ET.B:28) Private utilisé LPCheckMeshAssignmentCommandlet.cpp:8, 10, LPDumpFunctionCommandlet.cpp:8, 10-11, LPPatchDailiesCommandlet.cpp:7, 9-13, LPEditWidgetCommandlet.cpp:10-11, LPTitleModManagerCommandlet.cpp:14-20 → E/BlueprintGraph/Classes/EdGraphSchema_K2.h, K2Node*.h par inclusion (classes UK2Node_* des en-têtes cités)
23 LifePlayEditorTools KismetCompiler (ET.B:29) Private non trouvé en direct (besoin indirect couvert par UnrealEd ; candidat au retrait, à confirmer par build) aucune inclusion d'un en-tête E/KismetCompiler/Public dans les 211 lignes #include lues (C2) ; mais les en-têtes inclus K2Node_CallFunction.h:15, K2Node_IfThenElse.h:10, K2Node_Self.h:10, K2Node_VariableGet.h:13, K2Node_VariableSet.h:13 incluent KismetCompilerMisc.h (E/KismetCompiler/Public/, C9) aucun : C6 = 1 (le Build.cs seul), C7 = 0
24 LifePlayEditorTools AssetRegistry (ET.B:30) Private utilisé LPAssetListUtils.cpp:5 (et 7 autres .cpp) → R/AssetRegistry/Public/AssetRegistry/AssetRegistryModule.h LPAssetListUtils.cpp:43 LoadModuleChecked<FAssetRegistryModule> (et 8 autres sites, C12)
25 LifePlayEditorTools StreetMapRuntime (ET.B:32) Private utilisé LPCheckStreetMapCommandlet.cpp:9 → Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMap.h LPCheckStreetMapCommandlet.cpp:53, 60, 72, 85 UStreetMap
26 LifePlayEditorTools UMG (ET.B:35) Private utilisé LPDumpWidgetTreeCommandlet.cpp:6-10, LPEditWidgetCommandlet.cpp:5-7, LPTitleModManagerCommandlet.cpp:5-11 → R/UMG/Public/Blueprint/WidgetTree.h, WidgetBlueprintLibrary.h, Components/… par inclusion
27 LifePlayEditorTools UMGEditor (ET.B:36) Private utilisé LPDumpWidgetTreeCommandlet.cpp:11, LPEditWidgetCommandlet.cpp:19, LPTitleModManagerCommandlet.cpp:29-30 → E/UMGEditor/Public/WidgetBlueprint.h, WidgetBlueprintEditorUtils.h LPTitleModManagerCommandlet.cpp:218, 221, 243, 244 FWidgetBlueprintEditorUtils::*
28 LifePlayEditorTools MeshDescription (ET.B:38) Private utilisé LPCheckMeshesCommandlet.cpp:8 → R/MeshDescription/Public/MeshDescription.h LPCheckMeshesCommandlet.cpp:60 FMeshDescription / GetMeshDescription
29 LifePlayEditorTools Json (ET.B:40) Private utilisé LPEditWidgetCommandlet.cpp:8, 15, 16 → R/Json/Public/Dom/JsonObject.h, Serialization/JsonReader.h, JsonSerializer.h LPEditWidgetCommandlet.cpp:79, 101, 152 FJsonObject
30 LifePlayEditorTools Projects (ET.B:42, CHG-260 / STM) Private utilisé LifePlayEditorTools.cpp:4 → R/Projects/Public/Interfaces/IPluginManager.h LifePlayEditorTools.cpp:13 IPluginManager::Get().FindPlugin(TEXT("HyperAIStudio"))

Bilan : 30 lignes tranchées ; 29 utilisées (LifePlay 16 sur 16, LifePlayEditorTools 13 sur 14) ; 1 non trouvée en direct : KismetCompiler.

Détail de KismetCompiler (ligne 23), au sens du piège de la fiche § 5 (module requis par un autre en-tête, sans inclusion directe) :

  • BlueprintGraph garde KismetCompiler en dépendance privée et circulaire (BlueprintGraph.Build.cs:24-27, 42-44) : il ne transmet pas ce chemin d'inclusion. Or K2Node_CallFunction.h:15 (inclus par LPCheckMeshAssignmentCommandlet.cpp:10, LPDumpFunctionCommandlet.cpp:10, LPPatchDailiesCommandlet.cpp:9, LPTitleModManagerCommandlet.cpp:15) inclut KismetCompilerMisc.h. Le chemin E/KismetCompiler/Public est donc nécessaire à la compilation.
  • UnrealEd le fournit déjà : PublicIncludePathModuleNames (UnrealEd.Build.cs:323) contient "KismetCompiler" (:330). UBT ajoute les PublicIncludePathModules de chaque dépendance privée (UEBuildModule.cs:610-612 → FindModulesInPublicCompileEnvironment, :644-647, récursion :654-664).
  • Édition de liens : aucun symbole de KismetCompiler n'est référencé dans Source (C6, C7 : pas de sous-classe de UK2Node, pas de FKismetCompilerContext). Conclusion estimée : la ligne ET.B:29 est redondante. Seul un build LifePlayEditor sans cette ligne (compilation et édition de liens) peut le confirmer (non fait ici, fiche § 6).

Autres constats sur les types de dépendance (rien n'est décidé ici) :

  • AssetRegistry est déclaré Public (LP.B:17), mais aucun en-tête de LifePlay n'inclut d'en-tête de ce module. Le seul en-tête exposé est AssetRegistry/AssetData.h (LPAssetRegistryHelpers.h:15), qui appartient à CoreUObject (R/CoreUObject/Public/AssetRegistry/AssetData.h). LifePlayEditorTools déclare déjà AssetRegistry lui-même (ET.B:30). Passage en Private possible : estimé.
  • NavigationSystem est déclaré Public (LP.B:28, le commentaire :25-27 invoque la signature du .h). Mais LPNavigationHelpers.h:21-22 ne fait que des déclarations anticipées, et aucun autre module n'inclut LPNavigationHelpers.h (C19 : inclus seulement par LPNavigationHelpers.cpp:3). Le besoin UHT (le .gen.cpp référence les UClass du moteur) reste interne à LifePlay. Passage en Private possible : estimé.
  • SlateCore est déclaré Private (LP.B:38), alors que des en-têtes de LifePlay en incluent des en-têtes (LPColorGradeSubsystem.h:13, LPVideoQualitySubsystem.h:14, LPKeyboardSubsystem.h:16). Sans effet aujourd'hui : LifePlayEditorTools n'inclut que LPModDailies.h, LPStringCompat.h et LPModSettingsLibrary.h (C2).
  • Chargements par nom, hors Build.cs : LifePlayEditorTools.cpp:16 FModuleManager::Get().LoadModule(TEXT("AutomationController")). C'est cohérent avec « DynamicallyLoadedModuleNames : 0 » (OBA-T1). Ce préchargement et la dépendance Projects (ligne 30) n'existent que pour HyperAIStudio (LifePlayEditorTools.cpp:10-14). Leur sort suit celui de ce plugin (pistes OBA-T1, Constats).

3.2 API dépréciées touchant le code du jeu

Résultat : aucune à HEAD 657ce7f. Une seule a existé en 5.8, et elle est corrigée.

  • Build complet 5.8 de référence : U3-T2_Build_20261008-165632.txt (copie 5.5, etat\U58\U3\), code 0 (:108). Il compile Module.LifePlay.cpp (:31 ; aucune exclusion adaptive pour LifePlay, :17-18) et les 18 .cpp de LifePlayEditorTools (:38-58, 18 = nombre de .cpp du dossier, Glob C1). Il contient 1 C4996 dans ces deux modules : LPDumpAssetsCommandlet.cpp(110,3) 'GetObjectsWithPackage': … boolean bIncludeNestedObjects has been deprecated - please use the EGetObjectsFlags enum instead (:43). Ses 7 autres C4996 sont dans le plugin StreetMap (:26, :68-83), hors de ces modules.
  • Correction en place : LPDumpAssetsCommandlet.cpp:111-116, garde UE_VERSION_OLDER_THAN(5, 8, 0) et surcharge enum EGetObjectsFlags::IncludeNestedObjects (5.8 : UObjectHash.h:193 ; la surcharge booléenne est marquée par UE_INCLUDENESTEDOBJECTS_BOOL_DEPRECATED en :195-199). Recompilé en U4 : U4_Build_20261008-181959.log:40, résumé .txt:14-16 (1 avertissement, un C4457 dans l'addon ; 0 C4996).
  • Recompilations suivantes, toutes sans C4996 : LPPatchDailiesCommandlet.cpp (U7_Build_20261009-022040.log:24) ; LifePlayEditorTools.cpp et Module.LifePlay.cpp (STM : .log:76, .txt:47-80) ; Module.LifePlay.cpp en cible jeu Shipping et Development (U8 : U8_Build_20261009-175553.txt:14, 18-19, U8_Build_20261009-181732.txt:14, 18-19). C14 : les 5 lignes warning C4996 des journaux 5.8 de la copie sont toutes de HyperAIStudio (STM_Build_20261009-144519.txt:15-21).
  • Grep ciblé des UE_DEPRECATED sur les fonctions moteur appelées par les correctifs et les gardes : K2_GetRandomLocationInNavigableRadius non dépréciée (NavigationSystem.h:515-516) ; GetSkinnedAsset non dépréciée (SkinnedMeshComponent.h:1222-1223) ; GetAssetsByClass(FTopLevelAssetPath, …) non dépréciée (IAssetRegistry.h:335, appelée en LPDumpFunctionCommandlet.cpp:88) ; GetObjectsWithPackage (enum) non dépréciée (UObjectHash.h:193). Les dépréciations voisines ne sont pas appelées en C++ (C19 et C20) : K2_GetRandomPointInNavigableRadius (dépréciée 5.1, toujours présente en 5.8 : NavigationSystem.h:1483-1485), GetSkeletalMesh_DEPRECATED (SkinnedMeshComponent.h:1194-1196) et la propriété SkeletalMesh (:277-278).
  • Les Blueprints ne sont pas couverts par C4996. Les deux nœuds dépréciés ci-dessus existent encore en 5.8 ; des Blueprints qui les appelleraient encore n'ont pas été recherchés ici (voir § 5, P5).

3.3 Gardes de version dans Source (C13 : 2 occurrences)

Site Garde État
LPDumpAssetsCommandlet.cpp:111 (inclusion Misc/EngineVersionComparison.h en :8) #if UE_VERSION_OLDER_THAN(5, 8, 0) … #else enum 5.8 utile tant que la copie 5.5 vit (règle de lp-ue-compat § 1)
LPDumpFunctionCommandlet.cpp:87 #if ENGINE_MAJOR_VERSION >= 5 ; la branche UE4 est en :89-90 branche UE4 morte dans les deux copies, qui sont toutes deux en 5.x
Même commande : 0 PRAGMA_DISABLE_DEPRECATION_WARNINGS, 0 UE_DEPRECATED dans Source.

3.4 Les 3 correctifs UE4 : rôle, appelants, équivalent natif 5.8, effort

Correctif Rôle (fichier:ligne) Appelants C++ (C19) Appelants Blueprint (historique, non recompté) Équivalent natif 5.8 (en-tête lu) Écart de sémantique en 5.8 Effort et risque d'un passage natif (U9)
ULPStringCompat (Source/LifePlay/LPStringCompat.h/.cpp) : ParseIntoArray, FindSubstring, Contains, Split (BlueprintPure, .h:39-52) ; FindUE4 en C++ seulement (.h:55) ParseIntoArray transcrit l'algorithme UE4 (.cpp:5-27) : chaîne vide → [] ; séparateur sensible à la casse (FCString::Strstr, .cpp:13). FindUE4 : sous-chaîne vide en mode IgnoreCase depuis le début → INDEX_NONE (.cpp:29-37) ; Contains, FindSubstring et Split passent par FindUE4 (.cpp:39-63) 8 appels : LPDataCompat.cpp:71, 87 (ParseIntoArray), :107 (Contains), :131 (Split) ; test LPTestStringCompatCommandlet.cpp:115, 135, 136, 142 CX-B08 : 114 nœuds ParseIntoArray, 17 Blueprints ; CX-B12 : 385 nœuds (Contains 160, Split 222, FindSubstring 3), 28 Blueprints (05_Correctifs_Isoles.md:49, 53) UKismetStringLibrary::ParseIntoArray / FString::ParseIntoArray : en 5.8, String.cpp.inl:1356-1370 passe par UE::String::ParseTokens avec EParseTokensOptions::IgnoreCase forcé (:1363) et sans cas particulier pour la chaîne vide. Contains / Find / Split natifs : voir colonne suivante Persiste. Find / Contains : 60 écarts moteur contre UE4 sur 3120 cas, 0 écart pour le correctif (OUT1_LPTestStringCompat_20261009-161745.txt:9-10, 22-92, mesuré en 5.8). ParseIntoArray : la recherche insensible à la casse est établie (:1363) ; « [""] pour une chaîne vide » est estimé (ParseTokens visite les jetons vides, doc Epic) et n'est pas couvert par le test (C19 : ParseIntoArray absent de LPTestStringCompatCommandlet.cpp) Élevé. Aucune option native ne redonne la sémantique UE4 : passer au natif change le découpage des données de jeu (causes historiques ERR-027 et ERR-005, 05_Correctifs_Isoles.md:49, 53). Le C++ de LPDataCompat est touché aussi (4 appels). Interrupteur U9 (27_Plan_Migration_UE58.md:372-373) : 4 fonctions, petit côté C++. Banc à étendre à ParseIntoArray. Un nettoyage des Blueprints toucherait environ 499 nœuds (historique)
ULPMeshCompat::GetSkeletalMesh (Source/LifePlay/LPMeshCompat.h:30-31, .cpp:9-19) Cast<USkeletalMesh>(Component->GetSkinnedAsset()) pour tout USkinnedMeshComponent (.cpp:18) ; None et une trace Verbose si le composant est None (.cpp:11-16). Remplace le getter Blueprint déprécié 0 CX-B10 : 56 nœuds, 8 Blueprints (05_Correctifs_Isoles.md:51) USkinnedMeshComponent::GetSkinnedAsset() BlueprintPure (SkinnedMeshComponent.h:1222-1223) suivi d'un cast vers SkeletalMesh. USkeletalMeshComponent::GetSkeletalMeshAsset() (SkeletalMeshComponent.h:374-375) ne vaut que pour USkeletalMeshComponent : rejeté (CX-B05, 05_Correctifs_Isoles.md:47, composants proxy USkinnedMeshComponent) Aucun sur la valeur : le correctif appelle déjà l'API UE5 non dépréciée. Seul écart : sur une cible None, le natif émet « Accessed None » au lieu de la trace Verbose (estimé) Moyen, risque faible. Il faut remplacer 1 nœud par 2 (GetSkinnedAsset + cast) sur environ 56 sites, par outil (modèle : LPFixSkeletalMeshGet, retiré en U2, historique git) ou à la main. Gain : une fonction C++ de moins. Un interrupteur U9 n'aurait rien à basculer
ULPNavigationHelpers::GetRandomLocationInNavigableRadius (Source/LifePlay/LPNavigationHelpers.h:37-47, .cpp:7-18) Enveloppe pure qui relaie l'appel (.cpp:16-17) vers la fonction impure du moteur, avec les noms de broches de l'ancien nœud (.h:31-36) 0 CX-B11 : 6 nœuds (Person 3, Room 2, AI 1) (05_Correctifs_Isoles.md:52) UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius existe en 5.8 mais est BlueprintCallable (impur, broches d'exécution : NavigationSystem.h:515-516) ; l'ancien nœud pur est déprécié depuis 5.1 (:1483-1485) ; K2_GetRandomReachablePointInRadius est pur (:510-511), mais sa sémantique diffère (point atteignable contre navigable, forum Epic cité) Aucun sur le calcul (simple relais). Écart d'évaluation possible : un nœud pur est réévalué pour chaque consommateur, un nœud impur une seule fois. Le tirage aléatoire peut donc différer selon le câblage (estimé, non vérifié sur les 6 graphes) Faible en volume, risque faible à moyen. 6 nœuds à recâbler à la main sur le flux d'exécution (le rebranchement automatique élaguerait les nœuds, .h:5-7). À vérifier sur chaque graphe : la réévaluation du nœud pur. Un interrupteur U9 n'a pas de sens (pur ou impur est une propriété du nœud)

Sources web (C23 ; seules les deux premières sont des pages de doc API Epic, le reste vient de forums ou du suivi des bogues ; toutes les valeurs reprises ont été relues dans les en-têtes 5.8 cités ci-dessus) :

4. Établi / estimé / incertain

Établi (lu à la source ou dans un journal rejoué ici) :

  • Les 30 dépendances ; leurs lignes dans les Build.cs ; les 29 utilisations directes (inclusion d'un en-tête du module trouvé dans le moteur 5.8 ou dans le plugin, et symbole cité).
  • Aucune inclusion ni aucun symbole de KismetCompiler dans Source (C6 = 1, le Build.cs ; C7 = 0). KismetCompilerMisc.h est inclus indirectement par 5 en-têtes de BlueprintGraph. UnrealEd expose KismetCompiler en PublicIncludePathModuleNames, et UBT le propage aux dépendances privées (UEBuildModule.cs:610-612, 638-664).
  • C4996 du code des deux modules : 1 au build complet U3-T2 (LPDumpAssetsCommandlet.cpp:110), 0 depuis la correction (:111-116) sur toutes les unités recompilées ensuite (U4, U7, STM, U8).
  • Les 2 gardes de version de Source.
  • 5.8 : K2_GetRandomLocationInNavigableRadius est impur ; l'ancien nœud pur est déprécié et toujours présent ; GetSkinnedAsset est pur et non déprécié ; FString::ParseIntoArray force IgnoreCase.
  • Find / Contains : 60 écarts du moteur 5.8 contre UE4, 0 pour le correctif.
  • Appels C++ des correctifs : 8. Appels depuis l'addon (sources C++) : 0.

Estimé :

  • KismetCompiler est retirable du Build.cs (raisonnement ci-dessus ; non compilé).
  • AssetRegistry et NavigationSystem peuvent passer en Private.
  • Les unités non recompilées depuis U3-T2 sont identiques à celles compilées alors : UBT recompile tout fichier changé, et git status est propre.
  • ParseIntoArray natif renvoie [""] pour une chaîne vide en 5.8 : déduit de ParseTokens, sans cas particulier dans String.cpp.inl:1356-1370.
  • Les comptes de nœuds Blueprint (114, 385, 56, 6) datent du réimport de chaque correctif, pas de HEAD.
  • Effort exprimé en volume de nœuds et en nature du changement, sans chiffrage en séances.

Incertain (essai qui trancherait) :

  • Retrait de KismetCompiler, et passage en Private de AssetRegistry / NavigationSystem : build LifePlayEditor Win64 Development, et LifePlay Win64 Shipping pour la cible jeu, code 0, édition de liens comprise.
  • Nombre actuel d'appelants Blueprint des 3 correctifs, et absence de nœuds dépréciés restants : LPDumpFunction -BP=* -Fn=… ou LPAuditBlueprintCalls de l'addon, plus le journal CompileAllBlueprints 5.8.
  • Effet de la réévaluation des nœuds purs sur les 6 graphes de navigation : lecture des 6 graphes (LPDumpFunction -Pins).

5. Points à confirmer (repris par la fiche suivante)

  • P1 : build LifePlayEditor sans la ligne ET.B:29 (KismetCompiler) : compilation et édition de liens en code 0. Retirer ensuite, ou garder en documentant le besoin indirect.
  • P2 : build LifePlayEditor + LifePlay Shipping avec AssetRegistry et NavigationSystem en Private.
  • P3 : recompter les appelants Blueprint actuels des 3 correctifs (ULPStringCompat::*, ULPMeshCompat::GetSkeletalMesh, ULPNavigationHelpers::GetRandomLocationInNavigableRadius) par commandlet, en copie 5.8. Base historique : 114 + 385 + 56 + 6.
  • P4 : étendre LPTestStringCompat à ParseIntoArray (chaîne vide, casse du séparateur, CullEmpty vrai ou faux), comme le prévoit le banc U9 (27_Plan_Migration_UE58.md:374).
  • P5 : contrôler dans un journal Blueprint 5.8 (CompileAllBlueprints) qu'il ne reste aucun nœud Get Skeletal Mesh ni GetRandomPointInNavigableRadius.
  • P6 : Projects et le préchargement d'AutomationController dans LifePlayEditorTools (LifePlayEditorTools.cpp:10-17) dépendent de la décision sur HyperAIStudio (OBA-T2/T3).
  • P7 : sur les 6 nœuds de navigation, relever si RandomLocation et ReturnValue alimentent plusieurs consommateurs (réévaluation du nœud pur).

6. Questions pour la SPEC ou l'utilisateur

  • Q1 : si P1 passe, retirer KismetCompiler de ET.B:29, ou le garder par prudence (besoin indirect via K2Node_*.h) ?
  • Q2 : passer AssetRegistry et NavigationSystem de Public à Private dans LP.B (P2) ? Gain faible, risque faible.
  • Q3 : supprimer la branche UE4 morte LPDumpFunctionCommandlet.cpp:89-90 (garde ENGINE_MAJOR_VERSION >= 5) ?
  • Q4 (U9, 27_Plan_Migration_UE58.md:368-377) : LPMeshCompat et LPNavigationHelpers n'ont aucun écart de valeur avec le natif 5.8 ; leur passage natif ne serait qu'un nettoyage de Blueprints (56 et 6 nœuds). LPStringCompat garde un écart mesuré en 5.8 et n'a pas d'équivalent natif. Faut-il réduire U9 à LPStringCompat (interrupteur et banc) et traiter les deux autres en simple nettoyage facultatif ?

Constats

  • Le livrable est écrit dans la copie 5.5 (D:\Game\LifePlay-master 5.5\Docs\Migration\etat\OB\OBA\), comme le dit la fiche, alors que toutes les sources lues sont celles de la copie 5.8. Même remarque qu'en OBA-T1 § 3.
  • La fiche cite STM_Build_20261009-144519.txt comme dernier build. Ce build ne recompile que LifePlayEditorTools.cpp et Module.LifePlay.cpp côté jeu (.txt:47-80) : à lui seul, il ne prouve pas l'absence de C4996 dans les 17 autres .cpp de l'éditeur. La preuve complète vient du build U3-T2, conservé dans la copie 5.5, puis de U4 pour le fichier corrigé.
  • La garde UE_VERSION_OLDER_THAN(5, 8, 0) de LPDumpAssetsCommandlet.cpp:111 devient sans objet quand la copie 5.5 cessera de compiler ce code. La forme enum existe-t-elle déjà en 5.5 ? Si oui, une forme commune sans garde serait possible (ue-cpp-build § 5). Non vérifié dans UE_5.5 (hors périmètre).