Port comparisons (FORGE.md section 14): each pair runs an original game from the test library
and its Forge port with the same scripted inputs, on the deterministic clock, and prints TRACE
lines; the port passes when the two traces agree. They need the library beside the repo
(SINGE_LIBRARY, or ~/claude/singetest) and are not part of the reference sweep.
ActionMax: actionMaxOriginal.singe and actionMaxPort.singe, with
-v <library>/ActionMax/frame_<game>.txt and PORT_GAME=<game>
(38AmbushAlley, BlueThunder, Hydrosub2021, PopsGhostly, SonicFury);
the descriptions come from util/forgePortActionMax.py.
compare.sh <family> <game> runs a pair and says whether the traces agree:
testScripts/ports/compare.sh actionMax 38AmbushAlley
Karis: karisOriginal.singe and karisPort.singe, driven by karisDrive.singe, with
-v the video the game's games.dat names, PORT_GAME=<directory> and
PORT_SCRIPT=<main script>; the descriptions come from util/forgePortKaris.lua:
testScripts/ports/compare.sh karis TimeGal/Timegal.singe
ALG: algOriginal.singe and algPort.singe, driven by algDrive.singe, for the American
Laser Games titles of the Hypseus library (Mad Dog McCree, Mad Dog II, Crime
Patrol, Drug Wars, The Last Bounty Hunter, Space Pirates, both Who Shot Johnny
Rocks, and the typing edition of Mad Dog II), with the title's folder as the game:
testScripts/ports/compare.sh alg maddog-hd
PORT_FRAMES=<n> sets the run's length in engine frames (15000 by default) and
PORT_PERFECT=1 plays without a wrong or a missed shot, to walk the whole game.
The views hand the drive each level's shoot window and the first hitbox of the
frame (aimed at the overlap with the next frame's box, since a press is judged a
frame later), the targets of the games' menus and puzzles, and, for the typing
edition, the key the game waits for; the drive shoots, misses on schedule, coins
and starts, continues once, and types.