Charge le plugin via AdditionalPluginDirectories, conserve ShowCouple et les commandlets anim côté jeu, et documente les lots S0–S8 (CHG-212 à CHG-220). Co-authored-by: Cursor <cursoragent@cursor.com>
7.3 KiB
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 addon4938abb) - Statut : compilé — cibles
LPSandboxEditoretLPSandbox(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<SWidget>. 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()appelleLPAnimRedirect::SetUALRoot(FLPSandboxConfig::Get().QuaterniusUALRoot): dépend à la fois deLPAnimMeasureet deLPSandboxConfig. Retirer les deux casse ce câblage (ajouté en S2-T2, cf.S2-IMPL-H.md§4).Source/LifePlayEditorTools/— les commandletsLPAnimEval,LPAnimCatalog,LPAnimTwistetLPAnimChecks.hconsommentLPAnimMeasure(PublicDependencyModuleNames).LPAnimMeasurene 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 deLPAnimRedirect(relevé S2).- Entrées à nettoyer si suppression :
LifePlay.uproject(moduleLPAnimMeasure),Source/LifePlay.Target.csetSource/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 leGameModepar URL :?game=/Script/LifePlay.LPPairSandboxGameMode. Côté addon, le chemin devient/Script/LPSandbox.LPPairSandboxGameMode(idemLPInteractionGameMode) et le.uprojectchange. Il n'y a aucun autre point d'entrée : rien dansConfig/*.inini dans le code du jeu n'instancie cesGameMode.Config/LPSandbox.iniexiste désormais en double ; le contratS1-SPEC.mdreste 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) |