'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) 'CODE SETUP GAMEPAD 2 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 'MY=-79900 XB=0 YB=0 'BG RASTER EFFECT MODE (DEPENDS ON YOUR HEIGHT) RASTERMODE=0 CLOUDTYPE=0 GLOBAL RASTERMODE,CLOUDTYPE 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 'PALETTE 0,0,,, GLOBAL GRAVITY,DRAG,FRICTION,RESIST,POWER,POWER2,VEHICLE,SMOOTHNESS,MX,MY GRAVITY=0.1 'GRAVITY=0 DRAG=0.001 FRICTION=0.2 RESIST=DRAG 'RESIST=1 POWER=0.2 'POWER2=0.2 POWER2=1 VEHICLE=0 'CAMERA MOVEMENT SMOOTHNESS=16 W=7 H=6 'EDGE OF SCREEN 'XBORDER=35 'YBORDER=35 'UB=YBORDER 'DB=128-W-YBORDER 'LB=XBORDER 'RB=160-H-XBORDER 'CENTER OF SCREEN XBORDER=10 YBORDER=10 UB=0.5*(128-W)-YBORDER DB=0.5*(128-W)+YBORDER LB=0.5*(160-H)-XBORDER RB=0.5*(160-H)+XBORDER S0=0 S1=2*ABS(VEHICLE=1)+8*ABS(VEHICLE=2) ON RASTER CALL RASTERFX 'D E F I N E G A M E A S S E T S A N D B E H A V I O U R 'D E F I N E I T E M S 'ITEMS: 'BLOCK ITEMS (INVENTORY ITEMS) '1 (TERRAIN: GRASS) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE DATA 0 '2 (TERRAIN: DIRT) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE DATA 0 '3 (TERRAIN: STONE) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE DATA 0 '4 (PLANTS: LOG) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE DATA 0 '5 (PLANTS: LEAVES) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE DATA 0 '6 (BUILDING: WOOD) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE DATA 0 'TOOL ITEMS '1 (PISTOL) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (SHOTGUN) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (SEMI-AUTO) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (ROCKET) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (MINIGUN) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (SHIELD) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (SWORD) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (PICKAXE) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '1 (DRILL) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 'VEHICLE ITEMS '1 (CAR) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 '2 (ROCKET) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),SIZE,USAGE,RECIPE ITEMS: 1,2,3... DATA 0 'D E F I N E B L O C K S 'BLOCKS: '1 (TERRAIN: GRASS) 'ITEM (HAS IMAGE) DATA 0,0,0,0 '2 (TERRAIN: DIRT) 'ITEM (HAS IMAGE) DATA 0,0,0,0 '3 (TERRAIN: STONE) 'ITEM (HAS IMAGE) DATA 0,0,0,0 '4 (PLANTS: LOG) 'ITEM (HAS IMAGE) DATA 0,0,0,0 '5 (PLANTS: LEAVES) 'ITEM (HAS IMAGE) DATA 0,0,0,0 '6 (BUILDING: WOOD) 'ITEM (HAS IMAGE) DATA 0,0,0,0 'D E F I N E S T R U C T U R E S 'STRUCTURES: '1 (PLANTS: TREE) 'SIZE,AMOUNT OF DIFFERENT BLOCK TYPES,BLOCK: 1,2,3,4... DATA 0 '2 (CIVILIZATION: CITY HOUSE) 'SIZE,AMOUNT OF DIFFERENT BLOCK TYPES,BLOCK: 1,2,3,4... DATA 0 '3 (CIVILIZATION: VILLAGE HOUSE) 'SIZE,AMOUNT OF DIFFERENT BLOCK TYPES,BLOCK: 1,2,3,4... DATA 0 'D E F I N E O R E V E I N S 'ORES: '1 (IRON) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 '2 (COPPER) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 '3 (GOLD) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 '4 (COAL) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 '5 (ENERGY) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 '6 (DATA) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 '7 (CASH) 'BLOCK,AVG COUNT,STANDARD DEVIATION,HORIZONTALINESS,RARITY,MAX HEIGHT,MIN HEIGHT DATA 0 'D E F I N E T O O L S 'TOOLS: '1 (PISTOL) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (SHOTGUN) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (SEMI-AUTO) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (ROCKET) 'ITEM,PAL,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (MINIGUN) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (SHIELD) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (SWORD) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (PICKAXE) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '1 (DRILL) 'ITEM,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 'D E F I N E V E H I C L E S 'VEHICLES: '1 (CAR) 'ITEM,POWER,TYPE,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 '2 (ROCKET) 'ITEM,POWER,TYPE,PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY DATA 0 'D E F I N E P R O J E C T I L E S 'PROJECTILES: '1 (BULLET) 'CHAR,PAL,ASSET SET (LOAD FROM ROM) DATA 0 '2 (ROCKET) 'CHAR,PAL,ASSET SET (LOAD FROM ROM) DATA 0 '3 (PLASMA) 'CHAR,PAL,ASSET SET (LOAD FROM ROM) DATA 0 'D E F I N E E N E M I E S 'ENEMIES: 'MELEE BOTS COULD BE INSPIRED BY BATTLEBOTS '1 (LAND: HAMMER) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '2 (LAND: AGENT) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '3 (LAND: TANK) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '4 (LAND: LASERCAR) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '5 (LAND: MEANIGUN) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '6 (LAND: ZAPPER) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '7 (SKY: DRONE) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 '8 (SKY: LASER DRONE) 'CHAR,PAL,ASSET SET (LOAD FROM ROM),PROJECTILE(0=NONE),A RATE,A DAMAGE,A ACCURACY,A DISTANCE, M SPEED, DROPS DATA 0 'P L A N E T A R I U M - S P 4 C E B A R 'S A T E L L I T E C O N S T A N T S DIM GLOBAL SATELLITES(15,4) 'SATELLITES(ID,TYPE) 'TYPE: X,Y,RADIUS (*10^6 M) (MAY BE OBSOLETE), RADIUS OF ORBIT (*10^12 M), MASS (*10^24 KG) 'WRITE DATA TO ARRAY FOR I=0 TO 15 FOR J=0 TO 2 READ V IF V<0 THEN EXIT V=V*10^(6*2^J) SATELLITES(I,J+2)=V NEXT J IF V=-2 THEN EXIT NEXT I 'SATELLITE DATA: RADIUS,RADIUS OF ORBIT,MASS 'STARS DATA 696.3, 0, 1988400 'PLANETS DATA 2.440, 0.0579, 0.330 DATA 6.052, 0.1082, 4.87 DATA 6.371, 0.1496, 5.972 DATA 3.390, 0.228 , 0.642 DATA 69.91, 0.7883, 1900 DATA 58.2 , 1.427 , 568 DATA 25.4 , 2.871 , 86.8 DATA 24.6 , 4.498 , 102.4 'MOONS DATA 1.738, 0.0003844, 0.0735 'MANMADE SPACE OBJECTS DATA -2 'V A R I A B L E S 'GRAVITATIONAL CONSTANT GLOBAL G G=6.67384*10^(-11) 'ZOOM ZC=32 'SCROLL XC=-80 YC=-66 'FOCUS (ID) FC=0 'S E T U P 'PALETTE 0,0,,, PAUSE OFF 'P R O J E C T I L E S - S P 4 C E B A R 'CALL SHOOTING(BGX,BGY,T,C,RT,RELOAD_TIME) 'CALL PROJECTILES(BGX,BGY,SPO) 'CALL ENEMIES(BGX,BGY,SPO,X,Y) 'GLOBAL A,X,Y,BGX,BGY,C,DX,DY,MDX,MDY,YDIRECTION,SPO,XSIZE,YSIZE,CHARACTER GLOBAL ACCURACY,DIRECTION,BULLET_SPEED,BULLET,BULLETNO,RELOAD_TIME,PHI,GUN,KNOCKBACK GLOBAL TIMER0,TIMER1 TIMER0=0 TIMER1=0 'KNOCKBACK FORCE FOR THE MOVEMENT FUNCTION KNOCKBACK=0 CHARACTER=87 'SPRITE NUMBER OF THE LOWEST PROJECTILE SPRITE SPO=6 'SCROLL OFFSET COORDINATES 'BGX=0 'BGY=0 BULLETNO=0 'GUN TYPE GUN=5 'STORED TIMER VALUE OF GUN SWITCHING 'T=0 'STORED TIMER VALUE OF LAST SHOT 'RT=0 'MAP SIZE 'XSIZE=128 'YSIZE=128 DIRECTION=0 'PLAYER COORDINATES 'X=76 'Y=60 A=-1 O=0 'EX=160 'EY=63 'STORED TIMER VALUE OF ENEMY CONTROL TICK (OBSOLETE) 'LAST_TIME=0 'CONSTANTS PHI = 1.61803398875 DIM GLOBAL TABLE(6,8) DIM GLOBAL PROJ(4,63) DIM GLOBAL ENEMY(3,3) DIM GLOBAL GFX(3,3) FOR I=0 TO 3 ENEMY(0,I)=INT(RND*160) ENEMY(1,I)=INT(RND*128) ENEMY(2,I)=96+INT(RND*9) NEXT I 'SPRITE 0 PAL 2 'PROJ(TYPE, PROJECTILE ID) 'TYPE '0 X (LIVE X POSITION) '1 Y (LIVE Y POSITION) '2 DY (NOT ANYMORE INACCURACY) '3 DX (NOT ANYMORE BULLET SPEED) '4 PROJECTILE TYPE (GUN) (NEGATIVE IS ENEMY) RESTORE PROJECTILES FOR I=0 TO 6 FOR J=0 TO 8 READ TABLE(I,J) NEXT J NEXT I PROJECTILES: 'GUN DATA TABLE ' |RELOAD TIME ' | |ACCURACY ' | | |SPEED ' | | | |KNOCKBACK ' | | | | |GRAVITY ADD EXPLOSION SIZE ' | | | | | |SHOOT DIRECTION ' | | | | | | |C,X,Y DATA 2 ,0.3 ,2 ,1 ,0 ,0 ,0,1,1 DATA 4 ,0.2 ,2 ,0.2 ,0 ,0 ,0,0,0 DATA 10 ,0.1 ,2 ,0.1 ,0 ,0 ,0,0,0 DATA 40 ,0.4 ,2 ,0.5 ,0 ,0 ,0,1,0 DATA 60 ,0 ,3 ,2 ,0 ,0 ,1,1,-1 'DATA 1 ,0.4 ,4 ,0.1 ,0 ,0 ,1,1,-1 DATA 60 ,0 ,5 ,1 ,0 ,0 ,0,2,0 'DATA 1 ,0.5 ,1.5 ,0 ,0.05,1 ,1,1,-1 DATA 60 ,0 ,1.5 ,0 ,0.05,1 ,1,1,-1 RELOAD_TIME =TABLE(GUN-1,0) ACCURACY =TABLE(GUN-1,1) BULLET_SPEED=TABLE(GUN-1,2) BULLET =TABLE(GUN-1,6)+79 'M A I N L O O P 'MAINLOOP: DO IF BUTTON TAP(0,1) THEN ADD VEHICLE,1,0 TO 2 SPRITE OFF 0 TO 8 S1=2*ABS(VEHICLE=1)+8*ABS(VEHICLE=2) END IF 'CALL CAM(XC,YC,ZC,FC) 'CALL SPACE(XC,YC,2^ZC,FC) CALL MOVEMENT (LB,RB,UB,DB,VX,VY,MX,MY,X,Y,XB,YB,W,H,DX,DY,ANG,VR,S0,S1) CALL SHOOTING (MX+X,MY+Y,X,Y,GUN) CALL PROJECTILES(MX,MY,SPO) 'CALL ENEMIES (MX,MY,SPO,MX+X,MY+Y) 'CALL EXPLOSION (100,50,30) CALL DISPGFX CALL ATMOSPHERE(MX,-MY) '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 'LIST 1 [OLD] REMAKE ADVENTURE ENGINE AND GO TO SPACE '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) '... 'LIST 2 [NEW] MAKE 2D MINECRAFT 'X ADD THE GUN SYSTEM 'X FIX THE GUN FLASH LOCATIONS 'X MAKE BULLET SPEEDS THE SAME (RANDOM ANGLE INSTEAD OF RANDOM DY) 'X ADD KNOCKBACK 'X FIX THE NO SHOTS FIRED BUG (IN THE ORIGINAL VERSION IT WAS LEFT IN) '- ADD ENEMIES '- MAKE THE MOVEMENT FUNCTION CLEANER AND AVAILABLE FOR ENEMIES '- FIX THE SMALL COLLISION OFFSETS 'X ADD STRUCTURES '- FIX VEHICLES AND MAKE HILLCLIMB RACING 'X ADD GRENADES (PROJECTILES WITH "ADD,DY,GRAVITY" TYPE GRAVITY) 'X ADD EXPLOSIONS (EFFECT SPRITES SWITCHING BACK AND FORTH) '- ADD SPRITE MANAGER ' - USES 4 COUNT VARIABLES: PLAYER,ENEMY,PROJECTILE,EFFECTS ' - USES THIS TO GET THE BASE VALUE FOR EACH CATEGORY, ' - CALL THE SPRITE MANAGER LIKE MSPRITE(N,X,Y,C,T) T=TYPE -> TO ACCESS THE BASE VALUE ' - MAKE A SPRITEOFF FUNCTION ' - ADD A SPRITE SHIFT UP/DOWN SUBPROGRAM WHICH IS CALLED BY THE SPRITE MANAGER '- MAKE AN ENEMY WAVE SURVING GAME '- ADD PROCEDURAL PLATFORMS '- MAKE AN INVASION/ESCAPE GAME (NEUTRON) '- ADD ORES '- ADD MINING '- ADD ITEMS '- ADD INVENTORY '- ADD CRAFTING '- MAKE 2D MINECRAFT (MINESHAFT) '- ADD A BACKGROUND LOADER WHICH CHANGES THE BACKGROUND DEPENDING ON YOUR BIOME AND HEIGHT ' - MINES, COUNTRYSIDE, ATMOSPHERE LAYERS [DONE], SPACE '- ADD NEW ROCKET MECHANICS: THIS EARTH IS FLAT, BUT THE MATH MAKES IT ROUND: ' - THE ROCKET WILL GET A VERTICAL COUNTERFORCE UNTIL IT HAS NO MORE GRAVITY, ' - THIS FORCE WILL BE CALCULATED FOR A ROUND EARTH ' - AND THEN IT'S "ORBITING", IT'S TRAVELLING HORIZONTALLY AT [VERY FAST] KM/H ' - MAKE A LOOP WORLD OPTION (TO MAKE THE WORLD "ROUND") '- LOAD PLAYER-SPRITES (AND COMPOSITIONS OF PLAYER-SPRITES) FROM DATA '- MAKE A ROCKET BUILDER '- ADD A "SPACE" SOURCE IN THE CHUNKLOADER TO LOAD SPACE OBJECTS '- ADD A SECONDARY VIEWMODE (WHICH CAN BE TOGGLED ON AND OFF, AND WHICH USES THE SAME MOVEMENT ENGINE AND IS SCALED PROPERLY '- MAKE THRUST-AWAY! 'S P A C E P R O C E S S O R SUB SPACE(X,Y,Z,F) X1=0 Y1=0 X2=0 Y2=0 'SUN CALL SAT(X,Y,Z,F,0,0,0) FOR I=1 TO 8 'PLANETS CALL ORB(I,X1,Y1,0,0) CALL SAT(X,Y,Z,F,I,X1,Y1) IF I=3 THEN 'EARTH'S MOON CALL ORB(9,X2,Y2,X1,Y1) CALL SAT(X,Y,Z,F,9,X2,Y2) END IF NEXT I END SUB 'O R B I T C A L C U L A T I O N S SUB ORB(I,X1,Y1,X2,Y2) IF SATELLITES(I,3)>0 THEN 'ORBIT ROTATIONAL VELOCITY VRO=0.000001*SQR(G*SATELLITES(0,4)/SATELLITES(I,3)) ELSE VRO=0 END IF 'MAIN POSITION CALCULATION X1=X2+SATELLITES(I,3)*COS(TIMER*VRO) Y1=Y2+SATELLITES(I,3)*SIN(TIMER*VRO) SATELLITES(I,0)=X1 SATELLITES(I,1)=Y1 END SUB 'S A T E L L I T E S P R I T E D R A W I N G SUB SAT(X,Y,Z,F,I,X1,Y1) 'APPLY SCROLL AND ZOOM TO SPRITE COORDINATES SX=(X1-SATELLITES(F,0))/Z-X-4-2*(I=9) SY=(Y1-SATELLITES(F,1))/Z-Y-4-2*(I=9) 'IF THE SPRITE IS IN FRAME THEN IF SX>=-8 AND SX<=168 AND SY>=-8 AND SY<=137 THEN 'DRAW THE SPRITE WITH ITS PALETTE SPRITE I,SX,SY,16-(I=3)-3*(I=0)-2*(I=9) SPRITE I PAL -5*(I=3)-(I>=4 AND I<=6)-2*(I=0)-6*(I=9) ELSE 'REMOVE SPRITE SPRITE OFF I END IF END SUB 'C A M E R A P A R A M E T E R S SUB CAM(X,Y,Z,F) ADD X,LEFT(0)-RIGHT(0) ADD Y,UP(0)-DOWN(0) ADD Z,(BUTTON(0,1)-BUTTON(0,0))*0.125 ADD F,-PAUSE,0 TO 9 NUMBER 0,0,2^Z,20 NUMBER 0,1,X,8 NUMBER 10,1,Y,8 NUMBER 19,1,F,1 END SUB SUB PLAYER(X,Y,T,DX,DY) IF T=0 THEN 'SPRITE 0,X,Y,63 'SPRITE 0 PAL 7 SPRITE 0,X,Y,63+GUN SPRITE 0 PAL 4 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) + KNOCKBACK ADD FX,POWER*UDX*ABS(VEHICLE<>2) - POWER2*DX*(BUTTON(1))*ABS(VEHICLE=2) + KNOCKBACK ADD FY,POWER*UDY*ABS(VEHICLE<>2) + POWER2*DY*(BUTTON(1))*ABS(VEHICLE=2) KNOCKBACK=0 '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 'COLLISION: 'CELL COLLISION: R=1 -> NO COLLISION R=0 -> COLLISION 'MAYBE NOT ALL FOUR CORNERS HAVE TO BE CHECKED EACH LOOP 'TRACE "C1",VX,VY 'HORIZONTAL IF VX<>0 THEN RX=1 CALL COLLISION(VX,0,RX,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)*(RX=0)*0.5 VX=VX*RX 'TRACE RX END IF 'TRACE "C2",VX,VY 'VERTICAL IF VY<>0 THEN RY=1 CALL COLLISION(0,VY,RY,W,H,MX,MY,X,Y,VR,S0,S1) 'IF Y BUMPS THEN THE Y VELOCITY IS SET TO 0 VY=VY*RY END IF 'TRACE "C3",VX,VY 'DRAG IN AIR IF VY>1 THEN RESIST=-FRICTION*(RY=0)-DRAG*(RY<>0) VY=VY*ABS(VY<0 OR RY=1) 'TRACE "C4",VX,VY 'FRICTION ON GROUND ELSE RG=1 CALL COLLISION(0,1,RG,W,H,MX,MY+1,X,Y,VR,S0,S1) 'IF WE TOUCH THE GROUND THEN WE HAVE FRICTION RESIST=-FRICTION*(RG=0)-DRAG*(RG<>0) VY=VY*ABS(VY<0 OR RG=1) END IF 'TRACE "C5",VX,VY 'CLIP CLIP=1 CALL COLLISION(0,0,CLIP,W,H,MX,MY,X,Y,VR,S0,S1) 'IF WE ARE CONTINUOUSLY BUMPING (CLIPPING), THEN WE SHOULD ESCAPE UPWARDS 'CLIP=0 'VX=VX*-(CLIP<>0) VY=VY*-(CLIP<>0)+(CLIP=0) IF VEHICLE=2 THEN 'VY=VY*-(CLIP<>0)+(CLIP=0) VR=VR*-(CLIP<>0) END IF 'TRACE CLIP,RX,RY,RG 'TRACE "C6",VX,VY '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 'TRACE "C7",VX,VY '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) 'TRACE "C8",VX,VY 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 SIZE 0 NEXT I IF BUTTON(1) 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 'FRAME 171, WHEEL 157, PAL 7 SPRITE 0,X-DX*L,Y-DY*L,157 SPRITE 1,X+DX*L,Y+DY*L,157 SPRITE 2,X-4,Y-8,171 SPRITE 0 PAL 7 SPRITE 1 PAL 7 SPRITE 2 PAL 7 SIZE 1 'FRAME 1 , WHEEL 133, PAL 0 'SPRITE 0,X-DX*L,Y-DY*L,157 'SPRITE 1,X+DX*L,Y+DY*L,157 'SPRITE 2,X,Y-2,171 'SPRITE 0 PAL 7 'SPRITE 1 PAL 7 'SPRITE 2 PAL 7 SIZE 1 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(X1,Y1,0,0,R,MX,MY,X,Y,S0,S1) CALL COLL(X1,Y1,W,0,R,MX,MY,X,Y,S0,S1) CALL COLL(X1,Y1,0,H,R,MX,MY,X,Y,S0,S1) CALL COLL(X1,Y1,W,H,R,MX,MY,X,Y,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 W1=SQR(DX*DX+DY*DY) 'I DON'T KNOW WHY THE CAR REQUIRES DX TO BE NEGATIVE ADD VR,SGN(DX)*W1*0.0001*(-10)^(-(VEHICLE=1)) 'MORE SOLID CAR ROTATION CONCEPT 'IF WHEEL TOUCHES THE GROUND, IT'S FINE 'IF WHEEL DOESN'T TOUCH THE GROUND THEN 'IF THE OTHER WHEEL TOUCHES THE GROUND THEN 'THAT WHEEL IS A PIVOT AND IT'LL ROTATE SO THAT THE FIRST WHEEL GOES DOWN 'THE PIVOT IS AT THE CENTER OF MASS, IF RESTRICTED THEN THE PIVOT CHANGES AND THE CENTER OF MASS DETERMINES THE DIRECTION OF ROTATION END IF R1=R1*R NEXT I IF R=1 THEN SPRITE OFF 63 'SPRITE OFF 63 END SUB 'C O L L I S I O N C H E C K S SUB COLL(X,Y,X3,Y3,R,MX,MY,X2,Y2,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+MX+X2+X3)/8) CY=INT((Y+MY+Y2+Y3)/8) C=CELL.C(CX,CY) 'IF C IS A WEDGE WITH A TREE (C=189,C=173) -> REPLACE IT WITH A WEDGE (C=52) COMP= (C=189 OR C=173) C=C*-(NOT COMP)-52*COMP IF (C>=46 AND C<=62 OR C=3 OR C>=120 AND C<=123) THEN 'SPRITE 63,CX*8-MX,CY*8-MY,C SPRITE 63,CX*8-MX-X,CY*8-MY-Y,C SPRITE.A 63,CELL.A(CX,CY) D=ABS(NOT(SPRITE HIT(63,S0 TO S1))) SPRITE 63 PAL 1 'INSPIRED BY WAS8BIT'S SPRITE-BASED IN-CELL COLLISION CHECKS 'THE SPRITE COORDINATES SHOULD BE OFFSET BY THE COLLISION BOX AND THE COLLISION CHECK 'SPRITE.A 63,CELL.A(CX,CY) 'D=ABS(NOT(SPRITE HIT(63,0))) 'SPRITE 63 PAL 4 'IF D=0 THEN 'TRACE X,Y 'WAIT 60 'END IF IF D=0 AND BUTTON(0,0) THEN CELL CX,CY,0 'NOW CALL THE MINING BLOCK STORAGE FUNCTION 'D=0 ELSE D=1 END IF 'IF D=1 THEN SPRITE OFF 'D=1 'A=CELL.A(CX,CY) '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=-(D+Y48 AND C<>3) 'SPRITE-BASED COLLISION MAKES CLIPPING MORE LIKELY TO HAPPEN THAN BUMPING 'THE TERRAIN IS UNEVEN AND SO IS THE COLLISION: ONLY ONE OF THE COLLISION POINTS MAY GET TRIGGERED 'SPRITES AREN'T BOX-SHAPED IF (C>=46 AND C<=62 OR C=3) AND 1 THEN 'INSPIRED BY WAS8BIT'S SPRITE-BASED IN-CELL COLLISION CHECKS 'THE SPRITE COORDINATES SHOULD BE OFFSET BY THE COLLISION BOX AND THE COLLISION CHECK SPRITE 63,CX*8-MX-X,CY*8-MY-Y,C SPRITE.A 63,CELL.A(CX,CY) D=ABS(NOT(SPRITE HIT(63,0))) SPRITE 63 PAL 4 ELSE 'CERTAIN COLLISION BLOCKS SHOULD REMAIN D=0 OTHERWISE THERE'D BE A VOID 'D=1 'SPRITE OFF 63 END IF IF D=0 THEN CALL MINE(CX,CY) 'IF D=0 AND C>=48 AND C<=62 OR C=3 THEN 'ANY COLLISION 'END IF 'IF D=1 AND C>=48 AND C<=62 OR C=3 THEN 'COLLIDING WITH UNCERTAIN CELLS 'CHECK IN-CELL COLLISION 'CALL INCELLCOLL(X,C,A,D) 'D=-(Y CELL ATTRIBUTES 'CHECK COLLISION WITH PIXELS INSIDE A CELL 'FLIP X VALUE F=A\8 MOD 2 'A DIAGONAL LINE, FLIPPED IN THE SAME WAY AS THE CHARACTER RX=(X AND 7)*(F*2-1)+(1-F)*8 'EXPONENT AND ADDRESS E=2^RX ADDR=$8000+C*16 'DETERMINE COLLISION HEIGHT FOR THE CURRENT X FROM CHARACTER DATA FOR I=0 TO 7 'IF THE SELECTED BIT IS HIGH, THEN WE FOUND THE HEIGHT! IF (((PEEK(ADDR+I) OR PEEK(ADDR+8+I))\E) MOD 2)>0 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 'P R O J E C T I L E S 'DO 'PLAYER AND MAP MOVEMENT 'MDX=LEFT(0)-RIGHT(0) 'MDY=UP(0)-DOWN(0) 'MX1=BGX\8 'MY1=BGY\8 'ADD BGX,MDX 'ADD BGY,MDY 'MX=BGX\8-MX1 'MY=BGY\8-MY1 'TRACE MX 'IF BGX<0 THEN BGX=0 'IF BGX>XSIZE*8-161 THEN BGX=XSIZE*8-161 'IF BGY<0 THEN BGY=0 'IF BGY>YSIZE*8-161 THEN BGY=YSIZE*8-161 'SCROLL 0,BGX,BGY 'TRACE BGX\8,BGY\8 'TRACE DX,DY 'BUG MEMORIAL: WHEN X\8 IS DOUBLE, IT LOADS ONE LAYER DOUBLE, AND SKIPS THE NEXT ONE 'TRACE DX,X,X\8,MX 'IF MX>0 THEN 'TRACE MDX,BGX,MX1+20 'IF MX10 THEN CALL TERRAINX(MX1-1,MY1) 'END IF 'IF MY>0 THEN 'IF MY10 THEN CALL TERRAINY(MY1-1,MX1) 'END IF SUB SHOOTING(BGX,BGY,X1,Y1,C) 'SHOOTING CONTROLS IF LEFT(1) THEN SPRITE 0 FLIP 1,0 IF RIGHT(1) THEN SPRITE 0 FLIP 0,0 IF BUTTON(1,0) AND TIMER>TIMER0+10 THEN 'SWITCH THE GUN WHILE BUTTON 1 IS HELD DOWN TIMER0=TIMER ADD C,1,1 TO 7 RELOAD_TIME =TABLE(C-1,0) ACCURACY =TABLE(C-1,1) BULLET_SPEED=TABLE(C-1,2) BULLET =TABLE(C-1,6)+79 END IF 'SPRITE 0,X,Y,C 'SPRITE 0,80,64,C 'X=BGX+80 'Y=BGY+64 X=BGX Y=BGY 'START FIRE SPRITE OFF 1 IF (RIGHT(1) OR LEFT(1)) AND TIMER>TIMER1+RELOAD_TIME THEN TIMER1=TIMER 'GUN SOUND 'SAVE THIS AS A PREDEFINED SOUND (IN CODE OR IN FILE) 'AND CALL A SUB TO PLAY ONE OF THOSE SOUND 0,3,0,10 ENVELOPE 0,0,3,5,8 PLAY 0,40 'MUZZLE FLASH IF LEFT(1) OR RIGHT(1) THEN DIRECTION = LEFT(1)-RIGHT(1) 'DIRECTION = (DIRECTION * -(LEFT(1) OR RIGHT(1))) + LEFT(1)-RIGHT(1) YDIRECTION=UP(1)-DOWN(1) DX=X+TABLE(C-1,7)*DIRECTION +3 +0.5*(DIRECTION-1)*(5+TABLE(C-1,6))+2 DY=Y+TABLE(C-1,8) SPRITE 1,X1+DX-BGX,Y1+DY-BGY,TABLE(C-1,6)+81 SPRITE 1 PAL 6 'BULLET IF C=4 THEN 'SHOTGUN FOR I=0 TO 4 'SHOOT 5 BULLETS CALL SHOOT(BULLETNO,C,ACCURACY,DIRECTION,BULLET_SPEED,DX,DY) NEXT I ELSE 'NOT A SHOTGUN CALL SHOOT(BULLETNO,C,ACCURACY,DIRECTION,BULLET_SPEED,DX,DY) END IF END IF END SUB SUB PROJECTILES(BGX,BGY,SPO) 'UPDATE PROJECTILES FOR I=0 TO 57 'MOVE X BY DX AND Y BY DY ADD PROJ(0,I),PROJ(3,I) ADD PROJ(1,I),PROJ(2,I) 'VSQUARED=PROJ(3,I)*PROJ(3,I)+PROJ(2,I)*PROJ(2,I) 'ADD PROJ(3,I),-VSQUARED 'GRAVITY FOR THE PROJECTILE 'IF PROJ(4,I)=7 THEN ADD PROJ(2,I),0.05 'IF PROJ(4,I)<>0 THEN TRACE PROJ(4,I)-1 IF PROJ(4,I)<>0 THEN ADD PROJ(2,I),TABLE(PROJ(4,I)-1,4) 'ADD GRAVITY FROM STATS PX=PROJ(0,I) PY=PROJ(1,I) PV=PROJ(3,I) C=CELL.C((PX+4)\8,(PY+3)\8) IF PV<>0 AND PX-BGX>-1 AND PX-BGX<160 AND (C=0 OR C>=192) THEN 'AND SPRITE HIT(I+SPO,1)=0 'REFRESH SPRITE I+SPO,PX-BGX,PY-BGY,77-(PROJ(4,I)=5)-2*(PROJ(4,I)=7) SPRITE I+SPO PAL 2+SGN(PROJ(4,I))+3*(PROJ(4,I)=7) FLIP SGN(1-SGN(PV)),0 ELSE 'REMOVE CALL IMPACT(I+SPO) 'CALL THE MINING FUNCTION IF PROJ(3,I)<>0 THEN CALL MINE((PX+4)\8,(PY+3)\8) PROJ(3,I)=0 END IF NEXT I END SUB SUB ENEMIES(BGX,BGY,SPO,X,Y) 'SIMPLE ENEMY CONTROLS 'ENEMY MOVEMENT IF TIMER MOD 2 = 0 THEN 'IF TIMER-LAST_TIME>1 THEN 'LAST_TIME=TIMER FOR I=0 TO 3 IF ENEMY(0,I)9 THEN ADD ENEMY(0,I),-(2*ENEMY(2,I)-80)*0.2*0+1 SPRITE I+2 FLIP 0,0 ELSE IF ENEMY(0,I)>X AND ENEMY(0,I)-X>8 THEN ADD ENEMY(0,I),(2*ENEMY(2,I)-80)*0.2*0-1 SPRITE I+2 FLIP 1,0 END IF IF ENEMY(1,I)Y THEN DEC ENEMY(1,I) IF ENEMY(1,I)=Y AND TIMER-ENEMY(3,I)>2*ENEMY(2,I) THEN ENEMY(3,I)=TIMER CALL ENEMY_SHOOT(I) END IF SPRITE I+2,ENEMY(0,I)-BGX,ENEMY(1,I)-BGY,ENEMY(2,I) SPRITE I+2 PAL 7 NEXT I END IF FOR I=0 TO 3 'ENEMY HIT BY BULLET IF SPRITE HIT(I+2,SPO TO 63) THEN IF PROJ(4,HIT-SPO)>0 THEN 'REMOVE BULLET IF PROJ(4,HIT-SPO)<>6 THEN PROJ(3,HIT-SPO)=0 CALL IMPACT(HIT) END IF 'INITIALIZE ENEMY ENEMY(0,I)=INT(RND*320)+BGX ENEMY(1,I)=INT(RND*256)+BGY ENEMY(2,I)=96+INT(RND*9) END IF END IF NEXT I END SUB SUB SHOOT(A,C,ACCURACY,DIRECTION,BULLET_SPEED,DX,DY) 'INCREMENT BULLET NUMBER ADD A,1,0 TO 57 ADD KNOCKBACK, -DIRECTION*TABLE(C-1,3) '*1+0*(0.5-PROJ(3,A))*0.2 '+0*(0.5-PROJ(3,A))*0.2 'CAN USE "C" TO DETERMINE, KNOCKBACK SHOULD BE ADDED TO THE TABLE RAN=((PHI*A)-INT(PHI*A)-0.5)*ACCURACY R=RAN -PI*(DIRECTION<0)+DIRECTION*-TABLE(C-1,5) '+0*(C=7) '-TABLE(C,5) '(1+TABLE(C,5))*2 '(C=7) PROJ(0,A)=DX-2 PROJ(1,A)=DY PROJ(2,A)=SIN(R)*BULLET_SPEED PROJ(3,A)=COS(R)*BULLET_SPEED PROJ(4,A)=C 'PROJ(2,A)=((PHI*A)-INT(PHI*A)-0.5)*ACCURACY 'PROJ(3,A)=DIRECTION*BULLET_SPEED 'TRACE A END SUB 'ADD YDIRECTION TO PROJ(2,A) SUB ENEMY_SHOOT(I,A) A=(A+1)MOD(61) PROJ(0,A)=ENEMY(0,I) PROJ(1,A)=ENEMY(1,I) PROJ(2,A)=(RND-0.5)*0.1 PROJ(3,A)=SGN(X-ENEMY(0,I))*1 PROJ(4,A)=-ENEMY(1,I) SOUND 0,3,0,10 ENVELOPE 0,0,3,5,8 PLAY 0,5 END SUB SUB IMPACT(S) 'IF PROJ(4,S-3)=5 THEN 'TRACE SPRITE.C(S) IF SPRITE.C(S)=78 OR SPRITE.C(S)=79 THEN 'RPG EXPLOSION CALL ADDGFX(0,10,SPRITE.X(S),SPRITE.Y(S),8+8*(SPRITE.C(S)-78)) SOUND 0,3,0,10 ENVELOPE 0,0,6,5,10 PLAY 0,20 SPRITE OFF S SPRITE S,0,0,0 ELSE SPRITE OFF S END IF END SUB SUB EXPLOSION(X,Y,R) 'PLACE A BUNCH OF SPRITES OF 1X AND 2X SIZE SWITCH THEM RANDOMLY 'BREAK BLOCKS INSIDE THE RADIUS RANDOMLY WITH A PROBABILLITY DEPENDING ON R 'DAMAGE PLAYERS INSIDE THE RADIUS WITH EXPONENTIAL DAMAGE FALOFF BASED ON R 'ANY SORT OF DAMAGE HAS EXPONENTIAL DAMAGE FALOFF DEPENDING ON R 'PLAY SOUND FOR I=0 TO 9 ANG=RND*2*PI LENG=RND*R '+INT(RND*R)*0 '+INT(RND*R)*0 SPRITE 40+I,X+INT(LENG*COS(ANG)),Y+INT(LENG*SIN(ANG)),84 SPRITE 40+I PAL 6 NEXT I R1=R*0.5 FOR J=-R1 TO R1 FOR I=ABS(J)-R1 TO -ABS(J)+R1 CALL MINE(INT((X+I+MX)/8),INT((Y+J+MY)/8)) NEXT I NEXT J END SUB SUB ADDGFX(N,D,X,Y,R) GFX(0,N)=X GFX(1,N)=Y GFX(2,N)=R GFX(3,N)=TIMER+D END SUB SUB DISPGFX FOR I=0 TO UBOUND(GFX,1) IF GFX(3,I)>=TIMER THEN CALL EXPLOSION(GFX(0,I),GFX(1,I),GFX(2,I)+(GFX(3,I)-TIMER)) NEXT I END SUB SUB MSPRITE(N,X,Y,C,TYPE,LIM) 'SPRITE MANAGER EFFICIENTLY DIVIDE THE 64 SPRITES OVER 'PLAYER (TAKES THE FIRST FEW, HAS PRIORITY) 'COLLISION (TAKES THE LAST ONE, HAS PRIORITY) 'ENEMIES 'PROJECTILES 'EXPLOSION GRAPHICS 'IF THERE ARE TOO FEW SPRITES AVAILABLE THEN I MAY NEED TO USE AN ARRAY (OR RAM) SO THAT (PROJECTILE) SPRITES CAN BE HOLDED INSTEAD OF DISAPPEARING 'N -> FIRST SPRITE NO 'TYPE -> TYPE OF SPRITE USER 'LIMIT -> MAX SPRITES OF THIS KIND 'I THINK I SHOULD USE AN ARRAY OR A FEW COUNT VARIABLES TO BE ABLE TO KEEP TRACK OF HOW MANY SPRITES OF EACH TYPE ARE IN USE SPRITE N,X,Y,C END SUB 'A T M O S P H E R E SUB ATMOSPHERE(X,Y) BG 1 IF Y<=1200 THEN 'LOAD SURFACE 'BG COPY 0,0,32,3 TO 0,13 BG SOURCE ROM(10) BG COPY 0,0,32,16 TO 0,0 'PAL 0 'BG FILL 0,16 TO 31,20 CHAR 181 RASTERMODE=1 ELSE IF Y<50000 THEN BG SOURCE ROM(11) BG COPY 0,0,32,32 TO 0,0 'BG FILL 0,0 TO 32,16 CHAR 0 RASTERMODE=0 CLOUDTYPE=1 ELSE IF Y<80000 THEN BG SOURCE ROM(11) BG COPY 0,32,32,32 TO 0,0 RASTERMODE=0 CLOUDTYPE=1 ELSE IF Y<100000 THEN BG SOURCE ROM(12) BG COPY 0,0,32,16 TO 0,0 RASTERMODE=2 'TRACE MY ELSE BG FILL 0,0 TO 32,16 CHAR 0 RASTERMODE=3 END IF 'END IF '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 'SPACE-STATION 'BG COPY 0,3,32,13 TO 0,0 'BG TINT (X+76)\8 MOD 32,(70-16-Y)\8 MOD 32 TO (X+84)\8 MOD 32,(94-8-Y)\8 MOD 32 PAL 2 'BGC=CELL.C((X+80)\8 MOD 32,(70-16-Y)\8 MOD 32) 'IF BGC<>0 AND BGC<>46 THEN 'BG 0 'TEXT 2,15,"FAILED " 'BG 1 'END IF 'Y=408070 'IF INT(Y)=408058 AND INT(X)=4 THEN 'IF ABS(VY)>10 OR ABS(VX)>10 OR A<0.49*PI OR A>0.51*PI 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,15,,, 'ATMOSPHERE=-1 'PLANET=-1 ELSE IF Y<20000 THEN PALETTE 0,11,,, 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 1 PAL 3 NUMBER 13,0,Y,7 NUMBER 13,1,X,7 BG 0 END SUB SUB CLOUD(X,Y,N,F) FLIP F,0 IF N=0 THEN '16,17,18 CELL X ,Y,16+2*F CELL X+1,Y,17 CELL X+2,Y,18-2*F ELSE IF N=1 THEN '165,166,181,182 CELL X ,Y ,165+F CELL X+1,Y ,166-F CELL X ,Y+1,181+F CELL X+1,Y+1,182-F END IF FLIP 0,0 END SUB 'SUB RASTERFX 'ZOOM OUT VERTICAL AXIS 'SCROLL 0,SCROLL.X(0),RASTER 'SCROLL 1,SCROLL.X(1),RASTER 'END SUB 'R A S T E R E F F E C T S SUB RASTERFX IF RASTERMODE=0 THEN MYO=0.01*MY IF RASTER<16 THEN 'PLAYER STATS SCROLL 1,0,0 'ELSE IF RASTER+MYO<16 THEN 'SCROLL 1,0,-RASTER ELSE SCROLL 1,0.01*MX,MYO END IF ELSE IF RASTERMODE<=1 THEN MYO=0.1*MY IF RASTER<16 THEN 'PLAYER STATS SCROLL 1,0,0 ELSE IF RASTER+MYO<16 THEN SCROLL 1,0,-RASTER ELSE IF RASTER+MYO<88 THEN 'MOUNTAINS SCROLL 1,MX*0.01,MYO ELSE IF RASTER+MYO<112 THEN 'VALLEY 'PALETTE 5,0,24-5*(RASTER+MYO<94)-(RASTER+MYO<100)+16*(RASTER+MYO<106),9,8 'PALETTE 5,0,24,9,8 'PALETTE 5,0,24,20,36 'PALETTE 5,0,14,8,9 'PALETTE GOES LIKE 24,8,9,14 'RASTER-88 SCROLL 1,MX*(RASTER+MYO-88)*0.01,MYO ELSE 'PLAYER ITEMS 'SCROLL 1,0,0 IF RASTER=127 THEN COPY ROM(1),SIZE(1) TO $FF00 END IF ELSE IF 1 THEN MYO=0.0032*(MY+80000) 'TRACE MYO IF RASTER<16 THEN 'PLAYER STATS SCROLL 1,0,0 ELSE IF RASTER+MYO<16 THEN 'OUT OF VIEW 'TRACE "O" SCROLL 1,0,-RASTER ELSE IF RASTER+MYO<128 THEN 'TRACE "S" SCROLL 1,0,MYO END IF END IF 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 'T=0 XO=X AND 31 YO=Y AND 31 'L O A D T E X T F R O M A R R A Y IF (T\1) MOD 2 THEN 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 END IF 'L O A D B G F R O M F I L E ( N X ) IF (T\2) MOD 2 THEN 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 END IF 'C O M P A C T M A P F I L E T Y P E (WIP) IF (T\4) MOD 2 THEN '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 CALL LOADBLOCKS(X,Y,ADDR,T,D) END IF 'B G F I L L F I L E IF (T\8) MOD 2 THEN 'A SET OF COORDINATES AND SIZE VALUES (BG FILL) END IF 'S T R U C T U R E S IF (T\16) MOD 2 AND 0 THEN 'SMALL BACKGROUND FILES THAT CAN BE SPAWNED AT MULTIPLE COORDINATES 'THESE CAN BE IMAGES LIKE TREES AND BUILDINGS 'IS MOVED TO INSIDE A GENERATOR 'FOR I=0 TO 7 'CALL FOR A STRUCTURE 'A=0 'CALL RANDOM(1,X+0.1,A) 'IF I MOD 2=-(DIRECTION=-1) AND INT(A)=1 THEN 'CALL SPAWNSTRUCTURE(I+(DIRECTION=-1),Y-2-(R1>0),0,BIO) 'END IF 'NEXT I END IF 'R A N D O M W A L K P R O C E D U R A L T E R R A I N IF (T\32) MOD 2 THEN IF Y\8=0 THEN CALL RANDOMWALK(X\8,D) END IF 'P R O C E D U R A L T E R R A I N IF (T\64) MOD 2 THEN '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) 'BITWISE AND (MODULO LIKE, BUT WORKS ALSO FOR NEGATIVE NUMBERS) RO=R AND 31 IF R>=Y AND R<=Y+7 THEN 'THESE CHUNKS HAVE THE SURFACE LINE IN THEM PAL 0 BG FILL XO+I,RO TO XO+I,YO+7 CHAR 48 'AVOIDS THE GROUND FROM LOOKING LIKE TILES CALL RANDOMFLIP(XO+I,RO,YO+7) PAL 0 'MAKES TERRAIN LOOK SMOOTH CALL TERRAINMASK(I,XO,YO,RO,STAT) 'VIEW CHUNK BORDERS 'CELL XO,YO,129 'CALL FOR A STRUCTURE A=0 CALL RANDOM(1,XO+I+0.2,A) IF I MOD 2=1 AND INT(A)=1 THEN MUP=0 'CHECK FOR FLIP1 = 0,0 AND FLIP2 = 1,0 WHILE MUP>-8 AND (CELL.C(XO+I,RO+MUP)=48 OR CELL.C(XO+I,RO+MUP)=49 OR CELL.C(XO+I-1,RO+MUP)=48 OR CELL.C(XO+I-1,RO+MUP)=49) DEC MUP WEND 'MUP=0 'WAIT 60 CALL SPAWNSTRUCTURE(XO+I-1,RO-1+MUP,0,0) END IF ELSE IF R-10 OR 0)) OR 0 THEN 'CALL BUILDING(XO,RO-4,6,4,3,4) 'CALL BUILDING(XO,RO-4,6,4,1,1) 'INT(A2)+INT(A3)+INT(A4) CALL BUILDING(XO,15,8,4,1,INT(A2*2)) 'CELL XO,YO,129 END IF END IF 'USE RANDOM SQUARE WAVES (0 OR 1): S1*(S2+S3+S4), THE OUTPUT IS THE HEIGHT, THEY ALWAYS START AT THE SAME HEIGHT 'P R O C E D U R A L O R E S IF (T\256) MOD 2 THEN END IF 'P R O C E D U R A L C A V E S IF (T\512) MOD 2 THEN END IF 'TYPES CAN BE COMBINED: SO, YOU COULD HAVE AN NX BG FILE FOR THE SPAWN CHUNKS WITH PROCEDURAL TERRAIN OUTSIDE OF IT, WITH BUILDINGS WITH PROCEDURAL PLATFORMS INSIDE WITH STRUCTURES AND MANUAL TERRAIN EDITS USING THE MORE EFFICIENT BG FILE TYPE END SUB 'P L A Y E R - P L A C E D B L O C K S SUB MINE(X,Y) CELL X,Y,0 'CALL BLOCKS END SUB SUB LOADBLOCKS(X,Y,ADDR,T,D) 'BLOCKS ARE PREDEFINED CHARACTERS+PALETTES 'FOR Y1=0 TO 2 'FOR X1=0 TO 2 CALL PREPAREBLOCKS(X,Y,AX,AY,BX,BY) 'FIND BIG CHUNK, IF NOT FOUND: LOAD NOTHING 'FIND SMALL CHUNK, IF NOT FOUND: LOAD NOTHING CALL FINDBLOCKS 'LOAD BLOCKS 'ADDRESS ADDR1=1 TYPES=1 FOR I=0 TO 1 'ONE BYTE X, ONE BYTE Y, IN-BIG-CHUNK COORDINATES 'THE TYPE BYTE HAS ONE BIT FOR "BIG CHUNK" AND 8 DIFFERENT SIZE PRESETS, AND 16 DIFFERENT BLOCK-SET PRESETS FOR K=0 TO TYPESIZE V=PEEK(ADDR1) FOR J=0 TO 7 BUFFER(J)=((V\(2^J))MOD 2)*2^K NEXT J NEXT K FOR J=0 TO 7 CALL DRAWBLOCK(TYPE,BUFFER(J),AX+BX+J MOD 4,AY+BY+I*2+J\4) NEXT J NEXT I END SUB SUB DRAWBLOCK(T,S,V,X,Y) 'USING T, S, V (TYPE, SIZE, AND VALUE) TO GENERATE: 'C= 'P= 'DRAW ON MAP 'PAL P 'CELL X,Y,C END SUB SUB SAVEBLOCKS 'BLOCKS ARE PREDEFINED CHARACTERS+PALETTES CALL PREPAREBLOCKS(X,Y,AX,AY,BX,BY) 'FIND BIG CHUNK, IF NOT FOUND: CREATE NEW CHUNK 'FIND SMALL CHUNK, IF NOT FOUND: CREATE NEW CHUNK CALL FINDBLOCKS 'WRITE BLOCKS TO FILE (PRESERVE PREVIOUS DATA OF THIS CHUNK) CALL INSERTDATA(A,S) 'FILE: 'BIG CHUNK: '- 1 TYPE (CONSTANT) (COULD ALSO HAVE SOME PRESETS LIKE: OPTIMIZE DATA FOR MINING) '- 4 =2X2 COORDINATES (GENERATED FROM INPUTS) '- 2 SIZE (BIG CHUNK HEADER SIZE OR LAST SIZE)+ SMALL CHUNK SIZE) (OR GENERATED FROM ADDR) '- (1) HALFWAY CHUNK ADDRESS (WHICH IS AN OFFSET OF ADDR0+0.5*SIZE) '- (1) CHUNK COUNT 'SMALL CHUNK: '- 1 TYPE (CONSTANT + READ AND ANALYZE AT RAM ADDRESS FROM INPUT) '- 2 =2*1 COORDINATES (GENERATED FROM INPUTS) '- 2 4*4 BIT DATA (RAM ADDRESS FROM INPUT) 'BUILD CHUNK: (EXTENTION OF SMALL CHUNK, CALLED FROM TYPE) '- 1 TYPE (CONSTANT + READ AND ANALYZE AT RAM ADDRESS FROM INPUT) ' (TELLS WHERE THE NEXT SMALL CHUNK IS) '- (2) [SIZE IS ALREADY KNOWN] '- 4 =(4*4 BIT)*2 DATA END SUB SUB PREPAREBLOCKS(X,Y,AX,AY,BX,BY) 'BIG CHUNK (1024X1024 CELLS OR 256X256 SUB CHUNKS) AX=INT(X/1024) AY=INT(Y/1024) 'SUB CHUNK (4X4 CELLS) BX=INT((X AND 1024)/4) BY=INT((Y AND 1024)/4) END SUB SUB FINDBLOCKS(X,Y,A1,A2) 'FIND BIG CHUNK, RETURN ADDRESS, IF NOT FOUND: RETURN SUITABLE INDEXED ADDRESS AND NULL 'FIND SMALL CHUNK, RETURN ADDRESS, IF NOT FOUND: RETURN SUITABLE INDEXED ADDRESS AND NULL DO 'GET TYPE V=PEEK(A1) IF V\128=1 THEN 'BIG CHUNK CHUNKS=(V MOD 128)*256+PEEK(A1+1) XCB=PEEKW(A1+2) YCB=PEEKW(A1+4) IF INT(X/1024)=XCB AND INT(Y/1024)=YCB THEN 'GO TO FIRST SMALL CHUNK 'ADD A1,6 'GO TO MIDDLE SMALL CHUNK ADD A1,6+5*(CHUNKS\2) CHUNKS1=CHUNKS A2=A1 ELSE IF INT(Y/1024)0 THEN FOLL=0 ADD A1,5 ELSE 'CHUNK FOUND, HAS NO FOLLOWERS STATUS=3 A3=A1 EXIT END IF ELSE XC1=INT((X AND 1024)*0.25) YC1=INT((Y AND 1024)*0.25) VC1=XC1+256*YC1 VC=XC+256*YC 'VC1 SCAN UP 'VC1>VC -> SCAN DOWN CHUNKS2=CHUNKS1 CHUNKS1=INT(CHUNKS1*(1+0.5*SGN(VC1-VC))) IF CHUNKS2=CHUNKS1 THEN 'NO STEP, NOT FOUND STATUS=2 A3=A1 EXIT END IF ADD A1,5*CHUNKS1 END IF ELSE 'FOLLOWER 'WE DON'T CARE ABOUT FOLLOWERS RIGHT NOW STATUS=3 A3=A1 EXIT DISTANCE=(V MOD 64)\16 BLOCKP=V MOD 16 D1=PEEK(A1+1) D2=PEEK(A1+2) D3=PEEK(A1+3) D4=PEEK(A1+4) 'CALL DECODE DATA 4 INC FOLL IF SIZEP>FOLL THEN ADD A1,5 ELSE EXIT END IF END IF LOOP END SUB SUB INSERTDATA(A1,S,A2,S2) COPY A2,S2 TO A2+S COPY A1,S TO A2 'SAVE AND INDEX: 'FIND THE PLACE IN RAM (IS ALREADY DONE) 'GET THE SIZE OF THE DATA THAT NEEDS TO BE SAVED 'OFFSET ALL DATA AFTER IT BY "SIZE_VARIABLE" BYTES USING "COPY" 'FILL THE GAP WITH THE DATA TO BE SAVED END SUB 'T E R R A I N E N H A N C E M E N T SUB RANDOMFLIP(X,Y1,Y2) FOR I=Y1 TO Y2 TINT X,I FLIP INT(RND*2),INT(RND*2) NEXT I END SUB SUB TERRAINMASK(I,XO,YO,RO,STAT) FDX1=SHIFTREG(2)-SHIFTREG(3) FDX2=SHIFTREG(1)-SHIFTREG(2) FDX3=SHIFTREG(0)-SHIFTREG(1) DX1=INT(FDX1) DX2=INT(FDX2) DX3=INT(FDX3) 'TRACE DX3 FLIP -(DX2<0),0 ADX1=ABS(DX1) ADX2=ABS(DX2) ADX3=ABS(DX3) 'TRACE ADX2 DY=0 ODX=0 'C=49-3*(ADX2>=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 'PRINT OUT THE TERRAIN SLOPE LEVEL VALUES '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 'CURRENTLY IN USE V=SIN(S*SIN(S)) V=INT(V*5)\3 'V=INT( SIN(S*SIN(S)) *5)\3 ELSE IF A=-1 THEN 'DERIVATIVE OF ALGORITHM 1 (COULD BE USED FOR COLLISION) V=COS( S*SIN(S) )*( S*COS(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 'S T R U C T U R E S 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,174 CELL X,Y+1,190+(CELL.C(X,Y+1)<>0) FLIP 0,0 CELL X+1,Y,174 CELL X+1,Y+1,190+(CELL.C(X+1,Y+1)<>0) ELSE IF N=0 AND BIO=2 THEN 'FLAT '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 'P L A T F O R M S A N D B U I L D I N G S SUB BUILDING(X1,Y1,WB,HB,NX,NY) 'NX=1 'NY=1 PAL 1 'WALLS EY=Y1-NY*HB EX=X1+NX*WB 'BG FILL X1,EY TO EX,Y1 CHAR 020 FOR I=0 TO NX BG FILL X1+I*WB,EY TO X1+I*WB,Y1 CHAR 94 NEXT I 'FLOORS FOR I=-NY TO 0 BG FILL X1,Y1+I*HB TO EX,Y1+I*HB CHAR 123 NEXT I PAL 0 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 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 'SURFACE PALETTES '#1:MAIN PALETTES '0F181424002E1E2D00152A1F002F1A05 '1F0B150000060115003E3834003F0500 'SPACE PALETTES '#1:MAIN PALETTES '001B171600383410003F3D3E003F3C00 '00150C3F0008073F003F2A15003F3C00 #1:MAIN PALETTES 0F181424002A153C00152A1F002F1A05 1F0B1500002E1E1D003E3834003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 F7CC3F8DE7F067A80033C07F9FFFDCF7 0103050F172B0C270000020109177FDF 5E70EBF7A928BB62FFFFFFFFFFFFFFFF 00010F1F2D7FDFF700010F1F3D7FDFFF E4FFEF7FFFF7BFFFE4FFEFFFFFFFBFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0101030307070F1F0101030307070F1F 001E3A3E6E7EFBDF001E3E3E6E7EFBFF 80E1FFBDFFFFDFFF80E1FFBFFFFFFFFF 0303070F0B1E7FF70303070F0B1E7FFF 1F3F3F7F7B7E7FF71F3F3F7F7B7E7FFF 0101030303061FFB0101030303061FFF FF7FEFFF3F7FFDFFFF7FEFFF3F7FFFFF FF3F3F3D3F6F7FFFFF3F3F3D3F7F7FFF FFFFBFFDFFDFFFFFFFFFBFFFFFFFFFFF 00000000075FFFFF0000000000000000 0000023FFFFFFFFF0000000000000000 00000020E0F8FCFE0000000000000000 00000000000000000000000000000000 FFFE77FFFF6FCFFD0001880000903002 FFFE77FFFF6FCFFD0001880000903002 1F72712FFF61F6ADE08D8ED002DE0952 3B401E455D67F8ADC4BFE3BEA2986752 304120451003802DCFBEFFBAEFFF7FD2 3C70F67FF170703FFFFFF9BFFFBFBFFC 19427108AF2192A1E6BD8EF750DE6D5E F6C5DF3DFBBFFFCCFFFFFFFFFFFFFFFF F69B1F63BBE5EE9FFFFDFFFFDFBEF7FF FFFFDFFBFFBFFFF761EEB8B5EF7CD93B 00000000000000000000000000000000 0107071D3F3F77FF0107071D3F3F7FFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1C01A10A018012C00000000000000000 FC87D53E45FA1AC40018000000004008 FCBBFF663D87F29303000018C0080C00 BCE789FF31EC779943187700CE13C866 7FE4FF37F6DF3D6FFFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00071C71CC9B84700000030E377FFB9F 00000000000000000000000000000000 B7EBA87561BFAC77FFFDFFFFFFFFDFFF E43FBCCFA176CD3F00C04374FF9FFFFB 80E1FF3FC6609F7E000020C3B9FFECD9 00010F143369DC3B0000000B0D173BF7 0107061C33255ED5000001030E1F273F 0203060C0A1164CF01000103050E1F39 0101030202071DE3000000010100021E 1F3037696B4B5BD7030F0C1F173D3F3B 0101020306040A1A0000010001030507 001A32226A4ED7CC00040C1C14382C7F 00C1C7793481F718000001C6CB7F9FE7 000000000C3663B50000000000081E5E 181315173C375FCA070E0E0D0B0C2535 01060C091B162ACC00010306070B1D33 0000000001043BA6000000000003047B 00007EFFFFFFFF7E00007EFFFFDBFF7E 303070F880063030302070F8FE783030 30307040683030303020707C78303030 30307070783030303020707C78303030 303070406C3030303020707E74303030 30300008703030303020FEFE70303030 303070406830303030207C7F78303030 30307070703030303020707070303030 303070406830303030207C7F7C303030 30307040683030303020707E7C303030 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000018000000000000001800000000 000000C0C00000000000007878000000 00102810080000000000102830100000 00000000000000000000000000000000 0000004000000000000040A040000000 00000060600000000000609090600000 00000000000000000000000000000000 0842183CBD584210085A2442C3245A10 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 97864006511BA0926879BFF9AEE45F6D CD66BB947BA4FF2AFEFF776B845B00D5 00423C1800000000E7423C100C000000 0000307E78007E000000307E78FFFD7E 040E07020044AA44040E070A107CEE44 000000003C787CAA000000003C7F7CFE 000000181CFF817E061E78E040FFE77E 20737634100078B43F7070703C2078FC 00000A9EFF0E000100000C9DFF0E0F06 0070F8E073F8B4FC0070F8FF7CF8FCFC 00031E3D0E7388F800037EC4FE73D8F8 007E3C0000000000E77E381E00000000 0000000000FF837E0000307E78FFFD7E 000024180000000066C324180C000000 3FFEFF9800AAEE443FE6CFFCEE000000 007FFE9800AAEE44007FC6FCEE000000 00000000000000000000000000000000 00000000000000000000000000000000 0000001818000000105A3C67E63C5A08 18181818181818181818181818181818 000000FFFF000000000000FFFF000000 181818F8F0000000181818F8F0000000 0000FFFFFFFF00000000FFFFFFFF0000 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C 7C7C7C7C7C7C7C7C0000002810280000 000000FFFFFFFFFF0000000014081400 0000000000000000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF07CFFFFFFFFFFFFF CC66000000000000FFFFFFFFFFFFFFFF CC66330000000000FFFFFFFFFFFFFFFF 01010204182040800204081000101060 49291E28042040004A2C1C28141010E0 000619E00000FFFFFFF9E61FFFAAFFFF 000000F30C00FFFFFFFFFF0CF3AAFFFF FFFFFFFFFFFFFFFF0000000000000000 AA55AA55AA55AA5555AA55AA55AA55AA 0000000000000000FFFFFFFFFFFFFFFF 0000000000000000187E7EFFFF7E7E18 00000000000000003C7EFFFFFFFF7E3C 301C59BEFD3A6C2C3C66E7C183C7563C 00000000000000000000000000000000 187E7EFFFF7E7E18187E7EFFFF7E7E18 00000000000000000000000000000000 18000EF2421C2018247EF10DBDE35E24 00000000000000000000000000000000 18000EF2421C2018247EF10DBDE35E24 00000000000000000000000000000000 80000000000000008000000000000000 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000 18000EF2421C2018247EF10DBDE35E24 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000 181C3E7EFE3C1C003C7EE3C3C3C36E3C 00282800447C18000000000000000000 000078F878000000000078C878000000 00000000000000000000000000000000 00040602000000000838604006040000 7050F0C0E3FEDB7E0030003F1C7EE77E 00000038702370F8000000387F3C70F8 00000000001E0F0000000000F8FEFF7C 00000000207E18000000000000006666 3038381018007E001800070C007EC37E 3C7EE7C3C3E77E3C3C7EFFFFFFFF7E3C 003D38327C00000000C0C0C080000000 000010C0000000000000000000000000 FF003070E000000000043E7FFFFF7E00 E0000000000000000000060EFC800000 0000000000000F3F0000000000000F3F 000000000000FFFF000000000000FFFF 0000000E1E3EFCFC0000000E1E3EFCFC 1060434E1C1A34200000000000000000 00C0C60C481810200000000000000000 000038787100000000013F7FFFFF7F00 00001F00FE00000000FFFFFFFFFFFE00 003D38327C00000000C0C0C080000000 000010C0000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 99DB7D3F172B0C2798D87A3109177FDF 000040208080201080C0A0D07860D0E8 800070C058C074C460F08838A43C8838 000000007F40201F0103FF077F7F3F1F 00000000FF0102FCE0F0F8F8FFFFFEFC 7FFFFF7F000000007FFFFF7F00000000 8F0787C200000000FFFFFFFE1C0C0000 F8F0C00000000000F8F0C00000000000 21634001060200000000000000000000 00000808100000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0003000000000000003F3F1F07000000 00C0F0780000000000C0F0F8F8000000 0143550F17AB8C27FCB0AAF1E997FFDF 0040500800808080FCB0A8F4FE808080 F02840E0008080800CD0B810E0808080 #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 #6:MORE CHARACTERS 00000000000000000000000000000000 F7CC3F8DE7F067A80033C07F9FFFDCF7 0103050F172B0C270000020109177FDF 5E70EBF7A928BB62FFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000001030000000000000103 070F1F3E7CF8F0E0070F1F3F7FFFFFFF 00003C3C3C3C0000FFFFC3C3C3C3FFFF 001E1E1E1E000000FFE1E1E1E1FFFFFF 3C3C3C3C3C3C3C3CFFFFFFFFFBFFFFFF AA80AA80AA80AA80D5FFD5FFD5FFD5FF 000000000000008000000000000000FF 18183838381818180008000000000000 00000000000000000000000000000000 FFCDFFB0400020000032004FBFFFDFFF 0103070E1C3870E00000000103070F1F 0086440000500200FFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 031F7FFFFFFF3F00031F7FFFFFFF3F00 FFF8F0FFE1C3FF00FFFFFFFFFFFFFF00 FE1C3860C0800000FEFCF8E0C0800000 0000000000000000FF00000000000000 7F808080808080807FFFFFFFFFFFFFFF 0000000000000000FE01010101010101 00000000000000000000000000000000 FFCDFFBFF7F3FDFF0032004F9FFFDFFF 00000000000000000000000000000000 FFFDDFDBFFFFBDFFFFFFFFFFFFFFFFFF FFFFFB7FFFCFFF7EFFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000204010104080103050B1E060B17 000040208080201080C0A0D07860D0E8 01000E031A032E23060F111C253C111C 800070C058C074C460F08838A43C8838 000103060103060D010204091E040912 80C1E3F6E1E3F7EF010204091E040810 80C0E0F0F8E0F0F80000000000000000 FF818181818181FF00818181818181FF 0000000000000000808080808080807F 000000000000000001010101010101FE 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 102456D873460C24FFFFFFFFFFFFFFFF 912556C863468825FFFFFFFFFFFFFFFF 5E70EBF7A928BB62FFFFFFFFFFFFFFFF 00020A10000101013F0D152F7F010101 0040500800808080FCB0A8F4FE808080 0F14020700010101300B1D0807010101 F02840E0008080800CD0B810E0808080 03070D1B000101013C0812247F010101 C3F7EFDF038181813C081020FC818181 FCF0B8DCFE8080800000402000808080 060E0070F8D8F870070F1F77FCF8F870 0000000E1F1B1F0EF0F0F8EE3F1F1F0E FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 3C7EE7C3C3E77E3C3C7EFFFFFFFF7E3C 003D38327C00000000C0C0C080000000 000010C0000000000000000000000000 FF003070E000000000043E7FFFFF7E00 E0000000000000000000060EFC800000 0000000000000F3F0000000000000F3F 000000000000FFFF000000000000FFFF 0000000E1E3EFCFC0000000E1E3EFCFC 000000000000000000000000000103FF 00000000000000000000000000E0F0F8 000038787100000000013F7FFFFF7F00 00001F00FE00000000FFFFFFFFFFFE00 003D38327C00000000C0C0C080000000 000010C0000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 99DB7D3F172B0C2798D87A3109177FDF 000040208080201080C0A0D07860D0E8 800070C058C074C460F08838A43C8838 0003000000000000003F3F1F07000000 00C0F0780000000000C0F0F8F8000000 7FFFFF7F000000007FFFFF7F00000000 8F0787C200000000FFFFFFFE1C0C0000 F8F0C00000000000F8F0C00000000000 007F40201F000000077F7F3F1F000000 00FF0102FC000000F8FFFFFEFC000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0143550F17AB8C27FCB0AAF1E997FFDF 0040500800808080FCB0A8F4FE808080 F02840E0008080800CD0B810E0808080 #8: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 00071C71CC9B84700000030E377FFB9F 00000000000000000000000000000000 B7EBA87561BFAC77FFFDFFFFFFFFDFFF E43FBCCFA176CD3F00C04374FF9FFFFB 80E1FF3FC6609F7E000020C3B9FFECD9 00010F143369DC3B0000000B0D173BF7 0107061C33255ED5000001030E1F273F 0203060C0A1164CF01000103050E1F39 0101030202071DE3000000010100021E 1F3037696B4B5BD7030F0C1F173D3F3B 0101020306040A1A0000010001030507 001A32226A4ED7CC00040C1C14382C7F 00C1C7793481F718000001C6CB7F9FE7 000000000C3663B50000000000081E5E 181315173C375FCA070E0E0D0B0C2535 01060C091B162ACC00010306070B1D33 0000000001043BA6000000000003047B 00007EFFFFFFFF7E00007EFFFFDBFF7E 00000000000000000000000000000000 00010F1F2D7FDFF700010F1F3D7FDFFF E4FFEF7FFFF7BFFFE4FFEFFFFFFFBFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0101030303061FFB0101030303061FFF FF7FEFFF3F7FFDFFFF7FEFFF3F7FFFFF FF3F3F3D3F6F7FFFFF3F3F3D3F7F7FFF 00000000000000000000000000000000 0107071D3F3F77FF0107071D3F3F7FFF 0303070F0B1E7FF70303070F0B1E7FFF 1F3F3F7F7B7E7FF71F3F3F7F7B7E7FFF 0101030307070F1F0101030307070F1F 001E3A3E6E7EFBDF001E3E3E6E7EFBFF 80E1FFBDFFFFDFFF80E1FFBFFFFFFFFF 00000000000000000000000000000000 FFFFBFFDFFDFFFFFFFFFBFFFFFFFFFFF 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 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E4FFFFFFFFFFFFFFE4FFFFFFFFFFFFFF 80E1FFFFFFFFFFFF80E1FFFFFFFFFFFF 00010F1F3F7FFFFF00010F1F3F7FFFFF 0107071F3F3F7FFF0107071F3F3F7FFF 0303070F0F1F7FFF0303070F0F1F7FFF 0101030303071FFF0101030303071FFF 1F3F3F7F7F7F7FFF1F3F3F7F7F7F7FFF 0101030307070F1F0101030307070F1F 001E3E3E7E7EFFFF001E3E3E7E7EFFFF 80818183C3E3F7FF80818183C3E3F7FF 000000000C3E7FFF000000000C3E7FFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFFFFFFF0000000000000000 AA55AA55AA55AA5555AA55AA55AA55AA 0000000000000000FFFFFFFFFFFFFFFF 0000000000000000187E7EFFFF7E7E18 00000000000000003C7EFFFFFFFF7E3C 301C59BEFD3A6C2C3C66E7C183C7563C 00000000000000000000000000000000 187E7EFFFF7E7E18187E7EFFFF7E7E18 00000000000000000000000000000000 18000EF2421C2018247EF10DBDE35E24 00000000000000000000000000000000 18000EF2421C2018247EF10DBDE35E24 00000000000000000000000000000000 80000000000000008000000000000000 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000 18000EF2421C2018247EF10DBDE35E24 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000 181C3E7EFE3C1C003C7EE3C3C3C36E3C #10:BG 00002010000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000100711071207000000000000 00000000000000000000000000000000 00000000000000000000000010071107 12070000000000000000100711071207 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000140D140D141D14051405141D0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000141D1405140D140D00000000 141D140D1405141517051705141D141D 00000000140D140D1405141D00000000 140D140D1415141D1415140D00000000 0000140D1405141D171D171D171D171D 171D1405141D1705170517051705171D 171D171D171D171D140514050000140D 140D171D170D170D170D1705140D0000 17051705171D171D171D171D171D171D 171D170D170517051705171D171D1705 171D1705170517051705171D1705171D 17051705171D17051715171517151715 171D1705171D171D171D171D1705170D 1705170D170D17051705170517051705 1715171D171517051705171D17051705 1705171D1715171D171D17051715170D 1715171D290529152905290529052905 29152915290529052905290529052905 290529152905290529052905291D291D 2915290D29052905290D291529152915 29152915291D291D291D291D290D291D 291D291D291D290D290D291D291D291D 29052905290529052905290529052905 2905290D29052915291529052905290D 291D290529052905290529152915290D 291D2905291D2905290D29052905291D 290D290D291D291529052905290D290D 290D290D2915291529152915291D291D 291D2915291529152915291529152915 290D290D290D290529052905290D2915 2915291D291D29052905290D291D2915 29152915290529052905291D290D290D 290D2905290D290D2915290D2915290D 290D290D290D290D290D290D2915290D 290D290D290D290D290D290D291D2905 2905290D290D29152915291D291D291D 29052905 #11:CHARACTERS 00002040000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000120F110F100F 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000000120F 110F100F000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000010071107120700000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 120F110F100F00000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000120F110F100F0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000120F110F100F00000000 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 00000000000000000000120F110F100F 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 000000000000B61FB51F000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000B51FB51F0000 00000000000000000000000000000000 0000B517B61700000000000000000000 00000000000000000000000000000000 000000000000000000000000A51F0000 00000000000000000000000000000000 B517A517A61700000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 A517A617000000000000000000000000 00000000000000000000B517B6170000 00000000000000000000000000000000 0000000000000000000000000000B517 A517A617000000000000000000000000 0000000000000000B517A517A6170000 00000000000000000000000000000000 0000000000000000000000000000A517 A6170000000000000000000000000000 0000000000000000A517A517A6170000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000A507A60700000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000B507B60700000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000B517B517B61700000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000A517A517A61700000000 000000000000000000000000B517B617 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000000000000000A517A617 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000B517A5170000 00000000000000000000000000000000 00000000B517B6170000000000000000 00000000000000000000000000000000 00000000000000000000A51700000000 00000000000000000000000000000000 0000B517A517A6170000000000000000 0000000000000000B61FB51FB51F0000 00000000000000000000A51700000000 00000000000000000000000000000000 0000A517A61700000000000000000000 000000000000B517A61FA51FA51F0000 00000000000000000000000000000000 00000000000000000000000000000000 0000A517A61700000000000000000000 00000000B61FB61FA61FA51FA51F0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000A61FA61FA51FA51FA51F0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000A61FA51FA51FA51FA51F0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000A61FA51FA51F00000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000A517A61700000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 B61FB61FB51F00000000000000000000 00000000000000000000000000000000 00000000000000000000B61FB51F0000 0000000000000000000000000000B61F A61FA61FA51F00000000000000000000 00000000000000000000000000000000 0000000000000000B61FA61FA51F0000 0000000000000000000000000000A61F A61FA51F000000000000000000000000 00000000000000000000000000000000 000000000000A51FA61FA51F00000000 0000000000000000000000000000A61F A51F0000000000000000000000000000 00000000000000000000A507A5070000 00000000A61FA51FA61FA51F00000000 0000000000000000000000000000A61F A51F0000000000000000000000000000 000000000000A507A507B5070000B607 00000000A61FA51FA51F000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000A507B507B5070000B6070000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000B50700000000000000000000 00000000000000000000000000000000 00000000 #12:BG 00001410000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000060206020602 06020602060206020602060206020602 06020602060200000000000006020602 06020602800480048004800480048004 80048004800480048004800406020602 06020602800480048004800480048004 80048004800480048004800480048004 80048004800480048004800480048004 80048004800480048004800780078000 80008000800480048004800480048004 80048004800480048004800480048004 80048000800080078007800080008004 80048004800480048004800480008000 80048004800780048004800480008007 80078007800780008004800480048004 80048004800780078000800780078007 80078004800080008000800080008007 80008000800780078004800480078000 80088008800080008004800480048004 80048000800080008000800080008000 80008004