100 REM BASIC Week 3: Under the Sea 110 REM http://reddit.com/r/RetroBattlestations 120 REM written by FozzTexx 130 REM IBM PC version by FozzTexx 140 REM Has been spaghettitized to make it run faster 200 REM Clear screen and setup variables 210 CLS 220 COLS = 80:ROWS = 24:REM Columns and Rows of screen 230 GOSUB 2010:TURTLE$ = SP$:TURTLEWIDTH = SC:TURTLEHEIGHT = SR 240 TURTLEERASE$ = SE$:GOSUB 2010:TURTLEDEAD$ = SP$ 250 FOR EE = 1 TO 3:GOSUB 2010:ENEMY$(EE) = SP$ 260 ENEMYERASE$(EE) = SE$:ENEMYW(EE) = SC:NEXT 270 GOSUB 2010:GAMEOVER$ = SP$:GOWIDTH = SC:GOHEIGHT = SR 280 AIRMAX = 10:SEA$ = "-_." 290 TURTLEY = 18:SURFACE = 4:GOSUB 4100:SCORE = -10:GOSUB 4510 300 REM Play game 310 LOCATE SURFACE,1 320 FOR I = 1 TO COLS:PRINT MID$(SEA$, INT(RND * 3) + 1, 1);:NEXT 330 GOSUB 5140:GOSUB 6660:GOSUB 6140 340 LASTY = TURTLEY 350 FOR TURTLEX = 1 TO COLS-TURTLEWIDTH 360 IF LASTY <> TURTLEY THEN LOCATE LASTY,TURTLEX:PRINT USING "&";TURTLEERASE$; 370 FOR BB = 1 TO NUMBUBBLES 380 X = BUBBLEX(BB):Y = INT(BUBBLEY(BB)) 390 IF Y <= SURFACE OR Y > ROWS THEN GOTO 450 400 NEWY = BUBBLEY(BB) - (ROWS / COLS) 405 IF X < TURTLEX + TURTLEWIDTH - 2 OR X > TURTLEX + TURTLEWIDTH + 1 OR Y < TURTLEY - 1 OR Y > TURTLEY + 1 THEN GOTO 430 410 AIR = AIR + 2:IF BUBBLE$(BB) = "O" THEN AIR = AIR + 1 420 GOSUB 4010:NEWY = ROWS + COLS 430 IF INT(NEWY) <> Y THEN LOCATE Y,X:PRINT " ";:Y = INT(NEWY):IF Y > SURFACE AND Y <= ROWS THEN LOCATE Y,X:PRINT BUBBLE$(BB); 440 BUBBLEY(BB) = NEWY 450 NEXT 460 FOR FF = 1 TO NUMFOOD 470 X = FOODX(FF):Y = FOODY(FF) 480 IF X < TURTLEX + TURTLEWIDTH - 2 OR X > TURTLEX + TURTLEWIDTH + 1 OR Y < TURTLEY - 1 OR Y > TURTLEY + 1 THEN GOTO 500 490 LOCATE Y,X:PRINT " ";:FOODY(FF) = ROWS + COLS:GOSUB 4510 500 NEXT 510 FOR EE = 1 TO NUMENEMIES 520 X = INT(ENEMYX(EE)):Y = INT(ENEMYY(EE)):IF Y <= SURFACE OR Y > ROWS OR X < 1 OR X > COLS THEN GOTO 620 530 NEWX = ENEMYX(EE) + ENEMYXV(EE):NEWY = ENEMYY(EE) + ENEMYYV(EE) 550 IF ENEMYHIT(EE) = 1 THEN GOTO 580 560 IF X < TURTLEX + TURTLEWIDTH - 2 OR X > TURTLEX + TURTLEWIDTH + 1 OR Y < TURTLEY - 1 OR Y > TURTLEY + 1 THEN GOTO 570 570 GOSUB 4010:ENEMYHIT(EE) = 1 580 IF INT(NEWX) = X AND INT(NEWY) = Y THEN GOTO 610 590 LOCATE Y,X:PRINT ENEMYERASE$(ENEMYC(EE)); 600 Y = INT(NEWY):X = INT(NEWX):IF Y > SURFACE AND Y <= ROWS AND X > 0 AND X <= COLS THEN LOCATE Y,X:PRINT ENEMY$(ENEMYC(EE)); 610 ENEMYX(EE) = NEWX:ENEMYY(EE) = NEWY 620 NEXT 630 LOCATE TURTLEY,TURTLEX:PRINT USING "&";TURTLE$; 640 LASTY = TURTLEY:KE$ = INKEY$ 650 IF KE$ = "A" OR KE$ = "a" THEN D = -1:GOSUB 3010 660 IF KE$ = "Z" OR KE$ = "z" THEN D = 1: GOSUB 3010 670 IF KE$ = "Q" OR KE$ = "q" THEN END 680 IF TURTLEY > SURFACE + 1 AND TURTLEX = (COLS / 4) OR TURTLEX = (COLS / 4) * 3 THEN GOSUB 4010 690 IF TURTLEY = SURFACE + 1 AND AIR < AIRMAX THEN GOSUB 4100 700 NEXT TURTLEX 710 LOCATE TURTLEY,TURTLEX-1:PRINT USING "&";TURTLEERASE$; 720 GOTO 310 2000 REM Load a sprite from DATA into SP$ 2010 SP$ = "":SE$ = "":SR = 0:SC = 0:LAST = 0 2020 READ T$,S$:IF LAST = 0 THEN GOTO 2040 2030 SP$ = SP$ + CHR$(31):SE$ = SE$ + CHR$(31):FOR I = 1 TO LAST:SP$ = SP$ + CHR$(29):SE$ = SE$ + CHR$(29):NEXT 2040 SP$ = SP$ + S$:SR = SR + 1:LAST = LEN(S$):IF LAST > SC THEN SC = LAST 2050 BL$ = "":FOR I = 1 TO LAST:BL$ = BL$ + " ":NEXT:SE$ = SE$ + BL$ 2060 IF T$ <> "SE" THEN GOTO 2020 2070 RETURN 3000 REM Player wants to move turtle up or down 3010 TURTLEY = TURTLEY + D 3020 IF TURTLEY <= SURFACE THEN TURTLEY = SURFACE + 1 3030 IF TURTLEY > ROWS - TURTLEHEIGHT + 1 THEN TURTLEY = ROWS - TURTLEHEIGHT + 1 3040 RETURN 4000 REM Show remaining air 4010 AIR = AIR - 1:IF AIR < 0 THEN AIR = 0 4020 IF AIR > AIRMAX THEN AIR = AIRMAX 4030 LOCATE 2,COLS - 7 - AIRMAX 4040 PRINT "Air: |"; 4050 FOR I = 1 TO AIR:PRINT "#";:NEXT 4060 IF AIR < AIRMAX THEN FOR I = AIR + 1 TO AIRMAX:PRINT " ";:NEXT 4070 PRINT "|"; 4080 IF AIR = 0 THEN GOTO 4110 4090 RETURN 4100 AIR = AIRMAX:GOTO 4030 4110 FOR I = TURTLEY TO SURFACE + 1 STEP -1 4120 LOCATE I,TURTLEX:PRINT TURTLEDEAD$; 4130 LOCATE I+1,TURTLEX:PRINT USING "&";TURTLEERASE$; 4140 NEXT 4150 LOCATE (ROWS - GOHEIGHT) / 2,(COLS - GOWIDTH) / 2:PRINT USING "&";GAMEOVER$; 4170 LOCATE ROWS - 2,1 4180 END 4500 REM Display score 4510 SCORE = SCORE + 10:OX = X:OY = Y 4520 LOCATE 2,2:PRINT "Score: ";SCORE; 4540 X = OX:Y - OY:RETURN 5000 REM Setup bubbles 5140 NUMBUBBLES = INT(RND * 3) + 1:FOR BB = 1 TO NUMBUBBLES 5150 BUBBLEX(BB) = INT(RND * COLS) + 1:BUBBLEY(BB) = ROWS - INT(RND * 3) 5160 BUBBLE$(BB) = CHR$(79 + INT(RND * 2) * 32) 5170 NEXT:RETURN 6000 REM Setup enemies 6140 FOR EE = 1 TO NUMENEMIES 6150 X=INT(ENEMYX(EE)):Y = INT(ENEMYY(EE)):IF X > 0 AND X <= COLS AND Y > SURFACE AND Y <= ROWS THEN LOCATE Y,X:PRINT ENEMYERASE$(ENEMYC(EE)); 6155 NEXT 6160 NUMENEMIES = INT(RND * 3) + 1:FOR EE = 1 TO NUMENEMIES 6170 ENEMYX(EE)=INT(RND*COLS)+1:ENEMYY(EE)=ROWS-INT(RND*(ROWS - SURFACE)) 6180 ENEMYXV(EE) = RND:ENEMYYV(EE) = RND * ((ROWS - SURFACE) / COLS) 6190 ENEMYC(EE) = INT(RND * 3) + 1:ENEMYHIT(EE) = 0 6200 IF ENEMYX(EE) > COLS / 2 THEN ENEMYXV(EE) = - ENEMYXV(EE) 6210 IF ENEMYY(EE) > ROWS / 2 THEN ENEMYYV(EE) = - ENEMYYV(EE) 6220 NEXT:RETURN 6500 REM Setup food 6660 FOR FF=1 TO NUMFOOD:LOCATE FOODY(FF),FOODX(FF):PRINT " ";:NEXT 6670 NUMFOOD = INT(RND * 3) + 1:FOR FF = 1 TO NUMFOOD 6680 FOODX(FF)=INT(RND * COLS) + 1:FOODY(FF)=ROWS - INT(RND * (ROWS - SURFACE)) 6690 FOOD$(FF) = CHR$(120 + INT(RND * 2)) 6700 LOCATE FOODY(FF),FOODX(FF):PRINT FOOD$(FF); 6710 NEXT:RETURN 9000 DATA SP," _-%#%#}o" 9010 DATA SE," )" 9020 DATA SE," -OOOO}x" 9030 DATA SE,"^;;^" 9040 DATA SE,"<><" 9050 DATA SE,"$" 9060 DATA SE,"GAME * OVER"