31 KiB
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 ; MD5596fbe9a0d23f32d8ffbc5987f617d51) ; - 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 = DGI__CallFunctionReturnBool_apres-GARDES.txt(dump STE-VAL, 2026-10-10 17:42:40, GI B8B97C46, 591 nœuds, CRBG:120) ; GRP = DGI__getRelatedPerson_D3.txt(STE-D3, GI 606EB437) ; CCW = DGI__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 pasCallFunctionReturnBool; 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 deGetArrayItem_2498(GRP:145-150,Person_24_… -> GetArrayItem_2498.Array,Output -> VariableSet_0.Per) ; la pile citegetRelatedPersonappelée parCallFunction. 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é sansAccessed None; J6:8892 tombe hors balayageCHECKING:(aucune ligneCHECKING:entre 8886 et 8892, soit ≥ 0,4 s sans balayage), précédée d'un clic carte, suivie de[AI] 2 moves to art118 ms plus tard ; J5c:34375 suitDestroyDummy was from AddVariable; J5c:34556 suit un changement de curseur. Candidats de R-H3c-4 : C1 (CheckConditionsWho, CCW:180-204 :GetVariable→GetArrayItem_3268→ IsValidMacroInstance_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_645surPersons→GetVariable→GetArrayItem_935→ IsValidMacroInstance_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 lecteursPerson_24_… -> GetArrayItem_N.Array, dont 8 reliés aussi à unCallArrayFunction_N.TargetArray(G4-G10 =_8à_14, et_3non 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
CallFunctionReturnBooldansSTE-*IMPL*.md: 2 occurrences, toutes dansSTE-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).
- bloquant pour la variante b seulement (corps 5.8 de
- P2 : MD5 de
GI.uassetrelevé 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>"}]}pourSwitchString_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 deCallFunction_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) : attenduAppelerunefonction|IsCreatureType(estimé, par analogie avecAppelerunefonction|HasRelationship, GIMPL:39) ; aprèscreate_node,get_node_infosdoit montrer la fonctionisCreatureTypede GI, pure, commeCallFunction_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) :
CallFunction_21.then→G13-B.execute(0) ;BreakStruct_956.Person_24_4B712C904750AD4CE1580DBEBD9E7396→G13-I.TargetArray(0) (broche générique, typéePersonau câblage ; le lien versGetArrayItem_2346.Arrayreste) ;G13-I.ReturnValue(0) →G13-B.Condition(1) ;G13-B.then(0) →VariableSet_23.execute(0) ;G13-B.else(1) →G13-S.execute(0) ;GetArrayItem_21.Output→G13-H.Animal(le lien versCallFunction_27.Animalreste) ;G13-H.True→G13-S.BoolToReturn(1) ;G13-S.then(0) →IfThenElse_8994.execute.G13-H.Actorreste sans lien (défautNone, relu) ;G13-H.selfvide ;G13-I.IndexToTest=0(relu, ne le poser que s'il diffère). Aucunset_pin_value.get_node_infosfinal deG13-I,G13-B,G13-H,G13-Set 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_idintrouvable (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 : unRestorede 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 revertdu commit du ticket STE-H3d (indépendant de ceux de H3, H3b, H3c, H10).
4. Risques R#, questions Q#
- R-H3d-1 : attribution F2 →
isCreatureTypeestimé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 versActor, 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_idd'isCreatureTypeestimé (P5) ; échec → arrêt et repli. - R-H3d-4 : G13 couvre aussi toute autre évaluation d'
isCreatureTypedans CRBG (un seul appel,CallFunction_27) sur une variable àPersonvide : 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
falseque l'exécution produit déjà ;IfThenElse_8994et 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 … Actorconservés, 4 nœuds), b (BoolToReturn = false, F2 etAccessed Nonesupprimés, 3 nœuds, identique si le dump 5.8 confirme le corps deisCreatureType) 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 Noneassocié) ou ouvrir un DIAG dédié (instrumentation, hors lecture seule). Recommandation : accepter ; Q-H3c-2 (« seulement si un reste ») est satisfaite pourisCreatureType, 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, deCheckConditionsOther,CheckEachCondition,CallFunction,getRelatedPerson, de l'EventGraph, des scènes (.lpscene), du C++. - Aucun nœud AND / OR / Select pur, aucun
FunctionResultcréé, aucundelete_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 structureVariable), puis élément remis au défaut :Runtime\Engine\Private\KismetArrayLibrary.cpp:459-482(message l. 472-478,ResetToDefaultl. 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
Actord'une fonction) :Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3213-3216; contexte nul : expression sautée et valeur rendue effacée parClearValue::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)enIgnoreCase:Runtime\Core\Private\Containers\String.cpp.inl:640-650(source vide : faux ; préfixe vide : faux).
7. Critères de VAL (commande → attendu)
- 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. compile_blueprint0 diagnostic ;CompileAllBlueprintséditeur fermé : BP/Game/du projet 0 erreur (critère requalifié par l'utilisateur le 2026-10-13,CC_Shadersà part) ;LPTestStringCompat3120 / 0 / 60 (lp-validate).- Journal d'un build Development, parcours comparable à J6 (même séquence : au moins 5
CHECKING:pet/horse), Grep en modecount:Person_24_.*of length 0→ ≤ 1 (J6 : 6 ; attendu 1 si la ligne silencieuse revient, 0 sinon ; plus aucune ligne suivie d'une pileisCreatureType) ;- 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 deCHECKING: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énominateurCHECKING: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).
& .\Tools\LogStats.ps1 -Compare <journal>,<J6>: aucune famille nouvelle.- 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 deSPAWNou de la scène) ; non obligatoire (le cheminthenest 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êteFunction /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: H9596fbe9a0d23f32d8ffbc5987f617d51, J5c43db15231d9d64dc152a7d5d41bfbd3d,GI.uasset71034a04c6d64e1a806ca0dadc934fb9;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_99présents (G11, CRBG:3087-3107) ; lienPerson_24 -> GetArrayItem_2346.ArrayCRBG:2007,Output -> CallFunction_27.ActorCRBG:2012. - C7 L6f :
isCreatureType→ 2 occurrences (appel L6f:22445, fonction L6f:38895-38913 :RacedeActor→Conv_TextToString→StartsWith(…, Animal, IgnoreCase)→True). - C8
CHECKINGdu 05:43:49 en J6 (count) → 15 (toutes avant la ligne 8886) ; aucune ligneCHECKING: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.logsousSaved\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 lecteurPerson_24). Piles complètes lues : J6:5128-5136, H9 pour les 9 casisCreatureTypeet les 4 casgetRelatedPerson; pour J6 (4 autres cas) et J5c (11 cas) seule la fonction de têteisCreatureType:64Xest lue (-A4). - Écarts de méthode : un
Bash(md5sum,git log) ; unGrepde dossier suretat\…\dumpssans résultat (dossier ignoré par git,sk-protocol§ 7) repris par chemins de fichiers ; une regex avec anticipation négative refusée parrg(reprise sans). Aucun commandlet, MCP ni éditeur.
Décisions de l'utilisateur (2026-10-13)
- Q-H3d-1 : variante b (
BoolToReturn = falsesans compagnon, 3 nœuds), sous réserve du dump 5.8 deisCreatureType(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) etdumps\GI__CallFunctionReturnBool_P1.txt(591 nœuds, comme le dump d'avant). Réserve de Q-H3d-1 levée : avecActornul,Racelu 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).