LifePlay-Revival/Docs/Migration/etat/CAM/CAM-COMMUN2-DIAG.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

11 KiB
Raw Blame History

CAM-COMMUN2-DIAG : diagnostic des KO de l'essai commun COMMUN-2 (2026-10-13)

Demande de Big Boss : 3 KO (A17, caméra trop près autour des meubles, ZQSD assis) et un avis (PNJ dans la tête). Lecture seule, sans jeton UE ni MCP : journal du jeu, dumps déjà archivés, code C++. Aucune écriture avant GO.

Sources :

  • journal D:\Game\LifePlay_Backup_5.5\COMMUN-2\essais\LifePlay_commun2_definitif_BOSS.log (MD5 3f2355f4…, 85 697 lignes, heures en UTC = heure locale − 2 h) ;
  • dumps : Room CAM-B2d-VAL_LPDumpFunction_20261013-173214.txt ; PC CAM-B1-VAL_LPDumpFunction_20261013-085611.txt ; GI ST/STE/dumps/GI__EventGraph_V5.txt et portage55/L6f/L6f_dump_GI.txt (378 graphes) ; Person (composants) CAM-T4_LPDumpComponents_20261011-004910.txt ; ST/STE/dumps/Person__unOccupyFnt_D4.txt ;
  • code : Source/LifePlay/LPCameraModeSubsystem.cpp, LPDirectControlSubsystem.cpp (STG, lu sans modification).

0. Relevés de l'indicateur (contrôle des autres cas)

72 lignes Indicateur de camera. Libellés vus : Studio, Overview, C2 Follow, C3 Room (old), C1 First person, Scene. « POV » n'apparaît jamais (voir KO 1). « Builder » n'apparaît pas : CAM-15 n'a pas été joué ou le constructeur n'était pas accessible. Les autres cas sont cohérents avec un résultat OK (C → C1, C2, C3 ; Overview à la sortie ; Studio aux contacts).

KO 1 : A17, l'indicateur reste « Camera: Scene » en POV

DIAG (prouvé). ComputeLabel lit POVOn sur GI (LPCameraModeSubsystem.cpp:183). Or POVOn est une variable du PC :

  • PC SwitchCamera écrit self.POVOn := true / false (dump PC, VariableSet_25 et _30, self vide) ;
  • GI ne fait qu'écrire PC.POVOn := false à l'entrée du sexe (GI__EventGraph_V5.txt:20528, self ← GI.PC). GI n'a pas de propriété POVOn. ReadBool(GI, "POVOn") renvoie donc toujours faux, et le libellé reste « Scene ». L'erreur vient de la SPEC B2c (§ 2, « GI.POVOn »), qui l'avait mal attribuée.

Correctif proposé (indicateur C++ seul, aucun Blueprint, rien côté scène) :

// espace LPCameraModeLocal : remplacer GIPOVOn
const FName PCPOVOn(TEXT("POVOn"));   // variable du PC (SwitchCamera), pas de GI
// ComputeLabel, ligne 183
return LPCameraModeLocal::ReadBool(PC, LPCameraModeLocal::PCPOVOn) ? TEXT("Camera: POV") : TEXT("Camera: Scene");

PC est déjà résolu plus haut (GetFirstPlayerController, sinon GI.PC). Il faut aussi corriger la ligne du § 2 de CAM-B2c-SPEC.md.

  • VAL : compilation, build COMMUN-3, puis essai : en scène de sexe, touche C → « POV » ; encore C jusqu'au retour à la caméra de scène → « Scene ».
  • Barème : a0 b0 c0 d0 e1 f0 = 1. La tâche suit un mécanisme, elle monte donc à N1. S = C3 0 (code exact) + f 0 = 0 : une fiche.

KO 2 : caméra trop près du joueur autour des meubles

DIAG. La piste « la sonde touche la collision simple des meubles » est réfutée par le dump de Room :

  • les 3 balayages de C2 (SphereTraceSingle 459 ComputeC2Target, 499 trajectoire, 505 repli) ont bIgnoreSelf = true avec self = Room, plus ActorsToIgnore = [PlayerCharacter, CamRoom] (MakeArray_5) ;
  • les meubles, les fnt_ext d'extérieur et les murs sont des composants de Room. La sonde les ignore tous, quel que soit leur réglage (l'enceinte vient de la boîte B2e) ;
  • le canal est TraceTypeQuery2 = Camera. DefaultEngine.ini ne déclare aucun canal personnalisé. Le passage des fnt_ext en Pawn Ignore par S-F4b n'a donc aucun effet sur la sonde.

Ce que la sonde voit encore, ce sont surtout les personnages :

  • capsule de Person en profil Custom, écarts Visibility / WorldStatic / Pawn Ignore. Camera n'y figure pas, donc la capsule le bloque ;
  • maillage CharacterMesh0 : écarts Pawn / Visibility / Vehicle Ignore. Camera n'y figure pas, donc le maillage le bloque aussi (dump de composants T4).

Le journal montre en permanence des PNJ cachés (hidden=1) mais en collision (coll=QueryAndPhysics) dans l'emprise de la pièce, souvent sur un meuble (occupyingFnt renseigné). Exemples :

  • 16:41:18 UTC, rue (échelle 3,5 × 18) : 5 PNJ cachés dans la pièce, dont 4 sur un meuble ;
  • 16:56:09 : 3, dont 3 sur un meuble ;
  • 16:58:34 : 4, dont 2 sur un meuble. Un personnage invisible assis sur un banc ou une chaise arrête la sonde. La caméra se replie alors vers la tête, puis monte si elle est à moins de 80 cm (« perd le focus et se rapproche trop »). Les PNJ visibles qui passent font de même.
  • Statut : cause probable, non prouvée. Le jeu ne journalise pas le composant touché, et la capture n'a pas d'heure précise.
  • Cause secondaire possible, en rue étroite seulement : boîte B2e de la rue 3,5 × 18, soit environ 2,3 m de largeur utile. Face à une façade, la boîte rapproche la caméra. C'est l'effet voulu de « toujours dans la pièce ».

Correctif proposé (Room seul, par lp-mcp-bp, sous instantané) :

  • a. Canal Visibility pour la sonde : TraceChannel = TraceTypeQuery1 sur 459, 499 et 505 (3 set_pin_value).
    • Capsule et maillage de Person ignorent Visibility (prouvé par le dump), donc la sonde ne voit plus aucun personnage, caché ou non. Le Third Person d'Epic fait de même : le profil Pawn ignore Camera.
    • Room reste ignoré (bIgnoreSelf), donc rien ne change pour les murs et les meubles. L'enceinte reste assurée par la boîte.
    • Le prix : un personnage entre la caméra et le joueur masque la vue un instant, au lieu d'attirer la caméra.
  • b. (facultatif, C++ de CAM) témoin C2 dans LPCameraModeSubsystem. En C2, si CamRoom est à moins de 100 cm de la tête, il écrit une ligne au plus par seconde : distance, C2BoxMin/Max, et ce qu'un balayage Camera équivalent touche (composant, acteur, caché ou non). Cela prouve la cause à COMMUN-3, sans Blueprint.
  • Hors CAM, à signaler à STG : des PNJ cachés gardent leur collision dans la pièce (hidePersonsNotInvolved ou PNJ non présentés). Ils peuvent aussi gêner la marche du joueur.
  • Plus tard (B2g, hors COMMUN-3) : éviter vraiment les meubles. Il faudrait bIgnoreSelf = false, avec un filtre des murs et du sol et bTraceComplex = true, pour ne pas buter sur les collisions simples englobantes des fnt_ext.
  • VAL : V3, V4, V5 (459, 499, 505 en TraceTypeQuery1), V6, build COMMUN-3. Essai : C2 dans une pièce avec PNJ et dans la rue avec des bancs occupés, en tournant la caméra autour du joueur. La caméra ne doit plus se coller.
  • Barème (a) : a0 b1 c1 d0 e1 f1 = 4 → N1, ajusté à N3 (écriture MCP par lp-mcp-bp, consigne de Big Boss). S = C3 1 (procédure lp-mcp) + f 1 = 2 < 3 : une fiche. (b) : fiche séparée avec le code exact (C3 0), N1.

KO 3 : ZQSD assis (régression)

DIAG (prouvé). La marche n'a rien à voir avec le siège : elle est coupée par la garde ScenePlaying de LPDirectControlSubsystem::Tick (l. 606). Cette garde bloque si GI.CurrentScene n'est pas vide (l. 456-464), et Walk n'est alors jamais appelé.

  • CurrentScene n'a qu'une écriture dans GI : PlayScene → CurrentScene := FilePath (VariableSet_29, seule écriture sur les 378 graphes du dump L6f, et seule dans l'EventGraph V5). Rien ne la remet à vide : elle garde le chemin de la dernière scène ou action jouée (.lpscene comme .lpai).
  • Journal : vide de 16:31 à 16:39:53, jamais vide ensuite. Toutes les tentatives de marche avant 16:39:53 marchent (accel 2048, vitesse 200), y compris assis : à 16:36-16:38, currentAnimation = fnt_chair11-m-0-sit puis fnt_chair08-m-0-sit, et le joueur part en marchant. Toutes les tentatives après, assis ou debout, sont bloquées (accel 0, vitesse 0 ; 19 relevés de 16:41 à 17:12), dont 17:06:24-29 sur coffee.lpai.
  • Le défaut touche donc toute la marche après la première scène de la partie. C'est probablement aussi la « perte de la marche » vue aux essais de B2 (confiée à STG). Voir aussi « pareil que pour les autres versions ».

Correctif proposé (fichier STG, LPDirectControlSubsystem.cpp, à confier à STG ou sur décision de Big Boss). Deux fiches, car S ≥ 3 en une seule :

  • 3a. Vrai témoin de scène : remplacer ScenePlaying (chemin non vide) par « une boîte de dialogue de scène est à l'écran ou SexOn ».
    • Le plus sûr : ajouter Scene_C (widget /Game/UI/Scene, vu dans la pile d'appels de 16:51:28) à MenuClasses, le test déjà fait par MenuOnScreen, et garder SexOn.
    • Autre témoin possible : GI.SceneOn, remis à faux après ClearSceneWidget (VariableSet_328). Sa valeur pendant une action .lpai n'est pas journalisée : à vérifier avant de s'en servir seul.
    • Barème : a0 b1 c0 d1 e1 f0 = 3 → N1 ; S = 0 + 0 : une fiche.
  • 3b. Libérer le meuble au premier pas : quand un mouvement commence et que PlayerCharacter.OccupyingFnt est valide, appeler la fonction existante Person.unOccupyFnt. Elle libère le siège dans Room.OccupiedFnts et les Standspots et écrit « unoccupied by » ; appel par réflexion (ProcessEvent).
    • Éventuellement aussi GI.InterruptAnyCurrentAction(WithoutEffects = false). Cet événement arrête la mise à jour de durée et applique les effets d'interruption ; le menu des contacts l'appelle aussi (avec PlayerGoHere).
    • L'animation assise est déjà remplacée par la marche (WalkAnim, prouvé à 16:36-16:38).
    • Signature et effets à cartographier d'abord (CART courte). Barème : a1 b1 c1 d1 e1 f1 = 6 → N2 ; S = C3 2 + f 1 = 3 : CART puis IMPL.
  • VAL : build COMMUN-3. Essai : jouer une scène, puis marcher. S'asseoir pendant une action (café), puis ZQSD : le personnage se lève et marche, et le siège se libère (ligne « unoccupied by »).

Avis : PNJ placée 40 cm dans le joueur (16:50:14, pregnant_trap)

La caméra (C2 à ce moment : C2 de 16:48:20 à 16:51:02) a pu entrer dans la tête de la PNJ. La sonde partait de la tête du joueur, déjà à l'intérieur de la capsule de la PNJ (écart −40 cm, CLOSE … gap=-40.0). Le balayage touche alors dès le départ, la caméra se replie sur la tête, puis remonte. Avis : pas de garde caméra dédiée.

  • Le correctif 2a (canal Visibility) supprime cet effet, puisque la sonde ne voit plus les personnages.
  • La cause (placement) relève de STG (B7, GI::Show).
  • Une garde de plus (masquer une PNJ traversée par la caméra, comme le fondu des jeux Third Person) ajouterait des nœuds pour un cas qui disparaît avec la cause. À garder en réserve si COMMUN-3 le montre encore.

Conséquences pour le commit de B2

Le correctif 1 change LPCameraModeSubsystem.cpp (MD5 BBCA21B0… modifiée), et le correctif 2a change Room (CA2A9A0B modifiée). Deux choix pour Big Boss :

  • commiter B2 tel qu'essayé, avec A17 en défaut connu, puis un CHG pour les correctifs ;
  • ou attendre COMMUN-3 et faire un seul CHG. CAM-B2-DOC.md sera mis à jour selon ce choix (empreintes, liste, verdict).