LifePlay-Revival/Docs/Migration/etat/sandbox/DC0/DC0-SPEC.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

198 lines
11 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-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 : `<Jeu>` = `D:\Game\LifePlay-master 5.5`, `<Sb>` = `D:\Game\LifePlay-Sandbox`.
## 1. Plugin `LPAnimCore` (jeu) — lot DC1
### 1.1 Emplacement et descripteur
`<Jeu>/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` | `<Sb>/…/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 `<Jeu>/Source/LifePlayEditorTools/`
`LPAnimEvalCommandlet.h/.cpp`, `LPAnimTwistCommandlet.h/.cpp`, `LPAnimCatalogCommandlet.h/.cpp`,
`LPAnimIdentifyCommandlet.h/.cpp`, `LPAnimChecks.h/.cpp`, `LPAnimMethodSelect.h/.cpp`,
`LPHairFromStaticMeshCommandlet.h/.cpp` → `<Sb>/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 : <base du plugin LPSandbox>/../.. ; vide si le plugin est introuvable.
LPANIMMEASURE_API FString SandboxRoot();
// <SandboxRoot>/Tools/anim ; repli <ProjectDir>/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 <chemin>`) 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` | `<Sb>/Tools/` (mêmes noms) |
| `Tools/HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py`, `ImportQuaternius.py`, `DiagnosePose.py` | `<Sb>/Tools/` |
| `Tools/anim/` (tout), `Tools/hairs/`, `Tools/mods/` | `<Sb>/Tools/anim/`, `<Sb>/Tools/hairs/`, `<Sb>/Tools/mods/` |
| `ModSources/`, `AnimSources/` | `<Sb>/ModSources/`, `<Sb>/AnimSources/` |
| `Tools/debug/LifePlay_{pair,interaction,measure}_sandbox.bat` | `<Sb>/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` | `<Sb>/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 `<Sb>/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 : `<GameRoot>\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 = <Sb>\ModSources\<Name>`,
`Mounted = <Jeu>\Mods\<Name>` ; `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 `<Sb>`, § 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 |