MODS14 : build Shipping V1.4 reduite aux modules essentiels, modules optionnels dans une archive separee

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
edujiro5972 2026-10-02 20:55:48 +02:00
parent cde3e4b0ce
commit 4b8688b895
5 changed files with 133 additions and 0 deletions

View file

@ -0,0 +1,44 @@
# 15. Modules optionnels livrés à part (V1.4)
Demande utilisateur (2026-10-02) : ne garder dans la build Shipping que l'essentiel, et proposer les mods optionnels
dans une archive séparée.
## 1. Répartition
| Dans la build Shipping | Dans `LifePlay_Revival_V1.4_Optional_Modules.zip` |
|---|---|
| `vin_Base` (jeu de base, ne peut pas être désactivé) | `vin_VanillaPorn`, `vin_Pregnancy`, `vin_Interracial`, `vin_OldYoung`, `vin_Polyamorous` |
| `lp_Revival` (coiffures Pocolov) | `vin_NTR` (désactivé par défaut), `vin_Netori`, `vin_BDSM`, `vin_Tentacles`, `vin_Watersports` |
| `vin_VanillaRealistic` (situations adultes « vanilla », simple interrupteur) | non officiels : `vin_Corruption`, `vin_NonConsensual`, `vin_Incest`, `vin_Bestiality` |
Liste versionnée : `Tools/modules/V1.4.json` (`essential`). Les fichiers de `Content/Modules` hors modules (`Clothes4.txt`,
`outfits_*.txt`, `names_*.txt`, `MorphTags`…) restent dans la build. Le dépôt et l'archive des sources gardent tous les
modules.
## 2. Pourquoi le jeu le supporte
- Les Blueprints ne lisent aucun fichier des modules optionnels ; ils testent seulement leur activation par identifiant
(`GI.IsModEnabled('vin_Pregnancy')`, `vin_Polyamorous`, `vin_NTR`, `vin_Interracial`, `vin_OldYoung`,
`vin_Watersports`).
- `GI.IsModEnabled` lit `GI.ModEnableds` et répond faux pour un module absent de la liste.
- Au démarrage, `GI.removeDeletedMods` relève les `Modules/*.lpmod` présents et retire de `GI.ModEnableds` les modules
absents (la liste par défaut du Blueprint déclare `vin_Pregnancy`, `vin_VanillaPorn` actifs : ils en sont retirés si
leur dossier manque).
- Seuls chemins de modules écrits en dur dans les Blueprints : `Modules/vin_Base/Bedrooms` (`Room`) et
`Modules/vin_Base/Presets/real_faces` (`MainMenu`), dans `vin_Base`, qui reste.
- Couche de données (`LPDataCache`) : un module ajouté plus tard est lu sur le disque puis mis en cache (date et taille).
## 3. Outil
```powershell
.\Tools\SplitModules.ps1 -Build D:\Game\LifePlay_Build_5.5_Shipping_V1.4 -Config Tools\modules\V1.4.json -Out D:\Game\LifePlay_Publication
```
Il vérifie la présence des modules essentiels, déplace les autres vers `<build>_modules_optionnels\LifePlay\Content\Modules`
(rien n'est supprimé), ajoute une notice `LISEZMOI_README.txt` (installation : extraire dans le dossier du jeu, celui de
`LifePlay.exe`), crée l'archive, la teste (7-Zip) et compare son contenu aux fichiers déplacés.
## 4. Installation par le joueur
Extraire l'archive dans le dossier du jeu en fusionnant le dossier `LifePlay` ; les modules apparaissent dans le
gestionnaire de mods, où ils s'activent ou se désactivent. Pour en retirer un : supprimer son dossier.

View file

@ -939,3 +939,4 @@ Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (sol
| CHG-092 | 2026-10-02 | HAIRS1 | nouveaux `Tools/HairPipeline.ps1`, `Tools/FbxMaterialMap.py`, `Tools/hairs/HAIRS1.json` ; `Tools/HairImportFbx.py` (rapport JSON), `Tools/HairMaterials.py` (calotte seulement si utilisée, contrôle des dépendances) ; assets `Content/Heavy/New5/Hairs/Pocolov03/06/11/15/16*` (hors dépôt) ; `Content/Modules/lp_Revival/Hairstyles/pocolov03/06/11/15/16.lphair` ; `Licenses/Free_3D_Models_Credits.txt` ; `13_Protocole_Coiffure.md` §7 | industrialisation de la conversion (demande utilisateur) et test sur 5 coiffures Pocolov (CC BY 4.0, téléchargées avec l'accord de l'utilisateur) ; 5 cas d'archives différents intégrés aux règles ; build `LifePlay_Build_5.5_HAIRS1` : 6 coiffures ajoutées (index 126 à 131) ; contrôle visuel en jeu en attente | retirer les `.lphair` ; assets et sources dans `D:\Game\LifePlay_Backup_5.5\HAIRS1` ; `git checkout HAIRS1-avant -- Tools Licenses Content/Modules` |
| CHG-093 | 2026-10-02 | SKIN | `LPHairFromStaticMeshCommandlet` : liaison par transfert de poids depuis le corps (`-Skin=transfer` par défaut, 6 voisins, bras et jambes exclus) et sortie de la peau (`-Gap` 0,3 cm) ; `LifePlayEditorTools.Build.cs` (`SkeletalMeshDescription`, `AnimationCore`) ; `HairPipeline.ps1` (`-Rebuild`, options `skin`, `gap`) ; 6 coiffures Pocolov reconstruites (versions précédentes dans `HAIRS1\<nom>\precedente_*`), Pocolov 17 ajoutée au lot ; `.lphair` et crédits : description des modifications corrigée ; `13_Protocole_Coiffure.md` | vidéo utilisateur : mèches longues liées à la seule tête, qui traversent épaules et poitrine quand la tête tourne ; poids obtenus : tête 47 à 62 %, cou, clavicules, poitrine ; 254 à 950 sommets sortis de la peau par coiffure ; build `LifePlay_Build_5.5_SKIN` ; validé en jeu le 2026-10-02 (les mèches ne traversent plus la peau quand la tête tourne) | `-Skin=rigid` ; `git checkout SKIN-avant -- Source Tools` et remettre les versions précédentes |
| CHG-094 | 2026-10-02 | UI14 | nouveaux `Source/LifePlay/LPVersionSubsystem.h/.cpp`, `Source/LifePlayEditorTools/LPEditWidgetCommandlet.h/.cpp` (+ `Json` dans le `.Build.cs`), `Tools/ui/MainMenu_V1.4.json`, `Docs/Migration/14_Interface_V1.4.md` ; `Content/UI/MainMenu.uasset` (6 modifications, diff conforme) ; `Content/Modules/donors.txt` (→ `Vinfamy`) ; `Config/DefaultGame.ini` (`ProjectVersion=2026.10.4`) | demande utilisateur avant la V1.4 : version année.mois.publication, crédits vidés avec Vinfamy auteur original, Donate → Patreon edujiro5972, Discord → discord.gg/q4689pNSy, Commission masqué ; build `LifePlay_Build_5.5_UI14` : « LifePlay 2026.10.4 » ; validé en jeu le 2026-10-02 (version, crédits, bouton Commission masqué, liens Donate et Discord) | `Tools\Restore.ps1 -Lot UI14` ; `git checkout UI14-avant -- Config Source Content/Modules/donors.txt` |
| CHG-095 | 2026-10-02 | MODS14 | nouveaux `Tools/SplitModules.ps1`, `Tools/modules/V1.4.json`, `Docs/Migration/15_Modules_Optionnels.md` ; build `LifePlay_Build_5.5_Shipping_V1.4` (dossier neuf, contrôlé : pas de fichier périmé) ; archive `D:\Game\LifePlay_Publication\LifePlay_Revival_V1.4_Optional_Modules.zip` (875 812 octets, 626 fichiers, SHA-256 `cd8b4ffa9f676d3703fce9d2b42a0f61682c6c04bda30d033630c8f1be8fd236`) | demande utilisateur : build Shipping réduite à l'essentiel (`vin_Base`, `lp_Revival`, `vin_VanillaRealistic`), 14 modules optionnels à part ; vérifié dans les Blueprints : aucun fichier de module optionnel lu en dur, `GI.removeDeletedMods` retire les modules absents ; build allégé démarré sans plantage ; contrôle en jeu en attente | remettre les dossiers de `LifePlay_Build_5.5_Shipping_V1.4_modules_optionnels` dans le build |

View file

@ -25,6 +25,7 @@ La migration a été reprise le 2026-09-29, après l'échec d'un premier portage
| [12_Reconciliation_Vinfamy.md](12_Reconciliation_Vinfamy.md) | historique | comparaison avec `vinfamy/LifePlay`, fusion d'historique, rien à récupérer |
| [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`) |
| [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`) |

82
Tools/SplitModules.ps1 Normal file
View file

@ -0,0 +1,82 @@
<#
.SYNOPSIS
Separe les modules optionnels d'un build empaquete (Docs/Migration/15_Modules_Optionnels.md).
.DESCRIPTION
Les modules de Content/Modules sont livres en fichiers nus a cote du jeu. Ce script garde dans le build les modules
listes comme essentiels dans le fichier de configuration (Tools/modules/<version>.json) et deplace tous les autres
dans une archive zip, avec l'arborescence LifePlay\Content\Modules\<module>\..., a extraire dans le dossier du jeu
(celui de LifePlay.exe). Une notice LISEZMOI / README est ajoutee a l'archive.
Le jeu gere l'absence d'un module : au demarrage, GI.removeDeletedMods retire de GI.ModEnableds tout module dont le
fichier .lpmod est absent, et GI.IsModEnabled repond alors faux.
Controles : chaque module essentiel doit exister ; nombre de fichiers et d'octets deplaces = contenu de l'archive
(7-Zip, test d'integrite) ; aucun fichier de module optionnel ne reste dans le build. Les fichiers deplaces sont
conserves dans <build>\..\<nom>_modules_optionnels (rien n'est supprime).
.EXAMPLE
.\Tools\SplitModules.ps1 -Build D:\Game\LifePlay_Build_5.5_Shipping_V1.4 -Config Tools\modules\V1.4.json -Out D:\Game\LifePlay_Publication
#>
param(
[Parameter(Mandatory)] [string] $Build,
[Parameter(Mandatory)] [string] $Config,
[Parameter(Mandatory)] [string] $Out
)
$ErrorActionPreference = 'Stop'
$SevenZip = 'C:\Program Files\7-Zip\7z.exe'
$cfg = Get-Content $Config -Raw | ConvertFrom-Json
$modules = Join-Path $Build 'Windows\LifePlay\Content\Modules'
if (-not (Test-Path $modules)) { throw "Dossier des modules introuvable : $modules" }
foreach ($m in $cfg.essential) {
if (-not (Test-Path (Join-Path $modules "$m\$m.lpmod"))) { throw "Module essentiel absent du build : $m" }
}
$optional = Get-ChildItem $modules -Directory | Where-Object { (Test-Path (Join-Path $_.FullName "$($_.Name).lpmod")) -and $_.Name -notin $cfg.essential }
if (-not $optional) { Write-Host 'Aucun module optionnel dans le build.'; return }
# Arborescence de l'archive : LifePlay\Content\Modules\<module>
$stage = Join-Path (Split-Path $Build -Parent) ((Split-Path $Build -Leaf) + '_modules_optionnels')
$target = Join-Path $stage 'LifePlay\Content\Modules'
New-Item -ItemType Directory -Force $target | Out-Null
$files = 0; $bytes = 0
foreach ($m in $optional) {
$items = Get-ChildItem $m.FullName -Recurse -File
$files += $items.Count; $bytes += ($items | Measure-Object Length -Sum).Sum
Move-Item $m.FullName (Join-Path $target $m.Name)
}
$list = ($optional.Name | Sort-Object) -join ', '
$readme = @"
LifePlay Revival $($cfg.version) - modules optionnels / optional modules
FR : extraire cette archive dans le dossier du jeu (celui qui contient LifePlay.exe), en fusionnant le dossier
LifePlay. Les modules apparaissent ensuite dans le gestionnaire de mods du jeu, ou ils s'activent et se desactivent.
vin_NTR est desactive par defaut. Pour retirer un module : supprimer son dossier LifePlay\Content\Modules\<module>.
EN: extract this archive into the game folder (the one containing LifePlay.exe), merging the LifePlay folder. The
modules then appear in the in-game mod manager, where they can be enabled or disabled. vin_NTR is disabled by
default. To remove a module, delete its LifePlay\Content\Modules\<module> folder.
Modules : $list
Contenu adulte, reserve aux adultes / adult content, adults only.
"@
Set-Content (Join-Path $stage 'LISEZMOI_README.txt') $readme -Encoding utf8
New-Item -ItemType Directory -Force $Out | Out-Null
$zip = Join-Path $Out $cfg.zip
if (Test-Path $zip) { throw "L'archive existe deja : $zip" }
Push-Location $stage
& $SevenZip a -tzip -mx=7 $zip 'LifePlay' 'LISEZMOI_README.txt' | Out-Null
Pop-Location
& $SevenZip t $zip | Out-Null
if ($LASTEXITCODE -ne 0) { throw "Test 7-Zip en echec : $zip" }
$zipFiles = (& $SevenZip l -slt $zip | Select-String '^Folder = -').Count - 1 # moins la notice
$left = Get-ChildItem $modules -Directory | Where-Object { $_.Name -in $optional.Name }
$hash = (Get-FileHash $zip -Algorithm SHA256).Hash.ToLower()
Write-Host "Modules gardes dans le build : $($cfg.essential -join ', ')"
Write-Host "Modules optionnels : $($optional.Count) ($list)"
Write-Host "Fichiers deplaces : $files ($bytes octets) ; dans l'archive : $zipFiles fichier(s) de module"
Write-Host "Restes dans le build : $(@($left).Count)"
Write-Host "Archive : $zip ($((Get-Item $zip).Length) octets), SHA-256 $hash"
if ($zipFiles -ne $files -or @($left).Count -ne 0) { throw 'Controle en echec : contenu de l''archive different des fichiers deplaces' }

5
Tools/modules/V1.4.json Normal file
View file

@ -0,0 +1,5 @@
{
"version": "2026.10.4",
"essential": ["vin_Base", "lp_Revival", "vin_VanillaRealistic"],
"zip": "LifePlay_Revival_V1.4_Optional_Modules.zip"
}