LifePlay-Revival/Docs/Migration/etat/ST/STG/STG-C6b-IMPL.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

5.7 KiB

Fiche STG-C6b-IMPL — Niveau N3 — Modèle prévu claude-opus-5-5 | utilisé claude-opus-5-5 — Agent orchestrateur STG (session principale) — Skills lp-lot, sk-change-safety

STG-C6b-IMPL : boîte de scène comptée comme menu seulement si elle montre quelque chose (2026-10-14)

GO de Big Boss du 2026-10-14, après la réponse de l'utilisateur au DIAG : « non pour Z, non pour le dialogue ». Pendant la fenêtre A, Scene_C était compté comme menu (menus=[Scene_C] sceneOn=1) et coupait la marche alors qu'aucune boîte n'était visible. Correctif C6-b de STG-COMMUN6-DIAG.md § 5. Sans UE ni compilation ; VAL statique par un agent distinct ; il entre au build suivant, avec M1e. Lot STG, registre STG-TACHES.md.

1. Instantané

Snapshot.ps1 -Lot STG-C6b (état M1e) : LPDirectControlSubsystem.cpp AD60A24FB3E3075299C1F4EC5F087011, .h 979AE0ADA261655CBBE9AEFD6969E833 (D:\Game\LifePlay_Backup_5.5\STG-C6b\manifest.csv).

2. Changements (STG-C6b.diff, contre l'instantané : 66 lignes ajoutées, 0 retirée)

LPDirectControlSubsystem.cpp (CRLF) :

  • includes Blueprint/WidgetTree.h, Components/Button.h, Components/RichTextBlock.h et Components/TextBlock.h (module UMG, déjà dans LifePlay.Build.cs l. 38) ;

  • ShownUpToRoot(Child) : le widget et chacun de ses parents dans l'arbre sont IsVisible(), avec une opacité de rendu > 0,01 ;

  • ShowsContent(Widget) : vrai si l'arbre du widget contient, visible jusqu'à la racine :

    • un UButton ;
    • un UTextBlock ou un URichTextBlock au texte non vide ;
    • un UUserWidget imbriqué visible qui lui-même montre quelque chose (récursion bornée à 8 niveaux).

    Opacité de rendu du widget ≤ 0,01 : faux. Arbre illisible (WidgetTree nul) ou profondeur dépassée : vrai (prudence : on ne débloque pas sur une donnée manquante).

  • MenuReason : pour la seule classe Scene_C, si ShowsContent est faux, le widget n'est pas compté. On passe au widget suivant (break de la boucle des classes), et l'indicateur EmptySceneSeen() est levé. Les neuf autres classes de menus, le panneau Clavier et la saisie de texte ne changent pas.

  • WitnessMoveKeys : une ligne à chaque changement de l'indicateur, C6-b : boite Scene_C dans le viewport sans contenu visible, la marche n'est pas coupee, puis C6-b : plus de boite Scene_C vide dans le viewport.

LPDirectControlSubsystem.h : le membre bLoggedEmptyScene.

Signatures relues sur les en-têtes UE 5.8 (D:\Game\Launcher\Engine\UE_5.8\Engine\Source\Runtime\UMG\Public) :

  • UTextBlock::GetText() const (TextBlock.h l. 95) et URichTextBlock::GetText() const (RichTextBlock.h l. 196) ;
  • UWidgetTree::ForEachWidget(TFunctionRef<void(UWidget*)>) const (WidgetTree.h l. 78) ;
  • UWidget::IsVisible() const (l. 582), GetRenderOpacity() const (l. 598) et GetParent() const (l. 769).
  • UPanelWidget est complet pour la conversion vers UWidget* : Blueprint/WidgetTree.h l. 11 inclut Components/PanelWidget.h (point « à confirmer » de la VAL, levé à la lecture).

3. D10 reste vrai (contrôle demandé par Big Boss)

D10 (BOSS\COMMUN-3-TESTS.md l. 25) : pendant qu'une boîte de dialogue de scène est à l'écran, ZQSD ne fait pas bouger le personnage.

  • Une vraie boîte de scène montre son texte et ses boutons de choix. Elle a donc au moins un UTextBlock non vide ou un UButton visible jusqu'à la racine, d'où ShowsContent vrai, MenuReason qui renvoie Scene_C et la marche coupée, comme avant.
  • Si le texte ou les boutons sont dans un widget imbriqué, la récursion les trouve.
  • Si l'arbre n'est pas lisible, la boîte compte, comme avant.
  • Le seul cas qui change : un Scene_C dans le viewport, Visible, dont aucun bouton ni texte non vide n'est visible jusqu'à la racine (fenêtre A).
  • Estimé, non mesuré : la structure réelle de /Game/UI/Scene n'a pas été lue (pas d'UE). Si la boîte vide de la fenêtre A cache son contenu autrement (couleur à alpha 0, position hors écran, texte non vide mais transparent), C6-b ne la reconnaîtra pas. La marche resterait alors coupée, et M1e l'écrirait : marche coupee par le menu Scene_C, sans ligne C6-b.
  • Effet de bord à essayer en jeu : pendant une scène, une boîte qui s'ouvre sans texte pour un instant (≤ 0,25 s) ne coupe pas la marche pendant cet instant.

4. Ce qui n'a pas été fait

  • Compilation et essai : au prochain build commun.
  • La garde PlayerBusy de LPOutdoorRoomSubsystem (copie de l'ancienne liste) n'est pas modifiée. Une Scene_C vide y retarde seulement le relevage du joueur, sans le bloquer. Elle pourra être alignée après l'essai.
  • La ligne WALK … menus=[…] de LPDebugSubsystem compte toujours Scene_C sans ce filtre. Pour savoir si la marche est coupée, la ligne à lire est désormais M1e / C6-b.

5. Points à confirmer (essai du prochain build)

  • Fenêtre A rejouée (scène de sexe terminée, sans boîte visible) : ligne C6-b : boite Scene_C … sans contenu visible, et ZQSD fait marcher.
  • D10 : boîte de scène visible, ZQSD sans effet, M1e : marche coupee par le menu Scene_C.

6. MD5 après

Fichier MD5
LPDirectControlSubsystem.cpp 44ACE47D29424101B4127BA12E789BEB
LPDirectControlSubsystem.h ACFF924AE6E03548546EF3FB2E430EB8

7. Retour arrière (proposé, jamais lancé sans accord)

Restore.ps1 -Lot STG-C6b, qui ramène l'état M1e (AD60A24F… / 979AE0AD…). Avant tout, prendre l'instantané STG-C6b-retour.

8. Fichiers à commiter

Source/LifePlay/LPDirectControlSubsystem.cpp, Source/LifePlay/LPDirectControlSubsystem.h, Docs/Migration/etat/ST/STG/STG-C6b-IMPL.md, Docs/Migration/etat/ST/STG/STG-C6b.diff.

Tours : 7