LifePlay-Revival/Docs/Migration/etat/sandbox/S7/S7-SPEC.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

4.5 KiB

S7-T1 - Contrat d'isolation du plugin LPSandbox (jeu <-> addon)

  • Fiche : S7-T1 | Role : A-ARCH | Date : 2026-10-06
  • Perimetre : specification. Les controles sont rejoues en S7-CART.md (S7-T3), l'implementation est en S7-T2.
  • Amont : 21_Sandbox_Addon.md (S1 contrat de config, S2 module LPAnimMeasure, S3 liaison sibling, S5 LPCoupleSim).
  • Plugin : D:\Game\LifePlay-Sandbox\Plugins\LPSandbox\ (modules LPSandbox, LPAnimMeasure).

Le plugin doit rester sans connaissance compilee du jeu : le jeu depend du plugin (LifePlay.Build.cs -> LPAnimMeasure), jamais l'inverse. Toute information du jeu consommee par le plugin passe par un chemin d'asset (config) ou par la reflexion UE.

Checklist de contrat (a verifier a chaque lot touchant l'addon)

C1 - Aucun include / lien vers LifePlay dans le plugin

  • Aucun #include "LifePlay.h" ni header du module LifePlay (LPShowCoupleSubsystem.h, LPDirectControlSubsystem.h, ...).
  • Aucun symbole LIFEPLAY_API (ni export, ni usage).
  • Aucune entree "LifePlay" / "LifePlayEditorTools" dans PublicDependencyModuleNames, PrivateDependencyModuleNames, DynamicallyLoadedModuleNames des *.Build.cs du plugin.
  • Aucun chemin Source/LifePlay dans le code (hors commentaires de provenance).
  • Graphe de modules : LPSandbox -> LPAnimMeasure uniquement ; LPAnimMeasure ne depend ni de LPSandbox ni du jeu.

Verification : rg sur Plugins/LPSandbox/Source (motifs en S7-CART.md). Attendu : 0 resultat hors commentaires.

C2 - Aucun chargement de graphe Blueprint GI / Person / Room

  • Pas de reference a GI, Room, BP_Room, GameInstance du jeu (nom ou chemin /Game/BPs/GI, /Game/BPs/Room).
  • Le seul Blueprint du jeu touche est Person, uniquement pour lire le CDO de la classe (rayon / demi-hauteur de capsule, profil et reponses de collision) : LoadObject<UClass>(PersonBP) puis GetDefaultObject(). Aucune instance (SpawnActor<Person>), aucun appel de fonction Blueprint, aucun ProcessEvent.
  • Le chemin du Blueprint vient de Config/LPSandbox.ini ([Sandbox.Assets] PersonBP), jamais d'un StaticClass() / include C++.
  • Le lanceur neutralise l'instance de jeu du Blueprint : -ini:Engine:[/Script/EngineSettings.GameMapsSettings]:GameInstanceClass=/Script/Engine.GameInstance (deja dans Tools/debug/LifePlay_pair_sandbox.bat).

Remarque : LoadObject sur Person.Person_C charge le package du Blueprint (donnees serialisees) ; le contrat interdit l'execution de ses graphes, pas la lecture du CDO.

C3 - SoftObjectPath / config uniquement

  • Tout asset du jeu (/Game/...) est reference par chaine de Config/LPSandbox.ini (19 cles, 6 sections, S1-SPEC.md) ou par decouverte AssetRegistry (GetSoftObjectPath().ToString()).
  • Aucun TSubclassOf<> / TObjectPtr<> / ConstructorHelpers vers un type ou un asset du jeu en dur.
  • Defaut en code = litteral historique ; fichier ou cle absents => comportement identique (repli S1).
  • Un asset introuvable journalise (LogLPSandbox / LogLPAnimMeasure), sans repli silencieux ni crash.

C4 - Montage sibling documente

  • Jeu et addon sont deux depots voisins : D:\Game\LifePlay-master 5.5\ et D:\Game\LifePlay-Sandbox\ (pas de submodule imbrique).
  • LifePlay.uproject : "AdditionalPluginDirectories": ["../LifePlay-Sandbox/Plugins"] et plugin LPSandbox declare (Enabled: true, Optional: true, voir S7-T2).
  • Pin d'addon consigne a la main (S3-INT.md, README de l'addon) a chaque evolution consommee par le jeu.
  • Documente dans 21_Sandbox_Addon.md (section S3) et le README de LifePlay-Sandbox (layout, clone sibling, pin).
  • Addon seul (LPSandbox.uproject) : Content du jeu monte par junction NTFS (documente S3).

C5 - Configurations de build (S7-T2)

  • LPSandbox.uplugin : SupportedTargetPlatforms: ["Win64"].
  • Module LPSandbox : TargetConfigurationDenyList: ["Shipping"] (le sandbox tourne en -game avec l'editeur en Development / DebugGame, jamais en Shipping).
  • Module LPAnimMeasure : pas de deny-list (le module jeu LifePlay en depend : LPCoupleSim, LPAnimRedirect).
  • Aucun TargetAllowList: ["Editor"] sur LPSandbox : trop strict, le sandbox tourne aussi en cible Game Development.

Hors perimetre

  • Staging de LPSandbox.ini pour un jeu empaquete (reste ouvert depuis S1).
  • Show complet en jeu / alignement du plancher (S5-VAL.md §4).