# DC0-CART — Cartographie du découplage jeu / sandbox - **Fiche** : DC0-T1 (A-CART) — **Modèle** : (a) M1 haiku | haiku ; (b) M3 opus | opus (session principale) - **Date** : 2026-10-07 — **Plan** : `Docs/Migration/24_Plan_Decouplage_Sandbox.md` - **États de départ** : jeu `main` = `fba19bc` (+ modifications non commitées) ; addon `lot/SB4-final` = `4795ea2` (pin `16905c6`). ## (b) Dépendances (M3) ### b1. Graphe d'inclusion de `LPAnimMeasure` (addon) | Fichier | Inclut (LP) | Destination | |---|---|---| | `LPAnimRedirect.h/.cpp` | — (moteur seul : `ConfigCacheIni`, `Paths`) | **LPAnimCore** (jeu) | | `LPCoupleSim.h` + `LPCoupleSimCore.cpp` | — (moteur seul) | **LPAnimCore** (jeu) | | `LPAnimMeasure.h/.cpp` | — ; déclare `LogLPAnimMeasure` | reste (addon) | | `LPPoseMeasure.h/.cpp` | `LPAnimMeasure.h`, `LPSkeletonProfile.h` | reste | | `LPPoseOrchestrator.h/.cpp` | `LPPoseMeasure.h`, **`LPAnimRedirect.h`**, `LPAnimMeasure.h` | reste → **dépend de LPAnimCore** | | `LPSkeletonProfile.h/.cpp` | `LPAnimMeasure.h` | reste | - `LPAnimRedirect.cpp` et `LPCoupleSimCore.cpp` n'écrivent pas dans `LogLPAnimMeasure` : aucune catégorie de journal à déplacer. - Macro d'export : `LPANIMMEASURE_API` (45 occurrences, 6 en-têtes). Celles de `LPAnimRedirect.h` et `LPCoupleSim.h` deviennent `LPANIMCORE_API`. - Utilisateurs dans `LPSandbox` : `LPAnimRedirect.h` ← `LPSandbox.cpp`, `LPSandboxActors.cpp`, `LPSandboxMeasure.cpp`, `LPSandboxMeasureTour.cpp` (+1) ; `LPCoupleSim.h` ← `LPSandboxCoupleMod.cpp` ; `LPPoseMeasure.h` / `LPPoseOrchestrator.h` ← mode Mesure. Donc `LPSandbox` dépend de `LPAnimCore` **et** de `LPAnimMeasure`. - Utilisateurs dans le jeu : `Source/LifePlay/LPDirectControlSubsystem.cpp` (`LPAnimRedirect::IsGameTarget`, `ClipPath`), `Source/LifePlay/LPShowCoupleSubsystem.cpp/.h` (`LPCoupleSim::*`, 25 appels). Aucun usage de la mesure dans `LifePlay`. ### b2. `SetUALRoot` Appelé uniquement par l'addon : `LPSandbox.cpp:17` (au démarrage, depuis `FLPSandboxConfig::QuaterniusUALRoot`) et `LPSandboxMeasure.cpp:39` (bascule `ClipRoot` pendant la Mesure). Le jeu ne l'appelle pas (le commentaire de `21` § « Rupture du couplage » qui cite `FLifePlayModule::StartupModule()` est périmé). Sans sandbox, `LPAnimRedirect` garde son défaut interne `/Game/Quaternius/UAL` : comportement du jeu inchangé. ### b3. Chemins relatifs au projet du jeu dans le C++ de l'addon (cassent si les données quittent le jeu) | Fichier:ligne | Chemin lu | Problème après DC3 | |---|---|---| | `LPAnimMeasure/LPSkeletonProfile.cpp:31` | `ProjectDir()/Tools/anim/profiles` | profils déplacés dans l'addon | | `LPAnimMeasure/LPPoseMeasure.cpp:26` | `ProjectDir()/Tools/anim/methodes` | méthodes déplacées dans l'addon | | `LifePlayEditorTools/LPAnimIdentifyCommandlet.cpp:109` | `ProjectDir()/Tools/anim/profiles` | idem (commandlet déplacé en DC2) | | `LPSandbox/LPSandboxConfig.cpp:36` | `ProjectConfigDir()/LPSandbox.ini` | **lit la copie du jeu** ; la copie de l'addon (`LifePlay-Sandbox/Config/LPSandbox.ini`) est identique octet pour octet mais n'est pas lue | | `LPSandbox/LPSandboxConfig.cpp:38` | `ProjectSavedDir()/sandbox_pack.ini` | aucun (sortie du pilote dans `Saved/` du jeu) | `Tools/anim/RetargetPack.py` résout `profiles/` et `methodes/` relativement à son propre fichier (`HERE`) : il suit le déplacement sans modification. ### b4. Racine utilisée par les scripts à déplacer Tous calculent une seule racine `$Root` = dossier du jeu, déduite de leur propre emplacement : `BuildMod`, `NewMod`, `EditMod`, `HairPipeline` : `Split-Path $PSScriptRoot -Parent` ; `anim/AnimPipeline`, `anim/DeliverAnims` : deux niveaux au-dessus. Après déplacement, il faut **deux racines** : | Racine | Sert à | Exemples | |---|---|---| | `$GameRoot` (jeu) | `LifePlay.uproject`, `Config/DefaultGame.ini` (`ProjectVersion`), `Releases/`, `Mods/`, `Content/`, `Saved/`, `Plugins/`, `Licenses/`, outils restés au jeu (`Tools/RunCommandlet.ps1`, `Tools/BuildCollections.py`) | `BuildMod.ps1:172,200,202,221,229` ; `AnimPipeline.ps1:118,204,297,426` ; `HairPipeline.ps1:49,70,72,262` | | `$SbRoot` (addon) | `ModSources/`, `AnimSources/`, `Tools/mods/*.json`, `Tools/hairs/*.json`, `Tools/anim/*`, lanceurs sandbox | `BuildMod.ps1:176` ; `NewMod.ps1:32,66` ; `AnimPipeline.ps1:136,269,301,363,386,417,442` ; `DeliverAnims.ps1:45,64,69` | `ModSource.ps1` (dot-sourcé par `BuildMod`, `EditMod`, `HairPipeline`, `DeliverAnims`) monte `ModSources/` (addon) vers `Mods/` (jeu) : ses fonctions prennent aujourd'hui une seule racine → signature à deux racines. ### b5. Appels croisés - `BuildMod` → `ModSource` (dot-source), `anim/AnimPipeline` (`-Anim`), `anim/RetargetPack.py` (`-Retarget`, dans l'éditeur). - `AnimPipeline` → `BuildMod` (×2), `DeliverAnims`, `RapportControles.py`, lanceur `LifePlay_interaction_sandbox.bat`, `Tools/RunCommandlet.ps1` (**reste au jeu**), commandlets `-run=pythonscript`, `LPAnimEval`, `LPAnimTwist`. - `HairPipeline` → `ModSource`, `HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py`, `-run=LPHairFromStaticMesh`, `Tools/BuildCollections.py` (**reste au jeu**). - `NewMod` → écrit `Tools/mods/.json`, renvoie vers `BuildMod`, `EditMod`, `HairPipeline`. - `DeliverAnims` → `ModSource`, `DeliverAnims.py`, `Catalogue.py`. - Jeu → outillage : `SplitModules.ps1:21,41,43` (messages et contrôle qui citent `BuildMod.ps1`, pas d'appel) ; `BuildDebug.ps1:39` (commentaire seulement). ### b6. Données hors liste initiale - `AnimSources/` (non suivi, 28 Ko : `pack.json` de `freeanims`, `quaternius`) : entrée du pilote `AnimPipeline` → **à déplacer avec l'outillage** (ajout à la liste). - `ModSources/` : 133 Mo sur disque (dont `lpr_anim_*` non suivis et `*/Content` ignorés) ; 15 fichiers suivis (`lpr_hair_pocolov`). - La sandbox a déjà un dossier `Tools/debug/` vide (`.gitkeep`) et un `Config/LPSandbox.ini` identique à celui du jeu. ## (a) Inventaire (M1) Livrable de l'agent DC0-T1a (haiku), **vérifié et corrigé** par la session principale (corrections marquées ✎). ### a1. Fichiers à déplacer | Élément | Suivi git | Taille | |---|---|---| | `Tools/BuildMod.ps1`, `NewMod.ps1`, `EditMod.ps1`, `ModSource.ps1`, `HairPipeline.ps1` | oui | 20 K, 3,7 K, 1,4 K, 2,2 K, 19 K | | `Tools/HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py` | oui | 2,8 K, 6,1 K, 4,0 K | | `Tools/ImportQuaternius.py`, `Tools/DiagnosePose.py` | **non** | 1,7 K, 4,6 K | | `Tools/anim/` | oui | 14 fichiers, 143 K | | `Tools/hairs/`, `Tools/mods/` | oui | 1 fichier chacun | | `ModSources/` | ✎ **15 fichiers suivis** (`lpr_hair_pocolov/Module`) sur 720 présents (133 Mo : `*/Content` ignorés, `lpr_anim_*` non suivis) | 133 M | | `AnimSources/` (ajout b6) | non | 28 K | | `Config/LPSandbox.ini` | oui | 1,6 K (identique à la copie de l'addon) | | `Tools/debug/LifePlay_{pair,interaction,measure}_sandbox.bat` | oui | ≈ 0,5 K chacun | | `Docs/Modding/FullGuides/Creating_Asset_Mods.md` | oui | 9,6 K | | `Docs/Modding/ShortGuides/explanation.lphair` (✎ dossier `ShortGuides`) | oui | — | | C++ : `LPAnimEval`, `LPAnimTwist`, `LPAnimCatalog`, `LPAnimIdentify` (commandlets, `.h/.cpp`), `LPAnimChecks.h/.cpp`, `LPHairFromStaticMesh` (`.h/.cpp`) | oui | — | | C++ : `LPAnimMethodSelect.h` (✎ en-tête seul, **suivi** ; l'agent l'avait noté non suivi) | oui | — | ### a2. Références hors fichiers déplacés (hors `etat/`) | Fichier | Référence | Traitement | |---|---|---| | `README.md:29,47,48,55,73` | `ModSources`, `NewMod`/`EditMod`/`HairPipeline`/`BuildMod`, lien vers `Creating_Asset_Mods.md` | DC3/DC4 : réécrire (outillage dans un dépôt séparé, plus de lien) | | `.gitignore:48-50` | `/ModSources/*/{Saved,Intermediate,Content}/` | DC3 : déplacer vers l'addon | | `LifePlay.uproject:23` | plugin `LPSandbox` | reste (`Optional`) | | `Source/LifePlay/LPModInfoSubsystem.h:8` | commentaire `Tools/BuildMod.ps1` | DC3 : « `LifePlay-Sandbox/Tools/BuildMod.ps1` » | | `Source/LifePlay/LifePlay.Build.cs:43` | commentaire `LPAnimMeasure (plugin LPSandbox)` | DC1 (remplacé) | | `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs:43,47-51` | commentaires `LPAnimEval`, `LPHairFromStaticMesh` | DC2 | | `Tools/SplitModules.ps1:21,41,43` | `BuildMod.ps1` | DC3 | | `Tools/BuildDebug.ps1` | ✎ aucune référence à `ModSources` (seulement `BuildMod.ps1` en commentaire, ligne 39) | DC3 (commentaire) | | `Docs/Modding/ShortGuides/explanation.lpmod` (2) | `NewMod`, `BuildMod` | reste au jeu (format `.lpmod`) ; DC3 : citer le dépôt de l'addon | | `Docs/Migration/09` (23), `10` (3), `13` (7), `16` (24), `20` (16), `21` (31), `23` (25), `README` (1) | outils et commandlets | DC1–DC4 selon § 6 de la SPEC (ajout : `10_Protocole_Operations.md`, `23_Cycle_De_Vie_Mod.md`, `Docs/Migration/README.md`) | ### a3. Inclusions C++ Aucune inclusion orpheline côté jeu : seuls les fichiers déplacés incluent `LPAnimChecks.h`, `LPAnimMethodSelect.h`, `LPPoseMeasure.h`, `LPSkeletonProfile.h`. ✎ L'agent signale `LPPoseMeasure.h` comme « inexistant » : il est dans l'addon (`LPAnimMeasure`), c'est attendu. ### a4. Chiffres ≈ 765 fichiers sur disque à déplacer (dont 720 sous `ModSources`), ≈ 133 Mo ; côté git du jeu : ≈ 45 fichiers suivis quittent le dépôt. Références : 65 fichiers hors `etat/`, dont 1 seul fichier de code exécuté (`SplitModules.ps1`).