# S3-IMPL-H — Transfert du code sandbox vers le repo addon - **Date :** 2026-10-06 - **Fiche :** S3-T2 | **Agent :** A-IMPL-H | **Rôle :** Implémentation - **Modèle prévu :** `claude-opus-5-thinking-high` (M3) - **Amont :** `S3/S3-INT-scaffold.md` (S3-T1, commit addon `4938abb`) - **Statut :** **compilé** — cibles `LPSandboxEditor` **et** `LPSandbox` (Win64 Development), 0 erreur / 0 avertissement ; commit dans le repo addon uniquement - **Fiche détaillée (côté addon) :** `D:\Game\LifePlay-Sandbox\Docs\S3-move.md` > **Le repo jeu n'est pas modifié par cette fiche, hors ce document.** Les fichiers transférés sont toujours en place sous `Source/` — leur suppression est le lot **S3-T3**. Aucun submodule n'est branché. --- ## 1. Ce qui a été copié (jeu → addon) | Source (repo jeu) | Destination (repo addon) | Modifications | |---|---|---| | `Source/LPAnimMeasure/` (10 fichiers) | `Plugins/LPSandbox/Source/LPAnimMeasure/` | **aucune** — identiques à l'octet près | | `Source/LifePlay/LPPairSandbox.h` / `.cpp` | `Plugins/LPSandbox/Source/LPSandbox/` | renommages §2 | | `Source/LifePlay/LPInteractionSandbox.h` / `.cpp` | `Plugins/LPSandbox/Source/LPSandbox/` | renommages §2 | | `Source/LifePlay/LPSandboxConfig.h` / `.cpp` | `Plugins/LPSandbox/Source/LPSandbox/` | renommages §2 | | `Config/LPSandbox.ini` | `Config/LPSandbox.ini` | **aucune** | `LPAnimMeasure.Build.cs` du scaffold a été conservé (déjà conforme : `PublicIncludePaths.Add(ModuleDirectory)`, `Public = Core, CoreUObject, Engine`, `Private = Json`), seul son commentaire d'en-tête a été actualisé. Les deux autres stubs (`LPAnimMeasure.h/.cpp`) ont été remplacés par les versions du jeu. ## 2. Renommages appliqués (module `LPSandbox` seulement) | Renommage | Occurrences | |---|---| | `LIFEPLAY_API` → `LPSANDBOX_API` | 7 | | `#include "LifePlay.h"` → `#include "LPSandbox.h"` | 2 | | `LogLifePlay` → `LogLPSandbox` | 49 (`LPPairSandbox.cpp` 43, `LPInteractionSandbox.cpp` 6) | La catégorie `LogLPSandbox` existait déjà dans le scaffold (`LPSandbox.h` / `.cpp`). `LPAnimMeasure` n'a eu besoin d'aucun renommage : le lot S2 avait déjà coupé son couplage. **Fidélité vérifiée** : en réappliquant ces trois renommages en sens inverse, les 6 fichiers de `LPSandbox` redonnent exactement les octets des originaux du jeu (fins de ligne et caractères non-ASCII des commentaires inclus). Aucune divergence fonctionnelle n'a été introduite : toute dérive future entre les deux copies sera donc imputable à S3-T3 ou au-delà. ## 3. Couplage résiduel vers `LifePlay` : nul `Plugins/LPSandbox/Source/` ne contient plus aucun `LIFEPLAY_API`, `LogLifePlay` ni `#include "LifePlay.h"`. Il reste 2 mentions du mot `LifePlay`, dans des commentaires citant les lanceurs `Tools/debug/LifePlay_*_sandbox.bat`. Le relevé des identifiants `ULP*` / `ALP*` / `FLP*` référencés par les fichiers transférés ne donne que les classes de la sandbox elle-même et trois types de `LPAnimMeasure` (`FLPPose`, `FLPPoseMeasureReport`, `FLPOrchestratorRound`). Le `Person` du jeu est résolu par chemin d'asset (`/Game/BPs/Person.Person_C`), jamais par include : rien de C++ ne reste à casser. ## 4. Dépendances déclarées côté addon ``` LPSandbox Public : Core, CoreUObject, Engine, InputCore, SlateCore, LPAnimMeasure Private : Slate, ImageWrapper, AssetRegistry, Json LPAnimMeasure Public : Core, CoreUObject, Engine Private : Json ``` `InputCore` et `SlateCore` sont publics parce que les headers exposent respectivement un `FKey` et des `TSharedPtr`. `LPAnimMeasure` est public par parité avec `LifePlay.Build.cs`. Non reprises de `LifePlay.Build.cs`, inutiles à la sandbox : `NavigationSystem`, `EngineSettings`, `Projects`, `UMG`, `Chaos`, `ApplicationCore`. ## 5. Cibles du projet conteneur Le scaffold S3-T1 n'avait pas de `Source/`, donc aucun build CLI possible (point d'attention §5 de `S3-INT-scaffold.md`). Ajouté côté addon : `Source/LPSandboxEditor.Target.cs`, `Source/LPSandbox.Target.cs` et un module de jeu primaire vide `Source/LPSandboxApp/`. Mesure à l'appui de ce dernier choix : la cible **Editor** avec `ExtraModuleNames = []` compile et lie correctement, mais la cible **Game** échoue en `LNK1120: 9 externes non résolus` (`FMemory_Malloc`, `FMemory_Realloc`, `FMemory_Free`, `GNameBlocksDebug`, `GObjectArrayForDebugVisualizers`, `GDebuggingState`) faute de module de jeu primaire dans le binaire monolithique. `LPSandboxApp` (`IMPLEMENT_PRIMARY_GAME_MODULE`) est donc le module factice que la fiche autorisait ; les deux cibles le référencent. ## 6. Validation | Cible | Résultat | |---|---| | `LPSandboxEditor Win64 Development` | succès — `UnrealEditor-LPSandbox.dll`, `UnrealEditor-LPAnimMeasure.dll`, `UnrealEditor-LPSandboxApp.dll` | | `LPSandbox Win64 Development` (Game) | succès — `Binaries/Win64/LPSandbox.exe` | L'effet de bord unity rencontré en S2 (`UTextureCube` dans `LPInteractionSandbox.cpp`) ne s'est pas reproduit : le correctif fait partie des sources transférées. Le jeu n'a pas été recompilé : il est inchangé, donc son état de build reste celui de S2-T2. ## 7. Conséquences pour S3-T3 (suppression côté jeu) Points à traiter lors de la suppression, repérés pendant le transfert : - `Source/LifePlay/LifePlay.cpp` — `FLifePlayModule::StartupModule()` appelle `LPAnimRedirect::SetUALRoot(FLPSandboxConfig::Get().QuaterniusUALRoot)` : dépend **à la fois** de `LPAnimMeasure` et de `LPSandboxConfig`. Retirer les deux casse ce câblage (ajouté en S2-T2, cf. `S2-IMPL-H.md` §4). - `Source/LifePlayEditorTools/` — les commandlets `LPAnimEval`, `LPAnimCatalog`, `LPAnimTwist` et `LPAnimChecks.h` consomment `LPAnimMeasure` (`PublicDependencyModuleNames`). `LPAnimMeasure` ne peut donc pas disparaître du jeu sans décision sur ces commandlets. - `Source/LifePlay/LPDirectControlSubsystem.cpp:879` — détecte la sandbox par **nom de classe en chaîne** : `Mode->GetClass()->GetName().Contains(TEXT("LPPairSandbox"))`. Le test survit au changement de module (le nom de classe est inchangé), mais il devient du code mort dans le jeu une fois la sandbox retirée. Ce fichier est aussi consommateur de `LPAnimRedirect` (relevé S2). - Entrées à nettoyer si suppression : `LifePlay.uproject` (module `LPAnimMeasure`), `Source/LifePlay.Target.cs` et `Source/LifePlayEditor.Target.cs` (`ExtraModuleNames`), `Source/LifePlay/LifePlay.Build.cs` (`PublicDependencyModuleNames.Add("LPAnimMeasure")`), `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs`. - `Tools/debug/LifePlay_*_sandbox.bat` — les lanceurs passent le `GameMode` par URL : `?game=/Script/LifePlay.LPPairSandboxGameMode`. Côté addon, le chemin devient **`/Script/LPSandbox.LPPairSandboxGameMode`** (idem `LPInteractionGameMode`) et le `.uproject` change. Il n'y a aucun autre point d'entrée : rien dans `Config/*.ini` ni dans le code du jeu n'instancie ces `GameMode`. - `Config/LPSandbox.ini` existe désormais en double ; le contrat `S1-SPEC.md` reste la référence des deux copies. ## 8. Commits | Repo | Action | |---|---| | `LifePlay-Sandbox` (addon) | 1 commit (`S3-T2: transfert du code sandbox depuis le jeu`) | | `LifePlay` (jeu) | **aucun** — seul ce document est ajouté, non committé (consigne de la fiche) |