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

201 lines
13 KiB
Markdown

# S4-T1 : cartographie de LPPairSandbox.cpp
Role A-CART. Lecture seule : aucun fichier du plugin n'a ete modifie.
Source : `D:\Game\LifePlay-Sandbox\Plugins\LPSandbox\Source\LPSandbox\LPPairSandbox.cpp`
Taille mesuree : **4274 lignes** (`LPPairSandbox.h` : 322 lignes, `LPInteractionSandbox.cpp` : 441, `LPSandboxConfig.cpp` : 73).
Objectif : aucun fichier > ~800 LOC.
## 1. Constat
- Le .cpp contient 4 classes (UCLASS dans le .h) : `ALPPairSandboxStage`, `ALPPairSandboxCharacter`, `ALPPairSandboxGameMode`, plus les structs `FPairSandboxMenu` (l. 57-77) et `PairSandbox::*` (l. 79-823, machine virtuelle `lpaction`, catalogue, lecture `.lpworld`).
- Les UCLASS restent dans `LPPairSandbox.h` : seul le .cpp se decoupe, sans toucher a UHT. Les membres prives restent accessibles car chaque nouveau .cpp n'implemente que des methodes des memes classes.
- Quatre fonctions depassent 150 lignes et doivent etre decoupees en sous-methodes, sinon l'objectif ~800 LOC reste tenable mais la lisibilite non :
| Fonction | Lignes | Taille |
|---|---|---|
| `ALPPairSandboxCharacter::ShowAnimMenu` | 3363-3939 | 577 |
| `ALPPairSandboxStage::BeginMeasure` | 1290-1664 | 375 |
| `ALPPairSandboxCharacter::Tick` | 3940-4247 | 308 |
| `ALPPairSandboxStage::Build` | 831-1042 | 213 |
| `ALPPairSandboxStage::TickTour` | 2068-2196 | ~130 |
## 2. Carte par unite (lignes actuelles)
### 2.1 RoomBuilder (lpworld, murs, mobilier, eclairage)
| Bloc | Lignes | LOC | Contenu |
|---|---|---|---|
| `FProp`, `Token`, `LoadWorldFile` | 748-823 | 76 | lecture `work___vin01.lpworld` (echelle, props) |
| `Stage::Stage()` (ctor) | 825-829 | 5 | RootComponent |
| `Build` partie piece | 831-953 | 123 | meubles `StaticMeshComponent`, lambda `Shell` (4 murs + plafond + sol), capsule Person, recherche du point de depart libre |
| `Build` partie eclairage | 954-1040 | 87 | 2 directionnelles, SkyLight, SkyAtmosphere, BP_Sky_Sphere |
| `Build` fin | 1041-1042 | 2 | appel `LoadChat`, `LoadActions` (reste dans l'orchestrateur) |
Total source : ~290 LOC.
### 2.2 CoupleSim (box, weld, capsule, animation de paire)
| Bloc | Lignes | LOC | Contenu |
|---|---|---|---|
| `PlayIdle`, `ConfigureCapsule`, `Weld`, `Apply`, `ToggleFurniture`, `ToggleCapsules` | 1072-1165 | 94 | idle Daz, capsule copiee de Person, soudure partenaire, collisions |
| `PlayPair`, `MoveCouple` | 2528-2599 | 72 | animation de paire, deplacement avec blocage par la box |
| `FitCoupleBox` | 2600-2712 | 113 | boite englobante du couple (lambda `Accumulate` 2609-2661) |
| `Character::LoadQuaternius`, `SelectBody`, `ApplyBody` | 2958-3060 | 103 | corps Quaternius / Bridget / Michael / mannequin |
| `Character::RefreshPose`, `PlayWalk` | 3063-3135 | 73 | pose d'interaction, marche |
Total source : ~455 LOC.
### 2.3 InteractionFilters (VM lpaction, catalogue, chat)
| Bloc | Lignes | LOC | Contenu |
|---|---|---|---|
| Types `FAction`, `FPerson`, `FVal`, `FEnv`, `EKind`, `FTok`, globales `Catalog`, `PlaceChoices`, `WhenChoices`, `MakePerson` | 79-153 | ~75 | modele de donnees |
| `Tokenize` + `FWhoEval` (`Eat`, `Resolve`, `Call`, `ReadArgs`, `Primary`, `Unary`, `Add`, `Compare`, `And`, `Expr`) | 155-548 | 394 | analyseur et evaluateur des conditions WHO |
| `WhoAllows`, `WhereHas`, `LoadActions`, `CollectActions` | 549-685 et 727-747 | ~158 | filtrage du catalogue `.lpaction` |
| `ReadInteractKey` | 686-726 | 41 | touche d'interaction depuis l'ini d'entree |
| `Stage::LoadChat` | 1044-1070 | 27 | `chat.lpaction` |
| `Stage::BeginInteraction` | 1167-1208 | 42 | entree dans le mode Interaction |
| `Character::ApplyInteractionView` | 3136-3178 | 43 | vues interaction / dessus / yeux |
| `Character::ApplyFilters` | 2950-2957 | 8 | rafraichit le chat |
| `ShowChat`, `HideChat` | 3179-3274 | 96 | liste des actions filtrees (Slate) |
| `RefreshInteractKey`, `ShowKeyMark`, `HideKeyMark`, `PlaceKeyMark` | 3275-3362 | 88 | pastille de touche |
| Panneau filtres (flags WHO1 / WHO2, combos lieu / heure / race) | 3560-3641, 3642-3676, 3845-3890 | ~170 | partie de `ShowAnimMenu` |
| Bloc interaction de `Tick` | 4017-4119 | 103 | marche, distance, touche E |
Total source : ~1290 LOC.
### 2.4 MeasureUI (mesure, tournee, vignettes, planches, panneau Slate)
| Bloc | Lignes | LOC | Contenu |
|---|---|---|---|
| `EndMeasure` | 1209-1289 | 81 | nettoyage de la scene de mesure |
| `BeginMeasure` | 1290-1664 | 375 | scene, lambda `Place` (1370-1445), lambda `RunClip` (1446-1593), anneau de 6 cameras (1601-1642), score des vues |
| `ReplayMeasure`, `ShowBestModel` | 1665-1678 | 14 | |
| Namespace `PairSandboxAuto` | 1679-1698 | 20 | constantes et chemins des captures auto |
| `ToggleRaw`, `ToggleFormula`, `ToggleT`, `SetAutoRun`, `TickAuto` | 1700-1851 | 152 | boucle automatique |
| Namespace `PairSandboxTour` | 1853-1888 | 36 | constantes tournee, vignettes, planches |
| `GetMeasureClips`, `ShowFormulaDefault`, `BrowseClip`, `BrowseTime` | 1890-1988 | 99 | clips, vue par defaut |
| `StartTour`, `TickTour` | 1989-2196 | 208 | tournee des clips |
| `SaveVignette`, `SavePlancheFrame`, `WritePlanche` | 2197-2307 | 111 | PNG 512 px, JPEG 256 px |
| `GetMeasureCameraName`, `UseMeasureCamera`, `SetFreeView`, `MoveFreeView` | 2309-2399 | 91 | cameras fixes et libre |
| `DrawMeasureFigures`, `ScoreMeasureViews` | 2400-2527 | 128 | calques, squelettes, ecart par camera |
| Panneau Mesure (`MeasureHolder`, boutons, Auto, Tournee) | 3706-3832 | 127 | partie de `ShowAnimMenu` |
| Branche Mesure de `SelectMode` | 2877-2906 | ~30 | |
| Entrees clavier Mesure de `Tick` (0-9, R, M, T, F, N, P, PgUp, PgDn, camera libre) | 4125-4211 | 87 | |
| Libelles flottants Mesure de `Tick` | 4212-4240 | ~29 | |
Total source : ~1590 LOC.
### 2.5 Stage / GameMode / Character (reste)
| Bloc | Lignes | LOC | Contenu |
|---|---|---|---|
| Includes + `FPairSandboxMenu` | 1-77 | 77 | |
| `Stage::Possess` | 2713-2745 | 33 | |
| `Character` ctor | 2746-2768 | 23 | spring arm, camera |
| `SetStage`, `EndPlay`, `ResetView` | 2769-2824 | 56 | |
| `SelectAnim`, `SelectMode` (hors Mesure), `SelectView`, `SelectWalk` | 2825-2949 | ~100 | |
| `ShowAnimMenu` : preparation, combos, ossature Slate, fin (mode persistant) | 3363-3705, 3833-3844, 3876-3939 | ~420 | |
| `Tick` commun (souris, ZQSD, chute, Echap) | 3940-4016, 4120-4124 | ~82 | |
| `GameMode` | 4240-4274 | ~35 | |
Total source : ~830 LOC.
Controle : 290 + 455 + 1290 + 1590 + 830 = 4455, soit un ecart de ~180 lignes avec 4274 : les chevauchements (`ShowAnimMenu` et `Tick` sont comptes dans plusieurs unites par tranche, bornes approximatives).
## 3. Plan de fichiers propose
Dossier plat conserve (`PublicIncludePaths.Add(ModuleDirectory)` dans `LPSandbox.Build.cs`) : aucun changement de `.Build.cs` necessaire, UBT ramasse les nouveaux `.cpp` du dossier. Les LOC estimes incluent ~20-35 lignes d'includes par fichier (le .cpp d'origine en porte 55).
### 3.1 Fichiers conserves
| Fichier | LOC estime | Role |
|---|---|---|
| `LPPairSandbox.h` | ~340 | UCLASS inchangees ; +4 declarations privees (`BuildRoom`, `BuildLighting`, `RunMeasureClip`, `BuildMenuPanels`) ; `FLPMeasureFigure` y reste |
| `LPPairSandbox.cpp` | ~150 | ctor Stage, `Build` (orchestrateur), `Possess`, `GameMode` |
| `LPPairSandboxCharacter.cpp` (nouveau) | ~330 | ctor, `SetStage`, `EndPlay`, `ResetView`, `Select*`, `Tick` commun |
### 3.2 Unite RoomBuilder
| Fichier | LOC estime | Contenu |
|---|---|---|
| `LPSandboxWorldFile.h` | ~30 | `FProp`, `LoadWorldFile` |
| `LPSandboxWorldFile.cpp` | ~100 | `Token`, `LoadWorldFile` (748-823) |
| `LPSandboxRoomBuilder.cpp` | ~160 | `Stage::BuildRoom` (831-953) |
| `LPSandboxLighting.cpp` | ~120 | `Stage::BuildLighting` (954-1040) |
### 3.3 Unite CoupleSim
| Fichier | LOC estime | Contenu |
|---|---|---|
| `LPCoupleSim.cpp` | ~200 | 1072-1165 + 2528-2599 |
| `LPCoupleBox.cpp` | ~150 | `FitCoupleBox` (2600-2712) |
| `LPSandboxBodies.cpp` | ~215 | 2958-3135 (corps, pose, marche) |
### 3.4 Unite InteractionFilters
| Fichier | LOC estime | Contenu |
|---|---|---|
| `LPSandboxActionVM.h` | ~110 | types `PairSandbox::*` (79-153) + declarations (`MakePerson`, `WhoAllows`, `CollectActions`, `ReadInteractKey`, `LoadActions`) + `extern` des globales |
| `LPSandboxActionVM.cpp` | ~430 | `Tokenize` + `FWhoEval` (155-548) |
| `LPSandboxActionCatalog.cpp` | ~260 | 549-747 + `Stage::LoadChat` |
| `LPInteractionMode.cpp` | ~230 | `BeginInteraction`, `ApplyInteractionView`, `ApplyFilters`, bloc interaction du `Tick` (extrait en `TickInteraction`) |
| `LPChatUI.cpp` | ~210 | `ShowChat`, `HideChat`, pastille de touche (3179-3362) |
| `LPFilterPanel.cpp` | ~190 | panneau WHO1 / WHO2 / lieu / heure (extrait de `ShowAnimMenu`) |
### 3.5 Unite MeasureUI
| Fichier | LOC estime | Contenu |
|---|---|---|
| `LPMeasureShared.h` | ~70 | constantes et chemins de `PairSandboxAuto` et `PairSandboxTour` (en `inline constexpr` / `inline` pour partage) |
| `LPMeasureScene.cpp` | ~350 | `EndMeasure`, `BeginMeasure` (hors RunClip et cameras), `ReplayMeasure`, `ShowBestModel` |
| `LPMeasureClip.cpp` | ~190 | `RunMeasureClip` (lambdas `Place` + `RunClip`, 1370-1593) |
| `LPMeasureAuto.cpp` | ~185 | 1700-1851 |
| `LPMeasureTour.cpp` | ~340 | 1890-2196 |
| `LPMeasureCapture.cpp` | ~150 | vignettes, planches (2197-2307) |
| `LPMeasureCameras.cpp` | ~170 | 2309-2399 + anneau de cameras (1601-1642, extrait en `SpawnMeasureCameras`) |
| `LPMeasureOverlay.cpp` | ~165 | `DrawMeasureFigures`, `ScoreMeasureViews` |
| `LPMeasurePanel.cpp` | ~300 | panneau Slate (3706-3832), touches (4125-4211), libelles (4212-4240), branche Mesure de `SelectMode` |
### 3.6 Menu (partage entre unites)
| Fichier | LOC estime | Contenu |
|---|---|---|
| `LPPairSandboxMenu.h` | ~30 | `FPairSandboxMenu` (57-77) |
| `LPSandboxMenu.cpp` | ~470 | `ShowAnimMenu` : liste des animations, Modes / Vues / Marche / Corps, ossature Slate ; appelle `BuildMeasurePanel` et `BuildFilterPanel` |
## 4. Totaux et verification de l'objectif
| Unite | Fichiers | LOC estime | Plus gros fichier |
|---|---|---|---|
| RoomBuilder | 4 | ~410 | 160 |
| CoupleSim | 3 | ~565 | 215 |
| InteractionFilters | 6 | ~1430 | 430 |
| MeasureUI | 9 | ~1920 | 350 |
| Stage / GameMode / Character | 3 + 2 menu | ~1020 | 470 |
| **Total** | **27** | **~5350** | **470** |
- Plus gros fichier : `LPSandboxMenu.cpp` (~470). Marge d'environ 40 % sous 800 LOC.
- Le total passe de 4274 a ~5350 : surcout de ~1000 lignes, imputable aux includes repetes (~25 fichiers x ~25 lignes), aux en-tetes internes et aux signatures des fonctions extraites.
- Les UCLASS ne bougent pas : aucun risque de regeneration UHT incoherente.
## 5. Risques et points d'attention
1. **Namespaces anonymes partages** : `PairSandboxAuto` et `PairSandboxTour` sont utilises par Auto, Tour, Capture et Scene. A deplacer dans `LPMeasureShared.h` en `inline constexpr` / fonctions `inline`, sinon duplication ODR entre .cpp.
2. **Globales `PairSandbox::Catalog / PlaceChoices / WhenChoices`** : definies dans `LPSandboxActionCatalog.cpp`, `extern` dans `LPSandboxActionVM.h`.
3. **Lambdas a pointeur de membre** : le lambda `Flag` (`bool ALPPairSandboxCharacter::*`) exige l'acces prive : `BuildFilterPanel` doit etre une methode membre, pas une fonction libre.
4. **`static bool bPoseWritten`** (`ShowFormulaDefault`, 1918) : reste local au .cpp Tour, ne pas dupliquer.
5. **Unity build** : le module a `PCHUsage = UseExplicitOrSharedPCHs` ; verifier avec et sans unity (`bUseUnity=false`) que les includes de chaque nouveau .cpp suffisent.
6. **Doublon connu** : `LPInteractionSandbox.cpp` (441 LOC) reimplemente `LoadChat`, `ShowChat`, `HideChat`. A ne pas fusionner dans S4 (hors perimetre), mais `LPChatUI.cpp` pourra servir de base a un dedoublonnage ulterieur.
7. **Tick** : l'ordre des blocs (souris, deplacement, interaction, Echap, mesure, libelles) doit etre conserve exactement lors de l'extraction en `TickInteraction` / `TickMeasureInput` / `TickMeasureLabels`.
## 6. Ordre de migration recommande (un commit par etape, build + capture de reference entre chaque)
1. Extraire `LPSandboxActionVM.h/.cpp` et `LPSandboxActionCatalog.cpp` (code libre, sans UObject : risque minimal).
2. Extraire `LPSandboxWorldFile` puis `BuildRoom` / `BuildLighting` (RoomBuilder).
3. Extraire CoupleSim (`LPCoupleSim`, `LPCoupleBox`, `LPSandboxBodies`).
4. Extraire `LPChatUI`, `LPInteractionMode`.
5. Extraire `LPMeasureShared.h` puis Capture, Tour, Auto, Overlay, Cameras.
6. Decouper `BeginMeasure` (`RunMeasureClip`, `SpawnMeasureCameras`) et `ShowAnimMenu` (`BuildMeasurePanel`, `BuildFilterPanel`), puis `Tick`.
7. Verifier : build Win64 Development, lancement des 3 modes (Pair, Interaction, Mesure), comparaison de `Saved/Measurement/tour.csv` et d'une vignette avant / apres.