2023-02-06 17:46:47 +00:00
|
|
|
param(
|
|
|
|
[Parameter()]
|
|
|
|
[String] $mod_folder,
|
|
|
|
[Switch] $verbos,
|
|
|
|
[Switch] $install,
|
|
|
|
[Switch] $uninstall
|
|
|
|
)
|
|
|
|
|
2023-02-07 06:59:13 +00:00
|
|
|
$packed_explorer_path = '.\bins\spe.exe';
|
|
|
|
$pyhton_path = 'C:\Program Files (x86)\Python\python.exe';
|
|
|
|
$scrapland_path = 'D:\Games\SteamLibrary\steamapps\common\Scrapland';
|
|
|
|
|
|
|
|
if (-not (Test-Path(".\config.ps1"))) {
|
|
|
|
Copy-Item .\config.example.ps1 .\config.ps1;
|
|
|
|
}
|
|
|
|
|
|
|
|
. "$PSScriptRoot\config.ps1"
|
2023-02-06 17:46:47 +00:00
|
|
|
|
|
|
|
$output_path = ".\out"
|
|
|
|
|
|
|
|
$pack_expl_name = 'ScrapPackedExplorerCli';
|
|
|
|
$pack_expl_ver = [version]'0.3.1';
|
|
|
|
|
|
|
|
$userless_err_msgs = @(
|
|
|
|
"ImportError: No module named Scrap",
|
|
|
|
"ImportError: No module named SAI",
|
|
|
|
"ImportError: No module named SAct",
|
|
|
|
"ImportError: No module named SFX",
|
|
|
|
"ImportError: No module named SInput",
|
|
|
|
"ImportError: No module named SLogic",
|
|
|
|
"ImportError: No module named SNet",
|
|
|
|
"ImportError: No module named SScorer",
|
|
|
|
"ImportError: No module named SSound",
|
|
|
|
"ImportError: No module named SVec",
|
|
|
|
"ImportError: No module named SWeap"
|
|
|
|
);
|
|
|
|
|
|
|
|
$folders_exclude = (
|
|
|
|
'bins',
|
|
|
|
'out'
|
|
|
|
);
|
|
|
|
|
|
|
|
function quite_rm($path) {
|
|
|
|
Remove-Item $path 2>&1 | out-null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function is_string_in_array($string, $array) {
|
|
|
|
return $null -ne ($string | Where-Object { $array -match $_ });
|
|
|
|
}
|
|
|
|
|
|
|
|
function disable_colorded_output() {
|
|
|
|
$PSStyle.OutputRendering = [System.Management.Automation.OutputRendering]::PlainText;
|
|
|
|
}
|
|
|
|
|
|
|
|
function check_pack_expl() {
|
2023-02-07 06:59:13 +00:00
|
|
|
if (-not (test-path $packed_explorer_path)) {
|
|
|
|
Write-Output "Error: $pack_expl_name was not found at '$packed_explorer_path'. Please download $pack_expl_name >= $pack_expl_ver";
|
2023-02-06 17:46:47 +00:00
|
|
|
exit 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
# --version outputs to stderr;
|
2023-02-07 06:59:13 +00:00
|
|
|
$err = (& $packed_explorer_path --version) 2>&1;
|
2023-02-06 17:46:47 +00:00
|
|
|
$spe_version = $err[0].ToString();
|
|
|
|
|
|
|
|
$null = $spe_version -match '(?<name>[^\d]+)(?<version>\d.+)';
|
|
|
|
$name, $version = $Matches['name'].TrimEnd('.').Trim(), [version]$Matches['version'];
|
|
|
|
|
|
|
|
$is_pack_expl_good = $name -ne $pack_expl_name -or
|
|
|
|
$version.Major -lt $pack_expl_ver.Major -or
|
|
|
|
$version.Minor -lt $pack_expl_ver.Minor -or
|
|
|
|
$version.Build -lt $pack_expl_ver.Build;
|
|
|
|
|
|
|
|
if ($is_pack_expl_good) {
|
2023-02-07 06:59:13 +00:00
|
|
|
Write-Output "Error: wrong binary at '$packed_explorer_path'. $name >= $version needed.";
|
2023-02-06 17:46:47 +00:00
|
|
|
exit 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function compile_pyhton($mod) {
|
|
|
|
Push-Location $mod
|
|
|
|
|
|
|
|
Get-ChildItem "." -Recurse -Filter *.py | Foreach-Object {
|
|
|
|
Push-Location $_.Directory.FullName
|
|
|
|
|
|
|
|
$file_name = $_.Name
|
|
|
|
|
|
|
|
# NOTE: Pyhton will not compile with `pyhton $file_name` because of import errors
|
|
|
|
# but if we try to import required file it will compile
|
|
|
|
$output = (& $pyhton_path -c "import $file_name") 2>&1
|
|
|
|
|
|
|
|
# Surpressing error messages about Scrap/SInput/etc module not found
|
|
|
|
if (-not (is_string_in_array $output $userless_err_msgs) -or $v -or $verbos) {
|
|
|
|
# Additional empty lines for better errorformat parsing in vim. Check .vimrc for more info
|
|
|
|
Write-Output "$mod/../$file_name";
|
|
|
|
Write-Output ""
|
|
|
|
Write-Output $output
|
|
|
|
Write-Output ""
|
|
|
|
}
|
|
|
|
|
|
|
|
Pop-Location
|
|
|
|
}
|
|
|
|
|
|
|
|
Pop-Location
|
|
|
|
}
|
|
|
|
|
|
|
|
function pack_mod($mod) {
|
|
|
|
quite_rm "$output_path\$mod.packed";
|
|
|
|
|
|
|
|
if (Test-Path $mod\packed\) {
|
2023-02-07 06:59:13 +00:00
|
|
|
& $packed_explorer_path "$output_path\$mod.packed" add -s $mod\packed;
|
2023-02-06 17:56:51 +00:00
|
|
|
return;
|
2023-02-06 17:46:47 +00:00
|
|
|
} else {
|
2023-02-07 06:59:13 +00:00
|
|
|
& $packed_explorer_path "$output_path\$mod.packed" add -s $mod\;
|
|
|
|
& $packed_explorer_path "$output_path\$mod.packed" remove -d README.md;
|
2023-02-06 17:46:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function load_mod($mod) {
|
|
|
|
unload_mod($mod);
|
|
|
|
Copy-Item "$output_path\$mod.packed" $scrapland_path\Mods;
|
|
|
|
}
|
|
|
|
|
|
|
|
function unload_mod($mod) {
|
|
|
|
if (test-path "$scrapland_path\Mods\$mod.packed") {
|
|
|
|
quite_rm "$scrapland_path\Mods\$mod.packed";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# TODO: Not just copy. Copy original file and add content of misc to the end
|
|
|
|
function load_misc($mod) {
|
|
|
|
if (-not (Test-Path $mod\miscs\)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
Copy-Item -Path $mod\mics\* -Destination $scrapland_path\ -Recurse -Force;
|
|
|
|
}
|
|
|
|
|
|
|
|
# TODO:
|
|
|
|
function unload_misc($mod) {
|
|
|
|
}
|
|
|
|
|
|
|
|
function build_mod($mod) {
|
|
|
|
compile_pyhton($mod);
|
|
|
|
pack_mod($mod);
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_mod($mod) {
|
|
|
|
load_mod($mod);
|
|
|
|
load_misc($mod);
|
|
|
|
}
|
|
|
|
|
|
|
|
function uninstall_mod($mod) {
|
|
|
|
unload_mod($mod);
|
|
|
|
unload_misc($mod);
|
|
|
|
}
|
|
|
|
|
|
|
|
function make_all_mods() {
|
|
|
|
Get-ChildItem "." -Dir | Foreach-Object {
|
|
|
|
if (-not (is_string_in_array $_.Name $folders_exclude)) {
|
|
|
|
make_mod($_.Name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function uninstall_all_mods() {
|
|
|
|
Get-ChildItem "." -Dir | Foreach-Object {
|
|
|
|
if (-not (is_string_in_array $_.Name $folders_exclude)) {
|
|
|
|
uninstall_mod($_.Name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function make_mod($mod) {
|
|
|
|
build_mod($mod);
|
|
|
|
|
|
|
|
if ($install) {
|
|
|
|
install_mod($mod);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function main() {
|
|
|
|
disable_colorded_output;
|
|
|
|
check_pack_expl;
|
|
|
|
|
|
|
|
if (-not $mod_folder) {
|
|
|
|
if ($uninstall) { uninstall_all_mods; } else { make_all_mods; }
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (is_string_in_array $mod_folder $folders_exclude) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($uninstall) { uninstall_mod($mod_folder); } else { make_mod($mod_folder); }
|
|
|
|
}
|
|
|
|
|
|
|
|
main
|