# 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)** : ```cpp // 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).