home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib29b.dsk / SEAWOLF.bas < prev    next >
BASIC Source File  |  2023-02-26  |  7KB  |  102 lines

  1. 10  REM ************************
  2. 20  REM * SEAWOLF              *
  3. 30  REM * BY DOUG HENNIG       *
  4. 40  REM * COPYRIGHT (C) 1986   *
  5. 50  REM * BY MICROSPARC, INC.  *
  6. 60  REM * CONCORD, MA  01742   *
  7. 70  REM ************************
  8. 80  PRINT  CHR$(4);"MAXFILES 1": HIMEM: 34816
  9. 90  ONERR  GOTO 890
  10. 100 F$ = "GAME.SET": PRINT  CHR$(4)"BLOAD GAME.SET"
  11. 110 F$ = "CHAR.GEN": PRINT  CHR$(4)"BLOAD CHAR.GEN": CALL 35840:F$ = ""
  12. 120  IF  PEEK(48896) = 76  THEN  PRINT  CHR$(4)"PR#A$8DC1": PRINT  CHR$(4)"IN#A$8ECA"
  13. 130  REM  PRINT INSTRUCTIONS
  14. 140  & SCROLL: &  HOME : HTAB 16: INVERSE : PRINT " SEAWOLF ": NORMAL : PRINT "  COPYRIGHT 1986 BY MICROSPARC, INC.": PRINT 
  15. 150  DIM SHIP$(3,1)
  16. 160 SHIP$(1,0) =  CHR$(111) + CHR$(105) + CHR$(105) + CHR$(117):SHIP$(1,1) = "UIIO"
  17. 170 SHIP$(2,0) =  CHR$(111) + CHR$(105) + CHR$(117):SHIP$(2,1) = "UIO"
  18. 180 SHIP$(3,0) =  CHR$(111) + CHR$(117):SHIP$(3,1) = "UO"
  19. 190  PRINT "     Your mission as the commander of a": PRINT "submarine, is to destroy as many ships": PRINT "as you can with your limited supply of": PRINT "torpedoes."
  20. 200  PRINT "     Use game paddle #0 to control the": PRINT "position of the crosshairs, and the": PRINT "button to fire torpedoes.": PRINT : PRINT "     There are three types of ships:"
  21. 210  POKE 7,147: PRINT : FOR I = 1 TO 3: PRINT "  "SHIP$(I,0): NEXT : POKE 7,144: VTAB  PEEK(37) -2
  22. 220  HTAB 8: PRINT "Tankers (slow)      - 100 pts": HTAB 8: PRINT "Destroyers (medium) - 200 pts": HTAB 8: PRINT "PT boats (fast)     - 300 pts": PRINT : REM  6 SPACES AFTER (slow), 5 SPACES AFTER (fast)
  23. 230  PRINT "You will get 10 extra torpedoes if you": PRINT "get more than 1800 pts. "
  24. 240  REM  DEFINE FUNCTIONS AND INITIALIZE VARIABLES
  25. 250  DEF  FN PAD(X) =  INT( PDL(X)/255 *37) +1: DEF  FN BUT(X) =  PEEK(49249 +X) >127: HCOLOR= 3
  26. 260 Y = 17:TRP = 0:SHIP = 5:HS = 0:BLANK$ = " ": FOR I = 1 TO 5:BLANK$ = BLANK$ +" ": NEXT 
  27. 270  DIM SC(10),N$(10):D$ =  CHR$(4)
  28. 280  REM  READ IN TOP SCORES IF NECESSARY
  29. 290  PRINT : INVERSE : PRINT "Want the all time top scores (Y or N)? ";: NORMAL : POKE 24,255: GET A$: PRINT A$;: IF A$ = "N"  OR A$ =  CHR$(110)  THEN F = 1: GOTO 330
  30. 300 F$ = "HIGH.SCORES"
  31. 310  PRINT D$"CLOSE": PRINT D$"OPEN HIGH.SCORES": PRINT D$"READ HIGH.SCORES": FOR I = 1 TO 10: INPUT SC(I),N$(I): NEXT : PRINT D$"CLOSE":F$ = "":HS = SC(1)
  32. 320  REM START OF GAME - PRINT MESSAGES AND DRAW SCREEN
  33. 330  &  HOME :MISSILE = 30:SC = 0: VTAB 22: PRINT "Score - 0000" TAB( 20)"Torpedoes left - "MISSILE: VTAB 23: HTAB 12: PRINT "High score - " RIGHT$("000" + STR$(HS),4)
  34. 340  HPLOT 0,0 TO 279,0 TO 279,159 TO 0,159 TO 0,0 TO 0,24 TO 279,24: & WINDOW(1,1 TO 38,2)
  35. 350  REM  DRAW CROSSHAIRS
  36. 360 XB =  FN PAD(0): VTAB Y: HTAB XB: POKE 7,147: PRINT "P": POKE 7,144
  37. 370  REM  DECIDE ON SHIP SPEED AND STARTING LOCATION
  38. 380 A =  RND(1):INC = (A < = 0.4) +2 *(A >0.4  AND A < = 0.8) +3 *(A >0.8): IF  RND(1) <0.5  THEN INC =  -INC
  39. 390 LOCN = 36 *(INC <0)
  40. 400  REM  FIND NEW CROSSHAIR POSITION
  41. 410 X =  FN PAD(0): IF X < >XB  THEN  VTAB Y: HTAB XB: PRINT " ";: HTAB X: POKE 7,147: PRINT "P": POKE 7,144
  42. 420  REM  IF BUTTON PRESSED, FIRE TORPEDO
  43. 430 XB = X: IF FIRE = 1  OR  FN BUT(0) = 0  OR MISSILE = 0  THEN 460
  44. 440  & WINDOW(1,20 TO 38,23):FIRE = 1:MISSILE = MISSILE -1: VTAB 22: HTAB 38 - LEN( STR$(MISSILE)): PRINT " "MISSILE;:MY = Y -1:MX = X: & WINDOW(1,1 TO 38,2)
  45. 450  REM  DRAW NEW SHIP POSITION AND SEE IF OFF SCREEN
  46. 460 A = LOCN +INC -( ABS(INC) = 3) * SGN(INC): IF A <1  OR (LOCN +5 -INC >37  AND INC >0)  THEN  VTAB 3: HTAB LOCN: PRINT  LEFT$(BLANK$, ABS(INC)): GOTO 540
  47. 470 LOCN = A: GOSUB 720
  48. 480  REM  IF TORPEDO FIRED, MOVE IT AND SEE IF SHIP HIT
  49. 490  IF FIRE = 0  THEN 410
  50. 500 MY = MY -1: GOSUB 750: IF MY < >6  THEN 410
  51. 510  FOR I = 0 TO 4 - ABS(INC): IF LOCN +I = MX  THEN  GOSUB 770: GOTO 540
  52. 520  REM  SHIP NOT HIT SO SPLASH!
  53. 530  NEXT I:FIRE = 0: VTAB MY -1: HTAB MX: PRINT " ";: VTAB 3: HTAB MX: POKE 7,147: PRINT  CHR$(112): POKE 7,144: FOR I = 1 TO 20: NEXT : HTAB MX: PRINT " ";: IF MISSILE >0  THEN 410
  54. 540  IF MISSILE >0  THEN 380
  55. 550  REM  WANT ANOTHER TRY?
  56. 560 FIRE = 0: IF SC >SC(10)  THEN 630
  57. 570  VTAB 22: &  CLEAR P: PRINT : PRINT "Want to try again (Y or N)? ";: POKE 24,255: GET B$: PRINT B$: IF B$ < >"N"  AND B$ < > CHR$(110)  THEN FLAG = 0: GOTO 330
  58. 580  REM  SAVE HIGH SCORES
  59. 590 F$ = ""
  60. 600  PRINT D$"OPEN HIGH.SCORES": PRINT D$"WRITE HIGH.SCORES": FOR I = 1 TO 10: PRINT SC(I): PRINT N$(I): NEXT : PRINT D$"CLOSE"
  61. 610  PRINT D$"PR#0": PRINT D$"IN#0": TEXT : HOME : END 
  62. 620  REM  GET NEW NAME
  63. 630  & WINDOW(0,0 TO 39,23): &  HOME : PRINT "Your score was one of the TOP TEN.": PRINT "Please enter your name (10 letters at": PRINT "most, please): "
  64. 640  VTAB 5: HTAB 15: PRINT "----------";: HTAB 15: &  INPUT (A$,10): REM  10 DASHES
  65. 650  REM  FIND WHERE SCORE BELONGS AND PUT IT THERE
  66. 660  FOR I = 1 TO 10: IF SC(I) >SC  THEN  NEXT 
  67. 670  FOR J = 10 TO I  STEP  -1:SC(J) = SC(J -1):N$(J) = N$(J -1): NEXT :SC(I) = SC:N$(I) = A$
  68. 680  REM  SHOW HIGH SCORES
  69. 690  &  HOME : INVERSE : HTAB 12: PRINT " TOP TEN SCORES ": NORMAL : VTAB 3: FOR I = 1 TO 10: IF SC(I) < >0  THEN  HTAB 12 - LEN( STR$(I)): PRINT I"  "N$(I) TAB( 29 - LEN( STR$(SC(I))))SC(I): PRINT : NEXT 
  70. 700 HS = SC(1): GOTO 570
  71. 710  REM  DRAW SHIP
  72. 720  IF LOCN >INC  AND INC >0  THEN  VTAB 3: HTAB LOCN -INC: PRINT  LEFT$(BLANK$,INC);
  73. 730  POKE 7, PEEK(7) +3: VTAB 3: HTAB LOCN -(INC +1) *(INC <0): PRINT SHIP$( ABS(INC),(INC <0)): POKE 7, PEEK(7) -3: RETURN 
  74. 740  REM  DRAW MISSILE
  75. 750  VTAB MY: HTAB MX: PRINT " ";: VTAB MY -1: HTAB MX: POKE 7,147: PRINT "Y";: POKE 7,144: RETURN 
  76. 760  REM  EXPLODE SHIP
  77. 770  VTAB MY -1: HTAB MX: PRINT " ";: VTAB 3: HTAB LOCN: PRINT  LEFT$(BLANK$, ABS(INC))
  78. 780  POKE 7,147: VTAB 3: HTAB LOCN +1: PRINT  CHR$(112); CHR$(112);: PRINT  CHR$(7): FOR I = 1 TO 20: NEXT : HTAB LOCN +1: PRINT "  ";: POKE 7,144
  79. 790  REM  INCREMENT SCORE AND GIVE BONUS IF NECESSARY
  80. 800  & WINDOW(1,20 TO 38,23):SC = SC +100 * ABS(INC): VTAB 22: HTAB 13 - LEN( STR$(SC)): PRINT SC;:FIRE = 0: & WINDOW(1,1 TO 38,2)
  81. 810  IF SC >1800  AND FLAG = 0  THEN MISSILE = MISSILE +10: VTAB 22: HTAB 38 - LEN( STR$(MISSILE)): PRINT " "MISSILE;:FLAG = 1
  82. 820  RETURN 
  83. 830  REM  DRAW EXPLODING SHIP
  84. 840  FOR I =  -1 TO 3  STEP 2: IF LOCN +I <40  AND LOCN +I > -1  THEN  PLOT LOCN +I,9
  85. 850  NEXT I: PLOT LOCN +1,7: RETURN 
  86. 860  REM  MORE EXPLODING SHIP
  87. 870  FOR I =  -2 TO 4  STEP 3: IF LOCN +I >0  AND LOCN +I <40  THEN  PLOT LOCN +I,9: NEXT 
  88. 880  PLOT LOCN +1,6: RETURN 
  89. 890 ER =  PEEK(222):EL =  PEEK(219) *256 + PEEK(218)
  90. 900  PRINT  CHR$(4)"CLOSE"
  91. 910  IF ER = 5  THEN  &  HOME : VTAB 7: CALL  -3288: GOTO 330
  92. 920  TEXT : HOME : VTAB 7: IF ER = 6  THEN  PRINT "FILE NOT FOUND": GOTO 970
  93. 930  IF ER = 8  THEN  PRINT "I/O ERROR": GOTO 960
  94. 940  IF ER = 16  THEN  PRINT "SYNTAX ERROR IN LINE "EL: GOTO 960
  95. 950  PRINT "UNANTICIPATED ERROR IN LINE "EL
  96. 960  CALL  -3288: VTAB 23: PRINT "PRESS <RETURN> TO RESTART";: GET CH$: PRINT CH$: CLEAR : GOTO 80
  97. 970  IF F$ = ""  THEN 960
  98. 980  PRINT : PRINT "THE FILE '"F$"' IS NOT ON THIS DISK.": PRINT "INSERT THE DISK WITH '"F$"'": PRINT : PRINT "AND PRESS <RETURN> ";
  99. 990  POKE  -16368,0: GET CH$: PRINT CH$
  100. 1000  IF F$ = "GAME.SET"  THEN  CALL  -3288: GOTO 100
  101. 1010  IF F$ = "HIGH.SCORES"  THEN  CALL  -3288: GOTO 330
  102. 1020  CALL  -3288: GOTO 110