LifePlay-Revival/Docs/Migration/etat/ST/STF/STF-T1-CART.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

107 lines
9.2 KiB
Markdown

Fiche STF-T1 — Niveau N1 — Modèle prévu orchestrateur STF (Opus 5.5) | utilisé claude-opus-5-5 — Agent orchestrateur — Skills lp-mcp, lp-lot, sk-protocol
# STF-T1 : relevés MCP sur MainMenu après STC, choix de méthode (2026-10-10)
Copie `D:\Game\LifePlay-master 5.8` (branche `ue5.8`, HEAD `1a4e73c`, STC commité en `bc4d91f`). BUILD-GO STF-T1 de
« Big Boss ». Éditeur 5.8 lancé sans rendu (`-RenderOffScreen -unattended`, chemin du projet entre guillemets ; le script
`Start-HyperAIStudioEditor.ps1` passe toujours le chemin sans guillemets, défaut déjà relevé par STC), journal
`Saved\Logs\portage\STF-T1_Editor_20261010-105655.log`. **Lecture seule** : `load_asset`, `find_nodes`,
`get_node_infos`, `UMGToolSet.GetWidgets` / `GetWidgetDescription`, `ObjectTools.list_properties` / `get_properties`
(via `ProgrammaticToolset`) ; aucune sauvegarde, aucune compilation.
| Contrôle | Entrée | Sortie |
|---|---|---|
| MD5 `Content/UI/MainMenu.uasset` | 59d1ee7190afb88bf51b90eda26fcc32 | 59d1ee7190afb88bf51b90eda26fcc32 |
| MD5 `Content/BPs/GI.uasset` | d93785fca90e3342575fc0b601cc2e93 | d93785fca90e3342575fc0b601cc2e93 |
## 1. Gestionnaires des 12 couples : T0 confirmé (établi, `get_node_infos`)
`find_nodes` « SpinBox » sur l'EventGraph : 13 événements (`ComponentBoundEvent_13, 15, 17, 19, 20, 21, 22, 23, 26, 31,
42, 84, 178`) + `VariableGet_49` (STC) ; `6` (ChildGrowthMult) et `118` (ShadeDepth) relus directement.
Les 12 chaînes sont **identiques à STF-T0 § 1** (mêmes nœuds, mêmes liens) :
| # | Événement `OnValueChanged` | Chaîne relue | GI |
|---|---|---|---|
| 1 | 6 ChildGrowthMult | `MacroInstance_2` (IsValid) → `VariableSet_1` | `VariableGet_29` (partagé 6, 13, 17) |
| 2 | 118 ShadeDepth | `MacroInstance_40` → `VariableSet_106` → `DynamicCast_7` (MID) → `CallFunction_820` SetScalarParameterValue('ShadeDepth', sortie du Set) ; échec → `CallFunction_265` PrintString | `VariableGet_461` (Set) ; `VariableGet_106` → PostProcessVolume → Settings → `BreakStruct_9/10` → `GetArrayItem_6`[1] → `BreakStruct_11` |
| 3 | 20 SpinBoxBGA | `MacroInstance_10` → `VariableSet_16` | `VariableGet_1` (partagé 20-23) |
| 4 | 13 SpinBoxMarkerSize | `MacroInstance_5` → `VariableSet_6` | `VariableGet_29` |
| 4b | **15** `OnValueCommitted` MarkerSize | `CallFunction_44` RetriggerableDelay 2 s → `CallFunction_31` SpawnMapMarkers(false) | `VariableGet_17` |
| 5 | 23 SpinBoxMoan | `MacroInstance_8` → `VariableSet_19` | `VariableGet_1` |
| 6 | 17 SpinBoxPhysicsMult | `MacroInstance_7` → `VariableSet_11` | `VariableGet_29` |
| 7 | 178 SpinBoxSceneFrequency | `MacroInstance_42` → `VariableSet_116` | `VariableGet_195` |
| 8 | 84 SpinBoxSexDescription | `MacroInstance_90` → `VariableSet_48` | `VariableGet_7504` |
| 9 | 22 SpinBoxSex | `MacroInstance_12` → `VariableSet_18` | `VariableGet_1` |
| 10 | 26 SpinBoxSquirtMult | `VariableSet_25` **sans IsValid** | `VariableGet_40` |
| 11 | 21 SpinBoxUI | `MacroInstance_11` → `VariableSet_17` | `VariableGet_1` |
| 12 | 42 SpinBoxPregnancyTerm | `MacroInstance_57` → `VariableSet_70` | `VariableGet_324` |
Aucune sortie « Is Not Valid » branchée. Hors périmètre relu : 19 (`SpinBox_0`), 31 (`OnValueCommitted` SpinBoxSexDuration, STC).
## 2. Chaîne `Construct` après STC (établi)
`Event_1` (Construct) → `DynamicCast_0` (Cast To GI) → `VariableSet_2904` (Set GI) → `CallFunction_72`
(`SliderCameraSpeed.SetValue(InValue)`) → `CallFunction_74` (`TextCameraSpeedValue.SetText`) → `CallFunction_73`
(`SpinBoxSexDuration.SetValue(NewValue ← VariableGet_53)`, `self ← VariableGet_49`, pos 1650,1000) →
**`CallFunction_1278` (UpdateDonors)** → `CallFunction_7` (Delay) → `IfThenElse_2` …
- **Point d'insertion STF** : couper `CallFunction_73.then → CallFunction_1278.execute`, insérer les 12 `SetValue`
chaînés, rebrancher le dernier sur `CallFunction_1278`. Modèle de nœud : `CallFunction_73` (`Comportement|SetValue`
de SpinBox, broche valeur **`NewValue`** ; celle du slider s'appelle `InValue`).
## 3. Widgets (établi, `GetWidgets`, `GetWidgetDescription`, `get_properties`)
Chaque SpinBox est l'enfant **d'indice 1** d'une `HorizontalBox` dont l'enfant 0 est son libellé ; `bIsVariable` vrai,
aucun composant d'interface.
| SpinBox | Parent | Slot | Propriétés non par défaut (`GetWidgetDescription`) |
|---|---|---|---|
| ChildGrowthMult | HorizontalBox_8 | HorizontalBoxSlot_1 | Value 1 ; Min 0.01 / Max 10000 ; glisser 0.01-10000 |
| ShadeDepth | HorizontalBox_6 | HorizontalBoxSlot_1 | Value 0.5 ; Max 1 ; glisser max 1 |
| SpinBoxBGA | HorizontalBox_36 | HorizontalBoxSlot_1 | (Value 0) ; Max 5 ; glisser max 5 |
| SpinBoxMarkerSize | HorizontalBox_30 | HorizontalBoxSlot_1 | Value 28 ; Min 1 / Max 100 ; glisser 1-100 |
| SpinBoxMoan | HorizontalBox_39 | HorizontalBoxSlot_1 | (Value 0) ; Max 5 ; glisser max 5 |
| SpinBoxPhysicsMult | HorizontalBox_33 | HorizontalBoxSlot_1 | Value 1 ; Max 100 ; glisser max 100 |
| SpinBoxSceneFrequency | HorizontalBox_3 | HorizontalBoxSlot_1 | (Value 0) ; Min 0.2 / Max 100 ; glisser 0.2-100 |
| SpinBoxSexDescription | HorizontalBox_2 | HorizontalBoxSlot_1 | Value 15 ; Min 1 / Max 100 ; glisser 1-100 |
| SpinBoxSex | HorizontalBox_38 | HorizontalBoxSlot_1 | (Value 0) ; Max 5 ; glisser max 5 |
| SpinBoxSquirtMult | HorizontalBox_42 | HorizontalBoxSlot_1 | (Value 0) ; Max 100 ; glisser max 100 |
| SpinBoxUI | HorizontalBox_37 | HorizontalBoxSlot_1 | (Value 0) ; Max 5 ; glisser max 5 |
| SpinBoxPregnancyTerm | HorizontalBox_5 | HorizontalBoxSlot_1 | (Value 0) ; Min 0.01 / Max 3 ; glisser 0.01-3 |
Communs aux 12 **et à `SpinBoxSexDuration` (STC)**, valeurs identiques : `Font.Size 20` ; les 4 `bOverride_Min/Max(Slider)Value`
vrais ; `Delta 0`, `SliderExponent 1`, `Min/MaxFractionalDigits 1 / 6`, `MinDesiredWidth 0`, `Justification Left`,
`KeyboardType Number`, `ClearKeyboardFocusOnCommit false`, `SelectAllTextOnCommit true`, `ForegroundColor`
(0.4729, 0.4729, 0.4729, 1, Specified), `Visibility Visible`, `RenderOpacity 1` ; slot : `Size Automatic 1`,
`Padding 0`, `HAlign_Fill`, `VAlign_Fill`. `WidgetStyle` absent des écarts (style par défaut), comme chez SpinBoxSexDuration.
Conséquence : la recopie de la méthode A se limite à **Value (= défaut GI), Min/Max, MinSlider/MaxSlider, les 4
`bOverride_*`, Font.Size 20** ; le reste est par défaut ou commun (à recopier quand même par `get_properties` /
`set_properties` du widget d'origine, puis relu contre ce tableau).
Valeurs de conception (Value) différentes du défaut GI : BGA, Moan, Sex, UI (0 contre 0.5 / 1 / 1 / 1), SquirtMult (0
contre 2), SceneFrequency (0, bornée à 0.2, contre 10), PregnancyTerm (0, bornée à 0.01, contre 1) : sans effet après STF
(`Construct` affiche GI), corrigées quand même (SPEC § 1.1 : Value = défaut GI).
## 4. Liaisons (`Bindings`)
- `ObjectTools.list_properties` sur `/Game/UI/MainMenu.MainMenu` renvoie les propriétés de la classe générée
(`underwearVisible`…), pas le tableau `Bindings` du `UWidgetBlueprint` (établi, T0 confirmé).
- Relecture binaire du `.uasset` (lecture seule, chaînes terminées par NUL) : chacun des 12 noms paraît **7 fois**,
les widgets STC sans liaison (`SpinBoxSexDuration`, `SliderCameraSpeed`) **5 fois** ; `SpinBox_0` (liaison Function)
6. Écart de 2 = une entrée `FDelegateEditorBinding` + une `FDelegateRuntimeBinding` par widget lié (**estimé** :
décompte de chaînes, pas d'analyse de la structure). Attendu après STF : 12 nouveaux noms à 5, anciens noms à 0.
## 5. Choix de méthode : **A** (établi)
- `UMGToolSet` (24 outils relevés) n'a aucun outil qui écrive le tableau `Bindings` ; `ObjectTools` ne l'atteint pas
(§ 4) ; `MVVMToolset` traite les liaisons de modèle de vue, pas les liaisons de propriété (hors sujet). Méthode B non
démontrée → **méthode A** (SPEC § 1.1), modèle STC : `RemoveWidget` puis `AddWidget` (SpinBox, même parent, indice 1),
**jamais `ReplaceWidgetWithTemplate`** (conserve les liaisons, STC-T5 § 1).
- Noms neufs : tableau de STF-SPEC § 1.1, inchangé.
- Ordre par couple (T3) : lire les propriétés de l'ancien widget → supprimer ses nœuds d'événement (`OnValueChanged`,
plus `ComponentBoundEvent_15` pour MarkerSize) et ceux qui ne servent qu'à lui → `RemoveWidget` → `AddWidget` →
propriétés et slot → `ToggleWidgetAsVariable` si besoin → `BindToEventProperty` `OnValueCommitted` (ou création de nœud)
→ chaîne `IsValid` → `Set` (+ suite propre au couple) → relecture → compilation.
- Nœuds GI partagés : `VariableGet_29` (1, 4, 6) et `VariableGet_1` (3, 5, 9, 11) restent tant qu'un couple non traité
s'en sert ; supprimés avec le dernier couple qui les utilise (aucune autre sortie relevée).
## 6. Écarts à la SPEC, points pour T3
1. Aucun écart sur les 12 chaînes ni sur `Construct` (SPEC exécutable telle quelle).
2. `SetValue` de SpinBox : broche **`NewValue`** (pas `InValue`).
3. Constat STC-T5 § 3 (hors périmètre, rappelé pour J1) : un réglage changé à l'écran titre n'est conservé au lancement
suivant que si une sauvegarde l'a écrit dans `GameSettings.sav` (seuls `SceneFrequency`, `SexLineDuration` y sont).
4. Démarrage de l'éditeur : `Start-HyperAIStudioEditor.ps1` reste à corriger (guillemets), hors lot.
Fichiers écrits : ce livrable seulement. Aucun fichier de la copie UE modifié (MD5 ci-dessus).