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

4.5 KiB

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.