|
|
Line 1: |
Line 1: |
| [[:Image:Chess selection.jpg|Screenshot of the gameplay]] | | [[:Image:Chess selection.jpg|Screenshot of the gameplay]] |
− |
| |
− | Dload the .mrc: http://lost.kapsi.fi/cail/chess.mrc
| |
| | | |
| == Source == | | == 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: <nowiki>http://lost.kapsi.fi/cail/pieces.png</nowiki>
| |
− | ; (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(chess/pieces.png)) { noop $dialog(chess_getimg,chess_getimg) }
| |
− | }
| |
− |
| |
− | menu @chess {
| |
− | sclick: chess_sclick
| |
− | dclick: chess_dclick
| |
− | options:noop $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):noop $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:*:{
| |
− | noop $findfile(chess,*board*.save,0,parse_save $1-)
| |
− | }
| |
− |
| |
− | alias -l parse_save {
| |
− | noop $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 }
| |
− | noop $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 chess/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)
| |
− |
| |
− | noop $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) }
| |
− |
| |
− | echo -sg moi: %king_check - %select
| |
− |
| |
− | 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 { $hget(chess.info,threat_zone) | 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 }
| |
− | noop $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 { noop $$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 { noop $$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 -l choose_piece {
| |
− | title "Chess - choose new piece"
| |
− | size -1 -1 422 130
| |
− | option pixels
| |
− |
| |
− | text "Select a new piece.",5, 7 5 417 20
| |
− | icon 1, 5 25 100 100
| |
− | icon 2, 108 25 100 100
| |
− | icon 3, 211 25 100 100
| |
− | icon 4, 314 25 100 100
| |
− | }
| |
− |
| |
− | on 1:dialog:choose_piece:init:*:{
| |
− | did -g $dname 1 $+(chess/,$hget(chess.info,clr_own),_queen_w.png)
| |
− | 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)
| |
− | }
| |
− |
| |
− |
| |
− | 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 { .remove chess/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 chess/pieces.png -1 &img
| |
− | }
| |
− | }
| |
− | on *:sockclose:getimg:{
| |
− | if ($file(chess/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 chess/pieces.png | getimg }
| |
− | else { did chess_getimg 2 5 retries gone, try again later }
| |
− | unset %content_len
| |
− | }
| |
| | | |
| + | Download the .mrc from http://lost.kapsi.fi/cail/chess.mrc |
| | | |
| == Help == | | == Help == |
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)
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.
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.
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.
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.
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.