rem snakey
rem copyright Marc Gale (Xalthorn) 2001

gosub initialise

repeat
  gosub flip_screen
  clear window

  gosub draw_parts
  buttons=peek("port1")
  if buttons=32 then
    parts(1,3)=parts(1,3)+spinspeed
    if parts(1,3)>360 then
      parts(1,3)=parts(1,3)-360
    fi
  fi
  if buttons=128 then
    parts(1,3)=parts(1,3)-spinspeed
    if parts(1,3)<0 then
      parts(1,3)=parts(1,3)+360
    fi
  fi
  gosub move_parts

until (buttons=16384)

exit

label draw_parts

  for part=1 to maxparts
    x=parts(part,1)
    y=parts(part,2)
    setrgb 1,100,0,0
    fill circle x,y,partsize
    if part=1 then
      setrgb 1,255,255,255
      ta=parts(part,3)-eyespace
      if ta<0 then
        ta=ta+360
      fi
      fill circle x+(partsize*cosines(ta)),y+(partsize*sines(ta)),eyesize
      ta=ta+(eyespace*2)
      if ta>360 then
        ta=ta-360
      fi
      fill circle x+(partsize*cosines(ta)),y+(partsize*sines(ta)),eyesize
    fi

  next part
return

label move_parts
    x=parts(1,1)
    y=parts(1,2)

  if x+partsize>sw or x+partsize<0 or y+partsize>sh or y+partsize<0 then 
    parts(1,3)=parts(1,3)+180+(int(ran(60))-30)
    if parts(1,3)>360 then 
      parts(1,3)=parts(1,3)-360
    fi
  fi

  for part=maxparts to 1 step-1
    if part>1 then
      if parts(part,3)>0 then
        parts(part,3)=parts(part,3)-1
      else
        for a=delay to 2 step -1
          dirs(part,a)=dirs(part,a-1)
        next a
        dirs(part,1)=dirs(part-1,delay)
        parts(part,1)=parts(part,1)+speed*cosines(dirs(part,1))
        parts(part,2)=parts(part,2)+speed*sines(dirs(part,1))
      fi
    else
        for a=delay to 2 step -1
          dirs(part,a)=dirs(part,a-1)
        next a
        dirs(part,1)=parts(part,3)

        parts(part,1)=parts(part,1)+speed*cosines(dirs(part,1))
        parts(part,2)=parts(part,2)+speed*sines(dirs(part,1))
    fi

  next part
return

label flip_screen
  setdispbuf d 
  d=1-d
  setdrawbuf d
return

label initialise
  sw=640
  sh=512

  maxparts=20
  partsize=10
  spinspeed=5
  eyesize=partsize/3
  eyespace=30
  speed=4
  delay=int((partsize*2)/speed)-1

  dim parts(maxparts, 3)
                  rem 1=x coord 
                  rem 2=y coord
                  rem 3=angle/delay

  dim dirs(maxparts,delay)

  for part=1 to maxparts
    parts(part,1)=300
    parts(part,2)=200
    if part=1 then
      parts(part,3)=0
    else
      parts(part,3)=delay*(part-1)
    fi
    for a=0 to delay
      dirs(part,a)=0
    next a
  next part

  d=1

  dim cosines(360)
  dim sines(360)

  for a=0 to 360
    cosines(a)=cos(a*(pi/180))
    sines(a)=sin(a*(pi/180))
  next a

  open window sw,sh
  clear window
return
