diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..4710204 --- /dev/null +++ b/PLAN.md @@ -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: 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 .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: `DIR` with four section offsets, `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. diff --git a/agiMouse.c b/agiMouse.c new file mode 100644 index 0000000..4102e02 --- /dev/null +++ b/agiMouse.c @@ -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; + } +} diff --git a/agiPatch.c b/agiPatch.c new file mode 100644 index 0000000..c220216 --- /dev/null +++ b/agiPatch.c @@ -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; +} diff --git a/tests/agidemo1/start.scr b/tests/agidemo1/start.scr new file mode 100644 index 0000000..9825abf --- /dev/null +++ b/tests/agidemo1/start.scr @@ -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 diff --git a/tests/agidemo2a/start.scr b/tests/agidemo2a/start.scr new file mode 100644 index 0000000..7b7b732 --- /dev/null +++ b/tests/agidemo2a/start.scr @@ -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 diff --git a/tests/agidemo2b/start.scr b/tests/agidemo2b/start.scr new file mode 100644 index 0000000..7b7b732 --- /dev/null +++ b/tests/agidemo2b/start.scr @@ -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 diff --git a/tests/agidemo2c/start.scr b/tests/agidemo2c/start.scr new file mode 100644 index 0000000..7b7b732 --- /dev/null +++ b/tests/agidemo2c/start.scr @@ -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 diff --git a/tests/agidemo3/start.scr b/tests/agidemo3/start.scr new file mode 100644 index 0000000..02318ac --- /dev/null +++ b/tests/agidemo3/start.scr @@ -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 diff --git a/tests/bc/start.scr b/tests/bc/start.scr new file mode 100644 index 0000000..d4dd024 --- /dev/null +++ b/tests/bc/start.scr @@ -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 diff --git a/tests/bcv210/start.scr b/tests/bcv210/start.scr new file mode 100644 index 0000000..92cedc6 --- /dev/null +++ b/tests/bcv210/start.scr @@ -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 diff --git a/tests/ddpst/start.scr b/tests/ddpst/start.scr new file mode 100644 index 0000000..e756735 --- /dev/null +++ b/tests/ddpst/start.scr @@ -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 diff --git a/tests/expected/agidemo1/start.txt b/tests/expected/agidemo1/start.txt new file mode 100644 index 0000000..6e261dc --- /dev/null +++ b/tests/expected/agidemo1/start.txt @@ -0,0 +1,4 @@ +d01 25017b21 +d02 bc5c1dd9 +d03 4dbe2518 +d04 04103f6a diff --git a/tests/expected/agidemo2a/start.txt b/tests/expected/agidemo2a/start.txt new file mode 100644 index 0000000..1fad974 --- /dev/null +++ b/tests/expected/agidemo2a/start.txt @@ -0,0 +1,4 @@ +d01 d1423a29 +d02 ecc33127 +d03 9b0d5a7b +d04 3392072b diff --git a/tests/expected/agidemo2b/start.txt b/tests/expected/agidemo2b/start.txt new file mode 100644 index 0000000..ab58d59 --- /dev/null +++ b/tests/expected/agidemo2b/start.txt @@ -0,0 +1,4 @@ +d01 d1423a29 +d02 68780fd3 +d03 9b0d5a7b +d04 3392072b diff --git a/tests/expected/agidemo2c/start.txt b/tests/expected/agidemo2c/start.txt new file mode 100644 index 0000000..029e944 --- /dev/null +++ b/tests/expected/agidemo2c/start.txt @@ -0,0 +1,4 @@ +d01 b332a93d +d02 26dbae01 +d03 2687ee4d +d04 9fa769c5 diff --git a/tests/expected/agidemo3/start.txt b/tests/expected/agidemo3/start.txt new file mode 100644 index 0000000..8d132a3 --- /dev/null +++ b/tests/expected/agidemo3/start.txt @@ -0,0 +1,4 @@ +d01 556337e1 +d02 dd7304d5 +d03 e367472f +d04 46e6df19 diff --git a/tests/expected/bc/start.txt b/tests/expected/bc/start.txt new file mode 100644 index 0000000..485e9bf --- /dev/null +++ b/tests/expected/bc/start.txt @@ -0,0 +1,3 @@ +b01 32386daf +b02 abbb679b +b03 e6cf7f1a diff --git a/tests/expected/bcv210/start.txt b/tests/expected/bcv210/start.txt new file mode 100644 index 0000000..485e9bf --- /dev/null +++ b/tests/expected/bcv210/start.txt @@ -0,0 +1,3 @@ +b01 32386daf +b02 abbb679b +b03 e6cf7f1a diff --git a/tests/expected/ddpst/start.txt b/tests/expected/ddpst/start.txt new file mode 100644 index 0000000..0b4c854 --- /dev/null +++ b/tests/expected/ddpst/start.txt @@ -0,0 +1,3 @@ +d1 149b9a3d +d2 7f427c91 +d3 e7e063da diff --git a/tests/expected/gr/start.txt b/tests/expected/gr/start.txt new file mode 100644 index 0000000..4571ab7 --- /dev/null +++ b/tests/expected/gr/start.txt @@ -0,0 +1,4 @@ +s1 5d188ae1 +s2 f1fbd425 +s3 31e24c9a +s4 e9568d9a diff --git a/tests/expected/grv201/start.txt b/tests/expected/grv201/start.txt new file mode 100644 index 0000000..86e1df3 --- /dev/null +++ b/tests/expected/grv201/start.txt @@ -0,0 +1,4 @@ +s1 6c9d1d93 +s2 ff68162b +s3 5a454ac2 +s4 a682c8fc diff --git a/tests/expected/kq1/start.txt b/tests/expected/kq1/start.txt new file mode 100644 index 0000000..2858c71 --- /dev/null +++ b/tests/expected/kq1/start.txt @@ -0,0 +1,5 @@ +k01 b13ad04d +k02 3e3e97ad +k03 b80a0692 +k04 f4ada91e +k05 a228bc50 diff --git a/tests/expected/kq2/start.txt b/tests/expected/kq2/start.txt new file mode 100644 index 0000000..9299162 --- /dev/null +++ b/tests/expected/kq2/start.txt @@ -0,0 +1,5 @@ +k01 6c4d72fc +k02 1468a291 +k03 41e7e7b8 +k04 0194cfae +k05 41e7e7b8 diff --git a/tests/expected/kq3/mouse.txt b/tests/expected/kq3/mouse.txt new file mode 100644 index 0000000..90b6f76 --- /dev/null +++ b/tests/expected/kq3/mouse.txt @@ -0,0 +1,7 @@ +m01 9e1e99da +m02 c0a82f5f +m03 86889a57 +m04 c08deb47 +m05 266b8a99 +m06 787d7b35 +m07 c354a030 diff --git a/tests/expected/kq3v214/start.txt b/tests/expected/kq3v214/start.txt new file mode 100644 index 0000000..048fc07 --- /dev/null +++ b/tests/expected/kq3v214/start.txt @@ -0,0 +1,4 @@ +o01 56c612e7 +o02 4db5e753 +o03 74541ae3 +o04 bf373e80 diff --git a/tests/expected/kq4/start.txt b/tests/expected/kq4/start.txt new file mode 100644 index 0000000..c5fb0a7 --- /dev/null +++ b/tests/expected/kq4/start.txt @@ -0,0 +1,6 @@ +s1 b3107bc3 +s2 2acfb799 +s3 56f8d2fb +s4 ff6daa07 +s5 b51e0291 +s6 dfe12332 diff --git a/tests/expected/kq4gs/start.txt b/tests/expected/kq4gs/start.txt new file mode 100644 index 0000000..7796740 --- /dev/null +++ b/tests/expected/kq4gs/start.txt @@ -0,0 +1,6 @@ +s1 2e9906b7 +s2 e9dd505f +s3 0a7bdd27 +s4 ff6daa07 +s5 b51e0291 +s6 f7914390 diff --git a/tests/expected/kq6agi/start.txt b/tests/expected/kq6agi/start.txt new file mode 100644 index 0000000..7232068 --- /dev/null +++ b/tests/expected/kq6agi/start.txt @@ -0,0 +1,4 @@ +k01 f4117ded +k02 4d1d5ced +k03 2d6c5bb6 +k04 1cdc393e diff --git a/tests/expected/lsl1/start.txt b/tests/expected/lsl1/start.txt new file mode 100644 index 0000000..786bad6 --- /dev/null +++ b/tests/expected/lsl1/start.txt @@ -0,0 +1,8 @@ +l01 9961df51 +l02 e3462831 +l03 54ac58a5 +l04 4839f56a +l05 13859150 +l06 76a0e2d2 +l07 300661d9 +l08 24e226b9 diff --git a/tests/expected/mh1/start.txt b/tests/expected/mh1/start.txt new file mode 100644 index 0000000..4bdbf11 --- /dev/null +++ b/tests/expected/mh1/start.txt @@ -0,0 +1,4 @@ +s1 0c9307fd +s2 b35b29d9 +s3 f17f55d5 +s4 b60478bf diff --git a/tests/expected/mh2/start.txt b/tests/expected/mh2/start.txt new file mode 100644 index 0000000..0ff5511 --- /dev/null +++ b/tests/expected/mh2/start.txt @@ -0,0 +1,4 @@ +m01 ca482697 +m02 d0672fc9 +m03 7602973d +m04 0cd7da2b diff --git a/tests/expected/mh2v303/start.txt b/tests/expected/mh2v303/start.txt new file mode 100644 index 0000000..0ff5511 --- /dev/null +++ b/tests/expected/mh2v303/start.txt @@ -0,0 +1,4 @@ +m01 ca482697 +m02 d0672fc9 +m03 7602973d +m04 0cd7da2b diff --git a/tests/expected/mmg/start.txt b/tests/expected/mmg/start.txt new file mode 100644 index 0000000..e19fe04 --- /dev/null +++ b/tests/expected/mmg/start.txt @@ -0,0 +1,6 @@ +m01 40e67cb7 +m02 93199e7f +m03 34e1c07e +m04 c840cad2 +m05 cbddccdf +m06 2814beed diff --git a/tests/expected/pq1/start.txt b/tests/expected/pq1/start.txt new file mode 100644 index 0000000..f545c32 --- /dev/null +++ b/tests/expected/pq1/start.txt @@ -0,0 +1,5 @@ +p01 f3cc67fd +p02 088d7363 +p03 2dd5daef +p04 5f41010f +p05 2dd5daef diff --git a/tests/expected/pq1v20g/start.txt b/tests/expected/pq1v20g/start.txt new file mode 100644 index 0000000..f545c32 --- /dev/null +++ b/tests/expected/pq1v20g/start.txt @@ -0,0 +1,5 @@ +p01 f3cc67fd +p02 088d7363 +p03 2dd5daef +p04 5f41010f +p05 2dd5daef diff --git a/tests/expected/probes/loopturn.txt b/tests/expected/probes/loopturn.txt new file mode 100644 index 0000000..e116eb0 --- /dev/null +++ b/tests/expected/probes/loopturn.txt @@ -0,0 +1 @@ +a e933940c diff --git a/tests/expected/sq0/start.txt b/tests/expected/sq0/start.txt new file mode 100644 index 0000000..6a4f547 --- /dev/null +++ b/tests/expected/sq0/start.txt @@ -0,0 +1,4 @@ +s01 ca27402f +s02 8e5dbbe1 +s03 0318b5e2 +s04 03e81ffe diff --git a/tests/expected/sq1/start.txt b/tests/expected/sq1/start.txt new file mode 100644 index 0000000..4c37273 --- /dev/null +++ b/tests/expected/sq1/start.txt @@ -0,0 +1,6 @@ +s01 9c9fd51d +s02 bae6fb93 +s03 80d7df3a +s04 d23de88e +s05 25d119ac +s06 66c57e84 diff --git a/tests/expected/sq2/start.txt b/tests/expected/sq2/start.txt new file mode 100644 index 0000000..d9e7ead --- /dev/null +++ b/tests/expected/sq2/start.txt @@ -0,0 +1,5 @@ +s01 7c76584e +s02 d7838181 +s03 a47fc7d1 +s04 3222151b +s05 160cfe5d diff --git a/tests/expected/sq2v20f/start.txt b/tests/expected/sq2v20f/start.txt new file mode 100644 index 0000000..e8d36d2 --- /dev/null +++ b/tests/expected/sq2v20f/start.txt @@ -0,0 +1,5 @@ +s01 d0cc275a +s02 d7838181 +s03 39b92971 +s04 2232343b +s05 160cfe5d diff --git a/tests/expected/sqtlc/start.txt b/tests/expected/sqtlc/start.txt new file mode 100644 index 0000000..1ebc44c --- /dev/null +++ b/tests/expected/sqtlc/start.txt @@ -0,0 +1,4 @@ +t01 9caf908f +t02 4e25d715 +t03 1604cfa9 +t04 69e3b0be diff --git a/tests/expected/xmas/start.txt b/tests/expected/xmas/start.txt new file mode 100644 index 0000000..621c652 --- /dev/null +++ b/tests/expected/xmas/start.txt @@ -0,0 +1,4 @@ +x01 89dbf9ef +x02 35925cc4 +x03 799a81e5 +x04 5fda1127 diff --git a/tests/gr/start.scr b/tests/gr/start.scr new file mode 100644 index 0000000..8dd2946 --- /dev/null +++ b/tests/gr/start.scr @@ -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 diff --git a/tests/grv201/start.scr b/tests/grv201/start.scr new file mode 100644 index 0000000..7d3a73d --- /dev/null +++ b/tests/grv201/start.scr @@ -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 diff --git a/tests/kq1/start.scr b/tests/kq1/start.scr new file mode 100644 index 0000000..21571e5 --- /dev/null +++ b/tests/kq1/start.scr @@ -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 diff --git a/tests/kq2/start.scr b/tests/kq2/start.scr new file mode 100644 index 0000000..391f41c --- /dev/null +++ b/tests/kq2/start.scr @@ -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 diff --git a/tests/kq3/mouse.scr b/tests/kq3/mouse.scr new file mode 100644 index 0000000..0dac743 --- /dev/null +++ b/tests/kq3/mouse.scr @@ -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 diff --git a/tests/kq3v214/start.scr b/tests/kq3v214/start.scr new file mode 100644 index 0000000..c11fedb --- /dev/null +++ b/tests/kq3v214/start.scr @@ -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 diff --git a/tests/kq4/start.scr b/tests/kq4/start.scr new file mode 100644 index 0000000..b8bf260 --- /dev/null +++ b/tests/kq4/start.scr @@ -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 diff --git a/tests/kq4gs/start.scr b/tests/kq4gs/start.scr new file mode 100644 index 0000000..76f9f0b --- /dev/null +++ b/tests/kq4gs/start.scr @@ -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 diff --git a/tests/kq6agi/start.scr b/tests/kq6agi/start.scr new file mode 100644 index 0000000..5af1d91 --- /dev/null +++ b/tests/kq6agi/start.scr @@ -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 diff --git a/tests/lsl1/start.scr b/tests/lsl1/start.scr new file mode 100644 index 0000000..741cec9 --- /dev/null +++ b/tests/lsl1/start.scr @@ -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 diff --git a/tests/mh1/start.scr b/tests/mh1/start.scr new file mode 100644 index 0000000..2a39107 --- /dev/null +++ b/tests/mh1/start.scr @@ -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 diff --git a/tests/mh2/start.scr b/tests/mh2/start.scr new file mode 100644 index 0000000..423c690 --- /dev/null +++ b/tests/mh2/start.scr @@ -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 diff --git a/tests/mh2v303/start.scr b/tests/mh2v303/start.scr new file mode 100644 index 0000000..bb99cbb --- /dev/null +++ b/tests/mh2v303/start.scr @@ -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 diff --git a/tests/mmg/start.scr b/tests/mmg/start.scr new file mode 100644 index 0000000..8ad40c0 --- /dev/null +++ b/tests/mmg/start.scr @@ -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 diff --git a/tests/pq1/start.scr b/tests/pq1/start.scr new file mode 100644 index 0000000..7179c89 --- /dev/null +++ b/tests/pq1/start.scr @@ -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 diff --git a/tests/pq1v20g/start.scr b/tests/pq1v20g/start.scr new file mode 100644 index 0000000..aa747fa --- /dev/null +++ b/tests/pq1v20g/start.scr @@ -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 diff --git a/tests/sq0/start.scr b/tests/sq0/start.scr new file mode 100644 index 0000000..1f78274 --- /dev/null +++ b/tests/sq0/start.scr @@ -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 diff --git a/tests/sq1/start.scr b/tests/sq1/start.scr new file mode 100644 index 0000000..0bf5c59 --- /dev/null +++ b/tests/sq1/start.scr @@ -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 diff --git a/tests/sq2/start.scr b/tests/sq2/start.scr new file mode 100644 index 0000000..96d95e9 --- /dev/null +++ b/tests/sq2/start.scr @@ -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 diff --git a/tests/sq2v20f/start.scr b/tests/sq2v20f/start.scr new file mode 100644 index 0000000..27a3387 --- /dev/null +++ b/tests/sq2v20f/start.scr @@ -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 diff --git a/tests/sqtlc/start.scr b/tests/sqtlc/start.scr new file mode 100644 index 0000000..171aadc --- /dev/null +++ b/tests/sqtlc/start.scr @@ -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 diff --git a/tests/xmas/start.scr b/tests/xmas/start.scr new file mode 100644 index 0000000..28a42b1 --- /dev/null +++ b/tests/xmas/start.scr @@ -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