100 REM === BASIC Month 3, Cannonball 110 REM === http://reddit.com/r/RetroBattlestations 120 REM === written by FozzTexx 130 REM === ZX Spectrum ASCII version by mattinx 200 REM === Clear the screen and setup variabls 210 CLS 220 LET CL=32: LET RW=21: REM Columns and Rows of screen 230 LET CA=45: LET CN=5: REM Angle and length of cannon 240 LET CX=5: LET PX=CL-5: LET SC=0: LET LV=3 250 RANDOMIZE 260 LET LA=0: LET PXI=0: LET BXI=0: LET BYI=0 300 REM === Play game 310 LET CV=INT (RND*15)+10: GO SUB 4010: GO SUB 2010 320 GO SUB 2510 330 IF K$="A" OR K$="a" OR K$="5" THEN LET CA=CA+5: IF CA>85 THEN LET CA=85 340 IF K$="Z" OR K$="z" OR K$="8" THEN LET CA=CA-5: IF CA<15 THEN LET CA=15 350 IF K$="Q" OR K$="q" THEN STOP 360 IF K$=" " THEN GO TO 410 370 GO SUB 1010 380 GO TO 320 400 REM === Fire! 410 LET LX=(CN+1)*COS ((360-CA)*PI/180): LET LY=(CN+1)*SIN ((360-CA)*PI/180) 420 LET BX=CX+LX: LET BY=RW+LY 430 GO SUB 1510 440 LET VX=CV*COS ((360-CA)*PI/180): LET VY=CV*SIN ((360-CA)*PI/180) 500 REM === Move player and animate ball 510 GO SUB 2510 520 IF K$="5" THEN LET PX=PX-1: IF PXCL-1 THEN LET PX=CL-1 540 GO SUB 2010 550 LET BX=BX+(VX/10): LET BY=BY+(VY/10): GO SUB 1510 560 LET VY=VY+2 570 IF BY=PX-1 AND IX<=PX+1 THEN LET SC=SC+10: GO TO 310 640 LET LV=LV-1: GO SUB 4010 650 IF LV<1 THEN LET P$="Game Over": LET X1I=INT ((CL-LEN P$)/2): LET Y1I=INT (RW/2): GO SUB 3510: STOP 660 GO TO 310 1000 REM === Draw Cannon 1010 LET P$="Angle: "+STR$ CA+" ": LET X1I=2: LET Y1I=2: GO SUB 3510 1030 IF CA=LA THEN RETURN 1040 LET LX=CN*COS ((360-LA)*PI/180): LET LY=CN*SIN ((360-LA)*PI/180) 1050 LET X1=CX: LET Y1=RW: LET X2=X1+LX: LET Y2=Y1+LY: LET P$=" ": GO SUB 3010 1060 LET LX=CN*COS ((360-CA)*PI/180): LET LY=CN*SIN ((360-CA)*PI/180) 1070 LET X2=X1+LX: LET Y2=Y1+LY: LET P$="%": GO SUB 3010 1080 LET LA=CA: RETURN 1500 REM === Draw ball 1510 LET X1I=INT BX: LET Y1I=INT BY: LET P$="o": GO SUB 3510 1520 IF BXI<>X1I OR BYI<>Y1I THEN LET X1I=BXI: LET Y1I=BYI: LET P$=" ": GO SUB 3510 1530 LET BXI=INT BX: LET BYI=INT BY 1540 RETURN 2000 REM === Draw Player 2010 LET P$="U": LET X1I=INT PX: LET Y1I=INT RW: GO SUB 3510 2020 IF PXI<>X1I THEN LET X1I=PXI: LET P$=" ": GO SUB 3510 2030 LET PXI=INT PX 2040 RETURN 2500 REM === Read the keyboad 2510 LET K$=INKEY$ 2520 RETURN 3000 REM === Plot a line 3010 LET X1I=INT X1: LET X2I=INT X2: LET Y1I=INT Y1: LET Y2I=INT Y2 3020 LET DXI=ABS (X2I-X1I): LET SXI=-1: IF X1IDYI THEN LET ERI=DXI 3050 LET ERI=ERI/2 3060 GO SUB 3510 3070 IF X1I=X2I AND Y1I=Y2I THEN RETURN 3080 LET E2I=ERI 3090 IF E2I>-DXI THEN LET ERI=ERI-DYI: LET X1I=X1I+SXI 3100 IF X1I=X2I AND Y1I=Y2I THEN RETURN 3110 IF E2ICL OR Y1I<1 OR Y1I>RW THEN RETURN 3520 PRINT AT Y1I-1,X1I-1;P$ 3540 RETURN 4000 REM === Show score/lives/velocity 4010 LET P$="Velocity: "+STR$ CV+" ": LET X1I=2: LET Y1I=1: GO SUB 3510 4020 LET P$="Score: "+STR$ SC: LET X1I=INT (CL/2): GO SUB 3510 4025 LET LVE=LV+3: IF LVE>6 THEN LET LVE=6 4030 LET P$=" UUU"(LV+1 TO LVE): LET X1I=CL-3: GO SUB 3510 4040 RETURN