;
; mSnake v2.3 by Varvail
; using HASH tables.
; if mirc is minimized Snake pauses
; 
; to Load: /load -rs mSnake2.mrc
;
; To start /snake2
;
on 1:KEYDOWN:@snake2:32,37,38,39,40:{
  if ($keyval == 32) {
    if ($hget(snake2d,status) != game over) {
      if ($hget(snake2d,start) == yes) {
        hadd snake2d start no
        titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score) -GAME PAUSED-
        hadd snake2d status paused
      }
      else {
        hadd snake2d start yes
        titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score)
        hadd snake2d status playing
      }
      return
    }
    snake2
    return
  }
  if ($hget(snake2d,start) == no) { hadd snake2d start yes }
  if ($hget(snake2d,p)) { return }
  if ($keyval == 37) { if ($_s2_dir == right) && ($_s2_len > 1) { return } | hadd snake2d direction left }
  if ($keyval == 38) { if ($_s2_dir == down) && ($_s2_len > 1) { return } | hadd snake2d direction up }
  if ($keyval == 39) { if ($_s2_dir == left) && ($_s2_len > 1) { return } | hadd snake2d direction right }
  if ($keyval == 40) { if ($_s2_dir == up) && ($_s2_len > 1) { return } | hadd snake2d direction down }
  hadd snake2d p yes
}
alias snake2 {
  window -p @snake2 100 50 510 530
  drawrect -f @snake2 1 1 0 0 510 530
  if ($hget(snake2)) { hfree snake2 }
  if ($hget(snake2d)) { hfree snake2d }
  hmake snake2 10000
  hmake snake2d 100
  hadd snake2d status playing
  hadd snake2 1 25 25
  hadd snake2d 25_25 snake
  hadd snake2d start no
  hadd snake2d size 1
  hadd snake2d score 0
  titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score)
  var %f_x = $r(1,50)
  var %f_y = $r(1,50)
  var %f_xy = %f_x $+ _ $+ %f_y
  hadd snake2d fruit_x %f_x
  hadd snake2d fruit_y %f_y
  hadd snake2d %f_xy fruit
  hadd snake2d num 1
  hadd snake2d 25_25 snake
  drawdot @snake2 4 4 $calc($_s2_loc($hget(snake2d,fruit_x)) +5) $calc($_s2_loc($hget(snake2d,fruit_y)) +5)
  drawrect -f @snake2 7 1 $_s2_get2(1)
  .timersnake2 -m 0 50 _snake2
}
menu channel {
  playing mIRC Snake:/me is playing mIRC Snake v $+ %_s2_ver status: $hget(snake2d,status) Points: $hget(snake2d,score)
}
menu @snake2 {
  Snake2 for mIRC:echo -s made by Varvail
  -
  Wall Status- $iif(%_s2_solid != no,SOLID,not solid) -:{
    if (%_s2_solid != no) { set %_s2_solid no }
    else { set %_s2_solid yes }
  }
  -
  restart:/snake2
  pause:{
    if ($hget(snake2d,status) != game over) {
      if ($hget(snake2d,start) == yes) {
        hadd snake2d start no
        titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score) -GAME PAUSED-
        hadd snake2d status paused
      }
      else {
        hadd snake2d start yes
        titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score)
        hadd snake2d status playing
      }
      return
    }
  }
}
menu menubar {
  Snake2:/snake2
}
alias _snake2 {
  set %_s2_ver 2.2
  if (!$window(@snake2)) { .timersnake2 off | return }
  if (!$appactive) || ($active != @snake2) {
    hadd snake2d start no
    titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score) -GAME PAUSED-
    hadd snake2d status paused
  }
  if ($hget(snake2d,start) != yes) { return }
  drawdot @snake2 4 4 $calc($_s2_loc($hget(snake2d,fruit_x)) +5) $calc($_s2_loc($hget(snake2d,fruit_y)) +5)
  var %x = $gettok($_s2_get($hget(snake2d,num)),1,32)
  var %y = $gettok($_s2_get($hget(snake2d,num)),2,32)
  if ($_s2_dir == left) { dec %x }
  if ($_s2_dir == up) { dec %y }
  if ($_s2_dir == right) { inc %x }
  if ($_s2_dir == down) { inc %y }
  hadd snake2d num $calc($hget(snake2d,num) +1)
  var %xy = %x $+ _ $+ %y
  if (%_s2_solid == no) {
    if (%x > 50) { dec %x 50 }
    if (%y > 50) { dec %y 50 }
    if (1 > %x) { inc %x 50 }
    if (1 > %y) { inc %y 50 }
    var %xy = %x $+ _ $+ %y
    if ($hget(snake2d,%xy) == snake) {
      goto go
    }
  }
  if ((%_s2_solid != no)) && (($hget(snake2d,%xy) == snake) || (1 > %x) || (%x > 50) || (1 > %y) || (%y > 50))  {
    :go
    .timersnake2 off
    drawtext @snake2 10 arial 80 20 150 Game Over
    if (!%_s2_ms) || ($hget(snake2d,score) > %_s2_ms) {
      drawtext @snake2 8 arial 30 130 100 New high score
      set %_s2_ms $hget(snake2d,score)
      ;set %_s2_mn $input(input name,eo,New High Score)
      set %_s2_mn $?="New High Score, input name"
    }
    drawtext @snake2 10 arial 20 200 300 Topscore:
    drawtext @snake2 3 arial 20 190 330 %_s2_ms : %_s2_mn
    hadd snake2d status game over
    return
  }
  drawrect -f @snake2 7 1 $_s2_loc(%x) $_s2_loc(%y) 10 10
  if ($_s2_len > 1) { drawrect -f @snake2 1 1 $_s2_get2($calc($hget(snake2d,num) -1)) | drawrect @snake2 7 1 $_s2_get2($calc($hget(snake2d,num) -1)) }
  var %q = $_s2_len
  if ($hget(snake2d,%xy) == fruit) {
    hadd snake2d score $calc(9+ $hget(snake2d,score))
    titlebar @snake2 $iif(%_s2_solid != no,SOLID,not solid) - Score: $hget(snake2d,score)
    hadd snake2 $hget(snake2d,num) %x %y
    hadd snake2d %xy snake
    var %f_yx = YldGa1pTQmllU0IyWVhKMllXbHM=
    :create
    var %f_x = $r(1,50)
    var %f_y = $r(1,50)
    var %f_xy = %f_x $+ _ $+ %f_y
    if ($hget(snake2d,%f_xy)) { goto create }
    hadd snake2d fruit_x %f_x
    hadd snake2d fruit_y %f_y
    hadd snake2d %f_xy fruit
    drawdot @snake2 4 4 $calc($_s2_loc($hget(snake2d,fruit_x)) +5) $calc($_s2_loc($hget(snake2d,fruit_y)) +5)
    hadd snake2d size $calc($_s2_len +1)
    goto _snakeend
  }
  var %lenxy $replace($_s2_get($calc($hget(snake2d,num) - %q)),$chr(32),_)
  hdel snake2d %lenxy
  drawrect -f @snake2 1 1 $_s2_get2($calc($hget(snake2d,num) - %q))
  hdel snake2 $calc($hget(snake2d,num) - %q)
  hadd snake2 $hget(snake2d,num) %x %y
  hadd snake2d %xy snake
  :_snakeend
  hdel snake2d p
}
alias _s2_dir { return $hget(snake2d,direction) }
alias _s2_loc { return $calc(($1 -1)*10) }
alias _s2_get { return $hget(snake2,$1) }
alias _s2_get2 { var %a = $hget(snake2,$1) | return $_s2_loc($gettok(%a,1,32)) $_s2_loc($gettok(%a,2,32)) 10 10 }
alias _s2_len { return $hget(snake2d,size) }