rendered paste body;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 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
}