From d4eea7397be4bb3002804999dbcfba42550cb19a Mon Sep 17 00:00:00 2001 From: edujiro5972 <336072401+edujiro5972@users.noreply.github.com> Date: Tue, 29 Sep 2026 23:47:12 +0200 Subject: [PATCH] L5 : cause racine d'ERR-027 - ParseIntoArray("") renvoie [""] en UE5 contre [] en UE4 generatePersonTemporary() sans argument -> Presets=[""] -> GeneratePerson charge les 141 presets (suffixe ".lpcharacter") -> phenotype a race legacy -> corps vide. Co-Authored-By: Claude Opus 5.5 --- Docs/Migration/Journal_Modifications.md | 24 ++++++++++++++++++++++++ Docs/Migration/Registre_Erreurs.md | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index 43356e5..10408d1 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -301,3 +301,27 @@ Suite : session 4.27 jouant les mêmes scènes de quête, puis comparaison norma Note de traçabilité : la sauvegarde `L5-instr` de `LPSessionLogSubsystem.*` a été prise après modification ; la version antérieure est dans git (`0baf4cf`). | CHG-028 | 2026-09-29 | L5 | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` | capteur d'exceptions de script (-LPTraceScriptEx, -LPTraceLocals, -LPTraceMax) : relève les variables locales du cadre Blueprint au moment de l'erreur ; actif seulement avec l'option (le moteur supprime sa pile d'appel quand un écouteur est branché : elle est réécrite). Validé en -game. | `Tools\Restore.ps1 -Lot L5-trace` | + +### ERR-027 — cause racine identifiée (2026-09-29) + +Chaîne causale, établie par le capteur L5c et le code source des deux moteurs : + +1. La scène `vin_Pregnancy/Scenes/pregnant_trap.lpscene` appelle `generatePersonTemporary()` **sans argument** + (personnage aléatoire). +2. Les arguments `()` sont découpés par `ParseIntoArray` (non culling). Sur une **chaîne vide** : + - UE 4.27 (`String.cpp:947`, garde `*Start != '\0'`) → **0 élément** ; + - UE 5.5 (`String.cpp.inl:1306`, réécrit sur `UE::String::ParseTokens`, qui visite toujours le dernier + jeton) → **1 élément vide `[""]`**. +3. `GeneratePerson` teste `Length(Presets) > 0` : en 5.5, il prend le chemin « presets » au lieu du chemin aléatoire. +4. Il charge chaque `.lpcharacter` dont le nom se termine par `"" + ".lpcharacter"` : **les 141 presets**, + appliqués successivement (journal L5c : stéréotypes, fantasy, âges, silhouettes… puis `phenotypes/*`). +5. Un preset de phénotype impose `INFO Race: African/Asian/Caucasian` → `PlayerChangeRace` → corps legacy + `MeshSexRace[0..2|5..7]`, jamais chargé (`LegacyPercentage = 0`) → **corps vide : invisible ; vêtements + Daz sans support : dévêtu**. + +Le rapport du 2026-09-28 (§4) avait écarté `ParseIntoArray` (« implémentation identique ») : c'est exact pour +une chaîne non vide, **faux pour la chaîne vide**. Toutes les fonctions Blueprint de la chaîne sont identiques +entre 4.27 et 5.5 ; la divergence est dans le moteur. + +Preuves : `Saved/Logs/portage/L5c_partie_utilisateur2_20260929.log`, `etat/L5-diag_dump55exec_GI_GeneratePerson.txt`, +`etat/L5-diag_dump55exec_GI_GenerateAndApplyStrings.txt`. diff --git a/Docs/Migration/Registre_Erreurs.md b/Docs/Migration/Registre_Erreurs.md index 2484eef..ac9861d 100644 --- a/Docs/Migration/Registre_Erreurs.md +++ b/Docs/Migration/Registre_Erreurs.md @@ -12,7 +12,7 @@ | ERR-023 | `AndroidFileServer` réécrit sa section et son `SecurityToken` dans `DefaultEngine.ini` à chaque lancement | L1 | chaque lancement | faible (bruit git) | L2 | clos (CHG-011, CHG-012) | | ERR-024 | `McpAutomationBridge` (outil de développement) impose des plugins d'exécution (`GameplayAbilities`, `SmartObjects`, `Niagara`, `PythonScriptPlugin`…) et dépend de `StructUtils`, déprécié en 5.5 | UBT L2 | — | faible (livraison) | L7g | ouvert | | ERR-002 | `generatePerson()` sans argument : personnages identiques (« Tyrone »), nus, invisibles ; en PIE 5.5 chaque `index SPAWN` pointe vers `Person_C_0` | rapport 2026-09-28, journal PIE 09-28 | 16,6 `Accessed None` maillage/perso (4.27 : 0,3) | bloquante | L5 | **scindé** après la partie jouée du 2026-09-29 (build L4b) : les PNJ générés au hasard dans les pièces sont affichés et habillés → volet « aléatoire » corrigé par CX-B01 (confirmé visuellement). Le volet « preset » reste ouvert → ERR-027 | -| ERR-027 | Personnages de quête (`generatePerson(preset)`) invisibles pendant le dialogue, dévêtus dans le mini-jeu. Pile : `ReadSceneLine → CallFunction → GeneratePerson → LoadPreset → GenerateAndApplyStrings / GenerateAndApplyBools` lit un maillage vide dans les champs de structure `Mesh_2_99B58993…` et `SkeletalMesh_2_93573D99…` ; en aval `GetSkeletalMesh_DEPRECATED` renvoie None (`Person` EventGraph, `GI::PlayAnimationMorph`) | partie utilisateur L4b (`LifePlay_Build_5.5_L4b/.../Saved/Logs/LifePlay.log`) | `Accessed None` maillage : **26,5 par personnage** (1 219 / 46) contre **0,27** en 4.27 (4 / 15) ; les deux signatures de champ : 0 occurrence en 4.27 | **bloquante** | L5 | ouvert — prochaine étape : identifier la structure propriétaire des deux champs et la source du tableau de maillages lu par `GenerateAndApplyStrings/Bools`, diff `LPDumpFunction` 4.27/5.5 de ces deux fonctions | +| ERR-027 | Personnages de quête (`generatePerson(preset)`) invisibles pendant le dialogue, dévêtus dans le mini-jeu. Pile : `ReadSceneLine → CallFunction → GeneratePerson → LoadPreset → GenerateAndApplyStrings / GenerateAndApplyBools` lit un maillage vide dans les champs de structure `Mesh_2_99B58993…` et `SkeletalMesh_2_93573D99…` ; en aval `GetSkeletalMesh_DEPRECATED` renvoie None (`Person` EventGraph, `GI::PlayAnimationMorph`) | partie utilisateur L4b (`LifePlay_Build_5.5_L4b/.../Saved/Logs/LifePlay.log`) | `Accessed None` maillage : **26,5 par personnage** (1 219 / 46) contre **0,27** en 4.27 (4 / 15) ; les deux signatures de champ : 0 occurrence en 4.27 | **bloquante** | L5 | **cause racine identifiée** : `ParseIntoArray("")` renvoie `[""]` en UE 5.5 contre `[]` en 4.27 → `generatePerson()` sans argument charge les 141 presets → race legacy non chargée. Correctif : CX-B08 | | ERR-028 | `clearVariable` : index 0 sur tableau `Person` vide de `Variable` (via `GeneratePerson`, `getRelative`, `GetSpecific`) | partie utilisateur L4b | 211 | **bruit** : présent à l'identique en 4.27 — piste écartée | — | accepté | | ERR-003 | `Attempted to access index 0 from array Float_… of length 0` dans `GI::ReturnStatIfNeeded` (variable DSL `Float` vide) | build 5.5 Development | 2 (4.27 : 0) | haute | L5 | ouvert | | ERR-004 | `index N from CallFunc_ParseIntoArray_ReturnValue of length N` (`GI` EventGraph) | PIE 09-28 | 6 510 | moyenne | L7b | ouvert — origine localisée (L3) : `GI.populateClothes4` appelée par `Person.ReceiveBeginPlay` |