diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/third/games/games-chess.tex')
-rw-r--r-- | Master/texmf-dist/tex/context/third/games/games-chess.tex | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/third/games/games-chess.tex b/Master/texmf-dist/tex/context/third/games/games-chess.tex new file mode 100644 index 00000000000..642f37b0b5a --- /dev/null +++ b/Master/texmf-dist/tex/context/third/games/games-chess.tex @@ -0,0 +1,331 @@ +%D \module +%D [ file=games-chess, +%D version=2008.01.10, +%D title=\CONTEXT\ User Module, +%D subtitle=Chess, +%D author=Wolfgang Schuster, +%D date=\currentdate, +%D copyright=Wolfgang Schuster, +%D email=schuster.wolfgang@googlemail.com, +%D license=Public Domain] + +\unprotect + +\startinterface all + \setinterfacevariable {field} {field} + \setinterfacevariable {piece} {piece} + \setinterfacevariable {black} {black} + \setinterfacevariable {white} {white} + \setinterfacevariable {king} {king} + \setinterfacevariable {queen} {queen} + \setinterfacevariable {rook} {rook} + \setinterfacevariable {bishop} {bishop} + \setinterfacevariable {knight} {knight} + \setinterfacevariable {pawn} {pawn} + \setinterfacevariable {mask} {mask} + \setinterfacevariable {skaknew} {skaknew} +\stopinterface + +\definegame[\v!chess][\v!chess] + +\def\chess!commands + {newboard,drawboard,piece,fen} + +\def\chess!copygamecommands + {\expanded{\copyparameters[][chess!][\chess!commands]}} + +\setvalue{\e!begin\????gm\????gm\v!chess}% + {\chess!copygamecommands + \doifsomething{\gameparameter\c!bodyfont}{\switchtobodyfont[\gameparameter\c!bodyfont]}% + \chess!boardsize + \chess!inputtype} + +\def\chess!inputtype + {\doif{\gameparameter\c!option}\v!pgn\chess!inputtype!pgn} + +\def\chess!inputtype!pgn + {\grabuntil{\if!!gameenvironment\e!stop\currentname\else\s!do\e!stop\v!game\fi}\dochess!inputtype!pgn} + +\long\def\dochess!inputtype!pgn#1% + {\newboard + \parsepgn{#1}% + \drawboard + \dostopgame} + +\def\chess!boardsize + {\ctxlua{thirddata.games.chess.setup.nx = \number\gameparameter\c!nx }% + \ctxlua{thirddata.games.chess.setup.ny = \number\gameparameter\c!ny }} + +\def\chess!newboard + {\ctxlua{thirddata.games.chess.board_new()}% + \chess!fen{rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}} + +\def\chess!drawboard + {\doifnot{\gameparameter\c!interactive}\v!yes + {\chess!setboard{0}% + \chess!getboard{0}}} + +\def\chess!drawboard + {\ctxlua{thirddata.games.chess.board_draw()}} + +\def\chess!setboard#1% + {\ctxlua{thirddata.games.chess.board_draw("games:chess:#1")}} + +\def\chess!getboard#1% + {\uniqueMPgraphic{games:chess:#1}} + +%D \macros +%D {piece} +%D +%D \starttyping +%D \piece[black,pawn]{3}{4} +%D \piece[P]{3}{4} +%D \stoptyping + +\def\chess!piece[#1]#2#3% low level command to place chess pieces + {\bgroup + \doifelse{#1}{empty} + {\ctxlua{thirddata.games.chess.field[0][#2][#3] = { color = nil, piece = nil }}} + {\processallactionsinset + [#1] + [ black=>\let\color\v!black, + white=>\let\color\v!white, + king=>\let\piece\v!king, + queen=>\let\piece\v!queen, + rook=>\let\piece\v!rook, + bishop=>\let\piece\v!bishop, + knight=>\let\piece\v!knight, + pawn=>\let\piece\v!pawn, + k=>\let\color\v!black\let\piece\v!king, + q=>\let\color\v!black\let\piece\v!queen, + r=>\let\color\v!black\let\piece\v!rook, + b=>\let\color\v!black\let\piece\v!bishop, + n=>\let\color\v!black\let\piece\v!knight, + p=>\let\color\v!black\let\piece\v!pawn, + K=>\let\color\v!white\let\piece\v!king, + Q=>\let\color\v!white\let\piece\v!queen, + R=>\let\color\v!white\let\piece\v!rook, + B=>\let\color\v!white\let\piece\v!bishop, + N=>\let\color\v!white\let\piece\v!knight, + P=>\let\color\v!white\let\piece\v!pawn, + empty=>\let\color\v!empty\let\piece\v!empty]% + \ctxlua{thirddata.games.chess.field[0][#2][#3] = { color = "\color", piece = "\piece" }}}% + \egroup} + +\def\chess!move[#1]#2#3#4% low level command to place chess pieces + {\bgroup + \doifsomethingelse{#4} + {\doifnumberelse{#4} + {\edef\file{nil}% + \edef\rank{"#4"}} + {\edef\file{"\pgnnumber{#4}"}% + \edef\rank{nil}}} + {\edef\file{nil}% + \edef\rank{nil}}% + \processallactionsinset + [#1] + [black=>\let\color\v!black, + white=>\let\color\v!white, + K=>\let\piece\v!king, + Q=>\let\piece\v!queen, + R=>\let\piece\v!rook, + B=>\let\piece\v!bishop, + N=>\let\piece\v!knight, + P=>\let\piece\v!pawn]% + \ctxlua{thirddata.games.chess.field[0][#2][#3] = { color = "\color", piece = "\piece" }}% + \ctxlua{thirddata.games.chess.processmove('\piece','\color',#2,#3,\file,\rank)}% + \doif{\gameparameter\c!interactive}\v!yes\chess!symbol + \egroup} + +\def\chess!capture[#1]#2#3#4% low level command to place chess pieces + {\bgroup + \doifsomethingelse{#4} + {\doifnumberelse{#4} + {\edef\file{nil}% + \edef\rank{"#4"}} + {\edef\file{"\pgnnumber{#4}"}% + \edef\rank{nil}}} + {\edef\file{nil}% + \edef\rank{nil}}% + \processallactionsinset + [#1] + [black=>\let\color\v!black, + white=>\let\color\v!white, + K=>\let\piece\v!king, + Q=>\let\piece\v!queen, + R=>\let\piece\v!rook, + B=>\let\piece\v!bishop, + N=>\let\piece\v!knight, + P=>\let\piece\v!pawn]% + \ctxlua{thirddata.games.chess.field[0][#2][#3] = { color = "\color", piece = "\piece" }}% + \ctxlua{thirddata.games.chess.capturemove('\piece','\color',#2,#3,\file,\rank)}% + \doif{\gameparameter\c!interactive}\v!yes\chess!symbol + \egroup} + +\def\chess!symbol + {\chess!drawboard\blank} + +%\def\chess!symbol +% {\startTEXpage\chess!drawboard\stopTEXpage} + +% quick and dirty solution, did not work with numbers for empty fields + +\newcount\chess!row +\newcount\chess!col + +\def\chess!fen#1% + {\@EA\dochess!fen#1\end} + +\def\dochess!fen#1 #2 #3 #4 #5 #6\end + {\chess!row=9 % ny + 1 + \@EA\processseparatedlist\@EA[#1][/]\chess!initposition} + +\def\chess!initposition#1% + {\advance\chess!row by -1 + \chess!col=0 + \handletokens#1\with\dochess!initposition} + +\def\dochess!initposition#1% + {\doifnumberelse{#1} + {\dorecurse{#1}{\dodochess!initposition{empty}}} + {\dodochess!initposition{#1}}} + +\def\dodochess!initposition#1% + {\advance\chess!col by 1 + \chess!piece[#1]{\number\chess!col}{\number\chess!row}} + +%D \macros +%D {startchessfield} +%D +%D \starttyping +%D \startchessfield +%D {fieldmask} +%D {piecemask} +%D {field} +%D {piece} +%D \stopchessfield +%D \stoptyping + +\def\startchessfield + {\bgroup + \scratchdimen\currentfontbodyscale\scaledfontsize + \let\stopchessfield\egroup + \processboxes\dochessfield} + +\def\dochessfield + {%\nextboxht\scratchdimen % original afm files for skaknew have + %\nextboxdp\zeropoint % wrong values for height and depth + \setbox\processbox\normalhbox to \scratchdimen + {\normalhbox to \scratchdimen{\box\processbox\hss}% + \hskip-\scratchdimen + \normalhbox to \scratchdimen{\box\nextbox\hss}}}% + +%D Fonts + +% I need to integrate this in the setup mechanism + +\input games-chess-symbols + +\def\ChessSymbol#1{\getglyph{\gameparameter\s!font}{\utfchar{#1}}} + +\def\chesssymbol#1{\symbol[\gameparameter\c!symbolset][#1]} + +\long\def\pgnflush#1{\ctxlua{thirddata.games.pgn.parse('#1')}} + +\def\pgnnumber#1% + {\number\numexpr`#1-96\relax} + +\starttexdefinition parsepgn #1 + \pgnflush{#1} +\stoptexdefinition + +\starttexdefinition pgn!tag #1#2 + \processaction + [#1] + [FEN=>\chess!fen{#2}]% +\stoptexdefinition + +%D Move + +% #1 = Piece +% #2 = Capture +% #3 = Destination +% #4 = Check + +\chardef\chess!move!color\plustwo % 1 = white, 2 = black + +\newcount\chess!field!token + +\starttexdefinition pgn!move #1#2#3#4 + \bgroup + \ifnum\chess!move!color=\plusone + \let\valued\v!black + \global\chardef\chess!move!color\plustwo + \else + \let\valued\c!white + \global\chardef\chess!move!color\plusone + \fi + \counttokens#3\to\chess!field!token + \ifnum\chess!field!token=3 + \def\valuea##1##2##3\end{\pgnnumber {##2}} + \def\valueb##1##2##3\end{\purenumber{##3}} + \def\valuec##1##2##3\end{##1} + \else + \def\valuea ##1##2\end{\pgnnumber {##1}} + \def\valueb ##1##2\end{\purenumber{##2}} + \def\valuec ##1##2\end{} + \fi + \def\valuee##1x\end{##1} + \doifsomethingelse{#2} + {\doifsomethingelse{#1} + {\expanded{\chess!capture[#1,\valued]{\valuea#3\end}{\valueb#3\end}{\valuee#2\end}}} + {\expanded{\chess!capture [P,\valued]{\valuea#3\end}{\valueb#3\end}{\valuee#2\end}}}} + {\doifsomethingelse{#1} + {\expanded{\chess!move[#1,\valued]{\valuea#3\end}{\valueb#3\end}{\valuec#3\end}}} + {\expanded{\chess!move [P,\valued]{\valuea#3\end}{\valueb#3\end}{\valuec#3\end}}}} + \egroup +\stoptexdefinition + +\starttexdefinition pgn!number #1 + \donothing +\stoptexdefinition + +\starttexdefinition pgn!castling #1 + \ifnum\chess!move!color=\plusone + \global\chardef\chess!move!color\plustwo + \startlua + thirddata.games.chess.field[0][5][8] = { color = nil, piece = nil } + thirddata.games.chess.field[0][6][8] = { color = "black", piece = "rook" } + thirddata.games.chess.field[0][7][8] = { color = "black", piece = "king" } + thirddata.games.chess.field[0][8][8] = { color = nil, piece = nil } + \stoplua + \else + \global\chardef\chess!move!color\plusone + \startlua + thirddata.games.chess.field[0][5][1] = { color = nil, piece = nil } + thirddata.games.chess.field[0][6][1] = { color = "white", piece = "rook" } + thirddata.games.chess.field[0][7][1] = { color = "white", piece = "king" } + thirddata.games.chess.field[0][8][1] = { color = nil, piece = nil } + \stoplua + \fi + \doif{\gameparameter\c!interactive}\v!yes\chess!symbol +\stoptexdefinition + +\starttexdefinition pgn!result #1 + \donothing +\stoptexdefinition + +\ctxloadluafile{games-chess}{} + +\setupgame + [\v!chess] + [\c!interactive=\v!no, + \c!bodyfont=, + \c!size=8, + \c!nx=\gameparameter\c!size, + \c!ny=\gameparameter\c!size, + \c!symbolset=skaknew, + \s!font=\gameparameter\c!symbolset, + \c!option=\v!tex] + +\protect \endinput |