# CAM-B2p-R : vue de scène = SceneCamera pendant le sexe (P1) et flèches = couple sans Maj (P2) (Room, fiche lp-mcp-bp, 2026-10-14) SPEC : `CAM-B2p-SPEC.md`, P1 et P2. GO de l'utilisateur sur B2p (« go », 2026-10-14) ; **option A : on revient sur Q8 pendant le sexe**. Room seul. **Aucune écriture sans UE-GO de Big Boss.** Va avec B2p-C (C++, `CAM-B2p-C-IMPL.md`). ## Barème a0 b1 c1 d0 e1 f1 = 4 → N1, ajusté à N3 (MCP) ; S = C3 1 + f 1 = 2, moins de 3 : une fiche. 3 nœuds, 13 liens, environ 40 appels. Case C9a : état relu le jour même dans `CAM-B2s-VAL_LPDumpFunction_20261014-084441.txt` (Room `C5AB724101FA898457293D64059D21A9`, EventGraph 1276 nœuds). ## Conditions d'entrée - UE-GO ; `UeState` = 0 ; aucun jeu en cours ; MD5 de Room = `C5AB724101FA898457293D64059D21A9` (sinon : relecture et compte rendu). - Instantané au moment de l'UE-GO : `.\Tools\Snapshot.ps1 -Lot CAM-B2p-R -Path Content\BPs\Room.uasset`. - unreal-mcp connecté dans la session. S'il ne l'est pas, l'utilisateur fait `/mcp` → Reconnect. - Si l'éditeur demande de recompiler des modules : arrêt et compte rendu. ## État attendu avant écriture (préfixe `/Game/BPs/Room.Room:EventGraph.`) | Nœud | Attendu | |---|---| | `K2Node_CustomEvent_43` (`ApplyRoomCamera`) | then → `IfThenElse_77.execute` | | `K2Node_IfThenElse_77` | execute ← 43.then ; Condition ← `VariableGet_269.CamC1On` ; then → 78 ; else → 79 | | `K2Node_CustomEvent_45` (`UpdateRoomCam`) | OutputDelegate → `329.Delegate` ; then → `IfThenElse_91.execute` | | `K2Node_IfThenElse_91` | execute ← 45.then ; Condition ← `PromotableOperator_8` ; then → 92 ; else → 81 | | `K2Node_VariableGet_258` | `SexOn`, self ← `VariableGet_257.GI` ; sorties 78 et 81 `.Condition` | | `K2Node_CallFunction_394` | `SetViewTargetWithBlend` ; execute ← `79.then` ; then → 303 ; NewViewTarget ← `GetArrayItem_9` | | `K2Node_CallFunction_303` | `RestoreC1` ; execute ← 394.then ; **then vide** | | `K2Node_CallFunction_441` | `K2_ClearAndInvalidateTimerHandle` ; execute ← `440.then` ; Handle ← `VariableGet_274.RoomCamTimer` | | `K2Node_IfThenElse_14` | Condition ← `VariableGet_62.MoveObject` ; then → 27 ; else → 281 | | `K2Node_IfThenElse_17` | Condition ← `VariableGet_62.MoveObject` ; then → 23 ; else → 45 | | `K2Node_VariableGet_62` | `MoveObject` ; sorties 12, 14, 17 `.Condition` | | `K2Node_VariableGet_85` | `SexOn`, self ← `VariableGet_40.GI` ; sorties `OR_17.B`, 24, 27, 23 | Tout écart : arrêt avant écriture. ## Écritures (un appel MCP par message) 1. `load_asset` `/Game/BPs/Room` ; `get_node_infos` sur les 12 nœuds du tableau. Relever les PinID et les positions. 2. Types : - Branche : `Utilitaires|ContrôleDeFlux|Branche` ; - OU : `Math|Booléen|ORBoolean`. Contrôle par `get_node_infos` après création. 3. **P1** (vue de scène pendant le sexe) : - créer la Branche S1, près de 43 ; - L1 : `43.then` → `S1.execute` (remplace 43.then → 77) ; - L2 : `258.SexOn` → `S1.Condition` ; - L3 : `S1.then` → `394.execute` (394 garde aussi 79.then) ; - L4 : `S1.else` → `77.execute` ; - créer la Branche S2, près de 45 ; - L5 : `45.then` → `S2.execute` (remplace 45.then → 91) ; - L6 : `258.SexOn` → `S2.Condition` ; - L7 : `S2.then` → `394.execute` ; - L8 : `S2.else` → `91.execute` ; - L9 : `303.then` → `441.execute` (441 garde 440.then) : la minuterie s'arrête après la pose de la vue de scène. 4. **P2** (flèches = couple sans Maj pendant le sexe) : - créer l'OU O1, près de 14 ; - L10 : `62.MoveObject` → `O1.A` ; - L11 : `85.SexOn` → `O1.B` ; - L12 : `O1.ReturnValue` → `14.Condition` (remplace 62 → 14) ; - L13 : `O1.ReturnValue` → `17.Condition` (remplace 62 → 17) ; - 62 garde sa sortie vers 12 : la molette avec Maj reste inchangée. 5. Relecture : - 43.then → S1 ; 45.then → S2 ; 45.OutputDelegate → 329 inchangé ; - 394.execute ← 79.then, S1.then, S2.then ; - 77.execute ← S1.else ; 91.execute ← S2.else ; - 258 : sorties 78, 81, S1, S2 ; - 303.then → 441 ; 441.execute ← 440.then et 303.then ; - 62 : sorties 12, O1.A ; 85 : sorties OR_17.B, 24, 27, 23, O1.B ; - 14 et 17 : Condition ← O1 ; - aucun autre lien de 78, 79, 80, 81, 92, 329, 440, 539 à 542 modifié. 6. `is_dirty` = vrai ; `compile_blueprint` avec warnings_as_errors = true ; `save_assets` [`/Game/BPs/Room`] seul ; `Saving Package: /Game/BPs/Room` ; MD5 ≠ `C5AB7241…` ; GI, PC et Person inchangés. ## Effets attendus - Pendant le sexe : - à l'entrée (la minuterie tourne en C1 et en C2) et à chaque retour en Scene (PC 353 → 140), la vue est `SceneCamera`, et la minuterie s'arrête ; - la souris (B2n), ZQSD (B2p-C) et la molette (zoom d'origine, nœud 125) agissent sur la caméra en vue ; - les flèches déplacent le couple sans Maj. - Hors sexe : rien ne change (S1.else et S2.else reprennent les voies actuelles ; O1 vaut `MoveObject`). Le mode C3 passe déjà par 394, qui mène maintenant aussi à 441 : il arrête la minuterie tout de suite au lieu du passage suivant (82.else → 440 → 441). Le résultat est le même. - Fin du sexe : le crochet B1-11 (GI 2699 → `ApplyRoomCamera`), avec `SexOn` faux, rend C1, C2 ou C3 et relance la minuterie. `SexOn` est déjà faux à ce moment-là : à 05:18:57, au journal COMMUN-6, ce crochet a rendu la voie C1 (`78.else`), ce qui n'est possible qu'avec `SexOn` faux. On le revérifie en V7. Repli si le cas change : un appel `ApplyRoomCamera` différé côté C++ quand `SexOn` redevient faux. Ce repli n'est pas écrit. ## Exigence confirmée à COMMUN-7 (utilisateur, relayé par Big Boss) « je veux que ZQSD en mode scène déplace la caméra aussi », quel que soit le mode de départ (C1, C2 ou C3). - COMMUN-7 : L1 et L2 OK (B2r) ; L5 OK (ZQSD en POV, B2p-C). - ZQSD en mode Scene (B2p-C) n'agit que si la vue est `Room.SceneCamera`. **P1 (S1 et S2) l'assure dans les trois cas** : - à l'entrée en sexe, la minuterie de C1 ou de C2 passe par S2 → 394 (`SceneCamera`), puis s'arrête ; - au départ en C3, la vue est déjà `SceneCamera` ; - à chaque retour en Scene, le PC (353 → 140) passe par S1 → 394. - Aucune partie C++ de plus. V7 : CAM-42 depuis C1, C2 et C3, dès l'entrée et après POV → Scene. ## Garde `Accessed None` `ChargenCameras[0]` (394) et `SexOn` (258) sont déjà lus sans garde sur ces voies. Rien de nouveau n'est lu. ## VAL (lp-validator distinct, éditeur fermé) - V5 : dump Room ; diff contre `CAM-B2s-VAL_LPDumpFunction_20261014-084441.txt` ; EventGraph 1276 → 1279 nœuds ; seules différences : S1, S2, O1 et les liens ci-dessus. - V6 : `CompileAllBlueprints` = référence. - V7 : CAM-41 à CAM-49 et CAM-54, CAM-55 de `CAM-B2p-SPEC.md`, avec B2p-C compilé. ## Retour arrière `.\Tools\Restore.ps1 -Lot CAM-B2p-R -Only Content\BPs\Room.uasset`, éditeur fermé, sur accord. ## Estimation Environ 40 min d'éditeur et 15 min de VAL. À passer dans le même jeton que la compilation de B2r et de B2p-C.