;Copyright (c) 1990-2012 by Neil Dodwell
;Released with permission from Neil Dodwell under GPLv2
;See LICENSE file for full license text

Useobject	proc	near

	mov	withobject,255

	cmp	commandtype,229
	jz	alreadyuse
	mov	commandtype,229

	mov	bl,command
	mov	bh,objecttype
	mov	al,51
	call	commandwithob
alreadyuse:	mov	ax,mousebutton
	cmp	ax,oldbutton
	jz	nouse
	and	ax,1
	jnz	douse
nouse:	ret

douse:	call	useroutine
	ret

	endp







Useroutine	proc	near

	cmp	reallocation,50
	jc	nodream7
	cmp	pointerpower,0
	jnz	powerok
	ret
powerok:	mov	pointerpower,0

nodream7:	call	getanyad
	mov	dx,seg uselist
	mov	ds,dx
	mov	si,offset uselist
checkuselist:	push	si
	lodsb
	sub	al,"A"
	cmp	al,[es:bx+12]
	jnz	failed
	lodsb
	sub	al,"A"
	cmp	al,[es:bx+13]
	jnz	failed
	lodsb
	sub	al,"A"
	cmp	al,[es:bx+14]
	jnz	failed
	lodsb
	sub	al,"A"
	cmp	al,[es:bx+15]
	jnz	failed
	lodsw
	pop	si
	call	ax
	ret
failed: 	pop	si
	add	si,6
	cmp	byte ptr [si],140
	jnz	checkuselist

	call	delpointer
	call	getobtextstart
	call	findnextcolon
	cmp	al,0
	jz	cantuse2
	call	findnextcolon
	cmp	al,0
	jz	cantuse2
	mov	al,[es:si]
	cmp	al,0
	jz	cantuse2
	call	usetext
	mov	cx,400
	call	hangonp
	call	putbackobstuff
	ret
cantuse2:	call	createpanel
	call	showpanel
	call	showman
	call	showexit
	call	obicons
	mov	di,33
	mov	bx,100
	mov	al,63
	mov	dl,241
	call	printmessage
	call	worktoscreenm
	mov	cx,50
	call	hangonp
	call	putbackobstuff
	mov	commandtype,255
	ret

Uselist:	db	"NETW"
	dw      usemon
	db	"ELVA"
	dw	useelevator1
	db	"ELVB"
	dw	useelevator2
	db	"ELVC"
	dw	useelevator3
	db	"ELVE"
	dw	useelevator4
	db	"ELVF"
	dw	useelevator5
	db	"CGAT"
	dw	usechurchgate
	db	"REMO"
	dw	usestereo
	db	"BUTA"
	dw	usebuttona
	db	"CBOX"
	dw	usewinch
	db	"LITE"
	dw	uselighter
	db	"PLAT"
	dw	useplate
	db	"LIFT"
	dw	usecontrol
	db	"WIRE"
	dw	usewire
	db	"HNDL"
	dw	usehandle
	db	"HACH"
	dw	usehatch
	db	"DOOR"
	dw	useelvdoor
	db	"CSHR"
	dw	usecashcard
	db	"GUNA"
	dw	usegun
	db	"CRAA"
	dw	usecardreader1
	db	"CRBB"
	dw	usecardreader2
	db	"CRCC"
	dw	usecardreader3
	db	"SEAT"
	dw	sitdowninbar
	db	"MENU"
	dw	usemenu
	db	"COOK"
	dw	usecooker
	db	"ELCA"
	dw	callhotellift
	db	"EDCA"
	dw	calledenslift
	db	"DDCA"
	dw	calledensdlift
	db	"ALTR"
	dw	usealtar
	db	"LOKA"
	dw	openhoteldoor
	db	"LOKB"
	dw	openhoteldoor2
	db	"ENTA"
	dw	openlouis
	db	"ENTB"
	dw	openryan
	db	"ENTE"
	dw	openpoolboss
	db	"ENTC"
	dw	openyourneighbour
	db	"ENTD"
	dw	openeden
	db	"ENTH"
	dw	opensarters
	db	"WWAT"
	dw	wearwatch
	db	"POOL"
	dw	usepoolreader
	db	"WSHD"
	dw	wearshades
	db	"GRAF"
	dw	grafittidoor
	db	"TRAP"
	dw	trapdoor
	db	"CDPE"
	dw	edenscdplayer

	db	"DLOK"
	dw	opentvdoor

	db	"HOLE"
	dw	usehole

	db	"DRYR"
	dw	usedryer

	db	"HOLY"
	dw	usechurchhole
	
	db	"WALL"
	dw	usewall
	db	"BOOK"
	dw	usediary

	db	"AXED"
	dw	useaxe
	db	"SHLD"
	dw	useshield

	db	"BCNY"
	dw	userailing
	db	"LIDC"
	dw	usecoveredbox
	db	"LIDU"
	dw	useclearbox
	db	"LIDO"
	dw	useopenbox
	db	"PIPE"
	dw	usepipe

	db	"BALC"
	dw	usebalcony
	db	"WIND"
	dw	usewindow
	db	"PAPR"
	dw	viewfolder
	
	db	"UWTA"
	dw	usetrainer
	db	"UWTB"
	dw	usetrainer
	
	db	"STAT"
	dw	entersymbol
	db	"TLID"
	dw	opentomb
	db	"SLAB"
	dw	useslab
	db	"CART"
	dw	usecart
	db	"FCAR"
	dw	usefullcart


	db	"SLBA"
	dw	slabdoora
	db	"SLBB"
	dw	slabdoorb
	db	"SLBC"
	dw	slabdoorc
	db	"SLBD"
	dw	slabdoord
	db	"SLBE"
	dw	slabdoore
	db	"SLBF"
	dw	slabdoorf
	db	"PLIN"
	dw	useplinth

	db	"LADD"
	dw	useladder
	db	"LADB"
	dw	useladderb

	db	"GUMA"
	dw	chewy
	
	db	"SQEE"
	dw	wheelsound
	db	"TAPP"
	dw	runtap
	db	"GUIT"
	dw	playguitar
	db	"CONT"
	dw	hotelcontrol

	db	"BELL"
	dw	hotelbell

	db	140,140,140,140

	endp






;-----------------------------------------------------------Puzzle routines----


Wheelsound	proc	near

	mov	al,17
	call	playchannel1
	call	showfirstuse
	call	putbackobstuff
	ret

	endp




Runtap	proc	near

	cmp	withobject,255
	jnz	tapwith
	call	withwhat
	ret
tapwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"P"
	mov	dh,"E"
	call	compare
	jz	fillcupfromtap
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"P"
	mov	dh,"F"
	call	compare
	jz	cupfromtapfull
	mov	cx,300
	mov	al,56
	call	showpuztext
	call	putbackobstuff
	ret

fillcupfromtap:	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+15],"F"-"A"
	mov	al,8
	call	playchannel1
	mov	cx,300
	mov	al,57
	call	showpuztext
	call	putbackobstuff
	ret

cupfromtapfull:	mov	cx,300
	mov	al,58
	call	showpuztext
	call	putbackobstuff
	ret


	endp



Playguitar	proc	near

	mov	al,14
	call	playchannel1
	call	showfirstuse
	call	putbackobstuff
	ret

	endp



Hotelcontrol	proc	near

	cmp	reallocation,21
	jnz	notrightcont
	cmp	mapx,33
	jnz	notrightcont
	call	showfirstuse
	call	putbackobstuff
	ret
notrightcont:	call	showseconduse
	call	putbackobstuff
	ret

	endp




Hotelbell	proc	near

	if	demo
	mov	al,24
	else
	mov	al,12
	endif
	call	playchannel1
	call	showfirstuse
	call	putbackobstuff
	ret

	endp





Opentomb	proc	near

	inc	progresspoints
	call	showfirstuse
	mov	watchingtime,35*2
	mov	reeltowatch,1
	mov	endwatchreel,33
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp



Usetrainer	proc	near

	call	getanyad
	cmp	byte ptr [es:bx+2],4
	jnz	notheldtrainer
	inc	progresspoints
	call	makeworn
	call	showseconduse
	call	putbackobstuff
	ret
notheldtrainer:	call	nothelderror
	ret

	endp



Nothelderror	proc	near

	call	createpanel
	call	showpanel
	call	showman
	call	showexit
	call	obicons
	mov	di,64
	mov	bx,100
	mov	al,63
	mov	ah,1
	mov	dl,201
	call	printmessage2
	call	worktoscreenm
	mov	cx,50
	call	hangonp
	call	putbackobstuff
	ret

	endp



Usepipe	proc	near
	
	cmp	withobject,255
	jnz	pipewith
	call	withwhat
	ret
pipewith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"P"
	mov	dh,"E"
	call	compare
	jz	fillcup
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"P"
	mov	dh,"F"
	call	compare
	jz	alreadyfull
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

fillcup:	mov	cx,300
	mov	al,36
	call	showpuztext
	call	putbackobstuff
	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+15],"F"-"A"
	ret

alreadyfull:	mov	cx,300
	mov	al,35
	call	showpuztext
	call	putbackobstuff
	ret

	endp






Usefullcart	proc	near

	inc	progresspoints
	mov	al,2
	mov	ah,roomnum
	add	ah,6
	call	turnanypathon
	mov	manspath,4
	mov	facing,4
	mov	turntoface,4
	mov	finaldest,4
	call	findxyfrompath
	mov	resetmanxy,1
	call	showfirstuse
	mov	watchingtime,72*2
	mov	reeltowatch,58
	mov	endwatchreel,142
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp







Useplinth	proc	near

	cmp	withobject,255
	jnz	plinthwith
	call	withwhat
	ret

plinthwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"D"
	mov	ch,"K"
	mov	dl,"E"
	mov	dh,"Y"
	call	compare
	jz	isrightkey
	call	showfirstuse
	call	putbackobstuff
	ret

isrightkey:	inc	progresspoints
	call	showseconduse
	mov	watchingtime,220
	mov	reeltowatch,0
	mov	endwatchreel,104
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	mov	al,roomafterdream
	mov	newlocation,al
	ret

	endp



Chewy	proc	near

	call	showfirstuse
	call	getanyad
	mov	byte ptr [es:bx+2],255
	mov	getback,1
	ret

	endp





Useladder	proc	near

	call	showfirstuse
	sub	mapx,11
	call	findroominloc
	mov	facing,6
	mov	turntoface,6
	mov	manspath,0
	mov	destination,0
	mov	finaldest,0
	call	findxyfrompath
	mov	resetmanxy,1
	mov	getback,1
	ret

	endp





Useladderb	proc	near

	call	showfirstuse
	add	mapx,11
	call	findroominloc
	mov	facing,2
	mov	turntoface,2
	mov	manspath,1
	mov	destination,1
	mov	finaldest,1
	call	findxyfrompath
	mov	resetmanxy,1
	mov	getback,1
	ret

	endp





Slabdoora	proc	near

	call	showfirstuse
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,13
	cmp	dreamnumber,3
	jnz	slabawrong
	inc	progresspoints
	mov	watchingtime,60
	mov	endwatchreel,42
	mov	newlocation,47
	ret
slabawrong:	mov	watchingtime,40
	mov	endwatchreel,34
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp




Slabdoorb	proc	near

	cmp	dreamnumber,1
	jnz	slabbwrong
	mov	al,"S"
	mov	ah,"H"
	mov	cl,"L"
	mov	ch,"D"
	call	isryanholding
	jnz	gotcrystal
	mov	al,44
	mov	cx,200	
	call	showpuztext
	call	putbackobstuff
	ret
gotcrystal:	call	showfirstuse
	inc	progresspoints
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,44
	mov	watchingtime,60
	mov	endwatchreel,71
	mov	newlocation,47
	ret
slabbwrong:	call	showfirstuse
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,44
	mov	watchingtime,40
	mov	endwatchreel,63
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp



Slabdoord	proc	near

	call	showfirstuse
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,75
	cmp	dreamnumber,0
	jnz	slabcwrong
	inc	progresspoints
	mov	watchingtime,60
	mov	endwatchreel,102
	mov	newlocation,47
	ret
slabcwrong:	mov	watchingtime,40
	mov	endwatchreel,94
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp



Slabdoorc	proc	near

	call	showfirstuse
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,108
	cmp	dreamnumber,4
	jnz	slabdwrong
	inc	progresspoints
	mov	watchingtime,60
	mov	endwatchreel,135
	mov	newlocation,47
	ret
slabdwrong:	mov	watchingtime,40
	mov	endwatchreel,127
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp



Slabdoore	proc	near

	call	showfirstuse
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,141
	cmp	dreamnumber,5
	jnz	slabewrong
	inc	progresspoints
	mov	watchingtime,60
	mov	endwatchreel,168
	mov	newlocation,47
	ret
slabewrong:	mov	watchingtime,40
	mov	endwatchreel,160
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp



Slabdoorf	proc	near

	call	showfirstuse
	mov	getback,1
	mov	watchspeed,1
	mov	speedcount,1
	mov	reeltowatch,171
	cmp	dreamnumber,2
	jnz	slabfwrong
	inc	progresspoints
	mov	watchingtime,60
	mov	endwatchreel,197
	mov	newlocation,47
	ret
slabfwrong:	mov	watchingtime,40
	mov	endwatchreel,189
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp






Useslab	proc	near
	
	cmp	withobject,255
	jnz	slabwith
	call	withwhat
	ret
slabwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"J"
	mov	ch,"E"
	mov	dl,"W"
	mov	dh,"L"
	call	compare
	jz	nextslab
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret
nextslab:	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+2],0
	mov	al,command
	push	ax
	call	removesetobject
	pop	ax
	inc	al
	push	ax
	call	placesetobject
	pop	ax
	cmp	al,54
	jnz	notlastslab
	mov	al,0
	call	turnpathon
	mov	watchingtime,22
	mov	reeltowatch,35
	mov	endwatchreel,48
	mov	watchspeed,1
	mov	speedcount,1
notlastslab:	inc	progresspoints
	call	showfirstuse
	mov	getback,1
	ret

	endp





Usecart	proc	near
	
	cmp	withobject,255
	jnz	cartwith
	call	withwhat
	ret
cartwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"R"
	mov	ch,"O"
	mov	dl,"C"
	mov	dh,"K"
	call	compare
	jz	nextcart
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret
nextcart:	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+2],0
	mov	al,command
	push	ax
	call	removesetobject
	pop	ax
	inc	al
	call	placesetobject
	inc	progresspoints
	mov	al,17
	call	playchannel1
	call	showfirstuse
	mov	getback,1
	ret

	endp








Useclearbox	proc	near

	cmp	withobject,255
	jnz	clearboxwith
	call	withwhat
	ret
clearboxwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"R"
	mov	ch,"A"
	mov	dl,"I"
	mov	dh,"L"
	call	compare
	jz	openbox
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

openbox:	inc	progresspoints
	call	showfirstuse
	mov	watchingtime,80
	mov	reeltowatch,67
	mov	endwatchreel,105
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret
	
	endp





Usecoveredbox	proc	near

	inc	progresspoints
	call	showfirstuse
	mov	watchingtime,50
	mov	reeltowatch,41
	mov	endwatchreel,66
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp



Userailing	proc	near

	call	showfirstuse
	mov	watchingtime,80
	mov	reeltowatch,0
	mov	endwatchreel,30
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	mov	mandead,4
	ret

	endp





Useopenbox	proc	near

	cmp	withobject,255
	jnz	openboxwith
	call	withwhat
	ret
openboxwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"P"
	mov	dh,"F"
	call	compare
	jz	destoryopenbox
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"P"
	mov	dh,"E"
	call	compare
	jz	openboxwrong
	call	showfirstuse
	ret

destoryopenbox:	inc	progresspoints
	mov	cx,300
	mov	al,37
	call	showpuztext
	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+15],"E"-"A"
	mov	watchingtime,140
	mov	reeltowatch,105
	mov	endwatchreel,181
	mov	watchspeed,1
	mov	speedcount,1
	mov	al,4
	call	turnpathon
	mov	getback,1
	ret

openboxwrong:	mov	cx,300
	mov	al,38
	call	showpuztext
	call	putbackobstuff
	ret

	endp














Wearwatch	proc	near

	cmp	watchon,1
	jz	wearingwatch
	call	showfirstuse
	mov	watchon,1
	mov	getback,1
	call	getanyad
	call	makeworn
	ret
wearingwatch:	call	showseconduse
	call	putbackobstuff
	ret

	endp




Wearshades	proc	near

	cmp	shadeson,1
	jz	wearingshades
	mov	shadeson,1
	call	showfirstuse
	mov	getback,1
	call	getanyad
	call	makeworn
	ret
wearingshades:	call	showseconduse
	call	putbackobstuff
	ret
	
	endp



Sitdowninbar	proc	near

	cmp	watchmode,-1
	jnz	satdown
	call	showfirstuse
	mov	watchingtime,50
	mov	reeltowatch,55
	mov	endwatchreel,71
	mov	reeltohold,73
	mov	endofholdreel,83
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret
satdown:	call	showseconduse
	call	putbackobstuff
	ret

	endp



Usechurchhole	proc	near

	call	showfirstuse
	mov	getback,1
	mov	watchingtime,28
	mov	reeltowatch,13
	mov	endwatchreel,26
	mov	watchspeed,1
	mov	speedcount,1
	ret

	endp



Usehole	proc	near

	cmp	withobject,255
	jnz	holewith
	call	withwhat
	ret
holewith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"H"
	mov	ch,"N"
	mov	dl,"D"
	mov	dh,"A"
	call	compare
	jz	righthand
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

righthand:	call	showfirstuse
	mov	al,86
	call	removesetobject
	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+2],255
	mov	canmovealtar,1
	mov	getback,1
	ret

	endp




Usealtar	proc	near

	mov	al,"C"
	mov	ah,"N"
	mov	cl,"D"
	mov	ch,"A"
	call	findexobject
	cmp	al,numexobjects
	jz	thingsonaltar
	mov	al,"C"
	mov	ah,"N"
	mov	cl,"D"
	mov	ch,"B"
	call	findexobject
	cmp	al,numexobjects
	jz	thingsonaltar
	cmp	canmovealtar,1
	jz	movealtar
	mov	cx,300
	mov	al,23
	call	showpuztext
	mov	getback,1
         	ret

movealtar:	inc	progresspoints
	call	showseconduse
	mov	watchingtime,160
	mov	reeltowatch,81
	mov	endwatchreel,174
	mov	watchspeed,1
	mov	speedcount,1

	mov	al,47		;message number
	mov	bl,52		;x pos of message
	mov	bh,76		;and y pos
	mov	cx,32		;time on screen
	mov	dx,98		;pause before show
	call	setuptimeduse
	mov	getback,1
	ret

thingsonaltar:	call	showfirstuse
	mov	getback,1
	ret

	endp









Opentvdoor	proc	near

	cmp	withobject,255
	jnz	tvdoorwith
	call	withwhat
	ret
tvdoorwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"U"
	mov	ch,"L"
	mov	dl,"O"
	mov	dh,"K"
	call	compare
	jz	keyontv
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

keyontv:	call	showfirstuse
	mov	lockstatus,0
	mov	getback,1
	ret

	endp







Usedryer	proc	near

	mov	al,12
	call	playchannel1
	call	showfirstuse
	mov	getback,1
	ret

	endp





Openlouis	proc	near

	mov	al,5
	mov	ah,2
	mov	cl,3
	mov	ch,8
	call	entercode
	mov	getback,1
	ret

	endp




Nextcolon	proc	near

lookcolon:	mov	al,[es:si]
	inc	si
	cmp	al,":"
	jnz	lookcolon
	ret

	endp




Openyourneighbour	proc	near

	mov	al,255
	mov	ah,255
	mov	cl,255
	mov	ch,255
	call	entercode
	mov	getback,1
	ret

	endp



Usewindow	proc	near

	cmp	manspath,6
	jnz	notonbalc
	inc	progresspoints
	call	showfirstuse
	mov	newlocation,29	
	mov	getback,1
	ret
notonbalc:	call	showseconduse
	call	putbackobstuff
	ret

	endp



Usebalcony	proc	near

	call	showfirstuse
	mov	al,6
	call	turnpathon
	mov	al,0
	call	turnpathoff
	mov	al,1
	call	turnpathoff
	mov	al,2
	call	turnpathoff
	mov	al,3
	call	turnpathoff
	mov	al,4
	call	turnpathoff
	mov	al,5
	call	turnpathoff
	inc	progresspoints
	mov	manspath,6
	mov	destination,6
	mov	finaldest,6
	call	findxyfrompath
	call	switchryanoff
	mov	resetmanxy,1

	mov	watchingtime,30*2
	mov	reeltowatch,183
	mov	endwatchreel,212
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp



Openryan	proc	near

	mov	al,5
	mov	ah,1
	mov	cl,0
	mov	ch,6
	call	entercode
	mov	getback,1
	ret

	endp



Openpoolboss	proc	near

	mov	al,5
	mov	ah,2
	mov	cl,2
	mov	ch,2
	call	entercode
	mov	getback,1
	ret

	endp




Openeden	proc	near

	mov	al,2
	mov	ah,8
	mov	cl,6
	mov	ch,5
	call	entercode
	mov	getback,1
	ret

	endp


Opensarters	proc	near

	mov	al,7
	mov	ah,8
	mov	cl,3
	mov	ch,3
	call	entercode
	mov	getback,1
	ret

	endp




Isitright	proc	near

	mov	bx,seg presslist
	mov	es,bx
	mov	bx,offset es:presslist
	cmp	[es:bx+0],al
	jnz	notright
	cmp	[es:bx+1],ah
	jnz	notright
	cmp	[es:bx+2],cl
	jnz	notright
	cmp	[es:bx+3],ch
notright:	ret

	endp




Drawitall	proc	near

	call	createpanel
	call	drawfloor
	;call	dumpallmap
	call	printsprites
	call	showicon
	ret

	endp




Openhoteldoor	proc	near

	cmp	withobject,255
	jnz	hoteldoorwith
	call	withwhat
	ret
hoteldoorwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"K"
	mov	ch,"E"
	mov	dl,"Y"
	mov	dh,"A"
	call	compare
	jz	keyonhotel1
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

keyonhotel1:	if	demo
	mov	al,27
	else
	mov	al,16
	endif
	call	playchannel1
	call	showfirstuse
	;mov	destination,1
	;mov	finaldest,1
	;call	autosetwalk
	mov	lockstatus,0
	mov	getback,1
	ret

	endp



Openhoteldoor2	proc	near

	cmp	withobject,255
	jnz	hoteldoorwith2
	call	withwhat
	ret
hoteldoorwith2:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"K"
	mov	ch,"E"
	mov	dl,"Y"
	mov	dh,"A"
	call	compare
	jz	keyonhotel2
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

keyonhotel2:	if	demo
	mov	al,27
	else
	mov	al,16
	endif
	call	playchannel1
	call	showfirstuse
	call	putbackobstuff
	ret

	endp






Grafittidoor	proc	near

	cmp	withobject,255
	jnz	grafwith
	call	withwhat
	ret
grafwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"A"
	mov	ch,"P"
	mov	dl,"E"
	mov	dh,"N"
	call	compare
	jz	dograf
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

dograf: 	call	showfirstuse
	call	putbackobstuff
	ret

	endp





Trapdoor	proc	near

	inc	progresspoints
	call	showfirstuse
	call	switchryanoff
	mov	watchingtime,20*2
	mov	reeltowatch,181
	mov	endwatchreel,197
	mov	newlocation,26
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp




Callhotellift	proc	near

	if	demo
	mov	al,24
	else
	mov	al,12
	endif
	call	playchannel1
	call	showfirstuse
	mov	counttoopen,8
	mov	getback,1
	mov	destination,5
	mov	finaldest,5
	call	autosetwalk
	mov	al,4
	call	turnpathon
	ret

	endp




Calledenslift	proc	near

	call	showfirstuse
	mov	counttoopen,8
	mov	getback,1
	mov	al,2
	call	turnpathon
	ret

	endp



Calledensdlift	proc	near

	cmp	liftflag,1
	jz	edensdhere
	call	showfirstuse
	mov	counttoopen,8
	mov	getback,1
	mov	al,2
	call	turnpathon
	ret
edensdhere:	call	showseconduse
	call	putbackobstuff
	ret

	endp






Usepoolreader	proc	near

	cmp	withobject,255
	jnz	poolwith
	call	withwhat
	ret
poolwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"M"
	mov	ch,"E"
	mov	dl,"M"
	mov	dh,"B"
	call	compare
	jz	openpool
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

openpool:	cmp	talkedtoattendant,1
	jz	canopenpool
	call	showseconduse
	call	putbackobstuff
	ret

canopenpool:	mov	al,17
	call	playchannel1
	call	showfirstuse
	mov	counttoopen,6
	mov	getback,1
	ret

	endp













Uselighter	proc	near

	cmp	withobject,255
	jnz	gotlighterwith
	call	withwhat
	ret
gotlighterwith: 	mov	al,withobject
	mov	ah,withtype
	mov	cl,"S"
	mov	ch,"M"
	mov	dl,"K"
	mov	dh,"E"
	call	compare
	jz	cigarette
	call	showfirstuse
	call	putbackobstuff
	ret
cigarette:	mov	cx,300
	mov	al,9
	call	showpuztext
	mov	al,withobject
	call	getexad
	mov	byte ptr [es:bx+2],255
	mov	getback,1
	ret

	endp













Showseconduse	proc	near

	call	getobtextstart
	call	nextcolon
	call	nextcolon
	call	nextcolon
	call	usetext
	mov	cx,400
	call	hangonp
	ret

	endp






Usecardreader1	proc	near

	cmp	withobject,255
	jnz	gotreader1with
	call	withwhat
	ret
gotreader1with:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"S"
	mov	dl,"H"
	mov	dh,"R"
	call	compare
	jz	correctcard
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret
correctcard:	cmp	talkedtosparky,0
	jz	notyet
	cmp	card1money,0
	jz	getscash
	mov	cx,300
	mov	al,17
	call	showpuztext
	call	putbackobstuff
	ret
getscash:	mov	al,16
	call	playchannel1
	mov	cx,300
	mov	al,18
	call	showpuztext
	inc	progresspoints
	mov	card1money,12432
	mov	getback,1
	ret
notyet:	call	showfirstuse
	call	putbackobstuff
	ret

	endp




Usecardreader2	proc	near

	cmp	withobject,255
	jnz	gotreader2with
	call	withwhat
	ret
gotreader2with:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"S"
	mov	dl,"H"
	mov	dh,"R"
	call	compare
	jz	correctcard2
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

correctcard2:	cmp	talkedtoboss,0
	jz	notyetboss
	cmp	card1money,0
	jz	nocash
	cmp	gunpassflag,2
	jz	alreadygotnew
	mov	al,18
	call	playchannel1
	mov	cx,300
	mov	al,19
	call	showpuztext
	mov	al,94
	call	placesetobject
	mov	gunpassflag,1
	sub	card1money,2000
	inc	progresspoints
	mov	getback,1
	ret
nocash: 	mov	cx,300
	mov	al,20
	call	showpuztext
	call	putbackobstuff
	ret
alreadygotnew:	mov	cx,300
	mov	al,22
	call	showpuztext
	call	putbackobstuff
	ret
notyetboss:	call	showfirstuse
	call	putbackobstuff
	ret

	endp







Usecardreader3	proc	near

	cmp	withobject,255
	jnz	gotreader3with
	call	withwhat
	ret
gotreader3with:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"S"
	mov	dl,"H"
	mov	dh,"R"
	call	compare
	jz	rightcard
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

rightcard:	cmp	talkedtorecep,0
	jz	notyetrecep
	cmp	cardpassflag,0
	jnz	alreadyusedit
	if	demo
	mov	al,27
	else
	mov	al,16
	endif
	call	playchannel1
	mov	cx,300
	mov	al,25
	call	showpuztext
	inc	progresspoints
	sub	card1money,8300
	mov	cardpassflag,1
	mov	getback,1
	ret
alreadyusedit:	mov	cx,300
	mov	al,26
	call	showpuztext
	call	putbackobstuff
	ret
notyetrecep:	call	showfirstuse
	call	putbackobstuff
	ret

	endp








Usecashcard	proc	near

	call	getridofreels
	call	loadkeypad
	call	createpanel
	call	showpanel
	call	showexit
	call	showman

	mov	di,114
	mov	bx,120
	cmp	foreignrelease, 0
	jz $1
	mov	bx,120-3
$1:
	mov	ds,tempgraphics
	mov	al,39
	mov	ah,0
	call	showframe

	mov	ax,card1money
	call	moneypoke

	call	getobtextstart
	call	nextcolon
	call	nextcolon

	mov	di,36
	mov	bx,98
	mov	dl,241
	mov	al,0
	mov	ah,0
	call	printdirect

	mov	di,160
	mov	bx,155
	push	cs
	pop	es
	mov	si,offset cs:money1poke
	mov	charshift,91*2+75 
	mov	al,0
	mov	ah,0
	mov	dl,240
	call	printdirect
	mov	di,187
	mov	bx,155
	push	cs
	pop	es
	mov	si,offset cs:money2poke
	mov	charshift,91*2+85
	mov	al,0
	mov	ah,0
	mov	dl,240
	call	printdirect
	mov	charshift,0
	call	worktoscreenm
	mov	cx,400
	call	hangonp
	call	getridoftemp
	call	restorereels
	call	putbackobstuff
	ret

money1poke:	db	"0000",0
money2poke:	db	"00",0
		
	endp




Lookatcard	proc	near

	mov	manisoffscreen,1
	call	getridofreels
	call	loadkeypad

	call	createpanel2
	mov	di,160
	mov	bx,80
	mov	ds,tempgraphics
	mov	al,42
	mov	ah,128
	call	showframe

	call	getobtextstart
	call	findnextcolon
	call	findnextcolon
	call	findnextcolon
	mov	di,36
	mov	bx,124
	mov	dl,241
	mov	al,0
	mov	ah,0
	call	printdirect

	push	es si
	call	worktoscreenm
	mov	cx,280
	call	hangonw
	call	createpanel2
	mov	di,160
	mov	bx,80
	mov	ds,tempgraphics
	mov	al,42
	mov	ah,128
	call	showframe
	pop	si es

	mov	di,36
	mov	bx,130
	mov	dl,241
	mov	al,0
	mov	ah,0
	call	printdirect
	call	worktoscreenm

	mov	cx,200
	call	hangonw
	mov	manisoffscreen,0
	call	getridoftemp
	call	restorereels
	call	putbackobstuff
	ret

	endp





Moneypoke	proc	near
	
	mov	bx,offset cs:money1poke
	mov	cl,48-1
numberpoke0:	inc	cl
	sub	ax,10000
	jnc	numberpoke0
	add	ax,10000
	mov	[cs:bx],cl
	inc	bx

	mov	cl,48-1
numberpoke1:	inc	cl
	sub	ax,1000
	jnc	numberpoke1
	add	ax,1000
	mov	[cs:bx],cl
	inc	bx

	mov	cl,48-1
numberpoke2:	inc	cl
	sub	ax,100
	jnc	numberpoke2
	add	ax,100
	mov	[cs:bx],cl
	inc	bx

	mov	cl,48-1
numberpoke3:	inc	cl
	sub	ax,10
	jnc	numberpoke3
	add	ax,10
	mov	[cs:bx],cl

	mov	bx,offset cs:money2poke
	add	al,48
	mov	[cs:bx],al
	ret

	endp







Usecontrol	proc	near

	cmp	withobject,255
	jnz	gotcontrolwith
	call	withwhat
	ret
gotcontrolwith: 	mov	al,withobject
	mov	ah,withtype
	mov	cl,"K"
	mov	ch,"E"
	mov	dl,"Y"
	mov	dh,"A"
	call	compare
	jz	rightkey
	cmp	reallocation,21
	jnz	balls
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"K"
	mov	ch,"N"
	mov	dl,"F"
	mov	dh,"E"
	call	compare
	jz	jimmycontrols
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"A"
	mov	ch,"X"
	mov	dl,"E"
	mov	dh,"D"
	call	compare
	jz	axeoncontrols

balls:	call	showfirstuse
	call	putbackobstuff
	ret

rightkey:	mov	al,16
	call	playchannel1
	cmp	location,21
	jz	goingdown
	mov	cx,300
	mov	al,0
	call	showpuztext
	mov	newlocation,21
	mov	counttoclose,8
	mov	counttoopen,0
	mov	watchingtime,80
	mov	getback,1
	ret

goingdown:	mov	cx,300
	mov	al,3
	call	showpuztext
	mov	newlocation,30
	mov	counttoclose,8
	mov	counttoopen,0
	mov	watchingtime,80
	mov	getback,1
	ret

jimmycontrols:	mov	al,50
	call	placesetobject
	mov	al,51
	call	placesetobject
	mov	al,26
	call	placesetobject
	mov	al,30
	call	placesetobject
	mov	al,16
	call	removesetobject
	mov	al,17
	call	removesetobject
	if	demo
	mov	al,26
	else
	mov	al,14
	endif
	call	playchannel1
	mov	cx,300
	mov	al,10
	call	showpuztext
	inc	progresspoints
	mov	getback,1
	ret

axeoncontrols:	mov	cx,300
	mov	al,16
	call	showpuztext
	inc	progresspoints
	call	putbackobstuff
	ret

	endp






Usehatch	proc	near

	call	showfirstuse
	mov	newlocation,40
	mov	getback,1
	ret

	endp





Usewire 	proc	near

	cmp	withobject,255
	jnz	gotwirewith
	call	withwhat
	ret
gotwirewith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"K"
	mov	ch,"N"
	mov	dl,"F"
	mov	dh,"E"
	call	compare
	jz	wireknife
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"A"
	mov	ch,"X"
	mov	dl,"E"
	mov	dh,"D"
	call	compare
	jz	wireaxe

	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

wireaxe:	mov	cx,300
	mov	al,16
	call	showpuztext
	call	putbackobstuff
	ret

wireknife:	mov	al,51
	call	removesetobject
	mov	al,52
	call	placesetobject
	mov	cx,300
	mov	al,11
	call	showpuztext
	inc	progresspoints
	mov	getback,1
	ret

	endp







Usehandle	proc	near

	mov	al,"C"
	mov	ah,"U"
	mov	cl,"T"
	mov	ch,"W"
	call	findsetobject
	mov	al,[es:bx+58]
	cmp	al,255
	jnz	havecutwire
	mov	cx,300
	mov	al,12
	call	showpuztext
	mov	getback,1
	ret

havecutwire:	mov	cx,300
	mov	al,13
	call	showpuztext
	mov	newlocation,22
	mov	getback,1
	ret

	endp








Useelevator1	proc	near

	call	showfirstuse
	call	selectlocation
	mov	getback,1
	ret

	endp






Showfirstuse	proc	near		;shows but does not delete the
				;first bit of text after the
	call	getobtextstart		;description
	call	findnextcolon
	call	findnextcolon
	call	usetext
	mov	cx,400
	call	hangonp
	ret

	endp





Useelevator3	proc	near

	call	showfirstuse
	mov	counttoclose,20
	mov	newlocation,34
	mov	reeltowatch,46
	mov	endwatchreel,63
	mov	watchspeed,1
	mov	speedcount,1
	mov	watchingtime,80 ;40
	mov	getback,1
	ret

	endp




Useelevator4	proc	near

	call	showfirstuse
	mov	reeltowatch,0
	mov	endwatchreel,11
	mov	watchspeed,1
	mov	speedcount,1
	mov	counttoclose,20
	mov	watchingtime,80 ;40
	mov	getback,1
	mov	newlocation,24
	ret

	endp



Useelevator2	proc	near

	cmp	location,23
	jz	inpoolhall
	call	showfirstuse
	mov	newlocation,23
	mov	counttoclose,20
	mov	counttoopen,0
	mov	watchingtime,80
	mov	getback,1
	ret
inpoolhall:	call	showfirstuse
	mov	newlocation,31
	mov	counttoclose,20
	mov	counttoopen,0
	mov	watchingtime,80
	mov	getback,1
	ret

	endp




Useelevator5	proc	near

	mov	al,4
	call	placesetobject
	mov	al,0
	call	removesetobject
	mov	newlocation,20
	mov	watchingtime,80
	mov	liftflag,1
	mov	counttoclose,8
	mov	getback,1
	ret

	endp





Usekey	proc	near

	cmp	location,5
	jz	usekey1
	cmp	location,30
	jz	usekey1
	cmp	location,21
	jz	usekey2
	mov	cx,200
	mov	al,1
	call	showpuztext
	call	putbackobstuff
	ret

usekey1:	cmp	mapx,22
	jnz	wrongroom1
	cmp	mapy,10
	jnz	wrongroom1
	mov	cx,300
	mov	al,0
	call	showpuztext
	mov	counttoclose,100
	mov	getback,1
	ret

usekey2:	cmp	mapx,11
	jnz	wrongroom1
	cmp	mapy,10
	jnz	wrongroom1
	mov	cx,300
	mov	al,3
	call	showpuztext
	mov	newlocation,30
	mov	al,2
	call	fadescreendown
	call	showfirstuse
	call	putbackobstuff
	ret

wrongroom1:	mov	cx,200
	mov	al,2
	call	showpuztext
	call	putbackobstuff
	ret

	endp







Usestereo	proc	near

	cmp	location,0
	jz	stereook
	mov	cx,400		;Ryan isn't in his flat.
	mov	al,4
	call	showpuztext
	call	putbackobstuff
	ret

stereook:	cmp	mapx,11
	jnz	stereonotok
	cmp	mapy,0
	jz	stereook2
stereonotok:	mov	cx,400		;Ryan isn't in his bedroom.
	mov	al,5
	call	showpuztext
	call	putbackobstuff
	ret

stereook2:	mov	al,"C"
	mov	ah,"D"
	mov	cl,"P"
	mov	ch,"L"
	call	findsetobject	;find object number of CD player
	mov	ah,1		;searching for inside a set ob
	call	checkinside	;see if there is anything inside
	cmp	cl,numexobjects
	jnz	cdinside
	mov	al,6		;Need a CD inside
	mov	cx,400
	call	showpuztext
	call	putbackobstuff
	call	getanyad		;if the CD's been taken out,
	mov	al,255		;make sure the player isn't still
	mov	[es:bx+10],al	;playing, ie:reset the puzzle
	ret			;flag for the remote.

cdinside:	call	getanyad
	mov	al,[es:bx+10]
	xor	al,1
	mov	[es:bx+10],al
	cmp	al,255
	jz	stereoon
	mov	al,7		;The stereo works
	mov	cx,400
	call	showpuztext
	call	putbackobstuff
	ret

stereoon:	mov	al,8		;Stereo was already on,
	mov	cx,400		;so switch it off
	call	showpuztext
	call	putbackobstuff
	ret

	endp















Usecooker	proc	near

	mov	al,command
	mov	ah,objecttype
	call	checkinside	;see if there is anything inside
	cmp	cl,numexobjects
	jnz	foodinside
	call	showfirstuse
	call	putbackobstuff
	ret			;flag for the remote.

foodinside:	call	showseconduse
	call	putbackobstuff
	ret

	endp






Useaxe	proc	near

	cmp	reallocation,22
	jnz	notinpool
	cmp	mapy,10
	jz	axeondoor
	call	showseconduse
	inc	progresspoints
	mov	lastweapon,2
	mov	getback,1
	call	removeobfrominv
	ret

notinpool:	call	showfirstuse
	ret

	endp








Useelvdoor	proc	near

	cmp	withobject,255
	jnz	gotdoorwith
	call	withwhat
	ret
gotdoorwith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"A"
	mov	ch,"X"
	mov	dl,"E"
	mov	dh,"D"
	call	compare
	jz	axeondoor
	mov	al,14
	mov	cx,300
	call	showpuztext
	call	putbackobstuff
	ret

axeondoor:	mov	al,15
	mov	cx,300
	call	showpuztext
	inc	progresspoints

	mov	watchingtime,46*2
	mov	reeltowatch,31
	mov	endwatchreel,77
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp

;------------------------------------------------------------------------------

Withwhat	proc	near		;Gets player to identify object
				;to use selected item with.
	call	createpanel
	call	showpanel
	call	showman
	call	showexit
	mov	al,command
	mov	ah,objecttype
	push	cs
	pop	es
	mov	di,offset cs:commandline
	call	copyname

	mov	di,100
	mov	bx,21
	mov	dl,200
	mov	al,63
	mov	ah,2
	call	printmessage2

	mov	di,lastxpos
	add	di,5
	mov	bx,21
	push	cs
	pop	es
	mov	si,offset cs:commandline
	mov	dl,220
	mov	al,0
	mov	ah,0
	call	printdirect

	mov	di,lastxpos
	add	di,5
	mov	bx,21
	mov	dl,200
	mov	al,63
	mov	ah,3
	call	printmessage2

	call	fillryan
	mov	commandtype,255
	call	readmouse
	call	showpointer
	call	worktoscreen
	call	delpointer
	mov	invopen,2
	ret

	endp





Selectob	proc	near

	call	findinvpos
	mov	ax,[es:bx]
	cmp	al,255
	jnz	canselectob
	call	blank
	ret

canselectob:	mov	withobject,al
	mov	withtype,ah
	cmp	ax,oldsubject
	jnz	diffsub3
	cmp	commandtype,221
	jz	alreadyselob
	mov	commandtype,221

diffsub3:	mov	oldsubject,ax
	mov	bx,ax
	mov	al,0
	call	commandwithob
alreadyselob:	mov	ax,mousebutton
	cmp	ax,oldbutton
	jz	notselob
	and	ax,1
	jnz	doselob
notselob:	ret

doselob:	call	delpointer
	mov	invopen,0
	call	useroutine
	ret

	endp








Compare 	proc	near

	sub	dl,"A"
	sub	dh,"A"
	sub	cl,"A"
	sub	ch,"A"
	push	cx dx
	call	getanyaddir
	pop	dx cx
	cmp	[es:bx+12],cx
	jnz	comparefin
	cmp	[es:bx+14],dx
comparefin:	ret

	endp











Findsetobject	proc	near		;searches set object ID's
				;for contents of ax,cx
	sub	al,"A"	 ;returns number in al and data
	sub	ah,"A"	 ;start point in es:bx
	sub	cl,"A"
	sub	ch,"A"
	mov	es,setdat
	mov	bx,0
	mov	dl,0		;dl counts object number
findsetloop:	cmp	al,[es:bx+12]
	jnz	nofind
	cmp	ah,[es:bx+13]
	jnz	nofind
	cmp	cl,[es:bx+14]
	jnz	nofind
	cmp	ch,[es:bx+15]
	jnz	nofind
	mov	al,dl
	ret
nofind: 	add	bx,64
	inc	dl
	cmp	dl,128		;number of objects to search
	jnz	findsetloop
	mov	al,dl
	ret

	endp






Findexobject	proc	near			;searches ex object ID's
					;for contents of ax,cx
	sub	al,"A"	 	;returns number in al and data
	sub	ah,"A"	 	;start point in es:bx
	sub	cl,"A"
	sub	ch,"A"
	mov	es,extras
	mov	bx,exdata
	mov	dl,0			;dl counts object number
findexloop:	cmp	al,[es:bx+12]
	jnz	nofindex
	cmp	ah,[es:bx+13]
	jnz	nofindex
	cmp	cl,[es:bx+14]
	jnz	nofindex
	cmp	ch,[es:bx+15]
	jnz	nofindex
	mov	al,dl
	ret
nofindex:	add	bx,16
	inc	dl
	cmp	dl,numexobjects	 	;number of objects to search
	jnz	findexloop
	mov	al,dl
	ret

	endp



Isryanholding	proc	near

	sub	al,"A"	 	;returns number in al and data
	sub	ah,"A"	 	;start point in es:bx
	sub	cl,"A"
	sub	ch,"A"
	mov	es,extras
	mov	bx,exdata
	mov	dl,0			;dl counts object number
searchinv:	cmp	byte ptr [es:bx+2],4
	jnz	nofindininv
	cmp	al,[es:bx+12]
	jnz	nofindininv
	cmp	ah,[es:bx+13]
	jnz	nofindininv
	cmp	cl,[es:bx+14]
	jnz	nofindininv
	cmp	ch,[es:bx+15]
	jnz	nofindininv
	mov	al,dl
	cmp	al,numexobjects
	ret
nofindininv:	add	bx,16
	inc	dl
	cmp	dl,numexobjects	 	;number of objects to search
	jnz	searchinv
	mov	al,dl
	cmp	al,numexobjects		;if not zero he is holding
	ret			;if zero, he is not holding

	endp




Checkinside	proc	near		;finds an extra object inside
		  	;object number al, type ah

	mov	es,extras
	mov	bx,exdata
	mov	cl,0
insideloop:	cmp	al,[es:bx+3]	 ;OI! might need to check room number!!!
	jnz	notfoundinside
	cmp	ah,[es:bx+2]
	jnz	notfoundinside
	ret
notfoundinside: 	add	bx,16
	inc	cl
	cmp	cl,numexobjects
	jnz	insideloop
	ret			;ch returns the object number
				;in the extras list
	endp












Usetext 	proc	near

	push	es si
	call	createpanel
	call	showpanel
	call	showman
	call	showexit
	call	obicons
	pop	si es

	mov	di,36
	mov	bx,104
	mov	dl,241
	mov	al,0
	mov	ah,0
	call	printdirect

	call	worktoscreenm
	ret

	endp





Putbackobstuff	proc	near

	call	createpanel
	call	showpanel
	call	showman
	call	obicons
	call	showexit
	call	obpicture
	call	describeob
	call	undertextline
	mov	commandtype,255
	call	readmouse
	call	showpointer
	call	worktoscreen
	call	delpointer
	ret

	endp







Showpuztext	proc	near

	push	cx
	call	findpuztext	
	push	es si
	call	createpanel
	call	showpanel
	call	showman
	call	showexit
	call	obicons
	pop	si es
	mov	di,36
	mov	bx,104
	mov	dl,241
	mov	ah,0
	call	printdirect
	call	worktoscreenm
	pop	cx
	call	hangonp
	ret

	endp



Findpuztext	proc	near

	mov	ah,0
	mov	si,ax
	add	si,si
	mov	es,puzzletext
	mov	ax,[es:si]
	add	ax,textstart
	mov	si,ax
	ret

	endp



;-------------------------------------------------------------------------------

Placesetobject	proc	near

	push	es bx
	mov	cl,0
	mov	ch,0
	call	findormake
	call	getsetad
	mov	byte ptr [es:bx+58],0
	pop	bx es
	ret

	endp




Removesetobject proc	near

	push	es bx
	mov	cl,255
	mov	ch,0
	call	findormake
	call	getsetad
	mov	byte ptr [es:bx+58],255
	pop	bx es
	ret

	endp




Issetobonmap	proc	near

	push	es bx
	call	getsetad
	mov	al,[es:bx+58]
	pop	bx es
	cmp	al,0
	ret

	endp






Placefreeobject	proc	near

	push	es bx
	mov	cl,0
	mov	ch,1
	call	findormake
	call	getfreead
	mov	byte ptr [es:bx+2],0
	pop	bx es
	ret

	endp





Removefreeobject	proc	near

	push	es bx
	;mov	cl,255
	;mov	ch,1
	;call	findormake
	call	getfreead
	mov	byte ptr [es:bx+2],255
	pop	bx es
	ret

	endp










Findormake	proc	near

	mov	bx,listofchanges
	push	ax
	mov	es,buffers
	mov	ah,reallocation
changeloop:	cmp	byte ptr [es:bx],255
	jz	haventfound
	cmp	ax,[es:bx]
	jnz	nofoundchange
              	cmp	ch,[es:bx+3]
	jz	foundchange
nofoundchange:	add	bx,4
	jmp	changeloop
foundchange:	pop	ax
	mov	[es:bx+2],cl
	ret
haventfound:	mov	[es:bx],ax
	mov	[es:bx+2],cx
	pop	ax
	ret

	endp








Switchryanon	proc	near

	mov	ryanon,255
	ret

	endp





Switchryanoff	proc	near

	mov	ryanon,1
	ret

	endp



Setallchanges	proc	near

	mov	es,buffers
	mov	bx,listofchanges
setallloop:	mov	ax,[es:bx]
	cmp	al,255
	jz	endsetloop
	mov	cx,[es:bx+2]
	add	bx,4
	cmp	ah,reallocation
	jnz	setallloop
	push	es bx
	call	dochange
	pop	bx es
	jmp	setallloop
endsetloop:	ret

	endp






Dochange	proc	near

	cmp	ch,0
	jz	object
	cmp	ch,1
	jz	freeobject

path:	push	cx
	mov	ah,0
	add	ax,ax
	add	ax,ax
	add	ax,ax
	push	ax
	mov	al,ch
	sub	al,100
	mov	ah,0
	mov	cx,144
	mul	cx
	pop	bx
	add	bx,ax
	add	bx,pathdata
	mov	es,reels
	pop	cx
	mov	byte ptr [es:bx+6],cl
nopath:	ret

object:	push	cx
	call	getsetad
	pop	cx
	mov	[es:bx+58],cl
	ret

freeobject:	push	cx
	call	getfreead
	pop	cx
	cmp	byte ptr [es:bx+2],255
	jnz	beenpickedup
	mov	[es:bx+2],cl
beenpickedup:	ret

	endp



Autoappear	proc	near				;places objects that appear
			;in rooms after certain
	cmp	location,32			;conditions are met.
	jnz	notinalley
	mov	al,5	;switch off travel to
	call	resetlocation	;hotel after kill
	mov	al,10
	call	setlocation
	mov	destpos,10
	ret
notinalley:	cmp	reallocation,24
	jnz	notinedens
	cmp	generaldead,1
	jnz	edenspart2
	inc	generaldead
	mov	al,44
	call	placesetobject
	mov	al,18
	call	placesetobject
	mov	al,93
	call	placesetobject
	mov	al,92
	call	removesetobject
	mov	al,55
	call	removesetobject
	mov	al,75
	call	removesetobject
	mov	al,84
	call	removesetobject
	mov	al,85
	call	removesetobject
	ret
edenspart2:	cmp	sartaindead,1
	jnz	notedens2
	mov	al,44
	call	removesetobject
	mov	al,93
	call	removesetobject
	mov	al,55
	call	placesetobject
	inc	sartaindead
notedens2:	ret	
notinedens:	cmp	reallocation,25
	jnz	notonsartroof
	mov	newsitem,3
	mov	al,6
	call	resetlocation	 ;turn off Sartain Industries
	mov	al,11
	call	setlocation		;turn on carpark for later
	mov	destpos,11
	ret
notonsartroof:	cmp	reallocation,2
	jnz	notinlouiss
	cmp	rockstardead,0
	jz	notinlouiss
	mov	al,23
	call	placesetobject
notinlouiss:	ret

	endp










;--------------------------------------------------------- Timed text stuff ----



Getundertimed	proc	near

	mov	al,timedy
	cmp	foreignrelease, 0
	jz $1
	sub	al,3
$1:
	mov	ah,0
	mov	bx,ax
	mov	al,timedx
	mov	ah,0
	mov	di,ax
	mov	ch,undertimedysize
	mov	cl,240
	mov	ds,buffers
	mov	si,undertimedtext
	call	multiget
	ret

	endp




Putundertimed	proc	near

	mov	al,timedy
	cmp	foreignrelease, 0
	jz $1
	sub	al,3
$1:
	mov	ah,0
	mov	bx,ax
	mov	al,timedx
	mov	ah,0
	mov	di,ax
	mov	ch,undertimedysize
	mov	cl,240
	mov	ds,buffers
	mov	si,undertimedtext
	call	multiput
	ret

	endp






Dumptimedtext	proc	near

	cmp	needtodumptimed,1
	jnz	nodumptimed
	mov	al,timedy
	cmp	foreignrelease, 0
	jz $1
	sub	al,3
$1:
	mov	ah,0
	mov	bx,ax
	mov	al,timedx
	mov	ah,0
	mov	di,ax
	mov	cl,240
	mov	ch,undertimedysize
	call	multidump
	mov	needtodumptimed,0
nodumptimed:	ret

	endp








Setuptimeduse	proc	near

	cmp	timecount,0
	jnz	cantsetup

	mov	timedy,bh
	mov	timedx,bl
	mov	counttotimed,cx
	add	dx,cx
	mov	timecount,dx
	mov	bl,al
	mov	bh,0
	add	bx,bx
	mov	es,puzzletext
	mov	cx,textstart
	mov	ax,[es:bx]
	add	ax,cx
	mov	bx,ax
	mov	timedseg,es
	mov	timedoffset,bx
cantsetup:	ret

	endp



Setuptimedtemp	proc	near

	if	cd
	cmp	ah,0
	jz	notloadspeech3
	push ax
	push bx
	push cx
	push dx
	mov	dl,"T"
	mov	dh,ah
	mov	cl,"T"
	mov	ah,0
	call	loadspeech
	cmp	speechloaded,1
	jnz	$1
	mov	al,50+12
	call	playchannel1
$1:
	pop dx
	pop cx
	pop bx
	pop ax

	cmp	speechloaded,1
	jnz	notloadspeech3 ; failed to load speech
	cmp	subtitles, 1
	jz	notloadspeech3
	ret

notloadspeech3:
	endif	;if cd

	cmp	timecount,0
	jnz	cantsetup2
	mov	timedy,bh
	mov	timedx,bl
	mov	counttotimed,cx
	add	dx,cx
	mov	timecount,dx
	mov	bl,al
	mov	bh,0
	add	bx,bx
	mov	es,textfile1
	mov	cx,textstart
	mov	ax,[es:bx]
	add	ax,cx
	mov	bx,ax
	mov	timedseg,es
	mov	timedoffset,bx
cantsetup2:	ret

	endp







Usetimedtext	proc	near

	cmp	timecount,0
	jz	notext
	dec	timecount
	cmp	timecount,0
	jz	deltimedtext
	mov	ax,timecount
	cmp	ax,counttotimed
	jz	firsttimed
	jnc	notext
	jmp	notfirsttimed
firsttimed:	call	getundertimed
notfirsttimed:	mov	bl,timedy
	mov	bh,0
	mov	al,timedx
	mov	ah,0
	mov	di,ax
	mov	es,timedseg
	mov	si,timedoffset
	mov	dl,237
	mov	ah,0
	call	printdirect
	mov	needtodumptimed,1
notext: 	ret

deltimedtext:	call	putundertimed
	mov	needtodumptimed,1
	ret

	endp












Edenscdplayer	proc	near

	call	showfirstuse
	mov	watchingtime,18*2
	mov	reeltowatch,25
	mov	endwatchreel,42
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	ret

	endp





Usewall	proc	near

	call	showfirstuse
	cmp	manspath,3
	jz	gobackover
	mov	watchingtime,30*2
	mov	reeltowatch,2
	mov	endwatchreel,31
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	mov	al,3
	call	turnpathon
	mov	al,4
	call	turnpathon
	mov	al,0
	call	turnpathoff
	mov	al,1
	call	turnpathoff
	mov	al,2
	call	turnpathoff
	mov	al,5
	call	turnpathoff
	mov	manspath,3
	mov	finaldest,3
	call	findxyfrompath
	mov	resetmanxy,1
	call	switchryanoff
	ret
gobackover:	mov	watchingtime,30*2
	mov	reeltowatch,34
	mov	endwatchreel,60
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	mov	al,3
	call	turnpathoff
	mov	al,4
	call	turnpathoff
	mov	al,0
	call	turnpathon
	mov	al,1
	call	turnpathon
	mov	al,2
	call	turnpathon
	mov	al,5
	call	turnpathon
	mov	manspath,5
	mov	finaldest,5
	call	findxyfrompath
	mov	resetmanxy,1
	call	switchryanoff
	ret

	endp







Usechurchgate	proc	near

	cmp	withobject,255
	jnz	gatewith
	call	withwhat
	ret
gatewith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"C"
	mov	ch,"U"
	mov	dl,"T"
	mov	dh,"T"
	call	compare
	jz	cutgate
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret	
	
cutgate:	call	showfirstuse
	mov	watchingtime,64*2
	mov	reeltowatch,4
	mov	endwatchreel,70
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	inc	progresspoints
	mov	al,3
	call	turnpathon
	cmp	aidedead,0
	jz	notopenchurch
	mov	al,2
	call	turnpathon
notopenchurch:	ret

	endp





Usegun	proc	near

	cmp	objecttype,4
	jz	istakengun
	call	showseconduse
	call	putbackobstuff
	ret
istakengun:	cmp	reallocation,22
	jnz	notinpoolroom
	mov	cx,300
	mov	al,34
	call	showpuztext
	mov	lastweapon,1
	mov	combatcount,39
	mov	getback,1
	inc	progresspoints
	ret
notinpoolroom:	cmp	reallocation,25
	jnz	nothelicopter
	mov	cx,300
	mov	al,34
	call	showpuztext
	mov	lastweapon,1
	mov	combatcount,19
	mov	getback,1
	mov	dreamnumber,2
	mov	roomafterdream,38
	mov	sartaindead,1
	inc	progresspoints
	ret
nothelicopter:	cmp	reallocation,27
	jnz	notinrockroom
	mov	cx,300
	mov	al,46
	call	showpuztext
	mov	pointermode,2 ;0
	mov	rockstardead,1
	mov	lastweapon,1
	mov	newsitem,1
	mov	getback,1
	mov	roomafterdream,32 ; skip
	mov	dreamnumber,0
	inc	progresspoints
	ret
notinrockroom:	cmp	reallocation,8
	jnz	notbystudio
	cmp	mapx,22
	jnz	notbystudio
	cmp	mapy,40
	jnz	notbystudio
	mov	al,92
	call	issetobonmap
	jz	notbystudio
	cmp	manspath,9
	jz	notbystudio
	mov	destination,9
	mov	finaldest,9
	call	autosetwalk
	mov	lastweapon,1
	mov	getback,1
	inc	progresspoints
	ret
notbystudio:	cmp	reallocation,6
	jnz	notsarters
	cmp	mapx,11
	jnz	notsarters
	cmp	mapy,20
	jnz	notsarters
	mov	al,5
	call	issetobonmap
	jnz	notsarters
	mov	destination,1
	mov	finaldest,1
	call	autosetwalk
	mov	al,5
	call	removesetobject
	mov	al,6
	call	placesetobject
	mov	al,1
	mov	ah,roomnum
	dec	ah
	call	turnanypathon
	mov	liftflag,1
	mov	watchingtime,40*2
	mov	reeltowatch,4
	mov	endwatchreel,43
	mov	watchspeed,1
	mov	speedcount,1
	mov	getback,1
	inc	progresspoints
	ret
notsarters:	cmp	reallocation,29
	jnz	notaide
	mov	getback,1
	mov	al,13
	call	resetlocation
	mov	al,12
	call	setlocation
	mov	destpos,12
	mov	destination,2
	mov	finaldest,2
	call	autosetwalk
	mov	watchingtime,164*2
	mov	reeltowatch,3
	mov	endwatchreel,164
	mov	watchspeed,1
	mov	speedcount,1
	mov	aidedead,1
	mov	dreamnumber,3
	mov	roomafterdream,33
	inc	progresspoints
	ret
notaide:	cmp	reallocation,23
	jnz	notwithboss
	cmp	mapx,0
	jnz	notwithboss
	cmp	mapy,50
	jnz	notwithboss
	cmp	manspath,5
	jz	pathokboss
	mov	destination,5
	mov	finaldest,5
	call	autosetwalk
pathokboss:	mov	lastweapon,1
	mov	getback,1
	ret
notwithboss:	cmp	reallocation,8
	jnz	nottvsoldier
	cmp	mapx,11
	jnz	nottvsoldier
	cmp	mapy,10
	jnz	nottvsoldier
	cmp	manspath,2
	jz	pathoktv
	mov	destination,2
	mov	finaldest,2
	call	autosetwalk
pathoktv:	mov	lastweapon,1
	mov	getback,1
	ret
nottvsoldier:	call	showfirstuse
	call	putbackobstuff
	ret

	endp







Useshield	proc	near

	cmp	reallocation,20
	jnz	notinsartroom
	cmp	combatcount,0
	jz	notinsartroom
	mov	lastweapon,3
	call	showseconduse
	mov	getback,1
	inc	progresspoints
	call	removeobfrominv
	ret
notinsartroom:	call	showfirstuse
	call	putbackobstuff
	ret

	endp






Usebuttona	proc	near

	mov	al,95
	call	issetobonmap
	jz	donethisbit

	call	showfirstuse
	mov	al,0
	mov	ah,roomnum
	dec	ah
	call	turnanypathon
	mov	al,9
	call	removesetobject
	mov	al,95
	call	placesetobject

	mov	watchingtime,15*2
	mov	reeltowatch,71
	mov	endwatchreel,85
	mov	watchspeed,1
	mov	speedcount,1

	mov	getback,1
	inc	progresspoints
	ret
donethisbit:	call	showseconduse
	call	putbackobstuff
	ret

	endp




Useplate	proc	near

	cmp	withobject,255
	jnz	platewith
	call	withwhat
	ret
platewith:	mov	al,withobject
	mov	ah,withtype
	mov	cl,"S"
	mov	ch,"C"
	mov	dl,"R"
	mov	dh,"W"
	call	compare
	jz	unscrewplate
	mov	al,withobject
	mov	ah,withtype
	mov	cl,"K"
	mov	ch,"N"
	mov	dl,"F"
	mov	dh,"E"
	call	compare
	jz	triedknife
	mov	cx,300
	mov	al,14
	call	showpuztext
	call	putbackobstuff
	ret

unscrewplate:	mov	al,20
	call	playchannel1
	call	showfirstuse
	mov	al,28
	call	placesetobject
	mov	al,24
	call	placesetobject
	mov	al,25
	call	removesetobject
	mov	al,0
	call	placefreeobject
	inc	progresspoints
	mov	getback,1
	ret

triedknife:	mov	cx,300
	mov	al,54
	call	showpuztext
	call	putbackobstuff
	ret

	endp





Usewinch	proc	near

	mov	al,40
	mov	ah,1
	call	checkinside
	cmp	cl,numexobjects
	jz	nowinch
	mov	al,cl
	mov	ah,4
	mov	cl,"F"
	mov	ch,"U"
	mov	dl,"S"
	mov	dh,"E"
	call	compare
	jnz	nowinch

	mov	watchingtime,217*2
	mov	reeltowatch,0
	mov	endwatchreel,217
	mov	watchspeed,1
	mov	speedcount,1
	mov	destpos,1
	mov	newlocation,45
	mov	dreamnumber,1
	mov	roomafterdream,44
	mov	generaldead,1
	mov	newsitem,2
	mov	getback,1
	inc	progresspoints
	ret

nowinch:	call	showfirstuse
   	call	putbackobstuff
	ret

	endp