10 MODE 7 20 VDU 23,1,0;0;0;0; :REM Disable cursor 30 DIM M%(19,19), MAP_ROW$(19) 40 DIM N$(6,6), VOC$(9), VAGUE$(6), PHR$(3) 50 PX%=10:PY%=10:FACING%=0 60 RIV$="" : RD$="" 70 QX%=0:QY%=0:SUP%=50 :REM Quest Coords & Supplies 80 PROCInitData 85 PROCStartScreen 90 PROCGenWorld 95 PROCSetupScreen : PROCLook 100 : 110 REM --- MAIN LOOP --- 120 REPEAT 160 REM --- INSTANT KEYPRESS --- 162 REPEAT 164 I$ = GET$ 170 IF I$>="a" AND I$<="z" THEN I$=CHR$(ASC(I$)-32) 172 UNTIL I$<>"" 174 REM PRINT I$ 180 : 190 IF I$="N" THEN FACING%=0 : PRINT "You look North" : PROCHeader : PROCLook 200 IF I$="E" THEN FACING%=1 : PRINT "You look East" : PROCHeader : PROCLook 210 IF I$="S" THEN FACING%=2 : PRINT "You look South" : PROCHeader : PROCLook 220 IF I$="W" THEN FACING%=3 : PRINT "You look West" : PROCHeader : PROCLook 230 IF I$="T" THEN PROCTravel 240 IF I$="M" THEN PROCShowMap 250 IF I$="G" THEN PX%=10:PY%=10:FACING%=0:PROCGenWorld:PROCSetupScreen:PROCLook 260 UNTIL I$="Q" 270 END 280 : 290 DEF PROCTravel 300 LOCAL DX%,DY%,NX%,NY%,T%,ST%,BLK%,CST%,DIST% 302 IF FACING%=0 PRINT "You travel North" 304 IF FACING%=1 PRINT "You travel East" 306 IF FACING%=2 PRINT "You travel South" 308 IF FACING%=3 PRINT "You travel West" 310 DX%=0:DY%=0 320 IF FACING%=0 DY%=1 330 IF FACING%=1 DX%=1 340 IF FACING%=2 DY%=-1 350 IF FACING%=3 DX%=-1 360 NX%=PX%+DX% : NY%=PY%+DY% 370 IF NX%<0 OR NX%>19 OR NY%<0 OR NY%>19 THEN PROCMsg("The edge of the world blocks you.") : ENDPROC 380 T% = M%(NX%,NY%) DIV 10 : ST% = M%(NX%,NY%) MOD 10 : BLK% = 0 390 IF T%=1 AND ST%=5 BLK%=1 400 IF T%=3 AND (ST%=4 OR ST%=5) BLK%=1 410 IF T%=5 AND ST%=5 BLK%=1 420 IF T%=6 AND ST%=5 BLK%=1 430 IF BLK%=1 THEN PROCMsg("Blocked by " + N$(T%,ST%) + "!") : ENDPROC 440 CST%=1 450 IF T%=1 OR T%=5 THEN CST%=2 460 IF T%=3 AND ST%<4 THEN CST%=0 470 SUP% = SUP% - CST% 480 IF SUP% <= 0 THEN PROCEndGame(0) 490 IF T%=6 AND ST%=3 THEN SUP%=SUP%+10 : PROCMsg("You rest. Inn closes.") : M%(NX%,NY%)=66 500 PX%=NX% : PY%=NY% 510 IF PX%=QX% AND PY%=QY% THEN PROCEndGame(1) 520 DIST% = ABS(PX%-QX%) + ABS(PY%-QY%) 530 IF DIST% <= 3 PROCMsg("You feel a cold presence nearby...") 540 PROCHeader : PROCLook 550 ENDPROC 555 : 560 DEF PROCLook 570 LOCAL T%,ST%,I%,DX%,DY%,RX%,RY%,DIST%,S$,SD$,TX%,TY%,SIDE%,IMP%,OX%,OY% 575 LOCAL OK%, SOK%, MSG$ 590 REM CLS Removed to allow scrolling history 670 T% = M%(PX%,PY%) DIV 10 : ST% = M%(PX%,PY%) MOD 10 680 PROCWrap("You stand at " + N$(T%,ST%) + ".") 690 IF T%=3 PROCWrap("The waters of the " + RIV$ + " flow here.") 700 IF T%=4 PROCWrap("You stand upon the " + RD$ + ".") 710 PRINT : DX%=0:DY%=0:RX%=0:RY%=0 720 IF FACING%=0 THEN DY%=1 : RX%=1 730 IF FACING%=1 THEN DX%=1 : RY%=-1 740 IF FACING%=2 THEN DY%=-1 : RX%=-1 750 IF FACING%=3 THEN DX%=-1 : RY%=1 760 : 770 FOR DIST%=1 TO 3 780 OK% = 1 790 TX% = PX% + (DX%*DIST%) : TY% = PY% + (DY%*DIST%) 800 REM Check Main Bounds 810 IF TX%<0 OR TX%>19 OR TY%<0 OR TY%>19 THEN PRINT "The world ends in mist." : OK%=0 : DIST%=3 820 REM If NOT OK, Jump to NEXT DIST% 830 IF OK%=0 GOTO 928 840 REM Describe Center 850 T% = M%(TX%,TY%) DIV 10 : ST% = M%(TX%,TY%) MOD 10 : IMP% = FNrank(T%,ST%) 860 IF DIST%=1 MSG$=PHR$(1)+", "+VOC$(RND(10)-1)+" "+N$(T%,ST%)+" awaits." : PROCWrap(MSG$) 870 IF DIST%=2 AND IMP%>=1 MSG$=PHR$(2)+", "+N$(T%,ST%)+" lies ahead." : PROCWrap(MSG$) 880 IF DIST%=3 AND IMP%>=2 MSG$=PHR$(3)+", "+VAGUE$(T%)+" can be seen." : PROCWrap(MSG$) 890 REM Side Scanning Loop 900 FOR SIDE%=-1 TO 1 STEP 2 902 SOK% = 1 904 OX% = TX% + (RX%*SIDE%) : OY% = TY% + (RY%*SIDE%) 906 REM Check Side Bounds - If Out, Jump to NEXT SIDE 908 IF OX%<0 OR OX%>19 OR OY%<0 OR OY%>19 THEN SOK%=0 910 REM GOTO NEXT SIDE% if invalid 912 IF SOK%=0 GOTO 924 914 T% = M%(OX%,OY%) DIV 10 : ST% = M%(OX%,OY%) MOD 10 916 IF FNrank(T%,ST%)<>3 THEN SOK%=0 918 REM GOTO NEXT SIDE if not important 920 IF SOK%=1 THEN SD$="right" : IF SIDE%=-1 THEN SD$="left" 922 IF SOK%=1 MSG$=" To the "+SD$+" looms "+N$(T%,ST%)+"." : PROCWrap(MSG$) 924 NEXT SIDE% 926 PRINT 927 REM Jump Target for Main Loop NEXT 928 NEXT DIST% 929 ENDPROC 930 : 940 DEF FNrank(T%,S%) 950 LOCAL V% : V%=1 960 IF T%=2 OR T%=3 OR T%=4 THEN V%=2 970 IF T%=5 OR T%=6 THEN V%=3 980 IF T%=1 AND S%=5 THEN V%=3 990 IF T%=3 AND S%=5 THEN V%=3 1000 =V% 1010 : 1020 DEF PROCShowMap 1030 VDU 26 : CLS : REM Reset Windows for Map 1040 PRINT CHR$(135);"MAP:";CHR$(130);"Tree ";CHR$(134);"H20 ";CHR$(129);"Hill ";CHR$(131);"Ruin ";CHR$(135);"Road ";CHR$(133);"Bldg" 1050 FOR Y%=19 TO 0 STEP -1 : PRINT TAB(0, 21-Y%) MAP_ROW$(Y%); : NEXT 1060 PRINT TAB(PX%*2, 21-PY%) CHR$(131) "@"; 1070 PRINT TAB(0,22);CHR$(136);CHR$(135);"Press Key..." 1075 REPEAT UNTIL GET$<>"" 1078 PROCSetupScreen : REM Restore Game UI 1079 PROCLook 1080 ENDPROC 1090 : 1100 DEF PROCGenWorld 1110 LOCAL X%,Y%,I%,R%,T%,S% 1120 VDU 26 : REM Allow printing over whole screen 1122 PRINT "Forging World..." : SUP% = 50 1130 FOR X%=0 TO 19 : FOR Y%=0 TO 19 1140 R%=RND(10) : IF R%<6 THEN M%(X%,Y%)=10+RND(4) ELSE M%(X%,Y%)=50+RND(4) 1150 NEXT : NEXT 1160 PRINT "Flowing Rivers..." : PROCMakePath(3, RND(19), 19, RND(19), 0) 1170 PRINT "Laying Roads..." : PROCMakePath(4, 0, RND(19), 19, RND(19)) 1180 FOR I%=1 TO 12 : X%=RND(19):Y%=RND(19) : IF M%(X%,Y%) DIV 10 <> 3 THEN M%(X%,Y%) = 20 + RND(5) 1190 NEXT 1200 FOR I%=1 TO 6 : X%=RND(19):Y%=RND(19) : S%=RND(5) : IF S%=3 THEN S%=1 1210 IF M%(X%,Y%) DIV 10 <> 3 THEN M%(X%,Y%) = 60 + S% 1215 NEXT 1216 PRINT "Building Inns..." 1217 FOR I%=1 TO 2 : REPEAT X%=RND(19):Y%=RND(19) : T%=M%(X%,Y%) DIV 10 : UNTIL T%<>3 AND T%<>6 1218 M%(X%,Y%) = 63 : NEXT 1220 PROCNames : M%(PX%,PY%) = 11 1230 REPEAT : QX%=RND(19):QY%=RND(19) : T%=M%(QX%,QY%) DIV 10 : UNTIL (T%=2 OR T%=6) AND (QX%<>PX% OR QY%<>PY%) 1240 PRINT "Drawing Maps..." : PROCPreRender 1250 ENDPROC 1260 : 1270 DEF PROCPreRender 1280 LOCAL X%,Y%,T%,ST%,V%,S$,C$,L$ 1290 FOR Y%=0 TO 19 : L$="" : FOR X%=0 TO 19 1300 V%=M%(X%,Y%) : T%=V% DIV 10 : ST%=V% MOD 10 1310 S$=MID$(MP_CH$,T%,1) : C$=MID$(MP_CO$,T%,1) 1320 IF T%=6 AND (ST%=3 OR ST%=6) THEN S$="C":C$=CHR$(133) 1330 IF ST%=5 AND (T%=1 OR T%=3 OR T%=5 OR T%=6) THEN C$=CHR$(129):S$=CHR$(255) 1340 L$=L$+C$+S$ : NEXT : MAP_ROW$(Y%)=L$ : NEXT 1350 ENDPROC 1360 : 1370 DEF PROCMakePath(TYPE%, X%, Y%, TX%, TY%) 1380 LOCAL DX%,DY%,PROG%,STP% : STP% = 0 1390 REPEAT 1400 STP% = STP% + 1 : PROG% = (STP% DIV 6) + 1 : IF PROG% > 5 PROG% = 5 1410 M%(X%,Y%) = (TYPE% * 10) + PROG% 1420 DX% = SGN(TX% - X%) : DY% = SGN(TY% - Y%) 1430 IF RND(3)=1 THEN DX% = 0 1440 IF RND(3)=1 THEN DY% = 0 1450 X% = X% + DX% : Y% = Y% + DY% 1460 IF X%<0 X%=0 ELSE IF X%>19 X%=19 1470 IF Y%<0 Y%=0 ELSE IF Y%>19 Y%=19 1480 UNTIL X%=TX% AND Y%=TY% 1490 ENDPROC 1500 : 1510 DEF PROCInitData 1520 RESTORE 1600 1530 FOR T%=1 TO 6 : FOR S%=1 TO 5 : READ N$(T%,S%) : NEXT : NEXT 1535 N$(6,6) = "a Closed Inn" 1540 FOR I%=0 TO 9:READ VOC$(I%):NEXT 1550 FOR I%=1 TO 3:READ PHR$(I%):NEXT 1560 FOR I%=1 TO 6:READ VAGUE$(I%):NEXT 1570 MP_CH$ = "Tn~#^B" : MP_CO$ = CHR$(130)+CHR$(131)+CHR$(134)+CHR$(135)+CHR$(129)+CHR$(133) 1580 ENDPROC 1590 : 1600 DATA "a Single Tree","a Grove","a Wild Wood","a Forest","Thick Forest (Impassable)" 1610 DATA "an Ancient Henge","a Burial Barrow","a Ruined Tower","a Ruined Keep","a Crumbling Wall" 1620 DATA "a Babbling Brook","a Clear Stream","a Flowing River","a Marsh (Impassable)","a Wide River (Impassable)" 1630 DATA "a Broken Path","a Dirt Road","the Via Glareae","the Via Militaris","the Via Publica" 1640 DATA "a Low Hill","a Tor","a High Ridge","the Downs","a Mountain (Impassable)" 1650 DATA "a Hovel","a Roadside Shrine","a Coaching Inn","a Stone Keep","the Dark Tower (Impassable)" 1660 DATA "ancient","misty","silent","foreboding","sunlit","shadowed","rugged","overgrown","majestic","dark" 1670 DATA "Directly ahead","Further on","On the horizon" 1680 DATA "dark shapes","grey stones","a glimmer of water","a line of dust","rising ground","a structure" 1690 : 1700 DEF PROCNames 1710 LOCAL A$,B$,I% : RESTORE 1800 1720 FOR I%=1 TO RND(5):READ A$:NEXT : RESTORE 1810 1730 FOR I%=1 TO RND(5):READ B$:NEXT 1740 RIV$ = "River " + A$ + B$ : RD$ = "Road of " + A$ 1750 ENDPROC 1760 : 1800 DATA "Ash","Oak","Eld","Grim","Whit" 1810 DATA "water","burn","flow","wash","mere" 1820 : 1830 DEF PROCMsg(M$) 1872 PRINT : PRINT CHR$(136) M$ CHR$(135); : PRINT 1854 TIME=0:REPEAT UNTIL TIME>300 1875 ENDPROC 1880 : 1890 DEF PROCEndGame(WIN%) 1900 VDU 26 : CLS : IF WIN%=1 GOTO 1930 1910 PRINT CHR$(129) "GAME OVER" : PRINT "You collapsed from exhaustion." : GOTO 1950 1930 PRINT CHR$(130) "VICTORY!" : PRINT "You have recovered the Iron Crown!" 1950 PRINT "Press SPACE to restart." : REPEAT UNTIL GET=32 : RUN 1960 ENDPROC 1970 : 1980 DEF PROCStartScreen 1990 CLS : PRINT TAB(10,1) CHR$(131);CHR$(141);"MYTHIC MAP" 2000 PRINT TAB(10,2) CHR$(131);CHR$(141);"MYTHIC MAP" 2010 PRINT TAB(0,4) CHR$(134)"QUEST:" : PRINT : PRINT "Find the "CHR$(131)"IRON CROWN"CHR$(135)" hidden in the" : PRINT "Ruins or Buildings of this land." 2015 PRINT "You will get a proximity message" : PRINT "when close!" 2020 PRINT : PRINT CHR$(134)"CONTROLS:" : PRINT : PRINT " "CHR$(131)"N, E, S, W"CHR$(135)" .. Turn" : PRINT " "CHR$(131)"T"CHR$(135)" ........... Travel" : PRINT " "CHR$(131)"M"CHR$(135)" ........... View Map" 2030 PRINT : PRINT CHR$(134)"SURVIVAL:" : PRINT : PRINT "Limited "CHR$(131)"Supplies"CHR$(135)"." : PRINT "Find "CHR$(133)"Inns (C)"CHR$(135)" to restock." 2040 PRINT TAB(5,22) CHR$(136) "Press SPACE to Begin..." : REPEAT UNTIL GET=32 2050 DUMMY% = RND(-TIME) : CLS 2060 ENDPROC 2070 : 2080 DEF PROCSetupScreen 2090 LOCAL X%,Y% 2100 VDU 26 : CLS : REM Reset to full screen 2110 PRINT CHR$(131);"MYTHIC MAP" 2120 PRINT TAB(0,2) STRING$(40,"-") 2130 PRINT TAB(0,23)"Cmd: N/E/S/W (Turn) T (Travel)" 2140 PRINT TAB(0,24)" M (Map) G (Gen) Q (Quit) > "; 2150 PROCHeader 2160 VDU 28,0,21,39,3 : REM Set Scrolling Window (Top 3, Bottom 21) 2170 ENDPROC 2180 : 2190 DEF PROCHeader 2200 LOCAL X%,Y% : X%=POS : Y%=VPOS 2210 VDU 26 : REM Disable window to update top 2220 PRINT TAB(0,1) CHR$(135)"Loc: ";PX%;",";PY%;" Facing: "; 2230 IF FACING%=0 PRINT "North" 2240 IF FACING%=1 PRINT "East " 2250 IF FACING%=2 PRINT "South" 2260 IF FACING%=3 PRINT "West " 2270 PRINT TAB(26,1) CHR$(134) "Supplies: ";SUP% 2280 VDU 28,0,21,39,3 : REM Restore window 2290 PRINT TAB(X%,Y%); : REM Restore cursor pos 2300 ENDPROC 2310 : 2320 DEF PROCWrap(TX$) 2330 LOCAL SP%, WD$ 2340 REPEAT 2350 SP% = INSTR(TX$, " ") 2360 IF SP%=0 THEN WD$=TX$ : TX$="" ELSE WD$=LEFT$(TX$, SP%-1) : TX$=MID$(TX$, SP%+1) 2370 IF (POS + LEN(WD$)) > 39 THEN PRINT : PRINT WD$; ELSE PRINT WD$; 2380 IF TX$<>"" THEN PRINT " "; 2390 UNTIL TX$="" 2400 PRINT 2410 ENDPROC