summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/mpchess/mpchess.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost/mpchess/mpchess.mp')
-rw-r--r--Master/texmf-dist/metapost/mpchess/mpchess.mp994
1 files changed, 994 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/mpchess/mpchess.mp b/Master/texmf-dist/metapost/mpchess/mpchess.mp
new file mode 100644
index 00000000000..d79b984ad67
--- /dev/null
+++ b/Master/texmf-dist/metapost/mpchess/mpchess.mp
@@ -0,0 +1,994 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% mpchess.mp %%
+%% draw chessboards with metapost %%
+%% chupin@ceremade.dauphine.fr %%
+%% Version 0.1 (mars 2023) %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3c of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%input format;
+input hatching;
+input mpchess-cburnett; % piece of lichess cburnett
+input mpchess-staunty; % piece of lichess staunty
+input mpchess-skak; % piece of skak package
+input mpchess-chessboard;
+input mpchess-pgn;
+input mpchess-fen;
+
+if not known mplib: input latexmp fi;
+
+warningcheck:=0;
+
+
+
+% pieces
+picture _chess_bB, _chess_bK, _chess_bN,_chess_bP, _chess_bQ, _chess_bR;
+picture _chess_wB, _chess_wK, _chess_wN,_chess_wP, _chess_wQ, _chess_wR;
+
+% coordinates font
+string _coords_font;
+_coords_font:=defaultfont;
+
+% chose the font to write coordinates on board
+def set_coords_font(expr f)=
+ _coords_font:=f ;
+enddef;
+
+% player name
+string _chess_white_player, _chess_black_player;
+_chess_white_player:="";
+_chess_black_player:="";
+
+def set_white_player(expr s)=
+ _chess_white_player:=s;
+enddef;
+
+
+def set_black_player(expr s)=
+ _chess_black_player:=s;
+enddef;
+
+% boolean to choose the side view
+boolean _chess_view_wb;
+_chess_view_wb := true; % true for white
+
+def set_black_view=
+ _chess_view_wb := false;
+enddef;
+
+def set_white_view=
+ _chess_view_wb := true;
+enddef;
+
+boolean _chess_players_side;
+_chess_players_side:=false;
+def set_players_side=
+ _chess_players_side:=true;
+enddef;
+
+% boolean to choose if we print coordinates
+boolean _chess_print_coords,_chess_coords_inout;
+_chess_print_coords:=true;
+_chess_coords_inout:=true; %true for inside
+def set_no_coords=
+ _chess_print_coords:=false;
+enddef;
+
+def set_coords=
+ _chess_print_coords:=true;
+enddef;
+
+def set_coords_inside=
+ _chess_coords_inout:=true;
+enddef;
+
+def set_coords_outside=
+ _chess_coords_inout:=false;
+enddef;
+
+% boolean for white or black to move
+boolean _white_to_move;
+_white_to_move:=true;
+
+def set_black_to_move=
+ _white_to_move:=false;
+enddef;
+
+def set_white_to_move=
+ _white_to_move:=true;
+enddef;
+
+% boolean to show a mark to indicate whos to move
+boolean show_whos_to_move;
+show_whos_to_move:=true;
+
+def set_whos_to_move=
+ show_whos_to_move:=true;
+enddef;
+
+def unset_whos_to_move=
+ show_whos_to_move:=false;
+enddef;
+
+
+% integer correspondance :
+_intWPawn:=1;
+_intBPawn:=-1;
+_intWKnight:=2;
+_intBKnight:=-2;
+_intWBishop:=3;
+_intBBishop:=-3;
+_intWRook:=4;
+_intBRook:=-4;
+_intWQueen:=5;
+_intBQueen:=-5;
+_intWKing:=6;
+_intBKing:=-6;
+
+
+% macro to get thi ith char of a string
+vardef _get_char(expr s,i)=
+ save output;
+ string output;
+ output:=substring(i,i+1) of s;
+ output
+enddef;
+
+% size of the chessboard
+numeric _chessSize;
+_chessSize:=8;
+
+def set_backboard_size(expr w)=
+ _chessSize:=w;
+enddef;
+
+
+def get_backboard_size=
+ _chessSize
+enddef;
+
+% unit default
+numeric _chessWidth,_chessSquareU;
+_chessWidth:=5cm;
+_chessSquareU:=_chessWidth/_chessSize;
+
+def set_backboard_width(expr w)=
+ _chessWidth:=w;
+enddef;
+
+
+def get_square_dim=
+ _chessSquareU
+enddef;
+
+def get_backboard_width=
+ _chessWidth
+enddef;
+
+% theme
+string _chessTheme;
+% default
+_chessTheme := "BlueLichess";
+
+% color of black and white square
+color _blackColorSquare,_whiteColorSquare;
+% default
+_blackColorSquare:=(0.549,0.6353,0.6784);
+_whiteColorSquare:=(0.8706,0.8912,0.902);
+
+
+
+
+
+
+picture _blackSquarePic, _whiteSquarePic;
+picture _blackSquareColoredPic, _whiteSquareColoredPic;
+picture _blackSquareClassicalPic, _whiteSquareClassicalPic;
+
+def _buildColoredSquare(expr _SquareUnit,_BlackColor,_WhiteColor)=
+ _blackSquarePic:=image(
+ fill unitsquare scaled _SquareUnit withcolor _BlackColor;
+ );
+ _whiteSquarePic:=image(
+ fill unitsquare scaled _SquareUnit withcolor _WhiteColor;
+ );
+enddef;
+
+def _buildClassicalSquare(expr _SquareUnit)=
+ _blackSquarePic:=image(
+ hatchfill (unitsquare scaled _SquareUnit) withcolor (white) withcolor (45,0.65*_SquareUnit/6 bp,-0.2bp);
+ );
+ _whiteSquarePic:=image(
+ fill unitsquare scaled _SquareUnit withcolor white;
+ );
+enddef;
+
+% default theme lichess blue
+_blackSquarePic:=_blackSquareColoredPic;
+_whiteSquarePic:=_whiteSquareColoredPic;
+
+def set_color_theme(expr t)=
+ _chessTheme := t;
+ if(t="BlueLichess"):
+ _blackColorSquare:=(0.549,0.6353,0.6784);
+ _whiteColorSquare:=(0.8706,0.8912,0.902);
+ elseif(t="BrownLichess"):
+ _blackColorSquare:=(0.709803922,0.5333,0.3882);
+ _whiteColorSquare:=(0.941176471,0.850980392,0.709803922);
+ elseif(t="Classical"):
+ _blackColorSquare:=black;
+ _whiteColorSquare:=black;
+ fi
+enddef;
+
+def set_white_color(expr c)=
+ _whiteColorSquare:=c;
+enddef;
+
+def set_black_color(expr c)=
+ _blackColorSquare:=c;
+enddef;
+
+_chess_bB:=_chess_cburnett_bB;
+_chess_bK:=_chess_cburnett_bK;
+_chess_bN:=_chess_cburnett_bN;
+_chess_bP:=_chess_cburnett_bP;
+_chess_bQ:=_chess_cburnett_bQ;
+_chess_bR:=_chess_cburnett_bR;
+
+
+_chess_wB:=_chess_cburnett_wB;
+_chess_wK:=_chess_cburnett_wK;
+_chess_wN:=_chess_cburnett_wN;
+_chess_wP:=_chess_cburnett_wP;
+_chess_wQ:=_chess_cburnett_wQ;
+_chess_wR:=_chess_cburnett_wR;
+
+def set_pieces_theme(expr t)=
+ if(t="cburnett"):
+ _chess_bB:=_chess_cburnett_bB;
+ _chess_bK:=_chess_cburnett_bK;
+ _chess_bN:=_chess_cburnett_bN;
+ _chess_bP:=_chess_cburnett_bP;
+ _chess_bQ:=_chess_cburnett_bQ;
+ _chess_bR:=_chess_cburnett_bR;
+
+
+ _chess_wB:=_chess_cburnett_wB;
+ _chess_wK:=_chess_cburnett_wK;
+ _chess_wN:=_chess_cburnett_wN;
+ _chess_wP:=_chess_cburnett_wP;
+ _chess_wQ:=_chess_cburnett_wQ;
+ _chess_wR:=_chess_cburnett_wR;
+ elseif(t="staunty"):
+ _chess_bB:=_chess_staunty_bB;
+ _chess_bK:=_chess_staunty_bK;
+ _chess_bN:=_chess_staunty_bN;
+ _chess_bP:=_chess_staunty_bP;
+ _chess_bQ:=_chess_staunty_bQ;
+ _chess_bR:=_chess_staunty_bR;
+
+
+ _chess_wB:=_chess_staunty_wB;
+ _chess_wK:=_chess_staunty_wK;
+ _chess_wN:=_chess_staunty_wN;
+ _chess_wP:=_chess_staunty_wP;
+ _chess_wQ:=_chess_staunty_wQ;
+ _chess_wR:=_chess_staunty_wR;
+ elseif(t="skak"):
+ _chess_bB:=_chess_skak_bB;
+ _chess_bK:=_chess_skak_bK;
+ _chess_bN:=_chess_skak_bN;
+ _chess_bP:=_chess_skak_bP;
+ _chess_bQ:=_chess_skak_bQ;
+ _chess_bR:=_chess_skak_bR;
+
+
+ _chess_wB:=_chess_skak_wB;
+ _chess_wK:=_chess_skak_wK;
+ _chess_wN:=_chess_skak_wN;
+ _chess_wP:=_chess_skak_wP;
+ _chess_wQ:=_chess_skak_wQ;
+ _chess_wR:=_chess_skak_wR;
+ fi
+enddef;
+
+
+def _init_piece(expr w)=
+ begingroup
+ bboxmargin:=0pt;
+ _chess_marginBottom:=0.13w;
+ % the queen and king as reference
+ %bQ
+ _chess_bQ_width:=abs((urcorner _chess_bQ)-(ulcorner _chess_bQ));
+ _chess_bQ_height:=abs((urcorner _chess_bQ)-(lrcorner _chess_bQ));
+ _chess_bK_width:=abs((urcorner _chess_bK)-(ulcorner _chess_bK));
+ _chess_bK_height:=abs((urcorner _chess_bK)-(lrcorner _chess_bK));
+ _chess_max_wh:=max(_chess_bQ_height,_chess_bQ_width,_chess_bK_height,_chess_bK_width);
+ ratio:= (0.8w/_chess_max_wh);
+ _chess_bQ:=((_chess_bQ shifted -(llcorner _chess_bQ-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_bQ_width_new:=abs((urcorner _chess_bQ)-(ulcorner _chess_bQ));
+ _chess_bQ:= _chess_bQ shifted ((w-_chess_bQ_width_new)*0.5,_chess_marginBottom) ;
+ %bB
+ _chess_bB:=((_chess_bB shifted -(llcorner _chess_bB-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_bB_width:=abs((urcorner _chess_bB)-(ulcorner _chess_bB));
+ _chess_bB:=_chess_bB shifted ((w-_chess_bB_width)*0.5,_chess_marginBottom) ;
+ %bK
+ _chess_bK:=((_chess_bK shifted -(llcorner _chess_bK-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_bK_width:=abs((urcorner _chess_bK)-(ulcorner _chess_bK));
+ _chess_bK:=_chess_bK shifted ((w-_chess_bK_width)*0.5,_chess_marginBottom) ;
+ %bN
+ _chess_bN:=((_chess_bN shifted -(llcorner _chess_bN-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_bN_width:=abs((urcorner _chess_bN)-(ulcorner _chess_bN));
+ _chess_bN:=_chess_bN shifted ((w-_chess_bN_width)*0.5,_chess_marginBottom) ;
+ %bP
+ _chess_bP:=((_chess_bP shifted -(llcorner _chess_bP-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_bP_width:=abs((urcorner _chess_bP)-(ulcorner _chess_bP));
+ _chess_bP:=_chess_bP shifted ((w-_chess_bP_width)*0.5,_chess_marginBottom) ;
+ %bR
+ _chess_bR:=((_chess_bR shifted -(llcorner _chess_bR-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_bR_width:=abs((urcorner _chess_bR)-(ulcorner _chess_bR));
+ _chess_bR:=_chess_bR shifted ((w-_chess_bR_width)*0.5,_chess_marginBottom) ;
+ %wQ
+ _chess_wQ:=((_chess_wQ shifted -(llcorner _chess_wQ-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_wQ_width:=abs((urcorner _chess_wQ)-(ulcorner _chess_wQ));
+ _chess_wQ:=_chess_wQ shifted ((w-_chess_wQ_width)*0.5,_chess_marginBottom) ;
+ %wB
+ _chess_wB:=((_chess_wB shifted -(llcorner _chess_wB-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_wB_width:=abs((urcorner _chess_wB)-(ulcorner _chess_wB));
+ _chess_wB:=_chess_wB shifted ((w-_chess_wB_width)*0.5,_chess_marginBottom) ;
+ %wK
+ _chess_wK:=((_chess_wK shifted -(llcorner _chess_wK-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_wK_width:=abs((urcorner _chess_wK)-(ulcorner _chess_wK));
+ _chess_wK:=_chess_wK shifted ((w-_chess_wK_width)*0.5,_chess_marginBottom) ;
+ %wN
+ _chess_wN:=((_chess_wN shifted -(llcorner _chess_wN-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_wN_width:=abs((urcorner _chess_wN)-(ulcorner _chess_wN));
+ _chess_wN:=_chess_wN shifted ((w-_chess_wN_width)*0.5,_chess_marginBottom) ;
+ %wP
+ _chess_wP:=((_chess_wP shifted -(llcorner _chess_wP-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_wP_width:=abs((urcorner _chess_wP)-(ulcorner _chess_wP));
+ _chess_wP:=_chess_wP shifted ((w-_chess_wP_width)*0.5,_chess_marginBottom) ;
+ %wR
+ _chess_wR:=((_chess_wR shifted -(llcorner _chess_wR-(bboxmargin,bboxmargin))) scaled ratio );
+ _chess_wR_width:=abs((urcorner _chess_wR)-(ulcorner _chess_wR));
+ _chess_wR:=_chess_wR shifted ((w-_chess_wR_width)*0.5,_chess_marginBottom) ;
+ endgroup
+enddef;
+
+def _int_to_letter_w(expr i)=
+ if(i=1):
+ "a"
+ elseif(i=2):
+ "b"
+ elseif(i=3):
+ "c"
+ elseif(i=4):
+ "d"
+ elseif(i=5):
+ "e"
+ elseif(i=6):
+ "f"
+ elseif(i=7):
+ "g"
+ elseif(i=8):
+ "h"
+ fi
+enddef;
+
+def _int_to_letter_b(expr i)=
+ if(i=1):
+ "h"
+ elseif(i=2):
+ "g"
+ elseif(i=3):
+ "f"
+ elseif(i=4):
+ "e"
+ elseif(i=5):
+ "d"
+ elseif(i=6):
+ "c"
+ elseif(i=7):
+ "b"
+ elseif(i=8):
+ "a"
+ fi
+enddef;
+
+
+def _int_to_str_w(expr i)=
+ if(i=1):
+ "1"
+ elseif(i=2):
+ "2"
+ elseif(i=3):
+ "3"
+ elseif(i=4):
+ "4"
+ elseif(i=5):
+ "5"
+ elseif(i=6):
+ "6"
+ elseif(i=7):
+ "7"
+ elseif(i=8):
+ "8"
+ fi
+enddef;
+
+
+def _int_to_str_b(expr i)=
+ if(i=1):
+ "8"
+ elseif(i=2):
+ "7"
+ elseif(i=3):
+ "6"
+ elseif(i=4):
+ "5"
+ elseif(i=5):
+ "4"
+ elseif(i=6):
+ "3"
+ elseif(i=7):
+ "2"
+ elseif(i=8):
+ "1"
+ fi
+enddef;
+
+
+vardef _chess_get_img_w(expr im)=
+ save width;
+ numeric width;
+ width:=abs(ulcorner im-urcorner im);
+ width
+enddef;
+
+vardef _chess_get_img_h(expr im)=
+ save height;
+ numeric height;
+ height:=abs(ulcorner im-llcorner im) ;
+ height
+enddef;
+
+_chess_eps_cadre := 0.05;
+
+def set_border_width(expr c)=
+ _chess_eps_cadre := c;
+enddef;
+
+
+vardef _chess_build_playername(expr str)=
+ save _player_img,output;
+ picture _player_img,output;
+ _player_img:=image(draw textext(str));
+ output:=image(
+ linecap:=butt;
+ linejoin:=mitered;
+ _tmp:=_chess_get_img_h(_player_img);
+ fill (0-_chess_eps_cadre,0)*_chessSquareU--(_chessSize+_chess_eps_cadre,0)*_chessSquareU--((_chessSize+_chess_eps_cadre)*_chessSquareU,1.8*_tmp)--(0-_chess_eps_cadre*_chessSquareU,1.8*_tmp)--cycle withcolor black;
+ draw (0-_chess_eps_cadre,0)*_chessSquareU--(_chessSize+_chess_eps_cadre,0)*_chessSquareU--((_chessSize+_chess_eps_cadre)*_chessSquareU,1.8*_tmp)--(0-_chess_eps_cadre*_chessSquareU,1.8*_tmp)--cycle withcolor black withpen pencircle scaled (0.1*_chessSquareU);
+ draw _player_img shifted (0.15*_chessSquareU,0.4*_tmp) withcolor white;
+ );
+ output
+enddef;
+
+picture backboard;
+
+def init_backboard =
+_chessSquareU:=_chessWidth/_chessSize;
+_init_piece(_chessSquareU);
+if(_chessTheme="Classical"):
+ _buildClassicalSquare(_chessSquareU);
+else: % colored themes
+ _buildColoredSquare(_chessSquareU,_blackColorSquare,_whiteColorSquare);
+fi
+picture _letter_img;
+picture _wplayer_img,_bplayer_img;
+
+backboard:=image(
+ linecap:=butt;
+ linejoin:=mitered;
+ draw (0-_chess_eps_cadre,0-_chess_eps_cadre)*_chessSquareU--(_chessSize+_chess_eps_cadre,0-_chess_eps_cadre)*_chessSquareU--(_chessSize+_chess_eps_cadre,_chessSize+_chess_eps_cadre)*_chessSquareU--(0-_chess_eps_cadre,_chessSize+_chess_eps_cadre)*_chessSquareU--cycle withpen pencircle scaled (0.1*_chessSquareU);
+ for i:=1 upto _chessSize:
+ for j:=1 upto _chessSize:
+ if(odd((i-1)*_chessSize+j+i)):
+ draw _whiteSquarePic
+ shifted ((j-1)*_chessSquareU,(i-1)*_chessSquareU) ;
+ else:
+ draw _blackSquarePic shifted ((j-1)*_chessSquareU,(i-1)*_chessSquareU) ;
+ fi
+ if(_chess_print_coords and (_chessSize=8)):
+ if(_chess_coords_inout): % coords inside the backboard
+ if(i=1): % lettre on first line
+ _letter_img:=image(
+ if(_chess_view_wb):
+ draw _int_to_letter_w(j) infont _coords_font;
+ else:
+ draw _int_to_letter_b(j) infont _coords_font;
+ fi
+ );
+ if(j=1):
+ _lettre_width:=abs(urcorner _letter_img-ulcorner _letter_img);
+ _lettre_height:=abs(urcorner _letter_img-lrcorner _letter_img);
+ fi
+ draw _letter_img scaled (0.1*_chessSquareU/_lettre_width) shifted ((j-1)*_chessSquareU+0.8*_chessSquareU,(i-1)*_chessSquareU+0.05*_chessSquareU) withcolor ((j mod 2)*_whiteColorSquare+(1-(j mod 2))*_blackColorSquare);
+ fi
+ if(j=1):
+ _letter_img:=image(
+ if(_chess_view_wb):
+ draw _int_to_str_w(i) infont _coords_font;
+ else:
+ draw _int_to_str_b(i) infont _coords_font;
+ fi
+ );
+ if(i=1):
+ _lettre_width:=abs(urcorner _letter_img-ulcorner _letter_img);
+ _lettre_height:=abs(urcorner _letter_img-lrcorner _letter_img);
+ fi
+ draw _letter_img scaled (0.1*_chessSquareU/_lettre_width) shifted ((j-1)*_chessSquareU+0.05*_chessSquareU,(i-1)*_chessSquareU+0.8*_chessSquareU) withcolor ((i mod 2)*_whiteColorSquare+(1-(i mod 2))*_blackColorSquare);
+ fi
+ else: % coords outside the backboard
+ if(i=1): % lettre on first line
+ _letter_img:=image(
+ if(_chess_view_wb):
+ draw _int_to_letter_w(j) infont _coords_font;
+ else:
+ draw _int_to_letter_b(j) infont _coords_font;
+ fi
+ );
+ if(j=1):
+ _lettre_width:=abs(urcorner _letter_img-ulcorner _letter_img);
+ _lettre_height:=abs(urcorner _letter_img-lrcorner _letter_img);
+ fi
+ draw _letter_img scaled (0.2*_chessSquareU/_lettre_width) shifted ((j-1)*_chessSquareU+0.5*(_chessSquareU-_lettre_width),(i-1)*_chessSquareU-0.5*_chessSquareU) withcolor black;
+ fi
+ if(j=1):
+ _letter_img:=image(
+ if(_chess_view_wb):
+ draw _int_to_str_w(i) infont _coords_font;
+ else:
+ draw _int_to_str_b(i) infont _coords_font;
+ fi
+ );
+ if(i=1):
+ _lettre_width:=abs(urcorner _letter_img-ulcorner _letter_img);
+ _lettre_height:=abs(urcorner _letter_img-lrcorner _letter_img);
+ fi
+ draw _letter_img scaled (0.2*_chessSquareU/_lettre_width) shifted ((j-1)*_chessSquareU-0.5*_chessSquareU,(i-1)*_chessSquareU+0.5*(_chessSquareU-_lettre_height)) withcolor black;
+ fi
+ fi
+ fi
+ endfor;
+ endfor;
+ if(_chess_view_wb): % white view
+ if(_chess_white_player<>""): % if white player
+ if((not _chess_coords_inout) or _chess_players_side): % if coord outside or option so set players to the site
+ label.urt(textext(_chess_white_player),(1.05*_chessSize*_chessSquareU,0));
+ else:
+ draw _chess_build_playername(_chess_white_player) shifted (0,-_chess_get_img_h(_chess_build_playername(_chess_white_player))+_chess_eps_cadre*_chessSquareU);
+ fi
+ fi
+ if(_chess_black_player<>""):
+ if((not _chess_coords_inout) or _chess_players_side):
+ label.lrt(textext(_chess_black_player),(1.05*_chessSize*_chessSquareU,_chessSize*_chessSquareU));
+ else:
+ draw _chess_build_playername(_chess_black_player) shifted (0,_chessSquareU*(_chessSize+2*_chess_eps_cadre));
+ fi
+ fi
+ else: % black view
+ if(_chess_black_player<>""):
+ if((not _chess_coords_inout) or _chess_players_side):
+ label.urt(textext(_chess_black_player),(1.05*_chessSize*_chessSquareU,0));
+ else:
+ draw _chess_build_playername(_chess_black_player) shifted (0,-_chess_get_img_h(_chess_build_playername(_chess_black_player)));
+ fi
+ fi
+ if(_chess_white_player<>""):
+ if((not _chess_coords_inout) or _chess_players_side):
+ label.lrt(textext(_chess_white_player),(1.05_chessSize*_chessSquareU,_chessSize*_chessSquareU));
+ else:
+ draw _chess_build_playername(_chess_white_player) shifted (0,_chessSquareU*(_chessSize+_chess_eps_cadre));
+ fi
+ fi
+ fi
+);
+enddef;
+
+def _int_to_piece(expr i)=
+ if(i=_intWPawn):
+ _chess_wP
+ elseif(i=_intBPawn):
+ _chess_bP
+ elseif(i=_intWKnight):
+ _chess_wN
+ elseif(i=_intBKnight):
+ _chess_bN
+ elseif(i=_intWBishop):
+ _chess_wB
+ elseif(i=_intBBishop):
+ _chess_bB
+ elseif(i=_intWRook):
+ _chess_wR
+ elseif(i=_intBRook):
+ _chess_bR
+ elseif(i=_intWQueen):
+ _chess_wQ
+ elseif(i=_intBQueen):
+ _chess_bQ
+ elseif(i=_intWKing):
+ _chess_wK
+ elseif(i=_intBKing):
+ _chess_bK
+ fi
+enddef;
+
+def _triangle(expr s)=
+ ((0,0)--(1,0)--(0.5,0.5)--cycle) scaled (s*_chessSquareU)
+enddef;
+
+color _chess_last_move_color;
+
+_chess_last_move_color:=(0.6078,0.7803,0);
+
+
+def set_last_move_color(expr c)=
+ _chess_last_move_color:=c;
+enddef;
+
+def show_last_move(expr k)=
+ if(k>0):
+ for i:=1 upto _chessSize:
+ for j:=1 upto _chessSize:
+ if(chessboard_table[k][i][j]<>chessboard_table[k-1][i][j]):
+ if(_chess_view_wb):%white side
+ _chess_color_square(_chess_last_move_color,i,j);
+ else:
+ _chess_color_square(_chess_last_move_color,8+1-i,8+1-j);
+ fi
+ fi
+ endfor
+ endfor
+ fi
+enddef;
+
+
+vardef _chess_build_chessboard_pic(expr k)=
+ save chessboard_pic;
+ save shiftPiece;
+ pair shiftPiece;
+ picture chessboard_pic;
+ chessboard_pic:= image(
+ %draw backboard;
+ for i:=1 upto _chessSize:
+ for j:=1 upto _chessSize:
+ if(chessboard_table[k][i][j] <> 0):
+ if(_chess_view_wb):
+ shiftPiece:=((i-1)*_chessSquareU,(j-1)*_chessSquareU);
+ else:
+ shiftPiece:=((_chessSize-i)*_chessSquareU,(_chessSize-j)*_chessSquareU);
+ fi
+ draw ( _int_to_piece(chessboard_table[k][i][j]) shifted shiftPiece);
+ fi
+ endfor;
+ endfor;
+ if(show_whos_to_move):
+ if(_chess_view_wb): %white side
+ if(not _white_to_move):
+ fill _triangle(0.3) rotated 180 shifted (_chessSquareU*(_chessSize+0.35),_chessSquareU*(_chessSize)+0.3*_chessSquareU)
+ else:
+ draw _triangle(0.35) shifted (_chessSquareU*(_chessSize+0.3),-0.3*_chessSquareU) ;
+ fi
+ else: % black side
+ if(_white_to_move):
+ draw _triangle(0.3) rotated 180 shifted (_chessSquareU*(_chessSize+0.35),_chessSquareU*(_chessSize)+0.3*_chessSquareU)
+ else:
+ fill _triangle(0.35) shifted (_chessSquareU*(_chessSize+0.3),-0.3*_chessSquareU) ;
+ fi
+ fi
+ fi
+ );
+ chessboard_pic
+enddef;
+
+vardef chessboard_step(expr k) =
+ save chessboard_pic;
+ picture chessboard_pic;
+ if((k mod 2)=0):
+ set_white_to_move;
+ else:
+ set_black_to_move;
+ fi
+ chessboard_pic:=_chess_build_chessboard_pic(k);
+ chessboard_pic
+enddef;
+
+vardef chessboard =
+ save chessboard_pic;
+ picture chessboard_pic;
+ chessboard_pic:=_chess_build_chessboard_pic(0);
+ chessboard_pic
+enddef;
+
+
+%%% colored square
+picture _chess_colored_squared;
+vardef color_square(expr c)(text slist)=
+ % c: color
+ % s: list of algebraic notation for a square (ex: "e5","f6",etc.)
+ save _i,_j,_str;
+ for _str = slist:
+ _i:=_lettre_to_int(_get_char(_str,0));
+ _j:=_str_to_int(_get_char(_str,1));
+ path ss;
+ if(_chess_view_wb):%white side
+ ss:=(unitsquare scaled _chessSquareU) shifted
+ ((_i-1)*_chessSquareU,(_j-1)*_chessSquareU);
+ else:
+ ss:=(unitsquare scaled _chessSquareU) shifted
+ ((8+1-_i-1)*_chessSquareU,(8+1-_j-1)*_chessSquareU);
+ fi
+ transparence(ss,c,0.41);
+ endfor
+enddef;
+
+vardef _chess_color_square(expr c,i,j)=
+ % c: color
+ % s: algebraic notation for a square (ex: e5)
+ path ss;
+ ss:=(unitsquare scaled _chessSquareU) shifted ((i-1)*_chessSquareU,(j-1)*_chessSquareU);
+ transparence(ss,c,0.41);
+enddef;
+
+%% "inspired" by Thruston’s code:
+% https://github.com/thruston/Drawing-with-Metapost
+def transparence(expr p,c,a)=
+ save shape,alpha,filler,bg,fg;
+ path shape;
+ shape := p;
+ alpha := a; % alpha: 0=invisible, 1=opaque
+ color filler;
+ filler = c;
+ picture fg, bg;
+ bg = currentpicture; % capture the current drawing
+ fg = image(
+ for e within bg: % redraw everything in blended color
+ draw e withcolor alpha[colorpart e, filler];
+ endfor % and add some decorations
+ );
+ clip fg to shape; % now clip the fg drawing to the shape
+ fill shape withcolor filler; % fill the shape
+ draw fg; % and put the fg drawing on top
+enddef;
+
+
+% draw arrow on the board between two algebraic notation
+% depending on the syntax, strat line or rectangular one
+% s="a2--a4" or s="b1|-c3" or s="b1-|c3"
+% allow a list of string
+_chess_arrow_width:=0.08*_chessSquareU;
+_chess_arrow_head:=0.4*_chessSquareU;
+
+def set_arrow_width(expr c)=
+ _chess_arrow_width:=c*_chessSquareU;
+enddef;
+
+def draw_arrows(expr c)(text slist)=
+ save _chess_arrow,_str;
+ save _i,_j,_k,_l,_vec,_ortho_vec,_unit_vec,_init,_end;
+ pair _vec,_unit_vec,_ortho_vec,_init,_end;
+ path _chess_arrow;
+ for _str = slist:
+ _i:=_lettre_to_int(_get_char(_str,0));
+ _j:=_str_to_int(_get_char(_str,1));
+ _k:=_lettre_to_int(_get_char(_str,4));
+ _l:=_str_to_int(_get_char(_str,5));
+ if(_chess_view_wb): %white side
+ _end:=(_k,_l)*_chessSquareU-(0.5,0.5)*_chessSquareU;
+ _init:=(_i,_j)*_chessSquareU-(0.5,0.5)*_chessSquareU;
+ else:
+ _end:=(8-_k,8-_l)*_chessSquareU+(0.5,0.5)*_chessSquareU;
+ _init:=(8-_i,8-_j)*_chessSquareU+(0.5,0.5)*_chessSquareU;
+ fi
+ if((substring (2,4) of _str)="--"):
+ _vec:= _end-_init;
+ _unit_vec:=_chess_unit_vec(_vec);
+ _init:=_init+0.2*_chessSquareU*_unit_vec;
+ _end:=_end-0.2*_chessSquareU*_unit_vec;
+ _vec:= _end-_init;
+ _unit_vec:=_chess_unit_vec(_vec);
+ _ortho_vec:=_chess_unit_ortho_vec(_vec);
+ _vec_norm:=abs(_vec);
+ _chess_arrow:=_init--(_init+(_chess_arrow_width*_ortho_vec))--
+ (_init+(_chess_arrow_width*_ortho_vec)+((_vec_norm-_chess_arrow_head)*_unit_vec))--
+ (_init+(_chess_arrow_width*_ortho_vec)+((_vec_norm-_chess_arrow_head)*_unit_vec)+(2*_chess_arrow_width*_ortho_vec))--
+ _end --
+ (_init-(_chess_arrow_width*_ortho_vec)+((_vec_norm-_chess_arrow_head)*_unit_vec)-(2*_chess_arrow_width*_ortho_vec))--
+ (_init-(_chess_arrow_width*_ortho_vec)+((_vec_norm-_chess_arrow_head)*_unit_vec))--
+ (_init-(_chess_arrow_width*_ortho_vec))--cycle;
+ elseif((substring (2,4) of _str)="|-"):
+ if((xpart _end)> (xpart _init)): % to the right
+ _pm_rl:=+1;
+ else:
+ _pm_rl:=-1;
+ fi
+ if((ypart _end)>(ypart _init)): % to the to
+ _pm_ul:=+1;
+ else:
+ _pm_ul:=-1;
+ fi
+ _init:=(xpart _init, ypart _init+0.2*(_pm_ul*_chessSquareU));
+ _end:=(xpart _end-0.2*(_pm_rl*_chessSquareU),ypart _end);
+ _chess_arrow:=(_init-_pm_rl*(_chess_arrow_width,0))--
+ (xpart _init -_pm_rl*_chess_arrow_width, ypart _end + _pm_ul*_chess_arrow_width)--
+ (xpart _end-_pm_rl*_chess_arrow_head, ypart _end + _pm_ul*_chess_arrow_width)--
+ (xpart _end-_pm_rl*_chess_arrow_head, ypart _end + 3*_pm_ul*_chess_arrow_width)--
+ _end--
+ (xpart _end-_pm_rl*_chess_arrow_head, ypart _end - 3*_pm_ul*_chess_arrow_width)--
+ (xpart _end-_pm_rl*_chess_arrow_head, ypart _end - _pm_ul*_chess_arrow_width)--
+ (xpart _init +_pm_rl*_chess_arrow_width, ypart _end - _pm_ul*_chess_arrow_width) --
+ (_init+_pm_rl*(_chess_arrow_width,0))--cycle;
+ elseif((substring (2,4) of _str)="-|"):
+ if((xpart _end)>(xpart _init)): % to the right
+ _pm_rl:=+1;
+ else:
+ _pm_rl:=-1;
+ fi
+ if((ypart _end)>(ypart _init)): % to the to
+ _pm_ul:=+1;
+ else:
+ _pm_ul:=-1;
+ fi
+ _init:=(xpart _init +0.2*(_pm_rl*_chessSquareU), ypart _init);
+ _end:=(xpart _end,ypart _end-0.2*(_pm_ul*_chessSquareU));
+ _chess_arrow:=(_init+_pm_ul*(0,_chess_arrow_width))--
+ (xpart _end -_pm_rl*_chess_arrow_width, ypart _init + _pm_ul*_chess_arrow_width)--
+ (xpart _end -_pm_rl*_chess_arrow_width,ypart _end-_pm_ul*_chess_arrow_head)--
+ (xpart _end -3*_pm_rl*_chess_arrow_width,ypart _end-_pm_ul*_chess_arrow_head)--
+ _end--
+ (xpart _end +3*_pm_rl*_chess_arrow_width,ypart _end-_pm_ul*_chess_arrow_head)--
+ (xpart _end +_pm_rl*_chess_arrow_width,ypart _end-_pm_ul*_chess_arrow_head)--
+ (xpart _end +_pm_rl*_chess_arrow_width, ypart _init - _pm_ul*_chess_arrow_width)--
+ (_init-_pm_ul*(0,_chess_arrow_width))--cycle;
+
+ fi
+ %draw _chess_arrow;
+ transparence(_chess_arrow,c,0.91);
+ endfor
+enddef;
+
+vardef _chess_unit_ortho_vec(expr p)=
+ save _out;
+ pair _out;
+ _out := p rotated 90 scaled (1/abs(p));
+ _out
+enddef;
+
+
+vardef _chess_unit_vec(expr p)=
+ save _out;
+ pair _out;
+ _out := p scaled (1/abs(p));
+ _out
+enddef;
+
+
+def draw_circles(expr c)(text slist)=
+ save _str;
+ save _i,_j;
+ for _str = slist:
+ _i:=_lettre_to_int(_get_char(_str,0));
+ _j:=_str_to_int(_get_char(_str,1));
+ if(_chess_view_wb): % white side
+ draw (fullcircle scaled (0.95*_chessSquareU)) shifted
+ ((_i-0.5,_j-0.5)*_chessSquareU) withpen pencircle scaled
+ (0.08*_chessSquareU) withcolor c;
+ else:
+ draw (fullcircle scaled (0.95*_chessSquareU)) shifted
+ ((8+1-_i-0.5,8+1-_j-0.5)*_chessSquareU) withpen pencircle scaled
+ (0.08*_chessSquareU) withcolor c;
+ fi
+ endfor;
+enddef;
+
+def draw_crosses(expr c)(text slist)=
+ save _str;
+ save _i,_j;
+ for _str = slist:
+ _i:=_lettre_to_int(_get_char(_str,0));
+ _j:=_str_to_int(_get_char(_str,1));
+ if(_chess_view_wb):% white side
+ draw (((-0.45,-0.45)--(0.45,0.45)) scaled (0.95*_chessSquareU)) shifted ((_i-0.5,_j-0.5)*_chessSquareU) withpen pencircle scaled (0.1*_chessSquareU) withcolor c;
+ draw (((-0.45,0.45)--(0.45,-0.45)) scaled (0.95*_chessSquareU)) shifted
+ ((_i-0.5,_j-0.5)*_chessSquareU) withpen pencircle scaled
+ (0.1*_chessSquareU) withcolor c;
+ else:
+ draw (((-0.45,-0.45)--(0.45,0.45)) scaled (0.95*_chessSquareU)) shifted ((8+1-_i-0.5,8+1-_j-0.5)*_chessSquareU) withpen pencircle scaled (0.1*_chessSquareU) withcolor c;
+ draw (((-0.45,0.45)--(0.45,-0.45)) scaled (0.95*_chessSquareU)) shifted
+ ((8+1-_i-0.5,8+1-_j-0.5)*_chessSquareU) withpen pencircle scaled
+ (0.1*_chessSquareU) withcolor c;
+ fi
+ endfor;
+enddef;
+
+
+
+% clip current chessboard to the area of type "a2-f7"
+def clip_chessboard(expr s)=
+ save _first_letter,_firt_nbr, _second_letter,_second_nbr,_fl,_fn,_sl,_sn,_str;
+ string _first_letter,_first_nbr, _second_letter,_second_nbr,_str;
+ _str:=s;
+ _first_letter:=substring (0,1) of _str;
+ _first_nbr:=substring (1,2) of _str;
+ _second_letter:=substring (3,4) of _str;
+ _second_nbr:=substring (4,5) of _str;
+ _fl:=_lettre_to_int(_first_letter)-1;
+ _fn:=_str_to_int(_first_nbr)-1;
+ _sl:=_lettre_to_int(_second_letter);
+ _sn:=_str_to_int(_second_nbr);
+ clip currentpicture to (_fl,_fn)*_chessSquareU--(_fl,_sn)*_chessSquareU--(_sl,_sn)*_chessSquareU--(_sl,_fn)*_chessSquareU--cycle;
+enddef;
+
+% reset backboard
+def reset_mpchess=
+ _chessWidth:=5cm;
+ _chessSize:=8;
+ _chessSquareU:=_chessWidth/_chessSize;
+ _chessTheme := "BlueLichess";
+ _blackColorSquare:=(0.549,0.6353,0.6784);
+ _whiteColorSquare:=(0.8706,0.8912,0.902);
+ _chess_print_coords:=true;
+ _chess_coords_inout:=true;
+ _chess_view_wb := true; % true for white
+ _chess_players_side:=false;
+ _chess_eps_cadre := 0.05;
+ _chess_last_move_color:=(0.6078,0.7803,0);
+ _chess_arrow_width:=0.2*_chessSquareU;
+ _chess_arrow_head:=0.6*_chessSquareU;
+ clear_chessboard;
+ _chess_wcaptures_nbr[0]:=0;
+ _chess_bcaptures_nbr[0]:=0;
+ set_color_theme("BlueLichess");
+ set_pieces_theme("cburnett");
+ _chess_white_player:="";
+ _chess_black_player:="";
+enddef;
+
+color _commentColor;
+_commentColor:=(0.6,0.2,0.2);
+
+def set_comment_color(expr c)=
+ _commentColor:=c;
+enddef;
+
+_commentScale:=0.2;
+
+def draw_comment(expr ind, pos)=
+ save _img, _letter, _nbr;
+ picture _img;
+ _img:=image(
+ draw textext("\bfseries"&ind);
+ );
+ _width:=abs(urcorner _img-ulcorner _img);
+ _height:=abs(urcorner _img-lrcorner _img);
+ _img:=image(
+ fill fullcircle scaled (2*max(_width,_height)) shifted (0.5*_width,0.5*_height) withcolor 0.8[_commentColor,white];
+ draw fullcircle scaled (2*max(_width,_height)) shifted (0.5*_width,0.5*_height) withcolor _commentColor;
+ draw _img;
+ );
+ _letter:=_lettre_to_int(_get_char(pos,0));
+ _nbr:=_str_to_int(_get_char(pos,1));
+ if(_chess_view_wb): % white view
+ draw _img scaled (_commentScale*_chessSquareU/max(_width,_height)) shifted ((_letter)*_chessSquareU-0.15*(_chessSquareU-_width),(_nbr)*_chessSquareU-0.15*_chessSquareU);
+ else:
+ draw _img scaled (_commentScale*_chessSquareU/max(_width,_height)) shifted ((8+1-_letter)*_chessSquareU-0.15*(_chessSquareU-_width),(8+1-_nbr)*_chessSquareU-0.15*_chessSquareU);
+ fi
+enddef; \ No newline at end of file