9.4 KiB
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.patchprésent dans le dossier du lot : non utilisé, le diff est refait contre l'instantané.- Aucune IMPL formelle
STG-SF4b-IMPL.md(GlobSTG-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 :
BlockRoomPawnparcourt les composants de Room (l. 567,bInRoom) ; un composant en Ignore non encore mémorisé passe en Block et est enregistré avec la réponseECR_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 ilcontinue, 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 dansIgnoredDecor.- Cas « sortie d'extérieur pendant une scène de couple » :
bOutdoordevient faux,RestoreDecormet Block (déjà Block par ShowCouple) et videIgnoredDecor. À la fin de la scène,Releaseremet Ignore sur les composants mémorisés par ShowCouple. Si ces composants existent encore (Room non détruite, lieu intérieur), le décorfnt_extreste 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. Legit diff --stat -- Sourceglobal (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_extpossiblement 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_extattrape 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
LifePlayEditorsans erreur (conversionTObjectPtretContainsen particulier). - COMMUN-3 : en street, personnages à hauteur du pavé et joueuse qui marche ; valeur
deltapieds / 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