skyrim-item-roulette/build.ps1

191 lines
No EOL
5.6 KiB
PowerShell

<#
.SYNOPSIS
Builds the plugin and optionally reloads it in Vortex.
.PARAMETER InstallDependencies
Installs script dependencies with Chocolatey, except Papyrus, and quit
.PARAMETER StartVortex
Start Vortex on the appropriate port and do nothing else.
.PARAMETER Target
Build a specific Makefile target
.PARAMETER Force
Force Make to rebuild (-B)
.PARAMETER KickVortex
Syncs the plugin with Vortex. This option requires Node.js and pnpm to
communicate with Vortex. Keep in mind that this only half works if Vortex
wasn't already started, so if it fails just run the script again.
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 mod staging area, preferably using
setup-dev.ps1 script.
.PARAMETER KickPort
The port for Vortex to listen on.
.PARAMETER Reload
Kills Skyrim before and loads it after building. It completely kills the game
because I had trouble getting hlp and reloadscript commands to work.
#>
param (
[Parameter(Mandatory = $False)]
[Switch]
$InstallDependencies,
[Parameter(Mandatory = $False)]
[Switch]
$StartVortex,
[Parameter(Mandatory = $False)]
[String]
$Target,
[Parameter(Mandatory = $False)]
[Switch]
$Force,
[Parameter(Mandatory = $False)]
[Switch]
$KickVortex,
[Parameter(Mandatory = $False)]
[int]
$KickPort = 6969,
[Parameter(Mandatory = $False)]
[Switch]
$Reload
)
if($InstallDependencies) {
# Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install gimp 7zip autohotkey make nodejs pyenv-win
return 0
}
if($StartVortex) {
Stop-Process -Name Vortex -ErrorAction SilentlyContinue
$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=$KickPort --game=$GameId
return 0
}
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-Object { $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($Reload) {
if($Proc) {
Stop-Process $Proc
}
}
if($Force) {
$MakeB = "-B"
}
make $MakeB -C $PSScriptRoot SKYRIM_BASE=$SkyrimBase $Target
if(-not $LastExitCode -eq 0) {
return $LastExitCode
}
if($KickVortex) {
$env:KICK_PORT=$KickPort
pnpm install -C "$PSScriptRoot"
if(-not $LastExitCode -eq 0) {
return $LastExitCode
}
node "$PSScriptRoot/kick-vortex.js"
if(-not $LastExitCode -eq 0) {
return $LastExitCode
}
}
if($Reload) {
# 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