LifePlay-Revival/Docs/Migration/etat/sandbox/DC0/DC0-SPEC.md

199 lines
11 KiB
Markdown
Raw Normal View History

# 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 |