246 lines
31 KiB
Markdown
246 lines
31 KiB
Markdown
Fiche STE-H3d — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-sonnet-5-5 — Agent lp-cart — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths (préchargés), lp-mcp (invoqué, § 3-4), lp-doc (gabarits)
|
|
# STE-H3d-SPEC : lectures `Person[0]` restantes des scènes d'animal (`isCreatureType`), garde G13 dans `CallFunctionReturnBool` (2026-10-13)
|
|
|
|
Lecture seule stricte (aucun éditeur, MCP, commandlet, build ni écriture hors de ce fichier). Copie `D:\Game\LifePlay-master 5.8`,
|
|
branche `ue5.8`, HEAD `f32df0d`. Gabarit SPEC : `D:\Game\LifePlay-master 5.8\.claude\skills\lp-doc\gabarits.md:36-38`. Suite de
|
|
`STE-H3-SPEC.md` (G1-G6), `STE-H3b-SPEC.md` (G7-G11), `STE-H3c-SPEC.md` (G12) : mêmes conventions (H3S § 2.1), gardes G13 et suivantes,
|
|
risques et questions préfixés `H3d`.
|
|
|
|
**Statut : partiel mais exécutable.** Sur 13 lignes `Person_24` du journal H9 (chemin J5), 9 sont attribuées à **un seul site**
|
|
(`CallFunctionReturnBool`, commande `isCreatureType`, nœud `GetArrayItem_2346`) et **5 des 6 lignes de J6** aussi. G13, variante a
|
|
(rejeu exact), est spécifiée sur le dump existant ; la variante b (valeur neutre) exige un dump absent (commande en § 2.0).
|
|
Le reste (4 lignes `getRelatedPerson` en H9 ; 1 ligne silencieuse en J6) n'est **pas** attribuable à `isCreatureType` : § 1.2.
|
|
**Écart à la fiche** : le critère « `Person_24` = 0 sur le parcours J6 » ne sera pas tenu par G13 seule (1 ligne J6 reste non attribuée, § 1.2).
|
|
|
|
Abréviations (chemins absolus) :
|
|
- **J6** = `D:\Game\LifePlay_Build_5.8_STE-J6_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` (lu en place, non copié) ;
|
|
- **H9** = `D:\Game\LifePlay_Build_5.8_STE-J5_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` (écrasé par la session H9, lignes datées 2026-10-11 02:51-02:58 ;
|
|
MD5 `596fbe9a0d23f32d8ffbc5987f617d51`) ;
|
|
- **J5c** = copie de lecture du vrai journal J5 (2026-10-10 21:56-22:04, MD5 `43db15231d9d64dc152a7d5d41bfbd3d`) :
|
|
`%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\37530d8d-c780-4a57-8fbd-bcb010aa6408\scratchpad\J5-LifePlay.log` ;
|
|
- **D** = `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\dumps\` ; **CRBG** = D `GI__CallFunctionReturnBool_apres-GARDES.txt`
|
|
(dump STE-VAL, 2026-10-10 17:42:40, GI B8B97C46, 591 nœuds, CRBG:120) ; **GRP** = D `GI__getRelatedPerson_D3.txt` (STE-D3, GI 606EB437) ;
|
|
**CCW** = D `GI__CheckConditionsWho.txt` ; **L6f** = `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\portage55\L6f\L6f_dump_GI.txt` (GI 5.5, données seules) ;
|
|
- **CAMEG** / **CAMCF** = `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM\CAM-B1-PRE_LPDumpFunction_20261013-083048.txt` (EventGraph) /
|
|
`...-083157.txt` (CallFunction), présents (Glob), GI = HEAD selon l'orchestrateur (aucune ligne MD5 dans leur en-tête : non vérifié). Ils ne contiennent **pas**
|
|
`CallFunctionReturnBool` ; utilisés ici seulement pour C2 et pour compter les lecteurs ;
|
|
- **GIMPL** = `STE-GARDES-IMPL.md` ; **UE** = `D:\Game\Launcher\Engine\UE_5.8\Engine\Source\` (moteur installé, lu).
|
|
|
|
État du Blueprint : `md5sum "/d/Game/LifePlay-master 5.8/Content/BPs/GI.uasset"` → `71034a04c6d64e1a806ca0dadc934fb9` (HEAD, STE-H10 GI1+GI2) ;
|
|
`git log --oneline -3 -- Content/BPs/GI.uasset` → `b3ee785`, `7bceea6`, `4283c13`. CAM B1 écrira GI ensuite : l'IMPL relira le MD5 (P2).
|
|
|
|
## 1. Objectif mesurable
|
|
|
|
Supprimer, sans changer ce que le jeu fait, les lignes `Script Msg: Attempted to access index 0 from array 'Person_24_4B712C904750AD4CE1580DBEBD9E7396'
|
|
of length 0 in '/Game/Structs/Variable.Variable'!` émises à l'évaluation de la condition `If CurrentCompanion.isCreatureType(<Dog|Horse>)` des deux scènes
|
|
`vin_Base\Scenes\pet\meet_new_person_pet.lpscene:5` et `vin_Base\Scenes\pet\horse\meet_new_person_horse.lpscene:5` (seules scènes du jeu qui appellent
|
|
`CurrentCompanion.isCreatureType` : Grep `CurrentCompanion\.isCreatureType`, glob `*.lpscene`, sous `Content\Modules` → 2 fichiers).
|
|
Attendu après G13, à parcours comparable : J6 **6 → 1** (la ligne silencieuse, § 1.2), H9 **13 → 4** (les 4 `getRelatedPerson`), J5c **13 → 2**.
|
|
|
|
### 1.1 Attribution ligne par ligne (journaux lus en place ; « pile » = pile du message `Accessed None` qui suit la F2)
|
|
|
|
Méthode : la F2 (`Script Msg`) ne porte pas de pile (« called by: GI_C » seulement, UE § 6). Quand elle est suivie, dans la même milliseconde et sur les lignes
|
|
consécutives, d'un `Accessed None … property X` **avec pile**, c'est cette pile qui nomme la fonction qui consomme le `None` rendu par `Array_Get`. Le dump (CRBG)
|
|
montre que `GetArrayItem_2346` est le **seul** producteur de l'entrée `Actor` de `isCreatureType` (CRBG:2007-2012, 2024-2027).
|
|
|
|
**J6** (6 lignes ; 5 évaluations `CHECKING:` de ces deux scènes, 5 F2 : une F2 par évaluation) :
|
|
| # | J6:ligne | Horodatage [trame] | CHECKING voisin (ligne précédente) | Pile du `Accessed None` suivant | Attribution | Statut |
|
|
|---|---|---|---|---|---|---|
|
|
| 1 | 5124 | 05:42:47.042 [47] | 5123 `pet/horse/meet_new_person_horse` | `isCreatureType:64X` ← `CallFunctionReturnBool` ← `CheckEachCondition` ← `CheckConditionsOther` ← `UpdateCheckForScenes` (5128-5136), property `Actor` | G13 | estimé fort |
|
|
| 2 | 7323 | 05:43:20.958 [6] | 7322 `…horse…` | même fonction de tête (7327) | G13 | estimé fort |
|
|
| 3 | 7664 | 05:43:30.284 [561] | 7663 `…horse…` | idem (7668) | G13 | estimé fort |
|
|
| 4 | 8123 | 05:43:39.284 [101] | 8122 `pet/meet_new_person_pet` | idem (8127) | G13 | estimé fort |
|
|
| 5 | 8710 | 05:43:45.953 [460] | 8709 `…horse…` | idem (8714) | G13 | estimé fort |
|
|
| 6 | 8892 | 05:43:49.814 [681] | aucun : lignes 8886-8891 = `GenerateRecs`, clic carte `StreetMap_Static`, 2 changements de curseur (49.247-49.408) | **aucun `Accessed None`** (8893 = `called by`, 8894 = `[AI] 2 moves to art` à +118 ms) | **non attribuée** (§ 1.2) | incertain |
|
|
|
|
**H9** (13 lignes ; 9 évaluations `CHECKING:` pet/horse, 9 F2 de type `isCreatureType`) :
|
|
| # | H9:ligne | Horodatage [trame] | CHECKING voisin | Pile | Attribution | Statut |
|
|
|---|---|---|---|---|---|---|
|
|
| 1 | 1427 | 02:51:44.179 [301] | 1426 `…horse…` | `isCreatureType:64X` (1431) | G13 | estimé fort |
|
|
| 2 | 1896 | 02:51:54.530 [879] | aucun | property `Per`, `getRelatedPerson:64X` ← `CallFunction` ← `ReadSceneLine` ← `PlayScene` (1898-1907) | getRelatedPerson (§ 2.3) | estimé fort |
|
|
| 3 | 2044 | 02:51:54.697 [889] | aucun | idem (2046-2055) | getRelatedPerson | estimé fort |
|
|
| 4 | 3528 | 02:52:10.945 [845] | 3527 `pet/meet_new_person_pet` | `isCreatureType` (3532) | G13 | estimé fort |
|
|
| 5 | 9869 | 02:56:16.249 [307] | 9868 `…horse…` | `isCreatureType` (9873) | G13 | estimé fort |
|
|
| 6 | 10079 | 02:56:24.320 [774] | 10078 `…pet` | `isCreatureType` (10083) | G13 | estimé fort |
|
|
| 7 | 12163 | 02:56:42.789 [845] | 12162 `…horse…` | `isCreatureType` (12167) | G13 | estimé fort |
|
|
| 8 | 13913 | 02:56:56.061 [619] | 13912 `outdoors/camp` (sans lien : la pile est celle de `PlayScene`) | `getRelatedPerson` (13917-13924) | getRelatedPerson | estimé fort |
|
|
| 9 | 15290 | 02:57:08.961 [377] | 15289 `…pet` | `isCreatureType` (15294) | G13 | estimé fort |
|
|
| 10 | 18458 | 02:57:45.951 [508] | 18457 `…pet` | `isCreatureType` (18462) | G13 | estimé fort |
|
|
| 11 | 20467 | 02:58:14.885 [167] | aucun (20466 `FlushAsyncLoading`) | `getRelatedPerson` (20471-20478) | getRelatedPerson | estimé fort |
|
|
| 12 | 21249 | 02:58:24.225 [699] | 21248 `…pet` | `isCreatureType` (21253) | G13 | estimé fort |
|
|
| 13 | 21438 | 02:58:24.862 [736] | 21437 `…horse…` | `isCreatureType` (21442) | G13 | estimé fort |
|
|
|
|
**J5c** (13 lignes ; 13 évaluations `CHECKING:` pet/horse, 11 F2) : `isCreatureType` aux lignes 4331, 6727, 7604, 10623, 17631, 18019, 19706, 20021, 21622, 22078, 22311
|
|
(chacune précédée du `CHECKING` de l'une des deux scènes, fonction de tête `isCreatureType:64X`) ; **2 silencieuses** : 34375 (22:04:21.340 [989], même milliseconde que 34374
|
|
`DestroyDummy was from AddVariable`, aucun `Accessed None`) et 34556 (22:04:32.038 [602], 100 ms après 34555 `HideCursorDuringCapture Changed, True -> False`,
|
|
aucun `Accessed None`). C'est la description de `STE-J5.md:43-46` (« tous… sauf 2 »).
|
|
|
|
Récapitulatif (commandes en Constats) :
|
|
| Journal | F2 `Person_24` | `isCreatureType` (G13) | `getRelatedPerson` | silencieuses | CHECKING pet/horse |
|
|
|---|---|---|---|---|---|
|
|
| J6 | 6 | **5** | 0 | 1 | 5 |
|
|
| H9 | 13 | **9** | 4 | 0 | 9 |
|
|
| J5c | 13 | **11** | 0 | 2 | 13 |
|
|
|
|
### 1.2 Mécanisme de G13 (établi sur dump) et lignes hors G13
|
|
|
|
Mécanisme (CRBG:1993-2028) : cas `SwitchString_77.isCreatureType` → `CallFunction_21` (`GetVariable`, `Name` ← `VariableGet_18330.ActualVariable`) → `then` →
|
|
`VariableSet_23` (`BoolToReturn`) → `IfThenElse_8994`. L'entrée `BoolToReturn` de `VariableSet_23` vient de `CallFunction_27` = `isCreatureType(Animal, Actor)`, **pure**
|
|
(pas de broche d'exécution dans le dump), réévaluée à l'exécution de `VariableSet_23` : `Animal` ← `GetArrayItem_21.Output` (`ActualParameters[0]`, `Dog` / `Horse`) ;
|
|
`Actor` ← `GetArrayItem_2346.Output` (`Array` ← `BreakStruct_956.Person_24_…`, index 0). `CurrentCompanion` sans compagnon : `Person` vide → F2 (UE `KismetArrayLibrary.cpp:472-479`)
|
|
→ `Actor` = `None` → `isCreatureType` lit `Actor.Race` (L6f:38895-38913, GI 5.5 : `StartsWith(Conv_TextToString(Actor.Race), Animal, IgnoreCase)`) →
|
|
`Accessed None … property Actor` (UE `ScriptCore.cpp:3213-3216`), valeur remise à zéro (`:3242-3245`), résultat `false` (UE `String.cpp.inl:640-645`, § 6) → `BoolToReturn = false`.
|
|
Ce n'est **pas** un lecteur silencieux : C1 / C2 de R-H3c-4 ne sont pas la source de ces lignes (piles).
|
|
|
|
**Lignes hors G13 (non attribuées à `isCreatureType`)** :
|
|
- **`getRelatedPerson`** (H9 : 4 lignes ; J6 et J5c : 0) : F2 de `GetArrayItem_2498` (GRP:145-150, `Person_24_… -> GetArrayItem_2498.Array`, `Output -> VariableSet_0.Per`) ; la pile cite `getRelatedPerson` appelée par `CallFunction`. Hors scènes d'animal, hors parcours J6 : § 2.3.
|
|
- **Silencieuses** (J6 : 1 ; J5c : 2 ; H9 : 0), aucune pile. Éléments établis : GI seulement (« called by: GI_C ») ; lecteur de `Variable.Person[0]` consommé sans `Accessed None` ; J6:8892 tombe hors balayage
|
|
`CHECKING:` (aucune ligne `CHECKING:` entre 8886 et 8892, soit ≥ 0,4 s sans balayage), précédée d'un clic carte, suivie de `[AI] 2 moves to art` 118 ms plus tard ; J5c:34375 suit `DestroyDummy was from AddVariable` ; J5c:34556 suit un changement de curseur.
|
|
Candidats de R-H3c-4 : **C1** (`CheckConditionsWho`, CCW:180-204 : `GetVariable` → `GetArrayItem_3268` → IsValid `MacroInstance_2601`, `Is Not Valid` → `VariableSet_5`, `Matched = false`) exécuté **dans** le balayage :
|
|
incompatible avec J6:8892 (hors balayage), non démontré pour J5c. **C2** (EventGraph, événement personnalisé `Sex` (`CustomEvent_15`, CAMEG:6882), `ForEachLoop_645` sur `Persons` → `GetVariable` → `GetArrayItem_935` → IsValid `MacroInstance_72`
|
|
→ `Array_Add(SexPersons)`, CAMEG:6941-6975, 29108-29110) : exécuté au démarrage d'une scène ; compatible avec J5c:34556 (changement de mode d'entrée = interface de scène, estimé), non démontré pour J6:8892 (aucune scène visible).
|
|
CAMCF compte en outre **95** lecteurs `Person_24_… -> GetArrayItem_N.Array`, dont 8 reliés aussi à un `CallArrayFunction_N.TargetArray` (G4-G10 = `_8` à `_14`, et `_3` non identifié) : **attribution statique impossible** pour les silencieuses (estimé, aucune pile). Non spécifié ici : § 4 Q-H3d-2.
|
|
|
|
## 2. Fichiers touchés, ordre
|
|
|
|
Un seul fichier : `Content\BPs\GI.uasset`, graphe de fonction **`CallFunctionReturnBool`** (G13 : variante a = 4 nœuds créés, 1 `break_pins`, 8 `connect_pins` ; variante b = 3 nœuds, 1 `break_pins`, 6 `connect_pins`).
|
|
Ni `isCreatureType`, ni `CheckConditionsOther`, ni `CheckEachCondition`, ni `CallFunction`, ni l'EventGraph, ni le C++, ni les scènes. Ordre : après CAM B1 (autre graphe du même `.uasset` : IMPL successives, instantané et MD5 propres à chacune).
|
|
|
|
### 2.0 Préalables (dans l'ordre, avant tout `create_node`)
|
|
- **P1 (dumps manquants ; commandes à faire lancer, BUILD-GO de Big Boss)**, après la fin de CAM B1 pour décrire le GI à écrire :
|
|
- **bloquant pour la variante b seulement** (corps 5.8 de `isCreatureType`, absent de D et des dumps CAM) :
|
|
`.\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=isCreatureType -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"` ;
|
|
- recommandé pour G13 a et b (rafraîchir CRBG à l'état du GI à écrire ; le dump CRBG existant date de GI B8B97C46 ; aucune IMPL postérieure ne cite ce graphe, Grep `CallFunctionReturnBool` dans `STE-*IMPL*.md` : 2 occurrences, toutes dans `STE-GARDES-IMPL.md`, donc estimé inchangé) :
|
|
`.\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=CallFunctionReturnBool -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"` ;
|
|
- pour G14 seulement (§ 2.3, dump GRP daté de GI 606EB437) :
|
|
`.\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=getRelatedPerson -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"`.
|
|
**Arrêt sur ce site** pour la variante b et G14 tant que ces dumps n'existent pas ; la variante a est exécutable sans eux (P4 relit les nœuds).
|
|
- P2 : MD5 de `GI.uasset` relevé juste avant l'IMPL (HEAD : `71034a04…` ; sinon valeur laissée par CAM B1) = valeur de repli.
|
|
- P3 : gel annoncé (lp-mcp § 1.7), `.\Tools\Snapshot.ps1 -Lot STE-H3d` (`GI.uasset`), `AssetTools.load_asset` `/Game/BPs/GI`.
|
|
- P4 : `get_node_infos {nodes:[{refPath:"/Game/BPs/GI.GI:CallFunctionReturnBool.K2Node_<Nom>"}]}` pour `SwitchString_77`, `CallFunction_21`, `BreakStruct_956`, `GetArrayItem_2346`, `GetArrayItem_21`, `VariableGet_21`, `CallFunction_27`, `VariableSet_23`, `IfThenElse_8994` :
|
|
liens = colonne « Avant » ci-dessous ; relever les indices de `CallFunction_21.then` (sortie, attendu 0), `VariableSet_23.execute` (entrée, attendu 0), `BoolToReturn` (entrée, attendu 1) et `.then` (sortie 0), `CallFunction_27.Animal` / `.Actor` / `.True`. Tout écart : arrêt.
|
|
- P5 : `find_node_types {graph:{refPath:"/Game/BPs/GI.GI:CallFunctionReturnBool"}, type_id_filter:"isCreatureType", context_pins:[]}` (variante a) : attendu `Appelerunefonction|IsCreatureType` (**estimé**, par analogie avec `Appelerunefonction|HasRelationship`, GIMPL:39) ; après `create_node`, `get_node_infos` doit montrer la fonction `isCreatureType` de GI, **pure**, comme `CallFunction_27`, sinon arrêt et repli.
|
|
|
|
### 2.1 Conventions
|
|
Reprises de H3S § 2.1 (`STE-H3-SPEC.md:55-70`) et lp-mcp § 3 : `type_id` Branch = `Utilitaires|ContrôleDeFlux|Branche` (exécution 0 / `Condition` 1 ; `then` 0 / `else` 1), IsValidIndex = `Utilitaires|Tableau|IsValidIndex`
|
|
(**broches relues en 5.8 : `TargetArray` entrée 0, `IndexToTest` entrée 1, `ReturnValue` sortie 0**, GIMPL:38 ; corrige les « `Index` » de H3S/H3bS), Set BoolToReturn = `Variables|Pardéfaut|DéfinirBooltoReturn` (le nœud créé doit porter `|SetBoolToReturn`, comme `VariableSet_51`, GIMPL:40 ; CRBG:3092).
|
|
Cascades de Branch, jamais AND / OR / Select purs ; `IndexToTest` laissé à `0` (relu). Après le graphe : `compile_blueprint` en erreur sur avertissement (`hyper_blueprint_debug_inspect` absent du serveur, GIMPL:44-46) ;
|
|
`save_assets {asset_paths:["/Game/BPs/GI"]}` ; fermeture de l'éditeur, `UeState.ps1` = 0, MD5 relevé.
|
|
|
|
### 2.2 G13 — `CallFunctionReturnBool`, commande `isCreatureType`, lecture de `Person[0]` (J6 : 5 lignes ; H9 : 9 ; J5c : 11) — CRBG
|
|
|
|
**Avant** (CRBG:1993-2028 ; 591 nœuds) :
|
|
| Nœud | Liens |
|
|
|---|---|
|
|
| `SwitchString_77` | sortie `isCreatureType` → `CallFunction_21.execute` (CRBG:1994) |
|
|
| `CallFunction_21` (`GetVariable`) | `then` → `VariableSet_23.execute` ; `Name` ← `VariableGet_18330.ActualVariable` ; `Variable` → `BreakStruct_956.Variable` (CRBG:1993-1998) |
|
|
| `BreakStruct_956` | `Person_24_4B712C904750AD4CE1580DBEBD9E7396` → `GetArrayItem_2346.Array` (seul lien, CRBG:2007) |
|
|
| `GetArrayItem_2346` | `Array` ← `BreakStruct_956.Person_24_…` ; `Dimension 1 = '0'` ; `Output` → `CallFunction_27.Actor` (seul lien, CRBG:2009-2012) |
|
|
| `VariableGet_21` / `GetArrayItem_21` | `ActualParameters` → `GetArrayItem_21.Array` ; `Dimension 1 = '0'` ; `Output` → `CallFunction_27.Animal` (CRBG:2013-2018) |
|
|
| `CallFunction_27` | `isCreatureType`, pur, `self` vide ; `Animal` ← `GetArrayItem_21.Output` ; `Actor` ← `GetArrayItem_2346.Output` ; `True` → `VariableSet_23.BoolToReturn` (CRBG:2024-2028) |
|
|
| `VariableSet_23` | `BoolToReturn` ← `CallFunction_27.True` ; `execute` ← `CallFunction_21.then` ; `then` → `IfThenElse_8994.execute` (CRBG:2019-2023) |
|
|
|
|
**Après, variante a (rejeu exact)** : IsValidIndex `G13-I`, Branch `G13-B`, isCreatureType (pur) `G13-H`, Set BoolToReturn `G13-S` (4 nœuds). `break_pins` (1) : `CallFunction_21.then` / `VariableSet_23.execute`. `connect_pins` (8) :
|
|
1. `CallFunction_21.then` → `G13-B.execute` (0) ;
|
|
2. `BreakStruct_956.Person_24_4B712C904750AD4CE1580DBEBD9E7396` → `G13-I.TargetArray` (0) (broche générique, typée `Person` au câblage ; le lien vers `GetArrayItem_2346.Array` reste) ;
|
|
3. `G13-I.ReturnValue` (0) → `G13-B.Condition` (1) ;
|
|
4. `G13-B.then` (0) → `VariableSet_23.execute` (0) ;
|
|
5. `G13-B.else` (1) → `G13-S.execute` (0) ;
|
|
6. `GetArrayItem_21.Output` → `G13-H.Animal` (le lien vers `CallFunction_27.Animal` reste) ;
|
|
7. `G13-H.True` → `G13-S.BoolToReturn` (1) ;
|
|
8. `G13-S.then` (0) → `IfThenElse_8994.execute`.
|
|
`G13-H.Actor` reste **sans lien** (défaut `None`, relu) ; `G13-H.self` vide ; `G13-I.IndexToTest` = `0` (relu, ne le poser que s'il diffère). Aucun `set_pin_value`.
|
|
`get_node_infos` final de `G13-I`, `G13-B`, `G13-H`, `G13-S` et des 9 nœuds de P4 : liens = « Après » ; `CallFunctionReturnBool` = **595 nœuds**.
|
|
|
|
**Comportement (a)** : aujourd'hui, `Person` vide → F2, `Actor` = `None`, `isCreatureType` lève `Accessed None … property Actor` et rend `false`, `BoolToReturn = false`. Après : `IsValidIndex` faux (sans message, UE `KismetArrayLibrary.cpp:583-593`) → `else` → `G13-H` évalué par
|
|
`G13-S` avec `Actor` = `None` (valeur rendue par `Array_Get` hors limites = défaut, `:479`) → **même appel, même argument, même résultat, même `Accessed None`**, sans la F2. `Person` à ≥ 1 élément (y compris un élément `None`, qui ne lève pas de F2 aujourd'hui) : `then` → `VariableSet_23`, chemin d'origine inchangé. **Identique** (établi par construction ; les lignes `property Actor` de J6 (5) subsistent).
|
|
|
|
**Variante b (valeur neutre, 3 nœuds : `G13-I`, `G13-B`, `G13-S`)** : mêmes liens 1 à 5 ; `G13-S.BoolToReturn` laissé à `false` (relu) ; `G13-S.then` → `IfThenElse_8994.execute` ; pas de `G13-H`, pas de lien 6-7 ; `connect_pins` (6) ; 594 nœuds.
|
|
Supprime en plus les `Accessed None … property Actor` (J6 : 5, H9 : 9, J5c : 11). **Identique si** `isCreatureType(None, Animal)` rend `false` : établi sur le corps **5.5** (L6f:38895-38913 + UE `ScriptCore.cpp:3242-3245` + `String.cpp.inl:640-645` : source vide, `InPrefixLen > 0 && Strnicmp` faux ;
|
|
préfixe vide → faux aussi), **à confirmer sur le corps 5.8** par le dump `isCreatureType` de P1. Sans ce dump : variante a. Les deux variantes ne diffèrent que par les lignes `Accessed None` (Q-H3d-1).
|
|
|
|
Arrêts de G13 (rapport, pas de correctif) : P4 montre un lien différent ; `GetArrayItem_2346` a un autre consommateur que `CallFunction_27.Actor` ; `CallFunction_27` n'est pas pur ; `type_id` d'`isCreatureType` introuvable (P5) ; `compile_blueprint` ou relecture en écart. `delete_node` interdit.
|
|
|
|
### 2.3 G14 — `getRelatedPerson` (H9 : 4 lignes ; J6 : 0 ; J5c : 0) — **non spécifiée : dump périmé, hors parcours J6**
|
|
Structure établie sur GRP (GI 606EB437, avant G1-G12) : entrée → `MacroInstance_0` (IsValid sur `OptionalPerson`) ; `Is Not Valid` → `CallFunction_25390` (`GetVariable(Person)`) → `then` → `VariableSet_0` (`Per`) ← `GetArrayItem_2498.Output` (F2) → `VariableSet_6264` (`Slot` = `Prefix` + `Conv_IntToString(SaveSlot)`, tous deux lus sur `Per`,
|
|
GRP:151-169 : 2 `Accessed None … Per` si `None`) ; `Is Valid` → `VariableSet_1` → `VariableSet_6264`. Garde de forme G7/G11 : `IsValidIndex(BreakStruct_830.Person_24_…, 0)` + Branch entre `CallFunction_25390.then` et `VariableSet_0.execute` ; chemin vide à rejouer = `Per` = `None`, puis `Slot` = `"0"` (clé `"0"`, `Prefix` lu `""`, `SaveSlot` lu `0`, H3bS § 2.1, établi). Non spécifiée : le dump est antérieur à six IMPL sur GI, l'effet de `Slot = "0"` en aval (`Array_Contains` sur `NpcRelationships`) n'est pas relu en 5.8, et aucune ligne de J6 ne la justifie.
|
|
Fiche de suite si l'utilisateur la veut (Q-H3d-3) : dump `getRelatedPerson` (P1), puis SPEC.
|
|
|
|
### 2.4 C1 / C2 (R-H3c-4) — tranchés
|
|
Non retenus : leurs lecteurs sont silencieux et ne sont pas la source des lignes à pile (§ 1.2). Aucune garde spécifiée (pas de preuve qu'ils émettent la ligne silencieuse de J6). Les dumps existent (CCW, CAMEG) si une fiche de suite les reprend.
|
|
|
|
## 3. Repli
|
|
|
|
- Avant écriture : instantané `.\Tools\Snapshot.ps1 -Lot STE-H3d` (P3), MD5 de départ relevé (P2).
|
|
- Échec de compilation, diagnostic, `type_id` introuvable (P5) ou lien relu différent : arrêt, `.\Tools\Restore.ps1 -Lot STE-H3d` éditeur fermé (GI entier), contrôle MD5 = valeur de P2. Attention : un `Restore` de GI défait aussi toute écriture de CAM B1 faite entre P3 et le repli (IMPL successives, jamais entrelacées).
|
|
- Après commit (gardien) : `git revert` du commit du ticket STE-H3d (indépendant de ceux de H3, H3b, H3c, H10).
|
|
|
|
## 4. Risques R#, questions Q#
|
|
|
|
- **R-H3d-1** : attribution F2 → `isCreatureType` **estimée forte** (F2 sans pile ; paire F2 + `Accessed None` à pile, mêmes lignes consécutives et même milliseconde ; un seul chemin de données vers `Actor`, CRBG:2012 ; 5 CHECKING pet/horse = 5 F2 en J6, 9 = 9 en H9, 13 → 11 en J5c). La VAL tranche (§ 7).
|
|
- **R-H3d-2** : nœuds lus sur CRBG (GI B8B97C46, 2026-10-10 17:42), HEAD = 71034A04 ; aucune IMPL postérieure ne cite le graphe (estimé) ; P1 (dump neuf) et P4 tranchent.
|
|
- **R-H3d-3** : `type_id` d'`isCreatureType` estimé (P5) ; échec → arrêt et repli.
|
|
- **R-H3d-4** : G13 couvre aussi toute autre évaluation d'`isCreatureType` dans CRBG (un seul appel, `CallFunction_27`) sur une variable à `Person` vide : même effet (F2 supprimée, résultat identique). Les scènes de bestialité (`Actor.isCreatureType(...)`, Grep : 59 fichiers) passent par le même cas ; aucune ne figure dans J5c / H9 / J6.
|
|
- **R-H3d-5** : masquage nul : le chemin vide rejoue (a) ou donne (b) le résultat `false` que l'exécution produit déjà ; `IfThenElse_8994` et la suite sont inchangés.
|
|
- **R-H3d-6** : le critère de la fiche (`Person_24` = 0 en J6) ne peut pas être tenu par G13 : 1 ligne silencieuse non attribuée (§ 1.2). Attendu honnête : J6 = 1 (ou 0 si la ligne est absente du nouveau parcours : elle suit un clic carte).
|
|
- **Q-H3d-1 (utilisateur)** : variante a (rejeu exact, F2 supprimée, `Accessed None … Actor` conservés, 4 nœuds), b (`BoolToReturn = false`, F2 et `Accessed None` supprimés, 3 nœuds, identique si le dump 5.8 confirme le corps de `isCreatureType`) ou c (pas de garde). Recommandation : **b après le dump**, a sinon (conforme à Q1 = A dans les deux cas ; b plus simple).
|
|
- **Q-H3d-2 (utilisateur / orchestrateur)** : lignes silencieuses (J6 : 1, J5c : 2) — accepter le reste (1 ligne par parcours, aucun `Accessed None` associé) ou ouvrir un DIAG dédié (instrumentation, hors lecture seule). Recommandation : accepter ; Q-H3c-2 (« seulement si un reste ») est satisfaite pour `isCreatureType`, pas démontrée pour C1 / C2.
|
|
- **Q-H3d-3 (utilisateur)** : G14 (`getRelatedPerson`, 4 lignes en H9 seulement) : fiche de suite avec dump, ou abstention. Recommandation : abstention tant qu'aucun journal de parcours récent (J6) ne la montre.
|
|
- **Q-H3d-4 (orchestrateur)** : lancer P1 (BUILD-GO) après CAM B1 : 1 dump (`isCreatureType`) pour la variante b, 1 dump (`CallFunctionReturnBool`) de rafraîchissement.
|
|
|
|
## 5. Interdits
|
|
|
|
- Aucune modification d'`isCreatureType`, de `CheckConditionsOther`, `CheckEachCondition`, `CallFunction`, `getRelatedPerson`, de l'EventGraph, des scènes (`.lpscene`), du C++.
|
|
- Aucun nœud AND / OR / Select pur, aucun `FunctionResult` créé, aucun `delete_node`. Pas d'IMPL sans P2 à P5. Pas d'écriture HyperAIStudio (lp-mcp § 1.1) ; outils Epic seulement.
|
|
- Pas de commit par l'agent : ticket au gardien (`lp-repo`). IMPL non entrelacée avec CAM B1.
|
|
|
|
## 6. Valeurs moteur lues dans le moteur installé (UE = `D:\Game\Launcher\Engine\UE_5.8\Engine\Source\`)
|
|
|
|
- `GenericArray_Get`, index invalide : message « Attempted to access index %d from array '%s' of length %d in '%s'! » (nom de la propriété tableau, longueur, chemin du **propriétaire**, ici la structure `Variable`), puis élément remis au défaut : `Runtime\Engine\Private\KismetArrayLibrary.cpp:459-482` (message l. 472-478, `ResetToDefault` l. 479).
|
|
- `GenericArray_IsValidIndex` : test sans message : `Runtime\Engine\Private\KismetArrayLibrary.cpp:583-593`.
|
|
- « Accessed None trying to read (real) property X in not an UClass » (propriété propriétaire non classe : ici le paramètre `Actor` d'une fonction) : `Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3213-3216` ; contexte nul : expression sautée et valeur rendue effacée par `ClearValue` : `:3234-3245`.
|
|
- Cadre d'une fonction script mis à zéro à chaque appel (fonction, pas l'ubergraph persistant) : `ScriptCore.cpp:984-993`.
|
|
- `FString::StartsWith(prefix, len, case)` : `InPrefixLen > 0 && !Strnicmp(**this, InPrefix, InPrefixLen)` en `IgnoreCase` : `Runtime\Core\Private\Containers\String.cpp.inl:640-650` (source vide : faux ; préfixe vide : faux).
|
|
|
|
## 7. Critères de VAL (commande → attendu)
|
|
|
|
1. Dump après IMPL : `.\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=CallFunctionReturnBool -Pins -Exec'` → **595** nœuds (variante a) ou **594** (b), contre 591 (P1/CRBG) ; liens du § 2.2 relus ;
|
|
`python Tools\DiffRemplacementNoeuds.py <avant> <après> <profil>` sans autre écart.
|
|
2. `compile_blueprint` 0 diagnostic ; `CompileAllBlueprints` éditeur fermé : BP `/Game/` du projet 0 erreur (critère requalifié par l'utilisateur le 2026-10-13, `CC_Shaders` à part) ; `LPTestStringCompat` 3120 / 0 / 60 (lp-validate).
|
|
3. Journal d'un build Development, parcours comparable à J6 (même séquence : au moins 5 `CHECKING:` pet/horse), Grep en mode `count` :
|
|
- `Person_24_.*of length 0` → **≤ 1** (J6 : 6 ; attendu 1 si la ligne silencieuse revient, 0 sinon ; plus aucune ligne suivie d'une pile `isCreatureType`) ;
|
|
- multiligne `of length 0[^\n]*\r?\n[^\n]*called by[^\n]*\r?\n[^\n]*property Actor in not an UClass` → **0** (J6 : 5) ;
|
|
- `isCreatureType:64X` (piles) → variante a : égal au nombre de `CHECKING:` pet/horse sans compagnon (J6 : 5) ; variante b : **0** ;
|
|
- non-régression : `CHECKING: .*pet/(horse/)?meet_new_person` ≥ 1 (J6 : 5) ; `index SPAWN` > 0 ; `hours by [1-9]` ≥ 1 ; `\[AI\] \d+ moves to` ≥ 1 ; dénominateur `CHECKING:` relevé ;
|
|
- inchangés : `property Per in` (J6 : 0), `CallFunc_Array_Get_Item_41 ` (0), fatal / Unhandled / Critical / Assertion (0) ; information : `LogScript: Warning: Accessed None` (J6 : 9 ; attendu 4 en variante b, 9 en a).
|
|
4. `& .\Tools\LogStats.ps1 -Compare <journal>,<J6>` : aucune famille nouvelle.
|
|
5. Preuve facultative du chemin « avec compagnon » (inchangé par construction) : un parcours avec un animal de compagnie, la scène `meet_new_person_*` peut démarrer (`CHECKING:` suivi de `SPAWN` ou de la scène) ; non obligatoire (le chemin `then` est le chemin d'origine).
|
|
|
|
Fichiers à commiter (dépôt jeu, branche `ue5.8`, ticket au gardien) :
|
|
- A `Docs/Migration/etat/ST/STE/STE-H3d-SPEC.md`
|
|
|
|
Tours : 26 / 60
|
|
|
|
## Constats
|
|
|
|
Commandes (outil Grep / Read sauf mention) et comptes bruts :
|
|
- C1 `Person_24_.*of length 0` (count) : J6 → **6** ; H9 → **13** ; J5c → 13 (liste `-B1 -A4`, § 1.1).
|
|
- C2 J6, `isCreatureType:|getRelatedPerson:|property Per in` (content) → 6 lignes : 5 fonctions de tête `Function /Game/BPs/GI.GI_C:isCreatureType:64X` (J6:5128, 7327, 7668, 8127, 8714) + 1 résumé LogLifePlay (J6:9884, « 5 … property Actor … isCreatureType ») ;
|
|
J6, `LogScript: Warning: Accessed None` (count) → **9**.
|
|
- C3 `CHECKING: .*pet/(horse/)?meet_new_person` (count) : J6 **5** ; H9 **9** ; J5c **13**.
|
|
- C4 `Bash md5sum` : H9 `596fbe9a0d23f32d8ffbc5987f617d51`, J5c `43db15231d9d64dc152a7d5d41bfbd3d`, `GI.uasset` `71034a04c6d64e1a806ca0dadc934fb9` ; `git log --oneline -3 -- Content/BPs/GI.uasset` → `b3ee785`, `7bceea6`, `4283c13`.
|
|
- C5 `CurrentCompanion\.isCreatureType` (count, glob `*.lpscene`, `Content\Modules`) → 2 fichiers, 1 occurrence chacun (`meet_new_person_pet.lpscene`, `meet_new_person_horse.lpscene`, ligne 5). `\.isCreatureType\(` (files_with_matches) → 59 fichiers.
|
|
- C6 CRBG : `=== GI :: CallFunctionReturnBool (591 noeuds) ===` (CRBG:120) ; `K2Node_CallFunction_98`, `VariableSet_51`, `CallArrayFunction_4`, `CallFunction_99` présents (G11, CRBG:3087-3107) ; lien `Person_24 -> GetArrayItem_2346.Array` CRBG:2007, `Output -> CallFunction_27.Actor` CRBG:2012.
|
|
- C7 L6f : `isCreatureType` → 2 occurrences (appel L6f:22445, fonction L6f:38895-38913 : `Race` de `Actor` → `Conv_TextToString` → `StartsWith(…, Animal, IgnoreCase)` → `True`).
|
|
- C8 `CHECKING` du 05:43:49 en J6 (count) → 15 (toutes avant la ligne 8886) ; aucune ligne `CHECKING:` entre J6:8886 et 8892 (lecture).
|
|
- C9 CAMCF `Person_24_… -> K2Node_GetArrayItem_\d+\.Array` (count) → **95** ; avec `, K2Node_CallArrayFunction_\d+\.TargetArray` (count) → **8** ; `Glob CAM-B1-PRE_LPDumpFunction_*` → 2 dumps `.txt` (EventGraph 08:31:52, CallFunction 08:32:50, code 0) + 2 `.log` sous `Saved\Logs\portage\`.
|
|
- C10 Dumps D récents consultés : `GI__AddVariable_V5.txt:48` (G12 présente : `CallArrayFunction_1.TargetArray`), `GI__destroyDummy_V6.txt` (aucun lecteur `Person_24`). Piles complètes lues : J6:5128-5136, H9 pour les 9 cas `isCreatureType` et les 4 cas `getRelatedPerson` ; pour J6 (4 autres cas) et J5c (11 cas) seule la fonction de tête `isCreatureType:64X` est lue (`-A4`).
|
|
- Écarts de méthode : un `Bash` (`md5sum`, `git log`) ; un `Grep` de dossier sur `etat\…\dumps` sans résultat (dossier ignoré par git, `sk-protocol` § 7) repris par chemins de fichiers ; une regex avec anticipation négative refusée par `rg` (reprise sans). Aucun commandlet, MCP ni éditeur.
|
|
|
|
## Décisions de l'utilisateur (2026-10-13)
|
|
|
|
- Q-H3d-1 : **variante b** (`BoolToReturn = false` sans compagnon, 3 nœuds), sous réserve du dump 5.8 de `isCreatureType` (P1) qui doit confirmer le corps ; si le dump l'infirme : arrêt et retour à l'utilisateur.
|
|
- Q-H3d-2 : **ouvrir un DIAG** sur les lignes silencieuses restantes (fiche STE-H3e, instrumentation, build et session de jeu).
|
|
- Q-H3d-3 : **abstention** sur G14 (`getRelatedPerson`).
|
|
- SPEC approuvée pour la variante b ; IMPL après CAM B1 et les dumps P1 (BUILD-GO de Big Boss).
|
|
- **P1 fait** (2026-10-13 09:09-09:12, BUILD-GO de Big Boss, orchestrateur) sur GI `6A957CB2` (CAM B1 **non commité** ; refaire si B1 est modifié ou replié) : `dumps\GI__isCreatureType_P1.txt` (5 nœuds : `Actor.Race` → `Conv_TextToString` → `StartsWith(Animal, IgnoreCase)` → `True`) et `dumps\GI__CallFunctionReturnBool_P1.txt` (591 nœuds, comme le dump d'avant). **Réserve de Q-H3d-1 levée** : avec `Actor` nul, `Race` lu par défaut (texte vide, `Accessed None`), `StartsWith("", "Dog" | "Horse")` = false → la variante b rend la même valeur sans lecture ; MD5 de GI identique avant / après ; 0 éditeur (le jeu CAM-B1 de l'utilisateur tournait, hors copie).
|