256
The Games and other Sierra Adventure stuff / Re: Mage's Initiation released (Sierra-style Adventure/RPG)
« on: January 31, 2019, 05:45:03 PM »
Congratz! I will have to try it out.
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.
Thx! When I searched google with the terms "cortland" and "computer", I got no hints that it was related to Apple.QuoteThese problems led to the cancellation of the IIx project, but later, a new project was formed to produce an updated Apple II. This project, which led to the released IIGS, was known by various codenames while the new system was being developed, including "Phoenix", "Rambo", "Gumby", and "Cortland".https://en.wikipedia.org/wiki/Apple_IIGS#Development_and_codenames
Sierra's original PICTURE editor must have allowed them to draw down to 168, perhaps as a result of a bug maybe? Given this issue is in KQ4, maybe it was one of their later PICTURE editors. This issue doesn't seem to be in any other game that I've noticed so far.
I have 2 versions of Sierra's PICTURE editor: PIC.EXE (1987-02-23) and PE.EXE (1987-05-28).
I did not check them out yet, but you are welcome to do so: I just released my stash of AGI tools in this thread: http://sciprogramming.com/community/index.php?topic=1814.0
For those pictures where the 0xF7 relative draw tool is drawing down to Y = 168, I'm not 100% sure what to do. If I remove the validation check, then they load fine and render fine in my Interpreter, but then that means we're allowing an original Sierra game to violate rules that our own editors enforce. Sierra's original PICTURE editor must have allowed them to draw down to 168, perhaps as a result of a bug maybe? Given this issue is in KQ4, maybe it was one of their later PICTURE editors. This issue doesn't seem to be in any other game that I've noticed so far.As I mentioned earlier, in the interpreter, the position is converted to a linear offset in the picture memory buffer (pos = 160*y+x). The interpreter doesn't bother checking either X or Y; so when the offset exceeds the actual buffer size, AGI just sets that byte in memory even thought it's a buffer overflow. But since the picture buffer is the very last hunk of memory that is allocated, it doesn't overwrite any AGI data. So it looks just fine in AGI.
%define ego.is.a.dead.mother df1 [ the end
.
.
[*****
:no.input
:no.fucking.input
:also.no.mother.fucking.input
[*****
current.status = sleeping; [ nightie, night sweet ego
.
.
if (ego.location == 9) [ do the "get out of bed" schtick
.
.
if (!edge.ego.hit && ego.y < 20) [ sweep up after Jeff's bugs
.
.
load.logics( lgc.PO'd.wiz); [ Bring on that little wizzer!
if ((said( show, belt) || said( show, gun))) [ Funny, you don't look Oriental!
Thanks for solving that mystery. That definitely explains it then. Looks like I will have to add specific version checks in there to make it truly compatible.
I've checked this now, and flag 20 is not set. So I guess that agrees with the fact that only 3.002.102 and above use flag 20 for controlling this.I found it! It's a bug that's unique to version 3.002.086. Here's the code in v2.917 (which is identical in all versions up to 3.002.086:
Version 3.002.086 must be doing something similar but not controlled by flag 20.
mov [bp+newloop], 4 ; set newloop value = 4(means no loop change)
test word ptr [si+flags], FIXED_LOOP ; fixed loop?
jnz short setTheLoop ; if fixed, don't change loop
cmp byte ptr [si+loop_count], 2 ; loop count
jz short autoloop_sm ; if 2 loops, jump to small-loop selector
cmp byte ptr [si+loop_count], 3
jnz short autoloop_lg ; if three, also use small loop selector
; but if NOT three, go on to further check
autoloop_sm:
mov al, [si+obj_dir] ; use object direction
sub ah, ah
mov bx, ax ; to
mov al, loop_small[bx] ; convert direction to correct loop
jmp short changeLoopVal
autoloop_lg:
cmp byte ptr [si+loop_count], 4 ; if loop count != 4
jnz short setTheLoop ; don't change the loop
mov al, [si+obj_dir] ; if loop count == 4
sub ah, ah ; use object direction
mov bx, ax ; to
mov al, loop_large[bx] ; convert direction to correct loop
changeLoopVal:
mov [bp+newloop], al
setTheLoop:
... ; change loop if newloop value has changed (!= 4)
mov [bp+newloop], 4 ; set newloop value = 4(means no loop change)
test word ptr [si+flags], FIXED_LOOP ; fixed loop?
jnz short setTheLoop ; if fixed, don't change loop
cmp byte ptr [si+loop_count], 2 ; loop count
jz short autoloop_sm ; if 2 loops, jump to small-loop selector
cmp byte ptr [si+loop_count], 3
jnz short autoloop_lg ; if three, also use small loop selector
; but if NOT three, go on to further check
autoloop_sm:
mov al, [si+obj_dir] ; use object direction
sub ah, ah
mov bx, ax ; to
mov al, loop_small[bx] ; convert direction to correct loop
jmp short changeLoopVal
autoloop_lg:
cmp byte ptr [si+loop_count], 4 ; if loop count ***<*** 4
***jb*** short setTheLoop ; don't change the loop
mov al, [si+obj_dir] ; if loop count ***>*** 4
sub ah, ah ; use object direction
mov bx, ax ; to
mov al, loop_large[bx] ; convert direction to correct loop
changeLoopVal:
mov [bp+newloop], al
setTheLoop:
... ; change loop if newloop value has changed (!=4)
I've checked this now, and flag 20 is not set. So I guess that agrees with the fact that only 3.002.102 and above use flag 20 for controlling this.
Version 3.002.086 must be doing something similar but not controlled by flag 20.
Here are some samples from a few AGI games: https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id
The syntax is game specific and defined in their source.
SMF 2.0.19 |
SMF © 2021, Simple Machines
Simple Audio Video Embedder
Page created in 0.036 seconds with 20 queries.