94 lines
6.1 KiB
Markdown
94 lines
6.1 KiB
Markdown
|
|
# CAM-B2p-D-IMPL : couple à la souris pendant le sexe (C++, 2026-10-14)
|
|||
|
|
|
|||
|
|
GO : Big Boss, 2026-10-14 (« GO pour B2p-D, C++ seul »), après les demandes de l'utilisateur. SPEC :
|
|||
|
|
`CAM-B2p-SPEC.md` § 7 et § 7.11. Écriture sans UE ni compilation ; compilation dans COMMUN-8 si la VAL passe à temps.
|
|||
|
|
|
|||
|
|
Instantané : `D:\Game\LifePlay_Backup_5.5\CAM-B2p-D\` (`.cpp` `8E35E07A…`, `.h` `9E20981F…`, état B2r + B2p-C).
|
|||
|
|
|
|||
|
|
| Fichier | Avant | Après |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `Source/LifePlay/LPCameraModeSubsystem.cpp` | `8E35E07AE08F3F208A24DC4CF2B3338F`, 820 lignes | `D60632646BF1CF7D200E3BEA833D8D72`, 1044 lignes (après la reprise D-1 ; première version `3DB310DC…`, 1042 lignes) |
|
|||
|
|
| `Source/LifePlay/LPCameraModeSubsystem.h` | `9E20981F8C768371A0935E2C7CE9E134`, 84 lignes | `6585D7F67A7BE3AEA377B8E93CFA14D8`, 112 lignes |
|
|||
|
|
|
|||
|
|
Fins de ligne : LF (0 CR).
|
|||
|
|
|
|||
|
|
## 1. Écritures
|
|||
|
|
- **Constantes** (`LPCameraModeLocal`) :
|
|||
|
|
- noms : `PelvisSocket` (`pelvis`), `RoomFloor` (`Box`) ;
|
|||
|
|
- sélection à 120 px, seuil de glisser à 5 px ;
|
|||
|
|
- rotation à 0,3° par pixel ;
|
|||
|
|
- marge au bord du sol : 30 cm ;
|
|||
|
|
- tracé du curseur : 5000 cm ;
|
|||
|
|
- tracé vertical : de pivot + 150 à pivot − 400 cm.
|
|||
|
|
- **`TickSexCamera`** :
|
|||
|
|
- hors sexe, pendant un menu ou sans vue valide : `ReleaseCoupleGrab()` (aucune prise ; le témoin du curseur est
|
|||
|
|
remis à zéro hors sexe) ;
|
|||
|
|
- `PC` n'est plus `const` ;
|
|||
|
|
- appelle `TickCoupleMouse` avant ZQSD. Pendant une prise, ZQSD ne déplace pas la caméra ;
|
|||
|
|
- le témoin « Sexe : touches » écrit aussi les boutons G et D, la prise en cours et le lacet du couple
|
|||
|
|
(`SexPersons[0]`). Il écrit aussi une ligne quand seul un bouton est tenu.
|
|||
|
|
- **`TickCoupleMouse`** (nouveau) :
|
|||
|
|
- **mode Scene seulement** : couple non vide, vue hors du couple, `PC.POVOn` faux. Sinon, aucune prise ;
|
|||
|
|
- front montant du bouton gauche ou droit : `GetMousePosition`. Sans position, une ligne par scène :
|
|||
|
|
`Sexe : curseur sans position, prise du couple indisponible`. Sélection si le curseur est à 120 px au plus du
|
|||
|
|
segment bassin-tête projeté (`ProjectWorldLocationToScreen`) d'une des personnes. Aucun tracé de collision :
|
|||
|
|
les corps sont en `NoCollision` pendant le sexe. Clic hors du couple : aucune prise, le jeu garde le clic
|
|||
|
|
(orbite, etc.) ;
|
|||
|
|
- à la prise : caméra en vue mémorisée (pose) ; hauteur du pivot sur la surface en dessous (tracé vertical,
|
|||
|
|
Visibility, collision complexe ; couple, vue, `Wall` et `CamRoom` ignorés) ; décalage XY entre le pivot et le
|
|||
|
|
point visé par le curseur. Ligne au journal :
|
|||
|
|
`Sexe : couple pris (deplacement|rotation) a (x, y, z), hauteur sur la surface …` ;
|
|||
|
|
- **clic gauche tenu (déplacement)** : rien avant 5 px de mouvement. Ensuite, le rayon du curseur donne le point
|
|||
|
|
visé (dessus du lit ou sol), on ajoute le décalage, on borne aux limites XY de `Room.Box` moins 30 cm, et le Z
|
|||
|
|
vient de la surface sous la nouvelle place plus la hauteur prise. Tout le couple est déplacé du même vecteur ;
|
|||
|
|
- **clic droit tenu (rotation)** : le mouvement horizontal fait tourner le couple autour du pivot (positions et
|
|||
|
|
lacet), à 0,3° par pixel ;
|
|||
|
|
- pendant la prise : la caméra en vue est remise à sa pose mémorisée à chaque image (aucune orbite au clic, aucun
|
|||
|
|
zoom de la molette dans Room), et `PC.MoveCamera` est mis à faux ;
|
|||
|
|
- au relâcher : `Sexe : couple pose a (x, y, z), lacet …` ou `Sexe : couple tourne de … degres, lacet …`, puis
|
|||
|
|
fin de la prise.
|
|||
|
|
- **`ReleaseCoupleGrab`** (nouveau) : remet la prise à zéro et oublie les boutons et la caméra figée.
|
|||
|
|
- **`.h`** : déclarations de `TickCoupleMouse` et `ReleaseCoupleGrab`, et état de la prise (`CoupleGrabMode`,
|
|||
|
|
boutons, `bGrabMoved`, hauteur, décalage, souris, rotation, caméra figée, `bCursorWarned`). Déclarations
|
|||
|
|
anticipées de `AActor` et `UGameInstance`.
|
|||
|
|
|
|||
|
|
## 2. Gardes demandées par Big Boss
|
|||
|
|
- **Pendant le sexe et en mode Scene seulement** : `SexOn` et l'absence de menu sont testés au début de
|
|||
|
|
`TickSexCamera`, le mode Scene dans `TickCoupleMouse`.
|
|||
|
|
- **Clics rendus à la sortie** : hors sexe, aucune prise, aucune écriture, aucun clic consommé. Le C++ ne bloque
|
|||
|
|
jamais un clic : il lit l'état des boutons, et le jeu reçoit toujours ses clics. Seul `MoveCamera` est remis à faux
|
|||
|
|
pendant une prise.
|
|||
|
|
- **Dans la pièce** : borne XY au sol de `Room.Box`, moins 30 cm. Les cloisons intérieures ne sont pas testées.
|
|||
|
|
- **Flèches (P2) et Maj + molette** : pas de conflit hors prise. Pendant un déplacement, la position suit le curseur
|
|||
|
|
à chaque image. Un appui de flèche est donc remplacé à l'image suivante, et la hauteur vient de la surface.
|
|||
|
|
Maj + molette ne joue pas pendant une prise de déplacement, et redevient actif au relâcher.
|
|||
|
|
|
|||
|
|
- **Reprise après la VAL (D-1)** : avec Maj tenu, un clic ne prend pas le couple. La rotation d'origine (Maj +
|
|||
|
|
bouton + souris, voie Room) garde donc la main, comme le dit la SPEC § 7.11b. Deux lignes de plus dans la
|
|||
|
|
sélection. Diff revu par le même validateur.
|
|||
|
|
- Laissés en l'état (VAL D-2 à D-9, non bloquants, à observer en V7) :
|
|||
|
|
- `AnimatingSpeed` pendant un glisser ;
|
|||
|
|
- saut au bord si le couple démarre hors du sol ;
|
|||
|
|
- saut au premier pas si le curseur ne vise rien à la prise ;
|
|||
|
|
- une image de décalage possible de la caméra ;
|
|||
|
|
- changement de vue pendant une prise ;
|
|||
|
|
- bouton tenu à la fermeture d'un menu ;
|
|||
|
|
- plafond ou baldaquin touché avant le lit ;
|
|||
|
|
- témoin écrit dès qu'un bouton est tenu.
|
|||
|
|
|
|||
|
|
## 3. Points à confirmer en VAL et en V7
|
|||
|
|
- Compilation (COMMUN-8) : signatures `GetMousePosition(float&, float&)`, `DeprojectMousePositionToWorld`,
|
|||
|
|
`ProjectWorldLocationToScreen`, `FCollisionQueryParams::AddIgnoredActors(TArray<AActor*>)`,
|
|||
|
|
`FMath::PointDistToSegment`.
|
|||
|
|
- En jeu :
|
|||
|
|
- le curseur a une position en mode Scene ;
|
|||
|
|
- un clic gauche sur le couple ouvre-t-il une interaction de Room (`SelectUnderCursor`) ?
|
|||
|
|
- un widget de scène ouvre-t-il un menu au clic droit ?
|
|||
|
|
- hauteur sur le lit juste ; borne au sol ;
|
|||
|
|
- aucune ligne `Accessed None` nouvelle.
|
|||
|
|
- Essais CAM-58 à CAM-63 (`CAM-B2p-SPEC.md` § 7.11).
|
|||
|
|
|
|||
|
|
## 4. Fichiers à commiter
|
|||
|
|
A `Source/LifePlay/LPCameraModeSubsystem.cpp` et `.h` (non suivis jusqu'ici) ; A `CAM-B2p-D-IMPL.md`,
|
|||
|
|
`CAM-B2p-D-VAL.md`.
|