Challenge:
Version:
2
Winner?:
No
Code Snippet:
Rem Project: minimal media challenge Rem Created: 30/12/2006 12:29:28 Rem ***** Main Source File ***** gosub display datatoimage(1) colouriseimage(1,2,0,255,0) colouriseimage(1,3,0,0,255) colouriseimage(1,4,255,255,0) colouriseimage(1,5,0,255,255) colouriseimage(1,6,255,0,255) gosub constants gosub types gosub make_frame gosub make_gun gosub create_GUI dummy=free_object() make object cube dummy,1 restart: gosub create_level countdownstarttime=timer() starttime#=timer() do if currentball>0 then position object dummy,limb position x(currentball,0),limb position y(currentball,0),0 gosub timer_maths gosub countdown gosub aim_gun gosub load_gun gosub fire_gun gosub move_ball gosub collision gosub drop_balls gosub update_sprites gosub display_level gosub move_gun sync loop `____________________________________________________________________________________________________________ `SUBROUTINES aim_gun: if leftkey()=1 then dec gun.angle,gunrotationspeed#*dt# if rightkey()=1 then inc gun.angle,gunrotationspeed#*dt# if gun.angle>65 then gun.angle=65 if gun.angle<-65 then gun.angle=-65 zrotate object pivot,-gun.angle return collision: if firing=1 `collision with side walls if ball(currentball).x>maxframex#-ballsize#/2.0 and collisionflagright=0 ball(currentball).vx=-ball(currentball).vx collisionflagright=1 endif if ball(currentball).x<minframex#+ballsize#/2.0 and collisionflagleft=0 ball(currentball).vx=-ball(currentball).vx collisionflagleft=1 endif `reset collision flags, which prevent multiple collisions with same wall in rapid succession if collisionflagright=1 and ball(currentball).x<0 then collisionflagright=0 if collisionflagleft=1 and ball(currentball).x>0 then collisionflagleft=0 `collision with top wall if ball(currentball).y>maxframey#-ballsize#/2.0 ball(currentball).y=maxframey#-ballsize#/2.0 firing=0 collisionflagleft=0 collisionflagright=0 endif `collision with other balls `remstart target=object collision(currentball,0) if target>ballseed and ball(target).falling=0 and target<>currentball `collision with deadzone - game over if ball(currentball).y<deadzoney#+ballsize#/2.0 gosub game_over goto restart endif firing=0 collisionflagleft=0 collisionflagright=0 `if same colour, delete both balls if ball(currentball).colour=ball(target).colour ball(currentball).falling=1 ball(target).falling=1 inc score update_text(scoretext,scoretextimage,"Score: "+str$(score),"Arial",24,1,0,0,250,0) `check for balls which are unsupported else `if different colour, refine position for correct surface contact point object currentball,object position x(target),object position y(target),0 position object currentball,object position x(target),object position y(target),0 move object currentball,-ballsize#*0.99 `if resting ontop of another ball, give ball elevated status, to prevent from dropping if object position y(currentball)>object position y(target) then ball(currentball).elevated=1 endif endif `remend endif return constants: sw#=screen width() sh#=screen height() borderwidth#=2 framewidth#=240 maxframex#=120 minframex#=-120 frameheight#=340 maxframey#=170 minframey#=-170 deadzoney#=-100 gunsize#=15 gunspeed#=0.1 gunrotationspeed#=0.05 ballseed=100 global currentball currentball=ballseed ballsize#=20 ballspeed#=0.3 dropspeed#=0.2 fadespeed#=0.1 level=1 countdownstartvalue=180 countdownon=1 global spritesize# spritesize#=32 return countdown: if countdownon=1 countdowntimer=(timer()-countdownstarttime)/1000 countdown=countdownstartvalue-countdowntimer if countdown<>oldcountdown then update_text(timertext,timertextimage,"Time: "+str$(countdown),"Arial",24,1,0,0,250,0) oldcountdown=countdown if countdown=0 gosub game_over goto restart endif endif return display: set display mode 1024,768,32 color backdrop 0 autocam off sync on sync position camera 0,0,-450 return display_level: if firsttime=0 firsttime=1 nextlevelbox=free_sprite() nextlevelboximage=free_image() make_box(nextlevelbox,nextlevelboximage,sw#/2.0-100,sh#/2.0-20,200,40) nextleveltext=free_sprite() nextleveltextimage=free_image() make_box(nextleveltext,nextleveltextimage,sw#/2.0-100,sh#/2.0-20,200,40) update_text(nextleveltext,nextleveltextimage,"Level "+str$(level)+"! Press Any Key.","Arial",20,0,0,250,0,0) sync sync wait 500 wait key repeat until scancode()=0 delete sprite nextlevelbox delete image nextlevelboximage delete sprite nextleveltext delete image nextleveltextimage endif return drop_balls: countballs=0 for n=ballseed+1 to currentball-1 if object exist(n)=1 inc countballs if ball(n).falling=1 dec ball(n).y,dropspeed#*dt# inc ball(n).fade,fadespeed#*dt# position object n,object position x(n),ball(n).y,0 set sprite alpha n+1000,255-ball(n).fade if ball(n).fade>255.0 or ball(n).y<deadzoney# delete object n delete sprite n+1000 endif endif endif next n `check for level completed if countballs=0 inc level dec countdownstartlevel,15 if level>5 winbox=free_sprite() winboximage=free_image() make_box(winbox,winboximage,sw#/2.0-100,sh#/2.0-20,200,40) wintext=free_sprite() wintextimage=free_image() make_box(wintext,wintextimage,sw#/2.0-100,sh#/2.0-20,200,40) update_text(wintext,wintextimage,"You Win! Score: "+str$(score),"Arial",20,0,0,250,0,0) sync wait 1000 wait key repeat until scancode()=0 end endif update_text(leveltext,leveltextimage,"Level: "+str$(level),"Arial",24,1,0,0,250,0) nextlevelbox=free_sprite() nextlevelboximage=free_image() make_box(nextlevelbox,nextlevelboximage,sw#/2.0-100,sh#/2.0-20,200,40) nextleveltext=free_sprite() nextleveltextimage=free_image() make_box(nextleveltext,nextleveltextimage,sw#/2.0-100,sh#/2.0-20,200,40) update_text(nextleveltext,nextleveltextimage,"Level "+str$(level)+"! Press Any Key.","Arial",20,0,0,250,0,0) sync wait 1000 wait key repeat until scancode()=0 delete sprite nextlevelbox delete image nextlevelboximage delete sprite nextleveltext delete image nextleveltextimage for n=ballseed+1 to currentball if object exist(n) delete object n delete sprite n+1000 endif next n undim ball(0) currentball=ballseed firing=0 loaded=0 colour=0 goto restart endif return create_GUI: scorebox=free_sprite() scoreboximage=free_image() make_box(scorebox,scoreboximage,0,0,200,40) scoretext=free_sprite() scoretextimage=free_image() make_box(scoretext,scoretextimage,0,0,200,40) update_text(scoretext,scoretextimage,"Score: 0","Arial",24,1,0,0,250,0) levelbox=free_sprite() levelboximage=free_image() make_box(levelbox,levelboximage,sw#-200,0,200,40) leveltext=free_sprite() leveltextimage=free_image() make_box(leveltext,leveltextimage,sw#-200,0,200,40) update_text(leveltext,leveltextimage,"Level: 1","Arial",24,1,0,0,250,0) timerbox=free_sprite() timerboximage=free_image() make_box(timerbox,timerboximage,sw#/2.0-100,0,200,40) timertext=free_sprite() timertextimage=free_image() make_box(timertext,timertextimage,sw#/2.0-100,0,200,40) update_text(timertext,timertextimage,"Time: 60","Arial",24,1,0,0,250,0) return fire_gun: if loaded=1 and firing=0 and spacekey()=1 and firingflag=0 firingflag=1 loaded=0 firing=1 ball(currentball).angle=gun.angle ball(currentball).vx=ballspeed#*sin(ball(currentball).angle) ball(currentball).vy=ballspeed#*cos(ball(currentball).angle) ball(currentball).x=limb position x(currentball,0) ball(currentball).y=limb position y(currentball,0) unglue object currentball position object currentball,ball(currentball).x,ball(currentball).y,0 endif if firingflag=1 and scancode()=0 then firingflag=0 return game_over: gameoverbox=free_sprite() gameoverboximage=free_image() make_box(gameoverbox,gameoverboximage,sw#/2.0-100,sh#/2.0-20,200,40) gameovertext=free_sprite() gameovertextimage=free_image() make_box(gameovertext,gameovertextimage,sw#/2.0-100,sh#/2.0-20,200,40) update_text(gameovertext,gameovertextimage,"Game Over! Press Any Key.","Arial",20,0,0,250,0,0) sync wait 500 wait key repeat until scancode()=0 delete sprite gameoverbox delete image gameoverboximage delete sprite gameovertext delete image gameovertextimage for n=ballseed+1 to currentball if object exist(n) delete object n delete sprite n+1000 endif next n undim ball(0) currentball=ballseed firing=0 loaded=0 level=1 score=0 colour=0 firsttime=0 update_text(scoretext,scoretextimage,"Score: 0","Arial",24,1,0,0,250,0) update_text(leveltext,leveltextimage,"Level: 1","Arial",24,1,0,0,250,0) update_text(timertext,timertextimage,"Time: 60","Arial",24,1,0,0,250,0) return load_gun: if firing=0 and loaded=0 `check for any unsupported balls for object=ballseed+1 to currentball if object exist(object)=1 if ball(object).falling=0 and ball(object).elevated=0 supported=0 if object position y(object)>=maxframey#-ballsize#/2.0 then supported=1 if supported=0 for checktarget=ballseed+1 to currentball if collision<>checktarget and object exist(checktarget)=1 if ball(checktarget).falling=0 collision=object collision(object,checktarget) if collision>0 if object position y(checktarget)>object position y(object) then supported=1 endif endif endif next checktarget endif if supported=0 ball(object).falling=1 set object collision off object endif endif endif next object loaded=1 inc currentball dim ball(currentball) as balltype make object sphere currentball,ballsize# spritemask(currentball) sprite currentball+1000,object screen x(currentball)-spritesize#/2.0,object screen y(currentball)-spritesize#/2.0,sprite image(currentball+1000) glue object to limb currentball,gunbarrel,0 position object currentball,0,object size y(gunbarrel)/2.0+ballsize#/2.0,0 ball(currentball).colour=colour:inc colour if colour>5 then colour=0 if ball(currentball).colour=0 then set sprite image currentball+1000,1 if ball(currentball).colour=1 then set sprite image currentball+1000,2 if ball(currentball).colour=2 then set sprite image currentball+1000,3 if ball(currentball).colour=3 then set sprite image currentball+1000,4 if ball(currentball).colour=4 then set sprite image currentball+1000,5 if ball(currentball).colour=5 then set sprite image currentball+1000,6 endif return make_frame: frametop=free_object() make object box frametop,framewidth#+(borderwidth#*2),borderwidth#,borderwidth# position object frametop,0,maxframey#+(borderwidth#/2.0),0 set object collision off frametop framebottom=free_object() make object box framebottom,framewidth#+(borderwidth#*2),borderwidth#,borderwidth# position object framebottom,0,minframey#-(borderwidth#/2.0),0 set object collision off framebottom frameleft=free_object() make object box frameleft,borderwidth#,frameheight#+(borderwidth#*2),borderwidth# position object frameleft,minframex#-(borderwidth#/2.0),0,0 set object collision off frameleft frameright=free_object() make object box frameright,borderwidth#,frameheight#+(borderwidth#*2),borderwidth# position object frameright,maxframex#+(borderwidth#/2.0),0,0 set object collision off frameright deadzone=free_object() make object box deadzone,framewidth#+(borderwidth#*2),borderwidth#/2.0,borderwidth# position object deadzone,0,deadzoney#,0 set object collision off deadzone return make_gun: pivot=free_object() make object cube pivot,1 hide object pivot position object pivot,0,minframey#+gunsize#,0 set object collision off pivot gunbase=free_object() make object box gunbase,gunsize#*4,gunsize#,borderwidth#*2 position object gunbase,0,minframey#+gunsize#/2.0,0 color object gunbase,rgb(150,150,250) set object collision off gunbase gundisc=free_object() make object sphere gundisc,gunsize#*2,30,30 gundisctexture=free_image() create bitmap 1,100,100 ink rgb(100,100,100),0 box 0,0,100,100 ink rgb(120,120,120),0 box 0,0,50,100 get image gundisctexture,0,0,100,100,1 delete bitmap 1 texture object gundisc,gundisctexture scale object gundisc,100,100,0.01 position object gundisc,0,0,0 glue object to limb gundisc,pivot,0 set object collision off gundisc gunbarrel=free_object() make object box gunbarrel,gunsize#/4.0,gunsize#*1.5,borderwidth# position object gunbarrel,0,(gunsize#*0.5),0 glue object to limb gunbarrel,pivot,0 color object gunbarrel,rgb(250,0,0) set object collision off gunbarrel return move_ball: if firing=1 inc ball(currentball).x,ball(currentball).vx*dt# inc ball(currentball).y,ball(currentball).vy*dt# position object currentball,ball(currentball).x,ball(currentball).y,0 endif return move_gun: if level>4 inc gunx#,gunspeed#*dt# if gunx#>maxframex#*0.75 then gunspeed#=-abs(gunspeed#):gunflagright=1 if gunx#<minframex#*0.75 then gunspeed#=abs(gunspeed#):gunflagleft=1 if gunflagright=1 and gunx#<0 then gunflagright=0 if gunflagleft=1 and gunx#>0 then gunflagleft=0 position object pivot,gunx#,object position y(pivot),0 position object gunbase,gunx#,object position y(gunbase),0 else position object pivot,0,object position y(pivot),0 position object gunbase,0,object position y(gunbase),0 endif return timer_maths: time#=timer()-starttime# changeintime#=time#-oldtime# inc sumofchangeintime#,changeintime# inc timerloopcounter if timerloopcounter=9 timerloopcounter=0 dt#=sumofchangeintime#/10.0 `dt#=delta time, the change in time per loop, averaged over 10 loops sumofchangeintime#=0 endif oldtime#=time# return types: type balltype colour as integer x as float y as float vx as float vy as float angle as float fade as float falling as integer elevated as integer endtype type guntype angle as float x as float y as float endtype global gun as guntype return update_sprites: for n=ballseed+1 to currentball if object exist(n)=1 and sprite exist(n+1000) spritenumber=n+1000 sprite spritenumber,object screen x(n)-spritesize#/2.0,object screen y(n)-spritesize#/2.0,sprite image(spritenumber) endif next n if firing=0 sprite currentball+1000,object screen x(dummy)-spritesize#/2.0,object screen y(dummy)-spritesize#/2.0,sprite image(currentball+1000) endif return `___________________________________________________________________________________________________________ `FUNCTIONS create_level: if level=1 then restore level1 if level=2 then restore level2 if level=3 then restore level3 if level=4 then restore level4 if level=5 then restore level5 dim number(10,10) for y=1 to 10 for x=1 to 10 read number(x,y) if number(x,y)<>8 inc currentball global dim ball(currentball) as balltype ball(currentball).colour=number(x,y) if ball(currentball).colour=9 then ball(currentball).colour=rnd(5):ball(currentball).elevated=1 make object sphere currentball,ballsize# spritemask(currentball) ball(currentball).x=x*ballsize#-(ballsize#*5.5) ball(currentball).y=maxframey#-ballsize#/2.0-((y-1)*ballsize#*0.99) position object currentball,ball(currentball).x,ball(currentball).y,0 if ball(currentball).colour=0 then set sprite image currentball+1000,1 if ball(currentball).colour=1 then set sprite image currentball+1000,2 if ball(currentball).colour=2 then set sprite image currentball+1000,3 if ball(currentball).colour=3 then set sprite image currentball+1000,4 if ball(currentball).colour=4 then set sprite image currentball+1000,5 if ball(currentball).colour=5 then set sprite image currentball+1000,6 endif next x next y gosub update_sprites return function spritemask(currentball) spritenumber=currentball+1000 sprite spritenumber,0,0,1 sprite spritenumber,object screen x(currentball)-spritesize#/2.0,object screen y(currentball)-spritesize#/2.0,1 size sprite spritenumber,spritesize#,spritesize# endfunction function free_object() repeat inc n until object exist(n)=0 endfunction n function free_image() repeat inc n until image exist(n)=0 endfunction n function free_sprite() repeat inc n until sprite exist(n)=0 endfunction n function datatoimage(image) memblock=1 read size make memblock 1,size read sx `as dword read sy `as dword read depth `as dword write memblock dword 1,0,sx write memblock dword 1,4,sy write memblock dword 1,8,depth for x=0 to sx-1 for y=0 to sy-1 pos=(y*sx+x)*4+12 read b `as byte read g `as byte read r `as byte read a `as byte write memblock byte 1,pos,b write memblock byte 1,pos+1,g write memblock byte 1,pos+2,r write memblock byte 1,pos+3,a next y next x make image from memblock image,1 endfunction data 16396 data 64 data 64 data 32 data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,217,217,219,1,231,231,231,13,246,246,246,13,237,242,247,19,234,241,246,44,160,206,225,46,82,157,201,46,74,177,225,46,66,212,255,33,59,207,255,13,54,200,250,13,52,185,231,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,183,222,1,222,222,244,19,246,243,248,54,248,248,248,105,247,247,247,164,245,250,255,206,252,252,252,209,236,242,247,215,230,236,239,241,142,185,208,242,85,133,178,242,77,166,213,242,69,210,255,229,61,211,255,209,55,209,255,206,49,206,255,168,43,203,255,135,38,198,255,77,33,191,248,25,32,176,227,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,212,241,6,202,202,243,63,220,220,247,156,247,250,255,212,250,251,251,242,249,249,249,255,248,252,255,255,254,254,254,255,239,244,249,255,228,234,231,255,175,202,217,255,97,150,188,255,88,140,184,255,79,176,223,255,71,214,255,255,63,212,255,255,56,210,255,255,50,208,255,255,44,205,255,255,39,200,255,251,34,196,253,219,30,192,250,164,27,188,247,98,23,182,242,36,27,156,205,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,234,251,6,226,226,251,63,217,217,248,168,217,217,249,241,245,245,253,255,253,253,253,255,252,255,255,255,250,250,250,255,255,255,255,255,242,243,243,255,233,238,242,255,194,213,217,255,110,167,197,255,100,146,186,255,90,168,212,255,81,210,255,255,73,214,255,255,65,212,255,255,58,210,255,255,51,208,255,255,46,207,255,255,40,203,255,255,35,198,255,255,31,195,252,255,27,190,250,254,24,186,246,226,21,181,242,142,18,176,238,43,20,154,206,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,251,254,1,247,247,255,57,240,240,255,168,232,232,253,241,223,223,251,255,241,241,254,255,254,254,255,255,254,254,254,255,253,255,253,255,251,254,251,255,246,249,246,255,238,241,238,255,214,224,223,255,145,185,207,255,112,154,191,255,102,161,202,255,92,202,245,255,83,217,255,255,75,215,255,255,67,213,255,255,59,210,255,255,53,209,255,255,47,207,255,255,41,205,255,255,36,201,255,255,32,196,255,255,28,193,251,255,24,188,248,255,21,183,244,255,19,179,240,228,17,175,237,142,15,171,233,43,20,138,184,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,10,255,255,255,108,251,251,255,231,244,244,255,255,236,236,254,255,236,236,254,255,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,244,247,244,255,230,235,232,255,186,204,218,255,125,169,200,255,114,160,198,255,104,190,230,255,94,219,255,255,85,218,255,255,76,215,255,255,68,213,255,255,60,211,255,255,54,209,255,255,47,207,255,255,42,206,255,255,37,203,255,255,32,198,255,255,28,194,253,255,25,189,249,255,22,186,245,255,19,181,242,255,17,178,239,255,15,173,236,228,13,168,232,108,12,159,219,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,31,255,255,255,158,255,255,255,249,255,255,255,255,247,247,255,255,239,239,255,255,250,250,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,255,253,255,255,255,255,255,240,244,248,255,220,224,232,255,146,187,209,255,128,166,199,255,116,180,217,255,105,214,255,255,95,220,255,255,86,218,255,255,77,215,255,255,69,213,255,255,61,211,255,255,54,209,255,255,48,208,255,255,42,206,255,255,37,205,255,255,33,201,255,255,29,196,255,255,25,192,251,255,22,187,248,255,19,182,244,255,17,179,240,255,15,174,237,255,13,170,233,249,12,166,230,151,11,162,226,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,1,255,255,255,64,255,255,255,200,255,255,255,255,255,255,255,255,255,255,255,255,249,249,255,255,247,247,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,253,253,255,253,254,254,255,234,239,237,255,188,210,221,255,140,176,205,255,129,174,208,255,117,205,243,255,106,223,255,255,96,221,255,255,86,218,255,255,78,216,255,255,69,213,255,255,62,211,255,255,55,209,255,255,48,208,255,255,42,206,255,255,37,205,255,255,33,203,255,255,29,199,255,255,25,194,254,255,22,189,250,255,19,185,246,255,17,181,243,255,15,177,239,255,13,172,236,255,12,168,232,254,11,165,228,187,11,161,225,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,10,255,255,255,108,255,255,<