138 lines
11 KiB
Markdown
138 lines
11 KiB
Markdown
|
|
# 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).
|