home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib26b.dsk / ATLANTIC.CONVOY.bas < prev    next >
BASIC Source File  |  2023-02-26  |  12KB  |  173 lines

  1. 1  REM **********************
  2. 2  REM *  ATLANTIC.CONVOY   *
  3. 3  REM * BY BRIAN PARRY     *
  4. 4  REM * COPYRIGHT (C) 1985 *
  5. 5  REM * BY MICROSPARC, INC *
  6. 6  REM * CONCORD, MA  01742 *
  7. 7  REM **********************
  8. 120  GOSUB 1700
  9. 130  VTAB 23: HTAB 1: CALL  -958: PRINT "ONE MOMENT, PLEASE"
  10. 140  FOR I = 770 TO 790: READ D: POKE I,D: NEXT : DATA  173,48,192,136,208,5,206,1,3,240,9,202,208,245,174,0,3,76,2,3,96
  11. 150  REM  MAP INIT
  12. 160  DIM PM%(40,2),MM%(14,12),SH%(2,13,6),DI%(13,4),PF%(2),T$(13): FOR I = 1 TO 13: READ D$:T$(I) = D$: NEXT : DATA  CAR#1,CAR#2,DES#1,DES#2,SUB#1,SUB#2,SUB#3,ADV#1,ADV#2,ADV#3,ADV#4,TAN#1,TAN#2
  13. 170  DIM H$(5),H%(25): FOR I = 1 TO 5: READ A$:H$(I) = A$: NEXT : FOR I = 1 TO 25: READ A:H%(I) = A: NEXT : DATA     QUANTITY-,ATT.RNG.-,MOBILITY-,"ENDUR.-  ",FUEL.CAP-
  14. 180  DATA  2,2,3,4,2,3,2,1,1,0,1,1,2,3,1,5,3,2,1,1,40,30,30,15,200
  15. 190  FOR X = 1 TO 14:MM%(X,1) =  -1:MM%(X,12) =  -1: NEXT : FOR Y = 1 TO 12:MM%(1,Y) =  -1:MM%(2,Y) =  -1:MM%(13,Y) =  -1:MM%(14,Y) =  -1: NEXT Y
  16. 200 MM%(7,7) =  -1:MM%(8,6) =  -1: FOR Y = 7 TO 9:MM%(1,Y) = 0:MM%(14,Y -3) = 0:MM%(2,Y) = 0:MM%(13,Y -3) = 0: NEXT :PF%(1) = 100:PF%(2) = 100
  17. 210 P = 1: FOR S = 1 TO 13: READ X,Y,D:MM%(X,Y) = D:SH%(P,S,5) = X:SH%(P,S,6) = Y: NEXT : DATA  3,2,6,6,4, 6,3,4,7,3,6,7,3, 3,8,3,5,8,3,10,8,2,8,9,3,8,9,2,9,9,3,11,9,6,7,10,8,5,10
  18. 220 P = 2: FOR S = 1 TO 13: READ X,Y,D:MM%(X,Y) = D:SH%(P,S,5) = X:SH%(P,S,6) = Y: NEXT : DATA    12,11,1, 9,9,1,12,9,2,12,7,2,12,10,3,12,8,3,12,3,3,13,5,4,12,5,4,13,4,4,12,2,4,9,6,5,7,8,5
  19. 230  FOR S = 1 TO 13: FOR I = 1 TO 4: READ D:DI%(S,I) = D: NEXT : NEXT : DATA 3,1,5,40,3,1,5,40,2,1,3,30,2,1,3,30,1,2,2,30,1,2,2,30,1,2,2,30,1,3 ,1,15,1,3,1,15,1,3,1,15,1,3,1,15,0,1,1,200,0,1,1,200
  20. 240  FOR P = 1 TO 2: FOR S = 1 TO 13: FOR I = 1 TO 4:SH%(P,S,I) = DI%(S,I): NEXT I,S,P
  21. 250  REM  SCREEN SETUP
  22. 260  HGR : ROT= 0: SCALE= 1: HCOLOR= 1: FOR X = 0 TO 13: DRAW 14 AT X *20,13: DRAW 14 AT X *20,156: NEXT : DRAW 12 AT 119,91: DRAW 12 AT 141,78
  23. 270  FOR Y = 2 TO 6: DRAW 14 AT 0,Y *13: DRAW 14 AT 260,(Y +5) *13: DRAW 14 AT 20,Y *13: DRAW 14 AT 240,(Y +5) *13: NEXT 
  24. 280  FOR Y = 2 TO 3: DRAW 14 AT 240,Y *13: DRAW 14 AT 260,Y *13: DRAW 14 AT 0,(Y +8) *13: DRAW 14 AT 20,(Y +8) *13: NEXT 
  25. 290  HCOLOR= 5: ROT= 32: DRAW 13 AT 278,40: DRAW 13 AT 278,53: DRAW 13 AT 278,66
  26. 300  HCOLOR= 6: ROT= 0: DRAW 13 AT 1,91: DRAW 13 AT 1,104: DRAW 13 AT 1,117: HCOLOR= 7
  27. 310  FOR P = 1 TO 2: FOR S = 1 TO 13: XDRAW MM%(SH%(P,S,5),SH%(P,S,6)) AT SH%(P,S,5) *20 -18,SH%(P,S,6) *13 -3: NEXT S,P
  28. 320  REM  TURNS LOOP
  29. 330  FOR P = 1 TO 2: FOR T = 1 TO 2
  30. 340  POKE 34,20: HOME : PRINT "* ATLANTIC CONVOY *": PRINT "'Q'=QUIT   'H'=HELP": PRINT "'F'=FIRE   'M'=MOVE"
  31. 350  VTAB 21: HTAB 25: PRINT "PLAYER #";P: VTAB 22: HTAB 25: PRINT "TASK #";T;" OF 2": VTAB 23: HTAB 25: PRINT "ENTER:>";: GET W$
  32. 360  IF W$ = "Q"  THEN  HOME : PRINT "QUIT:-ARE YOU SURE (Y/N)";: GET W$: ON W$ < >"Y" GOTO 340: HGR : TEXT : HOME : END 
  33. 370  IF W$ = "H"  THEN  GOSUB 1590: GOTO 340
  34. 380  ON W$ = "F" GOTO 400: ON W$ = "M" GOTO 650: GOSUB 1430: GOTO 340
  35. 390  REM  FIRE ROUTINE
  36. 400 F$ = "F": POKE 34,20: HOME : HTAB 14: PRINT "<<<FIRE>>>": PRINT "'<-->'=SELECT 'H'=HELP": PRINT "<RET>=ACCEPT <ESC>=ABORT";
  37. 410  GOSUB 1010:P2 = 1:AB = SH%(P,S,1): IF P = 1  THEN P2 = 2
  38. 420 P2 = 1:AB = SH%(P,S,1):X = SH%(P,S,5):Y = SH%(P,S,6): IF P = 1  THEN P2 = 2
  39. 430  REM  PRECHECK FOR ENEMIES
  40. 440  FOR S1 = 1 TO 13:XM = SH%(P2,S1,5):YM = SH%(P2,S1,6):DF =  ABS(XM -X) + ABS(YM -Y): IF DF < = AB  THEN S1 = 13: NEXT : GOTO 470
  41. 450  NEXT : HOME : PRINT "THERE ARE NO ENEMY SHIPS IN ATTACK RANGE": FOR Z = 1 TO 3: POKE 768,20: POKE 769,10: CALL 770: NEXT : FOR Q = 1 TO 2500: NEXT : GOTO 340
  42. 460  REM  SELECT OR SHOOT
  43. 470  FOR S1 = 1 TO 13:XM = SH%(P2,S1,5):YM = SH%(P2,S1,6):DF =  ABS(XM -X) + ABS(YM -Y)
  44. 480  IF DF < = AB  AND SH%(P2,S1,5) < >20  THEN 500
  45. 490  NEXT : GOTO 470
  46. 500  XDRAW 15 AT XM *20 -20,YM *13: HOME : PRINT "'<-->'=SELECT ANOTHER TARGET <RET>=FIRE": HTAB 13: PRINT "<ESC> TO ABORT'";: GET W$
  47. 510  XDRAW 15 AT XM *20 -20,YM *13: IF  ASC(W$) = 27  THEN S1 = 13: NEXT : GOTO 340
  48. 520  IF  ASC(W$) = 8  OR  ASC(W$) = 21  THEN 490
  49. 530  IF  ASC(W$) < >13  THEN  GOSUB 1430: GOTO 500
  50. 540  REM  HIT SHIP
  51. 550 SH%(P2,S1,3) = SH%(P2,S1,3) -1: FOR Q = 1 TO 5: POKE 768,200: POKE 769,10: CALL 770: XDRAW 11 AT XM *20 -20,YM *13: NEXT : XDRAW 11 AT XM *20 -20,YM *13: IF SH%(P2,S1,3) < = 0  THEN  GOSUB 620
  52. 560  REM  CHECK FOR WINNER
  53. 570 PW = 1:R = 2: FOR SW = 1 TO 11: ON SH%(PW,SW,5) < >20 GOTO 580: NEXT : GOTO 1450
  54. 580 SW = 13: NEXT SW:R = 1:PW = 2: FOR SW = 1 TO 11: ON SH%(PW,SW,5) < >20 GOTO 590: NEXT : GOTO 1450
  55. 590 SW = 13: NEXT SW
  56. 600  NEXT T: GOSUB 1210: NEXT P: GOSUB 1480: GOTO 330
  57. 610  REM  SINK SHIP
  58. 620  FOR Z = 1 TO 20: XDRAW MM%(XM,YM) AT XM *20 -18,YM *13 -3: POKE 768,10 +5 *Z: POKE 769,10: CALL 770: NEXT : XDRAW MM%(XM,YM) AT XM *20 -18,YM *13 -3
  59. 630  FOR Z = 16 TO 20: XDRAW Z AT XM *20 -18,YM *13 -3: POKE 768,Z *10: POKE 769,10: CALL 770: FOR U = 1 TO 200: NEXT : XDRAW Z AT XM *20 -18,YM *13 -3: NEXT : GOSUB 1430:SH%(P2,S1,5) = 20:MM%(XM,YM) = 0: RETURN 
  60. 640  REM  MOVE SHIP
  61. 650 F$ = "M": POKE 34,20: HOME : HTAB 14: PRINT "<<<MOVE>>>": PRINT "'<-->'=SELECT 'H'=HELP,": PRINT "<RET>=ACCEPT <ESC>=ABORT";: GOSUB 1010
  62. 660  REM  CHECK FOR FUEL
  63. 670  IF SH%(P,S,4) < = 0  THEN  HOME : HTAB 10: PRINT "THIS SHIP HAS NO FUEL": GOSUB 1440: FOR Q = 1 TO 2500: NEXT : GOTO 340
  64. 680  REM  CHECK FOR BLOCKADE
  65. 690 X = SH%(P,S,5):Y = SH%(P,S,6):DS = SH%(P,S,2): FOR XM = X -DS TO X +DS: FOR YM = Y -DS TO Y +DS:DF =  ABS(XM -X) + ABS(YM -Y)
  66. 700  IF XM <1  OR XM >14  OR YM <1  OR YM >12  OR DF >DS  THEN 720
  67. 710  IF MM%(XM,YM) = 0  THEN 740
  68. 720  NEXT : NEXT : HOME : HTAB 2: PRINT "THIS SHIP IS BLOCKED AND CANNOT MOVE": GOSUB 1440: FOR Q = 1 TO 2500: NEXT : GOTO 340
  69. 730  REM  SHIP CAN MOVE
  70. 740 YM = 20:XM = 20: NEXT : NEXT 
  71. 750  IF DS >SH%(P,S,4)  THEN DS = SH%(P,S,4)
  72. 760 L = 1: FOR XM = X -DS TO X +DS: FOR YM = Y -DS TO Y +DS:DF =  ABS(XM -X) + ABS(YM -Y)
  73. 770  IF XM <1  OR XM >14  OR YM <1  OR YM >12  OR DF >DS  THEN 790
  74. 780  IF MM%(XM,YM) = 0  THEN PM%(L,1) = XM:PM%(L,2) = YM:L = L +1
  75. 790  NEXT : NEXT 
  76. 800 K = 1
  77. 810  HOME : XDRAW 15 AT (PM%(K,1) -1) *20,PM%(K,2) *13: PRINT "'<-->'=SELECT <RET>=ACCEPT <ESC>=ABORT";: GET W$
  78. 820  IF  ASC(W$) < >27  AND  ASC(W$) < >13  AND  ASC(W$) < >8  AND  ASC(W$) < >21  THEN  GOSUB 1430: GET W$: GOTO 820
  79. 830  ON  ASC(W$) = 13 GOTO 880: IF  ASC(W$) = 27  THEN  XDRAW 15 AT (PM%(K,1) -1) *20,PM%(K,2) *13: GOTO 340
  80. 840  ON  ASC(W$) = 21 GOTO 860: XDRAW 15 AT (PM%(K,1) -1) *20,PM%(K,2) *13:K = K -1: IF K = 0  THEN K = L -1: GOTO 810
  81. 850  GOTO 810
  82. 860  XDRAW 15 AT (PM%(K,1) -1) *20,PM%(K,2) *13:K = K +1: IF K >L -1  THEN  GOTO 800
  83. 870  GOTO 810
  84. 880  REM  MOVE SHIP IN ARRAY
  85. 890 XM = PM%(K,1):YM = PM%(K,2):DF =  ABS(SH%(P,S,5) -XM) + ABS(SH%(P,S,6) -YM):SH%(P,S,4) = SH%(P,S,4) -DF
  86. 900 SH%(P,S,5) = XM:SH%(P,S,6) = YM: XDRAW MM%(X,Y) AT X *20 -18,Y *13 -3:MM%(XM,YM) = MM%(X,Y):MM%(X,Y) = 0: XDRAW MM%(XM,YM) AT XM *20 -18,YM *13 -3
  87. 910  XDRAW 15 AT (XM -1) *20,YM *13
  88. 920  REM REFILL TANKER?
  89. 930 ST = MM%(XM,YM): IF ST < >5  AND ST < >10  THEN  GOTO 600
  90. 940  IF (XM = 7  AND YM = 6)  OR (XM = 8  AND YM = 5)  OR (XM = 7  AND YM = 8)  OR (XM = 8  AND YM = 7)  THEN 960
  91. 950  GOTO 600
  92. 960  FOR PH = 1 TO 2: FOR SR = 12 TO 13: IF SH%(PH,SR,5) = XM  AND SH%(PH,SR,6) = YM  AND SH%(PH,SR,4) < = 100  THEN SR = 13:PH = 2: NEXT : NEXT : GOTO 990
  93. 970  NEXT : NEXT 
  94. 980  GOTO 600
  95. 990  HOME : PRINT T$(S);" AT ";XM;",";YM;" IS FILLING UP ": FOR Q = 1 TO 1000: NEXT :SH%(P,S,4) = 200: FOR Q = 200 TO 0  STEP  -10: POKE 768,Q: POKE 769,10: CALL 770: NEXT : GOTO 600
  96. 1000  REM  FIND SHIP
  97. 1010 S = 0
  98. 1020 S = S +1
  99. 1030  IF S = 12  AND F$ = "F"  THEN 1010
  100. 1040  ON S = 14 GOTO 1010
  101. 1050  IF SH%(P,S,5) < >20  THEN  GOTO 1070
  102. 1060  GOTO 1020
  103. 1070 X = SH%(P,S,5):Y = SH%(P,S,6): GOSUB 1190: GOSUB 1180
  104. 1080  GET W$: IF W$ = "H"  THEN  GOSUB 1190: GOSUB 1590: POP : ON F$ = "F" GOTO 400: GOTO 650
  105. 1090  IF  ASC(W$) = 27  THEN  GOSUB 1190: POP : GOTO 340
  106. 1100  IF  ASC(W$) = 13  THEN  GOSUB 1190: RETURN 
  107. 1110  IF  ASC(W$) < >21  AND  ASC(W$) < >8  AND  ASC(W$) < >11  AND  ASC(W$) < >10  THEN  GOSUB 1430: GOTO 1080
  108. 1120  IF  ASC(W$) = 21  OR  ASC(W$) = 10  THEN  GOSUB 1190: GOTO 1020
  109. 1130  GOSUB 1190
  110. 1140 S = S -1: IF S = 0  AND F$ = "F"  THEN S = 11
  111. 1150  IF S = 0  THEN S = 13
  112. 1160  IF SH%(P,S,5) < >20  THEN  GOTO 1070
  113. 1170  GOTO 1140
  114. 1180  PRINT : VTAB 22: HTAB 29: CALL  -868: VTAB 23: HTAB 29: CALL  -868: VTAB 22: HTAB 29: PRINT "SHIP:>";T$(S): VTAB 23: HTAB 29: PRINT "AT ";X;",";Y;: RETURN 
  115. 1190  XDRAW 15 AT (X -1) *20,Y *13: RETURN 
  116. 1200  REM  SHIP REPAIRS
  117. 1210  HOME : HTAB 12: PRINT "REPAIRING SHIPS": POKE 34,21
  118. 1220 TN = 10:PP = 1:X = 1: FOR Y = 7 TO 9
  119. 1230  ON MM%(X,Y) = TN GOSUB 1380: ON MM%(X,Y) >5 GOSUB 1290
  120. 1240  NEXT : PRINT "PLAYER #";PP;" PORT FUEL =";PF%(PP);" UNITS":PP = 2:X = 14:TN = 5: FOR Y = 4 TO 6
  121. 1250  ON MM%(X,Y) = TN GOSUB 1380: IF MM%(X,Y) >0  AND MM%(X,Y) <6  THEN  GOSUB 1290
  122. 1260  NEXT : PRINT "PLAYER #";PP;" PORT FUEL =";PF%(PP);" UNITS": SPEED= 255
  123. 1270  PRINT "PRESS <RETURN> TO CONTINUE...";: GET W$
  124. 1280  RETURN 
  125. 1290  FOR S = 1 TO 13: IF SH%(PP,S,5) = X  AND SH%(PP,S,6) = Y  THEN  GOSUB 1320
  126. 1300  NEXT : SPEED= 100: RETURN 
  127. 1310  REM  CHECK PORT FUEL
  128. 1320  SPEED= 100:Z = DI%(S,4) -SH%(PP,S,4):V = PF%(PP)
  129. 1330  IF V <Z  THEN SH%(PP,S,4) = SH%(PP,S,4) +V:PF%(PP) = 0: PRINT "PLAYER #";PP;" PORT IS OUT OF FUEL!": FOR Q = 1 TO 5: GOSUB 1440: NEXT : FOR Q = 1 TO 2500: NEXT : RETURN 
  130. 1340  REM  NORMALIZE FACTORS
  131. 1350  FOR I = 1 TO 4: IF SH%(PP,S,I) < >DI%(S,I)  THEN  PRINT "REPAIR:> PLAYER #";PP;" SHIP ";T$(S);" FACTOR #";I
  132. 1360  NEXT :PF%(PP) = PF%(PP) -Z:SH%(PP,S,4) = SH%(PP,S,4) +Z: RETURN 
  133. 1370  STOP 
  134. 1380  REM FILL PORT TANKS
  135. 1390  FOR S2 = 12 TO 13: IF SH%(PP,S2,5) = X  AND SH%(PP,S2,6) = Y  THEN 1410
  136. 1400  NEXT : RETURN 
  137. 1410 PF%(PP) = PF%(PP) +SH%(PP,S2,4):DI%(S2,4) = 25:SH%(PP,S2,4) = 0: GOTO 1400
  138. 1420  REM ERROR SOUNDS
  139. 1430  POKE 768,10: POKE 769,10: CALL 770: RETURN 
  140. 1440  POKE 768,20: POKE 769,10: CALL 770: RETURN 
  141. 1450  REM  WINNER NOISE
  142. 1460  VTAB 23: PRINT : PRINT "CONGRATULATIONS PLAYER #";R;" YOU HAVE": PRINT "CONQUERED THE ATLANTIC TERRITORY!!": FOR I = 1 TO 4: FOR Q = 1 TO 200  STEP 10: POKE 768,Q: POKE 769,10: CALL 770: NEXT 
  143. 1470  FOR Q = 200 TO 0  STEP  -10: POKE 768,Q: POKE 769,10: CALL 770: NEXT : NEXT : END 
  144. 1480  REM  ENEMIES IN PORT
  145. 1490  FOR PZ = 1 TO 2: FOR SP = 1 TO 7:LX = SH%(PZ,SP,5):LY = SH%(PZ,SP,6): IF LX = 14  AND PZ = 1  THEN  GOSUB 1520
  146. 1500  IF LX = 1  AND PZ = 2  THEN  GOSUB 1520
  147. 1510  NEXT : NEXT : RETURN 
  148. 1520  REM  DEPLETE PORT FUEL
  149. 1530 R = 1: IF PZ = 1  THEN R = 2
  150. 1540  IF PF%(R) = 0  THEN  RETURN 
  151. 1550  IF PF%(R) <50  THEN PF%(R) = 0: GOTO 1570
  152. 1560 PF%(R) = PF%(R) -50
  153. 1570  FOR Q = 1 TO 5: GOSUB 1430: NEXT : HOME : PRINT "PORT #";R;" LOSES FUEL UNITS DUE TO ENEMY": FOR Q = 1 TO 2500: NEXT : POKE 34,20: RETURN 
  154. 1580  REM  HELP SCREEN
  155. 1590  TEXT : HOME : PRINT "** ATLANTIC CONVOY BY BRIAN J. PARRY **"
  156. 1600  PRINT : HTAB 10: PRINT "CARR. DEST. SUBM. ADV.  TANK."
  157. 1610  HTAB 10: PRINT "                  SUPT.      "
  158. 1620  FOR I = 1 TO 4: HTAB 1: PRINT H$(I); SPC( 2);: FOR J = 1 TO 5: PRINT H%((I -1) *5 +J); SPC( 5);: NEXT : NEXT 
  159. 1630  HTAB 1: PRINT H$(5); SPC( 2);: FOR J = 1 TO 5: PRINT H%(20 +J); SPC( 4);: NEXT 
  160. 1640  PRINT : PRINT "1)ATTACK RANGE--DISTANCE, IN SQUARES, A SHIP CAN SHOOT AND HIT A TARGET."
  161. 1650  PRINT : PRINT "2)MOBILITY--THE MAXIMUM DISTANCE A SHIP CAN MOVE IN A TASK."
  162. 1660  PRINT : PRINT "3)ENDURANCE--THE NUMBER OF TIMES THAT A SHIP CAN BE HIT BEFORE SINKING."
  163. 1670  PRINT : PRINT "4)FUEL--THE NUMBER OF SQUARES A SHIP CANMOVE BEFORE REFUELING."
  164. 1680  PRINT : PRINT "PRESS <RETURN> TO RESUME GAME...";: GET W$
  165. 1690  HOME : POKE  -16304,0: POKE  -16301,0: POKE  -16300,0: POKE  -16297,0: RETURN 
  166. 1700  IF  PEEK(104) = 64 GOTO 1720
  167. 1710  POKE 103,1: POKE 104,64: POKE 16384,0: PRINT  CHR$(4)"RUN ATLANTIC.CONVOY"
  168. 1720  TEXT : HOME : VTAB 5: HTAB 13: PRINT "ATLANTIC CONVOY": PRINT : PRINT : HTAB 12: PRINT "BY  BRIAN J. PARRY": PRINT : PRINT 
  169. 1730  PRINT "COPYRIGHT (C) 1985 BY MICROSPARC, INC."
  170. 1740  VTAB 23: PRINT "LOADING SHAPE TABLE"
  171. 1750  PRINT  CHR$(4);"BLOAD ATLANTIC.SHAPES,A$900": POKE 232,0: POKE 233,9
  172. 1760  VTAB 23: CALL  -958: GOSUB 1270
  173. 1770  RETURN