129 lines
14 KiB
Markdown
129 lines
14 KiB
Markdown
|
|
Fiche STE-H3e-A1 — Niveau N2 — Modèle prévu (modèle de l'agent lp-diag) | utilisé claude-opus-5-5 — Agent lp-diag — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths (préchargés), lp-doc (gabarits)
|
|||
|
|
# STE-H3e-DIAG : attribution des lignes `Person_24` du journal H3e-J par la pile Blueprint (2026-10-13)
|
|||
|
|
|
|||
|
|
Hors gabarit : plan des sections imposé par la fiche (rubrique 7 : § 1 comptes et attribution, § 2 groupes et lecteurs, § 3 gardes / bruit accepté,
|
|||
|
|
§ 4 rapprochement J6 / J5c, § 5 dumps). Correspondance avec le gabarit DIAG (`D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-doc\gabarits.md:32-34`) :
|
|||
|
|
symptôme et essai = § 1 ; hypothèse et verdict = § 2 et § 4 ; hypothèse suivante = § 3 et § 5.
|
|||
|
|
|
|||
|
|
Lecture seule (Read, Grep ; un Bash pour `md5sum`, `wc -c`, `git rev-parse`). Aucun éditeur, MCP, commandlet, build ni jeu.
|
|||
|
|
|
|||
|
|
Abréviations (chemins absolus) :
|
|||
|
|
- **H3e** = `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\STE-H3e-J\LifePlay.log` (copie de lecture ; `md5sum` → `3133fd1eae1d63ca768724deceba7c77`,
|
|||
|
|
`wc -c` → `2564693` : conformes à la fiche). Horodatages du journal en UTC (13:28-13:45), session locale 15:27-15:45 selon la fiche.
|
|||
|
|
- **J6** = `D:\Game\LifePlay_Build_5.8_STE-J6_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` (lu en place) ;
|
|||
|
|
- **J5c** = `%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\37530d8d-c780-4a57-8fbd-bcb010aa6408\scratchpad\J5-LifePlay.log` (lu en place) ;
|
|||
|
|
- **P1** = `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\dumps\GI__CallFunctionReturnBool_P1.txt` (591 nœuds, P1:1) ;
|
|||
|
|
- **L6f** = `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\portage55\L6f\L6f_dump_GI.txt` (GI 5.5, liens de données seuls, sans exécution) ;
|
|||
|
|
- HEAD de la copie : `git rev-parse --short HEAD` → `0745917` (G13 comprise, conforme à la fiche).
|
|||
|
|
|
|||
|
|
## 1. Comptes et attribution ligne par ligne
|
|||
|
|
|
|||
|
|
Comptes bruts (Grep, mode `count`, sur H3e) :
|
|||
|
|
- `Person_24_.*of length 0` → **2** ;
|
|||
|
|
- `isCreatureType` → **0** (G13 tient : aucune F2 ni pile `isCreatureType`) ;
|
|||
|
|
- `CHECKING: .*pet/(horse/)?meet_new_person` → **6** (les 6 évaluations des scènes d'animal ne produisent plus de F2) ;
|
|||
|
|
- `is Same as` (texte du `PrintString` d'`isSameAs` en 5.5, L6f:26013) → **0** (le `PrintString` n'est pas exécuté en 5.8, ou n'existe plus : non vérifié sans dump) ;
|
|||
|
|
- `ACtualLEftMouse|HideCursorDuringCapture Changed, True -> False` → 66.
|
|||
|
|
|
|||
|
|
| # | H3e:ligne | Horodatage [trame] | Contexte (lignes voisines) | Pile complète (`-ScriptStackOnWarnings`) | Fonction de tête | Statut |
|
|||
|
|
|---|---|---|---|---|---|---|
|
|||
|
|
| 1 | 16827 | 13:44:53.366 [501] | 16825 `[StreetMap_Static] 310 ACtualLEftMouse` (53.158, −208 ms) ; 16826 curseur `True -> False` ; aucun `CHECKING:` ni `PlayScene` voisin (le balayage suivant commence en 16860, 13:45:11) | 16828-16836 : `GI_C.isSameAs <---` ← `GI_C.CallFunctionReturnBool` ← `GI_C.CheckEachCondition` ← `GI_C.CheckConditionsOther` ← `GI_C.CheckConditionsWho` ← `Action_C.ExecuteUbergraph_Action` ← `Action_C.CheckInteractionWho` ← `Action_C.ExecuteUbergraph_Action` | `GI.isSameAs` | **établi** (pile) |
|
|||
|
|
| 2 | 16841 | 13:44:56.323 [666] | 16839 `[StreetMap_Static] 310 ACtualLEftMouse` (56.190, −133 ms) ; 16840 curseur `True -> False` | 16842-16850 : pile identique | `GI.isSameAs` | **établi** (pile) |
|
|||
|
|
|
|||
|
|
Aucun `Accessed None` entre 16827 et 16852 (lecture 16760-16869) : la valeur `None` rendue par `Array_Get` est consommée sans erreur (comparaison d'objets, § 2).
|
|||
|
|
Confirmation par le résumé du jeu : H3e:17025 `LogLifePlay: Display: 2 [LogScript Warning] Script call stack: | /Game/BPs/GI.GI_C.isSameAs <--- | …CallFunctionReturnBool | …CheckEachCondition | …CheckConditionsOther | …CheckConditionsWho | /Game/UI/Action.Action_…`.
|
|||
|
|
|
|||
|
|
Événement d'origine : la pile ne nomme pas l'événement de l'ubergraph d'`Action` (piège 5 de la fiche) ; lignes voisines : clic `StreetMap_Static 310 ACtualLEftMouse` puis passage
|
|||
|
|
du curseur en mode visible (`HideCursorDuringCapture Changed, True -> False`), soit l'ouverture d'une interface à la souris (estimé). Une F2 par clic (2 clics, 2 F2 ; établi par lecture).
|
|||
|
|
|
|||
|
|
## 2. Groupes et lecteurs
|
|||
|
|
|
|||
|
|
Un seul groupe : **`GI.isSameAs`**, appelée par `CallFunctionReturnBool`, cas `SwitchString_77.isSameAs` (P1:21 et P1:409-426) :
|
|||
|
|
`CallFunction_26270` (`isSameAs`, impure : `execute` ← `SwitchString_77.isSameAs`, `then` → `VariableSet_7609.execute`) ; `Person` ← `VariableGet_11335.ActualVariable` ;
|
|||
|
|
`Person2` ← `GetArrayItem_3010.Output` (`ActualParameters[0]`) ; `Same` → `VariableSet_7609.BoolToReturn` → `IfThenElse_8994` (P1:424). Le cas est appelé par une condition
|
|||
|
|
de la forme `X.isSameAs(Y)` : `ActualVariable` = nom de `X`, `ActualParameters[0]` = nom de `Y`.
|
|||
|
|
|
|||
|
|
Lecteurs dans `isSameAs` — **corps 5.5 seulement** (L6f:25963-26024, 11 nœuds ; aucun dump 5.8 dans `dumps\` : Grep `(?i)issameas` sur le dossier → 0) :
|
|||
|
|
- `GetVariable(Person)` → `BreakStruct_721.Person_24_…` → **`GetArrayItem_2719`** (index `0`) → `EqualEqual_ObjectObject.A` (L6f:25967-25970, 25983, 25995-25998) ;
|
|||
|
|
- `GetVariable(Person2)` → `BreakStruct_722.Person_24_…` → **`GetArrayItem_2720`** (index `0`) → `EqualEqual_ObjectObject.B` (L6f:25971-25974, 25993, 25999-26002) ;
|
|||
|
|
- `CallFunction_23443` = `KismetMathLibrary::EqualEqual_ObjectObject(A, B)` → `FunctionResult_8.Same` (L6f:26003-26009) ;
|
|||
|
|
- `Concat_StrStr(Person, " is Same as ", Person2)` → `PrintString` (L6f:26010-26024 ; 0 ligne au journal, § 1).
|
|||
|
|
Le message ne dit pas lequel des deux lecteurs a émis la F2 (même nom de tableau). Une seule F2 par appel : **un seul** des deux `Person` est vide (estimé : deux tableaux vides donneraient deux F2).
|
|||
|
|
|
|||
|
|
Conditions des actions qui appellent `isSameAs` dans un `WHO:` (Grep `isSameAs`, glob `*.lpaction`, `Content\Modules` → 8 fichiers, 8 lignes, toutes ligne 13) :
|
|||
|
|
`Companion|Actor = getTarget(); If [!]<X>.isSameAs(CurrentCompanion) …` dans `vin_Base\Interactions\leading_to_scenes\approach_bar_i_.lpaction`, `end_date_i.lpaction`,
|
|||
|
|
`propose_marriage_i.lpaction`, `propose_relationship_i.lpaction`, `take_pet_home.lpaction`, `vin_Base\Scenes\dating\open_relationship.lpaction`,
|
|||
|
|
`vin_Polyamorous\scenes\npc_joins_poly.lpaction` ; et `vin_Base\Actions\sexwork\pimp_out.lpaction:13` `Actor.isSameAs(CurrentConpanion)` (**nom mal orthographié** dans la donnée).
|
|||
|
|
Chemin vide le plus probable (estimé fort) : `CurrentCompanion` sans compagnon → `Person2` vide → `GetArrayItem_2720` émet la F2 et rend `None` (défaut, UE `KismetArrayLibrary.cpp:479`, cité par `STE-H3d-SPEC.md:199`)
|
|||
|
|
→ `EqualEqual_ObjectObject(cible, None)` = **false** → `BoolToReturn = false` → condition `isSameAs` fausse (ou vraie sous `!`, cas `approach_bar_i_`).
|
|||
|
|
Quelle action précise est évaluée à chaque clic : **incertain** (8 candidats, une F2 par clic seulement ; trancherait : dump `Action.CheckInteractionWho`, § 5, ou trace de l'action évaluée).
|
|||
|
|
|
|||
|
|
Effet en aval : aucun `Accessed None` (comparaison d'objets tolérante à `None`) ; le résultat rendu est celui attendu sans compagnon (cible ≠ compagnon absent). La F2 est un **bruit**
|
|||
|
|
sans effet de bord, sauf deux cas où le résultat dépend de la valeur par défaut : (i) les deux `Person` vides → `None == None` = **true** (aujourd'hui 2 F2 par appel ; non observé) ;
|
|||
|
|
(ii) `pimp_out` lit `CurrentConpanion` (nom inconnu) : comportement de `GetVariable` sur un nom absent non relu en 5.8 (incertain).
|
|||
|
|
|
|||
|
|
## 3. Garde proposée / bruit accepté (Q#)
|
|||
|
|
|
|||
|
|
Classement : **garde à spécifier** (fiche SPEC à suivre), sous réserve du dump 5.8 d'`isSameAs` (§ 5) ; **arrêt de la fiche sur ce dump manquant** (rubrique 9).
|
|||
|
|
Motif : c'est la seule source restante de la famille `Person_24` sur le parcours H3e (2 / 2 lignes), et vraisemblablement celle des lignes silencieuses de J6 et J5c (§ 4).
|
|||
|
|
|
|||
|
|
Formes possibles (coûts **estimés** sur le corps 5.5 ; à relire sur le dump 5.8, dont la chaîne d'exécution vers `FunctionResult_8` est inconnue : L6f n'a pas les broches d'exécution) :
|
|||
|
|
| Variante | Modèle | Lieu | Nœuds (estimé) | Comportement | Question |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| a, rejeu exact | G7 / G8 (IsValidIndex + Branch, chemin vide rejoué) | `isSameAs` | 2 IsValidIndex + 2 Branch + 1 `EqualEqual_ObjectObject` de rejeu (entrée vide = `None`) + 1 sortie de rejeu | identique, y compris `None == None` = true | exige un second `FunctionResult` (proscrit par la convention H3d § 5) ou un nœud de sortie partagé : à trancher sur le dump |
|
|||
|
|
| b, valeur neutre | G13 b (`Same` / `BoolToReturn` = false si un `Person` est vide) | `isSameAs` (ou `CallFunctionReturnBool`, cas `isSameAs`, entre `SwitchString_77.isSameAs` et `CallFunction_26270`) | `isSameAs` : 2 IsValidIndex + 2 Branch + sortie `false` ; `CallFunctionReturnBool` : 2 `GetVariable` + 2 BreakStruct + 2 IsValidIndex + 2 Branch + 1 Set `BoolToReturn` (≈ 9) | change le résultat dans les cas (i) et (ii) du § 2 : deux variables vides ou élément `None` → false au lieu de true | **Q-H3e-1** |
|
|||
|
|
| c, bruit accepté | — | — | 0 | inchangé ; 1 F2 par clic qui évalue une action `isSameAs(CurrentCompanion)` sans compagnon | **Q-H3e-1** |
|
|||
|
|
|
|||
|
|
- **Q-H3e-1 (utilisateur)** : a, b ou c pour `isSameAs`. Recommandation provisoire : **b dans `isSameAs`** si le dump 5.8 montre un seul `FunctionResult` atteignable sans `delete_node`
|
|||
|
|
et si l'utilisateur accepte que « deux variables vides » rende false (aujourd'hui true, cas non observé) ; sinon **c** (bruit sans effet, aucun `Accessed None`).
|
|||
|
|
- **Q-H3e-2 (utilisateur, hors garde)** : `pimp_out.lpaction:13` cite `CurrentConpanion` ; donnée de module, hors périmètre Blueprint ; signalée seulement.
|
|||
|
|
|
|||
|
|
## 4. Rapprochement des lignes silencieuses J6 / J5c
|
|||
|
|
|
|||
|
|
Aucune pile dans J6 et J5c (session sans `-ScriptStackOnWarnings`) : attribution **estimée**, par motif de lignes voisines identique à H3e.
|
|||
|
|
| Journal:ligne | Horodatage | Lignes précédentes | Délai clic → F2 | `Accessed None` après | `CHECKING:` voisin | Rapprochement |
|
|||
|
|
|---|---|---|---|---|---|---|
|
|||
|
|
| H3e:16827 | 13:44:53.366 | 16825 `310 ACtualLEftMouse`, 16826 curseur `True -> False` | 208 ms | aucun | aucun | `isSameAs` (établi) |
|
|||
|
|
| H3e:16841 | 13:44:56.323 | 16839 `310 ACtualLEftMouse`, 16840 curseur `True -> False` | 133 ms | aucun | aucun | `isSameAs` (établi) |
|
|||
|
|
| J6:8892 | 05:43:49.814 | 8887-8889 `310 CHECK FOR clOSE pub`, `pub test310 LeftMouseInput`, `310 ACtualLEftMouse` ; 8890 `True -> False` ; 8891 `False -> True` | 436 ms | aucun (8893 `called by: GI_C`, 8894 `[AI] 2 moves to art`) | aucun entre 8885 et 8892 | `isSameAs`, **estimé moyen** (clic et curseur identiques ; cette fois sur un lieu « pub » ; curseur revenu masqué avant la F2) |
|
|||
|
|
| J5c:34375 | 22:04:21.340 | 34371 `310 ACtualLEftMouse`, 34372 `True -> False`, 34373-34374 `DestroyDummy … via AddVariable` (même milliseconde) | 92 ms | aucun (34376 `called by: GI_C`) | — | `isSameAs`, **estimé fort** |
|
|||
|
|
| J5c:34556 | 22:04:32.038 | 34554 `310 ACtualLEftMouse`, 34555 `True -> False` | 100 ms | aucun (34557 `called by: GI_C`) | — | `isSameAs`, **estimé fort** |
|
|||
|
|
|
|||
|
|
Conséquences pour `STE-H3d-SPEC.md` § 1.2 et § 2.4 : les 3 lignes « silencieuses » ont la même signature que la source `isSameAs` établie ici (GI seulement, aucun `Accessed None`,
|
|||
|
|
dans les 100-450 ms d'un clic `310 ACtualLEftMouse`, hors balayage) ; **C1** (`CheckConditionsWho` → `GetArrayItem_3268`) et **C2** (événement `Sex`) n'apparaissent pas dans les piles H3e.
|
|||
|
|
La pile H3e passe par `CheckConditionsWho` mais la F2 est émise dans `isSameAs`, pas par `GetArrayItem_3268`. Trancherait pour J6 / J5c : rejouer un clic équivalent avec `-ScriptStackOnWarnings`.
|
|||
|
|
|
|||
|
|
## 5. Dumps à faire lancer (non lancés : jeton UE, rubrique 6)
|
|||
|
|
|
|||
|
|
Bloquant pour toute garde (§ 3, variantes a et b) :
|
|||
|
|
```
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot STE-H3e -Commandlet LPDumpFunction -Args '-BP=GI -Fn=isSameAs -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"
|
|||
|
|
```
|
|||
|
|
Recommandés (non bloquants) :
|
|||
|
|
```
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot STE-H3e -Commandlet LPDumpFunction -Args '-BP=GI -Fn=GetVariable -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot STE-H3e -Commandlet LPDumpFunction -Args '-BP=Action -Fn=CheckInteractionWho -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"
|
|||
|
|
```
|
|||
|
|
(`GetVariable` : valeur rendue pour un nom absent, cas `CurrentConpanion` ; `CheckInteractionWho` : quelle action est évaluée par clic. Le nom `-BP=Action` pour `/Game/UI/Action` est **estimé** :
|
|||
|
|
le catalogue `lp-commandlets` donne `-BP=<nom>` sans préciser le chemin.)
|
|||
|
|
|
|||
|
|
Tours : 11 / 40
|
|||
|
|
|
|||
|
|
## Constats
|
|||
|
|
|
|||
|
|
- C1 `md5sum` / `wc -c` / `git rev-parse --short HEAD` (Bash) → `3133fd1eae1d63ca768724deceba7c77`, `2564693`, `0745917`.
|
|||
|
|
- C2 H3e, Grep `Person_24_.*of length 0` (content) → lignes 16827 et 16841 ; Read H3e:16760-16869 (piles 16828-16836, 16842-16850).
|
|||
|
|
- C3 H3e, Grep count : `isCreatureType` → 0 ; `CHECKING: .*pet/(horse/)?meet_new_person` → 6 ; `is Same as` → 0 ; `ACtualLEftMouse|HideCursorDuringCapture Changed, True -> False` → 66 ;
|
|||
|
|
`CHECKING:|isCreatureType|Script call stack|Command line|PlayScene` → 2407 ; `Script call stack|isSameAs|of length 0` → 469 (comptes larges, non utilisés pour l'attribution).
|
|||
|
|
- C4 H3e, Grep `GI_C\.isSameAs|Accessed None|Command line|CheckInteractionWho` (content, 30 premières) : `isSameAs` 16829, 16843 ; `CheckInteractionWho` 16835, 16849 ; résumé 17025 ;
|
|||
|
|
aucun `Accessed None` entre 16086 et 17021. La ligne de commande n'a pas été relue ici (motif `Command line` sans résultat dans les 30 premières lignes : non vérifiée par ce DIAG ; la fiche la donne pour relue).
|
|||
|
|
- C5 Grep `isSameAs` sur `etat\ST\STE` (content) → 0 ; sur `dumps\` `isSameAs|IsSameAs` → 0 ; sur P1 `(?i)same` → `SwitchString_77.isSameAs` P1:21, `CallFunction_26270` P1:409-426.
|
|||
|
|
- C6 L6f, Grep `isSameAs` → 21167 (appel), 25963 (`=== GI :: isSameAs (11 noeuds) ===`) ; Read L6f:25955-26024 et 21140-21189.
|
|||
|
|
- C7 `Content\Modules`, Grep `isSameAs` (count) → 33 fichiers, 89 occurrences ; glob `*.lpaction` (content) → 8 lignes (§ 2).
|
|||
|
|
- C8 Read J6:8880-8895 ; J5c:34366-34376 et 34546-34558.
|
|||
|
|
|
|||
|
|
## Décisions de l'utilisateur (2026-10-13)
|
|||
|
|
|
|||
|
|
- Q-H3e-1 : **variante b** (`Same = false` dès qu'une personne est vide), sous réserve du dump 5.8 d'`isSameAs` (UE-DEMANDE) ; SPEC de garde (G15) ensuite.
|
|||
|
|
- Accessed None nouveaux en H3e-J (`K2Node_CustomEvent_Person`, `PersonCumming`, `SkeletalMesh_2`) : **DIAG ouvert** (STE-H3f).
|