summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wargame/source/hex/paths.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/paths.dtx')
-rw-r--r--macros/latex/contrib/wargame/source/hex/paths.dtx416
1 files changed, 416 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/paths.dtx b/macros/latex/contrib/wargame/source/hex/paths.dtx
new file mode 100644
index 0000000000..833a4a245a
--- /dev/null
+++ b/macros/latex/contrib/wargame/source/hex/paths.dtx
@@ -0,0 +1,416 @@
+% \iffalse
+% --------------------------------------------------------------------
+%<*hex>
+% \fi
+%
+% \subsubsection{Edges, borders, roads, rivers, and so on}
+%
+% Styles of drawing edges, borders, rivers, roads, and railroads.
+%
+% \begin{macrocode}
+% A decoration to extract outline of a path
+\pgfdeclaredecoration{outline}{init}
+{%
+ \state{init}[next state=tick,width=0pt]{
+ \xdef\outlinerev{}}
+ \state{tick}[%
+ width=+\pgfdecorationsegmentlength]%
+ {
+ \pgfpathlineto{\pgfpointadd{\pgfpointorigin}{
+ \pgfpointpolar{\pgfdecorationsegmentangle}{
+ +\pgfdecorationsegmentamplitude}}}
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \message{^^J\the\pgf@x,\the\pgf@y}
+ \pgfpointadd{\pgfpointorigin}{
+ \pgfpointpolar{-\pgfdecorationsegmentangle}{
+ \pgfdecorationsegmentamplitude}}
+ \pgfpointtransformed{\pgfpoint{\pgf@x}{\pgf@y}}%
+ \message{^^J\the\pgf@x,\the\pgf@y}
+ \xdef\outlinerev{\the\pgf@x/\the\pgf@y,\outlinerev}
+ \pgf@x=\pgf@xa
+ \pgf@y=\pgf@ya
+ }%
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ \foreach \x/\y in \outlinerev{
+ \ifx\x\empty\else
+ \ifx\y\empty\else
+ \pgf@xa=\x
+ \pgf@ya=\y
+ \pgf@nlt@lineto{\pgf@xa}{\pgf@ya}
+ \fi
+ \fi
+ }
+ }%
+}%
+
+\tikzset{
+ hex/road/.style={
+ rounded corners=3\pgflinewidth,% .25cm,
+ color=black,
+ transform shape,
+ scale line widths,
+ thick},
+ hex/railroad/.style={
+ %scale line widths,
+ rounded corners=.25cm,
+ color=gray!50!black,
+ transform shape,
+ postaction={draw,decorate},
+ decoration={ticks,
+ segment length=9\pgflinewidth,
+ amplitude=3\pgflinewidth,%.1cm
+ }
+ },
+ hex/river/.style={
+ color=blue,
+ scale line widths,
+ line width=3pt,
+ transform shape,
+ decorate,
+ decoration={random steps,
+ segment length=.3cm,
+ amplitude=.15cm,
+ pre=lineto,
+ post=lineto,
+ pre length=.05cm,
+ post length=.05cm},
+ rounded corners=.08cm},
+ hex/border/.style={
+ color=gray,
+ rounded corners=3pt,
+ dashed,
+ transform shape,
+ scale line widths,
+ very thick
+ },
+ every river/.style={},
+ every road/.style={},
+ every railroad/.style={},
+ every border/.style={},
+}
+% \end{macrocode}
+%
+% \begin{Macro}{\road,\railroad,\river,\border}
+%
+% \begin{macrocode}
+\def\road{%
+ \hex@dbg{3}{Road}
+ \@ifnextchar[{\road@}{\road@[]}%]
+}
+\def\road@[#1]{\draw[hex/road,every hex road/.try,#1]}
+\def\railroad{%
+ \hex@dbg{3}{Rail road}
+ \@ifnextchar[{\railroad@}{\railroad@[]}%]
+}
+\def\railroad@[#1]{\draw[hex/railroad,every hex railroad/.try,#1]}
+\def\river{%
+ \hex@dbg{3}{River}
+ \@ifnextchar[{\river@}{\river@[]}%]
+}
+\def\river@[#1]{\draw[hex/river,every hex river/.try,#1]}
+\def\border{%
+ \hex@dbg{3}{Border}
+ \@ifnextchar[{\border@}{\border@[]}%]
+}
+\def\border@[#1]{\draw[hex/border,every hex border/.try,#1]}
+% \end{macrocode}
+% \end{Macro}
+%
+%
+% \iffalse
+% --------------------------------------------------------------------
+% \fi
+%
+% \subsubsection{Other paths}
+%
+% \begin{Macro}{\shiftScalePath}
+% Shifts and scales a path and defines a macro to contain the path
+%
+% \begin{Syntax}
+% \cs{shiftScalePath}\marg{macro}\marg{relative-coordinates}
+% \end{Syntax}
+%
+% where \meta{relative-coordinates} is a comma separated list of
+% relative coordinates (to the lower-left and upper-right corners)
+%
+% \begin{Syntax}
+% \meta{x}/\meta{y}
+% \end{Syntax}
+%
+% Note, this requires that \cs{boardXmin},\cs{boardYmin} and
+% \cs{boardXmax},\cs{boardYmax} is defined. This can be done using
+% the \cs{boardframe} macro.
+%
+% \begin{macrocode}
+\def\shiftScalePath#1#2{%
+ \let\tmp@path\@undefined%
+ \foreach \x/\y in {#2}{%
+ \pgfmathparse{\x*\boardW+\boardXmin}\xdef\tmp@x{\pgfmathresult}%
+ \pgfmathparse{\y*\boardH+\boardYmin}\xdef\tmp@y{\pgfmathresult}%
+ \@ifundefined{tmp@path}{\def\tmp@path{}}{\xdef\tmp@path{\tmp@path--}}%
+ \xdef\tmp@path{\tmp@path(\tmp@x,\tmp@y)}}%
+ \expandafter\xdef\csname #1\endcsname{\tmp@path}}
+% \end{macrocode}
+% \end{Macro}
+%
+% \iffalse
+% --------------------------------------------------------------------
+% \fi
+%
+% \subsubsection{Move, attacks, retreats from hex to hex}
+%
+% \begin{Macro}{\hex@getscale}
+%
+% Get current scaling factor.
+%
+% \begin{macrocode}
+\def\hex@getscale#1{%
+ \begingroup
+ \pgfgettransformentries{%
+ \scaleA}{%
+ \scaleB}{%
+ \scaleC}{%
+ \scaleD}{%
+ \whatevs}{%
+ \whatevs}%
+ \pgfmathsetmacro{#1}{sqrt(abs(\scaleA*\scaleD-\scaleB*\scaleC))}%
+ \expandafter
+ \endgroup
+ \expandafter\def\expandafter#1\expandafter{#1}%
+}
+% \end{macrocode}
+% \end{Macro}
+%
+% Key to get the scale
+%
+% \begin{macrocode}
+\tikzset{%
+ hex/get scale/.code={
+ \hex@getscale{\hex@scale}},
+}
+% \end{macrocode}
+%
+% Style for moves. Use like
+%
+% \begin{Syntax}
+% \cs{path}[move] \meta{coordinates};
+% \end{Syntax}
+%
+% \begin{macrocode}
+\tikzset{%
+ % Argument is colour
+ hex/move/.style={
+ hex/get scale,
+ decorate,
+ decoration={
+ markings,
+ mark=between positions 0 and 1 step 0.75*\hex@scale*\hex@dy with {
+ \node [single arrow,
+ single arrow head extend=3pt,
+ fill=#1,
+ inner sep=\hex@scale*.5mm,
+ minimum width=\hex@scale*2mm,
+ minimum height=\hex@scale*\hex@dy/2,
+ transform shape]{};
+ }
+ },
+ },
+% \end{macrocode}
+%
+% A short move style
+%
+% \begin{Syntax}
+% \cs{path}[short move] \meta{coordinates};
+% \end{Syntax}
+%
+%
+% \begin{macrocode}
+ % Argument is colour
+ hex/short move/.style={
+ hex/get scale,
+ decorate,
+ decoration={
+ markings,
+ mark=between positions 0 and 1 step 0.5*\hex@scale*\hex@dy with {
+ \node [single arrow,
+ single arrow head extend=3pt,
+ fill=#1,
+ inner sep=\hex@scale*.5mm,
+ minimum width=\hex@scale*2mm,
+ minimum height=\hex@scale*\hex@dy/3,
+ transform shape]{};
+ }
+ },
+ },
+% \end{macrocode}
+%
+% A short move style
+%
+% \begin{Syntax}
+% \cs{path}[long move] \meta{coordinates};
+% \end{Syntax}
+%
+%
+% \begin{macrocode}
+ % Argument is colour
+ hex/long move/.style={
+ hex/get scale,
+ transform shape,
+ decorate,
+ decoration={
+ markings,
+ mark=between positions 0 and -.7*\hex@scale*\hex@dy
+ step 2*\hex@scale*\hex@dy with {
+ \node [single arrow,
+ single arrow head extend=3pt,
+ fill=#1,
+ anchor=west,
+ inner sep=\hex@scale*.25mm,
+ outer sep=.3*\hex@scale*\hex@dy,
+ minimum width=\hex@scale*2mm,
+ minimum height=1.4*\hex@scale*\hex@dy,
+ transform shape]{};
+ }
+ },
+ },
+% \end{macrocode}
+%
+% A short move style
+%
+% \begin{Syntax}
+% \cs{path}[move with start] \meta{coordinates};
+% \end{Syntax}
+%
+%
+% \begin{macrocode}
+ % Argument is colour
+ hex/move with start/.style={
+ hex/get scale,
+ decorate,
+ decoration={
+ markings,
+ mark=at position 0 with {
+ \node [inner sep=0,
+ circle,
+ minimum size=\hex@scale*5mm,
+ fill=#1,
+ transform shape] {};},
+ mark=between positions 0 and 1 step 0.75*\hex@scale*\hex@dy with {
+ \node [single arrow,
+ single arrow head extend=\hex@scale*3pt,
+ fill=#1,
+ inner sep=\hex@scale*1mm,
+ minimum width=\hex@scale*3mm,
+ minimum height=\hex@scale*\hex@dy/2,
+ transform shape]{};
+ }
+ },
+ },
+ % Default fill colour is black
+ hex/move/.default=black,
+ hex/move with start/.default=black,
+ hex/short move/.default=black,
+ hex/long move/.default=black,
+ % Arguments are draw and fill color
+% \end{macrocode}
+%
+% A move cost style
+%
+% \begin{Syntax}
+% \cs{path}[move] ...(coordinate)node[hex/move cost]{} ...;
+% \end{Syntax}
+%
+% \begin{macrocode}
+ hex/move cost/.style 2 args={
+ minimum size=1mm,
+ inner sep=0.1mm,
+ circle,
+ fill=#2,
+ transform shape,
+ text=#1,
+ font=\sffamily\bfseries\Large},
+ hex/move cost/.default={black}{none},
+ % Argument is fill colour
+% \end{macrocode}
+%
+% A short line style for retreates, advances, and so on
+%
+% \begin{Syntax}
+% \cs{path}[short line] (start)--(end);
+% \end{Syntax}
+%
+% \begin{macrocode}
+ hex/short line/.style={%
+ hex/get scale,
+ inherit options/.code={\csname tikz@options\endcsname},
+ inherit options,
+ decorate,
+ decoration={
+ markings,
+ mark=between positions \hex@scale*\hex@dy
+ and 1 step 2*\hex@scale*\hex@dy with {
+ \node [single arrow,draw=black,fill=#1,
+ single arrow head extend=\hex@scale*3pt,
+ inner sep=1mm,
+ minimum width=0.75*\hex@scale*\hex@dy,
+ minimum height=\hex@scale*\hex@dy,
+ transform shape]{};
+ }
+ },
+ },
+% \end{macrocode}
+%
+% An attack indication style
+%
+% \begin{Syntax}
+% \cs{path}[attack] (start)--(end);
+% \end{Syntax}
+%
+% \begin{macrocode}
+ % Argument is fill color
+ hex/attack/.style={
+ hex/get scale,
+ inherit options/.code={\csname tikz@options\endcsname},
+ inherit options,
+ decorate,
+ decoration={
+ markings,
+ mark=between positions \hex@scale*\hex@dy
+ and 1 step 2*\hex@scale*\hex@dy with {
+ \node [regular polygon,
+ fill=#1,
+ draw=#1,
+ regular polygon sides=3,
+ inner sep=0,
+ minimum size=0.75*\hex@scale*\hex@dy,
+ rotate=-90,
+ transform shape]{};
+ }
+ },
+ },
+% \end{macrocode}
+%
+% Short hands
+%
+% \begin{Syntax}
+% \cs{path}[attack] (start)--(end);
+% \end{Syntax}
+%
+% \begin{macrocode}
+ % Default colour is red for attachs
+ hex/attack/.default=red!70!black,
+ %%
+ hex/retreat/.style={hex/short line=#1},
+ hex/retreat/.default=white,
+ %%
+ hex/advance/.style={hex/short line=#1},
+ hex/advance/.default={green!70!black},
+}
+% \end{macrocode}
+% \iffalse
+%</hex>
+% --------------------------------------------------------------------
+% \fi