LifePlay-Revival/Docs/Migration/etat/CAM/CAM-COMMUN4-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

198 lines
15 KiB
Markdown

# CAM-COMMUN4-DIAG : déplacement des personnages bloqué en mode « Scene » pendant le sexe (2026-10-13)
Demande de Big Boss : régression probable signalée par l'utilisateur. Pendant une scène de sexe, en caméra « Scene »,
on ne peut plus déplacer les personnages (Maj + souris, ou touches selon l'aide) ; en « POV », ça marche. Scène de
20:09:18 à 20:13:52 UTC, venant de C2 (20:08:48). Lecture seule, sans UE. Le journal COMMUN-4 n'est pas lu : il est
dans l'archive pendant que le jeu tourne. Diagnostic fait sur les dumps.
Sources :
- Room après B2g/h : `CAM-B2g-VAL_LPDumpFunction_20261013-211708.txt` ;
- PC : `CAM-B1-VAL_LPDumpFunction_20261013-085611.txt` ;
- `CAM-T2-CART.md` § 3.3 ;
- `CAM-SPEC.md` B1-5 et B1-7 ;
- `LPDirectControlSubsystem.cpp` (STG, MD5 `BAAA3982…`), lu sans modification.
## 1. Comment le jeu déplace les personnages pendant le sexe (prouvé, dump de Room)
Les commandes de caméra arrivent dans Room par 5 événements (option 1 de B2b) :
- `CircleCamera` (souris) ;
- `LeftRight` (flèches gauche/droite) ;
- `ScrollDownUp` (molette) ;
- `RotateCamera` ;
- `DownUp` (flèches haut/bas).
Chacun commence par une branche « C2 ? » : 96, 97, 98, 99, 100. Le comportement d'origine du jeu est dans la branche
`else`. Par exemple :
- `CircleCamera` → 96.else → 26 (`BuilderOn` OU `SexOn` OU `SpaceOn`) → 19 (`MoveObject`, Maj) :
- vrai → 29 (`SexOn`) → **`ForEach SexPersons` → `SetActorRotation`** : on tourne les personnages ;
- faux → `SetActorRotation(SceneCamera)` : on tourne la caméra de scène.
- `LeftRight` → 97.else → 9 → 14 (`MoveObject`) → 27 (`SexOn`) → **`ForEach SexPersons` → `SetActorLocation`** : on
déplace les personnages.
**Si la branche « C2 ? » est vraie, la commande va à C2 (rotation de contrôle, hauteur, distance), et les personnages
ne bougent plus.**
## 2. Cause (prouvée par le code ; la séquence exacte de la vue est à confirmer au journal)
- Les conditions sont les suivantes :
- 96 et 97 = `OR_60` = (vue = `CamRoom`) OU `CamC1On` (B2h) ;
- 98, 99 et 100 = `PO_8` = (vue = `CamRoom`) (B2b, B2d).
- **(vue = `CamRoom`) est vrai pendant le sexe quand la scène part de C2.** L'entrée en sexe (`GI.Sex`) ne change pas
la vue (`CAM-T2-CART.md` § 3.3, aucun `SetViewTarget` sur ce chemin). La vue reste sur `CamRoom` jusqu'au premier
`SwitchCamera`. Les branches « C2 ? » sont donc vraies, et Maj + souris ou flèches tournent la caméra C2 au lieu de
déplacer les personnages.
- **`CamC1On` vaut vrai pendant toute la scène si elle part de C1.** Seul `CycleRoomCamera` l'écrit (`VariableSet_55`
et `_57`). Pendant le sexe, la touche C appelle `SwitchCamera` et pas le cycle (B1-7, garde `SexOn`). Depuis B2h, une
scène lancée en C1 bloque donc 96 et 97 dans **tous** les modes, POV compris.
- **En POV**, la vue est un `SexPersons[i]` (PC nœud 55, `CurrentActor`). Elle n'est ni `CamRoom` ni le cas C1 si la
scène vient de C2 : les branches `else` s'exécutent et le déplacement marche. C'est conforme au constat de
l'utilisateur.
- **En « Scene » après un passage par POV**, le PC revient sur `ChargenCameras[0]` (nœud 353). La vue n'est alors plus
`CamRoom`, et le déplacement devrait de nouveau marcher. Les phases « Scene » bloquées sont donc au moins la première
(20:09:18 → première bascule). Les phases suivantes sont à vérifier sur le journal définitif (lignes `Indicateur de
camera`) et en demandant à l'utilisateur dans quelle phase il a essayé.
- **Origine** :
- B2b et B2d pour 98-100 et pour la partie « vue = `CamRoom` » de 96 et 97 : présente depuis COMMUN-2, mais visible
seulement quand une scène de sexe part de C2 ;
- B2h pour la partie `CamC1On` (scène partie de C1).
Ce n'est pas seulement B2h. **B2g n'y est pour rien** : `MakeArray_5` ne sert qu'aux sondes de `ComputeC2Target` et
de `UpdateRoomCam`.
- **STG écarté** :
- `RestoreAnim` ne touche que l'animation du joueur, une seule fois (`bAnimCaptured`) ;
- la partie C1 de `Walk` (`FirstPersonView`) est dans `Walk`, qui n'est pas appelé pendant le sexe (`ScenePlaying` =
`SexOn`, l. 759) ;
- aucun de ces chemins ne touche `SexPersons` ni les commandes de Room.
## 3. Correctif proposé : B2i, garde « hors sexe » sur les 5 branches « C2 ? » (Room, `lp-mcp-bp`)
Il rend le comportement d'origine pendant tout le sexe, sans toucher à la scène : GI, PC et la logique de sexe ne
changent pas. Seules les conditions de branchement de Room changent.
- (N) `NOT` (`Math|Booléen|NOTBoolean`) : entrée ← `GI.SexOn`. Le getter existe déjà (`VariableGet_86.SexOn`, self ←
GI) ; sinon en créer un.
- (N) `AND` n° 1 (`Math|Booléen|ANDBoolean`) : A ← `OR_60.ReturnValue`, B ← NOT → sortie vers `IfThenElse_96.Condition`
et `IfThenElse_97.Condition`. Cela remplace le lien venant de `OR_60`.
- (N) `AND` n° 2 : A ← `PromotableOperator_8.ReturnValue`, B ← NOT → sortie vers `IfThenElse_98`, `_99` et
`_100.Condition`. Cela remplace les liens venant de `PO_8`.
- `PO_8` garde `IfThenElse_91` (`UpdateRoomCam`) et `OR_60.A` ; `OR_60` ne va plus qu'à AND n° 1.
- Au total : 3 nœuds et 10 liens. Pas de garde `Accessed None` : `SexOn` est un booléen de GI, et GI est toujours
valide.
- Instantané `CAM-B2i`, Room attendu `0C8EB59F55CB02AD2C4FA1413840B84B`. Relecture des 5 conditions et des liens de
`PO_8`, `OR_60` et 86 ; `is_dirty`, compilation stricte, `save_assets`, MD5. V5 : 1264 nœuds, seules ces différences.
V6 = référence.
- Barème : a0 b1 c0 d0 e1 f1 = 3 → N1, ajusté à N3 (MCP) ; S = C3 1 + f 1 = 2 < 3 : une fiche.
- **Effet attendu pendant le sexe** : souris, flèches, molette et Maj font comme avant CAM. Si la scène est partie de
C2 et que la vue reste sur `CamRoom` jusqu'au premier C, la souris sans Maj tourne `SceneCamera`, qui n'est pas la
vue. Elle ne fait donc rien de visible jusqu'au premier C. Maj + souris et flèches déplacent bien les personnages.
- **Effet hors sexe** : aucun. NOT `SexOn` = vrai, donc les conditions sont identiques à B2h.
**Point laissé à la décision de Big Boss** (non proposé pour l'alpha) : faire démarrer la scène sur `ChargenCameras[0]`
quand elle part de C2, comme avant CAM. Il faudrait un `SetViewTarget` dans `UpdateRoomCam` quand `SexOn` et vue =
`CamRoom`. C'est plus près du comportement d'origine, mais cela change la vue en début de scène. Les scènes étant
gelées, je ne le recommande pas sans accord de l'utilisateur.
## 4. Cas de test (pour COMMUN-5 ou la reprise de COMMUN-4)
| N° | Action | Résultat attendu |
|---|---|---|
| CAM-29 | Depuis C2, lancer une scène de sexe ; sans appuyer sur C, Maj + souris, puis flèches. | Les personnages tournent et se déplacent comme avant. |
| CAM-30 | Depuis C1, lancer une scène de sexe ; Maj + souris en mode Scene puis en POV. | Les personnages tournent et se déplacent dans les deux modes. |
| CAM-31 | Pendant la scène, C plusieurs fois (Scene ↔ POV), puis Maj + souris dans chaque mode. | Déplacement possible dans tous les modes. |
| CAM-32 | Après la scène, en C2 puis en C1 : souris et flèches. | Comme à COMMUN-4 (C2 tourne autour du personnage, C1 tourne la vue). |
## 5. Second KO de COMMUN-4 : la touche C ne change plus de caméra après CharGen (lecture seule)
Journal lu en lecture seule : le jeu a été relancé à 22:28 locale. Le journal de la session est devenu
`…\COMMUN-4_Development\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.13-20.27.59.log` (MD5 `4b039fd2…`). Le
journal actif `LifePlay.log` est celui de la nouvelle session.
### Faits (journal)
- Dernière ligne de l'indicateur : « C1 First person » à 20:20:37. Entrée dans CharGen en C1 : `LOAD ROOM
chargenroom` à 20:23:06, `menus=[CharGen_C]` de 20:23:07 à 20:23:32.
- Sortie : `LOAD ROOM cafe` à 20:23:33, puis la suite du jeu (street 20:24:56, community_centre 20:25:00). Plus
aucune ligne `Indicateur de camera` jusqu'à la relance.
- Le clavier arrive au jeu : `focus=SViewport` presque tout le temps, et la marche fonctionne (`accel=2048,
speed=200` à 20:25:07-27, `menus=[]`).
- Aucune `Accessed None` ni pile d'appels sur les événements CAM (`ApplyRoomCamera`, `CycleRoomCamera`, `RestoreC1`,
`UpdateRoomCam`, `PlaceC2`, `EnsureCamRoom`) après 20:23. Le seul avertissement à l'entrée de CharGen
(`GetSkeletalMesh_ReturnValue`) est hors CAM.
- Le joueur reste le même acteur (`PlayerCharacter`), mais CharGen a changé son genre : `fnt_new048-m-0-sit` →
`-f-`, et animation `Daily_C` → `Daily_F_C`.
- Rien ne trace un appui sur C (le PC ne journalise rien), ni la cible de vue (non relevée par LPDebug).
### Ce que le silence de l'indicateur veut dire (prouvé par le code)
L'indicateur n'écrit une ligne que quand le libellé **change** et n'est **pas vide** (`Tick`, l. 150-155). Deux
lectures sont possibles :
- (i) le libellé est resté « C1 First person » : vue = joueur et `CamC1On` vrai ;
- (ii) le libellé est vide : vue non reconnue, aucun texte à l'écran.
Dans les deux cas, **C n'a jamais conduit `CycleRoomCamera` jusqu'à un changement de vue.** Un seul passage C1 → C2
aurait posé `CamRoom` (`ApplyRoomCamera` → `PlaceC2` → `SetViewTargetWithBlend(CamRoom)`) et écrit « C2 Follow ».
### Hypothèses, par ordre de vraisemblance
- **H4 (en tête) : les actions d'entrée du PC ne se déclenchent plus après CharGen, alors que les touches brutes
arrivent.**
- La marche ne le contredit pas : `LPDirectControlSubsystem::AxisValue` lit l'état **brut** des touches
(`PC->PlayerInput->IsPressed`, l. 1-20 de la fonction), sans passer par l'`InputComponent` du PC.
- La touche C, elle, passe par l'action `SwitchCamera` du PC (`InpActEvt_SwitchCamera`).
- Un `DisableInput`, un mode d'entrée laissé par CharGen (`SetInputMode_GameAndUIEx` à l'ouverture,
`VariableSet_296`), ou une pile d'entrées modifiée couperaient C sans couper la marche.
- H4 explique tout : le libellé reste « C1 », `LOAD ROOM street` et `community_centre` remettent C1 (aucun
changement, donc aucune ligne), et C n'a aucun effet.
- **La souris (`CircleCamera`, via le PC et Birdview) devrait alors être coupée elle aussi** : c'est une question à
poser à l'utilisateur.
- **H1, garde de la touche C dans le PC** (B1-7) :
- chaîne : `InputAction SwitchCamera` → `IfThenElse_65` (`GI.BuilderOn`) → `PlayClick` → `IfThenElse_23` (`SexOn`)
→ `Branche(GI.SpaceOn)` → `Room.CycleRoomCamera` (cible `GI.Room`) ;
- après CharGen, `sexOn=0` est relevé ; `SpaceOn` est mis à vrai par `CreateCharGenWidget` (GI `VariableSet_296`),
et à faux seulement par `CloseSpace` et le chemin `VariableSet_233` ;
- `BuilderOn` n'est écrit ni par GI (dump L6f, 378 graphes : 0 écriture) ni par CharGen (widget non dumpé), mais par
Room (`VariableSet_2`, `_12`) et par le constructeur ;
- non tranché : un `SpaceOn` faux ou un `BuilderOn` vrai laissé par CharGen bloquerait C sans aucune trace.
- **H2, vue posée par CharGen hors des caméras connues, puis jamais reprise** :
- CharGen montre le joueur avec sa propre caméra ;
- si, à la sortie, la vue reste sur une caméra qui n'est ni dans `ChargenCameras`, ni `CamRoom`, ni `SceneCamera`,
le libellé est vide (cas ii) ;
- mais C devrait tout de même appeler `CycleRoomCamera`, et donc changer la vue : H2 seule n'explique pas que C reste
sans effet. Elle va avec H1.
- **H3, état C1 laissé incohérent** : `C1Hidden` vrai alors que la tête et les cheveux ont été recréés par le
changement de genre.
- `ApplyRoomCamera` en C1 avec `C1Hidden` vrai ne fait que `SetViewTarget(joueur)` (nœud 434), sans rattacher
`FirstPersonSM` (430-433).
- La vue C1 pourrait donc être fausse. Mais C ferait quand même passer en C2 : comme H2, H3 seule n'explique pas le
KO.
- **Lien avec B2h : aucun.** B2h ne touche que les conditions de 96 et 97 (souris, flèches). La touche C passe par le
PC et `CycleRoomCamera`, que B2h ne lit pas. **B2g : aucun lien** non plus (sondes de C2).
### Ce qu'il faut pour trancher
1. **Questions à l'utilisateur** :
- après CharGen, que montrait le bas gauche de l'écran : « Camera: C1 First person », un autre texte, ou rien ?
Cela sépare (i) et (ii) ;
- la souris tournait-elle encore la vue ? Les autres touches du jeu (menus, Échap, E) marchaient-elles ? Si non,
c'est H4.
2. **Témoin C++ « touche C »** (`LPCameraModeSubsystem.cpp`, sans Blueprint, à passer avec B2i) :
- à chaque appui sur une touche de l'action `SwitchCamera` (lecture des `ActionMappings` d'`UInputSettings`, front
montant de `PlayerInput->IsPressed`, vérifié à chaque image), une ligne :
`Touche C : BuilderOn=… SpaceOn=… SexOn=… CamC1On=… CamC3On=… C1Hidden=… entree PC=<InputEnabled> regard ignore=<IsLookInputIgnored> viewport ignore=<IgnoreInput> vue=<nom> (<classe>) Room=<nom> PC=<nom>` ;
- quand le libellé devient vide hors menu, une ligne `Indicateur de camera : aucun (vue <nom>, classe <classe>)`,
une fois par changement de vue.
Au prochain essai, un seul passage par CharGen en C1 suivi d'un appui sur C désigne la garde ou l'état fautif. Le
correctif viendra ensuite (Room ou PC, ou un passage `ApplyRoomCamera` au retour de CharGen), en DIAG séparé.
- Une touche brute vue par le témoin sans aucun changement de vue après, avec `entree PC=0` ou un drapeau bloquant,
tranche entre H4 et H1.
- Barème : a0 b0 c0 d0 e1 f0 = 1 → N1 ; S = 0 (code exact écrit à la fiche).
3. **Contournement pour l'utilisateur, à vérifier** : sortir de la pièce (vue de la ville) puis rentrer. `LoadRoom` →
`ApplyRoomCamera` reprend alors la vue selon le mode choisi. À confirmer : la sortie de 20:24:56 (`LOAD ROOM street`)
n'a rien changé non plus. C'est cohérent avec H4 (le libellé reste C1 et C est coupé) et va contre un simple état de
vue (H2).
### Complément du 2026-10-13, passage UE de B2i (jeton CAM)
- Dump du widget CharGen : `CAM-C4D-DIAG_LPDumpFunction_20261013-225931.txt` (`-BP=CharGen -Fn=* -Pins -Exec`, code 0,
33 graphes).
- **Aucun appel** touchant aux entrées, au focus d'entrée, à la vue ou au PC : ni `SetInputMode`, ni
`Enable/DisableInput`, ni `SetIgnore*Input`, ni `SetViewTarget`, ni `Possess`, ni `OpenSpace`/`CloseSpace`, ni
`LoadRoom` ou événement de caméra de Room.
- Les 4 `GetPlayerController` ne servent qu'à l'`OwningPlayer` de 4 `CreateWidget`.
- Il appelle `GI.PlayerChangeGender`. Celui-ci refait le maillage, les morphs, la pilosité et les cheveux
(`UpdatePlayerMeshWithMorphs`, `UpdateDefaultHair`), sans rien sur les entrées ni la vue.
- Conséquence :
- **H4 n'a pas sa cause dans CharGen lui-même.** Si les actions du PC sont coupées, c'est ailleurs, au retour en
jeu, côté GI ou PC : chemin non dumpé de la page finale, ou `Cursor.ResetAndCheckMouseForUI` appelé par
`ClearCharGenWidget` ;
- H1 (`SpaceOn`) reste possible ;
- **aucun correctif ne peut être prouvé dans Room aujourd'hui.** Aucun changement de Room n'est fait pour ce KO.
- Fait nouveau de Big Boss : **à la relance du jeu, C refonctionne.** Il s'agit donc d'un état d'exécution laissé par
le passage dans CharGen, et non d'un asset abîmé.
- Suite proposée, inchangée : témoin C++ « touche C » (§ 5, point 2), plus les questions à l'utilisateur. Le correctif
viendra après un essai qui passe par CharGen en C1.