skyrim-item-roulette/build.ps1

197 lines
No EOL
5.8 KiB
PowerShell

<#
.SYNOPSIS
Builds the plugin and optionally reloads it in Vortex.
.PARAMETER Scripts
Build Papyrus scripts
.PARAMETER Models
Build Blender models
.PARAMETER Textures
Build GIMP textures
.PARAMETER Zip
Build the ZIP AND NOTHING ELSE. You probably don't want this option
.PARAMETER KickVortex
Syncs the plugin with Vortex. If there are file conflicts, take changes
from the game directory! This will have changes from the ESP that were
made in Creation Kit! You need to symlink the /plugin directory into
the staging area, preferably using setup-dev.ps1 script.
.PARAMETER Reload
Reloads Skyrim after building. It completely kills and restarts the game
as I had trouble getting hlp and reloadscript commands to work.
#>
param (
[Parameter(Mandatory = $False)]
[Switch]
$Scripts,
[Parameter(Mandatory = $False)]
[Switch]
$Models,
[Parameter(Mandatory = $False)]
[Switch]
$Textures,
[Parameter(Mandatory = $False)]
[Switch]
$Zip,
[Parameter(Mandatory = $False)]
[Switch]
$KickVortex,
[Parameter(Mandatory = $False)]
[Switch]
$Reload
)
if(-not $Scripts -and -not $Models -and -not $Textures -and -not $Zip) {
$Scripts = $true
$Textures = $true
$Models = $true
$Zip = $true
}
New-Item -ItemType Directory "$PSScriptRoot/build" -ErrorAction SilentlyContinue
Add-Type -Path "$PSScriptRoot/Gameloop.Vdf.dll" -ErrorAction SilentlyContinue
$Proc = Get-Process Skyrim*
# Use the running instance
if($Proc) {
$Wmi = Get-WmiObject -Class win32_process -filter "ProcessId=$($Proc.Id)"
$SkyrimBase = Split-Path $Wmi.ExecutablePath
}
# Check for Steam version
if(-not $SkyrimBase) {
if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64") {
$steamInstallPath = "${env:ProgramFiles(x86)}/Steam"
}
else {
$steamInstallPath = "$env:ProgramFiles/Steam"
}
$libraryFolders = [Gameloop.Vdf.VdfConvert]::Deserialize((Get-Content "$steamInstallPath/steamapps/libraryfolders.vdf") -join "`n")
$steamLibraries = @()
$steamLibraries += @($steamInstallPath)
$steamLibraries += Get-Member -InputObject $libraryFolders.Value -MemberType Dynamic | where-object -Property Name -Match "[0-9]+" | foreach { $libraryFolders.Value[$_.Name].ToString() }
$manifestPath = $None
foreach($steamLibrary in $steamLibraries) {
$manifestPath = Get-Item -Path @(
"$steamLibrary/steamapps/appmanifest_611670.acf",
"$steamLibrary/steamapps/appmanifest_489930.acf",
"$steamLibrary/steamapps/appmanifest_72850.acf"
) -ErrorAction SilentlyContinue | Select-Object -First 1
if($manifestPath) {
Write-Host "Manifest found at $($manifestPath.FullName)"
break
}
}
if($manifestPath) {
$appManifest = [Gameloop.Vdf.VdfConvert]::Deserialize((Get-Content $manifestPath) -join "`n")
$installDir = $appManifest.Value["installdir"].ToString()
$SkyrimBase = "$(Split-Path $manifestPath)/common/$installDir"
}
}
# Default to non-Steam version
if(-not $SkyrimBase) {
$SkyrimBase = (Get-Item -Path @(
"$env:ProgramFiles/Bethesda*/*Skyrim*"
"${env:ProgramFiles(x86)}/Bethesda*/*Skyrim*"
)).FullName
}
if($Scripts) {
# Compile the scripts
& "$SkyrimBase/Papyrus Compiler/PapyrusCompiler.exe" `
"$PsScriptRoot/Source/Scripts" `
"-f=$SkyrimBase/Data/Source/Scripts/TESV_Papyrus_Flags.flg" `
"-i=$SkyrimBase/Data/Source/Scripts;$PsScriptRoot/Source/Scripts" `
"-o=$PsScriptRoot/plugin/Data/Scripts" `
"-all"
if($LastExitCode -ne 0) {
return $LastExitCode
}
}
if($Textures) {
Push-Location "$PSScriptRoot"
gimp-console -n -i --batch-interpreter python-fu-eval -b "import export_gimp_textures"
if($LastExitCode -ne 0) {
return $LastExitCode
}
Pop-Location
}
if($Models) {
blender --background --python "$PSScriptRoot/export_blender_models.py"
if($LastExitCode -ne 0) {
return $LastExitCode
}
}
if($Zip) {
# ZIP up the deployment package
$ZipPath = "$PSScriptRoot/build/Item Roulette for VRIK.zip"
Remove-Item $ZipPath -ErrorAction SilentlyContinue
Compress-Archive -Path $PSScriptRoot/plugin/* -DestinationPath $ZipPath
}
if($KickVortex) {
# Restart Vortex and kick off deploy-mods event via Chrome Debug Protocol.
Stop-Process -Name Vortex -ErrorAction SilentlyContinue
$env:KICK_PORT=6969
$VortexPath = (Get-ItemProperty HKLM:\SOFTWARE\57979c68-f490-55b8-8fed-8b017a5af2fe).InstallLocation
$GameId = (Get-Item "$env:APPDATA/Vortex/skyrim*").BaseName
& "$VortexPath/Vortex.exe" --remote-debugging-port=$env:KICK_PORT --game=$GameId
pnpm install -C "$PSScriptRoot"
node "$PSScriptRoot/kick-vortex.js"
Stop-Process -Name Vortex -ErrorAction SilentlyContinue
}
if($Reload) {
if($Proc) {
Stop-Process $Proc
}
# Prefer SKSE loader if we have it installed
$SkyrimExe = Get-Item -Path @(
"$SkyrimBase/skse*_loader.exe",
"$SkyrimBase/Skyrim*.exe"
) | Select-Object -First 1
Start-Process -WorkingDirectory $SkyrimExe.DirectoryName -FilePath $SkyrimExe
# Send JSON command to load first autosave. Doesn't currently work.
do {
$wrFail = $None
Start-Sleep -Seconds 1
Invoke-WebRequest -Uri "http://localhost:8558/api/command" `
-Method Post `
-ErrorVariable $wrFail `
-ContentType 'application/json' `
-Headers @{ Accept = 'application/json' } `
-Body @"
{ "command": "load \"autosave1\" " }
"@
} while ($wrFail)
}
return 0