2610 lines
31 KiB
NASM
2610 lines
31 KiB
NASM
;Copyright (c) 1990-2012 by Neil Dodwell
|
|
;Released with permission from Neil Dodwell under GPLv2
|
|
;See LICENSE file for full license text
|
|
;---------------------------------------------------------Inventory printer----
|
|
|
|
Fillryan proc near
|
|
; cx=what to search for
|
|
mov es,buffers
|
|
mov di,ryaninvlist
|
|
call findallryan
|
|
mov si,ryaninvlist
|
|
mov al,ryanpage
|
|
mov ah,0
|
|
mov cx,20
|
|
mul cx
|
|
add si,ax
|
|
|
|
mov di,inventx
|
|
mov bx,inventy
|
|
|
|
mov cx,2
|
|
ryanloop2: push cx di bx
|
|
mov cx,5
|
|
ryanloop1: push cx di bx
|
|
mov ax,[es:si]
|
|
add si,2
|
|
push si es
|
|
call obtoinv
|
|
pop es si
|
|
pop bx di cx
|
|
add di,itempicsize
|
|
loop ryanloop1
|
|
pop bx di cx
|
|
add bx,itempicsize
|
|
loop ryanloop2
|
|
|
|
call showryanpage
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Fillopen proc near
|
|
|
|
call deltextline
|
|
|
|
call getopenedsize ;find out how many slots
|
|
cmp ah,4 ;ah=slots, al=size holdable
|
|
jc lessthanapage
|
|
mov ah,4
|
|
lessthanapage: mov al,1
|
|
|
|
push ax
|
|
mov es,buffers
|
|
mov di,openinvlist
|
|
call findallopen
|
|
mov si,openinvlist
|
|
mov di,inventx
|
|
mov bx,inventy+96
|
|
pop cx
|
|
|
|
openloop1: push cx di bx
|
|
mov ax,[es:si]
|
|
add si,2
|
|
push si es
|
|
cmp ch,cl
|
|
jc nextopenslot
|
|
call obtoinv
|
|
nextopenslot: pop es si
|
|
pop bx di cx
|
|
add di,itempicsize
|
|
inc cl
|
|
cmp cl,5
|
|
jnz openloop1
|
|
|
|
call undertextline
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Findallryan proc near
|
|
|
|
push di
|
|
mov cx,30
|
|
mov ax,0ffffh
|
|
rep stosw
|
|
pop di
|
|
|
|
mov cl,4
|
|
mov ds,extras
|
|
mov bx,exdata
|
|
mov ch,0
|
|
findryanloop: cmp [bx+2],cl
|
|
jnz notinryaninv
|
|
cmp byte ptr [bx+3],255
|
|
jnz notinryaninv
|
|
mov al,[bx+4]
|
|
mov ah,0
|
|
push di
|
|
add di,ax
|
|
add di,ax
|
|
mov al,ch
|
|
mov ah,4 ;means it is an exchanged object ie:not free or set
|
|
stosw
|
|
pop di
|
|
notinryaninv: add bx,16
|
|
inc ch
|
|
cmp ch,numexobjects
|
|
jnz findryanloop
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Findallopen proc near
|
|
|
|
push di
|
|
mov cx,16
|
|
mov ax,0ffffh
|
|
rep stosw
|
|
pop di
|
|
|
|
mov cl,openedob
|
|
mov dl,openedtype
|
|
mov ds,extras
|
|
mov bx,exdata
|
|
mov ch,0
|
|
findopen1: cmp [bx+3],cl
|
|
jnz findopen2
|
|
cmp [bx+2],dl
|
|
jnz findopen2
|
|
cmp openedtype,4
|
|
jz noloccheck
|
|
mov al,[bx+5]
|
|
cmp al,reallocation
|
|
jnz findopen2
|
|
noloccheck: mov al,[bx+4]
|
|
mov ah,0
|
|
push di
|
|
add di,ax
|
|
add di,ax
|
|
mov al,ch
|
|
mov ah,4
|
|
stosw
|
|
pop di
|
|
findopen2: add bx,16
|
|
inc ch
|
|
cmp ch,numexobjects
|
|
jnz findopen1
|
|
|
|
mov cl,openedob
|
|
mov dl,openedtype
|
|
push dx
|
|
mov ds,freedat
|
|
pop dx
|
|
mov bx,0
|
|
mov ch,0
|
|
findopen1a: cmp [bx+3],cl
|
|
jnz findopen2a
|
|
cmp [bx+2],dl
|
|
jnz findopen2a
|
|
mov al,[bx+4]
|
|
mov ah,0
|
|
push di
|
|
add di,ax
|
|
add di,ax
|
|
mov al,ch
|
|
mov ah,2 ; means it's in a free ob
|
|
stosw
|
|
pop di
|
|
findopen2a: add bx,16
|
|
inc ch
|
|
cmp ch,80
|
|
jnz findopen1a
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Obtoinv proc near
|
|
|
|
push bx es si ax
|
|
|
|
push ax di bx
|
|
mov ds,icons1
|
|
sub di,2
|
|
sub bx,1
|
|
mov al,10
|
|
mov ah,0
|
|
call showframe
|
|
pop bx di ax
|
|
cmp al,255
|
|
jz finishfill
|
|
|
|
push bx di ax
|
|
mov ds,extras
|
|
cmp ah,4
|
|
jz isanextra
|
|
mov ds,freeframes
|
|
isanextra: mov cl,al
|
|
add al,al
|
|
add al,cl
|
|
inc al
|
|
mov ah,128
|
|
add bx,19
|
|
add di,18
|
|
call showframe
|
|
pop ax di bx
|
|
|
|
push bx
|
|
call getanyaddir
|
|
call isitworn
|
|
pop bx
|
|
jnz finishfill
|
|
mov ds,icons1 ;Print wearing logo
|
|
sub di,3
|
|
sub bx,2
|
|
mov al,7
|
|
mov ah,0
|
|
call showframe
|
|
|
|
finishfill: pop ax si es bx
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Isitworn proc near ;zero if yes
|
|
|
|
mov al,[es:bx+12]
|
|
cmp al,"W"-"A"
|
|
jnz notworn
|
|
mov al,[es:bx+13]
|
|
cmp al,"E"-"A"
|
|
notworn: ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Makeworn proc near
|
|
|
|
mov byte ptr [es:bx+12],"W"-"A"
|
|
mov byte ptr [es:bx+13],"E"-"A"
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;-------------------------------------------------------Examining an object----
|
|
|
|
Examineob proc near
|
|
|
|
mov pointermode,0
|
|
mov timecount,0
|
|
|
|
examineagain: mov inmaparea,0
|
|
mov examagain,0
|
|
mov openedob,255
|
|
mov openedtype,255
|
|
mov invopen,0
|
|
mov al,commandtype
|
|
mov objecttype,al
|
|
mov itemframe,0
|
|
mov pointerframe,0
|
|
|
|
call createpanel
|
|
call showpanel
|
|
call showman
|
|
call showexit
|
|
call obicons
|
|
call obpicture
|
|
call describeob
|
|
call undertextline
|
|
|
|
mov commandtype,255
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
|
|
waitexam: ;call delpointer
|
|
call readmouse
|
|
call showpointer
|
|
call vsync
|
|
call dumppointer
|
|
call dumptextline
|
|
call delpointer
|
|
|
|
mov getback,0
|
|
mov bx,offset cs:examlist
|
|
cmp invopen,0
|
|
jz notuseinv
|
|
mov bx,offset cs:invlist1
|
|
cmp invopen,1
|
|
jz notuseinv
|
|
mov bx,offset cs:withlist1
|
|
notuseinv: call checkcoords
|
|
|
|
cmp quitrequested, 0
|
|
jnz stopwaiting
|
|
|
|
cmp examagain,0
|
|
jz norex
|
|
jmp examineagain
|
|
norex: cmp getback,0
|
|
jz waitexam
|
|
stopwaiting:
|
|
|
|
mov pickup,0
|
|
cmp watchingtime,0
|
|
jnz iswatching
|
|
cmp newlocation,255
|
|
jnz justgetback
|
|
|
|
iswatching: call makemainscreen
|
|
mov invopen,0
|
|
mov openedob,255
|
|
ret
|
|
|
|
justgetback: mov invopen,0
|
|
mov openedob,255
|
|
ret
|
|
|
|
examlist: dw 273,320,157,198,getbackfromob
|
|
dw 260,300,0,44,useobject
|
|
dw 210,254,0,44,selectopenob
|
|
dw 144,176,64,96,setpickup
|
|
dw 0,50,50,200,examinventory
|
|
dw 0,320,0,200,blank
|
|
dw 0ffffh
|
|
|
|
invlist1: dw 273,320,157,198,getbackfromob
|
|
dw 255,294,0,24,dropobject
|
|
dw inventx+167,inventx+167+(18*3),inventy-18,inventy-2,incryanpage
|
|
dw inventx
|
|
openchangesize: dw inventx+(4*itempicsize)
|
|
dw inventy+100,inventy+100+itempicsize,useopened
|
|
dw inventx,inventx+(5*itempicsize)
|
|
dw inventy,inventy+(2*itempicsize),intoinv
|
|
dw 0,320,0,200,blank
|
|
dw 0ffffh
|
|
|
|
withlist1: dw 273,320,157,198,getbackfromob
|
|
dw inventx+167,inventx+167+(18*3),inventy-18,inventy-2,incryanpage
|
|
dw inventx,inventx+(5*itempicsize)
|
|
dw inventy,inventy+(2*itempicsize),selectob
|
|
dw 0,320,0,200,blank
|
|
dw 0ffffh
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Makemainscreen proc near
|
|
|
|
call createpanel
|
|
mov newobs,1
|
|
call drawfloor
|
|
call spriteupdate
|
|
call printsprites
|
|
call reelsonscreen
|
|
call showicon
|
|
call getunderzoom
|
|
call undertextline
|
|
mov commandtype,255
|
|
call animpointer
|
|
call worktoscreenm
|
|
mov commandtype,200
|
|
mov manisoffscreen,0
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Getbackfromob proc near
|
|
|
|
cmp pickup,1
|
|
jnz notheldob
|
|
call blank
|
|
ret
|
|
notheldob: call getback1
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Incryanpage proc near
|
|
|
|
cmp commandtype,222
|
|
jz alreadyincryan
|
|
mov commandtype,222
|
|
mov al,31
|
|
call commandonly
|
|
alreadyincryan: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz noincryan
|
|
and ax,1
|
|
jnz doincryan
|
|
noincryan: ret
|
|
|
|
doincryan: mov ax,mousex
|
|
sub ax,inventx+167
|
|
mov ryanpage,-1
|
|
findnewpage: inc ryanpage
|
|
sub ax,18
|
|
jnc findnewpage
|
|
call delpointer
|
|
call fillryan
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Openinv proc near
|
|
|
|
mov invopen,1
|
|
mov al,61
|
|
mov di,inventx
|
|
mov bx,inventy-10
|
|
mov dl,240
|
|
call printmessage
|
|
call fillryan
|
|
mov commandtype,255
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Showryanpage proc near
|
|
|
|
mov ds,icons1
|
|
mov di,inventx+167
|
|
mov bx,inventy-12
|
|
mov al,12
|
|
mov ah,0
|
|
call showframe
|
|
|
|
mov al,13
|
|
add al,ryanpage
|
|
push ax
|
|
mov al,ryanpage
|
|
mov ah,0
|
|
mov cx,18
|
|
mul cx
|
|
mov ds,icons1
|
|
mov di,inventx+167
|
|
add di,ax
|
|
mov bx,inventy-12
|
|
pop ax
|
|
mov ah,0
|
|
call showframe
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Openob proc near
|
|
|
|
mov al,openedob
|
|
mov ah,openedtype
|
|
mov di,offset cs:commandline
|
|
call copyname
|
|
|
|
mov di,inventx
|
|
mov bx,inventy+86
|
|
mov al,62
|
|
mov dl,240
|
|
call printmessage
|
|
|
|
mov di,lastxpos
|
|
add di,5
|
|
mov bx,inventy+86
|
|
push cs
|
|
pop es
|
|
mov si,offset cs:commandline
|
|
mov dl,220
|
|
mov al,0
|
|
mov ah,0
|
|
call printdirect
|
|
|
|
call fillopen
|
|
call getopenedsize
|
|
mov al,ah
|
|
mov ah,0
|
|
mov cx,itempicsize
|
|
mul cx
|
|
add ax,inventx
|
|
mov bx,offset cs:openchangesize
|
|
mov [cs:bx],ax
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Obicons proc near
|
|
|
|
mov al,command
|
|
call getanyad
|
|
cmp al,255
|
|
jz cantopenit
|
|
|
|
mov ds,icons2
|
|
mov di,210
|
|
mov bx,1
|
|
mov al,4
|
|
mov ah,0
|
|
call showframe
|
|
|
|
cantopenit: mov ds,icons2
|
|
mov di,260
|
|
mov bx,1
|
|
mov al,1
|
|
mov ah,0
|
|
call showframe
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Examicon proc near
|
|
|
|
mov ds,icons2
|
|
mov di,254
|
|
mov bx,5
|
|
mov al,3
|
|
mov ah,0
|
|
call showframe
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Obpicture proc near
|
|
|
|
mov al,command
|
|
mov ah,objecttype
|
|
cmp ah,1
|
|
jz setframe
|
|
cmp ah,4
|
|
jz exframe
|
|
|
|
mov ds,freeframes
|
|
mov di,160
|
|
mov bx,68
|
|
mov cl,al
|
|
add al,al
|
|
add al,cl
|
|
inc al
|
|
mov ah,128
|
|
call showframe
|
|
ret
|
|
|
|
setframe: ret
|
|
|
|
exframe: mov ds,extras
|
|
mov di,160
|
|
mov bx,68
|
|
mov cl,al
|
|
add al,al
|
|
add al,cl
|
|
inc al
|
|
mov ah,128
|
|
call showframe
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Describeob proc near
|
|
|
|
call getobtextstart
|
|
|
|
mov di,33
|
|
mov bx,92
|
|
|
|
cmp foreignrelease, 0
|
|
jz notsetd
|
|
cmp objecttype,1
|
|
jnz notsetd
|
|
mov bx,82
|
|
notsetd:
|
|
mov dl,241
|
|
mov ah,16
|
|
mov charshift,91+91
|
|
call printdirect
|
|
mov charshift,0
|
|
mov di,36
|
|
mov bx,104
|
|
cmp foreignrelease, 0
|
|
jz notsetd2
|
|
cmp objecttype,1
|
|
jnz notsetd2
|
|
mov bx,94
|
|
notsetd2:
|
|
mov dl,241
|
|
mov ah,0
|
|
call printdirect
|
|
push bx
|
|
call obsthatdothings
|
|
pop bx
|
|
call additionaltext
|
|
ret
|
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Additionaltext proc near
|
|
|
|
add bx,10
|
|
push bx
|
|
mov al,command
|
|
mov ah,objecttype
|
|
mov cl,"C"
|
|
mov ch,"U"
|
|
mov dl,"P"
|
|
mov dh,"E"
|
|
call compare
|
|
jz emptycup
|
|
mov al,command
|
|
mov ah,objecttype
|
|
mov cl,"C"
|
|
mov ch,"U"
|
|
mov dl,"P"
|
|
mov dh,"F"
|
|
call compare
|
|
jz fullcup
|
|
pop bx
|
|
ret
|
|
emptycup: mov al,40
|
|
call findpuztext
|
|
pop bx
|
|
mov di,36
|
|
mov dl,241
|
|
mov ah,0
|
|
call printdirect
|
|
ret
|
|
fullcup: mov al,39
|
|
call findpuztext
|
|
pop bx
|
|
mov di,36
|
|
mov dl,241
|
|
mov ah,0
|
|
call printdirect
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Obsthatdothings proc near
|
|
|
|
mov al,command
|
|
mov ah,objecttype
|
|
mov cl,"M"
|
|
mov ch,"E"
|
|
mov dl,"M"
|
|
mov dh,"B"
|
|
call compare
|
|
jnz notlouiscard
|
|
mov al,4
|
|
call getlocation
|
|
cmp al,1
|
|
jz seencard
|
|
mov al,4
|
|
call setlocation
|
|
call lookatcard
|
|
seencard: ret
|
|
notlouiscard: ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Getobtextstart proc near
|
|
|
|
mov es,freedesc
|
|
mov si,freetextdat
|
|
mov cx,freetext
|
|
cmp objecttype,2
|
|
jz describe
|
|
mov es,setdesc
|
|
mov si,settextdat
|
|
mov cx,settext
|
|
cmp objecttype,1
|
|
jz describe
|
|
mov es,extras
|
|
mov si,extextdat
|
|
mov cx,extext
|
|
|
|
describe: mov al,command
|
|
mov ah,0
|
|
add ax,ax
|
|
add si,ax
|
|
mov ax,[es:si]
|
|
add ax,cx
|
|
mov si,ax
|
|
mov bx,ax
|
|
tryagain: push si
|
|
call findnextcolon
|
|
mov al,[es:si]
|
|
mov cx,si
|
|
pop si
|
|
cmp objecttype,1
|
|
jnz cantmakeoneup
|
|
cmp al,0
|
|
jz findsometext
|
|
cmp al,":"
|
|
jz findsometext
|
|
cantmakeoneup: ret
|
|
|
|
findsometext: call searchforsame
|
|
jmp tryagain
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Searchforsame proc near
|
|
|
|
mov si,cx
|
|
searchagain: inc si
|
|
mov al,[es:bx]
|
|
search: cmp [es:si],al
|
|
jz gotstartletter
|
|
inc cx
|
|
inc si
|
|
cmp si,8000 ;arbitrary give-up
|
|
jc search ;counter.
|
|
mov si,bx
|
|
pop ax
|
|
ret
|
|
|
|
gotstartletter: push bx si
|
|
keepchecking: inc si
|
|
inc bx
|
|
mov al,[es:bx]
|
|
mov ah,[es:si]
|
|
cmp al,":"
|
|
jz foundmatch
|
|
cmp al,0
|
|
jz foundmatch
|
|
cmp al,ah
|
|
jz keepchecking
|
|
pop si bx
|
|
jmp searchagain
|
|
|
|
foundmatch: pop si bx
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------Using an object----
|
|
|
|
|
|
|
|
|
|
|
|
Findnextcolon proc near
|
|
|
|
isntcolon: mov al,[es:si]
|
|
inc si
|
|
cmp al,0
|
|
jz endofcolon
|
|
cmp al,":"
|
|
jnz isntcolon
|
|
endofcolon: ret
|
|
|
|
endp
|
|
|
|
|
|
;------------------------------------------------------Taking, dropping etc----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Inventory proc near
|
|
|
|
cmp mandead,1
|
|
jz iswatchinv
|
|
cmp watchingtime,0
|
|
jz notwatchinv
|
|
iswatchinv: call blank
|
|
ret
|
|
notwatchinv: cmp commandtype,239
|
|
jz alreadyopinv
|
|
mov commandtype,239
|
|
mov al,32
|
|
call commandonly
|
|
alreadyopinv: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz cantopinv
|
|
and ax,1
|
|
jnz doopeninv
|
|
cantopinv: ret
|
|
|
|
doopeninv: mov timecount,0
|
|
mov pointermode,0
|
|
mov inmaparea,0
|
|
call animpointer
|
|
call createpanel
|
|
call showpanel
|
|
call examicon
|
|
call showman
|
|
call showexit
|
|
call undertextline
|
|
mov pickup,0
|
|
mov invopen,2
|
|
call openinv
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
mov openedob,255
|
|
jmp waitexam ; very naughty!
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Setpickup proc near
|
|
|
|
cmp objecttype,1
|
|
jz cantpick
|
|
cmp objecttype,3
|
|
jz cantpick
|
|
call getanyad
|
|
mov al,[es:bx+2]
|
|
cmp al,4
|
|
jnz canpick
|
|
cantpick: call blank
|
|
ret
|
|
|
|
canpick: cmp commandtype,209
|
|
jz alreadysp
|
|
mov commandtype,209
|
|
|
|
mov bl,command
|
|
mov bh,objecttype
|
|
mov al,33
|
|
call commandwithob
|
|
alreadysp: mov ax,mousebutton
|
|
cmp ax,1
|
|
jnz nosetpick
|
|
cmp ax,oldbutton
|
|
jnz dosetpick
|
|
nosetpick: ret
|
|
|
|
dosetpick: call createpanel
|
|
call showpanel
|
|
call showman
|
|
call showexit
|
|
call examicon
|
|
mov pickup,1
|
|
mov invopen,2
|
|
cmp objecttype,4
|
|
jz pickupexob
|
|
|
|
mov al,command
|
|
mov itemframe,al
|
|
mov openedob,255
|
|
call transfertoex
|
|
mov itemframe,al
|
|
mov objecttype,4
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],20 ; means it is in transit
|
|
mov byte ptr [es:bx+3],255
|
|
call openinv
|
|
call worktoscreenm
|
|
ret
|
|
|
|
pickupexob: mov al,command
|
|
mov itemframe,al
|
|
mov openedob,255
|
|
call openinv
|
|
call worktoscreenm
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Examinventory proc near
|
|
|
|
cmp commandtype,249
|
|
jz alreadyexinv
|
|
mov commandtype,249
|
|
mov al,32
|
|
call commandonly
|
|
alreadyexinv: mov ax,mousebutton
|
|
and ax,1
|
|
jnz doexinv
|
|
ret
|
|
|
|
doexinv: call createpanel
|
|
call showpanel
|
|
call showman
|
|
call showexit
|
|
call examicon
|
|
mov pickup,0
|
|
mov invopen,2
|
|
call openinv
|
|
call worktoscreenm
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Reexfrominv proc near
|
|
|
|
call findinvpos
|
|
mov ax,[es:bx]
|
|
mov commandtype,ah
|
|
mov command,al
|
|
mov examagain,1
|
|
mov pointermode,0
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Reexfromopen proc near
|
|
|
|
ret
|
|
call findopenpos
|
|
mov ax,[es:bx]
|
|
mov commandtype,ah
|
|
mov command,al
|
|
mov examagain,1
|
|
mov pointermode,0
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Swapwithinv proc near
|
|
|
|
mov al,itemframe
|
|
mov ah,objecttype
|
|
cmp ax,oldsubject
|
|
jnz difsub7
|
|
cmp commandtype,243
|
|
jz alreadyswap1
|
|
mov commandtype,243
|
|
|
|
difsub7: mov oldsubject,ax
|
|
mov bx,ax
|
|
mov al,34
|
|
call commandwithob
|
|
alreadyswap1: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz cantswap1
|
|
and ax,1
|
|
jnz doswap1
|
|
cantswap1: ret
|
|
|
|
doswap1: mov ah,objecttype
|
|
mov al,itemframe
|
|
push ax
|
|
|
|
call findinvpos
|
|
mov ax,[es:bx]
|
|
mov itemframe,al
|
|
mov objecttype,ah
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],20 ; means unplaced object
|
|
mov byte ptr [es:bx+3],255
|
|
mov bl,itemframe
|
|
mov bh,objecttype
|
|
|
|
pop ax
|
|
mov objecttype,ah
|
|
mov itemframe,al
|
|
push bx
|
|
|
|
call findinvpos ;NONE OF THIS IS NEEDED
|
|
call delpointer ;ONLY EXTRAS CAN BE IN
|
|
mov al,itemframe
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],4
|
|
mov byte ptr [es:bx+3],255
|
|
mov al,lastinvpos
|
|
mov [es:bx+4],al
|
|
|
|
pop ax
|
|
mov objecttype,ah
|
|
mov itemframe,al
|
|
call fillryan
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Swapwithopen proc near
|
|
|
|
mov al,itemframe
|
|
mov ah,objecttype
|
|
cmp ax,oldsubject
|
|
jnz difsub8
|
|
cmp commandtype,242
|
|
jz alreadyswap2
|
|
mov commandtype,242
|
|
|
|
difsub8: mov oldsubject,ax
|
|
mov bx,ax
|
|
mov al,34
|
|
call commandwithob
|
|
alreadyswap2: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz cantswap2
|
|
and ax,1
|
|
jnz doswap2
|
|
cantswap2: ret
|
|
|
|
doswap2: call geteitherad
|
|
call isitworn
|
|
jnz notwornswap
|
|
call wornerror
|
|
ret
|
|
notwornswap: call delpointer
|
|
mov al,itemframe
|
|
cmp al,openedob
|
|
jnz isntsame2
|
|
mov al,objecttype
|
|
cmp al,openedtype
|
|
jnz isntsame2
|
|
call errormessage1
|
|
ret
|
|
|
|
isntsame2: call checkobjectsize
|
|
cmp al,0
|
|
jz sizeok2
|
|
ret
|
|
|
|
sizeok2: mov ah,objecttype
|
|
mov al,itemframe
|
|
push ax
|
|
|
|
call findopenpos
|
|
mov ax,[es:bx]
|
|
mov itemframe,al
|
|
mov objecttype,ah
|
|
|
|
cmp ah,4
|
|
jnz makeswapex
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],20
|
|
mov byte ptr [es:bx+3],255
|
|
jmp actuallyswap
|
|
|
|
makeswapex: call transfertoex
|
|
mov itemframe,al
|
|
mov objecttype,4
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],20
|
|
mov byte ptr [es:bx+3],255
|
|
|
|
actuallyswap: mov bl,itemframe
|
|
mov bh,objecttype
|
|
pop ax
|
|
mov objecttype,ah
|
|
mov itemframe,al
|
|
push bx
|
|
|
|
call findopenpos
|
|
call geteitherad
|
|
mov al,openedtype
|
|
mov byte ptr [es:bx+2],al
|
|
mov al,openedob
|
|
mov byte ptr [es:bx+3],al
|
|
mov al,lastinvpos
|
|
mov [es:bx+4],al
|
|
mov al,reallocation
|
|
mov [es:bx+5],al
|
|
|
|
pop ax
|
|
mov objecttype,ah
|
|
mov itemframe,al
|
|
call fillopen
|
|
call fillryan
|
|
call undertextline
|
|
call readmouse
|
|
call useopened
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intoinv proc near
|
|
|
|
cmp pickup,0
|
|
jnz notout
|
|
call outofinv
|
|
ret
|
|
|
|
notout: call findinvpos
|
|
mov ax,[es:bx]
|
|
cmp al,255
|
|
jz canplace1
|
|
call swapwithinv
|
|
ret
|
|
|
|
canplace1: mov al,itemframe
|
|
mov ah,objecttype
|
|
cmp ax,oldsubject
|
|
jnz difsub1
|
|
cmp commandtype,220
|
|
jz alreadyplce
|
|
mov commandtype,220
|
|
|
|
difsub1: mov oldsubject,ax
|
|
mov bx,ax
|
|
mov al,35
|
|
call commandwithob
|
|
alreadyplce: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz notletgo2
|
|
and ax,1
|
|
jnz doplace
|
|
notletgo2: ret
|
|
|
|
doplace: call delpointer
|
|
mov al,itemframe
|
|
call getexad
|
|
mov byte ptr [es:bx+2],4
|
|
mov byte ptr [es:bx+3],255
|
|
mov al,lastinvpos
|
|
mov [es:bx+4],al
|
|
|
|
mov pickup,0
|
|
call fillryan
|
|
call readmouse
|
|
call showpointer
|
|
call outofinv
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Deletetaken proc near ;gets rid of objects that were
|
|
;transfered to exlist ages ago
|
|
mov es,freedat
|
|
mov ah,reallocation
|
|
mov ds,extras
|
|
mov si,exdata
|
|
|
|
mov cx,numexobjects
|
|
takenloop: mov al,[si+11]
|
|
cmp al,ah
|
|
jnz notinhere
|
|
mov bl,[si+1]
|
|
mov bh,0
|
|
add bx,bx
|
|
add bx,bx
|
|
add bx,bx
|
|
add bx,bx
|
|
mov byte ptr [es:bx+2],254 ; was 255
|
|
|
|
notinhere: add si,16
|
|
loop takenloop
|
|
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Outofinv proc near
|
|
|
|
call findinvpos
|
|
mov ax,[es:bx]
|
|
cmp al,255
|
|
jnz canpick2
|
|
call blank
|
|
ret
|
|
|
|
canpick2: mov bx,mousebutton
|
|
cmp bx,2
|
|
jnz canpick2a
|
|
call reexfrominv
|
|
ret
|
|
|
|
canpick2a: cmp ax,oldsubject
|
|
jnz difsub3
|
|
cmp commandtype,221
|
|
jz alreadygrab
|
|
mov commandtype,221
|
|
|
|
difsub3: mov oldsubject,ax
|
|
mov bx,ax
|
|
mov al,36
|
|
call commandwithob
|
|
alreadygrab: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz notletgo
|
|
and ax,1
|
|
jnz dograb
|
|
notletgo: ret
|
|
|
|
dograb: call delpointer
|
|
mov pickup,1
|
|
call findinvpos
|
|
mov ax,[es:bx]
|
|
mov itemframe,al
|
|
mov objecttype,ah
|
|
call getexad
|
|
mov byte ptr [es:bx+2],20 ; means unplaced object
|
|
mov byte ptr [es:bx+3],255
|
|
call fillryan
|
|
call readmouse
|
|
call showpointer
|
|
call intoinv
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Getfreead proc near
|
|
|
|
mov ah,0
|
|
mov cl,4
|
|
shl ax,cl
|
|
mov bx,ax
|
|
mov es,freedat
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Getexad proc near
|
|
|
|
mov ah,0
|
|
mov bx,16
|
|
mul bx
|
|
mov bx,ax
|
|
mov es,extras
|
|
add bx,exdata
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Geteitherad proc near
|
|
|
|
cmp objecttype,4
|
|
jz isinexlist
|
|
mov al,itemframe
|
|
call getfreead
|
|
ret
|
|
isinexlist: mov al,itemframe
|
|
call getexad
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Getanyad proc near ;nearly same as above
|
|
;but uses command
|
|
cmp objecttype,4
|
|
jz isex
|
|
cmp objecttype,2
|
|
jz isfree
|
|
mov al,command
|
|
call getsetad
|
|
mov ax,[es:bx+4]
|
|
ret
|
|
isfree: mov al,command
|
|
call getfreead
|
|
mov ax,[es:bx+7]
|
|
ret
|
|
isex: mov al,command
|
|
call getexad
|
|
mov ax,[es:bx+7]
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Getanyaddir proc near ;nearly same as above
|
|
;but uses ax
|
|
cmp ah,4
|
|
jz isex3
|
|
cmp ah,2
|
|
jz isfree3
|
|
call getsetad
|
|
ret
|
|
isfree3: call getfreead
|
|
ret
|
|
isex3: call getexad
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Getopenedsize proc near ;nearly same as above again
|
|
;but finds ad of opened ob
|
|
cmp openedtype,4
|
|
jz isex2
|
|
cmp openedtype,2
|
|
jz isfree2
|
|
mov al,openedob
|
|
call getsetad
|
|
mov ax,[es:bx+3]
|
|
ret
|
|
isfree2: mov al,openedob
|
|
call getfreead
|
|
mov ax,[es:bx+7]
|
|
ret
|
|
isex2: mov al,openedob
|
|
call getexad
|
|
mov ax,[es:bx+7]
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Getsetad proc near
|
|
|
|
mov ah,0
|
|
mov bx,64
|
|
mul bx
|
|
mov bx,ax
|
|
mov es,setdat
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Findinvpos proc near
|
|
|
|
mov cx,mousex
|
|
sub cx,inventx
|
|
mov bx,-1
|
|
findinv1: inc bx
|
|
sub cx,itempicsize
|
|
jnc findinv1
|
|
|
|
mov cx,mousey
|
|
sub cx,inventy
|
|
sub bx,5
|
|
findinv2: add bx,5
|
|
sub cx,itempicsize
|
|
jnc findinv2
|
|
|
|
mov al,ryanpage
|
|
mov ah,0
|
|
mov cx,10
|
|
mul cx
|
|
add bx,ax
|
|
|
|
mov al,bl
|
|
mov lastinvpos,al
|
|
add bx,bx
|
|
|
|
mov es,buffers
|
|
add bx,ryaninvlist
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Findopenpos proc near
|
|
|
|
mov cx,mousex
|
|
sub cx,inventx
|
|
mov bx,-1
|
|
findopenp1: inc bx
|
|
sub cx,itempicsize
|
|
jnc findopenp1
|
|
|
|
mov al,bl
|
|
mov lastinvpos,al
|
|
|
|
add bx,bx
|
|
mov es,buffers
|
|
add bx,openinvlist
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;--------------------------------------------------------Dropping an object----
|
|
|
|
Dropobject proc near
|
|
|
|
cmp commandtype,223
|
|
jz alreadydrop
|
|
mov commandtype,223
|
|
cmp pickup,0
|
|
jz blank
|
|
|
|
mov bl,itemframe
|
|
mov bh,objecttype
|
|
mov al,37
|
|
call commandwithob
|
|
alreadydrop: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz nodrop
|
|
and ax,1
|
|
jnz dodrop
|
|
nodrop: ret
|
|
|
|
dodrop: call geteitherad
|
|
call isitworn
|
|
jnz nowornerror
|
|
call wornerror
|
|
ret
|
|
nowornerror: cmp reallocation,47
|
|
jz nodrop2
|
|
mov cl,ryanx
|
|
add cl,12
|
|
mov ch,ryany
|
|
add ch,12
|
|
call checkone
|
|
cmp cl,2
|
|
jc nodroperror
|
|
nodrop2: call droperror
|
|
ret
|
|
nodroperror: cmp mapxsize,64
|
|
jnz notinlift
|
|
cmp mapysize,64
|
|
jnz notinlift
|
|
call droperror
|
|
ret
|
|
notinlift: mov al,itemframe
|
|
mov ah,4
|
|
mov cl,"G"
|
|
mov ch,"U"
|
|
mov dl,"N"
|
|
mov dh,"A"
|
|
call compare
|
|
jz cantdrop
|
|
mov al,itemframe
|
|
mov ah,4
|
|
mov cl,"S"
|
|
mov ch,"H"
|
|
mov dl,"L"
|
|
mov dh,"D"
|
|
call compare
|
|
jz cantdrop
|
|
mov objecttype,4
|
|
mov al,itemframe
|
|
call getexad
|
|
mov byte ptr [es:bx+2],0
|
|
mov al,ryanx
|
|
add al,4
|
|
mov cl,4
|
|
shr al,cl
|
|
add al,mapx
|
|
mov ah,ryany
|
|
add ah,8
|
|
mov cl,4
|
|
shr ah,cl
|
|
add ah,mapy
|
|
mov byte ptr [es:bx+3],al
|
|
mov byte ptr [es:bx+5],ah
|
|
mov al,ryanx
|
|
add al,4
|
|
and al,15
|
|
mov ah,ryany
|
|
add ah,8
|
|
and ah,15
|
|
mov byte ptr [es:bx+4],al
|
|
mov byte ptr [es:bx+6],ah
|
|
mov pickup,0
|
|
mov al,reallocation
|
|
mov [es:bx],al
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Droperror proc near
|
|
|
|
mov commandtype,255
|
|
call delpointer
|
|
mov di,76
|
|
mov bx,21
|
|
mov al,56
|
|
mov dl,240
|
|
call printmessage
|
|
call worktoscreenm
|
|
mov cx,50
|
|
call hangonp
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
mov commandtype,255
|
|
call worktoscreenm
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Cantdrop proc near
|
|
|
|
mov commandtype,255
|
|
call delpointer
|
|
mov di,76
|
|
mov bx,21
|
|
mov al,24
|
|
mov dl,240
|
|
call printmessage
|
|
call worktoscreenm
|
|
mov cx,50
|
|
call hangonp
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
mov commandtype,255
|
|
call worktoscreenm
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
Wornerror proc near
|
|
|
|
mov commandtype,255
|
|
call delpointer
|
|
mov di,76
|
|
mov bx,21
|
|
mov al,57
|
|
mov dl,240
|
|
call printmessage
|
|
call worktoscreenm
|
|
mov cx,50
|
|
call hangonp
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
mov commandtype,255
|
|
call worktoscreenm
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removeobfrominv proc near
|
|
|
|
cmp command,100
|
|
jz obnotexist
|
|
call getanyad
|
|
mov di,bx
|
|
mov cl,command
|
|
mov ch,0
|
|
call deleteexobject
|
|
;mov byte ptr [es:bx+2],0
|
|
obnotexist: ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------Opening an object----
|
|
|
|
Selectopenob proc near
|
|
|
|
mov al,command
|
|
call getanyad
|
|
cmp al,255
|
|
jnz canopenit1
|
|
call blank
|
|
ret
|
|
|
|
canopenit1: cmp commandtype,224
|
|
jz alreadyopob
|
|
mov commandtype,224
|
|
|
|
mov bl,command
|
|
mov bh,objecttype
|
|
mov al,38
|
|
call commandwithob
|
|
alreadyopob: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz noopenob
|
|
and ax,1
|
|
jnz doopenob
|
|
noopenob: ret
|
|
|
|
doopenob: mov al,command
|
|
mov openedob,al
|
|
mov al,objecttype
|
|
mov openedtype,al
|
|
|
|
call createpanel
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
call showexit
|
|
call openinv
|
|
call openob
|
|
call undertextline
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Useopened proc near
|
|
|
|
cmp openedob,255
|
|
jz cannotuseopen
|
|
cmp pickup,0
|
|
jnz notout2
|
|
call outofopen
|
|
ret
|
|
|
|
notout2: call findopenpos
|
|
mov ax,[es:bx]
|
|
cmp al,255
|
|
jz canplace3
|
|
call swapwithopen
|
|
cannotuseopen: ret
|
|
|
|
canplace3: cmp pickup,1
|
|
jz intoopen
|
|
call blank
|
|
ret
|
|
|
|
intoopen: mov al,itemframe
|
|
mov ah,objecttype
|
|
cmp ax,oldsubject
|
|
jnz difsub2
|
|
cmp commandtype,227
|
|
jz alreadyplc2
|
|
mov commandtype,227
|
|
|
|
difsub2: mov oldsubject,ax
|
|
mov bx,ax
|
|
mov al,35
|
|
call commandwithob
|
|
alreadyplc2: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz notletgo3
|
|
cmp ax,1
|
|
jz doplace2
|
|
notletgo3: ret
|
|
|
|
doplace2: call geteitherad
|
|
call isitworn
|
|
jnz notworntoopen
|
|
call wornerror
|
|
ret
|
|
notworntoopen: call delpointer
|
|
mov al,itemframe
|
|
cmp al,openedob
|
|
jnz isntsame
|
|
mov al,objecttype
|
|
cmp al,openedtype
|
|
jnz isntsame
|
|
call errormessage1
|
|
ret
|
|
|
|
isntsame: call checkobjectsize
|
|
cmp al,0
|
|
jz sizeok1
|
|
ret
|
|
|
|
sizeok1: mov pickup,0
|
|
mov al,itemframe
|
|
call geteitherad
|
|
mov al,openedtype
|
|
mov byte ptr [es:bx+2],al
|
|
mov al,openedob
|
|
mov byte ptr [es:bx+3],al
|
|
mov al,lastinvpos
|
|
mov [es:bx+4],al
|
|
mov al,reallocation
|
|
mov [es:bx+5],al
|
|
call fillopen
|
|
call undertextline
|
|
call readmouse
|
|
call useopened
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Errormessage1 proc near
|
|
|
|
call delpointer
|
|
mov di,76
|
|
mov bx,21
|
|
mov al,58
|
|
mov dl,240
|
|
call printmessage
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
mov cx,50
|
|
call hangonp
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
call readmouse
|
|
call useopened
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Errormessage2 proc near
|
|
|
|
mov commandtype,255
|
|
call delpointer
|
|
mov di,76
|
|
mov bx,21
|
|
mov al,59
|
|
mov dl,240
|
|
call printmessage
|
|
call readmouse
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
mov cx,50
|
|
call hangonp
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
call readmouse
|
|
call useopened
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Errormessage3 proc near
|
|
|
|
call delpointer
|
|
mov di,76
|
|
mov bx,21
|
|
mov al,60
|
|
mov dl,240
|
|
call printmessage
|
|
call worktoscreenm
|
|
mov cx,50
|
|
call hangonp
|
|
call showpanel
|
|
call showman
|
|
call examicon
|
|
call readmouse
|
|
call useopened
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Checkobjectsize proc near
|
|
|
|
call getopenedsize
|
|
push ax
|
|
mov al,itemframe
|
|
call geteitherad
|
|
mov al,[es:bx+9]
|
|
pop cx
|
|
|
|
cmp al,255 ;gives a size of 6 if no
|
|
jnz notunsized ;size was defined in the editor
|
|
mov al,6 ;could be a bad idea
|
|
notunsized:
|
|
|
|
|
|
cmp al,100
|
|
jnc specialcase
|
|
cmp cl,100
|
|
jc isntspecial
|
|
call errormessage3
|
|
jmp sizewrong
|
|
isntspecial: cmp cl,al
|
|
jnc sizeok
|
|
specialcase: sub al,100
|
|
cmp cl,100
|
|
jnc bothspecial
|
|
cmp cl,al
|
|
jnc sizeok
|
|
call errormessage2
|
|
jmp sizewrong
|
|
bothspecial: sub cl,100
|
|
cmp al,cl
|
|
jz sizeok
|
|
call errormessage3
|
|
sizewrong: mov al,1
|
|
ret
|
|
sizeok: mov al,0
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Outofopen proc near
|
|
|
|
cmp openedob,255
|
|
jz cantuseopen
|
|
call findopenpos
|
|
mov ax,[es:bx]
|
|
cmp al,255
|
|
jnz canpick4
|
|
cantuseopen: call blank
|
|
ret
|
|
|
|
canpick4: cmp ax,oldsubject
|
|
jnz difsub4
|
|
cmp commandtype,228
|
|
jz alreadygrb
|
|
mov commandtype,228
|
|
|
|
difsub4: mov oldsubject,ax
|
|
mov bx,ax
|
|
mov al,36
|
|
call commandwithob
|
|
alreadygrb: mov ax,mousebutton
|
|
cmp ax,oldbutton
|
|
jz notletgo4
|
|
cmp ax,1
|
|
jz dogrb
|
|
cmp ax,2
|
|
jnz notletgo4
|
|
call reexfromopen
|
|
notletgo4: ret
|
|
|
|
dogrb: call delpointer
|
|
mov pickup,1
|
|
call findopenpos
|
|
mov ax,[es:bx]
|
|
mov itemframe,al
|
|
mov objecttype,ah
|
|
|
|
cmp ah,4
|
|
jnz makeintoex
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],20 ; means unplaced object
|
|
mov byte ptr [es:bx+3],255
|
|
jmp actuallyout
|
|
|
|
makeintoex: call transfertoex
|
|
mov itemframe,al
|
|
mov objecttype,4
|
|
call geteitherad
|
|
mov byte ptr [es:bx+2],20 ; means it is in transit
|
|
mov byte ptr [es:bx+3],255
|
|
|
|
actuallyout: call fillopen
|
|
call undertextline
|
|
call readmouse
|
|
call useopened
|
|
call showpointer
|
|
call worktoscreen
|
|
call delpointer
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
;All Extra object code - adding and removing plus purge routines -------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Transfertoex proc near
|
|
|
|
call emergencypurge
|
|
|
|
call getexpos
|
|
mov al,expos
|
|
push ax
|
|
|
|
push di
|
|
mov al,itemframe
|
|
mov ah,0
|
|
mov bx,16
|
|
mul bx
|
|
mov ds,freedat
|
|
mov si,ax
|
|
mov cx,8
|
|
rep movsw
|
|
pop di
|
|
|
|
mov al,reallocation
|
|
mov [es:di],al
|
|
mov [es:di+11],al
|
|
mov al,itemframe
|
|
mov [es:di+1],al
|
|
mov byte ptr [es:di+2],4
|
|
mov byte ptr [es:di+3],255
|
|
mov al,lastinvpos
|
|
mov [es:di+4],al
|
|
|
|
mov al,itemframe
|
|
mov itemtotran,al
|
|
call transfermap
|
|
call transferinv
|
|
call transfertext
|
|
|
|
mov al,itemframe
|
|
mov ah,0
|
|
mov bx,16
|
|
mul bx
|
|
mov ds,freedat
|
|
mov si,ax
|
|
mov byte ptr [si+2],254 ; was 255
|
|
call pickupconts
|
|
|
|
pop ax
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pickupconts proc near
|
|
|
|
mov al,[si+7]
|
|
cmp al,255
|
|
jz notopenable
|
|
|
|
mov al,itemframe
|
|
mov ah,objecttype
|
|
mov dl,expos
|
|
;dec dl
|
|
mov es,freedat
|
|
mov bx,0
|
|
mov cx,0
|
|
pickupcontloop: push cx es bx dx ax
|
|
|
|
cmp byte ptr [es:bx+2],ah
|
|
jnz notinsidethis
|
|
cmp byte ptr [es:bx+3],al
|
|
jnz notinsidethis
|
|
|
|
mov itemtotran,cl
|
|
call transfercontoex
|
|
|
|
notinsidethis: pop ax dx bx es cx
|
|
add bx,16
|
|
inc cx
|
|
cmp cx,80
|
|
jnz pickupcontloop
|
|
|
|
notopenable: ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Transfercontoex proc near
|
|
|
|
push es bx
|
|
|
|
push dx es bx
|
|
call getexpos
|
|
pop si ds
|
|
|
|
push di
|
|
mov cx,8
|
|
rep movsw
|
|
pop di
|
|
pop dx
|
|
|
|
mov al,reallocation
|
|
mov [es:di],al
|
|
mov [es:di+11],al
|
|
mov al,itemtotran
|
|
mov [es:di+1],al
|
|
mov [es:di+3],dl
|
|
mov byte ptr [es:di+2],4
|
|
|
|
call transfermap
|
|
call transferinv
|
|
call transfertext
|
|
;inc expos
|
|
|
|
pop si ds
|
|
mov byte ptr [si+2],255
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Transfertext proc near
|
|
|
|
mov es,extras
|
|
mov al,expos
|
|
mov ah,0
|
|
add ax,ax
|
|
mov bx,extextdat
|
|
add bx,ax
|
|
mov di,extextpos
|
|
mov [es:bx],di
|
|
add di,extext
|
|
|
|
mov al,itemtotran
|
|
mov ah,0
|
|
add ax,ax
|
|
mov ds,freedesc
|
|
mov bx,freetextdat
|
|
add bx,ax
|
|
mov si,freetext
|
|
mov ax,[bx]
|
|
add si,ax
|
|
|
|
moretext: lodsb
|
|
stosb
|
|
inc extextpos
|
|
cmp al,0
|
|
jnz moretext
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Getexpos proc near
|
|
|
|
|
|
mov es,extras
|
|
mov al,0
|
|
mov di,exdata
|
|
tryanotherex: cmp byte ptr [es:di+2],255
|
|
jz foundnewex
|
|
add di,16
|
|
inc al
|
|
cmp al,numexobjects
|
|
jnz tryanotherex
|
|
foundnewex: mov expos,al
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Purgealocation proc near
|
|
|
|
push ax
|
|
mov es,extras
|
|
mov di,exdata
|
|
pop bx
|
|
mov cx,0
|
|
purgeloc: cmp bl,[es:di+0]
|
|
jnz dontpurge
|
|
cmp byte ptr [es:di+2],0
|
|
jnz dontpurge
|
|
push di es bx cx
|
|
call deleteexobject
|
|
pop cx bx es di
|
|
dontpurge: add di,16
|
|
inc cx
|
|
cmp cx,numexobjects
|
|
jnz purgeloc
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Emergencypurge proc near
|
|
|
|
checkpurgeagain: mov ax,exframepos
|
|
add ax,4000
|
|
cmp ax,exframeslen
|
|
jc notnearframeend
|
|
call purgeanitem
|
|
jmp checkpurgeagain
|
|
notnearframeend: mov ax,extextpos
|
|
add ax,400
|
|
cmp ax,extextlen
|
|
jc notneartextend
|
|
call purgeanitem
|
|
jmp checkpurgeagain
|
|
notneartextend: ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Purgeanitem proc near
|
|
|
|
mov es,extras ;first time try and
|
|
mov di,exdata ;find an object in a
|
|
mov bl,reallocation ;location other than
|
|
mov cx,0 ;the one the player is
|
|
lookforpurge: mov al,[es:di+2] ;in
|
|
cmp al,0
|
|
jnz cantpurge
|
|
cmp byte ptr [es:di+12],2
|
|
jz iscup
|
|
cmp byte ptr [es:di+12],255
|
|
jnz cantpurge
|
|
iscup: cmp byte ptr [es:di+11],bl
|
|
jz cantpurge
|
|
call deleteexobject
|
|
ret
|
|
cantpurge: add di,16
|
|
inc cx
|
|
cmp cx,numexobjects
|
|
jnz lookforpurge
|
|
|
|
mov di,exdata
|
|
mov bl,reallocation
|
|
mov cx,0
|
|
lookforpurge2: mov al,[es:di+2]
|
|
cmp al,0
|
|
jnz cantpurge2
|
|
cmp byte ptr [es:di+12],255
|
|
jnz cantpurge2
|
|
call deleteexobject
|
|
ret
|
|
cantpurge2: add di,16
|
|
inc cx
|
|
cmp cx,numexobjects
|
|
jnz lookforpurge2
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Deleteexobject proc near ;es:di holds data ad
|
|
;cx holds number
|
|
push cx cx cx cx
|
|
mov al,255
|
|
mov cx,16
|
|
rep stosb
|
|
pop ax
|
|
mov cl,al
|
|
add al,al
|
|
add al,cl
|
|
call deleteexframe
|
|
pop ax
|
|
mov cl,al
|
|
add al,al
|
|
add al,cl
|
|
inc al
|
|
call deleteexframe
|
|
pop ax
|
|
call deleteextext
|
|
|
|
pop bx
|
|
mov bh,bl
|
|
mov bl,4
|
|
mov di,exdata
|
|
mov cx,0
|
|
deleteconts: cmp [es:di+2],bx
|
|
jnz notinsideex
|
|
push bx cx di
|
|
call deleteexobject ;Oooh missus!
|
|
pop di cx bx ;Recursive code!
|
|
notinsideex: add di,16
|
|
inc cx
|
|
cmp cx,numexobjects
|
|
jnz deleteconts
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
|
|
Deleteexframe proc near ;al holds frame to delete
|
|
|
|
mov di,exframedata
|
|
mov ah,0
|
|
add ax,ax
|
|
add di,ax
|
|
add ax,ax
|
|
add di,ax
|
|
mov al,[es:di]
|
|
mov ah,0
|
|
mov cl,[es:di+1]
|
|
mov ch,0
|
|
mul cx ;ax holds size of this
|
|
;frame in bytes
|
|
mov si,[es:di+2]
|
|
push si
|
|
add si,exframes
|
|
mov cx,exframeslen
|
|
sub cx,[es:di+2]
|
|
mov di,si ;di/si hold start of frame
|
|
add si,ax ;si holds end of frame
|
|
push ax
|
|
push es
|
|
pop ds
|
|
rep movsb
|
|
pop bx ;bx holds size now
|
|
sub exframepos,bx
|
|
pop si ;si holds start of frame
|
|
;(offset only)
|
|
mov cx,numexobjects*3
|
|
mov di,exframedata
|
|
shuffleadsdown: mov ax,[es:di+2]
|
|
cmp ax,si
|
|
jc beforethisone
|
|
sub ax,bx
|
|
beforethisone: mov [es:di+2],ax
|
|
add di,6
|
|
loop shuffleadsdown
|
|
ret
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
Deleteextext proc near
|
|
|
|
mov di,extextdat
|
|
mov ah,0
|
|
add ax,ax
|
|
add di,ax
|
|
mov ax,[es:di]
|
|
mov si,ax
|
|
mov di,ax
|
|
add si,extext
|
|
add di,extext
|
|
mov ax,0
|
|
findlenextext: mov cl,[es:si]
|
|
inc ax
|
|
inc si
|
|
cmp cl,0
|
|
jnz findlenextext
|
|
|
|
mov cx,extextlen
|
|
mov bx,si
|
|
sub bx,extext
|
|
push bx ax
|
|
sub cx,bx
|
|
rep movsb
|
|
pop bx
|
|
sub extextpos,bx
|
|
|
|
pop si
|
|
mov cx,numexobjects
|
|
mov di,extextdat
|
|
shuffletextads: mov ax,[es:di]
|
|
cmp ax,si
|
|
jc beforethistext
|
|
sub ax,bx
|
|
beforethistext: mov [es:di],ax
|
|
add di,2
|
|
loop shuffletextads
|
|
ret
|
|
|
|
endp
|