summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/third/games/games-chess.tex
diff options
context:
space:
mode:
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.tex331
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