# DC0-SPEC — Découplage jeu / sandbox - **Fiche** : DC0-T2 (A-ARCH) — **Modèle** : M4 opus | opus (session principale) - **Entrée** : `DC0-CART.md` (dépendances b1–b6 ; inventaire a) — **Plan** : `24_Plan_Decouplage_Sandbox.md` - **Statut** : à valider par l'utilisateur (porte DC0-T3) Conventions : `` = `D:\Game\LifePlay-master 5.5`, `` = `D:\Game\LifePlay-Sandbox`. ## 1. Plugin `LPAnimCore` (jeu) — lot DC1 ### 1.1 Emplacement et descripteur `/Plugins/LPAnimCore/LPAnimCore.uplugin` : ```json { "FileVersion": 3, "Version": 1, "VersionName": "1.0.0", "FriendlyName": "LPAnimCore", "Description": "LifePlay : redirection des clips convertis (LPAnimRedirect) et geometrie commune du couple (LPCoupleSim). Utilise par le jeu (LifePlay) et par l'addon LifePlay-Sandbox.", "Category": "LifePlay", "CreatedBy": "LifePlay", "CanContainContent": false, "Installed": false, "SupportedTargetPlatforms": [ "Win64" ], "Modules": [ { "Name": "LPAnimCore", "Type": "Runtime", "LoadingPhase": "PreDefault" } ] } ``` - `PreDefault` : chargé avant `LifePlay` (`Default`) ; la dépendance `Build.cs` suffirait, la phase rend l'ordre explicite. - Compilé dans **toutes** les configurations (Shipping compris) : pas de `TargetConfigurationDenyList`. ### 1.2 Module | Fichier | Origine | Modification | |---|---|---| | `Source/LPAnimCore/LPAnimCore.Build.cs` | nouveau | `PCHUsage = UseExplicitOrSharedPCHs` ; `PublicIncludePaths.Add(ModuleDirectory)` (structure plate, comme `LPAnimMeasure`) ; `Public` : `Core`, `CoreUObject`, `Engine` | | `Source/LPAnimCore/LPAnimCore.cpp` | nouveau | `IMPLEMENT_MODULE(FDefaultModuleImpl, LPAnimCore)` | | `Source/LPAnimCore/LPAnimRedirect.h/.cpp` | `/…/LPAnimMeasure/` | `LPANIMMEASURE_API` → `LPANIMCORE_API` ; commentaire « Defaut identique a FLPSandboxConfig » conservé | | `Source/LPAnimCore/LPCoupleSim.h`, `LPCoupleSimCore.cpp` | idem | `LPANIMMEASURE_API` → `LPANIMCORE_API` | Copie avec empreinte SHA-256 avant/après ; les seules différences admises sont les macros d'export (diff joint à `DC1-IMPL.md`). ### 1.3 Jeu - `LifePlay.uproject` → `Plugins` : ajouter `{ "Name": "LPAnimCore", "Enabled": true }` ; `LPSandbox` reste `Enabled` + `Optional` ; `AdditionalPluginDirectories` inchangé. - `Source/LifePlay/LifePlay.Build.cs:43-45` : `PublicDependencyModuleNames.Add("LPAnimMeasure")` → `PublicDependencyModuleNames.Add("LPAnimCore")` (public : `LPShowCoupleSubsystem.h` inclut `LPCoupleSim.h`) ; commentaire mis à jour (lot DC1). - `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs` : inchangé en DC1 (garde `LPAnimMeasure` jusqu'à DC2). ### 1.4 Addon - `LPSandbox.uplugin` : ajouter `"Plugins": [ { "Name": "LPAnimCore", "Enabled": true } ]` ; description mise à jour (LPAnimMeasure n'est plus consommé par le jeu). - `LPAnimMeasure` : retirer `LPAnimRedirect.*`, `LPCoupleSim.h`, `LPCoupleSimCore.cpp` ; `Build.cs` : `PrivateDependencyModuleNames.Add("LPAnimCore")` (seul `LPPoseOrchestrator.cpp` inclut `LPAnimRedirect.h`) ; en-tête de `LPAnimMeasure.h` mis à jour. - `LPSandbox.Build.cs` : `PublicDependencyModuleNames.Add("LPAnimCore")`. - `LPSandbox.uproject` (projet autonome de l'addon) : `"AdditionalPluginDirectories": [ "../LifePlay-master 5.5/Plugins/LPAnimCore" ]` (le dossier du plugin seul, pour ne pas charger `ModdingExtra`/`StreetMap`). ## 2. Module éditeur `LPModTools` (addon) — lot DC2 ### 2.1 Descripteur Dans `LPSandbox.uplugin`, module ajouté : `{ "Name": "LPModTools", "Type": "Editor", "LoadingPhase": "Default" }`. ### 2.2 Fichiers déplacés de `/Source/LifePlayEditorTools/` `LPAnimEvalCommandlet.h/.cpp`, `LPAnimTwistCommandlet.h/.cpp`, `LPAnimCatalogCommandlet.h/.cpp`, `LPAnimIdentifyCommandlet.h/.cpp`, `LPAnimChecks.h/.cpp`, `LPAnimMethodSelect.h/.cpp`, `LPHairFromStaticMeshCommandlet.h/.cpp` → `/Plugins/LPSandbox/Source/LPModTools/`. - Les `UCLASS` gardent leur nom : `-run=LPAnimEval` etc. inchangés (UE trouve le commandlet dans tout module chargé). - Macro d'export éventuelle `LIFEPLAYEDITORTOOLS_API` → `LPMODTOOLS_API` (à relever en DC2-T1). - Les inclusions orphelines relevées par l'inventaire (a) doivent être vides ; sinon, la fiche DC2-T1 tranche. ### 2.3 `LPModTools.Build.cs` `bUseUnity = false` (même raison que `LifePlayEditorTools`) ; `PublicIncludePaths.Add(ModuleDirectory)` ; `Public` : `Core`, `CoreUObject`, `Engine`, `LPAnimMeasure`, `LPAnimCore` ; `Private` : `UnrealEd`, `AssetRegistry`, `Json`, `Projects`, `MeshDescription`, `StaticMeshDescription`, `SkeletalMeshUtilitiesCommon`, `SkeletalMeshDescription`, `AnimationCore` (liste exacte vérifiée en DC2-T1 contre les inclusions des fichiers déplacés ; ne pas reprendre `LifePlay`). ### 2.4 Jeu `LifePlayEditorTools.Build.cs` : retirer `"LPAnimMeasure"` ; retirer `StaticMeshDescription`, `SkeletalMeshUtilitiesCommon`, `SkeletalMeshDescription`, `AnimationCore` **seulement** si plus aucun fichier restant ne les utilise (relevé en DC2-T1) ; `Json` reste (`LPEditWidget`). ## 3. Chemins des données d'animation et de la config (addon) — lots DC2/DC3 Nouvel utilitaire dans `LPAnimMeasure` (dépendance privée `Projects`) : ```cpp // LPAnimMeasurePaths.h namespace LPAnimMeasurePaths { // Racine du depot addon : /../.. ; vide si le plugin est introuvable. LPANIMMEASURE_API FString SandboxRoot(); // /Tools/anim ; repli /Tools/anim (compatibilite jusqu'a DC3). LPANIMMEASURE_API FString ToolsAnimDir(); } ``` | Appelant | Avant | Après | |---|---|---| | `LPSkeletonProfile.cpp:31` | `ProjectDir()/Tools/anim/profiles` | `ToolsAnimDir()/profiles` | | `LPPoseMeasure.cpp:26` | `ProjectDir()/Tools/anim/methodes` | `ToolsAnimDir()/methodes` | | `LPAnimIdentifyCommandlet.cpp:109` (DC2) | `ProjectDir()/Tools/anim/profiles` | `ToolsAnimDir()/profiles` | | `LPSandboxConfig.cpp:36` | `ProjectConfigDir()/LPSandbox.ini` | `SandboxRoot()/Config/LPSandbox.ini`, repli `ProjectConfigDir()` | Une ligne de journal au premier appel (`LogLPAnimMeasure` : `PATHS racine addon `) sert de preuve de chargement. Le repli vers le jeu est retiré en DC3, une fois les fichiers du jeu supprimés. ## 4. Outillage de mods déplacé (addon) — lot DC3 ### 4.1 Arborescence cible (même disposition relative que dans le jeu) | Jeu (avant) | Addon (après) | |---|---| | `Tools/BuildMod.ps1`, `NewMod.ps1`, `EditMod.ps1`, `ModSource.ps1`, `HairPipeline.ps1` | `/Tools/` (mêmes noms) | | `Tools/HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py`, `ImportQuaternius.py`, `DiagnosePose.py` | `/Tools/` | | `Tools/anim/` (tout), `Tools/hairs/`, `Tools/mods/` | `/Tools/anim/`, `/Tools/hairs/`, `/Tools/mods/` | | `ModSources/`, `AnimSources/` | `/ModSources/`, `/AnimSources/` | | `Tools/debug/LifePlay_{pair,interaction,measure}_sandbox.bat` | `/Tools/debug/` | | `Config/LPSandbox.ini` | supprimé du jeu (la copie de l'addon est identique et devient la seule lue, § 3) | | `Docs/Modding/FullGuides/Creating_Asset_Mods.md`, `Docs/Modding/ShortGuides/explanation.lphair` | `/Docs/Modding/` | Garder la disposition relative limite les changements : les chemins `$PSScriptRoot` → `Tools/...` restent justes ; seule la racine du jeu change. ### 4.2 Deux racines Nouveau fichier `/Tools/Roots.ps1`, dot-sourcé en tête de chaque script déplacé : ```powershell # Racines de l'atelier de mods : $SbRoot (depot addon) et $GameRoot (projet LifePlay). # Ordre : parametre -GameRoot, puis Config/LPSandbox.ini [Workshop] GameRoot= (relatif a $SbRoot), puis erreur. function Resolve-LPRoots([string] $GameRootParam) { ... ; retourne @{ Sb = ...; Game = ... } } ``` - `Config/LPSandbox.ini` (addon) : nouvelle section `[Workshop]`, clé `GameRoot=..\LifePlay-master 5.5`. - Contrôle : `\LifePlay.uproject` doit exister, sinon arrêt avec message explicite. - Chaque script reçoit un paramètre `[string] $GameRoot = ''` ; les usages de `$Root` sont répartis selon la table b4 de `DC0-CART.md` (`$GameRoot` : projet, `Releases`, `Mods`, `Content`, `Saved`, `Plugins`, `Licenses`, `Tools/RunCommandlet.ps1`, `Tools/BuildCollections.py` ; `$SbRoot` : `ModSources`, `AnimSources`, `Tools/*`). - `ModSource.ps1` : `Get-ModSourcePaths($SbRoot, $GameRoot, $Name)` → `Source = \ModSources\`, `Mounted = \Mods\` ; `Mount/Dismount/Get-StrayMods` adaptés. - Lanceurs `.bat` : `PROJ` = `%LP_GAMEROOT%\LifePlay.uproject` si la variable existe, sinon `%~dp0..\..\..\LifePlay-master 5.5\LifePlay.uproject`. ### 4.3 Jeu après DC3 - `Tools/SplitModules.ps1:21,41,43` : messages « `LifePlay-Sandbox\Tools\BuildMod.ps1` ». - `.gitignore` : retirer `/ModSources/*/Saved/`, `/ModSources/*/Intermediate/`, `/ModSources/*/Content/` ; les reprendre dans le `.gitignore` de l'addon. - `README.md` : plus de lien vers le guide des moddeurs ; une ligne « l'outillage de mods vit dans un dépôt séparé ». ## 5. Comportement sans sandbox - `AdditionalPluginDirectories` vers un dossier absent : à **vérifier** en DC2-T2 (attendu : ignoré, au pire un avertissement ; si erreur bloquante, déplacer la déclaration vers une solution par variable d'environnement). - `LPSandbox` `Optional` : absent → aucun message bloquant attendu ; à vérifier au même moment. - `LPAnimRedirect` sans sandbox : racine par défaut `/Game/Quaternius/UAL`, cible lue dans `Saved/Config/Windows/LPAnimTarget.ini` (défaut `sandbox` → le jeu joue ses clips d'origine). - Commandlets de mods absents : `-run=LPAnimEval` échoue avec « commandlet introuvable » (comportement voulu). ## 6. Docs à reprendre (complété par l'inventaire a) | Doc | Lot | Changement | |---|---|---| | `20_Chaine_Animations.md` | DC1, DC2 | module `LPAnimCore`, commandlets dans `LPModTools` | | `21_Sandbox_Addon.md` | chaque lot | graphe de modules, § « Rupture du couplage » (corriger l'appel `SetUALRoot` périmé), registre des reports, pin | | `07_Architecture_5.5.md` | DC1 | plugin `LPAnimCore` | | `09_Commandes_Utiles.md` | DC2, DC3 | commandes de mods depuis ``, § 7 publication | | `08_Guide_Developpeur.md` | DC2, DC4 | prérequis : la sandbox n'est requise que pour l'atelier de mods | | `13_Protocole_Coiffure.md`, `16_H3_Mods_Paquets.md` | DC3 | chemins des scripts | | `10_Protocole_Operations.md`, `23_Cycle_De_Vie_Mod.md`, `Docs/Migration/README.md` | DC3 | chemins des scripts, `ModSources` dans l'addon | | `Docs/Modding/ShortGuides/explanation.lpmod` | DC3 | `NewMod`/`BuildMod` cités dans le dépôt de l'addon | | commentaires `LPModInfoSubsystem.h:8`, `BuildDebug.ps1:39` | DC3 | chemin de `BuildMod` | | README du jeu, README de l'addon | DC3, DC4 | guide déplacé, atelier des mods | ## 7. Ordre d'exécution et état compilable | Après | Jeu avec sandbox | Jeu sans sandbox | |---|---|---| | DC1 | compile | non (LifePlayEditorTools → LPAnimMeasure) | | DC2 | compile | **compile** | | DC3 | compile | compile ; outillage de mods disponible seulement avec la sandbox |