diff --git a/Docs/Migration/21_Sandbox_Addon.md b/Docs/Migration/21_Sandbox_Addon.md index fdd0320..50ca742 100644 --- a/Docs/Migration/21_Sandbox_Addon.md +++ b/Docs/Migration/21_Sandbox_Addon.md @@ -178,6 +178,12 @@ Le lot S5 ferme la **dérive de fork** entre la sandbox (`LPSandbox/LPCoupleSim. - [x] **G-SB3** : SB3 abandonné (décision utilisateur 2026-10-07). Motif : les mods du jeu sont du contenu (.lpmod + pak), leurs dépendances sont vérifiées par le registre (prouvé en SB1/SB2) ; coût ≈ 1 à 1,5 lot, et `LPAnimMeasure` est utilisé par le jeu en Shipping ; on passe à SB4. - [x] **SB2-O1** : correction du défaut O1 (`etat/sandbox/SB2/SB2-O1-BUILD.md` PASS, contrôle visuel utilisateur 2026-10-07 ; tag `lot-SB2-O1-valide`). - [x] Reports SB2 : (O1) traité (SB2-O1, `3d858527fccfdddd8711c7c7448fa001442e0b8a` : `ShowRoom` symétrique de `HideRoom`, contrôle visuel utilisateur 2026-10-07 « c'est bon ») ; (E3) sans `lps_lib_scene`, la pièce est construite quand même : non traité, séparation physique abandonnée à la porte G-SB3 (décision utilisateur 2026-10-07). +- [x] **DC0** : cartographie et SPEC du découplage jeu / sandbox (`etat/sandbox/DC0/DC0-SPEC.md`, approuvée par l'utilisateur 2026-10-07) ; plan `24_Plan_Decouplage_Sandbox.md`. +- [ ] **DC1** : Plugin LPAnimCore dans le jeu, LPAnimMeasure réduit à la mesure (DC1-T1..T5). +- [ ] **DC2** : Commandlets de mods vers un module éditeur de la sandbox (DC2-T1..T5). +- [ ] **DC3** : Scripts, données et sources de mods vers la sandbox (DC3-T1..T5). +- [ ] **DC4** : Preuve « jeu seul », docs, évaluation (DC4-T1..T4). +- [ ] Reports DC0 (lot propriétaire **DC1**) : § Rupture du couplage : la mention d'un appel à SetUALRoot par FLifePlayModule::StartupModule() est périmée ; seul l'addon l'appelle (LPSandbox.cpp:17, LPSandboxMeasure.cpp:39) — voir DC0-CART b2. ## Lots (S0 … S8) | Lot | Objet (une ligne) | diff --git a/Docs/Migration/24_Plan_Decouplage_Sandbox.md b/Docs/Migration/24_Plan_Decouplage_Sandbox.md new file mode 100644 index 0000000..1b3131d --- /dev/null +++ b/Docs/Migration/24_Plan_Decouplage_Sandbox.md @@ -0,0 +1,410 @@ +--- +name: Découplage jeu / sandbox (DC) +overview: Rendre LifePlay-Revival compilable et jouable sans l'addon LifePlay-Sandbox (plugin LPSandbox vraiment optionnel) — partie runtime de LPAnimMeasure rapatriée dans un plugin LPAnimCore du jeu, mesure et tout l'outillage de mods (commandlets, scripts, sources de mods) déplacés dans la sandbox, qui devient l'atelier de fabrication et de recuisson des mods — en lots DC0–DC4 avec fiches DC#-Tn (consigne, livrable, handoff) et modèle IA assigné selon la complexité. +todos: + - id: lot-dc0 + content: Lot DC0 — Cartographie et SPEC du découpage (DC0-T1..T4), porte utilisateur + status: pending + - id: lot-dc1 + content: Lot DC1 — Plugin LPAnimCore dans le jeu, LPAnimMeasure réduit à la mesure (DC1-T1..T5) + status: pending + - id: lot-dc2 + content: Lot DC2 — Commandlets de mods vers un module éditeur de la sandbox (DC2-T1..T5) + status: pending + - id: lot-dc3 + content: Lot DC3 — Scripts, données et sources de mods vers la sandbox (DC3-T1..T5) + status: pending + - id: lot-dc4 + content: Lot DC4 — Preuve « jeu seul », docs, évaluation (DC4-T1..T4) + status: pending +isProject: false +--- + +# Cahier : découplage du jeu et de la sandbox + +## Contexte + +Depuis S2/S3, `LifePlay` et `LifePlayEditorTools` déclarent `LPAnimMeasure` dans leurs `Build.cs` +(`Source/LifePlay/LifePlay.Build.cs:45`, `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs:22`). Ce module vit +dans le dépôt **privé** `LifePlay-Sandbox`. Le marquage `"Optional": true` du plugin dans `LifePlay.uproject` ne +suffit donc pas : sans la sandbox, le jeu ne compile plus. Le commit local `fba19bc` (non poussé) porte ce +couplage. Le pousser tel quel rendrait le dépôt public impossible à compiler et poserait un problème AGPL (code +distribué avec le jeu dont la source n'est pas publiée). + +`LPAnimMeasure` mélange deux choses : + +| Partie | Fichiers | Lignes | Utilisateurs | +|---|---|---|---| +| Runtime du jeu | `LPAnimRedirect`, `LPCoupleSim.h` + `LPCoupleSimCore.cpp` | ≈ 780 | `LPDirectControlSubsystem` (marche avec clips convertis), `LPShowCoupleSubsystem`, sandbox | +| Mesure | `LPPoseMeasure`, `LPPoseOrchestrator`, `LPSkeletonProfile` | ≈ 2 470 | sandbox (mode Mesure), commandlets `LPAnim*` | + +Constats de la cartographie préliminaire (2026-10-07) : +- La partie runtime n'inclut que le moteur (aucun en-tête de mesure). +- Les commandlets `LPAnimEval`, `LPAnimTwist`, `LPAnimCatalog`, `LPAnimIdentify` et les aides `LPAnimChecks`, + `LPAnimMethodSelect` n'incluent aucun en-tête du module `LifePlay` : on peut les déplacer tels quels. Même chose pour + `LPHairFromStaticMesh`. +- Le plugin `LPSandbox` ne dépend pas de `LifePlay` : pas de cycle à casser. +- Le jeu contient encore des fichiers propres à la sandbox : `Config/LPSandbox.ini`, + `Tools/debug/LifePlay_{pair,interaction,measure}_sandbox.bat`. + +## Décisions verrouillées (utilisateur, 2026-10-07) + +| Décision | Choix | +|---|---| +| Objectif | `LifePlay-Revival` compile, se lance et se cuit **sans** le dossier `LifePlay-Sandbox` ; `LPSandbox` reste chargé quand il est présent | +| Runtime animation | `LPAnimRedirect` + `LPCoupleSim` rapatriés dans le dépôt du jeu, dans un **plugin** `Plugins/LPAnimCore` (un plugin ne peut pas dépendre d'un module de jeu ; `LPSandbox` doit pouvoir dépendre de `LPAnimCore`) | +| Mesure | `LPPoseMeasure`, `LPPoseOrchestrator`, `LPSkeletonProfile` restent dans `LPAnimMeasure` (sandbox) | +| Outillage de mods | **tout** l'outillage de création, cuisson et recuisson des mods part dans la sandbox, qui devient l'atelier des mods : commandlets d'animation et de coiffure, `BuildMod`, `NewMod`, `EditMod`, `ModSource`, `HairPipeline` et leurs `.py`, `Tools/anim`, `Tools/hairs`, `Tools/mods` | +| Reste dans le jeu | chargement des mods (`ULPModInfoSubsystem`, `LPHairstyleSubsystem`, `LPModDailies`, `LPDataCache`), Mod Manager, commandlets de migration et de diagnostic (`LPFix*`, `LPDump*`, `LPCheck*`, `LPPatchDailies`, `LPEditWidget`, `LPTitleModManager`…), publication du jeu (`SplitModules.ps1`, `Tools/modules`), `Releases/` (référence de cuisson DLC) | +| Visibilité du dépôt Sandbox | **reste privé** (choix utilisateur). Après DC, rien de ce qui est distribué avec le jeu n'en provient | +| Noms des commandlets | inchangés (`-run=LPAnimEval` etc.) : ils sont trouvés dès que le plugin est chargé | +| Dépôt du jeu | un commit par lot, **rien n'est poussé** sans accord (compte GitHub signalé le 2026-10-07 : attendre le rétablissement) ; addon : commit puis mise à jour du pin | + +### Points ouverts tranchés (utilisateur, 2026-10-07) + +| Point | Décision | +|---|---| +| Guide des moddeurs (`Docs/Modding/FullGuides/Creating_Asset_Mods.md` + `explanation.lphair`) | **déplacé dans la doc de la sandbox** (`LifePlay-Sandbox\Docs\`) pour le moment ; le README du jeu n'y renvoie plus | +| `ModSources/` | **déplacé** dans la sandbox | +| Dossier du jeu pour les scripts déplacés | paramètre `-GameRoot`, défaut = dossier frère lu dans `Config/LPSandbox.ini` | +| Historique (`fba19bc`) | **gardé tel quel** : pas de réécriture ; acceptable tant que le compte est signalé (rien n'est visible) | + +## Architecture cible + +```mermaid +flowchart TB + subgraph GAME["LifePlay-Revival (public, AGPL)"] + LP["LifePlay (Runtime)"] + LPET["LifePlayEditorTools (Editor) : migration, diagnostic"] + CORE["Plugins/LPAnimCore (Runtime) : LPAnimRedirect, LPCoupleSim"] + end + subgraph SB["LifePlay-Sandbox (privé) — optionnel"] + LPS["LPSandbox (Runtime, hors Shipping)"] + AM["LPAnimMeasure (Runtime) : mesure de pose"] + MT["LPModTools (Editor) : LPAnim*, LPHairFromStaticMesh"] + TOOLS["Tools/mods, Tools/anim, Tools/hairs, ModSources"] + end + LP --> CORE + LPET --> LP + LPS --> AM & CORE + AM --> CORE + MT --> AM & CORE + TOOLS -. "UnrealEditor-Cmd LifePlay.uproject -run=..." .-> MT + GAME -. "AdditionalPluginDirectories ../LifePlay-Sandbox/Plugins (absent = ignoré)" .-> SB +``` + +Aucune flèche ne va du jeu vers la sandbox. `LPAnimMeasure` dépend de `LPAnimCore` seulement si la SPEC le confirme +(la mesure utilise-t-elle `LPCoupleSim` ? réponse en DC0-T1). + +## Stratégie git + +1. Jeu : un commit par lot DC (règle des phases du 2026-10-07), message `DC#: …` ; tags `lot-DC#-avant` / + `lot-DC#-valide` seulement si l'utilisateur les rouvre ; **aucun push**. +2. Addon : branche `lot/DC#-*`, commit à la clôture du lot, puis pin (hash dans `Docs/Migration/etat/sandbox/S3/S3-INT.md`, + `21_Sandbox_Addon.md`, README de l'addon). +3. Ordre dans un lot qui touche les deux dépôts : addon d'abord (le jeu doit toujours compiler **avec** la sandbox + épinglée), puis jeu. +4. Instantanés avant toute modification : `.\Tools\Snapshot.ps1 -Lot DC# -Path …` (jeu) et + `.\Tools\Snapshot.ps1 -Lot DC#-addon -ProjectRoot D:\Game\LifePlay-Sandbox -Path …` (addon) ; retour arrière **proposé** : + `.\Tools\Restore.ps1 -Lot …`. Attention : à partir de DC3, `Snapshot.ps1`/`Restore.ps1` restent dans le jeu (outils de + migration), pas dans la sandbox. +5. Déplacement de fichiers entre dépôts : copie dans l'addon, vérification d'empreinte (SHA-256 identique), puis + `git rm` côté jeu ; jamais de suppression avant que la copie soit commitée dans l'addon. + +--- + +## Matrice modèles IA ↔ complexité + +Le parent (session principale, Opus) lance chaque sous-agent avec le modèle de la fiche. Sous-classer une fiche haute +complexité est interdit ; surclasser exige un motif écrit dans le handoff. Chaque fiche porte « Modèle prévu | +utilisé » (une VAL sans ce champ en amont = `FAIL-TRACE`). + +| Palier | Complexité | Modèle | Profil | +|---|---|---|---| +| M0 | Faible, mécanique | `haiku` | compilation + lecture du journal, lancements, relevés factuels, empreintes | +| M1 | Faible, exploration large | `haiku` (Explore) | inventaires, greps multi-chemins — **localise, ne suit pas un graphe d'appels** | +| M2 | Moyenne, raisonnement ciblé | `sonnet` | déplacements spécifiés, adaptation de scripts, docs, VAL de parité, opérations inter-dépôts | +| M3 | Haute, refactor qui change la structure | `opus` (session principale) | découpe de module, `Build.cs`/`.uplugin`/`.uproject`, chemins du jeu dans les scripts | +| M4 | Synthèse / jugement | `opus` (session principale) | SPEC, portes de décision, évaluation | +| Orch | Coordination | session principale | fiches, handoffs, vérification des livrables, arbitrage | + +**Règles de secours** : M3 échoue 2 fois sur la même fiche → reprise `DC#-Tn-fix` en `fable` (exception notée en VAL). +M0/M1 insuffisant → +1 palier une seule fois. Le niveau rapide peut réécrire un script fourni malgré l'interdit et +rendre un résultat vide présenté comme un succès → fiche « n'écris ni ne modifie aucun script ; en cas d'échec, +recopie l'erreur et arrête-toi » ; 0 résultat = échec probable. + +### Tableau récap des affectations + +| Fiche | Agent | Palier | Modèle | +|---|---|---|---| +| DC0-T1 | A-CART | M1 + M3 | haiku (inventaire) + opus (dépendances) | +| DC0-T2 | A-ARCH | M4 | opus | +| DC0-T3 | Orch + utilisateur | M4 | opus | +| DC0-T4 | A-DOC | M2 | sonnet | +| DC1-T1 | A-IMPL-H | M3 | opus | +| DC1-T2 | A-BUILD | M0 | haiku | +| DC1-T3 | A-VAL | M2 + utilisateur | sonnet + contrôle visuel | +| DC1-T4 | A-INT | M2 | sonnet | +| DC1-T5 | A-DOC | M2 | sonnet | +| DC2-T1 | A-IMPL-H | M3 | opus | +| DC2-T2 | A-BUILD | M0 | haiku | +| DC2-T3 | A-VAL | M2 | sonnet | +| DC2-T4 | A-INT | M2 | sonnet | +| DC2-T5 | A-DOC | M2 | sonnet | +| DC3-T1 | A-IMPL-H | M3 | opus (résolution du dossier du jeu, `BuildMod`) | +| DC3-T2 | A-IMPL-L | M2 | sonnet (déplacements, autres scripts, lanceurs) | +| DC3-T3 | A-VAL | M2 + utilisateur | sonnet | +| DC3-T4 | A-INT | M2 | sonnet | +| DC3-T5 | A-DOC | M2 | sonnet | +| DC4-T1 | A-BUILD | M0 | haiku | +| DC4-T2 | A-VAL | M2 + utilisateur | sonnet | +| DC4-T3 | A-DOC | M2 | sonnet | +| DC4-T4 | A-DOC + Orch | M4 | opus | + +--- + +## Protocole de passage de consignes + +Toute sous-tâche est une **fiche** `DC#-Tn`. Un agent ne démarre que si le livrable amont existe et n'est pas vide. + +### Format obligatoire d'une fiche + +- **ID** : `DC#-Tn` — **Agent** : rôle — **Modèle** : prévu | utilisé — **Dépend de** +- **Consigne d'entrée** (objectif, contexte minimal, chemins exacts, commandes exactes, pièges, interdits) +- **Travail** / **Livrable** / **Critère Done** (vérifiable) / **Handoff** + +### Lancement (parent) + +``` +Agent(subagent_type = Explore | general-purpose, model = , + prompt = consigne d'entrée + chemins des livrables amont + « Modèle prévu : » en tête) +``` + +### Emplacement des livrables + +`D:\Game\LifePlay-master 5.5\Docs\Migration\etat\sandbox\DC#\` : `DC#-CART.md`, `DC#-SPEC.md`, `DC#-IMPL.md`, +`DC#-BUILD.md`, `DC#-VAL.md` ; journaux de commandlets en `.txt` (non suivis par git depuis le 2026-10-07) ; docs +techniques de l'outillage dans `D:\Game\LifePlay-Sandbox\Docs\` ; CHG au journal du jeu. + +### Règles d'orchestration + +1. Le parent colle le livrable amont (chemin + résumé ≤ 5 lignes) et le modèle. +2. Hors périmètre → stop + signaler. +3. FAIL VAL → pas de DOC de clôture ; fiche `DC#-Tn-fix`. +4. La compilation appartient à l'IMPL (A-BUILD juste après) ; la VAL ne recompile pas. +5. VAL en lecture seule sur les docs d'acceptation ; DOC distinct coche `21`. +6. Registre des reports : chaque « reste à faire » entre dans la liste unique de `21_Sandbox_Addon.md` avec un lot propriétaire. +7. Lot coupé → commit du validé ; reste = nouveau lot. + +### Rôles + +| ID | Rôle | Paliers | +|---|---|---| +| A-CART | Cartographe | M1 (localiser) ou M3 (suivre des dépendances) | +| A-ARCH | Architecte | M4 | +| A-IMPL-H | Implémenteur lourd | M3 | +| A-IMPL-L | Implémenteur léger | M2 | +| A-BUILD | Compilation + journal | M0 | +| A-INT | Intégrateur (commits addon et jeu, pin) | M2 | +| A-VAL | Validateur | M2 (+ contrôle visuel utilisateur) | +| A-DOC | Rédacteur | M2 ; M4 pour l'évaluation | + +### Pièges à recopier dans les fiches (mémoire `lifeplay-build-pitfalls`) + +- Éditeur fermé avant de compiler ; une compilation à la fois ; commande : + `& 'D:\Game\Launcher\Engine\UE_5.5\Engine\Build\BatchFiles\Build.bat' LifePlayEditor Win64 Development -Project='D:\Game\LifePlay-master 5.5\LifePlay.uproject' -WaitMutex` + (compile aussi les plugins de l'addon et `LPAnimCore`). +- DLL périmées : vérifier que `LifePlay-Sandbox\Plugins\LPSandbox\Binaries` n'existe pas ou n'est pas plus ancien que + `LifePlay-master 5.5\Binaries\Win64` ; même contrôle pour `Plugins\LPAnimCore\Binaries` ; preuve de chargement = + ligne de journal propre au nouveau code. +- Unity build : pas de même nom dans deux espaces de noms anonymes du module → espace de noms nommé. +- Lanceurs sandbox : jamais derrière un tuyau (`| Out-Null`) : `Start-Process cmd.exe -ArgumentList '/c ""'`. +- `BuildMod -Retarget` depuis un agent : `cmd /c start "" /wait cmd /c ""`, sortie redirigée vers un fichier ; + résultat = lignes `RETARGET …` portant le jeton du lancement ; plantage à la fermeture de l'éditeur sans conséquence. +- Toute recuisson par `RetargetPack.py` défait `LPAnimTwist` : relancer `LPAnimTwist` puis `LPAnimEval`. +- `-run=pythonscript` : ajouter `-FullStdOutLogOutput` ; registre d'assets en commandlet : `scan_paths_synchronous` avant + `does_asset_exist`. +- Jamais de commit ni de build avec `Mods/` non vide (mod monté par `ModSource.ps1`). +- Test « jeu seul » : **déplacer** (pas supprimer) `D:\Game\LifePlay-Sandbox` vers un nom temporaire, puis le remettre ; + vérifier qu'aucun éditeur ne tourne pendant le déplacement. + +--- + +## Lots et fiches + +### Lot DC0 — Cartographie et SPEC + +- **Objectif** : découpage exact fichier par fichier, validé avant tout déplacement. **Repo** : docs du jeu. + +#### DC0-T1 — Cartographie +- **Agent** : A-CART | **Modèle** : M1 haiku (inventaire) + M3 opus (dépendances) +- **Travail** : (a) inventaire M1 : tout fichier du jeu qui appartient à l'outillage de mods (scripts `Tools/`, + commandlets `Source/LifePlayEditorTools`, `Tools/anim|hairs|mods`, `ModSources/`, `Config/LPSandbox.ini`, + lanceurs `Tools/debug/*sandbox*.bat`), et toute référence à ces fichiers (docs, scripts, README, `.gitignore`) ; + (b) M3 : graphe d'inclusion de `LPAnimMeasure` (la mesure utilise-t-elle `LPCoupleSim`/`LPAnimRedirect` ?), qui + appelle `SetUALRoot` aujourd'hui, comment chaque script calcule `ProjectRoot`, appels croisés entre scripts + (`SplitModules` → `BuildMod`, `HairPipeline` → `LPHairFromStaticMesh`, `AnimPipeline` → `BuildMod -Retarget`). +- **Livrable** : `etat/sandbox/DC0/DC0-CART.md` (tableau fichier → destination proposée → références à corriger). +- **Handoff → DC0-T2**. + +#### DC0-T2 — SPEC +- **Agent** : A-ARCH | **Modèle** : M4 opus +- **Livrable** : `etat/sandbox/DC0/DC0-SPEC.md` : `LPAnimCore.uplugin` (type, phase de chargement avant `LifePlay`, + plateformes, Shipping inclus), `Build.cs` des cinq modules, `.uproject` du jeu (plugin `LPAnimCore`, `LPSandbox` + optionnel), `LPSandbox.uplugin` (modules `LPSandbox`, `LPAnimMeasure`, `LPModTools` + dépendance au plugin + `LPAnimCore`), arborescence cible de l'addon (`Tools/mods`, `Tools/anim`, `Tools/hairs`, `ModSources`), règle de + résolution du dossier du jeu, comportement attendu quand le dossier frère est absent, liste des docs à reprendre + (dont le déplacement du guide des moddeurs). +- **Handoff → DC0-T3**. + +#### DC0-T3 — Porte utilisateur +- **Agent** : Orch + utilisateur | **Modèle** : M4 opus +- **Critère Done** : SPEC approuvée (les 4 points ouverts sont déjà tranchés, voir « Décisions verrouillées »). + +#### DC0-T4 — Clôture DC0 +- **Agent** : A-DOC | **Modèle** : M2 sonnet +- **Travail** : CHG, `21_Sandbox_Addon.md` (lots DC annoncés), `DC0-VAL.md` (modèles prévus | utilisés) ; commit jeu `DC0`. + +--- + +### Lot DC1 — Plugin LPAnimCore + +- **Objectif** : le jeu ne dépend plus de `LPAnimMeasure` ; la sandbox dépend de `LPAnimCore`. **Repos** : addon puis jeu. + +#### DC1-T1 — Découpe +- **Agent** : A-IMPL-H | **Modèle** : M3 opus +- **Travail** : créer `Plugins/LPAnimCore` (`.uplugin`, module `LPAnimCore`, macro d'export `LPANIMCORE_API`) avec + `LPAnimRedirect.*`, `LPCoupleSim.h`, `LPCoupleSimCore.cpp` copiés depuis l'addon (empreintes notées), exports + renommés ; `LifePlay.Build.cs` : `LPAnimMeasure` → `LPAnimCore` ; addon : retirer ces fichiers de `LPAnimMeasure`, + dépendances `LPSandbox`/`LPAnimMeasure` → `LPAnimCore`, plugin `LPAnimCore` déclaré dans `LPSandbox.uplugin` ; + `LifePlayEditorTools.Build.cs` garde `LPAnimMeasure` jusqu'à DC2 (le jeu compile alors avec la sandbox, pas encore sans). +- **Livrable** : `DC1-IMPL.md` (fichiers, empreintes avant/après, diff des `Build.cs`). + +#### DC1-T2 — Compilation (A-BUILD, M0 haiku) +- **Consigne** : commande Build.bat exacte ; contrôle des dates de DLL (jeu, addon, `LPAnimCore`) ; recopier erreurs + `fichier:ligne` ; ne rien corriger. **Livrable** : `DC1-BUILD.md`. **Critère Done** : code 0. + +#### DC1-T3 — Validation (A-VAL, M2 sonnet + utilisateur) +- **Cas** : (a) jeu en éditeur et en build Development : marche avec clips convertis quand `LPAnimTarget.ini` = `game` + (journal propre à `LPAnimRedirect`) ; (b) ShowCouple : placement, boîte, glissement identiques (contrôle visuel) ; + (c) sandbox : `lps_couple`, `lps_interaction`, `lps_asset_integration` s'ouvrent ; tournée Mesure automatique + identique à SB2-REF (JSON/CSV) ; (d) `LPAnimEval` sur Quaternius identique à SB4. +- **Livrable** : `DC1-VAL.md` PASS/FAIL + preuves. + +#### DC1-T4 — Intégration (A-INT, M2 sonnet) — commit addon, pin, commit jeu `DC1`. +#### DC1-T5 — Docs (A-DOC, M2 sonnet) — CHG, `20_Chaine_Animations.md`, `21` (graphe de modules), `07_Architecture_5.5.md`. + +--- + +### Lot DC2 — Commandlets de mods dans la sandbox + +- **Objectif** : `LifePlayEditorTools` ne dépend plus de `LPAnimMeasure` ; à la fin de DC2, **le jeu compile sans la sandbox**. + +#### DC2-T1 — Déplacement +- **Agent** : A-IMPL-H | **Modèle** : M3 opus +- **Travail** : nouveau module éditeur `LPModTools` dans `LPSandbox.uplugin` ; y déplacer `LPAnimEval`, `LPAnimTwist`, + `LPAnimCatalog`, `LPAnimIdentify`, `LPAnimChecks`, `LPAnimMethodSelect`, `LPHairFromStaticMesh` (+ `.h`) ; reprendre + leurs dépendances moteur depuis `LifePlayEditorTools.Build.cs` ; retirer `LPAnimMeasure` de + `LifePlayEditorTools.Build.cs` ; retirer du jeu les sources déplacées (après commit addon). +- **Livrable** : `DC2-IMPL.md`. + +#### DC2-T2 — Compilation (A-BUILD, M0 haiku) — avec la sandbox **et** sans (dossier addon déplacé puis remis) ; deux codes 0. + +#### DC2-T3 — Validation (A-VAL, M2 sonnet) +- **Cas** : (a) `-run=LPAnimEval`, `-run=LPAnimTwist` sur Quaternius : sorties identiques à SB4 ; (b) + `-run=LPHairFromStaticMesh` sur une coiffure Pocolov de référence dans un dossier temporaire : asset équivalent + (nombre d'os, poids, bornes) ; (c) sans sandbox, `-run=LPAnimEval` échoue proprement (commandlet inconnu), le jeu + démarre en éditeur et en `-game`. +- **Livrable** : `DC2-VAL.md`. + +#### DC2-T4 — Intégration (A-INT, M2 sonnet) — commit addon, pin, commit jeu `DC2`. +#### DC2-T5 — Docs (A-DOC, M2 sonnet) — CHG, `09_Commandes_Utiles.md`, `20`, `21`, `08_Guide_Developpeur.md`. + +--- + +### Lot DC3 — Scripts, données et sources de mods + +- **Objectif** : l'atelier des mods est entièrement dans la sandbox. + +#### DC3-T1 — Scripts structurants +- **Agent** : A-IMPL-H | **Modèle** : M3 opus +- **Travail** : `BuildMod.ps1`, `ModSource.ps1`, `AnimPipeline.ps1` déplacés dans `LifePlay-Sandbox\Tools\mods` / + `Tools\anim` ; `ProjectRoot` remplacé par la règle de la SPEC (`-GameRoot`, défaut lu dans `Config/LPSandbox.ini`) ; + chemins vers `Releases/`, `Mods/`, `Saved/`, `UnrealEditor-Cmd.exe`, `LifePlay.uproject` résolus depuis le dossier du + jeu ; chemins vers `ModSources`, `Tools/anim`, `Tools/mods` résolus depuis l'addon. +- **Livrable** : `DC3-IMPL.md` (table « ancien chemin → nouveau chemin » par script). + +#### DC3-T2 — Déplacements simples et références +- **Agent** : A-IMPL-L | **Modèle** : M2 sonnet +- **Travail** : `NewMod.ps1`, `EditMod.ps1`, `HairPipeline.ps1`, `HairImportFbx.py`, `HairMaterials.py`, + `FbxMaterialMap.py`, `ImportQuaternius.py`, `Tools/anim/*`, `Tools/hairs`, `Tools/mods`, `ModSources/`, + guide des moddeurs (`Docs/Modding/FullGuides/Creating_Asset_Mods.md`, `explanation.lphair`) vers `LifePlay-Sandbox\Docs\`, + `Config/LPSandbox.ini`, lanceurs `Tools/debug/*sandbox*.bat` ; mise à jour des références (`SplitModules.ps1` + message vers `BuildMod`, `.gitignore` du jeu et de l'addon) ; empreintes avant/après. +- **Livrable** : `DC3-IMPL-L.md`. + +#### DC3-T3 — Validation (A-VAL, M2 sonnet + utilisateur) +- **Cas** : (a) `BuildMod -Name lpr_hair_pocolov` depuis l'addon : zip produit, contenu du pak identique à la version + précédente (liste et tailles) ; (b) `NewMod` dans un dossier temporaire puis suppression ; (c) `ModSource` monte et + démonte, `Mods/` vide à la fin ; (d) `BuildMod -Retarget rigs -RetargetOnly` : ligne `RETARGET rigs prets` au bon + jeton ; (e) lanceurs sandbox fonctionnels ; (f) aucun script restant dans le jeu ne référence un fichier déplacé. +- **Livrable** : `DC3-VAL.md`. + +#### DC3-T4 — Intégration (A-INT, M2 sonnet) — commit addon, pin, commit jeu `DC3`. +#### DC3-T5 — Docs (A-DOC, M2 sonnet) — CHG, `13_Protocole_Coiffure.md`, `16_H3_Mods_Paquets.md`, `09` § 7 (publication), README de l'addon (atelier des mods). + +--- + +### Lot DC4 — Preuve « jeu seul » et clôture + +#### DC4-T1 — Clone propre (A-BUILD, M0 haiku) +- `git clone` local du dépôt du jeu (HEAD) dans un dossier temporaire **sans** dossier frère `LifePlay-Sandbox` ; + `Build.bat LifePlayEditor` et `Build.bat LifePlay Win64 Development` sur ce clone (C++ seul, sans `Content` lourd si + non requis) ; codes de sortie ; suppression du clone après relevé. + +#### DC4-T2 — Validation finale (A-VAL, M2 sonnet + utilisateur) +- Jeu de travail **sans** sandbox : éditeur, `-game`, build Development empaqueté (nouvelle partie + Continuer, règle + `feedback-packaging-test-paths`) ; **avec** sandbox : trois mods de la sandbox, `LPAnimEval`, `BuildMod`. + +#### DC4-T3 — Docs (A-DOC, M2 sonnet) +- `21_Sandbox_Addon.md` (acceptation DC), README du jeu (la sandbox n'est plus requise, plus de lien vers le guide des moddeurs), + `08_Guide_Developpeur.md`, mémoire projet. + +#### DC4-T4 — Évaluation (A-DOC + Orch, M4 opus) +- Tableau « modèle prévu vs utilisé vs résultat » par fiche ; état prêt à pousser (liste des commits, décision sur `fba19bc`). + +--- + +## Critères d'acceptation globaux + +1. Un clone propre de `LifePlay-Revival`, sans `LifePlay-Sandbox` à côté, compile (éditeur et Development) et se lance. +2. Aucun `Build.cs`, `.uproject` ou script du jeu ne référence `LPAnimMeasure`, `LPModTools` ou un fichier déplacé. +3. Avec la sandbox présente : trois mods de la sandbox, tournée Mesure (identique à SB2-REF), `LPAnimEval` (identique à SB4). +4. Marche avec clips convertis et ShowCouple inchangés dans le jeu. +5. `BuildMod` depuis l'addon produit un mod identique à la version précédente. +6. CHG par lot, pin à jour, registre des reports tenu, modèles tracés. + +## Risques + +- `LPCoupleSim` exporté par un nouveau module : symboles `LPANIMMEASURE_API` à renommer partout (jeu et addon), sinon + liaison en échec → DC1-T1 en M3, empreintes avant/après. +- DLL périmées dans trois dossiers `Binaries` → contrôle des dates à chaque A-BUILD. +- Scripts déplacés qui calculaient `ProjectRoot` depuis leur propre dossier → règle unique de la SPEC, cas (f) de DC3-T3. +- Publication du jeu (`SplitModules` + zips de `BuildMod`) dépend désormais de la sandbox privée : acceptable (seul + l'utilisateur publie), à écrire dans `09` § 7. +- Compte GitHub signalé : rien n'est poussé, ni jeu ni addon. + +## Vérification de bout en bout + +1. `Build.bat LifePlayEditor …` code 0 avec et sans sandbox (A-BUILD). +2. Clone propre sans sandbox : compilation code 0 (DC4-T1). +3. Build Development : marche (clips convertis), ShowCouple, nouvelle partie et Continuer. +4. Sandbox : trois mods, tournée Mesure automatique comparée à SB2-REF. +5. `-run=LPAnimEval` (Quaternius) comparé à SB4 ; `BuildMod -Name lpr_hair_pocolov` comparé à la version précédente. + +## Livrables documentaires + +- `Docs/Migration/24_Plan_Decouplage_Sandbox.md` (ce cahier) +- `Docs/Migration/etat/sandbox/DC#/*` +- `Docs/Migration/21_Sandbox_Addon.md`, `20_Chaine_Animations.md`, `09_Commandes_Utiles.md`, `13`, `16`, `07`, `08` +- README de l'addon (atelier des mods), README du jeu ; CHG par lot diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index 84fd6e7..46a9a72 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -1131,6 +1131,7 @@ Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (sol | CHG-155 | 2026-10-05 | ShowCouple | Un lit est reconnu par son nom. Il ne bloque un déplacement que vers le bas, pour se poser ; le retour horizontal n'est plus arrêté et le contact ne renvoie plus la boîte | après avoir quitté le lit, la boîte ne pouvait plus y revenir | revenir au test `DoesPackageExist` et au filtre du flanc seul | | CHG-156 | 2026-10-05 | Clavier | `LPKeyboardSubsystem` : bouton « Clavier » ajouté à l'exécution dans `MainMenu.SettingsScrollBox` ; panneau pour changer, ajouter ou retirer une touche (actions et axes clavier). Écrit dans `Saved/Config/Windows`, pas dans `GameSettings.sav` | pouvoir réaffecter les touches, dont Q, sans modifier les Blueprints | retirer `LPKeyboardSubsystem.h/.cpp` et la dépendance `UMG` | | CHG-158 | 2026-10-05 | Réglages | `LPSettingsSubsystem` : onglets Audio, Video, Lewd, General, Keyboard, Misc au-dessus de `SettingsScrollBox`. Les lignes du Blueprint restent en place et sont montrées selon leur texte ; le reste va dans Misc. Keyboard affiche la liste des touches | la liste unique ne montrait pas le clavier | retirer `LPSettingsSubsystem.h/.cpp` | +| CHG-233 | 2026-10-07 | DC0 | `Docs/Migration/24_Plan_Decouplage_Sandbox.md` (nouveau), `Docs/Migration/etat/sandbox/DC0/DC0-CART.md`, `DC0-SPEC.md`, `DC0-VAL.md` (nouveaux) | lot DC0 : plan du découplage jeu / sandbox (lots DC0 à DC4), cartographie et SPEC approuvées par l'utilisateur le 2026-10-07 (plugin `LPAnimCore` dans le jeu, module éditeur `LPModTools` et tout l'outillage de mods dans l'addon, dépôt Sandbox privé) ; documentation seule, aucun code. Motif : le jeu public doit compiler sans le dépôt privé `LifePlay-Sandbox` (`LifePlay` et `LifePlayEditorTools` dépendent de `LPAnimMeasure`) | aucun pin (documentation seule) | supprimer ces fichiers (documentation seule) ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-232 | 2026-10-07 | SB4 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/LPPairSandbox.cpp`, `LPSandboxModRegistry.cpp`, `LPSandboxModRegistry.h` (SB4-T0 : ouverture par déclencheur éphémère non mémorisée, `sandbox_mode.txt` du pilote), `README.md` (commits `16905c68070992f5139dab907b41b461fb765957` code + pin, tag `lot-SB4-valide`, branche `lot/SB4-final`, tag d'entrée `lot-SB4-avant` = `30e8c18`) ; jeu : `Docs/Migration/etat/sandbox/SB4/SB4-BUILD.md`, `SB4-VAL.md`, `SB4-EVAL.md`, `Docs/Migration/23_Cycle_De_Vie_Mod.md` (§ 7), `Docs/Migration/21_Sandbox_Addon.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md` | lot SB4 (dernier lot de la sandbox modulaire) : SB4-T0 correctif (ouverture par déclencheur éphémère, `Open=lps_couple` intact), compilation PASS, validation finale F1 à F4 PASS (démarrage, tournées Quaternius et FreeAnimationsPack identiques à SB2-REF, LPAnimEval identique), doc 23 § 7, évaluation `SB4-EVAL.md` : décision GO pour transposer au jeu par petits lots | pin `3d85852` → `16905c6` (hash complet `16905c68070992f5139dab907b41b461fb765957`) | `.\Tools\Restore.ps1 -Lot SB4` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB4-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB4-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-231 | 2026-10-07 | SB2-O1 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/LPSandboxScene.cpp` (`ALPSandboxScene::ShowRoom` : `SetHiddenInGame(false)` puis `SetVisibility(true, true)` sur meubles et murs), `README.md` (commits `3d858527fccfdddd8711c7c7448fa001442e0b8a` code + `30e8c18` pin, tag `lot-SB2-O1-valide`, branche `lot/SB2-O1`, tag d'entrée `lot-SB2-O1-avant` = `b4ca206`) ; jeu : `Docs/Migration/etat/sandbox/SB2/SB2-O1-BUILD.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin, reports SB2, porte G-SB3) | mini-lot SB2-O1 : correction du défaut O1 (meubles et murs invisibles au retour de Mesure, `ShowRoom` rendu symétrique de `HideRoom`) ; compilation PASS ; tournée freeanims identique à SB2-REF (73/73 fichiers, JSON/CSV/TXT identiques) ; contrôle visuel utilisateur « c'est bon » (meubles et murs visibles en revenant de Mesure vers Couple et Interaction). Porte G-SB3 (décision utilisateur 2026-10-07) : SB3 abandonné (plugins physiques séparés non faits) ; les mods du jeu sont du contenu (.lpmod + pak), leurs dépendances sont vérifiées par le registre (prouvé en SB1/SB2), coût ≈ 1 à 1,5 lot, `LPAnimMeasure` utilisé par le jeu en Shipping ; on passe à SB4 ; E3 non traité | pin `fece7e9` → `3d85852` (hash complet `3d858527fccfdddd8711c7c7448fa001442e0b8a`) | `.\Tools\Restore.ps1 -Lot SB2-O1` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB2-O1-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB2-O1-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-230 | 2026-10-07 | SB2 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/*` (nouveaux `LPSandboxScene.h/.cpp` ex-`LPSandboxRoomBuilder.cpp`, `LPSandboxActors.h/.cpp`, `LPSandboxCamera.h/.cpp`, `LPSandboxCoupleMod.h/.cpp` ex-`LPCoupleSim.cpp`, `LPSandboxInteractionMod.h`, `LPSandboxMeasureMod.h` ; registre, enveloppes, `LPPairSandbox*`, `LPSandboxInteraction/Measure/MeasureTour` adaptés), `Plugins/LPSandbox/Modules/Mods/lps_asset_integration/lps_asset_integration.lpmod`, `README.md` (commits `fece7e9a0e63b3058b5d24d96d669a3c9c0e9add` code + `b4ca206` pin, tag `lot-SB2-valide`, branche `lot/SB2-bibliotheques`) ; jeu : `Docs/Migration/etat/sandbox/SB2/SB2-VAL.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin, SB2, reports) | lot SB2 : scène (pièce, meubles), personnages et caméra extraits du socle en bibliothèques `lps_lib_scene` / `lps_lib_actors` et caméra du socle ; état de chaque mode sorti vers trois mods UObject (`lps_couple`, `lps_interaction`, `lps_asset_integration`) ; contexte filtré par prérequis ; décisions D1 à D7 (voir `etat/sandbox/SB2/SB2-CART.md`) ; validation E1 à E5 PASS + contrôle visuel utilisateur (« tout est conforme » : 3 mods, enchaînement, scène neutre D3, panneau sous MC/PNJ D5, images freeanims) ; O1 (murs et meubles invisibles au retour de Mesure) confirmé par l'utilisateur, préexistant, non corrigé (hors périmètre) | pin `82dae58` → `fece7e9` (hash complet `fece7e9a0e63b3058b5d24d96d669a3c9c0e9add`) | `.\Tools\Restore.ps1 -Lot SB2` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB2-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB2-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | diff --git a/Docs/Migration/etat/sandbox/DC0/DC0-CART.md b/Docs/Migration/etat/sandbox/DC0/DC0-CART.md new file mode 100644 index 0000000..9273e05 --- /dev/null +++ b/Docs/Migration/etat/sandbox/DC0/DC0-CART.md @@ -0,0 +1,131 @@ +# 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`). diff --git a/Docs/Migration/etat/sandbox/DC0/DC0-SPEC.md b/Docs/Migration/etat/sandbox/DC0/DC0-SPEC.md new file mode 100644 index 0000000..d421b81 --- /dev/null +++ b/Docs/Migration/etat/sandbox/DC0/DC0-SPEC.md @@ -0,0 +1,198 @@ +# 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 | diff --git a/Docs/Migration/etat/sandbox/DC0/DC0-VAL.md b/Docs/Migration/etat/sandbox/DC0/DC0-VAL.md new file mode 100644 index 0000000..89b58e0 --- /dev/null +++ b/Docs/Migration/etat/sandbox/DC0/DC0-VAL.md @@ -0,0 +1,15 @@ +# DC0-VAL : validation du lot DC0 (découplage jeu / sandbox) + +**Verdict : PASS** (cartographie et SPEC approuvées par l'utilisateur le 2026-10-07 ; documentation seule, aucun code). + +| Fiche | Agent | Modèle prévu | Modèle utilisé | Livrable | Résultat | +|---|---|---|---|---|---| +| DC0-T1a | A-CART | haiku | haiku | `DC0-CART.md`, partie (a) | Inventaire juste, avec 4 corrections par la session principale : `ModSources` = 15 fichiers suivis et non 720 ; `LPAnimMethodSelect.h` suivi ; `BuildDebug.ps1` sans référence à `ModSources` ; `LPPoseMeasure.h` non manquant car dans l'addon | +| DC0-T1b | A-CART | opus | opus | `DC0-CART.md`, partie (b) | PASS | +| DC0-T2 | A-ARCH | opus | opus | `DC0-SPEC.md` | PASS | +| DC0-T3 | Orch + utilisateur | n/a | n/a | Approbation de la SPEC | Approuvée le 2026-10-07 | +| DC0-T4 | A-DOC | sonnet | sonnet | CHG-233, `21_Sandbox_Addon.md` (cases DC0 à DC4, report DC1), `DC0-VAL.md` | PASS | + +## Points à vérifier plus tard + +- Comportement d'`AdditionalPluginDirectories` quand le dossier frère (dépôt Sandbox) est absent : à vérifier en DC2-T2 (compilation avec et sans la sandbox).