% \iffalse % ==================================================================== % \fi % % \subsection{The \texttt{wgexport} class} % \label{sec:impl:util} % % This document class is used for exporting game component to be used % in a VASSAL module % libraries. % % \iffalse %<*exportcls> %\fi % % Class identification and load \texttt{wargame} package % % \begin{macrocode} \ProvidesClass{wgexport} \PassOptionsToClass{multi=tikzpicture,varwidth=false}{standalone} \DeclareOption{noterrainpic}{% \PassOptionsToPackage{\CurrentOption}{wargame}} \DeclareOption{terrainpic}{% \PassOptionsToPackage{\CurrentOption}{wargame}} \DeclareOption*{% \PassOptionsToClass{\CurrentOption}{standalone}} \ProcessOptions\relax \LoadClass{standalone} \RequirePackage{wargame} % \end{macrocode} % % We need a few utilities before we get to the actual environment. % First, we need a tools to write out literal left and right curly % braces. We do a bit of catcode hackery to accomplish that. % % \begin{macrocode} \begingroup \catcode`\^^I=12 \def\@tabchar{^^I} \catcode`<=1 \catcode`>=2 \catcode`{=12 \catcode`}=12 \gdef\@lbchar<{> \gdef\@rbchar<}> \endgroup % \end{macrocode} % % Above, we temporarily set the tab, and left and right curly brace % characters to be regular letters (12), and the catcodes of less than % and greater than to be those of left and right curly braces % respectively. We then define the macros \cs{@tabchar}, % \cs{@lbchar}, and \cs{@rbchar} to produce literal characters. % \LaTeX already has \cs{@percentchar}. % % Everything we do should go inside this environment. The single % optional argument is the file name stem of the output JSON file. % % \begin{macrocode} \newenvironment{imagelist}[1][\jobname]{% \newwrite\mk@out% \def\mk@i{}% \def\mk@w{\immediate\write\mk@out}% \immediate\openout\mk@out=#1.json \mk@w{[} }{ \mk@w{\mk@i \@lbchar "name":"End of list", "category": "<>", "subcategory": "" \@rbchar } \mk@w{]} \immediate\closeout\mk@out } % \end{macrocode} % % % Preceed all images (\textsf{tikzpicture}) with this command % % % First argument is the name of the image. This can be anything. % Note that for counters, if the name ends in \texttt{flipped} then it % is considered the backside of a counter. % % Second argument is the type of image. Recognised types are % % \begin{itemize} % \item \texttt{board} for boards % \item \texttt{oob} for OOBs % \item \texttt{chart} for charts % \item \texttt{counter} for counters % \item \texttt{front} for front page % \end{itemize} % % Other types can be used, and the images will be exported, but the % Python script pays no particular attention to those then. Use for % example to prepare images for help or the like. % % The third argument is the sub type. This is most relevant for the % counters. Sub types can be anything, but since the counters will % receive different prototypes based on the sub type, it makes sense % to divide into sub types a la % % \begin{itemize} % \item factions % \item common markers % \end{itemize} % % The faction sub types should just be the name of the faction. % E.g., Allies, Axis, Soviet, NATO, Warsaw Pact. Spaces should not % matter. % % For common markers, there are a few names that are recognised % specifically by the Python script. These are % % \begin{itemize} % \item \texttt{common} % \item \texttt{all} % \item \texttt{marker} % \item \texttt{markers} % \end{itemize} % % Counters that has these sub-types will no be considered to belong % to any faction. % % Note that the Python script uses the faction names to guess the % players of the game, and uses them in several places. % % % \begin{macrocode} \def\info{% \@ifstar{\@@info{,}}{\@@info{\@rbchar,}}} \def\@@info#1#2#3#4{% \chit@dbg{2}{Making image `#2' of type `#3'/`#4' on page \thepage}% \mk@w{ \@lbchar}% \mk@w{ \space "name": "#2",}% \mk@w{ \space "category": "#3",}% \mk@w{ \space "subcategory": "#4", }% \mk@w{ \space "number": \thepage #1}% \let\oldmk@i\mk@i% \ifx#1,\relax\edef\mk@i{\mk@i\space\space}\fi} \def\end@info{% \let\mk@i\oldmk@i% \mk@w{ \space \@rbchar,}} % \end{macrocode} % % Make separate images for each counter (single sided). % % First optional argument is the group to put the chits into. % Second optional argument is options to give to each Tikz picture % environment. Third, mandatory, argument is the list of chit % identifiers to render. % % \begin{macrocode} \def\wg@add@drop@margin{% \@ifundefined{wg@drop@margin}{}{ \dimen0=\wg@drop@margin % \ifwg@chit@drop \ifdim\dimen0>0pt% \path ($(current bounding box.north east)+(45:\wg@drop@margin)$) -- ($(current bounding box.south west)+(225:\wg@drop@margin)$); \fi}} \def\chitimages{% \@ifnextchar[{\@chitimages}{\chitimages[]}%] }% \def\@chitimages[#1]{% \@ifnextchar[{\@@chitimages[#1]}{\@@chitimages[#1][]}%] }% \def\@@chitimages[#1][#2]#3{% \begingroup% \let\chit@report\do@chit@report% \let\natoapp@report\do@natoapp@report% \chit@dbg{2}{chits to make images of `#3'}% \foreach[count=\ti from 0] \t/\x in #3{% \chit@dbg{2}{^^JRow: `\t' (`\x')} \ifx\t\empty\else% Ignore empty rows \chit@dbg{5}{^^JSubcategory: `\x' (default `#1')} % Take sub-category or default \ifx\t\x\def\x{#1}\else\ifx\x\empty\def\x{#1}\fi\fi \foreach \u/\m in \t{% \ifx\u\empty\else% Ignore empty cells \ifx\u\chit@blank\else% \chit@dbg{2}{Next chit `\u' with possible multiplicity `\m'}% \ifx\m\@empty\def\m{1}\fi% If no multiplicity defined \ifx\u\m\def\m{1}\fi% If the same as unit \chit@dbg{2}{Next chit `\u' multiplicity `\m'}% %% We only make one copy of the chit, since we can duplicate %% it in VASSAL \info*{\u}{counter}{\x} \nopagecolor% \gdef\wg@drop@margin{0pt}% \begin{tikzpicture}[chit has drop=false,#2] \chit[\u=\ti]% \wg@add@drop@margin% \end{tikzpicture} \end@info% %% \foreach \n in {1,...,\m}{% Make a number of copies %% \ifx\u\chit@blank% %% \chit@dbg{3}{Ignoring blank chit:\u}% %% \else% %% \info{\u}{counter}{#2} %% \begin{tikzpicture} %% \chit[\u=\ti](\c,\r)% %% \end{tikzpicture} %% \fi% %% }% \fi% \fi% }% \chit@dbg{2}{End of inner loop}% \fi% }% \chit@dbg{2}{End of outer loop}% \endgroup% } % \end{macrocode} % % Make separate images for each counter (double sided). The back-side % counters must be defined by append `\texttt{ flipped}' the front % face name. % % First optional argument is the group to put the chits into. % Second optional argument is options to give to each Tikz picture % environment. Third, mandatory, argument is the list of chit % identifiers to render. % % \begin{macrocode} \def\doublechitimages{% \@ifnextchar[{\@doublechitimages}{\doublechitimages[]}%] }% \def\@doublechitimages[#1]{% \@ifnextchar[{\@@doublechitimages[#1]}{\@@doublechitimages[#1][]}%] }% \def\@@doublechitimages[#1][#2]#3{% \begingroup% \let\chit@report\do@chit@report% \let\natoapp@report\do@natoapp@report% \foreach[count=\ti from 0] \t/\x in #3{% \ifx\t\empty\else% Ignore empty rows \chit@dbg{5}{^^JSubcategory: `\x' (default `#1')} % Take sub-category or default \ifx\t\x\def\x{#1}\else\ifx\x\empty\def\x{#1}\fi\fi \foreach \u/\m in \t{% \ifx\u\empty\else% Ignore empty cells \ifx\u\chit@blank\else% \chit@dbg{2}{Next chit `\u' with possible multiplicity `\m'}% \ifx\m\@empty\def\m{1}\fi% If not multiplicity defined \ifx\u\m\def\m{1}\fi% If the same as unit \chit@dbg{2}{Next chit `\u' multiplicity `\m'}% %% Flipped chit \edef\s{\u\space flipped}% %% We only make one copy of the chit, since we can duplicate %% it in VASSAL \info*{\u}{counter}{\x}% \nopagecolor% \gdef\wg@drop@margin{0pt}% \begin{tikzpicture}[chit has drop=false,#2]% \chit[\u=\ti]% \wg@add@drop@margin% \end{tikzpicture}% \end@info% \info*{\s}{counter}{\x}% \nopagecolor% \begin{tikzpicture}[chit has drop=false,#2]% \chit[\s=\ti]% \wg@add@drop@margin% \end{tikzpicture}% \end@info% %% \foreach \n in {1,...,\m}{% Make a number of copies %% \ifx\u\chit@blank% %% \chit@dbg{3}{Ignoring blank chit:\u}% %% \else% %% \info{\u}{counter}{#2} %% \begin{tikzpicture} %% \chit[\u=\ti](\c,\r)% %% \end{tikzpicture} %% \fi% %% }% \fi% \fi% }% \fi% }% \endgroup% } % \end{macrocode} % % Special for boards, we have the environment \textsf{boardimage}. % Like \cs{info} we must specify the name and sub-category of the % board, but the category is assumed to be \texttt{board} (though the % optional argument can specify a different category). % % Within this environment some specific styles are defined that allows % the user to specify VASSAL zones on the board. For this to work % properly, the parent \textsf{tikzpicture} \emph{must} have the style % \texttt{zoned}. This style will record the bounding box of the % picture which we will need to calculate VASSAL coordinates later % on. % % Other styles are \texttt{zone scope}, to be applied to % \texttt{scope}s in the picture, and \texttt{zone path} to be applied % to \texttt{path}s (or \cs{draw}, \cs{fill}, or the like) in the % picture. These will record coordinates of these elements in side % the picture. The Python script will then define VASSAL zones based % on these coordinates. % % For \texttt{zone scope} applied to a \texttt{scope}, what is % recorded are % % \begin{itemize} % \item The current coordinate transformation matrix % \item The current translation % \item The bounding box, within the current transformation and % translation. % \end{itemize} % % To define a zone in the board, simply enclose it in a % % \begin{verbatim} % \begin{scope}[zone scope=name] % ... % \end{scope} % \end{verbatim} % % The \meta{name} will be the name of the scope. If this contains the % sub-string \texttt{hex} (upper, lower, or mixed case), then the zone % will get a hex grid with numbering attached to it. % % If the \meta{name} contains the sub-string \texttt{turn} (any case), % then it is assumed to be a turn track and a rectangular grid will be % attached. The column and row separator will be set to \texttt{T}, % so that it won't collide with the main zone. Similar if \meta{name} % contains \texttt{oob}, except the separator is set to \texttt{O}. % % If \meta{name} contains the sub-string \texttt{pool}, then it is % assumed to be a pool of counters, and \emph{no} grid is attached. % % For \texttt{zone path} applied to a \texttt{path}, what is recorded % is the path coordinates (as straight line segments) in the global % coordinate system. % % Both styles take one argument --- the name of the zone. If that % name contains the sub-string \texttt{hex} anywhere in the name, then % the zone is assumed to contain a hex grid. Otherwise, a rectangular % grid (of fixed size) will be applied to it. % % The environment \texttt{boardimage} also records the coordinate % options currently in use (keys \texttt{hex/first row is}, % \texttt{hex/row direction is}, and so on), as well as the current % label option (as defined by \texttt{every hex} or \texttt{every hex % node}). % % % The information extracted is written to the % \cs{jobname}\texttt{.json} file as a sub-object (with name given by % the first optional argument) of the image object. In that way, we % can later on easily get the information from our catalogue of % images. % % Note, the styles \texttt{zoned}, \texttt{zone scope}, and % \texttt{zone path} are defined in \texttt{wargame} to be dummies so % that one can have them in the definition of the board without % impact. % \begin{macrocode} \def\mk@transform{% \pgfgettransformentries{\mxx}{\mxy}{\myx}{\myy}{\ptdx}{\ptdy} \wg@pt@to@cm{\ptdx}\edef\dx{\pgfmathresult} \wg@pt@to@cm{\ptdy}\edef\dy{\pgfmathresult} \mk@w{ \mk@i "xx": \mxx,} \mk@w{ \mk@i "xy": \mxy,} \mk@w{ \mk@i "yx": \myx,} \mk@w{ \mk@i "yy": \myy,} \mk@w{ \mk@i "dx": \dx,} \mk@w{ \mk@i "dy": \dy,} } % \end{macrocode} % \begin{macrocode} \def\mk@bb#1{% \wg@get@bb{#1} \mk@w{ \mk@i "lower left": [\llx,\lly],} \mk@w{ \mk@i "upper right": [\urx,\ury],} \begingroup \wg@get@global@nchor{#1}{south west} \mk@w{ \mk@i "global lower left": [\tmp@x,\tmp@y],} \wg@get@global@nchor{#1}{north east} \mk@w{ \mk@i "global upper right": [\tmp@x,\tmp@y]} \endgroup } \def\mk@pos#1(#2){% \wg@dbg{10}{^^JMarking `#2' with `#1' - start} \coordinate[transform shape] (tmp) at (#2) {}; \wg@get@nchor{tmp}{center} \wg@dbg{3}{^^JMarking `#2' with `#1' - `\tmp@x',\tmp@y'} \tikzset{zone point={#1}{\tmp@x}{\tmp@y}} } % \end{macrocode} % % For the key \texttt{zone path} to work, we need to be able to record % the path as it moves along. To that end, we make a custom % decoration that will do that for us, and, once the path is finished, % write the path to our JSON file. % % \begin{macrocode} \pgfdeclaredecoration{record path construction}{initial}{% \state{initial}[width=0pt,next state=more]{ \begingroup \pgf@decorate@inputsegment@first \ptpoint@to@cm{\the\pgf@x}{\the\pgf@y} \xdef\wg@path{[\x,\y]} \endgroup }% \state{more}[width=\pgfdecoratedinputsegmentremainingdistance]{% \begingroup \pgf@decorate@inputsegment@last \ptpoint@to@cm{\the\pgf@x}{\the\pgf@y} \xdef\wg@path{\wg@path,[\x,\y]} \endgroup } \state{final}{% \begingroup \pgf@decorate@inputsegment@last \ptpoint@to@cm{\the\pgf@x}{\the\pgf@y} \xdef\wg@path{\wg@path,[\x,\y]} \endgroup \mk@w{ \mk@i "zone path \wg@record@path@name": \@lbchar} \mk@w{ \mk@i\space "path": [\wg@path] \@rbchar,} } }% % \end{macrocode} % % Now we can make our environment % % The first thing we do is to use the \cs{info} macro to mark the % image. Then we open our JSON file. We make a short-hand macro for % writing to that file. The macro \cs{bd@i} records the current % indention (which is important in JSON) % % \begin{macrocode} \newenvironment{boardimage}[3][board]{% \def\bd@n{#2} \newcount\mk@point \mk@point=0 \let\oomk@i\mk@i% \let\markpos\mk@pos% % \end{macrocode} % % % Then, to extract the label option, we make a dummy \texttt{node} % with the styles \texttt{every hex} and \texttt{every hex node}, so % we can extract that option. % % \begin{macrocode} \info{dummy}{<>}{}% %\tikz{}% \tikz{\scoped[% every hex/.try,every hex node/.try, ]{% \def\hex@col{0}% \def\hex@row{0}% \node[hex,inner sep=0,outer sep=0]{% %\message{^^JHex label: `\meaning\hex@label'}% \global\let\mk@label\hex@label}}}% % \end{macrocode} % % The next thing we do is to make an object. The first things we put % in are the units used (``cm''), and the grid options. % % \begin{macrocode} \info*{#2}{#1}{#3}% \mk@w{ \mk@i "zones": \@lbchar}% \edef\mk@i{\mk@i\space} %% Everything is made into centimeters \mk@w{ \mk@i "units": "cm",} \hex@dbg{3}{Label: `\meaning\mk@label'} \@ifundefined{mk@label}{}{\mk@w{ \mk@i "labels": "\mk@label",}} %% Write out coordinate options as "coords" object \mk@w{ \mk@i"coords": \@lbchar}% \mk@w{ \mk@i "row": \@lbchar}% \mk@w{ \mk@i\space "offset": \hex@coords@row@off,}% \mk@w{ \mk@i\space "factor": \hex@coords@row@fac \@rbchar,}% \mk@w{ \mk@i "column": \@lbchar}% \mk@w{ \mk@i\space "offset": \hex@coords@col@off,}% \mk@w{ \mk@i\space "factor": \hex@coords@col@fac,}% \mk@w{ \mk@i\space "top short": "\hex@top@short@col",}% \mk@w{ \mk@i\space "bottom short": "\hex@bot@short@col" \@rbchar}% \mk@w{ \mk@i\@rbchar,}% % \end{macrocode} % % We then monkey-patch \cs{boardframe} to also output coordinates to % our JSON file. Note that this will probably be embedded in a % different object. % % \begin{macrocode} %% \let\oldbo@rdframe\bo@rdframe% \def\bo@rdframe[##1](##2)(##3){% \oldbo@rdframe[##1](##2)(##3)% \mk@w{ \mk@i"board frame": \@lbchar} \mk@w{ \mk@i\space "lower left": [\llx,\lly],} \mk@w{ \mk@i\space "upper right": [\urx,\ury],} \mk@w{ \mk@i\space "margin": \margin,} \mk@w{ \mk@i\space "width": \w,} \mk@w{ \mk@i\space "height": \h \@rbchar,}}% % \end{macrocode} % % Next, we make the style \texttt{zoned} to be applied to the % \texttt{tikzpicture} environment. This records the bounding box of % the full picture. % % \begin{macrocode} \tikzset{ zoned/.code={% Apply to whole picture \pgfkeys{% % This needs to be done in the picture! /tikz/execute at end picture={% \mk@w{ \mk@i "zoned": \@lbchar} \mk@transform% \mk@bb{current bounding box} \mk@w{ \mk@i \@rbchar,} } } }, % \end{macrocode} % % The next style is the \texttt{zone scope}. At the start of the % scope we record the current transformation matrix. Then we install % a handler to extract the bounding box at the end of the scope. Note % that we increase indention here. % % \begin{macrocode} zone scope/.code={% \mk@w{ \mk@i"zone scope ##1": \@lbchar} \let\omk@i\mk@i \edef\mk@i{\mk@i\space} \mk@transform% %\bd@w{ \@rbchar,} \gdef\wg@export@box{##1}% \pgfkeys{% /tikz/local bounding box=wg export box, /tikz/execute at end scope={ \mk@bb{wg export box} \let\mk@i\omk@i \mk@w{ \mk@i\@rbchar,}}, } % pgfkeys }, % zone scope % \end{macrocode} % The next style gets the global coordinates of the current (0,0) % point - f.ex. in a node - and outputs that % \begin{macrocode} zone point/.code n args={3}{ \pgf@xa=##2 cm \pgf@ya=##3 cm \pgfpointtransformed{\pgfpoint{\pgf@xa}{\pgf@ya}} % \pgfpointtransformed{\pgfpoint{0pt}{0pt}} \pgf@xa=\pgf@x \pgf@ya=\pgf@y \wg@pt@to@cm{\the\pgf@xa}\edef\px{\pgfmathresult} \wg@pt@to@cm{\the\pgf@ya}\edef\py{\pgfmathresult} \advance\mk@point1 \global\mk@point=\mk@point \mk@w{ \mk@i "point\the\mk@point": \@lbchar "name": "##1", "type": "point", "coords": [\px,\py] \@rbchar, } %\message{^^JZone point \the\mk@point\space ##1: ##2,##3 -> \px,\py} }, zone oob point/.code n args={3}{ \pgf@xa=##2 cm \pgf@ya=##3 cm \advance\pgf@xa.1cm \advance\pgf@ya.1cm \pgfpointtransformed{\pgfpoint{\pgf@xa}{\pgf@ya}} % \pgfpointtransformed{\pgfpoint{0pt}{0pt}} \pgf@xa=\pgf@x \pgf@ya=\pgf@y \wg@pt@to@cm{\the\pgf@xa}\edef\px{\pgfmathresult} \wg@pt@to@cm{\the\pgf@ya}\edef\py{\pgfmathresult} \advance\mk@point1 \global\mk@point=\mk@point \mk@w{ \mk@i "point\the\mk@point": \@lbchar "name": "##1", "parent": "\wg@export@box", "type": "point", "coords": [\px,\py] \@rbchar, } %\message{^^JZone point \the\mk@point\space ##1: ##2,##3 -> \px,\py} }, zone global point/.code n args={3}{ \advance\mk@point1 \global\mk@point=\mk@point \mk@w{ \mk@i "point\the\mk@point": \@lbchar "name": "##1", "type": "point", "coords": [\px,\py] \@rbchar, } }, % \end{macrocode} % % The \texttt{zone path} style is a bit more simple, but only because % the bulk of the work is done in a decoration. We need to be able to % pass a name to that decoration, s we make a key for that. The user % need not think about that though. % % \begin{macrocode} /pgf/decoration/record path name/.store in=\wg@record@path@name, zone path/.style={% postaction={decorate,decoration={ record path construction, record path name=##1}} } % zone path }% tikzset } % \end{macrocode} % % That finishes the first part of the environment. At the end of the % environment, we simple write the name of the picture, and close our % JSON output. % % \begin{macrocode} {% \mk@w{ \mk@i "name": "\bd@n" }% \let\mk@i\oomk@i% \mk@w{ \mk@i\@rbchar}% \end@info% } % \end{macrocode} % % Make battle markers. Mandatory argument is how many markers, % optional is the group to add the markers to. % % \begin{macrocode} \def\wg@gennumberm@rkers#1#2#3#4{ \message{^^JNumbered markers: Type=`#1' Max=`#2' Category=`#3'} \def\markers{} \def\keys{} \foreach \i in {1,...,#2}{% \xdef\keys{/tikz/#1 \i/.style={/tikz/#1=\i},\keys} \xdef\markers{\markers,#1 \i}} {% \nopagecolor\pgfkeysalsofrom{\keys}\chitimages[#3][#4]{\markers}}}% \tikzset{ wg hidden unit/.pic={}, wg hidden unit/.style={ chit={ no chit drop, frame={draw=none,fill=none}, full=wg hidden unit}}} % % First optional argument are extra styles % Second is category % Third is number of markers % \def\battlemarkers{% \@ifnextchar[{\@battlemarkers}{\battlemarkers[]}%] }% \def\@battlemarkers[#1]{% \@ifnextchar[{\@@battlemarkers[#1]}{\battlemarkers[#1][BattleMarkers]}%] }% \def\@@battlemarkers[#1][#2]#3{% \wg@gennumberm@rkers{battle marker}{#3}{#2}{#1}% \message{^^JMake a hidden unit and add to Markers category} {% \nopagecolor% \chitimages[Markers]{{wg hidden unit}}% % \info{battle-marker-icon}{icon}{}% \tikz[scale=.7,transform shape,auto icon more/.try]{% \pic{battle marker=0};}% \info{clear-battles-icon}{icon}{} \tikz[scale=.4,transform shape,auto icon more/.try]{% \pic{eliminate icon}; \pic[scale=.7,transform shape] at (-.3,0) {battle marker=0};}% }% } % \end{macrocode} % % Make odds markers. Mandatory argument is a list of odds and fill colours. % Optional is the group to add the markers to. % % \begin{macrocode} \def\wg@gencolorm@rkers#1#2#3#4{% \def\markers{} \def\keys{} \foreach \o/\f/\n [count=\i] in {#2}{% \ifx\n\f\def\n{\o}\fi% \ifx\o\f\def\f{white}\fi% \message{^^JColour no \i marker `#1 \n' w/fill `\f' text `\o'}% \protected@xdef\keys{/tikz/#1 \n/.style={/tikz/#1={\o,\f}},\keys} \xdef\markers{\markers,#1 \n} }% {% \nopagecolor% \pgfkeysalsofrom{\keys}% \chitimages[#3][#4]{\markers}% }% }% % % First optional argument are extra styles % Second is category % Third is marker list % \def\oddsmarkers{% \@ifnextchar[{\@oddsmarkers}{\oddsmarkers[]}%] }% \def\@oddsmarkers[#1]{% \@ifnextchar[{\@@oddsmarkers[#1]}{\oddsmarkers[#1][OddsMarkers]}%] }% \def\@@oddsmarkers[#1][#2]#3{% \wg@gencolorm@rkers{odds marker}{#3}{#2}{#1}% \info{odds-battles-icon}{icon}{} \tikz[scale=.5,transform shape,auto icon more/.try]{% \pic{odds marker={?:?,white}}} \info{resolve-battles-icon}{icon}{} \tikz[scale=.3,transform shape,auto icon more/.try]{% \pic{dice}; \pic[scale=1.2,transform shape] at (-.2,-.2) {battle marker=0};}% } % \end{macrocode} % % Make results markers. Mandatory argument is a list of results and % fill colours. Optional is the group to add the markers to. % % % First optional argument are extra styles % Second is category % Third is marker list % % \begin{macrocode} \def\resultmarkers{% \@ifnextchar[{\@resultmarkers}{\resultmarkers[]}%] }% \def\@resultmarkers[#1]{% \@ifnextchar[{\@@resultmarkers[#1]}{\resultmarkers[#1][ResultMarkers]}%] }% \def\@@resultmarkers[#1][#2]#3{% \wg@gencolorm@rkers{result marker}{#3}{#2}{#1}}% % \end{macrocode} % % Common icons used by many modules % % \begin{macrocode} \DeclareRobustCommand\commonicons[3][]{% \begingroup% \nopagecolor% \tikzset{auto icon/.style={scale=.4,transform shape,#1}}% % \info{pool-icon}{icon}{} \tikz[auto icon,auto icon more/.try]{\pic{pool icon};} % \info{oob-icon}{icon}{}% \tikz[auto icon,auto icon more/.try]{\pic{oob icon={#2}{#3}};}% % \info{flip-icon}{icon}{}% \tikz[auto icon,auto icon more/.try]{\pic{flip icon};}% % \info{eliminate-icon}{icon}{}% \tikz[auto icon,auto icon more/.try]{\pic{eliminate icon};}% % \info{restore-icon}{icon}{}% \tikz[auto icon,auto icon more/.try]{\pic{restore icon};}% % \info{dice-icon}{icon}{}% \tikz[auto icon,scale=.9,auto icon more/.try]{\pic{dice};}% % \info{unit-icon}{icon}{}% \tikz[auto icon,scale=.7,auto icon more/.try]{% \chit[fill=#2, symbol={[ scale line widths, line width=1pt, faction=friend, command=land, main=infantry, scale=1.3](0,-.15)}]}% % \info{layer-icon}{icon}{}% \begin{tikzpicture}[scale=.25] \foreach \i in {-1,0,1}{ \scoped[shift={(0,\i*.15)}]{ \draw[black,fill=white] (-.5,0) --(0,.3)--(.5,0)--(0,-.3)--cycle; } } \end{tikzpicture}% % \info{los-icon}{icon}{} \begin{tikzpicture}[scale=.25] \draw[scale line widths,line width=2pt,fill=white](-.5,0) to[out=70,in=110] (.5,0) to[out=-110,in=-70] cycle; \begin{scope}[even odd rule] \clip circle(.2); \fill circle(.2) (125:.18) circle(.1); \end{scope} \end{tikzpicture}% % \endgroup% } % \end{macrocode} % % \subsubsection{Making dice} % \begin{Syntax} % \cs{dice}\oarg{tikz-options}\oarg{node-options}\marg{name}\marg{name}\marg{list} % \end{Syntax} % \begin{enumerate} % \item \meta{tikz-options} % \item \meta{node-options} % \item \meta{name} - an identifier - e.g., the same as \meta{shape}. % \item \meta{shape} - one of \texttt{d4}, \texttt{d6}, \texttt{d8}, % \texttt{d10}, \texttt{d12}, or \texttt{d20}. % \item \meta{list} - list of pairs % \meta{value}\texttt{/}\meta{printed}, where \meta{value} is the % value, and \meta{printed} is the shown value. If \meta{printed} is % left out, then \meta{value} is used. % \end{enumerate} % % \begin{macrocode} \def\dice{% \@ifnextchar[{\wg@dice}{\wg@dice[]}%] } \def\wg@dice[#1]{% \@ifnextchar[{\wg@@dice{#1}}{\wg@@dice{#1}[]} %] } \def\wg@@dice#1[#2]#3#4#5{% \foreach \v/\p in {#5}{% \info{#3-\v}{die-roll}{#3} \tikz[#1]{ %\node[shape=#4,transform shape,draw=none,fill=black,opacity=.5] %at (.05,-.03){}; \node[shape=#4,#2,transform shape, chit drop ]{\p};\wg@add@drop@margin{}}}} % \end{macrocode} % % \subsubsection{Hooks into chits, etc.} % % TO BE DONE: We could add hook the \texttt{hex} shape that would % allow us to write out the settings for each of these. This would % allow us to make data files that contain the information available % in the \LaTeX{} code. % % If one then assumed that for example the upper left corner holds the % start-up hex, then one could use that information. % % The code below exports the chit information to the JSON file. % Together with the battle, odds, and result markers stuff above, this % allows the exporter to almost automatically set up battle odds and % result calculations. The fields exported are % % \begin{itemize} % \item Left and right identifiers % \item Upper left, upper right, lower left, and lower right % identifiers. (some care must be taken if these contains graphics % and not just text.) % \item Factors % \item NATO symbol % \begin{itemize} % \item Faction, command, echelon % \item Mains % \item Left, right, top, and bottom attributes and modifiers % \item Below attribute % \end{itemize} % \end{itemize} % % The exporter can set up prototypes for NATO types, echelons, % etc. The exporter can also set factors as marks on the units. % % \begin{macrocode} \tikzset{ zone turn/.store in=\zone@turn, zone mult/.store in=\zone@mult } \def\@chit@rep@line#1#2{% \@ifundefined{#2}{}{ \edef\wg@chit@tmp{\csname #2\endcsname} {\escapechar=`/ \xdef\tmp{\detokenize\expandafter{\wg@chit@tmp} \@empty}} % \message{^^J\meaning\@tmp -> \meaning\tmp} \mk@w{ \mk@i\space "#1": "\tmp",}}} \def\do@chit@report{% \chit@dbg{3}{Start of Chit Report} \mk@w{ \mk@i "chit": \@lbchar} \chit@dbg{3}{Report - ID} \@ifundefined{id}{} {\mk@w{ \mk@i\space "id": "\id", }}% \chit@dbg{3}{Report - Symbol: `\meaning\chit@symbol'} \@ifundefined{chit@symbol}{}{\mk@w{ \mk@i\space "symbol": "true", }}% \chit@dbg{3}{Report - Full: `\meaning\chit@full'} \@chit@rep@line{full}{chit@full} \chit@dbg{3}{Report - Factors: `\meaning\chit@factors'} \@chit@rep@line{factors}{chit@factors}% \chit@dbg{3}{Report - Left: `\meaning\chit@left'} \@chit@rep@line{left}{chit@left}% \chit@dbg{3}{Report - Right: : `\meaning\chit@right'} \@chit@rep@line{right}{chit@right}% \chit@dbg{3}{Report - Upper left: `\meaning\chit@upper@left'} \@chit@rep@line{upper left}{chit@upper@left}% \chit@dbg{3}{Report - Lower left: `\meaning\chit@lower@left'} \@chit@rep@line{lower left}{chit@lower@left}% \chit@dbg{3}{Report - Upper right: `\meaning\chit@upper@right} \@chit@rep@line{upper right}{chit@upper@right}% \chit@dbg{3}{Report - Lower right: `\meaning\chit@lower@right'} \@chit@rep@line{lower right}{chit@lower@right}% \chit@dbg{3}{Report - End comma} \mk@w{ \mk@i\space "end": 0} \@ifundefined{chit@symbol}{ \mk@w{ \mk@i \@rbchar } }{ \mk@w{ \mk@i \@rbchar, }% NATOAPP6c will follow }% \chit@dbg{3}{End of Chit Report} } % \end{macrocode} % Report out NATO App6 symbol settings % \begin{macrocode} \def\do@natoapp@report{% \mk@w{ \mk@i "natoapp6c": \@lbchar} \@chit@rep@line{id}{\id} \@chit@rep@line{faction}{natoapp@fac} \@chit@rep@line{command}{natoapp@cmd} \@chit@rep@line{echelon}{natoapp@ech} \@chit@rep@line{main}{natoapp@main} \@chit@rep@line{left}{natoapp@left} \@chit@rep@line{right}{natoapp@right} \@chit@rep@line{upper}{natoapp@upper} \@chit@rep@line{lower}{natoapp@lower} \@chit@rep@line{below}{natoapp@below} \mk@w{ \mk@i\space "end": 0} \mk@w{ \mk@i \@rbchar} } \tikzset{ chit drop margin/.store in=\wg@drop@margin, chit drop shadows/.code={ \pgfkeysalso{% /tikz/every chit node/.prefix style={chit drop={#1}}, /tikz/chit has drop=true} }, chit drop shadows/.default=, marker drop shadows/.code={ \pgfkeysalso{% /tikz/every battle marker/.prefix style={chit drop={#1}}, /tikz/every odds marker/.prefix style={chit drop={#1}}, /tikz/every result marker/.prefix style={chit drop={#1}}, /tikz/auto icon more/.prefix style={no chit drop}}}, marker drop shadows/.default={ chit has drop=false, shadow xshift=0.04cm, shadow yshift=-0.04cm, shadow blur radius=0.04cm} } % \end{macrocode} % % % \iffalse % %\fi