11 KiB
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(MD53f2355f4…, 85 697 lignes, heures en UTC = heure locale − 2 h) ; - dumps : Room
CAM-B2d-VAL_LPDumpFunction_20261013-173214.txt; PCCAM-B1-VAL_LPDumpFunction_20261013-085611.txt; GIST/STE/dumps/GI__EventGraph_V5.txtetportage55/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écritself.POVOn := true / false(dump PC,VariableSet_25et_30,selfvide) ; - 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 (
SphereTraceSingle459 ComputeC2Target, 499 trajectoire, 505 repli) ontbIgnoreSelf = trueavec self = Room, plusActorsToIgnore = [PlayerCharacter, CamRoom](MakeArray_5) ; - les meubles, les
fnt_extd'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.inine déclare aucun canal personnalisé. Le passage desfnt_exten 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
Personen profilCustom, é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=TraceTypeQuery1sur 459, 499 et 505 (3set_pin_value).- Capsule et maillage de
Personignorent 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.
- Capsule et maillage de
- b. (facultatif, C++ de CAM) témoin C2 dans
LPCameraModeSubsystem. En C2, siCamRoomest à 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 (
hidePersonsNotInvolvedou 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 etbTraceComplex = true, pour ne pas buter sur les collisions simples englobantes desfnt_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édurelp-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é.
CurrentScenen'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 (.lpscenecomme.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-sitpuisfnt_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 surcoffee.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 ouSexOn».- 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 parMenuOnScreen, et garderSexOn. - Autre témoin possible :
GI.SceneOn, remis à faux aprèsClearSceneWidget(VariableSet_328). Sa valeur pendant une action.lpain'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.
- Le plus sûr : ajouter
- 3b. Libérer le meuble au premier pas : quand un mouvement commence et que
PlayerCharacter.OccupyingFntest valide, appeler la fonction existantePerson.unOccupyFnt. Elle libère le siège dansRoom.OccupiedFntset lesStandspotset é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 (avecPlayerGoHere). - 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.
- Éventuellement aussi
- 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.mdsera mis à jour selon ce choix (empreintes, liste, verdict).