More game testing, enhancements, and bug fixes.

This commit is contained in:
Scott Duensing 2026-10-20 17:47:19 -05:00
parent 7926c55983
commit 2795f8bbf5
64 changed files with 1114 additions and 0 deletions

205
PLAN.md Normal file
View file

@ -0,0 +1,205 @@
# JoeyAGI plan: every Sierra AGI game
The goal is to run every Sierra AGI release. STATUS.md records where each
subsystem and command stands; this file is the road there. References:
Sierra's own interpreters, run as black boxes in DOSBox (`scripts/oracle.sh`),
and, since October 2026, the open-source implementations, ScummVM's AGI engine
first. They are read for behavior, never copied: ScummVM is GPL and JoeyAGI is
MIT. Where a source and Sierra's interpreter disagree, Sierra's interpreter
wins.
## Decisions (Scott, 2026-10-19)
| Question | Decision |
|----------|----------|
| Scope | Every DOS release of the 16 Sierra AGI titles, then the other releases (Phase 5) |
| Bugs in Sierra's game scripts that ScummVM patches | Patch them |
| Copy protection | Skip it, as ScummVM does for Gold Rush |
| Mouse | Add AGI v3's mouse: click-to-walk, the mouse commands, mouse menus |
| Save games | Keep JoeyAGI's own format; do not read Sierra's `*SG.n` files |
| Random numbers | Match Sierra's generator, so runs can be compared exactly |
## The games
Sixteen titles: King's Quest 1 to 4, Space Quest 1 and 2, Police Quest 1,
Leisure Suit Larry 1, Black Cauldron, Gold Rush, Manhunter 1 and 2, Mixed-Up
Mother Goose, Donald Duck's Playground, the AGI demos, and the 1986 Christmas
card. `games/` holds all sixteen and four fan games. ScummVM's detection
table (~/claude/scratch/joeyagi/scummvmAgi) names the known releases by
their directory files' MD5s.
On 2026-10-20 Scott's copy of the eXo ScummVM collection
(~/Downloads/eXo/eXoScummVM/eXo/eXoScummVM: read, never changed) added nine
releases to `games/` and the other machines' releases to `games/machines/`
(Phase 5, which test-agi.sh does not run yet): 13 Amiga, 11 Apple IIgs, 10
Atari ST, and 10 Macintosh. eXo's folders hold only the data, because eXo plays
them in ScummVM. Where a release lacks Sierra's interpreter, one of the same
version stands in (the "Interpreter" column), so the oracle can run it.
Still to obtain (asked of Scott 2026-10-20), each with Sierra's interpreter
files:
- Sierra's 3.002.086 (any DOS King's Quest IV AGI as shipped);
- 2.089 (Space Quest 1 1.0X, 1986-09-24) and 2.230 (the Christmas card's
version 1, 1986-10-13);
- a stock 2.936 (King's Quest III 2.14 or Space Quest II 2.0D/2.0F as
shipped), to confirm the copy in Caitlyn's Destiny;
- older releases on interpreters already covered (King's Quest 1 1.0U, King's
Quest III 1.01, Space Quest 1 1.1A, King's Quest 2 2.1, Donald Duck's
Playground 1.50, Police Quest 2.0E, the demos);
- the booter disk images (Phase 5).
| Folder | Game | Interpreter (AGIDATA.OVL) | Data |
|--------|------|---------------------------|------|
| bc | Black Cauldron | 2.439 | 386 KB |
| kq1 | King's Quest 1 | 2.917 | 344 KB |
| kq2 | King's Quest 2 | 2.917 | 488 KB |
| kq3 | King's Quest 3 | 2.435 | 651 KB |
| lsl1 | Leisure Suit Larry 1 | 2.440 | 455 KB |
| mmg | Mixed-Up Mother Goose | 2.915 | 401 KB |
| pq1 | Police Quest 1 | 2.903 | 700 KB |
| sq1 | Space Quest 1 | 2.426 | 529 KB |
| sq2 | Space Quest 2 | 2.912 | 644 KB |
| gr | Gold Rush | 3.002.149 (v3) | 1174 KB |
| mh1 | Manhunter: New York | 3.002.107 (v3) | 1034 KB |
| mh2 | Manhunter 2: San Francisco | 3.002.149 (v3) | 1189 KB |
| agidemo1 | AGI Demo 1, 1987-05-20 | 2.425 | 168 KB |
| agidemo2a | AGI Demo 2, 1987-11-24, 5.25" version 1 (its VOL.3, the second disk, is agidemo2b's: every entry matches) | 2.915 | 385 KB |
| agidemo2b | AGI Demo 2, 1987-11-24, 3.5" | 2.915 | 382 KB |
| agidemo2c | AGI Demo 2, 1987-11-25, 5.25" version 2 | 2.917 | 276 KB |
| agidemo3 | AGI Demo 3, 1988-09-13 | 3.002.102 (v3, DMDIR) | 247 KB |
| kq4gs | King's Quest IV, Apple IIgs 1.0K, 1988-11-22 (three 800K disks; IIgs font AGIFONT and instruments SIERRASTANDARD; Sierra's IIgs interpreter KQ4.SYS16) | IIgs 2.006, as DOS 3.002.086 (v3, KQ4DIR) | 1417 KB |
| xmas | The Christmas card, 1986-11-13 (version 2) | 2.272 | 178 KB |
| ddp | Donald Duck's Playground: a cracked PC booter image (DONALD.IMG) and its DOS launcher | booter (Phase 5) | 273 KB |
| kq6agi | King's Quest VI AGI demake (fan, Brandon Kouri) | 2.917 | 1469 KB |
| sqtlc | Space Quest: The Lost Chapter, mouse version (fan; AGI Mouse interpreter) | 2.917 | 1550 KB |
| sq0 | Space Quest 0: Replicated (fan; its interpreter is a Windows program) | none (2.435 assumed) | 1032 KB |
| kq3v214 | King's Quest III 2.14, 1988-03-15, 3.5" (eXo; its sound 36 shipped cut to 1035 of its 2281 bytes) | 2.936, from caitlyn | 643 KB |
| sq2v20f | Space Quest II 2.0F, 1989-01-05, 3.5" (eXo) | 2.936, from caitlyn | 637 KB |
| pq1v20g | Police Quest 2.0G, 1987-12-03 (eXo) | 2.917, AGI Tetris's (fan; kq1's quits at once on this game) | 694 KB |
| bcv210 | Black Cauldron 2.10, 1988-11-10, 5.25" (eXo; AGI 3) | 3.002.149: gr's, its built-in file prefix changed from GR to BC (a v3 interpreter carries its game's prefix, at 0x60D7) | 300 KB |
| mh2v303 | Manhunter 2 3.03, 1989-08-17, 5.25" (eXo) | 3.002.149, mh2's (3.02) | 1183 KB |
| grv201 | Gold Rush 2.01, 1988-12-22, 3.5", the original (eXo). gr, which ScummVM lists as pirated, is a cracked copy: its logic 129, the speed test, is the original's logic 73 | 3.002.149 (its own) | 1169 KB |
| kq4 | King's Quest IV 2.3, 1988-09-27, DOS (eXo) | none here (3.002.086, by its KQ4 prefix) | 1360 KB |
| ddpst | Donald Duck's Playground 1.0A, 1986-08-08: the Atari ST release's files, which eXo files as DOS | none (2.435 assumed; ScummVM takes 2.272) | 165 KB |
| caitlyn | Caitlyn's Destiny (fan, eXo): the source of the 2.936 interpreter (its AGI.COM is Sierra's SIERRA.COM; no fan hack files) | 2.936 | 1258 KB |
Starting point (2026-10-19): every v2 game but Mixed-Up Mother Goose boots
through its title into play on the host harness; Mother Goose stays black; the
v3 games cannot load yet.
Progress (2026-10-19, end of day):
- Phase 0: oracle.sh runs any game's sessions (tests/GAME/*.scr) on that
game's own loader and interpreter, and the probes on any v2 interpreter
(ORACLE_INTERP). Every v2 game has a start session in test-agi.sh
(49/49). The logic trace is AGI_HOST_VM_TRACE. Sierra's random generator
is in (read from 2.915; see STATUS.md). The timing and clock probes match
on 2.426 and 2.439; the other probes on the other interpreters are still
to run.
- Phase 1: Mother Goose plays (start, set.simple's pointer list of
players, the name, the face, the bedroom, the first room, F5 saving
under the name, restoring it). 0xAA to 0xB6 and test 0x13 are in, each
in its versions; the version keeps all three parts; the cycle and motion
modes share Sierra's four bytes; wander and follow.ego are Sierra's. Six
more differences found and fixed (STATUS.md, bugs 21 to 26).
- The oracle's shots drifted: each DOSBox screenshot's real cost was added
to the script's waits (about 1.5 s over twelve shots). Fixed: dosDrive.py
keeps each step at its time from the interpreter's start (DOSBox's log
line for the graphics mode), as the host harness's virtual clock does.
- Phase 2 (2026-10-20): done but for speed and memory (Phase 4).
- The v3 loader (agiRes.c: <prefix>DIR, LZW, nibble pictures, clear
messages in packed logics). Gold Rush, Manhunter 1 and 2, Demo 3, Black
Cauldron 2.10, and King's Quest IV (DOS and Apple IIgs) load every
resource and start. Every DOS v3 release with an interpreter here starts
as on Sierra's, run as <prefix>.COM.
- 3.002.086's rules for King's Quest IV and v3's draw and new.room rules.
- The mouse (agiMouse.c): the pointer, click-to-walk, the mouse commands,
and the menus and message windows by pointer (tests/kq3/mouse.scr, on
the host).
- agiPatch.c: King's Quest IV's zombie distance; its manual question and
Gold Rush's quiz skipped; Gold Rush's clock fed the real cycle rates.
- The eXo releases (above): King's Quest III 2.14 and Space Quest II 2.0F
match Sierra's 2.936 at the start, and Police Quest 2.0G, Black Cauldron
2.10, and Manhunter 2 3.03 match theirs. test-agi.sh 94/94.
## Phase 0: a test bench for every game
1. `scripts/oracle.sh` for any game, each run on its own interpreter (each game
folder ships one, or one of the same version stands in: fourteen versions
from 2.272 to 3.002.149).
2. The probe games run on every one of those interpreters, to measure what
differs between real versions (ScummVM treats every 2.426 to 2.440
interpreter as one); v3 interpreters need the probes in v3 format.
3. A logic trace (rooms, logics called, commands) for finding hangs.
4. Smoke sessions for every game in `scripts/test-agi.sh`, as King's Quest III
has.
5. Sierra's random number generator, matched (decision 6).
## Phase 1: every DOS v2 game (interpreters 2.089 to 2.936)
- Mixed-Up Mother Goose's black screen. Leads: the startup flags, hold.key,
set.simple, a window over the menu bar, writing v11.
- Commands 0xAA to 0xB6 and test 0x13, each in the versions that have it:
set.simple, push.script, pop.script, hold.key, set.pri.base, discard.sound,
hide.mouse, allow.menu, show.mouse, fence.mouse, get.mse.posn, release.key,
adj.ego.move.to.x.y, in.motion.using.mouse.
- Version rules: print.at with 3 arguments below 2.089 and quit with none on
2.089; move.obj's first step at once only above 2.272; loop changes that
ignore step time at 2.272 and below; save and restore stop the sound from
2.272; the 2.230 view mirror format; the note envelopes of 2.900 and 3.000.
- What some games rely on: motion and cycling sharing storage (King's Quest 1's
eagle, Black Cauldron's witches), strings surviving restart (Space Quest 2),
stopping a sound setting its flag (Police Quest 1), a tight clock-polling loop
yielding (Police Quest 1's poker).
- Sierra's script bugs, patched (decision 2): King's Quest 1's bow to the king,
King's Quest III's endless fall, the Rosella staircase and the room 77 talk,
Larry's leaving the store without paying, Space Quest 1's spider droid and
its exploding Roger (f103 still set when picture 20 is drawn).
- The interpreter version keeps all three parts (3.002.086 against 3.002.149).
## Phase 2: AGI v3 (Gold Rush, Manhunter 1 and 2, King's Quest IV, later Black Cauldron)
- The loader: `<prefix>DIR` with four section offsets, `<prefix>VOL.n`, the
7-byte resource header, LZW (9 to 11 bits, 0x100 resets, 0x101 ends),
pictures with 4-bit arguments to F0 and F2, messages not encrypted in
compressed logics.
- 3.002.086 (King's Quest IV): loops chosen for any loop count, the x <= 0 left
border, the priority-to-row glitch, one-argument hide.mouse and hold.key, the
zombie's distance (patched).
- v3 rules: draw reapplies loop and cel; new.room cancels a mouse walk;
allow.menu and release.key from 3.098.
- The mouse (decision 4): click-to-walk, the mouse commands, clicking the menu
bar and message windows, on every port.
- Game rules (done 2026-10-20): Gold Rush's clock fed the real cycle rates
(v165 and v167, which its speed test sets for a 1988 PC), and its book quiz
skipped (decision 3). ScummVM's Manhunter rule, Enter as Space when the
input line is off, is not needed: both games map Enter to Space's
controller themselves.
- Speed and memory: LZW on the 8 MHz machines, 1.2 MB of data.
## Phase 3: every game played through
- A scripted walkthrough per game on the host harness (virtual time): the main
path, deaths, the score, the endings, checked at checkpoints against the
game's own interpreter.
- Copy-protection quizzes skipped (decision 3); Larry's age quiz has its
own way past, Alt+X (a set.key that sets f109).
## Phase 4: every game on every machine
IIgs, Amiga, ST, X68000, DOS, and the hosted ports: memory, speed at 8 MHz,
disks (a CFFA2 volume per game on the IIgs; every game fits in 2 MB), and the
four-voice sound by ear.
## Phase 5: the other releases
- Amiga, Atari ST, Apple IIgs, Macintosh, and CoCo3 data: 4-byte OBJECT entries
on the Amiga, the `dirs` and `vol.N` file names, each machine's palettes and
font, and its sound: the IIgs's sampled instruments and MIDI-like music, the
CoCo3's and Apple II's own note formats.
- The v1 booter disk images: King's Quest 2, Black Cauldron, Donald Duck's
Playground (directories on disk sectors, the v1 command set, v1 words and
sound).
- The Apple II disk images.
- The Game Adaptation Language games (King's Quest 1 of 1984, Apple II King's
Quest 1), which ScummVM does not run either.

232
agiMouse.c Normal file
View file

@ -0,0 +1,232 @@
// The mouse (PLAN.md decision 4). Sierra's DOS interpreters had none; its
// Amiga, ST, IIgs, and Macintosh ones did, and this follows them as
// ScummVM describes them:
//
// - A pointer is drawn over the screen at every present while the machine
// has a mouse and the game has not hidden it (hide.mouse), kept to the
// box fence.mouse gives.
// - A left click on the menu bar opens the menus (as menu.input would);
// in the picture, with the player in control, ego walks to it: its
// baseline's middle to the click (objMouseWalk). A direction key, or in
// AGI 3 a new room, stops the walk.
// - In the menus the pointer picks the menu and the item, and in a message
// window a click is Enter (agiText.c, agiInput.c).
#include "agi.h"
#include "joey/core.h"
#include "joey/input.h"
#include "joey/sprite.h"
#include "joey/tile.h"
// The pointer: a 16x16 arrow, its point the hot spot. '.' is
// transparent, 'k' its outline (dark grey: color 0, black, is the
// sprite's transparent one), 'w' its white.
#define POINTER_TILES 2u
#define POINTER_PX (POINTER_TILES * JL_TILE_PIXELS_PER_SIDE)
#define POINTER_OUTLINE 8u
#define POINTER_FILL 15u
#define PIXELS_PER_BYTE 2u
#define NIBBLE_BITS 4u
#define FENCE_X1 0u
#define FENCE_Y1 1u
#define FENCE_X2 2u
#define FENCE_Y2 3u
// ----- Prototypes -----
static void pointerAt(int16_t *x, int16_t *y);
static bool pointerShown(void);
// ----- Tables -----
static const char *const kPointerArt[POINTER_PX] = {
"k...............",
"kk..............",
"kwk.............",
"kwwk............",
"kwwwk...........",
"kwwwwk..........",
"kwwwwwk.........",
"kwwwwwwk........",
"kwwwwwwwk.......",
"kwwwwwkkkk......",
"kwwkwwk.........",
"kwk.kwwk........",
"kk..kwwk........",
"k....kwwk.......",
".....kwwk.......",
"......kk........"
};
// ----- Module state -----
static uint8_t gPointerTiles[POINTER_TILES * POINTER_TILES * JL_TILE_BYTES];
static jlSpriteT *gPointer;
static uint16_t gPointerUnder[jlSpriteBackupLength(POINTER_TILES, POINTER_TILES)];
static jlSpriteBackupT gPointerSaved;
static bool gPointerDrawn;
// ----- Internal helpers (alphabetical) -----
// Where the pointer is on the screen, kept inside fence.mouse's box (in
// picture coordinates; all zero is no fence).
static void pointerAt(int16_t *x, int16_t *y) {
const uint8_t *f;
int16_t left;
int16_t top;
int16_t right;
int16_t bottom;
*x = jlMouseX();
*y = jlMouseY();
f = gAgi->mouseFence;
if (f[FENCE_X1] == 0u && f[FENCE_Y1] == 0u && f[FENCE_X2] == 0u && f[FENCE_Y2] == 0u) {
return;
}
left = (int16_t)(f[FENCE_X1] * AGI_SCREEN_PX_PER_AGI);
right = (int16_t)(f[FENCE_X2] * AGI_SCREEN_PX_PER_AGI);
top = (int16_t)(f[FENCE_Y1] + gAgi->picRow * AGI_CELL_PX);
bottom = (int16_t)(f[FENCE_Y2] + gAgi->picRow * AGI_CELL_PX);
if (*x < left) {
*x = left;
} else if (*x > right) {
*x = right;
}
if (*y < top) {
*y = top;
} else if (*y > bottom) {
*y = bottom;
}
}
static bool pointerShown(void) {
return gPointer != NULL && jlMousePresent() && !gAgi->mouseHidden;
}
// ----- Public API (alphabetical) -----
// A left click in a cycle (inputProcess): the menus on the menu bar, else
// a walk for ego.
void mouseClick(void) {
int16_t x;
int16_t y;
uint8_t ax;
uint8_t ay;
if (!pointerShown()) {
return;
}
pointerAt(&x, &y);
if (y < (int16_t)AGI_CELL_PX) {
if (gAgi->flags[FLAG_MENU] != 0u) {
gAgi->menuRequested = true;
}
return;
}
if (gAgi->playerControl && !gAgi->textMode) {
mousePosition(&ax, &ay);
objMouseWalk(ax, ay);
}
}
// The pointer onto the stage just before a present, what it covers kept.
void mouseDrawPointer(void) {
int16_t x;
int16_t y;
if (!pointerShown()) {
return;
}
pointerAt(&x, &y);
jlSpriteSaveAndDraw(jlStageGet(), gPointer, x, y, &gPointerSaved);
gPointerDrawn = true;
}
// And off again just after, so nothing else ever draws under it.
void mouseErasePointer(void) {
if (!gPointerDrawn) {
return;
}
jlSpriteRestoreUnder(jlStageGet(), &gPointerSaved);
gPointerDrawn = false;
}
void mouseInit(void) {
uint8_t tx;
uint8_t ty;
uint8_t r;
uint8_t b;
uint8_t pixel[PIXELS_PER_BYTE];
uint8_t p;
char c;
for (ty = 0u; ty < POINTER_TILES; ty++) {
for (tx = 0u; tx < POINTER_TILES; tx++) {
uint8_t *tile = &gPointerTiles[(ty * POINTER_TILES + tx) * JL_TILE_BYTES];
for (r = 0u; r < JL_TILE_PIXELS_PER_SIDE; r++) {
for (b = 0u; b < JL_TILE_BYTES_PER_ROW; b++) {
for (p = 0u; p < PIXELS_PER_BYTE; p++) {
c = kPointerArt[ty * JL_TILE_PIXELS_PER_SIDE + r][tx * JL_TILE_PIXELS_PER_SIDE + b * PIXELS_PER_BYTE + p];
pixel[p] = (c == 'k') ? POINTER_OUTLINE : ((c == 'w') ? POINTER_FILL : 0u);
}
tile[r * JL_TILE_BYTES_PER_ROW + b] = (uint8_t)((pixel[0] << NIBBLE_BITS) | pixel[1]);
}
}
}
}
gPointerSaved.bytes = (uint8_t *)gPointerUnder;
gPointer = jlSpriteCreate(gPointerTiles, POINTER_TILES, POINTER_TILES);
if (gPointer != NULL) {
(void)jlSpriteCompile(gPointer);
}
}
// The text cell under the pointer, when one is shown.
bool mouseOver(int16_t *col, int16_t *row) {
int16_t x;
int16_t y;
if (!pointerShown()) {
return false;
}
pointerAt(&x, &y);
*col = (int16_t)(x / AGI_CELL_PX);
*row = (int16_t)(y / AGI_CELL_PX);
return true;
}
// get.mse.posn: the pointer in picture coordinates, kept to the picture.
void mousePosition(uint8_t *x, uint8_t *y) {
int16_t sx;
int16_t sy;
int16_t mx;
int16_t my;
pointerAt(&sx, &sy);
mx = (int16_t)(sx / AGI_SCREEN_PX_PER_AGI);
my = (int16_t)(sy - (int16_t)gAgi->picRow * AGI_CELL_PX);
*x = (uint8_t)(mx < 0 ? 0 : (mx > AGI_WIDTH - 1 ? AGI_WIDTH - 1 : mx));
*y = (uint8_t)(my < 0 ? 0 : (my > AGI_MAX_Y ? AGI_MAX_Y : my));
}
void mouseShutdown(void) {
if (gPointer != NULL) {
jlSpriteDestroy(gPointer);
gPointer = NULL;
}
}

105
agiPatch.c Normal file
View file

@ -0,0 +1,105 @@
// Changes to particular games, as PLAN.md's decisions have them: copy
// protection is skipped (decision 3) and the script bugs Sierra shipped are
// patched (decision 2). A game is known by its v3 file prefix (agiRes.c).
#include "agi.h"
#include "joey/core.h"
// Gold Rush's clock: logic 0 counts v166 cycles to a second. At a change
// of speed it copies v166 from v167 (Fastest) or v165 (Fast), which the
// speed test in logic 129 sets: it counts a second of empty cycles at
// Fastest and takes a third and a quarter of them (at most 20) for the
// rate a playing cycle would run at on a 1988 PC. Here Fastest is held to
// the frame rate, playing or not, so the clock would run six times too
// fast; and the cracked copy (games/gr) lost the test with logic 129, so
// its clock stops. Both are filled with the real rates every cycle: Fast
// is one cycle a unit, Fastest one a frame (agiIdle waits for each).
#define GR_FAST_CPS_VAR 165u
#define GR_FASTEST_CPS_VAR 167u
#define GR_FAST_CPS (AGI_MS_PER_SECOND / AGI_CYCLE_UNIT_MS)
// King's Quest IV's graveyards (rooms 16 and 18): three zombies rise at
// night, each one's distance from Rosella measured into v221..v223 and its
// state kept in v155, v156, and v162 (room 16) or v158 (room 18).
#define KQ4_GRAVEYARD_A 16u
#define KQ4_GRAVEYARD_B 18u
#define KQ4_ZOMBIE_DIST 221u
#define KQ4_ZOMBIES 3u
#define KQ4_ZOMBIE_CHASING 2u
// The copy protection (decision 3): the rooms in which a game asks a
// question from its manual, and the room a right answer goes on to.
typedef struct {
AgiGameIdE game;
uint8_t first;
uint8_t last;
uint8_t after;
} QuestionRoomsT;
// ----- Tables -----
static const uint8_t kKq4ZombieStateA[KQ4_ZOMBIES] = { 155u, 156u, 162u };
static const uint8_t kKq4ZombieStateB[KQ4_ZOMBIES] = { 155u, 156u, 158u };
static const QuestionRoomsT kQuestionRooms[] = {
// King's Quest IV asks a word from its manual in one of rooms 141 to
// 143; the title, room 96, follows.
{ AGI_GAME_KQ4, 141u, 143u, 96u },
// Gold Rush's claim jumper asks about the book "California Gold" on
// the way from the title (logic 129 to room 125, which picks one of
// rooms 126 to 128); room 73 follows. The cracked copy's logic 129 is
// the original's logic 73 and never comes here.
{ AGI_GAME_GOLD_RUSH, 125u, 125u, 73u }
};
// ----- Public API (alphabetical) -----
// Before each cycle's logic 0.
void agiPatchCycle(void) {
if (gAgi->game.id != AGI_GAME_GOLD_RUSH) {
return;
}
gAgi->vars[GR_FAST_CPS_VAR] = (uint8_t)GR_FAST_CPS;
gAgi->vars[GR_FASTEST_CPS_VAR] = (uint8_t)jlFrameHz();
}
// The distance the distance command reports into var. King's Quest IV's
// zombie bug (in Sierra's interpreter too): with the obsidian scarab, a
// zombie rising beside Rosella is turned away before it is up, so it
// rises and never chases. Patched as ScummVM does: until a zombie chases,
// it reads as far away.
uint8_t agiPatchDistance(uint8_t var, uint8_t distance) {
uint8_t room;
uint8_t zombie;
room = gAgi->vars[VAR_ROOM];
if (gAgi->game.id != AGI_GAME_KQ4 || (room != KQ4_GRAVEYARD_A && room != KQ4_GRAVEYARD_B) || var < KQ4_ZOMBIE_DIST || var >= KQ4_ZOMBIE_DIST + KQ4_ZOMBIES) {
return distance;
}
zombie = (uint8_t)(var - KQ4_ZOMBIE_DIST);
if (gAgi->vars[(room == KQ4_GRAVEYARD_A) ? kKq4ZombieStateA[zombie] : kKq4ZombieStateB[zombie]] != KQ4_ZOMBIE_CHASING) {
return AGI_DISTANCE_FAR;
}
return distance;
}
// The room new.room really goes to: a manual question is skipped.
uint8_t agiPatchRoom(uint8_t room) {
const QuestionRoomsT *q;
uint8_t i;
for (i = 0u; i < sizeof(kQuestionRooms) / sizeof(kQuestionRooms[0]); i++) {
q = &kQuestionRooms[i];
if (gAgi->game.id == q->game && room >= q->first && room <= q->last) {
return q->after;
}
}
return room;
}

11
tests/agidemo1/start.scr Normal file
View file

@ -0,0 +1,11 @@
# The start: Demo 1's menu, Space Quest picked (1) and run (F9).
wait 4
shot d01
key 1
wait 1
shot d02
key F9
wait 6
shot d03
wait 6
shot d04

13
tests/agidemo2a/start.scr Normal file
View file

@ -0,0 +1,13 @@
# The start: "Press any key" (space: Return is set.key's, and reaches
# have.key only by luck of timing on Sierra's), the menu, and demo 1.
wait 4
shot d01
key space
wait 4
shot d02
key 1
key Return
wait 6
shot d03
wait 6
shot d04

13
tests/agidemo2b/start.scr Normal file
View file

@ -0,0 +1,13 @@
# The start: "Press any key" (space: Return is set.key's, and reaches
# have.key only by luck of timing on Sierra's), the menu, and demo 1.
wait 4
shot d01
key space
wait 4
shot d02
key 1
key Return
wait 6
shot d03
wait 6
shot d04

13
tests/agidemo2c/start.scr Normal file
View file

@ -0,0 +1,13 @@
# The start: "Press any key" (space: Return is set.key's, and reaches
# have.key only by luck of timing on Sierra's), the menu, and demo 1.
wait 4
shot d01
key space
wait 4
shot d02
key 1
key Return
wait 6
shot d03
wait 6
shot d04

12
tests/agidemo3/start.scr Normal file
View file

@ -0,0 +1,12 @@
# The start: "Press any key" (space, as for Demo 2), the menu, and demo 1.
wait 4
shot d01
key space
wait 4
shot d02
key 1
key Return
wait 6
shot d03
wait 6
shot d04

8
tests/bc/start.scr Normal file
View file

@ -0,0 +1,8 @@
# The start: the title and the credits, then Taran by Dallben's cottage.
wait 4
shot b01
wait 8
shot b02
key Return
wait 6
shot b03

9
tests/bcv210/start.scr Normal file
View file

@ -0,0 +1,9 @@
# The Black Cauldron 2.10 (AGI 3): the title and the credits, then Taran
# by Dallben's cottage.
wait 4
shot b01
wait 8
shot b02
key Return
wait 6
shot b03

10
tests/ddpst/start.scr Normal file
View file

@ -0,0 +1,10 @@
# Donald Duck's Playground 1.0A, the Atari ST release's files (eXo files
# them as DOS; no interpreter here, so JoeyAGI's alone): the title, the
# nephews, and Duckburg.
wait 4
shot d1
wait 8
shot d2
key Return
wait 6
shot d3

View file

@ -0,0 +1,4 @@
d01 25017b21
d02 bc5c1dd9
d03 4dbe2518
d04 04103f6a

View file

@ -0,0 +1,4 @@
d01 d1423a29
d02 ecc33127
d03 9b0d5a7b
d04 3392072b

View file

@ -0,0 +1,4 @@
d01 d1423a29
d02 68780fd3
d03 9b0d5a7b
d04 3392072b

View file

@ -0,0 +1,4 @@
d01 b332a93d
d02 26dbae01
d03 2687ee4d
d04 9fa769c5

View file

@ -0,0 +1,4 @@
d01 556337e1
d02 dd7304d5
d03 e367472f
d04 46e6df19

View file

@ -0,0 +1,3 @@
b01 32386daf
b02 abbb679b
b03 e6cf7f1a

View file

@ -0,0 +1,3 @@
b01 32386daf
b02 abbb679b
b03 e6cf7f1a

View file

@ -0,0 +1,3 @@
d1 149b9a3d
d2 7f427c91
d3 e7e063da

View file

@ -0,0 +1,4 @@
s1 5d188ae1
s2 f1fbd425
s3 31e24c9a
s4 e9568d9a

View file

@ -0,0 +1,4 @@
s1 6c9d1d93
s2 ff68162b
s3 5a454ac2
s4 a682c8fc

View file

@ -0,0 +1,5 @@
k01 b13ad04d
k02 3e3e97ad
k03 b80a0692
k04 f4ada91e
k05 a228bc50

View file

@ -0,0 +1,5 @@
k01 6c4d72fc
k02 1468a291
k03 41e7e7b8
k04 0194cfae
k05 41e7e7b8

View file

@ -0,0 +1,7 @@
m01 9e1e99da
m02 c0a82f5f
m03 86889a57
m04 c08deb47
m05 266b8a99
m06 787d7b35
m07 c354a030

View file

@ -0,0 +1,4 @@
o01 56c612e7
o02 4db5e753
o03 74541ae3
o04 bf373e80

View file

@ -0,0 +1,6 @@
s1 b3107bc3
s2 2acfb799
s3 56f8d2fb
s4 ff6daa07
s5 b51e0291
s6 dfe12332

View file

@ -0,0 +1,6 @@
s1 2e9906b7
s2 e9dd505f
s3 0a7bdd27
s4 ff6daa07
s5 b51e0291
s6 f7914390

View file

@ -0,0 +1,4 @@
k01 f4117ded
k02 4d1d5ced
k03 2d6c5bb6
k04 1cdc393e

View file

@ -0,0 +1,8 @@
l01 9961df51
l02 e3462831
l03 54ac58a5
l04 4839f56a
l05 13859150
l06 76a0e2d2
l07 300661d9
l08 24e226b9

View file

@ -0,0 +1,4 @@
s1 0c9307fd
s2 b35b29d9
s3 f17f55d5
s4 b60478bf

View file

@ -0,0 +1,4 @@
m01 ca482697
m02 d0672fc9
m03 7602973d
m04 0cd7da2b

View file

@ -0,0 +1,4 @@
m01 ca482697
m02 d0672fc9
m03 7602973d
m04 0cd7da2b

View file

@ -0,0 +1,6 @@
m01 40e67cb7
m02 93199e7f
m03 34e1c07e
m04 c840cad2
m05 cbddccdf
m06 2814beed

View file

@ -0,0 +1,5 @@
p01 f3cc67fd
p02 088d7363
p03 2dd5daef
p04 5f41010f
p05 2dd5daef

View file

@ -0,0 +1,5 @@
p01 f3cc67fd
p02 088d7363
p03 2dd5daef
p04 5f41010f
p05 2dd5daef

View file

@ -0,0 +1 @@
a e933940c

View file

@ -0,0 +1,4 @@
s01 ca27402f
s02 8e5dbbe1
s03 0318b5e2
s04 03e81ffe

View file

@ -0,0 +1,6 @@
s01 9c9fd51d
s02 bae6fb93
s03 80d7df3a
s04 d23de88e
s05 25d119ac
s06 66c57e84

View file

@ -0,0 +1,5 @@
s01 7c76584e
s02 d7838181
s03 a47fc7d1
s04 3222151b
s05 160cfe5d

View file

@ -0,0 +1,5 @@
s01 d0cc275a
s02 d7838181
s03 39b92971
s04 2232343b
s05 160cfe5d

View file

@ -0,0 +1,4 @@
t01 9caf908f
t02 4e25d715
t03 1604cfa9
t04 69e3b0be

View file

@ -0,0 +1,4 @@
x01 89dbf9ef
x02 35925cc4
x03 799a81e5
x04 5fda1127

12
tests/gr/start.scr Normal file
View file

@ -0,0 +1,12 @@
# The start: the titles, then Jerrod in Brooklyn Heights, 1848, a walk
# from the opening, and the next screen.
wait 4
shot s1
wait 8
shot s2
key Return
wait 4
shot s3
key Return
wait 6
shot s4

15
tests/grv201/start.scr Normal file
View file

@ -0,0 +1,15 @@
# Gold Rush 2.01, 3.5-inch, the original (games/gr is a cracked copy):
# logic 129's speed test, then the titles, Brooklyn Heights, and the
# next screen.
# JoeyAGI only: Sierra's interpreter goes from the speed test to the
# claim jumper's quiz (rooms 125 to 128), which JoeyAGI skips (agiPatch.c).
wait 4
shot s1
wait 8
shot s2
key Return
wait 4
shot s3
key Return
wait 6
shot s4

16
tests/kq1/start.scr Normal file
View file

@ -0,0 +1,16 @@
# The start: the title and the credits, then Graham by the castle, a look
# around, and the window closed.
wait 4
shot k01
wait 8
shot k02
key Return
wait 6
shot k03
type look
key Return
wait 2
shot k04
clear
wait 1
shot k05

16
tests/kq2/start.scr Normal file
View file

@ -0,0 +1,16 @@
# The start: the title and the credits, then Graham on the beach, a look
# around, and the window closed.
wait 4
shot k01
wait 8
shot k02
key Return
wait 6
shot k03
type look
key Return
wait 2
shot k04
clear
wait 1
shot k05

28
tests/kq3/mouse.scr Normal file
View file

@ -0,0 +1,28 @@
# The mouse (decision 4; Sierra's DOS interpreter has none, so this is JoeyAGI's
# alone): the pointer, a click to walk, the menu bar clicked, Help lit by
# the pointer and clicked, and its screen closed by a click.
wait 4
key Return
wait 4
mouse 230 150
wait 0.5
shot m01
click
wait 3
shot m02
mouse 20 3
click
wait 1
shot m03
mouse 60 3
wait 0.5
shot m04
mouse 60 24
wait 0.5
shot m05
click
wait 2
shot m06
click
wait 1
shot m07

10
tests/kq3v214/start.scr Normal file
View file

@ -0,0 +1,10 @@
# The start of King's Quest III 2.14 (interpreter 2.936): the title, the
# credits over Manannan's face, and the house.
wait 3
shot o01
wait 7
shot o02
wait 7
shot o03
wait 13
shot o04

18
tests/kq4/start.scr Normal file
View file

@ -0,0 +1,18 @@
# The start of King's Quest IV 2.3 for DOS (3.002.086; no interpreter
# here, so JoeyAGI's alone): the title, the credits, the throne room, and
# Rosella on Tamir's beach (the manual question skipped, agiPatch.c).
wait 4
shot s1
key Return
wait 6
shot s2
wait 8
shot s3
key Return
wait 8
shot s4
wait 10
shot s5
key Return
wait 8
shot s6

18
tests/kq4gs/start.scr Normal file
View file

@ -0,0 +1,18 @@
# The start of the Apple IIgs release: the title, the credits, the
# throne room, and Rosella on Tamir's beach (the manual question skipped,
# agiPatch.c). Its interpreter is the IIgs one, so this is JoeyAGI's alone.
wait 4
shot s1
key Return
wait 6
shot s2
wait 8
shot s3
key Return
wait 8
shot s4
wait 10
shot s5
key Return
wait 8
shot s6

11
tests/kq6agi/start.scr Normal file
View file

@ -0,0 +1,11 @@
# The fan demake's start: its disclaimers and title.
wait 4
shot k01
wait 4
shot k02
key Return
wait 4
shot k03
key Return
wait 6
shot k04

28
tests/lsl1/start.scr Normal file
View file

@ -0,0 +1,28 @@
# The start: the title, the warning, the age, the first quiz question, and
# Alt+X, the game's own way past the quiz (a set.key that sets f109), into
# Larry outside Lefty's.
wait 4
shot l01
wait 8
shot l02
key Return
wait 4
shot l03
key Return
wait 4
shot l04
type 30
key Return
wait 2
shot l05
key Return
wait 2
shot l06
down alt
key x
up alt
wait 2
shot l07
key Return
wait 6
shot l08

12
tests/mh1/start.scr Normal file
View file

@ -0,0 +1,12 @@
# The start: the Orbs over New York, two years later, and day 1 on the
# Upper East Side.
wait 4
shot s1
wait 8
shot s2
key Return
wait 4
shot s3
key Return
wait 6
shot s4

13
tests/mh2/start.scr Normal file
View file

@ -0,0 +1,13 @@
# The start: the date, the skyline after the orbs pass (shots kept off
# the text screen's end, which falls anywhere in its last second), the
# globe, and the alley.
wait 2
shot m01
wait 8
shot m02
key Return
wait 4
shot m03
key Return
wait 6
shot m04

12
tests/mh2v303/start.scr Normal file
View file

@ -0,0 +1,12 @@
# Manhunter 2 3.03, 5.25-inch: the date, the skyline, the globe, and the
# alley.
wait 2
shot m01
wait 8
shot m02
key Return
wait 4
shot m03
key Return
wait 6
shot m04

19
tests/mmg/start.scr Normal file
View file

@ -0,0 +1,19 @@
# The start: the title, the list of players (set.simple's restore; Start
# New Character starts afresh), the name, the face, and the bedroom.
wait 4
shot m01
wait 8
shot m02
key Return
wait 6
shot m03
key Return
wait 4
shot m04
type Scott
key Return
wait 3
shot m05
key Return
wait 8
shot m06

16
tests/pq1/start.scr Normal file
View file

@ -0,0 +1,16 @@
# The start: the title, then Sonny in the briefing room, a look around,
# and the window closed.
wait 4
shot p01
wait 8
shot p02
key Return
wait 6
shot p03
type look
key Return
wait 2
shot p04
clear
wait 1
shot p05

16
tests/pq1v20g/start.scr Normal file
View file

@ -0,0 +1,16 @@
# Police Quest 2.0G (interpreter 2.917): the title, then Sonny in the
# briefing room, a look around, and the window closed.
wait 4
shot p01
wait 8
shot p02
key Return
wait 6
shot p03
type look
key Return
wait 2
shot p04
clear
wait 1
shot p05

11
tests/sq0/start.scr Normal file
View file

@ -0,0 +1,11 @@
# The fan game's start: its titles, the station, and the first room. Its
# own interpreter is a Windows program, so this one is JoeyAGI's alone.
wait 4
shot s01
wait 8
shot s02
key Return
wait 4
shot s03
wait 4
shot s04

20
tests/sq1/start.scr Normal file
View file

@ -0,0 +1,20 @@
# The start: the title, the log-on (first and last name), and the alarm
# aboard the Arcada.
wait 4
shot s01
wait 8
shot s02
key Return
wait 4
shot s03
type Roger
key Return
wait 2
shot s04
type Wilco
key Return
wait 6
shot s05
clear
wait 2
shot s06

14
tests/sq2/start.scr Normal file
View file

@ -0,0 +1,14 @@
# The start: the title, the opening over the planet, and the log-on.
wait 4
shot s01
wait 8
shot s02
key Return
wait 4
shot s03
wait 8
shot s04
type Roger
key Return
wait 4
shot s05

15
tests/sq2v20f/start.scr Normal file
View file

@ -0,0 +1,15 @@
# Space Quest II 2.0F (interpreter 2.936): the title, the opening over the
# planet, and the log-on.
wait 4
shot s01
wait 8
shot s02
key Return
wait 4
shot s03
wait 8
shot s04
type Roger
key Return
wait 4
shot s05

12
tests/sqtlc/start.scr Normal file
View file

@ -0,0 +1,12 @@
# The fan game's start: the title, its two windows, and the station.
wait 4
shot t01
key Return
wait 2
shot t02
key Return
wait 2
shot t03
key Return
wait 6
shot t04

12
tests/xmas/start.scr Normal file
View file

@ -0,0 +1,12 @@
# The card: the greeting, the message prompt (Return for none), and the
# fireplace.
wait 4
shot x01
key Return
wait 2
shot x02
key Return
wait 6
shot x03
wait 8
shot x04