LifePlay-Revival/Tools/SplitModules.ps1
2026-10-02 20:55:48 +02:00

82 lines
4.5 KiB
PowerShell

<#
.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' }