EkriirkE

PLANDER.BAS

Jul 15th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 100 REM BASIC Month 4: Lunar Corps
  2. 110 REM http://reddit.com/r/RetroBattlestations
  3. 120 REM Based on the original by FozzTexx
  4. 130 REM Rewritten by EkriirkE
  5. 140 REM Today is 2019-07-15
  6.  
  7. 200 REM Clear screen and setup variables
  8. 210 CLS : RANDOMIZE TIMER
  9. 220 COLS = 80: ROWS = 24
  10. 230 ITER = 10
  11.  
  12. 300 GOSUB 2510
  13. 310 YS = SQR(LY) / ITER
  14. 320 XV = RND(1) / ITER: YV = 0
  15. 330 X = 1: Y = 1
  16. 340 FUEL = 100
  17.  
  18. 350 LOCATE LY + 1, LX + 1: COLOR 2: PRINT "X"
  19. 360 COLOR 7: LOCATE 1, COLS - 4: PRINT "FUEL": LOCATE 4, COLS - 7: PRINT "DESCENT"
  20. 370 PCOPY 0, 1
  21. 380 SP$ = "NASA has determined the only landing position is on the X"
  22. 390 COLOR 15: GOSUB 1210
  23. 395 WHILE INKEY$ = "": GOSUB 2700: WEND
  24.  
  25. 400 REM Main loop
  26. 420 YV = YV + 1 / (ITER * ITER)
  27. 430 X = X + XV: Y = Y + YV: FUEL = FUEL - 1 / ITER
  28. 440 IF ABS(Y - YY) > 2 THEN YY = Y: SOUND 200, .5: SOUND 2000, 1
  29. 450 IF TIMER - UT < 1 THEN SOUND 1000, .1
  30. 460 IF FUEL < 20 THEN SOUND 80, .2 ELSE SOUND 40, .1
  31. 470 GOSUB 1510
  32. 480 J = TIMER: WHILE TIMER - J < 1 / ITER: WEND
  33. 490 IF (YV * ITER < -5 AND Y < 0) OR Y < -10 OR X < -5 OR X > COLS + 5 GOTO 690
  34. 500 IF Y < LY GOTO 420
  35. 510 UT = 1: GOSUB 1510
  36. 520 IF INT(Y) = LY AND INT(X) = LX AND INT(YV * ITER) < 4 GOTO 610 ELSE GOTO 710
  37.  
  38. 600 REM Draw flag, start anthem
  39. 610 LOCATE ROWS - 4, COLS / 2: COLOR 15, 1: PRINT "**"; : COLOR , 4: PRINT "==="
  40. 620 LOCATE ROWS - 3, COLS / 2: COLOR , 4: PRINT "====="
  41. 630 LOCATE ROWS - 2, COLS / 2: COLOR , 0: PRINT "| "
  42. 640 COLOR 10: SP$ = "The Eagle has landed": PLAY "l5gl15el5ceg>c"
  43. 650 GOTO 730
  44.  
  45. 680 REM Too far out of frame
  46. 690 COLOR 12: LOCATE ROWS / 2, (COLS - 30) / 2: PRINT "~ The Eagle is "; : PLAY "l30efp20ee-p20efp20ee-": PRINT "LOST IN SPACE ~"
  47. 700 GOTO 999
  48.  
  49. 705 REM Loser, start taps
  50. 710 COLOR 12: SP$ = "! The Eagle has crashed !": PLAY "l10c..cl1f"
  51. 730 GOSUB 1210
  52.  
  53.  
  54. 999 COLOR 7: END
  55.  
  56. 1200 REM Centre a message
  57. 1210 LOCATE ROWS / 2, (COLS - LEN(SP$)) / 2: PRINT SP$
  58. 1220 RETURN
  59.  
  60. 1500 REM EkriirkE's Draw sprite at X, Y
  61. 1510 SCREEN , , 1: GOSUB 5010: PCOPY 1, 2: SCREEN , , 2
  62. 1520 IF Y < 1 OR Y >= ROWS OR X < 1 OR X >= COLS GOTO 1570
  63. 1530 SP$ = "(I)/T\": IF TIMER - UT < 1 THEN GOSUB 3010 ELSE TD = 0
  64. 1540 FOR J = 1 TO LEN(SP$) STEP 3
  65. 1550 COLOR INT(16 - J / 2): LOCATE INT(Y + J / 3), INT(X): PRINT MID$(SP$, J, 3);
  66. 1560 NEXT
  67. 1570 PCOPY 2, 0: SCREEN , , 0
  68. 1590 RETURN
  69.  
  70. 2500 REM EkriirkE's Draw stars+lunar surface, choose landing pad
  71. 2510 COLOR 8
  72. 2511 FOR Y = 1 TO ROWS / 1.5: FOR X = 1 TO COLS
  73. 2512 IF RND(1) < .1 / Y THEN LOCATE Y, X: PRINT "*": SOUND 5000 - Y * 100, .05
  74. 2513 NEXT: NEXT
  75.  
  76. 2520 DEEP = 4: WIDE = 3: COLOR 7
  77. 2530 Y = INT(RND(1) * DEEP) + 1: PC = 0: LX = 0
  78. 2540 FOR I = 1 TO COLS
  79. 2550 OY = Y
  80. 2560 IF PC = 0 THEN Y = Y + SGN(INT(RND(1) * 7 - 3))
  81. 2570 IF Y < 1 THEN Y = 1
  82. 2580 IF Y > DEEP THEN Y = DEEP
  83. 2590 IF LI + 1 = I AND Y = OY THEN GOTO 2550
  84. 2600 IF Y > OY THEN LOCATE ROWS - Y + 1: PRINT "/";  ELSE LOCATE ROWS - Y
  85. 2610 IF Y < OY THEN PRINT "\";
  86. 2620 IF Y = OY THEN PRINT "_"; : PC = PC + 1: IF PC >= WIDE THEN PC = 0: LI = I: IF LX = 0 OR RND(1) > .8 THEN LX = I - INT(WIDE / 2 + .5): LY = ROWS - Y - 1
  87. 2630 GOSUB 2700
  88. 2640 NEXT
  89. 2650 IF LX = 0 THEN LX = COLS / 1.5
  90. 2660 RETURN
  91. 2700 J = TIMER: WHILE TIMER - J < .05: WEND
  92. 2710 SOUND 40, .05
  93. 2720 RETURN
  94.  
  95.  
  96. 3000 REM Animate thrusters
  97. 3010 FC = FC + 1: IF FC > 3 THEN FC = 1
  98. 3020 IF TD = -2 THEN SP$ = SP$ + " " + MID$("VW^", FC, 1) + " "
  99. 3030 IF INT(X) < 2 OR INT(X) >= COLS - 4 THEN RETURN
  100. 3040 IF TD = 1 THEN LOCATE INT(Y) + 1, INT(X) - 1: COLOR 7: PRINT MID$(">=-", FC, 1)
  101. 3050 IF TD = -1 THEN LOCATE INT(Y) + 1, INT(X) + 3: COLOR 7: PRINT MID$("<=-", FC, 1)
  102. 3060 RETURN
  103.  
  104. 5000 REM Read keyboard, update HUD
  105. 5010 IF FUEL THEN K = ASC(RIGHT$(" " + INKEY$, 1)) OR 32
  106. 5020 IF K = 59 GOTO 999
  107. 5030 IF FUEL < 1 OR K <= 32 THEN K = 0
  108. 5040 IF K = 97 OR K = 107 THEN XV = XV - 1 / ITER: TD = -1
  109. 5050 IF K = 100 OR K = 109 THEN XV = XV + 1 / ITER: TD = 1
  110. 5060 IF K = 119 OR K = 104 THEN YV = YV - .5 / ITER: TD = -2
  111. 5070 REM IF K = 115 OR K = 112 THEN YV = YV + .5 / ITER: TD=2
  112. 5080 IF K THEN FUEL = FUEL - 10 / ITER: UT = TIMER
  113. 5090 IF TIMER - UT < 3 THEN FUEL = FUEL - 2 / ITER
  114. 5100 IF FUEL < 0 THEN FUEL = 0
  115.  
  116. 5120 LOCATE 2, COLS - 4: COLOR 7 - (INT(FUEL / 34) + 3): PRINT INT(FUEL)
  117. 5140 IF YV * ITER > 4 THEN COLOR 4 ELSE COLOR 2
  118. 5150 LOCATE 5, COLS - 4: PRINT CHR$(18) + STR$(INT(YV * ITER * 2)) + " "
  119. 5160 REM COLOR 7: LOCATE , COLS - 4: PRINT "=" + STR$(INT(XV * ITER)) + " "
  120. 5170 LOCATE 1, 1: COLOR 7: PRINT "MISSION TIME"; TIMER
  121. 5190 RETURN
Add Comment
Please, Sign In to add comment