EXTERNALROUTINE WUMPUS (STRING(255) PARMZZZ)
 !%EXTERNALROUTINESPEC PROMPT(%STRING(15)S)
 !%EXTERNALSTRINGFNSPEC TIME
 INTEGERFNSPEC FNR(INTEGER I)
 INTEGERARRAY R(1:20,1:3),BOG(1:20)
 ROUTINE DRAIN
  SKIP SYMBOL WHILE NEXT SYMBOL#NL ; SKIP SYMBOL
  END
 INTEGERFN GETANS
  INTEGER SYM
   SKIP SYMBOL WHILE 'N'#NEXTSYMBOL&95#'Y'
   SYM=NEXTSYMBOL&95 ; DRAIN ; RESULT=SYM
  END
 ROUTINE GET REQUEST(INTEGERNAME SYM)
  CYCLE
   SYM=NEXTCH
   IF '0'<=SYM<='9' THENEXIT
   IF SYM='s' OR SYM='S' THENEXIT
  SKIPSYMBOL
  REPEAT
  IF SYM='s' THEN SYM='S'
  IF SYM#'S' THEN READ(SYM)
  DRAIN
  END
 INTEGER NO OF ARROWS, MOVE TO, W, H, B1, B2, P1, P2, WO, PO, BO
 INTEGER N1, N2, I, J, K, L, P, T, A1, ANS
 STRING(255) LINE
 ROUTINE RANDOMISE
  INTEGER TEMP
   N1=0
   LINE=TIME
   CYCLE I=1,1,LENGTH(LINE)
    N1=N1+CHARNO(LINE,I)
   REPEAT
   N2=10000-N1
   CYCLE I=1,1,20
    TEMP=FNR(20)
    BOG(I)=0
   REPEAT
   CYCLE I=1,1,20
    CYCLE J=1,1,3
     R(I,J)=0
    REPEAT
   REPEAT
   P=1
   R(1,1)=99
   CYCLE I=1,1,19
    T=FNR(20) UNTIL R(T,1)=0
    R(P,2)=T
    R(T,1)=P
    P=T
   REPEAT
   R(P,2)=1
   R(1,1)=P
   P2=FNR(20)
   R(P2,3)=99
   R(R(P2,2),3)=99
   P=1
   CYCLE I=1,1,8
    P=P+1 WHILE R(P,3)>0
    T=FNR(20) UNTIL R(T,1)#P  AND  R(T,2)#P  AND  P#T  AND  R(T,3)=0
    R(P,3)=T
    R(T,3)=P
    P=P+1
   REPEAT
   LABEL: T=FNR(20) UNTIL C
             P2#T  AND  R(P2,1)#T  AND  R(P2,2)#T  AND  R(T,3)=0
   P=R(P2,2)
   R(P2,3)=T
   R(T,3)=P2
   IF R(R(P,1),3)=0 OR R(R(P,2),3)=0 THEN R(T,3)=0 AND ->LABEL
   T=FNR(20) UNTIL P#T AND R(P,2)#T AND R(P,1)#T AND R(T,3)=0
   R(P,3)=T
   R(T,3)=P
   W=FNR(20)
   B1=FNR(20)
   B2=FNR(20) UNTIL B2#B1
   P1=FNR(20)
   P2=FNR(20) UNTIL P2#P1
   H=FNR(20)  UNTIL  H#W  AND  H#P1  AND  H#P2  AND  H#B1  AND H#B2
  END
 ROUTINE  GET NOW
  INTEGER H1
   WO=0 ; BO=0 ; PO=0
   CYCLE I=1,1,3
    H1=R(H,I)
    IF H1=P1 OR H1=P2 THEN PO=1
    IF H1=B1 OR H1=B2 THEN BO=1
    IF H1=W THEN WO=1
    CYCLE J=1,1,3
     IF  R(H1,1)=W  OR  R(H1,2)=W  OR  R(H1,3)=W  THEN WO=1
    REPEAT
   REPEAT
  END
 ROUTINE SUMMARIZE(INTEGER I)
  IF I>0 THEN ->SKIP
  PRINTSTRING("You are in room")
  WRITE(H,0);NEWLINE
  SKIP:PRINTSTRING("There are passages to")
  WRITE(R(H,1),0);PRINTCH(',')
  WRITE(R(H,2),0);PRINTCH(',')
  WRITE(R(H,3),0);NEWLINE
  IF WO=1 THEN PRINTSTRING("I smell a Wumpus") AND NEWLINE
  IF PO=1 THEN PRINTSTRING("I feel a draft") AND NEWLINE
  IF BO=1 THEN PRINTSTRING("I hear squeaking") AND NEWLINE
 END
 INTEGERFN FNR(INTEGER I)
  REAL RTEMP
  INTEGER TEMP
   TEMP=((3*(N1<<14)+N2)+N2<<14)&(1<<28-1)
   N2=TEMP&X'3FFF'
   N1=(TEMP-N2)>>14
   RTEMP=TEMP/(1<<28)
   RESULT=1+INTPT(I*RTEMP)
  END
  PRINTSTRING("Would you like to see the rules?") ; NEWLINE
  IF GETANS='Y' THENSTART
   PRINTSTRING("Sorry, chum - but there aint none!!!")
   NEWLINE
  FINISH
  PROMPT(":")
  BEGIN: RANDOMISE
  NO OF ARROWS=5
  MOVE LOOP: GET NOW
  ERROR INPUT: SUMMARIZE(0)
  GET MOVE: PRINTSTRING("Your move, or ""S"" to shoot.") ; NEWLINE
  GET REQUEST(MOVE TO)
  IF MOVE TO='S' THEN ->SHOOT ELSE ->MOVE
  WHAT ERR:
  PRINTSTRING("What, er..");PRINTCH(7);NEWLINE;->ERROR INPUT
  MOVE:
  IF R(H,1)=MOVETO OR R(H,2)=MOVETO OR R(H,3)=MOVETO START
   H=MOVE TO
  FINISHELSESTART
   ->WHAT ERR
  FINISH
  CHECK: IF H=W THEN ->EAT HUNTER
  IF H=P1 OR H=P2 THEN ->PIT
  IF H=B1 OR H=B2 THEN ->BAT
  IF BOG(H)#0 THEN ->TOILET
  ->MOVE LOOP
  BAT: LOOP:
  T=FNR(20)
  IF T=H THEN ->LOOP
  H=T
  PRINTSTRING("You have been captured by a bat !!!");NEWLINE
  PRINTSTRING("You are now in room");WRITE(H,0);NEWLINE
  IF H=W OR H=B1 OR H=B2 OR H=P1 OR H=P2 THEN ->CHECK
  GET NOW
  SUMMARIZE(1)
  ->GET MOVE
  EAT HUNTER:
  PRINTSTRING("You were eaten by the Wumpus!! You LOSE!!!")
  ->FINISH
  PIT:
  PRINTSTRING("You fell into a BOTTOMless pit!! ")
  PRINTSTRING("You LOSE!!!") AND ->FINISH UNLESS C
       FNR(10)=10 AND (H=B1 OR H=B2)
  PRINTSTRING("But .... ");NEWLINE ; ->BAT
  SHOOT: IF NO OF ARROWS=0 THEN ->NO ARROWS
  NO OF ARROWS=NO OF ARROWS-1
  A1=H
  CYCLE I=1,1,5
   GET ARROW: PRINTSTRING("Where to?") ; NEWLINE
   GET REQUEST(J)
   EXITIF J='S'
   ->BOUNCE UNLESS J=R(A1,1)  OR  J=R(A1,2)  OR  J=R(A1,3)
   ->BOUNCE UNLESS FNR(10)<10
   A1=J ; IF A1=W THEN ->KILL ; IF A1=H THEN ->SUICIDE
   PRINTSTRING("Missed !!!") ; NEWLINE
  REPEAT
  WAKE WUMPUS: IF FNR(4)=4 THEN ->MOVELOOP
  BOG(W)=1
  W=R(W,FNR(3));  BOG(W)=0 ;
  IF H#W THENSTART
   PRINTSTRING("You've woken the Wumpus!!!")
   NEWLINE
   ->MOVE LOOP
  FINISH
  PRINTSTRING("The Wumpus moved into your room !!!"); NEWLINE
  ->EAT HUNTER
  SUICIDE: PRINTSTRING("Fool, you shot yourself !!!"); NEWLINE; ->FINISH
  KILL: PRINTSTRING("CONGRATULATIONS, Great White Hunter !!!"); NEWLINE
  PRINTSTRING("You slew the dreaded Wumpus !!!"); ->FINISH
  NO ARROWS: PRINTSTRING("No arrows left !!!");NEWLINE; ->MOVE LOOP
  TOILET: PRINTSTRING("Whoops! You've landed in Wump-Shit!!!")
  NEWLINE ; ->MOVE LOOP
  BOUNCE:
   CYCLE K=I,1,5
    PRINTSTRING("BouNCE!!!")
    NEWLINE
    A1=R(A1,FNR(3))
    IF A1=H THEN ->SUICIDE
    IF A1=W THEN ->KILL
   REPEAT
  ->WAKE WUMPUS
  FINISH: NEWLINE
  PRINTSTRING("Another game?")
  NEWLINE
  ANS=GETANS
  IF ANS='Y' THEN ANS=FNR(10000) AND ->BEGIN
 END

begin
  wumpus("")
end

ENDOFFILE