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

59 lines
5.4 KiB
Markdown

# S1-VAL — Validation du lot S1 (`Config/LPSandbox.ini`)
- **Date :** 2026-10-06
- **Fiche :** S1-T4 | **Rôle :** A-VAL
- **Modèle prévu :** `claude-sonnet-5-5-high` (M2) | **Modèle utilisé :** `claude-sonnet-5-5-high` (M2)
- **Références :** `S1-SPEC.md`, `S1-IMPL.md`, `S1-CART.md`
## Verdict : **PASS** (preuve statique complète ; runtime UE non exécuté, voir « Limite »)
| # | Contrôle | Résultat |
|---|---|---|
| 1 | `Config/LPSandbox.ini` existe, 19 clés du SPEC, 6 sections | **PASS** |
| 2 | `FLPSandboxConfig` compile-ready (`Get`/`Load`, defaults = SPEC) | **PASS** (revue statique, UBT non lancé) |
| 3 | `LPPairSandbox.cpp` sans `TEXT("/Game/...)` pour les clés SPEC (0 oubli S1-CART) | **PASS** |
| 4 | Lancement court du bat Pair | **BLOCKED-RUNTIME** (preuve statique PASS) |
| 5 | Test override `WorldFile` invalide | **Test manuel requis** (procédure ci-dessous) |
## 1. `Config/LPSandbox.ini`
Fichier présent. Sections : `Sandbox.Mode`, `Sandbox.Assets`, `Sandbox.Roots`, `Sandbox.Content`, `Sandbox.Sky`, `Sandbox.Output`. Les 19 clés du § 3 du SPEC sont toutes présentes avec une valeur identique au SPEC et au default de `LPSandboxConfig.h` (comparaison ligne à ligne) :
`Mode` ; `PersonBP`, `BridgetMesh`, `MichaelMesh`, `QuaterniusMannequinMesh`, `DazIdleFemale`, `DazIdleMale`, `FurnitureWallMaterial` ; `FurnitureRoot`, `DazAnimRoot`, `QuaterniusRoot`, `QuaterniusUALRoot` ; `ModuleRoot`, `WorldFile`, `ChatAction`, `QuaterniusUALDisk` ; `SkyCubemap`, `SkyIntensity` ; `MeasureOutputRoot`.
## 2. `FLPSandboxConfig` (`LPSandboxConfig.h/.cpp`)
- `static const FLPSandboxConfig& Get()` : singleton par static locale initialisée par lambda (appelle `Load()` privé, accès légal depuis un membre).
- `void Load()` : `FPaths::FileExists` puis `FConfigFile::Read(ProjectConfigDir()/LPSandbox.ini)`, lecture directe non hiérarchique ; fichier/clé absent ou valeur vide => default conservé ; `SkyIntensity` ignoré si non numérique.
- 19 champs, 19 appels `SandboxCfgReadString` (dont `SkyIntensity` via texte) : aucune clé oubliée, noms de section/clé identiques à l'ini.
- Defaults des initialiseurs de membres = littéraux du SPEC (`Mode="Pair"`, `SkyIntensity=0.6f`, etc.).
- Includes présents (`CoreMinimal.h`, `Misc/ConfigCacheIni.h`, `Misc/Paths.h`) ; `LIFEPLAY_API` sur le struct ; `#include "LPSandboxConfig.h"` dans `LPPairSandbox.cpp` (l. 8) et `LPAnimRedirect.cpp` (l. 2). Aucune erreur de syntaxe/API relevée à la lecture.
## 3. Grep littéraux (preuve d'absence d'oubli)
| Recherche | Fichier | Résultat |
|---|---|---|
| `/Game/` | `LPPairSandbox.cpp` | 0 littéral de chemin (1 seule occurrence de texte : message de log `chat.lpaction illisible`, l. 1050, non-chemin) |
| `/Game/`, `Quaternius`, `Measurement` | `LPAnimRedirect.cpp` | uniquement `FLPSandboxConfig::Get().QuaterniusUALRoot` (l. 23) |
| `vin_Base`, `work___vin01`, `Daz/Anims`, `Quaternius/UAL`, `"Measurement"`, `TEXT("Modules` | `LPPairSandbox.cpp` | 0 |
| `FLPSandboxConfig::Get().<champ>` | `LPPairSandbox.cpp` / `LPAnimRedirect.cpp` | 27 / 1 consommations |
Câblage vérifié pour les clés « discrètes » : `SkyIntensity` (l. 1001), `MeasureOutputRoot` (l. 1688, 1863, 1874, 1886, 1932), `Mode` (l. 3926-3931, branche `else` après `sandbox_mode.txt`, `Pair` = comportement inchangé). Reste hors contrat (voulu) : `*.lpaction` (extension), noms `Bridget`/`Michael`/préfixes `B_`/`M_`, `/Engine/...`. `LPInteractionSandbox.cpp` (legacy) hors périmètre S1 (noté dans S1-CART). Concorde avec `S1-CART.md` : 0 OUBLI.
## 4. Runtime — BLOCKED-RUNTIME
- `UnrealEditor.exe` **trouvé** : `D:\Game\Launcher\Engine\UE_5.5\Engine\Binaries\Win64\UnrealEditor.exe` (chemin déjà utilisé par `Tools/debug/LifePlay_pair_sandbox.bat`) ; aucun `UnrealEditor` en cours d'exécution.
- Lancement **non tenté** : `Binaries/Win64/UnrealEditor-LifePlay.dll` date du 2026-10-06 16:09 alors que `LPSandboxConfig.cpp` date de 18:18. Les sources S1 n'ont donc jamais été compilées (S1-IMPL : « UBT non exécuté ») ; un lancement chargerait l'ancien binaire (ou la boîte de dialogue de recompilation), sans rien prouver sur S1. La compilation (UBT/`BuildMod`) n'est pas dans le périmètre de cette fiche.
- Conséquence : compilation, chargement de l'ini et comportement runtime **non démontrés**. Prochaine étape : build `LifePlayEditor` puis lancer `Tools/debug/LifePlay_pair_sandbox.bat` (attendu : chambre `work___vin01` chargée, aucun `Error` `LogLifePlay` nouveau).
## 5. Test override (manuel requis)
Procédure, après compilation :
1. Sauvegarder `Config/LPSandbox.ini`. Dans `[Sandbox.Content]`, mettre `WorldFile=Modules/vin_Base/World/INEXISTANT.lpworld`.
2. Lancer `Tools/debug/LifePlay_pair_sandbox.bat`.
3. Attendu : log `LogLifePlay: Error: Sandbox collision : chambre illisible (…/Content/Modules/vin_Base/World/INEXISTANT.lpworld)` (`LPPairSandbox.cpp` l. 838) ; pièce sans meubles ; pas de repli silencieux sur le fichier par défaut (critère SPEC § 4.4).
4. Restaurer l'ini (`WorldFile=Modules/vin_Base/World/work___vin01.lpworld`), relancer : chambre normale, 54 meubles.
5. Variante sans ini : renommer temporairement le fichier ; comportement identique à la valeur par défaut (critère SPEC § 4.1).
## Limite
PASS fondé **uniquement** sur la preuve statique (ini + code branché + 0 oubli). Compilation et runtime non vérifiés ; tests 4 et 5 à exécuter manuellement après build.