Last active
October 2, 2024 19:56
-
-
Save vexx32/fb3131b740af1602c7eed974ea8d2e46 to your computer and use it in GitHub Desktop.
Starts Noita from the given path, optionally with a specific seed set.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Start-Noita { | |
<# | |
.SYNOPSIS | |
Starts Noita from a PowerShell prompt, optionally with a specific set seed for a new game. | |
.DESCRIPTION | |
To use this function, copy and paste the complete function definition into a PowerShell | |
session, and then invoke it with `Start-Noita`. Supply `-Seed somevalue` if you would like | |
to run a specific seed (see the examples below). | |
.EXAMPLE | |
PS> Start-Noita | |
Starts Noita normally. | |
.EXAMPLE | |
PS> Start-Noita -Seed 1 | |
Starts Noita with a fixed seed value of 1. | |
.EXAMPLE | |
PS> Start-Noita -Seed 1 -Path C:\Noita\noita.exe | |
Starts Noita from the requested location with a fixed seed value of 1. | |
Use this form if your copy of Noita was not installed via Steam, or modify the default | |
setting for $Path below before loading the function into your PowerShell session. | |
.NOTES | |
If you want, you can load this function into your PowerShell profile as follows: | |
1. Copy the entire function definition from top to bottom to your Windows clipboard (Ctrl+C). | |
2. Run the following code in PowerShell: | |
Get-Clipboard | Add-Content -Path $profile | |
3. Close and reopen PowerShell to load the newly modified profile. | |
4. Run `Start-Noita` directly as needed. It will be automatically loaded in any future PowerShell sessions. | |
#> | |
[CmdletBinding(DefaultParameterSetName = 'Default')] | |
param( | |
[Parameter()] | |
[string] | |
$Path = "C:\Program Files (x86)\Steam\steamapps\common\Noita", | |
[Parameter(Position = 0, ParameterSetName = 'Default')] | |
[long] | |
$Seed, | |
[Parameter(ParameterSetName = 'Default')] | |
[switch] | |
$DevMode, | |
[Parameter(Mandatory, ParameterSetName = 'Unpack')] | |
[switch] | |
$UnpackData | |
) | |
$noitaArgs = @() | |
$noitaFolder = $Path | Split-Path -Parent | |
if ($Seed) { | |
$xml = [System.Xml.XmlDocument]::new() | |
$node = $xml.CreateElement('MagicNumbers') | |
$xml.AppendChild($node) > $null | |
$blank = $xml.CreateTextNode([Environment]::NewLine) | |
$node.AppendChild($blank) > $null | |
$node.SetAttribute('WORLD_SEED', $Seed) | |
$node.SetAttribute('_DEBUG_DONT_LOAD_OTHER_MAGIC_NUMBERS', 1) | |
$node.SetAttribute('_DEBUG_DONT_SAVE_MAGIC_NUMBERS', 1) | |
$magicPath = $Path | Join-Path -ChildPath 'magic.txt' | |
$sb = [System.Text.StringBuilder]::new() | |
$xmlWriter = [System.Xml.XmlWriter]::Create( | |
$sb, | |
@{ | |
Indent = $true | |
NewLineOnAttributes = $true | |
OmitXmlDeclaration = $true | |
} | |
) | |
$xml.Save($xmlWriter) | |
$xmlText = $sb.ToString() | |
Write-Verbose $xmlText | |
$xmlText | Set-Content -Path $magicPath | |
$noitaArgs = @( | |
'-no_logo_splashes' | |
'-magic_numbers', 'magic.txt' | |
) | |
} | |
elseif ($UnpackData) { | |
$noitaArgs = @( | |
'-wizard_unpak' | |
) | |
} | |
$filename = if ($DevMode) { | |
'noita_dev.exe' | |
} | |
else { | |
'noita.exe' | |
} | |
$executable = Join-Path $Path -ChildPath $filename | |
try { | |
Push-Location $Path | |
& $executable @noitaArgs | |
} | |
finally { | |
Pop-Location | |
} | |
} |
There doesn't seem to be any way I can find to do this now without mods at present. Other methods may be discovered in future, but presently I think the mods are the best bet.
OK, then how do the mods accomplish it? Mean to say, the 'functionality' still exists and should be scriptable. I haven't looked at any of the seed changer mods. Which simple mod still works? I'll look at the files.
The seed changer mods are lua scripts loaded by Noita itself. It seems the magic_numbers.xml file processing feature was changed in a recent(ish) update to no longer allow setting the world seed via this mechanism.
So the only way currently that I am aware of is you must load a mod in order to force a set seed.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
There doesn't seem to be any way I can find to do this now without mods at present. Other methods may be discovered in future, but presently I think the mods are the best bet.