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:
parent
cde3e4b0ce
commit
4b8688b895
5 changed files with 133 additions and 0 deletions
44
Docs/Migration/15_Modules_Optionnels.md
Normal file
44
Docs/Migration/15_Modules_Optionnels.md
Normal 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.
|
||||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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
82
Tools/SplitModules.ps1
Normal 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
5
Tools/modules/V1.4.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"version": "2026.10.4",
|
||||
"essential": ["vin_Base", "lp_Revival", "vin_VanillaRealistic"],
|
||||
"zip": "LifePlay_Revival_V1.4_Optional_Modules.zip"
|
||||
}
|
||||
Loading…
Reference in a new issue