LifePlay-Revival/Docs/Migration/etat/sandbox/DC0/DC0-CART.md
edujiro5972 19e704b02c DC0 : plan du decouplage jeu / sandbox, cartographie et SPEC approuvees (CHG-233)
Plan 24_Plan_Decouplage_Sandbox.md (lots DC0 a DC4) : plugin LPAnimCore dans le jeu,
module editeur LPModTools et tout l'outillage de mods dans l'addon (prive).
Documentation seule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 16:14:39 +02:00

131 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/<v>`, `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/<Mod>` (addon)
vers `Mods/<Mod>` (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/<Mod>.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`).