'E Z G U I - B Y S P 4 C E B A R 'MAKE GUIS IN GFX DESIGNER 'HOW TO USE: '- EDIT THE BG, THE PALETTES AND THE CHARACTER DESIGNS IN GFX DESIGNER '- EDIT THE "GUI CONFIGURATIONS" ROM BELOW FOR CUSTOM SETTINGS '- EDIT THE "DEFINE CHARACTERS" LIST BELOW THAT IF YOU CHANGE THE FUNCTION OF A CHARACTER OR IF YOU ADD NEW CHARACTERS IN GFX DESIGNER '- ADD CODE TO THE "RETURNS" SECTION (BELOW THE ROM LISTS) TO BE RUN WHILE CERTAIN GUI ELEMENTS ARE RUNNING GUI_PARS: '__________________________________________________________________________________________ ' ' G U I C O N F I G U R A T I O N S '__________________________________________________________________________________________ ' 'MAX 16 ELEMENTS PER TYPE (OR THE ARRAY GOES OUT OF BOUNDS) ' ' |GUI GROUP ' | |GUI TOUCH BEHAVIOR MODE ' | | |SOUND 0 ' | | | |SOUND 1 '_________|_|_|_|__________________________________________________________________________ 'BUTTONS | | | | ' | | | | |NOT IN USE DATA -1, 0,0,0,0, 0,0,0,0 DATA -1, 0,0,0,0, 0,0,0,0 DATA -1, 0,0,0,0, 0,0,0,0 DATA -1, 0,0,0,0, 0,0,0,0 '_________|_|_|_|__________________________________________________________________________ 'SWITCHES | | | | ' | | | | |AMOUNT OF STATES ' | | | | | |NOT IN USE DATA -2, 0,0,0,0, 0 ,0,0,0 DATA -2, 0,0,0,0, 0 ,0,0,0 DATA -2, 0,0,0,0, 0 ,0,0,0 DATA -2, 0,0,0,0, 0 ,0,0,0 '_________|_|_|_|__________________________________________________________________________ 'SETBUTTONS | | | ' | | | | |ALTERNATIVE GROUP ID, IF UNDEFINED THESE IDS BE ASSIGNED CHRONOLOGICALLY ' | | | | | |NOT IN USE DATA -3, 1,2,0,0, 0 ,0,0,0 DATA -3, 1,2,0,0, 0 ,0,0,0 DATA -3, 1,2,0,0, 0 ,0,0,0 DATA -3, 1,2,0,0, 0 ,0,0,0 DATA -3, 2,2,0,0, 0 ,0,0,0 DATA -3, 2,2,0,0, 0 ,0,0,0 '_________|_|_|_|__________________________________________________________________________ 'VSLIDERS | | | | ' | | | | |AMOUNT OF STATES (DEFAULT IS 8) ' | | | | | |VALUE TO RESET TO ON RELEASE (0 IS OFF) ' | | | | | | |CHARACTER (ONLY IF YOU WANT TO SET A DIFFERENT ONE) ' | | | | | | | |BORDER OFFSET (IN PIXELS) (0.5 IS NO LIMIT) DATA -4, 1,2,0,0 ,16 ,0 ,0 ,0 DATA -4, 1,2,0,0 ,16 ,0 ,0 ,0 DATA -4, 1,2,0,0 ,16 ,0 ,0 ,0 DATA -4, 1,2,0,0 ,16 ,0 ,0 ,0 '_________|_|_|_|__________________________________________________________________________ 'HSLIDERS | | | | ' | | | | |AMOUNT OF STATES (DEFAULT IS 8) ' | | | | | |VALUE TO RESET TO ON RELEASE (0 IS OFF) ' | | | | | | |CHARACTER (ONLY IF YOU WANT TO SET A DIFFERENT ONE) ' | | | | | | | |BORDER OFFSET (IN PIXELS) (0.5 IS NO LIMIT) DATA -5, 0,0,0,0 ,0 ,0 ,0 ,0 DATA -5, 0,0,0,0 ,0 ,0 ,0 ,0 DATA -5, 0,0,0,0 ,0 ,0 ,0 ,0 DATA -5, 0,0,0,0 ,0 ,0 ,0 ,0 '_________|_|_|_|__________________________________________________________________________ 'XYPADS | | | | ' | | | | |AMOUNT OF STATES [FORMAT X+0.001*Y] (DEFAULT IS 8.008) ' | | | | | |VALUE TO RESET TO ON RELEASE [FORMAT X+0.001*Y] (0 IS OFF) ' | | | | | | |CHARACTER (ONLY IF YOU WANT TO SET A DIFFERENT ONE) ' | | | | | | | |BORDER OFFSET (IN PIXELS) (0.5 IS NO LIMIT) DATA -6, 0,0,0,0 ,0 ,5.005 ,0 ,0.5 DATA -6, 0,0,0,0 ,0 ,0 ,0 ,0 DATA -6, 0,0,0,0 ,0 ,5.005 ,0 ,0 DATA -6, 0,0,0,0 ,0 ,0 ,0 ,0 '_________|_|_|_|__________________________________________________________________________ 'SWIPERS | | | | ' | | | | |AMOUNT OF ANGLES (PIE SECTIONS) ' | | | | | |DRAG DISTANCE (BEFORE ACTIVATING) ' | | | | | | |ANGLE OFFSET (ROTATE THE PIE) ' | | | | | | | |NOT IN USE DATA -7, 0,0,0,0, 0,0,0 ,0 DATA -7, 0,0,0,0, 0,0,0 ,0 DATA -7, 0,0,0,0, 0,0,0 ,0 DATA -7, 0,0,0,0, 0,0,0 ,0 '_________|_|_|_|__________________________________________________________________________ DATA 1000 'STANDARD PARS (THE FIRST FOUR) '- GUI GROUP (GUI IDS WILL BE ASSIGNED IN CHRONOLOGICAL ORDER ACCORDING TO ELEMENT IDS) ' - DEFAULT: 0, NONE '- GUI TOUCH BEHAVIOR MODE, DEFAULT: 0 DON'T SLIDE TO OTHER ELEMENTS, FLEX IF POSSIBLE '- SOUND 0, DEFAULT: 0, NONE '- SOUND 1, DEFAULT: 0, NONE GUI_CHARS: '__________________________________________________________________________________________ ' ' D E F I N E C H A R A C T E R S '__________________________________________________________________________________________ ' ' 'ROOT CHARACTERS: (IS UPPER-LEFT CELL OF AN ELEMENT DEPENDING ON HOW THE CELLS ARE FLIPPED) ' '+0 ROOT IF NO FLIP ' - UPPER-LEFT CHARACTERS ' '+0.1 ROOT IF X-FLIP AND NO Y-FLIP ' - X-FLIPPED UPPER-RIGHT CHARACTERS ' '+0.2 ROOT IF Y-FLIP AND NO X-FLIP ' - Y-FLIPPED LOWER-LEFT CHARACTERS ' '+0.3 ROOT IF NO Y-FLIP ' - CHARACTERS THAT ARE BOTH (WIDTH = 1 CELL) ' '+0.4 ROOT IF NO X-FLIP ' - CHARACTERS THAT ARE BOTH (HEIGHT = 1 CELL) ' '+0.5 NOT ROOT ' - ALL OTHER CHARACTERS ' 'FOR MORE INFORMATION LOOK AT THE "ISROOT(R,F)" SUBPROGRAM ' '__________________________________________________________________________________________ ' | 'EXCEPTIONS | THESE ARE NO GUI ELEMENTS DATA -0.5 ,64,65,66,67,80,81,82,83 '__________________________________________________________________________________________ ' | 'BUTTONS | DATA -1 ,32,34,42,68,69,96,98,100 DATA -1.1 DATA -1.2 DATA -1.3 DATA -1.4 DATA -1.5 ,33,35,43,48,49,50,51,58,59,97,99,112,113,114,115,116,117,101 '__________________________________________________________________________________________ ' | 'SWITCHES | DATA -2 ,44,46,70,71,72,102,104 DATA -2.1 DATA -2.2 DATA -2.3 DATA -2.4 DATA -2.5 ,45,47,60,61,62,63,103,105,118,119,120,121 '__________________________________________________________________________________________ ' | 'SETBUTTONS | DATA -3 ,36,38,40,76,78,108,110 DATA -3.1 DATA -3.2 DATA -3.3 DATA -3.4 DATA -3.5 ,37,39,41,77,79,52,53,54,55,56,57,109,111,124,125,126,127,92,93,94,95 '__________________________________________________________________________________________ ' | 'VSLIDERS | DATA -4 , 13 DATA -4.1 DATA -4.2 DATA -4.3 DATA -4.4 DATA -4.5 , 12 '__________________________________________________________________________________________ ' | 'HSLIDERS | DATA -5 DATA -5.1 DATA -5.2 DATA -5.3 DATA -5.4 DATA -5.5 '__________________________________________________________________________________________ ' | 'XYPADS | DATA -6 ,73 DATA -6.1 DATA -6.2 DATA -6.3 DATA -6.4 DATA -6.5 ,8 '8 NEEDS A UNIQUE CHAR ID IN THE CORNER '__________________________________________________________________________________________ ' | 'SWIPERS | DATA -7 DATA -7.1 DATA -7.2 DATA -7.3 DATA -7.4 DATA -7.5 '__________________________________________________________________________________________ DATA 1000 '__________________________________________________________________________________________ ' ' R E T U R N S '__________________________________________________________________________________________ 'THIS IS WHERE YOU CAN PUT CODE THAT WILL BE RUN WHEN A CERTAIN GUI ELEMENT RUNS '- V,VX,VY ARE VARIABLES '- V1 IS OBSOLETE (IT'S A LEFTOVER SPACE IN THE PARS() ARRAY) '- RECT CONTAINS FOUR 6-BIT VALUES, THESE CAN BE DECODED USING THE UNPACK_ZONES(X1,Y1,X2,Y2,V) SUBPROGRAM SUB FIND_ELEMENT(T,N) TRACE "T=",T,"M="+STR$(MENU),"N="+STR$(N) END SUB SUB BUTTON_RETURN(N,V,V1) TRACE "BUTTON",MENU,N IF MENU=0 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN CALL LOAD_MENU(2) ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN CALL LOAD_MENU(2) ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN CALL LOAD_MENU(2) ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=4 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN CALL LOAD_MENU(2) ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=5 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN CALL LOAD_MENU(2) ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB SUB SWITCH_RETURN(N,V,V1) TRACE "SWITCH",MENU,N IF MENU=0 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB SUB SETBUTTON_RETURN(N,V,RECT) TRACE "SETBUT",MENU,N IF MENU=0 THEN IF N=0 THEN 'CALL LOAD_MENU(0) ELSE IF N=1 THEN CALL LOAD_MENU(3) ELSE IF N=2 THEN CALL LOAD_MENU(4) ELSE IF N=3 THEN CALL LOAD_MENU(5) ELSE IF N=4 THEN CALL LOAD_MENU(1) ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN CALL LOAD_MENU(0) ELSE IF N=1 THEN CALL LOAD_MENU(3) ELSE IF N=2 THEN CALL LOAD_MENU(4) ELSE IF N=3 THEN CALL LOAD_MENU(5) ELSE IF N=4 THEN 'CALL LOAD_MENU(1) ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN CALL LOAD_MENU(0) ELSE IF N=1 THEN CALL LOAD_MENU(3) ELSE IF N=2 THEN CALL LOAD_MENU(4) ELSE IF N=3 THEN CALL LOAD_MENU(5) ELSE IF N=4 THEN CALL LOAD_MENU(1) ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN CALL LOAD_MENU(0) ELSE IF N=1 THEN 'CALL LOAD_MENU(3) ELSE IF N=2 THEN CALL LOAD_MENU(4) ELSE IF N=3 THEN CALL LOAD_MENU(5) ELSE IF N=4 THEN CALL LOAD_MENU(1) ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=4 THEN IF N=0 THEN CALL LOAD_MENU(0) ELSE IF N=1 THEN CALL LOAD_MENU(3) ELSE IF N=2 THEN 'CALL LOAD_MENU(4) ELSE IF N=3 THEN CALL LOAD_MENU(5) ELSE IF N=4 THEN CALL LOAD_MENU(1) ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=5 THEN IF N=0 THEN CALL LOAD_MENU(0) ELSE IF N=1 THEN CALL LOAD_MENU(3) ELSE IF N=2 THEN CALL LOAD_MENU(4) ELSE IF N=3 THEN 'CALL LOAD_MENU(5) ELSE IF N=4 THEN CALL LOAD_MENU(1) ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB SUB YSLIDER_RETURN(N,V,V1) TRACE "YSLIDE",MENU,N IF MENU=0 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB SUB XSLIDER_RETURN(N,V,V1) TRACE "XSLIDE",MENU,N IF MENU=0 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB SUB XYPAD_RETURN(N,XV,YV) TRACE "XYPAD ",MENU,N IF MENU=0 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB SUB SWIPER_RETURN(N,V,V1) TRACE "SWIPER",MENU,N IF MENU=0 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN ELSE IF N=8 THEN ELSE IF N=9 THEN ELSE IF N=10 THEN ELSE IF N=11 THEN ELSE IF N=12 THEN ELSE IF N=13 THEN ELSE IF N=14 THEN ELSE IF N=15 THEN END IF ELSE IF MENU=1 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=2 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF ELSE IF MENU=3 THEN IF N=0 THEN ELSE IF N=1 THEN ELSE IF N=2 THEN ELSE IF N=3 THEN ELSE IF N=4 THEN ELSE IF N=5 THEN ELSE IF N=6 THEN ELSE IF N=7 THEN END IF END IF END SUB 'P L A N - E Z G U I 'TRIGGER SUBS: ' PUSHBUTTON(X1,Y1,X2,Y2,ID,STATUS,P0,P1,C0,C1,S0,S1) ' SWITCH (X1,Y1,X2,Y2,ID,STATUS,P0,P1,C0,C1,S0,S1,STATES) ' 'SET SUBS: ' SETBUTTON (X1,Y1,X2,Y2,N,ID,RETURN,P0,P1,C0,C1,S0,S1) 'SLIDERS: ' SLIDERX (X1,Y1,X2,Y2,ID,RETURN ,P0,P1,C0,C1,S0,S1, STEPS,ZERO,FLEX) ' SLIDERY (X1,Y1,X2,Y2,ID,RETURN ,P0,P1,C0,C1,S0,S1, STEPS,ZERO,FLEX) ' XYPAD (X1,Y1,X2,Y2,ID,RETURN(),P0,P1,C0,C1,S0,S1, XZERO,YZERO,SX,SY,FLEX) ' ' SWIPER (X1,Y1,X2,Y2,ID,RETURN ,P0,P1,C0,C1,S0,S1, COUNT,OFFSET,DRAGD) ' ' - SIDEBAR (X1,Y1,X2,Y2,ID,RETURN ,S0,S1,DIRECTION,DRAG_DIST), IS A SWIPER ' SCROLLERX (X1,Y1,X2,Y2,ID,RETURN ,S0,S1,MIN,MAX,FRICTION) ' SCROLLERY (X1,Y1,X2,Y2,ID,RETURN ,S0,S1,MIN,MAX,FRICTION) ' SCROLLER2D(X1,Y1,X2,Y2,ID,RETURN(),S0,S1,XS,XB,YS,YB, FRICTION) ' 'MISC ' POLAR (I1,I2) ' CHECKCHUNK1D(X,Y,W,BGN,ADDR,T,SIDESCROLL) ' LOADCHUNK (X,Y,W,BGN,ADDR,T,SIDESCROLL) ' 'DISPLAYS AND LINKS: ' COUNTER (INCVAL,DECVAL,STATUS,MAXVAL,LOOPAROUND,SPEED,WAITAUTO) ' GOTO MENU (MENU) ' SEG7 (X,Y,F) ' ARROWDRAW (X1,Y1,DIRECTION,THEME) ' SWIPEANIMATION(B,X2,Y2,STEPS) ' BITWISE WRITING 'ALL VALUES ARE RETURNED IN ONE ARRAY (KEEP RAM CLEAN) 'AUTODETECT: ZONES, ID 'BG : P0,C0 'BG FILES: P1,C1 'OPTIONAL CONFIGURATIONS: S0,S1,FLEX(DEFAULT ON),STEPS(DEFAULT 8),ZERO(DEFAULT -1) ' '- MAKE IT NX-LIKE, WITH A SUBPROGRAM FOR EACH OPERATION: ' - SET_SOUND(T,N,S0,S1) ' - SET_VSLIDER(N,FLEX,SPRITE_CHAR,STEPS,ZERO) ' - SET_HSLIDER(N,FLEX,SPRITE_CHAR,STEPS,ZERO) ' - SET_XYPAD(N,FLEX,SPRITE_CHAR,XSTEPS,YSTEPS,XZERO,YZERO) ' - SET_SWIPER(N,COUNT,OFFSET,DRAG_DIST) ' - SET_SIDEBAR(N,DIRECTION,DRAG_DIST) ' - SET_SCROLLERX(N,MIN,MAX,FRICTION) ' - SET_SCROLLERY(N,MIN,MAX,FRICTION) ' - SET_SCROLLER2D(N,XS,XB,YS,YB, FRICTION) ' - VALUE 1000 TO IGNORE THAT PARAMETER 'SCROLLERS OCCUPY THE REMAINING CHARACTERS 'REMOVED: DX,DY,COUNT: ELEMENTS ARE MORE INDUVIDUAL 'SLIDERS WILL HAVE A VARIABLE TO ADJUST THE DISTANCE LIMIT FROM THE SIDES, '- BUT IT'S DEFINED INSIDE THEIR SUBPROGRAM 'AN ARRAY WIL BE GENERATED ON SETUP WITH AN ID FOR EACH ELEMENT'S TOP-LEFT CELL COORDINATES IN EACH ELEMENT TYPE ' 'USER DEFINED FUNCTION CALLS: ONE MASSIVE IF STATEMENT FOR EACH TYPE 'THE GOAL IS TO REDUCE THE MANDATORY MANUAL DEFINING AS MUCH AS POSSIBLE WHILE STILL ALLOWING SOME FLEXIBILITY, THIS IS ACHIEVED BY A SMART DETECTIONS, AND DEFAULT PRESETS 'AUTOMATIC GUI 'DETECTS BUTTON CHARACTERS, HFADERS, VFADERS, XY-PADS 'SET YOUR OWN DATABASE TO COMPARE WITH 'OPTIONAL: ON-STATE BG FILE, TO DEFINE ON-STATES 'DISPLAY DETECTOR ON SETUP, TO GENERATE 7-SEG DISPLAY COORDINATES, AND ASSIGN A NUMBER 'TO DO 'X SWIPERS 'X SETBUTTONS 'X TOUCHED: ISOLATION 'X GET CHARACTERS FROM FILE 'X PARAMETERS (PARS()), ADD THEM ALL 'X GROUPS 'X CUSTOM TOUCH BEHAVIOR (AND GROUPS) 'X SPECIFIC CODE FOR EACH ELEMENT THE GUI FUNCTION 'X MENU LOADING SHOULD BE LOOKED AT (DOES IT WORK?) '- LOAD SPRITES TO THE RIGHT POSITIONS ON MENU CHANGE ' - LOAD ELEMENTS FROM T AND N: MAY REQUIRE SOME MORE ROM TO MAKE THAT WORK ' - EASY WAY: CALL EVERY ELEMENT THE NORMAL WAY, BUT KEEP STATUS=STATUS ' - WON'T WORK ' - MAKE SOMETHING FOR EACH SUB TO LOAD STATES 'X A SPRITE MANAGER SHOULD BE USED/MADE, I COULD USE THE ELEMENT ID '- MORE EFFICIENT SPRITE MANAGER, THAT DOESN'T LEAVE GAPS: ' - STORE HOW MANY OF EACH TYPE THERE IS 'X ANIMATION SUBPROGRAM: SLOWLY CHANGE A PARAMETER, LERP '- REMOVE ALL THE OBSOLETE CODE FROM PREVIOUS VERSIONS (ALSO REMOVE "TRASH" AT THE END) '- MAKE SURE THAT VARIABLES OF DIFFERENT MENUS CAN'T INTERFERE (JUMP BACK AND FORTH MENUS) ' - CLEAR ELEMENT TOUCH VARIABLES (T,N) WHEN A NEW MENU IS LOADED '- SETBUTTON HAS TWO STATES OF FLEXMODE TO SET THE DIMENTION (LIKE DIMY), MAKE IT WORK '- SOME FEATURES: LIKE FADER RETURN ON RELEASE DON'T WORK VERY WELL WHEN THE TOUCH MODE ALLOWS SLIDING TO OTHER ELEMENTS '- READ P0 AND P1 FROM SOURCE BACKGROUND 'STANDARD PARS (THE FIRST FOUR) 'FIXED: '0. GUI GROUP (GUI IDS WILL BE ASSIGNED IN CHRONOLOGICAL ORDER ACCORDING TO ELEMENT IDS) ' - DEFAULT: 0, NONE '1. GUI TOUCH BEHAVIOR MODE, DEFAULT: 0 DON'T SLIDE TO OTHER ELEMENTS, FLEX IF POSSIBLE '2. SOUND 0, DEFAULT: 0, NONE '3. SOUND 1, DEFAULT: 0, NONE 'VARIABLE: '4. SWITCH:STATES, SLIDER:STEPS[+0.000], SETBUTTON:ALTERNATIVE_GROUP_ID(IT MATTERS), SWIPER:ANGLECOUNT '5. SLIDER:RESETVAL[+0.000], SWIPER:DRAGDIST '6. SLIDER:SPRITE_CHARACTER, SWIPER:STARTANGLE '7. SLIDER:BORDER[0.5 FOR "NO LIMITS"] 'XY-PAD HAS THE SAME PARAMETERS AS A SLIDER, BUT RESETVAL IS MORE LIKE A MODE: '- MODES: MIN, CENTER, MAX FOR TWO DIMENSIONS: 3^2=9 MODES '- WOULD BE NICE TO HAVE THE XSTEPS AND YSTEPS SEPARATED, AS THEY AREN'T ALWAYS EQUAL '- I CAN EASILY INTRODUCE MORE PARAMETERS '- A SWITCH CAN FILL UP ITS REMAINING PARAMETERS WITH ADDITIONAL CHARACTERS (STATES) 'X DRAG AREA EXCEPTIONS (BUTTON-STYLED XY-PAD), "NO LIMITS" MODE 'DEFAULT SETTINGS ROM DEFINE (TO ALLOW ANY BG FILE TO WORK): '- DEFAULT SPRITE CHARACTERS '- DEFAULT P1 (P0 IS READ FROM BG) 'EACH SETBUTTON, NEEDS TO BE CALLED INDUVIDUALLY TO TINT IT 'FIND ELEMENT OF STATUS, FIND COORDS, CALL GET_RECT 'THIS APPROACH IS NOT POSSIBLE WITHOUT ADDING A LOT OF COMPLEXITY 'THE SYSTEM ISN'T MADE TO WORK LIKE THAT 'HOWEVER, IT DOES HAVE TWO FLOATS OF MEMORY LEFT PER SETBUTTON 'SO THE DIMENTIONS OF EACH SETBUTTON CAN BE GENERATED TO THERE WHEN IT'S (NOT) USED TOUCHSCREEN DIM GLOBAL PARS(6,15,7),CHARS(255),BGNUM(19,15),VARS(6,15,1) 'PARS(T,N,P) '(ELEMENT TYPE, ELEMENT NUMBER, PARAMETER TYPE) 'S E T U P V A R I A B L E S 'INCREASE THE SIZE OF THIS ARRAY IF YOU NEED MORE THAN 32 GUI ELEMENTS DIM GLOBAL IN(31) 'I MIGHT MOVE THESE GLOBAL VARIABLES TO RAM IN A FUTURE VERSION GLOBAL CX,CY,TOUCHED,MENU,TRANSITION GLOBAL XTEMP,YTEMP,XTEMP1,YTEMP1,TIMER0,VX,VY,LX,LY TOUCHED=0 MENU=0 TRANSITION=0 XTEMP=0 YTEMP=0 XTEMP1=0 YTEMP1=0 TIMER0=0 VX=0 VY=0 LX=0 LY=0 'V A R I A B L E E X P L A N A T I O N 'GENERAL VARIABLE EXPLANATION ' IN(31) : THE IN/OUTPUT OF EACH ELEMENT ' CX,CY : THE CELL THAT IS TOUCHED BY THE USER ' TOUCHED : THE ID OF THE GUI ELEMENT THAT IS TOUCHED BY THE USER ' MENU : THE MENU THAT IS CURRENTLY ACTIVE (CURRENTLY IT'S ALWAYS ZERO) ' TRANSITION : THE STATUS OF THE TRANSITION ' 0 NO TRANSITION ' -1 FIRST FRAME IN THE TRANSITION (STUFF HAS YET TO BE SET UP) ' -2 TRANSITION IS ACTIVE (THE SCREEN IS SCROLLING A FEW PIXELS EACH FRAME) ' 'ELEMENT SPECIFIC VARIABLE EXPLANATION ' ...TEMP... : A SET OF COORDINATES WHICH ARE STORED AS LONG AS THE ELEMENT IS TOUCHED ' TIMER0 : TIMER IS STORED IN THIS VARIABLE WHEN A CERTAIN TIME-BASED EVENT HAPPENS ' VX,VY : HORIZONTAL AND VERTICAL VELOCITIES ' LX,LY : LAST X AND Y -> THE CHUNK-COORDINATES OF THE MOST RECENT CHUNK-SET LOADED 'BG 1 CALL LOAD_MENU1(0) 'CALL DISP_ARRAY(CHARS()) 'CALL DISP_ARRAY1(PARS()) 'BG 0 'CALL DISP_ARRAY2(BGNUM()) 'WHILE 1 'WAIT VBL 'WEND GLOBAL LX1,LY1,LX2,LY2,LID 'GLOBAL LLX,LLY, LX1=0 LY1=0 LX2=0 LY2=0 'LLX=0 'LLY=0 LID=0 LT=-1 LN=-1 LCX=0 LCY=0 DO CALL GUI_HANDLER(LT,LN,LCX,LCY) WAIT VBL LOOP 'M A I N S U B P R O G R A M S SUB GUI_SETUP RESTORE GUI_PARS CALL ARRAY_DEFINE0(PARS()) RESTORE GUI_CHARS CALL ARRAY_DEFINE1(CHARS()) CALL FIND_ID(BGNUM()) END SUB SUB GUI_HANDLER(LT,LN,LCX,LCY) 'PER ELEMENT TOUCH (AND FLEX SETTINGS): 'X ACCEPT TOUCH SLIDES OF OTHER ELEMENTS OF THE SAME TYPE 'X ALLOW TOUCH SLIDING TO OTHER ELEMENTS OF THE SAME TYPE 'X ACCEPT TOUCH SLIDES OF OTHER ELEMENTS OF ANY TYPE 'X ALLOW TOUCH SLIDING TO OTHER ELEMENTS OF ANY TYPE 'X ACCEPT AND ALLOW TOUCH SLIDES OF OTHER ELEMENTS OF ANY TYPE '0 FLEX MODE ON IF POSSIBLE AND DON'T ALLOW TOUCH SLIDES TO OTHER ELEMENTS '1 FLEX MODE OFF AND DON'T ALLOW TOUCH SLIDES TO OTHER ELEMENTS '2 ACCEPT AND ALLOW TOUCH SLIDES TO AND OF OTHER ELEMENTS OF THE SAME TOUCH GROUP '3 ACCEPT AND ALLOW TOUCH SLIDES TO AND OF OTHER ELEMENTS OF THE SAME TYPE IF TOUCH THEN CALL GET_CTOUCH END IF IF TAP THEN LT=0 LN=0 CALL GET_PARS(LT,LN) ELSE IF TOUCH THEN T=0 N=0 CALL GET_PARS(T,N) 'PUT THIS IN A SEPARATE SUBPROGRAM IF T>=0 AND N>=0 THEN 'N GOT TOO BIG, PERHAPS A MEMORY LEAK? IF PARS(T,N,1)>=2 AND T=LT THEN IF PARS(T,N,1)=2 THEN IF LT>=0 AND LN>=0 THEN IF PARS(T,N,0)=PARS(LT,LN,0) THEN 'SLIDE TO OTHER ELEMENT OF THE SAME TYPE AND GROUP LT=T LN=N TOUCHED=0 CALL GET_RECT(CX,CY,LX1,LY1,LX2,LY2,LID) 'TRACE X,Y,"",LX1,LY1,LX2,LY2 END IF END IF ELSE IF PARS(T,N,1)=3 THEN 'SLIDE TO OTHER ELEMENT OF THE SAME TYPE LT=T LN=N TOUCHED=0 CALL GET_RECT(CX,CY,LX1,LY1,LX2,LY2,LID) 'TRACE X,Y,"",LX1,LY1,LX2,LY2 END IF END IF END IF 'IF (LT<>T OR LN<>N) AND 0 THEN ''TRACE N,T,"",LN,LT,"",CX,CY 'CALL GUI_RUN(LLX,LLY,LT,LN) 'LT=T 'LN=N 'LCX=CY 'LCY=CX 'END IF 'CHECK THE CURRENT TOUCH 'COMPARE IF IT MEETS THE REQUIREMENTS BY THE PREV BEHAVIOR MODE (SAME MODE) 'IF SO, SET IT TO THE NEW CURRENT ELEMENT 'PARS(T,N,0)=GROUP, PARS(T,N,1)=BEHAVIOR_MODE ELSE IF NOT(TOUCH) THEN TOUCHED=0 'TRACE "" 'LT=-1 'LN=-1 END IF CALL GUI_RUN(CX,CY,LT,LN) END SUB 'POINT1 SUB GUI_RUN(X,Y,T,N) 'TRACE X,Y,T,N ID=0 S0=0 S1=0 'IF (LLX<>X OR LLY<>Y) THEN IF TAP THEN CALL GET_RECT(X,Y,LX1,LY1,LX2,LY2,LID) 'TRACE X,Y,"",LX1,LY1,LX2,LY2 'LLX=X 'LLY=Y END IF 'CHECK BG FILE INSTEAD OF BG (BECAUSE THE BG CHANGES) 'P0=CELL.A(LX1,LY1) MOD 8 C0=0 CALL BG_CELLC(LX1,LY1,3,C0) 'C0=CELL.C(LX1,LY1) P0=2 'USE BG FILE 2 TO FIND THESE P1=1 C1=C0 'USE THE ROM SYSTEM 'PARS(T,N,P) 'TRACE ID 'TRACE X1,Y1,X2,Y2 'TRACE T,N 'TO TURN THE PUSHBUTTON OFF, STATUS MEMORY IS NEEDED 'TRACE VARS(T,N,0),"",T,N,0 'PARS(T,N,P) 'TRACE "T",T 'SPRITENO=MIN(63,MAX(0, N+(T-3)*4 )) SPRITENO=MIN(63,MAX(0, N+(T-3)*(UBOUND(VARS,2)+1) )) 'TRACE SPRITENO 'THIS IS INEFFICIENT, BUT THERE ARE NO FANCY WAVE DISPLAYS YET 'FOR FANCY DISPLAYS, PLEASE USE A SIMPLER METHOD: 'SMALLER SPRITES WITH CONSTANT CHARACTERS 'PREMADE: STYLISH, WITH SOME GREEN SHADING 'A CHARACTER FOR FOUR FREQUENCIES FOR EACH TYPE (HALF WAVE), 'TO TEST SETBUTTONS, USE THE ELEMENT ID, POSTPONE ELEMENT GROUPS FOR NOW IF T>=0 THEN 'OUT OF BOUNDS S0=PARS(T,N,2) S1=PARS(T,N,3) GROUP=PARS(T,N,0) FLEXMODE= ABS(PARS(T,N,1)=0) ELSE S0=0 S1=0 GROUP=0 FLEXMODE=1 END IF 'TRACE T 'IF BEHAVIOR_MODE=0 THEN FLEXMODE=1 ELSE FLEXMODE=0 'PARAMETER PRESETS FOR SLIDERS AND XYPADS IF T>=3 AND T<=4 THEN STEPS=PARS(T,N,4) RESETVAL=PARS(T,N,5)-1 CHARACTER=PARS(T,N,6) BORDER=PARS(T,N,7)+1 IF STEPS<=0 THEN STEPS=8 IF BORDER=0.5 THEN BORDER=-256 IF RESETVAL<0 THEN RESETVAL=-1 'BORDER=1 'RESETVAL=-1 END IF 'CALL FIND_ELEMENT(T,N) IF T=0 THEN CALL PUSHBUTTON(LX1,LY1,LX2,LY2,LID,VARS(T,N,0),P0,P1,C0,C1,S0,S1) CALL BUTTON_RETURN(N,VARS(T,N,0),VARS(T,N,1)) ELSE IF T=1 THEN STATES=PARS(T,N,4) CALL SWITCH(LX1,LY1,LX2,LY2,LID,VARS(T,N,0),P0,P1,C0,C1,S0,S1,STATES) CALL SWITCH_RETURN(N,VARS(T,N,0),VARS(T,N,1)) ELSE IF T=2 THEN CALL SETBUTTON(LX1,LY1,LX2,LY2,LID,VARS(T,GROUP,0),N,FLEXMODE,P0,P1,C0,C1,S0,S1) 'THIS SHOULD BE A SEPARATE SUBPROGRAM CALL UNTINT(T,GROUP,P0) CALL SETBUTTON_RETURN(N,VARS(T,0,0),VARS(T,0,1)) ELSE IF T=3 THEN IF CHARACTER<=0 THEN CHARACTER=152 CALL YSLIDER(LX1,LY1,LX2,LY2,LID,VARS(T,N,0),STEPS,BORDER,CHARACTER,SPRITENO, FLEXMODE,RESETVAL,P0,P1,C0,C1,S0,S1) CALL YSLIDER_RETURN(N,VARS(T,N,0),VARS(T,N,1)) ELSE IF T=4 THEN IF CHARACTER<=0 THEN CHARACTER=136 CALL XSLIDER(LX1,LY1,LX2,LY2,LID,VARS(T,N,0),STEPS,BORDER,CHARACTER,SPRITENO, FLEXMODE,RESETVAL,P0,P1,C0,C1,S0,S1) CALL XSLIDER_RETURN(N,VARS(T,N,0),VARS(T,N,1)) ELSE IF T=5 THEN STEPS=PARS(T,N,4) RESETVAL=PARS(T,N,5)-1.001 CHARACTER=PARS(T,N,6) BORDER=PARS(T,N,7)+1 IF BORDER=1.5 THEN BORDER=-256 IF STEPS<=0 THEN STEPS=8.008 IF CHARACTER<=0 THEN CHARACTER=139 'XSTEP=STEPS 'YSTEP=STEPS '8 XB=BORDER YB=BORDER '1 'XRESETVAL=INT(RESETVAL) 'YRESETVAL=INT((RESETVAL-XRESETVAL)*1000) XSTEP=0 YSTEP=0 CALL UNPACK_2VAL(XSTEP,YSTEP,STEPS) XRESETVAL=-1 YRESETVAL=-1 IF RESETVAL<0 THEN RESETVAL=-1 ELSE CALL UNPACK_2VAL(XRESETVAL,YRESETVAL,RESETVAL) END IF 'TRACE XRESETVAL,YRESETVAL,RESETVAL '-1 CALL XYPAD2(LX1,LY1,LX2,LY2,LID,VARS(T,N,0),VARS(T,N,1),XSTEP,YSTEP,XB,YB,CHARACTER, SPRITENO,FLEXMODE,XRESETVAL,YRESETVAL,P0,P1,C0,C1,S0,S1) CALL XYPAD_RETURN(N,VARS(T,N,0),VARS(T,N,1)) ELSE IF T=6 THEN DRAGDIST=PARS(T,N,5) ANGLECOUNT=PARS(T,N,4) STARTANGLE=PARS(T,N,6) IF DRAGDIST<=0 THEN DRAGDIST=4 IF ANGLECOUNT<=0 THEN ANGLECOUNT=4 STARTANGLE=0.25*PI END IF CALL SWIPER(LX1,LY1,LX2,LY2,LID,VARS(T,N,0),DRAGDIST,ANGLECOUNT,STARTANGLE,P0,P1,C0,C1,S0,S1) CALL SWIPER_RETURN(N,VARS(T,N,0),VARS(T,N,1)) END IF END SUB 'S U B P R O G R A M S SUB LOAD_MENU(M) MENU=M BG COPY 0,M*16,20,16 TO 0,0 SPRITE OFF FOR IY=0 TO UBOUND(BGNUM,2) FOR IX=0 TO UBOUND(BGNUM,1) BGNUM(IX,IY)=0 NEXT IX NEXT IY 'IT KEEPS USING AN OLD MAP OR SOMETHING, IT USES AN OLD BG, IT LOADS FROM A BG MAP CALL FIND_ID(BGNUM()) WHILE TOUCH WAIT VBL WEND LT=-1 LN=-1 END SUB SUB LOAD_MENU1(M) MENU=M BG COPY 0,M*16,20,16 TO 0,0 CALL GUI_SETUP END SUB SUB GET_PARS(T,N) C=0 CALL BG_CELLC(CX,CY,3,C) T=INT(CHARS(C))-1 'T=INT(CHARS(CELL.C(CX,CY)))-1 N=BGNUM(CX,CY)-1 END SUB SUB GET_CTOUCH CX=TOUCH.X\8 CY=TOUCH.Y\8 END SUB SUB BG_CELLC(X,Y,F,C) A=ROM(F) W=PEEK(A+2) C=PEEK(A+4+(X+(Y+MENU*16)*W)*2) END SUB SUB LINEAR_ANIMATION(V,T0,T1) DT=T1-T0 'THIS LINE COULD WORK WITHOUT THE REST ADD V,DT V=MIN(T1,V) END SUB SUB UNPACK_2VAL(V0,V1,V) V0=INT(V) V1=INT((V-V0)*1000) END SUB SUB UNTINT(T,G,P0) ZX1=0 ZY1=0 ZX2=0 ZY2=0 TE=0 TF=VARS(T,G,1) CALL UNPACK_ZONES(ZX1,ZY1,ZX2,ZY2,TF) CALL PACK_ZONES(LX1,LY1,LX2,LY2,TE) IF (ZX1-ZX2)<>0 AND (ZY1-ZY2)<>0 AND TE<>TF THEN BG TINT ZX1,ZY1 TO ZX2,ZY2 PAL P0 END IF VARS(T,G,1)=TE END SUB SUB PACK_ZONES(V0,V1,V2,V3,V) V = V0 + V1*32 + V2*1024 + V3*32768 END SUB SUB UNPACK_ZONES(V0,V1,V2,V3,V) V0=V MOD 32 V1=(V\32) MOD 32 V2=(V\1024) MOD 32 V3=(V\32768) MOD 32 END SUB SUB XSLIDER(X1,Y1,X2,Y2,ID,V,STEPS,BORDER,CHR,SPN,FLEX,RESETVAL,P0,P1,C0,C1,S0,S1) PSTEP=0 LOB=0 HIB=0 CALL SLIDER_CONV(X1,X2,STEPS,BORDER,PSTEP,LOB,HIB) CALL SLIDER(X1,Y1,X2,Y2,ID,V,PSTEP,LOB,HIB,0,CHR,SPN,FLEX,RESETVAL,P0,P1,C0,C1,S0,S1) END SUB SUB YSLIDER(X1,Y1,X2,Y2,ID,V,STEPS,BORDER,CHR,SPN,FLEX,RESETVAL,P0,P1,C0,C1,S0,S1) PSTEP=0 LOB=0 HIB=0 CALL SLIDER_CONV(Y1,Y2,STEPS,BORDER,PSTEP,LOB,HIB) CALL SLIDER(X1,Y1,X2,Y2,ID,V,PSTEP,LOB,HIB,1,CHR,SPN,FLEX,RESETVAL,P0,P1,C0,C1,S0,S1) END SUB SUB XYPAD2(X1,Y1,X2,Y2,ID,X,Y,XSTEP,YSTEP,XB,YB,CHR,SPN,FLEX,XR,YR,P0,P1,C0,C1,S0,S1) XPSTEP=0 YPSTEP=0 LEB=0 LOB=0 RIB=0 HIB=0 CALL SLIDER_CONV(X1,X2,XSTEP,XB,XPSTEP,LEB,RIB) CALL SLIDER_CONV(Y1,Y2,YSTEP,YB,YPSTEP,LOB,HIB) PSTEP=(XPSTEP+YPSTEP)*0.5 CALL XYPAD(X1,Y1,X2,Y2,ID,X,Y,PSTEP,LEB,LOB,RIB,HIB,CHR,SPN,FLEX,XR,YR,P0,P1,C0,C1,S0,S1) END SUB SUB SLIDER_CONV(X1,X2,S,BORDER,PIXSTEP,LOBOUND,HIBOUND) STEPS=S-1 IF BORDER<=-256 THEN L=(X2-X1)*8-BORDER*2 PIXSTEP=1 LOBOUND=(X1)+BORDER*0.125 HIBOUND=(X2)-BORDER*0.124 ELSE IF STEPS>=1 THEN L=(X2-X1)*8-BORDER*2 PIXSTEP=1.00001*L/STEPS LOBOUND=(X1)+BORDER*0.125 HIBOUND=(X2)-BORDER*0.124 END IF END SUB SUB GET_RECT(X0,Y0,X1,Y1,X2,Y2,V0) 'IT ALSO GETS A RECTANGLE LOL X=X0 Y=Y0 CALL GETID(V0,X,Y) IF V0=0 THEN EXIT SUB FOR I=-1 TO 1 STEP 2 SWAP X1,X2 SWAP Y1,Y2 X=X0 Y=Y0 REPEAT V=0 CALL FIND_DIRECTION(V,V0,X,Y,I) 'TRACE X,Y,"",V,I 'WAIT 30 UNTIL V=0 X2=X Y2=Y NEXT I END SUB SUB FIND_DIRECTION(V,V0,X,Y,S) CALL CHECKID(V,V0,X+S,Y+S) IF V THEN ADD X,S ADD Y,S EXIT SUB END IF CALL CHECKID(V,V0,X+S,Y ) IF V THEN ADD X,S EXIT SUB END IF CALL CHECKID(V,V0,X ,Y+S) IF V THEN ADD Y,S EXIT SUB END IF END SUB SUB CHECKID(V,V0,X,Y) IF X>=0 AND Y>=0 AND X<=19 AND Y<=15 THEN CALL GETID(V,X,Y) V=(V=V0) ELSE V=0 END IF END SUB SUB GETID1(V,X,Y) U=UBOUND(VARS,2)+1 V=BGNUM(X,Y)+U*INT(CHARS(CELL.C(X,Y))) END SUB SUB GETID(V,X,Y) U=UBOUND(VARS,2)+1 C=0 CALL BG_CELLC(X,Y,3,C) V=BGNUM(X,Y)+U*INT(CHARS(C)) END SUB SUB GET_ID2(V,T,N) U=UBOUND(VARS,2)+1 V=N+U*T END SUB SUB DISP_ARRAY(ARR()) FOR I=0 TO UBOUND(ARR,1) PRINT ARR(I); IF I MOD 16 = 15 THEN PAL 2 PRINT (I \ 16)*16 PAL 0 END IF NEXT I END SUB SUB DISP_ARRAY1(ARR()) FOR I=0 TO UBOUND(ARR,1)*0+2 FOR J=0 TO UBOUND(ARR,2)*0+1 FOR K=0 TO UBOUND(ARR,3) PRINT ARR(I,J,K); NEXT K PRINT "",J NEXT J NEXT I END SUB SUB DISP_ARRAY2(ARR()) FOR IY=0 TO UBOUND(ARR,2) FOR IX=0 TO UBOUND(ARR,1) 'N=IX+IY*20 V=ARR(IX,IY) PAL (V\16) MOD 8 PRINT RIGHT$(HEX$(V),1); PAL 0 NEXT IX NEXT IY END SUB SUB DISP_ARRAY3(ARR()) FOR I=0 TO UBOUND(ARR,1) PAL (I\16) MOD 8 PRINT LEFT$(HEX$(ARR(I)),1); NEXT I END SUB SUB ARRAY_DEFINE(PARS()) I=0 DO READ V IF V=1000 THEN EXIT PARS(I)=V INC I LOOP END SUB SUB ARRAY_DEFINE0(PARS()) I=0 C=0 N=0 DO READ V IF V=1000 THEN EXIT IF V<0 THEN IF V=-C THEN INC N ELSE C=ABS(V) N=0 END IF I=0 ELSE IF V<256 THEN PARS(C-1,N,I)=V INC I END IF LOOP END SUB SUB ARRAY_DEFINE1(CHARS()) I=0 C=0 DO READ V IF V=1000 THEN EXIT IF V<0 THEN C=ABS(V) ELSE IF V<=255 THEN CHARS(V)=C END IF INC I LOOP END SUB SUB FIND_ID(BGNUM()) DIM NS(6) FOR I=0 TO UBOUND(NS,1) NS(I)=1 NEXT I N=1 FOR IY=0 TO 15 FOR IX=0 TO 19 X=IX Y=IY C=CELL.C(X,Y) T=CHARS(C) IF T>=1 THEN CALL FIND_ROOT(X,Y) IF X=IX AND Y=IY THEN 'IS ROOT 'BGNUM(IX,IY)=N 'INC N A=INT(T)-1 BGNUM(IX,IY)=NS(A) INC NS(A) ELSE 'NOT ROOT BGNUM(IX,IY)=BGNUM(X,Y) END IF END IF NEXT IX NEXT IY END SUB SUB FIND_ROOT(X,Y) T0=CHARS(CELL.C(X,Y)) TI=INT(T0) I=0 DO F=(CELL.A(X,Y)\8) MOD 4 'TRACE X,Y,F C=CELL.C(X,Y) T=CHARS(C) R=T CALL ISROOT(R,F) IF R AND INT(T)=TI THEN EXIT CALL SCANAROUND(X,Y,TI) 'TRACE F,C,T,"",X,Y,"",STR$(ABS(F=0))+STR$(ABS((T-INT(T))=0))+STR$(ABS(INT(T)=TI)) 'TRACE F,C,T,"",X,Y,"",STR$(ABS(R)) +STR$(ABS(INT(T)=TI)) IF I>50 THEN EXIT INC I LOOP IF I>50 THEN TRACE "NO ROOT FOUND",X,Y END SUB SUB ISROOT(R,F) T=R-INT(R) T=INT(T*10+0.1)/10 IF T=0 THEN R=(F=0) ELSE IF T=0.1 THEN R=(F=1) ELSE IF T=0.2 THEN R=(F=2) ELSE IF T=0.3 THEN R=(F=0 OR F=1) ELSE IF T=0.4 THEN R=(F=0 OR F=2) ELSE IF T=0.5 THEN R=0 ELSE R=0 END IF END SUB SUB SCANAROUND(X,Y,TI) XI=X YI=Y FOR IY=0 TO 1 FOR IX=0 TO 1 LX=XI-IX LY=YI-IY F=(CELL.A(LX,LY)\8) MOD 4 'TRACE LX,LY,F IC=CELL.C(LX,LY) IT=CHARS(IC) IF INT(IT)=TI THEN X=LX Y=LY R=IT CALL ISROOT(R,F) IF R THEN EXIT SUB END IF END IF IF INT(TI)=4 THEN EXIT NEXT IX IF INT(TI)=5 THEN EXIT NEXT IY END SUB 'IDEAS 'IDLE ANIMATION HANDLER 'BETTER SCROLLER ' - OPTIMIZED ' - BUILT-IN TILE REFRESH 'EASIER SLIDERS ' - TWO TYPES, ONE WITH, ONE WITHOUT FLEXMODE ' - TOTAL AMOUNT OF STEPS VARIABLE THAT AUTOMATICALLY SETS THE OFFSETS AND THE STEP SIZE ' SLIDERS: ' - (STEPS,X1,Y1,X2,Y2) CAN BE USED TO GENERATE (PIXSTEP,LOBOUND,HIBOUND) ' XYPADS: ' - (SX,SY,X1,Y1,X2,Y2) CAN BE USED TO GENERATE (PIXSTEP,LEBOUND,RIBOUND,LOBOUND,HIBOUND) ' - "CHARACTER" IS MOVED TO C1 IN DATA 'A BETTER SPRITE SYSTEM ' BEHAVIOR OF GUI SPRITES: ' - AS LONG AS THE MENU IS LOADED, THE SPRITE WILL BE THERE ' - EACH ELEMENT CAN BE ASSIGNED A SPRITE ONCE ' - GLOBAL VARIABLES: ' - START, CURRENT SIZE ' - LINK ARRAY: ELEMENT ID -> SPRITE NUMBER ' - "SPRITENO" BECOMES OBSOLETE 'BOOLEAN PARAMETERS ARE TURNED INTO SEPARATE ARRAYS ' - "FLEXMODE" AND "DIMY" BECOME OBSOLETE 'OPTIMIZE SETBUTTONS TO DETERMINE THE BUTTON USING MATH INSTEAD OF A CHECK FOR EACH 'USE ARRAYS TO RETURN OUTPUTS 'OPTIMIZE FADERS AND SETBUTTONS: USE MATH TO SELECT WHICH ONE TO LOAD, DON'T LOAD ALL 'MAYBE A SUBPROGRAM THAT APPLIES THE CHARACTER AND PALETTE CHANGES (P0 TO P1) 'FULLY RAM-BASED 'ADVANTAGES 'DISADVANTAGES '- BEING ABLE TO DIRECTLY USE AN OUTPUT THAT IS NOT A "DISPLAY" 'ALL VALUES ARE RETURNED IN ONE ARRAY (KEEP RAM CLEAN) 'AUTODETECT: ZONES, ID 'BG : P0,C0 'BG FILES: P1,C1 'OPTIONAL CONFIGURATIONS: S0,S1,FLEX(DEFAULT ON),STEPS(DEFAULT 8),ZERO(DEFAULT -1) ' '- MAKE IT NX-LIKE, WITH A SUBPROGRAM FOR EACH OPERATION: ' - SET_SOUND(T,N,S0,S1) ' - SET_VSLIDER(N,FLEX,SPRITE_CHAR,STEPS,ZERO) ' - SET_HSLIDER(N,FLEX,SPRITE_CHAR,STEPS,ZERO) ' - SET_XYPAD(N,FLEX,SPRITE_CHAR,XSTEPS,YSTEPS,XZERO,YZERO) ' - SET_SWIPER(N,COUNT,OFFSET,DRAG_DIST) ' - SET_SIDEBAR(N,DIRECTION,DRAG_DIST) ' - SET_SCROLLERX(N,MIN,MAX,FRICTION) ' - SET_SCROLLERY(N,MIN,MAX,FRICTION) ' - SET_SCROLLER2D(N,XS,XB,YS,YB, FRICTION) ' - VALUE 1000 TO IGNORE THAT PARAMETER 'SCROLLERS OCCUPY THE REMAINING CHARACTERS 'REMOVED: DX,DY,COUNT: ELEMENTS ARE MORE INDUVIDUAL 'SLIDERS WILL HAVE A VARIABLE TO ADJUST THE DISTANCE LIMIT FROM THE SIDES, '- BUT IT'S DEFINED INSIDE THEIR SUBPROGRAM 'AN ARRAY WIL BE GENERATED ON SETUP WITH AN ID FOR EACH ELEMENT'S TOP-LEFT CELL COORDINATES IN EACH ELEMENT TYPE ' 'USER DEFINED FUNCTION CALLS: ONE MASSIVE IF STATEMENT FOR EACH TYPE 'G U I L I B R A R Y 2 - B Y S P 4 C E B A R 'SUBPROGRAMS FOR BUTTONS SWITCHES, SLIDERS AND A 7 SEGMENT DISPLAY 'YOU'RE FREE TO USE THESE IN YOUR OWN CODE ' 'THE GUI LIBRARY HANDLES GUI LOGIC, PALLETTES, AND SLIDER-SPRITES 'THE BUTTON CHARACTERS SOULD BE DRAWN IN A BG WRITING PROGRAM LIKE GFX DESIGNER 'YOU'RE FREE TO USE THE BUTTON-CHARACTERS THAT ARE USED IN THIS DEMO 'EACH GUI ELEMENT IS UPDATED ONCE EACH FRAME 'TO INCREASE PERFORMANCE, YOU COULD TRY TO DIVIDE THEM UP IN SCREEN REGIONS 'TO DO LIST 'ADD THE SATISFYING COLOR CHANGE ON TOUCH TO SLIDERS AND OTHER ELEMENTS 'TO DO '- FIX STUFF 'X UPGRADE POLAR '- FIX TAP '- USE RAM TO STORE THE IN() VALUES AND THE GLOBAL VARIABLES '- USE SUBPROGRAMS TO READ OR WRITE THE STATUS VALUE '- USE ONE GLOBAL TO SET THE START ADDRESS '- MULTI-STATE SWITCH 'FILE-BASED VERSION '- IN() IS STORED IN RAM '- THE SUBPROGRAMS TO READ/WRITE KNOW WHERE IN RAM ONE ELEMENT STARTS AND WHERE IT ENDS '- PARAMETERS ARE STORED IN RAM '- GUI EDITOR IS USED TO SETUP THE GUI '- OPTIMIZATION: CALL THE ELEMENTS AT THE TAP AND THE ACTIVE ELEMENTS '- OPTIMIZED VERSION '> [DONE]PERHAPS ONE CENTRAL FUNCTION DETERMINES WHICH ONES ARE ACTIVE AND WHICH ONES AREN'T 'GUI LIBRARY 1 '- ALL SUBS ARE CALLED EACH LOOP '- SUB MUST CHECK BEFORE ACTIVATING 'GUI LIBRARY 2 '- ONE SUB IS CALLED EACH LOOP '- WHEN A SUB IS CALLED: IT IS ACTIVE 'SIMPLIFIED DATA USAGE: 'ONE MAP, AND THE REST IS A LIST OF ZONES 'SETBUTTONS ACT AS A LITTLE DISPLAY, MAYBE ADD A DISPLAY ELEMENT FOR THAT 'TO DO / IDEAS '- TOOL TO OVERLAY THE MAP AND TO DRAW THE ZONES '- USE ADDRESSES INSTEAD OF THE IN() ARRAY '> [DONE] ZONES FILE OF SIZE PARAMETERS ' - LOOK FOR TIMO'S ZONES PROGRAM AND SEE IF MY ZONES CAN BE MADE COMPATIBLE WITH IT '> [DONE] GUI MAP GENERATOR, WHICH WILL GENERATE A GUI MAP WHENEVER A MENU IS LOADED ' SO THAT THESE MAPS DON'T HAVE TO BE MADE OR STORED '> [DONE] ZONES SOURCE '> [DONE] REPEATED ELEMENTS ALSO NEED TO BE AUTOMATICALLY WRITTEN TO THE MAP '> [DONE] USE BETTER IF, WITH "EXIT SUB" INSTEAD OF "ELSE" IN THE GUI ELEMENT SELECTOR 'POSSIBLE CHANGES '- PARAMETERS ARE STORED ELSEWHERE '- A GENERALIZED ELEMENT REPEATER 'EACH ELEMENT IN THE FILE (12 BYTES) CONTAINS: 'X1,Y1,X2,Y2,DX,DY,N,PAL1+2 AND FLAG1+2 ,CHAR1,CHAR2,SOUND1(ON/CHANGE(TICK)),SOUND2(OFF) 'FLAG1: '0: SPRITE-LIKE CHAR ' - C,C+1X,C+1Y,C+1X+1Y ' - SIZE IS DERIVED FROM THE PARAMETERS (X1 ... Y2) '1: FLIP FILL CHAR ' - CORNER=C,EDGE=C+1,CENTER=C+2 ' - IF SIZE (X1 ... Y2) IS SMALLER THEN IT WON'T CARE ABOUT C+2 OR EVEN C+1 'FLAG2: '0: NOT A SLIDER (SO IT'S LIKE A BUTTON) '1: A SLIDER, NOW WE DON'T NEED FLAG 1 ANYMORE ' - FLAG1 CAN BE USED TO SET AN ACTIVE CHAR2 AND PAL2 FOR THE STATIC SLIDER CHARACTERS 'FOR SLIDERS THE CHAR AND PAL PARAMETERS APPLY FOR THE SPRITE (WHEN TOUCHED AND NOT TOUCHED) ' 'THESE PARAMETERS DON'T HAVE TO BE PROVIDED IN THE SUB CALL ANYMORE ' 'GUI DESIGNER GUI (NOT THAT NEEDED) 'BUTTONS: '- SELECT ELEMENT SCROLLER '- MAP '- CHAR AND PAL AND CHAR MODE SELECT (FOR ON AND OFF STATE, AND BOTH CHAR MODES) 'FUNCTION TO AUTO-GENERATE NX BG MAP (VISUAL) 'SOUND EFFECTS EDITOR (PROGRAM) 'REMEATERS SHOULD RETURN AN ARRAY SO THAT THE FILES CAN BE WRITTEN OUTSIDE OF THE FUNCTION 'THIS IS NECCESSARY TO USE THE API 'IDEA: BG GENERATOR SUBPROGRAM, WHEN CALLED IT'LL DRAW A BUTTON FOR EACH BUTTON, SWITCH, OR SWIPER, MULTIPLE BUTTONS FOR EACH SETBUTTON, A LINE FOR EACH FADER, A MAP FOR EACH XY PAD 'DISPLAYS ARE ALREADY LOADED AUTOMATICALLY 'FIXED PARAMETER-COUNT APPROACH '- FIXED AMOUNT (FOR EXAMPLE 20 BYTES) '- USED DIFFERENTLY BY EACH ELEMENT '01010202000000 '01030204000000 '04010902000000 '01080209000000 '010A020B000000 '03080409000000 '030A040B000000 '05080609000000 '050A060B000000 '0806090B000000 '040E0B0E000000 '0F0B120E000000 '0F051208000000 '0A010D08000000 '08030904000000 '0F011002000000 DATA 20, 16 TOUCHZONESF: DATA 18,0 ,19,15,0 ,0 ,255 DATA 1 ,1 ,2 ,2 ,0 ,0 ,255 DATA 1 ,3 ,2 ,4 ,0 ,0 ,255 DATA 4 ,1 ,5 ,2 ,129,127,2 DATA 8 ,10,9 ,11,127,125,2 DATA 1 ,8 ,2 ,9 ,0 ,0 ,255 DATA 1 ,10,2 ,11,0 ,0 ,255 DATA 3 ,8 ,4 ,9 ,0 ,0 ,255 DATA 3 ,10,4 ,11,0 ,0 ,255 DATA 5 ,8 ,6 ,9 ,0 ,0 ,255 DATA 5 ,10,6 ,11,0 ,0 ,255 DATA 4 ,14,11,14,0 ,0 ,255 DATA 10,1 ,10,8 ,128,127,3 DATA 15,11,18,14,0 ,0 ,255 DATA 15,5 ,18,8 ,0 ,0 ,255 DATA 15,1 ,16,2 ,0 ,0 ,255 DATA 8 ,3 ,9 ,4 ,0 ,0 ,255 DATA -1 'DATA 0 ,0 ,15,15,0 ,0 ,255 'DATA 16 ,0 ,19,15,0 ,0 ,255 'DATA -1 DATA 0 ,0 ,19,15,0 ,0 ,255 DATA 0 ,0 ,15,15,0 ,0 ,255 DATA -1 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,17,17 'DATA 0 ,1 ,1 ,0 ,3 , 3 ,3 ,3 ,3 ,3 , 12,12,12,12,0 , 15,15,0 ,17,17 'DATA 0 ,1 ,1 ,0 ,3 , 3 ,3 ,3 ,3 ,3 , 12,12,12,12,0 , 15,15,0 ,17,17 'DATA 0 ,2 ,2 ,0 ,0 , 0 ,0 ,0 ,16,16, 12,12,12,12,0 , 0 ,0 ,0 ,17,17 'DATA 0 ,2 ,2 ,0 ,0 , 0 ,0 ,0 ,16,16, 12,12,12,12,0 , 0 ,0 ,0 ,17,17 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 12,12,12,12,0 , 14,14,14,14,17 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,4 ,4 , 12,12,12,12,0 , 14,14,14,14,17 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,4 ,4 , 12,12,12,12,0 , 14,14,14,14,17 'DATA 0 ,5 ,5 ,7 ,7 , 9 ,9 ,0 ,4 ,4 , 12,12,12,12,0 , 14,14,14,14,17 'DATA 0 ,5 ,5 ,7 ,7 , 9 ,9 ,0 ,4 ,4 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,17,17 'DATA 0 ,6 ,6 ,8 ,8 , 10,10,0 ,4 ,4 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,17,17 'DATA 0 ,6 ,6 ,8 ,8 , 10,10,0 ,4 ,4 , 0 ,0 ,0 ,0 ,0 , 13,13,13,13,17 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 13,13,13,13,17 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 13,13,13,13,17 'DATA 0 ,0 ,0 ,0 ,11, 11,11,11,11,11, 11,11,0 ,0 ,0 , 13,13,13,13,17 'DATA 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,17,17 GLOBAL ROM_ADDRESS,VAR_ADDRESS,ZONE_ADDRESS GLOBAL ROM_SIZE,VAR_SIZE,ZONE_SIZE GLOBAL CURRENT_MENU CURRENT_MENU=0 'ROM: 7-SEG 'VAR: GUI VARIABLES 'ZONE: TOUCH ZONES ROM_ADDRESS=$C000 VAR_ADDRESS=$A000 ZONE_ADDRESS=$B000 'AMOUNT OF MENUS L=2 DEC L DIM GLOBAL PAR_ADDR(L) DIM GLOBAL PAR_SIZE(L) READ X,Y DEC X DEC Y DIM GLOBAL TMAP(X,Y) 'TRACE UBOUND(TMAP,1), UBOUND(TMAP,2) RESTORE TOUCHZONESF A=ZONE_ADDRESS FOR I=0 TO L PAR_ADDR(I)=A READ V REPEAT POKE A,V INC A READ V UNTIL V=-1 'DEC A 'ADD A,7 PAR_SIZE(I)=A-PAR_ADDR(I)-1 NEXT I CALL LOADMENU(0) ZONE_SIZE=A-ZONE_ADDRESS 'TRACE (A-ZONE_ADDRESS) MOD 7 'CALL VIEWMAP 'DO 'WAIT VBL 'LOOP RESTORE AFTER AFTER: 'HERE WERE THE GLOBAL VARIABLES ONCE 'S E T U P G R A P H I C S BG COPY 0,0,20,16 TO 0,0 BG 1 BG COPY 20,0,5,32 TO 20,32 BG 0 TOUCHSCREEN 'RASTERFX TO ZOOM OUT VERTICALLY TO SEE ALL 32 VERTICAL CELLS (DEBUGGING TOOL) 'ON RASTER CALL RASTERFX 'P R E D E F I N E D T E X T 'THIS CODE READS 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)="" 'DEFINE YOUR TEXT FILE HERE: DATA "THIS ","IS A ","LONG ","LINE ","OF ","TEXT " DATA "I THIN","K THER","E ARE ","QUITE ","A LOT ","OF CHA","RACTER","S IN H","ERE" DATA "IS IT ","HARD T","O DISP","LAY TE","XT?" DATA "///" '7 - S E G M E N T D I S P L A Y 'THIS CODE WRITES THE CHARACTER VALUES FROM BELOW TO RAM TO BE USED AS A TABLE FOR I=0 TO 63 READ V POKE ROM_ADDRESS+I,V NEXT I DATA 158,158,158,158 DATA 140,156,140,156 DATA 143,159,159,143 DATA 143,159,143,159 DATA 157,157,141,157 DATA 159,143,143,159 DATA 159,143,159,159 DATA 142,158,140,156 DATA 159,159,159,159 DATA 159,159,143,159 DATA 159,159,157,157 DATA 157,141,159,159 DATA 158,142,158,142 DATA 141,157,159,159 DATA 159,143,159,143 DATA 159,143,157,141 GLOBAL TOUCHED2 TOUCHED2=0 'INIT MENU 0 (CALL EACH ELEMENT ONCE TO MAKE SURE EVERY SPRITE IS SHOWN) FOR I=0 TO 17 CALL M0(I) NEXT I SUB VIEWMAP FOR J=0 TO 15 FOR I=0 TO 19 V=TMAP(I,J) IF V=0 THEN PAL 0 ELSE PAL (1+V\16) MOD 8 END IF TEXT I,J,RIGHT$(HEX$(V),1) NEXT I NEXT J END SUB SUB LOADMENU(N) MENU=N CURRENT_MENU=N CALL MAPGENF(PAR_ADDR(N),PAR_SIZE(N)) END SUB SUB MAPGENF(A0,AS) A=A0 ID=1 REPEAT CALL MAPGEN2F(ID,A) 'TRACE (A-A0)\7,(A-A0) MOD 7 UNTIL A>A0+AS END SUB SUB MAPGEN2F(ID,A) X1=PEEK(A) Y1=PEEK(A+1) X2=PEEK(A+2) Y2=PEEK(A+3) V=PEEK(A+6) 'TRACE X1,Y1,X2,Y2 'WAIT 1 IF V=255 THEN ADD A,7 CALL MAPWRITE1(ID,X1,Y1,X2,Y2) INC ID EXIT SUB END IF DX=PEEK(A+4)-127 DY=PEEK(A+5)-127 N =PEEK(A+6) ADD A,7 CALL MAPWRITE2(ID,X1,Y1,X2,Y2,DX,DY,N) INC ID END SUB SUB MAPWRITE1(ID,X1,Y1,X2,Y2) FOR J=Y1 TO Y2 FOR I=X1 TO X2 'I1=I MOD (UBOUND(TMAP,1)+1) 'J1=J MOD (UBOUND(TMAP,2)+1) TMAP(I,J)=ID NEXT I NEXT J END SUB SUB MAPWRITE2(ID,X1,Y1,X2,Y2,DX,DY,N) FOR I=0 TO N CALL MAPWRITE1(ID,X1,Y1,X2,Y2) ADD X1,DX ADD X2,DX ADD Y1,DY ADD Y2,DY NEXT I END SUB SUB GETPAR(ID,V,O) V=PEEK(PAR_ADDR(CURRENT_MENU)+(ID-1)*7+O) END SUB SUB GETRECT(ID,X1,Y1,X2,Y2) 'IT GETS A RECTANGLE LOL CALL GETPAR(ID,X1,0) CALL GETPAR(ID,Y1,1) CALL GETPAR(ID,X2,2) CALL GETPAR(ID,Y2,3) END SUB SUB GETREPEAT(ID,DX,DY,N) CALL GETPAR(ID,DX,4) CALL GETPAR(ID,DY,5) CALL GETPAR(ID,N ,6) ADD DX,-127 ADD DY,-127 END SUB 'M A I N L O O P 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 'M A I N G U I SUB GUI IF TRANSITION THEN CALL TRANSITION WAIT VBL EXIT SUB END IF IF NOT(TOUCH) THEN TOUCHED2=0 TOUCHED=0 'WHILE NOT(TOUCH) 'WAIT VBL 'TRACE TIMER 'WEND 'EXIT SUB END IF R=-1 CX=TOUCH.X\8 CY=TOUCH.Y\8 CALL CMAP(CX,CY,R) IF TAP THEN TOUCHED2=R END IF CALL GOTOMENU(R) WAIT VBL IF NOT(TOUCH) THEN CALL M0(TOUCHED2) END IF END SUB SUB CMAP(X,Y,V) V=TMAP(X,Y) END SUB SUB GOTOMENU(R) IF MENU=0 THEN CALL M0(TOUCHED2) EXIT SUB END IF IF MENU=1 THEN CALL M1(TOUCHED2) EXIT SUB END IF END SUB 'T R A N S I T I O N S SUB TRANSITION IF TRANSITION=-1 THEN 'RESET THE SPRITES SPRITE OFF 'LOAD FOUR TEXT CHUNKS THAT ARE 8 CELLS HIGH EACH TO FILL THE TEXT-DISPLAY BOX FOR I=0 TO 3 CALL LOADCHUNK(20,8*I,6,1,0,2,0) NEXT I 'MARK THESE TASKS AS COMPLETED (THE TRANSITION SUB WILL STILL BE CALLED) TRANSITION=-2 END IF 'SCROLL A FEW PIXELS EACH FRAME 'NOTE: THE TRANSITION VARIABLE IS SET TO ZERO ONCE SWIPEANIMATION REACHES ITS END 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) END SUB 'M E N U 0 SUB M0(S) IF S=1 THEN 'A SIDEBAR (SUBMENU) FOR EACH SIDE OF THE SCREEN 'LEFT (DISABLED) 'CALL SIDEBAR(0,0,1,15,18,IN(24),0,18) 'RIGHT CALL SIDEBAR(1,IN(25),2,10) CALL M0D(11) 'UP (DISABLED) 'CALL SIDEBAR(0,0,19,1,20,IN(26),1,18) 'DOWN (DISABLED) 'CALL SIDEBAR(0,14,19,15,21,IN(27),3,10) EXIT SUB END IF IF S=2 THEN 'CREATE GUI ELEMENTS FOR MENU 0 HERE: 'DEMO ELEMENTS 'AN EMPTY BUTTON CALL PUSHBUTTON(2,IN(0),0,1) EXIT SUB END IF IF S=3 THEN 'AN EMPTY SWITCH CALL SWITCH(3,IN(1),0,1) EXIT SUB END IF IF S=4 THEN 'THE TOP ROW OF HORIZONTAL SETBUTTONS CALL SETBUTTONS(4,IN(2),0,0,1) EXIT SUB END IF IF S=5 THEN 'THE BOTTOM ROW OF VERTICAL SETBUTTONS WHICH SHARES THE IN(3) VARIABLE WITH COUNTER 3 AND HAS FLEXMODE ENABLED CALL SETBUTTONS(5,IN(3),-1,0,1) CALL M0D(5) EXIT SUB END IF IF S=6 THEN 'COUNTER 1 WITH AUTOCOUNTING, WITH LOOP, COUNTS FROM 0 TO 9 CALL PUSHBUTTON(6,IN(4),0,1) CALL M0D(0) EXIT SUB END IF IF S=7 THEN CALL PUSHBUTTON(7,IN(5),0,1) 'THIS AND THE PREVIOUS ELEMENT USED TO SHARE THE SAME ID CALL M0D(0) EXIT SUB END IF IF S=8 THEN 'COUNTER 2 WITH FAST AUTOCOUNTING, WITHOUT LOOP, COUNTS FROM 0 TO 15 CALL PUSHBUTTON(8,IN(6),0,1) CALL M0D(1) EXIT SUB END IF IF S=9 THEN CALL PUSHBUTTON(9,IN(7),0,1) CALL M0D(1) EXIT SUB END IF IF S=10 THEN 'COUNTER 3 WITHOUT AUTOCOUNTING, WITHOUT LOOP, COUNTS FROM 0 TO 2 CALL PUSHBUTTON(10,IN(8),0,1) CALL M0D(2) EXIT SUB END IF IF S=11 THEN CALL PUSHBUTTON(11,IN(9),0,1) CALL M0D(2) EXIT SUB END IF IF S=12 THEN 'THE HORIZONTAL SLIDER ON THE LEFT WITH FLEXMODE ENABLED CALL SLIDER(0,0,0,0,12,IN(12),3.7,4.1,11.4,0,136,1,-1,-1) CALL M0D(6) EXIT SUB END IF IF S=13 THEN 'THE 4 VERTICAL SLIDERS ON THE RIGHT WITH FLEXMODE DISABLED CALL SLIDERS(13,13,1,1,8,-1,152,2,0,-1) CALL M0D(7) EXIT SUB END IF IF S=14 THEN 'THE XY-PAD ON THE BOTTOM RIGHT WITH FLEXMODE AND WHICH JUMPS BACK TO CENTER UPON RELEASE CALL XYPAD(14,IN(17),IN(18),1,15.2,11.2,18,14,139,10,-1,12,12) CALL M0D(8) EXIT SUB END IF IF S=15 THEN 'THE XY-PAD ON THE RIGHT WITH FLEXMODE ENABLED CALL XYPAD(15,IN(19),IN(20),1,15,5,18,8,139,11,-1,-1,0) CALL M0D(9) EXIT SUB END IF IF S=16 THEN 'THE SWIPER ON THE TOP RIGHT CALL SWIPER(16,IN(21),5,4,2.25*PI,0,1) EXIT SUB END IF IF S=17 THEN 'THE BUTTON-STYLE XY-PAD AT THE TOP CALL XYPAD(17,IN(22),IN(23),1,0,0,19,15,139,12,-1,4,4) CALL M0D(10) EXIT SUB END IF END SUB SUB M0D(S) IF S=0 THEN CALL COUNTER(IN(4),IN(5),IN(10),9,-1,10,40) CALL M0D(3) EXIT SUB END IF IF S=1 THEN CALL COUNTER(IN(6),IN(7),IN(11),15,0,5,30) CALL M0D(4) EXIT SUB END IF IF S=2 THEN CALL COUNTER(IN(8),IN(9),IN(3),2,0,0,0) CALL M0D(5) EXIT SUB END IF IF S=3 THEN CALL SEG7(1,6,IN(10)) EXIT SUB END IF IF S=4 THEN CALL SEG7(3,6,IN(11)) EXIT SUB END IF IF S=5 THEN CALL SEG7(5,6,IN(3)+1) EXIT SUB END IF IF S=6 THEN 'THE 7-SEGMENT DISPLAY AT THE BOTTOM CALL SEG7(1,13,IN(12)) EXIT SUB END IF IF S=7 THEN 'THE NUMBERS THAT DISPLAY THE VALUES OF THE GROUP OF FOUR SLIDERS NUMBER 10,9,IN(13),2 NUMBER 11,10,IN(14),2 NUMBER 12,11,IN(15),2 NUMBER 13,12,IN(16),2 EXIT SUB END IF IF S=8 THEN 'THE NUMBERS THAT DISPLAY THE VALUES OF THE XY-PADS ON THE RIGHT NUMBER 15,15,IN(17),2 NUMBER 17,15,IN(18),2 EXIT SUB END IF IF S=9 THEN NUMBER 15,9,IN(19),2 NUMBER 17,9,IN(20),2 EXIT SUB END IF IF S=10 THEN 'THE NUMBERS THAT DISPLAY THE VALUES OF THE BUTTON-STYLE XY-PAD NUMBER 5,3,IN(22),3 NUMBER 5,4,IN(23),3 EXIT SUB END IF IF S=11 THEN 'IF SIDEBAR-RIGHT RETURNS TRUE THEN IT'S TIME TO OPEN THAT SIDEBAR IF IN(25) THEN TRANSITION=-1 CALL LOADMENU(1) END IF EXIT SUB END IF END SUB 'M E N U 1 SUB M1(S) IF S<>2 THEN 'SCROLL THE SCREEN TO THE CORRECT POSITION CALL SCROLLER(1,0,IN(2),0,0,-5000,0,0.05) SCROLL 1,40,-IN(2) 'LOAD ANY NEW TEXT CHUNKS IF NECCESSARY CALL CHECKCHUNK1D(160,-IN(2),6,1,0,2,0) IF S=1 THEN EXIT SUB END IF IF S=2 THEN 'IF THE PART OF THE SCREEN THAT ISN'T PART OF THIS MENU IS PRESSED THEN CLOSE THIS MENU CALL PUSHBUTTON(2,IN(0),-1,-1) CALL M1D(0) EXIT SUB END IF END SUB SUB M1D(S) IF S=0 THEN IF IN(0) THEN IN(25)=0 TRANSITION=-1 CALL LOADMENU(0) END IF EXIT SUB END IF END SUB SUB CALL_ELEMENT(TYPE,ID,P0,P1,P2,P3,P4,P5,P6,P7) IF TYPE=0 THEN EXIT SUB END IF IF TYPE=1 THEN EXIT SUB END IF IF TYPE=2 THEN EXIT SUB END IF IF TYPE=3 THEN EXIT SUB END IF IF TYPE=4 THEN EXIT SUB END IF IF TYPE=5 THEN EXIT SUB END IF IF TYPE=6 THEN EXIT SUB END IF IF TYPE=7 THEN EXIT SUB END IF IF TYPE=8 THEN EXIT SUB END IF IF TYPE=9 THEN EXIT SUB END IF END SUB 'P A R A M E T E R O V E R V I E W ' 'TRIGGER SUBS: ' PUSHBUTTON (X1,Y1,X2,Y2,ID,STATUS,P0,P1) ' SWITCH (X1,Y1,X2,Y2,ID,STATUS,P0,P1) ' 'SET SUBS: ' SETBUTTONS (X1,Y1,X2,Y2,ID,STATUS,FLEXMODE,P0,P1,DX,DY,COUNT) ' SETBUTTON (X1,Y1,X2,Y2,ID,STATUS,MODE,FLEXMODE,P0,P1) ' 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,P0,P1) ' 'MENU AND MISCELLANEOUS SUBS: ' 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) ' CHECKCHUNK1D(X,Y,W,BGN,ADDR,T,SIDESCROLL) ' LOADCHUNK (X,Y,W,BGN,ADDR,T,SIDESCROLL) ' 'GRAPHICAL SUBS: ' SEG7 (X,Y,F) ' ARROWDRAW (X1,Y1,DIRECTION,THEME) ' SWIPEANIMATION(B,X2,Y2,STEPS) '========================================================================================= 'G U I E L E M E N T S 'YOU CAN VIEW ALL GUI ELEMENTS AND THEIR DESCRIPTIONS HERE: 'G E N E R A L D E S C R I P T I O N '- 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, IT CAN ALSO BE SHARED BY MULTIPLE ELEMENTS '- P0 (OFF) AND P1 (ON) ARE THE PALETTES THAT BELONGS TO THE OFF OR ON STATE OF THE ELEMENT 'NOTE: TO DISABLE PALETTE CHANGING, SET THE PALETTE AS A VALUE SMALLER THAN ZERO 'GLOBAL VARIABLES REQUIRED FOR ANY ELEMENT: TOUCHED,CX,CY 'P U S H B U T T O N SUB PUSHBUTTON(X1,Y1,X2,Y2,ID,STATUS,P0,P1,C0,C1,S0,S1) 'TO TRIGGER SOMETHING 'INPUTS : SEE "GENERAL DESCRIPTION" 'OUTPUTS: THE BUTTON-PRESS DURATION IS RETURNED VIA THE "STATUS" VARIABLE 'CODE EXPLANATION: '1 THE BIG IF STATEMENT CHECKS IF THIS BUTTON IS PRESSED AND IF IT ALSO WAS TAPPED BEFORE '2 MARK THIS ELEMENT AS SELECTED '3 SET STATUS TO 1 IF TAPPED, INCREMENT STATUS IF NOT TAPPED: STATUS IS PRESS DURATION '4 CHANGE THE COLOR PALLETTE TO "ON" IF AN "ON" PALETTE IS DEFINED '5 ELSE IF THE BUTTON IS NOT PRESSED BUT THE OUTPUT HASN'T BEEN RESET YET '6 RESET THE OUTPUT TO ZERO '7 CHANGE THE COLOR PALLETTE TO "OFF" IF AN "OFF" PALETTE IS DEFINED 'TRACE CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2,(TOUCHED=0 OR TOUCHED=ID),STATUS,TOUCHED,ID 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-STATUS*(NOT(TAP)) IF P1>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL P1 ELSE IF STATUS<>0 THEN 'TRACE "OFF",P0,"",X1,Y1,X2,Y2 STATUS=0 IF P0>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL P0 END IF END SUB 'S W I T C H SUB SWITCH(X1,Y1,X2,Y2,ID,STATUS,P0,P1,C0,C1,S0,S1,STATES) 'TO TOGGLE SOMETHING 'INPUTS : SEE "GENERAL DESCRIPTION" 'OUTPUTS: THE ON (-1) OR OFF (0) STATE 'CODE EXPLANATION '1 THE BIG IF STATEMENT CHECKS IF THIS BUTTON IS TAPPED '2 MARK THIS ELEMENT AS SELECTED '3 INVERT STATUS (WHICH IS OUR OUTPUT) '4 IF BOTH THE "ON" PALETTE AND THE "OFF" PALETTE ARE DEFINED '5 SET THE PALETTE OF OUR SWITCH TO "ON" OR "OFF" DEPENDING ON THE STATUS VARIABLE IF TAP AND CX>=X1 AND CY>=Y1 AND CX<=X2 AND CY<=Y2 AND TOUCHED=0 THEN TOUCHED=ID STATUS=NOT(STATUS) IF P0>=0 AND P1>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL P1*ABS(STATUS)+P0*ABS(NOT(STATUS)) END IF END IF END SUB 'S E T B U T T O N R E P E A T E R SUB SETBUTTONS(ID,STATUS,FLEXMODE,P0,P1) 'DEFINES A PAIR OF BUTTONS OF WHICH ONLY ONE CAN BE TURNED ON AT ANY TIME 'INPUTS: X1,Y1,X2,Y2 : THE POSITION AND SIZE OF THE FIRST SETBUTTON ' DX,DY : THE OFFSET BETWEEN EACH SETBUTTON AND ITS NEIGHBOR ' COUNT : THE AMOUNT OF SETBUTTONS ' THE DIRECTION FOR FLEXMODE IS DETERMINED AUTOMATICALLY (IN THIS SUB) ' FLEXMODE MAKES AN ELEMENT RESPOND EVEN IF YOU DON'T TOUCH IT'S CELLS ' THE OTHER INPUTS ARE PASSED TO THE SETBUTTON SUBPROGRAM 'SUBPROGRAMS: SETBUTTON 'CODE EXPLANATION: '1 IF FLEXMODE IS ENABLED '2 SET THE DIRECTION OF FLEXMODE TO HORIZONTAL OR VERTICAL DEPENDING ON DX AND DY '3 DIAGONAL FLEXMODE ISN'T SUPPORTED, SO FLEXMODE WILL BE TURNED OFF(0) IF DIAGONAL(3) ' NOTE: CONDITIONS RETURN -1 IF TRUE: LINE 2 GETS NEGATIVE, LINE 3 GETS POSITIVE '4 FOR EACH BUTTON '5 WE DEFINE A SETBUTTON: COORDINATES ARE GENERATED, OTHER VARIABLES ARE PASSED ON X1=0 Y1=0 X2=0 Y2=0 DX=0 DY=0 COUNT=0 CALL GETRECT(ID,X1,Y1,X2,Y2) CALL GETREPEAT(ID,DX,DY,COUNT) IF FLEXMODE THEN FLEXMODE=(DX<>0)*2+(DY<>0) FLEXMODE=FLEXMODE*(FLEXMODE>=-2) END IF FOR I=0 TO COUNT CALL SETBUTTON(X1+DX*I,Y1+DY*I,X2+DX*I,Y2+DY*I,ID+0.1,STATUS,I,FLEXMODE,P0,P1) NEXT I END SUB 'POINT2 'S E T B U T T O N SUB SETBUTTON(X1,Y1,X2,Y2,ID,STATUS,MODE,FLEXMODE,P0,P1,C0,C1,S0,S1) '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 'CODE EXPLANATION: '1 SET THE VARIABLE A TO TRUE IF TOUCH IS WITHIN THE HORIZONTAL BOUNDARIES '2 SET THE VARIABLE B TO TRUE IF TOUCH IS WITHIN THE VERTICAL BOUNDARIES '3 SET THE VARIABLE C TO TRUE IF FLEXMODE NEEDS TO WORK '4 THE BIG IF STATEMENT CHECKS IF THIS BUTTON IS PRESSED AND IF IT ALSO WAS TAPPED BEFORE '5 MARK THIS ELEMENT AS SELECTED '6 SET THE STATUS OF THE BUTTON-SET TO THE BUTTON-ID OF THIS BUTTON '7 CHANGE THE COLOR PALLETTE TO "ON" IF AN "ON" PALETTE IS DEFINED '8 ELSE (IF THE BUTTON IS NOT PRESSED) (GETS EXECUTED EVERY OTHER LOOP) '9 IF THIS ELEMENT IS STILL SELECTED '10 CHANGE THE COLOR PALLETTE TO "ON" IF AN "ON" PALETTE IS DEFINED '11 ELSE '12 CHANGE THE COLOR PALLETTE TO "OFF" IF AN "OFF" PALETTE IS DEFINED A=CX>=X1 AND CX<=X2 B=CY>=Y1 AND CY<=Y2 C=(FLEXMODE=1 AND B) OR (FLEXMODE=2 AND A) IF TOUCH AND ((A AND B AND (TOUCHED=0 OR TOUCHED=ID)) OR (C AND TOUCHED=ID)) THEN TOUCHED=ID STATUS=MODE IF P1>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL P1 ELSE IF P0>=0 AND P1>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL P1*ABS(STATUS=MODE)+P0*ABS(NOT(STATUS=MODE)) END IF END IF END SUB 'C O U N T E R 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 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 STARTS TO COUNT REPEATEDLY ' (THE PREVIOUS COMMAND SETS THE REPEATING SPEED) 'OUTPUTS: THE COUNT VALUE TO STATUS 'GLOBAL VARS: TIMER0 (TO FIGURE OUT WHEN TO INCREMENT) 'CODE EXPLANATION: '1 IF (INC-BUTTON EXCEEDED PRESSDURATION AND TIME SINCE LAST INC EXCEEDS SPEED) OR TAP '2 SAVE TIMER AT THIS TIME '3 INCREMENT OUR IN/OUTPUT VARIABLE '4 IF TOP OVERFLOW THEN '5 STATUS LOOPS AROUND TO ZERO OR IT STAYS AT MAXIMUM VALUE DEPENDING ON LOOPAROUND '6 IF (DEC-BUTTON EXCEEDED PRESSDURATION AND TIME SINCE LAST DEC EXCEEDS SPEED) OR TAP '7 SAVE TIMER AT THIS TIME '8 DECREMENT OUR IN/OUTPUT VARIABLE '9 IF BOTTOM OVERFLOW THEN '10 STATUS LOOPS AROUND TO MAXIMUM VALUE OR IT STAYS AT ZERO DEPENDING ON LOOPAROUND 'NOTE: IF A CONDITION IS TRUE, IT'S VALUE IS -1, IN LINE 4 AND 8 THIS IS CANCELLED WITH - IF (INCVAL>WAITAUTO AND TIMER-TIMER0>SPEED AND SPEED>0) OR INCVAL=1 THEN TIMER0=TIMER INC STATUS IF STATUS>MAXVAL THEN STATUS=-MAXVAL*(LOOPAROUND=0) END IF ELSE IF (DECVAL>WAITAUTO AND TIMER-TIMER0>SPEED AND SPEED>0) OR DECVAL=1 THEN TIMER0=TIMER DEC STATUS IF STATUS<0 THEN STATUS=-MAXVAL*(LOOPAROUND<>0) END IF END IF END SUB 'S L I D E R R E P E A T E R SUB SLIDERS(ID,INVAL,PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO, FLEXMODE,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 'SUBPROGRAMS: SLIDER, SLIDERLOGIC (BACKEND) 'CODE EXPLANATION '1 FOR EACH SLIDER '2 WE DEFINE THAT SLIDER: COORDINATES ARE GENERATED, OTHER VARIABLES ARE PASSED ON X1=0 Y1=0 X2=0 Y2=0 DX=0 DY=0 COUNT=0 CALL GETRECT(ID,X1,Y1,X2,Y2) CALL GETREPEAT(ID,DX,DY,COUNT) FOR I=0 TO COUNT CALL SLIDER(X1+DX*I,Y1+DY*I,X2+DX*I,Y2+DY*I,0.1+ID-I*(FLEXMODE<>0),IN(INVAL+I),PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO+I,FLEXMODE,RESETVAL) NEXT I END SUB 'S L I D E R SUB SLIDER(X1,Y1,X2,Y2,ID,STATUS,PIXSTEP,LOBOUND,HIBOUND,DIMY,CHARACTER,SPRITENO, FLEXMODE,RESETVAL,P0,P1,C0,C1,S0,S1) '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 'SUBPROGRAMS: SLIDERLOGIC (BACKEND) 'CODE EXPLANATION '1 SET C TO TRUE IF THE TOUCHED CELL IS WITHIN THE BOUNDARIES (RECTANGLE) '2 IF C AND THIS ELEMENT IS OR WAS TAPPED OR FLEXMODE AND THIS ELEMENT IS SELECTED '3 SET THIS ELEMENT AS SELECTED '4 SET THE CONSTANT C TO THE RATIO BETWEEN THE STEP AND A CELL '5 INITIALIZE A '6 INITIALIZE B '7 IF THE FADER WORKS VERTICALLY '8 CALL OUR SLIDER LOGIC PROCESSOR, AND PASS ON SOME NECCESSARY VARS ' NOTE: TOUCH.Y-4 MAKES IT SO THAT YOU'LL TOUCH THE SLIDER SPRITES IN THE CENTER '9 GENERATE A SPRITE ON THE FADER VALUE WHICH GETS CONVERTED TO COORDINATES '10 ELSE (IF THE FADER WORKS HORIZONTALLY) '11 SAME AS LINE 8, EXCEPT IT USES TOUCH.X INSTEAD OF TOUCH.Y '12 SAME AS LINE 9, EXCEPT X AND Y ARE SWAPPED '13 ELSE IF THE SPRITES AREN'T DEFINED YET THEN (AND THE SPRITE ISN'T TOUCHED) '14 IF THE FADER WORKS VERTICALLY '15 DEFINE A VERTICAL FADER SPRITE IN ITS MINIMAL VALUE '16 ELSE (IF THE FADER WORKS HORIZONTALLY) '17 DEFINE A HORIZONTAL FADER SPRITE IN ITS MINIMAL VALUE '18 ELSE IF A RESET VALUE IS DEFINED AND STATUS ISN'T EQUAL TO IT '19 SET STATUS TO THE RESET VALUE '20 IF THE FADER WORKS VERTICALLY '21 DEFINE A VERTICAL FADER SPRITE FOR THE NEW STATUS VALUE '22 ELSE (IF THE FADER WORKS HORIZONTALLY) '23 DEFINE A HORIZONTAL FADER SPRITE FOR THE NEW STATUS VALUE 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-4,PIXSTEP,STATUS) SPRITE SPRITENO,X1*8,(STATUS+A)*PIXSTEP,CHARACTER ELSE CALL SLIDERLOGIC(A,B,C,LOBOUND,HIBOUND,TOUCH.X-4,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 'X Y - P A D SUB XYPAD(X1,Y1,X2,Y2,ID,XSTATUS,YSTATUS,PIXSTEP,LEBOUND,LOBOUND,RIBOUND,HIBOUND,CHARACTER, SPRITENO,FLEXMODE,XRESETVAL,YRESETVAL,P0,P1,C0,C1,S0,S1) 'A 2D SLIDER 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 'SUBPROGRAMS: SLIDERLOGIC (BACKEND) 'CODE EXPLANATION '1 SET C TO TRUE IF THE TOUCHED CELL IS WITHIN THE BOUNDARIES (RECTANGLE) '2 IF C AND THIS ELEMENT IS OR WAS TAPPED OR FLEXMODE AND THIS ELEMENT IS SELECTED '3 MARK THIS ELEMENT AS SELECTED '4 SET THE CONSTANT C TO THE RATIO BETWEEN THE STEP AND A CELL '5 INITIALIZE A1 '6 INITIALIZE B1 '7 INITIALIZE A2 '8 INITIALIZE B2 '9 CALL OUR SLIDER LOGIC PROCESSOR, AND PASS ON SOME NECCESSARY VARS ' NOTE: TOUCH.X-4 MAKES IT SO THAT YOU'LL TOUCH THE SLIDER SPRITES IN THE CENTER '10 SAME AS LINE 8, EXCEPT IT USES THE Y VARIANTS OF THE VARIABLES '11 GENERATE A SPRITE ON THE FADER VALUES WHICH GET CONVERTED TO COORDINATES '12 ELSE IF THE SPRITES AREN'T DEFINED YET THEN (AND THE SPRITE ISN'T TOUCHED) '13 DEFINE A FADER SPRITE IN ITS MINIMAL VALUES '14 ELSE IF THE A RESET VALUE IS DEFINED AND STATUS ISN'T EQUAL TO IT '15 SET X STATUS TO THE X RESET VALUE '16 SET Y STATUS TO THE Y RESET VALUE '17 DEFINE A FADER SPRITE FOR THE NEW STATUS VALUES 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 IF PIXSTEP<>0 THEN C=8/PIXSTEP ELSE C=0 END IF A1=0 B1=0 A2=0 B2=0 CALL SLIDERLOGIC(A1,B1,C,LEBOUND,RIBOUND,TOUCH.X-4,PIXSTEP,XSTATUS) CALL SLIDERLOGIC(A2,B2,C,LOBOUND,HIBOUND,TOUCH.Y-4,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 'S W I P E R SUB SWIPER(X1,Y1,X2,Y2,ID,STATUS,DRAGDIST,ANGLECOUNT,STARTANGLE,P0,P1,C0,C1,S0,S1) '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 'GLOBAL VARS: XTEMP,YTEMP 'SUBPROGRAMS: POLAR,ARROWDRAW 'CODE EXPLANATION '1 THE BIG IF STATEMENT CHECKS IF THIS BUTTON IS PRESSED AND IF IT ALSO WAS TAPPED BEFORE '2 MARK THIS ELEMENT AS SELECTED '3 IF THIS ELEMENT IS TAPPED '4 MARK THE TAP EVENT COMPLETED '5 SAVE THE X COORDINATE OF THE TOUCH IN OUR GLOBAL TEMPORARY X VARIABLE '6 SAVE THE Y COORDINATE OF THE TOUCH IN OUR GLOBAL TEMPORARY Y VARIABLE '7 ELSE IF IT ISN'T TAPPED BUT IT HAS BEEN TAPPED BEFORE (IT'S STILL TOUCHED) THEN '8 A IS THE DIFFERENCE BETWEEN TOUCH.X NOW AND TOUCH.X WHEN THE ELEMENT WAS TAPPED ' NOTE: THIS VALUE IS PROTECTED AGAINST DIVISION BY ZERO WITH THE "+0.00000001" '9 B IS THE DIFFERENCE BETWEEN TOUCH.Y NOW AND TOUCH.Y WHEN THE ELEMENT WAS TAPPED '10 CALLS FOR THE POLAR SUB TO TURN THE COORDINATES (A,B) INTO POLAR COORDINATES (A,B) '11 IF THE POLAR LENGTH (A) IS MORE THAN THE PREDEFINED DRAG DISTANCE THEN '12 SET STATUS TO THE ANGLE DIVIDED UP INTO [THE VALUE OF ANGLECOUNT] EQUAL SECTIONS '13 CALL FOR THE ARROW DRAW FUNCTION TO DRAW A 2X2 CELL ARROW IN THE RIGHT DIRECTION '14 IF BOTH AN "ON" PALETTE AND AN "OFF" PALETTE ARE DEFINED THEN '15 SET PALETTE TO "ON" IF STATUS OUTPUTS AN ANGLE ELSE PALETTE IS SET TO "OFF" '16 ELSE (IF NOT TOUCHED) '17 SET THE PALETTE TO "OFF" (IF AN "OFF" PALETTE IS DEFINED) 'TRACE "A" 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 B=TOUCH.Y-YTEMP CALL POLAR(A,B) IF A>DRAGDIST THEN ANG=(B+STARTANGLE) CALL MODULO(ANG,2*PI) STATUS=INT(ANG*ANGLECOUNT/(2*PI)) MOD ANGLECOUNT END IF CALL ARROWDRAW(X1,Y1,STATUS,1) END IF IF P0>=0 AND P1>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL -P0*(STATUS<0)-P1*(STATUS>=0) END IF ELSE IF P0>=0 THEN BG TINT X1,Y1 TO X2,Y2 PAL P0 END IF END SUB SUB MODULO(P,M) IF M<>0 THEN P=P-M*INT(P/M) END IF END SUB 'S I D E B A R L O G I C SUB SIDEBAR(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) 'CODE EXPLANATION '1 THE BIG IF STATEMENT CHECKS IF THIS BUTTON IS PRESSED AND IF IT ALSO WAS TAPPED BEFORE '2 MARK THIS ELEMENT AS SELECTED '3 SET A TO 1 IF THE DIRECTION IS POSITIVE (+X OR +Y) OTHERWISE SET A TO -1 '4 IF IT'S IN THE X DIRECTION (+X OR -X) '5 SET STATUS TO TRUE IF THE DIFFERENCE BETWEEN X TOUCH AND BORDER EXCEEDS DRAGDIST '6 ELSE (IF IT'S IN THE Y DIRECTION (+Y OR -Y)) '7 SET STATUS TO TRUE IF THE DIFFERENCE BETWEEN Y TOUCH AND BORDER EXCEEDS DRAGDIST X1=0 Y1=0 X2=0 Y2=0 CALL GETRECT(ID,X1,Y1,X2,Y2) 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=A*(X1*8-TOUCH.X)>DRAGDIST ELSE STATUS=A*(Y1*8-TOUCH.Y)>DRAGDIST END IF END IF END SUB 'S C R O L L E R SUB SCROLLER(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 'GLOBAL VARS: TIMER0(TO MEASURE HOW FAST YOUR SWIPE IS),VX,VY,XTEMP,YTEMP,XTEMP1,YTEMP1 'SUBPROGRAMS: SCROLLERRETURN (BACKEND) 'CODE EXPLANATION '1 THE BIG IF STATEMENT CHECKS IF THIS BUTTON IS PRESSED AND IF IT ALSO WAS TAPPED BEFORE '2 MARK THIS ELEMENT AS SELECTED '3 IF TAP THEN ...WE MESS AROUND WITH OUR MANY GLOBAL VARIABLES '4 STORE XSTATUS (X SCROLL) IN OUR TEMPORARY X VARIABLE 1 '5 STORE YSTATUS (Y SCROLL) IN OUR TEMPORARY Y VARIABLE 1 '6 STORE TOUCH.X IN OUR OTHER TEMPORARY X VARIABLE '7 STORE TOUCH.Y IN OUR OTHER TEMPORARY Y VARIABLE '8 WRITE DOWN THE TIME (SAVE THE CURRENT TIMER VALUE IN OUR TIMER0 VARIABLE) '9 INITIALIZE X VELOCITY '10 INITIALIZE Y VELOCITY '11 SET OUR XSTATUS (X SCROLL) TO PREVIOUS XSTATUS + X DRAG DISTANCE (TOUCH.X-XTEMP) '12 SET OUR YSTATUS (Y SCROLL) TO PREVIOUS YSTATUS + Y DRAG DISTANCE (TOUCH.Y-YTEMP) '13 DELTA X (DX) IS THE DIFFERENCE BETWEEN XSTATUS NOW AND XSTATUS AT ELEMENT TAP '14 DELTA Y (DY) IS THE DIFFERENCE BETWEEN YSTATUS NOW AND YSTATUS AT ELEMENT TAP '15 DELTA TIME (DT) IS THE DIFFERENCE BETWEEN TIME NOW AND TIME AT ELEMENT TAP ' NOTE 1: THIS IS PROTECTED AGAINST DIVISION BY ZERO WITH THE "+0.00001" ' NOTE 2: IF YOU HOLD AND THEN SWIPE, THEN IT'LL REGISTER A LONG TIME -> LOW VELOCITY ' IT SEEMS KIND OF HARD TO TRY TO FIX THAT, SAMPLING DY VALUES SEEMS THE BEST '16 X VELOCITY (VX) IS DELTA X (DX) DIVIDED BY DELTA TIME (DT) '17 Y VELOCITY (VY) IS DELTA Y (DY) DIVIDED BY DELTA TIME (DT) '18 ELSE (IF RELEASED) '19 IF THERE'S STILL HORIZONTAL MOVEMENT THEN PROCESS HORIZONTAL RUBBER BANDING '20 IF THERE'S STILL VERTICAL MOVEMENT THEN PROCESS VERTICAL RUBBER BANDING X1=0 Y1=0 X2=0 Y2=0 CALL GETRECT(ID,X1,Y1,X2,Y2) 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 TIMER0=TIMER VX=0 VY=0 END IF XSTATUS=XTEMP1+TOUCH.X-XTEMP YSTATUS=YTEMP1+TOUCH.Y-YTEMP DX=XSTATUS-XTEMP1 DY=YSTATUS-YTEMP1 DT=TIMER-TIMER0+0.00001 VX=DX/DT VY=DY/DT ELSE IF VX<>0 THEN CALL SCROLLERRETURN(XSTATUS,VX,XMAXVAL,XMINVAL,FRICTION) IF VY<>0 THEN CALL SCROLLERRETURN(YSTATUS,VY,YMAXVAL,YMINVAL,FRICTION) 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 CHECKCHUNK1D(X,Y,W,BGN,ADDR,T,SIDESCROLL) 'CHECKS IF CHUNKS NEED UPDATING (AND CALL TO REFRESH THEM) 'THIS IS A 1D VERSION OF MY CHUNKLOADER ENGINE 'USE MY CHUNKLOADER ENGINE IF YOU WANT TO LOAD CHUNKS IN 2D 'HTTPS://LOWRESNX.INUTILIS.COM/TOPIC.PHP?ID=2119 'INPUTS: X,Y CURRENT SCROLL OFFSET COORDINATES ' W WITH 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 ' SIDESCROLL: TRUE IF THE SCROLL DIRECTION IS SIDEWAYS (NOT IN THIS VERSION) 'GLOBAL VARS: LX,LY (THE CHUNK-COORDINATES OF THE MOST RECENT CHUNK-SET LOADED) 'SUBPROGRAMS: LOADCHUNK 'NOTE: CHUNK-COORDINATES ARE NX-SCROLL VALUES \ 64 'CODE EXPLANATION '1 SET TY TO THE Y COORDINATE OF THE FIRST 8X8 CELL CHUNK (INT(SCROLL.Y / 64)) '2 IF THE CURRENT CHUNK-SET DOESN'T MATCH THE SCROLL VALUE ANYMORE (IT'S OUTDATED) THEN '3 SET B TO THE RELATIVE CHUNK-LOAD COORDINATES THAT ARE BASED ON THE DIRECTION ' A NEGATIVE DIRECTION IS FORMATTED TO 0, AND A POSITIVE DIRECTION IS FORMATTED TO 3 '4 CALL THE SUB THAT LOADS THE CHUNK FROM A SOURCE (IN THIS DEMO T=3 -> FANCY BOXES) '5 UPDATE LY TO MATCH OUR SCROLL VALUE TY=Y\64 IF TY<>LY THEN B=SGN(TY-LY)*1.5+1.5 CALL LOADCHUNK(X\8,(TY+B)*8,W,BGN,ADDR,T,SIDESCROLL) LY=TY END IF END SUB 'L O A D C H U N K SUB LOADCHUNK(X,Y,W,BGN,ADDR,T,SIDESCROLL) 'LOADS A CHUNK WITH WIDTH W CELLS AND HEIGHT H CELLS, FROM ONE OF MULTIPLE SOURCES 'THIS IS COPIED FROM MY CHUNKLOADER ENGINE, CHECK IT OUT IF YOU WANT A NEWER VERSION 'INPUTS: X,Y CELL COORDINATES FOR THE START OF THE CHUNK (USUALLY ROUNDED LIKE X=(X\8)*8) ' W WITH 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 NUMBERS IN FANCY BOXES ' SIDESCROLL: TRUE IF THE THE SCROLL DIRECTION IS SIDEWAYS (NOT IN THIS VERSION) 'CODE EXPLANATION '1 SWAP X AND Y WHEN WE WANT TO SCROLL SIDEWAYS '2 SET THE BACKGROUND TO THE PREDEFINED BACKGROUND-NUMBER '3 IF TYPE IS ZERO (BACKGROUND) THEN '4 SET THE BACKGROUND SOURCE TO THE PREDEFINED ADDRESS '5 COPY AN 8X8 CHUNK FROM A 64X64 BACKGROUND FROM A FILE TO OUR NX 32X32 BACKGROUND '6 ELSE IF THE TYPE IS SET TO ONE (TEXT FROM ARRAY) THEN '7 FOR I=0 TO 7 (ALL LINES OF A CHUNK THAT'S 8 CELLS HIGH) '8 CLEAR LINE '9 CHECK IF THERE'S DATA FOR THIS LINE '10 WRITE THE TEXT FOR THIS LINE (WITH THE RIGHT WIDTH ' NOTE: USE "MID$(TXT$(I),X+1,W)" FOR 2D TEXT LOADING '11 ELSE IF THE TYPE IS SET TO TWO (NUMBERS IN FANCY BOXES, USED IN THIS DEMO) THEN '12 FOR I=0 TO 3, I IS THE IN-CHUNK Y COORDINATE FOR EACH BAR '13 LOOP TWO TIMES: FIRST J=0 (TOP OF A BAR) NEXT J=1 (BOTTOM OF A BAR) '14 FLIP Y WHEN J=1 (BOTTOM OF BAR) '15 CELL FOR THE CORNER '16 BG FILL FOR THE REST OF THE BAR '17 RESET FLIP '18 WRITE THE LINE-NUMBER ON TOP OF THE BAR '19 RESET THE BACKGROUND TO ZERO H=8 IF SIDESCROLL THEN SWAP X,Y SWAP W,H END IF 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+7 TEXT X,I,LEFT$(" ",W) IF I<=UBOUND(TXT$) THEN TEXT X,I,LEFT$(TXT$(I),W) END IF NEXT I ELSE IF T=2 THEN FOR I=0 TO 3 FOR J=0 TO 1 FLIP 0,J CELL X MOD 32,Y MOD 32+J+I*2,138 BG FILL X MOD 32+1,Y MOD 32+J+I*2 TO X MOD 32+4,Y MOD 32+J+I*2 CHAR 155 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 'S W I P E A N I M A T I O N 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) 'CODE EXPLANATION '1 IF WE'RE THERE (THE CURRENT SCROLL POSITION IS EQUAL TO THE TARGET SCROLL POSITION) '2 SET TRANSITION TO 0 (THE TRANSITION HAS ENDED) '4 ELSE (IF WE AREN'T THERE YET) '5 SET DX TO THE STEPSIZE INTO A DIRECTION (SGN OF THE DIFFERENCE) '5 SET DY TO THE STEPSIZE INTO A DIRECTION (SGN OF THE DIFFERENCE) '7 ADD DX AND DY TO SCROLL.X AND SCROLL.Y, AND SCROLL TO THOSE COORDINATES IF SCROLL.X(B)=X2 AND SCROLL.Y(B)=Y2 THEN TRANSITION=0 ELSE DX=STEPS*SGN(X2-SCROLL.X(B)) DY=STEPS*SGN(Y2-SCROLL.Y(B)) SCROLL B,SCROLL.X(B)+DX,SCROLL.Y(B)+DY END IF END SUB '7 - S E G M E N T D I S P L A Y SUB SEG7(X,Y,F) 'INPUTS: X,Y ARE THE CELL-COORDINATES ON THE CURRENT BACKGROUND ' F IS THE NUMBER TO DISPLAY 'NOTE: THE DEFINED DISPLAY VALUES ARE STORED IN RAM ' THIS CODE NEEDS THE 7-SEGMENT DEFINITION FROM THE CODE SETUP 'CODE EXPLANATION '1 SET A TO THE TABLE ADRESS + ONE OF THE NUMBER VALUES WHICH ARE SPACED 4 BYTES APART '2 LOOP 2 TIMES, THE FIRST TIME J=0, THE SECOND TIME J=1 '3 LOOP 2 TIMES, THE FIRST TIME I=0, THE SECOND TIME I=1 '4 IN THOSE FOUR LOOPS WE PERSERVE THE ATTRIBUTES OF THE ORIGINAL SELECTED CELL '5 THEN WE SET THE CHARACTER OF THAT CELL TO THE RIGHT VALUE FROM OUR TABLE IN RAM '6 RESET ATTRIBUTES A=ROM_ADDRESS+F*4 FOR J=0 TO 1 FOR I=0 TO 1 ATTR CELL.A(X+I,Y+J) CELL X+I,Y+J,PEEK(A+I+J*2) NEXT I NEXT J ATTR 0 END SUB 'A R R O W D R A W 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 'THEME CAN EITHER BE 0 OR 1 'CODE EXPLANATION '1 IF THE DIRECTION VALUE IS VALID '2 SET A TO (DIRECTION INTEGER DIVIDED BY 2), SO IT'LL BE {0,0,1,1} '3 IF UP OR DOWN (DIRECTION MODULO 2 (WHICH IS {0,1,0,1}) IS EQUAL TO ZERO) THEN '4 LOOP TWO TIMES, THE FIRST TIME I=0 (UPPER), THE SECOND TIME I=1 (LOWER) '5 SET FLIP X TO A AND SET FLIP Y TO I '6 SET THE LEFT CELL TO THE CORRECT CHARACTER OF THE TYPE AND THE DIRECTION '7 SET THE RIGHT CELL TO THE CORRECT CHARACTER OF THE TYPE AND THE DIRECTION '8 ELSE (IF LEFT OR RIGHT) '9 LOOP TWO TIMES, THE FIRST TIME I=0 (LEFT), THE SECOND TIME I=1 (RIGHT) '10 SET FLIP X TO I AND SET FLIP Y TO A '11 SET THE UPPER CELL TO THE CORRECT CHARACTER OF THE TYPE AND THE DIRECTION '12 SET THE LOWER CELL TO THE CORRECT CHARACTER OF THE TYPE AND THE DIRECTION 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,132+A+16*THEME CELL X1+1,Y1+I,133-A+16*THEME NEXT I ELSE FOR I=0 TO 1 FLIP I,A CELL X1+I,Y1 ,130+16*A+1*THEME CELL X1+I,Y1+1,146-16*A+1*THEME NEXT I END IF END IF END SUB 'C A R T H E S I A N T O P O L A R C O O R D I N A T E S C O N V E R T E R 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,ANGLE) 'CODE EXPLANATION '1 SET A TO INPUT 1 '2 SET B TO INPUT 2 '3 I1 TO THE LENGTH OF THE VECTOR (PYTHAGORAS) '4 IF THE LENGTH VARIABLE (I1) SUPPORTS DIVISIONS '5 I2 TO THE ANGLE OF THE VECTOR: ATAN2 MADE WITH ACOS IN A UNIT CIRCLE AND SGN(B) (NOT 0) '6 IF THE LENGTH IS ZERO WE MAY AS WELL HAVE NO ANGLE AT ALL A=I1 B=I2 I1=SQR(A*A+B*B) IF I1>0 THEN I2=ACOS(MIN(1,MAX(-1,A/I1))) * (1+2*(B>=0)) ELSE I2=0 END IF END SUB 'B A C K E N D 'THE SUBS BELOW ARE ESSENTIAL PARTS FOR CERTAIN GUI ELEMENTS TO WORK 'L O G I C O F S L I D E R S A N D X Y - P A D S SUB SLIDERLOGIC(A,B,C,LB,HB,TOUCHDIR,PIXSTEP,STATUS) 'THIS SUB IS PART OF THE SLIDER AND XYPAD SUBS (THIS IS NOT A GUI ELEMENT) 'CODE EXPLANATION '1 SET A TO OUR LOWER BOUNDARY (C=8/PIXSTEP, SO A=LB*8/PIXSTEP, CONV LB TO SLIDER STEPS) '2 SET B TO OUR UPPER BOUNDARY (C=8/PIXSTEP, SO B=HB*8/PIXSTEP, CONV HB TO SLIDER STEPS) '3 SET OUR OUTPUT TO THE USER'S TOUCH.X OR Y CONVERTED TO SLIDER STEPS '4 CLAMP TO AMAXVAL AND V<0 B=STATUS0 C=NOT(A OR B) D=STATUS>=MINVAL AND STATUS<=MAXVAL FRICTION=-FRICTION*D-(NOT(D))*0.5 V=-C*(V-FRICTION*V)+(A*(STATUS-MAXVAL)+B*(STATUS-MINVAL))*0.1 IF ABS(V)<0.01 THEN V=V*(D=0 AND C<>0) END IF ADD STATUS,V END SUB #1:MAIN PALETTES 00020B01003F0206003F0106000B0101 003F02010002010000030000003F0000 #2:MAIN CHARACTERS 00000000000000000000000000000000 0020303830200000FEDECEC6CEDEFE00 0028282828280000FED6D6D6D6D6FE00 0000000000000000FFFFFFFFFFFFFF00 0000000000000000FEFEFEFEFEFEFE00 0000000000000000FFFFFFFFFFFFFFFF 00000000000000000000FFFFFFFF0000 00000000000000003C3C3C3C3C3C3C3C 01010101010101FF01010101010101FF 00003838380000000038444444380000 01010101010101010101010101010101 00000000000000FF00000000000000FF 24242424242424243C3C3C3C3C3C3C3C 1824242424242424183C3C3C3C3C3C3C 24247EFFFF7E24243C3C7EC3C37E3C3C 18247EFFFF7E2424183C7EC3C37E3C3C FEC6BEBEBEC6FE000038404040380000 0038404040380000FCC6BEBEBEC6FC00 FE8EB6B6B68EFE000070484848700000 0070484848700000FC8EB6B6B68EFC00 FE86BE86BE86FE000078407840780000 FE86BE86BEBEFE000078407840400000 0078407840400000FC86BE86BEBEFC00 FE86BEA6B686FE000078405848780000 0078405848780000FC86BEA6B686FC00 FE86B686B6B6FE000078487848480000 0078487848480000FC86B686B6B6FC00 FE8EB68EB68EFE000070487048700000 00000000000002000000000000000000 00000000040000000000000000000000 00002000000000000000000000000000 00007EFFFF7E000000007EC3C37E0000 000000000103070E003F7F7F7E7C7871 0000000080C0E07000FCFEFE7E3E1E8E 0000000303010000003F7F7C7C7E7F7F 0000000080C0E07000FCFEFE7E3E1E8E 00000000002B2B2B7FFFFFFFFFC0C0C0 0000000000565656FFFFFFFFFF010101 0000003F2F3E3F3F7FFFFFFFFAEBFFEA 000000FEBEEAFEFEFFFFFFFFEBBFFFAB 00001F111F171F047FC0DFDFDFDBDBC0 0000ECECFCECEC40FF01EDA9C5ED6D01 0000001C1113070F003F7F7F7E7C7870 0000003888C8E0F000FCFEFE7E3E1E0E 0000000607070707003F7F7978787878 000000000080C0E000FCFEFEFE7E3E1E 0000000006060606003F7F7F79797979 000000006060606000FCFEFE9E9E9E9E 1C1800000000000063677F7F7F7F3F00 3818000000000000C6E6FEFEFEFEFC00 00000103030000007F7F7E7C7C7F3F00 70E0C080000000008E1E3E7EFEFEFC00 3F3F000000000000C0C0FFFFFFFF7F00 FEFE0000000000000101FFFFFFFFFF00 3E3B2F3F3F000000EBEEFAEAFFFF7F00 FEBAEEFEFE000000ABEFBBABFFFFFF00 1E1E1E171E000000DAD6DCDEDEC07F00 FCF4FCF4FC000000DDFDDD3DFD01FF00 0D0111111D000000727E7E7E7E7F3F00 B0808888B80000004E7E7E7E7EFEFC00 070707070600000078787878797F3F00 E0C08000000000001E3E7EFEFEFEFC00 0606060600000000797979797F7F3F00 60606060000000009E9E9E9EFEFEFC00 0000070F0C0C0C0D3F7FFFFFFFFFFFFF 0000070F0C0C0C0D3F7FFFFFFFFFFFFE 0000070F0C0C0C0D3F7FF8FCFFFFFFFF 0000070F0C0C0C0D3F7FF8FCFFFFFFFE 00183060301800007CE6CE9ECEE67C00 0030180C183000007CCEE6F2E6CE7C00 00344C00645800007CFEFEFE9AA67C00 00344C00645800007CCAB2FEFEFE7C00 00003838380000007CFEC6C6C6FE7C00 000101010101017E01010101010101FF 00003838380000000038444444380000 00007EFFFF7E000000007EC3C37E0000 00000000000C0D0E007FFFFFFFF3F3F3 0000000418E0C0C000FCFEFEFE3E3E3E 000000003F303D30007FFFFFC0CFC2CF 00000030488498F000FCFEFEFEFE660E 0000070F0C0C0C0D3F7FFFF3F3F3F3F3 0000070F0C0C0C0D3F7FFFF3F3F3F3F2 0000070F0C0C0C0D3F7FF8F0F3F3F3F3 0000070F0C0C0C0D3F7FF8F0F3F3F3F2 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0C17232040000000F3F8FCFFFFFF7F00 C0800000000000003E7EFEFEFEFEFC00 31320D1160000000CFCFFEFEFFFF7F00 60F09898000000009E0E6666FEFEFC00 0000001F1F1E1F1B003F7F6060616064 000000B88808008000FCFE7E7EFEFE7E 0000001C1C1E0703003F7F676371787C 00000038086860E000FCFEFEFE9E9E1E 00000002060F1F0E003F7F7D79706071 0000000000C0E07000FCFEFEFE3E1E8E 000000120A061E00003F7F6D7579617F 000000485060780000FCFEB6AE9E86FE 0000001C18140200003F7F63676B7D7F 000000381828400000FCFEC6E6D6BEFE 0000011A10001123003F7E7D7F7F6E5C 00008058080088C400FC7EBEFEFE763A 00000000017F5656007FFFFFFFFF8080 00006C9000FCACAC00FCFEFEFEFE0606 0000000000070307007FFFFFFFF8FCFC 0000081020C0800000FCFEFEFE7EFEFE 190010101C000000667F7F7F7F7F3F00 C0E06808380000003E1E9EFEFEFEFC00 010717101C0000007E78787F7F7F3F00 E0E0E808380000001E1E1EFEFEFEFC00 03000000000000007C7F7F7F7F7F3F00 303060C000000000CECE9E3EFEFEFC00 001E060A120000007F6179756D7F3F00 0078605048000000FE869EAEB6FEFC00 000214181C0000007F7D6B67637F3F00 0040281838000000FEBED6E6C6FEFC00 231100101A0100005C6E7F7F7D7E3F00 C4880008588000003A76FEFEBE7EFC00 567F7F0000000000808080FFFFFF7F00 ACFCFC0000000000060606FEFEFEFC00 0B13172040000000FCFCF8FFFFFF7F00 0000800000000000FEFE7EFEFEFEFC00 003C666E76663C00FEC298908898C200 0018381818187E00FEE6C6E6E6E68000 003C660C18307E00FEC298F2E6CE8000 003C660C06663C00FEC298F2F898C200 0066667E06060600FE989880F8F8F800 007E607C06067C00FE809E82F8F88200 001C307C66663C00FEE2CE829898C200 007E060C18303000FE80F8F2E6CECE00 003C663C66663C00FEC298C29898C200 003C663E06663C00FEC298C0F898C200 00183C667E666600FEE6C29880989800 007C667C66667C00FE82988298988200 003C666060663C00FEC2989E9E98C200 00786C66666C7800FE86929898928600 007E607860607E00FE809E869E9E8000 007E607860606000FE809E869E9E9E00 003C606E66663C00FEC29E909898C200 0066667E66666600FE98988098989800 003C181818183C00FEC2E6E6E6E6C200 001E060606663C00FEE0F8F8F898C200 00666C78786C6600FE98928686929800 0060606060607E00FE9E9E9E9E9E8000 0042667E7E666600FEBC988080989800 0066767E6E666600FE98888090989800 003C666666663C00FEC298989898C000 007C667C60606000FE8298829E9E9E00 003C66666A6C3E00FEC298989492C000 007C667C786C6600FE82988286929800 003E603C06067C00FEC09EC2F8F88200 007E181818181800FE80E6E6E6E6E600 0066666666663C00FE9898989898C200 00666666663C1800FE98989898C2E600 0066667E7E664200FE9898808098BC00 00663C183C666600FE98C2E6C2989800 0066663C18181800FE9898C2E6E6E600 007E0C1830607E00FE80F2E6CE9E8000 071F397161C1C1C0071E3E7E7EFEFEFF E0F89CEEF6FBFB3BE0787C7E7E7F7FFF 0000001910000312003F7F7F7F7F7C7D 000000980800C00800FCFEFEFEFE3EFE 000000181C0E0703003F7F676371787C 0000000000C0C0C000FCFEFEFE3E3E3E 0000001E1E1E1E01003F7F73737F7D7E 000000000000004000FCFEFEFEFEFEBE 0000000000000100003F7F7F7F7F7E7F 000000787878F8C000FCFECECEFE3E3E 0000001D10100102003F7F7E7F7F7E7D 000000F83818C80800FCFE06C6E636F6 00000000000000000000000000000000 007C667C60606000FE8298829E9E9E00 007C667C60606000FE8298829E9E9E00 00666666663C1800FE98989898C2E600 C0C0C06070381F07FFFFFF7F7F3F1F07 0B0303060E1CF8E0FFFFFFFEFEFCF8E0 13020310190000007C7D7C7F7F7F3F00 8800C008980000007EFE3EFEFEFEFC00 070700000000000078787F7F7F7F3F00 D8C80088D80000003E3EFEFEFEFEFC00 00010000000000007F7E7F7F7F7F3F00 D8C80088D80000003E3EFEFEFEFEFC00 191200111B0000007E7D7F7F7F7F3F00 4000000000000000BEFEFEFEFEFEFC00 010013101C0000007E7F7C7F7F7F3F00 884088083800000076BE7EFEFEFEFC00 00000000000000000000000000000000 00181818180018000000000000000000 006C6C24000000000000000000000000 00247E24247E24000000000000000000 00083E380E3E08000000000000000000 00626408102646000000000000000000 001C34386E643A000000000000000000 00181830000000000000000000000000 000C183030180C000000000000000000 0030180C0C1830000000000000000000 000024187E1824000000000000000000 000018187E1818000000000000000000 00000000181830000000000000000000 000000007E0000000000000000000000 00000000001818000000000000000000 00060C18306040000000000000000000 003C666E76663C000000000000000000 0018381818187E000000000000000000 003C660C18307E000000000000000000 003C660C06663C000000000000000000 0066667E060606000000000000000000 007E607C06067C000000000000000000 001C307C66663C000000000000000000 007E060C183030000000000000000000 003C663C66663C000000000000000000 003C663E06663C000000000000000000 00000018001800000000000000000000 00000018001830000000000000000000 00000C1830180C000000000000000000 0000007E007E00000000000000000000 000030180C1830000000000000000000 003C660C180018000000000000000000 003C666E6E603C000000000000000000 00183C667E6666000000000000000000 007C667C66667C000000000000000000 003C666060663C000000000000000000 00786C66666C78000000000000000000 007E607860607E000000000000000000 007E6078606060000000000000000000 003C606E66663C000000000000000000 0066667E666666000000000000000000 003C181818183C000000000000000000 001E060606663C000000000000000000 00666C78786C66000000000000000000 0060606060607E000000000000000000 0042667E7E6666000000000000000000 0066767E6E6666000000000000000000 003C666666663C000000000000000000 007C667C606060000000000000000000 003C66666A6C3E000000000000000000 007C667C786C66000000000000000000 003E603C06067C000000000000000000 007E1818181818000000000000000000 0066666666663C000000000000000000 00666666663C18000000000000000000 0066667E7E6642000000000000000000 00663C183C6666000000000000000000 0066663C181818000000000000000000 007E0C1830607E000000000000000000 003C303030303C000000000000000000 006030180C0602000000000000000000 003C0C0C0C0C3C000000000000000000 00183C66000000000000000000000000 0000000000007E000000000000000000 #3:MAIN BG 000014802C022D02AC02AD0206019907 92078A079707980706019B0798079507 9507060144058005800545053C023D02 BC02BD02000000000000000000000000 00000000000000000000000000000000 000000006802690200008F06C3068306 00000000800680060000800684060000 00000000000000006402650278027902 00000000000000000000000000000000 00000000000000000000000000000000 740275021B0504020402040204020402 04020402040204020402040204020402 0402040204020601060106011A050402 04020402040204020402040204020402 04020402040204020402040204020000 6C056D05190504020402040204020402 04020402040204020402040204020402 04020402040200007C057D0518050402 04020402040204020402040204020402 04020402040204020402040204020000 4C024D02170504020402040204020402 04020402040204020402040204020402 04020402040200005C025D0216050402 04020402040204020402040204020402 04020402040204020402040204020000 6E026F02150504020402040204020402 04020402040204020402040204020402 04020402040200007E027F0214050402 04020402040204020402040204020402 04020402040204020402040204020000 4E024F02130504020402040204020402 04020402040204020402040204020402 04020402040200125E025F0212050402 04020402040204020402040204020402 04020402040204020402040204020012 00000000110504020402040204020402 04020402040204020402040204020402 04020402040200022802290210050402 04020402040204020402040204020402 04020402040204020402040204020002 380239022C022D02AC02AD0206019C07 A20797079D0791070601060106010601 0601060106014405800545053C023D02 BC02BD02030303030303030303030303 03030303030303030303030303030303 03030303030303030303030303030303 03030303030303030303030303030303 03030303030303036402650203030303 03030303030303030303030303030303 03030303030303030303030303030303 740275029F078C07980706018E079707 9F070601060195078F07980706010601 06010601060106010601060107020000 000007020D040D040D040D040702A006 8A069F068E0600009D039B0392030000 6C026D020702A006000007020C040C04 0C040C040702920597059F058E059B05 9D050402040200007C027D0207028A06 000007020C040C040C040C0407028E05 97059F058E059505980599058E050000 4C024D0207029F069D0307020C040C04 0C040C0407029D059B05920590059005 8E059B05040200005C025D0207028E06 9B0307020D140D140D140D1407020000 00000000000000000000000000000000 6E026F0207020000920307028A068D06 9C069B060702A402A5020000B103B206 B3060000000000007E027F0207020000 0000070200000000000000000702B402 B502000049000804080408048D060000 4E024F020702A402A50207020000A402 A502000007029B068A06000008040804 080408048E0600005E025F020702B402 B50207020000B402B50200000702A402 A5020000080408040804080499060000 0000000007029906A006070200009506 8E0600000702B402B502000008040804 080408049D0600002805290507020000 00000702000000000000000007028D06 8E0600009B068A069D068E0600000000 380539052C022D02AC02AD025302430A 060199079B07980793078E078C079D07 0601060106010601060106013C023D02 BC02BD025112411A0000000000000000 00000000000000000000000000000000 0000000068026902AA02AB0200009D05 9D058005800500000000000000000000 00000000000000000000000078027902 BA02BB0200009D059D05800580050000 00000000000000000000000000000000 00000000060106010601060106010601 06010601060106010601060106010601 06010601060106010601060106019C07 8E079A079E078E0797078C078E079B07 06010601060147024602480206010703 6C026D02070300008006810682068306 8406850686068706880689068A068B06 8C068D068E0607037C027D0207038006 80038105820583058405850586050402 04020402040204020402040204020703 4C024D02070381060402040204020402 04020402040204020402040204020402 04020402040207035C025D0207038206 04020402040204020402040204020402 04020402040204020402040204020703 6E026F02070383060402040204020402 04020402040204020402040204020402 04020402040207037E027F0206019D07 9B078A078C0794079C07060106010601 06010601060106010601060106010703 4E024F02070380038105820583058405 85058605040204020402040204020402 04020402040207035E025F0207030402 04020402040204020402040204020402 04020402040204020402040204020703 00000000070304020402040204020402 04020402040204020402040204020402 04020402040207032802290207030402 04020402040204020402040204020402 04020402040204020402040204020703 380239022C022D02AC02AD0206018A07 9E079D07980796078A079D0792079807 9707060144058005800545053C023D02 BC02BD02000000000000000000000000 00000000000000000000000000000000 00000000680269020000000000000000 00000000000000000000000000000000 00008006800600006402650278027902 00000000000000000000000000000000 00000000000000000000000000000000 740275020601060198078F0706019F07 980795079E0796078E07060106010601 06010601060106010601060100000000 00000000000000000000000000000000 00000000000000000000000000000000 6C026D02000000000000000000000000 00000000000000000000000000000000 00000000000000007C027D0200000D04 0D040D040D040D040D040D040D040D04 0D040D040D040D040D040D040D040000 4C054D0500000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400005C055D0500000C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 6E026F0200000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400007E027F0200000C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 4E024F0200000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400005E025F0200000C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 0000000000000D140D140D140D140D14 0D140D140D140D140D140D140D140D14 0D140D140D1400002802290200008005 81058205830584058505860587058805 89058A058B058C058D058E058F050000 380239022C022D02AC02AD0206018A07 9E079D07980796078A079D0792079807 9707060144058005800545053C023D02 BC02BD02000000000000000000000000 00000000000000000000000000000000 00000000680269020000000000000000 00000000000000000000000000000000 00008006800600006402650278027902 00000000000000000000000000000000 00000000000000000000000000000000 740275020601060198078F0706019C07 A20797079D07910706019C07A0078A07 99070601060106010601060100000000 00000000000000000000000000000000 00000000000000000000000000000000 6C026D02000000000000000000000000 00000000000000000000000000000000 00000000000000007C027D0200000D04 0D040D040D040D040D040D040D040D04 0D040D040D040D040D040D040D040000 4C024D0200000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400005C025D0200000C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 6E056F0500000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400007E057F0500000C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 4E024F0200000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400005E025F0200000C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 0000000000000D140D140D140D140D14 0D140D140D140D140D140D140D140D14 0D140D140D1400002802290200008005 81058205830584058505860587058805 89058A058B058C058D058E058F050000 380239022C022D02AC02AD0206018A07 9E079D07980796078A079D0792079807 9707060144058005800545053C023D02 BC02BD02000000000000000000000000 00000000000000000000000000000000 00000000680269020000000000009506 8F06980600009B068A069D068E060000 00008006800600006402650278027902 00000000000000000000000000000000 00000000000000000000000000000000 740275020601060198078F0706018E07 8F078F078E078C079D079C0706010601 06010601060106010601060100008A06 8D069C069B06000095068F0698060000 9906A00600009C0699068D0600000000 6C026D02000081058205830584050000 85038605870588050000890500008A05 8B0500008C0500007C027D0299060D04 0D040D040D040D040D040D040D040D04 0D040D040D040D040D040D040D040000 4C024D028A060C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400005C025D0297060C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 6E026F0200000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400007E027F028C060C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 4E054F059D060C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400005E055F059B060C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 0000000095060D140D140D140D140D14 0D140D140D140D140D140D140D140D14 0D140D140D1400002802290200008005 81058205830584058505860587058805 89058A058B058C058D058E058F050000 38023902000000000000000000000000 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 00000000 #4:STARS 000A001200121D0A00021C120002001A 0002001A000A000A000A001200021C0A 000A00120002000A001A000A001A000A 1D1A000A001A0002000A00020012001A 00021C12000A001A0012001A1C0A0012 001200020012000200121C0A1D0A001A 001A001A000A00121C1200121D0A0012 0012000A000A00020002001A00021D02 1D02001A001200020002000A00020002 00021C021C0200020012001200121D0A 1D0A001A001A1C02000A000A00120002 1D0200020002000A1C0A000A0002001A 001A000A001A001A001A00121C1A1D1A 000200021C1A00121D0200021D02001A 001200021C0A1D02000A0012000A0002 000A001A0002001A000A001A0002000A 1C0A001A000A001A0002000200120002 0012000A001A00021C1A1C021C1A0002 000A1C021D02000A0002000A001A001A 000A0002000A000A00121C0A001A1C02 0002000200121D020002000A00020012 000A001A0002001A000A001200120002 000A0012001A001A0012001A001A1D12 00021D12001200021D1A001A001A0012 001A0012000A000A0002000A000A0002 001A1D12000A000200120012000A000A 0002000A00120002000A00021D0A001A 1D1A00020002000A001200120002001A 000A0002001200120002000A0012000A 0002000A001A0012000200120002000A 001200121C0A000A0002000A0012001A 001A001A001A000A1D0A00120012000A 1C12001A000A000A0012000200120012 000A1D0200121D02001A000A00020002 1C0A00021C021D021C12000A1D020002 0002001A0012001A0012000200120012 1C1A001A0012001A0012001A000A0002 001A000200021C12001A001A1C1A0002 000A0012001A000A00121C121C0A001A 0002000A000A001200020002000A0012 1D02 #5:BG 00001460800581058205830584058505 86058705880589058A058B058C058D05 8E058F0500004405800545052C022D02 00006C026D024C024D026E026F024E02 4F0200008F06A4068306000000000000 000000003C023D0200007C027D025C02 5D027E027F025E025F02000000000000 00000000000000000000000006029907 92078A079707980706029B0798079507 95070602060206020602060206020602 060206021B0204020402040204020402 04020402040204020402040204020402 0402040204026802690200101A020402 04020402040204020402040204020402 04020402040204020402040204027802 79020010190204020402040204020402 04020402040204020402040204020402 04020402040280078007001018020402 04020402040204020402040204020402 04020402040204020402040204028007 84070010170204020402040204020402 04020402040204020402040204020402 04020402040200000000000016020402 04020402040204020402040204020402 04020402040204020402040204020000 24012501150204020402040204020402 04020402040204020402040204020402 04020402040200003401350114020402 04020402040204020402040204020402 04020402040204020402040204020000 28022902130204020402040204020402 04020402040204020402040204020402 04020402040200123802390212020402 04020402040204020402040204020402 04020402040204020402040204020012 26022702110204020402040204020402 04020402040204020402040204020402 04020402040200023602370210020402 04020402040204020402040204020402 04020402040204020402040204020002 00020002800581058205830584058505 86058705880589058A058B058C058D05 8E058F05920697069C069D0606019F07 8C079807060106010601060195078F07 98070601060106010601060106010601 060106010701A0078A079F078E070000 00000701A0078A079F078E0700009D03 9B039203000000000D040D0407019D03 9B039203000000000000070192059705 9F058E059B059D050005001500100000 0C040C0407012C022D02000000000000 000007018E0597059F058E0595059805 99058E05001000000C040C0407013C02 3D02000000000000000007019D059B05 9205900590058E059B05000500100000 0D140D14060106010601060106010601 060107010B040B040B040B040B040B04 0B040B040000000099079F070D040D04 0D040D0400000D040D04070108040804 0804080408040804080408048D070000 000000000C040C040C040C0400000C04 0C040701080408040804080408040804 080408048E070000000000000C040C04 0C040C0400000C040C04070108040804 08040804080408040804080499070000 240225020C040C040C040C0400000C04 0C040701080408040804080408040804 080408049D070000340235020C040C04 0C040C0400000C040C04070108040804 08040804080408040804080491070000 280129010C040C040C040C0400000C04 0C040701080408040804080408040804 0804080400000000380139010C040C04 0C040C0400000C040C04070108040804 08040804080408040804080400000000 260227020D140D140D140D1400000D14 0D140701080408040804080408040804 0804080400000000360237028A078D07 9C079B0700009907950707019B078A07 9D078E07000000040000000000000004 00020002800581058205830584058505 86058705880589058A058B058C058D05 8E058F05000044058005450506019907 9B07980793078E078C079D0706019C07 8E079A07060106010601060106014403 80034503000080068106820683068406 850686068706880689068A068B068C06 8D068E068F0680068006000080060402 04020402040204020402040204020402 04020402040204020402040204022202 23020000810604020402040204020402 04020402040204020402040204020402 04020402040232023302000082060402 04020402040204020402040204020402 0402040204020402040204020402230A 220A0000830604020402040204020402 04020402040204020402040204020402 040204020402330A320A000006029607 9207A1078E079B070602060206020602 06020602060206020602060206020602 060206020D040D040D040D040D040D04 0D040D040D040D040D040D040D040D04 0D040D0495030000000000000C040C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C049B030000 240225020C040C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C0400000000340235020D140D14 0D140D140D140D140D140D140D140D14 0D140D140D140D140D140D1400000000 28022902800581058205830584058505 86058705880589058A058B058C058D05 8E058F05000000023802390206028D07 8A079D078A0706020602060206020602 06020602060206020602060206020000 26012701230A220A5302430A22022302 00003A123B122A022B02000007024705 46052C022D02000036013701330A320A 5112411A3202330200002A122B123A02 3B0200000702480500003C023D020000 00000000800581058205830584058505 86058705880589058A058B058C058D05 8E058F0500004405800545052C022D02 00006C026D024C024D026E026F024E02 4F02000095068F069806000000000000 000000083C023D0200007C027D025C02 5D027E027F025E025F0200009B068A06 9D068E06000000000000000806018E07 8F078F078E078C079D0706018A079E07 9D07980796078A079D07920798079707 06010601000000000000000000000000 00000000000000000000000000000000 00000000000068026902000000008A06 8D069C069B06000095068F0698060000 9906A00600009C0699068D0600007802 79020000000081058205830584050000 85038605870588050000890500008A05 8B0500008C0596058D05000099060D04 0D040D040D040D040D040D040D040D04 0D040D040D040D040D040D040D048007 800700008A060C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C0400000000000097060C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 2401250100000C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C040000340135018C060C04 0C040C040C040C040C040C040C040C04 0C040C040C040C040C040C040C040000 280229029D060C040C040C040C040C04 0C040C040C040C040C040C040C040C04 0C040C040C040000380239029B060C14 0C140C140C140C140C140C140C140C14 0C140C140C140C140C140C140C140000 2602270295060D140D140D140D140D14 0D140D140D140D140D140D140D140D14 0D140D140D1400003602370200008005 81058205830584058505860587058805 89058A058B058C058D058E058F050000 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 00000000 #8:SYNTH PRESET 220061560DCF08001014AAAA00000000 0014AAAA000000000014AAAA00000000 0014AAAA000000000014AAAA00000000 0014AAAA000000000014AAAA00000000 0014AAAA000000000014AAAA00000000 0014AAAA000000000014AAAA00000000 0014AAAA000000000014AAAA00000000 0014AAAA000000003006302000EF0000 #10:GUI ZONES S-V1 00000101000000020003010000001000 10000000001300130000000012031304 000000120613070000000104100F0000 000004000F000000 #11:GUI ZONES S-V1 00000101000000020003010000001100 1100000000130013000000000105020A 000000010D020E000000050D060E0000 0004050408000000090B0A0C0000000C 0B0D0C000000090E0A0F0000000C0E0D 0F0000000F0A0F0A0000000F0B120E00 00000905130500000009061306000000 0907130700000009081308000000 #12:GUI ZONES S-V1 00000101000000000401050000000006 010700000000080109000000000A010B 000000000E010F000000040413070000 0004091309000000050C100F00000005 0B100B000000120B120B000000120C12 0C000000130B130B000000120D130E00 0000 #13:GUI ZONES S-V1 00000101000000020003010000001000 1000000000130013000000000107100E 000000010F100F000000120313040000 001206130700000001061006000000