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

137 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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