10  REM *** SEA BATTLE *** LAST MOD 12/20/10 WTN
15  REM ORIGINAL HP2000 PROGRAM BY VINCENT ERIKSON
20  REM THE REAL NAME OF THIS PROGRAM IS, "UNDERWATER PIE LOB"
25  REM CONVERTED TO MS BASIC BY STEVE NORTH
30  REM CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY
35  REM PUBLISHED IN DAVID AHL'S MORE COMPUTER GAMES
40  REM CONVERTED TO TRS80 BASIC BY ??? (AWSOFTWARE.ORG)
45  REM CONVERTED TO SINGLE USER HPBASIC BY WTN 12/2010
50  REM CHANGES... ADDED COMMANDS TO PASS TIME, TOGGLE AUTOMAP AND
55  REM PRINT HELP, ADDED STARTUP PROMPTS FOR RANDOM SEED AND
60  REM DIFFICULTY - LEVEL 3 IS STOCK PARMS, 1 AND 2 ARE EASIER
65  REM ELIMINATED NAME PROMPT AND OTHER STRING USAGE
70  REM ADDED NUMBER PRINT SUB, PLURAL MODS (WAS/WERE S ETC)
75  REM MODIFIED SHIP MOVEMENT AND OTHER CODE AS DESIRED
100  PRINT 
110  PRINT "*** SEA BATTLE ***"
120  PRINT "ENTER RANDOM SEED NUMBER ";
121  INPUT Z7
122  FOR Z8=0 TO Z7
123  LET Z9=RND(1)
124  NEXT Z8
130  PRINT "DIFFICULTY LEVEL 1-EASY 2-MEDIUM 3-NORMAL ";
131  INPUT L7
132  IF L7#1 AND L7#2 AND L7#3 THEN 130
260  PRINT 
270  DIM A[20,20],D[9]
280  REM ADDED AUTOMAP TOGGLE
281  LET M7=1
282  LET O=0
310  REM *** SET UP AREA ***
320  MAT A=ZER
330  REM *** ISLAND ***
340  RESTORE 
341  FOR Z8=1 TO 16
342  READ Z9
343  NEXT Z8
350  FOR X=7 TO 13
360  FOR Y=7 TO 12
370  READ A[X,Y]
380  NEXT Y
390  NEXT X
400  REM *** SUB ***
410  LET S1=S2=10
420  LET A[S1,S2]=2
430  REM *** ENEMY SHIPS ***
440  REM LET S=INT(RND(1)*16)+15
450  LET S=INT(RND(1)*(L7*3+7))+L7*4+3
490  FOR X=1 TO S
500  LET X1=INT(RND(1)*20)+1
510  LET X2=INT(RND(1)*20)+1
520  IF A[X1,X2]#0 THEN 500
530  LET A[X1,X2]=3
540  NEXT X
550  PRINT "YOU MUST DESTROY ";
551  LET Z9=S
552  GOSUB 9400
553  PRINT " ENEMY SHIPS TO WIN."
560  REM *** HEADQUARTERS ***
570  LET S4=INT(RND(1)*20)+1
580  LET S3=INT(RND(1)*20)+1
590  IF A[S3,S4]#0 THEN 570
600  LET A[S3,S4]=4
610  REM *** UNDERWATER MINES ***
620  REM FOR X=1 TO INT(RND(1)*8)+8
625  FOR X=1 TO INT(RND(1)*8)+L7*2+2
630  LET X2=INT(RND(1)*20)+1
640  LET X1=INT(RND(1)*20)+1
650  IF A[X1,X2]#0 THEN 630
660  LET A[X1,X2]=5
670  NEXT X
680  REM *** SEA MONSTERS ***
690  FOR X=1 TO 4
700  LET X2=INT(RND(1)*18)+2
710  LET X1=INT(RND(1)*18)+2
720  IF A[X1,X2]#0 THEN 700
730  LET A[X1,X2]=6
780  NEXT X
790  REM *** SET STARTING VALUES ***
800  MAT D=ZER
810  LET C=30
820  LET P=6000+(3-L7)*2000
830  LET F=2500+(3-L7)*500
840  LET T=10+(3-L7)*4
850  LET M=3+(3-L7)*2
860  LET D=100
870  LET D2=2+(3-L7)*3
875  IF M7 THEN 1790
880  REM *** COMMAND SECTION ***
890  PRINT "WHAT ARE YOUR ORDERS ";
900  INPUT O
910  IF O=0 THEN 1040
911  IF O=1 THEN 1680
912  IF O=2 THEN 2220
913  IF O=3 THEN 2680
914  IF O=4 THEN 3250
915  IF O=5 THEN 3410
916  IF O=6 THEN 3700
917  IF O=7 THEN 3880
918  IF O=8 THEN 4400
919  IF O=9 THEN 4660
920  IF O=10 THEN 4690
921  IF O=11 THEN 6320
922  IF O=12 THEN 6400
925  PRINT 
930  PRINT "THE COMMANDS ARE:"
931  PRINT "#0: NAVIGATION - MOVES YOUR SUBMARINE"
932  PRINT "#1: SONAR - OPTION 0 PRINTS MAP, 1 SENSES DIRECTIONS"
933  PRINT "#2: TORPEDO CONTROL - FIRES A TORPEDO"
934  PRINT "#3: MISSILE CONTROL - FIRES A POLARIS MISSLE"
935  PRINT "#4: MANUEVERING - SETS DEPTH"
936  PRINT "#5: STATUS/DAMAGE REPORT"
937  PRINT "#6: HEADQUARTERS - MUST BE IN DOCKING RANGE"
938  PRINT "#7: SABOTAGE - SEND MEN ON A SABOTAGE MISSION"
939  PRINT "#8: POWER CONVERSION - FUEL TO POWER AND VICE VERSA"
940  PRINT "#9: SURRENDER"
941  PRINT "#10: PASS TIME - USE THIS TO REPAIR DAMAGE"
942  PRINT "#11: TOGGLE AUTOMAP - IF DISABLED USE SONAR OPTION 0"
943  PRINT "#12: PRINT SYMBOLS AND DIRECTIONS"
944  PRINT 
1030  GOTO 880
1040  REM *** #0: NAVIGATION ***
1050  IF D[1] >= 0 THEN 1080
1060  PRINT "ENGINES ARE UNDER REPAIR."
1070  GOTO 880
1080  IF C>8 THEN 1110
1090  PRINT "NOT ENOUGH CREW TO MAN THE ENGINES."
1100  GOTO 880
1110  LET D1=1-((.23+RND(1)/10)*(D <= 50))
1120  GOSUB 6080
1125  IF C1=0 THEN 880
1130  PRINT "POWER AVAILABLE=";
1131  LET Z9=P
1132  GOSUB 9400
1133  PRINT "  POWER TO USE ";
1140  INPUT P1
1141  IF P1=0 THEN 880
1150  IF P1<0 OR P1>P THEN 1130
1160  IF P1 <= 1000 THEN 1210
1170  IF RND(1)<.43 THEN 1210
1180  PRINT "ATOMIC PILE GOES SUPERCRITICAL!!! HEADQUARTERS"
1190  PRINT "WILL WARN ALL SUBS TO STAY AWAY FROM RADIOACTIVE AREA!!!"
1200  GOTO 6180
1210  LET X=S1
1220  LET Y=S2
1230  LET Q1=1
1240  FOR X2=1 TO INT(INT(P1/100+.5)*D1+.5)
1250  IF X+X1>0 AND X+X1<21 AND Y+Y1>0 AND Y+Y1<21 THEN 1280
1260  PRINT "YOU CAN'T LEAVE THE AREA!!"
1270  GOTO 1340
1280  LET Z9=A[X+X1,Y+Y1]
1281  IF Z9=0 THEN 1290
1282  IF Z9=1 THEN 1330
1283  IF Z9=2 THEN 1630
1284  IF Z9=3 THEN 1390
1285  IF Z9=4 THEN 1440
1286  IF Z9=5 THEN 1470
1287  IF Z9=6 THEN 1490
1290  LET X=X+X1
1300  LET Y=Y+Y1
1310  LET P=P-100
1320  GOTO 1520
1330  PRINT "YOU ALMOST RAN AGROUND!!"
1340  LET A[S1,S2]=0
1350  LET A[X,Y]=2
1360  LET S1=X
1370  LET S2=Y
1380  GOTO 4690
1390  IF D>50 THEN 1290
1400  PRINT "YOU RAMMED A SHIP!!! YOU'RE BOTH SUNK!!"
1410  LET S=S-1
1420  IF S=0 THEN 6260
1430  GOTO 6180
1440  IF D>50 THEN 1290
1450  PRINT "YOU RAMMED HEADQUARTERS!! YOU'RE SUNK!!"
1460  GOTO 6180
1470  PRINT "YOU'VE BEEN BLOWN UP BY A MINE!!"
1480  GOTO 6180
1490  IF RND(1)<.21 THEN 1630
1500  PRINT "YOU WERE EATEN BY A SEA MONSTER!!"
1510  GOTO 6180
1520  REM *** CHECK FOR NEARBY SEA MONSTERS ***
1530  FOR X3=X-2 TO X+2
1540  FOR Y3=Y-2 TO Y+2
1550  IF X3<1 OR X3>20 OR Y3<1 OR Y3>20 THEN 1610
1560  IF A[X,Y]#6 THEN 1610
1570  IF RND(1)<.25 THEN 1500
1580  IF Q1=0 THEN 1610
1590  PRINT "YOU JUST HAD A NARROW ESCAPE WITH A SEA MONSTER!!"
1600  LET Q1=0
1610  NEXT Y3
1620  NEXT X3
1630  NEXT X2
1640  PRINT "NAVIGATION COMPLETE.  POWER LEFT=";
1641  LET Z9=P
1642  GOSUB 9400
1643  PRINT 
1650  IF P>0 THEN 1340
1660  PRINT "ATOMIC PILE HAS GONE DEAD!!! SUB SINKS, CREW SUFFOCATES"
1670  GOTO 6180
1680  REM *** #1: SONAR ***
1690  IF D[2] >= 0 THEN 1720
1700  PRINT "SONAR IS UNDER REPAIR."
1710  GOTO 880
1720  IF C>5 THEN 1750
1730  PRINT "NOT ENOUGH CREW TO WORK SONAR."
1740  GOTO 880
1750  PRINT "OPTION # ";
1760  INPUT O1
1762  REM CH.VARNAME SO 1ST O CAN BE CHECKED
1770  IF O1=0 THEN 1790
1771  IF O1=1 THEN 2010
1780  GOTO 1750
1790  REM *** PRINT OUT MAP ***
1800  REM PRINT
1810  FOR X=1 TO 20
1820  FOR Y=1 TO 20
1840  IF A[X,Y]#0 THEN 1880
1850  IF Y#1 AND Y#20 AND X#1 AND X#20 THEN 1880
1860  PRINT " . ";
1870  GOTO 1950
1880  REM RECODED RESTORE/READ/PRINTS USING ORIGINAL SYMBOLS
1890  REM LESS MALFUNCTION UNLESS LEVEL 3
1920  IF A[X,Y]<3 THEN 1930
1921  IF D<50 AND RND(1)<.23*(L7/3) THEN 1860
1922  IF RND(1)<.15*(L7/3) THEN 1860
1930  LET Z9=A[X,Y]
1932  IF Z9#0 THEN 1934
1933  PRINT "   ";
1934  IF Z9#1 THEN 1936
1935  PRINT "***";
1936  IF Z9#2 THEN 1938
1937  PRINT "(X)";
1938  IF Z9#3 THEN 1940
1939  PRINT "\S/";
1940  IF Z9#4 THEN 1942
1941  PRINT "!H!";
1942  IF Z9#5 THEN 1944
1943  PRINT " $ ";
1944  IF Z9#6 THEN 1950
1945  PRINT "-#-";
1950  NEXT Y
1960  PRINT 
1970  NEXT X
1975  REM NO POWER LOSS FOR AUTOMAP SCANS
1976  IF O#1 THEN 1990
1980  LET P=P-50
1990  IF P>0 THEN 880
2000  GOTO 1660
2010  REM *** DIRECTIONAL INFORMATION ***
2020  MAT B=ZER
2030  PRINT "DIRECTION   # OF SHIPS    DISTANCES"
2040  RESTORE 
2050  FOR X=1 TO 8
2060  READ X1,Y1
2070  LET X3=0
2080  FOR X4=1 TO 20
2090  LET X5=X1*X4
2091  LET Y5=Y1*X4
2092  IF S1+X5<1 OR S1+X5>20 OR S2+Y5<1 OR S2+Y5>20 THEN 2130
2100  IF A[S1+X5,S2+Y5]#3 THEN 2130
2110  LET X3=X3+1
2120  LET B[X3]=X4
2130  NEXT X4
2140  IF X3=0 THEN 2200
2150  PRINT "   ";X,X3,
2160  FOR X4=1 TO X3
2170  PRINT B[X4];
2180  NEXT X4
2190  PRINT 
2200  NEXT X
2210  GOTO 1980
2220  REM *** #2: TORPEDO CONTROL ***
2230  IF D[3] >= 0 THEN 2260
2240  PRINT "TORPEDO TUBES ARE UNDER REPAIR."
2250  GOTO 880
2260  IF C >= 10 THEN 2290
2270  PRINT "NOT ENOUGH CREW TO FIRE TORPEDO."
2280  GOTO 880
2290  IF T THEN 2320
2300  PRINT "NO TORPEDOS LEFT."
2310  GOTO 880
2320  IF D<2000 THEN 2360
2330  IF RND(1)>.5 THEN 2360
2340  PRINT "PRESSURE IMPLODES UPON FIRING...YOU'RE CRUSHED!!"
2350  GOTO 6180
2360  GOSUB 6080
2365  IF C1=0 THEN 880
2370  LET X=S1
2380  LET Y=S2
2390  FOR X2=1 TO INT(7+5*(D>50)-RND(1)*4+.5)
2400  IF X+X1>0 AND X+X1<21 AND Y+Y1>0 AND Y+Y1<21 THEN 2460
2410  PRINT "TORPEDO OUT OF SONAR RANGE...INEFFECTUAL."
2420  LET T=T-1
2430  LET P=P-150
2440  IF P>0 THEN 4690
2450  GOTO 1660
2460  LET Z9=A[X+X1,Y+Y1]
2461  IF Z9=0 THEN 2470
2462  IF Z9=1 THEN 2510
2463  IF Z9=2 THEN 2650
2464  IF Z9=3 THEN 2540
2465  IF Z9=4 THEN 2580
2466  IF Z9=5 THEN 2610
2467  IF Z9=6 THEN 2630
2470  LET X=X+X1
2480  LET Y=Y+Y1
2490  PRINT "..!..";
2500  GOTO 2650
2510  PRINT "YOU TOOK OUT SOME ISLAND!"
2520  LET A[X+X1,Y+Y1]=0
2530  GOTO 2420
2540  PRINT "OUCH!!! YOU GOT ONE!!"
2550  LET S=S-1
2560  IF S#0 THEN 2520
2570  GOTO 6260
2580  PRINT "YOU BLEW UP YOUR HEADQUARTERS!!!"
2590  LET S3=S4=D2=0
2600  GOTO 2520
2610  PRINT "BLAM!! SHOT WASTED ON A MINE!!"
2620  GOTO 2520
2630  PRINT "A SEA MONSTER HAD A TORPEDO FOR LUNCH!!"
2640  GOTO 2420
2650  NEXT X2
2660  PRINT "DUD."
2670  GOTO 2420
2680  REM *** #3: POLARIS MISSLE CONTROL ***
2690  IF D[4] >= 0 THEN 2720
2700  PRINT "MISSILE SILOS ARE UNDER REPAIR."
2710  GOTO 880
2720  IF C>23 THEN 2750
2730  PRINT "NOT ENOUGH CREW TO LAUNCH MISSILE."
2740  GOTO 880
2750  IF M#0 THEN 2780
2760  PRINT "NO MISSILES LEFT."
2770  GOTO 880
2780  IF D>50 AND D<2000 THEN 2850
2790  PRINT "RECOMMEND THAT YOU DO NOT FIRE AT THIS DEPTH."
2791  PRINT "ENTER 1 TO CONFIRM FIRE ";
2800  INPUT Z9
2810  IF Z9#1 THEN 880
2820  IF RND(1)<.5 THEN 2850
2830  PRINT "MISSILE EXPLODES UPON FIRING!! YOU'RE DEAD!!"
2840  GOTO 6180
2850  GOSUB 6080
2855  IF C1=0 THEN 880
2860  PRINT "FUEL (LBS.)  ";
2870  INPUT F1
2875  IF F1=0 THEN 880
2880  IF F1>0 AND F1 <= F THEN 2910
2890  PRINT "YOU ONLY HAVE ";
2891  LET Z9=F
2892  GOSUB 9400
2893  PRINT " LBS. LEFT."
2900  GOTO 2860
2910  LET F2=INT(F1/75+.5)
2920  LET X5=X1*F2
2921  LET Y5=Y1*F2
2922  IF S1+X5>0 AND S1+X5<21 AND S2+Y5>0 AND S2+Y5<21 THEN 2980
2930  PRINT "MISSILE OUT OF SONAR TRACKING. MISSILE LOST."
2940  LET M=M-1
2950  LET F=F-F1
2960  LET P=P-300
2970  GOTO 2440
2980  LET D3=D4=D5=D6=0
2990  FOR X=S1+X1*F2-1 TO S1+X1*F2+1
3000  FOR Y=S2+Y1*F2-1 TO S2+Y1*F2+1
3010  IF X<1 OR X>20 OR Y<1 OR Y>20 THEN 3140
3020  LET D3=D3+(A[X,Y]=3)
3030  LET D4=D4+(A[X,Y]=6)
3040  LET D5=D5+(A[X,Y]=5)
3050  LET D6=D6+(A[X,Y]=1)
3060  IF A[X,Y]#4 THEN 3100
3070  PRINT "YOU'VE JUST DESTROYED YOUR HEADQUARTERS!!!"
3080  LET D3=S4=D2=0
3090  GOTO 3130
3100  IF A[X,Y]#2 THEN 3130
3110  PRINT "YOU'VE JUST DESTROYED YOURSELF!!!    DUMMY!!"
3120  GOTO 6180
3130  LET A[X,Y]=0
3140  NEXT Y
3150  NEXT X
3160  IF D6=0 THEN 3180
3170  PRINT "YOU BLEW OUT SOME ISLAND."
3180  IF D5=0 THEN 3200
3190  PRINT "YOU DESTROYED ";
3191  LET Z9=D5
3192  GOSUB 9400
3193  IF D5=1 THEN 3196
3194  PRINT " MINES."
3195  GOTO 3200
3196  PRINT " MINE."
3200  IF D4=0 THEN 3220
3210  PRINT "YOU GOT ";
3211  LET Z9=D4
3212  GOSUB 9400
3213  PRINT " SEA MONSTER";
3214  IF D4=1 THEN 3216
3215  PRINT "S";
3216  PRINT "!!!   GOOD WORK!!"
3220  PRINT "YOU DESTROYED ";
3221  LET Z9=D3
3222  GOSUB 9400
3223  PRINT " ENEMY SHIP";
3224  IF D3=1 THEN 3226
3225  PRINT "S";
3226  PRINT "!!!"
3230  LET S=S-D3
3240  IF S>0 THEN 2940
3245  GOTO 6260
3250  REM *** MANUEVERING ***
3260  IF D[5] >= 0 THEN 3290
3270  PRINT "BALLAST CONTROLS ARE BEING REPAIRED."
3280  GOTO 880
3290  IF C>12 THEN 3320
3300  PRINT "THERE ARE NOT ENOUGH CREW TO WORK THE CONTROLS."
3310  GOTO 880
3320  PRINT "NEW DEPTH ";
3330  INPUT D1
3340  IF D1 >= 0 AND D1<3000 THEN 3370
3350  PRINT "HULL CRUSHED BY PRESSURE!!"
3360  GOTO 6180
3370  LET P=P-INT(ABS((D-D1)/2+.5))
3380  PRINT "MANUEVER COMPLETE. POWER LOSS=";
3381  LET Z9=INT(ABS((D-D1)/2+.5))
3382  GOSUB 9400
3383  PRINT 
3390  LET D=D1
3400  GOTO 4690
3410  REM *** #5: STATUS / DAMAGE REPORT ***
3420  IF D[6] >= 0 OR L7<3 THEN 3450
3430  PRINT "NO REPORTS ARE ABLE TO GET THROUGH."
3440  GOTO 880
3450  IF C>3 THEN 3480
3460  PRINT "NO ONE LEFT TO GIVE THE REPORT."
3470  GOTO 880
3480  PRINT 
3482  PRINT "# OF ENEMY SHIPS LEFT.......";S
3490  PRINT "# OF POWER UNITS LEFT.......";P
3500  PRINT "# OF TORPEDOS LEFT..........";T
3510  PRINT "# OF MISSILES LEFT..........";M
3520  PRINT "# OF CREWMEN LEFT...........";C
3525  PRINT "# OF RESUPPLIES LEFT........";D2
3530  PRINT "LBS. OF FUEL LEFT...........";F
3535  PRINT "DEPTH (IN FEET).............";D
3540  PRINT 
3550  REM PRINT "ENTER 1 DAMAGE REPORT ";
3560  REM INPUT Z9
3570  REM IF Z9#1 THEN 3670
3580  PRINT "ITEM          DAMAGE  (+ GOOD, 0 NEUTRAL, - BAD)"
3590  PRINT "----          ------"
3620  PRINT "ENGINES      ";D[1]
3621  PRINT "SONAR        ";D[2]
3622  PRINT "TORPEDOS     ";D[3]
3623  PRINT "MISSILES     ";D[4]
3624  PRINT "MANUEVERING  ";D[5]
3625  IF L7<3 THEN 3630
3626  PRINT "STATUS       ";D[6]
3630  PRINT "HEADQUARTERS ";D[7]
3631  PRINT "SABOTAGE     ";D[8]
3632  PRINT "CONVERTER    ";D[9]
3670  PRINT 
3690  GOTO 880
3700  REM *** #6: HEADQUARTERS ***
3710  IF D[7] >= 0 THEN 3740
3720  PRINT "HEADQUARTERS IS DAMAGED.  UNABLE TO HELP."
3730  GOTO 880
3740  IF D2>0 THEN 3770
3750  PRINT "HEADQUARTERS IS DESERTED."
3760  GOTO 880
3770  IF SQR((S1-S3)^2+(S2-S4)^2) <= 2 AND D<51 THEN 3800
3780  PRINT "UNABLE TO COMPLY WITH DOCKING ORDERS."
3790  GOTO 880
3800  PRINT "DIVERS FROM HEAD QUARTERS BRING OUT SUPPLIES AND MEN."
3810  LET P=4000+(3-L7)*2000
3820  LET T=8+(3-L7)*4
3830  LET M=2+(3-L7)*2
3840  LET F=1500+(3-L7)*500
3850  LET C=25
3860  LET D2=D2-1
3870  GOTO 4690
3880  REM *** #7: SABOTAGE ***
3890  IF D[8] >= 0 THEN 3920
3900  PRINT "HATCHES INACCESSIBLE.  NO SABOTAGES POSSIBLE."
3910  GOTO 880
3920  IF C>10 THEN 3950
3930  PRINT "NOT ENOUGH CREW TO GO ON MISSION."
3940  GOTO 880
3950  LET D3=D4=0
3960  FOR X=S1-2 TO S1+2
3970  FOR Y=S2-2 TO S2+2
3980  IF X<1 OR X>20 OR Y<1 OR Y>20 THEN 4010
3990  LET D3=D3+(A[X,Y]=3)
4000  LET D4=D4+(A[X,Y]=6)
4010  NEXT Y
4020  NEXT X
4030  IF D3#0 THEN 4060
4040  PRINT "NO SHIPS IN RANGE."
4050  GOTO 880
4060  PRINT "THERE ";
4061  IF D3=1 THEN 4064
4062  PRINT "ARE ";
4063  GOTO 4065
4064  PRINT "IS ";
4065  LET Z9=D3
4066  GOSUB 9400
4067  PRINT " SHIP";
4068  IF D3=1 THEN 4070
4069  PRINT "S";
4070  PRINT " IN RANGE."
4075  PRINT "HOW MANY MEN ARE GOING ";
4080  INPUT Q1
4090  IF C-Q1 >= 10 THEN 4120
4100  PRINT "YOU MUST LEAVE AT LEAST 10 MEN ON BOARD."
4110  GOTO 4075
4120  LET D5=INT(D3/Q1+.5)
4130  LET D6=0
4140  FOR X=S1-2 TO S1+2
4150  FOR Y=S2-2 TO S2+2
4160  IF D3/Q1>1-RND(1) AND RND(1)+D3/Q1<.9 THEN 4220
4170  IF A[X,Y]#3 THEN 4220
4180  LET D6=D6+1
4190  LET A[X,Y]=0
4200  LET S=S-1
4210  IF S=0 THEN 6260
4220  NEXT Y
4230  NEXT X
4240  LET Z9=D6
4241  GOSUB 9400
4242  IF D6=1 THEN 4245
4243  PRINT " SHIPS WERE";
4244  GOTO 4246
4245  PRINT " SHIP WAS";
4246  PRINT " DESTROYED."
4250  LET D6=D7=0
4260  FOR X=1 TO Q1
4270  LET D7=D7+(RND(1)>.6)
4280  NEXT X
4290  FOR X=1 TO Q1-D7
4300  LET D6=D6+(RND(1)<.15)
4310  NEXT X
4320  IF D4=0 THEN 4360
4330  PRINT "A SEA MONSTER SMELLS A MAN ON THE WAY BACK!!!"
4340  LET Z9=D7
4341  GOSUB 9400
4342  IF D7=1 THEN 4345
4343  PRINT " MEN WERE";
4344  GOTO 4346
4345  PRINT " MAN WAS";
4346  PRINT " EATEN!!"
4350  LET C=C-D7
4360  LET Z9=D6
4361  GOSUB 9400
4362  IF D6=1 THEN 4365
4363  PRINT " MEN WERE";
4364  GOTO 4366
4365  PRINT " MAN WAS";
4366  PRINT " LOST THROUGH ACCIDENTS."
4370  LET C=C-D6
4380  LET P=P-INT(10*Q1+RND(1)*10)
4390  GOTO 4690
4400  REM *** #8: POWER CONVERTER ***
4410  IF D[9] >= 0 THEN 4440
4420  PRINT "POWER CONVERTER IS DAMAGED."
4430  GOTO 880
4440  IF C>5 THEN 4470
4450  PRINT "NOT ENOUGH MEN TO WORK THE CONVERTER."
4460  GOTO 880
4470  PRINT "OPTION? (1=FUEL TO POWER, 2=POWER TO FUEL) ";
4480  INPUT O
4490  IF O=1 THEN 4510
4491  IF O=2 THEN 4580
4500  GOTO 4470
4510  REM *** FUEL TO POWER CONVERSION ***
4520  PRINT "FUEL AVAILABLE=";
4521  LET Z9=F
4522  GOSUB 9400
4523  PRINT "  CONVERT ";
4530  INPUT C1
4540  IF C1>F OR C1<0 THEN 4520
4550  LET F=F-C1
4560  LET P=P+INT(C1/3)
4570  GOTO 4640
4580  REM *** POWER TO FUEL CONVERSION ***
4590  PRINT "POWER AVAILABLE=";
4591  LET Z9=P-1
4592  GOSUB 9400
4593  PRINT "  CONVERT ";
4600  INPUT C1
4610  IF C1>P-1 OR C1<0 THEN 4590
4620  LET P=P-C1
4630  LET F=F+INT(C1*3)
4640  PRINT "CONVERSION COMPLETE. POWER=";
4641  LET Z9=P
4642  GOSUB 9400
4643  PRINT " FUEL=";
4644  LET Z9=F
4645  GOSUB 9400
4646  PRINT 
4650  GOTO 4690
4660  REM *** #9: SURRENDER ***
4670  PRINT "COWARD!! YOU'RE NOT VERY PATRIOTIC!!!"
4680  GOTO 6180
4690  REM *** RETALIATION SECTION ***
4700  LET Q=0
4710  FOR X=S1-4 TO S1+4
4720  FOR Y=S2-4 TO S2+4
4730  IF X<1 OR X>20 OR Y<1 OR Y>20 THEN 4760
4740  IF A[X,Y]#3 THEN 4760
4750  LET Q=Q+(RND(1)/SQR((S1-X)^2+(S2-Y)^2))
4760  NEXT Y
4770  NEXT X
4780  IF Q THEN 4810
4790  PRINT "NO SHIPS IN RANGE TO DEPTH CHARGE YOU!!"
4800  GOTO 5210
4810  PRINT "DEPTH CHARGES OFF ";
4820  IF RND(1)>.5 THEN 4850
4830  PRINT "PORT SIDE!!!"
4840  GOTO 4860
4850  PRINT "STARBOARD SIDE!!!"
4860  IF Q>.13 OR RND(1)>.92 THEN 4890
4870  PRINT "NO REAL DAMAGE SUSTAINED."
4880  GOTO 5210
4890  IF Q>.36 OR RND(1)>.96 THEN 4940
4900  PRINT "LIGHT, SUPERFICIAL DAMAGE."
4910  LET P=P-50
4920  LET D[INT(RND(1)*9)+1]=-RND(1)*2
4930  GOTO 5210
4940  IF Q>.6 OR RND(1)>.975 THEN 5020
4950  PRINT "MODERATE DAMAGE. REPAIRS NEEDED."
4960  LET P=P-75+INT(RND(1)*30)
4970  FOR Y=1 TO 2
4980  LET X=INT(RND(1)*9)+1
4990  LET D[X]=D[X]-RND(1)*8
5000  NEXT Y
5010  GOTO 5210
5020  IF Q>.9 OR RND(1)>.983 THEN 5100
5030  PRINT "HEAVY DAMAGE!! REPAIRS NEEDED IMMEDIATELY!!!"
5040  LET P=P-(200+INT(RND(1)*76))
5050  FOR X=1 TO 4+INT(RND(1)*2)
5060  LET Y=INT(RND(1)*9)+1
5070  LET D[Y]=D[Y]-RND(1)*11
5080  NEXT X
5090  GOTO 5210
5100  PRINT "DAMAGE CRITICAL!!!!  WE NEED HELP!!!"
5105  REM CODED MESSAGE STUFF REMOVED, REP'D WITH CHANCE
5110  IF RND(1)<.35*(L7/3) THEN 5190
5170  PRINT "HELP ARRIVES IN TIME TO SAVE YOU!!!"
5180  GOTO 5040
5190  PRINT "MESSAGE GARBLED...NO HELP ARRIVES!!!"
5200  GOTO 6180
5210  REM *** CHECK FOR TOO MUCH DAMAGE ***
5220  IF D[1] >= 0 OR D[3] >= 0 OR D[4] >= 0 THEN 5260
5222  IF D[5] >= 0 OR D[6] >= 0 OR D[7] >= 0 THEN 5260
5230  IF D[8] >= 0 OR D[9] >= 0 THEN 5260
5240  PRINT "DAMAGE TOO MUCH!!!   YOU'RE SUNK!!"
5250  GOTO 6180
5260  REM *** MOVE SHIPS / SEA MONSTERS ***
5270  PRINT 
5271  PRINT "---*** RESULT OF LAST ENEMY MANUEVER ***---"
5280  FOR X=1 TO 20
5290  FOR Y=1 TO 20
5300  IF A[X,Y]#3 THEN 5690
5310  REM *** MOVE A SHIP ***
5320  GOTO 5460
5420  LET Z9=A[X+W,Y+V]
5421  IF Z9=0 THEN 5430
5422  IF Z9=1 THEN 5460
5423  IF Z9=2 THEN 5530
5424  IF Z9=3 THEN 5460
5425  IF Z9=4 THEN 5560
5426  IF Z9=5 THEN 5600
5427  IF Z9=6 THEN 5650
5430  LET A[X+W,Y+V]=3
5440  LET A[X,Y]=0
5450  GOTO 6000
5460  REM *** CHANGE DIRECTION ***
5470  RESTORE 
5480  FOR X0=1 TO INT(RND(1)*8)+1
5490  READ W,V
5500  NEXT X0
5510  IF X+W<1 OR X+W>20 OR Y+V<1 OR Y+V>20 THEN 5470
5520  GOTO 5420
5530  IF D>50 THEN 5460
5540  PRINT "*** YOU'VE BEEN RAMMED BY A SHIP!!! ***"
5550  GOTO 6180
5560  IF RND(1)<.15 THEN 5460
5570  PRINT "*** YOUR HEADQUARTERS WAS RAMMED!!! ***"
5580  LET S3=S4=D2=A[X+W,Y+V]=0
5590  GOTO 5620
5600  IF RND(1)<.7 THEN 5460
5610  PRINT "*** SHIP DESTROYED BY A MINE!!! ***"
5620  LET S=S-1
5630  IF S#0 THEN 5440
5640  GOTO 6260
5650  IF RND(1)<.8 THEN 5460
5660  PRINT "*** SHIP EATEN BY A SEA MONSTER!! ***"
5670  LET S=S-1
5680  GOTO 5630
5690  REM *** MOVE A SEA MONSTER ***
5700  IF A[X,Y]#6 THEN 6000
5710  GOTO 5760
5720  LET Z9=A[X+M1,Y+M2]
5721  IF Z9=0 THEN 5730
5722  IF Z9=1 THEN 5760
5723  IF Z9=2 THEN 5830
5724  IF Z9=3 THEN 5850
5725  IF Z9=4 THEN 5900
5726  IF Z9=5 THEN 5730
5727  IF Z9=6 THEN 5930
5730  LET A[X+M1,Y+M2]=6
5740  LET A[X,Y]=0
5750  GOTO 6000
5760  REM *** CHANGE DIRECTION ***
5770  RESTORE 
5780  FOR X0=1 TO INT(RND(1)*8)+1
5790  READ M1,M2
5800  NEXT X0
5810  IF X+M1<1 OR X+M1>20 OR Y+M2<1 OR Y+M2>20 THEN 5760
5820  GOTO 5720
5830  PRINT "*** YOU'VE BEEN EATEN BY A SEA MONSTER!! ***"
5840  GOTO 6180
5850  IF RND(1)>.2 THEN 5760
5860  PRINT "*** SHIP EATEN BY A SEA MONSTER!! ***"
5870  LET S=S-1
5880  IF S#0 THEN 5730
5890  GOTO 6260
5900  PRINT "*** A SEA MONSTER ATE YOUR HEADQUARTERS!! ***"
5910  LET S3=S4=D2=0
5920  GOTO 5730
5930  IF RND(1)<.75 THEN 5760
5940  PRINT "*** A SEA MONSTER FIGHT!!! ";
5950  IF RND(1)<.8 THEN 5980
5960  PRINT "AND ONE DIES!! ***"
5970  GOTO 5730
5980  PRINT "IT'S A TIE!! ***"
5990  GOTO 5760
6000  NEXT Y
6010  NEXT X
6030  FOR Y=1 TO 9
6040  LET X=INT(RND(1)*9)+1
6050  LET Z9=RND(1)+(2+RND(1)*2)
6051  LET Z9=Z9*(1+((D<51) OR (D>2000)))*(D[X]<3)
6052  LET D[X]=D[X]+Z9
6060  NEXT Y
6065  IF M7 THEN 1790
6070  GOTO 880
6080  REM *** GOSUB FOR COURSE / DIRECTION ***
6090  DATA -1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1
6100  PRINT "COURSE (1-8) ";
6110  INPUT C1
6115  IF C1=0 THEN 6170
6120  IF C1<1 OR C1>8 THEN 6100
6130  RESTORE 
6140  FOR Z9=1 TO INT(C1+.5)
6150  READ X1,Y1
6160  NEXT Z9
6170  RETURN 
6180  REM *** DESTROYED ? ***
6190  PRINT "THERE ";
6191  IF S=1 THEN 6194
6192  PRINT "ARE";
6193  GOTO 6195
6194  PRINT "IS";
6195  PRINT " STILL ";
6196  LET Z9=S
6197  GOSUB 9400
6198  PRINT " ENEMY SHIP";
6199  IF S=1 THEN 6201
6200  PRINT "S";
6201  PRINT " LEFT."
6205  PRINT "YOU WILL BE DEMOTED TO THE RANK OF DECK SCRUBBER!!!"
6210  PRINT "ENTER 1 FOR ANOTHER GAME ";
6220  INPUT Z9
6230  IF Z9#1 THEN 6250
6240  GOTO 310
6250  STOP 
6260  PRINT "GOOD WORK!!!  YOU GOT THEM ALL!!!"
6270  PRINT "PROMOTION AND COMMENDATIONS WILL BE GIVEN IMMEDIATELY!!!"
6280  GOTO 6210
6290  REM *** ISLAND DATA ***
6300  DATA 0,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,1
6310  DATA 1,1,0,0,1,1,0,1,1,0,1,0,0,0,1,0,0,0
6320  REM *** TOGGLE AUTO MAP ***
6330  IF M7 THEN 6370
6340  LET M7=1
6350  PRINT "AUTOMAP ENABLED"
6360  GOTO 880
6370  LET M7=0
6380  PRINT "AUTOMAP DISABLED"
6390  GOTO 880
6400  REM *** INSTRUCTIONS ***
6405  PRINT 
6410  PRINT "MAP SYMBOLS..."
6420  PRINT "***   DRY LAND"
6430  PRINT "(X)   YOUR SUBMARINE"
6440  PRINT "!H!   YOUR HEADQUARTERS"
6450  PRINT "\S/   ENEMY SHIP"
6460  PRINT "-#-   SEA MONSTER"
6470  PRINT " $    UNDERWATER MINE"
6480  PRINT " .    UNKNOWN"
6500  PRINT "DIRECTIONS..."
6510  PRINT "8 1 2"
6520  PRINT " \'/    WHEN NAVIGATING IT TAKES 100 UNITS OF"
6530  PRINT "7-*-3   POWER TO MOVE ONE POSITION.  MISSILES"
6540  PRINT " /.\    REQUIRE 75 LBS FUEL FOR EACH POSITION."
6550  PRINT "6 5 4"
6555  PRINT 
6560  GOTO 880
9395  REM *** INTEGER PRINT SUBROUTINE ***
9396  REM UP TO 6 DIGITS -999999 TO 999999, NO SPACES PRINTED
9397  REM NUMBER TO PRINT IN Z9, Z8 AND Z7 USED FOR TEMPS
9398  REM IF OUT OF RANGE JUST PRINTS
9399  REM IF NOT INTEGER JUST PRINTS
9400  IF ABS(Z9) <= 999999. THEN 9405
9401  IF Z9=INT(Z9) THEN 9405
9402  PRINT Z9
9403  RETURN 
9405  IF Z9 >= 0 THEN 9420
9410  PRINT "-";
9420  LET Z8=ABS(Z9)
9430  LET Z8=INT(Z8)
9440  IF Z8<10 THEN 9560
9450  IF Z8<100 THEN 9530
9460  IF Z8<1000 THEN 9500
9461  IF Z8<10000 THEN 9470
9462  IF Z8<100000. THEN 9466
9463  LET Z7=INT(Z8/100000.)
9464  LET Z8=Z8-Z7*100000.
9465  GOSUB 9700
9466  LET Z7=INT(Z8/10000)
9467  LET Z8=Z8-Z7*10000
9468  GOSUB 9700
9470  LET Z7=INT(Z8/1000)
9480  LET Z8=Z8-Z7*1000
9490  GOSUB 9700
9500  LET Z7=INT(Z8/100)
9510  LET Z8=Z8-Z7*100
9520  GOSUB 9700
9530  LET Z7=INT(Z8/10)
9540  LET Z8=Z8-Z7*10
9550  GOSUB 9700
9560  LET Z7=Z8
9570  GOSUB 9700
9580  RETURN 
9695  REM DIGIT PRINT SUBROUTINE, DIGIT IN Z7
9700  IF Z7=1 THEN 9810
9710  IF Z7=2 THEN 9830
9720  IF Z7=3 THEN 9850
9730  IF Z7=4 THEN 9870
9740  IF Z7=5 THEN 9890
9750  IF Z7=6 THEN 9910
9760  IF Z7=7 THEN 9930
9770  IF Z7=8 THEN 9950
9780  IF Z7=9 THEN 9970
9790  PRINT "0";
9800  RETURN 
9810  PRINT "1";
9820  RETURN 
9830  PRINT "2";
9840  RETURN 
9850  PRINT "3";
9860  RETURN 
9870  PRINT "4";
9880  RETURN 
9890  PRINT "5";
9900  RETURN 
9910  PRINT "6";
9920  RETURN 
9930  PRINT "7";
9940  RETURN 
9950  PRINT "8";
9960  RETURN 
9970  PRINT "9";
9980  RETURN 
9999  END 

