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