BG COPY 0,0,20,16 TO 0,0 SPRITE 1,30,108,64 SPRITE 2,70,108,64 SPRITE 1 SIZE 1 SPRITE 2 SIZE 1 FLIP 1,0 GAMEPAD 1 LL=0 RR=0 C_PREVIOUS=0 C_CIRCLE = 3 C_CIRCLE2 = 4 C_CIRCLE_SMALL= 16 C_VERTICAL = 5 C_HORIZONTAL = 6 C_CORNER = 7 C_DIAGONAL = 8 C_DIAGONAL2 = 9 GLOBAL C_VERTICAL, C_HORIZONTAL, C_CORNER, C_DIAGONAL, C_DIAGONAL2, C_CIRCLE, C_CIRCLE2 GLOBAL C_CIRCLE_SMALL,C_PREVIOUS DO PX=10 PY=10 VX=0 VY=0 SPRITE 0,PX,PY,2 DO 'L=PEEK($FF70) 'R=PEEK($FF71) 'PAD=PEEK($FF70) 'L=SGN(PAD AND %00001111) 'R=SGN(PAD AND %00110000) L=LEFT(0) OR BUTTON(0,0) R=RIGHT(0) OR BUTTON(0,1) CALL FLIPPERS (L,R,LL,RR) CALL PHYSICS(PX,PY,VX,VY,L,R) SPRITE 0,PX,PY, IF PY<-8 OR PY>128 THEN PLAY 3,40 SOUND 9 EXIT END IF WAIT VBL LOOP LOOP SUB FLIPPERS(L,R,LL,RR) IF L THEN IF LL=0 THEN PLAY 0,20 SOUND 4 LL=MIN(7,LL+1) ELSE LL=MAX(0,LL-1) END IF IF R THEN IF RR=0 THEN PLAY 1,20 SOUND 4 RR=MIN(7,RR+1) ELSE RR=MAX(0,RR-1) END IF SPRITE 1,,,64+LL*2 SPRITE 2,,,64+RR*2 END SUB SUB PHYSICS(PX,PY,VX,VY,L,R) GRAVITY=0.1 DRAG=0.01 FX= -DRAG*VX FY=GRAVITY -DRAG*VY ADD VX,FX ADD VY,FY CALL COLLISION(PX,PY,VX,VY,FX,FY,L,R) 'IF VY<0.1 THEN VY=0 ADD PX,VX ADD PY,VY END SUB SUB COLLISION(PX,PY,VX,VY,FX,FY,L,R) CX=PX+4 CY=PY+4 CALL PIXEL_TO_CELL(CX) CALL PIXEL_TO_CELL(CY) C=CELL.C(CX,CY) A=CELL.A(CX,CY) CXX=CX*8 CYY=CY*8 SPRITE 63, CXX,CYY, C SPRITE.A 63, A CALL COLLISION_HANDLERS(C,PX,PY,VX,VY,FX,A,L,R) SPRITE OFF 63 END SUB SUB COLLISION_HANDLERS(C,PX,PY,VX,VY,FX,A,L,R) FORCE=1 FORCE_SMALL=2 BOUNCE_EFFICIENCY=1 IF SPRITE HIT(63,0) THEN IF C=C_DIAGONAL2 THEN C=C_DIAGONAL 'TRACE C,C_PREVIOUS IF C<>C_PREVIOUS THEN FLX= 1-SGN(A AND %00001000) FLY= 1-SGN(A AND %00010000) IF C=C_VERTICAL THEN PLAY 2,40 SOUND 8 VX=-VX*BOUNCE_EFFICIENCY ELSE IF C=C_HORIZONTAL THEN PLAY 2,40 SOUND 8 'IF VY<0.5 THEN VY=0 VY=-VY*BOUNCE_EFFICIENCY ELSE IF C=C_CORNER THEN PLAY 2,40 SOUND 8 VX=-VX*BOUNCE_EFFICIENCY VY=-VY*BOUNCE_EFFICIENCY ELSE IF C=C_DIAGONAL THEN PLAY 2,40 SOUND 8 SWAP VX,VY IF FLX THEN VX=VX*BOUNCE_EFFICIENCY VY=-VY*BOUNCE_EFFICIENCY ELSE VX=-VX*BOUNCE_EFFICIENCY VY=-VY*BOUNCE_EFFICIENCY END IF ELSE IF C=C_CIRCLE OR C=C_CIRCLE2 THEN PLAY 2,60 SOUND 8 DX= PX - 7*FLX DY= PY - 7*FLY M=0 CALL UNIT_VECTOR2(DX,DY,M) ADD VX,DX*FORCE ADD VY,DY*FORCE ELSE IF C=C_CIRCLE_SMALL THEN PLAY 2,60 SOUND 8 DX= PX - 4 DY= PY - 4 M=0 CALL UNIT_VECTOR2(DX,DY,M) ADD VX,DX*FORCE_SMALL ADD VY,DY*FORCE_SMALL END IF END IF C_PREVIOUS=C ELSE C_PREVIOUS=0 END IF IF SPRITE HIT(0,1 TO 2) THEN IF (L AND HIT=1) OR (R AND HIT=2) THEN ADD VY,-5 END IF END IF END SUB SUB PIXEL_TO_CELL(P) P=INT(P*0.125) END SUB SUB UNIT_VECTOR(DX,DY) D=0 CALL MAG(DX,DY,D) CALL INVERT(D) DX=DX*D DY=DY*D END SUB SUB UNIT_VECTOR2(DX,DY,M) D=0 CALL MAG(DX,DY,D) M=D CALL INVERT(D) DX=DX*D DY=DY*D END SUB SUB SCALE(V,S) V=V*S END SUB SUB MAG(X,Y,M) M=SQR(X*X+Y*Y) END SUB SUB MAG_SQ(X,Y,D) D=X*X+Y*Y END SUB SUB INVERT(V) IF V<>0 THEN V=1/V ELSE V=0 END SUB SUB POLAR(I1,I2) 'A LITTLE BIT OF MATH TO GET AN ANGLE AND A LENGTH FROM A SET OF COORDINATES 'CONVERTS THE CARTESIAN (X,Y) TO THE POLAR (RADIUS,ANGLE) 'CODE EXPLANATION '1 SET A TO INPUT 1 '2 SET B TO INPUT 2 '3 I1 TO THE LENGTH OF THE VECTOR (PYTHAGORAS) '4 IF THE LENGTH VARIABLE (I1) SUPPORTS DIVISIONS '5 I2 TO THE ANGLE OF THE VECTOR: ATAN2 MADE WITH ACOS IN A UNIT CIRCLE AND SGN(B) (NOT 0) '6 IF THE LENGTH IS ZERO WE MAY AS WELL HAVE NO ANGLE AT ALL A=I1 B=I2 I1=SQR(A*A+B*B) IF I1>0 THEN I2=ACOS(MIN(1,MAX(-1,A/I1))) * (1+2*(B>=0)) ELSE I2=0 END IF END SUB SUB CARTHESIAN(I0,I1) I0=COS(I0)*I1 I1=SIN(I0)*I1 END SUB #1:MAIN PALETTES 003F2A15000F0B0700302010001F1B16 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 00384482828244380038448282824438 00183863030E7E181866469FFF7E7E18 071F3F7F7FFFFFFF071F3F7F7FFFFFFF 071E3F7D77E4FAAB071F3F7E7FFFEDFC A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 FF00FF0000000000FF00FF0000000000 FFFFFFE0E0E0E0E0FFFFFFE0E0E0E0E0 8040A0D068341A0D8040A0D068341A0D 06030100000000000603010000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 18665299BD526618187E6EE7C36E7E18 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 071E3F7D77E4FAAB071F3F7E7FFFEDFC E078FCFEF63F1FD7E0F8FC7EFEFFFF3E 071F3F7F7FFFFFFF071F3F7F7FFFFFFF E0F8FCFEFEFFFFFFE0F8FCFEFEFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 ABE9FC7F6C2F1F07FCFEFF7F7F371F07 D6D73DFA9EFC38E03F3FFFFE7EFCF8E0 FFFFFF7F7F3F1F07FFFFFF7F7F3F1F07 FFFFFFFEFEFCF8E0FFFFFFFEFEFCF8E0 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000060000000000040F09C 00000000000000000000000000000000 0000000000000060000000000060F89E 00000000000000000000000000000000 0000000000000060000000000060FC9F 00000000000000000000000000000080 0000000000000060000000000060FF9F 000000000000000000000000000080FF 0000000000000060000000000060FF9F 000000000000000700000000000FFFFF 0000000000000060000000000067FF9F 00000000030418600000021FFFFCF8E0 000000000000006100000001077FFF9F 000000030C18608000031FFFFCF8E080 0000000000000061000000030F7FFF9F 0001020418608000031F7EFCF8E08000 60C0300E010000009FFF3F0F01000000 0000000080700C030080E0F0FC7E0F03 60C03C03000000009FFF3F0300000000 000000E018060000C0F0FCFF1F060000 60FE6100000000009FFF610000000000 0000FC0300000000F8FFFF0300000000 609F6000000000009FFF600000000000 FE00000000000000FE00000000000000 60077800000000009FFF780000000000 F800000000000000F800000000000000 63047800000000009FFC780000000000 80000000000000008000000000000000 66087000000000009EF8700000000000 00000000000000000000000000000000 66087000000000009EF8700000000000 #3:MAIN BG 00001410070006000600060006000600 06000600060006000600060006000600 06000600060006000600070805000000 00000000000000000000000000001001 00000000000000000000100100000000 00000508050000000000000000000000 00000000000000000000100100000000 00000000000000000000050805000000 00000401040900000000100100000000 00000000000000000800000000000401 04090508050000000000041104190000 00000808000000000000000000000000 09000800000004110419050805000800 00000000000000000808090800000000 00000401040900000000090008000000 00000808050009000800000000000000 09080000000000000000041104190000 00000000090000000808090805000000 09000800000000000000000010010000 00000000000000000808000000000808 09080000050000000000090008000000 00000000000000000000000000000808 09080000080809080000000005000000 04010409000000000000000000000000 00000000080809080000080809080000 00000000080000000411041900000000 00000000000010010000000009080000 08080908000000000000000009000800 00000000100100000000000000000000 00000000000008080908000000000000 00000000000009000800000000000000 00000000000000000000000008080908 00000000000000000000000000000000 09000800000000000000000000000000 00000808090800000000000000000000 00000000000000000000090008000000 00000000000000000808090800000000 00000000000000000000000000000000 00000000090008000000000000000808 09080000000000000000000000000000 00000000 #15:MAIN SOUND 1800303A00FE00001800300018FE8000 1100300018FE00001800303019FE0000 320021F0180000003800505000000000 2800000F00FE00002800000F19FCF000 680E000F19FB10000800900006BA0000 4810000F160D0F00320002F118000000 6202F12F180FF00020002120180DF000 2100300018FE00002800400018FD8000