# CAM-B2p-I-IMPL : aide des contrôles derrière une icône « i » (C++ seul) et reprise N2 de B2p-H (2026-10-14) GO : Big Boss, 2026-10-14 (option 1, C++ seul ; aide en anglais, touches lues dans les mappages ; pas de lecture MCP, confirmation au premier essai ; code défensif ; la ligne de la molette est retirée si CAM ne déplace pas le couple à la molette ; N2 entre aussi dans COMMUN-13). SPEC : `CAM-B2p-I-SPEC.md`. Écriture sans compilation ; aucun asset touché ; rien chez STG ni STE. ## 0. Instantanés et empreintes (`D:\Game\LifePlay_Backup_5.5\`) | Point | Instantané | `.cpp` avant | `.h` avant | |---|---|---|---| | I0 : N2 de B2p-H | `CAM-B2p-I0` | `210B665AA8D5D628B8C1AC429A339B74` | `239DA6094E7401E0E3B3699A635A8150` | | I1 : aide des contrôles | `CAM-B2p-I1` | `3A11A3872378485DC64804AEC0A761EE` | `239DA609…` | | **Final** | — | **`73CC3BD667059A903E44405C5E793DE3`**, 1969 lignes | **`6EDBBCCF61759B8C6EE4890DF9BC5FE7`**, 179 lignes | Fins de ligne : LF (0 CR). ## 1. I0 : N2 (VAL B2p-H) Au glisser, quand la place est admise et que le couple bouge : `LastSurfaceRefused.Reset()`. Un nouveau passage sur la même surface refusée écrit de nouveau sa ligne `surface refusee`. ## 2. I1 : aide des contrôles ### 2.1 Vérification demandée : la molette CAM ne déplace pas le couple à la molette : `bSexWheelZoom = false` (`LPCameraModeSubsystem.cpp`, constantes B2p-C). La molette passe à Room (zoom d'origine, nœud 125). **La ligne « Mouse wheel » est retirée** du texte d'aide. ### 2.2 Écritures - **Includes** : `Blueprint/WidgetTree.h`, `Components/Button.h`, `CanvasPanelSlot.h`, `HorizontalBoxSlot.h`, `Image.h`, `PanelWidget.h`, `TextBlock.h`, `Engine/Texture2D.h`, `Widgets/Layout/SBorder.h`. - **Constantes** (`LPCameraModeLocal`) : `GISexInterface`, `SexHelpLinesName` (`TextBlock_1`), `SexHelpLinesStart` (« Click any mouse button »), `PCCursorREF`, `CursorSearchAction`, `CursorBelowCursor`, `HelpButtonName` (`LPControlsHelp`), `HelpIconPath` (`/Game/Heavy/New/info.info`), `HelpIconSize` (28 px), `HelpZOrder` (60), `ActionPause`. - **`MappedKeys(Name, Sign)`** (namespace) : noms des touches du clavier de l'axe ou de l'action, mappages en cours de `UInputSettings` (même source que `AxisValue`). Souris, manette et axes analogiques exclus ; « ? » si aucune touche. - **`BuildControlsHelp`** : texte en anglais ; `<…>` = touches lues : ``` CAMERA : next view (Scene > C3 couple close-up > each partner's eyes) / : move closer / away / : orbit around the couple (eyes view: look around) Hold a mouse button away from the couple and move the mouse: rotate the camera COUPLE Left-drag the couple: move it (floor or bed only) Right-drag the couple: turn it , : move the couple ACTIONS or middle click: show / hide this panel ``` - **`TickControlsHelp`**, appelé en tête de `Tick` (0,1 s), avant les retours de l'indicateur (le filtre qui a le focus compte comme un menu pour `MenuOnScreen`) : - **I-d** (pendant le sexe) : `GI.SexInterface` → `TextBlock_1`. **Seulement si son texte commence par « Click any mouse button »** (sensible à la casse) : opacité de rendu à 0, et l'ancienne valeur est gardée. La liaison `Get_TextBlock_1_Text` **reste en place** : `UTextBlock::SetText` la retirerait (`TextBlock.cpp:469-478`, moteur 5.8). Si le même bloc porte plus tard un autre texte (jouissance), il retrouve son opacité. Une ligne au journal à chaque changement. - **I-a** : `PC.CursorREF`, une tentative d'insertion par instance du `Cursor` pendant le sexe (`AttachHelpIcon`). L'icône est visible pendant le sexe et repliée hors du sexe (le `Cursor` sert aussi aux autres menus d'action). Info-bulle mise à jour si le texte change (remappage). - **I-c** : boîte d'aide montrée seulement si `bHelpBoxOpen`, pendant le sexe, et le panneau ouvert (`Cursor.BelowCursor` visible, même test que `IfThenElse_10` du PC). Fermée avec le panneau. - **`AttachHelpIcon`** (défensif) : - icône déjà présente (par nom) : reprise, clic relié une fois (`AddUniqueDynamic`) ; - `SearchAction` ou son parent introuvable : **rien n'est inséré**, ligne `Aide sexe : icone non inseree, … introuvable` ; - `SearchAction` ancré en étirement dans un `CanvasPanel` : rien n'est inséré, une ligne ; - bouton transparent ; image de la texture `info` à 28 px ; **texture absente : un « i » en texte** (gras 18, blanc) ; - `AddChild` dans le parent de `SearchAction`. `InsertChildAt` n'est pas utilisé : son ordre ne passe pas à Slate sans reconstruction (`PanelWidget.h:68-72`). L'icône vient donc **en fin de la rangée du filtre**, après ses boutons (dans une `HorizontalBox` : centrée, marge de 4 px), ou à droite du filtre dans un `CanvasPanel`. - ligne `Aide sexe : icone inseree dans (, enfants), image `. - **`ToggleControlsHelp`** (`UFUNCTION`, clic) : ouvre ou ferme la boîte ; ligne au journal ; rafraîchit tout de suite. - **`EnsureHelpBox` / `RemoveHelpBox`** : `SOverlay` du viewport (ordre Z 60), en bas à droite, à la place des 4 lignes. Fond noir à 75 % (`WhiteBrush` teinté), texte blanc de 14 avec ombre noire. `LPReadableText` n'est pas nécessaire. Retirée dans `Deinitialize`. - **`.h`** : déclarations avancées `UButton`, `UTextBlock`, `UUserWidget` ; 6 fonctions, 10 membres. ## 3. Écarts à la SPEC - L'icône est ajoutée en fin de rangée, et non juste après le champ (voir `AttachHelpIcon`). L'utilisateur acceptait « à côté du champ de filtre ou des boutons ». - I-d utilise l'opacité de rendu et non le vidage du texte : vider le texte retirerait la liaison pour toute l'instance. - Pas de lecture MCP (décision de Big Boss) : le premier essai confirme le parent, l'icône et le texte de `TextBlock_1` par les lignes `Aide sexe :`. ## 4. Points à confirmer à l'essai (COMMUN-13) - CAM-86 : ligne `icone inseree` (parent, classe), image `info` ; ligne `4 lignes d'origine masquees`. - CAM-87 : le survol montre l'info-bulle ; le clic ouvre et ferme la boîte ; la fermeture du panneau la ferme. - CAM-88 : les touches affichées sont celles du clavier (Z/S, Q/D sur AZERTY) ; elles suivent un remappage. - CAM-89 : hors du sexe, l'icône est absente du `Cursor` et le texte de jouissance est toujours affiché. - CAM-90 (N2) : deux passages sur la même commode écrivent deux lignes. ## 4 bis. Reprise après la VAL (`CAM-B2p-I-VAL.md`) - **D1** (corrigé, instantané `CAM-B2p-I2`, `.cpp` `73CC3BD6…` → **`0F383EF777DED71608347E17D4A0861F`**, 1976 lignes, +7/−0 ; `.h` inchangé `6EDBBCCF…`) : `UPanelWidget::AddChild` rend nul pour un panneau à enfant unique déjà occupé. Dans ce cas, plus rien n'est inséré ; ligne `Aide sexe : icone non inseree, () refuse un enfant de plus`. C'est la consigne 2 de Big Boss. - **D2** (pour Big Boss) : Room monte et descend le couple avec **Maj + molette** (`CAM-B2p-E-IMPL.md:48`). La consigne (« retirer si CAM ne déplace pas le couple à la molette ») est tenue, mais l'aide omet ce contrôle réel. On peut ajouter `Shift + mouse wheel: raise / lower the couple`. - **D3** (non corrigé) : l'opacité 0 de `TextBlock_1` n'est pas rendue hors du sexe. Le bloc porte le même texte et le PC le cache hors du sexe : sans effet attendu, à voir à CAM-89. - N7 de la VAL : le `.h` ajoute 9 membres, et non 10. ## 5. Fichiers à commiter A `Source/LifePlay/LPCameraModeSubsystem.cpp` et `.h` ; A `CAM-B2p-I-SPEC.md`, `CAM-B2p-I-IMPL.md`, `CAM-B2p-I-VAL.md`.