' - - - - - P A R A M E T E R S - - - - - N=62 REPULSION=0.05 DRAG=0.05 FRICTION=0.001 GRAVITY=1 SURFACE_REPULSION=10 X_GRAVITY=0 Y_GRAVITY=1 MOVEMENT_SPEED=1 'BOUNDARIES BALL_SIZE=8 B_RI=159-BALL_SIZE B_LE=0 B_UP=0 B_LO=127-BALL_SIZE CHARACTER=127 ' - - - - - S E T U P - - - - - 'PHYSICS GLOBAL REPULSION,DRAG,FRICTION,GRAVITY,X_GRAVITY,Y_GRAVITY,SURFACE_REPULSION,MOVEMENT_SPEED GLOBAL B_RI,B_LE,B_UP,B_LO,CHARACTER GLOBAL VOICE_ VOICE_=0 DIM PX(N),PY(N),VX(N),VY(N) RANDOMIZE TIMER 'BALLS FOR I=0 TO N SPRITE I SIZE 0 PAL 5 PX(I)=RND(140) PY(I)=RND(100) NEXT I 'TERRAIN GLOBAL SCROLL_X,SCROLL_Y SCROLL_X=0 SCROLL_X=0 X=0 Y=0 LX=0 LY=0 CALL FULL_RENDER(INT(X),INT(Y)) TOUCHSCREEN ' - - - - - M A I N L O O P - - - - - 'COLLISION 'DETECTOR: USE A SPRITE WITH SPRITE HIT TO DETECT COLLISION ' : USE CELL.C TO GET THE STEEPNESS OF A SLOPE: ' - IF C>=16 AND C<=32 THEN SLOPE=(C MOD 16)*2 ' - SPRITE HIT WILL HANDLE THE AIR BLOCKS 'ACTUATOR: USE A FORCE INSTEAS OF VELOCITY CONTROL, JUST LIKE WITH THE BILLIARDS BALLS 'ALSO ADD A SPRITE MANAGER (TO SUB DRAW()) DO CALL TOUCH_INPUT(X,Y,MOVEMENT_SPEED) 'CALL INTERACTION(X_GRAVITY,Y_GRAVITY,GRAVITY) CALL PHYSICS (N,VX(),VY(),PX(),PY()) CALL DRAW (N,PX(),PY()) CALL DRAW_UPDATE(INT(X/8),INT(Y/8),LX,LY,21,17) SCROLL 0,X,Y SCROLL 1,X,Y WAIT VBL LOOP SUB TOUCH_INPUT(X,Y,M) IF TAP THEN 'ADD X,SGN(TOUCH.X-80)*8*2 'ADD Y,SGN(TOUCH.Y-64)*8*2 END IF IF TOUCH THEN ADD X,(TOUCH.X-80)*0.1*M ADD Y,(TOUCH.Y-64)*0.1*M END IF SCROLL_X=X SCROLL_Y=Y END SUB SUB DRAW(N,PX(),PY()) FOR I=0 TO N SPRITE I,PX(I)-SCROLL_X,PY(I)-SCROLL_Y,CHARACTER 'SPRITE I,PX(I),PY(I),CHARACTER NEXT I END SUB SUB INTERACTION(X,Y,M) X=(TOUCH.X-80)/160 Y=(TOUCH.Y-64)/128 CALL SCALE(X,M) CALL SCALE(Y,M) END SUB SUB PLAYSOUND(N,M) IF N=0 AND M>1 THEN PLAY VOICE_,60 SOUND 0 VOLUME VOICE_,MIN(15,M*2), ADD VOICE_,1,0 TO 3 END IF END SUB ' - - - - - B G R E N D E R I N G - - - - - SUB FULL_RENDER(X,Y) CALL RECT(X,Y,21,17) END SUB SUB DRAW_UPDATE(X,Y,LX,LY,W,H) DIM XP(5),YP(5) CALL X_SHAPE(XP(), X,LX, X+W,LX+W) CALL Y_SHAPE(YP(), Y,LY, Y+H,LY+H) FOR I=0 TO 5 STEP 2 CALL RECTANGLE(XP(I),YP(I),XP(I+1),YP(I+1)) NEXT I LX=X LY=Y END SUB SUB X_SHAPE(XP(), X,LX,X2,LX2) IF (X>=LX) THEN CALL DEFINE4(XP(), LX2,X2,X,LX2) ELSE CALL DEFINE4(XP(), X,LX,LX,X2) END IF XP(4)=XP(0) XP(5)=XP(1) END SUB SUB Y_SHAPE(YP(), Y,LY,Y2,LY2) IF (Y>=LY) THEN CALL DEFINE4(YP(), Y,LY2,LY2,Y2) ELSE CALL DEFINE4(YP(), LY,Y2,Y,LY) END IF YP(4)=YP(2) YP(5)=YP(3) END SUB SUB DEFINE4(P(),P0,P1,P2,P3) P(0)=P0 P(1)=P1 P(2)=P2 P(3)=P3 END SUB SUB RECTANGLE(X1,Y1,X2,Y2) CALL RECT(X1,Y1,X2-X1,Y2-Y1) END SUB SUB RECT(X,Y,W,H) FOR IX=0 TO W-1 FOR IY=0 TO H-1 CALL LAND(X+IX,Y+IY) NEXT IY NEXT IX END SUB ' - - - - - T E R R A I N G E N E R A T I O N - - - - - SUB LAND(X,Y) T=0 L=0 CALL GETCELL(X,Y,T,L) IF L THEN 'BORDER LINE D=0 CALL HOW_STEEP(X,D) FLIP D<0,0 PAL MAX(0,T-1) IF T=0 THEN CELL X,Y,MAX(0,MIN(7,ABS(D)*4))+16*L ELSE CELL X,Y,2 END IF ELSE PAL MAX(0,T-1) FLIP RND(1),RND(1) 'BG 1 CELL X,Y,T 'BG 0 END IF FLIP 0,0 PAL 0 END SUB SUB HOW_STEEP(X,D) Y1=0 Y2=0 CALL HILLS(X-0.5,Y1,0) CALL HILLS(X+0.5,Y2,0) 'CALL HILLS(X,Y1,0) 'CALL HILLS(X+1,Y2,0) D=Y2-Y1 END SUB SUB GETCELL(X,Y,T,L) Y1=0 FOR I=0 TO 4 CALL HILLS(X,Y1,I) IF Y<=Y1+1 THEN EXIT NEXT I L=(INT(Y)>=INT(Y1)) 'IF L THEN TRACE INT(Y)-INT(Y1) 'T=I-L T=I L=-L*(1+INT(Y)-INT(Y1)) END SUB SUB HILLS(X,Y,A) 'Y=A*100+(3*A+1)*SIN((A*A+5)*SIN(X))-(7*A*A+2)*SIN((4-A)*SIN(X)) Y=A*A*50+5+SIN((A*A+1)*0.2*X)*5+SIN(0.3*X)*5 END SUB ' - - - - - P H Y S I C S - - - - - SUB PHYSICS(N,VX(),VY(),PX(),PY()) FOR I=0 TO N FX=0 FY=0 CALL PHYSICS_LOOP(I,FX,FY,VX(I),VY(I),PX(I),PY(I),PX(),PY()) NEXT I END SUB SUB PHYSICS_LOOP(I,FX,FY,VX,VY,PX,PY,PX(),PY()) CALL FORCES (I,FX,FY,VX,VY,PX,PY,PX(),PY()) CALL MOTION ( FX,FY,VX,VY,PX,PY) 'CALL COLLISION(I,FX,FY,VX,VY,PX,PY) END SUB SUB FORCES(I,FX,FY,VX,VY,PX,PY,PX(),PY()) DX=VX DY=VY CALL UNIT_VECTOR(DX,DY) CALL FORCE(FX,VX,DX,X_GRAVITY,FRICTION,DRAG) CALL FORCE(FY,VY,DY,Y_GRAVITY,FRICTION,DRAG) CALL COLLISION_FORCE(I,FX,FY,VX,VY,PX,PY,PX(),PY()) END SUB SUB FORCE(F,V,D,MG,MF,MD) CALL GRAVITY(F,MG) CALL FRICTION(F,D,MF) CALL DRAG(F,V,MD) END SUB SUB GRAVITY(F,M) ADD F,M END SUB SUB FRICTION(F,D,M) ADD F,-D*M END SUB SUB DRAG(F,V,M) ADD F,-SGN(V)*MIN( M*V*V, MIN(ABS(V),100)) END SUB SUB MOTION(FX,FY,VX,VY,PX,PY) ADD VX,FX ADD VY,FY ADD PX,VX ADD PY,VY END SUB SUB COLLISION(I,FX,FY,VX,VY,PX,PY) CALL C_WALL(FX,VX,PX,B_LE,B_RI,SCROLL_X) CALL C_WALL(FY,VY,PY,B_UP,B_LO,SCROLL_Y) END SUB SUB C_WALL(F,V,P,B1,B2,S) IF P-SB2 THEN V=-ABS(V) END SUB SUB C_WALL_PUSH(F,V,P,B1,B2,S) IF P-SB2 THEN ADD F,MIN(-1,(B2-P+S)*0.05) END SUB SUB COLLISION_FORCE(I,FX,FY,VX,VY,PX,PY,PX(),PY()) CALL BOUNCE(I,FX,FY,VX,VY,PX,PY,PX(),PY(),REPULSION) CALL C_TERRAIN(I,FX,FY,VX,VY,PX,PY,SURFACE_REPULSION) CALL C_WALL_PUSH(FX,VX,PX,B_LE,B_RI,SCROLL_X) CALL C_WALL_PUSH(FY,VY,PY,B_UP,B_LO,SCROLL_Y) END SUB SUB BOUNCE(N,FX,FY,VX,VY,PX,PY,PX(),PY(),REPULSION) 'BOUNCE_L (LINEAR), BOUNCE_E (EXPONENTIAL) (SUBPROGRAM PARAMETERS ARE THE SAME) IF SPRITE HIT(N) THEN 'FOR I=0 TO UBOUND(PX) 'IF SPRITE HIT(N,I) THEN CALL BOUNCE_E(N,FX,FY,VX,VY,PX,PY,PX(),PY(),REPULSION) 'END IF 'NEXT I END IF END SUB SUB BOUNCE_L(I,FX,FY,VX,VY,PX,PY,PX(),PY(),M) 'BALL COLLISIONS WITH LINEAR REPULSIVE FORCE D=0 DX=PX-PX(HIT) DY=PY-PY(HIT) ADD FX,DX*M ADD FY,DY*M END SUB SUB BOUNCE_E(I,FX,FY,VX,VY,PX,PY,PX(),PY(),M0) 'BALL COLLISIONS WITH EXPONENTIAL REPULSIVE FORCE 'THE GRAVITATION FORMULA BUT NEGATIVE M=M0*4000 'M=-1 D=0 A=RND*2*PI DX=(PX-SPRITE.X(HIT))+COS(A)*10 DY=(PY-SPRITE.Y(HIT))+SIN(A)*10 CALL MAG_SQ(DX,DY,D) CALL INVERT(D) 'CONVERTOR: UNIT VECTOR (*SQR(D)), EXPONENTIAL (*D), AMOUNT (*M) 'IT'S CLAMPED AGAINST NUCLEAR FORCES C=SQR(D)*MIN(10,D*M) CALL PLAYSOUND(0,C) ADD FX,DX*C ADD FY,DY*C END SUB SUB C_TERRAIN(I,FX,FY,VX,VY,PX,PY,M) X=INT((PX+4)/8) Y=INT((PY+4)/8) C=CELL.C(X,Y) SPRITE 63,X*8-SCROLL_X,Y*8-SCROLL_Y,C F=CELL.A(X,Y) AND %00011000 SPRITE.A 63,4 OR F IF SPRITE HIT(63,I) THEN IF C>=16 AND C<=32 THEN SLOPE=(C MOD 16)*2*(1-2*(F/8)) DX=SLOPE DY=-8 CALL UNIT_VECTOR(DX,DY) ADD FX,DX*M ADD FY,DY*M ELSE ADD FY,-M END IF 'SPRITE I PAL 1 'ELSE 'SPRITE I PAL 5 END IF SPRITE OFF 63 END SUB ' - - - - - T O O L S - - - - - SUB UNIT_VECTOR(DX,DY) D=0 CALL MAG(DX,DY,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 ' - - - - - T R A S H B I N - - - - - SUB TRASH 'FROM SUB LAND(X,Y) 'D=0 'T=0 'CALL HILL_PITCH(X,D,0) 'PAL 3+(D<0)*2 'BG FILL X,0 TO X,31 CHAR 0 'CELL X,-D,1 'FOR I=0 TO 7 'TEXT X,I,MID$(STR$(D),I+1,1) 'NEXT I 'TRACE D 'BG 1 'CELL X,Y,32+MAX(0,MIN(8,ABS(D)*0.5)) 'BG 0 'FLIP X<0 XOR D<0,0 'CELL X,Y,2-(T=1)*(30+MAX(0,MIN(7,ABS(D)*4))) END SUB SUB HILL_PITCH(X,Y,A) 'Y=A*A*100+5 + SIN((A*A+1)*0.2* X )*5 + SIN(0.3* X )*5 'DERIVATIVE 'A=A*A*100+5 'B=(A*A+1)*0.2 'Y=A+ 5*SIN(B*X) + 5*SIN(0.3*X) 'Y'=0+ 5*COS(B*X) * (B*X) + 5*COS(0.3*X) * (0.3*X) 'Y'=5*(B*X)*COS(B*X) + 5*(0.3*X)*COS(0.3*X) B=(A*A+1)*0.2*X Y=5*B*COS(B) + 1.5*X*COS(0.3*X) END SUB 'CALL REFRESH(INT(X/8),INT(Y/8),LX,LY) SUB REFRESH(X,Y,LX,LY) DX=X-LX DY=Y-LY 'BX=X-(DX<0)*DY+DY 'BY=Y-(DY<0)*DX+DX IF DX>=0 THEN BX=X+20 PAL 3 ELSE BX=X-DX-1 DX=-DX PAL 4 END IF IF DY>=0 THEN BY=Y+16 PAL 3 ELSE BY=Y-DY-1 DY=-DY PAL 4 END IF 'CALL RECT(2+BX,2+Y,MIN(21,DX),11) 'CALL RECT(2+X,2+BY,15,MIN(17,DY)) CALL RECT(BX,Y,MIN(21,DX),17) CALL RECT(X,BY,21,MIN(17,DY)) 'CALL RECT(X,BY,MAX(0,21-DX),MIN(17,DY)) 'TRACE BX,Y,MIN(20,DX-1),16 'TRACE MIN(20,DX-1),MIN(16,DY-1) LX=X LY=Y PAL 0 END SUB #1:MAIN PALETTES 1F08042400382410002A1525002A1500 00302010000B0601003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 EB5EF56EBF6FFAB7FFBFFFFFF7BFFDFF F7DC76FBDF796BDF0823C91C20C79C20 8E3FE12AA14AFF6673EA5ED77EBD84DB 8E3FE12AA14AFF6673EA5ED77EBD84DB F7DC76FBDF796BDF0823C91C20C79C20 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000080C00000000000000000 000000008080C0E00000000000000000 000080808040A0E0000000000080C0C0 8080C0C0E0E0D048000000808080E0F0 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000F88F00000000000000F0 000000008020FC630000000040C0E0FC 000000E03098648300000000C060F8FC 80404030D0D4EEF0008080C068E8B0FF 6020B018D8CCE62B80C0C0E0E0B0F8FC 7030B898ACD636EB80C0E0E0F0F8F8BC D018888CC4E2B16DE0E0F0F0F89CCEFE 98E46450F6CBDA7CE0F8F8FCF8BCBDFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 80402010080402010000000000000000 80C0406020301C070000000000000000 C070180C060201010000000000000000 C0603010180C07010000000000000000 8081414362361C000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 071F3F7F7FFFFFFF0000000000000000 E0F8FCFEFEFFFFFF0000000000000000 020C1F35787ED77F0103010A07012885 50FC3EA78DD76F84F05CFE7FFFEFFF7F 000000008080C040000000008080C0C0 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000070000000000000000 00000000000000E00000000000000000 00000000000000000000000000000000 00000103070F1F3F0000000000000000 0F7FFFFFFFFFFFFF0000000000000000 F0FEFFFFFFFFFFFF0000000000000000 000080C0E0F0F8FC0000000000000000 00000000000000000000000000000000 FFFFFF7F7F3F1F070000000000000000 FFFFFFFEFEFCF8E00000000000000000 FAFEFDED7E3D3F12078102120142030D 358B5BCF9EBB2FBEFF7FFF7FFFEFFFDE C0C0C0C080800000C0C0C0C080800000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000101010000000000000000 1F3F7FFFFFFFFFFF0000000000000000 F8FCFEFFFFFFFFFF0000000000000000 00000000008080800000000000000000 3F7F7F7FFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FCFEFEFEFFFFFFFF0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 08000000000000000703000000000000 DC30000000000000BCF0000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 01010100000000000000000000000000 FFFFFFFFFF7F3F1F0000000000000000 FFFFFFFFFFFEFCF80000000000000000 80808000000000000000000000000000 FFFFFFFF7F7F7F3F0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFEFEFEFC0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 07000000000000000000000000000000 E0000000000000000000000000000000 00000000000000000000000000000000 3F1F0F07030100000000000000000000 FFFFFFFFFFFF7F0F0000000000000000 FFFFFFFFFFFFFEF00000000000000000 FCF8F0E0C08000000000000000000000 3C7EFEFEFEFE7C00000001010101023C #15:MAIN SOUND 3F00100013FF00001800846C003A0000 08006060000000002800303019FE0000 38002020000000003800505000000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 00404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 250F0000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000