<# .SYNOPSIS Launch a RomM-served Pokémon PC hack (RPG Maker XP / Essentials) from Playnite. .DESCRIPTION The RomM Playnite plugin downloads each `windows`-platform hack and extracts the zip into a folder. These are RPG Maker XP / Pokémon Essentials games whose launcher is `Game.exe` at the extracted folder root, and RGSS REQUIRES the working directory to be that folder (relative paths to Data/, Audio/, Graphics/). This script takes whatever path Playnite hands it (the extracted folder, a file inside it, or the zip's sibling folder), locates the correct Game.exe (shallowest match, ignoring dev tools like animmaker.exe / RPGXP.exe), sets CWD, and runs it. Register it in Playnite as a Custom emulator (see scripts/README or the vault ROM Library note) so every `windows` hack imported from RomM uses it. .PARAMETER Target Path Playnite passes — typically {ImagePath} or {StartupDir}. May be a file or a directory; the script resolves the game folder from either. .EXAMPLE powershell -ExecutionPolicy Bypass -File launch-pc-hack.ps1 "{ImagePath}" #> [CmdletBinding()] param( [Parameter(Mandatory = $true, Position = 0)] [string]$Target ) $ErrorActionPreference = 'Stop' # dev/editor exes that ship alongside the game but are NOT the launcher $ignore = @('animmaker.exe', 'rpgxp.exe', 'rgss', 'editor.exe', 'unins', 'setup.exe') function Find-GameExe([string]$root) { # Prefer Game.exe; fall back to the shallowest non-ignored .exe. $candidates = Get-ChildItem -LiteralPath $root -Recurse -File -Filter '*.exe' -ErrorAction SilentlyContinue | Where-Object { $n = $_.Name.ToLower(); -not ($ignore | Where-Object { $n -like "*$_*" }) } | Sort-Object { ($_.FullName -split '[\\/]').Count } # shallowest first $game = $candidates | Where-Object { $_.Name -ieq 'Game.exe' } | Select-Object -First 1 if (-not $game) { $game = $candidates | Select-Object -First 1 } return $game } # Resolve the starting directory from whatever Playnite passed. if (Test-Path -LiteralPath $Target -PathType Leaf) { $start = Split-Path -LiteralPath $Target -Parent } elseif (Test-Path -LiteralPath $Target -PathType Container) { $start = $Target } else { throw "launch-pc-hack: path not found: $Target" } $exe = Find-GameExe $start if (-not $exe) { # The extracted game may sit one level up (Playnite handed us a sibling file). $exe = Find-GameExe (Split-Path -LiteralPath $start -Parent) } if (-not $exe) { throw "launch-pc-hack: no Game.exe found under $start" } $dir = Split-Path -LiteralPath $exe.FullName -Parent Write-Host "Launching $($exe.Name) in $dir" # RGSS needs CWD = game folder. Start and wait so Playnite tracks play session. Start-Process -FilePath $exe.FullName -WorkingDirectory $dir -Wait