100 REM BASIC Week 3: Under the Sea 110 REM http://reddit.com/r/RetroBattlestations 120 REM written by FozzTexx 130 REM Apple II version by digarok 200 REM Clear screen and setup variables rem 210 ? CHR$(4)"PR #3" : HOME 210 home 220 COLS = PEEK(33):ROWS = 24:REM Columns and Rows of screen 230 GOSUB 2010:TU$ = SP$:TW = SC:TH = SR 240 TE$ = SE$:GOSUB 2010:TD$ = SP$ 250 FOR EE = 1 TO 3:GOSUB 2010:EN$(EE) = SP$ 260 ER$(EE) = SE$:EW(EE) = SC:NEXT EE 270 GOSUB 2010:GV$ = SP$:GW = SC:GH = SR 280 AM = 10:WV$ = "-_." 290 TY = 18:SF = 4:GOSUB 4100:PT = -10:GOSUB 4510 300 REM Play game 310 X = 1:Y = SF:GOSUB 1010 320 FOR I = 1 TO COLS:PRINT MID$(WV$, INT(RND(1) * 3) + 1, 1);:NEXT I 330 GOSUB 5140:GOSUB 6660:GOSUB 6140 340 LY = TY 350 FOR TX = 1 TO COLS - TW 360 IF LY <> TY THEN GOSUB 3510 370 GOSUB 5010:GOSUB 6510:GOSUB 6010 380 SP$ = TU$:X = TX:Y = TY:GOSUB 1510 390 LY = TY:GOSUB 2510 400 IF KE$ = "A" OR KE$ = "a" THEN D = -1:GOSUB 3010 410 IF KE$ = "Z" OR KE$ = "z" THEN D = 1: GOSUB 3010 420 IF KE$ = "Q" OR KE$ = "q" THEN END 430 IF TY = SF + 1 THEN GOTO 450 440 IF TX = (COLS / 4) OR TX = (COLS / 4) * 3 THEN GOSUB 4010 450 IF TY = SF + 1 AND AIR < AM THEN GOSUB 4100 460 NEXT TX 470 X = TX:SP$ = TE$:GOSUB 1510 480 GOTO 310 1000 REM Position cursor at X,Y 1010 VTAB 1:PRINT:HTAB X : VTAB Y 1020 RETURN 1500 REM Draw sprite in SP$ at X,Y 1510 IF Y < 1 OR Y > ROWS OR X < 1 OR X > COLS THEN RETURN 1520 REM Set the left margin to the X position 1530 VTAB Y - 1:HTAB X:POKE 32,X - 1:PRINT:PRINT SP$; 1540 POKE 32,0 1550 RETURN 2000 REM Load a sprite from DATA into SP$ 2010 SP$ = "":SE$ = "":SR = 0:SC = 0 2020 READ T$,S$:IF LEN(SP$) > 0 THEN SP$ = SP$ + CHR$(13) 2030 SP$ = SP$ + S$:SR = SR + 1:IF LEN(S$) > SC THEN SC = LEN(S$) 2040 BL$ = "":FOR I = 1 TO LEN(S$):BL$ = BL$ + " ":NEXT I 2050 IF LEN(SE$) > 0 THEN SE$ = SE$ + CHR$(13) 2060 SE$ = SE$ + BL$ 2070 IF T$ <> "SE" THEN GOTO 2020 2080 RETURN 2500 REM Read the keyboard 2510 KE$ = "" : IF PEEK(49152) > 127 THEN GET KE$ 2520 RETURN 3000 REM Player wants to move turtle up or down 3010 TY = TY + D 3020 IF TY <= SF THEN TY = SF + 1 3030 IF TY > ROWS - TH + 1 THEN TY = ROWS - TH + 1 3040 RETURN 3500 REM Turtle moved up or down, erase from previous line 3510 Y = LY:IF LY > TY THEN Y = Y + TH - 1 3520 X = TX:SP$ = TE$:GOSUB 1510 3530 RETURN 4000 REM Show remaining air 4010 AIR = AIR - 1:IF AIR < 0 THEN AIR = 0 4020 IF AIR > AM THEN AIR = AM 4030 X = COLS - 7 - AM:Y = 2:GOSUB 1010 4040 PRINT "Air: |"; 4050 FOR I = 1 TO AIR:PRINT "#";:NEXT I 4060 IF AIR < AM THEN FOR I = AIR + 1 TO AM:PRINT " ";:NEXT I 4070 PRINT "|"; 4080 IF AIR = 0 THEN GOTO 4110 4090 RETURN 4100 AIR = AM:GOTO 4030 4110 FOR I = TY to SF + 1 STEP -1 4120 X = TX:Y = I:SP$ = TD$:GOSUB 1510 4130 Y = Y + 1:SP$ = TE$:GOSUB 1510 4140 NEXT I 4150 X = (COLS - GW) / 2:Y = (ROWS - GH) / 2 4160 SP$ = GV$:GOSUB 1510 4170 X = 1:Y = ROWS - 2:GOSUB 1010 4180 END 4500 REM Display score 4510 PT = PT + 10:OX = X:OY = Y 4520 X = 3:Y = 2:GOSUB 1010:PRINT "Score: ";PT; 4540 X = OX:Y = OY:RETURN 5000 REM Take care of bubbles (NB = NumBubbles, BX/Y = BX/BY) 5010 FOR BB = 1 to NB 5020 IF INT(BY(BB)) <= SF THEN GOTO 5120 5030 NY = BY(BB) - (ROWS / COLS) 5040 X = BX(BB):Y = INT(BY(BB)) 5050 GOSUB 5510:IF Hit = 0 THEN GOTO 5080 5060 AIR = AIR + 2:IF Bubble$(BB) = "O" THEN AIR = AIR + 1 5070 GOSUB 4010:NY = ROWS + COLS 5080 IF INT(NY) = Y THEN GOTO 5110 5090 SP$ = " ":GOSUB 1510:SP$ = Bubble$(BB):Y = INT(NY) 5100 IF Y > SF THEN GOSUB 1510 5110 BY(BB) = NY 5120 NEXT BB 5130 RETURN 5140 NB = INT(RND(1) * 3) + 1:FOR BB = 1 to NB 5150 BX(BB) = INT(RND(1) * COLS) + 1:BY(BB) = ROWS - INT(RND(1) * 3) 5160 Bubble$(BB) = CHR$(79 + INT(RND(1) * 2) * 32) 5170 NEXT BB:RETURN 5500 REM Hit detection 5510 Hit = 0 5520 IF X < TX + TW - 2 THEN RETURN 5530 IF X > TX + TW + 1 THEN RETURN 5540 IF Y < TY - 1 THEN RETURN 5550 IF Y > TY + 1 THEN RETURN 5560 Hit = 1:RETURN 6000 REM Take care of enemies (NE = NumEnemies, EnemyX/Y/Hit = EX/EY/EH,) 6010 FOR EE = 1 to NE 6020 IF INT(EY(EE)) <= SF THEN GOTO 6120 6030 NX = EX(EE) + XV(EE):NY = EY(EE) + YV(EE) 6040 X = INT(EX(EE)):Y = INT(EY(EE)) 6050 IF EH(EE) = 1 THEN GOTO 6070 6060 GOSUB 5510:IF Hit = 1 THEN GOSUB 4010:EH(EE) = 1 6070 IF INT(NX) = X AND INT(NY) = Y THEN GOTO 6110 6080 SP$ = ER$(EC(EE)):GOSUB 1510 6090 SP$ = EN$(EC(EE)):X = INT(NX):Y = INT(NY) 6100 IF Y > SF THEN GOSUB 1510 6110 EX(EE) = NX:EY(EE) = NY 6120 NEXT EE 6130 RETURN 6140 FOR EE = 1 TO NE:SP$ = ER$(EC(EE)) 6150 X = INT(EX(EE)):Y = INT(EY(EE)):GOSUB 1510:NEXT EE 6160 NE = INT(RND(1) * 3) + 1:FOR EE = 1 to NE 6170 EX(EE)=INT(RND(1)*COLS)+1:EY(EE)=ROWS-INT(RND(1)*(ROWS - SF)) 6180 XV(EE) = RND(1):YV(EE) = RND(1) * ((ROWS - SF) / COLS) 6190 EC(EE) = INT(RND(1) * 3) + 1:EH(EE) = 0 6200 IF EX(EE) > COLS / 2 THEN XV(EE) = - XV(EE) 6210 IF EY(EE) > ROWS / 2 THEN YV(EE) = - YV(EE) 6220 NEXT EE:RETURN 6500 REM Take care of food (NF = NumFood, FoodX/Y = FX/FY) 6510 FOR FF = 1 to NF 6520 X = FX(FF):Y = INT(FY(FF)):GOSUB 5510 6530 IF Hit = 1 THEN GOSUB 4510:SP$ = " ":GOSUB 1510:FY(FF) = ROWS + COLS 6640 NEXT FF 6650 RETURN 6660 SP$=" ":FOR FF=1 TO NF:X = FX(FF):Y = FY(FF):GOSUB 1510:NEXT FF 6670 NF = INT(RND(1) * 3) + 1:FOR FF = 1 to NF 6680 FX(FF)=INT(RND(1) * COLS) + 1:FY(FF)=ROWS - INT(RND(1) * (ROWS - SF)) 6690 FD$(FF) = CHR$(120 + INT(RND(1) * 2)) 6700 X = FX(FF):Y = FY(FF):SP$ = FD$(FF):GOSUB 1510 6710 NEXT FF:RETURN 9000 DATA SP," _-%#%#}o" 9010 DATA SE," )" 9020 DATA SE," -OOOO}x" 9030 DATA SE,"^;;^" 9040 DATA SE,"<><" 9050 DATA SE,"$" 9060 DATA SP," _ _ __ _ __ _" 9070 DATA SP,"/ \ / \ |\ /| | / \ | | | | \" 9080 DATA SP,"| _ |_| | \/ | |-- * | | \ / |-- |_/" 9090 DATA SE,"\_/ | | | | |__ \_/ V |__ | \"