% \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
