param( [Parameter()] [String] $mod_folder, [Switch] $verbos, [Switch] $install, [Switch] $uninstall ) $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" $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() { 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"; exit 1; } # --version outputs to stderr; $err = (& $packed_explorer_path --version) 2>&1; $spe_version = $err[0].ToString(); $null = $spe_version -match '(?[^\d]+)(?\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) { Write-Output "Error: wrong binary at '$packed_explorer_path'. $name >= $version needed."; 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\) { & $packed_explorer_path "$output_path\$mod.packed" add -s $mod\packed; return; } else { & $packed_explorer_path "$output_path\$mod.packed" add -s $mod\; & $packed_explorer_path "$output_path\$mod.packed" remove -d README.md; } } 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