scummvm/devtools/tasmrecover/dreamweb/dreamweb.asm
2012-01-01 11:49:41 +01:00

6269 lines
73 KiB
NASM

;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