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

6.1 KiB
Raw Blame History

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.