# CAM-B2c : indicateur du mode de caméra (SPEC courte, 2026-10-13) Demande de l'utilisateur, relayée par Big Boss : « Afficher aussi dans quel mode de caméra on est ». Écriture après B2b, sur GO de Big Boss. Lecture seule pour cette SPEC. ## 1. Choix technique : un sous-système C++ qui observe la vue, sans toucher aux Blueprints - **Modèle existant** : `LPDirectControlSubsystem` affiche déjà une superposition Slate par `GEngine->GameViewport->AddViewportWidgetContent(Root, 50)` (`Source/LifePlay/LPDirectControlSubsystem.cpp:1049-1072`). `LPOutdoorRoomSubsystem` lit les variables de GI et de Room par réflexion (`FindPropertyByName`) depuis un ticker (`LPOutdoorRoomSubsystem.cpp:13-26, 32-47`). - **Proposition** : un nouveau `ULPCameraModeSubsystem` (GameInstanceSubsystem, nouveaux fichiers `.h` et `.cpp` dans `Source/LifePlay`). Un ticker toutes les 0,1 s lit la cible de vue du PC, en déduit le mode et met à jour un petit `STextBlock`. - **Pourquoi pas en Blueprint** : il faudrait écrire le libellé à chaque voie de commutation (C, `RestoreC1`, contacts, sexe, changement de pièce, constructeur, CharGen), soit environ 10 points d'insertion dans Room, PC et GI, plus un widget UMG à modifier par MCP. L'observation de la vue couvre toutes ces voies d'un coup, y compris celles ajoutées plus tard (B3, B4), sans aucun nœud. - **Conséquences** : Room, PC, GI et Person ne sont pas touchés, donc pas de MCP ni d'instantané d'asset. Il faut une compilation C++ (environ 1 min) et un build. ## 2. Règle de classement (évaluée dans cet ordre, toutes les 0,1 s) | Condition (lecture par réflexion) | Libellé (proposé, en anglais comme l'interface du jeu) | |---|---| | vue = `GI.Birdview` (classe contenant `Birdview`) | `Camera: Overview` | | `GI.SexOn` vrai et `PC.POVOn` vrai (variable du PC, corrigé en B2f) | `Camera: POV` | | `GI.SexOn` vrai | `Camera: Scene` | | vue = `GI.PlayerCharacter` et `Room.CamC1On` vrai | `Camera: C1 First person` | | vue = `Room.CamRoom` et `Room.CamC3On` vrai | `Camera: C3 Ceiling` (à partir de B3) | | vue = `Room.CamRoom` | `Camera: C2 Follow` | | `Room.CamC3On` vrai (vue = ancienne caméra de pièce, C3 provisoire jusqu'à B3) | `Camera: C3 Room (old)` | | vue ∈ `GI.ChargenCameras` | `Camera: Studio` | | vue = `Room.SceneCamera` (constructeur) | `Camera: Builder` | | sinon | rien affiché | Libellés en français possibles si l'utilisateur le préfère (« Caméra : C1 1re personne », etc.). Variables relues dans les dumps : GI `Birdview`, `ChargenCameras`, `PlayerCharacter`, `PC`, `Room`, `SexOn`, `SpaceOn` (`ST/STE/dumps/GI__EventGraph_V5.txt`) ; PC `POVOn` (dump PC de B1, `SwitchCamera`) ; Room `CamC1On`, `CamC3On`, `CamRoom`, `SceneCamera` (`CAM-B2b-VAL_LPDumpFunction_20261013-161237.txt`). Une propriété absente ou une référence nulle donne « rien affiché », sans `Accessed None` (lecture C++). ## 3. Affichage - Texte de petite taille, blanc à 70 % d'opacité, avec une ombre. - Placement : en bas à gauche, marge de 16 px. Le haut gauche porte déjà les menus et le haut droit l'heure (capture des essais de B2). - Non cliquable : `EVisibility::HitTestInvisible`. Masqué quand un menu de `MenuClasses` est ouvert (même test que `LPDirectControlSubsystem::MenuOnScreen`, à réutiliser par une fonction partagée ou par copie). - Mis à jour seulement quand le libellé change, sans redessiner à chaque tick. ## 4. Coût et place dans la file | Étape | Agent | Durée estimée | |---|---|---| | IMPL : 2 fichiers, ≈ 150 lignes, enregistrement automatique (GameInstanceSubsystem) | `lp-impl` (N3) | ≈ 30 min | | BUILD : compilation Development, 1 module | `lp-builder` | ≈ 2 min de compilation, puis le paquet du build suivant | | VAL statique : diff, fins de ligne, journal de compilation | `lp-validator` | ≈ 10 min | | Essai : C → C1 / C2 / C3, contacts, sexe et POV, sortie de pièce, constructeur | utilisateur | dans la même session d'essais | - **Build commun COMMUN-1** : B2c ne touche **pas** Room, mais il ajoute du C++. Il n'y entre que si l'IMPL et la VAL sont finies avant le lancement du build par STG. Sinon, il passe au build suivant. À Big Boss de trancher. - Commit : 2 fichiers `Source/LifePlay/LPCameraModeSubsystem.*` et les livrables, par ticket au gardien, avec une entrée CHG. ## 5. Grille - a1 b1 c1 d1 e1 f1 = 6 → N2, ajusté à N3 (C++ nouveau dans le module de jeu). - S = C3 1 (procédure `lp-build` et modèle `LPDirectControlSubsystem`) + f 1 = 2 < 3 : pas de scission.