summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wargame/source/hex/terrain.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/terrain.dtx')
-rw-r--r--macros/latex/contrib/wargame/source/hex/terrain.dtx248
1 files changed, 248 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/terrain.dtx b/macros/latex/contrib/wargame/source/hex/terrain.dtx
new file mode 100644
index 0000000000..765b38e759
--- /dev/null
+++ b/macros/latex/contrib/wargame/source/hex/terrain.dtx
@@ -0,0 +1,248 @@
+% \iffalse
+% --------------------------------------------------------------------
+%<*hex>
+% \fi
+%
+% \subsubsection{Terrain}
+% \label{sec:impl:hex:terrain}
+%
+% With the above main routine for making hexes, we turn to decorating
+% a hex with a terrain.
+%
+% \begin{HexKey*}{hex/terrain/image,
+% hex/terrain/pic,
+% hex/terrain/code,
+% hex/terrain/clip}
+%
+% We make the namespace \spec{/hex/terrain} to hold the
+% specific terrain keys. Keys used by terrain identifiers are
+%
+% \begin{tabular}{|l|p{.7\linewidth}|}
+% \hline
+% \rowcolor{headbg}
+% {\color{headfg}\textbf{Name}}
+% & {\color{headfg}\textbf{Description}}\\
+% \hline
+% \spec{image} & Terrain tile image\\
+% \spec{pic} & Terrain \TikZ{} \spec{pic}ture\\
+% \spec{code} & Arbitary \TikZ{} code\\
+% \spec{clip} & \TikZ{} path to clip terrain\\
+% \hline
+% \end{tabular}
+%
+% Now, we have the keys we'll need for selecting the terrain. These
+% live in the namespace \spec{/hex/terrain}, and we can select
+% between \spec{pic}tures or \spec{image}s (external graphics files)
+% for making the terrain. We define some short hands to easily
+% select the common terrains.
+%
+% \begin{macrocode}
+\tikzset{%
+ /hex/terrain/.search also={/tikz},%
+ /hex/terrain/.cd,%
+ pic/.store in=\hex@t@pic,%
+ image/.store in=\hex@t@image,%
+ code/.store in=\hex@t@code,%
+ clip/.store in=\hex@t@clip,%
+ pic/.default=,
+ image/.default=,
+ code/.default=,
+ clip/.default,
+}
+\iffalse
+\tikzset{
+ /hex/terrain/.cd,%
+ beach/.style={pic=hex/terrain/beach},
+ light woods/.style={pic=hex/terrain/light woods},
+ woods/.style={pic=hex/terrain/woods},
+ swamp/.style={pic=hex/terrain/swamp},
+ rough/.style={pic=hex/terrain/rough},
+ mountains/.style={pic=hex/terrain/mountains},
+ village/.style={pic=hex/terrain/village},
+ town/.style={pic=hex/terrain/town},
+ city/.style={pic=hex/terrain/city},
+}
+\else
+\tikzset{
+ /hex/terrain/.cd,%
+ beach/.style={image=beach},
+ light woods/.style={image=light_woods},
+ woods/.style={image=woods},
+ swamp/.style={image=swamp},
+ rough/.style={image=rough},
+ mountains/.style={image=mountains},
+ village/.style={image=village},
+ town/.style={image=town},
+ city/.style={image=city},
+}
+\fi
+% \end{macrocode}
+% \end{HexKey*}
+%
+%
+% Before we go on, we define the macro that actually generates the
+% terrain of a hex.
+%
+% \begin{Macro}{\hex@do@terrain}
+% If we do have a terrain specified, we start a new scope, this time
+% to clip the terrain by the clipping path specified by
+% \spec{hex=\{terrain=\{clip=...\}\}}. The first thing into the new
+% scope is to process the keys specified in
+% \spec{hex=\{terrain=...\}}. This will set the terrain and the
+% clipping of the terrain.
+%
+% \begin{macrocode}
+\def\hex@do@terrain{%
+ \hex@dbg{5}{Terrain: \meaning\hex@terrain}%
+ \edef\hex@t@tmp{[/hex/terrain/.cd,\hex@terrain]}%
+ \expandafter\scope\hex@t@tmp% Scope for terrain clipping.
+ \hex@dbg{5}{Terrain:
+ ^^J pic: \meaning\hex@t@pic
+ ^^J image: \meaning\hex@t@image
+ ^^J code: \meaning\hex@t@code
+ ^^J clip: \meaning\hex@t@clip}
+% \end{macrocode}
+%
+% We check to see if we have any clipping \spec{pic}tures. If so, we
+% process these in turn and append the soft path to a macro. Once
+% this is done, we use the soft path as a clipping path for the rest
+% of the (terrain) scope.
+%
+% \begin{macrocode}
+ \@ifundefined{hex@t@clip}{\let\hex@t@clip\empty}{}
+ \ifx\hex@t@clip\empty\else%
+ \def\hex@t@c{}
+ \foreach \c in \hex@t@clip{%
+ \hex@dbg{5}{Clipping to `\c'}
+ \expandafter\wg@pic\c\@endwg@pic {}{\wg@tmpa,\wg@tmpb}{%
+ save path=\hex@t@tmp}%
+ \wg@addto@macro\hex@t@c\hex@t@tmp % Append to clippping
+ }%
+ \pgfsyssoftpath@setcurrentpath{\hex@t@c}% Set path
+ \clip;% Clip to the path
+ \fi % End of clipping terrain
+% \end{macrocode}
+%
+% We're new ready to make the terrain. First, we check to see if the
+% relevant storage macros are undefined and if so, \cs{let} them to
+% \cs{empty} so that we can deal more easily with the various cases.
+%
+% \begin{macrocode}
+ %% Now switch between how to draw the terrain. If some of the
+ %% macros are undefined, define them to be empty
+ \@ifundefined{hex@t@pic}{\let\hex@t@pic\empty}{}
+ \@ifundefined{hex@t@image}{\let\hex@t@image\empty}{}
+% \end{macrocode}
+%
+% First we check if we have not got terrain images, but terrain
+% pictures. If we have that, we process these in turn. Note, the
+% user can give options to each terrain picture by preceding the
+% \spec{pic}ture name with \oarg{options}.
+%
+% \begin{macrocode}
+ % If we have no image, check if we have pictures.
+ \ifx\hex@t@image\empty%
+ \hex@dbg{8}{No terrain images}%
+ \ifx\hex@t@pic\empty\else%
+ % We have pictures
+ \hex@dbg{5}{Terrain pictures}%
+ \pgfpointorigin\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y%
+ \wg@pic@all{\hex@t@pic}{}{\the\wg@tmpa,\the\wg@tmpb}{}%
+ \fi% We have pictures.
+% \end{macrocode}
+%
+%
+% If the user specified images rather than \spec{pic}tures, then we
+% process these in turn. Again, the user can specify options to each
+% terrain image by preceding the image file name with \oarg{options}.
+%
+% \begin{macrocode}
+ \else % We have images
+ \hex@dbg{5}{Terrain images}%
+ \pgfpointorigin\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y%
+ \foreach \i in \hex@t@image{%
+ \hex@dbg{10}{Terrain image: `\meaning\i'}
+ \expandafter\wg@node{%
+ \includegraphics[width=2cm]{\i}}\@endwg@node %
+ {}{\wg@tmpa,\wg@tmpb}{%
+ shape=rectangle,%
+ anchor=center,%
+ transform shape,%
+ draw=none}%
+ }
+ \fi%
+ \endscope% End of terrain scope
+}% End of terrain
+% \end{macrocode}
+% \end{Macro}
+%
+%
+%
+%
+
+%
+% Next, we define some example clippings of the terrain images.
+% Specifcally, we make clippings to sextants. We do this by first
+% defining a macro.
+%
+% \begin{Macro}{\hex@make@sextants}
+%
+% When executed this macro will generate some paths that will clip
+% to sextants. The first argument is the inner radius of the
+% sextant and the second argument is the (possible empty) prefix to
+% put in front of the \spec{sextant} name.
+%
+% \begin{macrocode}
+\def\hex@x@r{.7}
+\def\hex@make@sextants#1#2{%
+ \tikzset{%
+ pics/hex/#2sextant/.is choice,
+ pics/hex/#2sextant/north east/.style={
+ code={
+ \path[pic actions]( 0:1)--( 60:1)--( 60:#1)--( 0:#1)--cycle;}},
+ pics/hex/#2sextant/north/.style={
+ code={
+ \path[pic actions]( 60:1)--(120:1)--(120:#1)--( 60:#1)--cycle;}},
+ pics/hex/#2sextant/north west/.style={
+ code={
+ \path[pic actions](120:1)--(180:1)--(180:#1)--(120:#1)--cycle;}},
+ pics/hex/#2sextant/south west/.style={
+ code={
+ \path[pic actions](180:1)--(240:1)--(240:#1)--(180:#1)--cycle;}},
+ pics/hex/#2sextant/south/.style={
+ code={
+ \path[pic actions](240:1)--(300:1)--(300:#1)--(240:#1)--cycle;}},
+ pics/hex/#2sextant/south east/.style={
+ code={
+ \path[pic actions](300:1)--(360:1)--(360:#1)--(300:#1)--cycle;}},
+ pics/hex/#2sextant/center/.style={
+ code={
+ \path[pic actions]
+ (0:#1)--
+ (60:#1)--
+ (120:#1)--
+ (180:#1)--
+ (240:#1)--
+ (300:#1)--cycle;}},
+ pics/hex/#2sextant/NE/.style=hex/#2sextant/north east,
+ pics/hex/#2sextant/NE/.style=hex/#2sextant/north east,
+ pics/hex/#2sextant/N/.style=hex/#2sextant/north,
+ pics/hex/#2sextant/NW/.style=hex/#2sextant/north west,
+ pics/hex/#2sextant/SW/.style=hex/#2sextant/south west,
+ pics/hex/#2sextant/S/.style=hex/#2sextant/south,
+ pics/hex/#2sextant/SE/.style=hex/#2sextant/south east,
+ pics/hex/#2sextant/C/.style=hex/#2sextant/center,
+ }
+}
+% \end{macrocode}
+% \end{Macro}
+%
+% \begin{macrocode}
+\hex@make@sextants{.7}{}
+\hex@make@sextants{.3}{large }
+\hex@make@sextants{0}{full }
+% \end{macrocode}
+% \iffalse
+%</hex>
+% --------------------------------------------------------------------
+% \fi