More game testing, enhancements, and bug fixes.
This commit is contained in:
parent
7926c55983
commit
2795f8bbf5
64 changed files with 1114 additions and 0 deletions
205
PLAN.md
Normal file
205
PLAN.md
Normal 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
232
agiMouse.c
Normal 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
105
agiPatch.c
Normal 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
11
tests/agidemo1/start.scr
Normal 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
13
tests/agidemo2a/start.scr
Normal 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
13
tests/agidemo2b/start.scr
Normal 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
13
tests/agidemo2c/start.scr
Normal 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
12
tests/agidemo3/start.scr
Normal 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
8
tests/bc/start.scr
Normal 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
9
tests/bcv210/start.scr
Normal 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
10
tests/ddpst/start.scr
Normal 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
|
||||||
4
tests/expected/agidemo1/start.txt
Normal file
4
tests/expected/agidemo1/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
d01 25017b21
|
||||||
|
d02 bc5c1dd9
|
||||||
|
d03 4dbe2518
|
||||||
|
d04 04103f6a
|
||||||
4
tests/expected/agidemo2a/start.txt
Normal file
4
tests/expected/agidemo2a/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
d01 d1423a29
|
||||||
|
d02 ecc33127
|
||||||
|
d03 9b0d5a7b
|
||||||
|
d04 3392072b
|
||||||
4
tests/expected/agidemo2b/start.txt
Normal file
4
tests/expected/agidemo2b/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
d01 d1423a29
|
||||||
|
d02 68780fd3
|
||||||
|
d03 9b0d5a7b
|
||||||
|
d04 3392072b
|
||||||
4
tests/expected/agidemo2c/start.txt
Normal file
4
tests/expected/agidemo2c/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
d01 b332a93d
|
||||||
|
d02 26dbae01
|
||||||
|
d03 2687ee4d
|
||||||
|
d04 9fa769c5
|
||||||
4
tests/expected/agidemo3/start.txt
Normal file
4
tests/expected/agidemo3/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
d01 556337e1
|
||||||
|
d02 dd7304d5
|
||||||
|
d03 e367472f
|
||||||
|
d04 46e6df19
|
||||||
3
tests/expected/bc/start.txt
Normal file
3
tests/expected/bc/start.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
b01 32386daf
|
||||||
|
b02 abbb679b
|
||||||
|
b03 e6cf7f1a
|
||||||
3
tests/expected/bcv210/start.txt
Normal file
3
tests/expected/bcv210/start.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
b01 32386daf
|
||||||
|
b02 abbb679b
|
||||||
|
b03 e6cf7f1a
|
||||||
3
tests/expected/ddpst/start.txt
Normal file
3
tests/expected/ddpst/start.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
d1 149b9a3d
|
||||||
|
d2 7f427c91
|
||||||
|
d3 e7e063da
|
||||||
4
tests/expected/gr/start.txt
Normal file
4
tests/expected/gr/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
s1 5d188ae1
|
||||||
|
s2 f1fbd425
|
||||||
|
s3 31e24c9a
|
||||||
|
s4 e9568d9a
|
||||||
4
tests/expected/grv201/start.txt
Normal file
4
tests/expected/grv201/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
s1 6c9d1d93
|
||||||
|
s2 ff68162b
|
||||||
|
s3 5a454ac2
|
||||||
|
s4 a682c8fc
|
||||||
5
tests/expected/kq1/start.txt
Normal file
5
tests/expected/kq1/start.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
k01 b13ad04d
|
||||||
|
k02 3e3e97ad
|
||||||
|
k03 b80a0692
|
||||||
|
k04 f4ada91e
|
||||||
|
k05 a228bc50
|
||||||
5
tests/expected/kq2/start.txt
Normal file
5
tests/expected/kq2/start.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
k01 6c4d72fc
|
||||||
|
k02 1468a291
|
||||||
|
k03 41e7e7b8
|
||||||
|
k04 0194cfae
|
||||||
|
k05 41e7e7b8
|
||||||
7
tests/expected/kq3/mouse.txt
Normal file
7
tests/expected/kq3/mouse.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
m01 9e1e99da
|
||||||
|
m02 c0a82f5f
|
||||||
|
m03 86889a57
|
||||||
|
m04 c08deb47
|
||||||
|
m05 266b8a99
|
||||||
|
m06 787d7b35
|
||||||
|
m07 c354a030
|
||||||
4
tests/expected/kq3v214/start.txt
Normal file
4
tests/expected/kq3v214/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
o01 56c612e7
|
||||||
|
o02 4db5e753
|
||||||
|
o03 74541ae3
|
||||||
|
o04 bf373e80
|
||||||
6
tests/expected/kq4/start.txt
Normal file
6
tests/expected/kq4/start.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
s1 b3107bc3
|
||||||
|
s2 2acfb799
|
||||||
|
s3 56f8d2fb
|
||||||
|
s4 ff6daa07
|
||||||
|
s5 b51e0291
|
||||||
|
s6 dfe12332
|
||||||
6
tests/expected/kq4gs/start.txt
Normal file
6
tests/expected/kq4gs/start.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
s1 2e9906b7
|
||||||
|
s2 e9dd505f
|
||||||
|
s3 0a7bdd27
|
||||||
|
s4 ff6daa07
|
||||||
|
s5 b51e0291
|
||||||
|
s6 f7914390
|
||||||
4
tests/expected/kq6agi/start.txt
Normal file
4
tests/expected/kq6agi/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
k01 f4117ded
|
||||||
|
k02 4d1d5ced
|
||||||
|
k03 2d6c5bb6
|
||||||
|
k04 1cdc393e
|
||||||
8
tests/expected/lsl1/start.txt
Normal file
8
tests/expected/lsl1/start.txt
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
l01 9961df51
|
||||||
|
l02 e3462831
|
||||||
|
l03 54ac58a5
|
||||||
|
l04 4839f56a
|
||||||
|
l05 13859150
|
||||||
|
l06 76a0e2d2
|
||||||
|
l07 300661d9
|
||||||
|
l08 24e226b9
|
||||||
4
tests/expected/mh1/start.txt
Normal file
4
tests/expected/mh1/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
s1 0c9307fd
|
||||||
|
s2 b35b29d9
|
||||||
|
s3 f17f55d5
|
||||||
|
s4 b60478bf
|
||||||
4
tests/expected/mh2/start.txt
Normal file
4
tests/expected/mh2/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
m01 ca482697
|
||||||
|
m02 d0672fc9
|
||||||
|
m03 7602973d
|
||||||
|
m04 0cd7da2b
|
||||||
4
tests/expected/mh2v303/start.txt
Normal file
4
tests/expected/mh2v303/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
m01 ca482697
|
||||||
|
m02 d0672fc9
|
||||||
|
m03 7602973d
|
||||||
|
m04 0cd7da2b
|
||||||
6
tests/expected/mmg/start.txt
Normal file
6
tests/expected/mmg/start.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
m01 40e67cb7
|
||||||
|
m02 93199e7f
|
||||||
|
m03 34e1c07e
|
||||||
|
m04 c840cad2
|
||||||
|
m05 cbddccdf
|
||||||
|
m06 2814beed
|
||||||
5
tests/expected/pq1/start.txt
Normal file
5
tests/expected/pq1/start.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
p01 f3cc67fd
|
||||||
|
p02 088d7363
|
||||||
|
p03 2dd5daef
|
||||||
|
p04 5f41010f
|
||||||
|
p05 2dd5daef
|
||||||
5
tests/expected/pq1v20g/start.txt
Normal file
5
tests/expected/pq1v20g/start.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
p01 f3cc67fd
|
||||||
|
p02 088d7363
|
||||||
|
p03 2dd5daef
|
||||||
|
p04 5f41010f
|
||||||
|
p05 2dd5daef
|
||||||
1
tests/expected/probes/loopturn.txt
Normal file
1
tests/expected/probes/loopturn.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
a e933940c
|
||||||
4
tests/expected/sq0/start.txt
Normal file
4
tests/expected/sq0/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
s01 ca27402f
|
||||||
|
s02 8e5dbbe1
|
||||||
|
s03 0318b5e2
|
||||||
|
s04 03e81ffe
|
||||||
6
tests/expected/sq1/start.txt
Normal file
6
tests/expected/sq1/start.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
s01 9c9fd51d
|
||||||
|
s02 bae6fb93
|
||||||
|
s03 80d7df3a
|
||||||
|
s04 d23de88e
|
||||||
|
s05 25d119ac
|
||||||
|
s06 66c57e84
|
||||||
5
tests/expected/sq2/start.txt
Normal file
5
tests/expected/sq2/start.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
s01 7c76584e
|
||||||
|
s02 d7838181
|
||||||
|
s03 a47fc7d1
|
||||||
|
s04 3222151b
|
||||||
|
s05 160cfe5d
|
||||||
5
tests/expected/sq2v20f/start.txt
Normal file
5
tests/expected/sq2v20f/start.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
s01 d0cc275a
|
||||||
|
s02 d7838181
|
||||||
|
s03 39b92971
|
||||||
|
s04 2232343b
|
||||||
|
s05 160cfe5d
|
||||||
4
tests/expected/sqtlc/start.txt
Normal file
4
tests/expected/sqtlc/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
t01 9caf908f
|
||||||
|
t02 4e25d715
|
||||||
|
t03 1604cfa9
|
||||||
|
t04 69e3b0be
|
||||||
4
tests/expected/xmas/start.txt
Normal file
4
tests/expected/xmas/start.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
x01 89dbf9ef
|
||||||
|
x02 35925cc4
|
||||||
|
x03 799a81e5
|
||||||
|
x04 5fda1127
|
||||||
12
tests/gr/start.scr
Normal file
12
tests/gr/start.scr
Normal 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
15
tests/grv201/start.scr
Normal 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
16
tests/kq1/start.scr
Normal 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
16
tests/kq2/start.scr
Normal 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
28
tests/kq3/mouse.scr
Normal 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
10
tests/kq3v214/start.scr
Normal 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
18
tests/kq4/start.scr
Normal 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
18
tests/kq4gs/start.scr
Normal 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
11
tests/kq6agi/start.scr
Normal 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
28
tests/lsl1/start.scr
Normal 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
12
tests/mh1/start.scr
Normal 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
13
tests/mh2/start.scr
Normal 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
12
tests/mh2v303/start.scr
Normal 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
19
tests/mmg/start.scr
Normal 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
16
tests/pq1/start.scr
Normal 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
16
tests/pq1v20g/start.scr
Normal 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
11
tests/sq0/start.scr
Normal 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
20
tests/sq1/start.scr
Normal 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
14
tests/sq2/start.scr
Normal 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
15
tests/sq2v20f/start.scr
Normal 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
12
tests/sqtlc/start.scr
Normal 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
12
tests/xmas/start.scr
Normal 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
|
||||||
Loading…
Add table
Reference in a new issue