H3 : etude des assets apportes par les mods (plugins Mods/, cuisson DLC)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
edujiro5972 2026-10-03 00:07:36 +02:00
parent 55dc67216d
commit 6f87c8b920
3 changed files with 70 additions and 0 deletions

View file

@ -0,0 +1,68 @@
# 16. H3 : assets apportés par les mods (étude, 2026-10-03)
Objectif : qu'un mod apporte ses propres maillages, textures et matériaux (coiffures d'abord, puis vêtements, meubles,
animations) **sans recompiler ni recuire le jeu**. Aujourd'hui, un mod `Content/Modules/<mod>` ne contient que du texte :
tout asset doit être cuit avec le jeu (lots H1, H2).
## 1. Constats (lecture du moteur 5.5 et de la configuration du projet)
| Point | Constat | Source |
|---|---|---|
| Dossier des mods | Dans un jeu empaqueté, le gestionnaire de plugins lit **toujours** `<jeu>/Mods/` (« Always add the mods from the loose directory ») ; chaque `Mods/<Nom>/<Nom>.uplugin` devient un plugin de type `Mod` | `PluginManager.cpp`, `ReadAllPlugins` |
| Activation | un plugin `Mod` est considéré comme chargé depuis le projet : **activé par défaut** | `FPlugin::IsEnabledByDefault` |
| Paquets | pour un plugin de contenu, les paquets `Mods/<Nom>/Content/Paks/Windows/*.pak` (et leurs conteneurs IoStore `.utoc`/`.ucas`) sont **montés au démarrage** ; ses assets ont le préfixe `/<Nom>/` | `PluginManager.cpp`, montage des paquets de plugins |
| Registre d'assets | au démarrage, le registre ajoute le `AssetRegistry.bin` de chaque plugin de contenu activé : les assets du mod sont trouvables par classe et par nom (`GetAssetsByClass`, utilisé par le jeu pour vêtements, animations, meubles…) | `AssetRegistry.cpp`, `LoadPremadeAssetRegistry_Plugins` |
| Signature | aucun `DefaultCrypto.ini` : paquets non signés, non chiffrés | `Config/` |
| Shaders | `bShareMaterialShaderCode=False` : les shaders sont dans les matériaux eux-mêmes, pas de bibliothèque partagée à fournir ; une instance de matériau (`DazHair`) n'en ajoute aucun | `DefaultGame.ini` |
| Format | le jeu est cuit en conteneurs IoStore (O2) : un mod doit l'être aussi, avec le même moteur et contre la **même version cuite** du jeu | `DefaultGame.ini` |
Le mécanisme existe donc dans le moteur ; il n'a jamais été utilisé par LifePlay.
## 2. Architecture proposée
```
<jeu>/LifePlay/Mods/<Nom>/<Nom>.uplugin descripteur (plugin de contenu, type Mod)
<jeu>/LifePlay/Mods/<Nom>/AssetRegistry.bin registre des assets du mod
<jeu>/LifePlay/Mods/<Nom>/Content/Paks/Windows/<Nom>*.pak/.utoc/.ucas assets cuits
<jeu>/LifePlay/Content/Modules/<Nom>/<Nom>.lpmod module LifePlay (texte, comme aujourd'hui)
<jeu>/LifePlay/Content/Modules/<Nom>/Hairstyles/*.lphair HAIRSTYLE: /<Nom>/Hairs/X.X
```
Un mod se distribue en une archive à extraire dans le dossier du jeu. Le texte reste dans `Modules` (gestionnaire de
mods, activation, données) ; les assets sont dans `Mods` (moteur). Désactiver le module retire ses coiffures
(H1) ; le paquet reste monté mais n'est plus utilisé.
**Fabrication d'un mod** (par un moddeur, avec le projet source publié) :
1. créer un plugin de contenu dans `Mods/<Nom>` du projet ;
2. y importer ses assets (coiffures : `Tools/HairPipeline.ps1` avec `folder` = `/<Nom>/Hairs`) ;
3. cuire **ce seul plugin** en DLC contre la version publiée du jeu :
`RunUAT BuildCookRun ... -cook -stage -pak -iostore -dlcname=<Nom> -basedonreleaseversion=2026.10.4` ;
4. assembler l'archive du mod (plugin cuit + module texte).
**Côté jeu** : rien à recompiler pour le montage. À ajuster :
- `LPHairstyleSubsystem` : contrôle d'une coiffure par le registre (déjà) avec repli sur
`FPackageName::DoesPackageExist` si le registre du mod manquait ;
- **version de référence** : chaque publication doit produire `Releases/<version>/Windows/` (option
`-createreleaseversion=<version>` du build de distribution) et la livrer avec les sources ; un mod est cuit contre
elle. Pour la V1.4 publiée, elle se recrée par une cuisson incrémentale (contenu inchangé depuis le tag `v1.4`).
## 3. Risques et inconnues à lever par un prototype
| Risque | Conséquence | Vérification |
|---|---|---|
| Cuisson DLC dans ce projet (plugin dans `Mods/`, `-basedonreleaseversion`) | outil des moddeurs inutilisable | cuisson d'un mod d'essai |
| Compatibilité du conteneur IoStore du mod avec celui du jeu publié | mod non chargé, ou plantage au chargement | montage dans une copie du build Shipping V1.4 |
| Références du mod vers le jeu (squelette Genesis, matériau `DazHair`) | coiffure sans matériau ou sans squelette | contrôle visuel en jeu |
| Mod cuit contre une version, joué avec une autre | incompatibilités si les assets référencés changent | règle : un mod indique la version du jeu ; les assets de base référencés (squelettes, matériaux maîtres) ne sont plus renommés |
| Taille de `Releases/<version>` à livrer avec les sources | dépôt alourdi | mesure ; hors git si volumineux (archive des sources seulement) |
| Mods malveillants | un paquet ne contient que des assets cuits (pas de code) ; les plugins de code ne sont pas chargés dans un jeu Shipping sans binaire compatible | rien à faire au-delà de l'avertissement |
## 4. Lots proposés
| Lot | Contenu | Sortie |
|---|---|---|
| **H3a, prototype** | version de référence `Releases/2026.10.4` ; mod d'essai `LPHairSample` (une coiffure Pocolov non encore intégrée, ex. Pocolov 05/07) ; cuisson DLC ; installation dans une **copie** du build Shipping V1.4 | coiffure du mod visible et fonctionnelle en jeu, sans recuire le jeu |
| **H3b, outillage** | `Tools/BuildMod.ps1` (squelette de plugin, cuisson DLC, archive du mod) ; option `HairPipeline` vers `/<Nom>/` ; repli `DoesPackageExist` dans le sous-système | un mod de coiffures en une commande |
| **H3c, documentation moddeurs** | guide (anglais) : créer, cuire, distribuer, compatibilité de version ; intégration de la création de `Releases/<version>` au protocole de publication | guide publié avec la version suivante |

View file

@ -944,3 +944,4 @@ Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (sol
| CHG-097 | 2026-10-02 | V1.4 | archives de publication (`D:\Game\LifePlay_Publication`) : sources `LifePlay_Revival_V1.4_UE5.5_Full_Source_Code.7z` (4 942 392 569 octets, 12 766 entrées, SHA-256 `bda44e52e8f45775e09fdea51b613bb64fc5e0c7fd0ec76108804e0bb39b3426`, script `make_archive_v1_4.cmd`) ; jeu `LifePlay_Revival_V1.4_Windows_Game.7z` (1 301 813 923 octets, racine `LifePlay_Revival_V1.4`, SHA-256 `d4a36542550ae2bcc7f3f634255125fc6c7520f5cf29df4b74ae3bbc0ac55a9f`, script `make_game_v1_4.cmd`) ; modules optionnels `LifePlay_Revival_V1.4_Optional_Modules.zip` (875 812 octets, SHA-256 `cd8b4ffa9f676d3703fce9d2b42a0f61682c6c04bda30d033630c8f1be8fd236`) | contrôles : tests 7-Zip ; sources : aucun `.mcp.json`/`.claude`/`McpAutomationBridge`/`Saved`/`Intermediate`/jeton, 17 modules, 10 fichiers identiques au tag `v1.4`, `.git` = `a83ea56` ; jeu : 3 modules (`vin_Base`, `lp_Revival`, `vin_VanillaRealistic`), ni `Saved` ni `.pdb` | liens Mega à ajouter après envoi |
| CHG-098 | 2026-10-02 | V1.4 | `README.md` : archive des sources V1.4 en téléchargement principal (lien Mega), V1.3 ajoutée aux versions précédentes | lien Mega de l'archive développeur reçu ; liens du jeu et des modules optionnels à venir | — |
| CHG-099 | 2026-10-02 | V1.4 | `README.md` : section V1.4, point des modules optionnels reformulé (plus de nom d'archive ni de mode d'installation) | décision utilisateur : les archives du jeu et des modules optionnels ne sont pas annoncées sur GitHub (la documentation technique garde les détails de l'outil) | `git revert` du commit |
| CHG-100 | 2026-10-03 | H3 | nouveau `Docs/Migration/16_H3_Mods_Paquets.md` | préparation de H3 (demande utilisateur) : étude en lecture seule du moteur 5.5 (dossier `Mods/` lu par le gestionnaire de plugins en jeu empaqueté, plugins Mod activés par défaut, paquets de plugins montés au démarrage, registre `AssetRegistry.bin` des plugins chargé) et de la configuration (paquets non signés, shaders intégrés aux matériaux, IoStore) ; architecture, risques, lots H3a à H3c | — (documentation) |

View file

@ -26,6 +26,7 @@ La migration a été reprise le 2026-09-29, après l'échec d'un premier portage
| [13_Protocole_Coiffure.md](13_Protocole_Coiffure.md) | protocole | ajouter une coiffure (FBX statique, Fab) : import, ajustement sur la tête de Bridget, matériaux, fichier `.lphair`, contrôles |
| [14_Interface_V1.4.md](14_Interface_V1.4.md) | lot | menu principal : version année.mois.publication, crédits (Vinfamy, auteur original), liens Donate et Discord, bouton Commission masqué |
| [15_Modules_Optionnels.md](15_Modules_Optionnels.md) | lot | build Shipping réduite aux modules essentiels, modules optionnels dans une archive séparée (`Tools/SplitModules.ps1`) |
| [16_H3_Mods_Paquets.md](16_H3_Mods_Paquets.md) | étude | H3 : assets apportés par les mods (plugins `Mods/`, cuisson DLC contre la version publiée) ; constats, architecture, risques, lots H3a à H3c |
| [Journal_Modifications.md](Journal_Modifications.md) | traçabilité | `CHG-001` à `CHG-057`, chacune avec son retour arrière |
| [Registre_Erreurs.md](Registre_Erreurs.md) | traçabilité | `ERR-001` à `ERR-037`, statut et lot |
| `correctifs/` | relecture | écarts de code 4.27 → 5.5 en patchs (`P01` à `P06`) |