# CAM-B2r-IMPL (2026-10-14, session CAM, GO Big Boss : écriture sans UE ni compilation ; compilation en COMMUN-7) Fiche : `CAM-B2r-FICHE.md`. Instantané : `D:\Game\LifePlay_Backup_5.5\CAM-B2r\` (manifest : `.cpp` `FE9236BD138A46BBC2B63027977B3CD9`, `.h` `7DA111CB65B267A9E2F7482CBA368BE9`). | Fichier | Avant | Après | |---|---|---| | `Source/LifePlay/LPCameraModeSubsystem.cpp` | `FE9236BD…`, 503 lignes | `124336D3293EF06BEFCF076D10956234` | | `Source/LifePlay/LPCameraModeSubsystem.h` | `7DA111CB…`, 66 lignes | `61A3E06280BF7226ADB52ECFDD9173DE` | Fins de ligne : LF avant et après (0 CR). ## Écritures - `LPCameraModeLocal` : - nouveaux noms `GICharGenOn`, `GIMainMenuOn`, `GIJournalOn`, `GIContactsOn`, `PCMoveCamera`, `MainMenuClass`, `RoomCameraLabels`, `LabelC1`, `PlayerFirstPersonSM`, `PlayerOccupyingFnt`, `RoomCamTimer`, `LeftEyeSocket`, `RightEyeSocket` ; - nouvelles constantes `CharGenRepairDelay` (10 s), `C1Interval` (0,5 s), `C1LogInterval` (1 s), `C1MaxEyeDistance` (8 cm), `C1MaxPitch` (25°), `C1MaxYawGap` (30°) ; - nouvelles fonctions `WriteBool`, `TimerActive` (`FTimerHandle` par réflexion, `IsTimerActive`) et `WidgetOnScreen` (une classe de widget précise). - `#include "TimerManager.h"`. - `Tick` : appel de `RepairAfterCharGen(Label, bMenu, DeltaTime)` avant toute sortie ; `WitnessC1` quand le libellé est C1. - **R1** `RepairAfterCharGen` : - si `CharGenOn` est vrai, on arme ; - après CharGen, si le libellé est une caméra de pièce (C1, C2, C3 plafond, C3 ancienne) et qu'aucun menu n'est à l'écran : `SpaceOn` est remis à vrai s'il était faux, et `MainMenuOn` à faux s'il était vrai sans widget `MainMenu_C` à l'écran ; - une ligne au journal à chaque remise ; une seule réparation ; - au bout de 10 s sans caméra de pièce : abandon, avec une ligne au journal. - **R2** `LogSwitchKey` : fin de ligne `; MainMenuOn=%d JournalOn=%d ContactsOn=%d CharGenOn=%d MoveCamera=%d`. - **R3** `WitnessC1` : toutes les 0,5 s ; une ligne (au plus une par seconde) si la caméra est à plus de 8 cm des yeux, si son tangage dépasse ±25°, ou si son lacet s'écarte de plus de 30° du contrôle. La ligne donne aussi « assis » et l'état de la minuterie `RoomCamTimer`. - `.h` : `RepairAfterCharGen`, `bCharGenSeen`, `CharGenRepairTimeout`, `WitnessC1`, `C1Cooldown`. ## Écart à la fiche - Le critère « vue = caméra de pièce » utilise le libellé déjà calculé par `ComputeLabel`. Il recouvre exactement les quatre cas de la fiche et exclut `Birdview` (« Camera: Overview »). On n'attend pas non plus la fermeture des menus, pour ne pas écrire pendant un menu. - R3 : si l'axe de visée de `FirstPerson_C` n'est pas son X local, le témoin écrira une ligne par seconde en C1 (bruit, sans effet sur le jeu). À voir à l'essai ; le seuil se règle dans les constantes. - Écarts relevés par la VAL (`CAM-B2r-VAL.md`, C-1 et C-2), acceptés par l'orchestrateur : - C-1 : les lignes « CharGen : … » donnent aussi l'indicateur (`indicateur '%s'`), en plus de la vue ; - C-2 : l'état de la minuterie est lu par `FTimerManager::IsTimerActive` (C++), et non par `K2_IsTimerActiveHandle` (sa version Blueprint). Même résultat, sans passer par Kismet. - Réserves non bloquantes laissées en l'état (VAL C-3 à C-6) : - le délai de 10 s s'écoule aussi pendant un menu ; - le témoin C1 devient bruyant si les douilles des yeux manquent ; - le test du widget `MainMenu_C` est redondant ; - l'en-tête du fichier porte encore « CAM-B2c ». On les reprendra si l'essai le demande : modifier le code maintenant changerait les MD5 validés. ## Non fait (hors GO) Compilation (COMMUN-7, sous jeton UE). Aucune autre écriture.