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

156 lines
11 KiB
Markdown

# 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<UTexture2D>`), 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
<C>: next view (Scene > C3 couple close-up > each partner's eyes)
<Z><S>: move closer / away <Q><D>: 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
<Space> 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
<C> : vue suivante (Scene > C3 plan du couple > yeux de chaque partenaire)
<Z><S> : avancer / reculer <Q><D> : 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
<Espace> 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 ?