217 lines
20 KiB
Markdown
217 lines
20 KiB
Markdown
|
|
Fiche STD-SCN — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-opus-5-5 — Agent lp-cart — Skills lp-doc (gabarits), sk-protocol
|
|||
|
|
# STD-SCN-DIAG : familles du moteur de scènes, origine STB ou préexistante (2026-10-10)
|
|||
|
|
|
|||
|
|
Lecture seule stricte : aucun lancement (jeu, éditeur, commandlet, build), aucune écriture hors de ce fichier. Copie
|
|||
|
|
`D:\Game\LifePlay-master 5.8` lue à HEAD `20620f6` (gelée par STC).
|
|||
|
|
|
|||
|
|
Abréviations des journaux (chemins absolus) :
|
|||
|
|
- **L2** = STB-JEU2 `D:\Game\LifePlay_Build_5.8_STB-JEU2_Development\Windows\LifePlay\Saved\Logs\LifePlay.log`
|
|||
|
|
- **L1** = STB-JEU `D:\Game\LifePlay_Build_5.8_STB-JEU_Development\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.09-20.30.49.log`
|
|||
|
|
- **LU8** = base U8 `D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.09-16.46.02.log`
|
|||
|
|
- **DC4** = 5.5 avant migration `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U6\LifePlay_55_DC4_avantU6.log`
|
|||
|
|
- **U6-55** / **U6-58** = `...\etat\U58\U6\LifePlay_55_session2.log` / `LifePlay_58_session2.log`
|
|||
|
|
- **P10-55** / **P10-58** = `...\etat\U58\U7\P10\5.5\LifePlay.log` / `...\U7\P10\5.8\LifePlay.log` (5.8 avant STB, 2026-10-09 06:4x)
|
|||
|
|
- **JM** = `D:\Game\LifePlay-master 5.8\Docs\Migration\Journal_Modifications.md`
|
|||
|
|
- Dumps : **STA-d** = `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\dumps\`, **STB-d** = `...\etat\ST\STB\dumps\`
|
|||
|
|
|
|||
|
|
## 1. Symptôme et reproduction
|
|||
|
|
|
|||
|
|
Session STB-JEU2 (parcours : nouvelle partie avec éditeur de personnage, ville, actions seul et avec partenaire,
|
|||
|
|
scènes dont `meet_couple`, `STB-JEU-VAL.md:14-15`). Comptes bruts dans L2 (Grep, mode `count`, rejouables) :
|
|||
|
|
|
|||
|
|
| Famille | Motif Grep exact | L2 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| F1 `Accessed None … Person` | `property Person in` | 270 (en tête de pile : `GI_C:ReturnStatIfNeeded:64X` 93, `GI_C:getActorVar:64X` 142, `GI_C:setActorVar:64X` 32 ; 3 non ventilées) |
|
|||
|
|
| F2 index hors bornes « tableau sans nom » | `Person_24_4B712C904750AD4CE1580DBEBD9E7396' of length 0` | 351 (le tableau est le membre `Person` de la structure `/Game/Structs/Variable`, d'où le nom à GUID) |
|
|||
|
|
| F3 `CallFunc_Array_Get_Item_31/32/33/41` | `property CallFunc_Array_Get_Item_(31\|32\|33\|41) ` | 167 (171 avec `_\d+` : 4 lignes `_30` hors fiche, L2:12087, 12097, 22396, 22406) ; dont `_33` : 33 |
|
|||
|
|
| F4 `CallFunc_GetSkeletalMesh_ReturnValue` | `property CallFunc_GetSkeletalMesh_ReturnValue` | 99 ; variante GI (multiligne, en-tête `GI_C:ExecuteUbergraph_GI:`) 96 |
|
|||
|
|
| F5 « No SkeletalMesh » | `No SkeletalMesh` | 15 793 (51 % des 30 995 lignes) ; `Person_C_2147481850` 10 751, `Person_C_2147481946` 1 040 ; socket `CenterBrow` 3 264 |
|
|||
|
|
| Dénominateurs | `CHECKING:` / `index SPAWN` / `DestroyDummy was from CheckScenes` / `\(test0104\) for [0-9.]+ hours by 0` / `Actor cleared and destroyed` | 2 318 / 123 / 185 / 24 / **1** (L2:2226) |
|
|||
|
|
|
|||
|
|
Lien avec les lignes de scène (établi, même horodatage et même image) :
|
|||
|
|
- F1 par le contrôle des scènes : L2:5226 `CHECKING: …meet_random/meet_new_person.lpscene` puis L2:5227-5238
|
|||
|
|
(`UpdateCheckForScenes` → `CheckConditionsOther` → `CheckEachCondition` → `CalculateString` → `Calculator` →
|
|||
|
|
`ReturnStatIfNeeded`). La ligne OTHER de la scène lit la stat d'un acteur peut-être absent :
|
|||
|
|
`D:\Game\LifePlay-master 5.8\Content\Modules\vin_Base\Scenes\meet_random\meet_new_person.lpscene:5`
|
|||
|
|
(`isWithCompanion() && Random(0, 200) < CurrentCompanion:interpersonal`). Même chose au démarrage d'une scène :
|
|||
|
|
L2:20166 `CHECKING: …family/child_sexual.lpscene` → L2:20167-20178 (`PlayScene` → `CheckConditionsOther` → … → `ReturnStatIfNeeded`).
|
|||
|
|
- F1/F2/F3 par la lecture du script d'une scène lancée : L2:20189-20200 (hors bornes `Person_24` + `getActorVar` sous
|
|||
|
|
`PlayScene` → `ReadSceneLine` → `CallFunction`), L2:20327-20339 (`CallFunc_Array_Get_Item_33` dans `CallFunction`),
|
|||
|
|
L2:20398-20411 (`setActorVar`). Chaque groupe `33, 32, 31, 31, 31, 31` est suivi de quelques dizaines de lignes par
|
|||
|
|
`(test0104) for <n> hours by 0` (ex. L2:20331 → L2:20397 ; L2:20581 → 20647 ; L2:29929 → 29995) : 24 démarrages
|
|||
|
|
d'action « by 0 », presque tous dans la rafale 21:32:09 à 21:32:21.
|
|||
|
|
- F4 : L2:5173-5199 : `CHECKING: …dating/sociable_dating.lpscene` (WHO = `getSpecific(Dating)`,
|
|||
|
|
`...\Scenes\dating\sociable_dating.lpscene:4`) → `Person_C_2147481850 index SPAWN` → avertissement (pile
|
|||
|
|
`UpdateCheckForScenes` → `CheckConditionsWho` → `ReadSceneLine` → `CallFunction` → `GetSpecific` → `LoadPreset` →
|
|||
|
|
`GenerateAndApplyStrings` → `PlayerChangeRace` → `UpdatePlayerMeshWithMorphs`) → `DESTROY… Slot: 1` →
|
|||
|
|
`DestroyDummy was from CheckScenes, WHO unmatched`. 96 SPAWN sur 123 sont suivis à la ligne suivante de F4 (multiligne
|
|||
|
|
`index SPAWN \(test0304\)\r?\n[^\n]*property CallFunc_GetSkeletalMesh_ReturnValue in` → 96).
|
|||
|
|
- F5 : L2:5193 `test0304 DESTROY… index Person_C_2147481850` puis L2:5194-5198 et suivantes : `GetSocketInfoByName`
|
|||
|
|
(Head ×2, pelvis, chestUpper, hip, CenterBrow) à chaque image sur **le même acteur** recyclé. Écart à la fiche :
|
|||
|
|
« Actor cleared and destroyed » n'apparaît qu'une fois (L2:2226) ; le déclencheur réel est la libération
|
|||
|
|
`test0304 DESTROY` du mannequin (acteur gardé en réserve, réutilisé au SPAWN suivant : `Person_C_2147481850` revient
|
|||
|
|
dans la plupart des 123 SPAWN).
|
|||
|
|
|
|||
|
|
Comptage par scène : sans objet au sens strict pour F3, F1 (getActorVar/setActorVar) : le fichier joué par `PlayScene`
|
|||
|
|
n'est pas écrit dans le journal (aucune ligne `lpscene` hors `CHECKING:` et `timed out`, Grep
|
|||
|
|
`GI_C_\d+\] ([^C]|C[^H]).*(lpscene|lpaction|lpquest)` → 17 lignes `timed out` seulement). Normalisation retenue :
|
|||
|
|
par démarrage d'action « by 0 » (F1, F3), par ligne `CHECKING:` (F1, F2, F5), par SPAWN de mannequin CheckScenes (F4).
|
|||
|
|
|
|||
|
|
## 2. Hypothèse testée (une seule)
|
|||
|
|
|
|||
|
|
**H : les cinq familles sont préexistantes au lot STB** — (a) leur fréquence normalisée dans L2 égale celle d'un
|
|||
|
|
journal antérieur à STB, et (b) aucune fonction ni aucun événement de leur pile n'est modifié par CHG-281 à CHG-294.
|
|||
|
|
|
|||
|
|
## 3. Essai et résultat brut
|
|||
|
|
|
|||
|
|
### 3.1 Fonctions modifiées par STB (critère b)
|
|||
|
|
Lecture de JM:1135-1148 (CHG-294 à CHG-281). Graphe GI touché : événements `LoadSettings`, `PopulateRaws`
|
|||
|
|
(CHG-281, JM:1148), `FocusOnMapMarkers` et fonction `clearVariable` (CHG-282, JM:1147), nœuds de lecture
|
|||
|
|
`Clothes4` / `MorphTags` (CHG-283, JM:1146), `clearDaily`, `PlayIdle`, `PlayDaily`, `PerTick` et fonctions
|
|||
|
|
`determinePersonVars`, `clearScenePersons` (CHG-290, JM:1139). Person : `standIdle`, rotation de tête
|
|||
|
|
(`HeadtrackTarget` → `CenterBrow`), `OccupyingFnt` (CHG-284, JM:1145), `assignHome` (CHG-285, JM:1144). Autres :
|
|||
|
|
MainMenu (CHG-286 retiré par CHG-294), StreetMap_Static, Room, SexInterface, garde C++ des marqueurs.
|
|||
|
|
**Aucun** des noms de pile n'y figure : `UpdateCheckForScenes`, `PlayScene`, `CheckConditionsWho`,
|
|||
|
|
`CheckConditionsOther`, `CheckEachCondition`, `CalculateString`, `Calculator`, `ReturnStatIfNeeded`, `ReadSceneLine`,
|
|||
|
|
`CallFunction`, `getActorVar`, `setActorVar`, `GetSpecific`, `getPerson`, `LoadPreset`, `GenerateAndApplyStrings`,
|
|||
|
|
`PlayerChangeRace`, `UpdatePlayerMeshWithMorphs`. Réserve : `ExecuteUbergraph_GI` (EventGraph) est modifié, mais dans
|
|||
|
|
d'autres événements ; pour F4, le câblage de `UpdatePlayerMeshWithMorphs` est identique avant et après STB (§ 3.5).
|
|||
|
|
Point de contact indirect pour F5 : CHG-284 (lecture `CenterBrow` dans l'EventGraph de Person), voir § 3.6.
|
|||
|
|
|
|||
|
|
### 3.2 Tableau des comptes bruts (Grep, mode `count` ; L1 et LU8 avec le motif neutre de format)
|
|||
|
|
Motif F1 neutre (5.5 écrit `…property Person` sans « (real) … in ») : `Accessed None trying to read (\(real\) )?property Person\b`.
|
|||
|
|
F3 en 5.5 : `property CallFunc_Array_Get_Item_(31|32|33|41)\b`. F4 variante GI : multiligne
|
|||
|
|
`property CallFunc_GetSkeletalMesh_ReturnValue( in not an UClass)?\r?\n\s+GI_C [^\n]*\n\s+Function /Game/BPs/GI\.GI_C:ExecuteUbergraph_GI:`.
|
|||
|
|
|
|||
|
|
| Journal (moteur, date) | CHECKING | by 0 | SPAWN | Dummy CheckScenes | F1 | F2 | F3 | F3 `_33` | F4 (GI) | F5 |
|
|||
|
|
|---|---|---|---|---|---|---|---|---|---|---|
|
|||
|
|
| DC4 (5.5, 2026-10-08) | 5 410 | 56 | 76 | 0 | 664 | 1 379 | 395 | 77 | 0 | 10 974 |
|
|||
|
|
| U6-55 (5.5) | 831 | — | 20 | 0 | 3 | 87 | 0 | — | 0 | 2 315 |
|
|||
|
|
| P10-55 (5.5) | 213 | — | 6 | 0 | 1 | 23 | 0 | — | 0 | 1 254 |
|
|||
|
|
| U6-58 (5.8) | 380 | — | 18 | 0 | 2 | 59 | 0 | — | 0 | 2 723 |
|
|||
|
|
| P10-58 (5.8, avant STB) | 1 429 | — | 33 | 57 | 1 | 119 | 0 | — | 10 | 10 388 |
|
|||
|
|
| LU8 (5.8, avant STB) | 374 | 0 | 15 | — | 2 | 39 | 0 | — | 0 | 871 (`STA-T3-DOC.md:60` ; Grep combiné F4+F5+SPAWN = 886) |
|
|||
|
|
| L1 (STB complet) | 2 515 | — | — | — | 152 | 204 | 84 | — | 97 | ≤ 18 226 (Grep combiné F5 + SPAWN + Dummy, non séparé) |
|
|||
|
|
| L2 (STB, CHG-286 retiré) | 2 318 | 24 | 123 | 185 | 270 | 351 | 167 | 33 | 96 | 15 793 |
|
|||
|
|
|
|||
|
|
« — » = non compté (budget). `by 0` = `\(test0104\) for [0-9.]+ hours by 0` ; U58 : DC4 seul (56). Dummy CheckScenes =
|
|||
|
|
`DestroyDummy was from CheckScenes` ; U58 : P10-58 seul (57).
|
|||
|
|
|
|||
|
|
### 3.3 F1 et F2 : `ReturnStatIfNeeded`, `getActorVar`, `setActorVar` (Person / tableau `Person_24…`)
|
|||
|
|
- Mécanisme, lu dans STA-d `GI__ReturnStatIfNeeded.txt` : chaîne `X:stat` coupée sur `:` (`Split`, :409-417) →
|
|||
|
|
`GetVariable(Name = X)` (:140-145) → `Variable.Person[0]` (`K2Node_GetArrayItem_10794`, :156-159) → `Set Person`
|
|||
|
|
(:39-43) → `Person.QueryStat` (:160-168), sans test. Variable jamais affectée → tableau vide → F2 puis F1 ; variable
|
|||
|
|
affectée à une référence nulle → F1 seul (cas L2:5227, sans ligne F2 avant). Chemin sans `:` → `PlayerCharacter`
|
|||
|
|
(:31-53), toujours valide.
|
|||
|
|
- Même signature et même pile en 5.5 avant migration : DC4:13020-13031 (`Accessed None trying to read property Person`,
|
|||
|
|
`ReturnStatIfNeeded:036D`, pile `UpdateCheckForScenes` → `CheckConditionsOther` → … → `ReturnStatIfNeeded`).
|
|||
|
|
- Fréquence normalisée : F1 par démarrage « by 0 » : L2 270 / 24 = **11,3** ; DC4 664 / 56 = **11,9**. Par
|
|||
|
|
`CHECKING:` : L2 0,116 ; DC4 0,123. Les sessions U6/U7/U8 sans démarrage « by 0 » restent à 1-3.
|
|||
|
|
- F2 : présent dans tous les journaux 5.5 et 5.8 (DC4 1 379, U6-55 87, P10-58 119, LU8 39). Plus bas en L2 qu'en DC4
|
|||
|
|
par démarrage (14,6 contre 24,6) : une partie de F2 en DC4 vient de `clearVariable` (DC4:8624-8637, pile
|
|||
|
|
`GeneratePerson` → `clearVariable`), lecture supprimée par CHG-282 (estimé : non décompté par fonction).
|
|||
|
|
|
|||
|
|
### 3.4 F3 : `CallFunc_Array_Get_Item_31/32/33/41` dans `CallFunction`
|
|||
|
|
- Même nœuds, même pile en 5.5 : DC4:31616-31626 (`CallFunc_Array_Get_Item_33`, `CallFunction:ADF7`, pile
|
|||
|
|
`PlayScene` → `ReadSceneLine` → `CallFunction`, précédé du hors bornes `Person_24`) ; `_32` en DC4:31689-31691.
|
|||
|
|
- Fréquence : `_33` par démarrage « by 0 » : L2 33 / 24 = **1,38** ; DC4 77 / 56 = **1,375**. Journaux 5.8 antérieurs
|
|||
|
|
sans démarrage « by 0 » : 0 (aucune ligne F3 dans `etat\U58` hors DC4, ni dans LU8).
|
|||
|
|
- Cause : argument « personne » lu en `Variable.Person[0]` sur une variable d'acteur vide, puis fonction appelée sur None
|
|||
|
|
(estimé : dump de `CallFunction` absent, § 3.7).
|
|||
|
|
|
|||
|
|
### 3.5 F4 : `CallFunc_GetSkeletalMesh_ReturnValue` (GI)
|
|||
|
|
- Nœud : événement `UpdatePlayerMeshWithMorphs` (STB-d `GI__EventGraph.txt:1160-1197`) : `CharacterBeingEdited.Mesh`
|
|||
|
|
(`K2Node_VariableGet_7384`) → `LPMeshCompat::GetSkeletalMesh` (`K2Node_CallFunction_1101`, :29255-29258) →
|
|||
|
|
`MorphTargets` (`K2Node_VariableGet_7134`, :1189-1191) → `ForEachLoop`, sans test. `ULPMeshCompat::GetSkeletalMesh`
|
|||
|
|
rend `Cast<USkeletalMesh>(GetSkinnedAsset())`, donc nullptr sans message quand le composant n'a pas de maillage
|
|||
|
|
(`D:\Game\LifePlay-master 5.8\Source\LifePlay\LPMeshCompat.cpp:9-19`). Correspondance nom compilé
|
|||
|
|
`CallFunc_GetSkeletalMesh_ReturnValue` ↔ nœud `_1101` : estimée (seul `GetSkeletalMesh` vu sur la chaîne de cet événement).
|
|||
|
|
- Câblage identique avant STB : STA-d `GI__EventGraph.txt:1041-1044, 1070-1072, 29148-29151`.
|
|||
|
|
- Avant STB en 5.8 : P10-58:39196-39221, même pile (via `getPerson` au lieu de `GetSpecific`), 10 avertissements pour
|
|||
|
|
10 SPAWN de mannequin CheckScenes (`index SPAWN` suivi de F4 : 10). Les SPAWN de génération (`GeneratePerson`,
|
|||
|
|
`GenerateUnknown`) étaient suivis de `currentMatchRace` (P10-58 : 21 ; LU8 : 15/15), avertissement retiré par CHG-290 ;
|
|||
|
|
ils ne donnent pas F4.
|
|||
|
|
- En 5.5 : aucun SPAWN de mannequin CheckScenes dans les journaux disponibles (`DestroyDummy was from CheckScenes` : 0
|
|||
|
|
dans DC4, U6-55, P10-55) ; les 2 F4 de DC4 sont d'autres nœuds (CharGen `PopulateGenitalSlidersDaz` DC4:7424-7432,
|
|||
|
|
Person `BackupMorphs` DC4:58139-58148). Origine 5.5 ou migration 5.8 : non tranchée.
|
|||
|
|
- Rapport L2 : 96 F4 pour 96 SPAWN suivis immédiatement de F4 ; la hausse 10 → 96 suit le nombre de mannequins
|
|||
|
|
CheckScenes (57 → 185), lui-même lié au parcours (relations du personnage créé).
|
|||
|
|
|
|||
|
|
### 3.6 F5 : « GetSocketInfoByName(...): No SkeletalMesh » (STA-D23)
|
|||
|
|
- Même schéma en 5.5 avant migration : DC4:8821-8828 (`index SPAWN`, `DESTROY… Slot: 1`, puis Head ×2, pelvis,
|
|||
|
|
chestUpper, hip sur le même acteur).
|
|||
|
|
- Par `CHECKING:` : L2 **6,8** ; P10-58 (avant STB) **7,3** ; U6-58 7,2 ; LU8 2,3 ; 5.5 : DC4 2,0, U6-55 2,8, P10-55 5,9.
|
|||
|
|
L2 reste dans la plage 5.8 d'avant STB.
|
|||
|
|
- Part `CenterBrow` (seul socket touché par CHG-284) : L2 3 264 / 15 793 = 20,7 % ; P10-58 6 953 / 10 388 = 66,9 % ;
|
|||
|
|
DC4 2 470 / 10 974 = 22,5 %. Aucune hausse après CHG-284, plutôt une baisse (cohérent avec l'évaluation
|
|||
|
|
conditionnelle qui remplace le `SelectVector`, JM:1145 ; estimé : la part dépend aussi du parcours).
|
|||
|
|
- Lecteur par image (tête, bassin, poitrine, hanche, sourcils) non identifié : EventGraph de Person ou AnimBP (point à confirmer).
|
|||
|
|
|
|||
|
|
### 3.7 Dumps
|
|||
|
|
Présents : `ReturnStatIfNeeded` (STA-d), EventGraph GI avant / après STB (`UpdateCheckForScenes`, `PlayScene`,
|
|||
|
|
`UpdatePlayerMeshWithMorphs`), EventGraph de Person (STB-d). **Dump requis** (non produit, copie gelée), tailles lues
|
|||
|
|
dans STA-d `GI__graphes.txt` : `CallFunction` (1 538 nœuds, :50), `getActorVar` (15, :262), `setActorVar` (32, :263),
|
|||
|
|
`LoadPreset` (109, :20), `CheckConditionsWho` (32, :42), `ReadSceneLine` (105, :49), `GenerateAndApplyStrings`
|
|||
|
|
(391, :27) ; ainsi que `GetSpecific`, `getPerson`, `PlayerChangeRace`, `CheckConditionsOther`, `Calculator` (taille non relevée).
|
|||
|
|
|
|||
|
|
## 4. Verdict : confirmée (F1, F2, F3, F5) ; confirmée vis-à-vis de STB, indécise 5.5 / 5.8 pour F4
|
|||
|
|
|
|||
|
|
| Famille | Cause | Origine | Correctif proposé (non appliqué) | Effort |
|
|||
|
|
|---|---|---|---|---|
|
|||
|
|
| F1 `Person` dans `ReturnStatIfNeeded` / `getActorVar` / `setActorVar` | stat ou variable lue sur un acteur de scène vide ou nul (`X:stat`, ex. `meet_new_person.lpscene:5`), sans test avant `QueryStat` | **préexistante** (5.5 : DC4:13020-13031 ; 11,3 contre 11,9 par démarrage) | `ReturnStatIfNeeded` : `IsValidIndex(Variable.Person, 0)` puis `IsValid(Person)` entre `GetVariable` (`K2Node_CallFunction_81822`) et `QueryStat` (`K2Node_CallFunction_7798`) ; sinon `Float = 0.0` (valeur rendue aujourd'hui). Même garde dans `getActorVar` (valeur par défaut) et `setActorVar` (écriture sautée) | S (≈ 5 nœuds par fonction, schéma de CHG-282) ; dumps get/set requis |
|
|||
|
|
| F2 hors bornes `Person_24…` | même lecture `Person[0]` sur tableau vide | **préexistante** (DC4 1 379, P10-58 119, LU8 39) ; baisse partielle due à CHG-282 (estimé) | couvert par F1 et F3 (même lecture) | — |
|
|||
|
|
| F3 `CallFunc_Array_Get_Item_31/32/33/41` | 4 lectures `Variable.Person[0]` passées comme cible dans `CallFunction`, fonction appelée sur None | **préexistante** (DC4:31616-31626 ; `_33` 1,38 contre 1,375 par démarrage) | aide C++ `GetPersonAtOrNone` (modèle `GetStringAtOrEmpty`, CHG-283) pour la lecture, plus `IsValid` avant chaque appel ; ou abstention si l'on juge le cas normal (contenu de module, piège 5) | M (1 538 nœuds ; dump requis pour situer les 4 cas) |
|
|||
|
|
| F4 `CallFunc_GetSkeletalMesh_ReturnValue` | `UpdatePlayerMeshWithMorphs` lit `MorphTargets` du maillage du mannequin recyclé, sans maillage au moment de `LoadPreset` | **préexistante au lot STB** (P10-58:39196-39221, 1 par SPAWN CheckScenes) ; **indécise** 5.5 / 5.8 (chemin absent des journaux 5.5) | garde `IsValid(GetSkeletalMesh)` avant le `ForEachLoop` (`_1101` → `_7134`) ; cause amont (ordre maillage / changement de race) à instruire (§ 5) | S (garde) ; M (cause) |
|
|||
|
|
| F5 « No SkeletalMesh » | mannequin libéré (`DESTROY`) gardé en réserve sans maillage, toujours interrogé par image (5-6 sockets) | **préexistante** (DC4:8821-8828 ; 6,8 par CHECKING contre 7,3 avant STB) ; STA-D23 | désactiver tick / animation du mannequin au `DESTROY` et réactiver au SPAWN, ou garde dans les lecteurs de sockets ; abstention conseillée tant qu'aucun effet visible (STA-D23, `STA-T3-DOC.md:60`) | M (lecteur à identifier) |
|
|||
|
|
|
|||
|
|
Effet visible estimé (non vérifié en jeu) : F1, F2, F3 : stat lue à 0 et appel sauté, donc la branche de condition est
|
|||
|
|
fausse et la ligne de script ne fait rien ; cohérent avec un acteur absent, aucun effet visible attendu. F4 : sans effet
|
|||
|
|
pour un mannequin détruit aussitôt (`WHO unmatched`) ; **incertain** pour un mannequin gardé pour la scène
|
|||
|
|
(P10-58:40222 → 40350, détruit plus tard par `DestroyPerson`) : morphs peut-être non appliqués au chargement. F5 :
|
|||
|
|
acteur sans maillage, donc invisible ; coût = volume du journal (51 % de L2) et appels par image.
|
|||
|
|
|
|||
|
|
Origine STB : aucune famille ne l'est. Les hausses de L2 par rapport à LU8 suivent les dénominateurs (démarrages
|
|||
|
|
« by 0 » 0 → 24, mannequins CheckScenes 0 → 185, CHECKING 374 → 2 318), pas un changement de taux.
|
|||
|
|
|
|||
|
|
Établi / estimé / incertain :
|
|||
|
|
- **Établi** : comptes du § 3.2 (Grep rejouables) ; piles identiques en 5.5 (DC4) pour F1, F3, F5 et en 5.8 avant STB
|
|||
|
|
(P10-58) pour F4 ; mécanisme de `ReturnStatIfNeeded` (dump STA) et de `UpdatePlayerMeshWithMorphs` (dumps STA et STB) ;
|
|||
|
|
aucune fonction de pile citée par CHG-281 à 294.
|
|||
|
|
- **Estimé** : taux comparés (même parcours non garanti) ; rôle de `CallFunction` (sans dump) ; nœud `_1101` ;
|
|||
|
|
effet partiel de CHG-282 sur F2 ; effet visible.
|
|||
|
|
- **Incertain** : fichier joué par `PlayScene` avant chaque démarrage « by 0 » ; origine 5.5 ou 5.8 de F4 ; lecteur de
|
|||
|
|
sockets de F5 ; morphs d'un mannequin gardé (F4).
|
|||
|
|
|
|||
|
|
## 5. Hypothèse suivante proposée, et à quel niveau
|
|||
|
|
|
|||
|
|
- **H2 (F4, N3, lp-cart)** : le maillage du mannequin recyclé est vidé au `DESTROY` et `LoadPreset` →
|
|||
|
|
`GenerateAndApplyStrings` → `PlayerChangeRace` déclenche `UpdatePlayerMeshWithMorphs` avant la réaffectation du corps.
|
|||
|
|
Essai : dumps `LoadPreset`, `GenerateAndApplyStrings`, `PlayerChangeRace`, `GetSpecific` (copie dégelée), puis
|
|||
|
|
contre-épreuve 5.5 sur une partie ayant des relations (mannequins CheckScenes) pour trancher 5.5 / 5.8.
|
|||
|
|
- **H3 (F1/F3, N2, lp-cart)** : identifier la scène jouée par `PlayScene` avant chaque démarrage « by 0 » (dumps
|
|||
|
|
`PlayScene` dans l'EventGraph STB-d, `CallFunction`, `getActorVar`, `setActorVar`) pour dire si l'acteur vide est
|
|||
|
|
normal (contenu) ou un défaut de moteur.
|
|||
|
|
- **H4 (F5, N2)** : identifier le lecteur par image des sockets (EventGraph Person STB-d, AnimBP à dumper).
|
|||
|
|
|
|||
|
|
## Constats
|
|||
|
|
|
|||
|
|
### Contre-épreuve U8 (parcours à rejouer par l'utilisateur, archive avant STB)
|
|||
|
|
Archive : `D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\` (même moteur 5.8, sans CHG-281 à 294).
|
|||
|
|
1. Copier d'abord `...\Saved\Logs\LifePlay.log` (contre-épreuve de 22:35) à part : le prochain lancement le renomme.
|
|||
|
|
2. Lancer `LifePlay.exe` de l'archive U8 ; **Nouvelle partie** avec l'éditeur de personnage, valider.
|
|||
|
|
3. En ville, enchaîner **au moins 20 actions seul** de plusieurs heures (but : ≥ 20 lignes `for … hours by 0`).
|
|||
|
|
4. Laisser tourner la ville **au moins 3 minutes** sans menu (but : ≥ 1 000 lignes `CHECKING:` et des mannequins
|
|||
|
|
`DestroyDummy was from CheckScenes`, qui demandent un personnage avec relations : celui de la nouvelle partie).
|
|||
|
|
5. Obtenir une scène `meet_couple` puis une scène à deux, comme en STB-JEU2.
|
|||
|
|
6. Quitter par le menu ; copier le `LifePlay.log` produit.
|
|||
|
|
Mesure (pwsh 7, depuis `D:\Game\LifePlay-master 5.8`) : `& .\Tools\LogStats.ps1 -Compare <journal U8 neuf>,<L2>`, puis
|
|||
|
|
les motifs Grep du § 3.2 sur les deux journaux.
|
|||
|
|
Décision : taux U8 ≈ L2 (± 50 %) pour F1 / « by 0 » (≈ 11), F3 `_33` / « by 0 » (≈ 1,4), F4 / SPAWN CheckScenes (≈ 1),
|
|||
|
|
F5 / CHECKING (≈ 7) → préexistence confirmée sur le même parcours ; famille absente de U8 avec dénominateur non nul →
|
|||
|
|
attribuer à STB et rouvrir.
|
|||
|
|
|
|||
|
|
### État de reprise par famille
|
|||
|
|
F1, F2, F3, F5 : origine tranchée, correctifs proposés, dumps get/set/CallFunction à produire avant toute SPEC.
|
|||
|
|
F4 : origine STB tranchée, origine 5.5 / 5.8 ouverte (H2). Aucune décision prise : choix des correctifs et de
|
|||
|
|
l'abstention (contenu de module) à l'utilisateur.
|