10 REM ZORPH.ECB 15 REM ...ZORPHWAR by William Seurer, 9/77 at BSM 20 REM ...St. Louis Park, Minn. : SOL-20 Version - R.E.H. 25 PRINT "&K&J&JZ O R P H W A R :&J&J": REM ...4-1-81 30 PRINT ,"Super Space War version 4.1&J&J" 35 DIM A$(30),B$(80),C(8),D(8,4),E(50,6),M(4),S(4) 40 PRINT "<&G> Do you need instructions? ( Y or N ) ---=>"; 50 INPUT (1,0)A$: LET A$=A$+"N" 60 IF A$(1,1)="Y" THEN GOSUB 5100 70 LET C0=500,D0=0,E0=1000,R0=5,R1=5,R2=5,T=0 80 PRINT 90 DEF FNX(X)=RND(0)*X 100 DEF FNR(X)=INT(RND(0)*X)+1 110 DEF FNA(X)=1/C3+(1-1/C3)/2 120 DEF FNB(X)=1/E(X,2)+(1-1/E(X,2))/3 130 LET M(1)=20,M(2)=50,M(3)=9,M(4)=25 135 FOR X=1 TO 4: LET S(X)=100: NEXT X 140 FOR X=1 TO 50 150 FOR Y=1 TO 6: LET E(X,Y)=0: NEXT Y 160 NEXT X 170 FOR X=1 TO 8 180 LET D(X,1)=0,D(X,2)=0,D(X,3)=0,D(X,4)=0 190 NEXT X 200 PRINT "&J<&G> Enter difficulty factor (1-10) ---=>"; 210 INPUT D 220 IF D<1 OR D>10 THEN 200 ELSE PRINT 230 PRINT "&J<&G> Short or long game? ( S or L ) ---=>"; 240 INPUT (1,0)A$ 250 LET A$=A$+"S": PRINT 260 LET E8=25,S0=20 270 IF A$(1,1)="S" THEN 300 280 LET E8=50,S0=15 300 LET E1=E8 310 FOR X=1 TO E8 320 LET E(X,1)=FNX(1)*360 330 LET E(X,2)=17*FNR(3)-7+FNX(9) 340 LET E(X,3)=FNR(100)+79-E(X,2): REM ...min 100 350 LET E(X,4)=INT(FNX(75)+80-E(X,2)/2) 360 LET E(X,5)=FNR(3) 370 NEXT X 380 REM ...Zorph data printout... 385 LET T1=FNR(12): LET T2=FNR(60) 390 PRINT "Turn #";T;", Zorph ships left:";E1;", Time:";T1;":";T2 410 PRINT "Bearing Distance Shield Crew Damage" 420 FOR X=1 TO E8 430 IF E(X,5)=0 THEN 570 435 IF Q=13 THEN 520 440 LET D5=SGN(RND(0)-.5) 450 LET E(X,1)=E(X,1)+D5*22/E(X,2)*RND(0) 460 IF E(X,1)>360 THEN LET E(X,1)=E(X,1)-360 465 IF E(X,1)<0 THEN LET E(X,1)=E(X,1)+360 470 LET T9=1 475 IF E(X,2)<.5 THEN LET E(X,2)=.5 480 LET E(X,3)=E(X,3)+FNR(7) 485 IF E(X,3)>100 THEN LET E(X,3)=100 490 LET E(X,4)=E(X,4)+FNR(10)+9*(FNX(0)/10) 500 LET E(X,6)=E(X,6)-FNR(7) 505 IF E(X,6)<0 THEN LET E(X,6)=0 510 IF E(X,2)>S0 THEN 570 515 IF E(X,2)/75>RND(0) AND E(X,2)>10 AND E(X,3)>99 THEN 570 520 PRINT %7F3;E(X,1);%9F2;E(X,2);%9F1;E(X,3); 530 PRINT " ";%5I;E(X,4);%6F1;E(X,6);"%" 535 IF Q=13 THEN 570 540 LET E(X,1)=E(X,1)+D5*22/E(X,2)*RND(0) 550 IF E(X,1)>360 THEN LET E(X,1)=E(X,1)-360 555 IF E(X,1)<0 THEN LET E(X,1)=E(X,1)+360 560 LET E(X,2)=E(X,2)-(RND(0)-.3)*1.45 570 NEXT X 575 IF Q=13 THEN 830 580 LET E5=0 590 IF D0-R0>0 THEN LET D0=D0-R0 ELSE LET D0=0 600 FOR X=1 TO 4 610 LET Z0=100-S(X): IF Z0>B1 THEN LET Z0=B1 615 IF Z0>E0/20 THEN LET E9=E0/20 ELSE LET E9=Z0 620 LET E5=E5+E9 630 LET S(X)=S(X)+E9 640 LET E0=E0-E9*20 650 FOR Y=1 TO 8 660 LET D(Y,X)=D(Y,X)-R2 665 IF D(Y,X)<0 THEN LET D(Y,X)=0 670 NEXT Y 680 NEXT X 690 LET E0=E0+INT((RND(0)*.5+.5)*25/(LOG(D0+1)/LOG(10)+1))*10+100 700 IF (1/E1+.01) just broke through!&J" 720 LET C0=C0+FNR(50)+49 730 LET M(2)=M(2)+15 740 LET M(1)=M(1)+6 750 REM ...m(2)=m(2)+20 760 LET M(3)=M(3)+3 770 LET M(4)=M(4)+7 780 LET S(FNR(4))=100 790 LET X=FNR(8) 800 FOR Y=1 TO 4 810 LET D(X,Y)=0 820 NEXT Y 830 PRINT " S1 S2 S3 S4 Damage Crew Energy"; 835 FOR X=1 TO 4: LET S(X)=INT(S(X)): NEXT X 840 PRINT " NU-M CH-M AN-M NE-M" 845 LET E0=INT(E0) 850 PRINT %4I;S(1);S(2);S(3);S(4);%7F1;D0;"%";%5I;C0;%7I;E0; 855 PRINT %6I;M(1);M(2);M(3);M(4) 860 FOR X=1 TO 8: LET C(X)=0: NEXT X 870 LET C=0 880 LET T1=(13-D)*3-INT(RND(0)*D/1.5) 890 LET C=C+1 895 IF T1=0 OR C=8 THEN 1120 900 PRINT "<&G> Command ( #";C;",";T1;" Sec) ---=>"; 910 INPUT C(C) 920 IF C(C)>12 THEN LET C(C)=13 930 PRINT : LET Q=C(C) 940 IF T2<0 THEN 1120 950 LET T1=T1-(FNR(3)+1) 960 DATA "Nuclear","Chemical","Antimatter","Neutron" 970 DATA "Laser","Blaster","Disrupter","Disintigrator" 980 IF C(C)>8 THEN 1040 990 RESTORE 960 1000 FOR X=1 TO C(C) 1010 READ A$ 1020 NEXT X 1030 ON C(C)+1 GOTO 1110,2290,2290,2290,2290,3130,3130 1040 ON C(C)-6 GOTO 3130,3130,3800,3880,4010,4110,380,1050 1050 PRINT "Commands are; 1) Nuclear missles 2) Chemical missles" 1060 PRINT "3) Antimatter missles 4) Neutron missles 5) Lasers" 1070 PRINT "6) Blasters 7) Disrupters 8) Disintigrators" 1080 PRINT "9) Damage control 10) Damage report 11) Rotation" 1090 PRINT "12) Sensor control 13) Repeat last ship scan" 1100 REM 1110 GOTO 890 1120 LET T=T+1 1130 IF T/350+(E8-E1)/(80+2*D)>RND(0) THEN 4180 1140 REM ...ZORPH firing 1150 LET M=0 1160 FOR X=1 TO E8 1170 IF E(X,5)=0 THEN 1300 1180 IF INT(M/2.1)=D THEN EXIT 2030 1190 LET S=INT(E(X,1)/90+1) 1200 IF E(X,2)>20 AND S(S)>98 THEN 2020 1205 IF RND(0)*E(X,2)>7.5 THEN 2020 1210 IF E(X,6)>70 OR E(X,4)<11 THEN 2020 1220 LET M=M+1 1230 IF S(S)<>100 THEN 1260 1240 IF E(X,2)>8 THEN 1410 1250 GOTO 1930 1260 IF S(S)<90 THEN 1290 1270 IF E(X,2)>11 THEN 1410 1280 GOTO 1930 1290 ON FNR(2) GOTO 1410,1930 1300 REM ...New ZORPH ? 1310 IF RND(0)*A1>.3 OR RND(0)*T>6 THEN 2020 1320 LET E(X,1)=RND(0)*360 1330 LET E(X,2)=RND(0)*10+40 1340 LET E(X,3)=75+FNR(100) 1345 IF E(X,3)>100 THEN LET E(X,3)=100 1350 LET E(X,4)=FNR(30)+95 1360 LET E(X,5)=FNR(3) 1370 LET E(X,6)=0 1380 LET E1=E1+1 1390 PRINT "&JA new ZORPH just appeared." 1400 GOTO 2020 1410 REM ...ZORPH missles 1420 IF RND(0)<.2 THEN 1950 1430 LET R4=RND(0)*.75 1440 PRINT "&JInterceptors have "; 1450 IF FNB(X)RND(0) THEN 1570 1540 IF FNA(C3)>RND(0) THEN 1600 1550 PRINT "missed." 1560 GOTO 2020 1570 PRINT "&JHit on "; 1580 LET D9=1 1590 GOTO 1620 1600 PRINT "&JNear miss of "; 1610 LET D9=.5 1620 LET D9=D9*(153-S(S)*1.5)/2*(RND(0)*.2+.9) 1630 GOSUB 2150 1640 LET R4=RND(0) 1650 GOSUB 1670 1660 GOTO 2020 1670 REM ...Your damage 1680 PRINT "shield #";S;" causing " 1690 REM 1700 LET D0=D0+D9 1710 PRINT %5F1;D9;"% damage, ";D0;"% total" 1730 IF R4<.2 THEN 1880 1740 LET R9=FNR(8) 1750 LET D(R9,S)=D(R9,S)+(RND(0)*2.7+.3)*D9 1755 IF D(R9,S)>100 THEN LET D(R9,S)=100 1760 RESTORE 960 1770 FOR Y=1 TO R9 1780 READ A$ 1790 NEXT Y 1800 IF R9>4 THEN 1830 1810 LET Y=LEN(A$) 1820 LET A$=A$+" Missle" 1830 PRINT A$; 1840 PRINT " Station ";S;" reports ";%5F1;D(R9,S);"% damage" 1860 LET R9=FNR(4)+R9 1870 IF R9<9 THEN 1750 1880 IF C0-C9>0 THEN LET C0=C0-C9 ELSE LET C0=0 1890 IF S(S)-S9>0 THEN LET S(S)=S(S)-S9 ELSE LET S(S)=0 1900 IF C0<=0 THEN EXIT 4260 1910 IF D0>=100 THEN EXIT 4280 1920 RETURN 1930 REM ...ZORPH lasers 1940 IF RND(0)<.2 THEN 1430 1950 PRINT "&JZORPH (at ";%7F3;E(X,1);") laser hit" 1980 LET D9=(RND(0)*30+(D+11)*3)*(102-S(S))/20/E(X,2)^.75 1990 LET R4=RND(0) 2000 GOSUB 2150 2010 GOSUB 1670 2020 NEXT X 2030 REM ...Check for explosion 2040 IF T/400+D0/550+E5/2500(99-D0) THEN LET D9=99-D0 2090 IF D0/5>2 THEN LET Z0=D0/5 ELSE LET Z0=2 2095 LET C9=INT((C0/50+.5)*Z0) 2100 LET S9=.75*D9 2110 LET Z0=E0-INT(D9*20) 2115 IF Z0>1 THEN LET E0=Z0 ELSE LET E0=1 2120 LET R4=RND(0) 2130 GOSUB 1690 2140 GOTO 380 2150 REM ...Shield damages & Crew losses 2160 IF D9>(100-D0) THEN LET D9=100-D0 2170 LET C9=INT(D9*3+.5) 2180 LET S9=D9*.75 2190 RETURN 2200 REM ...Check for air leak 2210 IF D0/450+T/650+.050 THEN 2360 ELSE PRINT 2340 PRINT "NO ";A$;" missles are left!" 2350 GOTO 890 2360 DATA 1,1,2,.5,.25,5,1,1,1,3,2,2 2370 RESTORE 2360 2380 FOR X=1 TO C(C) 2390 READ D7,D6,M9 2400 NEXT X 2410 IF M9>M(C(C)) THEN LET M9=M(C(C)) 2420 LET B$="Tube" 2430 GOSUB 4410 2440 IF S7=0 THEN 890 2450 PRINT "&J<&G> Ready to fire: Course ---=>"; 2470 INPUT C1 2480 IF C1<0 OR C1>360 THEN 890 2485 IF C1=360 THEN LET C1=0 2490 LET C8=INT(C1/90+1) 2500 IF D(C(C),C8)<=50 THEN 2530 2510 PRINT "Tube ";C8;" is damaged!&J" 2520 GOTO 2420 2530 LET C2=1 2540 LET C6=C1 2550 IF C(C)=3 THEN 2590 2560 PRINT "&J<&G> Number to fire (";M9;" ) ---=>"; 2570 INPUT C2 2580 IF INT(C2)<1 THEN LET C2=1 2585 IF C2>M9 THEN LET C2=M9 2590 LET N5=C2 2600 IF M(C(C))=360 THEN LET Z0=360 ELSE LET Z0=C1+C5 2652 IF C1+C5<0 THEN LET X=0 ELSE LET X=C1+C5 2655 LET C1=C1+C5-360*Z0+360*X 2660 LET Z0=D(C(C),C8)/200+(N5-C2)/85 2665 IF Z0>.05 OR RND(0)+Z0>.35 THEN 2710 2670 PRINT ,"&J*+* B L A M *+*&J" 2680 PRINT "Missle has exploded in launching tube." 2685 PRINT ,"Warhead did'nt EXPLODE but ..." 2690 PRINT "Explosion caused ";: GOTO 3680 2710 PRINT "&JMissle away at";C1 2720 LET C7=0 2730 LET C3=1000 2740 FOR X=1 TO E8 2750 IF C1<2 THEN 2830 2760 IF C1>=358 THEN 2850 2770 IF E(X,1)C1+2 THEN 2860 2780 IF E(X,5)=0 OR E(X,2)>=C3 OR E(X,2)<=C7 THEN 2860 2790 LET C3=E(X,2) 2800 LET S=E(X,3) 2810 LET C4=X 2820 GOTO 2860 2830 IF E(X,1)<=C1+2 OR E(X,1)>=358+C1 THEN 2780 2840 GOTO 2860 2850 IF E(X,1)>=C1-2 OR E(X,1)<=C1-358 THEN 2780 2860 NEXT X 2870 IF C3=1000 THEN 2920 2880 IF FNA(C3)-C3/100>RND(0) THEN 2950 2890 IF FNA(C3)-C3/100>RND(0) THEN 3080 2900 LET C7=C3 2910 GOTO 2730 2920 PRINT "&JMissle missed" 2930 IF C2=0 THEN 1110 2940 GOTO 2620 2950 PRINT A$;" Missle hit on "; 2960 LET D9=1 2970 PRINT " ZORPH ship." 2975 PRINT " bearing: ";%7F3;E(C4,1);" at "; 2980 PRINT %7F4;E(C4,2);" L.S." 2990 ON C(C) GOTO 3020,3040,3060 3000 LET D9=D9*(102-S)/2 3010 GOTO 3070 3020 LET D9=D9*(204-S*2)/2 3030 GOTO 3070 3040 LET D9=D9*(104-S)/4 3050 GOTO 3070 3060 LET D9=D9*100/((S+1)/100+1) 3070 GOTO 4710 3080 PRINT A$;" Missle near miss of "; 3090 LET D9=.5 3100 IF C(C)<>3 THEN 2970 3110 LET D9=.75 3120 GOTO 2970 3130 REM ...Beam weapons --- commands 5 to 8 3140 GOSUB 4320 3150 IF S9=1 THEN 890 3160 PRINT A$;" Firing control reports "; 3170 LET B$="Station " 3180 GOSUB 4410 3190 IF S7=0 THEN 890 3200 PRINT " Ready to fire" 3210 DATA 1,1,.75,1.5,.75,1.5,1,.75 3220 RESTORE 3210 3230 FOR X=1 TO C(C)-4 3240 READ D7,D6 3250 NEXT X 3260 PRINT "<&G> Enter course ---=>"; 3270 INPUT C1 3280 IF C1<0 OR C1>360 THEN 890 3285 IF C1=360 THEN LET C1=0 ELSE PRINT 3290 LET C8=INT(C1/90+1) 3300 IF D(C(C),C8)<=50 THEN 3330 3310 PRINT "Station ";C8;" is damaged" 3320 GOTO 3170 3330 IF E0>150 THEN LET Z0=150 ELSE LET Z0=E0 3333 IF Z0<=0 THEN PRINT "ENERGY USED UP.": GOTO 890 3335 PRINT "Units to fire (";Z0;" ) ---=>"; 3340 INPUT C2 3350 IF C2>150 THEN LET C2=150 3355 IF C2>Z0 THEN LET C2=Z0 3360 IF C2<1 THEN 890 3370 LET E5=E5+C2 3380 PRINT "&J Enter the spread ( 15 max. ) ---=>"; 3390 INPUT S5 3400 IF S5>.5 THEN LET Z0=S5 ELSE LET Z0=.5 3405 IF Z0<=15 THEN LET S5=Z0 ELSE LET S5=15 3410 LET C3=RND(0)*D(C(C),C8)*2 3420 PRINT A$;" Operating at ";100-C3;"% efficiency" 3430 LET E0=E0-C2 3440 LET C2=C2*(100-C3)/100 3450 LET C4=-1 3460 FOR X=1 TO E8 3470 IF E(X,5)=0 THEN 3620 3480 IF C1>=S5 THEN 3490 3485 IF E(X,1)<=C1+S5 OR E(X,1)>=360-S5+C1 THEN 3510 ELSE 3620 3490 IF C1<=360-S5 THEN 3500 3495 IF E(X,1)>=C1-S5 OR E(X,1)<=360+S5 THEN 3510 ELSE 3620 3500 IF E(X,1)C1+S5 THEN 3620 3510 LET C4=X 3520 PRINT A$;" Hit on "; 3530 PRINT " ZORPH ship bearing: ";%7F3;E(X,1);" at "; 3535 PRINT %7F4;E(X,2);" L.S." 3540 ON C(C)-4 GOTO 3570,3590,3570 3550 LET D9=C2*(101-E(X,3))/50/SQR(E(X,2)) 3560 GOTO 3600 3570 LET D9=C2*(104-E(X,3))/25/E(X,2) 3580 GOTO 3600 3590 LET D9=C2*(202-E(X,3)*2)/20/(E(X,2)^1.5) 3600 LET D9=D9*2/S5 3610 EXIT 4710 3620 NEXT X 3630 IF C4<>-1 THEN 3650 3640 PRINT A$;" Shot missed" 3650 LET Z0=C2/750*(.5+D(C(C),C8)/20) 3655 IF Z0"; 3840 INPUT R0,R1,R2 3850 IF R0+R1+R2=15 THEN 890 ELSE PRINT 3860 PRINT " The sum of the repair rates MUST = 15" 3870 GOTO 3800 3880 REM ...Damage report --- Command 10 3890 PRINT "&JWeapon damage report:&J" 3900 PRINT " Device";TAB(26);"Damage(%)" 3910 PRINT TAB(21);"1 2 3 4" 3920 RESTORE 960 3930 FOR X=1 TO 8 3940 READ A$ 3950 IF X>4 THEN 3970 3960 LET A$=A$+" m." 3970 PRINT A$;TAB(20);%Z7F3;D(X,1);D(X,2);D(X,3);D(X,4) 3990 NEXT X 4000 GOTO 890 4010 REM ...Rotate --- Command 11 4020 PRINT "&JRotation control degrees to rotate:" 4030 INPUT " Enter ( + or - 180 max. ) ---=>",R9 4040 IF ABS(R9)>180 THEN 4020 ELSE PRINT 4050 FOR X=1 TO E8 4060 IF E(X,5)=0 THEN 4090 ELSE LET E(X,1)=E(X,1)+(R9) 4070 IF E(X,1)<0 THEN LET E(X,1)=E(X,1)+360 4080 IF E(X,1)>=360 THEN LET E(X,1)=E(X,1)-360 4090 NEXT X 4100 GOTO 890 4110 REM ...Sensors --- Command 12 4120 PRINT "&JPresent sensor range is: ";S0 4130 INPUT "<&G> Enter new sensor range ---=>",S0 4140 GOTO 890 4150 REM ...WIN!... 4160 PRINT "&J&JYou have destroyed the ZORPH fleet and SAVED the WORLD!&J" 4170 GOTO 4190 4180 PRINT "&JThe fleet has arrived!&J" 4190 PRINT "You have won the WAR! &J CONGRATULATIONS !&J" 4200 PRINT ,"Do you wish to:" 4205 PRINT "(1) Start over" 4210 PRINT "(2) Fight a new fleet ( Present status unchanged )" 4220 PRINT "(3) Quit" 4230 INPUT "<&G> Enter 1, 2, or 3 ---=>",X 4240 IF X=1 THEN 70 4250 IF X=2 THEN 230 ELSE 9000 4260 REM ...LOSE... 4270 PRINT "&J All of the CREW is dead." 4280 PRINT "The station has been destroyed" 4290 PRINT "The ZORPH fleet has sterilized the EARTH and" 4300 PRINT "the HUMAN race is no more!" 4310 GOTO 9000 4320 REM ...Command check... 4330 LET S9=0 4340 IF C=1 THEN 4400 4350 FOR X=1 TO C-1 4360 IF C(C)<>C(X) THEN 4390 4370 LET S9=1 4380 PRINT "Illegal command&J" 4390 NEXT X 4400 RETURN 4410 REM ...Damage check... 4420 LET S7=0,S8=0 4430 FOR X=1 TO 4 4440 IF D(C(C),X)<=50 THEN LET S7=S7+1 4450 NEXT X 4460 IF S7=0 THEN PRINT "All ";B$;"'s are DAMAGED" 4470 IF S7=4 THEN PRINT "All ";B$;"'s are safe." 4480 IF S7=0 OR S7=4 THEN RETURN 4490 FOR X=1 TO 4 4500 IF D(C(C),X)>50 THEN 4680 4560 IF S7<>1 THEN 4600 4570 PRINT " ";X;" is " 4580 EXIT 4700 4600 LET S8=S8+1 4610 IF S8<>1 THEN 4630 4620 PRINT "s"; 4630 PRINT " ";X 4640 IF S8=S7 THEN EXIT 4690 4650 PRINT ","; 4660 IF S8+1<>S7 THEN 4680 4670 PRINT " and"; 4680 NEXT X 4690 PRINT " are"; 4700 RETURN 4710 REM ...ZORPH damage... 4720 REM ...Shield types 4740 IF E(C4,5)=2 THEN 4790 4750 LET T9=.5 4760 IF E(C4,5)=1 AND C(C)<5 THEN 4790 4770 IF E(C4,5)=3 AND C(C)>4 THEN 4790 4780 LET T9=2 4790 LET Z0=D9*(RND(0)*.2+.9)*T9 4795 IF Z0>(100-E(C4,6)) THEN LET D9=(100-E(C4,6)) ELSE LET D9=Z0 4800 LET C9=D7*D9 4810 LET S9=D6*D9 4820 LET E(C4,6)=E(C4,6)+D9 4830 PRINT " causing ";%5F1;D9;"% damage, ";E(C4,6);"% total." 4850 IF E(C4,6)=100 THEN 4900 4860 LET Z0=E(C4,4)-INT(C9) 4865 IF Z0<0 THEN LET E(C4,4)=0 ELSE LET E(C4,4)=Z0 4870 IF E(C4,4)=0 THEN 4960 4880 LET Z0=E(C4,3)-S9 4885 IF Z0<0 THEN LET E(C4,3)=0 ELSE LET E(C4,3)=Z0 4890 ON INT(C(C)/5+1) GOTO 2930,3630 4900 PRINT "&J The ZORPH ship has been destroyed!" 4910 LET E(C4,5)=0 4920 LET E0=E0+100 4930 LET E1=E1-1 4940 IF E1=0 THEN 4150 ELSE 4890 4960 PRINT "&J The ZORPH ship has been captured." 4970 LET E0=E0+200 4980 LET M(1)=M(1)+INT(150/E(C4,6))+1 4990 LET M(2)=M(2)+INT(750/E(C4,6))+2 5000 LET M(3)=M(3)+INT(105/E(C4,6))+.5 5010 LET M(4)=M(4)+INT(205/E(C4,6))+.8 5020 GOTO 4910 5100 REM ...Instructions... 5110 PRINT "Instructions lost. Good luck." 5190 RETURN 9000 END