REM MATH FOR SOFT SHOT ADJUSTMENT REM PRINT COS(2*PI-1.5) REM 1.5=VERY SOFT REM 0.0=VERY HARD REM PRINT 40/26.5 REM END REM COLLISION SYSTEM CONVERTED BY TODDL REM POOL GAME ADAPTATION BY MRLEGOBOY REM ADAPTED FROM ORIGINAL TO NX BY WAS8BIT REM CAROMET GAME BY WAS8BIT REM AUTO-COMPLETITION OF BALL SPEED BY G-9 REM RECONFIGURE CONTROLS, ADDED HELP SCREEN, BY DAN GAMEPAD 1 PAUSE OFF FRIC =1 TRUE=-1 FALSE=0 XM=0 YM=0 STATE=0 DIM COL(15) COL(1) = 330 COL(2) = 003 COL(3) = 300 COL(4) = 102 COL(5) = 310 COL(6) = 020 COL(7) = 100 COL(8) = 111 COL(9) = 122 COL(10)= 333 COL(11)= 213 COL(12)= 123 COL(13)= 321 COL(14)= 112 COL(15)= 222 BG 1 BG COPY 0,0,20,16 TO 0,0 PAL 6 TEXT 4,0, "==CARROMET==" TEXT 5,15,"(B) STATUS" REM POCKET ZONES SPRITE 60,16,0,18 SPRITE 60 SIZE 1 PAL 4 SPRITE 61,128,0,20 SPRITE 61 SIZE 1 PAL 4 SPRITE 62,16,112,22 SPRITE 62 SIZE 1 PAL 4 SPRITE 63,128,112,24 SPRITE 63 SIZE 1 PAL 4 REM BALLS FOR I=1 TO 16 IF I=1 THEN P=0 IF I=2 THEN P=1 IF I>=3 AND I<=9 THEN P=2 IF I>=10 THEN P=3 SPRITE I+41,,,2 SPRITE I+41 PAL P NEXT I REM AIMING LINE FOR I=1 TO 41 SPRITE I,,,13 NEXT I RANDOMIZE TIMER DIM ROTX(16),STAT(16) DIM HWALLX(3,1) DIM HWALLY(3) DIM VWALLX(3) DIM VWALLY(3,1) DIM BALLS(16, 2) DIM XPOS(16) DIM YPOS(16) DIM ONTABLE(16) DIM XVEL(16) DIM YVEL(16) MBALL = 16 NBALL = 16 DIM SX(16),SY(16) FOR I=1 TO 16 READ SX(I),SY(I) NEXT I DATA 76,120,64,64 DATA 64,56,71,68,57,68,72,52,79,64,64,81,50,55 DATA 71,60,64,73,57,60,64,48,78,73,56,77,49,64 GW = 128 GH = 128 START: REM GRAVITY, FRICTION AND ATTRACTION TO MOUSE GRAV = 0.0 FRIC = 1 FOLLOW = 0 ATTRACT = 0 DT = 2 REM TIMESTEP (SPEED) SHAPE = 0 REM 0:BALL,1 SQUARE ELASTIC = 1 REM 1 FULLY ELASTIC COLLISIONS REM INITIALISE SOME BALLS RADIUS = 4 DIAM = 2*RADIUS REM NBALL = INT(GW/DIAM) ISTART = TRUE ROUND: IGREEN=0 IBROWN=0 ICOLOR$="-----" GOSUB RESET IRESET = FALSE ISTART = FALSE IEND = FALSE ISELECT = FALSE IOPTIONS = FALSE RESHOOT: XPOS(1)=64 YPOS(1)=112 SPRITE 42,XPOS(1),YPOS(1), AIMR=30 AIMA=PI*1.5 DDA=1 DDR=1 DSHIT=0.1 DOW=0.1 DANG=0.001 IDSHIT=0 IDANG=0 IDOW=0 DO IF BUTTON(0,1) THEN PRIO 1 BG 0 PAL 5 TEXT 3,0,"COLOR = "+ICOLOR$+" " TEXT 3,1,"SCORE = 0 " TEXT 3,13,"L,R,U,D= AIM " TEXT 3,14,"(A)+L,R= SLIDE" TEXT 3,15,"(A)+UP = SHOOT" REPEAT WAIT VBL UNTIL BUTTON(0,1)=0 CLS 0 BG 0 PRIO 0 END IF IF BUTTON(0,0) THEN IF LEFT(0) AND XPOS(1)>20 THEN XPOS(1)=XPOS(1)-DSHIT INC IDSHIT IF IDSHIT>10 THEN DSHIT=1 ELSE IF RIGHT(0) AND XPOS(1)<108 THEN XPOS(1)=XPOS(1)+DSHIT INC IDSHIT IF IDSHIT>10 THEN DSHIT=1 ELSE IDSHIT=0 DSHIT=0.1 END IF IF UP(0) THEN IF SPRITE HIT(1,2 TO 16) THEN PLAY 0,10,1 ELSE GOTO SHOOT END IF END IF ELSE IF UP(0) AND AIMR<40 THEN AIMR=AIMR+DOW INC IDOW IF IDOW>10 THEN DOW=1 ELSE IF DOWN(0) AND AIMR>0 THEN AIMR=AIMR-DOW INC IDOW IF IDOW>10 THEN DOW=1 ELSE IDOW=0 DOW=0.1 END IF IF RIGHT(0) THEN AIMA=AIMA+DANG INC IDANG IF IDANG>10 THEN DANG=0.01 ELSE IF LEFT(0) THEN AIMA=AIMA-DANG INC IDANG IF IDANG>10 THEN DANG=0.01 ELSE IDANG=0 DANG=0.001 END IF END IF REM SPRITE 42,XPOS(1),, SPRITE 42,XPOS(1)-4+16,, FOR I=1 TO 41 R=I-1 RR=R*4 RSPEED=COS(2*PI-((40-AIMR)/26.5)) TRACE RSPEED IF R<=AIMR THEN SPRITE I,XPOS(1)-4+16+3+RR*COS(AIMA),YPOS(1)+3+RR*SIN(AIMA),13 ELSE SPRITE OFF I END IF NEXT I WAIT VBL LOOP SHOOT: PLAY 0,90,1 RR=RR/45 RGO=RR*RSPEED XVEL(1)=COS(AIMA)*RGO YVEL(1)=SIN(AIMA)*RGO SPRITE OFF 1 TO 41 WHILE TRUE IF SPRITE HIT(60) THEN GOSUB SINK IF SPRITE HIT(61) THEN GOSUB SINK IF SPRITE HIT(62) THEN GOSUB SINK IF SPRITE HIT(63) THEN GOSUB SINK IF IOPTIONS THEN IOPTIONS = FALSE END IF ENERGY = 0.0 ISCOLLISION = FALSE FOR I = 1 TO NBALL GOSUB UPDATE IF STAT(I)=1 THEN SPRITE I+41,XPOS(I)-4+16,YPOS(I)-4, U = XVEL(I) V = YVEL(I) IF STAT(I)=1 THEN ENERGY = ENERGY+(U*U+V*V) NEXT I ENERGY = DT*DT*ENERGY ENERGY = INT(ENERGY*2500) IF ENERGY=0 THEN GOTO RESHOOT IF (IRESET) THEN GOSUB RESET IRESET = FALSE END IF IF (ISTART) THEN GOTO START END IF IF (IEND) THEN END END IF WAIT VBL WEND STATE = STATE + 1 REM UPDATE BALL POSITIONS UPDATE: IF STAT(I)=1 THEN U = XVEL(I) V = YVEL(I) U = MIN(100,MAX(U,-100)) V = MIN(100,MAX(V,-100)) X = XPOS(I)+DT*U Y = YPOS(I)+DT*V GOSUB BOUNCE GOSUB GRAVITY GOSUB COLLISION XPOS(I) = X YPOS(I) = Y END IF RETURN REM CHECK FOR EDGE BOUNCES BOUNCE: IF STAT(I)=1 THEN IF (X < RADIUS) THEN XVEL(I) = -XVEL(I) X = RADIUS END IF IF (X > GW-RADIUS) THEN XVEL(I) = -XVEL(I) X = GW-RADIUS END IF IF (Y < RADIUS) THEN YVEL(I) = -YVEL(I) Y = RADIUS END IF IF (Y > GH-RADIUS) THEN YVEL(I) = -YVEL(I) Y = GH-RADIUS END IF END IF RETURN REM CHECK FOR COLLISIONS COLLISION: REM ONLY CHECK EACH PAIR ONCE FOR J = I+1 TO NBALL XI = X YI = Y XJ = XPOS(J) YJ = YPOS(J) DX = XI-XJ DY = YI-YJ DIST = SQR(DX*DX+DY*DY) IF (DIST < DIAM) THEN ISCOLLISION = TRUE REM GET BALL VECTORS UI = XVEL(I) VI = YVEL(I) UJ = XVEL(J) VJ = YVEL(J) REM MOVE BACKWARDS (FORWARDS IF DT < 0) IN TIME UNTIL BALLS ARE JUST TOUCHING COEFA = (UI-UJ)*(UI-UJ)+(VI-VJ)*(VI-VJ) COEFB = 2*((UI-UJ)*(XI-XJ)+(VI-VJ)*(YI-YJ)) COEFC = (XI-XJ)*(XI-XJ)+(YI-YJ)*(YI-YJ)-DIAM*DIAM IF (COEFA = 0) THEN T = -COEFC/(COEFB+0.0001) ELSE IF (DT >= 0) THEN T = (-COEFB-SQR(COEFB*COEFB-4*COEFA*COEFC))/(2*COEFA) ELSE T = (-COEFB+SQR(COEFB*COEFB-4*COEFA*COEFC))/(2*COEFA) END IF END IF XI = XI+T*UI YI = YI+T*VI XJ = XJ+T*UJ YJ = YJ+T*VJ REM CENTRE OF MOMENTUM COORDINATES MX = (UI+UJ)/2 MY = (VI+VJ)/2 UI = UI-MX VI = VI-MY UJ = UJ-MX VJ = VJ-MY REM NEW CENTRE TO CENTRE LINE DX = XI-XJ DY = YI-YJ DIST = SQR(DX*DX+DY*DY) DX = DX/(DIST+0.0001) DY = DY/(DIST+0.0001) REM REFLECT BALLS VELOCITY VECTORS IN CENTRE TO CENTRE LINE OB = -(DX*UI+DY*VI) UI = UI+2*OB*DX VI = VI+2*OB*DY OB = -(DX*UJ+DY*VJ) UJ = UJ+2*OB*DX VJ = VJ+2*OB*DY REM BACK TO MOVING COORDINATES WITH ELASTIC VELOCITY CHANGE E = SQR(ELASTIC) UI = E*(UI+MX) VI = E*(VI+MY) UJ = E*(UJ+MX) VJ = E*(VJ+MY) REM MOVE TO NEW BOUNCED POSITION XI = XI-T*UI YI = YI-T*VI XJ = XJ-T*UJ YJ = YJ-T*VJ REM SET VELOCITIES XVEL(I) = UI YVEL(I) = VI XVEL(J) = UJ YVEL(J) = VJ REM SET POSITION XPOS(J) = XJ YPOS(J) = YJ X = XI Y = YI REM CLICK REM SOUND 0,5,1,5 REM INSIDE POCKET SOUND 1,RND*24,1,11 END IF NEXT J RETURN REM GRAVITY AND FRICTION AND FOLLOW MOUSE GRAVITY: XM = 0 XY = 0 DIST = XM*XM+YM*YM DIST = MAX(DIST,RADIUS*RADIUS) U = XVEL(I) V = YVEL(I) FRICSCALE = (1-FRIC/SQR(1+U*U+V*V)) FRICSCALE =0.97 XVEL(I) = FOLLOW*XM/DIST+FRICSCALE*U YVEL(I) = FOLLOW*YM/DIST+FRICSCALE*V+GRAV RETURN REM RESET NEW BALLS RESET: FOR I = 1 TO NBALL BALLS(I, 1) = 0 BALLS(I, 2) = 0 IF (ISTART OR I > NBALL) THEN XPOS(I) = 0 YPOS(I) = 0 XVEL(I) = 0 YVEL(I) = 0 END IF NEXT I FOR I = 1 TO NBALL STAT(I)=1 BALLS(I, 1) = DIAM BALLS(I, 2) = INT(RND * 15) + 1 IF (ISTART OR I > MBALL) THEN XPOS(I)=SX(I) YPOS(I)=SY(I) IF XPOS(I)=0 THEN XPOS(I)=32+RND(70) YPOS(I)=8 END IF SPRITE I+41,XPOS(I)-4+16,YPOS(I)-4, XVEL(I)=0.01 YVEL(I)=0.01 END IF NEXT I RETURN ROTATE3D: NEWX = X*COS(Q)-Y RETURN RESETBALLS: POSX(1)= 64 POSY(1)= 64 RETURN SINK: HH=HIT-41 PLAY 0,40,5 STAT(HH)=0 IF HH=1 THEN STAT(HH)=1 XVEL(1)=0 YVEL(1)=0 ELSE IF HH>2 AND HH<10 THEN IF ICOLOR$="-----" THEN ICOLOR$="GREEN" INC IGREEN XPOS(HH)=0 YPOS(HH)=12*IGREEN-8 XVEL(HH)=0 YVEL(HH)=0 SPRITE HIT,XPOS(HH),YPOS(HH), ELSE IF HH>=10 AND HH<=16 THEN IF ICOLOR$="-----" THEN ICOLOR$="BROWN" INC IBROWN XPOS(HH)=150 YPOS(HH)=12*IBROWN-8 XVEL(HH)=0 YVEL(HH)=0 SPRITE HIT,XPOS(HH),YPOS(HH), END IF TRACE HH,IGREEN,IBROWN RETURN #1:MAIN PALETTES 043F001500302000000C080000382400 0010040000013F0000080415003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000000000000000000000000000 003C7E7E7E7E3C003C4281818181423C FFC3BDBDBDBDC3FF813C7E7E7E7E3C81 FF000000000000FFFF000000000000FF 81818181818181818181818181818181 3F4080808080403F3F4080808080403F FC020101010102FCFC020101010102FC 818181818181423C818181818181423C 3C428181818181813C42818181818181 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 80402010080402018040201008040201 01020408102040800102040810204080 80000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0718234F579BBDBE00071F3F377B7D7E E018C4F2EAD9BDFD00E0F8FCECDEBEFE 0000030F1F1F3F3F0000030F1F1F3F3F 0000C0E0F0F0E0E00000C0E0F0F0E0E0 000003070F0F0707000003070F0F0707 0000C0F0F8F8FCFC0000C0F0F8F8FCFC 000000000C1F3F3F000000000C1F3F3F 000000000000C0C0000000000000C0C0 00000000000003030000000000000303 0000000030F8FCFC0000000030F8FCFC 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 BFBD9B574F2318077F7D7B373F1F0700 7DBDD9EAF2C418E07EBEDEECFCF8E000 3F3F1F0C000000003F3F1F0C00000000 C0C0000000000000C0C0000000000000 03030000000000000303000000000000 FCFCF83000000000FCFCF83000000000 3F3F1F1F0F0300003F3F1F1F0F030000 E0E0F0F0E0C00000E0E0F0F0E0C00000 07070F0F0703000007070F0F07030000 FCFCF8F8F0C00000FCFCF8F8F0C00000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 804020110A040B12804020110A040B12 0739C101020202860739C10102020286 E01C0300808080C1E01C0300808080C1 010204885020D048010204885020D048 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 212040404080818F212040404080818F 66B6DE6E363AFCFC66B6DE6E363AFCFC C6CDFBF6ECDF3F00C6CDFBF6ECDF3F00 840402020281F10F840402020281F10F 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 F08F814040402021F08F814040402021 00FCFB376FDFB36300FCFB376FDFB363 3F3F5C6C767B6D663F3F5C6C767B6D66 F181010202020484F181010202020484 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 120B040A11204080120B040A11204080 8301010100C038078301010100C03807 6140404080839CE06140404080839CE0 48D020508804020148D0205088040201 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000FFFFFFFFFFFFFFFF 0018181818001800FFE7E7E7E7FFE7FF 006C6C2400000000FF9393DBFFFFFFFF 00247E24247E2400FFDB81DBDB81DBFF 00083E380E3E0800FFF7C1C7F1C1F7FF 0062640810264600FF9D9BF7EFD9B9FF 001C34386E643A00FFE3CBC7919BC5FF 0018183000000000FFE7E7CFFFFFFFFF 000C183030180C00FFF3E7CFCFE7F3FF 0030180C0C183000FFCFE7F3F3E7CFFF 000024187E182400FFFFDBE781E7DBFF 000018187E181800FFFFE7E781E7E7FF 0000000018183000FFFFFFFFE7E7CFFF 000000007E000000FFFFFFFF81FFFFFF 0000000000181800FFFFFFFFFFE7E7FF 00060C1830604000FFF9F3E7CF9FBFFF 003C666E76663C00FFC399918999C3FF 0018381818187E00FFE7C7E7E7E781FF 003C660C18307E00FFC399F3E7CF81FF 003C660C06663C00FFC399F3F999C3FF 0066667E06060600FF999981F9F9F9FF 007E607C06067C00FF819F83F9F983FF 001C307C66663C00FFE3CF839999C3FF 007E060C18303000FF81F9F3E7CFCFFF 003C663C66663C00FFC399C39999C3FF 003C663E06663C00FFC399C1F999C3FF 0000001800180000FFFFFFE7FFE7FFFF 0000001800183000FFFFFFE7FFE7CFFF 00000C1830180C00FFFFF3E7CFE7F3FF 0000007E007E0000FFFFFF81FF81FFFF 000030180C183000FFFFCFE7F3E7CFFF 003C660C18001800FFC399F3E7FFE7FF 003C666E6E603C00FFC39991919FC3FF 00183C667E666600FFE7C399819999FF 007C667C66667C00FF839983999983FF 003C666060663C00FFC3999F9F99C3FF 00786C66666C7800FF879399999387FF 007E607860607E00FF819F879F9F81FF 007E607860606000FF819F879F9F9FFF 003C606E66663C00FFC39F919999C3FF 0066667E66666600FF999981999999FF 003C181818183C00FFC3E7E7E7E7C3FF 001E060606663C00FFE1F9F9F999C3FF 00666C78786C6600FF999387879399FF 0060606060607E00FF9F9F9F9F9F81FF 0042667E7E666600FFBD9981819999FF 0066767E6E666600FF998981919999FF 003C666666663C00FFC399999999C3FF 007C667C60606000FF8399839F9F9FFF 003C66666A6C3E00FFC399999593C1FF 007C667C786C6600FF839983879399FF 003E603C06067C00FFC19FC3F9F983FF 007E181818181800FF81E7E7E7E7E7FF 0066666666663C00FF9999999999C3FF 00666666663C1800FF99999999C3E7FF 0066667E7E664200FF9999818199BDFF 00663C183C666600FF99C3E7C39999FF 0066663C18181800FF9999C3E7E7E7FF 007E0C1830607E00FF81F3E7CF9F81FF 003C303030303C00FFC3CFCFCFCFC3FF 006030180C060200FF9FCFE7F3F9FDFF 003C0C0C0C0C3C00FFC3F3F3F3F3C3FF 00183C6600000000FFE7C399FFFFFFFF 0000000000007E00FFFFFFFFFFFF81FF #3:MAIN BG 000014100A010A011004110400000000 00000000000000000000000000000000 00000000100411040A010A010A010A01 20042104060404040404040404040404 04040404040404040404070420042104 0A010A010A010A01000009040B040000 00000000000000000000000000000000 00000C04090400000A010A010A010A01 0000050400000B040000000000000000 00000000000000000C04000005040000 0A010A010A010A010000050400000000 0B040000000000000000000000000C04 00000000050400000A010A010A010A01 000005040000000000000B0400000000 000000000C0400000000000005040000 0A010A010A010A010000050400000000 00000000400441044204430400000000 00000000050400000A010A010A010A01 00000504000000000000000050045104 52045304000000000000000005040000 0A010A010A010A010000050400000000 00000000600461046204630400000000 00000000050400000A010A010A010A01 00000504000000000000000070047104 72047304000000000000000005040000 0A010A010A010A010000050400000000 00000C0400040004000000000B040000 00000000050400000A010A010A010A01 00000504000000000C04000000000000 0000000000000B040000000005040000 0A010A010A010A010000050400000C04 00000000000000000000000000000000 0B040000050400000A010A010A010A01 000008040C0400000000000000000000 000000000000000000000B0408040000 0A010A010A010A011004110406040404 04040404040404040404040404040404 04040704100411040A010A010A010A01 20042104000000000000000000000000 00000000000000000000000020042104 0A010A01