83 lines
4.5 KiB
PowerShell
83 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' }
|