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>
59 lines
5.4 KiB
Markdown
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.
|