LifePlay-Revival/Docs/Migration/etat/ST/STG/STG-SF4b-VAL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

80 lines
9.4 KiB
Markdown

Fiche STG-SF4bv — Niveau N1 — Modèle prévu lp-validator | utilisé claude-sonnet-5-5 — Agent lp-validator — Skills lp-validate, sk-protocol, sk-recount, debug-verification
# STG-SF4b-VAL : validation statique de S-F4b et M1c (2026-10-13)
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8` (relevée). Aucune compilation, aucun lancement, aucune écriture dans le jeu.
## 1. Fiches amont relues
- `STG-SF4b-DIAG.md` (en entier) : motif § 3, correctif § 4.
- `STG-SF4-VAL.md` (verdict relu : PASS-STATIC, contrôles a-d conformes ; S-F4 déjà validé, non rejoué).
- `STG-SF4b.patch` présent dans le dossier du lot : non utilisé, le diff est refait contre l'instantané.
- Aucune IMPL formelle `STG-SF4b-IMPL.md` (Glob `STG-SF4b*` : DIAG et .patch seulement) : aucun « point à confirmer » d'IMPL à reprendre (section 2).
## 2. Points à confirmer des IMPL
sans objet : aucune IMPL SF4b (Glob ci-dessus). Les points que le DIAG laisse à la mesure sont en section 6.
## 3. Critères rejoués
Diff : `diff <instantané>\Source\LifePlay\<f> Source\LifePlay\<f>` pour les 4 fichiers, instantané `D:\Game\LifePlay_Backup_5.5\STG-SF4b\`.
MD5 relus (`md5sum`) : OutdoorRoom.cpp `6f1212d6…`, .h `df2a04b3…`, Debug.cpp `57880954…`, Debug.h `78d3a079…` = valeurs annoncées ; Debug.h identique à l'instantané (diff vide).
| Contrôle | Résultat | Verdict |
|---|---|---|
| a. Périmètre du diff | `git status --short -- Source` : 4 fichiers M (Outdoor .cpp/.h, Debug .cpp/.h) + `LPCameraModeSubsystem.cpp/.h` non suivis (lot CAM, hors fiche, non lus). Diff de CE changement : OutdoorRoom.cpp (includes, constantes, Tick, 2 fonctions ; aucune ligne supprimée), OutdoorRoom.h (commentaire, 2 déclarations, 2 membres, 2 forward decl ; aucune suppression), Debug.cpp 1 ligne remplacée (l. 365-366 : commentaire + `FCollisionQueryParams Query(TEXT("LPPersonsDump"), true)`, seul changement fonctionnel `false` → `true`), Debug.h inchangé. | PASS-STATIC |
| b. API (UE 5.8, `…\Engine\Source\Runtime`) | voir tableau ci-dessous | PASS-STATIC |
| c. Logique | voir sous-tableau ci-dessous | PASS-STATIC |
| d. Fins de ligne / compte | `Tools\FileCheck.ps1` sur les 4 fichiers : OutdoorRoom.cpp LF (CRLF 0, LF 208, CR 0), .h LF (0 / 63 / 0), Debug.cpp CRLF (751 / 0 / 0), Debug.h CRLF (53 / 0 / 0) ; `alertes=0`, code 0. Recherche le nom du compte et `C:\Users` dans les 3 fichiers modifiés : aucune occurrence (code grep 1). | PASS-STATIC |
### b. API
| Appel | Source moteur | Lu |
|---|---|---|
| `AActor::GetComponents(TArray<T*, Alloc>&, bool) const` | `Engine/Classes/GameFramework/Actor.h:4024` (const, donc OK sur `const AActor*`) | oui |
| `TInlineComponentArray<T, N = NumInlinedActorComponents>` | `Actor.h:227-228` (dérive de `TArray<T, TInlineAllocator<N>>`, 2e paramètre par défaut) | oui |
| `UStaticMeshComponent::GetStaticMesh() const` (rend `TObjectPtr<UStaticMesh>`) | `Engine/Classes/Components/StaticMeshComponent.h:453` | oui ; `cond ? TObjectPtr : nullptr` puis affectation à `const UStaticMesh*` : conversion implicite, estimé sans risque (non compilé) |
| `Get/SetCollisionResponseToChannel` | `Components/PrimitiveComponent.h:2635` (const) et `:2944` | oui |
| `TWeakObjectPtr<UPrimitiveComponent>` `==` `UStaticMeshComponent*` (pour `Contains`) | `Core/Public/UObject/WeakObjectPtrTemplates.h:340-345` (`UEOpEquals(const RhsT*)`, contrainte `(T*)nullptr == (RhsT*)nullptr` vraie car UStaticMeshComponent dérive de UPrimitiveComponent) ; `TArray::Contains` : `Core/Public/Containers/Array.h:1757` (`ComparisonType`) | oui ; la génération de `operator==` à partir de `UEOpEquals` n'a pas été lue : estimé |
| `FCollisionQueryParams(FName, bool bInTraceComplex = false, const AActor* = NULL)` | `Engine/Public/CollisionQueryParams.h:231` | oui |
### c. Logique
| # | Point | Preuve | Verdict |
|---|---|---|---|
| 1 | Extérieur seulement, même critère que WallT et Box | `LPOutdoorRoomSubsystem.cpp:70` `bOutdoor = Root->GetRelativeScale3D().Z < OutdoorScaleZ`, utilisé l. 73 (Box), l. 75 (décors), l. 93 (WallT) | PASS-STATIC |
| 2 | Seulement `UStaticMeshComponent` de Room, maillage `fnt_ext*`, qui étaient en Block | l. 170-171 (`GetComponents` sur Room), l. 175-177 (asset non nul, `StartsWith("fnt_ext")` avec le préfixe de la l. 24, pas déjà mémorisé, réponse Pawn == Block). Sensibilité à la casse de `StartsWith` : non vérifiée (défaut moteur supposé insensible) | PASS-STATIC |
| 3 | Mémorisé, rendu en Block en intérieur et à Deinitialize | mémorisation l. 182 ; sortie : `else if (IgnoredDecor.Num() > 0) RestoreDecor()` l. 84-87 ; `Deinitialize` l. 45 ; `RestoreDecor` l. 191-208 remet Block (l. 198) et vide la liste (l. 206) | PASS-STATIC |
| 4 | Journaux | entrée l. 187 « … decor(s) fnt_ext en Pawn Ignore (%d en tout) » (si Added > 0) ; sortie l. 204 « Decors fnt_ext rendus en Pawn Block : %d (sur %d …) » (si liste non vide) | PASS-STATIC |
| 5 | Coexistence ShowCouple | voir ci-dessous | PASS-STATIC, avec risque R1 |
| 6 | S-F4 et WallT inchangés | le diff n'ajoute que : 2 includes, 2 constantes (l. 23-25), l. 45, l. 75-87 (avant `if (!Ceiling)`), et les 2 fonctions finales ; `UpdateFloor`, `RestoreFloor`, bloc WallT (l. 88-104) sont hors des blocs du diff, aucune ligne `<` dans le diff OutdoorRoom | PASS-STATIC |
| 7 | Pointeurs nuls, DeltaTime | `Root` n'est non nul que si `IsValid(Room)` (l. 52) et `return true` l. 66-68 avant tout usage de `Room` aux l. 75-87 ; `Mesh ? … : nullptr` et `!Asset` l. 175 ; `Comp.Get()` testé l. 196 ; `DeltaTime` additionné l. 77, seuil 0,5 s (l. 25). Premier balayage après 0,5 s, pas à l'entrée même (R2). | PASS-STATIC |
Coexistence avec ShowCouple (point 5), lu `LPShowCoupleSubsystem.cpp:582-642` et `:644-675` :
- `BlockRoomPawn` parcourt les composants de Room (l. 567, `bInRoom`) ; un composant en Ignore non encore mémorisé passe en Block et est enregistré avec la réponse `ECR_Ignore` (l. 623-624).
- Pendant une scène en extérieur, les décors de S-F4b sont mis en Block par ShowCouple. S-F4b ne les re-bascule pas : `IgnoredDecor.Contains(Mesh)` est vrai (l. 176) et il `continue`, que le composant soit en Ignore ou en Block. Vérifié.
- `Release` (l. 652-658) rend ces composants à Ignore : retour à l'état S-F4b, composants toujours dans `IgnoredDecor`.
- Cas « sortie d'extérieur pendant une scène de couple » : `bOutdoor` devient faux, `RestoreDecor` met Block (déjà Block par ShowCouple) et vide `IgnoredDecor`. À la fin de la scène, `Release` remet Ignore sur les composants mémorisés par ShowCouple. Si ces composants existent encore (Room non détruite, lieu intérieur), le décor `fnt_ext` reste en Pawn Ignore en intérieur et rien ne le rend plus à Block : défaut résiduel (R1). Si le changement de lieu détruit les composants (supposé, non vérifié), les pointeurs faibles de ShowCouple sont morts et il n'y a pas d'effet.
- Cas inverse (scène commencée avant le 1er balayage) : ShowCouple n'a pas mémorisé les décors (ils étaient en Block), S-F4b les passe en Ignore pendant la scène ; ils ne bloquent pas le couple (effet voulu en extérieur, mineur).
## 4. Diff lu en entier
- `LPOutdoorRoomSubsystem.cpp` : tous les blocs du diff lus, et fichier relu l. 1-210 ; aucune ligne supprimée.
- `LPOutdoorRoomSubsystem.h` : tous les blocs lus, fichier relu en entier ; aucune ligne supprimée.
- `LPDebugSubsystem.cpp` : 1 bloc (1 ligne remplacée par 2), lu. Le `git diff --stat -- Source` global (Debug.cpp +250 lignes, etc.) cumule des lots antérieurs non commités : hors périmètre, non relu.
- `LPDebugSubsystem.h` : diff vide.
- Compte : 3 fichiers changés par ce changement, 1 inchangé.
## 5. Verdict
**PASS-STATIC.** Contrôles a, b, c (1 à 7), d conformes. Rien n'a été compilé ni exécuté (interdit par la fiche) : erreurs de compilation éventuelles, effet en jeu (personnages libérés dans la street, `floorHit` > 0) et mesure M1c restent à prouver dans COMMUN-3. `Build.ps1 -FromLog` et `LPTestStringCompat` : sans objet (pas de build dans cette fiche).
Risques (non bloquants) :
- R1 : sortie d'extérieur pendant une scène de couple : décor `fnt_ext` possiblement laissé en Pawn Ignore si les composants survivent au changement de lieu (estimé, non mesuré). À contrôler en COMMUN-3 par le journal « rendus en Pawn Block » suivi d'une scène de couple.
- R2 : jusqu'à 0,5 s de collision de décor à l'entrée en street (premier balayage différé) ; une capsule déjà « stuck » est libérée par le moteur au balayage suivant (non mesuré).
- R3 : arbres et façades des décors extérieurs traversables en extérieur (risque déjà noté au DIAG § 4).
- R4 : le préfixe `fnt_ext` attrape tout maillage ainsi nommé, y compris un éventuel décor voulu solide ; le DIAG ne cite que street, plage, forêt.
- R5 : M1c passe en trace complexe pour tout `LPPersonsDump` (outil de debug, coût de mesure seulement).
## 6. Points à confirmer par l'utilisateur
- [ ] COMMUN-3 : compilation `LifePlayEditor` sans erreur (conversion `TObjectPtr` et `Contains` en particulier).
- [ ] COMMUN-3 : en street, personnages à hauteur du pavé et joueuse qui marche ; valeur `delta` pieds / pavé issue de M1c (suite S-F1 / S-F2 selon DIAG § 4).
- [ ] COMMUN-3 : journal « … en Pawn Ignore » à l'entrée, « … rendus en Pawn Block » à la sortie ; une scène de couple en extérieur puis sortie du lieu (R1).
## Fichiers à commiter
A `Docs/Migration/etat/ST/STG/STG-SF4b-VAL.md` (seul fichier écrit par cette fiche).
Tours : 9 / 30