AyrA

"Under the sea" for Altair 8800 with VT100 terminal

Sep 16th, 2014
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QBasic 6.77 KB | None | 0 0
  1. 100 REM BASIC Week 3: Under the Sea
  2. 110 REM http://reddit.COM/r/RetroBattlestations
  3. 120 REM written by FozzTexx
  4. 130 REM Osborne One changes by ChartreuseK
  5. 140 REM Altair 8800 MBasic changes by AyrA_ch
  6.  
  7. 200 REM CLEAR SCREEN AND setup variables
  8. 210 PRINT CHR$(27)+"[2J"+CHR$(27)+"[0;0H";
  9. 220 COLS = 52:ROWS = 24 : REM Columns AND Rows of SCREEN
  10. 230 GOSUB 2010 : Turtle$ = SP$ : TurtleWidth = SC : TurtleHeight = SR
  11. 240 TurtleErase$ = SE$ : GOSUB 2010 : TurtleDead$ = SP$
  12. 250 FOR EE = 1 TO 3 : GOSUB 2010 : Enemy$(EE) = SP$
  13. 260 EnemyErase$(EE) = SE$ : EnemyW(EE) = SC : NEXT EE
  14. 270 GOSUB 2010 : GameOver$ = SP$ : GOWidth = SC : GOHeight = SR
  15. 280 AirMax = 10 : Sea$ = "-_."
  16. 290 TurtleY = 18 : Surface = 4 : GOSUB 4100 : Score = -10 : GOSUB 4510
  17.  
  18. 300 REM PLAY game
  19. 310 X = 1 : Y = Surface : GOSUB 1010
  20. 320 FOR I = 1 TO COLS : PRINT MID$(Sea$, INT(RND * 3) + 1, 1); : NEXT I
  21. 330 GOSUB 5140 : GOSUB 6660 : GOSUB 6140
  22. 340 LastY = TurtleY
  23. 350 FOR TurtleX = 1 TO COLS
  24. 360 IF LastY <> TurtleY THEN GOSUB 3510
  25. 370 GOSUB 5010 : GOSUB 6510 : GOSUB 6010
  26. 380 SP$ = Turtle$ : X = TurtleX : Y = TurtleY : GOSUB 1510
  27. 390 LastY = TurtleY : GOSUB 2510
  28. 400 IF KE$ = "A" OR KE$ = "a" THEN D = -1 : GOSUB 3010
  29. 410 IF KE$ = "Y" OR KE$ = "y" THEN D = 1 :  GOSUB 3010
  30. 420 IF KE$ = "Q" OR KE$ = "q" THEN END
  31. 430 IF TurtleY = Surface + 1 THEN GOTO 450
  32. 440 IF TurtleX = (COLS / 4) OR TurtleX = (COLS / 4) * 3 THEN GOSUB 4010
  33. 450 IF TurtleY = Surface + 1 AND Air < AirMax THEN GOSUB 4100
  34. 460 NEXT TurtleX
  35. 470 GOTO 310
  36.  
  37. 1000 REM Position cursor at X,Y
  38. 1010 PRINT CHR$(27)+"["+MID$(STR$(Y),2)+";"+MID$(STR$(X),2)+"H";
  39. 1020 RETURN
  40.  
  41. 1500 REM DRAW sprite in SP$ at X,Y
  42. 1510 SE = 1 : SB = 1
  43. 1520 IF X < 1 OR X > COLS OR Y < 1 OR Y > ROWS THEN RETURN
  44. 1530 SE = INSTR(SB, SP$, CHR$(10))
  45. 1540 IF SE = 0 THEN SE = LEN(SP$) + 1
  46. 1550 GOSUB 1010
  47. 1560 SL = SE - SB : IF SL + X - 1 > COLS THEN SL = COLS - X + 1
  48. 1570 PRINT MID$(SP$, SB, SL);
  49. 1580 IF SE >= LEN(SP$) THEN RETURN
  50. 1590 IF ASC(MID$(SP$, SE)) = 10 THEN SE = SE + 1
  51. 1600 SB = SE : Y = Y + 1 : GOTO 1520
  52.  
  53. 2000 REM Load a sprite from DATA into SP$
  54. 2010 SP$ = "" : SE$ = "" : SR = 0 : SC = 0
  55. 2020 READ T$,S$ : IF LEN(SP$) > 0 THEN SP$ = SP$ + CHR$(10)
  56. 2030 SP$ = SP$ + S$ : SR = SR + 1 : IF LEN(S$) > SC THEN SC = LEN(S$)
  57. 2040 BL$ = "" : FOR I = 1 TO LEN(S$) : BL$ = BL$ + " " : NEXT I
  58. 2050 IF LEN(SE$) > 0 THEN SE$ = SE$ + CHR$(10)
  59. 2060 SE$ = SE$ + BL$
  60. 2070 IF T$ <> "SE" THEN GOTO 2020
  61. 2080 RETURN
  62.  
  63. 2500 REM READ the keyboard
  64. 2510 KE$ = INKEY$
  65. 2520 RETURN
  66.  
  67. 3000 REM Player wants TO move turtle up OR down
  68. 3010 TurtleY = TurtleY + D
  69. 3020 IF TurtleY <= Surface THEN TurtleY = Surface + 1
  70. 3030 IF TurtleY > ROWS - TurtleHeight + 1 THEN TurtleY = ROWS - TurtleHeight + 1
  71. 3040 RETURN
  72.  
  73. 3500 REM Turtle moved up OR down, ERASE from previous LINE
  74. 3510 Y = LastY : IF LastY > TurtleY THEN Y = Y + TurtleHeight - 1
  75. 3520 X = TurtleX : SP$ = TurtleErase$ : GOSUB 1510
  76. 3530 RETURN
  77.  
  78. 4000 REM Show remaining air
  79. 4010 Air = Air - 1 : IF Air < 0 THEN Air = 0
  80. 4020 IF Air > AirMax THEN Air = AirMax
  81. 4030 X = COLS - 7 - AirMax : Y = 2 : GOSUB 1010
  82. 4040 PRINT "Air :  |";
  83. 4050 FOR I = 1 TO Air : PRINT "#"; : NEXT I
  84. 4060 IF Air < AirMax THEN FOR I = Air + 1 TO AirMax : PRINT " "; : NEXT I
  85. 4070 PRINT "|";
  86. 4080 IF Air = 0 THEN GOTO 4110
  87. 4090 RETURN
  88. 4100 Air = AirMax : GOTO 4030
  89. 4110 FOR I = TurtleY TO Surface + 1 STEP -1
  90. 4120 X = TurtleX : Y = I : SP$ = TurtleDead$ : GOSUB 1510
  91. 4130 Y = Y + 1 : SP$ = TurtleErase$ : GOSUB 1510
  92. 4140 NEXT I
  93. 4150 X = (COLS - GOWidth) / 2 : Y = (ROWS - GOHeight) / 2
  94. 4160 SP$ = GameOver$ : GOSUB 1510
  95. 4170 X = 1 : Y = ROWS - 2 : GOSUB 1010
  96. 4180 END
  97.  
  98. 4500 REM Display score
  99. 4510 Score = Score + 10 : OX = X : OY = Y
  100. 4520 X = 2 : Y = 2 : GOSUB 1010 : PRINT "Score :  ";Score
  101. 4540 X = OX : Y = OY : RETURN
  102.  
  103. 5000 REM Take care of bubbles
  104. 5010 FOR BB = 1 TO NumBubbles
  105. 5020 IF INT(BubbleY(BB)) <= Surface THEN GOTO 5120
  106. 5030 NewY = BubbleY(BB) - (ROWS / COLS)
  107. 5040 X = BubbleX(BB) : Y = INT(BubbleY(BB))
  108. 5050 GOSUB 5510 : IF Hit = 0 THEN GOTO 5080
  109. 5060 Air = Air + 2 : IF Bubble$(BB) = "O" THEN AIR = AIR + 1
  110. 5070 GOSUB 4010 : NewY = ROWS + COLS
  111. 5080 IF INT(NewY) = Y THEN GOTO 5110
  112. 5090 SP$ = " " : GOSUB 1510 : SP$ = Bubble$(BB) : Y = INT(NewY)
  113. 5100 IF Y > Surface THEN GOSUB 1510
  114. 5110 BubbleY(BB) = NewY
  115. 5120 NEXT BB
  116. 5130 RETURN
  117. 5140 NumBubbles = INT(RND * 3) + 1 : FOR BB = 1 TO NumBubbles
  118. 5150 BubbleX(BB) = INT(RND * COLS) + 1 : BubbleY(BB) = ROWS - INT(RND * 3)
  119. 5160 Bubble$(BB) = CHR$(79 + INT(RND * 2) * 32)
  120. 5170 NEXT BB : RETURN
  121.  
  122. 5500 REM Hit detection
  123. 5510 Hit = 0
  124. 5520 IF X < TurtleX + TurtleWidth - 2 THEN RETURN
  125. 5530 IF X > TurtleX + TurtleWidth + 1 THEN RETURN
  126. 5540 IF Y < TurtleY - 1 THEN RETURN
  127. 5550 IF Y > TurtleY + 1 THEN RETURN
  128. 5560 Hit = 1 : RETURN
  129.  
  130. 6000 REM Take care of enemies
  131. 6010 FOR EE = 1 TO NumEnemies
  132. 6020 IF INT(EnemyY(EE)) <= Surface THEN GOTO 6120
  133. 6030 NewX = EnemyX(EE) + EnemyXV(EE) : NewY = EnemyY(EE) + EnemyYV(EE)
  134. 6040 X = INT(EnemyX(EE)) : Y = INT(EnemyY(EE))
  135. 6050 IF EnemyHit(EE) = 1 THEN GOTO 6070
  136. 6060 GOSUB 5510 : IF Hit = 1 THEN GOSUB 4010 : EnemyHit(EE) = 1
  137. 6070 IF INT(NewX) = X AND INT(NewY) = Y THEN GOTO 6110
  138. 6080 SP$ = EnemyErase$(EnemyC(EE)) : GOSUB 1510
  139. 6090 SP$ = Enemy$(EnemyC(EE)) : X = INT(NewX) : Y = INT(NewY)
  140. 6100 IF Y > Surface THEN GOSUB 1510
  141. 6110 EnemyX(EE) = NewX : EnemyY(EE) = NewY
  142. 6120 NEXT EE
  143. 6130 RETURN
  144. 6140 FOR EE = 1 TO NumEnemies : SP$ = EnemyErase$(EnemyC(EE))
  145. 6150 X = INT(EnemyX(EE)) : Y = INT(EnemyY(EE)) : GOSUB 1510 : NEXT EE
  146. 6160 NumEnemies = INT(RND * 3) + 1 : FOR EE = 1 TO NumEnemies
  147. 6170 EnemyX(EE)=INT(RND*COLS)+1 : EnemyY(EE)=ROWS-INT(RND*(ROWS - Surface))
  148. 6180 EnemyXV(EE) = RND : EnemyYV(EE) = RND * ((ROWS - Surface) / COLS)
  149. 6190 EnemyC(EE) = INT(RND * 3) + 1 : EnemyHit(EE) = 0
  150. 6200 IF EnemyX(EE) > COLS / 2 THEN EnemyXV(EE) = - EnemyXV(EE)
  151. 6210 IF EnemyY(EE) > ROWS / 2 THEN EnemyYV(EE) = - EnemyYV(EE)
  152. 6220 NEXT EE : RETURN
  153.  
  154. 6500 REM Take care of food
  155. 6510 FOR FF = 1 TO NumFood
  156. 6520 X = FoodX(FF) : Y = INT(FoodY(FF)) : GOSUB 5510
  157. 6530 IF Hit = 1 THEN GOSUB 4510 : SP$ = " " : GOSUB 1510 : FoodY(FF) = ROWS + COLS
  158. 6640 NEXT FF
  159. 6650 RETURN
  160. 6660 SP$=" " : FOR FF=1 TO NumFood : X = FoodX(FF) : Y = FoodY(FF) : GOSUB 1510 : NEXT FF
  161. 6670 NumFood = INT(RND * 3) + 1 : FOR FF = 1 TO NumFood
  162. 6680 FoodX(FF)=INT(RND * COLS) + 1 : FoodY(FF)=ROWS - INT(RND * (ROWS - Surface))
  163. 6690 Food$(FF) = CHR$(120 + INT(RND * 2))
  164. 6700 X = FoodX(FF) : Y = FoodY(FF) : SP$ = Food$(FF) : GOSUB 1510
  165. 6710 NEXT FF : RETURN
  166.  
  167. 9000 DATA SP," _-%#%#|o"
  168. 9010 DATA SE,"       )"
  169. 9020 DATA SE,"  -OOOO|x"
  170. 9030 DATA SE,"^;;^"
  171. 9040 DATA SE,"<><"
  172. 9050 DATA SE,"$"
  173. 9060 DATA SP," _   _          __      _       __  _"
  174. 9070 DATA SP,"/ \ / \ |\  /| |       / \ | | |   | \"
  175. 9080 DATA SP,"| _ |_| | \/ | |--  *  | | \ / |-- |_/"
  176. 9090 DATA SE,"\_/ | | |    | |__     \_/  V  |__ | \"
Add Comment
Please, Sign In to add comment