# CAM-B2p-I-SPEC : aide des contrôles du sexe derrière une icône « i » du panneau des actions (DIAG + SPEC, 2026-10-14) Demande de l'utilisateur, relayée par Big Boss : « utilise l'icone information à coté de faq pour afficjer les informations sur les controles en lieu et place du texte. ce texte appartient à la zone de filre ». Lecture seule ; aucune IMPL sans GO. Le build COMMUN-12 tournait chez STG pendant la DIAG : ni éditeur ni commandlet. La DIAG repose sur les octets des assets (`grep -a`, noms et chaînes), le dump du PC de B2p-G (`CAM-B2p-G-PC-VAL_LPDumpFunction_20261014-135527.txt`) et le C++. Les points marqués **à confirmer** se liront par MCP ou `LPDumpFunction` après le build. ## 1. DIAG ### 1.1 Les 4 lignes : `SexInterface`, `TextBlock_1` - **Établi** : les 4 phrases (« Click any mouse button for action menu », « (NEW!) Hold any mouse button to rotate camera », « (NEW!) Scroll mouse wheel or press WASD to move camera », « (NEW!) Hold Shift while doing any of the above to rotate / move the people instead ») ne sont que dans `Content/UI/SexInterface.uasset` (recherche dans tout `Content`, `Source`, `Config`). Ce sont des chaînes de l'asset, sans table de localisation (aucun dossier `Content/Localization` ; `DefaultGame.ini:38-40` : `InternationalizationPreset=English`, `CulturesToStage=en`). - **Établi** : `SexInterface` n'a que deux blocs de texte, `TextBlock_0` (liaison de visibilité `Get_TextBlock_0_Visibility`) et `TextBlock_1` (liaison de texte `Get_TextBlock_1_Text`, avec `Conv_StringToText`). - **Établi** (dump du PC) : le PC montre `SexInterface.TextBlock_1` **en même temps que le panneau des actions** et le cache avec lui : - ouverture : `LeftMouseSexOn` → `IfThenElse_10.else` → `CallFunction_154` `SetVisibility(Visible)` sur `TextBlock_1` → `CallFunction_124` `Cursor.MoveCursorToMouse` (l. 3021-3043, 997-1000) ; - fermeture : `CallFunction_1394` `SetInputMode_GameOnly` → `CallFunction_38` `SetVisibility(Hidden)` sur `TextBlock_1` (l. 1171-1176, 4003-4007). C'est pourquoi l'utilisateur voit ce texte comme une partie de la zone du filtre. - **Estimé fort, à confirmer** : `TextBlock_1` porte les 4 lignes. `Get_TextBlock_1_Text` peut aussi rendre un autre texte (l'asset contient « Close to cumming, keep going to 100… » et la variable `CumText`). Le graphe de la liaison sera lu par `LPDumpFunction -BP=SexInterface -Fn=Get_TextBlock_1_Text_0 -Pins -Exec`. ### 1.2 Le panneau des actions : `Cursor` - **Établi** : le champ « Type keyword to filter actions » est l'`EditableTextBox` `SearchAction` du widget `Content/UI/Cursor.uasset` (`Cursor_C`, `PC.CursorREF`). Ses boutons nommés : `MoveHomeButton`, `RandomButton`, `ShuffleActor`, `StripAllButton`, `TranslateButton`, `ActionButton`, et deux boutons à appui et relâcher (`ComponentBoundEvent_2` à `_5`). Les libellés « << » et « >> » sont des textes de l'asset. - **Établi** : `TranslateButton` appelle la traduction Google de GI (`https://translate.google.com/?sl=en&tl=zh-CN`), vers le chinois. - **Estimé, à confirmer** : le bouton « ? » est `RandomButton` (action au hasard ; le texte d'aide d'origine dit « press Space to change to a random… »). Il a déjà un rôle : **on ne le réutilise pas**. Le soutien-gorge est `StripAllButton`. - **À confirmer** : le parent de `SearchAction` (l'asset a `HorizontalBox_0`, `WrapBox`, `ScrollBox_3`, `CanvasPanel`), où l'icône sera insérée. ### 1.3 L'icône FAQ - **Établi** : `MainMenu` a `FAQButton`, `FAQBack`, `FAQSection` et la texture **`/Game/Heavy/New/info`** (`Content/Heavy/New/info.uasset`, 13 866 octets), la seule texture « info » du menu. Elle est cuite, puisque `MainMenu` la référence. - **Estimé fort, à confirmer** : c'est l'image de `FAQButton` (le cercle avec un i). Vérification par MCP : `get_widget` du bouton, ou une ligne au premier essai. ### 1.4 Langue - **Établi** : le jeu est en anglais seulement (preset ICU `English`, seule la culture `en` est cuite). Toute l'interface, y compris les ajouts C++ (« Keyboard », « Camera: C3 Couple »), est en anglais. « Selon le jeu » donne donc **l'anglais**. Une détection du français par la culture ne marcherait pas, faute de données `fr` cuites. `FPlatformMisc::GetDefaultLanguage()` (langue du système) serait possible, mais ce n'est pas la langue du jeu. ### 1.5 LPReadableText - **Établi** (`LPReadableTextSubsystem.h:1-12`) : ce sous-système ne restyle que les `SpinBox` et les `Text Box`. Il ne touche ni une info-bulle ni un `TextBlock`. **Il n'est pas nécessaire** : une info-bulle UMG a déjà son fond sombre et son texte clair ; une boîte d'aide créée en C++ reçoit son style à la création (blanc, contour noir, fond sombre, comme l'indicateur de caméra). ### 1.6 Contrôles réels pendant le sexe (B2p-C à B2p-H) | Action | Contrôle | Source | |---|---|---| | Vue suivante : Scene → C3 → yeux de chaque partenaire → Scene | C (`SwitchCamera`) | B2p-G (PC G-d) | | Tourner autour du couple, avancer ou reculer (Scene, C3) | axes `MoveRight` et `MoveForward` (ZQSD sur le clavier de l'utilisateur) | B2p-C | | Regarder autour (vue des yeux) | mêmes axes | B2p-C | | Tourner la caméra | bouton tenu hors du couple, et la souris | PC `MoveCamera` | | Déplacer le couple, sur le sol ou un lit | glisser au clic gauche sur le couple | B2p-D, H | | Tourner le couple | glisser au clic droit sur le couple | B2p-D | | Déplacer le couple au clavier | flèches (`LeftRight` et `DownUp`) | Room (B2p-R, O1) | | Monter ou descendre le couple | molette (`ScrollDownUp`, Room) | **estimé** (COMMUN-11 : `molette`, Z +9) | | Ouvrir ou fermer le panneau des actions | Espace ou clic molette | B2p-G (PC G-g), H5 | | Voie d'origine du jeu | Maj + bouton tenu + souris | Room, laissée par B2p-D | ## 2. SPEC ### 2.1 Option 1, recommandée : C++ seul (`LPCameraModeSubsystem`), sans asset ni nœud Précédent : `LPKeyboardSubsystem::AttachButton` (`LPKeyboardSubsystem.cpp:578-601`) ajoute un bouton UMG à la volée dans un widget du jeu. - **I-a, icône** : pendant le sexe, quand le `Cursor_C` du jeu est à l'écran, une fois par instance : - un `UButton` `LPControlsHelp` (fond transparent), contenant un `UImage` de la texture `/Game/Heavy/New/info` (`LoadObject`), de la taille des autres icônes du panneau (24 à 32 px, à régler sur la capture) ; - inséré dans le parent de `SearchAction`, juste après lui ; - si le parent n'est pas un panneau connu ou si la texture manque : rien n'est inséré, une ligne au journal. - **I-b, survol** : `ToolTipText` = texte d'aide (§ 2.3), l'info-bulle native d'UMG. - **I-c, clic** : affiche ou cache une boîte d'aide (`UBorder` sombre et `UTextBlock` blanc avec contour, police 14) sous le panneau, au même endroit que les 4 lignes. Elle se cache aussi quand le panneau se ferme. - **I-d, les 4 lignes** : la liaison `Get_TextBlock_1_Text` est retirée **sur l'instance** (`TextBlock_1` de `GI.SexInterface`) et le texte est vidé, une fois par instance. Le PC peut le rendre visible, il n'affiche rien, sans clignotement. Si § 1.1 montre que la liaison rend aussi le texte de jouissance, on ne la retire pas : on cache le bloc seulement quand il porte l'aide (comparaison avec le début « Click any mouse button »). C'est à trancher après le dump. - **I-e, touches lues** : les noms de touches viennent des mappages en cours (`UInputSettings` : `MoveForward`, `MoveRight`, `SwitchCamera`, `Pause`, `LeftRight`, `DownUp`). Un remappage par le menu Keyboard est donc suivi, et l'utilisateur voit Z Q S D. - Hors du sexe, rien ne change : on ne touche ni l'icône ni le texte. L'icône reste dans l'instance du `Cursor`, mais le panneau n'est ouvert que pendant le sexe ; à confirmer pour d'autres usages du `Cursor`, et la cacher hors sexe si besoin. - Coût : environ 150 à 200 lignes de C++, 2 h d'écriture et 30 min de VAL statique. **0 nœud, pas d'UE-GO** hors du build. Une lecture MCP courte (lp-mcp, environ 6 appels, sous UE-GO, lecture seule) pour confirmer § 1.1 à 1.3 avant l'IMPL ; sinon, le C++ écrit au journal ce qu'il trouve, et le premier essai tranche. ### 2.2 Option 2 : Blueprint par MCP (non recommandée) - `Cursor` : ajouter un bouton et une image dans l'arbre du designer. Il faut un outil MCP d'édition de l'arbre des widgets, **non vérifié** dans `unreal-mcp` (aucun lot ne l'a fait). - `SexInterface` : changer `Get_TextBlock_1_Text` (environ 3 nœuds) ou la visibilité. - PC : retirer `CallFunction_154` (1 coupure et 1 lien). - Coût estimé : environ 25 à 40 appels, 3 assets touchés, et une langue figée dans l'asset. ### 2.3 Texte d'aide proposé (anglais, langue du jeu ; `<…>` = nom de touche lu à l'exécution) ``` 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 Arrow keys: move the couple Mouse wheel: raise / lower ACTIONS or middle click: show / hide this panel ``` Variante française, si l'utilisateur la préfère (constante du C++, pas une détection) : ``` CAMÉRA : vue suivante (Scene > C3 plan du couple > yeux de chaque partenaire) : avancer / reculer : tourner autour du couple (vue des yeux : regarder) Bouton de souris tenu hors du couple + souris : tourner la caméra COUPLE Glisser le couple au clic gauche : le déplacer (sol ou lit seulement) Glisser le couple au clic droit : le tourner Flèches : déplacer le couple Molette : monter / descendre ACTIONS ou clic molette : afficher / cacher ce panneau ``` La ligne « Molette » reste à confirmer à l'essai (§ 1.6) ; on la retire si la molette ne déplace pas le couple. ## 3. Risques - R1 : le parent de `SearchAction` est un `CanvasPanel` (placement absolu) : l'icône exige un ancrage calculé. On le lit avant l'IMPL. - R2 : `TextBlock_1` porte aussi le texte de jouissance (§ 1.1) : I-d devient conditionnel. - R3 : une instance de `Cursor` recréée (changement de scène) : l'insertion se refait, par nom (`LPControlsHelp`), comme `AttachButton`. - R4 : les infobulles UMG apparaissent après un délai (0,5 s environ) : le clic reste le moyen sûr. ## 4. Essais proposés (après le build qui suivra le GO) - CAM-86 : panneau ouvert, l'icône « i » est à côté du filtre, avec la même image que FAQ ; les 4 lignes ont disparu. - CAM-87 : le survol montre l'aide ; le clic l'affiche et la cache ; la fermeture du panneau la cache. - CAM-88 : après un remappage (Keyboard), l'aide montre les nouvelles touches. - CAM-89 : hors du sexe, aucun changement, et le texte de jouissance est toujours affiché s'il existe. ## 5. Questions pour le GO 1. Option 1 (C++ seul) ? 2. Langue : anglais (langue du jeu), ou la variante française ? 3. Lecture MCP courte avant l'IMPL (sous UE-GO, environ 6 appels), ou confirmation au premier essai ?