LifePlay-Revival/Docs/Migration/etat/ST/STG/STG-KO3c-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.5 KiB

Fiche STG-KO3c — Niveau N2 — Modèle prévu claude-opus-5-5 | utilisé claude-opus-5-5

IMPL de la piste (a+) du DIAG STG-KO3c-DIAG.md (joueur coincé dans le comptoir et le bureau du newsagent, COMMUN-4). GO de Big Boss (2026-10-13), à partir de 8A680F80 / 3CDB4985. Écrit sans compiler, sous instantané ; VAL statique par un agent distinct. Destination : COMMUN-5 ou le build Shipping de l'alpha, selon le verdict de COMMUN-4. Lot STG, registre STG-TACHES.md.

1. Instantané et MD5

Fichier Avant Après
Source/LifePlay/LPDirectControlSubsystem.cpp 8A680F80111D742A924FF655FDB21B61 BAAA3982583B70A56602CBFE95BF4FA4
Source/LifePlay/LPDirectControlSubsystem.h 3CDB498591DFF98DD53FCFD65D7322D0 77AE7007C77403F05C6697771029CC8C

Instantané D:\Game\LifePlay_Backup_5.5\STG-KO3c\manifest.csv, pris depuis pwsh avec chemins entre guillemets simples (leçon de STG-WALK), 2 copies. CRLF : 1 307 et 81 lignes, CR = LF. Diff : STG-KO3c.diff (format diff classique, .cpp puis .h).

2. Gestes

  1. .h : TWeakObjectPtr<UPrimitiveComponent> SeatEscape → TArray<TWeakObjectPtr<class UPrimitiveComponent>> EscapeVolumes, plus float StuckTime = 0.f.

  2. EscapeOverlaps(Player, Room, Escape, Why), dans l'espace anonyme :

    • parcourt les UPrimitiveComponent de l'acteur Room (GI.Room), et d'aucun autre acteur ;
    • exclut :
      • Room.Box (lu par propriété) ;
      • tout composant sans collision ;
      • tout composant dont la réponse Pawn n'est pas Block (donc déjà en Ignore, comme les décors fnt_ext de S-F4b) ;
      • tout composant déjà dans la liste ;
      • tout composant que la capsule ne chevauche pas (CapsuleInside, capsule réduite de 1 cm) ;
    • passe chaque composant retenu en Pawn Ignore et l'ajoute à la liste, avec une ligne par composant : « Marche : joueur dans le volume de (), Pawn en Ignore jusqu'a la sortie ».
  3. LeaveSeat(Player, Room, Escape) : l'ancien bloc qui ne traitait que le meuble quitté est remplacé par EscapeOverlaps(…, "meuble quitte"). Le reste de KO3b est inchangé (référence invalide vidée, unOccupyFnt, garde après l'appel).

  4. UpdateEscape(Player, Room, Escape) remplace UpdateSeatEscape. Pour chaque composant de la liste :

    • détruit (avec la pièce) : retiré de la liste ;
    • toujours chevauché par la capsule, et appartenant encore à la Room courante : gardé ;
    • sinon (capsule sortie de son volume, changement de pièce, joueur absent) : rendu en Pawn Block, avec une ligne par composant : « Marche : joueur sorti du volume de , Pawn rendu en Block ».

    Appels :

    • en tête de Walk, à chaque image, avec GI.Room ;
    • dans Deinitialize, avec un joueur et une Room nuls, ce qui rend tout.
  5. Walk, déclencheur (2). Conditions : touches enfoncées, accélération non nulle, vitesse 2D < 1 cm/s, liste vide.

    • Après 0,5 s d'affilée : EscapeOverlaps(…, "bloque").
    • Seuls les composants déjà chevauchés par la capsule sont ouverts. Un mur ou un meuble que l'on longe n'est pas chevauché : il reste solide, et rien n'est écrit au journal.
    • La minuterie repart à zéro dès que le joueur avance ou lâche les touches.

3. Gardes exigées par Big Boss (à prouver par la VAL)

Garde Où
jamais Room.Box Comp == Floor (propriété Box de Room) → ignoré
jamais un composant déjà en Ignore GetCollisionResponseToChannel(ECC_Pawn) != ECR_Block → ignoré
jamais un autre acteur que Room Room->GetComponents seulement ; personnages, GI.Wall et caméras sont d'autres acteurs
déclencheur (2) seulement si la capsule chevauche déjà le composant CapsuleInside dans EscapeOverlaps, seul chemin vers Ignore
rendu en Block à la sortie, à Deinitialize, au changement de pièce UpdateEscape : sortie du volume, Prim->GetOwner() != Room, joueur nul
aucune action en scène ou avec SexOn Walk n'est appelé que hors menu, hors boîte de scène et hors SexOn (Tick, garde 3a) ; LeaveSeat et le déclencheur (2) sont dans Walk
une ligne au journal par composant basculé et par composant rendu deux UE_LOG dans les boucles

Nouveaux noms : EscapeOverlaps, UpdateEscape (espace anonyme), EscapeVolumes, StuckTime (membres). Chacun n'apparaît que dans ce fichier et son en-tête.

4. Points à confirmer en VAL

  • P1 : diff limité au § 2.
  • P2 : API UE 5.8 : TInlineComponentArray, AActor::GetComponents, GetCollisionEnabled, TArray<TWeakObjectPtr<…>>::Contains avec un UPrimitiveComponent*, RemoveAt, UCharacterMovementComponent::GetCurrentAcceleration, constness.
  • P3 : gardes du § 3.
  • P4 : KO3b (« quitte », « meuble d'une piece quittee », garde après l'appel), WALK, C1-Walk et 3a inchangés.
  • P5 : compilation (au build).

5. Essai prévu

  1. Newsagent : action « acheter » au comptoir fnt_new123, puis ZQSD. Le joueur sort ; au journal, une ligne « dans le volume de » par composant (au moins _214 et _220), puis une ligne « sorti du volume de » pour chacun.
  2. Pousser contre un mur, puis contre un meuble sans y être entré : aucune ligne « bloque », et ils restent solides.
  3. Étagère de variety_store (non-régression de KO3b).

6. Fichiers à commiter

Source/LifePlay/LPDirectControlSubsystem.cpp, .h (après build et VAL), Docs/Migration/etat/ST/STG/STG-KO3c-DIAG.md, STG-KO3c-IMPL.md, STG-KO3c.diff, STG-KO3c-VAL.md.