From 4b8688b895e30fc50716bd0cdc86dec8af305c0a Mon Sep 17 00:00:00 2001 From: edujiro5972 <336072401+edujiro5972@users.noreply.github.com> Date: Fri, 2 Oct 2026 20:55:48 +0200 Subject: [PATCH] MODS14 : build Shipping V1.4 reduite aux modules essentiels, modules optionnels dans une archive separee Co-Authored-By: Claude Opus 5.5 --- Docs/Migration/15_Modules_Optionnels.md | 44 +++++++++++++ Docs/Migration/Journal_Modifications.md | 1 + Docs/Migration/README.md | 1 + Tools/SplitModules.ps1 | 82 +++++++++++++++++++++++++ Tools/modules/V1.4.json | 5 ++ 5 files changed, 133 insertions(+) create mode 100644 Docs/Migration/15_Modules_Optionnels.md create mode 100644 Tools/SplitModules.ps1 create mode 100644 Tools/modules/V1.4.json diff --git a/Docs/Migration/15_Modules_Optionnels.md b/Docs/Migration/15_Modules_Optionnels.md new file mode 100644 index 0000000..6027e1b --- /dev/null +++ b/Docs/Migration/15_Modules_Optionnels.md @@ -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 `_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. diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index bb72a74..d92c4a0 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -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\\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 | diff --git a/Docs/Migration/README.md b/Docs/Migration/README.md index 1db0f92..4c37c3a 100644 --- a/Docs/Migration/README.md +++ b/Docs/Migration/README.md @@ -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`) | diff --git a/Tools/SplitModules.ps1 b/Tools/SplitModules.ps1 new file mode 100644 index 0000000..49c7167 --- /dev/null +++ b/Tools/SplitModules.ps1 @@ -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/.json) et deplace tous les autres + dans une archive zip, avec l'arborescence LifePlay\Content\Modules\\..., 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 \..\_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\ +$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\. + +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\ 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' } diff --git a/Tools/modules/V1.4.json b/Tools/modules/V1.4.json new file mode 100644 index 0000000..1f0bd08 --- /dev/null +++ b/Tools/modules/V1.4.json @@ -0,0 +1,5 @@ +{ + "version": "2026.10.4", + "essential": ["vin_Base", "lp_Revival", "vin_VanillaRealistic"], + "zip": "LifePlay_Revival_V1.4_Optional_Modules.zip" +}