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