'=========================================================================== ' Subject: SUBMARINE CHASE Date: 07-04-84 (00:00) ' Author: Jeff Levering Code: QB, QBasic, PDS ' Origin: x2ftp.oulu.fi Packet: GAMES.ABC '=========================================================================== DIM SHIP(400) DIM SUBMARINE(400) DIM CAN1(100): DIM CAN2(100) DIM CRUNCH1(100): DIM CRUNCH2(100): DIM CRUNCH3(100): DIM CRUNCH4(100) DIM CRUNCH5(100) 2188 GOSUB 5000 2190 ' 2200 ' Action! 2210 ' 2220 CLS : V = TIMER 2230 LOCATE 25, 3: PRINT "Subs:"; : PRINT USING SCORE$; DEADSUBS; 2240 LOCATE 25, 20: PRINT "Score:"; : PRINT USING SCORE$; SCR 2250 ' 2260 ' SHP = Ship Position (H) 2270 ' V = Timer 2280 ' 2290 ' 2300 ' 2310 ' 2320 ' 2330 ' 2340 ' 2350 DRAW "b u85 b l320" 2360 FOR X = 1 TO 40 2370 DRAW "c1 r3 u1 r3 u1 r3 d1 r3 d1 r3" 2380 NEXT 2390 LINE (1, 190)-(600, 190) 2400 ' 2410 ON KEY(10) GOSUB 2950' Depth Chahge! 2420 KEY(10) ON 2430 ON KEY(11) GOSUB 3740' Speed Up! 2440 KEY(11) ON: KEY(11) STOP 2450 ON KEY(14) GOSUB 3810' Speed Down! 2460 KEY(14) ON: KEY(14) STOP 2470 SHPSPD = 4: LOCATE 25, 51: PRINT "Speed in Knots:"; 8; 2480 ' 2490 FOR R = 1 TO 4 2500 GOSUB 3230: GOSUB 3300 2510 X(R) = X: Y(R) = Y: SPD(R) = SPD: PUT (X(R), Y(R)), SUBMARINE: CHK(R) = 1 2520 NEXT 2530 SHIPCHK = 1 2540 SHP = 570 2550 IF SHIPCHK = 1 THEN 2580 2560 SHIPCHK = 0: PUT (SHP + SHPSPD, 7), SHIP 2570 KEY(11) ON: KEY(14) ON 2580 PUT (SHP, 7), SHIP 2590 KEY(11) STOP: KEY(14) STOP 2600 ' 2610 ' 2620 FOR R = 1 TO 4 2630 IF CHK(R) = 1 THEN CHK(R) = 0: GOTO 2660 2640 PUT (X(R) - SPD(R), Y(R)), SUBMARINE 2650 PUT (X(R), Y(R)), SUBMARINE 2660 NEXT 2670 ' 2680 IF VCHK = 0 THEN VCHK = V + .5 2690 V = TIMER: IF VCHK > V THEN 2690 2700 VCHK = V + .5 2710 SHP = SHP - SHPSPD 2720 FOR R = 1 TO 4 2730 X(R) = X(R) + SPD(R): IF X(R) < 600 THEN 2760 2740 PUT (X(R) - SPD(R), Y(R)), SUBMARINE: CHK(R) = 1 2750 GOSUB 3300: X(R) = 1: Y(R) = Y: SPD(R) = SPD: PUT (X(R), Y(R)), SUBMARINE 2760 NEXT 2770 ' 2780 KEY(10) STOP 2790 GOSUB 3030' Check Chahges 2800 ' 2810 ' Any Hits? 2820 ' 2830 FOR YY = 1 TO 8' Depth Charges 2840 IF START(YY) = 0 THEN 2910 2850 FOR R = 1 TO 4' Subs 2860 IF START(YY) < X(R) - 4 OR START(YY) > X(R) + 31 THEN 2900 2870 IF D(YY) < Y(R) OR D(YY) > Y(R) + 6 THEN 2900 2880 XR = X(R): YR = Y(R): SPDR = SPD(R): SUBMARINE = R: GOSUB 3410' Kill Sub 2890 GOSUB 3300: X(R) = 1: Y(R) = Y: SPD(R) = SPD: PUT (X(R), Y(R)), SUBMARINE: CHK(R) = 1 2900 NEXT R 2910 NEXT YY 2920 KEY(10) ON 2930 IF SHP > 26 THEN 2560 2940 PUT (SHP + SHPSPD, 7), SHIP: GOTO 2530 2950 ' 2960 ' Depth Chahge! 2970 ' 2980 FOR X = 1 TO 8: IF START(X) = 0 THEN 3010 2990 NEXT 3000 RETURN 3010 START(X) = SHP + 18 3020 RETURN 3030 ' 3040 ' Depth Charge 3050 ' 3060 FOR X = 1 TO 8 3070 IF START(X) = 0 THEN 3210 3080 IF ACTION(X) = 0 THEN PUT (START(X), 5), CAN1: GOTO 3180 3090 IF ACTION(X) = 1 THEN PUT (START(X), 5), CAN1: PUT (START(X) + 3, 3), CAN1: GOTO 3180 3100 IF ACTION(X) = 2 THEN PUT (START(X) + 3, 3), CAN1: PUT (START(X) + 6, 1), CAN1: GOTO 3180 3110 IF ACTION(X) = 3 THEN PUT (START(X) + 6, 1), CAN1: PUT (START(X) + 9, 4), CAN2: GOTO 3180 3120 IF ACTION(X) = 4 THEN PUT (START(X) + 9, 4), CAN2: PUT (START(X) + 12, 9), CAN2: GOTO 3180 3130 IF ACTION(X) = 5 THEN PUT (START(X) + 12, 9), CAN2: PUT (START(X) + 15, 13), CAN2: GOTO 3180 3140 IF ACTION(X) = 6 THEN PUT (START(X) + 15, 13), CAN2: START(X) = START(X) + 18: PUT (START(X), 17), CAN2: GOTO 3180 3150 IF ACTION(X) = 7 THEN PUT (START(X), 17), CAN2: D(X) = 20: PUT (START(X), D(X)), CAN1: D(X) = D(X) + 3: GOTO 3180 3160 IF ACTION(X) = 8 THEN PUT (START(X), D(X) - 3), CAN1: PUT (START(X), D(X)), CAN2: D(X) = D(X) + 3: ACTION(X) = 9: GOTO 3190 3170 PUT (START(X), D(X) - 3), CAN2: PUT (START(X), D(X)), CAN1: D(X) = D(X) + 3: ACTION(X) = 8: GOTO 3190 3180 ACTION(X) = ACTION(X) + 1: GOTO 3210 3190 IF D(X) > 185 AND ACTION(X) = 8 THEN PUT (START(X), D(X) - 3), CAN1: START(X) = 0: D(X) = 0: ACTION(X) = 0: GOTO 3210 3200 IF D(X) > 185 AND ACTION(X) = 9 THEN PUT (START(X), D(X) - 3), CAN2: START(X) = 0: D(X) = 0: ACTION(X) = 0: GOTO 3210 3210 NEXT 3220 RETURN 3230 ' 3240 ' X Co-Ordinate 3250 ' 3260 RANDOMIZE TIMER 3270 X = RND(10): X = INT(X * 1000) 3280 IF X < 1 OR X > 590 THEN 3270 3290 RETURN 3300 ' 3310 ' Y Co-Ordinate 3320 ' 3330 RANDOMIZE TIMER 3340 Y = RND(10): Y = INT(Y * 1000) 3350 IF Y < 20 OR Y > 180 THEN 3340 3360 IF Y < 70 THEN SPD = 7: GOTO 3400' Set Subs Speed 3370 IF Y < 120 THEN SPD = 5: GOTO 3400 3380 IF Y < 150 THEN SPD = 3: GOTO 3400 3390 SPD = 1 3400 RETURN 3410 ' 3420 ' Kill Da Sub 3430 ' 3440 IF ACTION(YY) = 9 THEN 3460 3450 PUT (START(YY), D(YY) - 3), CAN1: GOTO 3470 3460 PUT (START(YY), D(YY) - 3), CAN2 3470 START(YY) = 0: D(YY) = 0: ACTION(YY) = 0 3480 PUT (XR - SPDR, YR), SUBMARINE 3490 PUT (XR, YR), CRUNCH1 3500 IF OS = 1 THEN SOUND 77, 1: SOUND 107, 1 3510 GOSUB 3720 3520 PUT (XR, YR), CRUNCH1 3530 PUT (XR, YR), CRUNCH2 3540 IF OS = 1 THEN SOUND 57, 1: SOUND 87, 1 3550 GOSUB 3720 3560 PUT (XR, YR), CRUNCH2 3570 PUT (XR, YR), CRUNCH3 3580 IF OS = 1 THEN SOUND 37, 1: SOUND 67, 1 3590 GOSUB 3720 3600 PUT (XR, YR), CRUNCH3 3610 PUT (XR, YR), CRUNCH4 3620 GOSUB 3720 3630 PUT (XR, YR), CRUNCH4 3640 PUT (XR, YR), CRUNCH5 3650 GOSUB 3720 3660 PUT (XR, YR), CRUNCH5 3670 SCR = SCR + INT((2 * YR) / 25) 3680 LOCATE 25, 26: PRINT USING SCORE$; SCR; 3690 DEADSUBS = DEADSUBS + 1 3700 LOCATE 25, 9: PRINT USING SCORE$; DEADSUBS; 3710 RETURN 3720 FOR WT = 1 TO 500: NEXT 3730 RETURN 3740 ' 3750 ' Ship's Speed Up 3760 ' 3770 IF SHPSPD = 11 THEN 3790 3780 SHPSPD = SHPSPD + 1 3790 LOCATE 25, 65: PRINT SHPSPD * 2; 3800 RETURN 3810 ' 3820 ' Ship's Speed Down 3830 ' 3840 IF SHPSPD = 0 THEN 3790 3850 SHPSPD = SHPSPD - 1 3860 GOTO 3790 3861 ' 3862 ' Toggle Sound 3863 ' 3864 IF OS = 0 THEN OS = 1 ELSE OS = 0 3865 RETURN 3870 ' 3880 ' Duck! 3890 ' 3900 CLS : END 3910 RETURN 5000 ' 5010 ' Sub Chase 5020 ' Version 1.0 5030 ' 5040 ' Jeff Levering - July 4, 1984 - Boston, Mass. 5050 ' (617) 726-0789 5060 ' 5070 ' Requires: IBM-PC 5080 ' Graphics (IBM) 5090 ' Basica 2.0 5100 ' 5110 ' 5120 SCORE$ = "#####," 5130 KEY OFF 5140 KEY 7, "210-999" + CHR$(13) 5150 ON KEY(5) GOSUB 3870' Abandon Ship! 5160 KEY(5) ON 5170 OS = 1 5180 ON KEY(1) GOSUB 3861' Toggle Sound 5190 KEY(1) ON '5200 DIM CAN1(100): DIM CAN2(100) '5210 DIM CRUNCH1(100): DIM CRUNCH2(100): DIM CRUNCH3(100): DIM CRUNCH4(100) '5220 DIM CRUNCH5(100) 5230 SCREEN 2, 0: CLS 5240 A$ = "b m60,100": DRAW A$ 5250 DRAW "u2 r1 u2 r1 u2 r3 u2 r15 u1 r60 u1 r 76" 5260 DRAW "u2 r1 u10 r1 u15 r2 u8" 5270 DRAW "r2 u1 r15 u1 r6 u23 l1 u1 l4 u6" 5280 DRAW "r4 d1 r4 d1 r2 d4 r1 d23 d1 r4" 5290 DRAW "d1 r13 d1 r8 d1 r5 d1 r4 d6 r1 d8 r1 d8 r1" 5300 DRAW "d8 r1 d2 r8 d1 r15 d1 r30 d1 r50 d1 r50 d1 r60" 5310 DRAW "d1 r22 d1 r6 d1 r3 d2 r3 d2 l3 d2 l3 d2 l7 d2 l8 d2" 5320 DRAW "l13 d1 l12 d2 l15 d2 l18 d2 l22 d2 l17 d2 l17 d2 l20 d3 l15 d3" 5330 DRAW "l27 d1 l18 d2 l25 d2 l50 d1 l30 u1 l40 u1 l30 u2 l30 u3 l20" 5340 DRAW "u3 l13 u3 l8 u3 l6 u2 l1 u2 l1 u2 l1 u3 l1 u4 l1 u1 l1 u2" 5350 DRAW "l1 u1" 5360 LOCATE 13, 28: PRINT "Sub Chase" 5370 LOCATE 15, 25: PRINT "by Jeff Levering" 5380 LOCATE 23, 20: PRINT "Do You Want Instructions (Y/N) ?"; 5390 X = 0: Y = 1 5400 P = 10 5410 PP$ = INKEY$ 5420 IF Y = 1 THEN CIRCLE (400, 20), P, Y: P = P + 15 5430 IF Y = 0 THEN CIRCLE (400, 20), P, Y: P = P - 15 5440 IF X = 0 THEN IF OS = 1 THEN SOUND 1000, 2 5450 X = X + 1: IF X < 10 THEN 5500 5460 IF OS = 1 THEN SOUND 1000, 2: X = 0 5470 IF Y = 0 THEN Y = 1: GOTO 5490 5480 Y = 0: P = P - 15: GOTO 5500 5490 P = 10 5500 IF PP$ = "" THEN 5410 5510 IF PP$ = "y" OR PP$ = "Y" THEN 5540 5520 IF PP$ = "n" OR PP$ = "N" THEN 5990 5530 BEEP: GOTO 5410 5540 CLS 5550 LOCATE 1, 25: PRINT "SUBMARINE CHASE - Instructions" 5560 LOCATE 4, 1: PRINT "Sub Chase is an IBM-PC version of the classic arcade sub game." 5570 LOCATE 7, 1: PRINT "At the top of the screen you'll see a destroyer on patrol. This is your ship,": PRINT 5580 PRINT "and your job is to sink the submarines which pass below you.": PRINT : PRINT 5590 PRINT "Four Submarines will appear on the screen at all times. You have in": PRINT 5600 PRINT "your arsenal eight (8) depth charges which you can release on the": PRINT 5610 PRINT "unsuspecting submarines by pressing Function Key 10 (F10).": PRINT 5620 PRINT " Note: This is the first SUBMARINE CHASE, and has not been cleaned up" 5630 PRINT " enough to be compiled. In this interpreted version the game" 5640 PRINT " can be somewhat slow. The speed of the game will" 5650 PRINT " depend on how many of your 8 depth charges you" 5660 PRINT " have in the water at any time. The more you have in," 5670 PRINT " the slower the game." 5680 LOCATE 25, 25: PRINT "Press any key when ready..."; 5690 PP$ = INKEY$: IF PP$ = "" THEN 5690 5700 CLS 5710 LOCATE 1, 25: PRINT "SUBMARINE CHASE - Instructions" 5720 LOCATE 4, 1: PRINT "The speed of your boat can be controlled by using the UP and DOWN cursor keys." 5730 PRINT : PRINT "Pressing UP will speed up your boat, and pressing DOWN will slow it down." 5740 PRINT : PRINT : PRINT "A status line will appear at the bottom of the screen which will show" 5750 PRINT : PRINT "you how many subs you've sunk, what your score is, and your boat's speed." 5760 PRINT : PRINT "The deeper the sub is when you sink it, the more points you get." 5770 PRINT : PRINT : PRINT "There is also a Panic Key, Function Key 5 (F5), which will stop the game and": PRINT 5780 PRINT : PRINT "clear the screen. This can be useful if your boss wanders in. To restart the" 5790 PRINT : PRINT "game, press F2." 5800 LOCATE 25, 22: PRINT "Press any key to start "; 5810 A = 64: B = 35 5820 PP$ = INKEY$ 5830 IF A = 44 THEN A = 64: GOTO 5880 5840 LOCATE 25, A: PRINT "SUBMARINE "; 5850 FOR Y = 1 TO B: NEXT 5860 A = A - 1 5870 IF PP$ <> "" THEN 5990 ELSE 5820 5880 PP$ = INKEY$ 5890 IF A = 48 THEN 5940 5900 LOCATE 25, A: PRINT "CHASE "; 5910 FOR Y = 1 TO B: NEXT 5920 A = A - 1 5930 IF PP$ <> "" THEN 5990 ELSE 5880 5940 X = 0 5950 PP$ = INKEY$ 5960 X = X + 1 5970 IF X = 150 THEN LOCATE 25, A - 4: PRINT " "; : A = 64: GOTO 5820 5980 IF PP$ <> "" THEN 5990 ELSE 5950 5990 SCREEN 2, 0: CLS : X = 1 6000 A$(1) = " 1 " 6010 A$(2) = " 1 1 " 6020 A$(3) = " 1 1" 6030 A$(4) = "1 1" 6040 A$(5) = " 1 1" 6050 A$(6) = " 1" 6060 FOR Y = 1 TO 6 6070 FOR R = 1 TO LEN(A$(Y)) 6080 PSET (R, X), VAL(MID$(A$(Y), R, 1)) 6090 NEXT R 6100 X = X + 1 6110 NEXT Y 6120 GET (1, 1)-(7, 7), CAN1: X = 1: CLS 6130 A$(1) = " 1" 6140 A$(2) = " 1 1" 6150 A$(3) = "1 1" 6160 A$(4) = " 1 1" 6170 A$(5) = " 1 1" 6180 A$(6) = " 1" 6190 FOR Y = 1 TO 6 6200 FOR R = 1 TO LEN(A$(Y)) 6210 PSET (R, X), VAL(MID$(A$(Y), R, 1)) 6220 NEXT R 6230 X = X + 1 6240 NEXT Y 6250 GET (1, 1)-(7, 7), CAN2 '6260 DIM SHIP(400) '6270 DIM SUBMARINE(400) 6280 SCREEN 2, 0: WIDTH 80: CLS : X = 55 6290 LOCATE 25, 20: PRINT "Please Wait - Setting Up Graphics..."; 6300 LOCATE 8, 24: PRINT "Ship" 6310 A$(1) = " 11" 6320 A$(2) = " 1 1111" 6330 A$(3) = " 111 11111 1 1" 6340 A$(4) = "1 111 11111 1 1" 6350 A$(5) = " 111111111111111111111111111" 6360 A$(6) = " 1111111111111111111111" 6370 A$(7) = " 111111111111111111111" 6380 FOR Y = 110 TO 117 6390 FOR R = 1 TO LEN(A$(X - 54)) 6400 PSET (R + 250, X), VAL(MID$(A$(X - 54), R, 1)) 6410 NEXT R 6420 X = X + 1 6430 NEXT Y 6440 GET (250, 55)-(285, 62), SHIP 6450 X = 95 6460 LOCATE 13, 24: PRINT "Sub" 6470 A$(1) = " 1" 6480 A$(2) = " 1" 6490 A$(3) = " 11111" 6500 A$(4) = " 11111" 6510 A$(5) = " 1111111111111111111111111111" 6520 A$(6) = "11111111111111111111111111111" 6530 FOR Y = 1 TO 6 6540 FOR R = 1 TO LEN(A$(Y)) 6550 PSET (R + 250, X), VAL(MID$(A$(Y), R, 1)) 6560 NEXT R 6570 X = X + 1 6580 NEXT Y 6590 GET (250, 95)-(285, 102), SUBMARINE 6600 A$(1) = " 1 11 1111 " 6610 A$(2) = " 1111 11111 " 6620 A$(3) = "11 111111111 " 6630 A$(4) = "1111111 1111111 " 6640 A$(5) = " 111111111 1111111111 " 6650 A$(6) = " 11111111111111 " 6660 FOR Y = 1 TO 6 6670 FOR R = 1 TO LEN(A$(Y)) 6680 PSET (R + 250, Y + 95), VAL(MID$(A$(Y), R, 1)) 6690 NEXT R 6700 NEXT Y 6710 GET (250, 95)-(285, 102), CRUNCH1 6720 A$(1) = "111 1 11 " 6730 A$(2) = " 11111 111 1111 " 6740 A$(3) = " 111111 111111111 " 6750 A$(4) = " 111111 1111111 " 6760 A$(5) = " 1111111 1111111 " 6770 A$(6) = " 11 1 1 1 111 " 6780 FOR Y = 1 TO 6 6790 FOR R = 1 TO LEN(A$(Y)) 6800 PSET (R + 250, Y + 95), VAL(MID$(A$(Y), R, 1)) 6810 NEXT R 6820 NEXT Y 6830 GET (250, 95)-(285, 102), CRUNCH2 6840 A$(1) = " 11 1 1 1 " 6850 A$(2) = " 11111 1 11 " 6860 A$(3) = " 111 1 111111 " 6870 A$(4) = " 11 11 1 111 11 1 1 " 6880 A$(5) = " 11 111 1 11 " 6890 A$(6) = " 1 1 1 1 1 " 6900 FOR Y = 1 TO 6 6910 FOR R = 1 TO LEN(A$(Y)) 6920 PSET (R + 250, Y + 95), VAL(MID$(A$(Y), R, 1)) 6930 NEXT R 6940 NEXT Y 6950 GET (250, 95)-(285, 102), CRUNCH3 6960 A$(1) = " 1 1 1 1 " 6970 A$(2) = " 1 1 1 1 1 " 6980 A$(3) = " 1 1 1 1 1 " 6990 A$(4) = " 1 1 1 1 1 1 1 1 1 " 7000 A$(5) = " 1 1 1 1 " 7010 A$(6) = " 1 1 1 1 " 7020 FOR Y = 1 TO 6 7030 FOR R = 1 TO LEN(A$(Y)) 7040 PSET (R + 250, Y + 95), VAL(MID$(A$(Y), R, 1)) 7050 NEXT R 7060 NEXT Y 7070 GET (250, 95)-(285, 102), CRUNCH4 7080 FOR X = 1 TO 7: A$(X) = STRING$(30, 32): NEXT 7090 FOR Y = 1 TO 7 7100 FOR R = 1 TO LEN(A$(Y)) 7110 PSET (R + 250, Y + 94), VAL(MID$(A$(Y), R, 1)) 7120 NEXT R 7130 NEXT Y 7140 GET (250, 95)-(285, 102), CRUNCH5 7160 RETURN