10 REM GOBLIN CAVE ADVENTURE 20 REM PHASE 5.2: TITLE SCREEN & HELP/NPC COMMANDS 30 MODE 7 40 VDU 23,1,0;0;0;0;: REM TURN OFF CURSOR 45 PROC_title 50 PRINT "INITIALISING CAVE SYSTEM..." 60 PROC_init_arrays 70 PROC_init_data 80 PROC_generate_map 85 PX%=4:PY%=4:PZ%=0: HP%=20: WON%=0 86 VDU 26: CLS: VDU 28,0,24,39,1 : REM SET SCROLLING WINDOW 90 REPEAT 100 PROC_hud 105 PRINT STRING$(39,"-") 110 PROC_describe 115 PROC_atmosphere 120 PROC_input 130 PROC_action 140 PROC_npc_turn 145 PROC_time 150 UNTIL HP%<=0 OR WON%<>0 160 VDU 26 : REM RESET WINDOW 165 IF HP%<=0 THEN PRINT "YOU HAVE DIED IN THE DARK." 166 IF WON%<>0 THEN PRINT "ALL ENEMIES ARE DEAD. YOU SURVIVED!" 170 END 180 : 190 DEF PROC_init_arrays 200 DIM MAP%(1,9,9), VST%(1,9,9), BAR%(1,9,9), TRT%(1,9,9) 240 DIM D$(35) 250 DIM OB_Z%(9), OB_X%(9), OB_Y%(9), OB_N$(9), OB_T%(9) 255 DIM DR_Z%(4), DR_X1%(4), DR_Y1%(4), DR_X2%(4), DR_Y2%(4), DR_S%(4), DR_K%(4), DR_N$(4) 260 DIM NP_Z%(10), NP_X%(10), NP_Y%(10), NP_A%(10), NP_H%(10), NP_N$(10) 265 FOR I%=1 TO 9: NP_Z%(I%)=-1: NEXT I% 270 RNG%=0 280 ENDPROC 290 : 300 DEF PROC_init_data 310 FOR I%=1 TO 35:READ D$(I%):NEXT I% 320 DATA "GOBLIN GUARD POST", "WOODEN GATE PASSAGE", "STONE BACK DOOR" 330 DATA "DUNGEON CELL", "GOBLIN ARMOURY", "DARK WINDING PASSAGE" 340 DATA "TWISTING PASSAGE", "LOW BENT PASSAGE", "ECHOING PASSAGE" 350 DATA "NARROW TURNING PASSAGE", "BROKEN PASSAGE", "TORCHLIT CORRIDOR" 360 DATA "ROUGH CAVE JUNCTION", "BROKEN STAIR", "BLACK ARCHWAY" 370 DATA "SPLIT PASSAGE", "LOW CRAWL", "HIGH CAVERN SHELF" 380 DATA "UNDERGROUND LAKE SHORE", "SMALL ISLAND", "GOLLUM'S POOL" 390 DATA "NARROW WET TUNNEL", "LOW BLACK FERRY POINT", "SLIPPERY ROCK SHELF" 400 DATA "BLACK WATER EDGE", "SUNKEN PASSAGE", "SILENT CAVERN" 410 DATA "BLIND TUNNEL", "COLD STONE SHELF", "DEEP HOLLOW" 420 DATA "FLOODED CREVICE", "MISTY HOLLOW", "ECHOING CHAMBER" 430 DATA "DARK DRIPPING CAVERN", "STAGNANT POOL" 440 FOR I%=1 TO 9:READ OB_N$(I%):NEXT I% 450 DATA "GOLDEN RING", "STING", "GLAMDRING", "ORCRIST" 460 DATA "GOLDEN KEY", "CURIOUS KEY", "IRON KEY", "RED KEY" 470 DATA "GOLLUM'S BOAT" 472 FOR I%=1 TO 9: READ NP_N$(I%), NP_H%(I%), NP_A%(I%): NEXT I% 474 DATA "GOLLUM",6,1, "NASTY GOBLIN",3,1, "HIDEOUS GOBLIN",3,1, "VICIOUS WARG",4,1, "GREAT GOBLIN",7,1 476 DATA "THORIN",5,0, "BOMBUR",2,0, "BALIN",4,0, "GANDALF",7,0 480 FOR I%=1 TO 4: READ DR_N$(I%), DR_K%(I%): NEXT I% 482 DATA "GOLDEN DOOR",5, "CURIOUS DOOR",6, "IRON DOOR",7, "RED DOOR",8 485 ENDPROC 490 : 1000 DEF PROC_generate_map 1010 PRINT "CARVING UPPER CAVE..." 1020 X1%=RND(8):Y1%=RND(8): X2%=RND(8):Y2%=RND(8) 1040 IF X1%=X2% AND Y1%=Y2% THEN 1030 1050 MAP%(0,X1%,Y1%)=14:MAP%(1,X1%,Y1%)=24: MAP%(0,X2%,Y2%)=15:MAP%(1,X2%,Y2%)=26 1070 I%=1 1080 REPEAT 1090 IF I%=14 OR I%=15 THEN I%=I%+1: GOTO 1080 1100 IF I%=1 THEN TX%=4:TY%=4: GOTO 1200 1110 IF I%>=7 AND I%<=11 THEN 1140 1120 REPEAT CX%=RND(10)-1:CY%=RND(10)-1:UNTIL MAP%(0,CX%,CY%)>0 1130 PX%=CX%:PY%=CY% 1140 FC%=0 1150 D%=RND(4): TX%=PX%:TY%=PY%: FC%=FC%+1 1160 IF FC%>20 THEN 1120 1170 IF D%=1 THEN TY%=TY%-1 ELSE IF D%=2 THEN TY%=TY%+1 ELSE IF D%=3 THEN TX%=TX%+1 ELSE TX%=TX%-1 1180 IF TX%<0 OR TX%>9 OR TY%<0 OR TY%>9 THEN 1150 1190 IF MAP%(0,TX%,TY%)>0 THEN 1150 1200 CX%=TX%:CY%=TY%: PX%=CX%: PY%=CY%: MAP%(0,CX%,CY%)=I%: I%=I%+1 1220 UNTIL I%>18 1230 PRINT "FLOODING LOWER CAVE..." 1240 I%=19 1250 REPEAT 1260 IF I%=24 OR I%=26 THEN I%=I%+1: GOTO 1250 1270 IF I%=19 THEN TX%=X1%: TY%=Y1%: GOTO 1370 1280 IF I%>=20 AND I%<=23 THEN 1310 1290 REPEAT CX%=RND(10)-1:CY%=RND(10)-1:UNTIL MAP%(1,CX%,CY%)>0 1300 PX%=CX%:PY%=CY% 1310 FC%=0 1320 D%=RND(4): TX%=PX%:TY%=PY%: FC%=FC%+1 1330 IF FC%>20 THEN 1290 1340 IF D%=1 THEN TY%=TY%-1 ELSE IF D%=2 THEN TY%=TY%+1 ELSE IF D%=3 THEN TX%=TX%+1 ELSE TX%=TX%-1 1350 IF TX%<0 OR TX%>9 OR TY%<0 OR TY%>9 THEN 1320 1360 IF MAP%(1,TX%,TY%)>0 THEN 1320 1370 CX%=TX%:CY%=TY%: PX%=CX%: PY%=CY%: MAP%(1,CX%,CY%)=I%: I%=I%+1 1390 UNTIL I%>35 1400 PRINT "PLACING ITEMS, NPCS & DOORS..." 1410 REPEAT X%=RND(10)-1:Y%=RND(10)-1:UNTIL MAP%(0,X%,Y%)>0: OB_Z%(2)=0:OB_X%(2)=X%:OB_Y%(2)=Y% 1420 REPEAT X%=RND(10)-1:Y%=RND(10)-1:UNTIL MAP%(1,X%,Y%)>0: OB_Z%(1)=1:OB_X%(1)=X%:OB_Y%(1)=Y% 1430 FOR K%=5 TO 6: REPEAT X%=RND(10)-1: Y%=RND(10)-1: UNTIL MAP%(0,X%,Y%)>0: OB_Z%(K%)=0: OB_X%(K%)=X%: OB_Y%(K%)=Y%: NEXT K% 1440 FOR K%=7 TO 8: REPEAT X%=RND(10)-1: Y%=RND(10)-1: UNTIL MAP%(1,X%,Y%)>0: OB_Z%(K%)=1: OB_X%(K%)=X%: OB_Y%(K%)=Y%: NEXT K% 1450 FOR K%=3 TO 4: REPEAT X%=RND(10)-1: Y%=RND(10)-1: UNTIL MAP%(0,X%,Y%)>0: OB_Z%(K%)=0: OB_X%(K%)=X%: OB_Y%(K%)=Y%: NEXT K% 1455 REPEAT X%=RND(10)-1: Y%=RND(10)-1: UNTIL MAP%(1,X%,Y%)>0: OB_Z%(9)=1: OB_X%(9)=X%: OB_Y%(9)=Y% 1460 FOR X%=0 TO 9:FOR Y%=0 TO 9: IF MAP%(1,X%,Y%)=21 THEN NP_Z%(1)=1:NP_X%(1)=X%:NP_Y%(1)=Y% 1470 NEXT Y%,X% 1472 FOR I%=2 TO 9 1474 REPEAT Z%=RND(2)-1: X%=RND(10)-1: Y%=RND(10)-1 1475 UNTIL MAP%(Z%,X%,Y%)>0 AND MAP%(Z%,X%,Y%)<>14 AND MAP%(Z%,X%,Y%)<>15 AND MAP%(Z%,X%,Y%)<>24 AND MAP%(Z%,X%,Y%)<>26 1476 NP_Z%(I%)=Z%: NP_X%(I%)=X%: NP_Y%(I%)=Y% 1478 NEXT I% 1480 FOR I%=1 TO 4 1481 Z%=0: IF I%>2 THEN Z%=1 1482 X%=RND(10)-1: Y%=RND(10)-1: D%=RND(4): TX%=X%: TY%=Y% 1483 IF D%=1 THEN TY%=TY%-1 ELSE IF D%=2 THEN TY%=TY%+1 ELSE IF D%=3 THEN TX%=TX%+1 ELSE TX%=TX%-1 1484 IF TX%<0 OR TX%>9 OR TY%<0 OR TY%>9 THEN 1482 1485 IF MAP%(Z%,X%,Y%)=0 OR MAP%(Z%,TX%,TY%)=0 THEN 1482 1486 IF Z%=0 THEN IF (X%=4 AND Y%=4) OR (TX%=4 AND TY%=4) THEN 1482 1488 DR_Z%(I%)=Z%: DR_X1%(I%)=X%: DR_Y1%(I%)=Y%: DR_X2%(I%)=TX%: DR_Y2%(I%)=TY%: DR_S%(I%)=2 1490 NEXT I% 1495 ENDPROC 1499 : 2000 DEF PROC_describe 2005 VST%(PZ%,PX%,PY%)=1 2006 IF MAP%(PZ%,PX%,PY%)=14 OR MAP%(PZ%,PX%,PY%)=15 THEN VST%(1,PX%,PY%)=1 2007 IF MAP%(PZ%,PX%,PY%)=24 OR MAP%(PZ%,PX%,PY%)=26 THEN VST%(0,PX%,PY%)=1 2020 PRINT CHR$(134);D$(MAP%(PZ%,PX%,PY%));CHR$(135) 2035 IF RNG%>0 THEN PRINT "YOU ARE INVISIBLE." 2040 E$="EXITS: " 2050 IF PY%>0 THEN IF MAP%(PZ%,PX%,PY%-1)>0 THEN E$=E$+"N " 2060 IF PY%<9 THEN IF MAP%(PZ%,PX%,PY%+1)>0 THEN E$=E$+"S " 2070 IF PX%<9 THEN IF MAP%(PZ%,PX%+1,PY%)>0 THEN E$=E$+"E " 2080 IF PX%>0 THEN IF MAP%(PZ%,PX%-1,PY%)>0 THEN E$=E$+"W " 2090 IF MAP%(PZ%,PX%,PY%)=14 OR MAP%(PZ%,PX%,PY%)=15 THEN E$=E$+"D " 2100 IF MAP%(PZ%,PX%,PY%)=24 OR MAP%(PZ%,PX%,PY%)=26 THEN E$=E$+"U " 2110 PRINT E$ 2120 FOR I%=1 TO 4: IF DR_Z%(I%)=PZ% THEN PROC_door_desc(I%) 2128 NEXT I% 2130 FOR I%=1 TO 9: IF OB_Z%(I%)=PZ% AND OB_X%(I%)=PX% AND OB_Y%(I%)=PY% THEN PRINT "YOU SEE: ";OB_N$(I%) 2140 NEXT I% 2150 FOR I%=1 TO 9 2152 IF NP_Z%(I%)=PZ% AND NP_X%(I%)=PX% AND NP_Y%(I%)=PY% AND NP_H%(I%)<=0 THEN PRINT "THE DEAD BODY OF ";NP_N$(I%);" LIES HERE." 2154 IF NP_Z%(I%)=PZ% AND NP_X%(I%)=PX% AND NP_Y%(I%)=PY% AND NP_H%(I%)>0 THEN PRINT NP_N$(I%);" IS HERE." 2156 NEXT I% 2160 ENDPROC 2170 : 2180 DEF PROC_door_desc(I%) 2182 IF DR_X1%(I%)=PX% AND DR_Y1%(I%)=PY% THEN DX%=DR_X2%(I%): DY%=DR_Y2%(I%) ELSE IF DR_X2%(I%)=PX% AND DR_Y2%(I%)=PY% THEN DX%=DR_X1%(I%): DY%=DR_Y1%(I%) ELSE ENDPROC 2184 DD$="": IF DY%PY% THEN DD$="SOUTH" ELSE IF DX%>PX% THEN DD$="EAST" ELSE DD$="WEST" 2186 PRINT "THE ";DR_N$(I%);" TO THE ";DD$;" IS "; 2188 IF DR_S%(I%)=0 THEN PRINT "OPEN." ELSE IF DR_S%(I%)=1 THEN PRINT "CLOSED." ELSE PRINT "LOCKED." 2190 ENDPROC 2195 : 2200 DEF PROC_input 2205 V$="": N$="": IN$="" 2210 PRINT ">";: T%=TIME 2212 REPEAT K%=INKEY(0) 2213 IF K%=-1 THEN IF TIME-T%>3000 THEN V$="WAIT": N$="": K%=13 2214 IF K%=127 AND LEN(IN$)>0 THEN PRINT CHR$(127);: IN$=LEFT$(IN$,LEN(IN$)-1) 2215 IF K%>=32 AND K%<127 THEN PRINT CHR$(K%);: IN$=IN$+CHR$(K%) 2216 UNTIL K%=13 2217 IF V$="WAIT" THEN PRINT " (AUTO-WAIT)": ENDPROC 2218 PRINT 2219 U$="": FOR J%=1 TO LEN(IN$) 2220 C%=ASC(MID$(IN$,J%,1)): IF C%>=97 AND C%<=122 THEN C%=C%-32 2221 U$=U$+CHR$(C%) 2222 NEXT J%: IN$=U$+" " 2224 SP%=INSTR(IN$," ") 2230 V$=LEFT$(IN$,SP%-1): N$=MID$(IN$,SP%+1) 2240 IF LEN(N$)>0 THEN IF RIGHT$(N$,1)=" " THEN N$=LEFT$(N$,LEN(N$)-1) 2250 ENDPROC 2260 : 2300 DEF PROC_action 2305 IF V$="" THEN ENDPROC 2308 MD%=0: TX%=PX%: TY%=PY% 2310 IF V$="N" OR V$="NORTH" THEN TY%=PY%-1: MD%=1 2312 IF V$="S" OR V$="SOUTH" THEN TY%=PY%+1: MD%=1 2314 IF V$="E" OR V$="EAST" THEN TX%=PX%+1: MD%=1 2316 IF V$="W" OR V$="WEST" THEN TX%=PX%-1: MD%=1 2318 IF MD%=1 THEN PROC_move(TX%,TY%): ENDPROC 2350 IF V$="D" OR V$="DOWN" THEN IF (MAP%(PZ%,PX%,PY%)=14 OR MAP%(PZ%,PX%,PY%)=15) THEN PZ%=1: ENDPROC 2360 IF V$="U" OR V$="UP" THEN IF (MAP%(PZ%,PX%,PY%)=24 OR MAP%(PZ%,PX%,PY%)=26) THEN PZ%=0: ENDPROC 2370 IF V$="LOOK" OR V$="L" THEN ENDPROC 2371 IF V$="WEAR" THEN PROC_wear: ENDPROC 2372 IF V$="REMOVE" THEN PROC_remove: ENDPROC 2373 IF V$="OPEN" OR V$="O" THEN PROC_door(0): ENDPROC 2374 IF V$="CLOSE" OR V$="C" THEN PROC_door(1): ENDPROC 2375 IF V$="LOCK" THEN PROC_door(2): ENDPROC 2376 IF V$="UNLOCK" THEN PROC_door(3): ENDPROC 2377 IF V$="MAP" OR V$="M" THEN PROC_map: ENDPROC 2378 IF V$="I" OR V$="INV" OR V$="INVENTORY" THEN PROC_inv: ENDPROC 2379 IF V$="TAKE" OR V$="T" THEN PROC_take: ENDPROC 2380 IF V$="DROP" OR V$="DR" THEN PROC_drop: ENDPROC 2381 IF V$="FIGHT" OR V$="ATTACK" OR V$="KILL" THEN PROC_fight: ENDPROC 2382 IF V$="WAIT" OR V$="Z" THEN PRINT "TIME PASSES...": ENDPROC 2383 IF V$="HELP" THEN PROC_help: ENDPROC 2384 IF V$="NPC" OR V$="NPCS" THEN PROC_npc_status: ENDPROC 2400 PRINT "I DON'T UNDERSTAND." 2410 ENDPROC 2420 : 2450 DEF PROC_move(X%,Y%) 2452 IF X%<0 OR X%>9 OR Y%<0 OR Y%>9 THEN PRINT "YOU CANNOT GO THAT WAY.": ENDPROC 2454 IF MAP%(PZ%,X%,Y%)=0 THEN PRINT "YOU CANNOT GO THAT WAY.": ENDPROC 2456 FOR I%=1 TO 4 2458 IF DR_Z%(I%)=PZ% AND DR_S%(I%)>0 THEN IF (DR_X1%(I%)=PX% AND DR_Y1%(I%)=PY% AND DR_X2%(I%)=X% AND DR_Y2%(I%)=Y%) OR (DR_X2%(I%)=PX% AND DR_Y2%(I%)=PY% AND DR_X1%(I%)=X% AND DR_Y1%(I%)=Y%) THEN PRINT "THE ";DR_N$(I%);" BLOCKS THE WAY.": ENDPROC 2460 NEXT I% 2462 PX%=X%: PY%=Y%: ENDPROC 2490 : 2500 DEF PROC_npc_turn 2505 FOR I%=1 TO 9 2510 IF NP_H%(I%)<=0 THEN GOTO 2560 2511 FOR K%=5 TO 8: IF OB_Z%(K%)=NP_Z%(I%) AND OB_X%(K%)=NP_X%(I%) AND OB_Y%(K%)=NP_Y%(I%) THEN IF RND(2)=1 THEN OB_Z%(K%)=-(I%+1) 2512 NEXT K% 2514 IF NP_Z%(I%)=PZ% AND NP_X%(I%)=PX% AND NP_Y%(I%)=PY% AND NP_A%(I%)=1 AND RNG%=0 THEN PROC_npc_attack_player(I%): GOTO 2560 2518 F%=0: FOR J%=1 TO 9 2520 IF I%<>J% AND NP_H%(J%)>0 AND NP_Z%(I%)=NP_Z%(J%) AND NP_X%(I%)=NP_X%(J%) AND NP_Y%(I%)=NP_Y%(J%) AND NP_A%(I%)<>NP_A%(J%) THEN F%=J%: J%=9 2522 NEXT J% 2524 IF F%>0 THEN PROC_npc_fight_npc(I%,F%): GOTO 2560 2526 D%=RND(4): TX%=NP_X%(I%): TY%=NP_Y%(I%) 2540 IF D%=1 THEN TY%=TY%-1 ELSE IF D%=2 THEN TY%=TY%+1 ELSE IF D%=3 THEN TX%=TX%+1 ELSE TX%=TX%-1 2545 IF TX%<0 OR TX%>9 OR TY%<0 OR TY%>9 THEN GOTO 2560 2546 IF MAP%(NP_Z%(I%),TX%,TY%)=0 THEN GOTO 2560 2547 B%=0: FOR J%=1 TO 4 2548 IF DR_Z%(J%)=NP_Z%(I%) AND DR_S%(J%)>0 THEN IF (DR_X1%(J%)=NP_X%(I%) AND DR_Y1%(J%)=NP_Y%(I%) AND DR_X2%(J%)=TX% AND DR_Y2%(J%)=TY%) OR (DR_X2%(J%)=NP_X%(I%) AND DR_Y2%(J%)=NP_Y%(I%) AND DR_X1%(J%)=TX% AND DR_Y1%(J%)=TY%) THEN B%=J% 2549 NEXT J% 2550 IF B%>0 THEN PROC_npc_door(I%, B%): GOTO 2560 2555 NP_X%(I%)=TX%: NP_Y%(I%)=TY% 2560 NEXT I% 2565 ENDPROC 2566 : 2567 DEF PROC_npc_door(N%, D%) 2568 IF DR_S%(D%)=1 THEN DR_S%(D%)=0: IF PZ%=DR_Z%(D%) AND ABS(PX%-DR_X1%(D%))<=1 AND ABS(PY%-DR_Y1%(D%))<=1 THEN PRINT "YOU HEAR A DOOR OPEN." 2569 IF DR_S%(D%)=2 THEN IF OB_Z%(DR_K%(D%))=-(N%+1) THEN DR_S%(D%)=1: IF PZ%=DR_Z%(D%) AND ABS(PX%-DR_X1%(D%))<=1 AND ABS(PY%-DR_Y1%(D%))<=1 THEN PRINT "YOU HEAR A LOCK CLICK." 2570 ENDPROC 2571 : 2572 DEF PROC_npc_attack_player(I%) 2573 PRINT NP_N$(I%);" ATTACKS YOU!" 2574 D%=RND(NP_H%(I%)): S%=4: IF OB_Z%(2)=-1 THEN S%=6 2575 P%=RND(S%): IF D%>P% THEN PRINT "YOU ARE HIT!": HP%=HP%-1: PROC_hud ELSE PRINT "YOU PARRY THE BLOW." 2576 ENDPROC 2580 : 2581 DEF PROC_npc_fight_npc(I%,J%) 2582 IF PZ%=NP_Z%(I%) AND PX%=NP_X%(I%) AND PY%=NP_Y%(I%) THEN PRINT NP_N$(I%);" AND ";NP_N$(J%);" CLASH IN COMBAT!" 2583 D1%=RND(NP_H%(I%)): D2%=RND(NP_H%(J%)) 2584 IF D1%>D2% THEN NP_H%(J%)=NP_H%(J%)-1: IF NP_H%(J%)<=0 THEN PROC_npc_die(J%): IF PZ%=NP_Z%(I%) AND PX%=NP_X%(I%) AND PY%=NP_Y%(I%) THEN PRINT NP_N$(I%);" KILLED ";NP_N$(J%);"!" 2585 IF D2%>D1% THEN NP_H%(I%)=NP_H%(I%)-1: IF NP_H%(I%)<=0 THEN PROC_npc_die(I%): IF PZ%=NP_Z%(I%) AND PX%=NP_X%(I%) AND PY%=NP_Y%(I%) THEN PRINT NP_N$(J%);" KILLED ";NP_N$(I%);"!" 2586 ENDPROC 2590 : 2591 DEF PROC_npc_die(N%) 2592 FOR K%=1 TO 9: IF OB_Z%(K%) = -(N%+1) THEN OB_Z%(K%)=NP_Z%(N%): OB_X%(K%)=NP_X%(N%): OB_Y%(K%)=NP_Y%(N%) 2593 NEXT K% 2594 ENDPROC 2595 : 2596 DEF PROC_time 2597 IF RNG%>0 THEN RNG%=RNG%-1: IF RNG%=0 THEN PRINT "YOU BECOME VISIBLE AGAIN!" 2598 ENDPROC 2600 : 2610 DEF PROC_map 2615 VDU 26 : REM RESET WINDOW TO DRAW MAP SAFELY 2620 CLS: PRINT CHR$(131);"UPPER CAVE";TAB(20);CHR$(131);"LOWER CAVE" 2630 PRINT CHR$(135) 2640 FOR Y%=0 TO 9 2650 FOR X%=0 TO 9: L%=0: PROC_mc: PRINT C$;" ";: NEXT X% 2660 FOR X%=0 TO 9: L%=1: PROC_mc: PRINT C$;: IF X%<9 THEN PRINT " "; 2666 NEXT X%: PRINT 2690 NEXT Y% 2700 PRINT : PRINT "KEY: * YOU O ROOM D DOWN U UP" 2710 PRINT : PRINT "PRESS ANY KEY TO RETURN...": K%=GET: VDU 26: CLS: VDU 28,0,24,39,1: ENDPROC 2800 : 2810 DEF PROC_mc 2820 C$=" ": IF VST%(L%,X%,Y%)>0 THEN C$="O" 2830 IF VST%(L%,X%,Y%)>0 THEN IF MAP%(L%,X%,Y%)=14 OR MAP%(L%,X%,Y%)=15 THEN C$="D" 2840 IF VST%(L%,X%,Y%)>0 THEN IF MAP%(L%,X%,Y%)=24 OR MAP%(L%,X%,Y%)=26 THEN C$="U" 2850 IF L%=PZ% AND X%=PX% AND Y%=PY% THEN C$="*" 2860 ENDPROC 3000 : 3010 DEF PROC_inv 3020 PRINT "YOU ARE CARRYING:": C%=0 3030 FOR I%=1 TO 9: IF OB_Z%(I%)=-1 THEN PRINT OB_N$(I%): C%=C%+1 3050 NEXT I%: IF C%=0 THEN PRINT "NOTHING." 3070 ENDPROC 3100 : 3110 DEF PROC_take 3120 F%=0: FOR I%=1 TO 9: IF OB_Z%(I%)=PZ% AND OB_X%(I%)=PX% AND OB_Y%(I%)=PY% THEN IF N$="" OR INSTR(OB_N$(I%),N$)>0 THEN F%=I%: I%=9 3130 NEXT I%: IF F%=0 THEN PRINT "NOTHING LIKE THAT HERE.": ENDPROC 3150 OB_Z%(F%)=-1: PRINT "TAKEN: ";OB_N$(F%): PROC_hud: ENDPROC 3200 : 3210 DEF PROC_drop 3220 F%=0: FOR I%=1 TO 9: IF OB_Z%(I%)=-1 THEN IF N$="" OR INSTR(OB_N$(I%),N$)>0 THEN F%=I%: I%=9 3230 NEXT I%: IF F%=0 THEN PRINT "YOU DON'T HAVE THAT.": ENDPROC 3250 OB_Z%(F%)=PZ%: OB_X%(F%)=PX%: OB_Y%(F%)=PY%: PRINT "DROPPED: ";OB_N$(F%): PROC_hud: ENDPROC 3300 : 3310 DEF PROC_wear 3320 IF N$<>"RING" AND N$<>"GOLDEN RING" AND N$<>"" THEN PRINT "YOU CAN'T WEAR THAT.": ENDPROC 3330 IF OB_Z%(1)<>-1 THEN PRINT "YOU DON'T HAVE THE RING.": ENDPROC 3340 IF RNG%>0 THEN PRINT "YOU ARE ALREADY INVISIBLE.": ENDPROC 3350 RNG%=10: PRINT "YOU SLIP THE RING ONTO YOUR FINGER.": PRINT "THE WORLD BECOMES WATERY AND GREY.": ENDPROC 3380 : 3390 DEF PROC_remove 3400 IF N$<>"RING" AND N$<>"GOLDEN RING" AND N$<>"" THEN PRINT "YOU CAN'T REMOVE THAT.": ENDPROC 3410 IF RNG%=0 THEN PRINT "YOU AREN'T WEARING IT.": ENDPROC 3420 RNG%=0: PRINT "YOU TAKE OFF THE RING AND BECOME VISIBLE.": ENDPROC 3500 : 3510 DEF PROC_fight 3520 F%=0: FOR I%=1 TO 9: IF NP_Z%(I%)=PZ% AND NP_X%(I%)=PX% AND NP_Y%(I%)=PY% AND NP_H%(I%)>0 THEN IF N$="" OR INSTR(NP_N$(I%),N$)>0 THEN F%=I%: I%=9 3530 NEXT I%: IF F%=0 THEN PRINT "YOU CAN'T FIGHT THAT HERE.": ENDPROC 3550 PRINT "YOU ATTACK ";NP_N$(F%);"!" 3560 S%=4: IF OB_Z%(2)=-1 THEN S%=6 3570 P%=RND(S%): D%=RND(NP_H%(F%)) 3580 IF P%>D% THEN PRINT "YOU WOUND IT!": NP_H%(F%)=NP_H%(F%)-1: IF NP_H%(F%)<=0 THEN PRINT "YOU KILLED IT!": PROC_npc_die(F%) 3585 IF D%>P% THEN IF RNG%>0 THEN PRINT "IT THRASHES BLINDLY AND MISSES!" 3590 IF D%>P% THEN IF RNG%=0 THEN PRINT "IT HITS YOU BACK!": HP%=HP%-1: PROC_hud 3600 IF P%=D% THEN PRINT "YOU CLASH WEAPONS!" 3610 ENDPROC 3700 : 3710 DEF PROC_door(A%) 3720 D%=0: FOR I%=1 TO 4: IF DR_Z%(I%)=PZ% THEN IF (DR_X1%(I%)=PX% AND DR_Y1%(I%)=PY%) OR (DR_X2%(I%)=PX% AND DR_Y2%(I%)=PY%) THEN IF N$="" OR INSTR(DR_N$(I%),N$)>0 OR N$="DOOR" THEN D%=I%: I%=4 3730 NEXT I%: IF D%=0 THEN PRINT "THERE IS NO DOOR HERE.": ENDPROC 3740 IF A%=0 THEN IF DR_S%(D%)=0 THEN PRINT "IT IS ALREADY OPEN.": ENDPROC 3742 IF A%=0 THEN IF DR_S%(D%)=2 THEN PRINT "IT IS LOCKED.": ENDPROC 3744 IF A%=0 THEN DR_S%(D%)=0: PRINT "OPENED.": ENDPROC 3750 IF A%=1 THEN IF DR_S%(D%)=0 THEN DR_S%(D%)=1: PRINT "CLOSED.": ENDPROC 3752 IF A%=1 THEN PRINT "IT IS ALREADY CLOSED OR LOCKED.": ENDPROC 3760 IF A%=2 THEN IF DR_S%(D%)=0 THEN PRINT "CLOSE IT FIRST.": ENDPROC 3762 IF A%=2 THEN IF DR_S%(D%)=2 THEN PRINT "IT IS ALREADY LOCKED.": ENDPROC 3764 IF A%=2 THEN IF OB_Z%(DR_K%(D%))<>-1 THEN PRINT "YOU DON'T HAVE THE KEY.": ENDPROC 3766 IF A%=2 THEN DR_S%(D%)=2: PRINT "LOCKED.": ENDPROC 3770 IF A%=3 THEN IF DR_S%(D%)<2 THEN PRINT "IT IS NOT LOCKED.": ENDPROC 3772 IF A%=3 THEN IF OB_Z%(DR_K%(D%))<>-1 THEN PRINT "YOU DON'T HAVE THE KEY.": ENDPROC 3774 IF A%=3 THEN DR_S%(D%)=1: PRINT "UNLOCKED.": ENDPROC 3780 ENDPROC 4000 : 4010 DEF PROC_atmosphere 4020 IF RND(10)>4 THEN ENDPROC 4030 IF MAP%(PZ%,PX%,PY%)>=19 AND MAP%(PZ%,PX%,PY%)<=25 THEN IF RND(3)=1 THEN PRINT "WATER DRIPS IN THE DARK." 4040 IF MAP%(PZ%,PX%,PY%)>=6 AND MAP%(PZ%,PX%,PY%)<=11 THEN IF RND(3)=1 THEN PRINT "YOU HEAR CLAWS ON STONE." 4050 FOR I%=1 TO 9: IF NP_Z%(I%)<>PZ% OR NP_H%(I%)<=0 THEN GOTO 4160 4060 IF ABS(NP_X%(I%)-PX%)>2 OR ABS(NP_Y%(I%)-PY%)>2 THEN GOTO 4160 4070 IF NP_X%(I%)=PX% AND NP_Y%(I%)=PY% THEN GOTO 4160 4080 IF I%=1 THEN IF RND(2)=1 THEN PRINT "A WET COUGH ECHOES OUT.": I%=9: GOTO 4160 4082 IF I%=1 THEN PRINT "YOU HEAR A GURGLING HISS.": I%=9: GOTO 4160 4090 R%=RND(5) 4100 IF R%=1 THEN PRINT "YOU HEAR A FAINT TAPPING SOUND." 4110 IF R%=2 THEN PRINT "SOMETHING MOVES IN THE SHADOWS." 4120 IF R%=3 THEN PRINT "A SCRAPING NOISE ECHOES DOWN THE PASSAGE." 4130 IF R%=4 THEN PRINT "YOU SENSE A PRESENCE NEARBY." 4140 IF R%=5 THEN PRINT "FOOTSTEPS SHUFFLE IN THE DARKNESS." 4150 I%=9 4160 NEXT I% 4170 ENDPROC 5000 : 5010 DEF PROC_hud 5020 S%=4: IF OB_Z%(2)=-1 THEN S%=6 5022 E%=0: FOR I%=1 TO 9: IF NP_A%(I%)=1 AND NP_H%(I%)>0 THEN E%=E%+1 5024 NEXT I%: IF E%=0 THEN WON%=1 5030 X%=POS: Y%=VPOS 5040 VDU 26 : REM TEMPORARILY RESET TO FULL SCREEN TO WRITE TO TOP ROW 5050 PRINT TAB(0,0);CHR$(131);"HP: ";HP%;" STR: ";S%;" ENEMIES: ";E%;" "; 5060 VDU 28,0,24,39,1 : REM RESTORE SCROLLING WINDOW 5070 VDU 31,X%,Y% : REM PUT CURSOR BACK EXACTLY WHERE IT WAS 5080 ENDPROC 5500 : 5510 DEF PROC_title 5520 CLS: PRINT CHR$(134);" *** GOBLIN CAVE ADVENTURE ***" 5530 PRINT CHR$(130);" INSPIRED BY 'THE HOBBIT' (1982)" 5540 PRINT 5550 PRINT CHR$(135);"YOU ARE LOST IN A DARK, DAMP CAVE" 5560 PRINT "SYSTEM BENEATH THE MOUNTAINS." 5570 PRINT 5580 PRINT CHR$(131);"OBJECTIVE:" 5590 PRINT CHR$(135);"SLAY ALL 5 HOSTILE ENEMIES (GOLLUM, " 5600 PRINT "THE WARG, AND THE 3 GOBLINS) TO WIN." 5610 PRINT "FRIENDLY DWARVES AND GANDALF WANDER" 5620 PRINT "THE CAVES AND MAY HELP OR HINDER YOU." 5630 PRINT 5640 PRINT CHR$(131);"COMMANDS:" 5650 PRINT CHR$(135);"N,S,E,W,U,D TO MOVE." 5660 PRINT "LOOK (L), MAP (M), INV (I)." 5670 PRINT "TAKE [ITEM], DROP [ITEM]." 5680 PRINT "WEAR [ITEM], REMOVE [ITEM]." 5690 PRINT "OPEN, CLOSE, LOCK, UNLOCK DOORS." 5700 PRINT "FIGHT [NPC], WAIT (Z)." 5710 PRINT "TYPE 'HELP' OR 'NPC' IN GAME." 5720 PRINT 5730 PRINT CHR$(129);"PRESS ANY KEY TO DESCEND..." 5740 A%=GET: CLS 5750 ENDPROC 6000 : 6010 DEF PROC_help 6020 PRINT CHR$(131);"COMMANDS:" 6030 PRINT CHR$(135);"N,S,E,W,U,D - MOVE" 6040 PRINT "LOOK (L), MAP (M), INV (I)" 6050 PRINT "TAKE [ITEM], DROP [ITEM]" 6060 PRINT "WEAR [ITEM], REMOVE [ITEM]" 6070 PRINT "OPEN, CLOSE, LOCK, UNLOCK" 6080 PRINT "FIGHT [NPC], WAIT (Z), HELP, NPC" 6090 ENDPROC 6100 : 6110 DEF PROC_npc_status 6120 PRINT CHR$(131);"NPC STATUS:" 6130 FOR I%=1 TO 9 6140 IF NP_H%(I%)<=0 THEN PRINT CHR$(129);NP_N$(I%);" (DEAD)": GOTO 6190 6150 PRINT CHR$(130);NP_N$(I%);" (ALIVE)";CHR$(135); 6160 C%=0: FOR K%=1 TO 9 6162 IF OB_Z%(K%)<>-(I%+1) THEN GOTO 6170 6164 IF C%=0 THEN PRINT " CARRYING: "; ELSE PRINT ", "; 6166 PRINT OB_N$(K%);: C%=1 6170 NEXT K% 6180 PRINT 6190 NEXT I% 6200 ENDPROC