Per the user: the game never reads the pilot keypad, so the numpad becomes the flight cluster - 8/2/4/6 stick, 7/9 pedals, 0 trigger - with Shift/Ctrl as throttle up/down and Alt as reverse thrust. That frees the entire letter board: W/A/S/D/Q/E return to their printed MFD bank positions and B goes back to being the gap key, so the default profile now carries the complete unmodified vRIO bank layout. The keypad addresses stay bindable (arcade key events) but ship unbound. Alt as a held flight control meant every release popped the window menu and stole focus - WndProc now eats SC_KEYMENU. Shift/Ctrl/Alt key-name aliases added to the parser alongside the .NET names. Profile parses clean (59 key buttons, 8 key axes); single-player cycle and key-bomb tests green (Alt+Q abort unaffected). Machines with an existing bindings.txt keep their old map - delete the file to take the new defaults. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
144 lines
5.9 KiB
PowerShell
144 lines
5.9 KiB
PowerShell
# ============================================================================
|
|
# pack-dist.ps1 — assemble a runnable Red Planet 4.12 package into dist\
|
|
# ============================================================================
|
|
#
|
|
# Collects everything the game needs at run time:
|
|
# - Release\rpl4opt.exe (+ .pdb for crash debugging)
|
|
# - game data from assets\RP411 (AUDIO, GAUGE, VIDEO, INIs, RPL4.RES,
|
|
# TEST.EGG) — but not the arcade launch scripts or the old 4.10 exe
|
|
# - libsndfile-1.dll beside the exe; OpenAL32.dll copied from the system
|
|
# when installed, with oalinst.exe included as the fallback installer
|
|
# - a desktop environ.ini (PAD;KEYBOARD controls, on-screen plasma)
|
|
# - start-windowed.bat and a README
|
|
#
|
|
# Usage: powershell -ExecutionPolicy Bypass -File pack-dist.ps1 [-Zip]
|
|
#
|
|
param(
|
|
[switch]$Zip
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
$root = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$dist = Join-Path $root 'dist'
|
|
$assets = Join-Path $root 'assets\RP411'
|
|
$exe = Join-Path $root 'Release\rpl4opt.exe'
|
|
|
|
if (-not (Test-Path $exe)) {
|
|
throw "Release\rpl4opt.exe not found - build first (see BUILD.md 2)."
|
|
}
|
|
|
|
# Refuse to touch a dist the game is currently running from.
|
|
$running = Get-Process rpl4opt -ErrorAction SilentlyContinue |
|
|
Where-Object { $_.Path -like "$dist\*" }
|
|
if ($running) {
|
|
throw "rpl4opt.exe is running from $dist (PID $($running.Id)) - close the game first."
|
|
}
|
|
|
|
Write-Host "Packing into $dist"
|
|
if (Test-Path $dist) { Remove-Item -Recurse -Force $dist }
|
|
New-Item -ItemType Directory -Force "$dist\SPOOLS" | Out-Null
|
|
|
|
# --- game binary -----------------------------------------------------------
|
|
Copy-Item $exe $dist
|
|
$pdb = Join-Path $root 'Release\rpl4opt.pdb'
|
|
if (Test-Path $pdb) { Copy-Item $pdb $dist }
|
|
|
|
# steam_api.dll: the exe imports it (RP412_STEAM build). The Steam wire
|
|
# only activates with RP412STEAM=1; plain desktop runs never touch it.
|
|
Copy-Item (Join-Path $root 'extern\steamworks_sdk_164\sdk\redistributable_bin\steam_api.dll') $dist
|
|
|
|
# --- game data -------------------------------------------------------------
|
|
foreach ($dir in 'AUDIO', 'GAUGE', 'VIDEO') {
|
|
Write-Host " copying $dir..."
|
|
Copy-Item -Recurse (Join-Path $assets $dir) $dist
|
|
}
|
|
foreach ($file in 'RPDPL.INI', 'JOYSTICK.INI', 'RPL4.RES', 'TEST.EGG',
|
|
'libsndfile-1.dll', 'oalinst.exe') {
|
|
Copy-Item (Join-Path $assets $file) $dist
|
|
}
|
|
|
|
# --- OpenAL runtime --------------------------------------------------------
|
|
# The exe links OpenAL32.dll (32-bit). Prefer shipping the already-installed
|
|
# runtime beside the exe; oalinst.exe covers machines where that misses.
|
|
$openal = "$env:WINDIR\SysWOW64\OpenAL32.dll"
|
|
if (-not (Test-Path $openal)) { $openal = "$env:WINDIR\System32\OpenAL32.dll" }
|
|
if (Test-Path $openal) {
|
|
Copy-Item $openal $dist
|
|
$wrap = Join-Path (Split-Path $openal) 'wrap_oal.dll'
|
|
if (Test-Path $wrap) { Copy-Item $wrap $dist }
|
|
Write-Host " OpenAL runtime copied from $(Split-Path $openal)"
|
|
} else {
|
|
Write-Warning "OpenAL32.dll not found on this system - dist relies on oalinst.exe"
|
|
}
|
|
|
|
# --- desktop configuration -------------------------------------------------
|
|
Set-Content -Path "$dist\environ.ini" -Encoding ascii -Value @"
|
|
L4CONTROLS=PAD;KEYBOARD
|
|
DPLARG=1
|
|
L4DPLCFG=RPDPL.INI
|
|
L4GAUGE=640x480x16
|
|
L4PLASMA=SCREEN
|
|
L4MFDSPLIT=1
|
|
TARGETFPS=60
|
|
RP412STEAM=1
|
|
"@
|
|
|
|
Set-Content -Path "$dist\start-windowed.bat" -Encoding ascii -Value @"
|
|
@echo off
|
|
rem Red Planet 4.12 - desktop prototype. Boots into the race-setup
|
|
rem front end; the cockpit canvas is 1920x1080 and -res matches it.
|
|
rem (Add -egg TEST.EGG to skip the menu and run the canned mission.)
|
|
cd /d "%~dp0"
|
|
start rpl4opt.exe -windowed -res 1920 1080
|
|
"@
|
|
|
|
Set-Content -Path "$dist\README.txt" -Encoding ascii -Value @"
|
|
Red Planet 4.12 - desktop prototype
|
|
===================================
|
|
|
|
Run start-windowed.bat (or: rpl4opt.exe -windowed -res 800 600 -egg TEST.EGG).
|
|
No cockpit hardware needed. If there is no sound, run oalinst.exe once.
|
|
|
|
Controls (XInput controller and/or keyboard) - EVERY input is
|
|
rebindable: edit bindings.txt beside the exe (written with the full
|
|
documented default layout on first run; delete it to restore).
|
|
|
|
Left stick / NumPad 8462 joystick (8=fwd 2=back 4=left 6=right)
|
|
LT / RT or NumPad 7,9 left / right pedal
|
|
Right stick Y throttle (holds position)
|
|
Shift / Ctrl throttle up / down
|
|
A / Space / NumPad 0 joystick trigger
|
|
RB / Alt reverse thrust
|
|
DPad / arrow keys joystick hat (look)
|
|
Start,Back / 9,0 config buttons
|
|
Number+letter rows MFD bank buttons (as printed on the panel)
|
|
F1-F12 secondary / screen columns
|
|
Alt+Q abort the mission (score banked)
|
|
|
|
The full pod cockpit comes up in a single window: three green MFDs
|
|
across the top, the 3D viewscreen centered with the orange plasma glass
|
|
at its left, and the lower MFDs flanking the portrait map. The red
|
|
buttons around each MFD and the amber buttons beside the map are the
|
|
pod's real button banks: click them with the mouse, and they light up
|
|
as the game commands their lamps.
|
|
environ.ini options: L4PADFLIP=XY inverts the stick axes, L4MFDSCALE=n
|
|
sizes the MFD/map windows (percent, default 50), L4PLASMASCALE=n sets
|
|
the plasma pixel size (default 4), L4PLASMAPOS=x,y places the plasma.
|
|
|
|
Known prototype notes: pods race untextured (the player1-8 skins come
|
|
from the presets system, not shipped data), and text drawn on the plasma
|
|
glass may appear rotated.
|
|
|
|
Source: https://gitea.mysticmachines.com/VWE/RP412
|
|
"@
|
|
|
|
# --- summary / optional zip ------------------------------------------------
|
|
$size = (Get-ChildItem $dist -Recurse | Measure-Object Length -Sum).Sum
|
|
Write-Host ("dist ready: {0:N1} MB" -f ($size / 1MB))
|
|
|
|
if ($Zip) {
|
|
$zipPath = Join-Path $root 'dist\RedPlanet412-prototype.zip'
|
|
Write-Host "zipping to $zipPath..."
|
|
Compress-Archive -Path "$dist\*" -DestinationPath $zipPath -Force
|
|
}
|