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

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.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