diff --git a/Content/BPs/GI.uasset b/Content/BPs/GI.uasset index 4cd2903..5ba6288 100644 Binary files a/Content/BPs/GI.uasset and b/Content/BPs/GI.uasset differ diff --git a/Content/BPs/Person.uasset b/Content/BPs/Person.uasset index 652c412..cba0722 100644 Binary files a/Content/BPs/Person.uasset and b/Content/BPs/Person.uasset differ diff --git a/Content/UI/CharGen.uasset b/Content/UI/CharGen.uasset index eb3aa08..a5ea127 100644 Binary files a/Content/UI/CharGen.uasset and b/Content/UI/CharGen.uasset differ diff --git a/Content/UI/CharGenSlider.uasset b/Content/UI/CharGenSlider.uasset index 2d1a711..6a6692f 100644 Binary files a/Content/UI/CharGenSlider.uasset and b/Content/UI/CharGenSlider.uasset differ diff --git a/Content/UI/Cursor.uasset b/Content/UI/Cursor.uasset index 77a96fe..a7670e6 100644 Binary files a/Content/UI/Cursor.uasset and b/Content/UI/Cursor.uasset differ diff --git a/Content/UI/Hairstyle.uasset b/Content/UI/Hairstyle.uasset index 77b87e7..5ffe310 100644 Binary files a/Content/UI/Hairstyle.uasset and b/Content/UI/Hairstyle.uasset differ diff --git a/Content/UI/Inventory.uasset b/Content/UI/Inventory.uasset index 1be7d2c..8ec1b72 100644 Binary files a/Content/UI/Inventory.uasset and b/Content/UI/Inventory.uasset differ diff --git a/Content/UI/Inventory_Cloth.uasset b/Content/UI/Inventory_Cloth.uasset index 7240a63..507e127 100644 Binary files a/Content/UI/Inventory_Cloth.uasset and b/Content/UI/Inventory_Cloth.uasset differ diff --git a/Docs/Migration/04_Cahier_Des_Charges.md b/Docs/Migration/04_Cahier_Des_Charges.md index 9383737..225a1e3 100644 --- a/Docs/Migration/04_Cahier_Des_Charges.md +++ b/Docs/Migration/04_Cahier_Des_Charges.md @@ -141,7 +141,7 @@ Ordre indicatif, à réviser selon le registre : | Lot | Famille | Périmètre | |---|---|---| -| L7a | R-03 refait correctement | `GetSkinnedAsset()` pour les proxies ; 56 nœuds, 10 Blueprints | +| L7a | R-03 refait correctement | ✅ outil et réimport faits (CX-B10, 56 nœuds, 8 Blueprints) ; validation en jeu en attente | | L7b | Erreurs d'exécution fréquentes | `ParseIntoArray`, `getBeautyValue`, `standIdle`, `ContactMenu` | | L7c | Configuration | clés de nativisation, rendu 5.5 explicite (GI, ombres, RHI) | | L7d | Visuel | AtmosphericFog → SkyAtmosphere ; reconstruction de l'éclairage | diff --git a/Docs/Migration/05_Correctifs_Isoles.md b/Docs/Migration/05_Correctifs_Isoles.md index b5c223e..9185d7c 100644 --- a/Docs/Migration/05_Correctifs_Isoles.md +++ b/Docs/Migration/05_Correctifs_Isoles.md @@ -41,6 +41,7 @@ exporté dans `Docs/Migration/correctifs/` pour relecture. | CX-B06 | `LPFixDeprecatedNodes` (R-04) | 6 nœuds, `AI`, `Person`, `Room` | `LPNavigationHelpers` | avertissements de dépréciation seulement | 5 | reporté (L7) | | CX-B08 | `LPFixParseIntoArray` (nouveau) | 114 nœuds `ParseIntoArray`, 17 Blueprints | rebranchés sur `LPStringCompat::ParseIntoArray` (algorithme UE 4.27) | UE5 renvoie `[""]` pour une chaîne vide : cause d'ERR-027 (personnages de quête invisibles/dévêtus) | 1 | **réimporté** (CHG-029), validé en jeu | | CX-B09 | `LPFixButtonPadding` (nouveau) | 430 `UButton`, 46 Widget Blueprints | marges des boutons remises au défaut UE 4.27 (Normal 2,2,2,2 ; Pressed 2,3,2,1), composante par composante | le style par défaut de `UButton` est passé à 12 px horizontaux en UE5 (`FUMGCoreStyle`) ; les assets 4.27 ne stockent pas la marge par défaut : cause d'ERR-034 (barre de temps décalée) | 1 | **réimporté** (CHG-033), validé en jeu | +| CX-B10 | `LPFixSkeletalMeshGet` (nouveau) | 56 nœuds `Get SkeletalMesh`, 8 Blueprints (`Person` 28, `GI` 17, `CharGen` 3, `Inventory` 3, `Hairstyle` 2, `CharGenSlider`, `Cursor`, `Inventory_Cloth` 1) | remplacés par `LPMeshCompat::GetSkeletalMesh(Component)` = `Cast(GetSkinnedAsset())`, la sémantique exacte du getter déprécié, valable pour tout `USkinnedMeshComponent` | R-03 refait (L7a) ; remplace CX-B05 rejeté | 1 | **réimporté** (CHG-036) ; validation en jeu en attente | | CX-B07 | `LPResavePackages` (nouveau) | 239 paquets UE4 restants (`UI` 147, `Structs` 57, `BPs` 22, `Render` 11, `Characters` 1, `Scenes` 1) | format UE5, contenu inchangé | EX-03 ; T-STAT-01 | 6 | **réimporté** (CHG-035), diff avant/après neutre ; validation en jeu en attente | ## 3. Protocole de réimport sous contrôle renforcé diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index 80c585d..2e2b5da 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -502,3 +502,31 @@ Rattachement du dépôt local à l'historique publié (2026-09-30) : `.git` sauv propre du dépôt publié. Exclus : `Saved` (comme l'auteur), `Intermediate`, `McpAutomationBridge`, `.mcp.json`, `.claude`, captures d'écran, `.git` local. Test d'intégrité 7-Zip réussi. Script : `D:\Game\LifePlay_Publication\make_archive.cmd`. `README.md` réécrit en anglais avec le lien de l'archive. + +--- + +## Lot L7a — R-03 refait : nœuds `Get SkeletalMesh` dépréciés (2026-09-30) + +Analyse (source UE 5.5) : la lecture de `USkinnedMeshComponent::SkeletalMesh` passe par `GetSkeletalMesh_DEPRECATED()`, +qui renvoie `Cast(GetSkinnedAsset())`. CX-B05 avait pris `USkeletalMeshComponent::GetSkeletalMeshAsset()`, +qui n'existe pas sur les proxies (`USkinnedMeshComponent`) : d'où ERR-002 aggravé. Remplacement exact retenu : +`ULPMeshCompat::GetSkeletalMesh(Component)`, même calcul, pour tout `USkinnedMeshComponent`. Inventaire structurel +(instantané CX-B07) : 56 nœuds sources (les appels `GetSkeletalMesh_DEPRECATED` relevés ne sont que les copies compilées ; +la variable `SkeletalMesh` de `GenitalSlider` est une variable Blueprint, non concernée). + +| ID | Date | Lot | Fichiers | Raison | Retour arrière | +|---|---|---|---|---|---| +| CHG-036 | 2026-09-30 | L7a (CX-B10) | `Source/LifePlay/LPMeshCompat.h/.cpp`, `Source/LifePlayEditorTools/LPFixSkeletalMeshGetCommandlet.h/.cpp` (nouveaux), `Tools/DiffRemplacementNoeuds.py` ; 8 Blueprints (`etat/L7a_assets.txt`) | ERR-012 / R-03 : 56 nœuds dépréciés | `Tools\Restore.ps1 -Lot L7a` ; `git checkout L7a-avant -- Source Tools` | + +| Contrôle | Résultat | Preuve | +|---|---|---| +| Simulation | 56 nœuds, 0 cas non pris en charge (cible `self`, nœud impur) | `etat/L7a_dryrun.txt` | +| Application (contrôle intégré des liaisons) | 56/56 remplacés, 8 Blueprints sauvegardés, 0 écart | `etat/L7a_application.txt` | +| Diff indépendant `LPDumpAssets` avant/après (`Tools/DiffRemplacementNoeuds.py`) | 56 paires (même graphe, même position) ; liaisons `self`→`Component` et `SkeletalMesh`→`ReturnValue` identiques pour 56/56 ; **0 autre objet modifié** (hors copies compilées, graphes anonymes régénérés, GUID, positions des graphes-souches, messages de compilation) | `Saved/Logs/portage/L7a_assets_{avant,apres}.txt` | +| Chargement des 8 Blueprints | avertissements 112 → 6 | journaux `L7a_LPDumpAssets_*` | + +Effet de mesure : le nœud d'origine émettait `Accessed None … SkeletalMesh` sur un composant None ; la nouvelle fonction +renvoie None sans message (trace `LogLifePlay` en `Verbose`). Les compteurs `AccessedNoneMaillage` de `LogStats.ps1` +baissent donc mécaniquement : comparer les sessions sur les autres signatures. +| `CompileAllBlueprints` | 0 erreur, **6 avertissements** (190 avant) : restent seulement les 6 nœuds R-04 `GetRandomPointInNavigableRadius` (`AI`, `Person`, `Room`) | `etat/L7a_CompileAllBlueprints_*.txt` | +| Build empaquetée `LifePlay_Build_5.5_L7a` | cuisson 0 erreur, **3 avertissements** (95 avant) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7a_BuildCookRun.log` | diff --git a/Docs/Migration/Registre_Erreurs.md b/Docs/Migration/Registre_Erreurs.md index 95edcf7..df11a69 100644 --- a/Docs/Migration/Registre_Erreurs.md +++ b/Docs/Migration/Registre_Erreurs.md @@ -1,41 +1,41 @@ -# Registre des erreurs — migration 5.5 - -> Une ligne par signature d'erreur. Fréquence mesurée avec `Tools\LogStats.ps1` ; source indiquée. -> Priorité = fréquence × gravité. Statut : ouvert · en cours · corrigé (CHG) · accepté (V1). - -| ID | Signature | Source | Fréquence | Gravité | Lot cible | Statut | -|---|---|---|---:|---|---|---| -| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | clos (CHG-007) : remplacé par la base saine 4.27 complète ; format UE5 → ERR-022 | -| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | corrigé statiquement (CHG-018) ; A/B d'exécution en attente | -| ERR-021 | broche `Font` d'`EditableTextBoxStyle` : échec de compilation `UI/StatMenu`, `UI/CharGen` | `CompileAllBlueprints` L1 | 6 erreurs | **bloquante** (cuisson) | L4-CX-B02 | corrigé (CHG-022) | -| ERR-022 | 293 packages de gameplay au format UE4 (base 4.27) | `Tools\AssetHeaders.ps1` | 293 | faible (converti au chargement) | L4-CX-B07 | **corrigé (CHG-035, CX-B07)** : 239 paquets réenregistrés (le nombre avait baissé de 293 à 239 grâce aux lots CX-B01 à B09) ; 8563/8563 paquets au format UE5 | -| 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 | **clos** : volet aléatoire corrigé par CX-B01, volet preset par CX-B08 (ERR-027) ; validé en jeu le 2026-09-30 | -| 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 | **corrigé (CHG-029, CX-B08)**, validé en jeu le 2026-09-30 : 0 lecture de corps vide, 0,38 `Accessed None`/perso (43,7 avant) | -| 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` | -| ERR-005 | `getBeautyValue` : `Floats_*` index hors bornes | PIE 09-28 | 1 297 | moyenne | L7b | ouvert | -| ERR-006 | `Accès à None` `NearVec` dans `Person::standIdle` | PIE 09-28 | 273 | moyenne | L7b | ouvert | -| ERR-007 | `Accès à None` `ContactMenu` dans `UpdateDailyPose` | PIE 09-28 | 257 | moyenne | L7b | ouvert | -| ERR-008 | `CallFunc_Array_Get_Item` à None dans `GI` | PIE 09-28 | 229 | moyenne | L5 | ouvert | -| ERR-009 | `SpawnActor failed because no class was specified` | PIE 09-28 | 11 | moyenne | L6 | ouvert | -| ERR-010 | `LogLPModdingTrace` : instrumentation de portage à chaque `LoadTxt` | tous journaux | ≈ 1 300 à 5 400 / session | faible (bruit) | L3 | clos (CHG-016) : `LogModdingExtra` en Verbose | -| ERR-011 | `GetSocketInfoByName … No SkeletalMesh for CharacterMesh` | tous journaux | 80/perso en 4.27, 76 en 5.5 | bruit (existe en 4.27) | — | accepté | -| ERR-012 | Nœud `SkeletalMesh` déprécié (`GI` 52, `Person` 24) | `LogBlueprint` | 153 | faible (dette) | L7a | ouvert | -| ERR-013 | `Daz/Michael/hairs/other/Pubes05-06` introuvable (assets dans `Daz/Bridget/Hairs/Pubic/`) | journaux 4.27 et 5.5 | 56 / session | faible (existe en 4.27) | L7b | ouvert | -| ERR-014 | `Modules/ModLauncher.config` absent : `LoadTxt ECHEC` | journaux 4.27 et 5.5 | 2 / session | faible (existe en 4.27) | L3 | accepté : signalé une seule fois (CHG-016) ; absence = tous les modules actifs | -| ERR-015 | `InputMode:UIOnly … Non-Focusable widget` | PIE 09-28 | 25 | faible | L7b | ouvert | -| ERR-016 | Matériau `FntMat` sans `bUsedWithStaticLighting` → matériau par défaut | rapport 09-28 | — | faible (visuel) | L7d | ouvert | -| ERR-017 | `LogStreaming Failed to read file` (icônes moteur VisionOS, Interchange, Slate) | PIE 09-28 | 37 | cosmétique | — | accepté | -| ERR-018 | Assets StreetMap fortement réduits (`CentralLondon` 202 → 13,6 Mo, `00BathCC`) | comparaison des tailles | 4 fichiers | à qualifier | L4 | ouvert | -| ERR-019 | Plantages du resave de masse : `BulkData IsUnlocked`, `Array.h:783` (`fnt_new100/111`) | `Saved/Crashes` 09-07 | 2 | à surveiller | L4 | ouvert | -| ERR-025 | `LPFixEditableTextBoxFont` : un `Make EditableTextBoxStyle` peut perdre sa police sans rebranchement selon l'ordre de parcours (`CharGen::Make_64`) | relecture du diff L4-CX-B02 | 1 nœud | haute (silencieuse) | L4-CX-B02 | corrigé dans la commandlet (CHG-020) ; présent probablement dans le contenu du 2026-09-07 | -| ERR-026 | Build Development incomplète : 3 257 packages cuits au lieu de 8 561 ; la plupart des maillages, vêtements, coiffures et textures manquent (chargés par chemin à l'exécution, invisibles pour le cuiseur) | retour utilisateur sur `LifePlay_Build_5.5_L4` | 5 304 packages | **bloquante** | L4 | corrigé (CHG-025) : `+DirectoriesToAlwaysCook=(Path="/Game")` ; test T-PKG-01 ajouté | -| ERR-029 | Cuisson L5d : 95 avertissements (L5c : 0) | `L5d_BuildCookRun.log` | 95 | faible | L7a | **accepté** : ≈ 90 dépréciations `Get SkeletalMesh` (R-03) + 3 `GetRandomPointInNavigableRadius` (R-04) + 1 Unreal Trace Server ; visibles car la cuisson itérative a recompilé les 17 Blueprints modifiés par CX-B08 (L5c n'en recompilait aucun). Pas de régression | -| ERR-030 | `Accessed None … Person` dans `GI::Dress` (appelée par `Room`) : habillage des PNJ de pièce | partie V1 du 2026-09-30 (42 min, 271 personnages) | 20 189 (74,5/perso ; 4.27 : 0) | faible (situationnel, pas d'effet visible) | L6b | ouvert — 0 occurrence sur la partie L6a (65 personnages) : dépend du lieu ou de la scène. Lié à ERR-003 : variables de scène `Person` vides 15 à 20/perso en 5.5 contre 3,3 en 4.27 ; `ReturnStatIfNeeded` lit la variable `Player` au tableau `Person` vide (capteur L6a). Le capteur doit pouvoir filtrer par fonction ; partie V1rc (2 h, 339 persos) : `Dress` 283,6/perso en rafales sur 25 minutes (jusqu'à 23 096/min), autres fonctions stables par personnage (`getActorVar` 4,0, `ReturnStatIfNeeded` 3,8) → situationnel, sans effet visible signalé ; lot L7i | -| ERR-031 | Le contact n'apparaît pas dans l'encadré lors d'un appel téléphonique | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6c | **préexistant en 4.27** (constaté par l'utilisateur le 2026-09-30, même encadré vide) : hors périmètre de la migration, non corrigé. Analyse : `UI/Scene::FaceRender` affiche `Render/SecondScreenMat` ← caméra `SecondScreen` de `CentralLondon` (liste « ShowOnly » : `Wall` + `PlayerCharacter`, scène à -3,1e6 / -1,5e7) ; dans la carte 4.27 d'origine, cette caméra a `RootComponent = None` et une position nulle, elle ne vise donc que le ciel | -| ERR-032 | Scintillement à l'approche d'un personnage | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6a | **corrigé (CHG-031)**, validé en jeu le 2026-09-30 : on peut s'approcher des PNJ sans scintillement | -| ERR-033 | Certaines actions demandent deux clics pour démarrer | retour utilisateur 2026-09-30 | — | moyenne (ergonomie) | L6d | **non reproduit** depuis le build L6e (constat utilisateur 2026-09-30) ; aucune modification ciblée — coïncide avec CX-B09 (marges des boutons), sans lien démontré ; sous surveillance, à rouvrir s'il réapparaît | -| ERR-034 | La barre de temps est décalée vers la droite | retour utilisateur 2026-09-30 | — | faible (visuel) | L6e | **corrigé (CHG-033, CX-B09)** — cause : marge par défaut des `UButton` passée de 2 px (UE4 `FCoreStyle`) à 12 px horizontaux (UE5 `FUMGCoreStyle`) ; 5 boutons × 20 px = 100 px de débordement ; **validé en jeu le 2026-09-30** (build L6e, confirmé par l'utilisateur) | +# Registre des erreurs — migration 5.5 + +> Une ligne par signature d'erreur. Fréquence mesurée avec `Tools\LogStats.ps1` ; source indiquée. +> Priorité = fréquence × gravité. Statut : ouvert · en cours · corrigé (CHG) · accepté (V1). + +| ID | Signature | Source | Fréquence | Gravité | Lot cible | Statut | +|---|---|---|---:|---|---|---| +| ERR-001 | `Content/BPs/GI.uasset` au format UE4, identique à 4.27 | `Tools\AssetHeaders.ps1` | 1 fichier | bloquante | L1 | clos (CHG-007) : remplacé par la base saine 4.27 complète ; format UE5 → ERR-022 | +| ERR-020 | `GetAssetsByClass` : classe perdue à la montée de version (3 nœuds `GI`) + 2 `Break AssetData` sans `ObjectPath` | `LPCheckMeshAssignment` L1 | 5 broches | **bloquante** (cause probable d'ERR-002) | L4-CX-B01 | corrigé statiquement (CHG-018) ; A/B d'exécution en attente | +| ERR-021 | broche `Font` d'`EditableTextBoxStyle` : échec de compilation `UI/StatMenu`, `UI/CharGen` | `CompileAllBlueprints` L1 | 6 erreurs | **bloquante** (cuisson) | L4-CX-B02 | corrigé (CHG-022) | +| ERR-022 | 293 packages de gameplay au format UE4 (base 4.27) | `Tools\AssetHeaders.ps1` | 293 | faible (converti au chargement) | L4-CX-B07 | **corrigé (CHG-035, CX-B07)** : 239 paquets réenregistrés (le nombre avait baissé de 293 à 239 grâce aux lots CX-B01 à B09) ; 8563/8563 paquets au format UE5 | +| 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 | **clos** : volet aléatoire corrigé par CX-B01, volet preset par CX-B08 (ERR-027) ; validé en jeu le 2026-09-30 | +| 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 | **corrigé (CHG-029, CX-B08)**, validé en jeu le 2026-09-30 : 0 lecture de corps vide, 0,38 `Accessed None`/perso (43,7 avant) | +| 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` | +| ERR-005 | `getBeautyValue` : `Floats_*` index hors bornes | PIE 09-28 | 1 297 | moyenne | L7b | ouvert | +| ERR-006 | `Accès à None` `NearVec` dans `Person::standIdle` | PIE 09-28 | 273 | moyenne | L7b | ouvert | +| ERR-007 | `Accès à None` `ContactMenu` dans `UpdateDailyPose` | PIE 09-28 | 257 | moyenne | L7b | ouvert | +| ERR-008 | `CallFunc_Array_Get_Item` à None dans `GI` | PIE 09-28 | 229 | moyenne | L5 | ouvert | +| ERR-009 | `SpawnActor failed because no class was specified` | PIE 09-28 | 11 | moyenne | L6 | ouvert | +| ERR-010 | `LogLPModdingTrace` : instrumentation de portage à chaque `LoadTxt` | tous journaux | ≈ 1 300 à 5 400 / session | faible (bruit) | L3 | clos (CHG-016) : `LogModdingExtra` en Verbose | +| ERR-011 | `GetSocketInfoByName … No SkeletalMesh for CharacterMesh` | tous journaux | 80/perso en 4.27, 76 en 5.5 | bruit (existe en 4.27) | — | accepté | +| ERR-012 | Nœud `SkeletalMesh` déprécié (`GI` 52, `Person` 24) | `LogBlueprint` | 153 | faible (dette) | L7a | **corrigé (CHG-036, CX-B10)** : 56 nœuds (8 Blueprints) remplacés par `LPMeshCompat::GetSkeletalMesh` ; compilation 190 → 6 avertissements, cuisson 95 → 3 ; validation en jeu en attente | +| ERR-013 | `Daz/Michael/hairs/other/Pubes05-06` introuvable (assets dans `Daz/Bridget/Hairs/Pubic/`) | journaux 4.27 et 5.5 | 56 / session | faible (existe en 4.27) | L7b | ouvert | +| ERR-014 | `Modules/ModLauncher.config` absent : `LoadTxt ECHEC` | journaux 4.27 et 5.5 | 2 / session | faible (existe en 4.27) | L3 | accepté : signalé une seule fois (CHG-016) ; absence = tous les modules actifs | +| ERR-015 | `InputMode:UIOnly … Non-Focusable widget` | PIE 09-28 | 25 | faible | L7b | ouvert | +| ERR-016 | Matériau `FntMat` sans `bUsedWithStaticLighting` → matériau par défaut | rapport 09-28 | — | faible (visuel) | L7d | ouvert | +| ERR-017 | `LogStreaming Failed to read file` (icônes moteur VisionOS, Interchange, Slate) | PIE 09-28 | 37 | cosmétique | — | accepté | +| ERR-018 | Assets StreetMap fortement réduits (`CentralLondon` 202 → 13,6 Mo, `00BathCC`) | comparaison des tailles | 4 fichiers | à qualifier | L4 | ouvert | +| ERR-019 | Plantages du resave de masse : `BulkData IsUnlocked`, `Array.h:783` (`fnt_new100/111`) | `Saved/Crashes` 09-07 | 2 | à surveiller | L4 | ouvert | +| ERR-025 | `LPFixEditableTextBoxFont` : un `Make EditableTextBoxStyle` peut perdre sa police sans rebranchement selon l'ordre de parcours (`CharGen::Make_64`) | relecture du diff L4-CX-B02 | 1 nœud | haute (silencieuse) | L4-CX-B02 | corrigé dans la commandlet (CHG-020) ; présent probablement dans le contenu du 2026-09-07 | +| ERR-026 | Build Development incomplète : 3 257 packages cuits au lieu de 8 561 ; la plupart des maillages, vêtements, coiffures et textures manquent (chargés par chemin à l'exécution, invisibles pour le cuiseur) | retour utilisateur sur `LifePlay_Build_5.5_L4` | 5 304 packages | **bloquante** | L4 | corrigé (CHG-025) : `+DirectoriesToAlwaysCook=(Path="/Game")` ; test T-PKG-01 ajouté | +| ERR-029 | Cuisson L5d : 95 avertissements (L5c : 0) | `L5d_BuildCookRun.log` | 95 | faible | L7a | **accepté** : ≈ 90 dépréciations `Get SkeletalMesh` (R-03) + 3 `GetRandomPointInNavigableRadius` (R-04) + 1 Unreal Trace Server ; visibles car la cuisson itérative a recompilé les 17 Blueprints modifiés par CX-B08 (L5c n'en recompilait aucun). Pas de régression | +| ERR-030 | `Accessed None … Person` dans `GI::Dress` (appelée par `Room`) : habillage des PNJ de pièce | partie V1 du 2026-09-30 (42 min, 271 personnages) | 20 189 (74,5/perso ; 4.27 : 0) | faible (situationnel, pas d'effet visible) | L6b | ouvert — 0 occurrence sur la partie L6a (65 personnages) : dépend du lieu ou de la scène. Lié à ERR-003 : variables de scène `Person` vides 15 à 20/perso en 5.5 contre 3,3 en 4.27 ; `ReturnStatIfNeeded` lit la variable `Player` au tableau `Person` vide (capteur L6a). Le capteur doit pouvoir filtrer par fonction ; partie V1rc (2 h, 339 persos) : `Dress` 283,6/perso en rafales sur 25 minutes (jusqu'à 23 096/min), autres fonctions stables par personnage (`getActorVar` 4,0, `ReturnStatIfNeeded` 3,8) → situationnel, sans effet visible signalé ; lot L7i | +| ERR-031 | Le contact n'apparaît pas dans l'encadré lors d'un appel téléphonique | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6c | **préexistant en 4.27** (constaté par l'utilisateur le 2026-09-30, même encadré vide) : hors périmètre de la migration, non corrigé. Analyse : `UI/Scene::FaceRender` affiche `Render/SecondScreenMat` ← caméra `SecondScreen` de `CentralLondon` (liste « ShowOnly » : `Wall` + `PlayerCharacter`, scène à -3,1e6 / -1,5e7) ; dans la carte 4.27 d'origine, cette caméra a `RootComponent = None` et une position nulle, elle ne vise donc que le ciel | +| ERR-032 | Scintillement à l'approche d'un personnage | retour utilisateur 2026-09-30 | — | moyenne (visuel) | L6a | **corrigé (CHG-031)**, validé en jeu le 2026-09-30 : on peut s'approcher des PNJ sans scintillement | +| ERR-033 | Certaines actions demandent deux clics pour démarrer | retour utilisateur 2026-09-30 | — | moyenne (ergonomie) | L6d | **non reproduit** depuis le build L6e (constat utilisateur 2026-09-30) ; aucune modification ciblée — coïncide avec CX-B09 (marges des boutons), sans lien démontré ; sous surveillance, à rouvrir s'il réapparaît | +| ERR-034 | La barre de temps est décalée vers la droite | retour utilisateur 2026-09-30 | — | faible (visuel) | L6e | **corrigé (CHG-033, CX-B09)** — cause : marge par défaut des `UButton` passée de 2 px (UE4 `FCoreStyle`) à 12 px horizontaux (UE5 `FUMGCoreStyle`) ; 5 boutons × 20 px = 100 px de débordement ; **validé en jeu le 2026-09-30** (build L6e, confirmé par l'utilisateur) | diff --git a/Tools/DiffRemplacementNoeuds.py b/Tools/DiffRemplacementNoeuds.py new file mode 100644 index 0000000..0880ca4 --- /dev/null +++ b/Tools/DiffRemplacementNoeuds.py @@ -0,0 +1,96 @@ +import re,sys,collections +def parse(p): + objs={}; pkg=None; key=None + for line in open(p,encoding='utf-8'): + line=line.rstrip('\n') + if line.startswith('##### '): pkg=line[6:]; continue + m=re.match(r'^ (\S+) \[(\w+)\]$',line) + if m: key=(pkg,m.group(1)); objs[key]={'cls':m.group(2),'lines':[]}; continue + if key: objs[key]['lines'].append(line) + return objs +A=parse(sys.argv[1]); B=parse(sys.argv[2]) +def graph(path): return path.split(':')[-1].split('.')[0] if ':' in path else '' +def iscopy(path): + g=graph(path); return "ExecuteUbergraph" in g or g.endswith("_MERGED") or re.fullmatch(r"EdGraph_[0-9]+",g) is not None +def pos(o): + x=y='0' + for l in o['lines']: + if l.startswith(' NodePosX = '): x=l.split('= ')[1] + if l.startswith(' NodePosY = '): y=l.split('= ')[1] + return x,y +old={k:v for k,v in A.items() if v['cls']=='K2Node_VariableGet' and not iscopy(k[1]) and any('Engine.SkinnedMeshComponent\'",MemberName="SkeletalMesh"' in l for l in v['lines'])} +new={k:v for k,v in B.items() if v['cls']=='K2Node_CallFunction' and not iscopy(k[1]) and any('MemberName="GetSkeletalMesh"' in l and 'LPMeshCompat' in l for l in v['lines'])} +print('anciens noeuds',len(old),'nouveaux',len(new)) +idx={(k[0],k[1].rsplit('.',1)[0],pos(v)):k for k,v in new.items()} +ren={}; miss=0 +for k,v in old.items(): + t=idx.get((k[0],k[1].rsplit('.',1)[0],pos(v))) + if not t: miss+=1; continue + ren[(k[0],graph(k[1]),k[1].rsplit('.',1)[1])]=t[1].rsplit('.',1)[1] +print('apparies',len(ren),'non apparies',miss) +skip=re.compile(r'^ (NodeGuid|GraphGuid|ErrorType|ErrorMsg|bHasCompilerMessage|NodePosX|NodePosY) = ') +def norm(pkg,g,lines): + out=[] + for l in lines: + if skip.match(l): continue + for (p,gg,o),n in ren.items(): + if p==pkg and gg==g: + l=l.replace(o+'.SkeletalMesh',n+'.ReturnValue').replace(o+'.self',n+'.Component') + out.append(canon(l,pkg,g)) + return out +def canon(l,pkg=None,g=None): + if l.startswith(' pin ') and ' -> ' in l: + head,links=l.rsplit(' -> ',1) + return head+' -> '+', '.join(sorted(x for x in links.split(', ') if x)) + if l.startswith(' Nodes = ('): + items=[x.strip('"') for x in l[len(' Nodes = ('):-1].split('","')] + if pkg is not None: + items=[x for x in items if not any(pkg==p2 and ("."+o+"'") in x and (":"+gg+".") in x for (p2,gg,o) in ren)] + items+=[ "NOUVEAU:"+pkg+":"+gg+"."+n for (p2,gg,o),n in ren.items() if p2==pkg and gg==g ] + else: + items=[("NOUVEAU:"+x.split("'/Game/")[0] if False else x) for x in items] + return ' Nodes = SET'+str(sorted(items)) + return l +newnames={(k[0],graph(k[1]),k[1].rsplit('.',1)[1]) for k in new} +def canonB(k,l): + if l.startswith(' Nodes = ('): + items=[x.strip('"') for x in l[len(' Nodes = ('):-1].split('","')] + keep=[]; add=[] + for x in items: + nm=x.rsplit('.',1)[1].rstrip("'") + if (k[0],k[1].split(':')[-1],nm) in newnames: add.append("NOUVEAU:"+k[0]+":"+k[1].split(':')[-1]+"."+nm) + else: keep.append(x) + return ' Nodes = SET'+str(sorted(keep+add)) + return canon(l) +diffs=collections.Counter(); ex=[] +for k in set(A)|set(B): + if iscopy(k[1]) or k in old or k in new: continue + if k[1].startswith('PLACEHOLDER'): continue + a=norm(k[0],graph(k[1]),A[k]['lines']) if k in A else None; b=[canonB(k,l) for l in B[k]['lines'] if not skip.match(l)] if k in B else None + if a!=b: + cls=(A.get(k) or B.get(k))['cls'] + diffs[(k[0],cls,'absent avant' if a is None else 'absent apres' if b is None else 'modifie')]+=1 + if len(ex)<40: ex.append((k,[x for x in (a or []) if x not in (b or [])][:2],[x for x in (b or []) if x not in (a or [])][:2])) +print('objets en ecart hors noeuds remplaces et copies :',sum(diffs.values())) +for k,v in sorted(diffs.items()): print(' ',v,*k) +for e in ex: print(e[0]); [print(' -',x[:160]) for x in e[1]]; [print(' +',x[:160]) for x in e[2]] +def pinlinks(o,name): + for l in o['lines']: + m=re.match(r'^ pin (\S+) \[.*\] defaut=.* -> (.*)$',l) + if m and m.group(1)==name: return sorted(x for x in m.group(2).split(', ') if x) + return None +ok=bad=0 +for k,v in old.items(): + t=idx[(k[0],k[1].rsplit('.',1)[0],pos(v))]; n=B[t] + g=graph(k[1]) + def rn(lst): + out=[] + for x in lst or []: + for (p2,gg,o),nn in ren.items(): + if p2==k[0] and gg==g: x=x.replace(o+'.',nn+'.') if x.split('.')[0]==o else x + out.append(x) + return sorted(out) + if rn(pinlinks(v,'self'))==pinlinks(n,'Component') and rn(pinlinks(v,'SkeletalMesh'))==pinlinks(n,'ReturnValue'): ok+=1 + else: + bad+=1; print('ECART',k[1],pinlinks(v,'self'),pinlinks(n,'Component'),pinlinks(v,'SkeletalMesh'),pinlinks(n,'ReturnValue')) +print('noeuds remplaces : liaisons identiques',ok,'/ ecarts',bad)