LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-ORG-AUDIT.md

339 lines
76 KiB
Markdown
Raw Normal View History

Fiche STE-ORG — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-sonnet-5-5 — Agent lp-cart — Skills sk-protocol (préchargés avec l'agent : ue-cpp-build, lp-commandlets, lp-paths)
# STE-ORG-AUDIT : bonus d'orgasme des scènes de sexe (2026-10-13, version 3 : build de l'auteur lu)
Hors gabarit : les sections suivent la rubrique 7 de la fiche (§ 1 à 5) et les ajouts de l'orchestrateur (chaîne maillon par maillon en tête du § 4 ; points 5 à 8 au § 6, notés P5 à P8 ; captures en jeu et build de l'auteur au § 4.4). Correspondance avec le gabarit CART : 1 objet = § 0 ; 2 commandes = § 7 ; 3 constats = § 1 à 4 et 6 ; 4 établi / estimé / incertain = colonne « Niveau » et § 8 ; 5 points à confirmer = § 5 ; 6 questions = Q# du § 5. Lecture seule : aucun éditeur, MCP, commandlet, build ni jeu ; l'exécutable de l'auteur n'a pas été lancé ; aucun fichier du projet modifié hormis ce livrable. **Deux refus du crochet** (§ 7, points 12 et 17), tous deux causés par un `>` dans mes propres commandes ; après le second, arrêt des lectures (rubrique 9) : ce qui n'a pas été lu est en § 5. **Budget dépassé** : 63 tours pour 60 (demandes successives de l'orchestrateur), sous le plafond de 70.
## Sigles de fichiers (tous sous `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\` sauf mention)
| Sigle | Fichier | Contenu |
|---|---|---|
| P-STG | `ST\STG\dumps\Person__EventGraph.txt` | dump `LPDumpFunction` de l'EventGraph de Person, copie de travail du 2026-10-13 (après STG/CAM) |
| P-STA | `ST\STA\dumps\Person__EventGraph.txt` | idem, 2026-10-09 (avant STG/CAM, état de HEAD) |
| GI-P2 | `ST\STE\dumps\GI__EventGraph_P2.txt` | EventGraph de GI, dernier dump STE |
| GI-PASA | `ST\STA\dumps\GI__PlayAppropriateSexAnimation.txt` | fonction `PlayAppropriateSexAnimation` de GI (2026-10-09) |
| PC-STE | `ST\STE\dumps\PC__EventGraph.txt` | EventGraph de PC (menu d'actions) |
| L6f-P / L6f-G | `portage55\L6f\L6f_dump_Person.txt` / `L6f_dump_GI.txt` | dumps 5.5 de tous les graphes (2026-09-30, avant le passage en 5.8) |
| BUILD-A | `D:\XxX\LifePlay_2023_04_Stable_64bit` | build compilé de l'auteur, version 2023.04 Stable (lecture seule) |
Les numéros de ligne sont ceux du fichier cité. Les dumps de PC, de P-STA et de GI-PASA portent le préfixe `LogLPDump: Warning:` sur chaque ligne (la numérotation reste celle du fichier).
## 0. Objet et périmètre (CART 1)
Un domaine : le **bonus d'orgasme** des scènes de sexe et la chaîne qui y mène : jauge → seuils 90 et 100 → orgasme → bonus. Demande de l'utilisateur relayée par Big Boss (2026-10-13) : dans la dernière version compilée de Vinfamy, chaque personne qui avait un orgasme recevait un bonus ; il ne l'a jamais vu dans les sources livrées. Précisions : entre 90 et 100 une option permet d'éjaculer sur le partenaire, à 100 l'orgasme est automatique. **Trois captures en jeu** de l'utilisateur, prises dans la dernière version compilée de l'auteur (référence attendue, non nos sources) : texte rouge « Close to cumming… », actions « Cum on Face / Tits / Belly / Feet (new) », texte vert « Pick bonus reward for last person who came », grille 4 × 4 d'objets, puis, après l'orgasme, deux lignes de résultat « prone_to_orgasm -1.1 » et « fitness +1.1 » (descriptions de l'orchestrateur, capture 1 relue à l'image). Le build de l'auteur a été indiqué par l'utilisateur : `D:\XxX\LifePlay_2023_04_Stable_64bit`.
Hors périmètre (non lu) : le corps de `ModifyStat`, le graphe du widget `SexAction`, le graphe du widget `Cursor`, les nœuds désactivés au niveau du nœud (voir § 5).
## 1. Ce que fait le bonus dans nos sources (`GiveOrgasmReward`)
`GiveOrgasmReward` n'est **pas une fonction** : c'est un **événement personnalisé de l'EventGraph de Person** (P-STG:16059-16061, `K2Node_CustomEvent_87`). Il s'exécute sur la personne qui jouit (`self` implicite : P-STG:16073, 16082). Déroulé, établi par lecture de P-STG :
1. `OrgasmIrBoost()` (appel P-STG:19074-19077, `K2Node_CallFunction_1005`, branché sur `then` de l'événement, P-STG:16061). Corps (événement P-STG:19071-19073) : `ForEachLoop` sur `RacesFucking` (P-STG:19078-19087) → `ModifyStat(Stat = 'likes_' + élément, Change = 0.25, DifficultyAdjusted = false, NoDisplay = true)` (P-STG:19088-19101). Effet : +0,25 d'affinité pour chaque race partenaire, silencieux. Les stats `likes_<race>` n'existent que dans le module Interracial (`Content\Modules\vin_Interracial\stats\likes_arab|asian|black|indian|latin|white.lpstat`), et `GI::GetRacesFucking` commence par `IsModEnabled('vin_Interracial')` (L6f-G:49420-49427) : le « Ir » de `OrgasmIrBoost` est le module Interracial (estimé).
2. `IfThenElse_101` sur `isPlayer` (P-STG:16062-16069) :
- joueur : `ModifyStat(mood, +20, DifficultyAdjusted = true, NoDisplay = false)` (P-STG:16070-16078) ;
- sinon, `IfThenElse_102` (P-STG:16102-16106) si `SexPersons` contient `PlayerCharacter` (P-STG:16094-16101) : `ModifyStat(attractiontoplayer, Change, DifficultyAdjusted = true, NoDisplay = false)` (P-STG:16079-16087) avec Change = 3 × (2 si `CurrentTags` contient « Vaginal » ET `WantsBabies` contient `Prefix + SaveSlot`, sinon 1), soit +6 ou +3 (P-STG:17453-17462, 17463-17485, 17486-17496) ;
- sinon (PNJ sans le joueur dans la scène) : rien (`else (vide)`, P-STG:16106).
3. Bénéficiaire : la seule personne dont l'événement `Cum` s'exécute (celui qui jouit). Le partenaire n'a un bonus que s'il jouit lui aussi. **Aucun nœud de `GiveOrgasmReward` ne crée de widget ni ne propose un choix** (les 6 nœuds atteints depuis l'événement 87 sont les deux `ModifyStat`, les deux `IfThenElse`, l'appel `OrgasmIrBoost` et l'événement lui-même). **Aucune écriture de `prone_to_orgasm` ni de `fitness`** dans cette chaîne : dans Person, ces deux stats ne sont que **lues** (`QueryStat`, P-STG:16755-16763 pour `prone_to_orgasm`, 15825-15833 pour `fitness`).
4. Conditions : aucune condition sur `prone_to_orgasm`, le compteur ou un maintien de bouton. `prone_to_orgasm` règle la **vitesse de la jauge**, pas le bonus (L6f-P:16378, 16680-16690 ; `prone_to_orgasm.lpstat:2`). `Sex_OrgasmCounts` divise le gain de jauge suivant (L6f-P:16533-16555). La chaîne « Hold still for orgasm boost » n'apparaît dans **aucun** dump (le dumper n'imprime que `Pin->DefaultValue`, pas `DefaultTextValue` : `Source\LifePlayEditorTools\LPDumpFunctionCommandlet.cpp:57-59`) ; elle est dans `Person.uasset` (octets 10105696 et 13816200) et, d'après la lecture du build, dans `Person.uexp` de l'auteur ; propriétaire inconnu (§ 5, L3).
5. Autre gain, indépendant de l'orgasme : à la fin de l'acte, `GI::EndSex` applique à chaque participant `arousal -50` puis `mood +50` (GI-P2:7803-7811 et 9829-9837 ; atteints depuis `EndSex` GI-P2:6787, 53 nœuds).
6. Ce que dit l'auteur de ce bonus : le journal des versions de BUILD-A (`Docs\Change_Logs.txt:1017`) décrit « chaque fois que vous amenez votre partenaire à l'orgasme, il gagne de l'attirance pour vous ; chaque fois que vous jouissez, vous gagnez de l'humeur », et `:962` un bonus pour les positions vaginales et les créampies avec quelqu'un qui veut un bébé. C'est exactement `GiveOrgasmReward` (mood joueur, attirance partenaire, facteur ×2 « Vaginal + WantsBabies ») : **c'est le bonus ancien et automatique**, présent chez nous.
## 2. Appelants et coupures
Chemin jusqu'à l'événement, établi (nœuds et liens lus ; vérifié par un parcours d'exécution automatique, script `execwalk.py` du scratchpad de session, v3, qui retrouve les 10 nœuds que la lecture manuelle donnait pour l'événement `Cum` de Person) :
- **Un seul appel** de `GiveOrgasmReward` : `K2Node_CallFunction_722` (P-STG:16107-16110). Son `execute` vient de `PlayCumParticle` (P-STG:16751-16754) ← `Sex_Orgasm := 0.0` (P-STG:17282-17287) ← macro `IncrementInt` de `Sex_OrgasmCounts` (P-STG:16118-16125) ← `PersonCumming := self` (P-STG:17592-17597) ← événement **`Cum`** de Person (P-STG:15920-15922). Son `then` va à `SetText(CumText)` (P-STG:15980-15984) puis au `Switch` sur l'indice de la personne (P-STG:15936-15941) → `GI::Cum` (P-STG:15958-15973). Parcours d'exécution depuis `Cum` : « 10 noeuds atteints sur 3702 » (722 compris).
- **Appelants de l'événement `Cum` de Person** :
a) **Orgasme automatique** : `IfThenElse_99` teste `Sex_Orgasm == 100.0` (P-STG:16030-16039) → `Cum()` (P-STG:16040-16043), dans la suite de `UpdateOeChange` : `updateOrgasmChange` (P-STG:15853) → `updateEnergyChange` (15858) → `Sex_Orgasm := FClamp(Sex_Orgasm + Sex_Orgasm_Change, 0, 100)` (15873-15878, 15896-15901) → `Sex_Energy` (15890-15907) → `TogglePulloutNotification()` (P-STG:17315-17318) → `IfThenElse_99` (P-STG:17317, 16036). `UpdateOeChange` est appelé pour **chaque personne de `SexPersons`** par le temporisateur de GI (GI-P2:27422-27438 ; `K2_SetTimerDelegate` en boucle, période `SexDurationMult`, GI-P2:27474-27487).
b) **Animation balisée `Finish`** : `GI::PlayAppropriateSexAnimation` teste `Array_Contains(Tags, 'Finish')` (GI-PASA:348-357) → `Person_C::Cum()` sur `Persons[0]` (GI-PASA:358-361 et 87-90). Même câblage dans le dump 5.5 (L6f-G:25212-25220).
- **Appelant de `OrgasmIrBoost`** : `GiveOrgasmReward` seulement (P-STG:19074). Aucun autre BP ne porte les trois noms `GiveOrgasmReward`, `OrgasmIrBoost`, `TogglePulloutNotification` : `grep -a -o` sur les 100 `.uasset` de `Content\BPs` et `Content\UI` → seul `BPs/Person.uasset : 6` (3 noms × 2).
- **Chemin qui contourne le bonus** : le bouton de fin d'acte (animation `Endsex`, « Finish having sex », PC-STE:2483, 2670-2671) appelle `GI::cum` (pile du journal, `STE-H3f-DIAG.md:30-32`), l'événement `Cum` de **GI** (GI-P2:10803-10809). Parcours depuis cet événement : « 22 noeuds atteints sur 6247 » (`StopDirtyTalkAndDescription`, `DirtyTalkEnd`, `DescriptionEnd`, `PC::StopUpdateSpeed`, temporisateur 10 s, `PlayWorldCameraShake`, `SexInterface::ShowCumming`, `Person::CumOn`, `CumSound`, `AfterCumSpeed`, `CheckConceived`, `EndSex`) : **ni `Person::Cum`, ni `GiveOrgasmReward`, ni `ModifyStat`, ni widget de choix**. Preuve en jeu : `PersonCumming` vaut `None` dans `AfterCumSpeed` après un clic sur `Endsex` (`STE-H3f-DIAG.md:28-32`, F2) ; même pile en 4.27 (`STE-H3f-DIAG.md:74`).
- **Branche constante** : dans GI, `IfThenElse_182` a `Condition = 'true'` (broche non reliée) et choisit le **nouveau modèle** (`StartUpdateOeForSexPersons`, GI-P2:27565-27573) contre l'**ancien modèle `ToCum`** (`else` → minuteur `UpdateToCum`, GI-P2:6964-6971, 7129-7210). Même littéral en 5.5 (L6f-G:71954-71956). L'ancien modèle ne démarre plus (P5). Ce n'est pas une coupure du bonus.
- **Nœud orphelin** : `IfThenElse_184` a `execute (vide)` (GI-P2:27530-27534) : sans effet sur le bonus.
- **Nœud désactivé** : aucun `ENodeEnabledState::Disabled` dans Person, GI, PC, Room, SexAction (`grep -a -o` = 0, § 7) ; `DevelopmentOnly` présent une fois chacun (nœud inconnu, sans doute un `PrintString`, ex. GI-P2:10857-10867). Le dumper ne dit pas quel nœud (§ 5, L2).
- **Variable jamais vraie / retour anticipé** : aucun dans la chaîne lue. `FClamp(…, 0, 100)` rend exactement 100.0 (P-STG:15896-15901) : le test `== 100.0` est atteignable.
- Séparation HEAD / copie de travail : 11 motifs de la chaîne sur 12 tombent aux **mêmes lignes** dans P-STA (état de HEAD) et P-STG (11323, 11735, 11752, 14554, 16033, 16107, 16505, 16507, 17366, 17524, 18424 ; seul `OrgasmIrBoost` passe de 19080 à 19074). Les modifications non commitées de `Person.uasset` (STG/CAM) ne touchent donc pas la chaîne (estimé : comparaison sur les lignes de correspondance). Le blob de HEAD ne contient aucun `ENodeEnabledState::Disabled`.
## 3. 4.27, 5.5, modules et build de l'auteur
Recherche des textes exacts des maillons des captures par `grep -a -l -F` (un `-o` pour le build de l'auteur) dans `BPs`, `UI`, `Structs` de chaque arbre ; `Content\Modules` par Grep. « — » = aucun fichier.
| Texte | Copie de travail 5.8 | Copie 4.27 (2026-09-07) | Sources d'origine 2024 | Build 4.27 cuit `LifePlay_Build_2026.9` | **BUILD-A (auteur, 2023.04 Stable)** |
|---|---|---|---|---|---|
| « Close to cumming » | `UI/SexInterface.uasset` | idem | idem | `UI/SexInterface.uexp` | `UI/SexInterface.uexp` (2) |
| « Cum on Face / Tits / Belly / Feet » | `BPs/GI.uasset` (les 4) | idem | **—** | `BPs/GI.uexp` | `BPs/GI.uexp` (3 / 2 / 2 / 3) |
| « Encourage my partner to lead » | `BPs/PC.uasset` | idem | **—** | `BPs/PC.uexp` | `BPs/PC.uexp` (1) |
| « Sabotage condom » | `BPs/PC.uasset` | idem | `BPs/PC.uasset` | `BPs/PC.uexp` | `BPs/PC.uexp` (1) |
| « Hold any mouse button to rotate camera » | `UI/SexInterface.uasset` | idem | idem | `UI/SexInterface.uexp` | non cherché |
| « Hold still for orgasm boost » | `BPs/Person.uasset` (2) | idem (2) | **—** | non cherché | `BPs/Person.uexp` (1) |
| `GiveOrgasmReward`, `OrgasmIrBoost`, `TogglePulloutNotification` | `BPs/Person.uasset` | idem | **—** | `BPs/Person.uasset` (1 chacun) | `BPs/Person.uasset` (1 chacun) |
| **« Pick bonus reward » et « last person who came »** | **—** | **—** | **—** | **—** | **`UI/Cursor.uexp` (2 et 2)** |
- Modules : `Grep` de `cum on (face|tits|belly|feet)|\(new\)` sur `Content\Modules` de la copie 5.8 → **0** ; sur `D:\XxX\LifePlay_2023_04_Stable_64bit\LifePlay\Content\Modules` de l'auteur, `Cum on Face|Pick bonus reward|Close to cumming|Cum on Tits` → **0**. Ces textes ne sont donc **pas** dans les modules texte, ni chez l'auteur ni chez nous ; ils sont dans les assets (`GI`, `PC`, `SexInterface`, `Cursor`). `Mods\` de la copie 5.8 est vide. Le suffixe « (new) » est **fabriqué par le code de GI** (`InSuffix = ' (new)'` GI-P2:20457 ; tests `Substring ' (new)'` GI-P2:29863, `'(new)'` 29891 ; mêmes nœuds en 5.5 : L6f-G:66226, 71172, 72139), pas par un module.
- Sources d'origine 2024 : `Person.uasset` (14 675 874 o, 2024-08-27) sans aucun des noms `GiveOrgasmReward`, `OrgasmIrBoost`, « Hold still… », `TogglePulloutNotification`. Copie 4.27 (19 799 322 o, 2026-09-07), builds cuits 2026.9 et `Development_427`, commit L0 `1122e17`, HEAD, tags `v1.0` à `v1.5`, `ue5.5-final`, build 5.5 `Shipping_V1.5` : `GiveOrgasmReward` présent (1 ; 2 pour HEAD et la copie de travail, sérialisation 5.8). Dump 5.5 (L6f, 2026-09-30) : même câblage qu'en 5.8 (`Cum` L6f-P:37118-37120, `IfThenElse_99` 37233-37237, `Cum()` 37238-37241, événement 37257-37259, `mood` 37268-37276, `attractiontoplayer` 37277-37285, appel 722 37305-37308, `PlayCumParticle` 37958-37961, `OrgasmIrBoost` 40298-40304). Coupure de portage (U5, L6, L7) : aucune sur la chaîne lue (estimé : nœuds de la chaîne comparés).
- **Build de l'auteur BUILD-A** (lecture seule, exécutable non lancé) : version « 2023.04 Stable » (`Docs\Change_Logs.txt:1`) ; moteur **UE 4.20** (`++UE4+Release-4.20` dans `LifePlay\Binaries\Win64\LifePlay-Win64-Shipping.exe`, 48 952 832 o, 2023-05-04 13:36 ; `LifePlay.exe` 304 128 o, 2023-05-04 13:35) ; **aucun `.pak`** (`find … -iname "*.pak"` sur 6 niveaux : rien) : les assets cuits sont en fichiers `.uasset` / `.uexp` listés dans `Manifest_UFSFiles_Win64.txt` (1 895 791 o ; ex. `LifePlay/Content/BPs/GI.uasset|.uexp`, `Person`, `PC`, `UI/SexAction`, `SexInterface`, `SexOrgasmEnergy`, daté 2023-05-04T11:33Z) ; dossiers `Content` : `BPs`, `Heavy`, `Modules`, `Movies`, `Render`, `Saves`, `Scenes`, `Structs`, `UI`. Non chiffré : les chaînes ASCII sont lisibles par `grep -a` (§ 7, point 15). Rien d'autre que nos propres builds n'a été trouvé sous `D:\Game` hors `Backup` et `LifePlay_Build_5.8_*` : `D:\Game\DC4\LifePlay-master` (nos sources 5.5), `LifePlay_Build_5.5_*` (nos builds, avec `.pak`, non fouillés), `LifePlay_Publication\stage_game_v1_4|v1_5|v2_0` (nos archives Revival).
- **Journal des versions de BUILD-A** (texte clair, `Docs\Change_Logs.txt`) : version 5.26 (`:36-39`) : « chaque fois qu'il y a un orgasme pendant une scène adulte, cliquez n'importe où et vous avez une chance de choisir parmi 5 récompenses bonus, qui changent sensiblement une stat de la personne (rendements décroissants) ; sauf quelques-unes, les stats possibles dépendent des tags de la position qui a mené à l'orgasme » ; version 5.27 (`:34`) : ajout dans Esc > Settings de l'option « Disable Bonus Orgas[m] Rewards », « le plus gros changement du système de scènes adultes de la version précédente », ajoutée à cause de plantages autour des orgasmes. Anciennes versions : `:992` (animations « cum on face, tits, back… »), `:1014-1019` (barres d'énergie et d'orgasme séparées, attirance du partenaire et humeur du joueur à l'orgasme), `:962` (bonus vaginal / créampie).
Lecture (estimé) : nos sources contiennent le bonus automatique ancien (`GiveOrgasmReward`), les actions « Cum on … » (absentes des sources d'origine 2024, présentes dès la copie 4.27), le message à 90, mais **pas** la grille « Pick bonus reward » de la version 5.26 de l'auteur. Nos sources sont donc **antérieures à la version 5.26** de l'auteur (le fait établi : un texte du widget `Cursor` du build de l'auteur manque dans les quatre arbres ; la version exacte de nos sources n'est pas lue, § 5 L13). Ce que prouve la présence d'un nom dans un `.uasset` : un symbole déclaré ; l'appel est prouvé au § 2.
## 4. Verdict et correction estimée
### 4.1 La chaîne des captures, maillon par maillon (sources HEAD 5.8, 5.5, 4.27, modules)
| # | Maillon (capture) | État dans nos sources | Preuve | Niveau |
|---|---|---|---|---|
| 1 | Jauge ≥ 90 et texte rouge « Close to cumming, keep going to 100 to cum in place, or click anywhere to select where to cum » | **présent et relié** | Seuil 90 : constante `GreaterEqual(Sex_Orgasm, 90.0)` P-STG:17363-17367 → `TextBlock_0` de `SexInterface` `Visible` (P-STG:17413-17428) ; chaîne dans `UI/SexInterface.uasset` des 4 arbres (§ 3) ; garde : première personne, homme ou « Penis », filtre MF, MM, FF + « Shemale » (P-STG:17334-17339, 17371-17401). Même seuil dans PC (PC-STE:6128-6142) | établi (lecture) ; couleur rouge et affichage réel non vus |
| 2 | Actions « Cum on Face / Tits / Belly / Feet (new) » (menu filtré sur « Cum ») | **présent**, câblage non lu | Textes dans `BPs/GI.uasset` (5.8, 4.27) ; `(new)` ajouté par le code de GI (GI-P2:20457, 29863, 29891) ; animations `Finish` proposées seulement si `Sex_Orgasm >= 90` (PC-STE:6075-6132) et exclues du tirage aléatoire (GI-P2:27885-27898) ; clic → `Persons[0].Cum()` (GI-PASA:343-361) | établi pour les textes et la logique de filtre ; la liaison texte « Cum on … » ↔ animation `Finish` n'est pas lue (FText invisible au dumper, § 5 L12) |
| 3 | Orgasme automatique à 100 | **présent et relié** | `Sex_Orgasm == 100.0` → `Cum()` (P-STG:16030-16043), pour chaque personne (GI-P2:27422-27438, 27474-27487) ; même câblage en 5.5 (L6f-P:37233-37241) | établi (lecture) |
| 3b | Événement `Cum` → `GiveOrgasmReward` (mood +20 / attirance +3 ou +6 / `likes_<race>` +0,25) | **présent et relié** (bonus **ancien, automatique**) | P-STG:15920-15922, 16107-16110, 16059-16106, 19071-19101 | établi (graphe) ; effet en jeu non mesuré |
| 4 | Grille « Pick bonus reward for last person who came » (4 × 4 objets, titre = nom de la personne) | **ABSENT** | 0 fichier dans les 4 arbres (§ 3) ; présent dans `UI/Cursor.uexp` de BUILD-A (2 occurrences) et décrit par `Change_Logs.txt:39` (version 5.26) ; aucun widget de choix dans `GiveOrgasmReward` (P-STG:16059-16110) ni dans `GI::Cum` (parcours 22 nœuds) | établi pour l'absence dans nos copies et la présence chez l'auteur |
| 5 | Application du bonus choisi (« prone_to_orgasm -1.1 », « fitness +1.1 ») | **ABSENT** | Aucune écriture de `prone_to_orgasm` ni `fitness` dans la chaîne orgasme : seules des lectures `QueryStat` (P-STG:16755-16763, 15825-15833) ; les deux lignes de la capture sont l'affichage d'un `ModifyStat` non silencieux (estimé, vu `GiveOrgasmReward` qui affiche `mood` de la même façon) | établi pour l'absence ; valeurs des objets : inconnues (§ 5, L12) |
| 6 | Chemin `Endsex` → `GI::cum` | **présent mais coupé** de `Person::Cum` | GI-P2:10803-10809 + parcours 22 nœuds ; `STE-H3f-DIAG.md:28-32` | établi (graphe et pile) |
**Premier maillon qui manque dans l'ordre de la chaîne : le maillon 4** (la grille), suivi du 5. Les maillons 1, 2, 3 et 3b existent et sont reliés (le 2 : câblage texte ↔ animation non lu). **Premier maillon coupé : le maillon 6**, pour le seul bouton de fin d'acte.
### 4.2 Verdict
- **Bonus ancien et automatique (`GiveOrgasmReward`) : ACTIF** dans les sources 5.8 (HEAD et copie de travail), 5.5 et 4.27 (noms), par lecture statique des dumps, **non vérifié en jeu** ; absent sur le chemin `Endsex` ; partenaire sans bonus sur le chemin `Finish`.
- **Bonus à choisir dans la grille (captures) : ABSENT des sources, à reconstruire.** Il appartient à la version 5.26 de l'auteur (`Change_Logs.txt:39`), que nos sources n'ont pas : le texte est dans `UI/Cursor.uexp` de BUILD-A et dans aucun de nos quatre arbres. Ce n'est donc ni « présent mais non affiché » ni « coupé » : c'est une fonctionnalité **postérieure** à nos sources. Le premier maillon manquant est celui de la grille (maillon 4).
- **Écart avec le souvenir de l'utilisateur** : il se souvient d'un bonus reçu par chaque personne qui jouit. Dans la version de l'auteur ce bonus est **à choisir** (clic n'importe où après l'orgasme, 5 récompenses, effet de ±1 sur une stat, rendements décroissants, désactivable par une option de la version 5.27), alors que dans nos sources il est **automatique et mineur** (humeur du joueur, attirance du partenaire, affinités raciales silencieuses). Il n'a jamais vu le choix dans nos builds parce qu'il n'existe pas dans nos sources.
### 4.3 Correction estimée (non écrite ; aucune modification des scènes de sexe avant la release, correction après l'alpha)
- Chaîne 100 et `Finish` : aucune correction.
- **Bonus sur `Endsex`** (si l'utilisateur le veut) : appeler `Person::GiveOrgasmReward` (ou `Person::Cum`) depuis le gestionnaire de clic du widget `SexAction` pour la branche `Endsex`, avant `GI::cum` ; 1 à 3 nœuds dans `SexAction.uasset`. Risque : double bonus après une animation `Finish` ; `PersonCumming` serait enfin renseigné (corrige F2 de H3f). À décider après lecture de `SexAction` (L1).
- **Reconstruction de la grille (maillons 4 et 5)** — estimation grossière (estimé ; aucune lecture du graphe de l'auteur, ses assets sont cuits en UE 4.20 et ne s'ouvrent pas dans l'éditeur 4.27 / 5.x) :
1. dans `Cursor` (ou un nouveau widget) : texte vert, titre = nom de la personne, grille 4 × 4 de cases cliquables avec icônes d'objets (les icônes de la capture ressemblent à des objets de bondage / d'inventaire : `Content\UI\Bondage.uasset`, `Inventory` non lus ; textures à confirmer) ;
2. un appel depuis `Person::Cum` juste après `GiveOrgasmReward` (P-STG:16107-16110) pour la personne qui jouit (joueur seulement ?), qui passe les tags de la position (`CurrentTags`) ;
3. une fonction de tirage des stats candidates selon les tags (« quelques-unes » fixes, le reste dépend des tags), 5 récompenses proposées, un `ModifyStat(stat, ±~1,1, NoDisplay = false)` à l'application, une atténuation selon le nombre d'orgasmes (`Sex_OrgasmCounts` existe déjà, P-STG:16118-16125) ;
4. une option « Disable Bonus Orgasm Rewards » dans les réglages (menu, sauvegarde du réglage) ;
5. gestion de la pause / du clic « n'importe où » du menu d'actions (`PC`).
Taille L (un widget, quelques dizaines de nœuds, données de récompenses, réglage, icônes) ; risque élevé (interface de scène de sexe, état de jeu en pause, sauvegarde, plantages signalés par l'auteur autour des orgasmes, `Change_Logs.txt:34`) ; à planifier après l'alpha, après les réponses Q1, Q2 et la lecture L9, L12. Source de logique la plus sûre : les identifiants et les textes de `UI/Cursor` et de `BPs/GI` du build de l'auteur (noms de fonctions et de variables lisibles dans la table de noms du `.uasset`), à comparer à nos `Cursor.uasset` / `GI.uasset` (L9).
### 4.4 Captures en jeu (images lues, chemins non recopiés)
- Capture 1 (lue à l'image) : menu de gauche « Encourage my partner to lead », « Switch camera », « Swap roles », « Sabotage condom », « Make out (new) » ; texte vert « Pick bonus reward for last person who came » ; grille 4 × 4 d'icônes d'objets avec le titre « John Smith » ; jauges en haut à droite (Lauren V : 22.2 (−0.16) et 0 (−0.31) ; John Smith : 49.9 (−0.07) et 11.4 (+0.66)) ; aide en bas avec des mentions « (NEW) » sur la caméra. Les jauges sont très probablement l'énergie et l'orgasme du widget `SexOrgasmEnergy` (blocs `energy_change`, `orgasm_change` : `ST\LISIB\LISIB-T1-inventaire.md:126-127` ; mise à jour `SexOrgasmEnergy_C::UpdateData()` GI-P2:27467, 27613) ; la valeur négative est la baisse naturelle (`prone_to_orgasm.lpstat:2`).
- Captures 2 et 3 (descriptions de l'orchestrateur, non relues) : avant l'orgasme, jauge de John à 95.4 (+1.12), texte rouge « Close to cumming… », menu filtré sur « Cum » (« Cum on Face / Tits / Belly / Feet (new) »), grille déjà affichée ; après l'orgasme, jauge de John à 0, dialogue d'après l'orgasme, lignes « prone_to_orgasm -1.1 » et « fitness +1.1 ». Ces deux lignes correspondent à l'application du bonus choisi (maillon 5).
- Les mentions « (NEW) » de l'aide ne prouvent pas un build plus récent que nos sources pour toutes les fonctions : « Sabotage condom » et « Close to cumming » sont dans les sources d'origine 2024 ; « Encourage my partner to lead » et « Cum on … » sont dans la copie 4.27 mais pas dans l'origine 2024 (§ 3). Seule la grille « Pick bonus reward » manque à tous nos arbres.
## 5. Lectures manquantes, ce qu'elles trancheraient, questions
| # | Lecture manquante (commande ou appel, non lancée) | Ce qu'elle trancherait |
|---|---|---|
| L1 | `.\Tools\RunCommandlet.ps1 -Lot STE-ORG -Commandlet LPDumpFunction -Args '-BP=SexAction -Fn=EventGraph -Pins -Exec' -EtatDir 'D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE'` (éditeur fermé : `.\Tools\UeState.ps1 -Kind Editeur`) | Ce que le clic sur chaque bouton appelle (`Endsex` seul → `GI::cum` ? une animation `Finish` ?) ; confirme les maillons 2 et 6 côté widget |
| L2 | MCP `get_node_infos` sur `K2Node_CallFunction_722`, `1005`, `717`, `853`, `K2Node_IfThenElse_99` de Person (`EnabledState`) | Le dumper n'imprime pas l'état d'activation. Indice : aucun `Disabled` dans les tables de noms ; reste `DevelopmentOnly` (nœuds inconnus, ne joue qu'en Shipping) |
| L3 | MCP `get_node_infos` sur les `K2Node_FormatText` / `SetText` de Person (`DefaultTextValue`) | Propriétaire de « Hold still for orgasm boost » (présent aussi chez l'auteur) |
| L4 | Dump 4.27 de l'EventGraph de Person (commande de `etat\portage55\L5-diag\`, non relue ici) | Câblage 4.27 des maillons 3 et 3b |
| L5 | Essai en jeu (Development) : scène MF avec le joueur jusqu'à 100 ; `.\Tools\LogStats.ps1 -Latest <journal> -Pattern 'mood','attractiontoplayer'` | Effet réel du bonus ancien ; vitesse de la jauge |
| L6 | Corps de `ModifyStat` (5.8 ; 5.5 : L6f-P:561-1689) pour `mood`, `attractiontoplayer`, `likes_*`, `fitness`, `prone_to_orgasm` | Aucun garde-fou ne neutralise l'effet ; comportement d'un `ModifyStat` non silencieux (lignes « stat ±n ») |
| L7 | `LPDumpFunction -BP=GI -Fn=GetRacesFucking` ; écrivain de `Person.RacesFucking` | `OrgasmIrBoost` boucle-t-il sur une liste remplie ? |
| L8 | Où le script résout `toCum` dans les conditions de texte (0 occurrence dans 9 dumps GI lus) | Si les textes `toCum > 70/90` sont encore atteints (P5) |
| L9 | Comparer les identifiants de `UI/Cursor.uasset` du build de l'auteur à ceux de la copie 5.8 (sans caractère de redirection dans la commande) : `export LC_ALL=C; B="D:/XxX/LifePlay_2023_04_Stable_64bit/LifePlay/Content"; O="D:/Game/LifePlay-master 5.8/Content"; ext() { grep -a -o -E "[A-Za-z_][A-Za-z0-9_]{5,}" "$1" \| sort -u; }; { ext "$B/UI/Cursor.uasset"; ext "$O/UI/Cursor.uasset"; ext "$O/UI/Cursor.uasset"; } \| sort \| uniq -c \| awk '$1==1 {print $2}'` (les identifiants vus une seule fois sont ceux du build seul) ; idem pour `BPs/GI.uasset` et `BPs/Person.uasset` ; phrases du widget : `grep -a -o -E "[A-Za-z][A-Za-z0-9 .,'!?%+-]{7,}" "$B/UI/Cursor.uexp" \| sort -u` | Fonctions, variables et textes que l'auteur a ajoutés pour la grille et l'application du bonus : **base de la reconstruction** (liste des récompenses, noms de stats) |
| L10 | Chercher dans `GI.uexp`, `Person.uexp`, `Cursor.uexp` du build de l'auteur les noms de stats (`fitness`, `prone_to_orgasm`, autres) et les valeurs (« 1.1 », atténuation) | Ce que vaut chaque objet de la grille (stat et valeur) : non établi à ce jour |
| L11 | `grep -rlaF "Bonus Orgas" "<racine>/BPs" "<racine>/UI"` sur la copie 5.8, la copie 4.27 et le build de l'auteur (`<racine>` = `Content`) | Si l'option « Disable Bonus Orgasm Rewards » (version 5.27) existe chez nous (attendu : non) |
| L12 | Lire dans `GI.uasset` le graphe qui porte « Cum on Face / Tits / Belly / Feet » (dumper `LPDumpFunction` sur la fonction concernée de GI, textes FText ; ou MCP `get_node_infos`) | Si les quatre actions sont reliées au menu et à `Persons[0].Cum()` (maillon 2) |
| L13 | Lire la première ligne de `D:\Game\LifePlay_Backup_5.5\ARCH427\LifePlay-master\Docs\Change_Logs.txt` (s'il existe) et de nos `Docs` | Version exacte de nos sources (attendu : antérieure à 5.26) |
Questions :
- **Q1** (utilisateur) : le choix d'objet de la capture est-il bien le bonus qu'il attend ? Veut-il l'option « Disable Bonus Orgasm Rewards » ? Veut-il en plus un bonus sur `Endsex` et pour le partenaire ?
- **Q2** (utilisateur / orchestrateur) : reconstruire la grille à partir des seules chaînes et noms du build de l'auteur (sans son graphe), ou obtenir de l'auteur les sources de la version 5.26 et suivantes (licence : `Licenses\Vinfamy_License.txt`) ?
- **Q3** (orchestrateur) : L1, L2, L9 à L13 relèvent de CAM (MCP) ou d'une lecture simple : qui les lance, et avant la release ou après l'alpha ?
- **Q4** (orchestrateur) : l'ancien modèle `ToCum` (branche `else` de `IfThenElse_182`) est-il à garder ? Il alimente encore les textes de module (P5).
- **Q5** (résolue) : version du build des captures = 2023.04 Stable, UE 4.20 (`D:\XxX\LifePlay_2023_04_Stable_64bit`).
## 6. Points P5 à P8 de l'orchestrateur
| Point | État | Preuve | Niveau |
|---|---|---|---|
| **P5. Où sont lus les seuils 90 et 100 ?** | | | |
| 90, côté Person | présent, **constante de graphe** `GreaterEqual(Sex_Orgasm, 90.0)` | P-STG:17363-17367 | établi |
| 90, côté PC | présent, constante de graphe, sur `SexPersons[0]` | PC-STE:6128-6142 | établi |
| 100, côté Person | présent, constantes `== 100.0` et `FClamp(…, 100)` | P-STG:16030-16034, 15896-15907 | établi |
| 100, ancien modèle | `ToCum >= 100` (GI-P2:7206-7210) et `ToCum < 100` (PC-STE:1372-1376) : constantes | | établi (lecture) |
| Variable ou fichier de module pour 90 / 100 | **absent** : aucun `.lpscene`, `.lpaction`, `.lpai`, `.lpstat` ne lit `toCum` ; seuls `vin_Base\DirtyTalks\1.lptalk` (12) et `vin_Base\Descriptions\1.lpdesc` (20) l'emploient, en texte (« toCum > 70 », « > 90 ») ; `Docs\Modding\FullGuides\Writing_Sex_Text.txt:57, 66` ; `Grep toCum` sur `Content\Modules` = 32 occurrences dans ces 2 fichiers | établi |
| Texte de module `toCum` | **probablement coupé** : `ToCum` n'est incrémenté que par l'ancien minuteur `UpdateToCum` (GI-P2:7129, 7155-7167, 7189-7193), démarré par la seule branche `else` de `IfThenElse_182` (GI-P2:6964-6971), dont `Condition = 'true'` (GI-P2:27565-27569) ; les autres écritures le remettent à 0 (GI-P2:7180-7183, 10848-10851, 27838-27841) | estimé ; résolution du nom `toCum` non retrouvée (L8) |
| **P6. Qu'est-ce qui fait apparaître l'option d'éjaculation ?** | | | |
| Message rouge | présent : `TextBlock_0` de `SexInterface` visible à ≥ 90 (P-STG:17424-17428) ; texte dans `UI\SexInterface.uasset` (« Close to cumming, keep going to 100 to cum in place, or click anywhere to select where to cum ») | | établi (visibilité et chaîne) ; lien `TextBlock_0` ↔ chaîne estimé |
| Choix du lieu | présent : le menu d'actions de PC ne propose les animations `Finish` que si `Sex_Orgasm >= 90` (PC-STE:6075-6132) ; exclues du tirage aléatoire (GI-P2:27885-27898) ; textes « Cum on Face / Tits / Belly / Feet » dans `GI.uasset` | | établi (lecture) ; liaison texte ↔ animation non lue (L12) |
| Source | **BP** (SexInterface, PC, GI) ; ni bouton dédié ni module (Grep modules = 0, chez nous et chez l'auteur) ; `Finish` = tag d'animation (origine non lue) | | établi pour le BP |
| Boutons voisins | « Pull out <my> penis » (`Pulloutpenis`, PC-STE:1223-1237), « Promise / Ask to pull out » (PC-STE:5526-5532), `Endsex` (PC-STE:2483) | | établi |
| **P7. Orgasme automatique à 100** | présent : `Sex_Orgasm == 100.0` → `Cum()` dans la suite de `UpdateOeChange`, pour chaque personne | P-STG:16030-16043 ; GI-P2:27474-27487 | établi |
| **P8. Lien avec `GiveOrgasmReward`** | présent pour P7 et pour l'animation `Finish` (`Persons[0]`) ; **coupé** pour `Endsex` ; **absent** pour le partenaire sur le chemin `Finish` ; **aucun lien** entre `GiveOrgasmReward` et la grille (la grille n'existe pas chez nous) | § 2 ; P-STG:16107-16110 ; GI-PASA:358-361 | établi |
## 7. Commandes et lectures, comptes bruts (CART 2)
Outils : Read, Grep (tool) et Bash en lecture seule. Le Grep (tool) saute les dossiers ignorés par git : les dumps (`etat\ST\*\dumps`) ont été lus par **chemin de fichier** ou par `grep -r` en Bash (écart signalé ; piège déjà noté par `STE-H3f-DIAG.md:149`).
1. Noms dans les `.uasset` (`grep -a -c`, lignes) : Person : `GiveOrgasmReward` 2, `OrgasmIrBoost` 2, `Hold still for orgasm boost` 2, `updateOrgasmChange` 8, `prone_to_orgasm` 8, `Sex_OrgasmCounts` 1, `OldOrgasmBar` 1, `T_EnergyOrgasm` 1, `SexOrgasmEnergy` 0, `SexInterface` 3, `PersonCumming` 1, `AfterCumSpeed` 0. GI : `GiveOrgasmReward` 0, `OrgasmIrBoost` 0, `updateOrgasmChange` 1, `Sex_OrgasmCounts` 1, `T_EnergyOrgasm` 1, `SexOrgasmEnergy` 2, `SexInterface` 3, `PersonCumming` 1, `AfterCumSpeed` 2. Room : 12 noms à 0.
2. `for f in BPs/*.uasset UI/*.uasset; do grep -a -o -E 'GiveOrgasmReward|OrgasmIrBoost|TogglePulloutNotification' $f | wc -l` (100 fichiers) → `BPs/Person.uasset : 6`, aucun autre.
3. `ENodeEnabledState` (Person / GI / PC / Room / SexAction) → `ENodeEnabledState` 2, `::Disabled` 0, `::DevelopmentOnly` 1 chacun ; `UI/SexInterface`, `SexOrgasmEnergy`, `SexQuicks`, `SexLight` : 0 / 0 / 0 ; `git show HEAD:Content/BPs/Person.uasset | grep -a -o 'ENodeEnabledState::[A-Za-z]*' | sort | uniq -c` → `1 ENodeEnabledState::DevelopmentOnly`.
4. 4.27 : `LifePlay-master 4.27` → `size=19799322 GiveOrgasmReward=1 OrgasmIrBoost=1 HoldStill=2 TogglePullout=1 Disabled=0` ; `LifePlay-master` (origine) → `size=14675874 GiveOrgasmReward=0 OrgasmIrBoost=0 HoldStill=0 TogglePullout=0 Disabled=0` ; builds cuits → `GiveOrgasmReward=1 OrgasmIrBoost=1 TogglePullout=1 updateOrgasmChange=1 Sex_OrgasmCounts=1` (Person), `GiveOrgasmReward=0` (GI). Dates : 2026-09-07 14:38 (copie 4.27), 2024-08-27 03:33 (origine).
5. Git (lecture) : `git show <rév>:Content/BPs/Person.uasset | grep -a -o 'GiveOrgasmReward' | wc -l` → `1122e17 : 1`, `HEAD : 2`, `v1.0` à `v1.5` : 1 chacun, `ue5.5-final` : 1 ; copie de travail : 2 ; build 5.5 `Shipping_V1.5` : 1.
6. Parcours d'exécution (script du scratchpad, `execwalk.py` v3, à ranger dans `Tools\` si on le garde) : Person `Cum` → « 10 noeuds atteints sur 3702 » ; GI `Cum` → « 22 noeuds atteints sur 6247 » ; GI `EndSex` (`--delegates`) → « 53 noeuds atteints sur 6247 ». Contrôle : la v3 retrouve les 10 nœuds lus à la main. Les v1 et v2 (sans les entrées de macro) donnaient 2 puis 14 nœuds : écartées.
7. `grep -r -i -c 'orgasm|…' --include=*.txt` sur `etat` : `ST/STG/dumps/Person__EventGraph.txt:52`, `ST/STA/dumps/Person__EventGraph.txt:50`, `portage55/L6f/L6f_dump_Person.txt:74`, `portage55/L6f/L6f_dump_GI.txt:12`. `tocum` (insensible à la casse) : 0 dans `GI__getActorVar`, `CheckConditionsOther`, `CheckConditionsWho`, `Calculator`, `ReadSceneLine`, `GenerateAndApplyStrings`, `GetSpecific`, `GI__PlayAppropriateSexAnimation`, `GI__GetVariable_P2`.
8. Chaîne de l'interface : `LC_ALL=C grep -a -o -E "[A-Za-z][A-Za-z0-9!.,'? -]{14,}" Content/UI/SexInterface.uasset | sort -u` → ligne « Close to cumming, keep going to 100 to cum in place, or click anywhere to select where to cum ».
9. Modules (copie 5.8) : `orgasm` (insensible) → « Found 73 total occurrences across 41 files » ; `toCum` → 32 dans 2 fichiers ; `reward|boost|hold still|GiveOrgasm|OrgasmIr` → 79 dans 51 fichiers (non relues ligne à ligne : noms comme `gym_reward_cms`, `fantasy_stat_bonus`) ; `cum on (face|tits|belly|feet)|\(new\)` → 0 ; `Grep orgasm` sur `Source` → 0 ; `EnabledState|…` sur `Source\LifePlayEditorTools` → 0.
10. Journaux de jeu : `grep -rIi -c -E "orgasm|Hold still" --include=*.log` sur `COMMUN-2/essais`, `COMMUN-3/essais`, `COMMUN-4/essais`, `STE-H3e-J` → **sortie vide** (un seul `.log` listé dans `COMMUN-2\essais`). Zéro résultat : échec probable de la recherche, pas preuve d'absence ; aucun journal de jeu ne documente donc l'effet du bonus.
11. « Pick bonus reward » : `grep -rlaF "Pick bonus reward"` sur `Content/BPs|UI|Structs|Scenes|Developers` (5.8), `git grep -a -c -F` sur HEAD, `grep -rlaiE "bonus ?reward|BonusReward|PickBonus|RewardPick|ChooseReward"`, puis `BPs` et `UI` de la copie 4.27, de l'origine 2024 et du build cuit 2026.9 → **sorties vides**. Les textes ASCII voisins sont retrouvés par la même technique (point 13), donc l'absence est très probablement réelle (une chaîne UTF-16 ou fragmentée ne serait pas vue ; non testé).
12. **Refus n° 1 du crochet** : commande de comparaison de chaînes (boucle `grep -rlaF … 2>/dev/null | sed | tr`). Message : « PreToolUse:Bash hook error: [python -I "%USERPROFILE%/.claude/hooks/ecriture-gardien.py"]: Refus du crochet ecriture-gardien. Agent : lp-cart Ecriture: redirection vers ' Cet agent n'a pas de droit d'ecriture (sk-protocol § 7) … Chemins libres : etat/, Saved/Logs/portage/, Saved/<lot>/, le dossier temporaire. ». Cause : mon `2>/dev/null`. Commande refaite **sans** redirection (point 13).
13. Comparaison des textes (`LC_ALL=C grep -rlaF "<texte>" "<racine>/BPs" "<racine>/UI" "<racine>/Structs"`, 10 textes × 4 arbres) : voir le tableau du § 3 (sortie complète conservée dans ce tableau).
14. Disque : `find "D:/Game" -maxdepth 6 ( -path … -prune ) -o ( -iname "*.pak" -o -iname "LifePlay*.exe" -o -iname "*vinfamy*" -o -iname "*.utoc" ) -print` (en excluant `Launcher`, `LifePlay_Backup_5.5`, `LifePlay_Build_5.8_*`, la copie 5.8, la copie 5.5, l'addon, `LifePlay_ModulesGit`) → `.exe` / `.pak` / `.utoc` des seuls dossiers `LifePlay_Build_5.5_*` (DC4, DebugGame, Development, Shipping_AP7, Shipping_V1.5, V1.5_essai-U8T6), `DC4\LifePlay-master\Binaries\Win64\LifePlay.exe`, `LifePlay_Publication\stage_game_v1_4|v1_5|v2_0\…\LifePlay.exe`, et les fichiers `Vinfamy_License.txt` / `12_Reconciliation_Vinfamy.md` : **tous issus de nos sources** ; aucun build de l'auteur sous `D:\Game` (hors `Backup`, non fouillé) ; l'utilisateur a donné `D:\XxX\LifePlay_2023_04_Stable_64bit`.
15. BUILD-A : `find "$B" -maxdepth 6 ( -iname "*.pak" -o -iname "*.exe" -o -iname "*.utoc" -o -iname "*.ucas" … ) -printf '%p %s o %TY-%Tm-%Td %TH:%TM'` → `LifePlay/Binaries/Win64/LifePlay-Win64-Shipping.exe 48952832 o 2023-05-04 13:36`, `LifePlay.exe 304128 o 2023-05-04 13:35`, `Manifest_UFSFiles_Win64.txt 1895791 o`, `Engine/Extras/Redist/en-us/UE4PrereqSetup_x64.exe` ; **aucun `.pak`, `.utoc`, `.ucas`** ; `grep -a -o -m1 -E "\+\+UE[45]\+Release-[0-9]+\.[0-9]+"` sur le Shipping → `++UE4+Release-4.20`. Comptes (`grep -rao -F -e … "$B/LifePlay/Content/BPs|UI|Structs" | sort | uniq -c`) : `BPs/GI.uasset:Sex_OrgasmCounts` 1, `UpdateOeChange` 1, `updateOrgasmChange` 1 ; `BPs/GI.uexp:Cum on Belly` 2, `Cum on Face` 3, `Cum on Feet` 3, `Cum on Tits` 2 ; `BPs/PC.uexp:Encourage my partner to lead` 1, `Sabotage condom` 1 ; `BPs/Person.uasset:GiveOrgasmReward` 1, `OrgasmIrBoost` 1, `Sex_OrgasmCounts` 1, `TogglePulloutNotification` 1, `UpdateOeChange` 1, `updateOrgasmChange` 1 ; `BPs/Person.uexp:Hold still for orgasm boost` 1 ; `UI/Cursor.uexp:Pick bonus reward` 2, `UI/Cursor.uexp:last person who came` 2 ; `UI/SexInterface.uexp:Close to cumming` 2. `Grep` (tool) `reward|bonus|orgasm|cum on|pick|energy` sur `Docs` de BUILD-A → `Change_Logs.txt:34, 39, 962, 992, 1014-1019` (lus au § 3). Lecture de `Change_Logs.txt` lignes 1-46 : `Version 2023.04 Stable:` (l. 1), `Version 5.27:` (l. 25), `Version 5.26:` (l. 36). `Grep` des quatre textes sur `…\LifePlay\Content\Modules` de BUILD-A → 0.
16. Lecture de la capture 1 (Read de l'image) : voir § 4.4.
17. **Refus n° 2 du crochet** : commande de comparaison des identifiants de `Cursor` (3 pipelines `ext()` avec un `echo` contenant `>=6`). Message : « … Refus du crochet ecriture-gardien. Agent : lp-cart Ecriture: redirection vers =6 … ». Cause : un `>` dans le texte de l'`echo` (mon erreur, encore). Aucun contournement ; **lectures arrêtées** ; la commande corrigée est en L9. Les deux autres appels du même tour (lecture de `Change_Logs.txt`, Grep des modules de BUILD-A) ont abouti.
## 8. Établi / estimé / incertain (CART 4)
- **Établi** : existence, câblage et appelants de la chaîne 1, 2 (logique de filtre), 3, 3b en 5.8 (copie de travail et HEAD) et 5.5 ; chemin `Endsex` sans `Person::Cum` ; seuils 90 et 100 en constantes de graphe ; aucun module n'appelle un bonus d'orgasme ni ne porte les textes « Cum on … » ; « Pick bonus reward » et « last person who came » présents dans `UI/Cursor.uexp` de BUILD-A et absents des quatre arbres de nos sources ; BUILD-A = version 2023.04 Stable, UE 4.20, sans `.pak`, non chiffré ; le journal de BUILD-A décrit la grille (version 5.26) et l'option de désactivation (5.27).
- **Estimé** : « Ir » = Interracial ; ancien modèle `ToCum` inactif donc `toCum` des textes de module figé ; absence d'impact de STG/CAM sur la chaîne ; nos sources antérieures à la version 5.26 de l'auteur ; lignes « prone_to_orgasm -1.1 » / « fitness +1.1 » = affichage de `ModifyStat` ; plan et taille de la reconstruction.
- **Incertain** : effet réel en jeu du bonus ancien ; état d'activation par nœud (`DevelopmentOnly`) ; gestionnaire de clic de `SexAction` ; câblage des textes « Cum on … » ; propriétaire de « Hold still… » ; câblage 4.27 ; remplissage de `RacesFucking` ; résolution de `toCum` ; valeurs des objets de la grille et liste des 5 récompenses ; existence chez nous de l'option « Disable Bonus Orgasm Rewards » ; version exacte de nos sources ; textes éventuellement en UTF-16.
Tours : 63 / 60 (écriture de cette version et remise du compte rendu comprises ; budget porté de 50 à 60 par l'orchestrateur, dépassé de 3 tours pour traiter les demandes successives sur la capture et le build de l'auteur ; plafond 70 respecté)
## Constats
- **F-ORG1** : les conditions de texte `toCum > 70` / `> 90` des DirtyTalks et Descriptions de `vin_Base` dépendent d'un compteur que le nouveau modèle ne met plus à jour (estimé, § 6 P5). À confirmer par L8.
- **F-ORG2** : `GI::EndSex` donne `mood +50` et `arousal -50` à chaque participant sans lien avec l'orgasme (GI-P2:7803-7811, 9829-9837).
- **F-ORG3** : `TogglePulloutNotification` exclut le filtre `FM` et ne vise que la personne d'indice 0 (P-STG:17334-17339, 17371-17401) : le message à 90 n'apparaît pas pour une femme d'indice 0.
- **F-ORG4** : le dumper `LPDumpFunction` n'imprime ni `EnabledState`, ni `DefaultTextValue`, ni `NodeComment` (`LPDumpFunctionCommandlet.cpp:57-59`) : tout FText (formats, messages, libellés « Cum on … ») est invisible dans les dumps.
- **F-ORG5** : le build de l'auteur est un build **UE 4.20 cuit sans `.pak`** : ses textes ASCII se lisent par `grep -a` dans les `.uexp`, ses noms dans les `.uasset` ; aucun outil d'extraction n'est nécessaire pour comparer les chaînes, mais ses graphes ne s'ouvrent pas dans nos éditeurs.
- Fichiers modifiés par cette fiche : le présent livrable seulement (écrit trois fois : versions 1, 2, puis celle-ci ; le script de lecture est resté dans le scratchpad de session).
- Fichiers à commiter : `A D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\STE-ORG-AUDIT.md` (dépôt du jeu, branche `ue5.8` ; `.md` suivi sous `etat/`).
## Décision de l'utilisateur (2026-10-13, session STE)
- Bonus à choisir v5.26 (grille « Pick bonus reward ») : **lectures seulement** ; documenter le comportement du build de l'auteur (5 bonus, stats, valeurs, option « Disable Bonus Orgasm Rewards ») ; la reconstruction sera décidée plus tard.
- Vérifié par l'orchestrateur : `Docs\Change_Logs.txt` du build de l'auteur, section « Version 5.26 » (grille de 5 bonus à chaque orgasme, rendement décroissant).
## 9. Bonus v5.26 du build de l'auteur (reprise, tentative 2, 2026-10-13)
Fiche STE-ORG, reprise tentative 2 — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-sonnet-5-5 — Agent lp-cart — Skills sk-protocol (préchargés avec l'agent : ue-cpp-build, lp-commandlets, lp-paths)
Périmètre : lectures **L9, L10, L11, L13** (GO de Big Boss), hors éditeur, en lecture seule ; **L1, L2, L12 non faites** (elles attendent le jeton UE). Outils : Read, Grep, Glob ; Bash en lecture seule (`grep -a`, `od`, `awk`, `comm`, `ls`, `find`) pour les binaires ; l'exécutable de l'auteur n'a pas été lancé ; aucun script écrit ; aucun fichier du projet modifié hormis ce livrable. **Écart à la fiche** : cet agent n'a pas Edit ; l'ajout est fait par un Write complet dont la première partie (lignes 1 à 181) est recopiée à l'identique (contrôle par `diff` avec une copie d'avant, § 9.10). **Deux refus du crochet** (§ 9.9, points 9 et 10), aucune commande exécutée dans les deux cas : (1) un Python en ligne, choix d'outil de ma part, non contourné (pas de script Python, ni en ligne ni en fichier ; la même lecture a été faite avec `od` et `awk`, outils de lecture seule) ; (2) un `>` dans mon propre filtre `grep -v` lors du contrôle du livrable (erreur de ma part, le même piège que les refus n° 1 et 2 de la tentative 1) ; commande refaite sans ce caractère.
Sigles : B = `D:\XxX\LifePlay_2023_04_Stable_64bit\LifePlay\Content` (BUILD-A) ; O = `D:\Game\LifePlay-master 5.8\Content` ; A4 = `D:\Game\LifePlay_Backup_5.5\ARCH427\LifePlay-master 4.27\Content` ; AO = `D:\Game\LifePlay_Backup_5.5\ARCH427\LifePlay-master\Content` (origine). Les nombres après un nom de fichier `.uexp` ou `.uasset` sont des **offsets d'octets** (`grep -a -b -o`, `od -A d`), pas des lignes.
### 9.1 Résumé
- **Mécanisme** (établi pour les noms, les appels et les constantes, estimé pour le filtre) : dans le build, l'événement `GiveOrgasmReward` de Person appelle `GI.Cursor.PopulateBonusRewards(self, …)` (Person.uexp:21246, appel unique par l'opcode d'appel virtuel). Cette fonction du widget `Cursor` mélange les clés d'une table `statTags` de **20 entrées** (stat, signe, tags de position), en garde 10, les filtre, calcule pour chacune une valeur qui **baisse quand la stat est haute**, et crée des boutons `BonusReward` de texte « stat ±valeur » (9.4 à 9.6).
- **Les « 5 bonus » ne sont pas une liste fixe** : c'est un tirage parmi 20 clés, selon les tags de la position (`CurrentTags`). La liste des 20 est en 9.4. Le nombre 5 vient du journal de l'auteur (`Change_Logs.txt:39`) ; je ne l'ai pas retrouvé comme constante (incertain, 9.11).
- **Valeur** (établi pour les constantes et l'enchaînement des fonctions) : `signe × ceil((2,0 − MapRangeClamped(|x|, 0, 100, 0, 1,9)) × 10) / 10`, avec x = valeur actuelle de la stat (`QueryStat`). 2,0 pour une stat à 0, 1,1 pour une stat vers 50 (accord avec « fitness +1.1 » et « prone_to_orgasm -1.1 » des captures), environ 0,1 à 0,2 pour une stat à 100.
- **Option 5.27** : variable `DisableBonus` (`GameSettings`, `GI`), case « Disable Bonus Orgasm Rewards » ; **absente chez nous** (0 fichier sur 3 arbres pour le libellé, 0 occurrence du nom dans 6 assets).
- **Version de nos sources** : assets déclarés « LifePlay 5.9 Full Source », documents restés en v3.6 ; aucun élément de la v5.16 ni des suivantes (9.8).
- Rien n'est reconstruit (décision de l'utilisateur : lectures seulement).
### 9.2 Où vit le bonus v5.26 dans BUILD-A (L9)
| Fichier (sous B) | Preuve | Chez nous |
|---|---|---|
| `UI\BonusReward.uasset` (11 463 o) et `UI\BonusReward.uexp` (7 163 o), 2023-05-04 | widget d'une récompense : noms `RewardButton`, `RewardText`, `Stat`, `Change`, `ModifyStat`, `Person_C`, `ui_positive` ; format de texte `{stat} {sign}{change}` ; texte par défaut `masochist +0.5` (9.9 point 3) | absent des trois arbres (9.9 point 2) |
| `UI\Cursor.uasset` et `UI\Cursor.uexp` | noms absents de chez nous : `PopulateBonusRewards`, `BonusRewardBox`, `ScrollBonuses`, `BonusReward_C`, `statTags`, `statTags_Value`, `countBR`, `lastCum`, `isPlayer`, `DisableBonus`, `K2Node_CustomEvent_Person`, `K2Node_CustomEvent_Tags`, `Tags_15_F32CD59B4662D8135A8FA0886F319DF5`, `CallFunc_Map_Keys_Keys`, `CallFunc_Map_Find_Value`, `CallFunc_Overlaps_Overlap`, `CallFunc_IsInterestedIn_Interested`, `CallFunc_QueryStat_Value`, `CallFunc_QueryStat_Bonus`, `CallFunc_Abs_ReturnValue`, `CallFunc_MapRangeClamped_ReturnValue`, `CallFunc_FCeil_ReturnValue`, `CallFunc_EndsWith_ReturnValue`, `CallFunc_Split_LeftS`, `CallFunc_Split_RightS` ; texte « Pick bonus reward for last person who came » (Cursor.uexp:121497 et 126277) | 216 identifiants du build seul, 411 de chez nous seuls, 422 communs (9.9 point 5) ; aucun nom `Bonus*` ni `Reward*` chez nous |
| `BPs\Person.uasset` et `BPs\Person.uexp` | noms du build seul : `PopulateBonusRewards`, `DisableBonus` (+ `CallFunc_QueryStat_Bonus1` à `22`, sans lien) ; appel en Person.uexp:21246 | 1 942 identifiants du build seul, 1 344 de chez nous seuls, 2 302 communs |
| `BPs\GI.uasset` | noms du build seul : `DisableBonus` (+ `CallFunc_QueryStat_Bonus1` à `7`, `Default__SexOrgasmEnergy_C`) ; les propriétés `Cursor` et `CurrentTags` de GI sont lues par Person (9.3) | 3 173 / 4 888 / 5 499 |
| `BPs\GameSettings.uasset`, `UI\MainMenu.uasset`, `UI\SettingCheckbox.uasset` | nom `DisableBonus` (1 occurrence chacun) | 0 |
Le diff des identifiants de GI et de Person est un diff de **tables de noms** (build cuit contre assets non cuits) : les gros écarts de nombre ne veulent rien dire en eux-mêmes ; seuls les mots-clés `Bonus|Reward|Orgasm|Cum|Disable|lastCum|statTags` ont été lus pour GI et Person (le diff complet n'a pas été lu).
### 9.3 Appel dans le build (Person.uexp) : établi pour les jetons, estimé pour le sens des branches
Jetons relevés dans `B\BPs\Person.uexp` entre les offsets 20400 et 21900 (sortie brute en 9.9 point 8) : 21111 `JumpIfNot` (cible 413) ; 21130 lecture de `DisableBonus` (propriété importée de `GI_C`, import −99 de `Person.uasset`) ; 21135 appel `OrgasmIrBoost` ; 21145 `JumpIfNot` ; 21155 appel `ModifyStat` avec la chaîne `mood` (21164) et la constante 20,0 (`1e 00 00 a0 41`) ; 21213 lecture de `CurrentTags` (import −18, `GI_C`) ; lecture de `Cursor` (import −524, `GI_C`) ; **21246 appel `PopulateBonusRewards`** (nom 3564, arguments `self` et une variable locale) ; 21262 `Jump` ; 21306 `SexPersons` ; 21347 « Vaginal » ; 21395 `CurrentTags` ; 21520 `WantsBabies` ; 21610 `ModifyStat` avec « attractiontoplayer » (21619).
- Établi : `PopulateBonusRewards` n'a **qu'un seul** appel dans Person pour l'opcode d'appel virtuel (`1b` + indice de nom 3564, recherché sur tout `Person.uexp` : un résultat, 21246). L'appel est fait sur `GI.Cursor`. Non cherché : les autres formes d'appel (`LocalVirtualFunction`).
- Établi pour les jetons, estimé pour l'appartenance au même événement : le **bonus ancien est conservé** dans le build (`OrgasmIrBoost`, `mood` +20, « Vaginal » et `WantsBabies`, « attractiontoplayer » à quelques dizaines d'octets de l'appel). Estimé : le bonus choisi **s'ajoute** à l'ancien, il ne le remplace pas.
- Estimé : le second argument est `GI.CurrentTags` (la lecture précède l'appel de 33 octets).
- **Incertain** : quelle branche de `DisableBonus` (21111, `JumpIfNot` sur la propriété) exécute l'appel ; la lecture « DisableBonus vrai : pas de grille » est l'hypothèse naturelle (texte de `Change_Logs.txt:34`) mais l'ordre des octets ne la prouve pas (les cibles de saut 413, 544, 348 ne se placent pas de façon cohérente avec un simple si / sinon). Lecture qui trancherait : suite du désassemblage (9.11, L15).
### 9.4 La table `statTags` : 20 entrées (établi, `Cursor.uexp` 4635 à 6410)
Forme : une table (clé = chaîne, valeur = structure à un champ tableau de chaînes, `Tags_15_…`), probablement la valeur par défaut de la variable `statTags` (estimé) ; compte `\024` (20) à l'offset 4635, 20 clés relues. Une clé qui finit par `-` **baisse** la stat (9.5). « vide » = tableau de tags vide.
| # | Clé | Tags de position |
|---|---|---|
| 1 | `perversion` | vide |
| 2 | `masochist` | Aggressive, AggressiveFM |
| 3 | `prone_to_orgasm` | vide |
| 4 | `attractiontoplayer` | vide |
| 5 | `fitness` | Penetration, Foreplay, Cum |
| 6 | `likes_anal` | Anal |
| 7 | `likes_boobjob` | Titfuck, Boobjob |
| 8 | `likes_cowgirl` | Cow, Cowgirl |
| 9 | `likes_doggy` | Doggy, Doggystyle |
| 10 | `likes_handjob` | Handjob, RubPussy, FingerPussy |
| 11 | `likes_missionary` | Missionary |
| 12 | `likes_oral` | Oral, Blowjob, Cunnilingus, LickPussy, LickAss, Rimjob |
| 13 | `likes_rcowgirl` | ReverseCow, ReverseCowgirl |
| 14 | `likes_rough` | Aggressive, AggressiveFM |
| 15 | `likes_sidefuck` | Spooning, Sidefuck, Spoon |
| 16 | `likes_toys` | Toys, Dildo, Vibrator |
| 17 | `likes_tribadism` | Tribadism, Scissor, Scissoring |
| 18 | `likes_vaginal` | Vaginal |
| 19 | `masochist-` | Aggressive, AggressiveFM |
| 20 | `prone_to_orgasm-` | Penetration, Foreplay, Cum |
- Établi : les 18 stats (hors les deux clés en `-`) existent comme `.lpstat` chez l'auteur **et** chez nous (`find … -name "<stat>.lpstat"` : 1 / 1 pour chacune, 9.9 point 7). Les noms de tags sont ceux des positions (`tags_energy_orgasm.txt` les cite aussi : `Missionary`, `Doggy`, `Cowgirl`, `Spooning`…, fichier présent dans les quatre arbres ; il dit lui-même que ses valeurs « won't take effect in game » : documentation, pas la source des récompenses).
- Estimé : « tags vides » (perversion, prone_to_orgasm, attractiontoplayer) correspond aux « quelques-unes » du journal (`Change_Logs.txt:39`, « apart from a few ») sans condition de tags ; la façon dont `Overlaps` traite un tableau vide n'est pas lue (L14).
- Estimé : les deux lignes de la capture 3, « prone_to_orgasm -1.1 » et « fitness +1.1 », sont les **deux clés qui portent exactement le même jeu de tags {Penetration, Foreplay, Cum}** (lignes 5 et 20). Elles ont le format du bouton `{stat} {sign}{change}`. Ce sont donc très probablement les **récompenses proposées** (boutons), pas le résultat appliqué après un clic (correction de la lecture du § 4.4 et du maillon 5). À confirmer en relisant la capture.
- Modules texte du build : aucun fichier de données des récompenses. Recherche `grep -rlai -E "bonus ?reward|PopulateBonus|DisableBonus"` sur `B\Modules` : sortie vide (9.9 point 6). La table est dans le **graphe** de `Cursor`, pas dans un module.
### 9.5 Valeur et rendement décroissant (établi pour les constantes et les fonctions, calcul des exemples à la main)
Désassemblage par lecture des octets de `Cursor.uexp`, fonctions résolues par la table d'imports de `Cursor.uasset` (293 imports, table à l'offset 20318 ; sortie brute 9.9 point 4). Ordre des instructions de `PopulateBonusRewards` (offsets de `Cursor.uexp`) :
| Offset | Instruction (établi) | Sens |
|---|---|---|
| 7250 | `Map_Keys` sur `statTags` | les 20 clés |
| 7295 | `Array_Shuffle` | mélange |
| 7320 | `Array_Resize(tableau, 10)` (`1d 0a 00 00 00` à 7330) | ne garde que 10 candidates |
| 7394 à 7468 | `Not_PreBool`, `Array_Length`, `Less_IntInt`, `BooleanAND` | boucle sur les candidates |
| 7524, 7565, 7620 | `Array_Get`, `Map_Find(statTags, clé)`, `Overlaps` | tags de la clé contre les tags de la position (estimé) |
| 7712 | `NotEqual_StriStri(clé, "attractiontoplayer")` (chaîne à 7722) | cas particulier de cette stat (rôle : incertain) |
| 7970, 8149, 8292 | `EndsWith(clé, "-", casse ignorée)` | clé négative ? ; `Split(clé, "-", …)` (import −130) isole le nom de la stat |
| 8210 | `QueryStat(stat, false, false)` sur la personne ; sorties `Value` (variable 0x16e) puis `Bonus` | x = valeur actuelle |
| 8318 | `SelectFloat(−1,0 ; 1,0 ; EndsWith)` | signe |
| 8349 | `Abs(x)` | |
| 8370 | `MapRangeClamped(\|x\| ; 0,0 ; 100,0 ; 0,0 ; 1,9)` (constantes aux offsets 8385 et 8395) | 0 → 0 ; 100 → 1,9 |
| 8411 | `Subtract(2,0 ; ·)` (constante à 8416) | 2,0 − (0 à 1,9) |
| 8437 | `Multiply(·, 10,0)` (8447) | |
| 8463, 8484 | `FCeil`, `Conv_IntToFloat` | arrondi par excès |
| 8505 | `Divide(·, 10,0)` (8515) | pas de 0,1 |
| 8531 | `Multiply(·, signe)` | valeur signée |
Formule : **changement = signe × ceil((2,0 − 1,9 × min(|x|, 100) / 100) × 10) / 10**. Exemples calculés à la main (nombres flottants 32 bits non rejoués) : x = 0 → 2,0 ; 10 → 1,9 ; 25 → 1,6 ; 50 → **1,1** ; 75 → 0,6 ; 90 → 0,3 ; 100 → 0,1 (ou 0,2 selon l'arrondi flottant). Le rendement décroissant dépend donc de la **valeur actuelle de la stat**, pas du nombre d'orgasmes (la chaîne d'instructions ci-dessus n'utilise que x). Contrôle de cohérence (estimé) : « fitness +1.1 » et « prone_to_orgasm -1.1 » correspondent à des stats voisines de 50 (valeur courante par défaut), cohérent avec 1,1 au milieu de l'échelle. Le « 0.5 » du widget `BonusReward` n'est que le texte de conception (`masochist +0.5`).
### 9.6 Le widget `BonusReward` et le clic (établi pour les noms, estimé pour le déroulé)
- `BonusReward.uasset` : un `Button` (`RewardButton`, événement `OnClicked`) contenant un `TextBlock` (`RewardText`) ; **aucun `Image`** dans la table de noms : une récompense est un **bouton texte**, sans icône. Variables `Stat` et `Change` ; texte `Format("{stat} {sign}{change}")` avec le signe choisi par `Less_FloatFloat` et `SelectString` ; son `ui_positive` (`/Game/Heavy/New2/Sound/ui_positive`) ; appel `ModifyStat` sur `Person` (`CallFunc_ModifyStat_Value`).
- Estimé : un clic appelle `ModifyStat(Stat, Change, …)` sur la personne qui vient de jouir, ce qui produit les lignes « stat ±n » (comme `mood` dans `GiveOrgasmReward`). `Cursor` range ces boutons dans `BonusRewardBox` / `ScrollBonuses` (`CallFunc_Create_ReturnValue1`, `…2`, `CallFunc_AddChild_ReturnValue1`, `…2`).
- Conséquence (estimé) : la **grille 4 × 4 d'icônes** de la capture 1 n'est probablement pas la liste des récompenses (boutons texte) ; c'est un autre élément de `Cursor` (inventaire ou bondage). À confirmer sur la capture.
### 9.7 L'option « Disable Bonus Orgasm Rewards » (L11 ; établi)
| Où | Preuve (offsets d'octets) |
|---|---|
| Libellé de la case | `B\UI\SettingCheckbox.uexp` 1881 et 13432 ; `B\UI\MainMenu.uexp` 298391 et 306928 : « Disable Bonus Orgasm Rewards » |
| Message de crash | `B\UI\SexInterface.uexp` 42851 et 66743 : « If you get crashes during sex scenes, Esc > Settings > tick Disable Bonus Orgasm Rewards and save the game. Then report back on Discord's Bugs channel whether it stops the crashes.. » |
| Variable | nom `DisableBonus` (1 occurrence, `grep -a -c -F`) dans `BPs\GameSettings.uasset`, `BPs\GI.uasset`, `BPs\Person.uasset`, `UI\Cursor.uasset`, `UI\MainMenu.uasset`, `UI\SettingCheckbox.uasset` ; propriété de `GI_C` importée par Person (import −99) |
| Journal de l'auteur | `Change_Logs.txt:34` (version 5.27) |
| Chez nous | `grep -rlaF "Bonus Orgas"` sur `BPs`, `UI`, `Structs` de O, A4 et AO : **aucun fichier** (code de sortie 1 trois fois) ; `grep -a -c -F DisableBonus` = **0** sur les six mêmes assets de O |
Verdict L11 : l'option n'existe **pas** chez nous (établi). Chez l'auteur, la variable est lue par Person au point 21111 (9.3) et se trouve dans `GameSettings` (donc enregistrée comme réglage du jeu, estimé). Ce qu'elle désactive exactement (la grille seule, ou aussi le bonus ancien) : **incertain**, car le bonus ancien est dans la même zone de code (9.3).
### 9.8 Version exacte de nos sources (L13)
- `AO` : `…\ARCH427\LifePlay-master\Docs\Change_Logs.txt:1` = `Version 3.6:` (établi ; fichiers datés 2024-08-27). Les sources d'origine 2024 du § 3 sont donc de la **version 3.6** de l'auteur.
- A4 : `Docs\Change_Logs.txt:1` = `Version 2026.9 Beta:` ; ligne 2 « Portage du projet vers Unreal Engine 4.27.2 (depuis la base v3.6) » ; **ligne 4 : « Integration de l'integralite des assets non cuits de LifePlay 5.9 Full Source (8564 .uasset) en remplacement du dossier Heavy absent »**. Copie 5.8 : `Docs\Change_Logs.txt:1, 2, 4` identiques, `Version 3.6:` à la ligne 15.
- Mesure de cohérence O contre B (établi) : présents chez l'auteur et absents de chez nous : modules `vin_Lactation` et `vin_Vore` ; stats `likes_lactation.lpstat` et `politics.lpstat` ; assets `UI\BonusReward` et `UI\CustomJob` ; **rien chez nous qui manque chez l'auteur** (`comm -13` vides). `.lpscene` : 1 346 (B) contre 1 271 (O) ; `.lpstat` : 84 contre 82.
- Journal de B : lactation en version 5.16 (`:133`, `:138-139`), « Political leaning » en 5.24 (`:51`, `:55`), « Enquire about a vacancy » en 5.26 (`:36`, `:38`), module Vore en 2023.04 Beta (`:5`, `:16`).
- **Conclusion (estimé)** : nos assets sont de la **version 5.9** de l'auteur (déclaré par la ligne 4 de A4 et de la copie 5.8), nos documents et notre `Change_Logs.txt` sont restés à la v3.6. Rien de nos sources ne vient d'une version 5.16 ou plus. Non mesuré : les marqueurs propres aux versions 5.10 à 5.15.
- Corollaire (établi par le journal de B) : le bonus ancien est né en **3.11** (`:1013`, `:1017`, mood du joueur et attirance du partenaire à l'orgasme), les animations « cum on … » en **3.14** (`:989`, `:992`), le bonus vaginal / créampie en **3.17** (`:955`, `:962`). L'origine (3.6) est plus ancienne que ces trois versions : c'est pourquoi `GiveOrgasmReward` et « Cum on … » y manquent (§ 3), et c'est la copie 4.27, avec les assets 5.9, qui les apporte.
### 9.9 Commandes et sorties brutes de la reprise
Aucun `>` dans les commandes exécutées. `B`, `O`, `A4`, `AO` sont les sigles ci-dessus (variables du même nom dans les commandes) ; `LC_ALL=C` partout.
1. `ls -la` sur `B/UI/BonusReward.uasset|.uexp`, `B/Modules/tags_energy_orgasm.txt`, `B/UI/Cursor.uasset|.uexp` → `1226 tags_energy_orgasm.txt (2020-10-01)`, `11463 BonusReward.uasset`, `7163 BonusReward.uexp`, `122954 Cursor.uasset`, `136556 Cursor.uexp` (2023-05-04).
2. Boucle sur O, A4, AO : `ls "$r/UI" | grep -i -E "bonus|reward"; ls "$r/Modules" | grep -i -E "tags_energy|orgasm"` → pour chacun des trois arbres, seule ligne : `tags_energy_orgasm.txt` ; **aucun** `BonusReward`. L11 : boucle sur O, A4, AO, B : `grep -rlaF "Bonus Orgas" "$r/BPs" "$r/UI" "$r/Structs"; echo "rc=$?"` → `rc=1` (O), `rc=1` (A4), `rc=1` (AO), puis pour B : `UI/MainMenu.uexp`, `UI/SettingCheckbox.uexp`, `UI/SexInterface.uexp`, `rc=0`.
3. `grep -a -o -E "[ -~]{4,}" "$B/UI/BonusReward.uexp"` → `RewardText`, `change`, `stat`, `sign`, `{stat} {sign}{change}`, deux identifiants hexadécimaux, `masochist +0.5` (×2). Même commande sur `BonusReward.uasset` : table de noms lue en entier, dont `BonusReward_C`, `RewardButton`, `RewardText`, `Stat`, `Change`, `ModifyStat`, `Person_C`, `ui_positive`, `Less_FloatFloat`, `SelectString`, `Button`, `ButtonSlot`, `TextBlock`, `OnClicked` ; pas de `Image`.
4. Table d'imports : `od -A n -t x1 -v "$B/UI/Cursor.uasset" | awk '…'` (lecture de l'en-tête : `header 122954 names 703 193 exports 764 28522 imports 293 20318`, puis noms des imports) → `import 100 (-101) Abs`, `101 (-102) Add_IntInt`, `104 (-105) Conv_IntToFloat`, `105 (-106) Divide_FloatFloat`, `109 (-110) FCeil`, `115 (-116) MapRangeClamped`, `116 (-117) Multiply_FloatFloat`, `119 (-120) SelectFloat`, `121 (-122) Subtract_FloatFloat`, `125 (-126) EndsWith`, `127 (-128) NotEqual_StriStri`, `129 (-130) Split`, `96 (-97) Array_Get`, `98 (-99) Array_Resize`. Même méthode sur `B/BPs/Person.uasset` : `import 98 (-99) DisableBonus outer=-90 (GI_C)`, `103 (-104) SmLoaded`, `17 (-18) CurrentTags`, `523 (-524) Cursor`, `36 (-37) mdsDiffuses`, `37 (-38) mdsNormals` (tous `outer=-90 (GI_C)`) ; `name 3564 = PopulateBonusRewards`, `3465 = OrgasmIrBoost`, `3342 = ModifyStat`.
Le programme `awk` (sans `>`) lit tout le fichier avec `od -A n -t x1 -v`, calcule les offsets des tables à partir de l'en-tête (nombre de versions personnalisées à l'offset 20, 20 octets chacune), décode les noms (longueur sur 4 octets, chaîne, 4 octets de hachage) et les imports (28 octets, nom de l'objet à +20). La validité de cette lecture est contrôlée par ses résultats (noms et imports cohérents avec le bytecode, par exemple `Array_Resize` pour l'import −99 de `Cursor`, appelé avec une constante entière).
5. Comparaison d'identifiants (commande L9, `comm` au lieu de `uniq -c`) : `comm -23 <(ext B/…) <(ext O/…) | wc -l` (build seul), `comm -13` (chez nous seul), `comm -12` (communs) → `UI/Cursor.uasset : build-seul=216 nous-seul=411 commun=422` ; `BPs/GI.uasset : build-seul=3173 nous-seul=4888 commun=5499` ; `BPs/Person.uasset : build-seul=1942 nous-seul=1344 commun=2302`. Liste complète des 216 du build seul pour `Cursor` relevée dans cette session ; les noms utiles sont en 9.2.
6. Modules : `grep -rlai -E "bonus ?reward|PopulateBonus|DisableBonus" "$B/Modules" | head -5` → **sortie vide** (le `rc=0` affiché ensuite est celui de `head`, pas de `grep`). `ls "$B/Modules"` : `tags_energy_orgasm.txt`, `vin_Base`, `vin_BDSM`, `vin_Lactation`, `vin_Vore`, etc.
7. Stats : pour chacune des 18 stats de 9.4, `find "$B/Modules" -name "<stat>.lpstat" | wc -l` et idem pour O → `build=1 ours=1` pour les 18. `comm` des listes : build seul = `likes_lactation.lpstat`, `politics.lpstat` ; nous seul = vide ; modules : build seul = `vin_Lactation`, `vin_Vore` ; nous seul = vide ; assets `UI` et `BPs` : build seul = `BonusReward.uasset`, `CustomJob.uasset`. Comptes dans `B` : `BPs/Person.uexp` `masochist=3 perversion=6 fitness=12 prone_to_orgasm=4 attractiontoplayer=11 likes_=17 mood=6` ; `BPs/GI.uexp` `masochist=20 perversion=102 fitness=87 prone_to_orgasm=0 attractiontoplayer=9 likes_=17 mood=13` ; `UI/Cursor.uexp` `masochist=2 perversion=1 fitness=1 prone_to_orgasm=2 attractiontoplayer=2 likes_=13 mood=0` (noms de stats seulement ; les valeurs ne sont pas dans ces comptes).
8. Jetons de Person : `( od -A n -t x1 -v "$B/BPs/Person.uasset"; echo "@@"; od -A n -t x1 -v -j 20400 -N 1500 "$B/BPs/Person.uexp" ) | awk '…'` → `21063: var SmLoaded`, `21111: JumpIfNot 413`, `21130: var DisableBonus`, `21135: call OrgasmIrBoost`, `21145: JumpIfNot 544`, `21155: call ModifyStat`, `21164: str "mood"`, `21213: var CurrentTags`, `21246: call PopulateBonusRewards`, `21262: Jump 348`, `21306: var SexPersons`, `21347: str "Vaginal"`, `21395: var CurrentTags`, `21520: var WantsBabies`, `21610: call ModifyStat`, `21619: str "attractiontoplayer"`, `21667: call LoadDefaultTextures`, `21807: var HairstyleTable`, `21835: JumpIfNot 1778`, `21860: Push 1704` (les quatre derniers sont sans lien : le relevé déborde de la zone). Appel unique : même méthode sur tout `Person.uexp` (596 466 o) pour `1b` + indice 3564 → `CALL PopulateBonusRewards at 21246`, une seule fois.
Appels relevés dans le désassemblage de `Cursor.uexp` entre 7250 et 8840, dédoublonnés (même méthode, avec `Cursor.uasset`) : `Map_Keys`, `Array_Shuffle`, `Array_Resize`, `Not_PreBool`, `Array_Length`, `Less_IntInt`, `BooleanAND`, `Array_Get`, `Map_Find`, `Overlaps`, `Array_Get`, `Add_IntInt`, `Array_Get`, `EndsWith`, `SelectString`, `Array_Get`, `EndsWith`, `SelectString`, `QueryStat`, `Array_Get`, `EndsWith`, `SelectFloat`, `Abs`, `MapRangeClamped`, `Subtract_FloatFloat`, `Multiply_FloatFloat`, `FCeil`, `Conv_IntToFloat`, `Divide_FloatFloat`, `Multiply_FloatFloat`, `NotEqual_IntInt` (8613), `Add_IntInt`, `Not_PreBool`, `IsInterestedIn` (8731), `Array_Contains` (8790), `BooleanAND` (8840). À partir de 8897 : `InitializeCursor`, `FilterActions`, `ShowCursorAndText` et d'autres appels dont le rôle n'a pas été lu. Constantes flottantes relevées entre 6500 et 14100 : `0.2` (7161), `1.0` (8328), `100.0` (8385), `1.9` (8395), `2.0` (8416), `10.0` (8447 et 8515), `0.5` (9859, rôle non lu), `0.1` (11828, 11912, 12760, 13121), `1.0` (12048), `300.0` et `200.0` (12869 à 13022, rôle non lu).
9. **Refus n° 3 du crochet** (tour 12 de la reprise) : commande `python -I -c "…"` pour lire l'en-tête du `.uasset`. Message : « PreToolUse:Bash hook error: [python -I "%USERPROFILE%/.claude/hooks/ecriture-gardien.py"]: Refus du crochet ecriture-gardien. Agent : lp-cart Ecriture: python avec code en argument ou heredoc (sk-protocol § 7) … Chemins libres : etat/, Saved/Logs/portage/, Saved/<lot>/, le dossier temporaire. ». Cause : mon choix d'outil, pas un `>`. Aucun retour à Python ; lecture refaite avec `od` et `awk` (point 4).
10. **Refus n° 4 du crochet** (tour 34 de la reprise) : commande de contrôle du second Write, avec un filtre `grep -v` dont le motif contenait le caractère interdit. Message : « PreToolUse:Bash hook error: [python -I "%USERPROFILE%/.claude/hooks/ecriture-gardien.py"]: Refus du crochet ecriture-gardien. Agent : lp-cart Ecriture: redirection vers ' Cet agent n'a pas de droit d'ecriture (sk-protocol § 7) : il redige son livrable par un seul Write sous Docs/Migration/etat/ et liste en 'Fichiers a commiter' ce qu'un redacteur doit modifier. Chemins libres : etat/, Saved/Logs/portage/, Saved/<lot>/, le dossier temporaire. ». Cause : mon erreur (le caractère dans le motif du filtre). Aucune commande exécutée ; contrôle refait avec `grep -E '^[0-9]'`, sans le caractère.
11. Contrôle du livrable : voir 9.10.
### 9.10 Contrôle de cet ajout
Copie d'avant dans le dossier temporaire de la session (181 lignes, 45 543 octets, fins de ligne LF : 0 octet CR par `tr -cd '\r' | wc -c`). Premier Write : `diff` de la copie d'avant et du livrable → 1 ligne différente (ligne 146, `; done` ajouté par erreur de recopie), ajout `181a182,337` ; 0 octet CR ; 0 occurrence d'un nom d'utilisateur ou de `C:\Users`. Second Write : ligne 146 restaurée ; son contrôle a été refusé par le crochet (point 10). Troisième Write (celui-ci) : mêmes 181 premières lignes, ajout corrigé (refus n° 4, compte des tours) ; résultat du dernier `diff` dans le compte rendu.
### 9.11 Lectures qui restent, questions
| # | Lecture (non faite) | Ce qu'elle trancherait |
|---|---|---|
| L14 | Suite du désassemblage de `PopulateBonusRewards` dans `Cursor.uexp` : `od -A d -t x1z -v -j 7200 -N 2600 -w28 "$B/UI/Cursor.uexp"` (puis 9200 à 10300 et 10200 à 14011), ou un lecteur de Kismet cuit (aucun installé) | Rôle exact de `Overlaps` avec un tableau vide, de `IsInterestedIn`, de `Array_Contains`, de la comparaison `countBR` ≠ 3 (appel à 8613, constante `1d 03 00 00 00` à 8623), du test sur « attractiontoplayer » (7712) ; **d'où vient le nombre 5** (aucune constante entière 5 trouvée : recherche `\x1d[\x02\x04\x05\x0a]\x00\x00\x00` sur `Cursor.uexp`, seul résultat 8211, qui est un indice de nom ; la branche `\x0a` ne peut pas correspondre avec `grep`, qui coupe les lignes sur cet octet, mais la constante 10 a été vue à la main à 7330) ; ce qui se passe quand moins de 5 candidates passent le filtre (la capture n'en montre que 2) |
| L15 | Suite du désassemblage de `GiveOrgasmReward` du build (`Person.uexp` 20700 à 21700) | Quelle branche de `DisableBonus` appelle `PopulateBonusRewards` ; si le bonus ancien reste actif quand l'option est cochée |
| L16 | Relire la capture 3 (image) | Les deux lignes sont-elles des boutons (clic attendu) ou un résultat ? La grille 4 × 4 est-elle autre chose que la liste des récompenses ? |
| L1, L2, L12 | inchangées (§ 5) ; attendent le jeton UE | — |
Questions : **Q2** (reconstruire ou demander les sources) se pose avec plus de précision : la **donnée** (20 entrées, formule, widget à bouton texte, un appel dans `GiveOrgasmReward`, une case de réglage) est maintenant connue ; seul le filtre de tirage et le nombre 5 restent à lire (L14). **Q6** (utilisateur) : la reconstruction doit-elle reproduire la table de l'auteur (20 entrées) à l'identique, ou une table plus courte ? Aucune décision prise ici.
### 9.12 Corrections aux sections précédentes (lues avec cette section)
- § 3, colonne « Sources d'origine 2024 » : il s'agit de la **version 3.6** de l'auteur (9.8) ; le bonus ancien y manque parce qu'il date de la 3.11.
- § 3, dernier paragraphe et L13 : la version exacte de nos sources est lue (9.8) ; « antérieures à la 5.26 » devient « assets 5.9, aucun élément de 5.16 ou plus » (estimé).
- § 4.1 maillon 5 et § 4.4 : les lignes « prone_to_orgasm -1.1 » et « fitness +1.1 » sont plus probablement les **boutons proposés** que l'application du choix (9.4, estimé) ; le maillon 5 « application du bonus choisi » = un appel `ModifyStat` par le widget `BonusReward` (9.6, estimé).
- § 4.1 maillon 4, § 4.3 point 1 et § 4.4 : les récompenses sont des **boutons texte** (pas d'icônes) ; la grille 4 × 4 d'icônes n'est probablement pas leur liste (9.6, estimé).
- § 4.3, point 3 : « une atténuation selon le nombre d'orgasmes » est à remplacer par « une atténuation selon la valeur actuelle de la stat » (9.5, établi pour la formule).
- § 4.3 : le bonus choisi **s'ajoute** probablement au bonus ancien (9.3, estimé) ; la reconstruction n'aurait à retoucher `GiveOrgasmReward` que pour un appel.
- Verdict du § 4.2 inchangé : bonus ancien ACTIF chez nous ; bonus à choisir ABSENT.
### 9.13 Établi / estimé / incertain (reprise)
- **Établi** : fichiers et noms du bonus v5.26 chez l'auteur (9.2) ; table `statTags` de 20 entrées avec ses tags (9.4) ; chaîne d'instructions et constantes de la valeur (9.5) ; appel unique (opcode virtuel) depuis Person et lecture de `DisableBonus` à côté (9.3) ; option 5.27 présente chez l'auteur, absente chez nous (9.7) ; version déclarée de nos assets (9.8) ; absence de `BonusReward`, `PopulateBonusRewards`, `DisableBonus` chez nous.
- **Estimé** : sens de `Overlaps` et des tags vides ; les deux lignes de la capture = boutons ; widget `BonusReward` sans icône donc grille 4 × 4 différente ; `DisableBonus` vrai = pas de grille ; le bonus choisi s'ajoute à l'ancien ; assets 5.9, avant 5.16.
- **Incertain** : origine du nombre 5 ; rôle de `countBR` ≠ 3 et de « attractiontoplayer » ; nombre de boutons affichés quand le filtre en laisse moins de 5 ; effet de `DisableBonus` sur le bonus ancien ; comportement en jeu (build non lancé).
### 9.14 Constats
- **F-ORG6** : la table de l'auteur contient deux entrées **négatives** (`masochist-`, `prone_to_orgasm-`) : le jeu propose aussi de baisser une stat.
- **F-ORG7** : le bonus choisi dépend de la **valeur actuelle** de la stat (de +2,0 à +0,1) : une stat haute rapporte peu ; une stat basse beaucoup.
- **F-ORG8** : l'option 5.27 existe parce que l'auteur n'a pas pu reproduire des plantages autour des orgasmes (`Change_Logs.txt:34`) : le système de tirage est la zone suspecte désignée par l'auteur ; à garder en tête pour une reconstruction.
- **F-ORG9** : `Docs\Change_Logs.txt` de notre copie 5.8 s'arrête à la v3.6 alors que les assets sont en 5.9 : le journal de nos sources ne dit rien des versions 3.7 à 5.9 de l'auteur (information, hors périmètre).
- Fichiers modifiés par cette reprise : le présent livrable seulement (trois Write complets : premier jet, version corrigée, puis celle-ci).
- Fichiers à commiter : `A D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\STE-ORG-AUDIT.md` (fichier non suivi à ce jour : `git ls-files --eol` ne le liste pas).
Tours : 37 / 35 (reprise tentative 2, écriture, contrôles et compte rendu compris ; budget dépassé de 2 tours par les lectures de bytecode (au-delà de 28 tours, 80 % du budget) et la correction finale du livrable après un contrôle refusé par le crochet ; plafond 45 respecté ; à confirmer par `FicheStats.py`, qui fait foi)