|
|
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 == |