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,<