%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 %ENDOFFILE