diff options
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/board.dtx')
-rw-r--r-- | macros/latex/contrib/wargame/source/hex/board.dtx | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/board.dtx b/macros/latex/contrib/wargame/source/hex/board.dtx new file mode 100644 index 0000000000..fd0af295fb --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/board.dtx @@ -0,0 +1,253 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Board clipping and frame} +% +% \begin{Macro}{\boardframe} +% +% Define the bounding box around the board +% +% \begin{Syntax} +% \cs{boardframe}\oarg{margin}\parg{lower=left}\parg{upper-right}\marg{margin} +% \end{Syntax} +% +% where \meta{lower-left} and \meta{upper-right} specifies the lower +% left and upper right hexes (inclusive) of the board. +% +% +% \begin{macrocode} +\tikzset{ + hex/board frame/.style={draw} +} +\def\boardframe{% + \@ifnextchar[{\bo@rdframe}{\bo@rdframe[0]}%} +} +\def\bo@rdframe[#1](#2)(#3){% + \hex@coords@conv{#2} + \edef\llx{\hex@x} + \edef\lly{\hex@y} + \edef\llc{\hex@col} + \edef\llr{\hex@row} + \edef\ellc{\hex@eff@col} + \edef\ellr{\hex@eff@row} + % + \hex@coords@conv{#3} + \edef\urx{\hex@x} + \edef\ury{\hex@y} + \edef\urc{\hex@col} + \edef\urr{\hex@row} + \edef\eurc{\hex@eff@col} + \edef\eurr{\hex@eff@row} + % + \def\margin{#1} + % + \hex@dbg{2}{% + Board Hex range: (\llc,\llr)x(\urc,\urr) + ^^JEffective range: (\ellc,\ellr)x(\eurc,\eurr) + ^^JBB: (\llx,\lly)x(\urx,\ury)}% + \ifnum\hexdbglvl>1 + %\draw[red,very thick](hex cs:c=\llc,r=\llr) rectangle(hex cs:c=\urc,r=\urr); + \draw[red,ultra thick,dashed](\llx,\lly) rectangle(\urx,\ury); + \draw[->,very thick,blue] (0,0) -- (0,1) (0,0) -- (1,0); + \fi + % Calculate how many half hex hides to add to the "bottom" + % + \def\oddeven{isodd} + \ifnum\hex@coords@row@fac<0\def\oddeven{iseven}\fi% + \pgfmathparse{ + ifthenelse(\hex@got@bot@short(\ellc), + ifthenelse(\hex@bot@short@col(\llc)*not(\oddeven(\ellc)),2, + ifthenelse(\hex@bot@short@col(\llc),0,1)), + ifthenelse(\oddeven(\ellc),1,2))} + \edef\olly{\pgfmathresult}% + \hex@dbg{2}{Delta lly: \olly half heights} + % Calculate how many half hex heights to add to the "top" + \def\oddeven{iseven} + \ifnum\hex@coords@row@fac<0\def\oddeven{isodd}\fi% + % + \pgfmathparse{ + ifthenelse(\hex@got@top@short(\urc), + ifthenelse(\hex@top@short@col(\urc)*\oddeven(\eurc),0, + ifthenelse(\hex@top@short@col(\urc),2,1)), + ifthenelse(\oddeven(\eurc),1,2))} + \edef\oury{\pgfmathresult}% + \hex@dbg{2}{Delta ury: \oury half heights} + % Calculate new LLY and URY + \pgfmathparse{\lly-\hex@coords@row@fac*(\olly*\hex@yy+\margin)} + \edef\lly{\pgfmathresult} + \pgfmathparse{\ury+\hex@coords@row@fac*(\oury*\hex@yy+\margin)} + \edef\ury{\pgfmathresult} + % Calculate new LLX and URX + \pgfmathparse{\llx-1-\margin}\edef\llx{\pgfmathresult} + \pgfmathparse{\urx+1+\margin}\edef\urx{\pgfmathresult} + % Calculate width and height + \pgfmathparse{\urx-\llx}\edef\w{\pgfmathresult} + \pgfmathparse{\ury-\lly}\edef\h{\pgfmathresult} + \hex@dbg{0}{Board Frame: (\llx,\lly)x(\urx,\ury) (\w x\h) (\llc,\llr)x(\urc,\urr)} + \draw[hex/board frame/.try](\llx,\lly) rectangle(\urx,\ury); + \xdef\boardXmin{\llx}% + \xdef\boardYmin{\lly}% + \xdef\boardXmax{\urx}% + \xdef\boardYmax{\ury}% +} + +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\boardclip} +% +% Clip the board to not show incomplete hexes +% +% \begin{Syntax} +% \cs{boardclip}\marg{nx}\marg{ny}\marg{preaction} +% \end{Syntax} +% \begin{macrocode} +\def\boardpath(#1)(#2){% + \hex@coords@reset% + \tikzset{/hex/coords/.cd, #1} + \edef\llx{\hex@col} + \edef\lly{\hex@row} + %% + \hex@coords@reset% + \tikzset{/hex/coords/.cd, #2} + \edef\urx{\hex@col} + \edef\ury{\hex@row} + \let\board@odd\@undefined% + \hex@dbg{1}{Board BB in hex: (\llx,\lly)x(\urx,\ury)} + %% + \def\fv{south} + \def\sv{north} + \ifnum\hex@coords@row@fac<0 + \def\fv{north} + \def\sv{south} + \fi + + \edef\hex@board@path{(hex cs:c=\llx,r=\lly,v=\fv\space west)} + %% First the left side + \foreach \r in {\lly,...,\ury} {% + \edef\t{ + --(hex cs:c=\llx,r=\r,v=west) + --(hex cs:c=\llx,r=\r,v=\sv\space west)} + \wg@addto@macro{\hex@board@path}{\t}} + %% Then for top of board + \foreach \c in {\llx,...,\urx} {% + % To be done + %\pgfmathparse{int(ifthenelse(\hex@bot@short@col(\c),1,0))} + %\edef\tmp{\pgfmathresult} + %\ifnum\tmp>0 + %\edef\t{ + % --(hex cs:c=\c,r=\ury,v=\sv\space west) + % --(hex cs:c=\c,r=\ury,v=\sv\space east)} + %\else + \edef\t{ + --(hex cs:c=\c,r=\ury,v=\fv\space east) + --(hex cs:c=\c,r=\ury,v=\fv\space west)} + %\fi + \wg@addto@macro{\hex@board@path}{\t}} + %% Then for right of board + \foreach \r in {\ury,...,\lly} {% + \edef\t{ + --(hex cs:c=\urx,r=\r,v=east) + --(hex cs:c=\urx,r=\r,v=\fv\space east)} + \wg@addto@macro{\hex@board@path}{\t}} + + %% Then for bottom of board + \edef\t{--(hex cs:r=\lly,c=\urx,v=\fv\space west)} + \wg@addto@macro{\hex@board@path}{\t} + \foreach \c in {\urx,...,\llx} {% + \pgfmathparse{int(ifthenelse(\hex@bot@short@col(\c),1,0))} + \edef\tmp{\pgfmathresult} + \ifnum\tmp>0 + \edef\t{ + --(hex cs:c=\c,r=\lly,v=\sv\space east) + --(hex cs:c=\c,r=\lly,v=\sv\space west)} + \else + \edef\t{ + --(hex cs:c=\c,r=\lly,v=\fv\space east) + --(hex cs:c=\c,r=\lly,v=\fv\space west)} + \fi + \wg@addto@macro{\hex@board@path}{\t}} + + \def\t{--cycle} + \wg@addto@macro{\hex@board@path}{\t} + \global\let\hexboardpath\hex@board@path +} +%\def\boardclip#1#2#3{% +% \pgfmathparse{int(#1-1)}\xdef\board@range{\pgfmathresult,...,0}% +% %% \show\board@range +% \draw \ifx|#3|\else[preaction={#3}]\fi% +% [clip] +% % [decorate,decoration={show path construction, +% % moveto code={\fill[red](\tikzinputsegmentfirst) circle(2pt) +% % node [fill=none,below]{moveto};}, +% % lineto code={\draw[thick,blue,->](\tikzinputsegmentfirst)-- +% % (\tikzinputsegmentlast) node [above] {lineto};}, +% % curveto code={\draw[thick,green,->](\tikzinputsegmentfirst).. +% % controls(\tikzinputsegmentsupporta) and +% % (\tikzinputsegmentsupportb) +% % ..(\tikzinputsegmentlast) node[above]{curveto};}, +% % closepath code={\draw[thick,orange,->](\tikzinputsegmentfirst)-- +% % (\tikzinputsegmentlast) node [above] {closepath};} +% % }] +% (hex cs:r=0,c=0,v=south west) +% %% First the left side +% \foreach \r in {0,1,...,#2} {% +% --(hex cs:c=0,r=\r,v=west)--(hex cs:c=0,r=\r,v=north west)} +% %% Then for top of board +% \foreach \c in {0,1,...,#1} {% +% --(hex cs:r=#2,c=\c,v=north west)--(hex cs:c=\c,r=#2,v=north east)} +% %% Then for right of board +% \foreach \r in {#2,...,0} {% +% --(hex cs:c=#1,r=\r,v=east)--(hex cs:c=#1,r=\r,v=south east)} +% %% Then for bottom of board +% --(hex cs:r=0,c=#1,v=south west) \foreach \c in \board@range {% +% --(hex cs:r=0,c=\c,v=south east) --(hex cs:c=\c,r=0,v=south west) } +% --cycle; } +%% New definition - much simpler +\def\boardclip(#1)(#2)#3{% + \boardpath(#1)(#2) + \draw \ifx|#3|\else[preaction={#3}]\fi% + [clip] \hexboardpath; +} + +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\debuggrid} +% +% Show a debug grid. This requires \cs{boardframe}. +% +% \begin{macrocode} +\def\debuggrid{% + \foreach \i in {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1} {% + \pgfmathparse{\i*\boardW+\boardXmin}% + \edef\debug@x{\pgfmathresult}% + \draw [very thin,gray](\debug@x,\boardYmin) -- + (\debug@x,\boardYmax) node [below,rotate=90] at + (\debug@x,\boardYmin) {$\i$}; }% + \foreach \i in {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1} {% + \pgfmathparse{\i*\boardH+\boardYmin}% + \edef\debug@x{\pgfmathresult}% + \draw [very thin,gray] (\boardXmin,\debug@x) -- + (\boardXmax,\debug@x) node [left,rotate=90] at + (\boardXmin,\debug@x) {$\i$}; } } +% \end{macrocode} +% \end{Macro} +% +% Some dummy styles. These will be defined by the export class to +% facilitate getting information from the board. +% +% \begin{macrocode} +\tikzset{% + zoned/.style={}, + zone scope/.style={}, + zone path/.style={} +} +% \end{macrocode} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi |