LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2p-G-SPEC.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

165 lines
12 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-B2p-G-SPEC : C3 dans le cycle C du sexe, recadrage sur le couple, caméra qui suit le couple (2026-10-14)
Demande de l'utilisateur (COMMUN-11, relayée par Big Boss) : « Je perds la vue du couple en mode scene. Il faudrait
ajouter aussi C3 au show pour récupérer le focus ou recentrer la vue sur le MC ou le couple ». Cela remplace la
règle « deux modes seulement ». SPEC en lecture seule ; **aucune IMPL avant le GO**.
## 1. DIAG (journal COMMUN-11, 11:15 à 11:24 UTC, lu sans le modifier)
- Bornes (F2, 11:15:53) : `X [-3131897, -3131172] Y [-14967563, -14966863] … source murs Wall*, murs 4, plafond
trouve 1` (283) ; sol `Box` ±3200 cm. **F1 marche** : quatre murs reconnus, intérieur de 7,25 × 7 m.
- **La caméra de scène ne suit jamais le couple.** Pendant la scène, le couple est déplacé :
- glisser : de (-3131756, -14967071) à (-3131637, -14967030), puis à (-3131483, -14967023) ;
- flèches : à 11:23:18-20, vers (-3131552, -14966953) ;
- hauteur : Z de 100 à 127 (molette, `deplace hors prise … +9` à 11:23:16), soit la racine à 141 cm au-dessus du
sol (« hauteur sur la surface 203 cm » à la prise).
`SceneCamera` reste pourtant où le jeu l'a posée (le cadrage de `pickPreset`, au début de la scène). Elle ne bouge
que par l'orbite (B2n, ZQSD) et le tangage (souris Y, `RotateCamera`), sans jamais se réorienter vers le couple.
Le couple finit hors du cadre. Cause **établie** par l'absence de toute écriture de position de caméra liée au
couple dans le code (B2n, P3 et Room 125 tournent ou avancent la caméra, sans cible) ; **estimée** pour le cadrage
exact à l'écran.
- **Les clics sans prise (11:23:47 à 11:24:02, `G=1 prise=0`) en sont la conséquence.** La sélection demande que le
curseur soit à moins de 120 px du segment bassin-tête **projeté à l'écran**. Couple hors du cadre ou derrière la
caméra : la projection échoue, et il n'y a pas de prise. C'est voulu.
- Un mur entre la caméra et le couple n'est pas exclu, mais le journal ne le montre pas (il n'y a pas de témoin
d'occlusion en mode Scene).
- Remarque pour Big Boss : aucune ligne `Show couple : place reprise` dans ce journal, alors que plusieurs poses ont
déplacé le meneur (11:22:15, 11:22:21). **À vérifier : G3 (CAM `03D85D28` + STE) est-il dans le build
COMMUN-11 ?**
## 2. Conception proposée
### G-a, recadrage (C++, `LPCameraModeSubsystem`)
`RecenterSceneCamera()` place `SceneCamera` sur le couple :
- cible = pivot du couple, plus 60 cm au-dessus de la racine du maillage (le milieu du corps) ;
- distance par défaut 300 cm, hauteur +120 cm. L'azimut de la caméra actuelle autour du couple est gardé, pour
limiter le saut ;
- caméra bornée dans l'intérieur réel (F1), à 20 cm des murs et sous le plafond. Un tracé Visibility de la cible
vers la caméra (couple ignoré) la ramène devant le premier obstacle, comme un bras de caméra ;
- rotation : regard sur la cible ;
- une ligne au journal : `Sexe : vue recadree sur le couple (raison)`.
### G-b, recadrage à l'entrée en mode Scene (C++)
À chaque passage de la vue vers `SceneCamera` pendant le sexe (entrée en scène, retour depuis le dernier POV), on
appelle `RecenterSceneCamera()` une fois.
### G-c, la caméra de scène suit le couple (C++)
- En mode Scene, quand le pivot du couple bouge hors d'un glisser (flèches, molette, borne E1, jeu), `SceneCamera`
se déplace du même vecteur, à la même image. Le cadrage est gardé.
- Pendant un glisser, la caméra reste figée (B2p-D) ; au relâcher, elle ne saute pas.
- Borne de distance douce : au-delà de 900 cm du couple, la caméra est ramenée à 900 cm sur l'axe actuel.
### G-d, C3 dans le cycle C du sexe : nouveau cycle **Scene → C3 → POV 1 → … → POV n → Scene**
La touche C est gérée par le PC (Blueprint) : `IfThenElse_44` (`SexCameraIndex` inférieur au nombre de personnes →
POV suivant ; sinon → Scene). Deux façons de faire :
- **Option 1 (recommandée) : PC, par MCP, petit ajout.**
- Une variable `SexC3` (bool) dans le PC.
- Dans la voie sexe de la touche C (`IfThenElse_23.then`), avant `44` : Branche (`POVOn` faux ET `SexC3` faux) :
- vrai : `SexC3` = vrai, fin (la vue ne change pas) ;
- sinon, si `SexC3` est vrai : `SexC3` = faux, puis `44` (POV 1, comme aujourd'hui).
- La voie « Scene » (else de 44) remet `SexC3` à faux.
- Le C++ suit `PC.SexC3` par réflexion :
- au front montant, `RecenterSceneCamera()` ;
- tant qu'il est vrai, l'indicateur affiche « Camera: C3 Couple ».
En C3, l'orbite, ZQSD, la molette et le glisser marchent comme en Scene (même caméra).
- Volume : environ 6 nœuds et 1 variable dans le PC (MCP, GO du PC nécessaire), plus environ 20 lignes de C++.
- **Option 2 (C++ seul, sans asset) : intercepter C.** On ne la recommande pas. Le C++ voit l'appui sur C en mode
Scene, laisse le PC passer en POV 1, puis le défait une image plus tard (vue, `POVOn`, `SexCameraIndex`). Mais la
voie POV du PC change aussi des visibilités (cheveux, panneau `Wall`, tête), et il faudrait les défaire. C'est
fragile, avec une image de POV visible.
### G-e, Room
**Room n'est pas touché.** La vue Scene est déjà `SceneCamera` (B2p-R) ; le reste est en C++. Seul le PC est touché
dans l'option 1.
## 3. Estimation
- C++ (G-a, G-b, G-c, suivi de `SexC3`, indicateur) : environ 150 lignes, 1 h 30 d'écriture, 25 min de VAL statique,
sans jeton.
- PC (option 1) : instantané, environ 30 appels MCP (lp-mcp-bp), VAL V5 et V6 par un agent distinct. Environ 40 min
d'éditeur sous UE-GO. Le PC doit être dans le GO.
- Essais :
- CAM-76 : C en scène, ordre Scene → C3 → POV 1 → POV 2 → Scene ;
- CAM-77 : C3 recadre sur le couple, même après un glisser ou des flèches ;
- CAM-78 : entrée en Scene recadrée ;
- CAM-79 : flèches et molette, la caméra suit le couple ;
- CAM-80 : caméra jamais hors de la pièce ni derrière un mur au recadrage.
## 4. Risques
- G-c : un déplacement du couple par le jeu (changement d'animation, recalage) déplace aussi la caméra. C'est le but,
mais le cadrage de `pickPreset` n'est plus gardé.
- Option 1 : la variable `SexC3` reste vraie si la scène se termine en C3. La voie de fin de scène doit la remettre à
faux. Le C++ la remet aussi à faux quand `SexOn` passe à faux (réflexion, variable du PC).
- Le recadrage peut tomber derrière un meuble haut : le tracé ramène la caméra devant l'obstacle (vue plus proche).
## 5. Compléments COMMUN-11 (R4) : G-e (lit), G-f (dessus des meubles), G-g (panneau des positions)
### 5.1 DIAG (journal COMMUN-11, lu sans le modifier)
- **La hauteur de pose est fausse depuis le début de la scène.** Toutes les prises disent `hauteur sur la surface
189 cm` (couple au sol, Z = 87), puis 203 et 206 cm (établi : lignes `couple pris` de 11:17 à 11:31).
- Au sol, la racine du maillage est à 87 − 88 = −1, soit **101 cm au-dessus du sol** (−102) : le couple flotte.
- B2p-D garde cet écart pris à la prise (`GrabHeight`) et le reporte sur chaque nouvelle surface. Un couple qui
flotte au départ flotte donc partout, et il « se pose » 2 m au-dessus d'un meuble (Z = 150 à 11:31).
- **Le tracé vertical (canal Visibility) ne voit pas le lit** (estimé, fort). Au-dessus du lit, il traverse jusqu'au
sol : depuis E2, la surface vaut au moins le dessus du sol. La hauteur prise sur le lit vaut alors l'écart au sol.
STE, lui, met les meubles en Block sur le canal **Pawn** pendant la scène (`Show couple : Pawn chambre Block=14`).
Le tracé de CAM doit utiliser ce canal-là.
- **`NODE_AddStaticMeshComponent-0_60`** est un meuble où une PNJ est assise (`Occupied by Jasmine`, dessus à
−52,3). Son maillage n'est pas nommé dans le journal : ce peut être un lit au nom inattendu, ou un siège voisin.
Le témoin de refus écrira désormais le nom du maillage. La règle des lits reste celle de STE (`IsBedMesh`).
- **« pour lit je dois passer latéralement »** : avec une hauteur fausse (lit non vu, écart de 189 cm), la boîte de
test de G1 est placée trop haut ou trop bas par rapport au cadre et à la tête de lit. Elle recouvre un meuble
voisin ou le bout du lit, et le pas est refusé. Une hauteur juste règle l'essentiel ; G1 garde le refus des
meubles qui dépassent la surface.
### 5.2 G-e : pose sur le lit (C++)
- Tracé vertical sur le **canal Pawn** (même réglage que STE pendant la scène), avec la règle « surface ≥ dessus du
sol » de E2.
- **Hauteur = surface + écart racine-acteur + 3 cm** : la racine du maillage est posée sur la surface, comme dans les
poses du jeu (COMMUN-6 : `root=-46` pour un lit à −49). Elle ne dépend plus de l'écart pris à la prise. Un couple
qui flottait retombe sur la surface au premier glisser.
- La ligne `couple pris` donne l'écart racine-surface réel, et le nom du composant de surface.
### 5.3 G-f : surfaces admises (C++)
- Au glisser, la surface sous la place visée doit être le **sol de la pièce** (`Room.Box`, ou aucun impact au-dessus
du sol) ou un **lit** (règle `IsBedMesh` de STE : nom contenant « bed », `fnt_ext011`, `fnt_new045`, `fnt_new235`).
- Toute autre surface (commode, bureau, armoire) : le couple ne va pas là ; il reste à la dernière place admise. Une
ligne est écrite par changement : `Sexe : surface refusee <composant> (<maillage>)`.
- Les lignes `place refusee` (G1) donnent aussi le nom du maillage.
### 5.4 G-g : panneau des positions au clavier et au clic molette (PC + C++)
DIAG (dump du PC) :
- un **clic court** (bouton tenu moins de 0,2 s, `HoldTime`) du gauche ou du droit, pendant le sexe, passe par
`IfThenElse_42` → `110` → `123` (`SexOn`) → `CallFunction_35` **`LeftMouseSexOn`**, ou par `IfThenElse_43` →
`111` → `19` → `15` (`SexOn`) → `IfThenElse_10` ;
- `LeftMouseSexOn` (`CustomEvent_11`) → `IfThenElse_10` (`Cursor.BelowCursor` visible) : vrai → `ExitSexActions`
(cache le panneau), faux → `GI.SexInterface.TextBlock_1` visible (montre le panneau). C'est la bascule du panneau
des actions et positions ;
- la **barre espace** est l'action `Pause` : `InputAction_3` (estimé : seule action qui bascule `GI.GamePaused`) →
`63` (`BuilderOn`) → `40` → `277` `PlayClick` → `GamePaused = NOT GamePaused`. Pendant le sexe, Espace met donc le
jeu en pause ;
- **le clic molette** sert à l'orbite (action `RotateCamera` : molette ou Alt ; `MoveCamera` estimé).
Correctif proposé :
- **PC (MCP, sous UE-GO)** :
- (1) couper la bascule par les clics pendant le sexe : `break_pins` `123.then` → `35` et `15.then` → `10` (2
coupures). Hors sexe, les branches `else` ne changent pas ;
- (2) Espace pendant le sexe : dans la voie `Pause`, une Branche (`GI.SexOn`) entre `40.then` et `277`. Vrai → un
nouvel appel `LeftMouseSexOn` (bascule du panneau, sans pause) ; faux → `277` (pause, inchangée). Cela fait
2 nœuds et 4 liens.
- **C++** : clic molette court pendant le sexe (appui puis relâcher en moins de 0,2 s, souris immobile à 5 px près)
→ `PC.LeftMouseSexOn` par `ProcessEvent` (événement sans paramètre). Une glissée à la molette reste l'orbite. Une
ligne `Sexe : panneau bascule (clic molette)`.
- **Retour à la sortie** : tout est conditionné par `SexOn`. Hors sexe, les clics gauche et droit (`else` de 123 et
de 15) et Espace (pause) sont inchangés, et le C++ n'agit pas.
- À confirmer à l'essai : `InputAction_3` est bien `Pause` (Espace). L'éditeur MCP le montrera au passage (nom de
l'action du nœud).
### 5.5 Estimation revue
- C++ en plus (G-e, G-f, noms de maillage dans les refus, clic molette) : environ 70 lignes, 45 min, 20 min de VAL
statique.
- PC en plus (G-g : 2 coupures, 2 nœuds, 4 liens), dans le même passage MCP que `SexC3` (G-d) : environ 50 appels au
total, environ 55 min d'éditeur, puis VAL V5 et V6.
- Essais :
- CAM-81 : glisser sur le lit, de face et d'en haut, posé sur le matelas ;
- CAM-82 : glisser sur une commode, refusé ;
- CAM-83 : clics gauche et droit sans bascule du panneau ; Espace et clic molette basculent ;
- CAM-84 : hors sexe, Espace met en pause et les clics font comme avant.