diff options
Diffstat (limited to 'devtools/tasmrecover/dreamweb/object.asm')
-rw-r--r-- | devtools/tasmrecover/dreamweb/object.asm | 2610 |
1 files changed, 2610 insertions, 0 deletions
diff --git a/devtools/tasmrecover/dreamweb/object.asm b/devtools/tasmrecover/dreamweb/object.asm new file mode 100644 index 0000000000..830c9676f3 --- /dev/null +++ b/devtools/tasmrecover/dreamweb/object.asm @@ -0,0 +1,2610 @@ +;Copyright (c) 1990-2011 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 examagain,0 + jz norex + jmp examineagain +norex: cmp getback,0 + jz waitexam + + 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 + + + + + |