]> github.com/historicalsource and other repositories - sherlock.git/commitdiff
Release Version
authorhistoricalsource <historicalsoftware@textfiles.com>
Tue, 16 Apr 2019 13:16:28 +0000 (09:16 -0400)
committerhistoricalsource <historicalsoftware@textfiles.com>
Tue, 16 Apr 2019 13:16:28 +0000 (09:16 -0400)
120 files changed:
README.md [new file with mode: 0644]
armor [new file with mode: 0644]
badv.was-mid [new file with mode: 0644]
badvio [new file with mode: 0644]
bank.zabstr [new file with mode: 0644]
bank.zap [new file with mode: 0644]
bank.zil [new file with mode: 0644]
bark.bin [new file with mode: 0644]
ben2 [new file with mode: 0644]
benclk [new file with mode: 0644]
benclk-ss1 [new file with mode: 0644]
boot.zabstr [new file with mode: 0644]
boot.zap [new file with mode: 0644]
boot.zil [new file with mode: 0644]
cab.zabstr [new file with mode: 0644]
cab.zap [new file with mode: 0644]
cab.zil [new file with mode: 0644]
charles.zabstr [new file with mode: 0644]
charles.zap [new file with mode: 0644]
charles.zil [new file with mode: 0644]
clk.was-mid [new file with mode: 0644]
constants.zil [new file with mode: 0644]
crowd-ss1 [new file with mode: 0644]
crowd.was-mid [new file with mode: 0644]
crowd1 [new file with mode: 0644]
eliza.zabstr [new file with mode: 0644]
eliza.zap [new file with mode: 0644]
eliza.zil [new file with mode: 0644]
fan.was-mid [new file with mode: 0644]
fanfare.bin [new file with mode: 0644]
gamesound.chart [new file with mode: 0644]
gamesound.errors [new file with mode: 0644]
gamesound.lowcore [new file with mode: 0644]
gamesound.record [new file with mode: 0644]
gamesound.serial [new file with mode: 0644]
gamesound.zap [new file with mode: 0644]
gamesound.zil [new file with mode: 0644]
gamesound.zip [new file with mode: 0644]
gamesounddat.zap [new file with mode: 0644]
gamesoundfreq.zap [new file with mode: 0644]
gamesoundglobals.dat [new file with mode: 0644]
gamesoundpur.zap [new file with mode: 0644]
gamesoundstr.zap [new file with mode: 0644]
generic.zabstr [new file with mode: 0644]
generic.zap [new file with mode: 0644]
generic.zil [new file with mode: 0644]
growl [new file with mode: 0644]
growl-ss1 [new file with mode: 0644]
growl.was-mid [new file with mode: 0644]
heart [new file with mode: 0644]
heart-ss1 [new file with mode: 0644]
heart1.was-mid [new file with mode: 0644]
heart3.was-mid [new file with mode: 0644]
hints.zabstr [new file with mode: 0644]
hints.zap [new file with mode: 0644]
hints.zil [new file with mode: 0644]
horse [new file with mode: 0644]
horse-ss1 [new file with mode: 0644]
horse.was-mid [new file with mode: 0644]
locals.zabstr [new file with mode: 0644]
locals.zap [new file with mode: 0644]
locals.zil [new file with mode: 0644]
macros.zil [new file with mode: 0644]
misc.zil [new file with mode: 0644]
other-misc.zap [new file with mode: 0644]
other-misc.zil [new file with mode: 0644]
parser.zabstr [new file with mode: 0644]
parser.zap [new file with mode: 0644]
parser.zil [new file with mode: 0644]
people.zabstr [new file with mode: 0644]
people.zap [new file with mode: 0644]
people.zil [new file with mode: 0644]
places1.zil [new file with mode: 0644]
places2.zabstr [new file with mode: 0644]
places2.zap [new file with mode: 0644]
places2.zil [new file with mode: 0644]
places3.zabstr [new file with mode: 0644]
places3.zap [new file with mode: 0644]
places3.zil [new file with mode: 0644]
puzzles.zabstr [new file with mode: 0644]
puzzles.zap [new file with mode: 0644]
puzzles.zil [new file with mode: 0644]
s10.nam [new file with mode: 0644]
s11.nam [new file with mode: 0644]
s12.nam [new file with mode: 0644]
s13.nam [new file with mode: 0644]
s14.nam [new file with mode: 0644]
s15.nam [new file with mode: 0644]
s16.nam [new file with mode: 0644]
s17.nam [new file with mode: 0644]
s3.nam [new file with mode: 0644]
s4.nam [new file with mode: 0644]
s5.nam [new file with mode: 0644]
s6.nam [new file with mode: 0644]
s7.nam [new file with mode: 0644]
s8.nam [new file with mode: 0644]
s9.nam [new file with mode: 0644]
sched.zabstr [new file with mode: 0644]
sched.zap [new file with mode: 0644]
sched.zil [new file with mode: 0644]
scope.zabstr [new file with mode: 0644]
scope.zap [new file with mode: 0644]
scope.zil [new file with mode: 0644]
snore.bin [new file with mode: 0644]
sounds.zil [new file with mode: 0644]
splash [new file with mode: 0644]
syntax.zil [new file with mode: 0644]
things1.zabstr [new file with mode: 0644]
things1.zap [new file with mode: 0644]
things1.zil [new file with mode: 0644]
things2.zabstr [new file with mode: 0644]
things2.zap [new file with mode: 0644]
things2.zil [new file with mode: 0644]
tower.zabstr [new file with mode: 0644]
tower.zap [new file with mode: 0644]
tower.zil [new file with mode: 0644]
verbs.zabstr [new file with mode: 0644]
verbs.zap [new file with mode: 0644]
verbs.zil [new file with mode: 0644]
violin.bin [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..2336f69
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# sherlock
diff --git a/armor b/armor
new file mode 100644 (file)
index 0000000..b325a2e
Binary files /dev/null and b/armor differ
diff --git a/badv.was-mid b/badv.was-mid
new file mode 100644 (file)
index 0000000..496adbf
Binary files /dev/null and b/badv.was-mid differ
diff --git a/badvio b/badvio
new file mode 100644 (file)
index 0000000..5ec5b20
Binary files /dev/null and b/badvio differ
diff --git a/bank.zabstr b/bank.zabstr
new file mode 100644 (file)
index 0000000..bfbce22
--- /dev/null
@@ -0,0 +1,43 @@
+
+<CONSTANT K-GEM-BOX-NUM 600> 
+<DEFINE-ROUTINE RT-KIDNAP> 
+<DEFINE-ROUTINE RT-WIGGINS-HELP-MSG> 
+<GLOBAL BOX-KEY-COLD? <> %<> WORD> 
+<DEFINE-ROUTINE RT-STEAL-KEY> 
+<OBJECT TH-INTNUM (LOC GLOBAL-OBJECTS) (DESC "number") (FLAGS FL-NODESC FL-SEEN
+) (SYNONYM INTNUM NUMBER) (GENERIC RT-GN-INTNUM) (ACTION RT-AC-TH-INTNUM)> 
+<OBJECT TH-SAFETY-DEPOSIT-BOX (LOC RM-BANK-VAULT) (DESC "safety deposit box") (
+FLAGS FL-NODESC FL-CONTAINER FL-OPENABLE FL-LOCKED FL-HAS-DESCFCN) (SYNONYM
+INTNUM BOX) (ADJECTIVE SAFETY DEPOSIT BOX NUMBER) (SIZE 0 CAPACITY 10) (GENERIC
+RT-GN-INTNUM) (ACTION RT-AC-TH-SAFETY-DEPOSIT-BOX)> 
+<OBJECT TH-RING (LOC LOCAL-GLOBALS) (DESC "ring") (FLAGS FL-TAKEABLE FL-NOALL
+FL-CLOTHING) (SYNONYM RING) (ADJECTIVE SIGNET) (VALUE 1) (SIZE 1 MASS 1) (
+ACTION RT-AC-TH-RING)> 
+<OBJECT TH-SHILLING (DESC "shilling") (FLAGS FL-TAKEABLE FL-MONEY) (SYNONYM
+SHILLING COIN) (VALUE 0) (SIZE 1 MASS 1)> 
+<OBJECT TH-BOX-KEY (LOC TH-GUARDS-POCKET) (DESC "key") (FLAGS FL-TAKEABLE
+FL-HAS-DESCFCN) (SYNONYM KEY) (ADJECTIVE MASTER) (SIZE 1) (VALUE 1) (ACTION
+RT-AC-TH-BOX-KEY)> 
+<OBJECT TH-BOX-LOCK (LOC RM-BANK-VAULT) (DESC "lock") (FLAGS FL-NODESC
+FL-CONTAINER FL-OPENED) (SYNONYM INTNUM) (ADJECTIVE LOCK NUMBER) (GENERIC
+RT-GN-INTNUM) (ACTION RT-AC-TH-BOX-LOCK)> 
+<OBJECT TH-BOXES (LOC RM-BANK-VAULT) (DESC "safety deposit boxes") (FLAGS
+FL-NODESC FL-PLURAL FL-OPENABLE FL-CONTAINER FL-HAS-DESCFCN) (SYNONYM BOXES) (
+ADJECTIVE SAFETY DEPOSIT) (ACTION RT-AC-TH-BOXES)> 
+<OBJECT TH-GUARDS-POCKET (LOC CH-BANK-GUARD) (DESC "guard's pocket") (FLAGS
+FL-NODESC FL-CONTAINER FL-OPENED FL-TRYTAKE) (SYNONYM POCKET) (ADJECTIVE HIS
+GUARD\'S) (SIZE 0 CAPACITY 10) (ACTION RT-AC-TH-GUARDS-POCKET)> 
+<DEFINE-ROUTINE RT-AC-TH-INTNUM> 
+<DEFINE-ROUTINE RT-AC-TH-RING> 
+<DEFINE-ROUTINE RT-AC-TH-BOX-KEY> 
+<DEFINE-ROUTINE RT-AC-TH-BOX-LOCK> 
+<DEFINE-ROUTINE RT-AC-TH-SAFETY-DEPOSIT-BOX> 
+<DEFINE-ROUTINE RT-AC-TH-DIAL> 
+<DEFINE-ROUTINE RT-AC-TH-BOXES> 
+<DEFINE-ROUTINE RT-AC-TH-GUARDS-POCKET> 
+<DEFINE-ROUTINE RT-AC-CH-BANK-GUARD> 
+<GLOBAL WIGGINS-COLD? <> %<> WORD> 
+<DEFINE-ROUTINE RT-AC-CH-WIGGINS> 
+<DEFINE-ROUTINE RT-AC-CH-BUTLER> 
+<DEFINE-ROUTINE RT-AC-LG-BANK-VAULT-DOOR> 
+<DEFINE-ROUTINE RT-TOPAZ-MSG> 
\ No newline at end of file
diff --git a/bank.zap b/bank.zap
new file mode 100644 (file)
index 0000000..5c6a320
--- /dev/null
+++ b/bank.zap
@@ -0,0 +1,887 @@
+
+
+       .FUNCT  RT-KIDNAP
+       MOVE    CH-HOLMES,RM-LAIR
+       MOVE    TH-ROPE,CH-HOLMES
+       FSET    CH-HOLMES,FL-LOCKED
+       SET     'TH-ROPE-AUX1,CH-HOLMES
+       BAND    MYCROFT-STATE,-2 >MYCROFT-STATE
+       SET     'GL-PUPPY,FALSE-VALUE
+       CRLF    
+       PRINTI  "Suddenly, someone grabs you from behind, pins your arms to your sides, and covers up your head. You struggle fiercely to get loose, but to no avail. Then you hear a voice shout, ""Let him go, we've got the other one."""
+       CRLF    
+       CRLF    
+       PRINTI  "The person holding you knocks you on the head and flings you to the ground. You lose consciousness for a few moments, and when you awake, you are alone."
+       CRLF    
+       CRLF    
+       PRINTR  "Sherlock Holmes has been kidnapped."
+
+
+       .FUNCT  RT-WIGGINS-HELP-MSG
+       ICALL2  RT-CTHEO-PRINT,CH-WIGGINS
+       PRINTI  " says, ""I saw it all, guv'nor. But it was over before I could lift a finger. Mr 'Olmes was a friend to me, 'e was. And I'd do anyfing to 'elp you get 'im back."""
+       CRLF    
+       SET     'GL-PUPPY,CH-WIGGINS
+       FCLEAR  CH-WIGGINS,FL-NODESC
+       FCLEAR  CH-WIGGINS,FL-BROKEN
+       SET     'GL-PUPPY-MSG?,FALSE-VALUE
+       RETURN  GL-PUPPY-MSG?
+
+
+       .FUNCT  RT-STEAL-KEY
+       ZERO?   BOX-KEY-COLD? \?CCL3
+       SET     'BOX-KEY-COLD?,TRUE-VALUE
+       MOVE    TH-BOX-KEY,CH-PLAYER
+       ICALL2  RT-CTHEO-PRINT,CH-WIGGINS
+       PRINTI  " casually strolls past the guard and says, ""Cor blimey. That bird isn't 'alf built, is she?"" While the guard's attention is diverted, Wiggins's hand flashes in and out of his pocket. Then just as casually as before, he strolls back to you, slips something into your hand, and whispers, ""Sorry I couldn't get everything, guv. I 'ope this is enough."""
+       CRLF    
+       GETP    TH-BOX-KEY,P?VALUE
+       ICALL2  RT-UPDATE-SCORE,STACK
+       PUTP    TH-BOX-KEY,P?VALUE,0
+       RTRUE   
+?CCL3: PRINTR  """Sorry, guv. 'E'll never go for it twice."""
+
+
+       .FUNCT  RT-AC-TH-INTNUM,CONTEXT
+       EQUAL?  GL-PRSA,V?WAIT-FOR,V?WAIT,V?VERIFY /FALSE
+       EQUAL?  GL-PRSA,V?SHOOT \?CCL5
+       ICALL1  RT-IMPOSSIBLE-MSG
+       RTRUE   
+?CCL5: EQUAL?  GL-PLACE-CUR,RM-BANK-VAULT /FALSE
+       EQUAL?  GL-P-NUMBER,-1 \?CCL10
+       ICALL   RT-CYOU-MSG,STR?655,STR?656
+       PRINTR  "not see that here."
+?CCL10:        ICALL   RT-CYOU-MSG,STR?655,STR?656
+       PRINTR  "not need to use a number here."
+
+
+       .FUNCT  RT-AC-TH-RING,CONTEXT
+       ZERO?   GL-NOW-PRSI? \FALSE
+       ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?WEAR \FALSE
+       PRINTR  "It's the wrong size."
+
+
+       .FUNCT  RT-AC-TH-BOX-KEY,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       IN?     TH-BOX-KEY,TH-GUARDS-POCKET /?CTR5
+       IN?     TH-BOX-KEY,CH-BANK-GUARD \?CCL6
+?CTR5: ICALL1  RT-CYOU-MSG
+       PRINTR  "can't see it. The guard has it."
+?CCL6: ICALL2  RT-CTHEO-PRINT,TH-BOX-KEY
+       PRINTR  " has the word ""Master"" written on it."
+?CCL3: ZERO?   GL-NOW-PRSI? \FALSE
+       ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?TURN \?CCL15
+       IN?     TH-BOX-KEY,TH-BOX-LOCK \FALSE
+       EQUAL?  TH-BOX-KEY-AUX1,K-GEM-BOX-NUM \?CCL21
+       FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED \?CCL24
+       PRINTR  "The box is already open."
+?CCL24:        SET     'TH-SAFETY-DEPOSIT-BOX-AUX1,TH-BOX-KEY-AUX1
+       ICALL   RT-CYOU-MSG,STR?227,STR?707
+       PRINTI  "the box with the key."
+       FIRST?  TH-SAFETY-DEPOSIT-BOX \?CND25
+       PRINTI  " Inside you see "
+       ICALL2  RT-PRINT-CONTENTS-2,TH-SAFETY-DEPOSIT-BOX
+       PRINTC  46
+?CND25:        FSET    TH-SAFETY-DEPOSIT-BOX,FL-OPENED
+       FCLEAR  TH-SAFETY-DEPOSIT-BOX,FL-LOCKED
+       CRLF    
+       RTRUE   
+?CCL21:        ICALL   RT-CYOU-MSG,STR?227,STR?707
+       PRINT   K-NOTHING-INSIDE-MSG
+       ICALL   RT-YOU-MSG,STR?808,STR?809
+       PRINTR  "it back up again."
+?CCL15:        EQUAL?  GL-PRSA,V?READ \FALSE
+       IN?     TH-BOX-KEY,TH-GUARDS-POCKET /?CTR30
+       IN?     TH-BOX-KEY,CH-BANK-GUARD \?CCL31
+?CTR30:        ICALL1  RT-CYOU-MSG
+       PRINTR  "can't see it. The guard has it."
+?CCL31:        PRINTR  "It says, Master."""
+
+
+       .FUNCT  RT-AC-TH-BOX-LOCK,CONTEXT,NUM
+       EQUAL?  GL-P-NUMBER,-1 \?CCL3
+       ZERO?   TH-BOX-LOCK-AUX1 \?CND1
+       PRINT   K-SPECIFY-MSG
+       PRINTR  "lock by number."
+?CCL3: LESS?   GL-P-NUMBER,1 /?CTR6
+       GRTR?   GL-P-NUMBER,999 \?CCL7
+?CTR6: PRINTI  "There is no lock number "
+       PRINTN  GL-P-NUMBER
+       PRINTR  "."
+?CCL7: SET     'TH-BOX-LOCK-AUX1,GL-P-NUMBER
+?CND1: SET     'NUM,TH-BOX-LOCK-AUX1
+       ZERO?   GL-NOW-PRSI? /?CCL12
+       EQUAL?  GL-PRSA,V?PUT \?CCL15
+       EQUAL?  GL-PRSO,TH-BOX-KEY \?CCL18
+       MOVE    TH-BOX-KEY,TH-BOX-LOCK
+       SET     'TH-BOX-KEY-AUX1,TH-BOX-LOCK-AUX1
+       PRINTR  "The key fits nicely."
+?CCL18:        CALL1   RT-CANT-PUT-IN-ON-MSG
+       RSTACK  
+?CCL15:        EQUAL?  GL-PRSA,V?TAKE \FALSE
+       EQUAL?  GL-PRSO,TH-BOX-KEY \FALSE
+       IN?     TH-BOX-KEY,TH-BOX-LOCK \FALSE
+       MOVE    TH-BOX-KEY,GL-WINNER
+       SET     'TH-BOX-KEY-AUX1,0
+       PRINTR  "The key comes out smoothly."
+?CCL12:        ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       PRINT   K-RICOCHET-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-SAFETY-DEPOSIT-BOX,CONTEXT,NUM
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       SET     'NUM,TH-SAFETY-DEPOSIT-BOX-AUX1
+       PRINTR  "It looks the same as all the other boxes."
+?CCL3: EQUAL?  GL-P-NUMBER,-1 \?CCL5
+       ZERO?   TH-SAFETY-DEPOSIT-BOX-AUX1 \?CCL8
+       PRINT   K-SPECIFY-MSG
+       PRINTR  "box by number."
+?CCL8: FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED \?CND1
+       SET     'TH-SAFETY-DEPOSIT-BOX-AUX1,600
+       JUMP    ?CND1
+?CCL5: LESS?   GL-P-NUMBER,1 /?CTR10
+       GRTR?   GL-P-NUMBER,999 \?CCL11
+?CTR10:        PRINTI  "There is no box number "
+       PRINTN  GL-P-NUMBER
+       PRINTR  "."
+?CCL11:        SET     'TH-SAFETY-DEPOSIT-BOX-AUX1,GL-P-NUMBER
+?CND1: SET     'NUM,TH-SAFETY-DEPOSIT-BOX-AUX1
+       ZERO?   GL-NOW-PRSI? /?CCL16
+       EQUAL?  GL-PRSA,V?TAKE,V?PUT,V?FILL /?CCL19
+       EQUAL?  GL-PRSA,V?EMPTY-INTO,V?POUR-FROM \FALSE
+?CCL19:        EQUAL?  NUM,K-GEM-BOX-NUM \?CCL24
+       FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED /FALSE
+?CCL24:        ICALL1  RT-CTHEI-PRINT
+       PRINTR  " is closed."
+?CCL16:        ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?UNLOCK,V?OPEN,V?OPEN-WITH \?CCL31
+       EQUAL?  GL-PRSI,FALSE-VALUE,TH-BOX-KEY /?CCL34
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "can't "
+       PRINTB  GL-P-PRSA-WORD
+       PRINTC  32
+       ICALL1  RT-THEO-PRINT
+       PRINTI  " with "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+?CCL34:        IN?     TH-BOX-KEY,GL-WINNER /?CCL36
+       EQUAL?  NUM,TH-BOX-KEY-AUX1 /?CCL36
+       ICALL   RT-CYOU-MSG,STR?655,STR?656
+       PRINTR  "not have the key."
+?CCL36:        EQUAL?  NUM,K-GEM-BOX-NUM \?CCL40
+       FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED \?CCL43
+       PRINTR  "It is already open."
+?CCL43:        ICALL   RT-CYOU-MSG,STR?227,STR?707
+       PRINTI  "the box with the key."
+       FIRST?  TH-SAFETY-DEPOSIT-BOX \?CND44
+       PRINTI  " Inside you see "
+       ICALL2  RT-PRINT-CONTENTS-2,TH-SAFETY-DEPOSIT-BOX
+       PRINTC  46
+?CND44:        FSET    TH-SAFETY-DEPOSIT-BOX,FL-OPENED
+       FCLEAR  TH-SAFETY-DEPOSIT-BOX,FL-LOCKED
+       CRLF    
+       RTRUE   
+?CCL40:        ICALL   RT-CYOU-MSG,STR?227,STR?707
+       PRINT   K-NOTHING-INSIDE-MSG
+       ICALL   RT-YOU-MSG,STR?808,STR?809
+       PRINTR  "it back up again."
+?CCL31:        EQUAL?  GL-PRSA,V?LOCK,V?CLOSE \?CCL47
+       EQUAL?  NUM,K-GEM-BOX-NUM \?CCL50
+       IN?     TH-BOX-KEY,GL-WINNER /?CCL53
+       EQUAL?  NUM,TH-BOX-KEY-AUX1 /?CCL53
+       ICALL   RT-CYOU-MSG,STR?655,STR?656
+       PRINTR  "not have the key."
+?CCL53:        FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED /?CCL57
+       PRINT   K-CLOSED-AND-LOCKED-MSG
+       CRLF    
+       RTRUE   
+?CCL57:        ICALL   RT-CYOU-MSG,STR?810,STR?811
+       PRINTI  "the box with the key."
+       FCLEAR  TH-SAFETY-DEPOSIT-BOX,FL-OPENED
+       FSET    TH-SAFETY-DEPOSIT-BOX,FL-LOCKED
+       CRLF    
+       RTRUE   
+?CCL50:        PRINT   K-CLOSED-AND-LOCKED-MSG
+       CRLF    
+       RTRUE   
+?CCL47:        EQUAL?  GL-PRSA,V?READ \?CCL59
+       PRINTN  TH-SAFETY-DEPOSIT-BOX-AUX1
+       CRLF    
+       RTRUE   
+?CCL59:        EQUAL?  GL-PRSA,V?LOOK-INSIDE,V?SEARCH \?CCL61
+       EQUAL?  NUM,K-GEM-BOX-NUM \?CTR63
+       FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED /?CCL64
+?CTR63:        ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is closed."
+?CCL64:        PRINTI  "Inside "
+       ICALL1  RT-THEO-PRINT
+       ICALL   RT-YOU-MSG,STR?665,STR?666
+       ICALL2  RT-PRINT-CONTENTS-2,TH-SAFETY-DEPOSIT-BOX
+       PRINTR  "."
+?CCL61:        EQUAL?  GL-PRSA,V?EMPTY,V?REACH-IN \?CCL68
+       EQUAL?  NUM,K-GEM-BOX-NUM \?CCL71
+       FSET?   TH-SAFETY-DEPOSIT-BOX,FL-OPENED /FALSE
+?CCL71:        ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is closed."
+?CCL68:        EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       PRINT   K-RICOCHET-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-DIAL,CONTEXT,LOCK?,WHO,PTS
+       ZERO?   CONTEXT \FALSE
+       ZERO?   TH-DIAL-AUX1 \?CND1
+       SET     'TH-DIAL-AUX1,TH-RIGHT
+?CND1: ZERO?   GL-NOW-PRSI? \FALSE
+       ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?TUNE-TO \?CCL12
+       EQUAL?  GL-PRSI,FALSE-VALUE,TH-LEFT,TH-RIGHT /?CCL12
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "can't "
+       PRINTB  GL-P-PRSA-WORD
+       PRINTC  32
+       ICALL2  RT-THEO-PRINT,TH-DIAL
+       PRINTI  " to "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+?CCL12:        EQUAL?  GL-PRSA,V?TUNE-TO,V?SPIN,V?TURN \?CCL16
+       EQUAL?  GL-PRSI,FALSE-VALUE,TH-LEFT,TH-RIGHT /?CTR18
+       EQUAL?  GL-PRSI,TH-HANDS \?CCL19
+?CTR18:        FSET?   TH-STETHOSCOPE,FL-WORN /?CCL24
+       SET     'LOCK?,1
+       PRINTI  "The dial turns smoothly."
+       CRLF    
+       JUMP    ?CND22
+?CCL24:        EQUAL?  GL-LISTEN-OBJ,TH-DIAL,LG-BANK-VAULT-DOOR,RM-BANK-VAULT /?CCL26
+       SET     'LOCK?,1
+       PRINTI  "The dial turns quietly."
+       CRLF    
+       JUMP    ?CND22
+?CCL26:        FSET?   TH-COTTON-BALLS,FL-WORN \?CCL28
+       SET     'LOCK?,1
+       PRINTI  "The dial turns with a series of muffled clicks."
+       CRLF    
+       JUMP    ?CND22
+?CCL28:        FSET?   LG-BANK-VAULT-DOOR,FL-OPENED \?CCL30
+       SET     'LOCK?,2
+       PRINTI  "Clunk."
+       CRLF    
+       JUMP    ?CND22
+?CCL30:        EQUAL?  TH-DIAL-AUX1,GL-PRSI /?CCL32
+       SET     'LOCK?,1
+       PRINTI  "Clunk."
+       CRLF    
+       JUMP    ?CND22
+?CCL32:        INC     'TH-DIAL-AUX2
+?CND22:        EQUAL?  LOCK?,1 /?CND17
+       EQUAL?  TH-DIAL-AUX2,1 \?CCL37
+       SET     'TH-DIAL-AUX1,TH-RIGHT
+       PRINTI  "Whirr."
+       CRLF    
+       JUMP    ?CND17
+?CCL37:        EQUAL?  TH-DIAL-AUX2,2 \?CCL39
+       SET     'TH-DIAL-AUX1,TH-LEFT
+       PRINTI  "Click."
+       CRLF    
+       JUMP    ?CND17
+?CCL39:        EQUAL?  TH-DIAL-AUX2,3 \?CCL41
+       SET     'TH-DIAL-AUX1,TH-RIGHT
+       PRINTI  "Click."
+       CRLF    
+       JUMP    ?CND17
+?CCL41:        EQUAL?  TH-DIAL-AUX2,4 \?CCL43
+       SET     'TH-DIAL-AUX1,TH-RIGHT
+       PRINTI  "Whirr."
+       CRLF    
+       JUMP    ?CND17
+?CCL43:        EQUAL?  TH-DIAL-AUX2,5 \?CND17
+       SET     'LOCK?,2
+       PRINTI  "Click. Kerchunk. The vault door swings open."
+       CRLF    
+       CALL1   RT-WHO-SAYS? >WHO
+       EQUAL?  WHO,CH-HOLMES \?CND45
+       CRLF    
+       PRINTI  "Holmes says, ""Splendid, Watson. The net is drawing ever tighter around our quarry."""
+       CRLF    
+?CND45:        GETP    LG-BANK-VAULT-DOOR,P?VALUE >PTS
+       ZERO?   PTS /?CND17
+       ICALL2  RT-UPDATE-SCORE,PTS
+       PUTP    LG-BANK-VAULT-DOOR,P?VALUE,0
+       JUMP    ?CND17
+?CCL19:        ICALL1  RT-IMPOSSIBLE-MSG
+?CND17:        EQUAL?  LOCK?,1 \?CCL51
+       SET     'TH-DIAL-AUX1,0
+       SET     'TH-DIAL-AUX2,0
+       RTRUE   
+?CCL51:        EQUAL?  LOCK?,2 \TRUE
+       SET     'TH-DIAL-AUX1,-1
+       SET     'TH-DIAL-AUX2,-1
+       FCLEAR  LG-BANK-VAULT-DOOR,FL-LOCKED
+       FSET    LG-BANK-VAULT-DOOR,FL-OPENED
+       RTRUE   
+?CCL16:        EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       PRINT   K-RICOCHET-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-BOXES,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       PRINTR  "There are rows and rows of safety deposit boxes, all alike, numbered from 1 to 999."
+?CCL3: EQUAL?  GL-PRSA,V?UNLOCK,V?LOCK,V?OPEN /?CTR4
+       EQUAL?  GL-PRSA,V?CLOSE,V?READ \?CCL5
+?CTR4: PRINT   K-SPECIFY-MSG
+       PRINTI  "box by number."
+       CRLF    
+       RETURN  2
+?CCL5: EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       PRINT   K-RICOCHET-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-GUARDS-POCKET
+       EQUAL?  GL-PRSA,V?LOOK-INSIDE,V?EXAMINE,V?SEARCH \?CCL3
+       ICALL1  RT-CYOU-MSG
+       PRINTR  "can't see inside the guard's pocket."
+?CCL3: EQUAL?  GL-PRSA,V?PUT \?CCL5
+       ICALL1  RT-IMPOSSIBLE-MSG
+       RTRUE   
+?CCL5: EQUAL?  GL-PRSA,V?TAKE,V?EMPTY,V?REACH-IN /?CCL7
+       EQUAL?  GL-PRSA,V?STEAL \FALSE
+?CCL7: ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTR  " slaps the offending hand away and says, ""Keep your hands to yourself, mate."""
+
+
+       .FUNCT  RT-AC-CH-BANK-GUARD,CONTEXT,GEMCNT,OBJ
+       ICALL2  RT-THIS-IS-IT,CH-BANK-GUARD
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTR  " is lounging against the wall, idly jangling some keys in his pocket and waiting for girls to walk by."
+?CCL3: CALL2   RT-TELL-ABOUT?,CH-BANK-GUARD
+       ZERO?   STACK /?CCL5
+       EQUAL?  GL-PRSA,V?WHO,V?WHAT \?CCL8
+       SET     'OBJ,GL-PRSO
+       JUMP    ?CND6
+?CCL8: SET     'OBJ,GL-PRSI
+?CND6: PRINT   K-GUARD-IGNORES-MSG
+       CRLF    
+       RTRUE   
+?CCL5: CALL1   RT-WHO-WHAT-FAIL?
+       ZERO?   STACK /?CCL10
+       RETURN  2
+?CCL10:        EQUAL?  CONTEXT,K-M-WINNER \?CCL12
+       EQUAL?  GL-PRSA,V?GIVE \?CCL15
+       EQUAL?  GL-PRSO,TH-BOX-KEY,TH-GUARDS-KEYS \?CCL18
+       PRINT   K-SORRY-MATE-MSG
+       CRLF    
+       RTRUE   
+?CCL18:        EQUAL?  GL-PRSO,TH-OPAL,TH-RUBY,TH-SAPPHIRE /?CCL20
+       EQUAL?  GL-PRSO,TH-EMERALD \FALSE
+?CCL20:        PRINT   K-ILL-HOLD-IT-MSG
+       CRLF    
+       RTRUE   
+?CCL15:        PRINT   K-GUARD-IGNORES-MSG
+       CRLF    
+       RTRUE   
+?CCL12:        ZERO?   GL-NOW-PRSI? /?CCL24
+       EQUAL?  GL-PRSA,V?GIVE \?CCL27
+       EQUAL?  GL-PRSO,TH-OPAL,TH-RUBY,TH-SAPPHIRE /?CTR29
+       EQUAL?  GL-PRSO,TH-EMERALD \?CCL30
+?CTR29:        MOVE    GL-PRSO,CH-BANK-GUARD
+       FSET    GL-PRSO,FL-NOALL
+       INC     'CH-BANK-GUARD-AUX1
+       SET     'GEMCNT,CH-BANK-GUARD-AUX1
+       EQUAL?  GEMCNT,1 \?CCL35
+       PRINTR  """Now this is very nice. But I think I would need more than just one to make letting you in worth my while. I'll hold this for you until you come back."""
+?CCL35:        EQUAL?  GEMCNT,2 \?CCL37
+       PRINTR  """This is even more beautiful than the other one. But it isn't worth taking the risk for only two of them."""
+?CCL37:        EQUAL?  GEMCNT,3 \?CCL39
+       PRINTR  """One more and you're in."""
+?CCL39:        EQUAL?  GEMCNT,4 \TRUE
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTI  " looks furtively up and down the street. Then he whispers to you out of the side of his mouth, ""Good enough. Go on in."""
+       CRLF    
+       ICALL2  RT-UPDATE-SCORE,3
+       RTRUE   
+?CCL30:        EQUAL?  GL-PRSO,TH-BOX-KEY \?CCL42
+       MOVE    TH-BOX-KEY,TH-GUARDS-POCKET
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTR  " looks surprised and says, ""Ta, mate. I didn't know I dropped it. I'll have to keep it in a safer place."" He puts the key into one of his inside pockets."
+?CCL42:        EQUAL?  GL-PRSO,TH-RED-GLASS \?CCL44
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTI  " looks at it carefully and then hands it back to you, saying, ""For a moment there, I thought this was a ruby. But it's only a piece of glass."""
+       CRLF    
+       CRLF    
+       PRINT   K-MORE-VALUABLE-MSG
+       CRLF    
+       RTRUE   
+?CCL44:        ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTI  " examines what you are offering and then declines your bribe."
+       CRLF    
+       CRLF    
+       PRINT   K-MORE-VALUABLE-MSG
+       CRLF    
+       RTRUE   
+?CCL27:        EQUAL?  GL-PRSA,V?TAKE \?CCL46
+       EQUAL?  GL-PRSO,TH-OPAL,TH-RUBY,TH-SAPPHIRE /?CTR48
+       EQUAL?  GL-PRSO,TH-EMERALD \?CCL49
+?CTR48:        PRINT   K-ILL-HOLD-IT-MSG
+       CRLF    
+       RTRUE   
+?CCL49:        EQUAL?  GL-PRSO,TH-BOX-KEY,TH-GUARDS-KEYS \?CCL53
+       PRINT   K-SORRY-MATE-MSG
+       CRLF    
+       RTRUE   
+?CCL53:        EQUAL?  GL-PRSO,CH-BANK-GUARD \FALSE
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINT   K-MUST-WEIGH-MSG
+       CRLF    
+       RTRUE   
+?CCL46:        EQUAL?  GL-PRSA,V?SHOW \FALSE
+       EQUAL?  GL-PRSO,TH-OPAL,TH-RUBY,TH-SAPPHIRE /?CTR59
+       EQUAL?  GL-PRSO,TH-EMERALD,TH-RED-GLASS \?CCL60
+?CTR59:        PRINTR  """My, what a loverly gem!"""
+?CCL60:        EQUAL?  GL-PRSO,TH-BOX-KEY \FALSE
+       MOVE    TH-BOX-KEY,TH-GUARDS-POCKET
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINTR  " looks surprised and says, ""Oh! Thank you. I must have dropped it. I'll be sure to keep it in a safer place."" He takes the key and puts it in one of his inside pockets."
+?CCL24:        ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?TAKE \?CCL69
+       EQUAL?  GL-PRSI,FALSE-VALUE \FALSE
+       ICALL2  RT-CTHEO-PRINT,CH-BANK-GUARD
+       PRINT   K-MUST-WEIGH-MSG
+       CRLF    
+       RTRUE   
+?CCL69:        EQUAL?  GL-PRSA,V?ASK-FOR \FALSE
+       EQUAL?  GL-PRSI,TH-BOX-KEY,TH-GUARDS-KEYS \?CCL77
+       PRINT   K-SORRY-MATE-MSG
+       CRLF    
+       RTRUE   
+?CCL77:        EQUAL?  GL-PRSI,TH-OPAL,TH-RUBY,TH-SAPPHIRE /?CCL79
+       EQUAL?  GL-PRSI,TH-EMERALD \FALSE
+?CCL79:        PRINT   K-ILL-HOLD-IT-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-AC-CH-WIGGINS,CONTEXT,OBJ
+       ICALL2  RT-THIS-IS-IT,CH-WIGGINS
+       EQUAL?  CONTEXT,K-M-WINNER \?CCL3
+       FSET?   GL-WINNER,FL-ASLEEP \?CCL3
+       ICALL2  RT-NO-CONDITION-MSG,GL-WINNER
+       RTRUE   
+?CCL3: EQUAL?  CONTEXT,K-M-CONT \?CCL7
+       FSET?   CH-WIGGINS,FL-ASLEEP \?CCL7
+       PRINTI  "It's bad enough that you wasted the etherium; using it to steal from your friends is quite unsporting. "
+       RTRUE   
+?CCL7: EQUAL?  CONTEXT,K-M-DESCFCN \?CCL11
+       FSET?   CH-WIGGINS,FL-ASLEEP \?CCL14
+       PRINTR  "Wiggins is still suffering from the effects of the etherium gas."
+?CCL14:        FSET?   CH-WIGGINS,FL-BROKEN \?CND12
+       FCLEAR  CH-WIGGINS,FL-BROKEN
+       FCLEAR  CH-WIGGINS,FL-NODESC
+       FSET    CH-WIGGINS,FL-SEEN
+       PRINTI  "After staring at his dirty face for a few moments, you suddenly recognize the boy. He is Wiggins, the head of the Baker Street Irregulars, which is Holmes's unofficial army of street urchins who ""go everywhere and do everything."""
+       CRLF    
+?CND12:        CALL2   RT-PICK-NEXT,GL-WIGGINS-DESC-TXT
+       PRINT   STACK
+       IN?     CH-WIGGINS,TH-BOAT \?CCL18
+       PRINT   K-ENJOYING-RIDE-MSG
+       JUMP    ?CND16
+?CCL18:        IN?     CH-WIGGINS,TH-HANSOM-CAB /?CTR19
+       IN?     CH-WIGGINS,TH-GROWLER-CAB \?CCL20
+?CTR19:        PRINT   K-FIDGETING-MSG
+       JUMP    ?CND16
+?CCL20:        CALL2   RT-PICK-NEXT,GL-WIGGINS-LOOK-TXT
+       PRINT   STACK
+?CND16:        PRINTC  46
+       CRLF    
+       RETURN  2
+?CCL11:        CALL2   RT-TELL-ABOUT?,CH-WIGGINS
+       ZERO?   STACK /?CCL24
+       EQUAL?  GL-PRSA,V?WHO,V?WHAT \?CCL27
+       SET     'OBJ,GL-PRSO
+       JUMP    ?CND25
+?CCL27:        SET     'OBJ,GL-PRSI
+?CND25:        FSET?   CH-WIGGINS,FL-ASLEEP \?CCL30
+       CALL2   RT-NO-CONDITION-MSG,CH-WIGGINS
+       RSTACK  
+?CCL30:        EQUAL?  GL-PRSA,V?WHO \?CCL32
+       EQUAL?  OBJ,CH-WIGGINS \?CCL32
+       PRINTR  """I'm Wiggins, 'ead o' the Baker Street Irregulars."""
+?CCL32:        EQUAL?  OBJ,CH-HOLMES \?CCL36
+       PRINTR  """E's a good man, guv'nor. Best as ever was."""
+?CCL36:        PRINTR  """Beats me. What do you think?"""
+?CCL24:        CALL1   RT-WHO-WHAT-FAIL?
+       ZERO?   STACK /?CCL38
+       RETURN  2
+?CCL38:        EQUAL?  CONTEXT,K-M-WINNER \?CCL40
+       EQUAL?  GL-PRSA,V?HELLO \?CCL43
+       PRINTR  """'Ello."""
+?CCL43:        EQUAL?  GL-PRSA,V?GOODBYE \?CCL45
+       PRINTR  """Ta ta."""
+?CCL45:        EQUAL?  GL-PRSA,V?THANK \?CCL47
+       PRINTR  """Anytime, mate."""
+?CCL47:        EQUAL?  GL-PRSA,V?WHERE \?CCL49
+       PRINTR  """Beats me. What do you think?"""
+?CCL49:        ZERO?   CH-WIGGINS-AUX1 \?CCL51
+       ICALL2  RT-CTHEO-PRINT,CH-WIGGINS
+       PRINT   K-WOUNDED-PRIDE-MSG
+       CRLF    
+       RTRUE   
+?CCL51:        EQUAL?  GL-PRSA,V?ENTER \?CCL53
+       EQUAL?  GL-PRSO,TH-BUTT-OF-MALMSEY \?CCL56
+       FSET?   GL-PRSO,FL-BROKEN /?CCL56
+       SET     'WIGGINS-COLD?,TRUE-VALUE
+       PRINTR  "Wiggins dutifully climbs into the full butt of malmsey and has a nice bath and gets out again."
+?CCL56:        EQUAL?  GL-PRSO,TH-BUTT-OF-MALMSEY \?CCL60
+       IN?     TH-GARNET,TH-BUTT-OF-MALMSEY \?CCL63
+       MOVE    TH-GARNET,CH-PLAYER
+       ICALL2  RT-THIS-IS-IT,TH-GARNET
+       SET     'WIGGINS-COLD?,TRUE-VALUE
+       FSET    TH-GARNET,FL-SEEN
+       FSET    TH-GARNET,FL-TOUCHED
+       FCLEAR  TH-GARNET,FL-NODESC
+       PRINTI  "Wiggins climbs into the empty butt of malmsey, gets the gem, gets out and gives it to you."
+       CRLF    
+       GETP    TH-GARNET,P?VALUE
+       ICALL2  RT-UPDATE-SCORE,STACK
+       PUTP    TH-GARNET,P?VALUE,0
+       RTRUE   
+?CCL63:        PRINTR  "Wiggins says, ""Once was enough, thank you."""
+?CCL60:        EQUAL?  GL-PRSO,TH-HANSOM-CAB,TH-GROWLER-CAB,TH-BOAT \?CCL65
+       IN?     CH-HOLMES,RM-LAIR \?CCL68
+       IN?     CH-PLAYER,GL-PRSO \?CCL71
+       PRINTI  "Wiggins climbs in next to you."
+       CRLF    
+       MOVE    CH-WIGGINS,GL-PRSO
+       JUMP    ?CND69
+?CCL71:        PRINT   K-AFTER-YOU-MSG
+       CRLF    
+?CND69:        SET     'GL-PUPPY,CH-WIGGINS
+       FCLEAR  CH-WIGGINS,FL-NODESC
+       FCLEAR  CH-WIGGINS,FL-BROKEN
+       RTRUE   
+?CCL68:        PRINT   K-CANT-LEAVE-MSG
+       CRLF    
+       RTRUE   
+?CCL65:        EQUAL?  GL-PRSO,LG-WATER \FALSE
+       PRINTR  """I ain't no bleedin' mermaid. Besides, bathing ain't 'ealthy."""
+?CCL53:        EQUAL?  GL-PRSA,V?TAKE,V?STEAL \?CCL75
+       EQUAL?  GL-PRSO,TH-GARNET \?CCL78
+       IN?     TH-GARNET,TH-BUTT-OF-MALMSEY \?CCL78
+       MOVE    TH-GARNET,CH-PLAYER
+       ICALL2  RT-THIS-IS-IT,TH-GARNET
+       SET     'WIGGINS-COLD?,TRUE-VALUE
+       FSET    TH-GARNET,FL-SEEN
+       FSET    TH-GARNET,FL-TOUCHED
+       FCLEAR  TH-GARNET,FL-NODESC
+       ICALL2  RT-CTHEO-PRINT,CH-WIGGINS
+       IN?     CH-WIGGINS,TH-BUTT-OF-MALMSEY /?CND81
+       PRINTI  " climbs into the empty butt of malsey,"
+?CND81:        PRINTI  " gets the gem, gets out, and gives it to you."
+       CRLF    
+       GETP    TH-GARNET,P?VALUE
+       ICALL2  RT-UPDATE-SCORE,STACK
+       PUTP    TH-GARNET,P?VALUE,0
+       RTRUE   
+?CCL78:        EQUAL?  GL-PRSO,TH-GUARDS-POCKET,TH-BOX-KEY,TH-GUARDS-KEYS /?CTR83
+       EQUAL?  GL-PRSI,TH-GUARDS-POCKET,CH-BANK-GUARD \?CCL84
+?CTR83:        ICALL1  RT-STEAL-KEY
+       RTRUE   
+?CCL84:        EQUAL?  GL-PRSA,V?STEAL \FALSE
+       PRINTR  """I would if I could, guv. But I don't see 'ow to do it."""
+?CCL75:        EQUAL?  GL-PRSA,V?ROB \?CCL90
+       EQUAL?  GL-PRSO,CH-BANK-GUARD \?CCL90
+       CALL1   RT-STEAL-KEY
+       RSTACK  
+?CCL90:        EQUAL?  GL-PRSA,V?EMPTY,V?REACH-IN,V?SEARCH \?CCL94
+       EQUAL?  GL-PRSO,TH-GUARDS-POCKET,CH-BANK-GUARD /?CTR96
+       EQUAL?  GL-PRSI,TH-GUARDS-POCKET,CH-BANK-GUARD \?CCL97
+?CTR96:        ICALL1  RT-STEAL-KEY
+       RTRUE   
+?CCL97:        PRINTR  """I would if I could, guv. But I don't see 'ow to do it."""
+?CCL94:        EQUAL?  GL-PRSA,V?FOLLOW \?CCL101
+       EQUAL?  GL-PRSO,CH-ME,CH-PLAYER \?CCL104
+       IN?     CH-HOLMES,RM-LAIR \?CCL107
+       PRINTI  """After you, guv."""
+       CRLF    
+       SET     'GL-PUPPY,CH-WIGGINS
+       FCLEAR  CH-WIGGINS,FL-NODESC
+       FCLEAR  CH-WIGGINS,FL-BROKEN
+       RTRUE   
+?CCL107:       PRINT   K-CANT-LEAVE-MSG
+       CRLF    
+       RTRUE   
+?CCL104:       PRINTR  """I'm not a bleedin' bloodhound."""
+?CCL101:       EQUAL?  GL-PRSA,V?WAIT \?CCL109
+       EQUAL?  GL-PUPPY,CH-WIGGINS \?CCL112
+       SET     'GL-PUPPY,FALSE-VALUE
+       PRINTR  """Right. I'm glued to this spot."""
+?CCL112:       PRINTR  """Whatever you say, guv."""
+?CCL109:       EQUAL?  GL-PRSA,V?EXIT \?CCL114
+       PRINT   K-AFTER-YOU-MSG
+       CRLF    
+       RTRUE   
+?CCL114:       EQUAL?  GL-PRSA,V?PULL \?CCL116
+       EQUAL?  GL-PRSO,TH-PORTCULLIS-CHAIN \?CCL116
+       PRINTR  """I can't reach it, guv."""
+?CCL116:       PRINTR  "Wiggins looks at you and scratches his head."
+?CCL40:        ZERO?   GL-NOW-PRSI? /?CCL120
+       EQUAL?  GL-PRSA,V?GIVE \?CCL123
+       FSET?   CH-WIGGINS,FL-ASLEEP \?CCL126
+       ICALL   RT-NO-CONDITION-MSG,CH-WIGGINS,STR?812
+       RTRUE   
+?CCL126:       EQUAL?  GL-PRSO,TH-SHILLING \?CCL128
+       MOVE    TH-SHILLING,CH-WIGGINS
+       FSET    TH-SHILLING,FL-NOALL
+       SET     'CH-WIGGINS-AUX1,1
+       ZERO?   GL-P-CONT \?CND129
+       SET     'WINNER-IS-WIGGINS,TRUE-VALUE
+?CND129:       SET     'GL-P-QCONTEXT-TH,CH-WIGGINS
+       SET     'GL-P-QCONTEXT-RM,GL-PLACE-CUR
+       PRINTI  "Wiggins looks at "
+       ICALL2  RT-THEO-PRINT,TH-SHILLING
+       PRINTR  " and then at you. After a few moments he stuffs it deep into the recesses of his clothing and says, ""I'm all yours. Wot's the plan?"""
+?CCL128:       EQUAL?  GL-PRSO,TH-EMERALD,TH-SAPPHIRE,TH-RUBY /?CTR131
+       EQUAL?  GL-PRSO,TH-OPAL,TH-TOPAZ,TH-GARNET /?CTR131
+       EQUAL?  GL-PRSO,TH-POUND-NOTE,TH-SIXPENCE \?CCL132
+?CTR131:       PRINTI  "Wiggins glances at your offer and"
+       PRINT   K-WOUNDED-PRIDE-MSG
+       CRLF    
+       RTRUE   
+?CCL132:       PRINTR  "Wiggins looks at the item you have handed him and then returns it to you. Clearly it was not of interest to him."
+?CCL123:       EQUAL?  GL-PRSA,V?TAKE \FALSE
+       EQUAL?  GL-PRSO,TH-SHILLING \FALSE
+       FSET?   CH-WIGGINS,FL-ASLEEP \?CCL142
+       PRINTI  "He must have hidden it very well. "
+       ICALL1  RT-CYOU-MSG
+       PRINTR  "can't find it."
+?CCL142:       PRINTR  """Sorry, guv'nor. A deal's a deal."""
+?CCL120:       ZERO?   GL-NOW-PRSI? \FALSE
+       EQUAL?  GL-PRSA,V?SMELL \FALSE
+       ZERO?   WIGGINS-COLD? /?CCL150
+       PRINT   K-EAU-DE-MSG
+       CRLF    
+       RTRUE   
+?CCL150:       PRINTR  "Yuck. Eau de urchin."
+
+
+       .FUNCT  RT-AC-CH-BUTLER,CONTEXT,WORD-NUM
+       ICALL2  RT-THIS-IS-IT,CH-BUTLER
+       EQUAL?  CONTEXT,K-M-WINNER \?CCL3
+       FSET?   CH-BUTLER,FL-ASLEEP \?CCL6
+       CALL2   RT-NO-CONDITION-MSG,CH-BUTLER
+       RSTACK  
+?CCL6: EQUAL?  GL-PRSA,V?TAKE,V?FIND \?CCL8
+       CALL    RT-IDENTIFY-EVENT?,W?MYCROFT,GL-PRSO
+       ZERO?   STACK /?CCL8
+       SET     'GL-WINNER,CH-PLAYER
+       ICALL   RT-PERFORM,V?ASK-FOR,CH-BUTLER,TH-EVENT
+       RTRUE   
+?CCL8: EQUAL?  GL-PRSA,V?HELLO \?CCL12
+       PRINTC  34
+       CALL1   RT-TIME-OF-DAY
+       ZERO?   STACK \?CCL15
+       PRINTI  "How do you do?"
+       JUMP    ?CND13
+?CCL15:        CALL1   RT-TIME-OF-DAY
+       EQUAL?  STACK,1,2 \?CCL17
+       PRINTI  "Good day."
+       JUMP    ?CND13
+?CCL17:        CALL1   RT-TIME-OF-DAY
+       EQUAL?  STACK,3 \?CND13
+       PRINTI  "Good evening."
+?CND13:        PRINTR  """"
+?CCL12:        EQUAL?  GL-PRSA,V?GOODBYE \?CCL20
+       PRINTC  34
+       CALL1   RT-TIME-OF-DAY
+       ZERO?   STACK \?CCL23
+       PRINTI  "Good night"
+       JUMP    ?CND21
+?CCL23:        CALL1   RT-TIME-OF-DAY
+       EQUAL?  STACK,1,2 \?CCL25
+       PRINTI  "Good day"
+       JUMP    ?CND21
+?CCL25:        CALL1   RT-TIME-OF-DAY
+       EQUAL?  STACK,3 \?CND21
+       PRINTI  "Good evening"
+?CND21:        PRINTR  "."""
+?CCL20:        EQUAL?  GL-PRSA,V?THANK \?CCL28
+       PRINTR  """You're quite welcome."""
+?CCL28:        EQUAL?  GL-PRSA,V?WHO \?CCL30
+       EQUAL?  GL-PRSO,CH-BUTLER \?CCL30
+       PRINTR  """I am one of the staff of this fine establishment."""
+?CCL30:        EQUAL?  GL-PRSA,V?WHO,V?WHAT,V?WHERE \?CCL34
+       PRINTR  """I'm far too discreet to respond."""
+?CCL34:        EQUAL?  GL-PRSA,V?YES,V?NO \?CCL36
+       ICALL2  RT-CTHEO-PRINT,CH-BUTLER
+       PRINTR  " looks at you expectantly."
+?CCL36:        EQUAL?  GL-PRSA,V?RESCUE \?CCL38
+       PRINTR  """What can I do for you?"""
+?CCL38:        PRINTR  """I'm afraid I am unable to do that."""
+?CCL3: ZERO?   GL-NOW-PRSI? \?CCL40
+       EQUAL?  GL-PRSA,V?ASK-FOR,V?ASK-ABOUT \FALSE
+       FSET?   CH-BUTLER,FL-ASLEEP \?CCL46
+       CALL2   RT-NO-CONDITION-MSG,CH-BUTLER
+       RSTACK  
+?CCL46:        CALL    RT-IDENTIFY-EVENT?,W?MYCROFT,GL-PRSI
+       ZERO?   STACK /?CCL48
+       BTST    MYCROFT-STATE,1 \?CCL51
+       PRINTR  """I am very sorry but Mr Mycroft Holmes is not available at this time. Perhaps you would care to come back later?"""
+?CCL51:        BTST    MYCROFT-STATE,2 \?CCL53
+       BAND    MYCROFT-STATE,-3 >MYCROFT-STATE
+       PRINTI  "The butler listens to you and then leaves. He comes back shortly."
+       CRLF    
+       CRLF    
+       PRINTR  """Mr Mycroft Holmes requires that you offer some token to verify that you are indeed the person you claim to be. Give whatever it is to me and I will take it to him."""
+?CCL53:        PRINTR  "The butler listens politely but insists that he can do nothing more for you than to deliver the token to Mr Mycroft Holmes."
+?CCL48:        EQUAL?  GL-PRSI,CH-HOLMES \?CCL55
+       PRINTR  """I am afraid that I know the younger Mr Holmes only by his somewhat colourful reputation."""
+?CCL55:        EQUAL?  GL-PRSI,CH-BUTLER \?CCL57
+       PRINTR  """I am well, sir. Thank you for asking."""
+?CCL57:        EQUAL?  GL-PRSI,CH-PLAYER,CH-ME \?CCL59
+       PRINTR  "He looks down his nose at you and sniffs, ""I don't believe we've been introduced."""
+?CCL59:        EQUAL?  GL-PRSI,CH-MEMBERS \?CCL61
+       PRINTR  """They seem livelier than usual for this time of year."""
+?CCL61:        EQUAL?  GL-PRSI,RM-DIOGENES-CLUB \?CCL63
+       PRINTR  "The butler coughs deferentially, ""It is one of the most exclusive clubs in London, sir."" He glances at your clothes. ""Membership is by invitation only."""
+?CCL63:        FSET?   GL-PRSI,FL-PERSON \?CCL65
+       FSET?   GL-PRSI,FL-PLURAL \?CCL68
+       PRINTR  """Unfortunately, I can say nothing about them."""
+?CCL68:        FSET?   GL-PRSI,FL-FEMALE \?CCL70
+       PRINTR  """I am sorry but I can tell you nothing about her."""
+?CCL70:        PRINTR  """Much to my regret I can tell you nothing about him."""
+?CCL65:        PRINTR  """I'm afraid I wouldn't know anything about that."""
+?CCL40:        ZERO?   GL-NOW-PRSI? /FALSE
+       EQUAL?  GL-PRSA,V?GIVE \FALSE
+       FSET?   CH-BUTLER,FL-ASLEEP \?CCL78
+       CALL    RT-NO-CONDITION-MSG,CH-BUTLER,STR?812
+       RSTACK  
+?CCL78:        BTST    MYCROFT-STATE,1 \?CCL80
+       PRINTR  "The butler politely declines to take the gift you have offered."
+?CCL80:        BTST    MYCROFT-STATE,2 \?CCL82
+       PRINTR  "The butler refuses to take the item you have offered and asks if you have come to speak with someone here in the club."
+?CCL82:        EQUAL?  GL-PRSO,TH-RING \?CCL84
+       BOR     MYCROFT-STATE,5 >MYCROFT-STATE
+       REMOVE  TH-RING
+       PRINT   K-BUTLER-ACCEPTS-MSG
+       CRLF    
+       CRLF    
+       PRINTI  "After a few moments, Mycroft Holmes appears. He looks very worried."
+       CRLF    
+       CRLF    
+       PRINTI  """Sherlock warned me that you might come,"" he says. ""And the fact that you are here indicates that he is indeed in trouble. I believe that in order to solve this mystery, you are going to have to go to the Tower of London. It will be closed, but you can give the password '"
+       RANDOM  6 >WORD-NUM
+       SET     'PASSWORD-ID,WORD-NUM
+       EQUAL?  WORD-NUM,1 \?CCL87
+       PRINTI  "Boleyn"
+       JUMP    ?CND85
+?CCL87:        EQUAL?  WORD-NUM,2 \?CCL89
+       PRINTI  "Cleves"
+       JUMP    ?CND85
+?CCL89:        EQUAL?  WORD-NUM,3 \?CCL91
+       PRINTI  "Howard"
+       JUMP    ?CND85
+?CCL91:        EQUAL?  WORD-NUM,4 \?CCL93
+       PRINTI  "Parr"
+       JUMP    ?CND85
+?CCL93:        EQUAL?  WORD-NUM,5 \?CCL95
+       PRINTI  "Aragon"
+       JUMP    ?CND85
+?CCL95:        EQUAL?  WORD-NUM,6 \?CND85
+       PRINTI  "Seymour"
+?CND85:        PRINTI  "' to the guard at the Byward Tower. He will let you in. Good luck."""
+       CRLF    
+       CRLF    
+       PRINTI  "Mycroft pauses before he goes and looks at you meditatively, as if trying to decide if he can put his faith in you to rescue his brother. After a moment he gives his head an unconscious nod, then turns around and disappears back into the club."
+       CRLF    
+       ICALL2  RT-UPDATE-SCORE,1
+       RTRUE   
+?CCL84:        PRINT   K-BUTLER-ACCEPTS-MSG
+       CRLF    
+       CRLF    
+       PRINTI  "The butler soon returns looking concerned."
+       CRLF    
+       CRLF    
+       PRINTR  """I am sorry but Mr Mycroft Holmes says this will not do. Do you have anything else?"""
+
+
+       .FUNCT  RT-AC-LG-BANK-VAULT-DOOR,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       EQUAL?  GL-PLACE-CUR,RM-BANK-OF-ENGLAND \?CCL6
+       ICALL2  RT-OPEN-CLOSED-MSG,LG-BANK-VAULT-DOOR
+       CRLF    
+       CRLF    
+       PRINTR  "In the middle of the door you see a big shiny dial."
+?CCL6: ICALL2  RT-OPEN-CLOSED-MSG,LG-BANK-VAULT-DOOR
+       CRLF    
+       CRLF    
+       PRINTR  "The inside of the door is shiny and flat."
+?CCL3: EQUAL?  GL-PRSA,V?OPEN \?CCL8
+       FSET?   LG-BANK-VAULT-DOOR,FL-OPENED \?CCL11
+       PRINTR  "The vault door is already open."
+?CCL11:        FSET?   LG-BANK-VAULT-DOOR,FL-LOCKED \?CCL13
+       PRINTR  "The vault door is locked."
+?CCL13:        FSET    LG-BANK-VAULT-DOOR,FL-OPENED
+       PRINTR  "The vault door swings open."
+?CCL8: EQUAL?  GL-PRSA,V?CLOSE \?CCL15
+       FSET?   LG-BANK-VAULT-DOOR,FL-OPENED /?CCL18
+       PRINTR  "The vault door is already closed."
+?CCL18:        FCLEAR  LG-BANK-VAULT-DOOR,FL-OPENED
+       FSET    LG-BANK-VAULT-DOOR,FL-LOCKED
+       SET     'TH-DIAL-AUX1,0
+       SET     'TH-DIAL-AUX2,0
+       PRINTI  "The vault door swings closed and locks"
+       IN?     CH-PLAYER,RM-BANK-VAULT \?CCL21
+       PRINTI  " you in. Whoops!"
+       CRLF    
+       CRLF    
+       CALL1   RT-QSR
+       RSTACK  
+?CCL21:        PRINTR  "."
+?CCL15:        EQUAL?  GL-PRSA,V?ENTER,V?THROUGH \?CCL23
+       EQUAL?  GL-PLACE-CUR,RM-BANK-VAULT \?CCL26
+       CALL2   RT-DO-WALK,P?EAST
+       RSTACK  
+?CCL26:        EQUAL?  GL-PLACE-CUR,RM-BANK-OF-ENGLAND \FALSE
+       CALL2   RT-DO-WALK,P?WEST
+       RSTACK  
+?CCL23:        EQUAL?  GL-PRSA,V?LOOK-INSIDE \?CCL30
+       FSET?   LG-BANK-VAULT-DOOR,FL-OPENED \?CCL33
+       ICALL   RT-CYOU-MSG,STR?665,STR?666
+       PRINTI  "row upon row of "
+       ICALL2  DPRINT,TH-BOXES
+       PRINTR  "."
+?CCL33:        ICALL2  RT-CTHEO-PRINT,LG-BANK-VAULT-DOOR
+       PRINTR  " is closed."
+?CCL30:        EQUAL?  GL-PRSA,V?UNLOCK \?CCL35
+       FSET?   LG-BANK-VAULT-DOOR,FL-OPENED \?CCL38
+       ICALL2  RT-CTHEO-PRINT,LG-BANK-VAULT-DOOR
+       PRINTR  " is already opened."
+?CCL38:        PRINT   K-HOW-TO-MSG
+       CRLF    
+       RTRUE   
+?CCL35:        EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       PRINT   K-RICOCHET-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-TOPAZ-MSG
+       EQUAL?  GL-PRSO,TH-TOPAZ \FALSE
+       EQUAL?  GL-PUPPY,CH-HOLMES \FALSE
+       CRLF    
+       PRINTI  "Holmes plucks you by the sleeve and reaches into the box. ""Observe, Watson."" He pulls out an almost invisible thread and examines it with glittering eyes. ""Muslin,"" he declares, more to himself than to you. ""Of Indian origin, and of the type used almost exclusively in the manufacture of turbans."" He looks at you in triumph. ""Our case is almost complete, Doctor. The Agra gems, the Trichinopoly cigar, and now this strand of muslin."""
+       CRLF    
+       CRLF    
+       PRINTR  "Holmes puts the strand into his pocket and explains. ""Moriarty - for reasons as yet unknown to us - has stolen the Crown Jewels. The Agra gems have somehow passed into his hands by way of this Indian accomplice, and he is using small pieces of it to lure me into a rendezvous with him. It's a dangerous game we play, Watson, but if we are to recover the regalia we have no choice."""
+
+       .ENDI
diff --git a/bank.zil b/bank.zil
new file mode 100644 (file)
index 0000000..b7c9797
--- /dev/null
+++ b/bank.zil
@@ -0,0 +1,972 @@
+;*****************************************************************************
+; "game : SHERLOCK!"
+; "file : BANK.ZIL"
+; "auth :   $Author:   RAB  $"
+; "date :     $Date:   28 Oct 1987 17:47:38  $"
+; "revs : $Revision:   1.89  $"
+; "vers : 1.00"
+;*****************************************************************************
+
+<CONSTANT K-GEM-BOX-NUM 600>   ;"Box number containing the gem."
+
+<ROUTINE RT-KIDNAP ()
+       <MOVE ,CH-HOLMES ,RM-LAIR>
+       <MOVE ,TH-ROPE ,CH-HOLMES>
+       <MC-MAKE ,CH-HOLMES ,FL-LOCKED>
+       <SETG TH-ROPE-AUX1 ,CH-HOLMES>
+       <SET-MYCROFT-STATE CLEAR ,MYCROFT-LOCKED>
+       <SETG GL-PUPPY <>>
+       <TELL
+CR
+"Suddenly, someone grabs you from behind, pins your arms to your sides, and
+covers up your head. You struggle fiercely to get loose, but to no
+avail. Then you hear a voice shout, \"Let him go, we've got the other
+one.\"" CR CR
+
+"The person holding you knocks you on the head and flings you to the
+ground. You lose consciousness for a few moments, and when you awake, you
+are alone." CR CR
+
+"Sherlock Holmes has been kidnapped." CR>
+       <RTRUE>>
+
+<ROUTINE RT-WIGGINS-HELP-MSG ()
+       <TELL
+CTHE ,CH-WIGGINS " says, \"I saw it all, guv'nor. But it was over before I
+could lift a finger. Mr 'Olmes was a friend to me, 'e was. And I'd do
+anyfing to 'elp you get 'im back.\"" CR>
+       <SETG GL-PUPPY ,CH-WIGGINS>
+       <MC-UNMAKE ,CH-WIGGINS ,FL-NODESC>
+       <MC-UNMAKE ,CH-WIGGINS ,FL-BROKEN>
+       <SETG GL-PUPPY-MSG? <>>>
+
+<GLOBAL BOX-KEY-COLD? <>>
+
+<ROUTINE RT-STEAL-KEY ()
+       <COND (<F? ,BOX-KEY-COLD?>
+              <SETG BOX-KEY-COLD? T>
+              <MOVE ,TH-BOX-KEY ,CH-PLAYER>
+              <TELL 
+CTHE ,CH-WIGGINS " casually strolls past the guard and says, \"Cor blimey.
+That bird isn't 'alf built, is she?\" While the guard's attention is diverted,
+Wiggins's hand flashes in and out of his pocket. Then just as casually as
+before, he strolls back to you, slips something into your hand, and whispers,
+\"Sorry I couldn't get everything, guv. I 'ope this is enough.\"" CR>
+              <RT-UPDATE-SCORE <GETP ,TH-BOX-KEY ,P?VALUE>>
+              <PUTP ,TH-BOX-KEY ,P?VALUE 0>)
+             (T
+              <TELL "\"Sorry, guv. 'E'll never go for it twice.\"" CR>)>
+       <RTRUE>>
+
+<OBJECT TH-INTNUM
+   (LOC GLOBAL-OBJECTS)
+   (DESC "number")
+   (FLAGS FL-NODESC FL-SEEN)
+   (SYNONYM INTNUM NUMBER)
+   (GENERIC RT-GN-INTNUM)
+   (ACTION RT-AC-TH-INTNUM)>
+
+<OBJECT TH-SAFETY-DEPOSIT-BOX
+   (LOC RM-BANK-VAULT)
+   (DESC "safety deposit box")
+   (FLAGS FL-NODESC FL-CONTAINER FL-OPENABLE FL-LOCKED FL-HAS-DESCFCN)
+   (SYNONYM INTNUM BOX)
+   (ADJECTIVE SAFETY DEPOSIT BOX NUMBER)
+   (SIZE 0 CAPACITY 10)
+   (GENERIC RT-GN-INTNUM)
+   (ACTION RT-AC-TH-SAFETY-DEPOSIT-BOX)>
+
+<OBJECT TH-RING
+   (LOC LOCAL-GLOBALS)
+   (DESC "ring")
+   (FLAGS FL-TAKEABLE FL-NOALL FL-CLOTHING)
+   (SYNONYM RING)
+   (ADJECTIVE SIGNET)
+   (VALUE 1)
+   (SIZE 1 MASS 1)
+   (ACTION RT-AC-TH-RING)>
+
+<OBJECT TH-SHILLING
+   (DESC "shilling")
+   (FLAGS FL-TAKEABLE FL-MONEY)
+   (SYNONYM SHILLING COIN)
+   (VALUE 0)
+   (SIZE 1 MASS 1)>
+
+<OBJECT TH-BOX-KEY
+   (LOC TH-GUARDS-POCKET)
+   (DESC "key")
+   (FLAGS FL-TAKEABLE FL-HAS-DESCFCN)
+   (SYNONYM KEY)
+   (ADJECTIVE MASTER)
+   (SIZE 1)
+   (VALUE 1)
+   (ACTION RT-AC-TH-BOX-KEY)>
+
+<OBJECT TH-BOX-LOCK
+       (LOC RM-BANK-VAULT)
+       (DESC "lock")
+       (FLAGS FL-NODESC FL-CONTAINER FL-OPENED)
+       (SYNONYM INTNUM)
+       (ADJECTIVE LOCK NUMBER)
+       (GENERIC RT-GN-INTNUM)
+       (ACTION RT-AC-TH-BOX-LOCK)>
+
+<OBJECT TH-BOXES
+       (LOC RM-BANK-VAULT)
+       (DESC "safety deposit boxes")
+       (FLAGS FL-NODESC FL-PLURAL FL-OPENABLE FL-CONTAINER
+              FL-HAS-DESCFCN)
+       (SYNONYM BOXES)
+       (ADJECTIVE SAFETY DEPOSIT)
+       (ACTION RT-AC-TH-BOXES)>
+
+<OBJECT TH-GUARDS-POCKET
+       (LOC CH-BANK-GUARD)
+       (DESC "guard's pocket")
+       (FLAGS FL-NODESC FL-CONTAINER FL-OPENED FL-TRYTAKE)
+       (SYNONYM POCKET)
+       (ADJECTIVE HIS GUARD\'S)
+       (SIZE 0 CAPACITY 10)
+       (ACTION RT-AC-TH-GUARDS-POCKET)>
+
+<ROUTINE RT-AC-TH-INTNUM ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-TH-AC "TH-INTNUM" .CONTEXT>>
+       <COND (<MC-VERB? WAIT-FOR WAIT VERIFY>
+              <RFALSE>)
+             (<MC-VERB? SHOOT>
+              <RT-IMPOSSIBLE-MSG>
+              <RTRUE>)
+             (<NOT <MC-HERE? ,RM-BANK-VAULT>>
+              <COND (<EQUAL? ,GL-P-NUMBER -1>
+                     <RT-CYOU-MSG "do" "does">
+                     <TELL "not see that here." CR>)
+                    (T
+                     <RT-CYOU-MSG "do" "does">
+                     <TELL "not need to use a number here." CR>)>)>>
+
+<ROUTINE RT-AC-TH-RING ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-TH-AC "TH-RING" .CONTEXT>>
+       <COND (<MC-THIS-PRSI?>
+              <RFALSE>)
+             (<MC-THIS-PRSO?>
+              <COND (<MC-VERB? WEAR>
+                     <TELL "It's the wrong size." CR>)>)>>
+
+<ROUTINE RT-AC-TH-BOX-KEY ("OPTIONAL" (CONTEXT <>))
+  <DEBUGGING? <RT-DEBUG-TH-AC "TH-BOX-KEY" .CONTEXT>>
+  <COND (<==? .CONTEXT ,K-M-DESCFCN>
+        <COND (<OR <IN? ,TH-BOX-KEY ,TH-GUARDS-POCKET>
+                   <IN? ,TH-BOX-KEY ,CH-BANK-GUARD>>
+               <RT-CYOU-MSG>
+               <TELL "can't see it. The guard has it." CR>
+               <RTRUE>)
+              (T
+               <TELL
+CTHE ,TH-BOX-KEY " has the word \"Master\" written on it." CR>)>)
+       (<MC-THIS-PRSI?>
+        <RFALSE>)
+       (<MC-THIS-PRSO?>
+        <COND (<MC-VERB? TURN>
+               <COND (<IN? ,TH-BOX-KEY ,TH-BOX-LOCK>
+                      <COND (<EQUAL? ,TH-BOX-KEY-AUX1 ,K-GEM-BOX-NUM>
+                             <COND (<MC-IS? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                                    <TELL "The box is already open." CR>)
+                                   (T
+                                    <SETG TH-SAFETY-DEPOSIT-BOX-AUX1 ,TH-BOX-KEY-AUX1>
+                                    <RT-CYOU-MSG "open" "opens">
+                                    <TELL "the box with the key.">
+                                    <COND (<FIRST? ,TH-SAFETY-DEPOSIT-BOX>
+                                           <TELL " Inside you see ">
+                                           <RT-PRINT-CONTENTS-2 ,TH-SAFETY-DEPOSIT-BOX>
+                                           <TELL ".">)>
+                                    <MC-MAKE ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                                    <MC-UNMAKE ,TH-SAFETY-DEPOSIT-BOX ,FL-LOCKED>
+                                    <CRLF>)>)
+                            (T
+                             <RT-CYOU-MSG "open" "opens">
+                             <TELL ,K-NOTHING-INSIDE-MSG>
+                             <RT-YOU-MSG "lock" "locks">
+                             <TELL "it back up again." CR>)>)>)
+              (<MC-VERB? READ>
+               <COND (<OR <IN? ,TH-BOX-KEY ,TH-GUARDS-POCKET>
+                          <IN? ,TH-BOX-KEY ,CH-BANK-GUARD>>
+                      <RT-CYOU-MSG>
+                      <TELL "can't see it. The guard has it." CR>)
+                     (T
+                      <TELL "It says, \Master.\"" CR>)>)>)>>
+
+<ROUTINE RT-AC-TH-BOX-LOCK ("OPTIONAL" (CONTEXT <>) "AUX" NUM)
+       <DEBUGGING? <RT-DEBUG-TH-AC "TH-BOX-LOCK" .CONTEXT>>
+       <COND (<EQUAL? ,GL-P-NUMBER -1>
+              <COND (<ZERO? ,TH-BOX-LOCK-AUX1>
+                     <TELL ,K-SPECIFY-MSG "lock by number." CR>
+                     <RTRUE>)>)
+             (<OR <L? ,GL-P-NUMBER 1>
+                  <G? ,GL-P-NUMBER 999>>
+              <TELL "There is no lock number " N ,GL-P-NUMBER "." CR>
+              <RTRUE>)
+             (T
+              <SETG TH-BOX-LOCK-AUX1 ,GL-P-NUMBER>)>
+       <SET NUM ,TH-BOX-LOCK-AUX1>
+       <COND (<MC-THIS-PRSI?>
+              <COND (<MC-VERB? PUT>
+                     <COND (<MC-PRSO? ,TH-BOX-KEY>
+                            <MOVE ,TH-BOX-KEY ,TH-BOX-LOCK>
+                            <SETG TH-BOX-KEY-AUX1 ,TH-BOX-LOCK-AUX1>
+                            <TELL "The key fits nicely." CR>)
+                           (T
+                            <RT-CANT-PUT-IN-ON-MSG>)>)
+                    (<MC-VERB? TAKE>
+                     <COND (<NOT <MC-PRSO? ,TH-BOX-KEY>>
+                            <RFALSE>)
+                           (<IN? ,TH-BOX-KEY ,TH-BOX-LOCK>
+                            <MOVE ,TH-BOX-KEY ,GL-WINNER>
+                            <SETG TH-BOX-KEY-AUX1 0>
+                            <TELL "The key comes out smoothly." CR>)>)>)
+             (<MC-THIS-PRSO?>
+              <COND (<MC-VERB? SHOOT>
+                     <TELL ,K-RICOCHET-MSG CR>)>)>>
+
+<ROUTINE RT-AC-TH-SAFETY-DEPOSIT-BOX ("OPTIONAL" (CONTEXT <>) "AUX" NUM)
+      <DEBUGGING? <RT-DEBUG-TH-AC "TH-SAFETY-DEPOSIT-BOX" .CONTEXT>>
+      <COND (<==? .CONTEXT ,K-M-DESCFCN>
+            <SET NUM ,TH-SAFETY-DEPOSIT-BOX-AUX1>
+            <TELL "It looks the same as all the other boxes." CR>
+            <RTRUE>)
+           (<EQUAL? ,GL-P-NUMBER -1>
+            <COND (<ZERO? ,TH-SAFETY-DEPOSIT-BOX-AUX1>
+                   <TELL ,K-SPECIFY-MSG "box by number." CR>
+                   <RTRUE>)
+                  (<MC-IS? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                   <SETG TH-SAFETY-DEPOSIT-BOX-AUX1 600>)>)
+           (<OR <L? ,GL-P-NUMBER 1>
+                <G? ,GL-P-NUMBER 999>>
+            <TELL "There is no box number " N ,GL-P-NUMBER "." CR>
+            <RTRUE>)
+           (T
+            <SETG TH-SAFETY-DEPOSIT-BOX-AUX1 ,GL-P-NUMBER>)>
+      <SET NUM ,TH-SAFETY-DEPOSIT-BOX-AUX1>
+      <COND (<MC-THIS-PRSI?>
+            <COND (<MC-VERB? TAKE PUT FILL EMPTY-INTO POUR-FROM>
+                   <COND (<OR <NOT <EQUAL? .NUM ,K-GEM-BOX-NUM>>
+                              <MC-ISNOT? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>>
+                          <TELL CTHEI " is closed." CR>)>)>)
+           (<MC-THIS-PRSO?>
+            <COND (<MC-VERB? UNLOCK OPEN OPEN-WITH>
+                   <COND (<NOT <MC-PRSI? <> ,TH-BOX-KEY>>
+                          <RT-CYOU-MSG>
+                          <TELL "can't " VW " " THEO " with " THEI "." CR>)
+                         (<AND <NOT <IN? ,TH-BOX-KEY ,GL-WINNER>>
+                               <NOT <EQUAL? .NUM ,TH-BOX-KEY-AUX1>>>
+                          <RT-CYOU-MSG "do" "does">
+                          <TELL "not have the key." CR>)
+                         (<EQUAL? .NUM ,K-GEM-BOX-NUM>
+                          <COND (<MC-IS? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                                 <TELL "It is already open." CR>)
+                                (T
+                                 <RT-CYOU-MSG "open" "opens">
+                                 <TELL "the box with the key.">
+                                 <COND (<FIRST? ,TH-SAFETY-DEPOSIT-BOX>
+                                        <TELL " Inside you see ">
+                                        <RT-PRINT-CONTENTS-2 ,TH-SAFETY-DEPOSIT-BOX>
+                                        <TELL ".">)>
+                                 <MC-MAKE ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                                 <MC-UNMAKE ,TH-SAFETY-DEPOSIT-BOX ,FL-LOCKED>
+                                 <CRLF>)>)
+                         (T
+                          <RT-CYOU-MSG "open" "opens">
+                          <TELL ,K-NOTHING-INSIDE-MSG>
+                          <RT-YOU-MSG "lock" "locks">
+                          <TELL "it back up again." CR>)>
+                   <RTRUE>)
+                  (<MC-VERB? LOCK CLOSE>
+                   <COND (<EQUAL? .NUM ,K-GEM-BOX-NUM>
+                          <COND (<AND <NOT <IN? ,TH-BOX-KEY ,GL-WINNER>>
+                                      <NOT <EQUAL? .NUM ,TH-BOX-KEY-AUX1>>>
+                                 <RT-CYOU-MSG "do" "does">
+                                 <TELL "not have the key." CR>)
+                                (<MC-ISNOT? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                                 <TELL ,K-CLOSED-AND-LOCKED-MSG CR>)
+                                (T
+                                 <RT-CYOU-MSG "close and lock"
+                                              "closes and locks">
+                                 <TELL "the box with the key.">
+                                 <MC-UNMAKE ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>
+                                 <MC-MAKE ,TH-SAFETY-DEPOSIT-BOX ,FL-LOCKED>
+                                 <CRLF>)>)
+                         (T
+                          <TELL ,K-CLOSED-AND-LOCKED-MSG CR>)>
+                   <RTRUE>)
+                  (<MC-VERB? READ>
+                   <TELL N ,TH-SAFETY-DEPOSIT-BOX-AUX1 CR>)
+                  (<MC-VERB? LOOK-INSIDE SEARCH>
+                   <COND (<OR <NOT <EQUAL? .NUM ,K-GEM-BOX-NUM>>
+                              <MC-ISNOT? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>>
+                          <TELL CTHEO " is closed." CR>)
+                         (T
+                          <TELL "Inside " THEO>
+                          <RT-YOU-MSG "see" "sees">
+                          <RT-PRINT-CONTENTS-2 ,TH-SAFETY-DEPOSIT-BOX>
+                          <TELL "." CR>)>)
+                  (<MC-VERB? EMPTY REACH-IN>
+                   <COND (<OR <NOT <EQUAL? .NUM ,K-GEM-BOX-NUM>>
+                              <MC-ISNOT? ,TH-SAFETY-DEPOSIT-BOX ,FL-OPENED>>
+                          <TELL CTHEO " is closed." CR>)>)
+                  (<MC-VERB? SHOOT>
+                   <TELL ,K-RICOCHET-MSG CR>)>)>>
+
+<ROUTINE RT-AC-TH-DIAL ("OPTIONAL" (CONTEXT <>) "AUX" (LOCK? 0) WHO PTS)
+       <DEBUGGING? <RT-DEBUG-TH-AC "TH-DIAL" .CONTEXT>>
+       <COND (<MC-T? .CONTEXT> <RFALSE>)
+             (<ZERO? ,TH-DIAL-AUX1>
+              <SETG TH-DIAL-AUX1 ,TH-RIGHT>)>
+       <COND (<MC-THIS-PRSI?>
+              <RFALSE>)
+             (<MC-THIS-PRSO?>
+              <COND (<AND <MC-VERB? TUNE-TO>
+                          <NOT <MC-PRSI? <> TH-LEFT TH-RIGHT>>>
+                     <RT-CYOU-MSG>
+                     <TELL "can't " VW " " THE ,TH-DIAL " to " THEI "." CR>)
+                    (<MC-VERB? TUNE-TO SPIN TURN>
+                     <COND (<MC-PRSI? <> TH-LEFT TH-RIGHT TH-HANDS>
+                            <COND (<MC-ISNOT? ,TH-STETHOSCOPE ,FL-WORN>
+                                   <SET LOCK? 1>
+                                   <TELL "The dial turns smoothly." CR>)
+                                  (<NOT <MC-LISTEN? ,TH-DIAL
+                                                    ,LG-BANK-VAULT-DOOR
+                                                    ,RM-BANK-VAULT>>
+                                   <SET LOCK? 1>
+                                   <TELL "The dial turns quietly." CR>)
+                                  (<MC-IS? ,TH-COTTON-BALLS ,FL-WORN>
+                                   <SET LOCK? 1>
+                                   <TELL "The dial turns with a series of muffled clicks." CR>)
+                                  (<MC-IS? ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                                   <SET LOCK? 2>
+                                   <TELL "Clunk." CR>)
+                                  (<NOT <EQUAL? ,TH-DIAL-AUX1 ,GL-PRSI>>
+                                   <SET LOCK? 1>
+                                   <TELL "Clunk." CR>)
+                                  (T
+                                   <SETG TH-DIAL-AUX2 <+ ,TH-DIAL-AUX2 1>>)>
+                            <COND (<EQUAL? .LOCK? 1> T)
+                                  (<EQUAL? ,TH-DIAL-AUX2 1>
+                                   <SETG TH-DIAL-AUX1 ,TH-RIGHT>
+                                   <TELL "Whirr." CR>)
+                                  (<EQUAL? ,TH-DIAL-AUX2 2>
+                                   <SETG TH-DIAL-AUX1 ,TH-LEFT>
+                                   <TELL "Click." CR>)
+                                  (<EQUAL? ,TH-DIAL-AUX2 3>
+                                   <SETG TH-DIAL-AUX1 ,TH-RIGHT>
+                                   <TELL "Click." CR>)
+                                  (<EQUAL? ,TH-DIAL-AUX2 4>
+                                   <SETG TH-DIAL-AUX1 ,TH-RIGHT>
+                                   <TELL "Whirr." CR>)
+                                  (<EQUAL? ,TH-DIAL-AUX2 5>
+                                   <SET LOCK? 2>
+                                   <TELL "Click. Kerchunk. The vault door swings open." CR>
+                                   <SET WHO <RT-WHO-SAYS?>>
+                                   <COND (<EQUAL? .WHO ,CH-HOLMES>
+                                          <TELL CR
+"Holmes says, \"Splendid, Watson. The net is drawing ever tighter
+around our quarry.\"" CR>)>
+                                   <SET PTS <GETP ,LG-BANK-VAULT-DOOR
+                                                  ,P?VALUE>>
+                                   <COND (<NOT <ZERO? .PTS>>
+                                          <RT-UPDATE-SCORE .PTS>
+                                          <PUTP ,LG-BANK-VAULT-DOOR
+                                                ,P?VALUE 0>)>)>)
+                           (T
+                            <RT-IMPOSSIBLE-MSG>)>
+                     <COND (<EQUAL? .LOCK? 1>
+                            <SETG TH-DIAL-AUX1 0>
+                            <SETG TH-DIAL-AUX2 0>)
+                           (<EQUAL? .LOCK? 2>
+                            <SETG TH-DIAL-AUX1 -1>
+                            <SETG TH-DIAL-AUX2 -1>
+                            <MC-UNMAKE ,LG-BANK-VAULT-DOOR ,FL-LOCKED>
+                            <MC-MAKE ,LG-BANK-VAULT-DOOR ,FL-OPENED>)>
+                     <RTRUE>)
+                    (<MC-VERB? SHOOT>
+                     <TELL ,K-RICOCHET-MSG CR>)>)>>
+
+<ROUTINE RT-AC-TH-BOXES ("OPT" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-BOXES">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <TELL
+"There are rows and rows of safety deposit boxes, all alike, numbered from 1
+to 999." CR>)
+             (<MC-VERB? UNLOCK LOCK OPEN CLOSE READ>
+              <TELL ,K-SPECIFY-MSG "box by number." CR>
+              <RFATAL>)
+             (<MC-VERB? SHOOT>
+              <TELL ,K-RICOCHET-MSG CR>)>>
+
+<ROUTINE RT-AC-TH-GUARDS-POCKET ()
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-GUARDS-POCKET">>
+       <COND (<MC-VERB? LOOK-INSIDE EXAMINE SEARCH>
+              <RT-CYOU-MSG>
+              <TELL "can't see inside the guard's pocket." CR>
+              <RTRUE>)
+             (<MC-VERB? PUT>
+              <RT-IMPOSSIBLE-MSG>
+              <RTRUE>)
+             (<MC-VERB? TAKE EMPTY REACH-IN STEAL>
+              <TELL
+CTHE ,CH-BANK-GUARD " slaps the offending hand away and says, \"Keep your
+hands to yourself, mate.\"" CR>
+              <RTRUE>)>>
+
+<ROUTINE RT-AC-CH-BANK-GUARD ("OPTIONAL" (CONTEXT <>) "AUX" GEMCNT OBJ)
+  <DEBUGGING? <RT-DEBUG-CH-AC "CH-BANK-GUARD" .CONTEXT>>
+  <RT-THIS-IS-IT ,CH-BANK-GUARD>
+  <COND (<==? .CONTEXT ,K-M-DESCFCN>
+        <TELL
+CTHE ,CH-BANK-GUARD " is lounging against the wall, idly jangling some keys
+in his pocket and waiting for girls to walk by." CR>
+        <RTRUE>)
+       (<RT-TELL-ABOUT? ,CH-BANK-GUARD>
+        <SET OBJ <COND (<MC-VERB? WHO WHAT>
+                        ,GL-PRSO)
+                       (T
+                        ,GL-PRSI)>>
+        <TELL ,K-GUARD-IGNORES-MSG CR>)
+       (<RT-WHO-WHAT-FAIL?>
+        <RFATAL>)
+       (<MC-THIS-WINNER?>
+        <COND (<MC-VERB? GIVE>
+               <COND (<MC-PRSO? ,TH-BOX-KEY ,TH-GUARDS-KEYS>
+                      <TELL ,K-SORRY-MATE-MSG CR>)
+                     (<MC-PRSO? ,TH-OPAL ,TH-RUBY ,TH-SAPPHIRE ,TH-EMERALD>
+                      <TELL ,K-ILL-HOLD-IT-MSG CR>)>)
+              (T
+               <TELL ,K-GUARD-IGNORES-MSG CR>)>)
+       (<MC-THIS-PRSI?>
+        <COND (<MC-VERB? GIVE>
+               <COND (<MC-PRSO? ,TH-OPAL ,TH-RUBY ,TH-SAPPHIRE ,TH-EMERALD>
+                      <MOVE ,GL-PRSO ,CH-BANK-GUARD>
+                      <MC-MAKE ,GL-PRSO ,FL-NOALL>
+                      <SET GEMCNT ,CH-BANK-GUARD-AUX1>
+                      <INC GEMCNT>
+                      <SETG CH-BANK-GUARD-AUX1 .GEMCNT>
+                      <COND (<EQUAL? .GEMCNT 1>
+                             ;<COND (<MC-F? <BAND ,CH-HOLMES-AUX1
+                                                 ,K-HOLMES-GEM?>>
+                                    <SETG CH-HOLMES-AUX1 <BOR ,CH-HOLMES-AUX1
+                                                              ,K-HOLMES-GEM?>>
+                                    <MOVE ,TH-RING ,CH-PLAYER>
+                                    <MC-MAKE ,TH-RING ,FL-SEEN>
+                                    <MC-MAKE ,TH-RING ,FL-TOUCHED>
+                                    <MC-UNMAKE ,TH-RING ,FL-NODESC>
+                                    <TELL
+"Holmes intercepts the gem on it's way to the guard. He">
+                                    <RT-HOLMES-SAYS-AGRA-MSG>
+                                    <RT-UPDATE-SCORE <GETP ,TH-RING ,P?VALUE>>
+                                    <PUTP ,TH-RING ,P?VALUE 0>)>
+                             <TELL
+"\"Now this is very nice. But I think I would need more than just one to make
+letting you in worth my while. I'll hold this for you until you come back.\""
+CR>)
+                            (<EQUAL? .GEMCNT 2>
+                             <TELL
+"\"This is even more beautiful than the other one. But it isn't worth taking
+the risk for only two of them.\"" CR>)
+                            (<EQUAL? .GEMCNT 3>
+                             <TELL "\"One more and you're in.\"" CR>)
+                            (<EQUAL? .GEMCNT 4>
+                             <TELL
+CTHE ,CH-BANK-GUARD " looks furtively up and down the street. Then he
+whispers to you out of the side of his mouth, \"Good enough. Go on in.\"" CR>
+                             <RT-UPDATE-SCORE 3>)>
+                      <RTRUE>)
+                     (<MC-PRSO? ,TH-BOX-KEY>
+                      <MOVE ,TH-BOX-KEY ,TH-GUARDS-POCKET>
+                      <TELL
+CTHE ,CH-BANK-GUARD " looks surprised and says, \"Ta, mate. I didn't know
+I dropped it. I'll have to keep it in a safer place.\" He puts the key
+into one of his inside pockets." CR>)
+                     (<MC-PRSO? ,TH-RED-GLASS>
+                      <TELL
+CTHE ,CH-BANK-GUARD " looks at it carefully and then hands it back
+to you, saying, \"For a moment there, I thought this was a ruby. But
+it's only a piece of glass.\"" CR CR ,K-MORE-VALUABLE-MSG CR>)
+                     (T
+                      <TELL
+CTHE ,CH-BANK-GUARD " examines what you are offering and then declines
+your bribe." CR CR ,K-MORE-VALUABLE-MSG CR>)>)
+              (<MC-VERB? TAKE>
+               <COND (<MC-PRSO? ,TH-OPAL ,TH-RUBY ,TH-SAPPHIRE ,TH-EMERALD>
+                      <TELL ,K-ILL-HOLD-IT-MSG CR>)
+                     (<MC-PRSO? ,TH-BOX-KEY ,TH-GUARDS-KEYS>
+                      <TELL ,K-SORRY-MATE-MSG CR>)
+                     (<MC-PRSO? CH-BANK-GUARD>
+                      <TELL CTHE ,CH-BANK-GUARD ,K-MUST-WEIGH-MSG CR>)>)
+              (<MC-VERB? SHOW>
+               <COND (<MC-PRSO? ,TH-OPAL ,TH-RUBY ,TH-SAPPHIRE ,TH-EMERALD
+                                ,TH-RED-GLASS>
+                      <TELL "\"My, what a loverly gem!\"" CR>)
+                     (<MC-PRSO? ,TH-BOX-KEY>
+                      <MOVE ,TH-BOX-KEY ,TH-GUARDS-POCKET>
+                      <TELL
+CTHE ,CH-BANK-GUARD " looks surprised and says, \"Oh! Thank you. I must have
+dropped it. I'll be sure to keep it in a safer place.\" He takes the key and
+puts it in one of his inside pockets." CR>)>)>)
+       (<MC-THIS-PRSO?>
+        <COND (<MC-VERB? TAKE>
+               <COND (<MC-PRSI? <>>
+                      <TELL CTHE ,CH-BANK-GUARD ,K-MUST-WEIGH-MSG CR>)>)
+              (<MC-VERB? ASK-FOR>
+               <COND (<MC-PRSI? ,TH-BOX-KEY ,TH-GUARDS-KEYS>
+                      <TELL ,K-SORRY-MATE-MSG CR>)
+                     (<MC-PRSI? ,TH-OPAL ,TH-RUBY ,TH-SAPPHIRE ,TH-EMERALD>
+                      <TELL ,K-ILL-HOLD-IT-MSG CR>)>)>)>>
+
+<GLOBAL WIGGINS-COLD? <>>
+
+<ROUTINE RT-AC-CH-WIGGINS ("OPTIONAL" (CONTEXT <>) OBJ)
+  <DEBUGGING? <RT-DEBUG-CH-AC "CH-WIGGINS" .CONTEXT>>
+  <RT-THIS-IS-IT ,CH-WIGGINS>
+  <COND (<AND <MC-THIS-WINNER?>
+             <FSET? ,GL-WINNER ,FL-ASLEEP>>
+        <RT-NO-CONDITION-MSG ,GL-WINNER>
+        <RTRUE>)
+       (<AND <==? .CONTEXT ,K-M-CONT>
+             <FSET? ,CH-WIGGINS ,FL-ASLEEP>>
+        <TELL "It's bad enough that you wasted the etherium; using it to
+steal from your friends is quite unsporting. ">
+        <RTRUE>)
+       (<==? .CONTEXT ,K-M-DESCFCN>
+        <COND (<FSET? ,CH-WIGGINS ,FL-ASLEEP>
+               <TELL "Wiggins is still suffering from the effects of the
+etherium gas." CR>
+               <RTRUE>)
+              (<MC-IS? ,CH-WIGGINS ,FL-BROKEN>
+               <MC-UNMAKE ,CH-WIGGINS ,FL-BROKEN>
+               <MC-UNMAKE ,CH-WIGGINS ,FL-NODESC>
+               <MC-MAKE ,CH-WIGGINS ,FL-SEEN>
+               <TELL
+"After staring at his dirty face for a few moments, you suddenly
+recognize the boy. He is Wiggins, the head of the Baker Street
+Irregulars, which is Holmes's unofficial army of street urchins
+who \"go everywhere and do everything.\"" CR>)>
+        <TELL <RT-PICK-NEXT ,GL-WIGGINS-DESC-TXT>>
+        <COND (<IN? ,CH-WIGGINS ,TH-BOAT>
+               <TELL ,K-ENJOYING-RIDE-MSG>)
+              (<OR <IN? ,CH-WIGGINS ,TH-HANSOM-CAB>
+                   <IN? ,CH-WIGGINS ,TH-GROWLER-CAB>>
+               <TELL ,K-FIDGETING-MSG>)
+              (T
+               <TELL <RT-PICK-NEXT ,GL-WIGGINS-LOOK-TXT>>)>
+        <TELL "." CR>
+        <RETURN 2>)
+       (<RT-TELL-ABOUT? ,CH-WIGGINS>
+        <SET OBJ <COND (<MC-VERB? WHO WHAT>
+                        ,GL-PRSO)
+                       (T
+                        ,GL-PRSI)>>
+        <COND (<MC-IS? ,CH-WIGGINS ,FL-ASLEEP>
+               <RT-NO-CONDITION-MSG ,CH-WIGGINS>)
+              (<AND <MC-VERB? WHO>
+                    <EQUAL? .OBJ ,CH-WIGGINS>>
+               <TELL
+                "\"I'm Wiggins, 'ead o' the Baker Street Irregulars.\""
+                CR>)
+              (<EQUAL? .OBJ ,CH-HOLMES>
+               <TELL "\"E's a good man, guv'nor. Best as ever was.\"" CR>)
+              (T
+               <TELL "\"Beats me. What do you think?\"" CR>)>)
+       (<RT-WHO-WHAT-FAIL?>
+        <RFATAL>)
+       (<MC-THIS-WINNER?>
+        <COND (<MC-VERB? HELLO>
+               <TELL "\"'Ello.\"" CR>)
+              (<MC-VERB? GOODBYE>
+               <TELL "\"Ta ta.\"" CR>)
+              (<MC-VERB? THANK>
+               <TELL "\"Anytime, mate.\"" CR>)
+              (<MC-VERB? WHERE>
+               <TELL "\"Beats me. What do you think?\"" CR>)
+              (<ZERO? ,CH-WIGGINS-AUX1>
+               <TELL CTHE ,CH-WIGGINS ,K-WOUNDED-PRIDE-MSG CR>)
+              (<MC-VERB? ENTER>
+               <COND (<AND <MC-PRSO? ,TH-BUTT-OF-MALMSEY>
+                           <NOT <FSET? ,GL-PRSO ,FL-BROKEN>>>
+                      ;<COND (<IN? ,CH-WIGGINS ,TH-BUTT-OF-MALMSEY>
+                             <TELL "He's already up to his ears in malmsey."
+                                   CR>)
+                            (T)>
+                      <SETG WIGGINS-COLD? T>
+                      <TELL
+"Wiggins dutifully climbs into the full butt of malmsey and has a
+nice bath and gets out again." CR>)
+                     (<MC-PRSO? ,TH-BUTT-OF-MALMSEY>
+                      <COND ;(<IN? ,CH-WIGGINS ,TH-BUTT-OF-MALMSEY>
+                             <TELL "He's already in it." CR>)
+                            (<IN? ,TH-GARNET ,TH-BUTT-OF-MALMSEY>
+                             <MOVE ,TH-GARNET ,CH-PLAYER>
+                             <RT-THIS-IS-IT ,TH-GARNET>
+                             <SETG WIGGINS-COLD? T>
+                             <MC-MAKE ,TH-GARNET ,FL-SEEN>
+                             <MC-MAKE ,TH-GARNET ,FL-TOUCHED>
+                             <MC-UNMAKE ,TH-GARNET ,FL-NODESC>
+                             <TELL
+"Wiggins climbs into the empty butt of malmsey, gets the gem, gets
+out and gives it to you." CR>
+                             <RT-UPDATE-SCORE <GETP ,TH-GARNET ,P?VALUE>>
+                             <PUTP ,TH-GARNET ,P?VALUE 0>
+                             <RTRUE>)
+                            (T
+                             <TELL
+                              "Wiggins says, \"Once was enough, thank you.\""
+                              CR>)>)
+                     (<MC-PRSO? ,TH-HANSOM-CAB ,TH-GROWLER-CAB ,TH-BOAT>
+                      <COND (<IN? ,CH-HOLMES ,RM-LAIR>
+                             <COND (<IN? ,CH-PLAYER ,GL-PRSO>
+                                    <TELL "Wiggins climbs in next to you."
+                                          CR>
+                                    <MOVE ,CH-WIGGINS ,GL-PRSO>)
+                                   (T
+                                    <TELL ,K-AFTER-YOU-MSG CR>)>
+                             <SETG GL-PUPPY ,CH-WIGGINS>
+                             <MC-UNMAKE ,CH-WIGGINS ,FL-NODESC>
+                             <MC-UNMAKE ,CH-WIGGINS ,FL-BROKEN>)
+                            (T
+                             <TELL ,K-CANT-LEAVE-MSG CR>)>)
+                     (<MC-PRSO? LG-WATER>
+                      <TELL
+"\"I ain't no bleedin' mermaid. Besides, bathing ain't 'ealthy.\"" CR>)>)
+              (<MC-VERB? TAKE STEAL>
+               <COND (<AND <MC-PRSO? ,TH-GARNET>
+                           <IN? ,TH-GARNET ,TH-BUTT-OF-MALMSEY>>
+                      <MOVE ,TH-GARNET ,CH-PLAYER>
+                      <RT-THIS-IS-IT ,TH-GARNET>
+                      <SETG WIGGINS-COLD? T>
+                      <MC-MAKE ,TH-GARNET ,FL-SEEN>
+                      <MC-MAKE ,TH-GARNET ,FL-TOUCHED>
+                      <MC-UNMAKE ,TH-GARNET ,FL-NODESC>
+                      <TELL CTHE ,CH-WIGGINS>
+                      <COND (<NOT <IN? ,CH-WIGGINS ,TH-BUTT-OF-MALMSEY>>
+                             <TELL " climbs into the empty butt of malsey,">)>
+                      <TELL " gets the gem, gets out, and gives it to you."
+                            CR>
+                      <RT-UPDATE-SCORE <GETP ,TH-GARNET ,P?VALUE>>
+                      <PUTP ,TH-GARNET ,P?VALUE 0>
+                      <RTRUE>)
+                     (<OR <MC-PRSO? ,TH-GUARDS-POCKET ,TH-BOX-KEY
+                                    ,TH-GUARDS-KEYS>
+                          <MC-PRSI? ,TH-GUARDS-POCKET ,CH-BANK-GUARD>>
+                      <RT-STEAL-KEY>
+                      <RTRUE>)
+                     (<MC-VERB? STEAL>
+                      <TELL
+"\"I would if I could, guv. But I don't see 'ow to do it.\"" CR>)>)
+              (<AND <MC-VERB? ROB>
+                    <MC-PRSO? ,CH-BANK-GUARD>>
+               <RT-STEAL-KEY>)
+              (<MC-VERB? EMPTY REACH-IN SEARCH>
+               <COND (<OR <MC-PRSO? ,TH-GUARDS-POCKET ,CH-BANK-GUARD>
+                          <MC-PRSI? ,TH-GUARDS-POCKET ,CH-BANK-GUARD>>
+                      <RT-STEAL-KEY>
+                      <RTRUE>)
+                     (T
+                      <TELL
+"\"I would if I could, guv. But I don't see 'ow to do it.\"" CR>)>)
+              (<MC-VERB? FOLLOW>
+               <COND (<MC-PRSO? ,CH-ME ,CH-PLAYER>
+                      <COND (<IN? ,CH-HOLMES ,RM-LAIR>
+                             <TELL "\"After you, guv.\"" CR>
+                             <SETG GL-PUPPY ,CH-WIGGINS>
+                             <MC-UNMAKE ,CH-WIGGINS ,FL-NODESC>
+                             <MC-UNMAKE ,CH-WIGGINS ,FL-BROKEN>)
+                            (T
+                             <TELL ,K-CANT-LEAVE-MSG CR>)>)
+                     (T
+                      <TELL "\"I'm not a bleedin' bloodhound.\"" CR>)>)
+              (<MC-VERB? WAIT>
+               <COND (<EQUAL? ,GL-PUPPY ,CH-WIGGINS>
+                      <SETG GL-PUPPY <>>
+                      <TELL "\"Right. I'm glued to this spot.\"" CR>)
+                     (T
+                      <TELL "\"Whatever you say, guv.\"" CR>)>)
+              (<MC-VERB? EXIT>
+               ;<COND (<EQUAL? ,GL-PUPPY ,CH-WIGGINS>
+                      <SETG GL-PUPPY <>>
+                      <TELL ,K-CAN-LEAVE-MSG CR>)
+                     (T
+                      <TELL ,K-CAN-LEAVE-MSG CR>)>
+               <TELL ,K-AFTER-YOU-MSG CR>)
+              (<AND <MC-VERB? PULL>
+                    <MC-PRSO? ,TH-PORTCULLIS-CHAIN>>
+               <TELL "\"I can't reach it, guv.\"" CR>)
+              (T
+               <TELL "Wiggins looks at you and scratches his head." CR>
+               <RTRUE>)>)
+       (<MC-THIS-PRSI?>
+        <COND (<MC-VERB? GIVE>
+               <COND (<MC-IS? ,CH-WIGGINS ,FL-ASLEEP>
+                      <RT-NO-CONDITION-MSG ,CH-WIGGINS "accept your offer">)
+                     (<MC-PRSO? ,TH-SHILLING>
+                      <MOVE ,TH-SHILLING ,CH-WIGGINS>
+                      <MC-MAKE ,TH-SHILLING ,FL-NOALL>
+                      <SETG CH-WIGGINS-AUX1 1>
+                      <COND (<F? ,GL-P-CONT>
+                             <SETG WINNER-IS-WIGGINS T>)>
+                      <SETG GL-P-QCONTEXT-TH ,CH-WIGGINS>
+                      <SETG GL-P-QCONTEXT-RM ,GL-PLACE-CUR>
+                      <TELL
+"Wiggins looks at " THE ,TH-SHILLING " and then at you. After a few
+moments he stuffs it deep into the recesses of his clothing and says, \"I'm
+all yours. Wot's the plan?\"" CR>)
+                     (<MC-PRSO? ,TH-EMERALD
+                                ,TH-SAPPHIRE
+                                ,TH-RUBY
+                                ,TH-OPAL
+                                ,TH-TOPAZ
+                                ,TH-GARNET
+                                ,TH-POUND-NOTE
+                                ,TH-SIXPENCE>
+                      <TELL "Wiggins glances at your offer and"
+                            ,K-WOUNDED-PRIDE-MSG CR>)
+                     (T
+                      <TELL
+"Wiggins looks at the item you have handed him and then returns it
+to you. Clearly it was not of interest to him." CR>)>
+               <RTRUE>)
+              (<AND <MC-VERB? TAKE>
+                    <MC-PRSO? ,TH-SHILLING>>
+               <COND (<MC-IS? ,CH-WIGGINS ,FL-ASLEEP>
+                      <TELL "He must have hidden it very well. ">
+                      <RT-CYOU-MSG>
+                      <TELL "can't find it." CR>)
+                     (T
+                      <TELL "\"Sorry, guv'nor. A deal's a deal.\"" CR>)>)>)
+       (<MC-THIS-PRSO?>
+        <COND (<MC-VERB? SMELL>
+               <COND (<T? ,WIGGINS-COLD?>
+                      <TELL ,K-EAU-DE-MSG CR>)
+                     (T
+                      <TELL "Yuck. Eau de urchin." CR>)>)>)>>
+
+<ROUTINE RT-AC-CH-BUTLER ("OPTIONAL" (CONTEXT <>) "AUX" WORD-NUM)
+       <DEBUGGING? <RT-DEBUG-CH-AC "CH-BUTLER" .CONTEXT>>
+       <RT-THIS-IS-IT ,CH-BUTLER>
+       <COND (<MC-THIS-WINNER?>
+              <COND (<MC-IS? ,CH-BUTLER ,FL-ASLEEP>
+                     <RT-NO-CONDITION-MSG ,CH-BUTLER>)
+                    (<AND <MC-VERB? TAKE FIND>
+                          <RT-IDENTIFY-EVENT? ,W?MYCROFT ,GL-PRSO>>
+                     <SETG GL-WINNER ,CH-PLAYER>
+                     <RT-PERFORM ,V?ASK-FOR ,CH-BUTLER ,TH-EVENT>
+                     <RTRUE>)
+                    (<MC-VERB? HELLO>
+                     <TELL "\"">
+                     <COND (<EQUAL? <RT-TIME-OF-DAY> 0>
+                            <TELL "How do you do?">)
+                           (<EQUAL? <RT-TIME-OF-DAY> 1 2>
+                            <TELL "Good day.">)
+                           (<EQUAL? <RT-TIME-OF-DAY> 3>
+                            <TELL "Good evening.">)>
+                     <TELL "\"" CR>)
+                    (<MC-VERB? GOODBYE>
+                     <TELL "\"">
+                     <COND (<EQUAL? <RT-TIME-OF-DAY> 0>
+                            <TELL "Good night">)
+                           (<EQUAL? <RT-TIME-OF-DAY> 1 2>
+                            <TELL "Good day">)
+                           (<EQUAL? <RT-TIME-OF-DAY> 3>
+                            <TELL "Good evening">)>
+                     <TELL ".\"" CR>)
+                    (<MC-VERB? THANK>
+                     <TELL "\"You're quite welcome.\"" CR>)
+                    (<AND <MC-VERB? WHO>
+                          <MC-PRSO? ,CH-BUTLER>>
+                     <TELL
+"\"I am one of the staff of this fine establishment.\"" CR>)
+                    (<MC-VERB? WHO WHAT WHERE>
+                     <TELL
+"\"I'm far too discreet to respond.\"" CR>)
+                    (<MC-VERB? YES NO>
+                     <TELL
+CTHE ,CH-BUTLER " looks at you expectantly." CR>)
+                    (<MC-VERB? RESCUE>
+                     <TELL "\"What can I do for you?\"" CR>)
+                    (T
+                     <TELL
+"\"I'm afraid I am unable to do that.\"" CR>)>)
+             (<MC-THIS-PRSO?>
+              <COND (<MC-VERB? ASK-FOR ASK-ABOUT>
+                     <COND (<MC-IS? ,CH-BUTLER ,FL-ASLEEP>
+                            <RT-NO-CONDITION-MSG ,CH-BUTLER>)
+                           (<RT-IDENTIFY-EVENT? ,W?MYCROFT ,GL-PRSI>
+                            <COND (<NOT <0? <ANDB ,MYCROFT-STATE 
+                                                       ,MYCROFT-LOCKED>>>
+                                   <TELL
+"\"I am very sorry but Mr Mycroft Holmes is not available at this time.
+Perhaps you would care to come back later?\"" CR>)
+                                  (<NOT <0? <ANDB ,MYCROFT-STATE
+                                                        ,MYCROFT-ASLEEP>>>
+                                   <SET-MYCROFT-STATE CLEAR ,MYCROFT-ASLEEP>
+                                   <TELL
+"The butler listens to you and then leaves. He comes back shortly." CR CR
+"\"Mr Mycroft Holmes requires that you offer some token to verify that you
+are indeed the person you claim to be. Give whatever it is to me and I will
+take it to him.\"" CR>)
+                                  (T
+                                   <TELL
+"The butler listens politely but insists that he can do nothing more for you
+than to deliver the token to Mr Mycroft Holmes." CR>)>)
+                           (<MC-PRSI? ,CH-HOLMES>
+                            <TELL
+"\"I am afraid that I know the younger Mr Holmes only by his somewhat
+colourful reputation.\"" CR>)
+                           (<MC-PRSI? ,CH-BUTLER>
+                            <TELL
+"\"I am well, sir. Thank you for asking.\"" CR>)
+                           (<MC-PRSI? ,CH-PLAYER ,CH-ME>
+                            <TELL
+"He looks down his nose at you and sniffs, \"I don't believe we've been
+introduced.\"" CR>)
+                           (<MC-PRSI? ,CH-MEMBERS>
+                            <TELL
+"\"They seem livelier than usual for this time of year.\"" CR>)
+                           (<MC-PRSI? ,RM-DIOGENES-CLUB>
+                            <TELL
+"The butler coughs deferentially, \"It is one of the most exclusive
+clubs in London, sir.\" He glances at your clothes. \"Membership is by
+invitation only.\"" CR>)
+                           (<MC-IS? ,GL-PRSI ,FL-PERSON>
+                            <COND (<MC-IS? ,GL-PRSI ,FL-PLURAL>
+                                   <TELL
+"\"Unfortunately, I can say nothing about them.\"" CR>)
+                                  (<MC-IS? ,GL-PRSI ,FL-FEMALE>
+                                   <TELL
+"\"I am sorry but I can tell you nothing about her.\"" CR>)
+                                  (T
+                                   <TELL
+"\"Much to my regret I can tell you nothing about him.\"" CR>)>)
+                           (T
+                            <TELL
+"\"I'm afraid I wouldn't know anything about that.\"" CR>)>)>)
+             (<MC-THIS-PRSI?>
+              <COND (<MC-VERB? GIVE>
+                     <COND (<MC-IS? ,CH-BUTLER ,FL-ASLEEP>
+                            <RT-NO-CONDITION-MSG ,CH-BUTLER "accept your offer">)
+                           (<NOT <0? <ANDB ,MYCROFT-STATE ,MYCROFT-LOCKED>>>
+                            <TELL
+"The butler politely declines to take the gift you have offered." CR>)
+                           (<NOT <0? <ANDB ,MYCROFT-STATE ,MYCROFT-ASLEEP>>>
+                            <TELL
+"The butler refuses to take the item you have offered and asks if you
+have come to speak with someone here in the club." CR>)
+                           (<MC-PRSO? ,TH-RING>
+                            <SET-MYCROFT-STATE SET ,MYCROFT-LOCKED
+                                                        ,MYCROFT-SEEN>
+                            <REMOVE ,TH-RING>
+                            <TELL ,K-BUTLER-ACCEPTS-MSG CR CR
+"After a few moments, Mycroft Holmes appears. He looks very worried." CR CR 
+"\"Sherlock warned me that you might come,\" he says. \"And the fact
+that you are here indicates that he is indeed in trouble. I believe that
+in order to solve this mystery, you are going to have to go to the Tower
+of London. It will be closed, but you can give the password '">
+                            <SET WORD-NUM <RANDOM 6>>
+                            <SETG PASSWORD-ID .WORD-NUM>
+                            <COND (<EQUAL? .WORD-NUM 1>
+                                   <TELL "Boleyn">)
+                                  (<EQUAL? .WORD-NUM 2>
+                                   <TELL "Cleves">)
+                                  (<EQUAL? .WORD-NUM 3>
+                                   <TELL "Howard">)
+                                  (<EQUAL? .WORD-NUM 4>
+                                   <TELL "Parr">)
+                                  (<EQUAL? .WORD-NUM 5>
+                                   <TELL "Aragon">)
+                                  (<EQUAL? .WORD-NUM 6>
+                                   <TELL "Seymour">)>
+                            <TELL
+"' to the guard at the Byward Tower. He will let you in. Good luck.\"" CR CR
+"Mycroft pauses before he goes and looks at you meditatively, as if
+trying to decide if he can put his faith in you to rescue his
+brother. After a moment he gives his head an unconscious nod, then
+turns around and disappears back into the club." CR>
+                            <RT-UPDATE-SCORE 1>
+                            <RTRUE>)
+                           (T
+                            <TELL ,K-BUTLER-ACCEPTS-MSG CR CR
+"The butler soon returns looking concerned." CR CR
+"\"I am sorry but Mr Mycroft Holmes says this will not do. Do you have
+anything else?\"" CR>)>)>)>>
+
+<ROUTINE RT-AC-LG-BANK-VAULT-DOOR ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-LG-AC "LG-BANK-VAULT-DOOR" .CONTEXT>>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<EQUAL? ,GL-PLACE-CUR ,RM-BANK-OF-ENGLAND>
+                     <RT-OPEN-CLOSED-MSG ,LG-BANK-VAULT-DOOR>
+                     <CRLF> <CRLF>
+                     <TELL "In the middle of the door you see a big shiny dial." CR>
+                     <RTRUE>)
+                    (T
+                     <RT-OPEN-CLOSED-MSG ,LG-BANK-VAULT-DOOR>
+                     <CRLF> <CRLF>
+                     <TELL "The inside of the door is shiny and flat." CR>
+                     <RTRUE>)>)
+             (<MC-VERB? OPEN>
+              <COND (<MC-IS? ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                     <TELL "The vault door is already open." CR>)
+                    (<MC-IS? ,LG-BANK-VAULT-DOOR ,FL-LOCKED>
+                     <TELL "The vault door is locked." CR>)
+                    (T
+                     <MC-MAKE ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                     <TELL "The vault door swings open." CR>)>)
+             (<MC-VERB? CLOSE>
+              <COND (<MC-ISNOT? ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                     <TELL "The vault door is already closed." CR>)
+                    (T
+                     <MC-UNMAKE ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                     <MC-MAKE ,LG-BANK-VAULT-DOOR ,FL-LOCKED>
+                     <SETG TH-DIAL-AUX1 0>
+                     <SETG TH-DIAL-AUX2 0>
+                     <TELL "The vault door swings closed and locks">
+                     <COND (<IN? ,CH-PLAYER ,RM-BANK-VAULT>
+                            <TELL " you in. Whoops!" CR CR>
+                            <RT-QSR>)
+                           (T
+                            <TELL "." CR>)>)>)
+             (<MC-VERB? ENTER THROUGH>
+              <COND (<MC-HERE? ,RM-BANK-VAULT>
+                     <RT-DO-WALK ,P?EAST>)
+                    (<MC-HERE? ,RM-BANK-OF-ENGLAND>
+                     <RT-DO-WALK ,P?WEST>)>)
+             (<MC-VERB? LOOK-INSIDE>
+              <COND (<MC-IS? ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                     <RT-CYOU-MSG "see" "sees">
+                     <TELL "row upon row of " D ,TH-BOXES "." CR>)
+                    (T
+                     <TELL CTHE ,LG-BANK-VAULT-DOOR " is closed." CR>)>)
+             (<MC-VERB? UNLOCK>
+              <COND (<MC-IS? ,LG-BANK-VAULT-DOOR ,FL-OPENED>
+                     <TELL CTHE ,LG-BANK-VAULT-DOOR " is already opened." CR>)
+                    (T
+                     <TELL ,K-HOW-TO-MSG CR>)>)
+             (<MC-VERB? SHOOT>
+              <TELL ,K-RICOCHET-MSG CR>)>>
+
+<ROUTINE RT-TOPAZ-MSG ()
+        <COND (<AND <==? ,GL-PRSO ,TH-TOPAZ>
+                    <==? ,GL-PUPPY ,CH-HOLMES>>
+               <TELL CR "Holmes plucks you by the sleeve and reaches into
+the box. \"Observe, Watson.\" He pulls out an almost invisible thread and
+examines it with glittering eyes. \"Muslin,\" he declares, more to himself
+than to you. \"Of Indian origin, and of the type used almost exclusively in
+the manufacture of turbans.\" He looks at you in triumph. \"Our case is
+almost complete, Doctor. The Agra gems, the Trichinopoly cigar, and now this
+strand of muslin.\"" CR CR
+
+"Holmes puts the strand into his pocket and explains. \"Moriarty - for reasons
+as yet unknown to us - has stolen the Crown Jewels. The Agra gems have somehow
+passed into his hands by way of this Indian accomplice, and he is using small
+pieces of it to lure me into a rendezvous with him. It's a dangerous game we
+play, Watson, but if we are to recover the regalia we have no choice.\"" CR>)>>
+
+
+
+           
\ No newline at end of file
diff --git a/bark.bin b/bark.bin
new file mode 100644 (file)
index 0000000..e7a91c3
Binary files /dev/null and b/bark.bin differ
diff --git a/ben2 b/ben2
new file mode 100644 (file)
index 0000000..f470e47
Binary files /dev/null and b/ben2 differ
diff --git a/benclk b/benclk
new file mode 100644 (file)
index 0000000..3e95dee
Binary files /dev/null and b/benclk differ
diff --git a/benclk-ss1 b/benclk-ss1
new file mode 100644 (file)
index 0000000..32aefd1
Binary files /dev/null and b/benclk-ss1 differ
diff --git a/boot.zabstr b/boot.zabstr
new file mode 100644 (file)
index 0000000..f459e3d
--- /dev/null
@@ -0,0 +1,32 @@
+
+<DEFINE-ROUTINE RT-META-IN?> 
+<DEFINE-ROUTINE RT-SEE-INSIDE?> 
+<DEFINE-ROUTINE RT-VISIBLE?> 
+<GLOBAL LAST-PSEUDO-LOC <> %<> WORD> 
+<DEFINE-ROUTINE CLOSED?> 
+<DEFINE-ROUTINE RT-ACCESSIBLE?> 
+<DEFINE-ROUTINE RT-DONT-ALL?> 
+<DEFINE-ROUTINE DPRINT> 
+<DEFINE-ROUTINE RT-A-PRINT> 
+<DEFINE-ROUTINE RT-THEO-PRINT> 
+<DEFINE-ROUTINE RT-CTHEO-PRINT> 
+<DEFINE-ROUTINE RT-THEI-PRINT> 
+<DEFINE-ROUTINE RT-CTHEI-PRINT> 
+<DEFINE-ROUTINE RT-PRINT-SPACES> 
+<DEFINE-ROUTINE SAY-NUMBER> 
+<DEFINE-ROUTINE RT-UPDATE-STATUS-LINE> 
+<DEFINE-ROUTINE RT-REFER-TO-MSG> 
+<DEFINE-ROUTINE RT-SAY-ROOM-NAME-IF-LIT> 
+<DEFINE-ROUTINE RT-DESCRIBE-PLACE> 
+<DEFINE-ROUTINE RT-EXEC-RM-DESCFCN> 
+<DEFINE-ROUTINE RT-DESCFCN-CONTEXT> 
+<DEFINE-ROUTINE RT-DESC-ALL> 
+<DEFINE-ROUTINE RT-GOTO> 
+<DEFINE-ROUTINE RT-RESET-THEM> 
+<DEFINE-ROUTINE RT-UPDATE-SCORE> 
+<DEFINE-ROUTINE RT-UPDATE-MOVES> 
+<DEFINE-ROUTINE RT-UPDATE-CLOCK> 
+<DEFINE-ROUTINE RT-MAIN-LOOP> 
+<DEFINE-ROUTINE RT-TOUCH-VERB?> 
+<DEFINE-ROUTINE RT-TALK-VERB?> 
+<DEFINE-ROUTINE RT-AC-CH-PLAYER> 
\ No newline at end of file
diff --git a/boot.zap b/boot.zap
new file mode 100644 (file)
index 0000000..3649197
--- /dev/null
+++ b/boot.zap
@@ -0,0 +1,737 @@
+
+
+       .FUNCT  RT-META-IN?,OBJ1,OBJ2
+?PRG1: ZERO?   OBJ1 /FALSE
+       IN?     OBJ1,ROOMS /FALSE
+       IN?     OBJ1,LOCAL-GLOBALS /FALSE
+       EQUAL?  OBJ1,OBJ2 /TRUE
+       LOC     OBJ1 >OBJ1
+       JUMP    ?PRG1
+
+
+       .FUNCT  RT-SEE-INSIDE?,THING
+       ZERO?   THING /FALSE
+       FSET?   THING,FL-SURFACE /TRUE
+       FSET?   THING,FL-CONTAINER \?CCL7
+       FSET?   THING,FL-OPENED /TRUE
+       FSET?   THING,FL-TRANSPARENT /TRUE
+?CCL7: FSET?   THING,FL-PERSON /?PRD15
+       FSET?   THING,FL-ALIVE \FALSE
+?PRD15:        EQUAL?  THING,CH-PLAYER /FALSE
+       RTRUE   
+
+
+       .FUNCT  RT-VISIBLE?,OBJ
+       CALL    RT-ACCESSIBLE?,OBJ,TRUE-VALUE
+       RSTACK  
+
+
+       .FUNCT  CLOSED?,WLOC,VISIBLE?
+       ZERO?   WLOC /FALSE
+       FSET?   WLOC,FL-OPENED /FALSE
+       ZERO?   VISIBLE? /?PRD7
+       FSET?   WLOC,FL-TRANSPARENT /FALSE
+?PRD7: FSET?   WLOC,FL-SURFACE /FALSE
+       FSET?   WLOC,FL-ALIVE /FALSE
+       IN?     WLOC,ROOMS \TRUE
+       RFALSE  
+
+
+       .FUNCT  RT-ACCESSIBLE?,OBJ,VISIBLE?,LOC,OLOC,WLOC,RMG,RMGL
+       GETPT   GL-PLACE-CUR,P?GLOBAL >RMG
+       PTSIZE  RMG >RMGL
+       ZERO?   OBJ \?CCL3
+       SET     'GL-CLOSED-OBJECT,FALSE-VALUE
+       RFALSE  
+?CCL3: EQUAL?  OBJ,ROOMS /TRUE
+       EQUAL?  OBJ,PSEUDO-OBJECT \?CND1
+       EQUAL?  LAST-PSEUDO-LOC,GL-PLACE-CUR /TRUE
+       RFALSE  
+?CND1: LOC     GL-WINNER >WLOC
+?PRG9: IN?     WLOC,ROOMS /?REP10
+       CALL    CLOSED?,WLOC,VISIBLE?
+       ZERO?   STACK \?REP10
+       LOC     WLOC >WLOC
+       JUMP    ?PRG9
+?REP10:        SET     'OLOC,OBJ
+       EQUAL?  OLOC,WLOC /TRUE
+?PRG18:        ZERO?   OLOC /FALSE
+       IN?     OLOC,GLOBAL-OBJECTS /?CCL23
+       INTBL?  OLOC,RMG,RMGL,1 \?CND22
+?CCL23:        IN?     OLOC,ROOMS \TRUE
+       EQUAL?  OLOC,OBJ /TRUE
+       RFALSE  
+?CND22:        IN?     OLOC,ROOMS /FALSE
+       LOC     OLOC >OLOC
+       EQUAL?  OLOC,WLOC /TRUE
+       CALL    CLOSED?,OLOC,VISIBLE?
+       ZERO?   STACK /?PRG18
+       IN?     OLOC,GLOBAL-OBJECTS /TRUE
+       INTBL?  OLOC,RMG,RMGL,1 /TRUE
+       SET     'GL-CLOSED-OBJECT,OLOC
+       SET     'GL-IN-OUT,TRUE-VALUE
+       RFALSE  
+
+
+       .FUNCT  RT-DONT-ALL?,O,I,L
+       LOC     O >L
+       ZERO?   L /TRUE
+       EQUAL?  O,I /TRUE
+       FSET?   O,FL-BODYPART /TRUE
+       FSET?   O,FL-NOALL /TRUE
+       EQUAL?  GL-PRSA,V?TAKE \?CCL11
+       ZERO?   I \?CCL14
+       CALL    RT-META-IN?,O,GL-WINNER
+       ZERO?   STACK /?CCL14
+       IN?     O,GL-WINNER /TRUE
+       GET     GL-P-NAMW,0
+       ZERO?   STACK /TRUE
+       GET     GL-P-BUTS,K-P-MATCHLEN
+       ZERO?   STACK \TRUE
+?CCL14:        FSET?   O,FL-TAKEABLE /?CCL22
+       FSET?   O,FL-TRYTAKE \TRUE
+?CCL22:        FSET?   L,FL-PERSON \?CCL26
+       EQUAL?  L,I \TRUE
+?CCL26:        FSET?   L,FL-CONTAINER \?CCL30
+       FSET?   L,FL-OPENED \TRUE
+?CCL30:        ZERO?   I /?CCL34
+       EQUAL?  L,I \TRUE
+       CALL2   RT-SEE-INSIDE?,I
+       ZERO?   STACK /TRUE
+       RFALSE  
+?CCL34:        EQUAL?  L,GL-PLACE-CUR /FALSE
+       CALL2   RT-SEE-INSIDE?,L
+       ZERO?   STACK /TRUE
+       RFALSE  
+?CCL11:        EQUAL?  GL-PRSA,V?DROP,V?PUT,V?PUT-ON /?CTR44
+       EQUAL?  GL-PRSA,V?THROW,V?THROW-OVER \FALSE
+?CTR44:        EQUAL?  O,TH-POCKET /TRUE
+       EQUAL?  L,TH-POCKET /TRUE
+       FSET?   O,FL-WORN /TRUE
+       EQUAL?  L,GL-WINNER /FALSE
+       RTRUE   
+
+
+       .FUNCT  DPRINT,O,X
+       FSET?   O,FL-HAS-SDESC \?CCL3
+       GETP    O,P?ACTION >X
+       ZERO?   X /?CCL3
+       CALL    X,K-M-SDESC
+       RSTACK  
+?CCL3: PRINTD  O
+       RTRUE   
+
+
+       .FUNCT  RT-A-PRINT,O
+       ICALL   RT-THEO-PRINT,O,FALSE-VALUE,K-DESC-A
+       RTRUE   
+
+
+       .FUNCT  RT-THEO-PRINT,O,CAP?,CLASS,?TMP1
+       ASSIGNED?       'CLASS /?CND1
+       SET     'CLASS,K-DESC-THE
+?CND1: ZERO?   O \?CND3
+       SET     'O,GL-PRSO
+?CND3: ZERO?   CAP? /?PRG7
+       DIROUT  K-D-SCR-OFF
+       DIROUT  K-D-TBL-ON,GL-DIROUT-TBL
+?PRG7: FSET?   O,FL-NOARTC /?CCL11
+       FSET?   O,FL-YOUR \?CCL14
+       PRINTI  "your"
+       JUMP    ?CND12
+?CCL14:        EQUAL?  CLASS,K-DESC-ANY \?CCL16
+       PRINTI  "any"
+       JUMP    ?CND12
+?CCL16:        EQUAL?  CLASS,K-DESC-THE /?CTR17
+       FSET?   O,FL-PLURAL \?CCL18
+       FSET?   O,FL-PERSON \?CCL18
+?CTR17:        PRINTI  "the"
+       JUMP    ?CND12
+?CCL18:        FSET?   O,FL-PLURAL \?CCL24
+       FSET?   O,FL-PERSON /?CCL24
+       PRINTI  "some"
+       JUMP    ?CND12
+?CCL24:        EQUAL?  O,LG-WATER /?CND12
+       FSET?   O,FL-VOWEL \?CCL30
+       PRINTI  "an"
+       JUMP    ?CND12
+?CCL30:        PRINTC  97
+?CND12:        PRINTC  32
+?CND9: EQUAL?  O,CH-ME \?CCL34
+       ZERO?   CAP? /?CCL34
+       PRINTI  "you"
+       JUMP    ?REP8
+?CCL11:        FSET?   O,FL-HAS-SDESC \?CND9
+       GETP    O,P?ACTION
+       ICALL   STACK,K-M-SDESC,CLASS
+       JUMP    ?REP8
+?CCL34:        ICALL2  DPRINT,O
+?REP8: ZERO?   CAP? /TRUE
+       DIROUT  K-D-TBL-OFF
+       DIROUT  K-D-SCR-ON
+       GETB    GL-DIROUT-TBL,2 >CAP?
+       LESS?   CAP?,97 /?CND39
+       GRTR?   CAP?,122 /?CND39
+       SUB     CAP?,32
+       PUTB    GL-DIROUT-TBL,2,STACK
+?CND39:        ADD     GL-DIROUT-TBL,2 >?TMP1
+       GET     GL-DIROUT-TBL,0
+       PRINTT  ?TMP1,STACK
+       RTRUE   
+
+
+       .FUNCT  RT-CTHEO-PRINT,O
+       CALL    RT-THEO-PRINT,O,TRUE-VALUE
+       RSTACK  
+
+
+       .FUNCT  RT-THEI-PRINT,I
+       ZERO?   I \?CND1
+       SET     'I,GL-PRSI
+?CND1: CALL2   RT-THEO-PRINT,I
+       RSTACK  
+
+
+       .FUNCT  RT-CTHEI-PRINT,I
+       ZERO?   I \?CND1
+       SET     'I,GL-PRSI
+?CND1: CALL    RT-THEO-PRINT,I,TRUE-VALUE
+       RSTACK  
+
+
+       .FUNCT  RT-PRINT-SPACES,N,AMT
+?PRG1: GRTR?   N,GL-BLANKS-LEN \?CCL5
+       SET     'AMT,GL-BLANKS-LEN
+       JUMP    ?CND3
+?CCL5: SET     'AMT,N
+?CND3: PRINTT  GL-BLANKS,AMT
+       SUB     N,AMT >N
+       GRTR?   N,0 /?PRG1
+       RTRUE   
+
+
+       .FUNCT  SAY-NUMBER,N,X
+       SET     'X,10000
+?PRG1: LESS?   N,X \?REP2
+       PRINTC  32
+       DIV     X,10 >X
+       LESS?   X,10 \?PRG1
+?REP2: PRINTN  N
+       RTRUE   
+
+
+       .FUNCT  RT-UPDATE-STATUS-LINE
+       GET     0,8
+       BTST    STACK,4 \?CND1
+       ICALL2  RT-INIT-SCREEN,TRUE-VALUE
+       GET     0,8
+       BAND    STACK,-5
+       PUT     0,8,STACK
+?CND1: SCREEN  K-S-WIN
+       HLIGHT  K-H-INV
+       EQUAL?  GL-PLACE-CUR,GL-PLACE-STS /?CND3
+       ZERO?   GL-SHORT-STAT? /?CCL7
+       CURSET  GL-SPLIT-ROW,1
+       JUMP    ?CND5
+?CCL7: CURSET  GL-SPLIT-ROW,2
+?CND5: ICALL2  RT-PRINT-SPACES,GL-STAT-MAX-ROOM
+       CURSET  GL-SPLIT-ROW,2
+       CALL    RT-SAY-ROOM-NAME-IF-LIT,GL-PLACE-CUR,FALSE-VALUE,TRUE-VALUE
+       ZERO?   STACK /?CCL10
+       SET     'GL-PLACE-STS,GL-PLACE-CUR
+       JUMP    ?CND3
+?CCL10:        SET     'GL-PLACE-STS,-1
+?CND3: EQUAL?  GL-SCORE-CUR,GL-SCORE-STS /?CND11
+       SET     'GL-SCORE-STS,GL-SCORE-CUR
+       ADD     GL-SCORE-HEADER-LEN,GL-STAT-S-POS
+       CURSET  GL-SPLIT-ROW,STACK
+       ICALL2  SAY-NUMBER,GL-SCORE-CUR
+?CND11:        CURSET  GL-SPLIT-ROW,GL-STAT-T-POS
+       ZERO?   GL-SHORT-STAT? /?CCL15
+       ICALL2  RT-CLK-DOW-MSG,3
+       PRINTC  32
+       ICALL2  RT-CLK-NTI-MSG,22
+       JUMP    ?CND13
+?CCL15:        ICALL2  RT-CLK-DOW-MSG,5
+       ADD     10,GL-STAT-T-POS
+       CURSET  GL-SPLIT-ROW,STACK
+       ICALL2  RT-CLK-NTI-MSG,7
+?CND13:        HLIGHT  K-H-NRM
+       SCREEN  K-S-NOR
+       RTRUE   
+
+
+       .FUNCT  RT-REFER-TO-MSG
+       PRINTR  "[To what are you referring?]"
+
+
+       .FUNCT  RT-SAY-ROOM-NAME-IF-LIT,HERE,FORCE?,SL?,LEN,MAXLEN,LC,X,CNT
+       ASSIGNED?       'HERE /?CND1
+       SET     'HERE,GL-PLACE-CUR
+?CND1: SET     'MAXLEN,300
+       SET     'CNT,2
+       ZERO?   SL? /?CND3
+       SET     'MAXLEN,GL-STAT-MAX-ROOM
+?CND3: ZERO?   FORCE? \?CTR6
+       ZERO?   GL-NOW-LIT? /?CCL7
+?CTR6: DIROUT  K-D-SCR-OFF
+       DIROUT  K-D-TBL-ON,GL-DIROUT-TBL
+       ICALL2  DPRINT,HERE
+       DIROUT  K-D-TBL-OFF
+       DIROUT  K-D-SCR-ON
+       GET     GL-DIROUT-TBL,0 >LEN
+       INC     'LEN
+       PUT     GL-DIROUT-TBL,0,0
+       GRTR?   LEN,1 \?CCL12
+       SET     'LC,32
+?PRG13:        GETB    GL-DIROUT-TBL,CNT >X
+       LESS?   X,97 /?CND15
+       GRTR?   X,122 /?CND15
+       EQUAL?  CNT,2 /?CCL20
+       EQUAL?  LC,32 \?CND15
+?CCL20:        SUB     X,32 >X
+?CND15:        PRINTC  X
+       SET     'LC,X
+       IGRTR?  'CNT,LEN /TRUE
+       GRTR?   CNT,MAXLEN \?PRG13
+       RTRUE   
+?CCL12:        GET     GL-DIROUT-TBL,2
+       PRINTC  STACK
+       RTRUE   
+?CCL7: PRINTI  "Darkness"
+       RFALSE  
+
+
+       .FUNCT  RT-DESCRIBE-PLACE,PLACE,LOOK
+       ZERO?   PLACE \?CND1
+       SET     'PLACE,GL-PLACE-CUR
+?CND1: CALL    RT-IS-LIT?,PLACE,TRUE-VALUE
+       ZERO?   STACK \?CND3
+       PRINT   K-TOO-DARK-MSG
+       CRLF    
+       RTRUE   
+?CND3: HLIGHT  K-H-BLD
+       ICALL   RT-SAY-ROOM-NAME-IF-LIT,PLACE,TRUE-VALUE
+       CRLF    
+       CRLF    
+       HLIGHT  K-H-NRM
+       ZERO?   LOOK /?CCL7
+       CALL    RT-EXEC-RM-DESCFCN,PLACE,K-M-DESC-3
+       RSTACK  
+?CCL7: FSET?   PLACE,FL-TOUCHED /?CCL9
+       FSET    PLACE,FL-TOUCHED
+       CALL    RT-EXEC-RM-DESCFCN,PLACE,K-M-DESC-1
+       RSTACK  
+?CCL9: EQUAL?  GL-DESC-LEVEL,2 \?CCL11
+       CALL    RT-EXEC-RM-DESCFCN,PLACE,K-M-DESC-2
+       RSTACK  
+?CCL11:        EQUAL?  GL-DESC-LEVEL,1 /TRUE
+       ZERO?   GL-DESC-LEVEL /FALSE
+       RFALSE  
+
+
+       .FUNCT  RT-EXEC-RM-DESCFCN,PLACE,CONTEXT,DF
+       FSET?   PLACE,FL-HAS-DESCFCN \TRUE
+       GETP    PLACE,P?ACTION
+       CALL    STACK,CONTEXT
+       ZERO?   STACK /TRUE
+       RFALSE  
+
+
+       .FUNCT  RT-DESCFCN-CONTEXT,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESC-1,K-M-DESC-2,K-M-DESC-3 /TRUE
+       RFALSE  
+
+
+       .FUNCT  RT-DESC-ALL,PLACE,LOOK,HOLMES-IN-HOUSE?
+       CALL    RT-DESCRIBE-PLACE,PLACE,LOOK
+       ZERO?   STACK /?CND1
+       ICALL   RT-DESCRIBE-PLACE-CONTENTS,PLACE,LOOK
+?CND1: CALL    RT-IS-LIT?,PLACE,TRUE-VALUE
+       ZERO?   STACK /TRUE
+       ZERO?   GL-PUPPY-MSG? \?CCL7
+       SET     'GL-PUPPY-MSG?,TRUE-VALUE
+       RTRUE   
+?CCL7: ZERO?   GL-PUPPY /TRUE
+       EQUAL?  GL-PUPPY,CH-HOLMES \?CCL11
+       CRLF    
+       CALL2   RT-PICK-NEXT,GL-HOLMES-DESC-TXT
+       PRINT   STACK
+       EQUAL?  GL-PLACE-CUR,RM-ENTRY-HALL,RM-PARLOUR,RM-VESTIBULE /?CCL13
+       EQUAL?  GL-PLACE-CUR,RM-HOLMES-STUDY,RM-HOLMES-BEDROOM \?CND12
+?CCL13:        SET     'HOLMES-IN-HOUSE?,TRUE-VALUE
+?CND12:        ZERO?   LOOK /?CCL18
+       IN?     CH-HOLMES,TH-BOAT \?CCL21
+       PRINT   K-SEASICK-MSG
+       JUMP    ?CND19
+?CCL21:        IN?     CH-HOLMES,TH-HANSOM-CAB /?CTR22
+       IN?     CH-HOLMES,TH-GROWLER-CAB \?CCL23
+?CTR22:        PRINT   K-SITTING-QUIETLY-MSG
+       JUMP    ?CND19
+?CCL23:        ZERO?   HOLMES-IN-HOUSE? /?CCL27
+       CALL2   RT-PICK-NEXT,GL-HOLMES-HOUSE-LOOK-TXT
+       PRINT   STACK
+       JUMP    ?CND19
+?CCL27:        FSET?   GL-PLACE-CUR,FL-INDOORS \?CCL29
+       CALL2   RT-PICK-NEXT,GL-HOLMES-INDOORS-LOOK-TXT
+       PRINT   STACK
+       JUMP    ?CND19
+?CCL29:        CALL2   RT-PICK-NEXT,GL-HOLMES-OUTDOORS-LOOK-TXT
+       PRINT   STACK
+?CND19:        PRINTR  "."
+?CCL18:        EQUAL?  GL-DESC-LEVEL,2,1 \TRUE
+       ZERO?   HOLMES-IN-HOUSE? /?CCL33
+       CALL2   RT-PICK-NEXT,GL-HOLMES-HOUSE-ENTER-TXT
+       PRINT   STACK
+       JUMP    ?CND31
+?CCL33:        FSET?   GL-PLACE-CUR,FL-INDOORS \?CCL35
+       CALL2   RT-PICK-NEXT,GL-HOLMES-INDOORS-ENTER-TXT
+       PRINT   STACK
+       JUMP    ?CND31
+?CCL35:        CALL2   RT-PICK-NEXT,GL-HOLMES-OUTDOORS-ENTER-TXT
+       PRINT   STACK
+?CND31:        PRINTR  "."
+?CCL11:        EQUAL?  GL-PUPPY,CH-WIGGINS \TRUE
+       CRLF    
+       CALL2   RT-PICK-NEXT,GL-WIGGINS-DESC-TXT
+       PRINT   STACK
+       ZERO?   LOOK /?CCL39
+       IN?     CH-WIGGINS,TH-BOAT \?CCL42
+       PRINT   K-ENJOYING-RIDE-MSG
+       JUMP    ?CND40
+?CCL42:        IN?     CH-WIGGINS,TH-HANSOM-CAB /?CTR43
+       IN?     CH-WIGGINS,TH-GROWLER-CAB \?CCL44
+?CTR43:        PRINT   K-FIDGETING-MSG
+       JUMP    ?CND40
+?CCL44:        CALL2   RT-PICK-NEXT,GL-WIGGINS-LOOK-TXT
+       PRINT   STACK
+?CND40:        PRINTR  "."
+?CCL39:        EQUAL?  GL-DESC-LEVEL,2,1 \TRUE
+       CALL2   RT-PICK-NEXT,GL-WIGGINS-ENTER-TXT
+       PRINT   STACK
+       PRINTR  "."
+
+
+       .FUNCT  RT-GOTO,NEWPLACE,X,NEWLIT?,OLDPLACE,AMP?,SS?
+       SET     'OLDPLACE,GL-PLACE-CUR
+       MOVE    CH-PLAYER,NEWPLACE
+       SET     'GL-PLACE-CUR,NEWPLACE
+       CALL1   RT-IS-LIT? >NEWLIT?
+       MOVE    CH-PLAYER,OLDPLACE
+       SET     'GL-PLACE-CUR,OLDPLACE
+       ZERO?   NEWLIT? \?CND1
+       ICALL2  TOO-DARK-TO-GO,NEWPLACE
+       RTRUE   
+?CND1: GETP    GL-PLACE-CUR,P?ACTION
+       CALL    STACK,K-M-EXIT >X
+       FSET?   OLDPLACE,FL-INDOORS /?CND3
+       FSET?   NEWPLACE,FL-INDOORS /?CND3
+       ICALL   RT-CLOCK-JMP,0,5,0
+?CND3: SET     'GL-PLACE-PRV,OLDPLACE
+       SET     'GL-PLACE-CUR,NEWPLACE
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+       MOVE    CH-PLAYER,GL-PLACE-CUR
+       GETP    GL-PLACE-CUR,P?ACTION
+       CALL    STACK,K-M-ENTERING >X
+       ZERO?   GL-PUPPY /?CCL9
+       LOC     CH-PLAYER
+       MOVE    GL-PUPPY,STACK
+       JUMP    ?CND7
+?CCL9: ZERO?   GL-FORMER-PUPPY /?CND7
+       IN?     GL-FORMER-PUPPY,GL-PLACE-CUR \?CND7
+       FSET?   GL-FORMER-PUPPY,FL-ASLEEP /?CND7
+       SET     'GL-PUPPY,GL-FORMER-PUPPY
+       SET     'GL-FORMER-PUPPY,FALSE-VALUE
+?CND7: ICALL1  RT-DESC-ALL
+       IN?     TH-ETHERIUM-AMPOULE,CH-PLAYER \?PST15
+       FSET?   TH-ETHERIUM-AMPOULE,FL-BROKEN /?PRD18
+       SET     'AMP?,1
+       JUMP    ?PEN14
+?PRD18:        SET     'AMP?,0
+       JUMP    ?PEN14
+?PST15:        SET     'AMP?,0
+?PEN14:        FSET?   TH-STETHOSCOPE,FL-WORN /?PRD20
+       PUSH    0
+       JUMP    ?PRD21
+?PRD20:        PUSH    1
+?PRD21:        SET     'SS?,STACK
+       ZERO?   AMP? \?CCL23
+       ZERO?   SS? /?CND22
+?CCL23:        ICALL   HOLMES-COMPLAINS,AMP?,SS?
+?CND22:        GETP    GL-PLACE-CUR,P?ACTION
+       CALL    STACK,K-M-ENTERED >X
+       ICALL1  RT-RESET-THEM
+       IN?     TH-ETHERIUM-GAS,GL-PLACE-CUR \TRUE
+       ICALL1  RT-SMELL-ETHERIUM?
+       RTRUE   
+
+
+       .FUNCT  RT-RESET-THEM
+       CALL2   RT-VISIBLE?,GL-P-IT-OBJECT
+       ZERO?   STACK \?CND1
+       SET     'GL-P-IT-OBJECT,TH-NOT-HERE-OBJECT
+?CND1: CALL2   RT-VISIBLE?,GL-P-THEM-OBJECT
+       ZERO?   STACK \?CND3
+       SET     'GL-P-THEM-OBJECT,TH-NOT-HERE-OBJECT
+?CND3: CALL2   RT-VISIBLE?,GL-P-HIM-OBJECT
+       ZERO?   STACK \?CND5
+       SET     'GL-P-HIM-OBJECT,TH-NOT-HERE-OBJECT
+?CND5: CALL2   RT-VISIBLE?,GL-P-HER-OBJECT
+       ZERO?   STACK \TRUE
+       SET     'GL-P-HER-OBJECT,TH-NOT-HERE-OBJECT
+       RTRUE   
+
+
+       .FUNCT  RT-UPDATE-SCORE,PTS
+       ASSIGNED?       'PTS /?CND1
+       SET     'PTS,1
+?CND1: ADD     GL-SCORE-CUR,PTS >GL-SCORE-CUR
+       CALL2   RT-NEW-SCORE-MSG,PTS
+       RSTACK  
+
+
+       .FUNCT  RT-UPDATE-MOVES,MVS
+       ASSIGNED?       'MVS /?CND1
+       SET     'MVS,1
+?CND1: ZERO?   GL-CLOCK-WAIT \FALSE
+       ZERO?   GL-CLOCK-STOP \FALSE
+       ADD     GL-MOVES-CUR,MVS >GL-MOVES-CUR
+       RETURN  GL-MOVES-CUR
+
+
+       .FUNCT  RT-UPDATE-CLOCK,HRS,MIN,SEC
+       ZERO?   HRS \?CCL2
+       ZERO?   MIN \?CCL2
+       ZERO?   SEC /?CND1
+?CCL2: ICALL   RT-DO-CLOCK-SET,GL-TIME-UPDT-INC,HRS,MIN,SEC
+?CND1: CALL1   RT-CLOCK-INC
+       RSTACK  
+
+
+       .FUNCT  RT-MAIN-LOOP,ICNT,OCNT,NUM,CNT,OBJ,TBL,V,PTBL,OBJ1,TMP,X,TOUCH-VERB?,MYCROFT?,TV,?TMP1
+?PRG1: SET     'CNT,0
+       SET     'OBJ,FALSE-VALUE
+       SET     'PTBL,TRUE-VALUE
+       SET     'GL-P-MULT?,FALSE-VALUE
+       EQUAL?  GL-PLACE-CUR,GL-P-QCONTEXT-RM /?CND3
+       SET     'GL-P-QCONTEXT-TH,FALSE-VALUE
+?CND3: CALL1   RT-PARSER >GL-P-GOOD
+       ZERO?   GL-P-GOOD /?CCL7
+       GET     GL-P-PRSI,K-P-MATCHLEN >ICNT
+       GET     GL-P-PRSO,K-P-MATCHLEN >OCNT
+       ZERO?   GL-P-IT-OBJECT /?CND8
+       CALL2   RT-ACCESSIBLE?,GL-P-IT-OBJECT
+       ZERO?   STACK /?CND8
+       SET     'TMP,FALSE-VALUE
+?PRG12:        IGRTR?  'CNT,ICNT /?REP13
+       GET     GL-P-PRSI,CNT
+       EQUAL?  STACK,TH-IT \?PRG12
+       PUT     GL-P-PRSI,CNT,GL-P-IT-OBJECT
+       SET     'TMP,TRUE-VALUE
+?REP13:        ZERO?   TMP \?CND19
+       SET     'CNT,0
+?PRG21:        IGRTR?  'CNT,OCNT /?CND19
+       GET     GL-P-PRSO,CNT
+       EQUAL?  STACK,TH-IT \?PRG21
+       PUT     GL-P-PRSO,CNT,GL-P-IT-OBJECT
+?CND19:        SET     'CNT,0
+?CND8: ZERO?   OCNT \?CCL30
+       SET     'NUM,OCNT
+       JUMP    ?CND28
+?CCL30:        GRTR?   OCNT,1 \?CCL32
+       SET     'TBL,GL-P-PRSO
+       ZERO?   ICNT \?CCL35
+       SET     'OBJ,FALSE-VALUE
+       JUMP    ?CND33
+?CCL35:        GET     GL-P-PRSI,1 >OBJ
+?CND33:        SET     'NUM,OCNT
+       JUMP    ?CND28
+?CCL32:        GRTR?   ICNT,1 \?CCL37
+       SET     'PTBL,FALSE-VALUE
+       SET     'TBL,GL-P-PRSI
+       GET     GL-P-PRSO,1 >OBJ
+       SET     'NUM,ICNT
+       JUMP    ?CND28
+?CCL37:        SET     'NUM,1
+?CND28:        ZERO?   OBJ \?CND38
+       EQUAL?  ICNT,1 \?CND38
+       GET     GL-P-PRSI,1 >OBJ
+?CND38:        EQUAL?  GL-PRSA,V?WALK \?CCL44
+       CALL    RT-PERFORM,GL-PRSA,GL-PRSO >V
+       JUMP    ?CND42
+?CCL44:        ZERO?   NUM \?CCL46
+       GETB    GL-P-SYNTAX,0
+       SHIFT   STACK,-6
+       ZERO?   STACK \?CCL49
+       CALL2   RT-PERFORM,GL-PRSA >V
+       SET     'GL-PRSO,FALSE-VALUE
+       JUMP    ?CND42
+?CCL49:        ZERO?   GL-NOW-LIT? \?CCL51
+       ICALL1  RT-P-CLEAR
+       PRINT   K-TOO-DARK-MSG
+       CRLF    
+       JUMP    ?CND42
+?CCL51:        ICALL1  RT-P-CLEAR
+       PRINTI  "[There isn't anything to "
+       GET     GL-P-ITBL,K-P-VERBN >TMP
+       CALL1   RT-TALK-VERB?
+       ZERO?   STACK /?CCL54
+       PRINTI  "talk to"
+       JUMP    ?CND52
+?CCL54:        ZERO?   GL-P-MERGED \?CTR55
+       ZERO?   GL-P-ORPH /?CCL56
+?CTR55:        GET     TMP,0
+       PRINTB  STACK
+       JUMP    ?CND52
+?CCL56:        GETB    TMP,2 >?TMP1
+       GETB    TMP,3
+       CALL    RT-WORD-PRINT,?TMP1,STACK >V
+?CND52:        PRINTI  ".]"
+       CRLF    
+       SET     'V,FALSE-VALUE
+       JUMP    ?CND42
+?CCL46:        SET     'X,0
+       GRTR?   NUM,1 \?CND59
+       SET     'GL-P-MULT?,TRUE-VALUE
+?CND59:        SET     'TMP,FALSE-VALUE
+?PRG61:        IGRTR?  'CNT,NUM \?CCL65
+       GRTR?   X,0 \?CCL68
+       PRINTI  "[The "
+       EQUAL?  X,NUM /?CND69
+       PRINTI  "other "
+?CND69:        PRINTI  "object"
+       EQUAL?  X,1 /?CND71
+       PRINTC  115
+?CND71:        PRINTI  " that you mentioned "
+       EQUAL?  X,1 /?CCL75
+       PRINTI  "are"
+       JUMP    ?CND73
+?CCL75:        PRINTI  "is"
+?CND73:        PRINTI  "n't here.]"
+       CRLF    
+       JUMP    ?REP62
+?CCL68:        ZERO?   TMP \?REP62
+       ICALL1  RT-REFER-TO-MSG
+       JUMP    ?REP62
+?CCL65:        ZERO?   PTBL /?CCL79
+       GET     GL-P-PRSO,CNT >OBJ1
+       JUMP    ?CND77
+?CCL79:        GET     GL-P-PRSI,CNT >OBJ1
+?CND77:        GRTR?   NUM,1 /?CCL81
+       GET     GL-P-ITBL,K-P-NC1
+       GET     STACK,0
+       EQUAL?  STACK,W?ALL,W?EVERYTHING \?CND80
+?CCL81:        EQUAL?  OBJ1,TH-NOT-HERE-OBJECT \?CCL86
+       INC     'X
+       JUMP    ?PRG61
+?CCL86:        EQUAL?  GL-P-GET-FLAGS,K-P-ALL \?CCL88
+       CALL    RT-DONT-ALL?,OBJ1,OBJ
+       ZERO?   STACK \?PRG61
+?CCL88:        CALL2   RT-ACCESSIBLE?,OBJ1
+       ZERO?   STACK /?PRG61
+       EQUAL?  OBJ1,CH-PLAYER /?PRG61
+       EQUAL?  OBJ1,TH-IT \?CCL97
+       ICALL2  RT-CTHEO-PRINT,GL-P-IT-OBJECT
+       JUMP    ?CND95
+?CCL97:        ICALL2  RT-CTHEO-PRINT,OBJ1
+?CND95:        PRINTI  ": "
+?CND80:        SET     'TMP,TRUE-VALUE
+       ZERO?   PTBL /?CCL100
+       SET     'GL-PRSO,OBJ1
+       JUMP    ?CND98
+?CCL100:       SET     'GL-PRSO,OBJ
+?CND98:        ZERO?   PTBL /?CCL103
+       SET     'GL-PRSI,OBJ
+       JUMP    ?CND101
+?CCL103:       SET     'GL-PRSI,OBJ1
+?CND101:       EQUAL?  GL-WINNER,CH-BUTLER \?CND104
+       GET     GL-P-NAMW,0
+       EQUAL?  STACK,W?HOLMES,W?MYCROFT \?CND104
+       SET     'MYCROFT?,TRUE-VALUE
+       SET     'TOUCH-VERB?,FALSE-VALUE
+?CND104:       ZERO?   MYCROFT? \?CND108
+       EQUAL?  GL-PRSA,V?FIND /?CND108
+       CALL1   RT-TOUCH-VERB? >TOUCH-VERB?
+       ZERO?   TOUCH-VERB? \?CCL109
+       INTBL?  GL-PRSA,GL-SEE-VERBS+2,20 >TV \?CND108
+?CCL109:       ZERO?   GL-PRSO /?CCL117
+       CALL2   RT-VISIBLE?,GL-PRSO
+       ZERO?   STACK \?CCL117
+       ICALL2  RT-CANT-SEE-ANY-MSG,GL-PRSO
+       GRTR?   OCNT,1 /?PRG61
+       SET     'V,FATAL-VALUE
+       JUMP    ?REP62
+?CCL117:       ZERO?   GL-PRSI /?CND108
+       CALL2   RT-VISIBLE?,GL-PRSI
+       ZERO?   STACK \?CND108
+       ICALL2  RT-CANT-SEE-ANY-MSG,GL-PRSI
+       GRTR?   ICNT,1 /?PRG61
+       SET     'V,FATAL-VALUE
+       JUMP    ?REP62
+?CND108:       ZERO?   TOUCH-VERB? /?CND127
+       ZERO?   GL-PRSO /?CCL131
+       CALL2   RT-ACCESSIBLE?,GL-PRSO
+       ZERO?   STACK \?CCL131
+       ICALL   RT-CANT-TOUCH-MSG,GL-PRSO,GL-CLOSED-OBJECT,GL-IN-OUT
+       GRTR?   OCNT,1 /?PRG61
+       SET     'V,FATAL-VALUE
+       JUMP    ?REP62
+?CCL131:       ZERO?   GL-PRSI /?CND127
+       CALL2   RT-ACCESSIBLE?,GL-PRSI
+       ZERO?   STACK \?CND127
+       ICALL   RT-CANT-TOUCH-MSG,GL-PRSI,GL-CLOSED-OBJECT,GL-IN-OUT
+       GRTR?   ICNT,1 /?PRG61
+       SET     'V,FATAL-VALUE
+       JUMP    ?REP62
+?CND127:       CALL    RT-PERFORM,GL-PRSA,GL-PRSO,GL-PRSI >V
+       EQUAL?  V,FATAL-VALUE \?PRG61
+?REP62:        ZERO?   GL-P-OVERFLOW /?CND42
+       CRLF    
+       PRINTI  "[Note: There are so many objects here that a few may have been overlooked. Please double check to make sure you have accomplished what you intended.]"
+       CRLF    
+?CND42:        EQUAL?  V,FATAL-VALUE \?CND5
+       SET     'GL-P-CONT,FALSE-VALUE
+       JUMP    ?CND5
+?CCL7: SET     'GL-P-CONT,FALSE-VALUE
+?CND5: ZERO?   GL-P-GOOD /?CND147
+       EQUAL?  V,FATAL-VALUE /?CND147
+       INTBL?  GL-PRSA,GL-GAME-VERBS+2,10 >TV /?CND147
+       ICALL1  RT-UPDATE-MOVES
+       ICALL1  RT-UPDATE-CLOCK
+       ICALL1  RT-ALARM-CHK
+?CND147:       ICALL1  RT-TIME-OF-DAY-MSG
+       SET     'GL-PRSA,FALSE-VALUE
+       SET     'GL-PRSO,FALSE-VALUE
+       SET     'GL-PRSI,FALSE-VALUE
+       JUMP    ?PRG1
+
+
+       .FUNCT  RT-TOUCH-VERB?
+       INTBL?  GL-PRSA,GL-TOUCH-VERBS+2,69 /?BOGUS1
+?BOGUS1:       RSTACK  
+
+
+       .FUNCT  RT-TALK-VERB?
+       INTBL?  GL-PRSA,GL-TALK-VERBS+2,19 /?BOGUS1
+?BOGUS1:       RSTACK  
+
+
+       .FUNCT  RT-AC-CH-PLAYER,CONTEXT
+       SET     'GL-WAIT-BELL,FALSE-VALUE
+       EQUAL?  CONTEXT,K-M-WINNER \?CCL3
+       EQUAL?  GL-PRSA,V?TELL \?CCL6
+       SET     'GL-CLOCK-WAIT,FALSE-VALUE
+       RFALSE  
+?CCL6: EQUAL?  GL-PRSO,TH-HANDS /?PRD10
+       EQUAL?  GL-PRSI,TH-HANDS \?CCL8
+?PRD10:        CALL1   RT-CHECK-HANDS
+       ZERO?   STACK \FALSE
+?CCL8: CALL1   RT-TOUCH-VERB?
+       ZERO?   STACK /FALSE
+       FSET?   TH-HANDS,FL-LOCKED \FALSE
+       CALL1   RT-HANDS-COVERING-EARS
+       RSTACK  
+?CCL3: CALL1   RT-AC-CH-PLAYER-AUX
+       RSTACK  
+
+       .ENDI
diff --git a/boot.zil b/boot.zil
new file mode 100644 (file)
index 0000000..6648b40
--- /dev/null
+++ b/boot.zil
@@ -0,0 +1,743 @@
+<ROUTINE RT-META-IN? (OBJ1 OBJ2)
+  <REPEAT ()
+    <COND (<OR <MC-F? .OBJ1>
+              <IN? .OBJ1 ,ROOMS>
+              <IN? .OBJ1 ,LOCAL-GLOBALS>>
+          <RFALSE>)
+         (<EQUAL? .OBJ1 .OBJ2>
+          <RTRUE>)>
+    <SET OBJ1 <LOC .OBJ1>>>>
+
+<ROUTINE RT-SEE-INSIDE? (THING)
+  <COND (<MC-F? .THING>
+        <RFALSE>)
+       (<MC-IS? .THING ,FL-SURFACE>
+        <RTRUE>)
+       (<AND <MC-IS? .THING ,FL-CONTAINER>
+             ; "All vehicles are also containers"
+             ;<OR <MC-IS? .THING ,FL-CONTAINER>
+                 <MC-IS? .THING ,FL-VEHICLE>>
+             <OR <MC-IS? .THING ,FL-OPENED>
+                 <MC-IS? .THING ,FL-TRANSPARENT>>>
+        <RTRUE>)
+       (<AND <OR <MC-IS? .THING ,FL-PERSON>
+                 <MC-IS? .THING ,FL-ALIVE>>
+             <NOT <EQUAL? .THING ,CH-PLAYER>>>
+        <RTRUE>)
+       (T
+        <RFALSE>)>>
+
+<ROUTINE RT-VISIBLE? (OBJ)
+  <RT-ACCESSIBLE? .OBJ T>>
+
+<GLOBAL LAST-PSEUDO-LOC <>>
+
+<ROUTINE CLOSED? (WLOC VISIBLE?)
+  <COND (<AND <T? .WLOC>
+             <MC-ISNOT? .WLOC ,FL-OPENED>
+             <OR <NOT .VISIBLE?>
+                 <MC-ISNOT? .WLOC ,FL-TRANSPARENT>>
+             <MC-ISNOT? .WLOC ,FL-SURFACE>
+             <MC-ISNOT? .WLOC ,FL-ALIVE>
+             <NOT <IN? .WLOC ,ROOMS>>>
+        T)>>
+
+<ROUTINE RT-ACCESSIBLE? (OBJ "OPT" (VISIBLE? <>) "AUX" LOC OLOC WLOC
+                   (RMG <GETPT ,GL-PLACE-CUR ,P?GLOBAL>) (RMGL <PTSIZE .RMG>))
+  ; "See if it's a simple case"
+  <COND (<F? .OBJ>
+        <SETG GL-CLOSED-OBJECT <>>
+        <RFALSE>)
+       (<==? .OBJ ,ROOMS>
+        <RTRUE>)
+       (<==? .OBJ ,PSEUDO-OBJECT>
+        <RETURN <==? ,LAST-PSEUDO-LOC ,GL-PLACE-CUR>>)>
+  ; "Now get the winner's effective room"
+  <SET WLOC <LOC ,GL-WINNER>>
+  <REPEAT ()
+    <COND (<AND <NOT <IN? .WLOC ,ROOMS>>
+               <NOT <CLOSED? .WLOC .VISIBLE?>>>
+          ; "If he's in a vehicle, then if the vehicle's open
+             he can reach stuff in the room as well"
+          <SET WLOC <LOC .WLOC>>)
+         (T
+          <RETURN>)>>
+  <SET OLOC .OBJ>
+  <COND (<==? .OLOC .WLOC> <RTRUE>)>
+  <REPEAT ()
+    <COND (<F? .OLOC> <RFALSE>)>
+    ; "We've hit a room, a global object, or a local global FOR THIS ROOM"
+    <COND (<OR <IN? .OLOC ,GLOBAL-OBJECTS>
+              <INTBL? .OLOC .RMG .RMGL 1>>
+          <COND (<AND <IN? .OLOC ,ROOMS>
+                      <N==? .OLOC .OBJ>>
+                 <RFALSE>)>
+          <RTRUE>)>
+    <COND (<IN? .OLOC ,ROOMS> <RFALSE>)>
+    ; "Move up a step, see if we've run into the winner yet"
+    <COND (<==? <SET OLOC <LOC .OLOC>> .WLOC> <RTRUE>)>
+    ; "Nope, see if this level is closed"
+    <COND (<CLOSED? .OLOC .VISIBLE?>
+          <COND (<OR <IN? .OLOC ,GLOBAL-OBJECTS>
+                     <INTBL? .OLOC .RMG .RMGL 1>>
+                 <RTRUE>)>
+          ; "If the new thing is closed, we've lost"
+          <SETG GL-CLOSED-OBJECT .OLOC>
+          <SETG GL-IN-OUT T>
+          <RFALSE>)>>>
+
+;<ROUTINE RT-ACCESSIBLE? (OBJ "OPT" (VISIBLE? <>) "AUX" WLOC OLOC (CLSD-PTR <>)
+                        PTR (CNT 0) TEMP TBL END)
+       <COND (<MC-F? .OBJ>
+              <SETG GL-CLOSED-OBJECT <>>
+              <RFALSE>)
+             (<EQUAL? .OBJ ,ROOMS>
+              <RTRUE>)
+             (<EQUAL? .OBJ ,PSEUDO-OBJECT>
+              <RETURN <==? ,LAST-PSEUDO-LOC ,GL-PLACE-CUR>>)>
+       <SET PTR ,GL-LOC-TRAIL>
+       <SET OLOC .OBJ>
+       ; "Check the object to see if it's in a closed container"
+       <REPEAT ()
+         <PUT .PTR 0 .OLOC>
+         <INC CNT>
+         <COND (<OR <MC-F? .OLOC>
+                    <IN? .OLOC ,ROOMS>
+                    <IN? .OLOC ,LOCAL-GLOBALS>
+                    <IN? .OLOC ,GLOBAL-OBJECTS>>
+                <RETURN>)>
+         <SET OLOC <LOC .OLOC>>
+         <SET PTR <REST .PTR 2>>
+         <COND (<CLOSED? .OLOC .VISIBLE?>
+                <SETG GL-CLOSED-OBJECT .OLOC>
+                <SETG GL-IN-OUT T>
+                <COND (<MC-F? .CLSD-PTR>
+                       <SET CLSD-PTR .PTR>)>)>>
+       <SET PTR <>>
+       <SET WLOC ,GL-WINNER>
+       ; "Now see if the winner's in a closed thing that doesn't enclose
+          anything that encloses the object in question"
+       <REPEAT ()
+         <COND (<MC-F? .WLOC>
+                <SETG GL-CLOSED-OBJECT <>>
+                <SETG GL-IN-OUT <>>
+                <RFALSE>)
+               (<SET PTR <INTBL? .WLOC ,GL-LOC-TRAIL .CNT>>
+                <RETURN>)
+               (<IN? .WLOC ,ROOMS>
+                <RETURN>)>
+         <SET WLOC <LOC .WLOC>>
+         <COND (<CLOSED? .WLOC .VISIBLE?>
+                <SETG GL-CLOSED-OBJECT .WLOC>
+                <SETG GL-IN-OUT <>>
+                <RFALSE>)>>
+       <COND (<MC-F? .PTR>
+              <RFALSE>)
+             (<AND <MC-T? .CLSD-PTR>
+                   <G? .PTR .CLSD-PTR>>
+              <RFALSE>)
+             (T
+              <RTRUE>)>>
+
+<ROUTINE RT-DONT-ALL? (O I "AUX" L)
+  <SET L <LOC .O>>
+  <COND  (<OR <MC-F? .L>
+             <EQUAL? .O .I>>
+         <RTRUE>)
+        (<MC-IS? .O ,FL-BODYPART>
+         <RTRUE>)
+        (<MC-IS? .O ,FL-NOALL>
+         <RTRUE>)
+        (<MC-VERB? TAKE>
+         <COND (<AND <MC-F? .I>
+                     <RT-META-IN? .O ,GL-WINNER>
+                     ; "Let take find things in pockets and stuff if loser
+                        gave a name"
+                     <OR <IN? .O ,GL-WINNER>
+                         <F? <ZGET ,GL-P-NAMW 0>>
+                         <NOT <0? <ZGET ,GL-P-BUTS ,K-P-MATCHLEN>>>>>
+                <RTRUE>)
+               (<AND <MC-ISNOT? .O ,FL-TAKEABLE>
+                    <MC-ISNOT? .O ,FL-TRYTAKE>>
+                <RTRUE>)
+               (<AND <MC-IS? .L ,FL-PERSON>
+                     <N==? .L .I>>
+                <RTRUE>)
+               (<AND <MC-IS? .L ,FL-CONTAINER>
+                     <MC-ISNOT? .L ,FL-OPENED>>
+                <RTRUE>)
+               (<MC-T? .I>
+                <COND (<NOT <EQUAL? .L .I>>
+                       <RTRUE>)
+                      (<RT-SEE-INSIDE? .I>
+                       <RFALSE>)
+                      (T
+                       <RTRUE>)>)
+               (<OR <EQUAL? .L ,GL-PLACE-CUR>
+                    <RT-SEE-INSIDE? .L>>
+                <RFALSE>)
+               (T
+                <RTRUE>)>)
+        (<MC-VERB? DROP PUT PUT-ON THROW THROW-OVER>
+         <COND (<EQUAL? .O ,TH-POCKET>
+                <RTRUE>)
+               (<EQUAL? .L ,TH-POCKET>
+                <RTRUE>)
+               (<MC-IS? .O ,FL-WORN>
+                <RTRUE>)
+               (<EQUAL? .L ,GL-WINNER>
+                <RFALSE>)
+               (T
+                <RTRUE>)>)
+        (T
+         <RFALSE>)>>
+
+; "tell token output routines"
+
+<ROUTINE DPRINT (O "AUX" X)
+        <COND (<AND <FSET? .O ,FL-HAS-SDESC>
+                    <T? <SET X <GETP .O ,P?ACTION>>>>
+               <ZAPPLY .X ,K-M-SDESC>)
+              (T
+               <PRINTD .O>)>>
+
+<ROUTINE RT-A-PRINT ("OPTIONAL" (O <>))
+   <RT-THEO-PRINT .O <> ,K-DESC-A>
+   <RTRUE>>
+
+<ROUTINE RT-THEO-PRINT ("OPTIONAL" (O <>) (CAP? <>) (CLASS ,K-DESC-THE))
+   <COND (<MC-F? .O>
+         <SET O ,GL-PRSO>)>
+   <COND (.CAP?
+         <DIROUT ,K-D-SCR-OFF>
+         <DIROUT ,K-D-TBL-ON ,GL-DIROUT-TBL>)>
+   <PROG ()
+     <COND (<MC-ISNOT? .O ,FL-NOARTC>
+           <COND (<MC-IS? .O ,FL-YOUR>
+                  <TELL "your">)
+                 (<==? .CLASS ,K-DESC-ANY>
+                  <TELL "any">)
+                 (<OR <==? .CLASS ,K-DESC-THE>
+                      <AND <MC-IS? .O ,FL-PLURAL>
+                           <MC-IS? .O ,FL-PERSON>>>
+                  <TELL "the">)
+                 (<AND <MC-IS? .O ,FL-PLURAL>
+                       <MC-ISNOT? .O ,FL-PERSON>>
+                  <TELL "some">)
+                 (<N==? .O ,LG-WATER>
+                  <COND (<MC-IS? .O ,FL-VOWEL>
+                         <TELL "an">)
+                        (T
+                         <TELL "a">)>)>
+           <PRINTC !\ >)
+          (<MC-IS? .O ,FL-HAS-SDESC>
+           ; "Know we have NOARTC set here"
+           <APPLY <GETP .O ,P?ACTION> ,K-M-SDESC .CLASS>
+           <RETURN>)>
+     <COND (<AND <==? .O ,CH-ME> .CAP?> ;"to print YOU instead of YOURSELF"
+           <TELL "you">)               ;"at beginning of sentence - GTB"
+          (T 
+           <TELL D .O>)>>
+   <COND (.CAP?
+         <DIROUT ,K-D-TBL-OFF>
+         <DIROUT ,K-D-SCR-ON>
+         <COND (<AND <G=? <SET CAP? <GETB ,GL-DIROUT-TBL 2>> !\a>
+                     <L=? .CAP? !\z>>
+                <PUTB ,GL-DIROUT-TBL 2 <- .CAP? 32>>)>
+         <PRINTT <ZREST ,GL-DIROUT-TBL 2> <ZGET ,GL-DIROUT-TBL 0>>)>
+   <RTRUE>>
+
+<ROUTINE RT-CTHEO-PRINT ("OPTIONAL" (O <>))
+   <RT-THEO-PRINT .O T>>
+
+<ROUTINE RT-THEI-PRINT ("OPTIONAL" (I <>))
+   <COND (<MC-F? .I>
+         <SET I ,GL-PRSI>)>
+   <RT-THEO-PRINT .I>>
+
+<ROUTINE RT-CTHEI-PRINT        ("OPTIONAL" (I <>))
+   <COND (<MC-F? .I>
+         <SET I ,GL-PRSI>)>
+   <RT-THEO-PRINT .I T>>
+
+
+<ROUTINE RT-PRINT-SPACES (N "AUX" AMT) 
+  <REPEAT ()
+    <COND (<G? .N ,GL-BLANKS-LEN>
+          <SET AMT ,GL-BLANKS-LEN>)
+         (T
+          <SET AMT .N>)>
+    <PRINTT ,GL-BLANKS .AMT>
+    <COND (<L=? <SET N <- .N .AMT>> 0>
+          <RTRUE>)>>>
+
+<ROUTINE SAY-NUMBER (N)
+  <REPEAT ((X 10000))
+    <COND (<L? .N .X>
+          <TELL " ">)
+         (T
+          <RETURN>)>
+    <COND (<L? <SET X </ .X 10>> 10>
+          <RETURN>)>>
+  <TELL N .N>>
+
+<ROUTINE RT-UPDATE-STATUS-LINE ()
+  <COND (<BTST <LOWCORE FLAGS> 4>
+        <RT-INIT-SCREEN T>
+        <LOWCORE FLAGS <BAND <LOWCORE FLAGS> <XORB 4 -1>>>)>
+  <SCREEN ,K-S-WIN>
+  <HLIGHT ,K-H-INV>
+  <COND (<NOT <EQUAL? ,GL-PLACE-CUR ,GL-PLACE-STS>>
+        <COND (,GL-SHORT-STAT?
+               <CURSET ,GL-SPLIT-ROW 1>)
+              (T
+               <CURSET ,GL-SPLIT-ROW 2>)>
+        <RT-PRINT-SPACES ,GL-STAT-MAX-ROOM>
+        <CURSET ,GL-SPLIT-ROW 2>
+        <COND (<RT-SAY-ROOM-NAME-IF-LIT ,GL-PLACE-CUR <> T>
+               <SETG GL-PLACE-STS ,GL-PLACE-CUR>)
+              (T
+               <SETG GL-PLACE-STS -1>)>)>
+  <COND (<N==? ,GL-SCORE-CUR ,GL-SCORE-STS>
+        <SETG GL-SCORE-STS ,GL-SCORE-CUR>
+        <CURSET ,GL-SPLIT-ROW <+ ,GL-SCORE-HEADER-LEN ,GL-STAT-S-POS>>
+        <SAY-NUMBER ,GL-SCORE-CUR>)>
+  <CURSET ,GL-SPLIT-ROW ,GL-STAT-T-POS>
+  <COND (,GL-SHORT-STAT?
+        <RT-CLK-DOW-MSG <+ ,K-DOW-DW ,K-DOW-SN>>
+        <TELL " ">
+        <RT-CLK-NTI-MSG <+ ,K-NTI-SM ,K-NTI-HH ,K-NTI-MM>>)
+       (T
+        <RT-CLK-DOW-MSG <+ ,K-DOW-DW ,K-DOW-EN>>
+        <CURSET ,GL-SPLIT-ROW <+ 10 ,GL-STAT-T-POS>>
+        <RT-CLK-NTI-MSG <+ ,K-NTI-HH ,K-NTI-MM ,K-NTI-SS>>)>
+  <HLIGHT ,K-H-NRM>
+  <SCREEN ,K-S-NOR>
+  <RTRUE>>
+
+<ROUTINE RT-REFER-TO-MSG ()
+        <TELL "[To what are you referring?]" CR>
+        <RTRUE>>
+
+<ROUTINE RT-SAY-ROOM-NAME-IF-LIT ("OPT" (HERE ,GL-PLACE-CUR) (FORCE? <>)
+                                       (SL? <>) "AUX" LEN (MAXLEN 300))
+   <COND (.SL?
+         <SET MAXLEN ,GL-STAT-MAX-ROOM>)>
+   <COND (<OR .FORCE? <MC-T? ,GL-NOW-LIT?>>
+         <DIROUT ,K-D-SCR-OFF>
+         <DIROUT ,K-D-TBL-ON ,GL-DIROUT-TBL>
+         <TELL D .HERE>
+         <DIROUT ,K-D-TBL-OFF>
+         <DIROUT ,K-D-SCR-ON>
+         <SET LEN <ZGET ,GL-DIROUT-TBL 0>>
+         <SET LEN <+ .LEN 1>>
+         <ZPUT ,GL-DIROUT-TBL 0 0>
+         <COND (<G? .LEN 1>
+                <REPEAT ((LC !\ ) X (CNT 2))
+                        <SET X <GETB ,GL-DIROUT-TBL .CNT>>
+                        <COND (<AND <G=? .X !\a>
+                                    <L=? .X !\z>>
+                               <COND (<OR <==? .CNT 2>
+                                          <==? .LC !\ >>
+                                      <SET X <- .X 32>>)>)>
+                        <PRINTC .X>
+                        <SET LC .X>
+                        <COND (<G? <SET CNT <+ .CNT 1>> .LEN>
+                               <RETURN>)>
+                        <COND (<G? .CNT .MAXLEN> <RETURN>)>>)
+               (T
+                <PRINTC <ZGET ,GL-DIROUT-TBL 2>>)>
+         <RTRUE>)
+        (T
+         <TELL "Darkness">
+         <RFALSE>)>>
+
+<ROUTINE RT-DESCRIBE-PLACE ("OPTIONAL" (PLACE <>) (LOOK <>))
+  ; "if no place is passed as an argument use gl-place-cur"
+  <COND (<MC-F? .PLACE>
+        <SET PLACE ,GL-PLACE-CUR>)>
+  ; "check if this place is lit"
+  <COND (<MC-F? <RT-IS-LIT? .PLACE T>>
+        <TELL ,K-TOO-DARK-MSG CR>
+        <RTRUE>)>
+  ; "display room description (DESC) in bold"
+  <HLIGHT ,K-H-BLD>
+  <RT-SAY-ROOM-NAME-IF-LIT .PLACE T>
+  <TELL CR CR>
+  <HLIGHT ,K-H-NRM>
+  ; "determine description context"
+  <COND (<MC-T? .LOOK>
+        <RT-EXEC-RM-DESCFCN .PLACE ,K-M-DESC-3>)
+       (<MC-ISNOT? .PLACE ,FL-TOUCHED>
+        <MC-MAKE .PLACE ,FL-TOUCHED>
+        <RT-EXEC-RM-DESCFCN .PLACE ,K-M-DESC-1>)
+       (<EQUAL? ,GL-DESC-LEVEL 2>
+        <RT-EXEC-RM-DESCFCN .PLACE ,K-M-DESC-2>)
+       (<EQUAL? ,GL-DESC-LEVEL 1>
+        <RTRUE>)
+       (<EQUAL? ,GL-DESC-LEVEL 0>
+        <RFALSE>)>>
+
+<ROUTINE RT-EXEC-RM-DESCFCN (PLACE CONTEXT "AUX" DF)
+       <COND (<FSET? .PLACE ,FL-HAS-DESCFCN>
+              <RETURN <NOT <APPLY <GETP .PLACE ,P?ACTION> .CONTEXT>>>)
+             (T <RTRUE>)>>
+
+<ROUTINE RT-DESCFCN-CONTEXT (CONTEXT)
+  <COND (<EQUAL? .CONTEXT ,K-M-DESC-1 ,K-M-DESC-2 ,K-M-DESC-3>
+        <RTRUE>)
+       (T
+        <RFALSE>)>>
+
+<ROUTINE RT-DESC-ALL ("OPTIONAL" (PLACE <>) (LOOK <>)
+                     "AUX" (HOLMES-IN-HOUSE? <>))
+       <COND (<RT-DESCRIBE-PLACE .PLACE .LOOK>
+              <RT-DESCRIBE-PLACE-CONTENTS .PLACE .LOOK>)>
+       <COND (<MC-F? <RT-IS-LIT? .PLACE T>>
+              <RTRUE>)
+             (<MC-F? ,GL-PUPPY-MSG?>
+              <SETG GL-PUPPY-MSG? T>)
+             (<MC-T? ,GL-PUPPY>
+              <COND (<EQUAL? ,GL-PUPPY ,CH-HOLMES>
+                     <TELL CR
+                           <RT-PICK-NEXT ,GL-HOLMES-DESC-TXT>>
+                     <COND (<MC-HERE? ,RM-ENTRY-HALL
+                                      ,RM-PARLOUR
+                                      ,RM-VESTIBULE
+                                      ,RM-HOLMES-STUDY
+                                      ,RM-HOLMES-BEDROOM>
+                            <SET HOLMES-IN-HOUSE? T>)>
+                     <COND (<MC-T? .LOOK>
+                            <COND (<IN? ,CH-HOLMES ,TH-BOAT>
+                                   <TELL ,K-SEASICK-MSG>)
+                                  (<OR <IN? ,CH-HOLMES ,TH-HANSOM-CAB>
+                                       <IN? ,CH-HOLMES ,TH-GROWLER-CAB>>
+                                   <TELL ,K-SITTING-QUIETLY-MSG>)
+                                  (.HOLMES-IN-HOUSE?
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-HOLMES-HOUSE-LOOK-TXT>>)
+                                  (<MC-IS? ,GL-PLACE-CUR ,FL-INDOORS>
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-HOLMES-INDOORS-LOOK-TXT>>)
+                                  (T
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-HOLMES-OUTDOORS-LOOK-TXT>>)>
+                            <TELL "." CR>)
+                           (<EQUAL? ,GL-DESC-LEVEL 2 1>
+                            <COND (.HOLMES-IN-HOUSE?
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-HOLMES-HOUSE-ENTER-TXT>>)
+                                  (<MC-IS? ,GL-PLACE-CUR ,FL-INDOORS>
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-HOLMES-INDOORS-ENTER-TXT>>)
+                                  (T
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-HOLMES-OUTDOORS-ENTER-TXT>>)>
+                            <TELL "." CR>)>)
+                    (<EQUAL? ,GL-PUPPY ,CH-WIGGINS>
+                     <TELL CR
+                           <RT-PICK-NEXT ,GL-WIGGINS-DESC-TXT>>
+                     <COND (<MC-T? .LOOK>
+                            <COND (<IN? ,CH-WIGGINS ,TH-BOAT>
+                                   <TELL ,K-ENJOYING-RIDE-MSG>)
+                                  (<OR <IN? ,CH-WIGGINS ,TH-HANSOM-CAB>
+                                       <IN? ,CH-WIGGINS ,TH-GROWLER-CAB>>
+                                   <TELL ,K-FIDGETING-MSG>)
+                                  (T
+                                   <TELL <RT-PICK-NEXT
+                                          ,GL-WIGGINS-LOOK-TXT>>)>
+                            <TELL "." CR>)
+                           (<EQUAL? ,GL-DESC-LEVEL 2 1>
+                            <TELL <RT-PICK-NEXT
+                                   ,GL-WIGGINS-ENTER-TXT> "." CR>)>)>)>
+       <RTRUE>>
+
+<ROUTINE RT-GOTO (NEWPLACE "AUX" X NEWLIT? OLDPLACE AMP? SS?)
+  <SET OLDPLACE ,GL-PLACE-CUR>
+  <MOVE ,CH-PLAYER .NEWPLACE>
+  <SETG GL-PLACE-CUR .NEWPLACE>
+  <SET NEWLIT? <RT-IS-LIT?>>
+  <MOVE ,CH-PLAYER .OLDPLACE>
+  <SETG GL-PLACE-CUR .OLDPLACE>
+  <COND (<MC-F? .NEWLIT?>
+        ; "Moved to get it out of preload"
+        <TOO-DARK-TO-GO .NEWPLACE>
+        <RTRUE>)>
+  <SET X <APPLY <GETP ,GL-PLACE-CUR ,P?ACTION> ,K-M-EXIT>>
+  <COND (<AND <MC-ISNOT? .OLDPLACE ,FL-INDOORS>
+             <MC-ISNOT? .NEWPLACE ,FL-INDOORS>>
+        <RT-CLOCK-JMP 0 5 0>)>
+  <SETG GL-PLACE-PRV .OLDPLACE>
+  <SETG GL-PLACE-CUR .NEWPLACE>
+  <SETG GL-NOW-LIT? <RT-IS-LIT?>>
+  <MOVE ,CH-PLAYER ,GL-PLACE-CUR>
+  <SET X <APPLY <GETP ,GL-PLACE-CUR ,P?ACTION> ,K-M-ENTERING>>
+  <COND (<MC-T? ,GL-PUPPY>
+        <MOVE ,GL-PUPPY <LOC ,CH-PLAYER>>)
+       (<AND <MC-T? ,GL-FORMER-PUPPY>
+             <IN? ,GL-FORMER-PUPPY ,GL-PLACE-CUR>
+             <NOT <FSET? ,GL-FORMER-PUPPY ,FL-ASLEEP>>>
+        <SETG GL-PUPPY ,GL-FORMER-PUPPY>
+        <SETG GL-FORMER-PUPPY <>>)>
+  <RT-DESC-ALL>
+  <SET AMP? <AND <IN? ,TH-ETHERIUM-AMPOULE ,CH-PLAYER>
+                <NOT <FSET? ,TH-ETHERIUM-AMPOULE ,FL-BROKEN>>>>
+  <SET SS? <MC-IS? ,TH-STETHOSCOPE ,FL-WORN>>
+  <COND (<OR .AMP? .SS?>
+        <HOLMES-COMPLAINS .AMP? .SS?>)>
+  <SET X <APPLY <GETP ,GL-PLACE-CUR ,P?ACTION> ,K-M-ENTERED>>
+  <RT-RESET-THEM>
+  <COND (<IN? ,TH-ETHERIUM-GAS ,GL-PLACE-CUR>
+        <RT-SMELL-ETHERIUM?>)>
+  ;"Check if etherium is in the room."
+  <RTRUE>>
+
+<ROUTINE RT-RESET-THEM ()
+       <COND (<NOT <RT-VISIBLE? ,GL-P-IT-OBJECT>>
+              <SETG GL-P-IT-OBJECT ,TH-NOT-HERE-OBJECT>)>
+       <COND (<NOT <RT-VISIBLE? ,GL-P-THEM-OBJECT>>
+              <SETG GL-P-THEM-OBJECT ,TH-NOT-HERE-OBJECT>)>
+       <COND (<NOT <RT-VISIBLE? ,GL-P-HIM-OBJECT>>
+              <SETG GL-P-HIM-OBJECT ,TH-NOT-HERE-OBJECT>)>
+       <COND (<NOT <RT-VISIBLE? ,GL-P-HER-OBJECT>>
+              <SETG GL-P-HER-OBJECT ,TH-NOT-HERE-OBJECT>)>
+       <RTRUE>>
+
+<ROUTINE RT-UPDATE-SCORE ("OPTIONAL" (PTS 1))
+       <SETG GL-SCORE-CUR <+ ,GL-SCORE-CUR .PTS>>
+       <RT-NEW-SCORE-MSG .PTS>>
+
+<ROUTINE RT-UPDATE-MOVES ("OPTIONAL" (MVS 1))
+       <COND (<MC-T? ,GL-CLOCK-WAIT>
+              <RFALSE>)
+             (<MC-T? ,GL-CLOCK-STOP>
+              <RFALSE>)>
+       <SETG GL-MOVES-CUR <+ ,GL-MOVES-CUR .MVS>>>
+
+<ROUTINE RT-UPDATE-CLOCK ("OPTIONAL" (HRS 0) (MIN 0) (SEC 0))
+       <COND (<OR <MC-NOTZERO? .HRS>
+                  <MC-NOTZERO? .MIN>
+                  <MC-NOTZERO? .SEC>>
+              <RT-CLOCK-INC-SET .HRS .MIN .SEC>)>
+       <RT-CLOCK-INC>>
+
+<ROUTINE RT-MAIN-LOOP ("AUX" ICNT OCNT NUM CNT OBJ TBL (V <>) PTBL OBJ1
+                        TMP X (TOUCH-VERB? <>) (MYCROFT? <>) TV)
+  <REPEAT ()
+    <SET CNT 0>
+    <SET OBJ <>>
+    <SET PTBL T>
+    <SETG GL-P-MULT? <>>
+    <COND (<NOT <MC-HERE? GL-P-QCONTEXT-RM>>
+          <SETG GL-P-QCONTEXT-TH <>>)>
+    <SETG GL-P-GOOD <RT-PARSER>>
+    <COND (<MC-T? ,GL-P-GOOD>
+          <SET ICNT <GET ,GL-P-PRSI ,K-P-MATCHLEN>>
+          <SET OCNT <GET ,GL-P-PRSO ,K-P-MATCHLEN>>
+          <COND (<AND <MC-T? ,GL-P-IT-OBJECT>
+                      <RT-ACCESSIBLE? ,GL-P-IT-OBJECT>>
+                 <SET TMP <>>
+                 <REPEAT ()
+                    <COND (<G? <SET CNT <+ .CNT 1>> .ICNT>
+                           <RETURN>)
+                          (T
+                           <COND (<EQUAL? <GET ,GL-P-PRSI .CNT> ,TH-IT>
+                                  <PUT ,GL-P-PRSI .CNT ,GL-P-IT-OBJECT>
+                                  <SET TMP T>
+                                  <RETURN>)>)>>
+                 <COND (<ZERO? .TMP>
+                        <SET CNT 0>
+                        <REPEAT ()
+                           <COND (<G? <SET CNT <+ .CNT 1>> .OCNT>
+                                  <RETURN>)
+                                 (T
+                                  <COND (<EQUAL? <GET ,GL-P-PRSO .CNT> ,TH-IT>
+                                         <PUT ,GL-P-PRSO .CNT ,GL-P-IT-OBJECT>
+                                         <RETURN>)>)>>)>
+                 <SET CNT 0>)>
+          <SET NUM <COND (<ZERO? .OCNT>
+                          .OCNT)
+                         (<G? .OCNT 1>
+                          <SET TBL ,GL-P-PRSO>
+                          <COND (<ZERO? .ICNT>
+                                 <SET OBJ <>>)
+                                (T
+                                 <SET OBJ <GET ,GL-P-PRSI 1>>)>
+                          .OCNT)
+                         (<G? .ICNT 1>
+                          <SET PTBL <>>
+                          <SET TBL ,GL-P-PRSI>
+                          <SET OBJ <GET ,GL-P-PRSO 1>>
+                          .ICNT)
+                         (T 1)>>
+          <COND (<AND <ZERO? .OBJ>
+                      <EQUAL? .ICNT 1>>
+                 <SET OBJ <GET ,GL-P-PRSI 1>>)>
+          <COND (<MC-VERB? WALK>
+                 <SET V <RT-PERFORM ,GL-PRSA ,GL-PRSO>>)
+                (<ZERO? .NUM>
+                 <COND (<0? <P-SONUMS ,GL-P-SYNTAX>>
+                        <SET V <RT-PERFORM ,GL-PRSA>>
+                        <SETG GL-PRSO <>>)
+                       (<ZERO? ,GL-NOW-LIT?>
+                        <RT-P-CLEAR>
+                        <TELL ,K-TOO-DARK-MSG CR>)
+                       (T
+                        <RT-P-CLEAR>
+                        <TELL "[There isn't anything to ">
+                        <SET TMP <GET ,GL-P-ITBL ,K-P-VERBN>>
+                        <COND (<RT-TALK-VERB?>
+                               <TELL "talk to">)
+                              (<OR <MC-T? ,GL-P-MERGED>
+                                   <MC-T? ,GL-P-ORPH>>
+                               <PRINTB <GET .TMP 0>>)
+                              (T
+                               <SET V <RT-WORD-PRINT <GETB .TMP 2>
+                                                     <GETB .TMP 3>>>)>
+                        <TELL ".]" CR>
+                        <SET V <>>)>)
+                (T
+                 <SET X 0>
+                 <COND (<G? .NUM 1>
+                        <SETG GL-P-MULT? T>)>
+                 <SET TMP <>>
+                 <REPEAT ()
+                   <COND (<G? <SET CNT <+ .CNT 1>> .NUM>
+                          <COND (<G? .X 0>
+                                 <TELL "[The ">
+                                 <COND (<NOT <EQUAL? .X .NUM>>
+                                        <TELL "other ">)>
+                                 <TELL "object">
+                                 <COND (<NOT <EQUAL? .X 1>>
+                                        <TELL "s">)>
+                                 <TELL " that you mentioned ">
+                                 <COND (<NOT <EQUAL? .X 1>>
+                                        <TELL "are">)
+                                       (T
+                                        <TELL "is">)>
+                                 <TELL "n't here.]" CR>)
+                                (<ZERO? .TMP>
+                                 <RT-REFER-TO-MSG>)>
+                          <RETURN>)
+                         (T
+                          <COND (<MC-T? .PTBL>
+                                 <SET OBJ1 <GET ,GL-P-PRSO .CNT>>)
+                                (T
+                                 <SET OBJ1 <GET ,GL-P-PRSI .CNT>>)>
+                          <COND (<OR <G? .NUM 1>
+                                     <EQUAL? <GET <GET ,GL-P-ITBL ,K-P-NC1> 0>
+                                             ,W?ALL ,W?EVERYTHING>>
+                                 <COND (<EQUAL? .OBJ1 ,TH-NOT-HERE-OBJECT>
+                                        <INC X>
+                                        <AGAIN>)
+                                       (<AND <EQUAL? ,GL-P-GET-FLAGS ,K-P-ALL>
+                                             <RT-DONT-ALL? .OBJ1 .OBJ>>
+                                        <AGAIN>)
+                                       (<NOT <RT-ACCESSIBLE? .OBJ1>>
+                                        <AGAIN>)
+                                       (<EQUAL? .OBJ1 ,CH-PLAYER>
+                                        <AGAIN>)
+                                       (T
+                                        <COND (<EQUAL? .OBJ1 ,TH-IT>
+                                               <TELL CTHE ,GL-P-IT-OBJECT>)
+                                              (T
+                                               <TELL CTHE .OBJ1>)>
+                                        <TELL ": ">)>)>
+                          <SET TMP T>
+                          <SETG GL-PRSO <COND (<MC-T? .PTBL>
+                                               .OBJ1)
+                                              (T
+                                               .OBJ)>>
+                          <SETG GL-PRSI <COND (<MC-T? .PTBL>
+                                               .OBJ)
+                                              (T
+                                               .OBJ1)>>
+                ; "DEB -- Do real visibility or accessibility tests here."
+                          <COND (<AND <==? ,GL-WINNER ,CH-BUTLER>
+                                      <EQUAL? <ZGET ,GL-P-NAMW 0>
+                                              ,W?HOLMES ,W?MYCROFT>>
+                                 <SET MYCROFT? T>
+                                 <SET TOUCH-VERB? <>>)>
+                          <COND (<AND <F? .MYCROFT?>
+                                      <N==? ,GL-PRSA ,V?FIND>
+                                      <OR <SET TOUCH-VERB? <RT-TOUCH-VERB?>>
+                                          <SET TV <INTBL? ,GL-PRSA <REST ,GL-SEE-VERBS 2>
+                                                     <GET ,GL-SEE-VERBS 0>>>>>
+                                 <COND (<AND <MC-T? ,GL-PRSO>
+                                             <NOT <RT-VISIBLE? ,GL-PRSO>>>
+                                        <RT-CANT-SEE-ANY-MSG ,GL-PRSO>
+                                        <COND (<L=? .OCNT 1>
+                                               <SET V ,FATAL-VALUE>
+                                               <RETURN>)>
+                                        <AGAIN>)
+                                       (<AND <MC-T? ,GL-PRSI>
+                                             <NOT <RT-VISIBLE? ,GL-PRSI>>>
+                                        <RT-CANT-SEE-ANY-MSG ,GL-PRSI>
+                                        <COND (<L=? .ICNT 1>
+                                               <SET V ,FATAL-VALUE>
+                                               <RETURN>)>
+                                        <AGAIN>)>)>
+                          <COND (.TOUCH-VERB?
+                                 <COND (<AND <MC-T? ,GL-PRSO>
+                                             <NOT <RT-ACCESSIBLE? ,GL-PRSO>>>
+                                        <RT-CANT-TOUCH-MSG ,GL-PRSO ,GL-CLOSED-OBJECT ,GL-IN-OUT>
+                                        <COND (<L=? .OCNT 1>
+                                               <SET V ,FATAL-VALUE>
+                                               <RETURN>)>
+                                        <AGAIN>)
+                                       (<AND <MC-T? ,GL-PRSI>
+                                             <NOT <RT-ACCESSIBLE? ,GL-PRSI>>>
+                                        <RT-CANT-TOUCH-MSG ,GL-PRSI ,GL-CLOSED-OBJECT ,GL-IN-OUT>
+                                        <COND (<L=? .ICNT 1>
+                                               <SET V ,FATAL-VALUE>
+                                               <RETURN>)>
+                                        <AGAIN>)>)>
+                 ; "DEB -- End real visibility and accessibility tests."
+                          <SET V <RT-PERFORM ,GL-PRSA ,GL-PRSO ,GL-PRSI>>
+                          <COND (<EQUAL? .V ,FATAL-VALUE>
+                                 <RETURN>)>)>>
+                 <COND (,GL-P-OVERFLOW
+                        <TELL CR
+"[Note: There are so many objects here that a few may have been overlooked.
+Please double check to make sure you have accomplished what you intended.]"
+CR>)>)>
+          <COND (<EQUAL? .V ,FATAL-VALUE>
+                 <SETG GL-P-CONT <>>)>)
+         (T
+          <SETG GL-P-CONT <>>)>
+    <COND (<AND <MC-T? ,GL-P-GOOD>
+               <NOT <EQUAL? .V ,FATAL-VALUE>>
+               <NOT <SET TV <INTBL? ,GL-PRSA <REST ,GL-GAME-VERBS 2>
+                                    <GET ,GL-GAME-VERBS 0>>>>>
+          <RT-UPDATE-MOVES>
+          <RT-UPDATE-CLOCK>
+          <RT-ALARM-CHK>)>
+    <RT-TIME-OF-DAY-MSG>
+    <SETG GL-PRSA <>>
+    <SETG GL-PRSO <>>
+    <SETG GL-PRSI <>>>>
+
+<ROUTINE RT-TOUCH-VERB? ()
+  <INTBL? ,GL-PRSA <REST ,GL-TOUCH-VERBS 2> <GET ,GL-TOUCH-VERBS 0>>>
+
+<ROUTINE RT-TALK-VERB? ()
+  <INTBL? ,GL-PRSA <REST ,GL-TALK-VERBS 2> <GET ,GL-TALK-VERBS 0>>>
+
+; "RT-AC-CH-PLAYER has to be here because called every turn, more or less."
+
+<ROUTINE RT-AC-CH-PLAYER ("OPTIONAL" (CONTEXT <>))
+  <DEBUGGING? <RT-DEBUG-CH-AC "CH-PLAYER" .CONTEXT>>
+  <SETG GL-WAIT-BELL <>>
+  <COND (<MC-THIS-WINNER?>
+        <COND (<MC-VERB? TELL>
+               <SETG GL-CLOCK-WAIT <>>
+               <RFALSE>)
+              (<AND <OR <MC-PRSO? ,TH-HANDS>
+                        <MC-PRSI? ,TH-HANDS>>
+                    <RT-CHECK-HANDS>>
+               <RFALSE>)
+              (<AND <RT-TOUCH-VERB?>
+                    <MC-IS? ,TH-HANDS ,FL-LOCKED>>
+               <RT-HANDS-COVERING-EARS>)>)
+       (T
+        <RT-AC-CH-PLAYER-AUX>)>>
diff --git a/cab.zabstr b/cab.zabstr
new file mode 100644 (file)
index 0000000..3806769
--- /dev/null
@@ -0,0 +1,46 @@
+
+<OBJECT CH-HANSOM-CABBIE (LOC TH-HANSOM-CAB) (DESC "hansom cabbie") (FLAGS
+FL-NODESC FL-ALIVE FL-PERSON FL-TRYTAKE FL-NOALL) (SYNONYM CABBIE DRIVER) (
+ADJECTIVE HANSOM) (SIZE 99) (ACTION RT-AC-CH-HANSOM-CABBIE)> 
+<OBJECT CH-GROWLER-CABBIE (LOC TH-GROWLER-CAB) (DESC "growler cabbie") (FLAGS
+FL-NODESC FL-ALIVE FL-PERSON FL-TRYTAKE FL-NOALL) (SYNONYM CABBIE DRIVER) (
+ADJECTIVE GROWLER) (SIZE 99) (ACTION RT-AC-CH-GROWLER-CABBIE)> 
+<DEFINE-ROUTINE RT-AC-CH-HANSOM-CABBIE> 
+<DEFINE-ROUTINE RT-AC-CH-GROWLER-CABBIE> 
+<CONSTANT CAB-ROOM-IDS-LEN 37> 
+<CONSTANT CAB-ROOM-IDS <TABLE (PURE BYTE) RM-221B-BAKER-ST RM-YORK-PLACE
+RM-MARYLEBONE-RD RM-TOTTENHAM-COURT-RD RM-ST-GILES-CIRCUS RM-OXFORD-ST
+RM-ORCHARD-ST RM-AUDLEY-ST RM-HYDE-PARK-CORNER RM-KENSINGTON-GARDENS
+RM-TRAFALGAR-SQUARE RM-GREAT-RUSSELL-ST RM-GROSVENOR-PLACE RM-VICTORIA-SQUARE
+RM-VICTORIA-STREET RM-BROAD-SANCTUARY RM-PARLIAMENT-SQUARE
+RM-BUCKINGHAM-PALACE-RD RM-QUEENS-GARDENS RM-BIRDCAGE-WALK RM-THE-MALL
+RM-WHITEHALL RM-NEW-OXFORD-ST RM-COVENT-GARDEN RM-THE-STRAND RM-FLEET-STREET
+RM-THE-EMBANKMENT RM-UPPER-THAMES-ST 0 RM-PINCHIN-LANE RM-CHEAPSIDE
+RM-THREADNEEDLE-ST RM-KING-WILLIAM-ST RM-MONUMENT RM-LOWER-THAMES-ST
+RM-LONDON-BRIDGE RM-TOWER-ENTRANCE>> 
+<DEFINE-ROUTINE RT-GET-ROOM-ID> 
+<DEFINE-ROUTINE RT-CAB-DIST> 
+<DEFINE-ROUTINE RT-I-CAB-ARRIVE> 
+<DEFINE-ROUTINE RT-I-HANSOM-LEAVE> 
+<DEFINE-ROUTINE RT-I-HANSOM-TO?> 
+<DEFINE-ROUTINE RT-I-GROWLER-LEAVE> 
+<DEFINE-ROUTINE RT-I-GROWLER-TO?> 
+<DEFINE-ROUTINE RT-MOVE-HANSOM> 
+<DEFINE-ROUTINE RT-MOVE-GROWLER> 
+<DEFINE-ROUTINE RT-CF-TH-HANSOM-CAB> 
+<DEFINE-ROUTINE RT-CF-TH-GROWLER-CAB> 
+<DEFINE-ROUTINE RT-BLOW-WHISTLE> 
+<OBJECT TH-HANSOM-CAB (LOC RM-VICTORIA-SQUARE) (DESC "hansom cab") (FLAGS
+FL-VEHICLE FL-CONTAINER FL-TRYTAKE FL-OPENED FL-LIGHTED FL-HAS-DESCFCN) (
+SYNONYM CAB) (ADJECTIVE HANSOM) (SIZE 0 CAPACITY 999) (ACTION
+RT-AC-TH-HANSOM-CAB) (CONTFCN RT-CF-TH-HANSOM-CAB)> 
+<OBJECT TH-GROWLER-CAB (LOC RM-OXFORD-ST) (DESC "growler cab") (FLAGS
+FL-VEHICLE FL-CONTAINER FL-TRYTAKE FL-OPENED FL-LIGHTED FL-HAS-DESCFCN) (
+SYNONYM CAB) (ADJECTIVE GROWLER) (SIZE 0 CAPACITY 999) (ACTION
+RT-AC-TH-GROWLER-CAB) (CONTFCN RT-CF-TH-GROWLER-CAB)> 
+<OBJECT TH-CAB-WHISTLE (LOC CH-PLAYER) (DESC "whistle") (FLAGS FL-TAKEABLE
+FL-CLOTHING FL-WORN) (SYNONYM WHISTLE) (SIZE 1 MASS 1) (ACTION
+RT-AC-TH-CAB-WHISTLE)> 
+<DEFINE-ROUTINE RT-AC-TH-HANSOM-CAB> 
+<DEFINE-ROUTINE RT-AC-TH-GROWLER-CAB> 
+<DEFINE-ROUTINE RT-AC-TH-CAB-WHISTLE> 
\ No newline at end of file
diff --git a/cab.zap b/cab.zap
new file mode 100644 (file)
index 0000000..537ecb1
--- /dev/null
+++ b/cab.zap
@@ -0,0 +1,823 @@
+
+
+       .FUNCT  RT-AC-CH-HANSOM-CABBIE,CONTEXT
+       EQUAL?  CONTEXT,K-M-WINNER \?CCL3
+       EQUAL?  GL-PRSA,V?WAIT \?CCL6
+       SET     'GL-WHERE-TO-PROMPT?,FALSE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,FALSE-VALUE
+       PRINTI  """Right-o."""
+       CRLF    
+       SET     'TH-HANSOM-CAB-AUX2,1
+       ICALL2  RT-ALARM-CLR,RT-I-HANSOM-LEAVE
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,30,0
+       CALL    RT-ALARM-SET-REL,RT-I-HANSOM-LEAVE,STACK
+       RSTACK  
+?CCL6: EQUAL?  GL-PRSA,V?DRIVE,V?WALK-TO \?CCL8
+       CALL1   RT-CF-TH-HANSOM-CAB
+       RSTACK  
+?CCL8: EQUAL?  GL-PRSA,V?HELLO,V?GOODBYE,V?THANK \?CCL10
+       SET     'GL-WINNER,CH-PLAYER
+       CALL    RT-PERFORM,GL-PRSA,CH-HANSOM-CABBIE
+       RSTACK  
+?CCL10:        PRINTR  """Sorry, guv. All I does is drives a cab."""
+?CCL3: EQUAL?  GL-PRSA,V?PAY \?PRD14
+       ZERO?   GL-NOW-PRSI? /?CTR11
+?PRD14:        EQUAL?  GL-PRSA,V?GIVE \?CCL12
+       ZERO?   GL-NOW-PRSI? /?CCL12
+       FSET?   GL-PRSO,FL-MONEY \?CCL12
+?CTR11:        PRINTR  """No thanks, guv'nor. It'll go on Mr 'Olmes's monthly account."""
+?CCL12:        EQUAL?  GL-PRSA,V?TELL \?CCL21
+       ZERO?   GL-NOW-PRSI? \?CCL21
+       ZERO?   GL-P-CONT \FALSE
+?CCL21:        EQUAL?  GL-PRSA,V?HELLO \?CCL26
+       PRINTR  """'Ello."""
+?CCL26:        EQUAL?  GL-PRSA,V?GOODBYE \?CCL28
+       PRINTR  """Ta ta."""
+?CCL28:        EQUAL?  GL-PRSA,V?THANK \?CCL30
+       PRINTR  """Anytime, mate."""
+?CCL30:        CALL1   RT-TALK-VERB?
+       ZERO?   STACK /FALSE
+       PRINTR  """Sorry, sir. No time to chat."""
+
+
+       .FUNCT  RT-AC-CH-GROWLER-CABBIE,CONTEXT
+       EQUAL?  CONTEXT,K-M-WINNER \?CCL3
+       EQUAL?  GL-PRSA,V?WAIT \?CCL6
+       SET     'GL-WHERE-TO-PROMPT?,FALSE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,FALSE-VALUE
+       ICALL2  RT-CTHEO-PRINT,CH-GROWLER-CABBIE
+       PRINTR  " says brightly, ""Okay."""
+?CCL6: EQUAL?  GL-PRSA,V?DRIVE,V?WALK-TO \?CCL8
+       CALL1   RT-CF-TH-GROWLER-CAB
+       RSTACK  
+?CCL8: ICALL2  RT-CTHEO-PRINT,CH-GROWLER-CABBIE
+       PRINTR  " says brightly, ""Hello,"" and looks at you expectantly."
+?CCL3: EQUAL?  GL-PRSA,V?PAY \?PRD12
+       ZERO?   GL-NOW-PRSI? /?CTR9
+?PRD12:        EQUAL?  GL-PRSA,V?GIVE \?CCL10
+       ZERO?   GL-NOW-PRSI? /?CCL10
+       FSET?   GL-PRSO,FL-MONEY \?CCL10
+?CTR9: ICALL2  RT-CTHEO-PRINT,CH-GROWLER-CABBIE
+       PRINTR  " says brightly, ""No thanks. I'm not in it for the money. I just like to meet new people."""
+?CCL10:        EQUAL?  GL-PRSA,V?TELL \?CCL19
+       ZERO?   GL-NOW-PRSI? \?CCL19
+       ZERO?   GL-P-CONT \FALSE
+?CCL19:        CALL1   RT-TALK-VERB?
+       ZERO?   STACK /FALSE
+       ICALL2  RT-CTHEO-PRINT,CH-GROWLER-CABBIE
+       PRINTR  " says brightly, ""Hello,"" and looks at you expectantly."
+
+
+       .FUNCT  RT-GET-ROOM-ID,HERE,TBL
+       INTBL?  HERE,CAB-ROOM-IDS,CAB-ROOM-IDS-LEN,1 >TBL \FALSE
+       LESS?   CAB-ROOM-IDS,0 \?CCL6
+       SUB     TBL,CAB-ROOM-IDS
+       ADD     STACK,1
+       RSTACK  
+?CCL6: SUB     CAB-ROOM-IDS,TBL
+       ADD     STACK,1
+       RSTACK  
+
+
+       .FUNCT  RT-CAB-DIST,HERE,THERE,NUM1,NUM2,PTR,TMP
+       CALL2   RT-GET-ROOM-ID,HERE >NUM1
+       CALL2   RT-GET-ROOM-ID,THERE >NUM2
+       EQUAL?  HERE,THERE /FALSE
+       EQUAL?  NUM1,NUM2 /FALSE
+       LESS?   NUM1,NUM2 \?CND5
+       SET     'TMP,NUM1
+       SET     'NUM1,NUM2
+       SET     'NUM2,TMP
+?CND5: SUB     NUM1,2 >NUM1
+?PRG7: LESS?   NUM1,1 /?REP8
+       ADD     PTR,NUM1 >PTR
+       DEC     'NUM1
+       JUMP    ?PRG7
+?REP8: SUB     NUM2,1
+       ADD     PTR,STACK >PTR
+       GETB    GL-CAB-DIST-TBL,PTR
+       RSTACK  
+
+
+       .FUNCT  RT-I-CAB-ARRIVE,CAB,PLACE,NUM,SCORE,AUX1
+       SET     'NUM,TH-CAB-WHISTLE-AUX1
+       SET     'PLACE,TH-CAB-WHISTLE-AUX2
+       SET     'TH-CAB-WHISTLE-AUX1,0
+       SET     'TH-CAB-WHISTLE-AUX2,0
+       EQUAL?  GL-PLACE-CUR,PLACE \FALSE
+       EQUAL?  GL-PRSA,V?WALK /FALSE
+       EQUAL?  NUM,1 \?CCL8
+       SET     'CAB,TH-GROWLER-CAB
+       SET     'SCORE,0
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,5,0
+       ICALL   RT-ALARM-SET-REL,RT-I-GROWLER-LEAVE,STACK
+       ICALL2  RT-REMOVE-ALL,TH-GROWLER-CAB
+       MOVE    CH-GROWLER-CABBIE,TH-GROWLER-CAB
+       FSET    CH-GROWLER-CABBIE,FL-SEEN
+       JUMP    ?CND6
+?CCL8: EQUAL?  NUM,2 \FALSE
+       SET     'CAB,TH-HANSOM-CAB
+       SET     'SCORE,5
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,5,0
+       ICALL   RT-ALARM-SET-REL,RT-I-HANSOM-LEAVE,STACK
+       ICALL2  RT-REMOVE-ALL,TH-HANSOM-CAB
+       MOVE    CH-HANSOM-CABBIE,TH-HANSOM-CAB
+       FSET    CH-HANSOM-CABBIE,FL-SEEN
+?CND6: ZERO?   SOUND-QUEUED? \?CND11
+       SET     'CAB-RAMP,2
+       ICALL1  RT-S-CAB-ARRIVES
+?CND11:        CRLF    
+       PRINTI  "A "
+       ICALL2  DPRINT,CAB
+       PRINTI  " pulls up beside you."
+       CRLF    
+       MOVE    CAB,GL-PLACE-CUR
+       EQUAL?  CAB,TH-HANSOM-CAB \?CCL15
+       SET     'AUX1,TH-HANSOM-CAB-AUX1
+       JUMP    ?CND13
+?CCL15:        SET     'AUX1,TH-GROWLER-CAB-AUX1
+?CND13:        ZERO?   AUX1 \TRUE
+       EQUAL?  CAB,TH-HANSOM-CAB \?CCL20
+       SET     'TH-HANSOM-CAB-AUX1,1
+       JUMP    ?CND18
+?CCL20:        SET     'TH-GROWLER-CAB-AUX1,1
+?CND18:        ZERO?   SCORE /TRUE
+       ICALL2  RT-UPDATE-SCORE,SCORE
+       RTRUE   
+
+
+       .FUNCT  RT-I-HANSOM-LEAVE
+       EQUAL?  GL-PLACE-CUR,RM-VICTORIA-SQUARE /?CND1
+       CALL2   RT-VISIBLE?,TH-HANSOM-CAB
+       ZERO?   STACK /?CND3
+       ICALL1  RT-S-CAB-LEAVES
+       ICALL2  RT-CTHEO-PRINT,TH-HANSOM-CAB
+       PRINTI  " drives off."
+       CRLF    
+?CND3: MOVE    TH-HANSOM-CAB,RM-VICTORIA-SQUARE
+       ICALL2  RT-REMOVE-ALL,TH-HANSOM-CAB
+       MOVE    CH-HANSOM-CABBIE,TH-HANSOM-CAB
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+?CND1: SET     'TH-HANSOM-CAB-AUX2,0
+       RFALSE  
+
+
+       .FUNCT  RT-I-HANSOM-TO?
+       IN?     CH-PLAYER,TH-HANSOM-CAB \FALSE
+       PRINTI  """Where to mister?"""
+       CRLF    
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,1,0
+       CALL    RT-ALARM-SET-REL,RT-I-HANSOM-TO?,STACK
+       RSTACK  
+
+
+       .FUNCT  RT-I-GROWLER-LEAVE
+       EQUAL?  GL-PLACE-CUR,RM-OXFORD-ST /FALSE
+       CALL2   RT-VISIBLE?,TH-GROWLER-CAB
+       ZERO?   STACK /?CND3
+       ICALL1  RT-S-CAB-LEAVES
+       ICALL2  RT-CTHEO-PRINT,TH-GROWLER-CAB
+       PRINTI  " drives off."
+       CRLF    
+?CND3: MOVE    TH-GROWLER-CAB,RM-OXFORD-ST
+       ICALL2  RT-REMOVE-ALL,TH-GROWLER-CAB
+       MOVE    CH-GROWLER-CABBIE,TH-GROWLER-CAB
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+       RFALSE  
+
+
+       .FUNCT  RT-I-GROWLER-TO?
+       IN?     CH-PLAYER,TH-GROWLER-CAB \FALSE
+       CRLF    
+       PRINTI  "Suddenly the cabbie - who seems to have a low threshold of boredom - pipes up and says, ""I know where we can go!"""
+       CRLF    
+       CRLF    
+       PRINT   K-WILD-RIDE-MSG
+       CRLF    
+       ICALL1  RT-MOVE-GROWLER
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,5,0
+       ICALL   RT-ALARM-SET-REL,RT-I-GROWLER-TO?,STACK
+       CRLF    
+       CALL1   RT-DESC-ALL
+       RSTACK  
+
+
+       .FUNCT  RT-MOVE-HANSOM,ROOM,MIN
+       EQUAL?  GL-PLACE-CUR,ROOM \?CCL3
+       PRINTR  """We're already here, guv."""
+?CCL3: ZERO?   ROOM /FALSE
+       SET     'GL-WHERE-TO-PROMPT?,FALSE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,FALSE-VALUE
+       CALL    RT-CAB-DIST,GL-PLACE-CUR,ROOM
+       MUL     STACK,K-HANSOM-TIME >MIN
+       PRINTI  """Right-o."""
+       CRLF    
+       CRLF    
+       MOVE    TH-HANSOM-CAB,ROOM
+       SET     'GL-PLACE-PRV,GL-PLACE-CUR
+       SET     'GL-PLACE-CUR,ROOM
+       IN?     CH-PLAYER,TH-HANSOM-CAB \?CCL8
+       SET     'GL-PUPPY-MSG?,FALSE-VALUE
+       EQUAL?  ROOM,RM-COVENT-GARDEN \?CCL11
+       SET     'LOOPING?,S-CROWD
+       SET     'LOOP-VOL,8
+       JUMP    ?CND9
+?CCL11:        SET     'LOOPING?,FALSE-VALUE
+?CND9: ICALL   SOUNDS,S-HORSE,S-START,4,6
+       PRINTI  "The cab speeds through the streets, "
+       CALL1   RT-TIME-OF-DAY
+       EQUAL?  STACK,1,2,3 \?CND12
+       PRINTI  "deftly weaving in and out of the jubilee traffic and "
+?CND12:        PRINTI  "whizzing past famous landmarks. Only a few minutes later, you arrive at your destination."
+       CRLF    
+       CRLF    
+       ICALL1  RT-DESC-ALL
+       JUMP    ?CND6
+?CCL8: ICALL1  RT-S-CAB-LEAVES
+       PRINTI  "The cab drives off."
+       CRLF    
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,30,0
+       ICALL   RT-ALARM-SET-REL,RT-I-HANSOM-LEAVE,STACK
+?CND6: ICALL2  RT-ALARM-CLR,RT-I-HANSOM-LEAVE
+       ICALL   RT-CLOCK-JMP,0,MIN,0
+       RTRUE   
+
+
+       .FUNCT  RT-MOVE-GROWLER,ROOM,NUM,MIN
+       RANDOM  37 >NUM
+       EQUAL?  NUM,1 \?CCL3
+       SET     'ROOM,RM-AUDLEY-ST
+       JUMP    ?CND1
+?CCL3: EQUAL?  NUM,2 \?CCL5
+       SET     'ROOM,RM-221B-BAKER-ST
+       JUMP    ?CND1
+?CCL5: EQUAL?  NUM,3 \?CCL7
+       SET     'ROOM,RM-BIRDCAGE-WALK
+       JUMP    ?CND1
+?CCL7: EQUAL?  NUM,5 \?CCL9
+       SET     'ROOM,RM-BROAD-SANCTUARY
+       JUMP    ?CND1
+?CCL9: EQUAL?  NUM,6 \?CCL11
+       SET     'ROOM,RM-BUCKINGHAM-PALACE-RD
+       JUMP    ?CND1
+?CCL11:        EQUAL?  NUM,7 \?CCL13
+       SET     'ROOM,RM-CHEAPSIDE
+       JUMP    ?CND1
+?CCL13:        EQUAL?  NUM,8 \?CCL15
+       SET     'ROOM,RM-COVENT-GARDEN
+       JUMP    ?CND1
+?CCL15:        EQUAL?  NUM,9 \?CCL17
+       SET     'ROOM,RM-THE-EMBANKMENT
+       JUMP    ?CND1
+?CCL17:        EQUAL?  NUM,10 \?CCL19
+       SET     'ROOM,RM-FLEET-STREET
+       JUMP    ?CND1
+?CCL19:        EQUAL?  NUM,11 \?CCL21
+       SET     'ROOM,RM-GREAT-RUSSELL-ST
+       JUMP    ?CND1
+?CCL21:        EQUAL?  NUM,12 \?CCL23
+       SET     'ROOM,RM-GROSVENOR-PLACE
+       JUMP    ?CND1
+?CCL23:        EQUAL?  NUM,13 \?CCL25
+       SET     'ROOM,RM-HYDE-PARK-CORNER
+       JUMP    ?CND1
+?CCL25:        EQUAL?  NUM,14 \?CCL27
+       SET     'ROOM,RM-KENSINGTON-GARDENS
+       JUMP    ?CND1
+?CCL27:        EQUAL?  NUM,15 \?CCL29
+       SET     'ROOM,RM-KING-WILLIAM-ST
+       JUMP    ?CND1
+?CCL29:        EQUAL?  NUM,16 \?CCL31
+       SET     'ROOM,RM-LONDON-BRIDGE
+       JUMP    ?CND1
+?CCL31:        EQUAL?  NUM,17 \?CCL33
+       SET     'ROOM,RM-LOWER-THAMES-ST
+       JUMP    ?CND1
+?CCL33:        EQUAL?  NUM,18 \?CCL35
+       SET     'ROOM,RM-THE-MALL
+       JUMP    ?CND1
+?CCL35:        EQUAL?  NUM,19 \?CCL37
+       SET     'ROOM,RM-MARYLEBONE-RD
+       JUMP    ?CND1
+?CCL37:        EQUAL?  NUM,20 \?CCL39
+       SET     'ROOM,RM-MONUMENT
+       JUMP    ?CND1
+?CCL39:        EQUAL?  NUM,21 \?CCL41
+       SET     'ROOM,RM-NEW-OXFORD-ST
+       JUMP    ?CND1
+?CCL41:        EQUAL?  NUM,22 \?CCL43
+       SET     'ROOM,RM-OXFORD-ST
+       JUMP    ?CND1
+?CCL43:        EQUAL?  NUM,23 \?CCL45
+       SET     'ROOM,RM-ORCHARD-ST
+       JUMP    ?CND1
+?CCL45:        EQUAL?  NUM,24 \?CCL47
+       SET     'ROOM,RM-PARLIAMENT-SQUARE
+       JUMP    ?CND1
+?CCL47:        EQUAL?  NUM,25 \?CCL49
+       SET     'ROOM,RM-PINCHIN-LANE
+       JUMP    ?CND1
+?CCL49:        EQUAL?  NUM,26 \?CCL51
+       SET     'ROOM,RM-QUEENS-GARDENS
+       JUMP    ?CND1
+?CCL51:        EQUAL?  NUM,27 \?CCL53
+       SET     'ROOM,RM-ST-GILES-CIRCUS
+       JUMP    ?CND1
+?CCL53:        EQUAL?  NUM,28 \?CCL55
+       SET     'ROOM,RM-THE-STRAND
+       JUMP    ?CND1
+?CCL55:        EQUAL?  NUM,29 \?CCL57
+       SET     'ROOM,RM-THREADNEEDLE-ST
+       JUMP    ?CND1
+?CCL57:        EQUAL?  NUM,30 \?CCL59
+       SET     'ROOM,RM-TOTTENHAM-COURT-RD
+       JUMP    ?CND1
+?CCL59:        EQUAL?  NUM,31 \?CCL61
+       SET     'ROOM,RM-TOWER-ENTRANCE
+       JUMP    ?CND1
+?CCL61:        EQUAL?  NUM,32 \?CCL63
+       SET     'ROOM,RM-TRAFALGAR-SQUARE
+       JUMP    ?CND1
+?CCL63:        EQUAL?  NUM,33 \?CCL65
+       SET     'ROOM,RM-UPPER-THAMES-ST
+       JUMP    ?CND1
+?CCL65:        EQUAL?  NUM,34 \?CCL67
+       SET     'ROOM,RM-VICTORIA-STREET
+       JUMP    ?CND1
+?CCL67:        EQUAL?  NUM,35 \?CCL69
+       SET     'ROOM,RM-VICTORIA-SQUARE
+       JUMP    ?CND1
+?CCL69:        EQUAL?  NUM,36 \?CCL71
+       SET     'ROOM,RM-WHITEHALL
+       JUMP    ?CND1
+?CCL71:        EQUAL?  NUM,37 \?CCL73
+       SET     'ROOM,RM-YORK-PLACE
+       JUMP    ?CND1
+?CCL73:        PRINTI  "This is odd..."
+       CRLF    
+       CRLF    
+       SET     'ROOM,RM-KENSINGTON-GARDENS
+?CND1: CALL    RT-CAB-DIST,GL-PLACE-CUR,ROOM
+       MUL     STACK,K-GROWLER-TIME >MIN
+       EQUAL?  ROOM,RM-COVENT-GARDEN \?CCL76
+       SET     'LOOPING?,S-CROWD
+       SET     'LOOP-VOL,8
+       JUMP    ?CND74
+?CCL76:        SET     'LOOPING?,FALSE-VALUE
+?CND74:        ICALL   SOUNDS,S-HORSE,S-START,4,6
+       MOVE    TH-GROWLER-CAB,ROOM
+       SET     'GL-PLACE-PRV,GL-PLACE-CUR
+       SET     'GL-PLACE-CUR,ROOM
+       SET     'GL-PUPPY-MSG?,FALSE-VALUE
+       CALL    RT-CLOCK-JMP,0,MIN,0
+       RSTACK  
+
+
+       .FUNCT  RT-CF-TH-HANSOM-CAB,CONTEXT,WRD,ADJ
+       IN?     CH-PLAYER,TH-HANSOM-CAB \?CND1
+       SET     'GL-WHERE-TO-PROMPT?,TRUE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,TRUE-VALUE
+?CND1: EQUAL?  GL-PRSA,V?WALK \?CCL5
+       EQUAL?  GL-P-WALK-DIR,P?OUT \?CCL5
+       CALL    RT-PERFORM,V?EXIT,TH-HANSOM-CAB
+       RSTACK  
+?CCL5: EQUAL?  GL-PRSA,V?WALK \?PRD11
+       EQUAL?  GL-WINNER,CH-PLAYER /?CTR8
+?PRD11:        EQUAL?  GL-PRSA,V?ENTER \?CCL9
+       EQUAL?  GL-PRSO,TH-HANSOM-CAB /?CCL9
+?CTR8: ICALL1  RT-CYOU-MSG
+       ICALL   RT-WOULD-HAVE-TO-MSG,STR?797,TH-HANSOM-CAB
+       PRINTR  " first."
+?CCL9: EQUAL?  GL-PRSA,V?DRIVE,V?WALK-TO \?CCL17
+       GET     GL-P-NAMW,0 >WRD
+       GET     GL-P-ADJW,0 >ADJ
+       EQUAL?  GL-PRSO,RM-AUDLEY-ST \?CCL20
+       CALL2   RT-MOVE-HANSOM,RM-AUDLEY-ST
+       RSTACK  
+?CCL20:        EQUAL?  GL-PRSO,RM-221B-BAKER-ST,RM-ENTRY-HALL \?CCL22
+       CALL2   RT-MOVE-HANSOM,RM-221B-BAKER-ST
+       RSTACK  
+?CCL22:        EQUAL?  GL-PRSO,RM-BIRDCAGE-WALK \?CCL24
+       CALL2   RT-MOVE-HANSOM,RM-BIRDCAGE-WALK
+       RSTACK  
+?CCL24:        EQUAL?  GL-PRSO,RM-BROAD-SANCTUARY,LG-TOMBS-ABBEY \?CCL26
+       CALL2   RT-MOVE-HANSOM,RM-BROAD-SANCTUARY
+       RSTACK  
+?CCL26:        EQUAL?  GL-PRSO,RM-BUCKINGHAM-PALACE-RD \?CCL28
+       CALL2   RT-MOVE-HANSOM,RM-BUCKINGHAM-PALACE-RD
+       RSTACK  
+?CCL28:        EQUAL?  GL-PRSO,RM-CHEAPSIDE \?CCL30
+       CALL2   RT-MOVE-HANSOM,RM-CHEAPSIDE
+       RSTACK  
+?CCL30:        EQUAL?  GL-PRSO,RM-COVENT-GARDEN \?CCL32
+       CALL2   RT-MOVE-HANSOM,RM-COVENT-GARDEN
+       RSTACK  
+?CCL32:        EQUAL?  GL-PRSO,RM-THE-EMBANKMENT,LG-WATER \?CCL34
+       CALL2   RT-MOVE-HANSOM,RM-THE-EMBANKMENT
+       RSTACK  
+?CCL34:        EQUAL?  GL-PRSO,RM-FLEET-STREET \?CCL36
+       CALL2   RT-MOVE-HANSOM,RM-FLEET-STREET
+       RSTACK  
+?CCL36:        EQUAL?  GL-PRSO,RM-GREAT-RUSSELL-ST,RM-BRITISH-MUSEUM \?CCL38
+       CALL2   RT-MOVE-HANSOM,RM-GREAT-RUSSELL-ST
+       RSTACK  
+?CCL38:        EQUAL?  GL-PRSO,RM-GROSVENOR-PLACE \?CCL40
+       CALL2   RT-MOVE-HANSOM,RM-GROSVENOR-PLACE
+       RSTACK  
+?CCL40:        EQUAL?  GL-PRSO,RM-HYDE-PARK-CORNER \?CCL42
+       CALL2   RT-MOVE-HANSOM,RM-HYDE-PARK-CORNER
+       RSTACK  
+?CCL42:        EQUAL?  GL-PRSO,RM-KENSINGTON-GARDENS \?CCL44
+       CALL2   RT-MOVE-HANSOM,RM-KENSINGTON-GARDENS
+       RSTACK  
+?CCL44:        EQUAL?  GL-PRSO,RM-KING-WILLIAM-ST \?CCL46
+       CALL2   RT-MOVE-HANSOM,RM-KING-WILLIAM-ST
+       RSTACK  
+?CCL46:        EQUAL?  GL-PRSO,RM-LONDON-BRIDGE \?CCL48
+       CALL2   RT-MOVE-HANSOM,RM-LONDON-BRIDGE
+       RSTACK  
+?CCL48:        EQUAL?  GL-PRSO,RM-LOWER-THAMES-ST,RM-BAR-OF-GOLD,RM-SWAN-LANE \?CCL50
+       CALL2   RT-MOVE-HANSOM,RM-LOWER-THAMES-ST
+       RSTACK  
+?CCL50:        EQUAL?  GL-PRSO,RM-THE-MALL \?CCL52
+       CALL2   RT-MOVE-HANSOM,RM-THE-MALL
+       RSTACK  
+?CCL52:        EQUAL?  GL-PRSO,RM-MARYLEBONE-RD,RM-MADAME-TUSSAUDS \?CCL54
+       CALL2   RT-MOVE-HANSOM,RM-MARYLEBONE-RD
+       RSTACK  
+?CCL54:        EQUAL?  WRD,W?MONUMENT \?PRD58
+       EQUAL?  ADJ,FALSE-VALUE /?CTR55
+?PRD58:        EQUAL?  GL-PRSO,RM-MONUMENT \?CCL56
+?CTR55:        CALL2   RT-MOVE-HANSOM,RM-MONUMENT
+       RSTACK  
+?CCL56:        EQUAL?  GL-PRSO,RM-NEW-OXFORD-ST \?CCL62
+       CALL2   RT-MOVE-HANSOM,RM-NEW-OXFORD-ST
+       RSTACK  
+?CCL62:        EQUAL?  WRD,W?STREET,W?ST \?PRD66
+       EQUAL?  ADJ,W?OXFORD /?CTR63
+?PRD66:        EQUAL?  GL-PRSO,RM-OXFORD-ST \?CCL64
+?CTR63:        CALL2   RT-MOVE-HANSOM,RM-OXFORD-ST
+       RSTACK  
+?CCL64:        EQUAL?  GL-PRSO,RM-ORCHARD-ST \?CCL70
+       CALL2   RT-MOVE-HANSOM,RM-ORCHARD-ST
+       RSTACK  
+?CCL70:        EQUAL?  GL-PRSO,RM-PARLIAMENT-SQUARE,RM-PARLIAMENT,TH-BELL \?CCL72
+       CALL2   RT-MOVE-HANSOM,RM-PARLIAMENT-SQUARE
+       RSTACK  
+?CCL72:        EQUAL?  GL-PRSO,RM-PINCHIN-LANE,RM-SHERMANS-HOUSE \?CCL74
+       CALL2   RT-MOVE-HANSOM,RM-PINCHIN-LANE
+       RSTACK  
+?CCL74:        EQUAL?  GL-PRSO,RM-QUEENS-GARDENS,RM-BUCKINGHAM-PALACE \?CCL76
+       CALL2   RT-MOVE-HANSOM,RM-QUEENS-GARDENS
+       RSTACK  
+?CCL76:        EQUAL?  GL-PRSO,RM-ST-GILES-CIRCUS \?CCL78
+       CALL2   RT-MOVE-HANSOM,RM-ST-GILES-CIRCUS
+       RSTACK  
+?CCL78:        EQUAL?  GL-PRSO,RM-THE-STRAND \?CCL80
+       CALL2   RT-MOVE-HANSOM,RM-THE-STRAND
+       RSTACK  
+?CCL80:        EQUAL?  GL-PRSO,RM-THREADNEEDLE-ST,RM-BANK-OF-ENGLAND \?CCL82
+       CALL2   RT-MOVE-HANSOM,RM-THREADNEEDLE-ST
+       RSTACK  
+?CCL82:        EQUAL?  GL-PRSO,RM-TOTTENHAM-COURT-RD \?CCL84
+       CALL2   RT-MOVE-HANSOM,RM-TOTTENHAM-COURT-RD
+       RSTACK  
+?CCL84:        EQUAL?  WRD,W?TOWER /?CTR85
+       EQUAL?  GL-PRSO,RM-TOWER-ENTRANCE,LG-TOWER,RM-DRAWBRIDGE \?CCL86
+?CTR85:        CALL2   RT-MOVE-HANSOM,RM-TOWER-ENTRANCE
+       RSTACK  
+?CCL86:        EQUAL?  GL-PRSO,RM-TRAFALGAR-SQUARE,RM-DIOGENES-CLUB \?CCL90
+       CALL2   RT-MOVE-HANSOM,RM-TRAFALGAR-SQUARE
+       RSTACK  
+?CCL90:        EQUAL?  GL-PRSO,RM-UPPER-THAMES-ST \?CCL92
+       CALL2   RT-MOVE-HANSOM,RM-UPPER-THAMES-ST
+       RSTACK  
+?CCL92:        EQUAL?  GL-PRSO,RM-VICTORIA-STREET \?CCL94
+       CALL2   RT-MOVE-HANSOM,RM-VICTORIA-STREET
+       RSTACK  
+?CCL94:        EQUAL?  GL-PRSO,RM-VICTORIA-SQUARE \?CCL96
+       CALL2   RT-MOVE-HANSOM,RM-VICTORIA-SQUARE
+       RSTACK  
+?CCL96:        EQUAL?  GL-PRSO,RM-WHITEHALL,RM-SCOTLAND-YARD \?CCL98
+       CALL2   RT-MOVE-HANSOM,RM-WHITEHALL
+       RSTACK  
+?CCL98:        EQUAL?  GL-PRSO,RM-YORK-PLACE \FALSE
+       CALL2   RT-MOVE-HANSOM,RM-YORK-PLACE
+       RSTACK  
+?CCL17:        EQUAL?  GL-PRSA,V?STAND,V?STAND-ON,V?LEAP \?CCL102
+       PRINT   K-ENOUGH-ROOM-MSG
+       CRLF    
+       RTRUE   
+?CCL102:       EQUAL?  GL-PRSA,V?SIT \?CCL104
+       PRINTR  "You're already seated."
+?CCL104:       CALL1   RT-TOUCH-VERB?
+       ZERO?   STACK /FALSE
+       EQUAL?  GL-PRSO,FALSE-VALUE,ROOMS /?CND107
+       IN?     GL-PRSO,GLOBAL-OBJECTS /?CND107
+       CALL    RT-META-IN?,GL-PRSO,TH-HANSOM-CAB
+       ZERO?   STACK \?CND107
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot reach "
+       ICALL1  RT-THEO-PRINT
+       PRINTR  "."
+?CND107:       EQUAL?  GL-PRSI,FALSE-VALUE,ROOMS /FALSE
+       IN?     GL-PRSI,GLOBAL-OBJECTS /FALSE
+       FSET?   GL-PRSI,FL-PERSON \?CCL119
+       IN?     GL-PRSI,GL-PLACE-CUR /FALSE
+?CCL119:       CALL    RT-META-IN?,GL-PRSI,TH-HANSOM-CAB
+       ZERO?   STACK \FALSE
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot reach "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+
+
+       .FUNCT  RT-CF-TH-GROWLER-CAB,CONTEXT
+       IN?     CH-PLAYER,TH-GROWLER-CAB \?CND1
+       SET     'GL-WHERE-TO-PROMPT?,TRUE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,TRUE-VALUE
+?CND1: EQUAL?  GL-PRSA,V?WALK \?CCL5
+       EQUAL?  GL-P-WALK-DIR,P?OUT \?CCL5
+       CALL    RT-PERFORM,V?EXIT,TH-GROWLER-CAB
+       RSTACK  
+?CCL5: EQUAL?  GL-PRSA,V?WALK \?PRD11
+       EQUAL?  GL-WINNER,CH-PLAYER /?CTR8
+?PRD11:        EQUAL?  GL-PRSA,V?ENTER \?CCL9
+       EQUAL?  GL-PRSO,TH-GROWLER-CAB /?CCL9
+?CTR8: ICALL1  RT-CYOU-MSG
+       ICALL   RT-WOULD-HAVE-TO-MSG,STR?797,TH-GROWLER-CAB
+       PRINTR  " first."
+?CCL9: EQUAL?  GL-PRSA,V?DRIVE,V?WALK-TO \?CCL17
+       PRINTI  """Oh good! I've never been THERE before."""
+       CRLF    
+       CRLF    
+       SET     'GL-WHERE-TO-PROMPT?,FALSE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,FALSE-VALUE
+       ICALL2  RT-ALARM-CLR,RT-I-GROWLER-TO?
+       ICALL2  RT-ALARM-CLR,RT-I-GROWLER-LEAVE
+       ICALL1  RT-MOVE-GROWLER
+       IN?     CH-PLAYER,TH-GROWLER-CAB \?CCL20
+       SET     'GL-PUPPY-MSG?,FALSE-VALUE
+       PRINT   K-WILD-RIDE-MSG
+       CRLF    
+       CRLF    
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,5,0
+       ICALL   RT-ALARM-SET-REL,RT-I-GROWLER-TO?,STACK
+       ICALL1  RT-DESC-ALL
+       RTRUE   
+?CCL20:        PRINTI  "The cab drives off."
+       CRLF    
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,30,0
+       ICALL   RT-ALARM-SET-REL,RT-I-GROWLER-LEAVE,STACK
+       RTRUE   
+?CCL17:        EQUAL?  GL-PRSA,V?STAND,V?STAND-ON,V?LEAP \?CCL22
+       PRINT   K-ENOUGH-ROOM-MSG
+       CRLF    
+       RTRUE   
+?CCL22:        EQUAL?  GL-PRSA,V?SIT \?CCL24
+       PRINTR  "You're already seated."
+?CCL24:        CALL1   RT-TOUCH-VERB?
+       ZERO?   STACK /FALSE
+       EQUAL?  GL-PRSO,FALSE-VALUE,ROOMS /?CND27
+       IN?     GL-PRSO,GLOBAL-OBJECTS /?CND27
+       CALL    RT-META-IN?,GL-PRSO,TH-GROWLER-CAB
+       ZERO?   STACK \?CND27
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot reach "
+       ICALL1  RT-THEO-PRINT
+       PRINTR  "."
+?CND27:        EQUAL?  GL-PRSI,FALSE-VALUE,ROOMS /FALSE
+       IN?     GL-PRSI,GLOBAL-OBJECTS /FALSE
+       CALL    RT-META-IN?,GL-PRSI,TH-GROWLER-CAB
+       ZERO?   STACK \FALSE
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot reach "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+
+
+       .FUNCT  RT-BLOW-WHISTLE,WHO,WHO2,L,?TMP1
+       LOC     TH-HANSOM-CAB >?TMP1
+       LOC     TH-GROWLER-CAB
+       EQUAL?  GL-PLACE-CUR,?TMP1,STACK \?CCL3
+       PRINT   K-CAB-HERE-MSG
+       CRLF    
+       RTRUE   
+?CCL3: PRINTI  "Tweeeeeeeeee!"
+       CRLF    
+       FSET?   GL-PLACE-CUR,FL-INDOORS \?CCL6
+       EQUAL?  GL-PLACE-CUR,RM-HOLMES-STUDY \?CND7
+       FSET?   CH-HOLMES,FL-ASLEEP \?CND7
+       PRINT   K-HOLMES-DISTRACTION-MSG
+       CRLF    
+       RTRUE   
+?CND7: CALL1   RT-ANYONE-HERE? >WHO
+       ZERO?   WHO /TRUE
+       LOC     WHO >L
+       REMOVE  WHO
+       CALL1   RT-ANYONE-HERE? >WHO2
+       ZERO?   WHO2 /?CCL15
+       PRINTI  "Everyone holds their hands to their "
+       JUMP    ?CND13
+?CCL15:        ICALL2  RT-CTHEO-PRINT,WHO
+       PRINTI  " hold"
+       ICALL2  RT-S-NOS-MSG,WHO
+       PRINTC  32
+       ICALL2  RT-YOUR-MSG,WHO
+       PRINTI  "hands to "
+       ICALL2  RT-YOUR-MSG,WHO
+?CND13:        MOVE    WHO,L
+       PRINTI  "ears and glare"
+       ICALL2  RT-S-NOS-MSG,WHO
+       PRINTR  " at you."
+?CCL6: EQUAL?  GL-PLACE-CUR,RM-TOWER-GREEN,RM-OUTER-WARD,RM-BYWARD-TOWER /TRUE
+       EQUAL?  GL-PLACE-CUR,RM-INSIDE-TRAITORS-GATE,RM-OUTSIDE-TRAITORS-GATE,RM-DRAWBRIDGE /TRUE
+       EQUAL?  GL-PLACE-CUR,RM-THAMES-ONE,RM-THAMES-TWO,RM-THAMES-THREE /TRUE
+       EQUAL?  GL-PLACE-CUR,RM-THAMES-FOUR,RM-THAMES-FIVE,RM-SWAN-LANE /TRUE
+       INC     'TH-CAB-WHISTLE-AUX1
+       SET     'TH-CAB-WHISTLE-AUX2,GL-PLACE-CUR
+       CALL2   RT-ALARM-SET?,RT-I-CAB-ARRIVE
+       ZERO?   STACK \TRUE
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,1,0
+       ICALL   RT-ALARM-SET-REL,RT-I-CAB-ARRIVE,STACK
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-HANSOM-CAB,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       PRINTR  "It is a small cab with two wheels and room for only two persons, drawn by a single horse."
+?CCL3: EQUAL?  GL-PRSA,V?ENTER \?CCL5
+       EQUAL?  GL-PRSO,ROOMS,TH-HANSOM-CAB \?CCL5
+       FSET?   TH-SUIT-OF-ARMOUR,FL-WORN \?CCL10
+       PRINT   K-HEAVY-ARMOUR-MSG
+       CRLF    
+       RTRUE   
+?CCL10:        IN?     GL-WINNER,TH-HANSOM-CAB /FALSE
+       MOVE    GL-WINNER,TH-HANSOM-CAB
+       ZERO?   GL-PUPPY /?CCL15
+       EQUAL?  GL-WINNER,CH-PLAYER \?CCL15
+       MOVE    GL-PUPPY,TH-HANSOM-CAB
+       PRINTI  "You and "
+       ICALL2  RT-THEO-PRINT,GL-PUPPY
+       PRINTI  " get "
+       JUMP    ?CND13
+?CCL15:        ICALL   RT-CYOU-MSG,STR?753,STR?754
+?CND13:        FSET    TH-HANSOM-CAB,FL-NODESC
+       ICALL2  RT-ALARM-CLR,RT-I-HANSOM-LEAVE
+       SET     'TH-HANSOM-CAB-AUX2,0
+       SET     'GL-WHERE-TO-PROMPT?,TRUE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,TRUE-VALUE
+       PRINTR  "into the cab."
+?CCL5: EQUAL?  GL-PRSA,V?EXIT \?CCL19
+       EQUAL?  GL-PRSO,ROOMS,TH-HANSOM-CAB \?CCL19
+       IN?     CH-PLAYER,TH-HANSOM-CAB \FALSE
+       MOVE    GL-WINNER,GL-PLACE-CUR
+       ZERO?   GL-PUPPY /?CCL27
+       EQUAL?  GL-WINNER,CH-PLAYER \?CCL27
+       MOVE    GL-PUPPY,GL-PLACE-CUR
+       PRINTI  "You and "
+       ICALL2  RT-THEO-PRINT,GL-PUPPY
+       PRINTI  " get "
+       JUMP    ?CND25
+?CCL27:        ICALL   RT-CYOU-MSG,STR?753,STR?754
+?CND25:        PRINTI  "out of the cab."
+       FCLEAR  TH-HANSOM-CAB,FL-NODESC
+       ZERO?   TH-HANSOM-CAB-AUX2 \?CND30
+       IN?     CH-PLAYER,TH-HANSOM-CAB /?CND30
+       ZERO?   GL-PUPPY /?PRD35
+       IN?     GL-PUPPY,TH-HANSOM-CAB /?CND30
+?PRD35:        EQUAL?  GL-PLACE-CUR,RM-VICTORIA-SQUARE /?CND30
+       PRINTI  " After"
+       ICALL   RT-YOU-MSG,STR?753,STR?754
+       PRINTI  "out, it drives off."
+       ICALL1  RT-S-CAB-LEAVES
+       MOVE    TH-HANSOM-CAB,RM-VICTORIA-SQUARE
+       ICALL2  RT-REMOVE-ALL,TH-HANSOM-CAB
+       MOVE    CH-HANSOM-CABBIE,TH-HANSOM-CAB
+       ICALL2  RT-ALARM-CLR,RT-I-HANSOM-LEAVE
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+?CND30:        SET     'GL-WHERE-TO-PROMPT?,FALSE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,FALSE-VALUE
+       CRLF    
+       RTRUE   
+?CCL19:        EQUAL?  GL-PRSA,V?LOOK-ON \?CCL39
+       PRINTR  "There is a cab driver sitting on the hansom."
+?CCL39:        EQUAL?  GL-PRSA,V?TAKE,V?PUSH-TO \?CCL41
+       ZERO?   GL-NOW-PRSI? \?CCL41
+       PRINT   K-TAKE-CAB-MSG
+       CRLF    
+       RETURN  2
+?CCL41:        EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       CALL1   RT-WASTE-OF-BULLETS-MSG
+       RSTACK  
+
+
+       .FUNCT  RT-AC-TH-GROWLER-CAB,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       PRINTR  "It is a large cab with four wheels and room for four persons, drawn by a single horse."
+?CCL3: EQUAL?  GL-PRSA,V?ENTER \?CCL5
+       EQUAL?  GL-PRSO,ROOMS,TH-GROWLER-CAB \?CCL5
+       FSET?   TH-SUIT-OF-ARMOUR,FL-WORN \?CCL10
+       PRINT   K-HEAVY-ARMOUR-MSG
+       CRLF    
+       RTRUE   
+?CCL10:        IN?     GL-WINNER,TH-GROWLER-CAB /FALSE
+       MOVE    GL-WINNER,TH-GROWLER-CAB
+       ZERO?   GL-PUPPY /?CCL15
+       EQUAL?  GL-WINNER,CH-PLAYER \?CCL15
+       MOVE    GL-PUPPY,TH-GROWLER-CAB
+       PRINTI  "You and "
+       ICALL2  RT-THEO-PRINT,GL-PUPPY
+       PRINTI  " get "
+       JUMP    ?CND13
+?CCL15:        ICALL   RT-CYOU-MSG,STR?753,STR?754
+?CND13:        FSET    TH-GROWLER-CAB,FL-NODESC
+       ICALL2  RT-ALARM-CLR,RT-I-GROWLER-LEAVE
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,5,0
+       ICALL   RT-ALARM-SET-REL,RT-I-GROWLER-TO?,STACK
+       SET     'GL-WHERE-TO-PROMPT?,TRUE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,TRUE-VALUE
+       PRINTR  "into the cab."
+?CCL5: EQUAL?  GL-PRSA,V?EXIT \?CCL19
+       EQUAL?  GL-PRSO,ROOMS,TH-GROWLER-CAB \?CCL19
+       IN?     CH-PLAYER,TH-GROWLER-CAB \FALSE
+       MOVE    GL-WINNER,GL-PLACE-CUR
+       ZERO?   GL-PUPPY /?CCL27
+       EQUAL?  GL-WINNER,CH-PLAYER \?CCL27
+       MOVE    GL-PUPPY,GL-PLACE-CUR
+       PRINTI  "You and "
+       ICALL2  RT-THEO-PRINT,GL-PUPPY
+       PRINTI  " get "
+       JUMP    ?CND25
+?CCL27:        ICALL   RT-CYOU-MSG,STR?753,STR?754
+?CND25:        PRINTI  "out of the cab."
+       FCLEAR  TH-GROWLER-CAB,FL-NODESC
+       IN?     CH-PLAYER,TH-GROWLER-CAB /?CND30
+       ZERO?   GL-PUPPY /?PRD34
+       IN?     GL-PUPPY,TH-GROWLER-CAB /?CND30
+?PRD34:        EQUAL?  GL-PLACE-CUR,RM-OXFORD-ST /?CND30
+       PRINTI  " After"
+       ICALL   RT-YOU-MSG,STR?753,STR?754
+       PRINTI  "out, it drives off."
+       ICALL1  RT-S-CAB-LEAVES
+       MOVE    TH-GROWLER-CAB,RM-OXFORD-ST
+       ICALL2  RT-REMOVE-ALL,TH-GROWLER-CAB
+       MOVE    CH-GROWLER-CABBIE,TH-GROWLER-CAB
+       ICALL2  RT-ALARM-CLR,RT-I-GROWLER-LEAVE
+       ICALL2  RT-ALARM-CLR,RT-I-GROWLER-TO?
+       CALL1   RT-IS-LIT? >GL-NOW-LIT?
+?CND30:        SET     'GL-WHERE-TO-PROMPT?,FALSE-VALUE
+       SET     'GL-WHERE-TO-ORPH?,FALSE-VALUE
+       CRLF    
+       RTRUE   
+?CCL19:        EQUAL?  GL-PRSA,V?LOOK-ON \?CCL38
+       PRINTR  "There is a cab driver sitting on the growler."
+?CCL38:        EQUAL?  GL-PRSA,V?TAKE,V?PUSH-TO \?CCL40
+       ZERO?   GL-NOW-PRSI? \?CCL40
+       PRINT   K-TAKE-CAB-MSG
+       CRLF    
+       RETURN  2
+?CCL40:        EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       CALL1   RT-WASTE-OF-BULLETS-MSG
+       RSTACK  
+
+
+       .FUNCT  RT-AC-TH-CAB-WHISTLE
+       EQUAL?  GL-PRSA,V?BLOW-INTO \?CCL3
+       ZERO?   GL-NOW-PRSI? \?CCL3
+       CALL1   RT-BLOW-WHISTLE
+       RSTACK  
+?CCL3: EQUAL?  GL-PRSA,V?CALL \?CCL7
+       ZERO?   GL-NOW-PRSI? /?CCL7
+       EQUAL?  GL-PRSO,TH-HANSOM-CAB \?CCL12
+       ICALL1  RT-BLOW-WHISTLE
+       CALL2   RT-ALARM-SET?,RT-I-CAB-ARRIVE
+       ZERO?   STACK /TRUE
+       ICALL   RT-DO-CLOCK-SET,GL-TIME-UPDT-INC,0,2,0
+       ICALL1  RT-BLOW-WHISTLE
+       RTRUE   
+?CCL12:        EQUAL?  GL-PRSO,TH-GROWLER-CAB \?CCL16
+       ICALL1  RT-BLOW-WHISTLE
+       CALL2   RT-ALARM-SET?,RT-I-CAB-ARRIVE
+       ZERO?   STACK /TRUE
+       ICALL   RT-DO-CLOCK-SET,GL-TIME-UPDT-INC,0,2,0
+       RTRUE   
+?CCL16:        GET     GL-P-NAMW,0
+       EQUAL?  STACK,W?CAB \?CCL20
+       CALL1   RT-BLOW-WHISTLE
+       RSTACK  
+?CCL20:        ICALL1  RT-CYOU-MSG
+       PRINTI  "can't "
+       PRINTB  GL-P-PRSA-WORD
+       PRINTC  32
+       ICALL1  RT-A-PRINT
+       PRINTI  " with "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+?CCL7: EQUAL?  GL-PRSA,V?SHOOT \FALSE
+       CALL1   RT-WASTE-OF-BULLETS-MSG
+       RSTACK  
+
+       .ENDI
diff --git a/cab.zil b/cab.zil
new file mode 100644 (file)
index 0000000..246830a
--- /dev/null
+++ b/cab.zil
@@ -0,0 +1,786 @@
+;*****************************************************************************
+; "game : SHERLOCK!"
+; "file : CAB.ZIL"
+; "auth :   $Author:   RAB  $"
+; "date :     $Date:   28 Oct 1987  4:35:40  $"
+; "rev  : $Revision:   1.63  $"
+; "vers : 1.00"
+;*****************************************************************************
+
+<OBJECT CH-HANSOM-CABBIE
+       (LOC TH-HANSOM-CAB)
+       (DESC "hansom cabbie")
+       (FLAGS FL-NODESC FL-ALIVE FL-PERSON FL-TRYTAKE FL-NOALL)
+       (SYNONYM CABBIE DRIVER)
+       (ADJECTIVE HANSOM)
+       (SIZE 99)
+       (ACTION RT-AC-CH-HANSOM-CABBIE)>
+
+<OBJECT CH-GROWLER-CABBIE
+       (LOC TH-GROWLER-CAB)
+       (DESC "growler cabbie")
+       (FLAGS FL-NODESC FL-ALIVE FL-PERSON FL-TRYTAKE FL-NOALL)
+       (SYNONYM CABBIE DRIVER ;FLOYD)
+       (ADJECTIVE GROWLER)
+       (SIZE 99)
+       (ACTION RT-AC-CH-GROWLER-CABBIE)>
+
+<ROUTINE RT-AC-CH-HANSOM-CABBIE ("OPTIONAL" (CONTEXT <>))
+     <DEBUGGING? <RT-DEBUG-CH-AC "CH-HANSOM-CABBIE" .CONTEXT>>
+     <COND (<MC-THIS-WINNER?>
+           <COND (<MC-VERB? WAIT>
+                  <SETG GL-WHERE-TO-PROMPT? <>>
+                  <SETG GL-WHERE-TO-ORPH? <>>
+                  <TELL "\"Right-o.\"" CR>
+                  <SETG TH-HANSOM-CAB-AUX2 1>
+                  <RT-ALARM-CLR ,RT-I-HANSOM-LEAVE>
+                  <RT-ALARM-SET-REL ,RT-I-HANSOM-LEAVE <RT-PARM-SET 0 30 0>>)
+                 (<MC-VERB? DRIVE WALK-TO>
+                  <RT-CF-TH-HANSOM-CAB>)
+                 (<MC-VERB? HELLO GOODBYE THANK>
+                  <SETG GL-WINNER ,CH-PLAYER>
+                  <RT-PERFORM ,GL-PRSA ,CH-HANSOM-CABBIE>)
+                 (T
+                  <TELL "\"Sorry, guv. All I does is drives a cab.\"" CR>)>)
+          (<OR <AND <MC-VERB? PAY>
+                    <MC-THIS-PRSO?>>
+               <AND <MC-VERB? GIVE>
+                    <MC-THIS-PRSI?>
+                    <MC-IS? ,GL-PRSO ,FL-MONEY>>>
+           <TELL
+"\"No thanks, guv'nor. It'll go on Mr 'Olmes's monthly account.\"" CR>)
+          (<AND <MC-VERB? TELL>
+                <MC-THIS-PRSO?>
+                ,GL-P-CONT>
+           <RFALSE>)
+          (<MC-VERB? HELLO>
+           <TELL "\"'Ello.\"" CR>)
+          (<MC-VERB? GOODBYE>
+           <TELL "\"Ta ta.\"" CR>)
+          (<MC-VERB? THANK>
+           <TELL "\"Anytime, mate.\"" CR>)
+          (<RT-TALK-VERB?>
+           <TELL "\"Sorry, sir. No time to chat.\"" CR>)>>
+
+<ROUTINE RT-AC-CH-GROWLER-CABBIE ("OPTIONAL" (CONTEXT <>))
+   <DEBUGGING? <RT-DEBUG-CH-AC "CH-GROWLER-CABBIE" .CONTEXT>>
+   <COND (<MC-THIS-WINNER?>
+         <COND (<MC-VERB? WAIT>
+                <SETG GL-WHERE-TO-PROMPT? <>>
+                <SETG GL-WHERE-TO-ORPH? <>>
+                <TELL CTHE ,CH-GROWLER-CABBIE " says brightly, \"Okay.\"" CR>)
+               (<MC-VERB? DRIVE WALK-TO>
+                <RT-CF-TH-GROWLER-CAB>)
+               (T
+                <TELL CTHE ,CH-GROWLER-CABBIE " says brightly, \"Hello,\"
+and looks at you expectantly." CR>)>)
+        (<OR <AND <MC-VERB? PAY>
+                  <MC-THIS-PRSO?>>
+             <AND <MC-VERB? GIVE>
+                  <MC-THIS-PRSI?>
+                  <MC-IS? ,GL-PRSO ,FL-MONEY>>>
+         <TELL
+CTHE ,CH-GROWLER-CABBIE " says brightly, \"No thanks. I'm not in it for the
+money. I just like to meet new people.\"" CR>)
+        (<AND <MC-VERB? TELL>
+              <MC-THIS-PRSO?>
+              ,GL-P-CONT>
+         <RFALSE>)
+        (<RT-TALK-VERB?>
+         <TELL CTHE ,CH-GROWLER-CABBIE " says brightly, \"Hello,\" and looks
+at you expectantly." CR>)>>
+
+; "This was formerly contained in the AUX1 properties of the rooms in the
+   table.  Since it's just the numbers from 1 to 37, we can play horrible
+   games by subtracting the initial pointer and the INTBL? pointer instead.
+   It's a byte table because we order objects ROOMS-FIRST"
+
+<CONSTANT CAB-ROOM-IDS-LEN 37>
+
+<CONSTANT CAB-ROOM-IDS
+  <TABLE (PURE BYTE)
+        RM-221B-BAKER-ST ;1
+        RM-YORK-PLACE ;2
+        RM-MARYLEBONE-RD ;3
+        RM-TOTTENHAM-COURT-RD ;4
+        RM-ST-GILES-CIRCUS ;5
+        RM-OXFORD-ST ;6
+        RM-ORCHARD-ST ;7
+        RM-AUDLEY-ST ;8
+        RM-HYDE-PARK-CORNER ;9
+        RM-KENSINGTON-GARDENS ;10
+        RM-TRAFALGAR-SQUARE ;11
+        RM-GREAT-RUSSELL-ST ;12
+        RM-GROSVENOR-PLACE ;13
+        RM-VICTORIA-SQUARE ;14
+        RM-VICTORIA-STREET ;15
+        RM-BROAD-SANCTUARY ;16
+        RM-PARLIAMENT-SQUARE ;17
+        RM-BUCKINGHAM-PALACE-RD ;18
+        RM-QUEENS-GARDENS ;19
+        RM-BIRDCAGE-WALK ;20
+        RM-THE-MALL ;21
+        RM-WHITEHALL ;22
+        RM-NEW-OXFORD-ST ;23
+        RM-COVENT-GARDEN ;24
+        RM-THE-STRAND ;25
+        RM-FLEET-STREET ;26
+        RM-THE-EMBANKMENT ;27
+        RM-UPPER-THAMES-ST ;28
+        0;RM-BLIND-ALLEY ;29
+        RM-PINCHIN-LANE ;30
+        RM-CHEAPSIDE ;31
+        RM-THREADNEEDLE-ST ;32
+        RM-KING-WILLIAM-ST ;33
+        RM-MONUMENT ;34
+        RM-LOWER-THAMES-ST ;35
+        RM-LONDON-BRIDGE ;36
+        RM-TOWER-ENTRANCE ;37>>
+
+<ROUTINE RT-GET-ROOM-ID (HERE "AUX" TBL)
+  <COND (<SET TBL <INTBL? .HERE ,CAB-ROOM-IDS ,CAB-ROOM-IDS-LEN 1>>
+        <COND (<L? ,CAB-ROOM-IDS 0>
+               <+ <- .TBL ,CAB-ROOM-IDS> 1>)
+              (T
+               <+ <- ,CAB-ROOM-IDS .TBL> 1>)>)
+       (T 0)>>
+
+<ROUTINE RT-CAB-DIST (HERE THERE "AUX" NUM1 NUM2 (PTR 0) TMP)
+       <SET NUM1 <RT-GET-ROOM-ID .HERE>>
+       <SET NUM2 <RT-GET-ROOM-ID .THERE>>
+       <COND ;(<OR <ZERO? .NUM1>
+                   <ZERO? .NUM2>>
+               <TELL "*** ERROR: Missing room number ***" CR D .HERE " to " D .THERE "." CR>
+               <RETURN 0>)
+             (<OR <EQUAL? .HERE .THERE>
+                  <EQUAL? .NUM1 .NUM2>>
+              <RETURN 0>)>
+       <COND (<L? .NUM1 .NUM2>
+              <SET TMP .NUM1>
+              <SET NUM1 .NUM2>
+              <SET NUM2 .TMP>)>
+       <SET NUM1 <- .NUM1 2>>
+       <REPEAT ()
+               <COND (<L? .NUM1 1>
+                      <RETURN>)
+                     (T
+                      <SET PTR <+ .PTR .NUM1>>
+                      <DEC NUM1>)>>
+       <SET PTR <+ .PTR <- .NUM2 1>>>
+       <RETURN <GETB ,GL-CAB-DIST-TBL .PTR>>>
+
+<ROUTINE RT-I-CAB-ARRIVE ("AUX" (CAB <>) (PLACE <>) NUM SCORE AUX1)
+       <SET NUM ,TH-CAB-WHISTLE-AUX1>
+       <SET PLACE ,TH-CAB-WHISTLE-AUX2>
+       <SETG TH-CAB-WHISTLE-AUX1 0>
+       <SETG TH-CAB-WHISTLE-AUX2 0>
+       <COND (<AND <MC-HERE? .PLACE>
+                  <NOT <MC-VERB? WALK>>>
+             <COND (<EQUAL? .NUM 1>
+                    <SET CAB ,TH-GROWLER-CAB>
+                    <SET SCORE 0>
+                    <RT-ALARM-SET-REL ,RT-I-GROWLER-LEAVE <RT-PARM-SET 0 5 0>>
+                    <RT-REMOVE-ALL ,TH-GROWLER-CAB>
+                    <MOVE ,CH-GROWLER-CABBIE ,TH-GROWLER-CAB>
+                    <MC-MAKE ,CH-GROWLER-CABBIE ,FL-SEEN>
+                    ;<IFSOUND <COND (<F? ,SOUND-QUEUED?>
+                                    <SETG CAB-RAMP 2>
+                                    <RT-S-CAB-ARRIVES>)>>)
+                   (<EQUAL? .NUM 2>
+                    <SET CAB ,TH-HANSOM-CAB>
+                    <SET SCORE 5>
+                    <RT-ALARM-SET-REL ,RT-I-HANSOM-LEAVE <RT-PARM-SET 0 5 0>>
+                    <RT-REMOVE-ALL ,TH-HANSOM-CAB>
+                    <MOVE ,CH-HANSOM-CABBIE ,TH-HANSOM-CAB>
+                    <MC-MAKE ,CH-HANSOM-CABBIE ,FL-SEEN>)
+                   (T
+                    <RFALSE>)>
+             <IFSOUND <COND (<F? ,SOUND-QUEUED?>
+                             <SETG CAB-RAMP 2>
+                             <RT-S-CAB-ARRIVES>)>>
+             <TELL CR "A " D .CAB " pulls up beside you." CR>
+             <MOVE .CAB ,GL-PLACE-CUR>
+             <COND (<==? .CAB ,TH-HANSOM-CAB>
+                    <SET AUX1 ,TH-HANSOM-CAB-AUX1>)
+                   (T
+                    <SET AUX1 ,TH-GROWLER-CAB-AUX1>)>
+             <COND (<ZERO? .AUX1>
+                    <COND (<==? .CAB ,TH-HANSOM-CAB>
+                           <SETG TH-HANSOM-CAB-AUX1 1>)
+                          (T
+                           <SETG TH-GROWLER-CAB-AUX1 1>)>
+                    <COND (<NOT <ZERO? .SCORE>>
+                           <RT-UPDATE-SCORE .SCORE>)>)>
+             <RTRUE>)>>
+
+<ROUTINE RT-I-HANSOM-LEAVE ()
+       <COND (<NOT <MC-HERE? ,RM-VICTORIA-SQUARE>>
+              <COND (<RT-VISIBLE? ,TH-HANSOM-CAB>
+                     <IFSOUND <RT-S-CAB-LEAVES>>
+                     <TELL CTHE ,TH-HANSOM-CAB " drives off." CR>)>
+              <MOVE ,TH-HANSOM-CAB ,RM-VICTORIA-SQUARE>
+              <RT-REMOVE-ALL ,TH-HANSOM-CAB>
+              <MOVE ,CH-HANSOM-CABBIE ,TH-HANSOM-CAB>
+              <SETG GL-NOW-LIT? <RT-IS-LIT?>>)>
+       <SETG TH-HANSOM-CAB-AUX2 0>
+       <RFALSE>>
+
+<ROUTINE RT-I-HANSOM-TO? ()
+       <COND (<IN? ,CH-PLAYER ,TH-HANSOM-CAB>
+              <TELL "\"Where to mister?\"" CR>
+              <RT-ALARM-SET-REL ,RT-I-HANSOM-TO? <RT-PARM-SET 0 1 0>>)>>
+
+<ROUTINE RT-I-GROWLER-LEAVE ()
+       <COND (<NOT <MC-HERE? ,RM-OXFORD-ST>>
+              <COND (<RT-VISIBLE? ,TH-GROWLER-CAB>
+                     <IFSOUND <RT-S-CAB-LEAVES>>
+                     <TELL CTHE ,TH-GROWLER-CAB " drives off." CR>)>
+              <MOVE ,TH-GROWLER-CAB ,RM-OXFORD-ST>
+              <RT-REMOVE-ALL ,TH-GROWLER-CAB>
+              <MOVE ,CH-GROWLER-CABBIE ,TH-GROWLER-CAB>
+              <SETG GL-NOW-LIT? <RT-IS-LIT?>>)>
+       <RFALSE>>
+
+<ROUTINE RT-I-GROWLER-TO? ()
+       <COND (<IN? ,CH-PLAYER ,TH-GROWLER-CAB>
+              <TELL CR
+"Suddenly the cabbie - who seems to have a low threshold of boredom - pipes
+up and says, \"I know where we can go!\"" CR CR ,K-WILD-RIDE-MSG CR>
+              <RT-MOVE-GROWLER>
+              <RT-ALARM-SET-REL ,RT-I-GROWLER-TO? <RT-PARM-SET 0 5 0>>
+              <CRLF>
+              <RT-DESC-ALL>)>>
+
+<ROUTINE RT-MOVE-HANSOM ("OPTIONAL" (ROOM <>) MIN)
+    <COND (<MC-HERE? .ROOM>
+          <TELL "\"We're already here, guv.\"" CR>)
+         (<MC-T? .ROOM>
+          <SETG GL-WHERE-TO-PROMPT? <>>
+          <SETG GL-WHERE-TO-ORPH? <>>
+          <SET MIN <* <RT-CAB-DIST ,GL-PLACE-CUR .ROOM> ,K-HANSOM-TIME>>
+          <TELL "\"Right-o.\"" CR CR>
+          <MOVE ,TH-HANSOM-CAB .ROOM>
+          <SETG GL-PLACE-PRV ,GL-PLACE-CUR>
+          <SETG GL-PLACE-CUR .ROOM>
+          <COND (<IN? ,CH-PLAYER ,TH-HANSOM-CAB>
+                 <SETG GL-PUPPY-MSG? <>>
+                 <IFSOUND <COND (<==? .ROOM ,RM-COVENT-GARDEN>
+                                 <SETG LOOPING? ,S-CROWD>
+                                 <SETG LOOP-VOL 8>)
+                                (T 
+                                 <SETG LOOPING? <>>)>
+                          <SOUNDS ,S-HORSE ,S-START 4 6>>
+                 <TELL "The cab speeds through the streets, ">
+                 <COND (<EQUAL? <RT-TIME-OF-DAY> 1 2 3>
+                        <TELL "deftly weaving in and out of the
+jubilee traffic and ">)>
+                 <TELL "whizzing past famous landmarks. Only a few minutes
+later, you arrive at your destination." CR CR>
+                 <RT-DESC-ALL>)
+                (T
+                 <IFSOUND <RT-S-CAB-LEAVES>>
+                 <TELL "The cab drives off." CR>
+                 <SETG GL-NOW-LIT? <RT-IS-LIT?>>
+                 <RT-ALARM-SET-REL ,RT-I-HANSOM-LEAVE <RT-PARM-SET 0 30 0>>)>
+          <RT-ALARM-CLR ,RT-I-HANSOM-LEAVE>
+          <RT-CLOCK-JMP 0 .MIN 0>
+          <RTRUE>)>>
+
+<ROUTINE RT-MOVE-GROWLER ("AUX" ROOM NUM MIN)
+       <SET NUM <RANDOM 37>>
+       <COND (<EQUAL? .NUM 1>
+              <SET ROOM ,RM-AUDLEY-ST>)
+             (<EQUAL? .NUM 2>
+              <SET ROOM ,RM-221B-BAKER-ST>)
+             (<EQUAL? .NUM 3>
+              <SET ROOM ,RM-BIRDCAGE-WALK>)
+             ;(<EQUAL? .NUM 4>
+              <SET ROOM ,RM-BLIND-ALLEY>)
+             (<EQUAL? .NUM 5>
+              <SET ROOM ,RM-BROAD-SANCTUARY>)
+             (<EQUAL? .NUM 6>
+              <SET ROOM ,RM-BUCKINGHAM-PALACE-RD>)
+             (<EQUAL? .NUM 7>
+              <SET ROOM ,RM-CHEAPSIDE>)
+             (<EQUAL? .NUM 8>
+              <SET ROOM ,RM-COVENT-GARDEN>)
+             (<EQUAL? .NUM 9>
+              <SET ROOM ,RM-THE-EMBANKMENT>)
+             (<EQUAL? .NUM 10>
+              <SET ROOM ,RM-FLEET-STREET>)
+             (<EQUAL? .NUM 11>
+              <SET ROOM ,RM-GREAT-RUSSELL-ST>)
+             (<EQUAL? .NUM 12>
+              <SET ROOM ,RM-GROSVENOR-PLACE>)
+             (<EQUAL? .NUM 13>
+              <SET ROOM ,RM-HYDE-PARK-CORNER>)
+             (<EQUAL? .NUM 14>
+              <SET ROOM ,RM-KENSINGTON-GARDENS>)
+             (<EQUAL? .NUM 15>
+              <SET ROOM ,RM-KING-WILLIAM-ST>)
+             (<EQUAL? .NUM 16>
+              <SET ROOM ,RM-LONDON-BRIDGE>)
+             (<EQUAL? .NUM 17>
+              <SET ROOM ,RM-LOWER-THAMES-ST>)
+             (<EQUAL? .NUM 18>
+              <SET ROOM ,RM-THE-MALL>)
+             (<EQUAL? .NUM 19>
+              <SET ROOM ,RM-MARYLEBONE-RD>)
+             (<EQUAL? .NUM 20>
+              <SET ROOM ,RM-MONUMENT>)
+             (<EQUAL? .NUM 21>
+              <SET ROOM ,RM-NEW-OXFORD-ST>)
+             (<EQUAL? .NUM 22>
+              <SET ROOM ,RM-OXFORD-ST>)
+             (<EQUAL? .NUM 23>
+              <SET ROOM ,RM-ORCHARD-ST>)
+             (<EQUAL? .NUM 24>
+              <SET ROOM ,RM-PARLIAMENT-SQUARE>)
+             (<EQUAL? .NUM 25>
+              <SET ROOM ,RM-PINCHIN-LANE>)
+             (<EQUAL? .NUM 26>
+              <SET ROOM ,RM-QUEENS-GARDENS>)
+             (<EQUAL? .NUM 27>
+              <SET ROOM ,RM-ST-GILES-CIRCUS>)
+             (<EQUAL? .NUM 28>
+              <SET ROOM ,RM-THE-STRAND>)
+             (<EQUAL? .NUM 29>
+              <SET ROOM ,RM-THREADNEEDLE-ST>)
+             (<EQUAL? .NUM 30>
+              <SET ROOM ,RM-TOTTENHAM-COURT-RD>)
+             (<EQUAL? .NUM 31>
+              <SET ROOM ,RM-TOWER-ENTRANCE>)
+             (<EQUAL? .NUM 32>
+              <SET ROOM ,RM-TRAFALGAR-SQUARE>)
+             (<EQUAL? .NUM 33>
+              <SET ROOM ,RM-UPPER-THAMES-ST>)
+             (<EQUAL? .NUM 34>
+              <SET ROOM ,RM-VICTORIA-STREET>)
+             (<EQUAL? .NUM 35>
+              <SET ROOM ,RM-VICTORIA-SQUARE>)
+             (<EQUAL? .NUM 36>
+              <SET ROOM ,RM-WHITEHALL>)
+             (<EQUAL? .NUM 37>
+              <SET ROOM ,RM-YORK-PLACE>)
+             (T
+              <TELL "This is odd..." CR CR>
+              <SET ROOM ,RM-KENSINGTON-GARDENS>)>
+       <SET MIN <* <RT-CAB-DIST ,GL-PLACE-CUR .ROOM> ,K-GROWLER-TIME>>
+       <IFSOUND <COND (<==? .ROOM ,RM-COVENT-GARDEN>
+                       <SETG LOOPING? ,S-CROWD>
+                       <SETG LOOP-VOL 8>)
+                      (T 
+                       <SETG LOOPING? <>>)>
+                <SOUNDS ,S-HORSE ,S-START 4 6>>
+       <MOVE ,TH-GROWLER-CAB .ROOM>
+       <SETG GL-PLACE-PRV ,GL-PLACE-CUR>
+       <SETG GL-PLACE-CUR .ROOM>
+       <SETG GL-PUPPY-MSG? <>>
+       <RT-CLOCK-JMP 0 .MIN 0>>
+
+<ROUTINE RT-CF-TH-HANSOM-CAB ("OPTIONAL" (CONTEXT <>) "AUX" WRD ADJ)
+       <COND (<IN? ,CH-PLAYER ,TH-HANSOM-CAB>
+              <SETG GL-WHERE-TO-PROMPT? T>
+              <SETG GL-WHERE-TO-ORPH? T>)>
+       <COND (<AND <MC-VERB? WALK>
+                   <EQUAL? ,GL-P-WALK-DIR ,P?OUT>>
+              <RT-PERFORM ,V?EXIT ,TH-HANSOM-CAB>)
+             (<OR <AND <MC-VERB? WALK>
+                       <EQUAL? ,GL-WINNER ,CH-PLAYER>>
+                  <AND <MC-VERB? ENTER>
+                       <NOT <MC-PRSO? ,TH-HANSOM-CAB>>>>
+              <RT-CYOU-MSG>
+              <RT-WOULD-HAVE-TO-MSG "get out of" ,TH-HANSOM-CAB>
+              <TELL " first." CR>
+              <RTRUE>)
+             (<MC-VERB? DRIVE WALK-TO>
+              <SET WRD <GET ,GL-P-NAMW 0>>
+              <SET ADJ <GET ,GL-P-ADJW 0>>
+              <COND (<MC-PRSO? ,RM-AUDLEY-ST>
+                     <RT-MOVE-HANSOM ,RM-AUDLEY-ST>)
+                    (<MC-PRSO? ,RM-221B-BAKER-ST ,RM-ENTRY-HALL>
+                     <RT-MOVE-HANSOM ,RM-221B-BAKER-ST>)
+                    (<MC-PRSO? ,RM-BIRDCAGE-WALK>
+                     <RT-MOVE-HANSOM ,RM-BIRDCAGE-WALK>)
+                    ;(<MC-PRSO? ,RM-BLIND-ALLEY ,RM-SIGN-OF-RED-HERRING>
+                      <RT-MOVE-HANSOM ,RM-BLIND-ALLEY>)
+                    (<MC-PRSO? ,RM-BROAD-SANCTUARY ,LG-TOMBS-ABBEY>
+                     <RT-MOVE-HANSOM ,RM-BROAD-SANCTUARY>)
+                    (<MC-PRSO? ,RM-BUCKINGHAM-PALACE-RD>
+                     <RT-MOVE-HANSOM ,RM-BUCKINGHAM-PALACE-RD>)
+                    (<MC-PRSO? ,RM-CHEAPSIDE>
+                     <RT-MOVE-HANSOM ,RM-CHEAPSIDE>)
+                    (<MC-PRSO? ,RM-COVENT-GARDEN>
+                     <RT-MOVE-HANSOM ,RM-COVENT-GARDEN>)
+                    (<MC-PRSO? ,RM-THE-EMBANKMENT ,LG-WATER>
+                     <RT-MOVE-HANSOM ,RM-THE-EMBANKMENT>)
+                    (<MC-PRSO? ,RM-FLEET-STREET>
+                     <RT-MOVE-HANSOM ,RM-FLEET-STREET>)
+                    (<MC-PRSO? ,RM-GREAT-RUSSELL-ST ,RM-BRITISH-MUSEUM>
+                     <RT-MOVE-HANSOM ,RM-GREAT-RUSSELL-ST>)
+                    (<MC-PRSO? ,RM-GROSVENOR-PLACE>
+                     <RT-MOVE-HANSOM ,RM-GROSVENOR-PLACE>)
+                    (<MC-PRSO? ,RM-HYDE-PARK-CORNER>
+                     <RT-MOVE-HANSOM ,RM-HYDE-PARK-CORNER>)
+                    (<MC-PRSO? ,RM-KENSINGTON-GARDENS>
+                     <RT-MOVE-HANSOM ,RM-KENSINGTON-GARDENS>)
+                    (<MC-PRSO? ,RM-KING-WILLIAM-ST>
+                     <RT-MOVE-HANSOM ,RM-KING-WILLIAM-ST>)
+                    (<MC-PRSO? ,RM-LONDON-BRIDGE>
+                     <RT-MOVE-HANSOM ,RM-LONDON-BRIDGE>)
+                    (<MC-PRSO? ,RM-LOWER-THAMES-ST ,RM-BAR-OF-GOLD
+                                                        ,RM-SWAN-LANE>
+                     <RT-MOVE-HANSOM ,RM-LOWER-THAMES-ST>)
+                    (<MC-PRSO? ,RM-THE-MALL>
+                     <RT-MOVE-HANSOM ,RM-THE-MALL>)
+                    (<MC-PRSO? ,RM-MARYLEBONE-RD ,RM-MADAME-TUSSAUDS>
+                     <RT-MOVE-HANSOM ,RM-MARYLEBONE-RD>)
+                    (<OR <AND <EQUAL? .WRD ,W?MONUMENT>
+                              <EQUAL? .ADJ <>>>
+                         <MC-PRSO? ,RM-MONUMENT>>
+                     <RT-MOVE-HANSOM ,RM-MONUMENT>)
+                    (<MC-PRSO? ,RM-NEW-OXFORD-ST>
+                     <RT-MOVE-HANSOM ,RM-NEW-OXFORD-ST>)
+                    (<OR <AND <EQUAL? .WRD ,W?STREET ,W?ST>
+                              <EQUAL? .ADJ ,W?OXFORD>>
+                         <MC-PRSO? ,RM-OXFORD-ST>>
+                     <RT-MOVE-HANSOM ,RM-OXFORD-ST>)
+                    (<MC-PRSO? ,RM-ORCHARD-ST>
+                     <RT-MOVE-HANSOM ,RM-ORCHARD-ST>)
+                    (<MC-PRSO? ,RM-PARLIAMENT-SQUARE ,RM-PARLIAMENT ,TH-BELL>
+                     <RT-MOVE-HANSOM ,RM-PARLIAMENT-SQUARE>)
+                    (<MC-PRSO? ,RM-PINCHIN-LANE ,RM-SHERMANS-HOUSE>
+                     <RT-MOVE-HANSOM ,RM-PINCHIN-LANE>)
+                    (<MC-PRSO? ,RM-QUEENS-GARDENS ,RM-BUCKINGHAM-PALACE>
+                     <RT-MOVE-HANSOM ,RM-QUEENS-GARDENS>)
+                    (<MC-PRSO? ,RM-ST-GILES-CIRCUS>
+                     <RT-MOVE-HANSOM ,RM-ST-GILES-CIRCUS>)
+                    (<MC-PRSO? ,RM-THE-STRAND>
+                     <RT-MOVE-HANSOM ,RM-THE-STRAND>)
+                    (<MC-PRSO? ,RM-THREADNEEDLE-ST ,RM-BANK-OF-ENGLAND>
+                     <RT-MOVE-HANSOM ,RM-THREADNEEDLE-ST>)
+                    (<MC-PRSO? ,RM-TOTTENHAM-COURT-RD>
+                     <RT-MOVE-HANSOM ,RM-TOTTENHAM-COURT-RD>)
+                    (<OR <EQUAL? .WRD ,W?TOWER>
+                         <MC-PRSO? ,RM-TOWER-ENTRANCE ,LG-TOWER
+                                    ,RM-DRAWBRIDGE>>
+                     <RT-MOVE-HANSOM ,RM-TOWER-ENTRANCE>)
+                    (<MC-PRSO? ,RM-TRAFALGAR-SQUARE ,RM-DIOGENES-CLUB>
+                     <RT-MOVE-HANSOM ,RM-TRAFALGAR-SQUARE>)
+                    (<MC-PRSO? ,RM-UPPER-THAMES-ST>
+                     <RT-MOVE-HANSOM ,RM-UPPER-THAMES-ST>)
+                    (<MC-PRSO? ,RM-VICTORIA-STREET>
+                     <RT-MOVE-HANSOM ,RM-VICTORIA-STREET>)
+                    (<MC-PRSO? ,RM-VICTORIA-SQUARE>
+                     <RT-MOVE-HANSOM ,RM-VICTORIA-SQUARE>)
+                    (<MC-PRSO? ,RM-WHITEHALL ,RM-SCOTLAND-YARD>
+                     <RT-MOVE-HANSOM ,RM-WHITEHALL>)
+                    (<MC-PRSO? ,RM-YORK-PLACE>
+                     <RT-MOVE-HANSOM ,RM-YORK-PLACE>)>)
+             (<MC-VERB? STAND STAND-ON LEAP>
+              <TELL ,K-ENOUGH-ROOM-MSG CR>
+              <RTRUE>)
+             (<MC-VERB? SIT>
+              <TELL "You're already seated." CR>
+              <RTRUE>)
+             (<RT-TOUCH-VERB?>
+              <COND (<MC-PRSO? <> ,ROOMS>
+                     T)
+                    (<IN? ,GL-PRSO ,GLOBAL-OBJECTS>
+                     T)
+                    (<NOT <RT-META-IN? ,GL-PRSO ,TH-HANSOM-CAB>>
+                     <RT-CYOU-MSG>
+                     <TELL "cannot reach " THEO "." CR>
+                     <RTRUE>)>
+              <COND (<MC-PRSI? <> ,ROOMS>
+                     <RFALSE>)
+                    (<IN? ,GL-PRSI ,GLOBAL-OBJECTS>
+                     <RFALSE>)
+                    (<AND <FSET? ,GL-PRSI ,FL-PERSON>
+                          <IN? ,GL-PRSI ,GL-PLACE-CUR>>
+                     <RFALSE>)
+                    (<NOT <RT-META-IN? ,GL-PRSI ,TH-HANSOM-CAB>>
+                     <RT-CYOU-MSG>
+                     <TELL "cannot reach " THEI "." CR>)>)>>
+
+<ROUTINE RT-CF-TH-GROWLER-CAB ("OPTIONAL" (CONTEXT <>))
+       <COND (<IN? ,CH-PLAYER ,TH-GROWLER-CAB>
+              <SETG GL-WHERE-TO-PROMPT? T>
+              <SETG GL-WHERE-TO-ORPH? T>)>
+       <COND (<AND <MC-VERB? WALK>
+                   <EQUAL? ,GL-P-WALK-DIR ,P?OUT>>
+              <RT-PERFORM ,V?EXIT ,TH-GROWLER-CAB>)
+             (<OR <AND <MC-VERB? WALK>
+                       <EQUAL? ,GL-WINNER ,CH-PLAYER>>
+                  <AND <MC-VERB? ENTER>
+                       <NOT <MC-PRSO? ,TH-GROWLER-CAB>>>>
+              <RT-CYOU-MSG>
+              <RT-WOULD-HAVE-TO-MSG "get out of" ,TH-GROWLER-CAB>
+              <TELL " first." CR>
+              <RTRUE>)
+             (<MC-VERB? DRIVE WALK-TO>
+              <TELL "\"Oh good! I've never been THERE before.\"" CR CR>
+              <SETG GL-WHERE-TO-PROMPT? <>>
+              <SETG GL-WHERE-TO-ORPH? <>>
+              <RT-ALARM-CLR ,RT-I-GROWLER-TO?>
+              <RT-ALARM-CLR ,RT-I-GROWLER-LEAVE>
+              <RT-MOVE-GROWLER>
+              <COND (<IN? ,CH-PLAYER ,TH-GROWLER-CAB>
+                     <SETG GL-PUPPY-MSG? <>>
+                     <TELL ,K-WILD-RIDE-MSG CR CR>
+                     <RT-ALARM-SET-REL ,RT-I-GROWLER-TO? <RT-PARM-SET 0 5 0>>
+                     <RT-DESC-ALL>)
+                    (T
+                     <TELL "The cab drives off." CR>
+                     <SETG GL-NOW-LIT? <RT-IS-LIT?>>
+                     <RT-ALARM-SET-REL ,RT-I-GROWLER-LEAVE <RT-PARM-SET 0 30 0>>)>
+              <RTRUE>)
+             (<MC-VERB? STAND STAND-ON LEAP>
+              <TELL ,K-ENOUGH-ROOM-MSG CR>
+              <RTRUE>)
+             (<MC-VERB? SIT>
+              <TELL "You're already seated." CR>
+              <RTRUE>)
+             (<RT-TOUCH-VERB?>
+              <COND (<MC-PRSO? <> ,ROOMS> T)
+                    (<IN? ,GL-PRSO ,GLOBAL-OBJECTS> T)
+                    (<NOT <RT-META-IN? ,GL-PRSO ,TH-GROWLER-CAB>>
+                     <RT-CYOU-MSG>
+                     <TELL "cannot reach " THEO "." CR>
+                     <RTRUE>)>
+              <COND (<MC-PRSI? <> ,ROOMS>
+                     <RFALSE>)
+                    (<IN? ,GL-PRSI ,GLOBAL-OBJECTS>
+                     <RFALSE>)
+                    (<NOT <RT-META-IN? ,GL-PRSI ,TH-GROWLER-CAB>>
+                     <RT-CYOU-MSG>
+                     <TELL "cannot reach " THEI "." CR>)>)>>
+
+<ROUTINE RT-BLOW-WHISTLE ("AUX" WHO WHO2 L)
+    <COND (<MC-HERE? <LOC ,TH-HANSOM-CAB> <LOC ,TH-GROWLER-CAB>>
+          <TELL ,K-CAB-HERE-MSG CR>
+          <RTRUE>)
+         (T
+          ;<IFSOUND <SOUNDS ,S-WHISTLE ,S-START 8 1
+                             <COND (,TH-CAB-WHISTLE-AUX1
+                                    <RT-S-WHISTLE-TWICE>)
+                                   (T CHECK-LOOPING)>>>
+          <TELL "Tweeeeeeeeee!" CR>)>
+    <COND (<MC-IS? ,GL-PLACE-CUR ,FL-INDOORS>
+          <COND (<AND <MC-HERE? ,RM-HOLMES-STUDY>
+                      <MC-IS? ,CH-HOLMES ,FL-ASLEEP>>
+                 <TELL ,K-HOLMES-DISTRACTION-MSG CR>
+                 <RTRUE>)>
+          <SET WHO <RT-ANYONE-HERE?>>
+          <COND (<MC-T? .WHO>
+                 <SET L <LOC .WHO>>
+                 <REMOVE .WHO>
+                 <SET WHO2 <RT-ANYONE-HERE?>>
+                 <COND (;AND .WHO2 ;<MC-ISNOT? .WHO2 ,FL-ASLEEP> ;"RFP"
+                        <TELL "Everyone holds their hands to their ">)
+                       (T
+                        <TELL CTHE .WHO " hold">
+                        <RT-S-NOS-MSG .WHO>
+                        <TELL " ">
+                        <RT-YOUR-MSG .WHO>
+                        <TELL "hands to ">
+                        <RT-YOUR-MSG .WHO>)>
+                 <MOVE .WHO .L>
+                 <TELL "ears and glare">
+                 <RT-S-NOS-MSG .WHO>
+                 <TELL " at you." CR>)>)
+         (<NOT <MC-HERE? ,RM-TOWER-GREEN ,RM-OUTER-WARD
+                         ,RM-BYWARD-TOWER ,RM-INSIDE-TRAITORS-GATE
+                         ,RM-OUTSIDE-TRAITORS-GATE ,RM-DRAWBRIDGE
+                         ,RM-THAMES-ONE ,RM-THAMES-TWO
+                         ,RM-THAMES-THREE ,RM-THAMES-FOUR
+                         ,RM-THAMES-FIVE ,RM-SWAN-LANE>>
+          <SETG TH-CAB-WHISTLE-AUX1 <+ ,TH-CAB-WHISTLE-AUX1 1>>
+          <SETG TH-CAB-WHISTLE-AUX2 ,GL-PLACE-CUR>
+          <COND (<NOT <RT-ALARM-SET? ,RT-I-CAB-ARRIVE>>
+                 <RT-ALARM-SET-REL ,RT-I-CAB-ARRIVE <RT-PARM-SET 0 1 0>>)>)>
+    <RTRUE>>
+
+<OBJECT TH-HANSOM-CAB
+   (LOC RM-VICTORIA-SQUARE)
+   (DESC "hansom cab")
+   (FLAGS FL-VEHICLE FL-CONTAINER FL-TRYTAKE FL-OPENED FL-LIGHTED
+         FL-HAS-DESCFCN)
+   (SYNONYM CAB)
+   (ADJECTIVE HANSOM)
+   (SIZE 0 CAPACITY 999)
+   (ACTION RT-AC-TH-HANSOM-CAB)
+   (CONTFCN RT-CF-TH-HANSOM-CAB)>
+
+<OBJECT TH-GROWLER-CAB
+   (LOC RM-OXFORD-ST)
+   (DESC "growler cab")
+   (FLAGS FL-VEHICLE FL-CONTAINER FL-TRYTAKE FL-OPENED FL-LIGHTED
+         FL-HAS-DESCFCN)
+   (SYNONYM CAB)
+   (ADJECTIVE GROWLER)
+   (SIZE 0 CAPACITY 999)
+   (ACTION RT-AC-TH-GROWLER-CAB)
+   (CONTFCN RT-CF-TH-GROWLER-CAB)>
+
+<OBJECT TH-CAB-WHISTLE
+   (LOC CH-PLAYER)
+   (DESC "whistle")
+   (FLAGS FL-TAKEABLE FL-CLOTHING FL-WORN)
+   (SYNONYM WHISTLE)
+   (SIZE 1 MASS 1)
+   (ACTION RT-AC-TH-CAB-WHISTLE)>
+
+<ROUTINE RT-AC-TH-HANSOM-CAB ("OPT" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-HANSOM-CAB">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <TELL
+"It is a small cab with two wheels and room for only two persons,
+drawn by a single horse." CR>
+              <RTRUE>)
+             (<AND <MC-VERB? ENTER>
+                   <MC-PRSO? ,ROOMS ,TH-HANSOM-CAB>>
+              <COND (<MC-IS? ,TH-SUIT-OF-ARMOUR ,FL-WORN>
+                     <TELL ,K-HEAVY-ARMOUR-MSG CR>)
+                    (<NOT <IN? ,GL-WINNER ,TH-HANSOM-CAB>>
+                     <MOVE ,GL-WINNER ,TH-HANSOM-CAB>
+                     <COND (<AND <MC-T? ,GL-PUPPY>
+                                 <EQUAL? ,GL-WINNER ,CH-PLAYER>>
+                            <MOVE ,GL-PUPPY ,TH-HANSOM-CAB>
+                            <TELL "You and " THE ,GL-PUPPY " get ">)
+                           (T
+                            <RT-CYOU-MSG "get" "gets">)>
+                     <MC-MAKE ,TH-HANSOM-CAB ,FL-NODESC>
+                     <RT-ALARM-CLR ,RT-I-HANSOM-LEAVE>
+                     <SETG TH-HANSOM-CAB-AUX2 0>
+                     ;<RT-ALARM-SET-REL ,RT-I-HANSOM-TO? <RT-PARM-SET 0 5 0>>
+                     <SETG GL-WHERE-TO-PROMPT? T>
+                     <SETG GL-WHERE-TO-ORPH? T>
+                     <TELL "into the cab." CR>)>)
+             (<AND <MC-VERB? EXIT>
+                   <MC-PRSO? ,ROOMS ,TH-HANSOM-CAB>>
+              <COND (<IN? ,CH-PLAYER ,TH-HANSOM-CAB>
+                     <MOVE ,GL-WINNER ,GL-PLACE-CUR>
+                     <COND (<AND <MC-T? ,GL-PUPPY>
+                                 <EQUAL? ,GL-WINNER ,CH-PLAYER>>
+                            <MOVE ,GL-PUPPY ,GL-PLACE-CUR>
+                            <TELL "You and " THE ,GL-PUPPY " get ">)
+                           (T
+                            <RT-CYOU-MSG "get" "gets">)>
+                     <TELL "out of the cab.">
+                     <MC-UNMAKE ,TH-HANSOM-CAB ,FL-NODESC>
+                     <COND (<AND <ZERO? ,TH-HANSOM-CAB-AUX2>
+                                 <NOT <IN? ,CH-PLAYER ,TH-HANSOM-CAB>>
+                                 <OR <MC-F? ,GL-PUPPY>
+                                     <NOT <IN? ,GL-PUPPY ,TH-HANSOM-CAB>>>
+                                 <NOT <MC-HERE? ,RM-VICTORIA-SQUARE>>>
+                            <TELL " After">
+                            <RT-YOU-MSG "get" "gets">
+                            <TELL "out, it drives off.">
+                            <IFSOUND <RT-S-CAB-LEAVES>>
+                            <MOVE ,TH-HANSOM-CAB ,RM-VICTORIA-SQUARE>
+                            <RT-REMOVE-ALL ,TH-HANSOM-CAB>
+                            <MOVE ,CH-HANSOM-CABBIE ,TH-HANSOM-CAB>
+                            <RT-ALARM-CLR ,RT-I-HANSOM-LEAVE>
+                            ;<RT-ALARM-CLR ,RT-I-HANSOM-TO?>
+                            <SETG GL-NOW-LIT? <RT-IS-LIT?>>)>
+                     <SETG GL-WHERE-TO-PROMPT? <>>
+                     <SETG GL-WHERE-TO-ORPH? <>>
+                     <CRLF>)>)
+             (<MC-VERB? LOOK-ON>
+              <TELL "There is a cab driver sitting on the hansom." CR>)
+             (<AND <MC-VERB? TAKE PUSH-TO>
+                   <MC-THIS-PRSO?>>
+              <TELL ,K-TAKE-CAB-MSG CR>
+              <RFATAL>)
+             (<MC-VERB? SHOOT>
+              <RT-WASTE-OF-BULLETS-MSG>)>>
+
+<ROUTINE RT-AC-TH-GROWLER-CAB ("OPT" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-GROWLER-CAB">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <TELL
+"It is a large cab with four wheels and room for four persons,
+drawn by a single horse." CR>
+              <RTRUE>)
+             (<AND <MC-VERB? ENTER>
+                   <MC-PRSO? ,ROOMS ,TH-GROWLER-CAB>>
+              <COND (<MC-IS? ,TH-SUIT-OF-ARMOUR ,FL-WORN>
+                     <TELL ,K-HEAVY-ARMOUR-MSG CR>)
+                    (<NOT <IN? ,GL-WINNER ,TH-GROWLER-CAB>>
+                     <MOVE ,GL-WINNER ,TH-GROWLER-CAB>
+                     <COND (<AND <MC-T? ,GL-PUPPY>
+                                 <EQUAL? ,GL-WINNER ,CH-PLAYER>>
+                            <MOVE ,GL-PUPPY ,TH-GROWLER-CAB>
+                            <TELL "You and " THE ,GL-PUPPY " get ">)
+                           (T
+                            <RT-CYOU-MSG "get" "gets">)>
+                     <MC-MAKE ,TH-GROWLER-CAB ,FL-NODESC>
+                     <RT-ALARM-CLR ,RT-I-GROWLER-LEAVE>
+                     <RT-ALARM-SET-REL ,RT-I-GROWLER-TO? <RT-PARM-SET 0 5 0>>
+                     <SETG GL-WHERE-TO-PROMPT? T>
+                     <SETG GL-WHERE-TO-ORPH? T>
+                     <TELL "into the cab." CR>)>)
+             (<AND <MC-VERB? EXIT>
+                   <MC-PRSO? ,ROOMS ,TH-GROWLER-CAB>>
+              <COND (<IN? ,CH-PLAYER ,TH-GROWLER-CAB>
+                     <MOVE ,GL-WINNER ,GL-PLACE-CUR>
+                     <COND (<AND <MC-T? ,GL-PUPPY>
+                                 <EQUAL? ,GL-WINNER ,CH-PLAYER>>
+                            <MOVE ,GL-PUPPY ,GL-PLACE-CUR>
+                            <TELL "You and " THE ,GL-PUPPY " get ">)
+                           (T
+                            <RT-CYOU-MSG "get" "gets">)>
+                     <TELL "out of the cab.">
+                     <MC-UNMAKE ,TH-GROWLER-CAB ,FL-NODESC>
+                     <COND (<AND <NOT <IN? ,CH-PLAYER ,TH-GROWLER-CAB>>
+                                 <OR <MC-F? ,GL-PUPPY>
+                                     <NOT <IN? ,GL-PUPPY ,TH-GROWLER-CAB>>>
+                                 <NOT <MC-HERE? ,RM-OXFORD-ST>>>
+                            <TELL " After">
+                            <RT-YOU-MSG "get" "gets">
+                            <TELL "out, it drives off.">
+                            <IFSOUND <RT-S-CAB-LEAVES>>
+                            <MOVE ,TH-GROWLER-CAB ,RM-OXFORD-ST>
+                            <RT-REMOVE-ALL ,TH-GROWLER-CAB>
+                            <MOVE ,CH-GROWLER-CABBIE ,TH-GROWLER-CAB>
+                            <RT-ALARM-CLR ,RT-I-GROWLER-LEAVE>
+                            <RT-ALARM-CLR ,RT-I-GROWLER-TO?>
+                            <SETG GL-NOW-LIT? <RT-IS-LIT?>>)>
+                     <SETG GL-WHERE-TO-PROMPT? <>>
+                     <SETG GL-WHERE-TO-ORPH? <>>
+                     <CRLF>)>)
+             (<MC-VERB? LOOK-ON>
+              <TELL "There is a cab driver sitting on the growler." CR>)
+             (<AND <MC-VERB? TAKE PUSH-TO>
+                   <MC-THIS-PRSO?>>
+              <TELL ,K-TAKE-CAB-MSG CR>
+              <RFATAL>)
+             (<MC-VERB? SHOOT>
+              <RT-WASTE-OF-BULLETS-MSG>)>>
+
+<ROUTINE RT-AC-TH-CAB-WHISTLE ()
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-CAB-WHISTLE">>
+       <COND (<AND <MC-VERB? BLOW-INTO>
+                   <MC-THIS-PRSO?>>
+              <RT-BLOW-WHISTLE>)
+             (<AND <MC-VERB? CALL>
+                   <MC-THIS-PRSI?>>
+              <COND (<MC-PRSO? ,TH-HANSOM-CAB>
+                     <RT-BLOW-WHISTLE>
+                     <COND (<RT-ALARM-SET? ,RT-I-CAB-ARRIVE>
+                            <RT-CLOCK-INC-SET 0 2 0>
+                            <RT-BLOW-WHISTLE>)>
+                     <RTRUE>)
+                    (<MC-PRSO? ,TH-GROWLER-CAB>
+                     <RT-BLOW-WHISTLE>
+                     <COND (<RT-ALARM-SET? ,RT-I-CAB-ARRIVE>
+                            <RT-CLOCK-INC-SET 0 2 0>)>
+                     <RTRUE>)
+                    (<EQUAL? <GET ,GL-P-NAMW 0> ,W?CAB>
+                     <RT-BLOW-WHISTLE>)
+                    (T
+                     <RT-CYOU-MSG>
+                     <TELL "can't " VW " " AO " with " THEI "." CR>)>)
+             (<MC-VERB? SHOOT>
+              <RT-WASTE-OF-BULLETS-MSG>)>>
diff --git a/charles.zabstr b/charles.zabstr
new file mode 100644 (file)
index 0000000..a922b01
--- /dev/null
@@ -0,0 +1,53 @@
+
+<OBJECT TH-WAX-HEAD (LOC TH-CHARLES-STATUE) (FLAGS FL-TAKEABLE FL-TRYTAKE
+FL-NODESC FL-NOALL FL-HAS-SDESC FL-HAS-DESCFCN) (SYNONYM HEAD WAX) (ADJECTIVE
+HEAD WAX) (SIZE 1 CAPACITY 1 MASS 0) (GENERIC RT-GN-WAX) (ACTION
+RT-AC-TH-WAX-HEAD)> 
+<VOC "POOL" NOUN> 
+<VOC "POOL" ADJ> 
+<OBJECT TH-WAX-AX (LOC TH-CHARLES-STATUE) (FLAGS FL-TAKEABLE FL-VOWEL FL-NODESC
+FL-NOALL FL-WEAPON FL-HAS-DESCFCN FL-HAS-SDESC) (SYNONYM BLADE AX AXE WAX) (
+ADJECTIVE WAX WAX) (SIZE 12 CAPACITY 0 MASS 0) (GENERIC RT-GN-WAX) (ACTION
+DESC-WAX-AX)> 
+<VOC "MELTED" ADJ> 
+<OBJECT TH-EMERALD (FLAGS FL-READABLE FL-TAKEABLE FL-VOWEL FL-SURFACE FL-MONEY
+FL-HAS-DESCFCN FL-HAS-SDESC FL-NEEDS-IDENTITY FL-LOSE-IDENTITY) (OBJ-ADJ 0) (
+OBJ-NOUN 0) (SYNONYM EMERALD GEM GEMS SCRATCH) (ADJECTIVE GREEN EMERALD
+EMERALD\'S) (VALUE 5) (SIZE 1 MASS 1 CAPACITY 1) (GENERIC RT-GN-GEM) (ACTION
+RT-AC-TH-EMERALD)> 
+<OBJECT TH-TORCH (LOC TH-FAWKES-STATUE) (FLAGS FL-BURNABLE FL-TAKEABLE
+FL-NODESC FL-NOALL FL-HAS-SDESC FL-HAS-DESCFCN) (SYNONYM TORCH) (ADJECTIVE ZZZP
+) (SIZE 1) (ACTION RT-AC-TH-TORCH)> 
+<VOC "BURNT" ADJ> 
+<OBJECT TH-TOBACCO (LOC TH-PERSIAN-SLIPPER) (DESC "tobacco") (FLAGS FL-TAKEABLE
+FL-BURNABLE FL-PLURAL FL-COLLECTIVE FL-NOALL FL-HAS-DESCFCN) (SYNONYM TOBACCO
+SHAG) (ADJECTIVE SHAG) (VALUE 1) (SIZE 1) (ACTION RT-AC-TH-TOBACCO)> 
+<DEFINE-ROUTINE BURN-OUT-MATCH> 
+<DEFINE-ROUTINE RT-AC-TH-MATCH> 
+<DEFINE-ROUTINE CLEAR-ALL-FLAGS> 
+<DEFINE-ROUTINE RT-AC-TH-TORCH> 
+<DEFINE-ROUTINE RT-LIGHT-PIPE> 
+<DEFINE-ROUTINE RT-AC-TH-TOBACCO> 
+<DEFINE-ROUTINE RT-AC-TH-PIPE> 
+<DEFINE-ROUTINE RT-AC-TH-MAIL> 
+<DEFINE-ROUTINE RT-AC-TH-NEWSPAPER> 
+<DEFINE-ROUTINE RT-AC-TH-WESTMINSTER-CLUE> 
+<CONSTANT K-HOLMES-HEAD? 1> 
+<CONSTANT K-HOLMES-GEM? 2> 
+<DEFINE-ROUTINE RT-AC-TH-WAX-HEAD> 
+<DEFINE-ROUTINE DESC-WAX-AX> 
+<DEFINE-ROUTINE RT-GUARD-TAKE-ITEM> 
+<DEFINE-ROUTINE RT-GUARD-STOP-ENTRANCE> 
+<DEFINE-ROUTINE RT-EX-RM-EXIT-TUSSAUDS> 
+<DEFINE-ROUTINE RT-EX-RM-MATCH-SNIFFING-DOG> 
+<DEFINE-ROUTINE RT-PUT-OUT> 
+<DEFINE-ROUTINE RT-I-MATCH-OUT> 
+<DEFINE-ROUTINE BURN-MATCH-OUT> 
+<DEFINE-ROUTINE RT-I-PIPE-OUT> 
+<DEFINE-ROUTINE RT-I-TORCH-OUT> 
+<DEFINE-ROUTINE RT-I-NEWSPAPER-OUT> 
+<DEFINE-ROUTINE RT-I-CLUE-OUT> 
+<DEFINE-ROUTINE RT-I-MAIL-OUT> 
+<DEFINE-ROUTINE RT-I-MATCHBOOK-OUT> 
+<DEFINE-ROUTINE PRE-LIGHT-WITH> 
+<DEFINE-ROUTINE RT-GN-WAX> 
\ No newline at end of file
diff --git a/charles.zap b/charles.zap
new file mode 100644 (file)
index 0000000..fb24988
--- /dev/null
@@ -0,0 +1,994 @@
+
+
+       .FUNCT  BURN-OUT-MATCH
+       FCLEAR  TH-MATCH,FL-BURNABLE
+       ICALL2  CLEAR-ALL-FLAGS,TH-MATCH
+       FSET    TH-MATCH,FL-TAKEABLE
+       FSET    TH-MATCH,FL-BROKEN
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-MATCH,CONTEXT
+       EQUAL?  CONTEXT,K-M-SDESC \?CCL3
+       FSET?   TH-MATCH,FL-BROKEN \?CCL6
+       PRINTI  "burnt match"
+       RTRUE   
+?CCL6: PRINTI  "match"
+       RTRUE   
+?CCL3: EQUAL?  CONTEXT,K-M-DESCFCN \?CCL8
+       FSET?   TH-MATCH,FL-BROKEN /FALSE
+       FSET?   TH-MATCH,FL-LIGHTED \FALSE
+       ICALL2  RT-CTHEO-PRINT,TH-MATCH
+       PRINTR  " is burning."
+?CCL8: ZERO?   CONTEXT \FALSE
+       FSET?   TH-MATCH,FL-BROKEN \?CCL17
+       EQUAL?  GL-PRSA,V?LAMP-OFF,V?LIGHT,V?STRIKE /?CCL20
+       EQUAL?  GL-PRSA,V?BURN-WITH,V?LIGHT-WITH \FALSE
+?CCL20:        PRINTR  "The match is already burned out."
+?CCL17:        EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH,V?STRIKE /?PRD26
+       EQUAL?  GL-PRSA,V?LIGHT \?CCL24
+?PRD26:        EQUAL?  GL-PRSO,TH-MATCH \?CCL24
+       FSET?   TH-MATCH,FL-LIGHTED \?CCL31
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL31:        FSET?   TH-MATCH,FL-BURNABLE /?CCL33
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is burned out."
+?CCL33:        EQUAL?  GL-PRSI,TH-HANDS,FALSE-VALUE /?CCL35
+       FSET?   GL-PRSI,FL-LIGHTED \FALSE
+       FSET?   GL-PRSI,FL-BURNABLE \FALSE
+?CCL35:        FSET    TH-MATCH,FL-LIGHTED
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,2,0
+       ICALL   RT-ALARM-SET-REL,RT-I-MATCH-OUT,STACK
+       MOVE    TH-MATCH,GL-WINNER
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " flares to life."
+?CCL24:        EQUAL?  GL-PRSA,V?LAMP-OFF \FALSE
+       FSET?   TH-MATCH,FL-LIGHTED /?CCL44
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " isn't lit."
+?CCL44:        FCLEAR  TH-MATCH,FL-LIGHTED
+       ICALL1  BURN-OUT-MATCH
+       ICALL2  RT-ALARM-CLR,RT-I-MATCH-OUT
+       ICALL   RT-CYOU-MSG,STR?802,STR?803
+       PRINTR  "out the match."
+
+
+       .FUNCT  CLEAR-ALL-FLAGS,OBJ,N
+       SET     'N,1
+?PRG1: EQUAL?  N,FL-HAS-SDESC,FL-HAS-DESCFCN,FL-NEEDS-IDENTITY /?CND3
+       EQUAL?  N,FL-LOSE-IDENTITY /?CND3
+       FCLEAR  OBJ,N
+?CND3: IGRTR?  'N,48 \?PRG1
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-TORCH,CONTEXT,WHO
+       EQUAL?  CONTEXT,K-M-SDESC \?CCL3
+       FSET?   TH-TORCH,FL-BROKEN \?CCL6
+       PRINTI  "burnt torch"
+       RTRUE   
+?CCL6: PRINTI  "torch"
+       RTRUE   
+?CCL3: EQUAL?  CONTEXT,K-M-DESCFCN \?CCL8
+       FSET?   TH-TORCH,FL-BROKEN /FALSE
+       FSET?   TH-TORCH,FL-LIGHTED \FALSE
+       ICALL2  RT-CTHEO-PRINT,TH-TORCH
+       PRINTR  " is burning."
+?CCL8: FSET?   TH-TORCH,FL-BROKEN /FALSE
+       EQUAL?  GL-PRSA,V?MELT,V?HEAT,V?LIGHT-WITH /?PRD18
+       EQUAL?  GL-PRSA,V?BURN-WITH \?CCL16
+?PRD18:        EQUAL?  GL-PRSI,TH-TORCH \?CCL16
+       FSET?   TH-TORCH,FL-LIGHTED /?CCL23
+       ICALL2  RT-CTHEO-PRINT,TH-TORCH
+       PRINTR  " is not lit."
+?CCL23:        EQUAL?  GL-PRSO,TH-TORCH \?CCL25
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL25:        EQUAL?  GL-PRSO,TH-WAX-HEAD \?CCL27
+       ICALL1  RT-CTHEO-PRINT
+       PRINTI  " melts into a pool of wax on the floor. You see a gem glittering in the wax."
+       CRLF    
+       MOVE    TH-WAX-HEAD,GL-PLACE-CUR
+       MOVE    TH-EMERALD,TH-WAX-HEAD
+       ICALL2  CLEAR-ALL-FLAGS,TH-WAX-HEAD
+       FSET    TH-WAX-HEAD,FL-OPENED
+       FSET    TH-WAX-HEAD,FL-TRANSPARENT
+       FSET    TH-WAX-HEAD,FL-CONTAINER
+       FSET    TH-WAX-HEAD,FL-BROKEN
+       ICALL2  SET-MASS-TO-ONE,TH-WAX-HEAD
+       GETPT   TH-WAX-HEAD,P?SYNONYM
+       PUT     STACK,0,W?POOL
+       GETPT   TH-WAX-HEAD,P?ADJECTIVE
+       PUT     STACK,0,W?POOL
+       CALL2   RT-THIS-IS-IT,TH-EMERALD
+       RSTACK  
+?CCL27:        EQUAL?  GL-PRSO,TH-WAX-AX \?CCL29
+       ICALL1  RT-CTHEO-PRINT
+       PRINTI  " melts into a pool of wax on the floor."
+       CRLF    
+       MOVE    TH-WAX-AX,GL-PLACE-CUR
+       ICALL2  CLEAR-ALL-FLAGS,TH-WAX-AX
+       FSET    TH-WAX-AX,FL-OPENED
+       FSET    TH-WAX-AX,FL-TRANSPARENT
+       FSET    TH-WAX-AX,FL-CONTAINER
+       FSET    TH-WAX-AX,FL-BROKEN
+       ICALL2  SET-SIZE-TO-ONE,TH-WAX-AX
+       ICALL2  SET-CAPACITY-TO-ONE,TH-WAX-AX
+       ICALL2  SET-MASS-TO-ONE,TH-WAX-AX
+       GETPT   TH-WAX-AX,P?SYNONYM
+       PUT     STACK,0,W?AX
+       GETPT   TH-WAX-AX,P?ADJECTIVE
+       PUT     STACK,0,W?MELTED
+       RTRUE   
+?CCL29:        FSET?   GL-PRSO,FL-BURNABLE /FALSE
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot "
+       PRINTB  GL-P-PRSA-WORD
+       PRINTC  32
+       ICALL1  RT-THEO-PRINT
+       PRINTI  " with "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+?CCL16:        EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH \FALSE
+       EQUAL?  GL-PRSO,TH-TORCH \FALSE
+       EQUAL?  GL-PRSI,TH-TOBACCO,TH-PIPE \?CCL38
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL38
+       ICALL1  RT-CTHEI-PRINT
+       ICALL2  RT-DONT-DOESNT-MSG,GL-PRSI
+       PRINTI  "put out enough heat to light "
+       ICALL1  RT-THEO-PRINT
+       PRINTR  "."
+?CCL38:        FSET?   GL-PRSI,FL-BURNABLE /?CCL42
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot light "
+       ICALL1  RT-THEO-PRINT
+       PRINTI  " with "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+?CCL42:        FSET?   GL-PRSI,FL-LIGHTED /?CCL44
+       ICALL1  RT-CTHEI-PRINT
+       ICALL2  RT-ISNT-ARENT-MSG,GL-PRSI
+       PRINTR  "burning."
+?CCL44:        ICALL1  RT-CTHEO-PRINT
+       PRINTI  " catches fire quickly."
+       CRLF    
+       FSET    TH-TORCH,FL-LIGHTED
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,1,0,0
+       ICALL   RT-ALARM-SET-REL,RT-I-TORCH-OUT,STACK
+       CALL1   RT-WHO-SAYS? >WHO
+       EQUAL?  WHO,CH-HOLMES \?CND45
+       CRLF    
+       PRINTI  "Holmes looks at you and says, ""An ingenious solution, Watson. My compliments, old chap."""
+       CRLF    
+?CND45:        CALL2   RT-UPDATE-SCORE,4
+       RSTACK  
+
+
+       .FUNCT  RT-LIGHT-PIPE,FIRE
+       FSET?   FIRE,FL-BURNABLE /?CCL3
+       ICALL1  RT-CYOU-MSG
+       PRINTI  "cannot light "
+       ICALL1  RT-THEO-PRINT
+       PRINTI  " with "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  "."
+?CCL3: FSET?   FIRE,FL-LIGHTED /?CCL5
+       ICALL2  RT-CTHEO-PRINT,FIRE
+       PRINTR  " is not burning."
+?CCL5: FSET?   TH-TOBACCO,FL-LIGHTED \?CCL7
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL7: IN?     TH-TOBACCO,TH-PIPE \FALSE
+       FSET    TH-TOBACCO,FL-LIGHTED
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,15,0
+       ICALL   RT-ALARM-SET-REL,RT-I-PIPE-OUT,STACK
+       PRINTI  "After a few puffs, "
+       ICALL1  RT-THEO-PRINT
+       PRINTR  " fires right up."
+
+
+       .FUNCT  RT-AC-TH-TOBACCO,CONTEXT,I
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL6
+       ICALL2  RT-CTHEO-PRINT,TH-TOBACCO
+       PRINTR  " is burning."
+?CCL6: PRINTR  "It's Holmes's favorite brand of shag tobacco."
+?CCL3: ZERO?   GL-NOW-PRSI? \?CND1
+       SET     'GL-P-IT-OBJECT,TH-TOBACCO
+?CND1: EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH \?CCL10
+       EQUAL?  GL-PRSO,TH-TOBACCO \?CCL10
+       EQUAL?  GL-PRSI,FALSE-VALUE,TH-HANDS \?CCL15
+       SET     'I,TH-MATCH
+       JUMP    ?CND13
+?CCL15:        SET     'I,GL-PRSI
+?CND13:        IN?     I,GL-WINNER /?CCL18
+       ICALL   RT-CYOU-MSG,STR?228,STR?229
+       PRINTI  "not holding "
+       ICALL2  RT-A-PRINT,I
+       PRINTR  "."
+?CCL18:        IN?     TH-PIPE,GL-WINNER /?CCL20
+       ICALL   RT-CYOU-MSG,STR?228,STR?229
+       PRINTI  "not holding "
+       ICALL2  RT-THEO-PRINT,TH-PIPE
+       PRINTR  "."
+?CCL20:        FSET?   TH-TOBACCO,FL-LIGHTED \?CCL22
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL22:        CALL2   RT-LIGHT-PIPE,I
+       ZERO?   STACK \TRUE
+       ICALL1  RT-CTHEO-PRINT
+       PRINTC  32
+       PRINT   K-SMOULDERS-MSG
+       CRLF    
+       RTRUE   
+?CCL10:        EQUAL?  GL-PRSA,V?TAKE,V?TOUCH \?CCL26
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL26
+       PRINTR  "Yeeeeouch! That's hot!"
+?CCL26:        EQUAL?  GL-PRSA,V?SMOKE \?CCL30
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL33
+       PRINT   K-BRAND-MSG
+       CRLF    
+       RTRUE   
+?CCL33:        ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is not lit."
+?CCL30:        EQUAL?  GL-PRSA,V?SMELL \FALSE
+       PRINTR  "The shag has a strong, but pleasant smell."
+
+
+       .FUNCT  RT-AC-TH-PIPE,CONTEXT,I,DEST
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL6
+       IN?     TH-TOBACCO,TH-PIPE \?CCL6
+       PRINTI  "Smoke gently wafts from "
+       ICALL2  RT-THEO-PRINT,TH-PIPE
+       PRINTR  "."
+?CCL6: PRINTR  "It is an old and oily black clay pipe, the companion of Holmes's deepest meditations."
+?CCL3: ZERO?   CONTEXT \FALSE
+       ZERO?   GL-NOW-PRSI? \?CCL12
+       EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH \?CCL15
+       EQUAL?  GL-PRSI,FALSE-VALUE,TH-HANDS \?CCL18
+       SET     'I,TH-MATCH
+       JUMP    ?CND16
+?CCL18:        SET     'I,GL-PRSI
+?CND16:        IN?     I,GL-WINNER /?CCL21
+       ICALL   RT-CYOU-MSG,STR?228,STR?229
+       PRINTI  "not holding "
+       ICALL2  RT-A-PRINT,I
+       PRINTR  "."
+?CCL21:        IN?     TH-PIPE,GL-WINNER /?CCL23
+       ICALL   RT-CYOU-MSG,STR?228,STR?229
+       PRINTI  "not holding "
+       ICALL2  RT-THEO-PRINT,TH-PIPE
+       PRINTR  "."
+?CCL23:        FSET?   TH-TOBACCO,FL-LIGHTED \?CCL25
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL25:        CALL2   RT-LIGHT-PIPE,I
+       ZERO?   STACK \TRUE
+       PRINTR  "There is nothing in the pipe to light."
+?CCL15:        EQUAL?  GL-PRSA,V?PUT \?CCL29
+       EQUAL?  GL-PRSI,TH-PLAYER-BODY \?CCL29
+       GET     GL-P-NAMW,1
+       EQUAL?  STACK,W?MOUTH \?CCL29
+       CALL    RT-PERFORM,V?SMOKE,TH-PIPE
+       RSTACK  
+?CCL29:        EQUAL?  GL-PRSA,V?SMOKE \?CCL34
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL37
+       PRINT   K-BRAND-MSG
+       CRLF    
+       RTRUE   
+?CCL37:        ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is not lit."
+?CCL34:        EQUAL?  GL-PRSA,V?EMPTY-INTO,V?POUR \FALSE
+       IN?     TH-TOBACCO,TH-PIPE \FALSE
+       FSET?   TH-TOBACCO,FL-LIGHTED \FALSE
+       EQUAL?  GL-PRSA,V?POUR \?CCL45
+       FCLEAR  TH-TOBACCO,FL-LIGHTED
+       MOVE    TH-TOBACCO,GL-PLACE-CUR
+       ICALL2  RT-CTHEO-PRINT,TH-TOBACCO
+       PRINTI  " falls "
+       EQUAL?  GL-PLACE-CUR,RM-THAMES-ONE,RM-THAMES-TWO,RM-THAMES-THREE /?CTR47
+       EQUAL?  GL-PLACE-CUR,RM-THAMES-FOUR,RM-THAMES-FIVE \?CCL48
+?CTR47:        REMOVE  TH-TOBACCO
+       PRINTR  "into the water."
+?CCL48:        PRINTI  "to "
+       FSET?   GL-PLACE-CUR,FL-INDOORS \?CCL53
+       ICALL1  TELL-THE-FLOOR
+       JUMP    ?CND51
+?CCL53:        ICALL1  TELL-THE-GROUND
+?CND51:        PRINTI  ", "
+       PRINT   K-SMOULDERS-MSG
+       CRLF    
+       RTRUE   
+?CCL45:        EQUAL?  GL-PRSA,V?EMPTY-INTO \FALSE
+       CALL    RT-ROOM-IN-ON-MSG?,TH-TOBACCO,GL-PRSI
+       ZERO?   STACK \TRUE
+       CALL    RT-CHECK-MOVE-MSG?,TH-TOBACCO,GL-PRSI
+       ZERO?   STACK \TRUE
+       FCLEAR  TH-TOBACCO,FL-LIGHTED
+       MOVE    TH-TOBACCO,GL-PRSI
+       ICALL2  RT-CTHEO-PRINT,TH-TOBACCO
+       PRINTI  " falls "
+       FSET?   GL-PRSI,FL-CONTAINER \?CCL63
+       PRINTI  "into"
+       JUMP    ?CND61
+?CCL63:        PRINTI  "onto"
+?CND61:        PRINTC  32
+       ICALL1  RT-THEI-PRINT
+       PRINTI  ", "
+       PRINT   K-SMOULDERS-MSG
+       CRLF    
+       RTRUE   
+?CCL12:        ZERO?   GL-NOW-PRSI? /FALSE
+       EQUAL?  GL-PRSA,V?PUT \?CCL68
+       EQUAL?  GL-PRSO,TH-TOBACCO /?CCL68
+       PRINTI  "Putting "
+       ICALL1  RT-THEO-PRINT
+       PRINTI  " in "
+       ICALL1  RT-THEI-PRINT
+       PRINTI  " would"
+       CALL1   RT-WASTE-OF-TIME-MSG
+       RSTACK  
+?CCL68:        EQUAL?  GL-PRSA,V?POUR-FROM \FALSE
+       EQUAL?  GL-PRSO,TH-TOBACCO \FALSE
+       IN?     TH-TOBACCO,TH-PIPE \FALSE
+       FSET?   TH-TOBACCO,FL-LIGHTED \FALSE
+       FCLEAR  TH-TOBACCO,FL-LIGHTED
+       MOVE    TH-TOBACCO,GL-PLACE-CUR
+       ICALL1  RT-CTHEO-PRINT
+       PRINTI  " falls to "
+       FSET?   GL-PLACE-CUR,FL-INDOORS \?CCL79
+       ICALL1  TELL-THE-FLOOR
+       JUMP    ?CND77
+?CCL79:        ICALL1  TELL-THE-GROUND
+?CND77:        PRINTI  ", "
+       PRINT   K-SMOULDERS-MSG
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-AC-TH-MAIL,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       FSET?   TH-MAIL,FL-LIGHTED \FALSE
+       ICALL2  RT-CTHEO-PRINT,TH-MAIL
+       PRINTR  " is burning."
+?CCL3: ZERO?   CONTEXT \FALSE
+       ZERO?   GL-NOW-PRSI? \?CND1
+       SET     'GL-P-IT-OBJECT,TH-MAIL
+?CND1: EQUAL?  GL-PRSA,V?READ,V?EXAMINE,V?LOOK-ON /?CTR11
+       EQUAL?  GL-PRSA,V?LOOK-INSIDE,V?OPEN,V?SEARCH /?CTR11
+       EQUAL?  GL-PRSA,V?OPEN-WITH \?CCL12
+?CTR11:        PRINTR  "You should not read other people's mail."
+?CCL12:        EQUAL?  GL-PRSA,V?CLOSE \?CCL17
+       PRINTR  "The mail hasn't been opened."
+?CCL17:        EQUAL?  GL-PRSA,V?TAKE \?CCL19
+       ZERO?   KNIFE-COLD? /?CCL19
+       SET     'KNIFE-COLD?,FALSE-VALUE
+       MOVE    TH-KNIFE,GL-WINNER
+       PRINTI  "[Taking the knife first]"
+       ZERO?   GL-P-MULT? /?CCL24
+       PRINTC  32
+       RFALSE  
+?CCL24:        CRLF    
+       RFALSE  
+?CCL19:        EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH \FALSE
+       ZERO?   GL-NOW-PRSI? \FALSE
+       FSET?   TH-MAIL,FL-LIGHTED \?CCL31
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL31:        FSET?   GL-PRSI,FL-BURNABLE /?CCL33
+       EQUAL?  GL-PRSI,TH-PIPE \FALSE
+?CCL33:        FSET?   GL-PRSI,FL-LIGHTED \?PRD39
+       FSET?   GL-PRSI,FL-BURNABLE /?CTR36
+?PRD39:        EQUAL?  GL-PRSI,TH-PIPE \?CCL37
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL37
+?CTR36:        ICALL2  RT-CTHEO-PRINT,TH-MAIL
+       PRINTI  " lights up."
+       CRLF    
+       FSET    TH-MAIL,FL-LIGHTED
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,3,0
+       CALL    RT-ALARM-SET-REL,RT-I-MAIL-OUT,STACK
+       RSTACK  
+?CCL37:        ICALL1  RT-CTHEI-PRINT
+       ICALL2  RT-ISNT-ARENT-MSG,GL-PRSI
+       PRINTR  "burning."
+
+
+       .FUNCT  RT-AC-TH-NEWSPAPER,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       FSET?   TH-NEWSPAPER,FL-LIGHTED \?CCL6
+       ICALL2  RT-CTHEO-PRINT,TH-NEWSPAPER
+       PRINTR  " is burning."
+?CCL6: PRINTR  "It's the newspaper that came in your game package."
+?CCL3: ZERO?   CONTEXT \FALSE
+       EQUAL?  GL-PRSA,V?READ,V?READ-TO,V?SHOW /?CCL10
+       EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH,V?GIVE /?CCL10
+       EQUAL?  GL-PRSA,V?TELL-ABOUT \FALSE
+?CCL10:        IN?     TH-NEWSPAPER,CH-PLAYER /?CCL15
+       PRINTR  "The newspaper will not leap into your hand by itself."
+?CCL15:        EQUAL?  GL-PRSA,V?READ \?CCL17
+       CALL1   RT-READ-NEWSPAPER
+       RSTACK  
+?CCL17:        EQUAL?  GL-PRSA,V?READ-TO,V?SHOW,V?GIVE \?PRD21
+       ZERO?   GL-NOW-PRSI? /?CTR18
+?PRD21:        EQUAL?  GL-PRSA,V?TELL-ABOUT \?CCL19
+       ZERO?   GL-NOW-PRSI? /?CCL19
+?CTR18:        FSET?   GL-PRSI,FL-PERSON \FALSE
+       FSET?   TH-NEWSPAPER,FL-ASLEEP /?CCL29
+       FSET?   TH-NEWSPAPER,FL-OPENED \?CND26
+?CCL29:        ICALL1  RT-READ-NEWSPAPER
+       CRLF    
+?CND26:        EQUAL?  GL-PRSA,V?READ-TO,V?SHOW,V?GIVE \?PRD36
+       EQUAL?  GL-PRSI,CH-HOLMES /?CTR33
+?PRD36:        EQUAL?  GL-PRSA,V?TELL-ABOUT \?CCL34
+       EQUAL?  GL-PRSO,CH-HOLMES \?CCL34
+?CTR33:        FSET?   CH-HOLMES,FL-ASLEEP \FALSE
+       ICALL1  RT-WAKE-UP-HOLMES
+       EQUAL?  GL-PRSA,V?GIVE \TRUE
+       MOVE    TH-NEWSPAPER,CH-HOLMES
+       RTRUE   
+?CCL34:        ICALL1  RT-CTHEI-PRINT
+       ICALL2  RT-DONT-DOESNT-MSG,GL-PRSI
+       PRINTR  "seem to be interested."
+?CCL19:        EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH \FALSE
+       ZERO?   GL-NOW-PRSI? \FALSE
+       FSET?   TH-NEWSPAPER,FL-LIGHTED \?CCL52
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL52:        FSET?   GL-PRSI,FL-BURNABLE /?CCL54
+       EQUAL?  GL-PRSI,TH-PIPE \FALSE
+?CCL54:        FSET?   GL-PRSI,FL-LIGHTED \?PRD60
+       FSET?   GL-PRSI,FL-BURNABLE /?CTR57
+?PRD60:        EQUAL?  GL-PRSI,TH-PIPE \?CCL58
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL58
+?CTR57:        ICALL2  RT-CTHEO-PRINT,TH-NEWSPAPER
+       PRINTI  " lights up."
+       CRLF    
+       FSET    TH-NEWSPAPER,FL-LIGHTED
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,3,0
+       ICALL   RT-ALARM-SET-REL,RT-I-NEWSPAPER-OUT,STACK
+       RTRUE   
+?CCL58:        ICALL1  RT-CTHEI-PRINT
+       ICALL2  RT-ISNT-ARENT-MSG,GL-PRSI
+       PRINTR  "burning."
+
+
+       .FUNCT  RT-AC-TH-WESTMINSTER-CLUE,CONTEXT
+       EQUAL?  CONTEXT,K-M-DESCFCN \?CCL3
+       FSET?   TH-MAIL,FL-LIGHTED \FALSE
+       ICALL2  RT-CTHEO-PRINT,TH-MAIL
+       PRINTR  " is burning."
+?CCL3: ZERO?   CONTEXT \FALSE
+       EQUAL?  GL-PRSA,V?READ,V?EXAMINE \?CCL10
+       IN?     TH-WESTMINSTER-CLUE,CH-PLAYER /?CCL13
+       PRINTR  "The paper will not leap into your hand by itself."
+?CCL13:        GETP    TH-WESTMINSTER-CLUE,P?FLIPPED
+       ZERO?   STACK \?CCL15
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Mortality, behold and fear!"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "What a change of flesh is here!"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Think how many royal bones"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Sleep within this heap of stones:"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Here they lie, had realms and lands,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Who now want strength"
+       ICALL1  RT-WRAP-PRINT
+       PRINTI  "to stir their hands."
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINT   K-ASTERISK-MSG
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "For two-score years I reigned alone,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "A virgin queen on England's throne."
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "My navy caused Armada's shame,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "And with me died the Tudor name."
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINT   K-ASTERISK-MSG
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "The apple sorely tempted Eve,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "And Tell another aimed to cleave."
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "But when one fell, it showed to me,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "The mighty pull of gravity."
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINT   K-ASTERISK-MSG
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "My father, it was said, would die,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Beneath the Holy City's sky."
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "Jerusalem his body claimed,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "And it is after him I'm named."
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINT   K-ASTERISK-MSG
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINT   K-ASTERISK-MSG
+       CRLF    
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "O stately Holmes of England,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "In Baker Street abide."
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTI  "For even you must surely fail,"
+       CRLF    
+       ICALL1  RT-INDENT-PRINT
+       PRINTR  "To save your country's pride."
+?CCL15:        PRINTR  "This side appears to be blank."
+?CCL10:        EQUAL?  GL-PRSA,V?LIGHT-WITH,V?BURN-WITH \?CCL17
+       ZERO?   GL-NOW-PRSI? \?CCL17
+       FSET?   TH-WESTMINSTER-CLUE,FL-LIGHTED \?CCL22
+       ICALL1  RT-CTHEO-PRINT
+       PRINTR  " is already lit."
+?CCL22:        FSET?   GL-PRSI,FL-BURNABLE /?CCL24
+       EQUAL?  GL-PRSI,TH-PIPE \FALSE
+?CCL24:        FSET?   GL-PRSI,FL-LIGHTED \?PRD30
+       FSET?   GL-PRSI,FL-BURNABLE /?CTR27
+?PRD30:        EQUAL?  GL-PRSI,TH-PIPE \?CCL28
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL28
+?CTR27:        ICALL2  RT-CTHEO-PRINT,TH-WESTMINSTER-CLUE
+       PRINTI  " lights up."
+       CRLF    
+       FSET    TH-WESTMINSTER-CLUE,FL-LIGHTED
+       CALL    RT-DO-CLOCK-SET,GL-TIME-PARM,0,3,0
+       ICALL   RT-ALARM-SET-REL,RT-I-CLUE-OUT,STACK
+       RTRUE   
+?CCL28:        ICALL1  RT-CTHEI-PRINT
+       ICALL2  RT-ISNT-ARENT-MSG,GL-PRSI
+       PRINTR  "burning."
+?CCL17:        EQUAL?  GL-PRSA,V?FLIP \?CCL36
+       IN?     TH-WESTMINSTER-CLUE,GL-WINNER /?CCL39
+       ICALL   RT-CYOU-MSG,STR?228,STR?229
+       PRINTI  "not holding "
+       ICALL2  RT-THEO-PRINT,TH-WESTMINSTER-CLUE
+       PRINTR  "."
+?CCL39:        GETP    TH-WESTMINSTER-CLUE,P?FLIPPED
+       SUB     1,STACK
+       PUTP    TH-WESTMINSTER-CLUE,P?FLIPPED,STACK
+       ICALL   RT-CYOU-MSG,STR?804,STR?805
+       ICALL2  RT-THEO-PRINT,TH-WESTMINSTER-CLUE
+       PRINTR  " over."
+?CCL36:        EQUAL?  GL-PRSA,V?LOOK-THRU \FALSE
+       EQUAL?  GL-PRSI,TH-MAGNIFYING-GLASS \FALSE
+       PRINTR  "It's been wiped clean."
+
+
+       .FUNCT  RT-AC-TH-WAX-HEAD,CONTEXT
+       EQUAL?  CONTEXT,K-M-SDESC \?CCL3
+       FSET?   TH-WAX-HEAD,FL-BROKEN \?CCL6
+       PRINTI  "wax pool"
+       RTRUE   
+?CCL6: PRINTI  "wax head"
+       RTRUE   
+?CCL3: EQUAL?  CONTEXT,K-M-DESCFCN \?CCL8
+       FSET?   TH-WAX-HEAD,FL-BROKEN \FALSE
+       FIRST?  TH-WAX-HEAD /FALSE
+       PRINTI  "Looks like any other "
+       ICALL2  DPRINT,TH-WAX-HEAD
+       PRINTR  "."
+?CCL8: FSET?   TH-WAX-HEAD,FL-BROKEN /FALSE
+       IN?     TH-WAX-HEAD,TH-CHARLES-STATUE \?CCL18
+       EQUAL?  GL-PRSA,V?TAKE,V?UNSCREW-FROM \?CCL21
+       MOVE    TH-WAX-HEAD,GL-WINNER
+       FSET    TH-WAX-HEAD,FL-SEEN
+       FCLEAR  TH-WAX-HEAD,FL-NODESC
+       FCLEAR  TH-WAX-HEAD,FL-NOALL
+       ZERO?   GL-P-MULT? /?CCL24
+       PRINTR  "Taken."
+?CCL24:        ICALL   RT-CYOU-MSG,STR?697,STR?698
+       ICALL2  RT-THEO-PRINT,TH-WAX-HEAD
+       PRINTR  "."
+?CCL21:        CALL1   RT-TOUCH-VERB?
+       ZERO?   STACK /FALSE
+       FSET    TH-WAX-HEAD,FL-SEEN
+       ICALL2  RT-CTHEO-PRINT,TH-WAX-HEAD
+       PRINTI  " wobbles slightly."
+       BTST    CH-HOLMES-AUX1,1 /?CND27
+       PRINTC  32
+       ICALL2  RT-THEO-PRINT,CH-HOLMES
+       PRINTI  " says, ""Even when he was alive, he didn't have his head screwed on right."""
+       BOR     CH-HOLMES-AUX1,K-HOLMES-HEAD? >CH-HOLMES-AUX1
+?CND27:        CRLF    
+       RTRUE   
+?CCL18:        EQUAL?  GL-PRSA,V?MELT,V?HEAT \?CCL30
+       ZERO?   GL-NOW-PRSI? \?CCL30
+       FSET?   GL-PRSI,FL-BURNABLE \?PRD35
+       FSET?   GL-PRSI,FL-LIGHTED /?CTR29
+?PRD35:        EQUAL?  GL-PRSI,TH-PIPE \?CCL30
+       FSET?   TH-TOBACCO,FL-LIGHTED \?CCL30
+?CTR29:        ICALL1  RT-CTHEO-PRINT
+       PRINTI  " softens, but "
+       ICALL1  RT-THEI-PRINT
+       PRINTR  " does not put out enough heat to melt it."
+?CCL30:        EQUAL?  GL-PRSA,V?MUNG,V?KILL,V?OPEN \FALSE
+       ICALL1  RT-CYOU-MSG
+       PRINTR  "can't break into the head."
+
+
+       .FUNCT  DESC-WAX-AX,CONTEXT
+       EQUAL?  CONTEXT,K-M-SDESC \?CCL3
+       FSET?   TH-WAX-AX,FL-BROKEN \?CCL6
+       PRINTI  "melted axe"
+       RTRUE   
+?CCL6: PRINTI  "axe"
+       RTRUE   
+?CCL3: EQUAL?  CONTEXT,K-M-DESCFCN \FALSE
+       FSET?   TH-WAX-AX,FL-BROKEN \FALSE
+       FIRST?  TH-WAX-AX /FALSE
+       PRINTI  "Looks like any other "
+       ICALL2  DPRINT,TH-WAX-AX
+       PRINTR  "."
+
+
+       .FUNCT  RT-GUARD-TAKE-ITEM,OBJ1,OBJ2,OBJ3,STR
+       ICALL2  RT-CTHEO-PRINT,CH-TUSSAUDS-GUARD
+       PRINTI  " says, ""I'm sorry, but "
+       ICALL2  RT-THEO-PRINT,OBJ1
+       ZERO?   OBJ2 /?CCL3
+       ZERO?   OBJ3 /?CCL3
+       PRINTI  ", "
+       ICALL2  RT-THEO-PRINT,OBJ2
+       PRINTI  " and "
+       ICALL2  RT-THEO-PRINT,OBJ3
+       PRINTI  " are"
+       SET     'STR,STR?806
+       JUMP    ?CND1
+?CCL3: ZERO?   OBJ2 /?CCL7
+       PRINTI  " and "
+       ICALL2  RT-THEO-PRINT,OBJ2
+       PRINTI  " are"
+       SET     'STR,STR?806
+       JUMP    ?CND1
+?CCL7: PRINTI  " is"
+       SET     'STR,STR?807
+?CND1: PRINTI  " not to be removed."" He takes "
+       PRINT   STR
+       PRINTI  " and returns "
+       PRINT   STR
+       PRINTI  " to the proper place."
+       CRLF    
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RT-GUARD-STOP-ENTRANCE,OBJ,WHO
+       CALL1   RT-WHO-SAYS? >WHO
+       ICALL   SOUNDS,S-BARK,S-START,8,4
+       ICALL2  RT-CTHEO-PRINT,CH-MATCH-SNIFFING-DOG
+       PRINTI  " barks loudly and "
+       ICALL2  RT-THEO-PRINT,CH-TUSSAUDS-GUARD
+       PRINTI  " says, ""Seeing as how it's you, "
+       EQUAL?  WHO,CH-HOLMES \?CCL3
+       PRINTI  "Mr Holmes"
+       JUMP    ?CND1
+?CCL3: PRINTI  "Doctor Watson"
+?CND1: PRINTI  ", I don't mind letting you in. But as you know we are very afraid of fire here, so we have trained this dog to detect matches or open flames. I'm afraid I can't allow you"
+       EQUAL?  WHO,CH-HOLMES,CH-WIGGINS \?CND4
+       PRINTI  " or your companion"
+?CND4: PRINTI  " to enter until "
+       ICALL2  RT-THEO-PRINT,OBJ
+       PRINTR  " has been discarded."""
+
+
+       .FUNCT  RT-EX-RM-EXIT-TUSSAUDS,IN1,IN2,IN3,TORCH
+       EQUAL?  GL-PRSO,P?SOUTH,P?OUT \FALSE
+       EQUAL?  GL-PLACE-CUR,RM-MADAME-TUSSAUDS \FALSE
+       CALL    RT-META-IN?,TH-TORCH,GL-WINNER
+       ZERO?   STACK \?CCL8
+       CALL    RT-META-IN?,TH-TORCH,GL-PUPPY
+       ZERO?   STACK \?CCL8
+       SET     'IN1,0
+       JUMP    ?CND6
+?CCL8: SET     'TORCH,TH-TORCH
+       SET     'IN1,1
+?CND6: CALL    RT-META-IN?,TH-WAX-HEAD,GL-WINNER >IN2
+       ZERO?   IN2 \?PEN11
+       CALL    RT-META-IN?,TH-WAX-HEAD,GL-PUPPY >IN2
+?PEN11:        CALL    RT-META-IN?,TH-WAX-AX,GL-WINNER >IN3
+       ZERO?   IN3 \?PEN14
+       CALL    RT-META-IN?,TH-WAX-AX,GL-PUPPY >IN3
+?PEN14:        ZERO?   IN1 /?CCL19
+       ZERO?   IN2 /?CCL19
+       ZERO?   IN3 /?CCL19
+       ICALL   RT-GUARD-TAKE-ITEM,TH-TORCH,TH-WAX-HEAD,TH-WAX-AX
+       JUMP    ?CND17
+?CCL19:        ZERO?   IN1 /?CCL24
+       ZERO?   IN2 /?CCL24
+       ICALL   RT-GUARD-TAKE-ITEM,TH-TORCH,TH-WAX-HEAD
+       JUMP    ?CND17
+?CCL24:        ZERO?   IN1 /?CCL28
+       ZERO?   IN3 /?CCL28
+       ICALL   RT-GUARD-TAKE-ITEM,TH-TORCH,TH-WAX-AX
+       JUMP    ?CND17
+?CCL28:        ZERO?   IN2 /?CCL32
+       ZERO?   IN3 /?CCL32
+       ICALL   RT-GUARD-TAKE-ITEM,TH-WAX-HEAD,TH-WAX-AX
+       JUMP    ?CND17
+?CCL32:        ZERO?   IN1 /?CCL36
+       ICALL2  RT-GUARD-TAKE-ITEM,TH-TORCH
+       JUMP    ?CND17
+?CCL36:        ZERO?   IN2 /?CCL38
+       ICALL2  RT-GUARD-TAKE-ITEM,TH-WAX-HEAD
+       JUMP    ?CND17
+?CCL38:        ZERO?   IN3 /?CND17
+       ICALL2  RT-GUARD-TAKE-ITEM,TH-WAX-AX
+?CND17:        ZERO?   IN1 /?CND40
+       MOVE    TORCH,TH-FAWKES-STATUE
+       FSET    TORCH,FL-NODESC
+       FSET?   TORCH,FL-LIGHTED \?CND40
+       ICALL2  RT-ALARM-CLR,RT-I-TORCH-OUT
+       ICALL1  RT-I-TORCH-OUT
+       FSET    TH-TORCH,FL-NODESC
+?CND40:        ZERO?   IN2 /?CND44
+       MOVE    TH-WAX-HEAD,TH-CHARLES-STATUE
+       FSET    TH-WAX-HEAD,FL-NODESC
+?CND44:        ZERO?   IN3 /?CND46
+       MOVE    TH-WAX-AX,TH-CHARLES-STATUE
+       FSET    TH-WAX-AX,FL-NODESC
+?CND46:        RETURN  RM-MARYLEBONE-RD
+
+
+       .FUNCT  RT-EX-RM-MATCH-SNIFFING-DOG,OBJ,FLAME?,FIRST,LAMP?,MATCH?
+       SET     'FIRST,TRUE-VALUE
+       EQUAL?  GL-PRSO,P?NORTH,P?IN \FALSE
+       EQUAL?  GL-PLACE-CUR,RM-MARYLEBONE-RD \FALSE
+?PRG6: FIRST?  GL-WINNER >OBJ /?PRG9
+?PRG9: ZERO?   OBJ /?REP10
+       FSET?   OBJ,FL-BURNABLE \?CND11
+       FSET?   OBJ,FL-LIGHTED \?CND11
+       EQUAL?  OBJ,TH-TOBACCO /?CND11
+       SET     'FLAME?,OBJ
+?REP10:        ZERO?   FLAME? \?REP7
+       ZERO?   FIRST /?REP7
+       ZERO?   GL-PUPPY /?REP7
+       FIRST?  GL-PUPPY >OBJ /?BOGUS25
+?BOGUS25:      SET     'FIRST,FALSE-VALUE
+       JUMP    ?PRG6
+?CND11:        NEXT?   OBJ >OBJ /?PRG9
+       JUMP    ?PRG9
+?REP7: CALL    RT-META-IN?,TH-MATCH,CH-PLAYER
+       ZERO?   STACK \?PRD32
+       CALL    RT-META-IN?,TH-MATCH,GL-PUPPY
+       ZERO?   STACK /?PST31
+?PRD32:        FSET?   TH-MATCH,FL-BURNABLE /?PST36
+       FSET?   TH-MATCH,FL-LIGHTED /?PRD38
+       PUSH    0
+       JUMP    ?PRD39
+?PRD38:        PUSH    1
+?PRD39:        SET     'MATCH?,STACK
+       JUMP    ?PEN30
+?PST36:        SET     'MATCH?,1
+       JUMP    ?PEN30
+?PST31:        SET     'MATCH?,0
+?PEN30:        ZERO?   MATCH? \?CCL27
+       CALL    RT-META-IN?,TH-LAMP,CH-PLAYER >LAMP?
+       ZERO?   LAMP? \?PEN41
+       CALL    RT-META-IN?,TH-LAMP,GL-PUPPY >LAMP?
+?PEN41:        ZERO?   LAMP? \?CCL27
+       ZERO?   FLAME? /?CND26
+?CCL27:        ZERO?   FLAME? /?CCL46
+       SET     'OBJ,FLAME?
+       JUMP    ?CND44
+?CCL46:        ZERO?   LAMP? /?CCL48
+       SET     'OBJ,TH-LAMP
+       JUMP    ?CND44
+?CCL48:        ZERO?   MATCH? \?CCL50
+       SET     'OBJ,0
+       JUMP    ?CND44
+?CCL50:        SET     'OBJ,TH-MATCH
+?CND44:        ICALL2  RT-GUARD-STOP-ENTRANCE,OBJ
+       RFALSE  
+?CND26:        FSET?   TH-WAX-HEAD,FL-BROKEN /?CCL52
+       FSET?   TH-WAX-AX,FL-BROKEN /?CCL52
+       RETURN  RM-MADAME-TUSSAUDS
+?CCL52:        PRINTI  "The guard blocks your path and says, ""Oh no you don't, laddie. When I let you in earlier you made a proper mess of my museum. I won't let you do that again."" After you promise to pay for the damage and plead with him for a few moments, he finally steps aside."
+       CRLF    
+       CRLF    
+       RETURN  RM-MADAME-TUSSAUDS
+
+
+       .FUNCT  RT-PUT-OUT,THING
+       FSET?   THING,FL-BURNABLE \FALSE
+       FSET?   THING,FL-LIGHTED \FALSE
+       EQUAL?  THING,TH-MATCH \?CCL7
+       ICALL2  RT-ALARM-CLR,RT-I-MATCH-OUT
+       CALL1   RT-I-MATCH-OUT
+       RSTACK  
+?CCL7: EQUAL?  THING,TH-PIPE \?CCL9
+       ICALL2  RT-ALARM-CLR,RT-I-PIPE-OUT
+       CALL1   RT-I-PIPE-OUT
+       RSTACK  
+?CCL9: EQUAL?  THING,TH-TORCH \?CCL11
+       ICALL2  RT-ALARM-CLR,RT-I-TORCH-OUT
+       CALL1   RT-I-TORCH-OUT
+       RSTACK  
+?CCL11:        EQUAL?  THING,TH-NEWSPAPER \?CCL13
+       ICALL2  RT-ALARM-CLR,RT-I-NEWSPAPER-OUT
+       CALL1   RT-I-NEWSPAPER-OUT
+       RSTACK  
+?CCL13:        EQUAL?  THING,TH-WESTMINSTER-CLUE \?CCL15
+       ICALL2  RT-ALARM-CLR,RT-I-CLUE-OUT
+       CALL1   RT-I-CLUE-OUT
+       RSTACK  
+?CCL15:        EQUAL?  THING,TH-MAIL \?CCL17
+       ICALL2  RT-ALARM-CLR,RT-I-MAIL-OUT
+       CALL1   RT-I-MAIL-OUT
+       RSTACK  
+?CCL17:        EQUAL?  THING,TH-MATCHBOOK \?CCL19
+       ICALL2  RT-ALARM-CLR,RT-I-MATCHBOOK-OUT
+       CALL1   RT-I-MATCHBOOK-OUT
+       RSTACK  
+?CCL19:        REMOVE  THING
+       FCLEAR  THING,FL-WORN
+       FCLEAR  THING,FL-LIGHTED
+       FCLEAR  THING,FL-BURNABLE
+       ICALL2  RT-CTHEO-PRINT,THING
+       PRINTI  " burn"
+       ICALL2  RT-S-NOS-MSG,THING
+       PRINTR  " up and disappears."
+
+
+       .FUNCT  RT-I-MATCH-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-MATCH
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-MATCH
+       PRINTI  " flickers and dies."
+       CRLF    
+       SET     'RESULT,TRUE-VALUE
+?CND1: FCLEAR  TH-MATCH,FL-LIGHTED
+       ICALL1  BURN-MATCH-OUT
+       RETURN  RESULT
+
+
+       .FUNCT  BURN-MATCH-OUT
+       FCLEAR  TH-MATCH,FL-BURNABLE
+       FSET    TH-MATCH,FL-BROKEN
+       GETPT   TH-MATCH,P?ADJECTIVE
+       PUT     STACK,0,W?BURNT
+       RTRUE   
+
+
+       .FUNCT  RT-I-PIPE-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-TOBACCO
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-PIPE
+       PRINTI  " has gone out."
+       CRLF    
+?CND1: FCLEAR  TH-TOBACCO,FL-LIGHTED
+       FCLEAR  TH-TOBACCO,FL-BURNABLE
+       REMOVE  TH-TOBACCO
+       RETURN  RESULT
+
+
+       .FUNCT  RT-I-TORCH-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-TORCH
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-TORCH
+       PRINTI  " sputters and dies."
+       CRLF    
+       SET     'RESULT,TRUE-VALUE
+?CND1: ICALL2  CLEAR-ALL-FLAGS,TH-TORCH
+       GETPT   TH-TORCH,P?ADJECTIVE
+       PUT     STACK,0,W?BURNT
+       FSET    TH-TORCH,FL-TAKEABLE
+       FSET    TH-TORCH,FL-BROKEN
+       RETURN  RESULT
+
+
+       .FUNCT  RT-I-NEWSPAPER-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-NEWSPAPER
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-NEWSPAPER
+       PRINTI  " disappears into a cloud of fine ash, which itself disappears."
+       CRLF    
+       SET     'RESULT,TRUE-VALUE
+?CND1: FCLEAR  TH-NEWSPAPER,FL-LIGHTED
+       FCLEAR  TH-NEWSPAPER,FL-BURNABLE
+       REMOVE  TH-NEWSPAPER
+       RETURN  RESULT
+
+
+       .FUNCT  RT-I-CLUE-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-WESTMINSTER-CLUE
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-WESTMINSTER-CLUE
+       PRINTI  " disappears in a puff of oily black smoke."
+       CRLF    
+       SET     'RESULT,TRUE-VALUE
+?CND1: FCLEAR  TH-WESTMINSTER-CLUE,FL-LIGHTED
+       FCLEAR  TH-WESTMINSTER-CLUE,FL-BURNABLE
+       REMOVE  TH-WESTMINSTER-CLUE
+       RETURN  RESULT
+
+
+       .FUNCT  RT-I-MAIL-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-MAIL
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-MAIL
+       PRINTI  " disappears in a flash of light."
+       CRLF    
+       SET     'RESULT,TRUE-VALUE
+?CND1: FCLEAR  TH-MAIL,FL-LIGHTED
+       FCLEAR  TH-MAIL,FL-BURNABLE
+       REMOVE  TH-MAIL
+       RETURN  RESULT
+
+
+       .FUNCT  RT-I-MATCHBOOK-OUT,RESULT
+       CALL2   RT-VISIBLE?,TH-MATCHBOOK
+       ZERO?   STACK /?CND1
+       CRLF    
+       ICALL2  RT-CTHEO-PRINT,TH-MATCHBOOK
+       PRINTI  " burns up and disappears."
+       CRLF    
+       SET     'RESULT,TRUE-VALUE
+?CND1: FCLEAR  TH-MATCHBOOK,FL-LIGHTED
+       FCLEAR  TH-MATCHBOOK,FL-BURNABLE
+       REMOVE  TH-MATCHBOOK
+       RETURN  RESULT
+
+
+       .FUNCT  PRE-LIGHT-WITH
+       EQUAL?  GL-PRSO,TH-MATCH,TH-TOBACCO /FALSE
+       IN?     GL-PRSO,GL-WINNER /FALSE
+       ICALL1  RT-CYOU-MSG
+       ICALL   RT-WOULD-HAVE-TO-MSG,STR?738,GL-PRSO
+       PRINTI  " to light "
+       ICALL2  RT-SAY-HIM-HER-THEM-IT-MSG,GL-PRSO
+       PRINTR  "."
+
+
+       .FUNCT  RT-GN-WAX,TBL,LEN
+       PUTP    PSEUDO-OBJECT,P?ACTION,RT-DF-LG-WAX-STATUES
+       SET     'LAST-PSEUDO-LOC,GL-PLACE-CUR
+       RETURN  PSEUDO-OBJECT
+
+       .ENDI
diff --git a/charles.zil b/charles.zil
new file mode 100644 (file)
index 0000000..314ffd0
--- /dev/null
@@ -0,0 +1,943 @@
+;*****************************************************************************
+; "game : SHERLOCK!"
+; "file : CHARLES.ZIL"
+; "auth :   $Author:   RAB  $"
+; "date :     $Date:   28 Oct 1987 19:34:20  $"
+; "rev  : $Revision:   1.76  $"
+; "vers : 1.00"
+;*****************************************************************************
+
+;-----------------------------------------------------------------------------
+; "TH-WAX-HEAD commented out of THINGS1.ZIL"
+; "TH-WAX-AX commented out of THINGS1.ZIL"
+; "TH-EMERALD commented out of THINGS1.ZIL"
+; "TH-TORCH commented out of THINGS1.ZIL"
+; "TH-TOBACCO commented out of THINGS1.ZIL"
+;-----------------------------------------------------------------------------
+; "RT-AC-TH-MATCH commented out of THINGS2.ZIL"
+; "RT-AC-TH-TORCH commented out of THINGS2.ZIL"
+; "RT-AC-TH-TOBACCO commented out of THINGS2.ZIL"
+; "RT-AC-TH-PIPE commented out of THINGS2.ZIL"
+; "RT-AC-TH-MAIL commented out of THINGS2.ZIL"
+; "RT-AC-TH-NEWSPAPER commented out of THINGS2.ZIL"
+; "RT-AC-TH-WESTMINSTER-CLUE commented out of THINGS2.ZIL"
+;-----------------------------------------------------------------------------
+; "RT-DF-TH-MAIL commented out of THINGS3.ZIL"
+; "RT-DF-TH-NEWSPAPER commented out of THINGS3.ZIL"
+; "RT-DF-TH-WESTMINSTER-CLUE commented out of THINGS3.ZIL"
+; "RT-DF-TH-TOBACCO commented out of THINGS3.ZIL"
+; "RT-DF-TH-PIPE commented out of THINGS3.ZIL"
+; "RT-DF-TH-MATCH commented out of THINGS3.ZIL"
+; "RT-DF-TH-TORCH commented out of THINGS3.ZIL"
+;-----------------------------------------------------------------------------
+
+<OBJECT TH-WAX-HEAD
+   (LOC TH-CHARLES-STATUE)
+   (FLAGS FL-TAKEABLE FL-TRYTAKE FL-NODESC FL-NOALL FL-HAS-SDESC
+         FL-HAS-DESCFCN)
+   (SYNONYM HEAD WAX)
+   (ADJECTIVE HEAD WAX)
+   (SIZE 1 CAPACITY 1 MASS 0)
+   (GENERIC RT-GN-WAX)
+   (ACTION RT-AC-TH-WAX-HEAD)>
+
+<VOC "POOL" NOUN>
+<VOC "POOL" ADJ>
+
+<OBJECT TH-WAX-AX
+   (LOC TH-CHARLES-STATUE)
+   ;(DESC "axe")
+   (FLAGS FL-TAKEABLE FL-VOWEL FL-NODESC FL-NOALL FL-WEAPON
+         FL-HAS-DESCFCN FL-HAS-SDESC)
+   (SYNONYM BLADE AX AXE WAX)
+   (ADJECTIVE WAX WAX)
+   (SIZE 12 CAPACITY 0 MASS 0)
+   (GENERIC RT-GN-WAX)
+   (ACTION DESC-WAX-AX)>
+
+<VOC "MELTED" ADJ>
+
+<OBJECT TH-EMERALD
+   (FLAGS FL-READABLE FL-TAKEABLE FL-VOWEL FL-SURFACE FL-MONEY
+         FL-HAS-DESCFCN FL-HAS-SDESC FL-NEEDS-IDENTITY FL-LOSE-IDENTITY)
+   (OBJ-ADJ 0)
+   (OBJ-NOUN 0)
+   (SYNONYM EMERALD GEM GEMS SCRATCH)
+   (ADJECTIVE GREEN EMERALD EMERALD\'S)
+   (VALUE 5)
+   (SIZE 1 MASS 1 CAPACITY 1)
+   (GENERIC RT-GN-GEM)
+   (ACTION RT-AC-TH-EMERALD)>
+
+<OBJECT TH-TORCH
+   (LOC TH-FAWKES-STATUE)
+   ;(DESC "torch")
+   (FLAGS FL-BURNABLE FL-TAKEABLE FL-NODESC FL-NOALL FL-HAS-SDESC
+         FL-HAS-DESCFCN)
+   (SYNONYM TORCH)
+   (ADJECTIVE ZZZP)
+   (SIZE 1)
+   (ACTION RT-AC-TH-TORCH)>
+
+<VOC "BURNT" ADJ>
+
+<OBJECT TH-TOBACCO
+   (LOC TH-PERSIAN-SLIPPER)
+   (DESC "tobacco")
+   (FLAGS FL-TAKEABLE FL-BURNABLE FL-PLURAL FL-COLLECTIVE FL-NOALL
+         FL-HAS-DESCFCN)
+   (SYNONYM TOBACCO SHAG)
+   (ADJECTIVE SHAG)
+   (VALUE 1)
+   (SIZE 1)
+   (ACTION RT-AC-TH-TOBACCO)>
+
+<ROUTINE BURN-OUT-MATCH ()
+  <FCLEAR ,TH-MATCH ,FL-BURNABLE>
+  <CLEAR-ALL-FLAGS ,TH-MATCH>
+  <FSET ,TH-MATCH ,FL-TAKEABLE>
+  <FSET ,TH-MATCH ,FL-BROKEN>>
+
+<ROUTINE RT-AC-TH-MATCH ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-MATCH">>
+       <COND (<==? .CONTEXT ,K-M-SDESC>
+              <COND (<FSET? ,TH-MATCH ,FL-BROKEN>
+                     <TELL "burnt match">)
+                    (T
+                     <TELL "match">)>)
+             (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<FSET? ,TH-MATCH ,FL-BROKEN>
+                     <RFALSE>)
+                    (<MC-IS? ,TH-MATCH ,FL-LIGHTED>
+                     <TELL CTHE ,TH-MATCH " is burning." CR>)
+                    (T <RFALSE>)>)
+             (<MC-T? .CONTEXT> <RFALSE>)
+             (<FSET? ,TH-MATCH ,FL-BROKEN>
+              <COND (<MC-VERB? LAMP-OFF LIGHT STRIKE BURN-WITH LIGHT-WITH>
+                     <TELL "The match is already burned out." CR>)>)
+             (<AND <MC-VERB? LIGHT-WITH BURN-WITH STRIKE LIGHT>
+                   <MC-PRSO? ,TH-MATCH>>
+              <COND (<MC-IS? ,TH-MATCH ,FL-LIGHTED>
+                     <TELL CTHEO " is already lit." CR>)
+                    (<MC-ISNOT? ,TH-MATCH ,FL-BURNABLE>
+                     <TELL CTHEO " is burned out." CR>)
+                    (<OR <MC-PRSI? ,TH-HANDS <>>
+                         <AND <MC-IS? ,GL-PRSI ,FL-LIGHTED>
+                              <MC-IS? ,GL-PRSI ,FL-BURNABLE>>>
+                     <MC-MAKE ,TH-MATCH ,FL-LIGHTED>
+                     <RT-ALARM-SET-REL ,RT-I-MATCH-OUT
+                                       <RT-PARM-SET 0 2 0>>
+                     <MOVE ,TH-MATCH ,GL-WINNER>
+                     <TELL CTHEO " flares to life." CR>)>)
+             (<MC-VERB? LAMP-OFF>
+              <COND (<MC-ISNOT? ,TH-MATCH ,FL-LIGHTED>
+                     <TELL CTHEO " isn't lit." CR>)
+                    (T
+                     <MC-UNMAKE ,TH-MATCH ,FL-LIGHTED>
+                     ;<MC-UNMAKE ,TH-MATCH ,FL-BURNABLE>
+                     <BURN-OUT-MATCH>
+                     ;<MOVE ,TH-BURNT-MATCH <LOC ,TH-MATCH>>
+                     ;<REMOVE ,TH-MATCH>
+                     <RT-ALARM-CLR ,RT-I-MATCH-OUT>
+                     <RT-CYOU-MSG "blow" "blows">
+                     <TELL "out the match." CR>)>)>>
+
+<ROUTINE CLEAR-ALL-FLAGS (OBJ)
+  <REPEAT ((N 1))
+    <COND (<NOT <EQUAL? .N ,FL-HAS-SDESC ,FL-HAS-DESCFCN ,FL-NEEDS-IDENTITY
+                       ,FL-LOSE-IDENTITY>>
+          <FCLEAR .OBJ .N>)>
+    <COND (<G? <SET N <+ .N 1>> 48> <RETURN>)>>>
+
+<ROUTINE RT-AC-TH-TORCH ("OPTIONAL" (CONTEXT <>) "AUX" WHO)
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-TORCH">>
+       <COND (<==? .CONTEXT ,K-M-SDESC>
+              <COND (<FSET? ,TH-TORCH ,FL-BROKEN>
+                     <TELL "burnt torch">)
+                    (T
+                     <TELL "torch">)>)
+             (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<FSET? ,TH-TORCH ,FL-BROKEN>
+                     <RFALSE>)
+                    (<MC-IS? ,TH-TORCH ,FL-LIGHTED>
+                     <TELL CTHE ,TH-TORCH " is burning." CR>
+                     <RTRUE>)>
+              <RFALSE>)
+             (<FSET? ,TH-TORCH ,FL-BROKEN>
+              <RFALSE>
+              ;<RT-AC-TH-BURNT-TORCH .CONTEXT>)
+             (<AND <MC-VERB? MELT HEAT LIGHT-WITH BURN-WITH>
+                   <MC-PRSI? ,TH-TORCH>>
+              <COND (<MC-ISNOT? ,TH-TORCH ,FL-LIGHTED>
+                     <TELL CTHE ,TH-TORCH " is not lit." CR>)
+                    (<MC-PRSO? ,TH-TORCH>
+                     <TELL CTHEO " is already lit." CR>)
+                    (<MC-PRSO? ,TH-WAX-HEAD>
+                     ;<REMOVE ,TH-WAX-HEAD>
+                     ;<MOVE ,TH-WAX-POOL ,GL-PLACE-CUR>
+                     <TELL
+CTHEO " melts into a pool of wax on the floor. You see
+a gem glittering in the wax." CR>
+                     <MOVE ,TH-WAX-HEAD ,GL-PLACE-CUR>
+                     <MOVE ,TH-EMERALD ,TH-WAX-HEAD>
+                     <CLEAR-ALL-FLAGS ,TH-WAX-HEAD>
+                     <FSET ,TH-WAX-HEAD ,FL-OPENED>
+                     <FSET ,TH-WAX-HEAD ,FL-TRANSPARENT>
+                     <FSET ,TH-WAX-HEAD ,FL-CONTAINER>
+                     <FSET ,TH-WAX-HEAD ,FL-BROKEN>
+                     <SET-MASS-TO-ONE ,TH-WAX-HEAD>
+                     <PUT <GETPT ,TH-WAX-HEAD ,P?SYNONYM> 0 ,W?POOL>
+                     <PUT <GETPT ,TH-WAX-HEAD ,P?ADJECTIVE> 0 ,W?POOL>
+                     <RT-THIS-IS-IT ,TH-EMERALD>)
+                    (<MC-PRSO? ,TH-WAX-AX>
+                     ;<REMOVE ,TH-WAX-AX>
+                     ;<MOVE ,TH-MELTED-AX ,GL-PLACE-CUR>
+                     <TELL CTHEO " melts into a pool of wax on the floor." CR>
+                     <MOVE ,TH-WAX-AX ,GL-PLACE-CUR>
+                     <CLEAR-ALL-FLAGS ,TH-WAX-AX>
+                     <FSET ,TH-WAX-AX ,FL-OPENED>
+                     <FSET ,TH-WAX-AX ,FL-TRANSPARENT>
+                     <FSET ,TH-WAX-AX ,FL-CONTAINER>
+                     <FSET ,TH-WAX-AX ,FL-BROKEN>
+                     <SET-SIZE-TO-ONE ,TH-WAX-AX>
+                     <SET-CAPACITY-TO-ONE ,TH-WAX-AX>
+                     <SET-MASS-TO-ONE ,TH-WAX-AX>
+                     <PUT <GETPT ,TH-WAX-AX ,P?SYNONYM> 0 ,W?AX>
+                     <PUT <GETPT ,TH-WAX-AX ,P?ADJECTIVE> 0 ,W?MELTED>)
+                    (<MC-ISNOT? ,GL-PRSO ,FL-BURNABLE>
+                     <RT-CYOU-MSG>
+                     <TELL "cannot " VW " " THEO " with " THEI "." CR>)>)
+             (<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                   <MC-PRSO? ,TH-TORCH>>
+              <COND (<AND <MC-PRSI? ,TH-TOBACCO ,TH-PIPE>
+                          <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>>
+                     <TELL CTHEI>
+                     <RT-DONT-DOESNT-MSG ,GL-PRSI>
+                     <TELL "put out enough heat to light " THEO "." CR>)
+                    (<MC-ISNOT? ,GL-PRSI ,FL-BURNABLE>
+                     <RT-CYOU-MSG>
+                     <TELL "cannot light " THEO " with " THEI "." CR>)
+                    (<MC-ISNOT? ,GL-PRSI ,FL-LIGHTED>
+                     <TELL CTHEI>
+                     <RT-ISNT-ARENT-MSG ,GL-PRSI>
+                     <TELL "burning." CR>)
+                    (T
+                     <TELL CTHEO " catches fire quickly." CR>
+                     <MC-MAKE ,TH-TORCH ,FL-LIGHTED>
+                     <RT-ALARM-SET-REL ,RT-I-TORCH-OUT <RT-PARM-SET 1 0 0>>
+                     <SET WHO <RT-WHO-SAYS?>>
+                     <COND (<EQUAL? .WHO ,CH-HOLMES>
+                            <TELL CR
+"Holmes looks at you and says, \"An ingenious solution, Watson. My
+compliments, old chap.\"" CR>)>
+                     <RT-UPDATE-SCORE 4>)>)>>
+
+<ROUTINE RT-LIGHT-PIPE (FIRE)
+       <COND (<MC-ISNOT? .FIRE ,FL-BURNABLE>
+              <RT-CYOU-MSG>
+              <TELL "cannot light " THEO " with " THEI "." CR>)
+             (<MC-ISNOT? .FIRE ,FL-LIGHTED>
+              <TELL CTHE .FIRE " is not burning." CR>)
+             (<MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+              <TELL CTHEO " is already lit." CR>)
+             (<IN? ,TH-TOBACCO ,TH-PIPE>
+              <MC-MAKE ,TH-TOBACCO ,FL-LIGHTED>
+              <RT-ALARM-SET-REL ,RT-I-PIPE-OUT <RT-PARM-SET 0 15 0>>
+              <TELL "After a few puffs, " THEO " fires right up." CR>)>>
+
+<ROUTINE RT-AC-TH-TOBACCO ("OPTIONAL" (CONTEXT <>) "AUX" I)
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-TOBACCO">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+                     <TELL CTHE ,TH-TOBACCO " is burning." CR>)
+                    (T
+                     <TELL "It's Holmes's favorite brand of shag tobacco." CR>)>
+              <RTRUE>)
+             (<MC-THIS-PRSO?>
+              <SETG GL-P-IT-OBJECT ,TH-TOBACCO>)>
+       <COND (<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                   <MC-PRSO? ,TH-TOBACCO>>
+              <COND (<MC-PRSI? <> ,TH-HANDS>
+                     <SET I ,TH-MATCH>)
+                    (T
+                     <SET I ,GL-PRSI>)>
+              <COND (<NOT <IN? .I ,GL-WINNER>>
+                     <RT-CYOU-MSG "are" "is">
+                     <TELL "not holding " A .I "." CR>)
+                    (<NOT <IN? ,TH-PIPE ,GL-WINNER>>
+                     <RT-CYOU-MSG "are" "is">
+                     <TELL "not holding " THE ,TH-PIPE "." CR>)
+                    (<MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+                     <TELL CTHEO " is already lit." CR>)
+                    (<RT-LIGHT-PIPE .I>
+                     <RTRUE>)
+                    (T
+                     <TELL CTHEO " " ,K-SMOULDERS-MSG CR>)>)
+             (<AND <MC-VERB? TAKE TOUCH>
+                   <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>>
+              <TELL "Yeeeeouch! That's hot!" CR>)
+             ;(<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                    <MC-PRSI? ,TH-TOBACCO>
+                    <MC-IS? ,GL-PRSO ,FL-BURNABLE>>
+               <COND (<MC-PRSO? ,TH-TORCH>
+                      <RFALSE>)
+                     (<MC-ISNOT? ,TH-TOBACCO ,FL-LIGHTED>
+                      <TELL CTHEI " is not lit." CR>)
+                     (<MC-IS? ,GL-PRSO ,FL-LIGHTED>
+                      <TELL CTHEO " is already burning." CR>)
+                     (<MC-PRSO? ,TH-NEWSPAPER ,TH-WESTMINSTER-CLUE ,TH-MAIL>
+                      <TELL CTHEO " lights right up." CR>
+                      <MC-MAKE ,GL-PRSO ,FL-LIGHTED> 
+                      <COND (<MC-PRSO? ,TH-NEWSPAPER>
+                             <RT-ALARM-SET-REL ,RT-I-NEWSPAPER-OUT <RT-PARM-SET 0 3 0>>)
+                            (<MC-PRSO? ,TH-WESTMINSTER-CLUE>
+                             <RT-ALARM-SET-REL ,RT-I-CLUE-OUT <RT-PARM-SET 0 3 0>>)
+                            (<MC-PRSO? ,TH-MAIL>
+                             <RT-ALARM-SET-REL ,RT-I-MAIL-OUT <RT-PARM-SET 0 3 0>>)>)
+                     (T
+                      <TELL "Unfortunately, " THEI " doesn't put out enough heat to light " THEO "." CR>)>)
+             (<MC-VERB? SMOKE>
+              <COND (<MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+                     <TELL ,K-BRAND-MSG CR>)
+                    (T
+                     <TELL CTHEO " is not lit." CR>)>)
+             (<MC-VERB? SMELL>
+              <TELL "The shag has a strong, but pleasant smell." CR>)>>
+
+<ROUTINE RT-AC-TH-PIPE ("OPTIONAL" (CONTEXT <>) "AUX" I DEST)
+        <DEBUGGING? <RT-DEBUG-OB-AC "TH-PIPE">>
+        <COND (<==? .CONTEXT ,K-M-DESCFCN>
+               <COND (<AND <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+                           <IN? ,TH-TOBACCO ,TH-PIPE>>
+                      <TELL "Smoke gently wafts from " THE ,TH-PIPE "." CR>)
+                     (T
+                      <TELL "It is an old and oily black clay pipe, the companion of Holmes's deepest meditations." CR>)>)
+              (<MC-T? .CONTEXT> <RFALSE>)
+              (<MC-THIS-PRSO?>
+               <COND (<MC-VERB? LIGHT-WITH BURN-WITH>
+                      <COND (<MC-PRSI? <> ,TH-HANDS>
+                             <SET I ,TH-MATCH>)
+                            (T
+                             <SET I ,GL-PRSI>)>
+                      <COND (<NOT <IN? .I ,GL-WINNER>>
+                             <RT-CYOU-MSG "are" "is">
+                             <TELL "not holding " A .I "." CR>)
+                            (<NOT <IN? ,TH-PIPE ,GL-WINNER>>
+                             <RT-CYOU-MSG "are" "is">
+                             <TELL "not holding " THE ,TH-PIPE "." CR>)
+                            (<MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+                             <TELL CTHEO " is already lit." CR>)
+                            (<RT-LIGHT-PIPE .I>
+                             <RTRUE>)
+                            ;(<FIRST? ,TH-PIPE>
+                             <RT-CYOU-MSG>
+                             <TELL "cannot light " THE <FIRST? ,TH-PIPE>
+                                   " in " THE ,TH-PIPE "." CR>)
+                            (T
+                             <TELL "There is nothing in the pipe to light." CR>)>)
+                     (<AND <MC-VERB? PUT>
+                           <MC-PRSI? ,TH-PLAYER-BODY>
+                           <==? <ZGET ,GL-P-NAMW 1> ,W?MOUTH>>
+                      <RT-PERFORM ,V?SMOKE ,TH-PIPE>)
+                     (<MC-VERB? SMOKE>
+                      <COND (<MC-IS? ,TH-TOBACCO ,FL-LIGHTED>
+                             <TELL ,K-BRAND-MSG CR>)
+                            (T
+                             <TELL CTHEO " is not lit." CR>)>)
+                     (<AND <MC-VERB? EMPTY-INTO POUR>
+                           <IN? ,TH-TOBACCO ,TH-PIPE>
+                           <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>>
+                      <COND (<MC-VERB? POUR>
+                             <MC-UNMAKE ,TH-TOBACCO ,FL-LIGHTED>
+                             <MOVE ,TH-TOBACCO ,GL-PLACE-CUR>
+                             <TELL CTHE ,TH-TOBACCO " falls ">
+                             <COND (<MC-HERE? ,RM-THAMES-ONE ,RM-THAMES-TWO
+                                             ,RM-THAMES-THREE ,RM-THAMES-FOUR
+                                             ,RM-THAMES-FIVE>
+                                    <REMOVE ,TH-TOBACCO>
+                                    <TELL "into the water." CR>)
+                                   (T
+                                    <TELL "to ">
+                                    <COND (<MC-IS? ,GL-PLACE-CUR ,FL-INDOORS>
+                                           <TELL-THE-FLOOR>)
+                                          (T
+                                           <TELL-THE-GROUND>)>
+                                    <TELL ", " ,K-SMOULDERS-MSG CR>)>)
+                            (<MC-VERB? EMPTY-INTO>
+                             <COND (<RT-ROOM-IN-ON-MSG? ,TH-TOBACCO ,GL-PRSI>
+                                    <RTRUE>)
+                                   (<RT-CHECK-MOVE-MSG? ,TH-TOBACCO ,GL-PRSI>
+                                    <RTRUE>)
+                                   (T
+                                    <MC-UNMAKE ,TH-TOBACCO ,FL-LIGHTED>
+                                    <MOVE ,TH-TOBACCO ,GL-PRSI>
+                                    <TELL CTHE ,TH-TOBACCO " falls ">
+                                    <COND (<MC-IS? ,GL-PRSI ,FL-CONTAINER>
+                                           <TELL "into">)
+                                          (T
+                                           <TELL "onto">)>
+                                    <TELL " " THEI ", " ,K-SMOULDERS-MSG CR>)>)>)>)
+              (<MC-THIS-PRSI?>
+               <COND (<AND <MC-VERB? PUT>
+                           <NOT <MC-PRSO? ,TH-TOBACCO>>>
+                      <TELL "Putting " THEO " in " THEI " would">
+                      <RT-WASTE-OF-TIME-MSG>)
+                     (<AND <MC-VERB? POUR-FROM>
+                           <MC-PRSO? ,TH-TOBACCO>
+                           <IN? ,TH-TOBACCO ,TH-PIPE>
+                           <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>>
+                      <MC-UNMAKE ,TH-TOBACCO ,FL-LIGHTED>
+                      <MOVE ,TH-TOBACCO ,GL-PLACE-CUR>
+                      <TELL CTHEO " falls to ">
+                      <COND (<MC-IS? ,GL-PLACE-CUR ,FL-INDOORS>
+                             <TELL-THE-FLOOR>)
+                            (T
+                             <TELL-THE-GROUND>)>
+                      <TELL ", " ,K-SMOULDERS-MSG CR>)
+                     ;(<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                            <MC-THIS-PRSI?>
+                            <MC-IS? ,GL-PRSO ,FL-BURNABLE>>
+                       <COND (<MC-PRSO? ,TH-TORCH>
+                              <RFALSE>)
+                             (<MC-ISNOT? ,TH-TOBACCO ,FL-LIGHTED>
+                              <TELL CTHEI " is not lit." CR>)
+                             (<MC-IS? ,GL-PRSO ,FL-LIGHTED>
+                              <TELL CTHEO " is already burning." CR>)
+                             (<MC-PRSO? ,TH-NEWSPAPER ,TH-WESTMINSTER-CLUE ,TH-MAIL>
+                              <TELL CTHEO " lights right up." CR>
+                              <MC-MAKE ,GL-PRSO ,FL-LIGHTED>
+                              <COND (<MC-PRSO? ,TH-NEWSPAPER>
+                                     <RT-ALARM-SET-REL ,RT-I-NEWSPAPER-OUT <RT-PARM-SET 0 3 0>>)
+                                    (<MC-PRSO? ,TH-WESTMINSTER-CLUE>
+                                     <RT-ALARM-SET-REL ,RT-I-CLUE-OUT <RT-PARM-SET 0 3 0>>)
+                                    (<MC-PRSO? ,TH-MAIL>
+                                     <RT-ALARM-SET-REL ,RT-I-MAIL-OUT <RT-PARM-SET 0 3 0>>)>)
+                             (T
+                              <TELL "Unfortunately, " THEI " doesn't put out
+                                     enough heat to light " THEO "." CR>)>)>)>>
+
+<ROUTINE RT-AC-TH-MAIL ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-MAIL">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<MC-IS? ,TH-MAIL ,FL-LIGHTED>
+                     <TELL CTHE ,TH-MAIL " is burning." CR>
+                     <RTRUE>)
+                    (T
+                     <RFALSE>)>)
+             (<MC-T? .CONTEXT> <RFALSE>)
+             (<MC-THIS-PRSO?>
+              <SETG GL-P-IT-OBJECT ,TH-MAIL>)>
+       <COND (<MC-VERB? READ EXAMINE LOOK-ON LOOK-INSIDE OPEN SEARCH OPEN-WITH>
+              <TELL "You should not read other people's mail." CR>)
+             (<MC-VERB? CLOSE>
+              <TELL "The mail hasn't been opened." CR>)
+             (<AND <MC-VERB? TAKE>
+                   <T? ,KNIFE-COLD?>>
+              <SETG KNIFE-COLD? <>>
+              <MOVE ,TH-KNIFE ,GL-WINNER>
+              <TELL "[Taking the knife first]">
+              <COND (,GL-P-MULT?
+                     <TELL " ">)
+                    (T
+                     <CRLF>)>
+              <RFALSE>)
+             (<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                   <MC-THIS-PRSO?>>
+              <COND (<MC-IS? ,TH-MAIL ,FL-LIGHTED>
+                     <TELL CTHEO " is already lit." CR>)
+                    (<AND <MC-ISNOT? ,GL-PRSI ,FL-BURNABLE>
+                          <NOT <MC-PRSI? ,TH-PIPE>>>
+                     <RFALSE>)
+                    (<OR <AND <MC-IS? ,GL-PRSI ,FL-LIGHTED>
+                              <MC-IS? ,GL-PRSI ,FL-BURNABLE>>
+                         <AND <MC-PRSI? ,TH-PIPE>
+                              <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>>>
+                     <TELL CTHE ,TH-MAIL " lights up." CR>
+                     <MC-MAKE ,TH-MAIL ,FL-LIGHTED>
+                     <RT-ALARM-SET-REL ,RT-I-MAIL-OUT <RT-PARM-SET 0 3 0>>)
+                    (T
+                     <TELL CTHEI>
+                     <RT-ISNT-ARENT-MSG ,GL-PRSI>
+                     <TELL "burning." CR>)>)>>
+
+<ROUTINE RT-AC-TH-NEWSPAPER ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-NEWSPAPER">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<MC-IS? ,TH-NEWSPAPER ,FL-LIGHTED>
+                     <TELL CTHE ,TH-NEWSPAPER " is burning." CR>)
+                    (T
+                     <TELL
+                      "It's the newspaper that came in your game package."
+                      CR>)>
+              <RTRUE>)
+             (<MC-T? .CONTEXT> <RFALSE>)
+             (<NOT <MC-VERB? READ READ-TO SHOW LIGHT-WITH BURN-WITH
+                             GIVE TELL-ABOUT>>
+              <RFALSE>)
+             (<NOT <IN? ,TH-NEWSPAPER ,CH-PLAYER>>
+              <TELL "The newspaper will not leap into your hand by itself." CR>)
+             (<MC-VERB? READ>
+              <RT-READ-NEWSPAPER>)
+             (<OR <AND <MC-VERB? READ-TO SHOW GIVE>
+                       <MC-THIS-PRSO?>>
+                  <AND <MC-VERB? TELL-ABOUT>
+                       <MC-THIS-PRSI?>>>
+              <COND (<MC-ISNOT? ,GL-PRSI ,FL-PERSON>
+                     <RFALSE>)
+                    (<OR <MC-IS? ,TH-NEWSPAPER ,FL-ASLEEP>
+                         <MC-IS? ,TH-NEWSPAPER ,FL-OPENED>>
+                     <RT-READ-NEWSPAPER>
+                     <CRLF>)>
+              <COND (<OR <AND <MC-VERB? READ-TO SHOW GIVE>
+                              <MC-PRSI? ,CH-HOLMES>>
+                         <AND <MC-VERB? TELL-ABOUT>
+                              <MC-PRSO? ,CH-HOLMES>>>
+                     <COND (<MC-IS? ,CH-HOLMES ,FL-ASLEEP>
+                            <RT-WAKE-UP-HOLMES>
+                            <COND 
+                             (<MC-VERB? GIVE>
+                              <MOVE ,TH-NEWSPAPER ,CH-HOLMES>)>
+                            <RTRUE>)
+                           ;(T
+                             <TELL "\"Don't be tedious, Watson. You have ">
+                             <COND (<MC-VERB? READ-TO>
+                                    <TELL "read">)
+                                   (<MC-VERB? SHOW>
+                                    <TELL "shown">)
+                                   (<MC-VERB? GIVE>
+                                    <TELL "given">)
+                                   (<MC-VERB? TELL-ABOUT>
+                                    <TELL "mentioned">)>
+                             <TELL " that to me already.\"" CR>)>)
+                    (T
+                     <TELL CTHEI>
+                     <RT-DONT-DOESNT-MSG ,GL-PRSI>
+                     <TELL "seem to be interested." CR>)>)
+             (<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                   <MC-THIS-PRSO?>>
+              <COND (<MC-IS? ,TH-NEWSPAPER ,FL-LIGHTED>
+                     <TELL CTHEO " is already lit." CR>)
+                    (<AND <MC-ISNOT? ,GL-PRSI ,FL-BURNABLE>
+                          <NOT <MC-PRSI? ,TH-PIPE>>>
+                     <RFALSE>)
+                    (<OR <AND <MC-IS? ,GL-PRSI ,FL-LIGHTED>
+                              <MC-IS? ,GL-PRSI ,FL-BURNABLE>>
+                         <AND <MC-PRSI? ,TH-PIPE>
+                              <MC-IS? ,TH-TOBACCO ,FL-LIGHTED>>>
+                     <TELL CTHE ,TH-NEWSPAPER " lights up." CR>
+                     <MC-MAKE ,TH-NEWSPAPER ,FL-LIGHTED>
+                     <RT-ALARM-SET-REL ,RT-I-NEWSPAPER-OUT <RT-PARM-SET 0 3 0>>
+                     <RTRUE>)
+                    (T
+                     <TELL CTHEI>
+                     <RT-ISNT-ARENT-MSG ,GL-PRSI>
+                     <TELL "burning." CR>)>)>>
+
+<ROUTINE RT-AC-TH-WESTMINSTER-CLUE ("OPTIONAL" (CONTEXT <>))
+       <DEBUGGING? <RT-DEBUG-OB-AC "TH-WESTMINSTER-CLUE">>
+       <COND (<==? .CONTEXT ,K-M-DESCFCN>
+              <COND (<MC-IS? ,TH-MAIL ,FL-LIGHTED>
+                     <TELL CTHE ,TH-MAIL " is burning." CR>
+                     <RTRUE>)
+                    (T <RFALSE>)>)
+             (<MC-T? .CONTEXT> <RFALSE>)
+             (<MC-VERB? READ EXAMINE>
+              <COND (<NOT <IN? ,TH-WESTMINSTER-CLUE ,CH-PLAYER>>
+                     <TELL "The paper will not leap into your hand by itself." CR>)
+                    (<ZERO? <GETP ,TH-WESTMINSTER-CLUE ,P?FLIPPED>>
+                     <TELL 
+INDENT "Mortality, behold and fear!" CR
+INDENT "What a change of flesh is here!" CR
+INDENT "Think how many royal bones" CR
+INDENT "Sleep within this heap of stones:" CR
+INDENT "Here they lie, had realms and lands," CR
+INDENT "Who now want strength" WRAP "to stir their hands." CR CR
+
+INDENT ,K-ASTERISK-MSG CR CR
+                     
+INDENT "For two-score years I reigned alone," CR
+INDENT "A virgin queen on England's throne." CR
+INDENT "My navy caused Armada's shame," CR
+INDENT "And with me died the Tudor name." CR CR
+
+INDENT ,K-ASTERISK-MSG CR CR
+
+INDENT "The apple sorely tempted Eve," CR
+INDENT "And Tell another aimed to cleave." CR
+INDENT "But when one fell, it showed to me," CR
+INDENT "The mighty pull of gravity." CR CR
+
+INDENT ,K-ASTERISK-MSG CR CR
+
+INDENT "My father, it was said, would die," CR
+INDENT "Beneath the Holy City's sky." CR
+INDENT "Jerusalem his body claimed," CR
+INDENT "And it is after him I'm named." CR CR
+
+INDENT ,K-ASTERISK-MSG CR CR
+
+INDENT ,K-ASTERISK-MSG CR CR
+
+INDENT "O stately Holmes of England," CR
+INDENT "In Baker Street abide." CR
+INDENT "For even you must surely fail," CR
+INDENT "To save your country's pride." CR>)
+                    (T
+                     <TELL "This side appears to be blank." CR>)>)
+             (<AND <MC-VERB? LIGHT-WITH BURN-WITH>
+                   <MC-THIS-PRSO?>>
+              <COND (<MC-IS? ,TH-WESTMINSTER-CLUE ,FL-LIGHTED>
+                     <TELL CTHEO " is already lit." CR>)
+                    (<AND <MC-ISNOT? ,GL-PRSI ,FL-BURNABLE>
+                          <NOT <MC-PRSI? ,TH-PIPE>>>
+                     <RFALSE>)
+                    (<OR <AND <MC-IS? ,GL-PRSI ,FL-LIGHTED>
+                              <MC-IS? ,GL-PRSI ,FL-BURNABLE>>
+       &