'GUI LIBRARY 'SUBPROGRAMS FOR BUTTONS SWITCHES, SLIDERS AND A 7 SEGMENT DISPLAY 'YOU'RE FREE TO USE THESE IN YOUR OWN CODE 'THE GUI LIBRARY ONLY HANDLES LOGIC (AND PALLETTES AND SLIDER-SPRITES), THE BUTTON CHARACTERS SOULD BE DRAWN IN A BG WRITING PROGRAM LIKE GFX DESIGNER 'IF YOU WANT, YOU COULD USE THE BUTTON-CHARACTERS USED FOR THIS DEMO 'EACH GUI ELEMENT IS UPDATED ONCE EACH FRAME, TO INCREASE PERFORMANCE (IF YOUR PROGRAM NEEDS THOSE IMPROVEMENTS) YOU COULD DIVIDE THEM UP IN SCREEN REGIONS 'TO DO 'SCROLLING-CHUNK-LOADER 'SETUP 'INCREASE THE SIZE OF THIS ARRAY IF YOU NEED MORE THAN 32 GUI ELEMENTS DIM GLOBAL IN(31) GLOBAL CX,CY,TOUCHED,PRESSTIME,XTEMP,YTEMP,XTEMP1,YTEMP1,MENU,VX,VY,TIMEVAL,TRANSITION BG COPY 0,0,20,16 TO 0,0 BG 1 BG COPY 20,0,5,32 TO 20,32 BG 0 TOUCHSCREEN '7-SEGMENT DISPLAY LOGIC FOR I=0 TO 63 READ V POKE $D000+I,V NEXT I DATA 82,82,82,82 DATA 64,80,64,80 DATA 67,83,83,67 DATA 67,83,67,83 DATA 81,81,65,81 DATA 83,67,67,83 DATA 83,67,83,83 DATA 66,82,64,80 DATA 83,83,83,83 DATA 83,83,67,83 DATA 83,83,81,81 DATA 81,65,83,83 DATA 82,66,82,66 DATA 65,81,83,83 DATA 83,67,83,67 DATA 83,67,81,65 XTEMP=0 YTEMP=0 XTEMP1=0 YTEMP1=0 MENU=0 VX=0 VY=0 TIMEVAL=0 TRANSITION=0 'SET THE TYPE HERE: TYPE=2 'SET THE ADDRESS TO LOAD A BACKGROUND FILE FROM ADDR=ROM(3) 'DEFINE YOUR TEXT FILE HERE: DATA "THIS ","IS A ","LONG ","LINE ","OF ","TEXT " 'DATA "I THINK THERE ARE QUITE A LOT OF CHARACTERS IN HERE" 'DATA "IS IT HARD TO DISPLAY TEXT?" DATA "///" 'THIS CODE READS THE TEXT DATA AND STORES IT INSIDE THE TXT$ ARRAY DIM GLOBAL TXT$(99) I=-1 REPEAT INC I READ TXT$(I) UNTIL TXT$(I)="///" TXT$(I)="" 'RASTERFX TO ZOOM OUT VERTICALLY TO SEE ALL 32 VERTICAL CELLS (DEBUGGING TOOL) 'ON RASTER CALL RASTERFX GLOBAL LX,LY 'CODE SETUP LX=0 LY=0 X=0 Y=0 'ADD X,LEFT(0)-RIGHT(0) 'ADD Y,UP(0)-DOWN(0) 'CALL CHECKCHUNK(X,Y,ADDR,TYPE) 'SCROLL 0,X,Y 'MAIN LOOP DO CALL GUI 'CALL FINDPOS WAIT VBL LOOP SUB FINDPOS 'A LITTLE TOOL TO FIND CELL COORDINATES TRACE TOUCH.X\8,TOUCH.Y\8 END SUB SUB GUI CX=TOUCH.X\8 CY=TOUCH.Y\8 IF NOT(TOUCH) THEN TOUCHED=0 IF TRANSITION THEN CALL TRANSITION ELSE IF INT(MENU)=0 THEN IF IN(25) THEN CALL M0S0 ELSE CALL M0 END IF ELSE IF INT(MENU)=1 THEN END IF 'PARAMETER OVERVIEW 'TRIGGER COMMANDS: ' BASICBUTTON (X1,Y1,X2,Y2,ID,STATUS) ' PUSHBUTTON (X1,Y1,X2,Y2,ID,STATUS) ' SWITCH (X1,Y1,X2,Y2,ID,STATUS) 'SET COMMANDS: ' HOLDBUTTONS (X1,Y1,X2,Y2,ID,STATUS,DX,DY,COUNT) ' HOLDBUTTON (X1,Y1,X2,Y2,ID,STATUS,MODE) ' COUNTER (INCVAL,DECVAL,STATUS,MAXVAL,LOOPAROUND,SPEED,WAITAUTO) ' SLIDER (X1,Y1,X2,Y2,ID,STATUS,PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO, ' FLEXMODE,RESETVAL) ' SLIDERS (X1,Y1,X2,Y2,ID,INVAL,PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO, ' FLEXMODE,DX,DY,COUNT,RESETVAL) ' XYPAD (X1,Y1,X2,Y2,ID,XSTATUS,YSTATUS,PIXSTEP,LEBOUND,RIBOUND,LOBOUND,HIBOUND, ' CHARACTER,SPRITENO,FLEXMODE,XRESETVAL,YRESETVAL) ' SWIPER (X1,Y1,X2,Y2,ID,STATUS,DRAGDIST,ANGLECOUNT,STARTANGLE) 'MENU AND MISCELLANEOUS COMMANDS: ' SIDEBAR (X1,Y1,X2,Y2,ID,STATUS,DIRECTION,DRAGDIST) ' SCROLLER (X1,Y1,X2,Y2,ID,XSTATUS,YSTATUS,XMINVAL,XMAXVAL,YMINVAL,YMAXVAL,FRICTION) ' POLAR (I1,I2) 'GRAPHICAL COMMANDS: ' SEG7 (X,Y,F) ' ARROWDRAW (X1,Y1,DIRECTION,THEME) ' SWIPEANIMATION(B,X2,Y2,STEPS) END SUB SUB TRANSITION SPRITE OFF CALL SWIPEANIMATION(0,(IN(24)-IN(25))*40,(IN(26)-IN(27))*40,4) CALL SWIPEANIMATION(1,(IN(24)-IN(25))*40,(IN(26)-IN(27))*40,4) FOR I=0 TO 3 CALL LOADCHUNK(20,8*I,6,8,1,0,2) NEXT I END SUB SUB SWIPEANIMATION(B,X2,Y2,STEPS) 'THIS SUB HANDLES THE SCROLLING ANIMATIONS FOR TRANSITIONS AND SIDE MENUS 'INPUTS: B: BACKGROUND(0 OR 1) ' X2,Y2: COORDINATES OF THE DESTINATION (IN PIXELS) ' STEPS: THE AMOUNT OF PIXELS IT'LL STEP EACH TIME (USE 1,2,4,8, OR A VALUE BY WHICH THE DIFFERENCE BETWEEN THE CURRENT SCROLL POSITION AND THE DESTINATION CAN BE DIVIDED) IF SCROLL.X(B)=X2 AND SCROLL.Y(B)=Y2 THEN TRANSITION=0 EXIT SUB ELSE DX=-SGN(SCROLL.X(B)-X2)*STEPS DY=-SGN(SCROLL.Y(B)-Y2)*STEPS END IF SCROLL B,SCROLL.X(B)+DX,SCROLL.Y(B)+DY END SUB SUB M0 'CREATE GUI ELEMENTS HERE: 'DEMO UI ELEMENTS 'AN EMPTY BUTTON CALL PUSHBUTTON(1,1,2,2,1,IN(0)) 'AN EMPTY SWITCH CALL SWITCH(1,3,2,4,2,IN(1)) 'THE TOP ROW OF HORIZONTAL HOLDBUTTONS CALL HOLDBUTTONS(4,1,5,2,3,IN(2),0,2,0,2) 'THE BOTTOM ROW OF VERTICAL HOLDBUTTONS WHICH SHARES THE IN(3) VARIABLE WITH COUNTER 3 AND HAS FLEXMODE ENABLED CALL HOLDBUTTONS(8,10,9,11,4,IN(3),-1,0,-2,2) 'COUNTER 1 WITH AUTOCOUNTING, WITH LOOP, COUNTS FROM 0 TO 9 CALL PUSHBUTTON(1,8,2,9,5,IN(4)) CALL PUSHBUTTON(1,10,2,11,5,IN(5)) CALL COUNTER(IN(4),IN(5),IN(10),9,-1,10,40) 'COUNTER 2 WITH FAST AUTOCOUNTING, WITHOUT LOOP, COUNTS FROM 0 TO 15 CALL PUSHBUTTON(3,8,4,9,6,IN(6)) CALL PUSHBUTTON(3,10,4,11,6,IN(7)) CALL COUNTER(IN(6),IN(7),IN(11),15,0,5,30) 'COUNTER 3 WITHOUT AUTOCOUNTING, WITHOUT LOOP, COUNTS FROM 0 TO 2 CALL PUSHBUTTON(5,8,6,9,7,IN(8)) CALL PUSHBUTTON(5,10,6,11,7,IN(9)) CALL COUNTER(IN(8),IN(9),IN(3),2,0,0,0) '7 SEGMENT DISPLAYS FOR THE COUNTERS CALL SEG7(1,6,IN(10)) CALL SEG7(3,6,IN(11)) CALL SEG7(5,6,IN(3)+1) 'THE HORIZONTAL SLIDER ON THE LEFT WITH FLEXMODE ENABLED CALL SLIDER(4,14,11,14,12,IN(12),3.7,4.1,11.4,0,10,1,-1,-1) 'THE 4 VERTICAL SLIDERS ON THE RIGHT WITH FLEXMODE DISABLED CALL SLIDERS(10,1,10,8,13,13,1,1,8,-1,26,2,0,1,0,3,-1) CALL XYPAD(15,11,18,14,14,IN(17),IN(18),1,15.2,11.2,18,14,13,10,-1,12,12) CALL XYPAD(15,5,18,8,15,IN(19),IN(20),1,15,5,18,8,13,11,-1,-1,0) CALL SWIPER(15,1,16,2,16,IN(21),5,4,2.25*PI) 'BUTTON-STYLE CALL XYPAD(8,3,9,4,17,IN(22),IN(23),1,0,0,19,15,13,12,-1,4,4) 'CALL SIDEBAR(0,0,1,15,18,IN(24),0,18) CALL SIDEBAR(18,0,19,15,19,IN(25),2,10) 'CALL SIDEBAR(0,0,19,1,20,IN(26),1,18) 'CALL SIDEBAR(0,14,19,15,21,IN(27),3,10) 'CALL SCROLLER(0,0,19,15,22,IN(28),IN(29),0,100,0,0,0) 'TRACE IN(28),IN(29) CALL SEG7(1,13,IN(12)) NUMBER 10,9,IN(13),2 NUMBER 11,10,IN(14),2 NUMBER 12,11,IN(15),2 NUMBER 13,12,IN(16),2 NUMBER 15,15,IN(17),2 NUMBER 17,15,IN(18),2 NUMBER 15,9,IN(19),2 NUMBER 17,9,IN(20),2 NUMBER 5,3,IN(22),3 NUMBER 5,4,IN(23),3 IF IN(25) THEN TRANSITION=-1 END SUB SUB M0S0 CALL BASICBUTTON(0,0,15,15,1,IN(0)) IF IN(0) THEN IN(25)=0 TRANSITION=-1 END IF CALL SCROLLER(0,0,19,15,2,0,IN(2),0,0,-5000,0,0.05) SCROLL 1,40,-IN(2) CALL CHECKCHUNK(160,-IN(2),6,8,1,0,2) END SUB 'YOU CAN VIEW ALL GUI ELEMENTS AND THEIR DESCRIPTIONS HERE: 'GENERAL DESCRIPTION 'X1,Y1,X2,Y2 (IN CELLS) IS A RECTANGLE FOR THE BUTTON POSITION AND SIZE 'ID: IS AN UNIQUE NUMBER FOR THE BUTTON SO THE UI CAN LOCK TO THIS BUTTON ONCE YOU STARTED PRESSING IT 'STATUS: IS THE INPUT/OUTPUT VALUE FOR EACH BUTTON/SWITCH, THIS'LL BE STORED INTO THE IN() ARRAY, YOU CAN USE THIS TO DISPLAY BUTTON VALUES OR CONTROL OTHER THINGS 'THE IN() ARRAY STORES THE OUTPUTS/RESULTS OF EACH BUTTON, SWITCH, OR SLIDER SUB PUSHBUTTON(X1,Y1,X2,Y2,ID,STATUS) 'TO TRIGGER SOMETHING 'INPUTS : SEE "GENERAL DESCRIPTION" 'OUTPUTS: THE BUTTON-PRESS DURATION TO THE "STATUS" VARIABLE 'THIS LINE CHECKS IF THIS BUTTON IS PRESSED AND THE USER IS NOT ALREADY PRESSING A BUTTON IF TOUCH AND CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND (TOUCHED=0 OR TOUCHED=ID) THEN TOUCHED=ID IF TAP THEN STATUS=1 ELSE INC STATUS END IF BG TINT X1,Y1 TO X2,Y2 PAL 1 ELSE BG TINT X1,Y1 TO X2,Y2 PAL 0 STATUS=0 END IF END SUB SUB BASICBUTTON(X1,Y1,X2,Y2,ID,STATUS) 'A BUTTON WITHOUT TIMING AND BG TINTING 'INPUTS : SEE "GENERAL DESCRIPTION" 'OUTPUTS: PRESSED(-1), NOT PRESSED(0) IF TOUCH AND CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND (TOUCHED=0 OR TOUCHED=ID) THEN TOUCHED=ID STATUS=1 END IF END SUB SUB SWITCH(X1,Y1,X2,Y2,ID,STATUS) 'TO TOGGLE SOMETHING 'INPUTS : SEE "GENERAL DESCRIPTION" 'OUTPUTS: THE ON (-1) OR OFF (0) STATE IF TAP AND CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND (TOUCHED=0 OR TOUCHED=ID) THEN TOUCHED=ID STATUS=NOT(STATUS) BG TINT X1,Y1 TO X2,Y2 PAL ABS(STATUS) END IF END SUB SUB HOLDBUTTONS(X1,Y1,X2,Y2,ID,STATUS,FLEXMODE,DX,DY,COUNT) 'DEFINES MULTIPLE HOLDBUTTONS 'INPUTS: X1,Y1,X2,Y2 : THE POSITION AND SIZE OF THE FIRST HOLDBUTTON ' DX,DY : THE OFFSET BETWEEN EACH HOLDBUTTON AND ITS NEIGHBOR ' COUNT : THE AMOUNT OF HOLDBUTTONS ' THE DIRECTION FOR FLEXMODE IS DETERMINED AUTOMATICALLY (IN THIS SUB) ' THE OTHER INPUTS ARE PASSED TO THE HOLDBUTTON SUBPROGRAM IF FLEXMODE THEN FLEXMODE=ABS((DX<>0)*2+(DY<>0)) 'DIAGONAL FLEXMODE ISN'T SUPPORTED, SO IT'LL BE TURNED OFF IF IT'S DIAGONAL IF FLEXMODE>2 THEN FLEXMODE=0 FOR I=0 TO COUNT CALL HOLDBUTTON(X1+DX*I,Y1+DY*I,X2+DX*I,Y2+DY*I,ID,STATUS,I,FLEXMODE) NEXT I END SUB SUB HOLDBUTTON(X1,Y1,X2,Y2,ID,STATUS,MODE,FLEXMODE) 'TO SET A MODE 'INPUTS : FOR THE FIRST INPUTS SEE "GENERAL DESCRIPTION" ' MODE IS THE VALUE OF EACH BUTTON ' FLEXMODE IS 0 WHEN OFF, 1 WHEN ON AND VERTICAL, 2 WHEN ON AND HORIZONTAL ' FLEXMODE MAKES THIS SWITCH RESPOND EVEN IF YOU DON'T TOUCH IT'S CELLS 'OUTPUTS: THE VALUE OF THE BUTTON THAT IS CURRENTLY ENABLED C=CX>=X1 AND CX<=X2 AND CY>=Y1 AND CY<=Y2 B=(FLEXMODE=1 AND CY>=Y1 AND CY<=Y2) OR (FLEXMODE=2 AND CX>=X1 AND CX<=X2) 'TRACE FLEXMODE,CX>=X1 AND CX<=X2 IF TOUCH AND ((C AND (TOUCHED=0 OR TOUCHED=ID)) OR (B AND TOUCHED=ID)) THEN TOUCHED=ID STATUS=MODE BG TINT X1,Y1 TO X2,Y2 PAL 1 ELSE IF STATUS=MODE THEN BG TINT X1,Y1 TO X2,Y2 PAL 1 ELSE BG TINT X1,Y1 TO X2,Y2 PAL 0 END IF END IF END SUB SUB COUNTER(INCVAL,DECVAL,STATUS,MAXVAL,LOOPAROUND,SPEED,WAITAUTO) 'USES EXISTING BUTTONS TO TRIGGER A COUNTER 'INPUTS: INCVAL IS THE OUTPUT OF THE INCREMENT BUTTON ' DECVAL IS THE OUTPUT OF THE DECREMENT BUTTON ' STATUS IS THE CURRENT COUNT VALUE ' MAXVAL IS THE MAXIMUM COUNT VALUE ' LOOPAROUND IS A SETTING ON (-1) MEANS THAT THE VALUE WILL LOOP AROUND AT AN OVERFLOW ' SPEED IS THE COUNTING SPEED (FRAMES/UPDATE) WHEN THE BUTTON IS HELD ' IF SPEED IS ZERO IT WON'T REPEAT A COUNT COMMAND ' WAITAUTO IS THE TIME IT TAKES (IN FRAMES) BEFORE IT'LL START REPEATING THE COUNT COMMAND (THE PREVIOUS COMMAND SETS THE REPEATING SPEED) 'OUTPUTS: THE COUNT VALUE TO STATUS IF (INCVAL>WAITAUTO AND TIMER-PRESSTIME>SPEED AND SPEED>0) OR INCVAL=1 THEN PRESSTIME=TIMER INC STATUS IF STATUS>MAXVAL THEN IF LOOPAROUND THEN STATUS=0 ELSE STATUS=MAXVAL END IF END IF ELSE IF (DECVAL>WAITAUTO AND TIMER-PRESSTIME>SPEED AND SPEED>0) OR DECVAL=1 THEN PRESSTIME=TIMER DEC STATUS IF STATUS<0 THEN IF LOOPAROUND THEN STATUS=MAXVAL ELSE STATUS=0 END IF END IF END IF END SUB SUB SLIDERS(X1,Y1,X2,Y2,ID,INVAL,PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO, FLEXMODE,DX,DY,COUNT,RESETVAL) 'DEFINES MULTIPLE SLIDERS 'INPUTS: X1,Y1,X2,Y2 : THE POSITION AND SIZE OF THE FIRST SLIDER ' DX,DY : THE OFFSET BETWEEN EACH SLIDER AND ITS NEIGHBOR ' COUNT : THE AMOUNT OF SLIDERS ' INVAL IS THE INDEX VALUE FOR THE IN() ARRAY ' THE OTHER INPUTS ARE PASSED TO THE SLIDER SUBPROGRAM 'NOTE 1: IF FLEXMODE IS ON IT'LL TAKE UP THE ID-CODES BETWEEN "ID" AND "ID+COUNT" 'NOTE 2: IT'LL USE ALL ADRESS VALUES OF IN() BETWEEN INVAL AND INVAL+I FOR I=0 TO COUNT CALL SLIDER(X1+DX*I,Y1+DY*I,X2+DX*I,Y2+DY*I,ID-I*(FLEXMODE<>0),IN(INVAL+I),PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO+I,FLEXMODE,RESETVAL) NEXT I END SUB SUB SLIDER(X1,Y1,X2,Y2,ID,STATUS,PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO, FLEXMODE,RESETVAL) 'TO SET A VALUE 'INPUTS: FOR THE FIRST INPUTS SEE "GENERAL DESCRIPTION" ' PIXSTEP IS THE AMOUNT OF PIXELS A SLIDER STEPS (8 IS FULL CELLS) ' LOBOUND IS THE LOWER BOUNDARY OF THE FADER ' HIBOUND IS THE HIGHER BOUNDARY OF THE FADER ' ALL VALUES SEEM TO BE SUPPORTED ' DIMY IS TRUE WHEN THE SLIDER IS VERTICAL (DIM=Y), AND FALSE WHEN IT'S HORIZONTAL ' CHARACTER IS THE CHARACTER OF THE MOVING PART OF THE SLIDER ' SPRITENO IS THE SPRITE-NUMBER OF THE SLIDER SPRITE ' FLEXMODE IS A SETTING, IF TRUE (-1) IT'LL MOVE THE SPRITE AS LONG AS YOUR FINGER ' TOUCHES THE SCREEN (YOU DON'T HAVE TO TOUCH THE SLIDER CELLS) ' IF FALSE (0) IT'LL ONLY MOVE WHEN YOU TOUCH THE SLIDER CELLS, ' BUT IT DOES ALLOW YOU TO QUICKLY DRAW MULTIPLE SLIDERS ' RESETVAL IS THE VALUE STATUS WILL BE SET TO ONCE THE SLIDER IS RELEASED ' IF RESETVAL<0 THEN IT'S OFF 'OUTPUTS: THE VALUE OF THIS SLIDER C=CX>=X1 AND CX<=X2 AND CY>=Y1 AND CY<=Y2 IF TOUCH AND ((C AND (TOUCHED=0 OR TOUCHED=ID)) OR (FLEXMODE AND TOUCHED=ID)) THEN TOUCHED=ID C=8/PIXSTEP A=0 B=0 IF DIMY THEN CALL SLIDERLOGIC(A,B,C,LOBOUND,HIBOUND,TOUCH.Y,PIXSTEP,STATUS) SPRITE SPRITENO,X1*8,(STATUS+A)*PIXSTEP,CHARACTER ELSE CALL SLIDERLOGIC(A,B,C,LOBOUND,HIBOUND,TOUCH.X,PIXSTEP,STATUS) SPRITE SPRITENO,(STATUS+A)*PIXSTEP,Y1*8,CHARACTER END IF ELSE IF SPRITE.X(SPRITENO)=-32 THEN IF DIMY THEN SPRITE SPRITENO,X1*8,STATUS*PIXSTEP+Y1*8,CHARACTER ELSE SPRITE SPRITENO,STATUS*PIXSTEP+X1*8,Y1*8,CHARACTER END IF ELSE IF RESETVAL>=0 AND STATUS<>RESETVAL THEN STATUS=RESETVAL IF DIMY THEN SPRITE SPRITENO,X1*8,STATUS*PIXSTEP+Y1*8,CHARACTER ELSE SPRITE SPRITENO,STATUS*PIXSTEP+X1*8,Y1*8,CHARACTER END IF END IF END SUB SUB XYPAD(X1,Y1,X2,Y2,ID,XSTATUS,YSTATUS,PIXSTEP,LEBOUND,LOBOUND,RIBOUND,HIBOUND,CHARACTER, SPRITENO,FLEXMODE,XRESETVAL,YRESETVAL) 'TO SET A VALUE 'INPUTS: THEY ARE VERY SIMILAR TO THE INPUTS OF "SLIDER()" ' THE ONLY DIFFERENCES ARE: ' THERE'S NO NEED TO SPECIFY THE DIRECTION WITH "DIMY" ' THERE'S LEBOUND,LOBOUND,RIBOUND,HIBOUND WHICH ARE THE BOUNDARIES FOR: ' LEFT, DOWN, RIGHT, AND UP RESPECTIVELY (USE THE X1,Y1,X2,Y2 VALUES AS DEFAULT) ' THERE ARE 2 OUTPUTS: XSTATUS AND YSTATUS ' THERE ARE 2 RESET VALUES XRESETVAL,YRESETVAL ' IF XRESETVAL<0 THEN IT'S OFF 'OUTPUTS: THE X VALUE AND THE Y VALUE OF THIS PAD C=CX>=X1 AND CX<=X2 AND CY>=Y1 AND CY<=Y2 IF TOUCH AND ((C AND (TOUCHED=0 OR TOUCHED=ID)) OR (FLEXMODE AND TOUCHED=ID)) THEN TOUCHED=ID C=8/PIXSTEP A1=0 B1=0 A2=0 B2=0 CALL SLIDERLOGIC(A1,B1,C,LEBOUND,RIBOUND,TOUCH.X,PIXSTEP,XSTATUS) CALL SLIDERLOGIC(A2,B2,C,LOBOUND,HIBOUND,TOUCH.Y,PIXSTEP,YSTATUS) SPRITE SPRITENO,(XSTATUS+A1)*PIXSTEP,(YSTATUS+A2)*PIXSTEP,CHARACTER ELSE IF CHARACTER>=0 AND SPRITE.X(SPRITENO)=-32 THEN SPRITE SPRITENO,XSTATUS*PIXSTEP+X1*8,YSTATUS*PIXSTEP+Y1*8,CHARACTER ELSE IF XRESETVAL>=0 AND (XSTATUS<>XRESETVAL OR YSTATUS<>YRESETVAL) THEN XSTATUS=XRESETVAL YSTATUS=YRESETVAL SPRITE SPRITENO,XSTATUS*PIXSTEP+X1*8,YSTATUS*PIXSTEP+Y1*8,CHARACTER END IF END SUB SUB SWIPER(X1,Y1,X2,Y2,ID,STATUS,DRAGDIST,ANGLECOUNT,STARTANGLE) 'SWIPE SWIPE THIS ONE IS SIMILAR TO AN XY PAD BUT USES POLAR COORDINATES 'INPUTS : SEE "GENERAL DESCRIPTION" ' SWIPEDIST IS THE DRAGDISTANCE IN PIXELS UNTIL IT'LL OUTPUT THE DIRECTION ' ANGLECOUNT: THE AMOUNT OF PREDEFINED ANGLES TO SWIPE TO ' STARTANGLE: THE ANGLE (VALUE) OF THE FIRST DEFINED ANGLE IN RADIANS 'OUTPUTS: A PREDEFINED DIRECTION (STARTS ON THE RIGHT, INCREMENTS ANTICLOCKWISE) ' -1 MEANS NO DIRECTION IF TOUCH AND ((CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND TOUCHED=0) OR TOUCHED=ID) THEN TOUCHED=ID IF TAP THEN STATUS=-2 XTEMP=TOUCH.X YTEMP=TOUCH.Y ELSE IF STATUS=-2 THEN A=TOUCH.X-XTEMP+0.00000001 B=TOUCH.Y-YTEMP CALL POLAR(A,B) IF A>DRAGDIST THEN STATUS=(((B+STARTANGLE)*ANGLECOUNT)\(2*PI)) MOD ANGLECOUNT END IF CALL ARROWDRAW(X1,Y1,STATUS,1) END IF BG TINT X1,Y1 TO X2,Y2 PAL -(STATUS>=0) ELSE BG TINT X1,Y1 TO X2,Y2 PAL 0 END IF END SUB SUB SIDEBAR(X1,Y1,X2,Y2,ID,STATUS,DIRECTION,DRAGDIST) 'DRAG FROM A SIDE TO TRIGGER 'INPUTS: FOR THE FIRST INPUTS SEE "GENERAL DESCRIPTION" ' DIRECTION: THE DIRECTION OF THE SWIPE TO TRIGGER: ' - 0 MEANS RIGHT ' - 1 MEANS UP ' - 2 MEANS LEFT ' - 3 MEANS DOWN ' DRAGDIST: THE AMOUNT OF PIXELS TO DRAG ' NOTE: THE DRAGDIST IS THE DISTANCE BETWEEN THE CURRENT RELEVANT TOUCH COORDINATE ' AND THE LEFT OR UPPER PIXEL OF THE CELL X1,Y1 ' SO THE DRAGDIST OF LEFT AND UP IS 8 MORE THAN THE DRAGDIST OF RIGHT AND DOWN 'OUTPUTS: WHEN TRIGGERED IT'LL OUTPUT TRUE (-1) IF TOUCH AND (CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND TOUCHED=0) OR TOUCHED=ID THEN TOUCHED=ID A=(DIRECTION\2)*2-1 IF DIRECTION MOD 2=0 THEN STATUS=(TOUCH.X-X1*8)*A<-DRAGDIST 'TRACE STATUS,A,(TOUCH.X-X1*8)*A,-DRAGDIST ELSE STATUS=(TOUCH.Y-Y1*8)*A<-DRAGDIST 'TRACE STATUS,A,(TOUCH.Y-Y1*8)*A,-DRAGDIST END IF END IF END SUB SUB SCROLLER(X1,Y1,X2,Y2,ID,XSTATUS,YSTATUS,XMINVAL,XMAXVAL,YMINVAL,YMAXVAL,FRICTION) 'MAKE SCROLLING-LISTS 'INPUTS: FOR THE FIRST INPUTS SEE "GENERAL DESCRIPTION" ' XMINVAL,XMAXVAL,YMINVAL,YMAXVAL: THE BOUNDARIES FOR THE SCROLLING PAGE ' FRICTION: THE RATE AT WHICH THE SCROLLER SLOWS DOWN (BETWEEN 0 AND 1) ' - 1 MEANS IT'LL STOP INSTANTLY ' - 0 MEANS IT'LL GO ON UNTIL IT HITS A BOUNDARY ' NOTE: THE VALUE OF FRICTION CHANGES INSIDE THE SUB ' WATCH OUT FOR THAT IF YOU USE A VARIABLE TO DEFINE FRICTION 'OUTPUTS: XSTATUS,YSTATUS: THESE OUTPUT THE SCROLL OFFSET VALUE FOR THE "SCROLL" COMMAND IF TOUCH AND CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND (TOUCHED=0 OR TOUCHED=ID) THEN TOUCHED=ID IF TAP THEN XTEMP1=XSTATUS YTEMP1=YSTATUS XTEMP=TOUCH.X YTEMP=TOUCH.Y TIMEVAL=TIMER VX=0 VY=0 END IF XSTATUS=XTEMP1+TOUCH.X-XTEMP YSTATUS=YTEMP1+TOUCH.Y-YTEMP 'XSTATUS=-XSTATUS*(XSTATUS>=XMINVAL AND XSTATUS<=XMAXVAL)-XMAXVAL*(XSTATUS>XMAXVAL)-XMINVAL*(XSTATUS=YMINVAL AND YSTATUS<=YMAXVAL)-YMAXVAL*(YSTATUS>YMAXVAL)-YMINVAL*(YSTATUS0 THEN CALL SCROLLERRETURN(XSTATUS,VX,XMAXVAL,XMINVAL,FRICTION) IF VY<>0 THEN CALL SCROLLERRETURN(YSTATUS,VY,YMAXVAL,YMINVAL,FRICTION) END IF END SUB SUB CHECKCHUNK(X,Y,W,H,BGN,ADDR,T) 'CHECKS IF CHUNKS NEED UPDATING 'INPUTS: X,Y CURRENT SCROLL OFFSET COORDINATES ' W,H WITH AND HEIGHT OF THE CHUNK IN CELLS ' BGN BG NUMBER ' ADDR ADDRESS FOR BG LOAD ' TYPE SELECT: ' - 0 BG LOAD FROM FILE ' - 1 TEXT LOAD FROM ARRAY ' - 2 JUST NUMBERS IN FANCY BOXES 'REQUIRED GLOBAL VARS: LX,LY: THESE ARE THE COORDINATES FOR THE SCROLL OFFSET VALUE \ 64 OF THE MOST RECENT CHUNK LOAD 'TRACE X,Y TX=X\64 TY=Y\64 IF TX<>LX OR TY<>LY THEN 'PREPARE 'SET THE RELATIVE CHUNK-LOAD COORDINATES FOR X AND Y WHICH CAN EACH EATHER 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 AND 0 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) CALL LOADCHUNK((TX+I)*8,(TY+B)*8,ADDR,T) NEXT I 'LOAD THE CHUNK IN THE CORNER CALL LOADCHUNK((TX+A)*8,(TY+B)*8,ADDR,T) ELSE IF C AND 0 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) NEXT I ELSE IF D AND 0 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) NEXT I END IF IF D THEN CALL LOADCHUNK(X\8,(TY+B)*8,W,H,BGN,ADDR,T) END IF 'RESET LX=TX LY=TY END IF END SUB SUB LOADCHUNK(X,Y,W,H,BGN,ADDR,T) 'INPUTS: X,Y CELL COORDINATES FOR THE START OF THE CHUNK (USUALLY ROUNDED LIKE X=(X\8)*8) ' W,H WITH AND HEIGHT OF THE CHUNK IN CELLS ' BGN BG NUMBER ' ADDR ADDRESS FOR BG LOAD ' TYPE SELECT: ' - 0 BG LOAD FROM FILE ' - 1 TEXT LOAD FROM ARRAY ' - 2 JUST NUMBERS IN FANCY BOXES 'X,Y CH BG BGN IF T=0 THEN 'LOAD BG FROM FILE BG SOURCE ADDR BG COPY X MOD 64,Y MOD 64,8,8 TO X MOD 32,Y MOD 32 ELSE IF T=1 THEN 'LOAD TEXT FROM ARRAY FOR I=Y TO Y+H-1 TEXT X,I,LEFT$(" ",W) IF I<=UBOUND(TXT$) THEN TEXT X,I,MID$(TXT$(I),X*0+1,W) END IF NEXT I ELSE IF T=2 THEN '12 29 'BG COPY X MOD 64,Y MOD 64,8,8 TO X MOD 32,Y MOD 32 FOR I=0 TO 3 FOR J=0 TO 1 FLIP 0,J CELL X MOD 32,Y MOD 32+J+I*2,12 BG FILL X MOD 32+1,Y MOD 32+J+I*2 TO X MOD 32+4,Y MOD 32+J+I*2 CHAR 29 NEXT J FLIP 0,0 NUMBER X MOD 32+1,Y MOD 32+1+I*2,Y\2+I,3 NEXT I END IF BG 0 END SUB SUB SEG7(X,Y,F) 'INPUTS: X,Y STARTING COORDINATES ' F IS THE VALUE 'NOTE: THE DEFINED DISPLAY VALUES ARE STORED IN RAM ATTR CELL.A(X,Y) CELL X,Y,PEEK($D000+F*4) ATTR CELL.A(X+1,Y) CELL X+1,Y,PEEK($D000+F*4+1) ATTR CELL.A(X,Y+1) CELL X,Y+1,PEEK($D000+F*4+2) ATTR CELL.A(X+1,Y+1) CELL X+1,Y+1,PEEK($D000+F*4+3) ATTR 0 END SUB SUB ARROWDRAW(X1,Y1,DIRECTION,THEME) 'DRAWS A 2X2 ARROW CHARACTER AT X1,Y1 WITH DIRECTION AS IT'S DIRECTION 'IF DIRECTION IS BETWEEN 0 AND 3 AN ARROW WILL BE DRAWN IF DIRECTION>=0 AND DIRECTION<=3 THEN A=DIRECTION\2 IF DIRECTION MOD 2=0 THEN FOR I=0 TO 1 FLIP A,I CELL X1,Y1+I,4+A+16*THEME CELL X1+1,Y1+I,5-A+16*THEME NEXT I ELSE FOR I=0 TO 1 FLIP I,A CELL X1+I,Y1,2+16*A+1*THEME CELL X1+I,Y1+1,18-16*A+1*THEME NEXT I END IF END IF END SUB SUB POLAR(I1,I2) 'A LITTLE BIT OF MATH TO GET AN ANGLE AND A LENGTH FROM A SET OF COORDINATES 'CONVERTS THE CARTESIAN (X,Y) TO THE POLAR (RADIUS,THETA) A=I1 B=I2 I1=SQR(A*A+B*B) I2=ATAN(B/A) I2=((I2<0)+(B<=0)+(I2=0 AND A>0)+2)*PI-I2 END SUB 'THE SUBS BELOW ARE NOT GUI ELEMENTS SUB SLIDERLOGIC(A,B,C,LB,HB,TOUCHDIR,PIXSTEP,STATUS) 'THIS SUB IS PART OF THE SLIDER SUB (THIS IS NOT A GUI ELEMENT) A=LB*C B=HB*C STATUS=TOUCHDIR/PIXSTEP IF STATUSB THEN STATUS=B STATUS=INT(STATUS-A) END SUB SUB SCROLLERRETURN(STATUS,V,MAXVAL,MINVAL,FRICTION) 'THIS SUB RETURNS THE SCROLL POSITION TO THE CLOSEST LIMIT AFTER IT IS EXEEDED A=STATUS>MAXVAL AND V<0 B=STATUS0 C=NOT(A OR B) D=STATUS<=MAXVAL AND STATUS>=MINVAL FRICTION=-FRICTION*D-(NOT(D))*0.5 V=-(V-FRICTION*V)*C+(A*(STATUS-MAXVAL)+B*(STATUS-MINVAL))*0.1 IF ABS(V)<0.01 THEN IF C THEN V=(NOT(D))*V ELSE V=0 END IF END IF ADD STATUS,V END SUB 'THE SUBS BELOW ARE NOT USED FOR ANYTHING SUB SLIDERBASE(A,B,C,LOBOUND,HIBOUND,PIXSTEP,STATUS,DIMY) 'NOT USED IN THIS VERSION C=8/PIXSTEP A=0 B=0 IF DIMY THEN CALL SLIDERLOGIC(A,B,C,LOBOUND,HIBOUND,TOUCH.Y,PIXSTEP,STATUS) ELSE CALL SLIDERLOGIC(A,B,C,LOBOUND,HIBOUND,TOUCH.X,PIXSTEP,STATUS) END IF END SUB SUB TRASHBIN 'TRACE INT(YSTATUS),VY 'TRACE INT(YSTATUS),INT(VY),INT((YSTATUS-YMAXVAL)*FRICTION) A=YSTATUS<=YMAXVAL AND YSTATUS>=YMINVAL 'FRICTION=-FRICTION*(A)-(NOT(A))*0.5 'TRACE FRICTION,YSTATUS 'TRACE INT(YSTATUS),VY ADD VY,FRICTION*VY*A+((YSTATUS>YMAXVAL)*(YSTATUS-YMAXVAL)*0.0001)-((YSTATUSYMAXVAL AND (VY<((YSTATUS-YMAXVAL)*FRICTION*0+0.1)))-(YSTATUS((YSTATUS-YMINVAL)*FRICTION*0-0.1)))) 'FRICTION=-FRICTION*(A)-(NOT(A))*0.5 '*(2^(-ABS(YSTATUS-YMAXVAL)))*(2^(ABS(YSTATUS-YMINVAL)))) 'VY=VY*-(YSTATUS<=YMAXVAL AND YSTATUS>=YMINVAL)+(YSTATUS>YMAXVAL)-(YSTATUS=YMINVAL) END SUB #1:MAIN PALETTES 1B3F0601003F0702003C0C00003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 003F604040404040003F7F7F7F7F7F7F 003F60404143474F003F7F7F7E7C7870 003F604040414347003F7F7F7F7E7C78 003F60404040404F003F7F7F7F7F7F70 00FC060282C2E2F200FCFEFE7E3E1E0E 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 24242424242424243C3C3C3C3C3C3C3C 183C3C3C3C3C3C18183C242424243C18 0000FF0000FF00000000FFFFFFFF0000 FF80808080808080FFFFFFFFFFFFFFFF 3C7EFFFFFFFF7E3C3C7EE7C3C3E77E3C 00000000000000000000000000000000 00000000000000000000000000000000 003F60404141414F003F7F7F7E7E7E70 003F60404040404F003F7F7F7F7F7F70 4141414140603F007E7E7E7E7F7F3F00 4E4C404040603F0071737F7F7F7F3F00 003F604043434140003F7F7F7C7C7E7F 00FC06020282C2E200FCFEFEFE7E3E1E 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 24242424242424183C3C3C3C3C3C3C18 00007EFFFF7E000000007EC3C37E0000 0000FE0101FE00000000FEFFFFFE0000 01010101010101FF7FFFFFFFFFFFFFFF FF00000000000000FFFFFFFFFFFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 003F604041434746003F7F7F7E7C7879 00FC0602C2C2C2C200FCFEFE3E3E3E3E 003F604043474640003F7F7F7C78797F 00FC0602C2E2626200FCFEFE3E1E9E9E 003F604043474640003F7F7F7C78797F 00FC0602C2E2222200FCFEFE3E1EDEDE 003F60404C464341003F7F7F73797C7E 00FC0602123262C200FCFEFEEECE9E3E 003F604041424048003F7F7F7E7D7F77 00FC06020282022200FCFEFEFE7EFEDE 003F604340415054003F7F7C7F7E6F6B 00FC06C202820A2A00FCFE3EFE7EF6D6 000000060E1C3C780000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 4040404040603F007F7F7F7F7F7F3F00 C2C2C2C20206FC003E3E3E3EFEFEFC00 4143434340603F007E7C7C7C7F7F3F00 C202E2E20206FC003EFE1E1EFEFEFC00 4040434340603F007F7F7C7C7F7F3F00 C222E2C20206FC003EDE1E3EFEFEFC00 4143464440603F007E7C797B7F7F3F00 C26232120206FC003E9ECEEEFEFEFC00 5048404241603F006F777F7D7E7F3F00 122202820206FC00EEDEFE7EFEFEFC00 5450414043603F006B6F7E7F7C7F3F00 2A0A8202C206FC00D6F67EFE3EFEFC00 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3F7F7870737373723F7F7F7F7F7F7F7F 3F7F7870737373733F7F7F7F7F7F7F7E 3F7F7F73737373723F7F787C7F7F7F7F 3F7F7F73737373733F7F787C7F7F7F7E 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3F7F787C7F7F7F7E3F7F7F7373737373 3F7F787C7F7F7F7F3F7F7F7373737372 3F7F7F7F7F7F7F7E3F7F787073737373 3F7F7F7F7F7F7F7F3F7F787073737372 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 183C3C3C3C183C181824242424182418 6CFEFE7E240000006C92925A24000000 247EFF7E7EFF7E24245A815A5A815A24 083E7F7E3F7F3E080836414631413608 62F7FE7C3E7FEF4662959A742E59A946 1C3E7E7EFFFE7F3A1C224A46919A453A 183C3C78300000001824244830000000 0C1E3C78783C1E0C0C1224484824120C 30783C1E1E3C78303048241212244830 00247E7EFF7E7E2400245A6681665A24 00183C7EFF7E3C180018246681662418 000000183C3C78300000001824244830 0000007EFF7E00000000007E817E0000 00000000183C3C180000000018242418 060F1E3C78F0E040060912244890A040 3C7EFFFFFFFF7E3C3C4299918999423C 183C7C3C3C7EFF7E182444242466817E 3C7EFF7E3C7EFF7E3C429972244E817E 3C7EFF7E6FFF7E3C3C4299726999423C 66FFFFFF7F0F0F066699998179090906 7EFFFEFE7F7FFE7C7E819E827979827C 1C3E7CFEFFFF7E3C1C224C829999423C 7EFF7F1E3C7878307E81791224484830 3C7EFF7EFFFF7E3C3C4299429999423C 3C7EFF7F7FFF7E3C3C4299417999423C 0000183C183C18000000182418241800 0000183C183C78300000182418244830 000C1E3C783C1E0C000C12244824120C 00007EFF7EFF7E0000007E817E817E00 0030783C1E3C78300030482412244830 3C7EFF7E3C183C183C42997224182418 3C7EFFFFFFFE7E3C3C429991919E423C 183C7EFFFFFFFF661824429981999966 7CFEFFFEFFFFFE7C7C8299829999827C 3C7EFFF6F6FF7E3C3C4299969699423C 78FCFEFFFFFEFC787884929999928478 7EFFFEFCF8FEFF7E7E819E84989E817E 7EFFFEFCF8F0F0607E819E8498909060 3C7EFEFFFFFF7E3C3C429E919999423C 66FFFFFFFFFFFF666699998199999966 3C7E3C3C3C3C7E3C3C4224242424423C 1E3F1F0F6FFF7E3C1E2119096999423C 66FFFEFCFCFEFF666699928484929966 60F0F0F0F0FEFF7E60909090909E817E 42E7FFFFFFFFFF6642A5998181999966 66FFFFFFFFFFFF666699898191999966 3C7EFFFFFFFF7E3C3C4299999999423C 7CFEFFFEFCF0F0607C8299829C909060 3C7EFFFFFFFE7F3E3C4299999592413E 7CFEFFFEFCFEFF667C82998284929966 3E7FFE7E3F7FFE7C3E419E423979827C 7EFF7E3C3C3C3C187E81662424242418 66FFFFFFFFFF7E3C669999999999423C 66FFFFFFFF7E3C186699999999422418 66FFFFFFFFFFE742669999818199A542 66FF7E3C7EFFFF666699422442999966 66FFFF7E3C3C3C186699994224242418 7EFF7E3C78FEFF7E7E817224489E817E 3C7E7C78787C7E3C3C424C48484C423C 60F0783C1E0F07026090482412090502 3C7E3E1E1E3E7E3C3C4232121232423C 183C7EFF660000001824429966000000 00000000007EFF7E00000000007E817E #3:MAIN BG 00002020000000000000000000000000 00000000000000000000000000000000 0000F300F700E900F000E5000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000001000108000020002100 22002300240025001910191019101910 0000280029000000000000000C10D000 1D101D101D100C180C101D101D101D10 1D100C18000001100118000030003100 32003300340035000900090009000900 0000380039000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000001000108000000000000 000000002A002B000900090009000900 0000000000000000000000000C10D100 1D101D101D100C180C101D101D101D10 1D100C18000001100118000000000000 000000003A003B000900090009000900 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000900090009000900 00001C000C180C101C0800000C10D200 1D101D101D100C180C101D101D101D10 1D100C18000040004008400040084000 40080000240025000900090009000900 00000C180C180C100C1000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000040104018401040184010 40180000340035000900090009000900 00000C080C080C000C002C000C10D300 1D101D101D100C180C101D101D101D10 1D100C18000010001008020002080300 03080000220023001900190019001900 00001C100C080C001C182C100C001D00 1D001D001D000C080C001D001D001D00 1D000C08000010101018120012081300 13080000320033000000000000000000 0000000000000000000000000C10D400 1D101D101D100C180C101D101D101D10 1D100C18000011001108121012181310 13180000200021000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000011101118021002180310 03180000300031000000000000000000 00001C000C180C101C0800000C10D500 1D101D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 00000C180C180C100C1000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000040004008000000000000 00000000000000000000000000000000 00000C080C080C000C0000000C10D600 1D101D101D100C180C101D101D101D10 1D100C1800004010401800001B080B00 0B000B000B000B000B001B0000000000 00001C100C080C001C1800000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D700 1D101D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D800 1D101D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D900 1D101D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D100 D0001D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D100 D1001D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D100 D2001D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D100 D3001D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D100 D4001D101D100C180C101D101D101D10 1D100C18000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C001D00 1D001D001D000C080C001D001D001D00 1D000C08000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000C10D100 D5001D101D100C180C101D101D101D10 1D100C18