"SOUNDS for SHERLOCK"

;"SOUND sound-id,[action],[volume]"

<REPLACE-DEFINITION SOUND-CODE

<GLOBAL SOUND-QUEUED? <>> ;"N = non-looping sound running"
<GLOBAL LOOPING? -1> ;"-1 = sound never seen, 0 = no looping, N = looping sound
			partially replaces SOUND-FLAG 0"
<GLOBAL SOUND-ON? T> ;"T = sound on; F = sound off; partially replaces S-F 0"
<GLOBAL LOOP-VOL 0>  ;"replaces SOUND-FLAG second element"
;<GLOBAL SOUND-FLAG <TABLE -1 0>> ;"first element -1 = sound never seen
				 		  0 = sound off
						  1 = sound on
					more than 1 = looping sound"

<ROUTINE SOUNDS (N "OPT" (OP ,S-START) (VOL 8) (NUM 1) RTN)
	 ;<COND (<ZERO? .OP> <SET OP ,S-START>)> ;"arg. never passed as 0"
	 <COND (<AND <L? ,LOOPING? 0>
		     <EQUAL? .OP ,S-START>>
		<SETG LOOPING? 0>
		<TELL CR
"[Use $SOUND to toggle sound usage on and off.]" CR>)>
	 <COND (<AND <==? .OP ,S-INIT>
		     <OR ,SOUND-QUEUED?
			 ,LOOPING?>>
		<RTRUE>)>
	 <COND ;(<EQUAL? .N ,S-ARMOR>	;"other 'default' settings"
		<SET NUM 2>)
	       (<==? .N ,S-CROWD>	;"fine tuning volumes"
		<SET VOL 6>)
	       (<==? .N ,S-BADVIOL>
		<SET VOL 6>)>
	 <COND (<EQUAL? .N ,S-CROWD ,S-BOATING ,S-SNORE>  ;"looping sounds"
		<COND (<==? .OP ,S-START>
		       <SETG LOOPING? .N>
		       <SETG LOOP-VOL .VOL> 
		       ;<PUT ,SOUND-FLAG 1 <+ <* .N 16> .VOL>>
		       <SET NUM -1>)
		      (<==? .OP ,S-STOP>
		       <SETG LOOPING? 0>)>
		<COND (,SOUND-QUEUED?
		       <RTRUE>)>)
	       (T
		<COND (<F? .RTN>
		       <SET RTN ,CHECK-LOOPING>)>)>
	 <COND (,SOUND-ON?
		;<PUT ,SOUND-FLAG 0 1>
		;<PUT ,SOUND-FLAG 1 0>
		<COND (<EQUAL? .OP ,S-START>
		       <COND (<N==? .N ,S-CROWD ,S-BOATING ,S-SNORE>
			      <SETG SOUND-QUEUED? .N>)>
		       <SOUND .N .OP <BOR <LSH .NUM 8> .VOL> .RTN>)
		      (T
		       <SOUND .N .OP>)>)>
	 <RTRUE>>

<ROUTINE CHECK-LOOPING ()
    <SETG SOUND-QUEUED? <>>
    <COND (<G? ,LOOPING? 0>
	   <SOUNDS ,LOOPING? ,S-START ,LOOP-VOL>)>
    <RTRUE>>

<GLOBAL CAB-RAMP 0>

;<ROUTINE RT-S-WHISTLE-TWICE ()
    <SETG CAB-RAMP 2>
    <RT-S-CAB-ARRIVES>>

<ROUTINE RT-S-CAB-ARRIVES ()
    <COND (<==? ,CAB-RAMP 0>
	   <SOUNDS ,S-HORSE ,S-START 4>)
	  (T
	   <SETG CAB-RAMP <- ,CAB-RAMP 1>>
	   <SOUNDS ,S-HORSE ,S-START <- 2 ,CAB-RAMP> 1 RT-S-CAB-ARRIVES>)>>

<ROUTINE RT-S-CAB-LEAVES ()
    <COND (<OR <F? ,SOUND-QUEUED?>
	       <==? ,SOUND-QUEUED? ,S-HORSE>>
	   <SETG CAB-RAMP 2>
	   <RT-S-CAB-GOES>)>>

<ROUTINE RT-S-CAB-GOES ()
    <COND (<==? ,CAB-RAMP 0>
	   <SOUNDS ,S-HORSE ,S-START 1>)
	  (T
	   <SETG CAB-RAMP <- ,CAB-RAMP 1>>
	   <SOUNDS ,S-HORSE ,S-START <* <+ ,CAB-RAMP 1> 2> 1 RT-S-CAB-GOES>)>> 

<ROUTINE END-FANFARE ()
	 <SETG SOUND-QUEUED? <>>
	 <KILL-SOUNDS>>

<ROUTINE KILL-SOUNDS ()
	 <COND (<N==? ,SOUND-QUEUED? ,S-FANFARE>
		<SETG SOUND-QUEUED? <>>
		<SOUNDS 0 ,S-STOP>
		;<SOUNDS 0 ,S-CLEANUP>)>
	 <RTRUE>>

<SYNTAX $SOUND = V-$SOUND>

<ROUTINE V-$SOUND ()
	;<SET X <GET ,SOUND-FLAG 1>>
	;<SET Y <GET ,SOUND-FLAG 0>>
	<COND (<L? ,LOOPING? 0>
	       <SETG LOOPING? 0>)>
	<TELL "Sound ">
	<COND (,SOUND-ON?
	       <SETG SOUND-QUEUED? <>>
	       <KILL-SOUNDS>
	       <SETG SOUND-ON? <>>
	       ;<COND (<N==? .Y 1> <PUT ,SOUND-FLAG 1 .Y>)
		     (ELSE <PUT ,SOUND-FLAG 1 0>)>
	       <TELL "off." CR>)
	      (T
	       <TELL "on." CR>
	       <SETG SOUND-ON? T>
	       <CHECK-LOOPING>)>>

;"sound operations"
<CONSTANT S-INIT 1>
<CONSTANT S-START 2>
<CONSTANT S-STOP 3>
<CONSTANT S-CLEANUP 4>

;"sound ids		(sounds marked with a * are looping sounds)"
<CONSTANT S-BEEP 1>
<CONSTANT S-BOOP 2>
<CONSTANT S-ARMOR 3>	;"33K armor squeaking - worn, removed, moving"
<CONSTANT S-BADVIOL 4>	;"39K Watson playing violin"
<CONSTANT S-BARK 5>	;" 7K dog barking"
<CONSTANT S-BOATING 6>	;"54K * background water sounds (while in boat)"
<CONSTANT S-CLOCK 7>	;"47K Big Ben striking close up (long ring)"
<CONSTANT S-CROWD 8>	;"61K * crowd noises"
<CONSTANT S-FANFARE 9>	;"57K trumpets for ending"
<CONSTANT S-GROWL 10>	;"51K dog growling"
<CONSTANT S-HEART1 11>	;"14K slow heartbeat" ;"3 hearts share same sound code"
<CONSTANT S-HEART2 12>	;"14K medium heartbeat"
<CONSTANT S-HEART3 13>	;"14K fast heartbeat"
<CONSTANT S-HORSE 14>	;"40K sounds of cab moving"
<CONSTANT S-VIOLIN 15>	;"48K Holmes playing violin"
<CONSTANT S-SNORE 16>	;"50K * snoring in Diogenes club" 
<CONSTANT S-FARBEN 17>  ;"    Big Ben at a distance (short ring)"
;<CONSTANT S-WHISTLE 18> ;"  K Whistle for calling cabs"

;"unused sounds - S-SPLASH S-BIRDIE"
;"WANTED - S-WHISTLE"

> ;"end of REPLACE-DEFINITION SOUND-CODE"


;"Sound code from other files"

"VERBS"

<ROUTINE V-SAVE ("AUX" X WHO)
	<SET WHO <RT-WHO-SAYS?>>
	<COND (<EQUAL? .WHO ,CH-HOLMES>
	       <TELL
CTHE ,CH-HOLMES " nods in approval and says, \"A wise move, Watson. These are
dangerous times.\"" CR CR>)
	      (<EQUAL? .WHO ,CH-WIGGINS>
	       <TELL
CTHE ,CH-WIGGINS " glances around in alarm and says, \"Do you know somefing I
don't know?\"" CR CR>)>
	<COND (<MC-T? ,GL-DEBUG-FLAG>
	       <V-REFRESH>)>
	<SETG GL-SCORE-STS  -1>
	<SETG GL-MOVES-STS  -1>
	<SETG GL-PLACE-STS  -1>
	<RT-P-CLEAR>
	<PUTB ,GL-OOPS-INBUF 1 0>
	<IFSOUND <SETG SOUND-QUEUED? <>>
		 <KILL-SOUNDS>>
	<SET X <SAVE>>
	<IFSOUND <COND (,SOUND-ON?
			<CHECK-LOOPING>)>>
	<RT-UPDATE-STATUS-LINE>
	<COND (<ZERO? .X>
	       <TELL "Save failed." CR>
	       <RFATAL>)
	      (<EQUAL? .X 1>
	       <TELL "Save completed." CR>
	       <RFATAL>)
	      (T
	       ;<V-REFRESH>
	       <TELL "Restore completed." CR CR>
	       <SET WHO <RT-WHO-SAYS?>>
	       <COND (<EQUAL? .WHO ,CH-HOLMES>
		      <TELL
CTHE ,CH-HOLMES " looks up and says impatiently, \"Where have you been,
Watson? We have work to do.\"" CR CR>)
		     (<EQUAL? .WHO ,CH-WIGGINS>
		      <TELL
CTHE ,CH-WIGGINS " jumps nervously and then says, \"Crikey! You scared me.
Don't sneak up on people that way.\"" CR CR>)>
	       <RT-DESC-ALL <> T>
	       <RFATAL>)>>

<ROUTINE V-RESTORE ()
	<IFSOUND ;<SET X <GET ,SOUND-FLAG 0>>
	         <SETG SOUND-QUEUED? <>>
		 <KILL-SOUNDS>>
	<COND (<MC-T? ,GL-DEBUG-FLAG>
	       <V-REFRESH>)>
	<RT-P-CLEAR>
	<PUTB ,GL-OOPS-INBUF 1 0>
	<RESTORE>
	<COND (<BTST <LOWCORE FLAGS> 4>
	       <RT-INIT-SCREEN T>
	       <RT-UPDATE-STATUS-LINE>
	       <LOWCORE FLAGS <BAND <LOWCORE FLAGS> -5>>)>
	<TELL "Restore failed." CR>
	<IFSOUND <COND (,SOUND-ON?
			<CHECK-LOOPING>)>>
	;<IFSOUND <COND (<G? .X 1>
			<SOUNDS </ .X 16> ,S-START <MOD .X 16>>)>>
	<RFATAL>>

<ROUTINE V-RESTART ()
	<TELL "Are you sure you want to restart?">
	<COND (<RT-GET-YES-NO?>
	       <IFSOUND <KILL-SOUNDS>>
	       <RESTART>
	       ;<TELL "Restart failed." CR>  ;"RESTART never returns"
	       ;<RFATAL>)
	      (T
	       <TELL CR "Continuing." CR>
	       <RFATAL>)>>

<ROUTINE RT-QSR ("AUX" KEY)
	<IFSOUND <KILL-SOUNDS>>
	<TELL "The game is no longer afoot." CR CR>
	<REPEAT ()
		<TELL "Do you wish to: (1) Quit, (2) Restart, (3) Restore, (4) Hints">
		<COND (<MC-T? ,GL-CAN-UNDO>
		       <TELL ", (5) Undo">)>
		<TELL " ?" CR>
		<SET KEY <INPUT 1>>
		<COND (<EQUAL? .KEY 49>
		       <QUIT>
		       <TELL "Quit failed." CR>)
		      (<EQUAL? .KEY 50>
		       <RESTART>
		       <TELL "Restart failed." CR>)
		      (<EQUAL? .KEY 51>
		       <COND (<MC-T? ,GL-DEBUG-FLAG>
			      <V-REFRESH>)>
		       <RT-P-CLEAR>
		       <PUTB ,GL-OOPS-INBUF 1 0>
		       <RESTORE>
		       <TELL "Restore failed." CR>)
		      (<EQUAL? .KEY 52>
		       <V-HINT>
		       <V-REFRESH>
		       <AGAIN>)
		      (<AND <EQUAL? .KEY 53>
			    <MC-T? ,GL-CAN-UNDO>>
		       <V-UNDO>)>>>

<ROUTINE V-UNDO ()
	<IFSOUND ;<SET X <GET ,SOUND-FLAG 0>>
	         <SETG SOUND-QUEUED? <>>
		 <KILL-SOUNDS>>
	<SETG GL-PLACE-STS 0>
	<COND (<ZERO? <IRESTORE>>
	       <TELL "[UNDO failed.]" CR>)
	      (T
	       <TELL "[UNDO is not available.]" CR>)>
	<IFSOUND <COND (,SOUND-ON?
			<CHECK-LOOPING>)>>
	;<IFSOUND <COND (<G? .X 1>
			<SOUNDS </ .X 16> ,S-START <MOD .X 16>>)>>>


"NEAR ISAVE IN PARSER"

<COND (<EQUAL? <GET ,GL-P-P-LEX .PTR> ,W?UNDO>
	 <V-UNDO>
	 <RFALSE>)
	(T
	 <SETG GL-CAN-UNDO <ISAVE>>
	 <COND (<EQUAL? ,GL-CAN-UNDO 2>
		<V-REFRESH>
		<IFSOUND <SETG SOUND-QUEUED? <>>
			 <COND (,SOUND-ON?
				<CHECK-LOOPING>)>>
		<TELL "[UNDO completed.]" CR>
		<AGAIN>)>)>


"FROM HINTS"

<ROUTINE V-HINT ("AUX" CHR MAXC (C <>) Q (WHO <>))
  <COND (,GL-HINTS-OFF
	 <RT-PERFORM ,V?HINTS-NO ,ROOMS>
	 <RFATAL>)
	(<NOT ,GL-HINT-WARNING>
	 <SETG GL-HINT-WARNING T>
	 <TELL
"[Warning: It is recognized that the temptation for help may at times be so
exceedingly strong that you might fetch hints prematurely. Therefore, you may
at any time during the story type HINTS OFF, and this will disallow the
seeking out of help for the present session of the story. If you still want a
hint now, indicate HINT.]" CR>
	 <RFATAL>)
	(<NOT .WHO>
	 <SET WHO <RT-WHO-SAYS?>>
	 <COND (<EQUAL? .WHO ,CH-HOLMES ,CH-WIGGINS>
		<COND (<EQUAL? .WHO ,CH-HOLMES>
		       <TELL
"Holmes looks at you impatiently and sighs, \"Very well, Watson. If you
must.\"">)
		      (T
		       <TELL
"Wiggins looks up at you with relief and says, \"Good idea, guv. We'll never
work this out on our own.\"">)>
		<TELL CR CR "[Press any key to continue.]" CR>
		<INPUT 1>)>)>
  <IFSOUND ;<SET X <GET ,SOUND-FLAG 0>>
	   <SETG SOUND-QUEUED? <>>
	   <KILL-SOUNDS>>
  ;<BUFOUT <>>
  <SET MAXC <GET ,K-HINTS 0>>
  <RT-INIT-HINT-SCREEN>
  <CURSET 5 1>
  <RT-PUT-UP-CHAPTERS>
  <SETG GL-CUR-POS <- ,GL-CHAPT-NUM 1>>
  <RT-NEW-CURSOR>
  <REPEAT ()
	  <SET CHR <INPUT 1>>
	  <COND (<EQUAL? .CHR !\Q !\q>
		 <SET Q T>
		 <RETURN>)
		(<EQUAL? .CHR !\N !\n>
		 <RT-ERASE-CURSOR>
		 <COND (<EQUAL? ,GL-CHAPT-NUM .MAXC>
			<SETG GL-CUR-POS 0>
			<SETG GL-CHAPT-NUM 1>
			<SETG GL-QUEST-NUM 1>)
		       (T
			<SETG GL-CUR-POS <+ ,GL-CUR-POS 1>>
			<SETG GL-CHAPT-NUM <+ ,GL-CHAPT-NUM 1>>
			<SETG GL-QUEST-NUM 1>)>
		 <RT-NEW-CURSOR>)
		(<EQUAL? .CHR !\P !\p>
		 <RT-ERASE-CURSOR>
		 <COND (<EQUAL? ,GL-CHAPT-NUM 1>
			<SETG GL-CHAPT-NUM .MAXC>
			<SETG GL-CUR-POS <- .MAXC 1>>)
		       (T
			<SETG GL-CUR-POS <- ,GL-CUR-POS 1>>
			<SETG GL-CHAPT-NUM <- ,GL-CHAPT-NUM 1>>)>
		 <SETG GL-QUEST-NUM 1>
		 <RT-NEW-CURSOR>)
		(<EQUAL? .CHR 13 10>
		 <RT-PICK-QUESTION>
		 <RETURN>)>>
  <COND (<NOT .Q>
	 <AGAIN>	;"AGAIN does whole routine?")>
  <CLEAR -1>
  <V-REFRESH>
  <SET WHO <RT-WHO-SAYS?>>
  <COND (<EQUAL? .WHO ,CH-HOLMES>
	 <TELL CR
"Holmes barely glances at you and snaps, \"At last. Now may we proceed?\"" CR>)
	(<EQUAL? .WHO ,CH-WIGGINS>
	 <TELL CR
"Wiggins tugs your sleeve and asks hopefully, \"Learn anything?\"" CR>)
	(T
	 <TELL CR "Back to the story..." CR>)>
  <IFSOUND <COND (,SOUND-ON?
		  <CHECK-LOOPING>)>>
  ;<IFSOUND <COND (<G? .X 1>
		  <SOUNDS </ .X 16> ,S-START <MOD .X 16>>)>>
  <RFATAL>>


"DEFAULT code - BEGINNING OF VERBS FILE"

<DEFAULTS-DEFINED SOUND-CODE>

<DEFAULT-DEFINITION SOUND-CODE T>


"for sound version LOAD FILE"

<DEFMAC IFSOUND ("ARGS" X)
	<COND (<LENGTH? .X 1> <1 .X>)
	      (T <CHTYPE (!.X) SPLICE>)>>

<ZIP-OPTIONS SOUND UNDO>	; "Set SOUND bit in ZIP-OPTIONS"


"for non-sound version load file - don't set Sound bit in Zip-options"

<DEFMAC IFSOUND ("ARGS" X) T>

<REPLACE-DEFINITION SOUND-CODE T>


