1 MAXFILES=0:TIME=0 100 REM BASIC Week 3: Under the Sea 110 REM http://reddit.com/r/RetroBattlestations 120 REM written by FozzTexx 130 REM MSX version by Spanishone 210 CLS 220 CL=36:RW=23:LB=RW/CL:LC=RW+CL:LD=(CL/4):LE=LD*3 230 GOSUB 2010:TT$=SP$:TW=SC:TH=SR 240 TE$=SE$:GOSUB 2010:TD$=SP$ 245 REM enemies: 250 FOR EE=1 TO 3:GOSUB 2010:NM$(EE)=SP$ 260 EE$(EE)=SE$:EW(EE)=SC:NEXT 270 GOSUB 2010:GV$=SP$:GW=SC:GH=SR 280 AM=10:SE$="-_." 290 TY=18:SF=4:GOSUB 4100:SC=-10:GOSUB 4510 300 REM play game 310 X=0:Y=SF:GOSUB 1010 320 FOR I=1 TO CL:PRINT MID$(SE$,INT(RND(1)*3)+1,1);:NEXT 330 GOSUB 5140:GOSUB 6660:GOSUB 6140 340 LY=TY 350 FOR TX=1 TO CL 360 IF LY<>TY THEN GOSUB 3510 370 GOSUB 5010:GOSUB 6510:GOSUB 6010 380 SP$=TT$:X=TX:Y=TY:GOSUB 1510 390 LY=TY:KE$=INKEY$ 400 IF KE$="a" THEN D=-1:GOSUB 3010 410 IF KE$="z" THEN D= 1:GOSUB 3010 420 IF KE$="q" THEN END 430 IF TY=SF+1 THEN 450 440 IF TX= LD OR TX= LE THEN GOSUB 4010 450 IF TY=SF+1 AND AIRCL OR Y<1 OR Y>RW THEN RETURN 1530 IF MID$(SP$,SE,1)=CHR$(13) THEN 1540 1531 IF SE>LEN(SP$) THEN SE=0:GOTO 1540 1532 SE=SE+1:GOTO 1530 1540 IF SE=0! THEN SE=LEN(SP$)+1 1555 GOSUB 1010 1560 SL=SE-SB:IF SL+X-1>CL THEN SL=CL-X+1 1565 IF SL<0 THEN SL=0 1570 PRINT MID$(SP$,SB,SL); 1580 IF SE>= LEN (SP$) THEN RETURN 1590 IF MID$(SP$,SE,1)=CHR$(13) THEN SE=SE+1 1600 SB=SE:Y=Y+1:GOTO 1520 2000 REM load sprite 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 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$=INKEY$ 2520 RETURN 3000 REM player want to move up or down 3010 TY=TY+D 3020 IF TY<= SF THEN TY=SF+1 3030 IF TY> RW-TH+1 THEN TY=RW-TH+1 3040 RETURN 3500 REM "turtle moved up or down,erase 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=CL-10-AM:Y=2:GOSUB 1010 4040 PRINT "Air:!"; 4050 FOR I=1 TO AIR:PRINT "#";:NEXT 4060 IF AIR SF THEN GOSUB 1510 5110 BY(BB)=NY 5120 NEXT 5130 RETURN 5135 REM bubbles ini 5140 NB=INT(RND(1)*3)+1:FOR BB=1 TO NB 5150 BX(BB)=INT(RND(1)*CL)+1:BY(BB)=RW-INT(RND(1)*3) 5160 BU$(BB)="O":REM CHR$(79+INT(RND(1)*2)*136) 5170 NEXT :RETURN 5500 REM hit detection 5510 HIT=0! 5520 IF XTX+TW+1 THEN RETURN 5540 IF YTY+1 THEN RETURN 5560 HIT=1:RETURN 6000 REM take care of enemies 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$=EE$(EC(EE)):GOSUB 1510 6090 SP$=NM$(EC(EE)):X=INT(NX):Y=INT(NY) 6100 IF Y>SF THEN GOSUB 1510 6110 EX(EE)=NX:EY(EE)=NY 6120 NEXT 6130 RETURN 6140 FOR EE=1 TO NE:SP$=EE$(EC(EE)) 6150 X=INT(EX(EE)):Y=INT(EY(EE)):GOSUB 1510:NEXT 6160 NE=INT(RND(1)*3)+1:FOR EE=1 TO NE 6170 EX(EE)=INT(RND(1)*CL)+1:EY(EE)=RW-INT(RND(1)*(RW-SF)) 6180 XV(EE)=RND(1):YV(EE)=RND(1)*((RW-SF)/CL) 6190 EC(EE)=INT(RND(1)*3)+1:EH(EE)=0! 6200 IF EX(EE) >CL/2 THEN XV(EE)=-XV(EE) 6210 IF EY(EE) >RW/2 THEN YV(EE)=-YV(EE) 6220 NEXT :RETURN 6500 REM food 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)=LC 6640 NEXT 6650 RETURN 6660 SP$=" ":FOR FF=1 TO NF:X=FX(FF):Y=FY(FF):GOSUB 1510:NEXT 6670 NF=INT(RND(1)*3)+1:FOR FF=1 TO NF 6680 FX(FF)=INT(RND(1)*CL)+1:FY(FF)=RW-INT(RND(1)*(RW-SF)) 6690 F$(FF)="X":REM CHR$(88+INT (RND(1)*2)) 6700 X=FX(FF):Y=FY(FF):SP$=F$(FF):GOSUB 1510 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"