225 lines
34 KiB
Markdown
225 lines
34 KiB
Markdown
|
|
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) :
|
||
|
|
- [Epic API : K2_GetRandomPointInNavigableRadius (dépréciée)](https://dev.epicgames.com/documentation/unreal-engine/API/Runtime/NavigationSystem/UNavigationSystemV1/K2_GetRandomPoin-)
|
||
|
|
- [Epic API : USkinnedMeshComponent::GetSkeletalMesh_DEPRECATED](https://dev.epicgames.com/documentation/unreal-engine/API/Runtime/Engine/USkinnedMeshComponent/GetSkeletalMesh_DEPRECATED)
|
||
|
|
- [Epic Blueprint API : GetSkinnedAsset](https://dev.epicgames.com/documentation/unreal-engine/BlueprintAPI/Components/SkinnedMesh/GetSkinnedAsset), [GetSkeletalMeshAsset](https://dev.epicgames.com/documentation/unreal-engine/BlueprintAPI/Components/SkeletalMesh/GetSkeletalMeshAsset)
|
||
|
|
- [Epic API : UE::String::ParseTokens](https://dev.epicgames.com/documentation/unreal-engine/API/Runtime/Core/UE__String__ParseTokens), [EParseTokensOptions](https://dev.epicgames.com/documentation/unreal-engine/API/Runtime/Core/UE__String__EParseTokensOptions), [FString::ParseIntoArray](https://dev.epicgames.com/documentation/unreal-engine/API/Runtime/Core/FString/ParseIntoArray)
|
||
|
|
- [Python API 5.1 NavigationSystemV1](https://docs.unrealengine.com/5.1/en-US/PythonAPI/class/NavigationSystemV1.html) ; [forum : point navigable contre point atteignable](https://forums.unrealengine.com/t/312297) ; [UE-17138](https://issues.unrealengine.com/issue/UE-17138)
|
||
|
|
|
||
|
|
## 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).
|