'IMPORT THE EXPLOSION ICON FOR THE ENGINE AND FOR BLASTERS 'THIS ROCKET SIMULATOR USES VECTORS 'IN THIS PROGRAM A VECTOR CONCISTS OF TWO VARIABLES '- THE X PART OF THE VECTOR ENDS WITH X '- THE Y PART OF THE VECTOR ENDS WITH Y ABBREVIATIONS: 'F MEANS FORCE 'M MEANS MASS 'R MEANS RADIUS 'A MEANS ACCELERATION 'V MEANS VELOCITY 'C IS A CONSTANT 'G IS THE GRAVITATIONAL CONSTANT 'E MEANS EARTH GAMEPAD 1 BG SOURCE ROM(4) GLOBAL XE,YE,C,GRAVITY,M,RES2 START: 'DEFINE VARIABLES G=6.67384*10^(-11) ME=5.972*10^24 M=1000 C=G*ME*M C2=0.5*1.225*0.1 R=0.0001 POWER=1000 POWER2=20000 GRAVITY=10^(-12) DT=0.05 X=76 Y=408000 VX=0 VY=0 AX=0 AY=0 DIR=0.5*PI ATMOSPHERE=0 PLANET=0 FRX=0 FRY=0 FG=0 RES2=5 N=0 I=0 BG 1 'BG COPY 1,16,32,16 TO 0,0 'BG COPY 1,16,32,16 TO 0,16 CLS A=0 X=30 Y=30 DO 'ADD X,LEFT(1)-RIGHT(1) 'ADD Y,UP(1)-DOWN(1) ADD A,-0.05*(LEFT(0)-RIGHT(0)) DX=COS(A) DY=SIN(A) 'CALL ROCKET(X,Y,DX,DY,3,7) 'CALL SHAPED_ROCKET(X,Y,DX,DY,3,7) 'CALL ROCKET_FROM_FILE(X,Y,A,5) CALL ROCKET_FILE(X,Y,A,7) 'GRAVITATIONAL FORCE(FG) IF PLANET THEN 'FG=C/(Y*Y) FG=9.81*M*(Y>0) END IF 'THRUST FORCE (USER INPUT): 'ABSOLUTE (JOYSTICK) + DIRECTIONAL (BUTTONS) (USES A VECTOR PERPENDICULAR TO R) FTX=POWER*(LEFT(1)-RIGHT(1)) - POWER2*DX*(BUTTON(0,0)-BUTTON(0,1)) FTY=-POWER*( UP(1)- DOWN(1)) + POWER2*DY*(BUTTON(0,0)-BUTTON(0,1)) 'DRAG FORCE IF ATMOSPHERE THEN V=SQR(VX*VX+VY*VY) FR=C2*V*V FRX=-VX*FR/(V+0.00001) FRY=-VY*FR/(V+0.00001) END IF 'RESULTANT FORCE FX=FTX+FRX FY=FTY+FRY+FG 'ACCELERATION AX=FX/M AY=FY/M 'VELOCITY ADD VX,AX*DT ADD VY,AY*DT 'POSITION ADD X,VX*DT ADD Y,VY*DT 'DRAW SPRITES BG 1 'ALREADY COMMENTED OUT 'SPRITE 0,X,Y,73 'SPRITE 0,76,72,73 'SPRITE 0 PAL 1 SIZE 3 'SCROLL 1,X,-Y IF 0 THEN 'DRAW MAP IF Y<=100 THEN 'LOAD SURFACE BG COPY 0,0,32,3 TO 0,13 ELSE IF Y<50000 THEN BG COPY 1,16,32,16 TO 0,0 BG COPY 1,16,32,16 TO 0,16 ELSE IF Y>407980 AND Y<408236 AND X>-128 AND X<128 THEN 'SPACESHIP BG COPY 0,3,32,13 TO 0,0 BG TINT (X+76)\8 MOD 32,(70-Y)\8 MOD 32 TO (X+84)\8 MOD 32,(94-Y)\8 MOD 32 PAL 2 BGC=CELL.C((X+80)\8 MOD 32,(70-Y)\8 MOD 32) IF BGC<>0 AND BGC<>46 THEN BG 0 TEXT 2,15,"FAILED " BG 1 END IF IF INT(Y)=408070 AND INT(X)=4 THEN IF ABS(VY)>10 OR ABS(VX)>10 THEN BG 0 TEXT 2,15,"FAILED " BG 1 ELSE VX=0 VY=0 BG 0 TEXT 2,15,"CONGRATULATIONS" BG 1 END IF END IF ELSE CLS END IF 'ATMOSPHERE COLOR IF Y<12000 THEN PALETTE 0,11,,, ATMOSPHERE=-1 PLANET=-1 ELSE IF Y<50000 THEN PALETTE 0,6,,, ATMOSPHERE=-1 PLANET=-1 ELSE IF Y<80000 THEN PALETTE 0,1,,, ATMOSPHERE=-1 PLANET=-1 ELSE PALETTE 0,0,,, ATMOSPHERE=0 PLANET=0 FRX=0 FRY=0 FG=0 END IF BG 0 PAL 1 NUMBER 14,0,Y,6 NUMBER 14,1,X,6 BG 1 END IF WAIT VBL LOOP GOTO START SUB ROCKET1(X1,Y1,DX1,DY1,R,L) 'TRACE DX,DY DX=DX1*R DY=DY1*R B=L*0.5 X=X1+DX*B Y=Y1-DY*B SPRITE 0,X,Y,128 ADD X,-DX ADD Y,DY FOR I=0 TO L SPRITE I+1,X-DX*I,Y+DY*I,129 NEXT I SPRITE I+1,X-DX*I,Y+DY*I,130 SPRITE 2 PAL 2 SPRITE 6 PAL 2 SPRITE 9 PAL 2 END SUB SUB ROCKET(X1,Y1,DX1,DY1,R,L) DX=DX1*R DY=DY1*R B=L*0.5 X=X1+DX*B Y=Y1-DY*B SPRITE 0,X,Y,128 ADD X,-DX ADD Y,DY FOR I=0 TO L SPRITE I+1,X-DX*I,Y+DY*I,129 SPRITE I+1 PAL 5 NEXT I IF BUTTON(0,0) THEN SPRITE I+1,X-DX*I,Y+DY*I,130 ELSE SPRITE OFF I+1 END IF SPRITE 0 PAL 5 SPRITE 2 PAL 2 SPRITE 6 PAL 2 SPRITE 8 PAL 1 SPRITE 9 PAL 2 END SUB SUB SHAPED_ROCKET(X1,Y1,DX1,DY1,R,L) DX=DX1*R DY=DY1*R B=L*0.5 X=X1+DX*B Y=Y1-DY*B SPRITE 0,X,Y,74 ADD X,-DX ADD Y,DY FOR I=0 TO L 'S=INT(SIN(I*0.8)*2+4) S=INT(SIN(I*1)*2+4) CALL CLAMP(S,0,7) SPRITE I+1,X-DX*I,Y+DY*I,78-S*2 SPRITE I+1 PAL 5 SIZE 1 NEXT I IF BUTTON(0,0) THEN SPRITE I+1,X-DX*I,Y+DY*I,78 ELSE SPRITE OFF I+1 END IF SPRITE 0 PAL 5 SPRITE 2 PAL 2 SPRITE 6 PAL 2 SPRITE 8 PAL 1 SPRITE 9 PAL 2 END SUB SUB CLAMP(V,L,H) V=MIN(H,MAX(L,V)) END SUB 'SPRITE REGISTERS FILE SUB ROCKET_FROM_FILE(X,Y,A,F) S=SIZE(F) COPY ROM(F),S TO $FE00 S=S\4 M0=0 M1=0 M2=0 M3=0 CALL ROT_MATRIX(A-0.5*PI,M0,M1,M2,M3) FOR I=0 TO S XX=SPRITE.X(I)-20 YY=SPRITE.Y(I)-64 CALL MATRIX(XX,YY,M0,M1,M2,M3) SPRITE I,XX+X,YY+Y, NEXT I END SUB 'SPRITE SCENES FILE SUB ROCKET_FILE(X,Y,ANG,F) A=0 S=0 SCENE=0 CALL GET_ADDR (ROM(F),A,SCENE) CALL GET_TABLE(ROM(F),S,SCENE) COPY A,S*4 TO $FE00 M0=0 M1=0 M2=0 M3=0 A=ANG CALL ROT_MATRIX(A-0.5*PI,M0,M1,M2,M3) FOR I=0 TO S XX=SPRITE.X(I)-20 YY=SPRITE.Y(I)-64 CALL MATRIX(XX,YY,M0,M1,M2,M3) SPRITE I,XX+X,YY+Y, NEXT I END SUB SUB ROT_MATRIX(A,M00,M01,M10,M11) M00=COS(A) M01=SIN(A) M10=-M01 M11=M00 END SUB SUB MATRIX(X,Y,M00,M01,M10,M11) XX=X*M00+Y*M01 Y =X*M10+Y*M11 X=XX END SUB SUB GET_ADDR(A0,A,SCENE) A=A0+256 V=0 FOR I=0 TO SCENE-1 CALL GET_TABLE(A0,V,I) ADD A,V*4 'ADD A,SCENES(I) NEXT I END SUB SUB GET_TABLE(A,V,SCENE) V=PEEK(A+SCENE) END SUB SUB SET_TABLE(A,V,SCENE) POKE A+SCENE,V END SUB #1:MAIN PALETTES 002E1804002A1501003E383400252A25 0B2A1525003F2A15003F2A15003F0006 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000003C7EFFFFFFFF7E3C 0000000000000000187E7EFFFF7E7E18 0000000000000000003C7E7E7E7E3C00 000000000000000000183C7E7E3C1800 00000000000000000000183C3C180000 00000000000000000000001818000000 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 030F3F3F7F7FFFFF030F3F3F7F7FFFFF C0F0FCFCFEFEFFFFC0F0FCFCFEFEFFFF 00030F1F3F3F7F7F00030F1F3F3F7F7F 00C0F0F8FCFCFEFE00C0F0F8FCFCFEFE 0000030F1F1F3F3F0000030F1F1F3F3F 0000C0F0F8F8FCFC0000C0F0F8F8FCFC 00000001070F0F1F00000001070F0F1F 00000080E0F0F0F800000080E0F0F0F8 000000000107070F000000000107070F 0000000080E0E0F00000000080E0E0F0 00000000000103070000000000010307 000000000080C0E0000000000080C0E0 00000000000001030000000000000103 00000000000080C000000000000080C0 00000000000000010000000000000001 00000000000000800000000000000080 FFFF7F7F3F3F0F03FFFF7F7F3F3F0F03 FFFFFEFEFCFCF0C0FFFFFEFEFCFCF0C0 7F7F3F3F1F0F03007F7F3F3F1F0F0300 FEFEFCFCF8F0C000FEFEFCFCF8F0C000 3F3F1F1F0F0300003F3F1F1F0F030000 FCFCF8F8F0C00000FCFCF8F8F0C00000 1F0F0F07010000001F0F0F0701000000 F8F0F0E080000000F8F0F0E080000000 0F070701000000000F07070100000000 F0E0E08000000000F0E0E08000000000 07030100000000000703010000000000 E0C0800000000000E0C0800000000000 03010000000000000301000000000000 C080000000000000C080000000000000 01000000000000000100000000000000 80000000000000008000000000000000 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 0000000000000000187E7EFFFF7E7E18 00000000000000003C7EFFFFFFFF7E3C 301C59BEFD3A6C2C3C66E7C183C7563C #5:SPRITE REGISTERS 34554A4534584645345B4442345E4445 3461464534644A4534674A42346A4845 346D4441 #6:SPRITE SCENES V1 SP4CEBAR 3F3F0000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000034 554A4534584645345B4442345E444534 61464534644A4534674A42346A484534 6D444100000002000000000000000000 0000000000000000000000000000 #7:SPRITE SCENES V2 SP4CEBAR 09000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 34554A4534584645345B4442345E4445 3461464534644A4534674A42346A4845 346D4441