scummvm/devtools/tasmrecover/dreamweb/object.asm
2012-01-13 22:22:15 +01:00

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