LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B0-IMPL.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

81 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CAM-B0-IMPL : sonde MCP des capacités de la phase 2 (2026-10-13)
Lot CAM, sous-lot B0 (`CAM-SPEC.md` § (a) CAM-B0, Q16). BUILD-GO de Big Boss le 2026-10-13. Exécuté par la session CAM
(`local_cb58847a`), appels MCP un à un depuis la session, sans sous-agent `lp-mcp-bp`. **Aucun fichier suivi écrit.**
Mode de permission : auto ; **0 refus** du mode auto sur ≈ 75 appels MCP (création, écriture, compilation, enregistrement).
## 1. Déroulé
- Avant : 0 processus UE, port 8000 libre, `Content\Dev` absent ; `git status -- Content Source Config` = GI, Person,
TopRight en `M` (STE-H10).
- Éditeur headless (`lp-mcp` § 2) : PID 26368, journal `Saved\Logs\CAM-B0_editeur_20261013-074758.log` (hors git) ;
`Wait-HyperAIStudioMCP.ps1 -TimeoutSeconds 540` code 0 ; `unreal-mcp` visible dans la session sans reconnexion
(`get_current_level` = `/Game/Scenes/CentralLondon`).
- Création de `/Game/Dev/CAM_Probe` (Actor) et `/Game/Dev/CAM_Probe2` (Actor) ; essais ; `compile_blueprint`
(`warnings_as_errors` vrai) ; `save_assets` des 2 sondes seules ; `Stop-Process` (accepté) ; `UeState.ps1` = 0 ;
déplacement vers `D:\Game\LifePlay_Backup_5.5\CAM\B0\` ; `Content\Dev` vide retiré (`rmdir`).
- Écart : 2 appels `add_variable` envoyés en parallèle (contre « un appel à la fois ») ; tous deux réussis, sans effet.
- Journal brut des appels : `CAM-B0-journal.txt` (début de séance).
## 2. Résultats par capacité (R1 / R2 de la SPEC)
| # | Capacité | Résultat | Détail (type_id exact, éditeur en français) |
|---|---|---|---|
| 1 | `BlueprintTools.create` d'un Actor | fait | `asset_type` = `/Script/Engine.Actor` |
| 2 | `add_variable` bool, Vector | fait | `ProbeBool`, `ProbeVec` |
| 3 | `add_object_variable` CameraActor | fait | `CamRoom` (`/Script/Engine.CameraActor`) |
| 4 | `add_struct_variable` TimerHandle | fait | `ProbeTimer` (`/Script/Engine.TimerHandle`) — nécessaire au point 8 |
| 5 | `add_event` personnalisé | fait | `ProbeEvent` → `K2Node_CustomEvent_0` (broches `OutputDelegate` 0, `then` 1) |
| 6 | surcharge `ReceiveEndPlay` / `ReceiveBeginPlay` | fait | `add_event` rend un `K2Node_Event` (« Ajouterunévénement\|ÉvénementEndPlay ») ; BeginPlay rend le nœud fantôme existant |
| 7 | `SpawnActorFromClass` + `Class` = CameraActor | fait | `Jeu\|Faireapparaîtreunacteuràpartird'uneclasse` ; après `set_pin_value`, `ReturnValue` typé « Acteur De Caméra », broche `Instigator` ajoutée (index 6) |
| 8 | minuterie par événement `K2_SetTimerDelegate` | fait | `Utilitaires\|Temps\|SetTimerbyEvent` ; `OutputDelegate` → `Delegate` (1) ; `Time` (2) = 0,016, `bLooping` (3) vrai, `bMaxOncePerFrame` (4) vrai ; sortie `ReturnValue` (1) = TimerHandle |
| 9 | **`K2_ClearTimerDelegate`** | **ÉCHEC** | absent de `find_node_types` (« ClearTimer » → seul `ClearTimerbyFunctionName`) ; `create_node` « Utilitaires\|Temps\|ClearTimerbyEvent » → « The node could not be created / Utilitaires\|Temps\|ClearTimerbyEvent does not exist » |
| 9b | remplacement : arrêt par handle | fait | `SetTimerbyEvent.ReturnValue` → `Définir ProbeTimer` ; `Obtenir ProbeTimer` → `Utilitaires\|Temps\|ClearandInvalidateTimerbyHandle.Handle` (1) ; EndPlay → Clear |
| 10 | `SphereTraceSingle`, canal Camera | fait | `Collision\|SphereTraceByChannel` ; `TraceChannel` (4) = `TraceTypeQuery2` (relu par `get_pin_value`), `Radius` (3) = 12 ; sorties `OutHit` (1), `ReturnValue` (2) |
| 11 | `BreakHitResult` | fait | `Collision\|BreakHitResult`, entrée 0 ← `OutHit` |
| 12 | `VInterpTo`, `RInterpTo` | fait | `Math\|Interpolation\|VInterpTo` / `RInterpTo` ; entrées Current 0, Target 1, DeltaTime 2 (float), InterpSpeed 3 (= 8) |
| 13 | `GetWorldDeltaSeconds` | fait | `Utilitaires\|Temps\|GetWorldDeltaSeconds`, sortie double reliée à DeltaTime float (conversion acceptée) |
| 14 | `FindLookAtRotation` | fait | `Math\|Rotateur\|FindLookatRotation` → `RInterpTo.Target` |
| 15 | `GetComponentBounds`, `GetActorBounds` | fait | `Collision\|GetComponentBounds`, `Collision\|GetActorBounds` (créés, non câblés) |
| 16 | `GetSocketLocation` | fait | `Transformation\|GetSocketLocation` (créé, non câblé) |
| 17 | `GetScaledCapsuleHalfHeight` | fait | `Composants\|Capsule\|GetScaledCapsuleHalfHeight` |
| 18 | `Less_DoubleDouble` | fait | opérateur générique `Utilitaires\|Opérateurs\|Inférieurà(<)` (`K2Node_PromotableOperator`) ; devient `float<float` (double) dès qu'une entrée float est reliée ; `B` = 0,05 |
| 19 | `EqualEqual_ObjectObject` | fait | `Utilitaires\|Opérateurs\|Égalà(==)` ; devient `Equal(Object)` quand `CamRoom` est relié |
| 20 | addition, soustraction, multiplication de vecteurs | fait | `Utilitaires\|Opérateurs\|Ajouter` / `Soustraire` / `Multiplier` → `vector+vector`, `vector-vector` ; `Multiplier` accepte B double (vecteur × scalaire) ; chaîne reliée à `Définir ProbeVec` (exécutée) |
| 21 | affectation de `PostProcessSettings` d'un CameraComponent | fait | `Classe\|CameraComponent\|DéfinirPostProcessSettings` (`K2Node_VariableSet`, `self` 2, valeur 1) ← `Classe\|CameraComponent\|ObtenirPostProcessSettings` |
| 22 | `CamRoom.CameraComponent` | fait, par la catégorie `Classe` | `Variables\|Acteurdelacaméra\|ObtenirCameraComponent` (listé seulement avec `context_pins`) → « does not exist », même avec `declaring_class` ; **`Classe\|Acteurdecaméra\|ObtenirCameraComponent`** crée le getter (autre voie : `Acteur\|GetComponentbyClass` + `ComponentClass` = CameraComponent, sortie typée) |
| 23 | 2e BP : `VariableGet` d'une variable du 1er | fait, par la catégorie `Classe` | `Variables\|Pardéfaut\|ObtenirProbeBool` (rendu par `find_node_types(context_pins)`) → « does not exist », même avec `declaring_class` ; **`Classe\|CAMProbe\|ObtenirProbeBool`** crée le getter (`self` 0 ← variable `Probe`) |
| 24 | 2e BP : appel de `ProbeEvent` | fait | `Classe\|CAMProbe\|ProbeEvent` (`self` 1) ; BeginPlay → Branche(`ProbeBool`) vrai → appel |
| 25 | `compile_blueprint` | fait | CAM_Probe ×3, CAM_Probe2 ×1, `warnings_as_errors` vrai : aucune exception ; journal : « Compiling Blueprint » sans erreur ni avertissement Blueprint |
| 26 | `save_assets` (2 sondes seules) | fait | `true` |
Réserve : les nœuds purs non reliés à une exécution (bornes, socket, capsule, `<`, `==`, `FindLookAtRotation`,
`VInterpTo`, `RInterpTo`, `BreakHitResult`) sont créés avec leurs broches typées, mais un nœud pur non relié est écarté
par le compilateur : leur compilation n'est donc pas prouvée par B0 (seule la chaîne
`ProbeEvent` → PostProcess → SphereTrace → `ProbeVec` := ((v + v) − v) × DeltaSeconds l'est).
## 3. Conséquences pour la SPEC (à reporter avant B1)
1. **B1-13, B2-6** : remplacer `K2_ClearTimerDelegate(UpdateRoomCam)` par un handle : variable `RoomCamTimer`
(TimerHandle) affectée par la sortie de `K2Node_CallFunction_329` (minuterie existante de Room), puis
`ClearandInvalidateTimerbyHandle(RoomCamTimer)`. À vérifier en B1 : la sortie `ReturnValue` du nœud 329 existant.
2. **Accès aux membres d'un autre BP** (`GI.SexOn`, `GI.Room`, `GI.PlayerCharacter`, `GI.PC`, `GI.Wall`, `GI.BuilderOn`,
`GI.SpaceOn`, `CamRoom.CameraComponent`, appels `Room_C::ApplyRoomCamera` depuis PC / GI) : utiliser les type_id
`Classe|<Classe affichée>|Obtenir<Var>` / `Définir<Var>` / `<Fonction>` (sans contexte), pas ceux rendus par
`find_node_types(context_pins)`. Le nom affiché de la classe est localisé et sans tiret bas (`CAMProbe`, `Acteurdecaméra`) :
le relire par `find_node_types` avec le filtre `<Nom>|` avant chaque sous-lot.
3. Comparateurs et opérations vectorielles : opérateurs génériques `Utilitaires|Opérateurs|…`, typés par la 1re liaison ;
relier l'entrée avant `set_pin_value`.
4. Le mode auto n'a refusé aucun appel MCP d'écriture fait **par la session elle-même** (les 4 refus de STE visaient
`lp-mcp-bp` en sous-agent ou un relais entre sessions) : même voie recommandée pour B1-B5.
## 4. Contrôles de fin (BUILD-FIN)
| Contrôle | Résultat |
|---|---|
| MD5 GI / Person / TopRight / Room / PC | `71034A04…` / `D1B4C63D…` / `1FCB94A6…` / `E8F58B2A…` / `09F54974…` : inchangés |
| Sondes, avant → après déplacement | `CAM_Probe.uasset` `CAAF5D9E48616DBC3281BB703DDA1DB0` → identique ; `CAM_Probe2.uasset` `A5F598B2C3F76DECE8623A5783D9B382` → identique ; sous `D:\Game\LifePlay_Backup_5.5\CAM\B0\` |
| `Content\Dev` | absent (2 fichiers déplacés, dossier vide retiré) |
| `git status --short -- Content Source Config` | GI, Person, TopRight en `M` (STE-H10) : identique à l'avant |
| Processus | `UeState.ps1` : processus=0 éditeur=0 compilation=0 shaders=0 jeu=0 |
| Autosaves | `Saved\Autosaves\Game\BPs` = Room_Auto2, TestStatic_Auto1 (anciens), aucun de la sonde |
Fichiers écrits : `etat\CAM\CAM-B0-IMPL.md`, `etat\CAM\CAM-B0-journal.txt`, `etat\CAM\CAM-TACHES.md` (ligne B0).
Hors git : journal de l'éditeur sous `Saved\Logs\`, sondes sous `Backup_5.5\CAM\B0\`.