LifePlay-Revival/Docs/Migration/etat/sandbox/S3/S3-IMPL-H.md
edujiro5972 04b053554f Sandbox addon : brancher le jeu sur LifePlay-Sandbox (plugin LPSandbox).
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>
2026-10-06 21:10:53 +02:00

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 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<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() 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)