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 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 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,,,2 SPRITE I PAL P NEXT I FOR I=17 TO 59 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 GOSUB RESET IRESET = FALSE ISTART = FALSE IEND = FALSE ISELECT = FALSE IOPTIONS = FALSE RESHOOT: XPOS(1)=64 YPOS(1)=112 SPRITE 1,XPOS(1),YPOS(1), AIMR=30 AIMA=PI*1.5 DDA=1 DDR=1 DO REM REM IF SPRITE HIT(1,2 TO 16) THEN REM ELSE REM GOTO SHOOT REM END IF REM END IF IF BUTTON(0,1) THEN PRIO 1 BG 1 PAL 5 LOCATE 0,0 PRINT "HOW TO PLAY" PRINT "LEFT/RIGH AIM" PRINT "UP/DOWN AIDING LINE" PRINT "A+LEFT/RIGHT = POS" PRINT "A+UP = SHOT" PRINT "B = HELP" REPEAT 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 DEC XPOS(1) IF RIGHT(0) AND XPOS(1)<108 THEN INC XPOS(1) IF UP(0) THEN IF SPRITE HIT(1,2 TO 16) THEN ELSE GOTO SHOOT END IF END IF ELSE IF UP(0) AND AIMR<40 THEN AIMR=AIMR+1 IF DOWN(0) AND AIMR>0 THEN AIMR=AIMR-1 IF RIGHT(0) THEN AIMA=AIMA+0.01 IF LEFT(0) THEN AIMA=AIMA-0.01 END IF REM SPRITE 1,XPOS(1),, SPRITE 1,XPOS(1)-4+16,, FOR I=17 TO 57 R=I-17 RR=R*4 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 XVEL(1)=COS(AIMA)*RR YVEL(1)=SIN(AIMA)*RR SPRITE OFF 17 TO 59 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,XPOS(I)-4+16,YPOS(I)-4, U = XVEL(I) V = YVEL(I) 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,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: PLAY 0,40,5 STAT(HIT)=0 IF HIT=1 THEN STAT(HIT)=1 XVEL(1)=0 YVEL(1)=0 ELSE IF HIT>2 AND HIT<10 THEN INC IGREEN XPOS(HIT)=0 YPOS(HIT)=12*IGREEN-8 XVEL(HIT)=0 YVEL(HIT)=0 SPRITE HIT,XPOS(HIT),YPOS(HIT), ELSE IF HIT>=10 AND HIT<=16 THEN INC IBROWN XPOS(HIT)=150 YPOS(HIT)=12*IBROWN-8 XVEL(HIT)=0 YVEL(HIT)=0 SPRITE HIT,XPOS(HIT),YPOS(HIT), END IF TRACE HIT,IGREEN,IBROWN RETURN #1:MAIN PALETTES 043F001500302000000C180000382400 00100400003F3F00003F2A15003F2A15 #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 #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