'CHUNK-LOADING LIBRARY FOR NX BACKGROUNDS 'EACH CHUNK HAS A SIZE OF 8X8 CELLS '4X4 CHUNKS FIT INSIDE A 32X32 CELL BACKGROUND '3X3 CHUNKS WILL BE VISIBLE AT ANY TIME 'DIAGONAL LOADING LOADS 7 CHUNKS 'NON-DIAGONAL LOADING LOADS 4 CHUNKS 'THIS VERSION CAN'T LOAD NEGATIVE CHUNKS 'WHAT DO YOU WANT TO LOAD IN CHUNKS: '- TYPE=0: A BG FILE FROM MEMORY '- TYPE=1: A TEXT FILE FROM THE TXT$ ARRAY '- TYPE=2: A COMPACT BACKGROUND FILE TYPE FOR LARGE CUSTOM LEVELS OR MAPS (NOT MADE (YET)) '- TYPE=3: PROCEDURALLY GENERATED TERRAIN (NOT INCLUDED (YET)) '- TYPE=4: PROCEDURALLY GENERATED PLATFORMS (NOT MADE (YET)) 'OR YOU COULD JUST MAKE YOUR OWN SOURCE 'SET THE TYPE HERE: TYPE=2 'SET THE ADDRESS TO LOAD A BACKGROUND FILE FROM ADDR=ROM(3) 'DEFINE YOUR TEXT FILE HERE: DATA "HELLO WORLD THIS IS A TEST, HOW MANY CHARACTERS IS THIS" DATA "I THINK THERE ARE QUITE A LOT OF CHARACTERS IN HERE" DATA "IS IT HARD TO DISPLAY TEXT?" DATA "///" 'THIS CODE READS THE TEXT DATA AND STORES IT INSIDE THE TXT$ ARRAY DIM GLOBAL TXT$(99) I=-1 REPEAT INC I READ TXT$(I) UNTIL TXT$(I)="///" TXT$(I)="" 'RASTERFX TO ZOOM OUT VERTICALLY TO SEE ALL 32 VERTICAL CELLS (DEBUGGING TOOL) 'ON RASTER CALL RASTERFX 'CODE SETUP GAMEPAD 1 DIM GLOBAL COL(7) DIM GLOBAL SHIFTREG(3) LX=0 LY=0 X=30 Y=0 X1=0 Y1=0 VX=0 VY=0 VX1=0 VY1=0 MX=0 MY=0 XB=0 YB=0 DIM GLOBAL MAPRAM(1,4) MAPRAM(0,4)=4 'VARIABLES FROM ORBIT SIMULATOR 'THIS ORBIT 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 'IF THIS IS AT THE END OF A VARIABLE: 'E MEANS EARTH 'M MEANS MOON GLOBAL XE,YE,XM,YM,CM,CE,GRAVITY,M,RES2,FG 'DEFINE VARIABLES G=6.67384*10^(-11) ME=5.972*10^24 MM=7.35*10^22 M=1 CE=G*ME*M CM=G*MM*M R=0.0001 'SCALE CHANGES GRAVITY, DT, STARTING VELOCITY, AND POWER 'TO KEEP THE SPEED THE SAME WHILE CHANGING THE SCALE SCALE=0 'GRAVITY=10^(-12+SCALE) 'SCALE THE FORCES CE=CE*GRAVITY CM=CM*GRAVITY DT=0.2*0.3^SCALE 'POWER P1=10/(DT*DT) P2=3/(DT*DT) XE=80 YE=60 XM=20 YM=60 'SET THE CORRECT STARTING VELOCITY RX=0 RY=0 DX=0 DY=0 ANG=0 VR=0 'LOAD THE FIRST 16 CHUNKS FOR J=0 TO 3 FOR I=0 TO 3 CALL LOADCHUNK(I*8,J*8,ADDR,TYPE,1) NEXT I NEXT J BG 1 BG COPY 0,0,20,16 TO 0,0 BG 0 GLOBAL GRAVITY,DRAG,FRICTION,RESIST,POWER,POWER2,VEHICLE,SMOOTHNESS GRAVITY=0.1 DRAG=0.01 FRICTION=0.2 RESIST=DRAG 'RESIST=1 POWER=0.2 POWER2=0.2 VEHICLE=1 BORDER=35 W=7 H=6 SMOOTHNESS=16 UB=BORDER DB=128-BORDER-W LB=BORDER RB=160-BORDER-H S0=0 S1=2*ABS(VEHICLE=1)+8*ABS(VEHICLE=2) DIM GLOBAL SATTELITES(15,6) 'MAINLOOP: DO IF BUTTON TAP(0,1) THEN ADD VEHICLE,1,0 TO 2 SPRITE OFF S1=2*ABS(VEHICLE=1)+8*ABS(VEHICLE=2) END IF 'CALL RESPACE CALL MOVEMENT(LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,W,H,DX,DY,ANG,VR,S0,S1) 'CALL MOVEMENT(LB,RB,UB,DB,VX1,VY1,MX,MY,X1,Y1,XB,YB,W,H,DX,DY,ANG,VR,S0,S1) IF XB OR YB THEN CALL CHECKCHUNK(MX,MY,LX,LY,ADDR,TYPE,1+2*(VX<0)) SCROLL 0,MX,MY CALL PLAYER(X,Y,VEHICLE,DX,DY) WAIT VBL LOOP 'TO DO 'X WORK ON COLLISION: MAKE IT CHECK FOR MULTIPLE SPRITES, KEEP THE COLLISION BOX 'X MAKE THE IN-CELL COLLISION WAS8BIT SPRITE-BASED 'X MAKE THE MOVEMENT SYSTEM AVAILABLE FOR MULTIPLE OBJECTS (TWO WHEELS, FOR THE CAR) '- MAKE A SPACE SOURCE (PLANETS: CIRCLES WITH X,Y,R,R_ORBIT,VR_ORBIT), ARRAY FOR PLANETS ' - SCHEMATIC MENU IS SPRITE-BASED: PLANETS MOVE, CAMERA CAN ZOOM ' - LIBRARY OF PLANET CHARACTERS, ALL IN DIFFERENT SIZES (WITH TEXTURE) ' - PATH CAN BE DRAWN ON BG WITH PRESET-LINE CHARACTERS ' - PATH IS CALCULATED FOR A FIXED NUMBER OF ITERATIONS ' - MAYBE IT COULD HAVE A TRAIL TO MAKE THE PATH ROUND ' (PATH WOULD OVERWRITE THE TRAIL) ' - ROCKET MENU HAS THE ROCKET SPRITE, A SPACESHIP WOULD BE DRAWN ON THE BACKGROUND '- MAKE ALL THE ADVENTURE ENGINE FEATURES WORK '- CLEAN UP CODE '- EXPLAIN CODE (AND MAKE IT LOOK ORGANIZED) '- TURN THIS INTO ADVENTURE ENGINE (MAYBE CLONE THE PROJECT) '... '- ADD THE GUN SYSTEM SUB RESPACE 'SATTELITES(ID,TYPE) 'X,Y,XM,YM,R,RO,VRO FOR I=0 TO UBOUND(SATTELITES,1) SATTELITES(I,0)=SATTELITES(I,2)+SATTELITES(I,5)*COS(TIMER*SATTELITES(I,6)) SATTELITES(I,1)=SATTELITES(I,3)+SATTELITES(I,5)*SIN(TIMER*SATTELITES(I,6)) NEXT I END SUB SUB PLAYER(X,Y,T,DX,DY) IF T=0 THEN SPRITE 0,X,Y,63 SPRITE 0 PAL 7 ELSE IF T=1 THEN CALL CAR(X,Y,DX,DY,16) ELSE IF T=2 THEN CALL ROCKET(X,Y,DX,DY,3,7) END IF END SUB 'M O V E M E N T SUB MOVEMENT(LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,W,H,DX,DY,ANG,VR,S0,S1) UDX=LEFT(0)-RIGHT(0) UDY=UP(0)-DOWN(0) 'R O T A T I O N IF VEHICLE=1 OR VEHICLE=2 THEN ADD VR,-0.002*(UDX*ABS(VEHICLE=2))-SGN(VR)*DRAG*(VR*VR)*10 ADD ANG,VR DX=COS(ANG) DY=SIN(ANG) END IF 'F O R C E S FX=0 FY=0 'SPACE GRAVITY 'CALL GFORCE(X,Y,XM,YM,CM,RX,RY,R,FX,FY) 'CALL GFORCE(X,Y,XE,YE,CE,RX,RY,R,FX,FY) 'THRUST (USER INPUT) 'ABSOLUTE (JOYSTICK) + DIRECTIONAL (BUTTONS) ADD FX,POWER*UDX*ABS(VEHICLE<>2) - POWER2*DX*(BUTTON(0))*ABS(VEHICLE=2) ADD FY,POWER*UDY*ABS(VEHICLE<>2) + POWER2*DY*(BUTTON(0))*ABS(VEHICLE=2) 'RESISTANCE ADD FX,-SGN(VX)*RESIST*VX*VX ADD FY,-SGN(VY)*RESIST*VY*VY 'SURFACE GRAVITY ADD FY,GRAVITY 'VELOCITY ADD VX,FX/M ADD VY,FY/M 'MOON 'XM=60*COS(TIMER*0.005)+78 'YM=60*SIN(TIMER*0.005)+58 'C O L L I S I O N 'CELL COLLISION: R=1 -> NO COLLISION R=0 -> COLLISION 'MAYBE NOT ALL FOUR HAVE TO BE CHECKED EACH LOOP R=1 IF VX<>0 THEN 'HORIZONTAL CALL COLLISION(MX+VX,MY,R,W,H,MX,MY,X,Y,VR,S0,S1) 'IF X BUMPS THEN THE X VELOCITY IS CONVERTED TO NEGATIVE Y VELOCITY ADD VY,ABS(VX)*(R=0)*0.5 VX=VX*R END IF IF VY<>0 THEN 'VERTICAL CALL COLLISION(MX,MY+VY,R,W,H,MX,MY,X,Y,VR,S0,S1) 'IF Y BUMPS THEN THE Y VELOCITY IS SET TO 0 VY=VY*R END IF IF VY>1 THEN RESIST=-FRICTION*(R=0)-DRAG*(R<>0) VY=VY*ABS(VY<0 OR R=1) ELSE 'GROUND CALL COLLISION(MX,MY+1,R,W,H,MX,MY+1,X,Y,VR,S0,S1) 'IF WE TOUCH THE GROUND THEN WE HAVE FRICTION RESIST=-FRICTION*(R=0)-DRAG*(R<>0) VY=VY*ABS(VY<0 OR R=1) END IF 'CLIP CALL COLLISION(MX,MY,R,W,H,MX,MY,X,Y,VR,S0,S1) 'IF WE ARE CONTINUOUSLY BUMPING (CLIPPING), THEN WE SHOULD ESCAPE UPWARDS 'VX=VX*-(R<>0) VY=VY*-(R<>0)+(R=0) VR=VR*-(R<>0) 'M A P S C R O L L 'MAP-SCROLL-REQUEST BOOL X AND Y XB= SGN(VX)=(XRB) YB= SGN(VY)=(YDB) 'MAP SCROLL SMOOTHNESS (SHOULD BE BETWEEN 0 AND 1) IF XB THEN OX=((XRB)*(X-RB))/SMOOTHNESS ELSE OX=0 IF YB THEN OY=((YDB)*(Y-DB))/SMOOTHNESS ELSE OY=0 'NOTE: IF XB OR YB THEN WE'RE GOING TO CHECK IF LOADING NEW CHUNKS IS NECCESSARY (EXTERNAL 'SMOOTHLY SPLIT VX AND VY OVER MAP SCROLL AND CHARACTER SPRITE MOVEMENT ADD MX,VX*OX ADD MY,VY*OY ADD X,VX*(1-OX) ADD Y,VY*(1-OY) END SUB 'G R A V I T A T I O N A L F O R C E S SUB GFORCE(X,Y,X0,Y0,C,RX,RY,R,FGX,FGY) 'CALCULATE RADIUS BETWEEN PLANET (XE,YE) AND SATELLITE (X,Y) USING VECTOR LENGTH RX=X0-X RY=Y0-Y R=SQR(RX*RX+RY*RY) 'CALCULATE GRAVITATIONAL FORCE (FG) FG=C/(R*R) 'DECOMPOSE FG USING UNIFORMITY ADD FGX,RX*FG/R ADD FGY,RY*FG/R END SUB 'R O C K E T S P R I T E 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,131 ADD X,-DX ADD Y,DY FOR I=0 TO L SPRITE I+1,X-DX*I,Y+DY*I,132 SPRITE I+1 PAL 2 NEXT I IF BUTTON(0) THEN SPRITE I+1,X-DX*I,Y+DY*I,133 ELSE SPRITE OFF I+1 END IF SPRITE 0 PAL 2 SPRITE 2 PAL 6 SPRITE 6 PAL 6 SPRITE 8 PAL 4 SPRITE 9 PAL 6 END SUB 'C A R S P R I T E SUB CAR(X,Y,DX,DY,L1) L=0.5*L1 SPRITE 0,X-DX*L,Y-DY*L,133 SPRITE 1,X+DX*L,Y+DY*L,133 SPRITE 2,X,Y-2,1 SPRITE 0 PAL 0 SPRITE 1 PAL 0 SPRITE 2 PAL 0 END SUB '=================== ' C O L L I S I O N '=================== 'C O L L I S I O N B O X SUB COLLISION(X1,Y1,R1,W,H,MX,MY,X2,Y2,VR,S0,S1) 'THIS COLLISION BOX IS INSPIRED BY TIMO'S MAP SCROLLING XP=X1+X2 YP=Y1+Y2 R1=1 FOR I=S0 TO S1 STEP 1-(VEHICLE=2) R=1 'THE STEP 2 IS TO INCREASE PERFORMANCE X=X1+SPRITE.X(I) Y=Y1+SPRITE.Y(I) CALL COLL(X ,Y ,R,MX,MY,S0,S1) CALL COLL(X+W,Y ,R,MX,MY,S0,S1) CALL COLL(X ,Y+H,R,MX,MY,S0,S1) CALL COLL(X+W,Y+H,R,MX,MY,S0,S1) I=I*ABS(I<>S1-1) + S1*ABS(I=S1-1) IF R=0 THEN 'FIGURE OUT IF WE GOTTA ROTATE (TIP OVER) DX=X-XP DY=Y-YP 'TRACE X,XP W=SQR(DX*DX+DY*DY) 'I DON'T KNOW WHY THE CAR REQUIRES DX TO BE NEGATIVE ADD VR,SGN(DX)*W*0.0001*(-10)^(-(VEHICLE=1)) END IF R1=R1*R NEXT I SPRITE OFF 63 END SUB 'C O L L I S I O N C H E C K S SUB COLL(X,Y,R,MX,MY,S0,S1) 'INPUT FIRST SPRITE, INPUT LAST SPRITE -> CHECK FOR EACH SPRITE 'CHECK SOLID-BLOCK COLLISION 'INTEGER DIVIDE WITH NEGATIVE NUMBER HANDLING CX=INT(X/8) CY=INT(Y/8) C=CELL.C(CX,CY) IF C>=48 AND C<=62 OR C=3 THEN 'WAS8BIT'S SPRITE-BASED IN-CELL COLLISION CHECKS SPRITE 63,CX*8-MX,CY*8-MY,C SPRITE.A 63,CELL.A(CX,CY) D=ABS(NOT(SPRITE HIT(63,S0 TO S1))) 'SPRITE 63 PAL 1 ELSE D=1 END IF 'D=-(C<>48 AND C<>3) 'IF D=1 AND C>=48 AND C<=62 OR C=3 THEN 'CHECK IN-CELL COLLISION 'CALL INCELLCOLL(X,C,A,D) 'D=-(Y0 THEN EXIT NEXT I D=I 'FOR VERTICAL DETECTION THESE LINES COULD BE USED: 'ADDR=$8000+C*16+RX 'DA=PEEK(ADDR) OR PEEK(ADDR+8) 'IF ((DA\2^I) MOD 2)>0 THEN EXIT END SUB 'C H E C K A N D R E F R E S H C H U N K S SUB CHECKCHUNK(X,Y,LX,LY,ADDR,T,DIR) 'IN NEGATIVE COORDINATES ONE REFRESH EVENT HAS BEEN SKIPPED: IT LAGS BEHIND ONE CHUNK 'INTEGER DIVISION THAT HANDLES NEGATIVE NUMBERS TX=INT(X/64) TY=INT(Y/64) 'IF IT'S OUTDATED THEN IT'S TIME TO LOAD NEW CHUNKS IF TX<>LX OR TY<>LY THEN 'PREPARE 'SET THE RELATIVE CHUNK-LOAD COORDINATES FOR X AND Y (WHICH CAN EACH EITHER BE 0 OR 3) A=SGN(TX-LX)*1.5+1.5 B=SGN(TY-LY)*1.5+1.5 C=TX<>LX D=TY<>LY IF C AND D THEN 'CHANGE DETECTED IN BOTH X AND Y: LOAD 3 CHUNKS LEFT OR RIGHT AND UP OR DOWN FOR I=0 TO 2 CALL LOADCHUNK((TX+A)*8,(TY+I)*8,ADDR,T,DIR) CALL LOADCHUNK((TX+I)*8,(TY+B)*8,ADDR,T,DIR) NEXT I 'LOAD THE CHUNK IN THE CORNER CALL LOADCHUNK((TX+A)*8,(TY+B)*8,ADDR,T,DIR) ELSE IF C THEN 'CHANGE DETECTED IN X: LOAD 4 CHUNKS LEFT OR RIGHT FOR I=0 TO 3 CALL LOADCHUNK((TX+A)*8,(TY+I)*8,ADDR,T,DIR) NEXT I ELSE IF D THEN 'CHANGE DETECTED IN Y: LOAD 4 CHUNKS UP OR DOWN FOR I=0 TO 3 CALL LOADCHUNK((TX+I)*8,(TY+B)*8,ADDR,T,DIR) NEXT I END IF 'RESET LX=TX LY=TY END IF END SUB 'L O A D C H U N K SUB LOADCHUNK(X,Y,ADDR,T,D) T=64 'T=32 XO=X AND 31 YO=Y AND 31 IF (T\1) MOD 2 THEN 'LOAD TEXT FROM ARRAY FOR I=Y TO Y+7 TEXT X,I," " IF I<=UBOUND(TXT$) THEN TEXT X,I,MID$(TXT$(I),X+1,8) END IF NEXT I ELSE IF (T\2) MOD 2 THEN 'LOAD BG FROM FILE BG SOURCE ADDR 'TRACE ABS(X MOD 64) BG COPY X AND 63,Y AND 63,8,8 TO XO,YO 'TRACE X AND 63,X AND 31 ELSE IF (T\4) MOD 2 THEN 'COMPACT MAP FILE TYPE (NOT MADE (YET)) 'THE DATA COULD LOOK SOMETHING LIKE THIS: 'IT WOULD HAVE A BUNCH OF PREDEFINED CHARACTERS WITH ATTRIBUTES 'IN THE FILE THERE'S A NUMBER FOR EACH PREDEFINED CELL 'THE FILE STARTS WITH A FILE HEADER WHERE YOU CAN DEFINE THE SCALE '(YOU CAN MAKE EVERYTHING 4X AS BIG), IT ALSO CONTAINS A TABLE WITH PREDEFINED CHAR AND ATTR VALUES 'A BLOCK OF DATA STARTS WITH A HEADER BYTE WHICH DEFINES '- THE CHUNK COORDINATES OF THE CHUNK (RELATIVE, GLOBAL 2 BYTE, OR GLOBAL 4 BYTE) '- THE RELATIVE CHUNK COORDINATES THEMSELVES '- THE PREDEFINED CHAR AND ATTR NUMBER(S) 'GLOBAL COORDINATES TAKE UP 2 TO 4 EXTRA BYTES 'THE DATA IS ENCODED SIMILAR TO CHARACTER DATA, BUT FOR A 8X8 CHUNK OF CELLS INSTEAD ELSE IF (T\8) MOD 2 THEN 'BG FILL FILE 'A SET OF COORDINATES AND SIZE VALUES (BG FILL) ELSE IF (T\16) MOD 2 THEN 'STRUCTURES 'SMALL BACKGROUND FILES THAT CAN BE SPAWNED AT MULTIPLE COORDINATES (TREES AND BUILDINGS) ELSE IF (T\32) MOD 2 THEN 'RANDOMWALK-BASED PROCEDURAL TERRAIN GENERATOR IF Y\8=0 THEN CALL RANDOMWALK(X\8,D) ELSE IF (T\64) MOD 2 THEN 'PROCEDURAL TERRAIN GENERATOR 'CLEAR THE CHUNK BG FILL XO,YO TO XO+7,YO+7 CHAR 0 STAT=0 R=0 CALL NOISE(0,X-2,R) CALL NOISE(0,X-1,R) CALL NOISE(0,X,R) FOR I=0 TO 7 PAL 7 CALL NOISE(0,X+I+1,R) R=SHIFTREG(2) RO=R AND 31 IF R>=Y AND R<=Y+7 THEN BG FILL XO+I,RO TO XO+I,YO+7 CHAR 48 CALL TERRAINMASK(I,XO,YO,RO,STAT) ELSE IF R=1)-3*(ADX2>=2) 'FLAT C=49 IF ADX2>=1 THEN 'LINEAR SLOPE C=52 IF ADX2>=2 THEN 'STEEP SLOPE C=55 IF DX2>0 THEN DY=1 IF DX3=0 THEN C=60 ELSE IF DX2<0 AND DX1=0 THEN 'NO SLOPE C=49 ELSE IF ADX1>=2 THEN 'BUNCHY SLOPE 'C=51 ELSE IF ADX3>=2 THEN 'HOLLOW SLOPE 'C=54 ELSE IF ADX3=1 AND ADX2=0 AND ADX1=1 THEN 'C=62 END IF ELSE IF DX2=0 THEN IF DX1=-1 THEN 'EARLY SLOPE 'C=51 IF STAT=0 THEN C=61 ELSE STAT=1 FLIP 1,0 END IF END IF IF DX2<=-1 AND DX1>=1 THEN 'DALE C=58 'DY=-1 ELSE IF DX1<=-1 AND DX3>=1 THEN 'TOP 'C=59 ELSE IF DX3=-1 AND DX2=-1 AND DX1=0 THEN 'SMOOTH SLOPE ODX=1 ELSE IF DX3=0 AND DX2=1 AND DX1=1 THEN C=56 ELSE IF DX3=1 AND DX2=1 AND DX1=0 THEN IF STAT=0 THEN C=51 ELSE STAT=1 'C=61 ELSE IF DX3=0 AND DX2=-1 AND DX1=0 THEN 'C=50 ELSE IF DX3=2 AND DX2=0 THEN 'C=62 'FLIP 1,0 ELSE IF (DX3=1 AND DX2=0 AND DX1=1) THEN 'OR (DX3=-1 AND DX2=0 AND DX1=-1) THEN C=62 DY=-1 STAT=1 END IF 'IF C<>62 THEN C=49 'TRACE C IF CELL.C(XO+I-1,RO+DY)=62 THEN C=46 CELL XO+I,RO+DY,C IF C=55 OR C=60 THEN CELL XO+I,RO+DY-1,56 IF ODX=1 THEN CELL XO+I-1,RO+DY-1,56 FLIP 0,0 PAL 3-(DX2<0)*4 NUMBER XO+I,RO+DY-2,INT(ADX2),1 PAL 0 END SUB SUB NOISE(A,X,Y) 'Y=INT(X) Y=8*SIN(0.07*X)+5*SIN(0.1*X)+5*SIN(0.25*X)+2*SIN(0.35*1*X) 'CALL RANDOM(A,X,Y) 'Y=ABS(Y*5) 'TRACE X,Y CALL SHIFTREG(Y,1) END SUB SUB RANDOM(A,S,V) '(ALGORITHM, SEED, VALUE) 'A SEED-BASED RANDOM GENERATOR ALGORITHM FOR PROCEDURAL TERRAIN IF A=0 THEN 'V=SIN(S*SIN(S)) V=SIN(0.1*S*SIN(S*0.3)) ELSE IF A=1 THEN V=SIN(S*SIN(S)) V=INT(V*5)\3 END IF END SUB SUB SHIFTREG(V,D) 'TRACE D FOR I=0 TO 2 A=D*I-3*(D=-1) SHIFTREG(A)=SHIFTREG(A+1*D) NEXT I A=-3*(D=1) SHIFTREG(A)=INT(V) 'TRACE SHIFTREG(0),SHIFTREG(1),SHIFTREG(2),SHIFTREG(3) END SUB SUB RASTERFX 'ZOOM OUT VERTICAL AXIS SCROLL 0,SCROLL.X(0),RASTER SCROLL 1,SCROLL.X(1),RASTER END SUB 'OLD IF XB OR YB*0 THEN ADD MX,DX*SPEED 'CHECKS IF MAP REFRESH IS NECCESSARY 'CALL CHECKCHUNK(MX,MY,LX,LY,ADDR,T) 'TRACE MX\8,LC,MX\8>LC MX1=MX\64 'S=(1-SGN(MX1))\2 S=-(MX1<0) IF MX1>LC THEN MX2=MX1 CALL RANDOMWALK(MX2+3-S,1) LC=MX1 ELSE IF MX11 THEN R1=ABS(R1)*-SGN(Y-8) END IF 'SET Y BASED ON THE PSEUDO-RANDOM DIRECTION VALUE IF R1=R2 OR (R1=-1 AND R2=0) THEN ADD Y,R1 ELSE IF R1=0 AND R2=1 THEN ADD Y,R2 END IF 'FILL THE TERRAIN BG FILL X,Y+1 TO X,15 CHAR 3 'RANDOMIZE THE TEXTURE TILES FOR I=Y TO 15 TINT X,I FLIP INT(RND*2),INT(RND*2) NEXT I 'DRAW THE TERRAIN SURFACE FLIP DIRECTION*-(R1>0)-(DIRECTION=-1),0 TEC=CELL.C(X,Y) 'NOTE: TYPE CHAR-2: WHENEVER THERE'S A WEDGE, 2 IS ADDED CELL X,Y,-(R1=0)-2*(R1<>0)-56*(TEC=59)-55*(TEC=10) 'CALL FOR A STRUCTURE A=0 'CALL RANDOM(1,X+0.1,A) 'IF X MOD 2=-(DIRECTION=-1) AND (INT(A)=1) THEN 'CALL SPAWNSTRUCTURE(X+(DIRECTION=-1),Y-2-(R1>0),0,BIO) 'END IF NEXT X A=-4*(DIRECTION=1) MAPRAM(0,A)=Y MAPRAM(1,A)=R1 END SUB SUB SETBIOME(D,V) CALL RANDOM(1,D*0.1+0.2,V) V=-(V>0.5)*1-(V<-0.5)*2 PAL -(V=1)*3-(V=2)*5 END SUB SUB MAPRAMSHIFT(D) 'TRACE D FOR J=0 TO 1 FOR I=0 TO 3 A=D*I-4*(D=-1) MAPRAM(J,A)=MAPRAM(J,A+1*D) NEXT I NEXT J 'A=-4*(D=1) 'MAPRAM(0,A)=V1 'MAPRAM(1,A)=V2 'TRACE TIMER MOD 1000,1,MAPRAM(0,0)," ",MAPRAM(0,1)," ",MAPRAM(0,2)," ",MAPRAM(0,3)," " END SUB SUB SPAWNSTRUCTURE(X,Y,N,BIO) IF N=0 AND BIO<>2 THEN 'SPRUCE TREE 'CHARACTERS 43,59, FLIP X FLIP 1,0 CELL X,Y,43 CELL X,Y+1,59+(CELL.C(X,Y+1)=2) FLIP 0,0 CELL X+1,Y,43 CELL X+1,Y+1,59+(CELL.C(X+1,Y+1)=2) ELSE IF N=0 AND BIO=2 THEN 'APPARTEMENT 'CHARACTERS 43,59, FLIP X FOR I=0 TO 1 V=0 CALL RANDOM(1,X+0.5,V) FOR J=0 TO INT((1+V)*4) CELL X+I,Y-J,10 NEXT J CELL X+I,Y+1,10-(CELL.C(X,Y+1)=2)*47 NEXT I END IF END SUB 'SUB RANDOM(S,V) 'V=SIN(S*SIN(S)) 'V=INT(V*5)\3 'V=INT(V*7-3)\3 'V=SIN(S)MOD 1 'V=RND 'V=INT(V*3-1) 'IF ABS(V)>1 THEN TRACE V ' 'INPUTS: V1,V2,Q1,Q2 'Q1=Q1*V1 'Q2=Q2*V2 'N=((Q1^Q2)*V1)/$FFFFFFFF 'END SUB SUB DEBUG(N,V) SPRITE 63-N,150-N*8,V,189 SPRITE 63-N PAL 7 'FOR I=0 TO 4 'CALL DEBUG(4-I,MAPRAM(0,I)*8) 'NEXT I 'TRACE TIMER MOD 1000,2, 'TRACE MAPRAM(0,0)," ",MAPRAM(0,1)," ",MAPRAM(0,2)," ",MAPRAM(0,3)," ",MAPRAM(0,4) END SUB SUB PRINTARR J=0 TRACE MAPRAM(J,0)," ",MAPRAM(J,1)," ",MAPRAM(J,2)," ",MAPRAM(J,3)," " END SUB SUB TRASHBIN 'CALL MOVEMENT(LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,W,H,DX,DY,ANG) 'SUB MOVEMENT (LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,W,H,DX,DY,ANG) 'CALL MOVEMENT(P1,P2,GRAV,RESIST,SMOOTHNESS,LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,CHARW,CHARH,DX,DY,ANG) 'SUB MOVEMENT(POWER,POWER2,GRAVITY,RESIST,SMOOTHNESS,LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,W,H,DX,DY,ANG) 'CALL COLLISION(MX+X+VX,MY+Y+VY,R,W,H) 'READ C$ 'FOR I=1 TO LEN(C$) 'POKE $A000+I+A,ASC(MID$(C$,I,1)) 'NEXT I 'ADD A,LEN(C$) 'TRACE (Y MOD 8)*64 'BG FILL (X*8) MOD 32,(Y*8) MOD 32 TO (X*8) MOD 32+7,(Y*8) MOD 32+7 CHAR 193+X 'FOR I=0 TO 7 'BG COPY (X*8) MOD 64,(Y*8+I) MOD 64,8,1 TO (X*8) MOD 32,(Y*8+I) MOD 32 'BG FILL (X*8) MOD 32,(Y*8+I) MOD 32 TO (X*8) MOD 32+8,(Y*8+I) MOD 32+8 CHAR 192+Y 'BG FILL (X*8) MOD 32,(Y*8) MOD 32 TO (X*8) MOD 32+8,(Y*8) MOD 32+8 CHAR 192+Y 'COPY ROM(3)+(X*8+Y*512+I*64)*2,16 TO $9000+(X*16) MOD 32+(Y*512+I*64) MOD 2048 'FILL $9000+((X1*8+Y1*256+I*32)*2) MOD $800,32,RND*8+1 'TRACE B\128,B MOD 128 'WAIT 10 'NEXT I 'TRACE I,X*8,MID$(TXT$(I),X*8+1,8) 'WAIT 30 'CHR$(PEEK($A000+I+J*20)) 'SUB RANDOMWALK(D,DIRECTION) 'BIO=0 'CALL SETBIOME(D,BIO) 'TRACE BIO D=D*8 MINV=D-7*(DIRECTION=-1) MAXV=D-7*(DIRECTION=1) X=MINV-DIRECTION 'CALL MAPRAMSHIFT(DIRECTION) A=-4*(DIRECTION=1) Y= MAPRAM(0,A) R1=MAPRAM(1,A) V=0 'CLEAR THE CHUNK BG FILL D,0 TO D+7,15 CHAR 0 FOR X=MINV TO MAXV STEP DIRECTION 'GENERATE DIRECTION (-1(UP),0(FLAT),1(DOWN)) (NOT TO BE CONFUSED WITH LOAD-DIRECTION) R2=R1 CALL RANDOM(1,X,R1) R1=DIRECTION*R1 IF (Y+3)\8<>1 THEN R1=ABS(R1)*-SGN(Y-8) END IF 'SET Y BASED ON THE PSEUDO-RANDOM DIRECTION VALUE IF R1=R2 OR (R1=-1 AND R2=0) THEN ADD Y,R1 ELSE IF R1=0 AND R2=1 THEN ADD Y,R2 END IF 'FILL THE TERRAIN BG FILL X,Y+1 TO X,15 CHAR 3 'RANDOMIZE THE TEXTURE TILES FOR I=Y TO 15 TINT X,I FLIP INT(RND*2),INT(RND*2) NEXT I 'DRAW THE TERRAIN SURFACE FLIP DIRECTION*-(R1>0)-(DIRECTION=-1),0 TEC=CELL.C(X,Y) 'NOTE: TYPE CHAR-2: WHENEVER THERE'S A WEDGE, 2 IS ADDED CELL X,Y,-(R1=0)-2*(R1<>0)-56*(TEC=59)-55*(TEC=10) 'CALL FOR A STRUCTURE A=0 CALL RANDOM(1,X+0.1,A) IF X MOD 2=-(DIRECTION=-1) AND (INT(A)=1) THEN 'CALL SPAWNSTRUCTURE(X+(DIRECTION=-1),Y-2-(R1>0),0,BIO) END IF NEXT X A=-4*(DIRECTION=1) MAPRAM(0,A)=Y MAPRAM(1,A)=R1 'END SUB END SUB #1:MAIN PALETTES 0F181424002E1E2D00152A1F002F1A05 1F0B150000060115003E3834003F0500 #2:MAIN CHARACTERS 00000000000000000000000000000000 F7CC3F8DE7F067A80033C07F9FFFDCF7 0103050F172B0C270000020109177FDF 5E70EBF7A928BB62FFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000075FFFFF0000000000000000 0000023FFFFFFFFF0000000000000000 00000020E0F8FCFE0000000000000000 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 00071F7FFFFFFFFF00071F7FFFFFFFFF 00000000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E4FFFFFFFFFFFFFFE4FFFFFFFFFFFFFF 80E1FFFFFFFFFFFF80E1FFFFFFFFFFFF 00010F1F3F7FFFFF00010F1F3F7FFFFF 0107071F3F3F7FFF0107071F3F3F7FFF 0303070F0F1F7FFF0303070F0F1F7FFF 0101030303071FFF0101030303071FFF 1F3F3F7F7F7F7FFF1F3F3F7F7F7F7FFF 0101030307070F1F0101030307070F1F 001E3E3E7E7EFFFF001E3E3E7E7EFFFF 00C1C7FFFFFFFFFF00C1C7FFFFFFFFFF 000000000C3E7FFF000000000C3E7FFF 1F1F1F1F3F3F7FFF1F1F1F1F3F3F7FFF 01070F0F1F1F3FFF01070F0F1F1F3FFF 0000000001073FFF0000000001073FFF 00007EFFFFFFFF7E00007EFFFFDBFF7E 00000000000000000000000000000000 00010F1F2D7FDFF700010F1F3D7FDFFF E4FFEF7FFFF7BFFFE4FFEFFFFFFFBFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0101030303061FFB0101030303061FFF FF7FEFFF3F7FFDFFFF7FEFFF3F7FFFFF FF3F3F3D3F6F7FFFFF3F3F3D3F7F7FFF 00000000000000000000000000000000 0107071D3F3F77FF0107071D3F3F7FFF 0303070F0B1E7FF70303070F0B1E7FFF 1F3F3F7F7B7E7FF71F3F3F7F7B7E7FFF 0101030307070F1F0101030307070F1F 001E3A3E6E7EFBDF001E3E3E6E7EFBFF 80E1FFBDFFFFDFFF80E1FFBFFFFFFFFF 00000000000000000000000000000000 FFFFBFFDFFDFFFFFFFFFBFFFFFFFFFFF 00000000075FFFFF0000000000000000 0000023FFFFFFFFF0000000000000000 00000020E0F8FCFE0000000000000000 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 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E4FFFFFFFFFFFFFFE4FFFFFFFFFFFFFF 80E1FFFFFFFFFFFF80E1FFFFFFFFFFFF 00010F1F3F7FFFFF00010F1F3F7FFFFF 0107071F3F3F7FFF0107071F3F3F7FFF 0303070F0F1F7FFF0303070F0F1F7FFF 0101030303071FFF0101030303071FFF 1F3F3F7F7F7F7FFF1F3F3F7F7F7F7FFF 0101030307070F1F0101030307070F1F 001E3E3E7E7EFFFF001E3E3E7E7EFFFF 80818183C3E3F7FF80818183C3E3F7FF 000000000C3E7FFF000000000C3E7FFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00007EFFFFFFFF7E00007EFFFFDBFF7E FFFFFFFFFFFFFFFF0000000000000000 AA55AA55AA55AA5555AA55AA55AA55AA 0000000000000000FFFFFFFFFFFFFFFF 0000000000000000187E7EFFFF7E7E18 00000000000000003C7EFFFFFFFF7E3C 301C59BEFD3A6C2C3C66E7C183C7563C #3:MAIN BG 00001410820582058205820582058205 82058205820582058205820582058205 82058205820582058205820580058205 82058205820582058205820582058205 82058205820582058205820582058205 82058205800580058205820582058205 82058205820582058205820582058205 82058205820582058205820580058005 80058205820580058205820580058205 82058205820582058205820580058005 82058205800580058005820582058005 80058005800580058005820582058205 82058005800580058205800580058005 80058205820580058005800580058005 80058005820582058005800580058005 80058005800580058005800580058005 80058005800580058005800582058205 80058005800580058005800580058005 80058005800580058004800580058005 80058005800582058005800580058005 80058005800580058005800580058004 80048005800580058005800580058005 80058005800580058005800580048005 80058005800580048004800580058004 80048005800580058005800480048005 80058004800480048005800580048004 80048004800480048004800580058005 80058004800480058004800480048004 80058004800480048004800480048004 80048004800580058004800480048004 80048004800480048004800480048004 80048004800480048004800480048005 80048004800480048004800480048004 80058004800480048004800480048004 80048004800480048004800480048005 80048004800480058005800480048004 80048005800480048004800480048005 80048004800580058004800480058005 80058005800480048005800580048005 80048004800480058005800480058005 80058004 #4:BG 00004040000000000000000000000000 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 00000000000000000000100011001200 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000001000110012000000 00000000000000000000000000000000 00000000000000000000200021002200 00000000000000000000000000000000 00001000110012000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000010001100 12000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 12081108100800000000000000000000 00000000000000000000000000000000 00000000000000000000000012081108 10080000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000001000110012000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000001208 11081008000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0100020003000D000808000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 10001100120000000000000000000900 03000300030003000300080800000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000001000300 03000300030003000300030008080000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000090003000300 03000300030003000300030003000808 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000100030003000300 03000300030003000300030003000300 08080000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000B000300030003000300 03000300030003000300030003000300 03000808000000000A00020803000D08 0A080000000000000000000000000000 10001100120000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000A000300030003000300 03000300030003000300030003000300 0300030002000D000300030003000300 03000B08000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000001000110012000000 00000000000000000000000000000000 000000000B0003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 030003000D0801080000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000A0003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000B08000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000B00030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000A08000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000A00030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000308080800000000 00000000000000000000000000000000 00000000000012081108100800000000 00000000000000000000000000000000 00000000000000000000000000000000 00000500030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000D00 0A080000000000000000000000000000 00000000000022082108200800000000 00000000000000000000000000000000 00000000000000000000000000000000 0B000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000108000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0A000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030001080000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000D0802080B080000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000400 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000D08 09080000000000000000000000000000 00000000000000000000000000000000 0000000000000C000000010003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 0300080803000D0802000D0001080000 00000000000001000108000000000000 00000100030003000D00030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000200 03000200030003000300040800000100 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300030003000300030003000300 03000300