Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - NewRisingSun

Pages: 1 2 [3] 4
31
KQ1PCJR.IMG from Retrograde Station does not work with GALextract because Demonlord removed the game's copy protection in such a way that the location of some things is not where it was on the original disk. While I hesitate to accomodate a "cracked" game in such a manner, I suppose since most people will be using that image, I better add support for it to GALextract.
Quote from: lance.ewing
what those two versions of Donald Duck's Playground stored in the archive.org link above are?
The Retrograde Station downloads of the game are the original self-booting PC version 1.0Q with AGI version 2.001. One is a disk image, the other is a "DOS conversion" (basically the self-booting disk image modified to run under DOS by way of a little launcher program). The disk image has been "cracked" again in a rather clumsy fashion that prevents it from working on a Tandy 1000, where the original copy-protected disk has no such problems.

32
Quote from: lance.ewing
and another lesser redesign when moving to AGI v2 (where the test and action commands were reshuffled a bit
It would be most interesting to look at the booter version of Donald Duck's Playground. It comes with interpreter version 2.001, supports EGA and text windows, draws background pictures to a shadow buffer rather than the screen, but still has the ANIOBJ structure on the disk that was dropped later. It's basically some kind of in-between between AGI 1 and AGI 2.

There is also an extremely rare actual PC version (1.50) using AGI v2.440, plus the Amiga (game version 1.0C) and Atari (game version 1.0A) versions of the game, which despite the version number come later than the actual booter PC version (1.0Q). (The version on Al Lowe's website is the Amiga version with a rather unsuitable PC interpreter executable added.)

Will look at KQ1PCJR.IMG later.

33
I have finished my small extractor and decompiler for the "Game Adaptation Language" logic resources used in the early King's Quest releases. I'm sharing my work-in-progress.

GALextract.exe requires a 360K disk image, its name specified as a command-line argument; all known versions of the game should be supported. If specifically the gnome/beanstalk messages are corrupt, then your disk image is the badly-cracked version of the game that is floating around the internet.

GALdecompile takes the name of the logic resource as a command-line argument and outputs the decompiled script to the standard output. WORDS.BIN must be in the current directory; this is the equivalent to AGIv2's WORDS.TOK, which in the case of GAL is hard-coded into the main executable file, like so many things.

Being a work-in-progress, it's far from perfect --- some opcode meanings are unknown, some may have their lengths misidentified, and I may have made an incorrect guess at what some of them mean. I'm also a bit stumped by the meaning of "FB FE 00 00" in the test command blocks. I have started filling in preliminary object and variable names; they are only valid for the "PCjr/Tandy 1000 disk" of the Sierra On-Line release; their names will be off for the IBM PCjr release. Still, it's not bad for a first effort, I would say.


35
SCI Development Tools / Re: Scene Builder
« on: October 22, 2016, 11:55:52 AM »
I think that's how Legend of Kyrandia constructed its backgrounds. :)

36
I have now stepped through KQ1's virtual machine enough to gain a basic understanding of how it works, and what the logic file format is like.

There are only two directories: rooms, and views. The directory is in absolute sector number 10, which in most disk images is at file offset 0x1400. The room directory is in the first 512 bytes, the view directory in the second 512 bytes. Each entry is of double-word size, containing the absolute start sector number, the number of sectors, and the starting offset into the start sector number. A room begins with the logic resource, directly followed by the picture resource. Resources have no headers, unlike AGI, where they start with 0x12 0x34 volume sizeLo sizeHi.

The first four words of the logic resource contain the four lengths, in bytes, of the four blocks of a logic resource. The game finds the picture resource simply by adding those four values together, thus seeking past the logic resource. The four blocks are:
  • Action subroutines
  • Test commands evaluated continously
  • Test commands and parser word tokens evaluated when a line is entered
  • Text strings
The test command blocks contain only a sequence of test commands (and, in the case of 3., parser word tokens), each followed by an offset into the Action subroutine block that is executed if the test evaluates positively. There seem to be only three test commands: equaln, not equaln, and posn. From what I have seen, there are only vars, no flags.

The string block has no pointers, only zero-terminated strings. Their offsets into the string block are hard-coded as parameters of the action commands themselves, instead of using message numbers.

There is no separate directory for sound resources. Room numbers 90 and up only contain sound resources, four in each room. The four words that in a normal room resource would contain the length of the four logic blocks here contain the length of each of the four sound resources that make up the "room" resource.

I suppose it's a matter of definition whether to call this thing AGI or not. The action and test commands do not match their respective AGI opcode numbers at all. For example, the functional equivalent to new.room is command 0x04, and new.room.f is command 0x37. Given all these differences, I'm more inclined to keep calling KQ1's language GAL, even as it is tempting to see the similarities.  Maybe if the logic format of the AGI version 1 interpreter were fully known, one would see more of a continuity between GAL and AGI version 2.

Knowing the structure of the logic resource as well as the length of all opcodes, but lacking knowledge of the meaning of the variables and some of the opcodes, where the disassembly is too obtuse, the next step for me will be to write a small decompiler of the logic resources. That will allow me to compare the output to AGIv2 KQ1.
Quote from: lskovlun
What that looks like to me, is a routine coded in assembly being wrapped to make it callable from a HLL.
No, that's not what it is. Wrapping an assembly routine to be HLL-callable would look something like this:
Code: [Select]
CLoadRoom proto c, roomNumber: word

CLoadRoom proc near
push bp
mov bp, sp
mov ax, [bp+4]
call AsmLoadRoom
pop bp
ret
CLoadRoom endp

AsmLoadRoom proc near
; call with: AX=new room number
shl ax, 1
shl ax, 1
mov bx, ax
mov ax, [roomDirectory+bx]
(...)
ret
AsmLoadRoom endp
What we have in KQ1 instead is the calling procedure establishing a stack frame, and all the BP references of the callee being relative to the stack frame that the caller has set up. That's extremely unusual.

It's also somewhat unusual to reserve room for local variables using "SUB SP, xx" before the "MOV BP, SP". It makes each argument's relative offset a function of the number of local variables. Normal compilers, including the one used to compile both AGI v1 and v2, subtract from SP after "MOV BP, SP". That way, arguments can be identified by BP+x, while locals are BP-x. That is the standard behavior, so standard that Intel turned into its own machine language instruction (ENTER) on their 1982's 80286 processor.
Quote from: lskovlun
From what I've seen there is no oddness here, only a mixture of C and ASM,
I suggest you look at my first example more closely. The caller function does not start with the PUSH BP; that occurs right in the middle of it.

37
AGI Development Tools / Re: Pre-AGI2 versions
« on: October 20, 2016, 05:01:53 PM »
Quote
I'm surprised that the Apple II version of KQ1 is also v1.10 of the interpreter. KQ2 on Apple II also uses v1.10. I might need to go and double check that now to make sure I was looking at the right game.
Please check again, because that seems highly unlikely, given that all text is in the clear on the KQ1 Apple disk but Avis-Durgan-encrypted on the KQ2 Apple disks. (And my KQ2 Apple disk says AGI v1.08, not 1.10.)

Of course, we also may be dealing with several versions of the same game having come out on the Apple II, just like on the PC, in case of which everyone would be correct. I would definitely insist however on not mixing version numbers --- interpreter or game --- from different platforms, otherwise we're creating a mess.

38
I was replying to the claim that the Amiga version's script code was supposed to be identical to the PC version's. The fact that the Amiga version has no menus in its scripts does not contradict that, as the PC version 1.0U will not have menus in its scripts either.

Having managed to open the Amiga version's logic files by replacing the OBJECT file from a later PC version, I find the menus in logic 83. The PC version 1.0U has no menus in logic 83. The Amiga version therefore must have been based on PC version 1.0U (and even says that in the debugger), and yet menus were added to it without increasing the version number. The time stamps on the Amiga version are December 17 1986, while PC version 1.0U is dated November 13 1986.

39
Quote from: lskovlun
What that looks like to me, is a routine coded in assembly being wrapped to make it callable from a HLL.
That's what I thought too, but consider the following:
Code: [Select]
KQ1CODE:2F95 op19:                                   ; ...
KQ1CODE:2F95                 mov     si, [bp+VM_PC]
KQ1CODE:2F98                 inc     [bp+VM_PC]
KQ1CODE:2F9B                 mov     al, [si]
KQ1CODE:2F9D                 xor     ah, ah
KQ1CODE:2F9F                 push    ax
KQ1CODE:2FA0                 call    obj2ani
KQ1CODE:2FA3                 mov     sp, bp
(...)
KQ1CODE:3718 obj2ani         proc near               ; ...
KQ1CODE:3718                 push    bp              ; STACKFRAME_CREATE, 2
KQ1CODE:3719                 sub     sp, 2
KQ1CODE:371C                 mov     bp, sp
KQ1CODE:371E                 mov     cl, 3
KQ1CODE:3720                 mov     ax, [bp+6]
KQ1CODE:3723                 shl     ax, cl          ; multiply by 8, the size of an SObj struct
KQ1CODE:3725                 mov     si, ax
KQ1CODE:3727                 mov     al, byte ptr objInfo.aniNum[si]
KQ1CODE:372B                 xor     ah, ah
KQ1CODE:372D                 mov     VM_currentAniNum, al
KQ1CODE:3730                 mov     bx, size SAni
KQ1CODE:3733                 imul    bx
KQ1CODE:3735                 add     ax, offset bAnis
KQ1CODE:3738                 mov     VM_currentAniPtr, ax
KQ1CODE:373B                 add     sp, 2           ; STACKFRAME_LEAVE, 2
KQ1CODE:373E                 pop     bp
KQ1CODE:373F                 ret
KQ1CODE:373F obj2ani         endp
Why the hell does obj2ani first subtract 2 from SP if it doesn't use any local variables? Without that, it could access the argument with BP+4 instead of BP+6. The whole code is full of such red herrings.

40
From what I can make out from KQ1's disassembly so far, is that the virtual machine has 67 opcodes, and ADD is 20 (dec), while SUB is 21 (dec).
Code: [Select]
KQ1CODE:2FCE op20_add:                               ; ...
KQ1CODE:2FCE                 mov     si, [bp+VM_PC]
KQ1CODE:2FD1                 inc     [bp+VM_PC]
KQ1CODE:2FD4                 mov     al, VM_acc
KQ1CODE:2FD7                 xor     ah, ah
KQ1CODE:2FD9                 mov     bl, [si]
KQ1CODE:2FDB                 xor     bh, bh
KQ1CODE:2FDD                 add     ax, bx
KQ1CODE:2FDF                 mov     VM_acc, al
KQ1CODE:2FE2                 jmp     getNextOpcode
KQ1CODE:2FE5 ; ---------------------------------------------------------------------------
KQ1CODE:2FE5
KQ1CODE:2FE5 op21_sub:                               ; ...
KQ1CODE:2FE5                 mov     si, [bp+VM_PC]
KQ1CODE:2FE8                 inc     [bp+VM_PC]
KQ1CODE:2FEB                 mov     al, VM_acc
KQ1CODE:2FEE                 xor     ah, ah
KQ1CODE:2FF0                 mov     bl, [si]
KQ1CODE:2FF2                 xor     bh, bh
KQ1CODE:2FF4                 sub     ax, bx
KQ1CODE:2FF6                 mov     VM_acc, al
KQ1CODE:2FF9                 jmp     getNextOpcode
Most of the other commands seem to manipulate on-screen objects. And yes, the goat is indeed object number 14 and starts in room 10: :)
Code: [Select]
KQ1DATA:16D6 ; Item: ObjNum, name, room, ?, ?, ?, ?
KQ1DATA:16D6 objInfo         SObj <0, offset sItemUnnamed, 0, 0, 0, 91h, 87h> ; ...
KQ1DATA:16DE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 41h, 53h>
KQ1DATA:16E6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Eh, 2Bh>
KQ1DATA:16EE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 78h, 9Ch>
KQ1DATA:16F6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 58h, 2Bh>
KQ1DATA:16FE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 50h, 50h>
KQ1DATA:1706                 SObj <0, offset sItemUnnamed, 0, 0, 0, 12h, 5Ch>
KQ1DATA:170E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 2Ch, 2Bh>
KQ1DATA:1716                 SObj <0, offset sItemUnnamed, 2, 0, 0, 67h, 77h>
KQ1DATA:171E                 SObj <0, offset sItemUnnamed, 3, 0, 0, 71h, 7Ch>
KQ1DATA:1726                 SObj <0, offset sItemDagger, 3, 0, 0, 0, 0>
KQ1DATA:172E                 SObj <0, offset sItemPouch, 6, 0, 0, 0, 0>
KQ1DATA:1736                 SObj <0, offset sItemDiamonds, 6, 0, 0, 0, 0>
KQ1DATA:173E                 SObj <0, offset sItemGoat, 10, 0, 0, 4Bh, 69h>
KQ1DATA:1746                 SObj <0, offset sItemUnnamed, 11, 0, 0, 11h, 98h>
KQ1DATA:174E                 SObj <0, offset sItemBucket, 12, 0, 0, 26h, 78h>
KQ1DATA:1756                 SObj <0, offset sItemUnnamed, 12, 0, 0, 0, 0>
KQ1DATA:175E                 SObj <0, offset sItemUnnamed, 12, 0, 0, 0, 0>
KQ1DATA:1766                 SObj <0, offset sItemCarrot, 15, 0, 0, 0, 0>
KQ1DATA:176E                 SObj <0, offset sItemUnnamed, 19, 0, 0, 64h, 5Dh>
KQ1DATA:1776                 SObj <0, offset sItemClover, 24, 0, 0, 3Dh, 7Bh>
KQ1DATA:177E                 SObj <0, offset sItemUnnamed, 25, 0, 0, 21h, 35h>
KQ1DATA:1786                 SObj <0, offset sItemUnnamed, 28, 0, 0, 2Dh, 80h>
KQ1DATA:178E                 SObj <0, offset sItemWalnut, 30, 0, 0, 0, 0>
KQ1DATA:1796                 SObj <0, offset sItemBowl, 31, 0, 0, 7Eh, 8Ah>
KQ1DATA:179E                 SObj <0, offset sItemPebbles, 34, 0, 0, 50h, 68h>
KQ1DATA:17A6                 SObj <0, offset sItemUnnamed, 40, 0, 0, 1Eh, 6Ch>
KQ1DATA:17AE                 SObj <0, offset sItemGoldKey, 40, 0, 0, 1Eh, 6Ch>
KQ1DATA:17B6                 SObj <0, offset sItemBeans, 40, 0, 0, 1Eh, 6Ch>
KQ1DATA:17BE                 SObj <0, offset sItemUnnamed, 47, 0, 0, 54h, 50h>
KQ1DATA:17C6                 SObj <0, offset sItemUnnamed, 51, 0, 0, 2Ch, 98h>
KQ1DATA:17CE                 SObj <0, offset sItemUnnamed, 48, 0, 0, 7Ch, 6Eh>
KQ1DATA:17D6                 SObj <0, offset sItemUnnamed, 51, 0, 0, 28h, 78h>
KQ1DATA:17DE                 SObj <0, offset sItemMirror, 51, 0, 0, 26h, 6Ch>
KQ1DATA:17E6                 SObj <0, offset sItemUnnamed, 57, 0, 0, 3, 7Dh>
KQ1DATA:17EE                 SObj <0, offset sItemUnnamed, 65, 0, 0, 55h, 52h>
KQ1DATA:17F6                 SObj <0, offset sItemChest, 57, 0, 0, 47h, 57h>
KQ1DATA:17FE                 SObj <0, offset sItemSling, 62, 0, 0, 4Bh, 4Bh>
KQ1DATA:1806                 SObj <0, offset sItemEgg, 63, 0, 0, 47h, 50h>
KQ1DATA:180E                 SObj <0, offset sItemUnnamed, 65, 0, 0, 21h, 4Ch>
KQ1DATA:1816                 SObj <0, offset sItemCheese, 65, 0, 0, 76h, 8Ch>
KQ1DATA:181E                 SObj <0, offset sItemNote, 65, 0, 0, 76h, 8Ch>
KQ1DATA:1826                 SObj <0, offset sItemUnnamed, 0, 0, 0, 31h, 0A3h>
KQ1DATA:182E                 SObj <0, offset sItemUnnamed, 75, 0, 0, 0, 0>
KQ1DATA:1836                 SObj <0, offset sItemUnnamed, 75, 0, 0, 3Eh, 82h>
KQ1DATA:183E                 SObj <0, offset sItemUnnamed, 75, 0, 0, 19h, 76h>
KQ1DATA:1846                 SObj <0, offset sItemUnnamed, 79, 0, 0, 84h, 84h>
KQ1DATA:184E                 SObj <0, offset sItemSceptre, 77, 0, 0, 75h, 6Ah>
KQ1DATA:1856                 SObj <0, offset sItemShield, 77, 0, 0, 83h, 80h>
KQ1DATA:185E                 SObj <0, offset sItemFiddle, 79, 0, 0, 80h, 9Ah>
KQ1DATA:1866                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:186E                 SObj <0, offset sItemUnnamed, 53, 0, 0, 20h, 58h>
KQ1DATA:1876                 SObj <0, offset sItemUnnamed, 77, 0, 0, 1Eh, 58h>
KQ1DATA:187E                 SObj <0, offset sItemUnnamed, 79, 0, 0, 7Fh, 60h>
KQ1DATA:1886                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:188E                 SObj <0, offset sItemRing, 18, 0, 0, 4Bh, 4Bh>
KQ1DATA:1896                 SObj <0, offset sItemUnnamed, 79, 0, 0, 2Dh, 74h>
KQ1DATA:189E                 SObj <0, offset sItemUnnamed, 79, 0, 0, 5Ch, 73h>
KQ1DATA:18A6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:18AE                 SObj <0, offset sItemUnnamed, 51, 0, 0, 4Bh, 4Bh>
KQ1DATA:18B6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 28h, 78h>
KQ1DATA:18BE                 SObj <0, offset sItemUnnamed, 50, 0, 0, 4Bh, 4Bh>
KQ1DATA:18C6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 8Eh, 80h>
KQ1DATA:18CE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4, 45h>
KQ1DATA:18D6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 61h, 0A0h>
KQ1DATA:18DE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 55h, 52h>
KQ1DATA:18E6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:18EE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 20h, 58h>
KQ1DATA:18F6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:18FE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:1906                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:190E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:1916                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:191E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:1926                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:192E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 50h, 64h>
KQ1DATA:1936                 SObj <0, offset sItemUnnamed, 0, 0, 0, 55h, 52h>
KQ1DATA:193E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Fh, 88h>
KQ1DATA:1946                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Fh, 88h>
KQ1DATA:194E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Fh, 88h>
KQ1DATA:1956                 SObj <0, offset sItemUnnamed, 0, 0, 0, 7Fh, 60h>
KQ1DATA:195E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:1966                 SObj <0, offset sItemUnnamed, 0, 0, 0, 44h, 6Ch>
KQ1DATA:196E                 SObj <0, offset sItemMushroom, 0, 0, 0, 54h, 50h>
KQ1DATA:1976                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:197E                 SObj <0, offset sItemGoldWalnut, 30, 0, 0, 4Bh, 4Bh>
KQ1DATA:1986                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:198E                 SObj <0, offset sItemUnnamed, 65, 0, 0, 21h, 4Ch>
KQ1DATA:1996                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:199E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19A6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19AE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19B6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19BE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19C6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19CE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19D6                 SObj <0, offset sItemUnnamed, 1, 0, 0, 5, 12h>
KQ1DATA:19DE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 4Bh, 4Bh>
KQ1DATA:19E6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 54h, 77h>
KQ1DATA:19EE                 SObj <0, offset wItemWater, 0, 0, 0, 54h, 5Bh>
KQ1DATA:19F6                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:19FE                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A06                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A0E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A16                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A1E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A26                 SObj <0, offset sItemUnnamed, 0, 0, 0, 46h, 0A5h>
KQ1DATA:1A2E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A36                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A3E                 SObj <0, offset sItemUnnamed, 0, 0, 0, 0, 0>
KQ1DATA:1A46                 db    0
KQ1DATA:1A47                 db 0FFh



41
What is strange is that no PC version ever mentions Arthur Abraham.

42
The Amiga version of KQ1 is based on the 256K version 1.0U for the PC. Version 1.0U had no menus on the PC either, just as KQ3 version 1.01 did not, and just as SQ1 versions 1.0X and 1.1A did not. Menus were only added in early 1987 with interpreter version 2.4xx, when Sierra released most of their previous games with menus, which in the case of 256K KQ1 was version 2.0F. (The original self-booting KQ1 is the "128K version").

43
AGI Development Tools / Re: Pre-AGI2 versions
« on: October 20, 2016, 01:32:10 PM »
Quote
What version of AGI did the original booter PC versions of King's Quest 2 use?
Unfortunately, it does not print a version number when entering the debug mode, nor is there any version string in the data segment. Version 1.0W's executable however differs from version 1.1H's, so there must be at least two non-numbered versions.

I have managed to extract the resources from version 1.0W and recompile the VOL.X packages so that I can open it in AGI Studio. The picture and view resources open flawlessly (so you know I did not goof in compiling the VOL.X files); the sound resources are known to be in a different format --- Sierra accidently left a utility on the SQ1 1.1A disk to convert sounds to the AGI v2 format --- but the logic resources cannot be decoded at all, and obviously, the game doesn't run when fit with a v2 interpreter.

44
There's no "Avis Durgan" in the 128K version of KQ1. All text is in the clear on the disk. I have also never seen "Avis Durgan" being used in a copy-protection scheme. Sierra did use encryption as part of three of its copy protection schemes on the PC, but I have never seen "Avis Durgan" as a decryption key for code. So I would dispute that (unsourced) claim from Wikipedia.

There are five different on-disk copy protection schemes on Sierra's PC releases:
  • Sector sizes of 1024 bytes (standard is 512), used on Adventure in Serenia and the IBM release of King's Quest (128K). Apparently, IBM's duplication equipment could not handle the more advanced protection schemes.
  • "ON-LINE PROT01", used on Ulysses and the Golden Fleece, Frogger and Crossfire (PC version)
  • Unnamed protection type, basically a variation of "ON-LINE PROT01", used on the Radio Shack releases of B.C.'s Quest for Tires and King's Quest (128K) as well as the "PCjr" disk of Sierra On-Line's release of King's Quest (128K)
  • Formaster Copylock, used on Ultima II (1983 and 1984 releases), Troll's Tale, the Sierra release of B.C.'s Quest for Tires, Mr. Cool, Crossfire (PCjr floppy version), The Wizard and the Princess (PCjr version), King's Quest (128K Sierra On-Line release's "PC disk"), Sierra Championship Boxing (1984 version), Oil's Well (1984 version)
  • Softguard SuperLoK, used on Ultima II (1985 version), Space Quest, Space Quest II, King's Quest (256K version), King's Quest II, King's Quest III, The Black Cauldron (all versions excluding 2.10), Leisure Suit Larry in the Land of the Lounge Lizards, Thexder, Sierra Championship Boxing (1985 version), Donald Duck's Playground, Mickey's Space Adventure (720K disk only), Winnie the Pooh in the Hundred Acre Wood
Only the code of methods 1., 2. and 5. involves any encryption, and all use more complex keys and schemes than "Avis Durgan". The string does appear in the code of the two Hi-Res Adventures for the PC, but not as part of any copy-protection code.

45
AGI Community How To's & Tutorials / Re: Official AGI Documentation
« on: October 15, 2016, 05:23:58 PM »
Quote
(Those runnable DOS games on archive.org are quite cool really).
I find them to be nightmares, as the underlying emulators are badly configured, the game versions mislabeled, and the aspect of openly offering thousands of games for free stretching the meaning of "preservation" to a ludicrous level. But maybe that's just me.  ;)

Pages: 1 2 [3] 4

SMF 2.0.19 | SMF © 2021, Simple Machines
Simple Audio Video Embedder

Page created in 0.044 seconds with 20 queries.