Difference between revisions of "Chess game"

From Scriptwiki
Jump to: navigation, search
m
m (Moved source to wiki for no reason, or for reservation, even if slightly defunct.)
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
[[:Image:Chess selection.jpg|Screenshot of the gameplay]]
 
[[:Image:Chess selection.jpg|Screenshot of the gameplay]]
  
= Source =
+
== Source ==
 +
 
 
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
 
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
 
  ;  
 
  ;  
 
  ; Chess game with picture windows by Cail at Quakenet -> #help.script
 
  ; Chess game with picture windows by Cail at Quakenet -> #help.script
 
  ;
 
  ;
  ; Includes singleplayer and multiplayer.
+
  ; The singleplayer mode is only for debugging and testing.
; In singleplayer mode you move black's and white's in turns.
+
  ; Multiplayer was the main idea, you can use sockets or IRC to play (read help).
  ; Multiplayer was the main idea, and the game uses sockets to start a server and to connect to a server
+
; The game will download the pieces automatically and put them into right place,
  ; Get the pieces at: http://lost.kapsi.fi/cail/chess.zip (images originally from mediawiki, by Wapcaplet)
+
  ; If you are experiencing problems with the game's download, get the image from: http://lost.kapsi.fi/cail/pieces.png
; After you've put the images of pieces into /mircdir/chess directory, start the game by typing /chess and choose your mode
+
; (images originally from mediawiki, by Wapcaplet) and put them into /mircdir/chess directory.
; Also support saving and loading the game state, for singleplayer and multiplayer.
 
 
  ;
 
  ;
  ; TODO:
+
  ; Type /chess to start the game.
  ; - function to check if a square is attacked
+
  ; Also support saving and loading the game state.
  ; - castling-move for king and rook
+
  ; Includes logging of moves, shows last move all the time, and last 40/24 moves in a sidepanel, which can be toggled on/off.
  ;  - comments for the code
+
  ;
 +
  ; Be sure to read the help for full description of all features.
 
  ;
 
  ;
 
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
 
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
 
   
 
   
 
  alias chess {
 
  alias chess {
   if ($hget(chess.board)) { hfree chess.board } | hmake chess.board 64
+
   if ($hget(chess.board))   { hfree chess.board } | hmake chess.board 100
   if ($hget(chess.info))  { hfree chess.info } | hmake chess.info 64
+
   if ($hget(chess.info))    { hfree chess.info } | hmake chess.info 100
 +
  if ($hget(chess.options))  { hfree chess.options } | hmake chess.options 100
 +
  if ($exists(chess/options.hsh)) { hload chess.options chess/options.hsh }
 +
  else {
 +
    hadd chess.options size 100
 +
    hadd chess.options log_format 1
 +
    hadd chess.options send_method msg
 +
    hadd chess.options frames 1
 +
  }
 +
 +
  window -adfpw0C +nft @chess 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +50)
 +
  drawrect -rf @chess 3684408 0 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +50)
 +
 +
  log_show -200
 +
  hadd chess.info log_lines 0
 
   
 
   
   window -dfpw0C +nft @chess 0 0 840 860
+
   drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,320,140) 300 50
   drawrect -rf @chess 3684408 0 0 0 840 860
+
   drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,380,200) 300 50
 +
  drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,440,260) 300 50
 +
  drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,500,320) 300 50
 
   
 
   
   drawrect -r @chess 65280 1 60 350 300 50
+
   drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,330,150) single player (debug)
   drawrect -r @chess 65280 1 60 410 300 50
+
   drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,390,210) connect to a server
   drawrect -r @chess 65280 1 60 470 300 50
+
   drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,450,270) start a server
 +
  drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,510,330) help
 
   
 
   
   drawtext -ro @chess 16749691 verdana 22 70 360 single player
+
   if (!$exists($qt($mircdirchess/pieces.png))) { .echo -qg $dialog(chess_getimg,chess_getimg) }
  drawtext -ro @chess 16749691 verdana 22 70 420 connect to a server
 
  drawtext -ro @chess 16749691 verdana 22 70 480 start a server
 
 
  }
 
  }
 
   
 
   
 
  menu @chess {
 
  menu @chess {
   sclick: chess_click
+
   sclick: chess_sclick
   save:chess_save
+
   dclick: chess_dclick
   $iif($hget(chess.info,init),load):chess_load $dialog(load_table,load_table)
+
  options:.echo -qg $dialog(chess_options,chess_options)
 +
  help:url -n http://wiki.prco23.org/index.php/Chess_game#Help
 +
  $iif($hget(chess.info,init),save):chess_save
 +
   $iif($hget(chess.info,init),load):chess_load $$dialog(load_table,load_table)
 +
  $iif($hget(chess.info,mode) == mp,send msg):.echo -qg $dialog(chess_send_pm,chess_send_pm)
 +
 +
  $iif($inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,840,520),20,200,$iif($hget(chess.options,size) == 100,840,520)),-)
 +
  $iif($inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,840,520),20,200,$iif($hget(chess.options,size) == 100,840,520)),save log):log_save
 
  }
 
  }
 
   
 
   
 +
on *:close:@chess:{
 +
  hfree chess.board
 +
  hfree chess.info
 +
  hfree chess.options
 +
 +
  if ($exists(chess/temp.log)) { .remove chess/temp.log }
 +
  if ($sock(chess_connect)) { sockclose chess_connect }
 +
  if ($sock(chess)) { sockclose chess }
 +
 +
  if ($hget(chess.info,con_type) == irc) { chess_send disconnect | .disable #chess.n }
 +
}
 +
 +
on *:active:@chess:{ titlebar @chess }
 
   
 
   
 
  dialog load_table {
 
  dialog load_table {
Line 54: Line 90:
 
   
 
   
 
  on 1:dialog:load_table:init:*:{
 
  on 1:dialog:load_table:init:*:{
   noop $findfile(chess,*board*.save,0,parse_save $1-)
+
   .echo -qg $findfile(chess,*board*.save,0,parse_save $1-)
  }
+
  }  
 
   
 
   
 
  alias -l parse_save {
 
  alias -l parse_save {
   noop $regex($1-,/\\([^\\]+)_board_(.+)\.save/g)  
+
   .echo -qg $regex($1-,/\\([^\\]+)_board_(.+)\.save/g)
   did -a $dname 2 $regml(1) - $regml(2)
+
  var %s = $gettok($regml(1),-1,45)
 +
   did -a $dname 2 $gettok($regml(1),-4--2,45) $+($mid(%s,1,2),:,$mid(%s,3,2),:,$mid(%s,5,2)) - $regml(2)
 
  }
 
  }
 
   
 
   
Line 65: Line 102:
 
   did -ra $dname 1 $did($dname,2).seltext  
 
   did -ra $dname 1 $did($dname,2).seltext  
 
   dialog -k $dname
 
   dialog -k $dname
 +
}
 +
 +
alias chess_restart {
 +
  hadd chess.info restart 1
 +
  window -c @chess
 +
  window -adfpw0C +nft @chess 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +60)
 +
  drawrect -rf @chess 3684408 0 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +60)
 +
  drawrect -r @chess 22456 3 17 17 $iif($hget(chess.options,size) == 100,806,486) $iif($hget(chess.options,size) == 100,806,486)
 +
 +
  hadd chess.info log_lines 0
 +
  if ($exists(chess/temp.log)) { filter -fk chess/temp.log filter_log * }
 +
  hdel chess.info log_shown
 +
  hdel chess.info log_show
 +
  log_show -200
 +
 +
  chess_load
 +
  hdel chess.info restart
 
  }
 
  }
 
   
 
   
 
  alias -l chess_load {
 
  alias -l chess_load {
   hdel -w chess.board *
+
   if (!$hget(chess.info,restart)) {
  hdel -w chess.info *
+
    hdel -w chess.board *
  hload chess.board $+(chess\,$1,_board_,$3,.save)
+
    hdel -w chess.info *
  hload chess.info $+(chess\,$1,_info_,$3,.save)
+
    hload chess.board $+(chess\,$+($1,-,$remove($2,:)),_board_,$4,.save)
+
    hload chess.info $+(chess\,$+($1,-,$remove($2,:)),_info_,$4,.save)
 +
  }
 
   var %y = 1
 
   var %y = 1
 
   while (%y <= 8) {
 
   while (%y <= 8) {
Line 79: Line 134:
 
       var %dx = $get_square(%x)
 
       var %dx = $get_square(%x)
 
       var %dy = $get_square(%y)
 
       var %dy = $get_square(%y)
       drawrect -rf @chess $get_color(%x,%y) 0 %dx %dy 100 100
+
       drawrect -rf @chess $get_color(%x,%y) 0 %dx %dy $hget(chess.options,size) $hget(chess.options,size)
 
       if ($hget(chess.board,$+(%y,%x))) { draw_piece %dx %dy $v1 $get_color(%x,%y) }
 
       if ($hget(chess.board,$+(%y,%x))) { draw_piece %dx %dy $v1 $get_color(%x,%y) }
 +
 +
      var %alph = $gettok(A B C D E F G H I J K L M,$iif($hget(chess.info,clr_own) == w,%x,$calc(9 - %x)),32)
 +
      var %xz = $calc((($hget(chess.options,size) * %x) + ($hget(chess.options,size)/2+15)) - $hget(chess.options,size))
 +
      drawtext -ro @chess 16749691 verdana 16 %xz 0 %alph
 +
 
       inc %x
 
       inc %x
 
     }   
 
     }   
 +
 +
    var %yz = $calc((($hget(chess.options,size) * %y) + ($hget(chess.options,size)/2+10)) - $hget(chess.options,size))
 +
    drawtext -ro @chess 16749691 verdana 16 5 %yz $iif($hget(chess.info,clr_own) == w,$calc(9 - %y),%y)
 +
 
     inc %y
 
     inc %y
 
   }
 
   }
 
   
 
   
   if ($hget(chess.info,mode) == mp) {
+
   if ($hget(chess.info,mode) == mp) && (!$hget(chess.info,restart)) {
 
     chess_send load $1 $3
 
     chess_send load $1 $3
 
     if ($hget(chess.info,own_turn)) { print_info light_blue Game loaded succesfully, your turn. }
 
     if ($hget(chess.info,own_turn)) { print_info light_blue Game loaded succesfully, your turn. }
Line 94: Line 158:
 
   
 
   
 
  alias -l chess_save {
 
  alias -l chess_save {
   hsave chess.board $+(chess/,$asctime(yyyy-mm-dd),_board_,$iif($hget(chess.info,mode) == sp,sp,$hget(chess.info,opponent)),.save)
+
   hsave chess.board $+(chess/,$asctime(yyyy-mm-dd-hhnnss),_board_,$iif($hget(chess.info,mode) == sp,singleplayer,$hget(chess.info,opponent)),.save)
   hsave chess.info $+(chess/,$asctime(yyyy-mm-dd),_info_,$iif($hget(chess.info,mode) == sp,sp,$hget(chess.info,opponent)),.save)
+
   hsave chess.info $+(chess/,$asctime(yyyy-mm-dd-hhnnss),_info_,$iif($hget(chess.info,mode) == sp,singleplayer,$hget(chess.info,opponent)),.save)
 
  }
 
  }
 
   
 
   
 
  alias -l chess_initiate {
 
  alias -l chess_initiate {
   hadd chess.info clr_select red
+
  drawrect -r @chess 22456 3 17 17 $iif($hget(chess.options,size) == 100,806,486) $iif($hget(chess.options,size) == 100,806,486)
 +
   hadd chess.info clr_select blue
 
   
 
   
 
   var %y = 1
 
   var %y = 1
Line 107: Line 172:
 
       var %dx = $get_square(%x)
 
       var %dx = $get_square(%x)
 
       var %dy = $get_square(%y)
 
       var %dy = $get_square(%y)
       drawrect -rf @chess $get_color(%x,%y) 0 %dx %dy 100 100
+
       drawrect -rf @chess $get_color(%x,%y) 0 %dx %dy $hget(chess.options,size) $hget(chess.options,size)
 
       if ($get_piece(%y,%x)) { hadd chess.board $+(%y,%x) $v1 | draw_piece %dx %dy $v1 $get_color(%x,%y) }
 
       if ($get_piece(%y,%x)) { hadd chess.board $+(%y,%x) $v1 | draw_piece %dx %dy $v1 $get_color(%x,%y) }
 +
 +
      var %alph = $gettok(A B C D E F G H I J K L M,$iif($hget(chess.info,clr_own) == w,%x,$calc(9 - %x)),32)
 +
      var %xz = $calc((($hget(chess.options,size) * %x) + ($hget(chess.options,size)/2+15)) - $hget(chess.options,size))
 +
      drawtext -ro @chess 16749691 verdana 16 %xz 0 %alph
 +
 
       inc %x
 
       inc %x
 
     }   
 
     }   
     inc %y
+
 +
    var %yz = $calc((($hget(chess.options,size) * %y) + ($hget(chess.options,size)/2+10)) - $hget(chess.options,size))
 +
    drawtext -ro @chess 16749691 verdana 16 5 %yz $iif($hget(chess.info,clr_own) == w,$calc(9 - %y),%y)
 +
 +
     inc %y
 +
  }
 +
}
 +
 +
alias -l chess_dclick {
 +
  if (!$inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,840,520),20,200,$iif($hget(chess.options,size) == 100,840,520))) { return }
 +
  var %n = $calc($hget(chess.info,log_lines) - $iif($hget(chess.options,size) == 100,40,24))
 +
  var %n = $calc($abs(%n) %n)
 +
 +
  var %log_line = $read(chess/temp.log,$calc($left($calc(($mouse.y *100) /20),-2) + %n))
 +
  var %clr = $iif($gettok(%log_line,1,32) == white,w,b)
 +
 +
  if ($gettok(%log_line,2,32) == 0-0) {
 +
    var %f.y = $iif($gettok(%log_line,1,32) == light_blue,8,1)
 +
 +
    if ($hget(chess.info,clr_own) == w) {
 +
      var %f.y = $calc(9 - %f.y)
 +
    }
 +
 +
    var %x1 = $iif($hget(chess.info,clr_own) == w,5,1)
 +
    var %x2 = $iif($hget(chess.info,clr_own) == w,8,4)
 +
    var %x3 = $iif($hget(chess.info,clr_own) == w,6,2)
 +
    var %x4 = $iif($hget(chess.info,clr_own) == w,7,3)
 +
 +
    draw_selection %x1 %f.y light_blue
 +
    draw_selection %x2 %f.y light_blue
 +
    draw_selection %x3 %f.y yellow
 +
    draw_selection %x4 %f.y yellow
 +
    hadd chess.info log_select $+(%f.y,%x1) $+(%f.y,%x2) $+(%f.y,%x3) $+(%f.y,%x4)
 +
  }
 +
  elseif ($gettok(%log_line,2,32) == 0-0-0) {
 +
    var %f.y = $iif($gettok(%log_line,1,32) == light_blue,8,1)
 +
 +
    if ($hget(chess.info,clr_own) == w) {
 +
      var %f.y = $calc(9 - %f.y)
 +
    }
 +
 +
    var %x1 = $iif($hget(chess.info,clr_own) == w,5,4)
 +
    var %x2 = $iif($hget(chess.info,clr_own) == w,1,8)
 +
    var %x3 = $iif($hget(chess.info,clr_own) == w,3,5)
 +
    var %x4 = $iif($hget(chess.info,clr_own) == w,4,6)
 +
 +
    draw_selection %x1 %f.y light_blue
 +
    draw_selection %x2 %f.y light_blue
 +
    draw_selection %x3 %f.y yellow
 +
    draw_selection %x4 %f.y yellow
 +
    hadd chess.info log_select $+(%f.y,%x1) $+(%f.y,%x2) $+(%f.y,%x3) $+(%f.y,%x4)
 +
  }
 +
  else {
 +
    if ($hget(chess.options,log_format) == 1) {
 +
      var %move = $gettok(%log_line,2,32)
 +
      var %from = $replace($mid(%move,2,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
 +
      var %to = $replace($mid(%move,5,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
 +
    }
 +
    else {
 +
      var %move = $gettok(%log_line,3,32)
 +
      var %from = $replace($mid(%move,1,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
 +
      var %to = $replace($mid(%move,5,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
 +
    }
 +
    var %from.x = $mid(%from,1,1)
 +
    var %from.y = $mid(%from,2,1)
 +
    var %to.x = $mid(%to,1,1)
 +
    var %to.y = $mid(%to,2,1)
 +
 +
    if ($hget(chess.info,clr_own) == w) {
 +
      var %from.y = $calc(9 - %from.y)
 +
      var %to.y = $calc(9 - %to.y)
 +
    }
 +
    else {
 +
      var %from.x = $calc(9 - %from.x)
 +
      var %to.x = $calc(9 - %to.x)
 +
    }
 +
 +
    draw_selection %from.x %from.y light_blue
 +
    draw_selection %to.x %to.y yellow
 +
    hadd chess.info log_select $+(%from.y,%from.x) $+(%to.y,%to.x) 
 
   }
 
   }
 
  }
 
  }
 
   
 
   
  alias -l chess_click {
+
  alias -l chess_sclick {
   if (!$inrect($mouse.x,$mouse.y,20,20,800,800)) { return }
+
   if ($hget(chess.info,log_select)) { clear_selections $v1 | hdel chess.info log_select }
   elseif (!$hget(chess.info,init)) {  
+
 +
   if (!$hget(chess.info,init)) {
 
   
 
   
 
     ; SELECT: single player
 
     ; SELECT: single player
     if ($inrect($mouse.x,$mouse.y,60,350,300,50)) {  
+
     if ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,320,140),300,50)) {  
 
       hadd chess.info init 1 | hadd chess.info clr_own w | hadd chess.info mode sp  
 
       hadd chess.info init 1 | hadd chess.info clr_own w | hadd chess.info mode sp  
 
       chess_initiate  
 
       chess_initiate  
 
     }   
 
     }   
 
     ; SELECT: connect to a server
 
     ; SELECT: connect to a server
     elseif ($inrect($mouse.x,$mouse.y,60,410,300,50)) {  
+
     elseif ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,380,200),300,50)) {  
      hadd chess.info init 1 | hadd chess.info clr_own b | hadd chess.info mode mp | hadd chess.info last_moved b
 
 
       connect_dialog
 
       connect_dialog
 
     }
 
     }
 
     ; SELECT: start a server
 
     ; SELECT: start a server
     elseif ($inrect($mouse.x,$mouse.y,60,470,300,50)) {  
+
     elseif ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,440,260),300,50)) {  
       hadd chess.info init 1 | hadd chess.info clr_own w | hadd chess.info mode mp | hadd chess.info own_turn 1
+
       server_dialog
       start_server | drawtext -ro @chess 16749691 verdana 22 370 480 waiting for other player...
+
    }
 +
    ; SELECT: help
 +
    elseif ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,500,310),300,50)) {
 +
       url -n http://wiki.prco23.org/index.php/Chess_game#Help
 
     }  
 
     }  
 
     return  
 
     return  
 +
  }
 +
  ; OPEN: log-window
 +
  elseif ($inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,700,380),$iif($hget(chess.options,size) == 100,820,510),125,40)) {
 +
    if ($hget(chess.info,log_show)) { hdel chess.info log_show | log_show $iif(($hget(chess.options,log_format) == 1),-120,-220) }
 +
    else { hadd chess.info log_show 1 | log_show $iif(($hget(chess.options,log_format) == 1),+120,+220) }
 +
 +
    if (!$hget(chess.info,log_shown)) {
 +
      hadd chess.info log_shown 1
 +
      if ($exists(chess/temp.log)) { filter -fk chess/temp.log filter_log * }
 +
    }
 
   }
 
   }
 
   
 
   
Line 141: Line 303:
 
   else { var %clr_own = $hget(chess.info,clr_own) }
 
   else { var %clr_own = $hget(chess.info,clr_own) }
 
   
 
   
   var %x = $left($calc($mouse.x -20+100),1)  
+
   var %x = $iif($hget(chess.options,size) == 100,$left($calc($mouse.x -20+100),1),$left($calc(((($mouse.x -20) /60) * 100) +100),1))
   var %y = $left($calc($mouse.y -20+100),1)
+
   var %y = $iif($hget(chess.options,size) == 100,$left($calc($mouse.y -20+100),1),$left($calc(((($mouse.y -20) /60) * 100) +100),1))
 +
 
   var %xy = $+(%y,%x)
 
   var %xy = $+(%y,%x)
 
   var %clr_selected = $left($hget(chess.board,%xy),1)
 
   var %clr_selected = $left($hget(chess.board,%xy),1)
Line 150: Line 313:
 
   var %last.y = $hget(chess.info,last.y)
 
   var %last.y = $hget(chess.info,last.y)
 
   var %last.xy = $+(%last.y,%last.x)
 
   var %last.xy = $+(%last.y,%last.x)
   var %y-1 = $bw(%y,1,%clr_moved)
+
   var %y-1 = $iif($hget(chess.info,clr_own) == w,$fw(%y,1,%clr_moved),$bw(%y,1,%clr_moved))
 
   var %xy-1 = $+(%y-1,%x)
 
   var %xy-1 = $+(%y-1,%x)
 +
 +
  var %y2 = $calc(9 - %y)
 +
  var %x2 = $calc(9 - %x)
 +
  var %xy2 = $+(%y2,%x2)
 +
  var %last.x2 = $calc(9 - $hget(chess.info,last.x))
 +
  var %last.y2 = $calc(9 - $hget(chess.info,last.y))
 +
  var %last.xy2 = $+(%last.y2,%last.x2)
 
   
 
   
 
   var %is_last = $iif((%x == %last.x) && (%y == %last.y),$true,$false)
 
   var %is_last = $iif((%x == %last.x) && (%y == %last.y),$true,$false)
 
   var %current_selections = $hget(chess.info,current_selections)
 
   var %current_selections = $hget(chess.info,current_selections)
 
   var %selected = $hget(chess.info,selected)
 
   var %selected = $hget(chess.info,selected)
 
 
   
 
   
 
   if (!%selected) && (%clr_selected != %clr_own) && ($hget(chess.board,%xy)) { return }
 
   if (!%selected) && (%clr_selected != %clr_own) && ($hget(chess.board,%xy)) { return }
 
   elseif (%selected) && (%clr_selected == %clr_own) {
 
   elseif (%selected) && (%clr_selected == %clr_own) {
 
     clear_selections %last.xy %current_selections | hdel chess.info selected | hdel chess.info current_selections
 
     clear_selections %last.xy %current_selections | hdel chess.info selected | hdel chess.info current_selections
     if (%is_last) { return }  
+
     if (%is_last) { hdel chess.info castling | return }  
 +
    if ($hget(chess.info,castling)) { chess_castling %last.xy %xy $hget(chess.info,clr_own) | return }
 +
    hdel chess.info castling
 
   }
 
   }
 
   elseif (!$hget(chess.board,%xy) && !$hget(chess.info,selected)) { return }
 
   elseif (!$hget(chess.board,%xy) && !$hget(chess.info,selected)) { return }
Line 169: Line 340:
 
   if ($hget(chess.info,selected)) {
 
   if ($hget(chess.info,selected)) {
 
     hadd chess.info last_moved %clr_own
 
     hadd chess.info last_moved %clr_own
    ;if ($hget(chess.board,%xy)) { hadd chess.taken $v1 }
+
 
     if ($hget(chess.info,en_passant) == %xy-1) && ($left($hget(chess.board,%xy-1),1) != %clr_own) {  
 
     if ($hget(chess.info,en_passant) == %xy-1) && ($left($hget(chess.board,%xy-1),1) != %clr_own) {  
       ;hadd chess.taken $+($hget(chess.board,%xy-1),%xy-1) 1  
+
       hadd chess.info log_ep 1
 
       hdel chess.board %xy-1  
 
       hdel chess.board %xy-1  
       drawrect -rf @chess $get_color(%x,%y-1) 0 $get_square(%x) $get_square(%y-1) 100 100
+
       drawrect -rf @chess $get_color(%x,%y-1) 0 $get_square(%x) $get_square(%y-1) $hget(chess.options,size) $hget(chess.options,size)
 
     }
 
     }
 
     hdel chess.info en_passant
 
     hdel chess.info en_passant
 +
    hdel chess.info check
 
   
 
   
     drawrect -rf @chess $get_color(%last.x,%last.y) 0 $get_square(%last.x) $get_square(%last.y) 100 100
+
     drawrect -rf @chess $get_color(%last.x,%last.y) 0 $get_square(%last.x) $get_square(%last.y) $hget(chess.options,size) $hget(chess.options,size)
 
     if ($hget(chess.board,%last.xy)) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
 
     if ($hget(chess.board,%last.xy)) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
     noop $chess_move(%last.xy,->,%xy)
+
     if ($hget(chess.board,%xy)) { hadd chess.info take $v1 }
 +
    .echo -qg $chess_move(%last.xy,->,%xy)
 
     clear_selections %current_selections %last.xy
 
     clear_selections %current_selections %last.xy
 
     hdel chess.info selected
 
     hdel chess.info selected
 
     hdel chess.info current_selections
 
     hdel chess.info current_selections
 
   
 
   
     if ($hget(chess.info,mode) == mp) {
+
     if ($hget(chess.info,mode) == mp) && (!$hget(chess.info,king_in_danger)) {
       if (!$hget(chess.info,just_switched)) { chess_send move %last.xy %xy }
+
       if (!$hget(chess.info,just_switched)) { chess_send move %last.xy2 %xy2 }
 
       print_info light_blue $hget(chess.info,opponent) $+ 's turn
 
       print_info light_blue $hget(chess.info,opponent) $+ 's turn
       hdel chess.info own_turn  
+
       hdel chess.info own_turn
 
     }
 
     }
 
     hdel chess.info just_switched   
 
     hdel chess.info just_switched   
 +
    hdel chess.info king_in_danger
 
   }
 
   }
 
   
 
   
Line 196: Line 370:
 
     var %piece = $hget(chess.board,%xy)
 
     var %piece = $hget(chess.board,%xy)
 
     draw_selection %x %y green
 
     draw_selection %x %y green
    ;draw_piece $get_square(%x) $get_square(%y) %piece $get_color(%x,%y)
 
 
     hadd chess.info selected 1
 
     hadd chess.info selected 1
 
     chess_piece_options %piece %x %y
 
     chess_piece_options %piece %x %y
Line 207: Line 380:
 
   
 
   
 
  alias -l draw_piece {
 
  alias -l draw_piece {
   drawpic -c @chess $1 $2 0 0 100 100 $+(chess/,$3,_,$iif($4,w,b),.png)
+
  var %y = $calc((($replace($left($3,1),w,1,b,3) + $iif($4 == 10407679,0,1)) *100) -100)
 +
  var %x = $calc($replace($right($3,-2),pawn,0,rook,1,knight,2,bishop,3,queen,4,king,5) *100)
 +
   drawpic -cms @chess $1 $2 $hget(chess.options,size) $hget(chess.options,size) %x %y 100 100 $qt($mircdirchess/pieces.png)
 
  }
 
  }
 
   
 
   
 
  alias -l draw_selection {
 
  alias -l draw_selection {
   drawrect -r @chess $clr_replace($3) 3 $calc($get_square($1) +1) $calc($get_square($2) +1) 98 98
+
  if ($3 == red) && (!$hget(chess.options,frames)) { return }
 +
   drawrect -r @chess $clr_replace($3) 3 $calc($get_square($1) +1) $calc($get_square($2) +1) $calc($hget(chess.options,size) -2) $calc($hget(chess.options,size) -2)
 
  }
 
  }
 
   
 
   
Line 219: Line 395:
 
   
 
   
 
   if ($right(%piece,-2) == pawn) {
 
   if ($right(%piece,-2) == pawn) {
 +
    var %l.x = $mid($3,2,1)
 +
    var %l.y = $mid($3,1,1)
 +
    var %l.y-1 = $calc(%l.y -1)
 +
    var %l.xy-1 = $+(%l.y-1,%l.x)
 +
 
     if ($istok(1 8,$left($3,1),32)) {  
 
     if ($istok(1 8,$left($3,1),32)) {  
       noop $dialog(choose_piece,choose_piece)  
+
       var %l.x2 = $calc(9 - $mid($1,2,1))
       switch_piece %newpiece $3 $1  
+
      var %l.y2 = $calc(9 - $mid($1,1,1))
       if ($hget(chess.info,mode) == mp) { chess_send switch %newpiece $3 $1 }
+
      var %l.xy2 = $+(%l.y2,%l.x2)
 +
 +
       var %n.x2 = $calc(9 - $mid($3,2,1))
 +
      var %n.y2 = $calc(9 - $mid($3,1,1))
 +
      var %n.xy2 = $+(%n.y2,%n.x2)
 +
 +
      .echo -qg $dialog(choose_piece,choose_piece)
 +
       if ($hget(chess.info,mode) == mp) { chess_send switch %newpiece %n.xy2 %l.xy2 }
 +
      switch_piece %newpiece $3 $1
 
       hadd chess.info just_switched 1
 
       hadd chess.info just_switched 1
      unset %newpiece
+
 
       return  
 
       return  
 
     }
 
     }
 
     elseif (%move_len == 2) { hadd chess.info en_passant $3 }
 
     elseif (%move_len == 2) { hadd chess.info en_passant $3 }
 +
 
 +
    if ($hget(chess.info,opponent_move)) && ($hget(chess.info,en_passant) == %l.xy-1) {
 +
        hadd chess.info log_ep 1
 +
        hdel chess.board %l.xy-1
 +
        drawrect -rf @chess $get_color(%l.x,%l.y-1) 0 $get_square(%l.x) $get_square(%l.y-1) $hget(chess.options,size) $hget(chess.options,size)
 +
    }
 +
  }
 +
  elseif (%piece == $+($hget(chess.info,clr_own),_king)) {
 +
    hadd chess.info $+($1,_king_moved) 1
 +
  }
 +
  elseif (%piece == $+($hget(chess.info,clr_own),rook)) && ($1 == 81) {
 +
    hadd chess.info left_rook_moved 1
 +
  }
 +
  elseif (%piece == $+($hget(chess.info,clr_own),rook)) && ($1 == 88) {
 +
    hadd chess.info right_rook_moved 1
 
   }
 
   }
 
   hadd chess.board $3 %piece
 
   hadd chess.board $3 %piece
 
   hdel chess.board $1
 
   hdel chess.board $1
 +
 +
  hadd chess.info king_check 1
 +
  hadd chess.info king_check2 1
 +
  chess_piece_options %piece $mid($3,2,1) $mid($3,1,1)
 +
 +
  if ($hget(chess.info,opponent_move)) {
 +
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) {
 +
      print_info red Check
 +
      hadd chess.info check 1
 +
      chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $1 $3 $right(%piece,-2) $+(+,$iif($hget(chess.info,take),x))
 +
    }
 +
    else { chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $1 $3 $right(%piece,-2) $iif($hget(chess.info,take),x) }
 +
  }
 +
  elseif (!$hget(chess.info,opponent_move)) {
 +
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_king),1).data,32)) {
 +
      var %checked 1     
 +
      chess_log $hget(chess.info,clr_own) $1 $3 $right(%piece,-2) $+(+,$iif($hget(chess.info,take),x))
 +
    }
 +
 +
    hdel chess.info threat_zone
 +
    var %n = 1
 +
    hadd chess.info king_check 1
 +
    while ($hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_,*),%n,w).data) {
 +
      var %s = $v1
 +
      if ($right($hget(chess.board,%s),-2) != king) { chess_piece_options_rec $hget(chess.board,%s) $mid(%s,2,1) $mid(%s,1,1) }
 +
      inc %n
 +
    }
 +
 +
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) {
 +
      hadd chess.info king_in_danger 1
 +
    }
 +
    elseif (!$hget(chess.info,just_switched)) && (!%checked) { chess_log $hget(chess.info,clr_own) $1 $3 $right(%piece,-2) $iif($hget(chess.info,take),x) }
 +
 +
  }
 +
 +
  if ($hget(chess.info,king_in_danger)) {
 +
    print_info red Illegal move! king would be threated.
 +
    hadd chess.board $1 %piece
 +
    if ($hget(chess.info,take)) { hadd chess.board $3 $v1 }
 +
    else { hdel chess.board $3 }
 +
  }
 +
  else {
 +
    hdel chess.info just_switched
 +
    hdel chess.info take
 +
    hdel chess.info log_ep
 +
    hdel chess.info opponent_move
 +
  }
 +
  hdel chess.info threat_zone
 +
  hdel chess.info king_check
 +
  hdel chess.info king_check2
 +
 
   return
 
   return
 
  }
 
  }
Line 239: Line 494:
 
   var %dx = $get_square(%x)
 
   var %dx = $get_square(%x)
 
   var %dy = $get_square(%y)
 
   var %dy = $get_square(%y)
 +
  var %piece = $hget(chess.board,$3)
 
   
 
   
 
   var %new_piece = $1
 
   var %new_piece = $1
Line 244: Line 500:
 
   hdel chess.board $3
 
   hdel chess.board $3
 
   
 
   
   draw_piece %dy %dx %new_piece $get_color(%x,%y)
+
   draw_piece %dy %dx %new_piece $get_color(%x,%y)
 +
 +
  hadd chess.info king_check 1
 +
  hadd chess.info king_check2 1
 +
  chess_piece_options %new_piece %y %x
 +
 +
  if ($hget(chess.info,opponent_move)) {
 +
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) {
 +
      print_info red Check
 +
      chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $3 $2 $right(%piece,-2) $+(s,+,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2)
 +
    }
 +
    else { chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $3 $2 $right(%piece,-2) $+(s,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2) }
 +
  }
 +
  elseif ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_king),1).data,32)) { 
 +
    chess_log $hget(chess.info,clr_own) $1 $3 $right(%piece,-2) $+(s,+,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2)
 +
  }
 +
  else { chess_log $hget(chess.info,clr_own) $3 $2 $right(%piece,-2) $+(s,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2) }
 +
 +
  unset %newpiece
 +
 +
  hdel chess.info just_switched
 +
  hdel chess.info take
 +
  hdel chess.info log_ep
 +
  hdel chess.info opponent_move
 +
  hdel chess.info threat_zone
 +
  hdel chess.info king_check
 +
  hdel chess.info king_check2
 +
}
 +
 +
alias -l chess_castling {
 +
  var %x.king = $mid($1,2,1)
 +
  var %y.king = $mid($1,1,1)
 +
  var %x.rook = $mid($2,2,1)
 +
  var %y.rook = $mid($2,1,1)
 +
 +
  var %xy.king = $+(%y.king,%x.king)
 +
  var %xy.rook = $+(%y.rook,%x.rook)
 +
  var %king = $+($3,_king)
 +
  var %rook = $+($3,_rook)
 +
 +
  var %l.x2 = $calc(9 - $mid($1,2,1))
 +
  var %l.y2 = $calc(9 - $mid($1,1,1))
 +
  var %l.xy2 = $+(%l.y2,%l.x2)
 +
 +
  var %n.x2 = $calc(9 - $mid($2,2,1))
 +
  var %n.y2 = $calc(9 - $mid($2,1,1))
 +
  var %n.xy2 = $+(%n.y2,%n.x2)
 +
 +
  if ($3 == $hget(chess.info,clr_own)) {
 +
    hadd chess.info king_moved 1
 +
    hadd chess.info $+($iif(%x.rook == 8,right,left),_rook_moved) 1
 +
  }
 +
 +
  if (%x.rook == 8) {
 +
    var %x+1.king = $calc(%x.king +2)
 +
    var %xy+1.king = $+(%y.king,%x+1.king)
 +
    var %x-1.king = $calc(%x.king +1)
 +
    var %xy-1.king = $+(%y.king,%x-1.king)
 +
    var %castling = $iif($hget(chess.info,clr_own) == w,0-0,0-0-0)
 +
  }
 +
  else {
 +
    var %x+1.king = $calc(%x.king -2)
 +
    var %xy+1.king = $+(%y.king,%x+1.king)
 +
    var %x-1.king = $calc(%x.king -1)
 +
    var %xy-1.king = $+(%y.king,%x-1.king)
 +
    var %castling = $iif($hget(chess.info,clr_own) == w,0-0-0,0-0)
 +
  }
 +
 +
  if ($hget(chess.info,clr_own) == w) {
 +
    ;draw_piece $get_square(%x+1.king) $get_square(%y.king) %king $get_color(%x+1.king,%y.king)
 +
    ;draw_piece $get_square(%x-1.king) $get_square(%y.king) %rook $get_color(%x-1.king,%y.king)
 +
  }
 +
 +
  draw_piece $get_square(%x+1.king) $get_square(%y.king) %king $get_color(%x+1.king,%y.king)
 +
  draw_piece $get_square(%x-1.king) $get_square(%y.king) %rook $get_color(%x-1.king,%y.king)
 +
 +
  drawrect -rf @chess $get_color(%x.rook,%y.rook) 0 $get_square(%x.rook) $get_square(%y.rook) $hget(chess.options,size) $hget(chess.options,size)
 +
  drawrect -rf @chess $get_color(%x.king,%y.king) 0 $get_square(%x.king) $get_square(%y.king) $hget(chess.options,size) $hget(chess.options,size)
 +
 +
  hadd chess.board %xy+1.king %king
 +
  hadd chess.board %xy-1.king %rook
 +
  hdel chess.board %xy.rook
 +
  hdel chess.board %xy.king
 +
 +
  if ($hget(chess.info,mode) == mp) && (!$4) {
 +
    chess_send castling %l.xy2 %n.xy2 $3
 +
    print_info light_blue $hget(chess.info,opponent) $+ 's turn
 +
  }
 +
 +
  hadd chess.info king_check 1
 +
  hadd chess.info king_check2 1
 +
 +
  var %piece = %rook
 +
  chess_piece_options %piece %x-1.king %y.king
 +
 +
  if ($hget(chess.info,opponent_move)) {
 +
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) {
 +
      print_info red Check | chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) %castling +
 +
    }
 +
    else { chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) %castling }
 +
  }
 +
  elseif ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_king),1).data,32)) { 
 +
    chess_log $hget(chess.info,clr_own) %castling +
 +
  }
 +
  else { chess_log $hget(chess.info,clr_own) %castling }
 +
 +
  hdel chess.info just_switched
 +
  hdel chess.info take
 +
  hdel chess.info log_ep
 +
  hdel chess.info opponent_move
 +
  hdel chess.info threat_zone
 +
  hdel chess.info king_check
 +
  hdel chess.info king_check2
 +
  hdel chess.info own_turn
 +
  hdel chess.info castling
 
  }
 
  }
 
   
 
   
 
  alias -l clr_replace {
 
  alias -l clr_replace {
   return $replacex($1,red,255,green,65280,blue,16732457,yellow,2751743,light_blue,16749691)
+
   return $replacex($1,red,255,green,65280,blue,16732457,yellow,2751743,light_blue,16749691,white,16777215)
 
  }
 
  }
 
   
 
   
 
  alias -l get_color {
 
  alias -l get_color {
   return $iif($calc(($1 -($2 % 2)) % 2),0,16777215)
+
   ;return $iif($calc(($1 -($2 % 2)) % 2),0,16777215)
 +
  return $iif($calc(($1 -($2 % 2)) % 2),4688849,10407679)
 +
  ; 10407679
 
  }
 
  }
 
   
 
   
  alias -l get_piece {
+
  alias get_piece {
 
   if ($istok(1 2 7 8,$1,32)) {  
 
   if ($istok(1 2 7 8,$1,32)) {  
     if ($1 == 2) { return w_pawn }
+
    var %c = $hget(chess.info,clr_own)
     elseif ($1 == 7) { return b_pawn }
+
     if ($1 == 2) { return $+($iif(%c == w,b,w),_pawn) }
     elseif ($1 == 8) { return $gettok(b_rook b_knight b_bishop b_queen b_king b_bishop b_knight b_rook,$2,32) }
+
     elseif ($1 == 7) { return $+(%c,_pawn) }
     else { return $gettok(w_rook w_knight w_bishop w_queen w_king w_bishop w_knight w_rook,$2,32) }
+
     elseif ($1 == 8) { return $+(%c,$gettok(_rook _knight _bishop $iif(%c == w,_queen _king,_king _queen) _bishop _knight _rook,$2,32)) }
 +
     else { return $+($iif(%c == w,b,w),$gettok(_rook _knight _bishop $iif(%c == w,_queen _king,_king _queen) _bishop _knight _rook,$2,32)) }
 
   }
 
   }
 
  }
 
  }
 
   
 
   
 
  alias -l get_square {
 
  alias -l get_square {
   return $calc((($1 -1) *100) +20)
+
   return $calc((($1 -1) * $hget(chess.options,size)) +20)
 
  }
 
  }
 
   
 
   
Line 275: Line 648:
 
     var %ispiece = $hget(chess.board,$v1)
 
     var %ispiece = $hget(chess.board,$v1)
 
     if ($v1 != 99) {  
 
     if ($v1 != 99) {  
       drawrect -rf @chess $get_color(%x,%y) 0 $get_square(%x) $get_square(%y) 100 100
+
       drawrect -rf @chess $get_color(%x,%y) 0 $get_square(%x) $get_square(%y) $hget(chess.options,size) $hget(chess.options,size)
 
       if (%ispiece) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
 
       if (%ispiece) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
 
     }
 
     }
Line 283: Line 656:
 
   
 
   
 
  alias -l print_info {
 
  alias -l print_info {
   drawrect -rf @chess 3684408 0 20 830 840 20 | drawtext -ro @chess $clr_replace($1) verdana 16 20 830 $2-
+
   drawrect -rf @chess 3684408 0 20 $iif($hget(chess.options,size) == 100,825,505) $iif($hget(chess.options,size) == 100,570,420) 20 | drawtext -cro @chess $clr_replace($1) "courier new" $iif($hget(chess.options,size) == 100,16,12) 20 $iif($hget(chess.options,size) == 100,825,505) $iif($hget(chess.options,size) == 100,570,420) 20 $2-
 
  }
 
  }
 
   
 
   
 
  alias -l check_square {
 
  alias -l check_square {
   if (!$hget(chess.board,$+($2,$1))) || ($left($hget(chess.board,$+($2,$1)),1) == $iif($hget(chess.info,clr_own) == w,b,w)) { return $true }
+
   var %hg = $hget(chess.board,$+($2,$1))
 +
  var %c = $iif($hget(chess.info,clr_own) == w,b,w)
 +
  if ($hget(chess.info,king_check)) { var %c = $iif(%c == w,b,w) }
 +
  if ($3) { var %c = $3 }
 +
  if (!%hg) || ($left(%hg,1) == %c) {  
 +
    return $true  
 +
  }
 
  }
 
  }
 
   
 
   
Line 295: Line 674:
 
   
 
   
 
  alias -l draw+select {
 
  alias -l draw+select {
   draw_selection $1 $2 $hget(chess.info,clr_select) | return $+($2,$1)
+
   if (!$hget(chess.info,king_check)) { draw_selection $1 $2 $hget(chess.info,clr_select) }
 +
  return $+($2,$1)
 +
}
 +
 +
alias -l chess_piece_options_rec {
 +
  chess_piece_options $1-
 
  }
 
  }
 
   
 
   
Line 302: Line 686:
 
   
 
   
 
  alias -l chess_piece_options {
 
  alias -l chess_piece_options {
 +
  var %king_check = $hget(chess.info,king_check)
 +
  var %king_check2 = $hget(chess.info,king_check2)
 +
 
   var %piece = $right($1,-2)
 
   var %piece = $right($1,-2)
 
   var %clr_own = $left($1,1)
 
   var %clr_own = $left($1,1)
   var %clr_opponent = $iif(%clr_own == w,b,w)
+
 +
  if (!%king_check) {
 +
    var %clr_own = $iif(%clr_own == w,w,b)
 +
    var %clr_opponent = $iif(%clr_own == w,b,w)
 +
  }
 +
 +
   var %clr_opponent = $iif(%clr_own == w,b,w)  
 +
 
   var %x = $2
 
   var %x = $2
 
   var %y = $3
 
   var %y = $3
Line 311: Line 705:
 
   if (%piece == pawn) {  
 
   if (%piece == pawn) {  
 
   
 
   
     var %y+1 = $fw(%y,1,%clr_own)
+
     var %y+1 = $iif(%clr_own == w,$bw(%y,1,%clr_own),$fw(%y,1,%clr_own))
     var %y+2 = $fw(%y,2,%clr_own)
+
    var %y-1 = $iif(%clr_own == w,$fw(%y,1,%clr_own),$bw(%y,1,%clr_own))
 +
     var %y+2 = $iif(%clr_own == w,$bw(%y,2,%clr_own),$fw(%y,2,%clr_own))
 
     var %x+1 = $calc(%x +1)
 
     var %x+1 = $calc(%x +1)
 
     var %x-1 = $calc(%x -1)
 
     var %x-1 = $calc(%x -1)
Line 319: Line 714:
 
     var %take_right = $+(%y+1,%x-1)
 
     var %take_right = $+(%y+1,%x-1)
 
   
 
   
     if (($left($hget(chess.board,%take_left),1) == %clr_opponent) || (($hget(chess.info,en_passant) == $+(%y,%x+1)) && ($left($hget(chess.board,$+(%y,%x+1)),1) == %clr_opponent))) {
+
     if (($left($hget(chess.board,%take_left),1) == %clr_opponent) || (($hget(chess.info,en_passant) == $+(%y,%x+1)) && ($left($hget(chess.board,$+(%y,%x+1)),1) == %clr_opponent))) {  
       var %select = %select $draw+select(%x+1,%y+1)
+
       if (!%king_check) { var %select = %select $draw+select(%x+1,%y+1,%x) }
 
     }
 
     }
 +
    if (%king_check) { var %select = %select $draw+select(%x+1,%y-1) }
 +
 
     if (($left($hget(chess.board,%take_right),1) == %clr_opponent) || (($hget(chess.info,en_passant) == $+(%y,%x-1)) && ($left($hget(chess.board,$+(%y,%x-1)),1) == %clr_opponent))) {  
 
     if (($left($hget(chess.board,%take_right),1) == %clr_opponent) || (($hget(chess.info,en_passant) == $+(%y,%x-1)) && ($left($hget(chess.board,$+(%y,%x-1)),1) == %clr_opponent))) {  
       var %select = %select $draw+select(%x-1,%y+1)  
+
       if (!%king_check) { var %select = %select $draw+select(%x-1,%y+1) }
 
     }
 
     }
     if (!$hget(chess.board,$+(%y+1,%x))) && (%y+1 <= 8) && (%y+1 > 1) {
+
    if (%king_check) { var %select = %select $draw+select(%x-1,%y-1) }
 +
 +
     if (!$hget(chess.board,$+(%y+1,%x))) && (%y+1 <= 8) && (%y+1 >= 1) && (!%king_check) {
 
       var %select = %select $draw+select(%x,%y+1)
 
       var %select = %select $draw+select(%x,%y+1)
 
   
 
   
Line 331: Line 730:
 
       if ($istok(2 7,%y,32)) && (!$hget(chess.board,$+(%y+2,%x))) && (%y+2 <= 8) && (%y+2 > 1) { var %select = %select $draw+select(%x,%y+2) }
 
       if ($istok(2 7,%y,32)) && (!$hget(chess.board,$+(%y+2,%x))) && (%y+2 <= 8) && (%y+2 > 1) { var %select = %select $draw+select(%x,%y+2) }
 
     }
 
     }
     hadd chess.info current_selections $iif(%select,$v1,99)
+
     if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
 +
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
 
     return
 
     return
 
   }
 
   }
Line 340: Line 740:
 
     ; :: RIGHT
 
     ; :: RIGHT
 
     var %z = $iif(%x == 8,9,$calc(%x +1))
 
     var %z = $iif(%x == 8,9,$calc(%x +1))
     while (%z <= 8) { if ($hget(chess.board,$+(%y,%z))) { break } | var %select = %select $draw+select(%z,%y) | inc %z }
+
     while (%z <= 8) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | inc %z }
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) { var %select = %select $draw+select(%z,%y) }
+
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }
 
   
 
   
 
     ; :: LEFT
 
     ; :: LEFT
 
     var %z = $iif(%x == 1,0,$calc(%x -1))
 
     var %z = $iif(%x == 1,0,$calc(%x -1))
     while (%z >= 1) { if ($hget(chess.board,$+(%y,%z))) { break } | var %select = %select $draw+select(%z,%y) | dec %z }  
+
     while (%z >= 1) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | dec %z }  
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) { var %select = %select $draw+select(%z,%y) }
+
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }
 
   
 
   
 
     ; :: UP
 
     ; :: UP
 
     var %z = $iif(%y == 1,0,$calc(%y -1))
 
     var %z = $iif(%y == 1,0,$calc(%y -1))
     while (%z >= 1) { if ($hget(chess.board,$+(%z,%x))) { break } | var %select = %select $draw+select(%x,%z) | dec %z }
+
     while (%z >= 1) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | dec %z }
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) { var %select = %select $draw+select(%x,%z) }
+
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }
 
   
 
   
 
     ; :: DOWN
 
     ; :: DOWN
 
     var %z = $iif(%y == 8,9,$calc(%y +1))
 
     var %z = $iif(%y == 8,9,$calc(%y +1))
     while (%z <= 8) { if ($hget(chess.board,$+(%z,%x))) { break } | var %select = %select $draw+select(%x,%z) | inc %z }
+
     while (%z <= 8) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | inc %z }
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) { var %select = %select $draw+select(%x,%z) }
+
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }
 
   
 
   
     hadd chess.info current_selections $iif(%select,$v1,99)
+
     if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
 +
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
 
     return
 
     return
 
   }
 
   }
Line 368: Line 769:
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
     while (%sx >= 1) && (%sy >= 1) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | dec %sy }
+
     while (%sx >= 1) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | dec %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
 
     ; :: LEFT-DOWN
 
     ; :: LEFT-DOWN
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
     while (%sx >= 1) && (%sy <= 8) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | inc %sy }
+
     while (%sx >= 1) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | inc %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
 
     ; :: RIGHT-UP
 
     ; :: RIGHT-UP
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
     while (%sx <= 8) && (%sy >= 1) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | dec %sy }
+
     while (%sx <= 8) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | dec %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }  
 
   
 
   
 
     ; :: RIGHT-DOWN
 
     ; :: RIGHT-DOWN
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
     while (%sx <= 8) && (%sy <= 8) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | inc %sy }
+
     while (%sx <= 8) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | inc %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
     hadd chess.info current_selections $iif(%select,$v1,99)
+
     if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
 +
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
 
     return
 
     return
 
   }
 
   }
Line 398: Line 800:
 
     ; :: RIGHT
 
     ; :: RIGHT
 
     var %z = $iif(%x == 8,9,$calc(%x +1))
 
     var %z = $iif(%x == 8,9,$calc(%x +1))
     while (%z <= 8) { if ($hget(chess.board,$+(%y,%z))) { break } | var %select = %select $draw+select(%z,%y) | inc %z }
+
     while (%z <= 8) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | inc %z }  
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) { var %select = %select $draw+select(%z,%y) }
+
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }
 
   
 
   
 
     ; :: LEFT
 
     ; :: LEFT
 
     var %z = $iif(%x == 1,0,$calc(%x -1))
 
     var %z = $iif(%x == 1,0,$calc(%x -1))
     while (%z >= 1) { if ($hget(chess.board,$+(%y,%z))) { break } | var %select = %select $draw+select(%z,%y) | dec %z }  
+
     while (%z >= 1) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | dec %z }  
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) { var %select = %select $draw+select(%z,%y) }
+
     if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }
 
   
 
   
 
     ; :: UP
 
     ; :: UP
 
     var %z = $iif(%y == 1,0,$calc(%y -1))
 
     var %z = $iif(%y == 1,0,$calc(%y -1))
     while (%z >= 1) { if ($hget(chess.board,$+(%z,%x))) { break } | var %select = %select $draw+select(%x,%z) | dec %z }
+
     while (%z >= 1) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | dec %z }  
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) { var %select = %select $draw+select(%x,%z) }
+
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }
 
   
 
   
 
     ; :: DOWN
 
     ; :: DOWN
 
     var %z = $iif(%y == 8,9,$calc(%y +1))
 
     var %z = $iif(%y == 8,9,$calc(%y +1))
     while (%z <= 8) { if ($hget(chess.board,$+(%z,%x))) { break } | var %select = %select $draw+select(%x,%z) | inc %z }
+
     while (%z <= 8) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | inc %z }
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) { var %select = %select $draw+select(%x,%z) }
+
     if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }
 
   
 
   
 
     ; :: LEFT-UP
 
     ; :: LEFT-UP
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
     while (%sx >= 1) && (%sy >= 1) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | dec %sy }
+
     while (%sx >= 1) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | dec %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
 
     ; :: LEFT-DOWN
 
     ; :: LEFT-DOWN
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sx = $iif(%x == 1,0,$calc(%x -1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
     while (%sx >= 1) && (%sy <= 8) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | inc %sy }
+
     while (%sx >= 1) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | inc %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
 
     ; :: RIGHT-UP
 
     ; :: RIGHT-UP
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
 
     var %sy = $iif(%y == 1,0,$calc(%y -1))
     while (%sx <= 8) && (%sy >= 1) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | dec %sy }
+
     while (%sx <= 8) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | dec %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
 
     ; :: RIGHT-DOWN
 
     ; :: RIGHT-DOWN
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sx = $iif(%x == 8,9,$calc(%x +1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
 
     var %sy = $iif(%y == 8,9,$calc(%y +1))
     while (%sx <= 8) && (%sy <= 8) { if ($hget(chess.board,$+(%sy,%sx))) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | inc %sy }
+
     while (%sx <= 8) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | inc %sy }
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) { var %select = %select $draw+select(%sx,%sy) }
+
     if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }
 
   
 
   
     hadd chess.info current_selections $iif(%select,$v1,99)
+
     if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    return
+
     else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
  }
 
 
  ; KING
 
  elseif (%piece == king) {
 
 
    var %x-1 = $iif(%x == 1,0,$calc(%x -1))
 
    var %y-1 = $iif(%y == 1,0,$calc(%y -1))
 
    var %x+1 = $iif(%x == 8,9,$calc(%x +1))
 
    var %y+1 = $iif(%y == 8,9,$calc(%y +1))
 
 
    ; :: RIGHT
 
    if ($check_square(%x+1,%y)) && ($in_board(%x+1,%y)) { var %select = %select $draw+select(%x+1,%y) }
 
 
    ; :: LEFT
 
    if ($check_square(%x-1,%y)) && ($in_board(%x-1,%y)) { var %select = %select $draw+select(%x-1,%y) }
 
 
    ; :: UP
 
    if ($check_square(%x,%y-1)) && ($in_board(%x,%y-1)) { var %select = %select $draw+select(%x,%y-1) }
 
 
    ; :: DOWN
 
    if ($check_square(%x,%y+1)) && ($in_board(%x,%y+1)) { var %select = %select $draw+select(%x,%y+1) }
 
 
    ; :: LEFT-UP
 
    if ($check_square(%x-1,%y-1)) && ($in_board(%x-1,%y-1)) { var %select = %select $draw+select(%x-1,%y-1) }
 
 
     ; :: LEFT-DOWN
 
    if ($check_square(%x-1,%y+1)) && ($in_board(%x-1,%y+1)) { var %select = %select $draw+select(%x-1,%y+1) }
 
 
    ; :: RIGHT-UP
 
    if ($check_square(%x+1,%y-1)) && ($in_board(%x+1,%y-1)) { var %select = %select $draw+select(%x+1,%y-1) }
 
 
    ; :: RIGHT-DOWN
 
    if ($check_square(%x+1,%y+1)) && ($in_board(%x+1,%y+1)) { var %select = %select $draw+select(%x+1,%y+1) }
 
 
    hadd chess.info current_selections $iif(%select,$v1,99)
 
 
     return
 
     return
 
   }
 
   }
Line 493: Line 860:
 
   
 
   
 
     ; :: DOWN-2 RIGHT-1
 
     ; :: DOWN-2 RIGHT-1
     if ($check_square(%x+1,%y+2)) && ($in_board(%x+1,%y+2)) { var %select = %select $draw+select(%x+1,%y+2) }
+
     if (($check_square(%x+1,%y+2,%clr_opponent)) && ($in_board(%x+1,%y+2))) || (%king_check) { var %select = %select $draw+select(%x+1,%y+2) }
 
   
 
   
 
     ; :: DOWN-2 LEFT-1
 
     ; :: DOWN-2 LEFT-1
     if ($check_square(%x-1,%y+2)) && ($in_board(%x-1,%y+2)) { var %select = %select $draw+select(%x-1,%y+2) }
+
     if (($check_square(%x-1,%y+2,%clr_opponent)) && ($in_board(%x-1,%y+2))) || (%king_check) { var %select = %select $draw+select(%x-1,%y+2) }
 
   
 
   
 
     ; :: DOWN-1 RIGHT-2
 
     ; :: DOWN-1 RIGHT-2
     if ($check_square(%x+2,%y+1)) && ($in_board(%x+2,%y+1)) { var %select = %select $draw+select(%x+2,%y+1) }
+
     if (($check_square(%x+2,%y+1,%clr_opponent)) && ($in_board(%x+2,%y+1))) || (%king_check) { var %select = %select $draw+select(%x+2,%y+1) }
 
   
 
   
 
     ; :: DOWN-1 LEFT-2
 
     ; :: DOWN-1 LEFT-2
     if ($check_square(%x-2,%y+1)) && ($in_board(%x-2,%y+1)) { var %select = %select $draw+select(%x-2,%y+1) }
+
     if (($check_square(%x-2,%y+1,%clr_opponent)) && ($in_board(%x-2,%y+1))) || (%king_check) { var %select = %select $draw+select(%x-2,%y+1) }
 
   
 
   
 
     ; :: UP-2 RIGHT-1
 
     ; :: UP-2 RIGHT-1
     if ($check_square(%x+1,%y-2)) && ($in_board(%x+1,%y-2)) { var %select = %select $draw+select(%x+1,%y-2) }
+
     if (($check_square(%x+1,%y-2,%clr_opponent)) && ($in_board(%x+1,%y-2))) || (%king_check) { var %select = %select $draw+select(%x+1,%y-2) }
 
   
 
   
 
     ; :: UP-2 LEFT-1
 
     ; :: UP-2 LEFT-1
     if ($check_square(%x-1,%y-2)) && ($in_board(%x-1,%y-2)) { var %select = %select $draw+select(%x-1,%y-2) }
+
     if (($check_square(%x-1,%y-2,%clr_opponent)) && ($in_board(%x-1,%y-2))) || (%king_check) { var %select = %select $draw+select(%x-1,%y-2) }
 
   
 
   
 
     ; :: UP-1 RIGHT-2
 
     ; :: UP-1 RIGHT-2
     if ($check_square(%x+2,%y-1)) && ($in_board(%x+2,%y-1)) { var %select = %select $draw+select(%x+2,%y-1) }
+
     if (($check_square(%x+2,%y-1,%clr_opponent)) && ($in_board(%x+2,%y-1))) || (%king_check) { var %select = %select $draw+select(%x+2,%y-1) }
 
   
 
   
 
     ; :: UP-1 LEFT-2
 
     ; :: UP-1 LEFT-2
     if ($check_square(%x-2,%y-1)) && ($in_board(%x-2,%y-1)) { var %select = %select $draw+select(%x-2,%y-1) }
+
     if (($check_square(%x-2,%y-1,%clr_opponent)) && ($in_board(%x-2,%y-1))) || (%king_check) { var %select = %select $draw+select(%x-2,%y-1) }  
 
   
 
   
     hadd chess.info current_selections $iif(%select,$v1,99)
+
     if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
 +
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
 
     return
 
     return
 
   }
 
   }
 
   
 
   
  }
+
  ; KING
 +
  elseif (%piece == king) {
 +
   
 +
    var %x-1 = $iif(%x == 1,0,$calc(%x -1))
 +
    var %y-1 = $iif(%y == 1,0,$calc(%y -1))
 +
    var %x+1 = $iif(%x == 8,9,$calc(%x +1))
 +
    var %y+1 = $iif(%y == 8,9,$calc(%y +1))
 +
    var %xy = $+(%y,%x)
 +
 +
    if  (!%king_check) {
 +
      var %n = 1
 +
 +
      hadd chess.info king_check 1
 +
      while ($hfind(chess.board,$+(%clr_opponent,_,*),%n,w).data) {
 +
        var %s = $v1
 +
        if ($right($hget(chess.board,%s),-2) != king) { chess_piece_options_rec $hget(chess.board,%s) $mid(%s,2,1) $mid(%s,1,1) }
 +
        inc %n
 +
      }
 +
      hdel chess.info king_check
 +
    }
 +
 +
    ; :: RIGHT
 +
    if ($check_square(%x+1,%y)) && ($in_board(%x+1,%y)) && (!$istok($hget(chess.info,threat_zone),$+(%y,%x+1),32)) {
 +
      var %select = %select $draw+select(%x+1,%y)
 +
    }
 +
 +
    ; :: LEFT
 +
    if ($check_square(%x-1,%y)) && ($in_board(%x-1,%y)) && (!$istok($hget(chess.info,threat_zone),$+(%y,%x-1),32)) { var %select = %select $draw+select(%x-1,%y) }
 +
 +
    ; :: UP
 +
    if ($check_square(%x,%y-1)) && ($in_board(%x,%y-1)) && (!$istok($hget(chess.info,threat_zone),$+(%y-1,%x),32)) { var %select = %select $draw+select(%x,%y-1) }
 +
 +
    ; :: DOWN
 +
    if ($check_square(%x,%y+1)) && ($in_board(%x,%y+1)) && (!$istok($hget(chess.info,threat_zone),$+(%y+1,%x),32)) { var %select = %select $draw+select(%x,%y+1) }
 
   
 
   
dialog choose_piece {
+
    ; :: LEFT-UP
  title "Chess"
+
    if ($check_square(%x-1,%y-1)) && ($in_board(%x-1,%y-1)) && (!$istok($hget(chess.info,threat_zone),$+(%y-1,%x-1),32)) { var %select = %select $draw+select(%x-1,%y-1) }
  size -1 -1 422 130
 
  option pixels
 
 
   
 
   
  text "Select a new piece.",5, 7 5 417 20
+
    ; :: LEFT-DOWN
  icon 1, 5 25 100 100
+
    if ($check_square(%x-1,%y+1)) && ($in_board(%x-1,%y+1)) && (!$istok($hget(chess.info,threat_zone),$+(%y+1,%x-1),32)) { var %select = %select $draw+select(%x-1,%y+1) }
  icon 2, 108 25 100 100
 
  icon 3, 211 25 100 100
 
  icon 4, 314 25 100 100
 
}
 
 
   
 
   
on 1:dialog:choose_piece:init:*:{
+
    ; :: RIGHT-UP
  did -g $dname 1 $+(chess/,$hget(chess.info,clr_own),_queen_w.png)
+
    if ($check_square(%x+1,%y-1)) && ($in_board(%x+1,%y-1)) && (!$istok($hget(chess.info,threat_zone),$+(%y-1,%x+1),32)) { var %select = %select $draw+select(%x+1,%y-1) }
  did -g $dname 2 $+(chess/,$hget(chess.info,clr_own),_rook_w.png)
 
  did -g $dname 3 $+(chess/,$hget(chess.info,clr_own),_bishop_w.png)
 
  did -g $dname 4 $+(chess/,$hget(chess.info,clr_own),_knight_w.png)
 
}
 
 
   
 
   
 +
    ; :: RIGHT-DOWN
 +
    if ($check_square(%x+1,%y+1)) && ($in_board(%x+1,%y+1)) && (!$istok($hget(chess.info,threat_zone),$+(%y+1,%x+1),32)) { var %select = %select $draw+select(%x+1,%y+1) }
 
   
 
   
on 1:dialog:choose_piece:sclick:1,2,3,4:{
+
    ; :: Castling
  set %newpiece $+($hget(chess.info,clr_own),_,$gettok(queen rook bishop knight,$did,32))
+
    if (!$hget(chess.info,king_moved)) {
  dialog -x choose_piece
+
      var %iy = 8
}
+
      var %lxy = $+(%iy,1)
 +
      var %rxy = $+(%iy,8)
 
   
 
   
on *:close:@chess:{
+
      if ($castling_left(%lxy,%iy,%clr_own)) {  
  hfree chess.board
+
        var %select = %select $draw+select(1,%iy)
  hfree chess.info
+
        hadd chess.info castling 1
  ;hfree chess.taken
+
      }
 +
      if ($castling_right(%rxy,%iy,%clr_own)) {
 +
        var %select = %select $draw+select(8,%iy)
 +
        hadd chess.info castling 1
 +
      }     
 +
    }
 
   
 
   
  if ($sock(chess_connect)) { sockclose chess_connect }
+
    hdel chess.info threat_zone
  if ($sock(chess)) { sockclose chess }
 
}
 
 
   
 
   
;; socket part
+
    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
 +
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
 
   
 
   
  alias -l connect_dialog { noop $dialog(chess_connect,chess_connect) }
+
    return
 +
  }
 +
  }
 
   
 
   
  dialog chess_connect {
+
  alias -l kc {
   title "Create chess connection"
+
   if ($hget(chess.info,king_check)) {
  size -1 -1 275 50
+
    if ($right($hget(chess.board,$+($1,$2)),-2) != king) && ($hget(chess.board,$+($1,$2))) { return $true }
   option pixels
+
  }
 +
  elseif ($hget(chess.board,$+($1,$2))) {
 +
    return $true
 +
   }
 +
}
 
   
 
   
   text "IP", 1, 7 5 100 20
+
alias castling_left {
  text "PORT", 2, 111 5 100 20
+
   if ($hget(chess.info,clr_own) == w) {
  edit "", 3, 5 22 100 20
+
    if (!$hget(chess.info,left_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,2))) && (!$hget(chess.board,$+($2,3))) && (!$hget(chess.board,$+($2,4))) && (!$istok($hget(chess.info,threat_zone),$+($2,2),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,3),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,4),32)) && (!$hget(chess.info,check)) {
  edit "", 4, 108 22 100 20
+
      return $true
   button "connect", 5, 211 21 60 22,default
+
    }
 +
   }
 +
  else {
 +
    if (!$hget(chess.info,left_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,2))) && (!$hget(chess.board,$+($2,3))) && (!$istok($hget(chess.info,threat_zone),$+($2,2),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,3),32)) && (!$hget(chess.info,check)) {
 +
      return $true
 +
    }
 +
  }
 
  }
 
  }
 
   
 
   
  on 1:dialog:chess_connect:init:*:{
+
  alias castling_right {
   did -a $dname 3 %chess.ip
+
   if ($hget(chess.info,clr_own) == w) {
   did -a $dname 4 $iif(%chess.port,$v1,6666)
+
    if (!$hget(chess.info,right_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,6))) && (!$hget(chess.board,$+($2,7))) && (!$istok($hget(chess.info,threat_zone),$+($2,6),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,7),32)) && (!$hget(chess.info,check)) {
 +
      return $true
 +
    }
 +
  }
 +
   else {
 +
    if (!$hget(chess.info,right_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,6))) && (!$hget(chess.board,$+($2,7))) && (!$istok($hget(chess.info,threat_zone),$+($2,5),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,6),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,7),32)) && (!$hget(chess.info,check)) {
 +
      return $true
 +
    }
 +
  }
 
  }
 
  }
 
   
 
   
  on 1:dialog:chess_connect:sclick:5:{
+
;; SOCKETS, msg, notice
   set %chess.ip $did($dname,3)
+
   set %chess.port $did($dname,4)
+
#chess.n off
  dialog -x chess_connect
+
  on ^*:notice:chess_game *:?:{
  connect_to_server
+
   if ($nick == $hget(chess.info,opponent)) { parse_incoming $2- | haltdef }
 +
}
 +
on ^*:text:chess_game *:?:{
 +
   if ($nick == $hget(chess.info,opponent)) { parse_incoming $2- | haltdef }
 
  }
 
  }
 +
#chess.n end
 
   
 
   
 
  alias start_server {
 
  alias start_server {
   sockclose chess_connect
+
   if ($hget(chess.info,con_type) != irc) {
  socklisten chess_connect 6666
+
    sockclose chess_connect
 +
    socklisten chess_connect 6666
 +
    hadd chess.info init 1
 +
  }
 +
  hadd chess.info clr_own w
 +
  hadd chess.info mode mp
 +
  hadd chess.info own_turn 1
 +
  drawtext -ro @chess 16749691 verdana 22 60 $iif($hget(chess.options,size) == 100,560,380) waiting for other player...
 
  }
 
  }
 
   
 
   
Line 593: Line 1,022:
 
  }
 
  }
 
   
 
   
  alias -l chess_send { sockwrite -n chess $1- }
+
  alias -l chess_send {
 +
  if ($hget(chess.info,con_type) == irc) {
 +
    var %m = $iif($hget(chess.options,send_method),$v1,msg)
 +
    %m $hget(chess.info,opponent) chess_game $1-
 +
  }
 +
  else { sockwrite -n chess $1- }
 +
}
 
   
 
   
 
  on *:socklisten:chess_connect:{
 
  on *:socklisten:chess_connect:{
Line 602: Line 1,037:
 
  }
 
  }
 
   
 
   
  on *:sockopen:chess:{ chess_initiate | chess_send init $me }
+
  on *:sockopen:chess:{  
 +
  chess_initiate  
 +
  chess_send init $me  
 +
}
 
   
 
   
 
  on *:sockread:chess:{  
 
  on *:sockread:chess:{  
 
   var %t
 
   var %t
 
   sockread %t  
 
   sockread %t  
 +
  parse_incoming %t
 +
}
 
   
 
   
   if ($gettok(%t,1,32) == init) {  
+
on *:sockclose:chess:{
     hadd chess.info opponent $gettok(%t,2,32)
+
  print_info red $hget(chess.info,opponent) disconnected.
     if (!$hget(chess.info,own_turn)) { print_info light_blue $gettok(%t,2,32) starts. }
+
}
 +
 +
alias -l parse_incoming {
 +
   if ($active != chess) && ($1 != cmsg) { flash @chess | titlebar @chess your turn! }
 +
  tokenize 32 $1-
 +
 +
  if ($1 == init) {  
 +
     hadd chess.info opponent $2
 +
     if (!$hget(chess.info,own_turn)) { print_info light_blue $2 starts. }
 +
    if ($hget(chess.info,con_type) == irc) && (!$hget(chess.info,init)) {
 +
      hadd chess.info init 1     
 +
      chess_initiate
 +
      print_info light_blue You start.
 +
      chess_send init $me
 +
    }
 
   }
 
   }
   elseif ($gettok(%t,1,32) == move) {  
+
   elseif ($1 == move) {  
 
     hadd chess.info own_turn 1  
 
     hadd chess.info own_turn 1  
     var %last.xy = $gettok(%t,2,32)
+
    hadd chess.info opponent_move 1
 +
 +
     var %last.xy = $2
 
     var %last.x = $mid(%last.xy,2,1)
 
     var %last.x = $mid(%last.xy,2,1)
     var %last.y = $mid(%last.xy,1,1)
+
     var %last.y = $mid(%last.xy,1,1)  
 
   
 
   
     var %xy = $gettok(%t,3,32)
+
     var %xy = $3
 
     var %x = $mid(%xy,2,1)
 
     var %x = $mid(%xy,2,1)
 
     var %y = $mid(%xy,1,1)
 
     var %y = $mid(%xy,1,1)
 
   
 
   
     drawrect -rf @chess $get_color(%last.x,%last.y) 0 $get_square(%last.x) $get_square(%last.y) 100 100
+
     drawrect -rf @chess $get_color(%last.x,%last.y) 0 $get_square(%last.x) $get_square(%last.y) $hget(chess.options,size) $hget(chess.options,size)
 
     if ($hget(chess.board,%last.xy)) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
 
     if ($hget(chess.board,%last.xy)) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
     noop $chess_move(%last.xy,->,%xy)
+
     print_info light_blue Your turn.
 +
    if ($hget(chess.board,%xy)) { hadd chess.info take 1 }
 +
    .echo -gq $chess_move(%last.xy,->,%xy)
 
     draw_selection %last.x %last.y light_blue
 
     draw_selection %last.x %last.y light_blue
 
     draw_selection %x %y yellow
 
     draw_selection %x %y yellow
 
     .timerclrlast $+ %xy 1 5 clear_selections %last.xy %xy
 
     .timerclrlast $+ %xy 1 5 clear_selections %last.xy %xy
    print_info light_blue Your turn.
 
 
   }  
 
   }  
   elseif ($gettok(%t,1,32) == load) {
+
   elseif ($1 == load) {
     print_info light_blue $hget(chess.info,opponent) loaded a game: $gettok(%t,2,32) with $gettok(%t,3,32)
+
     print_info light_blue $hget(chess.info,opponent) loaded a game: $2 with $3
 +
  }
 +
  elseif ($1 == cmsg) {
 +
    print_info yellow msg: $2-
 +
  }
 +
  elseif ($1 == disconnect) {
 +
    print_info red $hget(chess.info,opponent) disconnected.
 
   }
 
   }
   elseif ($gettok(%t,1,32) == switch) {  
+
   elseif ($1 == switch) {
     switch_piece $gettok(%t,2,32) $gettok(%t,3,32) $gettok(%t,4,32)
+
     hadd chess.info opponent_move 1
     clear_selections $gettok(%t,4,32)
+
    print_info light_blue Your turn.
 +
    if ($hget(chess.board,$4)) { hadd chess.info take 1 }
 +
    switch_piece $2-4
 +
     clear_selections $4
 
     hadd chess.info own_turn 1
 
     hadd chess.info own_turn 1
 +
  }
 +
  elseif ($1 == castling) {
 
     print_info light_blue Your turn.
 
     print_info light_blue Your turn.
 +
    hadd chess.info opponent_move 1
 +
    chess_castling $2-4 1
 +
    hadd chess.info own_turn 1
 +
  }
 +
}
 +
 +
; LOGGING
 +
 +
 +
alias -l log_show {
 +
  window -C @chess $window(@chess).x $window(@chess).y $calc($window(@chess).w $1) $window(@chess).h
 +
}
 +
 +
alias -l chess_log {
 +
  if ($2 != 0-0) && ($2 != 0-0-0) {
 +
    var %x.from = $mid($2,2,1)
 +
    var %x.to = $mid($3,2,1)
 +
    var %y.from = $mid($2,1,1)
 +
    var %y.to = $mid($3,1,1)
 +
 +
    if ($hget(chess.info,clr_own) == w) {
 +
      var %y.from = $calc(9 - %y.from)
 +
      var %y.to = $calc(9 - %y.to)
 +
    }
 +
    else {
 +
      var %x.from = $calc(9 - %x.from)
 +
      var %x.to = $calc(9 - %x.to)
 +
    }
 +
 +
    var %x.from = $gettok(a b c d e f g h,%x.from,32)
 +
    var %x.to = $gettok(a b c d e f g h,%x.to,32)
 +
 +
    var %from = $+(%x.from,%y.from)
 +
    var %to = $+(%x.to,%y.to)
 +
    var %p = $replace($4,pawn,P,king,K,queen,Q,knight,N,bishop,B,rook,R)
 +
    if ($hget(chess.options,log_format) == 1) { var %l = $+(%p,%from,$iif((x isin $5) || ($hget(chess.info,log_ep)),x,-),%to,$iif(s isin $5,$replace($6,pawn,P,king,K,queen,Q,knight,N,bishop,B,rook,R))) $+ $remove($5,x,s) $iif($hget(chess.info,log_ep),e.p.) }
 +
    else { var %l = %p $upper(%from) $+ -> $+ $upper(%to) $iif(s isin $5,$replace($6,pawn,P,king,K,queen,Q,knight,N,bishop,B,rook,R))) $iif((x isin $5) || ($hget(chess.info,log_ep)),take) $replace($remove($5,x,s),+,check) $iif($hget(chess.info,log_ep),e.p.)  } 
 +
  }
 +
 +
  else { var %l = $2 $+ $3 }
 +
  print_last_move light_blue %l
 +
  print_log $iif($1 == w,white,light_blue) %l
 +
}
 +
 +
alias -l print_last_move {
 +
  var %z = $width($2-,courier new,16)
 +
  var %y = $calc($iif($hget(chess.options,size) == 100,820,500) - %z)
 +
  drawrect -rf @chess 3684408 0 $iif($hget(chess.options,size) == 100,600,280) $iif($hget(chess.options,size) == 100,825,505) 225 20 | drawtext -ro @chess $clr_replace($1) "Courier New" 16 %y $iif($hget(chess.options,size) ==
 +
100,825,505) $2-
 +
}
 +
 +
alias -l print_log {
 +
  write chess\temp.log $1-
 +
  if (!$hget(chess.info,log_shown)) { return }
 +
  hinc chess.info log_lines
 +
  var %l = $hget(chess.info,log_lines)
 +
  if (%l > $iif($hget(chess.options,size) == 100,40,24)) { drawscroll @chess 0 -20 $iif($hget(chess.options,size) == 100,840,520) 20 200 $iif($hget(chess.options,size) == 100,840,520) }
 +
 +
  drawtext -ro @chess $clr_replace($1) "Courier New" 16 $iif($hget(chess.options,size) == 100,840,520) $calc(0+(20 * $iif(%l <= $iif($hget(chess.options,size) == 100,40,24),%l,$v2) )) $2-
 +
}
 +
 +
alias -l filter_log {
 +
  tokenize 32 $1
 +
  hinc chess.info log_lines
 +
  var %l = $hget(chess.info,log_lines)
 +
 +
  if (%l > $iif($hget(chess.options,size) == 100,40,24)) { drawscroll @chess 0 -20 $iif($hget(chess.options,size) == 100,840,520) 20 200 $iif($hget(chess.options,size) == 100,840,520) }
 +
 +
  drawtext -ro @chess $clr_replace($1) "Courier New" 16 $iif($hget(chess.options,size) == 100,840,520) $calc(0+(20 * $iif(%l <= $iif($hget(chess.options,size) == 100,40,24),%l,$v2) )) $2-
 +
}
 +
 +
alias -l log_save {
 +
  var %f = $+(chess/,$asctime(yyyy-mm-dd-hhnnss),-,$iif($hget(chess.info,mode) == sp,singleplayer,$hget(chess.info,opponent)),.log)
 +
  filter -ff chess\temp.log %f
 +
}
 +
 +
; DIALOGS
 +
 +
 +
alias -l connect_dialog { .echo -gq $$dialog(chess_connect,chess_connect) }
 +
 +
dialog -l chess_connect {
 +
  title "Create chess connection"
 +
  size -1 -1 275 70
 +
  option pixels
 +
 +
  tab "Sockets",  11, -1 -1 277 202
 +
  tab "IRC", 12, -1 -1 277 202
 +
 +
  text "IP", 1, 7 25 100 20, tab11
 +
  text "PORT", 2, 111 25 100 20, tab11
 +
  edit "", 3, 5 42 100 20, tab11
 +
  edit "", 4, 108 42 100 20, tab11
 +
  button "connect", 5, 211 41 60 22,default
 +
 +
 +
  text "IRC-nick to connect to", 8, 7 25 150 20, tab12
 +
  edit "", 9, 5 42 100 20 , tab12
 +
}
 +
 +
on 1:dialog:chess_connect:init:*:{
 +
  did -a $dname 3 %chess.ip
 +
  did -a $dname 4 $iif(%chess.port,$v1,6666)
 +
}
 +
 +
on 1:dialog:chess_connect:sclick:5:{
 +
  if ($dialog($dname).tab == 11) {
 +
    set %chess.ip $did($dname,3)
 +
    set %chess.port $did($dname,4)
 +
    hadd chess.info init 1 | hadd chess.info clr_own b | hadd chess.info mode mp | hadd chess.info last_moved b
 +
    dialog -x chess_connect
 +
    connect_to_server
 
   }
 
   }
 +
  else {
 +
    hadd chess.info init 1 | hadd chess.info clr_own b | hadd chess.info mode mp | hadd chess.info last_moved b | hadd chess.info opponent $did($dname,9)
 +
    dialog -x chess_connect
 +
    hadd chess.info con_type irc
 +
    chess_send init $me
 +
    chess_initiate
 +
    .enable #chess.n
 +
  }
 +
}
 +
 +
dialog -l chess_send_pm {
 +
  title "Send a message"
 +
  size -1 -1 275 50
 +
  option pixels
 +
 +
  text "", 1, 7 5 250 20,
 +
  edit "", 2, 5 25 200 20,
 +
  button "send" 3, 211 25 60 22,default
 +
}
 +
 +
on 1:dialog:chess_send_pm:init:*:{
 +
  did -a $dname 1 Send a message to $hget(chess.info,opponent)
 +
}
 +
 +
on 1:dialog:chess_send_pm:sclick:3:{
 +
  dialog -x chess_send_pm
 +
  chess_send cmsg $did($dname,2)
 +
}
 +
 +
dialog -l chess_getimg {
 +
  title "Missing files"
 +
  size -1 -1 275 70
 +
  option pixels
 +
 +
  text "The file pieces.png doesn't seem to exist in your chess-directory, download it?", 1, 7 5 270 30,
 +
  text "", 2, 7 50 250 20
 +
  button "download" 3, 211 45 60 22,default
 +
}
 +
 +
on 1:dialog:chess_getimg:sclick:3:{
 +
  if (!$hget(chess.info,retry)) { getimg | did -ra $dname 2 downloading... }
 +
  elseif ($hget(chess.info,retry) < 5) { getimg }
 +
  else { dialog -x $dname }
 +
}
 +
 +
alias -l server_dialog { .echo -gq $$dialog(chess_server,chess_server) }
 +
 +
dialog -l chess_server {
 +
  title "Start a chess server"
 +
  size -1 -1 275 70
 +
  option pixels
 +
 +
  tab "Sockets",  11, -1 -1 277 202
 +
  tab "IRC", 12, -1 -1 277 202
 +
 +
  text "Start a socket connection", 1, 7 25 200 20, tab11
 +
  button "start", 2, 5 41 60 22,default tab11
 +
 +
  text "Wait for a connection from nick...", 3, 7 25 200 20, tab12
 +
  edit "", 4, 5 42 100 20 , tab12
 +
  button "start", 5, 108 41 60 22,default tab12
 
  }
 
  }
 
   
 
   
  on *:sockclose:chess:{
+
on 1:dialog:chess_server:init:*:{
   print_info red $hget(chess.info,opponent) disconnected.
+
  did -a $dname 4 $iif(%chess.nick,$v1)
 +
}
 +
 +
on 1:dialog:chess_server:sclick:2:{
 +
  start_server
 +
  dialog -x $dname
 +
}
 +
 +
on 1:dialog:chess_server:sclick:5:{
 +
  hadd chess.info con_type irc
 +
  hadd chess.info opponent $did($dname,4)
 +
  .enable #chess.n
 +
  start_server
 +
  set %chess.nick $did($dname,4)
 +
  dialog -x $dname
 +
}
 +
 +
dialog choose_piece {
 +
  title "Chess - choose new piece"
 +
  size -1 -1 422 130
 +
  option pixels
 +
 +
  text "Select a new piece.",5, 7 5 417 20
 +
  button "Queen" 1, 5 25 100 100
 +
  button "Rook" 2, 108 25 100 100
 +
  button "Bishop" 3, 211 25 100 100
 +
  button "Knight" 4, 314 25 100 100
 +
}
 +
 +
on 1:dialog:choose_piece:sclick:1,2,3,4:{
 +
  set %newpiece $+($hget(chess.info,clr_own),_,$gettok(queen rook bishop knight,$did,32))
 +
  dialog -x choose_piece
 +
}
 +
 +
dialog -l chess_options {
 +
  title "Chess options"
 +
  size -1 -1 400 400
 +
  option pixels
 +
 +
  text "Logging format", 1, 7 8 100 20
 +
  combo 2, 110 5 200 20,drop
 +
 +
  text "Square size (pixels)", 3, 7 30 100 20
 +
  combo 4, 110 27 200 20,drop
 +
 +
  text "IRC send method", 5, 7 52 100 20
 +
  combo 6, 110 49 200 20,drop
 +
 +
  text "Selection frames", 7, 7 74 100 20
 +
  check "" 8, 110 71 20 20,
 +
 +
  button "save", 10, 330 370 60 22,ok
 +
}
 +
 +
on 1:dialog:chess_options:init:*:{
 +
  did -a $dname 2 International (Pe2xf1Q+)
 +
  did -a $dname 2 New (P E2->F1 Q take+check)
 +
  did -c $dname 2 $iif($hget(chess.options,log_format),$v1,1)
 +
 +
  did -a $dname 4 100
 +
  did -a $dname 4 60
 +
  did -c $dname 4 $iif($hget(chess.options,size) == 100,1,2)
 +
 +
  did -a $dname 6 msg
 +
  did -a $dname 6 notice
 +
  did -c $dname 6 $iif($hget(chess.options,send_method) == msg,1,2)
 +
 +
  if ($hget(chess.options,frames)) { did -c $dname 8 }
 +
}
 +
 +
on 1:dialog:chess_options:sclick:10:{
 +
  hadd chess.options log_format $did($dname,2).sel
 +
  if ($did($dname,4).seltext != $hget(chess.options,size)) { hadd chess.options size $did($dname,4).seltext | .timerrestart 1 0 chess_restart }
 +
  if ($did($dname,8).state == 1) { hadd chess.options frames 1 }
 +
  else { hdel chess.options frames }
 +
  hadd chess.options send_method $did($dname,6)
 +
 +
  hsave chess.options chess/options.hsh
 +
}
 +
 +
; FETCH IMAGE
 +
alias getimg {
 +
  if (!$exists(chess)) { mkdir chess }
 +
  .remove $qt($mircdirchess/pieces.png)
 +
  sockclose getimg
 +
  sockopen getimg lost.kapsi.fi 80
 +
}
 +
on *:sockopen:getimg:{
 +
  sockwrite -nt getimg GET /cail/pieces.png HTTP/1.1
 +
  sockwrite -nt getimg Host: lost.kapsi.fi
 +
  sockwrite -nt getimg Connection: close
 +
  sockwrite -nt getimg $crlf
 +
}
 +
on *:sockread:getimg:{
 +
  if (!$sock(getimg).mark) {
 +
    var %t
 +
    sockread %t
 +
    if ($gettok(%t,1,32) == Content-Length:) { var %content_len = $gettok(%t,2,32) }
 +
  }
 +
  if (!%t) { sockmark getimg $iif(%content_len,$v1,1) }
 +
  if ($sock(getimg).mark) {
 +
    sockread -f &img
 +
    bwrite $qt($mircdirchess/pieces.png) -1 &img
 +
  }
 +
}
 +
  on *:sockclose:getimg:{  
 +
   if ($file($qt($mircdirchess/pieces.png)) == $sock(getimg).mark) || ($sock(getimg).mark == 1) { dialog -x chess_getimg }
 +
  elseif ($hget(chess.info,retry) <= 5) { hinc chess.info retry | did chess_getimg 2 Error, trying again... ( $+ $hget(chess.info,retry) $+ ) | .remove $qt($mircdirchess/pieces.png) | getimg }
 +
  else { did chess_getimg 2 5 retries gone, try again later }
 +
  unset %content_len
 
  }
 
  }
 +
  
 
== Help ==
 
== Help ==
a
+
 
 +
=== The game ===
 +
 
 +
Singleplayer mode is only for debugging and testing, not actually to play.
 +
This game is meant to be played as multiplayer, where other player starts a server (whites),
 +
and other connects to this server (blacks)
 +
 
 +
=== Server and connecting ===
 +
 
 +
Two connection types are available, sockets and through IRC with /notice or /msg
 +
Connection type must be same on both players, the one starting a server must start a server using sockets
 +
(default), or from server dialog select IRC and input the other players nick (in active server connection)
 +
 
 +
The connecting player must then select the same connection method from the connect dialog, and input
 +
the servers IP (sockets) or NICK (IRC),
 +
note that the same PORT must be used on both clients.
 +
 
 +
=== Implemented rules === (read more about the rules from wikipedia)
 +
 
 +
All the pieces move correctly, and you cannot make a move that wouldn't go by the rules.
 +
Pawn can perform en passant move, and if advanced to the 8th rank (other side of the board), it gets promoted to queen,rook,bishop,knight of the same color.
 +
King and rook can perform castling move, if all the requirements are met, selecting king will highlight the rook, if then clicked on the rook, the castling is performed.
 +
IF king is in check, the game will show the selectiong borders in squares you cannot move, but won't let you move there if you try.
 +
 
 +
=== Mouse & menus ===
 +
 
 +
You select pieces by clicking them, and move them by clicking on the target square, clicking the selected piece will de-select it.
 +
You'll find last move from bottom right hand side of the board, clicking it will append the log-window on the right side, where you will see
 +
40 (with 100px squares) or 24 (60px squares) last moves, doubleclicking a move in the log-window will highlight the move on the board.
 +
Right clicking anywhere brings you a popup-menu, where you will always find options and help, if in game, also save & load are in this menu.
 +
If in multiplayer mode, there's also "send msg", from where you can send a message to other players infobar (bottom left hand side on the board).
 +
Right clicking on the log menu let's you save the log.
 +
 
 +
=== Saving & loading ===
 +
 
 +
You can save and load your gamestate, the game will create 2 files into your /chess-folder
 +
YYYY-MM-DD-HHNNSS_board_OPPONENTSNAME.save and YYYY-MM-DD-HHNNSS_info_OPPONENTSNAME.save
 +
There will be notification for you, if the opponent loads a game, telling you what game he/she loaded.
 +
 
 +
=== Options ===
 +
 
 +
Logging format: let's you choose the logging format between "International (Pe2xf1Q+)" and "New (P E2->F1 Q take+check)"
 +
Square size: Width & height of the squares in the board in pixels.
 +
IRC send method: Uses /msg OPPONENT or /notice OPPONENT to send information if connected via IRC.
 +
Selection frames: Switch on/off showing of the borders in squares where you can move.
 +
 
 
[[Category:Script_Archive]]
 
[[Category:Script_Archive]]

Latest revision as of 22:34, 11 February 2020

Screenshot of the gameplay

Source

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; 
; Chess game with picture windows by Cail at Quakenet -> #help.script
;
; The singleplayer mode is only for debugging and testing.
; Multiplayer was the main idea, you can use sockets or IRC to play (read help).
; The game will download the pieces automatically and put them into right place, 
; If you are experiencing problems with the game's download, get the image from: http://lost.kapsi.fi/cail/pieces.png 
; (images originally from mediawiki, by Wapcaplet) and put them into /mircdir/chess directory.
;
; Type /chess to start the game.
; Also support saving and loading the game state.
; Includes logging of moves, shows last move all the time, and last 40/24 moves in a sidepanel, which can be toggled on/off.
;
; Be sure to read the help for full description of all features.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

alias chess {
  if ($hget(chess.board))    { hfree chess.board } | hmake chess.board 100
  if ($hget(chess.info))     { hfree chess.info } | hmake chess.info 100
  if ($hget(chess.options))  { hfree chess.options } | hmake chess.options 100
  if ($exists(chess/options.hsh)) { hload chess.options chess/options.hsh }
  else {
    hadd chess.options size 100
    hadd chess.options log_format 1
    hadd chess.options send_method msg
    hadd chess.options frames 1
  }

  window -adfpw0C +nft @chess 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +50) 
  drawrect -rf @chess 3684408 0 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +50)

  log_show -200
  hadd chess.info log_lines 0

  drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,320,140) 300 50
  drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,380,200) 300 50
  drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,440,260) 300 50
  drawrect -r @chess 65280 1 60 $iif($hget(chess.options,size) == 100,500,320) 300 50

  drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,330,150) single player (debug)
  drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,390,210) connect to a server
  drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,450,270) start a server
  drawtext -ro @chess 16749691 verdana 22 70 $iif($hget(chess.options,size) == 100,510,330) help 

  if (!$exists($qt($mircdirchess/pieces.png))) { .echo -qg $dialog(chess_getimg,chess_getimg) }
}

menu @chess {
  sclick: chess_sclick
  dclick: chess_dclick
  options:.echo -qg $dialog(chess_options,chess_options)
  help:url -n http://wiki.prco23.org/index.php/Chess_game#Help
  $iif($hget(chess.info,init),save):chess_save
  $iif($hget(chess.info,init),load):chess_load $$dialog(load_table,load_table)
  $iif($hget(chess.info,mode) == mp,send msg):.echo -qg $dialog(chess_send_pm,chess_send_pm)

  $iif($inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,840,520),20,200,$iif($hget(chess.options,size) == 100,840,520)),-)
  $iif($inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,840,520),20,200,$iif($hget(chess.options,size) == 100,840,520)),save log):log_save
}

on *:close:@chess:{
  hfree chess.board
  hfree chess.info
  hfree chess.options 

  if ($exists(chess/temp.log)) { .remove chess/temp.log }
  if ($sock(chess_connect)) { sockclose chess_connect }
  if ($sock(chess)) { sockclose chess }

  if ($hget(chess.info,con_type) == irc) { chess_send disconnect | .disable #chess.n }
}

on *:active:@chess:{ titlebar @chess }

dialog load_table {
  title "Chess"
  size -1 -1 422 220
  option pixels

  text "Select a saved game.", 1, 7 5 417 20,result
  list 2, 5 25 410 200, sort
  button "", 3, -20 -20 1 1, ok
}

on 1:dialog:load_table:init:*:{
  .echo -qg $findfile(chess,*board*.save,0,parse_save $1-)
} 

alias -l parse_save {
  .echo -qg $regex($1-,/\\([^\\]+)_board_(.+)\.save/g) 
  var %s = $gettok($regml(1),-1,45)
  did -a $dname 2 $gettok($regml(1),-4--2,45) $+($mid(%s,1,2),:,$mid(%s,3,2),:,$mid(%s,5,2)) - $regml(2)
}

on 1:dialog:load_table:dclick:2:{
  did -ra $dname 1 $did($dname,2).seltext 
  dialog -k $dname
}

alias chess_restart {
  hadd chess.info restart 1
  window -c @chess
  window -adfpw0C +nft @chess 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +60) 
  drawrect -rf @chess 3684408 0 0 0 $calc(($hget(chess.options,size) *8) +240) $calc(($hget(chess.options,size) *8) +60)
  drawrect -r @chess 22456 3 17 17 $iif($hget(chess.options,size) == 100,806,486) $iif($hget(chess.options,size) == 100,806,486)

  hadd chess.info log_lines 0
  if ($exists(chess/temp.log)) { filter -fk chess/temp.log filter_log * }
  hdel chess.info log_shown
  hdel chess.info log_show
  log_show -200

  chess_load
  hdel chess.info restart
}

alias -l chess_load {
  if (!$hget(chess.info,restart)) {
    hdel -w chess.board *
    hdel -w chess.info *
    hload chess.board $+(chess\,$+($1,-,$remove($2,:)),_board_,$4,.save)
    hload chess.info $+(chess\,$+($1,-,$remove($2,:)),_info_,$4,.save)
  }
  var %y = 1
  while (%y <= 8) {
    var %x = 1
    while (%x <= 8) {
      var %dx = $get_square(%x)
      var %dy = $get_square(%y)
      drawrect -rf @chess $get_color(%x,%y) 0 %dx %dy $hget(chess.options,size) $hget(chess.options,size)
      if ($hget(chess.board,$+(%y,%x))) { draw_piece %dx %dy $v1 $get_color(%x,%y) }

      var %alph = $gettok(A B C D E F G H I J K L M,$iif($hget(chess.info,clr_own) == w,%x,$calc(9 - %x)),32)
      var %xz = $calc((($hget(chess.options,size) * %x) + ($hget(chess.options,size)/2+15)) - $hget(chess.options,size))
      drawtext -ro @chess 16749691 verdana 16 %xz 0 %alph

      inc %x
    }  

    var %yz = $calc((($hget(chess.options,size) * %y) + ($hget(chess.options,size)/2+10)) - $hget(chess.options,size))
    drawtext -ro @chess 16749691 verdana 16 5 %yz $iif($hget(chess.info,clr_own) == w,$calc(9 - %y),%y)

    inc %y
  }

  if ($hget(chess.info,mode) == mp) && (!$hget(chess.info,restart)) {
    chess_send load $1 $3
    if ($hget(chess.info,own_turn)) { print_info light_blue Game loaded succesfully, your turn. }
    else { print_info light_blue Game loaded succesfully, $hget(chess.info,opponent) $+ 's turn. }
  }
}

alias -l chess_save {
  hsave chess.board $+(chess/,$asctime(yyyy-mm-dd-hhnnss),_board_,$iif($hget(chess.info,mode) == sp,singleplayer,$hget(chess.info,opponent)),.save)
  hsave chess.info $+(chess/,$asctime(yyyy-mm-dd-hhnnss),_info_,$iif($hget(chess.info,mode) == sp,singleplayer,$hget(chess.info,opponent)),.save)
}

alias -l chess_initiate {
  drawrect -r @chess 22456 3 17 17 $iif($hget(chess.options,size) == 100,806,486) $iif($hget(chess.options,size) == 100,806,486)
  hadd chess.info clr_select blue

  var %y = 1
  while (%y <= 8) {
    var %x = 1
    while (%x <= 8) {
      var %dx = $get_square(%x)
      var %dy = $get_square(%y)
      drawrect -rf @chess $get_color(%x,%y) 0 %dx %dy $hget(chess.options,size) $hget(chess.options,size)
      if ($get_piece(%y,%x)) { hadd chess.board $+(%y,%x) $v1 | draw_piece %dx %dy $v1 $get_color(%x,%y) }

      var %alph = $gettok(A B C D E F G H I J K L M,$iif($hget(chess.info,clr_own) == w,%x,$calc(9 - %x)),32)
      var %xz = $calc((($hget(chess.options,size) * %x) + ($hget(chess.options,size)/2+15)) - $hget(chess.options,size))
      drawtext -ro @chess 16749691 verdana 16 %xz 0 %alph

      inc %x
    }  

    var %yz = $calc((($hget(chess.options,size) * %y) + ($hget(chess.options,size)/2+10)) - $hget(chess.options,size))
    drawtext -ro @chess 16749691 verdana 16 5 %yz $iif($hget(chess.info,clr_own) == w,$calc(9 - %y),%y)

    inc %y  
  }
}

alias -l chess_dclick {
  if (!$inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,840,520),20,200,$iif($hget(chess.options,size) == 100,840,520))) { return }
  var %n = $calc($hget(chess.info,log_lines) - $iif($hget(chess.options,size) == 100,40,24))
  var %n = $calc($abs(%n) %n)

  var %log_line = $read(chess/temp.log,$calc($left($calc(($mouse.y *100) /20),-2) + %n))
  var %clr = $iif($gettok(%log_line,1,32) == white,w,b)

  if ($gettok(%log_line,2,32) == 0-0) {
    var %f.y = $iif($gettok(%log_line,1,32) == light_blue,8,1)

    if ($hget(chess.info,clr_own) == w) {
      var %f.y = $calc(9 - %f.y)
    }

    var %x1 = $iif($hget(chess.info,clr_own) == w,5,1)
    var %x2 = $iif($hget(chess.info,clr_own) == w,8,4)
    var %x3 = $iif($hget(chess.info,clr_own) == w,6,2)
    var %x4 = $iif($hget(chess.info,clr_own) == w,7,3)

    draw_selection %x1 %f.y light_blue
    draw_selection %x2 %f.y light_blue
    draw_selection %x3 %f.y yellow
    draw_selection %x4 %f.y yellow
    hadd chess.info log_select $+(%f.y,%x1) $+(%f.y,%x2) $+(%f.y,%x3) $+(%f.y,%x4)
  }
  elseif ($gettok(%log_line,2,32) == 0-0-0) {
    var %f.y = $iif($gettok(%log_line,1,32) == light_blue,8,1)

    if ($hget(chess.info,clr_own) == w) {
      var %f.y = $calc(9 - %f.y)
    }

    var %x1 = $iif($hget(chess.info,clr_own) == w,5,4)
    var %x2 = $iif($hget(chess.info,clr_own) == w,1,8)
    var %x3 = $iif($hget(chess.info,clr_own) == w,3,5)
    var %x4 = $iif($hget(chess.info,clr_own) == w,4,6)

    draw_selection %x1 %f.y light_blue
    draw_selection %x2 %f.y light_blue
    draw_selection %x3 %f.y yellow
    draw_selection %x4 %f.y yellow
    hadd chess.info log_select $+(%f.y,%x1) $+(%f.y,%x2) $+(%f.y,%x3) $+(%f.y,%x4)
  }
  else {
    if ($hget(chess.options,log_format) == 1) {
      var %move = $gettok(%log_line,2,32)
      var %from = $replace($mid(%move,2,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
      var %to = $replace($mid(%move,5,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
    }
    else {
      var %move = $gettok(%log_line,3,32)
      var %from = $replace($mid(%move,1,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
      var %to = $replace($mid(%move,5,2),a,1,b,2,c,3,d,4,e,5,f,6,g,7,h,8)
    }
    var %from.x = $mid(%from,1,1)
    var %from.y = $mid(%from,2,1)
    var %to.x = $mid(%to,1,1)
    var %to.y = $mid(%to,2,1)

    if ($hget(chess.info,clr_own) == w) {
      var %from.y = $calc(9 - %from.y)
      var %to.y = $calc(9 - %to.y)
    }
    else {
      var %from.x = $calc(9 - %from.x)
      var %to.x = $calc(9 - %to.x)
    }

    draw_selection %from.x %from.y light_blue
    draw_selection %to.x %to.y yellow
    hadd chess.info log_select $+(%from.y,%from.x) $+(%to.y,%to.x)  
  }
}

alias -l chess_sclick {
  if ($hget(chess.info,log_select)) { clear_selections $v1 | hdel chess.info log_select }

  if (!$hget(chess.info,init)) {  

    ; SELECT: single player
    if ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,320,140),300,50)) { 
      hadd chess.info init 1 | hadd chess.info clr_own w | hadd chess.info mode sp 
      chess_initiate 
    }   
    ; SELECT: connect to a server
    elseif ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,380,200),300,50)) { 
      connect_dialog
    }
    ; SELECT: start a server
    elseif ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,440,260),300,50)) { 
      server_dialog
    } 
    ; SELECT: help
    elseif ($inrect($mouse.x,$mouse.y,60,$iif($hget(chess.options,size) == 100,500,310),300,50)) { 
      url -n http://wiki.prco23.org/index.php/Chess_game#Help
    } 
    return 
  }
  ; OPEN: log-window
  elseif ($inrect($mouse.x,$mouse.y,$iif($hget(chess.options,size) == 100,700,380),$iif($hget(chess.options,size) == 100,820,510),125,40)) {
    if ($hget(chess.info,log_show)) { hdel chess.info log_show | log_show $iif(($hget(chess.options,log_format) == 1),-120,-220) }
    else { hadd chess.info log_show 1 | log_show $iif(($hget(chess.options,log_format) == 1),+120,+220) }

    if (!$hget(chess.info,log_shown)) { 
      hadd chess.info log_shown 1
      if ($exists(chess/temp.log)) { filter -fk chess/temp.log filter_log * }
    }
  }

  if ($hget(chess.info,mode) == mp) && (!$hget(chess.info,own_turn)) { return }
  if ($hget(chess.info,mode) == sp) { var %clr_own = $iif($hget(chess.info,last_moved) == w,b,w) | hadd chess.info clr_own %clr_own }
  else { var %clr_own = $hget(chess.info,clr_own) }

  var %x = $iif($hget(chess.options,size) == 100,$left($calc($mouse.x -20+100),1),$left($calc(((($mouse.x -20) /60) * 100) +100),1))
  var %y = $iif($hget(chess.options,size) == 100,$left($calc($mouse.y -20+100),1),$left($calc(((($mouse.y -20) /60) * 100) +100),1))

  var %xy = $+(%y,%x)
  var %clr_selected = $left($hget(chess.board,%xy),1)
  var %clr_moved = $hget(chess.info,clr_moved)

  var %last.x = $hget(chess.info,last.x)
  var %last.y = $hget(chess.info,last.y)
  var %last.xy = $+(%last.y,%last.x)
  var %y-1 = $iif($hget(chess.info,clr_own) == w,$fw(%y,1,%clr_moved),$bw(%y,1,%clr_moved))
  var %xy-1 = $+(%y-1,%x)

  var %y2 = $calc(9 - %y)
  var %x2 = $calc(9 - %x)
  var %xy2 = $+(%y2,%x2)
  var %last.x2 = $calc(9 - $hget(chess.info,last.x))
  var %last.y2 = $calc(9 - $hget(chess.info,last.y))
  var %last.xy2 = $+(%last.y2,%last.x2)

  var %is_last = $iif((%x == %last.x) && (%y == %last.y),$true,$false)
  var %current_selections = $hget(chess.info,current_selections)
  var %selected = $hget(chess.info,selected)

  if (!%selected) && (%clr_selected != %clr_own) && ($hget(chess.board,%xy)) { return }
  elseif (%selected) && (%clr_selected == %clr_own) {
    clear_selections %last.xy %current_selections | hdel chess.info selected | hdel chess.info current_selections
    if (%is_last) { hdel chess.info castling | return } 
    if ($hget(chess.info,castling)) { chess_castling %last.xy %xy $hget(chess.info,clr_own) | return }
    hdel chess.info castling
  }
  elseif (!$hget(chess.board,%xy) && !$hget(chess.info,selected)) { return }
  elseif (!$istok(%current_selections,%xy,32)) && (%current_selections) { return }

  ; a piece is selected, and moveable
  if ($hget(chess.info,selected)) {
    hadd chess.info last_moved %clr_own

    if ($hget(chess.info,en_passant) == %xy-1) && ($left($hget(chess.board,%xy-1),1) != %clr_own) { 
      hadd chess.info log_ep 1
      hdel chess.board %xy-1 
      drawrect -rf @chess $get_color(%x,%y-1) 0 $get_square(%x) $get_square(%y-1) $hget(chess.options,size) $hget(chess.options,size)
    }
    hdel chess.info en_passant
    hdel chess.info check

    drawrect -rf @chess $get_color(%last.x,%last.y) 0 $get_square(%last.x) $get_square(%last.y) $hget(chess.options,size) $hget(chess.options,size)
    if ($hget(chess.board,%last.xy)) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
    if ($hget(chess.board,%xy)) { hadd chess.info take $v1 }
    .echo -qg $chess_move(%last.xy,->,%xy)
    clear_selections %current_selections %last.xy
    hdel chess.info selected
    hdel chess.info current_selections

    if ($hget(chess.info,mode) == mp) && (!$hget(chess.info,king_in_danger)) {
      if (!$hget(chess.info,just_switched)) { chess_send move %last.xy2 %xy2 }
      print_info light_blue $hget(chess.info,opponent) $+ 's turn
      hdel chess.info own_turn
    }
    hdel chess.info just_switched  
    hdel chess.info king_in_danger
  }

  ; nothing selected, so we're selecting a piece
  else {
    var %piece = $hget(chess.board,%xy)
    draw_selection %x %y green
    hadd chess.info selected 1
    chess_piece_options %piece %x %y
  }

  hadd chess.info clr_moved %clr_selected
  hadd chess.info last.x %x
  hadd chess.info last.y %y
}

alias -l draw_piece {
  var %y = $calc((($replace($left($3,1),w,1,b,3) + $iif($4 == 10407679,0,1)) *100) -100) 
  var %x = $calc($replace($right($3,-2),pawn,0,rook,1,knight,2,bishop,3,queen,4,king,5) *100)
  drawpic -cms @chess $1 $2 $hget(chess.options,size) $hget(chess.options,size) %x %y 100 100 $qt($mircdirchess/pieces.png)
}

alias -l draw_selection {
  if ($3 == red) && (!$hget(chess.options,frames)) { return }
  drawrect -r @chess $clr_replace($3) 3 $calc($get_square($1) +1) $calc($get_square($2) +1) $calc($hget(chess.options,size) -2) $calc($hget(chess.options,size) -2)
}

alias -l chess_move {
  var %piece = $hget(chess.board,$1)
  var %move_len = $abs($calc($left($3,1) - $left($1,1)))

  if ($right(%piece,-2) == pawn) {
    var %l.x = $mid($3,2,1)
    var %l.y = $mid($3,1,1)
    var %l.y-1 = $calc(%l.y -1)
    var %l.xy-1 = $+(%l.y-1,%l.x)

    if ($istok(1 8,$left($3,1),32)) { 
      var %l.x2 = $calc(9 - $mid($1,2,1))
      var %l.y2 = $calc(9 - $mid($1,1,1))
      var %l.xy2 = $+(%l.y2,%l.x2)

      var %n.x2 = $calc(9 - $mid($3,2,1))
      var %n.y2 = $calc(9 - $mid($3,1,1))
      var %n.xy2 = $+(%n.y2,%n.x2)

      .echo -qg $dialog(choose_piece,choose_piece) 
      if ($hget(chess.info,mode) == mp) { chess_send switch %newpiece %n.xy2 %l.xy2 }
      switch_piece %newpiece $3 $1  
      hadd chess.info just_switched 1

      return 
    }
    elseif (%move_len == 2) { hadd chess.info en_passant $3 }
 
    if ($hget(chess.info,opponent_move)) && ($hget(chess.info,en_passant) == %l.xy-1) {
       hadd chess.info log_ep 1
       hdel chess.board %l.xy-1 
       drawrect -rf @chess $get_color(%l.x,%l.y-1) 0 $get_square(%l.x) $get_square(%l.y-1) $hget(chess.options,size) $hget(chess.options,size) 
    } 
  }
  elseif (%piece == $+($hget(chess.info,clr_own),_king)) {
    hadd chess.info $+($1,_king_moved) 1
  }
  elseif (%piece == $+($hget(chess.info,clr_own),rook)) && ($1 == 81) {
    hadd chess.info left_rook_moved 1
  }
  elseif (%piece == $+($hget(chess.info,clr_own),rook)) && ($1 == 88) {
    hadd chess.info right_rook_moved 1
  }
  hadd chess.board $3 %piece
  hdel chess.board $1

  hadd chess.info king_check 1
  hadd chess.info king_check2 1
  chess_piece_options %piece $mid($3,2,1) $mid($3,1,1)

  if ($hget(chess.info,opponent_move)) {
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) { 
      print_info red Check
      hadd chess.info check 1
      chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $1 $3 $right(%piece,-2) $+(+,$iif($hget(chess.info,take),x))
    }
    else { chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $1 $3 $right(%piece,-2) $iif($hget(chess.info,take),x) }
  }
  elseif (!$hget(chess.info,opponent_move)) {
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_king),1).data,32)) { 
      var %checked 1      
      chess_log $hget(chess.info,clr_own) $1 $3 $right(%piece,-2) $+(+,$iif($hget(chess.info,take),x))
    }

    hdel chess.info threat_zone
    var %n = 1
    hadd chess.info king_check 1
    while ($hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_,*),%n,w).data) {
      var %s = $v1
      if ($right($hget(chess.board,%s),-2) != king) { chess_piece_options_rec $hget(chess.board,%s) $mid(%s,2,1) $mid(%s,1,1) }
      inc %n
    }

    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) { 
      hadd chess.info king_in_danger 1
    }
    elseif (!$hget(chess.info,just_switched)) && (!%checked) { chess_log $hget(chess.info,clr_own) $1 $3 $right(%piece,-2) $iif($hget(chess.info,take),x) } 

  }

  if ($hget(chess.info,king_in_danger)) {
    print_info red Illegal move! king would be threated.
    hadd chess.board $1 %piece
    if ($hget(chess.info,take)) { hadd chess.board $3 $v1 }
    else { hdel chess.board $3 }
  }
  else {
    hdel chess.info just_switched
    hdel chess.info take
    hdel chess.info log_ep
    hdel chess.info opponent_move
  }
  hdel chess.info threat_zone
  hdel chess.info king_check
  hdel chess.info king_check2

  return
}

alias -l switch_piece {
  var %x = $mid($2,1,1)
  var %y = $mid($2,2,1)
  var %dx = $get_square(%x)
  var %dy = $get_square(%y)
  var %piece = $hget(chess.board,$3)

  var %new_piece = $1
  hadd chess.board $2 %new_piece
  hdel chess.board $3

  draw_piece %dy %dx %new_piece $get_color(%x,%y)  

  hadd chess.info king_check 1
  hadd chess.info king_check2 1
  chess_piece_options %new_piece %y %x

  if ($hget(chess.info,opponent_move)) {
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) { 
      print_info red Check
      chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $3 $2 $right(%piece,-2) $+(s,+,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2)
    }
    else { chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) $3 $2 $right(%piece,-2) $+(s,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2) }
  }
  elseif ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_king),1).data,32)) {  
    chess_log $hget(chess.info,clr_own) $1 $3 $right(%piece,-2) $+(s,+,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2)
  }
  else { chess_log $hget(chess.info,clr_own) $3 $2 $right(%piece,-2) $+(s,$replace($hget(chess.info,take),1,x)) $right(%new_piece,-2) }

  unset %newpiece

  hdel chess.info just_switched
  hdel chess.info take
  hdel chess.info log_ep
  hdel chess.info opponent_move
  hdel chess.info threat_zone
  hdel chess.info king_check
  hdel chess.info king_check2
}

alias -l chess_castling {
  var %x.king = $mid($1,2,1)
  var %y.king = $mid($1,1,1)
  var %x.rook = $mid($2,2,1)
  var %y.rook = $mid($2,1,1)

  var %xy.king = $+(%y.king,%x.king)
  var %xy.rook = $+(%y.rook,%x.rook)
  var %king = $+($3,_king)
  var %rook = $+($3,_rook)

  var %l.x2 = $calc(9 - $mid($1,2,1))
  var %l.y2 = $calc(9 - $mid($1,1,1))
  var %l.xy2 = $+(%l.y2,%l.x2)

  var %n.x2 = $calc(9 - $mid($2,2,1))
  var %n.y2 = $calc(9 - $mid($2,1,1))
  var %n.xy2 = $+(%n.y2,%n.x2)

  if ($3 == $hget(chess.info,clr_own)) {
    hadd chess.info king_moved 1
    hadd chess.info $+($iif(%x.rook == 8,right,left),_rook_moved) 1
  }

  if (%x.rook == 8) {
    var %x+1.king = $calc(%x.king +2)
    var %xy+1.king = $+(%y.king,%x+1.king)
    var %x-1.king = $calc(%x.king +1)
    var %xy-1.king = $+(%y.king,%x-1.king)
    var %castling = $iif($hget(chess.info,clr_own) == w,0-0,0-0-0)
  }
  else {
    var %x+1.king = $calc(%x.king -2)
    var %xy+1.king = $+(%y.king,%x+1.king)
    var %x-1.king = $calc(%x.king -1)
    var %xy-1.king = $+(%y.king,%x-1.king)
    var %castling = $iif($hget(chess.info,clr_own) == w,0-0-0,0-0)
  }

  if ($hget(chess.info,clr_own) == w) {
    ;draw_piece $get_square(%x+1.king) $get_square(%y.king) %king $get_color(%x+1.king,%y.king)
    ;draw_piece $get_square(%x-1.king) $get_square(%y.king) %rook $get_color(%x-1.king,%y.king)
  }

  draw_piece $get_square(%x+1.king) $get_square(%y.king) %king $get_color(%x+1.king,%y.king)
  draw_piece $get_square(%x-1.king) $get_square(%y.king) %rook $get_color(%x-1.king,%y.king)

  drawrect -rf @chess $get_color(%x.rook,%y.rook) 0 $get_square(%x.rook) $get_square(%y.rook) $hget(chess.options,size) $hget(chess.options,size)
  drawrect -rf @chess $get_color(%x.king,%y.king) 0 $get_square(%x.king) $get_square(%y.king) $hget(chess.options,size) $hget(chess.options,size)

  hadd chess.board %xy+1.king %king
  hadd chess.board %xy-1.king %rook
  hdel chess.board %xy.rook
  hdel chess.board %xy.king

  if ($hget(chess.info,mode) == mp) && (!$4) { 
    chess_send castling %l.xy2 %n.xy2 $3
    print_info light_blue $hget(chess.info,opponent) $+ 's turn
  }

  hadd chess.info king_check 1
  hadd chess.info king_check2 1

  var %piece = %rook
  chess_piece_options %piece %x-1.king %y.king

  if ($hget(chess.info,opponent_move)) {
    if ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($hget(chess.info,clr_own),_king),1).data,32)) { 
      print_info red Check | chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) %castling +
    }
    else { chess_log $replacex($hget(chess.info,clr_own),b,w,w,b) %castling }
  }
  elseif ($istok($hget(chess.info,threat_zone),$hfind(chess.board,$+($iif($hget(chess.info,clr_own) == w,b,w),_king),1).data,32)) {  
    chess_log $hget(chess.info,clr_own) %castling +
  }
  else { chess_log $hget(chess.info,clr_own) %castling }

  hdel chess.info just_switched
  hdel chess.info take
  hdel chess.info log_ep
  hdel chess.info opponent_move
  hdel chess.info threat_zone
  hdel chess.info king_check
  hdel chess.info king_check2
  hdel chess.info own_turn
  hdel chess.info castling
}

alias -l clr_replace {
  return $replacex($1,red,255,green,65280,blue,16732457,yellow,2751743,light_blue,16749691,white,16777215)
}

alias -l get_color {
  ;return $iif($calc(($1 -($2 % 2)) % 2),0,16777215)
  return $iif($calc(($1 -($2 % 2)) % 2),4688849,10407679)
  ; 10407679
}

alias get_piece {
  if ($istok(1 2 7 8,$1,32)) { 
    var %c = $hget(chess.info,clr_own)
    if ($1 == 2) { return $+($iif(%c == w,b,w),_pawn) }
    elseif ($1 == 7) { return $+(%c,_pawn) }
    elseif ($1 == 8) { return $+(%c,$gettok(_rook _knight _bishop $iif(%c == w,_queen _king,_king _queen) _bishop _knight _rook,$2,32)) }
    else { return $+($iif(%c == w,b,w),$gettok(_rook _knight _bishop $iif(%c == w,_queen _king,_king _queen) _bishop _knight _rook,$2,32)) }
  }
}

alias -l get_square {
  return $calc((($1 -1) * $hget(chess.options,size)) +20)
}

alias -l clear_selections {
  var %z = 1 
  while ($gettok($1-,%z,32)) {
    var %x = $mid($v1,2,1)
    var %y = $mid($v1,1,1)
    var %ispiece = $hget(chess.board,$v1)
    if ($v1 != 99) { 
      drawrect -rf @chess $get_color(%x,%y) 0 $get_square(%x) $get_square(%y) $hget(chess.options,size) $hget(chess.options,size)
      if (%ispiece) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
    }
    inc %z
  }
}

alias -l print_info {
  drawrect -rf @chess 3684408 0 20 $iif($hget(chess.options,size) == 100,825,505) $iif($hget(chess.options,size) == 100,570,420) 20 | drawtext -cro @chess $clr_replace($1) "courier new" $iif($hget(chess.options,size) == 100,16,12) 20 $iif($hget(chess.options,size) == 100,825,505) $iif($hget(chess.options,size) == 100,570,420) 20 $2-
}

alias -l check_square {
  var %hg = $hget(chess.board,$+($2,$1))
  var %c = $iif($hget(chess.info,clr_own) == w,b,w)
  if ($hget(chess.info,king_check)) { var %c = $iif(%c == w,b,w) }
  if ($3) { var %c = $3 }
  if (!%hg) || ($left(%hg,1) == %c) { 
    return $true 
  }
}

alias -l in_board {
  if ($1 isnum 1-8) && ($2 isnum 1-8) { return $true }
}

alias -l draw+select {
  if (!$hget(chess.info,king_check)) { draw_selection $1 $2 $hget(chess.info,clr_select) }
  return $+($2,$1)
}

alias -l chess_piece_options_rec {
  chess_piece_options $1-
}

alias -l fw { return $calc($1 $iif($3 == w,+,-) $2) }
alias -l bw { return $calc($1 $iif($3 == w,-,+) $2) }

alias -l chess_piece_options {
  var %king_check = $hget(chess.info,king_check)
  var %king_check2 = $hget(chess.info,king_check2) 

  var %piece = $right($1,-2)
  var %clr_own = $left($1,1)

  if (!%king_check) {
    var %clr_own = $iif(%clr_own == w,w,b)
    var %clr_opponent = $iif(%clr_own == w,b,w)
  }

  var %clr_opponent = $iif(%clr_own == w,b,w) 

  var %x = $2
  var %y = $3

  ; PAWN
  if (%piece == pawn) { 

    var %y+1 = $iif(%clr_own == w,$bw(%y,1,%clr_own),$fw(%y,1,%clr_own))
    var %y-1 = $iif(%clr_own == w,$fw(%y,1,%clr_own),$bw(%y,1,%clr_own))
    var %y+2 = $iif(%clr_own == w,$bw(%y,2,%clr_own),$fw(%y,2,%clr_own))
    var %x+1 = $calc(%x +1)
    var %x-1 = $calc(%x -1)

    var %take_left = $+(%y+1,%x+1)
    var %take_right = $+(%y+1,%x-1)

    if (($left($hget(chess.board,%take_left),1) == %clr_opponent) || (($hget(chess.info,en_passant) == $+(%y,%x+1)) && ($left($hget(chess.board,$+(%y,%x+1)),1) == %clr_opponent))) {    
      if (!%king_check) { var %select = %select $draw+select(%x+1,%y+1,%x) }
    }
    if (%king_check) { var %select = %select $draw+select(%x+1,%y-1) } 

    if (($left($hget(chess.board,%take_right),1) == %clr_opponent) || (($hget(chess.info,en_passant) == $+(%y,%x-1)) && ($left($hget(chess.board,$+(%y,%x-1)),1) == %clr_opponent))) { 
      if (!%king_check) { var %select = %select $draw+select(%x-1,%y+1) }
    }
    if (%king_check) { var %select = %select $draw+select(%x-1,%y-1) }

    if (!$hget(chess.board,$+(%y+1,%x))) && (%y+1 <= 8) && (%y+1 >= 1) && (!%king_check) {
      var %select = %select $draw+select(%x,%y+1)

      ; 2 steps for first move
      if ($istok(2 7,%y,32)) && (!$hget(chess.board,$+(%y+2,%x))) && (%y+2 <= 8) && (%y+2 > 1) { var %select = %select $draw+select(%x,%y+2) }
    }
    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
    return
  }

  ; ROOK
  elseif (%piece == rook) {

    ; :: RIGHT
    var %z = $iif(%x == 8,9,$calc(%x +1))
    while (%z <= 8) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | inc %z }
    if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }

    ; :: LEFT
    var %z = $iif(%x == 1,0,$calc(%x -1))
    while (%z >= 1) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | dec %z } 
    if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }

    ; :: UP
    var %z = $iif(%y == 1,0,$calc(%y -1))
    while (%z >= 1) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | dec %z }
    if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }

    ; :: DOWN
    var %z = $iif(%y == 8,9,$calc(%y +1))
    while (%z <= 8) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | inc %z }
    if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }

    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
    return
  }

  ; BISHOP
  elseif (%piece == bishop) {

    ; :: LEFT-UP
    var %sx = $iif(%x == 1,0,$calc(%x -1))
    var %sy = $iif(%y == 1,0,$calc(%y -1))
    while (%sx >= 1) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | dec %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    ; :: LEFT-DOWN
    var %sx = $iif(%x == 1,0,$calc(%x -1))
    var %sy = $iif(%y == 8,9,$calc(%y +1))
    while (%sx >= 1) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | inc %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    ; :: RIGHT-UP
    var %sx = $iif(%x == 8,9,$calc(%x +1))
    var %sy = $iif(%y == 1,0,$calc(%y -1))
    while (%sx <= 8) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | dec %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) } 

    ; :: RIGHT-DOWN
    var %sx = $iif(%x == 8,9,$calc(%x +1))
    var %sy = $iif(%y == 8,9,$calc(%y +1))
    while (%sx <= 8) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | inc %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
    return
  }

  ; QUEEN
  elseif (%piece == queen) {

    ; :: RIGHT
    var %z = $iif(%x == 8,9,$calc(%x +1))
    while (%z <= 8) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | inc %z }   
    if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }

    ; :: LEFT
    var %z = $iif(%x == 1,0,$calc(%x -1))
    while (%z >= 1) { if ($kc(%y,%z)) { break } | var %select = %select $draw+select(%z,%y) | dec %z }    
    if ($left($hget(chess.board,$+(%y,%z)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%z,%y) }

    ; :: UP
    var %z = $iif(%y == 1,0,$calc(%y -1))
    while (%z >= 1) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | dec %z }   
    if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }

    ; :: DOWN
    var %z = $iif(%y == 8,9,$calc(%y +1))
    while (%z <= 8) { if ($kc(%z,%x)) { break } | var %select = %select $draw+select(%x,%z) | inc %z }
    if ($left($hget(chess.board,$+(%z,%x)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%x,%z) }

    ; :: LEFT-UP
    var %sx = $iif(%x == 1,0,$calc(%x -1))
    var %sy = $iif(%y == 1,0,$calc(%y -1))
    while (%sx >= 1) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | dec %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    ; :: LEFT-DOWN
    var %sx = $iif(%x == 1,0,$calc(%x -1))
    var %sy = $iif(%y == 8,9,$calc(%y +1))
    while (%sx >= 1) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | dec %sx | inc %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    ; :: RIGHT-UP
    var %sx = $iif(%x == 8,9,$calc(%x +1))
    var %sy = $iif(%y == 1,0,$calc(%y -1))
    while (%sx <= 8) && (%sy >= 1) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | dec %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    ; :: RIGHT-DOWN
    var %sx = $iif(%x == 8,9,$calc(%x +1))
    var %sy = $iif(%y == 8,9,$calc(%y +1))
    while (%sx <= 8) && (%sy <= 8) { if ($kc(%sy,%sx)) { break } | var %select = %select $draw+select(%sx,%sy) | inc %sx | inc %sy }
    if ($left($hget(chess.board,$+(%sy,%sx)),1) == %clr_opponent) || (%king_check) { var %select = %select $draw+select(%sx,%sy) }

    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
    return
  }

  ; KNIGHT
  elseif (%piece = knight) {

    var %x+1 = $iif(%x == 8,9,$calc(%x +1))
    var %x-1 = $iif(%x == 1,0,$calc(%x -1))
    var %x+2 = $iif(%x == 8,9,$calc(%x +2))
    var %x-2 = $iif(%x == 1,0,$calc(%x -2))
    var %y+1 = $iif(%y == 8,9,$calc(%y +1))
    var %y-1 = $iif(%y == 1,0,$calc(%y -1))
    var %y+2 = $iif(%y == 8,9,$calc(%y +2))
    var %y-2 = $iif(%y == 1,0,$calc(%y -2))

    ; :: DOWN-2 RIGHT-1
    if (($check_square(%x+1,%y+2,%clr_opponent)) && ($in_board(%x+1,%y+2))) || (%king_check) { var %select = %select $draw+select(%x+1,%y+2) }

    ; :: DOWN-2 LEFT-1
    if (($check_square(%x-1,%y+2,%clr_opponent)) && ($in_board(%x-1,%y+2))) || (%king_check) { var %select = %select $draw+select(%x-1,%y+2) }

    ; :: DOWN-1 RIGHT-2
    if (($check_square(%x+2,%y+1,%clr_opponent)) && ($in_board(%x+2,%y+1))) || (%king_check) { var %select = %select $draw+select(%x+2,%y+1) }

    ; :: DOWN-1 LEFT-2
    if (($check_square(%x-2,%y+1,%clr_opponent)) && ($in_board(%x-2,%y+1))) || (%king_check) { var %select = %select $draw+select(%x-2,%y+1) }

    ; :: UP-2 RIGHT-1
    if (($check_square(%x+1,%y-2,%clr_opponent)) && ($in_board(%x+1,%y-2))) || (%king_check) { var %select = %select $draw+select(%x+1,%y-2) }

    ; :: UP-2 LEFT-1
    if (($check_square(%x-1,%y-2,%clr_opponent)) && ($in_board(%x-1,%y-2))) || (%king_check) { var %select = %select $draw+select(%x-1,%y-2) }

    ; :: UP-1 RIGHT-2
    if (($check_square(%x+2,%y-1,%clr_opponent)) && ($in_board(%x+2,%y-1))) || (%king_check) { var %select = %select $draw+select(%x+2,%y-1) }

    ; :: UP-1 LEFT-2
    if (($check_square(%x-2,%y-1,%clr_opponent)) && ($in_board(%x-2,%y-1))) || (%king_check) { var %select = %select $draw+select(%x-2,%y-1) } 

    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }
    return
  }

  ; KING
  elseif (%piece == king) {

    var %x-1 = $iif(%x == 1,0,$calc(%x -1))
    var %y-1 = $iif(%y == 1,0,$calc(%y -1))
    var %x+1 = $iif(%x == 8,9,$calc(%x +1))
    var %y+1 = $iif(%y == 8,9,$calc(%y +1))
    var %xy = $+(%y,%x)

    if  (!%king_check) {
      var %n = 1

      hadd chess.info king_check 1
      while ($hfind(chess.board,$+(%clr_opponent,_,*),%n,w).data) {
        var %s = $v1
        if ($right($hget(chess.board,%s),-2) != king) { chess_piece_options_rec $hget(chess.board,%s) $mid(%s,2,1) $mid(%s,1,1) }
        inc %n
      }
      hdel chess.info king_check
    }

    ; :: RIGHT
    if ($check_square(%x+1,%y)) && ($in_board(%x+1,%y)) && (!$istok($hget(chess.info,threat_zone),$+(%y,%x+1),32)) { 
      var %select = %select $draw+select(%x+1,%y) 
    }

    ; :: LEFT
    if ($check_square(%x-1,%y)) && ($in_board(%x-1,%y)) && (!$istok($hget(chess.info,threat_zone),$+(%y,%x-1),32)) { var %select = %select $draw+select(%x-1,%y) }

    ; :: UP
    if ($check_square(%x,%y-1)) && ($in_board(%x,%y-1)) && (!$istok($hget(chess.info,threat_zone),$+(%y-1,%x),32)) { var %select = %select $draw+select(%x,%y-1) }

    ; :: DOWN
    if ($check_square(%x,%y+1)) && ($in_board(%x,%y+1)) && (!$istok($hget(chess.info,threat_zone),$+(%y+1,%x),32)) { var %select = %select $draw+select(%x,%y+1) }

    ; :: LEFT-UP
    if ($check_square(%x-1,%y-1)) && ($in_board(%x-1,%y-1)) && (!$istok($hget(chess.info,threat_zone),$+(%y-1,%x-1),32)) { var %select = %select $draw+select(%x-1,%y-1) }

    ; :: LEFT-DOWN
    if ($check_square(%x-1,%y+1)) && ($in_board(%x-1,%y+1)) && (!$istok($hget(chess.info,threat_zone),$+(%y+1,%x-1),32)) { var %select = %select $draw+select(%x-1,%y+1) }

    ; :: RIGHT-UP
    if ($check_square(%x+1,%y-1)) && ($in_board(%x+1,%y-1)) && (!$istok($hget(chess.info,threat_zone),$+(%y-1,%x+1),32)) { var %select = %select $draw+select(%x+1,%y-1) }

    ; :: RIGHT-DOWN
    if ($check_square(%x+1,%y+1)) && ($in_board(%x+1,%y+1)) && (!$istok($hget(chess.info,threat_zone),$+(%y+1,%x+1),32)) { var %select = %select $draw+select(%x+1,%y+1) } 

    ; :: Castling
    if (!$hget(chess.info,king_moved)) {
      var %iy = 8
      var %lxy = $+(%iy,1)
      var %rxy = $+(%iy,8)

      if ($castling_left(%lxy,%iy,%clr_own)) { 
        var %select = %select $draw+select(1,%iy) 
        hadd chess.info castling 1
      }
      if ($castling_right(%rxy,%iy,%clr_own)) {
        var %select = %select $draw+select(8,%iy) 
        hadd chess.info castling 1
      }      
    }

    hdel chess.info threat_zone

    if (!%king_check) { hadd chess.info current_selections $iif(%select,$v1,99) }
    else { hadd chess.info threat_zone $hget(chess.info,threat_zone) %select }

    return
  }
}

alias -l kc {
  if ($hget(chess.info,king_check)) {
    if ($right($hget(chess.board,$+($1,$2)),-2) != king) && ($hget(chess.board,$+($1,$2))) { return $true }
  } 
  elseif ($hget(chess.board,$+($1,$2))) {
    return $true
  }
}

alias castling_left {
  if ($hget(chess.info,clr_own) == w) {
    if (!$hget(chess.info,left_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,2))) && (!$hget(chess.board,$+($2,3))) && (!$hget(chess.board,$+($2,4))) && (!$istok($hget(chess.info,threat_zone),$+($2,2),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,3),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,4),32)) && (!$hget(chess.info,check)) {
      return $true
    }
  }
  else {
    if (!$hget(chess.info,left_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,2))) && (!$hget(chess.board,$+($2,3))) && (!$istok($hget(chess.info,threat_zone),$+($2,2),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,3),32)) && (!$hget(chess.info,check)) {
      return $true
    }
  }
}

alias castling_right {
  if ($hget(chess.info,clr_own) == w) {
    if (!$hget(chess.info,right_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,6))) && (!$hget(chess.board,$+($2,7))) && (!$istok($hget(chess.info,threat_zone),$+($2,6),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,7),32)) && (!$hget(chess.info,check)) {
      return $true
    }
  }
  else {
    if (!$hget(chess.info,right_rook_moved)) && ($left($hget(chess.board,$1),1) == $3) && (!$hget(chess.board,$+($2,6))) && (!$hget(chess.board,$+($2,7))) && (!$istok($hget(chess.info,threat_zone),$+($2,5),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,6),32)) && (!$istok($hget(chess.info,threat_zone),$+($2,7),32)) && (!$hget(chess.info,check)) {
      return $true
    }
  }
}

;; SOCKETS, msg, notice

#chess.n off
on ^*:notice:chess_game *:?:{
  if ($nick == $hget(chess.info,opponent)) { parse_incoming $2- | haltdef }
}
on ^*:text:chess_game *:?:{
  if ($nick == $hget(chess.info,opponent)) { parse_incoming $2- | haltdef }
}
#chess.n end

alias start_server {
  if ($hget(chess.info,con_type) != irc) {
    sockclose chess_connect
    socklisten chess_connect 6666
    hadd chess.info init 1
  }
  hadd chess.info clr_own w 
  hadd chess.info mode mp 
  hadd chess.info own_turn 1
  drawtext -ro @chess 16749691 verdana 22 60 $iif($hget(chess.options,size) == 100,560,380) waiting for other player...
}

alias -l connect_to_server {
  sockopen chess %chess.ip %chess.port
}

alias -l chess_send { 
  if ($hget(chess.info,con_type) == irc) { 
    var %m = $iif($hget(chess.options,send_method),$v1,msg)
    %m $hget(chess.info,opponent) chess_game $1- 
  }
  else { sockwrite -n chess $1- }
}

on *:socklisten:chess_connect:{
  chess_initiate
  print_info light_blue You start.
  sockaccept chess
  chess_send init $me
}

on *:sockopen:chess:{ 
  chess_initiate 
  chess_send init $me 
}

on *:sockread:chess:{ 
  var %t
  sockread %t 
  parse_incoming %t
}

on *:sockclose:chess:{
  print_info red $hget(chess.info,opponent) disconnected.
}

alias -l parse_incoming {
  if ($active != chess) && ($1 != cmsg) { flash @chess | titlebar @chess your turn! }
  tokenize 32 $1-

  if ($1 == init) { 
    hadd chess.info opponent $2
    if (!$hget(chess.info,own_turn)) { print_info light_blue $2 starts. }
    if ($hget(chess.info,con_type) == irc) && (!$hget(chess.info,init)) {
      hadd chess.info init 1      
      chess_initiate
      print_info light_blue You start.
      chess_send init $me
    }
  }
  elseif ($1 == move) { 
    hadd chess.info own_turn 1 
    hadd chess.info opponent_move 1

    var %last.xy = $2
    var %last.x = $mid(%last.xy,2,1)
    var %last.y = $mid(%last.xy,1,1) 

    var %xy = $3
    var %x = $mid(%xy,2,1)
    var %y = $mid(%xy,1,1)

    drawrect -rf @chess $get_color(%last.x,%last.y) 0 $get_square(%last.x) $get_square(%last.y) $hget(chess.options,size) $hget(chess.options,size)
    if ($hget(chess.board,%last.xy)) { draw_piece $get_square(%x) $get_square(%y) $v1 $get_color(%x,%y) }
    print_info light_blue Your turn.
    if ($hget(chess.board,%xy)) { hadd chess.info take 1 }
    .echo -gq $chess_move(%last.xy,->,%xy)
    draw_selection %last.x %last.y light_blue
    draw_selection %x %y yellow
    .timerclrlast $+ %xy 1 5 clear_selections %last.xy %xy
  } 
  elseif ($1 == load) {
    print_info light_blue $hget(chess.info,opponent) loaded a game: $2 with $3
  }
  elseif ($1 == cmsg) {
    print_info yellow msg: $2-
  }
  elseif ($1 == disconnect) {
    print_info red $hget(chess.info,opponent) disconnected.
  }
  elseif ($1 == switch) {
    hadd chess.info opponent_move 1 
    print_info light_blue Your turn.
    if ($hget(chess.board,$4)) { hadd chess.info take 1 }
    switch_piece $2-4
    clear_selections $4
    hadd chess.info own_turn 1
  }
  elseif ($1 == castling) { 
    print_info light_blue Your turn.
    hadd chess.info opponent_move 1
    chess_castling $2-4 1
    hadd chess.info own_turn 1
  }
}

; LOGGING


alias -l log_show {
  window -C @chess $window(@chess).x $window(@chess).y $calc($window(@chess).w $1) $window(@chess).h
}

alias -l chess_log {
  if ($2 != 0-0) && ($2 != 0-0-0) {
    var %x.from = $mid($2,2,1)
    var %x.to = $mid($3,2,1)
    var %y.from = $mid($2,1,1)
    var %y.to = $mid($3,1,1)

    if ($hget(chess.info,clr_own) == w) { 
      var %y.from = $calc(9 - %y.from)
      var %y.to = $calc(9 - %y.to)
    }
    else { 
      var %x.from = $calc(9 - %x.from)
      var %x.to = $calc(9 - %x.to)
    }

    var %x.from = $gettok(a b c d e f g h,%x.from,32)
    var %x.to = $gettok(a b c d e f g h,%x.to,32)

    var %from = $+(%x.from,%y.from)
    var %to = $+(%x.to,%y.to)
    var %p = $replace($4,pawn,P,king,K,queen,Q,knight,N,bishop,B,rook,R)
    if ($hget(chess.options,log_format) == 1) { var %l = $+(%p,%from,$iif((x isin $5) || ($hget(chess.info,log_ep)),x,-),%to,$iif(s isin $5,$replace($6,pawn,P,king,K,queen,Q,knight,N,bishop,B,rook,R))) $+ $remove($5,x,s) $iif($hget(chess.info,log_ep),e.p.) }
    else { var %l = %p $upper(%from) $+ -> $+ $upper(%to) $iif(s isin $5,$replace($6,pawn,P,king,K,queen,Q,knight,N,bishop,B,rook,R))) $iif((x isin $5) || ($hget(chess.info,log_ep)),take) $replace($remove($5,x,s),+,check) $iif($hget(chess.info,log_ep),e.p.)  }  
  }

  else { var %l = $2 $+ $3 }
  print_last_move light_blue %l
  print_log $iif($1 == w,white,light_blue) %l
}

alias -l print_last_move {
  var %z = $width($2-,courier new,16)
  var %y = $calc($iif($hget(chess.options,size) == 100,820,500) - %z)
  drawrect -rf @chess 3684408 0 $iif($hget(chess.options,size) == 100,600,280) $iif($hget(chess.options,size) == 100,825,505) 225 20 | drawtext -ro @chess $clr_replace($1) "Courier New" 16 %y $iif($hget(chess.options,size) == 
100,825,505) $2-
}

alias -l print_log {
  write chess\temp.log $1-
  if (!$hget(chess.info,log_shown)) { return }
  hinc chess.info log_lines
  var %l = $hget(chess.info,log_lines)
  if (%l > $iif($hget(chess.options,size) == 100,40,24)) { drawscroll @chess 0 -20 $iif($hget(chess.options,size) == 100,840,520) 20 200 $iif($hget(chess.options,size) == 100,840,520) }

  drawtext -ro @chess $clr_replace($1) "Courier New" 16 $iif($hget(chess.options,size) == 100,840,520) $calc(0+(20 * $iif(%l <= $iif($hget(chess.options,size) == 100,40,24),%l,$v2) )) $2-
}

alias -l filter_log {
  tokenize 32 $1
  hinc chess.info log_lines
  var %l = $hget(chess.info,log_lines)

  if (%l > $iif($hget(chess.options,size) == 100,40,24)) { drawscroll @chess 0 -20 $iif($hget(chess.options,size) == 100,840,520) 20 200 $iif($hget(chess.options,size) == 100,840,520) }

  drawtext -ro @chess $clr_replace($1) "Courier New" 16 $iif($hget(chess.options,size) == 100,840,520) $calc(0+(20 * $iif(%l <= $iif($hget(chess.options,size) == 100,40,24),%l,$v2) )) $2-
} 

alias -l log_save {
  var %f = $+(chess/,$asctime(yyyy-mm-dd-hhnnss),-,$iif($hget(chess.info,mode) == sp,singleplayer,$hget(chess.info,opponent)),.log)
  filter -ff chess\temp.log %f
}

; DIALOGS


alias -l connect_dialog { .echo -gq $$dialog(chess_connect,chess_connect) }

dialog -l chess_connect {
  title "Create chess connection"
  size -1 -1 275 70
  option pixels

  tab "Sockets",  11, -1 -1 277 202
  tab "IRC", 12, -1 -1 277 202

  text "IP", 1, 7 25 100 20, tab11
  text "PORT", 2, 111 25 100 20, tab11
  edit "", 3, 5 42 100 20, tab11
  edit "", 4, 108 42 100 20, tab11
  button "connect", 5, 211 41 60 22,default


  text "IRC-nick to connect to", 8, 7 25 150 20, tab12
  edit "", 9, 5 42 100 20 , tab12
}

on 1:dialog:chess_connect:init:*:{
  did -a $dname 3 %chess.ip
  did -a $dname 4 $iif(%chess.port,$v1,6666)
}

on 1:dialog:chess_connect:sclick:5:{
  if ($dialog($dname).tab == 11) {
    set %chess.ip $did($dname,3)
    set %chess.port $did($dname,4)
    hadd chess.info init 1 | hadd chess.info clr_own b | hadd chess.info mode mp | hadd chess.info last_moved b
    dialog -x chess_connect
    connect_to_server
  }
  else {
    hadd chess.info init 1 | hadd chess.info clr_own b | hadd chess.info mode mp | hadd chess.info last_moved b | hadd chess.info opponent $did($dname,9)
    dialog -x chess_connect
    hadd chess.info con_type irc
    chess_send init $me
    chess_initiate
    .enable #chess.n
  }
}

dialog -l chess_send_pm {
  title "Send a message"
  size -1 -1 275 50
  option pixels

  text "", 1, 7 5 250 20,
  edit "", 2, 5 25 200 20,
  button "send" 3, 211 25 60 22,default
}

on 1:dialog:chess_send_pm:init:*:{
  did -a $dname 1 Send a message to $hget(chess.info,opponent)
}

on 1:dialog:chess_send_pm:sclick:3:{
  dialog -x chess_send_pm
  chess_send cmsg $did($dname,2)
}

dialog -l chess_getimg {
  title "Missing files"
  size -1 -1 275 70
  option pixels

  text "The file pieces.png doesn't seem to exist in your chess-directory, download it?", 1, 7 5 270 30,
  text "", 2, 7 50 250 20
  button "download" 3, 211 45 60 22,default
}

on 1:dialog:chess_getimg:sclick:3:{
  if (!$hget(chess.info,retry)) { getimg | did -ra $dname 2 downloading... }
  elseif ($hget(chess.info,retry) < 5) { getimg }
  else { dialog -x $dname }
}

alias -l server_dialog { .echo -gq $$dialog(chess_server,chess_server) }

dialog -l chess_server {
  title "Start a chess server"
  size -1 -1 275 70
  option pixels

  tab "Sockets",  11, -1 -1 277 202
  tab "IRC", 12, -1 -1 277 202

  text "Start a socket connection", 1, 7 25 200 20, tab11
  button "start", 2, 5 41 60 22,default tab11

  text "Wait for a connection from nick...", 3, 7 25 200 20, tab12
  edit "", 4, 5 42 100 20 , tab12
  button "start", 5, 108 41 60 22,default tab12
}

on 1:dialog:chess_server:init:*:{
  did -a $dname 4 $iif(%chess.nick,$v1)
}

on 1:dialog:chess_server:sclick:2:{
  start_server
  dialog -x $dname
}

on 1:dialog:chess_server:sclick:5:{
  hadd chess.info con_type irc
  hadd chess.info opponent $did($dname,4)
  .enable #chess.n
  start_server 
  set %chess.nick $did($dname,4)
  dialog -x $dname
}

dialog choose_piece {
  title "Chess - choose new piece"
  size -1 -1 422 130
  option pixels

  text "Select a new piece.",5, 7 5 417 20
  button "Queen" 1, 5 25 100 100
  button "Rook" 2, 108 25 100 100
  button "Bishop" 3, 211 25 100 100
  button "Knight" 4, 314 25 100 100
}

on 1:dialog:choose_piece:sclick:1,2,3,4:{
  set %newpiece $+($hget(chess.info,clr_own),_,$gettok(queen rook bishop knight,$did,32))
  dialog -x choose_piece
}

dialog -l chess_options {
  title "Chess options"
  size -1 -1 400 400
  option pixels

  text "Logging format", 1, 7 8 100 20
  combo 2, 110 5 200 20,drop

  text "Square size (pixels)", 3, 7 30 100 20
  combo 4, 110 27 200 20,drop

  text "IRC send method", 5, 7 52 100 20
  combo 6, 110 49 200 20,drop

  text "Selection frames", 7, 7 74 100 20
  check "" 8, 110 71 20 20,

  button "save", 10, 330 370 60 22,ok
}

on 1:dialog:chess_options:init:*:{
  did -a $dname 2 International (Pe2xf1Q+)
  did -a $dname 2 New (P E2->F1 Q take+check)
  did -c $dname 2 $iif($hget(chess.options,log_format),$v1,1)

  did -a $dname 4 100
  did -a $dname 4 60
  did -c $dname 4 $iif($hget(chess.options,size) == 100,1,2) 

  did -a $dname 6 msg
  did -a $dname 6 notice
  did -c $dname 6 $iif($hget(chess.options,send_method) == msg,1,2)

  if ($hget(chess.options,frames)) { did -c $dname 8 }
}

on 1:dialog:chess_options:sclick:10:{
  hadd chess.options log_format $did($dname,2).sel
  if ($did($dname,4).seltext != $hget(chess.options,size)) { hadd chess.options size $did($dname,4).seltext | .timerrestart 1 0 chess_restart }
  if ($did($dname,8).state == 1) { hadd chess.options frames 1 }
  else { hdel chess.options frames }
  hadd chess.options send_method $did($dname,6)

  hsave chess.options chess/options.hsh
}

; FETCH IMAGE
alias getimg { 
  if (!$exists(chess)) { mkdir chess }
  .remove $qt($mircdirchess/pieces.png) 
  sockclose getimg 
  sockopen getimg lost.kapsi.fi 80 
}
on *:sockopen:getimg:{ 
  sockwrite -nt getimg GET /cail/pieces.png HTTP/1.1 
  sockwrite -nt getimg Host: lost.kapsi.fi
  sockwrite -nt getimg Connection: close
  sockwrite -nt getimg $crlf 
}
on *:sockread:getimg:{ 
  if (!$sock(getimg).mark) { 
    var %t
    sockread %t
    if ($gettok(%t,1,32) == Content-Length:) { var %content_len = $gettok(%t,2,32) }
  }
  if (!%t) { sockmark getimg $iif(%content_len,$v1,1) }
  if ($sock(getimg).mark) {
    sockread -f &img
    bwrite $qt($mircdirchess/pieces.png) -1 &img
  }
}
on *:sockclose:getimg:{ 
  if ($file($qt($mircdirchess/pieces.png)) == $sock(getimg).mark) || ($sock(getimg).mark == 1) { dialog -x chess_getimg }
  elseif ($hget(chess.info,retry) <= 5) { hinc chess.info retry | did chess_getimg 2 Error, trying again... ( $+ $hget(chess.info,retry) $+ ) | .remove $qt($mircdirchess/pieces.png) | getimg }
  else { did chess_getimg 2 5 retries gone, try again later }
  unset %content_len
}


Help

The game

Singleplayer mode is only for debugging and testing, not actually to play. This game is meant to be played as multiplayer, where other player starts a server (whites), and other connects to this server (blacks)

Server and connecting

Two connection types are available, sockets and through IRC with /notice or /msg Connection type must be same on both players, the one starting a server must start a server using sockets (default), or from server dialog select IRC and input the other players nick (in active server connection)

The connecting player must then select the same connection method from the connect dialog, and input the servers IP (sockets) or NICK (IRC), note that the same PORT must be used on both clients.

=== Implemented rules === (read more about the rules from wikipedia)

All the pieces move correctly, and you cannot make a move that wouldn't go by the rules. Pawn can perform en passant move, and if advanced to the 8th rank (other side of the board), it gets promoted to queen,rook,bishop,knight of the same color. King and rook can perform castling move, if all the requirements are met, selecting king will highlight the rook, if then clicked on the rook, the castling is performed. IF king is in check, the game will show the selectiong borders in squares you cannot move, but won't let you move there if you try.

Mouse & menus

You select pieces by clicking them, and move them by clicking on the target square, clicking the selected piece will de-select it. You'll find last move from bottom right hand side of the board, clicking it will append the log-window on the right side, where you will see 40 (with 100px squares) or 24 (60px squares) last moves, doubleclicking a move in the log-window will highlight the move on the board. Right clicking anywhere brings you a popup-menu, where you will always find options and help, if in game, also save & load are in this menu. If in multiplayer mode, there's also "send msg", from where you can send a message to other players infobar (bottom left hand side on the board). Right clicking on the log menu let's you save the log.

Saving & loading

You can save and load your gamestate, the game will create 2 files into your /chess-folder YYYY-MM-DD-HHNNSS_board_OPPONENTSNAME.save and YYYY-MM-DD-HHNNSS_info_OPPONENTSNAME.save There will be notification for you, if the opponent loads a game, telling you what game he/she loaded.

Options

Logging format: let's you choose the logging format between "International (Pe2xf1Q+)" and "New (P E2->F1 Q take+check)" Square size: Width & height of the squares in the board in pixels. IRC send method: Uses /msg OPPONENT or /notice OPPONENT to send information if connected via IRC. Selection frames: Switch on/off showing of the borders in squares where you can move.