10 NP%=20:MODE 4:DIM PL$(NP%-1),PS$(NP%-1),PX%(NP%-1),PY%(NP%-1),PO%(NP%-1),SC%(NP%-1),RC%(NP%-1),FL%(NP%-1),PD$(NP%-1) 12 TIME=0 15 PROCinstructions 16 CLS: PRINT "Constructing Harry Harrison's Galaxy..." 17 Z%=RND(-TIME-1) 20 PROCinit_planets 25 PROCgalaxy:PROCstart_positions 30 C%=5000:F%=70:MF%=100:S%=P%:H%=0:W%=100000:ID%=0:HD%=1 35 *FX 15,1 36 CX%=PX%(S%):CY%=PY%(S%) 40 REPEAT 50 TURN%=0:PROCdraw_map:PROCtarget_input 80 IF K$="J" OR K$="j" THEN PROCjump 90 IF K$="H" OR K$="h" THEN PROCheist 100 IF K$="I" OR K$="i" THEN PROCinfo 110 IF K$="M" OR K$="m" THEN PROCmarket 120 IF K$="X" OR K$="x" THEN END 130 IF TURN%=1 THEN PROCenemy_move:IF RND(5)=1 THEN PROCrandom_event 140 UNTIL C%>=W% OR H%>=100 OR P%=E% OR FNstranded=1 150 CLS 160 IF C%>=W% THEN PRINT "YOU WIN!":PRINT "You retired to a luxury planet with ";C%;" credits!":END 170 IF H%>=100 THEN PRINT "CAPTURED!":PRINT "Your Heat reached 100%. The Special Corps locked you up.":END 180 IF P%=E% THEN PRINT "CAUGHT!":PRINT "Inskipp cornered you on ";PL$(P%);".":END 190 IF FNstranded=1 THEN PRINT "STRANDED!":PRINT "You have 0 fuel and cannot afford to buy more.":END 200 END 220 DEF PROCinit_planets 230 FOR I%=0 TO NP%-1:READ PL$(I%),PS$(I%),PX%(I%),PY%(I%),PO%(I%),SC%(I%),RC%(I%),PD$(I%):FL%(I%)=RND(20)+10:NEXT I% 240 ENDPROC 250 DATA "ANVHAR","ANV",29,1,15,2,5,"Brion homeworld of extreme seasons" 260 DATA "CLIAAND","CLIA",13,3,300,10,4,"Aggressive world of military conflict" 270 DATA "MOOLAPLENTY","MOOL",22,4,15,3,5,"Pleasure world; ideal for luxury heists" 280 DATA "BIT O' HEAVEN","BIT",3,5,5,2,3,"Jim's dull agricultural homeworld" 290 DATA "PARAISO-AQUI","PARA",18,7,80,7,8,"Corrupt political world" 300 DATA "CHOJECKI","CHOJ",29,7,150,6,7,"Rat colony; useful as an urban target" 310 DATA "BLODGETT","BLOD",6,10,12,5,4,"Quiet backwater; low risk, low reward" 320 DATA "SPIOVENTE","SPIO",32,12,45,8,8,"World of Jim's earlier adventures" 330 DATA "DIRT/EARTH","DIRT",18,14,2,3,2,"Legendary lost original human homeworld" 340 DATA "FLORADORA","FLOR",10,18,12,3,4,"Civilised colony world, moderate wealth" 341 DATA "KEKKONSHIKI","KEKK",24,17,35,6,5,"Harsh icy world of high security" 342 DATA "SKRALDESPAND","SKRA",3,21,9,5,4,"Scientific gamebook adventure target" 343 DATA "NYJORD","NYJ",22,19,22,5,5,"Peaceful, wealthy, prosperous neighbour" 344 DATA "DIS","DIS",14,20,4,9,7,"Harsh desert crisis world; very dangerous" 345 DATA "SELM-II","SELM",30,15,50,5,6,"Robot-haunted world of No Return" 346 DATA "PORGORSTORSAAND","PORG",34,8,25,4,6,"Jason dinAlt's stagnant farm homeworld" 347 DATA "CASSYLIA","CASS",26,20,85,5,9,"Casino world; premium heist target" 348 DATA "PYRRUS","PYRR",11,21,12,9,8,"Deadly deathworld; lethal environment" 349 DATA "FELICITY","FEL",34,21,2,3,2,"Mineral-rich colony world" 350 DATA "DARKHAN","DARK",11,8,10,4,3,"Deathworld frontier sector planet" 360 : 370 DEF FNdist(A%, B%) 380 LOCAL DX%, DY%, D% 390 DX% = PX%(A%) - PX%(B%):DY% = PY%(A%) - PY%(B%) 400 D% = INT(SQR(DX%*DX% + DY%*DY%) * 3.0) 410 =D% 430 DEF FNstranded 440 IF F%>0 THEN =0 450 IF FL%(P%)>0 AND C%>=50 THEN =0 460 =1 480 DEF PROCdelay(D%):LOCAL T%:T%=TIME:REPEAT UNTIL TIME-T%>D%:ENDPROC 500 DEF PROCdraw_map 510 LOCAL I%,X%,Y%,MX%,MY%,R%,EX%,EY%,ER% 520 CLS:VDU 24,0;256;1279;1023;:FOR I%=0 TO NP%-1 530 X% = PX%(I%):Y% = PY%(I%):PRINT TAB(X%, Y%);".";PS$(I%); 540 IF I%=S% THEN PRINT "+"; 555 IF I%=E% THEN PRINT "!"; 560 NEXT I% 570 MX% = PX%(P%) * 32 + 16:MY% = 1023 - (PY%(P%) * 32) - 16 580 IF HD%=2 THEN R% = INT(F% * 15.24) ELSE R% = INT(F% * 10.67) 585 GCOL 0, 1:MOVE MX%, MY%:PLOT 145, R%, 0 590 EX% = PX%(E%) * 32 + 16:EY% = 1023 - (PY%(E%) * 32) - 16 592 ER% = INT(35 * 10.67) 593 GCOL 0, 1:MOVE EX%, EY%:PLOT 145, ER%, 0 599 VDU 24,0;0;1279;1023; 600 REM --- BLACK STATUS PANEL --- 601 GCOL 0,0:MOVE 0,0:PLOT 101,1279,255 604 GCOL 0,1 610 PRINT TAB(0,24);STRING$(39,"-"); 620 PRINT TAB(0,25);"SELECTED: ";PL$(S%); 630 PRINT TAB(0,26);"JIM AT: ";PL$(P%); 635 PRINT TAB(0,27);"INSKIPP: ";FNdist(P%,E%);" LIGHT YEARS AWAY"; 640 PRINT TAB(0,28);"FUEL:";F%;" CR:";C%;" HEAT:";H%;"%"; 645 PRINT TAB(0,29);STRING$(39,"-"); 650 PRINT TAB(0,30);"I=INFO J=JUMP H=HEIST M=MARKET"; 660 PRINT TAB(0,31);"QA<> MOVE RETURN SELECT X=QUIT"; 670 ENDPROC 680 DEF PROCjump:LOCAL D% 690 IF P%=S% THEN PRINT TAB(2,30);"ALREADY HERE!";:PROCdelay(100):ENDPROC 700 D% = FNdist(P%,S%):IF HD%=2 THEN D% = INT(D%*0.7) 710 IF D%>F% THEN PRINT TAB(2,30);"NOT ENOUGH FUEL!";:PROCdelay(100):ENDPROC 720 F% = F% - D%:P% = S%:PROCwarp_anim:FL%(P%) = RND(15)+5:TURN% = 1:ENDPROC 740 DEF PROCinfo:CLS 750 PRINT "--- SYSTEM DATA: ";PL$(S%);" ---" 760 PRINT "Population : ";PO%(S%);",000,000" 770 PRINT "Security : ";SC%(S%);"/10" 780 PRINT "Richness : ";RC%(S%);"/10" 790 PRINT "Fuel Stock : ";FL%(S%);" units available" 800 PRINT "----------------------------------------" 805 PRINT "Description:" 810 PRINT PD$(S%) 815 PRINT "----------------------------------------" 820 PRINT "Distance : ";FNdist(P%,S%);" Light Years" 825 PRINT "----------------------------------------" 830 PRINT "Press any key to return...":K$=GET$:ENDPROC 850 DEF PROCmarket:LOCAL K$ 860 CLS:PRINT "--- SPACEPORT & BLACK MARKET ---" 870 PRINT "Credits: ";C%;" Fuel: ";F%;"/";MF% 880 PRINT "Local Fuel Stock: ";FL%(P%);" units" 890 PRINT "Fuel Price: 50 credits per unit" 900 PRINT "----------------------------------------" 910 PRINT "1. Buy Fuel" 920 PRINT "2. Buy Fake ID (10k cr) Lvl: ";ID% 930 PRINT "3. Advanced Drive (15k cr) Lvl: ";HD% 940 PRINT "4. Bribe Police (5k cr) Heat: ";H%;"%" 950 PRINT "5. Return to main menu" 960 PRINT "Choose (1-5):";:K$=GET$:PRINT K$ 970 IF K$="1" THEN PROCbuy_fuel 980 IF K$="2" THEN PROCbuy_id 990 IF K$="3" THEN PROCbuy_drive 1000 IF K$="4" THEN PROCbribe 1010 ENDPROC 1030 DEF PROCbuy_fuel:LOCAL Q%, Price% 1040 IF FL%(P%)<=0 THEN PRINT "No fuel available here!":PROCdelay(100):ENDPROC 1050 PRINT "How many units? (Max ";FL%(P%);"):";:INPUT Q% 1060 IF Q%<0 OR Q%>FL%(P%) THEN PRINT "Invalid quantity!":PROCdelay(100):ENDPROC 1070 IF F%+Q% > MF% THEN Q% = MF% - F% 1080 Price% = Q% * 50:IF Price% > C% THEN PRINT "Not enough credits!":PROCdelay(100):ENDPROC 1090 C% = C% - Price%:F% = F% + Q%:FL%(P%) = FL%(P%) - Q%:PRINT "Fuel tank replenished.":PROCdelay(100):ENDPROC 1110 DEF PROCbuy_id 1120 IF C%<10000 THEN PRINT "Not enough credits!":PROCdelay(100):ENDPROC 1130 IF ID%>=3 THEN PRINT "Already at maximum Fake ID level!":PROCdelay(100):ENDPROC 1140 C% = C% - 10000:ID% = ID% + 1:PRINT "Fake ID upgraded to level ";ID%;"!":PROCdelay(100):ENDPROC 1160 DEF PROCbuy_drive 1170 IF C%<15000 THEN PRINT "Not enough credits!":PROCdelay(100):ENDPROC 1180 IF HD%=2 THEN PRINT "Already have Advanced Hyperdrive!":PROCdelay(100):ENDPROC 1190 C% = C% - 15000:HD% = 2:PRINT "Advanced Hyperdrive installed!":PROCdelay(100):ENDPROC 1210 DEF PROCbribe 1220 IF C%<5000 THEN PRINT "Not enough credits!":PROCdelay(100):ENDPROC 1230 IF H%<=10 THEN PRINT "Heat is already low!":PROCdelay(100):ENDPROC 1240 C% = C% - 5000:H% = H% - 30:IF H%<0 THEN H% = 0 1250 PRINT "Bribes paid. Heat reduced to ";H%;"%":PROCdelay(100):ENDPROC 1270 DEF PROCheist:LOCAL T%,V%,S%,L%,RND_VAL% 1280 CLS:PRINT "--- ROBBERY TARGETS ON ";PL$(P%) 1290 PRINT "Security Level: ";SC%(P%);"/10" 1300 PRINT "Heat Level: ";H%;"%" 1310 PRINT "----------------------------------------" 1320 PRINT "1. Small Bank (Low risk)" 1330 PRINT "2. Casino Vault (Med risk)" 1340 PRINT "3. Planetary Treasury (High risk)" 1350 PRINT "Choose target (1-3) or 0 to abort:"; 1360 K$=GET$:PRINT K$ 1370 IF K$<"1" OR K$>"3" THEN ENDPROC 1380 TURN% = 1:T% = VAL(K$) 1390 IF T%=1 THEN V%=RC%(P%)*1500:S%=SC%(P%)-2 1400 IF T%=2 THEN V%=RC%(P%)*4000:S%=SC%(P%) 1410 IF T%=3 THEN V%=RC%(P%)*10000:S%=SC%(P%)+3 1420 IF S%<1 THEN S%=1 1430 PRINT "Planning robbery...":PROCdelay(100) 1440 RND_VAL% = RND(10):L% = 5 + RND_VAL% - S% + ID% 1450 IF L%>=5 THEN PROCrob_success(V%) 1460 IF L%>=2 AND L%<5 THEN PROCrob_partial(V%) 1470 IF L%<2 THEN PROCrob_fail 1480 PROCdelay(200):ENDPROC 1500 DEF PROCrob_success(V%):PRINT "CLEAN HEIST! You got away with ";V%;" credits.":C% = C% + V%:H% = H% + RND(5):ENDPROC 1510 DEF PROCrob_partial(V%):LOCAL PV%:PV% = INT(V% * 0.4):PRINT "PARTIAL SUCCESS! Alarms went off, but you grabbed ";PV%;" credits.":C% = C% + PV%:H% = H% + RND(15) + 5:ENDPROC 1520 DEF PROCrob_fail:LOCAL D%,I%,BestI%,MinD%:BestI%=E%:MinD%=999 1521 PRINT "DISASTER! The robbery failed completely." 1522 H%=H%+RND(15)+15:PRINT "Inskipp has tracked your signature!" 1523 FOR I%=0 TO NP%-1:IF I%<>P% THEN D%=FNdist(I%,P%):IF D%E% THEN D%=FNdist(I%, P%):IF D%MF% THEN F%=MF% 1700 PRINT "----------------------------------------" 1710 PRINT "Press any key to continue...":K$=GET$:ENDPROC 1720 DEF PROCinstructions 1730 CLS:PRINT "=== THE STAINLESS STEEL RAT ===" 1740 PRINT "You are Jim DiGriz, the galaxy's" 1750 PRINT "most slippery criminal. Your goal: steal" 1760 PRINT "100,000 credits and escape." 1770 PRINT "----------------------------------------" 1780 PRINT "But beware: Harold Inskipp, commander" 1790 PRINT "of the elite Special Corps, is tracking" 1800 PRINT "your hyperdrive signature!" 1810 PRINT "----------------------------------------" 1820 PRINT "CONTROLS:" 1830 PRINT " Q A < > : Move Targeting Crosshair" 1835 PRINT " RETURN : Select Nearest Planet" 1840 PRINT " J : Hyperspace Jump to Star" 1850 PRINT " H : Pull off a Heist (Risky)" 1860 PRINT " M : Visit Spaceport & Market" 1870 PRINT " I : Check Planet Information" 1875 PRINT " X : Quit Game" 1880 PRINT "----------------------------------------" 1890 PRINT "Press any key to begin your run..." 1900 G$=GET$ 1905 ENDPROC 1910 DEF PROCwarp_anim:LOCAL I%,X%,Y%,E% 1920 CLS:PRINT TAB(10,15);"ENGAGING HYPERDRIVE..."; 1930 FOR I%=1 TO 85 1940 E%=RND(4) 1950 IF E%=1 THEN X%=RND(1280):Y%=0 1960 IF E%=2 THEN X%=RND(1280):Y%=1023 1970 IF E%=3 THEN X%=0:Y%=RND(1024) 1980 IF E%=4 THEN X%=1279:Y%=RND(1024) 1990 MOVE 640,512:DRAW X%,Y% 2000 NEXT I%:PROCdelay(30):ENDPROC 2010 : 2020 DEF PROCgalaxy 2030 LOCAL I%,J%,X%,Y%,T% 2040 REM CREATE 20 SEPARATED STAR POSITIONS 2050 FOR I%=0 TO NP%-1 2060 X%=(I% MOD 5)*8:Y%=(I% DIV 5)*6+1 2070 IF X%<32 THEN X%=X%+RND(2)-1 2080 PX%(I%)=X%:PY%(I%)=Y%+RND(4)-1 2090 NEXT I% 2100 REM SHUFFLE POSITIONS BETWEEN PLANETS 2110 FOR I%=NP%-1 TO 1 STEP -1 2120 J%=RND(I%+1)-1 2130 T%=PX%(I%):PX%(I%)=PX%(J%):PX%(J%)=T% 2140 T%=PY%(I%):PY%(I%)=PY%(J%):PY%(J%)=T% 2150 NEXT I% 2160 ENDPROC 2170 : 2180 DEF PROCstart_positions 2190 LOCAL I%,J%,D%,MAXD%,T% 2200 MAXD%=-1 2210 FOR I%=0 TO NP%-2 2220 FOR J%=I%+1 TO NP%-1 2230 D%=FNdist(I%,J%) 2240 IF D%>MAXD% THEN MAXD%=D%:P%=I%:E%=J% 2250 NEXT J%:NEXT I% 2260 IF RND(2)=1 THEN T%=P%:P%=E%:E%=T% 2270 ENDPROC 2280 : 2300 DEF PROCtarget_input 2310 LOCAL I%,D%,MD% 2320 PROCcrosshair 2330 REPEAT 2340 K$=GET$:PROCcrosshair 2350 IF K$="Q" OR K$="q" THEN CY%=CY%-1 2360 IF K$="A" OR K$="a" THEN CY%=CY%+1 2370 IF K$="<" OR K$="," THEN CX%=CX%-1 2380 IF K$=">" OR K$="." THEN CX%=CX%+1 2390 IF CX%<0 THEN CX%=0 2400 IF CX%>39 THEN CX%=39 2410 IF CY%<0 THEN CY%=0 2420 IF CY%>23 THEN CY%=23 2430 PROCcrosshair 2440 UNTIL INSTR(CHR$(13)+"JjIiHhMmXx",K$)>0 2450 PROCcrosshair 2460 IF K$<>CHR$(13) THEN ENDPROC 2470 MD%=99999 2480 FOR I%=0 TO NP%-1 2490 D%=(PX%(I%)-CX%)^2+(PY%(I%)-CY%)^2 2500 IF D%