;Copyright (c) 1990-2012 by Neil Dodwell ;Released with permission from Neil Dodwell under GPLv2 ;See LICENSE file for full license text ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ ³ ;³ DREAMWEB ³ ;³ ³ ;³ ³ ;³ ³ ;³ ³ ;³ Written by Neil Dodwell. Graphics by Dave Dew. ³ ;³ ³ ;³ Started on Friday 28 December 1990 at 1:20 pm ³ ;³ ³ ;³ Copyright 1990/1991 Creative Reality ³ ³ ;³ ³ ;³ ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;----------------------------------------------------------Assembly options---- JUMPS playback equ 0 recording equ 0 debuglevel1 equ 0 ;memory debug on debuglevel2 equ 0 ;debug keys on+shouts demo equ 0 CD equ 1 Foreign equ 1 Spanish equ 0 German equ 0 ;----------------------------------------------------------------Code start---- DREAMWEBPROG segment para public 'CODE' assume cs:DREAMWEBPROG,ss:STACKSPACE ;------------------------------------------------------------------Includes---- include \pc\dreamweb\vars.asm ;variables and equates include \pc\dreamweb\sprite.asm ;sprite routines include \pc\dreamweb\vgagrafx.asm ;screen routines for vga include \pc\dreamweb\vgafades.asm ;fade routines include \pc\dreamweb\titles.asm ;guess! include \pc\dreamweb\print.asm ;text printing routines include \pc\dreamweb\object.asm ;pickup include \pc\dreamweb\backdrop.asm ;draws floor etc. include \pc\dreamweb\look.asm ;look command include \pc\dreamweb\talk.asm ;conversations include \pc\dreamweb\newplace.asm ;travel include \pc\dreamweb\monitor.asm ;network machine include \pc\dreamweb\use.asm ;individual use routines include \pc\dreamweb\keypad.asm ;accept code with keypad include \pc\dreamweb\saveload.asm ;in game options include \pc\dreamweb\sblaster.asm if debuglevel1 include \pc\dreamweb\debug.asm else if debuglevel2 include \pc\dreamweb\debug.asm endif endif ;-----------------------------------------------------------------Main loop---- Dreamweb proc near call seecommandtail call checkbasemem call soundstartup call setkeyboardint call setupemm call allocatebuffers call setmouse call fadedos call gettime call clearbuffers call clearpalette call set16colpalette call readsetdata if demo call changeroomnums endif mov wongame,0 mov dx,offset cs:basicsample call loadsample call setsoundoff if demo else call scanfornames cmp al,0 jnz dodecisions endif call setmode call loadpalfromiff call titles call credits jmp playgame dodecisions: call cls call setmode call decide cmp quitrequested, 0 jnz exitgame cmp getback,4 jz mainloop call titles cmp quitrequested, 0 jnz exitgame call credits playgame: cmp quitrequested, 0 jnz exitgame call clearchanges call setmode call loadpalfromiff mov location,255 mov roomafterdream,1 if demo mov newlocation,5 else mov newlocation,35 endif mov volume,7 call loadroom call clearsprites call initman call entrytexts call entryanims mov destpos,3 call initialinv mov lastflag,32 call startup1 mov volumeto,0 mov volumedirection,-1 mov commandtype,255 jmp mainloop loadnew: if demo cmp newlocation,27 jnz not27 call fadescreendowns mov cx,260 call hangon call clearbeforeload jmp playgame not27: endif call clearbeforeload call loadroom call clearsprites call initman call entrytexts call entryanims mov newlocation,255 call startup mov commandtype,255 call worktoscreenm jmp mainloop alreadyloaded: mov newlocation,255 call clearsprites call initman call startup mov commandtype,255 mainloop: cmp quitrequested, 0 jnz exitgame call screenupdate cmp wongame,0 jnz endofgame cmp mandead,1 jz gameover cmp mandead,2 jz gameover cmp watchingtime,0 jz notwatching mov al,finaldest cmp al,manspath jnz mainloop dec watchingtime jnz mainloop notwatching: cmp mandead,4 jz gameover cmp newlocation,255 jnz loadnew jmp mainloop gameover: if demo call fadescreendowns mov cx,260 call hangon call clearbeforeload jmp playgame endif call clearbeforeload call showgun call fadescreendown mov cx,100 call hangon jmp dodecisions endofgame: call clearbeforeload call fadescreendowns mov cx,200 call hangon call endgame jmp quickquit2 exitgame: ret endp endp if demo Changeroomnums proc near mov di,offset cs:roomdata+10 mov cx,50 changenumloop: mov al,[cs:di] cmp al,"0" jnz nochange mov al,[cs:di+1] cmp al,"5" jnz nochange mov al,"6" mov ah,"0" mov [cs:di],ax nochange: add di,32 loop changenumloop ret endp endif Entrytexts proc near cmp location,21 jnz notloc15 mov al,28 mov cx,60 mov dx,11 mov bl,68 mov bh,64 call setuptimeduse ret notloc15: cmp location,30 jnz notloc43 mov al,27 mov cx,60 mov dx,11 mov bl,68 mov bh,64 call setuptimeduse ret notloc43: cmp location,23 jnz notloc23 mov al,29 mov cx,60 mov dx,11 mov bl,68 mov bh,64 call setuptimeduse ret notloc23: cmp location,31 jnz notloc44 mov al,30 mov cx,60 mov dx,11 mov bl,68 mov bh,64 call setuptimeduse ret notloc44: cmp location,20 jnz notsarters2 mov al,31 mov cx,60 mov dx,11 mov bl,68 mov bh,64 call setuptimeduse ret notsarters2: cmp location,24 jnz notedenlob mov al,32 mov cx,60 mov dx,3 mov bl,68 mov bh,64 call setuptimeduse ret notedenlob: cmp location,34 jnz noteden2 mov al,33 mov cx,60 mov dx,3 mov bl,68 mov bh,64 call setuptimeduse ret noteden2: ret endp Entryanims proc near mov reeltowatch,-1 mov watchmode,-1 cmp location,33 jnz notinthebeach call switchryanoff mov watchingtime,76*2 mov reeltowatch,0 mov endwatchreel,76 mov watchspeed,1 mov speedcount,1 ret notinthebeach: cmp location,44 jnz notsparkys mov al,8 call resetlocation mov watchingtime,50*2 mov reeltowatch,247 mov endwatchreel,297 mov watchspeed,1 mov speedcount,1 call switchryanoff ret notsparkys: cmp location,22 jnz notinthelift mov watchingtime,31*2 mov reeltowatch,0 mov endwatchreel,30 mov watchspeed,1 mov speedcount,1 call switchryanoff ret notinthelift: cmp location,26 jnz notunderchurch mov symboltopnum,2 mov symbolbotnum,1 ret notunderchurch: cmp location,45 jnz notenterdream mov keeperflag,0 mov watchingtime,296 mov reeltowatch,45 mov endwatchreel,198 mov watchspeed,1 mov speedcount,1 call switchryanoff ret notenterdream: cmp reallocation,46 jnz notcrystal cmp sartaindead,1 jnz notcrystal mov al,0 call removefreeobject ret notcrystal: cmp location,9 jnz nottopchurch mov al,2 call checkifpathison jz nottopchurch cmp aidedead,0 jz nottopchurch mov al,3 call checkifpathison jnz makedoorsopen mov al,2 call turnpathon makedoorsopen: mov al,4 call removesetobject mov al,5 call placesetobject ret nottopchurch: cmp location,47 jnz notdreamcentre mov al,4 call placesetobject mov al,5 call placesetobject ret notdreamcentre: cmp location,38 jnz notcarpark mov watchingtime,57*2 mov reeltowatch,4 mov endwatchreel,57 mov watchspeed,1 mov speedcount,1 call switchryanoff ret notcarpark: cmp location,32 jnz notalley mov watchingtime,66*2 mov reeltowatch,0 mov endwatchreel,66 mov watchspeed,1 mov speedcount,1 call switchryanoff ret notalley: cmp location,24 jnz notedensagain mov al,2 mov ah,roomnum dec ah call turnanypathon notedensagain: ret endp if demo Initialinv proc near mov al,11 mov ah,5 call pickupob mov al,12 mov ah,6 call pickupob mov al,13 mov ah,7 call pickupob mov al,14 mov ah,8 call pickupob mov al,18 mov ah,0 call pickupob mov al,19 mov ah,1 call pickupob mov al,20 mov ah,9 call pickupob mov al,16 mov ah,2 call pickupob mov al,2 mov ah,4 call pickupob mov al,29 mov ah,10 call pickupob mov al,33 mov ah,11 call pickupob mov al,44 mov ah,12 call pickupob mov card1money,12342 ret endp else Initialinv proc near cmp reallocation,24 jz isedens ret isedens: mov al,11 mov ah,5 call pickupob mov al,12 mov ah,6 call pickupob mov al,13 mov ah,7 call pickupob mov al,14 mov ah,8 call pickupob mov al,18 mov al,18 mov ah,0 call pickupob mov al,19 mov ah,1 call pickupob mov al,20 mov ah,9 call pickupob mov al,16 mov ah,2 call pickupob mov watchmode,1 mov reeltohold,0 mov endofholdreel,6 mov watchspeed,1 mov speedcount,1 call switchryanoff ret endp endif Pickupob proc near mov lastinvpos,ah mov objecttype,2 mov itemframe,al mov command,al call getanyad call transfertoex ret endp ;---------------------------------------------------------Memory allocation---- Setupemm proc near cmp soundint,255 jz noneedforemm call checkforemm mov ah,43h ;allocate handle and 160 pages mov bx,176 ;was 176 int 67h cmp ah,0 jnz emmerror1 ;if there's an error drop to DOS mov emmhandle,dx mov ah,41h ;get the page frame base address int 67h cmp ah,0 jnz emmerror1 mov emmpageframe,bx mov ax,bx mov cl,12 shr ax,cl mov emmhardwarepage,al noneedforemm: ret emmerror1: mov gameerror,1 jmp quickquit2 endp Removeemm proc near cmp soundint,255 jz noneedtoremove mov ah,45h mov dx,emmhandle int 67h noneedtoremove: ret endp Checkforemm proc near ret endp Checkbasemem proc near mov bx,howmuchalloc cmp bx,9360h jnc enoughmem mov gameerror,5 jmp quickquit enoughmem: ret endp Allocatebuffers proc near mov bx,lengthofextra/16 call allocatemem mov extras,ax call trysoundalloc mov bx,lengthofmap/16 call allocatemem mov mapdata,ax call trysoundalloc mov bx,lengthofbuffer/16 call allocatemem mov buffers,ax call trysoundalloc mov bx,freedatlen/16 call allocatemem mov freedat,ax call trysoundalloc mov bx,setdatlen/16 call allocatemem mov setdat,ax call trysoundalloc mov bx,lenofmapstore/16 call allocatemem mov mapstore,ax if recording mov bx,1028 call allocatemem mov recordspace,ax endif if playback mov bx,1028 call allocatemem mov recordspace,ax endif call allocatework mov bx,2048/16 call allocatemem mov sounddata,ax mov bx,2048/16 call allocatemem mov sounddata2,ax ret endp Clearbuffers proc near mov es,buffers mov cx,lengthofbuffer/2 mov ax,0 mov di,0 rep stosw mov es,extras mov cx,lengthofextra/2 mov ax,0ffffh mov di,0 rep stosw mov es,buffers mov di,initialreelrouts push cs pop ds mov si,offset cs:reelroutines mov cx,lenofreelrouts rep movsb mov es,buffers mov di,initialvars push cs pop ds mov si,offset cs:startvars mov cx,lengthofvars rep movsb call clearchanges ret endp Clearchanges proc near mov es,buffers mov cx,numchanges*2 mov ax,0ffffh mov di,listofchanges rep stosw mov ds,buffers mov si,initialreelrouts push cs pop es mov di,offset cs:reelroutines mov cx,lenofreelrouts rep movsb mov ds,buffers mov si,initialvars push cs pop es mov di,offset cs:startvars mov cx,lengthofvars rep movsb mov expos,0 mov exframepos,0 mov extextpos,0 mov es,extras mov cx,lengthofextra/2 mov ax,0ffffh mov di,0 rep stosw push cs pop es mov di,offset cs:roomscango mov al,1 stosb stosb mov al,0 stosb mov al,1 stosb mov ax,0 mov cx,6 rep stosw ret endp Clearbeforeload proc near ;deallocates variable buffers ;and clears out fixed ones cmp roomloaded,1 jnz noclear call clearreels call clearrest mov roomloaded,0 noclear: ret endp ;Clearnoreels proc near ; ; cmp roomloaded,1 ; jnz noclear2 ; call clearrest ; mov roomloaded,0 ;noclear2: ret ; ; endp Clearreels proc near mov es,reel1 call deallocatemem mov es,reel2 call deallocatemem mov es,reel3 call deallocatemem ret endp Clearrest proc near mov es,mapdata mov cx,maplen/2 mov ax,0 mov di,map rep stosw mov es,backdrop call deallocatemem mov es,setframes call deallocatemem mov es,reels call deallocatemem mov es,people call deallocatemem mov es,setdesc call deallocatemem mov es,blockdesc call deallocatemem mov es,roomdesc call deallocatemem mov es,freeframes call deallocatemem mov es,freedesc call deallocatemem ret endp Deallocatemem proc near mov ah,49h int 21h jc deallerror ret deallerror: mov gameerror,4 jmp quickquit2 ret endp Allocatemem proc near add bx,2 mov ah,48h int 21h jc memerror ret memerror: mov gameerror,3 jmp quickquit2 endp Seecommandtail proc near mov soundbaseadd,220h mov soundint,5 mov sounddmachannel,1 mov brightness,0 mov bx,2 mov ax,[es:bx] mov dx,es sub ax,dx mov howmuchalloc,ax mov bx,02ch mov ax,[es:bx] push es bx mov es,ax mov bx,0 findblaster: mov ax,[es:bx] cmp ax,0 jz endofenvironment cmp al,"B" jnz notblast cmp ah,"L" jnz notblast cmp byte ptr [es:bx+2],"A" jnz notblast cmp byte ptr [es:bx+3],"S" jnz notblast cmp byte ptr [es:bx+4],"T" jnz notblast cmp byte ptr [es:bx+5],"E" jnz notblast cmp byte ptr [es:bx+6],"R" jnz notblast add bx,7 call parseblaster jmp endofenvironment notblast: inc bx jmp findblaster endofenvironment: pop bx es mov bx,81h call parseblaster ret endp Parseblaster proc near lookattail: mov al,[es:bx] cmp al,0 jz endtail cmp al,13 jz endtail cmp al,"i" jz issoundint cmp al,"I" jz issoundint cmp al,"b" jz isbright cmp al,"B" jz isbright cmp al,"a" jz isbaseadd cmp al,"A" jz isbaseadd cmp al,"n" jz isnosound cmp al,"N" jz isnosound cmp al,"d" jz isdma cmp al,"D" jz isdma inc bx loop lookattail ret issoundint: mov al,[es:bx+1] sub al,"0" mov soundint,al inc bx jmp lookattail isdma: mov al,[es:bx+1] sub al,"0" mov sounddmachannel,al inc bx jmp lookattail isbaseadd: push cx mov al,[es:bx+2] sub al,"0" mov ah,0 mov cl,4 shl ax,cl add ax,200h mov soundbaseadd,ax pop cx inc bx jmp lookattail isbright: mov brightness,1 inc bx jmp lookattail isnosound: mov soundint,255 inc bx jmp lookattail endtail: ret endp ;-------------------------------------------------------High level routines---- Startup proc near mov currentkey,0 mov mainmode,0 call createpanel mov newobs,1 call drawfloor call showicon call getunderzoom call spriteupdate call printsprites call undertextline call reelsonscreen call atmospheres ret endp Startup1 proc near call clearpalette mov throughdoor,0 mov currentkey,"0" mov mainmode,0 call createpanel mov newobs,1 call drawfloor call showicon call getunderzoom call spriteupdate call printsprites call undertextline call reelsonscreen call atmospheres call worktoscreen call fadescreenup ret endp ;--------------------------------------------------Scroll location routines---- Screenupdate proc near call newplace call mainscreen cmp quitrequested, 0 jnz finishearly call animpointer call showpointer cmp watchingtime,0 jnz iswatchingmode cmp newlocation,255 jnz finishearly iswatchingmode: call vsync call readmouse1 call dumppointer call dumptextline call delpointer call autolook call spriteupdate call watchcount call zoom call showpointer cmp wongame,0 jnz finishearly call vsync call readmouse2 call dumppointer call dumpzoom call delpointer call deleverything call printsprites call reelsonscreen call afternewroom call showpointer call vsync call readmouse3 call dumppointer call dumpmap call dumptimedtext call delpointer call showpointer call vsync call readmouse4 call dumppointer call dumpwatch call delpointer finishearly: ret endp Watchreel proc near cmp reeltowatch,-1 jz notplayingreel mov al,manspath cmp al,finaldest jnz waitstopwalk mov al,turntoface cmp al,facing jz notwatchpath waitstopwalk: ret notwatchpath: dec speedcount cmp speedcount,-1 jnz showwatchreel mov al,watchspeed mov speedcount,al mov ax,reeltowatch cmp ax,endwatchreel jnz ismorereel cmp watchingtime,0 jnz showwatchreel mov reeltowatch,-1 mov watchmode,-1 cmp reeltohold,-1 jz nomorereel mov watchmode,1 jmp notplayingreel ismorereel: inc reeltowatch showwatchreel: mov ax,reeltowatch mov reelpointer,ax call plotreel mov ax,reelpointer mov reeltowatch,ax call checkforshake nomorereel: ret notplayingreel: cmp watchmode,1 jnz notholdingreel mov ax,reeltohold mov reelpointer,ax call plotreel ret notholdingreel: cmp watchmode,2 jnz notreleasehold dec speedcount cmp speedcount,-1 jnz notlastspeed2 mov al,watchspeed mov speedcount,al inc reeltohold notlastspeed2: mov ax,reeltohold cmp ax,endofholdreel jnz ismorereel2 mov reeltohold,-1 mov watchmode,-1 mov al,destafterhold mov destination,al mov finaldest,al call autosetwalk ret ismorereel2: mov ax,reeltohold mov reelpointer,ax call plotreel ret notreleasehold: ret endp Checkforshake proc near cmp reallocation,26 jnz notstartshake cmp ax,104 jnz notstartshake mov shakecounter,-1 notstartshake: ret endp Watchcount proc near cmp watchon,0 jz nowatchworn inc timercount cmp timercount,9 jz flashdots cmp timercount,18 jz uptime nowatchworn: ret flashdots: mov ax,91*3+21 mov di,268+4 mov bx,21 mov ds,charset1 call showframe jmp finishwatch uptime: mov timercount,0 add secondcount,1 cmp secondcount,60 jnz finishtime mov secondcount,0 inc minutecount cmp minutecount,60 jnz finishtime mov minutecount,0 inc hourcount cmp hourcount,24 jnz finishtime mov hourcount,0 finishtime: call showtime finishwatch: mov watchdump,1 ret endp Showtime proc near cmp watchon,0 jz nowatch mov al,secondcount mov cl,0 call twodigitnum push ax mov al,ah mov ah,0 add ax,91*3+10 mov ds,charset1 mov di,282+5 mov bx,21 call showframe pop ax mov ah,0 add ax,91*3+10 mov ds,charset1 mov di,282+9 mov bx,21 call showframe mov al,minutecount mov cl,0 call twodigitnum push ax mov al,ah mov ah,0 add ax,91*3 mov ds,charset1 mov di,270+5 mov bx,21 call showframe pop ax mov ah,0 add ax,91*3 mov ds,charset1 mov di,270+11 mov bx,21 call showframe mov al,hourcount mov cl,0 call twodigitnum push ax mov al,ah mov ah,0 add ax,91*3 mov ds,charset1 mov di,256+5 mov bx,21 call showframe pop ax mov ah,0 add ax,91*3 mov ds,charset1 mov di,256+11 mov bx,21 call showframe mov ax,91*3+20 mov ds,charset1 mov di,267+5 mov bx,21 call showframe nowatch: ret endp Dumpwatch proc near cmp watchdump,1 jnz nodumpwatch mov di,256 mov bx,21 mov cl,40 mov ch,12 call multidump mov watchdump,0 nodumpwatch: ret endp Showbyte proc near mov dl,al shr dl,1 shr dl,1 shr dl,1 shr dl,1 call onedigit mov [es:di],dl mov dl,al and dl,15 call onedigit mov [es:di+1],dl add di,3 ret endp Onedigit proc near cmp dl,10 jnc morethan10 add dl,"0" ret morethan10: sub dl,10 add dl,"A" ret endp Twodigitnum proc near mov ah,cl dec ah numloop1: inc ah sub al,10 jnc numloop1 add al,10 add al,cl ret endp Showword proc near mov ch,0 mov bx,10000 mov cl,47 word1: inc cl sub ax,bx jnc word1 add ax,bx call convnum mov [cs:di],cl mov bx,1000 mov cl,47 word2: inc cl sub ax,bx jnc word2 add ax,bx call convnum mov [cs:di+1],cl mov bx,100 mov cl,47 word3: inc cl sub ax,bx jnc word3 add ax,bx call convnum mov [cs:di+2],cl mov bx,10 mov cl,47 word4: inc cl sub ax,bx jnc word4 add ax,bx call convnum mov [cs:di+3],cl add al,48 mov cl,al call convnum mov [cs:di+4],cl ret endp Convnum proc near cmp ch,0 jnz noconvnum cmp cl,"0" jnz notzeronum mov cl,32 jmp noconvnum notzeronum: mov ch,1 noconvnum: ret endp ;---------------------------------------------Handling of pointer on screen---- Mainscreen proc near mov inmaparea,0 mov bx,offset cs:mainlist cmp watchon,1 jz checkmain mov bx,offset cs:mainlist2 checkmain: call checkcoords cmp walkandexam,0 jz finishmain call walkandexamine finishmain: ret mainlist: dw 44,70,32,46,look dw 0,50,0,180,inventory dw 226,244,10,26,zoomonoff dw 226,244,26,40,saveload dw 240,260,100,124,madmanrun dw 0,320,0,200,identifyob dw 0ffffh mainlist2: dw 44,70,32,46,look dw 0,50,0,180,inventory dw 226+48,244+48,10,26,zoomonoff dw 226+48,244+48,26,40,saveload dw 240,260,100,124,madmanrun dw 0,320,0,200,identifyob dw 0ffffh endp Madmanrun proc near cmp location,14 jnz identifyob cmp mapx,22 jnz identifyob cmp pointermode,2 jnz identifyob cmp madmanflag,0 jnz identifyob cmp commandtype,211 jz alreadyrun mov commandtype,211 mov al,52 call commandonly alreadyrun: cmp mousebutton,1 jnz norun mov ax,mousebutton cmp ax,oldbutton jz norun mov lastweapon,8 norun: ret endp Checkcoords proc near cmp newlocation,255 ;objects keep enumerated even in loading state, fixme jz loop048 ret loop048: mov ax,[cs:bx] cmp ax,0ffffh jz nonefound push bx cmp mousex,ax jl over045 mov ax,[cs:bx+2] cmp mousex,ax jge over045 mov ax,[cs:bx+4] cmp mousey,ax jl over045 mov ax,[cs:bx+6] cmp mousey,ax jge over045 mov ax,[cs:bx+8] call ax finished: pop ax ret over045: pop bx add bx,10 jmp loop048 nonefound: ret endp ;-------------------------------------------Printing of icons during scroll---- Identifyob proc near cmp watchingtime,0 jnz blank mov ax,mousex sub ax,mapadx cmp ax,22*8 jc notover1 call blank ret notover1: mov bx,mousey sub bx,mapady cmp bx,20*8 jc notover2 call blank ret notover2: mov inmaparea,1 mov ah,bl push ax call findpathofpoint mov pointerspath,dl pop ax push ax call findfirstpath mov pointerfirstpath,al pop ax call checkifex jnz finishidentify call checkiffree jnz finishidentify call checkifperson jnz finishidentify call checkifset jnz finishidentify mov ax,mousex sub ax,mapadx mov cl,al mov ax,mousey sub ax,mapady mov ch,al call checkone cmp al,0 jz nothingund ;cmp watchingtime,0 ;jnz nothingund cmp mandead,1 jz nothingund mov ah,3 call obname finishidentify: ret nothingund: call blank ret endp Checkifperson proc near mov es,buffers mov bx,peoplelist mov cx,12 identifyreel: push cx cmp byte ptr [es:bx+4],255 jz notareelid push es bx ax mov ax,[es:bx+0] mov reelpointer,ax call getreelstart cmp [es:si+2],0ffffh jnz notblankpers add si,5 notblankpers: mov cx,[es:si+2] ;x,y of reel slot mov ax,[es:si+0] ;frame number push cx call getreelframeax pop cx add cl,[es:bx+4] add ch,[es:bx+5] mov dx,cx add dl,[es:bx+0] add dh,[es:bx+1] pop ax bx es cmp al,cl jc notareelid cmp ah,ch jc notareelid cmp al,dl jnc notareelid cmp ah,dh jnc notareelid pop cx mov ax,[es:bx+2] mov persondata,ax mov al,[es:bx+4] mov ah,5 call obname mov al,0 cmp al,1 ret notareelid: pop cx add bx,5 dec cx jnz identifyreel ret endp Checkifset proc near mov es,buffers mov bx,setlist+(127*5) mov cx,127 identifyset: cmp byte ptr [es:bx+4],255 jz notasetid cmp al,[es:bx] jc notasetid cmp al,[es:bx+2] jnc notasetid cmp ah,[es:bx+1] jc notasetid cmp ah,[es:bx+3] jnc notasetid call pixelcheckset jz notasetid call isitdescribed jz notasetid mov al,[es:bx+4] mov ah,1 call obname mov al,0 cmp al,1 ret notasetid: sub bx,5 dec cx cmp cx,-1 jnz identifyset ret endp Checkifex proc near mov es,buffers mov bx,exlist+(99*5) mov cx,99 identifyex: cmp byte ptr [es:bx+4],255 jz notanexid cmp al,[es:bx] jc notanexid cmp al,[es:bx+2] jnc notanexid cmp ah,[es:bx+1] jc notanexid cmp ah,[es:bx+3] jnc notanexid mov al,[es:bx+4] mov ah,4 call obname mov al,1 cmp al,0 ret notanexid: sub bx,5 dec cx cmp cx,-1 jnz identifyex ret endp Checkiffree proc near mov es,buffers mov bx,freelist+(79*5) mov cx,79 identifyfree: cmp byte ptr [es:bx+4],255 jz notafreeid cmp al,[es:bx] jc notafreeid cmp al,[es:bx+2] jnc notafreeid cmp ah,[es:bx+1] jc notafreeid cmp ah,[es:bx+3] jnc notafreeid mov al,[es:bx+4] mov ah,2 call obname mov al,0 cmp al,1 ret notafreeid: sub bx,5 dec cx cmp cx,-1 jnz identifyfree ret endp Isitdescribed proc near push ax cx es bx mov al,[es:bx+4] ;get object number mov ah,0 add ax,ax mov bx,ax mov es,setdesc add bx,settextdat mov ax,[es:bx] add ax,settext mov bx,ax mov dl,[es:bx] pop bx es cx ax cmp dl,0 ret endp ;Getcurrentpath proc near ;routine finds out which path ; ;block the pointer is in. ; push ax ;used to see if an object is ; call findpathofpoint ;close or not ; pop ax ; mov pointerspath,dl ; ret ; ; endp Findpathofpoint proc near push ax mov bx,pathdata mov es,reels mov al,roomnum mov ah,0 mov cx,144 mul cx add bx,ax pop cx mov dl,0 pathloop: mov al,[es:bx+6] cmp al,255 jnz flunkedit mov ax,[es:bx+2] cmp ax,0ffffh jz flunkedit cmp cl,al jc flunkedit cmp ch,ah jc flunkedit mov ax,[es:bx+4] cmp cl,al jnc flunkedit cmp ch,ah jnc flunkedit jmp gotvalidpath flunkedit: add bx,8 inc dl cmp dl,12 jnz pathloop mov dl,255 gotvalidpath: ret endp Findfirstpath proc near ;similar to last routine, but it ;searches each path to see if push ax ;pointer is within it, regardless mov bx,pathdata ;of whether the path is on or off mov es,reels ;it returns the on or off state in mov al,roomnum ;al (255=on 0=off) 0 if no path mov ah,0 mov cx,144 mul cx add bx,ax pop cx mov dl,0 fpathloop: mov ax,[es:bx+2] cmp ax,0ffffh jz nofirst cmp cl,al jc nofirst cmp ch,ah jc nofirst mov ax,[es:bx+4] cmp cl,al jnc nofirst cmp ch,ah jnc nofirst jmp gotfirst nofirst: add bx,8 inc dl cmp dl,12 jnz fpathloop mov al,0 ret gotfirst: mov al,[es:bx+6] ret endp Turnpathon proc near ;turns path on permanently push ax ax mov cl,255 mov ch,roomnum add ch,100 call findormake pop ax call getroomspaths pop ax cmp al,255 jz nopathon mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,255 mov [es:bx+6],al nopathon: ret endp Turnpathoff proc near ;turns path on permanently push ax ax mov cl,0 mov ch,roomnum add ch,100 call findormake pop ax call getroomspaths pop ax cmp al,255 jz nopathoff mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,0 mov [es:bx+6],al nopathoff: ret endp Turnanypathon proc near push ax ax mov cl,255 mov ch,ah add ch,100 call findormake pop ax mov al,ah mov ah,0 mov cx,144 mul cx mov es,reels mov bx,pathdata add bx,ax pop ax mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,255 mov [es:bx+6],al ret endp Turnanypathoff proc near push ax ax mov cl,0 mov ch,ah add ch,100 call findormake pop ax mov al,ah mov ah,0 mov cx,144 mul cx mov es,reels mov bx,pathdata add bx,ax pop ax mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,0 mov [es:bx+6],al ret endp Checkifpathison proc near push ax call getroomspaths pop ax mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,[es:bx+6] cmp al,255 ret endp Afternewroom proc near cmp nowinnewroom,0 jz notnew mov timecount,0 call createpanel mov commandtype,0 call findroominloc cmp ryanon,1 jz ryansoff mov al,ryanx add al,12 mov ah,ryany add ah,12 call findpathofpoint mov manspath,dl call findxyfrompath mov resetmanxy,1 ryansoff: mov newobs,1 call drawfloor mov lookcounter,160 mov nowinnewroom,0 call showicon call spriteupdate call printsprites call undertextline call reelsonscreen call mainscreen call getunderzoom call zoom call worktoscreenm call walkintoroom call reminders call atmospheres notnew: ret endp Atmospheres proc near mov cl,mapx mov ch,mapy mov bx,offset cs:atmospherelist nextatmos: mov al,[cs:bx] cmp al,255 jz nomoreatmos cmp al,reallocation jnz wrongatmos mov ax,[cs:bx+1] cmp ax,cx jnz wrongatmos mov ax,[cs:bx+3] cmp al,ch0playing jz playingalready cmp location,45 jnz notweb cmp reeltowatch,45 jz wrongatmos notweb: call playchannel0 cmp reallocation,2 cmp mapy,0 jz fullvol jnz notlouisvol cmp mapy,10 jnz notlouisvol cmp mapx,22 jnz notlouisvol mov volume,5 notlouisvol: if cd cmp reallocation,14 jnz notmad1 cmp mapx,33 jz ismad2 cmp mapx,22 jnz notmad1 mov volume,5 ret ismad2: mov volume,0 ret notmad1: endif playingalready: cmp reallocation,2 jnz notlouisvol2 cmp mapx,22 jz louisvol cmp mapx,11 jnz notlouisvol2 fullvol: mov volume,0 notlouisvol2: ret louisvol: mov volume,5 ret wrongatmos: add bx,5 jmp nextatmos nomoreatmos: call cancelch0 ret atmospherelist: db 0,33,10,15,255 db 0,22,10,15,255 db 0,22,0,15,255 db 0,11,0,15,255 db 0,11,10,15,255 db 0,0,10,15,255 db 1,44,10,6,255 ;location,map x,y,sound,repeat db 1,44,0,13,255 db 2,33,0,6,255 db 2,22,0,5,255 db 2,22,10,16,255 db 2,11,10,16,255 db 3,44,0,15,255 db 3,33,10,6,255 db 3,33,0,5,255 db 4,11,30,6,255 db 4,22,30,5,255 db 4,22,20,13,255 db 10,33,30,6,255 db 10,22,30,6,255 db 9,22,10,6,255 db 9,22,20,16,255 db 9,22,30,16,255 db 9,22,40,16,255 db 9,22,50,16,255 db 6,11,30,6,255 db 6,0,10,15,255 db 6,0,20,15,255 db 6,11,20,15,255 db 6,22,20,15,255 db 7,11,20,6,255 db 7,0,20,6,255 db 7,0,30,6,255 db 55,44,0,5,255 db 55,44,10,5,255 db 5,22,30,6,255 if demo db 5,22,20,16,255 db 5,22,10,16,255 else db 5,22,20,15,255 db 5,22,10,15,255 endif db 24,22,0,15,255 db 24,33,0,15,255 db 24,44,0,15,255 db 24,33,10,15,255 db 8,0,10,6,255 db 8,11,10,6,255 db 8,22,10,6,255 db 8,33,10,6,255 db 8,33,20,6,255 db 8,33,30,6,255 db 8,33,40,6,255 db 8,22,40,6,255 db 8,11,40,6,255 db 11,11,20,12,255 db 11,11,30,12,255 db 11,22,20,12,255 db 11,22,30,12,255 db 12,22,20,12,255 db 13,22,20,12,255 db 13,33,20,12,255 db 14,44,20,12,255 db 14,33,0,12,255 db 14,33,10,12,255 db 14,33,20,12,255 db 14,33,30,12,255 db 14,33,40,12,255 db 14,22,0,16,255 db 19,0,0,12,255 db 20,0,20,16,255 db 20,0,30,16,255 db 20,11,30,16,255 db 20,0,40,16,255 db 20,11,40,16,255 if demo db 21,11,10,16,255 db 21,11,20,16,255 db 21,0,20,16,255 db 21,22,20,16,255 db 21,33,20,16,255 db 21,44,20,16,255 db 21,44,10,16,255 else db 21,11,10,15,255 db 21,11,20,15,255 db 21,0,20,15,255 db 21,22,20,15,255 db 21,33,20,15,255 db 21,44,20,15,255 db 21,44,10,15,255 endif db 22,22,10,16,255 db 22,22,20,16,255 db 23,22,30,13,255 db 23,22,40,13,255 db 23,33,40,13,255 db 23,11,40,13,255 db 23,0,40,13,255 db 23,0,50,13,255 db 25,11,40,16,255 db 25,11,50,16,255 db 25,0,50,16,255 db 27,11,20,16,255 db 27,11,30,16,255 db 29,11,10,16,255 db 45,22,30,12,255 db 45,22,40,12,255 db 45,22,50,12,255 db 46,22,40,12,255 db 46,11,50,12,255 db 46,22,50,12,255 db 46,33,50,12,255 db 47,0,0,12,255 db 26,22,20,16,255 db 26,33,10,16,255 db 26,33,20,16,255 db 26,33,30,16,255 db 26,44,30,16,255 db 26,22,30,16,255 db 26,11,30,16,255 db 26,11,20,16,255 db 26,0,20,16,255 db 26,11,40,16,255 db 26,0,40,16,255 db 26,22,40,16,255 db 26,11,50,16,255 db 28,0,30,15,255 db 28,0,20,15,255 db 28,0,40,15,255 db 28,11,30,15,255 db 28,11,20,15,255 db 28,22,30,15,255 db 28,22,20,15,255 db 255 endp Walkintoroom proc near cmp location,14 jnz notlair cmp mapx,22 jnz notlair mov destination,1 mov finaldest,1 call autosetwalk notlair: ret endp Afterintroroom proc near cmp nowinnewroom,0 jz notnewintro call clearwork call findroominloc mov newobs,1 call drawfloor call reelsonscreen call spriteupdate call printsprites call worktoscreen mov nowinnewroom,0 notnewintro: ret endp Obname proc near cmp reasseschanges,0 jz notnewpath mov reasseschanges,0 jmp diff notnewpath: cmp ah,commandtype jz notdiffob jmp diff notdiffob: cmp al,command jnz diff cmp walkandexam,1 jz walkandexamine cmp mousebutton,0 jz noobselect cmp commandtype,3 jnz isntblock cmp lastflag,2 jc noobselect isntblock: mov bl,manspath cmp bl,pointerspath jnz wantstowalk cmp commandtype,3 jz wantstowalk call finishedwalking jnz noobselect cmp commandtype,5 jz wantstotalk cmp watchingtime,0 jnz noobselect call examineob ret wantstotalk: cmp watchingtime,0 jnz noobselect call talk ret walkandexamine: call finishedwalking jnz noobselect mov al,walkexamtype mov commandtype,al mov al,walkexamnum mov command,al mov walkandexam,0 cmp commandtype,5 jz noobselect call examineob ret wantstowalk: call setwalk mov reasseschanges,1 noobselect: ret diff: mov command,al mov commandtype,ah diff2: cmp linepointer,254 jnz middleofwalk cmp watchingtime,0 jnz middleofwalk mov al,facing cmp al,turntoface jnz middleofwalk cmp commandtype,3 jnz notblock mov bl,manspath cmp bl,pointerspath jnz dontcheck mov cl,ryanx ;look under feet to see if add cl,12 ;any flags are there mov ch,ryany add ch,12 call checkone cmp cl,2 jc isblock dontcheck: call getflagunderp cmp lastflag,2 jc isblock cmp lastflag,128 jnc isblock jmp toofaraway ; only here for turning on doorstep notblock: mov bl,manspath cmp bl,pointerspath jnz toofaraway cmp commandtype,3 jz isblock cmp commandtype,5 jz isaperson call examineobtext ret middleofwalk: call blocknametext ret isblock: call blocknametext ret isaperson: call personnametext ret toofaraway: call walktotext ret endp Finishedwalking proc near cmp linepointer,254 jnz iswalking mov al,facing cmp al,turntoface iswalking: ret endp Examineobtext proc near mov bl,command mov bh,commandtype mov al,1 call commandwithob ret endp Commandwithob proc near push ax push ax bx cx dx es ds si di call deltextline pop di si ds es dx cx bx ax push bx mov ah,0 add ax,ax mov bx,ax mov es,commandtext mov ax,[es:bx] add ax,textstart mov si,ax mov di,textaddressx mov bx,textaddressy mov dl,textlen mov al,0 mov ah,0 call printdirect pop ax mov di,offset cs:commandline call copyname pop ax mov di,lastxpos cmp al,0 jz noadd add di,5 noadd: mov bx,textaddressy push cs pop es mov si,offset cs:commandline mov dl,textlen mov al,0 mov ah,0 call printdirect mov newtextline,1 ret commandline: db "OBJECT NAME ONE ",0 endp Commandonly proc near push ax bx cx dx es ds si di call deltextline pop di si ds es dx cx bx ax mov ah,0 add ax,ax mov bx,ax mov es,commandtext mov ax,[es:bx] add ax,textstart mov si,ax mov di,textaddressx mov bx,textaddressy mov dl,textlen mov al,0 mov ah,0 call printdirect mov newtextline,1 ret endp Printmessage proc near push dx bx di mov ah,0 add ax,ax mov bx,ax mov es,commandtext mov ax,[es:bx] add ax,textstart mov si,ax pop di bx dx mov al,0 mov ah,0 call printdirect ret endp Printmessage2 proc near push dx bx di push ax mov ah,0 add ax,ax mov bx,ax mov es,commandtext mov ax,[es:bx] add ax,textstart mov si,ax pop ax searchmess: push ax call findnextcolon pop ax dec ah jnz searchmess pop di bx dx mov al,0 mov ah,0 call printdirect ret endp Blocknametext proc near mov bl,command mov bh,commandtype mov al,0 call commandwithob ret endp Personnametext proc near mov bl,command and bl,127 mov bh,commandtype mov al,2 call commandwithob ret endp Walktotext proc near mov bl,command mov bh,commandtype mov al,3 call commandwithob ret endp Getflagunderp proc near mov cx,mousex sub cx,mapadx mov ax,mousey sub ax,mapady mov ch,al call checkone mov lastflag,cl mov lastflagex,ch ret endp Setwalk proc near cmp linepointer,254 jnz alreadywalking mov al,pointerspath cmp al,manspath jz cantwalk2 cmp watchmode,1 jz holdingreel cmp watchmode,2 jz cantwalk mov destination,al mov finaldest,al cmp mousebutton,2 jnz notwalkandexam cmp commandtype,3 jz notwalkandexam mov walkandexam,1 mov al,commandtype mov walkexamtype,al mov al,command mov walkexamnum,al notwalkandexam: call autosetwalk cantwalk: ret cantwalk2: call facerightway ret alreadywalking: mov al,pointerspath mov finaldest,al ret holdingreel: mov destafterhold,al mov watchmode,2 ret endp Autosetwalk proc near mov al,manspath cmp finaldest,al jnz notsamealready ret notsamealready: call getroomspaths call checkdest push bx mov al,manspath mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,[es:bx] mov ah,0 sub ax,12 mov linestartx,ax mov al,[es:bx+1] mov ah,0 sub ax,12 mov linestarty,ax pop bx mov al,destination mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,[es:bx] mov ah,0 sub ax,12 mov lineendx,ax mov al,[es:bx+1] mov ah,0 sub ax,12 mov lineendy,ax call bresenhams cmp linedirection,0 jz normalline mov al,linelength dec al mov linepointer,al mov linedirection,1 ret normalline: mov linepointer,0 ret endp Checkdest proc near push bx add bx,12*8 mov ah,manspath mov cl,4 shl ah,cl mov al,destination mov cl,24 mov ch,destination checkdestloop: mov dh,[es:bx] and dh,11110000b mov dl,[es:bx] and dl,00001111b cmp ax,dx jnz nextcheck mov al,[es:bx+1] and al,15 mov destination,al pop bx ret nextcheck: mov dl,[es:bx] and dl,11110000b shr dl,1 shr dl,1 shr dl,1 shr dl,1 mov dh,[es:bx] and dh,00001111b shl dh,1 shl dh,1 shl dh,1 shl dh,1 cmp ax,dx jnz nextcheck2 mov ch,[es:bx+1] and ch,15 nextcheck2: add bx,2 dec cl jnz checkdestloop mov destination,ch pop bx ret endp Bresenhams proc near call workoutframes mov dx,seg linedata mov es,dx mov di,offset es:linedata mov si,1 mov linedirection,0 mov cx,lineendx sub cx,linestartx jz vertline jns line1 neg cx mov bx,lineendx xchg bx,linestartx mov lineendx,bx mov bx,lineendy xchg bx,linestarty mov lineendy,bx mov linedirection,1 line1: mov bx,lineendy sub bx,linestarty jz horizline jns line3 neg bx neg si line3: push si mov lineroutine,0 ; means lo slope cmp bx,cx jle line4 mov lineroutine,1 ; means hi slope xchg bx,cx line4: shl bx,1 mov increment1,bx sub bx,cx mov si,bx sub bx,cx mov increment2,bx mov ax,linestartx mov bx,linestarty mov ah,bl inc cx pop bx cmp lineroutine,1 jz hislope jmp loslope vertline: mov ax,linestarty mov bx,lineendy mov cx,bx sub cx,ax jge line31 neg cx mov ax,bx mov linedirection,1 line31: inc cx mov bx,linestartx xchg ax,bx mov ah,bl mov bx,si line32: stosw add ah,bl loop line32 jmp lineexit horizline: mov ax,linestartx mov bx,linestarty mov ah,bl inc cx horizloop: stosw inc al loop horizloop jmp lineexit loslope: loloop: stosw inc al or si,si jns line12 add si,increment1 loop loloop jmp lineexit line12: add si,increment2 add ah,bl loop loloop jmp lineexit hislope: hiloop: stosw add ah,bl or si,si jns line23 add si,increment1 loop hiloop jmp lineexit line23: add si,increment2 inc al loop hiloop lineexit: sub di,offset es:linedata mov ax,di shr ax,1 mov linelength,al ret endp Workoutframes proc near mov bx,linestartx add bx,32 mov ax,lineendx add ax,32 sub bx,ax jnc notneg1 neg bx notneg1: mov cx,linestarty add cx,32 mov ax,lineendy add ax,32 sub cx,ax jnc notneg2 neg cx notneg2: cmp bx,cx jnc tendstohoriz mov dl,2 mov ax,cx shr ax,1 cmp bx,ax jc gotquad mov dl,1 jmp gotquad tendstohoriz: mov dl,0 mov ax,bx shr ax,1 cmp cx,ax jc gotquad mov dl,1 jmp gotquad gotquad: mov bx,linestartx add bx,32 mov ax,lineendx add ax,32 sub bx,ax jc isinright isinleft: mov cx,linestarty add cx,32 mov ax,lineendy add ax,32 sub cx,ax jnc topleft cmp dl,1 jz noswap1 xor dl,2 noswap1: add dl,4 jmp success topleft: add dl,6 jmp success isinright: mov cx,linestarty add cx,32 mov ax,lineendy add ax,32 sub cx,ax jnc botright add dl,2 jmp success botright: cmp dl,1 jz noswap2 xor dl,2 noswap2: success: and dl,7 mov turntoface,dl mov turndirection,0 ret endp ;Multiply8 proc near ; ; mov ah,0 ; mov cx,8 ; mul cx ; ret ; ; endp Getroomspaths proc near mov al,roomnum mov ah,0 mov cx,144 mul cx mov es,reels mov bx,pathdata add bx,ax ret endp Copyname proc near push di call findobname pop di push cs pop es copytext: mov cx,28 make: lodsb cmp al,":" jz finishmakename cmp al,0 jz finishmakename stosb loop make finishmakename: inc cx mov al,0 stosb ret mov al,255 rep stosb ret endp Findobname proc near push ax mov ah,0 add ax,ax mov bx,ax pop ax cmp ah,5 jnz notpersonname push ax and al,127 mov ah,0 mov bx,64*2 mul bx mov si,ax mov ds,people add si,persontxtdat mov cx,persontext mov ax,[si] add ax,cx mov si,ax pop ax ret notpersonname: cmp ah,4 jnz notextraname mov ds,extras add bx,extextdat mov ax,[bx] add ax,extext mov si,ax ret notextraname: cmp ah,2 jnz notfreename mov ds,freedesc add bx,freetextdat mov ax,[bx] add ax,freetext mov si,ax ret notfreename: cmp ah,1 jnz notsetname mov ds,setdesc add bx,settextdat mov ax,[bx] add ax,settext mov si,ax ret notsetname: mov ds,blockdesc add bx,blocktextdat mov ax,[bx] add ax,blocktext mov si,ax ret endp ;-------------------------------------------Printing of non scrolling icons---- Showicon proc near cmp reallocation,50 jnc isdream1 call showpanel call showman call roomname call panelicons1 call zoomicon ret isdream1: mov ds,tempsprites mov di,72 mov bx,2 mov al,45 mov ah,0 call showframe mov ds,tempsprites mov di,72+47 mov bx,2 mov al,46 mov ah,0 call showframe mov ds,tempsprites mov di,69-10 mov bx,21 mov al,49 mov ah,0 call showframe mov ds,tempsprites mov di,160+88 mov bx,2 mov al,45 mov ah,4 call showframe mov ds,tempsprites mov di,160+43 mov bx,2 mov al,46 mov ah,4 call showframe mov ds,tempsprites mov di,160+101 mov bx,21 mov al,49 mov ah,4 call showframe call middlepanel ret endp Middlepanel proc near mov ds,tempsprites mov di,72+47+20 mov bx,0 mov al,48 mov ah,0 call showframe mov ds,tempsprites mov di,72+19 mov bx,21 mov al,47 mov ah,0 call showframe mov ds,tempsprites mov di,160+23 mov bx,0 mov al,48 mov ah,4 call showframe mov ds,tempsprites mov di,160+71 mov bx,21 mov al,47 mov ah,4 call showframe ret endp Showman proc near mov ds,icons1 mov di,0 mov bx,0 mov al,0 mov ah,0 call showframe mov ds,icons1 mov di,0 mov bx,114 mov al,1 mov ah,0 call showframe cmp shadeson,0 jz notverycool mov ds,icons1 mov di,28 mov bx,25 mov al,2 mov ah,0 call showframe notverycool: ret endp Showpanel proc near mov ds,icons1 mov di,72 mov bx,0 mov al,19 mov ah,0 call showframe mov ds,icons1 mov di,192 mov bx,0 mov al,19 mov ah,0 call showframe ret endp Roomname proc near mov di,88 mov bx,18 mov al,53 mov dl,240 call printmessage mov bl,roomnum cmp bl,32 jc notover32 sub bl,32 notover32: mov bh,0 add bx,bx mov es,roomdesc add bx,intextdat mov ax,[es:bx] add ax,intext mov si,ax mov linespacing,7 mov di,88 mov bx,25 mov dl,120 cmp watchon,1 jz gotpl mov dl,160 gotpl: mov al,0 mov ah,0 call printdirect mov linespacing,10 call usecharset1 ret endp Usecharset1 proc near mov ax,charset1 mov currentset,ax ret endp Usetempcharset proc near mov ax,tempcharset mov currentset,ax ret endp Showexit proc near mov ds,icons1 mov di,274 mov bx,154 mov al,11 mov ah,0 call showframe ret endp Panelicons1 proc near mov di,0 cmp watchon,1 jz watchison mov di,48 watchison: push di mov ds,icons2 add di,204 mov bx,4 mov al,2 mov ah,0 call showframe pop di push di cmp zoomon,1 jz zoomisoff mov ds,icons1 add di,228 mov bx,8 mov al,5 mov ah,0 call showframe zoomisoff: pop di call showwatch ret endp Showwatch proc near cmp watchon,0 jz nowristwatch mov ds,icons1 mov di,250 mov bx,1 mov al,6 mov ah,0 call showframe call showtime nowristwatch: ret endp Gettime proc near mov ah,2ch int 21h mov secondcount,dh mov minutecount,cl mov hourcount,ch ret endp Zoomicon proc near cmp zoomon,0 jz nozoom1 mov ds,icons1 mov di,zoomx mov bx,zoomy-1 mov al,8 mov ah,0 call showframe nozoom1: ret endp Showblink proc near cmp manisoffscreen,1 jz finblink1 inc blinkcount cmp shadeson,0 jnz finblink1 cmp reallocation,50 jnc eyesshut mov al,blinkcount cmp al,3 jnz finblink1 mov blinkcount,0 mov al,blinkframe inc al mov blinkframe,al cmp al,6 jc nomorethan6 mov al,6 nomorethan6: mov ah,0 mov bx,offset cs:blinktab add bx,ax mov al,[cs:bx] mov ds,icons1 mov di,44 mov bx,32 mov ah,0 call showframe finblink1: ret eyesshut: ;mov al,32 ;mov ds,icons1 ;mov di,44 ;mov bx,32 ;mov ah,0 ;call showframe ret blinktab: db 16,18,18,17,16,16,16 endp Dumpblink proc near cmp shadeson,0 jnz nodumpeye cmp blinkcount,0 jnz nodumpeye mov al,blinkframe cmp al,6 jnc nodumpeye push ds mov di,44 mov bx,32 mov cl,16 mov ch,12 call multidump pop ds nodumpeye: ret endp Worktoscreenm proc near call animpointer call readmouse call showpointer call vsync call worktoscreen call delpointer ret endp ;-------------------------------------------------------------Blank routine---- Blank proc near cmp commandtype,199 jz alreadyblnk mov commandtype,199 mov al,0 call commandonly alreadyblnk: ret endp ;---------------------------------------------------------Standard routines---- Allpointer proc near call readmouse call showpointer call dumppointer ret endp Hangonp proc near push cx add cx,cx pop ax add cx,ax mov maintimer,0 mov al,pointerframe mov ah,pickup push ax mov pointermode,3 mov pickup,0 push cx mov commandtype,255 call readmouse call animpointer call showpointer call vsync call dumppointer pop cx hangloop: push cx call delpointer call readmouse call animpointer call showpointer call vsync call dumppointer pop cx mov ax,mousebutton cmp ax,0 jz notpressed cmp ax,oldbutton jnz getoutofit notpressed: loop hangloop getoutofit: call delpointer pop ax mov pointerframe,al mov pickup,ah mov pointermode,0 ret endp Hangonw proc near hangloopw: push cx call delpointer call readmouse call animpointer call showpointer call vsync call dumppointer pop cx loop hangloopw ret endp Hangoncurs proc near monloop1: push cx call printcurs call vsync call delcurs pop cx loop monloop1 ret endp Getunderzoom proc near mov di,zoomx+5 mov bx,zoomy+4 mov ds,buffers mov si,zoomspace mov cl,46 mov ch,40 call multiget ret endp Dumpzoom proc near cmp zoomon,1 jnz notzoomon mov di,zoomx+5 mov bx,zoomy+4 mov cl,46 mov ch,40 call multidump notzoomon: ret endp Putunderzoom proc near mov di,zoomx+5 mov bx,zoomy+4 mov ds,buffers mov si,zoomspace mov cl,46 mov ch,40 call multiput ret endp Crosshair proc near cmp commandtype,3 jz nocross cmp commandtype,10 jnc nocross mov es,workspace mov ds,icons1 mov di,zoomx+24 mov bx,zoomy+19 mov al,9 mov ah,0 call showframe ret nocross: mov es,workspace mov ds,icons1 mov di,zoomx+24 mov bx,zoomy+19 mov al,29 mov ah,0 call showframe ret endp Showpointer proc near call showblink mov di,mousex mov oldpointerx,di mov bx,mousey mov oldpointery,bx cmp pickup,1 jz itsanobject push bx di mov ds,icons1 mov al,pointerframe add al,20 mov ah,0 add ax,ax mov si,ax add ax,ax add si,ax mov cx,[si] cmp cl,12 jnc notsmallx mov cl,12 notsmallx: cmp ch,12 jnc notsmally mov ch,12 notsmally: mov pointerxs,cl mov pointerys,ch push ds mov ds,buffers mov si,pointerback call multiget pop ds di bx push di bx mov al,pointerframe add al,20 mov ah,0 call showframe pop bx di ret itsanobject: mov al,itemframe mov ds,extras cmp objecttype,4 jz itsfrominv mov ds,freeframes itsfrominv: mov cl,al add al,al add al,cl inc al mov ah,0 push ax add ax,ax mov si,ax add ax,ax add si,ax mov ax,2080 mov cx,[si] cmp cl,12 jnc notsmallx2 mov cl,12 notsmallx2: cmp ch,12 jnc notsmally2 mov ch,12 notsmally2: mov pointerxs,cl mov pointerys,ch pop ax push di bx push ax bx di ds mov al,cl mov ah,0 shr ax,1 sub oldpointerx,ax sub di,ax mov al,ch shr ax,1 sub oldpointery,ax sub bx,ax mov ds,buffers mov si,pointerback call multiget pop ds di bx ax mov ah,128 call showframe pop bx di mov ds,icons1 mov al,3 mov ah,128 call showframe ret endp Delpointer proc near mov ax,oldpointerx cmp ax,0ffffh jz nevershown mov delherex,ax mov ax,oldpointery mov delherey,ax mov cl,pointerxs mov delxs,cl mov ch,pointerys mov delys,ch mov ds,buffers mov si,pointerback mov di,delherex mov bx,delherey call multiput nevershown: ret endp Dumppointer proc near call dumpblink mov cl,delxs mov ch,delys mov di,delherex mov bx,delherey call multidump mov bx,oldpointery mov di,oldpointerx cmp di,delherex jnz difffound cmp bx,delherey jz notboth difffound: mov cl,pointerxs mov ch,pointerys call multidump notboth: ret endp Undertextline proc near mov di,textaddressx mov bx,textaddressy cmp foreignrelease, 0 jz $1 sub bx,3 $1: mov ds,buffers mov si,textunder mov cl,undertextsizex mov ch,undertextsizey call multiget ret endp Deltextline proc near mov di,textaddressx mov bx,textaddressy cmp foreignrelease, 0 jz $1 sub bx,3 $1: mov ds,buffers mov si,textunder mov cl,undertextsizex mov ch,undertextsizey call multiput ret endp Dumptextline proc near cmp newtextline,1 jnz nodumptextline mov newtextline,0 mov di,textaddressx mov bx,textaddressy cmp foreignrelease, 0 jz $1 sub bx,3 $1: mov cl,undertextsizex mov ch,undertextsizey call multidump nodumptextline: ret endp Animpointer proc near cmp pointermode,2 jz combathand cmp pointermode,3 jz mousehand cmp watchingtime,0 jz notwatchpoint mov pointerframe,11 ret notwatchpoint: mov pointerframe,0 cmp inmaparea,0 jz gothand cmp pointerfirstpath,0 jz gothand arrow: call getflagunderp cmp cl,2 jc gothand cmp cl,128 jnc gothand mov pointerframe,3 test cl,4 jnz gothand mov pointerframe,4 test cl,16 jnz gothand mov pointerframe,5 test cl,2 jnz gothand mov pointerframe,6 test cl,8 jnz gothand mov pointerframe,8 gothand: ret mousehand: cmp pointerspeed,0 jz rightspeed3 dec pointerspeed jmp finflashmouse rightspeed3: mov pointerspeed,5 inc pointercount cmp pointercount,16 jnz finflashmouse mov pointercount,0 finflashmouse: mov al,pointercount mov ah,0 mov bx,offset cs:flashmousetab add bx,ax mov al,[cs:bx] mov pointerframe,al ret combathand: mov pointerframe,0 cmp reallocation,14 jnz notarrow cmp commandtype,211 jnz notarrow mov pointerframe,5 notarrow: ret flashmousetab: db 1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2 endp ;------------------------------------------------Mouse and keyboard-readers---- Setmouse proc near if recording mov recordpos,-8 mov dx,seg recname mov ds,dx mov dx,offset recname mov cx,0 mov ah,3ch mov al,2 int 21h mov rechandle,ax endif if playback mov dx,seg recname mov ds,dx mov dx,offset recname mov ah,3dh mov al,2 int 21h mov rechandle,ax call loadrec endif mov oldpointerx,0ffffh mov ax,0 int 33h mov ax,8 mov cx,15 mov dx,184 int 33h mov ax,7 mov cx,15 mov dx,298*2 int 33h ret endp Readmouse proc near mov ax,mousebutton mov oldbutton,ax mov ax,mousex mov oldx,ax mov ax,mousey mov oldy,ax call mousecall mov mousex,cx mov mousey,dx mov mousebutton,bx ret endp Mousecall proc near if playback call playmouse ret endif mov ax,3 int 33h shr cx,1 cmp cx,298 jc notxover mov cx,298 notxover: cmp cx,15 jnc notxover2 mov cx,15 notxover2: cmp dx,184 jc notyover mov dx,184 notyover: cmp dx,15 jnc notyover2 mov dx,15 notyover2: if recording call recmouse endif ret endp if playback Playmouse proc near mov es,recordspace mov di,recordpos cmp word ptr [es:di+6],0 jnz isthisplay add di,8 add recordpos,8 cmp di,16384 jnz isthisplay call loadrec isthisplay: mov cx,[es:di] mov dx,[es:di+2] mov bx,[es:di+4] dec word ptr [es:di+6] ret endp endif if recording Recmouse proc near mov es,recordspace mov di,recordpos cmp di,-8 jz diffrec cmp [es:di],cx jnz diffrec cmp [es:di+2],dx jnz diffrec cmp [es:di+4],bx jnz diffrec inc word ptr [es:di+6] cmp word ptr [es:di+5],0ffffh jz diffrec ret diffrec: add recordpos,8 add di,8 cmp di,16384 jnz notsaverec push cx dx bx call saverec pop bx dx cx notsaverec: mov [es:di],cx mov [es:di+2],dx mov [es:di+4],bx mov word ptr [es:di+6],1 ret endp Saverec proc near mov bx,rechandle mov ds,recordspace mov dx,0 mov cx,recordpos add cx,8 mov ah,40h int 21h mov di,0 mov recordpos,0 ret endp Loadrec proc near mov bx,rechandle mov ds,recordspace mov dx,0 mov cx,16384+8 mov ah,3fh int 21h mov di,0 mov recordpos,0 ret endp endif Readmouse1 proc near mov ax,mousex mov oldx,ax mov ax,mousey mov oldy,ax call mousecall mov mousex,cx mov mousey,dx mov mousebutton1,bx ret endp Readmouse2 proc near mov ax,mousex mov oldx,ax mov ax,mousey mov oldy,ax call mousecall mov mousex,cx mov mousey,dx mov mousebutton2,bx ret endp Readmouse3 proc near mov ax,mousex mov oldx,ax mov ax,mousey mov oldy,ax call mousecall mov mousex,cx mov mousey,dx mov mousebutton3,bx ret endp Readmouse4 proc near mov ax,mousebutton mov oldbutton,ax mov ax,mousex mov oldx,ax mov ax,mousey mov oldy,ax call mousecall mov mousex,cx mov mousey,dx mov ax,mousebutton1 or ax,mousebutton2 or ax,mousebutton3 or bx,ax mov mousebutton,bx ret endp Readkey proc near mov bx,bufferout cmp bx,bufferin jz nokey inc bx and bx,15 mov bufferout,bx mov di,offset cs:keybuffer add di,bx mov al,[cs:di] mov currentkey,al ret nokey: mov currentkey,0 ret endp keybuffer: db 16 dup (0) Convertkey proc near and al,127 mov ah,0 mov di,offset cs:keyconverttab add di,ax mov al,[cs:di] ret keyconverttab: db 0,0,"1","2","3","4","5","6","7","8","9","0","-",0,8,0 db "Q","W","E","R","T","Y","U","I","O","P",0,0,13,0,"A","S" db "D","F","G","H","J","K","L",0,0,0,0,0,"Z","X","C","V","B","N","M" db 0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 endp ;-------------------------------------------------------------Miscellaneous---- Randomnum1 proc near push ds es di bx cx call randomnumber pop cx bx di es ds ret endp Randomnum2 proc near push ds es di bx ax call randomnumber mov cl,al pop ax bx di es ds ret endp Randomnumber proc near mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed and al,48h add al,38h sal al,1 sal al,1 rcl seed+2,1 rcl seed+1,1 rcl seed+0,1 mov al,seed ret endp Hangon proc near hangonloop: push cx call vsync pop cx loop hangonloop ret endp ;-------------------------------------------------------------Disc handling---- Loadtraveltext proc near mov dx,offset cs:traveltextname call standardload mov traveltext,ax ret endp Loadintotemp proc near push cs pop ds call standardload mov tempgraphics,ax ret endp Loadintotemp2 proc near push cs pop ds call standardload mov tempgraphics2,ax ret endp Loadintotemp3 proc near push cs pop ds call standardload mov tempgraphics3,ax ret endp Loadtempcharset proc near call standardload mov tempcharset,ax ret endp Standardload proc near call openfile call readheader mov bx,[es:di] push bx mov cl,4 shr bx,cl call allocatemem mov ds,ax pop cx push ax mov dx,0 call readfromfile call closefile pop ax ret endp Loadtemptext proc near call standardload mov textfile1,ax ret endp Loadroom proc near mov roomloaded,1 mov timecount,0 mov maintimer,0 mov mapoffsetx,104 mov mapoffsety,38 mov textaddressx,13 mov textaddressy,182 mov textlen,240 mov al,newlocation mov location,al call getroomdata call startloading call loadroomssample call switchryanon call drawflags call getdimension ret endp Loadroomssample proc near mov al,roomssample cmp al,255 jz loadedalready cmp al,currentsample jz loadedalready mov currentsample,al mov al,currentsample mov cl,"0" call twodigitnum mov di,offset cs:samplename xchg al,ah mov [cs:di+10],ax mov dx,di call loadsecondsample loadedalready: ret endp Getridofreels proc near cmp roomloaded,0 jz dontgetrid mov es,reel1 call deallocatemem mov es,reel2 call deallocatemem mov es,reel3 call deallocatemem dontgetrid: ret endp Getridofall proc near mov es,backdrop call deallocatemem mov es,setframes call deallocatemem mov es,reel1 call deallocatemem mov es,reel2 call deallocatemem mov es,reel3 call deallocatemem mov es,reels call deallocatemem mov es,people call deallocatemem mov es,setdesc call deallocatemem mov es,blockdesc call deallocatemem mov es,roomdesc call deallocatemem mov es,freeframes call deallocatemem mov es,freedesc call deallocatemem ret endp Restorereels proc near cmp roomloaded,0 jz dontrestore mov al,reallocation call getroomdata mov dx,bx call openfile call readheader call dontloadseg call dontloadseg call dontloadseg call dontloadseg call allocateload mov reel1,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reel2,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reel3,ax mov ds,ax mov dx,0 call loadseg call closefile dontrestore: ret endp Restoreall proc near mov al,location call getroomdata mov dx,bx call openfile call readheader call allocateload mov ds,ax mov backdrop,ax mov dx,flags call loadseg mov ds,workspace ;mapdata mov dx,map mov cx,132*66 ;maplen mov al,0 call fillspace call loadseg call sortoutmap call allocateload mov setframes,ax mov ds,ax mov dx,framedata call loadseg ;mov ds,setdat ;mov dx,0 ;mov cx,setdatlen ;mov al,255 ;call fillspace call dontloadseg call allocateload mov reel1,ax mov ds,ax mov dx,0 ;call bloc ;BIG FIXME: undefined bloc, replaced with loadseg. dunno! call loadseg call allocateload mov reel2,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reel3,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reels,ax mov ds,ax mov dx,0 call loadseg call allocateload mov people,ax mov ds,ax mov dx,0 call loadseg call allocateload mov setdesc,ax mov ds,ax mov dx,0 call loadseg call allocateload mov blockdesc,ax mov ds,ax mov dx,0 call loadseg call allocateload mov roomdesc,ax mov ds,ax mov dx,0 call loadseg call allocateload mov freeframes,ax mov ds,ax mov dx,0 call loadseg ;mov ds,freedat ;mov dx,0 ;mov cx,freedatlen ;mov al,255 ;call fillspace call dontloadseg call allocateload mov freedesc,ax mov ds,ax mov dx,freetextdat call loadseg call closefile call setallchanges ret endp Sortoutmap proc near push es di mov ds,workspace mov si,0 mov es,mapdata mov di,0 mov cx,maplength blimey: push cx si mov cx,mapwidth rep movsb pop si cx add si,132 loop blimey pop di es ret endp Startloading proc near mov combatcount,0 mov al,[cs:bx+13] mov roomssample,al mov al,[cs:bx+15] mov mapx,al mov al,[cs:bx+16] mov mapy,al mov al,[cs:bx+20] ; start path pos mov liftflag,al mov al,[cs:bx+21] ; start path pos mov manspath,al mov destination,al mov finaldest,al mov al,[cs:bx+22] mov facing,al mov turntoface,al mov al,[cs:bx+23] mov counttoopen,al mov al,[cs:bx+24] mov liftpath,al mov al,[cs:bx+25] mov doorpath,al mov lastweapon,-1 mov al,[cs:bx+27] push ax mov al,[cs:bx+31] mov ah,reallocation mov reallocation,al mov dx,bx call openfile call readheader call allocateload mov ds,ax mov backdrop,ax mov dx,flags call loadseg mov ds,workspace ;mapdata mov dx,map mov cx,132*66 ;maplen mov al,0 call fillspace call loadseg call sortoutmap call allocateload mov setframes,ax mov ds,ax mov dx,framedata call loadseg mov ds,setdat mov dx,0 mov cx,setdatlen mov al,255 call fillspace call loadseg call allocateload mov reel1,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reel2,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reel3,ax mov ds,ax mov dx,0 call loadseg call allocateload mov reels,ax mov ds,ax mov dx,0 call loadseg call allocateload mov people,ax mov ds,ax mov dx,0 call loadseg call allocateload mov setdesc,ax mov ds,ax mov dx,0 call loadseg call allocateload mov blockdesc,ax mov ds,ax mov dx,0 call loadseg call allocateload mov roomdesc,ax mov ds,ax mov dx,0 call loadseg call allocateload mov freeframes,ax mov ds,ax mov dx,0 call loadseg mov ds,freedat mov dx,0 mov cx,freedatlen mov al,255 call fillspace call loadseg call allocateload mov freedesc,ax mov ds,ax mov dx,freetextdat call loadseg call closefile call findroominloc call deletetaken call setallchanges call autoappear mov al,newlocation call getroomdata mov lastweapon,-1 mov mandead,0 mov lookcounter,160 mov newlocation,255 mov linepointer,254 pop ax cmp al,255 jz dontwalkin mov manspath,al push bx call autosetwalk pop bx dontwalkin: call findxyfrompath ret endp Disablepath proc near ;needs al,ah map x,y cl=path push cx xchg al,ah mov cx,-6 looky2: add cx,6 sub al,10 jnc looky2 mov al,ah dec cx lookx2: inc cx sub al,11 jnc lookx2 mov al,cl mov ah,0 mov cx,144 mul cx mov es,reels mov bx,pathdata add bx,ax pop ax mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov al,0 mov [es:bx+6],al ret endp Findxyfrompath proc near ;path number was found from ;room data. Fill ryanxy from call getroomspaths ;the pathdata. mov al,manspath mov ah,0 add ax,ax add ax,ax add ax,ax add bx,ax mov ax,[es:bx] sub al,12 sub ah,12 mov ryanx,al mov ryany,ah ret endp Findroominloc proc near mov al,mapy mov cx,-6 looky: add cx,6 sub al,10 jnc looky mov al,mapx dec cx lookx: inc cx sub al,11 jnc lookx mov roomnum,cl ret endp Getroomdata proc near mov ah,0 mov cx,32 mul cx mov bx,offset cs:roomdata add bx,ax ret endp Readheader proc near push cs pop ds mov dx,offset cs:fileheader mov cx,headerlen call readfromfile push cs pop es mov di,offset cs:filedata ret endp Dontloadseg proc neqr mov ax,[es:di] add di,2 push bx di es mov cx,0 mov dx,ax mov al,1 mov ah,42h int 21h pop es di bx ret endp Allocateload proc near push es di mov bx,[es:di] mov cl,4 shr bx,cl call allocatemem pop di es ret endp Fillspace proc near push es ds dx di bx mov di,dx push ds pop es rep stosb pop bx di dx ds es ret endp Getridoftemp proc near mov es,tempgraphics call deallocatemem ret endp Getridoftemptext proc near mov es,textfile1 call deallocatemem ret endp Getridoftemp2 proc near mov es,tempgraphics2 call deallocatemem ret endp Getridoftemp3 proc near mov es,tempgraphics3 call deallocatemem ret endp Getridoftempcharset proc near mov es,tempcharset call deallocatemem ret endp Getridoftempsp proc near mov es,tempsprites call deallocatemem ret endp Readsetdata proc near mov dx,offset cs:characterset1 call standardload mov charset1,ax mov dx,offset cs:icongraphics0 call standardload mov icons1,ax mov dx,offset cs:icongraphics1 call standardload mov icons2,ax mov dx,offset cs:spritename1 call standardload mov mainsprites,ax mov dx,offset cs:puzzletextname call standardload mov puzzletext,ax mov dx,offset cs:commandtextname call standardload mov commandtext,ax mov ax,charset1 mov currentset,ax cmp soundint,255 jz novolumeload mov dx,offset cs:volumetabname call openfile mov cx,2048-256 mov ds,soundbuffer mov dx,16384 call readfromfile call closefile novolumeload: ret endp Createfile proc near mov ah,3ch mov cx,0 int 21h mov bx,ax ret endp Openfile proc near if cd call makename endif push cs pop ds mov ah,3dh mov al,2 push dx int 21h pop dx jc fileerror mov handle,ax ret fileerror: mov gameerror,8 jmp quickquit2 endp if cd Openfilefromc proc near push cs pop ds mov ah,3dh mov al,2 push dx int 21h pop dx mov handle,ax ret endp endif if cd Makename proc near if demo ret endif mov si,dx mov di,offset cs:place transfer: mov al,[cs:si] mov [cs:di],al inc si inc di cmp al,0 jnz transfer mov dx,offset cs:id ret id: db "D:\" place: db 30 dup (0) endp endif Openfilenocheck proc near if cd call makename endif push cs pop ds mov ah,3dh mov al,2 int 21h mov handle,ax ret endp Openforsave proc near mov cx,0 mov ah,3ch mov al,2 int 21h mov handle,ax ret endp Closefile proc near mov bx,handle mov ah,3eh int 21h ret endp Readfromfile proc near mov bx,handle mov ah,3fh int 21h ret endp Setkeyboardint proc near mov ah,35h mov al,9 int 21h mov oldint9seg,es ; Save es:bx to temp memory mov oldint9add,bx push cs pop ds mov dx,offset cs:keyboardread mov ah,25h mov al,9 int 21h ; Set to new ret endp Resetkeyboard proc near cmp oldint9add,-1 jz noreset mov dx,oldint9add ;Restore old interupt vector mov ax,oldint9seg ;for keys mov ds,ax mov ah,25h mov al,9 int 21h noreset: ret endp Keyboardread proc near push ax dx di ds es in al,60h cmp al,lasthardkey jz same mov lasthardkey,al cmp al,128 jnc same mov dx,bufferin inc dx and dx,15 cmp dx,bufferout jz same ;buffer is full mov bufferin,dx call convertkey mov di,offset cs:keybuffer mov dx,bufferin add di,dx mov [cs:di],al same: in al,61h mov ah,al or al,80h ; Mask for Akn out 61h,al ; Set Akn. and al,7fh out 61h,al cli mov al,20h ; 8259 end of interrupt out 20h,al pop es ds di dx ax iret endp ;------------------------------------------------------Text and tables data---- Fileheader db "DREAMWEB DATA FILE " db "COPYRIGHT 1992 " db "CREATIVE REALITY" Filedata dw 20 dup (0) Extradata db 6 dup (0) Headerlen equ 96 ; $-Fileheader Roomdata db "DREAMWEB.R00",0 ;Ryan's apartment db 5,255,33,10 db 255,255,255,0 db 1,6,2,255,3,255,255,255,255,255,0 db "DREAMWEB.R01",0 db 1,255,44,10 db 255,255,255,0 db 7,2,255,255,255,255,6,255,255,255,1 db "DREAMWEB.R02",0 db 2,255,33,0 db 255,255,255,0 db 1,0,255,255,1,255,3,255,255,255,2 db "DREAMWEB.R03",0 db 5,255,33,10 db 255,255,255,0 db 2,2,0,2,4,255,0,255,255,255,3 db "DREAMWEB.R04",0 db 23,255,11,30 db 255,255,255,0 db 1,4,0,5,255,255,3,255,255,255,4 db "DREAMWEB.R05",0 if demo db 22,255,22,30 else db 5,255,22,30 endif db 255,255,255,0 db 1,2,0,4,255,255,3,255,255,255,5 db "DREAMWEB.R06",0 db 5,255,11,30 db 255,255,255,0 db 1,0,0,1,2,255,0,255,255,255,6 db "DREAMWEB.R07",0 db 255,255,0,20 db 255,255,255,0 db 2,2,255,255,255,255,0,255,255,255,7 db "DREAMWEB.R08",0 db 8,255,0,10 db 255,255,255,0 db 1,2,255,255,255,255,0,11,40,0,8 db "DREAMWEB.R09",0 db 9,255,22,10 db 255,255,255,0 db 4,6,255,255,255,255,0,255,255,255,9 db "DREAMWEB.R10",0 db 10,255,33,30 db 255,255,255,0 db 2,0,255,255,2,2,4,22,30,255,10 ;22,30,0 switches ;off path 0 in skip db "DREAMWEB.R11",0 db 11,255,11,20 db 255,255,255,0 db 0,4,255,255,255,255,255,255,255,255,11 db "DREAMWEB.R12",0 db 12,255,22,20 db 255,255,255,0 db 1,4,255,255,255,255,255,255,255,255,12 db "DREAMWEB.R13",0 db 12,255,22,20 db 255,255,255,0 db 1,4,255,255,255,255,255,255,255,255,13 db "DREAMWEB.R14",0 db 14,255,44,20 db 255,255,255,0 db 0,6,255,255,255,255,255,255,255,255,14 db 32 dup (0) db 32 dup (0) db 32 dup (0) db 32 dup (0) db "DREAMWEB.R19",0 db 19,255,0,0 db 255,255,255,0 db 0,4,255,255,255,255,255,255,255,255,19 db "DREAMWEB.R20",0 db 22,255,0,20 db 255,255,255,0 db 1,4,2,15,255,255,255,255,255,255,20 db "DREAMWEB.R21",0 if demo db 22,255,11,10 else db 5,255,11,10 endif db 255,255,255,0 db 1,4,2,15,1,255,255,255,255,255,21 db "DREAMWEB.R22",0 db 22,255,22,10 db 255,255,255,0 db 0,4,255,255,1,255,255,255,255,255,22 db "DREAMWEB.R23",0 db 23,255,22,30 db 255,255,255,0 db 1,4,2,15,3,255,255,255,255,255,23 db "DREAMWEB.R24",0 db 5,255,44,0 db 255,255,255,0 db 1,6,2,15,255,255,255,255,255,255,24 db "DREAMWEB.R25",0 db 22,255,11,40 db 255,255,255,0 db 1,0,255,255,255,255,255,255,255,255,25 db "DREAMWEB.R26",0 db 9,255,22,20 db 255,255,255,0 db 4,2,255,255,255,255,255,255,255,255,26 db "DREAMWEB.R27",0 db 22,255,11,20 db 255,255,255,0 db 0,6,255,255,255,255,255,255,255,255,27 db "DREAMWEB.R28",0 db 5,255,11,30 db 255,255,255,0 db 0,0,255,255,2,255,255,255,255,255,28 db "DREAMWEB.R29",0 db 22,255,11,10 db 255,255,255,0 db 0,2,255,255,255,255,255,255,255,255,29 db "DREAMWEB.R05",0 ;Duplicate of hotel lobby, if demo db 22,255,22,10 ;but emerging from the lift. else db 5,255,22,10 endif db 255,255,255,0 db 1,4,1,15,255,255,255,255,255,255,5 db "DREAMWEB.R04",0 ;Duplicate of pool hall lobby, db 23,255,22,20 ;but emerging from the lift. db 255,255,255,0 db 1,4,2,15,255,255,255,255,255,255,4 db "DREAMWEB.R10",0 ;entering alley via skip db 10,255,22,30 db 255,255,255,0 db 3,6,255,255,255,255,255,255,255,255,10 db "DREAMWEB.R12",0 ;on the beach, getting up. db 12,255,22,20 db 255,255,255,0 db 0,2,255,255,255,255,255,255,255,255,12 db "DREAMWEB.R03",0 ;Duplicate of Eden's lobby db 5,255,44,0 ;but emerging from the lift db 255,255,255,0 db 1,6,2,255,4,255,255,255,255,255,3 db "DREAMWEB.R24",0 ;Duplicate of Eden's flat db 5,255,22,0 ;but starting on the bed db 255,255,255,0 db 3,6,0,255,255,255,255,33,0,3,24 ; 33,0,3 turns off ; path for lift db "DREAMWEB.R22",0 ;Duplicate db 22,255,22,20 ;of hotel but in pool room db 255,255,255,0 db 1,4,255,255,255,255,255,255,255,255,22 db "DREAMWEB.R22",0 ;Duplicate db 22,255,22,20 ;of hotel but in pool room db 255,255,255,0 ;coming out of bedroom db 0,2,255,255,255,255,255,255,255,255,22 db "DREAMWEB.R11",0 ;Duplicate db 11,255,22,30 ;of carpark but getting db 255,255,255,0 ;up off the floor db 0,0,255,255,255,255,255,255,255,255,11 db "DREAMWEB.R28",0 db 5,255,11,20 db 255,255,255,0 db 0,6,255,255,2,255,255,255,255,255,28 db "DREAMWEB.R21",0 if demo db 22,255,11,10 else db 5,255,11,10 endif db 255,255,255,0 db 1,4,2,15,1,255,255,255,255,255,21 db "DREAMWEB.R26",0 db 9,255,0,40 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,26 db "DREAMWEB.R19",0 db 19,255,0,0 db 255,255,255,0 db 2,2,255,255,255,255,255,255,255,255,19 db "DREAMWEB.R08",0 ;leaving tvstudio into street db 8,255,11,40 db 255,255,255,0 db 0,4,255,255,255,255,255,255,255,255,8 db "DREAMWEB.R01",0 db 1,255,44,10 db 255,255,255,0 db 3,6,255,255,255,255,255,255,255,255,1 db "DREAMWEB.R45",0 ;Dream room db 35,255,22,30 db 255,255,255,0 db 0,6,255,255,255,255,255,255,255,255,45 db "DREAMWEB.R46",0 ;Dream room db 35,255,22,40 db 255,255,255,0 db 0,4,255,255,255,255,255,255,255,255,46 db "DREAMWEB.R47",0 ;Dream room db 35,255,0,0 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,47 db "DREAMWEB.R45",0 ;Dream room db 35,255,22,30 db 255,255,255,0 db 4,0,255,255,255,255,255,255,255,255,45 db "DREAMWEB.R46",0 ;Dream room db 35,255,22,50 db 255,255,255,0 db 0,4,255,255,255,255,255,255,255,255,46 db "DREAMWEB.R50",0 ; Intro sequence one db 35,255,22,30 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,50 db "DREAMWEB.R51",0 ; Intro sequence two db 35,255,11,30 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,51 db "DREAMWEB.R52",0 ; Intro sequence three db 35,255,22,30 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,52 db "DREAMWEB.R53",0 ; Intro sequence four db 35,255,33,0 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,53 db "DREAMWEB.R54",0 ; Intro sequence five - wasteland db 35,255,0,0 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,54 db "DREAMWEB.R55",0 ; End sequence db 14,255,44,0 db 255,255,255,0 db 0,0,255,255,255,255,255,255,255,255,55 Madeuproomdat db 32 dup (0) Roomscango db 1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0 Roompics db 5,0,3,2,4,1,10,9,8,6,11,4,7,7,0 Oplist db 3 dup (0) Inputline db 128 dup (0) linedata dw 200 dup (0ffffh) presslist db 6 dup (255) savenames db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 savefiles db "DREAMWEB.D00",0 db "DREAMWEB.D01",0 db "DREAMWEB.D02",0 db "DREAMWEB.D03",0 db "DREAMWEB.D04",0 db "DREAMWEB.D05",0 db "DREAMWEB.D06",0 Recname db "DREAMWEB.DEM",0 Quitrequested db 0 Subtitles db 0 ForeignRelease db 0 ;-------------------------------------------------------End of code segment---- DREAMWEBPROG ends ;---------------------------------------------------------------Stack space----s STACKSPACE segment para stack 'STACK' stak db 256 dup (?) STACKSPACE ends ;-----------------------------------------------------------End of all code---- end Dreamweb